diff --git a/data/dynos_bin_lvl.cpp b/data/dynos_bin_lvl.cpp index ecae3805..37de1cb1 100644 --- a/data/dynos_bin_lvl.cpp +++ b/data/dynos_bin_lvl.cpp @@ -1727,10 +1727,15 @@ static void ParseLevelScriptSymbol(GfxData* aGfxData, DataNode* aNo LevelScript _Ls[] = { OBJECT(model, posX, posY, posZ, angleX, angleY, angleZ, behParam, beh) }; memcpy(aHead, _Ls, sizeof(_Ls)); aHead += (sizeof(_Ls) / sizeof(_Ls[0])); + } else if (foundModel) { + u32 behIndex = DynOS_Lua_RememberVariable(aGfxData, aHead + 5, aNode->mTokens[topTokenIndex + 8]); + LevelScript _Ls[] = { OBJECT_EXT(model, posX, posY, posZ, angleX, angleY, angleZ, behParam, beh) }; + memcpy(aHead, _Ls, sizeof(_Ls)); + aHead += (sizeof(_Ls) / sizeof(_Ls[0])); } else { u32 modelIndex = DynOS_Lua_RememberVariable(aGfxData, aHead + 5, aNode->mTokens[topTokenIndex + 0]); u32 behIndex = DynOS_Lua_RememberVariable(aGfxData, aHead + 6, aNode->mTokens[topTokenIndex + 8]); - LevelScript _Ls[] = { OBJECT_EXT(modelIndex, posX, posY, posZ, angleX, angleY, angleZ, behParam, behIndex) }; + LevelScript _Ls[] = { OBJECT_EXT2(modelIndex, posX, posY, posZ, angleX, angleY, angleZ, behParam, behIndex) }; memcpy(aHead, _Ls, sizeof(_Ls)); aHead += (sizeof(_Ls) / sizeof(_Ls[0])); } @@ -1759,10 +1764,15 @@ static void ParseLevelScriptSymbol(GfxData* aGfxData, DataNode* aNo LevelScript _Ls[] = { OBJECT_WITH_ACTS(model, posX, posY, posZ, angleX, angleY, angleZ, behParam, beh, acts) }; memcpy(aHead, _Ls, sizeof(_Ls)); aHead += (sizeof(_Ls) / sizeof(_Ls[0])); + } else if (foundModel) { + u32 behIndex = DynOS_Lua_RememberVariable(aGfxData, aHead + 5, aNode->mTokens[topTokenIndex + 8]); + LevelScript _Ls[] = { OBJECT_WITH_ACTS_EXT(model, posX, posY, posZ, angleX, angleY, angleZ, behParam, behIndex, acts) }; + memcpy(aHead, _Ls, sizeof(_Ls)); + aHead += (sizeof(_Ls) / sizeof(_Ls[0])); } else { u32 modelIndex = DynOS_Lua_RememberVariable(aGfxData, aHead + 5, aNode->mTokens[topTokenIndex + 0]); u32 behIndex = DynOS_Lua_RememberVariable(aGfxData, aHead + 6, aNode->mTokens[topTokenIndex + 8]); - LevelScript _Ls[] = { OBJECT_WITH_ACTS_EXT(modelIndex, posX, posY, posZ, angleX, angleY, angleZ, behParam, behIndex, acts) }; + LevelScript _Ls[] = { OBJECT_WITH_ACTS_EXT2(modelIndex, posX, posY, posZ, angleX, angleY, angleZ, behParam, behIndex, acts) }; memcpy(aHead, _Ls, sizeof(_Ls)); aHead += (sizeof(_Ls) / sizeof(_Ls[0])); } diff --git a/include/level_commands.h b/include/level_commands.h index 8a28a68f..823522b4 100644 --- a/include/level_commands.h +++ b/include/level_commands.h @@ -285,7 +285,13 @@ // coop #define OBJECT_WITH_ACTS_EXT(model, posX, posY, posZ, angleX, angleY, angleZ, behParam, beh, acts) \ - CMD_BBBB(0x3F, 0x1C, acts, 0), \ + CMD_BBBB(0x3F, 0x18, acts, model), \ + CMD_HHHHHH(posX, posY, posZ, angleX, angleY, angleZ), \ + CMD_W(behParam), \ + CMD_PTR(beh) + +#define OBJECT_WITH_ACTS_EXT2(model, posX, posY, posZ, angleX, angleY, angleZ, behParam, beh, acts) \ + CMD_BBBB(0x40, 0x1C, acts, 0), \ CMD_HHHHHH(posX, posY, posZ, angleX, angleY, angleZ), \ CMD_W(behParam), \ CMD_PTR(model), \ @@ -294,4 +300,7 @@ #define OBJECT_EXT(model, posX, posY, posZ, angleX, angleY, angleZ, behParam, beh) \ OBJECT_WITH_ACTS_EXT(model, posX, posY, posZ, angleX, angleY, angleZ, behParam, beh, 0x1F) +#define OBJECT_EXT2(model, posX, posY, posZ, angleX, angleY, angleZ, behParam, beh) \ + OBJECT_WITH_ACTS_EXT2(model, posX, posY, posZ, angleX, angleY, angleZ, behParam, beh, 0x1F) + #endif // LEVEL_COMMANDS_H diff --git a/src/engine/level_script.c b/src/engine/level_script.c index 78a006c0..e178c09b 100644 --- a/src/engine/level_script.c +++ b/src/engine/level_script.c @@ -828,6 +828,49 @@ static void level_cmd_place_object_ext(void) { u8 val7 = 1 << (gCurrActNum - 1); struct SpawnInfo *spawnInfo; + u16 modIndex = gLevelScriptModIndex; + char* behStr = CMD_GET(char*, 20); + + gSmLuaConvertSuccess = true; + enum BehaviorId behId = smlua_get_mod_variable(modIndex, behStr); + + if ((gLevelScriptModIndex == -1) || !gSmLuaConvertSuccess) { + LOG_ERROR("Failed to place custom object: %u", behId); + sCurrentCmd = CMD_NEXT; + return; + } + + if (sCurrAreaIndex != -1 && ((CMD_GET(u8, 2) & val7) || CMD_GET(u8, 2) == 0x1F)) { + u16 model = CMD_GET(u8, 3); + spawnInfo = alloc_only_pool_alloc(sLevelPool, sizeof(struct SpawnInfo)); + + spawnInfo->startPos[0] = CMD_GET(s16, 4); + spawnInfo->startPos[1] = CMD_GET(s16, 6); + spawnInfo->startPos[2] = CMD_GET(s16, 8); + + spawnInfo->startAngle[0] = CMD_GET(s16, 10) * 0x8000 / 180; + spawnInfo->startAngle[1] = CMD_GET(s16, 12) * 0x8000 / 180; + spawnInfo->startAngle[2] = CMD_GET(s16, 14) * 0x8000 / 180; + + spawnInfo->areaIndex = sCurrAreaIndex; + spawnInfo->activeAreaIndex = sCurrAreaIndex; + + spawnInfo->behaviorArg = CMD_GET(u32, 16); + + spawnInfo->behaviorScript = (BehaviorScript*)get_behavior_from_id(behId); + spawnInfo->unk18 = gLoadedGraphNodes[model]; + spawnInfo->next = gAreas[sCurrAreaIndex].objectSpawnInfos; + + gAreas[sCurrAreaIndex].objectSpawnInfos = spawnInfo; + } + + sCurrentCmd = CMD_NEXT; +} + +static void level_cmd_place_object_ext2(void) { + u8 val7 = 1 << (gCurrActNum - 1); + struct SpawnInfo *spawnInfo; + u16 modIndex = gLevelScriptModIndex; char* modelStr = CMD_GET(char*, 20); char* behStr = CMD_GET(char*, 24); @@ -935,6 +978,7 @@ static void (*LevelScriptJumpTable[])(void) = { // coop /*3F*/ level_cmd_place_object_ext, + /*40*/ level_cmd_place_object_ext2, }; struct LevelCommand *level_script_execute(struct LevelCommand *cmd) { diff --git a/src/game/behaviors/breakable_box.inc.c b/src/game/behaviors/breakable_box.inc.c index 16f2774d..78c99789 100644 --- a/src/game/behaviors/breakable_box.inc.c +++ b/src/game/behaviors/breakable_box.inc.c @@ -3,7 +3,7 @@ void bhv_breakable_box_loop(void) { obj_set_hitbox(o, &sBreakableBoxHitbox); - cur_obj_set_model(smlua_model_util_load(E_MODEL_BREAKABLE_BOX_SMALL)); + //cur_obj_set_model(smlua_model_util_load(E_MODEL_BREAKABLE_BOX_SMALL)); if (o->oTimer == 0) breakable_box_init();