# HG changeset patch
# User Ritor1
# Date 1396450427 -21600
# Node ID 82851980e3d88afa97c08be5c5d3d1efb10eb0c5
# Parent defd2526c94cbcef2c8f7efbfa7c1ed4f4ec0bd5# Parent 9551756f46c495c09efe88f1fe54a935cdba74e8
Слияние
diff -r defd2526c94c -r 82851980e3d8 Actor.cpp
--- a/Actor.cpp Wed Apr 02 20:53:35 2014 +0600
+++ b/Actor.cpp Wed Apr 02 20:53:47 2014 +0600
@@ -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 defd2526c94c -r 82851980e3d8 Build/Visual Studio 2012/World of Might and Magic.vcxproj
--- a/Build/Visual Studio 2012/World of Might and Magic.vcxproj Wed Apr 02 20:53:35 2014 +0600
+++ b/Build/Visual Studio 2012/World of Might and Magic.vcxproj Wed Apr 02 20:53:47 2014 +0600
@@ -202,6 +202,7 @@
+
diff -r defd2526c94c -r 82851980e3d8 Build/Visual Studio 2012/World of Might and Magic.vcxproj.filters
--- a/Build/Visual Studio 2012/World of Might and Magic.vcxproj.filters Wed Apr 02 20:53:35 2014 +0600
+++ b/Build/Visual Studio 2012/World of Might and Magic.vcxproj.filters Wed Apr 02 20:53:47 2014 +0600
@@ -385,6 +385,7 @@
lib\libpng
+
diff -r defd2526c94c -r 82851980e3d8 CastSpellInfo.cpp
--- a/CastSpellInfo.cpp Wed Apr 02 20:53:35 2014 +0600
+++ b/CastSpellInfo.cpp Wed Apr 02 20:53:47 2014 +0600
@@ -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 defd2526c94c -r 82851980e3d8 Chest.cpp
--- a/Chest.cpp Wed Apr 02 20:53:35 2014 +0600
+++ b/Chest.cpp Wed Apr 02 20:53:47 2014 +0600
@@ -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 defd2526c94c -r 82851980e3d8 DecalBuilder.cpp
--- a/DecalBuilder.cpp Wed Apr 02 20:53:35 2014 +0600
+++ b/DecalBuilder.cpp Wed Apr 02 20:53:47 2014 +0600
@@ -244,7 +244,7 @@
{
//DecalBuilder *v12; // esi@1
Decal *v13; // edi@2
- int *v14; // eax@2
+ //int *v14; // eax@2
//double v15; // st7@4
//double v16; // st7@4
//int v17; // eax@4
@@ -280,11 +280,11 @@
if ( a6 == 0.0 )
return 1;
v13 = &this->std__vector_pDecals[this->field_308008];
- v14 = &this->std__vector_pDecals[this->field_308008].field_C1C;
+ //v14 = &this->std__vector_pDecals[this->field_308008].field_C1C;
this->std__vector_pDecals[this->field_308008].field_C18 = (DecalBuilder_stru0 *)a4;
- *v14 = 0;
+ this->std__vector_pDecals[this->field_308008].field_C1C = 0;
if ( a3 & 2 )
- *v14 = 1;
+ this->std__vector_pDecals[this->field_308008].field_C1C = 1;
//v15 = a6 - a8;
this->field_30C028 = a6 - a8;
//v16 = sqrt((a6 + a6 - this->field_30C028) * this->field_30C028);
diff -r defd2526c94c -r 82851980e3d8 Events.cpp
--- a/Events.cpp Wed Apr 02 20:53:35 2014 +0600
+++ b/Events.cpp Wed Apr 02 20:53:47 2014 +0600
@@ -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 defd2526c94c -r 82851980e3d8 GUIWindow.cpp
--- a/GUIWindow.cpp Wed Apr 02 20:53:35 2014 +0600
+++ b/GUIWindow.cpp Wed Apr 02 20:53:47 2014 +0600
@@ -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 defd2526c94c -r 82851980e3d8 Game.cpp
--- a/Game.cpp Wed Apr 02 20:53:35 2014 +0600
+++ b/Game.cpp Wed Apr 02 20:53:47 2014 +0600
@@ -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 defd2526c94c -r 82851980e3d8 Indoor.cpp
--- a/Indoor.cpp Wed Apr 02 20:53:35 2014 +0600
+++ b/Indoor.cpp Wed Apr 02 20:53:47 2014 +0600
@@ -516,7 +516,7 @@
if (stru_F8AD28.uNumLightsApplied > 0 && !pFace->Indoor_sky())
pGame->pLightmapBuilder->ApplyLights(&stru_F8AD28, &stru_F7B60C, uNumVerticesa, array_507D30, pVertices, 0);
- if (pDecalBuilder->uNumDecals > 0)
+ if (pDecalBuilder->uNumDecals > 0)//
pDecalBuilder->ApplyDecals(a4a, 1, &stru_F7B60C, uNumVerticesa, array_507D30, pVertices, 0, pFace->uSectorID);
if (pFace->Fluid())
diff -r defd2526c94c -r 82851980e3d8 Keyboard.cpp
--- a/Keyboard.cpp Wed Apr 02 20:53:35 2014 +0600
+++ b/Keyboard.cpp Wed Apr 02 20:53:47 2014 +0600
@@ -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 defd2526c94c -r 82851980e3d8 Keyboard.h
--- a/Keyboard.h Wed Apr 02 20:53:35 2014 +0600
+++ b/Keyboard.h Wed Apr 02 20:53:47 2014 +0600
@@ -85,6 +85,7 @@
{}
bool WasKeyPressed(int vKey);
static bool IsKeyBeingHeld(int vKey);
+ static void ProcessInputActions();
bool IsShiftHeld();
void EnterCriticalSection();
diff -r defd2526c94c -r 82851980e3d8 LightmapBuilder.cpp
--- a/LightmapBuilder.cpp Wed Apr 02 20:53:35 2014 +0600
+++ b/LightmapBuilder.cpp Wed Apr 02 20:53:47 2014 +0600
@@ -240,7 +240,7 @@
if (!v11->uNumVertices)
return true;
- v45 = _45C6D6(uNumVertices, a9, v11);// ( )
+ v45 = _45C6D6(uNumVertices, a9, v11);
if ( v45 != uNumVertices && v45 > 0 )
_45C4B9(uNumVertices, a9, v11);
//v59 = v11->uNumVertices;
@@ -340,7 +340,7 @@
char v26; // [sp+1Eh] [bp-2h]@17
char v27; // [sp+1Fh] [bp-1h]@17
- __debugbreak();//Ritor1: needed cleaning
+ //__debugbreak();//Ritor1: needed cleaning
v4 = pLightmap;
v5 = 0;
@@ -487,7 +487,7 @@
: pLightmap->pVertices[i].vWorldPosition.z - a3[j].vWorldPosition.z;
if ( v11 < 2.0 )
{
- v12 = v9 + v11 + v10;//Ritor1: : , ,
+ v12 = v9 + v11 + v10;
if ( v12 < v16 )
{
v16 = v12;
diff -r defd2526c94c -r 82851980e3d8 OurMath.cpp
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/OurMath.cpp Wed Apr 02 20:53:47 2014 +0600
@@ -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 defd2526c94c -r 82851980e3d8 Outdoor.cpp
--- a/Outdoor.cpp Wed Apr 02 20:53:35 2014 +0600
+++ b/Outdoor.cpp Wed Apr 02 20:53:47 2014 +0600
@@ -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 defd2526c94c -r 82851980e3d8 Player.cpp
--- a/Player.cpp Wed Apr 02 20:53:35 2014 +0600
+++ b/Player.cpp Wed Apr 02 20:53:47 2014 +0600
@@ -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 defd2526c94c -r 82851980e3d8 Player.h
--- a/Player.h Wed Apr 02 20:53:35 2014 +0600
+++ b/Player.h Wed Apr 02 20:53:47 2014 +0600
@@ -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 defd2526c94c -r 82851980e3d8 Render.cpp
--- a/Render.cpp Wed Apr 02 20:53:35 2014 +0600
+++ b/Render.cpp Wed Apr 02 20:53:47 2014 +0600
@@ -7331,17 +7331,11 @@
//----- (004A68EF) --------------------------------------------------------
void Render::DrawMasked(signed int a2, signed int a3, Texture *pTexture, unsigned __int16 mask)
{
- Texture *v4; // edi@2
unsigned int v5; // ebx@4
- //unsigned __int16 *v6; // eax@4
- signed int v7; // edx@5
- int v8; // edx@6
- signed int v9; // edx@7
int v10; // edx@8
signed int v11; // edx@9
signed int v12; // esi@12
signed int v13; // esi@15
- unsigned int v14; // edx@17
signed int v15; // esi@18
unsigned __int8 *v16; // ebx@22
char v17; // zf@28
@@ -7350,65 +7344,54 @@
int v20; // [sp+1Ch] [bp-4h]@4
int v21; // [sp+28h] [bp+8h]@24
unsigned int v22; // [sp+2Ch] [bp+Ch]@22
- unsigned int pTexturea; // [sp+30h] [bp+10h]@11
if (!uNumSceneBegins || !pTexture)
return;
- v4 = pTexture;
-
- if ( pTexture->pPalette16 )
- {
- v5 = pTexture->uTextureHeight;
- //v6 = &this->pTargetSurface[a2 + a3 * this->uTargetSurfacePitch];
- v19 = pTexture->pLevelOfDetail0_prolly_alpha_mask;
- v20 = pTexture->uTextureWidth;
- v18 = pTexture->uTextureWidth;
- int clipped_out_x = a2;
- int clipped_out_y = a3;
- if ( this->bClip )
- {
- v7 = this->uClipX;
- if ( a2 < v7 )
- {
- v8 = v7 - a2;
- v19 += v8;
- v20 += a2 - this->uClipX;
- //v6 += v8;
- clipped_out_x = uClipX;
- }
- v9 = this->uClipY;
- v5 = pTexture->uTextureHeight;
- if ( a3 < v9 )
- {
- v10 = v9 - a3;
- v19 += v18 * v10;
- v5 = a3 - this->uClipY + pTexture->uTextureHeight;
- v4 = pTexture;
- //v6 += this->uTargetSurfacePitch * v10;
- clipped_out_y = uClipY;
- }
- v11 = this->uClipX;
- if ( v11 < a2 )
- v11 = a2;
- pTexturea = this->uClipZ;
- if ( v11 + v20 > (signed int)pTexturea )
- {
- v12 = this->uClipX;
- if ( v12 < a2 )
- v12 = a2;
- v20 = pTexturea - v12;
+ if ( pTexture->pPalette16 )
+ {
+ v5 = pTexture->uTextureHeight;
+ //v6 = &this->pTargetSurface[a2 + a3 * this->uTargetSurfacePitch];
+ v19 = pTexture->pLevelOfDetail0_prolly_alpha_mask;
+ v20 = pTexture->uTextureWidth;
+ v18 = pTexture->uTextureWidth;
+ int clipped_out_x = a2;
+ int clipped_out_y = a3;
+ if ( this->bClip )
+ {
+ if ( a2 < this->uClipX )
+ {
+ v19 += this->uClipX - a2;
+ v20 += a2 - this->uClipX;
+ clipped_out_x = uClipX;
+ }
+ v5 = pTexture->uTextureHeight;
+ if ( a3 < this->uClipY )
+ {
+ v10 = this->uClipY - a3;
+ v19 += v18 * v10;
+ v5 = a3 - this->uClipY + pTexture->uTextureHeight;
+ clipped_out_y = uClipY;
+ }
+ v11 = this->uClipX;
+ if ( this->uClipX < a2 )
+ v11 = a2;
+ if ( v11 + v20 > (signed int)this->uClipZ )
+ {
+ v12 = this->uClipX;
+ if ( v12 < a2 )
+ v12 = a2;
+ v20 = this->uClipZ - v12;
}
v13 = this->uClipY;
- if ( v13 < a3 )
+ if ( this->uClipY < a3 )
v13 = a3;
- v14 = this->uClipW;
- if ( (signed int)(v5 + v13) > (signed int)v14 )
+ if ( (signed int)(v5 + v13) > (signed int)this->uClipW )
{
v15 = this->uClipY;
- if ( v15 < a3 )
+ if ( this->uClipY < a3 )
v15 = a3;
- v5 = v14 - v15;
+ v5 = this->uClipW - v15;
}
}
@@ -7418,7 +7401,7 @@
for (int x = 0; x < v20; ++x)
{
if ( *v16 )
- WritePixel16(clipped_out_x + x, clipped_out_y + y, v4->pPalette16[*v16] & mask);
+ WritePixel16(clipped_out_x + x, clipped_out_y + y, pTexture->pPalette16[*v16] & mask);
++v16;
}
v16 += v18 - v20;
diff -r defd2526c94c -r 82851980e3d8 Spells.cpp
--- a/Spells.cpp Wed Apr 02 20:53:35 2014 +0600
+++ b/Spells.cpp Wed Apr 02 20:53:47 2014 +0600
@@ -47,120 +47,140 @@
{545, 0},
{555, 0}
}};
+
+
+
+SpellData::SpellData( __int16 innormalMana, __int16 inExpertLevelMana, __int16 inMasterLevelMana, __int16 inMagisterLevelMana,
+ __int16 inNormalLevelRecovery, __int16 inExpertLevelRecovery, __int16 inMasterLevelRecovery, __int16 inMagisterLevelRecovery,
+ __int8 inbaseDamage, __int8 inbonusSkillDamage, __int16 instats ):
+uNormalLevelMana(innormalMana),
+uExpertLevelMana(inExpertLevelMana),
+uMasterLevelMana(inMasterLevelMana),
+uMagisterLevelMana(inMagisterLevelMana),
+uNormalLevelRecovery(inNormalLevelRecovery),
+uExpertLevelRecovery(inExpertLevelRecovery),
+uMasterLevelRecovery(inMasterLevelRecovery),
+uMagisterLevelRecovery(inMagisterLevelRecovery),
+baseDamage(inbaseDamage),
+bonusSkillDamage(inbonusSkillDamage),
+stats(instats)
+{
+
+}
+
//9 spellbook pages 11 spells per page 9*11 =99 +1 zero struct at 0. It counted from 1!
std::array pSpellDatas={{
- {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ SpellData(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
- {1, 1, 1, 1, 60, 60, 60, 40, 0, 0},//0
- {2, 2, 2, 2, 110, 110, 100, 90, 768, 0},
- {3, 3, 3, 3, 120, 120, 120, 120, 0, 0},
- {4, 4, 4, 4, 120, 120, 120, 120, 0, 0},
- {5, 5, 5, 5, 120, 120, 120, 120, 0, 0},
- {8, 8, 8, 8, 100, 100, 90, 80, 1536, 0},
- {10, 10, 10, 10, 150, 150, 150, 150, 1536, 0},
- {15, 15, 15, 15, 120, 120, 120, 120, 1536, 0},
- {20, 20, 20, 20, 100, 100, 100, 90, 264, 0},
- {25, 25, 25, 25, 100, 100, 100, 90, 268, 0},
- {30, 30, 30, 30, 90, 90, 90, 90, 3855, 0},
+ SpellData(1, 1, 1, 1, 60, 60, 60, 40, 0, 0, 0),//0 fire
+ SpellData(2, 2, 2, 2, 110, 110, 100, 90, 3, 3, 0),
+ SpellData(3, 3, 3, 3, 120, 120, 120, 120, 0, 0, 0),
+ SpellData(4, 4, 4, 4, 120, 120, 120, 120, 0, 0, 0),
+ SpellData(5, 5, 5, 5, 120, 120, 120, 120, 0, 0, 0),
+ SpellData(8, 8, 8, 8, 100, 100, 90, 80, 0, 6, 0),
+ SpellData(10, 10, 10, 10, 150, 150, 150, 150, 0, 6, 0),
+ SpellData(15, 15, 15, 15, 120, 120, 120, 120, 0, 6, 0),
+ SpellData(20, 20, 20, 20, 100, 100, 100, 90, 8, 1, 0),
+ SpellData(25, 25, 25, 25, 100, 100, 100, 90, 12, 1, 0),
+ SpellData(30, 30, 30, 30, 90, 90, 90, 90, 15, 15, 0),
- {1, 1, 1, 0, 60, 60, 60, 60, 0, 0}, //1
- {2, 2, 2, 2, 120, 120, 120, 100, 0, 0},
- {3, 3, 3, 3, 120, 120, 120, 120, 0, 0},
- {4, 4, 4, 4, 110, 100, 90, 80, 258, 0},
- {5, 5, 5, 5, 90, 90, 70, 50, 0, 0},
- {8, 8, 8, 8, 120, 120, 120, 120, 0, 0},
- {10, 10, 10, 10, 100, 100, 90, 70, 2048, 0},
- {15, 15, 15, 15, 200, 200, 200, 200, 0, 0},
- {20, 20, 20, 20, 100, 100, 100, 90, 2570, 0},
- {25, 25, 25, 25, 250, 250, 250, 250, 0, 0},
- {30, 30, 30, 30, 90, 90, 90, 90, 276, 0},
+ SpellData(1, 1, 1, 0, 60, 60, 60, 60, 0, 0, 0), //1 air
+ SpellData(2, 2, 2, 2, 120, 120, 120, 100, 0, 0, 0),
+ SpellData(3, 3, 3, 3, 120, 120, 120, 120, 0, 0, 0),
+ SpellData(4, 4, 4, 4, 110, 100, 90, 80, 2, 1, 0),
+ SpellData(5, 5, 5, 5, 90, 90, 70, 50, 0, 0, 0),
+ SpellData(8, 8, 8, 8, 120, 120, 120, 120, 0, 0, 0),
+ SpellData(10, 10, 10, 10, 100, 100, 90, 70, 0, 8, 0),
+ SpellData(15, 15, 15, 15, 200, 200, 200, 200, 0, 0, 0),
+ SpellData(20, 20, 20, 20, 100, 100, 100, 90, 10, 10, 0),
+ SpellData(25, 25, 25, 25, 250, 250, 250, 250, 0, 0, 0),
+ SpellData(30, 30, 30, 30, 90, 90, 90, 90, 20, 1, 0),
- {1, 1, 1, 1, 60, 60, 60, 20, 0, 0}, //2
- {2, 2, 2, 2, 110, 100, 90, 70, 514, 0},
- {3, 3, 3, 3, 120, 120, 120, 120, 0, 0},
- {4, 4, 4, 4, 110, 100, 90, 80, 1024, 0},
- {5, 5, 5, 5, 150, 150, 150, 150, 0, 0},
- {8, 8, 8, 8, 200, 200, 200, 200, 0, 0},
- {10, 10, 10, 10, 100, 100, 90, 80, 2313, 0},
- {15, 15, 15, 15, 140, 140, 140, 140, 0, 0},
- {20, 20, 20, 20, 200, 200, 200, 200, 0, 0},
- {25, 25, 25, 25, 80, 80, 80, 80, 780, 0},
- {30, 30, 30, 30, 250, 250, 250, 250, 0, 0},
+ SpellData(1, 1, 1, 1, 60, 60, 60, 20, 0, 0, 0), //2 water
+ SpellData(2, 2, 2, 2, 110, 100, 90, 70, 2, 2, 0),
+ SpellData(3, 3, 3, 3, 120, 120, 120, 120, 0, 0, 0),
+ SpellData(4, 4, 4, 4, 110, 100, 90, 80, 0, 4, 0),
+ SpellData(5, 5, 5, 5, 150, 150, 150, 150, 0, 0, 0),
+ SpellData(8, 8, 8, 8, 200, 200, 200, 200, 0, 0, 0),
+ SpellData(10, 10, 10, 10, 100, 100, 90, 80, 9, 9, 0),
+ SpellData(15, 15, 15, 15, 140, 140, 140, 140, 0, 0, 0),
+ SpellData(20, 20, 20, 20, 200, 200, 200, 200, 0, 0, 0),
+ SpellData(25, 25, 25, 25, 80, 80, 80, 80, 12, 3, 0),
+ SpellData(30, 30, 30, 30, 250, 250, 250, 250, 0, 0, 0),
- {1, 1, 1, 1, 80, 80, 80, 80, 0, 0}, //3
- {2, 2, 2, 2, 100, 100, 100, 100, 0, 0},
- {3, 3, 3, 3, 120, 120, 120, 120, 0, 0},
- {4, 4, 4, 4, 110, 100, 90, 80, 773, 0},
- {5, 5, 5, 5, 120, 120, 120, 120, 0, 0},
- {8, 8, 8, 8, 100, 100, 90, 80, 2304, 0},
- {10, 10, 10, 10, 140, 140, 140, 140, 0, 0},
- {15, 15, 15, 15, 90, 90, 90, 80, 2048, 0},
- {20, 20, 20, 20, 150, 150, 150, 150, 0, 0},
- {25, 25, 25, 25, 100, 100, 100, 90, 276, 0},
- {30, 30, 30, 30, 90, 90, 90, 90, 25, 0},
+ SpellData(1, 1, 1, 1, 80, 80, 80, 80, 0, 0, 0), //3 earth
+ SpellData(2, 2, 2, 2, 100, 100, 100, 100, 0, 0, 0),
+ SpellData(3, 3, 3, 3, 120, 120, 120, 120, 0, 0, 0),
+ SpellData(4, 4, 4, 4, 110, 100, 90, 80, 5, 3, 0),
+ SpellData(5, 5, 5, 5, 120, 120, 120, 120, 0, 0, 0),
+ SpellData(8, 8, 8, 8, 100, 100, 90, 80, 0, 9, 0),
+ SpellData(10, 10, 10, 10, 140, 140, 140, 140, 0, 0, 0),
+ SpellData(15, 15, 15, 15, 90, 90, 90, 80, 0, 8, 0),
+ SpellData(20, 20, 20, 20, 150, 150, 150, 150, 0, 0, 0),
+ SpellData(25, 25, 25, 25, 100, 100, 100, 90, 20, 1, 0),
+ SpellData(30, 30, 30, 30, 90, 90, 90, 90, 25, 0, 0),
- {1, 1, 1, 1, 100, 100, 100, 100, 0, 0}, //4
- {2, 2, 2, 2, 100, 100, 100, 100, 0, 0},
- {3, 3, 3, 3, 90, 90, 90, 90, 0, 0},
- {4, 4, 4, 4, 120, 120, 120, 120, 0, 0},
- {5, 5, 5, 5, 120, 120, 120, 120, 0, 0},
- {8, 8, 8, 8, 120, 120, 120, 120, 0, 0},
- {10, 10, 10, 10, 120, 120, 120, 120, 0, 0},
- {15, 15, 15, 15, 100, 100, 100, 100, 2058, 0},
- {20, 20, 20, 20, 240, 240, 240, 240, 0, 0},
- {25, 25, 25, 25, 150, 150, 150, 150, 0, 0},
- {30, 30, 30, 30, 1000, 1000, 1000, 1000, 0, 0},
+ SpellData(1, 1, 1, 1, 100, 100, 100, 100, 0, 0, 0), //4 spirit
+ SpellData(2, 2, 2, 2, 100, 100, 100, 100, 0, 0, 0),
+ SpellData(3, 3, 3, 3, 90, 90, 90, 90, 0, 0, 0),
+ SpellData(4, 4, 4, 4, 120, 120, 120, 120, 0, 0, 0),
+ SpellData(5, 5, 5, 5, 120, 120, 120, 120, 0, 0, 0),
+ SpellData(8, 8, 8, 8, 120, 120, 120, 120, 0, 0, 0),
+ SpellData(10, 10, 10, 10, 120, 120, 120, 120, 0, 0, 0),
+ SpellData(15, 15, 15, 15, 100, 100, 100, 100, 10, 8, 0),
+ SpellData(20, 20, 20, 20, 240, 240, 240, 240, 0, 0, 0),
+ SpellData(25, 25, 25, 25, 150, 150, 150, 150, 0, 0, 0),
+ SpellData(30, 30, 30, 30, 1000, 1000, 1000, 1000, 0, 0, 0),
- {1, 1, 1, 1, 120, 120, 120, 120, 0, 0}, //5
- {2, 2, 2, 2, 110, 110, 110, 110, 771, 0},
- {3, 3, 3, 3, 120, 120, 120, 120, 0, 0},
- {4, 4, 4, 4, 110, 100, 90, 80, 0, 0},
- {5, 5, 5, 5, 100, 100, 100, 100, 0, 0},
- {8, 8, 8, 8, 120, 120, 120, 120, 0, 0},
- {10, 10, 10, 10, 120, 120, 120, 120, 0, 0},
- {15, 15, 15, 15, 80, 80, 80, 80, 0, 0},
- {20, 20, 20, 20, 120, 120, 120, 120, 0, 0},
- {25, 25, 25, 25, 110, 110, 110, 100, 268, 0},
- {30, 30, 30, 30, 120, 120, 120, 120, 0, 0},
+ SpellData(1, 1, 1, 1, 120, 120, 120, 120, 0, 0, 0), //5 mind
+ SpellData(2, 2, 2, 2, 110, 110, 110, 110, 3, 3, 0),
+ SpellData(3, 3, 3, 3, 120, 120, 120, 120, 0, 0, 0),
+ SpellData(4, 4, 4, 4, 110, 100, 90, 80, 0, 0, 0),
+ SpellData(5, 5, 5, 5, 100, 100, 100, 100, 0, 0, 0),
+ SpellData(8, 8, 8, 8, 120, 120, 120, 120, 0, 0, 0),
+ SpellData(10, 10, 10, 10, 120, 120, 120, 120, 0, 0, 0),
+ SpellData(15, 15, 15, 15, 80, 80, 80, 80, 0, 0, 0),
+ SpellData(20, 20, 20, 20, 120, 120, 120, 120, 0, 0, 0),
+ SpellData(25, 25, 25, 25, 110, 110, 110, 100, 12, 12, 0),
+ SpellData(30, 30, 30, 30, 120, 120, 120, 120, 0, 0, 0),
- {1, 1, 1, 1, 120, 120, 120, 120, 0, 0}, //6
- {2, 2, 2, 2, 100, 100, 100, 100, 0, 0},
- {3, 3, 3, 3, 120, 120, 120, 120, 0, 0},
- {4, 4, 4, 4, 110, 100, 90, 80, 520, 0},
- {5, 5, 5, 5, 110, 110, 110, 110, 0, 0},
- {8, 8, 8, 8, 120, 120, 120, 120, 0, 0},
- {10, 10, 10, 10, 120, 120, 120, 120, 0, 0},
- {15, 15, 15, 15, 120, 120, 120, 120, 0, 0},
- {20, 20, 20, 20, 120, 120, 120, 120, 0, 0},
- {25, 25, 25, 25, 110, 110, 110, 100, 1310, 0},
- {30, 30, 30, 30, 100, 100, 100, 100, 0, 0},
+ SpellData(1, 1, 1, 1, 120, 120, 120, 120, 0, 0, 0), //6 body
+ SpellData(2, 2, 2, 2, 100, 100, 100, 100, 0, 0, 0),
+ SpellData(3, 3, 3, 3, 120, 120, 120, 120, 0, 0, 0),
+ SpellData(4, 4, 4, 4, 110, 100, 90, 80, 8, 2, 0),
+ SpellData(5, 5, 5, 5, 110, 110, 110, 110, 0, 0, 0),
+ SpellData(8, 8, 8, 8, 120, 120, 120, 120, 0, 0, 0),
+ SpellData(10, 10, 10, 10, 120, 120, 120, 120, 0, 0, 0),
+ SpellData(15, 15, 15, 15, 120, 120, 120, 120, 0, 0, 0),
+ SpellData(20, 20, 20, 20, 120, 120, 120, 120, 0, 0, 0),
+ SpellData(25, 25, 25, 25, 110, 110, 110, 100, 30, 5, 0),
+ SpellData(30, 30, 30, 30, 100, 100, 100, 100, 0, 0, 0),
- {5, 5, 5, 5, 110, 100, 90, 80, 1024, 0}, //7
- {10, 10, 10, 10, 120, 110, 100, 90, 4112, 0},
- {15, 15, 15, 15, 120, 110, 100, 90, 0, 0},
- {20, 20, 20, 20, 160, 140, 120, 100, 0, 0},
- {25, 25, 25, 25, 140, 140, 140, 140, 0, 0},
- {30, 30, 30, 30, 500, 500, 500, 500, 0, 0},
- {35, 35, 35, 35, 135, 135, 120, 100, 281, 0},
- {40, 40, 40, 40, 500, 500, 500, 500, 0, 0},
- {45, 45, 45, 45, 250, 250, 250, 250, 0, 0},
- {50, 50, 50, 50, 150, 150, 150, 135, 5140, 0},
- {55, 55, 55, 55, 300, 300, 300, 300, 0, 0},
+ SpellData(5, 5, 5, 5, 110, 100, 90, 80, 0, 4, 0), //7 light
+ SpellData(10, 10, 10, 10, 120, 110, 100, 90, 16, 16, 0),
+ SpellData(15, 15, 15, 15, 120, 110, 100, 90, 0, 0, 0),
+ SpellData(20, 20, 20, 20, 160, 140, 120, 100, 0, 0, 0),
+ SpellData(25, 25, 25, 25, 140, 140, 140, 140, 0, 0, 0),
+ SpellData(30, 30, 30, 30, 500, 500, 500, 500, 0, 0, 0),
+ SpellData(35, 35, 35, 35, 135, 135, 120, 100, 25, 1, 0),
+ SpellData(40, 40, 40, 40, 500, 500, 500, 500, 0, 0, 0),
+ SpellData(45, 45, 45, 45, 250, 250, 250, 250, 0, 0, 0),
+ SpellData(50, 50, 50, 50, 150, 150, 150, 135, 20, 20, 0),
+ SpellData(55, 55, 55, 55, 300, 300, 300, 300, 0, 0, 0),
- {10, 10, 10, 10, 140, 140, 140, 140, 0, 0}, //8
- {15, 15, 15, 15, 120, 110, 100, 90, 2585, 0},
- {20, 20, 20, 20, 120, 100, 90, 120, 0, 0},
- {25, 25, 25, 25, 120, 120, 120, 120, 0, 0},
- {30, 30, 30, 30, 90, 90, 80, 70, 1542, 0},
- {35, 35, 35, 35, 120, 120, 100, 80, 0, 0},
- {40, 40, 40, 40, 110, 110, 110, 110, 0, 0},
- {45, 45, 45, 45, 200, 200, 200, 150, 0, 0},
- {50, 50, 50, 50, 120, 120, 120, 100, 6400, 0},
- {55, 55, 55, 55, 250, 250, 250, 250, 306, 0},
- {60, 60, 60, 60, 300, 300, 300, 300, 2073, 0}
+ SpellData(10, 10, 10, 10, 140, 140, 140, 140, 0, 0, 0), //8 dark
+ SpellData(15, 15, 15, 15, 120, 110, 100, 90, 25, 10, 0),
+ SpellData(20, 20, 20, 20, 120, 100, 90, 120, 0, 0, 0),
+ SpellData(25, 25, 25, 25, 120, 120, 120, 120, 0, 0, 0),
+ SpellData(30, 30, 30, 30, 90, 90, 80, 70, 6, 6, 0),
+ SpellData(35, 35, 35, 35, 120, 120, 100, 80, 0, 0, 0),
+ SpellData(40, 40, 40, 40, 110, 110, 110, 110, 0, 0, 0),
+ SpellData(45, 45, 45, 45, 200, 200, 200, 150, 0, 0, 0),
+ SpellData(50, 50, 50, 50, 120, 120, 120, 100, 0, 25, 0),
+ SpellData(55, 55, 55, 55, 250, 250, 250, 250, 50, 1, 0),
+ SpellData(60, 60, 60, 60, 300, 300, 300, 300, 25, 8, 0)
}};
-
std::array wand_spell_ids =
{
// 135 Wand of Fire 136 Wand of Sparks 137 Wand of Poison 138 Wand of Stunning 139 Wand of Harm
@@ -330,773 +350,391 @@
if ((i % 11)==0)
strtok(NULL, "\r");
}
-
}
//----- (00448DF8) --------------------------------------------------------
void __fastcall EventCastSpell(int uSpellID, int uSkillLevel, int uSkill, int fromx, int fromy, int fromz, int tox, int toy, int toz)//sub_448DF8
{
int v9; // esi@1
- double v10; // st7@4
- double v11; // st6@4
- double v12; // st5@4
+ signed __int64 v10; // st7@4
+ signed __int64 v11; // st6@4
+ signed __int64 v12; // st5@4
double v13; // st7@6
int v14; // ST44_4@7
- signed int v15; // ebx@9
- signed int v16; // edx@15
- char *v17; // ecx@16
- unsigned __int16 v18; // ax@20
- char *v19; // ecx@31
- int v20; // edx@35
- signed int v21; // edx@37
- char *v22; // ecx@38
- unsigned __int16 v23; // ax@41
+ uint skillMasteryPlusOne; // ebx@9
+ uint v16; // edx@15
int i; // esi@42
- signed int v25; // edx@55
- char *v26; // ecx@56
- unsigned __int16 v27; // ax@59
int j; // esi@60
- signed int v29; // edx@66
- char *v30; // ecx@67
- unsigned __int16 v31; // ax@70
- //Player *v32; // eax@80
- //unsigned __int16 v33; // si@85
- int v34; // eax@96
- int v35; // eax@97
unsigned __int64 v36; // qax@99
SpellBuff *v37; // ecx@99
int v38; // esi@103
signed __int64 v39; // qax@105
- int v40; // ebx@108
- int v41; // ebx@109
int v42; // esi@111
int v43; // ebx@111
- int v44; // eax@117
- //unsigned __int16 v45; // si@137
- unsigned __int16 v46; // [sp-8h] [bp-BCh]@99
int v47; // [sp-4h] [bp-B8h]@35
- unsigned __int16 v48; // [sp-4h] [bp-B8h]@99
int v49; // [sp+0h] [bp-B4h]@35
- int v50; // [sp+0h] [bp-B4h]@99
- int v51; // [sp+4h] [bp-B0h]@35
- unsigned __int8 v52; // [sp+4h] [bp-B0h]@99
- float v53; // [sp+14h] [bp-A0h]@4
- float v54; // [sp+18h] [bp-9Ch]@4
int v55; // [sp+28h] [bp-8Ch]@7
unsigned int yaw; // [sp+30h] [bp-84h]@7
int pitch; // [sp+34h] [bp-80h]@7
- //SpriteObject a1; // [sp+38h] [bp-7Ch]@12
- int v59; // [sp+A8h] [bp-Ch]@1
int v60; // [sp+ACh] [bp-8h]@1
- //int spellnum_; // [sp+B0h] [bp-4h]@1
- //signed int levela; // [sp+BCh] [bp+8h]@80
int a6_4; // [sp+C8h] [bp+14h]@117
- float a7a; // [sp+CCh] [bp+18h]@6
- signed int a7b; // [sp+CCh] [bp+18h]@12
int a7c; // [sp+CCh] [bp+18h]@29
int a7d; // [sp+CCh] [bp+18h]@55
- float a8a; // [sp+D0h] [bp+1Ch]@6
+ signed __int64 xSquared; // [sp+D0h] [bp+1Ch]@6
int a8b; // [sp+D0h] [bp+1Ch]@37
int a8c; // [sp+D0h] [bp+1Ch]@55
- float toza; // [sp+D4h] [bp+20h]@6
+ signed __int64 ySquared; // [sp+D4h] [bp+20h]@6
v9 = 0;
- v59 = uSkillLevel + 1;
+ skillMasteryPlusOne = uSkillLevel + 1;
//spellnum_ = uSpellID;
v60 = 0;
if ( tox || toy || toz )
{
- v10 = (double)tox - (double)fromx;
- v53 = v10;
- v11 = (double)toy - (double)fromy;
- v54 = v11;
- v12 = (double)toz;
+ v10 = tox - fromx;
+ v11 = toy - fromy;
+ v12 = toz - fromz;
}
else
{
- v10 = (double)pParty->vPosition.x - (double)fromx;
- v53 = v10;
- v11 = (double)pParty->vPosition.y - (double)fromy;
- v54 = v11;
- v12 = (double)(pParty->vPosition.z + pParty->sEyelevel);
+ v10 = pParty->vPosition.x - fromx;
+ v11 = pParty->vPosition.y - fromy;
+ v12 = (pParty->vPosition.z + pParty->sEyelevel) - fromz;
}
- a7a = v12 - (double)fromz;
- toza = v11 * v11;
- a8a = v10 * v10;
- v13 = sqrt(a7a * a7a + a8a + toza);
+ v13 = sqrt(v10 * v10 + v11 * v11 + v12 * v12);
if ( v13 <= 1.0 )
{
- LOBYTE(v55) = 1;
+ v55 = 1;
yaw = 0;
pitch = 0;
}
else
{
- v55 = (signed __int64)v13;
- v14 = (signed __int64)sqrt(a8a + toza);
- yaw = stru_5C6E00->Atan2((signed __int64)v53, (signed __int64)v54);
- pitch = stru_5C6E00->Atan2(v14, (signed __int64)a7a);
+ v55 = (int)v13;
+ ySquared = v11 * v11;
+ xSquared = v10 * v10;
+ v14 = (int)sqrt(xSquared + ySquared);
+ yaw = stru_5C6E00->Atan2((int)v10, (int)v11);
+ pitch = stru_5C6E00->Atan2(v14, (int)v12);
}
- v15 = v59;
- if ( v59 <= 0 || v59 > 4 )
- v15 = 1;
- a7b = v15;
+ Assert(skillMasteryPlusOne > 0 && skillMasteryPlusOne <= 4, "Invalid mastery level");
SpriteObject a1; // [sp+38h] [bp-7Ch]@12
//SpriteObject::SpriteObject(&a1);
- a1.uType = stru_4E3ACC[uSpellID].uType;
- if ( uSpellID > 58 )
- {
- if ( uSpellID == SPELL_BODY_PROTECTION_FROM_BODY )
- goto LABEL_117;
- if ( uSpellID != SPELL_LIGHT_DAY_OF_THE_GODS )
- return;
- v40 = v15 - 2;
- if ( v40 )
- {
- v41 = v40 - 1;
- if ( !v41 )
- {
- v42 = 14400 * uSkill;
- v43 = 4 * uSkill + 10;
- pGame->pStru6Instance->SetPlayerBuffAnim(0x53u, 0);
- pGame->pStru6Instance->SetPlayerBuffAnim(0x53u, 1u);
- pGame->pStru6Instance->SetPlayerBuffAnim(0x53u, 2u);
- pGame->pStru6Instance->SetPlayerBuffAnim(0x53u, 3u);
- v39 = (signed __int64)((double)(v42 << 7) * 0.033333335);
- v37 = &pParty->pPartyBuffs[PARTY_BUFF_DAY_OF_GODS];
- v36 = pParty->uTimePlayed + v39;
- v37->Apply(v36, a7b, v43, 0, 0);
- pAudioPlayer->PlaySound((SoundID)word_4EE088_sound_ids[uSpellID], 0, 0, fromx, fromy, 0, 0, 0);
- return;
- }
- if ( v41 == 1 )
- {
- v42 = 18000 * uSkill;
- v43 = 5 * uSkill + 10;
- pGame->pStru6Instance->SetPlayerBuffAnim(0x53u, 0);
- pGame->pStru6Instance->SetPlayerBuffAnim(0x53u, 1u);
- pGame->pStru6Instance->SetPlayerBuffAnim(0x53u, 2u);
- pGame->pStru6Instance->SetPlayerBuffAnim(0x53u, 3u);
- v39 = (signed __int64)((double)(v42 << 7) * 0.033333335);
- v37 = &pParty->pPartyBuffs[PARTY_BUFF_DAY_OF_GODS];
- v36 = pParty->uTimePlayed + v39;
- v37->Apply(v36, a7b, v43, 0, 0);
- pAudioPlayer->PlaySound((SoundID)word_4EE088_sound_ids[uSpellID], 0, 0, fromx, fromy, 0, 0, 0);
- return;
- }
- }
- v42 = 10800 * uSkill;
- v43 = 3 * uSkill + 10;
- pGame->pStru6Instance->SetPlayerBuffAnim(0x53u, 0);
- pGame->pStru6Instance->SetPlayerBuffAnim(0x53u, 1u);
- pGame->pStru6Instance->SetPlayerBuffAnim(0x53u, 2u);
- pGame->pStru6Instance->SetPlayerBuffAnim(0x53u, 3u);
- v39 = (signed __int64)((double)(v42 << 7) * 0.033333335);
- v37 = &pParty->pPartyBuffs[PARTY_BUFF_DAY_OF_GODS];
- v36 = pParty->uTimePlayed + v39;
- v37->Apply(v36, a7b, v43, 0, 0);
- pAudioPlayer->PlaySound((SoundID)word_4EE088_sound_ids[uSpellID], 0, 0, fromx, fromy, 0, 0, 0);
- return;
- }
- if ( uSpellID != 58 )
+ switch ( uSpellID )
{
- switch ( uSpellID )
- {
- case SPELL_FIRE_FIRE_BOLT:
- case SPELL_FIRE_FIREBALL:
- case SPELL_AIR_LIGHNING_BOLT:
- case SPELL_WATER_ICE_BOLT:
- case SPELL_WATER_ACID_BURST:
- case SPELL_WATER_ICE_BLAST:
- case SPELL_EARTH_BLADES:
- case SPELL_EARTH_ROCK_BLAST:
- a1.stru_24.Reset();
- v16 = 0;
- a1.spell_id = uSpellID;
- a1.spell_level = uSkill;
- a1.spell_skill = v15;
- if ( (signed int)pObjectList->uNumObjects <= 0 )
+ case SPELL_FIRE_FIRE_BOLT:
+ case SPELL_FIRE_FIREBALL:
+ case SPELL_AIR_LIGHNING_BOLT:
+ case SPELL_WATER_ICE_BOLT:
+ case SPELL_WATER_ACID_BURST:
+ case SPELL_WATER_ICE_BLAST:
+ case SPELL_EARTH_BLADES:
+ case SPELL_EARTH_ROCK_BLAST:
+ case SPELL_WATER_POISON_SPRAY:
+ case SPELL_AIR_SPARKS:
+ case SPELL_EARTH_DEATH_BLOSSOM:
+ a1.uType = stru_4E3ACC[uSpellID].uType;
+ a1.stru_24.Reset();
+ a1.spell_id = uSpellID;
+ a1.spell_level = uSkill;
+ a1.spell_skill = skillMasteryPlusOne;
+ v16 = 0;
+ while (v16 < pObjectList->uNumObjects)
+ {
+ if ( a1.uType == pObjectList->pObjects[v16].uObjectID)
{
- //v18 = 0;
- a1.uObjectDescID = 0;
- *(_QWORD *)&a1.vPosition.y = __PAIR__(fromz, fromy);
- a1.vPosition.x = fromx;
- a1.uAttributes = 16;
- a1.uSectorID = pIndoor->GetSector(fromx, fromy, fromz);
- a1.field_60_distance_related_prolly_lod = v55;
- //v20 = yaw;
- a1.uSpriteFrameID = 0;
- a1.spell_caster_pid = 8000 | OBJECT_Item;
- a1.spell_target_pid = 0;
- a1.uFacing = yaw;
- a1.uSoundID = 0;
- v49 = pObjectList->pObjects[(signed __int16)a1.uObjectDescID].uSpeed;
- a1.Create(yaw, pitch, v49, 0);
- pAudioPlayer->PlaySound((SoundID)word_4EE088_sound_ids[uSpellID], 0, 0, fromx, fromy, 0, 0, 0);
- return;
+ break;
}
- v17 = (char *)&pObjectList->pObjects->uObjectID;
- while ( (short)a1.uType != *(short *)v17 )
- {
- ++v16;
- v17 += 56;
- if ( v16 >= (signed int)pObjectList->uNumObjects )
- {
- //v18 = 0;
- a1.uObjectDescID = 0;
- *(_QWORD *)&a1.vPosition.y = __PAIR__(fromz, fromy);
- a1.vPosition.x = fromx;
- a1.uAttributes = 16;
- a1.uSectorID = pIndoor->GetSector(fromx, fromy, fromz);
- a1.field_60_distance_related_prolly_lod = v55;
- //v20 = yaw;
- a1.uSpriteFrameID = 0;
- a1.spell_caster_pid = 8000 | OBJECT_Item;
- a1.spell_target_pid = 0;
- a1.uFacing = yaw;
- a1.uSoundID = 0;
- v49 = pObjectList->pObjects[(signed __int16)a1.uObjectDescID].uSpeed;
- a1.Create(yaw, pitch, v49, 0);
- pAudioPlayer->PlaySound((SoundID)word_4EE088_sound_ids[uSpellID], 0, 0, fromx, fromy, 0, 0, 0);
- return;
- }
- }
- v18 = v16;
- a1.uObjectDescID = v18;
- *(_QWORD *)&a1.vPosition.y = __PAIR__(fromz, fromy);
- a1.vPosition.x = fromx;
- a1.uAttributes = 16;
- a1.uSectorID = pIndoor->GetSector(fromx, fromy, fromz);
- a1.field_60_distance_related_prolly_lod = v55;
- //v20 = yaw;
- a1.uSpriteFrameID = 0;
- a1.spell_caster_pid = 8000 | OBJECT_Item;
- a1.spell_target_pid = 0;
- a1.uFacing = yaw;
- a1.uSoundID = 0;
+ v16++;
+ }
+ a1.uObjectDescID = v16;
+ a1.vPosition.x = fromx;
+ a1.vPosition.y = fromy;
+ a1.vPosition.z = fromz;
+ a1.uAttributes = 16;
+ a1.uSectorID = pIndoor->GetSector(fromx, fromy, fromz);
+ a1.field_60_distance_related_prolly_lod = v55;
+ a1.uSpriteFrameID = 0;
+ a1.spell_caster_pid = 8000 | OBJECT_Item;
+ a1.uSoundID = 0;
+ break;
+ }
+
+ switch ( uSpellID )
+ {
+ case SPELL_FIRE_FIRE_BOLT:
+ case SPELL_FIRE_FIREBALL:
+ case SPELL_AIR_LIGHNING_BOLT:
+ case SPELL_WATER_ICE_BOLT:
+ case SPELL_WATER_ACID_BURST:
+ case SPELL_WATER_ICE_BLAST:
+ case SPELL_EARTH_BLADES:
+ case SPELL_EARTH_ROCK_BLAST:
+ //v20 = yaw;
+ a1.spell_target_pid = 0;
+ a1.uFacing = yaw;
+ a1.uSoundID = 0;
+ v49 = pObjectList->pObjects[(signed __int16)a1.uObjectDescID].uSpeed;
+ a1.Create(yaw, pitch, v49, 0);
+ pAudioPlayer->PlaySound((SoundID)word_4EE088_sound_ids[uSpellID], 0, 0, fromx, fromy, 0, 0, 0);
+ return;
+ case SPELL_WATER_POISON_SPRAY:
+ switch ( skillMasteryPlusOne )
+ {
+ case 1:
+ v60 = 1;
+ break;
+ case 2:
+ v60 = 3;
+ break;
+ case 3:
+ v60 = 5;
+ break;
+ case 4:
+ v60 = 7;
+ break;
+ }
+ a1.spell_target_pid = 0;
+ a1.uFacing = yaw;
+ if ( v60 == 1 )
+ {
v49 = pObjectList->pObjects[(signed __int16)a1.uObjectDescID].uSpeed;
a1.Create(yaw, pitch, v49, 0);
- pAudioPlayer->PlaySound((SoundID)word_4EE088_sound_ids[uSpellID], 0, 0, fromx, fromy, 0, 0, 0);
- return;
- case SPELL_WATER_POISON_SPRAY:
- switch ( v15 )
- {
- case 1:
- v60 = 1;
- break;
- case 2:
- v60 = 3;
- break;
- case 3:
- v60 = 5;
- break;
- case 4:
- v60 = 7;
- break;
- }
+ }
+ else
+ {
a7c = (signed int)(60 * stru_5C6E00->uIntegerDoublePi) / 360;
- if ( v60 != 1 )
- {
- a8b = a7c / (v60 - 1);
- a1.stru_24.Reset();
- v21 = 0;
- a1.spell_id = uSpellID;
- a1.spell_level = uSkill;
- a1.spell_skill = v15;
- if ( (signed int)pObjectList->uNumObjects <= 0 )
- v23 = 0;
- else
- {
- v22 = (char *)&pObjectList->pObjects->uObjectID;
- while ( (short)a1.uType != *(short *)v22 )
- {
- ++v21;
- v22 += 56;
- if ( v21 >= (signed int)pObjectList->uNumObjects )
- {
- v23 = 0;
- a1.uObjectDescID = v23;
- *(_QWORD *)&a1.vPosition.y = __PAIR__(fromz, fromy);
- a1.vPosition.x = fromx;
- a1.uAttributes = 16;
- a1.uSectorID = pIndoor->GetSector(fromx, fromy, fromz);
- a1.field_60_distance_related_prolly_lod = v55;
- a1.uSpriteFrameID = 0;
- a1.spell_caster_pid = 8000 | OBJECT_Item;
- a1.spell_target_pid = 4;
- a1.uSoundID = 0;
- for ( i = a7c / -2; i <= a7c / 2; i += a8b )
- {
- a1.uFacing = i + yaw;
- a1.Create((signed __int16)(i + (short)yaw), pitch, pObjectList->pObjects[(signed __int16)a1.uObjectDescID].uSpeed, 0);
- }
- pAudioPlayer->PlaySound((SoundID)word_4EE088_sound_ids[uSpellID], 0, 0, fromx, fromy, 0, 0, 0);
- return;
- }
- }
- v23 = v21;
- }
- a1.uObjectDescID = v23;
- *(_QWORD *)&a1.vPosition.y = __PAIR__(fromz, fromy);
- a1.vPosition.x = fromx;
- a1.uAttributes = 16;
- a1.uSectorID = pIndoor->GetSector(fromx, fromy, fromz);
- a1.field_60_distance_related_prolly_lod = v55;
- a1.uSpriteFrameID = 0;
- a1.spell_caster_pid = 8000 | OBJECT_Item;
- a1.spell_target_pid = 4;
- a1.uSoundID = 0;
- for ( i = a7c / -2; i <= a7c / 2; i += a8b )
- {
- a1.uFacing = i + yaw;
- a1.Create((signed __int16)(i + (short)yaw), pitch, pObjectList->pObjects[(signed __int16)a1.uObjectDescID].uSpeed, 0);
- }
- pAudioPlayer->PlaySound((SoundID)word_4EE088_sound_ids[uSpellID], 0, 0, fromx, fromy, 0, 0, 0);
- return;
- }
- a1.stru_24.Reset();
- a1.spell_id = uSpellID;
- a1.spell_level = uSkill;
- a1.spell_skill = v15;
- if ( (signed int)pObjectList->uNumObjects <= 0 )
- {
- //v18 = 0;
- a1.uObjectDescID = 0;
- *(_QWORD *)&a1.vPosition.y = __PAIR__(fromz, fromy);
- a1.vPosition.x = fromx;
- a1.uAttributes = 16;
- a1.uSectorID = pIndoor->GetSector(fromx, fromy, fromz);
- a1.field_60_distance_related_prolly_lod = v55;
- //v20 = yaw;
- a1.uSpriteFrameID = 0;
- a1.spell_caster_pid = 8000 | OBJECT_Item;
- a1.spell_target_pid = 0;
- a1.uFacing = yaw;
- a1.uSoundID = 0;
- //v51 = 0;
- v49 = pObjectList->pObjects[(signed __int16)a1.uObjectDescID].uSpeed;
- //v47 = pitch;
- a1.Create(yaw, pitch, v49, 0);
- pAudioPlayer->PlaySound((SoundID)word_4EE088_sound_ids[uSpellID], 0, 0, fromx, fromy, 0, 0, 0);
- return;
- }
- //v19 = (char *)&pObjectList->pObjects->uObjectID;
- for ( v16 = 0; v16 < (signed int)pObjectList->uNumObjects; ++v16 )
+ a8b = a7c / (v60 - 1);
+ for ( i = a7c / -2; i <= a7c / 2; i += a8b )
{
- if ( (short)a1.uType == pObjectList->pObjects[v16].uObjectID )
- {
- //v18 = v16;
- a1.uObjectDescID = v16;
- *(_QWORD *)&a1.vPosition.y = __PAIR__(fromz, fromy);
- a1.vPosition.x = fromx;
- a1.uAttributes = 16;
- a1.uSectorID = pIndoor->GetSector(fromx, fromy, fromz);
- a1.field_60_distance_related_prolly_lod = v55;
- //v20 = yaw;
- a1.uSpriteFrameID = 0;
- a1.spell_caster_pid = 8000 | OBJECT_Item;
- a1.spell_target_pid = 0;
- a1.uFacing = yaw;
- a1.uSoundID = 0;
- //v51 = 0;
- v49 = pObjectList->pObjects[(signed __int16)a1.uObjectDescID].uSpeed;
- //v47 = pitch;
- a1.Create(yaw, pitch, v49, 0);
- pAudioPlayer->PlaySound((SoundID)word_4EE088_sound_ids[uSpellID], 0, 0, fromx, fromy, 0, 0, 0);
- return;
- }
- //v19 += 56;
- }
- //v18 = 0;
- a1.uObjectDescID = 0;
- *(_QWORD *)&a1.vPosition.y = __PAIR__(fromz, fromy);
- a1.vPosition.x = fromx;
- a1.uAttributes = 16;
- a1.uSectorID = pIndoor->GetSector(fromx, fromy, fromz);
- a1.field_60_distance_related_prolly_lod = v55;
- //v20 = yaw;
- a1.uSpriteFrameID = 0;
- a1.spell_caster_pid = 8000 | OBJECT_Item;
- a1.spell_target_pid = 0;
- a1.uFacing = yaw;
- a1.uSoundID = 0;
- //v51 = 0;
- v49 = pObjectList->pObjects[(signed __int16)a1.uObjectDescID].uSpeed;
- //v47 = pitch;
- a1.Create(yaw, pitch, v49, 0);
- pAudioPlayer->PlaySound((SoundID)word_4EE088_sound_ids[uSpellID], 0, 0, fromx, fromy, 0, 0, 0);
- return;
- case SPELL_AIR_SPARKS:
- switch ( v15 )
- {
- case 1:
- v60 = 3;
- break;
- case 2:
- v60 = 5;
- break;
- case 3:
- v60 = 7;
- break;
- case 4:
- v60 = 9;
- break;
- }
- a7d = (signed int)(60 * stru_5C6E00->uIntegerDoublePi) / 360;
- a8c = (signed int)(60 * stru_5C6E00->uIntegerDoublePi) / 360 / (v60 - 1);
- a1.stru_24.Reset();
- v25 = 0;
- a1.spell_id = uSpellID;
- a1.spell_level = uSkill;
- a1.spell_skill = v15;
- if ( (signed int)pObjectList->uNumObjects <= 0 )
- {
- //v27 = 0;
- a1.uObjectDescID = 0;
- *(_QWORD *)&a1.vPosition.y = __PAIR__(fromz, fromy);
- a1.vPosition.x = fromx;
- a1.uAttributes = 16;
- a1.uSectorID = pIndoor->GetSector(fromx, fromy, fromz);
- a1.field_60_distance_related_prolly_lod = v55;
- a1.uSpriteFrameID = 0;
- a1.spell_caster_pid = 8000 | OBJECT_Item;
- a1.spell_target_pid = 4;
- a1.uSoundID = 0;
- for ( j = a7d / -2; j <= a7d / 2; j += a8c )
- {
- a1.uFacing = j + yaw;
- a1.Create((signed __int16)(j + (short)yaw), pitch, pObjectList->pObjects[(signed __int16)a1.uObjectDescID].uSpeed, 0);
- }
- pAudioPlayer->PlaySound((SoundID)word_4EE088_sound_ids[uSpellID], 0, 0, fromx, fromy, 0, 0, 0);
- return;
- }
- v26 = (char *)&pObjectList->pObjects->uObjectID;
- while ( (short)a1.uType != *(short *)v26 )
- {
- ++v25;
- v26 += 56;
- if ( v25 >= (signed int)pObjectList->uNumObjects )
- {
- v27 = 0;
- a1.uObjectDescID = v27;
- *(_QWORD *)&a1.vPosition.y = __PAIR__(fromz, fromy);
- a1.vPosition.x = fromx;
- a1.uAttributes = 16;
- a1.uSectorID = pIndoor->GetSector(fromx, fromy, fromz);
- a1.field_60_distance_related_prolly_lod = v55;
- a1.uSpriteFrameID = 0;
- a1.spell_caster_pid = 8000 | OBJECT_Item;
- a1.spell_target_pid = 4;
- a1.uSoundID = 0;
- for ( j = a7d / -2; j <= a7d / 2; j += a8c )
- {
- a1.uFacing = j + yaw;
- a1.Create((signed __int16)(j + (short)yaw), pitch, pObjectList->pObjects[(signed __int16)a1.uObjectDescID].uSpeed, 0);
- }
- pAudioPlayer->PlaySound((SoundID)word_4EE088_sound_ids[uSpellID], 0, 0, fromx, fromy, 0, 0, 0);
- return;
- }
- }
- v27 = v25;
- a1.uObjectDescID = v27;
- *(_QWORD *)&a1.vPosition.y = __PAIR__(fromz, fromy);
- a1.vPosition.x = fromx;
- a1.uAttributes = 16;
- a1.uSectorID = pIndoor->GetSector(fromx, fromy, fromz);
- a1.field_60_distance_related_prolly_lod = v55;
- a1.uSpriteFrameID = 0;
- a1.spell_caster_pid = 8000 | OBJECT_Item;
- a1.spell_target_pid = 4;
- a1.uSoundID = 0;
- for ( j = a7d / -2; j <= a7d / 2; j += a8c )
- {
- a1.uFacing = j + yaw;
- a1.Create((signed __int16)(j + (short)yaw), pitch,
- pObjectList->pObjects[(signed __int16)a1.uObjectDescID].uSpeed, 0);
+ a1.uFacing = i + yaw;
+ a1.Create((signed __int16)(i + (short)yaw), pitch, pObjectList->pObjects[(signed __int16)a1.uObjectDescID].uSpeed, 0);
}
- pAudioPlayer->PlaySound((SoundID)word_4EE088_sound_ids[uSpellID], 0, 0, fromx, fromy, 0, 0, 0);
- return;
- case SPELL_EARTH_DEATH_BLOSSOM:
- if ( uCurrentlyLoadedLevelType == LEVEL_Indoor )
- return;
- a1.stru_24.Reset();
- v29 = 0;
- a1.spell_id = uSpellID;
- a1.spell_level = uSkill;
- a1.spell_skill = v15;
- if ( (signed int)pObjectList->uNumObjects <= 0 )
- {
- //v31 = 0;
- a1.uObjectDescID = 0;
- *(_QWORD *)&a1.vPosition.y = __PAIR__(fromz, fromy);
- a1.vPosition.x = fromx;
- a1.uAttributes = 16;
- a1.uSectorID = pIndoor->GetSector(fromx, fromy, fromz);
- a1.field_60_distance_related_prolly_lod = v55;
- a1.uSpriteFrameID = 0;
- a1.spell_caster_pid = 8000 | OBJECT_Item;
- a1.spell_target_pid = 4;
- a1.uSoundID = 0;
- //v51 = 0;
- v49 = pObjectList->pObjects[(signed __int16)a1.uObjectDescID].uSpeed;
- //v20 = yaw;
- v47 = (signed int)stru_5C6E00->uIntegerHalfPi / 2;
- a1.Create(yaw, v47, v49, 0);
- pAudioPlayer->PlaySound((SoundID)word_4EE088_sound_ids[uSpellID], 0, 0, fromx, fromy, 0, 0, 0);
- return;
- }
- v30 = (char *)&pObjectList->pObjects->uObjectID;
- break;
-
- case SPELL_FIRE_HASTE:
- if ( v15 > 0 )
- {
- if ( v15 <= 2 )
- v9 = 60 * (uSkill + 60);
- else if ( v15 == 3 )
- v9 = 180 * (uSkill + 20);
- else if ( v15 == 4 )
- v9 = 240 * (uSkill + 15);
- }
- //levela = 1;
- //v32 = pParty->pPlayers;//[0].pConditions[1];
- //do
- for (uint i = 0; i < 4; ++i)
- if (pParty->pPlayers[i].IsWeak())
- return;
- //while ( v32 <= &pParty->pPlayers[3] );
- //if ( !levela )
- // return;
- pParty->pPartyBuffs[PARTY_BUFF_HASTE].Apply(pParty->uTimePlayed + (signed int)(signed __int64)((double)(v9 * 128) * 0.033333335),
- v15, 0, 0, 0);
- //v33 = spellnum_;
- pGame->pStru6Instance->SetPlayerBuffAnim(uSpellID, 0);
- pGame->pStru6Instance->SetPlayerBuffAnim(uSpellID, 1);
- pGame->pStru6Instance->SetPlayerBuffAnim(uSpellID, 2);
- pGame->pStru6Instance->SetPlayerBuffAnim(uSpellID, 3);
- pAudioPlayer->PlaySound((SoundID)word_4EE088_sound_ids[uSpellID], 0, 0, fromx, fromy, 0, 0, 0);//
- return;
- case SPELL_AIR_SHIELD:
- case SPELL_EARTH_STONESKIN:
- case SPELL_SPIRIT_HEROISM:
- switch ( v15 )
- {
- case 1:
- case 2:
- v9 = 300 * (uSkill + 12);
- break;
- case 3:
- v9 = 900 * (uSkill + 4);
- break;
- case 4:
- v9 = 3600 * (uSkill + 1);
- break;
- }
- switch ( uSpellID )
- {
- case 17:
- v60 = 0;
- uSkill = 14;
- break;
- case 38:
- v35 = uSkill + 5;
- uSkill = 15;
- v60 = v35;
- break;
- case 51:
- v34 = uSkill + 5;
- uSkill = 9;
- v60 = v34;
- break;
- }
- pGame->pStru6Instance->SetPlayerBuffAnim(uSpellID, 0);
- pGame->pStru6Instance->SetPlayerBuffAnim(uSpellID, 1);
- pGame->pStru6Instance->SetPlayerBuffAnim(uSpellID, 2);
- pGame->pStru6Instance->SetPlayerBuffAnim(uSpellID, 3);
- //v52 = 0;
- //v50 = 0;
- //v48 = v60;
- //v46 = v15;
- v36 = pParty->uTimePlayed + (signed int)(signed __int64)((double)(v9 << 7) * 0.033333335);
- //v37 = &pParty->pPartyBuffs[uSkill];
- pParty->pPartyBuffs[uSkill].Apply(v36, v15, v60, 0, 0);
- pAudioPlayer->PlaySound((SoundID)word_4EE088_sound_ids[uSpellID], 0, 0, fromx, fromy, 0, 0, 0);
+ }
+ pAudioPlayer->PlaySound((SoundID)word_4EE088_sound_ids[uSpellID], 0, 0, fromx, fromy, 0, 0, 0);
+ return;
+ case SPELL_AIR_SPARKS:
+ switch ( skillMasteryPlusOne )
+ {
+ case 1:
+ v60 = 3;
+ break;
+ case 2:
+ v60 = 5;
+ break;
+ case 3:
+ v60 = 7;
+ break;
+ case 4:
+ v60 = 9;
+ break;
+ }
+ a7d = (signed int)(60 * stru_5C6E00->uIntegerDoublePi) / 360;
+ a8c = (signed int)(60 * stru_5C6E00->uIntegerDoublePi) / 360 / (v60 - 1);
+ a1.spell_target_pid = 4;
+ for ( j = a7d / -2; j <= a7d / 2; j += a8c )
+ {
+ a1.uFacing = j + yaw;
+ a1.Create((signed __int16)(j + (short)yaw), pitch, pObjectList->pObjects[(signed __int16)a1.uObjectDescID].uSpeed, 0);
+ }
+ pAudioPlayer->PlaySound((SoundID)word_4EE088_sound_ids[uSpellID], 0, 0, fromx, fromy, 0, 0, 0);
+ return;
+ case SPELL_EARTH_DEATH_BLOSSOM:
+ if ( uCurrentlyLoadedLevelType == LEVEL_Indoor )
return;
- case SPELL_FIRE_IMMOLATION:
- if ( v15 == 2 || v15 == 3 || v15 != 4 )
- v38 = 60 * uSkill;
- else
- v38 = 600 * uSkill;
- pGame->pStru6Instance->SetPlayerBuffAnim(uSpellID, 0);
- pGame->pStru6Instance->SetPlayerBuffAnim(uSpellID, 1);
- pGame->pStru6Instance->SetPlayerBuffAnim(uSpellID, 2);
- pGame->pStru6Instance->SetPlayerBuffAnim(uSpellID, 3);
- v52 = 0;
- v50 = 0;
- v48 = uSkill;
- v46 = v15;
- v39 = (signed __int64)((double)(v38 << 7) * 0.033333335);
- v37 = &pParty->pPartyBuffs[PARTY_BUFF_IMMOLATION];
- v36 = pParty->uTimePlayed + v39;
- v37->Apply(v36, v46, v48, v50, v52);
- pAudioPlayer->PlaySound((SoundID)word_4EE088_sound_ids[uSpellID], 0, 0, fromx, fromy, 0, 0, 0);
- return;
- case SPELL_FIRE_PROTECTION_FROM_FIRE:
- case SPELL_AIR_PROTECTION_FROM_AIR:
- case SPELL_WATER_PROTECTION_FROM_WATER:
- case SPELL_EARTH_PROTECTION_FROM_EARTH:
- goto LABEL_117;
- default:
- return;
- }
- while ( (short)a1.uType != *(short *)v30 )
- {
- ++v29;
- v30 += 56;
- if ( v29 >= (signed int)pObjectList->uNumObjects )
+ a1.spell_target_pid = 4;
+ v49 = pObjectList->pObjects[(signed __int16)a1.uObjectDescID].uSpeed;
+ v47 = (signed int)stru_5C6E00->uIntegerHalfPi / 2;
+ a1.Create(yaw, v47, v49, 0);
+ pAudioPlayer->PlaySound((SoundID)word_4EE088_sound_ids[uSpellID], 0, 0, fromx, fromy, 0, 0, 0);
+ return;
+
+ case SPELL_FIRE_HASTE:
+ if ( skillMasteryPlusOne > 0 )
{
- //v31 = 0;
- a1.uObjectDescID = 0;
- *(_QWORD *)&a1.vPosition.y = __PAIR__(fromz, fromy);
- a1.vPosition.x = fromx;
- a1.uAttributes = 16;
- a1.uSectorID = pIndoor->GetSector(fromx, fromy, fromz);
- a1.field_60_distance_related_prolly_lod = v55;
- a1.uSpriteFrameID = 0;
- a1.spell_caster_pid = 8000 | OBJECT_Item;
- a1.spell_target_pid = 4;
- a1.uSoundID = 0;
- //v51 = 0;
- v49 = pObjectList->pObjects[(signed __int16)a1.uObjectDescID].uSpeed;
- //v20 = yaw;
- v47 = (signed int)stru_5C6E00->uIntegerHalfPi / 2;
- a1.Create(yaw, v47, v49, 0);
- pAudioPlayer->PlaySound((SoundID)word_4EE088_sound_ids[uSpellID], 0, 0, fromx, fromy, 0, 0, 0);
- return;
+ if ( skillMasteryPlusOne <= 2 )
+ v9 = 60 * (uSkill + 60);
+ else if ( skillMasteryPlusOne == 3 )
+ v9 = 180 * (uSkill + 20);
+ else if ( skillMasteryPlusOne == 4 )
+ v9 = 240 * (uSkill + 15);
+ }
+ for (uint i = 0; i < 4; ++i)
+ if (pParty->pPlayers[i].IsWeak())
+ return;
+ pParty->pPartyBuffs[PARTY_BUFF_HASTE].Apply(pParty->uTimePlayed + (signed int)(signed __int64)((double)(v9 * 128) * 0.033333335), skillMasteryPlusOne, 0, 0, 0);
+ pGame->pStru6Instance->SetPlayerBuffAnim(uSpellID, 0);
+ pGame->pStru6Instance->SetPlayerBuffAnim(uSpellID, 1);
+ pGame->pStru6Instance->SetPlayerBuffAnim(uSpellID, 2);
+ pGame->pStru6Instance->SetPlayerBuffAnim(uSpellID, 3);
+ pAudioPlayer->PlaySound((SoundID)word_4EE088_sound_ids[uSpellID], 0, 0, fromx, fromy, 0, 0, 0);//
+ return;
+ case SPELL_AIR_SHIELD:
+ case SPELL_EARTH_STONESKIN:
+ case SPELL_SPIRIT_HEROISM:
+ switch ( skillMasteryPlusOne )
+ {
+ case 1:
+ case 2:
+ v9 = 300 * (uSkill + 12);
+ break;
+ case 3:
+ v9 = 900 * (uSkill + 4);
+ break;
+ case 4:
+ v9 = 3600 * (uSkill + 1);
+ break;
+ }
+ switch ( uSpellID )
+ {
+ case SPELL_AIR_SHIELD:
+ v60 = 0;
+ uSkill = 14;
+ break;
+ case SPELL_EARTH_STONESKIN:
+ v60 = uSkill + 5;
+ uSkill = 15;
+ break;
+ case SPELL_SPIRIT_HEROISM:
+ v60 = uSkill + 5;
+ uSkill = 9;
+ break;
}
- }
- v31 = v29;
- a1.uObjectDescID = v31;
- *(_QWORD *)&a1.vPosition.y = __PAIR__(fromz, fromy);
- a1.vPosition.x = fromx;
- a1.uAttributes = 16;
- a1.uSectorID = pIndoor->GetSector(fromx, fromy, fromz);
- a1.field_60_distance_related_prolly_lod = v55;
- a1.uSpriteFrameID = 0;
- a1.spell_caster_pid = 8000 | OBJECT_Item;
- a1.spell_target_pid = 4;
- a1.uSoundID = 0;
- //v51 = 0;
- v49 = pObjectList->pObjects[(signed __int16)a1.uObjectDescID].uSpeed;
- //v20 = yaw;
- v47 = (signed int)stru_5C6E00->uIntegerHalfPi / 2;
- a1.Create(yaw, v47, v49, 0);
- pAudioPlayer->PlaySound((SoundID)word_4EE088_sound_ids[uSpellID], 0, 0, fromx, fromy, 0, 0, 0);
- return;
- }
-LABEL_117:
- v44 = uSkill;
- a6_4 = 3600 * uSkill;
- if ( v15 == 1 )
- {
- v60 = v44;
- goto LABEL_125;
- }
- if ( v15 == 2 )
- {
- v44 = 2 * uSkill;
- v60 = v44;
- goto LABEL_125;
- }
- if ( v15 == 3 )
- {
- v44 = 3 * uSkill;
- v60 = v44;
- goto LABEL_125;
+ pGame->pStru6Instance->SetPlayerBuffAnim(uSpellID, 0);
+ pGame->pStru6Instance->SetPlayerBuffAnim(uSpellID, 1);
+ pGame->pStru6Instance->SetPlayerBuffAnim(uSpellID, 2);
+ pGame->pStru6Instance->SetPlayerBuffAnim(uSpellID, 3);
+ v36 = pParty->uTimePlayed + (signed int)(signed __int64)((double)(v9 << 7) * 0.033333335);
+ pParty->pPartyBuffs[uSkill].Apply(v36, skillMasteryPlusOne, v60, 0, 0);
+ pAudioPlayer->PlaySound((SoundID)word_4EE088_sound_ids[uSpellID], 0, 0, fromx, fromy, 0, 0, 0);
+ return;
+ case SPELL_FIRE_IMMOLATION:
+ if (skillMasteryPlusOne == 4)
+ v38 = 600 * uSkill;
+ else
+ v38 = 60 * uSkill;
+ pGame->pStru6Instance->SetPlayerBuffAnim(uSpellID, 0);
+ pGame->pStru6Instance->SetPlayerBuffAnim(uSpellID, 1);
+ pGame->pStru6Instance->SetPlayerBuffAnim(uSpellID, 2);
+ pGame->pStru6Instance->SetPlayerBuffAnim(uSpellID, 3);
+ v39 = (signed __int64)((double)(v38 << 7) * 0.033333335);
+ v36 = pParty->uTimePlayed + v39;
+ pParty->pPartyBuffs[PARTY_BUFF_IMMOLATION].Apply(v36, skillMasteryPlusOne, uSkill, 0, 0);
+ pAudioPlayer->PlaySound((SoundID)word_4EE088_sound_ids[uSpellID], 0, 0, fromx, fromy, 0, 0, 0);
+ return;
+ case SPELL_FIRE_PROTECTION_FROM_FIRE:
+ case SPELL_AIR_PROTECTION_FROM_AIR:
+ case SPELL_WATER_PROTECTION_FROM_WATER:
+ case SPELL_EARTH_PROTECTION_FROM_EARTH:
+ case SPELL_MIND_PROTECTION_FROM_MIND:
+ case SPELL_BODY_PROTECTION_FROM_BODY:
+ a6_4 = 3600 * uSkill;
+ switch (skillMasteryPlusOne)
+ {
+ case 1:
+ v60 = uSkill;
+ break;
+ case 2:
+ v60 = 2 * uSkill;
+ break;
+ case 3:
+ v60 = 3 * uSkill;
+ break;
+ case 4:
+ v60 = 4 * uSkill;
+ break;
+ }
+ switch ( uSpellID )
+ {
+ case SPELL_FIRE_PROTECTION_FROM_FIRE:
+ uSkill = PARTY_BUFF_RESIST_FIRE;
+ break;
+ case SPELL_AIR_PROTECTION_FROM_AIR:
+ uSkill = PARTY_BUFF_RESIST_AIR;
+ break;
+ case SPELL_WATER_PROTECTION_FROM_WATER:
+ uSkill = PARTY_BUFF_RESIST_WATER;
+ break;
+ case SPELL_EARTH_PROTECTION_FROM_EARTH:
+ uSkill = PARTY_BUFF_RESIST_EARTH;
+ break;
+ case SPELL_MIND_PROTECTION_FROM_MIND:
+ uSkill = PARTY_BUFF_RESIST_MIND;
+ break;
+ case SPELL_BODY_PROTECTION_FROM_BODY:
+ uSkill = PARTY_BUFF_RESIST_BODY;
+ break;
+ }
+ pGame->pStru6Instance->SetPlayerBuffAnim(uSpellID, 0);
+ pGame->pStru6Instance->SetPlayerBuffAnim(uSpellID, 1);
+ pGame->pStru6Instance->SetPlayerBuffAnim(uSpellID, 2);
+ pGame->pStru6Instance->SetPlayerBuffAnim(uSpellID, 3);
+ pParty->pPartyBuffs[uSkill].Apply(pParty->uTimePlayed + (signed int)(signed __int64)((double)a6_4 * 4.2666669), skillMasteryPlusOne, v60, 0, 0);
+ pAudioPlayer->PlaySound((SoundID)word_4EE088_sound_ids[uSpellID], 0, 0, fromx, fromy, 0, 0, 0);
+ return;
+ case SPELL_LIGHT_DAY_OF_THE_GODS :
+ switch (skillMasteryPlusOne)
+ {
+ case 2:
+ v42 = 10800 * uSkill;
+ v43 = 3 * uSkill + 10;
+ break;
+ case 3:
+ v42 = 18000 * uSkill;
+ v43 = 5 * uSkill + 10;
+ break;
+ case 4:
+ v42 = 14400 * uSkill;
+ v43 = 4 * uSkill + 10;
+ break;
+ }
+ pGame->pStru6Instance->SetPlayerBuffAnim(uSpellID, 0);
+ pGame->pStru6Instance->SetPlayerBuffAnim(uSpellID, 1);
+ pGame->pStru6Instance->SetPlayerBuffAnim(uSpellID, 2);
+ pGame->pStru6Instance->SetPlayerBuffAnim(uSpellID, 3);
+ v39 = (signed __int64)((double)(v42 << 7) * 0.033333335);
+ v36 = pParty->uTimePlayed + v39;
+ pParty->pPartyBuffs[PARTY_BUFF_DAY_OF_GODS].Apply(v36, skillMasteryPlusOne, v43, 0, 0);
+ pAudioPlayer->PlaySound((SoundID)word_4EE088_sound_ids[uSpellID], 0, 0, fromx, fromy, 0, 0, 0);
+ return;
+ default:
+ return;
}
- if ( v15 == 4 )
- {
- v44 = 4 * uSkill;
- v60 = v44;
- goto LABEL_125;
- }
-LABEL_125:
- switch ( uSpellID )
- {
- case 3:
- uSkill = 6;
- break;
- case 14:
- uSkill = 0;
- break;
- case 25:
- uSkill = 17;
- break;
- case 36:
- uSkill = 4;
- break;
- case 58:
- uSkill = 12;
- break;
- case 69:
- uSkill = 1;
- break;
- }
- //v45 = spellnum_;
- pGame->pStru6Instance->SetPlayerBuffAnim(uSpellID, 0);
- pGame->pStru6Instance->SetPlayerBuffAnim(uSpellID, 1);
- pGame->pStru6Instance->SetPlayerBuffAnim(uSpellID, 2);
- pGame->pStru6Instance->SetPlayerBuffAnim(uSpellID, 3);
- pParty->pPartyBuffs[uSkill].Apply(pParty->uTimePlayed + (signed int)(signed __int64)((double)a6_4 * 4.2666669), v15, v60, 0, 0);
- //levela = 1;
-//LABEL_138:
- //if ( levela )
-//LABEL_139:
- pAudioPlayer->PlaySound((SoundID)word_4EE088_sound_ids[uSpellID], 0, 0, fromx, fromy, 0, 0, 0);
}
//----- (00427769) --------------------------------------------------------
bool sub_427769_isSpellQuickCastableOnShiftClick(unsigned int uSpellID)
{
- return ( pSpellDatas[uSpellID].stats & 0xC );
+ return ( pSpellDatas[uSpellID].stats & 0xC ) != 0;
}
//----- (0043AFE3) --------------------------------------------------------
-int __fastcall _43AFE3_calc_spell_damage(int a1, int a2, signed int a3, int a4)
+int _43AFE3_calc_spell_damage(int spellId, int spellLevel, signed int skillMastery, int currentHp)
{
int result; // eax@1
unsigned int v5; // [sp-4h] [bp-8h]@9
result = 0;
- if ( a1 == 7 )
+ if ( spellId == SPELL_FIRE_FIRE_SPIKE )
{
- if ( a3 <= 0 )
- return result;
- if ( a3 <= 2 )
- {
- v5 = 6;
- }
- else
+ switch (skillMastery)
{
- if ( a3 == 3 )
- {
- v5 = 8;
- }
- else
- {
- if ( a3 != 4 )
- return result;
- v5 = 10;
- }
+ case 1:
+ case 2:
+ v5 = 6;
+ case 3:
+ v5 = 8;
+ case 4:
+ v5 = 10;
+ default:
+ return 0;
}
- result = GetDiceResult(a2, v5);
+ result = GetDiceResult(spellLevel, v5);
}
+ else if ( spellId == SPELL_EARTH_MASS_DISTORTION )
+ result = currentHp * (pSpellDatas[SPELL_EARTH_MASS_DISTORTION].baseDamage + 2 * spellLevel) / 100;
else
- {
- if ( a1 == 44 )
- result = a4 * (LOBYTE(pSpellDatas[40].field_10) + 2 * a2) / 100;
- else
- result = *((char *)&pSpellDatas[0].field_10 + 20 * a1)
- + GetDiceResult(a2, *((char *)&pSpellDatas[0].field_10 + 20 * a1 + 1));
- }
+ result = pSpellDatas[spellId].baseDamage
+ + GetDiceResult(spellLevel, pSpellDatas[spellId].bonusSkillDamage);
+
return result;
}
\ No newline at end of file
diff -r defd2526c94c -r 82851980e3d8 Spells.h
--- a/Spells.h Wed Apr 02 20:53:35 2014 +0600
+++ b/Spells.h Wed Apr 02 20:53:47 2014 +0600
@@ -217,8 +217,12 @@
/* 151 */
#pragma pack(push, 1)
-struct SpellData
+class SpellData
{
+public:
+ SpellData(__int16 innormalMana, __int16 inExpertLevelMana, __int16 inMasterLevelMana, __int16 inMagisterLevelMana,
+ __int16 inNormalLevelRecovery, __int16 inExpertLevelRecovery, __int16 inMasterLevelRecovery, __int16 inMagisterLevelRecovery,
+ __int8 inbaseDamage, __int8 inbonusSkillDamage, __int16 instats);
union
{
unsigned __int16 mana_per_skill[4];
@@ -241,7 +245,8 @@
unsigned __int16 uMagisterLevelRecovery;
};
};
- __int16 field_10;
+ __int8 baseDamage;
+ __int8 bonusSkillDamage;
__int16 stats;
// char field_12;
// char field_13;
@@ -278,4 +283,6 @@
extern std::array stru_4E3ACC;
extern std::array pSpellDatas;
-extern std::array wand_spell_ids;
\ No newline at end of file
+extern std::array wand_spell_ids;
+
+int _43AFE3_calc_spell_damage(int spellId, int spellLevel, signed int skillMastery, int currentHp);
diff -r defd2526c94c -r 82851980e3d8 SpriteObject.cpp
--- a/SpriteObject.cpp Wed Apr 02 20:53:35 2014 +0600
+++ b/SpriteObject.cpp Wed Apr 02 20:53:47 2014 +0600
@@ -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 defd2526c94c -r 82851980e3d8 SpriteObject.h
--- a/SpriteObject.h Wed Apr 02 20:53:35 2014 +0600
+++ b/SpriteObject.h Wed Apr 02 20:53:47 2014 +0600
@@ -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 defd2526c94c -r 82851980e3d8 UI/UIPopup.cpp
--- a/UI/UIPopup.cpp Wed Apr 02 20:53:35 2014 +0600
+++ b/UI/UIPopup.cpp Wed Apr 02 20:53:47 2014 +0600
@@ -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 defd2526c94c -r 82851980e3d8 mm7_2.cpp
--- a/mm7_2.cpp Wed Apr 02 20:53:35 2014 +0600
+++ b/mm7_2.cpp Wed Apr 02 20:53:47 2014 +0600
@@ -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 defd2526c94c -r 82851980e3d8 mm7_3.cpp
--- a/mm7_3.cpp Wed Apr 02 20:53:35 2014 +0600
+++ b/mm7_3.cpp Wed Apr 02 20:53:47 2014 +0600
@@ -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 defd2526c94c -r 82851980e3d8 mm7_4.cpp
--- a/mm7_4.cpp Wed Apr 02 20:53:35 2014 +0600
+++ b/mm7_4.cpp Wed Apr 02 20:53:47 2014 +0600
@@ -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 defd2526c94c -r 82851980e3d8 mm7_6.cpp
--- a/mm7_6.cpp Wed Apr 02 20:53:35 2014 +0600
+++ b/mm7_6.cpp Wed Apr 02 20:53:47 2014 +0600
@@ -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 defd2526c94c -r 82851980e3d8 mm7_unsorted_subs.h
--- a/mm7_unsorted_subs.h Wed Apr 02 20:53:35 2014 +0600
+++ b/mm7_unsorted_subs.h Wed Apr 02 20:53:47 2014 +0600
@@ -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();
@@ -83,7 +78,6 @@
void __fastcall DamagePlayerFromMonster(unsigned int uObjID, int a2, struct Vec3_int_ *pPos, signed int a4);
void __fastcall sub_43A97E(unsigned int uLayingItemID, signed int a2); // idb
double __fastcall sub_43AE12(signed int a1);
-int __fastcall _43AFE3_calc_spell_damage(int a1, int a2, signed int a3, int a4);
void ItemDamageFromActor(unsigned int uObjID, unsigned int uActorID, struct Vec3_int_ *pVelocity);
void CharacterUI_LoadPaperdollTextures();
int GetItemTextureFilename(char *pOut, signed int item_id, int index, int shoulder);