From b6f98167c4b97a4b32bf1dcf6100be1ea318c05f Mon Sep 17 00:00:00 2001 From: adrian17 Date: Thu, 28 Aug 2014 17:27:48 +0200 Subject: [PATCH 01/10] Use macros from addresses.h --- src/audio.c | 4 ++-- src/park.c | 2 +- src/scenario.c | 2 +- src/window_new_campaign.c | 2 +- src/window_new_ride.c | 16 ++++++++-------- src/window_research.c | 4 ++-- 6 files changed, 15 insertions(+), 15 deletions(-) diff --git a/src/audio.c b/src/audio.c index 6fe7726f63..470862fc9a 100644 --- a/src/audio.c +++ b/src/audio.c @@ -282,7 +282,7 @@ int dsound_create_primary_buffer(int a, int device, int channels, int samples, i } WAVEFORMATEX waveformat1, waveformat2; RCT2_GLOBAL(0x009E2BA8, LPDIRECTSOUNDBUFFER)->lpVtbl->GetFormat(RCT2_GLOBAL(0x009E2BA8, LPDIRECTSOUNDBUFFER), &waveformat1, sizeof(WAVEFORMATEX), 0); - RCT2_GLOBAL(0x009E2BA8, LPDIRECTSOUNDBUFFER)->lpVtbl->SetFormat(RCT2_GLOBAL(0x009E2BA8, LPDIRECTSOUNDBUFFER), &RCT2_GLOBAL(0x01425B40, WAVEFORMATEX)); + RCT2_GLOBAL(0x009E2BA8, LPDIRECTSOUNDBUFFER)->lpVtbl->SetFormat(RCT2_GLOBAL(0x009E2BA8, LPDIRECTSOUNDBUFFER), &RCT2_GLOBAL(RCT2_ADDRESS_AUDIO_INFO, WAVEFORMATEX)); RCT2_GLOBAL(0x009E2BA8, LPDIRECTSOUNDBUFFER)->lpVtbl->GetFormat(RCT2_GLOBAL(0x009E2BA8, LPDIRECTSOUNDBUFFER), &waveformat2, sizeof(WAVEFORMATEX), 0); return 1; } @@ -683,7 +683,7 @@ int sound_play_panned(int sound_id, int x) } RCT2_GLOBAL(0x014241BC, uint32) = 1; - sound_prepare(sound_id, &other_sound->sound, 1, RCT2_GLOBAL(0x009AAC6E, uint32)); + sound_prepare(sound_id, &other_sound->sound, 1, RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_SOUND_SW_BUFFER, uint32)); RCT2_GLOBAL(0x014241BC, uint32) = 0; RCT2_GLOBAL(0x014241BC, uint32) = 1; result = sound_play(&other_sound->sound, 0, volume, pan, 0); diff --git a/src/park.c b/src/park.c index 1779458712..159017c392 100644 --- a/src/park.c +++ b/src/park.c @@ -90,7 +90,7 @@ void park_init() RCT2_GLOBAL(RCT2_ADDRESS_PARK_ENTRANCE_FEE, money16) = MONEY(10, 00); RCT2_GLOBAL(RCT2_ADDRESS_PEEP_SPAWNS, sint16) = -1; RCT2_GLOBAL(0x013573F8, sint16) = -1; - RCT2_GLOBAL(0x01357CF2, uint16) = 127; + RCT2_GLOBAL(RCT2_ADDRESS_ACTIVE_RESEARCH_TYPES, uint16) = 127; RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_RESEARCH_LEVEL, uint8) = 2; RCT2_GLOBAL(RCT2_ADDRESS_GUEST_INITIAL_CASH, uint16) = MONEY(50,00); // Cash per guest (average) diff --git a/src/scenario.c b/src/scenario.c index a2884a39d0..406179dbaa 100644 --- a/src/scenario.c +++ b/src/scenario.c @@ -139,7 +139,7 @@ void scenario_load(const char *path) sawyercoding_read_chunk(file, (uint8*)RCT2_ADDRESS_CURRENT_PARK_RATING); // Read ? - sawyercoding_read_chunk(file, (uint8*)0x01357CF2); + sawyercoding_read_chunk(file, (uint8*)RCT2_ADDRESS_ACTIVE_RESEARCH_TYPES); // Read ? sawyercoding_read_chunk(file, (uint8*)0x0135832C); diff --git a/src/window_new_campaign.c b/src/window_new_campaign.c index 16cd807000..efe6ad5afd 100644 --- a/src/window_new_campaign.c +++ b/src/window_new_campaign.c @@ -174,7 +174,7 @@ void window_new_campaign_open(sint16 campaignType) numApplicableRides = 0; window_new_campaign_rides[0] = 255; FOR_ALL_RIDES(i, ride) { - if (!(RCT2_GLOBAL(0x0097CF40 + (ride->type * 8), uint32) & 0x03820000)) + if (!(RCT2_GLOBAL(RCT2_ADDRESS_RIDE_FLAGS + (ride->type * 8), uint32) & 0x03820000)) window_new_campaign_rides[numApplicableRides++] = i; } window_new_campaign_rides[numApplicableRides] = 255; diff --git a/src/window_new_ride.c b/src/window_new_ride.c index 296aea59ce..f744a63c24 100644 --- a/src/window_new_ride.c +++ b/src/window_new_ride.c @@ -29,7 +29,7 @@ #include "widget.h" #include "window.h" -#define _window_new_ride_current_tab RCT2_GLOBAL(0x00F43824, uint8) +#define _window_new_ride_current_tab RCT2_GLOBAL(RCT2_ADDRESS_WINDOW_RIDE_LIST_SELECTED_TAB, uint8) typedef struct { uint8 type; @@ -374,7 +374,7 @@ static void window_new_ride_scroll_to_focused_ride(rct_window *w) // Find row index of the focused ride type rct_widget *listWidget = &window_new_ride_widgets[WIDX_RIDE_LIST]; - int focusRideType = RCT2_ADDRESS(0x00F43825, uint16)[_window_new_ride_current_tab]; + int focusRideType = RCT2_ADDRESS(RCT2_ADDRESS_WINDOW_RIDE_LIST_HIGHLIGHTED_ITEM, uint16)[_window_new_ride_current_tab]; int count = 0, row = 0; ride_list_item *listItem = (ride_list_item*)0x00F43523; while (listItem->type != 255 || listItem->entry_index != 255) { @@ -436,7 +436,7 @@ void window_new_ride_open() window_new_ride_populate_list(); - w->new_ride.highlighted_ride_id = RCT2_ADDRESS(0x00F43825, sint16)[_window_new_ride_current_tab]; + w->new_ride.highlighted_ride_id = RCT2_ADDRESS(RCT2_ADDRESS_WINDOW_RIDE_LIST_HIGHLIGHTED_ITEM, sint16)[_window_new_ride_current_tab]; if (w->new_ride.highlighted_ride_id == -1) w->new_ride.highlighted_ride_id = RCT2_GLOBAL(0x00F43523, sint16); @@ -579,7 +579,7 @@ static void window_new_ride_mousedown(int widgetIndex, rct_window *w, rct_widget w->new_ride.selected_ride_countdown = -1; window_new_ride_populate_list(); if (page < WINDOW_NEW_RIDE_PAGE_RESEARCH) { - w->new_ride.highlighted_ride_id = RCT2_ADDRESS(0x00F43825, sint16)[page]; + w->new_ride.highlighted_ride_id = RCT2_ADDRESS(RCT2_ADDRESS_WINDOW_RIDE_LIST_HIGHLIGHTED_ITEM, sint16)[page]; if (w->new_ride.highlighted_ride_id == -1) w->new_ride.highlighted_ride_id = RCT2_GLOBAL(0x00F43523, sint16); } @@ -654,7 +654,7 @@ static void window_new_ride_scrollmousedown() if (item.type == 255 && item.entry_index == 255) return; - RCT2_ADDRESS(0x00F43825, ride_list_item)[_window_new_ride_current_tab] = item; + RCT2_ADDRESS(RCT2_ADDRESS_WINDOW_RIDE_LIST_HIGHLIGHTED_ITEM, ride_list_item)[_window_new_ride_current_tab] = item; w->new_ride.selected_ride_id = *((sint16*)&item); sound_play_panned(SOUND_CLICK_1, w->x + (w->width / 2)); @@ -683,7 +683,7 @@ static void window_new_ride_scrollmouseover() return; w->new_ride.highlighted_ride_id = *((sint16*)&item); - RCT2_ADDRESS(0x00F43825, ride_list_item)[_window_new_ride_current_tab] = item; + RCT2_ADDRESS(RCT2_ADDRESS_WINDOW_RIDE_LIST_HIGHLIGHTED_ITEM, ride_list_item)[_window_new_ride_current_tab] = item; window_invalidate(w); } @@ -715,7 +715,7 @@ static void window_new_ride_invalidate() if (_window_new_ride_current_tab == WINDOW_NEW_RIDE_PAGE_RESEARCH) { window_new_ride_widgets[WIDX_LAST_DEVELOPMENT_BUTTON].type = WWT_EMPTY; - uint32 typeId = RCT2_GLOBAL(0x01357CF4, uint32); + uint32 typeId = RCT2_GLOBAL(RCT2_ADDRESS_LAST_RESEARCHED_ITEM_SUBJECT, uint32); if (typeId != 0xFFFFFFFF) { window_new_ride_widgets[WIDX_LAST_DEVELOPMENT_BUTTON].type = WWT_FLATBTN; window_new_ride_widgets[WIDX_LAST_DEVELOPMENT_BUTTON].image = typeId >= 0x10000 ? 5189 : 5191; @@ -790,7 +790,7 @@ static void window_new_ride_paint() x = w->x + 10; y = w->y + window_new_ride_widgets[WIDX_LAST_DEVELOPMENT_GROUP].top + 12; - uint32 typeId = RCT2_GLOBAL(0x01357CF4, uint32); + uint32 typeId = RCT2_GLOBAL(RCT2_ADDRESS_LAST_RESEARCHED_ITEM_SUBJECT, uint32); if (typeId != 0xFFFFFFFF) { if (typeId >= 0x10000) { rct_ride_type *rideEntry = RCT2_GLOBAL(0x009ACFA4 + (typeId & 0xFF) * 4, rct_ride_type*); diff --git a/src/window_research.c b/src/window_research.c index 0417db1afa..b65fc7dba4 100644 --- a/src/window_research.c +++ b/src/window_research.c @@ -310,7 +310,7 @@ static void window_research_development_invalidate() window_research_set_pressed_tab(w); window_research_development_widgets[WIDX_LAST_DEVELOPMENT_BUTTON].type = WWT_EMPTY; - uint32 typeId = RCT2_GLOBAL(0x01357CF4, uint32); + uint32 typeId = RCT2_GLOBAL(RCT2_ADDRESS_LAST_RESEARCHED_ITEM_SUBJECT, uint32); if (typeId != 0xFFFFFFFF) { window_research_development_widgets[WIDX_LAST_DEVELOPMENT_BUTTON].type = WWT_FLATBTN; window_research_development_widgets[WIDX_LAST_DEVELOPMENT_BUTTON].image = typeId >= 0x10000 ? 5189 : 5191; @@ -377,7 +377,7 @@ static void window_research_development_paint() x = w->x + 10; y = w->y + window_research_development_widgets[WIDX_LAST_DEVELOPMENT_GROUP].top + 12; - uint32 typeId = RCT2_GLOBAL(0x01357CF4, uint32); + uint32 typeId = RCT2_GLOBAL(RCT2_ADDRESS_LAST_RESEARCHED_ITEM_SUBJECT, uint32); int lastDevelopmentFormat; if (typeId != 0xFFFFFFFF) { if (typeId >= 0x10000) { From 563e0ca3dcee57ec297f69883bd567473bff640b Mon Sep 17 00:00:00 2001 From: adrian17 Date: Thu, 28 Aug 2014 20:14:00 +0200 Subject: [PATCH 02/10] Fix wrong condition in audio.c --- src/audio.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/audio.c b/src/audio.c index 470862fc9a..678938e21c 100644 --- a/src/audio.c +++ b/src/audio.c @@ -435,7 +435,7 @@ void audio_init2(int device) } } } - if (!RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_FLAGS, uint8) & 1 << 4) { + if (!(RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_FLAGS, uint8) & 1 << 4)) { RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_SOUND_SW_BUFFER, uint32) = RCT2_GLOBAL(0x001425B74, uint32) != RCT2_GLOBAL(0x001425B78, uint32) || RCT2_GLOBAL(0x001425B74, uint32) != RCT2_GLOBAL(0x001425B7C, uint32); RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_FLAGS, uint8) |= 1 << 4; config_save(); From 01789c0781796f9764978aa841d96b4f673a2300 Mon Sep 17 00:00:00 2001 From: zsilencer Date: Thu, 28 Aug 2014 14:05:56 -0600 Subject: [PATCH 03/10] 0x00401000 --- src/audio.c | 180 +++++++++++++++++++++++++++++++++++++++++++++++++++- src/audio.h | 96 ++++++++++++++++++++++++++++ 2 files changed, 275 insertions(+), 1 deletion(-) diff --git a/src/audio.c b/src/audio.c index 6fe7726f63..0299246ac7 100644 --- a/src/audio.c +++ b/src/audio.c @@ -344,7 +344,185 @@ int map_sound_info(const char* filename) */ void sub_401000(UINT uTimerID, UINT uMsg, DWORD_PTR dwUser, DWORD_PTR dw1, DWORD_PTR dw2, int channel) { - RCT2_CALLFUNC_6(0x00401000, void, UINT, UINT, DWORD_PTR, DWORD_PTR, DWORD_PTR, int, uTimerID, uMsg, dwUser, dw1, dw2, channel); + //RCT2_CALLFUNC_6(0x00401000, void, UINT, UINT, DWORD_PTR, DWORD_PTR, DWORD_PTR, int, uTimerID, uMsg, dwUser, dw1, dw2, channel); + rct_sound_unknown* unknown = &RCT2_ADDRESS(0x014262E0, rct_sound_unknown)[channel]; + DWORD status; + DWORD dwCurrentPlayCursor; + DWORD dwCurrentWriteCursor; + int var1; + int var2; + int bufferlost = 0; + char* buf1; + int buf1size; + char* buf2; + int buf2size; + unknown->dsbuffer->lpVtbl->GetStatus(unknown->dsbuffer, &status); + if (status & DSBSTATUS_BUFFERLOST) { + if (FAILED(unknown->dsbuffer->lpVtbl->Restore(unknown->dsbuffer))) { + return; + } + unknown->playpos = 0; + bufferlost = 1; + } + unknown->dsbuffer->lpVtbl->GetCurrentPosition(unknown->dsbuffer, &dwCurrentPlayCursor, &dwCurrentWriteCursor); + if (dwCurrentPlayCursor != unknown->playpos || bufferlost) { + if (unknown->var_168 && !unknown->var_15C) { + if (!unknown->var_160) { + unknown->var_160 = 1; + if (!unknown->var_4) { + LPDIRECTSOUNDBUFFER dsbuffer = RCT2_ADDRESS(RCT2_ADDRESS_DSOUND_BUFFERS, LPDIRECTSOUNDBUFFER)[channel]; + unknown->var_0 = 0; + if (dsbuffer) { + dsbuffer->lpVtbl->Stop(dsbuffer); + dsbuffer->lpVtbl->Release(dsbuffer); + RCT2_ADDRESS(RCT2_ADDRESS_DSOUND_BUFFERS, LPDIRECTSOUNDBUFFER)[channel] = 0; + } + if (unknown->var_120) { + sound_channel_free(&unknown->var_120, &unknown->var_11C); + } + } + } + return; + } + if (dwCurrentPlayCursor >= unknown->playpos) { + var1 = dwCurrentPlayCursor - unknown->playpos; + } else { + var1 = dwCurrentPlayCursor + unknown->var_150 - unknown->playpos; + } + if (bufferlost) { + var2 = 2 * unknown->var_150 / 6; + } else { + var2 = var1; + } + unknown->var_158 += var1; + if (unknown->var_168) { + int var3 = unknown->var_15C; + int* var4 = &unknown->var_15C; + if (var3) { + if (var1 <= var3) { + *var4 = var3 - var1; + } else { + *var4 = 0; + } + if (SUCCEEDED(unknown->dsbuffer->lpVtbl->Lock(unknown->dsbuffer, unknown->playpos, var2, &buf1, &buf1size, &buf2, &buf2size, 0))) { + char var5 = -(((char*)unknown->var_11C + 14) != (char *)8); + var5 &= 0x80; + memset(buf1, var5 + 128, buf1size); + if (buf2 && buf2size) { + char var5 = -(((char*)unknown->var_11C + 14) != (char *)8); + var5 &= 0x80; + memset(buf2, var5 + 128, buf2size); + } + unknown->dsbuffer->lpVtbl->Unlock(unknown->dsbuffer, buf1, buf1size, buf2, buf2size); + unknown->playpos += var2; + if( unknown->playpos >= unknown->var_150) { + unknown->playpos = unknown->playpos - unknown->var_150; + } + return; + } + // TimeFunc() could not lock DirectSoundBuffer + return; + } + } + if (FAILED(unknown->dsbuffer->lpVtbl->Lock(unknown->dsbuffer, unknown->playpos, var2, &buf1, &buf1size, &buf2, &buf2size, 0))) { + // TimeFunc() could not lock DirectSoundBuffer + return; + } + if (buf1size) { + if (unknown->var_160) { + int var5 = -(((char*)unknown->var_11C + 14) != (char *)8); + var5 &= 0x80; + memset(buf1, var5 + 128, buf1size); + goto label49; + } + } + int var7; + RCT2_CALLFUNC_5(0x00405383, int, HMMIO, int, char*, int*, int*, unknown->var_120, buf1size, buf1, &unknown->var_124, &var7); + if (var7 < buf1size) { + if (!unknown->var_164) { + int s = *(char*)((char*)unknown->var_11C + 14); + int t = buf1size - var7; + int v; + if (s == 8) { + v = 128; + } else { + if (s != 16) { + goto label42; + } + v = 0; + } + memset(&buf1[var7], v, t); + label42: + unknown->var_168 = 1; + if (dwCurrentPlayCursor <= unknown->playpos) { + unknown->var_15C = unknown->playpos - dwCurrentPlayCursor; + } else { + unknown->var_15C = unknown->playpos + unknown->var_150 - dwCurrentPlayCursor; + } + goto label49; + } + char* v21 = buf1; + int v38 = buf1size; + do { + v38 -= var7; + v21 += var7; + RCT2_CALLFUNC_1(0x0040153B, int, int, channel); + RCT2_CALLFUNC_5(0x00405383, int, HMMIO, int, char*, int*, int*, unknown->var_120, v38, v21, &unknown->var_124, &var7); + } while(var7 < v38); + } + label49: + if (buf2size == 0 || unknown->var_160 != 0) { + if(buf2 != 0 && buf2size != 0 && unknown->var_160 != 0) { + int var5 = -(*(char*)((char*)unknown->var_11C + 14) != 8); + var5 &= 0x80; + memset(buf2, var5 + 128, buf2size); + } + goto label68; + } + RCT2_CALLFUNC_5(0x00405383, int, HMMIO, int, char*, int*, int*, unknown->var_120, buf2size, buf2, &unknown->var_124, &var7); + if (var7 >= buf2size) { + label68: + unknown->dsbuffer->lpVtbl->Unlock(unknown->dsbuffer, buf1, buf1size, buf2, buf2size); + unknown->playpos += var2; + if( unknown->playpos >= unknown->var_150 ) { + unknown->playpos -= unknown->var_150; + } + if (bufferlost != 0) { + unknown->dsbuffer->lpVtbl->Play(unknown->dsbuffer, 0, 0, DSBPLAY_LOOPING); + } + return; + } + if (unknown->var_164 != 0) { + char* v26 = buf2; + int v27 = buf2size; + do { + v26 += var7; + v27 -= var7; + RCT2_CALLFUNC_1(0x0040153B, int, int, channel); + RCT2_CALLFUNC_5(0x00405383, int, HMMIO, int, char*, int*, int*, unknown->var_120, v27, v26, &unknown->var_124, &var7); + } while(var7 < v27); + goto label68; + } + int s = buf2size - var7; + int v; + if (unknown->var_11C == (HGLOBAL)8) { + v = 128; + } else { + if (unknown->var_11C != (HGLOBAL)16) { + goto label58; + } + v = 0; + } + memset(&buf2[var7], v, s); + label58: + unknown->var_168 = 1; + if (dwCurrentPlayCursor <= unknown->playpos) { + unknown->var_15C = unknown->playpos - dwCurrentPlayCursor; + } else { + unknown->var_15C = unknown->playpos + unknown->var_150 - dwCurrentPlayCursor; + } + goto label68; + } } /** diff --git a/src/audio.h b/src/audio.h index 85aba58db8..b630ba92ce 100644 --- a/src/audio.h +++ b/src/audio.h @@ -100,6 +100,101 @@ typedef struct { rct_sound sound; } rct_other_sound; +typedef struct { + uint32 var_0; + uint32 var_4; + uint32 var_8; + uint16 var_C; + uint16 var_E; + uint32 var_10; + uint32 var_14; + uint32 var_18; + uint32 var_1C; + uint32 var_20; + uint32 var_24; + uint32 var_28; + uint32 var_2C; + uint32 var_30; + uint32 var_34; + uint32 var_38; + uint32 var_3C; + uint32 var_40; + uint32 var_44; + uint32 var_48; + uint32 var_4C; + uint32 var_50; + uint32 var_54; + uint32 var_58; + uint32 var_5C; + uint32 var_60; + uint32 var_64; + uint32 var_68; + uint32 var_6C; + uint32 var_70; + uint32 var_74; + uint32 var_78; + uint32 var_7C; + uint32 var_80; + uint32 var_84; + uint32 var_88; + uint32 var_8C; + uint32 var_90; + uint32 var_94; + uint32 var_98; + uint32 var_9C; + uint32 var_A0; + uint32 var_A4; + uint32 var_A8; + uint32 var_AC; + uint32 var_B0; + uint32 var_B4; + uint32 var_B8; + uint32 var_BC; + uint32 var_C0; + uint32 var_C4; + uint32 var_C8; + uint32 var_CC; + uint32 var_D0; + uint32 var_D4; + uint32 var_D8; + uint32 var_DC; + uint32 var_E0; + uint32 var_E4; + uint32 var_E8; + uint32 var_EC; + uint32 var_F0; + uint32 var_F4; + uint32 var_F8; + uint32 var_FC; + uint32 var_100; + uint32 var_104; + uint32 var_108; + uint32 var_10C; + uint32 var_110; + uint32 var_114; + uint32 var_118; + HGLOBAL var_11C; + HMMIO var_120; + uint32 var_124; + uint32 var_128; + uint32 var_12C; + uint32 var_130; + uint32 var_134; + uint32 var_138; + uint32 var_13C; + uint32 var_140; + uint32 var_144; + uint32 var_148; + LPDIRECTSOUNDBUFFER dsbuffer; // 0x14C + uint32 var_150; + uint32 playpos; // 0x154 + uint32 var_158; + uint32 var_15C; + uint32 var_160; + uint32 var_164; + uint32 var_168; +} rct_sound_unknown; + int get_dsound_devices(); int sound_prepare(int sound_id, rct_sound *sound, int channels, int software); int sound_play_panned(int sound_id, int x); @@ -112,6 +207,7 @@ int sound_channel_play(int channel, int a2, int volume, int pan, int frequency); int sound_channel_set_frequency(int channel, int frequency); int sound_channel_set_pan(int channel, int pan); int sound_channel_set_volume(int channel, int volume); +void sound_channel_free(HMMIO* hmmio, HGLOBAL* hmem); int sound_stop(rct_sound *sound); int sound_stop_all(); int unmap_file(LPCVOID base); From 5c44a07aac9d1f985c74813ec66fc4a72d34df2e Mon Sep 17 00:00:00 2001 From: zsilencer Date: Thu, 28 Aug 2014 17:36:52 -0600 Subject: [PATCH 04/10] sub_405383 --- src/audio.c | 177 +++++++++++++++++++++++++++++++++++----------------- src/audio.h | 113 +++++---------------------------- 2 files changed, 134 insertions(+), 156 deletions(-) diff --git a/src/audio.c b/src/audio.c index 0299246ac7..2683c80652 100644 --- a/src/audio.c +++ b/src/audio.c @@ -338,14 +338,77 @@ int map_sound_info(const char* filename) } } +/** +* +* rct2: 0x00405383 +*/ +MMRESULT sub_405383(HMMIO hmmio, uint32 size, char* buffer, uint32* a4, int* read) +{ + MMIOINFO mmioinfo; + MMRESULT result; + result = mmioGetInfo(hmmio, &mmioinfo, 0); + if (result != 0) { + *read = 0; + return 1; + } + int size2 = size; + if (size > a4[1]) { + size2 = a4[1]; + } + int v8 = 0; + a4[1] -= size2; + if (size2) { + while (1) { + HPSTR p = mmioinfo.pchEndRead; + if (mmioinfo.pchNext == mmioinfo.pchEndRead) { + result = mmioAdvance(hmmio, &mmioinfo, 0); + if (result != 0) { + *read = 0; + return result; + } + p = mmioinfo.pchEndRead; + if (mmioinfo.pchNext == mmioinfo.pchEndRead) { + break; + } + } + int q = p - mmioinfo.pchNext; + if (size2 - v8 < p - mmioinfo.pchNext) { + q = size2 - v8; + } + memcpy(&buffer[v8], mmioinfo.pchNext, q); + mmioinfo.pchNext += q; + v8 += q; + if (v8 >= size2) { + result = mmioSetInfo(hmmio, &mmioinfo, 0); + if (result != 0) { + *read = 0; + return result; + } else { + *read = size2; + return result; + } + } + } + *read = 0; + return 57603; + } + result = mmioSetInfo(hmmio, &mmioinfo, 0); + if (result != 0) { + *read = 0; + return result; + } else { + *read = size2; + return result; + } +} + /** * * rct2: 0x00401000 */ void sub_401000(UINT uTimerID, UINT uMsg, DWORD_PTR dwUser, DWORD_PTR dw1, DWORD_PTR dw2, int channel) { - //RCT2_CALLFUNC_6(0x00401000, void, UINT, UINT, DWORD_PTR, DWORD_PTR, DWORD_PTR, int, uTimerID, uMsg, dwUser, dw1, dw2, channel); - rct_sound_unknown* unknown = &RCT2_ADDRESS(0x014262E0, rct_sound_unknown)[channel]; + rct_sound_channel* soundchannel = &RCT2_ADDRESS(0x014262E0, rct_sound_channel)[channel]; DWORD status; DWORD dwCurrentPlayCursor; DWORD dwCurrentWriteCursor; @@ -356,67 +419,67 @@ void sub_401000(UINT uTimerID, UINT uMsg, DWORD_PTR dwUser, DWORD_PTR dw1, DWORD int buf1size; char* buf2; int buf2size; - unknown->dsbuffer->lpVtbl->GetStatus(unknown->dsbuffer, &status); + soundchannel->dsbuffer->lpVtbl->GetStatus(soundchannel->dsbuffer, &status); if (status & DSBSTATUS_BUFFERLOST) { - if (FAILED(unknown->dsbuffer->lpVtbl->Restore(unknown->dsbuffer))) { + if (FAILED(soundchannel->dsbuffer->lpVtbl->Restore(soundchannel->dsbuffer))) { return; } - unknown->playpos = 0; + soundchannel->playpos = 0; bufferlost = 1; } - unknown->dsbuffer->lpVtbl->GetCurrentPosition(unknown->dsbuffer, &dwCurrentPlayCursor, &dwCurrentWriteCursor); - if (dwCurrentPlayCursor != unknown->playpos || bufferlost) { - if (unknown->var_168 && !unknown->var_15C) { - if (!unknown->var_160) { - unknown->var_160 = 1; - if (!unknown->var_4) { + soundchannel->dsbuffer->lpVtbl->GetCurrentPosition(soundchannel->dsbuffer, &dwCurrentPlayCursor, &dwCurrentWriteCursor); + if (dwCurrentPlayCursor != soundchannel->playpos || bufferlost) { + if (soundchannel->var_168 && !soundchannel->var_15C) { + if (!soundchannel->var_160) { + soundchannel->var_160 = 1; + if (!soundchannel->var_4) { LPDIRECTSOUNDBUFFER dsbuffer = RCT2_ADDRESS(RCT2_ADDRESS_DSOUND_BUFFERS, LPDIRECTSOUNDBUFFER)[channel]; - unknown->var_0 = 0; + soundchannel->var_0 = 0; if (dsbuffer) { dsbuffer->lpVtbl->Stop(dsbuffer); dsbuffer->lpVtbl->Release(dsbuffer); RCT2_ADDRESS(RCT2_ADDRESS_DSOUND_BUFFERS, LPDIRECTSOUNDBUFFER)[channel] = 0; } - if (unknown->var_120) { - sound_channel_free(&unknown->var_120, &unknown->var_11C); + if (soundchannel->hmmio) { + sound_channel_free(&soundchannel->hmmio, &soundchannel->hmem); } } } return; } - if (dwCurrentPlayCursor >= unknown->playpos) { - var1 = dwCurrentPlayCursor - unknown->playpos; + if (dwCurrentPlayCursor >= soundchannel->playpos) { + var1 = dwCurrentPlayCursor - soundchannel->playpos; } else { - var1 = dwCurrentPlayCursor + unknown->var_150 - unknown->playpos; + var1 = dwCurrentPlayCursor + soundchannel->var_150 - soundchannel->playpos; } if (bufferlost) { - var2 = 2 * unknown->var_150 / 6; + var2 = 2 * soundchannel->var_150 / 6; } else { var2 = var1; } - unknown->var_158 += var1; - if (unknown->var_168) { - int var3 = unknown->var_15C; - int* var4 = &unknown->var_15C; + soundchannel->var_158 += var1; + if (soundchannel->var_168) { + int var3 = soundchannel->var_15C; + int* var4 = &soundchannel->var_15C; if (var3) { if (var1 <= var3) { *var4 = var3 - var1; } else { *var4 = 0; } - if (SUCCEEDED(unknown->dsbuffer->lpVtbl->Lock(unknown->dsbuffer, unknown->playpos, var2, &buf1, &buf1size, &buf2, &buf2size, 0))) { - char var5 = -(((char*)unknown->var_11C + 14) != (char *)8); + if (SUCCEEDED(soundchannel->dsbuffer->lpVtbl->Lock(soundchannel->dsbuffer, soundchannel->playpos, var2, &buf1, &buf1size, &buf2, &buf2size, 0))) { + uint16 var5 = -(soundchannel->var_128 != 8); var5 &= 0x80; memset(buf1, var5 + 128, buf1size); if (buf2 && buf2size) { - char var5 = -(((char*)unknown->var_11C + 14) != (char *)8); + uint16 var5 = -(soundchannel->var_128 != 8); var5 &= 0x80; memset(buf2, var5 + 128, buf2size); } - unknown->dsbuffer->lpVtbl->Unlock(unknown->dsbuffer, buf1, buf1size, buf2, buf2size); - unknown->playpos += var2; - if( unknown->playpos >= unknown->var_150) { - unknown->playpos = unknown->playpos - unknown->var_150; + soundchannel->dsbuffer->lpVtbl->Unlock(soundchannel->dsbuffer, buf1, buf1size, buf2, buf2size); + soundchannel->playpos += var2; + if( soundchannel->playpos >= soundchannel->var_150) { + soundchannel->playpos = soundchannel->playpos - soundchannel->var_150; } return; } @@ -424,23 +487,23 @@ void sub_401000(UINT uTimerID, UINT uMsg, DWORD_PTR dwUser, DWORD_PTR dw1, DWORD return; } } - if (FAILED(unknown->dsbuffer->lpVtbl->Lock(unknown->dsbuffer, unknown->playpos, var2, &buf1, &buf1size, &buf2, &buf2size, 0))) { + if (FAILED(soundchannel->dsbuffer->lpVtbl->Lock(soundchannel->dsbuffer, soundchannel->playpos, var2, &buf1, &buf1size, &buf2, &buf2size, 0))) { // TimeFunc() could not lock DirectSoundBuffer return; } if (buf1size) { - if (unknown->var_160) { - int var5 = -(((char*)unknown->var_11C + 14) != (char *)8); + if (soundchannel->var_160) { + uint16 var5 = -(soundchannel->var_128 != 8); var5 &= 0x80; memset(buf1, var5 + 128, buf1size); goto label49; } } int var7; - RCT2_CALLFUNC_5(0x00405383, int, HMMIO, int, char*, int*, int*, unknown->var_120, buf1size, buf1, &unknown->var_124, &var7); + sub_405383(soundchannel->hmmio, buf1size, buf1, &soundchannel->var_124, &var7); if (var7 < buf1size) { - if (!unknown->var_164) { - int s = *(char*)((char*)unknown->var_11C + 14); + if (!soundchannel->var_164) { + int s = soundchannel->var_128; int t = buf1size - var7; int v; if (s == 8) { @@ -453,11 +516,11 @@ void sub_401000(UINT uTimerID, UINT uMsg, DWORD_PTR dwUser, DWORD_PTR dw1, DWORD } memset(&buf1[var7], v, t); label42: - unknown->var_168 = 1; - if (dwCurrentPlayCursor <= unknown->playpos) { - unknown->var_15C = unknown->playpos - dwCurrentPlayCursor; + soundchannel->var_168 = 1; + if (dwCurrentPlayCursor <= soundchannel->playpos) { + soundchannel->var_15C = soundchannel->playpos - dwCurrentPlayCursor; } else { - unknown->var_15C = unknown->playpos + unknown->var_150 - dwCurrentPlayCursor; + soundchannel->var_15C = soundchannel->playpos + soundchannel->var_150 - dwCurrentPlayCursor; } goto label49; } @@ -467,59 +530,59 @@ void sub_401000(UINT uTimerID, UINT uMsg, DWORD_PTR dwUser, DWORD_PTR dw1, DWORD v38 -= var7; v21 += var7; RCT2_CALLFUNC_1(0x0040153B, int, int, channel); - RCT2_CALLFUNC_5(0x00405383, int, HMMIO, int, char*, int*, int*, unknown->var_120, v38, v21, &unknown->var_124, &var7); + sub_405383(soundchannel->hmmio, v38, v21, &soundchannel->var_124, &var7); } while(var7 < v38); } label49: - if (buf2size == 0 || unknown->var_160 != 0) { - if(buf2 != 0 && buf2size != 0 && unknown->var_160 != 0) { - int var5 = -(*(char*)((char*)unknown->var_11C + 14) != 8); + if (buf2size == 0 || soundchannel->var_160 != 0) { + if(buf2 != 0 && buf2size != 0 && soundchannel->var_160 != 0) { + int var5 = -(soundchannel->var_128 != 8); var5 &= 0x80; memset(buf2, var5 + 128, buf2size); } goto label68; } - RCT2_CALLFUNC_5(0x00405383, int, HMMIO, int, char*, int*, int*, unknown->var_120, buf2size, buf2, &unknown->var_124, &var7); + sub_405383(soundchannel->hmmio, buf2size, buf2, &soundchannel->var_124, &var7); if (var7 >= buf2size) { label68: - unknown->dsbuffer->lpVtbl->Unlock(unknown->dsbuffer, buf1, buf1size, buf2, buf2size); - unknown->playpos += var2; - if( unknown->playpos >= unknown->var_150 ) { - unknown->playpos -= unknown->var_150; + soundchannel->dsbuffer->lpVtbl->Unlock(soundchannel->dsbuffer, buf1, buf1size, buf2, buf2size); + soundchannel->playpos += var2; + if (soundchannel->playpos >= soundchannel->var_150) { + soundchannel->playpos -= soundchannel->var_150; } if (bufferlost != 0) { - unknown->dsbuffer->lpVtbl->Play(unknown->dsbuffer, 0, 0, DSBPLAY_LOOPING); + soundchannel->dsbuffer->lpVtbl->Play(soundchannel->dsbuffer, 0, 0, DSBPLAY_LOOPING); } return; } - if (unknown->var_164 != 0) { + if (soundchannel->var_164 != 0) { char* v26 = buf2; int v27 = buf2size; do { v26 += var7; v27 -= var7; RCT2_CALLFUNC_1(0x0040153B, int, int, channel); - RCT2_CALLFUNC_5(0x00405383, int, HMMIO, int, char*, int*, int*, unknown->var_120, v27, v26, &unknown->var_124, &var7); + sub_405383(soundchannel->hmmio, v27, v26, &soundchannel->var_124, &var7); } while(var7 < v27); goto label68; } int s = buf2size - var7; int v; - if (unknown->var_11C == (HGLOBAL)8) { + if (soundchannel->hmem == (HGLOBAL)8) { v = 128; } else { - if (unknown->var_11C != (HGLOBAL)16) { + if (soundchannel->hmem != (HGLOBAL)16) { goto label58; } v = 0; } memset(&buf2[var7], v, s); label58: - unknown->var_168 = 1; - if (dwCurrentPlayCursor <= unknown->playpos) { - unknown->var_15C = unknown->playpos - dwCurrentPlayCursor; + soundchannel->var_168 = 1; + if (dwCurrentPlayCursor <= soundchannel->playpos) { + soundchannel->var_15C = soundchannel->playpos - dwCurrentPlayCursor; } else { - unknown->var_15C = unknown->playpos + unknown->var_150 - dwCurrentPlayCursor; + soundchannel->var_15C = soundchannel->playpos + soundchannel->var_150 - dwCurrentPlayCursor; } goto label68; } diff --git a/src/audio.h b/src/audio.h index b630ba92ce..625e40591e 100644 --- a/src/audio.h +++ b/src/audio.h @@ -69,10 +69,20 @@ typedef struct { typedef struct { uint32 var_0; - uint8 pad_4[0x118]; - HMMIO hmmio; - HGLOBAL hmem; - uint8 pad_124[0x3C]; + uint32 var_4; + uint8 pad_8[0x114]; + HGLOBAL hmem; // 0x11C + HMMIO hmmio; // 0x120 + uint32 var_124; + uint32 var_128; + uint32 var_12C; + uint32 var_130; + uint8 pad_134[0x18]; + LPDIRECTSOUNDBUFFER dsbuffer; // 0x14C + uint32 var_150; + uint32 playpos; // 0x154 + uint32 var_158; + uint32 var_15C; uint32 var_160; uint32 var_164; uint32 var_168; @@ -100,101 +110,6 @@ typedef struct { rct_sound sound; } rct_other_sound; -typedef struct { - uint32 var_0; - uint32 var_4; - uint32 var_8; - uint16 var_C; - uint16 var_E; - uint32 var_10; - uint32 var_14; - uint32 var_18; - uint32 var_1C; - uint32 var_20; - uint32 var_24; - uint32 var_28; - uint32 var_2C; - uint32 var_30; - uint32 var_34; - uint32 var_38; - uint32 var_3C; - uint32 var_40; - uint32 var_44; - uint32 var_48; - uint32 var_4C; - uint32 var_50; - uint32 var_54; - uint32 var_58; - uint32 var_5C; - uint32 var_60; - uint32 var_64; - uint32 var_68; - uint32 var_6C; - uint32 var_70; - uint32 var_74; - uint32 var_78; - uint32 var_7C; - uint32 var_80; - uint32 var_84; - uint32 var_88; - uint32 var_8C; - uint32 var_90; - uint32 var_94; - uint32 var_98; - uint32 var_9C; - uint32 var_A0; - uint32 var_A4; - uint32 var_A8; - uint32 var_AC; - uint32 var_B0; - uint32 var_B4; - uint32 var_B8; - uint32 var_BC; - uint32 var_C0; - uint32 var_C4; - uint32 var_C8; - uint32 var_CC; - uint32 var_D0; - uint32 var_D4; - uint32 var_D8; - uint32 var_DC; - uint32 var_E0; - uint32 var_E4; - uint32 var_E8; - uint32 var_EC; - uint32 var_F0; - uint32 var_F4; - uint32 var_F8; - uint32 var_FC; - uint32 var_100; - uint32 var_104; - uint32 var_108; - uint32 var_10C; - uint32 var_110; - uint32 var_114; - uint32 var_118; - HGLOBAL var_11C; - HMMIO var_120; - uint32 var_124; - uint32 var_128; - uint32 var_12C; - uint32 var_130; - uint32 var_134; - uint32 var_138; - uint32 var_13C; - uint32 var_140; - uint32 var_144; - uint32 var_148; - LPDIRECTSOUNDBUFFER dsbuffer; // 0x14C - uint32 var_150; - uint32 playpos; // 0x154 - uint32 var_158; - uint32 var_15C; - uint32 var_160; - uint32 var_164; - uint32 var_168; -} rct_sound_unknown; - int get_dsound_devices(); int sound_prepare(int sound_id, rct_sound *sound, int channels, int software); int sound_play_panned(int sound_id, int x); From 0496312cab05c4c777ebf0194842d6d4e44ab269 Mon Sep 17 00:00:00 2001 From: zsilencer Date: Thu, 28 Aug 2014 21:47:35 -0600 Subject: [PATCH 05/10] 0x0040153, 0x0040182 --- src/audio.c | 183 +++++++++++++++++++++++++++++++++++----------------- src/audio.h | 13 ++-- 2 files changed, 130 insertions(+), 66 deletions(-) diff --git a/src/audio.c b/src/audio.c index 7ebe1bb41d..b5d7adf004 100644 --- a/src/audio.c +++ b/src/audio.c @@ -187,6 +187,18 @@ int sound_load3dparameters() return 0; } +/** +* +* rct2: 0x00404F3F +*/ +int sound_load3dposition() +{ + if (SUCCEEDED(RCT2_GLOBAL(0x009E2BA4, LPDIRECTSOUND3DBUFFER)->lpVtbl->GetPosition(RCT2_GLOBAL(0x009E2BA4, LPDIRECTSOUND3DBUFFER), &RCT2_GLOBAL(0x009A6084, DS3DBUFFER), 1))) { + return 1; + } + return 0; +} + /** * * rct2: 0x00404932 @@ -240,7 +252,7 @@ int dsound_create_primary_buffer(int a, int device, int channels, int samples, i RCT2_GLOBAL(0x009A6084, DS3DBUFFER).vPosition.x = -1.0f; RCT2_GLOBAL(0x009A6084, DS3DBUFFER).flMaxDistance = 9.8999996f; RCT2_GLOBAL(0x009A6084, DS3DBUFFER).flMinDistance = 0.25f; - if (RCT2_CALLFUNC(0x00404F3F, int)) { + if (sound_load3dposition()) { if (SUCCEEDED(RCT2_GLOBAL(0x009E2BA4, LPDIRECTSOUND3DBUFFER)->lpVtbl->SetMinDistance(RCT2_GLOBAL(0x009E2BA4, LPDIRECTSOUND3DBUFFER), RCT2_GLOBAL(0x009A6084, DS3DBUFFER).flMinDistance, 1))) { if (sound_load3dparameters()) { return 1; @@ -402,13 +414,64 @@ MMRESULT sub_405383(HMMIO hmmio, uint32 size, char* buffer, uint32* a4, int* rea } } +/** +* +* rct2: 0x00401822 +*/ +int sub_401822(int channel, HMMIO hmmio, LONG offset) +{ + rct_sound_channel* sound_channel = &RCT2_ADDRESS(0x014262E0, rct_sound_channel)[channel]; + LPMMCKINFO v4 = &sound_channel->mmckinfo2; + HMMIO* v5 = &sound_channel->hmmio; + if (RCT2_CALLFUNC_4(0x00405222, int, HMMIO, HMMIO*, HGLOBAL*, LPMMCKINFO, hmmio, &sound_channel->hmmio, &sound_channel->hmem, &sound_channel->mmckinfo2)) { + return -100; + } + if (*(uint16*)sound_channel->hmem != 1) { + sound_channel_free(&sound_channel->hmmio, &sound_channel->hmem); + return -101; + } + if (RCT2_CALLFUNC_4(0x00405465, int, HMMIO*, LPMMCKINFO, LPMMCKINFO, int, &sound_channel->hmmio, &sound_channel->mmckinfo1, &sound_channel->mmckinfo2, offset)) { + sound_channel_free(&sound_channel->hmmio, &sound_channel->hmem); + return -103; + } + sound_channel->var_158 = offset; + return 0; +} + +/** +* +* rct2: 0x0040153B +*/ +int sub_40153B(int channel) +{ + rct_sound_channel* sound_channel = &RCT2_ADDRESS(0x014262E0, rct_sound_channel)[channel]; + if (sound_channel->var_4) { + if (sound_channel->hmmio) { + sound_channel_free(sound_channel->hmmio, sound_channel->hmem); + } + if (sub_401822(channel, &sound_channel->var_8, sound_channel->var_110)) { + return 0; + } + sound_channel->var_164 = sound_channel->var_114; + sound_channel->var_118 = sound_channel->var_110; + sound_channel->var_4 = 0; + } else { + int result = RCT2_CALLFUNC_4(0x00405465, int, HMMIO*, LPMMCKINFO, LPMMCKINFO, int, &sound_channel->hmmio, &sound_channel->mmckinfo1, &sound_channel->mmckinfo2, sound_channel->var_118); + sound_channel->var_158 = sound_channel->var_118; + if (result) { + return 0; + } + } + return 1; +} + /** * * rct2: 0x00401000 */ void sub_401000(UINT uTimerID, UINT uMsg, DWORD_PTR dwUser, DWORD_PTR dw1, DWORD_PTR dw2, int channel) { - rct_sound_channel* soundchannel = &RCT2_ADDRESS(0x014262E0, rct_sound_channel)[channel]; + rct_sound_channel* sound_channel = &RCT2_ADDRESS(0x014262E0, rct_sound_channel)[channel]; DWORD status; DWORD dwCurrentPlayCursor; DWORD dwCurrentWriteCursor; @@ -419,67 +482,67 @@ void sub_401000(UINT uTimerID, UINT uMsg, DWORD_PTR dwUser, DWORD_PTR dw1, DWORD int buf1size; char* buf2; int buf2size; - soundchannel->dsbuffer->lpVtbl->GetStatus(soundchannel->dsbuffer, &status); + sound_channel->dsbuffer->lpVtbl->GetStatus(sound_channel->dsbuffer, &status); if (status & DSBSTATUS_BUFFERLOST) { - if (FAILED(soundchannel->dsbuffer->lpVtbl->Restore(soundchannel->dsbuffer))) { + if (FAILED(sound_channel->dsbuffer->lpVtbl->Restore(sound_channel->dsbuffer))) { return; } - soundchannel->playpos = 0; + sound_channel->playpos = 0; bufferlost = 1; } - soundchannel->dsbuffer->lpVtbl->GetCurrentPosition(soundchannel->dsbuffer, &dwCurrentPlayCursor, &dwCurrentWriteCursor); - if (dwCurrentPlayCursor != soundchannel->playpos || bufferlost) { - if (soundchannel->var_168 && !soundchannel->var_15C) { - if (!soundchannel->var_160) { - soundchannel->var_160 = 1; - if (!soundchannel->var_4) { + sound_channel->dsbuffer->lpVtbl->GetCurrentPosition(sound_channel->dsbuffer, &dwCurrentPlayCursor, &dwCurrentWriteCursor); + if (dwCurrentPlayCursor != sound_channel->playpos || bufferlost) { + if (sound_channel->var_168 && !sound_channel->var_15C) { + if (!sound_channel->var_160) { + sound_channel->var_160 = 1; + if (!sound_channel->var_4) { LPDIRECTSOUNDBUFFER dsbuffer = RCT2_ADDRESS(RCT2_ADDRESS_DSOUND_BUFFERS, LPDIRECTSOUNDBUFFER)[channel]; - soundchannel->var_0 = 0; + sound_channel->var_0 = 0; if (dsbuffer) { dsbuffer->lpVtbl->Stop(dsbuffer); dsbuffer->lpVtbl->Release(dsbuffer); RCT2_ADDRESS(RCT2_ADDRESS_DSOUND_BUFFERS, LPDIRECTSOUNDBUFFER)[channel] = 0; } - if (soundchannel->hmmio) { - sound_channel_free(&soundchannel->hmmio, &soundchannel->hmem); + if (sound_channel->hmmio) { + sound_channel_free(&sound_channel->hmmio, &sound_channel->hmem); } } } return; } - if (dwCurrentPlayCursor >= soundchannel->playpos) { - var1 = dwCurrentPlayCursor - soundchannel->playpos; + if (dwCurrentPlayCursor >= sound_channel->playpos) { + var1 = dwCurrentPlayCursor - sound_channel->playpos; } else { - var1 = dwCurrentPlayCursor + soundchannel->var_150 - soundchannel->playpos; + var1 = dwCurrentPlayCursor + sound_channel->var_150 - sound_channel->playpos; } if (bufferlost) { - var2 = 2 * soundchannel->var_150 / 6; + var2 = 2 * sound_channel->var_150 / 6; } else { var2 = var1; } - soundchannel->var_158 += var1; - if (soundchannel->var_168) { - int var3 = soundchannel->var_15C; - int* var4 = &soundchannel->var_15C; + sound_channel->var_158 += var1; + if (sound_channel->var_168) { + int var3 = sound_channel->var_15C; + int* var4 = &sound_channel->var_15C; if (var3) { if (var1 <= var3) { *var4 = var3 - var1; } else { *var4 = 0; } - if (SUCCEEDED(soundchannel->dsbuffer->lpVtbl->Lock(soundchannel->dsbuffer, soundchannel->playpos, var2, &buf1, &buf1size, &buf2, &buf2size, 0))) { - uint16 var5 = -(soundchannel->var_128 != 8); + if (SUCCEEDED(sound_channel->dsbuffer->lpVtbl->Lock(sound_channel->dsbuffer, sound_channel->playpos, var2, (LPVOID*)&buf1, (LPDWORD)&buf1size, (LPVOID*)&buf2, &buf2size, 0))) { + uint16 var5 = -(sound_channel->mmckinfo1.cksize != 8); var5 &= 0x80; memset(buf1, var5 + 128, buf1size); if (buf2 && buf2size) { - uint16 var5 = -(soundchannel->var_128 != 8); + uint16 var5 = -(sound_channel->mmckinfo1.cksize != 8); var5 &= 0x80; memset(buf2, var5 + 128, buf2size); } - soundchannel->dsbuffer->lpVtbl->Unlock(soundchannel->dsbuffer, buf1, buf1size, buf2, buf2size); - soundchannel->playpos += var2; - if( soundchannel->playpos >= soundchannel->var_150) { - soundchannel->playpos = soundchannel->playpos - soundchannel->var_150; + sound_channel->dsbuffer->lpVtbl->Unlock(sound_channel->dsbuffer, buf1, buf1size, buf2, buf2size); + sound_channel->playpos += var2; + if (sound_channel->playpos >= sound_channel->var_150) { + sound_channel->playpos = sound_channel->playpos - sound_channel->var_150; } return; } @@ -487,23 +550,23 @@ void sub_401000(UINT uTimerID, UINT uMsg, DWORD_PTR dwUser, DWORD_PTR dw1, DWORD return; } } - if (FAILED(soundchannel->dsbuffer->lpVtbl->Lock(soundchannel->dsbuffer, soundchannel->playpos, var2, &buf1, &buf1size, &buf2, &buf2size, 0))) { + if (FAILED(sound_channel->dsbuffer->lpVtbl->Lock(sound_channel->dsbuffer, sound_channel->playpos, var2, (LPVOID*)&buf1, (LPDWORD)&buf1size, (LPVOID*)&buf2, &buf2size, 0))) { // TimeFunc() could not lock DirectSoundBuffer return; } if (buf1size) { - if (soundchannel->var_160) { - uint16 var5 = -(soundchannel->var_128 != 8); + if (sound_channel->var_160) { + uint16 var5 = -(sound_channel->mmckinfo1.cksize != 8); var5 &= 0x80; memset(buf1, var5 + 128, buf1size); goto label49; } } int var7; - sub_405383(soundchannel->hmmio, buf1size, buf1, &soundchannel->var_124, &var7); + sub_405383(sound_channel->hmmio, buf1size, buf1, &sound_channel->mmckinfo1, &var7); if (var7 < buf1size) { - if (!soundchannel->var_164) { - int s = soundchannel->var_128; + if (!sound_channel->var_164) { + int s = sound_channel->mmckinfo1.cksize; int t = buf1size - var7; int v; if (s == 8) { @@ -516,11 +579,11 @@ void sub_401000(UINT uTimerID, UINT uMsg, DWORD_PTR dwUser, DWORD_PTR dw1, DWORD } memset(&buf1[var7], v, t); label42: - soundchannel->var_168 = 1; - if (dwCurrentPlayCursor <= soundchannel->playpos) { - soundchannel->var_15C = soundchannel->playpos - dwCurrentPlayCursor; + sound_channel->var_168 = 1; + if (dwCurrentPlayCursor <= sound_channel->playpos) { + sound_channel->var_15C = sound_channel->playpos - dwCurrentPlayCursor; } else { - soundchannel->var_15C = soundchannel->playpos + soundchannel->var_150 - dwCurrentPlayCursor; + sound_channel->var_15C = sound_channel->playpos + sound_channel->var_150 - dwCurrentPlayCursor; } goto label49; } @@ -529,60 +592,60 @@ void sub_401000(UINT uTimerID, UINT uMsg, DWORD_PTR dwUser, DWORD_PTR dw1, DWORD do { v38 -= var7; v21 += var7; - RCT2_CALLFUNC_1(0x0040153B, int, int, channel); - sub_405383(soundchannel->hmmio, v38, v21, &soundchannel->var_124, &var7); + sub_40153B(channel);//RCT2_CALLFUNC_1(0x0040153B, int, int, channel); + sub_405383(sound_channel->hmmio, v38, v21, &sound_channel->mmckinfo1, &var7); } while(var7 < v38); } label49: - if (buf2size == 0 || soundchannel->var_160 != 0) { - if(buf2 != 0 && buf2size != 0 && soundchannel->var_160 != 0) { - int var5 = -(soundchannel->var_128 != 8); + if (buf2size == 0 || sound_channel->var_160 != 0) { + if(buf2 != 0 && buf2size != 0 && sound_channel->var_160 != 0) { + int var5 = -(sound_channel->mmckinfo1.cksize != 8); var5 &= 0x80; memset(buf2, var5 + 128, buf2size); } goto label68; } - sub_405383(soundchannel->hmmio, buf2size, buf2, &soundchannel->var_124, &var7); + sub_405383(sound_channel->hmmio, buf2size, buf2, &sound_channel->mmckinfo1, &var7); if (var7 >= buf2size) { label68: - soundchannel->dsbuffer->lpVtbl->Unlock(soundchannel->dsbuffer, buf1, buf1size, buf2, buf2size); - soundchannel->playpos += var2; - if (soundchannel->playpos >= soundchannel->var_150) { - soundchannel->playpos -= soundchannel->var_150; + sound_channel->dsbuffer->lpVtbl->Unlock(sound_channel->dsbuffer, buf1, buf1size, buf2, buf2size); + sound_channel->playpos += var2; + if (sound_channel->playpos >= sound_channel->var_150) { + sound_channel->playpos -= sound_channel->var_150; } if (bufferlost != 0) { - soundchannel->dsbuffer->lpVtbl->Play(soundchannel->dsbuffer, 0, 0, DSBPLAY_LOOPING); + sound_channel->dsbuffer->lpVtbl->Play(sound_channel->dsbuffer, 0, 0, DSBPLAY_LOOPING); } return; } - if (soundchannel->var_164 != 0) { + if (sound_channel->var_164 != 0) { char* v26 = buf2; int v27 = buf2size; do { v26 += var7; v27 -= var7; - RCT2_CALLFUNC_1(0x0040153B, int, int, channel); - sub_405383(soundchannel->hmmio, v27, v26, &soundchannel->var_124, &var7); + sub_40153B(channel);//RCT2_CALLFUNC_1(0x0040153B, int, int, channel); + sub_405383(sound_channel->hmmio, v27, v26, &sound_channel->mmckinfo1, &var7); } while(var7 < v27); goto label68; } int s = buf2size - var7; int v; - if (soundchannel->hmem == (HGLOBAL)8) { + if (sound_channel->hmem == (HGLOBAL)8) { v = 128; } else { - if (soundchannel->hmem != (HGLOBAL)16) { + if (sound_channel->hmem != (HGLOBAL)16) { goto label58; } v = 0; } memset(&buf2[var7], v, s); label58: - soundchannel->var_168 = 1; - if (dwCurrentPlayCursor <= soundchannel->playpos) { - soundchannel->var_15C = soundchannel->playpos - dwCurrentPlayCursor; + sound_channel->var_168 = 1; + if (dwCurrentPlayCursor <= sound_channel->playpos) { + sound_channel->var_15C = sound_channel->playpos - dwCurrentPlayCursor; } else { - soundchannel->var_15C = soundchannel->playpos + soundchannel->var_150 - dwCurrentPlayCursor; + sound_channel->var_15C = sound_channel->playpos + sound_channel->var_150 - dwCurrentPlayCursor; } goto label68; } @@ -1288,7 +1351,7 @@ int sound_channel_stop(int channel) while (_InterlockedExchange(&RCT2_GLOBAL(0x009E1AAC, LONG), 1) != 1) { Sleep(10); } - if (sound_channel->hmem) { + if (sound_channel->hmmio) { sound_channel_free(&sound_channel->hmmio, &sound_channel->hmem); } diff --git a/src/audio.h b/src/audio.h index 625e40591e..2848af7840 100644 --- a/src/audio.h +++ b/src/audio.h @@ -70,14 +70,15 @@ typedef struct { typedef struct { uint32 var_0; uint32 var_4; - uint8 pad_8[0x114]; + uint32 var_8; + uint8 pad_C[0x104]; + uint32 var_110; + uint32 var_114; + uint32 var_118; HGLOBAL hmem; // 0x11C HMMIO hmmio; // 0x120 - uint32 var_124; - uint32 var_128; - uint32 var_12C; - uint32 var_130; - uint8 pad_134[0x18]; + MMCKINFO mmckinfo1; // 0x124 + MMCKINFO mmckinfo2; // 0x138 LPDIRECTSOUNDBUFFER dsbuffer; // 0x14C uint32 var_150; uint32 playpos; // 0x154 From f0ce2dcb1a519fe434043fc6f4225131efc14b4f Mon Sep 17 00:00:00 2001 From: zsilencer Date: Thu, 28 Aug 2014 22:02:05 -0600 Subject: [PATCH 06/10] test --- src/audio.c | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/src/audio.c b/src/audio.c index b5d7adf004..0b89bc68d3 100644 --- a/src/audio.c +++ b/src/audio.c @@ -193,9 +193,9 @@ int sound_load3dparameters() */ int sound_load3dposition() { - if (SUCCEEDED(RCT2_GLOBAL(0x009E2BA4, LPDIRECTSOUND3DBUFFER)->lpVtbl->GetPosition(RCT2_GLOBAL(0x009E2BA4, LPDIRECTSOUND3DBUFFER), &RCT2_GLOBAL(0x009A6084, DS3DBUFFER), 1))) { + /*if (SUCCEEDED(RCT2_GLOBAL(0x009E2BA4, LPDIRECTSOUND3DBUFFER)->lpVtbl->GetPosition(RCT2_GLOBAL(0x009E2BA4, LPDIRECTSOUND3DBUFFER), &RCT2_GLOBAL(0x009A6084, DS3DBUFFER), 1))) { return 1; - } + }*/ return 0; } @@ -354,7 +354,7 @@ int map_sound_info(const char* filename) * * rct2: 0x00405383 */ -MMRESULT sub_405383(HMMIO hmmio, uint32 size, char* buffer, uint32* a4, int* read) +MMRESULT sub_405383(HMMIO hmmio, uint32 size, char* buffer, LPMMCKINFO a4, int* read) { MMIOINFO mmioinfo; MMRESULT result; @@ -364,11 +364,11 @@ MMRESULT sub_405383(HMMIO hmmio, uint32 size, char* buffer, uint32* a4, int* rea return 1; } int size2 = size; - if (size > a4[1]) { - size2 = a4[1]; + if (size > a4->cksize) { + size2 = a4->cksize; } int v8 = 0; - a4[1] -= size2; + a4->cksize -= size2; if (size2) { while (1) { HPSTR p = mmioinfo.pchEndRead; @@ -418,12 +418,12 @@ MMRESULT sub_405383(HMMIO hmmio, uint32 size, char* buffer, uint32* a4, int* rea * * rct2: 0x00401822 */ -int sub_401822(int channel, HMMIO hmmio, LONG offset) +int sub_401822(int channel, HMMIO* hmmio, LONG offset) { rct_sound_channel* sound_channel = &RCT2_ADDRESS(0x014262E0, rct_sound_channel)[channel]; LPMMCKINFO v4 = &sound_channel->mmckinfo2; HMMIO* v5 = &sound_channel->hmmio; - if (RCT2_CALLFUNC_4(0x00405222, int, HMMIO, HMMIO*, HGLOBAL*, LPMMCKINFO, hmmio, &sound_channel->hmmio, &sound_channel->hmem, &sound_channel->mmckinfo2)) { + if (RCT2_CALLFUNC_4(0x00405222, int, HMMIO*, HMMIO*, HGLOBAL*, LPMMCKINFO, hmmio, &sound_channel->hmmio, &sound_channel->hmem, &sound_channel->mmckinfo2)) { return -100; } if (*(uint16*)sound_channel->hmem != 1) { @@ -447,9 +447,9 @@ int sub_40153B(int channel) rct_sound_channel* sound_channel = &RCT2_ADDRESS(0x014262E0, rct_sound_channel)[channel]; if (sound_channel->var_4) { if (sound_channel->hmmio) { - sound_channel_free(sound_channel->hmmio, sound_channel->hmem); + sound_channel_free(&sound_channel->hmmio, &sound_channel->hmem); } - if (sub_401822(channel, &sound_channel->var_8, sound_channel->var_110)) { + if (sub_401822(channel, (HMMIO*)&sound_channel->var_8, sound_channel->var_110)) { return 0; } sound_channel->var_164 = sound_channel->var_114; @@ -475,7 +475,7 @@ void sub_401000(UINT uTimerID, UINT uMsg, DWORD_PTR dwUser, DWORD_PTR dw1, DWORD DWORD status; DWORD dwCurrentPlayCursor; DWORD dwCurrentWriteCursor; - int var1; + uint32 var1; int var2; int bufferlost = 0; char* buf1; @@ -522,15 +522,15 @@ void sub_401000(UINT uTimerID, UINT uMsg, DWORD_PTR dwUser, DWORD_PTR dw1, DWORD } sound_channel->var_158 += var1; if (sound_channel->var_168) { - int var3 = sound_channel->var_15C; - int* var4 = &sound_channel->var_15C; + uint32 var3 = sound_channel->var_15C; + uint32* var4 = &sound_channel->var_15C; if (var3) { if (var1 <= var3) { *var4 = var3 - var1; } else { *var4 = 0; } - if (SUCCEEDED(sound_channel->dsbuffer->lpVtbl->Lock(sound_channel->dsbuffer, sound_channel->playpos, var2, (LPVOID*)&buf1, (LPDWORD)&buf1size, (LPVOID*)&buf2, &buf2size, 0))) { + if (SUCCEEDED(sound_channel->dsbuffer->lpVtbl->Lock(sound_channel->dsbuffer, sound_channel->playpos, var2, (LPVOID*)&buf1, (LPDWORD)&buf1size, (LPVOID*)&buf2, (LPDWORD)&buf2size, 0))) { uint16 var5 = -(sound_channel->mmckinfo1.cksize != 8); var5 &= 0x80; memset(buf1, var5 + 128, buf1size); From a2324a278dc5eeef81d70d0ea9984dabf08a00be Mon Sep 17 00:00:00 2001 From: Jackson Davis Date: Thu, 28 Aug 2014 15:11:28 +0100 Subject: [PATCH 07/10] First pass at 0x407074 (mouse read) --- src/input.c | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/src/input.c b/src/input.c index 1d10cc4e05..55cf373728 100644 --- a/src/input.c +++ b/src/input.c @@ -43,6 +43,7 @@ static void input_mouseover_widget_flatbutton_invalidate(); void process_mouse_over(int x, int y); void sub_6ED801(int x, int y); void invalidate_scroll(); +static void* sub_407074(); #pragma region Scroll bar input @@ -1557,9 +1558,8 @@ void game_handle_input() */ static void game_get_next_input(int *x, int *y, int *state) { - int eax, ebx, ecx, edx, esi, edi, ebp; - RCT2_CALLFUNC_X(0x00407074, &eax, &ebx, &ecx, &edx, &esi, &edi, &ebp); - if (eax == 0) { + void* eax = sub_407074(); //RCT2_CALLFUNC_X(0x00407074, &eax, &ebx, &ecx, &edx, &esi, &edi, &ebp); + if (eax == NULL) { *x = gCursorState.x; *y = gCursorState.y; *state = 0; @@ -1762,4 +1762,19 @@ void invalidate_scroll() wind->scrolls[scroll_id / sizeof(rct_scroll)].flags &= 0xFF11; window_invalidate_by_id(RCT2_GLOBAL(RCT2_ADDRESS_CURSOR_DOWN_WINDOWCLASS, uint8), RCT2_GLOBAL(RCT2_ADDRESS_CURSOR_DOWN_WINDOWNUMBER, uint16)); -} \ No newline at end of file +} + +static void* sub_407074() +{ + int ecx = RCT2_GLOBAL(0x009E2DE8, uint32); + if (ecx != RCT2_GLOBAL(0x009E2DE4, uint32)) { + int eax = ecx + ecx*2; + ecx++; + ecx &= 0x3F; + eax = 0x1424340 + eax*4; + RCT2_GLOBAL(0x009E2DE8, uint32) = ecx; + return (void*)eax; + } else { + return NULL; + } +} From 57a2bc02febdc58055792cc7c415c08e8d65026f Mon Sep 17 00:00:00 2001 From: Jackson Davis Date: Fri, 29 Aug 2014 08:45:10 +0100 Subject: [PATCH 08/10] Add structs/addresses for mouse buffer functions --- src/addresses.h | 3 ++- src/input.c | 27 +++++++++++++-------------- src/osinterface.c | 39 ++++++++++++++++++--------------------- src/osinterface.h | 6 ++++++ 4 files changed, 39 insertions(+), 36 deletions(-) diff --git a/src/addresses.h b/src/addresses.h index 80ef4cbe20..589dc5e69e 100644 --- a/src/addresses.h +++ b/src/addresses.h @@ -169,7 +169,8 @@ #define RCT2_ADDRESS_DSOUND_DEVICES_COUNTER 0x009E2BAC #define RCT2_ADDRESS_CMDLINE 0x009E2D98 - +#define RCT2_ADDRESS_MOUSE_READ_INDEX 0x009E2DE8 +#define RCT2_ADDRESS_MOUSE_WRITE_INDEX 0x009E2DE4 #define RCT2_ADDRESS_LAND_RAISE_COST 0x009E2E1C #define RCT2_ADDRESS_LAND_LOWER_COST 0x009E2E20 #define RCT2_ADDRESS_SELECTED_TERRAIN_EDGE 0x009E2E24 diff --git a/src/input.c b/src/input.c index 55cf373728..85e1102131 100644 --- a/src/input.c +++ b/src/input.c @@ -43,7 +43,7 @@ static void input_mouseover_widget_flatbutton_invalidate(); void process_mouse_over(int x, int y); void sub_6ED801(int x, int y); void invalidate_scroll(); -static void* sub_407074(); +static openrct2_mouse_data* get_mouse_input(); #pragma region Scroll bar input @@ -1558,7 +1558,7 @@ void game_handle_input() */ static void game_get_next_input(int *x, int *y, int *state) { - void* eax = sub_407074(); //RCT2_CALLFUNC_X(0x00407074, &eax, &ebx, &ecx, &edx, &esi, &edi, &ebp); + openrct2_mouse_data* eax = get_mouse_input(); if (eax == NULL) { *x = gCursorState.x; *y = gCursorState.y; @@ -1566,9 +1566,9 @@ static void game_get_next_input(int *x, int *y, int *state) return; } - *x = RCT2_GLOBAL(eax + 0, sint32); - *y = RCT2_GLOBAL(eax + 4, sint32); - *state = RCT2_GLOBAL(eax + 8, sint32); + *x = eax->x; + *y = eax->y; + *state = eax->state; //int eax, ebx, ecx, edx, esi, edi, ebp; //RCT2_CALLFUNC_X(0x006E83C7, &eax, &ebx, &ecx, &edx, &esi, &edi, &ebp); @@ -1764,16 +1764,15 @@ void invalidate_scroll() window_invalidate_by_id(RCT2_GLOBAL(RCT2_ADDRESS_CURSOR_DOWN_WINDOWCLASS, uint8), RCT2_GLOBAL(RCT2_ADDRESS_CURSOR_DOWN_WINDOWNUMBER, uint16)); } -static void* sub_407074() +/** + * rct2: 0x00407074 + */ +static openrct2_mouse_data* get_mouse_input() { - int ecx = RCT2_GLOBAL(0x009E2DE8, uint32); - if (ecx != RCT2_GLOBAL(0x009E2DE4, uint32)) { - int eax = ecx + ecx*2; - ecx++; - ecx &= 0x3F; - eax = 0x1424340 + eax*4; - RCT2_GLOBAL(0x009E2DE8, uint32) = ecx; - return (void*)eax; + int read_index = RCT2_GLOBAL(RCT2_ADDRESS_MOUSE_READ_INDEX, uint32); + if (read_index != RCT2_GLOBAL(RCT2_ADDRESS_MOUSE_WRITE_INDEX, uint32)) { + RCT2_GLOBAL(RCT2_ADDRESS_MOUSE_READ_INDEX, uint32) = (read_index + 1) & 0x3F; + return &mouse_buffer[read_index]; } else { return NULL; } diff --git a/src/osinterface.c b/src/osinterface.c index 9213603e7d..73a7b25e6b 100644 --- a/src/osinterface.c +++ b/src/osinterface.c @@ -40,11 +40,12 @@ openrct2_cursor gCursorState; const unsigned char *gKeysState; unsigned char *gKeysPressed; unsigned int gLastKeyPressed; +openrct2_mouse_data* mouse_buffer = (openrct2_mouse_data*)0x1424340; static void osinterface_create_window(); static void osinterface_close_window(); static void osinterface_resize(int width, int height); -static void sub_406C96(int actionType); +static void store_mouse_input(int state); static SDL_Window *_window; static SDL_Surface *_surface; @@ -350,7 +351,7 @@ void osinterface_process_messages() RCT2_GLOBAL(0x0142431C, int) = e.button.y; switch (e.button.button) { case SDL_BUTTON_LEFT: - sub_406C96(1); //RCT2_CALLPROC_1(0x00406C96, int, 1); + store_mouse_input(1); gCursorState.left = CURSOR_PRESSED; gCursorState.old = 1; break; @@ -358,7 +359,7 @@ void osinterface_process_messages() gCursorState.middle = CURSOR_PRESSED; break; case SDL_BUTTON_RIGHT: - sub_406C96(3); //RCT2_CALLPROC_1(0x00406C96, int, 3); + store_mouse_input(3); gCursorState.right = CURSOR_PRESSED; gCursorState.old = 2; break; @@ -369,7 +370,7 @@ void osinterface_process_messages() RCT2_GLOBAL(0x0142431C, int) = e.button.y; switch (e.button.button) { case SDL_BUTTON_LEFT: - sub_406C96(2); //RCT2_CALLPROC_1(0x00406C96, int, 2); + store_mouse_input(2); gCursorState.left = CURSOR_RELEASED; gCursorState.old = 3; break; @@ -377,7 +378,7 @@ void osinterface_process_messages() gCursorState.middle = CURSOR_RELEASED; break; case SDL_BUTTON_RIGHT: - sub_406C96(4); //RCT2_CALLPROC_1(0x00406C96, int, 4); + store_mouse_input(4); gCursorState.right = CURSOR_RELEASED; gCursorState.old = 4; break; @@ -599,22 +600,18 @@ char osinterface_get_path_separator() return '\\'; } -void sub_406C96(int actionType) +/** + * rct2: 0x00406C96 + */ +static void store_mouse_input(int state) { - int eax = RCT2_GLOBAL(0x009E2DE4, uint32); - int ecx = eax + 1; - ecx &= 0x3F; //Array of 64 point structs, loop around buffer? - if (ecx != RCT2_GLOBAL(0x009E2DE8, uint32)) { - int edx = RCT2_GLOBAL(0x01424318, uint32); // X - //eax is a struct index here. Mutliplied by then and then 4 for the struct with 3 4 byte fields - //Struct is {int x, int y, int actionType} - eax = eax + eax*2; - eax = 0x01424340 + eax * 4; //get base of struct, address is base of array - *((uint32*)eax) = edx; - edx = RCT2_GLOBAL(0x0142431C, uint32); // Y - *((uint32*)eax + 1) = edx; - edx = actionType; - *((uint32*)eax + 2) = edx; - RCT2_GLOBAL(0x009E2DE4, uint32) = ecx; + int write_index = RCT2_GLOBAL(RCT2_ADDRESS_MOUSE_WRITE_INDEX, uint32); + int next_write_index = (write_index + 1) & 0x3F; //64 length buffer + + if (next_write_index != RCT2_GLOBAL(RCT2_ADDRESS_MOUSE_READ_INDEX, uint32)) { + mouse_buffer[write_index].x = RCT2_GLOBAL(0x01424318, uint32); + mouse_buffer[write_index].y = RCT2_GLOBAL(0x0142431C, uint32); + mouse_buffer[write_index].state = state; + RCT2_GLOBAL(RCT2_ADDRESS_MOUSE_WRITE_INDEX, uint32) = next_write_index; } } diff --git a/src/osinterface.h b/src/osinterface.h index 6d2cade7aa..75fc3b19f1 100644 --- a/src/osinterface.h +++ b/src/osinterface.h @@ -66,6 +66,12 @@ typedef struct { int old; } openrct2_cursor; +typedef struct { + int x, y; + int state; //0 = ? 1 = LeftDown 2 = LeftUp 3 = RightDown 4 = RightUp +} openrct2_mouse_data; + +extern openrct2_mouse_data* mouse_buffer; extern openrct2_cursor gCursorState; extern const unsigned char *gKeysState; extern unsigned char *gKeysPressed; From f5841c24f4a02e22eb89aa91a2117713edc60c30 Mon Sep 17 00:00:00 2001 From: adrian17 Date: Fri, 29 Aug 2014 10:23:57 +0200 Subject: [PATCH 09/10] Move input functions and add an address --- src/addresses.h | 8 ++++++-- src/input.c | 47 ++++++++++++++++++++++++++++++++++++++--------- src/input.h | 2 ++ src/osinterface.c | 21 ++------------------- src/osinterface.h | 6 ------ 5 files changed, 48 insertions(+), 36 deletions(-) diff --git a/src/addresses.h b/src/addresses.h index 589dc5e69e..d46574cc45 100644 --- a/src/addresses.h +++ b/src/addresses.h @@ -169,8 +169,10 @@ #define RCT2_ADDRESS_DSOUND_DEVICES_COUNTER 0x009E2BAC #define RCT2_ADDRESS_CMDLINE 0x009E2D98 -#define RCT2_ADDRESS_MOUSE_READ_INDEX 0x009E2DE8 -#define RCT2_ADDRESS_MOUSE_WRITE_INDEX 0x009E2DE4 + +#define RCT2_ADDRESS_MOUSE_READ_INDEX 0x009E2DE8 +#define RCT2_ADDRESS_MOUSE_WRITE_INDEX 0x009E2DE4 + #define RCT2_ADDRESS_LAND_RAISE_COST 0x009E2E1C #define RCT2_ADDRESS_LAND_LOWER_COST 0x009E2E20 #define RCT2_ADDRESS_SELECTED_TERRAIN_EDGE 0x009E2E24 @@ -406,6 +408,8 @@ #define RCT2_ADDRESS_SCREEN_CAP_BPP 0x01423C10 #define RCT2_ADDRESS_SCREEN_CAP_RASTER_STRETCH 0x01423C14 +#define RCT2_ADDRESS_INPUT_QUEUE 0x01424340 + static void RCT2_CALLPROC_EBPSAFE(int address) { #ifdef _MSC_VER diff --git a/src/input.c b/src/input.c index 85e1102131..38d75468f8 100644 --- a/src/input.c +++ b/src/input.c @@ -36,6 +36,13 @@ POINT _dragPosition; +typedef struct { + uint32 x, y; + uint32 state; //1 = LeftDown 2 = LeftUp 3 = RightDown 4 = RightUp +} rct_mouse_data; + +rct_mouse_data* mouse_buffer = RCT2_ADDRESS(RCT2_ADDRESS_INPUT_QUEUE, rct_mouse_data); + static void game_get_next_input(int *x, int *y, int *state); static void input_mouseover(int x, int y, rct_window *w, int widgetIndex); static void input_mouseover_widget_check(rct_windowclass windowClass, rct_windownumber windowNumber, int widgetIndex); @@ -43,7 +50,7 @@ static void input_mouseover_widget_flatbutton_invalidate(); void process_mouse_over(int x, int y); void sub_6ED801(int x, int y); void invalidate_scroll(); -static openrct2_mouse_data* get_mouse_input(); +static rct_mouse_data* get_mouse_input(); #pragma region Scroll bar input @@ -1558,7 +1565,7 @@ void game_handle_input() */ static void game_get_next_input(int *x, int *y, int *state) { - openrct2_mouse_data* eax = get_mouse_input(); + rct_mouse_data* eax = get_mouse_input(); if (eax == NULL) { *x = gCursorState.x; *y = gCursorState.y; @@ -1764,16 +1771,38 @@ void invalidate_scroll() window_invalidate_by_id(RCT2_GLOBAL(RCT2_ADDRESS_CURSOR_DOWN_WINDOWCLASS, uint8), RCT2_GLOBAL(RCT2_ADDRESS_CURSOR_DOWN_WINDOWNUMBER, uint16)); } +/** +* rct2: 0x00406C96 +*/ +void store_mouse_input(int state) +{ + uint32 write_index = RCT2_GLOBAL(RCT2_ADDRESS_MOUSE_WRITE_INDEX, uint32); + uint32 next_write_index = (write_index + 1) % 64; + + // check if the queue is full + if (next_write_index == RCT2_GLOBAL(RCT2_ADDRESS_MOUSE_READ_INDEX, uint32)) + return; + + rct_mouse_data* item = &mouse_buffer[write_index]; + item->x = RCT2_GLOBAL(0x01424318, uint32); + item->y = RCT2_GLOBAL(0x0142431C, uint32); + item->state = state; + + RCT2_GLOBAL(RCT2_ADDRESS_MOUSE_WRITE_INDEX, uint32) = next_write_index; +} + + /** * rct2: 0x00407074 */ -static openrct2_mouse_data* get_mouse_input() +static rct_mouse_data* get_mouse_input() { - int read_index = RCT2_GLOBAL(RCT2_ADDRESS_MOUSE_READ_INDEX, uint32); - if (read_index != RCT2_GLOBAL(RCT2_ADDRESS_MOUSE_WRITE_INDEX, uint32)) { - RCT2_GLOBAL(RCT2_ADDRESS_MOUSE_READ_INDEX, uint32) = (read_index + 1) & 0x3F; - return &mouse_buffer[read_index]; - } else { + uint32 read_index = RCT2_GLOBAL(RCT2_ADDRESS_MOUSE_READ_INDEX, uint32); + + // check if that location has been written to yet + if (read_index == RCT2_GLOBAL(RCT2_ADDRESS_MOUSE_WRITE_INDEX, uint32)) return NULL; - } + + RCT2_GLOBAL(RCT2_ADDRESS_MOUSE_READ_INDEX, uint32) = (read_index + 1) % 64; + return &mouse_buffer[read_index]; } diff --git a/src/input.h b/src/input.h index a7a1d8ebb6..dd1cc5b3fb 100644 --- a/src/input.h +++ b/src/input.h @@ -24,4 +24,6 @@ void game_handle_input(); void game_handle_keyboard_input(); +void store_mouse_input(int state); + #endif \ No newline at end of file diff --git a/src/osinterface.c b/src/osinterface.c index 73a7b25e6b..fd6aef4b17 100644 --- a/src/osinterface.c +++ b/src/osinterface.c @@ -28,6 +28,7 @@ #include "addresses.h" #include "config.h" #include "gfx.h" +#include "input.h" #include "osinterface.h" #include "screenshot.h" #include "window.h" @@ -40,12 +41,10 @@ openrct2_cursor gCursorState; const unsigned char *gKeysState; unsigned char *gKeysPressed; unsigned int gLastKeyPressed; -openrct2_mouse_data* mouse_buffer = (openrct2_mouse_data*)0x1424340; static void osinterface_create_window(); static void osinterface_close_window(); static void osinterface_resize(int width, int height); -static void store_mouse_input(int state); static SDL_Window *_window; static SDL_Surface *_surface; @@ -598,20 +597,4 @@ int osinterface_ensure_directory_exists(const char *path) char osinterface_get_path_separator() { return '\\'; -} - -/** - * rct2: 0x00406C96 - */ -static void store_mouse_input(int state) -{ - int write_index = RCT2_GLOBAL(RCT2_ADDRESS_MOUSE_WRITE_INDEX, uint32); - int next_write_index = (write_index + 1) & 0x3F; //64 length buffer - - if (next_write_index != RCT2_GLOBAL(RCT2_ADDRESS_MOUSE_READ_INDEX, uint32)) { - mouse_buffer[write_index].x = RCT2_GLOBAL(0x01424318, uint32); - mouse_buffer[write_index].y = RCT2_GLOBAL(0x0142431C, uint32); - mouse_buffer[write_index].state = state; - RCT2_GLOBAL(RCT2_ADDRESS_MOUSE_WRITE_INDEX, uint32) = next_write_index; - } -} +} \ No newline at end of file diff --git a/src/osinterface.h b/src/osinterface.h index 75fc3b19f1..6d2cade7aa 100644 --- a/src/osinterface.h +++ b/src/osinterface.h @@ -66,12 +66,6 @@ typedef struct { int old; } openrct2_cursor; -typedef struct { - int x, y; - int state; //0 = ? 1 = LeftDown 2 = LeftUp 3 = RightDown 4 = RightUp -} openrct2_mouse_data; - -extern openrct2_mouse_data* mouse_buffer; extern openrct2_cursor gCursorState; extern const unsigned char *gKeysState; extern unsigned char *gKeysPressed; From 6473da43b27ea0c87c3a2d0fb45855ddeb9a8c6f Mon Sep 17 00:00:00 2001 From: adrian17 Date: Fri, 29 Aug 2014 11:37:32 +0200 Subject: [PATCH 10/10] Decompiled game_command_set_park_entrance_fee --- src/game.c | 3 ++- src/park.c | 36 ++++++++++++++++++++++++++++++++++++ src/park.h | 2 ++ 3 files changed, 40 insertions(+), 1 deletion(-) diff --git a/src/game.c b/src/game.c index f67b6f9279..30f4df92b1 100644 --- a/src/game.c +++ b/src/game.c @@ -29,6 +29,7 @@ #include "news_item.h" #include "object.h" #include "osinterface.h" +#include "park.h" #include "peep.h" #include "sawyercoding.h" #include "scenario.h" @@ -942,7 +943,7 @@ static uint32 game_do_command_table[58] = { 0x006666E7, 0x00666A63, 0x006CD8CE, - 0x00669E30, + (uint32)game_command_set_park_entrance_fee, (uint32)game_command_update_staff_colour, // 40 0x006E519A, 0x006E5597, diff --git a/src/park.c b/src/park.c index 159017c392..da3731efc9 100644 --- a/src/park.c +++ b/src/park.c @@ -581,4 +581,40 @@ uint8 calculate_guest_initial_happiness(uint8 percentage) { void park_update_histories() { RCT2_CALLPROC_EBPSAFE(0x0066A231); +} + +/** +* +* rct2: 0x00669E30 +*/ +void game_command_set_park_entrance_fee() +{ + uint8 _bl; + uint16 new_fee; + + #ifdef _MSC_VER + __asm mov _bl, bl + #else + __asm__("mov %[_bl], bl " : [_bl] "+m" (_bl)); + #endif + + #ifdef _MSC_VER + __asm mov new_fee, di + #else + __asm__("mov %[new_fee], di " : [new_fee] "+m" (new_fee)); + #endif + + RCT2_GLOBAL(0x0141F56C, uint8) = 0x10; + + if (_bl & 1){ + RCT2_GLOBAL(RCT2_ADDRESS_PARK_ENTRANCE_FEE, uint16) = new_fee; + + window_invalidate_by_id(WC_PARK_INFORMATION, 0); + } + + #ifdef _MSC_VER + __asm mov ebx, 0 + #else + __asm__("mov ebx, 0 "); + #endif } \ No newline at end of file diff --git a/src/park.h b/src/park.h index bb7d823e86..5c9a85171a 100644 --- a/src/park.h +++ b/src/park.h @@ -59,4 +59,6 @@ void park_update_histories(); uint8 calculate_guest_initial_happiness(uint8 percentage); +void game_command_set_park_entrance_fee(); + #endif