mirror of
https://github.com/TwilitRealm/dusklight
synced 2026-05-29 16:14:54 -04:00
3b742025db
- Fix struct/class forward declaration mismatches (JAIAudience, JASTrack) causing different MSVC mangled names and unresolved symbols - Add jsystem_stubs.cpp with stubs for JASHeap, JASVoiceBank, J3DShapeTable, JAUSection, JHICommBuf, HIO/HIO2, JOR
364 lines
10 KiB
C++
364 lines
10 KiB
C++
#include "d/dolzel.h" // IWYU pragma: keep
|
|
|
|
#include "JSystem/JKernel/JKRExpHeap.h"
|
|
#include "SSystem/SComponent/c_malloc.h"
|
|
#include "SSystem/SComponent/c_math.h"
|
|
#include "d/d_meter2.h"
|
|
#include "d/d_meter2_info.h"
|
|
#include "d/d_msg_object.h"
|
|
#include "f_op/f_op_msg_mng.h"
|
|
#include "f_op/f_op_scene_mng.h"
|
|
|
|
static fpc_ProcID i_msgID = fpcM_ERROR_PROCESS_ID_e;
|
|
|
|
s32 fopMsgM_setStageLayer(void* i_process) {
|
|
scene_class* stageProc = fopScnM_SearchByID(dStage_roomControl_c::getProcID());
|
|
JUT_ASSERT(93, stageProc != 0);
|
|
|
|
return fpcM_ChangeLayerID(i_process, fopScnM_LayerID(stageProc));
|
|
}
|
|
|
|
msg_class* fopMsgM_SearchByID(fpc_ProcID i_id) {
|
|
return (msg_class*)fpcM_SearchByID(i_id);
|
|
}
|
|
|
|
fopMsg_prm_class* fopMsgM_GetAppend(void* i_msg) {
|
|
return (fopMsg_prm_class*)fpcM_GetAppend(i_msg);
|
|
}
|
|
|
|
void fopMsgM_Delete(void* i_this) {
|
|
fpcM_Delete(i_this);
|
|
}
|
|
|
|
static fopMsg_prm_class* createAppend(fopAc_ac_c* i_talkActor, cXyz* i_pos, u32* i_msgIdx,
|
|
u32* param_3, fpc_ProcID param_4) {
|
|
fopMsg_prm_class* append = (fopMsg_prm_class*)cMl::memalignB(-4, sizeof(fopMsg_prm_class));
|
|
if (append == NULL) {
|
|
return NULL;
|
|
}
|
|
|
|
append->talk_actor = i_talkActor;
|
|
dMsgObject_setTalkActor(i_talkActor);
|
|
|
|
if (i_msgIdx != NULL) {
|
|
append->msg_idx = *i_msgIdx;
|
|
} else {
|
|
i_msgIdx = NULL;
|
|
}
|
|
|
|
if (param_3 != NULL) {
|
|
append->field_0x14 = *param_3;
|
|
} else {
|
|
param_3 = NULL;
|
|
}
|
|
|
|
if (i_pos != NULL) {
|
|
append->pos = *i_pos;
|
|
} else {
|
|
append->pos = cXyz(0.0f, 0.0f, 0.0f);
|
|
}
|
|
|
|
append->field_0x18 = param_4;
|
|
|
|
return append;
|
|
}
|
|
|
|
static fopMsg_prm_timer* createTimerAppend(int i_mode, u32 i_limitMs, u8 i_type, u8 param_3,
|
|
f32 param_4, f32 param_5, f32 param_6, f32 param_7,
|
|
fpc_ProcID param_8) {
|
|
fopMsg_prm_timer* appen = (fopMsg_prm_timer*)cMl::memalignB(-4, sizeof(fopMsg_prm_timer));
|
|
if (appen == NULL) {
|
|
return NULL;
|
|
}
|
|
|
|
appen->talk_actor = NULL;
|
|
appen->msg_idx = 0;
|
|
appen->field_0x14 = 0;
|
|
appen->pos = cXyz(0.0f, 0.0f, 0.0f);
|
|
appen->field_0x18 = param_8;
|
|
appen->timer_mode = i_mode;
|
|
appen->limit_ms = i_limitMs;
|
|
appen->type = i_type;
|
|
appen->field_0x25 = param_3;
|
|
appen->field_0x28 = param_4;
|
|
appen->field_0x2c = param_5;
|
|
appen->field_0x30 = param_6;
|
|
appen->field_0x34 = param_7;
|
|
return appen;
|
|
}
|
|
|
|
fpc_ProcID fopMsgM_create(s16 i_procName, fopAc_ac_c* i_talkActor, cXyz* i_pos, u32* i_msgIdx,
|
|
u32* param_4, FastCreateReqFunc i_createFunc) {
|
|
fopMsg_prm_class* append =
|
|
createAppend(i_talkActor, i_pos, i_msgIdx, param_4, fpcM_ERROR_PROCESS_ID_e);
|
|
if (append == NULL) {
|
|
return fpcM_ERROR_PROCESS_ID_e;
|
|
}
|
|
|
|
return fpcM_Create(i_procName, i_createFunc, append);
|
|
}
|
|
|
|
fpc_ProcID fop_Timer_create(s16 i_procName, u8 i_mode, u32 i_limitMs, u8 i_type, u8 param_4,
|
|
f32 param_5, f32 param_6, f32 param_7, f32 param_8,
|
|
FastCreateReqFunc i_createFunc) {
|
|
fopMsg_prm_timer* append =
|
|
createTimerAppend(i_mode, i_limitMs, i_type, param_4, param_5, param_6, param_7, param_8,
|
|
fpcM_ERROR_PROCESS_ID_e);
|
|
if (append == NULL) {
|
|
return fpcM_ERROR_PROCESS_ID_e;
|
|
}
|
|
|
|
return fpcM_Create(i_procName, i_createFunc, append);
|
|
}
|
|
|
|
void dummySet() {
|
|
csXyz().set(0, 0, 0);
|
|
}
|
|
|
|
fpc_ProcID fopMsgM_messageSet(u32 i_msgIdx, fopAc_ac_c* i_talkActor, u32 param_2) {
|
|
if (dComIfGp_isHeapLockFlag() == 8) {
|
|
dMeter2Info_getMeterClass()->emphasisButtonDelete();
|
|
}
|
|
|
|
if (dComIfGp_isHeapLockFlag() != 0 && dComIfGp_isHeapLockFlag() != 5 &&
|
|
dComIfGp_isHeapLockFlag() != 2 && dComIfGp_isHeapLockFlag() != 3 &&
|
|
dComIfGp_isHeapLockFlag() != 1)
|
|
{
|
|
return fpcM_ERROR_PROCESS_ID_e;
|
|
}
|
|
|
|
dComIfGp_clearMesgAnimeTagInfo();
|
|
dComIfGp_clearMesgCameraTagInfo();
|
|
|
|
cXyz pos;
|
|
if (i_talkActor != NULL) {
|
|
pos = i_talkActor->eyePos;
|
|
} else {
|
|
pos.set(0.0f, 0.0f, 0.0f);
|
|
}
|
|
|
|
if (g_MsgObject_HIO_c.mMsgDebug == true) {
|
|
i_msgIdx = g_MsgObject_HIO_c.mMsgIndex;
|
|
}
|
|
|
|
dMsgObject_c* msg = (dMsgObject_c*)fopMsgM_SearchByID(i_msgID);
|
|
|
|
if (msg != NULL && msg->mode == fopMsg_MODE_MSG_PREPARING_e) {
|
|
msg->pos.set(pos);
|
|
msg->msg_idx = i_msgIdx;
|
|
msg->field_0xf0 = param_2;
|
|
msg->talk_actor = i_talkActor;
|
|
msg->setMessageIndex(i_msgIdx, param_2, false);
|
|
return i_msgID;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
fpc_ProcID fopMsgM_messageSet(u32 i_msgIdx, u32 param_1) {
|
|
if (dComIfGp_isHeapLockFlag() == 8) {
|
|
dMeter2Info_getMeterClass()->emphasisButtonDelete();
|
|
}
|
|
|
|
if (dComIfGp_isHeapLockFlag() != 0 && dComIfGp_isHeapLockFlag() != 5 &&
|
|
dComIfGp_isHeapLockFlag() != 2 && dComIfGp_isHeapLockFlag() != 3 &&
|
|
dComIfGp_isHeapLockFlag() != 1)
|
|
{
|
|
return fpcM_ERROR_PROCESS_ID_e;
|
|
}
|
|
|
|
fopAc_ac_c* actor = NULL;
|
|
cXyz pos;
|
|
pos.x = pos.y = pos.z = 0.0f;
|
|
|
|
dMsgObject_c* msg = (dMsgObject_c*)fopMsgM_SearchByID(i_msgID);
|
|
|
|
if (msg != NULL) {
|
|
if (msg->mode == fopMsg_MODE_MSG_PREPARING_e) {
|
|
msg->pos.set(pos);
|
|
msg->msg_idx = i_msgIdx;
|
|
msg->field_0xf0 = param_1;
|
|
msg->talk_actor = actor;
|
|
msg->setTalkPartner(NULL);
|
|
msg->setMessageIndex(i_msgIdx, param_1, false);
|
|
return i_msgID;
|
|
} else if (msg->mode == fopMsg_MODE_MSG_CONTINUE_e) {
|
|
msg->pos.set(pos);
|
|
msg->msg_idx = i_msgIdx;
|
|
msg->field_0xf0 = param_1;
|
|
msg->talk_actor = actor;
|
|
return i_msgID;
|
|
}
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
fpc_ProcID fopMsgM_messageSetDemo(u32 i_msgidx) {
|
|
dMsgObject_endFlowGroup();
|
|
if (dComIfGp_isHeapLockFlag() == 8) {
|
|
dMeter2Info_getMeterClass()->emphasisButtonDelete();
|
|
}
|
|
|
|
if (dComIfGp_isHeapLockFlag() != 0 && dComIfGp_isHeapLockFlag() != 5 &&
|
|
dComIfGp_isHeapLockFlag() != 2 && dComIfGp_isHeapLockFlag() != 3 &&
|
|
dComIfGp_isHeapLockFlag() != 1)
|
|
{
|
|
return fpcM_ERROR_PROCESS_ID_e;
|
|
}
|
|
|
|
fopAc_ac_c* NULL_ = NULL;
|
|
|
|
cXyz pos;
|
|
pos.x = pos.y = pos.z = 0.0f;
|
|
|
|
dMsgObject_c* msg = (dMsgObject_c*)fopMsgM_SearchByID(i_msgID);
|
|
|
|
if (msg != NULL && msg->mode == fopMsg_MODE_MSG_PREPARING_e) {
|
|
msg->pos.set(pos);
|
|
msg->msg_idx = i_msgidx;
|
|
msg->field_0xf0 = 1000;
|
|
msg->talk_actor = NULL_;
|
|
msg->setMessageIndexDemo(i_msgidx, false);
|
|
return i_msgID;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
char* fopMsgM_messageGet(char* i_stringBuf, u32 i_msgId) {
|
|
dMeter2Info_getString(i_msgId, i_stringBuf, NULL);
|
|
return i_stringBuf;
|
|
}
|
|
|
|
void fopMsgM_setMessageID(fpc_ProcID msg_id) {
|
|
i_msgID = msg_id;
|
|
}
|
|
|
|
fpc_ProcID fopMsgM_Create(s16 i_procName, FastCreateReqFunc i_createFunc, void* i_append) {
|
|
return fpcM_Create(i_procName, i_createFunc, i_append);
|
|
}
|
|
|
|
u8 fopMsgM_itemNumIdx(u8 i_no) {
|
|
static const u8 itemicon[] = {
|
|
0x40, 0x48, 0x41, 0x45, 0x43, 0x3e, 0x42, 0xff, 0x46, 0x44, 0x47, 0x60,
|
|
0x61, 0x62, 0x6a, 0x70, 0x71, 0x72, 0x25, 0x90, 0x4a, 0xff, 0xff, 0x4b,
|
|
};
|
|
|
|
return itemicon[i_no] & 0xFF;
|
|
}
|
|
|
|
static f32 dummy() {
|
|
J2DPane* dummyPlane = NULL;
|
|
dummyPlane->getAlpha();
|
|
dummyPlane->getHeight();
|
|
dummyPlane->getWidth();
|
|
dummyPlane->setAlpha(0);
|
|
|
|
#if !PLATFORM_GCN
|
|
J2DPicture* dummyPicture = NULL;
|
|
const char* str = NULL;
|
|
dummyPicture->append(str, 0.0f);
|
|
dummyPicture->setBlendRatio(0.0f, 0.0f);
|
|
#endif
|
|
|
|
return 0.5f;
|
|
}
|
|
|
|
// Wii: NONMATCHING, float regalloc in case 3
|
|
f32 fopMsgM_valueIncrease(int i_max, int i_value, u8 i_mode) {
|
|
if (i_max <= 0) {
|
|
return 1.0f;
|
|
}
|
|
|
|
if (i_value < 0) {
|
|
i_value = 0;
|
|
} else if (i_value > i_max) {
|
|
i_value = i_max;
|
|
}
|
|
|
|
f32 v = (f32)i_value / i_max;
|
|
f32 ret;
|
|
|
|
switch (i_mode) {
|
|
case 0:
|
|
ret = v * v;
|
|
break;
|
|
case 1:
|
|
ret = JMAFastSqrt(v);
|
|
break;
|
|
case 2:
|
|
default:
|
|
ret = v;
|
|
break;
|
|
case 3:
|
|
v = (2.0f * v) - 1.0f;
|
|
ret = (2.0f * v) - 1.0f;
|
|
break;
|
|
case 4:
|
|
v = cM_ssin((int)(0.5f * ((f32)0x8000 * v)));
|
|
ret = v * v;
|
|
break;
|
|
case 5:
|
|
v = cM_ssin((int)(0.5f * ((f32)0xFFFF * v)));
|
|
ret = v * v;
|
|
break;
|
|
case 6:
|
|
ret = cM_ssin((int)((f32)0x8000 * v));
|
|
break;
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
// Here to generate J2DPicture virtual inlines
|
|
static void dummyVirtual(J2DPicture* picture, f32 param_1, f32 param_2, const char* param_3) {
|
|
picture->append(param_3, param_1);
|
|
picture->setBlendRatio(param_1, param_2);
|
|
}
|
|
|
|
JKRExpHeap* fopMsgM_createExpHeap(u32 i_heapSize, JKRHeap* i_heap) {
|
|
JKRHeap* heap;
|
|
if (i_heap == NULL) {
|
|
heap = mDoExt_getGameHeap();
|
|
} else {
|
|
heap = i_heap;
|
|
}
|
|
|
|
JKRExpHeap* exp_heap = JKRCreateExpHeap(i_heapSize, heap, false);
|
|
|
|
#if DEBUG
|
|
static int displayed = false;
|
|
if (exp_heap == NULL && !displayed) {
|
|
displayed = true;
|
|
int _;
|
|
|
|
// Failed to allocate %f KB of ExpHeap Continuous free space = %f KB
|
|
// Remaining free space = %f
|
|
OS_REPORT("\x1b[43;30mfopMsgM_createMaxExpHeap : Expヒープ%fKの確保に失敗 連続空き容量=%fK "
|
|
"残り空き容量=%f\n\x1b[m",
|
|
i_heapSize / 1024.0f, heap->getFreeSize() / 1024.0f,
|
|
heap->getTotalFreeSize() / 1024.0f);
|
|
}
|
|
#endif
|
|
|
|
return exp_heap;
|
|
}
|
|
|
|
void fopMsgM_destroyExpHeap(JKRExpHeap* i_heap) {
|
|
#if DEBUG
|
|
if (!i_heap->check()) {
|
|
// EXPHeap is corrupted %08x
|
|
OS_REPORT_ERROR("EXPヒープ破壊されている %08x\n", i_heap);
|
|
} else if (i_heap->isEmpty() == false) {
|
|
// EXPHeap has not been completely freed %08x %08x
|
|
OS_REPORT_ERROR("EXPヒープ全開放されていない %08x %08x\n", i_heap,
|
|
i_heap->getTotalUsedSize());
|
|
i_heap->dump();
|
|
i_heap->freeAll();
|
|
}
|
|
#endif
|
|
|
|
i_heap->destroy();
|
|
}
|