1
0
Fork 0
mirror of https://github.com/zeldaret/oot.git synced 2024-12-02 15:55:59 +00:00
oot/src/code/z_horse.c

277 lines
12 KiB
C
Raw Normal View History

#include "global.h"
#include "terminal.h"
#include "src/overlays/actors/ovl_En_Horse/z_en_horse.h"
2020-03-17 04:31:30 +00:00
s32 func_8006CFC0(s32 sceneId) {
s32 validSceneIds[] = { SCENE_SPOT00, SCENE_SPOT06, SCENE_SPOT09, SCENE_SPOT12, SCENE_SPOT20 };
2020-03-17 04:31:30 +00:00
s32 i;
for (i = 0; i < ARRAY_COUNT(validSceneIds); i++) {
if (sceneId == validSceneIds[i]) {
2020-03-17 04:31:30 +00:00
return 1;
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
}
return 0;
}
void func_8006D074(PlayState* play) {
gSaveContext.horseData.sceneId = SCENE_SPOT00;
gSaveContext.horseData.pos.x = -1840;
gSaveContext.horseData.pos.y = 72;
gSaveContext.horseData.pos.z = 5497;
gSaveContext.horseData.angle = -27353;
2020-03-17 04:31:30 +00:00
}
void func_8006D0AC(PlayState* play) {
if (gSaveContext.horseData.sceneId == SCENE_SPOT06) {
gSaveContext.horseData.sceneId = SCENE_SPOT06;
gSaveContext.horseData.pos.x = -2065;
gSaveContext.horseData.pos.y = -863;
gSaveContext.horseData.pos.z = 1839;
gSaveContext.horseData.angle = 0;
2020-03-17 04:31:30 +00:00
}
}
2020-03-22 21:19:43 +00:00
typedef struct {
/* 0x00 */ s16 sceneId;
2020-03-17 04:31:30 +00:00
/* 0x02 */ Vec3s pos;
2020-03-22 21:19:43 +00:00
/* 0x08 */ s16 angle;
/* 0x0A */ s16 type;
2020-03-17 04:31:30 +00:00
} HorseSpawn;
void func_8006D0EC(PlayState* play, Player* player) {
2020-03-17 04:31:30 +00:00
s32 i;
2020-03-22 21:19:43 +00:00
HorseSpawn horseSpawns[] = {
{ SCENE_SPOT00, -460, 100, 6640, 0, 2 }, { SCENE_SPOT06, -1929, -1025, 768, 0, 2 },
{ SCENE_SPOT09, 2566, -259, 767, 0, 2 }, { SCENE_SPOT12, -328, 10, 953, 0, 2 },
{ SCENE_SPOT20, 928, 0, -2280, 0, 2 },
2020-03-17 04:31:30 +00:00
};
if ((AREG(6) != 0) && (Flags_GetEventChkInf(EVENTCHKINF_EPONA_OBTAINED) || (DREG(1) != 0))) {
player->rideActor = Actor_Spawn(&play->actorCtx, play, ACTOR_EN_HORSE, player->actor.world.pos.x,
player->actor.world.pos.y, player->actor.world.pos.z, player->actor.shape.rot.x,
player->actor.shape.rot.y, player->actor.shape.rot.z, 9);
ASSERT(player->rideActor != NULL, "player->ride.actor != NULL", "../z_horse.c", 343);
2020-03-17 04:31:30 +00:00
Actor_MountHorse(play, player, player->rideActor);
func_8002DE74(play, player);
gSaveContext.horseData.sceneId = play->sceneId;
2020-03-17 04:31:30 +00:00
if (play->sceneId == SCENE_SPOT12) {
2020-03-17 04:31:30 +00:00
player->rideActor->room = -1;
2020-03-22 21:19:43 +00:00
}
} else if ((play->sceneId == SCENE_SPOT12) && (gSaveContext.minigameState == 3)) {
2020-03-17 04:31:30 +00:00
Actor* horseActor;
gSaveContext.minigameState = 0;
horseActor = Actor_Spawn(&play->actorCtx, play, ACTOR_EN_HORSE, 3586.0f, 1413.0f, -402.0f, 0, 0x4000, 0, 1);
2020-03-17 04:31:30 +00:00
horseActor->room = -1;
} else if ((gSaveContext.entranceIndex == ENTR_SPOT20_7) && GET_EVENTCHKINF(EVENTCHKINF_EPONA_OBTAINED)) {
Actor* horseActor =
Actor_Spawn(&play->actorCtx, play, ACTOR_EN_HORSE, -25.0f, 0.0f, -1600.0f, 0, -0x4000, 0, 1);
ASSERT(horseActor != NULL, "horse_actor != NULL", "../z_horse.c", 389);
} else if ((play->sceneId == gSaveContext.horseData.sceneId) &&
(Flags_GetEventChkInf(EVENTCHKINF_EPONA_OBTAINED) || DREG(1) != 0)) {
// "Set by existence of horse %d %d %d"
osSyncPrintf("馬存在によるセット %d %d %d\n", gSaveContext.horseData.sceneId,
Flags_GetEventChkInf(EVENTCHKINF_EPONA_OBTAINED), DREG(1));
2020-03-17 04:31:30 +00:00
if (func_8006CFC0(gSaveContext.horseData.sceneId)) {
Actor* horseActor = Actor_Spawn(&play->actorCtx, play, ACTOR_EN_HORSE, gSaveContext.horseData.pos.x,
gSaveContext.horseData.pos.y, gSaveContext.horseData.pos.z, 0,
gSaveContext.horseData.angle, 0, 1);
ASSERT(horseActor != NULL, "horse_actor != NULL", "../z_horse.c", 414);
if (play->sceneId == SCENE_SPOT12) {
2020-03-17 04:31:30 +00:00
horseActor->room = -1;
2020-03-22 21:19:43 +00:00
}
} else {
2020-03-17 04:31:30 +00:00
osSyncPrintf(VT_COL(RED, WHITE));
// "Horse_SetNormal():%d set spot is no good."
osSyncPrintf("Horse_SetNormal():%d セットスポットまずいです。\n", gSaveContext.horseData.sceneId);
2020-03-17 04:31:30 +00:00
osSyncPrintf(VT_RST);
func_8006D074(play);
2020-03-17 04:31:30 +00:00
}
} else if ((play->sceneId == SCENE_SPOT20) && !Flags_GetEventChkInf(EVENTCHKINF_EPONA_OBTAINED) && (DREG(1) == 0)) {
Actor* horseActor = Actor_Spawn(&play->actorCtx, play, ACTOR_EN_HORSE, 0.0f, 0.0f, -500.0f, 0, 0, 0, 1);
ASSERT(horseActor != NULL, "horse_actor != NULL", "../z_horse.c", 443);
} else if (Flags_GetEventChkInf(EVENTCHKINF_EPONA_OBTAINED) || (DREG(1) != 0)) {
2020-03-22 21:19:43 +00:00
for (i = 0; i < ARRAY_COUNT(horseSpawns); i++) {
2020-03-17 04:31:30 +00:00
HorseSpawn* horseSpawn = &horseSpawns[i];
if (horseSpawn->sceneId == play->sceneId) {
Actor* horseActor =
Actor_Spawn(&play->actorCtx, play, ACTOR_EN_HORSE, horseSpawn->pos.x, horseSpawn->pos.y,
2020-03-22 21:19:43 +00:00
horseSpawn->pos.z, 0, horseSpawn->angle, 0, horseSpawn->type);
ASSERT(horseActor != NULL, "horse_actor != NULL", "../z_horse.c", 466);
if (play->sceneId == SCENE_SPOT12) {
2020-03-17 04:31:30 +00:00
horseActor->room = -1;
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
break;
}
}
} else if (!Flags_GetEventChkInf(EVENTCHKINF_EPONA_OBTAINED)) {
if ((DREG(1) == 0) && (play->sceneId == SCENE_SOUKO) && !IS_DAY) {
Actor_Spawn(&play->actorCtx, play, ACTOR_EN_HORSE, 0.0f, 0.0f, -60.0f, 0, 0x7360, 0, 1);
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
}
}
2020-03-22 21:19:43 +00:00
typedef struct {
/* 0x00 */ s16 sceneId;
2020-03-22 21:19:43 +00:00
/* 0x04 */ s32 cutsceneIndex;
2020-03-17 04:31:30 +00:00
/* 0x08 */ Vec3s pos;
2020-03-22 21:19:43 +00:00
/* 0x0E */ s16 angle;
/* 0x10 */ s16 type;
2020-03-17 04:31:30 +00:00
} struct_8011F9B8;
void func_8006D684(PlayState* play, Player* player) {
2020-03-17 04:31:30 +00:00
s32 pad;
s32 i;
Vec3s spawnPos;
if ((gSaveContext.entranceIndex == ENTR_SPOT00_11 || gSaveContext.entranceIndex == ENTR_SPOT00_12 ||
gSaveContext.entranceIndex == ENTR_SPOT00_13 || gSaveContext.entranceIndex == ENTR_SPOT00_15) &&
(gSaveContext.respawnFlag == 0)) {
2020-03-22 21:19:43 +00:00
Vec3s spawnPositions[] = {
{ -2961, 313, 7700 },
{ -1900, 313, 7015 },
{ -4043, 313, 6933 },
{ -2313, 313, 5990 },
2020-03-17 04:31:30 +00:00
};
if (gSaveContext.entranceIndex == ENTR_SPOT00_11) {
2020-03-17 04:31:30 +00:00
spawnPos = spawnPositions[0];
} else if (gSaveContext.entranceIndex == ENTR_SPOT00_12) {
2020-03-17 04:31:30 +00:00
spawnPos = spawnPositions[1];
} else if (gSaveContext.entranceIndex == ENTR_SPOT00_13) {
2020-03-17 04:31:30 +00:00
spawnPos = spawnPositions[2];
2020-03-23 23:11:21 +00:00
} else {
2020-03-17 04:31:30 +00:00
spawnPos = spawnPositions[3];
2020-03-23 23:11:21 +00:00
}
2020-03-17 04:31:30 +00:00
player->rideActor = Actor_Spawn(&play->actorCtx, play, ACTOR_EN_HORSE, spawnPos.x, spawnPos.y, spawnPos.z, 0,
player->actor.world.rot.y, 0, 7);
ASSERT(player->rideActor != NULL, "player->ride.actor != NULL", "../z_horse.c", 561);
2020-03-17 04:31:30 +00:00
Actor_MountHorse(play, player, player->rideActor);
func_8002DE74(play, player);
gSaveContext.horseData.sceneId = play->sceneId;
} else if ((play->sceneId == SCENE_SPOT20) && (GET_EVENTINF_HORSES_STATE() == EVENTINF_HORSES_STATE_6) &&
!Flags_GetEventChkInf(EVENTCHKINF_EPONA_OBTAINED) && (DREG(1) == 0)) {
2020-03-22 21:19:43 +00:00
player->rideActor =
Actor_Spawn(&play->actorCtx, play, ACTOR_EN_HORSE, 894.0f, 0.0f, -2084.0f, 0, -0x7FFF, 0, 5);
ASSERT(player->rideActor != NULL, "player->ride.actor != NULL", "../z_horse.c", 582);
2020-03-17 04:31:30 +00:00
Actor_MountHorse(play, player, player->rideActor);
func_8002DE74(play, player);
gSaveContext.horseData.sceneId = play->sceneId;
2020-03-17 04:31:30 +00:00
if (play->sceneId == SCENE_SPOT12) {
2020-03-17 04:31:30 +00:00
player->rideActor->room = -1;
2020-03-23 23:11:21 +00:00
}
2020-03-22 21:19:43 +00:00
} else {
static struct_8011F9B8 D_8011F9B8[] = {
{ SCENE_SPOT12, 0xFFF0, { 3600, 1413, 360 }, 0x8001, 8 },
{ SCENE_SPOT20, 0xFFF0, { -250, 1, -1580 }, 0x4000, 6 },
{ SCENE_SPOT20, 0xFFF1, { 0, 0, 0 }, 0x0000, 5 },
{ SCENE_SPOT20, 0xFFF5, { 0, 0, 0 }, 0x0000, 7 },
{ SCENE_SPOT00, 0xFFF3, { -2961, 313, 7700 }, 0x0000, 7 },
{ SCENE_SPOT00, 0xFFF4, { -1900, 313, 7015 }, 0x0000, 7 },
{ SCENE_SPOT00, 0xFFF5, { -4043, 313, 6933 }, 0x0000, 7 },
{ SCENE_SPOT00, 0xFFF6, { -4043, 313, 6933 }, 0x0000, 7 },
2020-03-17 04:31:30 +00:00
};
2020-03-22 21:19:43 +00:00
for (i = 0; i < ARRAY_COUNT(D_8011F9B8); i++) {
if ((play->sceneId == D_8011F9B8[i].sceneId) &&
(((void)0, gSaveContext.cutsceneIndex) == D_8011F9B8[i].cutsceneIndex)) {
2020-03-22 21:19:43 +00:00
if (D_8011F9B8[i].type == 7) {
if ((play->sceneId == SCENE_SPOT20) && (((void)0, gSaveContext.cutsceneIndex) == 0xFFF1)) {
D_8011F9B8[i].pos.x = player->actor.world.pos.x;
D_8011F9B8[i].pos.y = player->actor.world.pos.y;
D_8011F9B8[i].pos.z = player->actor.world.pos.z;
2020-03-17 04:31:30 +00:00
}
player->rideActor =
Actor_Spawn(&play->actorCtx, play, ACTOR_EN_HORSE, D_8011F9B8[i].pos.x, D_8011F9B8[i].pos.y,
D_8011F9B8[i].pos.z, 0, player->actor.world.rot.y, 0, D_8011F9B8[i].type);
ASSERT(player->rideActor != NULL, "player->ride.actor != NULL", "../z_horse.c", 628);
2020-03-17 04:31:30 +00:00
Actor_MountHorse(play, player, player->rideActor);
func_8002DE74(play, player);
2020-03-22 21:19:43 +00:00
} else if ((D_8011F9B8[i].type == 5) || (D_8011F9B8[i].type == 6) || (D_8011F9B8[i].type == 8)) {
2020-03-17 04:31:30 +00:00
Vec3f sp54;
s32 temp = 0;
2020-03-17 04:31:30 +00:00
if (GET_EVENTINF_HORSES_HORSETYPE() != HORSE_EPONA && D_8011F9B8[i].type == 6) {
2020-03-17 04:31:30 +00:00
temp = 0x8000;
2020-03-23 23:11:21 +00:00
}
2020-03-17 04:31:30 +00:00
player->rideActor =
Actor_Spawn(&play->actorCtx, play, ACTOR_EN_HORSE, D_8011F9B8[i].pos.x, D_8011F9B8[i].pos.y,
D_8011F9B8[i].pos.z, 0, D_8011F9B8[i].angle, 0, D_8011F9B8[i].type | temp);
ASSERT(player->rideActor != NULL, "player->ride.actor != NULL", "../z_horse.c", 667);
2020-03-17 04:31:30 +00:00
player->actor.world.pos.x = D_8011F9B8[i].pos.x;
player->actor.world.pos.y = D_8011F9B8[i].pos.y;
player->actor.world.pos.z = D_8011F9B8[i].pos.z;
2020-03-17 04:31:30 +00:00
player->actor.shape.rot.x = player->actor.shape.rot.z = 0;
player->actor.shape.rot.y = D_8011F9B8[i].angle;
Actor_MountHorse(play, player, player->rideActor);
func_8002DE74(play, player);
2020-03-17 04:31:30 +00:00
sp54.x = player->actor.world.pos.x - 200.0f;
sp54.y = player->actor.world.pos.y + 100.0f;
sp54.z = player->actor.world.pos.z;
2020-03-17 04:31:30 +00:00
Play_CameraSetAtEye(play, play->activeCamId, &player->actor.world.pos, &sp54);
2020-03-22 21:19:43 +00:00
} else {
Actor_Spawn(&play->actorCtx, play, ACTOR_EN_HORSE, D_8011F9B8[i].pos.x, D_8011F9B8[i].pos.y,
D_8011F9B8[i].pos.z, 0, D_8011F9B8[i].angle, 0, D_8011F9B8[i].type);
2020-03-17 04:31:30 +00:00
}
break;
}
}
}
}
void func_8006DC68(PlayState* play, Player* player) {
2020-03-22 21:19:43 +00:00
if (LINK_IS_ADULT) {
if (!func_8006CFC0(gSaveContext.horseData.sceneId)) {
2020-03-17 04:31:30 +00:00
osSyncPrintf(VT_COL(RED, WHITE));
// "Horse_Set_Check():%d set spot is no good."
osSyncPrintf("Horse_Set_Check():%d セットスポットまずいです。\n", gSaveContext.horseData.sceneId);
2020-03-17 04:31:30 +00:00
osSyncPrintf(VT_RST);
func_8006D074(play);
2020-03-17 04:31:30 +00:00
}
if (func_8006CFC0(play->sceneId)) {
if (IS_CUTSCENE_LAYER ||
((gSaveContext.entranceIndex == ENTR_SPOT00_11 || gSaveContext.entranceIndex == ENTR_SPOT00_12 ||
gSaveContext.entranceIndex == ENTR_SPOT00_13 || gSaveContext.entranceIndex == ENTR_SPOT00_15) &&
(gSaveContext.respawnFlag == 0)) ||
((play->sceneId == SCENE_SPOT20) && (GET_EVENTINF_HORSES_STATE() == EVENTINF_HORSES_STATE_6) &&
!Flags_GetEventChkInf(EVENTCHKINF_EPONA_OBTAINED) && (DREG(1) == 0))) {
func_8006D684(play, player);
2020-03-22 21:19:43 +00:00
} else {
func_8006D0EC(play, player);
2020-03-17 04:31:30 +00:00
}
}
}
}
2020-03-22 21:19:43 +00:00
void func_8006DD9C(Actor* actor, Vec3f* arg1, s16 arg2) {
s16 x = Math_Vec3f_Yaw(&actor->world.pos, arg1) - actor->world.rot.y;
2020-03-17 04:31:30 +00:00
2020-03-22 21:19:43 +00:00
if (x > arg2) {
actor->world.rot.y += arg2;
2020-03-22 21:19:43 +00:00
} else if (x < -arg2) {
actor->world.rot.y -= arg2;
2020-03-22 21:19:43 +00:00
} else {
actor->world.rot.y += x;
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
actor->shape.rot.y = actor->world.rot.y;
2020-03-17 04:31:30 +00:00
}