Mercurial > mm7
diff Engine/Party.h @ 2499:68cdef6879a0
engine folder
author | Ritor1 |
---|---|
date | Fri, 19 Sep 2014 02:57:42 +0600 |
parents | |
children | 3121fb54a110 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Engine/Party.h Fri Sep 19 02:57:42 2014 +0600 @@ -0,0 +1,333 @@ +#pragma once +#include "Engine/Objects/Player.h" +#include "Engine/Objects/NPC.h" +#include <array> + + + +#define PARTY_AUTONOTES_BIT__EMERALD_FIRE_FOUNTAIN 2 + +enum PARTY_QUEST_BITS: uint16_t +{ + PARTY_QUEST_EMERALD_RED_POTION_ACTIVE = 1, + PARTY_QUEST_EMERALD_SEASHELL_ACTIVE = 2, + PARTY_QUEST_EMERALD_LONGBOW_ACTIVE = 3, + PARTY_QUEST_EMERALD_PLATE_ACTIVE = 4, + PARTY_QUEST_EMERALD_LUTE_ACTIVE = 5, + PARTY_QUEST_EMERALD_HAT_ACTIVE = 6, + + PARTY_QUEST_EMERALD_MARGARETH_OFF = 17, + + PARTY_QUEST_EVENMORN_MAP_FOUND = 64, + PARTY_QUEST_FINISHED_EMERALD_ISLE = 136, + + PARTY_QUEST_OBELISK_HARMONDALE = 164, + PARTY_QUEST_OBELISK_ERATHIA = 165, + PARTY_QUEST_OBELISK_TULAREAN_FOREST = 166, + PARTY_QUEST_OBELISK_DEYJA = 167, + PARTY_QUEST_OBELISK_BRACADA_DESERT = 168, + PARTY_QUEST_OBELISK_CELESTE = 169, + PARTY_QUEST_OBELISK_THE_PIT = 170, + PARTY_QUEST_OBELISK_EVENMORN_ISLAND = 171, + PARTY_QUEST_OBELISK_MOUNT_NIGHON = 172, + PARTY_QUEST_OBELISK_BARROW_DOWNS = 173, + PARTY_QUEST_OBELISK_LAND_OF_THE_GIANTS = 174, + PARTY_QUEST_OBELISK_TATALIA = 175, + PARTY_QUEST_OBELISK_AVLEE = 176, + PARTY_QUEST_OBELISK_STONE_CITY = 177, + + PARTY_QUEST_OBELISK_TREASURE_FOUND = 178, + + PARTY_QUEST_FOUNTAIN_HARMONDALE = 206, + PARTY_QUEST_FOUNTAIN_NIGHON = 207, + PARTY_QUEST_FOUNTAIN_PIERPONT = 208, + PARTY_QUEST_FOUNTAIN_CELESTIA = 209, + PARTY_QUEST_FOUNTAIN_THE_PIT = 210, + PARTY_QUEST_FOUNTAIN_EVENMORN_ISLE = 211 +}; + +/* 355 */ +enum PARTY_FLAGS_1: __int32 +{ + PARTY_FLAGS_1_0002 = 0x0002, + PARTY_FLAGS_1_WATER_DAMAGE = 0x0004, + PARTY_FLAGS_1_FALLING = 0x0008, + PARTY_FLAGS_1_ALERT_RED = 0x0010, + PARTY_FLAGS_1_ALERT_YELLOW = 0x0020, + PARTY_FLAGS_1_STANDING_ON_WATER = 0x0080, + PARTY_FLAGS_1_LANDING = 0x0100, + PARTY_FLAGS_1_BURNING = 0x200 +}; +enum PARTY_FLAGS_2: __int32 +{ + PARTY_FLAGS_2_RUNNING = 0x2, +}; + +/* 347 */ +enum PARTY_BUFF_INDEX +{ + PARTY_BUFF_RESIST_AIR = 0, + PARTY_BUFF_RESIST_BODY = 1, + PARTY_BUFF_DAY_OF_GODS = 2, + PARTY_BUFF_DETECT_LIFE = 3, + PARTY_BUFF_RESIST_EARTH = 4, + PARTY_BUFF_FEATHER_FALL = 5, + PARTY_BUFF_RESIST_FIRE = 6, + PARTY_BUFF_FLY = 7, + PARTY_BUFF_HASTE = 8, + PARTY_BUFF_HEROISM = 9, + PARTY_BUFF_IMMOLATION = 10, + PARTY_BUFF_INVISIBILITY = 11, + PARTY_BUFF_RESIST_MIND = 12, + PARTY_BUFF_PROTECTION_FROM_MAGIC = 13, + PARTY_BUFF_SHIELD = 14, + PARTY_BUFF_STONE_SKIN = 15, + PARTY_BUFF_TORCHLIGHT = 16, + PARTY_BUFF_RESIST_WATER = 17, + PARTY_BUFF_WATER_WALK = 18, + PARTY_BUFF_WIZARD_EYE = 19, +}; + + + +/* 300 */ +enum PartyAction: unsigned __int32 +{ + PARTY_INVALID = 0, + PARTY_TurnLeft = 0x1, + PARTY_TurnRight = 0x2, + PARTY_StrafeLeft = 0x3, + PARTY_StrafeRight = 0x4, + PARTY_WalkForward = 0x5, + PARTY_WalkBackward = 0x6, + PARTY_LookUp = 0x7, + PARTY_LookDown = 0x8, + PARTY_CenterView = 0x9, + PARTY_unkA = 0xA, + PARTY_unkB = 0xB, + PARTY_Jump = 0xC, + PARTY_FlyUp = 0xD, + PARTY_FlyDown = 0xE, + PARTY_Land = 0xF, + PARTY_RunForward = 0x10, + PARTY_RunBackward = 0x11, + PARTY_FastTurnLeft = 0x12, + PARTY_FastTurnRight = 0x13, + + PARTY_dword = 0xFFFFFFFF +}; + + + +/* 135 */ +#pragma pack(push, 1) +struct ActionQueue +{ + inline ActionQueue(): + uNumActions(0) + {} + + void Add(PartyAction action); + void Reset(); + PartyAction Next(); + + unsigned int uNumActions; + PartyAction pActions[30]; +}; +#pragma pack(pop) + + + + + +enum PartyAlignment: unsigned __int32 +{ + PartyAlignment_Good = 0, + PartyAlignment_Neutral = 1, + PartyAlignment_Evil = 2 +}; + + + + + +/* 208 */ +#pragma pack(push, 1) +struct PartyTimeStruct +{ + std::array<__int64, 10> bountyHunting_next_generation_time; + std::array<__int64, 85> Shops_next_generation_time;//field_50 + std::array<__int64, 53> _shop_ban_times; + std::array<unsigned __int64, 10> CounterEventValues; // (0xACD314h in Silvo's binary) + std::array<__int64, 29> HistoryEventTimes; // (0xACD364h in Silvo's binary) + std::array<unsigned __int64, 20> _s_times; //5d8 440h+8*51 //(0xACD44Ch in Silvo's binary) +}; +#pragma pack(pop) + +/* 207 */ +#pragma pack(push, 1) +struct Party +{ + Party(): + uTimePlayed(0) + { + Zero(); + } + + void Zero(); + void UpdatePlayersAndHirelingsEmotions(); + void RestAndHeal(); + unsigned int GetPartyFame(); + void CreateDefaultParty(char bGiveItems); + int Reset(); + void ResetPosMiscAndSpellBuffs(); + bool HasItem(unsigned int uItemID); + void SetHoldingItem(ItemGen *pItem); + int GetNextActiveCharacter(); + bool _497FC5_check_party_perception_against_level(); + bool AddItemToParty(ItemGen *pItem); + void Yell(); + void CountHirelings(); + + void GivePartyExp(unsigned int pEXPNum); + int GetPartyReputation(); + + + void PartyFindsGold(unsigned int uNumGold, int _1_dont_share_with_followers___2_the_same_but_without_a_message__else_normal); + void sub_421B2C_PlaceInInventory_or_DropPickedItem(); + + static void SetGold(unsigned int uNumGold); + static void TakeGold(unsigned int uNumGold); + static void SetFood(unsigned int uNumFood); + static void TakeFood(unsigned int uNumFood); + static void GiveFood(unsigned int _this); + + static void Sleep6Hours(); + + inline bool WizardEyeActive() {return pPartyBuffs[PARTY_BUFF_WIZARD_EYE].uExpireTime > 0;} + inline int WizardEyeSkillLevel() {return pPartyBuffs[PARTY_BUFF_WIZARD_EYE].uSkill;} + inline bool TorchlightActive() {return pPartyBuffs[PARTY_BUFF_TORCHLIGHT].uExpireTime > 0;} + inline bool FlyActive() {return pPartyBuffs[PARTY_BUFF_FLY].uExpireTime > 0;} + inline bool WaterWalkActive() {return pPartyBuffs[PARTY_BUFF_WATER_WALK].uExpireTime > 0;} + inline bool ImmolationActive() {return pPartyBuffs[PARTY_BUFF_IMMOLATION].uExpireTime > 0;} + inline int ImmolationSkillLevel() {return pPartyBuffs[PARTY_BUFF_IMMOLATION].uSkill;} + inline bool FeatherFallActive() {return pPartyBuffs[PARTY_BUFF_FEATHER_FALL].uExpireTime > 0;} + inline bool Invisible() {return pPartyBuffs[PARTY_BUFF_INVISIBILITY].uExpireTime > 0;} + + inline bool GetRedAlert() {return (uFlags & PARTY_FLAGS_1_ALERT_RED) != 0;} + inline void SetRedAlert() {uFlags |= PARTY_FLAGS_1_ALERT_RED;} + inline bool GetYellowAlert() {return (uFlags & PARTY_FLAGS_1_ALERT_YELLOW) != 0;} + inline void SetYellowAlert() {uFlags |= PARTY_FLAGS_1_ALERT_YELLOW;} + + bool IsPartyEvil(); + bool IsPartyGood(); + int _46A89E_immolation_effect(int* affected, int affectedArrSize, int effectRange); + int field_0; + unsigned int uPartyHeight; + unsigned int uDefaultPartyHeight; + int sEyelevel; + unsigned int uDefaultEyelevel; + int field_14_radius; + int y_rotation_granularity; + unsigned int uWalkSpeed; + int y_rotation_speed; // deg/s + int field_24; + int field_28; + unsigned __int64 uTimePlayed; + __int64 uLastRegenerationTime; + PartyTimeStruct PartyTimes; + Vec3_int_ vPosition; + int sRotationY; + int sRotationX; + Vec3_int_ vPrevPosition; + int sPrevRotationY; + int sPrevRotationX; + int sPrevEyelevel; + int field_6E0; + int field_6E4; + int uFallSpeed; + int field_6EC; + int field_6F0; + int floor_face_pid; // face we are standing at + int walk_sound_timer; + int field_6FC; + int uFallStartY; + unsigned int bFlying; + char field_708; + unsigned __int8 hirelingScrollPosition; + char field_70A; + char field_70B; + unsigned int uCurrentYear; + unsigned int uCurrentMonth; + unsigned int uCurrentMonthWeek; + unsigned int uDaysPlayed; + unsigned int uCurrentHour; + unsigned int uCurrentMinute; + unsigned int uCurrentTimeSecond; + unsigned int uNumFoodRations; + int field_72C; + int field_730; + unsigned int uNumGold; + unsigned int uNumGoldInBank; + unsigned int uNumDeaths; + int field_740; + int uNumPrisonTerms; + unsigned int uNumBountiesCollected; + int field_74C; + std::array<__int16, 5> monster_id_for_hunting; + std::array<__int16, 5> monster_for_hunting_killed; + unsigned char days_played_without_rest; + unsigned __int8 _quest_bits[64]; + std::array<unsigned __int8, 16> pArcomageWins; + char field_7B5_in_arena_quest; + char uNumArenaPageWins; + char uNumArenaSquireWins; + char uNumArenaKnightWins; + char uNumArenaLordWins; + std::array<char, 29> pIsArtifactFound; //7ba + std::array<char, 39> field_7d7; + unsigned char _autonote_bits[26]; + std::array<char, 60> field_818; + std::array<char, 32> field_854; + int uNumArcomageWins; + int uNumArcomageLoses; + unsigned int bTurnBasedModeOn; + int field_880; + int uFlags2; + PartyAlignment alignment; + std::array<SpellBuff, 20> pPartyBuffs; + std::array<Player, 4> pPlayers; + std::array<NPCData, 2> pHirelings; + ItemGen pPickedItem; + unsigned int uFlags; + std::array<std::array<ItemGen, 12>, 53> StandartItemsInShops; + std::array<std::array<ItemGen, 12>, 53> SpecialItemsInShops; //D0EC + std::array<std::array<ItemGen, 12>, 32> SpellBooksInGuilds; + std::array<char, 24> field_1605C; + char pHireling1Name[100]; + char pHireling2Name[100]; + int armageddon_timer; + int armageddonDamage; + std::array<int, 4> pTurnBasedPlayerRecoveryTimes; + std::array<int, 53> InTheShopFlags; + int uFine; + float flt_TorchlightColorR; + float flt_TorchlightColorG; + float flt_TorchlightColorB; +}; +#pragma pack(pop) + + + +extern Party *pParty; // idb + + +extern struct ActionQueue *pPartyActionQueue; + +bool TestPartyQuestBit(PARTY_QUEST_BITS bit); +void __fastcall Rest(unsigned int uHoursToSleep); +void RestAndHeal(__int64 uNumMinutes); // idb +int GetTravelTime(); + +bool _449B57_test_bit(unsigned __int8 *a1, __int16 a2); +void _449B7E_toggle_bit(unsigned char *pArray, __int16 a2, unsigned __int16 bToggle); // idb