Mercurial > mm7
diff Party.cpp @ 0:9c0607679772
init
author | Ritor1 |
---|---|
date | Sat, 12 Jan 2013 09:45:18 +0600 |
parents | |
children | 1faa29fd4c2d |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Party.cpp Sat Jan 12 09:45:18 2013 +0600 @@ -0,0 +1,1220 @@ +#include "Party.h" +#include "MapInfo.h" +#include "Time.h" +#include "AudioPlayer.h" +#include "IconFrameTable.h" +#include "Mouse.h" +#include "PlayerFrameTable.h" +#include "TurnEngine.h" +#include "stru279.h" +#include "Viewport.h" +#include "Actor.h" +#include "GUIWindow.h" + +#include "mm7_data.h" + + + + + + + +Party *pParty; // idb + +struct ActionQueue *pPartyActionQueue = new ActionQueue; + + + + +//----- (004760C1) -------------------------------------------------------- +void ActionQueue::Add(PartyAction action) +{ + if (uNumActions < 30) + pActions[uNumActions++] = action; +} + +//----- (00497FC5) -------------------------------------------------------- +bool Party::_497FC5_check_party_perception_against_level() +{ + int uMaxPerception; // edi@1 + Player *v2; // esi@1 + signed int v3; // ebx@1 + Player *v4; // ecx@2 + signed int v5; // eax@3 + bool result; // eax@7 + + uMaxPerception = 0; + v2 = this->pPlayers; + v3 = 4; + do + { + if ( v2->CanAct() ) + { + v5 = v2->GetPerception(); + if ( v5 > uMaxPerception ) + uMaxPerception = v5; + } + ++v2; + --v3; + } + while ( v3 ); + if ( uLevelMapStatsID && (signed int)uLevelMapStatsID < 77 ) + result = uMaxPerception >= 2 * pMapStats->pInfos[uLevelMapStatsID]._per; + else + result = 0; + return result; +} + +//----- (004936E1) -------------------------------------------------------- +void Party::SetHoldingItem(ItemGen *pItem) +{ + Party *v2; // esi@1 + + v2 = this; + sub_421B2C_PlaceInInventory_or_DropPickedItem(); + memcpy(&v2->pPickedItem, pItem, sizeof(v2->pPickedItem)); + pMouse->SetCursorBitmapFromItemID(v2->pPickedItem.uItemID); +} + +//----- (0049370F) -------------------------------------------------------- +int Party::GetNextActiveCharacter() +{ + Party *v1; // esi@1 + int v2; // eax@4 + signed int v4; // ecx@6 + char *v5; // edx@6 + Player *v6; // eax@7 + char *v7; // ecx@23 + signed int v8; // esi@23 + signed int v9; // edx@23 + Player **v10; // edi@23 + Player *v11; // eax@24 + int v12; // [sp+Ch] [bp-4h]@1 + + v1 = this; + v12 = 0; + if ( pParty->bTurnBasedModeOn == 1 ) + { + if ( pTurnEngine->field_4 != 2 || (pTurnEngine->pQueue[0].uPackedID & 7) != 4 ) + return 0; + v2 = pTurnEngine->pQueue[0].uPackedID >> 3; + return v2 + 1; + } + v4 = 0; + v5 = (char *)&v1->pPlayers[0].uTimeToRecovery; + while ( 1 ) + { + v6 = ::pPlayers[v4 + 1]; + if ( v6->pConditions[2] + || v6->pConditions[12] + || v6->pConditions[13] + || v6->pConditions[14] + || v6->pConditions[15] + || v6->pConditions[16] + || *(short *)v5 ) + { + byte_AE3368[v4] = 1; + goto LABEL_21; + } + if ( !byte_AE3368[v4] ) + break; +LABEL_21: + ++v4; + v5 += 6972; + if ( v4 >= 4 ) + goto LABEL_16; + } + v12 = v4; + byte_AE3368[v4] = 1; +LABEL_16: + if ( (unsigned __int8)(byte_AE3369 & byte_AE336A & byte_AE336B) & byte_AE3368[0] ) + memset(byte_AE3368, 0, 4u); + v2 = v12; + if ( v12 ) + return v2 + 1; + v7 = (char *)&v1->pPlayers[0].uSpeedBonus; + v8 = 0; + v9 = 1; + v10 = &::pPlayers[1]; + while ( 2 ) + { + v11 = *v10; + if ( !(*v10)->pConditions[2] + && !v11->pConditions[12] + && !v11->pConditions[13] + && !v11->pConditions[14] + && !v11->pConditions[15] + && !v11->pConditions[16] + && !*((short *)v7 + 3123) ) + { + if ( v12 ) + { + if ( *(short *)v7 > v8 ) + { + v8 = *(short *)v7; + goto LABEL_35; + } + } + else + { + v8 = *(short *)v7; +LABEL_35: + v12 = v9; + } + } + ++v10; + ++v9; + v7 += 6972; + if ( v9 - 1 < 4 ) + continue; + return v12; + } +} + + +//----- (00493244) -------------------------------------------------------- +bool Party::HasItem(unsigned int uItemID) +{ + char *v2; // edx@1 + signed int v3; // ecx@2 + ItemGen *v4; // eax@2 + + v2 = (char *)pParty->pPlayers[0].pInventoryItems; + while ( 2 ) + { + v3 = 0; + v4 = (ItemGen *)v2; + do + { + if ( v4->uItemID == uItemID ) + return 1; + ++v3; + ++v4; + } + while ( v3 < 138 ); + v2 += 6972; + if ( (signed int)v2 < (signed int)&pParty->field_777C[85] ) + continue; + break; + } + return 0; +} + + +//----- (00492AD5) -------------------------------------------------------- +__int16 Party::SetFood(unsigned int uNumFood) +{ + __int16 result; // ax@1 + + pUIAnim_Food->uAnimTime = 0; + pParty->uNumFoodRations = uNumFood; + result = 8 * pIconsFrameTable->pIcons[(signed __int16)pUIAnim_Food->uIconID].uAnimLength; + pUIAnim_Food->uAnimLength = 8 * pIconsFrameTable->pIcons[(signed __int16)pUIAnim_Food->uIconID].uAnimLength; + return result; +} + +//----- (00492B03) -------------------------------------------------------- +void Party::TakeFood(unsigned int uNumFood) +{ + if ( ((pParty->uNumFoodRations - uNumFood) & 0x80000000u) == 0 ) + pParty->uNumFoodRations -= uNumFood; + else + pParty->uNumFoodRations = 0; + pUIAnim_Food->uAnimTime = 0; + pUIAnim_Food->uAnimLength = 8 * pIconsFrameTable->pIcons[(signed __int16)pUIAnim_Food->uIconID].uAnimLength; +} + +//----- (00492B42) -------------------------------------------------------- +__int16 Party::GiveFood(unsigned int _this) +{ + __int16 result; // ax@1 + + pParty->uNumFoodRations += _this; + pUIAnim_Food->uAnimTime = 0; + result = 8 * pIconsFrameTable->pIcons[(signed __int16)pUIAnim_Food->uIconID].uAnimLength; + pUIAnim_Food->uAnimLength = 8 * pIconsFrameTable->pIcons[(signed __int16)pUIAnim_Food->uIconID].uAnimLength; + return result; +} + +//----- (00492B70) -------------------------------------------------------- +void Party::SetGold(unsigned int uNumGold) +{ + pParty->uNumGold = uNumGold; + pUIAnim_Gold->uAnimTime = 0; + pUIAnim_Gold->uAnimLength = 8 * pIconsFrameTable->pIcons[(signed __int16)pUIAnim_Gold->uIconID].uAnimLength; + pAudioPlayer->PlaySound(SOUND_GoldReceived, 0, 0, -1, 0, 0, 0, 0); +} + +//----- (00492BB6) -------------------------------------------------------- +void Party::TakeGold(unsigned int uNumGold) +{ + if ( uNumGold <= pParty->uNumGold ) + pParty->uNumGold -= uNumGold; + else + pParty->uNumGold = 0; + pUIAnim_Gold->uAnimTime = 0; + pUIAnim_Gold->uAnimLength = 8 * pIconsFrameTable->pIcons[(signed __int16)pUIAnim_Gold->uIconID].uAnimLength; + pAudioPlayer->PlaySound(SOUND_GoldReceived, 0, 0, -1, 0, 0, 0, 0); +} + +//----- (0049135E) -------------------------------------------------------- +unsigned int Party::GetPartyFame() +{ + signed int v1; // eax@1 + char *v2; // ecx@1 + signed int v3; // edx@1 + + v1 = 0; + v2 = (char *)&this->pPlayers[0].uExperience; + v3 = 4; // (E exp) / 1000 + do + { + v1 += *(int *)v2; + v2 += 6972; + --v3; + } + while ( v3 ); + return v1 / 1000; +} + +//----- (0049137D) -------------------------------------------------------- +void Party::CreateDefaultParty(char bGiveItems) +{ + Party *pParty; // esi@1 + signed __int16 v3; // ax@1 + int pResMagicBase; // ecx@1 + Player *pCharacter; // esi@3 + signed int uSpellBookPageCount; // edx@5 + int pMagicSkills; // eax@5 + int uSkillIdx; // eax@11 + //unsigned __int8 v9; // zf@37 + //char v10; // sf@37 + //unsigned __int8 v11; // of@37 + char *pAttributes; // eax@38 + signed int v13; // ecx@38 + int uMaxSP; // eax@42 + unsigned int v15; // [sp-4h] [bp-44h]@14 + unsigned int v16; // [sp-4h] [bp-44h]@26 + int v17; // [sp+10h] [bp-30h]@1 + int v18; // [sp+14h] [bp-2Ch]@11 + signed int uNumPlayers; // [sp+18h] [bp-28h]@1 + ItemGen Dst; // [sp+1Ch] [bp-24h]@10 + + pParty = this; + strcpy(this->pPlayers[0].pName, pGlobalTXT_LocalizationStrings[509]); //Zoltan + pParty->pPlayers[0].field_1928 = 17; + pParty->pPlayers[0].uFace = 17; + pParty->pPlayers[0].field_1924 = 17; + pParty->pPlayers[0].uVoiceID = 17; + pParty->pPlayers[0].uMight = 30; + pParty->pPlayers[0].uIntelligence = 5; + pParty->pPlayers[0].uWillpower = 5; + pParty->pPlayers[0].uEndurance = 13; + pParty->pPlayers[0].uAccuracy = 13; + pParty->pPlayers[0].uSpeed = 14; + pParty->pPlayers[0].uLuck = 7; + pParty->pPlayers[0].pActiveSkills[9] = 1; // leather + pParty->pPlayers[0].pActiveSkills[33] = 1; // armsmaster + pParty->pPlayers[0].pActiveSkills[5] = 1; // bow + pParty->pPlayers[0].pActiveSkills[1] = 1; // sword + pParty->pPlayers[1].field_1928 = 3; + pParty->pPlayers[1].uFace = 3; + pParty->pPlayers[1].field_1924 = 3; + pParty->pPlayers[1].uVoiceID = 3; + strcpy(pParty->pPlayers[1].pName, pGlobalTXT_LocalizationStrings[506]); //Roderic + pParty->pPlayers[1].uMight = 13; + pParty->pPlayers[1].uIntelligence = 9; + pParty->pPlayers[1].uWillpower = 9; + pParty->pPlayers[1].uEndurance = 13; + pParty->pPlayers[1].uAccuracy = 13; + pParty->pPlayers[1].uSpeed = 13; + pParty->pPlayers[1].uLuck = 13; + pParty->pPlayers[1].pActiveSkills[9] = 1; // leather + pParty->pPlayers[1].pActiveSkills[34] = 1; // stealing + pParty->pPlayers[1].pActiveSkills[2] = 1; // dagger + pParty->pPlayers[1].pActiveSkills[29] = 1; // disarm trap + pParty->pPlayers[2].field_1928 = 14; + pParty->pPlayers[2].uFace = 14; + pParty->pPlayers[2].field_1924 = 14; + pParty->pPlayers[2].uVoiceID = 14; + strcpy(pParty->pPlayers[2].pName, pGlobalTXT_LocalizationStrings[508]); // Serena + pParty->pPlayers[2].uMight = 12; + pParty->pPlayers[2].uIntelligence = 9; + pParty->pPlayers[2].uWillpower = 20; + pParty->pPlayers[2].uEndurance = 22; + pParty->pPlayers[2].uAccuracy = 7; + pParty->pPlayers[2].uSpeed = 13; + pParty->pPlayers[2].uLuck = 7; + pParty->pPlayers[2].pActiveSkills[35] = 1; // alchemy + pParty->pPlayers[2].pActiveSkills[9] = 1; // leather + pParty->pPlayers[2].pActiveSkills[18] = 1; // body + pParty->pPlayers[2].pActiveSkills[6] = 1; // mace + strcpy(pParty->pPlayers[3].pName, pGlobalTXT_LocalizationStrings[507]); // Alexis + v3 = 10; + pParty->pPlayers[3].field_1928 = 10; + pParty->pPlayers[3].uFace = 10; + pResMagicBase = (int)&pParty->pPlayers[0].sResMagicBase; + pParty->pPlayers[3].uEndurance = 13; + pParty->pPlayers[3].uAccuracy = 13; + pParty->pPlayers[3].uSpeed = 13; + pParty->pPlayers[3].field_1924 = 10; + pParty->pPlayers[3].uVoiceID = 10; + pParty->pPlayers[3].uMight = 5; + pParty->pPlayers[3].uIntelligence = 30; + pParty->pPlayers[3].uWillpower = 9; + pParty->pPlayers[3].uLuck = 7; + pParty->pPlayers[3].pActiveSkills[9] = 1; // leather + pParty->pPlayers[3].pActiveSkills[13] = 1; // air + pParty->pPlayers[3].pActiveSkills[12] = 1; // fire + pParty->pPlayers[3].pActiveSkills[0] = 1; // staff + pCharacter = &pParty->pPlayers[0]; + //uNumPlayers = 4; + //while ( 1 ) + for (uNumPlayers = 0; uNumPlayers < 4; uNumPlayers++) + { + if ( !pCharacter->uClass ) + *(short *)pResMagicBase = v3; //player[i].pResMagicBase + uSpellBookPageCount = 0; + //pMagicSkills = pPlayers[uNumPlayers].pActiveSkills[12];// Skills + //while ( !*(short *)pMagicSkills ) //player[i].skillFire + for (int i = 0; i < 9; i++)//for Magic Book + { + //++uSpellBookPageCount; + //pMagicSkills++; + //if ( uSpellBookPageCount >= 9 ) + //goto LABEL_10; + if (pPlayers[uNumPlayers].pActiveSkills[12+i]) + ++uSpellBookPageCount; + } + pCharacter->pNumSpellBookPage = uSpellBookPageCount; +//LABEL_10: + pCharacter->uExpressionTimePassed = 0; + Dst.Reset(); + if ( bGiveItems ) + { + pItemsTable->GenerateItem(2, 40, &Dst); + pCharacter->AddItem2(-1, &Dst); + //uSkillIdx = 0; + //v18 = 0; + //do + for (uSkillIdx = 0; uSkillIdx < 36; uSkillIdx++) + { + if ( pCharacter->pActiveSkills[uSkillIdx] ) + { + switch ( uSkillIdx ) + { + case PLAYER_SKILL_STAFF: + v15 = ITEM_STAFF_1; + pCharacter->WearItem(v15); + break; + case PLAYER_SKILL_SWORD: + v15 = ITEM_LONGSWORD_1; + pCharacter->WearItem(v15); + break; + case PLAYER_SKILL_DAGGER: + v15 = ITEM_DAGGER_1; + pCharacter->WearItem(v15); + break; + case PLAYER_SKILL_AXE: + v15 = ITEM_AXE_1; + pCharacter->WearItem(v15); + break; + case PLAYER_SKILL_SPEAR: + v15 = ITEM_SPEAR_1; + pCharacter->WearItem(v15); + break; + case PLAYER_SKILL_BOW: + v15 = ITEM_CROSSBOW_1; + pCharacter->WearItem(v15); + break; + case PLAYER_SKILL_MACE: + v15 = ITEM_MACE_1; + pCharacter->WearItem(v15); + break; + case PLAYER_SKILL_SHIELD: + v15 = ITEM_BUCKLER_1; + pCharacter->WearItem(v15); + break; + case PLAYER_SKILL_LEATHER: + v15 = ITEM_LEATHER_1; + pCharacter->WearItem(v15); + break; + case PLAYER_SKILL_CHAIN: + v15 = ITEM_CHAINMAIL_1; + pCharacter->WearItem(v15); + break; + case PLAYER_SKILL_PLATE: + v15 = ITEM_PLATE_1; + pCharacter->WearItem(v15); + break; + case PLAYER_SKILL_FIRE: + v16 = ITEM_SPELLBOOK_FIRE_STRIKE; + pCharacter->AddItem(-1, v16); + break; + case PLAYER_SKILL_AIR: + v16 = ITEM_SPELLBOOK_AIR_FEATHER_FALL; + pCharacter->AddItem(-1, v16); + break; + case PLAYER_SKILL_WATER: + v16 = ITEM_SPELLBOOK_WATER_POISON_SPRAY; + pCharacter->AddItem(-1, v16); + break; + case PLAYER_SKILL_EARTH: + v16 = ITEM_SPELLBOOK_EARTH_SLOW; + pCharacter->AddItem(-1, v16); + break; + case PLAYER_SKILL_SPIRIT: + v16 = ITEM_SPELLBOOK_SPIRIT_BLESS; + pCharacter->AddItem(-1, v16); + break; + case PLAYER_SKILL_MIND: + v16 = ITEM_SPELLBOOK_MIND_MIND_BLAST; + pCharacter->AddItem(-1, v16); + break; + case PLAYER_SKILL_BODY: + v16 = ITEM_SPELLBOOK_BODY_FIRST_AID; + pCharacter->AddItem(-1, v16); + break; + case PLAYER_SKILL_ITEM_ID: + case PLAYER_SKILL_REPAIR: + case PLAYER_SKILL_MEDITATION: + case PLAYER_SKILL_PERCEPTION: + case PLAYER_SKILL_DIPLOMACY: + case PLAYER_SKILL_TRAP_DISARM: + case PLAYER_SKILL_LEARNING: + pCharacter->AddItem(-1, ITEM_POTION_BOTTLE); + v16 = 5 * (rand() % 3 + 40); // simple reagent + pCharacter->AddItem(-1, v16); + break; + case PLAYER_SKILL_DODGE: + v16 = ITEM_BOOTS_1; + pCharacter->AddItem(-1, v16); + break; + case PLAYER_SKILL_UNARMED: + v16 = ITEM_GAUNTLETS_1; + pCharacter->AddItem(-1, v16); + break; + default: + break; + } + } + //uSkillIdx = v18 + 1; + //v11 = uSkillIdx > 36; + //v9 = v18 == 35; + //v10 = uSkillIdx - 35 < 0; + } + //while (uSkillIdx < 36); + pAttributes = (char *)&pCharacter->pInventoryItems[0].uAttributes; + //v13 = 138; + for (v13 = 138; v13 > 0; --v13) + { + if ( *((int *)pAttributes - 5) ) + *(int *)pAttributes |= 1; + pAttributes += 36; + //--v13; + } + //while ( v13 ); + } + pCharacter->sHealth = pCharacter->GetMaxHealth(); + pCharacter->sMana = pCharacter->GetMaxMana(); + pCharacter++; + //uNumPlayers--; + //if (!uNumPlayers) + //break; + pResMagicBase = (int)pCharacter; + v3 = 10; + } +} + +//----- (004917CE) -------------------------------------------------------- +int Party::Reset() +{ + //Party *v1; // esi@1 + //unsigned __int64 *pTimePlayed; // edi@1 + //bool v3; // edx@1 + //Player **v4; // eax@1 + //Player *v5; // ecx@1 + PLAYER_SEX pSex; // cl@3 + PLAYER_SEX v7; // al@6 + PLAYER_SEX v8; // al@9 + PLAYER_SEX v9; // cl@12 + //Player *v12; // edx@17 + //signed int v13; // edi@18 + SpellBuff *v14; // ebx@21 + signed int v15; // edi@21 + + field_708 = 15; + sEyelevel = 160; + uFlags2 = 0; + uNumGold = 200; + uNumGoldInBank = 0; + uNumFoodRations = 7; + uAlignment = 1; + + SetUserInterface(uAlignment, true); + + uTimePlayed = 0x21C00u; + uLastRegenerationTime = 0x21C00; + + bTurnBasedModeOn = false; + + uActiveCharacter = 1; + ::pPlayers[0] = pPlayers; + for (uint i = 0; i < 4; ++i) + ::pPlayers[i + 1] = &pPlayers[i]; + + pPlayers[0].Reset(0); + pPlayers[1].Reset(4); + pPlayers[2].Reset(24); + pPlayers[3].Reset(32); + pPlayers[0].uFace = 17; + pPlayers[0].field_1924 = 17; + pPlayers[0].uVoiceID = 17; + pPlayers[0].SetInitialStats(); + + switch ( pPlayers[0].uVoiceID ) + { + case 0: + case 1: + case 2: + case 3: + case 8: + case 9: + case 12: + case 13: + case 16: + case 17: + case 20: + case 23: + default: + pSex = SEX_MALE; + break; + case 4: + case 5: + case 6: + case 7: + case 10: + case 11: + case 14: + case 15: + case 18: + case 19: + case 21: + case 24: + pSex = SEX_FEMALE; + break; + } + pPlayers[0].uSex = pSex; + pPlayers[0].RandomizeName(); + strcpy(pPlayers[0].pName, pGlobalTXT_LocalizationStrings[509]); + + + pPlayers[1].uFace = 3; + pPlayers[1].field_1924 = 3; + pPlayers[1].uVoiceID = 3; + pPlayers[1].SetInitialStats(); + v7 = SEX_MALE; + switch (pPlayers[1].uVoiceID) + { + case 0: + case 1: + case 2: + case 3: + case 8: + case 9: + case 0xCu: + case 0xDu: + case 0x10u: + case 0x11u: + case 0x14u: + case 0x17u: + v7 = SEX_MALE; + break; + case 4: + case 5: + case 6: + case 7: + case 0xAu: + case 0xBu: + case 0xEu: + case 0xFu: + case 0x12u: + case 0x13u: + case 0x15u: + case 0x18u: + v7 = SEX_FEMALE; + break; + default: + break; + } + pPlayers[1].uSex = v7; + pPlayers[1].RandomizeName(); + strcpy(pPlayers[1].pName, pGlobalTXT_LocalizationStrings[506]); + pPlayers[2].uFace = 14; + pPlayers[2].field_1924 = 14; + pPlayers[2].uVoiceID = 14; + pPlayers[2].SetInitialStats(); + v8 = SEX_MALE; + switch (pPlayers[2].uVoiceID) + { + case 0: + case 1: + case 2: + case 3: + case 8: + case 9: + case 0xCu: + case 0xDu: + case 0x10u: + case 0x11u: + case 0x14u: + case 0x17u: + v8 = SEX_MALE; + break; + case 4: + case 5: + case 6: + case 7: + case 0xAu: + case 0xBu: + case 0xEu: + case 0xFu: + case 0x12u: + case 0x13u: + case 0x15u: + case 0x18u: + v8 = SEX_FEMALE; + break; + default: + break; + } + pPlayers[2].uSex = v8; + pPlayers[2].RandomizeName(); + strcpy(pPlayers[2].pName, pGlobalTXT_LocalizationStrings[508]); + pPlayers[3].uFace = 10; + pPlayers[3].field_1924 = 10; + pPlayers[3].uVoiceID = 10; + pPlayers[3].SetInitialStats(); + v9 = SEX_MALE; + switch (pPlayers[3].uVoiceID) + { + case 0u: + case 1u: + case 2u: + case 3u: + case 8u: + case 9u: + case 0xCu: + case 0xDu: + case 0x10u: + case 0x11u: + case 0x14u: + case 0x17u: + v9 = SEX_MALE; + break; + case 4u: + case 5u: + case 6u: + case 7u: + case 0xAu: + case 0xBu: + case 0xEu: + case 0xFu: + case 0x12u: + case 0x13u: + case 0x15u: + case 0x18u: + v9 = SEX_FEMALE; + break; + default: + break; + } + pPlayers[3].uSex = v9; + pPlayers[3].RandomizeName(); + strcpy(pPlayers[3].pName, pGlobalTXT_LocalizationStrings[507]); + + + + for (uint i = 0; i < 4; ++i) + { + pPlayers[i].uTimeToRecovery = 0; + for (uint j = 0; j < 20; ++j) + pPlayers[i].pConditions[j] = 0; + + for (uint j = 0; j < 24; ++j) + pPlayers[i].pPlayerBuffs[j].Reset(); + + pPlayers[i].uExpressionID = 1; + pPlayers[i].uExpressionTimePassed = 0; + pPlayers[i].uExpressionTimeLength = rand() % 256 + 128; + } + + for (uint i = 1; i < 20; ++i) + pPartyBuffs[i].Reset(); + + + pWindowList_at_506F50_minus1_indexing_buttons____and_an_int_[0] = 100; + uFlags = 0; + + memset(_award_bits, 0, 64); + _449B7E_toggle_bit(_award_bits, 1, 1); + _449B7E_toggle_bit(_award_bits, 2, 1); + _449B7E_toggle_bit(_award_bits, 3, 1); + _449B7E_toggle_bit(_award_bits, 4, 1); + _449B7E_toggle_bit(_award_bits, 5, 1); + _449B7E_toggle_bit(_award_bits, 6, 1); + + + memcpy(pNPCStats->pNewNPCData, pNPCStats->pNPCData, 0x94BCu); + memcpy(pNPCStats->pGroups_copy, pNPCStats->pGroups, 0x66u); + pNPCStats->pNewNPCData[3].uFlags |= 0x80u; + _494035_timed_effects__water_walking_damage__etc(); + pEventTimer->Pause(); + return 0; +} + + + +//----- (0043AD34) -------------------------------------------------------- +void Party::Yell() +{ + void *v0; // esi@5 + int v1; // edi@9 + int v2; // ebx@9 + int v3; // eax@9 + unsigned int v4; // [sp+8h] [bp-4h]@4 + + if ( (signed __int64)pParty->pPartyBuffs[11].uExpireTime > 0 ) + pParty->pPartyBuffs[11].Reset(); + if ( pParty->bTurnBasedModeOn != 1 ) + { + v4 = 0; + if ( (signed int)uNumActors > 0 ) + { + v0 = &pActors[0].pMonsterInfo.uMovementType; + do + { + if ( ((Actor *)((char *)v0 - 59))->Actor::CanAct() && *((char *)v0 + 2) != 4 && *(char *)v0 != 5 ) + { + v1 = abs(*(short *)((char *)v0 + 83) - pParty->vPosition.x); + v2 = abs(*(short *)((char *)v0 + 85) - pParty->vPosition.y); + v3 = abs(*(short *)((char *)v0 + 87) - pParty->vPosition.z); + if ( (double)sub_4621DA(v1, v2, v3) < 512.0 ) + Actor::_402968(v4, 4, 0, 0); + } + ++v4; + v0 = (char *)v0 + 836; + } + while ( (signed int)v4 < (signed int)uNumActors ); + } + } +} + +//----- (00491BF9) -------------------------------------------------------- +void Party::ResetPosMiscAndSpellBuffs() +{ + Party *v1; // esi@1 + char *v2; // edi@1 + SpellBuff *v3; // ebx@2 + SpellBuff *v4; // esi@5 + signed int v5; // edi@5 + signed int v6; // [sp+8h] [bp-8h]@1 + signed int v7; // [sp+Ch] [bp-4h]@2 + + v1 = this; + this->vPosition.y = 0; + this->vPosition.z = 0; + this->vPosition.x = 0; + this->uFallStartY = 0; + this->sRotationY = 0; + this->sRotationX = 0; + this->uFallSpeed = 0; + this->field_28 = 0; + this->uDefaultPartyHeight = 120; + this->field_14 = 37; + this->field_18 = 25; + this->uWalkSpeed = 384; + this->field_20_prolly_turn_speed = 90; + this->field_24 = 5; + this->field_6FC = 0; + this->field_708 = 15; + this->field_0 = 25; + v2 = (char *)this->pPlayers[0].pPlayerBuffs; + v6 = 4; + do + { + v3 = (SpellBuff *)v2; + v7 = 24; + do + { + v3->Reset(); + ++v3; + --v7; + } + while ( v7 ); + v2 += 6972; + --v6; + } + while ( v6 ); + v4 = v1->pPartyBuffs; + v5 = 20; + do + { + v4->Reset(); + ++v4; + --v5; + } + while ( v5 ); +} + +//----- (004909F4) -------------------------------------------------------- +void Party::_4909F4() +{ + char *v1; // esi@2 + unsigned int v2; // eax@3 + __int16 v3; // cx@5 + int v4; // edx@27 + signed int v5; // eax@52 + PlayerFrame *v6; // edx@53 + char *v7; // esi@60 + signed int v8; // ebp@61 + int v9; // ebx@62 + unsigned int v10; // edi@62 + signed int v11; // [sp+0h] [bp-4h]@2 + + if ( dword_A75070 != stru_51076C.field_8 ) + { + dword_A75070 = stru_51076C.field_8; + v1 = (char *)&this->pPlayers[0].uExpressionID; + v11 = 4; + do + { + v2 = ((Player *)(v1 - 6812))->GetMajorConditionIdx(); + if ( v2 == 18 || v2 == 17 ) + { + *((short *)v1 + 1) += LOWORD(pMiscTimer->uTimeElapsed); + if ( *((short *)v1 + 1) >= *((short *)v1 + 2) ) + { + if ( *(short *)v1 != 1 || rand() % 5 ) + { + *((short *)v1 + 1) = 0; + *(short *)v1 = 1; + *((short *)v1 + 2) = rand() % 256 + 32; + } + else + { + v4 = rand() % 100; + if ( v4 >= 25 ) + { + if ( v4 >= 31 ) + { + if ( v4 >= 37 ) + { + if ( v4 >= 43 ) + { + if ( v4 >= 46 ) + { + if ( v4 >= 52 ) + { + if ( v4 >= 58 ) + { + if ( v4 >= 64 ) + { + if ( v4 >= 70 ) + { + if ( v4 >= 76 ) + { + if ( v4 >= 82 ) + { + if ( v4 >= 88 ) + *(short *)v1 = (v4 >= 94) + 29; + else + *(short *)v1 = 57; + } + else + { + *(short *)v1 = 56; + } + } + else + { + *(short *)v1 = 55; + } + } + else + { + *(short *)v1 = 54; + } + } + else + { + *(short *)v1 = 20; + } + } + else + { + *(short *)v1 = 19; + } + } + else + { + *(short *)v1 = 18; + } + } + else + { + *(short *)v1 = 17; + } + } + else + { + *(short *)v1 = 16; + } + } + else + { + *(short *)v1 = 15; + } + } + else + { + *(short *)v1 = 14; + } + } + else + { + *(short *)v1 = 13; + } + v5 = 0; + *((short *)v1 + 1) = 0; + if ( (signed int)pPlayerFrameTable->uNumFrames <= 0 ) + { +LABEL_56: + v5 = 0; + } + else + { + v6 = pPlayerFrameTable->pFrames; + while ( v6->uSequenceID != *(short *)v1 ) + { + ++v5; + ++v6; + if ( v5 >= (signed int)pPlayerFrameTable->uNumFrames ) + goto LABEL_56; + } + } + *((short *)v1 + 2) = 8 * pPlayerFrameTable->pFrames[v5].uAnimLength; + } + } + } + else + { + v3 = *(short *)v1; + if ( *(short *)v1 != 34 && v3 != 35 && v3 != 36 + || (signed int)(pMiscTimer->uTimeElapsed + *((short *)v1 + 1)) >= *((short *)v1 + 2) ) + { + *((short *)v1 + 2) = 0; + *((short *)v1 + 1) = 0; + switch ( v2 ) + { + case 0xEu: + *(short *)v1 = 98; + break; + case 0xFu: + *(short *)v1 = 12; + break; + case 0x10u: + *(short *)v1 = 99; + break; + case 0u: + *(short *)v1 = 2; + break; + case 1u: + *(short *)v1 = 3; + break; + case 2u: + *(short *)v1 = 4; + break; + case 3u: + *(short *)v1 = 5; + break; + case 4u: + *(short *)v1 = 6; + break; + case 5u: + *(short *)v1 = 7; + break; + case 6u: + case 8u: + case 0xAu: + *(short *)v1 = 8; + break; + case 7u: + case 9u: + case 0xBu: + *(short *)v1 = 9; + break; + case 0xCu: + *(short *)v1 = 10; + break; + case 0xDu: + *(short *)v1 = 11; + break; + default: + break; + } + } + else + { + *((short *)v1 + 1) += LOWORD(pMiscTimer->uTimeElapsed); + } + } + v1 += 6972; + --v11; + } + while ( v11 ); + v7 = (char *)&pParty->pHirelings[0].evtb; + do + { + v8 = *((int *)v7 + 1); + if ( v8 ) + { + v9 = *((int *)v7 - 1); + v10 = pMiscTimer->uTimeElapsed + *(int *)v7; + if ( (signed int)v10 >= v8 ) + { + v9 = 0; + v8 = 0; + v10 = 0; + memset(v7 - 44, 0, 0x4Cu); + pParty->field_709 = 0; + //sub_44A56A();Ritor1: it's temporarily + viewparams->bRedrawGameUI = 1; + } + *(int *)v7 = v10; + *((int *)v7 + 1) = v8; + *((int *)v7 - 1) = v9; + } + v7 += 76; + } + while ( (signed int)v7 < (signed int)&pParty->field_777C[1] ); + } +} +// A75070: using guessed type int dword_A75070; + +//----- (00490D02) -------------------------------------------------------- +void Party::RestAndHeal() +{ + SpellBuff *v1; // esi@1 + Player *v2; // esi@4 + signed int v3; // ebx@4 + SpellBuff *v4; // edi@4 + int v5; // eax@9 + char v6; // zf@9 + char *v7; // eax@10 + signed int v8; // ecx@10 + int v9; // eax@18 + int v10; // eax@25 + signed int v11; // ecx@26 + signed int v12; // [sp-4h] [bp-1Ch]@26 + Party *v13; // [sp+Ch] [bp-Ch]@1 + signed int v14; // [sp+10h] [bp-8h]@10 + signed int v15; // [sp+14h] [bp-4h]@3 + + v13 = this; + v1 = pParty->pPartyBuffs; + do + { + v1->Reset(); + ++v1; + } + while ( (signed int)v1 < (signed int)pParty->pPlayers ); + v15 = 0; + do + { + v2 = &pParty->pPlayers[v15]; + v3 = 20; + v4 = v2->pPlayerBuffs; + do + { + v4->Reset(); + ++v4; + --v3; + } + while ( v3 ); + v2->Zero(); + if ( v2->pConditions[14] || v2->pConditions[15] || v2->pConditions[16] ) + goto LABEL_33; + LODWORD(v2->pConditions[13]) = 0; + HIDWORD(v2->pConditions[13]) = 0; + LODWORD(v2->pConditions[4]) = 0; + HIDWORD(v2->pConditions[4]) = 0; + LODWORD(v2->pConditions[2]) = 0; + HIDWORD(v2->pConditions[2]) = 0; + LODWORD(v2->pConditions[3]) = 0; + HIDWORD(v2->pConditions[3]) = 0; + LODWORD(v2->pConditions[1]) = 0; + HIDWORD(v2->pConditions[1]) = 0; + v2->uTimeToRecovery = 0; + v2->sHealth = v2->GetMaxHealth(); + v5 = v2->GetMaxMana(); + v6 = v2->uClass == 35; + v2->sMana = v5; + if ( v6 ) + { + v14 = 0; + v7 = &v2->pInventoryItems[0].field_1A; + v8 = 138; + do + { + if ( *(int *)(v7 - 26) == 601 && (unsigned __int8)*v7 == v15 + 1 ) + v14 = 1; + v7 += 36; + --v8; + } + while ( v8 ); + if ( !v14 ) + { + v2->sHealth = v2->GetMaxHealth() / 2; + v2->sMana = v2->GetMaxMana() / 2; + } + } + if ( !v2->pConditions[17] ) + { + if ( v2->pConditions[10] || v2->pConditions[11] ) + { + v11 = 4; + v12 = 4; + } + else + { + if ( !v2->pConditions[8] && !v2->pConditions[9] ) + { + if ( !v2->pConditions[6] && !v2->pConditions[7] ) + goto LABEL_30; + v2->sHealth /= 2; + v10 = v2->sMana / 2; + goto LABEL_29; + } + v11 = 3; + v12 = 3; + } + v2->sHealth /= v11; + v10 = v2->sMana / v12; +LABEL_29: + v2->sMana = v10; + goto LABEL_30; + } + v9 = v2->sHealth; + v2->sMana = 0; + v2->sHealth = v9 / 2; +LABEL_30: + if ( v2->pConditions[5] ) + v2->sMana = 0; + _4909F4(); +LABEL_33: + ++v15; + } + while ( v15 < 4 ); + pParty->field_764 = 0; +} \ No newline at end of file