From 417aec53df44985a805e4d939211a5de5075b7be Mon Sep 17 00:00:00 2001 From: = Date: Fri, 10 Jan 2025 04:33:12 -0500 Subject: [PATCH 01/22] Remove dll from qrc. --- Data.qrc | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/Data.qrc b/Data.qrc index ef1b2c8..1f6b16a 100644 --- a/Data.qrc +++ b/Data.qrc @@ -21,7 +21,5 @@ data/d3dbsp/asset_viewer.d3dbsp data/d3dbsp/barebones.d3dbsp - - data/dlls/dxcompiler.dll - + From 885cf48ce4b3e3bd76a8a7b6f9f3cdd1015b7191 Mon Sep 17 00:00:00 2001 From: = Date: Fri, 10 Jan 2025 04:33:26 -0500 Subject: [PATCH 02/22] Comment dll from project file. --- FastFile_WaW.pro | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/FastFile_WaW.pro b/FastFile_WaW.pro index 9a488b9..dda019b 100644 --- a/FastFile_WaW.pro +++ b/FastFile_WaW.pro @@ -4,9 +4,9 @@ greaterThan(QT_MAJOR_VERSION, 4): QT += widgets CONFIG += c++17 -INCLUDEPATH += "C:/Program Files (x86)/Windows Kits/10/Include/10.0.26100.0/um" -LIBS += -L"C:/Program Files (x86)/Windows Kits/10/Lib/10.0.26100.0/um/x64" \ - -ldxcompiler +#INCLUDEPATH += "C:/Program Files (x86)/Windows Kits/10/Include/10.0.26100.0/um" +#LIBS += -L"C:/Program Files (x86)/Windows Kits/10/Lib/10.0.26100.0/um/x64" \ +# -ldxcompiler # You can make your code fail to compile if it uses deprecated APIs. # In order to do so, uncomment the following line. From 2854479b977b91750cc927364aac67a5e3d671eb Mon Sep 17 00:00:00 2001 From: = Date: Fri, 10 Jan 2025 04:34:04 -0500 Subject: [PATCH 03/22] Added a bunch of enums for menu file stuff. --- enums.h | 546 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 546 insertions(+) diff --git a/enums.h b/enums.h index 415bf63..e593546 100644 --- a/enums.h +++ b/enums.h @@ -98,4 +98,550 @@ enum BSPVERSION_TYPE BSPVERSION_COD_BO = 45 }; +enum MENU_ITEM_TYPE { + ITEM_TYPE_TEXT = 0, // simple text + ITEM_TYPE_BUTTON = 1, // button, basically text with a border + ITEM_TYPE_RADIOBUTTON = 2, // toggle button, may be grouped + ITEM_TYPE_CHECKBOX = 3, // check box + ITEM_TYPE_EDITFIELD = 4, // editable text, associated with a dvar + ITEM_TYPE_COMBO = 5, // drop down list + ITEM_TYPE_LISTBOX = 6, // scrollable list + ITEM_TYPE_MODEL = 7, // model + ITEM_TYPE_OWNERDRAW = 8, // owner draw, name specs what it is + ITEM_TYPE_NUMERICFIELD = 9, // editable text, associated with a dvar + ITEM_TYPE_SLIDER = 10, // mouse speed, volume, etc. + ITEM_TYPE_YESNO = 11, // yes no dvar setting + ITEM_TYPE_MULTI = 12, // multiple list setting, enumerated + ITEM_TYPE_DVARENUM = 13, // multiple list setting, enumerated from a dvar + ITEM_TYPE_BIND = 14, // bind + ITEM_TYPE_MENUMODEL = 15, // special menu model + ITEM_TYPE_VALIDFILEFIELD = 16, // text must be valid for use in a dos filename + ITEM_TYPE_DECIMALFIELD = 17, // editable text, associated with a dvar, which allows decimal input + ITEM_TYPE_UPREDITFIELD = 18, // editable text, associated with a dvar + ITEM_TYPE_GAME_MESSAGE_WINDOW = 19, // game message window + ITEM_TYPE_SCALEFORM = 20, // Flash movie for Scaleform GFx + ITEM_TYPE_BIND2 = 21, // bind2 +}; + +enum MENU_ITEM_H_ALIGN { + ITEM_ALIGN_LEFT = 0, // aligns left of text to left of containing rectangle + ITEM_ALIGN_CENTER = 1, // aligns center of text to center of containing rectangle + ITEM_ALIGN_RIGHT = 2, // aligns right of text to right of containing rectangle + ITEM_ALIGN_X_MASK = 3, +}; + +enum MENU_ITEM_V_ALIGN { + ITEM_ALIGN_LEGACY = 0, // aligns bottom of text to top of containing rectangle + ITEM_ALIGN_TOP = 4, // aligns top of text to top of containing rectangle + ITEM_ALIGN_MIDDLE = 8, // aligns middle of text to middle of containing rectangle + ITEM_ALIGN_BOTTOM = 12, // aligns bottom of text to bottom of containing rectangle + ITEM_ALIGN_Y_MASK = 12, +}; + +enum MENU_ITEM_ALIGN { + ITEM_ALIGN_LEGACY_LEFT = 0, + ITEM_ALIGN_LEGACY_CENTER = 1, + ITEM_ALIGN_LEGACY_RIGHT = 2, + ITEM_ALIGN_TOP_LEFT = 4, + ITEM_ALIGN_TOP_CENTER = 5, + ITEM_ALIGN_TOP_RIGHT = 6, + ITEM_ALIGN_MIDDLE_LEFT = 8, + ITEM_ALIGN_MIDDLE_CENTER = 9, + ITEM_ALIGN_MIDDLE_RIGHT = 10, + ITEM_ALIGN_BOTTOM_LEFT = 12, + ITEM_ALIGN_BOTTOM_CENTER = 13, + ITEM_ALIGN_BOTTOM_RIGHT = 14 +}; + +enum MENU_ITEM_TEXTSTYLE { + ITEM_TEXTSTYLE_NORMAL = 0, // normal text + ITEM_TEXTSTYLE_BLINK = 1, // fast blinking + ITEM_TEXTSTYLE_SHADOWED = 3, // drop shadow ( need a color for this ) + ITEM_TEXTSTYLE_SHADOWEDMORE = 6, // drop shadow ( need a color for this ) + ITEM_TEXTSTYLE_MONOSPACE = 128 +}; + +enum MENU_WINDOW_BORDER { + WINDOW_BORDER_NONE = 0, // no border + WINDOW_BORDER_FULL = 1, // full border based on border color ( single pixel ) + WINDOW_BORDER_HORZ = 2, // horizontal borders only + WINDOW_BORDER_VERT = 3, // vertical borders only + WINDOW_BORDER_KCGRADIENT = 4, // horizontal border using the gradient bars + WINDOW_BORDER_RAISED = 5, // darken the bottom and right sides of the border + WINDOW_BORDER_SUNKEN = 6 // darken the top and left sides of the border +}; + +enum MENU_WINDOW_STYLE { + WINDOW_STYLE_EMPTY = 0, // no background + WINDOW_STYLE_FILLED = 1, // filled with background color + WINDOW_STYLE_GRADIENT = 2, // gradient bar based on background color + WINDOW_STYLE_SHADER = 3, // shader based on background color + WINDOW_STYLE_TEAMCOLOR = 4, // team color + WINDOW_STYLE_DVAR_SHADER = 5, // draws the shader specified by the dvar + WINDOW_STYLE_LOADBAR = 6, // shader based on background color +}; + +enum MENU_MODE { + MODE_BOTTOMUP_ALIGN_TOP = 0, // text appears on bottom of list and moves up to specified Y coordinate as old text fades out + MODE_BOTTOMUP_ALIGN_BOTTOM = 1, // text appears on bottom of list and moves away from specified Y coordinate as new text pushes it up + MODE_TOPDOWN_ALIGN_TOP = 2, // text appears on top of list and moves away from specified Y coordinate as new text pushes it down + MODE_TOPDOWN_ALIGN_BOTTOM = 3 // text appears on top of list and moves down to specified Y coordinate as old text fades out +}; + +enum MENU_BOOL { + MENU_TRUE = 1, + MENU_FALSE = 0 +}; + +enum MENU_ORIENTATION { + HUD_VERTICAL = 0x00, + HUD_HORIZONTAL = 0x01 +}; + +enum MENU_RANGETYPE { + RANGETYPE_ABSOLUTE = 0, + RANGETYPE_RELATIVE = 1 +}; + +// list box element types +enum MENU_LIST_BOX { + LISTBOX_TEXT = 0x00, + LISTBOX_IMAGE = 0x01 +}; + +// list feeders +enum MENU_FEEDERS { + FEEDER_HEADS = 0x00, // model heads + FEEDER_MAPS = 0x01, // text maps based on game type + FEEDER_SERVERS = 0x02, // servers + FEEDER_CLAN_MEMBERS = 0x03, // clan names + FEEDER_ALLMAPS = 0x04, // all maps available, in graphic format + FEEDER_REDTEAM_LIST = 0x05, // red team members + FEEDER_BLUETEAM_LIST = 0x06, // blue team members + FEEDER_PLAYER_LIST = 0x07, // players + FEEDER_TEAM_LIST = 0x08, // team members for team voting + FEEDER_MODS = 0x09, // team members for team voting + FEEDER_DEMOS = 0x0a, // team members for team voting + FEEDER_SCOREBOARD = 0x0b, // team members for team voting + FEEDER_Q3HEADS = 0x0c, // model heads + FEEDER_SERVERSTATUS = 0x0d, // server status + FEEDER_FINDPLAYER = 0x0e, // find player + FEEDER_CINEMATICS = 0x0f, // cinematics + FEEDER_SAVEGAMES = 0x10, // savegames + FEEDER_PICKSPAWN = 0x11, // pickspawn + FEEDER_LOBBY_MEMBERS = 0x12, // list of players in your party + FEEDER_LOBBY_MEMBERS_TALK = 0x13, // icon for whether they are speaking or not + FEEDER_MUTELIST = 0x14, // list of musted players + FEEDER_PLAYERSTALKING = 0x15, // list of players who are currently talking + FEEDER_SPLITSCREENPLAYERS = 0x16, // list of all players who are playing splitscreen + FEEDER_LOBBY_MEMBERS_READY = 0x17, // icon for whether they are ready or not + FEEDER_PLAYER_PROFILES = 0x18, // player profiles + FEEDER_PARTY_MEMBERS = 0x19, // list of players in your party + FEEDER_PARTY_MEMBERS_TALK = 0x1a, // icon for whether they are speaking or not + FEEDER_PARTY_MEMBERS_READY = 0x1b, // icon for whether they are ready or not + FEEDER_PLAYLISTS = 0x1c, // list of all playlists + FEEDER_GAMEMODES = 0x1d, // list of all game type modes, including any player custom modes + FEEDER_CATEGORIES = 0x1e, // list of all categories + FEEDER_LEADERBOARD = 0x1f, // list of rows for a leaderboard + FEEDER_MYTEAM_MEMBERS = 0x20, // list of marine team members + FEEDER_MYTEAM_MEMBERS_TALK = 0x21, // icon for whether they are speaking + FEEDER_ENEMY_MEMBERS = 0x22, // list of opfor team members + FEEDER_ENEMY_MEMBERS_TALK = 0x23, // icon for whether they are speaking + FEEDER_LOBBY_MEMBERS_STAT = 0x24, // last round stats for lobby members + FEEDER_MYTEAM_MEMBERS_STAT = 0x25, // last round stats for marine team members + FEEDER_ENEMY_MEMBERS_STAT = 0x26, // last round stats for opfor team members + FEEDER_ONLINEFRIENDS = 0x27, // list of your online friends + FEEDER_LOBBY_MEMBERS_RANK = 0x28, // rank icon + FEEDER_PARTY_MEMBERS_RANK = 0x29, // rank icon + FEEDER_ENEMY_MEMBERS_RANK = 0x2a, // rank icon + FEEDER_MYTEAM_MEMBERS_RANK = 0x2b, // rank icon + FEEDER_TESTMAPS = 0x2c, // department test maps + FEEDER_SYSTEMLINK_LOBBY_MEMBERS = 0x2d, // list of players in a system link lobby + FEEDER_LOBBY_MEMBERS_CONTROLLER = 0x2e, // icon for controller quadrant for splitscreen + FEEDER_PARTY_MEMBERS_CONTROLLER = 0x2f, // icon for controller quadrant for splitscreen + FEEDER_MYTEAM_MEMBERS_SQUAD = 0x30, // squad icon + FEEDER_ENEMY_MEMBERS_SQUAD = 0x31, // squad icon + FEEDER_INGAME_SQUAD_MEMBERS = 0x32, // Squad members displayed in MP 'Pause' menu + FEEDER_INGAME_SQUAD_MEMBERS_FULL = 0x33, // Squad members' name, rank, talk, leader displayed in PC MP 'Pause' menu + FEEDER_INGAME_SQUAD_NAMES = 0x34, // Squad names displayed in MP 'Join Squad' menu + FEEDER_INGAME_SQUAD_NAMES2 = 0x35, // Squad names displayed in MP 'Pause' menu + FEEDER_INGAME_SQUAD_NAMES_FULL = 0x36, // Squad names, lock, invite displayed in PC MP 'Pause' menu + FEEDER_CUSTOM_GAMETYPES = 0x37, // list of all the gametypes for custom matches + FEEDER_INGAME_SQUAD_MEMBER_RANK = 0x38, // Squad members' rank displayed in MP 'Pause' menu + FEEDER_INGAME_SQUAD_MEMBER_TALK = 0x39, // Squad members' talk icon displayed in MP 'Pause' menu + FEEDER_INGAME_SQUAD_LOCKED = 0x3a, // Squad lock icon displayed in MP 'Pause' menu + FEEDER_INGAME_SQUAD_MEMBER_INVITED = 0x3b, // Squad invite icon displayed in MP 'Pause' menu + FEEDER_INGAME_SQUAD_INVITE = 0x3c, // Squad invite icon displayed in MP 'Join Squad' menu + FEEDER_INGAME_SQUAD_LEADER = 0x3d, // Squad leader icon displayled in MP 'Pause' menu + FEEDER_FRIENDS = 0x3e, // list of your friends + FEEDER_PENDINGFRIENDS = 0x3f, // list of your pending friends + FEEDER_INVITES = 0x40, // list of the game invites from your friends +}; + +// display flags +enum MENU_DISPLAY_FLAG { + CG_SHOW_BLUE_TEAM_HAS_REDFLAG = 0x00000001, + CG_SHOW_RED_TEAM_HAS_BLUEFLAG = 0x00000002, + CG_SHOW_ANYTEAMGAME = 0x00000004, + CG_SHOW_CTF = 0x00000020, + CG_SHOW_OBELISK = 0x00000040, + CG_SHOW_HEALTHCRITICAL = 0x00000080, + CG_SHOW_SINGLEPLAYER = 0x00000100, + CG_SHOW_TOURNAMENT = 0x00000200, + CG_SHOW_DURINGINCOMINGVOICE = 0x00000400, + CG_SHOW_IF_PLAYER_HAS_FLAG = 0x00000800, + CG_SHOW_LANPLAYONLY = 0x00001000, + CG_SHOW_MINED = 0x00002000, + CG_SHOW_HEALTHOK = 0x00004000, + CG_SHOW_TEAMINFO = 0x00008000, + CG_SHOW_NOTEAMINFO = 0x00010000, + CG_SHOW_OTHERTEAMHASFLAG = 0x00020000, + CG_SHOW_YOURTEAMHASENEMYFLAG = 0x00040000, + CG_SHOW_ANYNONTEAMGAME = 0x00080000, + CG_SHOW_TEXTASINT = 0x00200000, + CG_SHOW_HIGHLIGHTED = 0x00100000, + CG_SHOW_NOT_V_CLEAR = 0x02000000, + CG_SHOW_2DONLY = 0x10000000 +}; + +enum MENU_UI_FLAG{ + UI_SHOW_LEADER = 0x00000001, + UI_SHOW_NOTLEADER = 0x00000002, + UI_SHOW_FAVORITESERVERS = 0x00000004, + UI_SHOW_ANYNONTEAMGAME = 0x00000008, + UI_SHOW_ANYTEAMGAME = 0x00000010, + UI_SHOW_NEWHIGHSCORE = 0x00000020, + UI_SHOW_DEMOAVAILABLE = 0x00000040, + UI_SHOW_NEWBESTTIME = 0x00000080, + UI_SHOW_FFA = 0x00000100, + UI_SHOW_NOTFFA = 0x00000200, + UI_SHOW_NETANYNONTEAMGAME = 0x00000400, + UI_SHOW_NETANYTEAMGAME = 0x00000800, + UI_SHOW_NOTFAVORITESERVERS = 0x00001000 +}; + +// font types +enum MENU_FONT_TYPE{ + UI_FONT_DEFAULT = 0, // auto-chose betwen big/reg/small + UI_FONT_NORMAL = 1, + UI_FONT_BIG = 2, + UI_FONT_SMALL = 3, + UI_FONT_BOLD = 4, + UI_FONT_CONSOLE = 5, + UI_FONT_OBJECTIVE = 6, + UI_FONT_MAX = 6, +}; + +// owner draw types +// ideally these should be done outside of this file but +// this makes it much easier for the macro expansion to +// convert them for the designers ( from the .menu files ) +enum MENU_OWNER_DRAW_TYPE { + CG_OWNERDRAW_BASE = 1, + CG_PLAYER_AMMO_VALUE = 5, + CG_PLAYER_AMMO_BACKDROP = 6, + CG_PLAYER_HEAT_VALUE = 7, + CG_PLAYER_STANCE = 20, + CG_SPECTATORS = 60, + CG_HOLD_BREATH_HINT = 71, + CG_CURSORHINT = 72, + CG_PLAYER_POWERUP = 73, + CG_PLAYER_HOLDABLE = 74, + CG_PLAYER_INVENTORY = 75, + CG_CURSORHINT_STATUS = 78, // like 'health' bar when pointing at a func_explosive + CG_PLAYER_BAR_HEALTH = 79, + CG_MANTLE_HINT = 80, + CG_PLAYER_WEAPON_NAME = 81, + CG_PLAYER_WEAPON_NAME_BACK = 82, + CG_CENTER_MESSAGE = 90, // for things like "You were killed by ..." + CG_TANK_BODY_DIR = 95, + CG_TANK_BARREL_DIR = 96, + CG_DEADQUOTE = 97, + CG_PLAYER_BAR_HEALTH_BACK = 98, + CG_MISSION_OBJECTIVE_HEADER = 99, + CG_MISSION_OBJECTIVE_LIST = 100, + CG_MISSION_OBJECTIVE_BACKDROP = 101, + CG_PAUSED_MENU_LINE = 102, + CG_OFFHAND_WEAPON_ICON_FRAG = 103, + CG_OFFHAND_WEAPON_ICON_SMOKEFLASH = 104, + CG_OFFHAND_WEAPON_AMMO_FRAG = 105, + CG_OFFHAND_WEAPON_AMMO_SMOKEFLASH = 106, + CG_OFFHAND_WEAPON_NAME_FRAG = 107, + CG_OFFHAND_WEAPON_NAME_SMOKEFLASH = 108, + CG_OFFHAND_WEAPON_SELECT_FRAG = 109, + CG_OFFHAND_WEAPON_SELECT_SMOKEFLASH = 110, + CG_SAVING = 111, + CG_PLAYER_LOW_HEALTH_OVERLAY = 112, + CG_INVALID_CMD_HINT = 113, + CG_PLAYER_SPRINT_METER = 114, + CG_PLAYER_SPRINT_BACK = 115, + CG_PLAYER_WEAPON_BACKGROUND = 116, + CG_PLAYER_WEAPON_AMMO_CLIP_GRAPHIC = 117, + CG_PLAYER_WEAPON_PRIMARY_ICON = 118, + CG_PLAYER_WEAPON_AMMO_STOCK = 119, + CG_PLAYER_WEAPON_LOW_AMMO_WARNING = 120, + CG_BATTLE_COMPASS_MARKERS = 122, + CG_BATTLE_FULLMAP_MARKERS = 123, + CG_SUCCESSFUL_CMD_HINT = 130, + CG_WAR_TEXT = 135, + CG_PLAYER_COMPASS_TICKERTAPE = 145, + CG_PLAYER_COMPASS_TICKERTAPE_NO_OBJ = 146, + CG_PLAYER_COMPASS_DOGS = 147, + CG_PLAYER_COMPASS_ARTILLERY_ICON = 148, + CG_PLAYER_COMPASS_SQUAD_OBJECTIVE = 149, + CG_PLAYER_COMPASS_PLAYER = 150, + CG_PLAYER_COMPASS_BACK = 151, + CG_PLAYER_COMPASS_POINTERS = 152, + CG_PLAYER_COMPASS_ACTORS = 153, + CG_PLAYER_COMPASS_TANKS = 154, + CG_PLAYER_COMPASS_HELICOPTERS = 155, + CG_PLAYER_COMPASS_PLANES = 156, + CG_PLAYER_COMPASS_AUTOMOBILES = 157, + CG_PLAYER_COMPASS_FRIENDS = 158, + CG_PLAYER_COMPASS_MAP = 159, + CG_PLAYER_COMPASS_NORTHCOORD = 160, + CG_PLAYER_COMPASS_EASTCOORD = 161, + CG_PLAYER_COMPASS_NCOORD_SCROLL = 162, + CG_PLAYER_COMPASS_ECOORD_SCROLL = 163, + CG_PLAYER_COMPASS_GOALDISTANCE = 164, + CG_PLAYER_ACTIONSLOT_DPAD = 165, + CG_PLAYER_ACTIONSLOT_1 = 166, + CG_PLAYER_ACTIONSLOT_2 = 167, + CG_PLAYER_ACTIONSLOT_3 = 168, + CG_PLAYER_ACTIONSLOT_4 = 169, + CG_PLAYER_COMPASS_ENEMIES = 170, + CG_PLAYER_FULLMAP_DOGS = 176, + CG_PLAYER_FULLMAP_VEHICLES = 177, + CG_PLAYER_FULLMAP_ARTILLERY_ICON = 178, + CG_PLAYER_FULLMAP_SQUAD_OBJECTIVE = 179, + CG_PLAYER_FULLMAP_BACK = 180, + CG_PLAYER_FULLMAP_MAP = 181, + CG_PLAYER_FULLMAP_POINTERS = 182, + CG_PLAYER_FULLMAP_PLAYER = 183, + CG_PLAYER_FULLMAP_ACTORS = 184, + CG_PLAYER_FULLMAP_FRIENDS = 185, + CG_PLAYER_FULLMAP_LOCATION_SELECTOR = 186, + CG_PLAYER_FULLMAP_BORDER = 187, + CG_PLAYER_FULLMAP_ENEMIES = 188, + CG_PLAYER_COMPASS = 189, + CG_VEHICLE_RETICLE = 190, + CG_HUD_TARGETS_VEHICLE = 191, + CG_HUD_TARGETS_JAVELIN = 192, + CG_TALKER1 = 193, + CG_TALKER2 = 194, + CG_TALKER3 = 195, + CG_TALKER4 = 196, + CG_FRIENDLYARROWS = 197, + CG_FRIENDLYNAMES = 198, + UI_OWNERDRAW_BASE = 200, + UI_HANDICAP = 200, + UI_EFFECTS = 201, + UI_PLAYERMODEL = 202, + UI_GAMETYPE = 205, + UI_SKILL = 207, + UI_NETSOURCE = 220, + UI_NETFILTER = 222, + UI_VOTE_KICK = 238, + UI_NETGAMETYPE = 245, + UI_SERVERREFRESHDATE = 247, + UI_SERVERMOTD = 248, + UI_GLINFO = 249, + UI_KEYBINDSTATUS = 250, + UI_JOINGAMETYPE = 253, + UI_MAPPREVIEW = 254, + UI_MENUMODEL = 257, + UI_SAVEGAME_SHOT = 258, + UI_SAVEGAMENAME = 262, + UI_SAVEGAMEINFO = 263, + UI_LOADPROFILING = 264, + UI_RECORDLEVEL = 265, + UI_AMITALKING = 266, + UI_TALKER1 = 267, + UI_TALKER2 = 268, + UI_TALKER3 = 269, + UI_TALKER4 = 270, + UI_PARTYSTATUS = 271, + UI_LOGGEDINUSER = 272, + UI_RESERVEDSLOTS = 273, + UI_PLAYLISTNAME = 274, + UI_PLAYLISTDESCRIPTION = 275, + UI_USERNAME = 276, + UI_CINEMATIC = 277, + UI_TOTALONLINE = 278, + UI_CATEGORYNAME = 279, + UI_CATEGORYDESCRIPTION = 280, + UI_PLAYLISTICON = 281, + UI_CATEGORYICON = 282, + UI_GAMETYPE_MAPNAME = 283, + CG_HUD_WAR_MOMENTUM_PROGRESS = 284, + CG_HUD_WAR_MOMENTUM_MULTIPLIER = 285, + CG_HUD_WAR_MOMENTUM_MULTIPLIER_DETAIL = 286, + CG_HUD_WAR_MOMENTUM_MULTIPLIER_BLITZKRIEG = 287, + CG_COMPETITIVE_MODE_SCORES = 288, + UI_LOAD_STATUS_SCREEN = 289, + UI_LEADERBOARD_GAMEMODE = 290, + CG_PLAYER_ACTIONSLOT_BACK_1 = 290, + CG_PLAYER_ACTIONSLOT_BACK_2 = 291, + CG_PLAYER_ACTIONSLOT_BACK_3 = 292, + CG_PLAYER_ACTIONSLOT_BACK_4 = 293, + CG_PLAYER_ACTIONSLOT_ARROW_1 = 294, + CG_PLAYER_ACTIONSLOT_ARROW_2 = 295, + CG_PLAYER_ACTIONSLOT_ARROW_3 = 296, + CG_PLAYER_ACTIONSLOT_ARROW_4 = 297, + UI_DIFFICULTY_INFO = 298, + UI_DIFFICULTY_ICON = 299, + UI_LOBBY_CHAT = 300 +}; + +// Edge relative placement values for rect->h_align and rect->v_align +enum MENU_H_ALIGNMENT { + HORIZONTAL_ALIGN_SUBLEFT = 0, // left edge of a 4:3 screen (safe area not included) + HORIZONTAL_ALIGN_LEFT = 1, // left viewable (safe area) edge + HORIZONTAL_ALIGN_CENTER = 2, // center of the screen (reticle) + HORIZONTAL_ALIGN_RIGHT = 3, // right viewable (safe area) edge + HORIZONTAL_ALIGN_FULLSCREEN = 4, // disregards safe area + HORIZONTAL_ALIGN_NOSCALE = 5, // uses exact parameters - neither adjusts for safe area nor scales for screen size + HORIZONTAL_ALIGN_TO640 = 6, // scales a real-screen resolution x down into the 0 - 640 range + HORIZONTAL_ALIGN_CENTER_SAFEAREA = 7, // center of the safearea + HORIZONTAL_ALIGN_MAX = HORIZONTAL_ALIGN_CENTER_SAFEAREA, + HORIZONTAL_ALIGN_DEFAULT = HORIZONTAL_ALIGN_SUBLEFT +}; + +enum MENU_V_ALIGNMENT { + VERTICAL_ALIGN_SUBTOP = 0, // top edge of the 4:3 screen (safe area not included) + VERTICAL_ALIGN_TOP = 1, // top viewable (safe area) edge + VERTICAL_ALIGN_CENTER = 2, // center of the screen (reticle) + VERTICAL_ALIGN_BOTTOM = 3, // bottom viewable (safe area) edge + VERTICAL_ALIGN_FULLSCREEN = 4, // disregards safe area + VERTICAL_ALIGN_NOSCALE = 5, // uses exact parameters - neither adjusts for safe area nor scales for screen size + VERTICAL_ALIGN_TO480 = 6, // scales a real-screen resolution y down into the 0 - 480 range + VERTICAL_ALIGN_CENTER_SAFEAREA = 7, // center of the save area + VERTICAL_ALIGN_MAX = VERTICAL_ALIGN_CENTER_SAFEAREA, + VERTICAL_ALIGN_DEFAULT = VERTICAL_ALIGN_SUBTOP +}; + +enum MENU_BUTTON { + BUTTON_A = 1, + BUTTON_B = 2, + BUTTON_X = 3, + BUTTON_Y = 4, + BUTTON_LSHLDR = 5, + BUTTON_RSHLDR = 6, + BUTTON_START = 14, + BUTTON_BACK = 15, + BUTTON_LSTICK = 16, + BUTTON_RSTICK = 17, + BUTTON_LTRIG = 18, + BUTTON_RTRIG = 19, + DPAD_UP = 20, + DPAD_DOWN = 21, + DPAD_LEFT = 22, + DPAD_RIGHT = 23, + APAD_UP = 28, + APAD_DOWN = 29, + APAD_LEFT = 30, + APAD_RIGHT = 31 +}; + +// Change this depending on the platform +// PC +#define DEVMAP_LEVEL_FIRST "devmap intro_pac" +#define DEVMAP "devmap" +// Not PC +// #define DEVMAP_LEVEL_FIRST "map intro_pac" +// #define DEVMAP "map" + +// Remove this to restore full frontend instead of limited EPD frontend +#define COOP_EPD 0 + +// LDS - This enables a German SKU with Nazi Zombies enabled *SHOULD BE SET TO 0 IF NOT APPROVED* +#define GERMAN_ZOMBIE_BUILD 0 + +#define DEVMAP_LEVEL_TRAINING "devmap training" +#define LEVEL_FIRST "intro_pac" +#define LEVEL_TRAINING "training" +#define FIRST_PLAYABLE_CAMPAIGN_LEVEL "mak" +#define FIRST_PLAYABLE_ZOMBIE_LEVEL "nazi_zombie_prototype" + +// Size define for the hud compass +// These are used for both the dynamic & non-dynamic compass drawing +// If these are changed, the cgame should be recompiled +#define COMPASS_SIZE 160 +#define MINIMAP_X 11.5 +#define MINIMAP_Y 5 +#define MINIMAP_W 89.5 +#define MINIMAP_H 89.5 + +#define COMPASS_SIZE_MP 125 +#define MINIMAP_X_MP 0 +#define MINIMAP_Y_MP 12 +#define MINIMAP_W_MP 102 +#define MINIMAP_H_MP 102 + +#define FULLSCREEN 0 0 640 480 +#define FULLSCREEN_WIDE -107 0 854 480 + +// PC +#define ORIGIN_TITLE 30 34 +// Not PC +// #define ORIGIN_TITLE 0 0 + +#define ORIGIN_TITLE_SS 104 120 + +#define FONTSCALE_SMALL 0.3095 //0.3750 // <-- COD4 // COD5 --> 0.30952//0.35897//0.24138 //14 pt //0.2900 //0.2750 // 18 +#define FONTSCALE_LOBBY 0.26 // <--Slate // 0.3010 <-- Slate Compressed // 0.3750 // <-- COD4 CONDUIT ITC small +#define FONTSCALE_NORMAL 0.3810 //0.35897//0.4583 +#define FONTSCALE_BOLD 0.5476 //0.4583 +#define FONTSCALE_BIG 0.5476 //0.5833 +#define FONTSCALE_EXTRABIG 1 //1.0000 + +// new settings +#define TEXTSIZE_SMALL FONTSCALE_SMALL +#define TEXTSIZE_SMALL_SS (FONTSCALE_SMALL*2) +#define TEXTSIZE_DEFAULT FONTSCALE_NORMAL +#define TEXTSIZE_DEFAULT_SS (FONTSCALE_NORMAL*2) +#define TEXTSIZE_TITLE FONTSCALE_BIG +#define TEXTSIZE_TITLE_SS 1 + +#define TEXTSIZE_BOLD TEXTSIZE_DEFAULT +#define TEXTSIZE_BIG TEXTSIZE_TITLE + +//#define COLOR_TITLE 1 0.8 0.4 1 +#define COLOR_TITLE 1 1 1 1 +#define COLOR_HEADER 0.69 0.69 0.69 1 +#define COLOR_FOCUSED 0.95294 0.72156 0.21176 1 //1 0.788 0.129 1 +//#define COLOR_FOCUS_YELLOW 0.95294 0.72156 0.21176 1 +#define COLOR_UNFOCUSED 0.4823 0.4823 0.4823 1 +//#define COLOR_DISABLED 0.35 0.35 0.35 1 +#define COLOR_SAFEAREA 0 0 1 1 + +#define COLOR_INFO_YELLOW COLOR_FOCUSED//1 0.84706 0 1 +#define COLOR_TEXT 0.84313 0.84313 0.84313 1 +#define COLOR_DISABLED 0.34118 0.36863 0.37647 1 +#define COLOR_TITLEBAR 0.14510 0.16078 0.16862 0.3//1 +#define COLOR_RED_TEXT 0.69020 0.00784 0.00784 1 + +#define COLOR_FADEOUT 0.09412 0.09412 0.04912 0.65 + +#define COLOR_BODY_TEXT 0.62745 0.66667 0.67451 1 + +#define COLOR_USMC 0 0.0196 0.41 +#define COLOR_JPN 0.53 0.027 0.027 +#define COLOR_USSR 0.368 0.035 0.035 +#define COLOR_GER 0.937 0.9 0.607 + +#define DEFAULT_MP_CFG "default_mp.cfg" +#define SPLITSCREEN_MP_CFG "default_splitscreen.cfg" +#define SYSTEMLINK_MP_CFG "default_systemlink.cfg" +#define XBOXLIVE_MP_CFG "default_xboxlive.cfg" + +#define MAX_RANK int(tableLookup( "mp/rankTable.csv", 0, "maxrank", 1)) +#define MAX_PRESTIGE int(tableLookup( "mp/rankIconTable.csv", 0, "maxprestige", 1)) + +#define PRESTIGE_AVAIL (stat(2326) < MAX_PRESTIGE && stat(2301) == int(tableLookup("mp/rankTable.csv",0,MAX_RANK,7))) +#define PRESTIGE_NEXT (stat(2326) < MAX_PRESTIGE && stat(252) == MAX_RANK) +#define PRESTIGE_FINISH (stat(2326) == MAX_PRESTIGE) + +#define CAN_RANK_UP (stat(252) < MAX_RANK || stat(2326) < MAX_PRESTIGE) + #endif // ENUMS_H From c165a537a01d2c5ec49b77f384a639f7ccdee8b6 Mon Sep 17 00:00:00 2001 From: = Date: Fri, 10 Jan 2025 04:35:03 -0500 Subject: [PATCH 04/22] Add menu bar and recent file feature. --- mainwindow.cpp | 21 +++++++++++++++++++++ mainwindow.h | 19 ++++++++++++++++--- 2 files changed, 37 insertions(+), 3 deletions(-) diff --git a/mainwindow.cpp b/mainwindow.cpp index 8cd2ff6..46a2204 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -15,6 +15,20 @@ MainWindow::MainWindow(QWidget *parent) mDiskLumpCount = 0; mDiskLumpOrder = QVector(); mLumps = QMap(); + mRecentFiles = QQueue(); + mSettingsValid = false; + mRecentFileActions = QVector(); + + const QString appSettingsPath = QDir::currentPath() + "/appSettings.ini"; + QSettings appSettings(appSettingsPath, QSettings::IniFormat); + if (appSettings.contains("mRecentFiles")) { + mSettingsValid = true; + + QStringList recentFiles = appSettings.value("mRecentFiles").toStringList(); + foreach (QString recentFile, recentFiles) { + mRecentFiles.enqueue(recentFile); + } + } connect(ui->treeWidget_Scripts, &QTreeWidget::itemSelectionChanged, this, &MainWindow::ScriptSelected); connect(ui->comboBox_StringTable, &QComboBox::currentTextChanged, this, &MainWindow::StrTableSelected); @@ -114,6 +128,10 @@ MainWindow::MainWindow(QWidget *parent) } MainWindow::~MainWindow() { + const QString appSettingsPath = QDir::currentPath() + "/appSettings.ini"; + QSettings appSettings(appSettingsPath, QSettings::IniFormat); + appSettings.setValue("mRecentFiles", mRecentFiles.toList()); + delete ui; } @@ -193,6 +211,9 @@ void MainWindow::Reset() { mRawFileMap.clear(); mTreeMap.clear(); mStrTableMap.clear(); + + // Refresh recent files + RefreshRecentFileMenu(); } void MainWindow::StrTableSelected(QString aStrTableName) { diff --git a/mainwindow.h b/mainwindow.h index e1d1296..76ebd33 100644 --- a/mainwindow.h +++ b/mainwindow.h @@ -12,6 +12,8 @@ #include #include #include +#include +#include #include #include @@ -84,9 +86,16 @@ private slots: void on_pushButton_FastFile_clicked(); void on_pushButton_FastFile_2_clicked(); - QFile *OpenFastFile(); - QFile *OpenZoneFile(); - void ParseFFHeader(QFile *aFastFilePtr); + void LogOpenedFile(QString aFileName); + void RefreshRecentFileMenu(); + + QString GetFastFilePath(); + QString GetZoneFilePath(); + + QByteArray OpenFastFile(QString aFastFilePath); + QByteArray OpenZoneFile(QString aZoneFilePath); + + void ParseFFHeader(QByteArray aFastFileData); void ParseFFCompany(QDataStream *aFastFileStream); void ParseFFFileType(QDataStream *afastFileStream); void ParseFFSignage(QDataStream *afastFileStream); @@ -141,6 +150,10 @@ private: QMap mRawFileMap; QMap mTreeMap; QMap>> mStrTableMap; + QQueue mRecentFiles; + bool mSettingsValid; + + QVector mRecentFileActions; quint32 mBSPVersion; quint32 mDiskLumpCount; From 14f6a481f5b3d72101136ddbb42219a8caa516a7 Mon Sep 17 00:00:00 2001 From: = Date: Fri, 10 Jan 2025 04:35:45 -0500 Subject: [PATCH 05/22] Started working on parsing menu files. --- mainwindow.cpp | 434 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 434 insertions(+) diff --git a/mainwindow.cpp b/mainwindow.cpp index 46a2204..b4a494c 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -53,6 +53,9 @@ MainWindow::MainWindow(QWidget *parent) ui->tableWidget_Order->setShowGrid(false); ui->tableWidget_Order->setStyleSheet("QTableView {selection-background-color: red;}"); + ui->treeWidget_Menus->setHeaderLabels({"Components", "Description"}); + ui->treeWidget_Menus->setColumnWidth(0, width() / 4 * 3); // Name column + Qt3DExtras::Qt3DWindow *view = new Qt3DExtras::Qt3DWindow(); view->defaultFrameGraph()->setClearColor(QColor(QRgb(0x4d4d4f))); @@ -910,6 +913,437 @@ void MainWindow::ParseAsset_XAnim(QDataStream *aZoneFileStream) { void MainWindow::ParseAsset_MenuFile(QDataStream *aZoneFileStream) { //MENU_FILE + aZoneFileStream->skipRawData(4); // Separator + + // Parse menu def count + quint32 menuDefCount; + *aZoneFileStream >> menuDefCount; + + if (menuDefCount > 1000) { return; } + for (int i = 0; i < menuDefCount; i++) { + aZoneFileStream->skipRawData(4); // Separator + + // Read in x_anim file name + QString menuFilepath; + char menuFilepathChar; + *aZoneFileStream >> menuFilepathChar; + while (menuFilepathChar != 0) { + menuFilepath += menuFilepathChar; + *aZoneFileStream >> menuFilepathChar; + } + qDebug() << "Parsing " << menuFilepath; + + QTreeWidgetItem *menuFilePathNode = new QTreeWidgetItem(ui->treeWidget_Menus); + + aZoneFileStream->skipRawData(4); // Separator + + QByteArray menuNamePtr(4, Qt::Uninitialized); + aZoneFileStream->readRawData(menuNamePtr.data(), 4); + QTreeWidgetItem *menuNamePtrNode = new QTreeWidgetItem(menuFilePathNode); + menuNamePtrNode->setText(0, QString("Menu name ptr: %1").arg(menuNamePtr.toHex().toUpper())); + + QTreeWidgetItem *menuRectNode = new QTreeWidgetItem(menuFilePathNode); + menuRectNode->setText(0, "Menu Rect"); + + float menuRectX, menuRectY, menuRectWidth, menuRectHeight; + *aZoneFileStream >> menuRectX >> menuRectY >> menuRectWidth >> menuRectHeight; + QTreeWidgetItem *menuRectXNode = new QTreeWidgetItem(menuRectNode); + menuRectXNode->setText(0, QString("X: %1").arg(menuRectX)); + QTreeWidgetItem *menuRectYNode = new QTreeWidgetItem(menuRectNode); + menuRectYNode->setText(0, QString("Y: %1").arg(menuRectY)); + QTreeWidgetItem *menuRectWidthNode = new QTreeWidgetItem(menuRectNode); + menuRectWidthNode->setText(0, QString("Width: %1").arg(menuRectWidth)); + QTreeWidgetItem *menuRectHeightNode = new QTreeWidgetItem(menuRectNode); + menuRectHeightNode->setText(0, QString("Height: %1").arg(menuRectHeight)); + + MENU_H_ALIGNMENT hAlign; + *aZoneFileStream >> hAlign; + QTreeWidgetItem *hAlignNode = new QTreeWidgetItem(menuRectNode); + QString hAlignStr = Utils::MenuHAlignToStr(hAlign); + hAlignNode->setText(0, QString("Horiz. Align: %1").arg(hAlignStr)); + + MENU_V_ALIGNMENT vAlign; + *aZoneFileStream >> vAlign; + QTreeWidgetItem *vAlignNode = new QTreeWidgetItem(menuRectNode); + QString vAlignStr = Utils::MenuVAlignToStr(vAlign); + vAlignNode->setText(0, QString("Vert. Align: %1").arg(vAlignStr)); + + float rectClientX, rectClientY, rectClientWidth, rectClientHeight; + *aZoneFileStream >> rectClientX >> rectClientY >> rectClientWidth >> rectClientHeight; + QTreeWidgetItem *menuRectClientNode = new QTreeWidgetItem(menuFilePathNode); + menuRectClientNode->setText(0, "Menu Client Rect"); + QTreeWidgetItem *menuRectClientXNode = new QTreeWidgetItem(menuRectClientNode); + menuRectClientXNode->setText(0, QString("X: %1").arg(rectClientX)); + QTreeWidgetItem *menuRectClientYNode = new QTreeWidgetItem(menuRectClientNode); + menuRectClientYNode->setText(0, QString("Y: %1").arg(rectClientY)); + QTreeWidgetItem *menuRectClientWidthNode = new QTreeWidgetItem(menuRectClientNode); + menuRectClientWidthNode->setText(0, QString("Width: %1").arg(rectClientWidth)); + QTreeWidgetItem *menuRectClientHeightNode = new QTreeWidgetItem(menuRectClientNode); + menuRectClientHeightNode->setText(0, QString("Height: %1").arg(rectClientHeight)); + + // Client horizontal alignment + MENU_H_ALIGNMENT hClientAlign; + *aZoneFileStream >> hClientAlign; + QTreeWidgetItem *hClientAlignNode = new QTreeWidgetItem(menuRectClientNode); + QString hClientAlignStr = Utils::MenuHAlignToStr(hAlign); + hClientAlignNode->setText(0, QString("Horiz. Align: %1").arg(hClientAlignStr)); + + // Client vertical alignment + MENU_V_ALIGNMENT vClientAlign; + *aZoneFileStream >> vClientAlign; + QTreeWidgetItem *vClientAlignNode = new QTreeWidgetItem(menuRectClientNode); + QString vClientAlignStr = Utils::MenuVAlignToStr(vAlign); + vClientAlignNode->setText(0, QString("Vert. Align: %1").arg(vClientAlignStr)); + + quint32 groupPtr; // Should be const char * + *aZoneFileStream >> groupPtr; + + MENU_WINDOW_STYLE style; + *aZoneFileStream >> style; + + MENU_WINDOW_BORDER border; + *aZoneFileStream >> border; + + quint32 ownerDraw, ownerDrawFlags; + *aZoneFileStream >> ownerDraw >> ownerDrawFlags; + + float borderSize; + *aZoneFileStream >> borderSize; + + int staticFlags, dynamicFlags, nextTime; + *aZoneFileStream >> staticFlags >> dynamicFlags >> nextTime; + + QTreeWidgetItem *colorsNode = new QTreeWidgetItem(menuFilePathNode); + colorsNode->setText(0, "Menu Colors"); + + float foregroundColorR, foregroundColorG, foregroundColorB, foregroundColorA, + backgroundColorR, backgroundColorG, backgroundColorB, backgroundColorA, + borderColorR, borderColorG, borderColorB, borderColorA, + outlineColorR, outlineColorG, outlineColorB, outlineColorA; + *aZoneFileStream >> foregroundColorR >> foregroundColorG >> foregroundColorB >> foregroundColorA + >> backgroundColorR >> backgroundColorG >> backgroundColorB >> backgroundColorA + >> borderColorR >> borderColorG >> borderColorB >> borderColorA + >> outlineColorR >> outlineColorG >> outlineColorB >> outlineColorA; + + QTreeWidgetItem *foregroundColorNode = new QTreeWidgetItem(colorsNode); + foregroundColorNode->setText(0, QString("Foreground Color: RGBA(%1, %2, %3, %4)") + .arg(foregroundColorR).arg(foregroundColorG).arg(foregroundColorB).arg(foregroundColorA)); + foregroundColorNode->setBackground(1, Utils::ColorFromNormalized(foregroundColorR, foregroundColorG, foregroundColorB, foregroundColorA)); + QTreeWidgetItem *backgroundColorNode = new QTreeWidgetItem(colorsNode); + backgroundColorNode->setText(0, QString("Background Color: RGBA(%1, %2, %3, %4)") + .arg(backgroundColorR).arg(backgroundColorG).arg(backgroundColorB).arg(backgroundColorA)); + backgroundColorNode->setBackground(1, Utils::ColorFromNormalized(backgroundColorR, backgroundColorG, backgroundColorB, backgroundColorA)); + QTreeWidgetItem *borderColorNode = new QTreeWidgetItem(colorsNode); + borderColorNode->setText(0, QString("Borer Color: RGBA(%1, %2, %3, %4)") + .arg(borderColorR).arg(borderColorG).arg(borderColorB).arg(borderColorA)); + borderColorNode->setBackground(1, Utils::ColorFromNormalized(borderColorR, borderColorG, borderColorB, borderColorA)); + QTreeWidgetItem *outlineColorNode = new QTreeWidgetItem(colorsNode); + outlineColorNode->setText(0, QString("Outline Color: RGBA(%1, %2, %3, %4)") + .arg(outlineColorR).arg(outlineColorG).arg(outlineColorB).arg(outlineColorA)); + outlineColorNode->setBackground(1, Utils::ColorFromNormalized(outlineColorR, outlineColorG, outlineColorB, outlineColorA)); + + quint32 materialPtr; // Should be Material * + *aZoneFileStream >> materialPtr; + + quint32 fontPtr, fullScreen, itemCount, fontIndex; + *aZoneFileStream >> fontPtr >> fullScreen >> itemCount >> fontIndex; + + quint32 cursorItem, fadeCycle; + *aZoneFileStream >> cursorItem >> fadeCycle; + + float fadeClamp, fadeAmount, fadeInAmount, blurRadius; + *aZoneFileStream >> fadeClamp >> fadeAmount >> fadeInAmount >> blurRadius; + + quint32 onOpenPtr, onFocusPtr, onClosePtr, onESCPtr; // Should be const char * + *aZoneFileStream >> onOpenPtr >> onFocusPtr >> onClosePtr >> onESCPtr; + + quint32 onKeyPtr; // Should be ItemKeyHandler * + *aZoneFileStream >> onKeyPtr; + + quint32 visibleExpCount, expEntryPtr; // components of statement_s + *aZoneFileStream >> visibleExpCount >> expEntryPtr; + + quint32 allowedBindingPtr, soundNamePtr; // Should be const char * + *aZoneFileStream >> allowedBindingPtr >> soundNamePtr; + + quint32 imageTrack; + *aZoneFileStream >> imageTrack; + + float focusColorR, focusColorG, focusColorB, focusColorA; + *aZoneFileStream >> focusColorR >> focusColorG >> focusColorB >> focusColorA; + QTreeWidgetItem *focusColorNode = new QTreeWidgetItem(colorsNode); + focusColorNode->setText(0, QString("Focus Color: RGBA(%1, %2, %3, %4)") + .arg(focusColorR).arg(focusColorG).arg(focusColorB).arg(focusColorA)); + focusColorNode->setBackground(1, Utils::ColorFromNormalized(focusColorR, focusColorG, focusColorB, focusColorA)); + + //QTreeWidgetItem *menuDefChildNode = new QTreeWidgetItem(menuDefNode); + //menuDefChildNode->setText(0, menuDefName); + + float disabledColorR, disabledColorG, disabledColorB, disabledColorA; + *aZoneFileStream >> disabledColorR >> disabledColorG >> disabledColorB >> disabledColorA; + QTreeWidgetItem *disabledColorNode = new QTreeWidgetItem(colorsNode); + disabledColorNode->setText(0, QString("Disabled Color: RGBA(%1, %2, %3, %4)") + .arg(disabledColorR).arg(disabledColorG).arg(disabledColorB).arg(disabledColorA)); + disabledColorNode->setBackground(1, Utils::ColorFromNormalized(disabledColorR, disabledColorG, disabledColorB, disabledColorA)); + + quint32 rectXExpCount, rectXExpPtr; // components of statement_s + *aZoneFileStream >> rectXExpCount >> rectXExpPtr; + + quint32 rectYExpCount, rectYExpPtr; // components of statement_s + *aZoneFileStream >> rectYExpCount >> rectYExpPtr; + + aZoneFileStream->skipRawData(4); // Separator + + QString menuDefName; + char menuDefNameChar; + int menuDefNameLen = 0; + *aZoneFileStream >> menuDefNameChar; + while (menuDefNameChar != 0 && menuDefNameLen < 30) { + menuDefNameLen++; + menuDefName += menuDefNameChar; + *aZoneFileStream >> menuDefNameChar; + } + + menuFilePathNode->setText(0, QString("%1 - %2").arg(menuDefName).arg(menuFilepath)); + + QString defString; + char defStringChar; + int defStringLen = 0; + *aZoneFileStream >> defStringChar; + while (defStringChar != 0 && defStringLen < 30) { + defStringLen++; + defString += defStringChar; + *aZoneFileStream >> defStringChar; + } + aZoneFileStream->skipRawData(4 * 10); + + + QTreeWidgetItem *itemsNode = new QTreeWidgetItem(menuFilePathNode); + itemsNode->setText(0, "Item Definitions"); + + quint32 itemWindowDefNamePtr; + *aZoneFileStream >> itemWindowDefNamePtr; + + QTreeWidgetItem *itemRectNode = new QTreeWidgetItem(itemsNode); + itemRectNode->setText(0, "Item Text Rect"); + + float itemRectX, itemRectY, itemRectWidth, itemRectHeight; + *aZoneFileStream >> itemRectX >> itemRectY >> itemRectWidth >> itemRectHeight; + QTreeWidgetItem *itemRectXNode = new QTreeWidgetItem(itemRectNode); + itemRectXNode->setText(0, QString("X: %1").arg(itemRectX)); + QTreeWidgetItem *itemRectYNode = new QTreeWidgetItem(itemRectNode); + itemRectYNode->setText(0, QString("Y: %1").arg(itemRectY)); + QTreeWidgetItem *itemRectWidthNode = new QTreeWidgetItem(itemRectNode); + itemRectWidthNode->setText(0, QString("Width: %1").arg(itemRectWidth)); + QTreeWidgetItem *itemRectHeightNode = new QTreeWidgetItem(itemRectNode); + itemRectHeightNode->setText(0, QString("Height: %1").arg(itemRectHeight)); + + MENU_H_ALIGNMENT itemHAlignment; + *aZoneFileStream >> itemHAlignment; + QTreeWidgetItem *hTextAlignNode = new QTreeWidgetItem(itemRectNode); + QString hTextAlignStr = Utils::MenuHAlignToStr(itemHAlignment); + hTextAlignNode->setText(0, QString("Horiz. Align: %1").arg(hTextAlignStr)); + + MENU_V_ALIGNMENT itemVAlignment; + *aZoneFileStream >> itemVAlignment; + QTreeWidgetItem *vTextAlignNode = new QTreeWidgetItem(itemRectNode); + QString vTextAlignStr = Utils::MenuVAlignToStr(itemVAlignment); + vTextAlignNode->setText(0, QString("Vert. Align: %1").arg(vTextAlignStr)); + + quint32 itemGroupPtr; // Should be const char* + *aZoneFileStream >> itemGroupPtr; + + MENU_WINDOW_STYLE itemWindowStyle; + *aZoneFileStream >> itemWindowStyle; + + MENU_WINDOW_BORDER itemWindowBorder; + *aZoneFileStream >> itemWindowBorder; + + quint32 itemOwnerDraw, itemOwnerDrawFlags; + *aZoneFileStream >> itemOwnerDraw >> itemOwnerDrawFlags; + + float itemBorderSize; + *aZoneFileStream >> itemBorderSize; + + int itemStaticFlags, itemDynamicFlags, itemNextTime; + *aZoneFileStream >> itemStaticFlags >> itemDynamicFlags >> itemNextTime; + + float itemForegroundColorR, itemForegroundColorG, itemForegroundColorB, itemForegroundColorA, + itemBackgroundColorR, itemBackgroundColorG, itemBackgroundColorB, itemBackgroundColorA, + itemBorderColorR, itemBorderColorG, itemBorderColorB, itemBorderColorA, + itemOutlineColorR, itemOutlineColorG, itemOutlineColorB, itemOutlineColorA; + *aZoneFileStream >> itemForegroundColorR >> itemForegroundColorG >> itemForegroundColorB >> itemForegroundColorA + >> itemBackgroundColorR >> itemBackgroundColorG >> itemBackgroundColorB >> itemBackgroundColorA + >> itemBorderColorR >> itemBorderColorG >> itemBorderColorB >> itemBorderColorA + >> itemOutlineColorR >> itemOutlineColorG >> itemOutlineColorB >> itemOutlineColorA; + + quint32 itemMaterialPtr; // Should be Material * + *aZoneFileStream >> itemMaterialPtr; + + QTreeWidgetItem *itemTextRectNode = new QTreeWidgetItem(itemsNode); + itemTextRectNode->setText(0, "Item Text Rect"); + + float itemTextRectX, itemTextRectY, itemTextRectWidth, itemTextRectHeight; + *aZoneFileStream >> itemTextRectX >> itemTextRectY >> itemTextRectWidth >> itemTextRectHeight; + QTreeWidgetItem *itemTextRectXNode = new QTreeWidgetItem(itemTextRectNode); + itemTextRectXNode->setText(0, QString("X: %1").arg(itemTextRectX)); + QTreeWidgetItem *itemTextRectYNode = new QTreeWidgetItem(itemTextRectNode); + itemTextRectYNode->setText(0, QString("Y: %1").arg(itemTextRectY)); + QTreeWidgetItem *itemTextRectWidthNode = new QTreeWidgetItem(itemTextRectNode); + itemTextRectWidthNode->setText(0, QString("Width: %1").arg(itemTextRectWidth)); + QTreeWidgetItem *itemTextRectHeightNode = new QTreeWidgetItem(itemTextRectNode); + itemTextRectHeightNode->setText(0, QString("Height: %1").arg(itemTextRectHeight)); + + MENU_H_ALIGNMENT itemText_hAlign; + *aZoneFileStream >> itemText_hAlign; + QTreeWidgetItem *hItemTextAlignNode = new QTreeWidgetItem(itemTextRectNode); + QString hItemTextAlignStr = Utils::MenuHAlignToStr(itemText_hAlign); + hItemTextAlignNode->setText(0, QString("Horiz. Align: %1").arg(hItemTextAlignStr)); + + MENU_V_ALIGNMENT itemText_vAlign; + *aZoneFileStream >> itemText_vAlign; + QTreeWidgetItem *vItemTextAlignNode = new QTreeWidgetItem(itemTextRectNode); + QString vItemTextAlignStr = Utils::MenuVAlignToStr(itemText_vAlign); + vItemTextAlignNode->setText(0, QString("Vert. Align: %1").arg(vItemTextAlignStr)); + + + MENU_ITEM_TYPE itemType; + *aZoneFileStream >> itemType; + + quint32 dataType, alignment; + *aZoneFileStream >> dataType >> alignment; + + MENU_FONT_TYPE fontEnum; + *aZoneFileStream >> fontEnum; + + quint32 textAlignMode; + *aZoneFileStream >> textAlignMode; + + float textalignx, textaligny, textscale; + *aZoneFileStream >> textalignx >> textaligny >> textscale; + + MENU_ITEM_TEXTSTYLE textStyle; + *aZoneFileStream >> textStyle; + + int gameMsgWindowIndex, gameMsgWindowMode; + *aZoneFileStream >> gameMsgWindowIndex >> gameMsgWindowMode; + + quint32 testPtr; // const char * + *aZoneFileStream >> testPtr; + + quint32 textSavegameInfo; + *aZoneFileStream >> textSavegameInfo; + + quint32 parentPtr; // menuDef_t * + *aZoneFileStream >> parentPtr; + + quint32 mouseEnterText, mouseExitText, mouseEnter, mouseExit, + action, onAccept, onFocus, leaveFocus, dvar, dvarTest; // const char * + *aZoneFileStream >> mouseEnterText >> mouseExitText >> mouseEnter >> mouseExit + >> action >> onAccept >> onFocus >> leaveFocus >> dvar >> dvarTest; + + quint32 keyHandlerPtr; // ItemKeyHandler * + *aZoneFileStream >> keyHandlerPtr; + + quint32 enableDvarPtr; // const char * + *aZoneFileStream >> enableDvarPtr; + + quint32 dvarFlags; + *aZoneFileStream >> dvarFlags; + + quint32 focusSoundPtr; // snd_alias_list_t *; + *aZoneFileStream >> focusSoundPtr; + + float special; + *aZoneFileStream >> special; + + quint32 cursorPos; + *aZoneFileStream >> cursorPos; + + // itemDefData_t typeData; + + // listBoxDef_s *listBox; + + quint32 startPos, endPos, drawPadding; + *aZoneFileStream >> startPos >> endPos >> drawPadding; + + float elementWidth, elementHeight; + *aZoneFileStream >> elementWidth >> elementHeight; + + quint32 elementStyle, numColumns; + *aZoneFileStream >> elementStyle >> numColumns; + + //columnInfo_s columnInfo[16]; + + quint32 doubleClickPtr; // const char * + *aZoneFileStream >> doubleClickPtr; + + + int notselectable, noScrollBars, usePaging; + *aZoneFileStream >> notselectable >> noScrollBars >> usePaging; + + float itemSelectBorderColorR, itemSelectBorderColorG, itemSelectBorderColorB, itemSelectBorderColorA, + itemDisableColorR, itemDisableColorG, itemDisableColorB, itemDisableColorA, + itemFocusColor2R, itemFocusColor2G, itemFocusColor2B, itemFocusColor2A; + *aZoneFileStream >> itemSelectBorderColorR >> itemSelectBorderColorG >> itemSelectBorderColorB >> itemSelectBorderColorA + >> itemDisableColorR >> itemDisableColorG >> itemDisableColorB >> itemDisableColorA + >> itemFocusColor2R >> itemFocusColor2G >> itemFocusColor2B >> itemFocusColor2A; + + quint32 selectIconPtr, backgroundItemListboxPtr, highlightTexturePtr; // Material * + *aZoneFileStream >> selectIconPtr >> backgroundItemListboxPtr >> highlightTexturePtr; + + // editFieldDef_s *editField; + + float minVal, maxVal, defVal, range; + *aZoneFileStream >> minVal >> maxVal >> defVal >> range; + + int maxChars, maxCharsGotoNext, maxPaintChars, paintOffset; + *aZoneFileStream >> maxChars >> maxCharsGotoNext >> maxPaintChars >> paintOffset; + + // multiDef_s *multi; + + QVector dvarListPtrs = QVector(32); + for (int i = 0; i < 32; i++) { + quint32 dvarList; + *aZoneFileStream >> dvarList; + dvarListPtrs.push_back(dvarList); + } + + QVector dvarStrPtrs = QVector(32); + for (int i = 0; i < 32; i++) { + quint32 dvarStr; + *aZoneFileStream >> dvarStr; + dvarStrPtrs.push_back(dvarStr); + } + + QVector dvarValues = QVector(32); + for (int i = 0; i < 32; i++) { + float dvarValue; + *aZoneFileStream >> dvarValue; + dvarValues.push_back(dvarValue); + } + + quint32 count, strDef; + *aZoneFileStream >> count >> strDef; + + quint32 enumDvarNamePtr; // const char * + *aZoneFileStream >> enumDvarNamePtr; + + quint32 dataPtr; // void * + *aZoneFileStream >> dataPtr; + + quint32 itemImageTrack; + *aZoneFileStream >> itemImageTrack; + + //statement_s visibleExp; + //statement_s textExp; + //statement_s materialExp; + //statement_s rectXExp; + //statement_s rectYExp; + //statement_s rectWExp; + //statement_s rectHExp; + //statement_s foreColorAExp; + } } void MainWindow::ParseAsset_Weapon(QDataStream *aZoneFileStream) { From 67f3e217796037d378d60ee411c5c57bd053e33f Mon Sep 17 00:00:00 2001 From: = Date: Fri, 10 Jan 2025 04:36:12 -0500 Subject: [PATCH 06/22] Removed unused asset functions, refactored. --- mainwindow.cpp | 359 ++++++++++++++++++++----------------------------- mainwindow.h | 30 ++--- 2 files changed, 159 insertions(+), 230 deletions(-) diff --git a/mainwindow.cpp b/mainwindow.cpp index b4a494c..b169aad 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -278,12 +278,12 @@ QByteArray MainWindow::DecompressZLIB(QByteArray compressedData) { } /* - OpenFastFile() + GetFastFilePath() Opens a file dialog in the steam folder, and opens the selected file. */ -QFile* MainWindow::OpenFastFile() { +QString MainWindow::GetFastFilePath() { // Reset dialog before opening new file Reset(); @@ -299,22 +299,16 @@ QFile* MainWindow::OpenFastFile() { const QString fastFileStem = fastFilePath.split('/').last(); setWindowTitle(QString("FastFile Wizard - %1").arg(fastFileStem)); - // Check fastfile can be read - QFile *fastFile = new QFile(fastFilePath); - if (!fastFile->open(QIODevice::ReadOnly)) { - QMessageBox::warning(this, "Warning!", QString("%1 could not be read!.").arg(fastFilePath)); - return nullptr; - } - return fastFile; + return fastFilePath; } /* - OpenZoneFile() + GetZoneFilePath() Opens a file dialog in the steam folder, and opens the selected file. */ -QFile* MainWindow::OpenZoneFile() { +QString MainWindow::GetZoneFilePath() { // Reset dialog before opening new file Reset(); @@ -330,13 +324,74 @@ QFile* MainWindow::OpenZoneFile() { const QString zoneFileStem = zoneFilePath.split('/').last(); setWindowTitle(QString("FastFile Wizard - %1").arg(zoneFileStem)); + return zoneFilePath; +} + +QByteArray MainWindow::OpenFastFile(QString aFastFilePath) +{ + Reset(); + // Check fastfile can be read - QFile *zoneFile = new QFile(zoneFilePath); - if (!zoneFile->open(QIODevice::ReadOnly)) { - QMessageBox::warning(this, "Warning!", QString("%1 could not be read!.").arg(zoneFilePath)); - return nullptr; + QFile *fastFile = new QFile(aFastFilePath); + qDebug() << aFastFilePath; + if (!fastFile->open(QIODevice::ReadOnly)) { + QMessageBox::warning(this, "Warning!", QString("FastFile '%1' could not be read!.").arg(fastFile->fileName())); + return QByteArray(); } - return zoneFile; + LogOpenedFile(fastFile->fileName()); + ui->lineEdit_FastFile->setText(fastFile->fileName()); + + // Decompress fastfile and close + const QByteArray fastFileData = fastFile->readAll(); + + // Parse data from fast file header + ParseFFHeader(fastFileData.mid(0, 12)); + + fastFile->close(); + + // Decompress fastfile and close + const QByteArray decompressedData = DecompressZLIB(fastFileData.mid(12)); + // ui->plainTextEdit_ZoneDump->setPlainText(decompressedData.toHex()); + + const QString zoneFilePath = aFastFilePath.replace(".ff", ".zone"); + ui->lineEdit_ZoneFile->setText(zoneFilePath); + + // Open zone file + OpenZoneFile(zoneFilePath); + + // Clean up & return + delete fastFile; + return fastFileData; +} + +QByteArray MainWindow::OpenZoneFile(QString aZoneFilePath) +{ + Reset(); + + // Check zone file is writeable + QFile *zoneFile = new QFile(aZoneFilePath); + if (!zoneFile->open(QIODevice::ReadOnly)) { + QMessageBox::warning(this, "Warning!", QString("ZoneFile '%1' could not be read!.").arg(zoneFile->fileName())); + return QByteArray(); + } + LogOpenedFile(zoneFile->fileName()); + ui->lineEdit_ZoneFile->setText(zoneFile->fileName()); + + // Parse & close zone file + QByteArray zoneFileData = zoneFile->readAll(); + ParseZoneFile(zoneFileData); + zoneFile->close(); + + // Check if corresponding zone file exists + const QString fastFilePath = zoneFile->fileName().replace(".zone", ".ff"); + if (QFile::exists(fastFilePath)) { + ui->lineEdit_FastFile->setText(fastFilePath); + LogOpenedFile(fastFilePath); + } + + // Clean up & return + delete zoneFile; + return zoneFileData; } void MainWindow::ParseFFCompany(QDataStream *afastFileStream) { @@ -420,9 +475,9 @@ void MainWindow::ParseFFVersion(QDataStream *afastFileStream) { } } -void MainWindow::ParseFFHeader(QFile *aFastFilePtr) { +void MainWindow::ParseFFHeader(QByteArray aFastFileData) { // Open stream to fastfile - QDataStream afastFileStream(aFastFilePtr); + QDataStream afastFileStream(aFastFileData); afastFileStream.setByteOrder(QDataStream::LittleEndian); ParseFFCompany(&afastFileStream); @@ -759,10 +814,6 @@ void MainWindow::ParseAsset_RawFile(QDataStream *aZoneFileStream) { // qDebug() << QString("%1: %2").arg(rawFilePath).arg(rawFileContents); } -void MainWindow::ParseAsset_PhysPreset(QDataStream *aZoneFileStream) { - -} - void MainWindow::ParseAsset_XModel(QDataStream *aZoneFileStream) { } @@ -793,10 +844,6 @@ void MainWindow::ParseAsset_TechSet(QDataStream *aZoneFileStream) { //qDebug() << "Tech Set: " << techSetName; } -void MainWindow::ParseAsset_Image(QDataStream *aZoneFileStream) { - -} - void MainWindow::ParseAsset_LoadedSound(QDataStream *aZoneFileStream) { } @@ -805,34 +852,14 @@ void MainWindow::ParseAsset_ColMapMP(QDataStream *aZoneFileStream) { } -void MainWindow::ParseAsset_GameMapSP(QDataStream *aZoneFileStream) { - -} - -void MainWindow::ParseAsset_GameMapMP(QDataStream *aZoneFileStream) { - -} - -void MainWindow::ParseAsset_LightDef(QDataStream *aZoneFileStream) { - -} - -void MainWindow::ParseAsset_UIMap(QDataStream *aZoneFileStream) { - -} - -void MainWindow::ParseAsset_SNDDriverGlobals(QDataStream *aZoneFileStream) { - -} - -void MainWindow::ParseAsset_AIType(QDataStream *aZoneFileStream) { - -} - void MainWindow::ParseAsset_FX(QDataStream *aZoneFileStream) { } +void MainWindow::ParseAsset_Font(QDataStream *aZoneFileStream) { + +} + void MainWindow::ParseAsset_XAnim(QDataStream *aZoneFileStream) { // Read in pointer to x_anim name QByteArray namePtr(4, Qt::Uninitialized); @@ -1413,134 +1440,62 @@ void MainWindow::ParseAsset_StringTable(QDataStream *aZoneFileStream) { } void MainWindow::on_pushButton_FastFile_clicked() { - // Try to prompt user to open fastfile - QFile *fastFile; - if (!(fastFile = OpenFastFile())) { - QMessageBox::warning(this, "Warning!", QString("Failed to open FastFile!.")); - return; - } - - // Parse data from fast file header - ParseFFHeader(fastFile); - - // Decompress fastfile and close - const QByteArray fastFileData = fastFile->readAll(); - const QByteArray decompressedData = DecompressZLIB(fastFileData); - // ui->plainTextEdit_ZoneDump->setPlainText(decompressedData.toHex()); - - const QString zoneFilePath = fastFile->fileName().replace(".ff", ".zone"); - fastFile->close(); - - // Check zone file is writeable - QFile *zoneFile = new QFile(zoneFilePath); - if (!zoneFile->open(QIODevice::ReadWrite)) { - qDebug() << QString("Zone file could not be written to: '%1'").arg(zoneFilePath); - return; - } - // Write zone data - zoneFile->write(decompressedData); - zoneFile->close(); - - // Open zone file as little endian stream - QDataStream zoneFileStream(decompressedData); - zoneFileStream.setByteOrder(QDataStream::LittleEndian); - - // Parse data from zone file header - ParseZoneHeader(&zoneFileStream); - ParseZoneIndex(&zoneFileStream); - - // Track current and consecutive assets - int assetIndex = 0; - - // Iterate asset types found in index - for (auto [assetType, assetCount] : mTypeMap.asKeyValueRange()) { - // Get asset description from type - QString assetStr = Utils::AssetTypeToString(assetType); - - // Insert row and populate - ui->tableWidget_Index->insertRow(assetIndex); - ui->tableWidget_Index->setItem(assetIndex, 0, new QTableWidgetItem(assetType)); - ui->tableWidget_Index->setItem(assetIndex, 1, new QTableWidgetItem(assetStr)); - ui->tableWidget_Index->setItem(assetIndex, 2, new QTableWidgetItem(QString::number(assetCount))); - - // Update count - assetIndex++; - } - - for (int i = 0; i < mTypeOrder.size(); i++) { - const QString typeHex = mTypeOrder[i]; - const QString typeStr = Utils::AssetTypeToString(typeHex); - - // qDebug() << "Parsing Asset of Type: " << typeHex; - if (typeStr == "LOCAL STRING") { // localized string asset - ParseAsset_LocalString(&zoneFileStream); - } else if (typeStr == "RAW FILE") { // gsc - ParseAsset_RawFile(&zoneFileStream); - } else if (typeStr == "PHYS PRESET") { // physpreset - ParseAsset_PhysPreset(&zoneFileStream); - } else if (typeStr == "MODEL") { // xmodel - ParseAsset_XModel(&zoneFileStream); - } else if (typeStr == "MATERIAL") { // material - ParseAsset_Material(&zoneFileStream); - } else if (typeStr == "SHADER") { // pixelshader - ParseAsset_PixelShader(&zoneFileStream); - } else if (typeStr == "TECH SET") { // techset include - ParseAsset_TechSet(&zoneFileStream); - } else if (typeStr == "IMAGE") { // image - ParseAsset_Image(&zoneFileStream); - } else if (typeStr == "SOUND") { // loaded_sound - ParseAsset_LoadedSound(&zoneFileStream); - } else if (typeStr == "COLLISION MAP") { // col_map_mp - ParseAsset_ColMapMP(&zoneFileStream); - } else if (typeStr == "MP MAP") { // game_map_sp - ParseAsset_GameMapSP(&zoneFileStream); - } else if (typeStr == "SP MAP") { // game_map_mp - ParseAsset_GameMapMP(&zoneFileStream); - } else if (typeStr == "LIGHT DEF") { // lightdef - ParseAsset_LightDef(&zoneFileStream); - } else if (typeStr == "UI MAP") { // ui_map - ParseAsset_UIMap(&zoneFileStream); - } else if (typeStr == "SND DRIVER GLOBALS") { // snddriverglobals - ParseAsset_SNDDriverGlobals(&zoneFileStream); - } else if (typeStr == "AI TYPE") { // aitype - ParseAsset_AIType(&zoneFileStream); - } else if (typeStr == "EFFECT") { // aitype - ParseAsset_FX(&zoneFileStream); - } else if (typeStr == "ANIMATION") { // aitype - ParseAsset_XAnim(&zoneFileStream); - } else if (typeStr == "STRING TABLE") { // string_table - ParseAsset_StringTable(&zoneFileStream); - } else if (typeStr == "MENU") { // string_table - ParseAsset_MenuFile(&zoneFileStream); - } else if (typeStr == "WEAPON") { // string_table - ParseAsset_Weapon(&zoneFileStream); - } else if (typeStr == "D3DBSP DUMP") { // string_table - ParseAsset_D3DBSP(&zoneFileStream); - } else if (typeStr != "UNKNOWN") { - qDebug() << "Found bad asset type!" << typeStr; - } - } - - // Close zone file - zoneFile->close(); - - // Clean up - delete zoneFile; - delete fastFile; + // Open fast file + QString fastFilePath = GetFastFilePath(); + OpenFastFile(fastFilePath); } -void MainWindow::on_pushButton_FastFile_2_clicked() { - // Check zone file is writeable - QFile *zoneFile; - if (!(zoneFile = OpenZoneFile())) { - QMessageBox::warning(this, "Warning!", QString("Failed to open FastFile!.")); - return; - } - const QByteArray decompressedData = zoneFile->readAll(); +void MainWindow::on_pushButton_ZoneFile_clicked() { + const QString zoneFilePath = GetZoneFilePath(); + OpenZoneFile(zoneFilePath); +} +void MainWindow::LogOpenedFile(QString aFileName) +{ + mRecentFiles.enqueue(aFileName); + mRecentFiles.removeDuplicates(); + + RefreshRecentFileMenu(); +} + +void MainWindow::RefreshRecentFileMenu() +{ + foreach (QAction* action, mRecentFileActions) { + ui->menuRecent_Fast_Files->removeAction(action); + ui->menuRecent_Zone_Files->removeAction(action); + + action->deleteLater(); + } + mRecentFileActions.clear(); + + foreach (QString recentFileText, mRecentFiles) { + if (recentFileText.contains(".ff")) { + QAction *recentFastFileAction = new QAction(ui->menuRecent_Fast_Files); + recentFastFileAction->setText(recentFileText); + mRecentFileActions << recentFastFileAction; + ui->menuRecent_Fast_Files->addAction(recentFastFileAction); + + connect(recentFastFileAction, &QAction::triggered, this, [&, this, recentFileText](bool checked = false) { + OpenFastFile(recentFileText); + }); + } else if (recentFileText.contains(".zone")) { + QAction *recentZoneFileAction = new QAction(ui->menuRecent_Zone_Files); + recentZoneFileAction->setText(recentFileText); + mRecentFileActions << recentZoneFileAction; + ui->menuRecent_Zone_Files->addAction(recentZoneFileAction); + + connect(recentZoneFileAction, &QAction::triggered, this, [&, this, recentFileText](bool checked = false) { + OpenZoneFile(recentFileText); + }); + } + } +} + +void MainWindow::ParseZoneFile(QByteArray aDecompressedData) { // Open zone file as little endian stream - QDataStream zoneFileStream(decompressedData); + QDataStream zoneFileStream(aDecompressedData); zoneFileStream.setByteOrder(QDataStream::LittleEndian); + zoneFileStream.setFloatingPointPrecision(QDataStream::SinglePrecision); // Parse data from zone file header ParseZoneHeader(&zoneFileStream); @@ -1569,60 +1524,40 @@ void MainWindow::on_pushButton_FastFile_2_clicked() { const QString typeStr = Utils::AssetTypeToString(typeHex); // qDebug() << "Parsing Asset of Type: " << typeHex; - if (typeStr == "LOCAL STRING") { // localized string asset - ParseAsset_LocalString(&zoneFileStream); - } else if (typeStr == "RAW FILE") { // gsc - ParseAsset_RawFile(&zoneFileStream); - } else if (typeStr == "PHYS PRESET") { // physpreset - ParseAsset_PhysPreset(&zoneFileStream); + if (typeStr == "ANIMATION") { // aitype + ParseAsset_XAnim(&zoneFileStream); } else if (typeStr == "MODEL") { // xmodel ParseAsset_XModel(&zoneFileStream); } else if (typeStr == "MATERIAL") { // material ParseAsset_Material(&zoneFileStream); - } else if (typeStr == "SHADER") { // pixelshader - ParseAsset_PixelShader(&zoneFileStream); } else if (typeStr == "TECH SET") { // techset include ParseAsset_TechSet(&zoneFileStream); - } else if (typeStr == "IMAGE") { // image - ParseAsset_Image(&zoneFileStream); } else if (typeStr == "SOUND") { // loaded_sound ParseAsset_LoadedSound(&zoneFileStream); } else if (typeStr == "COLLISION MAP") { // col_map_mp ParseAsset_ColMapMP(&zoneFileStream); - } else if (typeStr == "MP MAP") { // game_map_sp - ParseAsset_GameMapSP(&zoneFileStream); - } else if (typeStr == "SP MAP") { // game_map_mp - ParseAsset_GameMapMP(&zoneFileStream); - } else if (typeStr == "LIGHT DEF") { // lightdef - ParseAsset_LightDef(&zoneFileStream); - } else if (typeStr == "UI MAP") { // ui_map - ParseAsset_UIMap(&zoneFileStream); - } else if (typeStr == "SND DRIVER GLOBALS") { // snddriverglobals - ParseAsset_SNDDriverGlobals(&zoneFileStream); - } else if (typeStr == "AI TYPE") { // aitype - ParseAsset_AIType(&zoneFileStream); - } else if (typeStr == "EFFECT") { // aitype - ParseAsset_FX(&zoneFileStream); - } else if (typeStr == "ANIMATION") { // aitype - ParseAsset_XAnim(&zoneFileStream); - } else if (typeStr == "STRING TABLE") { // string_table - ParseAsset_StringTable(&zoneFileStream); - } else if (typeStr == "MENU") { // string_table - ParseAsset_MenuFile(&zoneFileStream); - } else if (typeStr == "WEAPON") { // string_table - ParseAsset_Weapon(&zoneFileStream); + } else if (typeStr == "SHADER") { // pixelshader + ParseAsset_PixelShader(&zoneFileStream); } else if (typeStr == "D3DBSP DUMP") { // string_table ParseAsset_D3DBSP(&zoneFileStream); - } else if (typeStr != "UNKNOWN") { + } else if (typeStr == "FONT") { // font + ParseAsset_Font(&zoneFileStream); + } else if (typeStr == "MENU") { // string_table + ParseAsset_MenuFile(&zoneFileStream); + } else if (typeStr == "LOCAL STRING") { // localized string asset + ParseAsset_LocalString(&zoneFileStream); + } else if (typeStr == "WEAPON") { // string_table + ParseAsset_Weapon(&zoneFileStream); + } else if (typeStr == "EFFECT") { // aitype + ParseAsset_FX(&zoneFileStream); + } else if (typeStr == "RAW FILE") { // gsc + ParseAsset_RawFile(&zoneFileStream); + } else if (typeStr == "STRING TABLE") { // string_table + ParseAsset_StringTable(&zoneFileStream); + } else { qDebug() << "Found bad asset type!" << typeStr; } } - - // Close zone file - zoneFile->close(); - - // Clean up - delete zoneFile; } int MainWindow::LoadFile_D3DBSP(const QString aFilePath) { diff --git a/mainwindow.h b/mainwindow.h index 76ebd33..6eb6181 100644 --- a/mainwindow.h +++ b/mainwindow.h @@ -19,7 +19,7 @@ #include #include #include -#include +#include > #include @@ -84,7 +84,7 @@ public: private slots: void on_pushButton_FastFile_clicked(); - void on_pushButton_FastFile_2_clicked(); + void on_pushButton_ZoneFile_clicked(); void LogOpenedFile(QString aFileName); void RefreshRecentFileMenu(); @@ -102,6 +102,7 @@ private slots: void ParseFFMagic(QDataStream *afastFileStream); void ParseFFVersion(QDataStream *afastFileStream); + void ParseZoneFile(QByteArray aDecompressedData); void ParseZoneHeader(QDataStream *aZoneFileStream); void ParseZoneSize(QDataStream *aZoneFileStream); @@ -113,28 +114,21 @@ private slots: void ParseZoneTags(QDataStream *aZoneFileStream); void ParseZoneIndex(QDataStream *aZoneFileStream); - void ParseAsset_LocalString(QDataStream *aZoneFileStream); - void ParseAsset_RawFile(QDataStream *aZoneFileStream); - void ParseAsset_PhysPreset(QDataStream *aZoneFileStream); + void ParseAsset_XAnim(QDataStream *aZoneFileStream); void ParseAsset_XModel(QDataStream *aZoneFileStream); void ParseAsset_Material(QDataStream *aZoneFileStream); - void ParseAsset_PixelShader(QDataStream *aZoneFileStream); void ParseAsset_TechSet(QDataStream *aZoneFileStream); - void ParseAsset_Image(QDataStream *aZoneFileStream); void ParseAsset_LoadedSound(QDataStream *aZoneFileStream); void ParseAsset_ColMapMP(QDataStream *aZoneFileStream); - void ParseAsset_GameMapSP(QDataStream *aZoneFileStream); - void ParseAsset_GameMapMP(QDataStream *aZoneFileStream); - void ParseAsset_LightDef(QDataStream *aZoneFileStream); - void ParseAsset_UIMap(QDataStream *aZoneFileStream); - void ParseAsset_SNDDriverGlobals(QDataStream *aZoneFileStream); - void ParseAsset_AIType(QDataStream *aZoneFileStream); - void ParseAsset_FX(QDataStream *aZoneFileStream); - void ParseAsset_XAnim(QDataStream *aZoneFileStream); - void ParseAsset_StringTable(QDataStream *aZoneFileStream); - void ParseAsset_MenuFile(QDataStream *aZoneFileStream); - void ParseAsset_Weapon(QDataStream *aZoneFileStream); + void ParseAsset_PixelShader(QDataStream *aZoneFileStream); void ParseAsset_D3DBSP(QDataStream *aZoneFileStream); + void ParseAsset_Font(QDataStream *aZoneFileStream); + void ParseAsset_MenuFile(QDataStream *aZoneFileStream); + void ParseAsset_LocalString(QDataStream *aZoneFileStream); + void ParseAsset_Weapon(QDataStream *aZoneFileStream); + void ParseAsset_FX(QDataStream *aZoneFileStream); + void ParseAsset_RawFile(QDataStream *aZoneFileStream); + void ParseAsset_StringTable(QDataStream *aZoneFileStream); int LoadFile_D3DBSP(const QString aFilePath); From 45b0426757888b72c90a8306d26559c5f4e4a609 Mon Sep 17 00:00:00 2001 From: = Date: Fri, 10 Jan 2025 04:36:29 -0500 Subject: [PATCH 07/22] Updated ui with menu bar and map tab. --- mainwindow.ui | 160 +++++++++++++++++++++++++++++++++++--------------- 1 file changed, 113 insertions(+), 47 deletions(-) diff --git a/mainwindow.ui b/mainwindow.ui index 0476b70..27cceb4 100644 --- a/mainwindow.ui +++ b/mainwindow.ui @@ -6,17 +6,15 @@ 0 0 - 850 - 628 + 1077 + 814 FastFile Wizard - QMainWindow { - -} + @@ -55,7 +53,7 @@ true - 0 + 10 @@ -69,6 +67,9 @@ true + + true + FastFile path... @@ -93,13 +94,16 @@ true + + true + ZoneFile path... - + true @@ -1029,50 +1033,112 @@ + + + Menus + + + + + + 100 + + + + 1 + + + + + + - - - - - - true - - - < Back - - - - - - - true - - - Qt::Orientation::Horizontal - - - - 40 - 20 - - - - - - - - true - - - Next > - - - - - + + + + 0 + 0 + 1077 + 21 + + + + + + + + File + + + + Recent Fast Files + + + + + Recent Zone Files + + + + + + + + + + + + + + + + + + + + + File + + + + + false + + + New Fast File... + + + + + false + + + New Zone File... + + + + + Open Fast File... + + + + + Open Zone File... + + + + + asd + + + + + fgh + + From f08da5b67009fd8f867eb8d4a12767646c652f09 Mon Sep 17 00:00:00 2001 From: = Date: Fri, 10 Jan 2025 04:36:41 -0500 Subject: [PATCH 08/22] Added more utils. --- utils.h | 117 ++++++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 92 insertions(+), 25 deletions(-) diff --git a/utils.h b/utils.h index 4a0bfc0..35eaa3a 100644 --- a/utils.h +++ b/utils.h @@ -2,6 +2,7 @@ #define UTILS_H #include "enums.h" +#include "qcolor.h" #include #include @@ -15,36 +16,36 @@ public: */ static QString AssetTypeToString(const QString aAssetType) { const QString cleanedType = aAssetType.toUpper(); - if (cleanedType == "17000000") { // localized string PARTIALLY VERIFIED - return "LOCAL STRING"; - } else if (cleanedType == "20000000") { // raw_file PARTIALLY VERIFIED - return "RAW FILE"; - } else if (cleanedType == "1A000000") { // fx PARTIALLY VERIFIED - return "EFFECT"; - } else if (cleanedType == "09000000") { // loaded_sound PARTIALLY VERIFIED - return "SOUND"; - } else if (cleanedType == "04000000") { // x_anim PARTIALLY VERIFIED + if (cleanedType == "04000000") { // x_anim PARTIALLY VERIFIED return "ANIMATION"; - } else if (cleanedType == "0C000000") { // collision_map PARTIALLY VERIFIED - return "COLLISION MAP"; - } else if (cleanedType == "21000000") { // string_table PARTIALLY VERIFIED - return "STRING TABLE"; - } else if (cleanedType == "15000000") { // menu_file PARTIALLY VERIFIED - return "MENU"; - } else if (cleanedType == "07000000") { // tech set PARTIALLY VERIFIED - return "TECH SET"; - } else if (cleanedType == "18000000") { // weapon PARTIALLY VERIFIED - return "WEAPON"; - } else if (cleanedType == "11000000") { // d3dbsp dump PARTIALLY VERIFIED - return "D3DBSP DUMP"; - } else if (cleanedType == "12000000") { // light_def PARTIALLY VERIFIED - return "LIGHT DEF"; - } else if (cleanedType == "14000000") { // font PARTIALLY VERIFIED - return "FONT"; } else if (cleanedType == "05000000") { // xmodel PARTIALLY VERIFIED return "MODEL"; + } else if (cleanedType == "06000000") { // material VERIFIED + return "MATERIAL"; + } else if (cleanedType == "07000000") { // tech set VERIFIED + return "TECH SET"; + } else if (cleanedType == "09000000") { // loaded_sound VERIFIED + return "SOUND"; + } else if (cleanedType == "0C000000") { // collision_map PARTIALLY VERIFIED + return "COLLISION MAP"; } else if (cleanedType == "0D000000") { // shader PARTIALLY VERIFIED return "SHADER"; + } else if (cleanedType == "11000000") { // d3dbsp dump VERIFIED + return "D3DBSP DUMP"; + } else if (cleanedType == "14000000") { // font PARTIALLY VERIFIED + return "FONT"; + } else if (cleanedType == "15000000") { // menu_file PARTIALLY VERIFIED + return "MENU"; + } else if (cleanedType == "17000000") { // localized string PARTIALLY VERIFIED + return "LOCAL STRING"; + } else if (cleanedType == "18000000") { // weapon PARTIALLY VERIFIED + return "WEAPON"; + } else if (cleanedType == "1A000000") { // fx VERIFIED + return "EFFECT"; + } else if (cleanedType == "20000000") { // raw_file VERIFIED + return "RAW FILE"; + } else if (cleanedType == "21000000") { // string_table PARTIALLY VERIFIED + return "STRING TABLE"; } return "UNKNOWN"; } @@ -164,6 +165,72 @@ public: static quint32 PaddingSize(quint32 size) { return PadInt4(size) - size; } + + static QString MenuVAlignToStr(MENU_V_ALIGNMENT align) { + if (align == VERTICAL_ALIGN_SUBTOP) { + return "VERTICAL_ALIGN_SUBTOP"; + } else if (align == VERTICAL_ALIGN_TOP) { + return "VERTICAL_ALIGN_TOP"; + } else if (align == VERTICAL_ALIGN_CENTER) { + return "VERTICAL_ALIGN_CENTER"; + } else if (align == VERTICAL_ALIGN_BOTTOM) { + return "VERTICAL_ALIGN_BOTTOM"; + } else if (align == VERTICAL_ALIGN_FULLSCREEN) { + return "VERTICAL_ALIGN_FULLSCREEN"; + } else if (align == VERTICAL_ALIGN_NOSCALE) { + return "VERTICAL_ALIGN_NOSCALE"; + } else if (align == VERTICAL_ALIGN_TO480) { + return "VERTICAL_ALIGN_TO480"; + } else if (align == VERTICAL_ALIGN_CENTER_SAFEAREA) { + return "VERTICAL_ALIGN_CENTER_SAFEAREA"; + } else if (align == VERTICAL_ALIGN_MAX) { + return "VERTICAL_ALIGN_CENTER_SAFEAREA"; + } else if (align == VERTICAL_ALIGN_DEFAULT) { + return "VERTICAL_ALIGN_SUBTOP"; + } + return "VERTICAL_ALIGN_SUBTOP"; + } + + static QString MenuHAlignToStr(MENU_H_ALIGNMENT align) { + if (align == HORIZONTAL_ALIGN_SUBLEFT) { + return "HORIZONTAL_ALIGN_SUBLEFT"; + } else if (align == HORIZONTAL_ALIGN_LEFT) { + return "HORIZONTAL_ALIGN_LEFT"; + } else if (align == HORIZONTAL_ALIGN_CENTER) { + return "HORIZONTAL_ALIGN_CENTER"; + } else if (align == HORIZONTAL_ALIGN_RIGHT) { + return "HORIZONTAL_ALIGN_RIGHT"; + } else if (align == HORIZONTAL_ALIGN_FULLSCREEN) { + return "HORIZONTAL_ALIGN_FULLSCREEN"; + } else if (align == HORIZONTAL_ALIGN_NOSCALE) { + return "HORIZONTAL_ALIGN_NOSCALE"; + } else if (align == HORIZONTAL_ALIGN_TO640) { + return "HORIZONTAL_ALIGN_TO640"; + } else if (align == HORIZONTAL_ALIGN_CENTER_SAFEAREA) { + return "HORIZONTAL_ALIGN_CENTER_SAFEAREA"; + } else if (align == HORIZONTAL_ALIGN_MAX) { + return "HORIZONTAL_ALIGN_CENTER_SAFEAREA"; + } else if (align == HORIZONTAL_ALIGN_DEFAULT) { + return "HORIZONTAL_ALIGN_SUBLEFT"; + } + return "HORIZONTAL_ALIGN_SUBLEFT"; + } + + static QColor ColorFromNormalized(float r, float g, float b, float a) { + // Ensure values are clamped between 0 and 1 + r = qBound(0.0f, r, 1.0f); + g = qBound(0.0f, g, 1.0f); + b = qBound(0.0f, b, 1.0f); + a = qBound(0.0f, a, 1.0f); + + // Convert to 0-255 scale + int red = static_cast(r * 255); + int green = static_cast(g * 255); + int blue = static_cast(b * 255); + int alpha = static_cast(a * 255); + + return QColor(red, green, blue, alpha); + } }; #endif // UTILS_H From bbce4fbd080f154ad4ca1885478401ba23e8a4bf Mon Sep 17 00:00:00 2001 From: = Date: Sat, 11 Jan 2025 01:02:45 -0500 Subject: [PATCH 09/22] Added serializable structs for zone file, localize asset, and rawfile asset. --- localize.h | 55 ++++++++++++++++++++++++ rawfile.h | 61 ++++++++++++++++++++++++++ zone.h | 124 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 240 insertions(+) create mode 100644 localize.h create mode 100644 rawfile.h create mode 100644 zone.h diff --git a/localize.h b/localize.h new file mode 100644 index 0000000..bef1b62 --- /dev/null +++ b/localize.h @@ -0,0 +1,55 @@ +#ifndef LOCALIZE_H +#define LOCALIZE_H + +#include +#include + +struct Localize { + quint32 valuePtr; + quint32 namePtr; + QString referenceStr; + QString localizedStr; +}; + +QDataStream &operator<<(QDataStream &out, const Localize &localize) { + out << localize.valuePtr << localize.namePtr; + + // Parse gsc contents + QByteArray localizedStrData(localize.localizedStr.toUtf8()); + out.writeRawData(localizedStrData.data(), localizedStrData.size()); + + // Parse rawfile path + QByteArray refStrData(localize.referenceStr.toUtf8()); + out.writeRawData(refStrData.data(), refStrData.size()); + + return out; +} + +QDataStream &operator>>(QDataStream &in, Localize &localize) { + // Parse value and name pointers + in >> localize.valuePtr >> localize.namePtr; + + // Parse localized string + QString localizedStr; + char localizedStrChar; + in >> localizedStrChar; + while (localizedStrChar != 0) { + localizedStr += localizedStrChar; + in >> localizedStrChar; + } + localize.localizedStr = localizedStr; + + // Parse localized reference name + QString refStr; + char refStrChar; + in >> refStrChar; + while (refStrChar != 0) { + refStr += refStrChar; + in >> refStrChar; + } + localize.referenceStr = refStr; + + return in; +} + +#endif // LOCALIZE_H diff --git a/rawfile.h b/rawfile.h new file mode 100644 index 0000000..6134e16 --- /dev/null +++ b/rawfile.h @@ -0,0 +1,61 @@ +#ifndef RAWFILE_H +#define RAWFILE_H + +#include +#include +#include + +struct RawFile { + quint32 gscNamePtr; + quint32 gscLength; + quint32 rawFilePathPtr; + QString rawFilePath; + QString rawFileContents; +}; + +QDataStream &operator<<(QDataStream &out, const RawFile &rawFile) { + out << rawFile.gscNamePtr; + out << rawFile.gscLength; + out << rawFile.rawFilePathPtr; + + // Parse rawfile path + QByteArray rawFilePathData(rawFile.rawFilePath.toUtf8()); + out.writeRawData(rawFilePathData.data(), rawFilePathData.size()); + + // Parse gsc contents + QByteArray rawFileContentsData(rawFile.rawFileContents.toUtf8()); + out.writeRawData(rawFileContentsData.data(), rawFileContentsData.size()); + + return out; +} + +QDataStream &operator>>(QDataStream &in, RawFile &rawFile) { + in >> rawFile.gscNamePtr; + in >> rawFile.gscLength; + in >> rawFile.rawFilePathPtr; + + // Parse rawfile path + QString rawFilePath; + char scriptPathChar; + in >> scriptPathChar; + while (scriptPathChar != 0) { + rawFilePath += scriptPathChar; + in >> scriptPathChar; + } + rawFile.rawFilePath = rawFilePath; + + // Parse gsc contents + QString rawFileContents; + char rawFileContentsChar; + in >> rawFileContentsChar; + while (rawFileContentsChar != 0 && rawFileContentsChar != -1) { + rawFileContents += rawFileContentsChar; + in >> rawFileContentsChar; + } + rawFile.rawFileContents = rawFileContents; + + return in; +} + + +#endif // RAWFILE_H diff --git a/zone.h b/zone.h new file mode 100644 index 0000000..ea4b250 --- /dev/null +++ b/zone.h @@ -0,0 +1,124 @@ +#ifndef ZONE_H +#define ZONE_H + +#include "enums.h" +#include "qtypes.h" +#include +#include + +struct Zone { + quint32 zoneFileSize; + quint32 unknown1; + quint32 unknown2; + quint32 unknown3; + quint32 unknown4; + quint32 unknown5; + quint32 unknown6; + quint32 unknown7; + quint32 unknown8; + quint32 tagCount; + quint32 unknown9; + quint32 recordCount; + quint32 unknown10; + quint32 unknown11; + QVector tagPtrs; + QStringList tags; + + QVector assetTypes; +}; + +QDataStream &operator<<(QDataStream &out, const Zone &zone) { + // Write adjusted fastfile size + out << zone.zoneFileSize - 36; + // Write unknowns 1-8 + out << zone.unknown1; + out << zone.unknown2; + out << zone.unknown3; + out << zone.unknown4; + out << zone.unknown5; + out << zone.unknown6; + out << zone.unknown7; + out << zone.unknown8; + // Write tag count + out << zone.tagCount; + // Write unknown 9 + out << zone.unknown9; + // Write record count + out << zone.recordCount; + // Write unknowns 10-11 + out << zone.unknown10; + out << zone.unknown11; + // Write tag pointers + foreach (quint32 tagPtr, zone.tagPtrs) { + out << tagPtr; + } + // Write tags + foreach (QString tag, zone.tags) { + out << tag.toLocal8Bit(); + } + + return out; +} + +QDataStream &operator>>(QDataStream &in, Zone &zone) { + // Parse file size + in >> zone.zoneFileSize; + zone.zoneFileSize += 36; + // Parse unknowns 1-8 + in >> zone.unknown1; + in >> zone.unknown2; + in >> zone.unknown3; + in >> zone.unknown4; + in >> zone.unknown5; + in >> zone.unknown6; + in >> zone.unknown7; + in >> zone.unknown8; + // Parse tag count + in >> zone.tagCount; + // Parse unknown 9 + in >> zone.unknown9; + // Parse record count + in >> zone.recordCount; + + in >> zone.unknown10; + if (zone.tagCount) { + // Parse unknowns 10-11 + in >> zone.unknown11; + + // Parse tag ptrs + for (quint32 i = 0; i < zone.tagCount - 1; i++) { + quint32 tagPtr; + in >> tagPtr; + + zone.tagPtrs.push_back(tagPtr); + } + + // Parse tags/strings before index + QString zoneTag; + char zoneTagChar; + for (quint32 i = 0; i < zone.tagCount - 1; i++) { + in >> zoneTagChar; + while (zoneTagChar != 0) { + zoneTag += zoneTagChar; + in >> zoneTagChar; + } + zone.tags.push_back(zoneTag); + zoneTag.clear(); + } + } + + // Parse index + for (quint32 i = 0; i < zone.recordCount; i++) { + // Parse asset type + quint32 assetType; + in >> assetType; + // Add asset type to vector + zone.assetTypes << (ASSET_TYPE)assetType; + // Skip separator + in.skipRawData(4); + } + + return in; +} + +#endif // ZONE_H From 288af4b64c1990aca90da83c6d7f2b5391cecc63 Mon Sep 17 00:00:00 2001 From: = Date: Sat, 11 Jan 2025 01:03:00 -0500 Subject: [PATCH 10/22] Remove dlls from qrc --- Data.qrc | 1 - 1 file changed, 1 deletion(-) diff --git a/Data.qrc b/Data.qrc index 1f6b16a..0325361 100644 --- a/Data.qrc +++ b/Data.qrc @@ -21,5 +21,4 @@ data/d3dbsp/asset_viewer.d3dbsp data/d3dbsp/barebones.d3dbsp - From 473165e4ad4084ec853cbb9a0d07326c3e8e7370 Mon Sep 17 00:00:00 2001 From: = Date: Sat, 11 Jan 2025 01:06:34 -0500 Subject: [PATCH 11/22] Add project user file to gitignore. --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 297c54a..b1edd3e 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ /build/ /data/dlls/ /data/fastfiles/ +*.user From 15866b4f5388d50e45af487f67e5a273f70d367c Mon Sep 17 00:00:00 2001 From: = Date: Sat, 11 Jan 2025 01:07:32 -0500 Subject: [PATCH 12/22] Add project user file to gitignore. --- .gitignore | 10 +- FastFile_WaW.pro.user | 271 ------------------------------------------ 2 files changed, 9 insertions(+), 272 deletions(-) delete mode 100644 FastFile_WaW.pro.user diff --git a/.gitignore b/.gitignore index b1edd3e..001fa91 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,12 @@ /build/ /data/dlls/ /data/fastfiles/ -*.user + +# Ignore Qt Creator user files +*.pro.user +*.pro.user.* +*.qbs.user +*.qbs.user.* +*.creator.user +*.creator.user.* +*.creator.* diff --git a/FastFile_WaW.pro.user b/FastFile_WaW.pro.user deleted file mode 100644 index 4e96dc1..0000000 --- a/FastFile_WaW.pro.user +++ /dev/null @@ -1,271 +0,0 @@ - - - - - - EnvironmentId - {40d992cb-ac11-4385-a22b-016f1b4251a7} - - - ProjectExplorer.Project.ActiveTarget - 0 - - - ProjectExplorer.Project.EditorSettings - - true - false - true - - Cpp - - CppGlobal - - - - QmlJS - - QmlJSGlobal - - - 2 - UTF-8 - false - 4 - false - 0 - 80 - true - true - 1 - 0 - false - true - false - 2 - true - true - 0 - 8 - true - false - 1 - true - true - true - *.md, *.MD, Makefile - false - true - true - - - - ProjectExplorer.Project.PluginSettings - - - true - false - true - true - true - true - - false - - - 0 - true - - true - true - Builtin.DefaultTidyAndClazy - 16 - true - - - - true - - - - - ProjectExplorer.Project.Target.0 - - Desktop - Desktop Qt 6.8.1 MSVC2022 64bit - Desktop Qt 6.8.1 MSVC2022 64bit - qt.qt6.681.win64_msvc2022_64_kit - 1 - 0 - 0 - - 0 - C:\Users\njohnson\Projects\FastFile_WaW\build\Desktop_Qt_6_8_1_MSVC2022_64bit-Debug - C:/Users/njohnson/Projects/FastFile_WaW/build/Desktop_Qt_6_8_1_MSVC2022_64bit-Debug - - - true - QtProjectManager.QMakeBuildStep - false - - - - true - Qt4ProjectManager.MakeStep - - 2 - Build - Build - ProjectExplorer.BuildSteps.Build - - - - true - Qt4ProjectManager.MakeStep - clean - - 1 - Clean - Clean - ProjectExplorer.BuildSteps.Clean - - 2 - false - - false - - Debug - Qt4ProjectManager.Qt4BuildConfiguration - 2 - - - C:\Users\njohnson\Projects\FastFile_WaW\build\Desktop_Qt_6_8_1_MSVC2022_64bit-Release - C:/Users/njohnson/Projects/FastFile_WaW/build/Desktop_Qt_6_8_1_MSVC2022_64bit-Release - - - true - QtProjectManager.QMakeBuildStep - false - - - - true - Qt4ProjectManager.MakeStep - - 2 - Build - Build - ProjectExplorer.BuildSteps.Build - - - - true - Qt4ProjectManager.MakeStep - clean - - 1 - Clean - Clean - ProjectExplorer.BuildSteps.Clean - - 2 - false - - false - - Release - Qt4ProjectManager.Qt4BuildConfiguration - 0 - 0 - - - 0 - C:\Users\njohnson\Projects\FastFile_WaW\build\Desktop_Qt_6_8_1_MSVC2022_64bit-Profile - C:/Users/njohnson/Projects/FastFile_WaW/build/Desktop_Qt_6_8_1_MSVC2022_64bit-Profile - - - true - QtProjectManager.QMakeBuildStep - false - - - - true - Qt4ProjectManager.MakeStep - - 2 - Build - Build - ProjectExplorer.BuildSteps.Build - - - - true - Qt4ProjectManager.MakeStep - clean - - 1 - Clean - Clean - ProjectExplorer.BuildSteps.Clean - - 2 - false - - false - - Profile - Qt4ProjectManager.Qt4BuildConfiguration - 0 - 0 - 0 - - 3 - - - 0 - Deploy - Deploy - ProjectExplorer.BuildSteps.Deploy - - 1 - - false - ProjectExplorer.DefaultDeployConfiguration - - 1 - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph "dwarf,4096" -F 250 - - Qt4ProjectManager.Qt4RunConfiguration: - C:/Users/njohnson/Projects/FastFile_WaW/FastFile_WaW.pro - false - true - true - true - C:/Users/njohnson/Projects/FastFile_WaW/build/Desktop_Qt_6_8_1_MSVC2022_64bit-Release - - 1 - - - - ProjectExplorer.Project.TargetCount - 1 - - - ProjectExplorer.Project.Updater.FileVersion - 22 - - - Version - 22 - - From 9407f1d23ea18e796dabb3e644c665ab308c87ec Mon Sep 17 00:00:00 2001 From: = Date: Sat, 11 Jan 2025 01:07:54 -0500 Subject: [PATCH 13/22] Added serializable structs for zone file, localize asset, and rawfile asset. --- FastFile_WaW.pro | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/FastFile_WaW.pro b/FastFile_WaW.pro index dda019b..028b494 100644 --- a/FastFile_WaW.pro +++ b/FastFile_WaW.pro @@ -18,9 +18,12 @@ SOURCES += \ HEADERS += \ enums.h \ + localize.h \ mainwindow.h \ + rawfile.h \ structs.h \ - utils.h + utils.h \ + zone.h FORMS += \ mainwindow.ui From 9ed104eb7c66860373baa7fe0ca8f7f7804171f7 Mon Sep 17 00:00:00 2001 From: = Date: Sat, 11 Jan 2025 01:08:06 -0500 Subject: [PATCH 14/22] Add asset type enums. --- enums.h | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/enums.h b/enums.h index e593546..9ec39c9 100644 --- a/enums.h +++ b/enums.h @@ -543,6 +543,25 @@ enum MENU_BUTTON { APAD_RIGHT = 31 }; +enum ASSET_TYPE { + ASSET_UNKNOWN = 0, + ASSET_ANIMATION = 4, // x_anim PARTIALLY VERIFIED + ASSET_MODEL = 5, // xmodel PARTIALLY VERIFIED + ASSET_MATERIAL = 6, // material VERIFIED + ASSET_TECH_SET = 7, // tech set VERIFIED + ASSET_SOUND = 9, // loaded_sound VERIFIED + ASSET_COLLISION_MAP = 12, // collision_map PARTIALLY VERIFIED + ASSET_SHADER = 13, // shader PARTIALLY VERIFIED + ASSET_D3DBSP_DUMP = 17, // d3dbsp dump VERIFIED + ASSET_FONT = 20, // font PARTIALLY VERIFIED + ASSET_MENU = 21, // menu_file VERIFIED + ASSET_LOCAL_STRING = 23, // localized string VERIFIED + ASSET_WEAPON = 24, // weapon VERIFIED + ASSET_EFFECT = 26, // fx VERIFIED + ASSET_RAW_FILE = 32, // raw_file VERIFIED + ASSET_STRING_TABLE = 33 // string_table PARTIALLY VERIFIED +}; + // Change this depending on the platform // PC #define DEVMAP_LEVEL_FIRST "devmap intro_pac" From f45f38738ddbf506e41743bba7a4a6d961f6b589 Mon Sep 17 00:00:00 2001 From: = Date: Sat, 11 Jan 2025 01:08:54 -0500 Subject: [PATCH 15/22] Added serializable structs for zone file, localize asset, and rawfile asset. --- mainwindow.cpp | 404 ++++++++++++------------------------------------- 1 file changed, 94 insertions(+), 310 deletions(-) diff --git a/mainwindow.cpp b/mainwindow.cpp index b169aad..09700fa 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -6,7 +6,7 @@ MainWindow::MainWindow(QWidget *parent) , ui(new Ui::MainWindow) { ui->setupUi(this); - mTypeMap = QMap(); + mTypeMap = QMap(); mTypeOrder = QStringList(); mRawFileMap = QMap(); mTreeMap = QMap(); @@ -227,7 +227,7 @@ void MainWindow::StrTableSelected(QString aStrTableName) { for (auto strTableEntry : mStrTableMap[aStrTableName]) { ui->tableWidget_StringTable->insertRow(ui->tableWidget_StringTable->rowCount() + 1); ui->tableWidget_StringTable->setItem(entryIndex, 0, new QTableWidgetItem(strTableEntry.first)); - ui->tableWidget_StringTable->setItem(entryIndex, 1, new QTableWidgetItem(Utils::AssetTypeToString(strTableEntry.second))); + ui->tableWidget_StringTable->setItem(entryIndex, 1, new QTableWidgetItem(strTableEntry.second)); entryIndex++; } @@ -487,285 +487,18 @@ void MainWindow::ParseFFHeader(QByteArray aFastFileData) { ParseFFVersion(&afastFileStream); } -void MainWindow::ParseZoneHeader(QDataStream *aZoneFileStream) { - ParseZoneSize(aZoneFileStream); - ParseZoneUnknownsA(aZoneFileStream); +void MainWindow::ParseAsset_Localize(QDataStream *aZoneFileStream) { + Localize localize; + *aZoneFileStream >> localize; - ParseZoneTagCount(aZoneFileStream); - ParseZoneUnknownsB(aZoneFileStream); - - ParseZoneRecordCount(aZoneFileStream); - - if (mTagCount) { - ParseZoneUnknownsC(aZoneFileStream); - ParseZoneTags(aZoneFileStream); - } else { - aZoneFileStream->skipRawData(4); - } -} - -void MainWindow::ParseZoneSize(QDataStream *aZoneFileStream) { - // Byte 0-3: (unsigned int?) correlates to the fastfile's - // size after decompression minus 36 bytes (24h) - quint32 zoneFileSize; - *aZoneFileStream >> zoneFileSize; - if (zoneFileSize <= 0) { - qDebug() << "Tried to open empty zone file!"; - exit(-1); - } - zoneFileSize += 36; - ui->spinBox_FileSize->setValue(zoneFileSize); - - qDebug() << QString("Zone file size: '%1'").arg(zoneFileSize); -} - -/* - ParseZoneUnknownsA() - - Parses the 1st section of unknowns as hex vals and uint32s -*/ -void MainWindow::ParseZoneUnknownsA(QDataStream *aZoneFileStream) { - // Byte 4-7, 8-11, 12-15: unknown - QByteArray unknown1(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown1.data(), 4); - ui->lineEdit_U1->setText(unknown1.toHex()); - ui->spinBox_U1->setValue(unknown1.toUInt()); - - QByteArray unknown2(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown2.data(), 4); - ui->lineEdit_U2->setText(unknown2.toHex()); - ui->spinBox_U2->setValue(unknown2.toUInt()); - - QByteArray unknown3(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown3.data(), 4); - ui->lineEdit_U3->setText(unknown3.toHex()); - ui->spinBox_U3->setValue(unknown3.toUInt()); - - // Byte 16-19, 20-23: empty/unknown - QByteArray unknown4(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown4.data(), 4); - ui->lineEdit_U4->setText(unknown4.toHex()); - ui->spinBox_U4->setValue(unknown4.toUInt()); - - QByteArray unknown5(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown5.data(), 4); - ui->lineEdit_U5->setText(unknown5.toHex()); - ui->spinBox_U5->setValue(unknown5.toUInt()); - - // Byte 24-27: somehow related to the filesize, but smaller value - QByteArray unknown6(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown6.data(), 4); - ui->lineEdit_U6->setText(unknown6.toHex()); - ui->spinBox_U6->setValue(unknown6.toUInt()); - - // Byte 28-31, 32-35: unknown - QByteArray unknown7(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown7.data(), 4); - ui->lineEdit_U7->setText(unknown7.toHex()); - ui->spinBox_U7->setValue(unknown7.toUInt()); - - QByteArray unknown8(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown8.data(), 4); - ui->lineEdit_U8->setText(unknown8.toHex()); - ui->spinBox_U8->setValue(unknown8.toUInt()); - - qDebug() << QString("Unknowns A: '%1''%2''%3''%4''%5''%6''%7''%8'") - .arg(unknown1.toHex()) - .arg(unknown2.toHex()) - .arg(unknown3.toHex()) - .arg(unknown4.toHex()) - .arg(unknown5.toHex()) - .arg(unknown6.toHex()) - .arg(unknown7.toHex()) - .arg(unknown8.toHex()); -} - -/* - ParseZoneTagCount() - - Parses the number of string tags in the zone index -*/ -void MainWindow::ParseZoneTagCount(QDataStream *aZoneFileStream) { - // Byte 36-39: might indicate where the index record starts, - // calculation unknown - *aZoneFileStream >> mTagCount; - ui->spinBox_TagCount->setValue(mTagCount); - qDebug() << QString("Tag count: '%1'").arg(mTagCount); -} - -/* - ParseZoneRecordCount() - - Parses the number of records in the zone index -*/ -void MainWindow::ParseZoneRecordCount(QDataStream *aZoneFileStream) { - // Byte 44-47: (unsigned int) number of records - *aZoneFileStream >> mRecordCount; - ui->spinBox_RecordCount->setValue(mRecordCount); - qDebug() << QString("Record count: '%1'").arg(mRecordCount); -} - -/* - ParseZoneUnknownsB() - - Parses the 2nd section of unknowns as hex vals and uint32s -*/ -void MainWindow::ParseZoneUnknownsB(QDataStream *aZoneFileStream) { - // Byte 44-47: Unknown/empty? - QByteArray unknown9(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown9.data(), 4); - ui->lineEdit_U9->setText(unknown9.toHex()); - ui->spinBox_U9->setValue(unknown9.toUInt()); - - qDebug() << QString("Unknowns B: \n\t'%1'") - .arg(unknown9.toHex()); -} - -/* - ParseZoneUnknownsC() - - Parses the 3rd section of unknowns as hex vals and uint32s -*/ -void MainWindow::ParseZoneUnknownsC(QDataStream *aZoneFileStream) { - // Byte 40-43: Unknown/empty? - QByteArray unknown10(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown10.data(), 4); - ui->lineEdit_U10->setText(unknown10.toHex()); - ui->spinBox_U10->setValue(unknown10.toUInt()); - - // Byte 44-47: Unknown/empty? - QByteArray unknown11(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown11.data(), 4); - ui->lineEdit_U11->setText(unknown11.toHex()); - ui->spinBox_U11->setValue(unknown11.toUInt()); - - qDebug() << QString("Unknowns C: \n\t'%1'\n\t'%2'") - .arg(unknown10.toHex()) - .arg(unknown11.toHex()); -} - -/* - ParseZoneTags() - - Parses the string tags ate the start of zone file -*/ -void MainWindow::ParseZoneTags(QDataStream *aZoneFileStream) { - // Byte 48-51: Repeated separators? ÿÿÿÿ x i - aZoneFileStream->skipRawData(4 * (mTagCount - 1)); - - // Parse tags/strings before index - QString zoneTag; - char zoneTagChar; - for (quint32 i = 0; i < mTagCount - 1; i++) { - *aZoneFileStream >> zoneTagChar; - while (zoneTagChar != 0) { - zoneTag += zoneTagChar; - *aZoneFileStream >> zoneTagChar; - } - ui->listWidget_Tags->addItem(zoneTag); - // qDebug() << "Tag: " << zoneTag; - zoneTag.clear(); - } -} - -/* - ParseZoneIndex() - - Parse the binary zone index data and populate table -*/ -void MainWindow::ParseZoneIndex(QDataStream *aZoneFileStream) { - // Don't parse if no records - if (!mRecordCount) { return; } - - // Track past assets and counts - int consecutiveIndex = 0; - int consecutiveCount = 0; - QString lastAssetType = ""; - - // Parse index & map found asset types - for (quint32 i = 0; i < mRecordCount; i++) { - // Skip record start - QByteArray rawAssetType(4, Qt::Uninitialized); - aZoneFileStream->readRawData(rawAssetType.data(), 4); - if (!mTypeMap.contains(rawAssetType.toHex())) { - mTypeMap[rawAssetType.toHex()] = 0; - } - mTypeMap[rawAssetType.toHex()]++; - mTypeOrder << rawAssetType.toHex(); - - // Skip separator - aZoneFileStream->skipRawData(4); - - // Get asset description from type - const QString assetType = rawAssetType.toHex(); - - // Set lastAsset as current if first run - if (lastAssetType.isEmpty()) { - lastAssetType = assetType; - } - - // Track counts or populate asset order table - if (lastAssetType == assetType) { - // Count consecutive assets - consecutiveCount++; - } else { - // Insert row and populate for the previous asset type - ui->tableWidget_Order->insertRow(consecutiveIndex); - ui->tableWidget_Order->setItem(consecutiveIndex, 0, new QTableWidgetItem(lastAssetType)); - ui->tableWidget_Order->setItem(consecutiveIndex, 1, new QTableWidgetItem(Utils::AssetTypeToString(lastAssetType))); - ui->tableWidget_Order->setItem(consecutiveIndex, 2, new QTableWidgetItem(QString::number(consecutiveCount))); - - // Update counts and asset type - consecutiveCount = 1; - consecutiveIndex++; - lastAssetType = assetType; - } - } -} - -void MainWindow::ParseAsset_LocalString(QDataStream *aZoneFileStream) { - // Skip separator - aZoneFileStream->skipRawData(8); - - // Parse local string asset contents - QString localStr; - char localStrChar; - *aZoneFileStream >> localStrChar; - while (localStrChar != 0) { - localStr += localStrChar; - *aZoneFileStream >> localStrChar; - } - - // Parse rawfile name - QString aliasName; - char aliasNameChar; - *aZoneFileStream >> aliasNameChar; - while (aliasNameChar != 0) { - aliasName += aliasNameChar; - *aZoneFileStream >> aliasNameChar; - } - // qDebug() << QString("%1 = %2").arg(aliasName).arg(localStr); - ui->listWidget_LocalString->addItem(QString("%1 = %2").arg(aliasName).arg(localStr)); + ui->listWidget_LocalString->addItem(QString("%1 = %2").arg(localize.referenceStr).arg(localize.localizedStr)); } void MainWindow::ParseAsset_RawFile(QDataStream *aZoneFileStream) { - // Skip start separator FF FF FF FF (pointer?) - aZoneFileStream->skipRawData(4); + RawFile rawFile; + *aZoneFileStream >> rawFile; - quint32 gscLength; - *aZoneFileStream >> gscLength; - - // Skip unknown 4 byte data - aZoneFileStream->skipRawData(4); - - // Parse rawfile path - QString rawFilePath; - char scriptPathChar; - *aZoneFileStream >> scriptPathChar; - while (scriptPathChar != 0) { - rawFilePath += scriptPathChar; - *aZoneFileStream >> scriptPathChar; - } + QString rawFilePath = rawFile.rawFilePath; rawFilePath.replace(",", ""); const QStringList pathParts = rawFilePath.split('/'); if (pathParts.size() == 0) { @@ -801,17 +534,7 @@ void MainWindow::ParseAsset_RawFile(QDataStream *aZoneFileStream) { parentItem = newChildItem; } } - - // Parse gsc contents - QString rawFileContents; - char rawFileContentsChar; - *aZoneFileStream >> rawFileContentsChar; - while (rawFileContentsChar != 0 && rawFileContentsChar != -1) { - rawFileContents += rawFileContentsChar; - *aZoneFileStream >> rawFileContentsChar; - } - mRawFileMap[rawFilePath] = (rawFileContents.isEmpty()) ? ("EMPTY") : (rawFileContents); - // qDebug() << QString("%1: %2").arg(rawFilePath).arg(rawFileContents); + mRawFileMap[rawFilePath] = (rawFile.rawFileContents.isEmpty()) ? ("EMPTY") : (rawFile.rawFileContents); } void MainWindow::ParseAsset_XModel(QDataStream *aZoneFileStream) { @@ -1498,30 +1221,73 @@ void MainWindow::ParseZoneFile(QByteArray aDecompressedData) { zoneFileStream.setFloatingPointPrecision(QDataStream::SinglePrecision); // Parse data from zone file header - ParseZoneHeader(&zoneFileStream); - ParseZoneIndex(&zoneFileStream); + Zone zone; + zoneFileStream >> zone; - // Track current and consecutive assets - int assetIndex = 0; - - // Iterate asset types found in index - for (auto [assetType, assetCount] : mTypeMap.asKeyValueRange()) { - // Get asset description from type - QString assetStr = Utils::AssetTypeToString(assetType); - - // Insert row and populate - ui->tableWidget_Index->insertRow(assetIndex); - ui->tableWidget_Index->setItem(assetIndex, 0, new QTableWidgetItem(assetType)); - ui->tableWidget_Index->setItem(assetIndex, 1, new QTableWidgetItem(assetStr)); - ui->tableWidget_Index->setItem(assetIndex, 2, new QTableWidgetItem(QString::number(assetCount))); - - // Update count - assetIndex++; + // Add header data to ui + ui->spinBox_FileSize->setValue(zone.zoneFileSize); + ui->spinBox_TagCount->setValue(zone.tagCount); + ui->spinBox_RecordCount->setValue(zone.recordCount); + // Add unknowns to ui + ui->lineEdit_U1->setText(QString::number(zone.unknown1, 16).toUpper()); + ui->spinBox_U1->setValue(zone.unknown1); + ui->lineEdit_U2->setText(QString::number(zone.unknown2, 16).toUpper()); + ui->spinBox_U2->setValue(zone.unknown2); + ui->lineEdit_U3->setText(QString::number(zone.unknown3, 16).toUpper()); + ui->spinBox_U3->setValue(zone.unknown3); + ui->lineEdit_U4->setText(QString::number(zone.unknown4, 16).toUpper()); + ui->spinBox_U4->setValue(zone.unknown4); + ui->lineEdit_U5->setText(QString::number(zone.unknown5, 16).toUpper()); + ui->spinBox_U5->setValue(zone.unknown5); + ui->lineEdit_U6->setText(QString::number(zone.unknown6, 16).toUpper()); + ui->spinBox_U6->setValue(zone.unknown6); + ui->lineEdit_U7->setText(QString::number(zone.unknown7, 16).toUpper()); + ui->spinBox_U7->setValue(zone.unknown7); + ui->lineEdit_U8->setText(QString::number(zone.unknown8, 16).toUpper()); + ui->spinBox_U8->setValue(zone.unknown8); + ui->lineEdit_U9->setText(QString::number(zone.unknown9, 16).toUpper()); + ui->spinBox_U9->setValue(zone.unknown9); + ui->lineEdit_U10->setText(QString::number(zone.unknown10, 16).toUpper()); + ui->spinBox_U10->setValue(zone.unknown10); + ui->lineEdit_U11->setText(QString::number(zone.unknown11, 16).toUpper()); + ui->spinBox_U11->setValue(zone.unknown11); + // Add tags to ui list + foreach (const QString tag, zone.tags) { + ui->listWidget_Tags->addItem(tag); } - for (int i = 0; i < mTypeOrder.size(); i++) { - const QString typeHex = mTypeOrder[i]; - const QString typeStr = Utils::AssetTypeToString(typeHex); + // Track past assets and counts + int consecutiveIndex = 0; + int consecutiveCount = 0; + ASSET_TYPE lastAssetType = ASSET_UNKNOWN; + foreach (ASSET_TYPE assetType, zone.assetTypes) { + const QString typeStr = Utils::AssetTypeToString(assetType); + + if (!mTypeMap.contains(assetType)) { + mTypeMap[assetType] = 0; + } + mTypeMap[assetType]++; + + // Set lastAsset as current if first run + if (lastAssetType == ASSET_UNKNOWN) { + lastAssetType = assetType; + } + + // Track counts or populate asset order table + if (lastAssetType == assetType) { + // Count consecutive assets + consecutiveCount++; + } else { + // Insert row and populate for the previous asset type + ui->tableWidget_Order->insertRow(consecutiveIndex); + ui->tableWidget_Order->setItem(consecutiveIndex, 0, new QTableWidgetItem(Utils::AssetTypeToString(lastAssetType))); + ui->tableWidget_Order->setItem(consecutiveIndex, 1, new QTableWidgetItem(QString::number(consecutiveCount))); + + // Update counts and asset type + consecutiveCount = 1; + consecutiveIndex++; + lastAssetType = assetType; + } // qDebug() << "Parsing Asset of Type: " << typeHex; if (typeStr == "ANIMATION") { // aitype @@ -1545,19 +1311,37 @@ void MainWindow::ParseZoneFile(QByteArray aDecompressedData) { } else if (typeStr == "MENU") { // string_table ParseAsset_MenuFile(&zoneFileStream); } else if (typeStr == "LOCAL STRING") { // localized string asset - ParseAsset_LocalString(&zoneFileStream); + ParseAsset_Localize(&zoneFileStream); } else if (typeStr == "WEAPON") { // string_table ParseAsset_Weapon(&zoneFileStream); } else if (typeStr == "EFFECT") { // aitype ParseAsset_FX(&zoneFileStream); } else if (typeStr == "RAW FILE") { // gsc - ParseAsset_RawFile(&zoneFileStream); + // ParseAsset_RawFile(&zoneFileStream); + RawFile rawFile = RawFile(); + zoneFileStream >> rawFile; + mRawFilesVec >> rawFile; } else if (typeStr == "STRING TABLE") { // string_table ParseAsset_StringTable(&zoneFileStream); } else { qDebug() << "Found bad asset type!" << typeStr; } } + + // Track current and consecutive assets + int assetIndex = 0; + + // Iterate asset types found in index + for (auto [assetType, assetCount] : mTypeMap.asKeyValueRange()) { + const QString typeStr = Utils::AssetTypeToString(assetType); + // Insert row and populate + ui->tableWidget_Index->insertRow(assetIndex); + ui->tableWidget_Index->setItem(assetIndex, 0, new QTableWidgetItem(typeStr)); + ui->tableWidget_Index->setItem(assetIndex, 1, new QTableWidgetItem(QString::number(assetCount))); + + // Update count + assetIndex++; + } } int MainWindow::LoadFile_D3DBSP(const QString aFilePath) { From 7cda2e13541b842bea3c75b4f4931057551de1e6 Mon Sep 17 00:00:00 2001 From: = Date: Sat, 11 Jan 2025 01:09:16 -0500 Subject: [PATCH 16/22] Reduce asset tables column counts to 2. --- mainwindow.cpp | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/mainwindow.cpp b/mainwindow.cpp index 09700fa..59ae0ee 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -34,8 +34,8 @@ MainWindow::MainWindow(QWidget *parent) connect(ui->comboBox_StringTable, &QComboBox::currentTextChanged, this, &MainWindow::StrTableSelected); // Initialize Asset Index Table - ui->tableWidget_Index->setColumnCount(3); - ui->tableWidget_Index->setHorizontalHeaderLabels({"Asset Type", "Asset Name", "Asset Count"}); + ui->tableWidget_Index->setColumnCount(2); + ui->tableWidget_Index->setHorizontalHeaderLabels({"Asset Name", "Asset Count"}); ui->tableWidget_Index->verticalHeader()->setVisible(false); ui->tableWidget_Index->setEditTriggers(QAbstractItemView::NoEditTriggers); ui->tableWidget_Index->setSelectionBehavior(QAbstractItemView::SelectRows); @@ -44,8 +44,8 @@ MainWindow::MainWindow(QWidget *parent) ui->tableWidget_Index->setStyleSheet("QTableView {selection-background-color: red;}"); // Initialize Asset Order Table - ui->tableWidget_Order->setColumnCount(3); - ui->tableWidget_Order->setHorizontalHeaderLabels({"Asset Type", "Asset Name", "Asset Count"}); + ui->tableWidget_Order->setColumnCount(2); + ui->tableWidget_Order->setHorizontalHeaderLabels({"Asset Name", "Asset Count"}); ui->tableWidget_Order->verticalHeader()->setVisible(false); ui->tableWidget_Order->setEditTriggers(QAbstractItemView::NoEditTriggers); ui->tableWidget_Order->setSelectionBehavior(QAbstractItemView::SelectRows); @@ -53,6 +53,7 @@ MainWindow::MainWindow(QWidget *parent) ui->tableWidget_Order->setShowGrid(false); ui->tableWidget_Order->setStyleSheet("QTableView {selection-background-color: red;}"); + // Initialize Menu table ui->treeWidget_Menus->setHeaderLabels({"Components", "Description"}); ui->treeWidget_Menus->setColumnWidth(0, width() / 4 * 3); // Name column From 55ea90932276d601d29b476cba1dcafaf1acfdad Mon Sep 17 00:00:00 2001 From: = Date: Sat, 11 Jan 2025 01:09:37 -0500 Subject: [PATCH 17/22] Added serializable structs for zone file, localize asset, and rawfile asset. --- mainwindow.h | 17 +++++------------ utils.h | 34 +++++++++++++++++----------------- 2 files changed, 22 insertions(+), 29 deletions(-) diff --git a/mainwindow.h b/mainwindow.h index 6eb6181..e3cdff3 100644 --- a/mainwindow.h +++ b/mainwindow.h @@ -2,8 +2,11 @@ #define MAINWINDOW_H #include "enums.h" +#include "rawfile.h" #include "structs.h" #include "utils.h" +#include "localize.h" +#include "zone.h" #include #include @@ -103,16 +106,6 @@ private slots: void ParseFFVersion(QDataStream *afastFileStream); void ParseZoneFile(QByteArray aDecompressedData); - void ParseZoneHeader(QDataStream *aZoneFileStream); - void ParseZoneSize(QDataStream *aZoneFileStream); - - void ParseZoneUnknownsA(QDataStream *aZoneFileStream); - void ParseZoneUnknownsB(QDataStream *aZoneFileStream); - void ParseZoneUnknownsC(QDataStream *aZoneFileStream); - void ParseZoneTagCount(QDataStream *aZoneFileStream); - void ParseZoneRecordCount(QDataStream *aZoneFileStream); - void ParseZoneTags(QDataStream *aZoneFileStream); - void ParseZoneIndex(QDataStream *aZoneFileStream); void ParseAsset_XAnim(QDataStream *aZoneFileStream); void ParseAsset_XModel(QDataStream *aZoneFileStream); @@ -124,7 +117,7 @@ private slots: void ParseAsset_D3DBSP(QDataStream *aZoneFileStream); void ParseAsset_Font(QDataStream *aZoneFileStream); void ParseAsset_MenuFile(QDataStream *aZoneFileStream); - void ParseAsset_LocalString(QDataStream *aZoneFileStream); + void ParseAsset_Localize(QDataStream *aZoneFileStream); void ParseAsset_Weapon(QDataStream *aZoneFileStream); void ParseAsset_FX(QDataStream *aZoneFileStream); void ParseAsset_RawFile(QDataStream *aZoneFileStream); @@ -137,7 +130,7 @@ private slots: private: Ui::MainWindow *ui; - QMap mTypeMap; + QMap mTypeMap; QStringList mTypeOrder; quint32 mTagCount; quint32 mRecordCount; diff --git a/utils.h b/utils.h index 35eaa3a..3d4fa7b 100644 --- a/utils.h +++ b/utils.h @@ -14,37 +14,37 @@ public: Convert asset type string to asset desc string */ - static QString AssetTypeToString(const QString aAssetType) { - const QString cleanedType = aAssetType.toUpper(); - if (cleanedType == "04000000") { // x_anim PARTIALLY VERIFIED + static QString AssetTypeToString(ASSET_TYPE aAssetType) { + qDebug() << "aAssetType: " << (int)aAssetType; + if (aAssetType == ASSET_ANIMATION) { // x_anim PARTIALLY VERIFIED return "ANIMATION"; - } else if (cleanedType == "05000000") { // xmodel PARTIALLY VERIFIED + } else if (aAssetType == ASSET_MODEL) { // xmodel PARTIALLY VERIFIED return "MODEL"; - } else if (cleanedType == "06000000") { // material VERIFIED + } else if (aAssetType == ASSET_MATERIAL) { // material VERIFIED return "MATERIAL"; - } else if (cleanedType == "07000000") { // tech set VERIFIED + } else if (aAssetType == ASSET_TECH_SET) { // tech set VERIFIED return "TECH SET"; - } else if (cleanedType == "09000000") { // loaded_sound VERIFIED + } else if (aAssetType == ASSET_SOUND) { // loaded_sound VERIFIED return "SOUND"; - } else if (cleanedType == "0C000000") { // collision_map PARTIALLY VERIFIED + } else if (aAssetType == ASSET_COLLISION_MAP) { // collision_map PARTIALLY VERIFIED return "COLLISION MAP"; - } else if (cleanedType == "0D000000") { // shader PARTIALLY VERIFIED + } else if (aAssetType == ASSET_SHADER) { // shader PARTIALLY VERIFIED return "SHADER"; - } else if (cleanedType == "11000000") { // d3dbsp dump VERIFIED + } else if (aAssetType == ASSET_D3DBSP_DUMP) { // d3dbsp dump VERIFIED return "D3DBSP DUMP"; - } else if (cleanedType == "14000000") { // font PARTIALLY VERIFIED + } else if (aAssetType == ASSET_FONT) { // font PARTIALLY VERIFIED return "FONT"; - } else if (cleanedType == "15000000") { // menu_file PARTIALLY VERIFIED + } else if (aAssetType == ASSET_MENU) { // menu_file PARTIALLY VERIFIED return "MENU"; - } else if (cleanedType == "17000000") { // localized string PARTIALLY VERIFIED + } else if (aAssetType == ASSET_LOCAL_STRING) { // localized string PARTIALLY VERIFIED return "LOCAL STRING"; - } else if (cleanedType == "18000000") { // weapon PARTIALLY VERIFIED + } else if (aAssetType == ASSET_WEAPON) { // weapon PARTIALLY VERIFIED return "WEAPON"; - } else if (cleanedType == "1A000000") { // fx VERIFIED + } else if (aAssetType == ASSET_EFFECT) { // fx VERIFIED return "EFFECT"; - } else if (cleanedType == "20000000") { // raw_file VERIFIED + } else if (aAssetType == ASSET_RAW_FILE) { // raw_file VERIFIED return "RAW FILE"; - } else if (cleanedType == "21000000") { // string_table PARTIALLY VERIFIED + } else if (aAssetType == ASSET_STRING_TABLE) { // string_table PARTIALLY VERIFIED return "STRING TABLE"; } return "UNKNOWN"; From 05e803c62035e85203dcd6d451bebbfd4541b325 Mon Sep 17 00:00:00 2001 From: = Date: Sat, 11 Jan 2025 01:09:51 -0500 Subject: [PATCH 18/22] Track raw files locally. --- mainwindow.cpp | 1 + mainwindow.h | 1 + utils.h | 1 + 3 files changed, 3 insertions(+) diff --git a/mainwindow.cpp b/mainwindow.cpp index 59ae0ee..77ddba3 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -18,6 +18,7 @@ MainWindow::MainWindow(QWidget *parent) mRecentFiles = QQueue(); mSettingsValid = false; mRecentFileActions = QVector(); + mRawFilesVec = QVector(); const QString appSettingsPath = QDir::currentPath() + "/appSettings.ini"; QSettings appSettings(appSettingsPath, QSettings::IniFormat); diff --git a/mainwindow.h b/mainwindow.h index e3cdff3..25ec57f 100644 --- a/mainwindow.h +++ b/mainwindow.h @@ -147,5 +147,6 @@ private: QVector mDiskLumpOrder; QMap mLumps; + QVector mRawFilesVec; }; #endif // MAINWINDOW_H diff --git a/utils.h b/utils.h index 3d4fa7b..d7cd365 100644 --- a/utils.h +++ b/utils.h @@ -5,6 +5,7 @@ #include "qcolor.h" #include +#include #include class Utils { From 3b0930686845127fc2c7b9f1a181836cca833fc6 Mon Sep 17 00:00:00 2001 From: = Date: Sat, 11 Jan 2025 10:31:40 -0500 Subject: [PATCH 19/22] Add input and output serial operators for QDataStream. --- localize.h | 4 ++-- rawfile.h | 4 ++-- zone.h | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/localize.h b/localize.h index bef1b62..cd58c4a 100644 --- a/localize.h +++ b/localize.h @@ -11,7 +11,7 @@ struct Localize { QString localizedStr; }; -QDataStream &operator<<(QDataStream &out, const Localize &localize) { +inline QDataStream &operator<<(QDataStream &out, const Localize &localize) { out << localize.valuePtr << localize.namePtr; // Parse gsc contents @@ -25,7 +25,7 @@ QDataStream &operator<<(QDataStream &out, const Localize &localize) { return out; } -QDataStream &operator>>(QDataStream &in, Localize &localize) { +inline QDataStream &operator>>(QDataStream &in, Localize &localize) { // Parse value and name pointers in >> localize.valuePtr >> localize.namePtr; diff --git a/rawfile.h b/rawfile.h index 6134e16..23bed60 100644 --- a/rawfile.h +++ b/rawfile.h @@ -13,7 +13,7 @@ struct RawFile { QString rawFileContents; }; -QDataStream &operator<<(QDataStream &out, const RawFile &rawFile) { +inline QDataStream &operator<<(QDataStream &out, const RawFile &rawFile) { out << rawFile.gscNamePtr; out << rawFile.gscLength; out << rawFile.rawFilePathPtr; @@ -29,7 +29,7 @@ QDataStream &operator<<(QDataStream &out, const RawFile &rawFile) { return out; } -QDataStream &operator>>(QDataStream &in, RawFile &rawFile) { +inline QDataStream &operator>>(QDataStream &in, RawFile &rawFile) { in >> rawFile.gscNamePtr; in >> rawFile.gscLength; in >> rawFile.rawFilePathPtr; diff --git a/zone.h b/zone.h index ea4b250..fb860c4 100644 --- a/zone.h +++ b/zone.h @@ -27,7 +27,7 @@ struct Zone { QVector assetTypes; }; -QDataStream &operator<<(QDataStream &out, const Zone &zone) { +inline QDataStream &operator<<(QDataStream &out, const Zone &zone) { // Write adjusted fastfile size out << zone.zoneFileSize - 36; // Write unknowns 1-8 @@ -60,7 +60,7 @@ QDataStream &operator<<(QDataStream &out, const Zone &zone) { return out; } -QDataStream &operator>>(QDataStream &in, Zone &zone) { +inline QDataStream &operator>>(QDataStream &in, Zone &zone) { // Parse file size in >> zone.zoneFileSize; zone.zoneFileSize += 36; From 070854b8881b94eaa969bdf7e3a0e090a289c2c9 Mon Sep 17 00:00:00 2001 From: = Date: Sat, 11 Jan 2025 10:31:57 -0500 Subject: [PATCH 20/22] Refactor and fix. --- mainwindow.cpp | 2 +- mainwindow.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/mainwindow.cpp b/mainwindow.cpp index 77ddba3..57c62af 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -1322,7 +1322,7 @@ void MainWindow::ParseZoneFile(QByteArray aDecompressedData) { // ParseAsset_RawFile(&zoneFileStream); RawFile rawFile = RawFile(); zoneFileStream >> rawFile; - mRawFilesVec >> rawFile; + mRawFilesVec << rawFile; } else if (typeStr == "STRING TABLE") { // string_table ParseAsset_StringTable(&zoneFileStream); } else { diff --git a/mainwindow.h b/mainwindow.h index 25ec57f..f580fc4 100644 --- a/mainwindow.h +++ b/mainwindow.h @@ -22,7 +22,7 @@ #include #include #include -#include > +#include #include From 34d97c3c6530839cea1147e33383b43a5a2519da Mon Sep 17 00:00:00 2001 From: = Date: Sat, 11 Jan 2025 10:32:12 -0500 Subject: [PATCH 21/22] Re-add hex to item type name. --- utils.h | 37 ++++++++++++++++++++----------------- 1 file changed, 20 insertions(+), 17 deletions(-) diff --git a/utils.h b/utils.h index d7cd365..66223d4 100644 --- a/utils.h +++ b/utils.h @@ -16,39 +16,42 @@ public: Convert asset type string to asset desc string */ static QString AssetTypeToString(ASSET_TYPE aAssetType) { - qDebug() << "aAssetType: " << (int)aAssetType; + QString assetStr; if (aAssetType == ASSET_ANIMATION) { // x_anim PARTIALLY VERIFIED - return "ANIMATION"; + assetStr = "ANIMATION"; } else if (aAssetType == ASSET_MODEL) { // xmodel PARTIALLY VERIFIED - return "MODEL"; + assetStr = "MODEL"; } else if (aAssetType == ASSET_MATERIAL) { // material VERIFIED - return "MATERIAL"; + assetStr = "MATERIAL"; } else if (aAssetType == ASSET_TECH_SET) { // tech set VERIFIED - return "TECH SET"; + assetStr = "TECH SET"; } else if (aAssetType == ASSET_SOUND) { // loaded_sound VERIFIED - return "SOUND"; + assetStr = "SOUND"; } else if (aAssetType == ASSET_COLLISION_MAP) { // collision_map PARTIALLY VERIFIED - return "COLLISION MAP"; + assetStr = "COLLISION MAP"; } else if (aAssetType == ASSET_SHADER) { // shader PARTIALLY VERIFIED - return "SHADER"; + assetStr = "SHADER"; } else if (aAssetType == ASSET_D3DBSP_DUMP) { // d3dbsp dump VERIFIED - return "D3DBSP DUMP"; + assetStr = "D3DBSP DUMP"; } else if (aAssetType == ASSET_FONT) { // font PARTIALLY VERIFIED - return "FONT"; + assetStr = "FONT"; } else if (aAssetType == ASSET_MENU) { // menu_file PARTIALLY VERIFIED - return "MENU"; + assetStr = "MENU"; } else if (aAssetType == ASSET_LOCAL_STRING) { // localized string PARTIALLY VERIFIED - return "LOCAL STRING"; + assetStr = "LOCAL STRING"; } else if (aAssetType == ASSET_WEAPON) { // weapon PARTIALLY VERIFIED - return "WEAPON"; + assetStr = "WEAPON"; } else if (aAssetType == ASSET_EFFECT) { // fx VERIFIED - return "EFFECT"; + assetStr = "EFFECT"; } else if (aAssetType == ASSET_RAW_FILE) { // raw_file VERIFIED - return "RAW FILE"; + assetStr = "RAW FILE"; } else if (aAssetType == ASSET_STRING_TABLE) { // string_table PARTIALLY VERIFIED - return "STRING TABLE"; + assetStr = "STRING TABLE"; + } else { + assetStr = "UNKNOWN"; } - return "UNKNOWN"; + assetStr += QString(" [%1]").arg(QString::number(aAssetType, 16).rightJustified(2, '0').leftJustified(8, '0').toUpper()); + return assetStr; } /* From dee231c700d33ed9f6c835713687be47b10c976d Mon Sep 17 00:00:00 2001 From: = Date: Sat, 11 Jan 2025 20:51:00 -0500 Subject: [PATCH 22/22] Refactor and change tech_set to .bik file? --- enums.h | 2 +- mainwindow.cpp | 2 ++ utils.h | 32 ++++++++++++++++---------------- 3 files changed, 19 insertions(+), 17 deletions(-) diff --git a/enums.h b/enums.h index 9ec39c9..b6935a1 100644 --- a/enums.h +++ b/enums.h @@ -548,7 +548,7 @@ enum ASSET_TYPE { ASSET_ANIMATION = 4, // x_anim PARTIALLY VERIFIED ASSET_MODEL = 5, // xmodel PARTIALLY VERIFIED ASSET_MATERIAL = 6, // material VERIFIED - ASSET_TECH_SET = 7, // tech set VERIFIED + ASSET_BIK_FILE = 7, // .bik file PARTIALLY VERIFIED ASSET_SOUND = 9, // loaded_sound VERIFIED ASSET_COLLISION_MAP = 12, // collision_map PARTIALLY VERIFIED ASSET_SHADER = 13, // shader PARTIALLY VERIFIED diff --git a/mainwindow.cpp b/mainwindow.cpp index 57c62af..d746a91 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -43,6 +43,7 @@ MainWindow::MainWindow(QWidget *parent) ui->tableWidget_Index->setSelectionMode(QAbstractItemView::SingleSelection); ui->tableWidget_Index->setShowGrid(false); ui->tableWidget_Index->setStyleSheet("QTableView {selection-background-color: red;}"); + ui->tableWidget_Index->setColumnWidth(0, width() / 4); // Name column // Initialize Asset Order Table ui->tableWidget_Order->setColumnCount(2); @@ -53,6 +54,7 @@ MainWindow::MainWindow(QWidget *parent) ui->tableWidget_Order->setSelectionMode(QAbstractItemView::SingleSelection); ui->tableWidget_Order->setShowGrid(false); ui->tableWidget_Order->setStyleSheet("QTableView {selection-background-color: red;}"); + ui->tableWidget_Order->setColumnWidth(0, width() / 4); // Name column // Initialize Menu table ui->treeWidget_Menus->setHeaderLabels({"Components", "Description"}); diff --git a/utils.h b/utils.h index 66223d4..58887a0 100644 --- a/utils.h +++ b/utils.h @@ -17,35 +17,35 @@ public: */ static QString AssetTypeToString(ASSET_TYPE aAssetType) { QString assetStr; - if (aAssetType == ASSET_ANIMATION) { // x_anim PARTIALLY VERIFIED + if (aAssetType == ASSET_ANIMATION) { assetStr = "ANIMATION"; - } else if (aAssetType == ASSET_MODEL) { // xmodel PARTIALLY VERIFIED + } else if (aAssetType == ASSET_MODEL) { assetStr = "MODEL"; - } else if (aAssetType == ASSET_MATERIAL) { // material VERIFIED + } else if (aAssetType == ASSET_MATERIAL) { assetStr = "MATERIAL"; - } else if (aAssetType == ASSET_TECH_SET) { // tech set VERIFIED - assetStr = "TECH SET"; - } else if (aAssetType == ASSET_SOUND) { // loaded_sound VERIFIED + } else if (aAssetType == ASSET_BIK_FILE) { + assetStr = "BIK FILE"; + } else if (aAssetType == ASSET_SOUND) { assetStr = "SOUND"; - } else if (aAssetType == ASSET_COLLISION_MAP) { // collision_map PARTIALLY VERIFIED + } else if (aAssetType == ASSET_COLLISION_MAP) { assetStr = "COLLISION MAP"; - } else if (aAssetType == ASSET_SHADER) { // shader PARTIALLY VERIFIED + } else if (aAssetType == ASSET_SHADER) { assetStr = "SHADER"; - } else if (aAssetType == ASSET_D3DBSP_DUMP) { // d3dbsp dump VERIFIED + } else if (aAssetType == ASSET_D3DBSP_DUMP) { assetStr = "D3DBSP DUMP"; - } else if (aAssetType == ASSET_FONT) { // font PARTIALLY VERIFIED + } else if (aAssetType == ASSET_FONT) { assetStr = "FONT"; - } else if (aAssetType == ASSET_MENU) { // menu_file PARTIALLY VERIFIED + } else if (aAssetType == ASSET_MENU) { assetStr = "MENU"; - } else if (aAssetType == ASSET_LOCAL_STRING) { // localized string PARTIALLY VERIFIED + } else if (aAssetType == ASSET_LOCAL_STRING) { assetStr = "LOCAL STRING"; - } else if (aAssetType == ASSET_WEAPON) { // weapon PARTIALLY VERIFIED + } else if (aAssetType == ASSET_WEAPON) { assetStr = "WEAPON"; - } else if (aAssetType == ASSET_EFFECT) { // fx VERIFIED + } else if (aAssetType == ASSET_EFFECT) { assetStr = "EFFECT"; - } else if (aAssetType == ASSET_RAW_FILE) { // raw_file VERIFIED + } else if (aAssetType == ASSET_RAW_FILE) { assetStr = "RAW FILE"; - } else if (aAssetType == ASSET_STRING_TABLE) { // string_table PARTIALLY VERIFIED + } else if (aAssetType == ASSET_STRING_TABLE) { assetStr = "STRING TABLE"; } else { assetStr = "UNKNOWN";