From ab608ee0efc4e1072e2f77acfcc429788a06e1b2 Mon Sep 17 00:00:00 2001 From: RD42 <42702181+dashr9230@users.noreply.github.com> Date: Mon, 26 Feb 2024 23:40:36 +0800 Subject: [PATCH] [saco] Implement CAudio class member functions Implements: * `CAudio::GetRadioStation()` * `CAudio::StartRadio(...)` * `CAudio::GetRadioVolume()` * `CAudio::StopOutdoorAmbienceTrack()` * `CAudio::SetOutdoorAmbienceTrack(...)` * `CAudio::PlaySound(...)` * `CAudio::IsOutdoorAmbienceTrackDisabled()` --- saco/game/audio.cpp | 90 ++++++++++++++++++++++++++++++++++++------- saco/game/audio.h | 15 ++++---- saco/game/scripting.h | 8 +++- 3 files changed, 90 insertions(+), 23 deletions(-) diff --git a/saco/game/audio.cpp b/saco/game/audio.cpp index d3274eb..5c69921 100644 --- a/saco/game/audio.cpp +++ b/saco/game/audio.cpp @@ -1,36 +1,98 @@ + #include "audio.h" -void CAudio::GetRadioStation() +//----------------------------------------------------------- + +int CAudio::GetRadioStation() { - // TODO: CAudio::sub_100A2210 100A2210 + int iRadioStation = 0; + + _asm mov ecx, 0x8CB6F8 + _asm xor eax, eax + _asm mov al, [ecx+233] + _asm mov iRadioStation, eax + + if(iRadioStation <= 12) return iRadioStation; + + return -1; } -void CAudio::StartRadio() +//----------------------------------------------------------- + +void CAudio::StartRadio(int iStation) { - // TODO: CAudio::sub_100A2240 100A2240 + _asm push 0 + _asm push iStation + _asm mov ecx, 0xB6BC90 + _asm mov edx, 0x507DC0 + _asm call edx } -void CAudio::GetRadioVolume() +//----------------------------------------------------------- + +float CAudio::GetRadioVolume() { - // TODO: CAudio::sub_100A2280 100A2280 + return *(float*)0xB5FCC8; } +//----------------------------------------------------------- + void CAudio::StopOutdoorAmbienceTrack() { - // TODO: CAudio::sub_100A2290 100A2290 + _asm mov ecx, 0x8AC15C + _asm mov edx, 0x4D6D60 + _asm call edx } -void CAudio::SetOutdoorAmbienceTrack() +//----------------------------------------------------------- + +void CAudio::SetOutdoorAmbienceTrack(int iTrack) { - // TODO: CAudio::sub_100A22A0 100A22A0 + _asm push iTrack + _asm mov ecx, 0x8AC15C + _asm mov edx, 0x4D6D50 + _asm call edx } -void CAudio::Play() +//----------------------------------------------------------- + +void CAudio::PlaySound(int iSound, float fX, float fY, float fZ) { - // TODO: CAudio::sub_100A22C0 100A22C0 + if(iSound == 0) + { + if(field_0) { + ScriptCommand(&unload_wav, 1); + field_0 = iSound; + } + StopOutdoorAmbienceTrack(); + field_4 = false; + } + else if(iSound == 1) + { + field_4 = true; + } + else if(iSound < 1000) + { + SetOutdoorAmbienceTrack(iSound); + } + else if(iSound < 2000) + { + ScriptCommand(&unload_wav, 1); + ScriptCommand(&load_wav, 1, iSound); + ScriptCommand(&set_wav_at_location, 1, fX, fY, fZ); + field_0 = 1; + } + else + { + ScriptCommand(&play_sound, fX, fY, fZ, iSound); + } } -void CAudio::IsOutdoorAmbienceTrackDisabled() +//----------------------------------------------------------- + +bool CAudio::IsOutdoorAmbienceTrackDisabled() { - // TODO: CAudio::sub_100A23A0 100A23A0 -} \ No newline at end of file + return field_4; +} + +//----------------------------------------------------------- diff --git a/saco/game/audio.h b/saco/game/audio.h index 4c2558d..7882215 100644 --- a/saco/game/audio.h +++ b/saco/game/audio.h @@ -8,16 +8,15 @@ public: char field_4; CAudio() { - // TODO: CAudio::CAudio() field_0 = 0; field_4 = 0; - } + }; - void GetRadioStation(); - void StartRadio(); - void GetRadioVolume(); + int GetRadioStation(); + void StartRadio(int iStation); + float GetRadioVolume(); void StopOutdoorAmbienceTrack(); - void SetOutdoorAmbienceTrack(); - void Play(); - void IsOutdoorAmbienceTrackDisabled(); + void SetOutdoorAmbienceTrack(int iTrack); + void PlaySound(int iSound, float fX, float fY, float fZ); + bool IsOutdoorAmbienceTrackDisabled(); }; diff --git a/saco/game/scripting.h b/saco/game/scripting.h index 40129bc..cb90e71 100644 --- a/saco/game/scripting.h +++ b/saco/game/scripting.h @@ -39,6 +39,8 @@ const SCRIPT_COMMAND create_icon_marker_sphere = { 0x02A7, "fffiv" }; const SCRIPT_COMMAND set_actor_can_be_decapitated = { 0x0446, "ii" }; +const SCRIPT_COMMAND play_sound = { 0x018c, "fffi" }; + const SCRIPT_COMMAND enable_train_traffic = { 0x06d7, "i" }; const SCRIPT_COMMAND refresh_streaming_at = { 0x04E4, "ff" }; @@ -60,7 +62,11 @@ const SCRIPT_COMMAND lock_camera_position = { 0x930, "i" }; const SCRIPT_COMMAND create_marker_at = { 0x2A8, "fffiv" }; - +const SCRIPT_COMMAND load_wav = { 0x3CF, "ii" }; +const SCRIPT_COMMAND is_wav_loaded = { 0x3D0, "i" }; +const SCRIPT_COMMAND play_wav = { 0x3D1, "i" }; +const SCRIPT_COMMAND unload_wav = { 0x40D, "i" }; +const SCRIPT_COMMAND set_wav_at_location = { 0x3D7, "ifff" };