Mercurial > mm7
diff Engine/Events.cpp @ 2499:68cdef6879a0
engine folder
author | Ritor1 |
---|---|
date | Fri, 19 Sep 2014 02:57:42 +0600 |
parents | |
children | 0ff6a9e9bf7f |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Engine/Events.cpp Fri Sep 19 02:57:42 2014 +0600 @@ -0,0 +1,1365 @@ +#define _CRTDBG_MAP_ALLOC +#include <stdlib.h> +#include <crtdbg.h> + +#define _CRT_SECURE_NO_WARNINGS + +#include "ErrorHandling.h" + +#include "Engine/Graphics/Weather.h" +#include "Engine/Graphics/Texture.h" +#include "mm7_data.h" +#include "MediaPlayer.h" +#include "Mouse.h" + +#include "MapInfo.h" +#include "Game.h" +#include "Engine/Graphics/Render.h" +#include "GUIWindow.h" +#include "GUIProgressBar.h" +#include "Engine/Objects/SpriteObject.h" +#include "Engine/Objects/Chest.h" +#include "MapsLongTimer.h" +#include "LOD.h" +#include "Engine/Objects/Actor.h" +#include "Party.h" +#include "OurMath.h" +#include "AudioPlayer.h" +#include "Engine/Graphics/Indoor.h" +#include "Engine/Graphics/Viewport.h" +#include "texts.h" +#include "stru123.h" +#include "stru159.h" +#include "Events.h" +#include "Events2D.h" +#include "UI\UIHouses.h" +#include "MM7.h" +#include "Engine/Graphics/Level/Decoration.h" +#include "LuaVM.h" +#include "Log.h" +#include "Engine/Graphics/DecorationList.h" + + +std::array<EventIndex, 4400> pSomeOtherEVT_Events; +signed int uSomeOtherEVT_NumEvents; +char *pSomeOtherEVT; +std::array<EventIndex, 4400> pSomeEVT_Events; +signed int uSomeEVT_NumEvents; +char *pSomeEVT; + +unsigned int uGlobalEVT_NumEvents; +unsigned int uGlobalEVT_Size; +std::array<char, 46080> pGlobalEVT; +std::array<EventIndex, 4400> pGlobalEVT_Index; + +std::array<unsigned int, 500> pLevelStrOffsets; +unsigned int uLevelStrNumStrings; +unsigned int uLevelStrFileSize; +signed int uLevelEVT_NumEvents; +unsigned int uLevelEVT_Size; +std::array<char, 9216> pLevelStr; +std::array<char, 9216> pLevelEVT; +std::array<EventIndex, 4400> pLevelEVT_Index; + +_2devent p2DEvents[525]; + + + +//----- (00443CE1) -------------------------------------------------------- +unsigned int LoadEventsToBuffer(const char *pContainerName, char *pBuffer, unsigned int uBufferSize) +{ + FILE *pLodFile; // eax@1 + unsigned int uTextureSize; // esi@3 + //char Args[60]; // [sp+8h] [bp-B4h]@6 + void *ptr; // [sp+B8h] [bp-4h]@1 + Texture DstBuf; // [sp+6Ch] [bp-50h]@1 + + ptr = pEvents_LOD->LoadRaw(pContainerName, 0); + pLodFile = pEvents_LOD->FindContainer(pContainerName, 0); + if ( !pLodFile ) + Error("Unable to load %s", pContainerName); + + fread(&DstBuf, 1, 48, pLodFile); + uTextureSize = DstBuf.uDecompressedSize; + if ( !DstBuf.uDecompressedSize ) + uTextureSize = DstBuf.uTextureSize; + memset(&DstBuf, 0, 72); + if ( uTextureSize >= (signed int)uBufferSize ) + Error("File %s Size %lu - Buffer size %lu", pContainerName, uTextureSize, uBufferSize); + + memcpy(pBuffer, ptr, uTextureSize); + free(ptr); + return uTextureSize; + } + +//----- (00443DA1) -------------------------------------------------------- +void Initialize_GlobalEVT() +{ + struct raw_event_header + { + unsigned char evt_size; + unsigned char evt_id_l; + unsigned char evt_id_h; + unsigned char evt_sequence_num; + } ; + uint events_count; + unsigned int offset_in; + raw_event_header *current_hdr; + uGlobalEVT_NumEvents = 0; + uGlobalEVT_Size = LoadEventsToBuffer("global.evt", pGlobalEVT.data(), 46080); + if ( !uGlobalEVT_Size ) + return; + memset(pGlobalEVT_Index.data(), 0x80, sizeof(pGlobalEVT_Index));//52800 + events_count = uGlobalEVT_NumEvents; + current_hdr=(raw_event_header *)pGlobalEVT.data(); + offset_in=0; + for (events_count = 0, offset_in = 0; offset_in < uGlobalEVT_Size; ++events_count) + { + pGlobalEVT_Index[events_count].uEventID=current_hdr->evt_id_l+(current_hdr->evt_id_h<<8); + pGlobalEVT_Index[events_count].event_sequence_num=current_hdr->evt_sequence_num; + pGlobalEVT_Index[events_count].uEventOffsetInEVT=offset_in; + offset_in+=current_hdr->evt_size+1; + + current_hdr=(raw_event_header *)&pGlobalEVT[offset_in]; + } + uGlobalEVT_NumEvents = events_count; + + assert(uGlobalEVT_NumEvents < 4400); +} + + + +//----- (00443EF8) -------------------------------------------------------- +void LoadLevel_InitializeLevelEvt() + { + struct raw_event_header + { + unsigned char evt_size; + unsigned char evt_id_l; + unsigned char evt_id_h; + unsigned char evt_sequence_num; + } ; + uint events_count; + unsigned int offset_in; + raw_event_header *current_hdr; + + if (!uLevelEVT_Size) + return; + + memset(MapsLongTimersList, 0, 3200); + memset(pLevelEVT_Index.data(), 80, sizeof(EventIndex)*4400); + + uLevelEVT_NumEvents = 0; + MapsLongTimers_count = 0; + + current_hdr=(raw_event_header *)pLevelEVT.data(); + offset_in=0; + for (events_count = 0, offset_in = 0; offset_in < uLevelEVT_Size; ++events_count) + { + pLevelEVT_Index[events_count].uEventID=current_hdr->evt_id_l+(current_hdr->evt_id_h<<8); + pLevelEVT_Index[events_count].event_sequence_num=current_hdr->evt_sequence_num; + pLevelEVT_Index[events_count].uEventOffsetInEVT=offset_in; + offset_in+=current_hdr->evt_size+1; + + current_hdr=(raw_event_header *)&pLevelEVT[offset_in]; + } + uLevelEVT_NumEvents = events_count; + +/* +EmeraldIsle::Variables: +[0] ??? +[1] ??? +[2] Luck Fountain uses left +[3] Gold Fountain used this week +[4] Gold Fountain total uses + + +Emerald Isle #110 // Fire Resistance fountain +0 LocationName +0 if (Player.FireResistance < 50) + { +1 Set(Player.FireResistance, 50) +2 SetFooterString(22) // +50 Fire Resistance (temporarily) +3 Add(Party.Autonotes, 2) +4 goto return + } +5 SetFooterString(11) // Refreshing! +6 return + + + +Emerald Isle #111 // ??? + Initialize + Set(Map.Variables[0], 30) + Set(Map.Variables[1], 30) + + +Emerald Isle #114 // month timer - manage luck fountain +0 LocationName +0 if (Player.BaseLuck >= 15) + { +2 SetFooterString(11) // Refreshing! +3 return + } + else + { +1 if (Map.Variables[2] >= 1) + { +4 Sub(Map.Variables[2], 1) +5 Add(Player.BaseLuck, 2) +6 SetFooterString(25) // +2 Luck (Permament) +7 return + } + else + { +2 SetFooterString(11) // Refreshing! +3 return + } + } + +8 Initialize +9 Set Map.Variables[2], 8 + + + +Emerald Isle #115 // week timer - gold fountain in the center of town +0 LocationName +0 if (Map.Variables[4] < 3) + { +1 if (Map.Variables[3] == 0) + { +2 if (Party.Gold < 201) + { +3 if (Player.BaseLuck >= 15) + { +5 Add(Map.Variables[3], 1) +6 Add(Party.Gold, 1000) +7 Add(Map.Variables[4], 1) +8 goto return + } + else + { +4 goto 9 + } + } + } + } +9 SetFooterString(11) // Refreshing! +10 return + +11 Initialize +12 Set(Map.Variables[3], 0) + + + + + +Emerald Isle #220 // day timer - monster spawner +0 LocationName +0 Initialize +1 if (NumAliveActors(group=20) != 0) +2 return +3 SpawnMonsters(1, level=1, count=10, x=-336, y=14512, z=0, group=20) +4 SpawnMonsters(1, level=2, count=5, x=16, y=16352, z=90, group=20) +5 SpawnMonsters(1, level=1, count=10, x=480, y=18288, z=6, group=20) + + + +Emerald Isle #200 // margareth dock tip +0 if (!QBits.QuestDone[17]) + { +1 InitiateNPCDialogue(npc=19) + } +2 return + + +Emerald Isle #201 // margareth armoury tip +0 if (!QBits.QuestDone[17]) + { +1 InitiateNPCDialogue(npc=20) + } +2 return +*/ + } + + +//----- (0044684A) -------------------------------------------------------- +void EventProcessor(int uEventID, int targetObj, int canShowMessages, int entry_line) +{ + signed int v4; // esi@7 + int v11; // eax@14 + char *v12; // eax@15 + const char *v16; // esi@21 + bool v17; // edx@21 + int v18; // ecx@22 + int v19; // ebp@36 + signed int v20; // ecx@40 + int v21; // eax@40 + int v22; // edx@40 + int v23; // eax@40 + unsigned __int16 v24; // ax@45 + LevelDecoration *v26; // eax@55 + int v27; // eax@57 + int pEventID; // eax@58 + int pNPC_ID; // ecx@58 + int pIndex; // esi@58 + NPCData *pNPC; // ecx@58 + int v38; // eax@78 + int v39; // ecx@78 + int v42; // eax@84 + int v43; // ecx@84 + GUIButton *v48; // ecx@93 + GUIButton *v49; // esi@94 + signed int pValue; // ebp@124 + Player *pPlayer; // esi@125 + int v83; // eax@212 + int v84; // ebp@220 + int v90; // eax@243 + const char *v91; // ecx@247 + int v94; // ecx@262 + int v95; // ebp@262 + int v96; // edx@262 + int v97; // eax@262 + unsigned int v98; // edx@265 + const char *v99; // esi@267 + int v100; // edx@267 + unsigned int v102; // esi@281 + int v104; // eax@288 + int v106; // [sp-20h] [bp-4C8h]@278 + signed int v109; // [sp-14h] [bp-4BCh]@278 + signed int v110; // [sp-10h] [bp-4B8h]@278 + int curr_seq_num; // [sp+10h] [bp-498h]@4 + int v126; // [sp+1Ch] [bp-48Ch]@262 + int player_choose; // [sp+20h] [bp-488h]@4 + int v128; // [sp+24h] [bp-484h]@21 + int v129; // [sp+24h] [bp-484h]@262 + signed int v130; // [sp+28h] [bp-480h]@0 + int v132; // [sp+30h] [bp-478h]@262 + signed int v133; // [sp+34h] [bp-474h]@1 + int v134; // [sp+38h] [bp-470h]@262 + int v135; // [sp+3Ch] [bp-46Ch]@262 + int v136; // [sp+40h] [bp-468h]@40 + int v137; // [sp+44h] [bp-464h]@40 + int v138; // [sp+48h] [bp-460h]@40 + int v139; // [sp+4Ch] [bp-45Ch]@40 + ItemGen item; // [sp+50h] [bp-458h]@15 + char Source[120]; // [sp+74h] [bp-434h]@15 + char Str[120]; // [sp+ECh] [bp-3BCh]@21 + Actor Dst; // [sp+164h] [bp-344h]@53 + + v133 = 0; + EvtTargetObj = targetObj; + dword_5B65C4_cancelEventProcessing = 0; + if ( uEventID == 114 )//for test script + { + if (!lua->DoFile("out01.lua")) + Log::Warning(L"Error opening out01.lua\n"); + Log::Warning(L"being tested that well\n"); + return; + } + if ( !uEventID ) + { + if ( !GameUI_Footer_TimeLeft ) + ShowStatusBarString(pGlobalTXT_LocalizationStrings[521], 2u);// Nothing here + return; + } + player_choose = (uActiveCharacter == 0)?6:4; //4 - active or 6 - random player if active =0 + curr_seq_num = entry_line; + + if ( activeLevelDecoration ) + { + uSomeEVT_NumEvents = uGlobalEVT_NumEvents; + pSomeEVT = pGlobalEVT.data(); + memcpy(pSomeEVT_Events.data(), pGlobalEVT_Index.data(), sizeof(EventIndex)*4400); //4400 evts + } + else + { + uSomeEVT_NumEvents = uLevelEVT_NumEvents; + pSomeEVT = pLevelEVT.data(); + memcpy(pSomeEVT_Events.data(), pLevelEVT_Index.data(), sizeof(EventIndex)*4400); + } + + for ( v4 = 0; v4 < uSomeEVT_NumEvents; ++v4 ) + { + if ( dword_5B65C4_cancelEventProcessing ) + { + if ( v133 == 1 ) + OnMapLeave(); + return; + } + if ( pSomeEVT_Events[v4].uEventID == uEventID && pSomeEVT_Events[v4].event_sequence_num == curr_seq_num ) + { + _evt_raw * _evt = (_evt_raw *)(pSomeEVT + pSomeEVT_Events[v4].uEventOffsetInEVT); + + switch (_evt->_e_type) + { + case EVENT_CheckSeason: + if ( !sub_4465DF_check_season(_evt->v5) ) + { + ++curr_seq_num; + //v4 = v124; + break; + } + v4 = -1; + curr_seq_num = _evt->v6 - 1; + ++curr_seq_num; + break; + case EVENT_ShowMovie: + { + strcpy(Source, (char *)&_evt->v7); + v12 = (char *)&item.uExpireTime + strlen(Source) + 7; + if ( *v12 == 32 ) + *v12 = 0; + if (pMediaPlayer->bPlaying_Movie) + pMediaPlayer->Unload(); + pMediaPlayer->bStopBeforeSchedule = 0; +// pMediaPlayer->pResetflag = 0; + + v128 = pCurrentScreen; + strcpy(Str, Source); + v16 = RemoveQuotes(Str); + pMediaPlayer->FullscreenMovieLoop(v16, 0/*, _evt->v5*/); + if ( !_stricmp(v16, "arbiter good") ) + { + pParty->alignment = PartyAlignment_Good; + v18 = 0; + LOBYTE(v17) = 1; + SetUserInterface(PartyAlignment_Good, v17); + if ( !_evt->v6 || v128 == 3 ) + { + pCurrentScreen = v128; + if ( v128 == 3 ) + pGameLoadingUI_ProgressBar->uType = GUIProgressBar::TYPE_Fullscreen; + if ( v128 == 13 ) + pMediaPlayer->OpenHouseMovie(pAnimatedRooms[uCurrentHouse_Animation].video_name, 1u); + } + ++curr_seq_num; + break; + } + if ( !_stricmp(v16, "arbiter evil") ) + { + v18 = 2; + pParty->alignment = PartyAlignment_Evil; + LOBYTE(v17) = 1; + SetUserInterface(PartyAlignment_Evil, v17); + if ( !_evt->v6 || v128 == 3 ) + { + pCurrentScreen = v128; + if ( v128 == 3 ) + pGameLoadingUI_ProgressBar->uType = GUIProgressBar::TYPE_Fullscreen; + if ( v128 == 13 ) + pMediaPlayer->OpenHouseMovie(pAnimatedRooms[uCurrentHouse_Animation].video_name, 1); + } + ++curr_seq_num; + break; + } + if ( !_stricmp(v16, "pcout01") ) // moving to harmondale from emerald isle + { + Rest(0x2760u); + pParty->RestAndHeal(); + pParty->days_played_without_rest = 0; + } + if ( !_evt->v6 || v128 == 3 ) + { + pCurrentScreen = v128; + if ( v128 == 3 ) + pGameLoadingUI_ProgressBar->uType = GUIProgressBar::TYPE_Fullscreen; + if ( v128 == 13 ) + pMediaPlayer->OpenHouseMovie(pAnimatedRooms[uCurrentHouse_Animation].video_name, 1); + } + ++curr_seq_num; + } + break; + case EVENT_CheckSkill: + { + v19 = _evt->v7 + ((_evt->v8 + ((_evt->v9 + ((unsigned int)_evt->v10 << 8)) << 8)) << 8); + if ( player_choose < 0 ) + goto LABEL_47; + if ( player_choose <= 3 ) + v24 = pParty->pPlayers[0].pActiveSkills[3486 * player_choose + _evt->v5]; + else + { + if ( player_choose == 4 ) + v24 = pPlayers[uActiveCharacter]->pActiveSkills[_evt->v5]; + else + { + if ( player_choose == 5 ) + { + v20 = 0; + v21 = 3486 * v130 + _evt->v5; + v136 = 1; + LOWORD(v21) = pParty->pPlayers[0].pActiveSkills[v21]; + v137 = v21 & 0x40; + v138 = v21 & 0x80; + v22 = v21 & 0x100; + v23 = v21 & 0x3F; + v139 = v22; + while ( v23 < v19 || !*(&v136 + _evt->v6) ) + { + ++v20; + if ( v20 >= 4 ) + { + ++curr_seq_num; + break; + } + } + curr_seq_num = _evt->v11 - 1; + ++curr_seq_num; + break; + } +LABEL_47: + //v10 = (ByteArray *)&v5[v9]; + v24 = pParty->pPlayers[0].pActiveSkills[_evt->v5 + 3486 * rand() % 4]; + } + } + v136 = 1; + v137 = v24 & 0x40; + v138 = v24 & 0x80; + v139 = v24 & 0x100; + if ( (v24 & 0x3F) >= v19 && *(&v136 + _evt->v6) ) + { + curr_seq_num = _evt->v11 - 1; + ++curr_seq_num; + break; + } + ++curr_seq_num; + } + break; + + case EVENT_SpeakNPC: + if ( canShowMessages ) + { + //Actor::Actor(&Dst); + memset(&Dst, 0, 0x344u); + dword_5B65D0_dialogue_actor_npc_id = _evt->v5 + ((_evt->v6 + ((_evt->v7 + ((unsigned int)_evt->v8 << 8)) << 8)) << 8); + Dst.sNPC_ID = dword_5B65D0_dialogue_actor_npc_id; + GameUI_InitializeDialogue(&Dst, false); + } + else + bDialogueUI_InitializeActor_NPC_ID = _evt->v5 + ((_evt->v6 + ((_evt->v7 + ((unsigned int)_evt->v8 << 8)) << 8)) << 8); + ++curr_seq_num; + break; + case EVENT_ChangeEvent: + if ( EVT_DWORD(_evt->v5) ) + stru_5E4C90_MapPersistVars._decor_events[activeLevelDecoration->_idx_in_stru123] = _evt->v5 - 124; + else + { + v26 = (LevelDecoration *)activeLevelDecoration; + stru_5E4C90_MapPersistVars._decor_events[activeLevelDecoration ->_idx_in_stru123] = 0; + v26->uFlags |= LEVEL_DECORATION_INVISIBLE; + } + ++curr_seq_num; + + break; + case EVENT_SetNPCGreeting: + v27 = EVT_DWORD(_evt->v5); + pNPCStats->pNewNPCData[v27].uFlags &= 0xFFFFFFFCu; + pNPCStats->pNewNPCData[v27].greet = EVT_DWORD(_evt->v9); + ++curr_seq_num; + break; + case EVENT_SetNPCTopic: + { + //v29 = _evt->v5 + ((_evt->v6 + ((_evt->v7 + ((uint)_evt->v8 << 8)) << 8)) << 8); + pEventID = _evt->v10 + ((_evt->v11 + ((_evt->v12 + ((uint)_evt->v13 << 8)) << 8)) << 8); + pNPC_ID = _evt->v5 + ((_evt->v6 + ((_evt->v7 + ((uint)_evt->v8 << 8)) << 8)) << 8); + pIndex = _evt->v9; + pNPC = &pNPCStats->pNewNPCData[pNPC_ID]; + if ( pIndex == 0 ) + pNPC->evt_A = pEventID; + if ( pIndex == 1 ) + pNPC->evt_B = pEventID; + if ( pIndex == 2 ) + pNPC->evt_C = pEventID; + if ( pIndex == 3 ) + pNPC->evt_D = pEventID; + if ( pIndex == 4 ) + pNPC->evt_E = pEventID; + if ( pIndex == 5 ) + pNPC->evt_F = pEventID; + if ( pNPC_ID == 8 ) + { + if ( pEventID == 78 ) + { + HouseDialogPressCloseBtn(); + window_SpeakInHouse->Release(); + pParty->uFlags &= ~2; + if ( EnterHouse(HOUSE_DARK_GUILD_PIT) ) + { + pAudioPlayer->StopChannels(-1, -1); + window_SpeakInHouse = GUIWindow::Create(0, 0, window->GetWidth(), window->GetHeight(), WINDOW_HouseInterior, 170, 0); + window_SpeakInHouse->CreateButton( 61, 424, 31, 0, 2, 94, UIMSG_SelectCharacter, 1, '1', "", 0); + window_SpeakInHouse->CreateButton(177, 424, 31, 0, 2, 94, UIMSG_SelectCharacter, 2, '2', "", 0); + window_SpeakInHouse->CreateButton(292, 424, 31, 0, 2, 94, UIMSG_SelectCharacter, 3, '3', "", 0); + window_SpeakInHouse->CreateButton(407, 424, 31, 0, 2, 94, UIMSG_SelectCharacter, 4, '4', "", 0); + window_SpeakInHouse->CreateButton( 0, 0, 0, 0, 1, 0, UIMSG_CycleCharacters, 0, '\t', "", 0); + current_npc_text = pNPCTopics[90].pText; + } + } + } + ++curr_seq_num; + } + break; + case EVENT_NPCSetItem: + sub_448518_npc_set_item(EVT_DWORD(_evt->v5),EVT_DWORD(_evt->v9), _evt->v13); + ++curr_seq_num; + break; + case EVENT_SetActorItem: + Actor::GiveItem(EVT_DWORD(_evt->v5),EVT_DWORD(_evt->v9), _evt->v13); + ++curr_seq_num; + break; + case EVENT_SetNPCGroupNews: + pNPCStats->pGroups_copy[_evt->v5 + ((_evt->v6 + ((_evt->v7 + ((uint)_evt->v8 << 8)) << 8)) << 8)] = _evt->v9 + ((uint)_evt->v10 << 8); + ++curr_seq_num; + break; + case EVENT_SetActorGroup: + __debugbreak(); + *(&pActors[0].uGroup + 0x11000000 * _evt->v8 + 209 * (_evt->v5 + ((_evt->v6 + ((uint)_evt->v7 << 8)) << 8))) = _evt->v9 + ((_evt->v10 + ((_evt->v11 + ((uint)_evt->v12 << 8)) << 8)) << 8); + ++curr_seq_num; + break; + case EVENT_ChangeGroup: + v38 = _evt->v5 + ((_evt->v6 + ((_evt->v7 + ((uint)_evt->v8 << 8)) << 8)) << 8); + v39 = _evt->v9 + ((_evt->v10 + ((_evt->v11 + ((uint)_evt->v12 << 8)) << 8)) << 8); + __debugbreak(); + for ( uint actor_id = 0; actor_id < uNumActors; actor_id++ ) + { + if ( pActors[actor_id].uGroup == v38 ) + pActors[actor_id].uGroup = v39; + } + ++curr_seq_num; + break; + case EVENT_ChangeGroupAlly: + v42 = _evt->v5 + ((_evt->v6 + ((_evt->v7 + ((uint)_evt->v8 << 8)) << 8)) << 8); + v43 = _evt->v9 + ((_evt->v10 + ((_evt->v11 + ((uint)_evt->v12 << 8)) << 8)) << 8); + __debugbreak(); + for ( uint actor_id = 0; actor_id < uNumActors; actor_id++ ) + { + if ( pActors[actor_id].uGroup == v42 ) + pActors[actor_id].uAlly = v43; + } + ++curr_seq_num; + break; + case EVENT_MoveNPC: + { + pNPCStats->pNewNPCData[EVT_DWORD(_evt->v5)].Location2D =EVT_DWORD(_evt->v9); + if ( window_SpeakInHouse ) + { + + if ( window_SpeakInHouse->par1C == 165 ) + { + HouseDialogPressCloseBtn(); + pMediaPlayer->Unload(); + window_SpeakInHouse->Release(); + pParty->uFlags &= ~2; + activeLevelDecoration = (LevelDecoration*)1; + if ( EnterHouse(HOUSE_BODY_GUILD_ERATHIA) ) + { + pAudioPlayer->PlaySound((SoundID)0, 0, 0, -1, 0, 0, 0, 0); + window_SpeakInHouse = GUIWindow::Create(0, 0, window->GetWidth(), window->GetHeight(), WINDOW_HouseInterior, 165, 0); + v48 = window_SpeakInHouse->pControlsHead; + if ( window_SpeakInHouse->pControlsHead ) + { + do + { + v49 = v48->pNext; + free(v48); + v48 = v49; + } + while ( v49 ); + } + window_SpeakInHouse->pControlsHead = 0; + window_SpeakInHouse->pControlsTail = 0; + window_SpeakInHouse->uNumControls = 0; + } + } + else + { + if ( window_SpeakInHouse->par1C == 553 ) + pMediaPlayer->bLoopPlaying = 0; + } + } + + } + ++curr_seq_num; + break; + case EVENT_Jmp: + curr_seq_num = _evt->v5 - 1; + ++curr_seq_num; + v4 = -1; + + break; + case EVENT_ShowFace: + if ( _evt->v5 <= 3u ) //someone + pParty->pPlayers[_evt->v5].PlayEmotion((CHARACTER_EXPRESSION_ID)_evt->v6, 0); + else if ( _evt->v5 == 4 ) //active + pParty->pPlayers[uActiveCharacter].PlayEmotion((CHARACTER_EXPRESSION_ID)_evt->v6, 0); + else if ( _evt->v5 == 5 ) //all players + { + for(int i = 0; i < 4; ++i) + pParty->pPlayers[i].PlayEmotion((CHARACTER_EXPRESSION_ID)_evt->v6, 0); + } + else //random player + pParty->pPlayers[rand() % 4].PlayEmotion((CHARACTER_EXPRESSION_ID)_evt->v6, 0); + ++curr_seq_num; + break; + case EVENT_CharacterAnimation: + if ( _evt->v5 <= 3 ) //someone + pParty->pPlayers[_evt->v5].PlaySound((PlayerSpeech) _evt->v6, 0); + else if ( _evt->v5 == 4 ) //active + pParty->pPlayers[uActiveCharacter].PlaySound((PlayerSpeech) _evt->v6, 0); + else if ( _evt->v5 == 5 ) //all + for(int i = 0; i < 4; ++i) + pParty->pPlayers[i].PlaySound((PlayerSpeech) _evt->v6, 0); + else //random + pParty->pPlayers[rand() % 4].PlaySound((PlayerSpeech) _evt->v6, 0); + ++curr_seq_num; + break; + case EVENT_ForPartyMember: + player_choose = _evt->v5; + ++curr_seq_num; + break; + case EVENT_SummonItem: + 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), + _evt->v21 + ((_evt->v22 + ((_evt->v23 + ((uint)_evt->v24 << 8)) << 8)) << 8), + _evt->v25, _evt->v26, 0, 0); + ++curr_seq_num; + break; + case EVENT_Compare: + pValue = EVT_DWORD(_evt->v7); + if ( player_choose <= 3 ) + { + if ( pPlayers[player_choose]->CompareVariable((enum VariableType)EVT_WORD(_evt->v5), pValue) ) + { + // v124 = -1; + curr_seq_num = _evt->v11 - 1; + } + } + else if ( player_choose == 4 ) //active + { + if ( uActiveCharacter ) + { + if ( pPlayers[uActiveCharacter]->CompareVariable((enum VariableType)EVT_WORD(_evt->v5), pValue) ) + { + // v124 = -1; + curr_seq_num = _evt->v11 - 1; + } + } + } + else if ( player_choose == 5 )//all + { + v130 = 0; + for(int i = 1; i < 5; ++i) + { + if ( pPlayers[i]->CompareVariable((enum VariableType)EVT_WORD(_evt->v5), pValue) ) + { + // v124 = -1; + curr_seq_num = _evt->v11 - 1; + break; + } + ++v130; + } + } + else if ( player_choose == 6 ) //random + { + if ( pPlayers[rand() % 4 + 1]->CompareVariable((enum VariableType)EVT_WORD(_evt->v5), pValue) ) + { + // v124 = -1; + curr_seq_num = _evt->v11 - 1; + } + } + ++curr_seq_num; + v4 = -1; + break; + case EVENT_IsActorAlive: + if (IsActorAlive(EVT_BYTE(_evt->v5), EVT_DWORD(_evt->v6), EVT_BYTE(_evt->v10))) + { + //v124 = -1; + curr_seq_num = _evt->v11 - 1; + } + ++curr_seq_num; + v4 = -1; + break; + case EVENT_Substract: + pValue = EVT_DWORD(_evt->v7); + /*if ( EVT_WORD(_evt->v5) == VAR_PlayerItemInHands ) + { + if ( pParty->pPickedItem.uItemID == pValue )//In hand + { + pMouse->RemoveHoldingItem(); + ++curr_seq_num; + v4 = v124; + break; + } + //v67 = (int)pPlayers[uActiveCharacter]->pInventoryMatrix.data(); + for ( v65 = 0; v65 < 126; ++v65 ) + { + v67 = &pPlayers[uActiveCharacter]->pInventoryMatrix[v65]; + if ( v67 > 0 ) + { + if ( pPlayers[uActiveCharacter]->pInventoryItemList[v67 - 1].uItemID == pValue ) + { + pPlayers[uActiveCharacter]->RemoveItemAtInventoryIndex(v65); + //++curr_seq_num; + //v4 = v124; + goto substract; + } + } + //v67 += 4; + } + //while ( (signed int)v65 < 126 ); + //v69 = (int)&pPlayers[uActiveCharacter]->pEquipment.pIndices; + for ( v68 = 0; v68 < 16; ++v68 ) + { + if ( pPlayers[uActiveCharacter]->pInventoryItemList[pPlayers[uActiveCharacter]->pEquipment.pIndices[v68]].uItemID == pValue ) + { + pPlayers[uActiveCharacter]->pEquipment.pIndices[v68] = 0; + //++curr_seq_num; + //v4 = v124; + goto substract; + } + //v69 += 4; + } + for (int i = 1; i < 5; i++) + { + //v72 = (int)pPlayers[i]->pInventoryMatrix.data(); + for ( int v71 = 0; v71 < 126; ++v71 ) + { + v72 = &pPlayers[i]->pInventoryMatrix[v71]; + if ( v72 > 0 ) + { + if ( pPlayers[i]->pInventoryItemList[v72 - 1].uItemID == pValue ) + { + pPlayers[i]->RemoveItemAtInventoryIndex(v71); + goto substract; + } + } + //v72 += 4; + } + for ( v73 = 0; v73 < 16; ++v73 ) + { + //v74 = (int)&pPlayers[i]->pEquipment; + if (pPlayers[i]->pEquipment.pIndices[v73]) + { + if (pPlayers[i]->pInventoryItemList[pPlayers[i]->pEquipment.pIndices[v73] - 1].uItemID == pValue ) + { + pPlayers[i]->pEquipment.pIndices[v73] = 0; + //v74 += 4; + goto substract; + } + } + } + } + }*/ + if ( player_choose <= 3 ) + pParty->pPlayers[player_choose].SubtractVariable((enum VariableType)EVT_WORD(_evt->v5), pValue); + else if ( player_choose == 4 ) //active + { + if ( uActiveCharacter ) + pPlayers[uActiveCharacter]->SubtractVariable((enum VariableType)EVT_WORD(_evt->v5), pValue); + } + else if ( player_choose == 5 )//all + { + for(int i = 1; i < 5; ++i) + pPlayers[i]->SubtractVariable((enum VariableType)EVT_WORD(_evt->v5), pValue); + } + else if ( player_choose == 6 ) //random + pParty->pPlayers[rand() % 4].SubtractVariable((enum VariableType)EVT_WORD(_evt->v5), pValue); + ++curr_seq_num; + break; + case EVENT_Set: + pValue = EVT_DWORD(_evt->v7); + if ( player_choose <= 3 ) + pParty->pPlayers[player_choose].SetVariable((enum VariableType)EVT_WORD(_evt->v5), pValue); + else if ( player_choose == 4 ) //active + { + if ( uActiveCharacter ) + pPlayers[uActiveCharacter]->SetVariable((enum VariableType)EVT_WORD(_evt->v5), pValue); + } + else if ( player_choose == 5 )//all + { + //recheck v130 + for ( int i = 1; i < 5; ++i ) + pPlayers[i]->SetVariable((enum VariableType)EVT_WORD(_evt->v5), pValue); + } + else if ( player_choose == 6 ) //random + pParty->pPlayers[rand() % 4].SetVariable((enum VariableType)EVT_WORD(_evt->v5), pValue); + ++curr_seq_num; + break; + case EVENT_Add: + pValue = EVT_DWORD(_evt->v7); + if ( player_choose <= 3 ) + { + pPlayer = &pParty->pPlayers[player_choose]; + pPlayer->AddVariable((enum VariableType)EVT_WORD(_evt->v5), pValue); + } + else if ( player_choose == 4 ) //active + { + if ( uActiveCharacter ) + pPlayers[uActiveCharacter]->AddVariable((enum VariableType)EVT_WORD(_evt->v5), pValue); + } + else if ( player_choose == 5 )//all + { + for(int i = 1; i < 5; ++i) + pPlayers[i]->AddVariable((enum VariableType)EVT_WORD(_evt->v5), pValue); + } + else if ( player_choose == 6 ) //random + pParty->pPlayers[rand() % 4].AddVariable((enum VariableType)EVT_WORD(_evt->v5), pValue); + v83 = EVT_WORD(_evt->v5); + if (v83 == 21 || // gold well on emerald isle + v83 == 22 || v83 == 23 || v83 == 24 ) + { + //__debugbreak(); // bonfire + viewparams->bRedrawGameUI = true; + } + ++curr_seq_num; + break; + case EVENT_InputString: + if ( !entry_line ) + { + strcpy(GameUI_Footer_TimedString.data(), &pLevelStr[pLevelStrOffsets[EVT_DWORD(_evt->v5 )]]); + sub_4451A8_press_any_key(uEventID, curr_seq_num, 26); + if ( v133 == 1 ) + OnMapLeave(); + return; + } + v84 = _evt->v13 + ((_evt->v14 + ((_evt->v15 + ((uint)_evt->v16 << 8)) << 8)) << 8); + if ( !_stricmp(GameUI_Footer_TimedString.data(), &pLevelStr[pLevelStrOffsets[_evt->v9 + ((_evt->v10 + ((_evt->v11 + ((uint)_evt->v12 << 8)) << 8)) << 8)]]) + || !_stricmp(GameUI_Footer_TimedString.data(), &pLevelStr[pLevelStrOffsets[v84]]) ) + { + v11 = _evt->v17; + curr_seq_num = v11 - 1; + } + ++curr_seq_num; + v4 = -1; + break; + case EVENT_RandomGoTo: + //v124 = -1; + v11 = (unsigned __int8)*(&_evt->v5 + rand() % ((_evt->v5 != 0) + (_evt->v6 != 0) + (_evt->v7 != 0) + (_evt->v8 != 0) + (_evt->v9 != 0) + + (_evt->v10 != 0))); + curr_seq_num = v11 - 1; + ++curr_seq_num; + v4 = -1; + break; + case EVENT_ReceiveDamage: + if ( (unsigned __int8)_evt->v5 <= 3 ) + { + pParty->pPlayers[(unsigned __int8)_evt->v5].ReceiveDamage(EVT_DWORD(_evt->v7 ), (DAMAGE_TYPE)_evt->v6); + ++curr_seq_num; + break; + } + if ( _evt->v5 == 4 ) + { + if ( !uActiveCharacter ) + { + ++curr_seq_num; + break; + } + pPlayers[uActiveCharacter]->ReceiveDamage(EVT_DWORD(_evt->v7 ), (DAMAGE_TYPE)_evt->v6); + ++curr_seq_num; + break; + } + if ( _evt->v5 != 5 ) + { + pParty->pPlayers[rand() % 4].ReceiveDamage(EVT_DWORD(_evt->v7 ), (DAMAGE_TYPE)_evt->v6); + ++curr_seq_num; + break; + } + for ( uint pl_id = 0;pl_id < 4; pl_id++ ) + pParty->pPlayers[pl_id].ReceiveDamage(EVT_DWORD(_evt->v7 ), (DAMAGE_TYPE)_evt->v6); + ++curr_seq_num; + break; + case EVENT_ToggleIndoorLight: + pIndoor->ToggleLight(EVT_DWORD(_evt->v5 ), _evt->v9); + ++curr_seq_num; + break; + case EVENT_SetFacesBit: + sub_44892E_set_faces_bit(EVT_DWORD(_evt->v5),EVT_DWORD(_evt->v9), _evt->v13); + ++curr_seq_num; + break; + case EVENT_ToggleChestFlag: + Chest::ToggleFlag(EVT_DWORD(_evt->v5 ), EVT_DWORD(_evt->v9 ), _evt->v13); + ++curr_seq_num; + break; + case EVENT_ToggleActorFlag: + Actor::ToggleFlag(EVT_DWORD(_evt->v5 ), EVT_DWORD(_evt->v9 ), _evt->v13); + ++curr_seq_num; + break; + case EVENT_ToggleActorGroupFlag: + ToggleActorGroupFlag(EVT_DWORD(_evt->v5 ), EVT_DWORD(_evt->v9 ), _evt->v13); + ++curr_seq_num; + break; + case EVENT_SetSnow: + if ( !_evt->v5 ) + pWeather->bRenderSnow = _evt->v6 != 0; + ++curr_seq_num; + break; + case EVENT_StatusText: + v90 = EVT_DWORD(_evt->v5 ); + if ( activeLevelDecoration ) + { + if ( activeLevelDecoration == (LevelDecoration*)1 ) + current_npc_text = pNPCTopics[v90-1].pText;//(&dword_721664)[8 * v90]; + if ( canShowMessages == 1 ) + { + v91 = pNPCTopics[v90-1].pText;//(&dword_721664)[8 * v90]; + //LABEL_248: + ShowStatusBarString(v91, 2); + } + } + else + { + if ( canShowMessages == 1 ) + { + v91 = &pLevelStr[pLevelStrOffsets[v90]]; + ShowStatusBarString(v91, 2); + } + } + ++curr_seq_num; + break; + case EVENT_ShowMessage: + if ( activeLevelDecoration ) + { + current_npc_text = pNPCTopics[EVT_DWORD(_evt->v5 )-1].pText;//(&dword_721664)[8 * v92]; + byte_5B0938[0] = 0; + } + else + strcpy(byte_5B0938.data(), &pLevelStr[pLevelStrOffsets[EVT_DWORD(_evt->v5 )]]); + ++curr_seq_num; + break; + case EVENT_CastSpell: + EventCastSpell(_evt->v5, _evt->v6, _evt->v7, EVT_DWORD(_evt->v8 ), + EVT_DWORD(_evt->v12 ), EVT_DWORD(_evt->v16 ), EVT_DWORD(_evt->v20 ), + EVT_DWORD(_evt->v24 ), EVT_DWORD(_evt->v28 )); + ++curr_seq_num; + break; + case EVENT_SetTexture: + sub_44861E_set_texture(EVT_DWORD(_evt->v5 ), (char *)&_evt->v9); + ++curr_seq_num; + break; + case EVENT_SetSprite: + SetDecorationSprite(EVT_DWORD(_evt->v5 ), _evt->v9, (char *)&_evt->v10); + ++curr_seq_num; + break; + case EVENT_SummonMonsters: + sub_448CF4_spawn_monsters(_evt->v5, _evt->v6, _evt->v7,EVT_DWORD(_evt->v8 ), + EVT_DWORD(_evt->v12 ), EVT_DWORD(_evt->v16 ), EVT_DWORD(_evt->v20 ), + EVT_DWORD(_evt->v24 )); + ++curr_seq_num; + break; + case EVENT_MouseOver: + case EVENT_LocationName: + --curr_seq_num; + ++curr_seq_num; + break; + case EVENT_ChangeDoorState: + Door_switch_animation(_evt->v5, _evt->v6); + ++curr_seq_num; + break; + case EVENT_OpenChest: + if ( !Chest::Open(_evt->v5) ) + { + if ( v133 == 1 ) + OnMapLeave(); + return; + } + ++curr_seq_num; + break; + case EVENT_MoveToMap: + v94 = _evt->v5 + ((_evt->v6 + ((_evt->v7 + ((uint)_evt->v8 << 8)) << 8)) << 8); + v135 = _evt->v5 + ((_evt->v6 + ((_evt->v7 + ((uint)_evt->v8 << 8)) << 8)) << 8); + v132 = _evt->v9 + ((_evt->v10 + ((_evt->v11 + ((uint)_evt->v12 << 8)) << 8)) << 8); + v126 = _evt->v13 + ((_evt->v14 + ((_evt->v15 + ((uint)_evt->v16 << 8)) << 8)) << 8); + v129 = _evt->v17 + ((_evt->v18 + ((_evt->v19 + ((uint)_evt->v20 << 8)) << 8)) << 8); + v95 = _evt->v21 + ((_evt->v22 + ((_evt->v23 + ((uint)_evt->v24 << 8)) << 8)) << 8); + v96 = _evt->v25; + v97 = v96 + ((_evt->v26 + ((_evt->v27 + ((uint)_evt->v28 << 8)) << 8)) << 8); + v134 = v96 + ((_evt->v26 + ((_evt->v27 + ((uint)_evt->v28 << 8)) << 8)) << 8); + if ( _evt->v29 || _evt->v30 ) + { + pRenderer->Sub01(); + TransitionUI_Load(_evt->v29, _evt->v30, v135, v132, v126, v129, v95, v134, (char *)&_evt->v31); + dword_5C3418 = uEventID; + dword_5C341C = curr_seq_num + 1; + if ( v133 == 1 ) + OnMapLeave(); + return; + } + _5B65AC_npcdata_fame_or_other = _evt->v9 + ((_evt->v10 + ((_evt->v11 + ((uint)_evt->v12 << 8)) << 8)) << 8); + _5B65A8_npcdata_uflags_or_other = v94; + _5B65B0_npcdata_rep_or_other = v126; + if ( v129 == -1 ) + v98 = _5B65B4_npcdata_loword_house_or_other; + else + { + v98 = v129 & stru_5C6E00->uDoublePiMask; + _5B65B4_npcdata_loword_house_or_other = v129 & stru_5C6E00->uDoublePiMask; + } + v99 = (char *)&_evt->v31; + _5B65B8_npcdata_hiword_house_or_other = v95; + dword_5B65BC = v97; + v100 = v94 | v132 | v126 | v95 | v97 | v98; + dword_5B65C0 = v100; + if ( *v99 == 48 ) + { + if ( v100 ) + { + pParty->vPosition.x = v135; + pParty->vPosition.y = v132; + pParty->vPosition.z = v126; + pParty->uFallStartY = v126; + if ( _5B65B4_npcdata_loword_house_or_other != -1 ) + pParty->sRotationY = _5B65B4_npcdata_loword_house_or_other; + _5B65B4_npcdata_loword_house_or_other = -1; + pParty->sRotationX = v95; + pParty->uFallSpeed = v134; + dword_5B65C0 = 0; + dword_5B65BC = 0; + _5B65B8_npcdata_hiword_house_or_other = 0; + _5B65B0_npcdata_rep_or_other = 0; + _5B65AC_npcdata_fame_or_other = 0; + _5B65A8_npcdata_uflags_or_other = 0; + v106 = 232; + pAudioPlayer->PlaySound((SoundID)v106, 0, 0, -1, 0, 0, 0, 0); + } + } + else + { + pGameLoadingUI_ProgressBar->uType = (GUIProgressBar::Type)((activeLevelDecoration == NULL) + 1); + Transition_StopSound_Autosave(v99, MapStartPoint_Party); + v133 = 1; + if ( pCurrentScreen == SCREEN_HOUSE ) + { + if ( uGameState == GAME_STATE_CHANGE_LOCATION ) + { + pAudioPlayer->StopChannels(-1, -1); + dialog_menu_id = HOUSE_DIALOGUE_NULL; + while ( HouseDialogPressCloseBtn() ) + ; + pMediaPlayer->Unload(); + window_SpeakInHouse->Release(); + window_SpeakInHouse = 0; + if ( pMessageQueue_50CBD0->uNumMessages ) + pMessageQueue_50CBD0->uNumMessages = pMessageQueue_50CBD0->pMessages[0].field_8 != 0; + pCurrentScreen = SCREEN_GAME; + viewparams->bRedrawGameUI = 1; + pDialogueNPCCount = 0; + pDialogueWindow->Release(); + dialog_menu_id = HOUSE_DIALOGUE_NULL; + pDialogueWindow = 0; + pIcons_LOD->SyncLoadedFilesCount(); + } + OnMapLeave(); + return; + } + } + ++curr_seq_num; + break; + case EVENT_PlaySound: + v110 = _evt->v13 + ((_evt->v14 + ((_evt->v15 + ((uint)_evt->v16 << 8)) << 8)) << 8); + v109 = _evt->v9 + ((_evt->v10 + ((_evt->v11 + ((uint)_evt->v12 << 8)) << 8)) << 8); + v106 = _evt->v5 + ((_evt->v6 + ((_evt->v7 + ((uint)_evt->v8 << 8)) << 8)) << 8); + pAudioPlayer->PlaySound((SoundID)v106, 0, 0, v109, v110, 0, 0, 0); + ++curr_seq_num; + break; + case EVENT_GiveItem: + item.Reset(); + v102 = _evt->v7 + ((_evt->v8 + ((_evt->v9 + ((uint)_evt->v10 << 8)) << 8)) << 8); + pItemsTable->GenerateItem(_evt->v5, _evt->v6, &item); + if ( v102 ) + item.uItemID = v102; + pParty->SetHoldingItem(&item); + ++curr_seq_num; + break; + case EVENT_SpeakInHouse: + if ( EnterHouse((enum HOUSE_ID)EVT_DWORD(_evt->v5))) + { + pRenderer->Sub01(); + pAudioPlayer->PlaySound((SoundID)0, 0, 0, -1, 0, 0, 0, 0); + pAudioPlayer->PlaySound(SOUND_EnteringAHouse, 814, 0, -1, 0, 0, 0, 0); + v104 = 187; + if ( uCurrentHouse_Animation != 167 ) + v104 = EVT_DWORD(_evt->v5); + window_SpeakInHouse = GUIWindow::Create(0, 0, window->GetWidth(), window->GetHeight(), WINDOW_HouseInterior, v104, 0); + window_SpeakInHouse->CreateButton( 61, 424, 31, 0, 2, 94, UIMSG_SelectCharacter, 1, '1', "", 0); + window_SpeakInHouse->CreateButton(177, 424, 31, 0, 2, 94, UIMSG_SelectCharacter, 2, '2', "", 0); + window_SpeakInHouse->CreateButton(292, 424, 31, 0, 2, 94, UIMSG_SelectCharacter, 3, '3', "", 0); + window_SpeakInHouse->CreateButton(407, 424, 31, 0, 2, 94, UIMSG_SelectCharacter, 4, '4', "", 0); + window_SpeakInHouse->CreateButton( 0, 0, 0, 0, 1, 0, UIMSG_CycleCharacters, 0, '\t', "", 0); + } + ++curr_seq_num; + break; + case EVENT_PressAnyKey: + sub_4451A8_press_any_key(uEventID, curr_seq_num + 1, 33); + if ( v133 == 1 ) + OnMapLeave(); + return; + case EVENT_Exit: + if ( v133 == 1 ) + OnMapLeave(); + return; + default: + ++curr_seq_num; + break; + } + } + } + if ( v133 == 1 ) + OnMapLeave(); + return; + } + +//----- (00444732) -------------------------------------------------------- +char *GetEventHintString(unsigned int uEventID) +{ + signed int event_index; // edx@1 + int event_pos; // esi@4 + char *result; // eax@6 + unsigned int str_index; // eax@9 + int i; // esi@11 + _evt_raw* test_evt; + _evt_raw* last_evt; + + event_index = 0; + if ( uLevelEVT_NumEvents <= 0 ) + return NULL; + + //v2 = (char *)&pLevelEVT_Index[0].uEventOffsetInEVT; + while ( 1 ) + { + if ( pLevelEVT_Index[event_index].uEventID == uEventID ) + { + test_evt=(_evt_raw*)&pLevelEVT[pLevelEVT_Index[event_index].uEventOffsetInEVT]; + last_evt=test_evt; + event_pos = pLevelEVT_Index[event_index+1].uEventOffsetInEVT; + if ( test_evt->_e_type == EVENT_MouseOver ) + break; + } + ++event_index; + if ( event_index >= uLevelEVT_NumEvents ) + return NULL; + } + test_evt=(_evt_raw*)&pLevelEVT[event_pos]; + if ( test_evt->_e_type== EVENT_SpeakInHouse ) + { + str_index = EVT_DWORD(test_evt->v5); + result = (char *)p2DEvents[str_index - 1].pName; + } + else + { + for ( i = event_index + 1; pLevelEVT_Index[i].uEventID == uEventID; ++i ) + { + event_pos = pLevelEVT_Index[i].uEventOffsetInEVT; + test_evt=(_evt_raw*)&pLevelEVT[event_pos]; + if ( test_evt->_e_type == EVENT_SpeakInHouse ) + { + str_index = EVT_DWORD(test_evt->v5); + if ( str_index < 600 ) + return (char *)p2DEvents[str_index - 1].pName; + } + } + result = &pLevelStr[pLevelStrOffsets[EVT_BYTE(last_evt->v5)]]; + } + + return result; +} + +//----- (004613C4) -------------------------------------------------------- +void init_event_triggers() +{ + uint id = pDecorationList->GetDecorIdByName("Event Trigger"); + + num_event_triggers = 0; + for (uint i = 0; i < uNumLevelDecorations; ++i) + if (pLevelDecorations[i].uDecorationDescID == id) + event_triggers[num_event_triggers++] = i; +} + +//----- (0046CC4B) -------------------------------------------------------- +void check_event_triggers() +{ + for (size_t i = 0; i < num_event_triggers; i++) + { + if (pLevelDecorations[event_triggers[i]].uFlags & LEVEL_DECORATION_TRIGGERED_BY_TOUCH + && pLevelDecorations[event_triggers[i]].vPosition.GetDistanceTo(pParty->vPosition) < pLevelDecorations[event_triggers[i]].uTriggerRange) + { + EventProcessor(pLevelDecorations[event_triggers[i]].uEventID, PID(OBJECT_Decoration, i), 1); + } + else if (pLevelDecorations[event_triggers[i]].uFlags & LEVEL_DECORATION_TRIGGERED_BY_MONSTER) + { + for (size_t j = 0; j < uNumActors; j++) + { + if (pLevelDecorations[event_triggers[i]].vPosition.GetDistanceTo(pActors[j].vPosition) < pLevelDecorations[event_triggers[i]].uTriggerRange) + EventProcessor(pLevelDecorations[event_triggers[i]].uEventID, 0, 1); + } + } + else if (pLevelDecorations[event_triggers[i]].uFlags & LEVEL_DECORATION_TRIGGERED_BY_OBJECT) + { + for (size_t j = 0; j < uNumSpriteObjects; j++) + { + if (pLevelDecorations[event_triggers[i]].vPosition.GetDistanceTo(pSpriteObjects[j].vPosition) < pLevelDecorations[event_triggers[i]].uTriggerRange) + EventProcessor(pLevelDecorations[event_triggers[i]].uEventID, 0, 1); + } + } + } +} +// 6836C8: using guessed type int 6836C8_num_decorations_6807E8; + +//----- (004465DF) -------------------------------------------------------- +bool sub_4465DF_check_season(int a1) +{ + unsigned int monthPlusOne; // eax@1 + unsigned int daysPlusOne; // edx@1 + + monthPlusOne = pParty->uCurrentMonth + 1; + daysPlusOne = pParty->uDaysPlayed + 1; + + switch (a1) + { + case 3: //winter 12.21 -> 3.20 + return (monthPlusOne == 12 && daysPlusOne >= 21 || monthPlusOne == 1 || monthPlusOne == 2 || monthPlusOne == 3 && daysPlusOne <= 20); + break; + case 2:// autumn/fall 9.21 -> 12.20 + return (monthPlusOne == 9 && daysPlusOne >= 21 || monthPlusOne == 10 || monthPlusOne == 11 || monthPlusOne == 12 && daysPlusOne <= 20); + break; + case 1://summer 6.21 -> 9.20 + return (monthPlusOne == 6 && daysPlusOne >= 21 || monthPlusOne == 7 || monthPlusOne == 8 || monthPlusOne == 9 && daysPlusOne <= 20); + break; + case 0: //spring 3.21 -> 6.20 + return (monthPlusOne == 3 && daysPlusOne >= 21 || monthPlusOne == 4 || monthPlusOne == 5 || monthPlusOne == 6 && daysPlusOne <= 20); + break; + } + Error("Unknown season"); + return false; +} + +//----- (00448CF4) -------------------------------------------------------- +void __fastcall sub_448CF4_spawn_monsters(__int16 typeindex, __int16 level, int count, int x, int y, int z, int group, unsigned int uUniqueName) +{ + unsigned int map_id; // eax@1 + size_t old_num_actors; // ebx@2 + AIDirection v15; // [sp+28h] [bp-34h]@2 + SpawnPointMM7 pSpawnPoint; // [sp+44h] [bp-18h]@1 + + pSpawnPoint.vPosition.x = x; + pSpawnPoint.vPosition.y = y; + pSpawnPoint.vPosition.z = z; + pSpawnPoint.uGroup = group; + pSpawnPoint.uRadius = 32; + pSpawnPoint.uKind = 3; + pSpawnPoint.uIndex = typeindex + 2 * level + level; + map_id = pMapStats->GetMapInfo(pCurrentMapName); + if (map_id) + { + old_num_actors = uNumActors; + SpawnEncounter(&pMapStats->pInfos[map_id], &pSpawnPoint, 0, count, 0); + Actor::GetDirectionInfo(PID(OBJECT_Actor, old_num_actors), 4, &v15, 1); + for (uint i = (unsigned int)old_num_actors; i < (unsigned int)uNumActors; ++i) + { + pActors[i].PrepareSprites(0); + pActors[i].uYawAngle = v15.uYawAngle; + pActors[i].dword_000334_unique_name = uUniqueName; + } + } +}