diff --git a/Jenkinsfile b/Jenkinsfile index 38de3fab9e..1c10524d57 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -29,10 +29,10 @@ pipeline { // The ROMs are built in an order that maximizes compiler flags coverage in a "fail fast" approach. // Specifically we start with a retail ROM for BSS ordering, and make sure we cover all of // N64/GC/NTSC/PAL/MQ/DEBUG as quickly as possible. - stage('Build ntsc-1.2') { + stage('Build ntsc-1.0') { steps { script { - build('ntsc-1.2', 'oot-ntsc-1.2-us.z64') + build('ntsc-1.0', 'oot-ntsc-1.0-us.z64') } } } @@ -64,6 +64,13 @@ pipeline { } } } + stage('Build ntsc-1.2') { + steps { + script { + build('ntsc-1.2', 'oot-ntsc-1.2-us.z64') + } + } + } stage('Build gc-us') { steps { script { @@ -99,6 +106,13 @@ pipeline { } } } + stage('Build ntsc-1.1') { + steps { + script { + build('ntsc-1.1', 'oot-ntsc-1.1-us.z64') + } + } + } stage('Build gc-us-mq') { steps { script { diff --git a/Makefile b/Makefile index 2d14c549c3..67ec18b4c9 100644 --- a/Makefile +++ b/Makefile @@ -23,6 +23,8 @@ ORIG_COMPILER ?= 0 COMPILER ?= ido # Target game version. Ensure the corresponding input ROM is placed in baseroms/$(VERSION)/baserom.z64. # Currently the following versions are supported: +# ntsc-1.0 N64 NTSC 1.0 (Japan/US depending on REGION) +# ntsc-1.1 N64 NTSC 1.1 (Japan/US depending on REGION) # pal-1.0 N64 PAL 1.0 (Europe) # ntsc-1.2 N64 NTSC 1.2 (Japan/US depending on REGION) # pal-1.1 N64 PAL 1.1 (Europe) @@ -34,9 +36,6 @@ COMPILER ?= ido # gc-eu GameCube Europe/PAL # gc-eu-mq GameCube Europe/PAL Master Quest # gc-jp-ce GameCube Japan (Collector's Edition disc) -# The following versions are work-in-progress and not yet matching: -# ntsc-1.0 N64 NTSC 1.0 (Japan/US depending on REGION) -# ntsc-1.1 N64 NTSC 1.1 (Japan/US depending on REGION) VERSION ?= gc-eu-mq-dbg # Number of threads to extract and compress with. N_THREADS ?= $(shell nproc) @@ -62,13 +61,11 @@ ifeq ($(VERSION),ntsc-1.0) REGION ?= JP PLATFORM := N64 DEBUG := 0 - COMPARE := 0 else ifeq ($(VERSION),ntsc-1.1) REGIONAL_CHECKSUM := 1 REGION ?= JP PLATFORM := N64 DEBUG := 0 - COMPARE := 0 else ifeq ($(VERSION),pal-1.0) REGION ?= EU PLATFORM := N64 diff --git a/README.md b/README.md index b644b26183..59791e60a0 100644 --- a/README.md +++ b/README.md @@ -29,6 +29,8 @@ It builds the following versions: | Name | Build timestamp | Description | MD5 hash of input ROM(s) | |--------------|-------------------|-------------------------------------------|--------------------------| +| ntsc-1.0 | 98-10-21 04:56:31 | NTSC 1.0 (Japan/US) | `9f04c8e68534b870f707c247fa4b50fc`
`5bd1fe107bf8106b2ab6650abecd54d6` | +| ntsc-1.1 | 98-10-26 10:58:45 | NTSC 1.1 (Japan/US) | `1bf5f42b98c3e97948f01155f12e2d88`
`721fdcc6f5f34be55c43a807f2a16af4` | | pal-1.0 | 98-11-10 14:34:22 | PAL 1.0 (Europe) | `e040de91a74b61e3201db0e2323f768a` | | ntsc-1.2 | 98-11-12 18:17:03 | NTSC 1.2 (Japan/US) | `2258052847bdd056c8406a9ef6427f13`
`57a9719ad547c516342e1a15d5c28c3d` | | pal-1.1 | 98-11-18 17:36:49 | PAL 1.1 (Europe) | `d714580dd74c2c033f5e1b6dc0aeac77` | diff --git a/assets/audio/sequences/seq_0.prg.seq b/assets/audio/sequences/seq_0.prg.seq index e2e51f5b7e..602ed791c6 100644 --- a/assets/audio/sequences/seq_0.prg.seq +++ b/assets/audio/sequences/seq_0.prg.seq @@ -2408,7 +2408,11 @@ CHAN_0EDC: .layer LAYER_1029 /* 0x1029 [0xC6 0x2F ] */ instr SF0_INST_47 +#if OOT_VERSION < PAL_1_0 +/* 0x102B [0xCB 0x66 0x4C 0xF0 ] */ env ENVELOPE_664C, 240 +#else /* 0x102B [0xCB 0x66 0x4C 0xFF ] */ env ENVELOPE_664C, 255 +#endif /* 0x102F [0x7E 0x0C 0x6C ] */ notedv PITCH_B5, FRAMERATE_CONST(12, 15), 108 /* 0x1032 [0xFF ] */ end diff --git a/assets/audio/sequences/seq_109.prg.seq b/assets/audio/sequences/seq_109.prg.seq index f4d4247e6a..49b0dfb606 100644 --- a/assets/audio/sequences/seq_109.prg.seq +++ b/assets/audio/sequences/seq_109.prg.seq @@ -603,7 +603,9 @@ LAYER_0452: /* 0x046C [0xE9 0x0E ] */ notepri 0, 14 /* 0x046E [0xE5 0x01 ] */ reverbidx 1 /* 0x0470 [0xD4 0x28 ] */ reverb 40 +#if OOT_VERSION >= PAL_1_0 /* 0x0472 [0xC6 0x00 ] */ font Soundfont_0_ID +#endif /* 0x0474 [0xFC 0x01 0x56 ] */ call CHAN_0156 /* 0x0477 [0xFD 0x60 ] */ delay 96 /* 0x0479 [0xFC 0x01 0x56 ] */ call CHAN_0156 @@ -1147,7 +1149,7 @@ ENVELOPE_08BA: point 20, 20000 hang -#if !OOT_PAL_N64 +#if OOT_VERSION == NTSC_1_2 || PLATFORM_GC .filter FILTER_0932 filter 0, 0, 0, 0, 0, 0, 0, 0 diff --git a/assets/xml/audio/samplebanks/SampleBank_0.xml b/assets/xml/audio/samplebanks/SampleBank_0.xml index e90a084930..5de4e44b12 100644 --- a/assets/xml/audio/samplebanks/SampleBank_0.xml +++ b/assets/xml/audio/samplebanks/SampleBank_0.xml @@ -1,433 +1,436 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/xml/audio/samplebanks/SampleBank_2.xml b/assets/xml/audio/samplebanks/SampleBank_2.xml index 21e76424e2..05d2563d1a 100644 --- a/assets/xml/audio/samplebanks/SampleBank_2.xml +++ b/assets/xml/audio/samplebanks/SampleBank_2.xml @@ -1,4 +1,4 @@ - + diff --git a/assets/xml/audio/samplebanks/SampleBank_3.xml b/assets/xml/audio/samplebanks/SampleBank_3.xml index e6738f8b39..268db38821 100644 --- a/assets/xml/audio/samplebanks/SampleBank_3.xml +++ b/assets/xml/audio/samplebanks/SampleBank_3.xml @@ -1,8 +1,8 @@ - - - - - + + + + + diff --git a/assets/xml/audio/samplebanks/SampleBank_4.xml b/assets/xml/audio/samplebanks/SampleBank_4.xml index 8d68e285ff..11688e4bc7 100644 --- a/assets/xml/audio/samplebanks/SampleBank_4.xml +++ b/assets/xml/audio/samplebanks/SampleBank_4.xml @@ -1,8 +1,8 @@ - - - - - + + + + + diff --git a/assets/xml/audio/samplebanks/SampleBank_5.xml b/assets/xml/audio/samplebanks/SampleBank_5.xml index 6eb7356935..899efe7f9c 100644 --- a/assets/xml/audio/samplebanks/SampleBank_5.xml +++ b/assets/xml/audio/samplebanks/SampleBank_5.xml @@ -1,9 +1,9 @@ - - - - - - + + + + + + diff --git a/assets/xml/audio/samplebanks/SampleBank_6.xml b/assets/xml/audio/samplebanks/SampleBank_6.xml index e6971659b0..6b565dd112 100644 --- a/assets/xml/audio/samplebanks/SampleBank_6.xml +++ b/assets/xml/audio/samplebanks/SampleBank_6.xml @@ -1,10 +1,10 @@ - - - - - - - + + + + + + + diff --git a/assets/xml/audio/soundfonts/Soundfont_10.xml b/assets/xml/audio/soundfonts/Soundfont_10.xml index 578101fd4d..126488b548 100644 --- a/assets/xml/audio/soundfonts/Soundfont_10.xml +++ b/assets/xml/audio/soundfonts/Soundfont_10.xml @@ -5,16 +5,19 @@ - + + + + - - - - + + + + diff --git a/include/z64.h b/include/z64.h index 5779205b38..5154001d2f 100644 --- a/include/z64.h +++ b/include/z64.h @@ -389,12 +389,18 @@ ALIGNED(4) typedef struct PreNmiBuff { } PreNmiBuff; // size = 0x18 (actually osAppNMIBuffer is 0x40 bytes large but the rest is unused) typedef enum ViModeEditState { +#if OOT_VERSION < PAL_1_0 /* -2 */ VI_MODE_EDIT_STATE_NEGATIVE_2 = -2, /* -1 */ VI_MODE_EDIT_STATE_NEGATIVE_1, + /* 0 */ VI_MODE_EDIT_STATE_INACTIVE, + /* 1 */ VI_MODE_EDIT_STATE_2, // active, more adjustments + /* 2 */ VI_MODE_EDIT_STATE_3 // active, more adjustments, print comparison with NTSC LAN1 mode +#else /* 0 */ VI_MODE_EDIT_STATE_INACTIVE, /* 1 */ VI_MODE_EDIT_STATE_ACTIVE, /* 2 */ VI_MODE_EDIT_STATE_2, // active, more adjustments /* 3 */ VI_MODE_EDIT_STATE_3 // active, more adjustments, print comparison with NTSC LAN1 mode +#endif } ViModeEditState; typedef struct ViMode { diff --git a/include/z64actor.h b/include/z64actor.h index a1df8ef7e0..228de4bcd6 100644 --- a/include/z64actor.h +++ b/include/z64actor.h @@ -146,8 +146,9 @@ typedef struct ActorShape { // #define ACTOR_FLAG_10 (1 << 10) -// -#define ACTOR_FLAG_ENKUSA_CUT (1 << 11) +// A clump of grass (EN_KUSA) has been destroyed. +// This flag is used to communicate with the spawner actor (OBJ_MURE). +#define ACTOR_FLAG_GRASS_DESTROYED (1 << 11) // Actor will not shake when a quake occurs #define ACTOR_FLAG_IGNORE_QUAKE (1 << 12) @@ -155,11 +156,11 @@ typedef struct ActorShape { // #define ACTOR_FLAG_13 (1 << 13) -// -#define ACTOR_FLAG_14 (1 << 14) +// When hit by an arrow, the actor will be able to attach to the arrow and fly with it in the air +#define ACTOR_FLAG_CAN_ATTACH_TO_ARROW (1 << 14) -// -#define ACTOR_FLAG_15 (1 << 15) +// Actor is currently attached to an arrow and flying with it in the air +#define ACTOR_FLAG_ATTACHED_TO_ARROW (1 << 15) // Player automatically accepts a Talk Offer without needing to press the A button. // Player still has to meet all conditions to be able to receive a talk offer (for example, being in range). diff --git a/spec b/spec index 8777bb050a..ffc25c14b5 100644 --- a/spec +++ b/spec @@ -219,7 +219,9 @@ beginseg include "$(BUILD_DIR)/assets/audio/soundfonts/Soundfont_35.o" include "$(BUILD_DIR)/assets/audio/soundfonts/Soundfont_36.o" include "$(BUILD_DIR)/assets/audio/soundfonts/Soundfont_37.o" +#if OOT_VERSION >= PAL_1_0 include "$(BUILD_DIR)/assets/audio/audiobank_padding.o" +#endif endseg beginseg diff --git a/src/code/fault_n64.c b/src/code/fault_n64.c index 5321e64ce8..ab871602ce 100644 --- a/src/code/fault_n64.c +++ b/src/code/fault_n64.c @@ -1,6 +1,6 @@ #if PLATFORM_N64 -#pragma increment_block_number "ntsc-1.2:0 pal-1.0:0 pal-1.1:0" +#pragma increment_block_number "ntsc-1.0:0 ntsc-1.1:0 ntsc-1.2:128 pal-1.0:128 pal-1.1:128" #include "global.h" #include "fault.h" @@ -8,7 +8,7 @@ #include "stack.h" #include "terminal.h" -#pragma increment_block_number "ntsc-1.2:192 pal-1.0:192 pal-1.1:192" +#pragma increment_block_number "ntsc-1.0:192 ntsc-1.1:192 ntsc-1.2:96 pal-1.0:96 pal-1.1:96" typedef struct FaultMgr { OSThread thread; diff --git a/src/code/graph.c b/src/code/graph.c index 80561d5eba..e7c3a2d864 100644 --- a/src/code/graph.c +++ b/src/code/graph.c @@ -8,7 +8,7 @@ #define GFXPOOL_TAIL_MAGIC 0x5678 #pragma increment_block_number "gc-eu:128 gc-eu-mq:128 gc-jp:128 gc-jp-ce:128 gc-jp-mq:128 gc-us:128 gc-us-mq:128" \ - "ntsc-1.2:160 pal-1.0:160 pal-1.1:160" + "ntsc-1.0:192 ntsc-1.1:192 ntsc-1.2:192 pal-1.0:192 pal-1.1:192" /** * The time at which the previous `Graph_Update` ended. diff --git a/src/code/main.c b/src/code/main.c index 50b69bcf23..a0671605de 100644 --- a/src/code/main.c +++ b/src/code/main.c @@ -5,7 +5,7 @@ extern uintptr_t gSegments[NUM_SEGMENTS]; #pragma increment_block_number "gc-eu:252 gc-eu-mq:252 gc-jp:252 gc-jp-ce:252 gc-jp-mq:252 gc-us:252 gc-us-mq:252" \ - "ntsc-1.2:128 pal-1.0:128 pal-1.1:128" + "ntsc-1.0:128 ntsc-1.1:128 ntsc-1.2:128 pal-1.0:128 pal-1.1:128" extern struct PreNmiBuff* gAppNmiBufferPtr; extern struct Scheduler gScheduler; @@ -24,7 +24,7 @@ extern struct IrqMgr gIrqMgr; #endif #pragma increment_block_number "gc-eu:160 gc-eu-mq:160 gc-jp:160 gc-jp-ce:160 gc-jp-mq:160 gc-us:160 gc-us-mq:160" \ - "ntsc-1.2:148 pal-1.0:146 pal-1.1:146" + "ntsc-1.0:151 ntsc-1.1:151 ntsc-1.2:151 pal-1.0:149 pal-1.1:149" extern u8 _buffersSegmentEnd[]; diff --git a/src/code/sys_math3d.c b/src/code/sys_math3d.c index d1db06253c..9cf75240c3 100644 --- a/src/code/sys_math3d.c +++ b/src/code/sys_math3d.c @@ -6,7 +6,7 @@ #include "sys_math3d.h" #pragma increment_block_number "gc-eu:103 gc-eu-mq:103 gc-jp:103 gc-jp-ce:103 gc-jp-mq:103 gc-us:103 gc-us-mq:103" \ - "ntsc-1.2:79 pal-1.0:80 pal-1.1:80" + "ntsc-1.0:80 ntsc-1.1:80 ntsc-1.2:79 pal-1.0:80 pal-1.1:80" s32 Math3D_LineVsLineClosestTwoPoints(Vec3f* lineAPointA, Vec3f* lineAPointB, Vec3f* lineBPointA, Vec3f* lineBPointB, Vec3f* lineAClosestToB, Vec3f* lineBClosestToA); diff --git a/src/code/z_actor.c b/src/code/z_actor.c index e91ab50d84..45370e83bf 100644 --- a/src/code/z_actor.c +++ b/src/code/z_actor.c @@ -12,7 +12,7 @@ #include "assets/objects/object_bdoor/object_bdoor.h" #pragma increment_block_number "gc-eu:128 gc-eu-mq:128 gc-jp:128 gc-jp-ce:128 gc-jp-mq:128 gc-us:128 gc-us-mq:128" \ - "ntsc-1.2:0 pal-1.0:0 pal-1.1:0" + "ntsc-1.0:0 ntsc-1.1:0 ntsc-1.2:0 pal-1.0:0 pal-1.1:0" static CollisionPoly* sCurCeilingPoly; static s32 sCurCeilingBgId; @@ -2072,7 +2072,7 @@ s32 func_8002F9EC(PlayState* play, Actor* actor, CollisionPoly* poly, s32 bgId, } #pragma increment_block_number "gc-eu:22 gc-eu-mq:22 gc-jp:22 gc-jp-ce:22 gc-jp-mq:22 gc-us:22 gc-us-mq:22" \ - "ntsc-1.2:22 pal-1.0:22 pal-1.1:22" + "ntsc-1.0:22 ntsc-1.1:22 ntsc-1.2:22 pal-1.0:22 pal-1.1:22" // Local data used for Farore's Wind light (stored in BSS) LightInfo D_8015BC00; diff --git a/src/code/z_bgcheck.c b/src/code/z_bgcheck.c index 163b9a2b37..15d1364be7 100644 --- a/src/code/z_bgcheck.c +++ b/src/code/z_bgcheck.c @@ -1,7 +1,7 @@ #include "global.h" #include "terminal.h" -#pragma increment_block_number "ntsc-1.2:136" +#pragma increment_block_number "ntsc-1.0:136 ntsc-1.1:136 ntsc-1.2:136" u16 DynaSSNodeList_GetNextNodeIdx(DynaSSNodeList* nodeList); void BgCheck_GetStaticLookupIndicesFromPos(CollisionContext* colCtx, Vec3f* pos, Vec3i* sector); diff --git a/src/code/z_camera.c b/src/code/z_camera.c index 3daf0e65da..af1d69b1fe 100644 --- a/src/code/z_camera.c +++ b/src/code/z_camera.c @@ -5,7 +5,7 @@ #include "overlays/actors/ovl_En_Horse/z_en_horse.h" #pragma increment_block_number "gc-eu:192 gc-eu-mq:192 gc-jp:192 gc-jp-ce:192 gc-jp-mq:192 gc-us:192 gc-us-mq:192" \ - "ntsc-1.2:192 pal-1.0:192 pal-1.1:192" + "ntsc-1.0:192 ntsc-1.1:192 ntsc-1.2:192 pal-1.0:192 pal-1.1:192" s16 Camera_RequestSettingImpl(Camera* camera, s16 requestedSetting, s16 flags); s32 Camera_RequestModeImpl(Camera* camera, s16 requestedMode, u8 forceModeChange); @@ -3639,7 +3639,7 @@ s32 Camera_KeepOn3(Camera* camera) { } #pragma increment_block_number "gc-eu:128 gc-eu-mq:128 gc-jp:128 gc-jp-ce:128 gc-jp-mq:128 gc-us:128 gc-us-mq:128" \ - "ntsc-1.2:90 pal-1.0:88 pal-1.1:88" + "ntsc-1.0:93 ntsc-1.1:93 ntsc-1.2:93 pal-1.0:91 pal-1.1:91" s32 Camera_KeepOn4(Camera* camera) { static Vec3f D_8015BD50; diff --git a/src/code/z_collision_check.c b/src/code/z_collision_check.c index 05147f30b5..f2741865a9 100644 --- a/src/code/z_collision_check.c +++ b/src/code/z_collision_check.c @@ -16,7 +16,7 @@ #include "z_lib.h" #pragma increment_block_number "gc-eu:128 gc-eu-mq:128 gc-jp:128 gc-jp-ce:128 gc-jp-mq:128 gc-us:128 gc-us-mq:128" \ - "ntsc-1.2:96 pal-1.0:96 pal-1.1:96" + "ntsc-1.0:104 ntsc-1.1:104 ntsc-1.2:104 pal-1.0:104 pal-1.1:104" typedef s32 (*ColChkResetFunc)(PlayState*, Collider*); typedef void (*ColChkApplyFunc)(PlayState*, CollisionCheckContext*, Collider*); @@ -2225,7 +2225,7 @@ void CollisionCheck_ATTrisVsACCyl(PlayState* play, CollisionCheckContext* colChk } #pragma increment_block_number "gc-eu:252 gc-eu-mq:252 gc-jp:252 gc-jp-ce:252 gc-jp-mq:252 gc-us:252 gc-us-mq:252" \ - "ntsc-1.2:252 pal-1.0:252 pal-1.1:252" + "ntsc-1.0:252 ntsc-1.1:252 ntsc-1.2:252 pal-1.0:252 pal-1.1:252" void CollisionCheck_ATCylVsACQuad(PlayState* play, CollisionCheckContext* colChkCtx, Collider* atCol, Collider* acCol) { static TriNorm tri1; diff --git a/src/code/z_common_data.c b/src/code/z_common_data.c index 4de25ced8f..5dbf19588d 100644 --- a/src/code/z_common_data.c +++ b/src/code/z_common_data.c @@ -3,7 +3,7 @@ #include "versions.h" #pragma increment_block_number "gc-eu:128 gc-eu-mq:128 gc-jp:128 gc-jp-ce:128 gc-jp-mq:128 gc-us:128 gc-us-mq:128" \ - "ntsc-1.2:192 pal-1.0:192 pal-1.1:192" + "ntsc-1.0:192 ntsc-1.1:192 ntsc-1.2:192 pal-1.0:192 pal-1.1:192" ALIGNED(16) SaveContext gSaveContext; u32 D_8015FA88; diff --git a/src/code/z_debug.c b/src/code/z_debug.c index 8feacf15e1..f937b2d174 100644 --- a/src/code/z_debug.c +++ b/src/code/z_debug.c @@ -13,7 +13,7 @@ typedef struct InputCombo { } InputCombo; // size = 0x4 #pragma increment_block_number "gc-eu:192 gc-eu-mq:192 gc-jp:192 gc-jp-ce:192 gc-jp-mq:192 gc-us:192 gc-us-mq:192" \ - "ntsc-1.2:192 pal-1.0:192 pal-1.1:192" + "ntsc-1.0:192 ntsc-1.1:192 ntsc-1.2:192 pal-1.0:192 pal-1.1:192" RegEditor* gRegEditor; diff --git a/src/code/z_demo.c b/src/code/z_demo.c index 282e9b73cb..29668abf1a 100644 --- a/src/code/z_demo.c +++ b/src/code/z_demo.c @@ -124,8 +124,8 @@ u16 gCamAtSplinePointsAppliedFrame; u16 gCamEyePointAppliedFrame; u16 gCamAtPointAppliedFrame; -#pragma increment_block_number "gc-eu:186 gc-eu-mq:176 gc-jp:188 gc-jp-ce:188 gc-jp-mq:176 gc-us:188 gc-us-mq:176" \ - "ntsc-1.2:80 pal-1.0:80 pal-1.1:80" +#pragma increment_block_number "gc-eu:188 gc-eu-mq:176 gc-jp:188 gc-jp-ce:188 gc-jp-mq:176 gc-us:188 gc-us-mq:176" \ + "ntsc-1.0:80 ntsc-1.1:80 ntsc-1.2:80 pal-1.0:80 pal-1.1:80" // Cam ID to return to when a scripted cutscene is finished s16 sReturnToCamId; diff --git a/src/code/z_kaleido_scope_call.c b/src/code/z_kaleido_scope_call.c index 0b18477e5b..84b7ade063 100644 --- a/src/code/z_kaleido_scope_call.c +++ b/src/code/z_kaleido_scope_call.c @@ -1,5 +1,5 @@ #pragma increment_block_number "gc-eu:224 gc-eu-mq:224 gc-jp:224 gc-jp-ce:224 gc-jp-mq:224 gc-us:224 gc-us-mq:224" \ - "ntsc-1.2:224 pal-1.0:224 pal-1.1:224" + "ntsc-1.0:224 ntsc-1.1:224 ntsc-1.2:224 pal-1.0:224 pal-1.1:224" #include "global.h" #include "terminal.h" diff --git a/src/code/z_kankyo.c b/src/code/z_kankyo.c index 0cb9615e6d..beb80d8a52 100644 --- a/src/code/z_kankyo.c +++ b/src/code/z_kankyo.c @@ -1,5 +1,5 @@ -#pragma increment_block_number "gc-eu:240 gc-eu-mq:240 gc-jp:224 gc-jp-ce:224 gc-jp-mq:224 gc-us:224 gc-us-mq:224" \ - "ntsc-1.2:224 pal-1.0:248 pal-1.1:248" +#pragma increment_block_number "gc-eu:244 gc-eu-mq:244 gc-jp:224 gc-jp-ce:224 gc-jp-mq:224 gc-us:224 gc-us-mq:224" \ + "ntsc-1.0:224 ntsc-1.1:224 ntsc-1.2:224 pal-1.0:252 pal-1.1:252" #include "global.h" #include "ultra64.h" @@ -215,7 +215,7 @@ s16 sSunDepthTestX; s16 sSunDepthTestY; #pragma increment_block_number "gc-eu:240 gc-eu-mq:240 gc-jp:224 gc-jp-ce:224 gc-jp-mq:224 gc-us:224 gc-us-mq:224" \ - "ntsc-1.2:224 pal-1.0:240 pal-1.1:240" + "ntsc-1.0:224 ntsc-1.1:224 ntsc-1.2:224 pal-1.0:240 pal-1.1:240" LightNode* sNGameOverLightNode; LightInfo sNGameOverLightInfo; diff --git a/src/code/z_message.c b/src/code/z_message.c index a8560255be..916f051b22 100644 --- a/src/code/z_message.c +++ b/src/code/z_message.c @@ -8,7 +8,7 @@ #endif #pragma increment_block_number "gc-eu:0 gc-eu-mq:0 gc-jp:128 gc-jp-ce:128 gc-jp-mq:128 gc-us:128 gc-us-mq:128" \ - "ntsc-1.2:112 pal-1.0:128 pal-1.1:128" + "ntsc-1.0:96 ntsc-1.1:96 ntsc-1.2:112 pal-1.0:128 pal-1.1:128" #if !PLATFORM_GC #define OCARINA_BUTTON_A_PRIM_1_R 80 diff --git a/src/code/z_scene_table.c b/src/code/z_scene_table.c index d9e238e759..d8386c6887 100644 --- a/src/code/z_scene_table.c +++ b/src/code/z_scene_table.c @@ -1190,7 +1190,13 @@ void Scene_DrawConfigKokiriForest(PlayState* play) { spA3 = 255 - (u8)play->roomCtx.drawParams[0]; } else if (gSaveContext.sceneLayer == 6) { spA0 = play->roomCtx.drawParams[0] + 500; - } else if ((!IS_CUTSCENE_LAYER || LINK_IS_ADULT) && GET_EVENTCHKINF(EVENTCHKINF_07)) { + } else if ( +#if OOT_VERSION < PAL_1_0 + !IS_CUTSCENE_LAYER && GET_EVENTCHKINF(EVENTCHKINF_07) +#else + (!IS_CUTSCENE_LAYER || LINK_IS_ADULT) && GET_EVENTCHKINF(EVENTCHKINF_07) +#endif + ) { spA0 = 2150; } diff --git a/src/n64dd/z_n64dd.c b/src/n64dd/z_n64dd.c index a2fd113309..ddc7790116 100644 --- a/src/n64dd/z_n64dd.c +++ b/src/n64dd/z_n64dd.c @@ -6,7 +6,7 @@ #include "stack.h" #include "versions.h" -#pragma increment_block_number "ntsc-1.2:128 pal-1.0:128 pal-1.1:128" +#pragma increment_block_number "ntsc-1.0:128 ntsc-1.1:128 ntsc-1.2:128 pal-1.0:128 pal-1.1:128" typedef struct struct_801D9C30 { /* 0x000 */ s32 unk_000; // disk start diff --git a/src/overlays/actors/ovl_Boss_Ganon/z_boss_ganon.c b/src/overlays/actors/ovl_Boss_Ganon/z_boss_ganon.c index 06c4f0450a..a03d2f55d5 100644 --- a/src/overlays/actors/ovl_Boss_Ganon/z_boss_ganon.c +++ b/src/overlays/actors/ovl_Boss_Ganon/z_boss_ganon.c @@ -101,22 +101,22 @@ static ColliderCylinderInit sLightBallCylinderInit = { static u8 D_808E4C58[] = { 0, 12, 10, 12, 14, 16, 12, 14, 16, 12, 14, 16, 12, 14, 16, 10, 16, 14 }; static Vec3f sZeroVec = { 0.0f, 0.0f, 0.0f }; -#pragma increment_block_number "gc-eu:0 gc-eu-mq:0 gc-jp:0 gc-jp-ce:0 gc-jp-mq:0 gc-us:0 gc-us-mq:0 ntsc-1.2:0" \ - "pal-1.0:0 pal-1.1:0" +#pragma increment_block_number "gc-eu:0 gc-eu-mq:0 gc-jp:0 gc-jp-ce:0 gc-jp-mq:0 gc-us:0 gc-us-mq:0 ntsc-1.0:0" \ + "ntsc-1.1:0 ntsc-1.2:0 pal-1.0:0 pal-1.1:0" static EnGanonMant* sCape; // TODO: There's probably a way to match BSS ordering with less padding by spreading the variables out and moving // data around. It would be easier if we had more options for controlling BSS ordering in debug. #pragma increment_block_number "gc-eu:192 gc-eu-mq:192 gc-jp:192 gc-jp-ce:192 gc-jp-mq:192 gc-us:192 gc-us-mq:192" \ - "ntsc-1.2:128 pal-1.0:128 pal-1.1:128" + "ntsc-1.0:128 ntsc-1.1:128 ntsc-1.2:128 pal-1.0:128 pal-1.1:128" static s32 sSeed1; static s32 sSeed2; static s32 sSeed3; #pragma increment_block_number "gc-eu:192 gc-eu-mq:192 gc-jp:192 gc-jp-ce:192 gc-jp-mq:192 gc-us:192 gc-us-mq:192" \ - "ntsc-1.2:128 pal-1.0:128 pal-1.1:128" + "ntsc-1.0:128 ntsc-1.1:128 ntsc-1.2:128 pal-1.0:128 pal-1.1:128" static BossGanon* sGanondorf; diff --git a/src/overlays/actors/ovl_En_Arrow/z_en_arrow.c b/src/overlays/actors/ovl_En_Arrow/z_en_arrow.c index 34bc646bd6..3cec8313e6 100644 --- a/src/overlays/actors/ovl_En_Arrow/z_en_arrow.c +++ b/src/overlays/actors/ovl_En_Arrow/z_en_arrow.c @@ -149,7 +149,7 @@ void EnArrow_Destroy(Actor* thisx, PlayState* play) { Collider_DestroyQuad(play, &this->collider); if ((this->hitActor != NULL) && (this->hitActor->update != NULL)) { - this->hitActor->flags &= ~ACTOR_FLAG_15; + this->hitActor->flags &= ~ACTOR_FLAG_ATTACHED_TO_ARROW; } } @@ -287,11 +287,11 @@ void EnArrow_Fly(EnArrow* this, PlayState* play) { hitActor = this->collider.base.at; if ((hitActor->update != NULL) && !(this->collider.base.atFlags & AT_BOUNCED) && - (hitActor->flags & ACTOR_FLAG_14)) { + (hitActor->flags & ACTOR_FLAG_CAN_ATTACH_TO_ARROW)) { this->hitActor = hitActor; EnArrow_CarryActor(this, play); Math_Vec3f_Diff(&hitActor->world.pos, &this->actor.world.pos, &this->unk_250); - hitActor->flags |= ACTOR_FLAG_15; + hitActor->flags |= ACTOR_FLAG_ATTACHED_TO_ARROW; this->collider.base.atFlags &= ~AT_HIT; this->actor.speed /= 2.0f; this->actor.velocity.y /= 2.0f; @@ -353,14 +353,14 @@ void EnArrow_Fly(EnArrow* this, PlayState* play) { this->hitActor->world.pos.y = hitPoint.y + ((sp54.y <= hitPoint.y) ? 1.0f : -1.0f); this->hitActor->world.pos.z = hitPoint.z + ((sp54.z <= hitPoint.z) ? 1.0f : -1.0f); Math_Vec3f_Diff(&this->hitActor->world.pos, &this->actor.world.pos, &this->unk_250); - this->hitActor->flags &= ~ACTOR_FLAG_15; + this->hitActor->flags &= ~ACTOR_FLAG_ATTACHED_TO_ARROW; this->hitActor = NULL; } else { Math_Vec3f_Sum(&this->actor.world.pos, &this->unk_250, &this->hitActor->world.pos); } if (this->touchedPoly && (this->hitActor != NULL)) { - this->hitActor->flags &= ~ACTOR_FLAG_15; + this->hitActor->flags &= ~ACTOR_FLAG_ATTACHED_TO_ARROW; this->hitActor = NULL; } } else { diff --git a/src/overlays/actors/ovl_En_Bb/z_en_bb.c b/src/overlays/actors/ovl_En_Bb/z_en_bb.c index 1373821f66..3b26ad61d2 100644 --- a/src/overlays/actors/ovl_En_Bb/z_en_bb.c +++ b/src/overlays/actors/ovl_En_Bb/z_en_bb.c @@ -345,7 +345,7 @@ void EnBb_Init(Actor* thisx, PlayState* play) { this->flamePrimBlue = this->flameEnvColor.b = 255; thisx->world.pos.y += 50.0f; EnBb_SetupBlue(this); - thisx->flags |= ACTOR_FLAG_14; + thisx->flags |= ACTOR_FLAG_CAN_ATTACH_TO_ARROW; break; case ENBB_RED: thisx->naviEnemyId = NAVI_ENEMY_RED_BUBBLE; @@ -374,7 +374,7 @@ void EnBb_Init(Actor* thisx, PlayState* play) { EnBb_SetupWhite(play, this); EnBb_SetWaypoint(this, play); EnBb_FaceWaypoint(this); - thisx->flags |= ACTOR_FLAG_14; + thisx->flags |= ACTOR_FLAG_CAN_ATTACH_TO_ARROW; break; case ENBB_GREEN_BIG: this->path = this->actionState >> 4; @@ -1237,7 +1237,7 @@ void EnBb_Update(Actor* thisx, PlayState* play2) { if (this->actor.colChkInfo.damageEffect != 0xD) { this->actionFunc(this, play); if ((this->actor.params <= ENBB_BLUE) && (this->actor.speed >= -6.0f) && - ((this->actor.flags & ACTOR_FLAG_15) == 0)) { + !(this->actor.flags & ACTOR_FLAG_ATTACHED_TO_ARROW)) { Actor_MoveXZGravity(&this->actor); } if (this->moveMode == BBMOVE_NORMAL) { diff --git a/src/overlays/actors/ovl_En_Bili/z_en_bili.c b/src/overlays/actors/ovl_En_Bili/z_en_bili.c index f7bbd05f0c..73a8addd8f 100644 --- a/src/overlays/actors/ovl_En_Bili/z_en_bili.c +++ b/src/overlays/actors/ovl_En_Bili/z_en_bili.c @@ -8,7 +8,8 @@ #include "versions.h" #include "assets/objects/object_bl/object_bl.h" -#define FLAGS (ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_HOSTILE | ACTOR_FLAG_IGNORE_QUAKE | ACTOR_FLAG_14) +#define FLAGS \ + (ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_HOSTILE | ACTOR_FLAG_IGNORE_QUAKE | ACTOR_FLAG_CAN_ATTACH_TO_ARROW) void EnBili_Init(Actor* thisx, PlayState* play); void EnBili_Destroy(Actor* thisx, PlayState* play); @@ -251,7 +252,7 @@ void EnBili_SetupFrozen(EnBili* this, PlayState* play) { s32 i; Vec3f effectPos; - if (!(this->actor.flags & ACTOR_FLAG_15)) { + if (!(this->actor.flags & ACTOR_FLAG_ATTACHED_TO_ARROW)) { this->actor.gravity = -1.0f; } @@ -456,7 +457,7 @@ void EnBili_Recoil(EnBili* this, PlayState* play) { void EnBili_Burnt(EnBili* this, PlayState* play) { SkelAnime_Update(&this->skelAnime); - if (this->actor.flags & ACTOR_FLAG_15) { + if (this->actor.flags & ACTOR_FLAG_ATTACHED_TO_ARROW) { this->actor.colorFilterTimer = 20; } else { if (this->timer != 0) { @@ -477,7 +478,7 @@ void EnBili_Die(EnBili* this, PlayState* play) { s32 i; if (this->actor.draw != NULL) { - if (this->actor.flags & ACTOR_FLAG_15) { + if (this->actor.flags & ACTOR_FLAG_ATTACHED_TO_ARROW) { return; } this->actor.draw = NULL; @@ -533,7 +534,7 @@ void EnBili_Frozen(EnBili* this, PlayState* play) { this->timer--; } - if (!(this->actor.flags & ACTOR_FLAG_15)) { + if (!(this->actor.flags & ACTOR_FLAG_ATTACHED_TO_ARROW)) { this->actor.gravity = -1.0f; } diff --git a/src/overlays/actors/ovl_En_Crow/z_en_crow.c b/src/overlays/actors/ovl_En_Crow/z_en_crow.c index 54c261ccd9..c8319a7e79 100644 --- a/src/overlays/actors/ovl_En_Crow/z_en_crow.c +++ b/src/overlays/actors/ovl_En_Crow/z_en_crow.c @@ -1,7 +1,8 @@ #include "z_en_crow.h" #include "assets/objects/object_crow/object_crow.h" -#define FLAGS (ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_HOSTILE | ACTOR_FLAG_IGNORE_QUAKE | ACTOR_FLAG_14) +#define FLAGS \ + (ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_HOSTILE | ACTOR_FLAG_IGNORE_QUAKE | ACTOR_FLAG_CAN_ATTACH_TO_ARROW) void EnCrow_Init(Actor* thisx, PlayState* play); void EnCrow_Destroy(Actor* thisx, PlayState* play); @@ -175,7 +176,7 @@ void EnCrow_SetupDamaged(EnCrow* this, PlayState* play) { Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_RED, 255, COLORFILTER_BUFFLAG_OPA, 40); } - if (this->actor.flags & ACTOR_FLAG_15) { + if (this->actor.flags & ACTOR_FLAG_ATTACHED_TO_ARROW) { this->actor.speed = 0.0f; } @@ -329,7 +330,7 @@ void EnCrow_Damaged(EnCrow* this, PlayState* play) { Math_StepToF(&this->actor.speed, 0.0f, 0.5f); this->actor.colorFilterTimer = 40; - if (!(this->actor.flags & ACTOR_FLAG_15)) { + if (!(this->actor.flags & ACTOR_FLAG_ATTACHED_TO_ARROW)) { if (this->actor.colorFilterParams & 0x4000) { Math_ScaledStepToS(&this->actor.shape.rot.x, 0x4000, 0x200); this->actor.shape.rot.z += 0x1780; diff --git a/src/overlays/actors/ovl_En_Firefly/z_en_firefly.c b/src/overlays/actors/ovl_En_Firefly/z_en_firefly.c index e1d31a3213..eb1be1b9cf 100644 --- a/src/overlays/actors/ovl_En_Firefly/z_en_firefly.c +++ b/src/overlays/actors/ovl_En_Firefly/z_en_firefly.c @@ -9,7 +9,8 @@ #include "assets/objects/object_firefly/object_firefly.h" #include "overlays/actors/ovl_Obj_Syokudai/z_obj_syokudai.h" -#define FLAGS (ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_HOSTILE | ACTOR_FLAG_IGNORE_QUAKE | ACTOR_FLAG_14) +#define FLAGS \ + (ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_HOSTILE | ACTOR_FLAG_IGNORE_QUAKE | ACTOR_FLAG_CAN_ATTACH_TO_ARROW) void EnFirefly_Init(Actor* thisx, PlayState* play); void EnFirefly_Destroy(Actor* thisx, PlayState* play); @@ -423,7 +424,7 @@ void EnFirefly_Fall(EnFirefly* this, PlayState* play) { this->actor.colorFilterTimer = 40; SkelAnime_Update(&this->skelAnime); Math_StepToF(&this->actor.speed, 0.0f, 0.5f); - if (this->actor.flags & ACTOR_FLAG_15) { + if (this->actor.flags & ACTOR_FLAG_ATTACHED_TO_ARROW) { this->actor.colorFilterTimer = 40; } else { Math_ScaledStepToS(&this->actor.shape.rot.x, 0x6800, 0x200); @@ -687,7 +688,7 @@ void EnFirefly_Update(Actor* thisx, PlayState* play2) { this->actionFunc(this, play); - if (!(this->actor.flags & ACTOR_FLAG_15)) { + if (!(this->actor.flags & ACTOR_FLAG_ATTACHED_TO_ARROW)) { if ((this->actor.colChkInfo.health == 0) || (this->actionFunc == EnFirefly_Stunned)) { Actor_MoveXZGravity(&this->actor); } else { diff --git a/src/overlays/actors/ovl_En_Kusa/z_en_kusa.c b/src/overlays/actors/ovl_En_Kusa/z_en_kusa.c index f2882cad3d..5f865d2387 100644 --- a/src/overlays/actors/ovl_En_Kusa/z_en_kusa.c +++ b/src/overlays/actors/ovl_En_Kusa/z_en_kusa.c @@ -278,7 +278,7 @@ void EnKusa_SetupWaitForObject(EnKusa* this) { void EnKusa_WaitForObject(EnKusa* this, PlayState* play) { if (Object_IsLoaded(&play->objectCtx, this->requiredObjectSlot)) { - if (this->actor.flags & ACTOR_FLAG_ENKUSA_CUT) { + if (this->actor.flags & ACTOR_FLAG_GRASS_DESTROYED) { EnKusa_SetupCut(this); } else { EnKusa_SetupMain(this); @@ -317,7 +317,7 @@ void EnKusa_Main(EnKusa* this, PlayState* play) { } EnKusa_SetupCut(this); - this->actor.flags |= ACTOR_FLAG_ENKUSA_CUT; + this->actor.flags |= ACTOR_FLAG_GRASS_DESTROYED; } else { if (!(this->collider.base.ocFlags1 & OC1_TYPE_PLAYER) && (this->actor.xzDistToPlayer > 12.0f)) { this->collider.base.ocFlags1 |= OC1_TYPE_PLAYER; @@ -466,7 +466,7 @@ void EnKusa_SetupRegrow(EnKusa* this) { EnKusa_SetupAction(this, EnKusa_Regrow); EnKusa_SetScaleSmall(this); this->actor.shape.rot = this->actor.home.rot; - this->actor.flags &= ~ACTOR_FLAG_ENKUSA_CUT; + this->actor.flags &= ~ACTOR_FLAG_GRASS_DESTROYED; } void EnKusa_Regrow(EnKusa* this, PlayState* play) { @@ -490,7 +490,7 @@ void EnKusa_Update(Actor* thisx, PlayState* play) { this->actionFunc(this, play); - if (this->actor.flags & ACTOR_FLAG_ENKUSA_CUT) { + if (this->actor.flags & ACTOR_FLAG_GRASS_DESTROYED) { this->actor.shape.yOffset = -6.25f; } else { this->actor.shape.yOffset = 0.0f; @@ -501,7 +501,7 @@ void EnKusa_Draw(Actor* thisx, PlayState* play) { static Gfx* dLists[] = { gFieldBushDL, object_kusa_DL_000140, object_kusa_DL_000140 }; EnKusa* this = (EnKusa*)thisx; - if (this->actor.flags & ACTOR_FLAG_ENKUSA_CUT) { + if (this->actor.flags & ACTOR_FLAG_GRASS_DESTROYED) { Gfx_DrawDListOpa(play, object_kusa_DL_0002E0); } else { Gfx_DrawDListOpa(play, dLists[PARAMS_GET_U(thisx->params, 0, 2)]); diff --git a/src/overlays/actors/ovl_En_Po_Sisters/z_en_po_sisters.c b/src/overlays/actors/ovl_En_Po_Sisters/z_en_po_sisters.c index 6825c9bc68..c9e1bca7c6 100644 --- a/src/overlays/actors/ovl_En_Po_Sisters/z_en_po_sisters.c +++ b/src/overlays/actors/ovl_En_Po_Sisters/z_en_po_sisters.c @@ -10,7 +10,7 @@ #define FLAGS \ (ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_HOSTILE | ACTOR_FLAG_4 | ACTOR_FLAG_9 | ACTOR_FLAG_IGNORE_QUAKE | \ - ACTOR_FLAG_14) + ACTOR_FLAG_CAN_ATTACH_TO_ARROW) void EnPoSisters_Init(Actor* thisx, PlayState* play); void EnPoSisters_Destroy(Actor* thisx, PlayState* play); @@ -210,7 +210,7 @@ void EnPoSisters_Init(Actor* thisx, PlayState* play) { this->collider.base.ocFlags1 = OC1_ON | OC1_TYPE_PLAYER; func_80AD9AA8(this, play); } else { - this->actor.flags &= ~(ACTOR_FLAG_9 | ACTOR_FLAG_14); + this->actor.flags &= ~(ACTOR_FLAG_9 | ACTOR_FLAG_CAN_ATTACH_TO_ARROW); this->collider.elem.elemMaterial = ELEM_MATERIAL_UNK4; this->collider.elem.acDmgInfo.dmgFlags |= DMG_DEKU_NUT; this->collider.base.ocFlags1 = OC1_NONE; @@ -701,7 +701,7 @@ void func_80ADA9E8(EnPoSisters* this, PlayState* play) { } void func_80ADAAA4(EnPoSisters* this, PlayState* play) { - if (SkelAnime_Update(&this->skelAnime) && !(this->actor.flags & ACTOR_FLAG_15)) { + if (SkelAnime_Update(&this->skelAnime) && !(this->actor.flags & ACTOR_FLAG_ATTACHED_TO_ARROW)) { if (this->actor.colChkInfo.health != 0) { if (this->unk_194 != 0) { func_80AD96A4(this); diff --git a/src/overlays/actors/ovl_En_St/z_en_st.c b/src/overlays/actors/ovl_En_St/z_en_st.c index 89050a2ed3..e6d9fd670d 100644 --- a/src/overlays/actors/ovl_En_St/z_en_st.c +++ b/src/overlays/actors/ovl_En_St/z_en_st.c @@ -798,7 +798,7 @@ void EnSt_Init(Actor* thisx, PlayState* play) { this->actor.naviEnemyId = NAVI_ENEMY_SKULLTULA; } EnSt_CheckCeilingPos(this, play); - this->actor.flags |= ACTOR_FLAG_14; + this->actor.flags |= ACTOR_FLAG_CAN_ATTACH_TO_ARROW; this->actor.flags |= ACTOR_FLAG_SFX_FOR_PLAYER_BODY_HIT; EnSt_SetColliderScale(this); this->actor.gravity = 0.0f; @@ -1013,7 +1013,7 @@ void EnSt_Update(Actor* thisx, PlayState* play) { s32 pad; Color_RGBA8 color = { 0, 0, 0, 0 }; - if (this->actor.flags & ACTOR_FLAG_15) { + if (this->actor.flags & ACTOR_FLAG_ATTACHED_TO_ARROW) { SkelAnime_Update(&this->skelAnime); } else if (!EnSt_CheckColliders(this, play)) { // no collision has been detected. diff --git a/src/overlays/actors/ovl_En_Xc/z_en_xc.c b/src/overlays/actors/ovl_En_Xc/z_en_xc.c index 0f373e95af..14b68c5b0c 100644 --- a/src/overlays/actors/ovl_En_Xc/z_en_xc.c +++ b/src/overlays/actors/ovl_En_Xc/z_en_xc.c @@ -14,8 +14,8 @@ #include "assets/scenes/dungeons/ice_doukutu/ice_doukutu_scene.h" #include "terminal.h" -#pragma increment_block_number "gc-eu:0 gc-eu-mq:0 gc-jp:0 gc-jp-ce:0 gc-jp-mq:0 gc-us:0 gc-us-mq:0 ntsc-1.2:0" \ - "pal-1.0:0 pal-1.1:0" +#pragma increment_block_number "gc-eu:0 gc-eu-mq:0 gc-jp:0 gc-jp-ce:0 gc-jp-mq:0 gc-us:0 gc-us-mq:0 ntsc-1.0:0" \ + "ntsc-1.1:0 ntsc-1.2:0 pal-1.0:0 pal-1.1:0" #define FLAGS ACTOR_FLAG_4 @@ -1397,7 +1397,7 @@ void func_80B3F3D8(void) { } #pragma increment_block_number "gc-eu:64 gc-eu-mq:64 gc-jp:64 gc-jp-ce:64 gc-jp-mq:64 gc-us:64 gc-us-mq:64" \ - "ntsc-1.2:64 pal-1.0:64 pal-1.1:64" + "ntsc-1.0:64 ntsc-1.1:64 ntsc-1.2:64 pal-1.0:64 pal-1.1:64" void EnXc_PlayDiveSFX(Vec3f* src, PlayState* play) { static Vec3f D_80B42DA0; diff --git a/src/overlays/actors/ovl_Fishing/z_fishing.c b/src/overlays/actors/ovl_Fishing/z_fishing.c index 588ddc77e1..64d95171f4 100644 --- a/src/overlays/actors/ovl_Fishing/z_fishing.c +++ b/src/overlays/actors/ovl_Fishing/z_fishing.c @@ -35,8 +35,8 @@ #include "cic6105.h" #endif -#pragma increment_block_number "gc-eu:177 gc-eu-mq:177 gc-jp:177 gc-jp-ce:177 gc-jp-mq:177 gc-us:177 gc-us-mq:177" \ - "ntsc-1.2:128 pal-1.0:128 pal-1.1:128" +#pragma increment_block_number "gc-eu:180 gc-eu-mq:180 gc-jp:180 gc-jp-ce:180 gc-jp-mq:180 gc-us:180 gc-us-mq:180" \ + "ntsc-1.0:128 ntsc-1.1:128 ntsc-1.2:128 pal-1.0:128 pal-1.1:128" #define FLAGS ACTOR_FLAG_4 diff --git a/src/overlays/actors/ovl_Obj_Mure/z_obj_mure.c b/src/overlays/actors/ovl_Obj_Mure/z_obj_mure.c index d41108174a..635ca3c4a8 100644 --- a/src/overlays/actors/ovl_Obj_Mure/z_obj_mure.c +++ b/src/overlays/actors/ovl_Obj_Mure/z_obj_mure.c @@ -161,7 +161,7 @@ void ObjMure_SpawnActors0(ObjMure* this, PlayState* play) { Actor_Spawn(&play->actorCtx, play, sSpawnActorIds[this->type], pos.x, pos.y, pos.z, actor->world.rot.x, actor->world.rot.y, actor->world.rot.z, sSpawnParams[this->type]); if (this->children[i] != NULL) { - this->children[i]->flags |= ACTOR_FLAG_ENKUSA_CUT; + this->children[i]->flags |= ACTOR_FLAG_GRASS_DESTROYED; this->children[i]->room = actor->room; } else { PRINTF("warning 発生失敗 (%s %d)\n", "../z_obj_mure.c", 359); @@ -262,7 +262,7 @@ void ObjMure_CheckChildren(ObjMure* this, PlayState* play) { if (this->children[i] != NULL) { if (this->childrenStates[i] == OBJMURE_CHILD_STATE_0) { if (this->children[i]->update != NULL) { - if (this->children[i]->flags & ACTOR_FLAG_ENKUSA_CUT) { + if (this->children[i]->flags & ACTOR_FLAG_GRASS_DESTROYED) { this->childrenStates[i] = OBJMURE_CHILD_STATE_2; } } else { diff --git a/src/overlays/actors/ovl_player_actor/z_player.c b/src/overlays/actors/ovl_player_actor/z_player.c index 0f2559ad60..e9e4bbbed0 100644 --- a/src/overlays/actors/ovl_player_actor/z_player.c +++ b/src/overlays/actors/ovl_player_actor/z_player.c @@ -343,21 +343,21 @@ void Player_Action_CsAction(Player* this, PlayState* play); // .bss part 1 #pragma increment_block_number "gc-eu:128 gc-eu-mq:128 gc-jp:128 gc-jp-ce:128 gc-jp-mq:128 gc-us:128 gc-us-mq:128" \ - "ntsc-1.2:128 pal-1.0:128 pal-1.1:128" + "ntsc-1.0:64 ntsc-1.1:128 ntsc-1.2:128 pal-1.0:128 pal-1.1:128" static s32 D_80858AA0; // TODO: There's probably a way to match BSS ordering with less padding by spreading the variables out and moving // data around. It would be easier if we had more options for controlling BSS ordering in debug. #pragma increment_block_number "gc-eu:192 gc-eu-mq:192 gc-jp:192 gc-jp-ce:192 gc-jp-mq:192 gc-us:192 gc-us-mq:192" \ - "ntsc-1.2:192 pal-1.0:192 pal-1.1:192" + "ntsc-1.0:192 ntsc-1.1:128 ntsc-1.2:192 pal-1.0:192 pal-1.1:192" static s32 sSavedCurrentMask; static Vec3f sInteractWallCheckResult; static Input* sControlInput; #pragma increment_block_number "gc-eu:192 gc-eu-mq:192 gc-jp:160 gc-jp-ce:160 gc-jp-mq:160 gc-us:160 gc-us-mq:160" \ - "ntsc-1.2:128 pal-1.0:128 pal-1.1:128" + "ntsc-1.0:128 ntsc-1.1:192 ntsc-1.2:128 pal-1.0:128 pal-1.1:128" // .data diff --git a/src/overlays/effects/ovl_Effect_Ss_En_Ice/z_eff_ss_en_ice.c b/src/overlays/effects/ovl_Effect_Ss_En_Ice/z_eff_ss_en_ice.c index 5351e864ab..4a2d5a584c 100644 --- a/src/overlays/effects/ovl_Effect_Ss_En_Ice/z_eff_ss_en_ice.c +++ b/src/overlays/effects/ovl_Effect_Ss_En_Ice/z_eff_ss_en_ice.c @@ -5,6 +5,7 @@ */ #include "z_eff_ss_en_ice.h" +#include "versions.h" #include "assets/objects/gameplay_keep/gameplay_keep.h" #define rLifespan regs[0] @@ -133,9 +134,9 @@ void EffectSsEnIce_Draw(PlayState* play, u32 index, EffectSs* this) { } void EffectSsEnIce_UpdateFlying(PlayState* play, u32 index, EffectSs* this) { - s16 rand; - +#if OOT_VERSION >= NTSC_1_1 if ((this->actor != NULL) && (this->actor->update != NULL)) { +#endif if ((this->life >= 9) && (this->actor->colorFilterTimer != 0) && !(this->actor->colorFilterParams & 0xC000)) { this->pos.x = this->actor->world.pos.x + this->vec.x; this->pos.y = this->actor->world.pos.y + this->vec.y; @@ -147,9 +148,11 @@ void EffectSsEnIce_UpdateFlying(PlayState* play, u32 index, EffectSs* this) { this->accel.y = -1.5f; this->velocity.y = 5.0f; } +#if OOT_VERSION >= NTSC_1_1 } else { if (this->life >= 9) { - rand = Rand_CenteredFloat(65535.0f); + s16 rand = Rand_CenteredFloat(65535.0f); + this->accel.x = Math_SinS(rand) * (Rand_ZeroOne() + 1.0f); this->accel.z = Math_CosS(rand) * (Rand_ZeroOne() + 1.0f); this->life = 8; @@ -157,6 +160,7 @@ void EffectSsEnIce_UpdateFlying(PlayState* play, u32 index, EffectSs* this) { this->velocity.y = 5.0f; } } +#endif } void EffectSsEnIce_Update(PlayState* play, u32 index, EffectSs* this) { diff --git a/src/overlays/effects/ovl_Effect_Ss_Kakera/z_eff_ss_kakera.c b/src/overlays/effects/ovl_Effect_Ss_Kakera/z_eff_ss_kakera.c index 27d536e1d0..63088f5cf9 100644 --- a/src/overlays/effects/ovl_Effect_Ss_Kakera/z_eff_ss_kakera.c +++ b/src/overlays/effects/ovl_Effect_Ss_Kakera/z_eff_ss_kakera.c @@ -5,6 +5,7 @@ */ #include "z_eff_ss_kakera.h" +#include "versions.h" #define rReg0 regs[0] #define rGravity regs[1] @@ -54,7 +55,11 @@ u32 EffectSsKakera_Init(PlayState* play, u32 index, EffectSs* this, void* initPa } else { PRINTF("shape_modelがNULL\n"); +#if OOT_VERSION < NTSC_1_1 + LogUtils_HungupThread("../z_eff_kakera.c", 175); +#else LogUtils_HungupThread("../z_eff_kakera.c", 178); +#endif } this->draw = EffectSsKakera_Draw; diff --git a/src/overlays/gamestates/ovl_select/z_select.c b/src/overlays/gamestates/ovl_select/z_select.c index 1b1684f1ae..072622a8a2 100644 --- a/src/overlays/gamestates/ovl_select/z_select.c +++ b/src/overlays/gamestates/ovl_select/z_select.c @@ -63,7 +63,6 @@ void func_80800B08_unknown(MapSelectState* this, s32 arg1) { } #endif -// "Translation" (Actual name) static SceneSelectEntry sScenes[] = { { " 1:SPOT00", MapSelect_LoadGame, ENTR_HYRULE_FIELD_0 }, { " 2:SPOT01", MapSelect_LoadGame, ENTR_KAKARIKO_VILLAGE_0 }, @@ -84,228 +83,189 @@ static SceneSelectEntry sScenes[] = { { "17:SPOT17", MapSelect_LoadGame, ENTR_DEATH_MOUNTAIN_CRATER_0 }, { "18:SPOT18", MapSelect_LoadGame, ENTR_GORON_CITY_0 }, { "19:SPOT20", MapSelect_LoadGame, ENTR_LON_LON_RANCH_0 }, - // "20: Chamber of Time" - { "20:" GFXP_HIRAGANA "トキノマ", MapSelect_LoadGame, ENTR_TEMPLE_OF_TIME_0 }, - // "21: Chamber of the Sages" - { "21:" GFXP_HIRAGANA "ケンジャノマ", MapSelect_LoadGame, ENTR_CHAMBER_OF_THE_SAGES_0 }, - // "22: Target Range" - { "22:" GFXP_HIRAGANA "シャテキジョウ", MapSelect_LoadGame, ENTR_SHOOTING_GALLERY_0 }, - // "23: Hyrule Garden Game" - { "23:" GFXP_KATAKANA "ハイラル" GFXP_HIRAGANA "ニワ" GFXP_KATAKANA "ゲーム", MapSelect_LoadGame, + { "20:" T(GFXP_HIRAGANA "トキノマ", "Chamber of Time"), MapSelect_LoadGame, ENTR_TEMPLE_OF_TIME_0 }, + { "21:" T(GFXP_HIRAGANA "ケンジャノマ", "Chamber of the Sages"), MapSelect_LoadGame, ENTR_CHAMBER_OF_THE_SAGES_0 }, + { "22:" T(GFXP_HIRAGANA "シャテキジョウ", "Target Range"), MapSelect_LoadGame, ENTR_SHOOTING_GALLERY_0 }, + { "23:" T(GFXP_KATAKANA "ハイラル" GFXP_HIRAGANA "ニワ" GFXP_KATAKANA "ゲーム", "Hyrule Garden Game"), MapSelect_LoadGame, ENTR_CASTLE_COURTYARD_GUARDS_DAY_0 }, - // "24: Grave Dive Hole" - { "24:" GFXP_HIRAGANA "ハカシタトビコミアナ", MapSelect_LoadGame, ENTR_REDEAD_GRAVE_0 }, - // "25: Grave Dive Hole 2" - { "25:" GFXP_HIRAGANA "ハカシタトビコミアナ 2", MapSelect_LoadGame, ENTR_GRAVE_WITH_FAIRYS_FOUNTAIN_0 }, - // "26: Royal Family's Grave" - { "26:" GFXP_HIRAGANA "オウケ ノ ハカアナ", MapSelect_LoadGame, ENTR_ROYAL_FAMILYS_TOMB_0 }, - // "27: Great Fairy's Fountain" - { "27:" GFXP_HIRAGANA "ダイヨウセイノイズミ", MapSelect_LoadGame, ENTR_GREAT_FAIRYS_FOUNTAIN_MAGIC_0 }, - // "28: Fairy Dive Hole" - { "28:" GFXP_HIRAGANA "トビコミ ヨウセイ アナ", MapSelect_LoadGame, ENTR_FAIRYS_FOUNTAIN_0 }, - // "29: Magic Stone Fairy's Fountain" - { "29:" GFXP_HIRAGANA "マホウセキ ヨウセイノイズミ", MapSelect_LoadGame, ENTR_GREAT_FAIRYS_FOUNTAIN_SPELLS_0 }, - // "30: Final Battle With Ganon" - { "30:" GFXP_KATAKANA "ガノン" GFXP_HIRAGANA "サイシュウセン", MapSelect_LoadGame, ENTR_GANONS_TOWER_COLLAPSE_EXTERIOR_0 }, - // "31: Hyrule Inner Garden" - { "31:" GFXP_KATAKANA "ハイラル" GFXP_HIRAGANA "ナカニワ", MapSelect_LoadGame, ENTR_CASTLE_COURTYARD_ZELDA_0 }, - // "32: Fishing" - { "32:" GFXP_HIRAGANA "ツリボリ", MapSelect_LoadGame, ENTR_FISHING_POND_0 }, - // "33: Bombchu Bowling" - { "33:" GFXP_KATAKANA "ボムチュウボーリング", MapSelect_LoadGame, ENTR_BOMBCHU_BOWLING_ALLEY_0 }, - // "34: Lon Lon Ranch - Storehouse 1" (Talon's House) - { "34:" GFXP_KATAKANA "ロンロン" GFXP_HIRAGANA "ボクジョウ ソウコ 1", MapSelect_LoadGame, ENTR_LON_LON_BUILDINGS_0 }, - // "35: Lon Lon Ranch - Storehouse 2" (Ranch Silo) - { "35:" GFXP_KATAKANA "ロンロン" GFXP_HIRAGANA "ボクジョウ ソウコ 2", MapSelect_LoadGame, ENTR_LON_LON_BUILDINGS_1 }, - // "36: Lookout Hut" - { "36:" GFXP_HIRAGANA "ミハリ ゴヤ", MapSelect_LoadGame, ENTR_MARKET_GUARD_HOUSE_0 }, - // "37: Magic Potion Shop" - { "37:" GFXP_HIRAGANA "マホウ ノ クスリヤ", MapSelect_LoadGame, ENTR_POTION_SHOP_GRANNY_0 }, - // "38: Treasure Chest Shop" - { "38:" GFXP_HIRAGANA "タカラバコヤ", MapSelect_LoadGame, ENTR_TREASURE_BOX_SHOP_0 }, - // "39: Gold Skulltula House" - { "39:" GFXP_HIRAGANA "キン " GFXP_KATAKANA "スタルチュラ ハウス", MapSelect_LoadGame, ENTR_HOUSE_OF_SKULLTULA_0 }, - // "40: Castle Town - Entrance" (Market Entrance) - { "40:" GFXP_HIRAGANA "ジョウカマチ イリグチ", MapSelect_LoadGame, ENTR_MARKET_ENTRANCE_DAY_0 }, - // "41: Castle Town" (Market) - { "41:" GFXP_HIRAGANA "ジョウカマチ", MapSelect_LoadGame, ENTR_MARKET_DAY_0 }, - // "42: Back Alley" (Back Alley) - { "42:" GFXP_HIRAGANA "ウラロジ", MapSelect_LoadGame, ENTR_BACK_ALLEY_DAY_0 }, - // "43: In Front of the Temple of Time" (Temple of Time Exterior) - { "43:" GFXP_HIRAGANA "トキノシンデン マエ", MapSelect_LoadGame, ENTR_TEMPLE_OF_TIME_EXTERIOR_DAY_0 }, - // "44: Link's House" - { "44:" GFXP_HIRAGANA "リンクノイエ", MapSelect_LoadGame, ENTR_LINKS_HOUSE_0 }, - // "45: Kakariko Village Row House" - { "45:" GFXP_KATAKANA "カカリコ" GFXP_HIRAGANA "ムラノナガヤ", MapSelect_LoadGame, ENTR_KAKARIKO_CENTER_GUEST_HOUSE_0 }, - // "46: Back Alley House" - { "46:" GFXP_HIRAGANA "ウラロジノ イエ", MapSelect_LoadGame, ENTR_BACK_ALLEY_HOUSE_0 }, - // "47: Kokiri Village - Know-It-All Brothers' House" - { "47:" GFXP_HIRAGANA "コキリノムラ モノシリキョウダイノイエ", MapSelect_LoadGame, ENTR_KNOW_IT_ALL_BROS_HOUSE_0 }, - // "48: Kokiri Village - Twins' House" - { "48:" GFXP_HIRAGANA "コキリノムラ フタゴノイエ", MapSelect_LoadGame, ENTR_TWINS_HOUSE_0 }, - // "49: Kokiri Village - Mido's House" - { "49:" GFXP_HIRAGANA "コキリノムラ " GFXP_KATAKANA "ミド" GFXP_HIRAGANA "ノイエ", MapSelect_LoadGame, ENTR_MIDOS_HOUSE_0 }, - // "50: Kokiri Village - Saria's House" - { "50:" GFXP_HIRAGANA "コキリノムラ " GFXP_KATAKANA "サリア" GFXP_HIRAGANA "ノイエ", MapSelect_LoadGame, ENTR_SARIAS_HOUSE_0 }, - // "51: Stable" - { "51:" GFXP_HIRAGANA "ウマゴヤ", MapSelect_LoadGame, ENTR_STABLE_0 }, - // "52: Grave Keeper's House" - { "52:" GFXP_HIRAGANA "ハカモリノイエ", MapSelect_LoadGame, ENTR_GRAVEKEEPERS_HUT_0 }, - // "53: Back Alley - Dog Lady's House" - { "53:" GFXP_HIRAGANA "ウラロジ イヌオバサンノイエ", MapSelect_LoadGame, ENTR_DOG_LADY_HOUSE_0 }, - // "54: Kakariko Village - Impa's House" - { "54:" GFXP_HIRAGANA "カカリコムラ " GFXP_KATAKANA "インパ" GFXP_HIRAGANA "ノイエ", MapSelect_LoadGame, ENTR_IMPAS_HOUSE_0 }, - // "55: Hylia Laboratory" - { "55:" GFXP_KATAKANA "ハイリア" GFXP_HIRAGANA " ケンキュウジョ", MapSelect_LoadGame, ENTR_LAKESIDE_LABORATORY_0 }, - // "56: Tent" - { "56:" GFXP_KATAKANA "テント", MapSelect_LoadGame, ENTR_CARPENTERS_TENT_0 }, - // "57: Shield Shop" - { "57:" GFXP_HIRAGANA "タテノミセ", MapSelect_LoadGame, ENTR_BAZAAR_0 }, - // "58: Kokiri Shop" - { "58:" GFXP_HIRAGANA "コキリゾクノミセ", MapSelect_LoadGame, ENTR_KOKIRI_SHOP_0 }, - // "59: Goron Shop" - { "59:" GFXP_KATAKANA "ゴロン" GFXP_HIRAGANA "ノミセ", MapSelect_LoadGame, ENTR_GORON_SHOP_0 }, - // "60: Zora Shop" - { "60:" GFXP_KATAKANA "ゾーラ" GFXP_HIRAGANA "ノミセ", MapSelect_LoadGame, ENTR_ZORA_SHOP_0 }, - // "61: Kakariko Village - Potion Shop" - { "61:" GFXP_KATAKANA "カカリコ" GFXP_HIRAGANA "ムラ クスリヤ", MapSelect_LoadGame, ENTR_POTION_SHOP_KAKARIKO_0 }, - // "62: Castle Town - Potion Shop" - { "62:" GFXP_HIRAGANA "ジョウカマチ クスリヤ", MapSelect_LoadGame, ENTR_POTION_SHOP_MARKET_0 }, - // "63: Back Alley - Night Shop" - { "63:" GFXP_HIRAGANA "ウラロジ ヨルノミセ", MapSelect_LoadGame, ENTR_BOMBCHU_SHOP_0 }, - // "64: Mask Shop" - { "64:" GFXP_HIRAGANA "オメンヤ", MapSelect_LoadGame, ENTR_HAPPY_MASK_SHOP_0 }, - // "65: Gerudo Training Area" - { "65:" GFXP_KATAKANA "ゲルド" GFXP_HIRAGANA "ノシュウレンジョウ", MapSelect_LoadGame, ENTR_GERUDO_TRAINING_GROUND_0 }, - // "66: Fairy Tree Dungeon" - { "66:" GFXP_HIRAGANA "ヨウセイノキノ " GFXP_KATAKANA "ダンジョン", MapSelect_LoadGame, ENTR_DEKU_TREE_0 }, - // "67: Fairy Tree Dungeon - Boss" - { "67:" GFXP_HIRAGANA "ヨウセイノキノ " GFXP_KATAKANA "ダンジョン ボス", MapSelect_LoadGame, ENTR_DEKU_TREE_BOSS_0 }, - // "68: Dondogo Dungeon" - { "68:" GFXP_KATAKANA "ドドンゴ ダンジョン", MapSelect_LoadGame, ENTR_DODONGOS_CAVERN_0 }, - // "69: Dondogo Dungeon - Boss" - { "69:" GFXP_KATAKANA "ドドンゴ ダンジョン ボス", MapSelect_LoadGame, ENTR_DODONGOS_CAVERN_BOSS_0 }, - // "70: Giant Fish Dungeon" - { "70:" GFXP_HIRAGANA "キョダイギョ " GFXP_KATAKANA "ダンジョン", MapSelect_LoadGame, ENTR_JABU_JABU_0 }, - // "71: Giant Fish Dungeon - Boss" - { "71:" GFXP_HIRAGANA "キョダイギョ " GFXP_KATAKANA "ダンジョン ボス", MapSelect_LoadGame, ENTR_JABU_JABU_BOSS_0 }, - // "72: Forest Temple" - { "72:" GFXP_HIRAGANA "モリノシンデン", MapSelect_LoadGame, ENTR_FOREST_TEMPLE_0 }, - // "73: Forest Temple - Boss" - { "73:" GFXP_HIRAGANA "モリノシンデン " GFXP_KATAKANA "ボス", MapSelect_LoadGame, ENTR_FOREST_TEMPLE_BOSS_0 }, - // "74: Dungeon Below the Well" - { "74:" GFXP_HIRAGANA "イドシタ " GFXP_KATAKANA "ダンジョン", MapSelect_LoadGame, ENTR_BOTTOM_OF_THE_WELL_0 }, - // "75: Dungeon Beneath the Graves" - { "75:" GFXP_HIRAGANA "ハカシタ " GFXP_KATAKANA "ダンジョン", MapSelect_LoadGame, ENTR_SHADOW_TEMPLE_0 }, - // "76: Dungeon Beneath the Graves - Boss" - { "76:" GFXP_HIRAGANA "ハカシタ " GFXP_KATAKANA "ダンジョン ボス", MapSelect_LoadGame, ENTR_SHADOW_TEMPLE_BOSS_0 }, - // "77: Fire Temple" - { "77:" GFXP_HIRAGANA "ヒノシンデン", MapSelect_LoadGame, ENTR_FIRE_TEMPLE_0 }, - // "78: Fire Temple - Boss" - { "78:" GFXP_HIRAGANA "ヒノシンデン " GFXP_KATAKANA "ボス", MapSelect_LoadGame, ENTR_FIRE_TEMPLE_BOSS_0 }, - // "79: Water Temple" - { "79:" GFXP_HIRAGANA "ミズノシンデン", MapSelect_LoadGame, ENTR_WATER_TEMPLE_0 }, - // "80: Water Temple - Boss" - { "80:" GFXP_HIRAGANA "ミズノシンデン " GFXP_KATAKANA "ボス", MapSelect_LoadGame, ENTR_WATER_TEMPLE_BOSS_0 }, - // "81: Evil Goddess Statue Dungeon" - { "81:" GFXP_HIRAGANA "ジャシンゾウ " GFXP_KATAKANA "ダンジョン", MapSelect_LoadGame, ENTR_SPIRIT_TEMPLE_0 }, - // "82: Evil Goddess Statue Dungeon - Iron Knuckle" (Iron Knuckle's Lair) - { "82:" GFXP_HIRAGANA "ジャシンゾウ " GFXP_KATAKANA "ダンジョン アイアンナック", MapSelect_LoadGame, ENTR_SPIRIT_TEMPLE_BOSS_0 }, - // "83: Evil Goddess Statue Dungeon - Boss" (Twinrova's Lair) - { "83:" GFXP_HIRAGANA "ジャシンゾウ " GFXP_KATAKANA "ダンジョン ボス", MapSelect_LoadGame, ENTR_SPIRIT_TEMPLE_BOSS_2 }, - // "84: Ganon's Tower" - { "84:" GFXP_KATAKANA "ガノン" GFXP_HIRAGANA "ノトウ", MapSelect_LoadGame, ENTR_GANONS_TOWER_0 }, - // "85: Ganon's Tower - Boss" - { "85:" GFXP_KATAKANA "ガノン" GFXP_HIRAGANA "ノトウ" GFXP_KATAKANA "ボス", MapSelect_LoadGame, ENTR_GANONDORF_BOSS_0 }, - // "86: Ice Cavern" - { "86:" GFXP_HIRAGANA "コオリノドウクツ", MapSelect_LoadGame, ENTR_ICE_CAVERN_0 }, - // "87: Relay Beneath the Graves" (Dampé's Grave) - { "87:" GFXP_HIRAGANA "ハカシタ" GFXP_KATAKANA "リレー", MapSelect_LoadGame, ENTR_WINDMILL_AND_DAMPES_GRAVE_0 }, - // "88: Ganon's Basement Dungeon" - { "88:" GFXP_KATAKANA "ガノン" GFXP_HIRAGANA "チカ " GFXP_KATAKANA "ダンジョン", MapSelect_LoadGame, - ENTR_INSIDE_GANONS_CASTLE_0 }, - // "89: Final Battle With Ganon - Cutscene & Battle" - { "89:" GFXP_KATAKANA "ガノン" GFXP_HIRAGANA "サイシュウセン " GFXP_KATAKANA "デモ & バトル", MapSelect_LoadGame, - ENTR_GANON_BOSS_0 }, - // "90: Ganon's Tower Aftermath 1" (Escaping Ganon's Tower 1) - { "90:" GFXP_KATAKANA "ガノン" GFXP_HIRAGANA "ノトウ ソノゴ 1", MapSelect_LoadGame, + { "24:" T(GFXP_HIRAGANA "ハカシタトビコミアナ", "Grave Dive Hole"), MapSelect_LoadGame, ENTR_REDEAD_GRAVE_0 }, + { "25:" T(GFXP_HIRAGANA "ハカシタトビコミアナ 2", "Grave Dive Hole 2"), MapSelect_LoadGame, + ENTR_GRAVE_WITH_FAIRYS_FOUNTAIN_0 }, + { "26:" T(GFXP_HIRAGANA "オウケ ノ ハカアナ", "Royal Family's Grave"), MapSelect_LoadGame, ENTR_ROYAL_FAMILYS_TOMB_0 }, + { "27:" T(GFXP_HIRAGANA "ダイヨウセイノイズミ", "Great Fairy's Fountain"), MapSelect_LoadGame, + ENTR_GREAT_FAIRYS_FOUNTAIN_MAGIC_0 }, + { "28:" T(GFXP_HIRAGANA "トビコミ ヨウセイ アナ", "Fairy Dive Hole"), MapSelect_LoadGame, ENTR_FAIRYS_FOUNTAIN_0 }, + { "29:" T(GFXP_HIRAGANA "マホウセキ ヨウセイノイズミ", "Magic Stone Fairy's Fountain"), MapSelect_LoadGame, + ENTR_GREAT_FAIRYS_FOUNTAIN_SPELLS_0 }, + { "30:" T(GFXP_KATAKANA "ガノン" GFXP_HIRAGANA "サイシュウセン", "Final Battle With Ganon"), MapSelect_LoadGame, + ENTR_GANONS_TOWER_COLLAPSE_EXTERIOR_0 }, + { "31:" T(GFXP_KATAKANA "ハイラル" GFXP_HIRAGANA "ナカニワ", "Hyrule Inner Garden"), MapSelect_LoadGame, + ENTR_CASTLE_COURTYARD_ZELDA_0 }, + { "32:" T(GFXP_HIRAGANA "ツリボリ", "Fishing"), MapSelect_LoadGame, ENTR_FISHING_POND_0 }, + { "33:" T(GFXP_KATAKANA "ボムチュウボーリング", "Bombchu Bowling"), MapSelect_LoadGame, ENTR_BOMBCHU_BOWLING_ALLEY_0 }, + // Talon's House + { "34:" T(GFXP_KATAKANA "ロンロン" GFXP_HIRAGANA "ボクジョウ ソウコ 1", "Lon Lon Ranch - Storehouse 1"), MapSelect_LoadGame, + ENTR_LON_LON_BUILDINGS_0 }, + // Ranch Silo + { "35:" T(GFXP_KATAKANA "ロンロン" GFXP_HIRAGANA "ボクジョウ ソウコ 2", "Lon Lon Ranch - Storehouse 2"), MapSelect_LoadGame, + ENTR_LON_LON_BUILDINGS_1 }, + { "36:" T(GFXP_HIRAGANA "ミハリ ゴヤ", "Lookout Hut"), MapSelect_LoadGame, ENTR_MARKET_GUARD_HOUSE_0 }, + { "37:" T(GFXP_HIRAGANA "マホウ ノ クスリヤ", "Magic Potion Shop"), MapSelect_LoadGame, ENTR_POTION_SHOP_GRANNY_0 }, + { "38:" T(GFXP_HIRAGANA "タカラバコヤ", "Treasure Chest Shop"), MapSelect_LoadGame, ENTR_TREASURE_BOX_SHOP_0 }, + { "39:" T(GFXP_HIRAGANA "キン " GFXP_KATAKANA "スタルチュラ ハウス", "Gold Skulltula House"), MapSelect_LoadGame, + ENTR_HOUSE_OF_SKULLTULA_0 }, + { "40:" T(GFXP_HIRAGANA "ジョウカマチ イリグチ", "Castle Town - Entrance"), MapSelect_LoadGame, + ENTR_MARKET_ENTRANCE_DAY_0 }, + { "41:" T(GFXP_HIRAGANA "ジョウカマチ", "Castle Town"), MapSelect_LoadGame, ENTR_MARKET_DAY_0 }, + { "42:" T(GFXP_HIRAGANA "ウラロジ", "Back Alley"), MapSelect_LoadGame, ENTR_BACK_ALLEY_DAY_0 }, + { "43:" T(GFXP_HIRAGANA "トキノシンデン マエ", "In Front of the Temple of Time"), MapSelect_LoadGame, + ENTR_TEMPLE_OF_TIME_EXTERIOR_DAY_0 }, + { "44:" T(GFXP_HIRAGANA "リンクノイエ", "Link's House"), MapSelect_LoadGame, ENTR_LINKS_HOUSE_0 }, + { "45:" T(GFXP_KATAKANA "カカリコ" GFXP_HIRAGANA "ムラノナガヤ", "Kakariko Village Row House"), MapSelect_LoadGame, + ENTR_KAKARIKO_CENTER_GUEST_HOUSE_0 }, + { "46:" T(GFXP_HIRAGANA "ウラロジノ イエ", "Back Alley House"), MapSelect_LoadGame, ENTR_BACK_ALLEY_HOUSE_0 }, + { "47:" T(GFXP_HIRAGANA "コキリノムラ モノシリキョウダイノイエ", "Kokiri Village - Know-It-All Brothers' House"), MapSelect_LoadGame, + ENTR_KNOW_IT_ALL_BROS_HOUSE_0 }, + { "48:" T(GFXP_HIRAGANA "コキリノムラ フタゴノイエ", "Kokiri Village - Twins' House"), MapSelect_LoadGame, + ENTR_TWINS_HOUSE_0 }, + { "49:" T(GFXP_HIRAGANA "コキリノムラ " GFXP_KATAKANA "ミド" GFXP_HIRAGANA "ノイエ", "Kokiri Village - Mido's House"), + MapSelect_LoadGame, ENTR_MIDOS_HOUSE_0 }, + { "50:" T(GFXP_HIRAGANA "コキリノムラ " GFXP_KATAKANA "サリア" GFXP_HIRAGANA "ノイエ", "Kokiri Village - Saria's House"), + MapSelect_LoadGame, ENTR_SARIAS_HOUSE_0 }, + { "51:" T(GFXP_HIRAGANA "ウマゴヤ", "Stable"), MapSelect_LoadGame, ENTR_STABLE_0 }, + { "52:" T(GFXP_HIRAGANA "ハカモリノイエ", "Grave Keeper's House"), MapSelect_LoadGame, ENTR_GRAVEKEEPERS_HUT_0 }, + { "53:" T(GFXP_HIRAGANA "ウラロジ イヌオバサンノイエ", "Back Alley - Dog Lady's House"), MapSelect_LoadGame, + ENTR_DOG_LADY_HOUSE_0 }, + { "54:" T(GFXP_HIRAGANA "カカリコムラ " GFXP_KATAKANA "インパ" GFXP_HIRAGANA "ノイエ", "Kakariko Village - Impa's House"), + MapSelect_LoadGame, ENTR_IMPAS_HOUSE_0 }, + { "55:" T(GFXP_KATAKANA "ハイリア" GFXP_HIRAGANA " ケンキュウジョ", "Hylia Laboratory"), MapSelect_LoadGame, + ENTR_LAKESIDE_LABORATORY_0 }, + { "56:" T(GFXP_KATAKANA "テント", "Tent"), MapSelect_LoadGame, ENTR_CARPENTERS_TENT_0 }, + { "57:" T(GFXP_HIRAGANA "タテノミセ", "Shield Shop"), MapSelect_LoadGame, ENTR_BAZAAR_0 }, + { "58:" T(GFXP_HIRAGANA "コキリゾクノミセ", "Kokiri Shop"), MapSelect_LoadGame, ENTR_KOKIRI_SHOP_0 }, + { "59:" T(GFXP_KATAKANA "ゴロン" GFXP_HIRAGANA "ノミセ", "Goron Shop"), MapSelect_LoadGame, ENTR_GORON_SHOP_0 }, + { "60:" T(GFXP_KATAKANA "ゾーラ" GFXP_HIRAGANA "ノミセ", "Zora Shop"), MapSelect_LoadGame, ENTR_ZORA_SHOP_0 }, + { "61:" T(GFXP_KATAKANA "カカリコ" GFXP_HIRAGANA "ムラ クスリヤ", "Kakariko Village - Potion Shop"), MapSelect_LoadGame, + ENTR_POTION_SHOP_KAKARIKO_0 }, + { "62:" T(GFXP_HIRAGANA "ジョウカマチ クスリヤ", "Castle Town - Potion Shop"), MapSelect_LoadGame, + ENTR_POTION_SHOP_MARKET_0 }, + { "63:" T(GFXP_HIRAGANA "ウラロジ ヨルノミセ", "Back Alley - Night Shop"), MapSelect_LoadGame, ENTR_BOMBCHU_SHOP_0 }, + { "64:" T(GFXP_HIRAGANA "オメンヤ", "Mask Shop"), MapSelect_LoadGame, ENTR_HAPPY_MASK_SHOP_0 }, + { "65:" T(GFXP_KATAKANA "ゲルド" GFXP_HIRAGANA "ノシュウレンジョウ", "Gerudo Training Area"), MapSelect_LoadGame, + ENTR_GERUDO_TRAINING_GROUND_0 }, + { "66:" T(GFXP_HIRAGANA "ヨウセイノキノ " GFXP_KATAKANA "ダンジョン", "Fairy Tree Dungeon"), MapSelect_LoadGame, + ENTR_DEKU_TREE_0 }, + { "67:" T(GFXP_HIRAGANA "ヨウセイノキノ " GFXP_KATAKANA "ダンジョン ボス", "Fairy Tree Dungeon - Boss"), MapSelect_LoadGame, + ENTR_DEKU_TREE_BOSS_0 }, + { "68:" T(GFXP_KATAKANA "ドドンゴ ダンジョン", "Dondogo Dungeon"), MapSelect_LoadGame, ENTR_DODONGOS_CAVERN_0 }, + { "69:" T(GFXP_KATAKANA "ドドンゴ ダンジョン ボス", "Dondogo Dungeon - Boss"), MapSelect_LoadGame, + ENTR_DODONGOS_CAVERN_BOSS_0 }, + { "70:" T(GFXP_HIRAGANA "キョダイギョ " GFXP_KATAKANA "ダンジョン", "Giant Fish Dungeon"), MapSelect_LoadGame, + ENTR_JABU_JABU_0 }, + { "71:" T(GFXP_HIRAGANA "キョダイギョ " GFXP_KATAKANA "ダンジョン ボス", "Giant Fish Dungeon - Boss"), MapSelect_LoadGame, + ENTR_JABU_JABU_BOSS_0 }, + { "72:" T(GFXP_HIRAGANA "モリノシンデン", "Forest Temple"), MapSelect_LoadGame, ENTR_FOREST_TEMPLE_0 }, + { "73:" T(GFXP_HIRAGANA "モリノシンデン " GFXP_KATAKANA "ボス", "Forest Temple - Boss"), MapSelect_LoadGame, + ENTR_FOREST_TEMPLE_BOSS_0 }, + { "74:" T(GFXP_HIRAGANA "イドシタ " GFXP_KATAKANA "ダンジョン", "Dungeon Below the Well"), MapSelect_LoadGame, + ENTR_BOTTOM_OF_THE_WELL_0 }, + { "75:" T(GFXP_HIRAGANA "ハカシタ " GFXP_KATAKANA "ダンジョン", "Dungeon Beneath the Graves"), MapSelect_LoadGame, + ENTR_SHADOW_TEMPLE_0 }, + { "76:" T(GFXP_HIRAGANA "ハカシタ " GFXP_KATAKANA "ダンジョン ボス", "Dungeon Beneath the Graves - Boss"), + MapSelect_LoadGame, ENTR_SHADOW_TEMPLE_BOSS_0 }, + { "77:" T(GFXP_HIRAGANA "ヒノシンデン", "Fire Temple"), MapSelect_LoadGame, ENTR_FIRE_TEMPLE_0 }, + { "78:" T(GFXP_HIRAGANA "ヒノシンデン " GFXP_KATAKANA "ボス", "Fire Temple - Boss"), MapSelect_LoadGame, + ENTR_FIRE_TEMPLE_BOSS_0 }, + { "79:" T(GFXP_HIRAGANA "ミズノシンデン", "Water Temple"), MapSelect_LoadGame, ENTR_WATER_TEMPLE_0 }, + { "80:" T(GFXP_HIRAGANA "ミズノシンデン " GFXP_KATAKANA "ボス", "Water Temple - Boss"), MapSelect_LoadGame, + ENTR_WATER_TEMPLE_BOSS_0 }, + { "81:" T(GFXP_HIRAGANA "ジャシンゾウ " GFXP_KATAKANA "ダンジョン", "Evil Goddess Statue Dungeon"), MapSelect_LoadGame, + ENTR_SPIRIT_TEMPLE_0 }, + // Iron Knuckle's Lair + { "82:" T(GFXP_HIRAGANA "ジャシンゾウ " GFXP_KATAKANA "ダンジョン アイアンナック", "Evil Goddess Statue Dungeon - Iron Knuckle"), + MapSelect_LoadGame, ENTR_SPIRIT_TEMPLE_BOSS_0 }, + // Twinrova's Lair + { "83:" T(GFXP_HIRAGANA "ジャシンゾウ " GFXP_KATAKANA "ダンジョン ボス", "Evil Goddess Statue Dungeon - Boss"), + MapSelect_LoadGame, ENTR_SPIRIT_TEMPLE_BOSS_2 }, + { "84:" T(GFXP_KATAKANA "ガノン" GFXP_HIRAGANA "ノトウ", "Ganon's Tower"), MapSelect_LoadGame, ENTR_GANONS_TOWER_0 }, + { "85:" T(GFXP_KATAKANA "ガノン" GFXP_HIRAGANA "ノトウ" GFXP_KATAKANA "ボス", "Ganon's Tower - Boss"), MapSelect_LoadGame, + ENTR_GANONDORF_BOSS_0 }, + { "86:" T(GFXP_HIRAGANA "コオリノドウクツ", "Ice Cavern"), MapSelect_LoadGame, ENTR_ICE_CAVERN_0 }, + // Dampé's Grave + { "87:" T(GFXP_HIRAGANA "ハカシタ" GFXP_KATAKANA "リレー", "Relay Beneath the Graves"), MapSelect_LoadGame, + ENTR_WINDMILL_AND_DAMPES_GRAVE_0 }, + { "88:" T(GFXP_KATAKANA "ガノン" GFXP_HIRAGANA "チカ " GFXP_KATAKANA "ダンジョン", "Ganon's Basement Dungeon"), + MapSelect_LoadGame, ENTR_INSIDE_GANONS_CASTLE_0 }, + { "89:" T(GFXP_KATAKANA "ガノン" GFXP_HIRAGANA "サイシュウセン " GFXP_KATAKANA "デモ & バトル", + "Final Battle With Ganon - Cutscene & Battle"), + MapSelect_LoadGame, ENTR_GANON_BOSS_0 }, + { "90:" T(GFXP_KATAKANA "ガノン" GFXP_HIRAGANA "ノトウ ソノゴ 1", "Ganon's Tower Aftermath 1"), MapSelect_LoadGame, ENTR_GANONS_TOWER_COLLAPSE_INTERIOR_0 }, - // "91: Ganon's Tower Aftermath 2" (Escaping Ganon's Tower 2) - { "91:" GFXP_KATAKANA "ガノン" GFXP_HIRAGANA "ノトウ ソノゴ 2", MapSelect_LoadGame, + { "91:" T(GFXP_KATAKANA "ガノン" GFXP_HIRAGANA "ノトウ ソノゴ 2", "Ganon's Tower Aftermath 2"), MapSelect_LoadGame, ENTR_GANONS_TOWER_COLLAPSE_INTERIOR_2 }, - // "92: Ganon's Tower Aftermath 3" (Escaping Ganon's Tower 3) - { "92:" GFXP_KATAKANA "ガノン" GFXP_HIRAGANA "ノトウ ソノゴ 3", MapSelect_LoadGame, + { "92:" T(GFXP_KATAKANA "ガノン" GFXP_HIRAGANA "ノトウ ソノゴ 3", "Ganon's Tower Aftermath 3"), MapSelect_LoadGame, ENTR_GANONS_TOWER_COLLAPSE_INTERIOR_4 }, - // "93: Ganon's Tower Aftermath 4" (Escaping Ganon's Tower 4) - { "93:" GFXP_KATAKANA "ガノン" GFXP_HIRAGANA "ノトウ ソノゴ 4", MapSelect_LoadGame, + { "93:" T(GFXP_KATAKANA "ガノン" GFXP_HIRAGANA "ノトウ ソノゴ 4", "Ganon's Tower Aftermath 4"), MapSelect_LoadGame, ENTR_GANONS_TOWER_COLLAPSE_INTERIOR_6 }, - // "94: Ganon's Basement Aftermath" - { "94:" GFXP_KATAKANA "ガノン" GFXP_HIRAGANA "チカ ソノゴ", MapSelect_LoadGame, ENTR_INSIDE_GANONS_CASTLE_COLLAPSE_0 }, - // "95: Gerudo Passage 1-2" (Thieves' Hideout 1) - { "95:" GFXP_KATAKANA "ゲルド" GFXP_HIRAGANA "ツウロ 1-2", MapSelect_LoadGame, ENTR_THIEVES_HIDEOUT_0 }, - // "96: Gerudo Passage 3-4 9-10" (Thieves' Hideout 2) - { "96:" GFXP_KATAKANA "ゲルド" GFXP_HIRAGANA "ツウロ 3-4 9-10", MapSelect_LoadGame, ENTR_THIEVES_HIDEOUT_2 }, - // "97: Gerudo Passage 5-6" (Thieves' Hideout 3) - { "97:" GFXP_KATAKANA "ゲルド" GFXP_HIRAGANA "ツウロ 5-6", MapSelect_LoadGame, ENTR_THIEVES_HIDEOUT_4 }, - // "98: Gerudo Passage 7-8" (Thieves' Hideout 4) - { "98:" GFXP_KATAKANA "ゲルド" GFXP_HIRAGANA "ツウロ 7-8", MapSelect_LoadGame, ENTR_THIEVES_HIDEOUT_6 }, - // "99: Gerudo Passage 11-12" (Thieves' Hideout 5) - { "99:" GFXP_KATAKANA "ゲルド" GFXP_HIRAGANA "ツウロ 11-12", MapSelect_LoadGame, ENTR_THIEVES_HIDEOUT_10 }, - // "100: Gerudo Passage 13" (Thieves' Hideout 6) - { "100:" GFXP_KATAKANA "ゲルド" GFXP_HIRAGANA "ツウロ 13", MapSelect_LoadGame, ENTR_THIEVES_HIDEOUT_12 }, - // "101: Hidden Dive Hole 0" (Grotto 0 - Gossip Stone & Chest) - { "101:" GFXP_HIRAGANA "カクシトビコミアナ 0", MapSelect_LoadGame, ENTR_GROTTOS_0 }, - // "102: Hidden Dive Hole 1" (Grotto 1 - Skulltula & Gold Skulltula) - { "102:" GFXP_HIRAGANA "カクシトビコミアナ 1", MapSelect_LoadGame, ENTR_GROTTOS_1 }, - // "103: Hidden Dive Hole 2" (Grotto 2 - Business Scrub & Heart Piece) - { "103:" GFXP_HIRAGANA "カクシトビコミアナ 2", MapSelect_LoadGame, ENTR_GROTTOS_2 }, - // "104: Hidden Dive Hole 3" (Grotto 3 - Redeads) - { "104:" GFXP_HIRAGANA "カクシトビコミアナ 3", MapSelect_LoadGame, ENTR_GROTTOS_3 }, - // "105: Hidden Dive Hole 4" (Grotto 4 - 3 Business Scrubs) - { "105:" GFXP_HIRAGANA "カクシトビコミアナ 4", MapSelect_LoadGame, ENTR_GROTTOS_4 }, - // "106: Hidden Dive Hole 5" (Grotto 5 - Gossip Stone, Skulltula, Cow) - { "106:" GFXP_HIRAGANA "カクシトビコミアナ 5", MapSelect_LoadGame, ENTR_GROTTOS_5 }, - // "107: Hidden Dive Hole 6" (Grotto 6 - Octorok) - { "107:" GFXP_HIRAGANA "カクシトビコミアナ 6", MapSelect_LoadGame, ENTR_GROTTOS_6 }, - // "108: Hidden Dive Hole 7" (Grotto 7 - Business Scrub & Deku Nut Upgrade) - { "108:" GFXP_HIRAGANA "カクシトビコミアナ 7", MapSelect_LoadGame, ENTR_GROTTOS_7 }, - // "109: Hidden Dive Hole 8" (Grotto 8 - 2 Wolfos) - { "109:" GFXP_HIRAGANA "カクシトビコミアナ 8", MapSelect_LoadGame, ENTR_GROTTOS_8 }, - // "110: Hidden Dive Hole 9" (Grotto 9 - Bombable Walls) - { "110:" GFXP_HIRAGANA "カクシトビコミアナ 9", MapSelect_LoadGame, ENTR_GROTTOS_9 }, - // "111: Hidden Dive Hole 10" (Grotto 10 - 2 Business Scrubs) - { "111:" GFXP_HIRAGANA "カクシトビコミアナ 10", MapSelect_LoadGame, ENTR_GROTTOS_10 }, - // "112: Hidden Dive Hole 11" (Grotto 11 - Tektite & Heart Piece) - { "112:" GFXP_HIRAGANA "カクシトビコミアナ 11", MapSelect_LoadGame, ENTR_GROTTOS_11 }, - // "113: Hidden Dive Hole 12" (Grotto 12 - Deku Stage) - { "113:" GFXP_HIRAGANA "カクシトビコミアナ 12", MapSelect_LoadGame, ENTR_GROTTOS_12 }, - // "114: Hidden Dive Hole 13" (Grotto 13 - Rupees & Cow) - { "114:" GFXP_HIRAGANA "カクシトビコミアナ 13", MapSelect_LoadGame, ENTR_GROTTOS_13 }, - // "115: Hyrule Cutscenes" - { "115:" GFXP_KATAKANA "ハイラル デモ", MapSelect_LoadGame, ENTR_CUTSCENE_MAP_0 }, + { "94:" T(GFXP_KATAKANA "ガノン" GFXP_HIRAGANA "チカ ソノゴ", "Ganon's Basement Aftermath"), MapSelect_LoadGame, + ENTR_INSIDE_GANONS_CASTLE_COLLAPSE_0 }, + { "95:" T(GFXP_KATAKANA "ゲルド" GFXP_HIRAGANA "ツウロ 1-2", "Gerudo Passage 1-2"), MapSelect_LoadGame, + ENTR_THIEVES_HIDEOUT_0 }, + { "96:" T(GFXP_KATAKANA "ゲルド" GFXP_HIRAGANA "ツウロ 3-4 9-10", "Gerudo Passage 3-4 9-10"), MapSelect_LoadGame, + ENTR_THIEVES_HIDEOUT_2 }, + { "97:" T(GFXP_KATAKANA "ゲルド" GFXP_HIRAGANA "ツウロ 5-6", "Gerudo Passage 5-6"), MapSelect_LoadGame, + ENTR_THIEVES_HIDEOUT_4 }, + { "98:" T(GFXP_KATAKANA "ゲルド" GFXP_HIRAGANA "ツウロ 7-8", "Gerudo Passage 7-8"), MapSelect_LoadGame, + ENTR_THIEVES_HIDEOUT_6 }, + { "99:" T(GFXP_KATAKANA "ゲルド" GFXP_HIRAGANA "ツウロ 11-12", "Gerudo Passage 11-12"), MapSelect_LoadGame, + ENTR_THIEVES_HIDEOUT_10 }, + { "100:" T(GFXP_KATAKANA "ゲルド" GFXP_HIRAGANA "ツウロ 13", "Gerudo Passage 13"), MapSelect_LoadGame, + ENTR_THIEVES_HIDEOUT_12 }, + // Gossip Stone & Chest Grotto + { "101:" T(GFXP_HIRAGANA "カクシトビコミアナ 0", "Hidden Dive Hole 0"), MapSelect_LoadGame, ENTR_GROTTOS_0 }, + // Skulltula & Gold Skulltula Grotto + { "102:" T(GFXP_HIRAGANA "カクシトビコミアナ 1", "Hidden Dive Hole 1"), MapSelect_LoadGame, ENTR_GROTTOS_1 }, + // Business Scrub & Heart Piece Grotto + { "103:" T(GFXP_HIRAGANA "カクシトビコミアナ 2", "Hidden Dive Hole 2"), MapSelect_LoadGame, ENTR_GROTTOS_2 }, + // Redeads Grotto + { "104:" T(GFXP_HIRAGANA "カクシトビコミアナ 3", "Hidden Dive Hole 3"), MapSelect_LoadGame, ENTR_GROTTOS_3 }, + // 3 Business Scrubs Grotto + { "105:" T(GFXP_HIRAGANA "カクシトビコミアナ 4", "Hidden Dive Hole 4"), MapSelect_LoadGame, ENTR_GROTTOS_4 }, + // Gossip Stone, Skulltula & Cow Grotto + { "106:" T(GFXP_HIRAGANA "カクシトビコミアナ 5", "Hidden Dive Hole 5"), MapSelect_LoadGame, ENTR_GROTTOS_5 }, + // Octorok Grotto + { "107:" T(GFXP_HIRAGANA "カクシトビコミアナ 6", "Hidden Dive Hole 6"), MapSelect_LoadGame, ENTR_GROTTOS_6 }, + // Business Scrub & Deku Nut Upgrade Grotto + { "108:" T(GFXP_HIRAGANA "カクシトビコミアナ 7", "Hidden Dive Hole 7"), MapSelect_LoadGame, ENTR_GROTTOS_7 }, + // 2 Wolfos Grotto + { "109:" T(GFXP_HIRAGANA "カクシトビコミアナ 8", "Hidden Dive Hole 8"), MapSelect_LoadGame, ENTR_GROTTOS_8 }, + // Bombable Walls Grotto + { "110:" T(GFXP_HIRAGANA "カクシトビコミアナ 9", "Hidden Dive Hole 9"), MapSelect_LoadGame, ENTR_GROTTOS_9 }, + // 2 Business Scrubs Grotto + { "111:" T(GFXP_HIRAGANA "カクシトビコミアナ 10", "Hidden Dive Hole 10"), MapSelect_LoadGame, ENTR_GROTTOS_10 }, + // Tektite & Heart Piece Grotto + { "112:" T(GFXP_HIRAGANA "カクシトビコミアナ 11", "Hidden Dive Hole 11"), MapSelect_LoadGame, ENTR_GROTTOS_11 }, + // Deku Stage Grotto + { "113:" T(GFXP_HIRAGANA "カクシトビコミアナ 12", "Hidden Dive Hole 12"), MapSelect_LoadGame, ENTR_GROTTOS_12 }, + // Rupees & Cow Grotto + { "114:" T(GFXP_HIRAGANA "カクシトビコミアナ 13", "Hidden Dive Hole 13"), MapSelect_LoadGame, ENTR_GROTTOS_13 }, + { "115:" T(GFXP_KATAKANA "ハイラル デモ", "Hyrule Cutscenes"), MapSelect_LoadGame, ENTR_CUTSCENE_MAP_0 }, #if OOT_DEBUG - // "116: Special Room (Treasure Chest Warp)" (Ganondorf Test Room) - { "116:" GFXP_HIRAGANA "ベッシツ (タカラバコ" GFXP_KATAKANA "ワープ)", MapSelect_LoadGame, ENTR_BESITU_0 }, - // "117: Sasaki Test" (Sasa Test) - { "117:" GFXP_HIRAGANA "ササ" GFXP_KATAKANA "テスト", MapSelect_LoadGame, ENTR_SASATEST_0 }, - // "118: Test Map" (Jungle Gym) - { "118:" GFXP_KATAKANA "テストマップ", MapSelect_LoadGame, ENTR_TEST01_0 }, - // "119: Test Room" (Treasure Chest Room) - { "119:" GFXP_KATAKANA "テストルーム", MapSelect_LoadGame, ENTR_TESTROOM_0 }, - // "120: Stalfos Miniboss Room" (Stalfos Miniboss Room) - { "120:" GFXP_HIRAGANA "チュウ" GFXP_KATAKANA "スタロフォス" GFXP_HIRAGANA "ベヤ", MapSelect_LoadGame, ENTR_SYOTES_0 }, - // "121: Boss Stalfos Room" (Stalfos Boss Room) - { "121:" GFXP_KATAKANA "ボススタロフォス" GFXP_HIRAGANA "ベヤ", MapSelect_LoadGame, ENTR_SYOTES2_0 }, - // "122: Stal" (Sutaru) - { "122:Sutaru", MapSelect_LoadGame, ENTR_SUTARU_0 }, - // "123: Test Area" - { "123:jikkenjyou", MapSelect_LoadGame, ENTR_TEST_SHOOTING_GALLERY_0 }, - // "124: Depth Test" (Depth Test) - { "124:depth" GFXP_KATAKANA "テスト", MapSelect_LoadGame, ENTR_DEPTH_TEST_0 }, - // "125: Hyrule Garden Game 2" (Early Hyrule Garden Game) - { "125:" GFXP_KATAKANA "ハイラル" GFXP_HIRAGANA "ニワ" GFXP_KATAKANA "ゲーム2", MapSelect_LoadGame, ENTR_HAIRAL_NIWA2_0 }, + { "116:" T(GFXP_HIRAGANA "ベッシツ (タカラバコ" GFXP_KATAKANA "ワープ)", "Special Room (Treasure Chest Warp)"), + MapSelect_LoadGame, ENTR_BESITU_0 }, + { "117:" T(GFXP_HIRAGANA "ササ" GFXP_KATAKANA "テスト", "Sasaki Test"), MapSelect_LoadGame, ENTR_SASATEST_0 }, + { "118:" T(GFXP_KATAKANA "テストマップ", "Test Map"), MapSelect_LoadGame, ENTR_TEST01_0 }, + { "119:" T(GFXP_KATAKANA "テストルーム", "Test Room"), MapSelect_LoadGame, ENTR_TESTROOM_0 }, + { "120:" T(GFXP_HIRAGANA "チュウ" GFXP_KATAKANA "スタロフォス" GFXP_HIRAGANA "ベヤ", "Stalfos Miniboss Room"), + MapSelect_LoadGame, ENTR_SYOTES_0 }, + { "121:" T(GFXP_KATAKANA "ボススタロフォス" GFXP_HIRAGANA "ベヤ", "Boss Stalfos Room"), MapSelect_LoadGame, + ENTR_SYOTES2_0 }, + { "122:" T("Sutaru", "Stal"), MapSelect_LoadGame, ENTR_SUTARU_0 }, + { "123:" T("jikkenjyou", "Test Area"), MapSelect_LoadGame, ENTR_TEST_SHOOTING_GALLERY_0 }, + { "124:depth" T(GFXP_KATAKANA "テスト", "Test"), MapSelect_LoadGame, ENTR_DEPTH_TEST_0 }, + { "125:" T(GFXP_KATAKANA "ハイラル" GFXP_HIRAGANA "ニワ" GFXP_KATAKANA "ゲーム2", "Hyrule Garden Game 2"), + MapSelect_LoadGame, ENTR_HAIRAL_NIWA2_0 }, #endif - // "title" (Title Screen) { "title", (void*)MapSelect_LoadTitle, 0 }, #if PLATFORM_N64 { "64DD TEST n64dd_SetDiskVersion(1)", (void*)func_80800AD0_unknown, 0 }, @@ -554,30 +514,19 @@ void MapSelect_PrintMenu(MapSelectState* this, GfxPrint* printer) { } static const char* sLoadingMessages[] = { - // "Please wait a minute" - GFXP_HIRAGANA "シバラクオマチクダサイ", - // "Hold on a sec" - GFXP_HIRAGANA "チョット マッテネ", - // "Wait a moment" - GFXP_KATAKANA "ウェイト ア モーメント", - // "Loading" - GFXP_KATAKANA "ロード" GFXP_HIRAGANA "チュウ", - // "Now working" - GFXP_HIRAGANA "ナウ ワーキング", - // "Now creating" - GFXP_HIRAGANA "イマ ツクッテマス", - // "It's not broken" - GFXP_HIRAGANA "コショウジャナイヨ", - // "Coffee Break" - GFXP_KATAKANA "コーヒー ブレイク", - // "Please set B side" - GFXP_KATAKANA "Bメンヲセットシテクダサイ", - // "Be patient, now" - GFXP_HIRAGANA "ジット" GFXP_KATAKANA "ガマン" GFXP_HIRAGANA "ノ" GFXP_KATAKANA "コ" GFXP_HIRAGANA "デアッタ", - // "Please wait just a minute" - GFXP_HIRAGANA "イマシバラクオマチクダサイ", - // "Don't worry, don't worry. Take a break, take a break." - GFXP_HIRAGANA "アワテナイアワテナイ。ヒトヤスミヒトヤスミ。", + T(GFXP_HIRAGANA "シバラクオマチクダサイ", "Please wait a minute"), + T(GFXP_HIRAGANA "チョット マッテネ", "Hold on a sec"), + T(GFXP_KATAKANA "ウェイト ア モーメント", "Wait a moment"), + T(GFXP_KATAKANA "ロード" GFXP_HIRAGANA "チュウ", "Loading"), + T(GFXP_HIRAGANA "ナウ ワーキング", "Now working"), + T(GFXP_HIRAGANA "イマ ツクッテマス", "Now creating"), + T(GFXP_HIRAGANA "コショウジャナイヨ", "It's not broken"), + T(GFXP_KATAKANA "コーヒー ブレイク", "Coffee Break"), + T(GFXP_KATAKANA "Bメンヲセットシテクダサイ", "Please set B side"), + T(GFXP_HIRAGANA "ジット" GFXP_KATAKANA "ガマン" GFXP_HIRAGANA "ノ" GFXP_KATAKANA "コ" GFXP_HIRAGANA "デアッタ", + "Be patient, now"), + T(GFXP_HIRAGANA "イマシバラクオマチクダサイ", "Please wait just a minute"), + T(GFXP_HIRAGANA "アワテナイアワテナイ。ヒトヤスミヒトヤスミ。", "Don't worry, don't worry. Take a break, take a break."), }; void MapSelect_PrintLoadingMessage(MapSelectState* this, GfxPrint* printer) { @@ -590,8 +539,8 @@ void MapSelect_PrintLoadingMessage(MapSelectState* this, GfxPrint* printer) { } static const char* sAgeLabels[] = { - GFXP_HIRAGANA "17(ワカモノ)", // "17(young)" - GFXP_HIRAGANA "5(ワカスギ)", // "5(very young)" + T(GFXP_HIRAGANA "17(ワカモノ)", "17(young)"), + T(GFXP_HIRAGANA "5(ワカスギ)", "5(very young)"), }; void MapSelect_PrintAgeSetting(MapSelectState* this, GfxPrint* printer, s32 age) { @@ -608,48 +557,48 @@ void MapSelect_PrintCutsceneSetting(MapSelectState* this, GfxPrint* printer, u16 switch (csIndex) { case CS_INDEX_AUTO: - label = GFXP_HIRAGANA " ヨル " GFXP_KATAKANA "ゴロン"; + label = T(GFXP_HIRAGANA " ヨル " GFXP_KATAKANA "ゴロン", "Night"); gSaveContext.save.dayTime = CLOCK_TIME(0, 0); break; case CS_INDEX_UNUSED: // clang-format off - gSaveContext.save.dayTime = CLOCK_TIME(12, 0); label = GFXP_HIRAGANA "オヒル " GFXP_KATAKANA "ジャラ"; + gSaveContext.save.dayTime = CLOCK_TIME(12, 0); label = T(GFXP_HIRAGANA "オヒル " GFXP_KATAKANA "ジャラ", "Day"); // clang-format on break; case CS_INDEX_0: // clang-format off - gSaveContext.save.dayTime = CLOCK_TIME(12, 0); label = "デモ00"; + gSaveContext.save.dayTime = CLOCK_TIME(12, 0); label = T("デモ00", "Demo 00"); // clang-format on break; case CS_INDEX_1: - label = "デモ01"; + label = T("デモ01", "Demo 01"); break; case CS_INDEX_2: - label = "デモ02"; + label = T("デモ02", "Demo 02"); break; case CS_INDEX_3: - label = "デモ03"; + label = T("デモ03", "Demo 03"); break; case CS_INDEX_4: - label = "デモ04"; + label = T("デモ04", "Demo 04"); break; case CS_INDEX_5: - label = "デモ05"; + label = T("デモ05", "Demo 05"); break; case CS_INDEX_6: - label = "デモ06"; + label = T("デモ06", "Demo 06"); break; case CS_INDEX_7: - label = "デモ07"; + label = T("デモ07", "Demo 07"); break; case CS_INDEX_8: - label = "デモ08"; + label = T("デモ08", "Demo 08"); break; case CS_INDEX_9: - label = "デモ09"; + label = T("デモ09", "Demo 09"); break; case CS_INDEX_A: - label = "デモ0A"; + label = T("デモ0A", "Demo 0A"); break; }; @@ -731,8 +680,8 @@ void MapSelect_Main(GameState* thisx) { void MapSelect_Destroy(GameState* thisx) { PRINTF("%c", BEL); - // "view_cleanup will hang, so it won't be called" - PRINTF("*** view_cleanupはハングアップするので、呼ばない ***\n"); + PRINTF(T("*** view_cleanupはハングアップするので、呼ばない ***\n", + "*** view_cleanup will hang, so it won't be called ***\n")); } void MapSelect_Init(GameState* thisx) { diff --git a/src/overlays/misc/ovl_kaleido_scope/z_kaleido_scope.c b/src/overlays/misc/ovl_kaleido_scope/z_kaleido_scope.c index 71104dd545..daf264887b 100644 --- a/src/overlays/misc/ovl_kaleido_scope/z_kaleido_scope.c +++ b/src/overlays/misc/ovl_kaleido_scope/z_kaleido_scope.c @@ -16,7 +16,7 @@ #include "terminal.h" #include "versions.h" -#pragma increment_block_number "ntsc-1.2:128 pal-1.0:128 pal-1.1:128" +#pragma increment_block_number "ntsc-1.0:128 ntsc-1.1:128 ntsc-1.2:128 pal-1.0:128 pal-1.1:128" #if !PLATFORM_GC #define KALEIDO_PROMPT_CURSOR_R 100 diff --git a/tools/audio/extraction/audio_extract.py b/tools/audio/extraction/audio_extract.py index 9107288068..29bf632e3a 100644 --- a/tools/audio/extraction/audio_extract.py +++ b/tools/audio/extraction/audio_extract.py @@ -8,17 +8,18 @@ import os, shutil, time from dataclasses import dataclass from multiprocessing.pool import ThreadPool from typing import Dict, List, Tuple, Union -from xml.etree import ElementTree -from xml.etree.ElementTree import Element from .audio_tables import AudioCodeTable, AudioCodeTableEntry, AudioStorageMedium from .audiotable import AudioTableData, AudioTableFile, AudioTableSample from .audiobank_file import AudiobankFile from .disassemble_sequence import CMD_SPEC, SequenceDisassembler, SequenceTableSpec, MMLVersion -from .util import align, debugm, error, incbin, program_get, XMLWriter +from .extraction_xml import ExtractionDescription, SampleBankExtractionDescription, SoundFontExtractionDescription, SequenceExtractionDescription +from .util import align, incbin, program_get, XMLWriter @dataclass class GameVersionInfo: + # Version Name + version_name : str # Music Macro Language Version mml_version : MMLVersion # Soundfont table code offset @@ -49,7 +50,7 @@ BASEROM_DEBUG = False # ====================================================================================================================== def collect_sample_banks(audiotable_seg : memoryview, extracted_dir : str, version_info : GameVersionInfo, - table : AudioCodeTable, samplebank_xmls : Dict[int, Tuple[str, Element]]): + table : AudioCodeTable, samplebank_descs : Dict[int, SampleBankExtractionDescription]): sample_banks : List[Union[AudioTableFile, int]] = [] for i,entry in enumerate(table): @@ -72,7 +73,7 @@ def collect_sample_banks(audiotable_seg : memoryview, extracted_dir : str, versi bug = i in version_info.audiotable_buffer_bugs bank = AudioTableFile(i, audiotable_seg, entry, table.rom_addr, buffer_bug=bug, - extraction_xml=samplebank_xmls.get(i, None)) + extraction_desc=samplebank_descs.get(i, None)) if BASEROM_DEBUG: bank.dump_bin(f"{extracted_dir}/baserom_audiotest/audiotable_files/{bank.file_name}.bin") @@ -90,7 +91,7 @@ def bank_data_lookup(sample_banks : List[Union[AudioTableFile, int]], e : Union[ return e def collect_soundfonts(audiobank_seg : memoryview, extracted_dir : str, version_info : GameVersionInfo, - sound_font_table : AudioCodeTable, soundfont_xmls : Dict[int, Tuple[str, Element]], + sound_font_table : AudioCodeTable, soundfont_descs : Dict[int, SoundFontExtractionDescription], sample_banks : List[Union[AudioTableFile, int]]): soundfonts = [] @@ -104,7 +105,7 @@ def collect_soundfonts(audiobank_seg : memoryview, extracted_dir : str, version_ # Read the data soundfont = AudiobankFile(audiobank_seg, i, entry, sound_font_table.rom_addr, bank1, bank2, entry.sample_bank_id_1, entry.sample_bank_id_2, - extraction_xml=soundfont_xmls.get(i, None)) + extraction_desc=soundfont_descs.get(i, None)) soundfonts.append(soundfont) if BASEROM_DEBUG: @@ -186,7 +187,7 @@ def disassemble_one_sequence(extracted_dir : str, version_info : GameVersionInfo def extract_sequences(audioseq_seg : memoryview, extracted_dir : str, version_info : GameVersionInfo, write_xml : bool, sequence_table : AudioCodeTable, sequence_font_table : memoryview, - sequence_xmls : Dict[int, Element], soundfonts : List[AudiobankFile]): + sequence_descs : Dict[int, SequenceExtractionDescription], soundfonts : List[AudiobankFile]): sequence_font_table_cvg = [0] * len(sequence_font_table) @@ -237,13 +238,13 @@ def extract_sequences(audioseq_seg : memoryview, extracted_dir : str, version_in with open(f"{extracted_dir}/baserom_audiotest/audioseq_files/seq_{i}{ext}.aseq", "wb") as outfile: outfile.write(seq_data) - extraction_xml = sequence_xmls.get(i, None) - if extraction_xml is None: + extraction_desc = sequence_descs.get(i, None) + if extraction_desc is None: sequence_filename = f"seq_{i}" sequence_name = f"Sequence_{i}" else: - sequence_filename = extraction_xml[0] - sequence_name = extraction_xml[1].attrib["Name"] + sequence_filename = extraction_desc.file_name + sequence_name = extraction_desc.name # Write extraction xml entry if write_xml: @@ -359,27 +360,22 @@ def extract_audio_for_version(version_info : GameVersionInfo, extracted_dir : st # Collect extraction xmls # ================================================================================================================== - samplebank_xmls : Dict[int, Tuple[str, Element]] = {} - soundfont_xmls : Dict[int, Tuple[str, Element]] = {} - sequence_xmls : Dict[int, Tuple[str, Element]] = {} + samplebank_descs : Dict[int, SampleBankExtractionDescription] = {} + soundfont_descs : Dict[int, SoundFontExtractionDescription] = {} + sequence_descs : Dict[int, SequenceExtractionDescription] = {} if read_xml: # Read all present xmls - def walk_xmls(out_dict : Dict[int, Tuple[str, Element]], path : str, typename : str): + def walk_xmls(T : type, out_dict : Dict[int, ExtractionDescription], path : str): for root,_,files in os.walk(path): for f in files: - fullpath = os.path.join(root, f) - xml = ElementTree.parse(fullpath) - xml_root = xml.getroot() + desc : ExtractionDescription = T(os.path.join(root, f), f, version_info.version_name) + out_dict[desc.index] = desc - if xml_root.tag != typename or "Name" not in xml_root.attrib or "Index" not in xml_root.attrib: - error(f"Malformed {typename} extraction xml: \"{fullpath}\"") - out_dict[int(xml_root.attrib["Index"])] = (f.replace(".xml", ""), xml_root) - - walk_xmls(samplebank_xmls, f"assets/xml/audio/samplebanks", "SampleBank") - walk_xmls(soundfont_xmls, f"assets/xml/audio/soundfonts", "SoundFont") - walk_xmls(sequence_xmls, f"assets/xml/audio/sequences", "Sequence") + walk_xmls(SampleBankExtractionDescription, samplebank_descs, f"assets/xml/audio/samplebanks") + walk_xmls(SoundFontExtractionDescription, soundfont_descs, f"assets/xml/audio/soundfonts") + walk_xmls(SequenceExtractionDescription, sequence_descs, f"assets/xml/audio/sequences") # TODO warn about any missing xmls or xmls with a bad index @@ -389,7 +385,7 @@ def extract_audio_for_version(version_info : GameVersionInfo, extracted_dir : st if BASEROM_DEBUG: os.makedirs(f"{extracted_dir}/baserom_audiotest/audiotable_files", exist_ok=True) - sample_banks = collect_sample_banks(audiotable_seg, extracted_dir, version_info, sample_bank_table, samplebank_xmls) + sample_banks = collect_sample_banks(audiotable_seg, extracted_dir, version_info, sample_bank_table, samplebank_descs) # ================================================================================================================== # Collect soundfonts @@ -397,7 +393,7 @@ def extract_audio_for_version(version_info : GameVersionInfo, extracted_dir : st if BASEROM_DEBUG: os.makedirs(f"{extracted_dir}/baserom_audiotest/audiobank_files", exist_ok=True) - soundfonts = collect_soundfonts(audiobank_seg, extracted_dir, version_info, sound_font_table, soundfont_xmls, + soundfonts = collect_soundfonts(audiobank_seg, extracted_dir, version_info, sound_font_table, soundfont_descs, sample_banks) # ================================================================================================================== @@ -459,4 +455,4 @@ def extract_audio_for_version(version_info : GameVersionInfo, extracted_dir : st print("Extracting sequences...") extract_sequences(audioseq_seg, extracted_dir, version_info, write_xml, sequence_table, sequence_font_table, - sequence_xmls, soundfonts) + sequence_descs, soundfonts) diff --git a/tools/audio/extraction/audiobank_file.py b/tools/audio/extraction/audiobank_file.py index 83efbc71c7..cd4e48740b 100644 --- a/tools/audio/extraction/audiobank_file.py +++ b/tools/audio/extraction/audiobank_file.py @@ -5,13 +5,13 @@ # import struct -from typing import Optional, Tuple -from xml.etree.ElementTree import Element +from typing import Optional from .audio_tables import AudioCodeTableEntry from .audiobank_structs import AdpcmBook, AdpcmLoop, Drum, Instrument, SoundFontSample, SoundFontSound -from .envelope import Envelope from .audiotable import AudioTableFile, AudioTableSample +from .envelope import Envelope +from .extraction_xml import SoundFontExtractionDescription from .tuning import pitch_names from .util import XMLWriter, align, debugm, merge_like_ranges, merge_ranges @@ -183,7 +183,7 @@ class AudiobankFile: def __init__(self, audiobank_seg : memoryview, index : int, table_entry : AudioCodeTableEntry, seg_offset : int, bank1 : AudioTableFile, bank2 : AudioTableFile, bank1_num : int, bank2_num : int, - extraction_xml : Tuple[str, Element] = None): + extraction_desc : Optional[SoundFontExtractionDescription] = None): self.bank_num = index self.table_entry : AudioCodeTableEntry = table_entry self.num_instruments = self.table_entry.num_instruments @@ -193,7 +193,7 @@ class AudiobankFile: self.bank1_num = bank1_num self.bank2_num = bank2_num - if extraction_xml is None: + if extraction_desc is None: self.file_name = f"Soundfont_{self.bank_num}" self.name = f"Soundfont_{self.bank_num}" @@ -201,32 +201,22 @@ class AudiobankFile: self.extraction_instruments_info = None self.extraction_drums_info = None self.extraction_effects_info = None + self.extraction_envelopes_info_versions = [] + self.extraction_instruments_info_versions = {} + self.extraction_drums_info_versions = [] + self.extraction_effects_info_versions = [] else: - self.file_name = extraction_xml[0] - self.name = extraction_xml[1].attrib["Name"] + self.file_name = extraction_desc.file_name + self.name = extraction_desc.name - self.extraction_envelopes_info = [] - self.extraction_instruments_info = {} - self.extraction_drums_info = [] - self.extraction_effects_info = [] - - for item in extraction_xml[1]: - if item.tag == "Envelopes": - for env in item: - assert env.tag == "Envelope" - self.extraction_envelopes_info.append(env.attrib["Name"]) - elif item.tag == "Instruments": - for instr in item: - assert instr.tag == "Instrument" - self.extraction_instruments_info[int(instr.attrib["ProgramNumber"])] = instr.attrib["Name"] - elif item.tag == "Drums": - for drum in item: - self.extraction_drums_info.append(drum.attrib["Name"]) - elif item.tag == "Effects": - for effect in item: - self.extraction_effects_info.append(effect.attrib["Name"]) - else: - assert False, item.tag + self.extraction_envelopes_info = extraction_desc.envelopes_info + self.extraction_instruments_info = extraction_desc.instruments_info + self.extraction_drums_info = extraction_desc.drums_info + self.extraction_effects_info = extraction_desc.effects_info + self.extraction_envelopes_info_versions = extraction_desc.envelopes_info_versions + self.extraction_instruments_info_versions = extraction_desc.instruments_info_versions + self.extraction_drums_info_versions = extraction_desc.drums_info_versions + self.extraction_effects_info_versions = extraction_desc.effects_info_versions # Coverage consists of a list of itervals of the form [[start,type],[end,type]] self.coverage = [] @@ -755,25 +745,25 @@ class AudiobankFile: # TODO resolve decay/release index overrides? def envelope_name(self, index): - if self.extraction_envelopes_info is not None: + if self.extraction_envelopes_info is not None and index < len(self.extraction_envelopes_info): return self.extraction_envelopes_info[index] else: return f"Env{index}" def instrument_name(self, program_number): - if self.extraction_instruments_info is not None: + if self.extraction_instruments_info is not None and program_number in self.extraction_instruments_info: return self.extraction_instruments_info[program_number] else: return f"INST_{program_number}" def drum_grp_name(self, index): - if self.extraction_drums_info is not None: + if self.extraction_drums_info is not None and index < len(self.extraction_drums_info): return self.extraction_drums_info[index] else: return f"DRUM_{index}" def effect_name(self, index): - if self.extraction_effects_info is not None: + if self.extraction_effects_info is not None and index < len(self.extraction_effects_info): return self.extraction_effects_info[index] else: return f"EFFECT_{index}" @@ -905,21 +895,41 @@ class AudiobankFile: # add contents for names - if len(self.envelopes) != 0: + if len(self.envelopes) != 0 or len(self.extraction_envelopes_info_versions) != 0: xml.write_start_tag("Envelopes") - for i in range(len(self.envelopes)): + # First write envelopes that were defined in the extraction xml, possibly interleaved with envelopes + # we ignored for this version + i = 0 + for envelope_entry,in_version in self.extraction_envelopes_info_versions: + xml.write_element("Envelope", envelope_entry) + # Count how many envelopes we saw that were defined for this version + i += in_version + + # Write any remaining envelopes that weren't defined in the xml + for j in range(i, len(self.envelopes)): xml.write_element("Envelope", { - "Name" : self.envelope_name(i) + "Name" : self.envelope_name(j) }) xml.write_end_tag() - if len(self.instruments) != 0: + if len(self.instruments) != 0 or len(self.extraction_instruments_info_versions) != 0: xml.write_start_tag("Instruments") # Write in struct order - for instr in sorted(self.instruments, key=lambda instr : instr.struct_index): + sorted_instruments = tuple(sorted(self.instruments, key=lambda instr : instr.struct_index)) + + # First write instruments that were defined in the extraction xml, possibly interleaved with instruments + # we ignored for this version + i = 0 + for instr_entry,in_version in self.extraction_instruments_info_versions: + xml.write_element("Instrument", instr_entry) + # Count how many instruments we saw that were defined for this version + i += in_version + + # Write any remaining instruments that weren't defined in the xml + for instr in sorted_instruments[i:]: instr : Instrument if not instr.unused: xml.write_element("Instrument", { @@ -929,23 +939,39 @@ class AudiobankFile: xml.write_end_tag() - if any(isinstance(dg, DrumGroup) for dg in self.drum_groups): + if any(isinstance(dg, DrumGroup) for dg in self.drum_groups) or len(self.extraction_drums_info_versions): xml.write_start_tag("Drums") - for i,drum_grp in enumerate(self.drum_groups): + # First write drums that were defined in the extraction xml, possibly interleaved with drums + # we ignored for this version + i = 0 + for drum_entry,in_version in self.extraction_drums_info_versions: + xml.write_element("Drum", drum_entry) + # Count how many drum groups we saw that were defined for this version + i += in_version + + for j,drum_grp in enumerate(self.drum_groups[i:], i): if isinstance(drum_grp, DrumGroup): xml.write_element("Drum", { - "Name" : self.drum_grp_name(i) + "Name" : self.drum_grp_name(j) }) xml.write_end_tag() - if len(self.sfx) != 0: + if len(self.sfx) != 0 or len(self.extraction_effects_info_versions): xml.write_start_tag("Effects") - for i,sfx in enumerate(self.sfx): + # First write effects that were defined in the extraction xml, possibly interleaved with effects + # we ignored for this version + i = 0 + for sfx_entry,in_version in self.extraction_effects_info_versions: + xml.write_element("Effect", sfx_entry) + # Count how many effects we saw that were defined for this version + i += in_version + + for j,sfx in enumerate(self.sfx[i:], i): xml.write_element("Effect", { - "Name" : self.effect_name(i) + "Name" : self.effect_name(j) }) xml.write_end_tag() diff --git a/tools/audio/extraction/audiotable.py b/tools/audio/extraction/audiotable.py index 9511acecda..29a27695ae 100644 --- a/tools/audio/extraction/audiotable.py +++ b/tools/audio/extraction/audiotable.py @@ -5,11 +5,11 @@ # import math, struct -from typing import Dict, Tuple -from xml.etree.ElementTree import Element +from typing import Dict, Optional from .audio_tables import AudioCodeTableEntry from .audiobank_structs import AudioSampleCodec, SoundFontSample, AdpcmBook, AdpcmLoop +from .extraction_xml import SampleBankExtractionDescription from .tuning import pitch_names, note_z64_to_midi, recalc_tuning, rate_from_tuning, rank_rates_notes, BAD_FLOATS from .util import align, error, XMLWriter, f32_to_u32 @@ -207,7 +207,7 @@ class AudioTableSample(AudioTableData): def base_note_number(self): return note_z64_to_midi(pitch_names.index(self.base_note)) - def resolve_basenote_rate(self, extraction_sample_info : Dict[int, Dict[str,str]]): + def resolve_basenote_rate(self, extraction_sample_info : Optional[Dict[str,str]]): assert len(self.notes_rates) != 0 # rate_3ds = None @@ -285,13 +285,9 @@ class AudioTableSample(AudioTableData): final_rate,(final_note,) = rank_rates_notes(finalists) if extraction_sample_info is not None: - if self.start in extraction_sample_info: - entry = extraction_sample_info[self.start] - if "SampleRate" in entry and "BaseNote" in entry: - final_rate = int(entry["SampleRate"]) - final_note = entry["BaseNote"] - else: - print(f"WARNING: Missing extraction xml entry for sample at offset=0x{self.start:X}") + assert "SampleRate" in extraction_sample_info and "BaseNote" in extraction_sample_info + final_rate = int(extraction_sample_info["SampleRate"]) + final_note = extraction_sample_info["BaseNote"] # print(" ",len(FINAL_NOTES_RATES), FINAL_NOTES_RATES) # if rate_3ds is not None and len(FINAL_NOTES_RATES) == 1: @@ -385,7 +381,8 @@ class AudioTableFile: """ def __init__(self, bank_num : int, audiotable_seg : memoryview, table_entry : AudioCodeTableEntry, - seg_offset : int, buffer_bug : bool = False, extraction_xml : Tuple[str, Element] = None): + seg_offset : int, buffer_bug : bool = False, + extraction_desc : Optional[SampleBankExtractionDescription] = None): self.bank_num = bank_num self.table_entry : AudioCodeTableEntry = table_entry self.data = self.table_entry.data(audiotable_seg, seg_offset) @@ -393,24 +390,18 @@ class AudioTableFile: self.samples_final = None - if extraction_xml is None: + if extraction_desc is None: self.file_name = f"SampleBank_{self.bank_num}" self.name = f"SampleBank_{self.bank_num}" + self.extraction_sample_info_versions = [] self.extraction_sample_info = None self.extraction_blob_info = None else: - self.file_name = extraction_xml[0] - self.name = extraction_xml[1].attrib["Name"] - - self.extraction_sample_info = {} - self.extraction_blob_info = {} - for item in extraction_xml[1]: - if item.tag == "Sample": - self.extraction_sample_info[int(item.attrib["Offset"], 16)] = item.attrib - elif item.tag == "Blob": - self.extraction_blob_info[int(item.attrib["Offset"], 16)] = item.attrib - else: - assert False + self.file_name = extraction_desc.file_name + self.name = extraction_desc.name + self.extraction_sample_info_versions = extraction_desc.sample_info_versions + self.extraction_sample_info = extraction_desc.sample_info + self.extraction_blob_info = extraction_desc.blob_info self.pointer_indices = [] @@ -461,28 +452,24 @@ class AudioTableFile: return self.samples[offset] def sample_name(self, sample : AudioTableSample, index : int): - if self.extraction_sample_info is not None: - if sample.start in self.extraction_sample_info: - return self.extraction_sample_info[sample.start]["Name"] - print(f"WARNING: Missing extraction xml entry for sample at offset=0x{sample.start:X}") + if self.extraction_sample_info is not None and index < len(self.extraction_sample_info): + return self.extraction_sample_info[index]["Name"] + return f"SAMPLE_{self.bank_num}_{index}" def sample_filename(self, sample : AudioTableSample, index : int): ext = sample.codec_file_extension_compressed() - if self.extraction_sample_info is not None: - if sample.start in self.extraction_sample_info: - return self.extraction_sample_info[sample.start]["FileName"] + ext - print(f"WARNING: Missing extraction xml entry for sample at offset=0x{sample.start:X}") + if self.extraction_sample_info is not None and index < len(self.extraction_sample_info): + return self.extraction_sample_info[index]["FileName"] + ext npad = int(math.floor(1 + math.log10(len(self.samples)))) if len(self.samples) != 0 else 0 return f"Sample{index:0{npad}}{ext}" - def blob_filename(self, start, end): - if self.extraction_blob_info is not None: - if start in self.extraction_blob_info: - return self.extraction_blob_info[start]["Name"] - print(f"WARNING: Missing extraction xml entry for blob at offset=0x{start:X}") + def blob_filename(self, start, end, index): + if self.extraction_blob_info is not None and index < len(self.extraction_blob_info): + return self.extraction_blob_info[index]["Name"] + return f"UNACCOUNTED_{start:X}_{end:X}" def finalize_samples(self): @@ -490,7 +477,7 @@ class AudioTableFile: for i,sample in enumerate(self.samples_final): sample : AudioTableSample - sample.resolve_basenote_rate(self.extraction_sample_info) + sample.resolve_basenote_rate(self.extraction_sample_info[i] if self.extraction_sample_info is not None else None) def finalize_coverage(self, all_sample_banks): if len(self.coverage) != 0: @@ -577,6 +564,7 @@ class AudioTableFile: def assign_names(self): i = 0 + j = 0 for sample in self.samples_final: if isinstance(sample, AudioTableSample): sample : AudioTableSample @@ -587,9 +575,10 @@ class AudioTableFile: else: sample : AudioTableData - name = self.blob_filename(sample.start, sample.end) + name = self.blob_filename(sample.start, sample.end, j) sample.name = name sample.filename = f"{name}.bin" + j += 1 def to_xml(self, base_path): xml = XMLWriter() @@ -635,33 +624,36 @@ class AudioTableFile: xml.write_comment("This file is only for extraction of vanilla data. For other purposes see assets/audio/samplebanks/") - start = { + xml.write_start_tag("SampleBank", { "Name" : self.name, "Index" : self.bank_num, - } - xml.write_start_tag("SampleBank", start) + }) + # Write elements from the old xml version verbatim i = 0 - for sample in self.samples_final: + for entry_name,entry_attrs,in_version in self.extraction_sample_info_versions: + xml.write_element(entry_name, entry_attrs) + i += in_version + + # Write any new elements + for sample in self.samples_final[i:]: if isinstance(sample, AudioTableSample): sample : AudioTableSample - xml.write_element("Sample", { + attrs = { "Name" : sample.name, "FileName" : sample.filename.replace(sample.codec_file_extension_compressed(), ""), - "Offset" : f"0x{sample.start:06X}", "SampleRate" : sample.sample_rate, "BaseNote" : sample.base_note, - }) - i += 1 + } + xml.write_element("Sample", attrs) else: sample : AudioTableData - xml.write_element("Blob", { - "Name" : sample.name, - "Offset" : f"0x{sample.start:06X}", - "Size" : f"0x{sample.end - sample.start:X}", - }) + attrs = { + "Name" : sample.name, + } + xml.write_element("Blob", attrs) xml.write_end_tag() diff --git a/tools/audio/extraction/extraction_xml.py b/tools/audio/extraction/extraction_xml.py new file mode 100644 index 0000000000..f54b7749f0 --- /dev/null +++ b/tools/audio/extraction/extraction_xml.py @@ -0,0 +1,135 @@ +# SPDX-FileCopyrightText: © 2024 ZeldaRET +# SPDX-License-Identifier: CC0-1.0 +# +# +# + +from xml.etree import ElementTree +from xml.etree.ElementTree import Element + +from .util import error + +class ExtractionDescription: + + def __init__(self, file_path : str, file_name : str, version_name : str) -> None: + self.type_name = type(self).__name__.replace("ExtractionDescription", "") + self.file_name = file_name.replace(".xml", "") + self.file_path = file_path + + xml_root = ElementTree.parse(file_path).getroot() + if xml_root.tag != self.type_name or "Name" not in xml_root.attrib or "Index" not in xml_root.attrib: + error(f"Malformed {self.type_name} extraction xml: \"{file_path}\"") + + self.name = xml_root.attrib["Name"] + self.index = int(xml_root.attrib["Index"]) + + self.post_init(xml_root, version_name) + + def post_init(self, xml_root : Element, version_name : str): + raise NotImplementedError() # Implement in subclass + + def in_version(self, version_include, version_exclude, version_name : str): + if version_include == "": + version_include = "All" + if version_exclude == "": + version_exclude = "None" + + # Determine if this layout is the one we need + if version_include != "All": + version_include = version_include.split(",") + if version_exclude != "None": + version_exclude = version_exclude.split(",") + + included = version_include == "All" or version_name in version_include + excluded = version_exclude != "None" and version_name in version_exclude + + return included and not excluded + +class SampleBankExtractionDescription(ExtractionDescription): + + def post_init(self, xml_root : Element, version_name : str): + self.included_version = None + self.sample_info = [] + self.sample_info_versions = [] + self.blob_info = [] + + for item in xml_root: + if item.tag == "Sample": + version_include = item.attrib.get("VersionInclude", "") + version_exclude = item.attrib.get("VersionExclude", "") + in_version = self.in_version(version_include, version_exclude, version_name) + if in_version: + self.sample_info.append(item.attrib) + self.sample_info_versions.append((item.tag, item.attrib, in_version)) + elif item.tag == "Blob": + version_include = item.attrib.get("VersionInclude", "") + version_exclude = item.attrib.get("VersionExclude", "") + in_version = self.in_version(version_include, version_exclude, version_name) + if in_version: + self.blob_info.append(item.attrib) + self.sample_info_versions.append((item.attrib, in_version)) + else: + print(xml_root.attrib) + assert False, item.tag + +class SoundFontExtractionDescription(ExtractionDescription): + + def post_init(self, xml_root : Element, version_name : str): + self.envelopes_info = [] + self.instruments_info = {} + self.drums_info = [] + self.effects_info = [] + self.envelopes_info_versions = [] + self.instruments_info_versions = [] + self.drums_info_versions = [] + self.effects_info_versions = [] + + for item in xml_root: + if item.tag == "Envelopes": + for env in item: + assert env.tag == "Envelope" + + version_include = env.attrib.get("VersionInclude", "") + version_exclude = env.attrib.get("VersionExclude", "") + in_version = self.in_version(version_include, version_exclude, version_name) + if in_version: + self.envelopes_info.append(env.attrib["Name"]) + self.envelopes_info_versions.append((env.attrib, in_version)) + elif item.tag == "Instruments": + for instr in item: + assert instr.tag == "Instrument" + prg_num = int(instr.attrib["ProgramNumber"]) + + version_include = instr.attrib.get("VersionInclude", "") + version_exclude = instr.attrib.get("VersionExclude", "") + in_version = self.in_version(version_include, version_exclude, version_name) + if in_version: + self.instruments_info[prg_num] = instr.attrib["Name"] + self.instruments_info_versions.append((instr.attrib, in_version)) + elif item.tag == "Drums": + for drum in item: + assert drum.tag == "Drum" + + version_include = drum.attrib.get("VersionInclude", "") + version_exclude = drum.attrib.get("VersionExclude", "") + in_version = self.in_version(version_include, version_exclude, version_name) + if in_version: + self.drums_info.append(drum.attrib["Name"]) + self.drums_info_versions.append((drum.attrib, in_version)) + elif item.tag == "Effects": + for effect in item: + assert effect.tag == "Effect" + + version_include = effect.attrib.get("VersionInclude", "") + version_exclude = effect.attrib.get("VersionExclude", "") + in_version = self.in_version(version_include, version_exclude, version_name) + if in_version: + self.effects_info.append(effect.attrib["Name"]) + self.effects_info_versions.append((effect.attrib, in_version)) + else: + assert False, item.tag + +class SequenceExtractionDescription(ExtractionDescription): + + def post_init(self, xml_root : Element, version_name : str): + pass diff --git a/tools/audio_extraction.py b/tools/audio_extraction.py index 9c3a202648..ab5d5b3fb4 100644 --- a/tools/audio_extraction.py +++ b/tools/audio_extraction.py @@ -184,7 +184,8 @@ if __name__ == '__main__': ), } - version_info = GameVersionInfo(MMLVersion.OOT, + version_info = GameVersionInfo(version, + MMLVersion.OOT, soundfont_table_code_offset, seq_font_table_code_offset, seq_table_code_offset,