Mercurial > mm7
changeset 1783:a3e86ec5d3ce
Player.cpp cosmetics
author | Grumpy7 |
---|---|
date | Thu, 03 Oct 2013 06:38:20 +0200 |
parents | 421e826f4477 |
children | 644d10ad682e ebde8e43839c |
files | Items.h Player.cpp mm7_2.cpp mm7_data.h |
diffstat | 4 files changed, 174 insertions(+), 185 deletions(-) [+] |
line wrap: on
line diff
--- a/Items.h Thu Oct 03 05:56:52 2013 +0200 +++ b/Items.h Thu Oct 03 06:38:20 2013 +0200 @@ -192,13 +192,13 @@ typedef struct CEnchantment { + unsigned __int16 Player::* statPtr; + int statBonus; CEnchantment(int bonus, unsigned __int16 Player::* skillPtr = NULL): -statBonus(bonus), + statBonus(bonus), statPtr(skillPtr) -{ -} -int statBonus; -unsigned __int16 Player::* statPtr; + { + } } CEnchantment; /* 64 */
--- a/Player.cpp Thu Oct 03 05:56:52 2013 +0200 +++ b/Player.cpp Thu Oct 03 06:38:20 2013 +0200 @@ -297,7 +297,7 @@ { baseConditionMultiplier = 5; } - if ( conditionIdx == 16 ) + else //if ( conditionIdx == 16 ) { baseConditionMultiplier = 10; } @@ -900,8 +900,6 @@ //----- (004927A8) -------------------------------------------------------- int Player::AddItem(int index, unsigned int uItemID) { - int xStartValue = 0; - if ( index == -1 ) { for (int xcoord = 0; xcoord < INVETORYSLOTSWIDTH; xcoord++) @@ -1142,7 +1140,6 @@ { unsigned __int16 v2; // ax@1 int v5; // edi@7 - return true; if (CheckHiredNPCSpeciality(Scholar)) return true; @@ -2098,7 +2095,7 @@ fineIfFailed = actroPtr->pMonsterInfo.uLevel + 100 * (_steal_perm + reputation); currMaxItemValue = v29 + v7 * v30; pGlobalTXT_LocalizationStrings[200]; - if ( false && (rand() % 100 < 5 || fineIfFailed > currMaxItemValue || BYTE2(actroPtr->uAttributes) & 8) ) + if ( rand() % 100 < 5 || fineIfFailed > currMaxItemValue || BYTE2(actroPtr->uAttributes) & 8 ) { Actor::AggroSurroundingPeasants(uActorID, 1); sprintfex(pTmpBuf2.data(), pGlobalTXT_LocalizationStrings[376], this->pName); @@ -2279,6 +2276,7 @@ v4 = 0; v47 = 0; + v48 = nullptr; switch ( attTypeCast ) { case SPECIAL_ATTACK_CURSE: @@ -2873,6 +2871,8 @@ if (IsRaceHuman()) racialBonus = 5; break; + default: + Error("Unknown attribute"); } v7 = GetItemsBonus(a2) + racialBonus; return v7 + *resStat; @@ -2899,25 +2899,26 @@ v10 += leatherArmorSkillLevel & 0x3F; switch (a2) { - case CHARACTER_ATTRIBUTE_RESIST_FIRE: - resStat = &sResFireBonus; - break; - case CHARACTER_ATTRIBUTE_RESIST_AIR: - resStat = &sResAirBonus; - break; - case CHARACTER_ATTRIBUTE_RESIST_WATER: - resStat = &sResWaterBonus; - break; - case CHARACTER_ATTRIBUTE_RESIST_EARTH: - resStat = &sResEarthBonus; - break; - case CHARACTER_ATTRIBUTE_RESIST_MIND: - resStat = &sResMindBonus; - break; - case CHARACTER_ATTRIBUTE_RESIST_BODY: - case CHARACTER_ATTRIBUTE_RESIST_SPIRIT: - resStat = &sResBodyBonus; - break; + case CHARACTER_ATTRIBUTE_RESIST_FIRE: + resStat = &sResFireBonus; + break; + case CHARACTER_ATTRIBUTE_RESIST_AIR: + resStat = &sResAirBonus; + break; + case CHARACTER_ATTRIBUTE_RESIST_WATER: + resStat = &sResWaterBonus; + break; + case CHARACTER_ATTRIBUTE_RESIST_EARTH: + resStat = &sResEarthBonus; + break; + case CHARACTER_ATTRIBUTE_RESIST_MIND: + resStat = &sResMindBonus; + break; + case CHARACTER_ATTRIBUTE_RESIST_BODY: + case CHARACTER_ATTRIBUTE_RESIST_SPIRIT: + resStat = &sResBodyBonus; + break; + default: Error("Unexpected attribute"); } baseRes = GetBaseResistance(a2); result = v10 + GetMagicalBonus(a2) + baseRes + *(resStat); @@ -4295,6 +4296,7 @@ case 4: attribute_value = uAccuracy; break; case 5: attribute_value = uSpeed; break; case 6: attribute_value = uLuck; break; + default: Error("Unexpected attribute"); }; if (attribute_value == base_attribute_value) @@ -4911,6 +4913,8 @@ playerAffected->sResBodyBase += thisa; v13 = pGlobalTXT_LocalizationStrings[29]; break; + default: ("Unexpected attribute"); + return; } sprintf(pTmpBuf.data(), "+%u %s %s", thisa, v13, pGlobalTXT_LocalizationStrings[121]); break; @@ -5008,140 +5012,14 @@ int actStat; // ebx@161 int baseStat; // eax@161 - if ( VarNum > VAR_AutoNotes ) - { - switch ( VarNum ) - { - case VAR_AutoNotes : //TODO: find out why the double subtraction. or whether this is even used - test_bit_value = 0x80u >> (pValue - 2) % 8; - byteWithRequestedBit = pParty->_autonote_bits[(pValue - 2) /8]; - return (test_bit_value & byteWithRequestedBit) != 0; - case VAR_IsMightMoreThanBase: - actStat = GetActualMight(); - baseStat = GetBaseStrength(); - return (actStat >= baseStat); - case VAR_IsIntellectMoreThanBase: - actStat = GetActualIntelligence(); - baseStat = GetBaseIntelligence(); - return (actStat >= baseStat); - case VAR_IsPersonalityMoreThanBase: - actStat = GetActualWillpower(); - baseStat = GetBaseWillpower(); - return (actStat >= baseStat); - case VAR_IsEnduranceMoreThanBase: - actStat = GetActualEndurance(); - baseStat = GetBaseEndurance(); - return (actStat >= baseStat); - case VAR_IsSpeedMoreThanBase: - actStat = GetActualSpeed(); - baseStat = GetBaseSpeed(); - return (actStat >= baseStat); - case VAR_IsAccuracyMoreThanBase: - actStat = GetActualAccuracy(); - baseStat = GetBaseAccuracy(); - return (actStat >= baseStat); - case VAR_IsLuckMoreThanBase: - actStat = GetActualLuck(); - baseStat = GetBaseLuck(); - return (actStat >= baseStat); - case VAR_PlayerBits: - test_bit_value = 0x80u >> ((signed __int16)pValue - 1) % 8; - byteWithRequestedBit = this->field_1A50[((signed __int16)pValue - 1)/8]; - return ( test_bit_value & byteWithRequestedBit ) != 0; - case VAR_NPCs2: - return pNPCStats->pNewNPCData[pValue].Hired(); - case VAR_IsFlying: - if ( pParty->bFlying - && (pParty->pPartyBuffs[PARTY_BUFF_FLY].uExpireTime> 0) ) - return true; - return false; - case VAR_HiredNPCHasSpeciality: - return CheckHiredNPCSpeciality(pValue); - case VAR_CircusPrises: //isn't used in MM6 since 0x1D6u is a book of regeneration - v4 = 0; - for (int playerNum = 0; playerNum < 4; playerNum++) - { - for (int invPos = 0; invPos < 138; invPos++) - { - int itemId = pParty->pPlayers[playerNum].pInventoryItemList[invPos].uItemID; - switch ( itemId ) - { - case 0x1D6u: - ++v4; - break; - case 0x1D7u: - v4 += 3; - break; - case 0x1DDu: - v4 += 5; - break; - } - } - } - return v4 >= pValue; - case VAR_NumSkillPoints: - return this->uSkillPoints >= (unsigned int)pValue; - case VAR_MonthIs: - return (pParty->uCurrentMonth == (unsigned int)pValue); - case VAR_Counter1: - case VAR_Counter2: - case VAR_Counter3: - case VAR_Counter4: - case VAR_Counter5: - case VAR_Counter6: - case VAR_Counter7: - case VAR_Counter8: - case VAR_Counter9: - case VAR_Counter10: - if (pParty->PartyTimes.CounterEventValues[VarNum - VAR_Counter1]) //originally (signed __int64)(__PAIR__(*(int *)&stru_AA1058[3].pSounds[8 * VarNum + 44304], *(int *)&stru_AA1058[3].pSounds[8 * VarNum + 44300]) - { - return (pParty->PartyTimes.CounterEventValues[VarNum - VAR_Counter1] + 460800 * pValue * 0.033333335) <= pParty->uTimePlayed ; - } - case VAR_ReputationInCurrentLocation: - v19 = &pOutdoor->ddm; - if ( uCurrentlyLoadedLevelType != LEVEL_Outdoor ) - v19 = &pIndoor->dlv; - return (v19->uReputation >= pValue); - case VAR_Unknown1: - v21 = &pOutdoor->ddm; - if ( uCurrentlyLoadedLevelType != LEVEL_Outdoor ) - v21 = &pIndoor->dlv; - return (v21->field_C_alert == pValue); //yes, equality, not >= - case VAR_GoldInBank: - return pParty->uNumGoldInBank >= (unsigned int)pValue; - case VAR_NumDeaths: - return pParty->uNumDeaths >= (unsigned int)pValue; - case VAR_NumBounties: - return pParty->uNumBountiesCollected >= (unsigned int)pValue; - case VAR_PrisonTerms: - return pParty->uNumPrisonTerms >= pValue; - case VAR_ArenaWinsPage: - return (unsigned __int8)pParty->uNumArenaPageWins >= pValue; - case VAR_ArenaWinsSquire: - return (unsigned __int8)pParty->uNumArenaSquireWins >= pValue; - case VAR_ArenaWinsKnight: - return (unsigned __int8)pParty->uNumArenaKnightWins >= pValue; - case VAR_ArenaWinsLord: - return pParty->uNumArenaLordWins >= pValue; - case VAR_Invisible: - return ( pParty->pPartyBuffs[PARTY_BUFF_INVISIBILITY].uExpireTime > 0 ); - case VAR_ItemEquipped: - for (int i = 0; i < 16; i++) - { - if ( HasItemEquipped((ITEM_EQUIP_TYPE)i) && GetNthEquippedIndexItem(i)->uItemID == pValue ) - { - return true; - } - } - return false; - default: - return false; - } - } - if ( VarNum <= VAR_MajorCondition ) - { - switch ( VarNum ) - { + + if ( (signed int)VarNum >= VAR_MapPersistentVariable_0 && VarNum <= VAR_MapPersistentVariable_74 ) + return (unsigned __int8)stru_5E4C90_MapPersistVars.field_0[VarNum - VAR_MapPersistentVariable_0] > 0; // originally (unsigned __int8)byte_5E4C15[VarNum]; + if ( (signed int)VarNum >= VAR_MapPersistentVariable_75 && VarNum <= VAR_MapPersistentVariable_99 ) + return (unsigned __int8)stru_5E4C90_MapPersistVars._decor_events[VarNum - VAR_MapPersistentVariable_75] > 0; //not really sure whether the number gets up to 99, but can't ignore the possibility + + switch ( VarNum ) + { case VAR_Sex: return ( pValue == this->uSex ); case VAR_Class: @@ -5167,15 +5045,11 @@ case VAR_Age: return GetActualAge() >= (unsigned int)pValue; case VAR_Award: - test_bit_value = 0x80u >> (pValue - 1) % 8; - byteWithRequestedBit = this->_achieved_awards_bits[(pValue - 1) /8]; - return ( test_bit_value & byteWithRequestedBit ) != 0; + return _449B57_test_bit(this->_achieved_awards_bits, pValue); case VAR_Experience: return this->uExperience >= pValue; //TODO change pValue to long long case VAR_QBits_QuestsDone: - test_bit_value = 0x80u >> (pValue - 1) % 8; - byteWithRequestedBit = pParty->_quest_bits[(pValue - 1)/8]; - return ( test_bit_value & byteWithRequestedBit ) != 0; + return _449B57_test_bit(pParty->_quest_bits, pValue); case VAR_PlayerItemInHands: for (int i = 0; i < 138; i++) { @@ -5402,13 +5276,130 @@ return v4 >= pValue; } return true; - } - } - if ( (signed int)VarNum >= VAR_MapPersistentVariable_0 && VarNum <= VAR_MapPersistentVariable_74 ) - return (unsigned __int8)stru_5E4C90_MapPersistVars.field_0[VarNum - VAR_MapPersistentVariable_0] > 0; // originally (unsigned __int8)byte_5E4C15[VarNum]; - if ( (signed int)VarNum >= VAR_MapPersistentVariable_75 && VarNum <= VAR_MapPersistentVariable_99 ) - return (unsigned __int8)stru_5E4C90_MapPersistVars._decor_events[VarNum - VAR_MapPersistentVariable_75] > 0; //not really sure whether the number gets up to 99, but can't ignore the possibility - + case VAR_AutoNotes : //TODO: find out why the double subtraction. or whether this is even used + test_bit_value = 0x80u >> (pValue - 2) % 8; + byteWithRequestedBit = pParty->_autonote_bits[(pValue - 2) /8]; + return (test_bit_value & byteWithRequestedBit) != 0; + case VAR_IsMightMoreThanBase: + actStat = GetActualMight(); + baseStat = GetBaseStrength(); + return (actStat >= baseStat); + case VAR_IsIntellectMoreThanBase: + actStat = GetActualIntelligence(); + baseStat = GetBaseIntelligence(); + return (actStat >= baseStat); + case VAR_IsPersonalityMoreThanBase: + actStat = GetActualWillpower(); + baseStat = GetBaseWillpower(); + return (actStat >= baseStat); + case VAR_IsEnduranceMoreThanBase: + actStat = GetActualEndurance(); + baseStat = GetBaseEndurance(); + return (actStat >= baseStat); + case VAR_IsSpeedMoreThanBase: + actStat = GetActualSpeed(); + baseStat = GetBaseSpeed(); + return (actStat >= baseStat); + case VAR_IsAccuracyMoreThanBase: + actStat = GetActualAccuracy(); + baseStat = GetBaseAccuracy(); + return (actStat >= baseStat); + case VAR_IsLuckMoreThanBase: + actStat = GetActualLuck(); + baseStat = GetBaseLuck(); + return (actStat >= baseStat); + case VAR_PlayerBits: + test_bit_value = 0x80u >> ((signed __int16)pValue - 1) % 8; + byteWithRequestedBit = this->field_1A50[((signed __int16)pValue - 1)/8]; + return ( test_bit_value & byteWithRequestedBit ) != 0; + case VAR_NPCs2: + return pNPCStats->pNewNPCData[pValue].Hired(); + case VAR_IsFlying: + if ( pParty->bFlying + && (pParty->pPartyBuffs[PARTY_BUFF_FLY].uExpireTime> 0) ) + return true; + return false; + case VAR_HiredNPCHasSpeciality: + return CheckHiredNPCSpeciality(pValue); + case VAR_CircusPrises: //isn't used in MM6 since 0x1D6u is a book of regeneration + v4 = 0; + for (int playerNum = 0; playerNum < 4; playerNum++) + { + for (int invPos = 0; invPos < 138; invPos++) + { + int itemId = pParty->pPlayers[playerNum].pInventoryItemList[invPos].uItemID; + switch ( itemId ) + { + case 0x1D6u: + ++v4; + break; + case 0x1D7u: + v4 += 3; + break; + case 0x1DDu: + v4 += 5; + break; + } + } + } + return v4 >= pValue; + case VAR_NumSkillPoints: + return this->uSkillPoints >= (unsigned int)pValue; + case VAR_MonthIs: + return (pParty->uCurrentMonth == (unsigned int)pValue); + case VAR_Counter1: + case VAR_Counter2: + case VAR_Counter3: + case VAR_Counter4: + case VAR_Counter5: + case VAR_Counter6: + case VAR_Counter7: + case VAR_Counter8: + case VAR_Counter9: + case VAR_Counter10: + if (pParty->PartyTimes.CounterEventValues[VarNum - VAR_Counter1]) //originally (signed __int64)(__PAIR__(*(int *)&stru_AA1058[3].pSounds[8 * VarNum + 44304], *(int *)&stru_AA1058[3].pSounds[8 * VarNum + 44300]) + { + return (pParty->PartyTimes.CounterEventValues[VarNum - VAR_Counter1] + 460800 * pValue * 0.033333335) <= pParty->uTimePlayed ; + } + case VAR_ReputationInCurrentLocation: + v19 = &pOutdoor->ddm; + if ( uCurrentlyLoadedLevelType != LEVEL_Outdoor ) + v19 = &pIndoor->dlv; + return (v19->uReputation >= pValue); + case VAR_Unknown1: + v21 = &pOutdoor->ddm; + if ( uCurrentlyLoadedLevelType != LEVEL_Outdoor ) + v21 = &pIndoor->dlv; + return (v21->field_C_alert == pValue); //yes, equality, not >= + case VAR_GoldInBank: + return pParty->uNumGoldInBank >= (unsigned int)pValue; + case VAR_NumDeaths: + return pParty->uNumDeaths >= (unsigned int)pValue; + case VAR_NumBounties: + return pParty->uNumBountiesCollected >= (unsigned int)pValue; + case VAR_PrisonTerms: + return pParty->uNumPrisonTerms >= pValue; + case VAR_ArenaWinsPage: + return (unsigned __int8)pParty->uNumArenaPageWins >= pValue; + case VAR_ArenaWinsSquire: + return (unsigned __int8)pParty->uNumArenaSquireWins >= pValue; + case VAR_ArenaWinsKnight: + return (unsigned __int8)pParty->uNumArenaKnightWins >= pValue; + case VAR_ArenaWinsLord: + return pParty->uNumArenaLordWins >= pValue; + case VAR_Invisible: + return ( pParty->pPartyBuffs[PARTY_BUFF_INVISIBILITY].uExpireTime > 0 ); + case VAR_ItemEquipped: + for (int i = 0; i < 16; i++) + { + if ( HasItemEquipped((ITEM_EQUIP_TYPE)i) && GetNthEquippedIndexItem(i)->uItemID == pValue ) + { + return true; + } + } + return false; + } + return false; } @@ -5534,9 +5525,7 @@ this->sAgeModifier = var_value; return; case VAR_Award: - if ( !((unsigned __int8)(0x80u >> ((signed __int16)var_value - 1) % 8) & - this->_achieved_awards_bits[((signed __int16)var_value - 1)/ 8]) //&& dword_723E80_award_related[2 * a3] ) - && pAwards[var_value].pText ) + if ( !_449B57_test_bit(this->_achieved_awards_bits, var_value) && pAwards[var_value].pText ) { PlayAwardSound_Anim(currPlayerId); this->PlaySound(SPEECH_96, 0); @@ -5548,8 +5537,7 @@ PlayAwardSound_Anim(currPlayerId); return; case VAR_QBits_QuestsDone: - if ( !((unsigned __int8)(0x80u >> ((signed __int16)var_value - 1) % 8) & pParty->_quest_bits[((signed __int16)var_value - 1) >> 3])// && (&dword_722F10)[4 * a3] ) - && pQuestTable[var_value-1] ) + if ( !_449B57_test_bit(pParty->_quest_bits, var_value) && pQuestTable[var_value-1] ) { bFlashQuestBook = 1; pGame->pStru6Instance->SetPlayerBuffAnim(0x96u, currPlayerId); @@ -5807,8 +5795,7 @@ PlayAwardSound_Anim(currPlayerId); return; case VAR_AutoNotes: - if ( !((unsigned __int8)(0x80u >> ((signed __int16)var_value - 1) % 8) & pParty->_autonote_bits[((signed __int16)var_value - 1) >> 3]) //&& (&dword_723718_autonote_related)[8 * a3] ) - && pAutonoteTxt[var_value-1].pText ) + if ( !_449B57_test_bit(pParty->_autonote_bits, var_value) && pAutonoteTxt[var_value-1].pText ) { pGame->pStru6Instance->SetPlayerBuffAnim(0x96u, currPlayerId); this->PlaySound(SPEECH_96, 0); @@ -7400,6 +7387,7 @@ case 1 : soundToPlay = (SoundID)109; break; case 2 : soundToPlay = (SoundID)110; break; case 3 : soundToPlay = (SoundID)44; break; + default: Error("Unexpected sound value"); } } else @@ -7411,6 +7399,7 @@ case 1 : soundToPlay = (SoundID)106; break; case 2 : soundToPlay = (SoundID)107; break; case 3 : soundToPlay = (SoundID)45; break; + default: Error("Unexpected sound value"); } } pAudioPlayer->PlaySound(soundToPlay, PID(OBJECT_Player,a4 + 80), 0, -1, 0, 0, 0, 0);
--- a/mm7_2.cpp Thu Oct 03 05:56:52 2013 +0200 +++ b/mm7_2.cpp Thu Oct 03 06:38:20 2013 +0200 @@ -2736,7 +2736,7 @@ } //----- (00458244) -------------------------------------------------------- -int SkillToMastery( unsigned int skill_value ) +unsigned int SkillToMastery( unsigned int skill_value ) { switch (skill_value & 0x1C0) {
--- a/mm7_data.h Thu Oct 03 05:56:52 2013 +0200 +++ b/mm7_data.h Thu Oct 03 06:38:20 2013 +0200 @@ -1154,7 +1154,7 @@ char *GetEventHintString(unsigned int uEventID); // idb int GetTravelTime(); void __fastcall sub_4451A8_press_any_key(int a1, int a2, int a4); -int SkillToMastery(unsigned int skill_value); +unsigned int SkillToMastery(unsigned int skill_value); unsigned int __fastcall GetSpellColor(signed int a1); unsigned short * MakeScreenshot(signed int width, signed int height); void SaveScreenshot(const char *pFilename);