diff Engine/Serialization/LegacyImages.h @ 2565:117c219bf913

Party, items and stuff are abstracted from savegame file representation
author a.parshin
date Wed, 20 May 2015 15:12:33 +0200
parents
children d569340b05ff
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Engine/Serialization/LegacyImages.h	Wed May 20 15:12:33 2015 +0200
@@ -0,0 +1,524 @@
+#pragma once
+/*
+ *  Party, timers, NPCs and other stuff is binary dumped into resources/savegame files, which limits ability to alter
+ *      these structures without breaking compatibility.
+ *  This module is used to serialzie and deserialize native game structures intro their current representations without
+ *      breaking compatibility with original files.
+*/
+
+
+#pragma pack(push, 1)
+struct NPCData_Image_MM7
+{
+    NPCData_Image_MM7();
+
+    void Serialize(struct NPCData *item);
+    void Deserialize(struct NPCData *item);
+
+    /* 00 */ char *pName;
+    /* 04 */ unsigned int uPortraitID;
+    /* 08 */ unsigned int uFlags;  // & 0x80    no greeting on dialogue start; looks like hired
+    /* 0C */ int fame;
+    /* 10 */ int rep;
+    /* 14 */ unsigned int Location2D;
+    /* 18 */ unsigned int uProfession;
+    /* 1C */ int greet;
+    /* 20 */ int joins;
+    /* 24 */ int field_24;
+    /* 28 */ unsigned int evt_A;
+    /* 2C */ unsigned int evt_B;
+    /* 30 */ unsigned int evt_C;
+    /* 34 */ unsigned int evt_D;
+    /* 38 */ unsigned int evt_E;
+    /* 3C */ unsigned int evt_F;
+    /* 40 */ unsigned int uSex;
+    /* 44 */ int bHasUsedTheAbility;
+    /* 48 */ int news_topic;
+    /* 4C */
+};
+
+struct ItemGen_Image_MM7
+{
+    ItemGen_Image_MM7();
+
+    void Serialize(struct ItemGen *item);
+    void Deserialize(struct ItemGen *item);
+
+    /* 00 */ int uItemID;
+    /* 04 */ int uEnchantmentType;
+    /* 08 */ int m_enchantmentStrength;
+    /* 0C */ int uSpecEnchantmentType;
+    // 25  +5 levels
+    // 16  Drain Hit Points from target.
+    // 35  Increases chance of disarming.
+    // 39  Double damage vs Demons.
+    // 40  Double damage vs Dragons
+    // 45  +5 Speed and Accuracy
+    // 56  +5 Might and Endurance.
+    // 57  +5 Intellect and Personality.
+    // 58  Increased Value.
+    // 60  +3 Unarmed and Dodging skills
+    // 61  +3 Stealing and Disarm skills.
+    // 59  Increased Weapon speed.
+    // 63  Double Damage vs. Elves.
+    // 64  Double Damage vs. Undead.
+    // 67  Adds 5 points of Body damage and +2 Disarm skill.
+    // 68  Adds 6-8 points of Cold damage and +5 Armor Class.
+    // 71  Prevents drowning damage.
+    // 72  Prevents falling damage.
+    /* 10 */ int uNumCharges;
+    /* 14 */ unsigned int uAttributes;
+    /* 18 */ unsigned __int8 uBodyAnchor;
+    /* 19 */ char uMaxCharges;
+    /* 1A */ char uHolderPlayer;
+    /* 1B */ char field_1B;
+    /* 1C */ unsigned __int64 uExpireTime;
+};
+
+struct SpellBuff_Image_MM7
+{
+    SpellBuff_Image_MM7();
+
+    void Serialize(struct SpellBuff *item);
+    void Deserialize(struct SpellBuff *item);
+
+    /* 00 */ signed __int64 uExpireTime;
+    /* 08 */ unsigned __int16 uPower;
+    /* 0A */ unsigned __int16 uSkill;
+    /* 0C */ unsigned __int16 uOverlayID;
+    /* 0E */ unsigned __int8 uCaster;
+    /* 0F */ unsigned __int8 uFlags;
+    /* 10 */
+};
+
+struct PlayerSpellbookChapter_Image_MM7
+{
+    PlayerSpellbookChapter_Image_MM7();
+
+    /* 00 */ char bIsSpellAvailable[11];
+    /* 0B */
+};
+struct PlayerSpells_Image_MM7
+{
+    PlayerSpells_Image_MM7();
+
+    union
+    {
+        struct
+        {
+            /* 00 */ PlayerSpellbookChapter_Image_MM7 pFireSpellbook;
+            /* 0B */ PlayerSpellbookChapter_Image_MM7 pAirSpellbook;
+            /* 16 */ PlayerSpellbookChapter_Image_MM7 pWaterSpellbook;
+            /* 21 */ PlayerSpellbookChapter_Image_MM7 pEarthSpellbook;
+            /* 2C */ PlayerSpellbookChapter_Image_MM7 pSpiritSpellbook;
+            /* 37 */ PlayerSpellbookChapter_Image_MM7 pMindSpellbook;
+            /* 42 */ PlayerSpellbookChapter_Image_MM7 pBodySpellbook;
+            /* 4D */ PlayerSpellbookChapter_Image_MM7 pLightSpellbook;
+            /* 58 */ PlayerSpellbookChapter_Image_MM7 pDarkSpellbook;
+            /* 63 */ char _pad;
+            /* 64 */
+        };
+        struct
+        {
+            /* 00 */ PlayerSpellbookChapter_Image_MM7 pChapters[9];
+            /* 63 */ char _pad;
+            /* 64 */
+        };
+        struct
+        {
+            /* 00 */ char bHaveSpell[99];
+            /* 63 */ char _pad;
+            /* 64 */
+        };
+    };
+};
+
+union PlayerEquipment_Image_MM7
+{
+    PlayerEquipment_Image_MM7();
+
+    union
+    {
+        struct
+        {
+            /* 00 */ unsigned int uShield;
+            /* 04 */ unsigned int uMainHand;
+            /* 08 */ unsigned int uBow;
+            /* 0C */ unsigned int uArmor;
+            /* 10 */ unsigned int uHelm;
+            /* 14 */ unsigned int uBelt;
+            /* 18 */ unsigned int uCloak;
+            /* 1C */ unsigned int uGlove;
+            /* 20 */ unsigned int uBoot;
+            /* 24 */ unsigned int uAmulet;
+            /* 28 */ unsigned int uRings[6];
+            /* 40 */
+        };
+        unsigned int pIndices[16];
+    };
+};
+
+struct LloydBeacon_Image_MM7
+{
+    LloydBeacon_Image_MM7();
+
+    /* 00 */ unsigned __int64 uBeaconTime;
+    /* 08 */ int PartyPos_X;
+    /* 0C */ int PartyPos_Y;
+    /* 10 */ int PartyPos_Z;
+    /* 14 */ __int16 PartyRot_X;
+    /* 16 */ __int16 PartyRot_Y;
+    /* 18 */ int SaveFileID;
+    /* 1C */
+};
+
+struct Player_Image_MM7
+{
+    Player_Image_MM7();
+
+    void Serialize(struct Player *);
+    void Deserialize(struct Player *);
+
+    /* 0000 */ __int64 pConditions[20];
+    /* 00A0 */ unsigned __int64 uExperience;
+    /* 00A8 */ char pName[16];
+    /* 00B8 */ unsigned char uSex;
+    /* 00B9 */ unsigned char classType;
+    /* 00BA */ unsigned __int8 uCurrentFace;
+    /* 00BB */ char field_BB;
+    /* 00BC */ unsigned __int16 uMight;
+    /* 00BE */ unsigned __int16 uMightBonus;
+    /* 00C0 */ unsigned __int16 uIntelligence;
+    /* 00C2 */ unsigned __int16 uIntelligenceBonus;
+    /* 00C4 */ unsigned __int16 uWillpower;
+    /* 00C6 */ unsigned __int16 uWillpowerBonus;
+    /* 00C8 */ unsigned __int16 uEndurance;
+    /* 00CA */ unsigned __int16 uEnduranceBonus;
+    /* 00CC */ unsigned __int16 uSpeed;
+    /* 00CE */ unsigned __int16 uSpeedBonus;
+    /* 00D0 */ unsigned __int16 uAccuracy;
+    /* 00D2 */ unsigned __int16 uAccuracyBonus;
+    /* 00D4 */ unsigned __int16 uLuck;
+    /* 00D6 */ unsigned __int16 uLuckBonus;
+    /* 00D8 */ __int16 sACModifier;
+    /* 00DA */ unsigned __int16 uLevel;
+    /* 00DC */ __int16 sLevelModifier;
+    /* 00DE */ __int16 sAgeModifier;
+    /* 00E0 */ int field_E0;
+    /* 00E4 */ int field_E4;
+    /* 00E8 */ int field_E8;
+    /* 00EC */ int field_EC;
+    /* 00F0 */ int field_F0;
+    /* 00F4 */ int field_F4;
+    /* 00F8 */ int field_F8;
+    /* 00FC */ int field_FC;
+    /* 0100 */ int field_100;
+    /* 0104 */ int field_104;
+    /* 0108 */ union
+    {
+        struct
+        {
+            unsigned __int16 skillStaff;
+            unsigned __int16 skillSword;
+            unsigned __int16 skillDagger;
+            unsigned __int16 skillAxe;
+            unsigned __int16 skillSpear;
+            unsigned __int16 skillBow;
+            unsigned __int16 skillMace;
+            unsigned __int16 skillBlaster;
+            unsigned __int16 skillShield;
+            unsigned __int16 skillLeather;
+            unsigned __int16 skillChain;
+            unsigned __int16 skillPlate;
+            unsigned __int16 skillFire;
+            unsigned __int16 skillAir;
+            unsigned __int16 skillWater;
+            unsigned __int16 skillEarth;
+            unsigned __int16 skillSpirit;
+            unsigned __int16 skillMind;
+            unsigned __int16 skillBody;
+            unsigned __int16 skillLight;
+            unsigned __int16 skillDark;
+            unsigned __int16 skillItemId;
+            unsigned __int16 skillMerchant;
+            unsigned __int16 skillRepair;
+            unsigned __int16 skillBodybuilding;
+            unsigned __int16 skillMeditation;
+            unsigned __int16 skillPerception;
+            unsigned __int16 skillDiplomacy;
+            unsigned __int16 skillThievery;
+            unsigned __int16 skillDisarmTrap;
+            unsigned __int16 skillDodge;
+            unsigned __int16 skillUnarmed;
+            unsigned __int16 skillMonsterId;
+            unsigned __int16 skillArmsmaster;
+            unsigned __int16 skillStealing;
+            unsigned __int16 skillAlchemy;
+            unsigned __int16 skillLearning;
+        };
+        unsigned __int16 pActiveSkills[37];
+    };
+    /* 0152 */ unsigned char _achieved_awards_bits[64];
+    /* 0192 */ PlayerSpells_Image_MM7 spellbook;
+    /* 01F6 */ char _1F6_pad[2];
+    /* 01F8 */ int pure_luck_used;
+    /* 01FC */ int pure_speed_used;
+    /* 0200 */ int pure_intellect_used;
+    /* 0204 */ int pure_endurance_used;
+    /* 0208 */ int pure_willpower_used;
+    /* 020C */ int pure_accuracy_used;
+    /* 0210 */ int pure_might_used;
+    /* 0214 */ union
+    {
+        struct
+        {
+            ItemGen_Image_MM7 pInventoryItemList[126];
+            ItemGen_Image_MM7 pEquippedItems[12];
+        };
+        struct
+        {
+            ItemGen_Image_MM7 pOwnItems[138];
+        };
+    };
+    /* 157C */ int pInventoryMatrix[126];
+    /* 1774 */ __int16 sResFireBase;
+    /* 1776 */ __int16 sResAirBase;
+    /* 1778 */ __int16 sResWaterBase;
+    /* 177A */ __int16 sResEarthBase;
+    /* 177C */ __int16 field_177C;
+    /* 177E */ __int16 sResMagicBase;
+    /* 1780 */ __int16 sResSpiritBase;
+    /* 1782 */ __int16 sResMindBase;
+    /* 1784 */ __int16 sResBodyBase;
+    /* 1786 */ __int16 sResLightBase;
+    /* 1788 */ __int16 sResDarkBase;
+    /* 178A */ __int16 sResFireBonus;
+    /* 178C */ __int16 sResAirBonus;
+    /* 178E */ __int16 sResWaterBonus;
+    /* 1790 */ __int16 sResEarthBonus;
+    /* 1792 */ __int16 field_1792;
+    /* 1794 */ __int16 sResMagicBonus;
+    /* 1796 */ __int16 sResSpiritBonus;
+    /* 1798 */ __int16 sResMindBonus;
+    /* 179A */ __int16 sResBodyBonus;
+    /* 179C */ __int16 sResLightBonus;
+    /* 179E */ __int16 sResDarkBonus;
+    /* 17A0 */ SpellBuff_Image_MM7 pPlayerBuffs[24];
+    /* 1920 */ unsigned int uVoiceID;
+    /* 1924 */ int uPrevVoiceID;
+    /* 1928 */ int uPrevFace;
+    /* 192C */ int field_192C;
+    /* 1930 */ int field_1930;
+    /* 1934 */ unsigned __int16 uTimeToRecovery;
+    /* 1936 */ char field_1936;
+    /* 1937 */ char field_1937;
+    /* 1938 */ unsigned int uSkillPoints;
+    /* 193C */ int sHealth;
+    /* 1940 */ int sMana;
+    /* 1944 */ unsigned int uBirthYear;
+    /* 1948 */ PlayerEquipment_Image_MM7 pEquipment;
+    /* 1988 */ int field_1988[49];
+    /* 1A4C */ char field_1A4C;
+    /* 1A4D */ char field_1A4D;
+    /* 1A4E */ char lastOpenedSpellbookPage;
+    /* 1A4F */ unsigned __int8 uQuickSpell;
+    /* 1A50 */ char playerEventBits[64];
+    /* 1A90 */ char _some_attack_bonus;
+    /* 1A91 */ char field_1A91;
+    /* 1A92 */ char _melee_dmg_bonus;
+    /* 1A93 */ char field_1A93;
+    /* 1A94 */ char _ranged_atk_bonus;
+    /* 1A95 */ char field_1A95;
+    /* 1A96 */ char _ranged_dmg_bonus;
+    /* 1A97 */ char field_1A97;
+    /* 1A98 */ char uFullHealthBonus;
+    /* 1A99 */ char _health_related;
+    /* 1A9A */ char uFullManaBonus;
+    /* 1A9B */ char _mana_related;
+    /* 1A9C */ unsigned __int16 expression;
+    /* 1A9E */ unsigned __int16 uExpressionTimePassed;
+    /* 1AA0 */ unsigned __int16 uExpressionTimeLength;
+    /* 1AA2 */ __int16 field_1AA2;
+    /* 1AA4 */ int _expression21_animtime;
+    /* 1AA8 */ int _expression21_frameset;
+    /* 1AAC */ LloydBeacon_Image_MM7 pInstalledBeacons[5];
+    /* 1B38 */ char uNumDivineInterventionCastsThisDay;
+    /* 1B39 */ char uNumArmageddonCasts;
+    /* 1B3A */ char uNumFireSpikeCasts;
+    /* 1B3B */ char field_1B3B;
+    /* 1B3C */
+};
+
+
+struct PartyTimeStruct_Image_MM7
+{
+    PartyTimeStruct_Image_MM7();
+
+    /* 000 */ __int64 bountyHunting_next_generation_time[10];
+    /* 050 */ __int64 Shops_next_generation_time[85];//field_50
+    /* 2F8 */ __int64 _shop_ban_times[53];
+    /* 4A0 */ unsigned __int64 CounterEventValues[10];  // (0xACD314h in Silvo's binary)
+    /* 4F0 */ __int64 HistoryEventTimes[29];   // (0xACD364h in Silvo's binary)
+    /* 5D8 */ unsigned __int64 _s_times[20]; //5d8 440h+8*51     //(0xACD44Ch in Silvo's binary)
+    /* 678 */
+};
+
+struct Party_Image_MM7
+{
+    Party_Image_MM7();
+
+    void Serialize(struct Party *);
+    void Deserialize(struct Party *);
+
+    /* 00000 */ int field_0;
+    /* 00004 */ unsigned int uPartyHeight;
+    /* 00008 */ unsigned int uDefaultPartyHeight;
+    /* 0000C */ int sEyelevel;
+    /* 00010 */ unsigned int uDefaultEyelevel;
+    /* 00014 */ int field_14_radius;
+    /* 00018 */ int y_rotation_granularity;
+    /* 0001C */ unsigned int uWalkSpeed;
+    /* 00020 */ int y_rotation_speed;  // deg/s
+    /* 00024 */ int field_24;
+    /* 00028 */ int field_28;
+    /* 0002C */ unsigned __int64 uTimePlayed;
+    /* 00034 */ __int64 uLastRegenerationTime;
+    /* 0003C */ PartyTimeStruct_Image_MM7 PartyTimes;
+    /* 006B4 */ Vec3_int_ vPosition;
+    /* 006C0 */ int sRotationY;
+    /* 006C4 */ int sRotationX;
+    /* 006C8 */ Vec3_int_ vPrevPosition;
+    /* 006D4 */ int sPrevRotationY;
+    /* 006D8 */ int sPrevRotationX;
+    /* 006DC */ int sPrevEyelevel;
+    /* 006E0 */ int field_6E0;
+    /* 006E4 */ int field_6E4;
+    /* 006E8 */ int uFallSpeed;
+    /* 006EC */ int field_6EC;
+    /* 006F0 */ int field_6F0;
+    /* 006F4 */ int floor_face_pid; // face we are standing at
+    /* 006F8 */ int walk_sound_timer;
+    /* 006FC */ int field_6FC;
+    /* 00700 */ int uFallStartY;
+    /* 00704 */ unsigned int bFlying;
+    /* 00708 */ char field_708;
+    /* 00709 */ unsigned __int8 hirelingScrollPosition;
+    /* 0070A */ char field_70A;
+    /* 0070B */ char field_70B;
+    /* 0070C */ unsigned int uCurrentYear;
+    /* 00710 */ unsigned int uCurrentMonth;
+    /* 00714 */ unsigned int uCurrentMonthWeek;
+    /* 00718 */ unsigned int uDaysPlayed;
+    /* 0071C */ unsigned int uCurrentHour;
+    /* 00720 */ unsigned int uCurrentMinute;
+    /* 00724 */ unsigned int uCurrentTimeSecond;
+    /* 00728 */ unsigned int uNumFoodRations;
+    /* 0072C */ int field_72C;
+    /* 00730 */ int field_730;
+    /* 00734 */ unsigned int uNumGold;
+    /* 00738 */ unsigned int uNumGoldInBank;
+    /* 0073C */ unsigned int uNumDeaths;
+    /* 00740 */ int field_740;
+    /* 00744 */ int uNumPrisonTerms;
+    /* 00748 */ unsigned int uNumBountiesCollected;
+    /* 0074C */ int field_74C;
+    /* 00750 */ __int16 monster_id_for_hunting[5];
+    /* 0075A */ __int16 monster_for_hunting_killed[5];
+    /* 00764 */ unsigned char days_played_without_rest;
+    /* 00765 */ unsigned __int8 _quest_bits[64];
+    /* 007A5 */ unsigned __int8 pArcomageWins[16];
+    /* 007B5 */ char field_7B5_in_arena_quest;
+    /* 007B6 */ char uNumArenaPageWins;
+    /* 007B7 */ char uNumArenaSquireWins;
+    /* 007B8 */ char uNumArenaKnightWins;
+    /* 007B9 */ char uNumArenaLordWins;
+    /* 007BA */ char pIsArtifactFound[29];  //7ba
+    /* 007D7 */ char field_7d7[39];
+    /* 007FE */ unsigned char _autonote_bits[26];
+    /* 00818 */ char field_818[60];
+    /* 00854 */ char field_854[32];
+    /* 00874 */ int uNumArcomageWins;
+    /* 00878 */ int uNumArcomageLoses;
+    /* 0087C */ unsigned int bTurnBasedModeOn;
+    /* 00880 */ int field_880;
+    /* 00884 */ int uFlags2;
+    /* 00888 */ unsigned int alignment;
+    /* 0088C */ SpellBuff_Image_MM7 pPartyBuffs[20];
+    /* 00954 */ Player_Image_MM7 pPlayers[4];
+    /* 07644 */ NPCData_Image_MM7 pHirelings[2];
+    /* 07754 */ ItemGen_Image_MM7 pPickedItem;
+    /* 07778 */ unsigned int uFlags;
+    /* 0777C */ ItemGen_Image_MM7 StandartItemsInShops[53][12];
+    /* 0D0EC */ ItemGen_Image_MM7 SpecialItemsInShops[53][12];
+    /* 12A5C */ ItemGen_Image_MM7 SpellBooksInGuilds[32][12];
+    /* 1605C */ char field_1605C[24];
+    /* 16074 */ char pHireling1Name[100];
+    /* 160D8 */ char pHireling2Name[100];
+    /* 1613C */ int armageddon_timer;
+    /* 16140 */ int armageddonDamage;
+    /* 16144 */ int pTurnBasedPlayerRecoveryTimes[4];
+    /* 16154 */ int InTheShopFlags[53];
+    /* 16228 */ int uFine;
+    /* 1622C */ float flt_TorchlightColorR;
+    /* 16230 */ float flt_TorchlightColorG;
+    /* 16234 */ float flt_TorchlightColorB;
+    /* 16238 */
+};
+
+
+
+struct Timer_Image_MM7
+{
+    Timer_Image_MM7();
+
+    void Serialize(struct Timer *);
+    void Deserialize(struct Timer *);
+
+    /* 00 */ unsigned int bReady;
+    /* 04 */ unsigned int bPaused;
+    /* 08 */ int bTackGameTime;
+    /* 0C */ unsigned int uStartTime;
+    /* 10 */ unsigned int uStopTime;
+    /* 14 */ int uGameTimeStart;
+    /* 18 */ int field_18;
+    /* 1C */ unsigned int uTimeElapsed;
+    /* 20 */ int dt_in_some_format;
+    /* 24 */ unsigned int uTotalGameTimeElapsed;
+    /* 28 */
+};
+
+
+
+
+/*  282 */
+struct OtherOverlay_Image_MM7
+{
+    OtherOverlay_Image_MM7();
+
+    /* 00 */ __int16 field_0;
+    /* 02 */ __int16 field_2;
+    /* 04 */ __int16 field_4;
+    /* 06 */ __int16 field_6;
+    /* 08 */ __int16 field_8;
+    /* 0A */ __int16 field_A;
+    /* 0C */ __int16 field_C;
+    /* 0E */ __int16 field_E;
+    /* 10 */ int field_10;
+    /* 14 */
+};
+
+/*   63 */
+struct OtherOverlayList_Image_MM7
+{
+    OtherOverlayList_Image_MM7();
+
+    void Serialize(struct OtherOverlayList *);
+    void Deserialize(struct OtherOverlayList *);
+
+    /* 000 */ OtherOverlay_Image_MM7 pOverlays[50];
+    /* 3E8 */ int field_3E8;
+    /* 3EC */ int bRedraw;
+    /* 3F0 */
+};
+
+#pragma pack(pop)
\ No newline at end of file