view Events.cpp @ 1440:a72236d60edc

m
author Ritor1
date Sat, 27 Jul 2013 09:36:29 +0600
parents b51332ab228f
children 934074e7fcc1
line wrap: on
line source

#ifdef _MSC_VER
#define _CRT_SECURE_NO_WARNINGS
#endif

#include <assert.h>
#include <stdlib.h>

#include "Weather.h"
#include "Texture.h"
#include "mm7_data.h"
#include "VideoPlayer.h"
#include "Mouse.h"

#include "MapInfo.h"
#include "Game.h"
#include "Render.h"
#include "GUIWindow.h"
#include "GUIProgressBar.h"
#include "Chest.h"
#include "stru176.h"
#include "LOD.h"
#include "Actor.h"
#include "Party.h"
#include "Math.h"
#include "AudioPlayer.h"
#include "Indoor.h"
#include "Viewport.h"
#include "texts.h"
#include "Allocator.h"
#include "stru123.h"
#include "stru159.h"
#include "Events.h"
#include "Events2D.h"
#include "UI\UIHouses.h"
#include "Log.h"
#include "MM7.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 )
		Abortf("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 )
		{
		sprintf(Args, "File %s Size %lu - Buffer size %lu", pContainerName, uTextureSize, uBufferSize);
		Abortf(Args);
		}
	memcpy(pBuffer, ptr, uTextureSize);
	pAllocator->FreeChunk(ptr);
	return uTextureSize;
	}

//----- (00443DA1) --------------------------------------------------------
void __cdecl 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(array_5B5928_timers, 0, 3200);
	memset(pLevelEVT_Index.data(), 80, sizeof(EventIndex)*4400);

	uLevelEVT_NumEvents = 0;
	dword_5B65C8_timers_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)
{
	unsigned int v3; // eax@5
	signed int v4; // esi@7
	//char *v5; // eax@8
	Player *v6; // ecx@8
	//char *v7; // ebp@8
	//signed int v8; // edx@10
	//int v9; // edi@12
	//ByteArray *v10; // esi@12
	int v11; // eax@14
	char *v12; // eax@15
	//char *v13; // edi@21
	int v14; // ebp@21
	int v15; // edi@21
	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
	int v25; // eax@54
	LevelDecoration *v26; // eax@55
	int v27; // eax@57
	int v28; // ecx@57
	//int v29; // edx@58
	int pEventID; // eax@58
	int pNPC_ID; // ecx@58
	int pIndex; // esi@58
	NPCData *pNPC; // ecx@58
	int v34; // esi@59
	int v35; // esi@60
	int v36; // esi@61
	int v37; // esi@62
	int v38; // eax@78
	int v39; // ecx@78
	size_t v40; // edx@78
	Actor *v41; // esi@79
	int v42; // eax@84
	int v43; // ecx@84
	size_t v44; // edx@84
	Actor *v45; // esi@85
	void *v46; // eax@91
	GUIWindow *v47; // eax@93
	GUIButton *v48; // ecx@93
	GUIButton *v49; // esi@94
	char v50; // al@100
	Player *v51; // esi@103
	Player *v52; // ecx@106
	int v53; // ecx@107
	char v54; // al@111
	Player *v55; // esi@114
	Player *v56; // ecx@117
	int v57; // ecx@118
	signed int pValue; // ebp@124
	Player *pPlayer; // esi@125
	int v60; // eax@126
	int v61; // edx@133
	int v62; // eax@139
	int v63; // ebp@145
	signed int v64; // edi@146
	unsigned int v65; // edx@148
	Player *v66; // ecx@148
	int v67; // esi@148
	signed int v68; // eax@151
	int v69; // esi@151
	Player *v70; // ecx@158
	unsigned int v71; // eax@159
	int v72; // esi@159
	signed int v73; // eax@162
	int v74; // esi@162
	int v75; // edx@172
	Player *v76; // esi@173
	signed int v77; // ebp@186
	int v78; // edx@186
	Player *v79; // esi@187
	//signed int v80; // ebp@200
	//int v81; // edx@200
	Player *v82; // esi@201
	int v83; // eax@212
	int v84; // ebp@220
	signed int v85; // ebp@224
	char v86; // al@224
	Player *v87; // esi@227
	Player *v88; // ecx@231
	int v89; // ecx@232
	int v90; // eax@243
	const char *v91; // ecx@247
	int v92; // eax@251
	char *v93; // eax@252
	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
	//char *v101; // edi@281
	unsigned int v102; // esi@281
	int v103; // edi@284
	int v104; // eax@288
	int v105; // edx@294
	int v106; // [sp-20h] [bp-4C8h]@278
	signed int v107; // [sp-1Ch] [bp-4C4h]@278
	unsigned int v108; // [sp-18h] [bp-4C0h]@278
	signed int v109; // [sp-14h] [bp-4BCh]@278
	signed int v110; // [sp-10h] [bp-4B8h]@278
	int v111; // [sp-Ch] [bp-4B4h]@278
	// Event *v112; // [sp-8h] [bp-4B0h]@5
	int v113; // [sp-8h] [bp-4B0h]@106
	int v114; // [sp-8h] [bp-4B0h]@117
	signed int v115; // [sp-8h] [bp-4B0h]@231
	unsigned int v116; // [sp-8h] [bp-4B0h]@278
	int v117; // [sp-4h] [bp-4ACh]@106
	int v118; // [sp-4h] [bp-4ACh]@117
	int v119; // [sp-4h] [bp-4ACh]@231
	int v120; // [sp-4h] [bp-4ACh]@278
	int v121; // [sp-4h] [bp-4ACh]@294
	int curr_seq_num; // [sp+10h] [bp-498h]@4
	//char *v123; // [sp+14h] [bp-494h]@0
	signed int v124; // [sp+18h] [bp-490h]@7
	//signed int v125; // [sp+1Ch] [bp-48Ch]@155
	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 v131; // [sp+2Ch] [bp-47Ch]@1
	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

	//v131 = uEventID;
	v133 = 0;
	EvtTargetObj = targetObj;
	dword_5B65C4 = 0;
	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);
		}

	v4 = 0;
	v124 = 0;
	//for (uint i = 0; i < uSomeEVT_NumEvents; ++i)
	//	{
		//v6 = v123;
		//v7 = "";
		while ( 1 )
		{
		if ( dword_5B65C4 )
			goto LABEL_301;
		//v8 = v4;
		if ( pSomeEVT_Events[v4].uEventID == uEventID && pSomeEVT_Events[v4].event_sequence_num == curr_seq_num )
			{
			//v9 = pSomeEVT_Events[v8].uEventOffsetInEVT;
			//v10 = (ByteArray *)&v5[v9];
			auto _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;
                }
				v124 = -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 ( pVideoPlayer->field_54 )
					pVideoPlayer->Unload();
				pVideoPlayer->bStopBeforeSchedule = 0;
				pVideoPlayer->pResetflag = 0;

				v128 = pCurrentScreen;
				//v13 = &pSomeEVT[v9];
				//v14 = (unsigned __int8)v13[5];
				//v15 = (unsigned __int8)v13[6];
				v14 = _evt->v5;
				v15 = _evt->v6;
				strcpy(Str, Source);
				v16 = RemoveQuotes(Str);
				VideoPlayer::MovieLoop(v16, 0, v14, 1);
				if ( !_stricmp(v16, "arbiter good") )
                {
                  pParty->alignment = PartyAlignment_Good;
					v18 = 0;
					LOBYTE(v17) = 1;
					SetUserInterface(PartyAlignment_Good, v17);
					if ( !v15 || v128 == 3 )
						{
						pCurrentScreen = v128;
						if ( v128 == 3 )
							pGameLoadingUI_ProgressBar->uType = GUIProgressBar::TYPE_Fullscreen;
						if ( v128 == 13 )
							pVideoPlayer->OpenHouseMovie(pAnimatedRooms[uCurrentHouse_Animation].video_name, 1u);
						}

					++curr_seq_num;
					v4 = v124;
					
					//v6 = v123;
					//v7 = "";
					break;
					}
				if ( !_stricmp(v16, "arbiter evil") )
					{
					v18 = 2;
					pParty->alignment = PartyAlignment_Evil;
					LOBYTE(v17) = 1;
					SetUserInterface(PartyAlignment_Evil, v17);
					if ( !v15 || v128 == 3 )
						{
						pCurrentScreen = v128;
						if ( v128 == 3 )
							pGameLoadingUI_ProgressBar->uType = GUIProgressBar::TYPE_Fullscreen;
						if ( v128 == 13 )
							pVideoPlayer->OpenHouseMovie(pAnimatedRooms[uCurrentHouse_Animation].video_name, 1u);
						}
					++curr_seq_num;
					v4 = v124;
					
					//v6 = v123;
					//v7 = "";

					break;
					}
				if ( !_stricmp(v16, "pcout01") )    // moving to harmondale from emerald isle
                {
					Rest(0x2760u);
					pParty->RestAndHeal();
					pParty->days_played_without_rest = 0;
                }
				if ( !v15 || v128 == 3 )
					{
					pCurrentScreen = v128;
					if ( v128 == 3 )
						pGameLoadingUI_ProgressBar->uType = GUIProgressBar::TYPE_Fullscreen;
					if ( v128 == 13 )
						pVideoPlayer->OpenHouseMovie(pAnimatedRooms[uCurrentHouse_Animation].video_name, 1u);
					}
				++curr_seq_num;
				v4 = v124;
				
				//v6 = v123;
				//v7 = "";
				}
				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;
									v4 = v124;
									
									//v6 = v123;
									//v7 = "";
									break;
									}
								}
							v11 = _evt->v11;
							goto LABEL_130;
							}
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) )
					{
					v11 = _evt->v11;
					goto LABEL_130;
					}
				++curr_seq_num;
				v4 = v124;
				
				//v6 = v123;
				//v7 = "";
				}
				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;
				v4 = v124;
				
				//v6 = v123;
				//v7 = "";
				break;
			case EVENT_ChangeEvent:
				v25 = EVT_DWORD(_evt->v5);
				if ( v25 )
					{
					stru_5E4C90._decor_events[activeLevelDecoration->_idx_in_stru123] = _evt->v5 - 124;
					}
				else
					{
					v26 = (LevelDecoration *)activeLevelDecoration;
					stru_5E4C90._decor_events[activeLevelDecoration ->_idx_in_stru123] = 0;
					v26->field_2 |= 0x0020;
					}
				++curr_seq_num;
				v4 = v124;

				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;
				v4 = v124;
				
				//v6 = v123;
				//v7 = "";
				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 )
                {
                  sub_4BD8B5();
                  window_SpeakInHouse->Release();
                  pParty->uFlags &= ~2;
                  if ( EnterHouse(HOUSE_DARK_GUILD_PIT) )
                  {
                    pAudioPlayer->StopChannels(-1, -1);
                    window_SpeakInHouse = GUIWindow::Create(0, 0, 640, 480, 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;
            }
            v4 = v124;
            break;
			case EVENT_NPCSetItem:
				sub_448518_npc_set_item(EVT_DWORD(_evt->v5),EVT_DWORD(_evt->v9), _evt->v13);
				++curr_seq_num;
				v4 = v124;

				break;
			case EVENT_SetActorItem:
				Actor::GiveItem(EVT_DWORD(_evt->v5),EVT_DWORD(_evt->v9), _evt->v13);
				++curr_seq_num;
				v4 = v124;
				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;
				v4 = v124;
				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;
				v4 = v124;
				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);
				v40 = uNumActors;
				__debugbreak();
				if ( (signed int)uNumActors > 0 )
					{
					v41 = pActors.data();//[0].uGroup;
					do
						{
						if ( v41->uGroup == v38 )
							v41->uGroup = v39;
						++v41;
						--v40;
						}
						while ( v40 );
					}
				++curr_seq_num;
				v4 = v124;
				
				//v6 = v123;
				//v7 = "";
				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);
				v44 = uNumActors;
				__debugbreak();
				if ( (signed int)uNumActors > 0 )
					{
					v45 = pActors.data();//[0].uAlly;
					do
						{
						if ( v45->uGroup == v42 )
							v45->uAlly = v43;
						++v45;
						--v44;
						}
						while ( v44 );
					}
				++curr_seq_num;
				v4 = v124;
				
				//v6 = v123;
				//v7 = "";
				break;
			case EVENT_MoveNPC:
				{

				pNPCStats->pNewNPCData[EVT_DWORD(_evt->v5)].Location2D =EVT_DWORD(_evt->v9);
				if ( window_SpeakInHouse )
					{
	
					if ( window_SpeakInHouse->par1C == 165 )
						{
						sub_4BD8B5();
						pVideoPlayer->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, 640, 480, WINDOW_HouseInterior, 165, 0);
							v48 = window_SpeakInHouse->pControlsHead;
							if ( v48 )
								{
								do
									{
									v49 = v48->pNext;
									pAllocator->FreeChunk(v48);
									v48 = v49;
									}
									while ( v49 );
								}
							window_SpeakInHouse->pControlsHead = 0;
							window_SpeakInHouse->pControlsTail = 0;
							window_SpeakInHouse->uNumControls = 0;
							}
						}
					else
						{
						if ( window_SpeakInHouse->par1C == 553 )
							pVideoPlayer->bLoopPlaying = 0;
						}
					}
				
				}
                ++curr_seq_num;
				v4 = v124;

				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;
					v4 = v124;

					break;
			case EVENT_CharacterAnimation:
				if ( _evt->v5 <= 3u ) //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;
				v4 = v124;

				break;
			case EVENT_ForPartyMember:
				player_choose = _evt->v5;
				++curr_seq_num;
				v4 = v124;
				break;
			case EVENT_SummonItem:
				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;
				v4 = v124;
				
				//v6 = v123;
				//v7 = "";
				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]->CompareVariable((enum VariableType)EVT_WORD(_evt->v5), pValue) )
					{
						v124 = -1;
						curr_seq_num = _evt->v11 - 1;
					}
				}
				++curr_seq_num;
				v4 = v124;
				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 = v124;
				 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;
					for ( v65 = 0; v65 < 126; ++v65 )
					{
						if ( (int)&pPlayers[uActiveCharacter]->pInventoryItemList[v67] == pValue )
						{
							pPlayers[uActiveCharacter]->RemoveItemAtInventoryIndex(v65);
							++curr_seq_num;
							v4 = v124;
							break;
						}
						v67 += 4;
					}
					while ( (signed int)v65 < 126 );
					v69 = (int)&pPlayers[uActiveCharacter]->pEquipment;
					for ( v68 = 0; v68 < 16; ++v68 )
					{
						if ( *(int *)v69 && (int)&pPlayers[uActiveCharacter]->pInventoryItemList[v69] == pValue )
						{
							*(&pPlayers[uActiveCharacter]->pEquipment.uShield + v68) = 0;
							++curr_seq_num;
							v4 = v124;
							break;
						}
						v69 += 4;
					}
					for (int i = 1; i < 5; i++)
					{
						v72 = (int)pPlayers[i]->pInventoryMatrix;
						for ( int v71 = 0; v71 < 126; ++v71 )
						{
							if ( (int)&pPlayers[i]->pInventoryItemList[v72] == pValue )
							{
								pPlayers[i]->RemoveItemAtInventoryIndex(v71);
								break;
							}
							v72 += 4;
						}
						v73 = 0;
						v74 = (int)&pPlayers[i]->pEquipment;
						while ( !*(int *)v74 || (int)&pPlayer->pInventoryItemList[v74] != pValue )
						{
							++v73;
							v74 += 4;
							if ( v73 >= 16 )
								break;
						}
						*(&pPlayers[i]->pEquipment.uShield + v73) = 0;
					}
				}
				if ( player_choose <= 3 )
				{
					pPlayer = &pParty->pPlayers[player_choose];
					pPlayer->SubtractVariable((enum VariableType)EVT_WORD(_evt->v5), pValue);
				}
				else if ( player_choose == 4 ) //active
				{
					if ( uActiveCharacter )
					{
						pPlayer = pPlayers[uActiveCharacter];
						pPlayer->SubtractVariable((enum VariableType)EVT_WORD(_evt->v5), pValue);
					}
				}
				else 	if ( player_choose == 5 )//all
				{
					v130 = 0;
					for(int i = 1; i < 5; ++i)
					{
						if ( pPlayers[i]->SubtractVariable((enum VariableType)EVT_WORD(_evt->v5), pValue) )
							break;
					}
					++v130;
				}
				else if ( player_choose == 6 ) //random
				{
					player_choose = rand() % 4;
					pPlayer = &pParty->pPlayers[player_choose];
					pPlayer->SubtractVariable((enum VariableType)EVT_WORD(_evt->v5), pValue);
				}
				++curr_seq_num;
				v4 = v124;
				break;
			case EVENT_Set:
				pValue = EVT_DWORD(_evt->v7);
				if ( player_choose <= 3 )
				{
					pPlayer = &pParty->pPlayers[player_choose];
					pPlayer->SetVariable((enum VariableType)EVT_WORD(_evt->v5), pValue);
				}
				else if ( player_choose == 4 ) //active
				{
					if ( uActiveCharacter )
					{
						pPlayer = pPlayers[uActiveCharacter];
						pPlayer->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
				{
					player_choose = rand() % 4;
					pPlayer = &pParty->pPlayers[player_choose];
					pPlayer->SetVariable((enum VariableType)EVT_WORD(_evt->v5), pValue);

				}
                ++curr_seq_num;
                v4 = v124;
                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 )
					{
						pPlayer = pPlayers[uActiveCharacter];
						pPlayer->AddVariable((enum VariableType)EVT_WORD(_evt->v5), pValue);
					}
				}
				else if ( player_choose == 5 )//all
				{
					//v130 = 0;
					for(int i = 1; i < 5; ++i)
						pPlayers[i]->AddVariable((enum VariableType)EVT_WORD(_evt->v5), pValue);

				}
				else if ( player_choose == 6 ) //random
				{
					player_choose = rand() % 4;
					pPlayer = &pParty->pPlayers[player_choose];
					pPlayer->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;
                v4 = v124;
                break;
			case EVENT_InputString:
				if ( !entry_line )
					{
					strcpy(GameUI_Footer_TimedString.data(), &pLevelStr[pLevelStrOffsets[EVT_DWORD(_evt->v5 )]]);
					v105 = curr_seq_num;
					v121 = 26;
LABEL_295:
					sub_4451A8_press_any_key(uEventID, v105, v121);
LABEL_301:
					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;
LABEL_130:
					//v124 = -1;
LABEL_131:
					curr_seq_num = v11 - 1;
					}
				++curr_seq_num;
				v4 = v124;
				
				//v6 = v123;
				//v7 = "";
				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 = v124;
                break;
			case EVENT_ReceiveDamage:
				v85 = EVT_DWORD(_evt->v7 );
				v86 = _evt->v5;
				if ( (unsigned __int8)v86 <= 3 )
					{
					v119 = _evt->v6;
					v115 = EVT_DWORD(_evt->v7 );
					v89 = (unsigned __int8)v86;
					v88 = &pParty->pPlayers[v89];
					v88->ReceiveDamage(v115, (DAMAGE_TYPE)v119);
					++curr_seq_num;
					v4 = v124;
					break;
					}
				if ( v86 == 4 )
					{
					if ( !uActiveCharacter )
						{
						++curr_seq_num;
						v4 = v124;
						
						//v6 = v123;
						//v7 = "";
						break;
						}
					v119 = _evt->v6;
					v88 = pPlayers[uActiveCharacter];
					v115 = EVT_DWORD(_evt->v7 );
					v88->ReceiveDamage(v115, (DAMAGE_TYPE)v119);
					++curr_seq_num;
					v4 = v124;
					break;
					}
				if ( v86 != 5 )
					{
					v119 = _evt->v6;
					v115 = EVT_DWORD(_evt->v7 );
					v89 = rand() % 4;
					v88 = &pParty->pPlayers[v89];
					v88->ReceiveDamage(v115, (DAMAGE_TYPE)v119);
					++curr_seq_num;
					v4 = v124;
					
					//v6 = v123;
					//v7 = "";
					break;
					}
				v87 = pParty->pPlayers;
				do
					{
					v87->ReceiveDamage(v85, (DAMAGE_TYPE)_evt->v6);
					++v87;
					}
					while ( (signed int)v87 < (signed int)pParty->pHirelings );
					++curr_seq_num;
					v4 = v124;
					
					//v6 = v123;
					//v7 = "";
					break;
			case EVENT_ToggleIndoorLight:
				pIndoor->ToggleLight(EVT_DWORD(_evt->v5 ), _evt->v9);
				++curr_seq_num;
				v4 = v124;
				
				//v6 = v123;
				//v7 = "";
				break;
			case EVENT_SetFacesBit:
				sub_44892E_set_faces_bit(EVT_DWORD(_evt->v5),EVT_DWORD(_evt->v9), _evt->v13);
				++curr_seq_num;
				v4 = v124;
				
				//v6 = v123;
				//v7 = "";
				break;
			case EVENT_ToggleChestFlag:
				Chest::ToggleFlag(EVT_DWORD(_evt->v5 ),	EVT_DWORD(_evt->v9 ), _evt->v13);
				++curr_seq_num;
				v4 = v124;
				
				//v6 = v123;
				//v7 = "";
				break;
			case EVENT_ToggleActorFlag:
				Actor::ToggleFlag(EVT_DWORD(_evt->v5 ),	EVT_DWORD(_evt->v9 ), _evt->v13);
				++curr_seq_num;
				v4 = v124;
				
				//v6 = v123;
				//v7 = "";
				break;
			case EVENT_ToggleActorGroupFlag:
				ToggleActorGroupFlag(EVT_DWORD(_evt->v5 ),	EVT_DWORD(_evt->v9 ), _evt->v13);
				++curr_seq_num;
				v4 = v124;
				
				//v6 = v123;
				//v7 = "";
				break;
			case EVENT_SetSnow:
				if ( !_evt->v5 )
					pWeather->bRenderSnow = _evt->v6 != 0;
				++curr_seq_num;
				v4 = v124;
				
				//v6 = v123;
				//v7 = "";
				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, 2u);
						}
					}
				else
					{
					if ( canShowMessages == 1 )
						{
						v91 = &pLevelStr[pLevelStrOffsets[v90]];
						ShowStatusBarString(v91, 2u);
						}
					}
				++curr_seq_num;
				v4 = v124;
				
				//v6 = v123;
				//v7 = "";
				break;
			case EVENT_ShowMessage:
				v92 = EVT_DWORD(_evt->v5 );
				if ( activeLevelDecoration )
					{
					v93 = (char *)pNPCTopics[v92-1].pText;//(&dword_721664)[8 * v92];
					byte_5B0938[0] = 0;
					current_npc_text = v93;
					}
				else
					{
					strcpy(byte_5B0938.data(), &pLevelStr[pLevelStrOffsets[v92]]);
					}
				++curr_seq_num;
				v4 = v124;
				
				//v6 = v123;
				//v7 = "";
				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;
              v4 = v124;
              break;
			case EVENT_SetTexture:
				sub_44861E_set_texture(EVT_DWORD(_evt->v5 ), (char *)&_evt->v9);
				++curr_seq_num;
				v4 = v124;
				
				//v6 = v123;
				//v7 = "";
				break;
			case EVENT_SetSprite:
				SetDecorationSprite(EVT_DWORD(_evt->v5 ), _evt->v9, (char *)&_evt->v10);
				++curr_seq_num;
				v4 = v124;
				
				//v6 = v123;
				//v7 = "";
				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;
				v4 = v124;
				
				//v6 = v123;
				//v7 = "";
				break;
			case EVENT_MouseOver:
			case EVENT_LocationName:
				--curr_seq_num;
				++curr_seq_num;
				v4 = v124;
				
				//v6 = v123;
				//v7 = "";
				break;
			case EVENT_ChangeDoorState:
				sub_449A49_door_switch_animation(_evt->v5, _evt->v6);
				++curr_seq_num;
				v4 = v124;
				
				//v6 = v123;
				//v7 = "";
				break;
			case EVENT_OpenChest:
				if ( !Chest::Open(_evt->v5) )
					goto LABEL_301;
				++curr_seq_num;
				v4 = v124;
				
				//v6 = v123;
				//v7 = "";
				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 )
					{
					if ( pRenderer->pRenderD3D && !pRenderer->bWindowMode )
						pRenderer->_49FD3A();
					TransitionUI_Load(_evt->v29, _evt->v30, v135, v132, v126, v129, v95, v134, (char *)&_evt->v31);
					dword_5C3418 = uEventID;
					dword_5C341C = curr_seq_num + 1;
					goto LABEL_301;
					}
				_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;
						v120 = 0;
						v116 = 0;
						v111 = 0;
						v110 = 0;
						v109 = -1;
						v108 = 0;
						v107 = 0;
						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;
LABEL_280:
						pAudioPlayer->PlaySound((SoundID)v106, v107, v108, v109, v110, v111, v116, v120);
						}
					}
				else
					{
					pGameLoadingUI_ProgressBar->uType = (GUIProgressBar::Type)((activeLevelDecoration == NULL) + 1);
					sub_44987B(v99, MapStartPoint_Party);
					v133 = 1;
					if ( pCurrentScreen == SCREEN_HOUSE )
						{
						if ( uGameState == GAME_STATE_2 )
							{
							pAudioPlayer->StopChannels(-1, -1);
							dialog_menu_id = HOUSE_DIALOGUE_NULL;
							while ( sub_4BD8B5() )
								;
							pVideoPlayer->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;
				v4 = v124;
				
				//v6 = v123;
				//v7 = "";
				break;
			case EVENT_PlaySound:
				v120 = 0;
				v116 = 0;
				v111 = 0;
				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);
				v108 = 0;
				v107 = 0;
				v106 = _evt->v5 + ((_evt->v6 + ((_evt->v7 + ((uint)_evt->v8 << 8)) << 8)) << 8);
				goto LABEL_280;
			case EVENT_GiveItem:
				item.Reset();
				//v101 = &pSomeEVT[v9];
				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;
				v4 = v124;
				//v6 = v123;
				//v7 = "";
				break;
			case EVENT_SpeakInHouse: 
				if ( EnterHouse((enum HOUSE_ID)EVT_DWORD(_evt->v5)))
					{
					if ( pRenderer->pRenderD3D && !pRenderer->bWindowMode )
						pRenderer->_49FD3A();
					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, 640, 480, 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;
				v4 = v124;
				
				//v6 = v123;
				//v7 = "";
				break;
			case EVENT_PressAnyKey:
				v121 = 33;
				v105 = curr_seq_num + 1;
				goto LABEL_295;
			case EVENT_Exit:
				if ( v133 == 1 )
		      		OnMapLeave();
				return;
			default:
				++curr_seq_num;
				v4 = v124;
				
				//v6 = v123;
				//v7 = "";
				break;
				}
			}
		++v4;
		v124 = v4;
		if ( v4 >= uSomeEVT_NumEvents )
		   goto LABEL_301;
		//}
		}
	}

//----- (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;
}