# HG changeset patch # User Grumpy7 # Date 1396394465 -7200 # Node ID 9551756f46c495c09efe88f1fe54a935cdba74e8 # Parent 5133eea7a4cafde5e9f9fbfc387e039be57fe228 Moving functions out of mm7_6.cpp into appropriate classes as static methods or free functions diff -r 5133eea7a4ca -r 9551756f46c4 Actor.cpp --- a/Actor.cpp Tue Apr 01 23:44:27 2014 +0200 +++ b/Actor.cpp Wed Apr 02 01:21:05 2014 +0200 @@ -1999,7 +1999,7 @@ if (rand() % 100 < 20 && drop.uItemID != 0) { - sub_42F7EB_DropItemAt(pItemsTable->pItems[drop.uItemID].uSpriteID, + SpriteObject::sub_42F7EB_DropItemAt(pItemsTable->pItems[drop.uItemID].uSpriteID, actor->vPosition.x, actor->vPosition.y, actor->vPosition.z + 16, diff -r 5133eea7a4ca -r 9551756f46c4 Build/Visual Studio 2012/World of Might and Magic.vcxproj --- a/Build/Visual Studio 2012/World of Might and Magic.vcxproj Tue Apr 01 23:44:27 2014 +0200 +++ b/Build/Visual Studio 2012/World of Might and Magic.vcxproj Wed Apr 02 01:21:05 2014 +0200 @@ -202,6 +202,7 @@ + diff -r 5133eea7a4ca -r 9551756f46c4 Build/Visual Studio 2012/World of Might and Magic.vcxproj.filters --- a/Build/Visual Studio 2012/World of Might and Magic.vcxproj.filters Tue Apr 01 23:44:27 2014 +0200 +++ b/Build/Visual Studio 2012/World of Might and Magic.vcxproj.filters Wed Apr 02 01:21:05 2014 +0200 @@ -385,6 +385,7 @@ lib\libpng + diff -r 5133eea7a4ca -r 9551756f46c4 CastSpellInfo.cpp --- a/CastSpellInfo.cpp Tue Apr 01 23:44:27 2014 +0200 +++ b/CastSpellInfo.cpp Wed Apr 02 01:21:05 2014 +0200 @@ -3212,7 +3212,7 @@ v642 = rand() % 4096 - 2048; v643 = rand(); v732 = GetTerrainHeightsAroundParty2(v642 + pParty->vPosition.x, pParty->vPosition.y + (v643 % 4096 - 2048), &v710, 0); - sub_42F7EB_DropItemAt(4070, v642 + pParty->vPosition.x, pParty->vPosition.y + (v643 % 4096 - 2048), v732 + 16, rand() % 500 + 500, 1, 0, 0, 0); + SpriteObject::sub_42F7EB_DropItemAt(4070, v642 + pParty->vPosition.x, pParty->vPosition.y + (v643 % 4096 - 2048), v732 + 16, rand() % 500 + 500, 1, 0, 0, 0); } spell_sound_flag = true; break; diff -r 5133eea7a4ca -r 9551756f46c4 Chest.cpp --- a/Chest.cpp Tue Apr 01 23:44:27 2014 +0200 +++ b/Chest.cpp Wed Apr 02 01:21:05 2014 +0200 @@ -132,7 +132,7 @@ v.y = pObjectY; v.z = pObjectZ; Vec3_int_::Rotate(pDepth, sRotX, sRotY, v, &pOut.x, &pOut.z, &pOut.y); - sub_42F7EB_DropItemAt(pSpriteID[pRandom], pOut.x, pOut.z, pOut.y, 0, 1, 0, 48, 0); + SpriteObject::sub_42F7EB_DropItemAt(pSpriteID[pRandom], pOut.x, pOut.z, pOut.y, 0, 1, 0, 48, 0); pSpellObject.stru_24.Reset(); pSpellObject.spell_skill = 0; diff -r 5133eea7a4ca -r 9551756f46c4 Events.cpp --- a/Events.cpp Tue Apr 01 23:44:27 2014 +0200 +++ b/Events.cpp Wed Apr 02 01:21:05 2014 +0200 @@ -12,6 +12,7 @@ #include "Render.h" #include "GUIWindow.h" #include "GUIProgressBar.h" +#include "SpriteObject.h" #include "Chest.h" #include "stru176.h" #include "LOD.h" @@ -758,7 +759,7 @@ ++curr_seq_num; break; case EVENT_SummonItem: - sub_42F7EB_DropItemAt(_evt->v5 + ((_evt->v6 + ((_evt->v7 + ((uint)_evt->v8 << 8)) << 8)) << 8), + SpriteObject::sub_42F7EB_DropItemAt(_evt->v5 + ((_evt->v6 + ((_evt->v7 + ((uint)_evt->v8 << 8)) << 8)) << 8), _evt->v9 + ((_evt->v10 + ((_evt->v11 + ((uint)_evt->v12 << 8)) << 8)) << 8), _evt->v13 + ((_evt->v14 + ((_evt->v15 + ((uint)_evt->v16 << 8)) << 8)) << 8), _evt->v17 + ((_evt->v18 + ((_evt->v19 + ((uint)_evt->v20 << 8)) << 8)) << 8), diff -r 5133eea7a4ca -r 9551756f46c4 GUIWindow.cpp --- a/GUIWindow.cpp Tue Apr 01 23:44:27 2014 +0200 +++ b/GUIWindow.cpp Wed Apr 02 01:21:05 2014 +0200 @@ -2537,4 +2537,20 @@ strcat(pTmpBuf.data(), pTmpBuf2.data()); } window->DrawText(Font, 32, uY, 0, pTmpBuf.data(), 0, 0, 0); +} + + +//----- (0042EB8D) -------------------------------------------------------- +void GUIMessageQueue::AddMessageImpl(UIMessageType msg, int param, unsigned int a4, const char *file, int line) +{ + //Log::Warning(L"%s @ (%S %u)", UIMessage2String(msg), file, line); + if (uNumMessages < 40) + { + files[uNumMessages] = file; + lines[uNumMessages] = line; + + pMessages[uNumMessages].eType = msg; + pMessages[uNumMessages].param = param; + pMessages[uNumMessages++].field_8 = a4; + } } \ No newline at end of file diff -r 5133eea7a4ca -r 9551756f46c4 Game.cpp --- a/Game.cpp Tue Apr 01 23:44:27 2014 +0200 +++ b/Game.cpp Wed Apr 02 01:21:05 2014 +0200 @@ -333,7 +333,7 @@ } pGame->_44EEA7(); GameUI_WritePointedObjectStatusString(); - ProcessInputActions(); + Keyboard::ProcessInputActions(); GameUI_MsgProc(); if ( pArcomageGame->bGameInProgress ) { @@ -3441,13 +3441,13 @@ continue; if ( pParty->bTurnBasedModeOn != 1 ) { - _42ECB5_PlayerAttacksActor(); + Player::_42ECB5_PlayerAttacksActor(); continue; } if ( pTurnEngine->turn_stage == TE_WAIT || pTurnEngine->turn_stage == TE_MOVEMENT ) continue; if ( !(pTurnEngine->field_18 & TE_HAVE_PENDING_ACTIONS) ) - _42ECB5_PlayerAttacksActor(); + Player::_42ECB5_PlayerAttacksActor(); continue; case UIMSG_ExitRest: GUIWindow::Create(pButton_RestUI_Exit->uX, pButton_RestUI_Exit->uY, 0, 0, WINDOW_CloseRestWindowBtn, (int)pButton_RestUI_Exit, pGlobalTXT_LocalizationStrings[81]);// "Exit Rest" @@ -4560,4 +4560,22 @@ } while ( pMessageQueue_50CBD0->uNumMessages ); } +} + + + +//----- (0042FBDD) -------------------------------------------------------- +void sub_42FBDD() +{ + pAudioPlayer->PlaySound(SOUND_Button2, 0, 0, -1, 0, 0, 0, 0); + pRenderer->DrawTextureTransparent(pBtn_YES->uX, pBtn_YES->uY, pBtn_YES->pTextures[0]); + pRenderer->Present(); +} + +//----- (0042FC15) -------------------------------------------------------- +void CloseWindowBackground() +{ + pAudioPlayer->PlaySound(SOUND_Button2, -2, 0, -1, 0, 0, 0, 0); + pRenderer->DrawTextureTransparent(pBtn_ExitCancel->uX, pBtn_ExitCancel->uY, pBtn_ExitCancel->pTextures[0]); + pRenderer->Present(); } \ No newline at end of file diff -r 5133eea7a4ca -r 9551756f46c4 Keyboard.cpp --- a/Keyboard.cpp Tue Apr 01 23:44:27 2014 +0200 +++ b/Keyboard.cpp Wed Apr 02 01:21:05 2014 +0200 @@ -8,6 +8,11 @@ #include "Vis.h" #include "MM7.h" #include "Actor.h" +#include "Party.h" +#include "Timer.h" +#include "TurnEngine.h" +#include "Weather.h" +#include "CastSpellInfo.h" #include "DecorationList.h" #include "Indoor.h" #include "viewport.h" @@ -478,3 +483,382 @@ break; }*/ } + + +//----- (0042FC4E) -------------------------------------------------------- +void Keyboard::ProcessInputActions() +{ + char v4; // al@9 + //char v8; // bl@100 + unsigned __int16 v9; // ax@102 + int spell_price; // eax@103 + char v14; // al@159 + unsigned int v15; // eax@168 + PartyAction partyAction; // [sp-14h] [bp-1Ch]@20 + InputAction inputAction; // [sp+0h] [bp-8h]@7 + //int v24; // [sp+4h] [bp-4h]@87 + + pGame->pKeyboardInstance->EnterCriticalSection(); + Keyboard* pKeyboard = pGame->pKeyboardInstance; + if (!bAlwaysRun) + { + if (pKeyboard->IsShiftHeld()) + pParty->uFlags2 |= PARTY_FLAGS_2_RUNNING; + else + pParty->uFlags2 &= ~PARTY_FLAGS_2_RUNNING; + } + else + { + if (pKeyboard->IsShiftHeld()) + pParty->uFlags2 &= ~PARTY_FLAGS_2_RUNNING; + else + pParty->uFlags2 |= PARTY_FLAGS_2_RUNNING; + } + + //pParty->uFlags2 |= PARTY_FLAGS_2_RUNNING; + + + // 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 ) + { + if (pCurrentScreen == SCREEN_GAME) + { + pMessageQueue_50CBD0->AddMessage(UIMSG_Game_Action, 0, 0); + continue; + } + if ( pCurrentScreen == SCREEN_NPC_DIALOGUE || pCurrentScreen == SCREEN_BRANCHLESS_NPC_DIALOG ) + { + v15 = pMessageQueue_50CBD0->uNumMessages; + if ( pMessageQueue_50CBD0->uNumMessages ) + { + v15 = 0; + if ( pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].field_8 ) + { + v15 = 1; + pMessageQueue_50CBD0->uNumMessages = 0; + pMessageQueue_50CBD0->pMessages[v15].eType = UIMSG_Escape; + pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].param = 0; + *(&pMessageQueue_50CBD0->uNumMessages + 3 * pMessageQueue_50CBD0->uNumMessages + 3) = 0; + ++pMessageQueue_50CBD0->uNumMessages; + continue; + } + pMessageQueue_50CBD0->uNumMessages = 0; + } + //pMessageQueue_50CBD0->AddMessage(UIMSG_Escape, 0, 0); + } + } + }*/ + if ( !pEventTimer->bPaused ) + { + for ( uint i = 0; i < 30; ++i ) + { + inputAction = (InputAction)i; + if ( pKeyActionMap->pToggleTypes[inputAction] ) + v4 = pKeyboard->WasKeyPressed(pKeyActionMap->pVirtualKeyCodesMapping[inputAction]); + else + v4 = pKeyboard->IsKeyBeingHeld(pKeyActionMap->pVirtualKeyCodesMapping[inputAction]); + if ( v4 ) + { + switch ( inputAction ) + { + case INPUT_MoveForward: + if (pCurrentScreen != SCREEN_GAME) + break; + if (!pParty->bTurnBasedModeOn) + { + if ( pParty->uFlags2 & PARTY_FLAGS_2_RUNNING) + partyAction = PARTY_RunForward; + else + partyAction = PARTY_WalkForward; + pPartyActionQueue->Add(partyAction); + break; + } + if (pTurnEngine->turn_stage != TE_WAIT && pTurnEngine->turn_stage != TE_ATTACK && pTurnEngine->uActionPointsLeft > 0 ) + { + pTurnEngine->uActionPointsLeft -= 26; + if ( pParty->uFlags2 & PARTY_FLAGS_2_RUNNING) + partyAction = PARTY_RunForward; + else + partyAction = PARTY_WalkForward; + pPartyActionQueue->Add(partyAction); + break; + } + break; + case INPUT_MoveBackwards: + if (pCurrentScreen != SCREEN_GAME) + break; + if (!pParty->bTurnBasedModeOn) + { + if ( pParty->uFlags2 & 2 ) + partyAction = PARTY_RunBackward; + else + partyAction = PARTY_WalkBackward; + pPartyActionQueue->Add(partyAction); + break; + } + if ( pTurnEngine->turn_stage != TE_WAIT && pTurnEngine->turn_stage != TE_ATTACK && pTurnEngine->uActionPointsLeft > 0 ) + { + pTurnEngine->uActionPointsLeft -= 26; + if ( pParty->uFlags2 & 2 ) + partyAction = PARTY_RunBackward; + else + partyAction = PARTY_WalkBackward; + pPartyActionQueue->Add(partyAction); + break; + } + break; + case INPUT_StrafeLeft: + if (pCurrentScreen != SCREEN_GAME) + break; + if (!pParty->bTurnBasedModeOn) + { + partyAction = PARTY_StrafeLeft; + pPartyActionQueue->Add(partyAction); + break; + } + if ( pTurnEngine->turn_stage == TE_WAIT || pTurnEngine->turn_stage == TE_ATTACK || pTurnEngine->uActionPointsLeft <= 0 ) + break; + pTurnEngine->uActionPointsLeft -= 26; + partyAction = PARTY_StrafeLeft; + pPartyActionQueue->Add(partyAction); + break; + case INPUT_StrafeRight: + if (pCurrentScreen != SCREEN_GAME) + break; + if (!pParty->bTurnBasedModeOn) + { + partyAction = PARTY_StrafeRight; + pPartyActionQueue->Add(partyAction); + break; + } + if ( pTurnEngine->turn_stage == TE_WAIT || pTurnEngine->turn_stage == TE_ATTACK || pTurnEngine->uActionPointsLeft <= 0 ) + break; + pTurnEngine->uActionPointsLeft -= 26; + partyAction = PARTY_StrafeRight; + pPartyActionQueue->Add(partyAction); + break; + case INPUT_TurnLeft: + if (pCurrentScreen != SCREEN_GAME) + break; + if ( GetAsyncKeyState(VK_CONTROL) ) // strafing + { + if (pParty->bTurnBasedModeOn) + { + if ( pTurnEngine->turn_stage == TE_WAIT || pTurnEngine->turn_stage == TE_ATTACK || pTurnEngine->uActionPointsLeft <= 0 ) + break; + pTurnEngine->uActionPointsLeft -= 26; + } + partyAction = PARTY_StrafeLeft; + } + else + { + if ( pParty->uFlags2 & 2 ) + partyAction = PARTY_FastTurnLeft; + else + partyAction = PARTY_TurnLeft; + } + pPartyActionQueue->Add(partyAction); + if (uCurrentlyLoadedLevelType == LEVEL_Outdoor && pWeather->bRenderSnow) + pWeather->OnPlayerTurn(10); + break; + case INPUT_TurnRight: + if (pCurrentScreen != SCREEN_GAME) + break; + if ( GetAsyncKeyState(17) ) // strafing + { + if (pParty->bTurnBasedModeOn) + { + if ( pTurnEngine->turn_stage == TE_WAIT || pTurnEngine->turn_stage == TE_ATTACK || pTurnEngine->uActionPointsLeft <= 0 ) + break; + pTurnEngine->uActionPointsLeft -= 26; + } + partyAction = PARTY_StrafeRight; + } + else + { + if ( pParty->uFlags2 & 2 ) + partyAction = PARTY_FastTurnRight; + else + partyAction = PARTY_TurnRight; + } + pPartyActionQueue->Add(partyAction); + if (uCurrentlyLoadedLevelType == LEVEL_Outdoor && pWeather->bRenderSnow) + pWeather->OnPlayerTurn(-10); + break; + case INPUT_Jump: + if (pCurrentScreen != SCREEN_GAME || pParty->bTurnBasedModeOn) + break; + partyAction = (PartyAction)12; + pPartyActionQueue->Add(partyAction); + break; + case INPUT_Yell: + if (!pCurrentScreen && uActiveCharacter) + { + pParty->Yell(); + pPlayers[uActiveCharacter]->PlaySound(SPEECH_Yell, 0); + } + break; + case INPUT_Pass: + if ( pCurrentScreen ) + break; + if (pParty->bTurnBasedModeOn && pTurnEngine->turn_stage == TE_MOVEMENT) + { + pTurnEngine->field_18 |= TE_FLAG_8; + break; + } + if ( uActiveCharacter ) + { + if ( !pPlayers[uActiveCharacter]->uTimeToRecovery ) + { + if ( !pParty->bTurnBasedModeOn ) + pPlayers[uActiveCharacter]->SetRecoveryTime((signed __int64)(flt_6BE3A4_debug_recmod1 * (double)pPlayers[uActiveCharacter]->GetAttackRecoveryTime(false) * 2.133333333333333)); + CastSpellInfoHelpers::_427D48(); + pTurnEngine->ApplyPlayerAction(); + } + } + break; + case INPUT_Combat://if press ENTER + if (pCurrentScreen == SCREEN_GAME) + { + if (pParty->bTurnBasedModeOn) + { + if (pTurnEngine->turn_stage == TE_MOVEMENT || PID_TYPE(pTurnEngine->pQueue[0].uPackedID) == OBJECT_Player) + { + pParty->bTurnBasedModeOn = 0; + pTurnEngine->End(true); + } + } + else + { + pTurnEngine->Start(); + pParty->bTurnBasedModeOn = true; + } + } + break; + case INPUT_CastReady: + if (pCurrentScreen != SCREEN_GAME) + break; + if (pParty->bTurnBasedModeOn && pTurnEngine->turn_stage == TE_MOVEMENT) + { + pTurnEngine->field_18 |= TE_FLAG_8; + break; + } + if ( !uActiveCharacter ) + break; + v9 = pPlayers[uActiveCharacter]->pActiveSkills[(unsigned __int8)pPlayers[uActiveCharacter]->uQuickSpell / 11 + 12]; + if ( !pPlayers[uActiveCharacter]->uQuickSpell || bUnderwater + || (( !(HIBYTE(v9) & 1)) ? + ((v9 & 0x80) == 0 ? + ((v9 & 0x40) == 0 ? spell_price = pSpellDatas[pPlayers[uActiveCharacter]->uQuickSpell].uNormalLevelMana : spell_price = pSpellDatas[pPlayers[uActiveCharacter]->uQuickSpell].uExpertLevelMana) : + spell_price = pSpellDatas[pPlayers[uActiveCharacter]->uQuickSpell].uMasterLevelMana) : + spell_price = pSpellDatas[pPlayers[uActiveCharacter]->uQuickSpell].uMagisterLevelMana, + spell_price > pPlayers[uActiveCharacter]->sMana) ) + { + pPartyActionQueue = pPartyActionQueue; + pMessageQueue_50CBD0->AddMessage(UIMSG_Attack, 0, 0); + break; + } + else + pMessageQueue_50C9E8->AddMessage(UIMSG_CastQuickSpell, 0, 0); + break; + case INPUT_Attack: + if (pCurrentScreen != SCREEN_GAME) + break; + if (pParty->bTurnBasedModeOn == true && pTurnEngine->turn_stage == TE_MOVEMENT) + { + pTurnEngine->field_18 |= TE_FLAG_8; + break; + } + pMessageQueue_50CBD0->AddMessage(UIMSG_Attack, 0, 0); + break; + case INPUT_EventTrigger: + if (pCurrentScreen == SCREEN_GAME) + { + pMessageQueue_50CBD0->AddMessage(UIMSG_Game_Action, 0, 0); + break; + } + if ( pCurrentScreen == SCREEN_NPC_DIALOGUE ) + { + if ( pMessageQueue_50CBD0->uNumMessages ) + { + pMessageQueue_50CBD0->uNumMessages = 0; + if ( pMessageQueue_50CBD0->pMessages[0].field_8 ) + { + pMessageQueue_50CBD0->uNumMessages = 1; + pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].eType = UIMSG_Escape; + pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].param = 0; + pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].field_8 = 0; + ++pMessageQueue_50CBD0->uNumMessages; + break; + } + break; + } + pMessageQueue_50CBD0->AddMessage(UIMSG_Escape, 0, 0); + } + break; + case INPUT_CharCycle: + if ( pCurrentScreen == SCREEN_SPELL_BOOK ) + break; + + pMessageQueue_50C9E8->AddMessage(UIMSG_CycleCharacters, 0, 0); + break; + case INPUT_LookUp: + if ( pEventTimer->bPaused ) + break; + partyAction = (PartyAction)7; + pPartyActionQueue->Add(partyAction); + break; + case INPUT_CenterView: + if ( pEventTimer->bPaused ) + break; + partyAction = (PartyAction)9; + pPartyActionQueue->Add(partyAction); + break; + case INPUT_LookDown: + if ( pEventTimer->bPaused ) + break; + partyAction = (PartyAction)8; + pPartyActionQueue->Add(partyAction); + break; + case INPUT_FlyUp: + if ( pCurrentScreen || pEventTimer->bPaused ) + break; + partyAction = (PartyAction)13; + pPartyActionQueue->Add(partyAction); + break; + case INPUT_Land: + if ( pCurrentScreen || pEventTimer->bPaused ) + break; + partyAction = (PartyAction)15; + pPartyActionQueue->Add(partyAction); + break; + case INPUT_FlyDown: + if ( !pCurrentScreen + && !pEventTimer->bPaused ) + { + partyAction = (PartyAction)14; + pPartyActionQueue->Add(partyAction); + } + break; + case INPUT_ZoomIn: + pMessageQueue_50C9E8->AddMessage(UIMSG_ClickZoomOutBtn, 0, 0); + break; + case INPUT_ZoomOut: + pMessageQueue_50C9E8->AddMessage(UIMSG_ClickZoomInBtn, 0, 0); + break; + case INPUT_AlwaysRun: + bAlwaysRun = bAlwaysRun == 0; + break; + default: + break; + } + } + } + } +} diff -r 5133eea7a4ca -r 9551756f46c4 Keyboard.h --- a/Keyboard.h Tue Apr 01 23:44:27 2014 +0200 +++ b/Keyboard.h Wed Apr 02 01:21:05 2014 +0200 @@ -85,6 +85,7 @@ {} bool WasKeyPressed(int vKey); static bool IsKeyBeingHeld(int vKey); + static void ProcessInputActions(); bool IsShiftHeld(); void EnterCriticalSection(); diff -r 5133eea7a4ca -r 9551756f46c4 OurMath.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OurMath.cpp Wed Apr 02 01:21:05 2014 +0200 @@ -0,0 +1,201 @@ +#include "OurMath.h" +#include "MM7_data.h" + +//----- (00452969) -------------------------------------------------------- +stru193_math::stru193_math() +{ + double v3; // ST18_8@2 + + this->pTanTable[0] = 0; + this->pCosTable[0] = 65536; + this->pInvCosTable[0] = 65536; + for(int i = 1; i < (signed int)this->uIntegerHalfPi; i++) + { + v3 = (double)i * 3.141592653589793 / (double)uIntegerPi; + pTanTable[i] = (signed __int64)(tan(v3) * (double)this->pCosTable[0] + 0.5); + pCosTable[i] = (signed __int64)(cos(v3) * (double)this->pCosTable[0] + 0.5); + pInvCosTable[i] = (signed __int64)(1.0 / cos(v3) * (double)this->pCosTable[0] + 0.5); + } + for(int i = this->uIntegerHalfPi; i < 520; i++) + { + this->pTanTable[i] = 0xEFFFFFFFu; + this->pCosTable[i] = 0; + this->pInvCosTable[i] = 0xEFFFFFFFu; + } +} + + +//----- (00402CAE) -------------------------------------------------------- +int stru193_math::Cos(int angle) +{ + int v2; // eax@1 + + //a2: (angle - uIntegerHalfPi) for sin(angle) + // (angle) for cos(angle) + + v2 = uDoublePiMask & angle; + + if ( v2 > uIntegerPi ) + v2 = uIntegerDoublePi - v2; + if ( v2 >= uIntegerHalfPi ) + return -pCosTable[uIntegerPi - v2]; + else + return pCosTable[v2]; +} + + +//----- (0045281E) -------------------------------------------------------- +// Calculates atan2(y/x) +// return value: angle in integer format (multiplier of Pi/1024) +unsigned int stru193_math::Atan2(int x, int y) +{ + signed int quadrant; + __int64 dividend; + int quotient; + int lowIdx; + int highIdx; + int angle; + + int X = x; + int Y = y; + + if ( abs(X) < 65536 ) + { + if ( (abs(Y) >> 15) >= abs(X) ) + X = 0; + } + + if ( !X ) + { + if ( Y > 0 ) + { + return uIntegerHalfPi; //Pi/2 + } + else + { + return uIntegerHalfPi + uIntegerPi; //3*(Pi/2) + } + } + + if ( Y ) + { + if ( X < 0 ) + { + X = -X; + if ( Y > 0 ) + { + quadrant = 4; + } + else + { + quadrant = 3; + } + } + else + { + if ( Y > 0 ) + { + quadrant = 1; + } + else + { + quadrant = 2; + } + } + + if ( Y < 0 ) + Y = -Y; + + LODWORD(dividend) = Y << 16; + HIDWORD(dividend) = Y >> 16; + quotient = dividend / X; + + //looks like binary search + { + int i; + highIdx = uIntegerHalfPi; + lowIdx = 0; + + for (i = 0; i < 6; ++i) + { + if (quotient <= pTanTable[(lowIdx + highIdx) / 2]) + highIdx = (lowIdx + highIdx) / 2; + else + lowIdx = (lowIdx + highIdx) / 2; + } + } + + angle = lowIdx + 1; + while ( angle < (highIdx - 1) && quotient >= pTanTable[angle] ) + ++angle; + + switch (quadrant) + { + case 1: //X > 0, Y > 0 + return angle; + + case 2: //X > 0, Y < 0 + return uIntegerDoublePi - angle; //2*Pi - angle + + case 3: //X > 0, Y < 0 + return uIntegerPi + angle; //Pi + angle + + case 4: //X < 0, Y > 0 + return uIntegerPi - angle; //Pi - angle + } + + //should newer get here + return 0; + } + + if ( X < 0 ) //Y == 0, X < 0 + return uIntegerPi; + + return 0; +} + +//----- (0042EBDB) -------------------------------------------------------- +int stru193_math::Sin(int angle) +{ + return Cos(angle - this->uIntegerHalfPi); +} + +//----- (0042EBBE) -------------------------------------------------------- +//----- (004453C0) mm6----------------------------------------------------- +//----- (004A1760) mm6_chinese--------------------------------------------- +__int64 fixpoint_mul(int a1, int a2) +{ + return ((__int64)a1 * (__int64)a2) >> 16; +} + +__int64 fixpoint_dot(int x1, int x2, int y1, int y2, int z1, int z2) +{ + return fixpoint_mul(x1, x2) + + fixpoint_mul(y1, y2) + + fixpoint_mul(z1, z2); +} + +//----- (004A1780) mm6_chinese--------------------------------------------- +__int64 fixpoint_div(int a1, int a2) +{ + return ((__int64)a1 << 16) / a2; +} + +__int64 fixpoint_sub_unknown(int a1, int a2) +{ + return (((__int64)a1 << 16) * a2) >> 16; +} + +//----- (0048B561) -------------------------------------------------------- +int fixpoint_from_float(float val) +{ + // float X.Yf -> int XXXX YYYY + int left = floorf((val - 0.5f) + 0.5f); + int right = floorf((val - left) * 65536.0f); + return (left << 16) | right; +} + +int fixpoint_from_int(int lhv, int rhv) +{ + return (lhv << 16) | rhv; +} \ No newline at end of file diff -r 5133eea7a4ca -r 9551756f46c4 Outdoor.cpp --- a/Outdoor.cpp Tue Apr 01 23:44:27 2014 +0200 +++ b/Outdoor.cpp Wed Apr 02 01:21:05 2014 +0200 @@ -3858,7 +3858,7 @@ else if ( pZ < v111 )// подъём в горку { if ( is_on_water && fall_speed ) - sub_42F960_create_object(pX, pY, v111); + SpriteObject::sub_42F960_create_object(pX, pY, v111); fall_speed = 0; pZ = v111; pParty->uFallStartY = v111; diff -r 5133eea7a4ca -r 9551756f46c4 Player.cpp --- a/Player.cpp Tue Apr 01 23:44:27 2014 +0200 +++ b/Player.cpp Wed Apr 02 01:21:05 2014 +0200 @@ -22,6 +22,8 @@ #include "texts.h" #include "stru123.h" +#include "stru298.h" +#include "ObjectList.h" #include "mm7_data.h" #include "MM7.h" #include "SpriteObject.h" @@ -7957,4 +7959,208 @@ attNegativeMod = effectiveActorArmor + 15; } return (attPositiveMod > attNegativeMod); +} + + +//----- (0042ECB5) -------------------------------------------------------- +void Player::_42ECB5_PlayerAttacksActor() +{ + char *v5; // eax@8 + unsigned int v9; // ecx@21 + char *v11; // eax@26 + unsigned int v12; // eax@47 + SoundID v24; // [sp-4h] [bp-40h]@58 + + //result = pParty->pPlayers[uActiveCharacter-1].CanAct(); + Player* player = &pParty->pPlayers[uActiveCharacter - 1]; + if (!player->CanAct()) + return; + + CastSpellInfoHelpers::_427D48(); + //v3 = 0; + if (pParty->Invisible()) + pParty->pPartyBuffs[PARTY_BUFF_INVISIBILITY].Reset(); + + //v31 = player->pEquipment.uBow; + int bow_idx = player->pEquipment.uBow; + if (bow_idx && player->pInventoryItemList[bow_idx - 1].IsBroken()) + bow_idx = 0; + + //v32 = 0; + int wand_item_id = 0; + //v33 = 0; + //v4 = v1->pEquipment.uMainHand; + int laser_weapon_item_id = 0; + + int main_hand_idx = player->pEquipment.uMainHand; + if (main_hand_idx) + { + ItemGen* item = &player->pInventoryItemList[main_hand_idx - 1]; + //v5 = (char *)v1 + 36 * v4; + if (!item->IsBroken()) + { + //v28b = &v1->pInventoryItems[v4].uItemID; + //v6 = v1->pInventoryItems[v4].uItemID;//*((int *)v5 + 124); + if (item->GetItemEquipType() == EQUIP_WAND) + { + if (item->uNumCharges <= 0) + player->pEquipment.uMainHand = 0; // wand discharged - unequip + else + wand_item_id = item->uItemID;//*((int *)v5 + 124); + } + else if (item->uItemID == ITEM_BLASTER || item->uItemID == ITEM_LASER_RIFLE) + laser_weapon_item_id = item->uItemID;//*((int *)v5 + 124); + } + } + + //v30 = 0; + //v29 = 0; + //v28 = 0; + //v7 = pMouse->uPointingObjectID; + + int target_pid = pMouse->uPointingObjectID; + int target_type = PID_TYPE(target_pid), + target_id = PID_ID(target_pid); + if (target_type != OBJECT_Actor || !pActors[target_id].CanAct()) + { + target_pid = stru_50C198.FindClosestActor(5120, 0, 0); + target_type = PID_TYPE(target_pid); + target_id = PID_ID(target_pid); + } + + Actor* actor = &pActors[target_id]; + int actor_distance = 0; + if (target_type == OBJECT_Actor) + { + int distance_x = actor->vPosition.x - pParty->vPosition.x, + distance_y = actor->vPosition.y - pParty->vPosition.y, + distance_z = actor->vPosition.z - pParty->vPosition.z; + actor_distance = integer_sqrt(distance_x * distance_x + distance_y * distance_y + distance_z * distance_z) - actor->uActorRadius; + if (actor_distance < 0) + actor_distance = 0; + } + + bool shooting_bow = false, + shotting_laser = false, + shooting_wand = false, + melee_attack = false; + if (laser_weapon_item_id) + { + shotting_laser = true; + _42777D_CastSpell_UseWand_ShootArrow(SPELL_LASER_PROJECTILE, uActiveCharacter - 1, 0, 0, uActiveCharacter + 8); + } + else if (wand_item_id) + { + shooting_wand = true; + + int main_hand_idx = player->pEquipment.uMainHand; + _42777D_CastSpell_UseWand_ShootArrow(wand_spell_ids[player->pInventoryItemList[main_hand_idx - 1].uItemID - ITEM_WAND_FIRE], uActiveCharacter - 1, 8, 0, uActiveCharacter + 8); + + if (!--player->pInventoryItemList[main_hand_idx - 1].uNumCharges) + player->pEquipment.uMainHand = 0; + } + else if (target_type == OBJECT_Actor && actor_distance <= 407.2) + { + melee_attack = true; + + Vec3_int_ a3; + a3.x = actor->vPosition.x - pParty->vPosition.x; + a3.y = actor->vPosition.y - pParty->vPosition.y; + a3.z = actor->vPosition.z - pParty->vPosition.z; + Vec3_int_::Normalize(&a3.x, &a3.y, &a3.z); + + DamageMonsterFromParty(PID(OBJECT_Player, uActiveCharacter - 1), target_id, &a3); + if (player->WearsItem(ITEM_ARTIFACT_SPLITTER, EQUIP_TWO_HANDED) || player->WearsItem(ITEM_ARTIFACT_SPLITTER, EQUIP_SINGLE_HANDED)) + _42FA66_do_explosive_impact(actor->vPosition.x, actor->vPosition.y, actor->vPosition.z + actor->uActorHeight / 2, 0, 512, uActiveCharacter); + } + else if (bow_idx) + { + shooting_bow = true; + _42777D_CastSpell_UseWand_ShootArrow(SPELL_BOW_ARROW, uActiveCharacter - 1, 0, 0, 0); + } + else + { + melee_attack = true; + ; // actor out of range or no actor; no ranged weapon so melee attacking air + } + + if (!pParty->bTurnBasedModeOn && melee_attack) // wands, bows & lasers will add recovery while shooting spell effect + { + int recovery = player->GetAttackRecoveryTime(false); + if (recovery < 30 ) + recovery = 30; + player->SetRecoveryTime(flt_6BE3A4_debug_recmod1 * (double)recovery * 2.133333333333333); + } + + int v34 = 0; + if (shooting_wand) + return; + else if (shooting_bow) + { + v34 = 5; + player->PlaySound(SPEECH_50, 0); + } + if (shotting_laser) + v34 = 7; + else + { + int main_hand_idx = player->pEquipment.uMainHand; + if (player->HasItemEquipped(EQUIP_TWO_HANDED)) + v34 = player->pInventoryItemList[main_hand_idx - 1].GetPlayerSkillType(); + pTurnEngine->ApplyPlayerAction(); + } + + switch (v34) + { + case 0: pAudioPlayer->PlaySound(SOUND_81, 0, 0, -1, 0, 0, 0, 0); break; + case 1: pAudioPlayer->PlaySound(SOUND_84, 0, 0, -1, 0, 0, 0, 0); break; + case 2: pAudioPlayer->PlaySound(SOUND_85, 0, 0, -1, 0, 0, 0, 0); break; + case 3: pAudioPlayer->PlaySound(SOUND_78, 0, 0, -1, 0, 0, 0, 0); break; + case 4: pAudioPlayer->PlaySound(SOUND_80, 0, 0, -1, 0, 0, 0, 0); break; + case 5: pAudioPlayer->PlaySound(SOUND_71, 0, 0, -1, 0, 0, 0, 0); break; + case 6: pAudioPlayer->PlaySound(SOUND_83, 0, 0, -1, 0, 0, 0, 0); break; + case 7: pAudioPlayer->PlaySound(SOUND_67, 0, 0, -1, 0, 0, 0, 0); break; + } +} + + +//----- (0042FA66) -------------------------------------------------------- +void Player::_42FA66_do_explosive_impact(int a1, int a2, int a3, int a4, __int16 a5, signed int a6) +{ + unsigned __int16 v9; // ax@5 + + SpriteObject a1a; // [sp+Ch] [bp-74h]@1 + //SpriteObject::SpriteObject(&a1a); + a1a.uType = 600; + a1a.stru_24.Reset(); + + a1a.spell_id = SPELL_FIRE_FIREBALL; + a1a.spell_level = 8; + a1a.spell_skill = 3; + v9 = 0; + for ( uint i = 0; i < pObjectList->uNumObjects; ++i ) + { + if ( a1a.uType == pObjectList->pObjects[i].uObjectID ) + v9 = i; + } + a1a.uObjectDescID = v9; + a1a.vPosition.x = a1; + a1a.vPosition.y = a2; + a1a.vPosition.z = a3; + a1a.uAttributes = 0; + a1a.uSectorID = pIndoor->GetSector(a1, a2, a3); + a1a.uSpriteFrameID = 0; + a1a.spell_target_pid = 0; + a1a.field_60_distance_related_prolly_lod = 0; + a1a.uFacing = 0; + a1a.uSoundID = 0; + if ( a6 >= 1 || a6 <= 4 ) + a1a.spell_caster_pid = PID(OBJECT_Player, a6 - 1); + else + a1a.spell_caster_pid = 0; + + int id = a1a.Create(0, 0, 0, 0); + if (id != -1) + AttackerInfo.Add(PID(OBJECT_Item, id), a5, SLOWORD(a1a.vPosition.x), SLOWORD(a1a.vPosition.y), + SLOWORD(a1a.vPosition.z), 0, 0); } \ No newline at end of file diff -r 5133eea7a4ca -r 9551756f46c4 Player.h --- a/Player.h Tue Apr 01 23:44:27 2014 +0200 +++ b/Player.h Wed Apr 02 01:21:05 2014 +0200 @@ -675,6 +675,9 @@ ItemGen* GetItem(unsigned int PlayerEquipment::* itemPos); int GetPlayerIndex(); + static void _42ECB5_PlayerAttacksActor(); + static void _42FA66_do_explosive_impact(int a1, int a2, int a3, int a4, __int16 a5, signed int a6); + std::array<__int64, 20> pConditions; unsigned __int64 uExperience; char pName[16]; diff -r 5133eea7a4ca -r 9551756f46c4 SpriteObject.cpp --- a/SpriteObject.cpp Tue Apr 01 23:44:27 2014 +0200 +++ b/SpriteObject.cpp Wed Apr 02 01:21:05 2014 +0200 @@ -14,6 +14,7 @@ #include "LOD.h" #include "Actor.h" #include "Events.h" +#include "AudioPlayer.h" #include "Level/Decoration.h" #include "mm7_data.h" @@ -1042,4 +1043,114 @@ } } } +} + + +//----- (0042F7EB) -------------------------------------------------------- +bool SpriteObject::sub_42F7EB_DropItemAt(unsigned int uSpriteID, int x, int y, int z, int a4, int count, int a7, unsigned __int16 attributes, ItemGen *a9) +{ + unsigned __int16 pObjectDescID; // ax@7 + SpriteObject pSpellObject; // [sp+Ch] [bp-78h]@1 + + pSpellObject.stru_24.Reset(); + if ( a9 ) + memcpy(&pSpellObject.stru_24, a9, sizeof(pSpellObject.stru_24)); + pSpellObject.spell_skill = 0; + pSpellObject.spell_level = 0; + pSpellObject.spell_id = 0; + pSpellObject.field_54 = 0; + pSpellObject.uType = uSpriteID; + pObjectDescID = 0; + for ( uint i = 0; i < (signed int)pObjectList->uNumObjects; ++i ) + { + if ( (short)uSpriteID == pObjectList->pObjects[i].uObjectID ) + pObjectDescID = i; + } + pSpellObject.uObjectDescID = pObjectDescID; + pSpellObject.vPosition.x = x; + pSpellObject.vPosition.y = y; + pSpellObject.vPosition.z = z; + pSpellObject.uSoundID = 0; + pSpellObject.uAttributes = attributes; + pSpellObject.uSectorID = pIndoor->GetSector(x, y, z); + pSpellObject.uSpriteFrameID = 0; + pSpellObject.spell_caster_pid = 0; + pSpellObject.spell_target_pid = 0; + if ( !(pSpellObject.uAttributes & 0x10) ) + { + if ( pItemsTable->uAllItemsCount ) + { + for ( uint i = 1; i < pItemsTable->uAllItemsCount; ++i ) + { + if ( pItemsTable->pItems[i].uSpriteID == uSpriteID ) + pSpellObject.stru_24.uItemID = i; + } + } + } + if ( a7 ) + { + if ( count > 0 ) + { + for ( uint i = count; i; --i ) + { + pSpellObject.uFacing = rand() % (signed int)stru_5C6E00->uIntegerDoublePi; + pSpellObject.Create((signed __int16)pSpellObject.uFacing, + ((signed int)stru_5C6E00->uIntegerHalfPi / 2) + (rand() % ((signed int)stru_5C6E00->uIntegerHalfPi / 2)), a4, 0); + + } + } + } + else + { + pSpellObject.uFacing = 0; + if ( count > 0 ) + { + for ( uint i = count; i; --i ) + { + pSpellObject.Create((signed __int16)pSpellObject.uFacing, stru_5C6E00->uIntegerHalfPi, a4, 0); + } + } + } + return true; +} + +//----- (0042F960) -------------------------------------------------------- +void SpriteObject::sub_42F960_create_object(int x, int y, int z) +{ + unsigned __int16 v7; // ax@5 + signed int v8; // eax@6 + signed int v9; // eax@7 + + SpriteObject a1; // [sp+Ch] [bp-70h]@1 + //SpriteObject::SpriteObject(&a1); + a1.stru_24.Reset(); + + a1.spell_skill = 0; + a1.spell_level = 0; + a1.spell_id = 0; + a1.field_54 = 0; + a1.uType = 800; + v7 = 0; + for ( uint i = 0; i < (signed int)pObjectList->uNumObjects; ++i ) + { + if ( a1.uType == pObjectList->pObjects[i].uObjectID ) + v7 = i; + } + a1.uObjectDescID = v7; + a1.vPosition.x = x; + a1.vPosition.y = y; + a1.vPosition.z = z; + a1.uSoundID = 0; + a1.uAttributes = 0; + a1.uSectorID = pIndoor->GetSector(x, y, z); + a1.uSpriteFrameID = 0; + a1.spell_caster_pid = 0; + a1.spell_target_pid = 0; + v8 = a1.Create(0, 0, 0, 0); + if ( v8 != -1 ) + { + v9 = 8 * v8; + LOBYTE(v9) = v9 | 2; + pAudioPlayer->PlaySound((SoundID)(SOUND_GoldReceived|0x14), v9, 0, -1, 0, 0, 0, 0); + } } \ No newline at end of file diff -r 5133eea7a4ca -r 9551756f46c4 SpriteObject.h --- a/SpriteObject.h Tue Apr 01 23:44:27 2014 +0200 +++ b/SpriteObject.h Wed Apr 02 01:21:05 2014 +0200 @@ -22,6 +22,8 @@ static void UpdateObject_fn0_BLV(unsigned int uLayingItemID); static void UpdateObject_fn0_ODM(unsigned int uLayingItemID); static void OnInteraction(unsigned int uLayingItemID); + static bool sub_42F7EB_DropItemAt(unsigned int uSpriteID, int x, int y, int z, int a4, int count, int a7, unsigned __int16 attributes, ItemGen *a9); + static void sub_42F960_create_object(int x, int y, int z); unsigned __int16 uType; diff -r 5133eea7a4ca -r 9551756f46c4 UI/UIPopup.cpp --- a/UI/UIPopup.cpp Tue Apr 01 23:44:27 2014 +0200 +++ b/UI/UIPopup.cpp Wed Apr 02 01:21:05 2014 +0200 @@ -1869,7 +1869,7 @@ int rot_x, rot_y, rot_z; Vec3_int_::Rotate(64, pParty->sRotationY, pParty->sRotationX, v39, &rot_x, &rot_y, &rot_z); - sub_42F7EB_DropItemAt(0x41Bu, rot_x, rot_y, rot_z, 0, 1, 0, 0, 0); + SpriteObject::sub_42F7EB_DropItemAt(0x41Bu, rot_x, rot_y, rot_z, 0, 1, 0, 0, 0); if ( dword_4E455C ) { if ( pPlayers[uActiveCharacter]->CanAct() ) @@ -1895,7 +1895,7 @@ int rot_x, rot_y, rot_z; Vec3_int_::Rotate(64, pParty->sRotationY, pParty->sRotationX, v39, &rot_x, &rot_y, &rot_z); - sub_42F7EB_DropItemAt(0x41Bu, rot_x, rot_y, rot_z, 0, 1, 0, 0, 0); + SpriteObject::sub_42F7EB_DropItemAt(0x41Bu, rot_x, rot_y, rot_z, 0, 1, 0, 0, 0); if ( dword_4E455C ) { if ( pPlayers[uActiveCharacter]->CanAct() ) @@ -1922,7 +1922,7 @@ int rot_x, rot_y, rot_z; Vec3_int_::Rotate(64, pParty->sRotationY, pParty->sRotationX, v39, &rot_x, &rot_y, &rot_z); - sub_42F7EB_DropItemAt(0x41Bu, rot_x, rot_y, rot_z, 0, 1, 0, 0, 0); + SpriteObject::sub_42F7EB_DropItemAt(0x41Bu, rot_x, rot_y, rot_z, 0, 1, 0, 0, 0); if ( dword_4E455C ) { if ( pPlayers[uActiveCharacter]->CanAct() ) @@ -1949,7 +1949,7 @@ int rot_x, rot_y, rot_z; Vec3_int_::Rotate(64, pParty->sRotationY, pParty->sRotationX, v39, &rot_x, &rot_y, &rot_z); - sub_42F7EB_DropItemAt(0x41Bu, rot_x, rot_y, rot_z, 0, 1, 0, 0, 0); + SpriteObject::sub_42F7EB_DropItemAt(0x41Bu, rot_x, rot_y, rot_z, 0, 1, 0, 0, 0); if ( dword_4E455C ) { if ( pPlayers[uActiveCharacter]->CanAct() ) diff -r 5133eea7a4ca -r 9551756f46c4 mm7_2.cpp --- a/mm7_2.cpp Tue Apr 01 23:44:27 2014 +0200 +++ b/mm7_2.cpp Wed Apr 02 01:21:05 2014 +0200 @@ -75,31 +75,6 @@ bool __fastcall FindMM7CD(HWND hWnd, char *pCDDrive); bool __fastcall Initialize(HINSTANCE hInst, char *pCmdLine); -//----- (004A1780) mm6_chinese--------------------------------------------- -__int64 fixpoint_div(int a1, int a2) -{ - return ((__int64)a1 << 16) / a2; -} - -__int64 fixpoint_sub_unknown(int a1, int a2) -{ - return (((__int64)a1 << 16) * a2) >> 16; -} - -//----- (0042EBBE) -------------------------------------------------------- -//----- (004453C0) mm6----------------------------------------------------- -//----- (004A1760) mm6_chinese--------------------------------------------- -__int64 fixpoint_mul(int a1, int a2) -{ - return ((__int64)a1 * (__int64)a2) >> 16; -} - -__int64 fixpoint_dot(int x1, int x2, int y1, int y2, int z1, int z2) -{ - return fixpoint_mul(x1, x2) + - fixpoint_mul(y1, y2) + - fixpoint_mul(z1, z2); -} //----- (004BB756) -------------------------------------------------------- int UseNPCSkill(NPCProf profession) @@ -1909,139 +1884,6 @@ + (__PAIR__(v10, (unsigned __int16)a4 >> 2) & 0x1C00)); } -//----- (0045281E) -------------------------------------------------------- -// Calculates atan2(y/x) -// return value: angle in integer format (multiplier of Pi/1024) -unsigned int stru193_math::Atan2(int x, int y) -{ - signed int quadrant; - __int64 dividend; - int quotient; - int lowIdx; - int highIdx; - int angle; - - int X = x; - int Y = y; - - if ( abs(X) < 65536 ) - { - if ( (abs(Y) >> 15) >= abs(X) ) - X = 0; - } - - if ( !X ) - { - if ( Y > 0 ) - { - return uIntegerHalfPi; //Pi/2 - } - else - { - return uIntegerHalfPi + uIntegerPi; //3*(Pi/2) - } - } - - if ( Y ) - { - if ( X < 0 ) - { - X = -X; - if ( Y > 0 ) - { - quadrant = 4; - } - else - { - quadrant = 3; - } - } - else - { - if ( Y > 0 ) - { - quadrant = 1; - } - else - { - quadrant = 2; - } - } - - if ( Y < 0 ) - Y = -Y; - - LODWORD(dividend) = Y << 16; - HIDWORD(dividend) = Y >> 16; - quotient = dividend / X; - - //looks like binary search - { - int i; - highIdx = uIntegerHalfPi; - lowIdx = 0; - - for (i = 0; i < 6; ++i) - { - if (quotient <= pTanTable[(lowIdx + highIdx) / 2]) - highIdx = (lowIdx + highIdx) / 2; - else - lowIdx = (lowIdx + highIdx) / 2; - } - } - - angle = lowIdx + 1; - while ( angle < (highIdx - 1) && quotient >= pTanTable[angle] ) - ++angle; - - switch (quadrant) - { - case 1: //X > 0, Y > 0 - return angle; - - case 2: //X > 0, Y < 0 - return uIntegerDoublePi - angle; //2*Pi - angle - - case 3: //X > 0, Y < 0 - return uIntegerPi + angle; //Pi + angle - - case 4: //X < 0, Y > 0 - return uIntegerPi - angle; //Pi - angle - } - - //should newer get here - return 0; - } - - if ( X < 0 ) //Y == 0, X < 0 - return uIntegerPi; - - return 0; -} - -//----- (00452969) -------------------------------------------------------- -stru193_math::stru193_math() -{ - double v3; // ST18_8@2 - - this->pTanTable[0] = 0; - this->pCosTable[0] = 65536; - this->pInvCosTable[0] = 65536; - for(int i = 1; i < (signed int)this->uIntegerHalfPi; i++) - { - v3 = (double)i * 3.141592653589793 / (double)uIntegerPi; - pTanTable[i] = (signed __int64)(tan(v3) * (double)this->pCosTable[0] + 0.5); - pCosTable[i] = (signed __int64)(cos(v3) * (double)this->pCosTable[0] + 0.5); - pInvCosTable[i] = (signed __int64)(1.0 / cos(v3) * (double)this->pCosTable[0] + 0.5); - } - for(int i = this->uIntegerHalfPi; i < 520; i++) - { - this->pTanTable[i] = 0xEFFFFFFFu; - this->pCosTable[i] = 0; - this->pInvCosTable[i] = 0xEFFFFFFFu; - } -} - //----- (00452A9E) -------------------------------------------------------- int integer_sqrt(int val) { @@ -2573,6 +2415,30 @@ } // 6BE3A0: using guessed type float flt_6BE3A0; + +//----- (0042F3D6) -------------------------------------------------------- +void InitializeTurnBasedAnimations(void *_this) +{ + for (unsigned int i = 0; i < pIconIDs_Turn.size(); ++i) + { + char icon_name[32]; + sprintf(icon_name, "turn%u", i); + pIconIDs_Turn[i] = pIconsFrameTable->FindIcon(icon_name); + pIconsFrameTable->InitializeAnimation(pIconIDs_Turn[i]); + } + + uIconID_TurnStop = pIconsFrameTable->FindIcon("turnstop"); + uIconID_TurnHour = pIconsFrameTable->FindIcon("turnhour"); + uIconID_TurnStart = pIconsFrameTable->FindIcon("turnstart"); + uIconID_CharacterFrame = pIconsFrameTable->FindIcon("aframe1"); + uSpriteID_Spell11 = pSpriteFrameTable->FastFindSprite("spell11"); + + pIconsFrameTable->InitializeAnimation(uIconID_TurnHour); + pIconsFrameTable->InitializeAnimation(uIconID_TurnStop); + pIconsFrameTable->InitializeAnimation(uIconID_TurnStart); + pIconsFrameTable->InitializeAnimation(uIconID_CharacterFrame); +} + //----- (00464839) -------------------------------------------------------- char Is_out15odm_underwater() { diff -r 5133eea7a4ca -r 9551756f46c4 mm7_3.cpp --- a/mm7_3.cpp Tue Apr 01 23:44:27 2014 +0200 +++ b/mm7_3.cpp Wed Apr 02 01:21:05 2014 +0200 @@ -827,7 +827,7 @@ v61 = v36 + 30; else v61 = v5 + 60; - sub_42F960_create_object(pActors[v75].vPosition.x, pActors[v75].vPosition.y, v61); + SpriteObject::sub_42F960_create_object(pActors[v75].vPosition.x, pActors[v75].vPosition.y, v61); pActors[v75].uAIState = Removed; return; } @@ -4320,21 +4320,4 @@ } } -//----- (00402CAE) -------------------------------------------------------- -int stru193_math::Cos(int angle) -{ - int v2; // eax@1 - - //a2: (angle - uIntegerHalfPi) for sin(angle) - // (angle) for cos(angle) - - v2 = uDoublePiMask & angle; - - if ( v2 > uIntegerPi ) - v2 = uIntegerDoublePi - v2; - if ( v2 >= uIntegerHalfPi ) - return -pCosTable[uIntegerPi - v2]; - else - return pCosTable[v2]; -} - + diff -r 5133eea7a4ca -r 9551756f46c4 mm7_4.cpp --- a/mm7_4.cpp Tue Apr 01 23:44:27 2014 +0200 +++ b/mm7_4.cpp Wed Apr 02 01:21:05 2014 +0200 @@ -175,19 +175,6 @@ (((uint)round_to_int(b * 255.0f) & 0xFF)); } -//----- (0048B561) -------------------------------------------------------- -int fixpoint_from_float(float val) -{ - // float X.Yf -> int XXXX YYYY - int left = floorf((val - 0.5f) + 0.5f); - int right = floorf((val - left) * 65536.0f); - return (left << 16) | right; -} - -int fixpoint_from_int(int lhv, int rhv) -{ - return (lhv << 16) | rhv; -} //----- (00491E3A) -------------------------------------------------------- void sub_491E3A() diff -r 5133eea7a4ca -r 9551756f46c4 mm7_6.cpp --- a/mm7_6.cpp Tue Apr 01 23:44:27 2014 +0200 +++ b/mm7_6.cpp Wed Apr 02 01:21:05 2014 +0200 @@ -1,27 +1,9 @@ #define _CRT_SECURE_NO_WARNINGS -#include "MM7.h" - -#include "Weather.h" -#include "Sprites.h" -#include "Mouse.h" -#include "Keyboard.h" #include "Vis.h" #include "Game.h" -#include "GUIWindow.h" -#include "Party.h" -#include "AudioPlayer.h" -#include "Outdoor.h" +#include "MM7_data.h" #include "Actor.h" -#include "Viewport.h" -#include "OurMath.h" -#include "SpriteObject.h" -#include "ObjectList.h" -#include "Timer.h" -#include "IconFrameTable.h" -#include "TurnEngine.h" -#include "CastSpellInfo.h" -#include "stru298.h" @@ -48,187 +30,7 @@ return result; } -//----- (0042EB8D) -------------------------------------------------------- -void GUIMessageQueue::AddMessageImpl(UIMessageType msg, int param, unsigned int a4, const char *file, int line) -{ - //Log::Warning(L"%s @ (%S %u)", UIMessage2String(msg), file, line); - if (uNumMessages < 40) - { - files[uNumMessages] = file; - lines[uNumMessages] = line; - pMessages[uNumMessages].eType = msg; - pMessages[uNumMessages].param = param; - pMessages[uNumMessages++].field_8 = a4; - } -} - -//----- (0042EBDB) -------------------------------------------------------- -int stru193_math::Sin(int angle) -{ - return Cos(angle - this->uIntegerHalfPi); -} - -//----- (0042ECB5) -------------------------------------------------------- -void _42ECB5_PlayerAttacksActor() -{ - char *v5; // eax@8 - unsigned int v9; // ecx@21 - char *v11; // eax@26 - unsigned int v12; // eax@47 - SoundID v24; // [sp-4h] [bp-40h]@58 - - //result = pParty->pPlayers[uActiveCharacter-1].CanAct(); - Player* player = &pParty->pPlayers[uActiveCharacter - 1]; - if (!player->CanAct()) - return; - - CastSpellInfoHelpers::_427D48(); - //v3 = 0; - if (pParty->Invisible()) - pParty->pPartyBuffs[PARTY_BUFF_INVISIBILITY].Reset(); - - //v31 = player->pEquipment.uBow; - int bow_idx = player->pEquipment.uBow; - if (bow_idx && player->pInventoryItemList[bow_idx - 1].IsBroken()) - bow_idx = 0; - - //v32 = 0; - int wand_item_id = 0; - //v33 = 0; - //v4 = v1->pEquipment.uMainHand; - int laser_weapon_item_id = 0; - - int main_hand_idx = player->pEquipment.uMainHand; - if (main_hand_idx) - { - ItemGen* item = &player->pInventoryItemList[main_hand_idx - 1]; - //v5 = (char *)v1 + 36 * v4; - if (!item->IsBroken()) - { - //v28b = &v1->pInventoryItems[v4].uItemID; - //v6 = v1->pInventoryItems[v4].uItemID;//*((int *)v5 + 124); - if (item->GetItemEquipType() == EQUIP_WAND) - { - if (item->uNumCharges <= 0) - player->pEquipment.uMainHand = 0; // wand discharged - unequip - else - wand_item_id = item->uItemID;//*((int *)v5 + 124); - } - else if (item->uItemID == ITEM_BLASTER || item->uItemID == ITEM_LASER_RIFLE) - laser_weapon_item_id = item->uItemID;//*((int *)v5 + 124); - } - } - - //v30 = 0; - //v29 = 0; - //v28 = 0; - //v7 = pMouse->uPointingObjectID; - - int target_pid = pMouse->uPointingObjectID; - int target_type = PID_TYPE(target_pid), - target_id = PID_ID(target_pid); - if (target_type != OBJECT_Actor || !pActors[target_id].CanAct()) - { - target_pid = stru_50C198.FindClosestActor(5120, 0, 0); - target_type = PID_TYPE(target_pid); - target_id = PID_ID(target_pid); - } - - Actor* actor = &pActors[target_id]; - int actor_distance = 0; - if (target_type == OBJECT_Actor) - { - int distance_x = actor->vPosition.x - pParty->vPosition.x, - distance_y = actor->vPosition.y - pParty->vPosition.y, - distance_z = actor->vPosition.z - pParty->vPosition.z; - actor_distance = integer_sqrt(distance_x * distance_x + distance_y * distance_y + distance_z * distance_z) - actor->uActorRadius; - if (actor_distance < 0) - actor_distance = 0; - } - - bool shooting_bow = false, - shotting_laser = false, - shooting_wand = false, - melee_attack = false; - if (laser_weapon_item_id) - { - shotting_laser = true; - _42777D_CastSpell_UseWand_ShootArrow(SPELL_LASER_PROJECTILE, uActiveCharacter - 1, 0, 0, uActiveCharacter + 8); - } - else if (wand_item_id) - { - shooting_wand = true; - - int main_hand_idx = player->pEquipment.uMainHand; - _42777D_CastSpell_UseWand_ShootArrow(wand_spell_ids[player->pInventoryItemList[main_hand_idx - 1].uItemID - ITEM_WAND_FIRE], uActiveCharacter - 1, 8, 0, uActiveCharacter + 8); - - if (!--player->pInventoryItemList[main_hand_idx - 1].uNumCharges) - player->pEquipment.uMainHand = 0; - } - else if (target_type == OBJECT_Actor && actor_distance <= 407.2) - { - melee_attack = true; - - Vec3_int_ a3; - a3.x = actor->vPosition.x - pParty->vPosition.x; - a3.y = actor->vPosition.y - pParty->vPosition.y; - a3.z = actor->vPosition.z - pParty->vPosition.z; - Vec3_int_::Normalize(&a3.x, &a3.y, &a3.z); - - DamageMonsterFromParty(PID(OBJECT_Player, uActiveCharacter - 1), target_id, &a3); - if (player->WearsItem(ITEM_ARTIFACT_SPLITTER, EQUIP_TWO_HANDED) || player->WearsItem(ITEM_ARTIFACT_SPLITTER, EQUIP_SINGLE_HANDED)) - _42FA66_do_explosive_impact(actor->vPosition.x, actor->vPosition.y, actor->vPosition.z + actor->uActorHeight / 2, 0, 512, uActiveCharacter); - } - else if (bow_idx) - { - shooting_bow = true; - _42777D_CastSpell_UseWand_ShootArrow(SPELL_BOW_ARROW, uActiveCharacter - 1, 0, 0, 0); - } - else - { - melee_attack = true; - ; // actor out of range or no actor; no ranged weapon so melee attacking air - } - - if (!pParty->bTurnBasedModeOn && melee_attack) // wands, bows & lasers will add recovery while shooting spell effect - { - int recovery = player->GetAttackRecoveryTime(false); - if (recovery < 30 ) - recovery = 30; - player->SetRecoveryTime(flt_6BE3A4_debug_recmod1 * (double)recovery * 2.133333333333333); - } - - int v34 = 0; - if (shooting_wand) - return; - else if (shooting_bow) - { - v34 = 5; - player->PlaySound(SPEECH_50, 0); - } - if (shotting_laser) - v34 = 7; - else - { - int main_hand_idx = player->pEquipment.uMainHand; - if (player->HasItemEquipped(EQUIP_TWO_HANDED)) - v34 = player->pInventoryItemList[main_hand_idx - 1].GetPlayerSkillType(); - pTurnEngine->ApplyPlayerAction(); - } - - switch (v34) - { - case 0: pAudioPlayer->PlaySound(SOUND_81, 0, 0, -1, 0, 0, 0, 0); break; - case 1: pAudioPlayer->PlaySound(SOUND_84, 0, 0, -1, 0, 0, 0, 0); break; - case 2: pAudioPlayer->PlaySound(SOUND_85, 0, 0, -1, 0, 0, 0, 0); break; - case 3: pAudioPlayer->PlaySound(SOUND_78, 0, 0, -1, 0, 0, 0, 0); break; - case 4: pAudioPlayer->PlaySound(SOUND_80, 0, 0, -1, 0, 0, 0, 0); break; - case 5: pAudioPlayer->PlaySound(SOUND_71, 0, 0, -1, 0, 0, 0, 0); break; - case 6: pAudioPlayer->PlaySound(SOUND_83, 0, 0, -1, 0, 0, 0, 0); break; - case 7: pAudioPlayer->PlaySound(SOUND_67, 0, 0, -1, 0, 0, 0, 0); break; - } -} //----- (0042F184) -------------------------------------------------------- int stru319::FindClosestActor(int pick_depth, int a3, int a4) @@ -380,569 +182,5 @@ return 0;*/ } -//----- (0042F3D6) -------------------------------------------------------- -void InitializeTurnBasedAnimations(void *_this) -{ - for (unsigned int i = 0; i < pIconIDs_Turn.size(); ++i) - { - char icon_name[32]; - sprintf(icon_name, "turn%u", i); - pIconIDs_Turn[i] = pIconsFrameTable->FindIcon(icon_name); - pIconsFrameTable->InitializeAnimation(pIconIDs_Turn[i]); - } - - uIconID_TurnStop = pIconsFrameTable->FindIcon("turnstop"); - uIconID_TurnHour = pIconsFrameTable->FindIcon("turnhour"); - uIconID_TurnStart = pIconsFrameTable->FindIcon("turnstart"); - uIconID_CharacterFrame = pIconsFrameTable->FindIcon("aframe1"); - uSpriteID_Spell11 = pSpriteFrameTable->FastFindSprite("spell11"); - - pIconsFrameTable->InitializeAnimation(uIconID_TurnHour); - pIconsFrameTable->InitializeAnimation(uIconID_TurnStop); - pIconsFrameTable->InitializeAnimation(uIconID_TurnStart); - pIconsFrameTable->InitializeAnimation(uIconID_CharacterFrame); -} - -//----- (0042F7EB) -------------------------------------------------------- -bool __fastcall sub_42F7EB_DropItemAt(unsigned int uSpriteID, int x, int y, int z, int a4, int count, int a7, unsigned __int16 attributes, ItemGen *a9) -{ - unsigned __int16 pObjectDescID; // ax@7 - SpriteObject pSpellObject; // [sp+Ch] [bp-78h]@1 - - pSpellObject.stru_24.Reset(); - if ( a9 ) - memcpy(&pSpellObject.stru_24, a9, sizeof(pSpellObject.stru_24)); - pSpellObject.spell_skill = 0; - pSpellObject.spell_level = 0; - pSpellObject.spell_id = 0; - pSpellObject.field_54 = 0; - pSpellObject.uType = uSpriteID; - pObjectDescID = 0; - for ( uint i = 0; i < (signed int)pObjectList->uNumObjects; ++i ) - { - if ( (short)uSpriteID == pObjectList->pObjects[i].uObjectID ) - pObjectDescID = i; - } - pSpellObject.uObjectDescID = pObjectDescID; - pSpellObject.vPosition.x = x; - pSpellObject.vPosition.y = y; - pSpellObject.vPosition.z = z; - pSpellObject.uSoundID = 0; - pSpellObject.uAttributes = attributes; - pSpellObject.uSectorID = pIndoor->GetSector(x, y, z); - pSpellObject.uSpriteFrameID = 0; - pSpellObject.spell_caster_pid = 0; - pSpellObject.spell_target_pid = 0; - if ( !(pSpellObject.uAttributes & 0x10) ) - { - if ( pItemsTable->uAllItemsCount ) - { - for ( uint i = 1; i < pItemsTable->uAllItemsCount; ++i ) - { - if ( pItemsTable->pItems[i].uSpriteID == uSpriteID ) - pSpellObject.stru_24.uItemID = i; - } - } - } - if ( a7 ) - { - if ( count > 0 ) - { - for ( uint i = count; i; --i ) - { - pSpellObject.uFacing = rand() % (signed int)stru_5C6E00->uIntegerDoublePi; - pSpellObject.Create((signed __int16)pSpellObject.uFacing, - ((signed int)stru_5C6E00->uIntegerHalfPi / 2) + (rand() % ((signed int)stru_5C6E00->uIntegerHalfPi / 2)), a4, 0); - - } - } - } - else - { - pSpellObject.uFacing = 0; - if ( count > 0 ) - { - for ( uint i = count; i; --i ) - { - pSpellObject.Create((signed __int16)pSpellObject.uFacing, stru_5C6E00->uIntegerHalfPi, a4, 0); - } - } - } - return true; -} - -//----- (0042F960) -------------------------------------------------------- -void __fastcall sub_42F960_create_object(int x, int y, int z) -{ - unsigned __int16 v7; // ax@5 - signed int v8; // eax@6 - signed int v9; // eax@7 - - SpriteObject a1; // [sp+Ch] [bp-70h]@1 - //SpriteObject::SpriteObject(&a1); - a1.stru_24.Reset(); - - a1.spell_skill = 0; - a1.spell_level = 0; - a1.spell_id = 0; - a1.field_54 = 0; - a1.uType = 800; - v7 = 0; - for ( uint i = 0; i < (signed int)pObjectList->uNumObjects; ++i ) - { - if ( a1.uType == pObjectList->pObjects[i].uObjectID ) - v7 = i; - } - a1.uObjectDescID = v7; - a1.vPosition.x = x; - a1.vPosition.y = y; - a1.vPosition.z = z; - a1.uSoundID = 0; - a1.uAttributes = 0; - a1.uSectorID = pIndoor->GetSector(x, y, z); - a1.uSpriteFrameID = 0; - a1.spell_caster_pid = 0; - a1.spell_target_pid = 0; - v8 = a1.Create(0, 0, 0, 0); - if ( v8 != -1 ) - { - v9 = 8 * v8; - LOBYTE(v9) = v9 | 2; - pAudioPlayer->PlaySound((SoundID)(SOUND_GoldReceived|0x14), v9, 0, -1, 0, 0, 0, 0); - } -} - -//----- (0042FA66) -------------------------------------------------------- -void _42FA66_do_explosive_impact(int a1, int a2, int a3, int a4, __int16 a5, signed int a6) -{ - unsigned __int16 v9; // ax@5 - - SpriteObject a1a; // [sp+Ch] [bp-74h]@1 - //SpriteObject::SpriteObject(&a1a); - a1a.uType = 600; - a1a.stru_24.Reset(); - - a1a.spell_id = SPELL_FIRE_FIREBALL; - a1a.spell_level = 8; - a1a.spell_skill = 3; - v9 = 0; - for ( uint i = 0; i < pObjectList->uNumObjects; ++i ) - { - if ( a1a.uType == pObjectList->pObjects[i].uObjectID ) - v9 = i; - } - a1a.uObjectDescID = v9; - a1a.vPosition.x = a1; - a1a.vPosition.y = a2; - a1a.vPosition.z = a3; - a1a.uAttributes = 0; - a1a.uSectorID = pIndoor->GetSector(a1, a2, a3); - a1a.uSpriteFrameID = 0; - a1a.spell_target_pid = 0; - a1a.field_60_distance_related_prolly_lod = 0; - a1a.uFacing = 0; - a1a.uSoundID = 0; - if ( a6 >= 1 || a6 <= 4 ) - a1a.spell_caster_pid = PID(OBJECT_Player, a6 - 1); - else - a1a.spell_caster_pid = 0; - - int id = a1a.Create(0, 0, 0, 0); - if (id != -1) - AttackerInfo.Add(PID(OBJECT_Item, id), a5, SLOWORD(a1a.vPosition.x), SLOWORD(a1a.vPosition.y), - SLOWORD(a1a.vPosition.z), 0, 0); -} - -//----- (0042FBDD) -------------------------------------------------------- -void sub_42FBDD() -{ - pAudioPlayer->PlaySound(SOUND_Button2, 0, 0, -1, 0, 0, 0, 0); - pRenderer->DrawTextureTransparent(pBtn_YES->uX, pBtn_YES->uY, pBtn_YES->pTextures[0]); - pRenderer->Present(); -} - -//----- (0042FC15) -------------------------------------------------------- -void CloseWindowBackground() -{ - pAudioPlayer->PlaySound(SOUND_Button2, -2, 0, -1, 0, 0, 0, 0); - pRenderer->DrawTextureTransparent(pBtn_ExitCancel->uX, pBtn_ExitCancel->uY, pBtn_ExitCancel->pTextures[0]); - pRenderer->Present(); -} - -//----- (0042FC4E) -------------------------------------------------------- -void ProcessInputActions() -{ - char v4; // al@9 - //char v8; // bl@100 - unsigned __int16 v9; // ax@102 - int spell_price; // eax@103 - char v14; // al@159 - unsigned int v15; // eax@168 - PartyAction partyAction; // [sp-14h] [bp-1Ch]@20 - InputAction inputAction; // [sp+0h] [bp-8h]@7 - //int v24; // [sp+4h] [bp-4h]@87 - - pGame->pKeyboardInstance->EnterCriticalSection(); - Keyboard* pKeyboard = pGame->pKeyboardInstance; - if (!bAlwaysRun) - { - if (pKeyboard->IsShiftHeld()) - pParty->uFlags2 |= PARTY_FLAGS_2_RUNNING; - else - pParty->uFlags2 &= ~PARTY_FLAGS_2_RUNNING; - } - else - { - if (pKeyboard->IsShiftHeld()) - pParty->uFlags2 &= ~PARTY_FLAGS_2_RUNNING; - else - pParty->uFlags2 |= PARTY_FLAGS_2_RUNNING; - } - - //pParty->uFlags2 |= PARTY_FLAGS_2_RUNNING; - // 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 ) - { - if (pCurrentScreen == SCREEN_GAME) - { - pMessageQueue_50CBD0->AddMessage(UIMSG_Game_Action, 0, 0); - continue; - } - if ( pCurrentScreen == SCREEN_NPC_DIALOGUE || pCurrentScreen == SCREEN_BRANCHLESS_NPC_DIALOG ) - { - v15 = pMessageQueue_50CBD0->uNumMessages; - if ( pMessageQueue_50CBD0->uNumMessages ) - { - v15 = 0; - if ( pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].field_8 ) - { - v15 = 1; - pMessageQueue_50CBD0->uNumMessages = 0; - pMessageQueue_50CBD0->pMessages[v15].eType = UIMSG_Escape; - pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].param = 0; - *(&pMessageQueue_50CBD0->uNumMessages + 3 * pMessageQueue_50CBD0->uNumMessages + 3) = 0; - ++pMessageQueue_50CBD0->uNumMessages; - continue; - } - pMessageQueue_50CBD0->uNumMessages = 0; - } - //pMessageQueue_50CBD0->AddMessage(UIMSG_Escape, 0, 0); - } - } - }*/ - if ( !pEventTimer->bPaused ) - { - for ( uint i = 0; i < 30; ++i ) - { - inputAction = (InputAction)i; - if ( pKeyActionMap->pToggleTypes[inputAction] ) - v4 = pKeyboard->WasKeyPressed(pKeyActionMap->pVirtualKeyCodesMapping[inputAction]); - else - v4 = pKeyboard->IsKeyBeingHeld(pKeyActionMap->pVirtualKeyCodesMapping[inputAction]); - if ( v4 ) - { - switch ( inputAction ) - { - case INPUT_MoveForward: - if (pCurrentScreen != SCREEN_GAME) - break; - if (!pParty->bTurnBasedModeOn) - { - if ( pParty->uFlags2 & PARTY_FLAGS_2_RUNNING) - partyAction = PARTY_RunForward; - else - partyAction = PARTY_WalkForward; - pPartyActionQueue->Add(partyAction); - break; - } - if (pTurnEngine->turn_stage != TE_WAIT && pTurnEngine->turn_stage != TE_ATTACK && pTurnEngine->uActionPointsLeft > 0 ) - { - pTurnEngine->uActionPointsLeft -= 26; - if ( pParty->uFlags2 & PARTY_FLAGS_2_RUNNING) - partyAction = PARTY_RunForward; - else - partyAction = PARTY_WalkForward; - pPartyActionQueue->Add(partyAction); - break; - } - break; - case INPUT_MoveBackwards: - if (pCurrentScreen != SCREEN_GAME) - break; - if (!pParty->bTurnBasedModeOn) - { - if ( pParty->uFlags2 & 2 ) - partyAction = PARTY_RunBackward; - else - partyAction = PARTY_WalkBackward; - pPartyActionQueue->Add(partyAction); - break; - } - if ( pTurnEngine->turn_stage != TE_WAIT && pTurnEngine->turn_stage != TE_ATTACK && pTurnEngine->uActionPointsLeft > 0 ) - { - pTurnEngine->uActionPointsLeft -= 26; - if ( pParty->uFlags2 & 2 ) - partyAction = PARTY_RunBackward; - else - partyAction = PARTY_WalkBackward; - pPartyActionQueue->Add(partyAction); - break; - } - break; - case INPUT_StrafeLeft: - if (pCurrentScreen != SCREEN_GAME) - break; - if (!pParty->bTurnBasedModeOn) - { - partyAction = PARTY_StrafeLeft; - pPartyActionQueue->Add(partyAction); - break; - } - if ( pTurnEngine->turn_stage == TE_WAIT || pTurnEngine->turn_stage == TE_ATTACK || pTurnEngine->uActionPointsLeft <= 0 ) - break; - pTurnEngine->uActionPointsLeft -= 26; - partyAction = PARTY_StrafeLeft; - pPartyActionQueue->Add(partyAction); - break; - case INPUT_StrafeRight: - if (pCurrentScreen != SCREEN_GAME) - break; - if (!pParty->bTurnBasedModeOn) - { - partyAction = PARTY_StrafeRight; - pPartyActionQueue->Add(partyAction); - break; - } - if ( pTurnEngine->turn_stage == TE_WAIT || pTurnEngine->turn_stage == TE_ATTACK || pTurnEngine->uActionPointsLeft <= 0 ) - break; - pTurnEngine->uActionPointsLeft -= 26; - partyAction = PARTY_StrafeRight; - pPartyActionQueue->Add(partyAction); - break; - case INPUT_TurnLeft: - if (pCurrentScreen != SCREEN_GAME) - break; - if ( GetAsyncKeyState(VK_CONTROL) ) // strafing - { - if (pParty->bTurnBasedModeOn) - { - if ( pTurnEngine->turn_stage == TE_WAIT || pTurnEngine->turn_stage == TE_ATTACK || pTurnEngine->uActionPointsLeft <= 0 ) - break; - pTurnEngine->uActionPointsLeft -= 26; - } - partyAction = PARTY_StrafeLeft; - } - else - { - if ( pParty->uFlags2 & 2 ) - partyAction = PARTY_FastTurnLeft; - else - partyAction = PARTY_TurnLeft; - } - pPartyActionQueue->Add(partyAction); - if (uCurrentlyLoadedLevelType == LEVEL_Outdoor && pWeather->bRenderSnow) - pWeather->OnPlayerTurn(10); - break; - case INPUT_TurnRight: - if (pCurrentScreen != SCREEN_GAME) - break; - if ( GetAsyncKeyState(17) ) // strafing - { - if (pParty->bTurnBasedModeOn) - { - if ( pTurnEngine->turn_stage == TE_WAIT || pTurnEngine->turn_stage == TE_ATTACK || pTurnEngine->uActionPointsLeft <= 0 ) - break; - pTurnEngine->uActionPointsLeft -= 26; - } - partyAction = PARTY_StrafeRight; - } - else - { - if ( pParty->uFlags2 & 2 ) - partyAction = PARTY_FastTurnRight; - else - partyAction = PARTY_TurnRight; - } - pPartyActionQueue->Add(partyAction); - if (uCurrentlyLoadedLevelType == LEVEL_Outdoor && pWeather->bRenderSnow) - pWeather->OnPlayerTurn(-10); - break; - case INPUT_Jump: - if (pCurrentScreen != SCREEN_GAME || pParty->bTurnBasedModeOn) - break; - partyAction = (PartyAction)12; - pPartyActionQueue->Add(partyAction); - break; - case INPUT_Yell: - if (!pCurrentScreen && uActiveCharacter) - { - pParty->Yell(); - pPlayers[uActiveCharacter]->PlaySound(SPEECH_Yell, 0); - } - break; - case INPUT_Pass: - if ( pCurrentScreen ) - break; - if (pParty->bTurnBasedModeOn && pTurnEngine->turn_stage == TE_MOVEMENT) - { - pTurnEngine->field_18 |= TE_FLAG_8; - break; - } - if ( uActiveCharacter ) - { - if ( !pPlayers[uActiveCharacter]->uTimeToRecovery ) - { - if ( !pParty->bTurnBasedModeOn ) - pPlayers[uActiveCharacter]->SetRecoveryTime((signed __int64)(flt_6BE3A4_debug_recmod1 * (double)pPlayers[uActiveCharacter]->GetAttackRecoveryTime(false) * 2.133333333333333)); - CastSpellInfoHelpers::_427D48(); - pTurnEngine->ApplyPlayerAction(); - } - } - break; - case INPUT_Combat://if press ENTER - if (pCurrentScreen == SCREEN_GAME) - { - if (pParty->bTurnBasedModeOn) - { - if (pTurnEngine->turn_stage == TE_MOVEMENT || PID_TYPE(pTurnEngine->pQueue[0].uPackedID) == OBJECT_Player) - { - pParty->bTurnBasedModeOn = 0; - pTurnEngine->End(true); - } - } - else - { - pTurnEngine->Start(); - pParty->bTurnBasedModeOn = true; - } - } - break; - case INPUT_CastReady: - if (pCurrentScreen != SCREEN_GAME) - break; - if (pParty->bTurnBasedModeOn && pTurnEngine->turn_stage == TE_MOVEMENT) - { - pTurnEngine->field_18 |= TE_FLAG_8; - break; - } - if ( !uActiveCharacter ) - break; - v9 = pPlayers[uActiveCharacter]->pActiveSkills[(unsigned __int8)pPlayers[uActiveCharacter]->uQuickSpell / 11 + 12]; - if ( !pPlayers[uActiveCharacter]->uQuickSpell || bUnderwater - || (( !(HIBYTE(v9) & 1)) ? - ((v9 & 0x80) == 0 ? - ((v9 & 0x40) == 0 ? spell_price = pSpellDatas[pPlayers[uActiveCharacter]->uQuickSpell].uNormalLevelMana : spell_price = pSpellDatas[pPlayers[uActiveCharacter]->uQuickSpell].uExpertLevelMana) : - spell_price = pSpellDatas[pPlayers[uActiveCharacter]->uQuickSpell].uMasterLevelMana) : - spell_price = pSpellDatas[pPlayers[uActiveCharacter]->uQuickSpell].uMagisterLevelMana, - spell_price > pPlayers[uActiveCharacter]->sMana) ) - { - pPartyActionQueue = pPartyActionQueue; - pMessageQueue_50CBD0->AddMessage(UIMSG_Attack, 0, 0); - break; - } - else - pMessageQueue_50C9E8->AddMessage(UIMSG_CastQuickSpell, 0, 0); - break; - case INPUT_Attack: - if (pCurrentScreen != SCREEN_GAME) - break; - if (pParty->bTurnBasedModeOn == true && pTurnEngine->turn_stage == TE_MOVEMENT) - { - pTurnEngine->field_18 |= TE_FLAG_8; - break; - } - pMessageQueue_50CBD0->AddMessage(UIMSG_Attack, 0, 0); - break; - case INPUT_EventTrigger: - if (pCurrentScreen == SCREEN_GAME) - { - pMessageQueue_50CBD0->AddMessage(UIMSG_Game_Action, 0, 0); - break; - } - if ( pCurrentScreen == SCREEN_NPC_DIALOGUE ) - { - if ( pMessageQueue_50CBD0->uNumMessages ) - { - pMessageQueue_50CBD0->uNumMessages = 0; - if ( pMessageQueue_50CBD0->pMessages[0].field_8 ) - { - pMessageQueue_50CBD0->uNumMessages = 1; - pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].eType = UIMSG_Escape; - pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].param = 0; - pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].field_8 = 0; - ++pMessageQueue_50CBD0->uNumMessages; - break; - } - break; - } - pMessageQueue_50CBD0->AddMessage(UIMSG_Escape, 0, 0); - } - break; - case INPUT_CharCycle: - if ( pCurrentScreen == SCREEN_SPELL_BOOK ) - break; - - pMessageQueue_50C9E8->AddMessage(UIMSG_CycleCharacters, 0, 0); - break; - case INPUT_LookUp: - if ( pEventTimer->bPaused ) - break; - partyAction = (PartyAction)7; - pPartyActionQueue->Add(partyAction); - break; - case INPUT_CenterView: - if ( pEventTimer->bPaused ) - break; - partyAction = (PartyAction)9; - pPartyActionQueue->Add(partyAction); - break; - case INPUT_LookDown: - if ( pEventTimer->bPaused ) - break; - partyAction = (PartyAction)8; - pPartyActionQueue->Add(partyAction); - break; - case INPUT_FlyUp: - if ( pCurrentScreen || pEventTimer->bPaused ) - break; - partyAction = (PartyAction)13; - pPartyActionQueue->Add(partyAction); - break; - case INPUT_Land: - if ( pCurrentScreen || pEventTimer->bPaused ) - break; - partyAction = (PartyAction)15; - pPartyActionQueue->Add(partyAction); - break; - case INPUT_FlyDown: - if ( !pCurrentScreen - && !pEventTimer->bPaused ) - { - partyAction = (PartyAction)14; - pPartyActionQueue->Add(partyAction); - } - break; - case INPUT_ZoomIn: - pMessageQueue_50C9E8->AddMessage(UIMSG_ClickZoomOutBtn, 0, 0); - break; - case INPUT_ZoomOut: - pMessageQueue_50C9E8->AddMessage(UIMSG_ClickZoomInBtn, 0, 0); - break; - case INPUT_AlwaysRun: - bAlwaysRun = bAlwaysRun == 0; - break; - default: - break; - } - } - } - } -} diff -r 5133eea7a4ca -r 9551756f46c4 mm7_unsorted_subs.h --- a/mm7_unsorted_subs.h Tue Apr 01 23:44:27 2014 +0200 +++ b/mm7_unsorted_subs.h Wed Apr 02 01:21:05 2014 +0200 @@ -66,15 +66,10 @@ int ODM_FarClip(unsigned int uNumVertices); bool sub_427769_isSpellQuickCastableOnShiftClick(unsigned int uSpellID); void _42777D_CastSpell_UseWand_ShootArrow(int a1, unsigned int uPlayerID, unsigned int a4, __int16 a5, int a6); -void _42ECB5_PlayerAttacksActor(); void InitializeTurnBasedAnimations(void *); -bool __fastcall sub_42F7EB_DropItemAt(unsigned int uSpriteID, int x, int y, int z, int a4, int count, int a7, unsigned __int16 attributes, ItemGen *a9); -void __fastcall sub_42F960_create_object(int x, int y, int z); // idb void CompactLayingItemsList(); -void _42FA66_do_explosive_impact(int a1, int a2, int a3, int a4, __int16 a5, signed int a6); void sub_42FBDD(); void CloseWindowBackground(); -void ProcessInputActions(); void GameUI_MsgProc(); void back_to_game(); void GUI_MainMenuMessageProc();