Compare commits

...

319 Commits

Author SHA1 Message Date
b80a11093a Merge pull request 'feature/test' (#9) from feature/test into main
Reviewed-on: #9
2025-09-07 12:35:21 -04:00
njohnson
d129c7ba62 Sorry ut A lotta stuff. 2025-09-05 18:35:17 -04:00
RedLine AI Agent
46606f529d Updated libs/xassets/xwindowdef.h 2025-09-05 21:36:01 +00:00
RedLine AI Agent
034234a134 Updated libs/xassets/xwindowdef.cpp 2025-09-05 21:36:00 +00:00
RedLine AI Agent
c197edaee6 Updated libs/xassets/xweaponenums.h 2025-09-05 21:35:59 +00:00
RedLine AI Agent
32991d0273 Updated libs/xassets/xtexturedesc.h 2025-09-05 21:35:57 +00:00
RedLine AI Agent
c4826bf1f3 Updated libs/xassets/xtexturedesc.cpp 2025-09-05 21:35:55 +00:00
RedLine AI Agent
1afbe28cc9 Updated libs/xassets/xsunflare.h 2025-09-05 21:35:54 +00:00
RedLine AI Agent
d28aba759f Updated libs/xassets/xsunflare.cpp 2025-09-05 21:35:52 +00:00
RedLine AI Agent
80c0fb2f23 Updated libs/xassets/xstatement.h 2025-09-05 21:35:51 +00:00
RedLine AI Agent
99c2b0ab3b Updated libs/xassets/xstatement.cpp 2025-09-05 21:35:50 +00:00
RedLine AI Agent
9f46d1ea9c Updated libs/xassets/xsrftriangles.h 2025-09-05 21:35:49 +00:00
RedLine AI Agent
d4c36cab72 Updated libs/xassets/xsrftriangles.cpp 2025-09-05 21:35:47 +00:00
RedLine AI Agent
5ec26d101c Updated libs/xassets/xsentienthandle.h 2025-09-05 21:35:46 +00:00
RedLine AI Agent
c5732b0899 Updated libs/xassets/xsentienthandle.cpp 2025-09-05 21:35:45 +00:00
RedLine AI Agent
fb442b39fa Updated libs/xassets/xrectdef.h 2025-09-05 21:35:43 +00:00
RedLine AI Agent
afb0430f30 Updated libs/xassets/xrectdef.cpp 2025-09-05 21:35:42 +00:00
RedLine AI Agent
7bb6d0ab89 Updated libs/xassets/xplatform.h 2025-09-05 21:35:41 +00:00
RedLine AI Agent
9d85b77ef0 Updated libs/xassets/xoperandinternaldataunion.h 2025-09-05 21:35:39 +00:00
RedLine AI Agent
2b55752eb3 Updated libs/xassets/xoperandinternaldataunion.cpp 2025-09-05 21:35:38 +00:00
RedLine AI Agent
c45df3444c Updated libs/xassets/xoperand.h 2025-09-05 21:35:37 +00:00
RedLine AI Agent
cc30cda7cc Updated libs/xassets/xoperand.cpp 2025-09-05 21:35:35 +00:00
RedLine AI Agent
de0ee2e438 Updated libs/xassets/xmultidef.h 2025-09-05 21:35:34 +00:00
RedLine AI Agent
1000b0cafa Updated libs/xassets/xmultidef.cpp 2025-09-05 21:35:33 +00:00
RedLine AI Agent
9a10f4a9e7 Updated libs/xassets/xmodelpieces.h 2025-09-05 21:35:32 +00:00
RedLine AI Agent
6cb52df017 Updated libs/xassets/xmodelpieces.cpp 2025-09-05 21:35:30 +00:00
RedLine AI Agent
e1f8897150 Updated libs/xassets/xmodelpiece.h 2025-09-05 21:35:29 +00:00
RedLine AI Agent
aa8a6d18ae Updated libs/xassets/xmodelpiece.cpp 2025-09-05 21:35:28 +00:00
RedLine AI Agent
d70b54480d Updated libs/xassets/xmodeldrawinfo.h 2025-09-05 21:35:26 +00:00
RedLine AI Agent
d2eb7b9795 Updated libs/xassets/xmodeldrawinfo.cpp 2025-09-05 21:35:25 +00:00
RedLine AI Agent
e7aca45a9f Updated libs/xassets/xmenuenums.h 2025-09-05 21:35:24 +00:00
RedLine AI Agent
7752d3ada5 Updated libs/xassets/xmaterialtechniqueset.h 2025-09-05 21:35:23 +00:00
RedLine AI Agent
4cfd3da983 Updated libs/xassets/xmaterialtechniqueset.cpp 2025-09-05 21:35:21 +00:00
RedLine AI Agent
1ea1ae3199 Updated libs/xassets/xmaterialmemory.h 2025-09-05 21:35:20 +00:00
RedLine AI Agent
2b29b121e0 Updated libs/xassets/xmaterialmemory.cpp 2025-09-05 21:35:19 +00:00
RedLine AI Agent
5c9868c435 Updated libs/xassets/xlistboxdef.h 2025-09-05 21:35:17 +00:00
RedLine AI Agent
6c0a111c09 Updated libs/xassets/xlistboxdef.cpp 2025-09-05 21:35:16 +00:00
RedLine AI Agent
4cbf8ca553 Updated libs/xassets/xitemkeyhandler.h 2025-09-05 21:35:15 +00:00
RedLine AI Agent
5aefd3e4e1 Updated libs/xassets/xitemkeyhandler.cpp 2025-09-05 21:35:14 +00:00
RedLine AI Agent
8bb5287605 Updated libs/xassets/xitemdefdata.h 2025-09-05 21:35:12 +00:00
RedLine AI Agent
0c2478cc70 Updated libs/xassets/xitemdefdata.cpp 2025-09-05 21:35:10 +00:00
RedLine AI Agent
06cda8303d Updated libs/xassets/xitemdef.h 2025-09-05 21:35:09 +00:00
RedLine AI Agent
3c45b639cb Updated libs/xassets/xitemdef.cpp 2025-09-05 21:35:08 +00:00
RedLine AI Agent
aa77115da8 Updated libs/xassets/xglyph.h 2025-09-05 21:35:07 +00:00
RedLine AI Agent
5c42895bb2 Updated libs/xassets/xglyph.cpp 2025-09-05 21:35:05 +00:00
RedLine AI Agent
67668ccc27 Updated libs/xassets/xgfxworldvertexlayerdata.h 2025-09-05 21:35:04 +00:00
RedLine AI Agent
cdf01bb966 Updated libs/xassets/xgfxworldvertexlayerdata.cpp 2025-09-05 21:35:03 +00:00
RedLine AI Agent
178665610c Updated libs/xassets/xgfxworlddpvsstatic.h 2025-09-05 21:35:01 +00:00
RedLine AI Agent
13a7b65f6d Updated libs/xassets/xgfxworlddpvsstatic.cpp 2025-09-05 21:35:00 +00:00
RedLine AI Agent
26ba52bcd2 Updated libs/xassets/xgfxworlddpvsplanes.h 2025-09-05 21:34:59 +00:00
RedLine AI Agent
9e4d14f686 Updated libs/xassets/xgfxworlddpvsplanes.cpp 2025-09-05 21:34:57 +00:00
RedLine AI Agent
5ecabfee07 Updated libs/xassets/xgfxworlddpvsdynamic.h 2025-09-05 21:34:56 +00:00
RedLine AI Agent
caa9fe276e Updated libs/xassets/xgfxworlddpvsdynamic.cpp 2025-09-05 21:34:54 +00:00
RedLine AI Agent
80f1a65a71 Updated libs/xassets/xgfxsurface.h 2025-09-05 21:34:53 +00:00
RedLine AI Agent
2adf0cc1e8 Updated libs/xassets/xgfxsurface.cpp 2025-09-05 21:34:52 +00:00
RedLine AI Agent
1ca6766402 Updated libs/xassets/xgfxstaticmodelinst.h 2025-09-05 21:34:50 +00:00
RedLine AI Agent
08b6e1d6d9 Updated libs/xassets/xgfxstaticmodelinst.cpp 2025-09-05 21:34:49 +00:00
RedLine AI Agent
efd06290d8 Updated libs/xassets/xgfxstaticmodeldrawinst.h 2025-09-05 21:34:48 +00:00
RedLine AI Agent
2f4bc7bb05 Updated libs/xassets/xgfxstaticmodeldrawinst.cpp 2025-09-05 21:34:46 +00:00
RedLine AI Agent
147e4bb079 Updated libs/xassets/xgfxshadowgeometry.h 2025-09-05 21:34:45 +00:00
RedLine AI Agent
749084539e Updated libs/xassets/xgfxshadowgeometry.cpp 2025-09-05 21:34:43 +00:00
RedLine AI Agent
87add0fa93 Updated libs/xassets/xgfxscenedynmodel.h 2025-09-05 21:34:42 +00:00
RedLine AI Agent
98039b533f Updated libs/xassets/xgfxscenedynmodel.cpp 2025-09-05 21:34:41 +00:00
RedLine AI Agent
1d2d68ed54 Updated libs/xassets/xgfxscenedynbrush.h 2025-09-05 21:34:39 +00:00
RedLine AI Agent
18c9457948 Updated libs/xassets/xgfxscenedynbrush.cpp 2025-09-05 21:34:38 +00:00
RedLine AI Agent
bb3683d8fb Updated libs/xassets/xgfxportalwritable.h 2025-09-05 21:34:37 +00:00
RedLine AI Agent
6dd8a4a24c Updated libs/xassets/xgfxportalwritable.cpp 2025-09-05 21:34:36 +00:00
RedLine AI Agent
a2acf1dd90 Updated libs/xassets/xgfxportal.h 2025-09-05 21:34:34 +00:00
RedLine AI Agent
b34959ba1d Updated libs/xassets/xgfxportal.cpp 2025-09-05 21:34:33 +00:00
RedLine AI Agent
2b40623f83 Updated libs/xassets/xgfxplacement.h 2025-09-05 21:34:32 +00:00
RedLine AI Agent
faa73b7697 Updated libs/xassets/xgfxplacement.cpp 2025-09-05 21:34:31 +00:00
RedLine AI Agent
d40b2326f7 Updated libs/xassets/xgfxpackedplacement.h 2025-09-05 21:34:30 +00:00
RedLine AI Agent
57c6c18d8b Updated libs/xassets/xgfxpackedplacement.cpp 2025-09-05 21:34:28 +00:00
RedLine AI Agent
f4b2aaf84e Updated libs/xassets/xgfxlightregionhull.h 2025-09-05 21:34:27 +00:00
RedLine AI Agent
f253b75a45 Updated libs/xassets/xgfxlightregionhull.cpp 2025-09-05 21:34:26 +00:00
RedLine AI Agent
b15886e089 Updated libs/xassets/xgfxlightregionaxis.h 2025-09-05 21:34:24 +00:00
RedLine AI Agent
e78778e82c Updated libs/xassets/xgfxlightregionaxis.cpp 2025-09-05 21:34:23 +00:00
RedLine AI Agent
d957774436 Updated libs/xassets/xgfxlightregion.h 2025-09-05 21:34:22 +00:00
RedLine AI Agent
1722cbf067 Updated libs/xassets/xgfxlightregion.cpp 2025-09-05 21:34:20 +00:00
RedLine AI Agent
c394b38c76 Updated libs/xassets/xgfxlightmaparray.h 2025-09-05 21:34:19 +00:00
RedLine AI Agent
baafe8b4e5 Updated libs/xassets/xgfxlightmaparray.cpp 2025-09-05 21:34:06 +00:00
RedLine AI Agent
78247fafab Updated libs/xassets/xgfxlightgridentry.h 2025-09-05 21:33:54 +00:00
RedLine AI Agent
f7055fbc10 Updated libs/xassets/xgfxlightgridcolors.h 2025-09-05 21:33:44 +00:00
RedLine AI Agent
54a46e8a3e Updated libs/xassets/xgfxlightgrid.h 2025-09-05 21:33:32 +00:00
RedLine AI Agent
3ffcec4a71 Updated libs/xassets/xgfxlightgrid.cpp 2025-09-05 21:33:20 +00:00
RedLine AI Agent
3af6532904 Updated libs/xassets/xgfxcullgroup.h 2025-09-05 21:33:06 +00:00
RedLine AI Agent
f879005e76 Updated libs/xassets/xgfxcullgroup.cpp 2025-09-05 21:32:52 +00:00
RedLine AI Agent
af3f28752a Updated libs/xassets/xgfxcell.h 2025-09-05 21:32:48 +00:00
RedLine AI Agent
240a643111 Updated libs/xassets/xgfxcell.cpp 2025-09-05 21:32:39 +00:00
RedLine AI Agent
bf951db63c Updated libs/xassets/xgfxbrushmodelwritable.h 2025-09-05 21:32:37 +00:00
RedLine AI Agent
54b54a2367 Updated libs/xassets/xgfxbrushmodelwritable.cpp 2025-09-05 21:32:36 +00:00
RedLine AI Agent
5a9855a9f6 Updated libs/xassets/xgfxbrushmodel.h 2025-09-05 21:32:35 +00:00
RedLine AI Agent
3e3553b2ce Updated libs/xassets/xgfxbrushmodel.cpp 2025-09-05 21:32:26 +00:00
RedLine AI Agent
e90788e232 Updated libs/xassets/xgfxaabbtree.h 2025-09-05 21:32:16 +00:00
RedLine AI Agent
c7ed43cf8d Updated libs/xassets/xgfxaabbtree.cpp 2025-09-05 21:32:02 +00:00
RedLine AI Agent
a8ca882e07 Updated libs/xassets/xgame.h 2025-09-05 21:31:49 +00:00
RedLine AI Agent
0e48faf7a3 Updated libs/xassets/xfxspawndefoneshot.h 2025-09-05 21:31:45 +00:00
RedLine AI Agent
51e12e9683 Updated libs/xassets/xfxspawndefoneshot.cpp 2025-09-05 21:31:33 +00:00
RedLine AI Agent
0ec4548a6b Updated libs/xassets/xfxspawndeflooping.h 2025-09-05 21:31:20 +00:00
RedLine AI Agent
c72d51ad1e Updated libs/xassets/xfxspawndeflooping.cpp 2025-09-05 21:31:06 +00:00
RedLine AI Agent
1747f8f8be Updated libs/xassets/xfxspawndef.h 2025-09-05 21:30:52 +00:00
RedLine AI Agent
6fbd17291a Updated libs/xassets/xfxspawndef.cpp 2025-09-05 21:30:51 +00:00
RedLine AI Agent
e1ec4b8878 Updated libs/xassets/xfxintrange.h 2025-09-05 21:30:49 +00:00
RedLine AI Agent
1d08ae6af6 Updated libs/xassets/xfxintrange.cpp 2025-09-05 21:30:48 +00:00
njohnson
c596b3a828 Remove retained copies. 2025-09-05 17:27:56 -04:00
RedLine AI Agent
846c689088 Updated libs/xassets/xfximpacttable.h 2025-09-05 21:27:31 +00:00
RedLine AI Agent
84dc8358a7 Updated libs/xassets/xfximpacttable.cpp 2025-09-05 21:27:30 +00:00
RedLine AI Agent
86092b18a2 Updated libs/xassets/xfxfloatrange.h 2025-09-05 21:27:28 +00:00
RedLine AI Agent
c968117ed1 Updated libs/xassets/xfxfloatrange.cpp 2025-09-05 21:27:27 +00:00
RedLine AI Agent
ef884f4be7 Updated libs/xassets/xfxelematlas.h 2025-09-05 21:27:26 +00:00
RedLine AI Agent
5bf97fcf1a Updated libs/xassets/xfxelematlas.cpp 2025-09-05 21:27:24 +00:00
RedLine AI Agent
c0967ce23e Updated libs/xassets/xfxelematlas.h 2025-09-05 21:27:23 +00:00
RedLine AI Agent
de0e4c5aae Updated libs/xassets/xfxelematlas.cpp 2025-09-05 21:27:22 +00:00
RedLine AI Agent
01094b8d9e Updated libs/xassets/xfxelematlas.h 2025-09-05 21:27:20 +00:00
RedLine AI Agent
7af197ad80 Updated libs/xassets/xfxelematlas.cpp 2025-09-05 21:27:17 +00:00
RedLine AI Agent
136a49801e Updated libs/xassets/xfxelematlas.h 2025-09-05 21:27:05 +00:00
RedLine AI Agent
d603742172 Updated libs/xassets/xfxelematlas.cpp 2025-09-05 21:26:58 +00:00
RedLine AI Agent
cdf8ac1ffc Updated libs/xassets/xfxelematlas.h 2025-09-05 21:26:45 +00:00
RedLine AI Agent
8d5c2c7ea1 Updated libs/xassets/xfxelematlas.cpp 2025-09-05 21:26:32 +00:00
RedLine AI Agent
d075ad4c24 Updated libs/xassets/xfxeffectdef.h 2025-09-05 21:26:19 +00:00
RedLine AI Agent
4e1c18fff2 Updated libs/xassets/xfxeffectdef.cpp 2025-09-05 21:26:14 +00:00
RedLine AI Agent
a2e9683ba3 Updated libs/xassets/xfont.h 2025-09-05 21:26:13 +00:00
RedLine AI Agent
f7444171e3 Updated libs/xassets/xfont.cpp 2025-09-05 21:26:12 +00:00
RedLine AI Agent
fdea13bf84 Updated libs/xassets/xexpressionentry.h 2025-09-05 21:26:11 +00:00
RedLine AI Agent
a06df405fc Updated libs/xassets/xexpressionentry.cpp 2025-09-05 21:26:09 +00:00
RedLine AI Agent
70515d28d4 Updated libs/xassets/xentryinternaldata.h 2025-09-05 21:26:08 +00:00
RedLine AI Agent
37c25d3baf Updated libs/xassets/xentryinternaldata.cpp 2025-09-05 21:26:07 +00:00
RedLine AI Agent
75802ffa8e Updated libs/xassets/xdynentitypose.h 2025-09-05 21:26:06 +00:00
RedLine AI Agent
5a35d4f4d8 [No changes] 2025-09-05 21:25:17 +00:00
RedLine AI Agent
9958f33b60 [No changes] 2025-09-05 21:25:15 +00:00
RedLine AI Agent
c1e9b308a1 [No changes] 2025-09-05 21:25:12 +00:00
RedLine AI Agent
6ef4fe82da [No changes] 2025-09-05 21:25:10 +00:00
RedLine AI Agent
8f287ceeec [No changes] 2025-09-05 21:25:09 +00:00
RedLine AI Agent
12b4a77f1f [No changes] 2025-09-05 21:24:58 +00:00
RedLine AI Agent
38dd74b188 [No changes] 2025-09-05 21:24:57 +00:00
RedLine AI Agent
e3db1e11cc [No changes] 2025-09-05 21:24:56 +00:00
RedLine AI Agent
0d9d2fccfb [No changes] 2025-09-05 21:24:56 +00:00
RedLine AI Agent
c84463e3c2 [No changes] 2025-09-05 21:24:55 +00:00
RedLine AI Agent
619cfad47c [No changes] 2025-09-05 21:24:54 +00:00
RedLine AI Agent
17408d5d4e [No changes] 2025-09-05 21:24:54 +00:00
RedLine AI Agent
04daaeaf7f [No changes] 2025-09-05 21:24:53 +00:00
RedLine AI Agent
92456f1da6 [No changes] 2025-09-05 21:24:52 +00:00
RedLine AI Agent
38909a69a6 [No changes] 2025-09-05 21:24:51 +00:00
RedLine AI Agent
26a1629dee [No changes] 2025-09-05 21:24:51 +00:00
RedLine AI Agent
cc5c1854e2 [No changes] 2025-09-05 21:24:50 +00:00
RedLine AI Agent
fccad08fb0 [No changes] 2025-09-05 21:24:46 +00:00
RedLine AI Agent
0d156994b4 [No changes] 2025-09-05 21:24:44 +00:00
RedLine AI Agent
dd1eb94beb [No changes] 2025-09-05 21:24:37 +00:00
RedLine AI Agent
b53f169a4f [No changes] 2025-09-05 21:24:29 +00:00
RedLine AI Agent
ce9bcefb88 No changes. 2025-09-05 21:24:21 +00:00
RedLine AI Agent
ab60c56e88 [No changes] 2025-09-05 21:24:14 +00:00
njohnson
32e4815cbe Update .gitignore 2025-09-05 17:22:49 -04:00
RedLine AI Agent
a8ee358150 Add: libs/*/release/*
Add: libs/*/debug/*
2025-09-05 21:05:49 +00:00
RedLine AI Agent
302350fe2c Add: data/obj/* 2025-09-05 21:02:46 +00:00
RedLine AI Agent
2f323046d3 Add: *.XMODEL_EXPORT 2025-09-05 21:01:00 +00:00
RedLine AI Agent
3dad8bfb5c Update: data/Data.qrc 2025-09-05 20:59:08 +00:00
RedLine AI Agent
f8624c8997 Update: app/zonefileviewer.ui 2025-09-05 20:59:06 +00:00
RedLine AI Agent
9d8e214ae3 Update: app/zonefileviewer.h 2025-09-05 20:59:03 +00:00
RedLine AI Agent
15bbbec1db Update: app/zonefileviewer.cpp 2025-09-05 20:54:46 +00:00
RedLine AI Agent
00a3dfb958 Update: app/xtreewidgetitem.h 2025-09-05 20:54:42 +00:00
RedLine AI Agent
12c9e79bf2 Update: app/xtreewidgetitem.cpp 2025-09-05 20:54:30 +00:00
RedLine AI Agent
39cd33efd4 Update: app/xtreewidget.h 2025-09-05 20:54:06 +00:00
RedLine AI Agent
ce5c98b78d Update: app/soundviewer.ui 2025-09-05 20:53:15 +00:00
RedLine AI Agent
053c440415 Update app/techsetviewer.ui 2025-09-05 20:47:55 +00:00
RedLine AI Agent
d477865e9a Update app/techsetviewer.h 2025-09-05 20:47:19 +00:00
RedLine AI Agent
a7e0859b8d Update app/techsetviewer.cpp 2025-09-05 20:47:17 +00:00
RedLine AI Agent
ed593d3ae1 Update app/stringtableviewer.ui 2025-09-05 20:47:15 +00:00
RedLine AI Agent
d973d2bee5 Update app/stringtableviewer.h 2025-09-05 20:47:03 +00:00
RedLine AI Agent
90c3d3bef3 Update app/stringtableviewer.cpp 2025-09-05 20:46:50 +00:00
RedLine AI Agent
d583b9ce08 Update app/soundviewer.ui 2025-09-05 20:46:36 +00:00
RedLine AI Agent
46792b3dc6 Update app/soundviewer.h 2025-09-05 20:45:06 +00:00
RedLine AI Agent
1739a4686e Update app/soundviewer.cpp 2025-09-05 20:45:03 +00:00
RedLine AI Agent
28257af738 Update app/rumblegraphviewer.ui 2025-09-05 20:45:00 +00:00
RedLine AI Agent
50fb3d2557 Update app/rumblegraphviewer.h 2025-09-05 20:44:57 +00:00
RedLine AI Agent
3f0d4641b1 Update app/rumblegraphviewer.cpp 2025-09-05 20:44:54 +00:00
RedLine AI Agent
b2fcdd1762 Update app/rumblefileviewer.ui 2025-09-05 20:44:51 +00:00
RedLine AI Agent
99706b868b Update app/rumblefileviewer.h 2025-09-05 20:44:48 +00:00
RedLine AI Agent
dfe3311323 Update app/rumblefileviewer.cpp 2025-09-05 20:44:47 +00:00
RedLine AI Agent
6a04ed7431 Update app/reportissuedialog.ui 2025-09-05 20:44:45 +00:00
RedLine AI Agent
32ab5c7451 Update app/reportissuedialog.h 2025-09-05 20:44:40 +00:00
RedLine AI Agent
b6403208f1 Update app/reportissuedialog.cpp 2025-09-05 20:44:38 +00:00
RedLine AI Agent
fcaa1eacaf Update app/preferenceeditor.ui 2025-09-05 20:44:36 +00:00
RedLine AI Agent
97c4fbddde Update app/preferenceeditor.h 2025-09-05 20:44:33 +00:00
RedLine AI Agent
ed9e7ee558 Update app/preferenceeditor.cpp 2025-09-05 20:44:31 +00:00
RedLine AI Agent
618c304a87 Update app/modelviewer.ui 2025-09-05 20:44:29 +00:00
RedLine AI Agent
cc311c2a1a Update app/modelviewer.h 2025-09-05 20:44:24 +00:00
RedLine AI Agent
fda7f55231 Update app/modelviewer.cpp 2025-09-05 20:44:12 +00:00
RedLine AI Agent
fe5724ef82 Update app/materialviewer.ui 2025-09-05 20:43:12 +00:00
RedLine AI Agent
1a0ba48b51 Update app/materialviewer.h 2025-09-05 20:42:01 +00:00
RedLine AI Agent
713d55b4eb Update app/materialviewer.cpp 2025-09-05 20:41:21 +00:00
RedLine AI Agent
59d6d6907a Refactor mainwindow.ui: replace the entire UI definition with a cleaned‑up, consistent layout and action structure. 2025-09-05 19:59:40 +00:00
RedLine AI Agent
020178f780 Update app/mainwindow.h 2025-09-05 19:57:04 +00:00
RedLine AI Agent
a2242fe018 Update app/mainwindow.cpp 2025-09-05 19:54:14 +00:00
RedLine AI Agent
ef6d1007e6 Update app/main.cpp 2025-09-05 19:54:09 +00:00
RedLine AI Agent
9971facf90 Update app/localstringviewer.ui 2025-09-05 19:54:03 +00:00
RedLine AI Agent
3a0070612a Update app/localstringviewer.h 2025-09-05 19:53:52 +00:00
RedLine AI Agent
8f415d4fe6 Update app/localstringviewer.cpp 2025-09-05 19:53:47 +00:00
RedLine AI Agent
f438e6c063 Update app/iwiviewer.ui 2025-09-05 19:53:26 +00:00
RedLine AI Agent
1e086cf00a Update app/iwiviewer.h 2025-09-05 19:53:11 +00:00
RedLine AI Agent
d166e3329a Update app/ddsviewer.h 2025-09-05 19:51:20 +00:00
RedLine AI Agent
4db49c0896 Update app/imagewidget.ui 2025-09-05 19:48:54 +00:00
RedLine AI Agent
12806268d4 Update app/imagewidget.h 2025-09-05 19:48:43 +00:00
RedLine AI Agent
39d37640cc Update app/imagewidget.cpp 2025-09-05 19:48:15 +00:00
RedLine AI Agent
d771df9b09 Update app/fastfileviewer.ui 2025-09-05 19:47:52 +00:00
RedLine AI Agent
44af7bf03c Update app/fastfileviewer.h 2025-09-05 19:47:15 +00:00
RedLine AI Agent
07e473bad0 Update app/fastfileviewer.cpp 2025-09-05 19:46:47 +00:00
RedLine AI Agent
19d417e84b Update app/ddsviewer.ui 2025-09-05 19:46:04 +00:00
RedLine AI Agent
c898f62d69 Update app/ddsviewer.h 2025-09-05 19:45:44 +00:00
RedLine AI Agent
d69f6eef40 Update app/ddsviewer.cpp 2025-09-05 19:44:32 +00:00
RedLine AI Agent
affd9fe889 Update app/d3dbsp_structs.h 2025-09-05 19:44:25 +00:00
RedLine AI Agent
90ebbd86ee Update app/app.pro 2025-09-05 19:43:49 +00:00
RedLine AI Agent
50a1aa3bbc Update app/aboutdialog.ui 2025-09-05 19:43:41 +00:00
RedLine AI Agent
270dacf1e5 Update app/aboutdialog.cpp 2025-09-05 19:43:31 +00:00
RedLine AI Agent
4a4df3c2a4 Update app/aboutdialog.cpp 2025-09-05 19:42:32 +00:00
Nicholas Johnson
4d7598e805 Update app/LICENSE: normalize line endings 2025-09-05 13:59:36 -04:00
Nicholas Johnson
94d407ffb7 Update XPlor.pro: fix formatting and line endings 2025-09-05 13:54:40 -04:00
Nicholas Johnson
3291e52cc6 Update .gitignore: remove leading hyphens and standardize patterns 2025-09-05 13:53:56 -04:00
Nicholas Johnson
f576af8f11 Remove temp autosave file. 2025-09-03 13:40:02 -04:00
Nicholas Johnson
eee7231737 Add autosave files. 2025-09-03 13:39:42 -04:00
Nicholas Johnson
e7455256a7 Add xwaterwritable structures 2025-09-03 13:28:24 -04:00
Nicholas Johnson
2a026947c4 Add xwater structures 2025-09-03 13:28:13 -04:00
Nicholas Johnson
12795451e6 Add xsurfacevertexinfo structures 2025-09-03 13:28:03 -04:00
Nicholas Johnson
c9802401fb Add xsurfacecollisiontree structures 2025-09-03 13:27:52 -04:00
Nicholas Johnson
5a12e3c967 Add xsurfacecollisionnode structures 2025-09-03 13:26:37 -04:00
Nicholas Johnson
a02e3714d0 Add xsurfacecollisionleaf structures 2025-09-03 13:26:24 -04:00
Nicholas Johnson
84f99dc919 Add xsurfacecollisionaabb structures 2025-09-03 13:26:11 -04:00
Nicholas Johnson
163f46b4cf Add xsurface structures 2025-09-03 13:25:58 -04:00
Nicholas Johnson
7b1d269986 Add xstreamsourceinfo structures 2025-09-03 13:25:47 -04:00
Nicholas Johnson
386d0793aa Add xstreamdelayinfo structures 2025-09-03 13:25:36 -04:00
Nicholas Johnson
dc3360a97d Add xscriptstringlist structures 2025-09-03 13:22:24 -04:00
Nicholas Johnson
6ab9a9b350 Add xrigidvertlist structures 2025-09-03 13:21:14 -04:00
Nicholas Johnson
e3f971f62c Add xphyspreset structures 2025-09-03 13:21:02 -04:00
Nicholas Johnson
3a718acb50 Add xphysmass structures 2025-09-03 13:20:51 -04:00
Nicholas Johnson
2e09f532b9 Add xphysgeomlist structures 2025-09-03 13:20:39 -04:00
Nicholas Johnson
c39185e35c Add xphysgeominfo structures 2025-09-03 13:20:29 -04:00
Nicholas Johnson
eee271278a Add xpackedunitvec structures 2025-09-03 13:20:19 -04:00
Nicholas Johnson
e7077aae63 Add xpackedtexcoords structures 2025-09-03 13:20:07 -04:00
Nicholas Johnson
78a6efd02f Add xmodelstreaminfo structures 2025-09-03 13:19:57 -04:00
Nicholas Johnson
73b3cc9e75 Add xmodellodinfo structures 2025-09-03 13:18:53 -04:00
Nicholas Johnson
ef6f75c8a8 Add xmodelhighmipbounds structures 2025-09-03 13:18:40 -04:00
Nicholas Johnson
3bed978b89 Add xmodelcollsurf structures 2025-09-03 13:18:27 -04:00
Nicholas Johnson
dcab86b1ed Add xmaterialvertexstreamrouting structures 2025-09-03 13:18:16 -04:00
Nicholas Johnson
7cf9ac8d4c Add xmaterialvertexdeclaration structures 2025-09-03 13:18:05 -04:00
Nicholas Johnson
e63cf8554e Add xmaterialvertexshaderprogram structures 2025-09-03 13:17:42 -04:00
Nicholas Johnson
d7e4dfda41 Add xmaterialvertexshader structures 2025-09-03 13:17:32 -04:00
Nicholas Johnson
9c92fcd854 Add xmaterialtexturedefinfo structures 2025-09-03 13:17:22 -04:00
Nicholas Johnson
7768c5f7f5 Add xmaterialtexturedef structures 2025-09-03 13:16:15 -04:00
Nicholas Johnson
58e87e8787 Add xmaterialtechnique structures 2025-09-03 13:16:04 -04:00
Nicholas Johnson
b176bc3d00 Add xmaterialstreamrouting structures 2025-09-03 13:15:52 -04:00
Nicholas Johnson
3c13462618 Add xmaterialshaderargument structures 2025-09-03 13:15:41 -04:00
Nicholas Johnson
68a41d4582 Add xmaterialpixelshaderprogram structures 2025-09-03 13:15:31 -04:00
Nicholas Johnson
60e93e0ab3 Add xmaterialpixelshader structures 2025-09-03 13:15:22 -04:00
Nicholas Johnson
9fb5c62b75 Add xmaterialpass structures 2025-09-03 13:15:13 -04:00
Nicholas Johnson
352e51170d Add xmaterialinfo structures 2025-09-03 13:15:04 -04:00
Nicholas Johnson
fc64762bfe Add xmaterialconstantdef structures 2025-09-03 13:14:06 -04:00
Nicholas Johnson
fe34c63697 Add xmaterialargumentdef structures 2025-09-03 13:13:53 -04:00
Nicholas Johnson
02d96741e8 Add xmaterialargumentcodeconst structures 2025-09-03 13:13:41 -04:00
Nicholas Johnson
d8b27a31d2 Add xmaterial.cpp 2025-09-03 13:13:30 -04:00
Nicholas Johnson
4fcd3a4c60 Add xmaterial structures 2025-09-03 13:12:46 -04:00
Nicholas Johnson
fd1868ed46 Add xmaptype structures 2025-09-03 13:12:39 -04:00
Nicholas Johnson
7250e1f460 Add xgputexturesizestack3d structures 2025-09-03 13:11:38 -04:00
Nicholas Johnson
1e0a490a69 Add xgputexturesizestack2d structures 2025-09-03 13:11:27 -04:00
Nicholas Johnson
bfedb389b8 Add xgputexturesizestack1d structures 2025-09-03 13:11:16 -04:00
Nicholas Johnson
0a2fdd0b74 Add xgputexturesizestack structures 2025-09-03 13:11:05 -04:00
Nicholas Johnson
a2959f9b29 Add xgputexturesize3d structures 2025-09-03 13:10:54 -04:00
Nicholas Johnson
cd99390ba7 Add xgputexturesize2d structures 2025-09-03 13:10:44 -04:00
Nicholas Johnson
388e2dfc52 Add xgputexturesize1d structures 2025-09-03 13:10:35 -04:00
Nicholas Johnson
47e09afa73 Add xgpuvertexrawrequest structures 2025-09-03 13:08:56 -04:00
Nicholas Johnson
cdef686ec4 Add xgpuvertexfetchconstant structures 2025-09-03 13:08:47 -04:00
Nicholas Johnson
be21cf40cb Add xgfxvertexshaderloaddef structures 2025-09-03 13:08:37 -04:00
Nicholas Johnson
4eb817375c Add xgfxstatebits structures 2025-09-03 13:08:03 -04:00
Nicholas Johnson
5a623c18d0 Add xgfxpixelshaderloaddef structures 2025-09-03 13:07:19 -04:00
Nicholas Johnson
63ca1074fc Add xgfxpackedvertex structures 2025-09-03 13:07:08 -04:00
Nicholas Johnson
9a70b774ab Add xgfxdrawsurffields structures 2025-09-03 13:06:58 -04:00
Nicholas Johnson
ea385c2853 Add xgfxdrawsurf structures 2025-09-03 13:06:49 -04:00
Nicholas Johnson
f9604bc858 Add xgfxcolor structures 2025-09-03 13:06:40 -04:00
Nicholas Johnson
65a37363e6 Add xfxtrailvertex structures 2025-09-03 13:06:31 -04:00
Nicholas Johnson
2879a89594 Add xfxtraildef structures 2025-09-03 13:06:22 -04:00
Nicholas Johnson
6bc88394cd Add xfximpactentry structures 2025-09-03 13:06:13 -04:00
Nicholas Johnson
f17d56c603 Add xfxelemvisuals structures 2025-09-03 13:05:35 -04:00
Nicholas Johnson
2253db1abb Add xfxelemvisstatesample structures 2025-09-03 13:05:24 -04:00
Nicholas Johnson
c362953775 Add xfxelemmarkvisuals structures 2025-09-03 13:05:14 -04:00
Nicholas Johnson
6ea2989d69 Add xfxelemdefvisuals structures 2025-09-03 13:05:03 -04:00
Nicholas Johnson
ea90db4fe6 Add xfxelemdef structures 2025-09-03 13:04:54 -04:00
Nicholas Johnson
2b1a18be6a Add xfile structures 2025-09-03 13:04:45 -04:00
Nicholas Johnson
40ad7470aa Add new asset-related structures and files 2025-09-03 13:04:24 -04:00
Nicholas Johnson
89d1d0944a Update zonefile structures and project files 2025-09-03 13:03:14 -04:00
Nicholas Johnson
73e13263fc Update node type and path node transient structures 2025-09-03 13:03:03 -04:00
Nicholas Johnson
60ddd31101 Update model structures 2025-09-03 13:02:54 -04:00
Nicholas Johnson
ee4a680d6d Update GPU texture fetch constant structures 2025-09-03 13:02:39 -04:00
Nicholas Johnson
2f61367fcb Update texture handling structures 2025-09-03 13:02:31 -04:00
Nicholas Johnson
c7b1c97d68 Update lighting and streaming AABB tree structures 2025-09-03 13:02:23 -04:00
Nicholas Johnson
ed30f6b861 Update material and image handling structures 2025-09-03 13:01:39 -04:00
Nicholas Johnson
5ea8c5f09a Update Direct3D texture structures 2025-09-03 13:01:26 -04:00
Nicholas Johnson
d1cf5ecc52 Update collision leaf and brush node structures 2025-09-03 13:01:12 -04:00
Nicholas Johnson
a85abf0ecd Update asset and animation structure definitions 2025-09-03 13:00:58 -04:00
Nicholas Johnson
caca3dd489 Update animation-related files 2025-09-03 13:00:41 -04:00
Nicholas Johnson
39853c77fe Update asset-related core files 2025-09-03 13:00:27 -04:00
Nicholas Johnson
f149b66322 Remove deprecated and unused asset-related files 2025-09-03 13:00:02 -04:00
Nicholas Johnson
0ea4a7ad6f Added a tonnn of new classes. 2025-08-17 13:14:17 -04:00
Nicholas Johnson
729a6bac7c Renamed Assets to XAssets. 2025-08-14 18:50:13 -04:00
Nicholas Johnson
be8aa3691e Hey baby girl 2025-08-14 17:30:25 -04:00
Nicholas Johnson
cfa0638b94 More decompiled translations :(. 2025-07-10 01:07:48 -04:00
=
ff1a25b41f Uh. 2025-07-10 00:11:33 -04:00
=
a0cfb65b56 Add tool changes to project. 2025-07-10 00:11:20 -04:00
=
77428c0515 update tests and project. 2025-07-10 00:11:06 -04:00
=
34d6ae6658 Fastfile and other file changes. 2025-07-10 00:10:49 -04:00
=
f339360fbc Removed/renamed some files. 2025-07-10 00:10:30 -04:00
=
f23c38cc3c Removed/renamed some files. 2025-07-10 00:10:16 -04:00
=
fdf1559f09 Tried making magic asset parser. To be contondered. 2025-07-10 00:09:18 -04:00
=
556e33d56f Added dxd9 sdk, even big libs lol. 2025-07-10 00:08:30 -04:00
=
c980d53543 Tried using the IDA pro exports, didnt work. 2025-07-10 00:07:22 -04:00
=
c8cfc1c5fc Autotest changes. 2025-07-10 00:06:51 -04:00
=
a7904ca74e Compro changes. 2025-07-10 00:06:37 -04:00
=
6cc3d71acf Some bs zentry changes. 2025-07-10 00:06:16 -04:00
=
23827f4ffa Zonefile changes and additions. 2025-07-10 00:05:44 -04:00
=
67050e6a67 Lotta asset changes 2025-07-10 00:04:52 -04:00
=
0943608bd8 Add issue reporter dialog. 2025-07-10 00:02:15 -04:00
=
f1aa61bf3b Add ported code from ida. 2025-06-07 11:20:47 -04:00
980 changed files with 279422 additions and 50903 deletions

7
.gitignore vendored
View File

@ -13,3 +13,10 @@
*.creator.* *.creator.*
*.ps1 *.ps1
version.txt version.txt
*.autosave
*.XMODEL_EXPORT
data/obj/*
libs/*/release/*
libs/*/debug/*
.git.stash
*Makefile*

23
.qmake.stash Normal file
View File

@ -0,0 +1,23 @@
QMAKE_CXX.QT_COMPILER_STDCXX = 199711L
QMAKE_CXX.QMAKE_MSC_VER = 1943
QMAKE_CXX.QMAKE_MSC_FULL_VER = 194334810
QMAKE_CXX.COMPILER_MACROS = \
QT_COMPILER_STDCXX \
QMAKE_MSC_VER \
QMAKE_MSC_FULL_VER
QMAKE_CXX.INCDIRS = \
"C:\\Program Files\\Microsoft Visual Studio\\2022\\Community\\VC\\Tools\\MSVC\\14.43.34808\\include" \
"C:\\Program Files\\Microsoft Visual Studio\\2022\\Community\\VC\\Tools\\MSVC\\14.43.34808\\ATLMFC\\include" \
"C:\\Program Files\\Microsoft Visual Studio\\2022\\Community\\VC\\Auxiliary\\VS\\include" \
"C:\\Program Files (x86)\\Windows Kits\\10\\include\\10.0.26100.0\\ucrt" \
"C:\\Program Files (x86)\\Windows Kits\\10\\\\include\\10.0.26100.0\\\\um" \
"C:\\Program Files (x86)\\Windows Kits\\10\\\\include\\10.0.26100.0\\\\shared" \
"C:\\Program Files (x86)\\Windows Kits\\10\\\\include\\10.0.26100.0\\\\winrt" \
"C:\\Program Files (x86)\\Windows Kits\\10\\\\include\\10.0.26100.0\\\\cppwinrt" \
"C:\\Program Files (x86)\\Windows Kits\\NETFXSDK\\4.8\\include\\um"
QMAKE_CXX.LIBDIRS = \
"C:\\Program Files\\Microsoft Visual Studio\\2022\\Community\\VC\\Tools\\MSVC\\14.43.34808\\ATLMFC\\lib\\x64" \
"C:\\Program Files\\Microsoft Visual Studio\\2022\\Community\\VC\\Tools\\MSVC\\14.43.34808\\lib\\x64" \
"C:\\Program Files (x86)\\Windows Kits\\NETFXSDK\\4.8\\lib\\um\\x64" \
"C:\\Program Files (x86)\\Windows Kits\\10\\lib\\10.0.26100.0\\ucrt\\x64" \
"C:\\Program Files (x86)\\Windows Kits\\10\\\\lib\\10.0.26100.0\\\\um\\x64"

4
.vscode/settings.json vendored Normal file
View File

@ -0,0 +1,4 @@
{
"workbench.colorTheme": "Default Dark Modern",
"workbench.startupEditor": "none"
}

View File

@ -6,63 +6,9 @@ SUBDIRS += app
CONFIG += c++17 CONFIG += c++17
SOURCES += \ SOURCES += $$files($$PWD/*.cpp)
aboutdialog.cpp \ HEADERS += $$files($$PWD/*.h)
ddsviewer.cpp \ FORMS += $$files($$PWD/*.ui)
fastfileviewer.cpp \
imagewidget.cpp \
iwiviewer.cpp \
localstringviewer.cpp \
main.cpp \
mainwindow.cpp \
materialviewer.cpp \
preferenceeditor.cpp \
soundviewer.cpp \
stringtableviewer.cpp \
rumblegraphviewer.cpp \
rumblefileviewer.cpp \
techsetviewer.cpp \
xtreewidget.cpp \
xtreewidgetitem.cpp \
zonefileviewer.cpp
HEADERS += \
aboutdialog.h \
d3dbsp_structs.h \
ddsviewer.h \
fastfileviewer.h \
imagewidget.h \
iwiviewer.h \
localstringviewer.h \
mainwindow.h \
materialviewer.h \
preferenceeditor.h \
soundviewer.h \
stringtableviewer.h \
rumblegraphviewer.h \
rumblefileviewer.h \
techsetviewer.h \
xtreewidget.h \
xtreewidgetitem.h \
zonefileviewer.h
FORMS += \
aboutdialog.ui \
ddsviewer.ui \
fastfileviewer.ui \
imagewidget.ui \
iwiviewer.ui \
localstringviewer.ui \
mainwindow.ui \
materialviewer.ui \
modelviewer.ui \
preferenceeditor.ui \
soundviewer.ui \
stringtableviewer.ui \
rumblegraphviewer.ui \
rumblefileviewer.ui \
techsetviewer.ui \
zonefileviewer.ui
RESOURCES += ../data/data.qrc RESOURCES += ../data/data.qrc
@ -71,6 +17,7 @@ LIBS += \
-L$$PWD/../third_party/zlib/lib/ -lzlib \ -L$$PWD/../third_party/zlib/lib/ -lzlib \
-L$$PWD/../third_party/xbox_sdk/lib -lxcompress64 \ -L$$PWD/../third_party/xbox_sdk/lib -lxcompress64 \
-L$$OUT_PWD/../libs/ -lcore \ -L$$OUT_PWD/../libs/ -lcore \
-L$$OUT_PWD/../libs/ -lxassets\
-L$$OUT_PWD/../libs/ -lcompression \ -L$$OUT_PWD/../libs/ -lcompression \
-L$$OUT_PWD/../libs/ -lencryption \ -L$$OUT_PWD/../libs/ -lencryption \
-L$$OUT_PWD/../libs/ -lfastfile \ -L$$OUT_PWD/../libs/ -lfastfile \
@ -90,6 +37,7 @@ INCLUDEPATH += \
$$PWD/../libs/ddsfile \ $$PWD/../libs/ddsfile \
$$PWD/../libs/ipakfile \ $$PWD/../libs/ipakfile \
$$PWD/../libs/iwifile \ $$PWD/../libs/iwifile \
$$PWD/../libs/xassets \
$$PWD/../libs/zonefile $$PWD/../libs/zonefile
DEPENDPATH += \ DEPENDPATH += \
@ -103,16 +51,11 @@ DEPENDPATH += \
$$PWD/../libs/ddsfile \ $$PWD/../libs/ddsfile \
$$PWD/../libs/ipakfile \ $$PWD/../libs/ipakfile \
$$PWD/../libs/iwifile \ $$PWD/../libs/iwifile \
$$PWD/../libs/xassets \
$$PWD/../libs/zonefile $$PWD/../libs/zonefile
# Copy DLLs to Debug folder
QMAKE_POST_LINK += xcopy /Y /E /I \"G:/Projects/Qt/XPlor/third_party/devil_sdk/lib\\*.dll\" \"$$OUT_PWD/debug/\" $$escape_expand(\\n\\t)
QMAKE_POST_LINK += xcopy /Y /E /I \"G:/Projects/Qt/XPlor/third_party/zlib/lib\\*.dll\" \"$$OUT_PWD/debug/\" $$escape_expand(\\n\\t)
QMAKE_POST_LINK += xcopy /Y /E /I \"G:/Projects/Qt/XPlor/third_party/xna/lib\\*.dll\" \"$$OUT_PWD/debug/\" $$escape_expand(\\n\\t)
QMAKE_POST_LINK += xcopy /Y /E /I \"$$PWD/../third_party/xbox_sdk/lib\\*.dll\" \"$$OUT_PWD/debug/\" $$escape_expand(\\n\\t)
# Copy DLLs to Release folder win32 {
QMAKE_POST_LINK += xcopy /Y /E /I \"G:/Projects/Qt/XPlor/third_party/devil_sdk/lib\\*.dll\" \"$$OUT_PWD/release/\" $$escape_expand(\\n\\t) QMAKE_POST_LINK =
QMAKE_POST_LINK += xcopy /Y /E /I \"G:/Projects/Qt/XPlor/third_party/zlib/lib\\*.dll\" \"$$OUT_PWD/release/\" $$escape_expand(\\n\\t) QMAKE_POST_LINK += for /D %%G in (\"$$PWD/../third_party/*/lib\") do copy /Y \"%%~G\*.dll\" \"$$OUT_PWD/$$DESTDIR/\" >NUL $$escape_expand(\\n\\t)
QMAKE_POST_LINK += xcopy /Y /E /I \"G:/Projects/Qt/XPlor/third_party/xna/lib\\*.dll\" \"$$OUT_PWD/release/\" $$escape_expand(\\n\\t) }
QMAKE_POST_LINK += xcopy /Y /E /I \"$$PWD/../third_party/xbox_sdk/lib\\*.dll\" \"$$OUT_PWD/release/\" $$escape_expand(\\n\\t)

View File

@ -14,8 +14,8 @@ DDSViewer::~DDSViewer() {
delete ui; delete ui;
} }
void DDSViewer::SetDDSFile(std::shared_ptr<DDSFile> aDDSFile) { void DDSViewer::SetDDSFile(const DDSFile* aDDSFile) {
mDDSFile.swap(aDDSFile); mDDSFile = aDDSFile;
ui->label_Title->setText(mDDSFile->fileStem + ".dds"); ui->label_Title->setText(mDDSFile->fileStem + ".dds");

View File

@ -16,14 +16,14 @@ public:
explicit DDSViewer(QWidget *parent = nullptr); explicit DDSViewer(QWidget *parent = nullptr);
~DDSViewer(); ~DDSViewer();
void SetDDSFile(std::shared_ptr<DDSFile> aDDSFile); void SetDDSFile(const DDSFile *aDDSFile);
private slots: private slots:
void MipmapIndexChanged(int aMipmapIndex); void MipmapIndexChanged(int aMipmapIndex);
private: private:
Ui::DDSViewer *ui; Ui::DDSViewer *ui;
std::shared_ptr<DDSFile> mDDSFile; const DDSFile* mDDSFile;
}; };
#endif // DDSVIEWER_H #endif // DDSVIEWER_H

View File

@ -1,5 +1,4 @@
#include "fastfileviewer.h" #include "fastfileviewer.h"
#include "asset_structs.h"
#include "ui_fastfileviewer.h" #include "ui_fastfileviewer.h"
FastFileViewer::FastFileViewer(QWidget *parent) FastFileViewer::FastFileViewer(QWidget *parent)
@ -15,8 +14,8 @@ FastFileViewer::~FastFileViewer()
delete ui; delete ui;
} }
void FastFileViewer::SetFastFile(std::shared_ptr<FastFile> aFastFile) { void FastFileViewer::SetFastFile(const FastFile* aFastFile) {
mFastFile.swap(aFastFile); mFastFile = aFastFile;
ui->label_Title->setText(mFastFile->GetStem()); ui->label_Title->setText(mFastFile->GetStem());
ui->comboBox_Company->setCurrentIndex(mFastFile->GetCompany()); ui->comboBox_Company->setCurrentIndex(mFastFile->GetCompany());

View File

@ -1,7 +1,6 @@
#ifndef FASTFILEVIEWER_H #ifndef FASTFILEVIEWER_H
#define FASTFILEVIEWER_H #define FASTFILEVIEWER_H
#include "asset_structs.h"
#include "fastfile.h" #include "fastfile.h"
#include <QWidget> #include <QWidget>
@ -17,10 +16,10 @@ public:
explicit FastFileViewer(QWidget *parent = nullptr); explicit FastFileViewer(QWidget *parent = nullptr);
~FastFileViewer(); ~FastFileViewer();
void SetFastFile(std::shared_ptr<FastFile> aFastFile); void SetFastFile(const FastFile *aFastFile);
private: private:
Ui::FFViewer *ui; Ui::FFViewer *ui;
std::shared_ptr<FastFile> mFastFile; const FastFile* mFastFile;
}; };
#endif // FASTFILEVIEWER_H #endif // FASTFILEVIEWER_H

View File

@ -13,16 +13,16 @@ ImageWidget::~ImageWidget()
delete ui; delete ui;
} }
void ImageWidget::SetImage(std::shared_ptr<Image> aImage) void ImageWidget::SetImage(std::shared_ptr<QImage> aImage)
{ {
mImage = aImage; mImage = aImage;
ui->lineEdit_Name->setText(aImage->name); //ui->lineEdit_Name->setText(aImage->name);
ui->lineEdit_Role->setText(aImage->materialName); //ui->lineEdit_Role->setText(aImage->materialName);
ui->comboBox_Compression->setCurrentIndex(aImage->compression); //ui->comboBox_Compression->setCurrentIndex(aImage->compression);
} }
std::shared_ptr<Image> ImageWidget::GetImage() std::shared_ptr<QImage> ImageWidget::GetImage()
{ {
return mImage; return mImage;
} }

View File

@ -4,7 +4,6 @@
#include "enums.h" #include "enums.h"
#include "dds_structs.h" #include "dds_structs.h"
#include "d3dbsp_structs.h" #include "d3dbsp_structs.h"
#include "asset_structs.h"
#include "ipak_structs.h" #include "ipak_structs.h"
#include <QWidget> #include <QWidget>
@ -21,11 +20,11 @@ public:
explicit ImageWidget(QWidget *parent = nullptr); explicit ImageWidget(QWidget *parent = nullptr);
~ImageWidget(); ~ImageWidget();
void SetImage(std::shared_ptr<Image> aImage); void SetImage(std::shared_ptr<QImage> aImage);
std::shared_ptr<Image> GetImage(); std::shared_ptr<QImage> GetImage();
private: private:
std::shared_ptr<Image> mImage; std::shared_ptr<QImage> mImage;
Ui::ImageWidget *ui; Ui::ImageWidget *ui;
}; };

View File

@ -14,8 +14,8 @@ IWIViewer::~IWIViewer()
delete ui; delete ui;
} }
void IWIViewer::SetIWIFile(std::shared_ptr<IWIFile> aIWIFile) { void IWIViewer::SetIWIFile(const IWIFile* aIWIFile) {
mIWIFile.swap(aIWIFile); mIWIFile = aIWIFile;
ui->label_Title->setText(mIWIFile->fileStem + ".iwi"); ui->label_Title->setText(mIWIFile->fileStem + ".iwi");

View File

@ -18,10 +18,10 @@ public:
void MipmapIndexChanged(int aMipmapIndex); void MipmapIndexChanged(int aMipmapIndex);
void SetIWIFile(std::shared_ptr<IWIFile> aIWIFile); void SetIWIFile(const IWIFile *aIWIFile);
private: private:
Ui::IWIViewer *ui; Ui::IWIViewer *ui;
std::shared_ptr<IWIFile> mIWIFile; const IWIFile* mIWIFile;
}; };
#endif // IWIVIEWER_H #endif // IWIVIEWER_H

View File

@ -37,26 +37,22 @@ void LocalStringViewer::SetFileNotes(const QString aFileNotes) {
ui->plainTextEdit_FileNotes->setPlainText(mFileNotes); ui->plainTextEdit_FileNotes->setPlainText(mFileNotes);
} }
void LocalStringViewer::AddLocalString(LocalString aLocalString) { void LocalStringViewer::AddLocalString(XLocalizeEntry aLocalString) {
mLocalStrings.append(aLocalString); mLocalStrings.append(aLocalString);
ui->tableWidget_Strings->setRowCount(mLocalStrings.size()); ui->tableWidget_Strings->setRowCount(mLocalStrings.size());
ui->groupBox_LocalStrViewer->setTitle(QString("Entries (%1)").arg(mLocalStrings.size())); ui->groupBox_LocalStrViewer->setTitle(QString("Entries (%1)").arg(mLocalStrings.size()));
QTableWidgetItem *aliasItem = new QTableWidgetItem(aLocalString.GetValue()->GetString());
QTableWidgetItem *aliasItem = new QTableWidgetItem(aLocalString.alias); QTableWidgetItem *stringItem = new QTableWidgetItem(aLocalString.GetName()->GetString());
QTableWidgetItem *stringItem = new QTableWidgetItem(aLocalString.string);
ui->tableWidget_Strings->setItem(mLocalStrings.size() - 1, 0, aliasItem); ui->tableWidget_Strings->setItem(mLocalStrings.size() - 1, 0, aliasItem);
ui->tableWidget_Strings->setItem(mLocalStrings.size() - 1, 1, stringItem); ui->tableWidget_Strings->setItem(mLocalStrings.size() - 1, 1, stringItem);
} }
void LocalStringViewer::SetZoneFile(std::shared_ptr<ZoneFile> aZoneFile) { void LocalStringViewer::SetZoneFile(const ZoneFile* aZoneFile) {
mLocalStrings.clear(); mLocalStrings.clear();
ui->tableWidget_Strings->clear(); ui->tableWidget_Strings->clear();
ui->label_Title->setText(aZoneFile->GetStem().section('.', 0, 0) + ".str"); ui->label_Title->setText(aZoneFile->GetStem().section('.', 0, 0) + ".str");
for (const LocalString &localStr : aZoneFile->GetAssetMap().localStrings) { // for (const LocalString &localStr : aZoneFile->GetAssetMap().localStrings) {
AddLocalString(localStr); // AddLocalString(localStr);
} // }
} }

View File

@ -1,7 +1,7 @@
#ifndef LOCALSTRINGVIEWER_H #ifndef LOCALSTRINGVIEWER_H
#define LOCALSTRINGVIEWER_H #define LOCALSTRINGVIEWER_H
#include "asset_structs.h" #include "xlocalizeentry.h"
#include "zonefile.h" #include "zonefile.h"
#include <QWidget> #include <QWidget>
@ -20,15 +20,15 @@ public:
void SetVersion(quint32 aVersion); void SetVersion(quint32 aVersion);
void SetConfigPath(const QString aConfigPath); void SetConfigPath(const QString aConfigPath);
void SetFileNotes(const QString aFileNotes); void SetFileNotes(const QString aFileNotes);
void AddLocalString(LocalString aLocalString); void AddLocalString(XLocalizeEntry aLocalString);
void SetZoneFile(std::shared_ptr<ZoneFile> aZoneFile); void SetZoneFile(const ZoneFile *aZoneFile);
private: private:
Ui::LocalStringViewer *ui; Ui::LocalStringViewer *ui;
quint32 mVersion; quint32 mVersion;
QString mConfigPath; QString mConfigPath;
QString mFileNotes; QString mFileNotes;
QVector<LocalString> mLocalStrings; QVector<XLocalizeEntry> mLocalStrings;
}; };
#endif // LOCALSTRINGVIEWER_H #endif // LOCALSTRINGVIEWER_H

View File

@ -1,4 +1,6 @@
#include "mainwindow.h" #include "mainwindow.h"
#include "ui_mainwindow.h"
#include "aboutdialog.h" #include "aboutdialog.h"
#include "fastfile.h" #include "fastfile.h"
#include "highlighter_gsc.h" #include "highlighter_gsc.h"
@ -7,12 +9,12 @@
#include "highlighter_rumble.h" #include "highlighter_rumble.h"
#include "materialviewer.h" #include "materialviewer.h"
#include "preferenceeditor.h" #include "preferenceeditor.h"
#include "reportissuedialog.h"
#include "rumblefileviewer.h" #include "rumblefileviewer.h"
#include "rumblegraphviewer.h" #include "rumblegraphviewer.h"
#include "soundviewer.h" #include "soundviewer.h"
#include "stringtableviewer.h" #include "stringtableviewer.h"
#include "techsetviewer.h" #include "techsetviewer.h"
#include "ui_mainwindow.h"
#include "fastfile_factory.h" #include "fastfile_factory.h"
#include "iwifile.h" #include "iwifile.h"
#include "ddsfile.h" #include "ddsfile.h"
@ -23,7 +25,6 @@
#include "iwiviewer.h" #include "iwiviewer.h"
#include "localstringviewer.h" #include "localstringviewer.h"
#include "imagewidget.h" #include "imagewidget.h"
#include "xtreewidget.h"
#include "zonefileviewer.h" #include "zonefileviewer.h"
#include "techsetviewer.h" #include "techsetviewer.h"
#include "logmanager.h" #include "logmanager.h"
@ -39,7 +40,7 @@ MainWindow::MainWindow(QWidget *parent)
mTypeMap = QMap<QString, int>(); mTypeMap = QMap<QString, int>();
mTypeOrder = QStringList(); mTypeOrder = QStringList();
mRawFileMap = QMap<QString, QString>(); mRawFileMap = QMap<QString, QString>();
mImageMap = QMap<QString, Image>(); //mImageMap = QMap<QString, Image>();
mTreeMap = QMap<QString, QTreeWidgetItem *>(); mTreeMap = QMap<QString, QTreeWidgetItem *>();
mStrTableMap = QMap<QString, QVector<QPair<QString, QString>>>(); mStrTableMap = QMap<QString, QVector<QPair<QString, QString>>>();
mBSPVersion = 0; mBSPVersion = 0;
@ -49,13 +50,23 @@ MainWindow::MainWindow(QWidget *parent)
mTreeWidget = new XTreeWidget(this); mTreeWidget = new XTreeWidget(this);
mLogWidget = new QPlainTextEdit(this); mLogWidget = new QPlainTextEdit(this);
//ModelViewer *mModelViewer = new ModelViewer(container);
//mModelViewer->setAcceptDrops(false);
mProgressBar = new QProgressBar(this); mProgressBar = new QProgressBar(this);
mProgressBar->setMaximum(100); // Default max value mProgressBar->setMaximum(100); // Default max value
mProgressBar->setVisible(false); // Initially hidden mProgressBar->setVisible(false); // Initially hidden
connect(ui->actionRun_Tests, &QAction::triggered, this, [](bool checked) {
Q_UNUSED(checked);
});
connect(ui->actionReport_Issue, &QAction::triggered, this, [this](bool checked) {
Q_UNUSED(checked);
ReportIssueDialog issueDialog("https://git.redline.llc", "njohnson", "XPlor", "4738c4d2efd123efac1506c68c59b285c646df9f", this);
if (issueDialog.exec() == QDialog::Accepted) {
}
});
connect(&StatusBarManager::instance(), &StatusBarManager::statusUpdated, connect(&StatusBarManager::instance(), &StatusBarManager::statusUpdated,
this, &MainWindow::HandleStatusUpdate); this, &MainWindow::HandleStatusUpdate);
@ -148,7 +159,7 @@ MainWindow::MainWindow(QWidget *parent)
ui->tabWidget->clear(); ui->tabWidget->clear();
}); });
connect(mTreeWidget, &XTreeWidget::RawFileSelected, this, [this](std::shared_ptr<RawFile> rawFile, const QString aParentName) { connect(mTreeWidget, &XTreeWidget::RawFileSelected, this, [this](const XRawFile* rawFile, const QString aParentName) {
QTabWidget *rawTabWidget = new QTabWidget(this); QTabWidget *rawTabWidget = new QTabWidget(this);
rawTabWidget->setProperty("PARENT_NAME", QVariant::fromValue(aParentName)); rawTabWidget->setProperty("PARENT_NAME", QVariant::fromValue(aParentName));
@ -157,13 +168,13 @@ MainWindow::MainWindow(QWidget *parent)
scriptEditor->setProperty("PARENT_NAME", QVariant::fromValue(aParentName)); scriptEditor->setProperty("PARENT_NAME", QVariant::fromValue(aParentName));
scriptEditor->setFont(QFont("Consolas")); scriptEditor->setFont(QFont("Consolas"));
if (rawFile->contents.isEmpty()) { // if (rawFile->contents.isEmpty()) {
scriptEditor->setPlainText("EMPTY"); // scriptEditor->setPlainText("EMPTY");
} else { // } else {
scriptEditor->setPlainText(rawFile->contents); // scriptEditor->setPlainText(rawFile->contents);
} // }
QString fileStem = rawFile->path.split('/').last(); QString fileStem;// = rawFile->path.split('/').last();
for (int i = 0; i < ui->tabWidget->count(); i++) { for (int i = 0; i < ui->tabWidget->count(); i++) {
if (ui->tabWidget->tabText(i) == fileStem) { if (ui->tabWidget->tabText(i) == fileStem) {
delete scriptEditor; delete scriptEditor;
@ -175,7 +186,7 @@ MainWindow::MainWindow(QWidget *parent)
QFontMetrics metrics(scriptEditor->font()); QFontMetrics metrics(scriptEditor->font());
scriptEditor->setTabStopDistance(tabStopSpaces * metrics.horizontalAdvance(' ')); scriptEditor->setTabStopDistance(tabStopSpaces * metrics.horizontalAdvance(' '));
QSyntaxHighlighter *highlighter; QSyntaxHighlighter *highlighter = nullptr;
if (fileStem.contains(".gsc")) { if (fileStem.contains(".gsc")) {
highlighter = new Highlighter_GSC(scriptEditor->document()); highlighter = new Highlighter_GSC(scriptEditor->document());
} else if (fileStem.contains(".cfg")) { } else if (fileStem.contains(".cfg")) {
@ -191,12 +202,12 @@ MainWindow::MainWindow(QWidget *parent)
rawTabWidget->addTab(scriptEditor, "Text Editor"); rawTabWidget->addTab(scriptEditor, "Text Editor");
ui->tabWidget->addTab(rawTabWidget, fileStem); ui->tabWidget->addTab(rawTabWidget, fileStem);
ui->tabWidget->setTabIcon(ui->tabWidget->count() - 1, ZoneFile::AssetTypeToIcon(ASSET_RUMBLE)); ui->tabWidget->setTabIcon(ui->tabWidget->count() - 1, Utils::CreateAssetIcon(ASSET_TYPE_RUMBLE));
ui->tabWidget->setCurrentIndex(ui->tabWidget->count() - 1); ui->tabWidget->setCurrentIndex(ui->tabWidget->count() - 1);
return; return;
} else if (fileStem.contains(".shock")) { } else if (fileStem.contains(".shock")) {
highlighter = new Highlighter_Shock(scriptEditor->document()); highlighter = new Highlighter_Shock(scriptEditor->document());
} else if (rawFile->contents.left(6) == "RUMBLE") { } /*else if (rawFile->contents.left(6) == "RUMBLE") {
RumbleFileViewer *rmbFileViewer = new RumbleFileViewer(this); RumbleFileViewer *rmbFileViewer = new RumbleFileViewer(this);
rmbFileViewer->setProperty("PARENT_NAME", QVariant::fromValue(aParentName)); rmbFileViewer->setProperty("PARENT_NAME", QVariant::fromValue(aParentName));
rmbFileViewer->SetRumbleFile(rawFile); rmbFileViewer->SetRumbleFile(rawFile);
@ -205,59 +216,61 @@ MainWindow::MainWindow(QWidget *parent)
rawTabWidget->addTab(scriptEditor, "Text Editor"); rawTabWidget->addTab(scriptEditor, "Text Editor");
ui->tabWidget->addTab(rawTabWidget, fileStem); ui->tabWidget->addTab(rawTabWidget, fileStem);
ui->tabWidget->setTabIcon(ui->tabWidget->count() - 1, ZoneFile::AssetTypeToIcon(ASSET_RUMBLE)); ui->tabWidget->setTabIcon(ui->tabWidget->count() - 1, Utils::CreateAssetIcon(ASSET_TYPE_RUMBLE));
ui->tabWidget->setCurrentIndex(ui->tabWidget->count() - 1); ui->tabWidget->setCurrentIndex(ui->tabWidget->count() - 1);
return; return;
}*/ else {
delete highlighter;
} }
ui->tabWidget->addTab(scriptEditor, fileStem); ui->tabWidget->addTab(scriptEditor, fileStem);
ui->tabWidget->setTabIcon(ui->tabWidget->count() - 1, ZoneFile::AssetTypeToIcon(ASSET_RAW_FILE)); ui->tabWidget->setTabIcon(ui->tabWidget->count() - 1, Utils::CreateAssetIcon(ASSET_TYPE_RAWFILE));
ui->tabWidget->setCurrentIndex(ui->tabWidget->count() - 1); ui->tabWidget->setCurrentIndex(ui->tabWidget->count() - 1);
}); });
connect(mTreeWidget, &XTreeWidget::ImageSelected, this, [this](std::shared_ptr<Image> image, const QString aParentName) { // connect(mTreeWidget, &XTreeWidget::ImageSelected, this, [this](std::shared_ptr<Image> image, const QString aParentName) {
ImageWidget *mImageWidget = new ImageWidget(this); // ImageWidget *mImageWidget = new ImageWidget(this);
mImageWidget->setAcceptDrops(false); // mImageWidget->setAcceptDrops(false);
mImageWidget->SetImage(image); // mImageWidget->SetImage(image);
mImageWidget->setProperty("PARENT_NAME", QVariant::fromValue(aParentName)); // mImageWidget->setProperty("PARENT_NAME", QVariant::fromValue(aParentName));
QString fileStem = image->materialName; // QString fileStem = image->materialName;
for (int i = 0; i < ui->tabWidget->count(); i++) { // for (int i = 0; i < ui->tabWidget->count(); i++) {
if (ui->tabWidget->tabText(i) == fileStem) { // if (ui->tabWidget->tabText(i) == fileStem) {
delete mImageWidget; // delete mImageWidget;
return; // return;
} // }
} // }
ui->tabWidget->addTab(mImageWidget, fileStem); // ui->tabWidget->addTab(mImageWidget, fileStem);
ui->tabWidget->setTabIcon(ui->tabWidget->count() - 1, ZoneFile::AssetTypeToIcon(ASSET_IMAGE)); // ui->tabWidget->setTabIcon(ui->tabWidget->count() - 1, Utils::CreateAssetIcon(ASSET_TYPE_IMAGE));
ui->tabWidget->setCurrentIndex(ui->tabWidget->count() - 1); // ui->tabWidget->setCurrentIndex(ui->tabWidget->count() - 1);
}); // });
connect(mTreeWidget, &XTreeWidget::MenuSelected, this, [](std::shared_ptr<Menu> menu, const QString aParentName) { // connect(mTreeWidget, &XTreeWidget::MenuSelected, this, [](std::shared_ptr<Menu> menu, const QString aParentName) {
Q_UNUSED(menu); // Q_UNUSED(menu);
}); // });
connect(mTreeWidget, &XTreeWidget::MaterialSelected, this, [this](std::shared_ptr<Material> material, const QString aParentName) { connect(mTreeWidget, &XTreeWidget::MaterialSelected, this, [this](const XMaterial* material, const QString aParentName) {
MaterialViewer *matViewer = new MaterialViewer(this); MaterialViewer *matViewer = new MaterialViewer(this);
matViewer->setAcceptDrops(false); matViewer->setAcceptDrops(false);
matViewer->SetMaterial(material); matViewer->SetMaterial(material);
matViewer->setProperty("PARENT_NAME", QVariant::fromValue(aParentName)); matViewer->setProperty("PARENT_NAME", QVariant::fromValue(aParentName));
QString fileStem = material->name; // QString fileStem = material->name;
for (int i = 0; i < ui->tabWidget->count(); i++) { // for (int i = 0; i < ui->tabWidget->count(); i++) {
if (ui->tabWidget->tabText(i) == fileStem) { // if (ui->tabWidget->tabText(i) == fileStem) {
delete matViewer; // delete matViewer;
return; // return;
} // }
} // }
ui->tabWidget->addTab(matViewer, fileStem); //ui->tabWidget->addTab(matViewer, fileStem);
ui->tabWidget->setTabIcon(ui->tabWidget->count() - 1, ZoneFile::AssetTypeToIcon(ASSET_MATERIAL)); ui->tabWidget->setTabIcon(ui->tabWidget->count() - 1, Utils::CreateAssetIcon(ASSET_TYPE_MATERIAL));
ui->tabWidget->setCurrentIndex(ui->tabWidget->count() - 1); ui->tabWidget->setCurrentIndex(ui->tabWidget->count() - 1);
}); });
connect(mTreeWidget, &XTreeWidget::DDSFileSelected, this, [this](std::shared_ptr<DDSFile> ddsFile, const QString aParentName) { connect(mTreeWidget, &XTreeWidget::DDSFileSelected, this, [this](const DDSFile* ddsFile, const QString aParentName) {
DDSViewer *ddsViewer = new DDSViewer(this); DDSViewer *ddsViewer = new DDSViewer(this);
ddsViewer->setAcceptDrops(false); ddsViewer->setAcceptDrops(false);
ddsViewer->SetDDSFile(ddsFile); ddsViewer->SetDDSFile(ddsFile);
@ -272,11 +285,11 @@ MainWindow::MainWindow(QWidget *parent)
} }
ui->tabWidget->addTab(ddsViewer, fileStem); ui->tabWidget->addTab(ddsViewer, fileStem);
ui->tabWidget->setTabIcon(ui->tabWidget->count() - 1, ZoneFile::AssetTypeToIcon(ASSET_IMAGE)); ui->tabWidget->setTabIcon(ui->tabWidget->count() - 1, Utils::CreateAssetIcon(ASSET_TYPE_IMAGE));
ui->tabWidget->setCurrentIndex(ui->tabWidget->count() - 1); ui->tabWidget->setCurrentIndex(ui->tabWidget->count() - 1);
}); });
connect(mTreeWidget, &XTreeWidget::IWIFileSelected, this, [this](std::shared_ptr<IWIFile> iwiFile, const QString aParentName) { connect(mTreeWidget, &XTreeWidget::IWIFileSelected, this, [this](const IWIFile* iwiFile, const QString aParentName) {
IWIViewer *iwiViewer = new IWIViewer(this); IWIViewer *iwiViewer = new IWIViewer(this);
iwiViewer->setAcceptDrops(false); iwiViewer->setAcceptDrops(false);
iwiViewer->SetIWIFile(iwiFile); iwiViewer->SetIWIFile(iwiFile);
@ -291,11 +304,11 @@ MainWindow::MainWindow(QWidget *parent)
} }
ui->tabWidget->addTab(iwiViewer, fileStem); ui->tabWidget->addTab(iwiViewer, fileStem);
ui->tabWidget->setTabIcon(ui->tabWidget->count() - 1, ZoneFile::AssetTypeToIcon(ASSET_IMAGE)); ui->tabWidget->setTabIcon(ui->tabWidget->count() - 1, Utils::CreateAssetIcon(ASSET_TYPE_IMAGE));
ui->tabWidget->setCurrentIndex(ui->tabWidget->count() - 1); ui->tabWidget->setCurrentIndex(ui->tabWidget->count() - 1);
}); });
connect(mTreeWidget, &XTreeWidget::FastFileSelected, this, [this](std::shared_ptr<FastFile> aFastFile, const QString aParentName) { connect(mTreeWidget, &XTreeWidget::FastFileSelected, this, [this](const FastFile* aFastFile, const QString aParentName) {
FastFileViewer *fastFileViewer = new FastFileViewer(this); FastFileViewer *fastFileViewer = new FastFileViewer(this);
fastFileViewer->setAcceptDrops(false); fastFileViewer->setAcceptDrops(false);
fastFileViewer->SetFastFile(aFastFile); fastFileViewer->SetFastFile(aFastFile);
@ -310,11 +323,11 @@ MainWindow::MainWindow(QWidget *parent)
} }
ui->tabWidget->addTab(fastFileViewer, fileStem); ui->tabWidget->addTab(fastFileViewer, fileStem);
ui->tabWidget->setTabIcon(ui->tabWidget->count() - 1, ZoneFile::AssetTypeToIcon(ASSET_FAST_FILE)); ui->tabWidget->setTabIcon(ui->tabWidget->count() - 1, Utils::CreateAssetIcon("FF"));
ui->tabWidget->setCurrentIndex(ui->tabWidget->count() - 1); ui->tabWidget->setCurrentIndex(ui->tabWidget->count() - 1);
}); });
connect(mTreeWidget, &XTreeWidget::ZoneFileSelected, this, [this](std::shared_ptr<ZoneFile> aZoneFile, const QString aParentName) { connect(mTreeWidget, &XTreeWidget::ZoneFileSelected, this, [this](const ZoneFile* aZoneFile, const QString aParentName) {
ZoneFileViewer *zoneFileViewer = new ZoneFileViewer(this); ZoneFileViewer *zoneFileViewer = new ZoneFileViewer(this);
zoneFileViewer->setAcceptDrops(false); zoneFileViewer->setAcceptDrops(false);
zoneFileViewer->SetZoneFile(aZoneFile); zoneFileViewer->SetZoneFile(aZoneFile);
@ -341,11 +354,11 @@ MainWindow::MainWindow(QWidget *parent)
scrollArea->setWidget(containerWidget); scrollArea->setWidget(containerWidget);
ui->tabWidget->addTab(scrollArea, fileStem); ui->tabWidget->addTab(scrollArea, fileStem);
ui->tabWidget->setTabIcon(ui->tabWidget->count() - 1, ZoneFile::AssetTypeToIcon(ASSET_ZONE_FILE)); ui->tabWidget->setTabIcon(ui->tabWidget->count() - 1, Utils::CreateAssetIcon("ZF"));
ui->tabWidget->setCurrentIndex(ui->tabWidget->count() - 1); ui->tabWidget->setCurrentIndex(ui->tabWidget->count() - 1);
}); });
connect(mTreeWidget, &XTreeWidget::LocalStringSelected, this, [this](std::shared_ptr<ZoneFile> aZoneFile, const QString aParentName) { connect(mTreeWidget, &XTreeWidget::LocalStringSelected, this, [this](const ZoneFile* aZoneFile, const QString aParentName) {
LocalStringViewer *localStrViewer = new LocalStringViewer(this); LocalStringViewer *localStrViewer = new LocalStringViewer(this);
localStrViewer->setAcceptDrops(false); localStrViewer->setAcceptDrops(false);
localStrViewer->SetZoneFile(aZoneFile); localStrViewer->SetZoneFile(aZoneFile);
@ -360,17 +373,17 @@ MainWindow::MainWindow(QWidget *parent)
} }
ui->tabWidget->addTab(localStrViewer, fileStem); ui->tabWidget->addTab(localStrViewer, fileStem);
ui->tabWidget->setTabIcon(ui->tabWidget->count() - 1, ZoneFile::AssetTypeToIcon(ASSET_LOCAL_STRING)); ui->tabWidget->setTabIcon(ui->tabWidget->count() - 1, Utils::CreateAssetIcon(ASSET_TYPE_LOCALIZE_ENTRY));
ui->tabWidget->setCurrentIndex(ui->tabWidget->count() - 1); ui->tabWidget->setCurrentIndex(ui->tabWidget->count() - 1);
}); });
connect(mTreeWidget, &XTreeWidget::TechSetSelected, this, [this](std::shared_ptr<TechSet> aTechSet, const QString aParentName) { connect(mTreeWidget, &XTreeWidget::TechSetSelected, this, [this](const XMaterialTechniqueSet* aTechSet, const QString aParentName) {
TechSetViewer *techSetViewer = new TechSetViewer(this); TechSetViewer *techSetViewer = new TechSetViewer(this);
techSetViewer->setAcceptDrops(false); techSetViewer->setAcceptDrops(false);
techSetViewer->SetTechSet(aTechSet); techSetViewer->SetTechSet(aTechSet);
techSetViewer->setProperty("PARENT_NAME", QVariant::fromValue(aParentName)); techSetViewer->setProperty("PARENT_NAME", QVariant::fromValue(aParentName));
QString fileStem = aTechSet->name; QString fileStem = aTechSet->GetName();
for (int i = 0; i < ui->tabWidget->count(); i++) { for (int i = 0; i < ui->tabWidget->count(); i++) {
if (ui->tabWidget->tabText(i) == fileStem) { if (ui->tabWidget->tabText(i) == fileStem) {
delete techSetViewer; delete techSetViewer;
@ -378,18 +391,18 @@ MainWindow::MainWindow(QWidget *parent)
} }
} }
ui->tabWidget->addTab(techSetViewer, aTechSet->name); ui->tabWidget->addTab(techSetViewer, aTechSet->GetName());
ui->tabWidget->setTabIcon(ui->tabWidget->count() - 1, ZoneFile::AssetTypeToIcon(ASSET_TECH_SET)); ui->tabWidget->setTabIcon(ui->tabWidget->count() - 1, Utils::CreateAssetIcon(ASSET_TYPE_TECHNIQUE_SET));
ui->tabWidget->setCurrentIndex(ui->tabWidget->count() - 1); ui->tabWidget->setCurrentIndex(ui->tabWidget->count() - 1);
}); });
connect(mTreeWidget, &XTreeWidget::StrTableSelected, this, [this](std::shared_ptr<StringTable> aStrTable, const QString aParentName) { connect(mTreeWidget, &XTreeWidget::StrTableSelected, this, [this](const XStringTable* aStrTable, const QString aParentName) {
StringTableViewer *strTableViewer = new StringTableViewer(this); StringTableViewer *strTableViewer = new StringTableViewer(this);
strTableViewer->setAcceptDrops(false); strTableViewer->setAcceptDrops(false);
strTableViewer->SetStringTable(aStrTable); strTableViewer->SetStringTable(aStrTable);
strTableViewer->setProperty("PARENT_NAME", QVariant::fromValue(aParentName)); strTableViewer->setProperty("PARENT_NAME", QVariant::fromValue(aParentName));
QString fileStem = aStrTable->name; QString fileStem = aStrTable->GetName()->GetString();
for (int i = 0; i < ui->tabWidget->count(); i++) { for (int i = 0; i < ui->tabWidget->count(); i++) {
if (ui->tabWidget->tabText(i) == fileStem) { if (ui->tabWidget->tabText(i) == fileStem) {
delete strTableViewer; delete strTableViewer;
@ -398,28 +411,28 @@ MainWindow::MainWindow(QWidget *parent)
} }
ui->tabWidget->addTab(strTableViewer, fileStem); ui->tabWidget->addTab(strTableViewer, fileStem);
ui->tabWidget->setTabIcon(ui->tabWidget->count() - 1, ZoneFile::AssetTypeToIcon(ASSET_STRING_TABLE)); ui->tabWidget->setTabIcon(ui->tabWidget->count() - 1, Utils::CreateAssetIcon(ASSET_TYPE_STRINGTABLE));
ui->tabWidget->setCurrentIndex(ui->tabWidget->count() - 1); ui->tabWidget->setCurrentIndex(ui->tabWidget->count() - 1);
}); });
connect(mTreeWidget, &XTreeWidget::SoundSelected, this, [this](std::shared_ptr<Sound> aSound, const QString aParentName) { // connect(mTreeWidget, &XTreeWidget::SoundSelected, this, [this](std::shared_ptr<Sound> aSound, const QString aParentName) {
SoundViewer *soundViewer = new SoundViewer(this); // SoundViewer *soundViewer = new SoundViewer(this);
soundViewer->setAcceptDrops(false); // soundViewer->setAcceptDrops(false);
soundViewer->SetSound(aSound); // soundViewer->SetSound(aSound);
soundViewer->setProperty("PARENT_NAME", QVariant::fromValue(aParentName)); // soundViewer->setProperty("PARENT_NAME", QVariant::fromValue(aParentName));
QString fileStem = aSound->path.split('/').last(); // QString fileStem = aSound->path.split('/').last();
for (int i = 0; i < ui->tabWidget->count(); i++) { // for (int i = 0; i < ui->tabWidget->count(); i++) {
if (ui->tabWidget->tabText(i) == fileStem) { // if (ui->tabWidget->tabText(i) == fileStem) {
delete soundViewer; // delete soundViewer;
return; // return;
} // }
} // }
ui->tabWidget->addTab(soundViewer, fileStem); // ui->tabWidget->addTab(soundViewer, fileStem);
ui->tabWidget->setTabIcon(ui->tabWidget->count() - 1, ZoneFile::AssetTypeToIcon(ASSET_SOUND)); // ui->tabWidget->setTabIcon(ui->tabWidget->count() - 1, Utils::CreateAssetIcon(ASSET_TYPE_SOUND));
ui->tabWidget->setCurrentIndex(ui->tabWidget->count() - 1); // ui->tabWidget->setCurrentIndex(ui->tabWidget->count() - 1);
}); // });
connect(mTreeWidget, &XTreeWidget::ItemSelected, this, [this](const QString itemText) { connect(mTreeWidget, &XTreeWidget::ItemSelected, this, [this](const QString itemText) {
for (int i = 0; i < ui->tabWidget->count(); i++) { for (int i = 0; i < ui->tabWidget->count(); i++) {
@ -520,7 +533,7 @@ bool MainWindow::OpenFastFile(const QString aFastFilePath) {
return false; return false;
} }
std::shared_ptr<FastFile> fastFile = FastFileFactory::Create(aFastFilePath); FastFile* fastFile = FastFileFactory::Create(aFastFilePath);
fastFile->SetStem(fastFileStem); fastFile->SetStem(fastFileStem);
mTreeWidget->AddFastFile(fastFile); mTreeWidget->AddFastFile(fastFile);
@ -535,8 +548,17 @@ bool MainWindow::OpenFastFile(const QString aFastFilePath) {
and opens the selected file. and opens the selected file.
*/ */
bool MainWindow::OpenFastFile() { bool MainWindow::OpenFastFile() {
const QString fastFileName = Utils::GetOpenFastFileName(); // Open file dialog to steam apps
if (!OpenFastFile(fastFileName)) { const QString steamPath = "C:/Program Files (x86)/Steam/steamapps/common/Call of Duty World at War/zone/english/";
const QString fastFilePath = QFileDialog::getOpenFileName(this, "Open Fast File", steamPath, "Fast File (*.ff);;All Files (*.*)");
if (fastFilePath.isNull()) {
// User pressed cancel
return false;
} else if (!QFile::exists(fastFilePath)) {
QMessageBox::warning(this, "Warning!", QString("%1 does not exist!.").arg(fastFilePath));
return false;
}
if (!OpenFastFile(fastFilePath)) {
qDebug() << "Failed to open Fast file!"; qDebug() << "Failed to open Fast file!";
return false; return false;
} }
@ -553,7 +575,7 @@ bool MainWindow::OpenZoneFile(const QString aZoneFilePath, bool fromFF) {
Q_UNUSED(aZoneFilePath); Q_UNUSED(aZoneFilePath);
Q_UNUSED(fromFF); Q_UNUSED(fromFF);
//ZoneFile zoneFile; // ZoneFile* zoneFile = ZoneFile::Create();
// if (!zoneFile.Load(aZoneFilePath)) { // if (!zoneFile.Load(aZoneFilePath)) {
// qDebug() << "Error: Failed to load zone file!"; // qDebug() << "Error: Failed to load zone file!";
// return false; // return false;
@ -564,8 +586,14 @@ bool MainWindow::OpenZoneFile(const QString aZoneFilePath, bool fromFF) {
} }
bool MainWindow::OpenZoneFile() { bool MainWindow::OpenZoneFile() {
const QString zoneFileName = Utils::GetOpenZoneFileName(); // Open file dialog to steam apps
if (!OpenZoneFile(zoneFileName)) { const QString steamPath = "C:/Program Files (x86)/Steam/steamapps/common/Call of Duty World at War/zone/english/";
const QString zoneFilePath = QFileDialog::getOpenFileName(this, "Open Zone File", steamPath, "Zone File (*.zone);;All Files (*.*)");
if (zoneFilePath.isNull()) {
// User pressed cancel
return false;
} else if (!QFile::exists(zoneFilePath)) {
QMessageBox::warning(this, "Warning!", QString("%1 does not exist!.").arg(zoneFilePath));
qDebug() << "Failed to open Zone file!"; qDebug() << "Failed to open Zone file!";
return false; return false;
} }
@ -637,7 +665,7 @@ quint32 DXT3 = 0x33545844; // 'DXT3'
quint32 DXT5 = 0x35545844; // 'DXT5' quint32 DXT5 = 0x35545844; // 'DXT5'
int MainWindow::LoadFile_IWI(const QString aFilePath) { int MainWindow::LoadFile_IWI(const QString aFilePath) {
mTreeWidget->AddIWIFile(std::make_shared<IWIFile>(aFilePath)); mTreeWidget->AddIWIFile(new IWIFile(aFilePath));
return 0; return 0;
} }
@ -648,7 +676,7 @@ int MainWindow::LoadFile_DDSFiles(const QStringList aFilePaths) {
qDebug() << "Error: Invalid filename " << filePath; qDebug() << "Error: Invalid filename " << filePath;
return -1; return -1;
} }
mTreeWidget->AddDDSFile(std::make_shared<DDSFile>(filePath)); mTreeWidget->AddDDSFile(new DDSFile(filePath));
} }
return 0; return 0;
} }
@ -680,7 +708,7 @@ int MainWindow::LoadFile_DDS(const QString aFilePath) {
qDebug() << "Error: Invalid filename " << aFilePath; qDebug() << "Error: Invalid filename " << aFilePath;
return -1; return -1;
} }
mTreeWidget->AddDDSFile(std::make_shared<DDSFile>(aFilePath)); mTreeWidget->AddDDSFile(new DDSFile(aFilePath));
return 0; return 0;
} }

View File

@ -2,7 +2,6 @@
#define MAINWINDOW_H #define MAINWINDOW_H
#include "d3dbsp_structs.h" #include "d3dbsp_structs.h"
#include "asset_structs.h"
#include "xtreewidget.h" #include "xtreewidget.h"
#include <QMainWindow> #include <QMainWindow>
@ -64,7 +63,7 @@ private:
quint32 mTagCount; quint32 mTagCount;
quint32 mRecordCount; quint32 mRecordCount;
QMap<QString, QString> mRawFileMap; QMap<QString, QString> mRawFileMap;
QMap<QString, Image> mImageMap; //QMap<QString, Image> mImageMap;
QMap<QString, QTreeWidgetItem*> mTreeMap; QMap<QString, QTreeWidgetItem*> mTreeMap;
QMap<QString, QVector<QPair<QString, QString>>> mStrTableMap; QMap<QString, QVector<QPair<QString, QString>>> mStrTableMap;
XTreeWidget *mTreeWidget; XTreeWidget *mTreeWidget;

View File

@ -50,7 +50,7 @@
<height>21</height> <height>21</height>
</rect> </rect>
</property> </property>
<widget class="QMenu" name="menuFile"> <widget class="QMenu" name="MenuDef">
<property name="title"> <property name="title">
<string>File</string> <string>File</string>
</property> </property>
@ -117,9 +117,17 @@
</property> </property>
<addaction name="actionAbout"/> <addaction name="actionAbout"/>
<addaction name="actionCheck_for_Updates"/> <addaction name="actionCheck_for_Updates"/>
<addaction name="actionReport_Issue"/>
</widget> </widget>
<addaction name="menuFile"/> <widget class="QMenu" name="menuTools">
<property name="title">
<string>Tools</string>
</property>
<addaction name="actionRun_Tests"/>
</widget>
<addaction name="MenuDef"/>
<addaction name="menuEdit"/> <addaction name="menuEdit"/>
<addaction name="menuTools"/>
<addaction name="menuHelp"/> <addaction name="menuHelp"/>
</widget> </widget>
<widget class="QToolBar" name="toolBar"> <widget class="QToolBar" name="toolBar">
@ -353,6 +361,16 @@
<string>Preferences...</string> <string>Preferences...</string>
</property> </property>
</action> </action>
<action name="actionReport_Issue">
<property name="text">
<string>Report Issue</string>
</property>
</action>
<action name="actionRun_Tests">
<property name="text">
<string>Run Tests</string>
</property>
</action>
</widget> </widget>
<resources> <resources>
<include location="../data/data.qrc"/> <include location="../data/data.qrc"/>

View File

@ -15,21 +15,21 @@ QString ToHexStr(quint32 in) {
return QString("%1").arg(in, 8, 16, QChar('0')).toUpper(); return QString("%1").arg(in, 8, 16, QChar('0')).toUpper();
} }
void MaterialViewer::SetMaterial(std::shared_ptr<Material> aMaterial) { void MaterialViewer::SetMaterial(const XMaterial* aMaterial) {
ui->lineEdit_NamePtr->setText(ToHexStr(aMaterial->namePtr)); // ui->lineEdit_NamePtr->setText(ToHexStr(aMaterial->namePtr));
ui->lineEdit_Name->setText(aMaterial->name); // ui->lineEdit_Name->setText(aMaterial->name);
ui->lineEdit_RefPtr->setText(ToHexStr(aMaterial->refNamePtr)); // ui->lineEdit_RefPtr->setText(ToHexStr(aMaterial->refNamePtr));
ui->lineEdit_RefName->setText(aMaterial->refName); // ui->lineEdit_RefName->setText(aMaterial->refName);
QString unknownStr = ""; // QString unknownStr = "";
foreach (quint32 unknownPtr, aMaterial->pointers) { // foreach (quint32 unknownPtr, aMaterial->pointers) {
unknownStr += ToHexStr(unknownPtr) + "\n"; // unknownStr += ToHexStr(unknownPtr) + "\n";
} // }
ui->lineEdit_Unknowns->setText(unknownStr); // ui->lineEdit_Unknowns->setText(unknownStr);
ui->lineEdit_StateA->setText(ToHexStr(aMaterial->stateBits[0])); // ui->lineEdit_StateA->setText(ToHexStr(aMaterial->stateBits[0]));
ui->lineEdit_StateA->setText(ToHexStr(aMaterial->stateBits[1])); // ui->lineEdit_StateA->setText(ToHexStr(aMaterial->stateBits[1]));
ui->spinBox_TextureCount->setValue(aMaterial->textureCount); // ui->spinBox_TextureCount->setValue(aMaterial->textureCount);
ui->spinBox_ConstCount->setValue(aMaterial->constCount); // ui->spinBox_ConstCount->setValue(aMaterial->constCount);
ui->lineEdit_TechSetPtr->setText(ToHexStr(aMaterial->techSetPtr)); // ui->lineEdit_TechSetPtr->setText(ToHexStr(aMaterial->techSetPtr));
ui->lineEdit_TexturePtr->setText(ToHexStr(aMaterial->texturePtr)); // ui->lineEdit_TexturePtr->setText(ToHexStr(aMaterial->texturePtr));
ui->lineEdit_ConstantPtr->setText(ToHexStr(aMaterial->constPtr)); // ui->lineEdit_ConstantPtr->setText(ToHexStr(aMaterial->constPtr));
} }

View File

@ -1,7 +1,7 @@
#ifndef MATERIALVIEWER_H #ifndef MATERIALVIEWER_H
#define MATERIALVIEWER_H #define MATERIALVIEWER_H
#include "asset_structs.h" #include "xmaterial.h"
#include <QWidget> #include <QWidget>
#include <QScrollArea> #include <QScrollArea>
@ -18,7 +18,7 @@ public:
explicit MaterialViewer(QWidget *parent = nullptr); explicit MaterialViewer(QWidget *parent = nullptr);
~MaterialViewer(); ~MaterialViewer();
void SetMaterial(std::shared_ptr<Material> aMaterial); void SetMaterial(const XMaterial *aMaterial);
private: private:
Ui::MaterialViewer *ui; Ui::MaterialViewer *ui;

View File

@ -18,41 +18,41 @@ RumbleFileViewer::~RumbleFileViewer() {
delete ui; delete ui;
} }
void RumbleFileViewer::SetRumbleFile(std::shared_ptr<RawFile> aRumbleFile) { void RumbleFileViewer::SetRumbleFile(XRawFile *aRumbleFile) {
mRumbleFile = aRumbleFile; mRumbleFile = aRumbleFile;
ui->tableWidget_Properties->clear(); ui->tableWidget_Properties->clear();
const QString magic = aRumbleFile->contents.left(6); // const QString magic = aRumbleFile->contents.left(6);
if (magic != "RUMBLE") { // if (magic != "RUMBLE") {
qDebug() << "Rumble file has invalid magic: " << magic; // qDebug() << "Rumble file has invalid magic: " << magic;
return; // return;
} // }
int firstIndex = 0; // int firstIndex = 0;
int secondIndex = 0; // int secondIndex = 0;
int thirdIndex = 0; // int thirdIndex = 0;
int startIndex = 0; // int startIndex = 0;
for (int i = 0; i < aRumbleFile->contents.count("\\") / 2; i++) { // for (int i = 0; i < aRumbleFile->contents.count("\\") / 2; i++) {
ui->tableWidget_Properties->setRowCount(i + 1); // ui->tableWidget_Properties->setRowCount(i + 1);
ui->spinBox_Entries->setValue(i + 1); // ui->spinBox_Entries->setValue(i + 1);
firstIndex = aRumbleFile->contents.indexOf("\\", startIndex); // firstIndex = aRumbleFile->contents.indexOf("\\", startIndex);
secondIndex = aRumbleFile->contents.indexOf("\\", firstIndex + 1); // secondIndex = aRumbleFile->contents.indexOf("\\", firstIndex + 1);
thirdIndex = aRumbleFile->contents.indexOf("\\", secondIndex + 1); // thirdIndex = aRumbleFile->contents.indexOf("\\", secondIndex + 1);
if (thirdIndex == -1) { // if (thirdIndex == -1) {
thirdIndex = aRumbleFile->contents.size(); // thirdIndex = aRumbleFile->contents.size();
} // }
const QString keyStr = aRumbleFile->contents.mid(firstIndex + 1, secondIndex - firstIndex - 1); // const QString keyStr = aRumbleFile->contents.mid(firstIndex + 1, secondIndex - firstIndex - 1);
QTableWidgetItem *keyItem = new QTableWidgetItem(keyStr); // QTableWidgetItem *keyItem = new QTableWidgetItem(keyStr);
ui->tableWidget_Properties->setItem(i, 0, keyItem); // ui->tableWidget_Properties->setItem(i, 0, keyItem);
const QString valStr = aRumbleFile->contents.mid(secondIndex + 1, thirdIndex - secondIndex - 1); // const QString valStr = aRumbleFile->contents.mid(secondIndex + 1, thirdIndex - secondIndex - 1);
QTableWidgetItem *valueItem = new QTableWidgetItem(valStr); // QTableWidgetItem *valueItem = new QTableWidgetItem(valStr);
ui->tableWidget_Properties->setItem(i, 1, valueItem); // ui->tableWidget_Properties->setItem(i, 1, valueItem);
startIndex = thirdIndex; // startIndex = thirdIndex;
} // }
} }

View File

@ -1,8 +1,8 @@
#ifndef RUMBLEFILEVIEWER_H #ifndef RUMBLEFILEVIEWER_H
#define RUMBLEFILEVIEWER_H #define RUMBLEFILEVIEWER_H
#include "asset_structs.h" #include "xrawfile.h"
#include "zonefile.h"
#include <QWidget> #include <QWidget>
namespace Ui { namespace Ui {
@ -17,12 +17,12 @@ public:
explicit RumbleFileViewer(QWidget *parent = nullptr); explicit RumbleFileViewer(QWidget *parent = nullptr);
~RumbleFileViewer(); ~RumbleFileViewer();
void SetRumbleFile(std::shared_ptr<RawFile> aRumbleFile); void SetRumbleFile(XRawFile* aRumbleFile);
private: private:
Ui::RumbleFileViewer *ui; Ui::RumbleFileViewer *ui;
quint32 mPropertyCount; quint32 mPropertyCount;
std::shared_ptr<RawFile> mRumbleFile; XRawFile* mRumbleFile;
}; };
#endif // RUMBLEFILEVIEWER_H #endif // RUMBLEFILEVIEWER_H

View File

@ -19,10 +19,10 @@ RumbleGraphViewer::~RumbleGraphViewer() {
delete ui; delete ui;
} }
void RumbleGraphViewer::SetRumbleGraphFile(const std::shared_ptr<RawFile> aRawFile) { void RumbleGraphViewer::SetRumbleGraphFile(const XRawFile* aRawFile) {
mRumbleGraphFile = aRawFile; mRumbleGraphFile = aRawFile;
QDataStream rawFileStream(mRumbleGraphFile->contents.toLatin1()); QDataStream rawFileStream;//(mRumbleGraphFile->contents.toLatin1());
QByteArray magic(15, Qt::Uninitialized); QByteArray magic(15, Qt::Uninitialized);
rawFileStream.readRawData(magic.data(), 15); rawFileStream.readRawData(magic.data(), 15);

View File

@ -1,7 +1,7 @@
#ifndef RUMBLEGRAPHVIEWER_H #ifndef RUMBLEGRAPHVIEWER_H
#define RUMBLEGRAPHVIEWER_H #define RUMBLEGRAPHVIEWER_H
#include "asset_structs.h" #include "xrawfile.h"
#include "zonefile.h" #include "zonefile.h"
#include <QWidget> #include <QWidget>
@ -18,13 +18,13 @@ public:
~RumbleGraphViewer(); ~RumbleGraphViewer();
void SetEntryCount(quint32 aCount); void SetEntryCount(quint32 aCount);
void SetRumbleGraphFile(const std::shared_ptr<RawFile> aRawFile); void SetRumbleGraphFile(const XRawFile *aRawFile);
void SetZoneFile(std::shared_ptr<ZoneFile> aZoneFile); void SetZoneFile(ZoneFile* aZoneFile);
private: private:
Ui::RumbleGraphViewer *ui; Ui::RumbleGraphViewer *ui;
quint32 mEntryCount; quint32 mEntryCount;
std::shared_ptr<RawFile> mRumbleGraphFile; const XRawFile* mRumbleGraphFile;
}; };
#endif // RUMBLEGRAPHVIEWER_H #endif // RUMBLEGRAPHVIEWER_H

View File

@ -61,17 +61,17 @@ SoundViewer::~SoundViewer()
delete ui; delete ui;
} }
void SoundViewer::SetSound(std::shared_ptr<Sound> aSound) // void SoundViewer::SetSound(std::shared_ptr<Sound> aSound)
{ // {
buffer->setData(aSound->data); // buffer->setData(aSound->data);
if (!buffer->open(QIODevice::ReadOnly)) { // if (!buffer->open(QIODevice::ReadOnly)) {
qWarning() << "Failed to open QBuffer."; // qWarning() << "Failed to open QBuffer.";
return; // return;
} // }
ui->groupBox->setTitle(aSound->path); // ui->groupBox->setTitle(aSound->path);
player->setSourceDevice(buffer); // player->setSourceDevice(buffer);
} // }
void SoundViewer::SetOutput(QAudioOutput *aOutput) { void SoundViewer::SetOutput(QAudioOutput *aOutput) {
if (!aOutput) { return; } if (!aOutput) { return; }

View File

@ -1,8 +1,6 @@
#ifndef SOUNDVIEWER_H #ifndef SOUNDVIEWER_H
#define SOUNDVIEWER_H #define SOUNDVIEWER_H
#include "asset_structs.h"
#include <QWidget> #include <QWidget>
#include <QMediaPlayer> #include <QMediaPlayer>
#include <QBuffer> #include <QBuffer>
@ -22,7 +20,7 @@ public:
explicit SoundViewer(QWidget *parent = nullptr); explicit SoundViewer(QWidget *parent = nullptr);
~SoundViewer(); ~SoundViewer();
void SetSound(std::shared_ptr<Sound> aSound); //void SetSound(std::shared_ptr<Sound> aSound);
void SetOutput(QAudioOutput *aOutput); void SetOutput(QAudioOutput *aOutput);
private: private:

View File

@ -13,22 +13,21 @@ StringTableViewer::~StringTableViewer()
delete ui; delete ui;
} }
void StringTableViewer::SetStringTable(std::shared_ptr<StringTable> aStringTable) { void StringTableViewer::SetStringTable(const XStringTable *aStringTable) {
ui->tableWidget_Strings->clear(); ui->tableWidget_Strings->clear();
ui->tableWidget_Strings->setRowCount(aStringTable->rowCount); ui->tableWidget_Strings->setRowCount(aStringTable->GetRowCount());
ui->tableWidget_Strings->setColumnCount(aStringTable->columnCount); ui->tableWidget_Strings->setColumnCount(aStringTable->GetColumnCount());
int currentIndex = 0; int currentIndex = 0;
for (const QString &key : aStringTable->content.keys()) { for (auto value : *aStringTable->GetValues()) {
const QString value = aStringTable->content[key];
QTableWidgetItem *tableKeyItem = new QTableWidgetItem(); QTableWidgetItem *tableKeyItem = new QTableWidgetItem();
tableKeyItem->setText(key); tableKeyItem->setText(value->GetName());
ui->tableWidget_Strings->setItem(currentIndex, 0, tableKeyItem); ui->tableWidget_Strings->setItem(currentIndex, 0, tableKeyItem);
QTableWidgetItem *tableValItem = new QTableWidgetItem(); QTableWidgetItem *tableValItem = new QTableWidgetItem();
tableValItem->setText(value); tableValItem->setText(value->GetString());
ui->tableWidget_Strings->setItem(currentIndex, 1, tableValItem); ui->tableWidget_Strings->setItem(currentIndex, 1, tableValItem);
currentIndex++; currentIndex++;

View File

@ -1,7 +1,8 @@
#ifndef STRINGTABLEVIEWER_H #ifndef STRINGTABLEVIEWER_H
#define STRINGTABLEVIEWER_H #define STRINGTABLEVIEWER_H
#include "asset_structs.h" #include "xstringtable.h"
#include <QWidget> #include <QWidget>
namespace Ui { namespace Ui {
@ -16,7 +17,7 @@ public:
explicit StringTableViewer(QWidget *parent = nullptr); explicit StringTableViewer(QWidget *parent = nullptr);
~StringTableViewer(); ~StringTableViewer();
void SetStringTable(std::shared_ptr<StringTable> aStringTable); void SetStringTable(const XStringTable *aStringTable);
private: private:
Ui::StringTableViewer *ui; Ui::StringTableViewer *ui;

View File

@ -13,13 +13,13 @@ TechSetViewer::~TechSetViewer()
delete ui; delete ui;
} }
void TechSetViewer::SetTechSet(std::shared_ptr<TechSet> aTechSet) { void TechSetViewer::SetTechSet(const XMaterialTechniqueSet* aTechSet) {
ui->listWidget_Ptrs->clear(); //ui->listWidget_Ptrs->clear();
ui->label_Title->setText(aTechSet->name); ui->label_Title->setText(aTechSet->GetName());
int ptrIndex = 1; // int ptrIndex = 1;
for (auto ptr : aTechSet->pointers) { //for (auto ptr : aTechSet->pointers) {
ui->listWidget_Ptrs->addItem(QString("Pointer %1: %2").arg(ptrIndex).arg(ptr)); // ui->listWidget_Ptrs->addItem(QString("Pointer %1: %2").arg(ptrIndex).arg(ptr));
ptrIndex++; // ptrIndex++;
} //}
} }

View File

@ -1,7 +1,8 @@
#ifndef TECHSETVIEWER_H #ifndef TECHSETVIEWER_H
#define TECHSETVIEWER_H #define TECHSETVIEWER_H
#include "asset_structs.h" #include "xmaterialtechniqueset.h"
#include <QWidget> #include <QWidget>
namespace Ui { namespace Ui {
@ -16,7 +17,7 @@ public:
explicit TechSetViewer(QWidget *parent = nullptr); explicit TechSetViewer(QWidget *parent = nullptr);
~TechSetViewer(); ~TechSetViewer();
void SetTechSet(std::shared_ptr<TechSet> aTechSet); void SetTechSet(const XMaterialTechniqueSet *aTechSet);
private: private:
Ui::TechSetViewer *ui; Ui::TechSetViewer *ui;

View File

@ -6,14 +6,14 @@
<rect> <rect>
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>961</width> <width>880</width>
<height>756</height> <height>559</height>
</rect> </rect>
</property> </property>
<property name="windowTitle"> <property name="windowTitle">
<string>Form</string> <string>Form</string>
</property> </property>
<layout class="QVBoxLayout" name="verticalLayout_2"> <layout class="QVBoxLayout" name="verticalLayout_3">
<item> <item>
<widget class="QLabel" name="label_Title"> <widget class="QLabel" name="label_Title">
<property name="font"> <property name="font">
@ -29,46 +29,120 @@
</widget> </widget>
</item> </item>
<item> <item>
<layout class="QHBoxLayout" name="horizontalLayout"> <layout class="QHBoxLayout" name="horizontalLayout_7">
<item> <item>
<widget class="QGroupBox" name="groupBox"> <widget class="QGroupBox" name="groupBox">
<property name="title"> <property name="title">
<string>Unknown Pointers:</string> <string>Set Parameters</string>
</property> </property>
<layout class="QVBoxLayout" name="verticalLayout"> <layout class="QVBoxLayout" name="verticalLayout">
<item> <item>
<widget class="QListWidget" name="listWidget_Ptrs"/> <layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QLabel" name="label">
<property name="text">
<string>Name:</string>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="lineEdit_Name">
<property name="placeholderText">
<string>Technique set name</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_2">
<item>
<widget class="QLabel" name="label_2">
<property name="text">
<string>World Vertex Format:</string>
</property>
</widget>
</item>
<item>
<widget class="QSpinBox" name="spinBox_WorldVertFormat"/>
</item>
</layout>
</item>
<item>
<widget class="QListWidget" name="listWidget_Techniques"/>
</item> </item>
</layout> </layout>
</widget> </widget>
</item> </item>
<item> <item>
<spacer name="horizontalSpacer"> <widget class="QGroupBox" name="groupBox_2">
<property name="orientation"> <property name="title">
<enum>Qt::Orientation::Horizontal</enum> <string>Current Technique</string>
</property> </property>
<property name="sizeHint" stdset="0"> <layout class="QVBoxLayout" name="verticalLayout_2">
<size> <item>
<width>40</width> <layout class="QHBoxLayout" name="horizontalLayout_4">
<height>20</height> <item>
</size> <widget class="QLabel" name="label_4">
<property name="text">
<string>Name:</string>
</property> </property>
</spacer> </widget>
</item>
<item>
<widget class="QLineEdit" name="lineEdit_TechniqueName">
<property name="placeholderText">
<string>Technique set name</string>
</property>
</widget>
</item> </item>
</layout> </layout>
</item> </item>
<item> <item>
<spacer name="verticalSpacer"> <layout class="QHBoxLayout" name="horizontalLayout_5">
<property name="orientation"> <item>
<enum>Qt::Orientation::Vertical</enum> <widget class="QLabel" name="label_5">
<property name="text">
<string>Flags:</string>
</property> </property>
<property name="sizeHint" stdset="0"> </widget>
<size> </item>
<width>20</width> <item>
<height>363</height> <widget class="QSpinBox" name="spinBox_Flags"/>
</size> </item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_6">
<item>
<widget class="QLabel" name="label_6">
<property name="text">
<string>Pass Count:</string>
</property> </property>
</spacer> </widget>
</item>
<item>
<widget class="QSpinBox" name="spinBox_PassCount"/>
</item>
</layout>
</item>
<item>
<widget class="QGroupBox" name="groupBox_3">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="MinimumExpanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="title">
<string>Material Pass</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
</layout>
</item> </item>
</layout> </layout>
</widget> </widget>

View File

@ -5,10 +5,10 @@
XTreeWidget::XTreeWidget(QWidget *parent) XTreeWidget::XTreeWidget(QWidget *parent)
: QTreeWidget(parent) { : QTreeWidget(parent) {
mFastFiles = QMap<QString, std::shared_ptr<FastFile>>(); mFastFiles = QMap<QString, const FastFile*>();
mZoneFiles = QMap<QString, std::shared_ptr<ZoneFile>>(); mZoneFiles = QMap<QString, const ZoneFile*>();
mDDSFiles = QMap<QString, std::shared_ptr<DDSFile>>(); mDDSFiles = QMap<QString, const DDSFile*>();
mIWIFiles = QMap<QString, std::shared_ptr<IWIFile>>(); mIWIFiles = QMap<QString, const IWIFile*>();
setContextMenuPolicy(Qt::CustomContextMenu); setContextMenuPolicy(Qt::CustomContextMenu);
setSelectionMode(QTreeWidget::SingleSelection); setSelectionMode(QTreeWidget::SingleSelection);
@ -37,7 +37,7 @@ XTreeWidget::~XTreeWidget() {
} }
void XTreeWidget::AddFastFile(std::shared_ptr<FastFile> aFastFile) { void XTreeWidget::AddFastFile(FastFile* aFastFile) {
XTreeWidgetItem *fastFileItem = new XTreeWidgetItem(this); XTreeWidgetItem *fastFileItem = new XTreeWidgetItem(this);
fastFileItem->setText(0, aFastFile->GetStem()); fastFileItem->setText(0, aFastFile->GetStem());
fastFileItem->setIcon(0, Utils::CreateAssetIcon("FF")); fastFileItem->setIcon(0, Utils::CreateAssetIcon("FF"));
@ -83,211 +83,189 @@ void XTreeWidget::AddFastFile(std::shared_ptr<FastFile> aFastFile) {
sortByColumn(0, Qt::AscendingOrder); sortByColumn(0, Qt::AscendingOrder);
} }
void XTreeWidget::AddZoneFile(std::shared_ptr<ZoneFile> aZoneFile, XTreeWidgetItem *aParentItem) { void XTreeWidget::AddZoneFile(const ZoneFile* aZoneFile, XTreeWidgetItem *aParentItem) {
XTreeWidgetItem *zoneItem; XTreeWidgetItem *zoneItem;
if (aParentItem != nullptr) { if (aParentItem != nullptr) {
zoneItem = new XTreeWidgetItem(aParentItem); zoneItem = new XTreeWidgetItem(aParentItem);
} else { } else {
zoneItem = new XTreeWidgetItem(this); zoneItem = new XTreeWidgetItem(this);
} }
zoneItem->setIcon(0, ZoneFile::AssetTypeToIcon(ASSET_ZONE_FILE)); zoneItem->setIcon(0, Utils::CreateAssetIcon("ZF"));
zoneItem->setText(0, aZoneFile->GetBaseStem() + ".zone"); zoneItem->setText(0, aZoneFile->GetBaseStem() + ".zone");
auto assetMap = aZoneFile->GetAssetMap(); XAssetList assetList = aZoneFile->GetAssetList();
QVector<XAsset*> localizeEntries;
if (!assetMap.localStrings.isEmpty()) { for (int i = 0; i < assetList.Size(); i++)
QIcon localStrIcon = ZoneFile::AssetTypeToIcon(ASSET_LOCAL_STRING); {
XAsset *currentAsset = assetList.GetAsset(i);
XTreeWidgetItem *localStrRoot = new XTreeWidgetItem(zoneItem); if (currentAsset->GetType() == ASSET_TYPE_LOCALIZE_ENTRY)
localStrRoot->setText(0, "String Files"); {
localStrRoot->setIcon(0, localStrIcon); localizeEntries.append(currentAsset);
localStrRoot->SetCategory(CATEGORY_TYPE); } else if (currentAsset->GetType() == ASSET_TYPE_LOCALIZE_ENTRY)
{
XTreeWidgetItem *localStrItem = new XTreeWidgetItem(localStrRoot); localizeEntries.append(currentAsset);
localStrItem->setText(0, aZoneFile->GetStem().section('.', 0, 0) + ".str");
localStrItem->setIcon(0, localStrIcon);
}
if (!assetMap.techSets.isEmpty()) {
QIcon techSetIcon = ZoneFile::AssetTypeToIcon(ASSET_TECH_SET);
XTreeWidgetItem *techSetRoot = new XTreeWidgetItem(zoneItem);
techSetRoot->setText(0, "Tech Sets");
techSetRoot->setIcon(0, techSetIcon);
techSetRoot->SetCategory(CATEGORY_TYPE);
for (TechSet techSet : assetMap.techSets) {
XTreeWidgetItem *techSetItem = new XTreeWidgetItem(techSetRoot);
techSetItem->setText(0, techSet.name);
techSetItem->setIcon(0, techSetIcon);
} }
} }
if (!assetMap.rawFiles.isEmpty()) {
QIcon rawFileIcon = ZoneFile::AssetTypeToIcon(ASSET_RAW_FILE);
XTreeWidgetItem *rawFileRoot = new XTreeWidgetItem(zoneItem); // if (!assetMap.localizeEntries.isEmpty()) {
rawFileRoot->setText(0, "Raw Files"); // QIcon localStrIcon = Utils::CreateAssetIcon(ASSET_TYPE_LOCALIZE_ENTRY);
rawFileRoot->setIcon(0, rawFileIcon);
rawFileRoot->SetCategory(CATEGORY_TYPE);
for (RawFile rawFile : assetMap.rawFiles) {
if (!rawFile.length) { continue; }
XTreeWidgetItem *tempItem = rawFileRoot; // XTreeWidgetItem *localStrRoot = new XTreeWidgetItem(zoneItem);
const QStringList pathParts = rawFile.path.split('/'); // localStrRoot->setText(0, "String Files");
for (const QString &pathPart : pathParts) { // localStrRoot->setIcon(0, localStrIcon);
bool childFound = false; // localStrRoot->SetCategory(CATEGORY_TYPE);
for (int i = 0; i < tempItem->childCount(); i++) {
QTreeWidgetItem *rawChildItem = tempItem->child(i);
XTreeWidgetItem *childItem = dynamic_cast<XTreeWidgetItem*>(rawChildItem);
if (childItem->text(0) == pathPart) {
tempItem = childItem;
childFound = true; // XTreeWidgetItem *localStrItem = new XTreeWidgetItem(localStrRoot);
break; // localStrItem->setText(0, aZoneFile->GetStem().section('.', 0, 0) + ".str");
} // localStrItem->setIcon(0, localStrIcon);
} // }
const QString rawFileStr = QString("%1 [%2-%3]").arg(pathPart).arg(rawFile.startPos).arg(rawFile.endPos); // if (!assetMap.techSets.isEmpty()) {
//rawFileStr = pathPart; // QIcon techSetIcon = Utils::CreateAssetIcon(ASSET_TYPE_TECHNIQUE_SET);
if (pathPart == pathParts.last()) {
XTreeWidgetItem *rawFileItem = new XTreeWidgetItem(tempItem);
rawFileItem->setText(0, rawFileStr);
tempItem = rawFileItem; // XTreeWidgetItem *techSetRoot = new XTreeWidgetItem(zoneItem);
} else if (!childFound) { // techSetRoot->setText(0, "Tech Sets");
tempItem = new XTreeWidgetItem(tempItem); // techSetRoot->setIcon(0, techSetIcon);
tempItem->setText(0, rawFileStr); // techSetRoot->SetCategory(CATEGORY_TYPE);
}
} // for (auto techSet : assetMap.techSets) {
tempItem->setIcon(0, rawFileIcon); // XTreeWidgetItem *techSetItem = new XTreeWidgetItem(techSetRoot);
} // techSetItem->setText(0, techSet.name);
} // techSetItem->setIcon(0, techSetIcon);
// }
// }
if (!assetMap.menuFiles.isEmpty()) { // if (!assetMap.rawFiles.isEmpty()) {
QIcon menuFileIcon = ZoneFile::AssetTypeToIcon(ASSET_MENU); // QIcon rawFileIcon = Utils::CreateAssetIcon(ASSET_TYPE_RAWFILE);
XTreeWidgetItem *menuRoot = new XTreeWidgetItem(zoneItem); // XTreeWidgetItem *rawFileRoot = new XTreeWidgetItem(zoneItem);
menuRoot->setText(0, "Menu Files"); // rawFileRoot->setText(0, "Raw Files");
menuRoot->setIcon(0, menuFileIcon); // rawFileRoot->setIcon(0, rawFileIcon);
menuRoot->SetCategory(CATEGORY_TYPE); // rawFileRoot->SetCategory(CATEGORY_TYPE);
// for (auto rawFile : assetMap.rawFiles) {
// if (!rawFile.length) { continue; }
int menuIndex = 1; // XTreeWidgetItem *tempItem = rawFileRoot;
for (MenuFile menuFile : assetMap.menuFiles) { // // const QStringList pathParts = rawFile->path.split('/');
XTreeWidgetItem *menuFileRoot = new XTreeWidgetItem(menuRoot); // // for (const QString &pathPart : pathParts) {
menuFileRoot->setText(0, QString("Menu %1").arg(menuIndex)); // // bool childFound = false;
for (Menu menu : menuFile.menuDefs) { // // for (int i = 0; i < tempItem->childCount(); i++) {
XTreeWidgetItem *menuItem = new XTreeWidgetItem(menuFileRoot); // // QTreeWidgetItem *rawChildItem = tempItem->child(i);
menuItem->setText(0, menu.filePath); // // XTreeWidgetItem *childItem = dynamic_cast<XTreeWidgetItem*>(rawChildItem);
menuItem->setIcon(0, menuFileIcon); // // if (childItem->text(0) == pathPart) {
} // // tempItem = childItem;
menuIndex++;
}
}
if (!assetMap.images.isEmpty()) { // // childFound = true;
QIcon imageIcon = ZoneFile::AssetTypeToIcon(ASSET_IMAGE); // // break;
// // }
// // }
XTreeWidgetItem *imageRoot = new XTreeWidgetItem(zoneItem); // // const QString rawFileStr = pathPart;// = QString("%1 [%2-%3]").arg(pathPart).arg(rawFile.startPos).arg(rawFile.endPos);
imageRoot->setText(0, "Images"); // // if (pathPart == pathParts.last()) {
imageRoot->setIcon(0, imageIcon); // // XTreeWidgetItem *rawFileItem = new XTreeWidgetItem(tempItem);
imageRoot->SetCategory(CATEGORY_TYPE); // // rawFileItem->setText(0, rawFileStr);
for (Image image : assetMap.images) { // // tempItem = rawFileItem;
XTreeWidgetItem *imageItem = new XTreeWidgetItem(imageRoot); // // } else if (!childFound) {
imageItem->setText(0, image.materialName); // // tempItem = new XTreeWidgetItem(tempItem);
imageItem->setIcon(0, imageIcon); // // tempItem->setText(0, rawFileStr);
} // // }
}
if (!assetMap.models.isEmpty()) { // // }
QIcon modelIcon = ZoneFile::AssetTypeToIcon(ASSET_MODEL); // tempItem->setIcon(0, rawFileIcon);
// }
// }
XTreeWidgetItem *modelsRoot = new XTreeWidgetItem(zoneItem); // if (!assetMap.menuDefinitions.isEmpty()) {
modelsRoot->setText(0, "Models"); // // QIcon MenuDefIcon = Utils::CreateAssetIcon(ASSET_TYPE_MENU);
modelsRoot->setIcon(0, modelIcon);
modelsRoot->SetCategory(CATEGORY_TYPE);
for (Model model: assetMap.models) { // // XTreeWidgetItem *menuRoot = new XTreeWidgetItem(zoneItem);
XTreeWidgetItem *modelItem = new XTreeWidgetItem(modelsRoot); // // menuRoot->setText(0, "Menu Files");
modelItem->setText(0, model.modelName); // // menuRoot->setIcon(0, MenuDefIcon);
modelItem->setIcon(0, modelIcon); // // menuRoot->SetCategory(CATEGORY_TYPE);
}
}
if (!assetMap.materials.isEmpty()) { // // int menuIndex = 1;
QIcon materialIcon = ZoneFile::AssetTypeToIcon(ASSET_MATERIAL); // // for (MenuDef menuDef : assetMap.menuDefinitions) {
// // XTreeWidgetItem *MenuDefRoot = new XTreeWidgetItem(menuRoot);
// // MenuDefRoot->setText(0, QString("Menu %1").arg(menuIndex));
// // for (Menu menu : menuDef.men) {
// // XTreeWidgetItem *menuItem = new XTreeWidgetItem(MenuDefRoot);
// // menuItem->setText(0, menu.filePath);
// // menuItem->setIcon(0, MenuDefIcon);
// // }
// // menuIndex++;
// // }
// }
XTreeWidgetItem *materialsRoot = new XTreeWidgetItem(zoneItem); // if (!assetMap.images.isEmpty()) {
materialsRoot->setText(0, "Materials"); // // QIcon imageIcon = Utils::CreateAssetIcon(ASSET_TYPE_IMAGE);
materialsRoot->setIcon(0, materialIcon);
materialsRoot->SetCategory(CATEGORY_TYPE);
for (Material material: assetMap.materials) { // // XTreeWidgetItem *imageRoot = new XTreeWidgetItem(zoneItem);
XTreeWidgetItem *materialItem = new XTreeWidgetItem(materialsRoot); // // imageRoot->setText(0, "Images");
materialItem->setText(0, material.name); // // imageRoot->setIcon(0, imageIcon);
materialItem->setIcon(0, materialIcon); // // imageRoot->SetCategory(CATEGORY_TYPE);
}
}
if (!assetMap.stringTables.isEmpty()) { // // for (Image image : assetMap.images) {
QIcon stringTableIcon = ZoneFile::AssetTypeToIcon(ASSET_STRING_TABLE); // // XTreeWidgetItem *imageItem = new XTreeWidgetItem(imageRoot);
// // imageItem->setText(0, image.materialName);
// // imageItem->setIcon(0, imageIcon);
// // }
// }
XTreeWidgetItem *strTableRoot = new XTreeWidgetItem(zoneItem); // if (!assetMap.models.isEmpty()) {
strTableRoot->setText(0, "String Tables"); // QIcon modelIcon = Utils::CreateAssetIcon(ASSET_TYPE_XMODEL);
strTableRoot->setIcon(0, stringTableIcon);
strTableRoot->SetCategory(CATEGORY_TYPE);
for (StringTable strTable: assetMap.stringTables) { // XTreeWidgetItem *modelsRoot = new XTreeWidgetItem(zoneItem);
XTreeWidgetItem *modelItem = new XTreeWidgetItem(strTableRoot); // modelsRoot->setText(0, "Models");
modelItem->setText(0, strTable.name); // modelsRoot->setIcon(0, modelIcon);
modelItem->setIcon(0, stringTableIcon); // modelsRoot->SetCategory(CATEGORY_TYPE);
}
}
if (!assetMap.sounds.isEmpty()) { // for (auto model: assetMap.models) {
QIcon soundIcon = ZoneFile::AssetTypeToIcon(ASSET_SOUND); // XTreeWidgetItem *modelItem = new XTreeWidgetItem(modelsRoot);
// modelItem->setText(0, model.name);
// modelItem->setIcon(0, modelIcon);
// }
// }
XTreeWidgetItem *soundsRoot = new XTreeWidgetItem(zoneItem); // if (!assetMap.materials.isEmpty()) {
soundsRoot->setText(0, "Sounds"); // QIcon materialIcon = Utils::CreateAssetIcon(ASSET_TYPE_MATERIAL);
soundsRoot->setIcon(0, soundIcon);
soundsRoot->SetCategory(CATEGORY_TYPE);
for (SoundAsset soundAsset : assetMap.sounds) {
for (Sound sound : soundAsset.sounds) {
XTreeWidgetItem *tempItem = soundsRoot;
if (!sound.dataLength) { continue; } // XTreeWidgetItem *materialsRoot = new XTreeWidgetItem(zoneItem);
// materialsRoot->setText(0, "Materials");
// materialsRoot->setIcon(0, materialIcon);
// materialsRoot->SetCategory(CATEGORY_TYPE);
for (const QString &pathPart : sound.path.split('/')) { // for (auto material: assetMap.materials) {
if (pathPart.isEmpty()) { continue; } // XTreeWidgetItem *materialItem = new XTreeWidgetItem(materialsRoot);
// //materialItem->setText(0, material.name);
// materialItem->setIcon(0, materialIcon);
// }
// }
bool childFound = false; // if (!assetMap.stringTables.isEmpty()) {
for (int i = 0; i < tempItem->childCount(); i++) { // QIcon stringTableIcon = Utils::CreateAssetIcon(ASSET_TYPE_STRINGTABLE);
XTreeWidgetItem *childItem = dynamic_cast<XTreeWidgetItem*>(tempItem->child(i));
if (childItem->text(0) == pathPart) {
tempItem = childItem;
childFound = true; // XTreeWidgetItem *strTableRoot = new XTreeWidgetItem(zoneItem);
break; // strTableRoot->setText(0, "String Tables");
} // strTableRoot->setIcon(0, stringTableIcon);
} // strTableRoot->SetCategory(CATEGORY_TYPE);
if (pathPart.contains(".wav")) { // for (auto strTable: assetMap.stringTables) {
XTreeWidgetItem *soundItem = new XTreeWidgetItem(tempItem); // XTreeWidgetItem *modelItem = new XTreeWidgetItem(strTableRoot);
soundItem->setText(0, pathPart); // modelItem->setText(0, strTable.name);
// modelItem->setIcon(0, stringTableIcon);
// }
// }
tempItem = soundItem; // if (!assetMap.sounds.isEmpty()) {
} else if (!childFound) { // QIcon soundIcon = Utils::CreateAssetIcon(ASSET_TYPE_SOUND);
tempItem = new XTreeWidgetItem(tempItem);
tempItem->setText(0, pathPart);
}
} // XTreeWidgetItem *soundsRoot = new XTreeWidgetItem(zoneItem);
tempItem->setIcon(0, soundIcon); // soundsRoot->setText(0, "Sounds");
} // soundsRoot->setIcon(0, soundIcon);
} // soundsRoot->SetCategory(CATEGORY_TYPE);
} // }
mZoneFiles[aZoneFile->GetBaseStem() + ".zone"] = aZoneFile; mZoneFiles[aZoneFile->GetBaseStem() + ".zone"] = aZoneFile;
} }
@ -324,7 +302,7 @@ void XTreeWidget::PrepareContextMenu(const QPoint &pos) {
QMenu *exportSubmenu = new QMenu("Export...", this); QMenu *exportSubmenu = new QMenu("Export...", this);
contextMenu->addMenu(exportSubmenu); contextMenu->addMenu(exportSubmenu);
std::shared_ptr<DDSFile> ddsFile = mDDSFiles[fileStem]; const DDSFile* ddsFile = mDDSFiles[fileStem];
QAction *exportIWIAction = new QAction("Export as IWI"); QAction *exportIWIAction = new QAction("Export as IWI");
exportSubmenu->addAction(exportIWIAction); exportSubmenu->addAction(exportIWIAction);
@ -368,7 +346,7 @@ void XTreeWidget::PrepareContextMenu(const QPoint &pos) {
QMenu *exportSubmenu = new QMenu("Export...", this); QMenu *exportSubmenu = new QMenu("Export...", this);
contextMenu->addMenu(exportSubmenu); contextMenu->addMenu(exportSubmenu);
std::shared_ptr<IWIFile> iwiFile = mIWIFiles[fileStem]; const IWIFile* iwiFile = mIWIFiles[fileStem];
QAction *exportDDSAction = new QAction("Export as DDS"); QAction *exportDDSAction = new QAction("Export as DDS");
exportSubmenu->addAction(exportDDSAction); exportSubmenu->addAction(exportDDSAction);
@ -497,7 +475,7 @@ void XTreeWidget::PrepareContextMenu(const QPoint &pos) {
QMenu *exportSubmenu = new QMenu("Export...", this); QMenu *exportSubmenu = new QMenu("Export...", this);
contextMenu->addMenu(exportSubmenu); contextMenu->addMenu(exportSubmenu);
std::shared_ptr<FastFile> fastFile = mFastFiles[fileStem]; const FastFile* fastFile = mFastFiles[fileStem];
QAction *exportFastFileAction = new QAction("Export Fast File"); QAction *exportFastFileAction = new QAction("Export Fast File");
exportSubmenu->addAction(exportFastFileAction); exportSubmenu->addAction(exportFastFileAction);
@ -518,7 +496,7 @@ void XTreeWidget::PrepareContextMenu(const QPoint &pos) {
const QString zoneFilePath = QFileDialog::getSaveFileName( const QString zoneFilePath = QFileDialog::getSaveFileName(
nullptr, "Export Zone File...", QDir::currentPath(), nullptr, "Export Zone File...", QDir::currentPath(),
"Zone File (*.zone);;All Files(*.*)"); "Zone File (*.zone);;All Files(*.*)");
fastFile->GetZoneFile()->SaveZoneFile(zoneFilePath); //fastFile->GetZoneFile()->SaveZoneFile(zoneFilePath);
}); });
} else if (activeText.contains(".zone")) { } else if (activeText.contains(".zone")) {
const QString fileStem = activeText; const QString fileStem = activeText;
@ -530,7 +508,7 @@ void XTreeWidget::PrepareContextMenu(const QPoint &pos) {
QMenu *exportSubmenu = new QMenu("Export...", this); QMenu *exportSubmenu = new QMenu("Export...", this);
contextMenu->addMenu(exportSubmenu); contextMenu->addMenu(exportSubmenu);
std::shared_ptr<ZoneFile> zoneFile = mZoneFiles[fileStem]; const ZoneFile* zoneFile = mZoneFiles[fileStem];
QAction *exportZoneFileAction = new QAction("Export Zone File"); QAction *exportZoneFileAction = new QAction("Export Zone File");
exportSubmenu->addAction(exportZoneFileAction); exportSubmenu->addAction(exportZoneFileAction);
@ -553,40 +531,40 @@ void XTreeWidget::PrepareContextMenu(const QPoint &pos) {
} }
if (parentItem && parentItem != invisibleRootItem() && parentItem->text(0).contains(".zone")) { if (parentItem && parentItem != invisibleRootItem() && parentItem->text(0).contains(".zone")) {
const QString fileStem = parentItem->text(0).section('.', 0, 0); const QString fileStem = parentItem->text(0).section('.', 0, 0);
QVector<SoundAsset> soundAssets = mZoneFiles[fileStem]->GetAssetMap().sounds; // QVector<LoadedSound> LoadedSounds = mZoneFiles[fileStem]->GetAssetMap().sounds;
for (SoundAsset soundAsset : soundAssets) { // for (LoadedSound LoadedSound : LoadedSounds) {
for (Sound sound : soundAsset.sounds) { // for (Sound sound : LoadedSound.sounds) {
if (sound.path.contains(activeText)) { // if (sound.path.contains(activeText)) {
QMenu *exportSubmenu = new QMenu("Export...", this); // QMenu *exportSubmenu = new QMenu("Export...", this);
contextMenu->addMenu(exportSubmenu); // contextMenu->addMenu(exportSubmenu);
QAction *exportWAVAction = new QAction("Export as WAV File"); // QAction *exportWAVAction = new QAction("Export as WAV File");
exportSubmenu->addAction(exportWAVAction); // exportSubmenu->addAction(exportWAVAction);
connect(exportWAVAction, &QAction::triggered, this, [sound](bool checked) { // connect(exportWAVAction, &QAction::triggered, this, [sound](bool checked) {
Q_UNUSED(checked); // Q_UNUSED(checked);
QDir dir = QDir::currentPath(); // QDir dir = QDir::currentPath();
if (!dir.exists("exports/")) { // if (!dir.exists("exports/")) {
dir.mkdir("exports/"); // dir.mkdir("exports/");
} // }
if (!dir.exists("exports/sounds/")) { // if (!dir.exists("exports/sounds/")) {
dir.mkdir("exports/sounds/"); // dir.mkdir("exports/sounds/");
} // }
const QString fileName = "exports/sounds/" + sound.path.split('/').last(); // const QString fileName = "exports/sounds/" + sound.path.split('/').last();
QFile wavFile(fileName); // QFile wavFile(fileName);
if (!wavFile.open(QIODevice::WriteOnly)) { // if (!wavFile.open(QIODevice::WriteOnly)) {
qDebug() << "Failed to write wav file!"; // qDebug() << "Failed to write wav file!";
return; // return;
} // }
wavFile.write(sound.data); // wavFile.write(sound.data);
wavFile.close(); // wavFile.close();
}); // });
break; // break;
} // }
} // }
} // }
} }
} else if (activeItem && activeText == "Sounds") { } else if (activeItem && activeText == "Sounds") {
XTreeWidgetItem *parentItem = dynamic_cast<XTreeWidgetItem*>(activeItem->parent()); XTreeWidgetItem *parentItem = dynamic_cast<XTreeWidgetItem*>(activeItem->parent());
@ -609,29 +587,29 @@ void XTreeWidget::PrepareContextMenu(const QPoint &pos) {
connect(exportAllWAVAction, &QAction::triggered, this, [zoneFile](bool checked) { connect(exportAllWAVAction, &QAction::triggered, this, [zoneFile](bool checked) {
Q_UNUSED(checked); Q_UNUSED(checked);
for (SoundAsset soundAsset : zoneFile->GetAssetMap().sounds) { // for (LoadedSound LoadedSound : zoneFile->GetAssetMap().sounds) {
for (Sound sound : soundAsset.sounds) { // for (Sound sound : LoadedSound.sounds) {
if (!sound.dataLength) { continue; } // if (!sound.dataLength) { continue; }
QDir dir = QDir::currentPath(); // QDir dir = QDir::currentPath();
if (!dir.exists("exports/")) { // if (!dir.exists("exports/")) {
dir.mkdir("exports/"); // dir.mkdir("exports/");
} // }
if (!dir.exists("exports/sounds/")) { // if (!dir.exists("exports/sounds/")) {
dir.mkdir("exports/sounds/"); // dir.mkdir("exports/sounds/");
} // }
const QString fileName = "exports/sounds/" + sound.path.split('/').last(); // const QString fileName = "exports/sounds/" + sound.path.split('/').last();
QFile wavFile(fileName); // QFile wavFile(fileName);
if (!wavFile.open(QIODevice::WriteOnly)) { // if (!wavFile.open(QIODevice::WriteOnly)) {
qDebug() << "Failed to write wav file!"; // qDebug() << "Failed to write wav file!";
return; // return;
} // }
wavFile.write(sound.data); // wavFile.write(sound.data);
wavFile.close(); // wavFile.close();
} // }
} // }
}); });
} }
} }
@ -653,20 +631,19 @@ void XTreeWidget::ItemSelectionChanged() {
XTreeWidgetItem *parentItem = dynamic_cast<XTreeWidgetItem*>(selectedItem->parent()); XTreeWidgetItem *parentItem = dynamic_cast<XTreeWidgetItem*>(selectedItem->parent());
if (selectedText.contains(".dds")) { /*if (selectedText.contains(".dds")) {
if (!mDDSFiles.contains(selectedText)) { if (!mDDSFiles.contains(selectedText)) {
LogManager::instance().addError("Could not find " + selectedText + " in DDS map!"); LogManager::instance().addError("Could not find " + selectedText + " in DDS map!");
return; return;
} }
std::shared_ptr<DDSFile> ddsFile = mDDSFiles[selectedText]; emit DDSFileSelected(mDDSFiles[selectedText], selectedText);
emit DDSFileSelected(ddsFile, selectedText);
} else if (selectedText.contains(".iwi")) { } else if (selectedText.contains(".iwi")) {
if (!mIWIFiles.contains(selectedText)) { if (!mIWIFiles.contains(selectedText)) {
LogManager::instance().addError("Could not find " + selectedText + " in IWI map!"); LogManager::instance().addError("Could not find " + selectedText + " in IWI map!");
return; return;
} }
emit IWIFileSelected(mIWIFiles[selectedText], selectedText); emit IWIFileSelected(mIWIFiles[selectedText], selectedText);
} else if (selectedText.contains(".ff")) { } else */if (selectedText.contains(".ff")) {
if (!mFastFiles.contains(selectedText)) { if (!mFastFiles.contains(selectedText)) {
LogManager::instance().addError("Could not find " + selectedText + " in Fast File map!"); LogManager::instance().addError("Could not find " + selectedText + " in Fast File map!");
return; return;
@ -688,34 +665,22 @@ void XTreeWidget::ItemSelectionChanged() {
XTreeWidgetItem *grandpaItem = dynamic_cast<XTreeWidgetItem*>(parentItem->parent()); XTreeWidgetItem *grandpaItem = dynamic_cast<XTreeWidgetItem*>(parentItem->parent());
if (grandpaItem && grandpaItem->text(0).contains(".zone")) { if (grandpaItem && grandpaItem->text(0).contains(".zone")) {
const QString fileStem = grandpaItem->text(0).section('.', 0, 0); const QString fileStem = grandpaItem->text(0).section('.', 0, 0);
QVector<Image> images = mZoneFiles[fileStem]->GetAssetMap().images; // QVector<Image> images = mZoneFiles[fileStem]->GetAssetMap().images;
for (Image image : images) { // for (Image image : images) {
if (image.materialName == selectedText) { // if (image.materialName == selectedText) {
emit ImageSelected(std::make_shared<Image>(image), fileStem); // emit ImageSelected(std::make_shared<Image>(image), fileStem);
break; // break;
// }
// }
} }
} } /*else if (parentItem && (parentItem->text(0) == "Tech Sets")) {
}
} else if (parentItem && (parentItem->text(0) == "Tech Sets")) {
XTreeWidgetItem *grandpaItem = dynamic_cast<XTreeWidgetItem*>(parentItem->parent()); XTreeWidgetItem *grandpaItem = dynamic_cast<XTreeWidgetItem*>(parentItem->parent());
if (grandpaItem && grandpaItem->text(0).contains(".zone")) { if (grandpaItem && grandpaItem->text(0).contains(".zone")) {
const QString fileStem = grandpaItem->text(0).section('.', 0, 0); const QString fileStem = grandpaItem->text(0).section('.', 0, 0);
auto techsets = mZoneFiles[fileStem]->GetAssetMap().techSets; auto techsets = mZoneFiles[fileStem]->GetAssetList().techSets;
for (auto techset : techsets) { for (auto techset : techsets) {
if (techset.name == selectedText) { if (techset.name == selectedText) {
emit TechSetSelected(std::make_shared<TechSet>(techset), fileStem); emit TechSetSelected(new MaterialTechSet(techset), fileStem);
break;
}
}
}
} else if (parentItem && (parentItem->text(0) == "Tech Sets")) {
XTreeWidgetItem *grandpaItem = dynamic_cast<XTreeWidgetItem*>(parentItem->parent());
if (grandpaItem && grandpaItem->text(0).contains(".zone")) {
const QString fileStem = grandpaItem->text(0).section('.', 0, 0);
auto techsets = mZoneFiles[fileStem]->GetAssetMap().techSets;
for (auto techset : techsets) {
if (techset.name == selectedText) {
emit TechSetSelected(std::make_shared<TechSet>(techset), fileStem);
break; break;
} }
} }
@ -724,12 +689,12 @@ void XTreeWidget::ItemSelectionChanged() {
XTreeWidgetItem *grandpaItem = dynamic_cast<XTreeWidgetItem*>(parentItem->parent()); XTreeWidgetItem *grandpaItem = dynamic_cast<XTreeWidgetItem*>(parentItem->parent());
if (grandpaItem && grandpaItem->text(0).contains(".zone")) { if (grandpaItem && grandpaItem->text(0).contains(".zone")) {
const QString fileStem = grandpaItem->text(0).section('.', 0, 0); const QString fileStem = grandpaItem->text(0).section('.', 0, 0);
QVector<Material> materials = mZoneFiles[fileStem]->GetAssetMap().materials; auto materials = mZoneFiles[fileStem]->GetAssetMap().materials;
for (Material material : materials) { for (auto material : materials) {
if (material.name == selectedText) { // if (material.name == selectedText) {
emit MaterialSelected(std::make_shared<Material>(material), fileStem); // emit MaterialSelected(std::make_shared<Material>(material), fileStem);
break; // break;
} // }
} }
} }
} else if (parentItem && selectedText.contains(".wav")) { } else if (parentItem && selectedText.contains(".wav")) {
@ -743,15 +708,15 @@ void XTreeWidget::ItemSelectionChanged() {
} }
if (grandpaItem && grandpaItem != invisibleRootItem() && grandpaItem->text(0).contains(".zone")) { if (grandpaItem && grandpaItem != invisibleRootItem() && grandpaItem->text(0).contains(".zone")) {
const QString fileStem = grandpaItem->text(0).section('.', 0, 0); const QString fileStem = grandpaItem->text(0).section('.', 0, 0);
QVector<SoundAsset> soundAssets = mZoneFiles[fileStem]->GetAssetMap().sounds; // QVector<LoadedSound> LoadedSounds = mZoneFiles[fileStem]->GetAssetMap().sounds;
for (SoundAsset soundAsset : soundAssets) { // for (LoadedSound LoadedSound : LoadedSounds) {
for (Sound sound : soundAsset.sounds) { // for (Sound sound : LoadedSound.sounds) {
if (sound.path.contains(selectedText)) { // if (sound.path.contains(selectedText)) {
emit SoundSelected(std::make_shared<Sound>(sound), fileStem); // emit SoundSelected(std::make_shared<Sound>(sound), fileStem);
break; // break;
} // }
} // }
} // }
} }
} else if (selectedItem->GetCategory() != CATEGORY_TYPE) { } else if (selectedItem->GetCategory() != CATEGORY_TYPE) {
XTreeWidgetItem *zoneRoot = selectedItem; XTreeWidgetItem *zoneRoot = selectedItem;
@ -772,17 +737,17 @@ void XTreeWidget::ItemSelectionChanged() {
return; return;
} }
QVector<RawFile> rawFiles = mZoneFiles[fileStem]->GetAssetMap().rawFiles; auto rawFiles = mZoneFiles[fileStem]->GetAssetMap().rawFiles;
for (RawFile rawFile : rawFiles) { for (auto rawFile : rawFiles) {
if (rawFile.path.split('/').last() == selectedText) { //if (rawFile->path.split('/').last() == selectedText) {
emit RawFileSelected(std::make_shared<RawFile>(rawFile), fileStem); // emit RawFileSelected(std::make_shared<RawFile>(rawFile), fileStem);
return; // return;
} //}
}
} }
}*/
} }
std::shared_ptr<ZoneFile> XTreeWidget::FindZoneFile(const QString aStem) { const ZoneFile* XTreeWidget::FindZoneFile(const QString aStem) {
foreach (auto zoneFile, mZoneFiles) { foreach (auto zoneFile, mZoneFiles) {
if (zoneFile->GetStem() == aStem) { if (zoneFile->GetStem() == aStem) {
return zoneFile; return zoneFile;
@ -791,7 +756,7 @@ std::shared_ptr<ZoneFile> XTreeWidget::FindZoneFile(const QString aStem) {
return nullptr; return nullptr;
} }
std::shared_ptr<FastFile> XTreeWidget::FindFastFile(const QString aStem) { const FastFile *XTreeWidget::FindFastFile(const QString aStem) {
foreach (auto fastFile, mFastFiles) { foreach (auto fastFile, mFastFiles) {
if (fastFile->GetStem() == aStem) { if (fastFile->GetStem() == aStem) {
return fastFile; return fastFile;
@ -808,7 +773,7 @@ bool XTreeWidget::HasFastFile(const QString aStem) {
return FindFastFile(aStem) != nullptr; return FindFastFile(aStem) != nullptr;
} }
void XTreeWidget::AddIWIFile(std::shared_ptr<IWIFile> aIWIFile) { void XTreeWidget::AddIWIFile(IWIFile* aIWIFile) {
const QString iwiFileName = QString(aIWIFile->fileStem + ".iwi"); const QString iwiFileName = QString(aIWIFile->fileStem + ".iwi");
for (int i = 0; i < invisibleRootItem()->childCount(); i++) { for (int i = 0; i < invisibleRootItem()->childCount(); i++) {
@ -819,12 +784,12 @@ void XTreeWidget::AddIWIFile(std::shared_ptr<IWIFile> aIWIFile) {
} }
XTreeWidgetItem *iwiItem = new XTreeWidgetItem(this); XTreeWidgetItem *iwiItem = new XTreeWidgetItem(this);
iwiItem->setIcon(0, ZoneFile::AssetTypeToIcon(ASSET_IMAGE)); iwiItem->setIcon(0, Utils::CreateAssetIcon(ASSET_TYPE_IMAGE));
iwiItem->setText(0, iwiFileName); iwiItem->setText(0, iwiFileName);
mIWIFiles[aIWIFile->fileStem.section(".", 0, 0)] = aIWIFile; mIWIFiles[aIWIFile->fileStem.section(".", 0, 0)] = aIWIFile;
} }
void XTreeWidget::AddDDSFile(std::shared_ptr<DDSFile> aDDSFile) { void XTreeWidget::AddDDSFile(DDSFile* aDDSFile) {
const QString ddsFileName = QString(aDDSFile->fileStem + ".dds"); const QString ddsFileName = QString(aDDSFile->fileStem + ".dds");
for (int i = 0; i < invisibleRootItem()->childCount(); i++) { for (int i = 0; i < invisibleRootItem()->childCount(); i++) {
@ -835,7 +800,7 @@ void XTreeWidget::AddDDSFile(std::shared_ptr<DDSFile> aDDSFile) {
} }
XTreeWidgetItem *ddsItem = new XTreeWidgetItem(this); XTreeWidgetItem *ddsItem = new XTreeWidgetItem(this);
ddsItem->setIcon(0, ZoneFile::AssetTypeToIcon(ASSET_IMAGE)); ddsItem->setIcon(0, Utils::CreateAssetIcon(ASSET_TYPE_IMAGE));
ddsItem->setText(0, ddsFileName); ddsItem->setText(0, ddsFileName);
mDDSFiles[aDDSFile->fileStem.section(".", 0, 0)] = aDDSFile; mDDSFiles[aDDSFile->fileStem.section(".", 0, 0)] = aDDSFile;
} }

View File

@ -2,13 +2,16 @@
#define XTREEWIDGET_H #define XTREEWIDGET_H
#include "d3dbsp_structs.h" #include "d3dbsp_structs.h"
#include "asset_structs.h"
#include "ddsfile.h" #include "ddsfile.h"
#include "iwifile.h" #include "iwifile.h"
#include "fastfile.h" #include "fastfile.h"
#include "xloadedsound.h"
#include "xtreewidgetitem.h" #include "xtreewidgetitem.h"
#include "zonefile.h" #include "zonefile.h"
#include "utils.h" #include "xrawfile.h"
#include "xgfximage.h"
#include "xstringtable.h"
#include "xmenudef.h"
#include <QTreeWidget> #include <QTreeWidget>
#include <QFileDialog> #include <QFileDialog>
@ -20,31 +23,31 @@ public:
explicit XTreeWidget(QWidget *parent = nullptr); explicit XTreeWidget(QWidget *parent = nullptr);
~XTreeWidget(); ~XTreeWidget();
void AddFastFile(std::shared_ptr<FastFile> aFastFile); void AddFastFile(FastFile* aFastFile);
void AddZoneFile(std::shared_ptr<ZoneFile> aZoneFile, XTreeWidgetItem *aParentItem = nullptr); void AddZoneFile(const ZoneFile *aZoneFile, XTreeWidgetItem *aParentItem = nullptr);
void AddIWIFile(std::shared_ptr<IWIFile> aIWIFile); void AddIWIFile(IWIFile* aIWIFile);
void AddDDSFile(std::shared_ptr<DDSFile> aDDSFile); void AddDDSFile(DDSFile* aDDSFile);
std::shared_ptr<ZoneFile> FindZoneFile(const QString aStem); const ZoneFile *FindZoneFile(const QString aStem);
std::shared_ptr<FastFile> FindFastFile(const QString aStem); const FastFile* FindFastFile(const QString aStem);
bool HasZoneFile(const QString aStem); bool HasZoneFile(const QString aStem);
bool HasFastFile(const QString aStem); bool HasFastFile(const QString aStem);
void CloseFastFile(const QString aFFName); void CloseFastFile(const QString aFFName);
signals: signals:
void DDSFileSelected(std::shared_ptr<DDSFile> aDDSFile, const QString aParentName); void DDSFileSelected(const DDSFile* aDDSFile, const QString aParentName);
void IWIFileSelected(std::shared_ptr<IWIFile> aIWIFile, const QString aParentName); void IWIFileSelected(const IWIFile* aIWIFile, const QString aParentName);
void FastFileSelected(std::shared_ptr<FastFile> aFastFile, const QString aParentName); void FastFileSelected(const FastFile* aFastFile, const QString aParentName);
void ZoneFileSelected(std::shared_ptr<ZoneFile> aZoneFile, const QString aParentName); void ZoneFileSelected(const ZoneFile* aZoneFile, const QString aParentName);
void LocalStringSelected(std::shared_ptr<ZoneFile> aZoneFile, const QString aParentName); void LocalStringSelected(const ZoneFile* aZoneFile, const QString aParentName);
void RawFileSelected(std::shared_ptr<RawFile> aRawFile, const QString aParentName); void RawFileSelected(const XRawFile* aRawFile, const QString aParentName);
void ImageSelected(std::shared_ptr<Image> aImage, const QString aParentName); void ImageSelected(const XGfxImage* aImage, const QString aParentName);
void TechSetSelected(std::shared_ptr<TechSet> aZoneFile, const QString aParentName); void TechSetSelected(const XMaterialTechniqueSet* aZoneFile, const QString aParentName);
void StrTableSelected(std::shared_ptr<StringTable> aStrTable, const QString aParentName); void StrTableSelected(const XStringTable* aStrTable, const QString aParentName);
void MenuSelected(std::shared_ptr<Menu> aMenu, const QString aParentName); void MenuSelected(const XMenuDef* aMenu, const QString aParentName);
void SoundSelected(std::shared_ptr<Sound> aSound, const QString aParentName); void SoundSelected(const XLoadedSound* aSound, const QString aParentName);
void MaterialSelected(std::shared_ptr<Material> aMaterial, const QString aParentName); void MaterialSelected(const XMaterial* aMaterial, const QString aParentName);
void ItemSelected(const QString itemText); void ItemSelected(const QString itemText);
void ItemClosed(const QString itemText); void ItemClosed(const QString itemText);
@ -55,10 +58,10 @@ protected:
void PrepareContextMenu(const QPoint &pos); void PrepareContextMenu(const QPoint &pos);
private: private:
QMap<QString, std::shared_ptr<FastFile>> mFastFiles; QMap<QString, const FastFile*> mFastFiles;
QMap<QString, std::shared_ptr<ZoneFile>> mZoneFiles; QMap<QString, const ZoneFile*> mZoneFiles;
QMap<QString, std::shared_ptr<DDSFile>> mDDSFiles; QMap<QString, const DDSFile*> mDDSFiles;
QMap<QString, std::shared_ptr<IWIFile>> mIWIFiles; QMap<QString, const IWIFile*> mIWIFiles;
}; };
#endif // XTREEWIDGET_H #endif // XTREEWIDGET_H

View File

@ -69,7 +69,7 @@ void ZoneFileViewer::SortTags(const QString &aSearchText) {
ui->listWidget_Tags->addItems(sortedTags); ui->listWidget_Tags->addItems(sortedTags);
} }
void ZoneFileViewer::SetZoneFile(std::shared_ptr<ZoneFile> aZoneFile) { void ZoneFileViewer::SetZoneFile(const ZoneFile* aZoneFile) {
mZoneFile = aZoneFile; mZoneFile = aZoneFile;
ui->tableWidget_RecordCounts->clearContents(); ui->tableWidget_RecordCounts->clearContents();
@ -88,37 +88,36 @@ void ZoneFileViewer::SetZoneFile(std::shared_ptr<ZoneFile> aZoneFile) {
ui->groupBox_Tags->show(); ui->groupBox_Tags->show();
} }
QMap<QString, int> recordCounts = QMap<QString, int>(); QMap<XAssetType, int> recordCounts = QMap<XAssetType, int>();
QVector<QPair<QString, int>> assetOccurances = QVector<QPair<QString, int>>(); QVector<QPair<XAssetType, int>> assetOccurances = QVector<QPair<XAssetType, int>>();
for (const QString &record : mZoneFile->GetRecords()) { for (XAssetType type : mZoneFile->GetTypes()) {
if (!recordCounts.contains(record)) { if (!recordCounts.contains(type)) {
recordCounts[record] = 0; recordCounts[type] = 0;
} }
recordCounts[record]++; recordCounts[type]++;
if (!assetOccurances.isEmpty() && assetOccurances.last().first == record) { if (!assetOccurances.isEmpty() && assetOccurances.last().first == type) {
assetOccurances.last().second++; assetOccurances.last().second++;
continue; continue;
} }
QPair<QString, int> assetOccurance(record, 1); QPair<XAssetType, int> assetOccurance(type, 1);
assetOccurances << assetOccurance; assetOccurances << assetOccurance;
} }
ui->tableWidget_RecordOrder->setRowCount(assetOccurances.size()); ui->tableWidget_RecordOrder->setRowCount(assetOccurances.size());
int assetIndex = 0; int assetIndex = 0;
foreach (auto assetOccurance, assetOccurances) { foreach (auto assetOccurance, assetOccurances) {
const QString record = assetOccurance.first; XAssetType assetType = assetOccurance.first;
AssetType assetType = mZoneFile->AssetStrToEnum(record);
int assetCount = assetOccurance.second; int assetCount = assetOccurance.second;
QIcon assetIcon = mZoneFile->AssetTypeToIcon(assetType); QIcon assetIcon = Utils::CreateAssetIcon(assetType);
if (assetIcon.isNull()) { if (assetIcon.isNull()) {
qDebug() << "Icon is null for record: " << record; qDebug() << "Icon is null for record: " << assetType;
} }
QTableWidgetItem *recordItem = new QTableWidgetItem(record.toUpper()); QTableWidgetItem *recordItem = new QTableWidgetItem(QString::number(assetType, 16));
QTableWidgetItem *recordStrItem = new QTableWidgetItem(mZoneFile->AssetEnumToStr(assetType)); QTableWidgetItem *recordStrItem = new QTableWidgetItem(XAsset::XAssetTypeToString(assetType));
QTableWidgetItem *recordCountItem = new QTableWidgetItem(QString::number(assetCount)); QTableWidgetItem *recordCountItem = new QTableWidgetItem(QString::number(assetCount));
recordItem->setIcon(assetIcon); recordItem->setIcon(assetIcon);
@ -130,19 +129,18 @@ void ZoneFileViewer::SetZoneFile(std::shared_ptr<ZoneFile> aZoneFile) {
} }
int recordIndex = 0; int recordIndex = 0;
for (const QString &record : recordCounts.keys()) { for (XAssetType assetType : recordCounts.keys()) {
int recordCount = recordCounts[record]; int recordCount = recordCounts[assetType];
AssetType assetType = mZoneFile->AssetStrToEnum(record); QIcon assetIcon = Utils::CreateAssetIcon(assetType);
QIcon assetIcon = mZoneFile->AssetTypeToIcon(assetType);
if (assetIcon.isNull()) { if (assetIcon.isNull()) {
qDebug() << "Icon is null for record: " << record; qDebug() << "Icon is null for record: " << assetType;
} }
ui->tableWidget_RecordCounts->setRowCount(recordIndex + 1); ui->tableWidget_RecordCounts->setRowCount(recordIndex + 1);
QTableWidgetItem *recordItem = new QTableWidgetItem(record.toUpper()); QTableWidgetItem *recordItem = new QTableWidgetItem(QString::number(assetType, 16));
QTableWidgetItem *recordCountStrItem = new QTableWidgetItem(mZoneFile->AssetEnumToStr(assetType)); QTableWidgetItem *recordCountStrItem = new QTableWidgetItem(XAsset::XAssetTypeToString(assetType));
QTableWidgetItem *recordCountItem = new QTableWidgetItem(QString::number(recordCount)); QTableWidgetItem *recordCountItem = new QTableWidgetItem(QString::number(recordCount));
recordItem->setIcon(assetIcon); recordItem->setIcon(assetIcon);

View File

@ -18,7 +18,7 @@ public:
explicit ZoneFileViewer(QWidget *parent = nullptr); explicit ZoneFileViewer(QWidget *parent = nullptr);
~ZoneFileViewer(); ~ZoneFileViewer();
void SetZoneFile(std::shared_ptr<ZoneFile> aZoneFile); void SetZoneFile(const ZoneFile *aZoneFile);
public slots: public slots:
void SortTags(const QString &aSearchText); void SortTags(const QString &aSearchText);
@ -27,7 +27,7 @@ public slots:
private: private:
Ui::ZoneFileViewer *ui; Ui::ZoneFileViewer *ui;
std::shared_ptr<ZoneFile> mZoneFile; const ZoneFile* mZoneFile;
}; };
#endif // ZONEFILEVIEWER_H #endif // ZONEFILEVIEWER_H

Binary file not shown.

Before

Width:  |  Height:  |  Size: 316 B

View File

@ -1,5 +1,5 @@
#include "compression.h" #include "compression.h"
#include "minilzo.h" //#include "minilzo.h"
#define XBOXAPI __declspec(dllimport) #define XBOXAPI __declspec(dllimport)
#include "xcompress.h" #include "xcompress.h"
@ -295,22 +295,23 @@ QByteArray Compression::CompressDeflateWithSettings(const QByteArray &aData, int
} }
QByteArray Compression::DecompressLZO(const QByteArray &aCompressedData, quint32 aDestSize) { QByteArray Compression::DecompressLZO(const QByteArray &aCompressedData, quint32 aDestSize) {
static bool ok = (lzo_init() == LZO_E_OK); QByteArray dst;
if (!ok) // static bool ok = (lzo_init() == LZO_E_OK);
throw std::runtime_error("lzo_init failed"); // if (!ok)
// throw std::runtime_error("lzo_init failed");
QByteArray dst(aDestSize, Qt::Uninitialized); // dst = QByteArray(aDestSize, Qt::Uninitialized);
lzo_uint out = aDestSize; // lzo_uint out = aDestSize;
int rc = lzo1x_decompress_safe( // int rc = lzo1x_decompress_safe(
reinterpret_cast<const lzo_bytep>(aCompressedData.constData()), // reinterpret_cast<const lzo_bytep>(aCompressedData.constData()),
static_cast<lzo_uint>(aCompressedData.size()), // static_cast<lzo_uint>(aCompressedData.size()),
reinterpret_cast<lzo_bytep>(dst.data()), // reinterpret_cast<lzo_bytep>(dst.data()),
&out, // &out,
nullptr); // nullptr);
if (rc != LZO_E_OK || out != aDestSize) // if (rc != LZO_E_OK || out != aDestSize)
throw std::runtime_error("LZO decompression error"); // throw std::runtime_error("LZO decompression error");
return dst; return dst;
} }

View File

@ -3,15 +3,8 @@ TEMPLATE = lib
CONFIG += staticlib c++17 CONFIG += staticlib c++17
DEFINES += MINILZO_USE_STATIC DEFINES += MINILZO_USE_STATIC
SOURCES += \ SOURCES += $$files($$PWD/*.cpp, true)
compression.cpp \ HEADERS += $$files($$PWD/*.h, true)
minilzo.c \
lzoconf.h \
lzodefs.h
HEADERS += \
compression.h \
minilzo.h
LIBS += \ LIBS += \
-L$$PWD/../../third_party/xbox_sdk/lib -lxcompress64 \ -L$$PWD/../../third_party/xbox_sdk/lib -lxcompress64 \

View File

@ -2,23 +2,13 @@ QT += core widgets
TEMPLATE = lib TEMPLATE = lib
CONFIG += staticlib c++17 CONFIG += staticlib c++17
SOURCES += \ SOURCES += $$files($$PWD/*.cpp, true)
highlighter_cfg.cpp \ HEADERS += $$files($$PWD/*.h, true)
highlighter_shock.cpp \
highlighter_rumble.cpp \
highlighter_gsc.cpp \
logmanager.cpp \
statusbarmanager.cpp
HEADERS += \ LIBS += -L$$OUT_PWD/../libs/xassets -lxassets
enums.h \
highlighter_cfg.h \ INCLUDEPATH += $$PWD/../xassets
highlighter_shock.h \
highlighter_rumble.h \ DEPENDPATH += $$PWD/../xassets
highlighter_gsc.h \
logmanager.h \
stringutils.h \
utils.h \
statusbarmanager.h
DESTDIR = $$OUT_PWD/../ DESTDIR = $$OUT_PWD/../

View File

@ -3,28 +3,6 @@
#include <QString> #include <QString>
enum FF_PLATFORM {
FF_PLATFORM_NONE = 0x00, // No platform
FF_PLATFORM_XBOX = 0x01, // Xbox 360
FF_PLATFORM_PS3 = 0x02, // Playstation 3
FF_PLATFORM_PC = 0x03, // PC
FF_PLATFORM_WII = 0x04, // WII
FF_PLATFORM_WIIU = 0x05 // WII U
};
enum FF_GAME {
FF_GAME_NONE = 0x00, // No game
FF_GAME_COD1 = 0x01, // Call of Duty
FF_GAME_COD2 = 0x02, // Call of Duty 2
FF_GAME_COD3 = 0x03, // Call of Duty 3
FF_GAME_COD4 = 0x04, // Modern Warware 1
FF_GAME_COD5 = 0x05, // World at War
FF_GAME_COD6 = 0x06, // Modern Warfare 2
FF_GAME_COD7 = 0x07, // Black Ops 1
FF_GAME_COD8 = 0x08, // Modern Warfare 3
FF_GAME_COD9 = 0x09, // Black Ops 2
};
enum IWI_VERSION { enum IWI_VERSION {
IWI_VERSION_COD2 = 0x05, // 05 CoD2 IWI_VERSION_COD2 = 0x05, // 05 CoD2
IWI_VERSION_COD4 = 0x06, // 06 CoD4 IWI_VERSION_COD4 = 0x06, // 06 CoD4
@ -432,7 +410,7 @@ enum MENU_FONT_TYPE{
UI_FONT_DEFAULT = 0, // auto-chose betwen big/reg/small UI_FONT_DEFAULT = 0, // auto-chose betwen big/reg/small
UI_FONT_NORMAL = 1, UI_FONT_NORMAL = 1,
UI_FONT_BIG = 2, UI_FONT_BIG = 2,
UI_FONT_SMALL = 3, UI_GameFontMALL = 3,
UI_FONT_BOLD = 4, UI_FONT_BOLD = 4,
UI_FONT_CONSOLE = 5, UI_FONT_CONSOLE = 5,
UI_FONT_OBJECTIVE = 6, UI_FONT_OBJECTIVE = 6,

View File

@ -2,15 +2,19 @@
#define UTILS_H #define UTILS_H
#include "enums.h" #include "enums.h"
#include "QtZlib/zlib.h"
#include "qdir.h"
#include "qicon.h"
#include "xasset.h"
#include "xassettype.h"
#include <QString> #include <QMetaEnum>
#include <QtZlib/zlib.h>
#include <QFileDialog>
#include <QMessageBox>
#include <QPainter> #include <QPainter>
#include <QCryptographicHash> #include <QCryptographicHash>
class Utils { class Utils : public QObject {
Q_OBJECT
public: public:
static bool ExportData(const QString aFileName, const QByteArray aData) { static bool ExportData(const QString aFileName, const QByteArray aData) {
QDir workingDir = QDir::currentPath(); QDir workingDir = QDir::currentPath();
@ -30,6 +34,29 @@ public:
b = (b & 0xAA) >> 1 | (b & 0x55) << 1; b = (b & 0xAA) >> 1 | (b & 0x55) << 1;
return b; return b;
} }
static QIcon CreateAssetIcon(XAssetType aAssetType, QColor color = QColor()) {
const QString assetTypeStr = XAsset::XAssetTypeToString(aAssetType);
QString assetAbbr;
for (int i = 0; i < assetTypeStr.length(); i++)
{
if (assetTypeStr[i].isUpper())
{
assetAbbr += assetTypeStr[i];
}
}
return CreateAssetIcon(assetAbbr, color);
// QString name;
// const QStringList parts = assetTypeStr.split('_').mid(1);
// foreach (const QString part, parts) {
// name += part[0];
// }
// if (parts.size() == 1) {
// name += parts.first()[1];
// }
// return CreateAssetIcon(name, color);
}
static QIcon CreateAssetIcon(const QString& name, QColor color = QColor()) { static QIcon CreateAssetIcon(const QString& name, QColor color = QColor()) {
constexpr int iconSize = 32; constexpr int iconSize = 32;
constexpr int padding = 4; constexpr int padding = 4;
@ -380,34 +407,6 @@ public:
return PadInt4(size) - size; return PadInt4(size) - size;
} }
static QString GetOpenFastFileName(QWidget *parent = nullptr) {
// Open file dialog to steam apps
const QString steamPath = "C:/Program Files (x86)/Steam/steamapps/common/Call of Duty World at War/zone/english/";
const QString fastFilePath = QFileDialog::getOpenFileName(parent, "Open Fast File", steamPath, "Fast File (*.ff);;All Files (*.*)");
if (fastFilePath.isNull()) {
// User pressed cancel
return "";
} else if (!QFile::exists(fastFilePath)) {
QMessageBox::warning(parent, "Warning!", QString("%1 does not exist!.").arg(fastFilePath));
return "";
}
return fastFilePath;
}
static QString GetOpenZoneFileName(QWidget *parent = nullptr) {
// Open file dialog to steam apps
const QString steamPath = "C:/Program Files (x86)/Steam/steamapps/common/Call of Duty World at War/zone/english/";
const QString zoneFilePath = QFileDialog::getOpenFileName(parent, "Open Zone File", steamPath, "Zone File (*.zone);;All Files (*.*)");
if (zoneFilePath.isNull()) {
// User pressed cancel
return "";
} else if (!QFile::exists(zoneFilePath)) {
QMessageBox::warning(parent, "Warning!", QString("%1 does not exist!.").arg(zoneFilePath));
return nullptr;
}
return zoneFilePath;
}
static QString CompanyEnumToStr(FF_COMPANY aCompany) { static QString CompanyEnumToStr(FF_COMPANY aCompany) {
switch (aCompany) { switch (aCompany) {
case COMPANY_NONE: case COMPANY_NONE:

View File

@ -35,7 +35,7 @@ DDSPixelFormat DDSFile::CalculatePixelFormat(quint8 aIWIFormat) {
return ddsPixelFormat; return ddsPixelFormat;
} }
void DDSFile::SetupExportDirs() { void DDSFile::SetupExportDirs() const {
QDir dir = QDir::currentPath(); QDir dir = QDir::currentPath();
if (!dir.exists("exports/")) { if (!dir.exists("exports/")) {
dir.mkdir("exports/"); dir.mkdir("exports/");
@ -248,7 +248,7 @@ DDSFile &DDSFile::operator=(const DDSFile &other) {
} }
// Write a DDS file from a DDSFile object // Write a DDS file from a DDSFile object
bool DDSFile::SaveDDS() { bool DDSFile::SaveDDS() const {
SetupExportDirs(); SetupExportDirs();
QFile file("exports/dds/" + fileStem + ".dds"); QFile file("exports/dds/" + fileStem + ".dds");
@ -268,7 +268,7 @@ bool DDSFile::SaveDDS() {
return true; return true;
} }
bool DDSFile::SaveIWI() { bool DDSFile::SaveIWI() const {
SetupExportDirs(); SetupExportDirs();
IWIFile iwiFile(*this); IWIFile iwiFile(*this);
@ -279,7 +279,7 @@ bool DDSFile::SaveIWI() {
return true; return true;
} }
bool DDSFile::SavePNG() { bool DDSFile::SavePNG() const {
SetupExportDirs(); SetupExportDirs();
int mipmapIndex = 1; int mipmapIndex = 1;
@ -311,7 +311,7 @@ bool DDSFile::SavePNG() {
return true; return true;
} }
bool DDSFile::SaveJPG() { bool DDSFile::SaveJPG() const {
SetupExportDirs(); SetupExportDirs();
int mipmapIndex = 1; int mipmapIndex = 1;

View File

@ -68,12 +68,12 @@ public:
DDSFile(const DDSFile &ddsFile); DDSFile(const DDSFile &ddsFile);
DDSFile& operator=(const DDSFile& other); DDSFile& operator=(const DDSFile& other);
bool SaveDDS(); bool SaveDDS() const;
bool SaveIWI(); bool SaveIWI() const;
bool SavePNG(); bool SavePNG() const;
bool SaveJPG(); bool SaveJPG() const;
void SetupExportDirs(); void SetupExportDirs() const;
static DDSPixelFormat CalculatePixelFormat(quint8 aIWIFormat); static DDSPixelFormat CalculatePixelFormat(quint8 aIWIFormat);
private: private:

View File

@ -2,13 +2,8 @@ QT += core
TEMPLATE = lib TEMPLATE = lib
CONFIG += staticlib c++17 CONFIG += staticlib c++17
SOURCES += \ SOURCES += $$files($$PWD/*.cpp, true)
ddsfile.cpp HEADERS += $$files($$PWD/*.h, true)
HEADERS += \
dds_structs.h \
ddsfile.h \
enums.h
LIBS += \ LIBS += \
-L$$PWD/../../third_party/devil_sdk/lib/ -lDevIL \ -L$$PWD/../../third_party/devil_sdk/lib/ -lDevIL \

View File

@ -430,7 +430,7 @@ enum MENU_FONT_TYPE{
UI_FONT_DEFAULT = 0, // auto-chose betwen big/reg/small UI_FONT_DEFAULT = 0, // auto-chose betwen big/reg/small
UI_FONT_NORMAL = 1, UI_FONT_NORMAL = 1,
UI_FONT_BIG = 2, UI_FONT_BIG = 2,
UI_FONT_SMALL = 3, UI_GameFontMALL = 3,
UI_FONT_BOLD = 4, UI_FONT_BOLD = 4,
UI_FONT_CONSOLE = 5, UI_FONT_CONSOLE = 5,
UI_FONT_OBJECTIVE = 6, UI_FONT_OBJECTIVE = 6,

View File

@ -2,20 +2,8 @@ QT += core
TEMPLATE = lib TEMPLATE = lib
CONFIG += staticlib c++17 CONFIG += staticlib c++17
SOURCES += \ SOURCES += $$files($$PWD/*.cpp, true)
salsa20.cpp \ HEADERS += $$files($$PWD/*.h, true)
sha1.cpp \
encryption.cpp
HEADERS += \
ecrypt-config.h \
ecrypt-machine.h \
ecrypt-portable.h \
ecrypt-sync.h \
encryption.h \
os_types.h \
config_win32.h \
sha1.h
app.depends += \ app.depends += \
compression compression

View File

@ -36,7 +36,7 @@ FastFile_COD10_360::~FastFile_COD10_360() {
} }
QByteArray FastFile_COD10_360::GetBinaryData() { QByteArray FastFile_COD10_360::GetBinaryData() const {
return QByteArray(); return QByteArray();
} }
@ -106,10 +106,13 @@ bool FastFile_COD10_360::Load(const QByteArray aData) {
} }
// Load the zone file with the decompressed data (using an Xbox platform flag). // Load the zone file with the decompressed data (using an Xbox platform flag).
ZoneFile_COD10_360 zoneFile; ZoneFile_COD10_360* zoneFile = new ZoneFile_COD10_360();
zoneFile.SetStem(GetBaseStem() + ".zone"); zoneFile->SetStem(GetBaseStem() + ".zone");
zoneFile.Load(decompressedData); if (!zoneFile->Load(decompressedData)) {
SetZoneFile(std::make_shared<ZoneFile_COD10_360>(zoneFile)); qWarning() << "Failed to load ZoneFile!";
return false;
}
SetZoneFile(zoneFile);
return true; return true;
} }

View File

@ -11,7 +11,7 @@ public:
FastFile_COD10_360(const QString aFilePath); FastFile_COD10_360(const QString aFilePath);
~FastFile_COD10_360(); ~FastFile_COD10_360();
QByteArray GetBinaryData() override; QByteArray GetBinaryData() const override;
bool Load(const QString aFilePath) override; bool Load(const QString aFilePath) override;
bool Load(const QByteArray aData) override; bool Load(const QByteArray aData) override;

View File

@ -38,7 +38,7 @@ FastFile_COD11_360::~FastFile_COD11_360() {
} }
QByteArray FastFile_COD11_360::GetBinaryData() { QByteArray FastFile_COD11_360::GetBinaryData() const {
return QByteArray(); return QByteArray();
} }
@ -94,14 +94,13 @@ bool FastFile_COD11_360::Load(const QByteArray aData) {
Utils::ExportData(GetBaseStem() + ".zone", decompressedData); Utils::ExportData(GetBaseStem() + ".zone", decompressedData);
// Load the zone file with decompressed data // Load the zone file with decompressed data
ZoneFile_COD11_360 zoneFile; ZoneFile_COD11_360* zoneFile = new ZoneFile_COD11_360();
zoneFile.SetStem(GetBaseStem() + ".zone"); zoneFile->SetStem(GetBaseStem() + ".zone");
if (!zoneFile.Load(decompressedData)) { if (!zoneFile->Load(decompressedData)) {
qWarning() << "Failed to load ZoneFile!"; qWarning() << "Failed to load ZoneFile!";
return false; return false;
} }
SetZoneFile(zoneFile);
SetZoneFile(std::make_shared<ZoneFile_COD11_360>(zoneFile));
return true; return true;
} }

View File

@ -11,7 +11,7 @@ public:
FastFile_COD11_360(const QString aFilePath); FastFile_COD11_360(const QString aFilePath);
~FastFile_COD11_360(); ~FastFile_COD11_360();
QByteArray GetBinaryData() override; QByteArray GetBinaryData() const override;
bool Load(const QString aFilePath) override; bool Load(const QString aFilePath) override;
bool Load(const QByteArray aData) override; bool Load(const QByteArray aData) override;

View File

@ -38,7 +38,7 @@ FastFile_COD12_360::~FastFile_COD12_360() {
} }
QByteArray FastFile_COD12_360::GetBinaryData() { QByteArray FastFile_COD12_360::GetBinaryData() const {
return QByteArray(); return QByteArray();
} }
@ -94,14 +94,13 @@ bool FastFile_COD12_360::Load(const QByteArray aData) {
Utils::ExportData(GetBaseStem() + ".zone", decompressedData); Utils::ExportData(GetBaseStem() + ".zone", decompressedData);
// Load the zone file with decompressed data // Load the zone file with decompressed data
ZoneFile_COD12_360 zoneFile; ZoneFile_COD12_360* zoneFile = new ZoneFile_COD12_360();
zoneFile.SetStem(GetBaseStem() + ".zone"); zoneFile->SetStem(GetBaseStem() + ".zone");
if (!zoneFile.Load(decompressedData)) { if (!zoneFile->Load(decompressedData)) {
qWarning() << "Failed to load ZoneFile!"; qWarning() << "Failed to load ZoneFile!";
return false; return false;
} }
SetZoneFile(zoneFile);
SetZoneFile(std::make_shared<ZoneFile_COD12_360>(zoneFile));
return true; return true;
} }

View File

@ -11,7 +11,7 @@ public:
FastFile_COD12_360(const QString aFilePath); FastFile_COD12_360(const QString aFilePath);
~FastFile_COD12_360(); ~FastFile_COD12_360();
QByteArray GetBinaryData() override; QByteArray GetBinaryData() const override;
bool Load(const QString aFilePath) override; bool Load(const QString aFilePath) override;
bool Load(const QByteArray aData) override; bool Load(const QByteArray aData) override;

View File

@ -38,7 +38,7 @@ FastFile_COD2_360::~FastFile_COD2_360() {
} }
QByteArray FastFile_COD2_360::GetBinaryData() { QByteArray FastFile_COD2_360::GetBinaryData() const {
return QByteArray(); return QByteArray();
} }
@ -79,10 +79,13 @@ bool FastFile_COD2_360::Load(const QByteArray aData) {
Utils::ExportData(GetBaseStem() + ".zone", decompressedData); Utils::ExportData(GetBaseStem() + ".zone", decompressedData);
// Load the zone file with the decompressed data (using an Xbox platform flag). // Load the zone file with the decompressed data (using an Xbox platform flag).
ZoneFile_COD2_360 zoneFile; ZoneFile_COD2_360* zoneFile = new ZoneFile_COD2_360();
zoneFile.SetStem(GetBaseStem() + ".zone"); zoneFile->SetStem(GetBaseStem() + ".zone");
zoneFile.Load(decompressedData); if (!zoneFile->Load(decompressedData)) {
SetZoneFile(std::make_shared<ZoneFile_COD2_360>(zoneFile)); qWarning() << "Failed to load ZoneFile!";
return false;
}
SetZoneFile(zoneFile);
return true; return true;
} }

View File

@ -11,7 +11,7 @@ public:
FastFile_COD2_360(const QString aFilePath); FastFile_COD2_360(const QString aFilePath);
~FastFile_COD2_360(); ~FastFile_COD2_360();
QByteArray GetBinaryData() override; QByteArray GetBinaryData() const override;
bool Load(const QString aFilePath) override; bool Load(const QString aFilePath) override;
bool Load(const QByteArray aData) override; bool Load(const QByteArray aData) override;

View File

@ -39,7 +39,7 @@ FastFile_COD4_360::~FastFile_COD4_360() {
} }
QByteArray FastFile_COD4_360::GetBinaryData() { QByteArray FastFile_COD4_360::GetBinaryData() const {
return QByteArray(); return QByteArray();
} }
@ -126,14 +126,15 @@ bool FastFile_COD4_360::Load(const QByteArray aData) {
} }
decompressedData = Compression::DecompressZLIB(compressedData); decompressedData = Compression::DecompressZLIB(compressedData);
} }
Utils::ExportData(GetBaseStem() + ".zone", decompressedData); Utils::ExportData(GetBaseStem() + ".zone", decompressedData);
ZoneFile_COD4_360 zoneFile; ZoneFile_COD4_360* zoneFile = new ZoneFile_COD4_360();
zoneFile.SetStem(GetBaseStem() + ".zone"); zoneFile->SetStem(GetBaseStem() + ".zone");
zoneFile.Load(decompressedData); if (!zoneFile->Load(decompressedData)) {
SetZoneFile(std::make_shared<ZoneFile_COD4_360>(zoneFile)); qWarning() << "Failed to load ZoneFile!";
return false;
}
SetZoneFile(zoneFile);
return true; return true;
} }

View File

@ -11,7 +11,7 @@ public:
FastFile_COD4_360(const QString aFilePath); FastFile_COD4_360(const QString aFilePath);
~FastFile_COD4_360(); ~FastFile_COD4_360();
QByteArray GetBinaryData() override; QByteArray GetBinaryData() const override;
bool Load(const QString aFilePath) override; bool Load(const QString aFilePath) override;
bool Load(const QByteArray aData) override; bool Load(const QByteArray aData) override;

View File

@ -39,7 +39,7 @@ FastFile_COD5_360::~FastFile_COD5_360() {
} }
QByteArray FastFile_COD5_360::GetBinaryData() { QByteArray FastFile_COD5_360::GetBinaryData() const {
return QByteArray(); return QByteArray();
} }
@ -80,10 +80,13 @@ bool FastFile_COD5_360::Load(const QByteArray aData) {
Utils::ExportData(GetBaseStem() + ".zone", decompressedData); Utils::ExportData(GetBaseStem() + ".zone", decompressedData);
ZoneFile_COD5_360 zoneFile; ZoneFile_COD5_360* zoneFile = new ZoneFile_COD5_360();
zoneFile.SetStem(GetBaseStem() + ".zone"); zoneFile->SetStem(GetBaseStem() + ".zone");
zoneFile.Load(decompressedData); if (!zoneFile->Load(decompressedData)) {
SetZoneFile(std::make_shared<ZoneFile_COD5_360>(zoneFile)); qWarning() << "Failed to load ZoneFile!";
return false;
}
SetZoneFile(zoneFile);
return true; return true;
} }

View File

@ -11,7 +11,7 @@ public:
FastFile_COD5_360(const QString aFilePath); FastFile_COD5_360(const QString aFilePath);
~FastFile_COD5_360(); ~FastFile_COD5_360();
QByteArray GetBinaryData() override; QByteArray GetBinaryData() const override;
bool Load(const QString aFilePath) override; bool Load(const QString aFilePath) override;
bool Load(const QByteArray aData) override; bool Load(const QByteArray aData) override;

View File

@ -39,7 +39,7 @@ FastFile_COD6_360::~FastFile_COD6_360() {
} }
QByteArray FastFile_COD6_360::GetBinaryData() { QByteArray FastFile_COD6_360::GetBinaryData() const {
return QByteArray(); return QByteArray();
} }
@ -78,31 +78,30 @@ bool FastFile_COD6_360::Load(const QByteArray aData) {
} }
QByteArray compressed = aData.mid(zlibOffset); QByteArray compressed = aData.mid(zlibOffset);
// 2. Try plain decompression first ------------------------------ QByteArray decompressedData = Compression::DecompressZLIB(compressed);
QByteArray decompressed = Compression::DecompressZLIB(compressed);
// 3. If that failed or looks too small, try stripping hash blocks if (decompressedData.isEmpty() || decompressedData.size() < 1024)
if (decompressed.isEmpty() || decompressed.size() < 1024)
{ {
QByteArray stripped = Compression::StripHashBlocks(compressed); QByteArray stripped = Compression::StripHashBlocks(compressed);
QByteArray retry = Compression::DecompressZLIB(stripped); QByteArray retry = Compression::DecompressZLIB(stripped);
if (!retry.isEmpty()) if (!retry.isEmpty())
decompressed.swap(retry); decompressedData.swap(retry);
} }
if (decompressed.isEmpty()) if (decompressedData.isEmpty())
{ {
qWarning() << "Unable to decompress fast-file"; qWarning() << "Unable to decompress fast-file";
return false; return false;
} }
// Optional keep a copy on disk for quick inspection Utils::ExportData(GetBaseStem() + ".zone", decompressedData);
Utils::ExportData(GetBaseStem() + ".zone", decompressed);
// 4. Forward to zone-file loader -------------------------------- ZoneFile_COD6_360* zoneFile = new ZoneFile_COD6_360();
auto zoneFile = std::make_shared<ZoneFile_COD6_360>(); zoneFile->SetStem(GetBaseStem() + ".zone");
zoneFile->SetStem(GetStem()); if (!zoneFile->Load(decompressedData)) {
zoneFile->Load(decompressed); qWarning() << "Failed to load ZoneFile!";
return false;
}
SetZoneFile(zoneFile); SetZoneFile(zoneFile);
return true; return true;

View File

@ -11,7 +11,7 @@ public:
FastFile_COD6_360(const QString aFilePath); FastFile_COD6_360(const QString aFilePath);
~FastFile_COD6_360(); ~FastFile_COD6_360();
QByteArray GetBinaryData() override; QByteArray GetBinaryData() const override;
bool Load(const QString aFilePath) override; bool Load(const QString aFilePath) override;
bool Load(const QByteArray aData) override; bool Load(const QByteArray aData) override;

View File

@ -38,7 +38,7 @@ FastFile_COD7_360::~FastFile_COD7_360() {
} }
QByteArray FastFile_COD7_360::GetBinaryData() { QByteArray FastFile_COD7_360::GetBinaryData() const {
return QByteArray(); return QByteArray();
} }
@ -73,10 +73,7 @@ bool FastFile_COD7_360::Load(const QByteArray aData) {
// Create a QDataStream on the input data. // Create a QDataStream on the input data.
QDataStream fastFileStream(aData); QDataStream fastFileStream(aData);
fastFileStream.skipRawData(12);
// Load the zone file with the decompressed data (using an Xbox platform flag).
ZoneFile_COD7_360 zoneFile;
zoneFile.SetStem(GetBaseStem() + ".zone");
// For COD7/COD9, use BigEndian. // For COD7/COD9, use BigEndian.
fastFileStream.setByteOrder(QDataStream::BigEndian); fastFileStream.setByteOrder(QDataStream::BigEndian);
@ -142,10 +139,15 @@ bool FastFile_COD7_360::Load(const QByteArray aData) {
sectionIndex++; sectionIndex++;
} }
Utils::ExportData(GetBaseStem() + ".zone", decompressedData);
zoneFile.Load(decompressedData); ZoneFile_COD7_360* zoneFile = new ZoneFile_COD7_360();
zoneFile->SetStem(GetBaseStem() + ".zone");
SetZoneFile(std::make_shared<ZoneFile_COD7_360>(zoneFile)); if (!zoneFile->Load(decompressedData)) {
qWarning() << "Failed to load ZoneFile!";
return false;
}
SetZoneFile(zoneFile);
return true; return true;
} }

View File

@ -11,7 +11,7 @@ public:
FastFile_COD7_360(const QString aFilePath); FastFile_COD7_360(const QString aFilePath);
~FastFile_COD7_360(); ~FastFile_COD7_360();
QByteArray GetBinaryData() override; QByteArray GetBinaryData() const override;
bool Load(const QString aFilePath) override; bool Load(const QString aFilePath) override;
bool Load(const QByteArray aData) override; bool Load(const QByteArray aData) override;

View File

@ -36,7 +36,7 @@ FastFile_COD8_360::~FastFile_COD8_360() {
} }
QByteArray FastFile_COD8_360::GetBinaryData() { QByteArray FastFile_COD8_360::GetBinaryData() const {
return QByteArray(); return QByteArray();
} }
@ -106,10 +106,13 @@ bool FastFile_COD8_360::Load(const QByteArray aData) {
} }
// Load the zone file with the decompressed data (using an Xbox platform flag). // Load the zone file with the decompressed data (using an Xbox platform flag).
ZoneFile_COD8_360 zoneFile; ZoneFile_COD8_360* zoneFile = new ZoneFile_COD8_360();
zoneFile.SetStem(GetBaseStem() + ".zone"); zoneFile->SetStem(GetBaseStem() + ".zone");
zoneFile.Load(decompressedData); if (!zoneFile->Load(decompressedData)) {
SetZoneFile(std::make_shared<ZoneFile_COD8_360>(zoneFile)); qWarning() << "Failed to load ZoneFile!";
return false;
}
SetZoneFile(zoneFile);
return true; return true;
} }

View File

@ -11,7 +11,7 @@ public:
FastFile_COD8_360(const QString aFilePath); FastFile_COD8_360(const QString aFilePath);
~FastFile_COD8_360(); ~FastFile_COD8_360();
QByteArray GetBinaryData() override; QByteArray GetBinaryData() const override;
bool Load(const QString aFilePath) override; bool Load(const QString aFilePath) override;
bool Load(const QByteArray aData) override; bool Load(const QByteArray aData) override;

View File

@ -36,7 +36,7 @@ FastFile_COD9_360::~FastFile_COD9_360() {
} }
QByteArray FastFile_COD9_360::GetBinaryData() { QByteArray FastFile_COD9_360::GetBinaryData() const {
return QByteArray(); return QByteArray();
} }
@ -106,10 +106,13 @@ bool FastFile_COD9_360::Load(const QByteArray aData) {
} }
// Load the zone file with the decompressed data (using an Xbox platform flag). // Load the zone file with the decompressed data (using an Xbox platform flag).
ZoneFile_COD9_360 zoneFile; ZoneFile_COD9_360* zoneFile = new ZoneFile_COD9_360();
zoneFile.SetStem(GetBaseStem() + ".zone"); zoneFile->SetStem(GetBaseStem() + ".zone");
zoneFile.Load(decompressedData); if (!zoneFile->Load(decompressedData)) {
SetZoneFile(std::make_shared<ZoneFile_COD9_360>(zoneFile)); qWarning() << "Failed to load ZoneFile!";
return false;
}
SetZoneFile(zoneFile);
return true; return true;
} }

View File

@ -11,7 +11,7 @@ public:
FastFile_COD9_360(const QString aFilePath); FastFile_COD9_360(const QString aFilePath);
~FastFile_COD9_360(); ~FastFile_COD9_360();
QByteArray GetBinaryData() override; QByteArray GetBinaryData() const override;
bool Load(const QString aFilePath) override; bool Load(const QString aFilePath) override;
bool Load(const QByteArray aData) override; bool Load(const QByteArray aData) override;

View File

@ -36,7 +36,7 @@ FastFile_COD10_PC::~FastFile_COD10_PC() {
} }
QByteArray FastFile_COD10_PC::GetBinaryData() { QByteArray FastFile_COD10_PC::GetBinaryData() const {
return QByteArray(); return QByteArray();
} }
@ -128,10 +128,13 @@ bool FastFile_COD10_PC::Load(const QByteArray aData) {
} }
// Load the zone file with the decompressed data (using an Xbox platform flag). // Load the zone file with the decompressed data (using an Xbox platform flag).
ZoneFile_COD10_PC zoneFile; ZoneFile_COD10_PC* zoneFile = new ZoneFile_COD10_PC();
zoneFile.SetStem(GetBaseStem() + ".zone"); zoneFile->SetStem(GetBaseStem() + ".zone");
zoneFile.Load(decompressedData); if (!zoneFile->Load(decompressedData)) {
SetZoneFile(std::make_shared<ZoneFile_COD10_PC>(zoneFile)); qWarning() << "Failed to load ZoneFile!";
return false;
}
SetZoneFile(zoneFile);
return true; return true;
} }

View File

@ -11,7 +11,7 @@ public:
FastFile_COD10_PC(const QString aFilePath); FastFile_COD10_PC(const QString aFilePath);
~FastFile_COD10_PC(); ~FastFile_COD10_PC();
QByteArray GetBinaryData() override; QByteArray GetBinaryData() const override;
bool Load(const QString aFilePath) override; bool Load(const QString aFilePath) override;
bool Load(const QByteArray aData) override; bool Load(const QByteArray aData) override;

View File

@ -36,7 +36,7 @@ FastFile_COD11_PC::~FastFile_COD11_PC() {
} }
QByteArray FastFile_COD11_PC::GetBinaryData() { QByteArray FastFile_COD11_PC::GetBinaryData() const {
return QByteArray(); return QByteArray();
} }
@ -128,10 +128,13 @@ bool FastFile_COD11_PC::Load(const QByteArray aData) {
} }
// Load the zone file with the decompressed data (using an Xbox platform flag). // Load the zone file with the decompressed data (using an Xbox platform flag).
ZoneFile_COD11_PC zoneFile; ZoneFile_COD11_PC* zoneFile = new ZoneFile_COD11_PC();
zoneFile.SetStem(GetBaseStem() + ".zone"); zoneFile->SetStem(GetBaseStem() + ".zone");
zoneFile.Load(decompressedData); if (!zoneFile->Load(decompressedData)) {
SetZoneFile(std::make_shared<ZoneFile_COD11_PC>(zoneFile)); qWarning() << "Failed to load ZoneFile!";
return false;
}
SetZoneFile(zoneFile);
return true; return true;
} }

View File

@ -11,7 +11,7 @@ public:
FastFile_COD11_PC(const QString aFilePath); FastFile_COD11_PC(const QString aFilePath);
~FastFile_COD11_PC(); ~FastFile_COD11_PC();
QByteArray GetBinaryData() override; QByteArray GetBinaryData() const override;
bool Load(const QString aFilePath) override; bool Load(const QString aFilePath) override;
bool Load(const QByteArray aData) override; bool Load(const QByteArray aData) override;

View File

@ -39,7 +39,7 @@ FastFile_COD12_PC::~FastFile_COD12_PC() {
} }
QByteArray FastFile_COD12_PC::GetBinaryData() { QByteArray FastFile_COD12_PC::GetBinaryData() const {
return QByteArray(); return QByteArray();
} }
@ -76,10 +76,6 @@ bool FastFile_COD12_PC::Load(const QByteArray aData) {
QDataStream fastFileStream(aData); QDataStream fastFileStream(aData);
fastFileStream.setByteOrder(QDataStream::LittleEndian); fastFileStream.setByteOrder(QDataStream::LittleEndian);
// Load the zone file with the decompressed data (using an Xbox platform flag).
ZoneFile_COD12_PC zoneFile;
zoneFile.SetStem(GetBaseStem() + ".zone");
// Skip header magic // Skip header magic
fastFileStream.skipRawData(8); fastFileStream.skipRawData(8);
@ -143,9 +139,14 @@ bool FastFile_COD12_PC::Load(const QByteArray aData) {
Utils::ExportData(GetBaseStem() + ".zone", decompressedData); Utils::ExportData(GetBaseStem() + ".zone", decompressedData);
zoneFile.Load(decompressedData); // Load the zone file with the decompressed data (using an Xbox platform flag).
ZoneFile_COD12_PC* zoneFile = new ZoneFile_COD12_PC();
SetZoneFile(std::make_shared<ZoneFile_COD12_PC>(zoneFile)); zoneFile->SetStem(GetBaseStem() + ".zone");
if (!zoneFile->Load(decompressedData)) {
qWarning() << "Failed to load ZoneFile!";
return false;
}
SetZoneFile(zoneFile);
return true; return true;
} }

View File

@ -11,7 +11,7 @@ public:
FastFile_COD12_PC(const QString aFilePath); FastFile_COD12_PC(const QString aFilePath);
~FastFile_COD12_PC(); ~FastFile_COD12_PC();
QByteArray GetBinaryData() override; QByteArray GetBinaryData() const override;
bool Load(const QString aFilePath) override; bool Load(const QString aFilePath) override;
bool Load(const QByteArray aData) override; bool Load(const QByteArray aData) override;

View File

@ -39,7 +39,7 @@ FastFile_COD4_PC::~FastFile_COD4_PC() {
} }
QByteArray FastFile_COD4_PC::GetBinaryData() { QByteArray FastFile_COD4_PC::GetBinaryData() const {
return QByteArray(); return QByteArray();
} }
@ -84,10 +84,13 @@ bool FastFile_COD4_PC::Load(const QByteArray aData) {
Utils::ExportData(GetBaseStem() + ".zone", decompressedData); Utils::ExportData(GetBaseStem() + ".zone", decompressedData);
ZoneFile_COD4_PC zoneFile; ZoneFile_COD4_PC* zoneFile = new ZoneFile_COD4_PC();
zoneFile.SetStem(GetBaseStem() + ".zone"); zoneFile->SetStem(GetBaseStem() + ".zone");
zoneFile.Load(decompressedData); if (!zoneFile->Load(decompressedData)) {
SetZoneFile(std::make_shared<ZoneFile_COD4_PC>(zoneFile)); qWarning() << "Failed to load ZoneFile!";
return false;
}
SetZoneFile(zoneFile);
return true; return true;
} }

View File

@ -11,7 +11,7 @@ public:
FastFile_COD4_PC(const QString aFilePath); FastFile_COD4_PC(const QString aFilePath);
~FastFile_COD4_PC(); ~FastFile_COD4_PC();
QByteArray GetBinaryData() override; QByteArray GetBinaryData() const override;
bool Load(const QString aFilePath) override; bool Load(const QString aFilePath) override;
bool Load(const QByteArray aData) override; bool Load(const QByteArray aData) override;

View File

@ -39,7 +39,7 @@ FastFile_COD5_PC::~FastFile_COD5_PC() {
} }
QByteArray FastFile_COD5_PC::GetBinaryData() { QByteArray FastFile_COD5_PC::GetBinaryData() const {
return QByteArray(); return QByteArray();
} }
@ -84,10 +84,13 @@ bool FastFile_COD5_PC::Load(const QByteArray aData) {
Utils::ExportData(GetBaseStem() + ".zone", decompressedData); Utils::ExportData(GetBaseStem() + ".zone", decompressedData);
ZoneFile_COD5_PC zoneFile; ZoneFile_COD5_PC* zoneFile = new ZoneFile_COD5_PC();
zoneFile.SetStem(GetBaseStem() + ".zone"); zoneFile->SetStem(GetBaseStem() + ".zone");
zoneFile.Load(decompressedData); if (!zoneFile->Load(decompressedData)) {
SetZoneFile(std::make_shared<ZoneFile_COD5_PC>(zoneFile)); qWarning() << "Failed to load ZoneFile!";
return false;
}
SetZoneFile(zoneFile);
return true; return true;
} }

View File

@ -11,7 +11,7 @@ public:
FastFile_COD5_PC(const QString aFilePath); FastFile_COD5_PC(const QString aFilePath);
~FastFile_COD5_PC(); ~FastFile_COD5_PC();
QByteArray GetBinaryData() override; QByteArray GetBinaryData() const override;
bool Load(const QString aFilePath) override; bool Load(const QString aFilePath) override;
bool Load(const QByteArray aData) override; bool Load(const QByteArray aData) override;

View File

@ -39,7 +39,7 @@ FastFile_COD6_PC::~FastFile_COD6_PC() {
} }
QByteArray FastFile_COD6_PC::GetBinaryData() { QByteArray FastFile_COD6_PC::GetBinaryData() const {
return QByteArray(); return QByteArray();
} }
@ -81,10 +81,13 @@ bool FastFile_COD6_PC::Load(const QByteArray aData) {
Utils::ExportData(GetBaseStem() + ".zone", decompressedData); Utils::ExportData(GetBaseStem() + ".zone", decompressedData);
ZoneFile_COD6_PC zoneFile; ZoneFile_COD6_PC* zoneFile = new ZoneFile_COD6_PC();
zoneFile.SetStem(GetBaseStem() + ".zone"); zoneFile->SetStem(GetBaseStem() + ".zone");
zoneFile.Load(decompressedData); if (!zoneFile->Load(decompressedData)) {
SetZoneFile(std::make_shared<ZoneFile_COD6_PC>(zoneFile)); qWarning() << "Failed to load ZoneFile!";
return false;
}
SetZoneFile(zoneFile);
return true; return true;
} }

View File

@ -11,7 +11,7 @@ public:
FastFile_COD6_PC(const QString aFilePath); FastFile_COD6_PC(const QString aFilePath);
~FastFile_COD6_PC(); ~FastFile_COD6_PC();
QByteArray GetBinaryData() override; QByteArray GetBinaryData() const override;
bool Load(const QString aFilePath) override; bool Load(const QString aFilePath) override;
bool Load(const QByteArray aData) override; bool Load(const QByteArray aData) override;

View File

@ -39,7 +39,7 @@ FastFile_COD7_PC::~FastFile_COD7_PC() {
} }
QByteArray FastFile_COD7_PC::GetBinaryData() { QByteArray FastFile_COD7_PC::GetBinaryData() const {
return QByteArray(); return QByteArray();
} }
@ -83,88 +83,22 @@ bool FastFile_COD7_PC::Load(const QByteArray aData) {
SetMagic(pParseFFMagic(&fastFileStream)); SetMagic(pParseFFMagic(&fastFileStream));
quint32 version = pParseFFVersion(&fastFileStream); quint32 version = pParseFFVersion(&fastFileStream);
SetVersion(version); SetVersion(version);
SetPlatform(pCalculateFFPlatform(version)); SetPlatform("360");
SetGame("COD7"); SetGame("COD7");
// Load the zone file with the decompressed data (using an Xbox platform flag). // Assume the first 12 bytes are a header; the rest is zlib-compressed zone data.
ZoneFile_COD7_PC zoneFile; const QByteArray compressedData = aData.mid(12);
zoneFile.SetStem(GetBaseStem() + ".zone"); decompressedData = Compression::DecompressZLIB(compressedData);
// For COD7/COD9, use BigEndian. Utils::ExportData(GetBaseStem() + ".zone", decompressedData);
fastFileStream.setByteOrder(QDataStream::LittleEndian);
// Select key based on game. ZoneFile_COD7_PC* zoneFile = new ZoneFile_COD7_PC();
QByteArray key; zoneFile->SetStem(GetBaseStem() + ".zone");
fastFileStream.skipRawData(4); if (!zoneFile->Load(decompressedData)) {
if (GetPlatform() == "360") { qWarning() << "Failed to load ZoneFile!";
key = QByteArray::fromHex("1ac1d12d527c59b40eca619120ff8217ccff09cd16896f81b829c7f52793405d");
} else if (GetPlatform() == "PS3") {
key = QByteArray::fromHex("46D3F997F29C9ACE175B0DAE3AB8C0C1B8E423E2E3BF7E3C311EA35245BF193A");
// or
// key = QByteArray::fromHex("0C99B3DDB8D6D0845D1147E470F28A8BF2AE69A8A9F534767B54E9180FF55370");
}
// Read the 8-byte magic.
QByteArray fileMagic(8, Qt::Uninitialized);
fastFileStream.readRawData(fileMagic.data(), 8);
if (fileMagic != "PHEEBs71") {
qWarning() << "Invalid fast file magic!";
return false; return false;
} }
fastFileStream.skipRawData(4); SetZoneFile(zoneFile);
// Read IV table name (32 bytes).
QByteArray fileName(32, Qt::Uninitialized);
fastFileStream.readRawData(fileName.data(), 32);
// Build the IV table from the fileName.
QByteArray ivTable = Encryption::InitIVTable(fileName);
// Skip the RSA signature (256 bytes).
QByteArray rsaSignature(256, Qt::Uninitialized);
fastFileStream.readRawData(rsaSignature.data(), 256);
// Now the stream should be positioned at 0x13C, where sections begin.
int sectionIndex = 0;
while (true) {
qint32 sectionSize = 0;
fastFileStream >> sectionSize;
qDebug() << "Section index:" << sectionIndex << "Size:" << sectionSize
<< "Pos:" << fastFileStream.device()->pos();
if (sectionSize == 0)
break;
// Read the section data.
QByteArray sectionData;
sectionData.resize(sectionSize);
fastFileStream.readRawData(sectionData.data(), sectionSize);
// Compute the IV for this section.
QByteArray iv = Encryption::GetIV(ivTable, sectionIndex);
// Decrypt the section using Salsa20.
QByteArray decData = Encryption::salsa20DecryptSection(sectionData, key, iv);
// Compute SHA1 hash of the decrypted data.
QByteArray sectionHash = QCryptographicHash::hash(decData, QCryptographicHash::Sha1);
// Update the IV table based on the section hash.
Encryption::UpdateIVTable(ivTable, sectionIndex, sectionHash);
// Build a compressed data buffer by prepending the two-byte zlib header.
QByteArray compressedData;
compressedData.append(char(0x78));
compressedData.append(char(0x01));
compressedData.append(decData);
decompressedData.append(Compression::DecompressZLIB(compressedData));
sectionIndex++;
}
zoneFile.Load(decompressedData);
SetZoneFile(std::make_shared<ZoneFile_COD7_PC>(zoneFile));
return true; return true;
} }

View File

@ -11,7 +11,7 @@ public:
FastFile_COD7_PC(const QString aFilePath); FastFile_COD7_PC(const QString aFilePath);
~FastFile_COD7_PC(); ~FastFile_COD7_PC();
QByteArray GetBinaryData() override; QByteArray GetBinaryData() const override;
bool Load(const QString aFilePath) override; bool Load(const QString aFilePath) override;
bool Load(const QByteArray aData) override; bool Load(const QByteArray aData) override;

View File

@ -39,7 +39,7 @@ FastFile_COD8_PC::~FastFile_COD8_PC() {
} }
QByteArray FastFile_COD8_PC::GetBinaryData() { QByteArray FastFile_COD8_PC::GetBinaryData() const {
return QByteArray(); return QByteArray();
} }
@ -86,10 +86,6 @@ bool FastFile_COD8_PC::Load(const QByteArray aData) {
SetPlatform(pCalculateFFPlatform(version)); SetPlatform(pCalculateFFPlatform(version));
SetGame("COD7"); SetGame("COD7");
// Load the zone file with the decompressed data (using an Xbox platform flag).
ZoneFile_COD8_PC zoneFile;
zoneFile.SetStem(GetBaseStem() + ".zone");
// For COD7/COD9, use BigEndian. // For COD7/COD9, use BigEndian.
fastFileStream.setByteOrder(QDataStream::LittleEndian); fastFileStream.setByteOrder(QDataStream::LittleEndian);
@ -162,9 +158,13 @@ bool FastFile_COD8_PC::Load(const QByteArray aData) {
sectionIndex++; sectionIndex++;
} }
zoneFile.Load(decompressedData); ZoneFile_COD8_PC* zoneFile = new ZoneFile_COD8_PC();
zoneFile->SetStem(GetBaseStem() + ".zone");
SetZoneFile(std::make_shared<ZoneFile_COD8_PC>(zoneFile)); if (!zoneFile->Load(decompressedData)) {
qWarning() << "Failed to load ZoneFile!";
return false;
}
SetZoneFile(zoneFile);
return true; return true;
} }

View File

@ -11,7 +11,7 @@ public:
FastFile_COD8_PC(const QString aFilePath); FastFile_COD8_PC(const QString aFilePath);
~FastFile_COD8_PC(); ~FastFile_COD8_PC();
QByteArray GetBinaryData() override; QByteArray GetBinaryData() const override;
bool Load(const QString aFilePath) override; bool Load(const QString aFilePath) override;
bool Load(const QByteArray aData) override; bool Load(const QByteArray aData) override;

View File

@ -36,7 +36,7 @@ FastFile_COD9_PC::~FastFile_COD9_PC() {
} }
QByteArray FastFile_COD9_PC::GetBinaryData() { QByteArray FastFile_COD9_PC::GetBinaryData() const {
return QByteArray(); return QByteArray();
} }
@ -128,10 +128,13 @@ bool FastFile_COD9_PC::Load(const QByteArray aData) {
} }
// Load the zone file with the decompressed data (using an Xbox platform flag). // Load the zone file with the decompressed data (using an Xbox platform flag).
ZoneFile_COD9_PC zoneFile; ZoneFile_COD9_PC* zoneFile = new ZoneFile_COD9_PC();
zoneFile.SetStem(GetBaseStem() + ".zone"); zoneFile->SetStem(GetBaseStem() + ".zone");
zoneFile.Load(decompressedData); if (!zoneFile->Load(decompressedData)) {
SetZoneFile(std::make_shared<ZoneFile_COD9_PC>(zoneFile)); qWarning() << "Failed to load ZoneFile!";
return false;
}
SetZoneFile(zoneFile);
return true; return true;
} }

View File

@ -11,7 +11,7 @@ public:
FastFile_COD9_PC(const QString aFilePath); FastFile_COD9_PC(const QString aFilePath);
~FastFile_COD9_PC(); ~FastFile_COD9_PC();
QByteArray GetBinaryData() override; QByteArray GetBinaryData() const override;
bool Load(const QString aFilePath) override; bool Load(const QString aFilePath) override;
bool Load(const QByteArray aData) override; bool Load(const QByteArray aData) override;

View File

@ -36,7 +36,7 @@ FastFile_COD10_PS3::~FastFile_COD10_PS3() {
} }
QByteArray FastFile_COD10_PS3::GetBinaryData() { QByteArray FastFile_COD10_PS3::GetBinaryData() const {
return QByteArray(); return QByteArray();
} }
@ -128,10 +128,13 @@ bool FastFile_COD10_PS3::Load(const QByteArray aData) {
} }
// Load the zone file with the decompressed data (using an Xbox platform flag). // Load the zone file with the decompressed data (using an Xbox platform flag).
ZoneFile_COD10_PS3 zoneFile; ZoneFile_COD10_PS3* zoneFile = new ZoneFile_COD10_PS3();
zoneFile.SetStem(GetBaseStem() + ".zone"); zoneFile->SetStem(GetBaseStem() + ".zone");
zoneFile.Load(decompressedData); if (!zoneFile->Load(decompressedData)) {
SetZoneFile(std::make_shared<ZoneFile_COD10_PS3>(zoneFile)); qWarning() << "Failed to load ZoneFile!";
return false;
}
SetZoneFile(zoneFile);
return true; return true;
} }

View File

@ -11,7 +11,7 @@ public:
FastFile_COD10_PS3(const QString aFilePath); FastFile_COD10_PS3(const QString aFilePath);
~FastFile_COD10_PS3(); ~FastFile_COD10_PS3();
QByteArray GetBinaryData() override; QByteArray GetBinaryData() const override;
bool Load(const QString aFilePath) override; bool Load(const QString aFilePath) override;
bool Load(const QByteArray aData) override; bool Load(const QByteArray aData) override;

View File

@ -36,7 +36,7 @@ FastFile_COD11_PS3::~FastFile_COD11_PS3() {
} }
QByteArray FastFile_COD11_PS3::GetBinaryData() { QByteArray FastFile_COD11_PS3::GetBinaryData() const {
return QByteArray(); return QByteArray();
} }
@ -128,10 +128,13 @@ bool FastFile_COD11_PS3::Load(const QByteArray aData) {
} }
// Load the zone file with the decompressed data (using an Xbox platform flag). // Load the zone file with the decompressed data (using an Xbox platform flag).
ZoneFile_COD11_PS3 zoneFile; ZoneFile_COD11_PS3* zoneFile = new ZoneFile_COD11_PS3();
zoneFile.SetStem(GetBaseStem() + ".zone"); zoneFile->SetStem(GetBaseStem() + ".zone");
zoneFile.Load(decompressedData); if (!zoneFile->Load(decompressedData)) {
SetZoneFile(std::make_shared<ZoneFile_COD11_PS3>(zoneFile)); qWarning() << "Failed to load ZoneFile!";
return false;
}
SetZoneFile(zoneFile);
return true; return true;
} }

View File

@ -11,7 +11,7 @@ public:
FastFile_COD11_PS3(const QString aFilePath); FastFile_COD11_PS3(const QString aFilePath);
~FastFile_COD11_PS3(); ~FastFile_COD11_PS3();
QByteArray GetBinaryData() override; QByteArray GetBinaryData() const override;
bool Load(const QString aFilePath) override; bool Load(const QString aFilePath) override;
bool Load(const QByteArray aData) override; bool Load(const QByteArray aData) override;

View File

@ -36,7 +36,7 @@ FastFile_COD12_PS3::~FastFile_COD12_PS3() {
} }
QByteArray FastFile_COD12_PS3::GetBinaryData() { QByteArray FastFile_COD12_PS3::GetBinaryData() const {
return QByteArray(); return QByteArray();
} }
@ -128,10 +128,13 @@ bool FastFile_COD12_PS3::Load(const QByteArray aData) {
} }
// Load the zone file with the decompressed data (using an Xbox platform flag). // Load the zone file with the decompressed data (using an Xbox platform flag).
ZoneFile_COD12_PS3 zoneFile; ZoneFile_COD12_PS3* zoneFile = new ZoneFile_COD12_PS3();
zoneFile.SetStem(GetBaseStem() + ".zone"); zoneFile->SetStem(GetBaseStem() + ".zone");
zoneFile.Load(decompressedData); if (!zoneFile->Load(decompressedData)) {
SetZoneFile(std::make_shared<ZoneFile_COD12_PS3>(zoneFile)); qWarning() << "Failed to load ZoneFile!";
return false;
}
SetZoneFile(zoneFile);
return true; return true;
} }

View File

@ -11,7 +11,7 @@ public:
FastFile_COD12_PS3(const QString aFilePath); FastFile_COD12_PS3(const QString aFilePath);
~FastFile_COD12_PS3(); ~FastFile_COD12_PS3();
QByteArray GetBinaryData() override; QByteArray GetBinaryData() const override;
bool Load(const QString aFilePath) override; bool Load(const QString aFilePath) override;
bool Load(const QByteArray aData) override; bool Load(const QByteArray aData) override;

View File

@ -39,7 +39,7 @@ FastFile_COD4_PS3::~FastFile_COD4_PS3() {
} }
QByteArray FastFile_COD4_PS3::GetBinaryData() { QByteArray FastFile_COD4_PS3::GetBinaryData() const {
return QByteArray(); return QByteArray();
} }
@ -111,10 +111,13 @@ bool FastFile_COD4_PS3::Load(const QByteArray aData) {
Utils::ExportData(GetBaseStem() + ".zone", decompressedData); Utils::ExportData(GetBaseStem() + ".zone", decompressedData);
ZoneFile_COD4_PS3 zoneFile; ZoneFile_COD4_PS3* zoneFile = new ZoneFile_COD4_PS3();
zoneFile.SetStem(GetBaseStem() + ".zone"); zoneFile->SetStem(GetBaseStem() + ".zone");
zoneFile.Load(decompressedData); if (!zoneFile->Load(decompressedData)) {
SetZoneFile(std::make_shared<ZoneFile_COD4_PS3>(zoneFile)); qWarning() << "Failed to load ZoneFile!";
return false;
}
SetZoneFile(zoneFile);
return true; return true;
} }

View File

@ -11,7 +11,7 @@ public:
FastFile_COD4_PS3(const QString aFilePath); FastFile_COD4_PS3(const QString aFilePath);
~FastFile_COD4_PS3(); ~FastFile_COD4_PS3();
QByteArray GetBinaryData() override; QByteArray GetBinaryData() const override;
bool Load(const QString aFilePath) override; bool Load(const QString aFilePath) override;
bool Load(const QByteArray aData) override; bool Load(const QByteArray aData) override;

View File

@ -39,7 +39,7 @@ FastFile_COD5_PS3::~FastFile_COD5_PS3() {
} }
QByteArray FastFile_COD5_PS3::GetBinaryData() { QByteArray FastFile_COD5_PS3::GetBinaryData() const {
return QByteArray(); return QByteArray();
} }
@ -111,10 +111,13 @@ bool FastFile_COD5_PS3::Load(const QByteArray aData) {
Utils::ExportData(GetBaseStem() + ".zone", decompressedData); Utils::ExportData(GetBaseStem() + ".zone", decompressedData);
ZoneFile_COD5_PS3 zoneFile; ZoneFile_COD5_PS3* zoneFile = new ZoneFile_COD5_PS3();
zoneFile.SetStem(GetBaseStem() + ".zone"); zoneFile->SetStem(GetBaseStem() + ".zone");
zoneFile.Load(decompressedData); if (!zoneFile->Load(decompressedData)) {
SetZoneFile(std::make_shared<ZoneFile_COD5_PS3>(zoneFile)); qWarning() << "Failed to load ZoneFile!";
return false;
}
SetZoneFile(zoneFile);
return true; return true;
} }

View File

@ -11,7 +11,7 @@ public:
FastFile_COD5_PS3(const QString aFilePath); FastFile_COD5_PS3(const QString aFilePath);
~FastFile_COD5_PS3(); ~FastFile_COD5_PS3();
QByteArray GetBinaryData() override; QByteArray GetBinaryData() const override;
bool Load(const QString aFilePath) override; bool Load(const QString aFilePath) override;
bool Load(const QByteArray aData) override; bool Load(const QByteArray aData) override;

View File

@ -39,7 +39,7 @@ FastFile_COD6_PS3::~FastFile_COD6_PS3() {
} }
QByteArray FastFile_COD6_PS3::GetBinaryData() { QByteArray FastFile_COD6_PS3::GetBinaryData() const {
return QByteArray(); return QByteArray();
} }
@ -95,10 +95,13 @@ bool FastFile_COD6_PS3::Load(const QByteArray aData) {
Utils::ExportData(GetBaseStem() + ".zone", decompressedData); Utils::ExportData(GetBaseStem() + ".zone", decompressedData);
ZoneFile_COD6_PS3 zoneFile; ZoneFile_COD6_PS3* zoneFile = new ZoneFile_COD6_PS3();
zoneFile.SetStem(GetBaseStem() + ".zone"); zoneFile->SetStem(GetBaseStem() + ".zone");
zoneFile.Load(decompressedData); if (!zoneFile->Load(decompressedData)) {
SetZoneFile(std::make_shared<ZoneFile_COD6_PS3>(zoneFile)); qWarning() << "Failed to load ZoneFile!";
return false;
}
SetZoneFile(zoneFile);
return true; return true;
} }

View File

@ -11,7 +11,7 @@ public:
FastFile_COD6_PS3(const QString aFilePath); FastFile_COD6_PS3(const QString aFilePath);
~FastFile_COD6_PS3(); ~FastFile_COD6_PS3();
QByteArray GetBinaryData() override; QByteArray GetBinaryData() const override;
bool Load(const QString aFilePath) override; bool Load(const QString aFilePath) override;
bool Load(const QByteArray aData) override; bool Load(const QByteArray aData) override;

View File

@ -39,7 +39,7 @@ FastFile_COD7_PS3::~FastFile_COD7_PS3() {
} }
QByteArray FastFile_COD7_PS3::GetBinaryData() { QByteArray FastFile_COD7_PS3::GetBinaryData() const {
return QByteArray(); return QByteArray();
} }
@ -87,8 +87,8 @@ bool FastFile_COD7_PS3::Load(const QByteArray aData) {
SetGame("COD7"); SetGame("COD7");
// Load the zone file with the decompressed data (using an Xbox platform flag). // Load the zone file with the decompressed data (using an Xbox platform flag).
ZoneFile_COD7_PS3 zoneFile; ZoneFile_COD7_PS3* zoneFile = new ZoneFile_COD7_PS3();
zoneFile.SetStem(GetBaseStem() + ".zone"); zoneFile->SetStem(GetBaseStem() + ".zone");
// For COD7/COD9, use BigEndian. // For COD7/COD9, use BigEndian.
fastFileStream.setByteOrder(QDataStream::BigEndian); fastFileStream.setByteOrder(QDataStream::BigEndian);
@ -164,10 +164,12 @@ bool FastFile_COD7_PS3::Load(const QByteArray aData) {
sectionIndex++; sectionIndex++;
} }
zoneFile.Load(decompressedData); if (!zoneFile->Load(decompressedData)) {
qWarning() << "Failed to load ZoneFile!";
return false;
} }
}
SetZoneFile(std::make_shared<ZoneFile_COD7_PS3>(zoneFile)); SetZoneFile(zoneFile);
return true; return true;
} }

View File

@ -11,7 +11,7 @@ public:
FastFile_COD7_PS3(const QString aFilePath); FastFile_COD7_PS3(const QString aFilePath);
~FastFile_COD7_PS3(); ~FastFile_COD7_PS3();
QByteArray GetBinaryData() override; QByteArray GetBinaryData() const override;
bool Load(const QString aFilePath) override; bool Load(const QString aFilePath) override;
bool Load(const QByteArray aData) override; bool Load(const QByteArray aData) override;

View File

@ -39,7 +39,7 @@ FastFile_COD8_PS3::~FastFile_COD8_PS3() {
} }
QByteArray FastFile_COD8_PS3::GetBinaryData() { QByteArray FastFile_COD8_PS3::GetBinaryData() const {
return QByteArray(); return QByteArray();
} }
@ -86,9 +86,8 @@ bool FastFile_COD8_PS3::Load(const QByteArray aData) {
SetPlatform(pCalculateFFPlatform(version)); SetPlatform(pCalculateFFPlatform(version));
SetGame("COD7"); SetGame("COD7");
// Load the zone file with the decompressed data (using an Xbox platform flag). ZoneFile_COD8_PS3* zoneFile = new ZoneFile_COD8_PS3();
ZoneFile_COD8_PS3 zoneFile; zoneFile->SetStem(GetBaseStem() + ".zone");
zoneFile.SetStem(GetBaseStem() + ".zone");
// For COD7/COD9, use BigEndian. // For COD7/COD9, use BigEndian.
fastFileStream.setByteOrder(QDataStream::BigEndian); fastFileStream.setByteOrder(QDataStream::BigEndian);
@ -164,10 +163,13 @@ bool FastFile_COD8_PS3::Load(const QByteArray aData) {
sectionIndex++; sectionIndex++;
} }
zoneFile.Load(decompressedData); if (!zoneFile->Load(decompressedData)) {
qWarning() << "Failed to load ZoneFile!";
return false;
}
} }
SetZoneFile(std::make_shared<ZoneFile_COD8_PS3>(zoneFile)); SetZoneFile(zoneFile);
return true; return true;
} }

View File

@ -11,7 +11,7 @@ public:
FastFile_COD8_PS3(const QString aFilePath); FastFile_COD8_PS3(const QString aFilePath);
~FastFile_COD8_PS3(); ~FastFile_COD8_PS3();
QByteArray GetBinaryData() override; QByteArray GetBinaryData() const override;
bool Load(const QString aFilePath) override; bool Load(const QString aFilePath) override;
bool Load(const QByteArray aData) override; bool Load(const QByteArray aData) override;

View File

@ -36,7 +36,7 @@ FastFile_COD9_PS3::~FastFile_COD9_PS3() {
} }
QByteArray FastFile_COD9_PS3::GetBinaryData() { QByteArray FastFile_COD9_PS3::GetBinaryData() const {
return QByteArray(); return QByteArray();
} }
@ -128,10 +128,13 @@ bool FastFile_COD9_PS3::Load(const QByteArray aData) {
} }
// Load the zone file with the decompressed data (using an Xbox platform flag). // Load the zone file with the decompressed data (using an Xbox platform flag).
ZoneFile_COD9_PS3 zoneFile; ZoneFile_COD9_PS3* zoneFile = new ZoneFile_COD9_PS3();
zoneFile.SetStem(GetBaseStem() + ".zone"); zoneFile->SetStem(GetBaseStem() + ".zone");
zoneFile.Load(decompressedData); if (!zoneFile->Load(decompressedData)) {
SetZoneFile(std::make_shared<ZoneFile_COD9_PS3>(zoneFile)); qWarning() << "Failed to load ZoneFile!";
return false;
}
SetZoneFile(zoneFile);
return true; return true;
} }

Some files were not shown because too many files have changed in this diff Show More