diff --git a/include/enums.h b/include/enums.h
index 02b9f532a..4e573581e 100644
--- a/include/enums.h
+++ b/include/enums.h
@@ -2426,7 +2426,9 @@ typedef enum actor_e
ACTOR_3C9_FURNACE_FUN_PICK_PRICE,
ACTOR_3CA_ROCK_TRAPPING_GRUNTY,
ACTOR_3CB_UNKNOWN,
- ACTOR_3CC_DUMMY_PLAYER_ANCHOR = 0x3CC // Lighthouse [port] network anchor dummy player
+ ACTOR_3CC_DUMMY_PLAYER_ANCHOR = 0x3CC, // Lighthouse [port] network anchor dummy player
+ ACTOR_3CD_CUSTOM_COLLECTIBLE = 0x3CD, // Lighthouse [port] rando custom collectible
+
} ActorID;
enum bundle_e {
@@ -5969,6 +5971,7 @@ enum marker_e{
MARKER_29E_BIGBUTT_KNOCKED_DOWN,
MARKER_29F_DUMMY_PLAYER_ANCHOR,
+ MARKER_300_CUSTOM_COLLECTIBLE,
};
enum hitbox_e{
diff --git a/include/functions.h b/include/functions.h
index 8222da5b3..23fff6185 100644
--- a/include/functions.h
+++ b/include/functions.h
@@ -890,7 +890,7 @@ void chTumblar_copyPosition(s32 arg0, Struct68s *arg1, f32 arg2[3]);
void chTumblar_checkMMMChecksums(void);
// --- MMM/minigame_organ.c ---
-int func_80389CE8(s32 arg0, s32 arg1, s32 arg2);
+int func_80389CE8(Struct5Fs *arg0, Struct68s *arg1, s32 arg2);
s32 func_80389BBC(void);
void MMM_func_80389CD8();
void code3420_handleOrganGame(s32 arg0, s32 arg1);
diff --git a/port/objects/object_archipelago_item/gArchipelagoItemDL b/port/objects/object_archipelago_item/gArchipelagoItemDL
new file mode 100644
index 000000000..33e22a85f
--- /dev/null
+++ b/port/objects/object_archipelago_item/gArchipelagoItemDL
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/port/objects/object_archipelago_item/gArchipelagoItemDL_tri_0 b/port/objects/object_archipelago_item/gArchipelagoItemDL_tri_0
new file mode 100644
index 000000000..42e911411
--- /dev/null
+++ b/port/objects/object_archipelago_item/gArchipelagoItemDL_tri_0
@@ -0,0 +1,56 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/port/objects/object_archipelago_item/gArchipelagoItemDL_tri_1 b/port/objects/object_archipelago_item/gArchipelagoItemDL_tri_1
new file mode 100644
index 000000000..259b27c4e
--- /dev/null
+++ b/port/objects/object_archipelago_item/gArchipelagoItemDL_tri_1
@@ -0,0 +1,57 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/port/objects/object_archipelago_item/gArchipelagoItemDL_tri_2 b/port/objects/object_archipelago_item/gArchipelagoItemDL_tri_2
new file mode 100644
index 000000000..dc680a34a
--- /dev/null
+++ b/port/objects/object_archipelago_item/gArchipelagoItemDL_tri_2
@@ -0,0 +1,57 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/port/objects/object_archipelago_item/gArchipelagoItemDL_tri_3 b/port/objects/object_archipelago_item/gArchipelagoItemDL_tri_3
new file mode 100644
index 000000000..a134560fb
--- /dev/null
+++ b/port/objects/object_archipelago_item/gArchipelagoItemDL_tri_3
@@ -0,0 +1,57 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/port/objects/object_archipelago_item/gArchipelagoItemDL_tri_4 b/port/objects/object_archipelago_item/gArchipelagoItemDL_tri_4
new file mode 100644
index 000000000..65134138f
--- /dev/null
+++ b/port/objects/object_archipelago_item/gArchipelagoItemDL_tri_4
@@ -0,0 +1,57 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/port/objects/object_archipelago_item/gArchipelagoItemDL_tri_5 b/port/objects/object_archipelago_item/gArchipelagoItemDL_tri_5
new file mode 100644
index 000000000..3b458b736
--- /dev/null
+++ b/port/objects/object_archipelago_item/gArchipelagoItemDL_tri_5
@@ -0,0 +1,56 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/port/objects/object_archipelago_item/gArchipelagoItemDL_tri_6 b/port/objects/object_archipelago_item/gArchipelagoItemDL_tri_6
new file mode 100644
index 000000000..b21f2c4b7
--- /dev/null
+++ b/port/objects/object_archipelago_item/gArchipelagoItemDL_tri_6
@@ -0,0 +1,56 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/port/objects/object_archipelago_item/gArchipelagoItemDL_vtx_0 b/port/objects/object_archipelago_item/gArchipelagoItemDL_vtx_0
new file mode 100644
index 000000000..9f4483ec6
--- /dev/null
+++ b/port/objects/object_archipelago_item/gArchipelagoItemDL_vtx_0
@@ -0,0 +1,64 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/port/objects/object_archipelago_item/gArchipelagoItemDL_vtx_1 b/port/objects/object_archipelago_item/gArchipelagoItemDL_vtx_1
new file mode 100644
index 000000000..9339e42f0
--- /dev/null
+++ b/port/objects/object_archipelago_item/gArchipelagoItemDL_vtx_1
@@ -0,0 +1,77 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/port/objects/object_archipelago_item/gArchipelagoItemDL_vtx_2 b/port/objects/object_archipelago_item/gArchipelagoItemDL_vtx_2
new file mode 100644
index 000000000..e1122533a
--- /dev/null
+++ b/port/objects/object_archipelago_item/gArchipelagoItemDL_vtx_2
@@ -0,0 +1,70 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/port/objects/object_archipelago_item/gArchipelagoItemDL_vtx_3 b/port/objects/object_archipelago_item/gArchipelagoItemDL_vtx_3
new file mode 100644
index 000000000..29c025d0f
--- /dev/null
+++ b/port/objects/object_archipelago_item/gArchipelagoItemDL_vtx_3
@@ -0,0 +1,68 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/port/objects/object_archipelago_item/gArchipelagoItemDL_vtx_4 b/port/objects/object_archipelago_item/gArchipelagoItemDL_vtx_4
new file mode 100644
index 000000000..c3c88918b
--- /dev/null
+++ b/port/objects/object_archipelago_item/gArchipelagoItemDL_vtx_4
@@ -0,0 +1,69 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/port/objects/object_archipelago_item/gArchipelagoItemDL_vtx_5 b/port/objects/object_archipelago_item/gArchipelagoItemDL_vtx_5
new file mode 100644
index 000000000..70117ba12
--- /dev/null
+++ b/port/objects/object_archipelago_item/gArchipelagoItemDL_vtx_5
@@ -0,0 +1,64 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/port/objects/object_archipelago_item/gArchipelagoItemDL_vtx_6 b/port/objects/object_archipelago_item/gArchipelagoItemDL_vtx_6
new file mode 100644
index 000000000..70117ba12
--- /dev/null
+++ b/port/objects/object_archipelago_item/gArchipelagoItemDL_vtx_6
@@ -0,0 +1,64 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/port/objects/object_archipelago_item/gArchipelagoJunkDL b/port/objects/object_archipelago_item/gArchipelagoJunkDL
new file mode 100644
index 000000000..4beef5eb3
--- /dev/null
+++ b/port/objects/object_archipelago_item/gArchipelagoJunkDL
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/port/objects/object_archipelago_item/gArchipelagoJunkDL_tri_0 b/port/objects/object_archipelago_item/gArchipelagoJunkDL_tri_0
new file mode 100644
index 000000000..f2137f135
--- /dev/null
+++ b/port/objects/object_archipelago_item/gArchipelagoJunkDL_tri_0
@@ -0,0 +1,56 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/port/objects/object_archipelago_item/gArchipelagoJunkDL_tri_1 b/port/objects/object_archipelago_item/gArchipelagoJunkDL_tri_1
new file mode 100644
index 000000000..ae92327e4
--- /dev/null
+++ b/port/objects/object_archipelago_item/gArchipelagoJunkDL_tri_1
@@ -0,0 +1,57 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/port/objects/object_archipelago_item/gArchipelagoJunkDL_tri_2 b/port/objects/object_archipelago_item/gArchipelagoJunkDL_tri_2
new file mode 100644
index 000000000..bbbc96439
--- /dev/null
+++ b/port/objects/object_archipelago_item/gArchipelagoJunkDL_tri_2
@@ -0,0 +1,57 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/port/objects/object_archipelago_item/gArchipelagoJunkDL_tri_3 b/port/objects/object_archipelago_item/gArchipelagoJunkDL_tri_3
new file mode 100644
index 000000000..6d11e6b1c
--- /dev/null
+++ b/port/objects/object_archipelago_item/gArchipelagoJunkDL_tri_3
@@ -0,0 +1,57 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/port/objects/object_archipelago_item/gArchipelagoJunkDL_tri_4 b/port/objects/object_archipelago_item/gArchipelagoJunkDL_tri_4
new file mode 100644
index 000000000..827df8c0d
--- /dev/null
+++ b/port/objects/object_archipelago_item/gArchipelagoJunkDL_tri_4
@@ -0,0 +1,57 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/port/objects/object_archipelago_item/gArchipelagoJunkDL_tri_5 b/port/objects/object_archipelago_item/gArchipelagoJunkDL_tri_5
new file mode 100644
index 000000000..6714bf7a4
--- /dev/null
+++ b/port/objects/object_archipelago_item/gArchipelagoJunkDL_tri_5
@@ -0,0 +1,56 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/port/objects/object_archipelago_item/gArchipelagoJunkDL_tri_6 b/port/objects/object_archipelago_item/gArchipelagoJunkDL_tri_6
new file mode 100644
index 000000000..3980be483
--- /dev/null
+++ b/port/objects/object_archipelago_item/gArchipelagoJunkDL_tri_6
@@ -0,0 +1,56 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/port/objects/object_archipelago_item/gArchipelagoJunkDL_vtx_0 b/port/objects/object_archipelago_item/gArchipelagoJunkDL_vtx_0
new file mode 100644
index 000000000..9f4483ec6
--- /dev/null
+++ b/port/objects/object_archipelago_item/gArchipelagoJunkDL_vtx_0
@@ -0,0 +1,64 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/port/objects/object_archipelago_item/gArchipelagoJunkDL_vtx_1 b/port/objects/object_archipelago_item/gArchipelagoJunkDL_vtx_1
new file mode 100644
index 000000000..9339e42f0
--- /dev/null
+++ b/port/objects/object_archipelago_item/gArchipelagoJunkDL_vtx_1
@@ -0,0 +1,77 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/port/objects/object_archipelago_item/gArchipelagoJunkDL_vtx_2 b/port/objects/object_archipelago_item/gArchipelagoJunkDL_vtx_2
new file mode 100644
index 000000000..e1122533a
--- /dev/null
+++ b/port/objects/object_archipelago_item/gArchipelagoJunkDL_vtx_2
@@ -0,0 +1,70 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/port/objects/object_archipelago_item/gArchipelagoJunkDL_vtx_3 b/port/objects/object_archipelago_item/gArchipelagoJunkDL_vtx_3
new file mode 100644
index 000000000..29c025d0f
--- /dev/null
+++ b/port/objects/object_archipelago_item/gArchipelagoJunkDL_vtx_3
@@ -0,0 +1,68 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/port/objects/object_archipelago_item/gArchipelagoJunkDL_vtx_4 b/port/objects/object_archipelago_item/gArchipelagoJunkDL_vtx_4
new file mode 100644
index 000000000..c3c88918b
--- /dev/null
+++ b/port/objects/object_archipelago_item/gArchipelagoJunkDL_vtx_4
@@ -0,0 +1,69 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/port/objects/object_archipelago_item/gArchipelagoJunkDL_vtx_5 b/port/objects/object_archipelago_item/gArchipelagoJunkDL_vtx_5
new file mode 100644
index 000000000..70117ba12
--- /dev/null
+++ b/port/objects/object_archipelago_item/gArchipelagoJunkDL_vtx_5
@@ -0,0 +1,64 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/port/objects/object_archipelago_item/gArchipelagoJunkDL_vtx_6 b/port/objects/object_archipelago_item/gArchipelagoJunkDL_vtx_6
new file mode 100644
index 000000000..70117ba12
--- /dev/null
+++ b/port/objects/object_archipelago_item/gArchipelagoJunkDL_vtx_6
@@ -0,0 +1,64 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/port/objects/object_archipelago_item/gArchipelagoProgressiveDL b/port/objects/object_archipelago_item/gArchipelagoProgressiveDL
new file mode 100644
index 000000000..ed07b28c9
--- /dev/null
+++ b/port/objects/object_archipelago_item/gArchipelagoProgressiveDL
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/port/objects/object_archipelago_item/gArchipelagoProgressiveDL_tri_0 b/port/objects/object_archipelago_item/gArchipelagoProgressiveDL_tri_0
new file mode 100644
index 000000000..1a679a463
--- /dev/null
+++ b/port/objects/object_archipelago_item/gArchipelagoProgressiveDL_tri_0
@@ -0,0 +1,56 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/port/objects/object_archipelago_item/gArchipelagoProgressiveDL_tri_1 b/port/objects/object_archipelago_item/gArchipelagoProgressiveDL_tri_1
new file mode 100644
index 000000000..f49d299ef
--- /dev/null
+++ b/port/objects/object_archipelago_item/gArchipelagoProgressiveDL_tri_1
@@ -0,0 +1,57 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/port/objects/object_archipelago_item/gArchipelagoProgressiveDL_tri_2 b/port/objects/object_archipelago_item/gArchipelagoProgressiveDL_tri_2
new file mode 100644
index 000000000..ea82a9347
--- /dev/null
+++ b/port/objects/object_archipelago_item/gArchipelagoProgressiveDL_tri_2
@@ -0,0 +1,57 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/port/objects/object_archipelago_item/gArchipelagoProgressiveDL_tri_3 b/port/objects/object_archipelago_item/gArchipelagoProgressiveDL_tri_3
new file mode 100644
index 000000000..8cfca6524
--- /dev/null
+++ b/port/objects/object_archipelago_item/gArchipelagoProgressiveDL_tri_3
@@ -0,0 +1,57 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/port/objects/object_archipelago_item/gArchipelagoProgressiveDL_tri_4 b/port/objects/object_archipelago_item/gArchipelagoProgressiveDL_tri_4
new file mode 100644
index 000000000..639c5aea4
--- /dev/null
+++ b/port/objects/object_archipelago_item/gArchipelagoProgressiveDL_tri_4
@@ -0,0 +1,57 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/port/objects/object_archipelago_item/gArchipelagoProgressiveDL_tri_5 b/port/objects/object_archipelago_item/gArchipelagoProgressiveDL_tri_5
new file mode 100644
index 000000000..99a4852cb
--- /dev/null
+++ b/port/objects/object_archipelago_item/gArchipelagoProgressiveDL_tri_5
@@ -0,0 +1,56 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/port/objects/object_archipelago_item/gArchipelagoProgressiveDL_tri_6 b/port/objects/object_archipelago_item/gArchipelagoProgressiveDL_tri_6
new file mode 100644
index 000000000..e7ab8546c
--- /dev/null
+++ b/port/objects/object_archipelago_item/gArchipelagoProgressiveDL_tri_6
@@ -0,0 +1,41 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/port/objects/object_archipelago_item/gArchipelagoProgressiveDL_tri_7 b/port/objects/object_archipelago_item/gArchipelagoProgressiveDL_tri_7
new file mode 100644
index 000000000..0f50ed430
--- /dev/null
+++ b/port/objects/object_archipelago_item/gArchipelagoProgressiveDL_tri_7
@@ -0,0 +1,41 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/port/objects/object_archipelago_item/gArchipelagoProgressiveDL_vtx_0 b/port/objects/object_archipelago_item/gArchipelagoProgressiveDL_vtx_0
new file mode 100644
index 000000000..9f4483ec6
--- /dev/null
+++ b/port/objects/object_archipelago_item/gArchipelagoProgressiveDL_vtx_0
@@ -0,0 +1,64 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/port/objects/object_archipelago_item/gArchipelagoProgressiveDL_vtx_1 b/port/objects/object_archipelago_item/gArchipelagoProgressiveDL_vtx_1
new file mode 100644
index 000000000..9339e42f0
--- /dev/null
+++ b/port/objects/object_archipelago_item/gArchipelagoProgressiveDL_vtx_1
@@ -0,0 +1,77 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/port/objects/object_archipelago_item/gArchipelagoProgressiveDL_vtx_2 b/port/objects/object_archipelago_item/gArchipelagoProgressiveDL_vtx_2
new file mode 100644
index 000000000..e1122533a
--- /dev/null
+++ b/port/objects/object_archipelago_item/gArchipelagoProgressiveDL_vtx_2
@@ -0,0 +1,70 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/port/objects/object_archipelago_item/gArchipelagoProgressiveDL_vtx_3 b/port/objects/object_archipelago_item/gArchipelagoProgressiveDL_vtx_3
new file mode 100644
index 000000000..29c025d0f
--- /dev/null
+++ b/port/objects/object_archipelago_item/gArchipelagoProgressiveDL_vtx_3
@@ -0,0 +1,68 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/port/objects/object_archipelago_item/gArchipelagoProgressiveDL_vtx_4 b/port/objects/object_archipelago_item/gArchipelagoProgressiveDL_vtx_4
new file mode 100644
index 000000000..c3c88918b
--- /dev/null
+++ b/port/objects/object_archipelago_item/gArchipelagoProgressiveDL_vtx_4
@@ -0,0 +1,69 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/port/objects/object_archipelago_item/gArchipelagoProgressiveDL_vtx_5 b/port/objects/object_archipelago_item/gArchipelagoProgressiveDL_vtx_5
new file mode 100644
index 000000000..70117ba12
--- /dev/null
+++ b/port/objects/object_archipelago_item/gArchipelagoProgressiveDL_vtx_5
@@ -0,0 +1,64 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/port/objects/object_archipelago_item/gArchipelagoProgressiveDL_vtx_6 b/port/objects/object_archipelago_item/gArchipelagoProgressiveDL_vtx_6
new file mode 100644
index 000000000..b76b5b312
--- /dev/null
+++ b/port/objects/object_archipelago_item/gArchipelagoProgressiveDL_vtx_6
@@ -0,0 +1,39 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/port/objects/object_archipelago_item/gArchipelagoProgressiveDL_vtx_7 b/port/objects/object_archipelago_item/gArchipelagoProgressiveDL_vtx_7
new file mode 100644
index 000000000..b76b5b312
--- /dev/null
+++ b/port/objects/object_archipelago_item/gArchipelagoProgressiveDL_vtx_7
@@ -0,0 +1,39 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/port/objects/object_archipelago_item/mat_gArchipelagoItemDL_black b/port/objects/object_archipelago_item/mat_gArchipelagoItemDL_black
new file mode 100644
index 000000000..7ef279db5
--- /dev/null
+++ b/port/objects/object_archipelago_item/mat_gArchipelagoItemDL_black
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/port/objects/object_archipelago_item/mat_gArchipelagoItemDL_blue b/port/objects/object_archipelago_item/mat_gArchipelagoItemDL_blue
new file mode 100644
index 000000000..770d70e48
--- /dev/null
+++ b/port/objects/object_archipelago_item/mat_gArchipelagoItemDL_blue
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/port/objects/object_archipelago_item/mat_gArchipelagoItemDL_green b/port/objects/object_archipelago_item/mat_gArchipelagoItemDL_green
new file mode 100644
index 000000000..9a57f3f8c
--- /dev/null
+++ b/port/objects/object_archipelago_item/mat_gArchipelagoItemDL_green
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/port/objects/object_archipelago_item/mat_gArchipelagoItemDL_orange b/port/objects/object_archipelago_item/mat_gArchipelagoItemDL_orange
new file mode 100644
index 000000000..c3da3eff1
--- /dev/null
+++ b/port/objects/object_archipelago_item/mat_gArchipelagoItemDL_orange
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/port/objects/object_archipelago_item/mat_gArchipelagoItemDL_outline b/port/objects/object_archipelago_item/mat_gArchipelagoItemDL_outline
new file mode 100644
index 000000000..d39d1af92
--- /dev/null
+++ b/port/objects/object_archipelago_item/mat_gArchipelagoItemDL_outline
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/port/objects/object_archipelago_item/mat_gArchipelagoItemDL_pink b/port/objects/object_archipelago_item/mat_gArchipelagoItemDL_pink
new file mode 100644
index 000000000..e3b896b02
--- /dev/null
+++ b/port/objects/object_archipelago_item/mat_gArchipelagoItemDL_pink
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/port/objects/object_archipelago_item/mat_gArchipelagoItemDL_purple b/port/objects/object_archipelago_item/mat_gArchipelagoItemDL_purple
new file mode 100644
index 000000000..64f362026
--- /dev/null
+++ b/port/objects/object_archipelago_item/mat_gArchipelagoItemDL_purple
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/port/objects/object_archipelago_item/mat_gArchipelagoItemDL_red b/port/objects/object_archipelago_item/mat_gArchipelagoItemDL_red
new file mode 100644
index 000000000..8cc9fec5e
--- /dev/null
+++ b/port/objects/object_archipelago_item/mat_gArchipelagoItemDL_red
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/port/objects/object_archipelago_item/mat_gArchipelagoItemDL_yellow b/port/objects/object_archipelago_item/mat_gArchipelagoItemDL_yellow
new file mode 100644
index 000000000..1b0d4be92
--- /dev/null
+++ b/port/objects/object_archipelago_item/mat_gArchipelagoItemDL_yellow
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/port/objects/object_archipelago_item/mat_gArchipelagoJunkDL_black_junk b/port/objects/object_archipelago_item/mat_gArchipelagoJunkDL_black_junk
new file mode 100644
index 000000000..7ef279db5
--- /dev/null
+++ b/port/objects/object_archipelago_item/mat_gArchipelagoJunkDL_black_junk
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/port/objects/object_archipelago_item/mat_gArchipelagoJunkDL_blue_junk b/port/objects/object_archipelago_item/mat_gArchipelagoJunkDL_blue_junk
new file mode 100644
index 000000000..b8f17f3bf
--- /dev/null
+++ b/port/objects/object_archipelago_item/mat_gArchipelagoJunkDL_blue_junk
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/port/objects/object_archipelago_item/mat_gArchipelagoJunkDL_green_junk b/port/objects/object_archipelago_item/mat_gArchipelagoJunkDL_green_junk
new file mode 100644
index 000000000..05312bc76
--- /dev/null
+++ b/port/objects/object_archipelago_item/mat_gArchipelagoJunkDL_green_junk
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/port/objects/object_archipelago_item/mat_gArchipelagoJunkDL_grey_blue b/port/objects/object_archipelago_item/mat_gArchipelagoJunkDL_grey_blue
new file mode 100644
index 000000000..a55a1459a
--- /dev/null
+++ b/port/objects/object_archipelago_item/mat_gArchipelagoJunkDL_grey_blue
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/port/objects/object_archipelago_item/mat_gArchipelagoJunkDL_grey_green b/port/objects/object_archipelago_item/mat_gArchipelagoJunkDL_grey_green
new file mode 100644
index 000000000..20d667aa3
--- /dev/null
+++ b/port/objects/object_archipelago_item/mat_gArchipelagoJunkDL_grey_green
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/port/objects/object_archipelago_item/mat_gArchipelagoJunkDL_grey_orange b/port/objects/object_archipelago_item/mat_gArchipelagoJunkDL_grey_orange
new file mode 100644
index 000000000..ad2a5ac38
--- /dev/null
+++ b/port/objects/object_archipelago_item/mat_gArchipelagoJunkDL_grey_orange
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/port/objects/object_archipelago_item/mat_gArchipelagoJunkDL_grey_outline b/port/objects/object_archipelago_item/mat_gArchipelagoJunkDL_grey_outline
new file mode 100644
index 000000000..d39d1af92
--- /dev/null
+++ b/port/objects/object_archipelago_item/mat_gArchipelagoJunkDL_grey_outline
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/port/objects/object_archipelago_item/mat_gArchipelagoJunkDL_grey_pink b/port/objects/object_archipelago_item/mat_gArchipelagoJunkDL_grey_pink
new file mode 100644
index 000000000..a3d546483
--- /dev/null
+++ b/port/objects/object_archipelago_item/mat_gArchipelagoJunkDL_grey_pink
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/port/objects/object_archipelago_item/mat_gArchipelagoJunkDL_grey_red b/port/objects/object_archipelago_item/mat_gArchipelagoJunkDL_grey_red
new file mode 100644
index 000000000..78236fa28
--- /dev/null
+++ b/port/objects/object_archipelago_item/mat_gArchipelagoJunkDL_grey_red
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/port/objects/object_archipelago_item/mat_gArchipelagoJunkDL_grey_yellow b/port/objects/object_archipelago_item/mat_gArchipelagoJunkDL_grey_yellow
new file mode 100644
index 000000000..8def121b7
--- /dev/null
+++ b/port/objects/object_archipelago_item/mat_gArchipelagoJunkDL_grey_yellow
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/port/objects/object_archipelago_item/mat_gArchipelagoJunkDL_orange_junk b/port/objects/object_archipelago_item/mat_gArchipelagoJunkDL_orange_junk
new file mode 100644
index 000000000..17867ed9c
--- /dev/null
+++ b/port/objects/object_archipelago_item/mat_gArchipelagoJunkDL_orange_junk
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/port/objects/object_archipelago_item/mat_gArchipelagoJunkDL_purple_junk b/port/objects/object_archipelago_item/mat_gArchipelagoJunkDL_purple_junk
new file mode 100644
index 000000000..7a880f3e9
--- /dev/null
+++ b/port/objects/object_archipelago_item/mat_gArchipelagoJunkDL_purple_junk
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/port/objects/object_archipelago_item/mat_gArchipelagoJunkDL_red_junk b/port/objects/object_archipelago_item/mat_gArchipelagoJunkDL_red_junk
new file mode 100644
index 000000000..20b763643
--- /dev/null
+++ b/port/objects/object_archipelago_item/mat_gArchipelagoJunkDL_red_junk
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/port/objects/object_archipelago_item/mat_gArchipelagoJunkDL_yellow_junk b/port/objects/object_archipelago_item/mat_gArchipelagoJunkDL_yellow_junk
new file mode 100644
index 000000000..7e88e53d7
--- /dev/null
+++ b/port/objects/object_archipelago_item/mat_gArchipelagoJunkDL_yellow_junk
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/port/objects/object_archipelago_item/mat_gArchipelagoProgressiveDL_arrow_gold_progressive b/port/objects/object_archipelago_item/mat_gArchipelagoProgressiveDL_arrow_gold_progressive
new file mode 100644
index 000000000..fa76abb08
--- /dev/null
+++ b/port/objects/object_archipelago_item/mat_gArchipelagoProgressiveDL_arrow_gold_progressive
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/port/objects/object_archipelago_item/mat_gArchipelagoProgressiveDL_black_progressive b/port/objects/object_archipelago_item/mat_gArchipelagoProgressiveDL_black_progressive
new file mode 100644
index 000000000..7ef279db5
--- /dev/null
+++ b/port/objects/object_archipelago_item/mat_gArchipelagoProgressiveDL_black_progressive
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/port/objects/object_archipelago_item/mat_gArchipelagoProgressiveDL_blue_progressive b/port/objects/object_archipelago_item/mat_gArchipelagoProgressiveDL_blue_progressive
new file mode 100644
index 000000000..770d70e48
--- /dev/null
+++ b/port/objects/object_archipelago_item/mat_gArchipelagoProgressiveDL_blue_progressive
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/port/objects/object_archipelago_item/mat_gArchipelagoProgressiveDL_green_progressive b/port/objects/object_archipelago_item/mat_gArchipelagoProgressiveDL_green_progressive
new file mode 100644
index 000000000..9a57f3f8c
--- /dev/null
+++ b/port/objects/object_archipelago_item/mat_gArchipelagoProgressiveDL_green_progressive
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/port/objects/object_archipelago_item/mat_gArchipelagoProgressiveDL_orange_progressive b/port/objects/object_archipelago_item/mat_gArchipelagoProgressiveDL_orange_progressive
new file mode 100644
index 000000000..c3da3eff1
--- /dev/null
+++ b/port/objects/object_archipelago_item/mat_gArchipelagoProgressiveDL_orange_progressive
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/port/objects/object_archipelago_item/mat_gArchipelagoProgressiveDL_progressive_arrow b/port/objects/object_archipelago_item/mat_gArchipelagoProgressiveDL_progressive_arrow
new file mode 100644
index 000000000..c41b05db9
--- /dev/null
+++ b/port/objects/object_archipelago_item/mat_gArchipelagoProgressiveDL_progressive_arrow
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/port/objects/object_archipelago_item/mat_gArchipelagoProgressiveDL_progressive_blue b/port/objects/object_archipelago_item/mat_gArchipelagoProgressiveDL_progressive_blue
new file mode 100644
index 000000000..c9073d0cf
--- /dev/null
+++ b/port/objects/object_archipelago_item/mat_gArchipelagoProgressiveDL_progressive_blue
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/port/objects/object_archipelago_item/mat_gArchipelagoProgressiveDL_progressive_green b/port/objects/object_archipelago_item/mat_gArchipelagoProgressiveDL_progressive_green
new file mode 100644
index 000000000..84e26fe7a
--- /dev/null
+++ b/port/objects/object_archipelago_item/mat_gArchipelagoProgressiveDL_progressive_green
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/port/objects/object_archipelago_item/mat_gArchipelagoProgressiveDL_progressive_orange b/port/objects/object_archipelago_item/mat_gArchipelagoProgressiveDL_progressive_orange
new file mode 100644
index 000000000..076acfe28
--- /dev/null
+++ b/port/objects/object_archipelago_item/mat_gArchipelagoProgressiveDL_progressive_orange
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/port/objects/object_archipelago_item/mat_gArchipelagoProgressiveDL_progressive_outline b/port/objects/object_archipelago_item/mat_gArchipelagoProgressiveDL_progressive_outline
new file mode 100644
index 000000000..d39d1af92
--- /dev/null
+++ b/port/objects/object_archipelago_item/mat_gArchipelagoProgressiveDL_progressive_outline
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/port/objects/object_archipelago_item/mat_gArchipelagoProgressiveDL_progressive_pink b/port/objects/object_archipelago_item/mat_gArchipelagoProgressiveDL_progressive_pink
new file mode 100644
index 000000000..e3b896b02
--- /dev/null
+++ b/port/objects/object_archipelago_item/mat_gArchipelagoProgressiveDL_progressive_pink
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/port/objects/object_archipelago_item/mat_gArchipelagoProgressiveDL_progressive_red b/port/objects/object_archipelago_item/mat_gArchipelagoProgressiveDL_progressive_red
new file mode 100644
index 000000000..930fb41e6
--- /dev/null
+++ b/port/objects/object_archipelago_item/mat_gArchipelagoProgressiveDL_progressive_red
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/port/objects/object_archipelago_item/mat_gArchipelagoProgressiveDL_progressive_yellow b/port/objects/object_archipelago_item/mat_gArchipelagoProgressiveDL_progressive_yellow
new file mode 100644
index 000000000..383d9441c
--- /dev/null
+++ b/port/objects/object_archipelago_item/mat_gArchipelagoProgressiveDL_progressive_yellow
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/port/objects/object_archipelago_item/mat_gArchipelagoProgressiveDL_purple_progressive b/port/objects/object_archipelago_item/mat_gArchipelagoProgressiveDL_purple_progressive
new file mode 100644
index 000000000..64f362026
--- /dev/null
+++ b/port/objects/object_archipelago_item/mat_gArchipelagoProgressiveDL_purple_progressive
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/port/objects/object_archipelago_item/mat_gArchipelagoProgressiveDL_red_progressive b/port/objects/object_archipelago_item/mat_gArchipelagoProgressiveDL_red_progressive
new file mode 100644
index 000000000..8cc9fec5e
--- /dev/null
+++ b/port/objects/object_archipelago_item/mat_gArchipelagoProgressiveDL_red_progressive
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/port/objects/object_archipelago_item/mat_gArchipelagoProgressiveDL_yellow_progressive b/port/objects/object_archipelago_item/mat_gArchipelagoProgressiveDL_yellow_progressive
new file mode 100644
index 000000000..1b0d4be92
--- /dev/null
+++ b/port/objects/object_archipelago_item/mat_gArchipelagoProgressiveDL_yellow_progressive
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/port/objects/object_archipelago_item/model.xml b/port/objects/object_archipelago_item/model.xml
new file mode 100644
index 000000000..e69de29bb
diff --git a/src/MMM/minigame_organ.c b/src/MMM/minigame_organ.c
index 7333e0340..0b2d0a091 100644
--- a/src/MMM/minigame_organ.c
+++ b/src/MMM/minigame_organ.c
@@ -280,7 +280,9 @@ void MMM_func_80389CD8() {}
void func_80389CE0() {}
-int func_80389CE8(s32 arg0, s32 arg1, s32 arg2){
+// [port] pointer truncation
+//int func_80389CE8(s32 arg0, s32 arg1, s32 arg2){
+int func_80389CE8(Struct5Fs *arg0, Struct68s *arg1, s32 arg2){
if(Me.state == 3){
if(*Me.unk10 == arg2){
Me.unk0--;
@@ -296,7 +298,8 @@ int func_80389CE8(s32 arg0, s32 arg1, s32 arg2){
return 1;
}//L80389D6C
else{
- func_8028F55C(0xD, func_80351794((Struct68s *)(intptr_t)arg1));
+// func_8028F55C(0xD, func_80351794((Struct68s *)(intptr_t)arg1));
+ func_8028F55C(0xD, func_80351794(arg1));
return 2;
}
}
diff --git a/src/MMM/organ_tiles.c b/src/MMM/organ_tiles.c
index f9b94b5c5..42d4b2836 100644
--- a/src/MMM/organ_tiles.c
+++ b/src/MMM/organ_tiles.c
@@ -137,7 +137,8 @@ void func_8038B790(Struct5Fs *arg0, Struct68s *arg1, f32 arg2) {
func_80351814(arg1, sp2C);
if (func_803518C0(arg1) != 0) {
- temp_v0 = func_80389CE8((s32)(intptr_t)arg0, (s32)(intptr_t)arg1, arg0->unk8);
+// temp_v0 = func_80389CE8((s32)(intptr_t)arg0, (s32)(intptr_t)arg1, arg0->unk8);
+ temp_v0 = func_80389CE8(arg0, arg1, arg0->unk8);
if (temp_v0 == 0) {
func_8038B6FC(arg0, arg1);
}
diff --git a/src/core2/actor_cubepropsystem.c b/src/core2/actor_cubepropsystem.c
index 7fef90277..4f778b6f4 100644
--- a/src/core2/actor_cubepropsystem.c
+++ b/src/core2/actor_cubepropsystem.c
@@ -1813,7 +1813,7 @@ BKSpriteDisplayData *func_80330E54(ActorMarker *marker, BKSprite **sprite_ptr) {
return 0;
}
model_cache_ptr = &modelCache[marker_getActor(marker)->modelCacheIndex];
- if (model_cache_ptr->unk4 == 0) {
+ if (model_cache_ptr->unk4 == 00 || marker->id == MARKER_300_CUSTOM_COLLECTIBLE) {
model_cache_ptr->unk4 = codeB3A80_getSprite(marker->modelId, &model_cache_ptr->unk8);
}
model_cache_ptr->unk10 = globalTimer_getTime();
@@ -2231,6 +2231,9 @@ f32 func_80331E64(ActorMarker *marker) {
if (marker->modelId == 0) {
return 0.0f;
}
+ if (marker->id == MARKER_300_CUSTOM_COLLECTIBLE) {
+ return 150.0f;
+ }
sp24 = func_80331D20(func_80330F50(marker));
marker->unk38[1] = (s16) (sp24 / 2);
if (marker->unk3E_0) {
diff --git a/src/core2/ba/marker.c b/src/core2/ba/marker.c
index 82519a10e..81c8e406b 100644
--- a/src/core2/ba/marker.c
+++ b/src/core2/ba/marker.c
@@ -843,6 +843,9 @@ void __baMarker_resolveCollision(Prop *other_prop){
if (plyr_hitbox_type == HITBOX_1_BEAK_BUSTER)
obj_collision_type = MARKER_COLLISION_FUNC_1;
break;
+ case MARKER_300_CUSTOM_COLLECTIBLE:
+ marker_callCollisionFunc(playerMarker, marker, plyr_collision_type);
+ break;
}//L8028D034
if (baiFrame_getState() == 3) {
plyr_collision_type = MARKER_COLLISION_FUNC_0;
diff --git a/src/core2/fx/effect_jiggy_spawn.c b/src/core2/fx/effect_jiggy_spawn.c
index f50f5fa4f..7a83e79f8 100644
--- a/src/core2/fx/effect_jiggy_spawn.c
+++ b/src/core2/fx/effect_jiggy_spawn.c
@@ -7,6 +7,9 @@
void func_80347B10(Struct81s *arg0){
Actor *actor;
actor = bundle_spawn_f32(BUNDLE_10__JIGGY, arg0->position);
+ if (actor == NULL) {
+ return;
+ }
actor->unk54 = 3.0f;
func_803333DC(arg0, actor);
}
diff --git a/src/core2/scorequeue/lifescore.c b/src/core2/scorequeue/lifescore.c
index 0dbf6df22..840c840e4 100644
--- a/src/core2/scorequeue/lifescore.c
+++ b/src/core2/scorequeue/lifescore.c
@@ -35,7 +35,14 @@ struct8s D_80381ED0;
/* .code */
s32 func_802FFDE0(s32 arg0){
- return D_8036A260[arg0/4];
+// [port] Off by one
+// return D_8036A260[arg0/4];
+ s32 idx = arg0/4;
+ s32 last = (s32)(sizeof(D_8036A260)/sizeof(D_8036A260[0])) - 1;
+ if (idx > last) {
+ idx = last;
+ }
+ return D_8036A260[idx];
}
s32 func_802FFE04(void){
diff --git a/src/core2/sprite/rendertex.c b/src/core2/sprite/rendertex.c
index 29e33f5bf..df54d589f 100644
--- a/src/core2/sprite/rendertex.c
+++ b/src/core2/sprite/rendertex.c
@@ -75,6 +75,9 @@ s32 spriteRender1PrimMode;
void func_80347DF0(Struct81s *arg0){
Actor *actor;
actor = bundle_spawn_f32(arg0->actor_id, arg0->position);
+ if (actor == NULL) {
+ return;
+ }
if (!EventSystem_Should(VB_BUNDLE_SPAWN_SET_ACTOR_DATA, false, actor)) {
actor->unk54 = 3.0f;
func_803333DC(arg0, actor);
diff --git a/src/port/Enhancements/Backports/TooieJiggyDance.cpp b/src/port/Enhancements/Backports/TooieJiggyDance.cpp
index cc5510808..3c9da21e8 100644
--- a/src/port/Enhancements/Backports/TooieJiggyDance.cpp
+++ b/src/port/Enhancements/Backports/TooieJiggyDance.cpp
@@ -8,6 +8,7 @@
#include "port/UI/cvar_prefixes.h"
#include "port/Enhancements/Events/Hooks/Events.h"
#include "port/ShipInit.hpp"
+#include "port/Rando/Rando.h"
#include "functions.h"
extern "C" {
@@ -113,7 +114,7 @@ void emitSparkle(f32 x, f32 y, f32 z) {
}
}
-void spawnOrbit() {
+extern "C" void spawnOrbit() {
clearOrbit();
f32 banjo[3];
@@ -273,7 +274,7 @@ void RegisterJiggyCollect_Init() {
clearOrbit();
const bool skip = CVarGetInteger(CVAR_SKIP_JIGGY_DANCE, 0);
const bool tooie = CVarGetInteger(CVAR_TOOIE_JIGGY_DANCE, 0) || sJiggyDanceForced;
- const bool playOrbit = tooie && !skip;
+ const bool playOrbit = (tooie && !skip) || IS_RANDO;
COND_VB_SHOULD(VB_PLAY_JIGGY_DANCE, EVENT_PRIORITY_NORMAL, skip || tooie, { *should = false; });
@@ -288,4 +289,4 @@ void TooieJiggyDance_ForceEnable() {
}
static RegisterShipInitFunc initJiggyCollect(RegisterJiggyCollect_Init,
- { CVAR_TOOIE_JIGGY_DANCE, CVAR_SKIP_JIGGY_DANCE });
+ { CVAR_TOOIE_JIGGY_DANCE, CVAR_SKIP_JIGGY_DANCE, "IS_RANDO" });
diff --git a/src/port/Enhancements/Cheats/Cheats.cpp b/src/port/Enhancements/Cheats/Cheats.cpp
index 178e3faa8..e547ee054 100644
--- a/src/port/Enhancements/Cheats/Cheats.cpp
+++ b/src/port/Enhancements/Cheats/Cheats.cpp
@@ -215,11 +215,19 @@ static bool isWishyWashyUnlocked() {
return (baanim_getActiveBottlesBonusMask() & BAANIM_WISHYWASHY) != 0;
}
+static bool jiggyCollectInFlight() {
+ return baflag_isTrue(BA_FLAG_7_TOUCHING_JIGGY) || bsjig_inJiggyJig((enum bs_e)bs_getState());
+}
+
// Transformation cycling with D-pad Up/Down
// D-pad Up: Cycle forward through transformations (Banjo -> Termite -> ... -> Bee -> [Wishy] -> Banjo)
// D-pad Down: Cycle backward through transformations (Banjo -> [Wishy] -> Bee -> ... -> Termite -> Banjo)
void RegisterCycleTransform_Init() {
COND_HOOK(GameFrameUpdate, EVENT_PRIORITY_NORMAL, CVarGetInteger(CVAR_CYCLE_TRANSFORM, 0), [](IEvent* event) {
+ if (jiggyCollectInFlight()) {
+ return;
+ }
+
s32 currentTransform = (s32)player_getTransformation();
// D-pad Up: Cycle forward through transformations
diff --git a/src/port/Enhancements/Retention/JinjoRetention.cpp b/src/port/Enhancements/Retention/JinjoRetention.cpp
index d820e8510..e280ed9e5 100644
--- a/src/port/Enhancements/Retention/JinjoRetention.cpp
+++ b/src/port/Enhancements/Retention/JinjoRetention.cpp
@@ -58,12 +58,12 @@ static bool levelInRange(int32_t level) {
return level > 0 && level < JINJO_RETENTION_LEVEL_SLOTS;
}
-static u8 collectedBits(int32_t level) {
+uint8_t collectedBits(int32_t level) {
JinjoRetentionSaveData* s = store();
return (s != nullptr && levelInRange(level)) ? s->collected[level] : 0;
}
-static void setCollectedBits(int32_t level, u8 bits) {
+void setCollectedBits(int32_t level, u8 bits) {
JinjoRetentionSaveData* s = store();
if (s != nullptr && levelInRange(level)) {
s->collected[level] = bits;
@@ -87,7 +87,7 @@ static u8 jinjoBitFromMarker(int32_t markerId) {
}
}
-static u8 jinjoBitFromActor(int32_t actorId) {
+uint8_t jinjoBitFromActor(int32_t actorId) {
switch (actorId) {
case ACTOR_60_JINJO_BLUE:
return 1 << 0;
diff --git a/src/port/Enhancements/Retention/Retention.h b/src/port/Enhancements/Retention/Retention.h
index 140dbbc7b..63a19352a 100644
--- a/src/port/Enhancements/Retention/Retention.h
+++ b/src/port/Enhancements/Retention/Retention.h
@@ -62,6 +62,10 @@ int32_t port_carriedSync_consumeRemoteDespawn(int32_t kind, void* marker);
int32_t port_carriedSync_collectedCount(int32_t kind);
+void setCollectedBits(int32_t level, u8 bits);
+uint8_t jinjoBitFromActor(int32_t actorId);
+uint8_t collectedBits(int32_t level);
+
#ifdef __cplusplus
}
diff --git a/src/port/Network/Anchor/HookHandlers.cpp b/src/port/Network/Anchor/HookHandlers.cpp
index 58f1c8921..6963775f7 100644
--- a/src/port/Network/Anchor/HookHandlers.cpp
+++ b/src/port/Network/Anchor/HookHandlers.cpp
@@ -517,24 +517,6 @@ void Anchor::RegisterHooks() {
anchor->SendPacket_SetCheckStatus((s32)ev->randoCheckId, (s32)ev->map);
});
- COND_HOOK(SetRandoInfFlag, EVENT_PRIORITY_NORMAL, isConnected, [](IEvent* event) {
- auto* anchor = Anchor::GetInstance();
- if (!anchor->IsSaveLoaded() || !anchor->roomState.syncItemsAndFlags) {
- return;
- }
- auto ev = reinterpret_cast(event);
- if (!ev->flagState) {
- return;
- }
- switch (ev->flagId) {
- case RANDO_INF_BRIDGE_REPAIRED_DIALOG_COMPLETE:
- anchor->SendPacket_SetFlag((u8)ANCHOR_FLAGSPACE_RANDO_INF, (s16)ev->flagId);
- break;
- default:
- break;
- }
- });
-
COND_HOOK(OnJiggySpawned, EVENT_PRIORITY_NORMAL, isConnected, [](IEvent* event) {
auto* anchor = Anchor::GetInstance();
if (!anchor->IsSaveLoaded() || !anchor->roomState.syncItemsAndFlags) {
diff --git a/src/port/Network/Anchor/Packets/SetCheckStatus.cpp b/src/port/Network/Anchor/Packets/SetCheckStatus.cpp
index 38c992f12..74e9a4698 100644
--- a/src/port/Network/Anchor/Packets/SetCheckStatus.cpp
+++ b/src/port/Network/Anchor/Packets/SetCheckStatus.cpp
@@ -40,7 +40,7 @@ void Anchor::SendPacket_SetCheckStatus(s32 rc, s32 map) {
// notification, or re-broadcast).
void Anchor::AdoptRemoteCheck(s32 rcRaw) {
RandoCheckId rc = (RandoCheckId)rcRaw;
- if (rc <= RC_UNKNOWN || rc >= RC_MAX || RANDO_SAVE_CHECKS[rc].obtained) {
+ if (rc <= RC_UNKNOWN || rc >= RC_MAX || RANDO_SAVE_CHECKS[rc].eligible) {
return;
}
if (CustomObject::CheckSpawnedIdList(rc)) {
@@ -63,7 +63,7 @@ void Anchor::HandlePacket_SetCheckStatus(nlohmann::json& payload) {
if (rc <= RC_UNKNOWN || rc >= RC_MAX) {
return;
}
- if (RANDO_SAVE_CHECKS[rc].obtained) {
+ if (RANDO_SAVE_CHECKS[rc].eligible) {
return;
}
diff --git a/src/port/Network/Anchor/Packets/UpdateTeamState.cpp b/src/port/Network/Anchor/Packets/UpdateTeamState.cpp
index f2e568bd4..380097a40 100644
--- a/src/port/Network/Anchor/Packets/UpdateTeamState.cpp
+++ b/src/port/Network/Anchor/Packets/UpdateTeamState.cpp
@@ -81,7 +81,7 @@ void Anchor::SendPacket_UpdateTeamState() {
if (IS_RANDO) {
std::vector checks(RC_MAX, 0);
for (s32 rc = RC_UNKNOWN + 1; rc < RC_MAX; rc++) {
- checks[rc] = RANDO_SAVE_CHECKS[rc].obtained ? 1 : 0;
+ checks[rc] = RANDO_SAVE_CHECKS[rc].eligible ? 1 : 0;
}
payload["state"]["randoChecks"] = checks;
diff --git a/src/port/Rando/CheckTracker/CheckTracker.cpp b/src/port/Rando/CheckTracker/CheckTracker.cpp
index 4ca2af711..e650188ca 100644
--- a/src/port/Rando/CheckTracker/CheckTracker.cpp
+++ b/src/port/Rando/CheckTracker/CheckTracker.cpp
@@ -76,10 +76,13 @@ std::vector> defaultCheckColor
{ CVAR_NAME_ITEM_COLOR, DEFAULT_ITEM_COLOR, "Obtained Item" },
};
+std::map checkNames;
+
Rando::StaticData::RandoLogicData reachableRegions[RR_MAX];
Rando::StaticData::RandoLogicData reachableEvents[RA_MAX];
Rando::StaticData::RandoLogicData reachableChecks[RC_MAX];
+bool isCheckTrackerInitialized = false;
bool checkTrackerPopoutState = false;
ImVec4 checkTrackerBG = ImVec4{ 0, 0, 0, 0.5f };
ImVec4 collectedChecksBG = ImVec4{ 0, 0, 0, 0.5f };
@@ -100,7 +103,7 @@ std::string GetTotalCheckCount() {
uint32_t collected = 0;
uint32_t totalShuffled = 0;
for (auto& entry : Rando::Logic::shuffledPool) {
- if (entry.obtained || entry.skipped) {
+ if (entry.eligible || entry.skipped) {
collected++;
}
if (entry.isShuffled) {
@@ -113,6 +116,13 @@ std::string GetTotalCheckCount() {
return totalChecks;
}
+void CreateCheckStringList() {
+ checkNames.clear();
+ for (auto& entry : Rando::Logic::shuffledPool) {
+ checkNames.insert({ entry.randoCheckId, Ship_ConvertEnumToReadableName(entry.name) });
+ }
+}
+
void UpdateWorldCheckCount(level_e world) {
worldCollected = 0;
worldTotalShuffled = 0;
@@ -121,7 +131,7 @@ void UpdateWorldCheckCount(level_e world) {
if (Rando::StaticData::Checks[entry.randoCheckId].worldId != world) {
continue;
}
- if (entry.obtained || entry.skipped) {
+ if (entry.eligible || entry.skipped) {
worldCollected++;
}
if (entry.isShuffled) {
@@ -165,6 +175,11 @@ void DrawCheckTrackerList() {
return;
}
+ if (!isCheckTrackerInitialized) {
+ CreateCheckStringList();
+ isCheckTrackerInitialized = true;
+ }
+
if (CVAR_SHOW_COLLECTED_CHECKS && !CVAR_SHOW_SEPARATE_COLLECTED_CHECKS) {
DrawCheckTrackerCount();
}
@@ -204,7 +219,7 @@ void DrawCheckTrackerList() {
continue;
}
- if (CVAR_HIDE_COLLECTED && entry.obtained) {
+ if (CVAR_HIDE_COLLECTED && entry.eligible) {
continue;
}
@@ -212,24 +227,24 @@ void DrawCheckTrackerList() {
continue;
}
- ImVec4 checkTextColor = entry.obtained ? VecFromRGBA8(CVAR_COLLECTED_COLOR)
+ ImVec4 checkTextColor = entry.eligible ? VecFromRGBA8(CVAR_COLLECTED_COLOR)
: UIWidgets::ColorValues.at(UIWidgets::Colors::White);
- ImVec4 itemTextColor = entry.obtained ? VecFromRGBA8(CVAR_ITEM_COLOR)
+ ImVec4 itemTextColor = entry.eligible ? VecFromRGBA8(CVAR_ITEM_COLOR)
: UIWidgets::ColorValues.at(UIWidgets::Colors::Indigo);
if (entry.skipped) {
checkTextColor = itemTextColor = VecFromRGBA8(CVAR_SKIPPED_COLOR);
}
- if (!entry.obtained && CVAR_SHOW_LOGIC) {
+ if (!entry.eligible && CVAR_SHOW_LOGIC) {
checkTextColor = Rando::Logic::CanAccessCheck(entry.randoCheckId)
? UIWidgets::ColorValues.at(UIWidgets::Colors::White)
: VecFromRGBA8(CVAR_LOGIC_COLOR);
}
ImGui::BeginGroup();
- ImGui::TextColored(checkTextColor, Ship_ConvertEnumToReadableName(entry.name).c_str());
- if (entry.obtained) {
+ ImGui::TextColored(checkTextColor, checkNames.at(entry.randoCheckId).c_str());
+ if (entry.eligible) {
ImGui::SameLine();
RandoItemId randoItemId = Rando::Logic::GetShuffledObject(entry.randoCheckId).randoItemId;
const std::string& randoItemName =
diff --git a/src/port/Rando/CheckTracker/CheckTracker.h b/src/port/Rando/CheckTracker/CheckTracker.h
index fcc5d558f..543d5cbb6 100644
--- a/src/port/Rando/CheckTracker/CheckTracker.h
+++ b/src/port/Rando/CheckTracker/CheckTracker.h
@@ -4,6 +4,8 @@
#include "port/Rando/Rando.h"
#include
+extern bool isCheckTrackerInitialized;
+
namespace Rando {
namespace CheckTracker {
diff --git a/src/port/Rando/CustomCollectible/CustomCollectible.cpp b/src/port/Rando/CustomCollectible/CustomCollectible.cpp
new file mode 100644
index 000000000..5178333cc
--- /dev/null
+++ b/src/port/Rando/CustomCollectible/CustomCollectible.cpp
@@ -0,0 +1,243 @@
+#include "CustomCollectible.h"
+#include "CustomCollectibleDrawCustom.h"
+#include
+
+#include
+#include "port/ShipInit.hpp"
+#include
+
+extern "C" {
+#include "functions.h"
+#include "actor.h"
+void __chJinjo_802CDC9C(Actor* thisx, s16 arg1);
+Actor* func_802D94B4(ActorMarker* marker, Gfx** gfx, Mtx** mtx, Vtx** vtx);
+Actor* chSnsEgg_draw(ActorMarker* marker, Gfx** gfx, Mtx** mtx, Vtx** vtx);
+}
+
+static std::queue propQueue;
+
+std::unordered_map customCollectibleDrawInfo = {
+ { ACTOR_52_BLUE_EGG, { ASSET_36D_SPRITE_BLUE_EGG, CCT_GENERIC_SPRITE } },
+ { ACTOR_47_EMPTY_HONEYCOMB, { ASSET_361_MODEL_EMPTY_HONEYCOMB, CCT_GENERIC_MODEL } },
+ { ACTOR_49_EXTRA_LIFE, { ASSET_36E_MODEL_EXTRA_LIFE, CCT_GENERIC_SPRITE } },
+ { ACTOR_50_HONEYCOMB, { ASSET_363_MODEL_HONEYCOMB, CCT_GENERIC_MODEL } },
+ { ACTOR_46_JIGGY, { ASSET_35F_MODEL_JIGGY, CCT_GENERIC_MODEL } },
+ { ACTOR_60_JINJO_BLUE, { ASSET_3C0_MODEL_JINJO_BLUE, CCT_JINJO } },
+ { ACTOR_62_JINJO_GREEN, { ASSET_3C2_MODEL_JINJO_GREEN, CCT_JINJO } },
+ { ACTOR_5F_JINJO_ORANGE, { ASSET_3BC_MODEL_JINJO_ORANGE, CCT_JINJO } },
+ { ACTOR_61_JINJO_PINK, { ASSET_3C1_MODEL_JINJO_PINK, CCT_JINJO } },
+ { ACTOR_5E_JINJO_YELLOW, { ASSET_3BB_MODEL_JINJO_YELLOW, CCT_JINJO } },
+ { ACTOR_12C_MOLEHILL, { ASSET_387_MODEL_BOTTLES, CCT_MOLEHILL } },
+ { ACTOR_2D_MUMBO_TOKEN, { ASSET_41A_SPRITE_MUMBO_TOKEN, CCT_GENERIC_SPRITE } },
+ { ACTOR_51_MUSIC_NOTE, { ASSET_6D6_SPRITE_MUSIC_NOTE, CCT_GENERIC_SPRITE } },
+ { ACTOR_25E_SNS_EGG, { ASSET_50D_MODEL_SNS_EGG, CCT_VANILLA_SNS_EGG } },
+ { ACTOR_25D_ICE_KEY, { ASSET_50C_MODEL_ICE_KEY, CCT_GENERIC_MODEL } },
+ { ACTOR_3CD_CUSTOM_COLLECTIBLE, { ASSET_35F_MODEL_JIGGY, CCT_CUSTOM_MODEL } },
+};
+
+ActorAnimationInfo moleAnimation[] = {
+ { ASSET_13B_ANIM_BOTTLES_IDLE, 7.0f },
+};
+
+ActorAnimationInfo chJinjoAnimation[] = {
+ { ASSET_2F_ANIM_JINJO_HELP, 1.5f },
+};
+
+ActorInfo customActorInfo = { MARKER_300_CUSTOM_COLLECTIBLE,
+ ACTOR_3CD_CUSTOM_COLLECTIBLE,
+ ASSET_0_NONE,
+ 0,
+ NULL,
+ CustomCollectible_Update,
+ NULL,
+ NULL,
+ 0,
+ 0,
+ 0.8f,
+ 0 };
+
+void CustomCollectible_Update(Actor* actor) {
+ ActorLocal_CustomCollectible* customLocal = (ActorLocal_CustomCollectible*)&actor->local;
+
+ if (!actor->initialized) {
+ actor->initialized = true;
+ actor->marker->collidable = true;
+
+ actor->scale = CustomCollectible::GetScale(customLocal->itemType);
+ }
+
+ if (customLocal->itemType == RITYPE_MOLEHILL || customLocal->itemType == RITYPE_JINJO) {
+ CustomCollectible::FacePlayer(actor);
+ } else {
+ actor->yaw += 5.0f;
+ }
+
+ // Sparkles
+ if (customCollectibleDrawInfo[customLocal->actorId].drawType != CCT_GENERIC_SPRITE) {
+ for (int i = 0; i < 4; i++) {
+ if (randf() < 0.03) {
+ commonParticle_add(actor->marker, i + 5, func_80329904);
+ commonParticle_new((common_particle_e)8, actor->marker->unk14_21);
+ }
+ }
+ }
+
+ // Allows shadows
+ if (customLocal->itemType == RITYPE_AP_ITEM) {
+ actor->unk124_6 = 1;
+ actor->marker->unk14_21 = 1;
+ }
+}
+
+f32 CustomCollectible::GetScale(RandoItemType itemType) {
+ switch (itemType) {
+ case RITYPE_MUSIC_NOTE:
+ case RITYPE_SNS_EGG:
+ return 0.42857143f;
+ case RITYPE_EMPTY_HONEYCOMB:
+ case RITYPE_MOLEHILL:
+ return 0.8f;
+ default:
+ return 1.0f;
+ }
+}
+
+void CustomCollectible::FacePlayer(Actor* actor) {
+ // Copied from source code inside jinjo.c
+ f32 sp7C[3];
+ f32 sp6C;
+ f32* sp30 = actor->position;
+ func_8028E964(sp7C);
+ func_80257F18(sp30, sp7C, &sp6C);
+ s16 sp64 = (actor->yaw * 182.04444);
+ s16 sp66 = (s32)(sp6C * 182.04444);
+ sp66 = sp64 - sp66;
+ s32 sp60 = func_8028AED4(sp30, 55.0f);
+ __chJinjo_802CDC9C(actor, sp66);
+}
+
+Actor* CustomCollectible::AttachCustomVariables(RandoCheckId randoCheckId, Actor* customCollectible) {
+ ActorLocal_CustomCollectible* customLocal = (ActorLocal_CustomCollectible*)&customCollectible->local;
+
+ RandoItemId randoItemId = RANDO_SAVE_CHECKS[randoCheckId].randoItemId;
+
+ customLocal->randoCheckId = randoCheckId;
+ customLocal->randoItemId = randoItemId;
+ customLocal->actorId = (actor_e)Rando::StaticData::Items[randoItemId].actorId;
+ customLocal->itemType = Rando::StaticData::Items[randoItemId].randoItemType;
+
+ return customCollectible;
+}
+
+Actor* CustomCollectible::Spawn(int32_t position[3], RandoCheckId randoCheckId) {
+ int32_t spawnPosition[3] = { position[0], position[1], position[2] };
+
+ int32_t flags = ACTOR_FLAG_UNKNOWN_6 | ACTOR_FLAG_UNKNOWN_7 | ACTOR_FLAG_UNKNOWN_21;
+
+ RandoItemId randoItemId = RANDO_SAVE_CHECKS[randoCheckId].randoItemId;
+ RandoItemType itemType = Rando::StaticData::Items[randoItemId].randoItemType;
+
+ // actor_new stores the ActorInfo* permanently, so it must outlive Spawn()
+ static std::unordered_map sActorInfoCache;
+ ActorInfo& collectibleInfo = sActorInfoCache[randoItemId];
+ collectibleInfo = CustomCollectible::GetActorAndDrawInfo(randoItemId);
+
+ // Spawn actor
+ Actor* customCollectible = actor_new(spawnPosition, 0, &collectibleInfo, flags);
+ if (itemType == RITYPE_SNS_EGG) {
+ customCollectible->actorTypeSpecificField = CustomCollectible::GetSNSEggColor(randoItemId);
+ }
+ customCollectible->marker->collisionFunc = CustomCollectible::OnCollect;
+ customCollectible = CustomCollectible::AttachCustomVariables(randoCheckId, customCollectible);
+
+ return customCollectible;
+}
+
+uint32_t CustomCollectible::GetSNSEggColor(RandoItemId randoItemId) {
+ switch (randoItemId) {
+ case RI_STOP_N_SWOP_EGG_BLUE:
+ return (uint32_t)SNS_ITEM_EGG_BLUE;
+ case RI_STOP_N_SWOP_EGG_CYAN:
+ return (uint32_t)SNS_ITEM_EGG_CYAN;
+ case RI_STOP_N_SWOP_EGG_GREEN:
+ return (uint32_t)SNS_ITEM_EGG_GREEN;
+ case RI_STOP_N_SWOP_EGG_PINK:
+ return (uint32_t)SNS_ITEM_EGG_PINK;
+ case RI_STOP_N_SWOP_EGG_RED:
+ return (uint32_t)SNS_ITEM_EGG_RED;
+ case RI_STOP_N_SWOP_EGG_YELLOW:
+ return (uint32_t)SNS_ITEM_EGG_YELLOW;
+ default:
+ return (uint32_t)SNS_ITEM_EGG_CYAN;
+ }
+}
+
+ActorInfo CustomCollectible::GetActorAndDrawInfo(RandoItemId randoItemId) {
+ ActorInfo collectibleInfo = customActorInfo;
+
+ actor_e actorId = (actor_e)Rando::StaticData::Items[randoItemId].actorId;
+ auto drawInfo = customCollectibleDrawInfo[actorId];
+
+ collectibleInfo.modelId = drawInfo.drawModel;
+
+ switch (drawInfo.drawType) {
+ case CCT_GENERIC_MODEL:
+ collectibleInfo.draw_func = actor_draw;
+ break;
+ case CCT_GENERIC_SPRITE:
+ collectibleInfo.draw_func = fxTouchSparkle_draw;
+ collectibleInfo.shadow_scale = 0.0f;
+ break;
+ case CCT_JINJO:
+ collectibleInfo.draw_func = actor_draw;
+ collectibleInfo.animations = chJinjoAnimation;
+ break;
+ case CCT_MOLEHILL:
+ collectibleInfo.draw_func = func_802D94B4;
+ collectibleInfo.animations = moleAnimation;
+ break;
+ case CCT_VANILLA_SNS_EGG:
+ collectibleInfo.draw_func = chSnsEgg_draw;
+ break;
+ case CCT_CUSTOM_MODEL:
+ collectibleInfo.draw_func = CustomCollectible_DrawCustomModel;
+ break;
+ default:
+ break;
+ }
+ return collectibleInfo;
+}
+
+void CustomCollectible::OnCollect(struct actorMarker_s* self, struct actorMarker_s* other) {
+ Actor* actor = marker_getActor(self);
+ ActorLocal_CustomCollectible* customLocal = (ActorLocal_CustomCollectible*)&actor->local;
+ fxSparkle_honeycomb(&self->propPtr->x);
+ ItemQueue::AddCheck(customLocal->randoCheckId);
+ marker_despawn(self);
+}
+
+// When regular props are spawned in BK, the game isn't fully set up yet to spawn
+// actors. So we delay prop spawns until the game's ready to spawn actors.
+void CustomCollectible::QueueProp(int32_t position[3], RandoCheckId randoCheckId) {
+ QueuedProp queuedProp;
+ queuedProp.position[0] = position[0];
+ queuedProp.position[1] = position[1];
+ queuedProp.position[2] = position[2];
+ queuedProp.randoCheckId = randoCheckId;
+ propQueue.push(queuedProp);
+}
+
+void CustomCollectible::ProcessPropQueue() {
+ while (propQueue.size() > 0) {
+ QueuedProp prop = propQueue.front();
+ Actor* actor = CustomCollectible::Spawn(prop.position, prop.randoCheckId);
+ propQueue.pop();
+ }
+}
+
+void RegisterCustomCollectible() {
+ COND_HOOK(OnActorSpawn, EVENT_PRIORITY_NORMAL, IS_RANDO,
+ [](IEvent* event) { CustomCollectible::ProcessPropQueue(); });
+}
+
+static RegisterShipInitFunc initFunc(RegisterCustomCollectible, { "IS_RANDO" });
diff --git a/src/port/Rando/CustomCollectible/CustomCollectible.h b/src/port/Rando/CustomCollectible/CustomCollectible.h
new file mode 100644
index 000000000..8b2f06bdb
--- /dev/null
+++ b/src/port/Rando/CustomCollectible/CustomCollectible.h
@@ -0,0 +1,46 @@
+#pragma once
+#include "port/Rando/ItemQueue.h"
+#include "prop.h"
+
+typedef struct {
+ RandoCheckId randoCheckId;
+ RandoItemId randoItemId;
+ actor_e actorId;
+ RandoItemType itemType;
+} ActorLocal_CustomCollectible;
+
+enum CustomCollectibleDrawTypes {
+ CCT_GENERIC_MODEL,
+ CCT_GENERIC_SPRITE,
+ CCT_JINJO,
+ CCT_MOLEHILL,
+ CCT_VANILLA_SNS_EGG,
+ CCT_CUSTOM_MODEL,
+};
+
+typedef struct {
+ asset_e drawModel;
+ CustomCollectibleDrawTypes drawType;
+} CustomCollectibleDrawInfo;
+
+typedef struct {
+ s32 position[3];
+ RandoCheckId randoCheckId;
+} QueuedProp;
+
+void CustomCollectible_Update(Actor* actor);
+
+class CustomCollectible {
+private:
+ static Actor* AttachCustomVariables(RandoCheckId randoItemId, Actor* customCollectible);
+ static void OnCollect(struct actorMarker_s* self, struct actorMarker_s* other);
+ static ActorInfo GetActorAndDrawInfo(RandoItemId randoItemId);
+ static uint32_t GetSNSEggColor(RandoItemId randoItemId);
+
+public:
+ static Actor* Spawn(int32_t position[3], RandoCheckId randoCheckId);
+ static f32 GetScale(RandoItemType itemType);
+ static void FacePlayer(Actor* actor);
+ static void QueueProp(int32_t position[3], RandoCheckId randoCheckId);
+ static void ProcessPropQueue();
+};
diff --git a/src/port/Rando/CustomCollectible/CustomCollectibleDrawCustom.cpp b/src/port/Rando/CustomCollectible/CustomCollectibleDrawCustom.cpp
new file mode 100644
index 000000000..80ae1ed27
--- /dev/null
+++ b/src/port/Rando/CustomCollectible/CustomCollectibleDrawCustom.cpp
@@ -0,0 +1,108 @@
+// Custom item model rendering.
+//
+// The models live in lighthouse.o2r as XML libultraship resources under
+// objects/object_X_item.
+// They are untextured prim-color geometry, so they draw with a single matrix
+// push and no material setup beyond what the display lists carry.
+
+// Include order matters here.
+// 1. ResourceHelpers.h (via ship/Context.h -> spdlog) parses the Windows headers,
+// which must happen before any decomp header: Events.h drags in prop.h ->
+// structs.h -> bool.h, whose function-like BOOL(x) macro corrupts the
+// `typedef BOOL (CALLBACK* ...)` declarations in the Windows SDK.
+// 2. bridge.h/Events.h bring in the events bridge/json templates, which must be
+// seen with C++ linkage before functions.h re-includes them inside the
+// extern "C" block below.
+#include
+#include "port/ResourceHelpers.h"
+#include "port/Enhancements/Events/Hooks/Events.h"
+#include "port/Interpolation/FrameInterpolation.h"
+
+#include "CustomCollectibleDrawCustom.h"
+#include "CustomCollectible.h"
+
+extern "C" {
+#include
+#include "macros.h"
+#include "prop.h"
+#include "functions.h"
+#include "variables.h"
+#include "core1/viewport.h"
+#include "core1/mlmtx.h"
+}
+
+static const char* sCustomModelPaths[] = {
+ "objects/object_archipelago_item/gArchipelagoItemDL",
+ "objects/object_archipelago_item/gArchipelagoJunkDL",
+ "objects/object_archipelago_item/gArchipelagoProgressiveDL",
+};
+
+// The models are authored at OoT world scale, which is roughly 10x too large
+// for BK. Baked into every draw so callers treat scale 1.0 as "natural size".
+static const f32 sCustomModelBaseScale = 0.04f;
+
+// BK never uploads RSP lights (its models bake shading into vertex colors), but
+// these materials enable G_LIGHTING, so without our own light setup the shade
+// input is garbage and the model renders black. Neutral white key light from
+// the upper-front-right plus a mid ambient.
+static Lights1 sCustomModelLights = gdSPDefLights1(110, 110, 110, 255, 255, 255, 40, 40, 40);
+
+// Pin the resources so the cached Gfx pointers stay valid across frames.
+static std::shared_ptr sModelResources[ARRAY_COUNT(sCustomModelPaths)];
+static Gfx* sModelDLs[ARRAY_COUNT(sCustomModelPaths)];
+
+static Gfx* CustomCollectible_GetDL(CustomItemModel model) {
+ if (model < 0 || model >= (s32)ARRAY_COUNT(sCustomModelPaths)) {
+ return nullptr;
+ }
+ if (sModelDLs[model] == nullptr) {
+ sModelResources[model] = GetResourceByName(sCustomModelPaths[model]);
+ if (sModelResources[model] == nullptr) {
+ return nullptr;
+ }
+ sModelDLs[model] = ResourceMgr_LoadGfxByName(sCustomModelPaths[model]);
+ }
+ return sModelDLs[model];
+}
+
+Actor* CustomCollectible_DrawCustomModel(ActorMarker* marker, Gfx** gfx, Mtx** mtx, Vtx** vtx) {
+ Actor* actor = marker_getActor(marker);
+ ActorLocal_CustomCollectible* customLocal = (ActorLocal_CustomCollectible*)&actor->local;
+ CustomItemModel model;
+
+ switch (customLocal->randoItemId) {
+ case RI_AP_ITEM_PROGRESSION:
+ model = ARCHIPELAGO_MODEL_PROGRESSIVE;
+ break;
+ default:
+ break;
+ }
+
+ Gfx* dl = CustomCollectible_GetDL(model);
+ if (dl == nullptr) {
+ return actor;
+ }
+
+ f32 camera_position[3];
+ viewport_getPosition_vec3f(camera_position);
+
+ // The mlMtx calls below are recorded for frame interpolation; the scope key
+ // pairs this draw's matrix across ticks. Keyed by model, so two instances
+ // of the same model drawn in the same frame would need instance-keyed
+ // scopes instead.
+ FrameInterpolation_RecordOpenChild("custom_item", (uintptr_t)model);
+ f32 rotation[3] = { actor->pitch, actor->yaw, actor->roll };
+ f32 position[3] = { actor->position[0], actor->position[1] + 50, actor->position[2] };
+ // The modelview translation is camera-relative, matching modelRender_draw.
+ mlMtxIdent();
+ func_80252AF0(camera_position, position, rotation, actor->scale * sCustomModelBaseScale, NULL);
+ mlMtxApply(*mtx);
+ gSPMatrix((*gfx)++, (*mtx)++, G_MTX_PUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPSetLights1((*gfx)++, sCustomModelLights);
+ gSPDisplayList((*gfx)++, dl);
+ gSPPopMatrix((*gfx)++, G_MTX_MODELVIEW);
+
+ FrameInterpolation_RecordCloseChild();
+
+ return actor;
+}
diff --git a/src/port/Rando/CustomCollectible/CustomCollectibleDrawCustom.h b/src/port/Rando/CustomCollectible/CustomCollectibleDrawCustom.h
new file mode 100644
index 000000000..ce87b41bf
--- /dev/null
+++ b/src/port/Rando/CustomCollectible/CustomCollectibleDrawCustom.h
@@ -0,0 +1,36 @@
+#ifndef PORT_ARCHIPELAGO_ITEM_H
+#define PORT_ARCHIPELAGO_ITEM_H
+
+#include
+#include
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+// Forward declarations (tag structs from prop.h) so this header stays free of
+// the decomp includes — including prop.h here would drag in bool.h, whose
+// function-like BOOL() macro corrupts the Windows SDK headers in C++ TUs.
+struct actorMarker_s;
+struct actor_s;
+
+typedef enum CustomItemModel {
+ ARCHIPELAGO_MODEL_NONE = -1, // resolver sentinel: keep the vanilla model
+ ARCHIPELAGO_MODEL_ITEM,
+ ARCHIPELAGO_MODEL_JUNK,
+ ARCHIPELAGO_MODEL_PROGRESSIVE,
+} CustomItemModel;
+
+// Draws an Archipelago item model at a world position. Must be called from a
+// draw context that owns the display list and matrix pools (an actor draw
+// callback, a world/player draw event hook, cutscene draw code, etc.).
+// rotation is pitch/yaw/roll in degrees and may be NULL; scale is a relative
+// multiplier where 1.0 = natural in-world size (the OoT-scale source models are
+// shrunk to BK proportions internally).
+Actor* CustomCollectible_DrawCustomModel(ActorMarker* marker, Gfx** gfx, Mtx** mtx, Vtx** vtx);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/src/port/Rando/CustomObject/CustomObject.cpp b/src/port/Rando/CustomObject/CustomObject.cpp
index c635e879e..beeaa989a 100644
--- a/src/port/Rando/CustomObject/CustomObject.cpp
+++ b/src/port/Rando/CustomObject/CustomObject.cpp
@@ -46,6 +46,7 @@ extern ActorInfo chJiggy;
extern ActorInfo chEmptyHoneycomb;
extern ActorInfo chMumboToken;
extern ActorInfo sumusicNote;
+extern ActorInfo chExtraLife;
extern ActorInfo chHoneycomb;
extern ActorInfo chBlueEgg;
@@ -70,7 +71,8 @@ bool shouldRemoveEX = false;
std::map> actorInfoMap = {
{ ACTOR_2D_MUMBO_TOKEN, { chMumboToken, ACTOR_FLAG_UNKNOWN_6 } },
{ ACTOR_46_JIGGY, { chJiggy, ACTOR_FLAG_UNKNOWN_6 | ACTOR_FLAG_UNKNOWN_7 | ACTOR_FLAG_UNKNOWN_21 } },
- { ACTOR_47_EMPTY_HONEYCOMB, { chEmptyHoneycomb, ACTOR_FLAG_UNKNOWN_6 | ACTOR_FLAG_UNKNOWN_21 } },
+ { ACTOR_47_EMPTY_HONEYCOMB, { chEmptyHoneycomb, ACTOR_FLAG_UNKNOWN_6 | ACTOR_FLAG_UNKNOWN_21 } },
+ { ACTOR_49_EXTRA_LIFE, { chExtraLife, ACTOR_FLAG_UNKNOWN_21 } },
{ ACTOR_51_MUSIC_NOTE, { sumusicNote, ACTOR_FLAG_UNKNOWN_21 } },
{ ACTOR_5E_JINJO_YELLOW, { chJinjoYellow, ACTOR_FLAG_UNKNOWN_6 | ACTOR_FLAG_UNKNOWN_8 } },
{ ACTOR_5F_JINJO_ORANGE, { chJinjoOrange, ACTOR_FLAG_UNKNOWN_6 | ACTOR_FLAG_UNKNOWN_8 } },
@@ -126,30 +128,31 @@ void CustomObject::RemoveSpawnedIdFromList(RandoCheckId randoCheckId) {
}
Actor* CustomObject::SetCustomActorParametersEX(RandoCheckId randoCheckId, Actor* customActor) {
- RandoSaveCheck shuffledObject = Rando::Logic::GetShuffledObject(randoCheckId);
+ RandoSaveCheck randoSaveCheck = RANDO_SAVE_CHECKS[randoCheckId];
customActor->marker->randoCheckId = randoCheckId;
- switch (shuffledObject.randoItemId) {
- case RI_EMPTY_HONEYCOMB:
+ RandoItemType itemType = Rando::StaticData::Items[randoSaveCheck.randoItemId].randoItemType;
+ switch (itemType) {
+ case RITYPE_EMPTY_HONEYCOMB:
ActorLocal_EmptyHoneycomb* honeycombLocal;
honeycombLocal = (ActorLocal_EmptyHoneycomb*)&customActor->local;
honeycombLocal->uid = (honeycomb_e)Rando::Logic::GetShuffledObject(randoCheckId).randoCollectionId;
break;
- case RI_JIGGY:
+ case RITYPE_JIGGY:
ActorLocal_Jiggy* jiggyLocal;
jiggyLocal = (ActorLocal_Jiggy*)&customActor->local;
- jiggyLocal->index = shuffledObject.randoCollectionId;
+ jiggyLocal->index = randoSaveCheck.randoCollectionId;
break;
- case RI_MUMBO_TOKEN:
+ case RITYPE_MUMBO_TOKEN:
ActorLocal_MumboToken* tokenLocal;
tokenLocal = (ActorLocal_MumboToken*)&customActor->local;
tokenLocal->uid = (mumbotoken_e)Rando::Logic::GetShuffledObject(randoCheckId).randoCollectionId;
break;
- case RI_STOP_N_SWOP_EGG:
- case RI_STOP_N_SWOP_KEY:
- customActor->actorTypeSpecificField = shuffledObject.randoCollectionId;
+ case RITYPE_SNS_EGG:
+ case RITYPE_SNS_KEY:
+ customActor->actorTypeSpecificField = randoSaveCheck.randoCollectionId;
customActor->scale = 0.5f;
- if (shuffledObject.randoItemId == RI_STOP_N_SWOP_KEY) {
+ if (itemType == RITYPE_SNS_KEY) {
customActor->position_y += 50.0f;
}
break;
@@ -203,8 +206,8 @@ void CustomObject::FlushRandoSpawnQueue() {
continue;
}
- actor_e randoActorId = (actor_e)Rando::StaticData::Items[randoSaveCheck.randoItemId].actorId;
- if (randoSaveCheck.obtained) {
+ actor_e randoActorId = Rando::StaticData::GetActorIdByRandoItemId(randoSaveCheck.randoItemId);
+ if (randoSaveCheck.eligible) {
randoActorId = GetRandomJunkActorId(randoSaveCheck);
}
@@ -217,7 +220,7 @@ void CustomObject::FlushRandoSpawnQueue() {
&actorInfoMap.at(randoActorId).first,
actorInfoMap.at(randoActorId).second);
- if (customActor != NULL && randoSaveCheck.obtained &&
+ if (customActor != NULL && randoSaveCheck.eligible &&
RANDO_SAVE_OPTIONS[RO_SPAWN_JUNK].optionValue == RO_GENERIC_ON) {
customActor->marker->unk14_21 = true;
customActor->scale = 1.0f;
@@ -251,7 +254,7 @@ Actor* CustomObject::ShouldCreateCustomActorEX(RandoCheckId randoCheckId, int32_
return NULL;
}
- if (randoSaveCheck.obtained) {
+ if (randoSaveCheck.eligible) {
if (refActor != nullptr) {
randoActorId = (actor_e)refActor->modelCacheIndex;
} else {
@@ -272,8 +275,8 @@ Actor* CustomObject::ShouldCreateCustomActorEX(RandoCheckId randoCheckId, int32_
}
void CustomObject::ResolveCustomActorCollisionEX(RandoCheckId randoCheckId) {
- RandoSaveCheck shuffledObject = Rando::Logic::GetShuffledObject(randoCheckId);
- if (shuffledObject.randoCheckId == RC_UNKNOWN) {
+ RandoSaveCheck randoSaveCheck = RANDO_SAVE_CHECKS[randoCheckId];
+ if (randoSaveCheck.randoCheckId == RC_UNKNOWN) {
return;
}
@@ -286,26 +289,23 @@ void CustomObject::ResolveCustomActorCollisionEX(RandoCheckId randoCheckId) {
spawnPosition[1] = (int32_t)playerPosF[1];
spawnPosition[2] = (int32_t)playerPosF[2];
- switch (shuffledObject.randoItemId) {
- case RI_JIGGY:
+ Rando::StaticData::RandoStaticItem randoItem = Rando::StaticData::Items[randoSaveCheck.randoItemId];
+ RandoItemType itemType = randoItem.randoItemType;
+ int32_t currentLevel = map_getLevel(gsworld_getMap());
+
+ switch (itemType) {
+ case RITYPE_JIGGY:
if (CVarGetInteger(CVAR_ENHANCEMENT("Cutscenes.SkipJiggyDance"), 0)) {
fxSparkle_musicNote(sparklePos);
}
break;
- case RI_JINJO_BLUE:
- case RI_JINJO_GREEN:
- case RI_JINJO_ORANGE:
- case RI_JINJO_PINK:
- case RI_JINJO_YELLOW:
- if (Rando::StaticData::Checks[shuffledObject.shuffledCheckId].worldId == map_getLevel(gsworld_getMap())) {
- int32_t jinjoMarkerId =
- GetJinjoActorMarkerId((actor_e)Rando::StaticData::Items[shuffledObject.randoItemId].actorId);
+ case RITYPE_JINJO:
+ if (randoItem.worldId == currentLevel) {
+ int32_t jinjoMarkerId = GetJinjoActorMarkerId((actor_e)randoItem.actorId);
item_adjustByDiffWithHud(ITEM_12_JINJOS, (1 << ((jinjoMarkerId + 6) & 0x1F)));
} else {
- if (Rando::Logic::ShouldSpawnJinjoJiggy(
- Rando::StaticData::Checks[shuffledObject.shuffledCheckId].worldId)) {
- RandoCheckId jiggyCheckId = Rando::StaticData::GetJinjoJiggyCheckByLevelId(
- Rando::StaticData::Checks[shuffledObject.shuffledCheckId].worldId);
+ if (Rando::Logic::ShouldSpawnJinjoJiggy(randoItem.worldId)) {
+ RandoCheckId jiggyCheckId = Rando::StaticData::GetJinjoJiggyCheckByLevelId(randoItem.worldId);
if (jiggyCheckId != RC_UNKNOWN) {
Actor* customActor = ShouldCreateCustomActorEX(jiggyCheckId, spawnPosition, false);
@@ -316,9 +316,9 @@ void CustomObject::ResolveCustomActorCollisionEX(RandoCheckId randoCheckId) {
}
}
break;
- case RI_MUSIC_NOTE:
- D_80385FF0[Rando::StaticData::Checks[shuffledObject.shuffledCheckId].worldId]++;
- if (Rando::StaticData::Checks[shuffledObject.shuffledCheckId].worldId == map_getLevel(gsworld_getMap())) {
+ case RITYPE_MUSIC_NOTE:
+ D_80385FF0[randoItem.worldId]++;
+ if (randoItem.worldId == currentLevel) {
item_set(ITEM_C_NOTE, D_80385FF0[map_getLevel(gsworld_getMap())]);
}
@@ -326,8 +326,8 @@ void CustomObject::ResolveCustomActorCollisionEX(RandoCheckId randoCheckId) {
fxSparkle_musicNote(sparklePos);
coMusicPlayer_playMusic(COMUSIC_9_NOTE_COLLECTED, 16000);
break;
- case RI_STOP_N_SWOP_EGG:
- case RI_STOP_N_SWOP_KEY:
+ case RITYPE_SNS_EGG:
+ case RITYPE_SNS_KEY:
if (Rando::Logic::GetTotalSnsItemsCollected() >= 7) {
gcparade_beginFinalParade();
}
@@ -339,10 +339,10 @@ void CustomObject::ResolveCustomActorCollisionEX(RandoCheckId randoCheckId) {
void CustomObject::CheckObtainedEX(RandoCheckId randoCheckId, bool isInit) {
for (auto& pool : Rando::Logic::shuffledPool) {
- if (pool.randoCheckId == randoCheckId && !pool.obtained) {
- pool.obtained = true;
+ if (pool.randoCheckId == randoCheckId && !pool.eligible) {
+ pool.eligible = true;
shouldRemoveEX = true;
- RANDO_SAVE_CHECKS[pool.randoCheckId].obtained = true;
+ RANDO_SAVE_CHECKS[pool.randoCheckId].eligible = true;
CustomObject::RemoveSpawnedIdFromList(randoCheckId);
if (isInit) {
CustomObject::ResolveCustomActorCollisionEX(randoCheckId);
@@ -365,10 +365,11 @@ void CustomObject::ObjectCollectedEX(Prop* prop) {
CustomObject::CheckObtainedEX((RandoCheckId)prop->actorProp.marker->randoCheckId);
if (shouldRemoveEX) {
- CustomObject::ResolveCustomActorCollisionEX((RandoCheckId)prop->actorProp.marker->randoCheckId);
+ RandoSaveCheck randoSaveCheck = RANDO_SAVE_CHECKS[(RandoCheckId)prop->actorProp.marker->randoCheckId];
+
+ CustomObject::ResolveCustomActorCollisionEX(randoSaveCheck.randoCheckId);
- if (Rando::Logic::GetShuffledObject((RandoCheckId)prop->actorProp.marker->randoCheckId).randoItemId ==
- RI_MUSIC_NOTE) {
+ if (Rando::StaticData::GetActorIdByRandoItemId(randoSaveCheck.randoItemId) == ACTOR_51_MUSIC_NOTE) {
marker_despawn(prop->actorProp.marker);
}
}
diff --git a/src/port/Rando/CustomObject/CustomObjectSettings.cpp b/src/port/Rando/CustomObject/CustomObjectSettings.cpp
index 0bb5fdb32..aefddc5d3 100644
--- a/src/port/Rando/CustomObject/CustomObjectSettings.cpp
+++ b/src/port/Rando/CustomObject/CustomObjectSettings.cpp
@@ -143,7 +143,9 @@ void ApplyCustomActorPhysics(RandoCheckId randoCheckId, Actor* actor, bool isJin
BundlePhysics physicsData;
if ((randoCheckId >= RC_MM_NOTE_HUT_BUNDLE_1 && randoCheckId <= RC_MM_NOTE_HUT_BUNDLE_5) ||
- randoCheckId == RC_MM_JINJO_GREEN || randoCheckId == RC_MM_JIGGY_HUTS) {
+ randoCheckId == RC_MM_JINJO_GREEN || randoCheckId == RC_MM_JIGGY_HUTS ||
+ (randoCheckId >= RC_MM_BLUE_EGG_HUT_BUNDLE_1 && randoCheckId <= RC_MM_BLUE_EGG_HUT_BUNDLE_5) ||
+ randoCheckId == RC_MM_EXTRA_LIFE_HUT) {
physicsData = GetPhysicsByCheckId(RC_MM_NOTE_HUT_BUNDLE_1);
} else {
physicsData = isJinjoJiggy ? jinjoJiggySpawnPhysics : GetPhysicsByCheckId(randoCheckId);
diff --git a/src/port/Rando/ItemQueue.cpp b/src/port/Rando/ItemQueue.cpp
new file mode 100644
index 000000000..8b2571fe7
--- /dev/null
+++ b/src/port/Rando/ItemQueue.cpp
@@ -0,0 +1,344 @@
+#include "ItemQueue.h"
+
+#include
+#include
+#include