# HG changeset patch # User Ritor1 # Date 1369371226 -21600 # Node ID d5dae0b4b98a67c52f68538da274767bce541d5a # Parent 28ee6610a3d2eea71e24bdff4a7fd5114c8c708f# Parent 938af16d5b887e4c0e2c9dffcefaefb0fb194034 Слияние diff -r 28ee6610a3d2 -r d5dae0b4b98a Actor.cpp --- a/Actor.cpp Fri May 24 10:53:33 2013 +0600 +++ b/Actor.cpp Fri May 24 10:53:46 2013 +0600 @@ -293,7 +293,7 @@ } //----- (00404AC7) -------------------------------------------------------- -void __fastcall Actor::SpellAttack(unsigned int uActorID, AIDirection *pDir, int spellnum, int a4, unsigned int uSkillLevel) +void __fastcall Actor::AI_SpellAttack(unsigned int uActorID, AIDirection *pDir, int spellnum, int a4, unsigned int uSkillLevel) { Actor *v5; // esi@1 unsigned int v6; // edi@1 @@ -1398,7 +1398,7 @@ } //----- (00404874) -------------------------------------------------------- -char __fastcall Actor::RangedAttack(unsigned int uActorID, AIDirection *a2, int a3, char a4) +char __fastcall Actor::AI_RangedAttack(unsigned int uActorID, AIDirection *a2, int a3, char a4) { AIDirection *v4; // edi@1 Actor *v5; // esi@1 @@ -1890,7 +1890,7 @@ } //----- (00404030) -------------------------------------------------------- -void Actor::FaceObject(unsigned int uActorID, unsigned int uObjID, int _48, AIDirection *a4) +void Actor::AI_FaceObject(unsigned int uActorID, unsigned int uObjID, int _48, AIDirection *a4) { unsigned int v4; // edi@1 unsigned int v5; // esi@1 @@ -1981,7 +1981,7 @@ } //----- (00403C6C) -------------------------------------------------------- -void Actor::MeleeAttack(unsigned int uActorID, signed int sTargetPid, struct AIDirection *arg0) +void Actor::AI_MeleeAttack(unsigned int uActorID, signed int sTargetPid, struct AIDirection *arg0) { Actor *v3; // ebx@1 char v4; // zf@1 @@ -2077,7 +2077,7 @@ v3->UpdateAnimation(); } else - Actor::Pursue1(v24, sTargetPid, rand() % 2, 64, arg0); + Actor::AI_Pursue1(v24, sTargetPid, rand() % 2, 64, arg0); } //----- (00438CF3) -------------------------------------------------------- @@ -2383,7 +2383,7 @@ } //----- (00403A60) -------------------------------------------------------- -void Actor::SpellAttack2(unsigned int uActorID, signed int edx0, AIDirection *pDir) +void Actor::AI_SpellAttack2(unsigned int uActorID, signed int edx0, AIDirection *pDir) { Actor *v3; // ebx@1 AIDirection *v4; // esi@3 @@ -2485,11 +2485,11 @@ v3->UpdateAnimation(); } else - Actor::Pursue1(v22, a2, v22, 64, pDir); + Actor::AI_Pursue1(v22, a2, v22, 64, pDir); } //----- (00403854) -------------------------------------------------------- -void Actor::SpellAttack1(unsigned int uActorID, signed int sTargetPid, AIDirection *pDir) +void Actor::AI_SpellAttack1(unsigned int uActorID, signed int sTargetPid, AIDirection *pDir) { Actor *v3; // ebx@1 AIDirection *v4; // esi@3 @@ -2591,11 +2591,11 @@ v3->UpdateAnimation(); } else - Actor::Pursue1(v22, sTargetPid, v22, 64, pDir); + Actor::AI_Pursue1(v22, sTargetPid, v22, 64, pDir); } //----- (0040368B) -------------------------------------------------------- -void Actor::MissileAttack2(unsigned int uActorID, signed int sTargetPid, AIDirection *pDir) +void Actor::AI_MissileAttack2(unsigned int uActorID, signed int sTargetPid, AIDirection *pDir) { Actor *v3; // ebx@1 AIDirection *v4; // esi@3 @@ -2682,11 +2682,11 @@ v3->UpdateAnimation(); } else - Actor::Pursue1(v21, sTargetPid, v21, 64, pDir); + Actor::AI_Pursue1(v21, sTargetPid, v21, 64, pDir); } //----- (00403476) -------------------------------------------------------- -void Actor::MissileAttack1(unsigned int uActorID, signed int sTargetPid, AIDirection *pDir) +void Actor::AI_MissileAttack1(unsigned int uActorID, signed int sTargetPid, AIDirection *pDir) { Actor *v3; // ebx@1 int v4; // esi@3 @@ -2786,11 +2786,11 @@ v3->UpdateAnimation(); } else - Actor::Pursue1(v21, sTargetPid, v21, 64, pDir); + Actor::AI_Pursue1(v21, sTargetPid, v21, 64, pDir); } //----- (004032B2) -------------------------------------------------------- -void Actor::_4032B2(unsigned int a1, unsigned int a2, int a3, int uActionLength) +void Actor::AI_4032B2(unsigned int a1, unsigned int a2, int a3, int uActionLength) { unsigned int v4; // edi@1 Actor *v5; // esi@1 @@ -2926,7 +2926,7 @@ } //----- (004030AD) -------------------------------------------------------- -void Actor::Stun(unsigned int uActorID, signed int edx0, int arg0) +void Actor::AI_Stun(unsigned int uActorID, signed int edx0, int arg0) { unsigned int v3; // edi@1 Actor *v4; // ebx@1 @@ -2980,7 +2980,7 @@ { unsigned int v7; // eax@3 unsigned int v9; // eax@3 - + assert(uActorID < uNumActors); auto actor = pActors + uActorID; @@ -3148,7 +3148,7 @@ } //----- (00402AD7) -------------------------------------------------------- -void Actor::Pursue1(unsigned int uActorID, unsigned int a2, signed int arg0, signed int uActionLength, AIDirection *pDir) +void Actor::AI_Pursue1(unsigned int uActorID, unsigned int a2, signed int arg0, signed int uActionLength, AIDirection *pDir) { unsigned int v5; // edi@1 int v6; // eax@1 @@ -3156,14 +3156,14 @@ unsigned int v8; // ecx@1 char v9; // zf@1 AIDirection *v10; // esi@6 - int v12; // ecx@19 - unsigned int v13; // eax@19 + //int v12; // ecx@19 + //unsigned int v13; // eax@19 AIDirection a3; // [sp+Ch] [bp-5Ch]@7 - AIDirection v15; // [sp+28h] [bp-40h]@7 + //AIDirection v15; // [sp+28h] [bp-40h]@7 AIDirection v16; // [sp+44h] [bp-24h]@7 - unsigned int v17; // [sp+60h] [bp-8h]@1 + //unsigned int v17; // [sp+60h] [bp-8h]@1 unsigned int v18; // [sp+64h] [bp-4h]@1 - int v19; // [sp+70h] [bp+8h]@19 + //int v19; // [sp+70h] [bp+8h]@19 v5 = uActorID; v6 = 0; @@ -3171,7 +3171,6 @@ v18 = a2; v8 = PID(OBJECT_Actor,uActorID); v9 = v7->pMonsterInfo.uFlying == 0; - v17 = v5; if ( !v9 && !pParty->bFlying ) { if ( v7->pMonsterInfo.uMissleAttack1Type ) @@ -3179,12 +3178,11 @@ else v6 = pParty->uPartyHeight; } + v10 = pDir; if ( !pDir ) { - memcpy(&v15, Actor::GetDirectionInfo(v8, a2, &a3, v6), sizeof(v15)); - memcpy(&v16, &v15, sizeof(v16)); - v5 = v17; + memcpy(&v16, Actor::GetDirectionInfo(v8, a2, &a3, v6), sizeof(v16)); v10 = &v16; } if ( MonsterStats::BelongsToSupertype(v7->pMonsterInfo.uID, MONSTER_SUPERTYPE_TREANT) ) @@ -3209,16 +3207,10 @@ v18 = 16; if ( arg0 % 2 ) v18 = -16; - v12 = ((unsigned __int64)(stru_5C6E00->Cos(v18 + stru_5C6E00->uIntegerPi + v10->uYawAngle) * (signed __int64)v10->uDistanceXZ) >> 16) - + pParty->vPosition.x; - v13 = stru_5C6E00->uIntegerPi + v10->uYawAngle; - v17 = v12; - v19 = stru_5C6E00->Sin(v18 + v13); + v7->uYawAngle = stru_5C6E00->Atan2( - v17 - v7->vPosition.x, - pParty->vPosition.y - + ((unsigned __int64)(v19 * (signed __int64)v10->uDistanceXZ) >> 16) - - v7->vPosition.y); + pParty->vPosition.x + fixpoint_sub0(stru_5C6E00->Cos(v18 + stru_5C6E00->uIntegerPi + v10->uYawAngle), v10->uDistanceXZ) - v7->vPosition.x, + pParty->vPosition.y + fixpoint_sub0(stru_5C6E00->Sin(v18 + stru_5C6E00->uIntegerPi + v10->uYawAngle), v10->uDistanceXZ) - v7->vPosition.y); if ( uActionLength ) v7->uCurrentActionLength = uActionLength; else @@ -3229,7 +3221,7 @@ } //----- (00402968) -------------------------------------------------------- -void Actor::Flee(unsigned int uActorID, signed int sTargetPid, int uActionLength, AIDirection *a4) +void Actor::AI_Flee(unsigned int uActorID, signed int sTargetPid, int uActionLength, AIDirection *a4) { unsigned int v4; // esi@1 Actor *v5; // ebx@1 @@ -3290,7 +3282,7 @@ } //----- (0040281C) -------------------------------------------------------- -void Actor::Pursue2(unsigned int uActorID, unsigned int a2, signed int uActionLength, AIDirection *pDir, int a5) +void Actor::AI_Pursue2(unsigned int uActorID, unsigned int a2, signed int uActionLength, AIDirection *pDir, int a5) { unsigned int v5; // edi@1 int v6; // eax@1 @@ -3373,7 +3365,7 @@ } //----- (00402686) -------------------------------------------------------- -void Actor::Pursue3(unsigned int uActorID, unsigned int a2, signed int uActionLength, AIDirection *a4) +void Actor::AI_Pursue3(unsigned int uActorID, unsigned int a2, signed int uActionLength, AIDirection *a4) { //unsigned int v4; // edi@1 int v5; // eax@1 diff -r 28ee6610a3d2 -r d5dae0b4b98a Actor.h --- a/Actor.h Fri May 24 10:53:33 2013 +0600 +++ b/Actor.h Fri May 24 10:53:46 2013 +0600 @@ -191,30 +191,30 @@ static void _SelectTarget(unsigned int uActorID, int *a2, bool can_target_party); - static void Pursue3(unsigned int uActorID, unsigned int a2, signed int uActionLength, struct AIDirection *a4); - static void Pursue2(unsigned int uActorID, unsigned int a2, signed int uActionLength, struct AIDirection *pDir, int a5); - static void Flee(unsigned int uActorID, signed int edx0, int uActionLength, struct AIDirection *a4); - static void Pursue1(unsigned int uActorID, unsigned int a2, signed int arg0, signed int uActionLength, struct AIDirection *pDir); + static void AI_Pursue3(unsigned int uActorID, unsigned int a2, signed int uActionLength, struct AIDirection *a4); + static void AI_Pursue2(unsigned int uActorID, unsigned int a2, signed int uActionLength, struct AIDirection *pDir, int a5); + static void AI_Flee(unsigned int uActorID, signed int edx0, int uActionLength, struct AIDirection *a4); + static void AI_Pursue1(unsigned int uActorID, unsigned int a2, signed int arg0, signed int uActionLength, struct AIDirection *pDir); static void PlaySound(unsigned int uActorID, unsigned int uSoundID); static void Die(unsigned int uActorID); static void Resurrect(unsigned int uActorID); static void AI_Bored(unsigned int uActorID, unsigned int uObjID, struct AIDirection *a4); - static void Stun(unsigned int uActorID, signed int edx0, int arg0); + static void AI_Stun(unsigned int uActorID, signed int edx0, int arg0); static char __fastcall _4031C1_update_job(unsigned int uActorID, signed int a2, int a3); - static void _4032B2(unsigned int a1, unsigned int a2, int a3, int uActionLength); - static void MissileAttack1(unsigned int uActorID, signed int sTargetPid, struct AIDirection *pDir); - static void MissileAttack2(unsigned int uActorID, signed int sTargetPid, struct AIDirection *pDir); - static void SpellAttack1(unsigned int uActorID, signed int sTargetPid, struct AIDirection *pDir); - static void SpellAttack2(unsigned int uActorID, signed int sTargetPid, struct AIDirection *pDir); - static void MeleeAttack(unsigned int uActorID, signed int sTargetPid, struct AIDirection *arg0); + static void AI_4032B2(unsigned int a1, unsigned int a2, int a3, int uActionLength); + static void AI_MissileAttack1(unsigned int uActorID, signed int sTargetPid, struct AIDirection *pDir); + static void AI_MissileAttack2(unsigned int uActorID, signed int sTargetPid, struct AIDirection *pDir); + static void AI_SpellAttack1(unsigned int uActorID, signed int sTargetPid, struct AIDirection *pDir); + static void AI_SpellAttack2(unsigned int uActorID, signed int sTargetPid, struct AIDirection *pDir); + static void AI_MeleeAttack(unsigned int uActorID, signed int sTargetPid, struct AIDirection *arg0); static void __fastcall StandAwhile(unsigned int uActorID); static void AI_Stand(unsigned int uActorID, unsigned int object_to_face_pid, unsigned int uActionLength, struct AIDirection *a4); static void AI_StandOrBored(unsigned int uActorID, signed int uObjID, int uActionLength, struct AIDirection *a4); - static void FaceObject(unsigned int uActorID, unsigned int uObjID, int _48, struct AIDirection *a4); + static void AI_FaceObject(unsigned int uActorID, unsigned int uObjID, int _48, struct AIDirection *a4); static struct AIDirection *__fastcall GetDirectionInfo(unsigned int uObj1ID, unsigned int uObj2ID, struct AIDirection *pOut, int a4); static signed int __fastcall Explode(unsigned int uActorID); - static char __fastcall RangedAttack(unsigned int uActorID, struct AIDirection *a2, int type, char a4); - static void __fastcall SpellAttack(unsigned int uActorID, struct AIDirection *pDir, int spellnum, int a4, unsigned int uSkillLevel); + static char __fastcall AI_RangedAttack(unsigned int uActorID, struct AIDirection *a2, int type, char a4); + static void __fastcall AI_SpellAttack(unsigned int uActorID, struct AIDirection *pDir, int spellnum, int a4, unsigned int uSkillLevel); static void AggroSurroundingPeasants(unsigned int uActorID, int a2); static bool ArePeasantsOfSameFaction(Actor *a1, Actor *a2); static bool StealFrom(unsigned int uActorID); diff -r 28ee6610a3d2 -r d5dae0b4b98a Chest.cpp --- a/Chest.cpp Fri May 24 10:53:33 2013 +0600 +++ b/Chest.cpp Fri May 24 10:53:46 2013 +0600 @@ -66,10 +66,10 @@ char *v26; // edx@29 unsigned __int16 v27; // ax@32 //SpriteObject a1; // [sp+14h] [bp-B0h]@28 - int v29; // [sp+84h] [bp-40h]@16 - int v30; // [sp+88h] [bp-3Ch]@16 - int v31; // [sp+8Ch] [bp-38h]@16 - int v32; // [sp+90h] [bp-34h]@16 + int v29[4]; // [sp+84h] [bp-40h]@16 + //int v30; // [sp+88h] [bp-3Ch]@16 + //int v31; // [sp+8Ch] [bp-38h]@16 + //int v32; // [sp+90h] [bp-34h]@16 float v33; // [sp+94h] [bp-30h]@23 //char *v34; // [sp+98h] [bp-2Ch]@5 int v35; // [sp+9Ch] [bp-28h]@16 @@ -105,10 +105,10 @@ goto LABEL_12; if ( pPlayers[uActiveCharacter]->GetDisarmTrap() < 2 * pMapStats->pInfos[v2].LockX5 ) { - v29 = 811; - v30 = 812; - v31 = 813; - v32 = 814; + v29[0] = 811; + v29[1] = 812; + v29[2] = 813; + v29[3] = 814; v5 = rand() % 4; v6 = PID_ID(EvtTargetObj); v35 = v5; diff -r 28ee6610a3d2 -r d5dae0b4b98a Events.cpp --- a/Events.cpp Fri May 24 10:53:33 2013 +0600 +++ b/Events.cpp Fri May 24 10:53:46 2013 +0600 @@ -6,6 +6,7 @@ #include "MapInfo.h" #include "Game.h" +#include "Outdoor.h" #include "GUIWindow.h" #include "GUIProgressBar.h" #include "Chest.h" @@ -24,6 +25,7 @@ #include "Events.h" #include "Events2D.h" #include "UIHouses.h" +#include "Log.h" #include "MM7.h" @@ -56,7 +58,7 @@ //----- (00443CE1) -------------------------------------------------------- unsigned int LoadEventsToBuffer(const char *pContainerName, char *pBuffer, unsigned int uBufferSize) - { +{ FILE *pLodFile; // eax@1 unsigned int uTextureSize; // esi@3 char Args[60]; // [sp+8h] [bp-B4h]@6 @@ -109,6 +111,7 @@ pGlobalEVT_Index[events_count].event_sequence_num=current_hdr->evt_sequence_num; pGlobalEVT_Index[events_count].uEventOffsetInEVT=offset_in; offset_in+=current_hdr->evt_size+1; + current_hdr=(raw_event_header *)&pGlobalEVT[offset_in]; } uGlobalEVT_NumEvents = events_count; @@ -117,6 +120,7 @@ } + //----- (00443EF8) -------------------------------------------------------- void LoadLevel_InitializeLevelEvt() { @@ -148,25 +152,132 @@ pLevelEVT_Index[events_count].event_sequence_num=current_hdr->evt_sequence_num; pLevelEVT_Index[events_count].uEventOffsetInEVT=offset_in; offset_in+=current_hdr->evt_size+1; + current_hdr=(raw_event_header *)&pLevelEVT[offset_in]; } uLevelEVT_NumEvents = events_count; /* - for (uint i = 0, j = 0; j < uLevelEVT_Size; ++i) +EmeraldIsle::Variables: +[0] ??? +[1] ??? +[2] Luck Fountain uses left +[3] Gold Fountain used this week +[4] Gold Fountain total uses + + +Emerald Isle #110 // Fire Resistance fountain +0 LocationName +0 if (Player.FireResistance < 50) + { +1 Set(Player.FireResistance, 50) +2 SetFooterString(22) // +50 Fire Resistance (temporarily) +3 Add(Party.Autonotes, 2) +4 goto return + } +5 SetFooterString(11) // Refreshing! +6 return + + + +Emerald Isle #111 // ??? + Initialize + Set(Map.Variables[0], 30) + Set(Map.Variables[1], 30) + + +Emerald Isle #114 // month timer - manage luck fountain +0 LocationName +0 if (Player.BaseLuck >= 15) + { +2 SetFooterString(11) // Refreshing! +3 return + } + else { - pLevelEVT_Index[i].uEventID = pLevelEVT[j + 1] + ((unsigned short)pLevelEVT[j + 2] << 8); - pLevelEVT_Index[i].event_sequence_num = pLevelEVT[j + 3]; - pLevelEVT_Index[i].uEventOffsetInEVT = j; - j += pLevelEVT[j] + 1; - uLevelEVT_NumEvents++; - }*/ +1 if (Map.Variables[2] >= 1) + { +4 Sub(Map.Variables[2], 1) +5 Add(Player.BaseLuck, 2) +6 SetFooterString(25) // +2 Luck (Permament) +7 return + } + else + { +2 SetFooterString(11) // Refreshing! +3 return + } + } + +8 Initialize +9 Set Map.Variables[2], 8 + + + +Emerald Isle #115 // week timer - gold fountain in the center of town +0 LocationName +0 if (Map.Variables[4] < 3) + { +1 if (Map.Variables[3] == 0) + { +2 if (Party.Gold < 201) + { +3 if (Player.BaseLuck >= 15) + { +5 Add(Map.Variables[3], 1) +6 Add(Party.Gold, 1000) +7 Add(Map.Variables[4], 1) +8 goto return + } + else + { +4 goto 9 + } + } + } + } +9 SetFooterString(11) // Refreshing! +10 return + +11 Initialize +12 Set(Map.Variables[3], 0) + + + + + +Emerald Isle #220 // day timer - monster spawner +0 LocationName +0 Initialize +1 if (NumAliveActors(group=20) != 0) +2 return +3 SpawnMonsters(1, level=1, count=10, x=-336, y=14512, z=0, group=20) +4 SpawnMonsters(1, level=2, count=5, x=16, y=16352, z=90, group=20) +5 SpawnMonsters(1, level=1, count=10, x=480, y=18288, z=6, group=20) + + + +Emerald Isle #200 // margareth dock tip +0 if (!QBits.QuestDone[17]) + { +1 InitiateNPCDialogue(npc=19) + } +2 return + + +Emerald Isle #201 // margareth armoury tip +0 if (!QBits.QuestDone[17]) + { +1 InitiateNPCDialogue(npc=20) + } +2 return +*/ } //----- (0044684A) -------------------------------------------------------- -void EventProcessor(int uEventID, int targetObj, int canShowMessages) - { +void EventProcessor(int uEventID, int targetObj, int canShowMessages, int entry_line) +{ unsigned int v3; // eax@5 signed int v4; // esi@7 //char *v5; // eax@8 @@ -320,7 +431,8 @@ return; } player_choose = (uActiveCharacter == 0)?6:4; //4 - active or 6 - random player if active =0 - curr_seq_num = start_event_seq_number; + curr_seq_num = entry_line; + if ( activeLevelDecoration ) { uSomeEVT_NumEvents = uGlobalEVT_NumEvents; @@ -356,11 +468,11 @@ case EVENT_CheckSeason: // if ( !sub_4465DF_check_season(_evt->v5) ) - { + { ++curr_seq_num; v4 = v124; break; - } + } v124 = -1; curr_seq_num = _evt->v6 - 1; ++curr_seq_num; @@ -980,13 +1092,17 @@ pPlayer->AddVariable((enum VariableType)EVT_WORD(_evt->v5), pValue); } v83 = EVT_WORD(_evt->v5); - if ( v83 == 21 || v83 == 22 || v83 == 23 || v83 == 24 ) - viewparams->bRedrawGameUI = 1; + if (v83 == 21 || // gold well on emerald isle + v83 == 22 || v83 == 23 || v83 == 24 ) + { + __debugbreak(); // find out what these decorations are + viewparams->bRedrawGameUI = true; + } ++curr_seq_num; v4 = v124; break; case EVENT_InputString: - if ( !start_event_seq_number ) + if ( !entry_line ) { strcpy(GameUI_Footer_TimedString, &pLevelStr[pLevelStrOffsets[EVT_DWORD(_evt->v5 )]]); v105 = curr_seq_num; diff -r 28ee6610a3d2 -r d5dae0b4b98a Events.h --- a/Events.h Fri May 24 10:53:33 2013 +0600 +++ b/Events.h Fri May 24 10:53:46 2013 +0600 @@ -99,7 +99,7 @@ EVENT_ForPartyMember = 0x23, EVENT_Jmp = 0x24, EVENT_OnMapReload = 0x25, - EVENT_OnLongTimer = 0x26, + EVENT_Initialize = 0x26, EVENT_SetNPCTopic = 0x27, EVENT_MoveNPC = 0x28, EVENT_GiveItem = 0x29, @@ -256,7 +256,12 @@ VAR_Stoned = 0x78, VAR_Eradicated = 0x79, VAR_MajorCondition = 0x7A, - VAR_MapPersistentVariable_0 = 0x7B, + VAR_MapPersistentVariable_0 = 123, + VAR_MapPersistentVariable_1 = 124, + VAR_MapPersistentVariable_2 = 125, + VAR_MapPersistentVariable_3 = 126, + VAR_MapPersistentVariable_4 = 127, + VAR_MapPersistentVariable_5 = 0x80, VAR_NPCs = 0xD6, VAR_Reputation = 0xD7, VAR_ActiveSpells = 0xDE, @@ -321,9 +326,9 @@ unsigned int LoadEventsToBuffer(const char *pContainerName, char *pBuffer, unsigned int uBufferSize); -void Initialize_GlobalEVT(); -void LoadLevel_InitializeLevelEvt(); -void EventProcessor(int uEventID, int a2, int a3); +void Initialize_GlobalEVT(); +void LoadLevel_InitializeLevelEvt(); +void EventProcessor(int uEventID, int a2, int a3, int entry_line = 0); diff -r 28ee6610a3d2 -r d5dae0b4b98a Game.cpp --- a/Game.cpp Fri May 24 10:53:33 2013 +0600 +++ b/Game.cpp Fri May 24 10:53:46 2013 +0600 @@ -265,7 +265,7 @@ //Render *v2; // edi@7 //signed int v3; // esi@7 signed int pNewNPCsCount; // ecx@58 - char *pFlags; // eax@59 + NPCData *pNPC; // eax@59 Player *pPlayer; // esi@65 //OtherOverlay *pOtherOverlay; // esi@67 //signed int v8; // edi@67 @@ -442,13 +442,13 @@ pNewNPCsCount = 0; if ( (signed int)pNPCStats->uNumNewNPCs > 0 ) { - pFlags = (char *)&pNPCStats->pNewNPCData[0].uFlags; + pNPC = pNPCStats->pNewNPCData; do { - if ( *((int *)pFlags + 6) ) - *pFlags &= 0x7Fu; + if ( pNPC->field_24 ) + pNPC->uFlags &= 0xFFFFFF7Fu; ++pNewNPCsCount; - pFlags += 76; + ++pNPC; } while ( pNewNPCsCount < (signed int)pNPCStats->uNumNewNPCs ); } diff -r 28ee6610a3d2 -r d5dae0b4b98a Indoor.cpp --- a/Indoor.cpp Fri May 24 10:53:33 2013 +0600 +++ b/Indoor.cpp Fri May 24 10:53:46 2013 +0600 @@ -1734,15 +1734,12 @@ //----- (004488F7) -------------------------------------------------------- void IndoorLocation::ToggleLight(signed int sLightID, unsigned int bToggle) { - char *v2; // eax@4 - if ( uCurrentlyLoadedLevelType == LEVEL_Indoor && (sLightID <= pIndoor->uNumLights - 1) && (sLightID >= 0) ) { - v2 = (char *)&pIndoor->pLights[sLightID].uAtributes; if ( bToggle ) - *v2 &= 0xF7u; + pIndoor->pLights[sLightID].uAtributes &= 0xFFFFFFF7u; else - *v2 |= 8u; + pIndoor->pLights[sLightID].uAtributes |= 8u; pParty->uFlags |= 2u; } } @@ -4208,7 +4205,7 @@ } v36 = stru_721530.uFaceID; LABEL_118: - Actor::FaceObject(v63, v36, v22, (AIDirection *)v22); + Actor::AI_FaceObject(v63, v36, v22, (AIDirection *)v22); goto LABEL_119; } if ( pParty->bTurnBasedModeOn == 1 && (pTurnEngine->field_4 == 2 || pTurnEngine->field_4 == 3) ) @@ -4225,7 +4222,7 @@ if ( !pActors[v37].pMonsterInfo.uHostilityType ) goto LABEL_118; LABEL_114: - Actor::Flee(v63, v36, v22, (AIDirection *)v22); + Actor::AI_Flee(v63, v36, v22, (AIDirection *)v22); goto LABEL_119; } } diff -r 28ee6610a3d2 -r d5dae0b4b98a Indoor.h --- a/Indoor.h Fri May 24 10:53:33 2013 +0600 +++ b/Indoor.h Fri May 24 10:53:46 2013 +0600 @@ -264,6 +264,7 @@ #define FACE_CLICKABLE 0x02000000 // Event can be triggered by clicking on the facet. #define FACE_PRESSURE_PLATE 0x04000000 // Event can be triggered by stepping on the facet. #define FACE_ETHEREAL 0x20000000 // Untouchable. You can pass through it. +#define FACE_PICKED 0x80000000 /* 93 */ #pragma pack(push, 1) diff -r 28ee6610a3d2 -r d5dae0b4b98a Outdoor.cpp --- a/Outdoor.cpp Fri May 24 10:53:33 2013 +0600 +++ b/Outdoor.cpp Fri May 24 10:53:46 2013 +0600 @@ -2249,7 +2249,7 @@ if (face.HasEventHint()) face.uAttributes |= 0x1000u; else - face.uAttributes &= 0xEFFFu; + face.uAttributes &= 0xFFFFEFFFu; } //++thisa; //v89 = pBModels; diff -r 28ee6610a3d2 -r d5dae0b4b98a Outdoor.h --- a/Outdoor.h Fri May 24 10:53:33 2013 +0600 +++ b/Outdoor.h Fri May 24 10:53:46 2013 +0600 @@ -3,6 +3,7 @@ #include "Indoor.h" #include "TileFrameTable.h" #include "Weather.h" +#include "BSPModel.h" #define DAY_ATTRIB_FOG 1 @@ -195,7 +196,7 @@ unsigned int uNumBModels; struct OutdoorLocationTerrain pTerrain; void *pCmap; - struct BSPModel *pBModels; + BSPModel *pBModels; unsigned int numFaceIDListElems; unsigned __int16 *pFaceIDLIST; unsigned int *pOMAP; diff -r 28ee6610a3d2 -r d5dae0b4b98a Party.cpp --- a/Party.cpp Fri May 24 10:53:33 2013 +0600 +++ b/Party.cpp Fri May 24 10:53:46 2013 +0600 @@ -854,7 +854,7 @@ v2 = abs(v0->vPosition.y - pParty->vPosition.y); v3 = abs(v0->vPosition.z - pParty->vPosition.z); if (int_get_vector_length(v1, v2, v3) < 512) - Actor::Flee(v4, 4, 0, 0); + Actor::AI_Flee(v4, 4, 0, 0); } ++v4; ++v0; diff -r 28ee6610a3d2 -r d5dae0b4b98a Party.h --- a/Party.h Fri May 24 10:53:33 2013 +0600 +++ b/Party.h Fri May 24 10:53:46 2013 +0600 @@ -6,7 +6,7 @@ - +#define PARTY_AUTONOTES_BIT__EMERALD_FIRE_FOUNTAIN 2 enum PARTY_QUEST_BITS: unsigned __int32 { @@ -17,6 +17,8 @@ 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_FOUNTAIN_HARMONDALE = 206, diff -r 28ee6610a3d2 -r d5dae0b4b98a Player.cpp --- a/Player.cpp Fri May 24 10:53:33 2013 +0600 +++ b/Player.cpp Fri May 24 10:53:46 2013 +0600 @@ -5221,8 +5221,8 @@ if ((v28 < 0) || v28 > 2 ) return v5 + v62 + v61; } - v15 = pItemsTable->pItems[v29].uDamageMod; - v14 = pItemsTable->pItems[v29].uDamageDice * pItemsTable->pItems[v29].uDamageRoll; + v15 = pItemsTable->pItems[v23].uDamageMod; + v14 = pItemsTable->pItems[v23].uDamageDice * pItemsTable->pItems[v23].uDamageRoll; v5 += v15 + v14; return v5 + v62 + v61; } @@ -5407,43 +5407,38 @@ //----- (0048F882) -------------------------------------------------------- int Player::GetActualSkillLevel( PLAYER_SKILL_TYPE uSkillType ) { - signed int v2; // esi@1 - unsigned __int16 v3; // ax@126 - char result; // al@127 - unsigned int v5; // [sp-4h] [bp-14h]@13 - signed int v6; // [sp-4h] [bp-14h]@27 - //unsigned int v7; // [sp-4h] [bp-14h]@35 - CHARACTER_ATTRIBUTE_TYPE v8; // [sp-4h] [bp-14h]@68 - //Player *v9; // [sp+Ch] [bp-4h]@1 + signed int bonus_value; // esi@1 + unsigned __int16 skill_value; // ax@126 + int result; // al@127 - v2 = 0; + bonus_value = 0; switch (uSkillType) { case PLAYER_SKILL_MONSTER_ID: { if ( CheckHiredNPCSpeciality(Hunter) ) - v2 = 6; + bonus_value = 6; if ( CheckHiredNPCSpeciality(Sage) ) - v2 += 6; - v2 += GetItemsBonus(CHARACTER_ATTRIBUTE_SKILL_MONSTER_ID, 0); + bonus_value += 6; + bonus_value += GetItemsBonus(CHARACTER_ATTRIBUTE_SKILL_MONSTER_ID, 0); } break; case PLAYER_SKILL_ARMSMASTER: { if ( CheckHiredNPCSpeciality(Armsmaster) ) - v2 = 2; + bonus_value = 2; if ( CheckHiredNPCSpeciality(Weaponsmaster) ) - v2 += 3; - v2 += GetItemsBonus(CHARACTER_ATTRIBUTE_SKILL_ARMSMASTER, 0); + bonus_value += 3; + bonus_value += GetItemsBonus(CHARACTER_ATTRIBUTE_SKILL_ARMSMASTER, 0); } break; case PLAYER_SKILL_STEALING: { if (CheckHiredNPCSpeciality(Burglar)) - v2 = 8; - v2 += GetItemsBonus(CHARACTER_ATTRIBUTE_SKILL_STEALING, 0); + bonus_value = 8; + bonus_value += GetItemsBonus(CHARACTER_ATTRIBUTE_SKILL_STEALING, 0); } break; @@ -5451,185 +5446,188 @@ case PLAYER_SKILL_ALCHEMY: { if ( CheckHiredNPCSpeciality(Herbalist) ) - v2 = 4; + bonus_value = 4; if ( CheckHiredNPCSpeciality(Apothecary) ) - v2 += 8; - v2 += GetItemsBonus(CHARACTER_ATTRIBUTE_SKILL_ALCHEMY, 0); + bonus_value += 8; + bonus_value += GetItemsBonus(CHARACTER_ATTRIBUTE_SKILL_ALCHEMY, 0); } break; case PLAYER_SKILL_LEARNING: { if ( CheckHiredNPCSpeciality(Teacher) ) - v2 = 10; + bonus_value = 10; if ( CheckHiredNPCSpeciality(Instructor) ) - v2 += 15; + bonus_value += 15; if ( CheckHiredNPCSpeciality(Scholar) ) - v2 += 5; - v2 += GetItemsBonus(CHARACTER_ATTRIBUTE_SKILL_LEARNING, 0); + bonus_value += 5; + bonus_value += GetItemsBonus(CHARACTER_ATTRIBUTE_SKILL_LEARNING, 0); } break; case PLAYER_SKILL_UNARMED: { if (CheckHiredNPCSpeciality(Monk) ) - v2 = 2; - v2 += GetItemsBonus(CHARACTER_ATTRIBUTE_SKILL_UNARMED, 0); + bonus_value = 2; + bonus_value += GetItemsBonus(CHARACTER_ATTRIBUTE_SKILL_UNARMED, 0); } break; case PLAYER_SKILL_DODGE: { if ( CheckHiredNPCSpeciality(Monk) ) - v2 = 2; - v2 += GetItemsBonus(CHARACTER_ATTRIBUTE_SKILL_DODGE, 0); + bonus_value = 2; + bonus_value += GetItemsBonus(CHARACTER_ATTRIBUTE_SKILL_DODGE, 0); } break; case PLAYER_SKILL_BOW: - v2 += GetItemsBonus(CHARACTER_ATTRIBUTE_SKILL_BOW, 0); + bonus_value += GetItemsBonus(CHARACTER_ATTRIBUTE_SKILL_BOW, 0); break; case PLAYER_SKILL_SHIELD: - v2 += GetItemsBonus(CHARACTER_ATTRIBUTE_SKILL_SHIELD, 0); + bonus_value += GetItemsBonus(CHARACTER_ATTRIBUTE_SKILL_SHIELD, 0); break; case PLAYER_SKILL_EARTH: if ( CheckHiredNPCSpeciality(Apprentice) ) - v2 = 2; + bonus_value = 2; if ( CheckHiredNPCSpeciality(Mystic) ) - v2 += 3; + bonus_value += 3; if ( CheckHiredNPCSpeciality(Spellmaster) ) - v2 += 4; + bonus_value += 4; if ( classType == PLAYER_CLASS_WARLOCK && PartyHasDragon() ) - v2 += 3; - v2 += GetItemsBonus(CHARACTER_ATTRIBUTE_SKILL_EARTH, 0); + bonus_value += 3; + bonus_value += GetItemsBonus(CHARACTER_ATTRIBUTE_SKILL_EARTH, 0); break; case PLAYER_SKILL_FIRE: if ( CheckHiredNPCSpeciality(Apprentice) ) - v2 = 2; + bonus_value = 2; if ( CheckHiredNPCSpeciality(Mystic) ) - v2 += 3; + bonus_value += 3; if ( CheckHiredNPCSpeciality(Spellmaster) ) - v2 += 4; + bonus_value += 4; if ( classType == PLAYER_CLASS_WARLOCK && PartyHasDragon() ) - v2 += 3; - v2 += GetItemsBonus(CHARACTER_ATTRIBUTE_SKILL_FIRE, 0); + bonus_value += 3; + bonus_value += GetItemsBonus(CHARACTER_ATTRIBUTE_SKILL_FIRE, 0); break; case PLAYER_SKILL_AIR: if ( CheckHiredNPCSpeciality(Apprentice) ) - v2 = 2; + bonus_value = 2; if ( CheckHiredNPCSpeciality(Mystic) ) - v2 += 3; + bonus_value += 3; if ( CheckHiredNPCSpeciality(Spellmaster) ) - v2 += 4; + bonus_value += 4; if ( classType == PLAYER_CLASS_WARLOCK && PartyHasDragon() ) - v2 += 3; - v2 += GetItemsBonus(CHARACTER_ATTRIBUTE_SKILL_AIR, 0); + bonus_value += 3; + bonus_value += GetItemsBonus(CHARACTER_ATTRIBUTE_SKILL_AIR, 0); break; case PLAYER_SKILL_WATER: if ( CheckHiredNPCSpeciality(Apprentice) ) - v2 = 2; + bonus_value = 2; if ( CheckHiredNPCSpeciality(Mystic) ) - v2 += 3; + bonus_value += 3; if ( CheckHiredNPCSpeciality(Spellmaster) ) - v2 += 4; + bonus_value += 4; if ( classType == PLAYER_CLASS_WARLOCK && PartyHasDragon() ) - v2 += 3; - v2 += GetItemsBonus(CHARACTER_ATTRIBUTE_SKILL_WATER, 0); + bonus_value += 3; + bonus_value += GetItemsBonus(CHARACTER_ATTRIBUTE_SKILL_WATER, 0); break; case PLAYER_SKILL_SPIRIT: if ( CheckHiredNPCSpeciality(Acolyte2) ) - v2 = 2; + bonus_value = 2; if ( CheckHiredNPCSpeciality(Initiate) ) - v2 += 3; + bonus_value += 3; if ( CheckHiredNPCSpeciality(Prelate) ) - v2 += 4; - v2 += GetItemsBonus(CHARACTER_ATTRIBUTE_SKILL_SPIRIT, 0); + bonus_value += 4; + bonus_value += GetItemsBonus(CHARACTER_ATTRIBUTE_SKILL_SPIRIT, 0); break; case PLAYER_SKILL_MIND: if ( CheckHiredNPCSpeciality(Acolyte2) ) - v2 = 2; + bonus_value = 2; if ( CheckHiredNPCSpeciality(Initiate) ) - v2 += 3; + bonus_value += 3; if ( CheckHiredNPCSpeciality(Prelate) ) - v2 += 4; - v2 += GetItemsBonus(CHARACTER_ATTRIBUTE_SKILL_MIND, 0); + bonus_value += 4; + bonus_value += GetItemsBonus(CHARACTER_ATTRIBUTE_SKILL_MIND, 0); break; case PLAYER_SKILL_BODY: if ( CheckHiredNPCSpeciality(Acolyte2) ) - v2 = 2; + bonus_value = 2; if ( CheckHiredNPCSpeciality(Initiate) ) - v2 += 3; + bonus_value += 3; if ( CheckHiredNPCSpeciality(Prelate) ) - v2 += 4; - v2 += GetItemsBonus(CHARACTER_ATTRIBUTE_SKILL_BODY, 0); + bonus_value += 4; + bonus_value += GetItemsBonus(CHARACTER_ATTRIBUTE_SKILL_BODY, 0); break; case PLAYER_SKILL_LIGHT: - v2 += GetItemsBonus(CHARACTER_ATTRIBUTE_SKILL_LIGHT, 0); + bonus_value += GetItemsBonus(CHARACTER_ATTRIBUTE_SKILL_LIGHT, 0); break; case PLAYER_SKILL_DARK: { - v2 += GetItemsBonus(CHARACTER_ATTRIBUTE_SKILL_DARK, 0); + bonus_value += GetItemsBonus(CHARACTER_ATTRIBUTE_SKILL_DARK, 0); } break; case PLAYER_SKILL_MERCHANT: { if ( CheckHiredNPCSpeciality(Trader) ) - v2 = 4; + bonus_value = 4; if ( CheckHiredNPCSpeciality(Merchant) ) - v2 += 6; + bonus_value += 6; if ( CheckHiredNPCSpeciality(Gypsy) ) - v2 += 3; + bonus_value += 3; if ( CheckHiredNPCSpeciality(Duper) ) - v2 += 8; + bonus_value += 8; } break; case PLAYER_SKILL_PERCEPTION: { if ( CheckHiredNPCSpeciality(Scout) ) - v2 = 6; + bonus_value = 6; if ( CheckHiredNPCSpeciality(Psychic) ) - v2 += 5; + bonus_value += 5; } break; case PLAYER_SKILL_ITEM_ID: - v2 += GetItemsBonus(CHARACTER_ATTRIBUTE_SKILL_ITEM_ID, 0); + bonus_value += GetItemsBonus(CHARACTER_ATTRIBUTE_SKILL_ITEM_ID, 0); break; case PLAYER_SKILL_MEDITATION: - v2 += GetItemsBonus(CHARACTER_ATTRIBUTE_SKILL_MEDITATION, 0); + bonus_value += GetItemsBonus(CHARACTER_ATTRIBUTE_SKILL_MEDITATION, 0); break; case PLAYER_SKILL_TRAP_DISARM: { if ( CheckHiredNPCSpeciality(Tinker) ) - v2 = 4; + bonus_value = 4; if ( CheckHiredNPCSpeciality(Locksmith) ) - v2 += 6; + bonus_value += 6; if ( CheckHiredNPCSpeciality(Burglar) ) - v2 += 8; - v2 += GetItemsBonus(CHARACTER_ATTRIBUTE_SKILL_TRAP_DISARM, 0); + bonus_value += 8; + bonus_value += GetItemsBonus(CHARACTER_ATTRIBUTE_SKILL_TRAP_DISARM, 0); } break; } - v3 = pActiveSkills[uSkillType]; - if ( v2 + (v3 & 0x3F) < 60 ) - result = v2 + v3; + skill_value = pActiveSkills[uSkillType]; + if ( bonus_value + (skill_value & 0x3F) < 60 ) + result = bonus_value + skill_value; else - result = v3 & 0xFFFC | 0x3C; //al + result = skill_value & 0xFFFC | 0x3C; //al return result; } //----- (0048FC00) -------------------------------------------------------- int Player::GetSkillBonus(enum CHARACTER_ATTRIBUTE_TYPE a2) { + + + Player *v2; // esi@1 - int v3; // eax@1 + int armmaster_skill; // eax@1 char v4; // di@1 signed int v5; // ebx@1 - unsigned int v6; // eax@2 + unsigned int armaster_mastery; // eax@2 unsigned __int8 v7; // sf@5 unsigned __int8 v8; // of@5 PlayerEquipment *v9; // ebx@19 @@ -5682,8 +5680,8 @@ unsigned int v57; // eax@118 int v58; // esi@121 signed int j; // ecx@121 - int v60; // edi@126 - int v61; // eax@126 + int base_value; // edi@126 + int attrib_modif; // eax@126 signed int v62; // [sp-4h] [bp-30h]@26 signed int v63; // [sp-4h] [bp-30h]@80 int v64; // [sp+Ch] [bp-20h]@104 @@ -5697,56 +5695,148 @@ int a1; // [sp+34h] [bp+8h]@21 int a1a; // [sp+34h] [bp+8h]@74 signed int a1b; // [sp+34h] [bp+8h]@94 + int multiplier; + int arm_bonus; + int lvl_avl[4]; v2 = this; v70 = 0; v69 = 0; + multiplier =0; + arm_bonus =0; v71 = (ITEM_EQUIP_TYPE)0; - LOBYTE(v3) = GetActualSkillLevel(PLAYER_SKILL_ARMSMASTER); - v4 = v3; + armmaster_skill = GetActualSkillLevel(PLAYER_SKILL_ARMSMASTER); + v4 = armmaster_skill; v5 = 1; - if ( v3 ) - { - v6 = SkillToMastery(v3); + if ( armmaster_skill ) + { + armaster_mastery = SkillToMastery(armmaster_skill); if ( a2 == CHARACTER_ATTRIBUTE_MELEE_DMG_BONUS ) { - if ( (signed int)v6 >= 4 ) - goto LABEL_4; - v8 = __OFSUB__(v6, 3); - v7 = ((v6 - 3) & 0x80000000u) != 0; - } - else - { - if ( a2 != CHARACTER_ATTRIBUTE_ATTACK ) - goto LABEL_11; - if ( (signed int)v6 >= 4 ) - { -LABEL_4: - v71 = (ITEM_EQUIP_TYPE)2; -LABEL_11: - v69 = (PlayerEquipment *)(v71 * (v4 & 0x3F)); - goto LABEL_12; - } - v8 = __OFSUB__(v6, 2); - v7 = ((v6 - 2) & 0x80000000u) != 0; - } - if ( !(v7 ^ v8) ) - v71 = (ITEM_EQUIP_TYPE)1; - goto LABEL_11; - } -LABEL_12: + if ( armaster_mastery == 4 ) + multiplier =2; + else if ( armaster_mastery == 3 ) + multiplier =1; + } + else if ( a2 == CHARACTER_ATTRIBUTE_ATTACK ) + { + if ( armaster_mastery == 4 ) + multiplier =2; + else if ( armaster_mastery >= 2 ) + multiplier =1; + } + arm_bonus=(armmaster_skill&0x3F)*multiplier; + } + + if ( a2 == CHARACTER_ATTRIBUTE_HEALTH ) { - v60 = pBaseHealthPerLevelByClass[v2->classType]; - v61 = v2->GetBodybuilding(); - return v60 * v61; + base_value = pBaseHealthPerLevelByClass[classType]; + attrib_modif = GetBodybuilding(); + return base_value * attrib_modif; } if ( a2 == CHARACTER_ATTRIBUTE_MANA ) { - v60 = pBaseManaPerLevelByClass[v2->classType]; - v61 = v2->GetMeditation(); - return v60 * v61; - } + base_value = pBaseManaPerLevelByClass[classType]; + attrib_modif = GetMeditation(); + return base_value * attrib_modif; + } + if ( a2 == CHARACTER_ATTRIBUTE_AC_BONUS ) + { + a1b = 0; + v71 = (ITEM_EQUIP_TYPE)0; + + for (j=0; j<16; ++j) + { + if (pEquipment.pIndices[j]&&(!pOwnItems[ pEquipment.pIndices[j]].Broken())) + { + int curr_item =pOwnItems[pEquipment.pIndices[j]].uItemID; + v44=pItemsTable->pItems[curr_item].uSkillType; + switch (v44) + { + + case PLAYER_SKILL_STAFF: + + lvl_avl[0]=0; + lvl_avl[1]=1; + lvl_avl[2]=0; + lvl_avl[3]=0; + break; + case PLAYER_SKILL_SWORD: + case PLAYER_SKILL_SPEAR: + lvl_avl[0]=0; + lvl_avl[1]=0; + lvl_avl[2]=0; + lvl_avl[3]=1; + break; + case PLAYER_SKILL_SHIELD: + a1b = 1; + lvl_avl[0]=1; + lvl_avl[1]=0; + lvl_avl[2]=1; + lvl_avl[3]=0; + break; + case PLAYER_SKILL_LEATHER: + v71 = (ITEM_EQUIP_TYPE)1; + lvl_avl[0]=1; + lvl_avl[1]=0; + lvl_avl[2]=1; + lvl_avl[3]=0; + + break; + case PLAYER_SKILL_CHAIN: + a1b = 1; + lvl_avl[0]=1; + lvl_avl[1]=0; + lvl_avl[2]=0; + lvl_avl[3]=0; + break; + case PLAYER_SKILL_PLATE: + a1b = 1; + lvl_avl[0]=1; + lvl_avl[1]=0; + lvl_avl[2]=0; + lvl_avl[3]=0; + break; + default: + continue; + } + + v50= GetActualSkillLevel((PLAYER_SKILL_TYPE)v44); + v51 = v50; + v52 = SkillToMastery(v50); + v53 = v51 & 0x3F; + for ( i = 0; i < (signed int)v52; ++i ) + { + if ( lvl_avl[i] ) + v70 += v53; + } + + } + } + + lvl_avl[0]=1; + lvl_avl[1]=1; + lvl_avl[2]=1; + lvl_avl[3]=0; + + v55 = GetActualSkillLevel(PLAYER_SKILL_DODGE); + v56 = v55; + v57 = SkillToMastery(v55); + if ( !a1b && (!v71 || v57 == 4) ) + { + v58 = v56 & 0x3F; + for ( j = 0; j < (signed int)v57; ++j ) + { + if ( lvl_avl[i] ) + v70 += v58; + } + } + return v70; + + + } + if ( a2 != 9 ) { if ( a2 != CHARACTER_ATTRIBUTE_ATTACK ) @@ -5906,7 +5996,7 @@ { if ( v2->HasItemEquipped(v35) ) { - v37 = *(int *)&v2->pInventoryItems[v35].uItemID; + v37 = v2->pInventoryItems[v35].uItemID; if ( pItemsTable->pItems[v37].uEquipType <= 1u ) break; } @@ -5972,99 +6062,7 @@ v30 = v68 + v71 * (a1a & 0x3F); return (int)((char *)v69 + v30); } - a1b = 0; - v71 = (ITEM_EQUIP_TYPE)0; - v68 = 16; - v69 = &v2->pEquipment; - do - { - if ( !v69->uShield || (v42 = (int)((char *)v2 + 36 * v69->uShield), *(char *)(v42 + 516) & 2) ) - goto LABEL_117; - v43 = (PLAYER_SKILL_TYPE)pItemsTable->pItems[*(int *)(v42 + 496)].uSkillType; - v44 = pItemsTable->pItems[*(int *)(v42 + 496)].uSkillType; - if ( !v44 ) - { - v64 = 0; - v65 = 1; -LABEL_111: - v66 = 0; - goto LABEL_112; - } - v45 = v44 - 1; - if ( !v45 || (v46 = v45 - 3) == 0 ) - { - v64 = 0; - v65 = 0; - v66 = 0; - v67 = 1; - goto LABEL_113; - } - v47 = v46 - 4; - if ( v47 ) - { - v48 = v47 - 1; - if ( v48 ) - { - v49 = v48 - 1; - if ( v49 ) - { - if ( v49 != 1 ) - goto LABEL_117; - a1b = 1; - v64 = 1; - v65 = 0; - v66 = 0; - v67 = 0; - goto LABEL_113; - } - a1b = 1; - v64 = 1; - v65 = 0; - goto LABEL_111; - } - v71 = (ITEM_EQUIP_TYPE)1; - } - else - { - a1b = 1; - } - v64 = 1; - v65 = 0; - v66 = 1; -LABEL_112: - v67 = 0; -LABEL_113: - LOBYTE(v50) = v2->GetActualSkillLevel(v43); - v51 = v50; - v52 = SkillToMastery(v50); - v53 = v51 & 0x3F; - for ( i = 0; i < (signed int)v52; ++i ) - { - if ( *(&v64 + i) ) - v70 += v53; - } -LABEL_117: - v69 = (PlayerEquipment *)((char *)v69 + 4); - --v68; - } - while ( v68 ); - v64 = 1; - v65 = 1; - v66 = 1; - v67 = 0; - LOBYTE(v55) = v2->GetActualSkillLevel(PLAYER_SKILL_DODGE); - v56 = v55; - v57 = SkillToMastery(v55); - if ( !a1b && (!v71 || v57 == 4) ) - { - v58 = v56 & 0x3F; - for ( j = 0; j < (signed int)v57; ++j ) - { - if ( *(&v64 + j) ) - v70 += v58; - } - } - return v70; + } //----- (00490109) -------------------------------------------------------- diff -r 28ee6610a3d2 -r d5dae0b4b98a SpriteObject.cpp --- a/SpriteObject.cpp Fri May 24 10:53:33 2013 +0600 +++ b/SpriteObject.cpp Fri May 24 10:53:46 2013 +0600 @@ -1095,7 +1095,7 @@ { if (pSpriteObjects[uLayingItemID].uAttributes & 4 ) { - pSpriteObjects[uLayingItemID].uAttributes &= 0xFB; + pSpriteObjects[uLayingItemID].uAttributes &= 0xFFFB; --pTurnEngine->field_1C; } } diff -r 28ee6610a3d2 -r d5dae0b4b98a UICharacter.cpp --- a/UICharacter.cpp Fri May 24 10:53:33 2013 +0600 +++ b/UICharacter.cpp Fri May 24 10:53:46 2013 +0600 @@ -772,7 +772,7 @@ if ( _50C9A8_item_enchantment_timer <= 0 ) { _50C9A8_item_enchantment_timer = 0; - item_MainHand4->uAttributes &= 0xFu; + item_MainHand4->uAttributes &= 0xFFFFFF0Fu; ptr_50C9A4 = 0; } v17 = (double)GetTickCount() * 0.1; @@ -819,7 +819,7 @@ if ( _50C9A8_item_enchantment_timer <= 0 ) { _50C9A8_item_enchantment_timer = 0; - itemBow->uAttributes &= 0xFu; + itemBow->uAttributes &= 0xFFFFFF0Fu; ptr_50C9A4 = 0; } v28 = (double)GetTickCount() * 0.1; @@ -881,7 +881,7 @@ if ( _50C9A8_item_enchantment_timer <= 0 ) { _50C9A8_item_enchantment_timer = 0; - item_Cloak->uAttributes &= 0xFu; + item_Cloak->uAttributes &= 0xFFFFFF0Fu; ptr_50C9A4 = 0; } v40 = (double)GetTickCount() * 0.1; @@ -949,7 +949,7 @@ if ( _50C9A8_item_enchantment_timer <= 0 ) { _50C9A8_item_enchantment_timer = 0; - item_Armor->uAttributes &= 0xFu; + item_Armor->uAttributes &= 0xFFFFFF0Fu; ptr_50C9A4 = 0; } v52 = (double)GetTickCount() * 0.1; @@ -1005,7 +1005,7 @@ if ( _50C9A8_item_enchantment_timer <= 0 ) { _50C9A8_item_enchantment_timer = 0; - item_Armor->uAttributes &= 0xFu; + item_Armor->uAttributes &= 0xFFFFFF0Fu; ptr_50C9A4 = 0; } v97 = (double)GetTickCount(); @@ -1050,7 +1050,7 @@ if ( _50C9A8_item_enchantment_timer <= 0 ) { _50C9A8_item_enchantment_timer = 0; - item_Armor->uAttributes &= 0xFu; + item_Armor->uAttributes &= 0xFFFFFF0Fu; ptr_50C9A4 = 0; } v97 = (double)GetTickCount(); @@ -1114,7 +1114,7 @@ if ( _50C9A8_item_enchantment_timer <= 0 ) { _50C9A8_item_enchantment_timer = 0; - item_Boot->uAttributes &= 0xFu; + item_Boot->uAttributes &= 0xFFFFFF0Fu; ptr_50C9A4 = 0; } v64 = (double)GetTickCount() * 0.1; @@ -1185,7 +1185,7 @@ if ( _50C9A8_item_enchantment_timer <= 0 ) { _50C9A8_item_enchantment_timer = 0; - item_Belt->uAttributes &= 0xFu; + item_Belt->uAttributes &= 0xFFFFFF0Fu; ptr_50C9A4 = 0; } v78 = (double)GetTickCount() * 0.1; @@ -1260,7 +1260,7 @@ if ( _50C9A8_item_enchantment_timer <= 0 ) { _50C9A8_item_enchantment_timer = 0; - item_CloakCollar->uAttributes &= 0xFu; + item_CloakCollar->uAttributes &= 0xFFFFFF0Fu; ptr_50C9A4 = 0; } v118 = (double)GetTickCount() * 0.1; @@ -1324,7 +1324,7 @@ if ( _50C9A8_item_enchantment_timer <= 0 ) { _50C9A8_item_enchantment_timer = 0; - item_Helm->uAttributes &= 0xFu; + item_Helm->uAttributes &= 0xFFFFFF0Fu; ptr_50C9A4 = 0; } v130 = (double)GetTickCount() * 0.1; @@ -1388,7 +1388,7 @@ if ( _50C9A8_item_enchantment_timer <= 0 ) { _50C9A8_item_enchantment_timer = 0; - item_MainHand3->uAttributes &= 0xFu; + item_MainHand3->uAttributes &= 0xFFFFFF0Fu; ptr_50C9A4 = 0; } v141 = (double)GetTickCount() * 0.1; @@ -1460,7 +1460,7 @@ if ( _50C9A8_item_enchantment_timer <= 0 ) { _50C9A8_item_enchantment_timer = 0; - item_Shield->uAttributes &= 0xFu; + item_Shield->uAttributes &= 0xFFFFFF0Fu; ptr_50C9A4 = 0; } v158 = (double)GetTickCount() * 0.1; @@ -1602,7 +1602,7 @@ if (_50C9A8_item_enchantment_timer <= 0) { _50C9A8_item_enchantment_timer = 0; - item->uAttributes &= 0xF; + item->uAttributes &= 0xFFFFFF0F; ptr_50C9A4 = 0; } pRenderer->_4A63E6(x, y, item_texture, enchantment_texture, GetTickCount() * 0.1, 0, 255); diff -r 28ee6610a3d2 -r d5dae0b4b98a UIHouses.cpp --- a/UIHouses.cpp Fri May 24 10:53:33 2013 +0600 +++ b/UIHouses.cpp Fri May 24 10:53:46 2013 +0600 @@ -531,8 +531,7 @@ return 0; } } - if ( !start_event_seq_number ) - pAudioPlayer->StopChannels(-1, -1); + pAudioPlayer->StopChannels(-1, -1); uCurrentHouse_Animation = p2DEvents[uHouseID - 1].uAnimationID; in_current_building_type = pAnimatedRooms[uCurrentHouse_Animation].uBuildingType; diff -r 28ee6610a3d2 -r d5dae0b4b98a UIPartyCreation.cpp --- a/UIPartyCreation.cpp Fri May 24 10:53:33 2013 +0600 +++ b/UIPartyCreation.cpp Fri May 24 10:53:46 2013 +0600 @@ -657,10 +657,10 @@ } while ( uControlParamd < 9 ); - pPlayerCreationUI_BtnOK = pGUIWindow_CurrentMenu->CreateButton(580, 431, 51, 39, 1, 0, UIMSG_PlayerCreationClickOK, 0, 0xD, "", pIcons_LOD->GetTexture(uTextureID_BUTTMAKE), 0); - pPlayerCreationUI_BtnReset = pGUIWindow_CurrentMenu->CreateButton(527, 431, 51, 39, 1, 0, UIMSG_PlayerCreationClickReset, 0, 0x43, "", pIcons_LOD->GetTexture(uTextureID_BUTTMAKE2), 0); - pPlayerCreationUI_BtnMinus = pGUIWindow_CurrentMenu->CreateButton(523, 393, 20, 35, 1, 0, UIMSG_PlayerCreationClickMinus, 0, 0x2D, "", pTexture_buttminu, 0); - pPlayerCreationUI_BtnPlus = pGUIWindow_CurrentMenu->CreateButton(613, 393, 20, 35, 1, 0, UIMSG_PlayerCreationClickPlus, 1, 0x2B, "", pTexture_buttplus, 0); + pPlayerCreationUI_BtnOK = pGUIWindow_CurrentMenu->CreateButton(580, 431, 51, 39, 1, 0, UIMSG_PlayerCreationClickOK, 0, '\r', "", pIcons_LOD->GetTexture(uTextureID_BUTTMAKE), 0); + pPlayerCreationUI_BtnReset = pGUIWindow_CurrentMenu->CreateButton(527, 431, 51, 39, 1, 0, UIMSG_PlayerCreationClickReset, 0, 'C', "", pIcons_LOD->GetTexture(uTextureID_BUTTMAKE2), 0); + pPlayerCreationUI_BtnMinus = pGUIWindow_CurrentMenu->CreateButton(523, 393, 20, 35, 1, 0, UIMSG_PlayerCreationClickMinus, 0, '-', "", pTexture_buttminu, 0); + pPlayerCreationUI_BtnPlus = pGUIWindow_CurrentMenu->CreateButton(613, 393, 20, 35, 1, 0, UIMSG_PlayerCreationClickPlus, 1, '+', "", pTexture_buttplus, 0); pFontCChar = LoadFont("cchar.fnt", "FONTPAL", NULL); } diff -r 28ee6610a3d2 -r d5dae0b4b98a UiGame.cpp --- a/UiGame.cpp Fri May 24 10:53:33 2013 +0600 +++ b/UiGame.cpp Fri May 24 10:53:46 2013 +0600 @@ -2570,7 +2570,7 @@ LABEL_15: //v12 = &pIndoor->pFaces[pOutline->uFace1ID]; if (bWizardEyeActive && uWizardEyeSkillLevel >= 3 && - (pFace1->uAttributes & 0x2000000 || pFace2->uAttributes & 0x2000000) && + (pFace1->uAttributes & 0x2000 || pFace2->uAttributes & 0x2000) && (pIndoor->pFaceExtras[pFace1->uFaceExtraID].uEventID || pIndoor->pFaceExtras[pFace2->uFaceExtraID].uEventID)) { if (uNumBlueFacesInBLVMinimap < 49) diff -r 28ee6610a3d2 -r d5dae0b4b98a Vis.cpp --- a/Vis.cpp Fri May 24 10:53:33 2013 +0600 +++ b/Vis.cpp Fri May 24 10:53:46 2013 +0600 @@ -322,11 +322,12 @@ { if ( pFaceID < (signed int)pIndoor->uNumFaces ) { - if ( is_part_of_selection(&pIndoor->pFaces[pFaceID], filter) ) + auto face = pIndoor->pFaces + pFaceID; + if ( is_part_of_selection(face, filter) ) { - if ( !pGame->pIndoorCameraD3D->IsCulled(&pIndoor->pFaces[pFaceID]) ) + if ( !pGame->pIndoorCameraD3D->IsCulled(face) ) { - if ( Intersect_Ray_Face(pRay, pRay + 1, &fDepth, &a1, &pIndoor->pFaces[pFaceID], 0xFFFFFFFFu) ) + if ( Intersect_Ray_Face(pRay, pRay + 1, &fDepth, &a1, face, 0xFFFFFFFFu) ) { pGame->pIndoorCameraD3D->ViewTransform(&a1, 1); v9 = fixpoint_from_float(/*v8, */a1.vWorldViewPosition.x); @@ -345,6 +346,12 @@ } } } + + if (face->uAttributes & FACE_PICKED) + face->uAttributes |= FACE_OUTLINED; + else + face->uAttributes &= ~FACE_OUTLINED; + face->uAttributes &= ~FACE_PICKED; } } v5 = v17 + 1; @@ -385,10 +392,11 @@ list->AddObject(face, VisObjectType_Face, v13); } - if (blv_face.uAttributes & 0x80000000) + if (blv_face.uAttributes & FACE_PICKED) face->uAttributes |= FACE_OUTLINED; else face->uAttributes &= ~FACE_OUTLINED; + blv_face.uAttributes &= ~FACE_PICKED; } } } @@ -610,8 +618,6 @@ IntersectPoint.z < pFace->pBounding.z1 || IntersectPoint.z > pFace->pBounding.z2 ) return false; - pFace->uAttributes |= 0x80000000; - if (uModelID != -1) ODM_CreateIntersectFacesVertexCoordList(&a, &b, intersect_face_vertex_coords_list_a, intersect_face_vertex_coords_list_b, &IntersectPoint, pFace, uModelID); @@ -656,6 +662,8 @@ if ( v16 != 1 ) return false; + + pFace->uAttributes |= FACE_PICKED; return true; /* int v5; // esi@10 @@ -1255,7 +1263,6 @@ return true; } - //----- (004C04AF) -------------------------------------------------------- Vis::Vis() { diff -r 28ee6610a3d2 -r d5dae0b4b98a mm7_1.cpp --- a/mm7_1.cpp Fri May 24 10:53:33 2013 +0600 +++ b/mm7_1.cpp Fri May 24 10:53:46 2013 +0600 @@ -1069,7 +1069,7 @@ if ( !v17->CanAct() ) return; v18 = a2.y; - Actor::FaceObject(a2.y, 4u, 0, 0); + Actor::AI_FaceObject(a2.y, 4u, 0, 0); if ( !v17->sNPC_ID ) { v19 = pNPCStats->pGroups_copy[v17->uGroup]; diff -r 28ee6610a3d2 -r d5dae0b4b98a mm7_2.cpp --- a/mm7_2.cpp Fri May 24 10:53:33 2013 +0600 +++ b/mm7_2.cpp Fri May 24 10:53:46 2013 +0600 @@ -3820,33 +3820,31 @@ MonsterDesc *v8; // edi@16 unsigned __int16 v9; // ax@16 int v10; // ebx@16 - int v11; // edi@16 - int v12; // eax@16 - int v13; // ecx@16 - int v14; // ebx@16 + //int v11; // edi@16 + //int v12; // eax@16 + //int v13; // ecx@16 + //int v14; // ebx@16 const char *v15; // [sp-4h] [bp-24h]@2 - unsigned __int16 v16; // [sp+0h] [bp-20h]@1 - int v17; // [sp+4h] [bp-1Ch]@1 + //unsigned __int16 v16; // [sp+0h] [bp-20h]@1 + //int v17; // [sp+4h] [bp-1Ch]@1 unsigned int uFaceID; // [sp+8h] [bp-18h]@16 int v19; // [sp+Ch] [bp-14h]@16 size_t v20; // [sp+10h] [bp-10h]@6 int v21; // [sp+14h] [bp-Ch]@14 - int v22; // [sp+18h] [bp-8h]@14 + //int v22; // [sp+18h] [bp-8h]@14 unsigned int v23; // [sp+1Ch] [bp-4h]@6 - v16 = a2; - v17 = a1; + //v16 = a2; + //v17 = a1; if ( a2 == 4 ) { v15 = "Elemental Light C"; } - else - { - if ( a2 == 3 ) + else if ( a2 == 3 ) v15 = "Elemental Light B"; else v15 = "Elemental Light A"; - } + v23 = pMonsterList->GetMonsterIDByName(v15); v3 = 0; v20 = uNumActors; @@ -3855,7 +3853,7 @@ v4 = pActors;//[0].uAIState; while ( v4->uAIState != Removed ) { - ++v3; + ++v3; ++v4; if ( v3 >= (signed int)uNumActors ) break; @@ -3866,7 +3864,7 @@ if ( v20 != uNumActors || (result = uNumActors + 1, (signed int)(uNumActors + 1) < 500) ) { v21 = 0; - v22 = pParty->vPosition.z; + //v22 = pParty->vPosition.z; if ( uCurrentlyLoadedLevelType == LEVEL_Indoor ) v21 = pIndoor->GetSector(pParty->vPosition.x, pParty->vPosition.y, pParty->vPosition.z); v6 = &pActors[v20]; @@ -3886,22 +3884,21 @@ v6->pMonsterInfo.uExp = 0; v6->uMovementSpeed = v9; v10 = rand() % 2048; - v11 = ((unsigned __int64)(stru_5C6E00->Cos(v10) * (signed __int64)v19) >> 16) + pParty->vPosition.x; + //v11 = pParty->vPosition.x + fixpoint_sub0(stru_5C6E00->Cos(v10), v19); uFaceID = stru_5C6E00->Sin(v10); - v23 = (unsigned __int64)(uFaceID * (signed __int64)v19) >> 16; - v12 = pParty->vPosition.y; - v13 = (unsigned __int64)(uFaceID * (signed __int64)v19) >> 16; - v6->vInitialPosition.x = v11; - v14 = v13 + v12; - LOWORD(v12) = v22; - v6->vInitialPosition.z = v22; - v6->vPosition.z = v12; - LOWORD(v12) = v21; - v6->vPosition.x = v11; - v6->vInitialPosition.y = v14; - v6->vPosition.y = v14; + //v12 = pParty->vPosition.y; + //v13 = fixpoint_sub0(uFaceID, v19); + //v14 = pParty->vPosition.y + fixpoint_sub0(uFaceID, v19); + //LOWORD(v12) = v22; + v6->vInitialPosition.x = pParty->vPosition.x + fixpoint_sub0(stru_5C6E00->Cos(v10), v19); + v6->vPosition.x = v6->vInitialPosition.x; + v6->vInitialPosition.y = pParty->vPosition.y + fixpoint_sub0(uFaceID, v19); + v6->vPosition.y = v6->vInitialPosition.y; + v6->vInitialPosition.z = pParty->vPosition.z; + v6->vPosition.z = v6->vInitialPosition.z; + //LOWORD(v12) = v21; v6->uTetherDistance = 256; - v6->uSectorID = v12; + v6->uSectorID = v21; v6->PrepareSprites(0); v6->pMonsterInfo.uHostilityType = MonsterInfo::Hostility_Friendly; v6->uAlly = 9999; @@ -3911,19 +3908,17 @@ v6->uCurrentActionLength = 256; v6->UpdateAnimation(); if ( uCurrentlyLoadedLevelType == LEVEL_Outdoor - || (v22 = pParty->vPosition.z, - result = pIndoor->GetSector(v11, v14, pParty->vPosition.z), + || (result = pIndoor->GetSector(v6->vPosition.x, v6->vPosition.y, v6->vPosition.z), result == v21) - && (result = BLV_GetFloorLevel(v11, v14, v22, result, &uFaceID), result != -30000) - && (result = abs(result - v22), result <= 1024) ) + && (result = BLV_GetFloorLevel(v6->vPosition.x, v6->vPosition.y, v6->vPosition.z, result, &uFaceID), result != -30000) + && (result = abs(result - pParty->vPosition.z), result <= 1024) ) { if ( v20 == uNumActors ) ++uNumActors; - v6->uSummonerID = PID(OBJECT_Player,v17); - result = v6->pActorBuffs[2].Apply( - pParty->uTimePlayed + (signed __int64)((double)(a3 << 7) * 0.033333335), - v16, - v17, + v6->uSummonerID = PID(OBJECT_Player, a1); + result = v6->pActorBuffs[2].Apply(pParty->uTimePlayed + (a3 * 128) / 30.0f, + a2, + a1, 0, 0); } @@ -5450,9 +5445,9 @@ } //----- (00458244) -------------------------------------------------------- -unsigned int SkillToMastery(unsigned int value) -{ - switch (value & 0x1C0) +int SkillToMastery( unsigned int skill_value ) + { + switch (skill_value & 0x1C0) { case 0x100: return 4; // Grandmaster case 0x80: return 3; // Master @@ -7207,14 +7202,6 @@ if ( wParam == VK_ESCAPE ) { pMessageQueue_50CBD0->AddMessage(UIMSG_Escape, window_SpeakInHouse != 0, 0); - /*if ( (signed int)pMessageQueue_50CBD0->uNumMessages < 40 ) - { - v12 = window_SpeakInHouse == 0; - pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].eType = UIMSG_Escape; - pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].param = !v12; - *(&pMessageQueue_50CBD0->uNumMessages + 3 * pMessageQueue_50CBD0->uNumMessages + 3) = 0; - ++pMessageQueue_50CBD0->uNumMessages; - }*/ return 0; } if ( wParam <= VK_HOME ) @@ -7231,7 +7218,7 @@ SendMessageA(hWnd, WM_COMMAND, v37, v38); return 0; } - if ( pCurrentScreen + if ( pCurrentScreen != SCREEN_GAME && pCurrentScreen != SCREEN_PRESS_ESCAPE_MESSAGE ) return 0; } @@ -9053,7 +9040,7 @@ switch ( uTurnSpeed ) { case 0: // undefined turn option - __debugbreak(); // really shouldn't use this mode + //__debugbreak(); // really shouldn't use this mode uTurnSpeed = (unsigned int)uCPUSpeed < 199 ? 128 : 64; // adjust turn speed to estimated fps break; @@ -9322,7 +9309,7 @@ char test[1024]; sprintfex(test, "^Pi[%s]: ^R[;;]", ""); - + bool bNoMargareth = false; if (pCmdLine && *pCmdLine) { if (wcsstr(pCmdLine, L"-usedefs")) @@ -9349,6 +9336,8 @@ bNoCD = true; if (wcsstr(pCmdLine, L"-new_sky")) new_sky = true; + if (wcsstr(pCmdLine, L"-nomarg")) + bNoMargareth = true; } @@ -9424,6 +9413,9 @@ bFlashQuestBook = true; pGame->pCShow->PlayMovie(MOVIE_Emerald, 0); SaveNewGame(); + + if (bNoMargareth) + _449B7E_toggle_bit(pParty->_quest_bits, PARTY_QUEST_EMERALD_MARGARETH_OFF, 1); pGame->Loop(); if (uGameState == GAME_STATE_NEWGAME_OUT_GAMEMENU) @@ -10604,7 +10596,7 @@ { if ( !v13->GetActorsRelation(0) && !(BYTE2(v13->uAttributes) & 8) && v13->CanAct() ) { - Actor::FaceObject(v12, 4u, 0, 0); + Actor::AI_FaceObject(v12, 4u, 0, 0); if ( v13->sNPC_ID ) { pMessageQueue_50CBD0->AddMessage(UIMSG_StartNPCDialogue, v12, 0); diff -r 28ee6610a3d2 -r d5dae0b4b98a mm7_3.cpp --- a/mm7_3.cpp Fri May 24 10:53:33 2013 +0600 +++ b/mm7_3.cpp Fri May 24 10:53:46 2013 +0600 @@ -1178,7 +1178,7 @@ { if ( v71 == 0 ) { - Actor::Flee(v75, v38, 0, (AIDirection *)0); + Actor::AI_Flee(v75, v38, 0, (AIDirection *)0); } else { @@ -1191,11 +1191,11 @@ } else if ( pActors[v39].pMonsterInfo.uHostilityType == MonsterInfo::Hostility_Friendly ) { - Actor::Flee(v75, v38, 0, (AIDirection *)0); + Actor::AI_Flee(v75, v38, 0, (AIDirection *)0); } else { - Actor::FaceObject(v75, v38, 0, (AIDirection *)0); + Actor::AI_FaceObject(v75, v38, 0, (AIDirection *)0); } } break; @@ -1203,7 +1203,7 @@ if ( !v0->GetActorsRelation(0) ) { v38 = stru_721530.uFaceID; - Actor::FaceObject(v75, v38, 0, (AIDirection *)0); + Actor::AI_FaceObject(v75, v38, 0, (AIDirection *)0); break; } //v52 = HIDWORD(pParty->pPartyBuffs[11].uExpireTime) == 0; @@ -1611,10 +1611,6 @@ } } - for (uint i = 0; i < pIndoor->uNumFaces; ++i) - pIndoor->pFaces[i].uAttributes &= ~FACE_OUTLINED; - pIndoor->pFaces[uFaceID].uAttributes |= FACE_OUTLINED; - blv_prev_party_x = pParty->vPosition.x; blv_prev_party_z = pParty->vPosition.y; blv_prev_party_y = pParty->vPosition.z; @@ -2234,7 +2230,9 @@ v1 = 0; v103 = 0; v2 = 0; - *(float *)&v128 = 0.0; + //*(float *)&v128 = 0.0; + v128 = 0; + v129 = 0; pX = pParty->vPosition.x; pY = pParty->vPosition.y; v113 = pParty->field_6F0; @@ -2652,14 +2650,14 @@ } } -LABEL_123: +//LABEL_123: pParty->sRotationY = _angle_y; pParty->sRotationX = _angle_x; - if ( pZ < v111 ) + if ( pZ < v111 || pParty->bFlying) { if ( pParty->bFlying ) { -LABEL_130: +//LABEL_130: v31 = GetTickCount(); v126 = stru_5C6E00->Cos(v31); v129 = (unsigned __int64)(4i64 * v126) >> 16; @@ -2669,60 +2667,61 @@ if (pParty->FlyActive()) stru_5E4C90._decor_events[20 * pParty->pPartyBuffs[7].uOverlayID + 119] &= 0xFEu; pParty->uFallStartY = pZ; - goto LABEL_141; - } - if ( v130 && v121 ) - sub_42F960_create_object(pX, pY, v111); - v121 = 0; - pZ = v111; - pParty->uFallStartY = v111; - } - if ( pParty->bFlying ) - goto LABEL_130; - v113 = pZ; - if (pParty->FlyActive()) - stru_5E4C90._decor_events[20 * pParty->pPartyBuffs[7].uOverlayID + 119] |= 1u; - -LABEL_141: + //goto LABEL_141; + } + else + { + if ( v130 && v121 ) + sub_42F960_create_object(pX, pY, v111); + v121 = 0; + pZ = v111; + pParty->uFallStartY = v111; + v113 = pZ; + if (pParty->FlyActive()) + stru_5E4C90._decor_events[20 * pParty->pPartyBuffs[7].uOverlayID + 119] |= 1u; + + } + } + else + { + v113 = pZ; + if (pParty->FlyActive()) + stru_5E4C90._decor_events[20 * pParty->pPartyBuffs[7].uOverlayID + 119] |= 1u; + } +//LABEL_141: if (bJumping && !pParty->bFlying) { v33 = -(pEventTimer->uTimeElapsed * GetGravityStrength()); v34 = v121 + 2 * v33; v121 += 2 * v33; - goto LABEL_164; - } - if (!partyAtHighSlope) + } + else if (!partyAtHighSlope) { v34 = v121; - if (!bJumping) - goto LABEL_150; - goto LABEL_164; - } - if (!bJumping) - { - if ( v108 ) - goto LABEL_150; - - // rolling down the hill - // how it's done: you get a little bit pushed in the air along terrain normal, getting in the air - // and falling to the gravity, gradually sliding downwards. nice trick - pZ = v111; - ODM_GetTerrainNormalAt(pX, pY, &v98); - v35 = v121 + -8 * pEventTimer->uTimeElapsed * GetGravityStrength(); - v129 = abs((signed __int64)v2 * v98.x + (signed __int64)v1 * v98.y + (signed __int64)v35 * v98.z) >> 16; - v2 += (unsigned __int64)(v129 * (signed __int64)v98.x) >> 16; - v1 += (unsigned __int64)(v129 * (signed __int64)v98.y) >> 16; - v34 = v35 + ((unsigned __int64)(v129 * (signed __int64)v98.z) >> 16); - v128 = v1; - v121 = v34; - if (!bJumping) - goto LABEL_150; - goto LABEL_164; - } - v34 = v121; - -LABEL_164: - if ( !bUnderwater && v34 <= 0) + } + else if (!bJumping) + { + if ( !v108 ) + { + // rolling down the hill + // how it's done: you get a little bit pushed in the air along terrain normal, getting in the air + // and falling to the gravity, gradually sliding downwards. nice trick + pZ = v111; + ODM_GetTerrainNormalAt(pX, pY, &v98); + v35 = v121 + -8 * pEventTimer->uTimeElapsed * GetGravityStrength(); + v129 = abs((signed __int64)v2 * v98.x + (signed __int64)v1 * v98.y + (signed __int64)v35 * v98.z) >> 16; + v2 += (unsigned __int64)(v129 * (signed __int64)v98.x) >> 16; + v1 += (unsigned __int64)(v129 * (signed __int64)v98.y) >> 16; + v34 = v35 + ((unsigned __int64)(v129 * (signed __int64)v98.z) >> 16); + v128 = v1; + v121 = v34; + } + } + else + v34 = v121; + +//LABEL_164: + if ( !bUnderwater && v34 <= 0 && bJumping) { if ( v34 < -500 && !pParty->bFlying @@ -2739,7 +2738,7 @@ } else { -LABEL_150: +//LABEL_150: pParty->uFallStartY = pZ; } @@ -2805,27 +2804,37 @@ v43 = 1; v44 = 1; if ( bUnderwater || !v107 ) - goto LABEL_197; - if ( v127 && v129 > pZ ) - v44 = 0; - if ( v118 && v119 > pZ ) - v43 = 0; - if ( v44 ) - goto LABEL_197; - if ( v43 ) - goto LABEL_198; - v127 = (BSPModel *)ODM_GetFloorLevel(_angle_x, _angle_y, v40, pParty->uPartyHeight, &v130, &v108, 0); - if ( IsTerrainSlopeTooHigh(_angle_x, _angle_y) && (signed int)v127 <= pZ ) - { - v43 = 1; -LABEL_197: - pX = _angle_x; - if ( !v43 ) - goto LABEL_199; -LABEL_198: - pY = _angle_y; - } -LABEL_199: + { + pX = _angle_x; + if ( v43 ) + pY = _angle_y; + } + else + { + if ( v127 && v129 > pZ ) + v44 = 0; + if ( v118 && v119 > pZ ) + v43 = 0; + if ( v44 ) + { + pX = _angle_x; + if ( v43 ) + pY = _angle_y; + } + else if ( v43 ) + pY = _angle_y; + else + { + v127 = (BSPModel *)ODM_GetFloorLevel(_angle_x, _angle_y, v40, pParty->uPartyHeight, &v130, &v108, 0); + if ( IsTerrainSlopeTooHigh(_angle_x, _angle_y) && (signed int)v127 <= pZ ) + { + v43 = 1; + pX = _angle_x; + if ( v43 ) + pY = _angle_y; + } + } + } if ( stru_721530.field_7C >= stru_721530.field_6C ) { if ( !v107 ) @@ -2847,8 +2856,14 @@ pParty->pPartyBuffs[PARTY_BUFF_INVISIBILITY].Reset(); viewparams->bRedrawGameUI = 1; - goto LABEL_234; - } + v2 = (unsigned __int64)(58500i64 * v2) >> 16; + v127 = (BSPModel *)58500; + v128 = (unsigned __int64)(58500i64 * v128) >> 16; + v122 = (unsigned __int64)(58500i64 * v121) >> 16; + ++v126; + v121 = (unsigned __int64)(58500i64 * v121) >> 16; + continue; + } if ( PID_TYPE(stru_721530.uFaceID) == OBJECT_Decoration) { v56 = integer_sqrt(v2 * v2 + v128 * v128); @@ -2888,15 +2903,26 @@ v53 = v47->uPolygonType; if ( v53 == 3 ) { - if ( v121 < 0 ) - v121 = 0; - pZ = v127->pVertices.pVertices[v47->pVertexIDs[0]].z + 1; - if ( v2 * v2 + v128 * v128 < 400 ) - { - v2 = 0; - *(float *)&v128 = 0.0; - } - goto LABEL_221; + if ( v121 < 0 ) + v121 = 0; + pZ = v127->pVertices.pVertices[v47->pVertexIDs[0]].z + 1; + if ( v2 * v2 + v128 * v128 < 400 ) + { + v2 = 0; + *(float *)&v128 = 0.0; + } + if ( pParty->floor_face_pid != v45 && BYTE3(v47->uAttributes) & 4 ) + { + pParty->floor_face_pid = v45; + v103 = v47->sCogTriggeredID; + } + v2 = (unsigned __int64)(58500i64 * v2) >> 16; + v127 = (BSPModel *)58500; + v128 = (unsigned __int64)(58500i64 * v128) >> 16; + v122 = (unsigned __int64)(58500i64 * v121) >> 16; + ++v126; + v121 = (unsigned __int64)(58500i64 * v121) >> 16; + continue; } if ( !v129 && (v53 != 4 || v119) ) { @@ -2929,15 +2955,20 @@ if ( !v119 ) pZ = v122 + (v47->pFacePlane.vNormal.z * v55 >> 16); } -LABEL_220: - v45 = stru_721530.uFaceID; -LABEL_221: - if ( pParty->floor_face_pid != v45 && BYTE3(v47->uAttributes) & 4 ) - { - pParty->floor_face_pid = v45; - v103 = v47->sCogTriggeredID; - } - goto LABEL_234; +//LABEL_220: + v45 = stru_721530.uFaceID; + if ( pParty->floor_face_pid != v45 && BYTE3(v47->uAttributes) & 4 ) + { + pParty->floor_face_pid = v45; + v103 = v47->sCogTriggeredID; + } + v2 = (unsigned __int64)(58500i64 * v2) >> 16; + v127 = (BSPModel *)58500; + v128 = (unsigned __int64)(58500i64 * v128) >> 16; + v122 = (unsigned __int64)(58500i64 * v121) >> 16; + ++v126; + v121 = (unsigned __int64)(58500i64 * v121) >> 16; + continue; } v118 = abs(v128 * v47->pFacePlane.vNormal.y + v121 * v52 + v2 * v47->pFacePlane.vNormal.x) >> 16; if ( stru_721530.field_64 >> 3 > v118 ) @@ -2952,13 +2983,27 @@ v2 += v122; v128 += (int)v127; if ( v2 * v2 + v128 * v128 >= 400 ) - goto LABEL_220; + { + v45 = stru_721530.uFaceID; + if ( pParty->floor_face_pid != v45 && BYTE3(v47->uAttributes) & 4 ) + { + pParty->floor_face_pid = v45; + v103 = v47->sCogTriggeredID; + } + v2 = (unsigned __int64)(58500i64 * v2) >> 16; + v127 = (BSPModel *)58500; + v128 = (unsigned __int64)(58500i64 * v128) >> 16; + v122 = (unsigned __int64)(58500i64 * v121) >> 16; + ++v126; + v121 = (unsigned __int64)(58500i64 * v121) >> 16; + continue; + } v2 = 0; v121 = 0; *(float *)&v128 = 0.0; } } -LABEL_234: +//LABEL_234: v2 = (unsigned __int64)(58500i64 * v2) >> 16; v127 = (BSPModel *)58500; v128 = (unsigned __int64)(58500i64 * v128) >> 16; @@ -2973,54 +3018,71 @@ v126 = abs(pParty->vPosition.y - pY); v62 = abs(pParty->vPosition.z - pZ); if ( integer_sqrt(v122 * v122 + v126 * v126 + v62 * v62) < 8 ) - goto LABEL_344; - if ( v114 && (!bJumping || v101) ) - { - if ( !v107 - && !(BYTE1(pOutdoor->pBModels[pParty->floor_face_pid >> 9].pFaces[(pParty->floor_face_pid >> 3) & 0x3F].uAttributes) & 0x20) ) - { + { + pAudioPlayer->_4AA258(804); + pParty->walk_sound_timer = 64; + } + else + { + if ( v114 && (!bJumping || v101) ) + { + if ( !v107 + && !(BYTE1(pOutdoor->pBModels[pParty->floor_face_pid >> 9].pFaces[(pParty->floor_face_pid >> 3) & 0x3F].uAttributes) & 0x20) ) + { - v90 = -1; - v89 = 1; - v88 = 804; - v87 = 64; - goto LABEL_257; - } - - v90 = -1; - v89 = 1; - v88 = 804; - v86 = 1; -LABEL_255: - v63 = WorldPosToGridCellZ(pParty->vPosition.y) - 1; - v64 = WorldPosToGridCellX(pParty->vPosition.x); - v87 = pOutdoor->GetSoundIdByPosition(v64, v63, v86); - goto LABEL_257; - } - if ( v124 && (!bJumping || v101) ) - { - if ( v107 - || BYTE1(pOutdoor->pBModels[pParty->floor_face_pid >> 9].pFaces[(pParty->floor_face_pid >> 3) & 0x3F].uAttributes) & 0x20 ) - { + v90 = -1; + v89 = 1; + v88 = 804; + v87 = 64; + pAudioPlayer->PlaySound((SoundID)v87, v88, v89, v90, 0, 0, 0, 0); + } + else + { + v90 = -1; + v89 = 1; + v88 = 804; + v86 = 1; + //LABEL_255: + v63 = WorldPosToGridCellZ(pParty->vPosition.y) - 1; + v64 = WorldPosToGridCellX(pParty->vPosition.x); + v87 = pOutdoor->GetSoundIdByPosition(v64, v63, v86); + pAudioPlayer->PlaySound((SoundID)v87, v88, v89, v90, 0, 0, 0, 0); + } + } + else + { + if ( v124 && (!bJumping || v101) ) + { + if ( v107 + || BYTE1(pOutdoor->pBModels[pParty->floor_face_pid >> 9].pFaces[(pParty->floor_face_pid >> 3) & 0x3F].uAttributes) & 0x20 ) + { - v90 = -1; - v89 = 1; - v88 = 804; - v86 = 0; - goto LABEL_255; - } - v90 = -1; - v89 = 1; - v88 = 804; - v87 = 103; -LABEL_257: - pAudioPlayer->PlaySound((SoundID)v87, v88, v89, v90, 0, 0, 0, 0); - } - else - { -LABEL_344: - pAudioPlayer->_4AA258(804); - pParty->walk_sound_timer = 64; + v90 = -1; + v89 = 1; + v88 = 804; + v86 = 0; + v63 = WorldPosToGridCellZ(pParty->vPosition.y) - 1; + v64 = WorldPosToGridCellX(pParty->vPosition.x); + v87 = pOutdoor->GetSoundIdByPosition(v64, v63, v86); + pAudioPlayer->PlaySound((SoundID)v87, v88, v89, v90, 0, 0, 0, 0); + } + else + { + v90 = -1; + v89 = 1; + v88 = 804; + v87 = 103; + //LABEL_257: + pAudioPlayer->PlaySound((SoundID)v87, v88, v89, v90, 0, 0, 0, 0); + } + } + else + { + //LABEL_344: + pAudioPlayer->_4AA258(804); + pParty->walk_sound_timer = 64; + } + } } } if ( !bJumping || v101 ) @@ -3117,24 +3179,26 @@ if ( v127 ) { v78 = v69 != 0; - goto LABEL_306; - } - v114 = 1; - } - v78 = 1; -LABEL_306: + } + else + { + v114 = 1; + v78 = 1; + } + } + else + v78 = 1; +//LABEL_306: if ( v77 ) { pParty->vPosition.x = pX; - if ( !v78 ) - goto LABEL_313; - goto LABEL_312; } if ( v78 ) { -LABEL_312: pParty->vPosition.y = pY; -LABEL_313: + } + if ( v78 || v77) + { if ( bWaterWalk ) { pParty->uFlags &= ~PARTY_FLAGS_1_STANDING_ON_WATER; @@ -3152,14 +3216,13 @@ } } } - goto LABEL_318; - } - if ( bWalkSound && pParty->walk_sound_timer <= 0 ) + } + else if ( bWalkSound && pParty->walk_sound_timer <= 0 ) { pAudioPlayer->_4AA258(804); pParty->walk_sound_timer = 64; } -LABEL_318: +//LABEL_318: v81 = pZ; v82 = pZ; pParty->vPosition.z = pZ; @@ -11855,11 +11918,9 @@ for (uint i = 0; i < uLevelEVT_NumEvents; ++i) { test_event=(_evt_raw*)&pLevelEVT[pLevelEVT_Index[i].uEventOffsetInEVT]; - if ( test_event->_e_type== EVENT_OnMapLeave ) - { - start_event_seq_number = pLevelEVT_Index[i].event_sequence_num; - EventProcessor(pLevelEVT_Index[i].uEventID, 0, 1); - start_event_seq_number = 0; + if ( test_event->_e_type == EVENT_OnMapLeave ) + { + EventProcessor(pLevelEVT_Index[i].uEventID, 0, 1, pLevelEVT_Index[i].event_sequence_num); } } } @@ -11909,11 +11970,9 @@ } else if (_evt->_e_type == EVENT_OnMapReload) { - start_event_seq_number = pEvent.event_sequence_num; - EventProcessor(pEvent.uEventID, 0, 0); - start_event_seq_number = 0; + EventProcessor(pEvent.uEventID, 0, 0, pEvent.event_sequence_num); } - else if (_evt->_e_type == EVENT_OnTimer || _evt->_e_type == EVENT_OnLongTimer) + else if (_evt->_e_type == EVENT_OnTimer || _evt->_e_type == EVENT_Initialize) { v3 = &array_5B5928_timers[dword_5B65C8_timers_count]; v20 = pOutdoor->loc_time.uLastVisitDay; @@ -11936,7 +11995,7 @@ v3->time_left_to_fire = ((unsigned short)_evt->v12 << 8) + _evt->v11; v3->fire_interval = ((unsigned short)_evt->v12 << 8) + _evt->v11; - if (v3->timer_evt_type == EVENT_OnLongTimer && !(short)v6 ) + if (v3->timer_evt_type == EVENT_Initialize && !(short)v6 ) { if ( v20 ) v18 = pParty->uTimePlayed - v20; @@ -12157,8 +12216,7 @@ { if ( pParty->uFlags & 2 ) pGame->Draw(); - if ( !start_event_seq_number ) - pAudioPlayer->StopChannels(-1, -1); + pAudioPlayer->StopChannels(-1, -1); pMiscTimer->Pause(); pEventTimer->Pause(); dword_5C3418 = v4; @@ -12178,9 +12236,7 @@ pGUIWindow2->Release(); pGUIWindow2 = 0; activeLevelDecoration = _591094_decoration; - start_event_seq_number = dword_5C341C; - EventProcessor(dword_5C3418, 0, 1); - start_event_seq_number = 0; + EventProcessor(dword_5C3418, 0, 1, dword_5C341C); activeLevelDecoration = NULL; pEventTimer->Resume(); } @@ -12381,7 +12437,7 @@ } //----- (004466C4) -------------------------------------------------------- -int NPC_EventProcessor( int npc_event_id ) +int NPC_EventProcessor(int npc_event_id, int entry_line) { signed int event_index; // ebp@1 int evt_seq_num; // esi@3 @@ -12392,7 +12448,7 @@ event_index = 0; if ( !npc_event_id ) return 0; - evt_seq_num = start_event_seq_number; + evt_seq_num = entry_line; pSomeOtherEVT = pGlobalEVT; uSomeOtherEVT_NumEvents = uGlobalEVT_NumEvents; memcpy(pSomeOtherEVT_Events, pGlobalEVT_Index, sizeof(EventIndex)*4400); @@ -12842,11 +12898,7 @@ else { timer->time_left_to_fire = timer->fire_interval; - - start_event_seq_number = timer->timer_evt_seq_num; - EventProcessor(timer->timer_evt_ID, 0, 1); - - start_event_seq_number = 0; + EventProcessor(timer->timer_evt_ID, 0, 1, timer->timer_evt_seq_num); } } else @@ -12862,13 +12914,10 @@ next_trigger_time = 7 * 60 * 60 * 24; // 1 week timer->next_fire_time += (next_trigger_time * 128) / 3.0f; - if (timer->next_fire_time < pParty->uTimePlayed) // make sure in wont fire several times in a row is big time interval has lapsed + if (timer->next_fire_time < pParty->uTimePlayed) // make sure in wont fire several times in a row if big time interval has lapsed timer->next_fire_time = pParty->uTimePlayed; - start_event_seq_number = timer->timer_evt_seq_num; - EventProcessor(timer->timer_evt_ID, 0, 1); - - start_event_seq_number = 0; + EventProcessor(timer->timer_evt_ID, 0, 1, timer->timer_evt_seq_num); } } } @@ -14403,15 +14452,15 @@ { //unsigned int v0; // esi@4 int v1; // eax@7 - int v2; // ecx@7 - int v3; // eax@7 + //int v2; // ecx@7 + //int v3; // eax@7 signed int v4; // edi@10 Actor *v5; // esi@12 - signed int v6; // eax@14 + signed int sDmg; // eax@14 __int16 v7; // cx@14 - Player **v8; // esi@20 + //Player **v8; // esi@20 Player *pPlayer; // ecx@21 - //Actor *pActor; // esi@34 + Actor *pActor; // esi@34 //__int16 v11; // ax@34 //unsigned int v12; // eax@47 //signed int v13; // edi@47 @@ -14422,7 +14471,7 @@ //unsigned int v18; // ecx@67 //unsigned __int16 v19; // ax@72 //int *v20; // esi@80 - Actor *v21; // ebx@80 + //Actor *v21; // ebx@80 unsigned __int16 v22; // ax@86 //signed int v23; // eax@94 //unsigned int v24; // eax@102 @@ -14505,58 +14554,48 @@ else { pParty->sRotationY = (stru_5C6E00->uIntegerDoublePi - 1) & (pParty->sRotationY + rand() % 16 - 8); - v1 = rand(); - v2 = 128; - v3 = pParty->sRotationX + v1 % 16 - 8; - pParty->sRotationX = v3; - if ( v3 > 128 || (v2 = -128, v3 < -128) ) - pParty->sRotationX = v2; + pParty->sRotationX = pParty->sRotationX + rand() % 16 - 8; + if ( pParty->sRotationX > 128) + pParty->sRotationX = 128; + else if ( pParty->sRotationX < -128 ) + pParty->sRotationX = -128; + pParty->uFlags |= 2u; pParty->armageddon_timer -= pMiscTimer->uTimeElapsed; v4 = pParty->field_16140 + 50; if ( pParty->armageddon_timer <= 0 ) { pParty->armageddon_timer = 0; - v84 = 0; - if ( (signed int)uNumActors > 0 ) + for(int i = 0; i < uNumActors; i++) { - v5 = pActors;//[0].sCurrentHP; - do + pActor=&pActors[i]; + if ( pActor->CanAct() ) { - if ( v5->CanAct() ) + sDmg = stru_50C198.CalcMagicalDamageToActor(pActor, 5, v4); + pActor->sCurrentHP -= stru_50C198.CalcMagicalDamageToActor(pActor, 5, v4); + if ( sDmg ) { - v6 = stru_50C198.CalcMagicalDamageToActor(v5, 5, v4); - v7 = v5->sCurrentHP - v6; - v5->sCurrentHP = v7; - if ( v6 ) + if ( pActor->sCurrentHP >= 0 ) { - if ( v7 >= 0 ) - { - Actor::Stun(v84, 4, 0); - } - else - { - Actor::Die(v84); - if ( v5->pMonsterInfo.uExp ) - GivePartyExp(pMonsterStats->pInfos[v5->pMonsterInfo.uID].uExp); - } + Actor::AI_Stun(i, 4, 0); + } + else + { + Actor::Die(i); + if ( pActor->pMonsterInfo.uExp ) + GivePartyExp(pMonsterStats->pInfos[pActor->pMonsterInfo.uID].uExp); } } - ++v84; - ++v5; } - while ( (signed int)v84 < (signed int)uNumActors ); + ++v84; + ++v5; } - v8 = &pPlayers[1]; - do + for(int i = 1; i <= 4; i++) { - pPlayer = *v8; - if ( !(*v8)->pConditions[14] && !pPlayer->pConditions[15] && !pPlayer->pConditions[16] ) + pPlayer = pPlayers[i]; + if ( !pPlayer->pConditions[14] && !pPlayer->pConditions[15] && !pPlayer->pConditions[16] ) pPlayer->ReceiveDamage(v4, DMGT_5); - ++v8; } - while ( (signed int)v8 <= (signed int)&pPlayers[4] ); - //v0 = 0; } if (pTurnEngine->field_1C) --pTurnEngine->field_1C; @@ -14573,7 +14612,7 @@ //uActorID = v0; for (uint i = 0; i < uNumActors; ++i) { - auto actor = pActors + i; + pActor = &pActors[i]; //LODWORD(v80) = (int)(char *)pActors + 176; // uAIState //do //{ @@ -14581,10 +14620,10 @@ //v11 = *(unsigned int *)LODWORD(v80); //v49 = *(unsigned int *)LODWORD(v80) == 5; ai_near_actors_targets_pid[i] = OBJECT_Player; - if (actor->uAIState == Dead || actor->uAIState == Removed || actor->uAIState == Disabled || actor->uAttributes & 0x0400) + if (pActor->uAIState == Dead || pActor->uAIState == Removed || pActor->uAIState == Disabled || pActor->uAttributes & 0x0400) continue; - if (!actor->sCurrentHP && actor->uAIState != Dying) + if (!pActor->sCurrentHP && pActor->uAIState != Dying) Actor::Die(i); //v84 = *(_QWORD *)(LODWORD(v80) + 84) <= 0i64 ? 0 : 1; @@ -14595,7 +14634,7 @@ for (uint j = 0; j < 22; ++j) { if (j != 10) - actor->pActorBuffs[j]._4585CA(pParty->uTimePlayed); + pActor->pActorBuffs[j]._4585CA(pParty->uTimePlayed); } /*do { @@ -14608,52 +14647,52 @@ ++v14; } while ( v13 < 22 );*/ - if ( (signed __int64)actor->pActorBuffs[ACTOR_BUFF_SHRINK].uExpireTime < 0 ) + if ( (signed __int64)pActor->pActorBuffs[ACTOR_BUFF_SHRINK].uExpireTime < 0 ) //&& SHIDWORD(pActor->pActorBuffs[3].uExpireTime) <= (signed int)v12 && (SHIDWORD(pActor->pActorBuffs[3].uExpireTime) < (signed int)v12 // || LODWORD(pActor->pActorBuffs[3].uExpireTime) <= v12) ) - actor->uActorHeight = pMonsterList->pMonsters[actor->pMonsterInfo.uID - 1].uMonsterHeight; - if ( (signed __int64)actor->pActorBuffs[ACTOR_BUFF_CHARM].uExpireTime > 0 ) - actor->pMonsterInfo.uHostilityType = MonsterInfo::Hostility_Friendly; + pActor->uActorHeight = pMonsterList->pMonsters[pActor->pMonsterInfo.uID - 1].uMonsterHeight; + if ( (signed __int64)pActor->pActorBuffs[ACTOR_BUFF_CHARM].uExpireTime > 0 ) + pActor->pMonsterInfo.uHostilityType = MonsterInfo::Hostility_Friendly; // not sure - else if ( (signed __int64)actor->pActorBuffs[ACTOR_BUFF_CHARM].uExpireTime < 0 ) - actor->pMonsterInfo.uHostilityType = pMonsterStats->pInfos[actor->pMonsterInfo.uID].uHostilityType; + else if ( (signed __int64)pActor->pActorBuffs[ACTOR_BUFF_CHARM].uExpireTime < 0 ) + pActor->pMonsterInfo.uHostilityType = pMonsterStats->pInfos[pActor->pMonsterInfo.uID].uHostilityType; - if ((signed __int64)actor->pActorBuffs[ACTOR_BUFF_PARALYZED].uExpireTime > 0 - || (signed __int64)actor->pActorBuffs[ACTOR_BUFF_STONED].uExpireTime > 0) + if ((signed __int64)pActor->pActorBuffs[ACTOR_BUFF_PARALYZED].uExpireTime > 0 + || (signed __int64)pActor->pActorBuffs[ACTOR_BUFF_STONED].uExpireTime > 0) continue; //v15 = pMiscTimer->uTimeElapsed; //v16 = (char *)&pActor->pMonsterInfo.uRecoveryTime; //v17 = pActor->uCurrentActionTime; //v18 = pActor->pMonsterInfo.uRecoveryTime; - if (actor->pMonsterInfo.uRecoveryTime) + if (pActor->pMonsterInfo.uRecoveryTime) { - if (actor->pMonsterInfo.uRecoveryTime < pMiscTimer->uTimeElapsed) - actor->pMonsterInfo.uRecoveryTime = 0; + if (pActor->pMonsterInfo.uRecoveryTime < pMiscTimer->uTimeElapsed) + pActor->pMonsterInfo.uRecoveryTime = 0; else - actor->pMonsterInfo.uRecoveryTime -= pMiscTimer->uTimeElapsed; + pActor->pMonsterInfo.uRecoveryTime -= pMiscTimer->uTimeElapsed; } - actor->uCurrentActionTime += pMiscTimer->uTimeElapsed; - if (actor->uCurrentActionTime < actor->uCurrentActionLength) + pActor->uCurrentActionTime += pMiscTimer->uTimeElapsed; + if (pActor->uCurrentActionTime < pActor->uCurrentActionLength) continue; //v19 = actor->uAIState; - if (actor->uAIState == Dying) - actor->uAIState = Dead; + if (pActor->uAIState == Dying) + pActor->uAIState = Dead; else { - if (actor->uAIState != Summoned) + if (pActor->uAIState != Summoned) { Actor::AI_StandOrBored(i, OBJECT_Player, 256, nullptr); continue; } - actor->uAIState = Standing; + pActor->uAIState = Standing; } - actor->uCurrentActionTime = 0; - actor->uCurrentActionLength = 0; - actor->UpdateAnimation(); + pActor->uCurrentActionTime = 0; + pActor->uCurrentActionLength = 0; + pActor->UpdateAnimation(); //LABEL_78: //++uActorID; //LODWORD(v80) += 836; @@ -14673,61 +14712,61 @@ assert(actor_id < uNumActors); //v20 = &ai_near_actors_targets_pid[actor_id]; - v21 = &pActors[actor_id]; + pActor = &pActors[actor_id]; Actor::_SelectTarget(actor_id, &ai_near_actors_targets_pid[actor_id], true); - if (v21->pMonsterInfo.uHostilityType && !ai_near_actors_targets_pid[actor_id]) - v21->pMonsterInfo.uHostilityType = MonsterInfo::Hostility_Friendly; + if (pActor->pMonsterInfo.uHostilityType && !ai_near_actors_targets_pid[actor_id]) + pActor->pMonsterInfo.uHostilityType = MonsterInfo::Hostility_Friendly; target_pid = ai_near_actors_targets_pid[actor_id]; target_pid_type = PID_TYPE(target_pid); if ( target_pid_type == OBJECT_Actor) v80 = 0.5; else v80 = 1.0; - v22 = v21->uAIState; + v22 = pActor->uAIState; if ( v22 == Dying || v22 == Dead || v22 == Removed || v22 == Disabled || v22 == Summoned) { continue; } - if ( !v21->sCurrentHP ) + if ( !pActor->sCurrentHP ) Actor::Die(actor_id); for(int i=0;i<22;i++) { if ( i != 10 ) { - v21->pActorBuffs[i]._4585CA(pParty->uTimePlayed); + pActor->pActorBuffs[i]._4585CA(pParty->uTimePlayed); } } - if ( (signed __int64)v21->pActorBuffs[ACTOR_BUFF_SHRINK].uExpireTime < 0 ) - v21->uActorHeight = pMonsterList->pMonsters[v21->pMonsterInfo.uID - 1].uMonsterHeight; - if ( (signed __int64)v21->pActorBuffs[ACTOR_BUFF_CHARM].uExpireTime > 0 ) - v21->pMonsterInfo.uHostilityType = MonsterInfo::Hostility_Friendly; + if ( (signed __int64)pActor->pActorBuffs[ACTOR_BUFF_SHRINK].uExpireTime < 0 ) + pActor->uActorHeight = pMonsterList->pMonsters[pActor->pMonsterInfo.uID - 1].uMonsterHeight; + if ( (signed __int64)pActor->pActorBuffs[ACTOR_BUFF_CHARM].uExpireTime > 0 ) + pActor->pMonsterInfo.uHostilityType = MonsterInfo::Hostility_Friendly; // not sure - else if ( (signed __int64)v21->pActorBuffs[ACTOR_BUFF_CHARM].uExpireTime < 0 ) - v21->pMonsterInfo.uHostilityType = pMonsterStats->pInfos[v21->pMonsterInfo.uID].uHostilityType; - if ( (signed __int64)v21->pActorBuffs[2].uExpireTime < 0 ) + else if ( (signed __int64)pActor->pActorBuffs[ACTOR_BUFF_CHARM].uExpireTime < 0 ) + pActor->pMonsterInfo.uHostilityType = pMonsterStats->pInfos[pActor->pMonsterInfo.uID].uHostilityType; + if ( (signed __int64)pActor->pActorBuffs[2].uExpireTime < 0 ) { - v21->uAIState = Removed; + pActor->uAIState = Removed; continue; } - if ( (signed __int64)v21->pActorBuffs[5].uExpireTime > 0 - || (signed __int64)v21->pActorBuffs[6].uExpireTime > 0) + if ( (signed __int64)pActor->pActorBuffs[5].uExpireTime > 0 + || (signed __int64)pActor->pActorBuffs[6].uExpireTime > 0) { continue; } v27 = pMiscTimer->uTimeElapsed; - v28 = v21->pMonsterInfo.uRecoveryTime; - v21->uCurrentActionTime += pMiscTimer->uTimeElapsed; + v28 = pActor->pMonsterInfo.uRecoveryTime; + pActor->uCurrentActionTime += pMiscTimer->uTimeElapsed; if ( (signed int)v28 > 0 ) - v21->pMonsterInfo.uRecoveryTime = v28 - v27; - if ( v21->pMonsterInfo.uRecoveryTime < 0 ) - v21->pMonsterInfo.uRecoveryTime = 0; - if ( !(v21->uAttributes & 0x8000) ) - v21->uAttributes |= 0x8000; + pActor->pMonsterInfo.uRecoveryTime = v28 - v27; + if ( pActor->pMonsterInfo.uRecoveryTime < 0 ) + pActor->pMonsterInfo.uRecoveryTime = 0; + if ( !(pActor->uAttributes & 0x8000) ) + pActor->uAttributes |= 0x8000; a1 = PID(OBJECT_Actor,actor_id); v30 = Actor::GetDirectionInfo(PID(OBJECT_Actor,actor_id), target_pid, &a3, 0); memcpy(&v75, v30, sizeof(v75)); memcpy(&pDir, &v75, sizeof(pDir)); - uAIState = v21->uAIState; + uAIState = pActor->uAIState; /*if ( v21->pMonsterInfo.uHostilityType != MonsterInfo::Hostility_Friendly && (signed int)v21->pMonsterInfo.uRecoveryTime <= 0 && v80 * 307.2 >= (double)(signed int)v75.uDistance @@ -14738,60 +14777,60 @@ } else */ - if ( v21->pMonsterInfo.uHostilityType == MonsterInfo::Hostility_Friendly - || (signed int)v21->pMonsterInfo.uRecoveryTime > 0 + if ( pActor->pMonsterInfo.uHostilityType == MonsterInfo::Hostility_Friendly + || (signed int)pActor->pMonsterInfo.uRecoveryTime > 0 || v80 * 307.2 < (double)(signed int)v75.uDistance || uAIState != Pursuing && uAIState != Standing && uAIState != Tethered && uAIState != Fidgeting - && !v21->pMonsterInfo.uMissleAttack1Type || uAIState != Stunned ) + && !pActor->pMonsterInfo.uMissleAttack1Type || uAIState != Stunned ) { - if ( (signed int)v21->uCurrentActionTime < v21->uCurrentActionLength ) + if ( (signed int)pActor->uCurrentActionTime < pActor->uCurrentActionLength ) { continue; } - else if ( v21->uAIState == AttackingMelee ) + else if ( pActor->uAIState == AttackingMelee ) { - v35 = stru_50C198.special_ability_use_check(v21, actor_id); + v35 = stru_50C198.special_ability_use_check(pActor, actor_id); stru_50FE08.Add( a1, 5120, - v21->vPosition.x, - v21->vPosition.y, - v21->vPosition.z + ((signed int)v21->uActorHeight >> 1), + pActor->vPosition.x, + pActor->vPosition.y, + pActor->vPosition.z + ((signed int)pActor->uActorHeight >> 1), v35, 1 ); } - else if ( v21->uAIState == AttackingRanged1 ) + else if ( pActor->uAIState == AttackingRanged1 ) { - v34 = v21->pMonsterInfo.uMissleAttack1Type; - Actor::RangedAttack(actor_id, &pDir, v34, 0); + v34 = pActor->pMonsterInfo.uMissleAttack1Type; + Actor::AI_RangedAttack(actor_id, &pDir, v34, 0); } - else if ( v21->uAIState == AttackingRanged2 ) + else if ( pActor->uAIState == AttackingRanged2 ) { - v34 = v21->pMonsterInfo.uMissleAttack2Type; - Actor::RangedAttack(actor_id, &pDir, v34, 1); + v34 = pActor->pMonsterInfo.uMissleAttack2Type; + Actor::AI_RangedAttack(actor_id, &pDir, v34, 1); } - else if ( v21->uAIState == AttackingRanged3 ) + else if ( pActor->uAIState == AttackingRanged3 ) { - v65 = v21->pMonsterInfo.uSpellSkillAndMastery1; - v33 = v21->pMonsterInfo.uSpell1ID; - Actor::SpellAttack(actor_id, &pDir, v33, 2, v65); + v65 = pActor->pMonsterInfo.uSpellSkillAndMastery1; + v33 = pActor->pMonsterInfo.uSpell1ID; + Actor::AI_SpellAttack(actor_id, &pDir, v33, 2, v65); } - else if ( v21->uAIState == AttackingRanged4 ) + else if ( pActor->uAIState == AttackingRanged4 ) { - v65 = v21->pMonsterInfo.uSpellSkillAndMastery2; - v33 = v21->pMonsterInfo.uSpell2ID; - Actor::SpellAttack(actor_id, &pDir, v33, 3, v65); + v65 = pActor->pMonsterInfo.uSpellSkillAndMastery2; + v33 = pActor->pMonsterInfo.uSpell2ID; + Actor::AI_SpellAttack(actor_id, &pDir, v33, 3, v65); } } v36 = v75.uDistance; - if ( v21->pMonsterInfo.uHostilityType == MonsterInfo::Hostility_Friendly) + if ( pActor->pMonsterInfo.uHostilityType == MonsterInfo::Hostility_Friendly) { if ( target_pid_type == OBJECT_Actor ) { v36 = v75.uDistance; - v37 = (unsigned __int8)*(&byte_5C8D1A[89 * (v21->pMonsterInfo.uID - 1) / 3] + v37 = (unsigned __int8)*(&byte_5C8D1A[89 * (pActor->pMonsterInfo.uID - 1) / 3] + (pActors[PID_ID(target_pid)].pMonsterInfo.uID - 1) / 3); } else @@ -14818,85 +14857,85 @@ v38 = 5120; } if ( v37 >= 1 && v37 <= 4 && v36 < v38 || v37 == 1 ) - v21->pMonsterInfo.uHostilityType = MonsterInfo::Hostility_Long; + pActor->pMonsterInfo.uHostilityType = MonsterInfo::Hostility_Long; } - if ( (signed __int64)v21->pActorBuffs[4].uExpireTime > 0 ) + if ( (signed __int64)pActor->pActorBuffs[4].uExpireTime > 0 ) { if ( (signed int)v36 >= 10240 ) { - Actor::_4032B2(actor_id, target_pid, 1024, 0); + Actor::AI_4032B2(actor_id, target_pid, 1024, 0); } else { //peasents after attacked //guard after attacked - Actor::Flee(actor_id, target_pid, 0, &pDir); + Actor::AI_Flee(actor_id, target_pid, 0, &pDir); } continue; } - if ( v21->pMonsterInfo.uHostilityType == MonsterInfo::Hostility_Long && target_pid ) + if ( pActor->pMonsterInfo.uHostilityType == MonsterInfo::Hostility_Long && target_pid ) { - if ( v21->pMonsterInfo.uAIType == 1 ) + if ( pActor->pMonsterInfo.uAIType == 1 ) { - if ( v21->pMonsterInfo.uMovementType == 5 ) + if ( pActor->pMonsterInfo.uMovementType == 5 ) { - Actor::AI_Stand(actor_id, target_pid, (signed __int64)((double)(signed int)v21->pMonsterInfo.uRecoveryTime * 2.133333333333333), &pDir); + Actor::AI_Stand(actor_id, target_pid, (signed __int64)((double)(signed int)pActor->pMonsterInfo.uRecoveryTime * 2.133333333333333), &pDir); } else { - Actor::Flee(actor_id, target_pid, 0, &pDir); + Actor::AI_Flee(actor_id, target_pid, 0, &pDir); continue; } } - if ( !(v21->uAttributes & 0x020000) ) + if ( !(pActor->uAttributes & 0x020000) ) { - if ( v21->pMonsterInfo.uAIType == 2 || v21->pMonsterInfo.uAIType == 3) + if ( pActor->pMonsterInfo.uAIType == 2 || pActor->pMonsterInfo.uAIType == 3) { - if ( v21->pMonsterInfo.uAIType == 2 ) - v43 = (double)(signed int)v21->pMonsterInfo.uHP * 0.2; - if ( v21->pMonsterInfo.uAIType == 3 ) - v43 = (double)(signed int)v21->pMonsterInfo.uHP * 0.1; - v84 = v21->sCurrentHP; + if ( pActor->pMonsterInfo.uAIType == 2 ) + v43 = (double)(signed int)pActor->pMonsterInfo.uHP * 0.2; + if ( pActor->pMonsterInfo.uAIType == 3 ) + v43 = (double)(signed int)pActor->pMonsterInfo.uHP * 0.1; + v84 = pActor->sCurrentHP; v42 = (double)(signed int)v84; if ( v43 > v42 && (signed int)v36 < 10240 ) { - Actor::Flee(actor_id, target_pid, 0, &pDir); + Actor::AI_Flee(actor_id, target_pid, 0, &pDir); continue; } } } - v81 = v36 - v21->uActorRadius; + v81 = v36 - pActor->uActorRadius; if ( target_pid_type == OBJECT_Actor ) v81 -= pActors[PID_ID(target_pid)].uActorRadius; if ( v81 < 0 ) v81 = 0; rand(); - v21->uAttributes &= 0xFBFFFF; + pActor->uAttributes &= 0xFFFBFFFF; if ( v81 < 5120 ) { - v45 = stru_50C198.special_ability_use_check(v21, actor_id); + v45 = stru_50C198.special_ability_use_check(pActor, actor_id); if ( v45 == 0 ) { - if ( v21->pMonsterInfo.uMissleAttack1Type ) + if ( pActor->pMonsterInfo.uMissleAttack1Type ) { - if ( (signed int)v21->pMonsterInfo.uRecoveryTime <= 0 ) + if ( (signed int)pActor->pMonsterInfo.uRecoveryTime <= 0 ) { - Actor::MissileAttack1(actor_id, target_pid, &pDir); + Actor::AI_MissileAttack1(actor_id, target_pid, &pDir); } - else if ( v21->pMonsterInfo.uMovementType == 5 ) + else if ( pActor->pMonsterInfo.uMovementType == 5 ) { - v47 = (double)(signed int)v21->pMonsterInfo.uRecoveryTime * 2.133333333333333; + v47 = (double)(signed int)pActor->pMonsterInfo.uRecoveryTime * 2.133333333333333; v64 = (signed __int64)v47; Actor::AI_Stand(actor_id, target_pid, v64, &pDir); } else { - v47 = (double)(signed int)v21->pMonsterInfo.uRecoveryTime * 2.133333333333333; + v47 = (double)(signed int)pActor->pMonsterInfo.uRecoveryTime * 2.133333333333333; if ( v80 * 307.2 > (double)v81 ) { v64 = (signed __int64)v47; @@ -14904,7 +14943,7 @@ } else { - Actor::Pursue1(actor_id, target_pid, actor_id, (signed __int64)v47, &pDir); + Actor::AI_Pursue1(actor_id, target_pid, actor_id, (signed __int64)v47, &pDir); } } } @@ -14914,21 +14953,21 @@ { if ( v81 >= 1024 ) { - if ( v21->pMonsterInfo.uMovementType == 5 ) + if ( pActor->pMonsterInfo.uMovementType == 5 ) { - v47 = (double)(signed int)v21->pMonsterInfo.uRecoveryTime * 2.133333333333333; + v47 = (double)(signed int)pActor->pMonsterInfo.uRecoveryTime * 2.133333333333333; v64 = (signed __int64)v47; Actor::AI_Stand(actor_id, target_pid, v64, &pDir); } else { //monsters - Actor::Pursue3(actor_id, target_pid, 0, &pDir); + Actor::AI_Pursue3(actor_id, target_pid, 0, &pDir); } } - else if ( v21->pMonsterInfo.uMovementType == 5 ) + else if ( pActor->pMonsterInfo.uMovementType == 5 ) { - v47 = (double)(signed int)v21->pMonsterInfo.uRecoveryTime * 2.133333333333333; + v47 = (double)(signed int)pActor->pMonsterInfo.uRecoveryTime * 2.133333333333333; v64 = (signed __int64)v47; Actor::AI_Stand(actor_id, target_pid, v64, &pDir); } @@ -14938,19 +14977,19 @@ //monsters //guard after player runs away // follow player - Actor::Pursue2(actor_id, target_pid, 0, &pDir, v70); + Actor::AI_Pursue2(actor_id, target_pid, 0, &pDir, v70); } } - else if ( (signed int)v21->pMonsterInfo.uRecoveryTime > 0 ) + else if ( (signed int)pActor->pMonsterInfo.uRecoveryTime > 0 ) { - v47 = (double)(signed int)v21->pMonsterInfo.uRecoveryTime * 2.133333333333333; + v47 = (double)(signed int)pActor->pMonsterInfo.uRecoveryTime * 2.133333333333333; v64 = (signed __int64)v47; Actor::AI_Stand(actor_id, target_pid, v64, &pDir); } else { //monsters - Actor::MeleeAttack(actor_id, target_pid, &pDir); + Actor::AI_MeleeAttack(actor_id, target_pid, &pDir); } } continue; @@ -14958,28 +14997,28 @@ else if ( v45 == 2 || v45 == 3 ) { if ( v45 == 2 ) - v46 = v21->pMonsterInfo.uSpell1ID; + v46 = pActor->pMonsterInfo.uSpell1ID; else - v46 = v21->pMonsterInfo.uSpell2ID; + v46 = pActor->pMonsterInfo.uSpell2ID; if ( v46 ) { - if ( (signed int)v21->pMonsterInfo.uRecoveryTime <= 0 ) + if ( (signed int)pActor->pMonsterInfo.uRecoveryTime <= 0 ) { if ( v45 == 2 ) - Actor::SpellAttack1(actor_id, target_pid, &pDir); + Actor::AI_SpellAttack1(actor_id, target_pid, &pDir); else - Actor::SpellAttack2(actor_id, target_pid, &pDir); + Actor::AI_SpellAttack2(actor_id, target_pid, &pDir); } - else if ( v80 * 307.2 > (double)v81 || v21->pMonsterInfo.uMovementType == 5 ) + else if ( v80 * 307.2 > (double)v81 || pActor->pMonsterInfo.uMovementType == 5 ) { - v47 = (double)(signed int)v21->pMonsterInfo.uRecoveryTime * 2.133333333333333; + v47 = (double)(signed int)pActor->pMonsterInfo.uRecoveryTime * 2.133333333333333; v64 = (signed __int64)v47; Actor::AI_Stand(actor_id, target_pid, v64, &pDir); } else { - v47 = (double)(signed int)v21->pMonsterInfo.uRecoveryTime * 2.133333333333333; - Actor::Pursue1(actor_id, target_pid, actor_id, (signed __int64)v47, &pDir); + v47 = (double)(signed int)pActor->pMonsterInfo.uRecoveryTime * 2.133333333333333; + Actor::AI_Pursue1(actor_id, target_pid, actor_id, (signed __int64)v47, &pDir); } } else @@ -14988,130 +15027,130 @@ { if ( v81 >= 1024 ) { - if ( v21->pMonsterInfo.uMovementType == 5 ) + if ( pActor->pMonsterInfo.uMovementType == 5 ) { - v47 = (double)(signed int)v21->pMonsterInfo.uRecoveryTime * 2.133333333333333; + v47 = (double)(signed int)pActor->pMonsterInfo.uRecoveryTime * 2.133333333333333; v64 = (signed __int64)v47; Actor::AI_Stand(actor_id, target_pid, v64, &pDir); } else { - Actor::Pursue3(actor_id, target_pid, 256, &pDir); + Actor::AI_Pursue3(actor_id, target_pid, 256, &pDir); } } - else if ( v21->pMonsterInfo.uMovementType == 5 ) + else if ( pActor->pMonsterInfo.uMovementType == 5 ) { - v47 = (double)(signed int)v21->pMonsterInfo.uRecoveryTime * 2.133333333333333; + v47 = (double)(signed int)pActor->pMonsterInfo.uRecoveryTime * 2.133333333333333; v64 = (signed __int64)v47; Actor::AI_Stand(actor_id, target_pid, v64, &pDir); } else { v70 = (signed __int64)v80 * 307.2; - Actor::Pursue2(actor_id, target_pid, 0, &pDir, v70); + Actor::AI_Pursue2(actor_id, target_pid, 0, &pDir, v70); } } - else if ( (signed int)v21->pMonsterInfo.uRecoveryTime > 0 ) + else if ( (signed int)pActor->pMonsterInfo.uRecoveryTime > 0 ) { - v47 = (double)(signed int)v21->pMonsterInfo.uRecoveryTime * 2.133333333333333; + v47 = (double)(signed int)pActor->pMonsterInfo.uRecoveryTime * 2.133333333333333; v64 = (signed __int64)v47; Actor::AI_Stand(actor_id, target_pid, v64, &pDir); } else { - Actor::MeleeAttack(actor_id, target_pid, &pDir); + Actor::AI_MeleeAttack(actor_id, target_pid, &pDir); } } continue; } } } - - if ( v21->pMonsterInfo.uHostilityType != MonsterInfo::Hostility_Long || !target_pid || v81 >= 5120 || v45 != 1 ) + + if ( pActor->pMonsterInfo.uHostilityType != MonsterInfo::Hostility_Long || !target_pid || v81 >= 5120 || v45 != 1 ) { - if ( !v21->pMonsterInfo.uMovementType ) + if ( !pActor->pMonsterInfo.uMovementType ) { - Actor::_4032B2(actor_id, 4, 1024, 0); + Actor::AI_4032B2(actor_id, 4, 1024, 0); } - else if ( v21->pMonsterInfo.uMovementType == 1 ) + else if ( pActor->pMonsterInfo.uMovementType == 1 ) { - Actor::_4032B2(actor_id, 4, 2560, 0); + Actor::AI_4032B2(actor_id, 4, 2560, 0); } - else if ( v21->pMonsterInfo.uMovementType == 2 ) + else if ( pActor->pMonsterInfo.uMovementType == 2 ) { - Actor::_4032B2(actor_id, 4, 5120, 0); + Actor::AI_4032B2(actor_id, 4, 5120, 0); } - else if ( v21->pMonsterInfo.uMovementType == 4 ) + else if ( pActor->pMonsterInfo.uMovementType == 4 ) { - Actor::_4032B2(actor_id, 4, 10240, 0); + Actor::AI_4032B2(actor_id, 4, 10240, 0); } - else if ( v21->pMonsterInfo.uMovementType == 5 ) + else if ( pActor->pMonsterInfo.uMovementType == 5 ) { v57 = Actor::GetDirectionInfo(a1, 4u, &v72, 0); - v58 = (double)(signed int)v21->pMonsterInfo.uRecoveryTime * 2.133333333333333; + v58 = (double)(signed int)pActor->pMonsterInfo.uRecoveryTime * 2.133333333333333; memcpy(&v74, v57, sizeof(v74)); memcpy(&pDir, &v74, sizeof(pDir)); v64 = (signed __int64)v58; Actor::AI_Stand(actor_id, 4, v64, &pDir); } } - else if ( !v21->pMonsterInfo.uMissleAttack2Type ) + else if ( !pActor->pMonsterInfo.uMissleAttack2Type ) { if ( (double)v81 >= v80 * 307.2 ) { if ( v81 >= 1024 ) { - if ( v21->pMonsterInfo.uMovementType == 5 ) + if ( pActor->pMonsterInfo.uMovementType == 5 ) { - v47 = (double)(signed int)v21->pMonsterInfo.uRecoveryTime * 2.133333333333333; + v47 = (double)(signed int)pActor->pMonsterInfo.uRecoveryTime * 2.133333333333333; v64 = (signed __int64)v47; Actor::AI_Stand(actor_id, target_pid, v64, &pDir); } else { - Actor::Pursue3(actor_id, target_pid, 256, &pDir); + Actor::AI_Pursue3(actor_id, target_pid, 256, &pDir); } } - else if ( v21->pMonsterInfo.uMovementType == 5 ) + else if ( pActor->pMonsterInfo.uMovementType == 5 ) { - v47 = (double)(signed int)v21->pMonsterInfo.uRecoveryTime * 2.133333333333333; + v47 = (double)(signed int)pActor->pMonsterInfo.uRecoveryTime * 2.133333333333333; v64 = (signed __int64)v47; Actor::AI_Stand(actor_id, target_pid, v64, &pDir); } else { v70 = (signed __int64)v80 * 307.2; - Actor::Pursue2(actor_id, target_pid, 0, &pDir, v70); + Actor::AI_Pursue2(actor_id, target_pid, 0, &pDir, v70); } } - else if ( (signed int)v21->pMonsterInfo.uRecoveryTime > 0 ) + else if ( (signed int)pActor->pMonsterInfo.uRecoveryTime > 0 ) { - v47 = (double)(signed int)v21->pMonsterInfo.uRecoveryTime * 2.133333333333333; + v47 = (double)(signed int)pActor->pMonsterInfo.uRecoveryTime * 2.133333333333333; v64 = (signed __int64)v47; Actor::AI_Stand(actor_id, target_pid, v64, &pDir); } else { - Actor::MeleeAttack(actor_id, target_pid, &pDir); + Actor::AI_MeleeAttack(actor_id, target_pid, &pDir); } } - else if ( (signed int)v21->pMonsterInfo.uRecoveryTime > 0 ) + else if ( (signed int)pActor->pMonsterInfo.uRecoveryTime > 0 ) { - v47 = (double)(signed int)v21->pMonsterInfo.uRecoveryTime * 2.133333333333333; - if ( v80 * 307.2 > (double)v81 || v21->pMonsterInfo.uMovementType == 5 ) + v47 = (double)(signed int)pActor->pMonsterInfo.uRecoveryTime * 2.133333333333333; + if ( v80 * 307.2 > (double)v81 || pActor->pMonsterInfo.uMovementType == 5 ) { v64 = (signed __int64)v47; Actor::AI_Stand(actor_id, target_pid, v64, &pDir); } else { - Actor::Pursue1(actor_id, target_pid, actor_id, (signed __int64)v47, &pDir); + Actor::AI_Pursue1(actor_id, target_pid, actor_id, (signed __int64)v47, &pDir); } } else { - Actor::MissileAttack2(actor_id, target_pid, &pDir); - } + Actor::AI_MissileAttack2(actor_id, target_pid, &pDir); + } } } } diff -r 28ee6610a3d2 -r d5dae0b4b98a mm7_5.cpp --- a/mm7_5.cpp Fri May 24 10:53:33 2013 +0600 +++ b/mm7_5.cpp Fri May 24 10:53:46 2013 +0600 @@ -1638,10 +1638,8 @@ } else { - start_event_seq_number = dword_5C341C; - EventProcessor(dword_5C3418, 0, 1); - } - start_event_seq_number = 0; + EventProcessor(dword_5C3418, 0, 1, dword_5C341C); + } if ( !_strcmpi(byte_6BE3B0, "d05.blv") ) pParty->uTimePlayed += 1474560i64; continue; @@ -1649,7 +1647,6 @@ CloseWindowBackground(); pVideoPlayer->Unload(); DialogueEnding(); - start_event_seq_number = 0; viewparams->bRedrawGameUI = true; continue; case UIMSG_CycleCharacters: @@ -4675,7 +4672,7 @@ } if ( pMonster->sCurrentHP > 0 ) { - Actor::Stun(uActorID_Monster_, a1, 0); + Actor::AI_Stun(uActorID_Monster_, a1, 0); Actor::AggroSurroundingPeasants(uActorID_Monster_, 1); if ( bShowDamage ) { @@ -5010,7 +5007,7 @@ { if ( v7->sCurrentHP >= 1 ) { - Actor::Stun(uActorID, PID(OBJECT_Player,a4), 0); + Actor::AI_Stun(uActorID, PID(OBJECT_Player,a4), 0); Actor::AggroSurroundingPeasants(uActorID, 1); } else @@ -5196,7 +5193,7 @@ { if ( v44->sCurrentHP >= 1 ) { - Actor::Stun(uActorID, PID(OBJECT_Player,a4), 0); + Actor::AI_Stun(uActorID, PID(OBJECT_Player,a4), 0); Actor::AggroSurroundingPeasants(uActorID, 1); } else @@ -5462,7 +5459,7 @@ if ( v7 ) { if ( pActor->sCurrentHP > 0 ) - Actor::Stun(uActorIDa, a2, 0); + Actor::AI_Stun(uActorIDa, a2, 0); else Actor::Die(uActorIDa); a2a = 20 * v7 / (signed int)pActor->pMonsterInfo.uHP; @@ -5481,7 +5478,7 @@ } else { - Actor::Stun(uActorIDa, a2, 0); + Actor::AI_Stun(uActorIDa, a2, 0); } } } @@ -5570,7 +5567,7 @@ if ( v14 ) { if ( v7->sCurrentHP > 0 ) - Actor::Stun(uActorID, v17, 0); + Actor::AI_Stun(uActorID, v17, 0); else Actor::Die(uActorID); Actor::AggroSurroundingPeasants(uActorID, 0); @@ -5590,7 +5587,7 @@ } else { - Actor::Stun(uActorID, v17, 0); + Actor::AI_Stun(uActorID, v17, 0); } return; } @@ -6887,7 +6884,7 @@ v22 = 2; v17 = v5->pMonsterInfo.uSpell1ID; } - Actor::SpellAttack(v4, &a4, v17, v22, v24); + Actor::AI_SpellAttack(v4, &a4, v17, v22, v24); LABEL_25: v16 = a2a; v23 = &a4; @@ -6903,7 +6900,7 @@ v18 = v5->pMonsterInfo.uMissleAttack1Type; v25 = 0; } - Actor::RangedAttack(v4, &a4, v18, v25); + Actor::AI_RangedAttack(v4, &a4, v18, v25); goto LABEL_25; } } @@ -7018,7 +7015,7 @@ { if ( v5->pMonsterInfo.uMissleAttack2Type ) { - Actor::MissileAttack2(v13, v22, &v18); + Actor::AI_MissileAttack2(v13, v22, &v18); goto LABEL_43; } } @@ -7033,16 +7030,16 @@ if ( v15 ) { if ( v14 == 2 ) - Actor::SpellAttack1(v13, v22, &v18); + Actor::AI_SpellAttack1(v13, v22, &v18); else - Actor::SpellAttack2(v13, v22, &v18); + Actor::AI_SpellAttack2(v13, v22, &v18); goto LABEL_43; } goto LABEL_44; } if ( v5->pMonsterInfo.uMissleAttack1Type ) { - Actor::MissileAttack1(v13, v22, &v18); + Actor::AI_MissileAttack1(v13, v22, &v18); LABEL_43: //v3 = v21; v21->field_C = 1; @@ -7055,7 +7052,7 @@ LABEL_44: if ( (double)(signed int)v20 < 307.2 ) { - Actor::MeleeAttack(v13, v22, &v18); + Actor::AI_MeleeAttack(v13, v22, &v18); //v3 = v21; v21->field_C = 3; goto LABEL_48; @@ -7334,12 +7331,12 @@ { if ( (signed int)v11 < 10240 ) { - Actor::Flee(uActorID, a2a, 0, &pDir); + Actor::AI_Flee(uActorID, a2a, 0, &pDir); v29->field_C = 4; v29->uActionLength = actor->uCurrentActionLength; return 1; } - Actor::_4032B2(uActorID, a2a, 1024, 0); + Actor::AI_4032B2(uActorID, a2a, 1024, 0); v29->field_C = 2; v29->uActionLength = actor->uCurrentActionLength; return 1; @@ -7357,7 +7354,7 @@ v29->uActionLength = actor->uCurrentActionLength; return 1; } - Actor::Flee(uActorID, a2a, 32, 0); + Actor::AI_Flee(uActorID, a2a, 32, 0); v29->field_C = 4; v29->uActionLength = actor->uCurrentActionLength; return 1; @@ -7376,7 +7373,7 @@ v29->uActionLength = actor->uCurrentActionLength; return 1; } - Actor::Flee(uActorID, a2a, 32, 0); + Actor::AI_Flee(uActorID, a2a, 32, 0); v29->field_C = 4; v29->uActionLength = actor->uCurrentActionLength; return 1; @@ -7397,7 +7394,7 @@ v29->uActionLength = actor->uCurrentActionLength; return 1; } - Actor::Flee(uActorID, a2a, 32, 0); + Actor::AI_Flee(uActorID, a2a, 32, 0); v29->field_C = 4; v29->uActionLength = actor->uCurrentActionLength; return 1; @@ -7411,9 +7408,9 @@ if ( (signed int)v11 < 5120 ) { if ( actor->pMonsterInfo.uMissleAttack1Type && (signed int)v11 < 1024 ) - Actor::Pursue1(uActorID, a2a, uActorID, 32, &pDir); + Actor::AI_Pursue1(uActorID, a2a, uActorID, 32, &pDir); else - Actor::Pursue2(uActorID, a2a, 32, &pDir, 307); + Actor::AI_Pursue2(uActorID, a2a, 32, &pDir, 307); v29->field_C = 2; v29->uActionLength = actor->uCurrentActionLength; return 1; @@ -7421,28 +7418,28 @@ LABEL_46: if ( !actor->pMonsterInfo.uMovementType ) { - Actor::_4032B2(uActorID, a2a, 1024, 32); + Actor::AI_4032B2(uActorID, a2a, 1024, 32); v29->field_C = 2; v29->uActionLength = actor->uCurrentActionLength; return 1; } if ( actor->pMonsterInfo.uMovementType == 1 ) { - Actor::_4032B2(uActorID, a2a, 2560, 32); + Actor::AI_4032B2(uActorID, a2a, 2560, 32); v29->field_C = 2; v29->uActionLength = actor->uCurrentActionLength; return 1; } if ( actor->pMonsterInfo.uMovementType == 2 ) { - Actor::_4032B2(uActorID, a2a, 5120, 32); + Actor::AI_4032B2(uActorID, a2a, 5120, 32); v29->field_C = 2; v29->uActionLength = actor->uCurrentActionLength; return 1; } if ( actor->pMonsterInfo.uMovementType == 4 ) { - Actor::_4032B2(uActorID, a2a, 10240, 32); + Actor::AI_4032B2(uActorID, a2a, 10240, 32); v29->field_C = 2; v29->uActionLength = actor->uCurrentActionLength; return 1; diff -r 28ee6610a3d2 -r d5dae0b4b98a mm7_6.cpp --- a/mm7_6.cpp Fri May 24 10:53:33 2013 +0600 +++ b/mm7_6.cpp Fri May 24 10:53:46 2013 +0600 @@ -7446,15 +7446,18 @@ } //pParty->uFlags2 |= PARTY_FLAGS_2_RUNNING; - for ( uint i = 0; i < 30; ++i ) + + + // WUT? double event trigger + /*for ( uint i = 0; i < 30; ++i ) { if ( pKeyActionMap->pToggleTypes[i] ) v14 = pGame->pKeyboardInstance->WasKeyPressed(pKeyActionMap->pVirtualKeyCodesMapping[i]); else v14 = pGame->pKeyboardInstance->IsKeyBeingHeld(pKeyActionMap->pVirtualKeyCodesMapping[i]); - if ( v14 && i == 9 ) + if ( v14 ) { - if ( !pCurrentScreen ) + if (pCurrentScreen == SCREEN_GAME) { pMessageQueue_50CBD0->AddMessage(UIMSG_Game_Action, 0, 0); continue; @@ -7480,7 +7483,7 @@ //pMessageQueue_50CBD0->AddMessage(UIMSG_Escape, 0, 0); } } - } + }*/ if ( !pEventTimer->bPaused ) { for ( uint i = 0; i < 30; ++i ) @@ -7699,13 +7702,6 @@ } else { - /* if ( dword_50C9E8 < 40 ) - { - dword_50C9EC[3 * dword_50C9E8] = 25; - dword_50C9EC[3 * dword_50C9E8 + 1] = 0; - dword_50C9EC[3 * dword_50C9E8 + 2] = 0; - ++dword_50C9E8; - }*/ pMessageQueue_50C9E8->AddMessage(UIMSG_CastQuickSpell, 0, 0); } break; diff -r 28ee6610a3d2 -r d5dae0b4b98a mm7_data.cpp --- a/mm7_data.cpp Fri May 24 10:53:33 2013 +0600 +++ b/mm7_data.cpp Fri May 24 10:53:46 2013 +0600 @@ -1306,7 +1306,6 @@ struct Texture *pTexture_outside; // idb struct Texture *pTexture_Dialogue_Background; _UNKNOWN unk_597F10; // weak -int start_event_seq_number; // weak char byte_5B0938[2000]; int EvtTargetObj; // 0x5B5920 int _unused_5B5924_is_travel_ui_drawn = false; // 005B5924 diff -r 28ee6610a3d2 -r d5dae0b4b98a mm7_data.h --- a/mm7_data.h Fri May 24 10:53:33 2013 +0600 +++ b/mm7_data.h Fri May 24 10:53:46 2013 +0600 @@ -799,7 +799,6 @@ extern struct Texture *pTexture_outside; // idb extern struct Texture *pTexture_Dialogue_Background; extern _UNKNOWN unk_597F10; // weak -extern int start_event_seq_number; // weak extern char byte_5B0938[2000]; extern int EvtTargetObj; // weak extern int _unused_5B5924_is_travel_ui_drawn; // 005B5924 @@ -1383,7 +1382,7 @@ int sub_4465DF_check_season(int a1); int __fastcall IsActorAlive(unsigned int uType, unsigned int uParam, unsigned int uNumAlive); // idb // void __cdecl crt_construct_5773C4(); -int NPC_EventProcessor(int npc_event_id); +int NPC_EventProcessor(int npc_event_id, int entry_line = 0); void __fastcall sub_448518_npc_set_item(int npc, unsigned int item, int a3); void __fastcall sub_44861E_set_texture(unsigned int uFaceCog, const char *pFilename); @@ -1426,7 +1425,7 @@ int __cdecl j_SetSomeItemsNames(); -unsigned int SkillToMastery(unsigned int skill_value); +int SkillToMastery(unsigned int skill_value); unsigned int __fastcall GetSpellColor(signed int a1); void *__thiscall unknown_vdtor_6(void *_this, bool a2); unsigned short * MakeScreenshot(signed int width, signed int height);