Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Document z_horse.c and related actors #2278

Open
wants to merge 7 commits into
base: main
Choose a base branch
from

Conversation

mzxrules
Copy link
Contributor

Contributions made in this pr are licensed under CC0

include/regs.h Outdated
@@ -118,6 +118,8 @@
#define R_MESSAGE_DEBUGGER_TEXTID YREG(79)
#define R_C_UP_ICON_X YREG(88)
#define R_C_UP_ICON_Y YREG(89)
#define R_ENTER_RIDING_HORSE AREG(6)
#define R_DEBUG_FORCE_EPONA_OBTAINED DREG(1) //If set, overrides EVENTCHKINF_EPONA_OBTAINED state giving Epona
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nit: space between // and If

@@ -1130,7 +1131,7 @@ void func_8002DE04(PlayState* play, Actor* actorA, Actor* actorB) {
actorA->flags &= ~ACTOR_FLAG_13;
}

void func_8002DE74(PlayState* play, Player* player) {
void Actor_SetCameraHorseSetting(PlayState* play, Player* player) {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I find the wording of this function name awkward ("set" appears twice, and what's a "camera horse"?). Some suggestions:

Actor_SetHorseCamera
Actor_RequestHorseCamera
Actor_RequestHorseCameraSetting

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Interesting. Player_SetCameraHorseSetting is the MM name for the function, but the MM Camera system names seem out of date.

Actor_RequestHorseCameraSetting might be best, but I'm not confident on word ordering.

/**
* Determines when and where a horse should spawn for the player
*/
void Horse_Set(PlayState* play, Player* player) {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

maybe Horse_Spawn for all of these would be more specific? ditto with e.g. Actor_InitPlayerHorse -> Actor_SpawnHorse or something

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm against calling it Actor_SpawnHorse and somewhat against using the word Spawn at all because it doesn't fit the same sort of operation that Actor_Spawn does. With Actor_Spawn, there is a reasonable expectation that the function will always return a new instance to an actor, whereas "Horse_Set" will only create a horse if the rather complex set of conditions to do so are met.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think Set does a worse job of capturing "create a horse if the rather complex set of conditions to do so are met" though, compared to Spawn. Maybe something like Horse_TrySpawn?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

perhaps everything here should be called Epona instead of Horse, since IIUC these don't apply to untamed horses or Ingo's horse?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

z_horse.c is an extension of z_en_horse.c, which is both Epona and the unnamed rideable horse with a saddle.

Horse_SetCutscene also contains a condition that spawns either Epona or the saddled horse depending on which one the player chooses to race with (i.e. the line with paramFlag = 0x8000). Because of this, Horse_SetCheck will also affect whether the saddled horse will spawn for the player.

For these reasons, I feel it is cleaner to just continue to refer to the system as Horse rather than picking out specific functions that happen to be Epona only.

#define EVENTINF_HORSES_05 ((EVENTINF_HORSES_INDEX << 4) | EVENTINF_HORSES_05_SHIFT)
#define EVENTINF_HORSES_06 ((EVENTINF_HORSES_INDEX << 4) | EVENTINF_HORSES_06_SHIFT)
// EVENTINF 0x00-0x03 reserved for IngoRaceState
#define EVENTINF_INGORACE_STATE_MASK (0xF << 0)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nit: maybe INGORACE -> INGO_RACE since I think of it as two words (and could remove STATE if it's getting long)

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

INGORACE matches the pre-existing spellings INGORACE and MALONRACE used in z_en_horse_game.c, which I mostly left untouched.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The inconsistency between IngoRaceState and INGORACE_STATE still bugs me but it's whatever

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I would change it now with the understanding that horse_game will also change later. INGORACE as one word is just worse.

src/code/z_horse.c Outdated Show resolved Hide resolved
@@ -41,49 +58,58 @@ typedef struct HorseSpawn {
/* 0x0A */ s16 type;
} HorseSpawn;

void func_8006D0EC(PlayState* play, Player* player) {
void Horse_SetNormal(PlayState* play, Player* player) {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

maybe "SpawnGameplay" for the opposite of a "cutscene" spawn? Initially I thought this was talking about normal vectors based on the name

#define EVENTINF_HORSES_05 ((EVENTINF_HORSES_INDEX << 4) | EVENTINF_HORSES_05_SHIFT)
#define EVENTINF_HORSES_06 ((EVENTINF_HORSES_INDEX << 4) | EVENTINF_HORSES_06_SHIFT)
// EVENTINF 0x00-0x03 reserved for IngoRaceState
#define EVENTINF_INGORACE_STATE_MASK (0xF << 0)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The inconsistency between IngoRaceState and INGORACE_STATE still bugs me but it's whatever

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants