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,