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

Rebase Dev onto original repo #58

Merged
merged 92 commits into from
Mar 10, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
92 commits
Select commit Hold shift + click to select a range
7c2cfc3
Update README.md
PhlexPlexico Jan 19, 2024
9b3d959
Update README.md
PhlexPlexico Mar 10, 2024
39bdc33
Update README.
PhlexPlexico Jan 18, 2024
f2e1dae
Fix razor sword health.
PhlexPlexico Jan 20, 2024
063928f
Disable line wrap on Tingle's textboxes
Roberto-Nessy Jan 20, 2024
f8b3bdd
Potential fix for swords on reset.
PhlexPlexico Jan 21, 2024
9fbf1a7
More adjustments to sword logic.
PhlexPlexico Jan 21, 2024
f9d94d7
Fix bombers code to not softlock.
PhlexPlexico Jan 21, 2024
0df0c36
Fix sword not being set for human form when obtaining it.
PhlexPlexico Jan 21, 2024
84c2f35
Use in-game code instead of rewriting maps.
PhlexPlexico Jan 22, 2024
ff450a0
Bring in external table for saving location data for spoiler log.
PhlexPlexico Jan 22, 2024
fed1743
Update spoiler data to include a different bit check and throw in ext…
PhlexPlexico Jan 22, 2024
3093e4c
Formatting + remove unused code.
PhlexPlexico Jan 22, 2024
557f505
Fix stray fairies from spawning when collected after SoT.
PhlexPlexico Jan 22, 2024
d4898b9
Fix Jim in ECT
HylianFreddy Jan 23, 2024
269cb06
Fix gold rupee DrawGraphicItemID
HylianFreddy Jan 23, 2024
8797cb5
Increase chestRewarded second array dimension to larger number.
PhlexPlexico Jan 23, 2024
d9c733d
Format else if statement.
PhlexPlexico Jan 24, 2024
06e490c
Full fix for extData checks.
PhlexPlexico Jan 24, 2024
93f8e06
Include postbox check.
PhlexPlexico Jan 24, 2024
964942d
Update extdata version.
PhlexPlexico Jan 24, 2024
fa7e40f
Fix overrides for Gabora, Ocean Spider House, Gorman, All Night Mask,…
PhlexPlexico Jan 25, 2024
ba78f3d
Fix ice traps crashing great fairies.
PhlexPlexico Jan 25, 2024
faa0992
Fix GID names to be more respective of what they do.
PhlexPlexico Jan 25, 2024
16b9451
Fix bottles not being able to be refilled over time.
PhlexPlexico Jan 25, 2024
69ea298
Clang-format changes exist. Committing.
PhlexPlexico Jan 25, 2024
7053e0d
Fix always getting mystery milk on item reset.
PhlexPlexico Jan 26, 2024
b5b65ca
Fix pictograph box and powder keg get items.
PhlexPlexico Jan 26, 2024
f53ade5
Adjust powder keg checks for shop and other goron.
PhlexPlexico Jan 27, 2024
68048ff
Fix pictograph option during patch generation.
PhlexPlexico Jan 27, 2024
56f1333
Order matters
PhlexPlexico Jan 27, 2024
498ff5b
Possibly fix razor sword issues with not upgrading.
PhlexPlexico Jan 27, 2024
d3ddecc
Fix Twinmold And Various Item Checks (#15)
PhlexPlexico Jan 29, 2024
f327ec0
Possible fix for EnGinkoMan override always giving the second reward …
PhlexPlexico Feb 2, 2024
47c375e
Fix manager to no longer give repeating items. Opt to fishing passes …
PhlexPlexico Feb 2, 2024
3c29aad
Cycle Reset Fixes On Temples (#16)
PhlexPlexico Feb 2, 2024
826d339
Fix Oceanside Spider house override (#19)
PhlexPlexico Feb 2, 2024
bb69189
Fix camera reset the same way restoration does. (#20)
PhlexPlexico Feb 3, 2024
4a7ac6d
Include fixes for deku trade quest in giving repeat progressive items…
PhlexPlexico Feb 3, 2024
ac12459
Fix HP fish override (thanks @HylianFreddy!). (#22)
PhlexPlexico Feb 4, 2024
8037796
Change keaton to be green rupees instead.
PhlexPlexico Feb 4, 2024
8387654
Fix Link not spawning back with proper sword if it was stolen. (#23)
PhlexPlexico Feb 5, 2024
9cc66d6
Fix Link being given magic on save creation. This should fix all magi…
PhlexPlexico Feb 5, 2024
67a3712
Put back the key sets to 0 in savefile to prevent keys from being ini…
PhlexPlexico Feb 5, 2024
397d370
Adjust powder keg item check to ensure it stays in inventory. (#26)
PhlexPlexico Feb 7, 2024
35edfa9
Set Keaton's get item to an unused rupee 10 item. (#27)
PhlexPlexico Feb 7, 2024
b2f21e3
Fix fast arrow and fask masks colliding. (#28)
PhlexPlexico Feb 7, 2024
c30dfe7
Adjust arrow checks to allow swapping if arrow is just in hand and no…
PhlexPlexico Feb 7, 2024
a71f7e2
Chests with bottle content no longer show animation upon receiving re…
PhlexPlexico Feb 8, 2024
400e5ef
Clang-format changes exist. Committing.
PhlexPlexico Feb 8, 2024
22a3443
Revert fast arrow swap changes as it was interfering with fast masks.…
PhlexPlexico Feb 12, 2024
d26dbd0
Bottle Refill Fixes (#33)
PhlexPlexico Feb 12, 2024
30f1e60
Finalize Bottle Override in Chest Contents (#34)
PhlexPlexico Feb 12, 2024
d8b5046
Spoiler Log Update (#31)
Tacoman369 Feb 13, 2024
13540b8
Clang-format changes exist. Committing.
PhlexPlexico Feb 13, 2024
9bf63d4
Trade item swaps (#35)
PhlexPlexico Feb 17, 2024
5746138
More decomp actor work (#36)
PhlexPlexico Feb 19, 2024
d6376c5
Swap fairy GIDs
PhlexPlexico Feb 19, 2024
b22fcf9
Temporarily remove chest content patch.
PhlexPlexico Feb 20, 2024
88b8489
Fix chest content matching issues.
PhlexPlexico Feb 20, 2024
3b7d257
Fix Ocean Deed crashing game. (#37)
PhlexPlexico Feb 20, 2024
14550c5
Chest fixes (#38)
PhlexPlexico Feb 21, 2024
54d63a7
Diety -> Deity
PhlexPlexico Feb 21, 2024
98e2c9e
Change setting back to zero to ensure the option works properly.
PhlexPlexico Feb 22, 2024
41fcf98
Implement blast mask cooldown. (#39)
PhlexPlexico Feb 22, 2024
2f346a5
Include change to ensure all trade items are covered for giving multi…
PhlexPlexico Feb 23, 2024
2c8ed86
Check settings before drawing small fancy chests. (#41)
PhlexPlexico Feb 23, 2024
c5c9e59
Refactor patches and hooks to be spread across more files. (#42)
PhlexPlexico Feb 24, 2024
83dffaa
Fully adjust chest drawing to ensure large chests draw properly. (#43)
PhlexPlexico Feb 25, 2024
d585b22
Clang-format changes exist. Committing.
PhlexPlexico Feb 25, 2024
4290902
Fix the sword issue that resets sword on b button. (#44)
PhlexPlexico Feb 25, 2024
03647b0
Clang-format changes exist. Committing.
PhlexPlexico Feb 25, 2024
414aa76
Adjust removing items to give next trade item if it is not none. (#45)
PhlexPlexico Feb 25, 2024
0f42828
Potentially fix kaepora not spawning in goron village winter.
PhlexPlexico Feb 26, 2024
17a4fb7
Include lens in check for item or magic.
PhlexPlexico Feb 26, 2024
476af26
Fix crashing with lens of truth checks
PhlexPlexico Feb 26, 2024
33ec9c5
Update Curiosity Shop logic to ensure the right flags are being set f…
PhlexPlexico Feb 26, 2024
da7dd07
Clang-format changes exist. Committing.
PhlexPlexico Feb 26, 2024
892cd5d
Fix chest spawns being decorated if they are not supposed to be. (#48)
PhlexPlexico Feb 26, 2024
eef0f99
Clang-format changes exist. Committing.
PhlexPlexico Feb 26, 2024
2210764
Adjust bottle fixes to ensure we don't set ext data on default items.…
PhlexPlexico Feb 27, 2024
c813b69
Include twinmold fixes from project restoration. (#50)
PhlexPlexico Feb 28, 2024
8083c6d
Clang-format changes exist. Committing.
PhlexPlexico Feb 28, 2024
97c13de
Include option to enable restoration twinmold. (#51)
PhlexPlexico Feb 28, 2024
6bef88e
Clang-format changes exist. Committing.
PhlexPlexico Feb 28, 2024
224aa49
Fix Kaepora Gabora not spawning in if you obtained lens with no magic…
PhlexPlexico Feb 29, 2024
fba7cba
Adjust lens item check to remove bad non-returning code.
PhlexPlexico Mar 4, 2024
bb90bb1
Adjust extdata to be properly aligned. (#53)
PhlexPlexico Mar 4, 2024
329a648
Refactor bottle logic once more. (#54)
PhlexPlexico Mar 6, 2024
84fd9ba
Update mystery milk logic to ensure we don't give multiple bottles. (…
PhlexPlexico Mar 8, 2024
97f719f
Add patch to ensure 200 bank reward isn't given multiple times. (#56)
PhlexPlexico Mar 8, 2024
dbfd564
Adjust children to let them do hide and seek with correct mask counts…
PhlexPlexico Mar 8, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 11 additions & 10 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# Majora's Mask 3D Randomizer

**Status: Work In Progress** - This is currently nowhere near playable - as it is just making the base code changes in order for an app to generate seeds.
**Status: Work In Progress** - This repository contains all the base code patches for the Randomizer. This repository does not contain the actual application for generating seeds, but is required in order for the game to be randomized.

This is an item randomizer for _The Legend of Zelda: Majora's Mask 3D_ for the Nintendo 3DS.

Expand All @@ -15,12 +15,12 @@ This is an item randomizer for _The Legend of Zelda: Majora's Mask 3D_ for the N

## Installation

You can download the latest stable version of the randomizer ~~[here](https://github.com/phlexplexico/MM3DR/releases/latest)~~. You can use either the ```MM3DR.3dsx``` or ```MM3DR.cia``` files provided to generate randomizer patches.
You can download the latest stable version of the randomizer [here](https://github.com/Z3DR/MM3D_Randomizer/releases/latest). You can use either the ```MM3D_Randomizer.3dsx``` or ```MM3D_Randomizer.cia``` files provided to generate randomizer patches.

Please ensure that you are playing on the USA version of Majora's Mask 3D, as it is the only version supported by the randomizer. You can use either the cartridge version or the installed digital version. In all instructions below, if a directory doesn't exist, just create it.
Please ensure that you are playing on the USA version of Majora's Mask 3D, as it is the only version supported by the randomizer. While it is not guaranteed, you may be able to play on different regions as well. Version 1.1 is also supported, but may take significantly longer to boot on the 3DS. You can use either the cartridge version or the installed digital version. In all instructions below, if a directory doesn't exist, just create it.

### On 3DS Console with Luma3DS
On your SD card, copy ```MM3DR.3dsx``` to ```SD:/3ds/``` or copy ```MM3DR.cia``` to ```SD:/cias/```. When using the ```.3dsx``` file, you will need to launch the randomzier app through the homebrew menu every time you wish to launch it. When using the ```.cia``` file, you will need to install the file using the FBI app, so that the randomizer app appears directly on the 3DS home menu. Alternatively, if your 3DS is connected to the internet, you can use FBI to scan the QR code for either the ```.3dsx``` file or the ```.cia``` file, and the randomizer will be downloaded and installed automatically.
On your SD card, copy ```MM3D_Randomizer.3dsx``` to ```SD:/3ds/``` or copy ```MM3D_Randomizer.cia``` to ```SD:/cias/```. When using the ```.3dsx``` file, you will need to launch the randomzier app through the homebrew menu every time you wish to launch it. When using the ```.cia``` file, you will need to install the file using the FBI app, so that the randomizer app appears directly on the 3DS home menu. Alternatively, if your 3DS is connected to the internet, you can use FBI to scan the QR code for either the ```.3dsx``` file or the ```.cia``` file, and the randomizer will be downloaded and installed automatically.

Power on your 3DS while holding the SELECT key to launch the Luma3DS menu. Make sure that ```Enable game patching``` is turned on, then press START to save and launch the home menu. You only have to do this once.

Expand All @@ -29,7 +29,7 @@ To generate a playthrough, run Majora's Mask 3D Randomizer from the homebrew lau
If the 3DS crashes when you launch the game, you probably need to update Luma3DS.

### On Citra
Use Citra to launch ```MM3DR.3dsx```. Navigate the menus to choose the settings for your playthrough, and finish by selecting ```Generate Randomizer```. When prompted, make sure to select that you are playing on Citra emulator. After the app has finished, on the Citra window, click on ```File->Open Citra Folder```. From this folder, navigate to ```\sdmc\luma\titles\0004000000125500```, and you should find files called ```code.ips```, ```exheader.bin```, and a folder called ```romfs```. In the Citra window, right-click on the installed copy of Ocarina of Time 3D, and choose ```Open Mods Location```. (If you haven't installed OoT3D, you can go to ```File->Open Citra Folder``` and then open up ```\load\mods\0004000000125500```.) Copy ```code.ips```, ```exheader.bin```, and ```romfs``` into this folder. Now, launch Majora's Mask 3D and enjoy your playthrough!
Use Citra to launch ```MM3D_Randomizer.3dsx```. Navigate the menus to choose the settings for your playthrough, and finish by selecting ```Generate Randomizer```. When prompted, make sure to select that you are playing on Citra emulator. After the app has finished, on the Citra window, click on ```File->Open Citra Folder```. From this folder, navigate to ```\sdmc\luma\titles\0004000000125500```, and you should find files called ```code.ips```, ```exheader.bin```, and a folder called ```romfs```. In the Citra window, right-click on the installed copy of Ocarina of Time 3D, and choose ```Open Mods Location```. (If you haven't installed OoT3D, you can go to ```File->Open Citra Folder``` and then open up ```\load\mods\0004000000125500```.) Copy ```code.ips```, ```exheader.bin```, and ```romfs``` into this folder. Now, launch Majora's Mask 3D and enjoy your playthrough!

### Save Files
Right now, save files are shared between any playthroughs you create and the base game. This means that you are responsible for managing your own save files. If you are playing on a 3DS, check out [Checkpoint](https://github.com/FlagBrew/Checkpoint/releases), an easy-to-use homebrew save manager.
Expand All @@ -47,12 +47,11 @@ As a service to the player in this very long game, various tedious elements of t

Please be sure to explore the many customizable settings which are available when using the app! There are many options which can alter the length or difficulty of each playthrough.

Want to discuss the randomizer with others? Join our ~~[Discord server]()~~!
Want to discuss the randomizer with others? Join our [Discord server](https://discord.gg/73ZNdjbfFp)!

### Getting Stuck

~~With a game the size of _Majora's Mask 3D_, it's quite easy for players to get stuck in certain situations with no apparent path to progressing.
Before reporting an issue, please make sure to check out the [the Logic wiki for the original OoT Randomizer](https://wiki.ootrandomizer.com/index.php?title=Logic), the information there will apply to MM3D in nearly every situation.~~
Before reporting bugs, please check in the Discord to see if there is any apparent way of continuing.

You may also find a map tracker helpful, as these allow you to see all checks which are available with your current items, and check which ones you've gotten already. Some recommended trackers are EmoTracker, although keep in mind these were designed for the original MM Randomizer so there may be some slight discrepancies.

Expand All @@ -65,9 +64,9 @@ Install the 3DS packages from [devkitPro](https://devkitpro.org/wiki/Getting_Sta
A small portion of this project is done in python. If you decide to use the Msys2 console from devkitpro, you can install python using the command `pacman -S python` within Msys2.


In the root folder, use ```make``` to build ```MM3DR.3dsx```. Use ```make debug=1``` for extra debugging features, including extra items when starting a new file. In the case of problems, try using a ```make clean```.
In the root folder, use ```make``` to build ```basecode.ips```. Use ```make debug=1``` for extra debugging features, including extra items when starting a new file. In the case of problems, try using a ```make clean```.
When making changes to any code in the `code` directory, you must use `make clean` before recompiling if you want your changes to be picked up.
For faster compilation using multiple threads, you can use `make -j4` (in this example, the `4` is the number of threads being used).
For faster compilation using multiple threads, you can use `make -j4` (in this example, the `4` is the number of threads being used, you can use `-j` to use all available threads).

For quick debugging, you can create an environment variable named `citraPath` that links directly to your mods folder. For example, using WSL2 you could create a variable in your `.bashrc` as such:
`export citraPrint="/mnt/c/Users/User/AppData/Roaming/Citra/load/mods/0004000000125500/code.ips"`
Expand All @@ -78,6 +77,8 @@ Alternatively, you can use `copyto="path/to/code.ips"` as a command line argumen
make -j debug=1 copyto="/mnt/c/Users/User/AppData/Roaming/Citra/load/mods/0004000000125500/code.ips"
```

The debug flag is very helpful, as it will always give the same item that you can check to ensure overrides are working properly, and do not have to generate a seed every time if you are trying to create a patch for the game.

## Reporting Bugs

Let us know if you believe you have discovered a bug by posting in our Discord server, or by opening an issue. In the ~~[Discord]()~~, we have a list of currently known issues and fixes which are pending release, which we try to keep fairly up to date.
2 changes: 1 addition & 1 deletion code/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ include $(DEVKITARM)/3ds_rules
#---------------------------------------------------------------------------------
TARGET := $(notdir $(CURDIR))
BUILD := build
SOURCES := source source/asm source/lib source/common source/game source/rnd
SOURCES := source source/asm source/lib source/common source/game source/rnd source/game/ui/screens
DATA := data
INCLUDES := include
GRAPHICS := gfx
Expand Down
50 changes: 32 additions & 18 deletions code/include/game/actor.h
Original file line number Diff line number Diff line change
Expand Up @@ -33,14 +33,18 @@ namespace game::act {
DayTimer = 0x00F5,
// Elegy of Emptiness statue
ObjElegyStatue = 0x001F,
// En_Gm - Gorman Bros Race
// En_Im - Gorman Bros Race - Ingo
EnIn = 0x004D,
// Clear Tag (?)
ClearTag = 0x0073,
// Gorman
EnGm = 0x0074,
// En_Hs - Grog The Chicken Man
EnHs = 0x0076,
// Cursed Man Spider House
EnSsh = 0x0090,
// Powder Keg Trial Goron
EnGo = 0x00D5,
// [1] Deku Palace / Woodfall Temple moving platforms (after player lands on them)
ObjRailLift = 0x00D8,
// Shooting Gallery - Man
Expand All @@ -66,7 +70,7 @@ namespace game::act {
// Npc For Curiosity Shop Owner
NpcEnFsn = 0x0157,
// Npc For Boat Photography
NpcSwampPhotographer = 0x0158,
EnShn = 0x0158,
// NPC Postman
NpcEnPm = 0x0166,
// Goht
Expand All @@ -79,6 +83,8 @@ namespace game::act {
EnMaYto = 0x01AF,
// [7] Owl statue
ObjOwlStatue = 0x01B2,
// Gabora
EnKgy = 0x018F,
// [4] Old Lady from Bomb Shop
NpcEnBaba = 0x01C5,
// Granny
Expand All @@ -103,6 +109,8 @@ namespace game::act {
NpcEnBjt = 0x020C,
// [4] Bombers
NpcBombers = 0x020F,
// Keaton
EnKitan = 0x021B,
// [6] Sheikah Hint Stone (MM3D)
NpcHintStone = 0x0241,
// [6] New in MM3D. Shows up as sparkles and spawns an ice platform (actor 0x13E) when hit.
Expand Down Expand Up @@ -186,6 +194,21 @@ namespace game::act {
};
static_assert(sizeof(PosRot) == 0x14);

using ActorShadowFunc = void(Actor* self, void* lightMapper, GlobalContext* gctx);
struct ActorShape {
z3dVec3s rot;
s16 face;
float y_offset;
ActorShadowFunc* shadow_draw;
float shadow_scale;
u8 shadow_alpha;
u8 feet_floor_flags;
u8 field_16;
u8 field_17;
z3dVec3f feet_pos[2];
};
static_assert(sizeof(ActorShape) == 0x30);

struct Actor {
enum class Flag : u32 {
Targetable = 0x1,
Expand Down Expand Up @@ -251,16 +274,7 @@ namespace game::act {
DamageType damage_type;
u8 field_BE;
u8 field_BF;
// u16 field_C0;
// u16 angle;
z3dVec3s angle;
// u16 field_C4;
u8 gap_C6[2];
float field_C8;
u32 field_CC;
float field_D0;
u8 field_D4;
u8 gap_D5[27];
ActorShape actor_shape;
z3dVec3f field_F0;
u32 field_FC;
z3dVec3f field_100;
Expand Down Expand Up @@ -317,14 +331,14 @@ namespace game::act {

// Name courtesy of the OoT decomp project.
struct DynaPolyActor : Actor {
u32 dyna_poly_id;
float field_1FC;
u32 bg_id;
float push_force;
float field_200;
u16 field_204;
u8 field_206;
u32 dyna_poly_flags;
s16 y_rotation;
u32 transform_flags;
u8 interact_flags;
};
static_assert(sizeof(DynaPolyActor) == 0x20C);
static_assert(sizeof(DynaPolyActor) == 0x210);

struct DayTimerActor {
Actor common_actor;
Expand Down
185 changes: 185 additions & 0 deletions code/include/game/actors/boss/twinmold.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,185 @@
#ifndef _GAME_ACTORS_BOSS_TWINMOLD_H
#define _GAME_ACTORS_BOSS_TWINMOLD_H
#include <cstddef>

#include "common/types.h"
#include "common/utils.h"
#include "game/actor.h"
#include "game/collision.h"
#include "z3d/z3DVec.h"

namespace game {
class GlobalContext;
}

namespace game::act {

struct BossTwinmold : Actor {
// Probably incomplete.
enum class Status : u16 {
Buried = 0,
BlueRisingOutOfSand = 1,
// Also resets the hit counter.
RedBurrowingIntoSand = 3,

Flying = 4,
Unk6 = 6,
// The most commonly seen state for Blue Twinmold.
FlyingAimlessly = 7,

Unk8 = 8,
Unk9 = 9,

// These states are entered after receiving enough hits.
BlueStunnedByShootingEyes = 11,
BlueStunnedEyeOut = 12,
BlueStunnedBurrowingIntoSand = 13,

Stunned = 15,
StunnedAndOnGround = 16,

TauntingLink = 18,
AfterTaunting = 19,

// Only for Red Twinmold?
TauntingAndAttacking = 21,
AfterTauntingAndAttacking = 22,
FlyingAndAttacking = 23,

BeingGrabbedByLink = 24,
BeingChokedByLink = 25,

PreparingToRiseOutOfSand = 26,

// ?
AfterTaunting2 = 98,

Inactive = 100,
FirstTimeRisingOutOfSand = 102,

DyingStart = 200,
DyingExploding = 201,
DyingFallingToGround = 202,
DyingTouchedGround = 203,
};

void* resource;
Status status;
u16 some_status_change_countdown;
u16 field_200;
u16 field_202;
u16 frame_counter;
u16 field_206;
u16 field_208;
u16 field_20A;
u16 field_20C;
u8 gap_20E[14];
u16 field_21C;
u8 gap_21E[14];
z3dVec3f field_22C;
z3dVec3f field_238;
u8 gap244[1];
u8 field_245;
u8 gap246[3];
u8 gap_249[27];
float field_264;
float field_268;
signed int field_26C;
z3dVec3f field_270;
u8 gap27C[15748];
u32 field_4000;
u8 gap_4004[3448];
u32 field_4D7C;
u32 field_4D80;
u8 gap_4D84[56];
u32 status_anim;
u8 gap_4DC0[8];
float field_4DC8;
signed int field_4DCC;
u8 gap_4DD0[560];
u32 field_5000;
u8 gap_5004[3448];
z3dVec3f field_5D7C;
z3dVec3f field_5D88;
z3dVec3f field_5D94;
z3dVec3f field_5DA0;
u8 gap5DAC[120];
void (*field_5E24)(BossTwinmold*, GlobalContext*);
/// Points to Blue Twinmold for Red Twinmold, and vice versa.
BossTwinmold* other_twinmold_actor;
int field_5E2C;
u8 gap_5E30[12];
/// one for each segment of Twinmold's body,
/// starting at the head (0) and ending at the tail (13)
CollisionBodies<CollisionBodyCylinderCollection, 14> collision_1;
CollisionBodies<CollisionBodyCylinderCollection, 14> collision_main;
CollisionBodyCylinder collision_2;
u8 gap_6794[8];
u32 field_679C;
u16 field_67A0;
u8 gap_67A2[26];
float field_67BC;
u16 field_67C0;
signed int field_67C4;
u8 gap_67C8[44];
float field_67F4;
float field_67F8;
u8 gap_67FC[8];
int (*field_6804)(BossTwinmold*, GlobalContext*, act::Actor*);
u8 gap_6808[6136];
u32 field_8000;
u8 gap_8004[784];
char field_8314;
char field_8315;
char field_8316;
char field_8317;
u8 gap_8318[3304];
u32 field_9000;
u8 gap_9004[208];
char field_90D4;
__attribute__((aligned(4))) u8 field_90D8;
u8 gap_90D9[11];
u16 hit_counter;
u16 field_90E6;
u8 gap_90E8[12];
u32 field_90F4;
int field_90F8;
u8 gap_90FC[16];
u32 field_910C;
u32 field_9110;
u8 gap_9114[4];
u32 field_9118;
u8 gap_911C[8];
u32 field_9124;
u8 gap_9128[4];
float eye_scale;
float field_9130;
u8 gap_9134[8];
float field_913C;
u8 gap_9140[24];
z3dVec3f field_9158;
z3dVec3f field_9164;
u8 gap9170[36];
CollisionBodies<CollisionBodyCylinderCollection, 1> collision_eye;
CollisionBodies<CollisionBodyCylinderCollection, 1> collision_3;
u32 field_9274;
u8 gap_9278[308];
u32 field_93AC;
u8 gap_93B0[308];
CollisionBodies<CollisionBodyCylinderCollection, 1> collision_4;
CollisionBodies<CollisionBodyCylinderCollection, 1> collision_5;
z3dVec3f field_95C4;
u8 gap_95D0[8];
int field_95D8;
int field_95DC;
int field_95E0;
u8 gap_95E4[60];
int field_9620;
int field_9624;
};
static_assert(sizeof(BossTwinmold) == 0x9628);
static_assert(offsetof(BossTwinmold, other_twinmold_actor) == 0x5E28);
static_assert(offsetof(BossTwinmold, gap_93B0) == 0x93B0);

} // namespace game::act
#endif
Loading
Loading