diff --git a/include/JSystem/JFramework/JFWDisplay.h b/include/JSystem/JFramework/JFWDisplay.h index 1afbf118d..bf4a609a1 100644 --- a/include/JSystem/JFramework/JFWDisplay.h +++ b/include/JSystem/JFramework/JFWDisplay.h @@ -89,6 +89,16 @@ class JFWDisplay { JUTFader * getFader() { return mpFader; } void setClearColor(JUtility::TColor color) { mClearColor = color; } + u16 getFrameRate() const { return mFrameRate; } + void setFrameRate(u16 framerate) { + mFrameRate = framerate; + mTickRate = 0; + } + + void getEfbHeight() const {} + void getEfbWidth() const {} + void getXfbManager() const {} + static JFWDisplay* sManager; private: diff --git a/include/d/actor/d_a_movie_player.h b/include/d/actor/d_a_movie_player.h index c627f342d..99ca93ea5 100644 --- a/include/d/actor/d_a_movie_player.h +++ b/include/d/actor/d_a_movie_player.h @@ -3,18 +3,19 @@ #include "f_op/f_op_actor.h" #include "d/d_drawlist.h" +#include "dolphin/dvd/dvd.h" class daMP_c : public fopAc_ac_c { public: - void daMP_c_Get_arg_data(); - void daMP_c_Init(); - void daMP_c_Finish(); - void daMP_c_Main(); - void daMP_c_Draw(); + u32 daMP_c_Get_arg_data(); + int daMP_c_Init(); + BOOL daMP_c_Finish(); + BOOL daMP_c_Main(); + BOOL daMP_c_Draw(); static int daMP_c_Callback_Init(fopAc_ac_c*); - static int daMP_c_Callback_Finish(daMP_c*); - static int daMP_c_Callback_Main(daMP_c*); - static int daMP_c_Callback_Draw(daMP_c*); + static BOOL daMP_c_Callback_Finish(daMP_c*); + static BOOL daMP_c_Callback_Main(daMP_c*); + static BOOL daMP_c_Callback_Draw(daMP_c*); public: /* 0x290 */ u32 (*mpCallBack1)(); @@ -26,15 +27,38 @@ class daMP_Dlst_base_c : public dDlst_base_c { }; struct daMP_THPReadBuffer { - + /* 0x00 */ void* m00; + /* 0x04 */ s32 m04; +}; + +struct daMP_Player_c { // Fake name + /* 0x00 */ DVDFileInfo mFileInfo; + /* 0x3C */ u8 m3C[0x50 - 0x3C]; + /* 0x50 */ u32 m50; + /* 0x54 */ u8 m54[0x64 - 0x54]; + /* 0x64 */ s32 m64; + /* 0x68 */ u8 m68[0xA6 - 0x68]; + /* 0xA6 */ u8 mA6; + /* 0xA7 */ u8 mA7[0xA8 - 0xA7]; + /* 0xA8 */ s32 mA8; + /* 0xAC */ u8 mAC[0xB8 - 0xAC]; + /* 0xB8 */ s32 mB8; + /* 0xBC */ s32 mBC; + /* 0xC0 */ s32 mC0; }; struct THPVideoInfo { - + /* 0x00 */ u8 m00[0x0C - 0x00]; }; struct THPAudioInfo { - + /* 0x00 */ u8 m00[0x10 - 0x00]; }; +inline s32 daMP_NEXT_READ_SIZE(daMP_THPReadBuffer* readBuf) { + return *(s32*)readBuf->m00; +} + +void daMP_PrepareReady(int); + #endif /* D_A_MOVIE_PLAYER_H */ diff --git a/include/dolphin/dvd/dvd.h b/include/dolphin/dvd/dvd.h index e3b05cc54..2ebfd1a36 100644 --- a/include/dolphin/dvd/dvd.h +++ b/include/dolphin/dvd/dvd.h @@ -115,7 +115,7 @@ typedef void (*DVDOptionalCommandChecker)(DVDCommandBlock* block, void (*cb)(u32 void DVDInit(void); BOOL DVDOpen(const char* filename, DVDFileInfo* fileinfo); BOOL DVDClose(DVDFileInfo* fileinfo); -BOOL DVDReadPrio(DVDFileInfo* fileinfo, void*, s32, s32, s32); +int DVDReadPrio(DVDFileInfo* fileinfo, void*, s32, s32, s32); DVDDiskID* DVDGetCurrentDiskID(void); BOOL DVDFastOpen(long, DVDFileInfo* fileinfo); s32 DVDGetCommandBlockStatus(const DVDCommandBlock* block); diff --git a/include/f_op/f_op_actor_mng.h b/include/f_op/f_op_actor_mng.h index 411c0dcc5..1ccc51c4d 100644 --- a/include/f_op/f_op_actor_mng.h +++ b/include/f_op/f_op_actor_mng.h @@ -191,7 +191,7 @@ inline csXyz* fopAcM_GetShapeAngle_p(fopAc_ac_c* pActor) { return &pActor->shape_angle; } -inline bool fopAcM_CheckCondition(fopAc_ac_c* p_actor, u32 flag) { +inline u32 fopAcM_CheckCondition(fopAc_ac_c* p_actor, u32 flag) { return p_actor->actor_condition & flag; } diff --git a/include/m_Do/m_Do_graphic.h b/include/m_Do/m_Do_graphic.h index e5f38bfdb..2b43ae03c 100644 --- a/include/m_Do/m_Do_graphic.h +++ b/include/m_Do/m_Do_graphic.h @@ -21,7 +21,6 @@ class mDoGph_gInf_c { static void onMonotone(); static void offMonotone(); static void calcMonotone(); - static void getFrameRate(); static void setFader(JUTFader* fader) { JFWDisplay::getManager()->setFader(fader); @@ -58,6 +57,8 @@ class mDoGph_gInf_c { static GXTexObj* getZbufferTexObj() { return &mZbufferTexObj; } static GXTexObj* getFrameBufferTexObj() { return &mFrameBufferTexObj; } static void fadeIn(f32 rate, GXColor& color) { fadeOut(-rate, color); } + static u16 getFrameRate() { return JFWDisplay::getManager()->getFrameRate(); } + static void setFrameRate(u16 framerate) { JFWDisplay::getManager()->setFrameRate(framerate); } static void alloc32(u32) {} static void getFrameBufferMemory() {} @@ -65,7 +66,6 @@ class mDoGph_gInf_c { static void getMonotoneRate() {} static void setBlureMtx(const Mtx) {} static void setBlureRate(u8) {} - static void setFrameRate(u16) {} static void setMonotoneRate(s16 rate) { mMonotoneRate = rate; } static void setMonotoneRateSpeed(s16 speed) { mMonotoneRateSpeed = speed; } diff --git a/src/d/actor/d_a_movie_player.cpp b/src/d/actor/d_a_movie_player.cpp index 65bfb8601..2ee0e4a1a 100644 --- a/src/d/actor/d_a_movie_player.cpp +++ b/src/d/actor/d_a_movie_player.cpp @@ -3,8 +3,92 @@ // Translation Unit: d_a_movie_player.cpp // +// This TU seems to disable inlining entirely, as there are several weak functions that get inlined +// in other TUs, but not here. +#pragma dont_inline on + #include "d/actor/d_a_movie_player.h" +#include "f_op/f_op_actor_mng.h" #include "d/d_procname.h" +#include "d/d_com_inf_game.h" +#include "m_Do/m_Do_graphic.h" +#include "dolphin/os/OSMessage.h" + +static Vec bss_3569; +// Not sure what these are, but they have size 1, and alignment 1 in the debug maps, but alignment 4 in the non-debug maps. +static u8 bss_1036 ALIGN_DECL(4); +static u8 bss_1034 ALIGN_DECL(4); +static u8 bss_1032 ALIGN_DECL(4); +static u8 bss_1031 ALIGN_DECL(4); +static u8 bss_1026 ALIGN_DECL(4); +static u8 bss_1024 ALIGN_DECL(4); +static u8 bss_1022 ALIGN_DECL(4); +static u8 bss_1021 ALIGN_DECL(4); +static u8 bss_984 ALIGN_DECL(4); +static u8 bss_982 ALIGN_DECL(4); +static u8 bss_980 ALIGN_DECL(4); +static u8 bss_979 ALIGN_DECL(4); +static u8 bss_941 ALIGN_DECL(4); +static u8 bss_939 ALIGN_DECL(4); +static u8 bss_937 ALIGN_DECL(4); +static u8 bss_936 ALIGN_DECL(4); + +u8 THPStatistics[0x460]; + +daMP_Player_c daMP_ActivePlayer; + +BOOL daMP_ReadThreadCreated; +OSMessageQueue daMP_FreeReadBufferQueue; +OSMessageQueue daMP_ReadedBufferQueue; +OSMessageQueue daMP_ReadedBufferQueue2; +OSMessage daMP_FreeReadBufferMessage[10]; +OSMessage daMP_ReadedBufferMessage[10]; +OSMessage daMP_ReadedBufferMessage2[10]; +OSThread daMP_ReadThread; +u8 daMP_ReadThreadStack[0x1000]; + +BOOL daMP_VideoDecodeThreadCreated; +OSThread daMP_VideoDecodeThread; +u8 daMP_VideoDecodeThreadStack[0x64000]; + +OSMessageQueue daMP_FreeTextureSetQueue; +OSMessageQueue daMP_DecodedTextureSetQueue; +OSMessage daMP_FreeTextureSetMessage[3]; +OSMessage daMP_DecodedTextureSetMessage[3]; + +BOOL daMP_First; + +BOOL daMP_AudioDecodeThreadCreated; +OSThread daMP_AudioDecodeThread; +u8 daMP_AudioDecodeThreadStack[0x64000]; +OSMessageQueue daMP_FreeAudioBufferQueue; +OSMessageQueue daMP_DecodedAudioBufferQueue; +OSMessage daMP_FreeAudioBufferMessage[3]; +OSMessage daMP_DecodedAudioBufferMessage[3]; + +BOOL daMP_Initialized; +u8 daMP_WorkBuffer[0x40]; +OSMessageQueue daMP_PrepareReadyQueue; +OSMessageQueue daMP_UsedTextureSetQueue; +OSMessage daMP_PrepareReadyMessage; +OSMessage daMP_UsedTextureSetMessage[3]; +VIRetraceCallback daMP_OldVIPostCallback; + +u32 daMP_SoundBufferIndex; +u32 daMP_OldAIDCallback; + +s16 daMP_SoundBuffer[0x460][2]; + +u32 daMP_DrawPosX; +u32 daMP_DrawPosY; +THPVideoInfo daMP_videoInfo; +THPAudioInfo daMP_audioInfo; + +BOOL daMP_Fail_alloc; +u16 daMP_backup_FrameRate; +u8 daMP_backup_vfilter[7]; + +daMP_Dlst_base_c daMP_c_Dlst_base; extern "C" { @@ -143,56 +227,99 @@ void THPInit() { /* Nonmatching */ } -/* 000031D4-00003208 .text OSInitFastCast */ -void OSInitFastCast() { - /* Nonmatching */ -} +// /* 000031D4-00003208 .text OSInitFastCast */ +// void OSInitFastCast() { +// /* Nonmatching */ +// } }; /* 00003208-0000323C .text daMP_PopReadedBuffer__Fv */ -void daMP_PopReadedBuffer() { - /* Nonmatching */ +void* daMP_PopReadedBuffer() { + OSMessage msg; + OSReceiveMessage(&daMP_ReadedBufferQueue, &msg, 1); + return msg; } /* 0000323C-0000326C .text daMP_PushReadedBuffer__FPv */ -void daMP_PushReadedBuffer(void*) { - /* Nonmatching */ +void daMP_PushReadedBuffer(void* r3) { + OSMessage msg = (OSMessage)r3; + OSSendMessage(&daMP_ReadedBufferQueue, msg, 1); } /* 0000326C-000032A0 .text daMP_PopFreeReadBuffer__Fv */ -void daMP_PopFreeReadBuffer() { - /* Nonmatching */ +daMP_THPReadBuffer* daMP_PopFreeReadBuffer() { + OSMessage msg; + OSReceiveMessage(&daMP_FreeReadBufferQueue, &msg, 1); + return (daMP_THPReadBuffer*)msg; } /* 000032A0-000032D0 .text daMP_PushFreeReadBuffer__FPv */ -void daMP_PushFreeReadBuffer(void*) { - /* Nonmatching */ +void daMP_PushFreeReadBuffer(void* r3) { + OSMessage msg = (OSMessage)r3; + OSSendMessage(&daMP_FreeReadBufferQueue, msg, 1); } /* 000032D0-00003304 .text daMP_PopReadedBuffer2__Fv */ -void daMP_PopReadedBuffer2() { - /* Nonmatching */ +void* daMP_PopReadedBuffer2() { + OSMessage msg; + OSReceiveMessage(&daMP_ReadedBufferQueue2, &msg, 1); + return msg; } /* 00003304-00003334 .text daMP_PushReadedBuffer2__FPv */ -void daMP_PushReadedBuffer2(void*) { - /* Nonmatching */ +void daMP_PushReadedBuffer2(void* r3) { + OSMessage msg = (OSMessage)r3; + OSSendMessage(&daMP_ReadedBufferQueue2, msg, 1); } /* 00003334-0000336C .text daMP_ReadThreadStart__Fv */ void daMP_ReadThreadStart() { - /* Nonmatching */ + if (daMP_ReadThreadCreated) { + OSResumeThread(&daMP_ReadThread); + } } /* 0000336C-000033B0 .text daMP_ReadThreadCancel__Fv */ void daMP_ReadThreadCancel() { - /* Nonmatching */ + if (daMP_ReadThreadCreated) { + OSCancelThread(&daMP_ReadThread); + daMP_ReadThreadCreated = FALSE; + } } /* 000033B0-00003494 .text daMP_Reader__FPv */ void daMP_Reader(void*) { - /* Nonmatching */ + /* Nonmatching - regalloc */ + s32 r28 = 0; + s32 r30 = daMP_ActivePlayer.mB8; + s32 r29 = daMP_ActivePlayer.mBC; + while (true) { + daMP_THPReadBuffer* readBuf = daMP_PopFreeReadBuffer(); + int readBytes = DVDReadPrio(&daMP_ActivePlayer.mFileInfo, readBuf->m00, r29, r30, 2); + if (readBytes != r29) { + if (readBytes == -1) { + daMP_ActivePlayer.mA8 = -1; + } + if (r28 == 0) { + daMP_PrepareReady(0); + } + OSSuspendThread(&daMP_ReadThread); + } + readBuf->m04 = r28; + daMP_PushReadedBuffer(readBuf); + r30 += r29; + r29 = daMP_NEXT_READ_SIZE(readBuf); + u32 r0 = (r28 + daMP_ActivePlayer.mC0) % daMP_ActivePlayer.m50; + if (r0 == daMP_ActivePlayer.m50 - 1) { + if (daMP_ActivePlayer.mA6 & 0x01) { + r30 = daMP_ActivePlayer.m64; + } else { + OSSuspendThread(&daMP_ReadThread); + } + } + r28++; + } } /* 000034A0-00003550 .text daMP_CreateReadThread__Fl */ @@ -201,23 +328,32 @@ void daMP_CreateReadThread(s32) { } /* 00003550-00003584 .text daMP_PopFreeTextureSet__Fv */ -void daMP_PopFreeTextureSet() { - /* Nonmatching */ +OSMessage daMP_PopFreeTextureSet() { + OSMessage msg; + OSReceiveMessage(&daMP_FreeTextureSetQueue, &msg, 1); + return msg; } /* 00003584-000035B4 .text daMP_PushFreeTextureSet__FPv */ -void daMP_PushFreeTextureSet(void*) { - /* Nonmatching */ +void daMP_PushFreeTextureSet(void* r3) { + OSMessage msg = (OSMessage)r3; + OSSendMessage(&daMP_FreeTextureSetQueue, msg, 0); } /* 000035B4-000035F8 .text daMP_PopDecodedTextureSet__Fl */ -void daMP_PopDecodedTextureSet(s32) { - /* Nonmatching */ +void* daMP_PopDecodedTextureSet(s32 r3) { + OSMessage msg; + if (OSReceiveMessage(&daMP_DecodedTextureSetQueue, &msg, r3) == TRUE) { + return msg; + } else { + return NULL; + } } /* 000035F8-00003628 .text daMP_PushDecodedTextureSet__FPv */ -void daMP_PushDecodedTextureSet(void*) { - /* Nonmatching */ +void daMP_PushDecodedTextureSet(void* r3) { + OSMessage msg = (OSMessage)r3; + OSSendMessage(&daMP_DecodedTextureSetQueue, msg, 1); } /* 00003628-00003760 .text daMP_VideoDecode__FP18daMP_THPReadBuffer */ @@ -242,12 +378,17 @@ void daMP_CreateVideoDecodeThread(s32, u8*) { /* 00003A74-00003AAC .text daMP_VideoDecodeThreadStart__Fv */ void daMP_VideoDecodeThreadStart() { - /* Nonmatching */ + if (daMP_VideoDecodeThreadCreated) { + OSResumeThread(&daMP_VideoDecodeThread); + } } /* 00003AAC-00003AF0 .text daMP_VideoDecodeThreadCancel__Fv */ void daMP_VideoDecodeThreadCancel() { - /* Nonmatching */ + if (daMP_VideoDecodeThreadCreated) { + OSCancelThread(&daMP_VideoDecodeThread); + daMP_VideoDecodeThreadCreated = FALSE; + } } /* 00003AF0-00003B24 .text daMP_PopFreeAudioBuffer__Fv */ @@ -292,12 +433,17 @@ void daMP_CreateAudioDecodeThread(s32, u8*) { /* 00003E70-00003EA8 .text daMP_AudioDecodeThreadStart__Fv */ void daMP_AudioDecodeThreadStart() { - /* Nonmatching */ + if (daMP_AudioDecodeThreadCreated) { + OSResumeThread(&daMP_AudioDecodeThread); + } } /* 00003EA8-00003EEC .text daMP_AudioDecodeThreadCancel__Fv */ void daMP_AudioDecodeThreadCancel() { - /* Nonmatching */ + if (daMP_AudioDecodeThreadCreated) { + OSCancelThread(&daMP_AudioDecodeThread); + daMP_AudioDecodeThreadCreated = FALSE; + } } /* 00003EEC-00004004 .text daMP_THPGXRestore__Fv */ @@ -396,13 +542,17 @@ void daMP_PlayControl(u32) { } /* 00005810-00005850 .text daMP_WaitUntilPrepare__Fv */ -void daMP_WaitUntilPrepare() { - /* Nonmatching */ +s32 daMP_WaitUntilPrepare() { + OSMessage msg; + OSReceiveMessage(&daMP_PrepareReadyQueue, &msg, 1); + u32 temp = (s32)msg; + return (-temp | temp) >> 31; // fakematch? should be temp != 0; } /* 00005850-00005880 .text daMP_PrepareReady__Fi */ -void daMP_PrepareReady(int) { - /* Nonmatching */ +void daMP_PrepareReady(int r3) { + OSMessage msg = (OSMessage)r3; + OSSendMessage(&daMP_PrepareReadyQueue, msg, 1); } /* 00005880-00005B68 .text daMP_THPPlayerPrepare__Flll */ @@ -456,7 +606,7 @@ void daMP_THPPlayerSetVolume(s32, s32) { } /* 00005F9C-00006104 .text daMP_ActivePlayer_Init__FPCc */ -void daMP_ActivePlayer_Init(const char*) { +BOOL daMP_ActivePlayer_Init(const char*) { /* Nonmatching */ } @@ -476,68 +626,107 @@ void daMP_ActivePlayer_Draw() { } /* 00006230-000062F0 .text daMP_Get_MovieRestFrame__Fv */ -void daMP_Get_MovieRestFrame() { +u32 daMP_Get_MovieRestFrame() { /* Nonmatching */ } /* 000062F0-00006370 .text daMP_Set_PercentMovieVolume__Ff */ -void daMP_Set_PercentMovieVolume(float) { +u32 daMP_Set_PercentMovieVolume(f32) { /* Nonmatching */ } /* 00006370-00006390 .text daMP_c_Get_arg_data__6daMP_cFv */ -void daMP_c::daMP_c_Get_arg_data() { - /* Nonmatching */ +u32 daMP_c::daMP_c_Get_arg_data() { + return fopAcM_GetParam(this); } /* 00006390-00006500 .text daMP_c_Init__6daMP_cFv */ -void daMP_c::daMP_c_Init() { - /* Nonmatching */ +int daMP_c::daMP_c_Init() { + /* Nonmatching */ + static u8 set_vfilter[7] = { + 0x00, 0x00, 0x15, 0x16, 0x15, 0x00, 0x00, + }; + static const char* filename_table[2] = { + "/thpdemo/title_loop.thp", + "/thpdemo/end_st_epilogue.thp", + }; + + daMP_backup_FrameRate = mDoGph_gInf_c::getFrameRate(); + mDoGph_gInf_c::setFrameRate(1); + GXRenderModeObj* renderMode = JUTVideo::getManager()->getRenderMode(); + // daMP_backup_vfilter = renderMode->vfilter; + // renderMode->vfilter = set_vfilter; + daMP_Fail_alloc = FALSE; + mpCallBack1 = daMP_Get_MovieRestFrame; + mpCallBack2 = daMP_Set_PercentMovieVolume; + int r4 = daMP_c_Get_arg_data(); + if (r4 >= 0 && r4 < 2) { + if (filename_table[r4] == NULL || !daMP_ActivePlayer_Init(filename_table[r4])) { + daMP_Fail_alloc = TRUE; + return cPhs_COMPLEATE_e; + } + } else { + OSReport("\x1B[43;30mムービーの番号がおかしい %d %d\n\x1B[m", r4, 2); + if (!daMP_ActivePlayer_Init(filename_table[0])) { + daMP_Fail_alloc = TRUE; + } + } + return cPhs_COMPLEATE_e; } /* 00006580-000065F8 .text daMP_c_Finish__6daMP_cFv */ -void daMP_c::daMP_c_Finish() { +BOOL daMP_c::daMP_c_Finish() { /* Nonmatching */ } /* 000065F8-0000661C .text daMP_c_Main__6daMP_cFv */ -void daMP_c::daMP_c_Main() { - /* Nonmatching */ +BOOL daMP_c::daMP_c_Main() { + daMP_ActivePlayer_Main(); + return TRUE; } /* 0000661C-0000663C .text draw__16daMP_Dlst_base_cFv */ void daMP_Dlst_base_c::draw() { - /* Nonmatching */ + daMP_ActivePlayer_Draw(); } /* 0000663C-00006668 .text daMP_c_Draw__6daMP_cFv */ -void daMP_c::daMP_c_Draw() { - /* Nonmatching */ +BOOL daMP_c::daMP_c_Draw() { + dComIfGd_set2DOpa(&daMP_c_Dlst_base); + return TRUE; } /* 000066C4-00006728 .text daMP_c_Callback_Init__6daMP_cFP10fopAc_ac_c */ -int daMP_c::daMP_c_Callback_Init(fopAc_ac_c*) { - /* Nonmatching */ +int daMP_c::daMP_c_Callback_Init(fopAc_ac_c* i_this) { + fopAcM_SetupActor(i_this, daMP_c); + daMP_c* a_this = (daMP_c*)i_this; + return a_this->daMP_c_Init(); } /* 00006728-00006748 .text daMP_c_Callback_Finish__6daMP_cFP6daMP_c */ -int daMP_c::daMP_c_Callback_Finish(daMP_c*) { - /* Nonmatching */ +BOOL daMP_c::daMP_c_Callback_Finish(daMP_c* i_this) { + return i_this->daMP_c_Finish(); } /* 00006748-00006780 .text daMP_c_Callback_Main__6daMP_cFP6daMP_c */ -int daMP_c::daMP_c_Callback_Main(daMP_c*) { - /* Nonmatching */ +BOOL daMP_c::daMP_c_Callback_Main(daMP_c* i_this) { + if (daMP_Fail_alloc) { + return TRUE; + } + return i_this->daMP_c_Main(); } /* 00006780-000067B8 .text daMP_c_Callback_Draw__6daMP_cFP6daMP_c */ -int daMP_c::daMP_c_Callback_Draw(daMP_c*) { - /* Nonmatching */ +BOOL daMP_c::daMP_c_Callback_Draw(daMP_c* i_this) { + if (daMP_Fail_alloc) { + return TRUE; + } + return i_this->daMP_c_Draw(); } /* 000067B8-000067C0 .text daMP_Callback_Dummy__FP6daMP_c */ -static int daMP_Callback_Dummy(daMP_c*) { - /* Nonmatching */ +static BOOL daMP_Callback_Dummy(daMP_c* i_this) { + return TRUE; } static actor_method_class daMP_METHODS = { diff --git a/src/d/d_bg_s_acch.cpp b/src/d/d_bg_s_acch.cpp index 6a6e63f8e..b308a10eb 100644 --- a/src/d/d_bg_s_acch.cpp +++ b/src/d/d_bg_s_acch.cpp @@ -460,6 +460,6 @@ f32 dBgS_Acch::GetWallAddY(Vec& vec, int) { } static void dummy2() { - OSReport("\033[43;30m**************************************\ndBgS_ObjAcch::copy constructer called.\n**************************************\n\033[m"); + OSReport("\x1B[43;30m**************************************\ndBgS_ObjAcch::copy constructer called.\n**************************************\n\033[m"); dBgS_ObjAcch acch; // fakematch to get dBgS_ObjAcch's vtable and destructor to show up in this TU }