Started adding player 2 / Luigi

This commit is contained in:
MysterD 2020-07-29 21:08:38 -07:00
parent 131fc7ea11
commit 6b3ab5f115
12 changed files with 104 additions and 30 deletions

View File

@ -3522,6 +3522,17 @@ const BehaviorScript bhvMario[] = {
END_LOOP(),
};
const BehaviorScript bhvLuigi[] = {
BEGIN(OBJ_LIST_PLAYER),
SET_INT(oIntangibleTimer, 0),
OR_INT(oFlags, OBJ_FLAG_0100),
OR_INT(oUnk94, 0x0001),
SET_HITBOX(/*Radius*/ 37, /*Height*/ 160),
BEGIN_LOOP(),
CALL_NATIVE(bhv_luigi_update),
END_LOOP(),
};
const BehaviorScript bhvToadMessage[] = {
BEGIN(OBJ_LIST_GENACTOR),
OR_INT(oFlags, (OBJ_FLAG_PERSISTENT_RESPAWN | OBJ_FLAG_COMPUTE_DIST_TO_MARIO | OBJ_FLAG_SET_FACE_YAW_TO_MOVE_YAW | OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE)),

View File

@ -300,6 +300,7 @@ extern const BehaviorScript bhvSLSnowmanWind[];
extern const BehaviorScript bhvSLWalkingPenguin[];
extern const BehaviorScript bhvYellowBall[];
extern const BehaviorScript bhvMario[];
extern const BehaviorScript bhvLuigi[];
extern const BehaviorScript bhvToadMessage[];
extern const BehaviorScript bhvUnlockDoorStar[];
extern const BehaviorScript bhvInstantActiveWarp[];

View File

@ -188,6 +188,11 @@
CMD_W(behArg), \
CMD_PTR(beh)
#define LUIGI(unk3, behArg, beh) \
CMD_BBBB(0x3F, 0x0C, 0x00, unk3), \
CMD_W(behArg), \
CMD_PTR(beh)
#define WARP_NODE(id, destLevel, destArea, destNode, flags) \
CMD_BBBB(0x26, 0x08, id, destLevel), \
CMD_BBBB(destArea, destNode, flags, 0x00)

View File

@ -105,6 +105,7 @@ const LevelScript level_castle_grounds_entry[] = {
LOAD_RAW( /*seg*/ 0x0F, _common0_geoSegmentRomStart, _common0_geoSegmentRomEnd),
ALLOC_LEVEL_POOL(),
MARIO(/*model*/ MODEL_MARIO, /*behParam*/ 0x00000001, /*beh*/ bhvMario),
LUIGI(/*model*/ MODEL_MARIO, /*behParam*/ 0x00000002, /*beh*/ bhvLuigi),
JUMP_LINK(script_func_global_1),
JUMP_LINK(script_func_global_11),
JUMP_LINK(script_func_global_16),

View File

@ -227,6 +227,7 @@ const LevelScript level_castle_inside_entry[] = {
LOAD_RAW( /*seg*/ 0x0D, _group15_geoSegmentRomStart, _group15_geoSegmentRomEnd),
ALLOC_LEVEL_POOL(),
MARIO(/*model*/ MODEL_MARIO, /*behParam*/ 0x00000001, /*beh*/ bhvMario),
LUIGI(/*model*/ MODEL_MARIO, /*behParam*/ 0x00000002, /*beh*/ bhvLuigi),
JUMP_LINK(script_func_global_16),
LOAD_MODEL_FROM_GEO(MODEL_CASTLE_BOWSER_TRAP, castle_geo_000F18),
LOAD_MODEL_FROM_GEO(MODEL_CASTLE_WATER_LEVEL_PILLAR, castle_geo_001940),

View File

@ -438,6 +438,21 @@ static void level_cmd_init_mario(void) {
sCurrentCmd = CMD_NEXT;
}
static void level_cmd_init_luigi(void) {
vec3s_set(gPlayerSpawnInfos[1].startPos, 0, 0, 0);
vec3s_set(gPlayerSpawnInfos[1].startAngle, 0, 0, 0);
gPlayerSpawnInfos[1].activeAreaIndex = -1;
gPlayerSpawnInfos[1].areaIndex = 0;
gPlayerSpawnInfos[1].behaviorArg = CMD_GET(u32, 4);
gPlayerSpawnInfos[1].behaviorScript = CMD_GET(void *, 8);
gPlayerSpawnInfos[1].unk18 = gLoadedGraphNodes[CMD_GET(u8, 3)];
gPlayerSpawnInfos[1].next = NULL;
gMarioSpawnInfo->next = &gPlayerSpawnInfos[1];
sCurrentCmd = CMD_NEXT;
}
static void level_cmd_place_object(void) {
u8 val7 = 1 << (gCurrActNum - 1);
u16 model;
@ -651,15 +666,16 @@ static void level_cmd_unload_area(void) {
}
static void level_cmd_set_mario_start_pos(void) {
gMarioSpawnInfo->areaIndex = CMD_GET(u8, 2);
#if IS_64_BIT
vec3s_set(gMarioSpawnInfo->startPos, CMD_GET(s16, 6), CMD_GET(s16, 8), CMD_GET(s16, 10));
#else
vec3s_copy(gMarioSpawnInfo->startPos, CMD_GET(Vec3s, 6));
#endif
vec3s_set(gMarioSpawnInfo->startAngle, 0, CMD_GET(s16, 4) * 0x8000 / 180, 0);
for (int i = 0; i < 2; i++) {
gPlayerSpawnInfos[i].areaIndex = CMD_GET(u8, 2);
#if IS_64_BIT
vec3s_set(gPlayerSpawnInfos[i].startPos, CMD_GET(s16, 6), CMD_GET(s16, 8), CMD_GET(s16, 10));
#else
vec3s_copy(gPlayerSpawnInfos[i].startPos, CMD_GET(Vec3s, 6));
#endif
vec3s_set(gPlayerSpawnInfos[i].startAngle, 0, CMD_GET(s16, 4) * 0x8000 / 180, 0);
}
sCurrentCmd = CMD_NEXT;
}
@ -858,6 +874,7 @@ static void (*LevelScriptJumpTable[])(void) = {
/*3C*/ level_cmd_get_or_set_var,
/*3D*/ level_cmd_advdemo,
/*3E*/ level_cmd_cleardemoptr,
/*3F*/ level_cmd_init_luigi,
};
struct LevelCommand *level_script_execute(struct LevelCommand *cmd) {

View File

@ -24,7 +24,7 @@
#include "gfx_dimensions.h"
struct SpawnInfo gPlayerSpawnInfos[1];
struct SpawnInfo gPlayerSpawnInfos[2];
struct GraphNode *D_8033A160[0x100];
struct Area gAreaData[8];
@ -187,7 +187,8 @@ void clear_areas(void) {
gCurrentArea = NULL;
gWarpTransition.isActive = FALSE;
gWarpTransition.pauseRendering = FALSE;
gMarioSpawnInfo->areaIndex = -1;
gPlayerSpawnInfos[0].areaIndex = -1;
gPlayerSpawnInfos[1].areaIndex = -1;
for (i = 0; i < 8; i++) {
gAreaData[i].index = i;

View File

@ -155,7 +155,7 @@ struct CreditsEntry sCreditsSequence[] = {
{ LEVEL_NONE, 0, 1, 0, { 0, 0, 0 }, NULL },
};
struct MarioState gMarioStates[1];
struct MarioState gMarioStates[2];
struct HudDisplay gHudDisplay;
s16 sCurrPlayMode;
u16 D_80339ECA;
@ -371,21 +371,23 @@ void init_mario_after_warp(void) {
u32 marioSpawnType = get_mario_spawn_type(spawnNode->object);
if (gMarioState->action != ACT_UNINITIALIZED) {
gPlayerSpawnInfos[0].startPos[0] = (s16) spawnNode->object->oPosX;
gPlayerSpawnInfos[0].startPos[1] = (s16) spawnNode->object->oPosY;
gPlayerSpawnInfos[0].startPos[2] = (s16) spawnNode->object->oPosZ;
for (int i = 0; i < 2; i++) {
gPlayerSpawnInfos[i].startPos[0] = (s16) spawnNode->object->oPosX;
gPlayerSpawnInfos[i].startPos[1] = (s16) spawnNode->object->oPosY;
gPlayerSpawnInfos[i].startPos[2] = (s16) spawnNode->object->oPosZ;
gPlayerSpawnInfos[0].startAngle[0] = 0;
gPlayerSpawnInfos[0].startAngle[1] = spawnNode->object->oMoveAngleYaw;
gPlayerSpawnInfos[0].startAngle[2] = 0;
gPlayerSpawnInfos[i].startAngle[0] = 0;
gPlayerSpawnInfos[i].startAngle[1] = spawnNode->object->oMoveAngleYaw;
gPlayerSpawnInfos[i].startAngle[2] = 0;
if (marioSpawnType == MARIO_SPAWN_DOOR_WARP) {
init_door_warp(&gPlayerSpawnInfos[0], sWarpDest.arg);
}
if (marioSpawnType == MARIO_SPAWN_DOOR_WARP) {
init_door_warp(&gPlayerSpawnInfos[i], sWarpDest.arg);
}
if (sWarpDest.type == WARP_TYPE_CHANGE_LEVEL || sWarpDest.type == WARP_TYPE_CHANGE_AREA) {
gPlayerSpawnInfos[0].areaIndex = sWarpDest.areaIdx;
load_mario_area();
if (sWarpDest.type == WARP_TYPE_CHANGE_LEVEL || sWarpDest.type == WARP_TYPE_CHANGE_AREA) {
gPlayerSpawnInfos[i].areaIndex = sWarpDest.areaIdx;
if (i == 0) { load_mario_area(); }
}
}
init_mario();
@ -504,12 +506,14 @@ void warp_credits(void) {
load_area(sWarpDest.areaIdx);
vec3s_set(gPlayerSpawnInfos[0].startPos, gCurrCreditsEntry->marioPos[0],
gCurrCreditsEntry->marioPos[1], gCurrCreditsEntry->marioPos[2]);
for (int i = 0; i < 2; i++) {
vec3s_set(gPlayerSpawnInfos[i].startPos, gCurrCreditsEntry->marioPos[0],
gCurrCreditsEntry->marioPos[1], gCurrCreditsEntry->marioPos[2]);
vec3s_set(gPlayerSpawnInfos[0].startAngle, 0, 0x100 * gCurrCreditsEntry->marioAngle, 0);
vec3s_set(gPlayerSpawnInfos[i].startAngle, 0, 0x100 * gCurrCreditsEntry->marioAngle, 0);
gPlayerSpawnInfos[0].areaIndex = sWarpDest.areaIdx;
gPlayerSpawnInfos[i].areaIndex = sWarpDest.areaIdx;
}
load_mario_area();
init_mario();

View File

@ -1839,6 +1839,10 @@ s32 execute_mario_action(UNUSED struct Object *o) {
**************************************************/
void init_mario(void) {
bool isMario = (gMarioState == &gMarioStates[0]);
if (isMario && gMarioObject == NULL) { goto skippy; }
if (!isMario && gLuigiObject == NULL) { goto skippy; }
Vec3s capPos;
struct Object *capObject;
@ -1875,12 +1879,13 @@ void init_mario(void) {
find_water_level(gMarioSpawnInfo->startPos[0], gMarioSpawnInfo->startPos[2]);
gMarioState->area = gCurrentArea;
gMarioState->marioObj = gMarioObject;
gMarioState->marioObj = isMario ? gMarioObject : gLuigiObject;
gMarioState->marioObj->header.gfx.unk38.animID = -1;
vec3s_copy(gMarioState->faceAngle, gMarioSpawnInfo->startAngle);
vec3s_set(gMarioState->angleVel, 0, 0, 0);
vec3s_to_vec3f(gMarioState->pos, gMarioSpawnInfo->startPos);
vec3f_set(gMarioState->vel, 0, 0, 0);
if (!isMario) { gMarioState->pos[0] -= 50; }
gMarioState->floorHeight =
find_floor(gMarioState->pos[0], gMarioState->pos[1], gMarioState->pos[2], &gMarioState->floor);
@ -1919,15 +1924,23 @@ void init_mario(void) {
capObject->oMoveAngleYaw = 0;
}
skippy:
if (isMario) {
gMarioState = &gMarioStates[1];
init_mario();
gMarioState = &gMarioStates[0];
}
}
void init_mario_from_save_file(void) {
gMarioState->unk00 = 0;
gMarioState->flags = 0;
gMarioState->action = 0;
gMarioState->spawnInfo = &gPlayerSpawnInfos[0];
int i = (gMarioState == &gMarioStates[0]) ? 0 : 1;
gMarioState->spawnInfo = &gPlayerSpawnInfos[i];
gMarioState->statusForCamera = &gPlayerCameraState[0];
gMarioState->marioBodyState = &gBodyStates[0];
gMarioState->marioBodyState = &gBodyStates[i];
gMarioState->controller = &gControllers[0];
gMarioState->animation = &D_80339D10;
@ -1944,4 +1957,10 @@ void init_mario_from_save_file(void) {
gHudDisplay.coins = 0;
gHudDisplay.wedges = 8;
if (gMarioState == &gMarioStates[0]) {
gMarioState = &gMarioStates[1];
init_mario_from_save_file();
gMarioState = &gMarioStates[0];
}
}

View File

@ -286,6 +286,12 @@ void bhv_mario_update(void) {
}
}
void bhv_luigi_update(void) {
gMarioState = &gMarioStates[1];
bhv_mario_update();
gMarioState = &gMarioStates[0];
}
/**
* Update every object that occurs after firstObj in the given object list,
* including firstObj itself. Return the number of objects that were updated.
@ -500,6 +506,11 @@ void spawn_objects_from_info(UNUSED s32 unused, struct SpawnInfo *spawnInfo) {
geo_make_first_child(&object->header.gfx.node);
}
if (spawnInfo->behaviorArg & 0x02) {
gLuigiObject = object;
geo_make_first_child(&object->header.gfx.node);
}
geo_obj_init_spawninfo(&object->header.gfx, spawnInfo);
object->oPosX = spawnInfo->startPos[0];
@ -531,6 +542,7 @@ void clear_objects(void) {
gTHIWaterDrained = 0;
gTimeStopState = 0;
gMarioObject = NULL;
gLuigiObject = NULL;
gMarioCurrentRoom = 0;
for (i = 0; i < 60; i++) {

View File

@ -122,6 +122,7 @@ extern s16 gMarioOnMerryGoRound;
void bhv_mario_update(void);
void bhv_luigi_update(void);
void set_object_respawn_info_bits(struct Object *obj, u8 bits);
void unload_objects_from_area(UNUSED s32 unused, s32 areaIndex);
void spawn_objects_from_info(UNUSED s32 unused, struct SpawnInfo *spawnInfo);

View File

@ -282,6 +282,7 @@ void main_func(void) {
#ifdef DISCORDRPC
discord_update_rich_presence();
#endif
fflush(stdout);
}
#endif
}