From 0425539fee4baddddab1fee12b0649591363610b Mon Sep 17 00:00:00 2001 From: Garrett Cox Date: Mon, 21 Oct 2024 17:01:40 -0500 Subject: [PATCH 01/18] Let it snow --- CMakeLists.txt | 2 +- .../objects/object_festivehats/antlers_64 | Bin 0 -> 8284 bytes .../object_festivehats/gCuccoLadyHatDL | 11 + .../object_festivehats/gCuccoLadyHatDL_tri_0 | 31 + .../object_festivehats/gCuccoLadyHatDL_vtx_0 | 43 + .../object_festivehats/gEponaRudolphHatDL | 13 + .../gEponaRudolphHatDL_tri_0 | 47 + .../gEponaRudolphHatDL_tri_1 | 22 + .../gEponaRudolphHatDL_vtx_0 | 50 + .../gEponaRudolphHatDL_vtx_1 | 23 + .../object_festivehats/gHorseAntlersDL | 11 + .../object_festivehats/gHorseAntlersDL_tri_0 | 22 + .../object_festivehats/gHorseAntlersDL_vtx_0 | 23 + .../object_festivehats/gLinkAdultHatTrimDL | 11 + .../gLinkAdultHatTrimDL_tri_0 | 44 + .../gLinkAdultHatTrimDL_vtx_0 | 54 + .../object_festivehats/gLinkAdultPompomDL | 11 + .../gLinkAdultPompomDL_tri_0 | 30 + .../gLinkAdultPompomDL_vtx_0 | 31 + .../object_festivehats/gLinkChildHatTrimDL | 11 + .../gLinkChildHatTrimDL_tri_0 | 50 + .../gLinkChildHatTrimDL_vtx_0 | 59 + .../object_festivehats/gLinkChildPompomDL | 11 + .../gLinkChildPompomDL_tri_0 | 30 + .../gLinkChildPompomDL_vtx_0 | 31 + .../object_festivehats/gPaperCrownGenericDL | 11 + .../gPaperCrownGenericDL_tri_0 | 31 + .../gPaperCrownGenericDL_vtx_0 | 42 + .../object_festivehats/gSantaHatGenericDL | 13 + .../gSantaHatGenericDL_tri_0 | 62 + .../gSantaHatGenericDL_tri_1 | 37 + .../gSantaHatGenericDL_vtx_0 | 63 + .../gSantaHatGenericDL_vtx_1 | 40 + .../objects/object_festivehats/hilite_nose | Bin 0 -> 2140 bytes .../mat_gCuccoLadyHatDL_f3dlite_hatcolour | 12 + .../mat_gEponaRudolphHatDL_f3dlite_antlers | 21 + .../mat_gEponaRudolphHatDL_f3dlite_rednose} | 12 +- .../mat_gHorseAntlersDL_f3dlite_antlers | 21 + ...gLinkAdultHatTrimDL_f3dlite_santahat_white | 12 + ..._gLinkAdultPompomDL_f3dlite_santahat_white | 12 + ...gLinkChildHatTrimDL_f3dlite_santahat_white | 12 + ..._gLinkChildPompomDL_f3dlite_santahat_white | 12 + .../mat_gPaperCrownGenericDL_f3dlite_crown | 11 + ...mat_gSantaHatGenericDL_f3dlite_santahatred | 12 + ...t_gSantaHatGenericDL_f3dlite_santahatwhite | 12 + .../object_kakariko_decor/CuccoBedding_32 | Bin 0 -> 2140 bytes .../object_kakariko_decor/SnowBlanket_32 | Bin 0 -> 2140 bytes .../object_kakariko_decor/SnowBuildup_32 | Bin 0 -> 2140 bytes .../object_kakariko_decor/SnowDissolve_32 | Bin 0 -> 2140 bytes .../object_kakariko_decor/String_BYBY_32 | Bin 0 -> 2140 bytes .../object_kakariko_decor/String_GRGR_32 | Bin 0 -> 2140 bytes .../objects/object_kakariko_decor/UsagiLeaf_8 | Bin 0 -> 220 bytes .../object_kakariko_decor/YukiUsagi_16 | Bin 0 -> 604 bytes .../gKakarikoAdultDecorDL | 16 + .../gKakarikoAdultDecorDL_tri_0 | 7 + .../gKakarikoAdultDecorDL_tri_1 | 9 + .../gKakarikoAdultDecorDL_vtx_0 | 10 + .../gKakarikoAdultDecorDL_vtx_1 | 18 + .../gKakarikoAdultDecorDL_vtx_cull | 10 + .../gKakarikoChildDecorDL | 18 + .../gKakarikoChildDecorDL_tri_0 | 37 + .../gKakarikoChildDecorDL_tri_1 | 73 + .../gKakarikoChildDecorDL_tri_2 | 14 + .../gKakarikoChildDecorDL_vtx_0 | 106 + .../gKakarikoChildDecorDL_vtx_1 | 111 + .../gKakarikoChildDecorDL_vtx_2 | 50 + .../gKakarikoChildDecorDL_vtx_cull | 10 + .../object_kakariko_decor/gKakarikoDecorDL | 28 + .../gKakarikoDecorDL_tri_0 | 34 + .../gKakarikoDecorDL_tri_1 | 221 + .../gKakarikoDecorDL_tri_2 | 27 + .../gKakarikoDecorDL_tri_3 | 25 + .../gKakarikoDecorDL_tri_4 | 6 + .../gKakarikoDecorDL_tri_5 | 6 + .../gKakarikoDecorDL_tri_6 | 330 ++ .../gKakarikoDecorDL_tri_7 | 50 + .../gKakarikoDecorDL_vtx_0 | 106 + .../gKakarikoDecorDL_vtx_1 | 770 +++ .../gKakarikoDecorDL_vtx_2 | 82 + .../gKakarikoDecorDL_vtx_3 | 74 + .../gKakarikoDecorDL_vtx_4 | 6 + .../gKakarikoDecorDL_vtx_5 | 6 + .../gKakarikoDecorDL_vtx_6 | 497 ++ .../gKakarikoDecorDL_vtx_7 | 230 + .../gKakarikoDecorDL_vtx_cull | 10 + ...t_gKakarikoAdultDecorDL_f3dlite_StringGRGR | 21 + ...t_gKakarikoAdultDecorDL_f3dlite_snowlayer} | 16 +- ..._gKakarikoChildDecorDL_f3dlite_SnowBuildup | 21 + ...at_gKakarikoChildDecorDL_f3dlite_UsagiLeaf | 21 + ...KakarikoChildDecorDL_f3dlite_YukiUsagiBody | 21 + .../mat_gKakarikoDecorDL_f3dlite_CuccoBedding | 21 + .../mat_gKakarikoDecorDL_f3dlite_SnowBuildup | 21 + .../mat_gKakarikoDecorDL_f3dlite_StringBYBY | 21 + .../mat_gKakarikoDecorDL_f3dlite_StringGRGR | 21 + .../mat_gKakarikoDecorDL_f3dlite_UsagiLeaf | 21 + ...mat_gKakarikoDecorDL_f3dlite_YukiUsagiBody | 21 + .../mat_gKakarikoDecorDL_f3dlite_snowdissolve | 21 + .../mat_gKakarikoDecorDL_f3dlite_snowlayer | 21 + .../SnowBlanket_32 | Bin 0 -> 2140 bytes .../SnowBuildup_32 | Bin 0 -> 2140 bytes .../String_BYBY_32 | Bin 0 -> 2140 bytes .../String_GRGR_32 | Bin 0 -> 2140 bytes .../gTempleOfTimeDecorDL | 30 + .../gTempleOfTimeDecorDL_tri_0 | 2222 ++++++++ .../gTempleOfTimeDecorDL_tri_1 | 7 + .../gTempleOfTimeDecorDL_tri_2 | 30 + .../gTempleOfTimeDecorDL_tri_3 | 55 + .../gTempleOfTimeDecorDL_tri_4 | 69 + .../gTempleOfTimeDecorDL_tri_5 | 87 + .../gTempleOfTimeDecorDL_tri_6 | 87 + .../gTempleOfTimeDecorDL_tri_7 | 22 + .../gTempleOfTimeDecorDL_tri_8 | 7 + .../gTempleOfTimeDecorDL_vtx_0 | 4468 +++++++++++++++++ .../gTempleOfTimeDecorDL_vtx_1 | 8 + .../gTempleOfTimeDecorDL_vtx_2 | 74 + .../gTempleOfTimeDecorDL_vtx_3 | 119 + .../gTempleOfTimeDecorDL_vtx_4 | 224 + .../gTempleOfTimeDecorDL_vtx_5 | 284 ++ .../gTempleOfTimeDecorDL_vtx_6 | 278 + .../gTempleOfTimeDecorDL_vtx_7 | 66 + .../gTempleOfTimeDecorDL_vtx_8 | 10 + .../gTempleOfTimeDecorDL_vtx_cull | 10 + .../objects/object_temple_of_time_decor/ice | Bin 0 -> 2140 bytes ...t_gTempleOfTimeDecorDL_f3dlite_SnowBuildup | 21 + ...t_gTempleOfTimeDecorDL_f3dlite_StringBYBY} | 16 +- ...at_gTempleOfTimeDecorDL_f3dlite_StringGRGR | 21 + ...TimeDecorDL_f3dlite_gift_col_blue_material | 12 + ...imeDecorDL_f3dlite_gift_col_green_material | 12 + ...fTimeDecorDL_f3dlite_gift_col_red_material | 12 + ...meDecorDL_f3dlite_gift_col_yellow_material | 12 + ...gTempleOfTimeDecorDL_f3dlite_ice_material} | 12 +- ...mat_gTempleOfTimeDecorDL_f3dlite_snowlayer | 21 + .../object_triforce_completed/GlowAlpha_64 | Bin 0 -> 4188 bytes .../gTriforcePieceCompletedDL | 4 +- .../gTriforcePieceCompletedDL_tri_0 | 53 +- .../gTriforcePieceCompletedDL_tri_1 | 385 +- .../gTriforcePieceCompletedDL_vtx_0 | 56 +- .../gTriforcePieceCompletedDL_vtx_1 | 351 +- .../object_triforce_completed/hilite_melon | Bin 0 -> 2140 bytes ...mat_gTriforcePieceCompletedDL_f3dlite_Glow | 21 + ...orcePieceCompletedDL_f3dlite_OrnamentGold} | 6 +- ...rcePieceCompletedDL_f3dlite_triforce_edges | 21 - ...ePieceCompletedDL_f3dlite_triforce_surface | 21 - .../object_triforce_completed/noise_tex | Bin 2140 -> 0 bytes .../object_triforce_piece_0/gTriforcePiece0DL | 6 +- .../gTriforcePiece0DL_tri_0 | 62 +- .../gTriforcePiece0DL_tri_1 | 95 +- .../gTriforcePiece0DL_tri_2 | 51 - .../gTriforcePiece0DL_vtx_0 | 86 +- .../gTriforcePiece0DL_vtx_1 | 125 +- .../gTriforcePiece0DL_vtx_2 | 49 - .../objects/object_triforce_piece_0/image | Bin 0 -> 1116 bytes .../mat_gTriforcePiece0DL_ball | 21 + .../mat_gTriforcePiece0DL_f3dlite_shard_edge | 21 - .../mat_gTriforcePiece0DL_silver | 21 + .../objects/object_triforce_piece_0/noise_tex | Bin 2140 -> 0 bytes .../object_triforce_piece_1/gTriforcePiece1DL | 4 +- .../gTriforcePiece1DL_tri_0 | 71 +- .../gTriforcePiece1DL_tri_1 | 97 +- .../gTriforcePiece1DL_vtx_0 | 91 +- .../gTriforcePiece1DL_vtx_1 | 126 +- .../objects/object_triforce_piece_1/image | Bin 0 -> 1116 bytes .../object_triforce_piece_1/image_copy | Bin 0 -> 1116 bytes .../mat_gTriforcePiece1DL_blue_mat | 21 + .../mat_gTriforcePiece1DL_silver_002 | 21 + .../objects/object_triforce_piece_1/noise_tex | Bin 2140 -> 0 bytes .../object_triforce_piece_2/gTriforcePiece2DL | 6 +- .../gTriforcePiece2DL_tri_0 | 80 +- .../gTriforcePiece2DL_tri_1 | 373 +- .../gTriforcePiece2DL_tri_2 | 19 - .../gTriforcePiece2DL_vtx_0 | 104 +- .../gTriforcePiece2DL_vtx_1 | 418 +- .../gTriforcePiece2DL_vtx_2 | 18 - .../objects/object_triforce_piece_2/image | Bin 0 -> 1116 bytes .../object_triforce_piece_2/image_copy | Bin 0 -> 1116 bytes .../mat_gTriforcePiece2DL_Green_mat | 21 + ...gTriforcePiece2DL_f3dlite_triforce_surface | 21 - .../mat_gTriforcePiece2DL_silver_001 | 21 + .../objects/object_triforce_piece_2/noise_tex | Bin 2140 -> 0 bytes .../custom/objects/object_xmas_tree/Bark_64 | Bin 0 -> 8284 bytes .../objects/object_xmas_tree/Bauble1Tex_B_32 | Bin 0 -> 2140 bytes .../objects/object_xmas_tree/Bauble1Tex_G_32 | Bin 0 -> 2140 bytes .../objects/object_xmas_tree/Bauble1Tex_R_32 | Bin 0 -> 2140 bytes .../objects/object_xmas_tree/Bauble2Tex_B_32 | Bin 0 -> 2140 bytes .../objects/object_xmas_tree/Bauble2Tex_G_32 | Bin 0 -> 2140 bytes .../objects/object_xmas_tree/Bauble2Tex_R_32 | Bin 0 -> 2140 bytes .../objects/object_xmas_tree/Bauble3Tex_B_32 | Bin 0 -> 2140 bytes .../objects/object_xmas_tree/Bauble3Tex_G_32 | Bin 0 -> 2140 bytes .../objects/object_xmas_tree/Bauble3Tex_R_32 | Bin 0 -> 2140 bytes .../objects/object_xmas_tree/GlowAlpha_64 | Bin 0 -> 4188 bytes .../objects/object_xmas_tree/LeavesAlpha_64 | Bin 0 -> 8284 bytes .../object_xmas_tree/LeavesAlpha_shaded_64 | Bin 0 -> 8284 bytes .../objects/object_xmas_tree/Wrapping_B_32 | Bin 0 -> 2140 bytes .../objects/object_xmas_tree/Wrapping_B_64 | Bin 0 -> 8284 bytes .../objects/object_xmas_tree/Wrapping_G_32 | Bin 0 -> 2140 bytes .../objects/object_xmas_tree/Wrapping_G_64 | Bin 0 -> 8284 bytes .../objects/object_xmas_tree/Wrapping_R_32 | Bin 0 -> 2140 bytes .../objects/object_xmas_tree/Wrapping_R_64 | Bin 0 -> 8284 bytes .../objects/object_xmas_tree/gXmasDecor100DL | 17 + .../object_xmas_tree/gXmasDecor100DL_tri_0 | 106 + .../object_xmas_tree/gXmasDecor100DL_tri_1 | 170 + .../object_xmas_tree/gXmasDecor100DL_tri_2 | 68 + .../object_xmas_tree/gXmasDecor100DL_tri_3 | 68 + .../object_xmas_tree/gXmasDecor100DL_vtx_0 | 124 + .../object_xmas_tree/gXmasDecor100DL_vtx_1 | 220 + .../object_xmas_tree/gXmasDecor100DL_vtx_2 | 94 + .../object_xmas_tree/gXmasDecor100DL_vtx_3 | 94 + .../objects/object_xmas_tree/gXmasDecor10DL | 25 + .../object_xmas_tree/gXmasDecor10DL_tri_0 | 9 + .../object_xmas_tree/gXmasDecor10DL_tri_1 | 7 + .../object_xmas_tree/gXmasDecor10DL_tri_2 | 7 + .../object_xmas_tree/gXmasDecor10DL_tri_3 | 7 + .../object_xmas_tree/gXmasDecor10DL_tri_4 | 7 + .../object_xmas_tree/gXmasDecor10DL_tri_5 | 7 + .../object_xmas_tree/gXmasDecor10DL_tri_6 | 9 + .../object_xmas_tree/gXmasDecor10DL_tri_7 | 9 + .../object_xmas_tree/gXmasDecor10DL_vtx_0 | 10 + .../object_xmas_tree/gXmasDecor10DL_vtx_1 | 6 + .../object_xmas_tree/gXmasDecor10DL_vtx_2 | 6 + .../object_xmas_tree/gXmasDecor10DL_vtx_3 | 6 + .../object_xmas_tree/gXmasDecor10DL_vtx_4 | 6 + .../object_xmas_tree/gXmasDecor10DL_vtx_5 | 6 + .../object_xmas_tree/gXmasDecor10DL_vtx_6 | 10 + .../object_xmas_tree/gXmasDecor10DL_vtx_7 | 10 + .../objects/object_xmas_tree/gXmasDecor20DL | 29 + .../object_xmas_tree/gXmasDecor20DL_tri_0 | 106 + .../object_xmas_tree/gXmasDecor20DL_tri_1 | 68 + .../object_xmas_tree/gXmasDecor20DL_tri_2 | 197 + .../object_xmas_tree/gXmasDecor20DL_tri_3 | 9 + .../object_xmas_tree/gXmasDecor20DL_tri_4 | 9 + .../object_xmas_tree/gXmasDecor20DL_tri_5 | 9 + .../object_xmas_tree/gXmasDecor20DL_tri_6 | 9 + .../object_xmas_tree/gXmasDecor20DL_tri_7 | 7 + .../object_xmas_tree/gXmasDecor20DL_tri_8 | 7 + .../object_xmas_tree/gXmasDecor20DL_tri_9 | 7 + .../object_xmas_tree/gXmasDecor20DL_vtx_0 | 124 + .../object_xmas_tree/gXmasDecor20DL_vtx_1 | 94 + .../object_xmas_tree/gXmasDecor20DL_vtx_2 | 300 ++ .../object_xmas_tree/gXmasDecor20DL_vtx_3 | 10 + .../object_xmas_tree/gXmasDecor20DL_vtx_4 | 10 + .../object_xmas_tree/gXmasDecor20DL_vtx_5 | 10 + .../object_xmas_tree/gXmasDecor20DL_vtx_6 | 10 + .../object_xmas_tree/gXmasDecor20DL_vtx_7 | 6 + .../object_xmas_tree/gXmasDecor20DL_vtx_8 | 6 + .../object_xmas_tree/gXmasDecor20DL_vtx_9 | 6 + .../objects/object_xmas_tree/gXmasDecor30DL | 23 + .../object_xmas_tree/gXmasDecor30DL_tri_0 | 7 + .../object_xmas_tree/gXmasDecor30DL_tri_1 | 11 + .../object_xmas_tree/gXmasDecor30DL_tri_2 | 11 + .../object_xmas_tree/gXmasDecor30DL_tri_3 | 7 + .../object_xmas_tree/gXmasDecor30DL_tri_4 | 7 + .../object_xmas_tree/gXmasDecor30DL_tri_5 | 7 + .../object_xmas_tree/gXmasDecor30DL_tri_6 | 7 + .../object_xmas_tree/gXmasDecor30DL_vtx_0 | 6 + .../object_xmas_tree/gXmasDecor30DL_vtx_1 | 14 + .../object_xmas_tree/gXmasDecor30DL_vtx_2 | 14 + .../object_xmas_tree/gXmasDecor30DL_vtx_3 | 6 + .../object_xmas_tree/gXmasDecor30DL_vtx_4 | 6 + .../object_xmas_tree/gXmasDecor30DL_vtx_5 | 6 + .../object_xmas_tree/gXmasDecor30DL_vtx_6 | 6 + .../objects/object_xmas_tree/gXmasDecor40DL | 35 + .../object_xmas_tree/gXmasDecor40DL_tri_0 | 68 + .../object_xmas_tree/gXmasDecor40DL_tri_1 | 68 + .../object_xmas_tree/gXmasDecor40DL_tri_10 | 9 + .../object_xmas_tree/gXmasDecor40DL_tri_11 | 7 + .../object_xmas_tree/gXmasDecor40DL_tri_12 | 7 + .../object_xmas_tree/gXmasDecor40DL_tri_2 | 68 + .../object_xmas_tree/gXmasDecor40DL_tri_3 | 68 + .../object_xmas_tree/gXmasDecor40DL_tri_4 | 68 + .../object_xmas_tree/gXmasDecor40DL_tri_5 | 7 + .../object_xmas_tree/gXmasDecor40DL_tri_6 | 11 + .../object_xmas_tree/gXmasDecor40DL_tri_7 | 7 + .../object_xmas_tree/gXmasDecor40DL_tri_8 | 7 + .../object_xmas_tree/gXmasDecor40DL_tri_9 | 7 + .../object_xmas_tree/gXmasDecor40DL_vtx_0 | 94 + .../object_xmas_tree/gXmasDecor40DL_vtx_1 | 94 + .../object_xmas_tree/gXmasDecor40DL_vtx_10 | 10 + .../object_xmas_tree/gXmasDecor40DL_vtx_11 | 6 + .../object_xmas_tree/gXmasDecor40DL_vtx_12 | 6 + .../object_xmas_tree/gXmasDecor40DL_vtx_2 | 94 + .../object_xmas_tree/gXmasDecor40DL_vtx_3 | 94 + .../object_xmas_tree/gXmasDecor40DL_vtx_4 | 94 + .../object_xmas_tree/gXmasDecor40DL_vtx_5 | 6 + .../object_xmas_tree/gXmasDecor40DL_vtx_6 | 14 + .../object_xmas_tree/gXmasDecor40DL_vtx_7 | 6 + .../object_xmas_tree/gXmasDecor40DL_vtx_8 | 6 + .../object_xmas_tree/gXmasDecor40DL_vtx_9 | 6 + .../objects/object_xmas_tree/gXmasDecor50DL | 21 + .../object_xmas_tree/gXmasDecor50DL_tri_0 | 9 + .../object_xmas_tree/gXmasDecor50DL_tri_1 | 9 + .../object_xmas_tree/gXmasDecor50DL_tri_2 | 11 + .../object_xmas_tree/gXmasDecor50DL_tri_3 | 7 + .../object_xmas_tree/gXmasDecor50DL_tri_4 | 7 + .../object_xmas_tree/gXmasDecor50DL_tri_5 | 9 + .../object_xmas_tree/gXmasDecor50DL_vtx_0 | 10 + .../object_xmas_tree/gXmasDecor50DL_vtx_1 | 10 + .../object_xmas_tree/gXmasDecor50DL_vtx_2 | 14 + .../object_xmas_tree/gXmasDecor50DL_vtx_3 | 6 + .../object_xmas_tree/gXmasDecor50DL_vtx_4 | 6 + .../object_xmas_tree/gXmasDecor50DL_vtx_5 | 10 + .../objects/object_xmas_tree/gXmasDecor60DL | 29 + .../object_xmas_tree/gXmasDecor60DL_tri_0 | 68 + .../object_xmas_tree/gXmasDecor60DL_tri_1 | 106 + .../object_xmas_tree/gXmasDecor60DL_tri_2 | 68 + .../object_xmas_tree/gXmasDecor60DL_tri_3 | 133 + .../object_xmas_tree/gXmasDecor60DL_tri_4 | 9 + .../object_xmas_tree/gXmasDecor60DL_tri_5 | 9 + .../object_xmas_tree/gXmasDecor60DL_tri_6 | 9 + .../object_xmas_tree/gXmasDecor60DL_tri_7 | 7 + .../object_xmas_tree/gXmasDecor60DL_tri_8 | 11 + .../object_xmas_tree/gXmasDecor60DL_tri_9 | 7 + .../object_xmas_tree/gXmasDecor60DL_vtx_0 | 94 + .../object_xmas_tree/gXmasDecor60DL_vtx_1 | 124 + .../object_xmas_tree/gXmasDecor60DL_vtx_2 | 94 + .../object_xmas_tree/gXmasDecor60DL_vtx_3 | 202 + .../object_xmas_tree/gXmasDecor60DL_vtx_4 | 10 + .../object_xmas_tree/gXmasDecor60DL_vtx_5 | 10 + .../object_xmas_tree/gXmasDecor60DL_vtx_6 | 10 + .../object_xmas_tree/gXmasDecor60DL_vtx_7 | 6 + .../object_xmas_tree/gXmasDecor60DL_vtx_8 | 14 + .../object_xmas_tree/gXmasDecor60DL_vtx_9 | 6 + .../objects/object_xmas_tree/gXmasDecor70DL | 23 + .../object_xmas_tree/gXmasDecor70DL_tri_0 | 9 + .../object_xmas_tree/gXmasDecor70DL_tri_1 | 11 + .../object_xmas_tree/gXmasDecor70DL_tri_2 | 7 + .../object_xmas_tree/gXmasDecor70DL_tri_3 | 7 + .../object_xmas_tree/gXmasDecor70DL_tri_4 | 7 + .../object_xmas_tree/gXmasDecor70DL_tri_5 | 9 + .../object_xmas_tree/gXmasDecor70DL_tri_6 | 7 + .../object_xmas_tree/gXmasDecor70DL_vtx_0 | 10 + .../object_xmas_tree/gXmasDecor70DL_vtx_1 | 14 + .../object_xmas_tree/gXmasDecor70DL_vtx_2 | 6 + .../object_xmas_tree/gXmasDecor70DL_vtx_3 | 6 + .../object_xmas_tree/gXmasDecor70DL_vtx_4 | 6 + .../object_xmas_tree/gXmasDecor70DL_vtx_5 | 10 + .../object_xmas_tree/gXmasDecor70DL_vtx_6 | 6 + .../objects/object_xmas_tree/gXmasDecor80DL | 27 + .../object_xmas_tree/gXmasDecor80DL_tri_0 | 133 + .../object_xmas_tree/gXmasDecor80DL_tri_1 | 68 + .../object_xmas_tree/gXmasDecor80DL_tri_2 | 133 + .../object_xmas_tree/gXmasDecor80DL_tri_3 | 11 + .../object_xmas_tree/gXmasDecor80DL_tri_4 | 9 + .../object_xmas_tree/gXmasDecor80DL_tri_5 | 9 + .../object_xmas_tree/gXmasDecor80DL_tri_6 | 7 + .../object_xmas_tree/gXmasDecor80DL_tri_7 | 7 + .../object_xmas_tree/gXmasDecor80DL_tri_8 | 9 + .../object_xmas_tree/gXmasDecor80DL_vtx_0 | 202 + .../object_xmas_tree/gXmasDecor80DL_vtx_1 | 94 + .../object_xmas_tree/gXmasDecor80DL_vtx_2 | 202 + .../object_xmas_tree/gXmasDecor80DL_vtx_3 | 14 + .../object_xmas_tree/gXmasDecor80DL_vtx_4 | 10 + .../object_xmas_tree/gXmasDecor80DL_vtx_5 | 10 + .../object_xmas_tree/gXmasDecor80DL_vtx_6 | 6 + .../object_xmas_tree/gXmasDecor80DL_vtx_7 | 6 + .../object_xmas_tree/gXmasDecor80DL_vtx_8 | 10 + .../objects/object_xmas_tree/gXmasDecor90DL | 25 + .../object_xmas_tree/gXmasDecor90DL_tri_0 | 9 + .../object_xmas_tree/gXmasDecor90DL_tri_1 | 9 + .../object_xmas_tree/gXmasDecor90DL_tri_2 | 7 + .../object_xmas_tree/gXmasDecor90DL_tri_3 | 7 + .../object_xmas_tree/gXmasDecor90DL_tri_4 | 9 + .../object_xmas_tree/gXmasDecor90DL_tri_5 | 7 + .../object_xmas_tree/gXmasDecor90DL_tri_6 | 7 + .../object_xmas_tree/gXmasDecor90DL_tri_7 | 7 + .../object_xmas_tree/gXmasDecor90DL_vtx_0 | 10 + .../object_xmas_tree/gXmasDecor90DL_vtx_1 | 10 + .../object_xmas_tree/gXmasDecor90DL_vtx_2 | 6 + .../object_xmas_tree/gXmasDecor90DL_vtx_3 | 6 + .../object_xmas_tree/gXmasDecor90DL_vtx_4 | 10 + .../object_xmas_tree/gXmasDecor90DL_vtx_5 | 6 + .../object_xmas_tree/gXmasDecor90DL_vtx_6 | 6 + .../object_xmas_tree/gXmasDecor90DL_vtx_7 | 6 + .../objects/object_xmas_tree/gXmasStarDL | 13 + .../object_xmas_tree/gXmasStarDL_tri_0 | 7 + .../object_xmas_tree/gXmasStarDL_tri_1 | 390 ++ .../object_xmas_tree/gXmasStarDL_vtx_0 | 6 + .../object_xmas_tree/gXmasStarDL_vtx_1 | 347 ++ .../objects/object_xmas_tree/gXmasTreeDL | 15 + .../object_xmas_tree/gXmasTreeDL_tri_0 | 40 + .../object_xmas_tree/gXmasTreeDL_tri_1 | 133 + .../object_xmas_tree/gXmasTreeDL_tri_2 | 16 + .../object_xmas_tree/gXmasTreeDL_vtx_0 | 66 + .../object_xmas_tree/gXmasTreeDL_vtx_1 | 146 + .../object_xmas_tree/gXmasTreeDL_vtx_2 | 29 + .../objects/object_xmas_tree/hilite_melon | Bin 0 -> 2140 bytes .../mat_gXmasDecor100DL_f3dlite_Wrapping_B_64 | 21 + .../mat_gXmasDecor100DL_f3dlite_Wrapping_G_32 | 21 + .../mat_gXmasDecor100DL_f3dlite_Wrapping_R_32 | 21 + .../mat_gXmasDecor100DL_f3dlite_Wrapping_R_64 | 21 + .../mat_gXmasDecor10DL_f3dlite_Bauble1_B | 21 + .../mat_gXmasDecor10DL_f3dlite_Bauble1_G | 21 + .../mat_gXmasDecor10DL_f3dlite_Bauble1_R | 21 + .../mat_gXmasDecor10DL_f3dlite_Bauble2_B | 21 + .../mat_gXmasDecor10DL_f3dlite_Bauble2_G | 21 + .../mat_gXmasDecor10DL_f3dlite_Bauble2_R | 21 + .../mat_gXmasDecor10DL_f3dlite_Bauble3_G | 21 + .../mat_gXmasDecor10DL_f3dlite_Bauble3_R | 21 + .../mat_gXmasDecor20DL_f3dlite_Bauble1_B | 21 + .../mat_gXmasDecor20DL_f3dlite_Bauble1_R | 21 + .../mat_gXmasDecor20DL_f3dlite_Bauble2_B | 21 + .../mat_gXmasDecor20DL_f3dlite_Bauble2_G | 21 + .../mat_gXmasDecor20DL_f3dlite_Bauble2_R | 21 + .../mat_gXmasDecor20DL_f3dlite_Bauble3_B | 21 + .../mat_gXmasDecor20DL_f3dlite_Bauble3_G | 21 + .../mat_gXmasDecor20DL_f3dlite_Wrapping_B_32 | 21 + .../mat_gXmasDecor20DL_f3dlite_Wrapping_G_64 | 21 + .../mat_gXmasDecor20DL_f3dlite_Wrapping_R_32 | 21 + .../mat_gXmasDecor30DL_f3dlite_Bauble1_B | 21 + .../mat_gXmasDecor30DL_f3dlite_Bauble1_G | 21 + .../mat_gXmasDecor30DL_f3dlite_Bauble1_R | 21 + .../mat_gXmasDecor30DL_f3dlite_Bauble2_B | 21 + .../mat_gXmasDecor30DL_f3dlite_Bauble2_G | 21 + .../mat_gXmasDecor30DL_f3dlite_Bauble3_B | 21 + .../mat_gXmasDecor30DL_f3dlite_Bauble3_R | 21 + .../mat_gXmasDecor40DL_f3dlite_Bauble1_B | 21 + .../mat_gXmasDecor40DL_f3dlite_Bauble1_R | 21 + .../mat_gXmasDecor40DL_f3dlite_Bauble2_B | 21 + .../mat_gXmasDecor40DL_f3dlite_Bauble2_G | 21 + .../mat_gXmasDecor40DL_f3dlite_Bauble2_R | 21 + .../mat_gXmasDecor40DL_f3dlite_Bauble3_B | 21 + .../mat_gXmasDecor40DL_f3dlite_Bauble3_G | 21 + .../mat_gXmasDecor40DL_f3dlite_Bauble3_R | 21 + .../mat_gXmasDecor40DL_f3dlite_Wrapping_B_32 | 21 + .../mat_gXmasDecor40DL_f3dlite_Wrapping_G_32 | 21 + .../mat_gXmasDecor40DL_f3dlite_Wrapping_G_64 | 21 + .../mat_gXmasDecor40DL_f3dlite_Wrapping_R_32 | 21 + .../mat_gXmasDecor40DL_f3dlite_Wrapping_R_64 | 21 + .../mat_gXmasDecor50DL_f3dlite_Bauble1_B | 21 + .../mat_gXmasDecor50DL_f3dlite_Bauble1_G | 21 + .../mat_gXmasDecor50DL_f3dlite_Bauble2_G | 21 + .../mat_gXmasDecor50DL_f3dlite_Bauble2_R | 21 + .../mat_gXmasDecor50DL_f3dlite_Bauble3_B | 21 + .../mat_gXmasDecor50DL_f3dlite_Bauble3_R | 21 + .../mat_gXmasDecor60DL_f3dlite_Bauble1_B | 21 + .../mat_gXmasDecor60DL_f3dlite_Bauble1_G | 21 + .../mat_gXmasDecor60DL_f3dlite_Bauble1_R | 21 + .../mat_gXmasDecor60DL_f3dlite_Bauble2_G | 21 + .../mat_gXmasDecor60DL_f3dlite_Bauble2_R | 21 + .../mat_gXmasDecor60DL_f3dlite_Bauble3_G | 21 + .../mat_gXmasDecor60DL_f3dlite_Wrapping_B_64 | 21 + .../mat_gXmasDecor60DL_f3dlite_Wrapping_G_32 | 21 + .../mat_gXmasDecor60DL_f3dlite_Wrapping_R_32 | 21 + .../mat_gXmasDecor60DL_f3dlite_Wrapping_R_64 | 21 + .../mat_gXmasDecor70DL_f3dlite_Bauble1_G | 21 + .../mat_gXmasDecor70DL_f3dlite_Bauble1_R | 21 + .../mat_gXmasDecor70DL_f3dlite_Bauble2_G | 21 + .../mat_gXmasDecor70DL_f3dlite_Bauble2_R | 21 + .../mat_gXmasDecor70DL_f3dlite_Bauble3_B | 21 + .../mat_gXmasDecor70DL_f3dlite_Bauble3_G | 21 + .../mat_gXmasDecor70DL_f3dlite_Bauble3_R | 21 + .../mat_gXmasDecor80DL_f3dlite_Bauble1_B | 21 + .../mat_gXmasDecor80DL_f3dlite_Bauble1_R | 21 + .../mat_gXmasDecor80DL_f3dlite_Bauble2_G | 21 + .../mat_gXmasDecor80DL_f3dlite_Bauble3_B | 21 + .../mat_gXmasDecor80DL_f3dlite_Bauble3_G | 21 + .../mat_gXmasDecor80DL_f3dlite_Bauble3_R | 21 + .../mat_gXmasDecor80DL_f3dlite_Wrapping_B_32 | 21 + .../mat_gXmasDecor80DL_f3dlite_Wrapping_G_32 | 21 + .../mat_gXmasDecor80DL_f3dlite_Wrapping_R_32 | 21 + .../mat_gXmasDecor90DL_f3dlite_Bauble1_B | 21 + .../mat_gXmasDecor90DL_f3dlite_Bauble1_G | 21 + .../mat_gXmasDecor90DL_f3dlite_Bauble1_R | 21 + .../mat_gXmasDecor90DL_f3dlite_Bauble2_B | 21 + .../mat_gXmasDecor90DL_f3dlite_Bauble2_R | 21 + .../mat_gXmasDecor90DL_f3dlite_Bauble3_B | 21 + .../mat_gXmasDecor90DL_f3dlite_Bauble3_G | 21 + .../mat_gXmasDecor90DL_f3dlite_Bauble3_R | 21 + .../mat_gXmasStarDL_f3dlite_Glow | 21 + .../mat_gXmasStarDL_f3dlite_OrnamentGold} | 8 +- .../mat_gXmasTreeDL_f3dlite_TreeBrown | 21 + .../mat_gXmasTreeDL_f3dlite_TreeGreen | 21 + .../mat_gXmasTreeDL_f3dlite_TreeTip | 21 + .../gTriforcePiece.rgba32.png | Bin 1761 -> 984 bytes soh/assets/soh_assets.h | 69 + soh/assets/sources/TempleOfTime_DL.blend | Bin 0 -> 5413788 bytes soh/soh/ActorDB.cpp | 51 + .../cosmetics/CosmeticsEditor.cpp | 37 +- .../game-interactor/GameInteractor.h | 1 + .../game-interactor/GameInteractor_State.cpp | 4 + soh/soh/Enhancements/mods.cpp | 95 + soh/soh/Enhancements/randomizer/item_list.cpp | 2 +- .../Enhancements/randomizer/randomizer.cpp | 69 +- soh/soh/Enhancements/randomizer/randomizer.h | 2 + .../randomizer/randomizer_item_tracker.cpp | 6 +- soh/soh/OTRGlobals.cpp | 27 +- soh/src/code/z_kankyo.c | 16 +- soh/src/code/z_play.c | 11 +- soh/src/code/z_player_lib.c | 63 +- .../z_bg_spot08_iceblock.c | 7 +- .../actors/ovl_Boss_Dodongo/z_boss_dodongo.c | 16 + .../actors/ovl_Boss_Ganon/z_boss_ganon.c | 16 + .../actors/ovl_Boss_Ganon2/z_boss_ganon2.c | 28 + .../ovl_Boss_Ganondrof/z_boss_ganondrof.c | 15 + soh/src/overlays/actors/ovl_En_Am/z_en_am.c | 16 + soh/src/overlays/actors/ovl_En_Ani/z_en_ani.c | 16 + soh/src/overlays/actors/ovl_En_Bb/z_en_bb.c | 15 + .../actors/ovl_En_Bom_Chu/z_en_bom_chu.c | 11 + soh/src/overlays/actors/ovl_En_Box/z_en_box.c | 2 +- .../ovl_En_ChristmasDeco/z_en_christmasdeco.c | 61 + .../ovl_En_ChristmasDeco/z_en_christmasdeco.h | 27 + .../ovl_En_ChristmasTree/z_en_christmastree.c | 212 + .../ovl_En_ChristmasTree/z_en_christmastree.h | 29 + soh/src/overlays/actors/ovl_En_Cs/z_en_cs.c | 16 + .../z_en_daiku_kakariko.c | 46 + .../actors/ovl_En_Dekubaba/z_en_dekubaba.c | 15 + soh/src/overlays/actors/ovl_En_Dns/z_en_dns.c | 21 +- .../actors/ovl_En_Dodongo/z_en_dodongo.c | 16 + soh/src/overlays/actors/ovl_En_Dog/z_en_dog.c | 14 + soh/src/overlays/actors/ovl_En_Ds/z_en_ds.c | 16 + soh/src/overlays/actors/ovl_En_Du/z_en_du.c | 15 + soh/src/overlays/actors/ovl_En_Elf/z_en_elf.c | 23 +- soh/src/overlays/actors/ovl_En_Fu/z_en_fu.c | 15 + .../actors/ovl_En_Heishi4/z_en_heishi4.c | 23 +- soh/src/overlays/actors/ovl_En_Hs2/z_en_hs2.c | 24 + soh/src/overlays/actors/ovl_En_Hy/z_en_hy.c | 111 + soh/src/overlays/actors/ovl_En_Ik/z_en_ik.c | 41 + soh/src/overlays/actors/ovl_En_In/z_en_in.c | 13 + soh/src/overlays/actors/ovl_En_Jj/z_en_jj.c | 23 +- soh/src/overlays/actors/ovl_En_Ko/z_en_ko.c | 6 + .../overlays/actors/ovl_En_Kusa/z_en_kusa.c | 6 + soh/src/overlays/actors/ovl_En_Ma1/z_en_ma1.c | 16 + soh/src/overlays/actors/ovl_En_Niw/z_en_niw.c | 23 +- .../actors/ovl_En_Niw_Girl/z_en_niw_girl.c | 24 +- .../actors/ovl_En_Niw_Lady/z_en_niw_lady.c | 24 +- .../actors/ovl_En_Nutsball/z_en_nutsball.c | 29 +- .../overlays/actors/ovl_En_Okuta/z_en_okuta.c | 55 +- .../overlays/actors/ovl_En_Ossan/z_en_ossan.c | 84 +- .../actors/ovl_En_Po_Relay/z_en_po_relay.c | 15 + .../actors/ovl_En_Shopnuts/z_en_shopnuts.c | 15 + soh/src/overlays/actors/ovl_En_Skb/z_en_skb.c | 16 + .../actors/ovl_En_Snowball/z_en_snowball.c | 229 + .../actors/ovl_En_Snowball/z_en_snowball.h | 31 + soh/src/overlays/actors/ovl_En_Sth/z_en_sth.c | 16 + .../ovl_En_Syateki_Man/z_en_syateki_man.c | 24 +- soh/src/overlays/actors/ovl_En_Ta/z_en_ta.c | 15 + .../overlays/actors/ovl_En_Test/z_en_test.c | 15 + soh/src/overlays/actors/ovl_En_Tg/z_en_tg.c | 29 + soh/src/overlays/actors/ovl_En_Tk/z_en_tk.c | 15 + .../overlays/actors/ovl_En_Toryo/z_en_toryo.c | 20 + soh/src/overlays/actors/ovl_En_Vm/z_en_vm.c | 15 + .../ovl_En_Weather_Tag/z_en_weather_tag.c | 4 + soh/src/overlays/actors/ovl_En_Wf/z_en_wf.c | 16 + .../actors/ovl_En_Wood02/z_en_wood02.c | 22 +- soh/src/overlays/actors/ovl_En_Zf/z_en_zf.c | 1 + .../actors/ovl_End_Title/z_end_title.c | 94 +- .../ovl_Effect_Ss_Bomb2/z_eff_ss_bomb2.c | 22 +- .../overlays/gamestates/ovl_title/z_title.c | 2 +- 547 files changed, 25817 insertions(+), 744 deletions(-) create mode 100644 soh/assets/custom/objects/object_festivehats/antlers_64 create mode 100644 soh/assets/custom/objects/object_festivehats/gCuccoLadyHatDL create mode 100644 soh/assets/custom/objects/object_festivehats/gCuccoLadyHatDL_tri_0 create mode 100644 soh/assets/custom/objects/object_festivehats/gCuccoLadyHatDL_vtx_0 create mode 100644 soh/assets/custom/objects/object_festivehats/gEponaRudolphHatDL create mode 100644 soh/assets/custom/objects/object_festivehats/gEponaRudolphHatDL_tri_0 create mode 100644 soh/assets/custom/objects/object_festivehats/gEponaRudolphHatDL_tri_1 create mode 100644 soh/assets/custom/objects/object_festivehats/gEponaRudolphHatDL_vtx_0 create mode 100644 soh/assets/custom/objects/object_festivehats/gEponaRudolphHatDL_vtx_1 create mode 100644 soh/assets/custom/objects/object_festivehats/gHorseAntlersDL create mode 100644 soh/assets/custom/objects/object_festivehats/gHorseAntlersDL_tri_0 create mode 100644 soh/assets/custom/objects/object_festivehats/gHorseAntlersDL_vtx_0 create mode 100644 soh/assets/custom/objects/object_festivehats/gLinkAdultHatTrimDL create mode 100644 soh/assets/custom/objects/object_festivehats/gLinkAdultHatTrimDL_tri_0 create mode 100644 soh/assets/custom/objects/object_festivehats/gLinkAdultHatTrimDL_vtx_0 create mode 100644 soh/assets/custom/objects/object_festivehats/gLinkAdultPompomDL create mode 100644 soh/assets/custom/objects/object_festivehats/gLinkAdultPompomDL_tri_0 create mode 100644 soh/assets/custom/objects/object_festivehats/gLinkAdultPompomDL_vtx_0 create mode 100644 soh/assets/custom/objects/object_festivehats/gLinkChildHatTrimDL create mode 100644 soh/assets/custom/objects/object_festivehats/gLinkChildHatTrimDL_tri_0 create mode 100644 soh/assets/custom/objects/object_festivehats/gLinkChildHatTrimDL_vtx_0 create mode 100644 soh/assets/custom/objects/object_festivehats/gLinkChildPompomDL create mode 100644 soh/assets/custom/objects/object_festivehats/gLinkChildPompomDL_tri_0 create mode 100644 soh/assets/custom/objects/object_festivehats/gLinkChildPompomDL_vtx_0 create mode 100644 soh/assets/custom/objects/object_festivehats/gPaperCrownGenericDL create mode 100644 soh/assets/custom/objects/object_festivehats/gPaperCrownGenericDL_tri_0 create mode 100644 soh/assets/custom/objects/object_festivehats/gPaperCrownGenericDL_vtx_0 create mode 100644 soh/assets/custom/objects/object_festivehats/gSantaHatGenericDL create mode 100644 soh/assets/custom/objects/object_festivehats/gSantaHatGenericDL_tri_0 create mode 100644 soh/assets/custom/objects/object_festivehats/gSantaHatGenericDL_tri_1 create mode 100644 soh/assets/custom/objects/object_festivehats/gSantaHatGenericDL_vtx_0 create mode 100644 soh/assets/custom/objects/object_festivehats/gSantaHatGenericDL_vtx_1 create mode 100644 soh/assets/custom/objects/object_festivehats/hilite_nose create mode 100644 soh/assets/custom/objects/object_festivehats/mat_gCuccoLadyHatDL_f3dlite_hatcolour create mode 100644 soh/assets/custom/objects/object_festivehats/mat_gEponaRudolphHatDL_f3dlite_antlers rename soh/assets/custom/objects/{object_triforce_piece_1/mat_gTriforcePiece1DL_f3dlite_shard_edge => object_festivehats/mat_gEponaRudolphHatDL_f3dlite_rednose} (75%) create mode 100644 soh/assets/custom/objects/object_festivehats/mat_gHorseAntlersDL_f3dlite_antlers create mode 100644 soh/assets/custom/objects/object_festivehats/mat_gLinkAdultHatTrimDL_f3dlite_santahat_white create mode 100644 soh/assets/custom/objects/object_festivehats/mat_gLinkAdultPompomDL_f3dlite_santahat_white create mode 100644 soh/assets/custom/objects/object_festivehats/mat_gLinkChildHatTrimDL_f3dlite_santahat_white create mode 100644 soh/assets/custom/objects/object_festivehats/mat_gLinkChildPompomDL_f3dlite_santahat_white create mode 100644 soh/assets/custom/objects/object_festivehats/mat_gPaperCrownGenericDL_f3dlite_crown create mode 100644 soh/assets/custom/objects/object_festivehats/mat_gSantaHatGenericDL_f3dlite_santahatred create mode 100644 soh/assets/custom/objects/object_festivehats/mat_gSantaHatGenericDL_f3dlite_santahatwhite create mode 100644 soh/assets/custom/objects/object_kakariko_decor/CuccoBedding_32 create mode 100644 soh/assets/custom/objects/object_kakariko_decor/SnowBlanket_32 create mode 100644 soh/assets/custom/objects/object_kakariko_decor/SnowBuildup_32 create mode 100644 soh/assets/custom/objects/object_kakariko_decor/SnowDissolve_32 create mode 100644 soh/assets/custom/objects/object_kakariko_decor/String_BYBY_32 create mode 100644 soh/assets/custom/objects/object_kakariko_decor/String_GRGR_32 create mode 100644 soh/assets/custom/objects/object_kakariko_decor/UsagiLeaf_8 create mode 100644 soh/assets/custom/objects/object_kakariko_decor/YukiUsagi_16 create mode 100644 soh/assets/custom/objects/object_kakariko_decor/gKakarikoAdultDecorDL create mode 100644 soh/assets/custom/objects/object_kakariko_decor/gKakarikoAdultDecorDL_tri_0 create mode 100644 soh/assets/custom/objects/object_kakariko_decor/gKakarikoAdultDecorDL_tri_1 create mode 100644 soh/assets/custom/objects/object_kakariko_decor/gKakarikoAdultDecorDL_vtx_0 create mode 100644 soh/assets/custom/objects/object_kakariko_decor/gKakarikoAdultDecorDL_vtx_1 create mode 100644 soh/assets/custom/objects/object_kakariko_decor/gKakarikoAdultDecorDL_vtx_cull create mode 100644 soh/assets/custom/objects/object_kakariko_decor/gKakarikoChildDecorDL create mode 100644 soh/assets/custom/objects/object_kakariko_decor/gKakarikoChildDecorDL_tri_0 create mode 100644 soh/assets/custom/objects/object_kakariko_decor/gKakarikoChildDecorDL_tri_1 create mode 100644 soh/assets/custom/objects/object_kakariko_decor/gKakarikoChildDecorDL_tri_2 create mode 100644 soh/assets/custom/objects/object_kakariko_decor/gKakarikoChildDecorDL_vtx_0 create mode 100644 soh/assets/custom/objects/object_kakariko_decor/gKakarikoChildDecorDL_vtx_1 create mode 100644 soh/assets/custom/objects/object_kakariko_decor/gKakarikoChildDecorDL_vtx_2 create mode 100644 soh/assets/custom/objects/object_kakariko_decor/gKakarikoChildDecorDL_vtx_cull create mode 100644 soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL create mode 100644 soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL_tri_0 create mode 100644 soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL_tri_1 create mode 100644 soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL_tri_2 create mode 100644 soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL_tri_3 create mode 100644 soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL_tri_4 create mode 100644 soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL_tri_5 create mode 100644 soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL_tri_6 create mode 100644 soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL_tri_7 create mode 100644 soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL_vtx_0 create mode 100644 soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL_vtx_1 create mode 100644 soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL_vtx_2 create mode 100644 soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL_vtx_3 create mode 100644 soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL_vtx_4 create mode 100644 soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL_vtx_5 create mode 100644 soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL_vtx_6 create mode 100644 soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL_vtx_7 create mode 100644 soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL_vtx_cull create mode 100644 soh/assets/custom/objects/object_kakariko_decor/mat_gKakarikoAdultDecorDL_f3dlite_StringGRGR rename soh/assets/custom/objects/{object_triforce_piece_0/mat_gTriforcePiece0DL_f3dlite_triforce_edges => object_kakariko_decor/mat_gKakarikoAdultDecorDL_f3dlite_snowlayer} (52%) create mode 100644 soh/assets/custom/objects/object_kakariko_decor/mat_gKakarikoChildDecorDL_f3dlite_SnowBuildup create mode 100644 soh/assets/custom/objects/object_kakariko_decor/mat_gKakarikoChildDecorDL_f3dlite_UsagiLeaf create mode 100644 soh/assets/custom/objects/object_kakariko_decor/mat_gKakarikoChildDecorDL_f3dlite_YukiUsagiBody create mode 100644 soh/assets/custom/objects/object_kakariko_decor/mat_gKakarikoDecorDL_f3dlite_CuccoBedding create mode 100644 soh/assets/custom/objects/object_kakariko_decor/mat_gKakarikoDecorDL_f3dlite_SnowBuildup create mode 100644 soh/assets/custom/objects/object_kakariko_decor/mat_gKakarikoDecorDL_f3dlite_StringBYBY create mode 100644 soh/assets/custom/objects/object_kakariko_decor/mat_gKakarikoDecorDL_f3dlite_StringGRGR create mode 100644 soh/assets/custom/objects/object_kakariko_decor/mat_gKakarikoDecorDL_f3dlite_UsagiLeaf create mode 100644 soh/assets/custom/objects/object_kakariko_decor/mat_gKakarikoDecorDL_f3dlite_YukiUsagiBody create mode 100644 soh/assets/custom/objects/object_kakariko_decor/mat_gKakarikoDecorDL_f3dlite_snowdissolve create mode 100644 soh/assets/custom/objects/object_kakariko_decor/mat_gKakarikoDecorDL_f3dlite_snowlayer create mode 100644 soh/assets/custom/objects/object_temple_of_time_decor/SnowBlanket_32 create mode 100644 soh/assets/custom/objects/object_temple_of_time_decor/SnowBuildup_32 create mode 100644 soh/assets/custom/objects/object_temple_of_time_decor/String_BYBY_32 create mode 100644 soh/assets/custom/objects/object_temple_of_time_decor/String_GRGR_32 create mode 100644 soh/assets/custom/objects/object_temple_of_time_decor/gTempleOfTimeDecorDL create mode 100644 soh/assets/custom/objects/object_temple_of_time_decor/gTempleOfTimeDecorDL_tri_0 create mode 100644 soh/assets/custom/objects/object_temple_of_time_decor/gTempleOfTimeDecorDL_tri_1 create mode 100644 soh/assets/custom/objects/object_temple_of_time_decor/gTempleOfTimeDecorDL_tri_2 create mode 100644 soh/assets/custom/objects/object_temple_of_time_decor/gTempleOfTimeDecorDL_tri_3 create mode 100644 soh/assets/custom/objects/object_temple_of_time_decor/gTempleOfTimeDecorDL_tri_4 create mode 100644 soh/assets/custom/objects/object_temple_of_time_decor/gTempleOfTimeDecorDL_tri_5 create mode 100644 soh/assets/custom/objects/object_temple_of_time_decor/gTempleOfTimeDecorDL_tri_6 create mode 100644 soh/assets/custom/objects/object_temple_of_time_decor/gTempleOfTimeDecorDL_tri_7 create mode 100644 soh/assets/custom/objects/object_temple_of_time_decor/gTempleOfTimeDecorDL_tri_8 create mode 100644 soh/assets/custom/objects/object_temple_of_time_decor/gTempleOfTimeDecorDL_vtx_0 create mode 100644 soh/assets/custom/objects/object_temple_of_time_decor/gTempleOfTimeDecorDL_vtx_1 create mode 100644 soh/assets/custom/objects/object_temple_of_time_decor/gTempleOfTimeDecorDL_vtx_2 create mode 100644 soh/assets/custom/objects/object_temple_of_time_decor/gTempleOfTimeDecorDL_vtx_3 create mode 100644 soh/assets/custom/objects/object_temple_of_time_decor/gTempleOfTimeDecorDL_vtx_4 create mode 100644 soh/assets/custom/objects/object_temple_of_time_decor/gTempleOfTimeDecorDL_vtx_5 create mode 100644 soh/assets/custom/objects/object_temple_of_time_decor/gTempleOfTimeDecorDL_vtx_6 create mode 100644 soh/assets/custom/objects/object_temple_of_time_decor/gTempleOfTimeDecorDL_vtx_7 create mode 100644 soh/assets/custom/objects/object_temple_of_time_decor/gTempleOfTimeDecorDL_vtx_8 create mode 100644 soh/assets/custom/objects/object_temple_of_time_decor/gTempleOfTimeDecorDL_vtx_cull create mode 100644 soh/assets/custom/objects/object_temple_of_time_decor/ice create mode 100644 soh/assets/custom/objects/object_temple_of_time_decor/mat_gTempleOfTimeDecorDL_f3dlite_SnowBuildup rename soh/assets/custom/objects/{object_triforce_piece_2/mat_gTriforcePiece2DL_f3dlite_shard_edge => object_temple_of_time_decor/mat_gTempleOfTimeDecorDL_f3dlite_StringBYBY} (52%) create mode 100644 soh/assets/custom/objects/object_temple_of_time_decor/mat_gTempleOfTimeDecorDL_f3dlite_StringGRGR create mode 100644 soh/assets/custom/objects/object_temple_of_time_decor/mat_gTempleOfTimeDecorDL_f3dlite_gift_col_blue_material create mode 100644 soh/assets/custom/objects/object_temple_of_time_decor/mat_gTempleOfTimeDecorDL_f3dlite_gift_col_green_material create mode 100644 soh/assets/custom/objects/object_temple_of_time_decor/mat_gTempleOfTimeDecorDL_f3dlite_gift_col_red_material create mode 100644 soh/assets/custom/objects/object_temple_of_time_decor/mat_gTempleOfTimeDecorDL_f3dlite_gift_col_yellow_material rename soh/assets/custom/objects/{object_triforce_piece_0/mat_gTriforcePiece0DL_f3dlite_triforce_surface => object_temple_of_time_decor/mat_gTempleOfTimeDecorDL_f3dlite_ice_material} (65%) create mode 100644 soh/assets/custom/objects/object_temple_of_time_decor/mat_gTempleOfTimeDecorDL_f3dlite_snowlayer create mode 100644 soh/assets/custom/objects/object_triforce_completed/GlowAlpha_64 create mode 100644 soh/assets/custom/objects/object_triforce_completed/hilite_melon create mode 100644 soh/assets/custom/objects/object_triforce_completed/mat_gTriforcePieceCompletedDL_f3dlite_Glow rename soh/assets/custom/objects/{object_triforce_piece_1/mat_gTriforcePiece1DL_f3dlite_triforce_surface => object_triforce_completed/mat_gTriforcePieceCompletedDL_f3dlite_OrnamentGold} (75%) delete mode 100644 soh/assets/custom/objects/object_triforce_completed/mat_gTriforcePieceCompletedDL_f3dlite_triforce_edges delete mode 100644 soh/assets/custom/objects/object_triforce_completed/mat_gTriforcePieceCompletedDL_f3dlite_triforce_surface delete mode 100644 soh/assets/custom/objects/object_triforce_completed/noise_tex delete mode 100644 soh/assets/custom/objects/object_triforce_piece_0/gTriforcePiece0DL_tri_2 delete mode 100644 soh/assets/custom/objects/object_triforce_piece_0/gTriforcePiece0DL_vtx_2 create mode 100644 soh/assets/custom/objects/object_triforce_piece_0/image create mode 100644 soh/assets/custom/objects/object_triforce_piece_0/mat_gTriforcePiece0DL_ball delete mode 100644 soh/assets/custom/objects/object_triforce_piece_0/mat_gTriforcePiece0DL_f3dlite_shard_edge create mode 100644 soh/assets/custom/objects/object_triforce_piece_0/mat_gTriforcePiece0DL_silver delete mode 100644 soh/assets/custom/objects/object_triforce_piece_0/noise_tex create mode 100644 soh/assets/custom/objects/object_triforce_piece_1/image create mode 100644 soh/assets/custom/objects/object_triforce_piece_1/image_copy create mode 100644 soh/assets/custom/objects/object_triforce_piece_1/mat_gTriforcePiece1DL_blue_mat create mode 100644 soh/assets/custom/objects/object_triforce_piece_1/mat_gTriforcePiece1DL_silver_002 delete mode 100644 soh/assets/custom/objects/object_triforce_piece_1/noise_tex delete mode 100644 soh/assets/custom/objects/object_triforce_piece_2/gTriforcePiece2DL_tri_2 delete mode 100644 soh/assets/custom/objects/object_triforce_piece_2/gTriforcePiece2DL_vtx_2 create mode 100644 soh/assets/custom/objects/object_triforce_piece_2/image create mode 100644 soh/assets/custom/objects/object_triforce_piece_2/image_copy create mode 100644 soh/assets/custom/objects/object_triforce_piece_2/mat_gTriforcePiece2DL_Green_mat delete mode 100644 soh/assets/custom/objects/object_triforce_piece_2/mat_gTriforcePiece2DL_f3dlite_triforce_surface create mode 100644 soh/assets/custom/objects/object_triforce_piece_2/mat_gTriforcePiece2DL_silver_001 delete mode 100644 soh/assets/custom/objects/object_triforce_piece_2/noise_tex create mode 100644 soh/assets/custom/objects/object_xmas_tree/Bark_64 create mode 100644 soh/assets/custom/objects/object_xmas_tree/Bauble1Tex_B_32 create mode 100644 soh/assets/custom/objects/object_xmas_tree/Bauble1Tex_G_32 create mode 100644 soh/assets/custom/objects/object_xmas_tree/Bauble1Tex_R_32 create mode 100644 soh/assets/custom/objects/object_xmas_tree/Bauble2Tex_B_32 create mode 100644 soh/assets/custom/objects/object_xmas_tree/Bauble2Tex_G_32 create mode 100644 soh/assets/custom/objects/object_xmas_tree/Bauble2Tex_R_32 create mode 100644 soh/assets/custom/objects/object_xmas_tree/Bauble3Tex_B_32 create mode 100644 soh/assets/custom/objects/object_xmas_tree/Bauble3Tex_G_32 create mode 100644 soh/assets/custom/objects/object_xmas_tree/Bauble3Tex_R_32 create mode 100644 soh/assets/custom/objects/object_xmas_tree/GlowAlpha_64 create mode 100644 soh/assets/custom/objects/object_xmas_tree/LeavesAlpha_64 create mode 100644 soh/assets/custom/objects/object_xmas_tree/LeavesAlpha_shaded_64 create mode 100644 soh/assets/custom/objects/object_xmas_tree/Wrapping_B_32 create mode 100644 soh/assets/custom/objects/object_xmas_tree/Wrapping_B_64 create mode 100644 soh/assets/custom/objects/object_xmas_tree/Wrapping_G_32 create mode 100644 soh/assets/custom/objects/object_xmas_tree/Wrapping_G_64 create mode 100644 soh/assets/custom/objects/object_xmas_tree/Wrapping_R_32 create mode 100644 soh/assets/custom/objects/object_xmas_tree/Wrapping_R_64 create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasDecor100DL create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasDecor100DL_tri_0 create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasDecor100DL_tri_1 create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasDecor100DL_tri_2 create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasDecor100DL_tri_3 create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasDecor100DL_vtx_0 create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasDecor100DL_vtx_1 create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasDecor100DL_vtx_2 create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasDecor100DL_vtx_3 create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasDecor10DL create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasDecor10DL_tri_0 create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasDecor10DL_tri_1 create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasDecor10DL_tri_2 create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasDecor10DL_tri_3 create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasDecor10DL_tri_4 create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasDecor10DL_tri_5 create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasDecor10DL_tri_6 create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasDecor10DL_tri_7 create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasDecor10DL_vtx_0 create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasDecor10DL_vtx_1 create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasDecor10DL_vtx_2 create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasDecor10DL_vtx_3 create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasDecor10DL_vtx_4 create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasDecor10DL_vtx_5 create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasDecor10DL_vtx_6 create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasDecor10DL_vtx_7 create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasDecor20DL create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasDecor20DL_tri_0 create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasDecor20DL_tri_1 create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasDecor20DL_tri_2 create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasDecor20DL_tri_3 create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasDecor20DL_tri_4 create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasDecor20DL_tri_5 create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasDecor20DL_tri_6 create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasDecor20DL_tri_7 create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasDecor20DL_tri_8 create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasDecor20DL_tri_9 create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasDecor20DL_vtx_0 create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasDecor20DL_vtx_1 create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasDecor20DL_vtx_2 create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasDecor20DL_vtx_3 create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasDecor20DL_vtx_4 create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasDecor20DL_vtx_5 create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasDecor20DL_vtx_6 create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasDecor20DL_vtx_7 create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasDecor20DL_vtx_8 create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasDecor20DL_vtx_9 create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasDecor30DL create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasDecor30DL_tri_0 create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasDecor30DL_tri_1 create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasDecor30DL_tri_2 create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasDecor30DL_tri_3 create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasDecor30DL_tri_4 create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasDecor30DL_tri_5 create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasDecor30DL_tri_6 create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasDecor30DL_vtx_0 create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasDecor30DL_vtx_1 create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasDecor30DL_vtx_2 create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasDecor30DL_vtx_3 create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasDecor30DL_vtx_4 create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasDecor30DL_vtx_5 create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasDecor30DL_vtx_6 create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasDecor40DL create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasDecor40DL_tri_0 create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasDecor40DL_tri_1 create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasDecor40DL_tri_10 create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasDecor40DL_tri_11 create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasDecor40DL_tri_12 create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasDecor40DL_tri_2 create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasDecor40DL_tri_3 create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasDecor40DL_tri_4 create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasDecor40DL_tri_5 create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasDecor40DL_tri_6 create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasDecor40DL_tri_7 create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasDecor40DL_tri_8 create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasDecor40DL_tri_9 create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasDecor40DL_vtx_0 create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasDecor40DL_vtx_1 create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasDecor40DL_vtx_10 create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasDecor40DL_vtx_11 create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasDecor40DL_vtx_12 create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasDecor40DL_vtx_2 create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasDecor40DL_vtx_3 create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasDecor40DL_vtx_4 create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasDecor40DL_vtx_5 create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasDecor40DL_vtx_6 create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasDecor40DL_vtx_7 create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasDecor40DL_vtx_8 create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasDecor40DL_vtx_9 create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasDecor50DL create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasDecor50DL_tri_0 create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasDecor50DL_tri_1 create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasDecor50DL_tri_2 create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasDecor50DL_tri_3 create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasDecor50DL_tri_4 create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasDecor50DL_tri_5 create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasDecor50DL_vtx_0 create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasDecor50DL_vtx_1 create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasDecor50DL_vtx_2 create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasDecor50DL_vtx_3 create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasDecor50DL_vtx_4 create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasDecor50DL_vtx_5 create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasDecor60DL create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasDecor60DL_tri_0 create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasDecor60DL_tri_1 create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasDecor60DL_tri_2 create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasDecor60DL_tri_3 create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasDecor60DL_tri_4 create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasDecor60DL_tri_5 create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasDecor60DL_tri_6 create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasDecor60DL_tri_7 create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasDecor60DL_tri_8 create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasDecor60DL_tri_9 create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasDecor60DL_vtx_0 create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasDecor60DL_vtx_1 create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasDecor60DL_vtx_2 create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasDecor60DL_vtx_3 create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasDecor60DL_vtx_4 create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasDecor60DL_vtx_5 create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasDecor60DL_vtx_6 create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasDecor60DL_vtx_7 create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasDecor60DL_vtx_8 create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasDecor60DL_vtx_9 create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasDecor70DL create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasDecor70DL_tri_0 create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasDecor70DL_tri_1 create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasDecor70DL_tri_2 create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasDecor70DL_tri_3 create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasDecor70DL_tri_4 create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasDecor70DL_tri_5 create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasDecor70DL_tri_6 create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasDecor70DL_vtx_0 create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasDecor70DL_vtx_1 create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasDecor70DL_vtx_2 create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasDecor70DL_vtx_3 create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasDecor70DL_vtx_4 create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasDecor70DL_vtx_5 create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasDecor70DL_vtx_6 create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasDecor80DL create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasDecor80DL_tri_0 create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasDecor80DL_tri_1 create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasDecor80DL_tri_2 create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasDecor80DL_tri_3 create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasDecor80DL_tri_4 create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasDecor80DL_tri_5 create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasDecor80DL_tri_6 create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasDecor80DL_tri_7 create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasDecor80DL_tri_8 create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasDecor80DL_vtx_0 create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasDecor80DL_vtx_1 create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasDecor80DL_vtx_2 create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasDecor80DL_vtx_3 create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasDecor80DL_vtx_4 create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasDecor80DL_vtx_5 create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasDecor80DL_vtx_6 create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasDecor80DL_vtx_7 create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasDecor80DL_vtx_8 create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasDecor90DL create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasDecor90DL_tri_0 create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasDecor90DL_tri_1 create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasDecor90DL_tri_2 create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasDecor90DL_tri_3 create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasDecor90DL_tri_4 create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasDecor90DL_tri_5 create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasDecor90DL_tri_6 create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasDecor90DL_tri_7 create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasDecor90DL_vtx_0 create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasDecor90DL_vtx_1 create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasDecor90DL_vtx_2 create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasDecor90DL_vtx_3 create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasDecor90DL_vtx_4 create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasDecor90DL_vtx_5 create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasDecor90DL_vtx_6 create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasDecor90DL_vtx_7 create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasStarDL create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasStarDL_tri_0 create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasStarDL_tri_1 create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasStarDL_vtx_0 create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasStarDL_vtx_1 create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasTreeDL create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasTreeDL_tri_0 create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasTreeDL_tri_1 create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasTreeDL_tri_2 create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasTreeDL_vtx_0 create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasTreeDL_vtx_1 create mode 100644 soh/assets/custom/objects/object_xmas_tree/gXmasTreeDL_vtx_2 create mode 100644 soh/assets/custom/objects/object_xmas_tree/hilite_melon create mode 100644 soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor100DL_f3dlite_Wrapping_B_64 create mode 100644 soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor100DL_f3dlite_Wrapping_G_32 create mode 100644 soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor100DL_f3dlite_Wrapping_R_32 create mode 100644 soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor100DL_f3dlite_Wrapping_R_64 create mode 100644 soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor10DL_f3dlite_Bauble1_B create mode 100644 soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor10DL_f3dlite_Bauble1_G create mode 100644 soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor10DL_f3dlite_Bauble1_R create mode 100644 soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor10DL_f3dlite_Bauble2_B create mode 100644 soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor10DL_f3dlite_Bauble2_G create mode 100644 soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor10DL_f3dlite_Bauble2_R create mode 100644 soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor10DL_f3dlite_Bauble3_G create mode 100644 soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor10DL_f3dlite_Bauble3_R create mode 100644 soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor20DL_f3dlite_Bauble1_B create mode 100644 soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor20DL_f3dlite_Bauble1_R create mode 100644 soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor20DL_f3dlite_Bauble2_B create mode 100644 soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor20DL_f3dlite_Bauble2_G create mode 100644 soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor20DL_f3dlite_Bauble2_R create mode 100644 soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor20DL_f3dlite_Bauble3_B create mode 100644 soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor20DL_f3dlite_Bauble3_G create mode 100644 soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor20DL_f3dlite_Wrapping_B_32 create mode 100644 soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor20DL_f3dlite_Wrapping_G_64 create mode 100644 soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor20DL_f3dlite_Wrapping_R_32 create mode 100644 soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor30DL_f3dlite_Bauble1_B create mode 100644 soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor30DL_f3dlite_Bauble1_G create mode 100644 soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor30DL_f3dlite_Bauble1_R create mode 100644 soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor30DL_f3dlite_Bauble2_B create mode 100644 soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor30DL_f3dlite_Bauble2_G create mode 100644 soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor30DL_f3dlite_Bauble3_B create mode 100644 soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor30DL_f3dlite_Bauble3_R create mode 100644 soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor40DL_f3dlite_Bauble1_B create mode 100644 soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor40DL_f3dlite_Bauble1_R create mode 100644 soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor40DL_f3dlite_Bauble2_B create mode 100644 soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor40DL_f3dlite_Bauble2_G create mode 100644 soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor40DL_f3dlite_Bauble2_R create mode 100644 soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor40DL_f3dlite_Bauble3_B create mode 100644 soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor40DL_f3dlite_Bauble3_G create mode 100644 soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor40DL_f3dlite_Bauble3_R create mode 100644 soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor40DL_f3dlite_Wrapping_B_32 create mode 100644 soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor40DL_f3dlite_Wrapping_G_32 create mode 100644 soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor40DL_f3dlite_Wrapping_G_64 create mode 100644 soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor40DL_f3dlite_Wrapping_R_32 create mode 100644 soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor40DL_f3dlite_Wrapping_R_64 create mode 100644 soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor50DL_f3dlite_Bauble1_B create mode 100644 soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor50DL_f3dlite_Bauble1_G create mode 100644 soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor50DL_f3dlite_Bauble2_G create mode 100644 soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor50DL_f3dlite_Bauble2_R create mode 100644 soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor50DL_f3dlite_Bauble3_B create mode 100644 soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor50DL_f3dlite_Bauble3_R create mode 100644 soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor60DL_f3dlite_Bauble1_B create mode 100644 soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor60DL_f3dlite_Bauble1_G create mode 100644 soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor60DL_f3dlite_Bauble1_R create mode 100644 soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor60DL_f3dlite_Bauble2_G create mode 100644 soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor60DL_f3dlite_Bauble2_R create mode 100644 soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor60DL_f3dlite_Bauble3_G create mode 100644 soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor60DL_f3dlite_Wrapping_B_64 create mode 100644 soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor60DL_f3dlite_Wrapping_G_32 create mode 100644 soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor60DL_f3dlite_Wrapping_R_32 create mode 100644 soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor60DL_f3dlite_Wrapping_R_64 create mode 100644 soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor70DL_f3dlite_Bauble1_G create mode 100644 soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor70DL_f3dlite_Bauble1_R create mode 100644 soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor70DL_f3dlite_Bauble2_G create mode 100644 soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor70DL_f3dlite_Bauble2_R create mode 100644 soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor70DL_f3dlite_Bauble3_B create mode 100644 soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor70DL_f3dlite_Bauble3_G create mode 100644 soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor70DL_f3dlite_Bauble3_R create mode 100644 soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor80DL_f3dlite_Bauble1_B create mode 100644 soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor80DL_f3dlite_Bauble1_R create mode 100644 soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor80DL_f3dlite_Bauble2_G create mode 100644 soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor80DL_f3dlite_Bauble3_B create mode 100644 soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor80DL_f3dlite_Bauble3_G create mode 100644 soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor80DL_f3dlite_Bauble3_R create mode 100644 soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor80DL_f3dlite_Wrapping_B_32 create mode 100644 soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor80DL_f3dlite_Wrapping_G_32 create mode 100644 soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor80DL_f3dlite_Wrapping_R_32 create mode 100644 soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor90DL_f3dlite_Bauble1_B create mode 100644 soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor90DL_f3dlite_Bauble1_G create mode 100644 soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor90DL_f3dlite_Bauble1_R create mode 100644 soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor90DL_f3dlite_Bauble2_B create mode 100644 soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor90DL_f3dlite_Bauble2_R create mode 100644 soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor90DL_f3dlite_Bauble3_B create mode 100644 soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor90DL_f3dlite_Bauble3_G create mode 100644 soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor90DL_f3dlite_Bauble3_R create mode 100644 soh/assets/custom/objects/object_xmas_tree/mat_gXmasStarDL_f3dlite_Glow rename soh/assets/custom/objects/{object_triforce_piece_2/mat_gTriforcePiece2DL_f3dlite_triforce_edges => object_xmas_tree/mat_gXmasStarDL_f3dlite_OrnamentGold} (72%) create mode 100644 soh/assets/custom/objects/object_xmas_tree/mat_gXmasTreeDL_f3dlite_TreeBrown create mode 100644 soh/assets/custom/objects/object_xmas_tree/mat_gXmasTreeDL_f3dlite_TreeGreen create mode 100644 soh/assets/custom/objects/object_xmas_tree/mat_gXmasTreeDL_f3dlite_TreeTip create mode 100644 soh/assets/sources/TempleOfTime_DL.blend create mode 100644 soh/src/overlays/actors/ovl_En_ChristmasDeco/z_en_christmasdeco.c create mode 100644 soh/src/overlays/actors/ovl_En_ChristmasDeco/z_en_christmasdeco.h create mode 100644 soh/src/overlays/actors/ovl_En_ChristmasTree/z_en_christmastree.c create mode 100644 soh/src/overlays/actors/ovl_En_ChristmasTree/z_en_christmastree.h create mode 100644 soh/src/overlays/actors/ovl_En_Snowball/z_en_snowball.c create mode 100644 soh/src/overlays/actors/ovl_En_Snowball/z_en_snowball.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 2bdaf1de9..cc3adb1f7 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -34,7 +34,7 @@ math(EXPR PATCH_INDEX "${PROJECT_VERSION_PATCH}") # Use the patch number to select the correct word list(GET NATO_PHONETIC_ALPHABET ${PATCH_INDEX} PROJECT_PATCH_WORD) -set(PROJECT_BUILD_NAME "MacReady ${PROJECT_PATCH_WORD}" CACHE STRING "" FORCE) +set(PROJECT_BUILD_NAME "Holiday 2024" CACHE STRING "" FORCE) set(PROJECT_TEAM "github.com/harbourmasters" CACHE STRING "" FORCE) execute_process( diff --git a/soh/assets/custom/objects/object_festivehats/antlers_64 b/soh/assets/custom/objects/object_festivehats/antlers_64 new file mode 100644 index 0000000000000000000000000000000000000000..74fe9e819778ed087b2349a2f182207604661271 GIT binary patch literal 8284 zcmeHMJ!{)Q7?vuMsDy$bi${&h=4|RzU0j3GB5IWudZWi=)Tk+!5JJdc3jG`X3xy+u zlBE!`_b>D>^nG+bTZ$w*N}Y3uNH~&CclW&ayq~97mSueze)?e3_0Ny*zwx8n2Olq} zXEgn(LC0?_i+;X(dj9*&z%v8S4E&!AxP!fobeP()41|RcXz+0N+2zSy_MSVj>@kDD z1(g3Yzs;ofop1; zv4LQ=c7+;CoGIbE1{Ba^#Q2Q+SVl5nF8Q5n(drHO-$<6xLji1a$DDiEeJstQTUK0J zJ$DXovLs8=3wPfP13jj>uUshtnX&w6wt9HmNQS~^9t#Al&;$c>%OA=9{cQ8(cIeI6 z$I4Btw~FCU@l!jJu2X$y;z{|Q%62X`Ert&j^|5-N8HO(4LIJNE$w-*Va`)F5N{w$i z>M2PSK74&W>sR_Ge2O~vxiRsq{15u4N_QOx#av~7>xe#BFtQ)~&rGzhQ>-l@mi2cg zT3q6vQ{Azy2&6PX7PyxD1BT%P$N-dq?8S`ti>hGto(daW#(-<_bK02|{<3OYRZ##@ zs67hsi#$;k5L4zm6R*y4S=Crw4}yhKM#3C~ zAIYPaUDks+3;Y2e)@5sM(Htl}=vV{)puOQ0c<Uq;4#+)`0I7Fv&kU(CN7-bYo>h*rA)>aQxl z0|{{nR;f?a(&`K9>QT!xhC=0c%8Vis6qyOtbErbw51+z(-8(Qk8W@S=2uy hKZxZ#+Ar$+6z>pc$ik + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_festivehats/gCuccoLadyHatDL_tri_0 b/soh/assets/custom/objects/object_festivehats/gCuccoLadyHatDL_tri_0 new file mode 100644 index 000000000..980452845 --- /dev/null +++ b/soh/assets/custom/objects/object_festivehats/gCuccoLadyHatDL_tri_0 @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_festivehats/gCuccoLadyHatDL_vtx_0 b/soh/assets/custom/objects/object_festivehats/gCuccoLadyHatDL_vtx_0 new file mode 100644 index 000000000..8a64cdf18 --- /dev/null +++ b/soh/assets/custom/objects/object_festivehats/gCuccoLadyHatDL_vtx_0 @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_festivehats/gEponaRudolphHatDL b/soh/assets/custom/objects/object_festivehats/gEponaRudolphHatDL new file mode 100644 index 000000000..6d059179f --- /dev/null +++ b/soh/assets/custom/objects/object_festivehats/gEponaRudolphHatDL @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_festivehats/gEponaRudolphHatDL_tri_0 b/soh/assets/custom/objects/object_festivehats/gEponaRudolphHatDL_tri_0 new file mode 100644 index 000000000..3e0ab2ad8 --- /dev/null +++ b/soh/assets/custom/objects/object_festivehats/gEponaRudolphHatDL_tri_0 @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_festivehats/gEponaRudolphHatDL_tri_1 b/soh/assets/custom/objects/object_festivehats/gEponaRudolphHatDL_tri_1 new file mode 100644 index 000000000..99f0a799d --- /dev/null +++ b/soh/assets/custom/objects/object_festivehats/gEponaRudolphHatDL_tri_1 @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_festivehats/gEponaRudolphHatDL_vtx_0 b/soh/assets/custom/objects/object_festivehats/gEponaRudolphHatDL_vtx_0 new file mode 100644 index 000000000..ebb2b0eea --- /dev/null +++ b/soh/assets/custom/objects/object_festivehats/gEponaRudolphHatDL_vtx_0 @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_festivehats/gEponaRudolphHatDL_vtx_1 b/soh/assets/custom/objects/object_festivehats/gEponaRudolphHatDL_vtx_1 new file mode 100644 index 000000000..d7263bc94 --- /dev/null +++ b/soh/assets/custom/objects/object_festivehats/gEponaRudolphHatDL_vtx_1 @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_festivehats/gHorseAntlersDL b/soh/assets/custom/objects/object_festivehats/gHorseAntlersDL new file mode 100644 index 000000000..2b2ee6c3e --- /dev/null +++ b/soh/assets/custom/objects/object_festivehats/gHorseAntlersDL @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_festivehats/gHorseAntlersDL_tri_0 b/soh/assets/custom/objects/object_festivehats/gHorseAntlersDL_tri_0 new file mode 100644 index 000000000..543e90c1f --- /dev/null +++ b/soh/assets/custom/objects/object_festivehats/gHorseAntlersDL_tri_0 @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_festivehats/gHorseAntlersDL_vtx_0 b/soh/assets/custom/objects/object_festivehats/gHorseAntlersDL_vtx_0 new file mode 100644 index 000000000..d7263bc94 --- /dev/null +++ b/soh/assets/custom/objects/object_festivehats/gHorseAntlersDL_vtx_0 @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_festivehats/gLinkAdultHatTrimDL b/soh/assets/custom/objects/object_festivehats/gLinkAdultHatTrimDL new file mode 100644 index 000000000..27bdd9211 --- /dev/null +++ b/soh/assets/custom/objects/object_festivehats/gLinkAdultHatTrimDL @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_festivehats/gLinkAdultHatTrimDL_tri_0 b/soh/assets/custom/objects/object_festivehats/gLinkAdultHatTrimDL_tri_0 new file mode 100644 index 000000000..313f489de --- /dev/null +++ b/soh/assets/custom/objects/object_festivehats/gLinkAdultHatTrimDL_tri_0 @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_festivehats/gLinkAdultHatTrimDL_vtx_0 b/soh/assets/custom/objects/object_festivehats/gLinkAdultHatTrimDL_vtx_0 new file mode 100644 index 000000000..eb7d042ff --- /dev/null +++ b/soh/assets/custom/objects/object_festivehats/gLinkAdultHatTrimDL_vtx_0 @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_festivehats/gLinkAdultPompomDL b/soh/assets/custom/objects/object_festivehats/gLinkAdultPompomDL new file mode 100644 index 000000000..6f7262451 --- /dev/null +++ b/soh/assets/custom/objects/object_festivehats/gLinkAdultPompomDL @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_festivehats/gLinkAdultPompomDL_tri_0 b/soh/assets/custom/objects/object_festivehats/gLinkAdultPompomDL_tri_0 new file mode 100644 index 000000000..83cf6d929 --- /dev/null +++ b/soh/assets/custom/objects/object_festivehats/gLinkAdultPompomDL_tri_0 @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_festivehats/gLinkAdultPompomDL_vtx_0 b/soh/assets/custom/objects/object_festivehats/gLinkAdultPompomDL_vtx_0 new file mode 100644 index 000000000..b937dad3e --- /dev/null +++ b/soh/assets/custom/objects/object_festivehats/gLinkAdultPompomDL_vtx_0 @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_festivehats/gLinkChildHatTrimDL b/soh/assets/custom/objects/object_festivehats/gLinkChildHatTrimDL new file mode 100644 index 000000000..769a41928 --- /dev/null +++ b/soh/assets/custom/objects/object_festivehats/gLinkChildHatTrimDL @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_festivehats/gLinkChildHatTrimDL_tri_0 b/soh/assets/custom/objects/object_festivehats/gLinkChildHatTrimDL_tri_0 new file mode 100644 index 000000000..776fb4da9 --- /dev/null +++ b/soh/assets/custom/objects/object_festivehats/gLinkChildHatTrimDL_tri_0 @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_festivehats/gLinkChildHatTrimDL_vtx_0 b/soh/assets/custom/objects/object_festivehats/gLinkChildHatTrimDL_vtx_0 new file mode 100644 index 000000000..847f1ae81 --- /dev/null +++ b/soh/assets/custom/objects/object_festivehats/gLinkChildHatTrimDL_vtx_0 @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_festivehats/gLinkChildPompomDL b/soh/assets/custom/objects/object_festivehats/gLinkChildPompomDL new file mode 100644 index 000000000..4093e1aa3 --- /dev/null +++ b/soh/assets/custom/objects/object_festivehats/gLinkChildPompomDL @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_festivehats/gLinkChildPompomDL_tri_0 b/soh/assets/custom/objects/object_festivehats/gLinkChildPompomDL_tri_0 new file mode 100644 index 000000000..4f18af8bf --- /dev/null +++ b/soh/assets/custom/objects/object_festivehats/gLinkChildPompomDL_tri_0 @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_festivehats/gLinkChildPompomDL_vtx_0 b/soh/assets/custom/objects/object_festivehats/gLinkChildPompomDL_vtx_0 new file mode 100644 index 000000000..b0c371f13 --- /dev/null +++ b/soh/assets/custom/objects/object_festivehats/gLinkChildPompomDL_vtx_0 @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_festivehats/gPaperCrownGenericDL b/soh/assets/custom/objects/object_festivehats/gPaperCrownGenericDL new file mode 100644 index 000000000..ec6ccada7 --- /dev/null +++ b/soh/assets/custom/objects/object_festivehats/gPaperCrownGenericDL @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_festivehats/gPaperCrownGenericDL_tri_0 b/soh/assets/custom/objects/object_festivehats/gPaperCrownGenericDL_tri_0 new file mode 100644 index 000000000..672602bc1 --- /dev/null +++ b/soh/assets/custom/objects/object_festivehats/gPaperCrownGenericDL_tri_0 @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_festivehats/gPaperCrownGenericDL_vtx_0 b/soh/assets/custom/objects/object_festivehats/gPaperCrownGenericDL_vtx_0 new file mode 100644 index 000000000..c7a513a67 --- /dev/null +++ b/soh/assets/custom/objects/object_festivehats/gPaperCrownGenericDL_vtx_0 @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_festivehats/gSantaHatGenericDL b/soh/assets/custom/objects/object_festivehats/gSantaHatGenericDL new file mode 100644 index 000000000..0f4573976 --- /dev/null +++ b/soh/assets/custom/objects/object_festivehats/gSantaHatGenericDL @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_festivehats/gSantaHatGenericDL_tri_0 b/soh/assets/custom/objects/object_festivehats/gSantaHatGenericDL_tri_0 new file mode 100644 index 000000000..5396ff4d8 --- /dev/null +++ b/soh/assets/custom/objects/object_festivehats/gSantaHatGenericDL_tri_0 @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_festivehats/gSantaHatGenericDL_tri_1 b/soh/assets/custom/objects/object_festivehats/gSantaHatGenericDL_tri_1 new file mode 100644 index 000000000..bdf895c49 --- /dev/null +++ b/soh/assets/custom/objects/object_festivehats/gSantaHatGenericDL_tri_1 @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_festivehats/gSantaHatGenericDL_vtx_0 b/soh/assets/custom/objects/object_festivehats/gSantaHatGenericDL_vtx_0 new file mode 100644 index 000000000..145ca70f4 --- /dev/null +++ b/soh/assets/custom/objects/object_festivehats/gSantaHatGenericDL_vtx_0 @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_festivehats/gSantaHatGenericDL_vtx_1 b/soh/assets/custom/objects/object_festivehats/gSantaHatGenericDL_vtx_1 new file mode 100644 index 000000000..7f90daac7 --- /dev/null +++ b/soh/assets/custom/objects/object_festivehats/gSantaHatGenericDL_vtx_1 @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_festivehats/hilite_nose b/soh/assets/custom/objects/object_festivehats/hilite_nose new file mode 100644 index 0000000000000000000000000000000000000000..b2d4623c9c75b53b1e47287bb401e9a548bf9b42 GIT binary patch literal 2140 zcma)+A(P`c5QVdc_Ai8OV4$JVqQh4;bzo}(4Gj%N76cl4m;(g`1-;NP(8FvfC@7fC zS8r8HX2`nBW!cv2e*L=DyWMX0zF{dKqV z&O6t-cCg*0J(+C`Q@nPIzjkw_Kivx7YXA_hw(LyNu!5g*w!8 z)i>>_yUbNIebYCCb?xFqy?F1;*6jIbHsZIZf@ftmSVXfXSoF=B21~|x1${o?%^tH2 zmOPq0Tx8AOyHKYo)b?n$!FqS?qQN7~UF+Qxv(42My&D5ePyjv2j(FL_;?u->@t_M* zno|cVwD@S!bh}?^VkbJV>Knd>IvVc^ey%cl@l~Qw6aHn@v5i z_=44n3X8$*hMy@?!Hg$9MmF@u6ve%GiROGjH*zO?bk6v!0Z$Zz*~biSH*}2#_Gy|c z>NW-x77ESO+4hLFkgAP}4nPPyasm4gDjeI%*7| zF4?mRwb|%j)svp1`qE5U4^}7Wd>HItKV}f>?viW3e{wIXtJAs*J>OmU?;UEDYfYR$ zI_KJD{B!)i$#~`VSc5cq_xcW=4y8_*Do1QoH=E`}cTonMQ6|8e=4uR_aZ~}%bm8R7 zi_kebrX;1!$N!9YCts!0Y) z-e8dV=lE;N@r9QMPCS3agUIrL2E=|uXMD~82Et`L8a(2~{+YkLfD{T13ZCro@W>wy znU}naF|qmnj8`3`9vxMt7+$iU96O_xhrFwkayRA)C>90(82gbwKGXpjp|~ZscF2>s eKjIZHcfjY|#V)J%j4!CdK6epM`Bs(%snu`&vxx5i literal 0 HcmV?d00001 diff --git a/soh/assets/custom/objects/object_festivehats/mat_gCuccoLadyHatDL_f3dlite_hatcolour b/soh/assets/custom/objects/object_festivehats/mat_gCuccoLadyHatDL_f3dlite_hatcolour new file mode 100644 index 000000000..d1d036f89 --- /dev/null +++ b/soh/assets/custom/objects/object_festivehats/mat_gCuccoLadyHatDL_f3dlite_hatcolour @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_festivehats/mat_gEponaRudolphHatDL_f3dlite_antlers b/soh/assets/custom/objects/object_festivehats/mat_gEponaRudolphHatDL_f3dlite_antlers new file mode 100644 index 000000000..3717c72b2 --- /dev/null +++ b/soh/assets/custom/objects/object_festivehats/mat_gEponaRudolphHatDL_f3dlite_antlers @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_triforce_piece_1/mat_gTriforcePiece1DL_f3dlite_shard_edge b/soh/assets/custom/objects/object_festivehats/mat_gEponaRudolphHatDL_f3dlite_rednose similarity index 75% rename from soh/assets/custom/objects/object_triforce_piece_1/mat_gTriforcePiece1DL_f3dlite_shard_edge rename to soh/assets/custom/objects/object_festivehats/mat_gEponaRudolphHatDL_f3dlite_rednose index b9e61293d..758d8698b 100644 --- a/soh/assets/custom/objects/object_triforce_piece_1/mat_gTriforcePiece1DL_f3dlite_shard_edge +++ b/soh/assets/custom/objects/object_festivehats/mat_gEponaRudolphHatDL_f3dlite_rednose @@ -1,21 +1,21 @@ - - - + + + - + - + - + diff --git a/soh/assets/custom/objects/object_festivehats/mat_gHorseAntlersDL_f3dlite_antlers b/soh/assets/custom/objects/object_festivehats/mat_gHorseAntlersDL_f3dlite_antlers new file mode 100644 index 000000000..3717c72b2 --- /dev/null +++ b/soh/assets/custom/objects/object_festivehats/mat_gHorseAntlersDL_f3dlite_antlers @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_festivehats/mat_gLinkAdultHatTrimDL_f3dlite_santahat_white b/soh/assets/custom/objects/object_festivehats/mat_gLinkAdultHatTrimDL_f3dlite_santahat_white new file mode 100644 index 000000000..2f72783f7 --- /dev/null +++ b/soh/assets/custom/objects/object_festivehats/mat_gLinkAdultHatTrimDL_f3dlite_santahat_white @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_festivehats/mat_gLinkAdultPompomDL_f3dlite_santahat_white b/soh/assets/custom/objects/object_festivehats/mat_gLinkAdultPompomDL_f3dlite_santahat_white new file mode 100644 index 000000000..2f72783f7 --- /dev/null +++ b/soh/assets/custom/objects/object_festivehats/mat_gLinkAdultPompomDL_f3dlite_santahat_white @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_festivehats/mat_gLinkChildHatTrimDL_f3dlite_santahat_white b/soh/assets/custom/objects/object_festivehats/mat_gLinkChildHatTrimDL_f3dlite_santahat_white new file mode 100644 index 000000000..2f72783f7 --- /dev/null +++ b/soh/assets/custom/objects/object_festivehats/mat_gLinkChildHatTrimDL_f3dlite_santahat_white @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_festivehats/mat_gLinkChildPompomDL_f3dlite_santahat_white b/soh/assets/custom/objects/object_festivehats/mat_gLinkChildPompomDL_f3dlite_santahat_white new file mode 100644 index 000000000..2f72783f7 --- /dev/null +++ b/soh/assets/custom/objects/object_festivehats/mat_gLinkChildPompomDL_f3dlite_santahat_white @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_festivehats/mat_gPaperCrownGenericDL_f3dlite_crown b/soh/assets/custom/objects/object_festivehats/mat_gPaperCrownGenericDL_f3dlite_crown new file mode 100644 index 000000000..4fb4e2029 --- /dev/null +++ b/soh/assets/custom/objects/object_festivehats/mat_gPaperCrownGenericDL_f3dlite_crown @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_festivehats/mat_gSantaHatGenericDL_f3dlite_santahatred b/soh/assets/custom/objects/object_festivehats/mat_gSantaHatGenericDL_f3dlite_santahatred new file mode 100644 index 000000000..b42644ae8 --- /dev/null +++ b/soh/assets/custom/objects/object_festivehats/mat_gSantaHatGenericDL_f3dlite_santahatred @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_festivehats/mat_gSantaHatGenericDL_f3dlite_santahatwhite b/soh/assets/custom/objects/object_festivehats/mat_gSantaHatGenericDL_f3dlite_santahatwhite new file mode 100644 index 000000000..2f72783f7 --- /dev/null +++ b/soh/assets/custom/objects/object_festivehats/mat_gSantaHatGenericDL_f3dlite_santahatwhite @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kakariko_decor/CuccoBedding_32 b/soh/assets/custom/objects/object_kakariko_decor/CuccoBedding_32 new file mode 100644 index 0000000000000000000000000000000000000000..68187fbf5f4ebad4d955b9855ee047253e07957e GIT binary patch literal 2140 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 OKUUq8@~*UhQuqRir{)a+ literal 0 HcmV?d00001 diff --git a/soh/assets/custom/objects/object_kakariko_decor/String_BYBY_32 b/soh/assets/custom/objects/object_kakariko_decor/String_BYBY_32 new file mode 100644 index 0000000000000000000000000000000000000000..62efcb10a3693916401a5af6c089a01f95faf024 GIT binary patch literal 2140 zcmbtUO=uHQ5T3V-?WR3R5gVjn2%#)hG#iS&@wc()R#x3IKJh(Xh7~$BkoG)9cf+^Wg?c-Rc$T+FSNY za(*NK9(nY|z^YkxbeF{5i1punGN_q`5DPxEm-}a+R|)^%$^YCz-Q=b=zq3sC#X^ey z@Qn-)=5JM_j75(=q`;(_i+><{0F~!g; z&mh8;xEDYIK9@sR_qYk-=ua)D<-`<3_yK;9n*tJFFSA=P`ByGNFb)wx6;z0T1km&l z)2om7=Qgl293LGjD+JddjAI-oT2}l3Ky=qw6u%C=Oa%_^FcvM{xpe}r;JAu-jNTF| zQ#tF;ilZgi8TQd%9Xv=FHv~7@Xv8YzwQ8`kXB`-e=s_9rxg1z7+|i12(MlCMZ7+?|Ir60{KwZ9X)SuyCbakf-86fI+>PoV)KGfS*T5_K=0#wzFdpY`XQ zvBz9|*u*Mt3YFP+YMnZ+w_#jR6ZQL(ZjZRORH^KBjUPiK8=fl1Dt*-@Ucw#=Vx5m6 z{zR}&l=AAyvC~FE9P6@>H+y;^OQ_Nb=Fzb(^Yj?gSldag5|2%fTPo{?M4?B}DRU}Y K+oxXiargsgG<&B2 literal 0 HcmV?d00001 diff --git a/soh/assets/custom/objects/object_kakariko_decor/String_GRGR_32 b/soh/assets/custom/objects/object_kakariko_decor/String_GRGR_32 new file mode 100644 index 0000000000000000000000000000000000000000..b905f21a9a682561bf5a4998f178fdc0e8a7e852 GIT binary patch literal 2140 zcmbtUO-NKx6h8O;T>ofVNYE^bL=4;*Zi;D9@A5DgmW4@4f&@btxRhw&#s@`&N(v1s zXa*vLl$lQ3i|PIJzGEr%*R;dUX_S;%D$?;c z?O}iSWcVZUD2suaG;Lpu=LzKx>u8>-QbObiUDTJJG7mA@o zDD&tZoieHcWFzQPiTm-+Nt}#KjKZCz7&4=T5+$OtoR>@ie6e6(`w8#+Zqbto|ZdL5%{6N67@i z6X={Q5eM&Nz`Bawup||hfdTP*L&57~-QN%AA0=Uv!lK)>=qnZ*CQ>Ga1+nc}&^M7i5Tm+T5XH0m0g2z~? V!kCjR944?&PVzd=&XL1uleEA0!9jG511bAv~tj5Lpn9=`=GCLu8dbVKN{-kjDw4VE_Q? CR36;` literal 0 HcmV?d00001 diff --git a/soh/assets/custom/objects/object_kakariko_decor/YukiUsagi_16 b/soh/assets/custom/objects/object_kakariko_decor/YukiUsagi_16 new file mode 100644 index 0000000000000000000000000000000000000000..2034627ff95af74e080c6e61a6fb128d95cd7f91 GIT binary patch literal 604 zcma)(F%rTc5JkZg$ce11Z7jS=N-T33YddLEa{x*yDJj?eyJ04A3x(ML`~LsQ5a*n` zov#M-hxZdHs)kPo&N&b*e)hd!Pi5+O8)ZJsiF_0e&Ub- literal 0 HcmV?d00001 diff --git a/soh/assets/custom/objects/object_kakariko_decor/gKakarikoAdultDecorDL b/soh/assets/custom/objects/object_kakariko_decor/gKakarikoAdultDecorDL new file mode 100644 index 000000000..13d9447f7 --- /dev/null +++ b/soh/assets/custom/objects/object_kakariko_decor/gKakarikoAdultDecorDL @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kakariko_decor/gKakarikoAdultDecorDL_tri_0 b/soh/assets/custom/objects/object_kakariko_decor/gKakarikoAdultDecorDL_tri_0 new file mode 100644 index 000000000..1263127aa --- /dev/null +++ b/soh/assets/custom/objects/object_kakariko_decor/gKakarikoAdultDecorDL_tri_0 @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/custom/objects/object_kakariko_decor/gKakarikoAdultDecorDL_tri_1 b/soh/assets/custom/objects/object_kakariko_decor/gKakarikoAdultDecorDL_tri_1 new file mode 100644 index 000000000..2aff9496e --- /dev/null +++ b/soh/assets/custom/objects/object_kakariko_decor/gKakarikoAdultDecorDL_tri_1 @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kakariko_decor/gKakarikoAdultDecorDL_vtx_0 b/soh/assets/custom/objects/object_kakariko_decor/gKakarikoAdultDecorDL_vtx_0 new file mode 100644 index 000000000..9f3683fed --- /dev/null +++ b/soh/assets/custom/objects/object_kakariko_decor/gKakarikoAdultDecorDL_vtx_0 @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kakariko_decor/gKakarikoAdultDecorDL_vtx_1 b/soh/assets/custom/objects/object_kakariko_decor/gKakarikoAdultDecorDL_vtx_1 new file mode 100644 index 000000000..e438e71cf --- /dev/null +++ b/soh/assets/custom/objects/object_kakariko_decor/gKakarikoAdultDecorDL_vtx_1 @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kakariko_decor/gKakarikoAdultDecorDL_vtx_cull b/soh/assets/custom/objects/object_kakariko_decor/gKakarikoAdultDecorDL_vtx_cull new file mode 100644 index 000000000..c3ecddb8a --- /dev/null +++ b/soh/assets/custom/objects/object_kakariko_decor/gKakarikoAdultDecorDL_vtx_cull @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kakariko_decor/gKakarikoChildDecorDL b/soh/assets/custom/objects/object_kakariko_decor/gKakarikoChildDecorDL new file mode 100644 index 000000000..a3972ce7a --- /dev/null +++ b/soh/assets/custom/objects/object_kakariko_decor/gKakarikoChildDecorDL @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kakariko_decor/gKakarikoChildDecorDL_tri_0 b/soh/assets/custom/objects/object_kakariko_decor/gKakarikoChildDecorDL_tri_0 new file mode 100644 index 000000000..eb7e92fdf --- /dev/null +++ b/soh/assets/custom/objects/object_kakariko_decor/gKakarikoChildDecorDL_tri_0 @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kakariko_decor/gKakarikoChildDecorDL_tri_1 b/soh/assets/custom/objects/object_kakariko_decor/gKakarikoChildDecorDL_tri_1 new file mode 100644 index 000000000..77468a738 --- /dev/null +++ b/soh/assets/custom/objects/object_kakariko_decor/gKakarikoChildDecorDL_tri_1 @@ -0,0 +1,73 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kakariko_decor/gKakarikoChildDecorDL_tri_2 b/soh/assets/custom/objects/object_kakariko_decor/gKakarikoChildDecorDL_tri_2 new file mode 100644 index 000000000..97634bb7b --- /dev/null +++ b/soh/assets/custom/objects/object_kakariko_decor/gKakarikoChildDecorDL_tri_2 @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kakariko_decor/gKakarikoChildDecorDL_vtx_0 b/soh/assets/custom/objects/object_kakariko_decor/gKakarikoChildDecorDL_vtx_0 new file mode 100644 index 000000000..24e3e3d6e --- /dev/null +++ b/soh/assets/custom/objects/object_kakariko_decor/gKakarikoChildDecorDL_vtx_0 @@ -0,0 +1,106 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kakariko_decor/gKakarikoChildDecorDL_vtx_1 b/soh/assets/custom/objects/object_kakariko_decor/gKakarikoChildDecorDL_vtx_1 new file mode 100644 index 000000000..0b12310ec --- /dev/null +++ b/soh/assets/custom/objects/object_kakariko_decor/gKakarikoChildDecorDL_vtx_1 @@ -0,0 +1,111 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kakariko_decor/gKakarikoChildDecorDL_vtx_2 b/soh/assets/custom/objects/object_kakariko_decor/gKakarikoChildDecorDL_vtx_2 new file mode 100644 index 000000000..f2a81069d --- /dev/null +++ b/soh/assets/custom/objects/object_kakariko_decor/gKakarikoChildDecorDL_vtx_2 @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kakariko_decor/gKakarikoChildDecorDL_vtx_cull b/soh/assets/custom/objects/object_kakariko_decor/gKakarikoChildDecorDL_vtx_cull new file mode 100644 index 000000000..b2e233783 --- /dev/null +++ b/soh/assets/custom/objects/object_kakariko_decor/gKakarikoChildDecorDL_vtx_cull @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL b/soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL new file mode 100644 index 000000000..f0363d242 --- /dev/null +++ b/soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL_tri_0 b/soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL_tri_0 new file mode 100644 index 000000000..5ee2633e5 --- /dev/null +++ b/soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL_tri_0 @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL_tri_1 b/soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL_tri_1 new file mode 100644 index 000000000..2b52e5ef3 --- /dev/null +++ b/soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL_tri_1 @@ -0,0 +1,221 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL_tri_2 b/soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL_tri_2 new file mode 100644 index 000000000..d6f5dbafe --- /dev/null +++ b/soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL_tri_2 @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL_tri_3 b/soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL_tri_3 new file mode 100644 index 000000000..f66ba5914 --- /dev/null +++ b/soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL_tri_3 @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL_tri_4 b/soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL_tri_4 new file mode 100644 index 000000000..e0d376897 --- /dev/null +++ b/soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL_tri_4 @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL_tri_5 b/soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL_tri_5 new file mode 100644 index 000000000..ca52719c9 --- /dev/null +++ b/soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL_tri_5 @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL_tri_6 b/soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL_tri_6 new file mode 100644 index 000000000..75be056f5 --- /dev/null +++ b/soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL_tri_6 @@ -0,0 +1,330 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL_tri_7 b/soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL_tri_7 new file mode 100644 index 000000000..eeedcf1ee --- /dev/null +++ b/soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL_tri_7 @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL_vtx_0 b/soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL_vtx_0 new file mode 100644 index 000000000..c0a07802c --- /dev/null +++ b/soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL_vtx_0 @@ -0,0 +1,106 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL_vtx_1 b/soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL_vtx_1 new file mode 100644 index 000000000..c7615dd3b --- /dev/null +++ b/soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL_vtx_1 @@ -0,0 +1,770 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL_vtx_2 b/soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL_vtx_2 new file mode 100644 index 000000000..3ff9d2e43 --- /dev/null +++ b/soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL_vtx_2 @@ -0,0 +1,82 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL_vtx_3 b/soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL_vtx_3 new file mode 100644 index 000000000..b0e49797a --- /dev/null +++ b/soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL_vtx_3 @@ -0,0 +1,74 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL_vtx_4 b/soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL_vtx_4 new file mode 100644 index 000000000..043452939 --- /dev/null +++ b/soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL_vtx_4 @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL_vtx_5 b/soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL_vtx_5 new file mode 100644 index 000000000..46c6ac9a1 --- /dev/null +++ b/soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL_vtx_5 @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL_vtx_6 b/soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL_vtx_6 new file mode 100644 index 000000000..0e5970505 --- /dev/null +++ b/soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL_vtx_6 @@ -0,0 +1,497 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL_vtx_7 b/soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL_vtx_7 new file mode 100644 index 000000000..1929d460e --- /dev/null +++ b/soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL_vtx_7 @@ -0,0 +1,230 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL_vtx_cull b/soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL_vtx_cull new file mode 100644 index 000000000..a183da293 --- /dev/null +++ b/soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL_vtx_cull @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kakariko_decor/mat_gKakarikoAdultDecorDL_f3dlite_StringGRGR b/soh/assets/custom/objects/object_kakariko_decor/mat_gKakarikoAdultDecorDL_f3dlite_StringGRGR new file mode 100644 index 000000000..b8478fa90 --- /dev/null +++ b/soh/assets/custom/objects/object_kakariko_decor/mat_gKakarikoAdultDecorDL_f3dlite_StringGRGR @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_triforce_piece_0/mat_gTriforcePiece0DL_f3dlite_triforce_edges b/soh/assets/custom/objects/object_kakariko_decor/mat_gKakarikoAdultDecorDL_f3dlite_snowlayer similarity index 52% rename from soh/assets/custom/objects/object_triforce_piece_0/mat_gTriforcePiece0DL_f3dlite_triforce_edges rename to soh/assets/custom/objects/object_kakariko_decor/mat_gKakarikoAdultDecorDL_f3dlite_snowlayer index 9355e7094..5456b3893 100644 --- a/soh/assets/custom/objects/object_triforce_piece_0/mat_gTriforcePiece0DL_f3dlite_triforce_edges +++ b/soh/assets/custom/objects/object_kakariko_decor/mat_gKakarikoAdultDecorDL_f3dlite_snowlayer @@ -1,21 +1,21 @@ - - - + + + - + - - + + - + - + diff --git a/soh/assets/custom/objects/object_kakariko_decor/mat_gKakarikoChildDecorDL_f3dlite_SnowBuildup b/soh/assets/custom/objects/object_kakariko_decor/mat_gKakarikoChildDecorDL_f3dlite_SnowBuildup new file mode 100644 index 000000000..a79cca54f --- /dev/null +++ b/soh/assets/custom/objects/object_kakariko_decor/mat_gKakarikoChildDecorDL_f3dlite_SnowBuildup @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kakariko_decor/mat_gKakarikoChildDecorDL_f3dlite_UsagiLeaf b/soh/assets/custom/objects/object_kakariko_decor/mat_gKakarikoChildDecorDL_f3dlite_UsagiLeaf new file mode 100644 index 000000000..be29498ef --- /dev/null +++ b/soh/assets/custom/objects/object_kakariko_decor/mat_gKakarikoChildDecorDL_f3dlite_UsagiLeaf @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kakariko_decor/mat_gKakarikoChildDecorDL_f3dlite_YukiUsagiBody b/soh/assets/custom/objects/object_kakariko_decor/mat_gKakarikoChildDecorDL_f3dlite_YukiUsagiBody new file mode 100644 index 000000000..3a2d2c889 --- /dev/null +++ b/soh/assets/custom/objects/object_kakariko_decor/mat_gKakarikoChildDecorDL_f3dlite_YukiUsagiBody @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kakariko_decor/mat_gKakarikoDecorDL_f3dlite_CuccoBedding b/soh/assets/custom/objects/object_kakariko_decor/mat_gKakarikoDecorDL_f3dlite_CuccoBedding new file mode 100644 index 000000000..520258210 --- /dev/null +++ b/soh/assets/custom/objects/object_kakariko_decor/mat_gKakarikoDecorDL_f3dlite_CuccoBedding @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kakariko_decor/mat_gKakarikoDecorDL_f3dlite_SnowBuildup b/soh/assets/custom/objects/object_kakariko_decor/mat_gKakarikoDecorDL_f3dlite_SnowBuildup new file mode 100644 index 000000000..a79cca54f --- /dev/null +++ b/soh/assets/custom/objects/object_kakariko_decor/mat_gKakarikoDecorDL_f3dlite_SnowBuildup @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kakariko_decor/mat_gKakarikoDecorDL_f3dlite_StringBYBY b/soh/assets/custom/objects/object_kakariko_decor/mat_gKakarikoDecorDL_f3dlite_StringBYBY new file mode 100644 index 000000000..5c85eb88f --- /dev/null +++ b/soh/assets/custom/objects/object_kakariko_decor/mat_gKakarikoDecorDL_f3dlite_StringBYBY @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kakariko_decor/mat_gKakarikoDecorDL_f3dlite_StringGRGR b/soh/assets/custom/objects/object_kakariko_decor/mat_gKakarikoDecorDL_f3dlite_StringGRGR new file mode 100644 index 000000000..b8478fa90 --- /dev/null +++ b/soh/assets/custom/objects/object_kakariko_decor/mat_gKakarikoDecorDL_f3dlite_StringGRGR @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kakariko_decor/mat_gKakarikoDecorDL_f3dlite_UsagiLeaf b/soh/assets/custom/objects/object_kakariko_decor/mat_gKakarikoDecorDL_f3dlite_UsagiLeaf new file mode 100644 index 000000000..be29498ef --- /dev/null +++ b/soh/assets/custom/objects/object_kakariko_decor/mat_gKakarikoDecorDL_f3dlite_UsagiLeaf @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kakariko_decor/mat_gKakarikoDecorDL_f3dlite_YukiUsagiBody b/soh/assets/custom/objects/object_kakariko_decor/mat_gKakarikoDecorDL_f3dlite_YukiUsagiBody new file mode 100644 index 000000000..3a2d2c889 --- /dev/null +++ b/soh/assets/custom/objects/object_kakariko_decor/mat_gKakarikoDecorDL_f3dlite_YukiUsagiBody @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kakariko_decor/mat_gKakarikoDecorDL_f3dlite_snowdissolve b/soh/assets/custom/objects/object_kakariko_decor/mat_gKakarikoDecorDL_f3dlite_snowdissolve new file mode 100644 index 000000000..e86142f29 --- /dev/null +++ b/soh/assets/custom/objects/object_kakariko_decor/mat_gKakarikoDecorDL_f3dlite_snowdissolve @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kakariko_decor/mat_gKakarikoDecorDL_f3dlite_snowlayer b/soh/assets/custom/objects/object_kakariko_decor/mat_gKakarikoDecorDL_f3dlite_snowlayer new file mode 100644 index 000000000..5456b3893 --- /dev/null +++ b/soh/assets/custom/objects/object_kakariko_decor/mat_gKakarikoDecorDL_f3dlite_snowlayer @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_temple_of_time_decor/SnowBlanket_32 b/soh/assets/custom/objects/object_temple_of_time_decor/SnowBlanket_32 new file mode 100644 index 0000000000000000000000000000000000000000..733b30757353fc612ee61c04b4b3ce8b5be4bea5 GIT binary patch literal 2140 zcmbVLJ66On3^Y_6gPTxM(@=1ma3QWhZUSY>lqr`Pk0+9|G0VexS^1+Gjbv{rrMx}A zzTCmDpC4cRF#YqmN91Gs1bTle1>Zv{mu_s`%8Tu?!Zz61IN!~YL=yksLHsEDh%@4i z&Kz+%!gHTdtlZVFdvNC3H%}((Wq}35Sr5b&Cz%`g`5Q)#yq{C`cy-!)%pdrSin(L^ zdR;g3FUTMI0;yTX8>POncG>v$5jn#^#SG@6H<$b|tJlJxsS6F`-t9Hd*9G==qr=#3aDANYkmhV|#He&y}9JC*|O(dr$* z^W6AjmlVSaX{xazCacwInaHqRzE=ccwn7aizjbd)7*pybff{+S`lF zP;(0tXwH~DW5n3U{I(+Abt~?6{v4q$928IyzR|Eo`@??_daQ^nJrgl}nc&d{&9cek!ADPO65L31lj+IQLkd0n^8zBBwh zX2e$1Ou6bx)l&5rrdQ{S!s?{trV4x%)RmD}(gl0!Rvx$&@wc()R#x3IKJh(Xh7~$BkoG)9cf+^Wg?c-Rc$T+FSNY za(*NK9(nY|z^YkxbeF{5i1punGN_q`5DPxEm-}a+R|)^%$^YCz-Q=b=zq3sC#X^ey z@Qn-)=5JM_j75(=q`;(_i+><{0F~!g; z&mh8;xEDYIK9@sR_qYk-=ua)D<-`<3_yK;9n*tJFFSA=P`ByGNFb)wx6;z0T1km&l z)2om7=Qgl293LGjD+JddjAI-oT2}l3Ky=qw6u%C=Oa%_^FcvM{xpe}r;JAu-jNTF| zQ#tF;ilZgi8TQd%9Xv=FHv~7@Xv8YzwQ8`kXB`-e=s_9rxg1z7+|i12(MlCMZ7+?|Ir60{KwZ9X)SuyCbakf-86fI+>PoV)KGfS*T5_K=0#wzFdpY`XQ zvBz9|*u*Mt3YFP+YMnZ+w_#jR6ZQL(ZjZRORH^KBjUPiK8=fl1Dt*-@Ucw#=Vx5m6 z{zR}&l=AAyvC~FE9P6@>H+y;^OQ_Nb=Fzb(^Yj?gSldag5|2%fTPo{?M4?B}DRU}Y K+oxXiargsgG<&B2 literal 0 HcmV?d00001 diff --git a/soh/assets/custom/objects/object_temple_of_time_decor/String_GRGR_32 b/soh/assets/custom/objects/object_temple_of_time_decor/String_GRGR_32 new file mode 100644 index 0000000000000000000000000000000000000000..b905f21a9a682561bf5a4998f178fdc0e8a7e852 GIT binary patch literal 2140 zcmbtUO-NKx6h8O;T>ofVNYE^bL=4;*Zi;D9@A5DgmW4@4f&@btxRhw&#s@`&N(v1s zXa*vLl$lQ3i|PIJzGEr%*R;dUX_S;%D$?;c z?O}iSWcVZUD2suaG;Lpu=LzKx>u8>-QbObiUDTJJG7mA@o zDD&tZoieHcWFzQPiTm-+Nt}#KjKZCz7&4=T5+$OtoR>@ie6e6(`w8#+Zqbto|ZdL5%{6N67@i z6X={Q5eM&Nz`Bawup||hfdTP*L&57~-QN%AA0=Uv!lK)>=qnZ*CQ>Ga1+nc}&^M7i5Tm+T5XH0m0g2z~? V!kCjR944?&PVzd=&XL1u + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_temple_of_time_decor/gTempleOfTimeDecorDL_tri_0 b/soh/assets/custom/objects/object_temple_of_time_decor/gTempleOfTimeDecorDL_tri_0 new file mode 100644 index 000000000..75fc6598b --- /dev/null +++ b/soh/assets/custom/objects/object_temple_of_time_decor/gTempleOfTimeDecorDL_tri_0 @@ -0,0 +1,2222 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_temple_of_time_decor/gTempleOfTimeDecorDL_tri_1 b/soh/assets/custom/objects/object_temple_of_time_decor/gTempleOfTimeDecorDL_tri_1 new file mode 100644 index 000000000..bf36e26c4 --- /dev/null +++ b/soh/assets/custom/objects/object_temple_of_time_decor/gTempleOfTimeDecorDL_tri_1 @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/custom/objects/object_temple_of_time_decor/gTempleOfTimeDecorDL_tri_2 b/soh/assets/custom/objects/object_temple_of_time_decor/gTempleOfTimeDecorDL_tri_2 new file mode 100644 index 000000000..4020ff3d1 --- /dev/null +++ b/soh/assets/custom/objects/object_temple_of_time_decor/gTempleOfTimeDecorDL_tri_2 @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_temple_of_time_decor/gTempleOfTimeDecorDL_tri_3 b/soh/assets/custom/objects/object_temple_of_time_decor/gTempleOfTimeDecorDL_tri_3 new file mode 100644 index 000000000..eb072a5ef --- /dev/null +++ b/soh/assets/custom/objects/object_temple_of_time_decor/gTempleOfTimeDecorDL_tri_3 @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_temple_of_time_decor/gTempleOfTimeDecorDL_tri_4 b/soh/assets/custom/objects/object_temple_of_time_decor/gTempleOfTimeDecorDL_tri_4 new file mode 100644 index 000000000..34fbdd806 --- /dev/null +++ b/soh/assets/custom/objects/object_temple_of_time_decor/gTempleOfTimeDecorDL_tri_4 @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_temple_of_time_decor/gTempleOfTimeDecorDL_tri_5 b/soh/assets/custom/objects/object_temple_of_time_decor/gTempleOfTimeDecorDL_tri_5 new file mode 100644 index 000000000..e360d5739 --- /dev/null +++ b/soh/assets/custom/objects/object_temple_of_time_decor/gTempleOfTimeDecorDL_tri_5 @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_temple_of_time_decor/gTempleOfTimeDecorDL_tri_6 b/soh/assets/custom/objects/object_temple_of_time_decor/gTempleOfTimeDecorDL_tri_6 new file mode 100644 index 000000000..8dcd07878 --- /dev/null +++ b/soh/assets/custom/objects/object_temple_of_time_decor/gTempleOfTimeDecorDL_tri_6 @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_temple_of_time_decor/gTempleOfTimeDecorDL_tri_7 b/soh/assets/custom/objects/object_temple_of_time_decor/gTempleOfTimeDecorDL_tri_7 new file mode 100644 index 000000000..a276056ed --- /dev/null +++ b/soh/assets/custom/objects/object_temple_of_time_decor/gTempleOfTimeDecorDL_tri_7 @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_temple_of_time_decor/gTempleOfTimeDecorDL_tri_8 b/soh/assets/custom/objects/object_temple_of_time_decor/gTempleOfTimeDecorDL_tri_8 new file mode 100644 index 000000000..b7f90b048 --- /dev/null +++ b/soh/assets/custom/objects/object_temple_of_time_decor/gTempleOfTimeDecorDL_tri_8 @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/custom/objects/object_temple_of_time_decor/gTempleOfTimeDecorDL_vtx_0 b/soh/assets/custom/objects/object_temple_of_time_decor/gTempleOfTimeDecorDL_vtx_0 new file mode 100644 index 000000000..772a7955d --- /dev/null +++ b/soh/assets/custom/objects/object_temple_of_time_decor/gTempleOfTimeDecorDL_vtx_0 @@ -0,0 +1,4468 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_temple_of_time_decor/gTempleOfTimeDecorDL_vtx_1 b/soh/assets/custom/objects/object_temple_of_time_decor/gTempleOfTimeDecorDL_vtx_1 new file mode 100644 index 000000000..f62970ec9 --- /dev/null +++ b/soh/assets/custom/objects/object_temple_of_time_decor/gTempleOfTimeDecorDL_vtx_1 @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/custom/objects/object_temple_of_time_decor/gTempleOfTimeDecorDL_vtx_2 b/soh/assets/custom/objects/object_temple_of_time_decor/gTempleOfTimeDecorDL_vtx_2 new file mode 100644 index 000000000..30da04c9f --- /dev/null +++ b/soh/assets/custom/objects/object_temple_of_time_decor/gTempleOfTimeDecorDL_vtx_2 @@ -0,0 +1,74 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_temple_of_time_decor/gTempleOfTimeDecorDL_vtx_3 b/soh/assets/custom/objects/object_temple_of_time_decor/gTempleOfTimeDecorDL_vtx_3 new file mode 100644 index 000000000..834efd769 --- /dev/null +++ b/soh/assets/custom/objects/object_temple_of_time_decor/gTempleOfTimeDecorDL_vtx_3 @@ -0,0 +1,119 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_temple_of_time_decor/gTempleOfTimeDecorDL_vtx_4 b/soh/assets/custom/objects/object_temple_of_time_decor/gTempleOfTimeDecorDL_vtx_4 new file mode 100644 index 000000000..acfe49fc6 --- /dev/null +++ b/soh/assets/custom/objects/object_temple_of_time_decor/gTempleOfTimeDecorDL_vtx_4 @@ -0,0 +1,224 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_temple_of_time_decor/gTempleOfTimeDecorDL_vtx_5 b/soh/assets/custom/objects/object_temple_of_time_decor/gTempleOfTimeDecorDL_vtx_5 new file mode 100644 index 000000000..13fd6d48a --- /dev/null +++ b/soh/assets/custom/objects/object_temple_of_time_decor/gTempleOfTimeDecorDL_vtx_5 @@ -0,0 +1,284 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_temple_of_time_decor/gTempleOfTimeDecorDL_vtx_6 b/soh/assets/custom/objects/object_temple_of_time_decor/gTempleOfTimeDecorDL_vtx_6 new file mode 100644 index 000000000..e8e4e4a52 --- /dev/null +++ b/soh/assets/custom/objects/object_temple_of_time_decor/gTempleOfTimeDecorDL_vtx_6 @@ -0,0 +1,278 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_temple_of_time_decor/gTempleOfTimeDecorDL_vtx_7 b/soh/assets/custom/objects/object_temple_of_time_decor/gTempleOfTimeDecorDL_vtx_7 new file mode 100644 index 000000000..359d48716 --- /dev/null +++ b/soh/assets/custom/objects/object_temple_of_time_decor/gTempleOfTimeDecorDL_vtx_7 @@ -0,0 +1,66 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_temple_of_time_decor/gTempleOfTimeDecorDL_vtx_8 b/soh/assets/custom/objects/object_temple_of_time_decor/gTempleOfTimeDecorDL_vtx_8 new file mode 100644 index 000000000..2cb6bf701 --- /dev/null +++ b/soh/assets/custom/objects/object_temple_of_time_decor/gTempleOfTimeDecorDL_vtx_8 @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_temple_of_time_decor/gTempleOfTimeDecorDL_vtx_cull b/soh/assets/custom/objects/object_temple_of_time_decor/gTempleOfTimeDecorDL_vtx_cull new file mode 100644 index 000000000..6dd5d78cb --- /dev/null +++ b/soh/assets/custom/objects/object_temple_of_time_decor/gTempleOfTimeDecorDL_vtx_cull @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_temple_of_time_decor/ice b/soh/assets/custom/objects/object_temple_of_time_decor/ice new file mode 100644 index 0000000000000000000000000000000000000000..ff27a02466a8507d45f039bfdd37500312c70538 GIT binary patch literal 2140 zcma)-EsyI)6o%8H{)|RJu2HgJwOLSL6&Vz`pwhsxwZLOg*$b)~6d2w>L+c{TTHpp$ zN!k4=jV_9;3#_2f`#$3>?~ZKG&YX|;yyqjU)oS(YPrv;9jlT1z@n0To|M%awlKlSt zS(N_#akbL(-D+i~WH48~`?yaARvMTovO2rE-0ECwFq4_;V^<<;wNHATNP>lqzIu`& z&f?4rlJFLrISt}W_dR#b+?}{j!>aH$2BVv5L>e!$fc_@V?Bv1^w`Q)!TDNH^Uqavt zmnTCtR-<;I3%y^R#};(L^dgxs4U>%bcpvX+=yESl91FIqypJwVgH$s5dOPUB1HN2= zBsRS7APwpn1hDYFdRL%b70rCuO8!lpfhJ2{kU*O#i8UEOYKF>Ntw-qv=2{h%c3|_C zhZwDwsyJ*x_s-~q7533uXoGsJp`&lPQX*jD3T zPtB|o;gAi*;d$!e0qJP-ypFVD8(S;xlcAp5QeKaThqmlbT`hWVn3++U%WLd~Q-0EXJw!bMxdP>tFQod@{82q|DdHrQ_)=mQ~&z-2c6F z54A#06VWwY1o}$*}TCx z6)!nZsN#r4nAJNjr>gv^zem>PowBPbSdxRbT(T@JNx)!LxPsb8OK9ZH_mlW{$}`pP z^8UnBGS}vIep1fFj}?#gQBxt1eoidl5rYLWuwdY@g;&slgxUciF)#h@t&ECNQyMO* zv-2aph!r7_G`fmO-S<9su%dak)E-sikqHZRe11GXHaFQF!LOPXHsaB*Oz(dk)Fa|c z^T{um>{WHjy5gWSPt=0^&Xw$nA7v2@GV$NESazV$i84&R&?~~B9d?$uRSn(?a}kcY zS0sL>)2R(JDfbx%k!nBbv7$;=t+@bMSQK*UMVn?;Jmg39y~Kp1P80*yRVm(r@}^%v z7(){Mg?;80tRYP-UP9H$34X~F=s^T>Z^QfcmL_sUrAVJBV9p~X7QB0#-Y4k5$hR7o LN$u}tb@BWaIxgO3 literal 0 HcmV?d00001 diff --git a/soh/assets/custom/objects/object_temple_of_time_decor/mat_gTempleOfTimeDecorDL_f3dlite_SnowBuildup b/soh/assets/custom/objects/object_temple_of_time_decor/mat_gTempleOfTimeDecorDL_f3dlite_SnowBuildup new file mode 100644 index 000000000..46d52d40d --- /dev/null +++ b/soh/assets/custom/objects/object_temple_of_time_decor/mat_gTempleOfTimeDecorDL_f3dlite_SnowBuildup @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_triforce_piece_2/mat_gTriforcePiece2DL_f3dlite_shard_edge b/soh/assets/custom/objects/object_temple_of_time_decor/mat_gTempleOfTimeDecorDL_f3dlite_StringBYBY similarity index 52% rename from soh/assets/custom/objects/object_triforce_piece_2/mat_gTriforcePiece2DL_f3dlite_shard_edge rename to soh/assets/custom/objects/object_temple_of_time_decor/mat_gTempleOfTimeDecorDL_f3dlite_StringBYBY index c222fe68d..16c505a28 100644 --- a/soh/assets/custom/objects/object_triforce_piece_2/mat_gTriforcePiece2DL_f3dlite_shard_edge +++ b/soh/assets/custom/objects/object_temple_of_time_decor/mat_gTempleOfTimeDecorDL_f3dlite_StringBYBY @@ -1,21 +1,21 @@ - - - + + + - + - - + + - + - + diff --git a/soh/assets/custom/objects/object_temple_of_time_decor/mat_gTempleOfTimeDecorDL_f3dlite_StringGRGR b/soh/assets/custom/objects/object_temple_of_time_decor/mat_gTempleOfTimeDecorDL_f3dlite_StringGRGR new file mode 100644 index 000000000..5663994ee --- /dev/null +++ b/soh/assets/custom/objects/object_temple_of_time_decor/mat_gTempleOfTimeDecorDL_f3dlite_StringGRGR @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_temple_of_time_decor/mat_gTempleOfTimeDecorDL_f3dlite_gift_col_blue_material b/soh/assets/custom/objects/object_temple_of_time_decor/mat_gTempleOfTimeDecorDL_f3dlite_gift_col_blue_material new file mode 100644 index 000000000..c0c1a4ac9 --- /dev/null +++ b/soh/assets/custom/objects/object_temple_of_time_decor/mat_gTempleOfTimeDecorDL_f3dlite_gift_col_blue_material @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_temple_of_time_decor/mat_gTempleOfTimeDecorDL_f3dlite_gift_col_green_material b/soh/assets/custom/objects/object_temple_of_time_decor/mat_gTempleOfTimeDecorDL_f3dlite_gift_col_green_material new file mode 100644 index 000000000..6fcf6e1d8 --- /dev/null +++ b/soh/assets/custom/objects/object_temple_of_time_decor/mat_gTempleOfTimeDecorDL_f3dlite_gift_col_green_material @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_temple_of_time_decor/mat_gTempleOfTimeDecorDL_f3dlite_gift_col_red_material b/soh/assets/custom/objects/object_temple_of_time_decor/mat_gTempleOfTimeDecorDL_f3dlite_gift_col_red_material new file mode 100644 index 000000000..a73985478 --- /dev/null +++ b/soh/assets/custom/objects/object_temple_of_time_decor/mat_gTempleOfTimeDecorDL_f3dlite_gift_col_red_material @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_temple_of_time_decor/mat_gTempleOfTimeDecorDL_f3dlite_gift_col_yellow_material b/soh/assets/custom/objects/object_temple_of_time_decor/mat_gTempleOfTimeDecorDL_f3dlite_gift_col_yellow_material new file mode 100644 index 000000000..9f11354bd --- /dev/null +++ b/soh/assets/custom/objects/object_temple_of_time_decor/mat_gTempleOfTimeDecorDL_f3dlite_gift_col_yellow_material @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_triforce_piece_0/mat_gTriforcePiece0DL_f3dlite_triforce_surface b/soh/assets/custom/objects/object_temple_of_time_decor/mat_gTempleOfTimeDecorDL_f3dlite_ice_material similarity index 65% rename from soh/assets/custom/objects/object_triforce_piece_0/mat_gTriforcePiece0DL_f3dlite_triforce_surface rename to soh/assets/custom/objects/object_temple_of_time_decor/mat_gTempleOfTimeDecorDL_f3dlite_ice_material index e863b31c5..2a71c2cc9 100644 --- a/soh/assets/custom/objects/object_triforce_piece_0/mat_gTriforcePiece0DL_f3dlite_triforce_surface +++ b/soh/assets/custom/objects/object_temple_of_time_decor/mat_gTempleOfTimeDecorDL_f3dlite_ice_material @@ -1,21 +1,21 @@ - - - + + + - + - + - + diff --git a/soh/assets/custom/objects/object_temple_of_time_decor/mat_gTempleOfTimeDecorDL_f3dlite_snowlayer b/soh/assets/custom/objects/object_temple_of_time_decor/mat_gTempleOfTimeDecorDL_f3dlite_snowlayer new file mode 100644 index 000000000..e15d18af1 --- /dev/null +++ b/soh/assets/custom/objects/object_temple_of_time_decor/mat_gTempleOfTimeDecorDL_f3dlite_snowlayer @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_triforce_completed/GlowAlpha_64 b/soh/assets/custom/objects/object_triforce_completed/GlowAlpha_64 new file mode 100644 index 0000000000000000000000000000000000000000..1682d9e6f2f415e5fe43b2d7c3e3894a476f2ee1 GIT binary patch literal 4188 zcmd5;OP16y3=BJ#+z2+T*|6X^T!<@h6t2LxXPNsc{CZ!4-fL>b#=XWhV~>C@JNj2OaWsZGLBcsV zv8U51ZW{xq%?Juy5J0P8hs`}E1YFqPG~KNTRs!t4d6#ct^K?E-f|8(B0HO=9 zd*zPar5wnIG>f1F5-0^#fZ+;0;eq}`Ba0Y1f!81fjPB`Oz6JJ442)qa0Qktg+!y#? zT4-P*TLe`=b+6#*9Uy^y!V_blfV+|b2Qavo`Ud|;3k@JB5tPrM;Njlt>^Mco{w2!zq!M%cT-z2671%K;Tt*kdNpS4m1r6po0QuAO!$NJT6E-YY+Y@-|p?a z5GVo)D0mVGZoI=!ys(ctQ$WLe1zG}Ucm)sSBMnzYz$J77Si^gGE&eVZB@h+R7GUK+ z(x=p~{5yfS@ef!%r*ETw?mzS2@>lUppcimA{taFN2(&qU`}s>e*1y%yZ2dR&lLgf4 zM|c$=2w1*Zz}pW1iSPBhEg;oDNnkGDarwCqt??Ovzkp=$2b>Kc%eUft0)`J*%Rsb? zcWgj#Z~yfRkN|!{P|zDtwx8YrTlFyl5aBt#z*qtikOJ6%NBdI$TH^--wxE!ZXf^P? z{#^uQ4{`@*=eMc(M)%dn*RmG@Q~}z6Ab}cayjAP;9-RAEWUpqxO-M~#K@bV!4odNT z_ZZw~4?_w?pe?ZP-bPD&_I|>P`w0PJ&@L>`+Iv$x|AE%Pt5F2rCO<4dM)NIloz zrdOO}hE5@{d|!iy0!au41DkK7cf3=B6qul?09u-G^6OALzj#WcNMr+Fac;sO@c(Fo nx6!%RVYJQN-VF1uJZzB|xiWw9YDF=babSpEpXv7iYn}20J+4Pf literal 0 HcmV?d00001 diff --git a/soh/assets/custom/objects/object_triforce_completed/gTriforcePieceCompletedDL b/soh/assets/custom/objects/object_triforce_completed/gTriforcePieceCompletedDL index 966bef206..b7c7d8af0 100644 --- a/soh/assets/custom/objects/object_triforce_completed/gTriforcePieceCompletedDL +++ b/soh/assets/custom/objects/object_triforce_completed/gTriforcePieceCompletedDL @@ -1,7 +1,7 @@ - + - + diff --git a/soh/assets/custom/objects/object_triforce_completed/gTriforcePieceCompletedDL_tri_0 b/soh/assets/custom/objects/object_triforce_completed/gTriforcePieceCompletedDL_tri_0 index dea47708c..f9d6420cc 100644 --- a/soh/assets/custom/objects/object_triforce_completed/gTriforcePieceCompletedDL_tri_0 +++ b/soh/assets/custom/objects/object_triforce_completed/gTriforcePieceCompletedDL_tri_0 @@ -1,56 +1,5 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + diff --git a/soh/assets/custom/objects/object_triforce_completed/gTriforcePieceCompletedDL_tri_1 b/soh/assets/custom/objects/object_triforce_completed/gTriforcePieceCompletedDL_tri_1 index 36be4333f..b67adf06e 100644 --- a/soh/assets/custom/objects/object_triforce_completed/gTriforcePieceCompletedDL_tri_1 +++ b/soh/assets/custom/objects/object_triforce_completed/gTriforcePieceCompletedDL_tri_1 @@ -1,7 +1,390 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_triforce_completed/gTriforcePieceCompletedDL_vtx_0 b/soh/assets/custom/objects/object_triforce_completed/gTriforcePieceCompletedDL_vtx_0 index 6ca96db30..ca11ab1b3 100644 --- a/soh/assets/custom/objects/object_triforce_completed/gTriforcePieceCompletedDL_vtx_0 +++ b/soh/assets/custom/objects/object_triforce_completed/gTriforcePieceCompletedDL_vtx_0 @@ -1,54 +1,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + diff --git a/soh/assets/custom/objects/object_triforce_completed/gTriforcePieceCompletedDL_vtx_1 b/soh/assets/custom/objects/object_triforce_completed/gTriforcePieceCompletedDL_vtx_1 index 3a653966d..cc747f74a 100644 --- a/soh/assets/custom/objects/object_triforce_completed/gTriforcePieceCompletedDL_vtx_1 +++ b/soh/assets/custom/objects/object_triforce_completed/gTriforcePieceCompletedDL_vtx_1 @@ -1,8 +1,347 @@ - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_triforce_completed/hilite_melon b/soh/assets/custom/objects/object_triforce_completed/hilite_melon new file mode 100644 index 0000000000000000000000000000000000000000..df1d605b38e65151f7f23aa1a0bbcba40252a1c8 GIT binary patch literal 2140 zcma)+EsWzx5QTG#js}LUp`oGCN|BCaz)H!1lMM|UHZ(b4m|+RCp{`L{*-!Hq} z`{&QyZhnroT#ozG1v}r%rHwn+ubpe-TPt%$Z)#sI*@TyEt_5ecpPxfw8}MK|HzY&S z##LnUY&zd%*<|u6Qe0=Ms5lgdashuW9-TAi`{`nGXGS|(XUgS#Kkhe6-;&q(C3!tv z(AKX*f{)3|rHZO(NK6j%kdR63vnhQOHhsg;l}%_lUDCH~s(rtXwqLJ>ZA@-*+nn#H z5E?EFWq4)2p{`(BtSe?*5cy!l-iHl$2m*c)Ts7~;+X^wjoobT!-HNe7# zVmcmO8?zm-Y`V3)>feP+usm)ZpU z2ZG%MUiXS9qvcHVqZoYSCp`Xmfr59Nf2jy~vQXn;328y7{;~mtCpWM+wjE|;w@>MnIobY;rPzE7Fz{pEjHV-EKV%NDCLxfNb zd4wJZG*9IpG$?B+pwhfoEO^QJN7F7;1*KH^2GyaaQb&xBCM6phufVPdR1(h6qb-iG WoJf;Se#T3`d_vWDf(%%_7svl_`n}`; literal 0 HcmV?d00001 diff --git a/soh/assets/custom/objects/object_triforce_completed/mat_gTriforcePieceCompletedDL_f3dlite_Glow b/soh/assets/custom/objects/object_triforce_completed/mat_gTriforcePieceCompletedDL_f3dlite_Glow new file mode 100644 index 000000000..6bed4d274 --- /dev/null +++ b/soh/assets/custom/objects/object_triforce_completed/mat_gTriforcePieceCompletedDL_f3dlite_Glow @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_triforce_piece_1/mat_gTriforcePiece1DL_f3dlite_triforce_surface b/soh/assets/custom/objects/object_triforce_completed/mat_gTriforcePieceCompletedDL_f3dlite_OrnamentGold similarity index 75% rename from soh/assets/custom/objects/object_triforce_piece_1/mat_gTriforcePiece1DL_f3dlite_triforce_surface rename to soh/assets/custom/objects/object_triforce_completed/mat_gTriforcePieceCompletedDL_f3dlite_OrnamentGold index 5f8dc51f9..65dfd4f56 100644 --- a/soh/assets/custom/objects/object_triforce_piece_1/mat_gTriforcePiece1DL_f3dlite_triforce_surface +++ b/soh/assets/custom/objects/object_triforce_completed/mat_gTriforcePieceCompletedDL_f3dlite_OrnamentGold @@ -1,6 +1,6 @@ - + @@ -8,14 +8,14 @@ - + - + diff --git a/soh/assets/custom/objects/object_triforce_completed/mat_gTriforcePieceCompletedDL_f3dlite_triforce_edges b/soh/assets/custom/objects/object_triforce_completed/mat_gTriforcePieceCompletedDL_f3dlite_triforce_edges deleted file mode 100644 index 52591dfc8..000000000 --- a/soh/assets/custom/objects/object_triforce_completed/mat_gTriforcePieceCompletedDL_f3dlite_triforce_edges +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - diff --git a/soh/assets/custom/objects/object_triforce_completed/mat_gTriforcePieceCompletedDL_f3dlite_triforce_surface b/soh/assets/custom/objects/object_triforce_completed/mat_gTriforcePieceCompletedDL_f3dlite_triforce_surface deleted file mode 100644 index 06193ae61..000000000 --- a/soh/assets/custom/objects/object_triforce_completed/mat_gTriforcePieceCompletedDL_f3dlite_triforce_surface +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - diff --git a/soh/assets/custom/objects/object_triforce_completed/noise_tex b/soh/assets/custom/objects/object_triforce_completed/noise_tex deleted file mode 100644 index a6d6cf945e1bd755148a4d4dcbb52a7547cff5fe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2140 zcma)-p;iK66oglkuRxQ?Q<%&agGb`VjYNupNF+ksxY6os*d%WB6=crmckY4&-2)5j zKXYg1-v6g*n&##4`RV3#|Na=h@;ZI|_uuVl<^Asq(Az`PoL+ZL(=FG>ZM*At{kGk< zoB8^f@B6V|^o#wtA9sD8b<1}4`pMPKy5;JSt6Sz1_+WFbkE_FGzU#q*&dPQML+cGs(0eCWBAFIAB+{qL)^;J{#(*^U779F9Cck7oMvyi7MiAz1X(~0sQ40!#}eYwJr z)w$3!#TWA08q`zmoX`3-iMlqu)Ut1KlNXALA#>#Hnt0flT_;zLs4+)eg_T-0z2Jv# z==wz%=q<_ft_t{={8V=eviFAWeF#3h{wM3p2TJs82JFS)hc4641%p29MHs>^6Wz%( z_P%H)*j`R&0VaIl)cQF&g7^Hu`S~RA&8l$%2Rru~ep=hPLVc9b!Em_yQawC50ZL_7 zkVWyC0UUWR_wL|gup?AW- - + - + - - diff --git a/soh/assets/custom/objects/object_triforce_piece_0/gTriforcePiece0DL_tri_0 b/soh/assets/custom/objects/object_triforce_piece_0/gTriforcePiece0DL_tri_0 index 09e44f1b7..286a54384 100644 --- a/soh/assets/custom/objects/object_triforce_piece_0/gTriforcePiece0DL_tri_0 +++ b/soh/assets/custom/objects/object_triforce_piece_0/gTriforcePiece0DL_tri_0 @@ -1,17 +1,67 @@ - - - + + + - - + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_triforce_piece_0/gTriforcePiece0DL_tri_1 b/soh/assets/custom/objects/object_triforce_piece_0/gTriforcePiece0DL_tri_1 index 48001e3c3..a3c013e4a 100644 --- a/soh/assets/custom/objects/object_triforce_piece_0/gTriforcePiece0DL_tri_1 +++ b/soh/assets/custom/objects/object_triforce_piece_0/gTriforcePiece0DL_tri_1 @@ -1,18 +1,91 @@ - - - - - - - - - - + + + + + + + + + + + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_triforce_piece_0/gTriforcePiece0DL_tri_2 b/soh/assets/custom/objects/object_triforce_piece_0/gTriforcePiece0DL_tri_2 deleted file mode 100644 index e35e34492..000000000 --- a/soh/assets/custom/objects/object_triforce_piece_0/gTriforcePiece0DL_tri_2 +++ /dev/null @@ -1,51 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/soh/assets/custom/objects/object_triforce_piece_0/gTriforcePiece0DL_vtx_0 b/soh/assets/custom/objects/object_triforce_piece_0/gTriforcePiece0DL_vtx_0 index a86fa98bf..4f60b10fe 100644 --- a/soh/assets/custom/objects/object_triforce_piece_0/gTriforcePiece0DL_vtx_0 +++ b/soh/assets/custom/objects/object_triforce_piece_0/gTriforcePiece0DL_vtx_0 @@ -1,18 +1,72 @@ - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_triforce_piece_0/gTriforcePiece0DL_vtx_1 b/soh/assets/custom/objects/object_triforce_piece_0/gTriforcePiece0DL_vtx_1 index 230fbb7f8..80931181f 100644 --- a/soh/assets/custom/objects/object_triforce_piece_0/gTriforcePiece0DL_vtx_1 +++ b/soh/assets/custom/objects/object_triforce_piece_0/gTriforcePiece0DL_vtx_1 @@ -1,22 +1,107 @@ - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_triforce_piece_0/gTriforcePiece0DL_vtx_2 b/soh/assets/custom/objects/object_triforce_piece_0/gTriforcePiece0DL_vtx_2 deleted file mode 100644 index 86d123825..000000000 --- a/soh/assets/custom/objects/object_triforce_piece_0/gTriforcePiece0DL_vtx_2 +++ /dev/null @@ -1,49 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/soh/assets/custom/objects/object_triforce_piece_0/image b/soh/assets/custom/objects/object_triforce_piece_0/image new file mode 100644 index 0000000000000000000000000000000000000000..2a8a62348be3a83a33bc2ab4c4905ddac5a53351 GIT binary patch literal 1116 zcma))ds7-`6vpXHr=O$$_A<4$ndzj}s2Oj)Oi{;V)HdxHbtX}o)Cdx>#w)c^sTePK zM=pZgFAB?o!Y(YkEXytnq8K3}YE2+9;5X& z+&Q=5=t|7r*%UzC7#o6ZQIubjX%`! z{uWD?6Ige76}xW}_pXm{n(FK7>zg=2IS3hrZO#2t;>iO;UG+U}gf#cnmX(&2m6TjB z{IuZP9yN^VdOP|C2fXby{a7L>Z741+y;1b_H&t~FO}DCxep>K^J)%dPhuycIMpNWM z@fX*={ObD6#*Uuh(Xp}N#~rQnaFmn{aeo%l$I-R#cw)&ohkd7CvaV69l``p~s9T2a z9XggCxK4MsI^p!I%=sZSy8`SuZKe&STp^$8c7=}5;i=R<#t*#B<@1-h*T|d^1VNig zw=R>;a3zQIn-p}qJF3d&8T%refki8Nv(;j@=++h|1-;>9>PaT~7n$sla&Stj z)@^8YI+bMN2}gDszj%2#xWM2Hoy`yfe@sZEN`+jhQZ9&|aCqU=Kk38Yptt$Ud^Vds z({g%*qPeBz)m5o4jXN;HOlW*u$mehbkrVnUJCw`kuF{)${N@_=oz9`@RmHkS`D~cq1*Jl~ z3g5*g<7Zwha39^eSz5ytEh*F*y=H!t-|0RLaSNBz`CKNG!G+w8+Tt5OwhxJ!0Ih0v znA>HKlf9o;2#f?l?1=f?yERqil?~jHXDjk``O@Nw9B}W6KD+kuM`f)e;}fI2rtiy& zN^9>u9-U$Ss07`B!yQ+BQczIXC;?pNHDPO09sBlu!Jkv}i;_hZ1UYOwanFNae!Vl| zj2}IxAcJacRVvqLbt=V*-0byk+o5>SkCU(yIXF2>C-x&Gj(`?}MyE5GoLpvYc#qoCyZilr$0=i)P5qFK7XA(OYB7mj7e(JtJFr1AIAXL zM@ErAc<(ToIz2m19z-buM?8RDDzhPYzzzCQIz)L0IuhHD@5T0FG)bT^Xi~4q>?n=^ z2oj7^6z(A?GDHM%977QgXfx|IN`(nUojw#JcBA1i;tEiq0OEz+F2H6no6J_@h7opn z0|7i3i$GwJFI|@>1daxDT=0;_PoF*gBjF%qtyjDtQNh- IyzTe@3v^4aT>t<8 literal 0 HcmV?d00001 diff --git a/soh/assets/custom/objects/object_triforce_piece_0/mat_gTriforcePiece0DL_ball b/soh/assets/custom/objects/object_triforce_piece_0/mat_gTriforcePiece0DL_ball new file mode 100644 index 000000000..214ad3df6 --- /dev/null +++ b/soh/assets/custom/objects/object_triforce_piece_0/mat_gTriforcePiece0DL_ball @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_triforce_piece_0/mat_gTriforcePiece0DL_f3dlite_shard_edge b/soh/assets/custom/objects/object_triforce_piece_0/mat_gTriforcePiece0DL_f3dlite_shard_edge deleted file mode 100644 index f62631793..000000000 --- a/soh/assets/custom/objects/object_triforce_piece_0/mat_gTriforcePiece0DL_f3dlite_shard_edge +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - diff --git a/soh/assets/custom/objects/object_triforce_piece_0/mat_gTriforcePiece0DL_silver b/soh/assets/custom/objects/object_triforce_piece_0/mat_gTriforcePiece0DL_silver new file mode 100644 index 000000000..d56781ad2 --- /dev/null +++ b/soh/assets/custom/objects/object_triforce_piece_0/mat_gTriforcePiece0DL_silver @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_triforce_piece_0/noise_tex b/soh/assets/custom/objects/object_triforce_piece_0/noise_tex deleted file mode 100644 index a6d6cf945e1bd755148a4d4dcbb52a7547cff5fe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2140 zcma)-p;iK66oglkuRxQ?Q<%&agGb`VjYNupNF+ksxY6os*d%WB6=crmckY4&-2)5j zKXYg1-v6g*n&##4`RV3#|Na=h@;ZI|_uuVl<^Asq(Az`PoL+ZL(=FG>ZM*At{kGk< zoB8^f@B6V|^o#wtA9sD8b<1}4`pMPKy5;JSt6Sz1_+WFbkE_FGzU#q*&dPQML+cGs(0eCWBAFIAB+{qL)^;J{#(*^U779F9Cck7oMvyi7MiAz1X(~0sQ40!#}eYwJr z)w$3!#TWA08q`zmoX`3-iMlqu)Ut1KlNXALA#>#Hnt0flT_;zLs4+)eg_T-0z2Jv# z==wz%=q<_ft_t{={8V=eviFAWeF#3h{wM3p2TJs82JFS)hc4641%p29MHs>^6Wz%( z_P%H)*j`R&0VaIl)cQF&g7^Hu`S~RA&8l$%2Rru~ep=hPLVc9b!Em_yQawC50ZL_7 zkVWyC0UUWR_wL|gup?AW- - + - + diff --git a/soh/assets/custom/objects/object_triforce_piece_1/gTriforcePiece1DL_tri_0 b/soh/assets/custom/objects/object_triforce_piece_1/gTriforcePiece1DL_tri_0 index 5f33f7347..c9e63a8d9 100644 --- a/soh/assets/custom/objects/object_triforce_piece_1/gTriforcePiece1DL_tri_0 +++ b/soh/assets/custom/objects/object_triforce_piece_1/gTriforcePiece1DL_tri_0 @@ -1,20 +1,67 @@ - - - - - - + + + + + + + + - - - - - + + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_triforce_piece_1/gTriforcePiece1DL_tri_1 b/soh/assets/custom/objects/object_triforce_piece_1/gTriforcePiece1DL_tri_1 index 43df6492b..67f0ba8eb 100644 --- a/soh/assets/custom/objects/object_triforce_piece_1/gTriforcePiece1DL_tri_1 +++ b/soh/assets/custom/objects/object_triforce_piece_1/gTriforcePiece1DL_tri_1 @@ -1,25 +1,88 @@ - + - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - + + + + + + + + - - - - - - - - + + + + + + + + + + + + + + + - + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_triforce_piece_1/gTriforcePiece1DL_vtx_0 b/soh/assets/custom/objects/object_triforce_piece_1/gTriforcePiece1DL_vtx_0 index e078b8246..366463fd9 100644 --- a/soh/assets/custom/objects/object_triforce_piece_1/gTriforcePiece1DL_vtx_0 +++ b/soh/assets/custom/objects/object_triforce_piece_1/gTriforcePiece1DL_vtx_0 @@ -1,23 +1,72 @@ - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_triforce_piece_1/gTriforcePiece1DL_vtx_1 b/soh/assets/custom/objects/object_triforce_piece_1/gTriforcePiece1DL_vtx_1 index e0460194d..8085ae95a 100644 --- a/soh/assets/custom/objects/object_triforce_piece_1/gTriforcePiece1DL_vtx_1 +++ b/soh/assets/custom/objects/object_triforce_piece_1/gTriforcePiece1DL_vtx_1 @@ -1,34 +1,96 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_triforce_piece_1/image b/soh/assets/custom/objects/object_triforce_piece_1/image new file mode 100644 index 0000000000000000000000000000000000000000..2a8a62348be3a83a33bc2ab4c4905ddac5a53351 GIT binary patch literal 1116 zcma))ds7-`6vpXHr=O$$_A<4$ndzj}s2Oj)Oi{;V)HdxHbtX}o)Cdx>#w)c^sTePK zM=pZgFAB?o!Y(YkEXytnq8K3}YE2+9;5X& z+&Q=5=t|7r*%UzC7#o6ZQIubjX%`! z{uWD?6Ige76}xW}_pXm{n(FK7>zg=2IS3hrZO#2t;>iO;UG+U}gf#cnmX(&2m6TjB z{IuZP9yN^VdOP|C2fXby{a7L>Z741+y;1b_H&t~FO}DCxep>K^J)%dPhuycIMpNWM z@fX*={ObD6#*Uuh(Xp}N#~rQnaFmn{aeo%l$I-R#cw)&ohkd7CvaV69l``p~s9T2a z9XggCxK4MsI^p!I%=sZSy8`SuZKe&STp^$8c7=}5;i=R<#t*#B<@1-h*T|d^1VNig zw=R>;a3zQIn-p}qJF3d&8T%refki8Nv(;j@=++h|1-;>9>PaT~7n$sla&Stj z)@^8YI+bMN2}gDszj%2#xWM2Hoy`yfe@sZEN`+jhQZ9&|aCqU=Kk38Yptt$Ud^Vds z({g%*qPeBz)m5o4jXN;HOlW*u$mehbkrVnUJCw`kuF{)${N@_=oz9`@RmHkS`D~cq1*Jl~ z3g5*g<7Zwha39^eSz5ytEh*F*y=H!t-|0RLaSNBz`CKNG!G+w8+Tt5OwhxJ!0Ih0v znA>HKlf9o;2#f?l?1=f?yERqil?~jHXDjk``O@Nw9B}W6KD+kuM`f)e;}fI2rtiy& zN^9>u9-U$Ss07`B!yQ+BQczIXC;?pNHDPO09sBlu!Jkv}i;_hZ1UYOwanFNae!Vl| zj2}IxAcJacRVvqLbt=V*-0byk+o5>SkCU(yIXF2>C-x&Gj(`?}MyE5GoLpvYc#qoCyZilr$0=i)P5qFK7XA(OYB7mj7e(JtJFr1AIAXL zM@ErAc<(ToIz2m19z-buM?8RDDzhPYzzzCQIz)L0IuhHD@5T0FG)bT^Xi~4q>?n=^ z2oj7^6z(A?GDHM%977QgXfx|IN`(nUojw#JcBA1i;tEiq0OEz+F2H6no6J_@h7opn z0|7i3i$GwJFI|@>1daxDT=0;_PoF*gBjF%qtyjDtQNh- IyzTe@3v^4aT>t<8 literal 0 HcmV?d00001 diff --git a/soh/assets/custom/objects/object_triforce_piece_1/image_copy b/soh/assets/custom/objects/object_triforce_piece_1/image_copy new file mode 100644 index 0000000000000000000000000000000000000000..2a8a62348be3a83a33bc2ab4c4905ddac5a53351 GIT binary patch literal 1116 zcma))ds7-`6vpXHr=O$$_A<4$ndzj}s2Oj)Oi{;V)HdxHbtX}o)Cdx>#w)c^sTePK zM=pZgFAB?o!Y(YkEXytnq8K3}YE2+9;5X& z+&Q=5=t|7r*%UzC7#o6ZQIubjX%`! z{uWD?6Ige76}xW}_pXm{n(FK7>zg=2IS3hrZO#2t;>iO;UG+U}gf#cnmX(&2m6TjB z{IuZP9yN^VdOP|C2fXby{a7L>Z741+y;1b_H&t~FO}DCxep>K^J)%dPhuycIMpNWM z@fX*={ObD6#*Uuh(Xp}N#~rQnaFmn{aeo%l$I-R#cw)&ohkd7CvaV69l``p~s9T2a z9XggCxK4MsI^p!I%=sZSy8`SuZKe&STp^$8c7=}5;i=R<#t*#B<@1-h*T|d^1VNig zw=R>;a3zQIn-p}qJF3d&8T%refki8Nv(;j@=++h|1-;>9>PaT~7n$sla&Stj z)@^8YI+bMN2}gDszj%2#xWM2Hoy`yfe@sZEN`+jhQZ9&|aCqU=Kk38Yptt$Ud^Vds z({g%*qPeBz)m5o4jXN;HOlW*u$mehbkrVnUJCw`kuF{)${N@_=oz9`@RmHkS`D~cq1*Jl~ z3g5*g<7Zwha39^eSz5ytEh*F*y=H!t-|0RLaSNBz`CKNG!G+w8+Tt5OwhxJ!0Ih0v znA>HKlf9o;2#f?l?1=f?yERqil?~jHXDjk``O@Nw9B}W6KD+kuM`f)e;}fI2rtiy& zN^9>u9-U$Ss07`B!yQ+BQczIXC;?pNHDPO09sBlu!Jkv}i;_hZ1UYOwanFNae!Vl| zj2}IxAcJacRVvqLbt=V*-0byk+o5>SkCU(yIXF2>C-x&Gj(`?}MyE5GoLpvYc#qoCyZilr$0=i)P5qFK7XA(OYB7mj7e(JtJFr1AIAXL zM@ErAc<(ToIz2m19z-buM?8RDDzhPYzzzCQIz)L0IuhHD@5T0FG)bT^Xi~4q>?n=^ z2oj7^6z(A?GDHM%977QgXfx|IN`(nUojw#JcBA1i;tEiq0OEz+F2H6no6J_@h7opn z0|7i3i$GwJFI|@>1daxDT=0;_PoF*gBjF%qtyjDtQNh- IyzTe@3v^4aT>t<8 literal 0 HcmV?d00001 diff --git a/soh/assets/custom/objects/object_triforce_piece_1/mat_gTriforcePiece1DL_blue_mat b/soh/assets/custom/objects/object_triforce_piece_1/mat_gTriforcePiece1DL_blue_mat new file mode 100644 index 000000000..6ba4d88f9 --- /dev/null +++ b/soh/assets/custom/objects/object_triforce_piece_1/mat_gTriforcePiece1DL_blue_mat @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_triforce_piece_1/mat_gTriforcePiece1DL_silver_002 b/soh/assets/custom/objects/object_triforce_piece_1/mat_gTriforcePiece1DL_silver_002 new file mode 100644 index 000000000..26f9a0b70 --- /dev/null +++ b/soh/assets/custom/objects/object_triforce_piece_1/mat_gTriforcePiece1DL_silver_002 @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_triforce_piece_1/noise_tex b/soh/assets/custom/objects/object_triforce_piece_1/noise_tex deleted file mode 100644 index a6d6cf945e1bd755148a4d4dcbb52a7547cff5fe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2140 zcma)-p;iK66oglkuRxQ?Q<%&agGb`VjYNupNF+ksxY6os*d%WB6=crmckY4&-2)5j zKXYg1-v6g*n&##4`RV3#|Na=h@;ZI|_uuVl<^Asq(Az`PoL+ZL(=FG>ZM*At{kGk< zoB8^f@B6V|^o#wtA9sD8b<1}4`pMPKy5;JSt6Sz1_+WFbkE_FGzU#q*&dPQML+cGs(0eCWBAFIAB+{qL)^;J{#(*^U779F9Cck7oMvyi7MiAz1X(~0sQ40!#}eYwJr z)w$3!#TWA08q`zmoX`3-iMlqu)Ut1KlNXALA#>#Hnt0flT_;zLs4+)eg_T-0z2Jv# z==wz%=q<_ft_t{={8V=eviFAWeF#3h{wM3p2TJs82JFS)hc4641%p29MHs>^6Wz%( z_P%H)*j`R&0VaIl)cQF&g7^Hu`S~RA&8l$%2Rru~ep=hPLVc9b!Em_yQawC50ZL_7 zkVWyC0UUWR_wL|gup?AW- - + - + - - diff --git a/soh/assets/custom/objects/object_triforce_piece_2/gTriforcePiece2DL_tri_0 b/soh/assets/custom/objects/object_triforce_piece_2/gTriforcePiece2DL_tri_0 index b54e182d5..59d81883f 100644 --- a/soh/assets/custom/objects/object_triforce_piece_2/gTriforcePiece2DL_tri_0 +++ b/soh/assets/custom/objects/object_triforce_piece_2/gTriforcePiece2DL_tri_0 @@ -1,29 +1,67 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - + + + + + + + + + + + + - - - - - - - - - - - - + + + + + diff --git a/soh/assets/custom/objects/object_triforce_piece_2/gTriforcePiece2DL_tri_1 b/soh/assets/custom/objects/object_triforce_piece_2/gTriforcePiece2DL_tri_1 index 00a32bfd8..a15c641d7 100644 --- a/soh/assets/custom/objects/object_triforce_piece_2/gTriforcePiece2DL_tri_1 +++ b/soh/assets/custom/objects/object_triforce_piece_2/gTriforcePiece2DL_tri_1 @@ -1,11 +1,378 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_triforce_piece_2/gTriforcePiece2DL_tri_2 b/soh/assets/custom/objects/object_triforce_piece_2/gTriforcePiece2DL_tri_2 deleted file mode 100644 index 0993c1c1e..000000000 --- a/soh/assets/custom/objects/object_triforce_piece_2/gTriforcePiece2DL_tri_2 +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - - - - - - - - - diff --git a/soh/assets/custom/objects/object_triforce_piece_2/gTriforcePiece2DL_vtx_0 b/soh/assets/custom/objects/object_triforce_piece_2/gTriforcePiece2DL_vtx_0 index bf7dfcac6..90dc38784 100644 --- a/soh/assets/custom/objects/object_triforce_piece_2/gTriforcePiece2DL_vtx_0 +++ b/soh/assets/custom/objects/object_triforce_piece_2/gTriforcePiece2DL_vtx_0 @@ -1,36 +1,72 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_triforce_piece_2/gTriforcePiece2DL_vtx_1 b/soh/assets/custom/objects/object_triforce_piece_2/gTriforcePiece2DL_vtx_1 index e3237ab21..ef4ea40e4 100644 --- a/soh/assets/custom/objects/object_triforce_piece_2/gTriforcePiece2DL_vtx_1 +++ b/soh/assets/custom/objects/object_triforce_piece_2/gTriforcePiece2DL_vtx_1 @@ -1,12 +1,410 @@ - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_triforce_piece_2/gTriforcePiece2DL_vtx_2 b/soh/assets/custom/objects/object_triforce_piece_2/gTriforcePiece2DL_vtx_2 deleted file mode 100644 index ec4e73700..000000000 --- a/soh/assets/custom/objects/object_triforce_piece_2/gTriforcePiece2DL_vtx_2 +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - - - - - - - - diff --git a/soh/assets/custom/objects/object_triforce_piece_2/image b/soh/assets/custom/objects/object_triforce_piece_2/image new file mode 100644 index 0000000000000000000000000000000000000000..2a8a62348be3a83a33bc2ab4c4905ddac5a53351 GIT binary patch literal 1116 zcma))ds7-`6vpXHr=O$$_A<4$ndzj}s2Oj)Oi{;V)HdxHbtX}o)Cdx>#w)c^sTePK zM=pZgFAB?o!Y(YkEXytnq8K3}YE2+9;5X& z+&Q=5=t|7r*%UzC7#o6ZQIubjX%`! z{uWD?6Ige76}xW}_pXm{n(FK7>zg=2IS3hrZO#2t;>iO;UG+U}gf#cnmX(&2m6TjB z{IuZP9yN^VdOP|C2fXby{a7L>Z741+y;1b_H&t~FO}DCxep>K^J)%dPhuycIMpNWM z@fX*={ObD6#*Uuh(Xp}N#~rQnaFmn{aeo%l$I-R#cw)&ohkd7CvaV69l``p~s9T2a z9XggCxK4MsI^p!I%=sZSy8`SuZKe&STp^$8c7=}5;i=R<#t*#B<@1-h*T|d^1VNig zw=R>;a3zQIn-p}qJF3d&8T%refki8Nv(;j@=++h|1-;>9>PaT~7n$sla&Stj z)@^8YI+bMN2}gDszj%2#xWM2Hoy`yfe@sZEN`+jhQZ9&|aCqU=Kk38Yptt$Ud^Vds z({g%*qPeBz)m5o4jXN;HOlW*u$mehbkrVnUJCw`kuF{)${N@_=oz9`@RmHkS`D~cq1*Jl~ z3g5*g<7Zwha39^eSz5ytEh*F*y=H!t-|0RLaSNBz`CKNG!G+w8+Tt5OwhxJ!0Ih0v znA>HKlf9o;2#f?l?1=f?yERqil?~jHXDjk``O@Nw9B}W6KD+kuM`f)e;}fI2rtiy& zN^9>u9-U$Ss07`B!yQ+BQczIXC;?pNHDPO09sBlu!Jkv}i;_hZ1UYOwanFNae!Vl| zj2}IxAcJacRVvqLbt=V*-0byk+o5>SkCU(yIXF2>C-x&Gj(`?}MyE5GoLpvYc#qoCyZilr$0=i)P5qFK7XA(OYB7mj7e(JtJFr1AIAXL zM@ErAc<(ToIz2m19z-buM?8RDDzhPYzzzCQIz)L0IuhHD@5T0FG)bT^Xi~4q>?n=^ z2oj7^6z(A?GDHM%977QgXfx|IN`(nUojw#JcBA1i;tEiq0OEz+F2H6no6J_@h7opn z0|7i3i$GwJFI|@>1daxDT=0;_PoF*gBjF%qtyjDtQNh- IyzTe@3v^4aT>t<8 literal 0 HcmV?d00001 diff --git a/soh/assets/custom/objects/object_triforce_piece_2/image_copy b/soh/assets/custom/objects/object_triforce_piece_2/image_copy new file mode 100644 index 0000000000000000000000000000000000000000..2a8a62348be3a83a33bc2ab4c4905ddac5a53351 GIT binary patch literal 1116 zcma))ds7-`6vpXHr=O$$_A<4$ndzj}s2Oj)Oi{;V)HdxHbtX}o)Cdx>#w)c^sTePK zM=pZgFAB?o!Y(YkEXytnq8K3}YE2+9;5X& z+&Q=5=t|7r*%UzC7#o6ZQIubjX%`! z{uWD?6Ige76}xW}_pXm{n(FK7>zg=2IS3hrZO#2t;>iO;UG+U}gf#cnmX(&2m6TjB z{IuZP9yN^VdOP|C2fXby{a7L>Z741+y;1b_H&t~FO}DCxep>K^J)%dPhuycIMpNWM z@fX*={ObD6#*Uuh(Xp}N#~rQnaFmn{aeo%l$I-R#cw)&ohkd7CvaV69l``p~s9T2a z9XggCxK4MsI^p!I%=sZSy8`SuZKe&STp^$8c7=}5;i=R<#t*#B<@1-h*T|d^1VNig zw=R>;a3zQIn-p}qJF3d&8T%refki8Nv(;j@=++h|1-;>9>PaT~7n$sla&Stj z)@^8YI+bMN2}gDszj%2#xWM2Hoy`yfe@sZEN`+jhQZ9&|aCqU=Kk38Yptt$Ud^Vds z({g%*qPeBz)m5o4jXN;HOlW*u$mehbkrVnUJCw`kuF{)${N@_=oz9`@RmHkS`D~cq1*Jl~ z3g5*g<7Zwha39^eSz5ytEh*F*y=H!t-|0RLaSNBz`CKNG!G+w8+Tt5OwhxJ!0Ih0v znA>HKlf9o;2#f?l?1=f?yERqil?~jHXDjk``O@Nw9B}W6KD+kuM`f)e;}fI2rtiy& zN^9>u9-U$Ss07`B!yQ+BQczIXC;?pNHDPO09sBlu!Jkv}i;_hZ1UYOwanFNae!Vl| zj2}IxAcJacRVvqLbt=V*-0byk+o5>SkCU(yIXF2>C-x&Gj(`?}MyE5GoLpvYc#qoCyZilr$0=i)P5qFK7XA(OYB7mj7e(JtJFr1AIAXL zM@ErAc<(ToIz2m19z-buM?8RDDzhPYzzzCQIz)L0IuhHD@5T0FG)bT^Xi~4q>?n=^ z2oj7^6z(A?GDHM%977QgXfx|IN`(nUojw#JcBA1i;tEiq0OEz+F2H6no6J_@h7opn z0|7i3i$GwJFI|@>1daxDT=0;_PoF*gBjF%qtyjDtQNh- IyzTe@3v^4aT>t<8 literal 0 HcmV?d00001 diff --git a/soh/assets/custom/objects/object_triforce_piece_2/mat_gTriforcePiece2DL_Green_mat b/soh/assets/custom/objects/object_triforce_piece_2/mat_gTriforcePiece2DL_Green_mat new file mode 100644 index 000000000..94418f24f --- /dev/null +++ b/soh/assets/custom/objects/object_triforce_piece_2/mat_gTriforcePiece2DL_Green_mat @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_triforce_piece_2/mat_gTriforcePiece2DL_f3dlite_triforce_surface b/soh/assets/custom/objects/object_triforce_piece_2/mat_gTriforcePiece2DL_f3dlite_triforce_surface deleted file mode 100644 index d903f00bb..000000000 --- a/soh/assets/custom/objects/object_triforce_piece_2/mat_gTriforcePiece2DL_f3dlite_triforce_surface +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - diff --git a/soh/assets/custom/objects/object_triforce_piece_2/mat_gTriforcePiece2DL_silver_001 b/soh/assets/custom/objects/object_triforce_piece_2/mat_gTriforcePiece2DL_silver_001 new file mode 100644 index 000000000..6a9be7bec --- /dev/null +++ b/soh/assets/custom/objects/object_triforce_piece_2/mat_gTriforcePiece2DL_silver_001 @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_triforce_piece_2/noise_tex b/soh/assets/custom/objects/object_triforce_piece_2/noise_tex deleted file mode 100644 index a6d6cf945e1bd755148a4d4dcbb52a7547cff5fe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2140 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 JSEuLw{{SzE$8!Jx literal 0 HcmV?d00001 diff --git a/soh/assets/custom/objects/object_xmas_tree/Bauble1Tex_B_32 b/soh/assets/custom/objects/object_xmas_tree/Bauble1Tex_B_32 new file mode 100644 index 0000000000000000000000000000000000000000..5e28d8e82036997f03c59e2b86ea03e7ed9eed97 GIT binary patch literal 2140 zcmcIjF>BjE6n^cbQNa{R2$LMb1R;cx6%#^-LZFM6Lg-N3p->Szm=cPex<*R}jT$p1 zW44-*xNZm~9s4tyt))|F-I8YO_fD1@ONvM-)uB7xyZ62CyZ4@mh#uX4_}~`S^AE#M z{NnS*&uw@vP2U9c`W_KpCD~m!M@u{Vk%*sOcV2D}^xZFk9_Vqf`?=h+__WiG1fN8r z(=PTXw+2RdHta+qFvf4nJ&R8RBN89IIOy)3o)>$RTRV@#vwy)e|LJ)gK>tBGQ})#E zsYm2vcvL5s9L&CY)P0xrE8YWrNH#4~O%96|$;4}W>h6% zO9d`&;xc~YxYb`zG|Ah^k z>9on93UcVEBX2yd3G+K-VwZW4y$Y1c{K&bE`Wv(W4HkOgkKKb^(|=~*q`Uy0JBK~d zDYAP^;1{6F#LkAzkzH+)R>0o{n+Ct6?=7%e=qASVFy%h6npDl-pBl(D-*$dzz*gqa z7MaTC+K;S$;GF`zg{bopE!_T__cn(o)QA65M(|uT40*O#pdR7S|L92~rBI|;@X!UJgnB7>@n8odYK#p+ z!HYeXUMikSPZow?|A8Q4e|c+9#ebpi?PO!JyDllsu$i4V@B6;@YYoFNo>U$`B(Pt7 zKKh9dypH{&;5pNOH0ad>!+__OKHc=+oO$!EnQK40=|0)+WeoB`<{FFf9?4d3YVGo<(ad>MA3r2}#@~8V&D@uJZSUpVldE`-WNYK;+U5V?QUBzs z?Lqv1l9j@@g_b>M30Q)Q<>6Vf++?MC&j(>>3GDo)hfC3 zsST!)(iEoT1R_ve0iST^JNcEb*WTebtK`%`4ZI<8{yt{46+uh}h<%@c+-t+Y( zgB;wQ_s^Hk(H2C&WxW@Tz@B5|&II}eT3k_S60WNI+KQaGpd%{U$;nfyCQpYwxugms zuq)b{DfjWhgerzJnB1h2%ffDPZxAP8gklYaT`BJAp7{ELL65?Cs2)V76?`vcO28AU zfI(i{En-TloUJfE!>I5lM}RMZ-boX508gldEF@%&9Yt0_p{fyl8PwpmKlcJ=S1{@0 zfdd!@3%&-(GmN)NCc$h+7gfLjaSU6TNNwDI9mR7I#RHBEWAPobpD4D&c*Dq)@jFF? z|39LsIT*n^rlQd!o4bt@>?>f!B1?CZ37bcw*U=POsV;tj46~NQQ9vc3mcUBV-9jrG zdtmVy6fg+C@`B+ENvcoMl<96<<^dXa$fAtOeFhSAkV;c!%1PP*OQGe|(i<=BjE6xQoxkJ+Lv9y|6IG$0Db85(d0ku0XS2)r1&7_wxLz=H!C8px1@9Cn(krWYH9XjdWz3+S9d-o*6FbwlHk=9&Qafd}|oETYB}}>~4KNcRSOM&+Rwc#pda6u_-pE;`CRuXZ`MQ&+YJz z+ZpcFdo){xd9a)h-HtH7erfis-xa3YxqLGfpUy7s>phyS!~KKh|KK_P#r;$W^J3l{ zsl2Ot(v>7BrielcFk|JWr)9tTwd%#*j84eU$Are@;GU5>x?9#G9<9>2YWvpcFV+Vx zMEnSR6S`_=B5gQJX~@MGu_7oB!7;%b=b=Z8OynXvzk9a#ui7JER9m$f!4YFdh`Xiq z3J$fCoj>Ybe^adqlxLmQFu9criD(=@-CxZ!k@O1&NvWCDei4yn)Axws^!zzO3lG~<0sU6=Js zBdEboQ0s!Lc-j;%)U=E@3~BLq$_Sq8#vtDt*QjSU)#46j99OK0*Qe=F>{ZokHL7=l zFNpsbT=jJoBdocK=toQSs@e++GcZn{To)ZM0I~}#Gy06K$-F@GQ?-IM2FB^Ji<6a& yu?rUbJr|+HUCx^M{J1LklXy+a3$%VRhx8(_1V#5=KJ|FX3jf1=yu|lkef|JixQYh= literal 0 HcmV?d00001 diff --git a/soh/assets/custom/objects/object_xmas_tree/Bauble2Tex_B_32 b/soh/assets/custom/objects/object_xmas_tree/Bauble2Tex_B_32 new file mode 100644 index 0000000000000000000000000000000000000000..2596d826432cb465ff133bceae51584e261e8db0 GIT binary patch literal 2140 zcmbu9&x_MQ6vv;Qa@!PW06e&R|K1h+o_(5p z6&0HsKUXnwH>ol7>J9)_Ew=LB;qLe-B+-++{$f8j4og0x_5r~xfE0_`E=!ZsELO{^B&%va0yL_;>$o+C$Lr!yce zY`NfUp26tSTXhCfw;Bw*6}FmSYcH}oc{aZt?YD(0gIX}?E+p?5Kl9?V{_bM@fz4yS z)Auj*sThGxvvF!W8hWcBo;B+0$NmNF3!e6)p_)j0d+$gq(R6Va?CwJ5($uHp_vuKr z)xKq%ujedwp0tc}xdP2-UrnUFWDi(EP^jY0W9}vSHDiH^=g&=e7J6wVwT1dsNw~;f z$2LuP+yAX5(q80Ed1`MUe+@^lWCjjUHcLmUEy-7r6-C^@I*vfG+WK2Hk@gzDFy}4U zk-WHrM7HWBZh(bUO;RNJid@{ZPJxBzF42rJ0Q$)-;O=lhq8TlVJn7bBevFVsu? z!*He7tCr+}t6Ju1=&y0-*JErOKSq~jZ~!*bkMQp)&QHZSZSR$%MYOjxzH5)QN5uIT MI@a@+-m+Nv4?(kzsQ>@~ literal 0 HcmV?d00001 diff --git a/soh/assets/custom/objects/object_xmas_tree/Bauble2Tex_G_32 b/soh/assets/custom/objects/object_xmas_tree/Bauble2Tex_G_32 new file mode 100644 index 0000000000000000000000000000000000000000..e6889fee4b0dc473476bb8331d2285d6af55db6c GIT binary patch literal 2140 zcmbtUL2DC17~R?38HJXfY)GJ8x~a`E;AM|%#x|RS7%vi~g@7)23FIPp>7fp;w6WW) zqR>k{dNao!6^5c-g%XQI>`f0M{R@7xn?T6UEQw~Ao!R%j_q~~XGplKucCUKpHiGfu zL+^*^FrE6R19N5A6Va3Fng;!H@}_zQE3e-McKARQ&&K`y(Jw#m=R^PKXEswFZEXg& zhy-?PQ_jdn{lfNnuNByS;rLxPQy%pTf&J-P=s$Y%{zA^kMq69k=l`SMx*OQXe}emd zq4zu6Nfs?XpI=8@G##0gRAd}A=7jSnI!d&d8XTk9GL&zEhU?G>B9tJL5w%$=5*3|; z1%ptG3|c=ebzsIZn|=j5mK)Vig|ETd12=*h#dP6D%18k`{1&ZxFJnD#4;uYg&#X%d zdJ1mz57(T7L|=c^Jj+!@2Ip3aCW^^N|POT~QkileP1sL);p@g1- zgdX-yMHBZAM$kg1xs4QA0$85G5I17IxPvB2a!r2&OraOP)I`G(=9o*&q>wmwiRajp z5hNu`KvIGIg5!9@Gkk+U&&IVdXHb!f#7Y6>Hb(#2D39eSs8X0z7OOfN<BjE6vyv%vbS`zx9B5u>sC_{2=&l_JD6k%xh2$#p^G7l2N^ubprHm2E_i4_ zLk;dw(Bh)Wx-2p0p#~X}A)+1g75d)Eu84aQQmf;nyLa#R{_jqA5@U=tkKVlnd_I1k z-ciM7?&}$P9&T$4bzd=twG{W#?$+VQYs;`N(#EsxyfXg9E4*U!@y~2e{b=jdGHApy zTBmxCY%8x`-A`MV!K>fCWP9pIdDSu&FKqtd)BI8Ik!@|AUETi=|9)*5^Qn#b&s*6_ zx>5P2Z@vU7HRyxTxn$U+Ju+)s)`bpC3P!l8cff-t79Rvw2mB1R{h{bW4t!If>Lr8? zSr!;;Rv?3iJGl%Sq}ztgnOq9Y!3FVpUni}_PMmlNwC=-PwM%3 zj9~3nZ8rn4$StojaC;|zR=x?d;GxhTmoaHOy_(uTH5dh}gCgp&ue^1Gj@dT9mj8v` K#gMnz%D(~0i3^MX literal 0 HcmV?d00001 diff --git a/soh/assets/custom/objects/object_xmas_tree/Bauble3Tex_B_32 b/soh/assets/custom/objects/object_xmas_tree/Bauble3Tex_B_32 new file mode 100644 index 0000000000000000000000000000000000000000..8f9c96cb13bd12340b6314f69edb775f905f18d5 GIT binary patch literal 2140 zcmbtUziZn-6n^cb%?id?#+c+V#t31|Sye$pDHytRDTEHi-KwdGV2G2LUl}xiT5Jaz_9dk zFM-HV9{3U!-RbG0rb9NQ23BTB$>Ps%_fp$Jv>C)+X3^SB$GA{SM&a~+-Bbb@)q!O0S&?K48&S>bc+Zu@31U#SM9tb% z?eF{DTecj5c?&IpuBz@zJ2$>8cqyX>aYl6@d8!I(u5#E}=nP*r zEc2*b^*U3|rUGmpz2F(Dq2|Z^{iY+wz*x|WC^o>|DXf_{kGqULDy{jdnmh^2fXQKo zXcFRXa=mc*dtj)N9k@@sa;y*CY18@krgeo=?l*UDkwmlTcbVCpM*NGc=k)pz)rx1i z(YjiI<*LQ;&ftZES&h-01mTOnh-@X|W?U6{v+xv~>P+=O+mhoM-wMr(92pm=8`~#~ zV$%nx(a|+%e$y~_^+WU~8IL%Y|3%~o-%MUj*lm`I)<%wVS#Hqqd(Hj+13N6}AC+UBn{+{I0v`w0xn3v>z^E}V*_k1R~TrPL3aq|Yle)Mkp zJKZ==d?~P;8Q&r3(Y0I-_oeXdyk~pn>5F!yclSJfw%nWA`sq!1Q$26%N490Uwzbr* zkfvQ}Eu~vzOTFo}!|hhP;!VGKnQfV_^`_gE4_ABM{pUMJ=@!}2*6p>!|G|_0oul?0 z#Q!VXQ&Q^;N~6nlMJNnQXsk4{dqyp3mo6#0I@h?unWRM=D$lQ1Hz#ALKGB3K2@jmm zq|SAwN|o!Px|#0pq|_N`k0!N@zcuhy2Eml z@L-T3gVj0dFFvpATU}i$Vw|-M7=*zHNlz?>T)5d-{1T(0ll#eR=mHhzD%TjIr>7`x zAb$Y{uF0Shl31+nYAM2nyWK0)b*@UCjXlAN?BCui)Q=@RhyhGghlf|+@$OcSSlouQKpm)&`gmueX7s}YW~%qb%%Dp+|)Uy zV;mdd9Us=jD^=_`OHJm3YSJVS1NEI4!bym_N%bQ9%D&^nH-B8Y{@L!E4aawfA73x; zAs2>zi#VsmsYZA(91yePN0XMY<4K9xh-cZTE$^jcgQ^|ZC1$B^THUz+6oWHBWkir0 zL)@q~>L7x}kv}6{z=ki`?#I3f8(wy=+|1X5u5olOxdOK025K}PVNUNx&FU84qc=%x zC=nO`MeJU21D%v993sDqD%DQ=Oujij7&!h~9ABf1qtWFgXv|~H?w3ZpC%UC68WgE2yDvQYmQG_e>pbH41FjY1u3ZgS621e5N60b_6tF#rGn literal 0 HcmV?d00001 diff --git a/soh/assets/custom/objects/object_xmas_tree/Bauble3Tex_R_32 b/soh/assets/custom/objects/object_xmas_tree/Bauble3Tex_R_32 new file mode 100644 index 0000000000000000000000000000000000000000..40394698fcdffd8b3eb32a625ad5f8e425de3deb GIT binary patch literal 2140 zcmbtUF>BjU5Z3DyZ_Q?J@lVLsttO&i?4gEsFwRn{CE&%7rI5vg1RiAYkbs65yc9Il zprxS2#gp~2*gP)<8|uNPor<@NZNGcZils(UT&hFT)4lt?JKcSfrfFLJ)!Ww$_wASA zH#)IA_;`lMlijI6?U$N{^GH3VUCop0k7m(+pSGXvH}bbXjJ%Pzjoa_pk;%KwhFPQ? zv)F7TM`U}A!qsZnG>b;z^QY{{>! z*$`D9-BNE&6?A|YOC()6)-H@&i|Yt%w_H5umIrhhRkwkpD=M}eRLy~MWG8&dBC6|t zoB`9(U36(6^Qm0axt~L>tK8&MMvNl2UhO*}Dn5|J9knrhcR6lFeYB=d($2cC7@!s1 zVH;z49*-TP;z5j&I^e-e)9ryl^?{!`nAQAd*@r?N;$1{^(1Y-ed>~zT-br26uyPp> zs0$pCb#%^ocz1f69FF+Ubv9=PzgceN2-%m$LT4(<++veUAgqy%Ch z7ZJ8+)uqDz=IG&TMwj9#6Q0D(v&xuy8JZ%cgglt{ z0chw^6J0+D{{!?dx_|~sc{CZ!4-fL>b#=XWhV~>C@JNj2OaWsZGLBcsV zv8U51ZW{xq%?Juy5J0P8hs`}E1YFqPG~KNTRs!t4d6#ct^K?E-f|8(B0HO=9 zd*zPar5wnIG>f1F5-0^#fZ+;0;eq}`Ba0Y1f!81fjPB`Oz6JJ442)qa0Qktg+!y#? zT4-P*TLe`=b+6#*9Uy^y!V_blfV+|b2Qavo`Ud|;3k@JB5tPrM;Njlt>^Mco{w2!zq!M%cT-z2671%K;Tt*kdNpS4m1r6po0QuAO!$NJT6E-YY+Y@-|p?a z5GVo)D0mVGZoI=!ys(ctQ$WLe1zG}Ucm)sSBMnzYz$J77Si^gGE&eVZB@h+R7GUK+ z(x=p~{5yfS@ef!%r*ETw?mzS2@>lUppcimA{taFN2(&qU`}s>e*1y%yZ2dR&lLgf4 zM|c$=2w1*Zz}pW1iSPBhEg;oDNnkGDarwCqt??Ovzkp=$2b>Kc%eUft0)`J*%Rsb? zcWgj#Z~yfRkN|!{P|zDtwx8YrTlFyl5aBt#z*qtikOJ6%NBdI$TH^--wxE!ZXf^P? z{#^uQ4{`@*=eMc(M)%dn*RmG@Q~}z6Ab}cayjAP;9-RAEWUpqxO-M~#K@bV!4odNT z_ZZw~4?_w?pe?ZP-bPD&_I|>P`w0PJ&@L>`+Iv$x|AE%Pt5F2rCO<4dM)NIloz zrdOO}hE5@{d|!iy0!au41DkK7cf3=B6qul?09u-G^6OALzj#WcNMr+Fac;sO@c(Fo nx6!%RVYJQN-VF1uJZzB|xiWw9YDF=babSpEpXv7iYn}20J+4Pf literal 0 HcmV?d00001 diff --git a/soh/assets/custom/objects/object_xmas_tree/LeavesAlpha_64 b/soh/assets/custom/objects/object_xmas_tree/LeavesAlpha_64 new file mode 100644 index 0000000000000000000000000000000000000000..e33491d5af58d9b450ea8450096b392f2cdcba37 GIT binary patch literal 8284 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 GLO%coLU&#O literal 0 HcmV?d00001 diff --git a/soh/assets/custom/objects/object_xmas_tree/Wrapping_B_64 b/soh/assets/custom/objects/object_xmas_tree/Wrapping_B_64 new file mode 100644 index 0000000000000000000000000000000000000000..071e01a2d14759edd9b2290fc5ce341e56b3c9a5 GIT binary patch literal 8284 zcmeH~F%H5o3`GMh?HRhTatc6*r3(uKci<9q?pfIAio`{@0#~4wsUkbn0>y4Ugs5r~ zH-56?p9triJME8$S^Iw7ug~sjyFdTt?U$R+1B)(e=h|oK+<7rYTkXz^+hYncFg^eF zn4*<4EAeM_*vc)m&;m0O_CEf+_|}@LslLtkbFubv%kz7V);p^cAM~%4Vcsvze{4Pd zyB_nq)tm=;yDffRaM5==DQ(B`^R=R3O?=zupLD&^8shICdA(zPQ`zRr>mA3R7kvEm zYx!}~zb*Z1>z(??`>(HeAox1A#n;z6pMRg1v3fZFV^KXP@%i(I){D;^^kVJ&{R3(p z{s$ayx6Ri-5BT`$Zp)98{&@Y#XB>N^`H$7}zw0qSUeDkG$LL3)e_MQgz0>`{@%v1T z)k}O^`ltI&>qXkm-#?*VF+bjJo3DQ!@bTkpYmAcqZRuZI@6z&X4P~P4L zCO+8o6ACYMc~tjqieS^bo0YD0KSj+VgLXD literal 0 HcmV?d00001 diff --git a/soh/assets/custom/objects/object_xmas_tree/Wrapping_G_64 b/soh/assets/custom/objects/object_xmas_tree/Wrapping_G_64 new file mode 100644 index 0000000000000000000000000000000000000000..6c128dbee7b80402095db1a064c2a6bcfe23a453 GIT binary patch literal 8284 zcmeHLF>b>!43xSB{zS+Aq5%pcaF=H2kSF9B{ZO~e1+w`S{X)M`8>~wll`;)P${G|w zFeO^N@WhhaK#UFV;9DPaK#UG5L&&rFrF>cRg81UTf4 literal 0 HcmV?d00001 diff --git a/soh/assets/custom/objects/object_xmas_tree/Wrapping_R_32 b/soh/assets/custom/objects/object_xmas_tree/Wrapping_R_32 new file mode 100644 index 0000000000000000000000000000000000000000..a61f3d3867bab61b04878af87a02267c5d98332a GIT binary patch literal 2140 zcmZQzU|@)F4e@6L((m`Jy$8ZTCeeTis8RunA(|TO85n?=gMoqDlN`wD%I&%3AUQfA zdJy`z93%&NF;dI^07gv6=?a0EG7u4vEX@8BjMyN^m)OK%VubX=)ZwB7;Qq&@0>AiR z(@!Y8(B)Cx4@pzFLmX3{y82H5V*|JCpqN0HN3|b+Tw#+P?)uTg3q1_*=O4`YM%B;l zNn8Dx@r`Q#2}b<(qpQZ`54ZRy6yNCbsQxD$-w+juaHOt&!tssY{Rnpv%R+TOvAPiI G5c&a;t;;_E literal 0 HcmV?d00001 diff --git a/soh/assets/custom/objects/object_xmas_tree/Wrapping_R_64 b/soh/assets/custom/objects/object_xmas_tree/Wrapping_R_64 new file mode 100644 index 0000000000000000000000000000000000000000..d884c2ca670c5d54467393482e1501c5c1691ee1 GIT binary patch literal 8284 zcmeH|F>(VT3`N;=9$z9iNt!L3CN5IsIKEIi*O_tWQ{)P{LSPgEUw9xMAyx%ub{1BP zp7kZM&N=tKzP&E~{{8v!6)r#h_wT{K`TTp)rqh#i{(5w7f7oK|*8Smp*@8^W#6MrQ z7%z*J_>W6Db}Nn2LQi_wWBk|U)(Ba;^*lb4+Ef0c$FcY0U;f8(BW?1r{-pJE?|#%j z?5=s}Z@0z2`fkweckUnKk6khDKKa;x{5? zTKe;P!QJwDt$%;Yenr0AZksRHx0Szo{HV6Zs#Sj)%-rYX^NU*6B;A-Rg)AI6_+HD*5f*neYGPn4Gayk62ynn~^T?@!sU$d}t~^Yzbzdi + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasDecor100DL_tri_0 b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor100DL_tri_0 new file mode 100644 index 000000000..bc1589a65 --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor100DL_tri_0 @@ -0,0 +1,106 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasDecor100DL_tri_1 b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor100DL_tri_1 new file mode 100644 index 000000000..ff14442dc --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor100DL_tri_1 @@ -0,0 +1,170 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasDecor100DL_tri_2 b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor100DL_tri_2 new file mode 100644 index 000000000..ea5e79a96 --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor100DL_tri_2 @@ -0,0 +1,68 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasDecor100DL_tri_3 b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor100DL_tri_3 new file mode 100644 index 000000000..4280e17a5 --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor100DL_tri_3 @@ -0,0 +1,68 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasDecor100DL_vtx_0 b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor100DL_vtx_0 new file mode 100644 index 000000000..2d2b533a4 --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor100DL_vtx_0 @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasDecor100DL_vtx_1 b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor100DL_vtx_1 new file mode 100644 index 000000000..2199d0779 --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor100DL_vtx_1 @@ -0,0 +1,220 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasDecor100DL_vtx_2 b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor100DL_vtx_2 new file mode 100644 index 000000000..e0403545a --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor100DL_vtx_2 @@ -0,0 +1,94 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasDecor100DL_vtx_3 b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor100DL_vtx_3 new file mode 100644 index 000000000..ae1fba294 --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor100DL_vtx_3 @@ -0,0 +1,94 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasDecor10DL b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor10DL new file mode 100644 index 000000000..80f8fc81b --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor10DL @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasDecor10DL_tri_0 b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor10DL_tri_0 new file mode 100644 index 000000000..2a2601403 --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor10DL_tri_0 @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasDecor10DL_tri_1 b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor10DL_tri_1 new file mode 100644 index 000000000..87dc5c7ca --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor10DL_tri_1 @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasDecor10DL_tri_2 b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor10DL_tri_2 new file mode 100644 index 000000000..d9d225ee1 --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor10DL_tri_2 @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasDecor10DL_tri_3 b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor10DL_tri_3 new file mode 100644 index 000000000..010dfe669 --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor10DL_tri_3 @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasDecor10DL_tri_4 b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor10DL_tri_4 new file mode 100644 index 000000000..34de1a10f --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor10DL_tri_4 @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasDecor10DL_tri_5 b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor10DL_tri_5 new file mode 100644 index 000000000..dbaef4a37 --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor10DL_tri_5 @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasDecor10DL_tri_6 b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor10DL_tri_6 new file mode 100644 index 000000000..4b4aaa742 --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor10DL_tri_6 @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasDecor10DL_tri_7 b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor10DL_tri_7 new file mode 100644 index 000000000..a3aa6c672 --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor10DL_tri_7 @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasDecor10DL_vtx_0 b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor10DL_vtx_0 new file mode 100644 index 000000000..189a72f78 --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor10DL_vtx_0 @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasDecor10DL_vtx_1 b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor10DL_vtx_1 new file mode 100644 index 000000000..491afaa21 --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor10DL_vtx_1 @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasDecor10DL_vtx_2 b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor10DL_vtx_2 new file mode 100644 index 000000000..1c86dfb20 --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor10DL_vtx_2 @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasDecor10DL_vtx_3 b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor10DL_vtx_3 new file mode 100644 index 000000000..fef6070e2 --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor10DL_vtx_3 @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasDecor10DL_vtx_4 b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor10DL_vtx_4 new file mode 100644 index 000000000..74ff37e83 --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor10DL_vtx_4 @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasDecor10DL_vtx_5 b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor10DL_vtx_5 new file mode 100644 index 000000000..e5347a692 --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor10DL_vtx_5 @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasDecor10DL_vtx_6 b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor10DL_vtx_6 new file mode 100644 index 000000000..57b0c83f5 --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor10DL_vtx_6 @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasDecor10DL_vtx_7 b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor10DL_vtx_7 new file mode 100644 index 000000000..4eea9d31d --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor10DL_vtx_7 @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasDecor20DL b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor20DL new file mode 100644 index 000000000..cd83c25f8 --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor20DL @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasDecor20DL_tri_0 b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor20DL_tri_0 new file mode 100644 index 000000000..7410becef --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor20DL_tri_0 @@ -0,0 +1,106 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasDecor20DL_tri_1 b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor20DL_tri_1 new file mode 100644 index 000000000..782f5f9e1 --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor20DL_tri_1 @@ -0,0 +1,68 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasDecor20DL_tri_2 b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor20DL_tri_2 new file mode 100644 index 000000000..46d90cfee --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor20DL_tri_2 @@ -0,0 +1,197 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasDecor20DL_tri_3 b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor20DL_tri_3 new file mode 100644 index 000000000..fcae1cb60 --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor20DL_tri_3 @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasDecor20DL_tri_4 b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor20DL_tri_4 new file mode 100644 index 000000000..cea2d4b01 --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor20DL_tri_4 @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasDecor20DL_tri_5 b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor20DL_tri_5 new file mode 100644 index 000000000..8e6c88ddf --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor20DL_tri_5 @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasDecor20DL_tri_6 b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor20DL_tri_6 new file mode 100644 index 000000000..0c0928683 --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor20DL_tri_6 @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasDecor20DL_tri_7 b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor20DL_tri_7 new file mode 100644 index 000000000..f56472810 --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor20DL_tri_7 @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasDecor20DL_tri_8 b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor20DL_tri_8 new file mode 100644 index 000000000..8464121eb --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor20DL_tri_8 @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasDecor20DL_tri_9 b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor20DL_tri_9 new file mode 100644 index 000000000..a22341bdf --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor20DL_tri_9 @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasDecor20DL_vtx_0 b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor20DL_vtx_0 new file mode 100644 index 000000000..c8a3028f5 --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor20DL_vtx_0 @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasDecor20DL_vtx_1 b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor20DL_vtx_1 new file mode 100644 index 000000000..d7bf03045 --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor20DL_vtx_1 @@ -0,0 +1,94 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasDecor20DL_vtx_2 b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor20DL_vtx_2 new file mode 100644 index 000000000..768baea65 --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor20DL_vtx_2 @@ -0,0 +1,300 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasDecor20DL_vtx_3 b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor20DL_vtx_3 new file mode 100644 index 000000000..87d0b1315 --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor20DL_vtx_3 @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasDecor20DL_vtx_4 b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor20DL_vtx_4 new file mode 100644 index 000000000..8fb018224 --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor20DL_vtx_4 @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasDecor20DL_vtx_5 b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor20DL_vtx_5 new file mode 100644 index 000000000..76d9b788a --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor20DL_vtx_5 @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasDecor20DL_vtx_6 b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor20DL_vtx_6 new file mode 100644 index 000000000..60cef595c --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor20DL_vtx_6 @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasDecor20DL_vtx_7 b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor20DL_vtx_7 new file mode 100644 index 000000000..e590fd848 --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor20DL_vtx_7 @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasDecor20DL_vtx_8 b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor20DL_vtx_8 new file mode 100644 index 000000000..505f171b0 --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor20DL_vtx_8 @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasDecor20DL_vtx_9 b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor20DL_vtx_9 new file mode 100644 index 000000000..50c131f9c --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor20DL_vtx_9 @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasDecor30DL b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor30DL new file mode 100644 index 000000000..4e4fd95aa --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor30DL @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasDecor30DL_tri_0 b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor30DL_tri_0 new file mode 100644 index 000000000..1ee54492c --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor30DL_tri_0 @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasDecor30DL_tri_1 b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor30DL_tri_1 new file mode 100644 index 000000000..0efacf68a --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor30DL_tri_1 @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasDecor30DL_tri_2 b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor30DL_tri_2 new file mode 100644 index 000000000..e05cc11fb --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor30DL_tri_2 @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasDecor30DL_tri_3 b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor30DL_tri_3 new file mode 100644 index 000000000..19917bd2e --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor30DL_tri_3 @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasDecor30DL_tri_4 b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor30DL_tri_4 new file mode 100644 index 000000000..f5f256b23 --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor30DL_tri_4 @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasDecor30DL_tri_5 b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor30DL_tri_5 new file mode 100644 index 000000000..536d06f7a --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor30DL_tri_5 @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasDecor30DL_tri_6 b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor30DL_tri_6 new file mode 100644 index 000000000..45568173a --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor30DL_tri_6 @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasDecor30DL_vtx_0 b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor30DL_vtx_0 new file mode 100644 index 000000000..509ed6529 --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor30DL_vtx_0 @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasDecor30DL_vtx_1 b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor30DL_vtx_1 new file mode 100644 index 000000000..49c0a080a --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor30DL_vtx_1 @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasDecor30DL_vtx_2 b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor30DL_vtx_2 new file mode 100644 index 000000000..c109c19f5 --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor30DL_vtx_2 @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasDecor30DL_vtx_3 b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor30DL_vtx_3 new file mode 100644 index 000000000..c7c1e10a6 --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor30DL_vtx_3 @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasDecor30DL_vtx_4 b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor30DL_vtx_4 new file mode 100644 index 000000000..a26e55df1 --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor30DL_vtx_4 @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasDecor30DL_vtx_5 b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor30DL_vtx_5 new file mode 100644 index 000000000..d1177d633 --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor30DL_vtx_5 @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasDecor30DL_vtx_6 b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor30DL_vtx_6 new file mode 100644 index 000000000..d947223ad --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor30DL_vtx_6 @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasDecor40DL b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor40DL new file mode 100644 index 000000000..9da99431f --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor40DL @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasDecor40DL_tri_0 b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor40DL_tri_0 new file mode 100644 index 000000000..f94c732e4 --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor40DL_tri_0 @@ -0,0 +1,68 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasDecor40DL_tri_1 b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor40DL_tri_1 new file mode 100644 index 000000000..348919286 --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor40DL_tri_1 @@ -0,0 +1,68 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasDecor40DL_tri_10 b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor40DL_tri_10 new file mode 100644 index 000000000..959b692d4 --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor40DL_tri_10 @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasDecor40DL_tri_11 b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor40DL_tri_11 new file mode 100644 index 000000000..41fb8d2b9 --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor40DL_tri_11 @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasDecor40DL_tri_12 b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor40DL_tri_12 new file mode 100644 index 000000000..8062b5a56 --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor40DL_tri_12 @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasDecor40DL_tri_2 b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor40DL_tri_2 new file mode 100644 index 000000000..7c52dae86 --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor40DL_tri_2 @@ -0,0 +1,68 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasDecor40DL_tri_3 b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor40DL_tri_3 new file mode 100644 index 000000000..af7892786 --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor40DL_tri_3 @@ -0,0 +1,68 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasDecor40DL_tri_4 b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor40DL_tri_4 new file mode 100644 index 000000000..e662f6ed6 --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor40DL_tri_4 @@ -0,0 +1,68 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasDecor40DL_tri_5 b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor40DL_tri_5 new file mode 100644 index 000000000..22b809b3f --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor40DL_tri_5 @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasDecor40DL_tri_6 b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor40DL_tri_6 new file mode 100644 index 000000000..1d845ad8a --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor40DL_tri_6 @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasDecor40DL_tri_7 b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor40DL_tri_7 new file mode 100644 index 000000000..12c90c209 --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor40DL_tri_7 @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasDecor40DL_tri_8 b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor40DL_tri_8 new file mode 100644 index 000000000..bbd9078ce --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor40DL_tri_8 @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasDecor40DL_tri_9 b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor40DL_tri_9 new file mode 100644 index 000000000..11e6780ea --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor40DL_tri_9 @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasDecor40DL_vtx_0 b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor40DL_vtx_0 new file mode 100644 index 000000000..8579d6fee --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor40DL_vtx_0 @@ -0,0 +1,94 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasDecor40DL_vtx_1 b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor40DL_vtx_1 new file mode 100644 index 000000000..b0dcceeec --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor40DL_vtx_1 @@ -0,0 +1,94 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasDecor40DL_vtx_10 b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor40DL_vtx_10 new file mode 100644 index 000000000..7d59969b3 --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor40DL_vtx_10 @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasDecor40DL_vtx_11 b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor40DL_vtx_11 new file mode 100644 index 000000000..ab7d95f64 --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor40DL_vtx_11 @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasDecor40DL_vtx_12 b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor40DL_vtx_12 new file mode 100644 index 000000000..514f00f38 --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor40DL_vtx_12 @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasDecor40DL_vtx_2 b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor40DL_vtx_2 new file mode 100644 index 000000000..7135901b7 --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor40DL_vtx_2 @@ -0,0 +1,94 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasDecor40DL_vtx_3 b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor40DL_vtx_3 new file mode 100644 index 000000000..874e86e45 --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor40DL_vtx_3 @@ -0,0 +1,94 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasDecor40DL_vtx_4 b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor40DL_vtx_4 new file mode 100644 index 000000000..8dcece79b --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor40DL_vtx_4 @@ -0,0 +1,94 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasDecor40DL_vtx_5 b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor40DL_vtx_5 new file mode 100644 index 000000000..030415bf5 --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor40DL_vtx_5 @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasDecor40DL_vtx_6 b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor40DL_vtx_6 new file mode 100644 index 000000000..5758decfe --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor40DL_vtx_6 @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasDecor40DL_vtx_7 b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor40DL_vtx_7 new file mode 100644 index 000000000..7e171bd29 --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor40DL_vtx_7 @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasDecor40DL_vtx_8 b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor40DL_vtx_8 new file mode 100644 index 000000000..26f056a5f --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor40DL_vtx_8 @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasDecor40DL_vtx_9 b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor40DL_vtx_9 new file mode 100644 index 000000000..878f90b20 --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor40DL_vtx_9 @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasDecor50DL b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor50DL new file mode 100644 index 000000000..537d98d5f --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor50DL @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasDecor50DL_tri_0 b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor50DL_tri_0 new file mode 100644 index 000000000..41e8cb3c9 --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor50DL_tri_0 @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasDecor50DL_tri_1 b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor50DL_tri_1 new file mode 100644 index 000000000..0beb4cd5f --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor50DL_tri_1 @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasDecor50DL_tri_2 b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor50DL_tri_2 new file mode 100644 index 000000000..a33dc9689 --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor50DL_tri_2 @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasDecor50DL_tri_3 b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor50DL_tri_3 new file mode 100644 index 000000000..8cd67cdeb --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor50DL_tri_3 @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasDecor50DL_tri_4 b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor50DL_tri_4 new file mode 100644 index 000000000..f3cb40c18 --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor50DL_tri_4 @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasDecor50DL_tri_5 b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor50DL_tri_5 new file mode 100644 index 000000000..28c1fa004 --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor50DL_tri_5 @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasDecor50DL_vtx_0 b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor50DL_vtx_0 new file mode 100644 index 000000000..4bbea8de4 --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor50DL_vtx_0 @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasDecor50DL_vtx_1 b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor50DL_vtx_1 new file mode 100644 index 000000000..c331cabed --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor50DL_vtx_1 @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasDecor50DL_vtx_2 b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor50DL_vtx_2 new file mode 100644 index 000000000..62bb3dc53 --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor50DL_vtx_2 @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasDecor50DL_vtx_3 b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor50DL_vtx_3 new file mode 100644 index 000000000..135764c05 --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor50DL_vtx_3 @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasDecor50DL_vtx_4 b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor50DL_vtx_4 new file mode 100644 index 000000000..1066194fb --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor50DL_vtx_4 @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasDecor50DL_vtx_5 b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor50DL_vtx_5 new file mode 100644 index 000000000..afec2ee78 --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor50DL_vtx_5 @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasDecor60DL b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor60DL new file mode 100644 index 000000000..fe51b9f6b --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor60DL @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasDecor60DL_tri_0 b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor60DL_tri_0 new file mode 100644 index 000000000..1d746dde9 --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor60DL_tri_0 @@ -0,0 +1,68 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasDecor60DL_tri_1 b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor60DL_tri_1 new file mode 100644 index 000000000..095e5d8f1 --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor60DL_tri_1 @@ -0,0 +1,106 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasDecor60DL_tri_2 b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor60DL_tri_2 new file mode 100644 index 000000000..b1f3c81fc --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor60DL_tri_2 @@ -0,0 +1,68 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasDecor60DL_tri_3 b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor60DL_tri_3 new file mode 100644 index 000000000..e88a5cffe --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor60DL_tri_3 @@ -0,0 +1,133 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasDecor60DL_tri_4 b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor60DL_tri_4 new file mode 100644 index 000000000..cbc9ce14a --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor60DL_tri_4 @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasDecor60DL_tri_5 b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor60DL_tri_5 new file mode 100644 index 000000000..6646786c1 --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor60DL_tri_5 @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasDecor60DL_tri_6 b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor60DL_tri_6 new file mode 100644 index 000000000..a2a881763 --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor60DL_tri_6 @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasDecor60DL_tri_7 b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor60DL_tri_7 new file mode 100644 index 000000000..2a5440b86 --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor60DL_tri_7 @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasDecor60DL_tri_8 b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor60DL_tri_8 new file mode 100644 index 000000000..245daae2b --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor60DL_tri_8 @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasDecor60DL_tri_9 b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor60DL_tri_9 new file mode 100644 index 000000000..34a3d0b55 --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor60DL_tri_9 @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasDecor60DL_vtx_0 b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor60DL_vtx_0 new file mode 100644 index 000000000..b33405eec --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor60DL_vtx_0 @@ -0,0 +1,94 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasDecor60DL_vtx_1 b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor60DL_vtx_1 new file mode 100644 index 000000000..ff671566d --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor60DL_vtx_1 @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasDecor60DL_vtx_2 b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor60DL_vtx_2 new file mode 100644 index 000000000..21358026e --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor60DL_vtx_2 @@ -0,0 +1,94 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasDecor60DL_vtx_3 b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor60DL_vtx_3 new file mode 100644 index 000000000..831547972 --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor60DL_vtx_3 @@ -0,0 +1,202 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasDecor60DL_vtx_4 b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor60DL_vtx_4 new file mode 100644 index 000000000..c591133b8 --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor60DL_vtx_4 @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasDecor60DL_vtx_5 b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor60DL_vtx_5 new file mode 100644 index 000000000..d111addad --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor60DL_vtx_5 @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasDecor60DL_vtx_6 b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor60DL_vtx_6 new file mode 100644 index 000000000..2684a5759 --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor60DL_vtx_6 @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasDecor60DL_vtx_7 b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor60DL_vtx_7 new file mode 100644 index 000000000..a2ab6b20a --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor60DL_vtx_7 @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasDecor60DL_vtx_8 b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor60DL_vtx_8 new file mode 100644 index 000000000..fed438e57 --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor60DL_vtx_8 @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasDecor60DL_vtx_9 b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor60DL_vtx_9 new file mode 100644 index 000000000..9f8e178ed --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor60DL_vtx_9 @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasDecor70DL b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor70DL new file mode 100644 index 000000000..9d7a0b749 --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor70DL @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasDecor70DL_tri_0 b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor70DL_tri_0 new file mode 100644 index 000000000..540a5e3e3 --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor70DL_tri_0 @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasDecor70DL_tri_1 b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor70DL_tri_1 new file mode 100644 index 000000000..3b27e35d2 --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor70DL_tri_1 @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasDecor70DL_tri_2 b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor70DL_tri_2 new file mode 100644 index 000000000..29326efac --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor70DL_tri_2 @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasDecor70DL_tri_3 b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor70DL_tri_3 new file mode 100644 index 000000000..83850278e --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor70DL_tri_3 @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasDecor70DL_tri_4 b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor70DL_tri_4 new file mode 100644 index 000000000..38401ac4f --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor70DL_tri_4 @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasDecor70DL_tri_5 b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor70DL_tri_5 new file mode 100644 index 000000000..ef0b4397d --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor70DL_tri_5 @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasDecor70DL_tri_6 b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor70DL_tri_6 new file mode 100644 index 000000000..0df608625 --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor70DL_tri_6 @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasDecor70DL_vtx_0 b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor70DL_vtx_0 new file mode 100644 index 000000000..6e115c0bb --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor70DL_vtx_0 @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasDecor70DL_vtx_1 b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor70DL_vtx_1 new file mode 100644 index 000000000..ce6941dc9 --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor70DL_vtx_1 @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasDecor70DL_vtx_2 b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor70DL_vtx_2 new file mode 100644 index 000000000..56624ffb0 --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor70DL_vtx_2 @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasDecor70DL_vtx_3 b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor70DL_vtx_3 new file mode 100644 index 000000000..ec758ec91 --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor70DL_vtx_3 @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasDecor70DL_vtx_4 b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor70DL_vtx_4 new file mode 100644 index 000000000..3e9cc0ff4 --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor70DL_vtx_4 @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasDecor70DL_vtx_5 b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor70DL_vtx_5 new file mode 100644 index 000000000..ac28e8fb0 --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor70DL_vtx_5 @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasDecor70DL_vtx_6 b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor70DL_vtx_6 new file mode 100644 index 000000000..0cf3101e0 --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor70DL_vtx_6 @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasDecor80DL b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor80DL new file mode 100644 index 000000000..ba14f553d --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor80DL @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasDecor80DL_tri_0 b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor80DL_tri_0 new file mode 100644 index 000000000..233c5e5b7 --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor80DL_tri_0 @@ -0,0 +1,133 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasDecor80DL_tri_1 b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor80DL_tri_1 new file mode 100644 index 000000000..160f85e33 --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor80DL_tri_1 @@ -0,0 +1,68 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasDecor80DL_tri_2 b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor80DL_tri_2 new file mode 100644 index 000000000..712db2ead --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor80DL_tri_2 @@ -0,0 +1,133 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasDecor80DL_tri_3 b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor80DL_tri_3 new file mode 100644 index 000000000..567f9bbfa --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor80DL_tri_3 @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasDecor80DL_tri_4 b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor80DL_tri_4 new file mode 100644 index 000000000..ed60abbb9 --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor80DL_tri_4 @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasDecor80DL_tri_5 b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor80DL_tri_5 new file mode 100644 index 000000000..9d0125976 --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor80DL_tri_5 @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasDecor80DL_tri_6 b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor80DL_tri_6 new file mode 100644 index 000000000..011391daa --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor80DL_tri_6 @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasDecor80DL_tri_7 b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor80DL_tri_7 new file mode 100644 index 000000000..ae4be6ebd --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor80DL_tri_7 @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasDecor80DL_tri_8 b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor80DL_tri_8 new file mode 100644 index 000000000..b7a34eb1d --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor80DL_tri_8 @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasDecor80DL_vtx_0 b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor80DL_vtx_0 new file mode 100644 index 000000000..4e538463f --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor80DL_vtx_0 @@ -0,0 +1,202 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasDecor80DL_vtx_1 b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor80DL_vtx_1 new file mode 100644 index 000000000..1c7a6b49c --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor80DL_vtx_1 @@ -0,0 +1,94 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasDecor80DL_vtx_2 b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor80DL_vtx_2 new file mode 100644 index 000000000..2717d84f0 --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor80DL_vtx_2 @@ -0,0 +1,202 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasDecor80DL_vtx_3 b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor80DL_vtx_3 new file mode 100644 index 000000000..e5f479fc4 --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor80DL_vtx_3 @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasDecor80DL_vtx_4 b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor80DL_vtx_4 new file mode 100644 index 000000000..5e1500678 --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor80DL_vtx_4 @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasDecor80DL_vtx_5 b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor80DL_vtx_5 new file mode 100644 index 000000000..e00362088 --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor80DL_vtx_5 @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasDecor80DL_vtx_6 b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor80DL_vtx_6 new file mode 100644 index 000000000..e67313e14 --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor80DL_vtx_6 @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasDecor80DL_vtx_7 b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor80DL_vtx_7 new file mode 100644 index 000000000..7acc51f2a --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor80DL_vtx_7 @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasDecor80DL_vtx_8 b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor80DL_vtx_8 new file mode 100644 index 000000000..c3ac2ef36 --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor80DL_vtx_8 @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasDecor90DL b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor90DL new file mode 100644 index 000000000..f96deccc4 --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor90DL @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasDecor90DL_tri_0 b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor90DL_tri_0 new file mode 100644 index 000000000..aaf575f3e --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor90DL_tri_0 @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasDecor90DL_tri_1 b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor90DL_tri_1 new file mode 100644 index 000000000..17e2bbb14 --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor90DL_tri_1 @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasDecor90DL_tri_2 b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor90DL_tri_2 new file mode 100644 index 000000000..45f70fca8 --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor90DL_tri_2 @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasDecor90DL_tri_3 b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor90DL_tri_3 new file mode 100644 index 000000000..501540e99 --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor90DL_tri_3 @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasDecor90DL_tri_4 b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor90DL_tri_4 new file mode 100644 index 000000000..6aa20edeb --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor90DL_tri_4 @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasDecor90DL_tri_5 b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor90DL_tri_5 new file mode 100644 index 000000000..9f5515c3b --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor90DL_tri_5 @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasDecor90DL_tri_6 b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor90DL_tri_6 new file mode 100644 index 000000000..e8b2ebe15 --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor90DL_tri_6 @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasDecor90DL_tri_7 b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor90DL_tri_7 new file mode 100644 index 000000000..e8686cfeb --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor90DL_tri_7 @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasDecor90DL_vtx_0 b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor90DL_vtx_0 new file mode 100644 index 000000000..4bf94f75a --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor90DL_vtx_0 @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasDecor90DL_vtx_1 b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor90DL_vtx_1 new file mode 100644 index 000000000..a3e163984 --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor90DL_vtx_1 @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasDecor90DL_vtx_2 b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor90DL_vtx_2 new file mode 100644 index 000000000..5075a9732 --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor90DL_vtx_2 @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasDecor90DL_vtx_3 b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor90DL_vtx_3 new file mode 100644 index 000000000..7b0fce1b2 --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor90DL_vtx_3 @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasDecor90DL_vtx_4 b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor90DL_vtx_4 new file mode 100644 index 000000000..240d7afe2 --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor90DL_vtx_4 @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasDecor90DL_vtx_5 b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor90DL_vtx_5 new file mode 100644 index 000000000..adf5dfa9b --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor90DL_vtx_5 @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasDecor90DL_vtx_6 b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor90DL_vtx_6 new file mode 100644 index 000000000..5e02e04d8 --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor90DL_vtx_6 @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasDecor90DL_vtx_7 b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor90DL_vtx_7 new file mode 100644 index 000000000..f92e3d98d --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasDecor90DL_vtx_7 @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasStarDL b/soh/assets/custom/objects/object_xmas_tree/gXmasStarDL new file mode 100644 index 000000000..2bad08d2d --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasStarDL @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasStarDL_tri_0 b/soh/assets/custom/objects/object_xmas_tree/gXmasStarDL_tri_0 new file mode 100644 index 000000000..79b9903f8 --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasStarDL_tri_0 @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasStarDL_tri_1 b/soh/assets/custom/objects/object_xmas_tree/gXmasStarDL_tri_1 new file mode 100644 index 000000000..0f82cf893 --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasStarDL_tri_1 @@ -0,0 +1,390 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasStarDL_vtx_0 b/soh/assets/custom/objects/object_xmas_tree/gXmasStarDL_vtx_0 new file mode 100644 index 000000000..a990fc5af --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasStarDL_vtx_0 @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasStarDL_vtx_1 b/soh/assets/custom/objects/object_xmas_tree/gXmasStarDL_vtx_1 new file mode 100644 index 000000000..746770594 --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasStarDL_vtx_1 @@ -0,0 +1,347 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasTreeDL b/soh/assets/custom/objects/object_xmas_tree/gXmasTreeDL new file mode 100644 index 000000000..c343cfe2a --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasTreeDL @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasTreeDL_tri_0 b/soh/assets/custom/objects/object_xmas_tree/gXmasTreeDL_tri_0 new file mode 100644 index 000000000..38cdbe014 --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasTreeDL_tri_0 @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasTreeDL_tri_1 b/soh/assets/custom/objects/object_xmas_tree/gXmasTreeDL_tri_1 new file mode 100644 index 000000000..ff4e066a5 --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasTreeDL_tri_1 @@ -0,0 +1,133 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasTreeDL_tri_2 b/soh/assets/custom/objects/object_xmas_tree/gXmasTreeDL_tri_2 new file mode 100644 index 000000000..561d3ac5e --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasTreeDL_tri_2 @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasTreeDL_vtx_0 b/soh/assets/custom/objects/object_xmas_tree/gXmasTreeDL_vtx_0 new file mode 100644 index 000000000..94e5e1fef --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasTreeDL_vtx_0 @@ -0,0 +1,66 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasTreeDL_vtx_1 b/soh/assets/custom/objects/object_xmas_tree/gXmasTreeDL_vtx_1 new file mode 100644 index 000000000..01ed88a14 --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasTreeDL_vtx_1 @@ -0,0 +1,146 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/gXmasTreeDL_vtx_2 b/soh/assets/custom/objects/object_xmas_tree/gXmasTreeDL_vtx_2 new file mode 100644 index 000000000..fd03778f8 --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/gXmasTreeDL_vtx_2 @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/hilite_melon b/soh/assets/custom/objects/object_xmas_tree/hilite_melon new file mode 100644 index 0000000000000000000000000000000000000000..df1d605b38e65151f7f23aa1a0bbcba40252a1c8 GIT binary patch literal 2140 zcma)+EsWzx5QTG#js}LUp`oGCN|BCaz)H!1lMM|UHZ(b4m|+RCp{`L{*-!Hq} z`{&QyZhnroT#ozG1v}r%rHwn+ubpe-TPt%$Z)#sI*@TyEt_5ecpPxfw8}MK|HzY&S z##LnUY&zd%*<|u6Qe0=Ms5lgdashuW9-TAi`{`nGXGS|(XUgS#Kkhe6-;&q(C3!tv z(AKX*f{)3|rHZO(NK6j%kdR63vnhQOHhsg;l}%_lUDCH~s(rtXwqLJ>ZA@-*+nn#H z5E?EFWq4)2p{`(BtSe?*5cy!l-iHl$2m*c)Ts7~;+X^wjoobT!-HNe7# zVmcmO8?zm-Y`V3)>feP+usm)ZpU z2ZG%MUiXS9qvcHVqZoYSCp`Xmfr59Nf2jy~vQXn;328y7{;~mtCpWM+wjE|;w@>MnIobY;rPzE7Fz{pEjHV-EKV%NDCLxfNb zd4wJZG*9IpG$?B+pwhfoEO^QJN7F7;1*KH^2GyaaQb&xBCM6phufVPdR1(h6qb-iG WoJf;Se#T3`d_vWDf(%%_7svl_`n}`; literal 0 HcmV?d00001 diff --git a/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor100DL_f3dlite_Wrapping_B_64 b/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor100DL_f3dlite_Wrapping_B_64 new file mode 100644 index 000000000..e2cb1c6af --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor100DL_f3dlite_Wrapping_B_64 @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor100DL_f3dlite_Wrapping_G_32 b/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor100DL_f3dlite_Wrapping_G_32 new file mode 100644 index 000000000..5f67d4de1 --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor100DL_f3dlite_Wrapping_G_32 @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor100DL_f3dlite_Wrapping_R_32 b/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor100DL_f3dlite_Wrapping_R_32 new file mode 100644 index 000000000..f330997c2 --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor100DL_f3dlite_Wrapping_R_32 @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor100DL_f3dlite_Wrapping_R_64 b/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor100DL_f3dlite_Wrapping_R_64 new file mode 100644 index 000000000..ddba85e48 --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor100DL_f3dlite_Wrapping_R_64 @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor10DL_f3dlite_Bauble1_B b/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor10DL_f3dlite_Bauble1_B new file mode 100644 index 000000000..0562ad514 --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor10DL_f3dlite_Bauble1_B @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor10DL_f3dlite_Bauble1_G b/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor10DL_f3dlite_Bauble1_G new file mode 100644 index 000000000..424720964 --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor10DL_f3dlite_Bauble1_G @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor10DL_f3dlite_Bauble1_R b/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor10DL_f3dlite_Bauble1_R new file mode 100644 index 000000000..ed8997bac --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor10DL_f3dlite_Bauble1_R @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor10DL_f3dlite_Bauble2_B b/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor10DL_f3dlite_Bauble2_B new file mode 100644 index 000000000..a2fb86662 --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor10DL_f3dlite_Bauble2_B @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor10DL_f3dlite_Bauble2_G b/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor10DL_f3dlite_Bauble2_G new file mode 100644 index 000000000..a3ebffce5 --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor10DL_f3dlite_Bauble2_G @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor10DL_f3dlite_Bauble2_R b/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor10DL_f3dlite_Bauble2_R new file mode 100644 index 000000000..780bee1c5 --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor10DL_f3dlite_Bauble2_R @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor10DL_f3dlite_Bauble3_G b/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor10DL_f3dlite_Bauble3_G new file mode 100644 index 000000000..5ec29067d --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor10DL_f3dlite_Bauble3_G @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor10DL_f3dlite_Bauble3_R b/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor10DL_f3dlite_Bauble3_R new file mode 100644 index 000000000..6bfad5f53 --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor10DL_f3dlite_Bauble3_R @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor20DL_f3dlite_Bauble1_B b/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor20DL_f3dlite_Bauble1_B new file mode 100644 index 000000000..0562ad514 --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor20DL_f3dlite_Bauble1_B @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor20DL_f3dlite_Bauble1_R b/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor20DL_f3dlite_Bauble1_R new file mode 100644 index 000000000..ed8997bac --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor20DL_f3dlite_Bauble1_R @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor20DL_f3dlite_Bauble2_B b/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor20DL_f3dlite_Bauble2_B new file mode 100644 index 000000000..a2fb86662 --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor20DL_f3dlite_Bauble2_B @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor20DL_f3dlite_Bauble2_G b/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor20DL_f3dlite_Bauble2_G new file mode 100644 index 000000000..a3ebffce5 --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor20DL_f3dlite_Bauble2_G @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor20DL_f3dlite_Bauble2_R b/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor20DL_f3dlite_Bauble2_R new file mode 100644 index 000000000..780bee1c5 --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor20DL_f3dlite_Bauble2_R @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor20DL_f3dlite_Bauble3_B b/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor20DL_f3dlite_Bauble3_B new file mode 100644 index 000000000..7af3c0fdf --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor20DL_f3dlite_Bauble3_B @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor20DL_f3dlite_Bauble3_G b/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor20DL_f3dlite_Bauble3_G new file mode 100644 index 000000000..5ec29067d --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor20DL_f3dlite_Bauble3_G @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor20DL_f3dlite_Wrapping_B_32 b/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor20DL_f3dlite_Wrapping_B_32 new file mode 100644 index 000000000..1425245e0 --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor20DL_f3dlite_Wrapping_B_32 @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor20DL_f3dlite_Wrapping_G_64 b/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor20DL_f3dlite_Wrapping_G_64 new file mode 100644 index 000000000..c3a973f39 --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor20DL_f3dlite_Wrapping_G_64 @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor20DL_f3dlite_Wrapping_R_32 b/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor20DL_f3dlite_Wrapping_R_32 new file mode 100644 index 000000000..f330997c2 --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor20DL_f3dlite_Wrapping_R_32 @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor30DL_f3dlite_Bauble1_B b/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor30DL_f3dlite_Bauble1_B new file mode 100644 index 000000000..0562ad514 --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor30DL_f3dlite_Bauble1_B @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor30DL_f3dlite_Bauble1_G b/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor30DL_f3dlite_Bauble1_G new file mode 100644 index 000000000..424720964 --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor30DL_f3dlite_Bauble1_G @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor30DL_f3dlite_Bauble1_R b/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor30DL_f3dlite_Bauble1_R new file mode 100644 index 000000000..ed8997bac --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor30DL_f3dlite_Bauble1_R @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor30DL_f3dlite_Bauble2_B b/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor30DL_f3dlite_Bauble2_B new file mode 100644 index 000000000..a2fb86662 --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor30DL_f3dlite_Bauble2_B @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor30DL_f3dlite_Bauble2_G b/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor30DL_f3dlite_Bauble2_G new file mode 100644 index 000000000..a3ebffce5 --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor30DL_f3dlite_Bauble2_G @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor30DL_f3dlite_Bauble3_B b/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor30DL_f3dlite_Bauble3_B new file mode 100644 index 000000000..7af3c0fdf --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor30DL_f3dlite_Bauble3_B @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor30DL_f3dlite_Bauble3_R b/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor30DL_f3dlite_Bauble3_R new file mode 100644 index 000000000..6bfad5f53 --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor30DL_f3dlite_Bauble3_R @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor40DL_f3dlite_Bauble1_B b/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor40DL_f3dlite_Bauble1_B new file mode 100644 index 000000000..0562ad514 --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor40DL_f3dlite_Bauble1_B @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor40DL_f3dlite_Bauble1_R b/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor40DL_f3dlite_Bauble1_R new file mode 100644 index 000000000..ed8997bac --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor40DL_f3dlite_Bauble1_R @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor40DL_f3dlite_Bauble2_B b/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor40DL_f3dlite_Bauble2_B new file mode 100644 index 000000000..a2fb86662 --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor40DL_f3dlite_Bauble2_B @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor40DL_f3dlite_Bauble2_G b/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor40DL_f3dlite_Bauble2_G new file mode 100644 index 000000000..a3ebffce5 --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor40DL_f3dlite_Bauble2_G @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor40DL_f3dlite_Bauble2_R b/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor40DL_f3dlite_Bauble2_R new file mode 100644 index 000000000..780bee1c5 --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor40DL_f3dlite_Bauble2_R @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor40DL_f3dlite_Bauble3_B b/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor40DL_f3dlite_Bauble3_B new file mode 100644 index 000000000..7af3c0fdf --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor40DL_f3dlite_Bauble3_B @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor40DL_f3dlite_Bauble3_G b/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor40DL_f3dlite_Bauble3_G new file mode 100644 index 000000000..5ec29067d --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor40DL_f3dlite_Bauble3_G @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor40DL_f3dlite_Bauble3_R b/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor40DL_f3dlite_Bauble3_R new file mode 100644 index 000000000..6bfad5f53 --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor40DL_f3dlite_Bauble3_R @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor40DL_f3dlite_Wrapping_B_32 b/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor40DL_f3dlite_Wrapping_B_32 new file mode 100644 index 000000000..1425245e0 --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor40DL_f3dlite_Wrapping_B_32 @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor40DL_f3dlite_Wrapping_G_32 b/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor40DL_f3dlite_Wrapping_G_32 new file mode 100644 index 000000000..5f67d4de1 --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor40DL_f3dlite_Wrapping_G_32 @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor40DL_f3dlite_Wrapping_G_64 b/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor40DL_f3dlite_Wrapping_G_64 new file mode 100644 index 000000000..c3a973f39 --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor40DL_f3dlite_Wrapping_G_64 @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor40DL_f3dlite_Wrapping_R_32 b/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor40DL_f3dlite_Wrapping_R_32 new file mode 100644 index 000000000..f330997c2 --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor40DL_f3dlite_Wrapping_R_32 @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor40DL_f3dlite_Wrapping_R_64 b/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor40DL_f3dlite_Wrapping_R_64 new file mode 100644 index 000000000..ddba85e48 --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor40DL_f3dlite_Wrapping_R_64 @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor50DL_f3dlite_Bauble1_B b/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor50DL_f3dlite_Bauble1_B new file mode 100644 index 000000000..0562ad514 --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor50DL_f3dlite_Bauble1_B @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor50DL_f3dlite_Bauble1_G b/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor50DL_f3dlite_Bauble1_G new file mode 100644 index 000000000..424720964 --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor50DL_f3dlite_Bauble1_G @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor50DL_f3dlite_Bauble2_G b/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor50DL_f3dlite_Bauble2_G new file mode 100644 index 000000000..a3ebffce5 --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor50DL_f3dlite_Bauble2_G @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor50DL_f3dlite_Bauble2_R b/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor50DL_f3dlite_Bauble2_R new file mode 100644 index 000000000..780bee1c5 --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor50DL_f3dlite_Bauble2_R @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor50DL_f3dlite_Bauble3_B b/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor50DL_f3dlite_Bauble3_B new file mode 100644 index 000000000..7af3c0fdf --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor50DL_f3dlite_Bauble3_B @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor50DL_f3dlite_Bauble3_R b/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor50DL_f3dlite_Bauble3_R new file mode 100644 index 000000000..6bfad5f53 --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor50DL_f3dlite_Bauble3_R @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor60DL_f3dlite_Bauble1_B b/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor60DL_f3dlite_Bauble1_B new file mode 100644 index 000000000..0562ad514 --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor60DL_f3dlite_Bauble1_B @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor60DL_f3dlite_Bauble1_G b/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor60DL_f3dlite_Bauble1_G new file mode 100644 index 000000000..424720964 --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor60DL_f3dlite_Bauble1_G @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor60DL_f3dlite_Bauble1_R b/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor60DL_f3dlite_Bauble1_R new file mode 100644 index 000000000..ed8997bac --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor60DL_f3dlite_Bauble1_R @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor60DL_f3dlite_Bauble2_G b/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor60DL_f3dlite_Bauble2_G new file mode 100644 index 000000000..a3ebffce5 --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor60DL_f3dlite_Bauble2_G @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor60DL_f3dlite_Bauble2_R b/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor60DL_f3dlite_Bauble2_R new file mode 100644 index 000000000..780bee1c5 --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor60DL_f3dlite_Bauble2_R @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor60DL_f3dlite_Bauble3_G b/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor60DL_f3dlite_Bauble3_G new file mode 100644 index 000000000..5ec29067d --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor60DL_f3dlite_Bauble3_G @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor60DL_f3dlite_Wrapping_B_64 b/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor60DL_f3dlite_Wrapping_B_64 new file mode 100644 index 000000000..e2cb1c6af --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor60DL_f3dlite_Wrapping_B_64 @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor60DL_f3dlite_Wrapping_G_32 b/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor60DL_f3dlite_Wrapping_G_32 new file mode 100644 index 000000000..5f67d4de1 --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor60DL_f3dlite_Wrapping_G_32 @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor60DL_f3dlite_Wrapping_R_32 b/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor60DL_f3dlite_Wrapping_R_32 new file mode 100644 index 000000000..f330997c2 --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor60DL_f3dlite_Wrapping_R_32 @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor60DL_f3dlite_Wrapping_R_64 b/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor60DL_f3dlite_Wrapping_R_64 new file mode 100644 index 000000000..ddba85e48 --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor60DL_f3dlite_Wrapping_R_64 @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor70DL_f3dlite_Bauble1_G b/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor70DL_f3dlite_Bauble1_G new file mode 100644 index 000000000..424720964 --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor70DL_f3dlite_Bauble1_G @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor70DL_f3dlite_Bauble1_R b/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor70DL_f3dlite_Bauble1_R new file mode 100644 index 000000000..ed8997bac --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor70DL_f3dlite_Bauble1_R @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor70DL_f3dlite_Bauble2_G b/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor70DL_f3dlite_Bauble2_G new file mode 100644 index 000000000..a3ebffce5 --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor70DL_f3dlite_Bauble2_G @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor70DL_f3dlite_Bauble2_R b/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor70DL_f3dlite_Bauble2_R new file mode 100644 index 000000000..780bee1c5 --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor70DL_f3dlite_Bauble2_R @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor70DL_f3dlite_Bauble3_B b/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor70DL_f3dlite_Bauble3_B new file mode 100644 index 000000000..7af3c0fdf --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor70DL_f3dlite_Bauble3_B @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor70DL_f3dlite_Bauble3_G b/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor70DL_f3dlite_Bauble3_G new file mode 100644 index 000000000..5ec29067d --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor70DL_f3dlite_Bauble3_G @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor70DL_f3dlite_Bauble3_R b/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor70DL_f3dlite_Bauble3_R new file mode 100644 index 000000000..6bfad5f53 --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor70DL_f3dlite_Bauble3_R @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor80DL_f3dlite_Bauble1_B b/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor80DL_f3dlite_Bauble1_B new file mode 100644 index 000000000..0562ad514 --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor80DL_f3dlite_Bauble1_B @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor80DL_f3dlite_Bauble1_R b/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor80DL_f3dlite_Bauble1_R new file mode 100644 index 000000000..ed8997bac --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor80DL_f3dlite_Bauble1_R @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor80DL_f3dlite_Bauble2_G b/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor80DL_f3dlite_Bauble2_G new file mode 100644 index 000000000..a3ebffce5 --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor80DL_f3dlite_Bauble2_G @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor80DL_f3dlite_Bauble3_B b/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor80DL_f3dlite_Bauble3_B new file mode 100644 index 000000000..7af3c0fdf --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor80DL_f3dlite_Bauble3_B @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor80DL_f3dlite_Bauble3_G b/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor80DL_f3dlite_Bauble3_G new file mode 100644 index 000000000..5ec29067d --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor80DL_f3dlite_Bauble3_G @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor80DL_f3dlite_Bauble3_R b/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor80DL_f3dlite_Bauble3_R new file mode 100644 index 000000000..6bfad5f53 --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor80DL_f3dlite_Bauble3_R @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor80DL_f3dlite_Wrapping_B_32 b/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor80DL_f3dlite_Wrapping_B_32 new file mode 100644 index 000000000..1425245e0 --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor80DL_f3dlite_Wrapping_B_32 @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor80DL_f3dlite_Wrapping_G_32 b/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor80DL_f3dlite_Wrapping_G_32 new file mode 100644 index 000000000..5f67d4de1 --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor80DL_f3dlite_Wrapping_G_32 @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor80DL_f3dlite_Wrapping_R_32 b/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor80DL_f3dlite_Wrapping_R_32 new file mode 100644 index 000000000..f330997c2 --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor80DL_f3dlite_Wrapping_R_32 @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor90DL_f3dlite_Bauble1_B b/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor90DL_f3dlite_Bauble1_B new file mode 100644 index 000000000..0562ad514 --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor90DL_f3dlite_Bauble1_B @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor90DL_f3dlite_Bauble1_G b/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor90DL_f3dlite_Bauble1_G new file mode 100644 index 000000000..424720964 --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor90DL_f3dlite_Bauble1_G @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor90DL_f3dlite_Bauble1_R b/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor90DL_f3dlite_Bauble1_R new file mode 100644 index 000000000..ed8997bac --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor90DL_f3dlite_Bauble1_R @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor90DL_f3dlite_Bauble2_B b/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor90DL_f3dlite_Bauble2_B new file mode 100644 index 000000000..a2fb86662 --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor90DL_f3dlite_Bauble2_B @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor90DL_f3dlite_Bauble2_R b/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor90DL_f3dlite_Bauble2_R new file mode 100644 index 000000000..780bee1c5 --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor90DL_f3dlite_Bauble2_R @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor90DL_f3dlite_Bauble3_B b/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor90DL_f3dlite_Bauble3_B new file mode 100644 index 000000000..7af3c0fdf --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor90DL_f3dlite_Bauble3_B @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor90DL_f3dlite_Bauble3_G b/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor90DL_f3dlite_Bauble3_G new file mode 100644 index 000000000..5ec29067d --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor90DL_f3dlite_Bauble3_G @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor90DL_f3dlite_Bauble3_R b/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor90DL_f3dlite_Bauble3_R new file mode 100644 index 000000000..6bfad5f53 --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/mat_gXmasDecor90DL_f3dlite_Bauble3_R @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/mat_gXmasStarDL_f3dlite_Glow b/soh/assets/custom/objects/object_xmas_tree/mat_gXmasStarDL_f3dlite_Glow new file mode 100644 index 000000000..381668c5c --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/mat_gXmasStarDL_f3dlite_Glow @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_triforce_piece_2/mat_gTriforcePiece2DL_f3dlite_triforce_edges b/soh/assets/custom/objects/object_xmas_tree/mat_gXmasStarDL_f3dlite_OrnamentGold similarity index 72% rename from soh/assets/custom/objects/object_triforce_piece_2/mat_gTriforcePiece2DL_f3dlite_triforce_edges rename to soh/assets/custom/objects/object_xmas_tree/mat_gXmasStarDL_f3dlite_OrnamentGold index 5968068f5..b657da8a7 100644 --- a/soh/assets/custom/objects/object_triforce_piece_2/mat_gTriforcePiece2DL_f3dlite_triforce_edges +++ b/soh/assets/custom/objects/object_xmas_tree/mat_gXmasStarDL_f3dlite_OrnamentGold @@ -1,21 +1,21 @@ - + - + - + - + diff --git a/soh/assets/custom/objects/object_xmas_tree/mat_gXmasTreeDL_f3dlite_TreeBrown b/soh/assets/custom/objects/object_xmas_tree/mat_gXmasTreeDL_f3dlite_TreeBrown new file mode 100644 index 000000000..37fdb10d2 --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/mat_gXmasTreeDL_f3dlite_TreeBrown @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/mat_gXmasTreeDL_f3dlite_TreeGreen b/soh/assets/custom/objects/object_xmas_tree/mat_gXmasTreeDL_f3dlite_TreeGreen new file mode 100644 index 000000000..119341c70 --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/mat_gXmasTreeDL_f3dlite_TreeGreen @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_xmas_tree/mat_gXmasTreeDL_f3dlite_TreeTip b/soh/assets/custom/objects/object_xmas_tree/mat_gXmasTreeDL_f3dlite_TreeTip new file mode 100644 index 000000000..9baaadbf5 --- /dev/null +++ b/soh/assets/custom/objects/object_xmas_tree/mat_gXmasTreeDL_f3dlite_TreeTip @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/textures/parameter_static/gTriforcePiece.rgba32.png b/soh/assets/custom/textures/parameter_static/gTriforcePiece.rgba32.png index cc67b6a133d237ccada031e4efa53358a9f77415..eace659af2937bf5145a4ea2101f3d15fb42d749 100644 GIT binary patch delta 963 zcmV;!13diU4cG^eBYy**Nkl-erC(%@_z_GV`-X3Hk(Zt(;EBz{(lisj}hp)&ZEnAyY+{| zL7a24SS$oq_#Xmnv;y1^z!3`^drW8lLV)13z+bdSU2sN%nII1mx|_hhETu!>0nH=& zgmCO7y5$1Q)gm7L$O>dh`SJ001PI{SpR(nB0AXt5Wi$h(o>-Ei;xJsbr zkG1|Af#zUhJAVSs(T((0$aUVK?~synkag>|@0`oZE7@_8KmbRv`Eo9dpB1E45K-V_ zw69Wf%npGY%xdLfjSSZK9RX^-g%E1^Y;Bn8blk|v0w5{o?TxV^4K-zHmOd^RGcD$d z>RCJF2TxMRSfy`akFjDfGOKI$=Fs3l0kpaAiEhkt@p%x2Qobs!;1knm`o+68KV_M*A>i+gcT+PI&9>zGN%v)K7#8wSD~RZ*q|YSk8Sv_ zWF3f>Rev?H!h`@8`{3JAWuq^T?*kH!+QG*;t#B05p6%sYI>;c7#%*eW*jaR_9ZkyT zKxnH%32ynsH;Wj^nJpK}aUkaVO{$yuF)%J_*g7 zkA)@*I;#OXrg@#53RCn%=lp2#%BTHUa5PSzi$rTdez2z0Mo0Q!%aYi2){44Yn4G;}IJzF+O${MjSwYrAdFIdu{P*ta$dhs}}PyEX>4Tx04R}tkvm8OK@>$#q7o55g(*ZV zwooh6_`@m6%w^@cVnWE-Gto)8%x1fu<+CPD{QQ_wXhWg!4HV7jg_K}$oeJ; zB#3cfn8Tg9kN56?|1e`(ZhaUmJMY9MB3e8#uLWKR;0K0i)qhPlHyVvjQFDFX;Zx^r zNY$$S?$6bdTy{zbZ}_Sv5`2 znT?GJ2ZgnC6&qD-t~i$Ppm2B6vZcO1UgD(Ub;VYuV3zw-6E-i~b2Cbp-NgixOcO=J zpuj2_@`U8HMSpRL$$g}Tzq9C%ipvn!DyBHb$zq`w{ir|qovoW1=r2`jjzGh+=e_qp zU>m--Jn!qs^S+Ov?g=jKia&b@BOjt~RkZE{Xxo7EtBPjqz{MtXJmz#qFG_W?{izhZ zoys>Qp#27#7D~C5?>V`LS;=bZ8us>~H!ZanYs}qPoqyZEZ_4@o09fvFoKE6Ny8r+H z24YJ`L;(K){{a7>y{D4^000SaNLh0L04^f{04^f|c%?sf00007bV*G`2j>R@05~11 zB}F3u000?uMObu0Z*6U5Zgc=ca%Ew3Wn>_CX>@2HM@dakSAh-}000D`Nkl*CyLqk)>Ht*d-+;Lbhgp6~blzwbN- zR_q>Z^quU}_d17I?uTC<&OICW)o&{maWz654S#~-XKx*wZ2T_(pB`A1u&vUM(omZk zb*RoS$y@^-*`u(Q>To)`0X3Ma46IeFna?tg`4?v3c*!VtY!+irdF;pmK zvfU%D3yuq(2d1fIpPPksTXZcrcAN^Ol0pO*PQN$k-4}pNwlANTk4u9fzTgw$p}2Ro8)I z!~DE%rU^m>+g^Ak`PhN+dXY%nBDPl0ViE)VP0>oh3^ zME({cPTduNZ8uL#q0Cf%!AJ#!8bS!IfVm(Yoeos18mPYj1I3;SAVmA+6GPsPB>{Xj z>b({Q{*!%!+7VIg*oUYKkq?p5eSc=Gf@y(iKzT}oNC^XjkW4Owm>(T|H}%*Z0nQ#N z3`WX7oXP5{jzaBFbs&ga=xcd}h#fD0kP;^UikG6&E2rMjP@OIbqSpE2Z`(=YtS&Og znHzT9Af3uU7(f(h`Y4V9VpX`EhA09f)Xz%krCF`$&FRJsXm>ywP_IHZqkr6TB^$!@ zVt{kQ+2<{5?xl2AZ!S@!9Y>MQLht;J;vW%uVj1bkWqe2h%*<%OsS>Oz!dwl~DKHGq z92lQ&FH&G^Um@YSv&T~zJy96mu6Tr=xEFa8=_cZLQs^{LM|4Czr=7O$yLnTO zHO<>fxQ_TCP{u2}js?H`JLR_&@Djmx*Hea+I?9$S3J4)kYI%|>~q+0NyVhT$}J9`5|QaQx-7#m$a0d#POV*I&6p&G*4`aqA6g>6B~& z+jozs?;psm_*UWWUrU|8b}cA0TcwF~$`hd)2tOG6L#_O2S+Nycs{IYasqc-%MFide o000hUSV?A0O#mtY000O800000007cclK=n!07*qoM6N<$f*W2pwEzGB diff --git a/soh/assets/soh_assets.h b/soh/assets/soh_assets.h index c0acacf21..5ea41262a 100644 --- a/soh/assets/soh_assets.h +++ b/soh/assets/soh_assets.h @@ -8,6 +8,27 @@ // On Mac, not using aligned resource names was causing crashes in release builds // objects +#define dgLinkAdultHatTrimDL "__OTR__objects/object_festivehats/gLinkAdultHatTrimDL" +static const ALIGN_ASSET(2) char gLinkAdultHatTrimDL[] = dgLinkAdultHatTrimDL; + +#define dgLinkAdultPompomDL "__OTR__objects/object_festivehats/gLinkAdultPompomDL" +static const ALIGN_ASSET(2) char gLinkAdultPompomDL[] = dgLinkAdultPompomDL; + +#define dgLinkChildHatTrimDL "__OTR__objects/object_festivehats/gLinkChildHatTrimDL" +static const ALIGN_ASSET(2) char gLinkChildHatTrimDL[] = dgLinkChildHatTrimDL; + +#define dgPaperCrownGenericDL "__OTR__objects/object_festivehats/gPaperCrownGenericDL" +static const ALIGN_ASSET(2) char gPaperCrownGenericDL[] = dgPaperCrownGenericDL; + +#define dgSantaHatGenericDL "__OTR__objects/object_festivehats/gSantaHatGenericDL" +static const ALIGN_ASSET(2) char gSantaHatGenericDL[] = dgSantaHatGenericDL; + +#define dgHorseAntlersDL "__OTR__objects/object_festivehats/gHorseAntlersDL" +static const ALIGN_ASSET(2) char gHorseAntlersDL[] = dgHorseAntlersDL; + +#define dgEponaRudolphHatDL "__OTR__objects/object_festivehats/gEponaRudolphHatDL" +static const ALIGN_ASSET(2) char gEponaRudolphHatDL[] = dgEponaRudolphHatDL; + #define dgChristmasGreenTreasureChestFrontTex "__OTR__objects/object_box/gChristmasGreenTreasureChestFrontTex" static const ALIGN_ASSET(2) char gChristmasGreenTreasureChestFrontTex[] = dgChristmasGreenTreasureChestFrontTex; @@ -80,6 +101,54 @@ static const ALIGN_ASSET(2) char gFishingPoleGiDL[] = dgFishingPoleGiDL; #define dgMysteryItemDL "__OTR__objects/object_mystery_item/gMysteryItemDL" static const ALIGN_ASSET(2) char gMysteryItemDL[] = dgMysteryItemDL; +#define dgXmasTreeDL "__OTR__objects/object_xmas_tree/gXmasTreeDL" +static const ALIGN_ASSET(2) char gXmasTreeDL[] = dgXmasTreeDL; + +#define dgXmasDecor10DL "__OTR__objects/object_xmas_tree/gXmasDecor10DL" +static const ALIGN_ASSET(2) char gXmasDecor10DL[] = dgXmasDecor10DL; + +#define dgXmasDecor20DL "__OTR__objects/object_xmas_tree/gXmasDecor20DL" +static const ALIGN_ASSET(2) char gXmasDecor20DL[] = dgXmasDecor20DL; + +#define dgXmasDecor30DL "__OTR__objects/object_xmas_tree/gXmasDecor30DL" +static const ALIGN_ASSET(2) char gXmasDecor30DL[] = dgXmasDecor30DL; + +#define dgXmasDecor40DL "__OTR__objects/object_xmas_tree/gXmasDecor40DL" +static const ALIGN_ASSET(2) char gXmasDecor40DL[] = dgXmasDecor40DL; + +#define dgXmasDecor50DL "__OTR__objects/object_xmas_tree/gXmasDecor50DL" +static const ALIGN_ASSET(2) char gXmasDecor50DL[] = dgXmasDecor50DL; + +#define dgXmasDecor60DL "__OTR__objects/object_xmas_tree/gXmasDecor60DL" +static const ALIGN_ASSET(2) char gXmasDecor60DL[] = dgXmasDecor60DL; + +#define dgXmasDecor70DL "__OTR__objects/object_xmas_tree/gXmasDecor70DL" +static const ALIGN_ASSET(2) char gXmasDecor70DL[] = dgXmasDecor70DL; + +#define dgXmasDecor80DL "__OTR__objects/object_xmas_tree/gXmasDecor80DL" +static const ALIGN_ASSET(2) char gXmasDecor80DL[] = dgXmasDecor80DL; + +#define dgXmasDecor90DL "__OTR__objects/object_xmas_tree/gXmasDecor90DL" +static const ALIGN_ASSET(2) char gXmasDecor90DL[] = dgXmasDecor90DL; + +#define dgXmasDecor100DL "__OTR__objects/object_xmas_tree/gXmasDecor100DL" +static const ALIGN_ASSET(2) char gXmasDecor100DL[] = dgXmasDecor100DL; + +#define dgXmasStarDL "__OTR__objects/object_xmas_tree/gXmasStarDL" +static const ALIGN_ASSET(2) char gXmasStarDL[] = dgXmasStarDL; + +#define dgKakarikoDecorDL "__OTR__objects/object_kakariko_decor/gKakarikoDecorDL" +static const ALIGN_ASSET(2) char gKakarikoDecorDL[] = dgKakarikoDecorDL; + +#define dgTempleOfTimeDecorDL "__OTR__objects/object_temple_of_time_decor/gTempleOfTimeDecorDL" +static const ALIGN_ASSET(2) char gTempleOfTimeDecorDL[] = dgTempleOfTimeDecorDL; + +#define dgKakarikoChildDecorDL "__OTR__objects/object_kakariko_decor/gKakarikoChildDecorDL" +static const ALIGN_ASSET(2) char gKakarikoChildDecorDL[] = dgKakarikoChildDecorDL; + +#define dgKakarikoAdultDecorDL "__OTR__objects/object_kakariko_decor/gKakarikoAdultDecorDL" +static const ALIGN_ASSET(2) char gKakarikoAdultDecorDL[] = dgKakarikoAdultDecorDL; + // overlays #define dgOptionsDividerChangeLangVtx "__OTR__overlays/ovl_file_choose/gOptionsDividerChangeLangVtx" static const ALIGN_ASSET(2) char gOptionsDividerChangeLangVtx[] = dgOptionsDividerChangeLangVtx; diff --git a/soh/assets/sources/TempleOfTime_DL.blend b/soh/assets/sources/TempleOfTime_DL.blend new file mode 100644 index 0000000000000000000000000000000000000000..38500e0d7ed76e2995127757e3dec4197961f987 GIT binary patch literal 5413788 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

VIxG{eNQmr~XIr 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�d1Cgao}aWwySbX2B{x1v z_PLsROxL$Je^L2ynb{7Fery{&LEPnaN9Pl7Ux19iEA9)Bbui3Z6vq9+FLQo_`3&Ya z?jw4fkMd~eq}I{=eE}1rr8=ym{mGo)d_~4-uy@L_Sj17uI?}GNgI}3Ebje@OqPflJ z?hANo%g&*vwrm^vz%kdSKX42`Z>{{tHRm@HcUb=Lbf&z^5&bo8c~o);Jz|HS->eQX zpLe#fbJ;-c4{&~J%MNO@&!*i5%OB3I(dIX)K>j$28WnNhK!XpAL(tZ2OP+fs=S3J_ z;;x6qEsq$OFT6h>X};tdj4x=9TCFnpg1AS*7uFr*#Y(yZ9f4Iw9yWCcIs@HNKh(N| z@`x{a-HA38tEfA7h|a*~qxJQ7zo;+9AIC#^eeFMg5QtT*j6SRQdB>P|kR`OWiN)*Zw>l04$g zbL6}T<4auKh+96$mn3xue91N#U(g=4TG!wU;vNZKSa*;YE9nk&1XdY&*wh{940Ol- zzFgOkc@N@CTzAIDdwxL4eCKx28Q9z8SS;eGWR>U+?6)(ip+ko_?~m?$XXo)-hEgjB zhFTx}TDtYoZ&uVD$J8B(J1mcM9VGkHlGdHn%1zW}-$>gHmPg#bk2c@Q8F>V8k0g(H zx+CXB7+-o1l6`7P&v(F=RD;#(sRo4Ny?f$lgD zY2872#FM!09M93z{=t0bC3BtaR?!*Q-Eu58tS0v}qPJpi+v22$4*Th->&}ZqZu-Tc zN7C~$AIQwhe6VEy0OH7+x+8Ii<&n7amAK`BKk4hkFAhCSZFX!%HCP_8Z;z%s*+3rg z?h}`|%dgW1t`E!k5XO_Z^OU&dgFNx>ze(tQdf-X^(>gz(p4Y0i4W1zGYCPf0jC@#0 zXP_If%E-H>&Ole7GwyeFzD0SofATsL?UH0gow-GH1@>k+7K=D4Sx58*_Di>KOn*T= zGU__BfB)Ch`}hA#dfnmg&8$28FDmMcZR(7~9hN`h>O|b~!|k8!zJdMw|C!qCn2g(C z`NN5*Gbtl~Anwq819Cou@g%NJ#4R7>Ns{+@f+x8KM))b^V)c!IdA@q~2-d9aes zKsR8Ok#|jc z-IV7?cO8x1j5hSt6;JK`*}K~_KYRDGiaL`rbw=V2%O72@(RH+^u6T~xtRv$zSpIM$ z?u*W+HNXAqHxlDT-}IU9_^pB?u`A~@ziFM zGpfPzh>EB?StE}i?vdmXPj}?J2;)m!-H2O0$d@E_2YktI(&rKCd97O8;0xj&317VH zIg%GE=?-)RRvCHN)E(#ybjRJR^DoMy9}?G{<4=I=nk=s8l)S%lyXXw;HaQj>R*56+ z3d`4X?)@NNw;$bgHeAm+^5k`yBTv4tqVBk+?nvBWc_glG#4SJE56NH8Ir8KU8Mndm zh>EyhEfvTkyl((;S6ip|^hVByFrLKKi@4>3JW2X`4)Y|}U_2RakJ^4y22T)oHJ*6a zb3$|mx&f<28MC*qbz`zO6W?Pc1Z_T9S%Gfso$ z4>#hzfqbjxH_vaq=VVFT)%G2EIwR*p7*FErMBMU0o_IQw(Ec>=B->y-L3`9{U4tix zyBbft>o*}f1KogCM&31b2D$>Bv0we(8~J%-D37=j*O>_%P3<4dXG+%5E*D*ay;P3H zhSj8`U14{3TsAa+?db1=?mOb)p}r&b4Lz{y1DOYQRo(~fm^veIhvkpBIuW-#`l0%J z)%x+Z5!=2aTxzppGj@aJ4?E&~CTHXi#2tM8ku=_5fgU#CueZwi5XO_ZIuW-#I-Ysr z=}g(@WJTvms=;`I_Ndi522T)oHJ)&0MjouRZU)`(t&w+4oq?`EXPo_7XHXt-C9X3Q zosE4H?K(V_~!Oe-v_UphN+u#Y}uErD2%*cn8bOyQstBkyB>I`%RI^({gbq3|p z{>kf1!s}+Ih_1k%EXQIIMWppbjKm$5KjP{{ z-12Dudg#oI3tmaP4VFJt#OK(gjQoMPtK|<*XXJbc<4Ihdh+96$lcaTqd6H`|o}fKy zwaVZL;;zOM)*0l%N;(7GfK^7`HFXBM0-aHR)H;Lmh%0%WiMRi(WIl6}=nCwKax4~c zRI;|{3~b-g8`7V6=#o*_nVpZ_livB*1L-I3`WF3sx1!FZOr4Rq!}3R5orqh0xc!se z2e9+8`>4IXopu^5f4C9nGx;f+-~RO(iM!hMT~BA^d^%$Kfq`NNJlpUD~d194Z&AD+(0`4GmFxH=KHe2^ze>kRWG)nGgsZjai2 za}1s!?rJ)EVdsbjJCET%VD74Wde1XO55d&L->wc*T4k+Bne_ z*yH3_EaIqS-R*LHMlA0G=vtp^9qoP1*avXS-Osk3vH0+cI+LHP>`SS;eGWF2W&*fnpwU})@n^P{dayS{zz(5`RaHMH%WA53q1=ZO_{#x-?D;ttCn zadjeYd9;7h_igU__TAKG$EDo{%OC2NXgZS$HDl+i%WqQlc}kACzOUh@+CVMR#ETo!&Fhmz^`}_tWgA_Y6#?_YAbn{#>SQ_U9|# zPh;wi#2uDL;_61+@@W60b!RfYXP|BN%^9b`@`xMpc>(#!n%_LXW!*vCBgrG4?#Ou& z#+SId5x0DhFG=bS_>yffzMws7wXVSz#61$eu(u^TLpsEF%oIU|oC?vdmXPj}?J2;)m!-H2O0 z$d@E_2Yg927+=sHwOYsE3*sILUs!jL7c1!wbi}tt9yWCcIs@Hteka#+WZr}LlGmMa za9xwd^_&vjX%U@){R=r38&-*XwOr2;+d}X2JYit!sO!!mdY|VadY@P*M%?m2z9gwT;7fjk&J(ETwQ601FNk|2d|}-|eypTB&=FW=DT-}IU9_?R`eFWQH-kNb6ERQ%*pC=H=Bi{4TB<^b0hdsTK^C65UarGi@ z`5;eNZ=3}85in134aO6+N3GT|c!IdA@q~2-d9aesKsR8Ok#|jNzLc;56M~SY$zFUsPB92Pd7M+3ReFR7SaMGyj4E7Ps`|0+~yr1r3XC&^h z{1I0t;+9AICq2L6>%#MXdQHY@u>4_1+((cNJD@Uy5syxuII?S2XQ2>JL3{wR~suj1N(M47K=D4S$CUU z&k@V-SzEqr$*AiN-m|uK#@}bQ&iHag-O10<@%i`XNZet0B<_4AZh5qS((@gDZ`Rfs zxr}PCJfi*~n(pKuFs|oF+#|^&p6JD@Uy5s&ruII?S2mO$^?o3Encit*G1N&w<7K=D4Sx58+ zmfy4X-BZsVb=|>x*51?mcbWI}eyO7FxTfw%++lenu5QFFkM>VmclfPFo1LB1rZJK#&M!T5sqsMR_KUl8|5_`KVDdBl8}_m$>dsjQ2c(l6?e9bO!ctITnjJDp^}}2llC@V~4)b zzF^dKXU@(gLvwb{8T$GgzmWO*8^2glcXFogNZet0B(846Esyq3T6gB`TtscQJL5E1 z9&x`AZN8H=@(AJ{NgnZZN6w2dzQomyxaEU{m$6Tsoy!WqV71R?nvBWc_glG#4SJE{>eUX?bsQ= zr8YYvV>ehHQ8!1^om3!?@cuQ#UF|tqp5Dm$5XO_ZdJ(sLkSDA+PD0Q11W!^8#*^Xp zsO>jp@C0#JCT%Cwpez+f!*O{5? zF3G3{%OB3?qv=fko5R<0SZ5G-wfy1fjGPZ)Jc+9lamxpJlC;h+Px9;ZICQw4*XD1o z!4t$?jVIpq8_9!}<}=U@SY_m0Q)i$n&>8nhou5%2t)INkB)ng3qv#6kdN~%0I4W63 z+7))qA=eK5;=2<^U1!FP`H!J-V}3N$edFbs?i-zoI%AtUBXNi2kGMJ!xBPJXC#y5# z#{87p?23%rVEMz1s53bue<1E^`Q!hw_bqU8R8{(w@bE5+iY~fQP)9}S6=jp~5Lkqn z=_VE$Vk99VvP>pPCp|Km877nPSbi|8sI|f>Dq=(ygGRRH4FUqo;*c5HLO@uSMbw2q ze*|rnRsJgSScLz*b-%Bs`gV2K^sVY7y`6^6>8h!7?sx9}>YV$iN04W5J|yuZZJtQ0 zALU7wd4@bGw;4~S>!Z0}p1~9P-H0c_dQC!}Vcwt=M%*>?4D$-}jCe%HXX?|d?DI^z z^_rS_vkk~Alw;V2q#yO9i+ZJ0d8X^0A8z$|Gv=8&Z+Jst&KurTH_znEJOjUz;z!y% zkyd}Y{+UrjZIb!O9IXh3iX~S6IO&dp$B(bHSWlWu0v(h&GEK!ZOcPZZppnv8#-it z#^4G4Zp4#deFkx`?)nVIBg`Mdh`VN?4D$-}jCe@LXX?|d?DNcfX}T#{H_xm_UZGrtZOEiT zT;v%_HJ+J!*c-Qcp5b`L{mA=!H(&9|x_PE-<{9{%6hG4DiM0CD?T~GrQTOhiXTCq!TFHHleBpvt$vgzS>_q?q||0SnXZrKez^uu=yxNYs64|s zSTD~oZ%_&&?wWaqd4+k#eNe||>eH+2^GwF~&#XXRp%sd0Xlj29(JdswP^`G^9o5#!hHm})hZozG{ z_~BXJx0#E?k2$hZ>Gw?T!wd2a&Wj|zq|Fy;^`m@I`6jFPdy+4?HscHHqgg2ozR>TP z@I~bv#>IMhhj}EFMjSTt4)YB2j`slKHO4vgFY~-JFWvn#FPQK5JPEidPsBDP{irAX zf53VTC4G@$a_!_-5zj*X4I!eoMaV`73+7p1-H=_@-p$9r&FTN7CkvwEENa zpY8Z&=jAubI=ih`v{@W+ueZFP=3k8U8u;C)-x}l_oDWGnNt-Xy>PLB!<@km?sjTmi z^%{dG^t%yHRGwixte0n)Hzcg;M*yuv)=->>5{_1WH;=b5?6o8~`t=h03;UZFf5 z+mJ~mdB`u6>-|&mhxdMSa%->G9KYXJm8Tg$PKhoxj zwEENDWSeJ>Uv{Icvp-DwZ5BT~%REyy;s^b16hDGIgYzMYCu#FUTKy0d{qhW+(CeH*I-+KP|vu8Wbl2ZSw z;^?B`RmG*n(~e%-zoy6|W+tW9yuSI)+L6KHd}sf;bDMq3&2F=2IiGiCIW^;%WymX( zOR;^dmP99>f7>YwX325k>wg%$|B(Al`R6x0zhz?hI605DyZricT#<_%TPT0Jmh>xs zy6m1LYL@&rGPm5^<8=RH-kJEOEc@~;j&plW**P=M!0)8^v8=dqYtjy*`97opM_{O}~X7R(_Y&V`MMdHUCS*i59-n@ve_wggc>lJZ+kT1eGPuNcR z;lVU?ankA&$84uCJIFT&-O{hlUloCt46i)7IA&YIrXI(+BwuPXzOX);m2QMD>Uk3M z`zx|8<^MIGkSE{;dBOt)_`~g8Q(4e#2iwzspT<<9t8n2P98a7( z_Uk&`Q4eiZ57qp>_nw7E@~hpb{a59Om*q!E<0H@f=}+|UDt}xncW^wx@r8S@?vHca zLG4V(7Y796ivuzpUo6IWf^reI7uFeHyt?uD;-IeQw=Dm~U&;Rc%*PjYPr6|ZQ(}BE z{?WYC{YhEAJ1KMA9sDb$Fvl10+w2GMc*?ZngS7g@(US3nGm_7>SwBEnjxR){AE3q; z^n1qR3!ES1i!ja;wv%n|Ju7|MY0dcJ@A9I}_`>>VR#t8`*4N;7;`jo*AWvAX0Drih zc6^XlpEw+jLo*#;6!Vp_4q0C_ctXDu#}~+_JH{6rizvBcJR;A_9rdtXjZYOP`E?wQ zEtH&&q1C_CxWRUO!SMvg7vA0Imt!4+C1pCkI4~Gr9OyK^eBsnxzxV)fQ@Yq*P-lE0 z8jml!<@loO9WTmtgPD&n?5;3l4O4P_@t1jLyij+1QCVc%KM%jnegLgfrX3%o)hCYD zj4$@j`)$?_@Gr4jzbHrg0cw0fzh^wY!1+PG2;)3qJN@q-UmTh*w;5m9F3n0W!WXrE zLBA8n7vKeX!g2-p!|k-=gS7g@(VFqa+w)$B@T6q$gnlQEFOW}nj4xDwnqSqA3w|ql z^0$;b_UroCQ4d?c9#oz4+xqbZ#}gc1_;>04IL968#898iufv^}?m3V(*GCmFo}lc- zHl+5V{=Y7+!=-fYIVFE%nqhl}$ei6?2V zqfM(H;GmsUPjkdK6Takvc7urxi*U*;%d8jEMdeC`W-(n5xM>r=R*=t z(&mY@`ca-_dHpSUBHD~6tdC}84ML z86R&RsPc^Z);!n#Cg8pj^73j)JL2It2lo|no6)%(X z{8>NPKUVBY;}uaTIo^B2r!SUk^6!&#WWUSE2MNi6`I%dBO%1;19QTJh6K>ma-vvBGV47rI9V*iF3%5XfvJ& zOP*A2Hs)L5cNI^ZGbB%(?y9_l@tw&NvnBO>N1yd2(~>7WYlqhl*{!}s(G;9a*MG<5 z7}0rVvNGCU^J>u=Y38?Y@PvL>^F&)DPt<$~$Mf~(OE~{QDL9V+ewp(noFCzQiN8hn zcc>rwbin70`4Y{cc*O0crGb?v4;9y~t<`yZ>EVE_VoD+z4NS z`~y!A6JdELf;oBhL0 z$cL1dU>lNt)RQjO(mC@e6uHt9{!~u2vikMvb=7CJSnvqPi$*a7(Aihjd-HwAs7ei z%|kG6PzodNn)49ME6g+QOLqm&Nv1yi%Qnx<>*{grt{q^W`MsHEE=FFVya?Nn^rM~> z$TO7wlEVu3Z#Z>^d8Vh!eucXl(L=X?w(!vH=N0z;>bHCM{_0(I^NcX_4E#=tA3>g} zF0!eutn!TG?3`)8@}b+$m34MYuiIwv!@tQc&s4r!J>N~g8}%!LJcIKgi6=VGG)0Z7 zgR{yr>bi|A=ex<1T$}Nvs&bpy@C}~O??yaPd4_SYUY=pz2&EBs%{;@r!aU=>sPhc< z=~7mC=GdaVtZ=L-J4$v-Hg)sNM&uRB3$YDJKk7;UGq?^Nvg@Gk!o=nOoSbLs8MNI0 z@V=ifJiPB03SHyB?%iWzm%8(Jm1B(O_Q3C?`0>AWJoE6r=gT_#pI*^s@x%SDU7jf$ z@q>Oh>Zb;I2IoT(PjsI7-#4BiPb#N$#=5F!@PvLh;)%*LjED8|4D$x1FygM6XP8%* zXZ#m*o}oU&WmearAJDaUcwlI(YhiJ8Bw(?6f5y6*^Lh4ceI5Gq=6L1;W?!jU-#1$JWRbiHlK`)w9K z#ASAQrewqq`rRmg1bGI$2zhco&J*y5gwQ-Wl$%Y<9?6sb6#SSjFzf5Q{9z-3C)PK% z^kl@7*2I%H;tf+VR9SctXDu;|X{{p0EW4_`_}R#BR}58VPu^ zl-AP7R`8_M>$MqAJj?fWuydY0lt^j|y4W7)iok7X)Jsp`|hZOK+{8xFm zLwHiT(U?Dh-;LslS|9eXe#!M=u4j@TT<@h6TsH-eqU*!K^|OY(&<^&~4kgze8ONgb zg8MYEzRdMz@w{GdratXwwcZ@ur_ndxu}!eEg36IUq5PbfI!pONd#U!8QE$9tXblM2qJ zPu1M)TsGI6;XmV%IJnwx+DHF}n@!8EE_vy52A|o^l)ip8tMwsOZ_d&!xi*VO;zGNA zuy4d8`W>IQBF}LKFG8Lii1P&eVbf}!*pI8<)72%AaYggQ?p_Gx)4RHAE~T+@wKehNH(M&h?KMy5f7vdccm_}C zcOp-~i;yRC!4vR@jj4HJfBnjSH5rhWo0F}HCvztKHseWiwKjcp$>0h7PUH!A5%Oez z@C5u}3Fx0#kE>Pxq^qCS(n$TB0WYij#)G_b=w!J=c;Xs7q2GAt7Aw0<$JfYu-JOM94o^ad;{un&5?x4v2Nj5ZLKQ_~N@^_P^ z4&jL~ctXDuc>-RLC**|yf4Gf!V%i+l(ikWk0rZgE3DBzY}?a z`6BW}81qKt$@VkvKb7h83-p}RSZ}V)c*1sRR{91{=y!ZSHZt!IUXUj&SAaj<22bYO zUJ$q4&ie;*laKX?4&h1J;0gUU;|bectq%qF9~<-ZoLA;?yswK=aQ+%Riq6vq_nBc{ zn(GL(6V6*>9zV3l{t);YwWsF&InU2|fA?8DHv@J;`{K*t^(?q2nSW|ZhW9fcY&TQR z`_Damk?e?Rjr|CT@VE%)U&9QL89 z4TpVDmLLD|%z1zKZN?*0JLun-JDb=}t3O>-w%0YB`Ift7ogFh(8EUV2I`3Z!?}u*GF@|N(N8pcO#wz>(zDg z3`=L;2&EBs%{;@r!aU^UWvUJ@vvl$IFHG`tNU){&WQnb=i8v5-IQRxozb&@;wCSPdS_Z zUgnv7dT;yLKi4ewyJnt&pEHXe_7Bd;&ev@Fsm{2pvo3F{)FJUh81aLCH;Ny@b&EK^ zdA^I^;krfiFUi8ppT{=eZfTnR%KtIWckxD?-;{H(4M{)hNr5;@`PBbAvT(x2+*a>b zp7PA+3a31Ce&I7uoHg~CC(fwbugsa}JN!;M-_!OB)9SPSv%YWilxIFK>+H-ax6RIX zagE*lMddrj`V9PzpLdU3w}|s0i6?3Mg=zJpJjwF;(&S05&3MB4Xjb|LPw00eo&@vm z3H?g;3n|0+3x1jXO6C>j8TV<-lOzAouk7=T-J@CR=9$+cuTbuZZAki2Px_z2b3Y;9 z{llXQ#W`==>UrkU6TVcq^n@=LHtw^2YU4hq)Xg)(%ro#iDSo8Q6KVBX|Bde_9^+v% zmY1GzfvmH2Q=-k{hq%@*&y%p0LJ;;xxzm{*u*yx(A+9OIhMZr1bU^X=}$VxD=? z9M8NKd4+NhY(vtIdeTF^Ql5L_L6h5JJX6}`yvfoo=S(JzXDSQzc@o|i3cr)$N7_7* zR-g5s^?0VVizn;s%qhRk;)j2=U7jf!@q>Oh>Zb z&+LZ0LMgBfNk8gIfjmR`kKg`O{@i!$+q<=|FI{@pRDS7M_v9Dfd_r&T#DA3K$A8LZ zo`K&<@gr@XNUKk8X5l$};(g}(;g=QFN_}BqRLX(jAu1%urDyrF&d%s{+bn*Fi|ocT zmFuV1XXePdq2GKz^y`iKs=3Y-=S31<(&me_`gB9_Mdh2U`I2ihzOX);mA=6j`aKiA zsJz3tSTFA|k5CFD4x4$0d4_q%{Uz3GFwUWWS>>Gt!)x#;H@ipGGVjz}Z@Me;4CT() zhNK_$q<;?9YasXg*}BQeTkn(46l(n5Y3YxCV@^H8P3~X*t6L|R|LXe5*WUA{sn_1~ zhPvY$&&)gUJ1LH&%^PX;Sshu=qb>i{O|s7Rni6dmN4&4v<(+aQj;Qy{)9*&}Bf*X2djZhkK*UU4_E6g+AFR)&N zaSq!%!#s1;Q2&a-A`Lew>*kr+$Sag*!4Jr!Vm#y*N|k4JS#x`0p3%;9$#j!c!p#28 zJX5%LkEz1FyVuP#B{R>!@1*#VHczD0XDwtskEY^B;oetG`E3?Ie9JsjGU5mQZZtm< z6Z+kVCo0b{4%W*v%o~)#h`VNZMrOGqEzd89n?ZBT5M>Nbc zgRlG0)Zpvt->2=Gc?Nzb#gDXkBCS5_zZK(|!Pgx#<+WM-5F72rGdUxE(C!VpI44%;MMm$k@hH$TO5G&+N72HHp^+z@N-A4f9O- z#g9#uU;Iej@l4LlGw?epex%J4Y4utEt;jRw7e6}Xwpsk}zhakXD%VY~*Qj|j`rRmg z1bGJMLlRHY=83fWQJ!R-XB1CzZN?MUN3+s5ctXD$@g!KEK|HLNXP7rAg%NknJj1-g zJmWsD<1_W?S5|pu;lP^GShI`11R-VJJTr#8LOF_U$cTy9pZ+JYJ_D)p%$w({^^wNw zGl4%{DI7A;FweZ_?ln{IxqD^ZJR{6J1HY5vN7_7*R-f)>eO-W>4|&hs#VOHd@x!ys zGv!G9m?JBde$Ql`H^?_QFOv9@HeaOGkMc$3o2;%2AYUpccgQ-8!58{H6TYat!}wS) z?=X*q(ul)m-eI0$-titoyv8_(?VeTM37>a(K)UAz)I9HS1h^@OunkE+>PZjzhH`xK z*YB9gJX$?_w)>a=%U^Dp*l^7qN%Lrx4;uH^!0)6uk~VLo)n~nAJ-(UP@LO4D$4vQc z7Dv1*?Z!8yNE}h)8~WX--x}l_oDWGnNt-Xy>PLB!<@km?DYqFiA53`jvg2Np~M-O`aJ zcg;M*yuv&q9?|ic`t&RNJd^QrX-dc|l&i4~Nk8gIfjmQb#ZQjUA9L@SiPxXivuC}3 z^Cfv_^JV!LzIw;x3tzoOmLLBqn|TI)C&iDnc_OVoy~#Y!Z2pF!Vre8$6-kjd-H+4C7$EJj1*} zDU7&l<{9P{<{9^=IzCgMer29#=G(oBi|aKt&)Hmsyh6DG+mQ65p7cL~^%}@0f6<-a z^s$q-dY*aes`K(sU3EeJ=5ubCy!o6f>*g8H%ro#iDSo8Q6KVBX|5@jmr>;6**4ed_ zqRrxmXPIZpM*N`Pjp9d;XK+3w@g!}YNUI;^NtStrJgI!VL)K{wp3v_`JPFok5C`k! z8Rm^p8gbXmGt4W@Gv1F8pE0gsduN_!4oLT&kecV8EeCGOldug*Kk7*j^-8JMXSPM2 z;rdKco++7m27V{SkF5N>pY|8-Bq6P+bn(v%REyu;s^b16hDGIgYzMYCu#FU zTKyoW;?hIxZh7;)FkGt4W@Gyacse5OAA%0ADe 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
cx}d$I@O%G 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 z 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�=;RD1A|XyH22L1vY&`)ke4LyOoB%(= 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

;1`0dP5%^G$8tHa`NpSD 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 z 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 literal 0 HcmV?d00001 diff --git a/soh/soh/ActorDB.cpp b/soh/soh/ActorDB.cpp index de2538888..4a629c53d 100644 --- a/soh/soh/ActorDB.cpp +++ b/soh/soh/ActorDB.cpp @@ -609,8 +609,59 @@ static ActorDBInit EnPartnerInit = { }; extern "C" s16 gEnPartnerId; +#include "src/overlays/actors/ovl_En_Snowball/z_en_snowball.h" +static ActorDBInit EnSnowballInit = { + "En_Snowball", + "Snowball", + ACTORCAT_ITEMACTION, + (ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_DRAW_WHILE_CULLED | ACTOR_FLAG_DRAGGED_BY_HOOKSHOT | ACTOR_FLAG_CAN_PRESS_SWITCH), + OBJECT_GAMEPLAY_KEEP, + sizeof(EnSnowball), + (ActorFunc)EnSnowball_Init, + (ActorFunc)EnSnowball_Destroy, + (ActorFunc)EnSnowball_Update, + (ActorFunc)EnSnowball_Draw, + nullptr, +}; +extern "C" s16 gEnSnowballId; + +#include "src/overlays/actors/ovl_En_ChristmasTree/z_en_christmastree.h" +static ActorDBInit EnChristmasTreeInit = { + "En_ChristmasTree", + "Christmas Tree", + ACTORCAT_PROP, + (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_DRAW_WHILE_CULLED), + OBJECT_GAMEPLAY_KEEP, + sizeof(EnChristmasTree), + (ActorFunc)EnChristmasTree_Init, + (ActorFunc)EnChristmasTree_Destroy, + (ActorFunc)EnChristmasTree_Update, + (ActorFunc)EnChristmasTree_Draw, + nullptr, +}; +extern "C" s16 gEnChristmasTreeId; + +#include "src/overlays/actors/ovl_En_ChristmasDeco/z_en_christmasdeco.h" +static ActorDBInit EnChristmasDecoInit = { + "En_ChristmasDeco", + "Christmas Decos", + ACTORCAT_PROP, + (ACTOR_FLAG_DRAW_WHILE_CULLED), + OBJECT_GAMEPLAY_KEEP, + sizeof(EnChristmasDeco), + (ActorFunc)EnChristmasDeco_Init, + (ActorFunc)EnChristmasDeco_Destroy, + (ActorFunc)EnChristmasDeco_Update, + (ActorFunc)EnChristmasDeco_Draw, + nullptr, +}; +extern "C" s16 gEnChristmasDecoId; + void ActorDB::AddBuiltInCustomActors() { gEnPartnerId = ActorDB::Instance->AddEntry(EnPartnerInit).entry.id; + gEnSnowballId = ActorDB::Instance->AddEntry(EnSnowballInit).entry.id; + gEnChristmasTreeId = ActorDB::Instance->AddEntry(EnChristmasTreeInit).entry.id; + gEnChristmasDecoId = ActorDB::Instance->AddEntry(EnChristmasDecoInit).entry.id; } extern "C" ActorDBEntry* ActorDB_Retrieve(const int id) { diff --git a/soh/soh/Enhancements/cosmetics/CosmeticsEditor.cpp b/soh/soh/Enhancements/cosmetics/CosmeticsEditor.cpp index d99519efb..5f4739478 100644 --- a/soh/soh/Enhancements/cosmetics/CosmeticsEditor.cpp +++ b/soh/soh/Enhancements/cosmetics/CosmeticsEditor.cpp @@ -48,6 +48,13 @@ extern PlayState* gPlayState; #include "objects/object_gjyo_objects/object_gjyo_objects.h" #include "textures/nintendo_rogo_static/nintendo_rogo_static.h" #include "objects/object_gi_rabit_mask/object_gi_rabit_mask.h" +#include "objects/object_wood02/object_wood02.h" +#include "scenes/overworld/spot00/spot00_room_0.h" +#include "scenes/overworld/spot04/spot04_room_0.h" +#include "scenes/overworld/spot04/spot04_room_1.h" +#include "scenes/overworld/spot20/spot20_room_0.h" +#include "scenes/overworld/spot03/spot03_room_0.h" +#include "scenes/overworld/spot15/spot15_room_0.h" void ResourceMgr_PatchGfxByName(const char* path, const char* patchName, int index, Gfx instruction); void ResourceMgr_PatchGfxCopyCommandByName(const char* path, const char* patchName, int destinationIndex, int sourceIndex); void ResourceMgr_UnpatchGfxByName(const char* path, const char* patchName); @@ -173,9 +180,9 @@ typedef struct { colors were darker than the gDPSetPrimColor. You will see many more examples of this below in the `ApplyOrResetCustomGfxPatches` method */ static std::map cosmeticOptions = { - COSMETIC_OPTION("Link.KokiriTunic", "Kokiri Tunic", COSMETICS_GROUP_LINK, ImVec4( 30, 105, 27, 255), false, true, false), - COSMETIC_OPTION("Link.GoronTunic", "Goron Tunic", COSMETICS_GROUP_LINK, ImVec4(100, 20, 0, 255), false, true, false), - COSMETIC_OPTION("Link.ZoraTunic", "Zora Tunic", COSMETICS_GROUP_LINK, ImVec4( 0, 60, 100, 255), false, true, false), + COSMETIC_OPTION("Link.KokiriTunic", "Kokiri Tunic", COSMETICS_GROUP_LINK, ImVec4(255, 0, 0, 255), false, true, false), + COSMETIC_OPTION("Link.GoronTunic", "Goron Tunic", COSMETICS_GROUP_LINK, ImVec4(255, 0, 0, 255), false, true, false), + COSMETIC_OPTION("Link.ZoraTunic", "Zora Tunic", COSMETICS_GROUP_LINK, ImVec4(255, 0, 0, 255), false, true, false), COSMETIC_OPTION("Link.Hair", "Hair", COSMETICS_GROUP_LINK, ImVec4(255, 173, 27, 255), false, true, true), COSMETIC_OPTION("Link.Linen", "Linen", COSMETICS_GROUP_LINK, ImVec4(255, 255, 255, 255), false, true, true), COSMETIC_OPTION("Link.Boots", "Boots", COSMETICS_GROUP_LINK, ImVec4( 93, 44, 18, 255), false, true, true), @@ -346,7 +353,7 @@ static std::map cosmeticOptions = { COSMETIC_OPTION("NPC.Dog1", "Dog 1", COSMETICS_GROUP_NPC, ImVec4(255, 255, 200, 255), false, true, true), COSMETIC_OPTION("NPC.Dog2", "Dog 2", COSMETICS_GROUP_NPC, ImVec4(150, 100, 50, 255), false, true, true), COSMETIC_OPTION("NPC.GoldenSkulltula", "Golden Skulltula", COSMETICS_GROUP_NPC, ImVec4(255, 255, 255, 255), false, true, false), - COSMETIC_OPTION("NPC.Kokiri", "Kokiri", COSMETICS_GROUP_NPC, ImVec4( 0, 130, 70, 255), false, true, false), + COSMETIC_OPTION("NPC.Kokiri", "Kokiri", COSMETICS_GROUP_NPC, ImVec4(255, 0, 0, 255), false, true, false), COSMETIC_OPTION("NPC.Gerudo", "Gerudo", COSMETICS_GROUP_NPC, ImVec4( 90, 0, 140, 255), false, true, false), COSMETIC_OPTION("NPC.MetalTrap", "Metal Trap", COSMETICS_GROUP_NPC, ImVec4(255, 255, 255, 255), false, true, true), COSMETIC_OPTION("NPC.IronKnuckles", "Iron Knuckles", COSMETICS_GROUP_NPC, ImVec4(245, 255, 205, 255), false, true, false), @@ -462,6 +469,24 @@ void CosmeticsUpdateTick() { 5. GFX Command: The GFX command you want to insert */ void ApplyOrResetCustomGfxPatches(bool manualChange) { + if (manualChange) { + PATCH_GFX(object_wood02_DL_007968, "Tree1", "gLetItSnow", 17, gsDPSetPrimColor(0, 0, 255, 255, 255, 255)); + PATCH_GFX(object_wood02_DL_000090, "Tree2", "gLetItSnow", 17, gsDPSetPrimColor(0, 0, 200, 255, 255, 255)); + PATCH_GFX(object_wood02_DL_000340, "Tree3", "gLetItSnow", 17, gsDPSetPrimColor(0, 0, 255, 255, 255, 255)); + PATCH_GFX(object_wood02_DL_000340, "Tree4", "gLetItSnow", 24, gsDPSetPrimColor(0, 0, 255, 255, 255, 255)); + PATCH_GFX(spot00_room_0DL_0139A8, "Path1", "gLetItSnow", 23, gsDPSetPrimColor(0, 0, 100, 150, 255, 60)); + PATCH_GFX(spot00_room_0DL_013250, "Path2", "gLetItSnow", 23, gsDPSetPrimColor(0, 0, 100, 150, 255, 60)); + PATCH_GFX(spot00_room_0DL_0143C8, "Path3", "gLetItSnow", 23, gsDPSetPrimColor(0, 0, 100, 150, 255, 60)); + PATCH_GFX(spot04_room_0DL_018048, "Path4", "gLetItSnow", 24, gsDPSetPrimColor(0, 0, 100, 150, 255, 60)); + PATCH_GFX(spot04_room_1DL_007810, "Path5", "gLetItSnow", 24, gsDPSetPrimColor(0, 0, 100, 150, 255, 60)); + PATCH_GFX(spot20_room_0DL_0062D0, "Path6", "gLetItSnow", 23, gsDPSetPrimColor(0, 0, 200, 230, 255, 30)); + PATCH_GFX(spot20_room_0DL_004460, "Path8", "gLetItSnow", 31, gsDPSetPrimColor(0, 0, 200, 230, 255, 30)); + PATCH_GFX(spot20_room_0DL_004460, "Path9", "gLetItSnow", 118, gsDPSetPrimColor(0, 0, 200, 230, 255, 30)); + PATCH_GFX(spot20_room_0DL_0065E8, "Path10", "gLetItSnow", 24, gsDPSetPrimColor(0, 0, 200, 230, 255, 30)); + PATCH_GFX(spot03_room_0DL_00C4B0, "Path11", "gLetItSnow", 23, gsDPSetPrimColor(0, 0, 200, 230, 255, 30)); + PATCH_GFX(spot15_room_0DL_00C748, "Path12", "gLetItSnow", 23, gsDPSetPrimColor(0, 0, 200, 230, 255, 30)); + } + static CosmeticOption& linkGoronTunic = cosmeticOptions.at("Link.GoronTunic"); if (manualChange || CVarGetInteger(linkGoronTunic.rainbowCvar, 0)) { static Color_RGBA8 defaultColor = {linkGoronTunic.defaultColor.x, linkGoronTunic.defaultColor.y, linkGoronTunic.defaultColor.z, linkGoronTunic.defaultColor.w}; @@ -1362,8 +1387,8 @@ void Reset_Option_Double(const char* Button_Title, const char* name) { } void DrawSillyTab() { ImGui::BeginDisabled(CVarGetInteger(CVAR_SETTING("DisableChanges"), 0)); - if (CVarGetInteger(CVAR_GENERAL("LetItSnow"), 0)) { - if (UIWidgets::EnhancementCheckbox("Let It Snow", CVAR_GENERAL("LetItSnow"))) { + if (CVarGetInteger("gLetItSnow", 0)) { + if (UIWidgets::EnhancementCheckbox("Let It Snow", "gLetItSnow")) { Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesOnNextTick(); } } diff --git a/soh/soh/Enhancements/game-interactor/GameInteractor.h b/soh/soh/Enhancements/game-interactor/GameInteractor.h index c01af8c4c..1667cda00 100644 --- a/soh/soh/Enhancements/game-interactor/GameInteractor.h +++ b/soh/soh/Enhancements/game-interactor/GameInteractor.h @@ -486,6 +486,7 @@ typedef enum { extern "C" { #endif uint8_t GameInteractor_NoUIActive(); +void GameInteractor_SetNoUIActive(uint8_t state); GILinkSize GameInteractor_GetLinkSize(); void GameInteractor_SetLinkSize(GILinkSize size); uint8_t GameInteractor_InvisibleLinkActive(); diff --git a/soh/soh/Enhancements/game-interactor/GameInteractor_State.cpp b/soh/soh/Enhancements/game-interactor/GameInteractor_State.cpp index 21642dded..38d125786 100644 --- a/soh/soh/Enhancements/game-interactor/GameInteractor_State.cpp +++ b/soh/soh/Enhancements/game-interactor/GameInteractor_State.cpp @@ -36,6 +36,10 @@ uint8_t GameInteractor_NoUIActive() { return GameInteractor::State::NoUIActive; } +void GameInteractor_SetNoUIActive(uint8_t state) { + GameInteractor::State::NoUIActive = state; +} + // MARK: - GameInteractor::State::LinkSize GILinkSize GameInteractor_GetLinkSize() { return GameInteractor::State::LinkSize; diff --git a/soh/soh/Enhancements/mods.cpp b/soh/soh/Enhancements/mods.cpp index 9a0e80a51..5059d9b83 100644 --- a/soh/soh/Enhancements/mods.cpp +++ b/soh/soh/Enhancements/mods.cpp @@ -50,6 +50,7 @@ void ResourceMgr_UnpatchGfxByName(const char* path, const char* patchName); extern SaveContext gSaveContext; extern PlayState* gPlayState; +extern "C" s16 gEnSnowballId; extern void Overlay_DisplayText(float duration, const char* text); uint32_t ResourceMgr_IsSceneMasterQuest(s16 sceneNum); } @@ -1412,6 +1413,99 @@ void RegisterRandomizerCompasses() { }); } +static CollisionPoly snowballPoly; +static Vec3f snowballPos; +static f32 raycastResult; + +static u32 iceBlockParams[] = { + 0x214, + 0x1, + 0x11, + 0x10, + 0x20, +}; + +void RegisterSnowballs() { + GameInteractor::Instance->RegisterGameHook([]() { + if (gPlayState->sceneNum != SCENE_HYRULE_FIELD && gPlayState->sceneNum != SCENE_KAKARIKO_VILLAGE) { + return; + } + + int actorsSpawned = 0; + + while (actorsSpawned < 30) { + snowballPos.x = (float)(Random( + (gPlayState->sceneNum == SCENE_HYRULE_FIELD ? -10000 : -2700) + 10000, + (gPlayState->sceneNum == SCENE_HYRULE_FIELD ? 5000 : 2000) + 10000 + ) - (float)10000.0f); + snowballPos.y = 5000; + snowballPos.z = (float)(Random( + (gPlayState->sceneNum == SCENE_HYRULE_FIELD ? -1000 : -2000) + 10000, + (gPlayState->sceneNum == SCENE_HYRULE_FIELD ? 15000 : 2000) + 10000 + ) - (float)10000.0f); + + raycastResult = BgCheck_AnyRaycastFloor1(&gPlayState->colCtx, &snowballPoly, &snowballPos); + + if (raycastResult > BGCHECK_Y_MIN) { + Actor_Spawn(&gPlayState->actorCtx, gPlayState, gEnSnowballId, snowballPos.x, raycastResult, + snowballPos.z, 0, 0, 0, gPlayState->sceneNum == SCENE_HYRULE_FIELD, 0); + actorsSpawned++; + } + } + }); + + GameInteractor::Instance->RegisterGameHook([]() { + if (gPlayState->sceneNum != SCENE_LAKE_HYLIA) { + return; + } + + int actorsSpawned = 0; + + Vec3f spawnedIceBlockPos[15]; + + while (actorsSpawned < 15) { + Vec3f iceBlockPos; + iceBlockPos.x = (float)(Random( + (-4200) + 10000, + (3000) + 10000 + ) - (float)10000.0f); + iceBlockPos.y = -1713.0f; + iceBlockPos.z = (float)(Random( + (2600) + 10000, + (9000) + 10000 + ) - (float)10000.0f); + + raycastResult = BgCheck_AnyRaycastFloor1(&gPlayState->colCtx, &snowballPoly, &iceBlockPos); + + if (raycastResult > BGCHECK_Y_MIN) { + + bool overlaps = false; + for (int i = 0; i < actorsSpawned; i++) { + if (Math_Vec3f_DistXZ(&spawnedIceBlockPos[i], &iceBlockPos) < 500.0f) { + overlaps = true; + break; + } + } + + if (overlaps) { + continue; + } + + if (LINK_IS_ADULT && !Flags_GetEventChkInf(EVENTCHKINF_RAISED_LAKE_HYLIA_WATER)) { + iceBlockPos.y = raycastResult; + } else { + iceBlockPos.y = -1310.0f; + } + + Actor_Spawn(&gPlayState->actorCtx, gPlayState, ACTOR_BG_SPOT08_ICEBLOCK, iceBlockPos.x, iceBlockPos.y, + iceBlockPos.z, 0, (s16)Random(0, 0xFFFF), 0, RandomElement(iceBlockParams), 0); + spawnedIceBlockPos[actorsSpawned] = iceBlockPos; + actorsSpawned++; + } + } + }); +} + void InitMods() { BossRush_RegisterHooks(); RandomizerRegisterHooks(); @@ -1450,6 +1544,7 @@ void InitMods() { RegisterOpenAllHours(); RegisterToTMedallions(); RegisterRandomizerCompasses(); + RegisterSnowballs(); NameTag_RegisterHooks(); RegisterFloorSwitchesHook(); RegisterPatchHandHandler(); diff --git a/soh/soh/Enhancements/randomizer/item_list.cpp b/soh/soh/Enhancements/randomizer/item_list.cpp index 458144411..f4ce76f8b 100644 --- a/soh/soh/Enhancements/randomizer/item_list.cpp +++ b/soh/soh/Enhancements/randomizer/item_list.cpp @@ -335,7 +335,7 @@ void Rando::StaticData::InitItemTable() { itemTable[RG_DEKU_STICK_CAPACITY_30] = Item(RG_DEKU_STICK_CAPACITY_30, Text{ "Deku Stick Capacity (30)", "Capacité de Bâtons Mojo (30)", "Deku-Stab-Kapazität (30)" }, ITEMTYPE_ITEM, GI_STICK_UPGRADE_30, true, LOGIC_PROGRESSIVE_STICK_BAG, RHT_DEKU_STICK_CAPACITY_30, ITEM_STICK_UPGRADE_30, OBJECT_GI_STICK, GID_STICK, 0x91, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_LESSER, MOD_NONE); itemTable[RG_MAGIC_SINGLE] = Item(RG_MAGIC_SINGLE, Text{ "Magic Meter", "Jauge de Magie", "Magisches Maß" }, ITEMTYPE_ITEM, 0x8A, true, LOGIC_PROGRESSIVE_MAGIC, RHT_MAGIC_SINGLE, RG_MAGIC_SINGLE, OBJECT_GI_MAGICPOT, GID_MAGIC_SMALL, 0xE4, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); itemTable[RG_MAGIC_DOUBLE] = Item(RG_MAGIC_DOUBLE, Text{ "Enhanced Magic Meter", "Jauge de Magie améliorée", "Verbessertes Magisches Maß" }, ITEMTYPE_ITEM, 0x8A, true, LOGIC_PROGRESSIVE_MAGIC, RHT_MAGIC_DOUBLE, RG_MAGIC_DOUBLE, OBJECT_GI_MAGICPOT, GID_MAGIC_LARGE, 0xE8, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER); - itemTable[RG_TRIFORCE_PIECE] = Item(RG_TRIFORCE_PIECE, Text{ "Triforce Piece", "Triforce Piece", "Triforce-Fragment" }, ITEMTYPE_ITEM, 0xDF, true, LOGIC_TRIFORCE_PIECES, RHT_TRIFORCE_PIECE, RG_TRIFORCE_PIECE, OBJECT_GI_BOMB_2, GID_TRIFORCE_PIECE, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); + itemTable[RG_TRIFORCE_PIECE] = Item(RG_TRIFORCE_PIECE, Text{ "Christmas Ornament", "Christmas Ornament", "Christmas Ornament" }, ITEMTYPE_ITEM, 0xDF, true, LOGIC_TRIFORCE_PIECES, RHT_TRIFORCE_PIECE, RG_TRIFORCE_PIECE, OBJECT_GI_BOMB_2, GID_TRIFORCE_PIECE, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); // Init itemNameToEnum for (auto& item : itemTable) { diff --git a/soh/soh/Enhancements/randomizer/randomizer.cpp b/soh/soh/Enhancements/randomizer/randomizer.cpp index aefc7d4fd..0575e56a7 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer.cpp @@ -64,6 +64,7 @@ const std::string Randomizer::hintMessageTableID = "RandomizerHints"; const std::string Randomizer::merchantMessageTableID = "RandomizerMerchants"; const std::string Randomizer::rupeeMessageTableID = "RandomizerRupees"; const std::string Randomizer::triforcePieceMessageTableID = "RandomizerTriforcePiece"; +const std::string Randomizer::christmasTreeMessageTableID = "RandomizerChristmasTree"; const std::string Randomizer::NaviRandoMessageTableID = "RandomizerNavi"; const std::string Randomizer::IceTrapRandoMessageTableID = "RandomizerIceTrap"; const std::string Randomizer::randoMiscHintsTableID = "RandomizerMiscHints"; @@ -2193,29 +2194,29 @@ CustomMessage Randomizer::GetRupeeMessage(u16 rupeeTextId) { void CreateTriforcePieceMessages() { CustomMessage TriforcePieceMessages[NUM_TRIFORCE_PIECE_MESSAGES] = { - { "You found a %yTriforce Piece%w!&%g[[current]]%w down, %c[[remaining]]%w to go. It's a start!", - "Ein %yTriforce-Splitter%w! Du hast&%g[[current]]%w von %c[[required]]%w gefunden. Es ist ein&Anfang!", - "Vous trouvez un %yFragment de la&Triforce%w! Vous en avez %g[[current]]%w, il en&reste %c[[remaining]]%w à trouver. C'est un début!" }, + { "You found a %yChristmas Ornament%w!&%g{{current}}%w down, %c{{remaining}}%w to go. It's a start!", + "Ein %yTriforce-Splitter%w! Du hast&%g{{current}}%w von %c{{required}}%w gefunden. Es ist ein&Anfang!", + "Vous trouvez un %yFragment de la&Triforce%w! Vous en avez %g{{current}}%w, il en&reste %c{{remaining}}%w à trouver. C'est un début!" }, - { "You found a %yTriforce Piece%w!&%g[[current]]%w down, %c[[remaining]]%w to go. Progress!", - "Ein %yTriforce-Splitter%w! Du hast&%g[[current]]%w von %c[[required]]%w gefunden. Es geht voran!", - "Vous trouvez un %yFragment de la&Triforce%w! Vous en avez %g[[current]]%w, il en&reste %c[[remaining]]%w à trouver. Ça avance!" }, + { "You found a %yChristmas Ornament%w!&%g{{current}}%w down, %c{{remaining}}%w to go. Progress!", + "Ein %yTriforce-Splitter%w! Du hast&%g{{current}}%w von %c{{required}}%w gefunden. Es geht voran!", + "Vous trouvez un %yFragment de la&Triforce%w! Vous en avez %g{{current}}%w, il en&reste %c{{remaining}}%w à trouver. Ça avance!" }, - { "You found a %yTriforce Piece%w!&%g[[current]]%w down, %c[[remaining]]%w to go. Over half-way&there!", - "Ein %yTriforce-Splitter%w! Du hast&schon %g[[current]]%w von %c[[required]]%w gefunden. Schon&über die Hälfte!", - "Vous trouvez un %yFragment de la&Triforce%w! Vous en avez %g[[current]]%w, il en&reste %c[[remaining]]%w à trouver. Il en reste un&peu moins que la moitié!" }, + { "You found a %yChristmas Ornament%w!&%g{{current}}%w down, %c{{remaining}}%w to go. Over half-way&there!", + "Ein %yTriforce-Splitter%w! Du hast&schon %g{{current}}%w von %c{{required}}%w gefunden. Schon&über die Hälfte!", + "Vous trouvez un %yFragment de la&Triforce%w! Vous en avez %g{{current}}%w, il en&reste %c{{remaining}}%w à trouver. Il en reste un&peu moins que la moitié!" }, - { "You found a %yTriforce Piece%w!&%g[[current]]%w down, %c[[remaining]]%w to go. Almost done!", - "Ein %yTriforce-Splitter%w! Du hast&schon %g[[current]]%w von %c[[required]]%w gefunden. Fast&geschafft!", - "Vous trouvez un %yFragment de la&Triforce%w! Vous en avez %g[[current]]%w, il en&reste %c[[remaining]]%w à trouver. C'est presque&terminé!" }, + { "You found a %yChristmas Ornament%w!&%g{{current}}%w down, %c{{remaining}}%w to go. Almost done!", + "Ein %yTriforce-Splitter%w! Du hast&schon %g{{current}}%w von %c{{required}}%w gefunden. Fast&geschafft!", + "Vous trouvez un %yFragment de la&Triforce%w! Vous en avez %g{{current}}%w, il en&reste %c{{remaining}}%w à trouver. C'est presque&terminé!" }, - { "You completed the %yTriforce of&Courage%w! %gGG%w!", + { "You found all of the %yChristmas&Ornaments%w! Visit the %gChristmas&tree%w in Kakariko Village!", "Das %yTriforce des Mutes%w! Du hast&alle Splitter gefunden. %gGut gemacht%w!", "Vous avez complété la %yTriforce&du Courage%w! %gFélicitations%w!" }, - { "You found a spare %yTriforce Piece%w!&You only needed %c[[required]]%w, but you have %g[[current]]%w!", - "Ein übriger %yTriforce-Splitter%w! Du&hast nun %g[[current]]%w von %c[[required]]%w nötigen gefunden.", - "Vous avez trouvé un %yFragment de&Triforce%w en plus! Vous n'aviez besoin&que de %c[[required]]%w, mais vous en avez %g[[current]]%w en&tout!" }, + { "You found a spare %yChristmas Ornament%w!&You only needed %c{{required}}%w, but you have %g{{current}}%w!", + "Ein übriger %yTriforce-Splitter%w! Du&hast nun %g{{current}}%w von %c{{required}}%w nötigen gefunden.", + "Vous avez trouvé un %yFragment de&Triforce%w en plus! Vous n'aviez besoin&que de %c{{required}}%w, mais vous en avez %g{{current}}%w en&tout!" }, }; CustomMessageManager* customMessageManager = CustomMessageManager::Instance; customMessageManager->AddCustomMessageTable(Randomizer::triforcePieceMessageTableID); @@ -2254,6 +2255,39 @@ CustomMessage Randomizer::GetTriforcePieceMessage() { messageEntry.Format(); return messageEntry; } +void CreateChristmasTreeMessages() { + CustomMessage ChristmasTreeMessages[2] = { + + { "The %yChristmas tree%w seems to be&missing some of %gits magic%w... Find all&ornaments to save %rChristmas%w!", + "The %yChristmas tree%w seems to be&missing some of %gits magic%w... Find all&ornaments to save %rChristmas%w!", + "The %yChristmas tree%w seems to be&missing some of %gits magic%w... Find all&ornaments to save %rChristmas%w!" }, + + { "The tree's magic has been fully&restored. %gMerry %rChristmas%w!", + "The tree's magic has been fully&restored. %gMerry %rChristmas%w!", + "The tree's magic has been fully&restored. %gMerry %rChristmas%w!" } + }; + CustomMessageManager* customMessageManager = CustomMessageManager::Instance; + customMessageManager->AddCustomMessageTable(Randomizer::christmasTreeMessageTableID); + for (unsigned int i = 0; i <= 1; i++) { + customMessageManager->CreateMessage(Randomizer::christmasTreeMessageTableID, i, ChristmasTreeMessages[i]); + } +} + +CustomMessage Randomizer::GetChristmasTreeMessage() { + // Item is only given after the textbox, so reflect that inside the textbox. + uint8_t current = gSaveContext.triforcePiecesCollected; + uint8_t required = OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_TRIFORCE_HUNT_PIECES_REQUIRED); + uint8_t messageIndex; + + if (current < required) { + messageIndex = 0; + } else { + messageIndex = 1; + } + + CustomMessage messageEntry = CustomMessageManager::Instance->RetrieveMessage(Randomizer::christmasTreeMessageTableID, messageIndex); + return messageEntry; +} void CreateNaviRandoMessages() { CustomMessage NaviMessages[NUM_NAVI_MESSAGES] = { @@ -2594,7 +2628,7 @@ CustomMessage Randomizer::GetIceTrapMessage() { CustomMessage msg; - if (CVarGetInteger(CVAR_GENERAL("LetItSnow"), 0)) { + if (CVarGetInteger("gLetItSnow", 0)) { msg = CustomMessage( /*english*/ "This year for Christmas, all you get is #COAL#!", /*german*/ "This year for Christmas, all you get is #COAL#!", @@ -3004,6 +3038,7 @@ void Randomizer::CreateCustomMessages() { CreateGetItemMessages(&getItemMessages); CreateRupeeMessages(); CreateTriforcePieceMessages(); + CreateChristmasTreeMessages(); CreateNaviRandoMessages(); CreateFireTempleGoronMessages(); } diff --git a/soh/soh/Enhancements/randomizer/randomizer.h b/soh/soh/Enhancements/randomizer/randomizer.h index 4a84d6302..0ec13452a 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.h +++ b/soh/soh/Enhancements/randomizer/randomizer.h @@ -35,6 +35,7 @@ class Randomizer { static const std::string merchantMessageTableID; static const std::string rupeeMessageTableID; static const std::string triforcePieceMessageTableID; + static const std::string christmasTreeMessageTableID; static const std::string NaviRandoMessageTableID; static const std::string IceTrapRandoMessageTableID; static const std::string randoMiscHintsTableID; @@ -67,6 +68,7 @@ class Randomizer { static CustomMessage GetRupeeMessage(u16 rupeeTextId); static CustomMessage GetIceTrapMessage(); static CustomMessage GetTriforcePieceMessage(); + static CustomMessage GetChristmasTreeMessage(); }; #ifdef __cplusplus diff --git a/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp b/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp index 3be937cc9..2cb5ba957 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp @@ -683,7 +683,7 @@ void DrawItem(ItemTrackerItem item) { case RG_TRIFORCE_PIECE: actualItemId = item.id; hasItem = IS_RANDO && OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_TRIFORCE_HUNT); - itemName = "Triforce Piece"; + itemName = "Christmas Ornament"; break; case RG_GOHMA_SOUL: actualItemId = item.id; @@ -1426,7 +1426,7 @@ void ItemTrackerSettingsWindow::DrawElement() { UIWidgets::Spacer(0); - ImGui::Text("Triforce Piece Count Tracking"); + ImGui::Text("Christmas ornament Count Tracking"); UIWidgets::EnhancementCombobox(CVAR_TRACKER_ITEM("TriforcePieceCounts"), itemTrackerTriforcePieceTrackOptions, TRIFORCE_PIECE_COLLECTED_REQUIRED_MAX); UIWidgets::InsertHelpHoverText("Customize what numbers are shown for triforce piece tracking."); @@ -1469,7 +1469,7 @@ void ItemTrackerSettingsWindow::DrawElement() { shouldUpdateVectors = true; } - if (UIWidgets::LabeledRightAlignedEnhancementCombobox("Triforce Pieces", CVAR_TRACKER_ITEM("DisplayType.TriforcePieces"), displayTypes, SECTION_DISPLAY_HIDDEN)) { + if (UIWidgets::LabeledRightAlignedEnhancementCombobox("Christmas Ornaments", CVAR_TRACKER_ITEM("DisplayType.TriforcePieces"), displayTypes, SECTION_DISPLAY_HIDDEN)) { shouldUpdateVectors = true; } diff --git a/soh/soh/OTRGlobals.cpp b/soh/soh/OTRGlobals.cpp index c89228667..53367935e 100644 --- a/soh/soh/OTRGlobals.cpp +++ b/soh/soh/OTRGlobals.cpp @@ -1194,11 +1194,24 @@ extern "C" void InitOTR() { time_t now = time(NULL); tm *tm_now = localtime(&now); - if (tm_now->tm_mon == 11 && tm_now->tm_mday >= 24 && tm_now->tm_mday <= 25) { - CVarRegisterInteger(CVAR_GENERAL("LetItSnow"), 1); - } else { - CVarClear(CVAR_GENERAL("LetItSnow")); - } + // if (tm_now->tm_mon == 11 && tm_now->tm_mday >= 24 && tm_now->tm_mday <= 25) { + // CVarRegisterInteger("gLetItSnow", 1); + // } else { + // CVarClear("gLetItSnow"); + // } + + CVarRegisterInteger("gLetItSnow", 1); + CVarRegisterInteger("gAltAssets", 1); + CVarRegisterInteger("gCosmetics.Hud_AButton.Changed", 1); + CVarRegisterColor("gCosmetics.Hud_AButton.Value", Color_RGBA8{ 255, 255, 255, 255 }); + CVarRegisterInteger("gCosmetics.Hud_BButton.Changed", 1); + CVarRegisterColor("gCosmetics.Hud_BButton.Value", Color_RGBA8{ 255, 255, 255, 255 }); + CVarRegisterInteger("gCosmetics.Hud_CButtons.Changed", 1); + CVarRegisterColor("gCosmetics.Hud_CButtons.Value", Color_RGBA8{ 255, 255, 255, 255 }); + CVarRegisterInteger("gCosmetics.Consumable_Hearts.Changed", 1); + CVarRegisterColor("gCosmetics.Consumable_Hearts.Value", Color_RGBA8{ 255, 158, 0, 255 }); + CVarRegisterInteger("gCosmetics.Consumable_Magic.Changed", 1); + CVarRegisterColor("gCosmetics.Consumable_Magic.Value", Color_RGBA8{ 255, 0, 0, 255 }); srand(now); #ifdef ENABLE_REMOTE_CONTROL @@ -2544,7 +2557,9 @@ extern "C" int CustomMessage_RetrieveIfExists(PlayState* play) { bool nonBeanMerchants = ctx->GetOption(RSK_SHUFFLE_MERCHANTS).Is(RO_SHUFFLE_MERCHANTS_ALL_BUT_BEANS) || ctx->GetOption(RSK_SHUFFLE_MERCHANTS).Is(RO_SHUFFLE_MERCHANTS_ALL); Player* player = GET_PLAYER(play); - if (textId == TEXT_RANDOMIZER_CUSTOM_ITEM) { + if (textId == 0x406B && play->sceneNum == SCENE_KAKARIKO_VILLAGE) { + messageEntry = Randomizer::GetChristmasTreeMessage(); + } else if (textId == TEXT_RANDOMIZER_CUSTOM_ITEM) { if (player->getItemEntry.getItemId == RG_ICE_TRAP) { messageEntry = Randomizer::GetIceTrapMessage(); } else if (player->getItemEntry.getItemId == RG_TRIFORCE_PIECE) { diff --git a/soh/src/code/z_kankyo.c b/soh/src/code/z_kankyo.c index 37481ccd8..4a89c75f7 100644 --- a/soh/src/code/z_kankyo.c +++ b/soh/src/code/z_kankyo.c @@ -2289,17 +2289,17 @@ void Environment_FillScreen(GraphicsContext* gfxCtx, u8 red, u8 green, u8 blue, } Color_RGB8 sSandstormPrimColors[] = { - { 210, 156, 85 }, - { 255, 200, 100 }, - { 225, 160, 50 }, - { 105, 90, 40 }, + { 210, 210, 210 }, + { 255, 255, 255 }, + { 225, 225, 225 }, + { 105, 105, 105 }, }; Color_RGB8 sSandstormEnvColors[] = { - { 155, 106, 35 }, - { 200, 150, 50 }, - { 170, 110, 0 }, - { 50, 40, 0 }, + { 155, 155, 155 }, + { 200, 200, 200 }, + { 170, 170, 170 }, + { 50, 50, 50 }, }; u16 previousPatchedSandstormScreenSize = 0; diff --git a/soh/src/code/z_play.c b/soh/src/code/z_play.c index ae6d987a9..cad122aec 100644 --- a/soh/src/code/z_play.c +++ b/soh/src/code/z_play.c @@ -36,6 +36,9 @@ PlayState* gPlayState; s16 firstInit = 0; s16 gEnPartnerId; +s16 gEnSnowballId; +s16 gEnChristmasTreeId; +s16 gEnChristmasDecoId; void OTRPlay_SpawnScene(PlayState* play, s32 sceneNum, s32 spawn); @@ -632,6 +635,12 @@ void Play_Init(GameState* thisx) { GET_PLAYER(play)->actor.world.pos.y + Player_GetHeight(GET_PLAYER(play)) + 5.0f, GET_PLAYER(play)->actor.world.pos.z, 0, 0, 0, 1, true); } + + if (play->sceneNum == SCENE_KAKARIKO_VILLAGE) { + Actor_Spawn(&play->actorCtx, play, gEnChristmasTreeId, -734, 0, 420, 0, 0, 0, 0, true); + } + + Actor_Spawn(&play->actorCtx, play, gEnChristmasDecoId, 0, 0, 0, 0, 0, 0, 0, true); } void Play_Update(PlayState* play) { @@ -1680,7 +1689,7 @@ void Play_Main(GameState* thisx) { CVarSetInteger(CVAR_GENERAL("CheatEasyPauseBufferTimer"), CVarGetInteger(CVAR_GENERAL("CheatEasyPauseBufferTimer"), 0) - 1); } - if (play->envCtx.unk_EE[2] == 0 && CVarGetInteger(CVAR_GENERAL("LetItSnow"), 0)) { + if (play->envCtx.unk_EE[2] == 0 && CVarGetInteger("gLetItSnow", 0)) { play->envCtx.unk_EE[3] = 64; Actor_Spawn(&gPlayState->actorCtx, gPlayState, ACTOR_OBJECT_KANKYO, 0, 0, 0, 0, 0, 0, 3, 0); } diff --git a/soh/src/code/z_player_lib.c b/soh/src/code/z_player_lib.c index 6def1f410..ce44011f4 100644 --- a/soh/src/code/z_player_lib.c +++ b/soh/src/code/z_player_lib.c @@ -10,6 +10,7 @@ #include "soh/Enhancements/randomizer/draw.h" #include +#include typedef struct { /* 0x00 */ u8 flag; @@ -1044,10 +1045,18 @@ void* sMouthTextures[] = { }; #endif +// Original colors +//Color_RGB8 sTunicColors[] = { +// { 30, 105, 27 }, +// { 100, 20, 0 }, +// { 0, 60, 100 }, +//}; + +// Overwrite to red tunic as default for Holidays in Hyrule build Color_RGB8 sTunicColors[] = { - { 30, 105, 27 }, - { 100, 20, 0 }, - { 0, 60, 100 }, + { 255, 0, 0 }, + { 255, 0, 0 }, + { 255, 0, 0 }, }; Color_RGB8 sGauntletColors[] = { @@ -1586,7 +1595,7 @@ void func_800906D4(PlayState* play, Player* this, Vec3f* newTipPos) { void Player_DrawGetItemIceTrap(PlayState* play, Player* this, Vec3f* refPos, s32 drawIdPlusOne, f32 height) { OPEN_DISPS(play->state.gfxCtx); - if (CVarGetInteger(CVAR_GENERAL("LetItSnow"), 0)) { + if (CVarGetInteger("gLetItSnow", 0)) { Gfx_SetupDL_25Opa(play->state.gfxCtx); Matrix_Scale(0.2f, 0.2f, 0.2f, MTXMODE_APPLY); @@ -1792,6 +1801,52 @@ void Player_PostLimbDrawGameplay(PlayState* play, s32 limbIndex, Gfx** dList, Ve Matrix_MultVec3f(&sZeroVec, D_80160000); } + if (CVarGetInteger("gLetItSnow", 0) && !(this->stateFlags1 & PLAYER_STATE1_FIRST_PERSON) && !(this->stateFlags2 & PLAYER_STATE2_CRAWLING)) { + if (limbIndex == PLAYER_LIMB_HEAD) { + OPEN_DISPS(play->state.gfxCtx); + + Matrix_Push(); + if (LINK_IS_ADULT) { + Matrix_RotateZYX(24000, -16000, -7000, MTXMODE_APPLY); + Matrix_Translate(32.0f, 0.0f, 0.0f, MTXMODE_APPLY); + Matrix_Scale(1.0f, 1.0f, 1.0f, MTXMODE_APPLY); + gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + gSPDisplayList(POLY_OPA_DISP++, gLinkAdultHatTrimDL); + } else { + Matrix_RotateZYX(24000, -16000, -7000, MTXMODE_APPLY); + Matrix_Translate(32.0f, 0.0f, 0.0f, MTXMODE_APPLY); + Matrix_Scale(1.0f, 1.0f, 1.0f, MTXMODE_APPLY); + gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + gSPDisplayList(POLY_OPA_DISP++, gLinkChildHatTrimDL); + } + + Matrix_Pop(); + + CLOSE_DISPS(play->state.gfxCtx); + } + + if (limbIndex == PLAYER_LIMB_HAT) { + OPEN_DISPS(play->state.gfxCtx); + + Matrix_Push(); + if (LINK_IS_ADULT) { + Matrix_RotateZYX(0, 0, 17500, MTXMODE_APPLY); + Matrix_Translate(-195.0f, 1500.0f, -95.0f, MTXMODE_APPLY); + Matrix_Scale(2.0f, 2.0f, 2.0f, MTXMODE_APPLY); + } else { + Matrix_RotateZYX(0, 0, 27000, MTXMODE_APPLY); + Matrix_Translate(-950.0f, 2600.0f, -75.0f, MTXMODE_APPLY); + Matrix_Scale(2.0f, 2.0f, 2.0f, MTXMODE_APPLY); + } + + gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + gSPDisplayList(POLY_OPA_DISP++, gLinkAdultPompomDL); + Matrix_Pop(); + + CLOSE_DISPS(play->state.gfxCtx); + } + } + if (limbIndex == PLAYER_LIMB_L_HAND) { MtxF sp14C; Actor* hookedActor; diff --git a/soh/src/overlays/actors/ovl_Bg_Spot08_Iceblock/z_bg_spot08_iceblock.c b/soh/src/overlays/actors/ovl_Bg_Spot08_Iceblock/z_bg_spot08_iceblock.c index d7b45c9b6..545dbdac1 100644 --- a/soh/src/overlays/actors/ovl_Bg_Spot08_Iceblock/z_bg_spot08_iceblock.c +++ b/soh/src/overlays/actors/ovl_Bg_Spot08_Iceblock/z_bg_spot08_iceblock.c @@ -308,7 +308,7 @@ void BgSpot08Iceblock_Init(Actor* thisx, PlayState* play) { break; } - if (LINK_AGE_IN_YEARS == YEARS_CHILD) { + if (LINK_AGE_IN_YEARS == YEARS_CHILD && play->sceneNum == SCENE_ZORAS_FOUNTAIN) { Actor_Kill(&this->dyna.actor); return; } @@ -332,6 +332,11 @@ void BgSpot08Iceblock_Init(Actor* thisx, PlayState* play) { this->surfaceNormal.y = 1.0f; this->rotationAxis.x = 1.0f; + if (LINK_IS_ADULT && !Flags_GetEventChkInf(EVENTCHKINF_RAISED_LAKE_HYLIA_WATER) && play->sceneNum == SCENE_LAKE_HYLIA) { + BgSpot08Iceblock_SetupNoAction(this); + return; + } + switch (this->dyna.actor.params & 0xF) { case 0: case 1: diff --git a/soh/src/overlays/actors/ovl_Boss_Dodongo/z_boss_dodongo.c b/soh/src/overlays/actors/ovl_Boss_Dodongo/z_boss_dodongo.c index 59c83fc82..43f0d3d98 100644 --- a/soh/src/overlays/actors/ovl_Boss_Dodongo/z_boss_dodongo.c +++ b/soh/src/overlays/actors/ovl_Boss_Dodongo/z_boss_dodongo.c @@ -4,6 +4,7 @@ #include "overlays/actors/ovl_Door_Warp1/z_door_warp1.h" #include "scenes/dungeons/ddan_boss/ddan_boss_room_1.h" #include "soh/frame_interpolation.h" +#include "soh_assets.h" #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" #include // malloc @@ -1353,6 +1354,21 @@ void BossDodongo_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s Matrix_MultVec3f(&D_808CA48C, &this->unk_404); } Collider_UpdateSpheres(limbIndex, &this->collider); + + if (CVarGetInteger("gLetItSnow", 0)) { + if (limbIndex == 7) { + OPEN_DISPS(play->state.gfxCtx); + Matrix_Push(); + Matrix_RotateZYX(-6643, 1771, -14834, MTXMODE_APPLY); + Matrix_Translate(2000.0f, 5000.0f, 4000.0f, MTXMODE_APPLY); + Matrix_Scale(6.114f, 6.114f, 6.114f, MTXMODE_APPLY); + gDPSetEnvColor(POLY_OPA_DISP++, 255, 0, 0, 255); + gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + gSPDisplayList(POLY_OPA_DISP++, gPaperCrownGenericDL); + Matrix_Pop(); + CLOSE_DISPS(play->state.gfxCtx); + } + } } void BossDodongo_Draw(Actor* thisx, PlayState* play) { diff --git a/soh/src/overlays/actors/ovl_Boss_Ganon/z_boss_ganon.c b/soh/src/overlays/actors/ovl_Boss_Ganon/z_boss_ganon.c index 8e2fffe36..63f74694f 100644 --- a/soh/src/overlays/actors/ovl_Boss_Ganon/z_boss_ganon.c +++ b/soh/src/overlays/actors/ovl_Boss_Ganon/z_boss_ganon.c @@ -9,6 +9,7 @@ #include "assets/objects/object_ganon_anime1/object_ganon_anime1.h" #include "assets/objects/object_ganon_anime2/object_ganon_anime2.h" #include "assets/scenes/dungeons/ganon_boss/ganon_boss_scene.h" +#include "soh_assets.h" #include "soh/frame_interpolation.h" #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" @@ -3381,6 +3382,21 @@ void BossGanon_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* Matrix_MultVec3f(&sp1C, &this->unk_214); } + + if (limbIndex == 14) { + OPEN_DISPS(play->state.gfxCtx); + Matrix_Push(); + Matrix_RotateZYX(7749, 0, -11956, MTXMODE_APPLY); + Matrix_Translate(675.676f, -229.730f, 148.649f, MTXMODE_APPLY); + Matrix_Scale(1.014f, 1.014f, 1.014f, MTXMODE_APPLY); + + gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + Color_RGBA8 color = { 255, 0, 0, 255 }; + gDPSetEnvColor(POLY_OPA_DISP++, color.r, color.g, color.b, color.a); + gSPDisplayList(POLY_OPA_DISP++, gPaperCrownGenericDL); + Matrix_Pop(); + CLOSE_DISPS(play->state.gfxCtx); + } } void BossGanon_InitRand(s32 seedInit0, s32 seedInit1, s32 seedInit2) { diff --git a/soh/src/overlays/actors/ovl_Boss_Ganon2/z_boss_ganon2.c b/soh/src/overlays/actors/ovl_Boss_Ganon2/z_boss_ganon2.c index 97cc537b4..ed1ef34ea 100644 --- a/soh/src/overlays/actors/ovl_Boss_Ganon2/z_boss_ganon2.c +++ b/soh/src/overlays/actors/ovl_Boss_Ganon2/z_boss_ganon2.c @@ -8,6 +8,7 @@ #include "objects/object_geff/object_geff.h" #include "soh/frame_interpolation.h" #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" +#include "soh_assets.h" #include @@ -2656,6 +2657,18 @@ void BossGanon2_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* } } + if (CVarGetInteger("gLetItSnow", 0)) { + if (limbIndex == 16) { + Matrix_Push(); + Matrix_RotateZYX(5977, 4649, 18154, MTXMODE_APPLY); + Matrix_Translate(364.865f, 67.568f, 378.378f, MTXMODE_APPLY); + Matrix_Scale(4.595f, 4.595f, 4.595f, MTXMODE_APPLY); + gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + gSPDisplayList(POLY_OPA_DISP++, gSantaHatGenericDL); + Matrix_Pop(); + } + } + CLOSE_DISPS(play->state.gfxCtx); } @@ -2780,6 +2793,21 @@ void BossGanon2_PostLimbDraw2(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s } else if (limbIndex == 10) { Matrix_MultVec3f(&D_80907164, &this->unk_1B8); } + + if (CVarGetInteger("gLetItSnow", 0)) { + if (limbIndex == 11) { + OPEN_DISPS(play->state.gfxCtx); + Matrix_Push(); + Matrix_RotateZYX(0, 0, -15056, MTXMODE_APPLY); + Matrix_Translate(824.324f, 472.973f, 0.0f, MTXMODE_APPLY); + Matrix_Scale(0.845f, 0.845f, 0.845f, MTXMODE_APPLY); + gDPSetEnvColor(POLY_OPA_DISP++, 255, 100, 100, 255); + gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + gSPDisplayList(POLY_OPA_DISP++, gPaperCrownGenericDL); + Matrix_Pop(); + CLOSE_DISPS(play->state.gfxCtx); + } + } } void func_80905674(BossGanon2* this, PlayState* play) { diff --git a/soh/src/overlays/actors/ovl_Boss_Ganondrof/z_boss_ganondrof.c b/soh/src/overlays/actors/ovl_Boss_Ganondrof/z_boss_ganondrof.c index 5f800a056..178b00e85 100644 --- a/soh/src/overlays/actors/ovl_Boss_Ganondrof/z_boss_ganondrof.c +++ b/soh/src/overlays/actors/ovl_Boss_Ganondrof/z_boss_ganondrof.c @@ -12,6 +12,7 @@ #include "overlays/effects/ovl_Effect_Ss_Hahen/z_eff_ss_hahen.h" #include "overlays/actors/ovl_Door_Warp1/z_door_warp1.h" #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" +#include "soh_assets.h" #define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_HOSTILE | ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_DRAW_WHILE_CULLED) @@ -1426,6 +1427,20 @@ void BossGanondrof_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec if (((this->flyMode != GND_FLY_PAINTING) || (this->actionFunc == BossGanondrof_Intro)) && (limbIndex <= 25)) { Matrix_MultVec3f(&zeroVec, &this->bodyPartsPos[limbIndex - 1]); } + if (CVarGetInteger("gLetItSnow", 0) && this->deathState == NOT_DEAD) { + if (limbIndex == 15) { + OPEN_DISPS(play->state.gfxCtx); + Matrix_Push(); + Matrix_RotateZYX(11955, 0, -15499, MTXMODE_APPLY); + Matrix_Translate(459.460f, 256.757f, -567.568f, MTXMODE_APPLY); + Matrix_Scale(0.877f, 0.877f, 0.877f, MTXMODE_APPLY); + gDPSetEnvColor(POLY_OPA_DISP++, 255, 100, 100, 255); + gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + gSPDisplayList(POLY_OPA_DISP++, gPaperCrownGenericDL); + Matrix_Pop(); + CLOSE_DISPS(play->state.gfxCtx); + } + } } Gfx* BossGanondrof_GetClearPixelDList(GraphicsContext* gfxCtx) { diff --git a/soh/src/overlays/actors/ovl_En_Am/z_en_am.c b/soh/src/overlays/actors/ovl_En_Am/z_en_am.c index c62e3a8fa..587845d8f 100644 --- a/soh/src/overlays/actors/ovl_En_Am/z_en_am.c +++ b/soh/src/overlays/actors/ovl_En_Am/z_en_am.c @@ -8,6 +8,7 @@ #include "objects/object_am/object_am.h" #include "overlays/actors/ovl_En_Bom/z_en_bom.h" #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" +#include "soh_assets.h" #define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_HOSTILE | ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_CAN_PRESS_SWITCH) @@ -944,6 +945,21 @@ void EnAm_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot, if ((limbIndex == 1) && (this->unk_264 != 0)) { EnAm_TransformSwordHitbox(&this->dyna.actor, play); } + + if (CVarGetInteger("gLetItSnow", 0)) { + if (limbIndex == 4) { + OPEN_DISPS(play->state.gfxCtx); + Matrix_Push(); + Matrix_RotateZYX(0, 0, -2657, MTXMODE_APPLY); + Matrix_Translate(4000.0f, 1148.649f, 0.0f, MTXMODE_APPLY); + Matrix_Scale(1.655f, 1.655f, 1.655f, MTXMODE_APPLY); + gDPSetEnvColor(POLY_OPA_DISP++, 255, 255, 0, 255); + gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + gSPDisplayList(POLY_OPA_DISP++, gPaperCrownGenericDL); + Matrix_Pop(); + CLOSE_DISPS(play->state.gfxCtx); + } + } } static Vec3f sIcePosOffsets[] = { diff --git a/soh/src/overlays/actors/ovl_En_Ani/z_en_ani.c b/soh/src/overlays/actors/ovl_En_Ani/z_en_ani.c index 4b0e93f52..4a62945bd 100644 --- a/soh/src/overlays/actors/ovl_En_Ani/z_en_ani.c +++ b/soh/src/overlays/actors/ovl_En_Ani/z_en_ani.c @@ -7,6 +7,7 @@ #include "z_en_ani.h" #include "objects/object_ani/object_ani.h" #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" +#include "soh_assets.h" #define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY) @@ -316,6 +317,21 @@ void EnAni_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot, if (limbIndex == 15) { Matrix_MultVec3f(&sMultVec, &this->actor.focus.pos); } + + if (CVarGetInteger("gLetItSnow", 0)) { + if (limbIndex == 15) { + OPEN_DISPS(play->state.gfxCtx); + Matrix_Push(); + Matrix_RotateZYX(1992, 0, 2656, MTXMODE_APPLY); + Matrix_Translate(972.973f, 40.541f, 0.0f, MTXMODE_APPLY); + Matrix_Scale(0.965f, 0.965f, 0.965f, MTXMODE_APPLY); + gDPSetEnvColor(POLY_OPA_DISP++, 255, 0, 255, 255); + gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + gSPDisplayList(POLY_OPA_DISP++, gPaperCrownGenericDL); + Matrix_Pop(); + CLOSE_DISPS(play->state.gfxCtx); + } + } } void EnAni_Draw(Actor* thisx, PlayState* play) { diff --git a/soh/src/overlays/actors/ovl_En_Bb/z_en_bb.c b/soh/src/overlays/actors/ovl_En_Bb/z_en_bb.c index 39c0e54e9..8024c09e3 100644 --- a/soh/src/overlays/actors/ovl_En_Bb/z_en_bb.c +++ b/soh/src/overlays/actors/ovl_En_Bb/z_en_bb.c @@ -8,6 +8,7 @@ #include "objects/gameplay_keep/gameplay_keep.h" #include "objects/object_Bb/object_Bb.h" #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" +#include "soh_assets.h" #define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_HOSTILE | ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_PLAY_HIT_SFX) @@ -1269,6 +1270,20 @@ void EnBb_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot, EnBb* this = (EnBb*)thisx; BodyBreak_SetInfo(&this->bodyBreak, limbIndex, 4, 15, 15, dList, BODYBREAK_OBJECT_DEFAULT); + + if (CVarGetInteger("gLetItSnow", 0)) { + if (limbIndex == 15) { + OPEN_DISPS(play->state.gfxCtx); + Matrix_Push(); + Matrix_RotateZYX(-13063, 0, -27454, MTXMODE_APPLY); + Matrix_Translate(418.919f, -81.081f, 0.0f, MTXMODE_APPLY); + Matrix_Scale(1.757f, 1.757f, 1.757f, MTXMODE_APPLY); + gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + gSPDisplayList(POLY_OPA_DISP++, gSantaHatGenericDL); + Matrix_Pop(); + CLOSE_DISPS(play->state.gfxCtx); + } + } } static Vec3f sFireIceOffsets[] = { diff --git a/soh/src/overlays/actors/ovl_En_Bom_Chu/z_en_bom_chu.c b/soh/src/overlays/actors/ovl_En_Bom_Chu/z_en_bom_chu.c index c265b3eb0..b9900f063 100644 --- a/soh/src/overlays/actors/ovl_En_Bom_Chu/z_en_bom_chu.c +++ b/soh/src/overlays/actors/ovl_En_Bom_Chu/z_en_bom_chu.c @@ -1,6 +1,7 @@ #include "z_en_bom_chu.h" #include "overlays/actors/ovl_En_Bom/z_en_bom.h" #include "objects/gameplay_keep/gameplay_keep.h" +#include "soh_assets.h" #define FLAGS ACTOR_FLAG_UPDATE_WHILE_CULLED @@ -529,5 +530,15 @@ void EnBomChu_Draw(Actor* thisx, PlayState* play) { G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); gSPDisplayList(POLY_OPA_DISP++, gBombchuDL); + if (CVarGetInteger("gLetItSnow", 0)) { + Matrix_Push(); + Matrix_RotateZYX(0, -3100, 17047, MTXMODE_APPLY); + Matrix_Translate(445.946f, -27.027f, 608.108f, MTXMODE_APPLY); + Matrix_Scale(0.541f, 0.541f, 0.541f, MTXMODE_APPLY); + gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + gSPDisplayList(POLY_OPA_DISP++, gSantaHatGenericDL); + Matrix_Pop(); + } + CLOSE_DISPS(play->state.gfxCtx); } diff --git a/soh/src/overlays/actors/ovl_En_Box/z_en_box.c b/soh/src/overlays/actors/ovl_En_Box/z_en_box.c index ef7a6330b..4409a4127 100644 --- a/soh/src/overlays/actors/ovl_En_Box/z_en_box.c +++ b/soh/src/overlays/actors/ovl_En_Box/z_en_box.c @@ -668,7 +668,7 @@ void EnBox_UpdateSizeAndTexture(EnBox* this, PlayState* play) { } } - if (CVarGetInteger(CVAR_GENERAL("LetItSnow"), 0) && hasChristmasChestTexturesAvailable && hasCreatedRandoChestTextures && !hasCustomChestDLs) { + if (CVarGetInteger("gLetItSnow", 0) && hasChristmasChestTexturesAvailable && hasCreatedRandoChestTextures && !hasCustomChestDLs) { if (this->dyna.actor.scale.x == 0.01f) { this->boxBodyDL = gChristmasRedTreasureChestChestFrontDL; this->boxLidDL = gChristmasRedTreasureChestChestSideAndLidDL; diff --git a/soh/src/overlays/actors/ovl_En_ChristmasDeco/z_en_christmasdeco.c b/soh/src/overlays/actors/ovl_En_ChristmasDeco/z_en_christmasdeco.c new file mode 100644 index 000000000..2a4e02be9 --- /dev/null +++ b/soh/src/overlays/actors/ovl_En_ChristmasDeco/z_en_christmasdeco.c @@ -0,0 +1,61 @@ +/* + * File: z_en_christmasdeco.c + * Overlay: ovl_En_ChristmasDeco + * Description: Custom Christmas Decorations + */ + +#include "z_en_christmasdeco.h" +#include "soh_assets.h" + +void EnChristmasDeco_Init(Actor* thisx, PlayState* play); +void EnChristmasDeco_Destroy(Actor* thisx, PlayState* play); +void EnChristmasDeco_Update(Actor* thisx, PlayState* play); +void EnChristmasDeco_Draw(Actor* thisx, PlayState* play); + +void EnChristmasDeco_Init(Actor* thisx, PlayState* play) { + if (play->sceneNum == SCENE_TEMPLE_OF_TIME) { + EnChristmasDeco* this = (EnChristmasDeco*)thisx; + this->actor.room = -1; + } +} + +void EnChristmasDeco_Destroy(Actor* thisx, PlayState* play) { + +} + +void EnChristmasDeco_Update(Actor* thisx, PlayState* play) { + +} + +void EnChristmasDeco_Draw(Actor* thisx, PlayState* play) { + float decoSize = 10.0f; + + OPEN_DISPS(play->state.gfxCtx); + + Gfx_SetupDL_25Opa(play->state.gfxCtx); + + Matrix_Scale(decoSize, decoSize, decoSize, MTXMODE_APPLY); + + gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx, (char*)__FILE__, __LINE__), G_MTX_MODELVIEW | G_MTX_LOAD); + + // Assertion Halt in Debug mode, switch to Release when testing. + if (play->sceneNum == SCENE_KAKARIKO_VILLAGE) { + gSPDisplayList(POLY_OPA_DISP++, (Gfx*)gKakarikoDecorDL); + if (LINK_IS_CHILD) { + gSPDisplayList(POLY_OPA_DISP++, (Gfx*)gKakarikoChildDecorDL); + } else { + gSPDisplayList(POLY_OPA_DISP++, (Gfx*)gKakarikoAdultDecorDL); + } + } + + if (play->sceneNum == SCENE_TEMPLE_OF_TIME) { + gSPDisplayList(POLY_OPA_DISP++, (Gfx*)gTempleOfTimeDecorDL); + if (LINK_IS_CHILD) { + gSPDisplayList(POLY_OPA_DISP++, (Gfx*)gTempleOfTimeDecorDL); + } else { + gSPDisplayList(POLY_OPA_DISP++, (Gfx*)gTempleOfTimeDecorDL); + } + } + + CLOSE_DISPS(play->state.gfxCtx); +} diff --git a/soh/src/overlays/actors/ovl_En_ChristmasDeco/z_en_christmasdeco.h b/soh/src/overlays/actors/ovl_En_ChristmasDeco/z_en_christmasdeco.h new file mode 100644 index 000000000..f2a317648 --- /dev/null +++ b/soh/src/overlays/actors/ovl_En_ChristmasDeco/z_en_christmasdeco.h @@ -0,0 +1,27 @@ +#ifndef Z_EN_CHRISTMASDECO_H +#define Z_EN_CHRISTMASDECO_H + +#include +#include "global.h" + +struct EnChristmasDeco; + +typedef void (*EnChristmasDecoActionFunc)(struct EnChristmasDeco*, PlayState*); + +typedef struct EnChristmasDeco { + Actor actor; + EnChristmasDecoActionFunc actionFunc; +} EnChristmasDeco; + +#ifdef __cplusplus +extern "C" { +#endif +void EnChristmasDeco_Init(Actor* thisx, PlayState* play); +void EnChristmasDeco_Destroy(Actor* thisx, PlayState* play); +void EnChristmasDeco_Update(Actor* thisx, PlayState* play); +void EnChristmasDeco_Draw(Actor* thisx, PlayState* play); +#ifdef __cplusplus +} +#endif + +#endif diff --git a/soh/src/overlays/actors/ovl_En_ChristmasTree/z_en_christmastree.c b/soh/src/overlays/actors/ovl_En_ChristmasTree/z_en_christmastree.c new file mode 100644 index 000000000..32a2cf81f --- /dev/null +++ b/soh/src/overlays/actors/ovl_En_ChristmasTree/z_en_christmastree.c @@ -0,0 +1,212 @@ +/* + * File: z_en_christmastree.c + * Overlay: ovl_En_ChristmasTree + * Description: Custom Christmas Tree for Ornament Hunt + */ + +#include "z_en_christmastree.h" +#include "soh_assets.h" +#include "soh/Enhancements/game-interactor/GameInteractor.h" + +void EnChristmasTree_Init(Actor* thisx, PlayState* play); +void EnChristmasTree_Destroy(Actor* thisx, PlayState* play); +void EnChristmasTree_Update(Actor* thisx, PlayState* play); +void EnChristmasTree_Draw(Actor* thisx, PlayState* play); + +void EnChristmasTree_Wait(EnChristmasTree* this, PlayState* play); +void EnChristmasTree_Talk(EnChristmasTree* this, PlayState* play); +void EnChristmasTree_SetupEndTitle(EnChristmasTree* this, PlayState* play); +void EnChristmasTree_HandleEndTitle(EnChristmasTree* this, PlayState* play); + +static ColliderCylinderInit sCylinderInit = { + { + COLTYPE_NONE, + AT_NONE, + AC_NONE, + OC1_ON | OC1_TYPE_ALL, + OC2_TYPE_2, + COLSHAPE_CYLINDER, + }, + { + ELEMTYPE_UNK0, + { 0x00000000, 0x00, 0x00 }, + { 0x00000000, 0x00, 0x00 }, + TOUCH_NONE, + BUMP_NONE, + OCELEM_ON, + }, + { 100, 330, 0, { 0, 0, 0 } }, +}; + +static CollisionCheckInfoInit2 sColChkInfoInit = { 0, 0, 0, 0, MASS_IMMOVABLE }; + +void EnChristmasTree_Init(Actor* thisx, PlayState* play) { + EnChristmasTree* this = (EnChristmasTree*)thisx; + + ActorShape_Init(&this->actor.shape, 0.0f, ActorShadow_DrawCircle, 160.0f); + Collider_InitCylinder(play, &this->collider); + Collider_SetCylinder(play, &this->collider, &this->actor, &sCylinderInit); + CollisionCheck_SetInfo2(&this->actor.colChkInfo, NULL, &sColChkInfoInit); + Actor_UpdateBgCheckInfo(play, &this->actor, 0.0f, 0.0f, 0.0f, 4); + + this->actor.targetMode = 1; + this->actor.textId = 0x406B; // Hijacking bean seller text ID so I'm sure it doesn't clash + + this->actor.shape.rot.y = -14784; + + this->actionFunc = EnChristmasTree_Wait; +} + +void EnChristmasTree_Destroy(Actor* thisx, PlayState* play) { + EnChristmasTree* this = (EnChristmasTree*)thisx; + + Collider_DestroyCylinder(play, &this->collider); +} + +void EnChristmasTree_Wait(EnChristmasTree* this, PlayState* play) { + if (Actor_ProcessTalkRequest(&this->actor, play)) { // if talk is initiated + this->actionFunc = EnChristmasTree_Talk; + } else if ((this->actor.xzDistToPlayer < 170.0f) && Randomizer_GetSettingValue(RSK_TRIFORCE_HUNT)) { // talk range + func_8002F2CC(&this->actor, play, 170.0f); + } +} + +void EnChristmasTree_Talk(EnChristmasTree* this, PlayState* play) { + u8 dialogState = Message_GetState(&play->msgCtx); + if (dialogState != TEXT_STATE_CHOICE) { + if ((dialogState == TEXT_STATE_DONE) && Message_ShouldAdvance(play)) { // advanced final textbox + // Teleport to credits when goal is reached. + if (gSaveContext.triforcePiecesCollected >= Randomizer_GetSettingValue(RSK_TRIFORCE_HUNT_PIECES_REQUIRED)) { + gSaveContext.sohStats.itemTimestamp[TIMESTAMP_TRIFORCE_COMPLETED] = GAMEPLAYSTAT_TOTAL_TIME; + gSaveContext.sohStats.gameComplete = 1; + Play_PerformSave(play); + GameInteractor_SetTriforceHuntCreditsWarpActive(true); + this->actionFunc = EnChristmasTree_SetupEndTitle; + } else { + this->actionFunc = EnChristmasTree_Wait; + } + } + } +} + +void EnChristmasTree_SetupEndTitle(EnChristmasTree* this, PlayState* play) { + Player* player = GET_PLAYER(play); + + Actor_Spawn(&play->actorCtx, play, ACTOR_END_TITLE, 0, 0, 0, 0, 0, 0, 2, false); + + player->stateFlags1 = PLAYER_STATE1_INPUT_DISABLED; + + Flags_SetRandomizerInf(RAND_INF_GRANT_GANONS_BOSSKEY); + + Play_PerformSave(play); + + this->actionFunc = EnChristmasTree_HandleEndTitle; +} + +void EnChristmasTree_HandleEndTitle(EnChristmasTree* this, PlayState* play) { + Camera* camera = Play_GetCamera(play, play->mainCamera.thisIdx); + Player* player = GET_PLAYER(play); + Vec3f camAt; + Vec3f camEye; + + // Not forcing camera mode makes the camera jitter for a bit after setting position. + // Also forces letterbox bars. + Camera_ChangeMode(camera, CAM_MODE_STILL); + + // Christmas Tree's position + camAt.x = -734.0f; + camAt.y = 130.0f; + camAt.z = 420.0f; + + // Camera's position + camEye.x = -1237.0f; + camEye.y = 218.0f; + camEye.z = 408.0f; + + // Not setting fov manually makes camera zoom in after setting the above for a little bit. + camera->fov = 60.0f; + + // Set camera + Play_CameraSetAtEye(play, play->mainCamera.thisIdx, &camAt, &camEye); + + // Hide player so he's not visible in the final screen. Also move him so target arrow on tree dissapears. + player->actor.scale.x = player->actor.scale.y = player->actor.scale.z = 0.00001f; + player->actor.world.pos.z = 500.0f; + + // Hide HUD + Interface_ChangeAlpha(1); +} + +void EnChristmasTree_Update(Actor* thisx, PlayState* play) { + EnChristmasTree* this = (EnChristmasTree*)thisx; + ColliderCylinder* collider = &this->collider; + + Collider_UpdateCylinder(thisx, collider); + CollisionCheck_SetOC(play, &play->colChkCtx, (Collider*)collider); + + Actor_SetFocus(&this->actor, 80.0f); + + uint8_t triforceHuntActive = Randomizer_GetSettingValue(RSK_TRIFORCE_HUNT); + float percentageCompleted = (float)gSaveContext.triforcePiecesCollected / + (float)Randomizer_GetSettingValue(RSK_TRIFORCE_HUNT_PIECES_REQUIRED); + + if ((percentageCompleted >= 1.0f || !triforceHuntActive) && !this->spawnedRupee) { + Actor_Spawn(&play->actorCtx, play, ACTOR_EN_WONDER_ITEM, this->actor.world.pos.x, this->actor.world.pos.y + 280, + this->actor.world.pos.z, 0, 0, LINK_IS_ADULT ? 1 : 4, 0x1ABF, false); + this->spawnedRupee = 1; + } + + this->actionFunc(this, play); +} + +void EnChristmasTree_Draw(Actor* thisx, PlayState* play) { + EnChristmasTree* this = (EnChristmasTree*)thisx; + + float treeSize = 55.0f; + uint8_t triforceHuntActive = Randomizer_GetSettingValue(RSK_TRIFORCE_HUNT); + float percentageCompleted = (float)gSaveContext.triforcePiecesCollected / + (float)Randomizer_GetSettingValue(RSK_TRIFORCE_HUNT_PIECES_REQUIRED); + + OPEN_DISPS(play->state.gfxCtx); + + Gfx_SetupDL_25Opa(play->state.gfxCtx); + + Matrix_Scale(treeSize, treeSize, treeSize, MTXMODE_APPLY); + gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx, (char*)__FILE__, __LINE__), G_MTX_MODELVIEW | G_MTX_LOAD); + + gSPDisplayList(POLY_OPA_DISP++, (Gfx*)gXmasTreeDL); + + if (percentageCompleted >= 0.1f || !triforceHuntActive) { + gSPDisplayList(POLY_OPA_DISP++, (Gfx*)gXmasDecor10DL); + } + if (percentageCompleted >= 0.2f || !triforceHuntActive) { + gSPDisplayList(POLY_OPA_DISP++, (Gfx*)gXmasDecor20DL); + } + if (percentageCompleted >= 0.3f || !triforceHuntActive) { + gSPDisplayList(POLY_OPA_DISP++, (Gfx*)gXmasDecor30DL); + } + if (percentageCompleted >= 0.4f || !triforceHuntActive) { + gSPDisplayList(POLY_OPA_DISP++, (Gfx*)gXmasDecor40DL); + } + if (percentageCompleted >= 0.5f || !triforceHuntActive) { + gSPDisplayList(POLY_OPA_DISP++, (Gfx*)gXmasDecor50DL); + } + if (percentageCompleted >= 0.6f || !triforceHuntActive) { + gSPDisplayList(POLY_OPA_DISP++, (Gfx*)gXmasDecor60DL); + } + if (percentageCompleted >= 0.7f || !triforceHuntActive) { + gSPDisplayList(POLY_OPA_DISP++, (Gfx*)gXmasDecor70DL); + } + if (percentageCompleted >= 0.8f || !triforceHuntActive) { + gSPDisplayList(POLY_OPA_DISP++, (Gfx*)gXmasDecor80DL); + } + if (percentageCompleted >= 0.9f || !triforceHuntActive) { + gSPDisplayList(POLY_OPA_DISP++, (Gfx*)gXmasDecor90DL); + } + if (percentageCompleted >= 1.0f || !triforceHuntActive) { + gSPDisplayList(POLY_OPA_DISP++, (Gfx*)gXmasDecor100DL); + gSPDisplayList(POLY_OPA_DISP++, (Gfx*)gXmasStarDL); + } + + CLOSE_DISPS(play->state.gfxCtx); +} diff --git a/soh/src/overlays/actors/ovl_En_ChristmasTree/z_en_christmastree.h b/soh/src/overlays/actors/ovl_En_ChristmasTree/z_en_christmastree.h new file mode 100644 index 000000000..fd580ac71 --- /dev/null +++ b/soh/src/overlays/actors/ovl_En_ChristmasTree/z_en_christmastree.h @@ -0,0 +1,29 @@ +#ifndef Z_EN_CHRISTMASTREE_H +#define Z_EN_CHRISTMASTREE_H + +#include +#include "global.h" + +struct EnChristmasTree; + +typedef void (*EnChristmasTreeActionFunc)(struct EnChristmasTree*, PlayState*); + +typedef struct EnChristmasTree { + Actor actor; + ColliderCylinder collider; + EnChristmasTreeActionFunc actionFunc; + u8 spawnedRupee; +} EnChristmasTree; + +#ifdef __cplusplus +extern "C" { +#endif +void EnChristmasTree_Init(Actor* thisx, PlayState* play); +void EnChristmasTree_Destroy(Actor* thisx, PlayState* play); +void EnChristmasTree_Update(Actor* thisx, PlayState* play); +void EnChristmasTree_Draw(Actor* thisx, PlayState* play); +#ifdef __cplusplus +} +#endif + +#endif diff --git a/soh/src/overlays/actors/ovl_En_Cs/z_en_cs.c b/soh/src/overlays/actors/ovl_En_Cs/z_en_cs.c index d1659d21c..be4e96dcc 100644 --- a/soh/src/overlays/actors/ovl_En_Cs/z_en_cs.c +++ b/soh/src/overlays/actors/ovl_En_Cs/z_en_cs.c @@ -1,6 +1,7 @@ #include "z_en_cs.h" #include "objects/object_cs/object_cs.h" #include "objects/object_link_child/object_link_child.h" +#include "soh_assets.h" #define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY) @@ -521,4 +522,19 @@ void EnCs_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot, Matrix_RotateZ(5.0 * M_PI / 9.0, MTXMODE_APPLY); Matrix_Get(&this->spookyMaskMtx); } + + if (CVarGetInteger("gLetItSnow", 0)) { + if (limbIndex == 15) { + OPEN_DISPS(play->state.gfxCtx); + Matrix_Push(); + Matrix_RotateZYX(8191, -5757, -24133, MTXMODE_APPLY); + Matrix_Translate(270.27f, 297.297f, -513.514f, MTXMODE_APPLY); + Matrix_Scale(1.135f, 1.135f, 1.135f, MTXMODE_APPLY); + gDPSetEnvColor(POLY_OPA_DISP++, 255, 0, 0, 255); + gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + gSPDisplayList(POLY_OPA_DISP++, gPaperCrownGenericDL); + Matrix_Pop(); + CLOSE_DISPS(play->state.gfxCtx); + } + } } diff --git a/soh/src/overlays/actors/ovl_En_Daiku_Kakariko/z_en_daiku_kakariko.c b/soh/src/overlays/actors/ovl_En_Daiku_Kakariko/z_en_daiku_kakariko.c index 6cc91e0c7..ea01c116a 100644 --- a/soh/src/overlays/actors/ovl_En_Daiku_Kakariko/z_en_daiku_kakariko.c +++ b/soh/src/overlays/actors/ovl_En_Daiku_Kakariko/z_en_daiku_kakariko.c @@ -6,6 +6,7 @@ #include "z_en_daiku_kakariko.h" #include "objects/object_daiku/object_daiku.h" +#include "soh_assets.h" #define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_UPDATE_WHILE_CULLED) @@ -539,6 +540,51 @@ void EnDaikuKakariko_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, V gSPDisplayList(POLY_OPA_DISP++, carpenterHeadDLists[this->actor.params & 3]); } + if (CVarGetInteger("gLetItSnow", 0)) { + if (limbIndex == 15) { + Matrix_Push(); + switch(this->actor.params) { + case 259: { + Matrix_RotateZYX(4649, 0, -3543, MTXMODE_APPLY); + Matrix_Translate(824.324f, 324.324f, -175.676f, MTXMODE_APPLY); + Matrix_Scale(0.966f, 0.966f, 0.966f, MTXMODE_APPLY); + gDPSetEnvColor(POLY_OPA_DISP++, 255, 0, 255, 255); + gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + gSPDisplayList(POLY_OPA_DISP++, gPaperCrownGenericDL); + break; + } + case 513: { + Matrix_RotateZYX(0, 0, -6200, MTXMODE_APPLY); + Matrix_Translate(770.27f, 567.568f, 0.0f, MTXMODE_APPLY); + Matrix_Scale(0.899f, 0.899f, 0.899f, MTXMODE_APPLY); + gDPSetEnvColor(POLY_OPA_DISP++, 0, 255, 255, 255); + gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + gSPDisplayList(POLY_OPA_DISP++, gPaperCrownGenericDL); + break; + } + case 2: { + Matrix_RotateZYX(0, 0, 7970, MTXMODE_APPLY); + Matrix_Translate(1270.27f, -878.378f, 0.0f, MTXMODE_APPLY); + Matrix_Scale(1.0f, 1.0f, 1.0f, MTXMODE_APPLY); + gDPSetEnvColor(POLY_OPA_DISP++, 0, 255, 0, 255); + gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + gSPDisplayList(POLY_OPA_DISP++, gPaperCrownGenericDL); + break; + } + case -256: + default: { + Matrix_RotateZYX(0, 0, -8635, MTXMODE_APPLY); + Matrix_Translate(675.676f, 716.216f, 0.0f, MTXMODE_APPLY); + Matrix_Scale(0.899f, 0.899f, 0.899f, MTXMODE_APPLY); + gDPSetEnvColor(POLY_OPA_DISP++, 255, 0, 0, 255); + gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + gSPDisplayList(POLY_OPA_DISP++, gPaperCrownGenericDL); + } + } + Matrix_Pop(); + } + } + CLOSE_DISPS(play->state.gfxCtx); } diff --git a/soh/src/overlays/actors/ovl_En_Dekubaba/z_en_dekubaba.c b/soh/src/overlays/actors/ovl_En_Dekubaba/z_en_dekubaba.c index 2b4344f68..524579aa9 100644 --- a/soh/src/overlays/actors/ovl_En_Dekubaba/z_en_dekubaba.c +++ b/soh/src/overlays/actors/ovl_En_Dekubaba/z_en_dekubaba.c @@ -3,6 +3,7 @@ #include "objects/gameplay_keep/gameplay_keep.h" #include "overlays/effects/ovl_Effect_Ss_Hahen/z_eff_ss_hahen.h" #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" +#include "soh_assets.h" #define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_HOSTILE) @@ -1279,6 +1280,20 @@ void EnDekubaba_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* if (limbIndex == 1) { Collider_UpdateSpheres(limbIndex, &this->collider); } + + if (CVarGetInteger("gLetItSnow", 0)) { + if (limbIndex == 4) { + OPEN_DISPS(play->state.gfxCtx); + Matrix_Push(); + Matrix_RotateZYX(16485, -1425, -20964, MTXMODE_APPLY); + Matrix_Translate(-149.0f, 92.0f, -587.0f, MTXMODE_APPLY); + Matrix_Scale(1.534f, 1.534f, 1.534f, MTXMODE_APPLY); + gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + gSPDisplayList(POLY_OPA_DISP++, gSantaHatGenericDL); + Matrix_Pop(); + CLOSE_DISPS(play->state.gfxCtx); + } + } } void EnDekubaba_Draw(Actor* thisx, PlayState* play) { diff --git a/soh/src/overlays/actors/ovl_En_Dns/z_en_dns.c b/soh/src/overlays/actors/ovl_En_Dns/z_en_dns.c index d2d8963c3..aef178231 100644 --- a/soh/src/overlays/actors/ovl_En_Dns/z_en_dns.c +++ b/soh/src/overlays/actors/ovl_En_Dns/z_en_dns.c @@ -8,6 +8,7 @@ #include "objects/object_shopnuts/object_shopnuts.h" #include "vt.h" #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" +#include "soh_assets.h" #define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY) @@ -503,9 +504,27 @@ void EnDns_Update(Actor* thisx, PlayState* play) { } } +void EnDns_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot, void* thisx) { + EnDns* this = (EnDns*)thisx; + + if (CVarGetInteger("gLetItSnow", 0)) { + if (limbIndex == 17) { + OPEN_DISPS(play->state.gfxCtx); + Matrix_Push(); + Matrix_RotateZYX(0, 0, 17490, MTXMODE_APPLY); + Matrix_Translate(4200.0f, -472.973f, 0.0f, MTXMODE_APPLY); + Matrix_Scale(4.932f, 4.932f, 4.932f, MTXMODE_APPLY); + gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + gSPDisplayList(POLY_OPA_DISP++, gSantaHatGenericDL); + Matrix_Pop(); + CLOSE_DISPS(play->state.gfxCtx); + } + } +} + void EnDns_Draw(Actor* thisx, PlayState* play) { EnDns* this = (EnDns*)thisx; Gfx_SetupDL_25Opa(play->state.gfxCtx); - SkelAnime_DrawSkeletonOpa(play, &this->skelAnime, NULL, NULL, &this->actor); + SkelAnime_DrawSkeletonOpa(play, &this->skelAnime, NULL, EnDns_PostLimbDraw, &this->actor); } diff --git a/soh/src/overlays/actors/ovl_En_Dodongo/z_en_dodongo.c b/soh/src/overlays/actors/ovl_En_Dodongo/z_en_dodongo.c index 359477614..a342e9412 100644 --- a/soh/src/overlays/actors/ovl_En_Dodongo/z_en_dodongo.c +++ b/soh/src/overlays/actors/ovl_En_Dodongo/z_en_dodongo.c @@ -3,6 +3,7 @@ #include "overlays/actors/ovl_En_Bombf/z_en_bombf.h" #include "objects/object_dodongo/object_dodongo.h" #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" +#include "soh_assets.h" #define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_HOSTILE | ACTOR_FLAG_UPDATE_WHILE_CULLED) @@ -915,6 +916,21 @@ void EnDodongo_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* Matrix_MultVec3f(&baseOffset, &this->icePos[i]); } } + + if (CVarGetInteger("gLetItSnow", 0)) { + if (limbIndex == 7) { + OPEN_DISPS(play->state.gfxCtx); + Matrix_Push(); + Matrix_RotateZYX(0, 0, -13063, MTXMODE_APPLY); + Matrix_Translate(864.865f, 756.757f, 0.0f, MTXMODE_APPLY); + Matrix_Scale(0.662f, 0.662f, 0.662f, MTXMODE_APPLY); + gDPSetEnvColor(POLY_OPA_DISP++, 255, 0, 0, 255); + gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + gSPDisplayList(POLY_OPA_DISP++, gPaperCrownGenericDL); + Matrix_Pop(); + CLOSE_DISPS(play->state.gfxCtx); + } + } } void EnDodongo_Draw(Actor* thisx, PlayState* play2) { diff --git a/soh/src/overlays/actors/ovl_En_Dog/z_en_dog.c b/soh/src/overlays/actors/ovl_En_Dog/z_en_dog.c index b226d00f2..e9f3d877f 100644 --- a/soh/src/overlays/actors/ovl_En_Dog/z_en_dog.c +++ b/soh/src/overlays/actors/ovl_En_Dog/z_en_dog.c @@ -6,6 +6,7 @@ #include "z_en_dog.h" #include "objects/object_dog/object_dog.h" +#include "soh_assets.h" #define FLAGS 0 @@ -494,6 +495,19 @@ s32 EnDog_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* p } void EnDog_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot, void* thisx) { + if (CVarGetInteger("gLetItSnow", 0)) { + if (limbIndex == 4) { + OPEN_DISPS(play->state.gfxCtx); + Matrix_Push(); + Matrix_RotateZYX(20811, -32768, 3985, MTXMODE_APPLY); + Matrix_Translate(0.0f, 0.0f, 0.0f, MTXMODE_APPLY); + Matrix_Scale(1.25f, 1.25f, 1.25f, MTXMODE_APPLY); + gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + gSPDisplayList(POLY_OPA_DISP++, gSantaHatGenericDL); + Matrix_Pop(); + CLOSE_DISPS(play->state.gfxCtx); + } + } } void EnDog_Draw(Actor* thisx, PlayState* play) { diff --git a/soh/src/overlays/actors/ovl_En_Ds/z_en_ds.c b/soh/src/overlays/actors/ovl_En_Ds/z_en_ds.c index 874b62cea..e46a95d79 100644 --- a/soh/src/overlays/actors/ovl_En_Ds/z_en_ds.c +++ b/soh/src/overlays/actors/ovl_En_Ds/z_en_ds.c @@ -7,6 +7,7 @@ #include "z_en_ds.h" #include "objects/object_ds/object_ds.h" #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" +#include "soh_assets.h" #define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY) @@ -285,6 +286,21 @@ void EnDs_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot, if (limbIndex == 5) { Matrix_MultVec3f(&sMultVec, &this->actor.focus.pos); } + + if (CVarGetInteger("gLetItSnow", 0)) { + if (limbIndex == 5) { + OPEN_DISPS(play->state.gfxCtx); + Matrix_Push(); + Matrix_RotateZYX(-1329, -3100, 0, MTXMODE_APPLY); + Matrix_Translate(1270.27f, 351.351f, -310.811f, MTXMODE_APPLY); + Matrix_Scale(0.797f, 0.797f, 0.797f, MTXMODE_APPLY); + gDPSetEnvColor(POLY_OPA_DISP++, 255, 0, 255, 255); + gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + gSPDisplayList(POLY_OPA_DISP++, gPaperCrownGenericDL); + Matrix_Pop(); + CLOSE_DISPS(play->state.gfxCtx); + } + } } void EnDs_Draw(Actor* thisx, PlayState* play) { diff --git a/soh/src/overlays/actors/ovl_En_Du/z_en_du.c b/soh/src/overlays/actors/ovl_En_Du/z_en_du.c index 20acdec4c..3bfa77b04 100644 --- a/soh/src/overlays/actors/ovl_En_Du/z_en_du.c +++ b/soh/src/overlays/actors/ovl_En_Du/z_en_du.c @@ -2,6 +2,7 @@ #include "objects/object_du/object_du.h" #include "scenes/overworld/spot18/spot18_scene.h" #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" +#include "soh_assets.h" #define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_NO_FREEZE_OCARINA) @@ -653,6 +654,20 @@ void EnDu_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot, if (limbIndex == 16) { Matrix_MultVec3f(&D_809FF40C, &this->actor.focus.pos); } + + if (CVarGetInteger("gLetItSnow", 0)) { + if (limbIndex == 17) { + OPEN_DISPS(play->state.gfxCtx); + Matrix_Push(); + Matrix_RotateZYX(13062, -1329, -15499, MTXMODE_APPLY); + Matrix_Translate(945.946f, -297.297f, 608.108f, MTXMODE_APPLY); + Matrix_Scale(1.217f, 1.217f, 1.217f, MTXMODE_APPLY); + gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + gSPDisplayList(POLY_OPA_DISP++, gSantaHatGenericDL); + Matrix_Pop(); + CLOSE_DISPS(play->state.gfxCtx); + } + } } void EnDu_Draw(Actor* thisx, PlayState* play) { diff --git a/soh/src/overlays/actors/ovl_En_Elf/z_en_elf.c b/soh/src/overlays/actors/ovl_En_Elf/z_en_elf.c index 477d60d64..acbce16ae 100644 --- a/soh/src/overlays/actors/ovl_En_Elf/z_en_elf.c +++ b/soh/src/overlays/actors/ovl_En_Elf/z_en_elf.c @@ -7,6 +7,7 @@ #include "z_en_elf.h" #include "objects/gameplay_keep/gameplay_keep.h" #include +#include "soh_assets.h" #define FLAGS (ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_DRAW_WHILE_CULLED | ACTOR_FLAG_NO_FREEZE_OCARINA) @@ -1504,6 +1505,26 @@ s32 EnElf_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* p return false; } +s32 EnElf_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot, void* thisx) { + EnElf* this = (EnElf*)thisx; + + if (CVarGetInteger("gLetItSnow", 0)) { + if (limbIndex == 2) { + OPEN_DISPS(play->state.gfxCtx); + Matrix_Push(); + Matrix_RotateZYX(0, 0, 17047, MTXMODE_APPLY); + Matrix_Translate(202.0f, 0.0f, 0.0f, MTXMODE_APPLY); + Matrix_Scale(0.595f, 0.595f, 0.595f, MTXMODE_APPLY); + gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + gSPDisplayList(POLY_OPA_DISP++, gSantaHatGenericDL); + Matrix_Pop(); + CLOSE_DISPS(play->state.gfxCtx); + } + } + + return false; +} + void EnElf_Draw(Actor* thisx, PlayState* play) { s32 pad; f32 alphaScale; @@ -1541,7 +1562,7 @@ void EnElf_Draw(Actor* thisx, PlayState* play) { gDPSetEnvColor(POLY_XLU_DISP++, (u8)this->outerColor.r, (u8)this->outerColor.g, (u8)this->outerColor.b, (u8)(envAlpha * alphaScale)); POLY_XLU_DISP = SkelAnime_DrawSkeleton2(play, &this->skelAnime, - EnElf_OverrideLimbDraw, NULL, this, POLY_XLU_DISP); + EnElf_OverrideLimbDraw, EnElf_PostLimbDraw, this, POLY_XLU_DISP); CLOSE_DISPS(play->state.gfxCtx); } diff --git a/soh/src/overlays/actors/ovl_En_Fu/z_en_fu.c b/soh/src/overlays/actors/ovl_En_Fu/z_en_fu.c index 98b8a4dda..321bf35de 100644 --- a/soh/src/overlays/actors/ovl_En_Fu/z_en_fu.c +++ b/soh/src/overlays/actors/ovl_En_Fu/z_en_fu.c @@ -7,6 +7,7 @@ #include "z_en_fu.h" #include "objects/object_fu/object_fu.h" #include "scenes/indoors/hakasitarelay/hakasitarelay_scene.h" +#include "soh_assets.h" #define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_NO_FREEZE_OCARINA) @@ -301,6 +302,20 @@ void EnFu_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot, if (limbIndex == FU_LIMB_HEAD) { Matrix_MultVec3f(&sMtxSrc, &this->actor.focus.pos); } + + if (CVarGetInteger("gLetItSnow", 0)) { + if (limbIndex == 14) { + OPEN_DISPS(play->state.gfxCtx); + Matrix_Push(); + Matrix_RotateZYX(-27454, 0, 1992, MTXMODE_APPLY); + Matrix_Translate(878.378f, -108.108f, 67.568f, MTXMODE_APPLY); + Matrix_Scale(1.135f, 1.135f, 1.135f, MTXMODE_APPLY); + gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + gSPDisplayList(POLY_OPA_DISP++, gSantaHatGenericDL); + Matrix_Pop(); + CLOSE_DISPS(play->state.gfxCtx); + } + } } void EnFu_Draw(Actor* thisx, PlayState* play) { diff --git a/soh/src/overlays/actors/ovl_En_Heishi4/z_en_heishi4.c b/soh/src/overlays/actors/ovl_En_Heishi4/z_en_heishi4.c index 981824bd2..0c2079a3f 100644 --- a/soh/src/overlays/actors/ovl_En_Heishi4/z_en_heishi4.c +++ b/soh/src/overlays/actors/ovl_En_Heishi4/z_en_heishi4.c @@ -1,6 +1,7 @@ #include "z_en_heishi4.h" #include "objects/object_sd/object_sd.h" #include "vt.h" +#include "soh_assets.h" #define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY) @@ -414,9 +415,29 @@ s32 EnHeishi_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f return false; } +s32 EnHeishi4_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot, void* thisx) { + EnHeishi4* this = (EnHeishi4*)thisx; + + if (CVarGetInteger("gLetItSnow", 0)) { + if (limbIndex == 16) { + OPEN_DISPS(play->state.gfxCtx); + Matrix_Push(); + Matrix_RotateZYX(0, 0, 442, MTXMODE_APPLY); + Matrix_Translate(256.757f, 121.621f, 0.0f, MTXMODE_APPLY); + Matrix_Scale(1.337f, 1.337f, 1.337f, MTXMODE_APPLY); + gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + gSPDisplayList(POLY_OPA_DISP++, gSantaHatGenericDL); + Matrix_Pop(); + CLOSE_DISPS(play->state.gfxCtx); + } + } + + return false; +} + void EnHeishi4_Draw(Actor* thisx, PlayState* play) { EnHeishi4* this = (EnHeishi4*)thisx; Gfx_SetupDL_25Opa(play->state.gfxCtx); - SkelAnime_DrawSkeletonOpa(play, &this->skelAnime, EnHeishi_OverrideLimbDraw, NULL, this); + SkelAnime_DrawSkeletonOpa(play, &this->skelAnime, EnHeishi_OverrideLimbDraw, EnHeishi4_PostLimbDraw, this); } diff --git a/soh/src/overlays/actors/ovl_En_Hs2/z_en_hs2.c b/soh/src/overlays/actors/ovl_En_Hs2/z_en_hs2.c index 3f8e61481..84eb63d58 100644 --- a/soh/src/overlays/actors/ovl_En_Hs2/z_en_hs2.c +++ b/soh/src/overlays/actors/ovl_En_Hs2/z_en_hs2.c @@ -7,6 +7,7 @@ #include "z_en_hs2.h" #include "vt.h" #include "objects/object_hs/object_hs.h" +#include "soh_assets.h" #define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY) @@ -65,6 +66,14 @@ void EnHs2_Init(Actor* thisx, PlayState* play) { this->actionFunc = func_80A6F1A4; this->unk_2A8 = 0; this->actor.targetMode = 6; + + if (play->sceneNum == SCENE_KAKARIKO_VILLAGE) { + this->actor.world.pos.x = 756.0; + this->actor.world.pos.y = 80.0; + this->actor.world.pos.z = 1378.0; + this->actor.shape.rot.y = 32534; + } + } void EnHs2_Destroy(Actor* thisx, PlayState* play) { @@ -160,6 +169,21 @@ void EnHs2_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot, if (limbIndex == 9) { Matrix_MultVec3f(&D_80A6F4CC, &this->actor.focus.pos); } + + if (CVarGetInteger("gLetItSnow", 0)) { + if (limbIndex == 9) { + OPEN_DISPS(play->state.gfxCtx); + Matrix_Push(); + Matrix_RotateZYX(0, 0, -6421, MTXMODE_APPLY); + Matrix_Translate(621.622f, 378.378f, 0.0f, MTXMODE_APPLY); + Matrix_Scale(0.763f, 0.763f, 0.763f, MTXMODE_APPLY); + gDPSetEnvColor(POLY_OPA_DISP++, 0, 255, 255, 255); + gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + gSPDisplayList(POLY_OPA_DISP++, gPaperCrownGenericDL); + Matrix_Pop(); + CLOSE_DISPS(play->state.gfxCtx); + } + } } void EnHs2_Draw(Actor* thisx, PlayState* play) { diff --git a/soh/src/overlays/actors/ovl_En_Hy/z_en_hy.c b/soh/src/overlays/actors/ovl_En_Hy/z_en_hy.c index 76ca5049e..45521e9c6 100644 --- a/soh/src/overlays/actors/ovl_En_Hy/z_en_hy.c +++ b/soh/src/overlays/actors/ovl_En_Hy/z_en_hy.c @@ -15,6 +15,7 @@ #include "objects/object_cob/object_cob.h" #include "objects/object_os_anime/object_os_anime.h" #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" +#include "soh_assets.h" #define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_UPDATE_WHILE_CULLED) @@ -890,6 +891,21 @@ void EnHy_Init(Actor* thisx, PlayState* play) { Actor_Kill(&this->actor); } + if (play->sceneNum == SCENE_KAKARIKO_VILLAGE) { + if (this->actor.params == 1929) { + this->actor.world.pos.x = 261.826; + this->actor.world.pos.y = 240.0; + this->actor.world.pos.z = 1669.660; + this->actor.shape.rot.y = 23784; + } + if (this->actor.params == 1930) { + this->actor.world.pos.x = 262.224; + this->actor.world.pos.y = 240.0; + this->actor.world.pos.z = 1594.390; + this->actor.shape.rot.y = 7728; + } + } + this->getItemEntry = (GetItemEntry)GET_ITEM_NONE; this->actionFunc = EnHy_InitImpl; } @@ -1171,6 +1187,101 @@ void EnHy_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot, Matrix_MultVec3f(&sp3C, &this->actor.focus.pos); } + if (CVarGetInteger("gLetItSnow", 0)) { + if (limbIndex == 15) { + Matrix_Push(); + switch(this->actor.params) { + case 1938: { + Matrix_RotateZYX(5313, 0, -1550, MTXMODE_APPLY); + Matrix_Translate(1108.108f, 54.054f, 0.0f, MTXMODE_APPLY); + Matrix_Scale(1.0f, 1.0f, 1.0f, MTXMODE_APPLY); + gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + gSPDisplayList(POLY_OPA_DISP++, gSantaHatGenericDL); + break; + } + case 135: + case 7: { + Matrix_RotateZYX(1328, 0, 885, MTXMODE_APPLY); + Matrix_Translate(864.865f, 229.73f, 0.0f, MTXMODE_APPLY); + Matrix_Scale(1.25f, 1.25f, 1.25f, MTXMODE_APPLY); + gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + gSPDisplayList(POLY_OPA_DISP++, gSantaHatGenericDL); + break; + } + case 1922: { + Matrix_RotateZYX(4206, 221, -3543, MTXMODE_APPLY); + Matrix_Translate(662.162f, 162.162f, -27.027f, MTXMODE_APPLY); + Matrix_Scale(1.0f, 1.0f, 1.0f, MTXMODE_APPLY); + gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + gSPDisplayList(POLY_OPA_DISP++, gSantaHatGenericDL); + break; + } + case 1925: { + Matrix_RotateZYX(-9521, 442, -5536, MTXMODE_APPLY); + Matrix_Translate(351.351f, 256.757f, 283.784f, MTXMODE_APPLY); + Matrix_Scale(1.217f, 1.217f, 1.217f, MTXMODE_APPLY); + gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + gSPDisplayList(POLY_OPA_DISP++, gSantaHatGenericDL); + break; + } + case 1920: { + Matrix_RotateZYX(0, 0, 3321, MTXMODE_APPLY); + Matrix_Translate(1148.649f, 0.0f, 0.0f, MTXMODE_APPLY); + Matrix_Scale(0.73f, 0.73f, 0.73f, MTXMODE_APPLY); + gDPSetEnvColor(POLY_OPA_DISP++, 255, 0, 255, 255); + gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + gSPDisplayList(POLY_OPA_DISP++, gPaperCrownGenericDL); + break; + } + case 1930: { + Matrix_RotateZYX(3542, 0, 0, MTXMODE_APPLY); + Matrix_Translate(972.973f, -13.514f, 54.054f, MTXMODE_APPLY); + Matrix_Scale(0.831f, 0.831f, 0.831f, MTXMODE_APPLY); + gDPSetEnvColor(POLY_OPA_DISP++, 255, 0, 0, 255); + gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + gSPDisplayList(POLY_OPA_DISP++, gPaperCrownGenericDL); + break; + } + case 1929: { + Matrix_RotateZYX(3542, 0, 0, MTXMODE_APPLY); + Matrix_Translate(972.973f, -13.514f, 54.054f, MTXMODE_APPLY); + Matrix_Scale(0.831f, 0.831f, 0.831f, MTXMODE_APPLY); + gDPSetEnvColor(POLY_OPA_DISP++, 0, 0, 255, 255); + gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + gSPDisplayList(POLY_OPA_DISP++, gPaperCrownGenericDL); + break; + } + case 1921: { + Matrix_RotateZYX(0, 0, 664, MTXMODE_APPLY); + Matrix_Translate(1256.757f, -297.297f, -40.541f, MTXMODE_APPLY); + Matrix_Scale(1.135f, 1.135f, 1.135f, MTXMODE_APPLY); + gDPSetEnvColor(POLY_OPA_DISP++, 0, 255, 0, 255); + gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + gSPDisplayList(POLY_OPA_DISP++, gPaperCrownGenericDL); + break; + } + case 1939: { + Matrix_RotateZYX(2656, 1328, 1992, MTXMODE_APPLY); + Matrix_Translate(1094.594f, 94.594f, 0.0f, MTXMODE_APPLY); + Matrix_Scale(1.351f, 1.351f, 1.351f, MTXMODE_APPLY); + gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + gSPDisplayList(POLY_OPA_DISP++, gSantaHatGenericDL); + break; + } + default: { + Matrix_RotateZYX(0, 0, 664, MTXMODE_APPLY); + Matrix_Translate(783.784f, 94.594f, 0.0f, MTXMODE_APPLY); + Matrix_Scale(0.662f, 0.662f, 0.662f, MTXMODE_APPLY); + gDPSetEnvColor(POLY_OPA_DISP++, 255, 255, 0, 255); + gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + gSPDisplayList(POLY_OPA_DISP++, gPaperCrownGenericDL); + break; + } + } + Matrix_Pop(); + } + } + CLOSE_DISPS(play->state.gfxCtx); } diff --git a/soh/src/overlays/actors/ovl_En_Ik/z_en_ik.c b/soh/src/overlays/actors/ovl_En_Ik/z_en_ik.c index 9ab8735dd..f6566f163 100644 --- a/soh/src/overlays/actors/ovl_En_Ik/z_en_ik.c +++ b/soh/src/overlays/actors/ovl_En_Ik/z_en_ik.c @@ -9,6 +9,7 @@ #include "objects/object_ik/object_ik.h" #include "vt.h" #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" +#include "soh_assets.h" #define FLAGS ACTOR_FLAG_UPDATE_WHILE_CULLED @@ -944,6 +945,19 @@ void EnIk_PostLimbDraw3(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot, break; } + if (CVarGetInteger("gLetItSnow", 0)) { + if (limbIndex == 11) { + Matrix_Push(); + Matrix_RotateZYX(0, 0, -15056, MTXMODE_APPLY); + Matrix_Translate(824.324f, 472.973f, 0.0f, MTXMODE_APPLY); + Matrix_Scale(0.845f, 0.845f, 0.845f, MTXMODE_APPLY); + gDPSetEnvColor(POLY_OPA_DISP++, 255, 100, 100, 255); + gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + gSPDisplayList(POLY_OPA_DISP++, gPaperCrownGenericDL); + Matrix_Pop(); + } + } + CLOSE_DISPS(play->state.gfxCtx); } @@ -1225,6 +1239,20 @@ void EnIk_PostLimbDraw2(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot, } } break; } + + if (CVarGetInteger("gLetItSnow", 0)) { + if (limbIndex == 11) { + Matrix_Push(); + Matrix_RotateZYX(0, 0, -15056, MTXMODE_APPLY); + Matrix_Translate(824.324f, 472.973f, 0.0f, MTXMODE_APPLY); + Matrix_Scale(0.845f, 0.845f, 0.845f, MTXMODE_APPLY); + gDPSetEnvColor(POLY_OPA_DISP++, 255, 100, 100, 255); + gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + gSPDisplayList(POLY_OPA_DISP++, gPaperCrownGenericDL); + Matrix_Pop(); + } + } + CLOSE_DISPS(gfxCtx); } @@ -1375,6 +1403,19 @@ void EnIk_PostLimbDraw1(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot, break; } + if (CVarGetInteger("gLetItSnow", 0)) { + if (limbIndex == 11) { + Matrix_Push(); + Matrix_RotateZYX(0, 0, -15056, MTXMODE_APPLY); + Matrix_Translate(824.324f, 472.973f, 0.0f, MTXMODE_APPLY); + Matrix_Scale(0.845f, 0.845f, 0.845f, MTXMODE_APPLY); + gDPSetEnvColor(POLY_OPA_DISP++, 255, 100, 100, 255); + gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + gSPDisplayList(POLY_OPA_DISP++, gPaperCrownGenericDL); + Matrix_Pop(); + } + } + CLOSE_DISPS(gfxCtx); } diff --git a/soh/src/overlays/actors/ovl_En_In/z_en_in.c b/soh/src/overlays/actors/ovl_En_In/z_en_in.c index 9f8c065f0..98545842b 100644 --- a/soh/src/overlays/actors/ovl_En_In/z_en_in.c +++ b/soh/src/overlays/actors/ovl_En_In/z_en_in.c @@ -1,6 +1,7 @@ #include "z_en_in.h" #include "overlays/actors/ovl_En_Horse/z_en_horse.h" #include "objects/object_in/object_in.h" +#include "soh_assets.h" #define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_UPDATE_WHILE_CULLED) @@ -987,6 +988,18 @@ void EnIn_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot, gSPDisplayList(POLY_OPA_DISP++, gIngoChildEraPitchForkDL); } + if (CVarGetInteger("gLetItSnow", 0)) { + if (limbIndex == 16) { + Matrix_Push(); + Matrix_RotateZYX(-8192, -222, -11513, MTXMODE_APPLY); + Matrix_Translate(770.0f, 837.0f, 878.0f, MTXMODE_APPLY); + Matrix_Scale(1.068f, 1.068f, 1.068f, MTXMODE_APPLY); + gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + gSPDisplayList(POLY_OPA_DISP++, gSantaHatGenericDL); + Matrix_Pop(); + } + } + CLOSE_DISPS(play->state.gfxCtx); } diff --git a/soh/src/overlays/actors/ovl_En_Jj/z_en_jj.c b/soh/src/overlays/actors/ovl_En_Jj/z_en_jj.c index 28d8967c2..9a80b75ad 100644 --- a/soh/src/overlays/actors/ovl_En_Jj/z_en_jj.c +++ b/soh/src/overlays/actors/ovl_En_Jj/z_en_jj.c @@ -7,6 +7,7 @@ #include "z_en_jj.h" #include "objects/object_jj/object_jj.h" #include "overlays/actors/ovl_Eff_Dust/z_eff_dust.h" +#include "soh_assets.h" #define FLAGS (ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_DRAW_WHILE_CULLED) @@ -307,6 +308,26 @@ void EnJj_Update(Actor* thisx, PlayState* play) { this->skelAnime.jointTable[10].z = this->mouthOpenAngle; } +s32 EnJj_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot, void* thisx) { + EnJj* this = (EnJj*)thisx; + + if (CVarGetInteger("gLetItSnow", 0)) { + if (limbIndex == 13) { + OPEN_DISPS(play->state.gfxCtx); + Matrix_Push(); + Matrix_RotateZYX(4649, -8635, 15276, MTXMODE_APPLY); + Matrix_Translate(27.027f, 135.135f, -81.081f, MTXMODE_APPLY); + Matrix_Scale(0.304f, 0.304f, 0.304f, MTXMODE_APPLY); + gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + gSPDisplayList(POLY_OPA_DISP++, gSantaHatGenericDL); + Matrix_Pop(); + CLOSE_DISPS(play->state.gfxCtx); + } + } + + return false; +} + void EnJj_Draw(Actor* thisx, PlayState* play2) { static void* eyeTextures[] = { gJabuJabuEyeOpenTex, gJabuJabuEyeHalfTex, gJabuJabuEyeClosedTex }; PlayState* play = play2; @@ -318,7 +339,7 @@ void EnJj_Draw(Actor* thisx, PlayState* play2) { Matrix_Translate(0.0f, (cosf(this->skelAnime.curFrame * (M_PI / 41.0f)) * 10.0f) - 10.0f, 0.0f, MTXMODE_APPLY); Matrix_Scale(10.0f, 10.0f, 10.0f, MTXMODE_APPLY); gSPSegment(POLY_OPA_DISP++, 0x08, SEGMENTED_TO_VIRTUAL(eyeTextures[this->eyeIndex])); - SkelAnime_DrawSkeletonOpa(play, &this->skelAnime, NULL, NULL, this); + SkelAnime_DrawSkeletonOpa(play, &this->skelAnime, NULL, EnJj_PostLimbDraw, this); CLOSE_DISPS(play->state.gfxCtx); } diff --git a/soh/src/overlays/actors/ovl_En_Ko/z_en_ko.c b/soh/src/overlays/actors/ovl_En_Ko/z_en_ko.c index 466f7271d..94b889bf4 100644 --- a/soh/src/overlays/actors/ovl_En_Ko/z_en_ko.c +++ b/soh/src/overlays/actors/ovl_En_Ko/z_en_ko.c @@ -1351,6 +1351,12 @@ Gfx* EnKo_SetEnvColor(GraphicsContext* gfxCtx, u8 r, u8 g, u8 b, u8 a) { void EnKo_Draw(Actor* thisx, PlayState* play) { EnKo* this = (EnKo*)thisx; Color_RGBA8 tunicColor = sModelInfo[ENKO_TYPE].tunicColor; + + // Overwrite to red tunic as default for Holidays in Hyrule build + tunicColor.r = 255; + tunicColor.g = 0; + tunicColor.b = 0; + Color_RGBA8 bootsColor = sModelInfo[ENKO_TYPE].bootsColor; if (CVarGetInteger(CVAR_COSMETIC("NPC.Kokiri.Changed"), 0)) { diff --git a/soh/src/overlays/actors/ovl_En_Kusa/z_en_kusa.c b/soh/src/overlays/actors/ovl_En_Kusa/z_en_kusa.c index a0e529991..f1f376f4f 100644 --- a/soh/src/overlays/actors/ovl_En_Kusa/z_en_kusa.c +++ b/soh/src/overlays/actors/ovl_En_Kusa/z_en_kusa.c @@ -266,6 +266,12 @@ void EnKusa_Init(Actor* thisx, PlayState* play) { return; } + if (gPlayState->sceneNum == SCENE_KAKARIKO_VILLAGE && this->actor.world.pos.z < 600.0) { + this->actor.world.pos.x += 1620.672; + this->actor.world.pos.y += 80; + this->actor.world.pos.z += 900.884; + } + EnKusa_SetupWaitObject(this); } diff --git a/soh/src/overlays/actors/ovl_En_Ma1/z_en_ma1.c b/soh/src/overlays/actors/ovl_En_Ma1/z_en_ma1.c index bc164e0c7..5fef81bcf 100644 --- a/soh/src/overlays/actors/ovl_En_Ma1/z_en_ma1.c +++ b/soh/src/overlays/actors/ovl_En_Ma1/z_en_ma1.c @@ -7,6 +7,7 @@ #include "z_en_ma1.h" #include "objects/object_ma1/object_ma1.h" #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" +#include "soh_assets.h" #define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_DRAW_WHILE_CULLED | ACTOR_FLAG_NO_FREEZE_OCARINA) @@ -456,6 +457,21 @@ void EnMa1_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot, if (limbIndex == 15) { Matrix_MultVec3f(&vec, &this->actor.focus.pos); } + + if (CVarGetInteger("gLetItSnow", 0)) { + if (limbIndex == 15) { + OPEN_DISPS(play->state.gfxCtx); + Matrix_Push(); + Matrix_RotateZYX(0, 0, 0, MTXMODE_APPLY); + Matrix_Translate(756.757f, 0.0f, 0.0f, MTXMODE_APPLY); + Matrix_Scale(0.73f, 0.73f, 0.73f, MTXMODE_APPLY); + gDPSetEnvColor(POLY_OPA_DISP++, 0, 0, 255, 255); + gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + gSPDisplayList(POLY_OPA_DISP++, gPaperCrownGenericDL); + Matrix_Pop(); + CLOSE_DISPS(play->state.gfxCtx); + } + } } void EnMa1_Draw(Actor* thisx, PlayState* play) { diff --git a/soh/src/overlays/actors/ovl_En_Niw/z_en_niw.c b/soh/src/overlays/actors/ovl_En_Niw/z_en_niw.c index 45433afd6..50ed827b0 100644 --- a/soh/src/overlays/actors/ovl_En_Niw/z_en_niw.c +++ b/soh/src/overlays/actors/ovl_En_Niw/z_en_niw.c @@ -9,6 +9,7 @@ #include "overlays/actors/ovl_En_Attack_Niw/z_en_attack_niw.h" #include "vt.h" #include "soh/frame_interpolation.h" +#include "soh_assets.h" #define FLAGS (ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_ALWAYS_THROWN) @@ -1132,13 +1133,33 @@ s32 EnNiw_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* p return false; } +s32 EnNiw_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot, void* thisx) { + EnNiw* this = (EnNiw*)thisx; + + if (CVarGetInteger("gLetItSnow", 0)) { + if (limbIndex == 15) { + OPEN_DISPS(play->state.gfxCtx); + Matrix_Push(); + Matrix_RotateZYX(0, 0, -19705, MTXMODE_APPLY); + Matrix_Translate(297.297f, -81.082f, 0.0f, MTXMODE_APPLY); + Matrix_Scale(1.0f, 1.0f, 1.0f, MTXMODE_APPLY); + gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + gSPDisplayList(POLY_OPA_DISP++, gSantaHatGenericDL); + Matrix_Pop(); + CLOSE_DISPS(play->state.gfxCtx); + } + } + + return false; +} + void EnNiw_Draw(Actor* thisx, PlayState* play) { EnNiw* this = (EnNiw*)thisx; Vec3f scale = { 0.15f, 0.15f, 0.15f }; GraphicsContext* gfxCtx = play->state.gfxCtx; Gfx_SetupDL_25Opa(play->state.gfxCtx); - SkelAnime_DrawSkeletonOpa(play, &this->skelAnime, EnNiw_OverrideLimbDraw, NULL, this); + SkelAnime_DrawSkeletonOpa(play, &this->skelAnime, EnNiw_OverrideLimbDraw, EnNiw_PostLimbDraw, this); if (this->actionFunc == func_80AB6450) { func_80033C30(&this->actor.world.pos, &scale, 255, play); diff --git a/soh/src/overlays/actors/ovl_En_Niw_Girl/z_en_niw_girl.c b/soh/src/overlays/actors/ovl_En_Niw_Girl/z_en_niw_girl.c index 5113b8a68..e67a75161 100644 --- a/soh/src/overlays/actors/ovl_En_Niw_Girl/z_en_niw_girl.c +++ b/soh/src/overlays/actors/ovl_En_Niw_Girl/z_en_niw_girl.c @@ -7,6 +7,7 @@ #include "z_en_niw_girl.h" #include "objects/object_gr/object_gr.h" #include "vt.h" +#include "soh_assets.h" #define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_UPDATE_WHILE_CULLED) @@ -248,6 +249,27 @@ s32 EnNiwGirlOverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f static Vec3f sConstVec3f = { 0.2f, 0.2f, 0.2f }; +s32 EnNiwGirl_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot, void* thisx) { + EnNiwGirl* this = (EnNiwGirl*)thisx; + + if (CVarGetInteger("gLetItSnow", 0)) { + if (limbIndex == 4) { + OPEN_DISPS(play->state.gfxCtx); + Matrix_Push(); + Matrix_RotateZYX(0, 0, 0, MTXMODE_APPLY); + Matrix_Translate(945.945f, 0.0f, 0.0f, MTXMODE_APPLY); + Matrix_Scale(0.676f, 0.676f, 0.676f, MTXMODE_APPLY); + gDPSetEnvColor(POLY_OPA_DISP++, 255, 0, 255, 255); + gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + gSPDisplayList(POLY_OPA_DISP++, gPaperCrownGenericDL); + Matrix_Pop(); + CLOSE_DISPS(play->state.gfxCtx); + } + } + + return false; +} + void EnNiwGirl_Draw(Actor* thisx, PlayState* play) { static void* eyeTextures[] = { gNiwGirlEyeOpenTex, gNiwGirlEyeHalfTex, gNiwGirlEyeClosedTex }; EnNiwGirl* this = (EnNiwGirl*)thisx; @@ -258,7 +280,7 @@ void EnNiwGirl_Draw(Actor* thisx, PlayState* play) { Gfx_SetupDL_25Opa(play->state.gfxCtx); gSPSegment(POLY_OPA_DISP++, 0x08, SEGMENTED_TO_VIRTUAL(eyeTextures[this->eyeIndex])); - SkelAnime_DrawSkeletonOpa(play, &this->skelAnime, EnNiwGirlOverrideLimbDraw, NULL, this); + SkelAnime_DrawSkeletonOpa(play, &this->skelAnime, EnNiwGirlOverrideLimbDraw, EnNiwGirl_PostLimbDraw, this); func_80033C30(&this->actor.world.pos, &sp4C, 255, play); CLOSE_DISPS(play->state.gfxCtx); diff --git a/soh/src/overlays/actors/ovl_En_Niw_Lady/z_en_niw_lady.c b/soh/src/overlays/actors/ovl_En_Niw_Lady/z_en_niw_lady.c index a03319dfc..536b1f2da 100644 --- a/soh/src/overlays/actors/ovl_En_Niw_Lady/z_en_niw_lady.c +++ b/soh/src/overlays/actors/ovl_En_Niw_Lady/z_en_niw_lady.c @@ -4,6 +4,7 @@ #include "overlays/actors/ovl_En_Niw/z_en_niw.h" #include "vt.h" #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" +#include #define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_UPDATE_WHILE_CULLED) @@ -599,6 +600,27 @@ s32 EnNiwLady_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3 return false; } +s32 EnNiwLady_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot, void* thisx) { + EnNiwLady* this = (EnNiwLady*)thisx; + + if (CVarGetInteger("gLetItSnow", 0)) { + if (limbIndex == 15) { + OPEN_DISPS(play->state.gfxCtx); + Matrix_Push(); + Matrix_RotateZYX(-886, -3322, -5093, MTXMODE_APPLY); + Matrix_Translate(824.324f, 283.782f, -202.703f, MTXMODE_APPLY); + Matrix_Scale(0.762f, 0.762f, 0.762f, MTXMODE_APPLY); + gDPSetEnvColor(POLY_OPA_DISP++, 0, 0, 255, 255); + gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + gSPDisplayList(POLY_OPA_DISP++, gPaperCrownGenericDL); + Matrix_Pop(); + CLOSE_DISPS(play->state.gfxCtx); + } + } + + return false; +} + void EnNiwLady_Draw(Actor* thisx, PlayState* play) { static void* sEyeTextures[] = { gCuccoLadyEyeOpenTex, gCuccoLadyEyeHalfTex, gCuccoLadyEyeClosedTex }; EnNiwLady* this = (EnNiwLady*)thisx; @@ -610,7 +632,7 @@ void EnNiwLady_Draw(Actor* thisx, PlayState* play) { gDPSetEnvColor(POLY_OPA_DISP++, 0, 0, 0, 255); gSPSegment(POLY_OPA_DISP++, 0x08, SEGMENTED_TO_VIRTUAL(sEyeTextures[this->faceState])); gSPSegment(POLY_OPA_DISP++, 0x0C, func_80ABB0A0(play->state.gfxCtx)); - SkelAnime_DrawSkeletonOpa(play, &this->skelAnime, EnNiwLady_OverrideLimbDraw, NULL, this); + SkelAnime_DrawSkeletonOpa(play, &this->skelAnime, EnNiwLady_OverrideLimbDraw, EnNiwLady_PostLimbDraw, this); } CLOSE_DISPS(play->state.gfxCtx); } diff --git a/soh/src/overlays/actors/ovl_En_Nutsball/z_en_nutsball.c b/soh/src/overlays/actors/ovl_En_Nutsball/z_en_nutsball.c index a9c2a7361..2a37c90f6 100644 --- a/soh/src/overlays/actors/ovl_En_Nutsball/z_en_nutsball.c +++ b/soh/src/overlays/actors/ovl_En_Nutsball/z_en_nutsball.c @@ -10,6 +10,7 @@ #include "objects/object_dekunuts/object_dekunuts.h" #include "objects/object_hintnuts/object_hintnuts.h" #include "objects/object_shopnuts/object_shopnuts.h" +#include "assets/objects/gameplay_keep/gameplay_keep.h" #include "objects/object_dns/object_dns.h" #include "objects/object_dnk/object_dnk.h" @@ -47,7 +48,7 @@ static ColliderCylinderInit sCylinderInit = { }, { ELEMTYPE_UNK0, - { 0xFFCFFFFF, 0x00, 0x08 }, + { 0xFFCFFFFF, 0x02, 0x08 }, { 0xFFCFFFFF, 0x00, 0x00 }, TOUCH_ON | TOUCH_SFX_WOOD, BUMP_ON, @@ -72,6 +73,8 @@ void EnNutsball_Init(Actor* thisx, PlayState* play) { EnNutsball* this = (EnNutsball*)thisx; s32 pad; + this->collider.info.toucher.effect = 2; + ActorShape_Init(&this->actor.shape, 400.0f, ActorShadow_DrawCircle, 13.0f); Collider_InitCylinder(play, &this->collider); Collider_SetCylinder(play, &this->collider, &this->actor, &sCylinderInit); @@ -141,8 +144,8 @@ void func_80ABBBA8(EnNutsball* this, PlayState* play) { sp40.y = this->actor.world.pos.y + 4; sp40.z = this->actor.world.pos.z; - EffectSsHahen_SpawnBurst(play, &sp40, 6.0f, 0, 7, 3, 15, HAHEN_OBJECT_DEFAULT, 10, NULL); - SoundSource_PlaySfxAtFixedWorldPos(play, &this->actor.world.pos, 20, NA_SE_EN_OCTAROCK_ROCK); + EffectSsIcePiece_SpawnBurst(play, &this->actor.world.pos, this->actor.scale.x / 10); + SoundSource_PlaySfxAtFixedWorldPos(play, &this->actor.world.pos, 20, NA_SE_PL_ICE_BROKEN); Actor_Kill(&this->actor); } else { if (this->timer == -300) { @@ -176,17 +179,19 @@ void EnNutsball_Draw(Actor* thisx, PlayState* play) { OPEN_DISPS(play->state.gfxCtx); - if (CVarGetInteger(CVAR_ENHANCEMENT("NewDrops"), 0) != 0) { + if ((CVarGetInteger(CVAR_ENHANCEMENT("NewDrops"), 0) != 0) || CVarGetInteger("gLetItSnow", 0)) { Gfx_SetupDL_25Opa(play->state.gfxCtx); - gSPSegment(POLY_OPA_DISP++, 0x08, - Gfx_TwoTexScroll(play->state.gfxCtx, 0, 1 * (play->state.frames * 6), - 1 * (play->state.frames * 6), 32, 32, 1, 1 * (play->state.frames * 6), - 1 * (play->state.frames * 6), 32, 32)); - Matrix_Scale(25.0f,25.0f,25.0f,MTXMODE_APPLY); + f32 scale = 12.0f; + + gSPSegment(POLY_OPA_DISP++, 0x08, Gfx_TwoTexScroll(play->state.gfxCtx, 0, 0, (0 - 1) % 128, 32, 32, 1, 0, (1 * -2) % 128, 32, 32)); + Matrix_RotateX(thisx->home.rot.z * 9.58738e-05f, MTXMODE_APPLY); - gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), - G_MTX_MODELVIEW | G_MTX_LOAD); - gSPDisplayList(POLY_OPA_DISP++, sDListsNew[thisx->params]); + Matrix_Translate(0.0f, -445.946f, 0.0f, MTXMODE_APPLY); + Matrix_Scale(scale, scale, scale, MTXMODE_APPLY); + + gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + gDPSetEnvColor(POLY_OPA_DISP++, 0, 50, 100, 255); + gSPDisplayList(POLY_OPA_DISP++, gEffIceFragment3DL); } else { Gfx_SetupDL_25Opa(play->state.gfxCtx); Matrix_Mult(&play->billboardMtxF, MTXMODE_APPLY); diff --git a/soh/src/overlays/actors/ovl_En_Okuta/z_en_okuta.c b/soh/src/overlays/actors/ovl_En_Okuta/z_en_okuta.c index 54fc2d2fa..a89b3d123 100644 --- a/soh/src/overlays/actors/ovl_En_Okuta/z_en_okuta.c +++ b/soh/src/overlays/actors/ovl_En_Okuta/z_en_okuta.c @@ -2,6 +2,7 @@ #include "objects/object_okuta/object_okuta.h" #include "objects/gameplay_field_keep/gameplay_field_keep.h" #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" +#include "assets/objects/gameplay_keep/gameplay_keep.h" #define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_HOSTILE) @@ -45,7 +46,7 @@ static ColliderCylinderInit sProjectileColliderInit = { }, { ELEMTYPE_UNK0, - { 0xFFCFFFFF, 0x00, 0x08 }, + { 0xFFCFFFFF, 0x02, 0x08 }, { 0xFFCFFFFF, 0x00, 0x00 }, TOUCH_ON | TOUCH_SFX_HARD, BUMP_ON, @@ -519,38 +520,12 @@ void EnOkuta_ProjectileFly(EnOkuta* this, PlayState* play) { f32 temp_f20; f32 temp_f22; s32 i; - for (s16 i = 0; i < ARRAY_COUNT(sEffectScales); i++) { - phi_s0 += 10000; - - temp_f20 = Rand_ZeroOne() * 5.0f; - pos.x = (Math_SinS(phi_s0) * temp_f20) + this->actor.world.pos.x; - pos.y = (Rand_ZeroOne() * 40.0f) + this->actor.world.pos.y + 5.0f; - pos.z = (Math_CosS(phi_s0) * temp_f20) + this->actor.world.pos.z; - - temp_f20 = (Rand_ZeroOne() * 5.0f) + 2.0f; - velocity.x = Math_SinS(phi_s0) * temp_f20; - temp_f22 = Rand_ZeroOne(); - velocity.y = (Rand_ZeroOne() * i * 2.5f) + (temp_f22 * 5.0f); - velocity.z = Math_CosS(phi_s0) * temp_f20; - - if (i == 0) { - phi_v0 = 41; - gravity = -450; - } else if (i < 4) { - phi_v0 = 37; - gravity = -380; - } else { - phi_v0 = 69; - gravity = -320; - } - EffectSsKakera_Spawn(play, &pos, &velocity, &this->actor.world.pos, gravity, phi_v0, 30, 5, 0, - sEffectScales[i]/5, 3, 0, 70, 1, OBJECT_GAMEPLAY_FIELD_KEEP, gSilverRockFragmentsDL); - } + EffectSsIcePiece_SpawnBurst(play, &this->actor.world.pos, this->actor.scale.x / 10); } else { EffectSsHahen_SpawnBurst(play, &pos, 6.0f, 0, 1, 2, 15, 7, 10, gOctorokProjectileDL); } - SoundSource_PlaySfxAtFixedWorldPos(play, &this->actor.world.pos, 20, NA_SE_EN_OCTAROCK_ROCK); + SoundSource_PlaySfxAtFixedWorldPos(play, &this->actor.world.pos, 20, NA_SE_PL_ICE_BROKEN); Actor_Kill(&this->actor); } } else if (this->timer == -300) { @@ -763,17 +738,19 @@ void EnOkuta_Draw(Actor* thisx, PlayState* play) { } else { OPEN_DISPS(play->state.gfxCtx); - if (CVarGetInteger(CVAR_ENHANCEMENT("NewDrops"), 0) != 0) { + if ((CVarGetInteger(CVAR_ENHANCEMENT("NewDrops"), 0) != 0) || CVarGetInteger("gLetItSnow", 0)) { Gfx_SetupDL_25Opa(play->state.gfxCtx); - gSPSegment(POLY_OPA_DISP++, 0x08, - Gfx_TwoTexScroll(play->state.gfxCtx, 0, 1 * (play->state.frames * 6), - 1 * (play->state.frames * 6), 32, 32, 1, 1 * (play->state.frames * 6), - 1 * (play->state.frames * 6), 32, 32)); - Matrix_Scale(7.0f,7.0f,7.0f,MTXMODE_APPLY); - Matrix_RotateX(thisx->home.rot.z * (M_PI / 0x8000), MTXMODE_APPLY); - gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), - G_MTX_MODELVIEW | G_MTX_LOAD); - gSPDisplayList(POLY_OPA_DISP++, gSilverRockDL); + f32 scale = 12.0f; + + gSPSegment(POLY_OPA_DISP++, 0x08, Gfx_TwoTexScroll(play->state.gfxCtx, 0, 0, (0 - 1) % 128, 32, 32, 1, 0, (1 * -2) % 128, 32, 32)); + + Matrix_RotateX(thisx->home.rot.z * 9.58738e-05f, MTXMODE_APPLY); + Matrix_Translate(0.0f, -445.946f, 0.0f, MTXMODE_APPLY); + Matrix_Scale(scale, scale, scale, MTXMODE_APPLY); + + gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + gDPSetEnvColor(POLY_OPA_DISP++, 0, 50, 100, 255); + gSPDisplayList(POLY_OPA_DISP++, gEffIceFragment3DL); } else { Matrix_Mult(&play->billboardMtxF, MTXMODE_APPLY); Matrix_RotateZ(this->actor.home.rot.z * (M_PI / 0x8000), MTXMODE_APPLY); diff --git a/soh/src/overlays/actors/ovl_En_Ossan/z_en_ossan.c b/soh/src/overlays/actors/ovl_En_Ossan/z_en_ossan.c index 5049a05d6..809052d9b 100644 --- a/soh/src/overlays/actors/ovl_En_Ossan/z_en_ossan.c +++ b/soh/src/overlays/actors/ovl_En_Ossan/z_en_ossan.c @@ -16,6 +16,7 @@ #include "soh/Enhancements/randomizer/randomizer_entrance.h" #include "soh/Enhancements/cosmetics/cosmeticsTypes.h" #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" +#include "soh_assets.h" #include #define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_UPDATE_WHILE_CULLED) @@ -2415,6 +2416,69 @@ void EnOssan_DrawStickDirectionPrompts(PlayState* play, EnOssan* this) { CLOSE_DISPS(play->state.gfxCtx); } +s32 EnOssan_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot, void* thisx) { + EnOssan* this = (EnOssan*)thisx; + + if (CVarGetInteger("gLetItSnow", 0)) { + if (limbIndex == 8) { + switch(this->actor.params) { + case 4: { + OPEN_DISPS(play->state.gfxCtx); + Matrix_Push(); + Matrix_RotateZYX(-11071, -443, -3986, MTXMODE_APPLY); + Matrix_Translate(878.378f, 351.351f, 540.541f, MTXMODE_APPLY); + Matrix_Scale(1.352f, 1.352f, 1.352f, MTXMODE_APPLY); + gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + gSPDisplayList(POLY_OPA_DISP++, gSantaHatGenericDL); + Matrix_Pop(); + CLOSE_DISPS(play->state.gfxCtx); + break; + } + case 1: + case 3: { + OPEN_DISPS(play->state.gfxCtx); + Matrix_Push(); + Matrix_RotateZYX(-6643, 1992, -1772, MTXMODE_APPLY); + Matrix_Translate(918.919f, 121.622f, 256.757f, MTXMODE_APPLY); + Matrix_Scale(0.73f, 0.73f, 0.73f, MTXMODE_APPLY); + gDPSetEnvColor(POLY_OPA_DISP++, 0, 255, 0, 255); + gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + gSPDisplayList(POLY_OPA_DISP++, gPaperCrownGenericDL); + Matrix_Pop(); + CLOSE_DISPS(play->state.gfxCtx); + break; + } + case 2: { + OPEN_DISPS(play->state.gfxCtx); + Matrix_Push(); + Matrix_RotateZYX(-16163, 0, 2878, MTXMODE_APPLY); + Matrix_Translate(905.406f, 0.0f, -27.027f, MTXMODE_APPLY); + Matrix_Scale(1.318f, 1.318f, 1.318f, MTXMODE_APPLY); + gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + gSPDisplayList(POLY_OPA_DISP++, gSantaHatGenericDL); + Matrix_Pop(); + CLOSE_DISPS(play->state.gfxCtx); + break; + } + default: { + OPEN_DISPS(play->state.gfxCtx); + Matrix_Push(); + Matrix_RotateZYX(-11071, -443, -3986, MTXMODE_APPLY); + Matrix_Translate(878.378f, 351.351f, 540.541f, MTXMODE_APPLY); + Matrix_Scale(1.352f, 1.352f, 1.352f, MTXMODE_APPLY); + gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + gSPDisplayList(POLY_OPA_DISP++, gSantaHatGenericDL); + Matrix_Pop(); + CLOSE_DISPS(play->state.gfxCtx); + break; + } + } + } + } + + return false; +} + void EnOssan_DrawBazaarShopkeeper(Actor* thisx, PlayState* play) { static void* sBazaarShopkeeperEyeTextures[] = { gOssanEyeOpenTex, gOssanEyeHalfTex, gOssanEyeClosedTex }; EnOssan* this = (EnOssan*)thisx; @@ -2424,7 +2488,7 @@ void EnOssan_DrawBazaarShopkeeper(Actor* thisx, PlayState* play) { Gfx_SetupDL_25Opa(play->state.gfxCtx); gSPSegment(POLY_OPA_DISP++, 0x08, SEGMENTED_TO_VIRTUAL(sBazaarShopkeeperEyeTextures[this->eyeTextureIdx])); - SkelAnime_DrawSkeletonOpa(play, &this->skelAnime, EnOssan_OverrideLimbDrawDefaultShopkeeper, NULL, this); + SkelAnime_DrawSkeletonOpa(play, &this->skelAnime, EnOssan_OverrideLimbDrawDefaultShopkeeper, EnOssan_PostLimbDraw, this); EnOssan_DrawCursor(play, this, this->cursorX, this->cursorY, this->cursorZ, this->drawCursor); EnOssan_DrawStickDirectionPrompts(play, this); @@ -2450,6 +2514,16 @@ s32 EnOssan_OverrideLimbDrawKokiriShopkeeper(PlayState* play, s32 limbIndex, Gfx gSPSegment(POLY_OPA_DISP++, 0x0A, SEGMENTED_TO_VIRTUAL(sKokiriShopkeeperEyeTextures[this->eyeTextureIdx])); } + if (limbIndex == 15) { + Matrix_Push(); + Matrix_RotateZYX(14169, -2215, 0, MTXMODE_APPLY); + Matrix_Translate(1810.811f, -351.351f, -94.595f, MTXMODE_APPLY); + Matrix_Scale(1.068f, 1.068f, 1.068f, MTXMODE_APPLY); + gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + gSPDisplayList(POLY_OPA_DISP++, gSantaHatGenericDL); + Matrix_Pop(); + } + CLOSE_DISPS(play->state.gfxCtx); return 0; @@ -2478,8 +2552,8 @@ void EnOssan_DrawKokiriShopkeeper(Actor* thisx, PlayState* play) { Gfx_SetupDL_25Opa(play->state.gfxCtx); gDPSetEnvColor(POLY_OPA_DISP++, 0, 0, 0, 255); - gSPSegment(POLY_OPA_DISP++, 0x08, EnOssan_SetEnvColor(play->state.gfxCtx, 0, 130, 70, 255)); - gSPSegment(POLY_OPA_DISP++, 0x09, EnOssan_SetEnvColor(play->state.gfxCtx, 110, 170, 20, 255)); + gSPSegment(POLY_OPA_DISP++, 0x08, EnOssan_SetEnvColor(play->state.gfxCtx, 255, 0, 0, 255)); + gSPSegment(POLY_OPA_DISP++, 0x09, EnOssan_SetEnvColor(play->state.gfxCtx, 255, 0, 0, 255)); gSPSegment(POLY_OPA_DISP++, 0x0C, EnOssan_EndDList(play->state.gfxCtx)); SkelAnime_DrawSkeletonOpa(play, &this->skelAnime, EnOssan_OverrideLimbDrawKokiriShopkeeper, NULL, this); @@ -2554,7 +2628,7 @@ void EnOssan_DrawPotionShopkeeper(Actor* thisx, PlayState* play) { Gfx_SetupDL_25Opa(play->state.gfxCtx); gSPSegment(POLY_OPA_DISP++, 0x08, SEGMENTED_TO_VIRTUAL(sPotionShopkeeperEyeTextures[this->eyeTextureIdx])); - SkelAnime_DrawSkeletonOpa(play, &this->skelAnime, NULL, NULL, this); + SkelAnime_DrawSkeletonOpa(play, &this->skelAnime, NULL, EnOssan_PostLimbDraw, this); EnOssan_DrawCursor(play, this, this->cursorX, this->cursorY, this->cursorZ, this->drawCursor); EnOssan_DrawStickDirectionPrompts(play, this); @@ -2590,7 +2664,7 @@ void EnOssan_DrawBombchuShopkeeper(Actor* thisx, PlayState* play) { Gfx_SetupDL_25Opa(play->state.gfxCtx); gSPSegment(POLY_OPA_DISP++, 0x08, SEGMENTED_TO_VIRTUAL(sBombchuShopkeeperEyeTextures[this->eyeTextureIdx])); - SkelAnime_DrawSkeletonOpa(play, &this->skelAnime, NULL, NULL, this); + SkelAnime_DrawSkeletonOpa(play, &this->skelAnime, NULL, EnOssan_PostLimbDraw, this); EnOssan_DrawCursor(play, this, this->cursorX, this->cursorY, this->cursorZ, this->drawCursor); EnOssan_DrawStickDirectionPrompts(play, this); diff --git a/soh/src/overlays/actors/ovl_En_Po_Relay/z_en_po_relay.c b/soh/src/overlays/actors/ovl_En_Po_Relay/z_en_po_relay.c index 8489b1032..ba6a1e85c 100644 --- a/soh/src/overlays/actors/ovl_En_Po_Relay/z_en_po_relay.c +++ b/soh/src/overlays/actors/ovl_En_Po_Relay/z_en_po_relay.c @@ -7,6 +7,7 @@ #include "z_en_po_relay.h" #include "overlays/actors/ovl_En_Honotrap/z_en_honotrap.h" #include "objects/object_tk/object_tk.h" +#include "soh_assets.h" #define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_IGNORE_QUAKE | ACTOR_FLAG_WILL_TALK) @@ -425,6 +426,20 @@ void EnPoRelay_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* gSPDisplayList(POLY_OPA_DISP++, gDampeHaloDL); CLOSE_DISPS(play->state.gfxCtx); } + + if (CVarGetInteger("gLetItSnow", 0)) { + if (limbIndex == 16) { + OPEN_DISPS(play->state.gfxCtx); + Matrix_Push(); + Matrix_RotateZYX(10627, 3321, -13727, MTXMODE_APPLY); + Matrix_Translate(418.919f, 40.54f, -256.757f, MTXMODE_APPLY); + Matrix_Scale(1.068f, 1.068f, 1.068f, MTXMODE_APPLY); + gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + gSPDisplayList(POLY_OPA_DISP++, gSantaHatGenericDL); + Matrix_Pop(); + CLOSE_DISPS(play->state.gfxCtx); + } + } } void EnPoRelay_Draw(Actor* thisx, PlayState* play) { diff --git a/soh/src/overlays/actors/ovl_En_Shopnuts/z_en_shopnuts.c b/soh/src/overlays/actors/ovl_En_Shopnuts/z_en_shopnuts.c index c6aa6d56a..62558ee25 100644 --- a/soh/src/overlays/actors/ovl_En_Shopnuts/z_en_shopnuts.c +++ b/soh/src/overlays/actors/ovl_En_Shopnuts/z_en_shopnuts.c @@ -1,6 +1,7 @@ #include "z_en_shopnuts.h" #include "objects/object_shopnuts/object_shopnuts.h" #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" +#include "soh_assets.h" #define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_HOSTILE) @@ -302,6 +303,20 @@ void EnShopnuts_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* gSPDisplayList(POLY_OPA_DISP++, gBusinessScrubNoseDL); CLOSE_DISPS(play->state.gfxCtx); } + + if (CVarGetInteger("gLetItSnow", 0)) { + if (limbIndex == 17) { + OPEN_DISPS(play->state.gfxCtx); + Matrix_Push(); + Matrix_RotateZYX(0, 0, 17490, MTXMODE_APPLY); + Matrix_Translate(4200.0f, -472.973f, 0.0f, MTXMODE_APPLY); + Matrix_Scale(4.932f, 4.932f, 4.932f, MTXMODE_APPLY); + gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + gSPDisplayList(POLY_OPA_DISP++, gSantaHatGenericDL); + Matrix_Pop(); + CLOSE_DISPS(play->state.gfxCtx); + } + } } void EnShopnuts_Draw(Actor* thisx, PlayState* play) { diff --git a/soh/src/overlays/actors/ovl_En_Skb/z_en_skb.c b/soh/src/overlays/actors/ovl_En_Skb/z_en_skb.c index e985fe862..fcde867db 100644 --- a/soh/src/overlays/actors/ovl_En_Skb/z_en_skb.c +++ b/soh/src/overlays/actors/ovl_En_Skb/z_en_skb.c @@ -2,6 +2,7 @@ #include "overlays/actors/ovl_En_Encount1/z_en_encount1.h" #include "objects/object_skb/object_skb.h" #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" +#include "soh_assets.h" #define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_HOSTILE | ACTOR_FLAG_UPDATE_WHILE_CULLED) @@ -551,6 +552,21 @@ void EnSkb_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot, } else if ((this->unk_283 ^ (this->unk_283 | 4)) == 0) { BodyBreak_SetInfo(&this->bodyBreak, limbIndex, 0, 18, 18, dList, BODYBREAK_OBJECT_DEFAULT); } + + if (CVarGetInteger("gLetItSnow", 0)) { + if (limbIndex == 11) { + OPEN_DISPS(play->state.gfxCtx); + Matrix_Push(); + Matrix_RotateZYX(0, 0, -2215, MTXMODE_APPLY); + Matrix_Translate(1324.324f, 662.162f, 0.0f, MTXMODE_APPLY); + Matrix_Scale(1.0f, 1.0f, 1.0f, MTXMODE_APPLY); + gDPSetEnvColor(POLY_OPA_DISP++, 255, 0, 0, 255); + gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + gSPDisplayList(POLY_OPA_DISP++, gPaperCrownGenericDL); + Matrix_Pop(); + CLOSE_DISPS(play->state.gfxCtx); + } + } } void EnSkb_Draw(Actor* thisx, PlayState* play) { diff --git a/soh/src/overlays/actors/ovl_En_Snowball/z_en_snowball.c b/soh/src/overlays/actors/ovl_En_Snowball/z_en_snowball.c new file mode 100644 index 000000000..a6c07a245 --- /dev/null +++ b/soh/src/overlays/actors/ovl_En_Snowball/z_en_snowball.c @@ -0,0 +1,229 @@ +/* + * File: z_en_snowball.c + * Overlay: ovl_En_Snowball + * Description: Rollable Snowball + */ + +#include "z_en_snowball.h" +#include "objects/gameplay_keep/gameplay_keep.h" +#include "objects/object_goroiwa/object_goroiwa.h" +#include "soh_assets.h" + +#define FLAGS ACTOR_FLAG_UPDATE_WHILE_CULLED + +void EnSnowball_Init(Actor* thisx, PlayState* play); +void EnSnowball_Destroy(Actor* thisx, PlayState* play); +void EnSnowball_Update(Actor* thisx, PlayState* play); +void EnSnowball_Draw(Actor* thisx, PlayState* play); + +static ColliderJntSphElementInit sJntSphElementsInit[] = { + { + { + ELEMTYPE_UNK0, + { 0x20000000, 0x00, 0x04 }, + { 0x00000000, 0x00, 0x00 }, + TOUCH_ON | TOUCH_SFX_NORMAL, + BUMP_NONE, + OCELEM_ON, + }, + { 0, { { 0, 0, 0 }, 14 }, 100 }, + }, +}; + +static ColliderJntSphInit sJntSphInit = { + { + COLTYPE_NONE, + AT_ON | AT_TYPE_ENEMY, + AC_NONE, + OC1_ON | OC1_TYPE_ALL, + OC2_TYPE_2, + COLSHAPE_JNTSPH, + }, + 1, + sJntSphElementsInit, +}; + +static CollisionCheckInfoInit sColChkInfoInit = { 0, 3, 15, MASS_HEAVY }; + +void EnSnowball_UpdateCollider(EnSnowball* this) { + Sphere16* worldSphere = &this->collider.elements[0].dim.worldSphere; + + worldSphere->center.x = this->actor.world.pos.x; + worldSphere->center.y = this->actor.world.pos.y + (this->actor.scale.x * 500.0f); + worldSphere->center.z = this->actor.world.pos.z; + worldSphere->radius = (this->actor.scale.x * 500.0f); +} + +void EnSnowball_InitCollider(EnSnowball* this, PlayState* play) { + Collider_InitJntSph(play, &this->collider); + Collider_SetJntSph(play, &this->collider, &this->actor, &sJntSphInit, this->colliderItems); + EnSnowball_UpdateCollider(this); + this->collider.elements[0].dim.worldSphere.radius = (this->actor.scale.x * 500.0f); +} + +static InitChainEntry sInitChain[] = { + ICHAIN_F32_DIV1000(gravity, -860, ICHAIN_CONTINUE), ICHAIN_F32_DIV1000(minVelocityY, -15000, ICHAIN_CONTINUE), + ICHAIN_VEC3F_DIV1000(scale, 5, ICHAIN_CONTINUE), ICHAIN_F32(uncullZoneForward, 1500, ICHAIN_CONTINUE), + ICHAIN_F32(uncullZoneScale, 150, ICHAIN_CONTINUE), ICHAIN_F32(uncullZoneDownward, 1500, ICHAIN_STOP), +}; + +void EnSnowball_Init(Actor* thisx, PlayState* play) { + EnSnowball* this = (EnSnowball*)thisx; + + Actor_ProcessInitChain(&this->actor, sInitChain); + EnSnowball_InitCollider(this, play); + CollisionCheck_SetInfo(&this->actor.colChkInfo, NULL, &sColChkInfoInit); + ActorShape_Init(&this->actor.shape, 595.0f, ActorShadow_DrawCircle, 9.4f); + this->actor.shape.shadowAlpha = 200; + + if (thisx->params == 1) { + this->actor.speedXZ += 5.0f; + this->actor.world.rot.y = Rand_ZeroFloat(65536.0f); + } +} + +void EnSnowball_Destroy(Actor* thisx, PlayState* play) { + EnSnowball* this = (EnSnowball*)thisx; + + Collider_DestroyJntSph(play, &this->collider); +} + +void EnSnowball_Update(Actor* thisx, PlayState* play) { + EnSnowball* this = (EnSnowball*)thisx; + Actor* player = GET_PLAYER(play); + + // Kill the actor if it falls too far + if (thisx->world.pos.y < -10000.0f) { + Actor_Kill(thisx); + return; + } + + u8 meanBoulder = thisx->params == 1 && this->actor.scale.x > 0.1f; + + // Check if the player is close enough to start rolling + if (this->actor.xzDistToPlayer < MAX(20.0f, this->actor.scale.x * 600.0f) && !meanBoulder) { + /// Flip the actor's rotation away from the player + thisx->world.rot.y = thisx->yawTowardsPlayer + 0x8000; + this->actor.speedXZ = MAX(5.0f, this->actor.speedXZ); + } + + if (this->collider.base.atFlags & AT_HIT) { + this->collider.base.atFlags &= ~AT_HIT; + // Flip the actor's rotation away from the player + thisx->world.rot.y = thisx->yawTowardsPlayer + 0x8000; + + func_8002F6D4(play, &this->actor, 2.0f, this->actor.yawTowardsPlayer, 0.0f, 0); + Player_PlaySfx(&GET_PLAYER(play)->actor, NA_SE_PL_BODY_HIT); + } + + // Slow down the actor and increase it's scale + if (this->actor.speedXZ > 0.0f) { + CollisionPoly snowballPoly; + u8 goingUp = this->actor.world.pos.y - this->prevY > 0.001f; + u8 goingDown = this->actor.world.pos.y - this->prevY < -0.001f; + + // friction + if (thisx->params != 1) { + this->actor.speedXZ -= 0.1f; + } + + if (goingDown) { + // Increase the speed if going down hill + f32 speed = (this->prevY - this->actor.world.pos.y) * 0.15f; + this->actor.speedXZ += MIN(speed, 0.5f); + } else if (goingUp) { + // Reduce the speed if going up hill + this->actor.speedXZ -= (this->actor.world.pos.y - this->prevY) * 0.1f; + } + + if (goingUp || goingDown) { + // Check if going straight, one degree right, or one degree left will result in steeper slope + // Check straight + Vec3f snowballPos = this->actor.world.pos; + snowballPos.y += 100.0f; + snowballPos.x += Math_SinS(this->actor.world.rot.y) * 1.0f; + snowballPos.z += Math_CosS(this->actor.world.rot.y) * 1.0f; + float straightSlope = BgCheck_AnyRaycastFloor1(&gPlayState->colCtx, &snowballPoly, &snowballPos); + + // Check one degree right + snowballPos = this->actor.world.pos; + snowballPos.y += 100.0f; + snowballPos.x += Math_SinS(this->actor.world.rot.y + 0x100) * 1.0f; + snowballPos.z += Math_CosS(this->actor.world.rot.y + 0x100) * 1.0f; + float rightSlope = BgCheck_AnyRaycastFloor1(&gPlayState->colCtx, &snowballPoly, &snowballPos); + + // Check one degree left + snowballPos = this->actor.world.pos; + snowballPos.y += 100.0f; + snowballPos.x += Math_SinS(this->actor.world.rot.y - 0x100) * 1.0f; + snowballPos.z += Math_CosS(this->actor.world.rot.y - 0x100) * 1.0f; + float leftSlope = BgCheck_AnyRaycastFloor1(&gPlayState->colCtx, &snowballPoly, &snowballPos); + + if (straightSlope > rightSlope || straightSlope > leftSlope) { + if (rightSlope < leftSlope) { + this->actor.world.rot.y += 0x100; + } else { + this->actor.world.rot.y -= 0x100; + } + } + } + + // Check if the actor is colliding with a wall and bounce off + if (thisx->bgCheckFlags & 8) { + if (ABS((s16)(thisx->wallYaw - thisx->world.rot.y)) > 0x4000) { + thisx->world.rot.y = ((thisx->wallYaw - thisx->world.rot.y) + thisx->wallYaw) - 0x8000; + } + if (thisx->params != 1) { + thisx->speedXZ *= 0.7f; + } + thisx->bgCheckFlags &= ~8; + if (this->actor.speedXZ > 5.0f) { + Audio_PlayActorSound2(thisx, NA_SE_EV_BOMB_BOUND); + } + } + + Actor_SetScale(&this->actor, MIN(0.15f, this->actor.scale.x + (this->actor.speedXZ * 0.00001f))); + } + + if (this->actor.speedXZ < 0.0f) { + this->actor.speedXZ = 0.0f; + } + + // Based on speed and scale, rotate the snowball + // The larger the snowball, the slower it rotates + this->sRot += (this->actor.speedXZ * 15.0f) / this->actor.scale.x; + + // record the actor's position + this->prevY = this->actor.world.pos.y; + + // Process movement (moves foward based on speed and rotation) + Actor_MoveForward(thisx); + + // Prevent actor from going through the ground or walls + Actor_UpdateBgCheckInfo(play, &this->actor, MAX(10.0f, this->actor.scale.x * 250.0f), MAX(10.0f, this->actor.scale.x * 500.0f), 0.0f, 0xFF); + + EnSnowball_UpdateCollider(this); + // Add collision checks if the actor is a mean boulder + if (meanBoulder) { + CollisionCheck_SetAT(play, &play->colChkCtx, &this->collider.base); + CollisionCheck_SetOC(play, &play->colChkCtx, &this->collider.base); + } +} + +void EnSnowball_Draw(Actor* thisx, PlayState* play) { + EnSnowball* this = (EnSnowball*)thisx; + + OPEN_DISPS(play->state.gfxCtx); + + Gfx_SetupDL_25Opa(play->state.gfxCtx); + + Matrix_RotateZYX(this->sRot, thisx->world.rot.y, 0, MTXMODE_APPLY); + + Matrix_Translate(0.0f, 7600.0f, -148.649f, MTXMODE_APPLY); + Matrix_Scale(4.844f, 4.844f, 4.844f, MTXMODE_APPLY); + gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + + gSPDisplayList(POLY_OPA_DISP++, gLinkAdultPompomDL); + + CLOSE_DISPS(play->state.gfxCtx); +} diff --git a/soh/src/overlays/actors/ovl_En_Snowball/z_en_snowball.h b/soh/src/overlays/actors/ovl_En_Snowball/z_en_snowball.h new file mode 100644 index 000000000..fa8c0779c --- /dev/null +++ b/soh/src/overlays/actors/ovl_En_Snowball/z_en_snowball.h @@ -0,0 +1,31 @@ +#ifndef Z_EN_SNOWBALL_H +#define Z_EN_SNOWBALL_H + +#include +#include "global.h" + +struct EnSnowball; + +typedef void (*EnSnowballActionFunc)(struct EnSnowball*, PlayState*); + +typedef struct EnSnowball { + Actor actor; + + ColliderJntSph collider; + ColliderJntSphElement colliderItems[1]; + s16 sRot; + f32 prevY; +} EnSnowball; + +#ifdef __cplusplus +extern "C" { +#endif +void EnSnowball_Init(Actor* thisx, PlayState* play); +void EnSnowball_Destroy(Actor* thisx, PlayState* play); +void EnSnowball_Update(Actor* thisx, PlayState* play); +void EnSnowball_Draw(Actor* thisx, PlayState* play); +#ifdef __cplusplus +} +#endif + +#endif \ No newline at end of file diff --git a/soh/src/overlays/actors/ovl_En_Sth/z_en_sth.c b/soh/src/overlays/actors/ovl_En_Sth/z_en_sth.c index c55af5cd4..1d946fbf0 100644 --- a/soh/src/overlays/actors/ovl_En_Sth/z_en_sth.c +++ b/soh/src/overlays/actors/ovl_En_Sth/z_en_sth.c @@ -10,6 +10,7 @@ #include "objects/object_boj/object_boj.h" #include #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" +#include "soh_assets.h" #define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_UPDATE_WHILE_CULLED) @@ -399,6 +400,21 @@ void EnSth_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot, CLOSE_DISPS(play->state.gfxCtx); } } + + if (CVarGetInteger("gLetItSnow", 0)) { + if (limbIndex == 15) { + OPEN_DISPS(play->state.gfxCtx); + Matrix_Push(); + Matrix_RotateZYX(-4207, -665, -4650, MTXMODE_APPLY); + Matrix_Translate(932.432f, 162.163f, 81.082f, MTXMODE_APPLY); + Matrix_Scale(0.73f, 0.73f, 0.73f, MTXMODE_APPLY); + gDPSetEnvColor(POLY_OPA_DISP++, 255, 255, 0, 255); + gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + gSPDisplayList(POLY_OPA_DISP++, gPaperCrownGenericDL); + Matrix_Pop(); + CLOSE_DISPS(play->state.gfxCtx); + } + } } Gfx* EnSth_AllocColorDList(GraphicsContext* play, u8 envR, u8 envG, u8 envB, u8 envA) { diff --git a/soh/src/overlays/actors/ovl_En_Syateki_Man/z_en_syateki_man.c b/soh/src/overlays/actors/ovl_En_Syateki_Man/z_en_syateki_man.c index dcaaa897b..30b13c8ea 100644 --- a/soh/src/overlays/actors/ovl_En_Syateki_Man/z_en_syateki_man.c +++ b/soh/src/overlays/actors/ovl_En_Syateki_Man/z_en_syateki_man.c @@ -5,6 +5,7 @@ #include "soh/Enhancements/randomizer/randomizer_entrance.h" #include "soh/Enhancements/custom-message/CustomMessageTypes.h" #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" +#include "soh_assets.h" #define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_NO_LOCKON) @@ -512,12 +513,33 @@ s32 EnSyatekiMan_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, V return 0; } +s32 EnSyatekiMan_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot, void* thisx) { + EnSyatekiMan* this = (EnSyatekiMan*)thisx; + + if (CVarGetInteger("gLetItSnow", 0)) { + if (limbIndex == 8) { + OPEN_DISPS(play->state.gfxCtx); + Matrix_Push(); + Matrix_RotateZYX(2214, 3985, -7750, MTXMODE_APPLY); + Matrix_Translate(1094.594f, 1162.162f, -40.541f, MTXMODE_APPLY); + Matrix_Scale(0.864f, 0.864f, 0.864f, MTXMODE_APPLY); + gDPSetEnvColor(POLY_OPA_DISP++, 0, 255, 0, 255); + gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + gSPDisplayList(POLY_OPA_DISP++, gPaperCrownGenericDL); + Matrix_Pop(); + CLOSE_DISPS(play->state.gfxCtx); + } + } + + return false; +} + void EnSyatekiMan_Draw(Actor* thisx, PlayState* play) { s32 pad; EnSyatekiMan* this = (EnSyatekiMan*)thisx; Gfx_SetupDL_25Opa(play->state.gfxCtx); - SkelAnime_DrawSkeletonOpa(play, &this->skelAnime, EnSyatekiMan_OverrideLimbDraw, NULL, this); + SkelAnime_DrawSkeletonOpa(play, &this->skelAnime, EnSyatekiMan_OverrideLimbDraw, EnSyatekiMan_PostLimbDraw, this); } void EnSyatekiMan_SetBgm(void) { diff --git a/soh/src/overlays/actors/ovl_En_Ta/z_en_ta.c b/soh/src/overlays/actors/ovl_En_Ta/z_en_ta.c index 6a4676fdd..fc1964c32 100644 --- a/soh/src/overlays/actors/ovl_En_Ta/z_en_ta.c +++ b/soh/src/overlays/actors/ovl_En_Ta/z_en_ta.c @@ -8,6 +8,7 @@ #include "vt.h" #include "objects/object_ta/object_ta.h" #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" +#include "soh_assets.h" #define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY) @@ -1213,6 +1214,20 @@ void EnTa_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot, if (limbIndex == 15) { Matrix_MultVec3f(&D_80B16E7C, &this->actor.focus.pos); } + + if (CVarGetInteger("gLetItSnow", 0)) { + if (limbIndex == 15) { + OPEN_DISPS(play->state.gfxCtx); + Matrix_Push(); + Matrix_RotateZYX(11955, -1993, 221, MTXMODE_APPLY); + Matrix_Translate(1081.081f, -108.108f, -270.270f, MTXMODE_APPLY); + Matrix_Scale(1.554f, 1.554f, 1.554f, MTXMODE_APPLY); + gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + gSPDisplayList(POLY_OPA_DISP++, gSantaHatGenericDL); + Matrix_Pop(); + CLOSE_DISPS(play->state.gfxCtx); + } + } } void EnTa_Draw(Actor* thisx, PlayState* play) { diff --git a/soh/src/overlays/actors/ovl_En_Test/z_en_test.c b/soh/src/overlays/actors/ovl_En_Test/z_en_test.c index 75c4f6c6a..5b2821c3f 100644 --- a/soh/src/overlays/actors/ovl_En_Test/z_en_test.c +++ b/soh/src/overlays/actors/ovl_En_Test/z_en_test.c @@ -7,6 +7,7 @@ #include "z_en_test.h" #include "objects/object_sk2/object_sk2.h" #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" +#include "soh_assets.h" #define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_HOSTILE | ACTOR_FLAG_UPDATE_WHILE_CULLED) @@ -1949,6 +1950,20 @@ void EnTest_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot this->bodyPartsPos[bodyPart].z = sp50.z; } } + + if (CVarGetInteger("gLetItSnow", 0)) { + if (limbIndex == 11) { + OPEN_DISPS(play->state.gfxCtx); + Matrix_Push(); + Matrix_RotateZYX(-10849, 0, -5314, MTXMODE_APPLY); + Matrix_Translate(513.514f, 283.784f, 554.054f, MTXMODE_APPLY); + Matrix_Scale(1.203f, 1.203f, 1.203f, MTXMODE_APPLY); + gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + gSPDisplayList(POLY_OPA_DISP++, gSantaHatGenericDL); + Matrix_Pop(); + CLOSE_DISPS(play->state.gfxCtx); + } + } } void EnTest_Draw(Actor* thisx, PlayState* play) { diff --git a/soh/src/overlays/actors/ovl_En_Tg/z_en_tg.c b/soh/src/overlays/actors/ovl_En_Tg/z_en_tg.c index 247db92f3..12f7fa189 100644 --- a/soh/src/overlays/actors/ovl_En_Tg/z_en_tg.c +++ b/soh/src/overlays/actors/ovl_En_Tg/z_en_tg.c @@ -6,6 +6,7 @@ #include "z_en_tg.h" #include "objects/object_mu/object_mu.h" +#include "soh_assets.h" #define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY) @@ -168,6 +169,34 @@ void EnTg_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot, // Place the target point at the guy's head instead of the center of the actor Matrix_MultVec3f(&targetOffset, &this->actor.focus.pos); } + + if (CVarGetInteger("gLetItSnow", 0)) { + if (limbIndex == 20) { + OPEN_DISPS(play->state.gfxCtx); + Matrix_Push(); + Matrix_RotateZYX(-2657, -1550, 1549, MTXMODE_APPLY); + Matrix_Translate(594.594f, -135.135f, -54.054f, MTXMODE_APPLY); + Matrix_Scale(0.966f, 0.966f, 0.966f, MTXMODE_APPLY); + gDPSetEnvColor(POLY_OPA_DISP++, 0, 0, 255, 255); + gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + gSPDisplayList(POLY_OPA_DISP++, gPaperCrownGenericDL); + Matrix_Pop(); + CLOSE_DISPS(play->state.gfxCtx); + } + + if (limbIndex == 9) { + OPEN_DISPS(play->state.gfxCtx); + Matrix_Push(); + Matrix_RotateZYX(-3100, 1992, 2435, MTXMODE_APPLY); + Matrix_Translate(864.865f, -121.622f, 175.676f, MTXMODE_APPLY); + Matrix_Scale(0.865f, 0.865f, 0.865f, MTXMODE_APPLY); + gDPSetEnvColor(POLY_OPA_DISP++, 255, 0, 255, 255); + gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + gSPDisplayList(POLY_OPA_DISP++, gPaperCrownGenericDL); + Matrix_Pop(); + CLOSE_DISPS(play->state.gfxCtx); + } + } } Gfx* EnTg_SetColor(GraphicsContext* gfxCtx, u8 r, u8 g, u8 b, u8 a) { diff --git a/soh/src/overlays/actors/ovl_En_Tk/z_en_tk.c b/soh/src/overlays/actors/ovl_En_Tk/z_en_tk.c index 68979daca..ef1cbe985 100644 --- a/soh/src/overlays/actors/ovl_En_Tk/z_en_tk.c +++ b/soh/src/overlays/actors/ovl_En_Tk/z_en_tk.c @@ -9,6 +9,7 @@ #include "objects/object_tk/object_tk.h" #include "soh/frame_interpolation.h" #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" +#include "soh_assets.h" #define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY) @@ -722,6 +723,20 @@ void EnTk_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot, Matrix_MultVec3f(&sp28, &this->v3f_304); func_80B1D200(play); } + + if (CVarGetInteger("gLetItSnow", 0)) { + if (limbIndex == 16) { + OPEN_DISPS(play->state.gfxCtx); + Matrix_Push(); + Matrix_RotateZYX(10627, 3321, -13727, MTXMODE_APPLY); + Matrix_Translate(418.919f, 40.54f, -256.757f, MTXMODE_APPLY); + Matrix_Scale(1.068f, 1.068f, 1.068f, MTXMODE_APPLY); + gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + gSPDisplayList(POLY_OPA_DISP++, gSantaHatGenericDL); + Matrix_Pop(); + CLOSE_DISPS(play->state.gfxCtx); + } + } } void EnTk_Draw(Actor* thisx, PlayState* play) { diff --git a/soh/src/overlays/actors/ovl_En_Toryo/z_en_toryo.c b/soh/src/overlays/actors/ovl_En_Toryo/z_en_toryo.c index 594d72bca..87c249313 100644 --- a/soh/src/overlays/actors/ovl_En_Toryo/z_en_toryo.c +++ b/soh/src/overlays/actors/ovl_En_Toryo/z_en_toryo.c @@ -7,6 +7,7 @@ #include "z_en_toryo.h" #include "objects/object_toryo/object_toryo.h" #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" +#include "soh_assets.h" #define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY) @@ -105,6 +106,11 @@ void EnToryo_Init(Actor* thisx, PlayState* play) { break; case SCENE_KAKARIKO_VILLAGE: if ((LINK_AGE_IN_YEARS == YEARS_CHILD) && IS_DAY) { + this->actor.world.pos.x = 756.0; + this->actor.world.pos.y = 80.0; + this->actor.world.pos.z = 1378.0; + this->actor.shape.rot.y = 32534; + this->stateFlags |= 2; } break; @@ -415,4 +421,18 @@ void EnToryo_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* ro Matrix_MultVec3f(&sMultVec, &this->actor.focus.pos); break; } + + if (CVarGetInteger("gLetItSnow", 0)) { + if (limbIndex == 15) { + OPEN_DISPS(play->state.gfxCtx); + Matrix_Push(); + Matrix_RotateZYX(-23691, 664, -2879, MTXMODE_APPLY); + Matrix_Translate(810.811f, -243.243f, 270.27f, MTXMODE_APPLY); + Matrix_Scale(1.216f, 1.216f, 1.216f, MTXMODE_APPLY); + gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + gSPDisplayList(POLY_OPA_DISP++, gSantaHatGenericDL); + Matrix_Pop(); + CLOSE_DISPS(play->state.gfxCtx); + } + } } diff --git a/soh/src/overlays/actors/ovl_En_Vm/z_en_vm.c b/soh/src/overlays/actors/ovl_En_Vm/z_en_vm.c index ba0a75613..bff8380cd 100644 --- a/soh/src/overlays/actors/ovl_En_Vm/z_en_vm.c +++ b/soh/src/overlays/actors/ovl_En_Vm/z_en_vm.c @@ -9,6 +9,7 @@ #include "overlays/actors/ovl_En_Bom/z_en_bom.h" #include "objects/gameplay_keep/gameplay_keep.h" #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" +#include "soh_assets.h" #define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_UPDATE_WHILE_CULLED) @@ -517,6 +518,20 @@ void EnVm_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot, &this->colliderQuad2.dim.quad[1], &this->colliderQuad2.dim.quad[2], &this->colliderQuad2.dim.quad[3]); } + + if (CVarGetInteger("gLetItSnow", 0)) { + if (limbIndex == 6) { + OPEN_DISPS(play->state.gfxCtx); + Matrix_Push(); + Matrix_RotateZYX(19704, -1329, 11734, MTXMODE_APPLY); + Matrix_Translate(310.811f, -108.108f, -81.081f, MTXMODE_APPLY); + Matrix_Scale(2.297f, 2.297f, 2.297f, MTXMODE_APPLY); + gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + gSPDisplayList(POLY_OPA_DISP++, gSantaHatGenericDL); + Matrix_Pop(); + CLOSE_DISPS(play->state.gfxCtx); + } + } } void EnVm_Draw(Actor* thisx, PlayState* play2) { diff --git a/soh/src/overlays/actors/ovl_En_Weather_Tag/z_en_weather_tag.c b/soh/src/overlays/actors/ovl_En_Weather_Tag/z_en_weather_tag.c index f8b1cfd10..d57a1833b 100644 --- a/soh/src/overlays/actors/ovl_En_Weather_Tag/z_en_weather_tag.c +++ b/soh/src/overlays/actors/ovl_En_Weather_Tag/z_en_weather_tag.c @@ -134,6 +134,10 @@ u8 WeatherTag_CheckEnableWeatherEffect(EnWeatherTag* this, PlayState* play, u8 a u8 ret = false; Player* player = GET_PLAYER(play); + if (LINK_IS_ADULT && gPlayState != NULL && gPlayState->sceneNum == SCENE_KAKARIKO_VILLAGE) { + return ret; + } + if (Actor_WorldDistXZToActor(&player->actor, &this->actor) < WEATHER_TAG_RANGE100(this->actor.params)) { if ((play->envCtx.indoors != 0) || !gSkyboxBlendingEnabled || (play->skyboxId != SKYBOX_NORMAL_SKY && play->envCtx.unk_1F == play->envCtx.unk_20)) { diff --git a/soh/src/overlays/actors/ovl_En_Wf/z_en_wf.c b/soh/src/overlays/actors/ovl_En_Wf/z_en_wf.c index 2c243e254..c9ffb6f8a 100644 --- a/soh/src/overlays/actors/ovl_En_Wf/z_en_wf.c +++ b/soh/src/overlays/actors/ovl_En_Wf/z_en_wf.c @@ -9,6 +9,7 @@ #include "overlays/actors/ovl_En_Encount1/z_en_encount1.h" #include "objects/object_wf/object_wf.h" #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" +#include "soh_assets.h" #define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_HOSTILE | ACTOR_FLAG_UPDATE_WHILE_CULLED) @@ -1426,6 +1427,21 @@ void EnWf_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot, this->bodyPartsPos[bodyPartIndex].z = bodyPartPos.z; } } + + if (CVarGetInteger("gLetItSnow", 0)) { + if (limbIndex == 17) { + OPEN_DISPS(play->state.gfxCtx); + Matrix_Push(); + Matrix_RotateZYX(0, 0, -18377, MTXMODE_APPLY); + Matrix_Translate(729.73f, 1243.243f, 0.0f, MTXMODE_APPLY); + Matrix_Scale(0.743f, 0.743f, 0.743f, MTXMODE_APPLY); + gDPSetEnvColor(POLY_OPA_DISP++, 255, 0, 0, 255); + gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + gSPDisplayList(POLY_OPA_DISP++, gPaperCrownGenericDL); + Matrix_Pop(); + CLOSE_DISPS(play->state.gfxCtx); + } + } } static void* sWolfosNormalEyeTextures[] = { gWolfosNormalEyeOpenTex, gWolfosNormalEyeHalfTex, gWolfosNormalEyeNarrowTex, diff --git a/soh/src/overlays/actors/ovl_En_Wood02/z_en_wood02.c b/soh/src/overlays/actors/ovl_En_Wood02/z_en_wood02.c index eb6a77e24..ff2d6c3b5 100644 --- a/soh/src/overlays/actors/ovl_En_Wood02/z_en_wood02.c +++ b/soh/src/overlays/actors/ovl_En_Wood02/z_en_wood02.c @@ -179,6 +179,16 @@ void EnWood02_Init(Actor* thisx, PlayState* play2) { f32 floorY; s16 extraRot; + if (gPlayState->sceneNum == SCENE_KAKARIKO_VILLAGE && this->actor.params <= WOOD_TREE_KAKARIKO_ADULT) { + Actor_Kill(this); + } + + if (gPlayState->sceneNum == SCENE_KAKARIKO_VILLAGE && this->actor.params >= 0) { + this->actor.world.pos.x = 754.051; + this->actor.world.pos.y = 80.0; + this->actor.world.pos.z = 1429.908; + } + // The tree in Kakariko's day scene does not have the same params to spawn the GS // as the night scene, For the always spawn GS enhancement we apply the needed // params to have the GS drop when bonking @@ -452,14 +462,14 @@ void EnWood02_Draw(Actor* thisx, PlayState* play) { if ((type == WOOD_TREE_OVAL_GREEN_SPAWNER) || (type == WOOD_TREE_OVAL_GREEN_SPAWNED) || (type == WOOD_TREE_OVAL_GREEN) || (type == WOOD_LEAF_GREEN)) { - red = 50; - green = 170; - blue = 70; + red = 255; + green = 255; + blue = 255; } else if ((type == WOOD_TREE_OVAL_YELLOW_SPAWNER) || (type == WOOD_TREE_OVAL_YELLOW_SPAWNED) || (type == WOOD_LEAF_YELLOW)) { - red = 180; - green = 155; - blue = 0; + red = 255; + green = 255; + blue = 255; } else { red = green = blue = 255; } diff --git a/soh/src/overlays/actors/ovl_En_Zf/z_en_zf.c b/soh/src/overlays/actors/ovl_En_Zf/z_en_zf.c index 4ecf2afee..562f22a4e 100644 --- a/soh/src/overlays/actors/ovl_En_Zf/z_en_zf.c +++ b/soh/src/overlays/actors/ovl_En_Zf/z_en_zf.c @@ -7,6 +7,7 @@ #include "z_en_zf.h" #include "objects/object_zf/object_zf.h" #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" +#include "soh_assets.h" #define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_HOSTILE | ACTOR_FLAG_UPDATE_WHILE_CULLED) diff --git a/soh/src/overlays/actors/ovl_End_Title/z_end_title.c b/soh/src/overlays/actors/ovl_End_Title/z_end_title.c index af13255a8..ec49dd058 100644 --- a/soh/src/overlays/actors/ovl_End_Title/z_end_title.c +++ b/soh/src/overlays/actors/ovl_End_Title/z_end_title.c @@ -72,46 +72,78 @@ void EndTitle_DrawFull(Actor* thisx, PlayState* play) { OPEN_DISPS(play->state.gfxCtx); + uint8_t isKak = play->sceneNum == SCENE_KAKARIKO_VILLAGE; + // Draw title cards on the screen - if ((frameCount > 890) && (this->endAlpha < 200)) { + if ((frameCount > 890 || isKak) && (this->endAlpha < 200)) { this->endAlpha += 7; } - if ((frameCount > 810) && (this->tlozAlpha < 200)) { + if ((frameCount > 810 || isKak) && (this->tlozAlpha < 200)) { this->tlozAlpha += 15; } - if ((frameCount > 850) && (this->ootAlpha < 200)) { + if ((frameCount > 850 || isKak) && (this->ootAlpha < 200)) { this->ootAlpha += 15; } - + OVERLAY_DISP = Gfx_SetupDL_64(OVERLAY_DISP); - if (D_801614B0.a > 0) + + if (this->actor.params == 2) { gSPGrayscale(OVERLAY_DISP++, false); - gDPSetTextureLUT(OVERLAY_DISP++, G_TT_NONE); - gDPSetEnvColor(OVERLAY_DISP++, 255, 120, 30, 0); - gDPSetRenderMode(OVERLAY_DISP++, G_RM_PASS, G_RM_XLU_SURF2); - gSPClearGeometryMode(OVERLAY_DISP++, - G_TEXTURE_ENABLE | G_CULL_BACK | G_FOG | G_LIGHTING | G_TEXTURE_GEN | G_TEXTURE_GEN_LINEAR); - gDPSetCombineLERP(OVERLAY_DISP++, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0, 0, 0, 0, - COMBINED, 0, 0, 0, COMBINED); - gDPSetPrimColor(OVERLAY_DISP++, 0x00, 0x80, 0, 0, 0, this->endAlpha); - gDPLoadTextureTile(OVERLAY_DISP++, sTheEndTex, G_IM_FMT_IA, G_IM_SIZ_8b, 80, 24, 0, 0, 80 - 1, 24 - 1, 0, - G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, 0, 0, 0, 0); - gSPTextureRectangle(OVERLAY_DISP++, 120 << 2, 90 << 2, 200 << 2, 113 << 2, G_TX_RENDERTILE, 0, 0, 1 << 10, 1 << 10); - gDPPipeSync(OVERLAY_DISP++); - gDPSetPrimColor(OVERLAY_DISP++, 0x00, 0x80, 0, 0, 0, this->tlozAlpha); - gDPLoadTextureTile(OVERLAY_DISP++, sTheLegendOfZeldaTex, G_IM_FMT_IA, G_IM_SIZ_8b, 120, 24, 0, 0, 120 - 1, 24 - 1, 0, - G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, 0, 0, 0, 0); - gSPTextureRectangle(OVERLAY_DISP++, 100 << 2, 160 << 2, 220 << 2, 183 << 2, G_TX_RENDERTILE, 0, 0, 1 << 10, - 1 << 10); - gDPPipeSync(OVERLAY_DISP++); - gDPSetPrimColor(OVERLAY_DISP++, 0x00, 0x80, 0, 0, 0, this->ootAlpha); - gDPLoadTextureTile(OVERLAY_DISP++, sOcarinaOfTimeTex, G_IM_FMT_IA, G_IM_SIZ_8b, 112, 16, 0, - 0, 112 - 1, 16 - 1, 0, - G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, 0, 0, 0, 0); - gSPTextureRectangle(OVERLAY_DISP++, 104 << 2, 177 << 2, 216 << 2, 192 << 2, G_TX_RENDERTILE, 0, 0, 1 << 10, - 1 << 10); - if (D_801614B0.a > 0) - gSPGrayscale(OVERLAY_DISP++, true); + gDPSetTextureLUT(OVERLAY_DISP++, G_TT_NONE); + gDPSetEnvColor(OVERLAY_DISP++, 0, 255, 0, 0); + gDPSetRenderMode(OVERLAY_DISP++, G_RM_PASS, G_RM_XLU_SURF2); + gSPClearGeometryMode(OVERLAY_DISP++, G_TEXTURE_ENABLE | G_CULL_BACK | G_FOG | G_LIGHTING | G_TEXTURE_GEN | G_TEXTURE_GEN_LINEAR); + gDPSetCombineLERP(OVERLAY_DISP++, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0, 0, 0, 0, COMBINED, 0, 0, 0, COMBINED); + gDPSetPrimColor(OVERLAY_DISP++, 0x00, 0x80, 0, 0, 0, this->endAlpha); + gDPLoadTextureTile(OVERLAY_DISP++, sTheEndTex, G_IM_FMT_IA, G_IM_SIZ_8b, 80, 24, 0, 0, 80 - 1, 24 - 1, 0, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, 0, 0, 0, 0); + gSPTextureRectangle(OVERLAY_DISP++, 120 << 2, 90 << 2, 200 << 2, 113 << 2, G_TX_RENDERTILE, 0, 0, 1 << 10, 1 << 10); + gDPPipeSync(OVERLAY_DISP++); + gDPSetPrimColor(OVERLAY_DISP++, 0x00, 0x80, 0, 0, 0, this->tlozAlpha); + gDPLoadTextureTile(OVERLAY_DISP++, sTheLegendOfZeldaTex, G_IM_FMT_IA, G_IM_SIZ_8b, 120, 24, 0, 0, 120 - 1, 24 - 1, 0, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, 0, 0, 0, 0); + gSPTextureRectangle(OVERLAY_DISP++, 100 << 2, 160 << 2, 220 << 2, 183 << 2, G_TX_RENDERTILE, 0, 0, 1 << 10, 1 << 10); + gDPPipeSync(OVERLAY_DISP++); + gDPSetPrimColor(OVERLAY_DISP++, 0x00, 0x80, 0, 0, 0, this->ootAlpha); + gDPLoadTextureTile(OVERLAY_DISP++, sOcarinaOfTimeTex, G_IM_FMT_IA, G_IM_SIZ_8b, 112, 16, 0, 0, 112 - 1, 16 - 1, 0, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, 0, 0, 0, 0); + gSPTextureRectangle(OVERLAY_DISP++, 104 << 2, 177 << 2, 216 << 2, 192 << 2, G_TX_RENDERTILE, 0, 0, 1 << 10, 1 << 10); + + D_801614B0.a = 0; + //D_801614B0.r = 205; + //D_801614B0.g = 168; + //D_801614B0.b = 130; + + //gSPGrayscale(OVERLAY_DISP++, true); + } else { + if (D_801614B0.a > 0) + + gSPGrayscale(OVERLAY_DISP++, false); + gDPSetTextureLUT(OVERLAY_DISP++, G_TT_NONE); + gDPSetEnvColor(OVERLAY_DISP++, 255, 120, 30, 0); + gDPSetRenderMode(OVERLAY_DISP++, G_RM_PASS, G_RM_XLU_SURF2); + gSPClearGeometryMode(OVERLAY_DISP++, G_TEXTURE_ENABLE | G_CULL_BACK | G_FOG | G_LIGHTING | G_TEXTURE_GEN | + G_TEXTURE_GEN_LINEAR); + gDPSetCombineLERP(OVERLAY_DISP++, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0, 0, 0, 0, + COMBINED, 0, 0, 0, COMBINED); + gDPSetPrimColor(OVERLAY_DISP++, 0x00, 0x80, 0, 0, 0, this->endAlpha); + gDPLoadTextureTile(OVERLAY_DISP++, sTheEndTex, G_IM_FMT_IA, G_IM_SIZ_8b, 80, 24, 0, 0, 80 - 1, 24 - 1, 0, + G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, 0, 0, 0, 0); + gSPTextureRectangle(OVERLAY_DISP++, 120 << 2, 90 << 2, 200 << 2, 113 << 2, G_TX_RENDERTILE, 0, 0, 1 << 10, + 1 << 10); + gDPPipeSync(OVERLAY_DISP++); + gDPSetPrimColor(OVERLAY_DISP++, 0x00, 0x80, 0, 0, 0, this->tlozAlpha); + gDPLoadTextureTile(OVERLAY_DISP++, sTheLegendOfZeldaTex, G_IM_FMT_IA, G_IM_SIZ_8b, 120, 24, 0, 0, 120 - 1, + 24 - 1, 0, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, 0, 0, 0, 0); + gSPTextureRectangle(OVERLAY_DISP++, 100 << 2, 160 << 2, 220 << 2, 183 << 2, G_TX_RENDERTILE, 0, 0, 1 << 10, + 1 << 10); + gDPPipeSync(OVERLAY_DISP++); + gDPSetPrimColor(OVERLAY_DISP++, 0x00, 0x80, 0, 0, 0, this->ootAlpha); + gDPLoadTextureTile(OVERLAY_DISP++, sOcarinaOfTimeTex, G_IM_FMT_IA, G_IM_SIZ_8b, 112, 16, 0, 0, 112 - 1, 16 - 1, + 0, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, 0, 0, 0, 0); + gSPTextureRectangle(OVERLAY_DISP++, 104 << 2, 177 << 2, 216 << 2, 192 << 2, G_TX_RENDERTILE, 0, 0, 1 << 10, + 1 << 10); + if (D_801614B0.a > 0) + gSPGrayscale(OVERLAY_DISP++, true); + } + CLOSE_DISPS(play->state.gfxCtx); } diff --git a/soh/src/overlays/effects/ovl_Effect_Ss_Bomb2/z_eff_ss_bomb2.c b/soh/src/overlays/effects/ovl_Effect_Ss_Bomb2/z_eff_ss_bomb2.c index 12d5c38cc..cceafe7ed 100644 --- a/soh/src/overlays/effects/ovl_Effect_Ss_Bomb2/z_eff_ss_bomb2.c +++ b/soh/src/overlays/effects/ovl_Effect_Ss_Bomb2/z_eff_ss_bomb2.c @@ -178,19 +178,19 @@ void EffectSsBomb2_Update(PlayState* play, u32 index, EffectSs* this) { divisor = this->life - 13; this->rPrimColorR = func_80027DD4(this->rPrimColorR, 255, divisor); this->rPrimColorG = func_80027DD4(this->rPrimColorG, 255, divisor); - this->rPrimColorB = func_80027DD4(this->rPrimColorB, 150, divisor); + this->rPrimColorB = func_80027DD4(this->rPrimColorB, 255, divisor); this->rPrimColorA = func_80027DD4(this->rPrimColorA, 255, divisor); - this->rEnvColorR = func_80027DD4(this->rEnvColorR, 150, divisor); - this->rEnvColorG = func_80027DD4(this->rEnvColorG, 0, divisor); - this->rEnvColorB = func_80027DD4(this->rEnvColorB, 0, divisor); + this->rEnvColorR = func_80027DD4(this->rEnvColorR, 255, divisor); + this->rEnvColorG = func_80027DD4(this->rEnvColorG, 255, divisor); + this->rEnvColorB = func_80027DD4(this->rEnvColorB, 255, divisor); } else if ((this->life < 14) && (this->life > -1)) { divisor = this->life + 1; - this->rPrimColorR = func_80027DD4(this->rPrimColorR, 50, divisor); - this->rPrimColorG = func_80027DD4(this->rPrimColorG, 50, divisor); - this->rPrimColorB = func_80027DD4(this->rPrimColorB, 50, divisor); - this->rPrimColorA = func_80027DD4(this->rPrimColorA, 150, divisor); - this->rEnvColorR = func_80027DD4(this->rEnvColorR, 10, divisor); - this->rEnvColorG = func_80027DD4(this->rEnvColorG, 10, divisor); - this->rEnvColorB = func_80027DD4(this->rEnvColorB, 10, divisor); + this->rPrimColorR = func_80027DD4(this->rPrimColorR, 255, divisor); + this->rPrimColorG = func_80027DD4(this->rPrimColorG, 255, divisor); + this->rPrimColorB = func_80027DD4(this->rPrimColorB, 255, divisor); + this->rPrimColorA = func_80027DD4(this->rPrimColorA, 255, divisor); + this->rEnvColorR = func_80027DD4(this->rEnvColorR, 255, divisor); + this->rEnvColorG = func_80027DD4(this->rEnvColorG, 255, divisor); + this->rEnvColorB = func_80027DD4(this->rEnvColorB, 255, divisor); } } diff --git a/soh/src/overlays/gamestates/ovl_title/z_title.c b/soh/src/overlays/gamestates/ovl_title/z_title.c index 8893d9d5f..b2c003139 100644 --- a/soh/src/overlays/gamestates/ovl_title/z_title.c +++ b/soh/src/overlays/gamestates/ovl_title/z_title.c @@ -221,7 +221,7 @@ void Title_Draw(TitleContext* this) { } // Draw ice cube around N64 logo. - if (CVarGetInteger(CVAR_GENERAL("LetItSnow"), 0)) { + if (CVarGetInteger("gLetItSnow", 0)) { f32 scale = 0.4f; gSPSegment(POLY_OPA_DISP++, 0x08, From 563061bedac691126804e2525fd182b67af492ef Mon Sep 17 00:00:00 2001 From: Garrett Cox Date: Fri, 1 Nov 2024 09:09:13 -0500 Subject: [PATCH 02/18] Add holiday menu and various examples --- .../object_penguin/mat_object_penguin_DL_beak | 12 + .../object_penguin/mat_object_penguin_DL_eye | 21 + .../object_penguin/mat_object_penguin_DL_skin | 21 + .../objects/object_penguin/object_penguin_DL | 15 + .../object_penguin/object_penguin_DL_tri_0 | 862 ++++++++++++++++ .../object_penguin/object_penguin_DL_tri_1 | 210 ++++ .../object_penguin/object_penguin_DL_tri_2 | 9 + .../object_penguin/object_penguin_DL_vtx_0 | 922 ++++++++++++++++++ .../object_penguin/object_penguin_DL_vtx_1 | 215 ++++ .../object_penguin/object_penguin_DL_vtx_2 | 10 + .../custom/objects/object_penguin/ping_eye | Bin 0 -> 8284 bytes .../custom/objects/object_penguin/ping_tex | Bin 0 -> 8284 bytes soh/assets/soh_assets.h | 3 + soh/soh/Enhancements/Holiday/AGreenSpoon.cpp | 81 ++ soh/soh/Enhancements/Holiday/Example.cpp | 45 + soh/soh/Enhancements/Holiday/Fredomato.cpp | 155 +++ soh/soh/Enhancements/Holiday/Grimey.cpp | 208 ++++ soh/soh/Enhancements/Holiday/Holiday.hpp | 38 + soh/soh/Enhancements/Holiday/ItsHeckinPat.cpp | 150 +++ soh/soh/Enhancements/Holiday/ProxySaw.cpp | 231 +++++ .../custom-message/CustomMessageManager.cpp | 15 + .../custom-message/CustomMessageManager.h | 3 + .../game-interactor/GameInteractor.h | 27 + .../GameInteractor_HookTable.h | 2 + .../game-interactor/GameInteractor_Hooks.cpp | 15 + .../game-interactor/GameInteractor_Hooks.h | 2 + soh/soh/Enhancements/mods.cpp | 96 +- .../Enhancements/timesaver_hook_handlers.cpp | 6 +- soh/soh/SohMenuBar.cpp | 5 + soh/soh/util.cpp | 13 + soh/soh/util.h | 1 + soh/src/code/z_actor.c | 34 +- soh/src/code/z_message_PAL.c | 7 +- .../overlays/actors/ovl_Door_Ana/z_door_ana.c | 2 +- .../actors/ovl_En_Clear_Tag/z_en_clear_tag.c | 44 +- .../actors/ovl_En_Nutsball/z_en_nutsball.c | 2 +- 36 files changed, 3356 insertions(+), 126 deletions(-) create mode 100644 soh/assets/custom/objects/object_penguin/mat_object_penguin_DL_beak create mode 100644 soh/assets/custom/objects/object_penguin/mat_object_penguin_DL_eye create mode 100644 soh/assets/custom/objects/object_penguin/mat_object_penguin_DL_skin create mode 100644 soh/assets/custom/objects/object_penguin/object_penguin_DL create mode 100644 soh/assets/custom/objects/object_penguin/object_penguin_DL_tri_0 create mode 100644 soh/assets/custom/objects/object_penguin/object_penguin_DL_tri_1 create mode 100644 soh/assets/custom/objects/object_penguin/object_penguin_DL_tri_2 create mode 100644 soh/assets/custom/objects/object_penguin/object_penguin_DL_vtx_0 create mode 100644 soh/assets/custom/objects/object_penguin/object_penguin_DL_vtx_1 create mode 100644 soh/assets/custom/objects/object_penguin/object_penguin_DL_vtx_2 create mode 100644 soh/assets/custom/objects/object_penguin/ping_eye create mode 100644 soh/assets/custom/objects/object_penguin/ping_tex create mode 100644 soh/soh/Enhancements/Holiday/AGreenSpoon.cpp create mode 100644 soh/soh/Enhancements/Holiday/Example.cpp create mode 100644 soh/soh/Enhancements/Holiday/Fredomato.cpp create mode 100644 soh/soh/Enhancements/Holiday/Grimey.cpp create mode 100644 soh/soh/Enhancements/Holiday/Holiday.hpp create mode 100644 soh/soh/Enhancements/Holiday/ItsHeckinPat.cpp create mode 100644 soh/soh/Enhancements/Holiday/ProxySaw.cpp diff --git a/soh/assets/custom/objects/object_penguin/mat_object_penguin_DL_beak b/soh/assets/custom/objects/object_penguin/mat_object_penguin_DL_beak new file mode 100644 index 000000000..f83feec12 --- /dev/null +++ b/soh/assets/custom/objects/object_penguin/mat_object_penguin_DL_beak @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_penguin/mat_object_penguin_DL_eye b/soh/assets/custom/objects/object_penguin/mat_object_penguin_DL_eye new file mode 100644 index 000000000..c24abe2ab --- /dev/null +++ b/soh/assets/custom/objects/object_penguin/mat_object_penguin_DL_eye @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_penguin/mat_object_penguin_DL_skin b/soh/assets/custom/objects/object_penguin/mat_object_penguin_DL_skin new file mode 100644 index 000000000..6c57863e3 --- /dev/null +++ b/soh/assets/custom/objects/object_penguin/mat_object_penguin_DL_skin @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_penguin/object_penguin_DL b/soh/assets/custom/objects/object_penguin/object_penguin_DL new file mode 100644 index 000000000..393bbc438 --- /dev/null +++ b/soh/assets/custom/objects/object_penguin/object_penguin_DL @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_penguin/object_penguin_DL_tri_0 b/soh/assets/custom/objects/object_penguin/object_penguin_DL_tri_0 new file mode 100644 index 000000000..9039650d4 --- /dev/null +++ b/soh/assets/custom/objects/object_penguin/object_penguin_DL_tri_0 @@ -0,0 +1,862 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_penguin/object_penguin_DL_tri_1 b/soh/assets/custom/objects/object_penguin/object_penguin_DL_tri_1 new file mode 100644 index 000000000..efb326ace --- /dev/null +++ b/soh/assets/custom/objects/object_penguin/object_penguin_DL_tri_1 @@ -0,0 +1,210 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_penguin/object_penguin_DL_tri_2 b/soh/assets/custom/objects/object_penguin/object_penguin_DL_tri_2 new file mode 100644 index 000000000..96c7933ec --- /dev/null +++ b/soh/assets/custom/objects/object_penguin/object_penguin_DL_tri_2 @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/custom/objects/object_penguin/object_penguin_DL_vtx_0 b/soh/assets/custom/objects/object_penguin/object_penguin_DL_vtx_0 new file mode 100644 index 000000000..f1a650d47 --- /dev/null +++ b/soh/assets/custom/objects/object_penguin/object_penguin_DL_vtx_0 @@ -0,0 +1,922 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_penguin/object_penguin_DL_vtx_1 b/soh/assets/custom/objects/object_penguin/object_penguin_DL_vtx_1 new file mode 100644 index 000000000..5cd519f95 --- /dev/null +++ b/soh/assets/custom/objects/object_penguin/object_penguin_DL_vtx_1 @@ -0,0 +1,215 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_penguin/object_penguin_DL_vtx_2 b/soh/assets/custom/objects/object_penguin/object_penguin_DL_vtx_2 new file mode 100644 index 000000000..97f03bf0f --- /dev/null +++ b/soh/assets/custom/objects/object_penguin/object_penguin_DL_vtx_2 @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_penguin/ping_eye b/soh/assets/custom/objects/object_penguin/ping_eye new file mode 100644 index 0000000000000000000000000000000000000000..32eb2e7e10e39ade1bea8a3473726669ab88169f GIT binary patch literal 8284 zcmb`MJ80ub7{{fnQU(^|Y?scMR4Gi@>Q)?AB+bFH#ggDAtx1*2xLG5D3CndU4Q5G7 z8MB2dGY2kQgb;-#;L@F~(nT<;9Njk~X*_z(LzaZ2hh_c#-+#V&M$=^t9Gz^9k@dNCP#u$fdYNwjaTjEdOmWFrVDhB2C&~x z7tYaqv|O*+-Z)bQSAlf71KVxPu7KOLtJbUaVm&?d9(vXjoW0sr)SND6S8gLi11A$@ z>4e=v10cTu)r7sv?D)E8y?~0rtVJ}$3nN#7l=quedp?@p+ZBj7&Sf>=bJKdVE7SY= zXw^=XL}nSt&^_dyI4%1E;=W-bPLj9RH{ipC({fKBC)q7SftU~UhEoIA9|e(b`PhX= zyXw@S99RV@z6^c2p1R=styJWU2J05e!CkI-3WR*@e9f*rDAS2rPyimB_*)NR4hZS~ zs_h(s^Tp`k1$a<(jvy1a8>2wP_r|jkWZk2x^X&7G2N$yuvzRF9k#p-A4VG^-3xFT=2cqb~`}**MLe4X}7t?7DKR9)!45auTn!lmuZr(>KtVh(G z#~jc!k^4A$>$QaFu`8za$~ZtuK;S-FuFHxZyMP^7u4z4t6r__byaSnkWmijzo;YAv zXIHcq2>Gk_bOEh>UPcwTZ@o+xGzUfejoUy?=wl0Ta(~l9O}7#Dhyp(3{xAEZWM3z% z@y7l*{}r|ZB0ettN{OY9HJWyXW`L0I)U4lS^R3@bEzCdxpJbn6yW2PV#vR%5SymQU z&ol#teDqVL05N|coBe&moV4^a{ZqHDA9VMP z12}%_p6M;!Ols(%LD~Gi(Sewcjs32sv-^Jc818rCC85HX@*mUB^ux(sj2-CMgZpPX zt3btnX#FJe&jgKmiXY@mQ zA7T50qfeGQ%f{#X@J#5yw*4X5AC3SrdqA1?w{KkQ$3~KuzCMQMNL}2vzre@yZ_Wrn zqW|d|=iNh2*+)taC+A(l-}XN&Kc@u5{qG&rFOmB}34DQ85k??U{~Nl`cR)P;P~@9* z{1Haa=ljC(m!ki-bo|Bec{v~&e=6nQUv&H#qx1OU@wY<#gXqKYcY@DTAew(jw?Dbj z^K(Ev|B`Hf|E2SU?6thDrkON3|Sytf5{nt-428G7d-dp(y=2v1v2YTiSeiT zfLA_hu=*oK7b+;a{w7VQ3bHd%as3gI^+%ZP2+AE(*)4cJb5P(HSbtTdV02U<=|rt{Pp)On^)sl*VE^r3wau_3Y78xhhUwN#9f>nsi7M3RU{K7B=647 d(7;zg$>p&#H832;A9^?XP5H+x8hcNb_&;wVkmUdX literal 0 HcmV?d00001 diff --git a/soh/assets/custom/objects/object_penguin/ping_tex b/soh/assets/custom/objects/object_penguin/ping_tex new file mode 100644 index 0000000000000000000000000000000000000000..9913decc7ddb183063709735b48aea252603001b GIT binary patch literal 8284 zcmc(jA#mbA7=^Mm^MS2FYoEe7d;2tbSuEZ2;eE5;8;tK}qt)0wUy?WdeBN(-*L?I`@qWGf zJ8{d8djHn?IJo3X?uR>i|GwV0UGh=+u=o46KXu1fJqNjm_x|*-amAO)qvtG}8z0^u zHm>;5$|Lvi{;)Y7UFZj0RbF|23=S83&|CA{Cw9EI7QCl=7ktvuZ&l@mUOZn?kK8@) zQF-Pb-s33Nf2JNY?euf8T(2uAQlmqv!8GdL7nRojUss##~(P#DRSMXQyq= zJ9RkE5wGac%JT{Gkxs zW#jB}|H+1OWDcDcBaW#NW0YBj&09p-PvU@&Y3smIud76b(I0T`pa52+~b%xd*yrv z8@|lzr~RF}?UdW|kvz;V>~dVu$=sHOZC8J(J=M#a%D&>N_O^V!H{x1e*0Z*Gi_&ez zzuLuNA9cEu(eG?_ZkoTa`)W0Rsd{t$l6|<(brp9~W-61fGSx35Usjc}n@GO1**9i< zabN9bPIq!K*I!`}0;VboF_tRFjIwkqsj8FCGJjg!ZUge?QB>$qG zZ%|}U!TBaxm+3d>^|R|^M+NoazH7=zyY3uc)*IMO>ifC0`stateFlags1 & PLAYER_STATE1_TALKING)) { + Math_ApproachS(&enGs->actor.shape.rot.y, enGs->actor.yawTowardsPlayer, 5, 0xBB8); + + if (enGs->unk_200 <= 0) { + float offsetDistance = 10.0f; + float offsetX = sinf(enGs->actor.shape.rot.y * (M_PI / 0x8000)) * offsetDistance; + float offsetZ = cosf(enGs->actor.shape.rot.y * (M_PI / 0x8000)) * offsetDistance; + + float dx = player->actor.world.pos.x - (enGs->actor.world.pos.x + offsetX); + float dy = player->actor.world.pos.y - 10.0f - enGs->actor.world.pos.y; + float dz = player->actor.world.pos.z - (enGs->actor.world.pos.z + offsetZ); + + s16 rotX = atan2f(dy, sqrtf(dx * dx + dz * dz)) * (0x8000 / M_PI); + s16 rotY = enGs->actor.shape.rot.y; + s16 rotZ = atan2f(dx, dz) * (0x8000 / M_PI); + + Actor* actor = Actor_Spawn(&play->actorCtx, play, ACTOR_EN_CLEAR_TAG, + enGs->actor.world.pos.x + offsetX, + enGs->actor.world.pos.y + 40.0f, + enGs->actor.world.pos.z + offsetZ, + rotX, rotY, rotZ, + 100, false); + + EnClearTag* clearTag = (EnClearTag*)actor; + + enGs->unk_200 = 5; + } + + enGs->unk_200--; + } +} + +static void OnConfigurationChanged() { + COND_ID_HOOK(OnOpenText, 0x2053, CVarGetInteger(CVAR("EvilGossipStone"), 0), [](u16 * textId, bool* loadFromMessageTable) { + Actor* actor = Actor_FindNearby(gPlayState, &GET_PLAYER(gPlayState)->actor, ACTOR_EN_GS, ACTORCAT_PROP, 100.0f); + + if (actor == NULL) { + return; + } + + EnGs* gs = (EnGs*)actor; + gs->actionFunc = EnGs_Evil; + }); +} + +static void DrawMenu() { + ImGui::SeparatorText(AUTHOR); + if (UIWidgets::EnhancementCheckbox("Evil Gossip Stone", CVAR("EvilGossipStone"))) { + OnConfigurationChanged(); + } +} + +static void RegisterMod() { + // #region Leave this alone unless you know what you are doing + OnConfigurationChanged(); + // #endregion + + // TODO: Anything you want to run once on startup +} + +// TODO: Uncomment this line to enable the mod +static Holiday holiday(DrawMenu, RegisterMod); diff --git a/soh/soh/Enhancements/Holiday/Example.cpp b/soh/soh/Enhancements/Holiday/Example.cpp new file mode 100644 index 000000000..235738811 --- /dev/null +++ b/soh/soh/Enhancements/Holiday/Example.cpp @@ -0,0 +1,45 @@ +#include "Holiday.hpp" + +extern "C" { +#include "macros.h" +#include "functions.h" +#include "variables.h" +extern PlayState* gPlayState; + +// TODO: Include anything you need here from C land +} + +// TODO: Change this to YourName +#define AUTHOR "Example" +#define CVAR(v) "gHoliday." AUTHOR "." v + +static void OnConfigurationChanged() { + // TODO: Register any hooks or things that need to run on startup and when the main CVar is toggled + // Note: Hooks should be registered/unregistered depending on the CVar state (Use COND_HOOK or COND_ID_HOOK) + + // COND_HOOK(OnSceneSpawnActors, CVarGetInteger(CVAR("Enabled"), 0), []() { + // // Spawn your own actors? + // }); + + // COND_ID_HOOK(OnActorInit, ACTOR_OBJ_TSUBO, CVarGetInteger(CVAR("DoSomethingWithPots"), 0), [](void* actorRef) { + // // Do something with pots? + // }); +} + +static void DrawMenu() { + ImGui::SeparatorText(AUTHOR); + if (UIWidgets::EnhancementCheckbox("DoSomethingWithPots", CVAR("DoSomethingWithPots"))) { + OnConfigurationChanged(); + } +} + +static void RegisterMod() { + // #region Leave this alone unless you know what you are doing + OnConfigurationChanged(); + // #endregion + + // TODO: Anything you want to run once on startup +} + +// TODO: Uncomment this line to enable the mod +// static Holiday holiday(DrawMenu, RegisterMod); diff --git a/soh/soh/Enhancements/Holiday/Fredomato.cpp b/soh/soh/Enhancements/Holiday/Fredomato.cpp new file mode 100644 index 000000000..5ac148c2d --- /dev/null +++ b/soh/soh/Enhancements/Holiday/Fredomato.cpp @@ -0,0 +1,155 @@ +#include "Holiday.hpp" +#include +#include "soh/UIWidgets.hpp" +#include "soh/Enhancements/game-interactor/GameInteractor.h" +#include "objects/object_dog/object_dog.h" +#include "soh/frame_interpolation.h" +#include "soh/Enhancements/randomizer/3drando/random.hpp" +#include "soh/Enhancements/randomizer/3drando/location_access.hpp" +#include "soh/Enhancements/randomizer/entrance.h" + +#include "objects/gameplay_field_keep/gameplay_field_keep.h" +#include "objects/object_md/object_md.h" +#include "src/overlays/actors/ovl_Door_Ana/z_door_ana.h" +extern "C" { +#include "macros.h" +#include "functions.h" +#include "variables.h" + +extern PlayState* gPlayState; +void DoorAna_SetupAction(DoorAna* doorAna, DoorAnaActionFunc actionFunc); +void DoorAna_GrabPlayer(DoorAna* doorAna, PlayState* play); +} + +#define AUTHOR "Fredomato" +#define CVAR(v) "gHoliday." AUTHOR "." v + +static CollisionPoly snowballPoly; +static f32 raycastResult; + +const s16 entrances[] = { + 0x0000, 0x0209, 0x0004, 0x0242, 0x0028, 0x0221, 0x0169, 0x0215, 0x0165, 0x024A, 0x0010, 0x021D, 0x0082, 0x01E1, 0x0037, 0x0205, + 0x0098, 0x02A6, 0x0088, 0x03D4, 0x0008, 0x03A8, 0x0467, 0x023D, 0x0433, 0x0443, 0x0437, 0x0447, 0x009C, 0x033C, 0x00C9, 0x026A, + 0x00C1, 0x0266, 0x0043, 0x03CC, 0x045F, 0x0309, 0x03A0, 0x03D0, 0x007E, 0x026E, 0x0530, 0x01D1, 0x0507, 0x03BC, 0x0388, 0x02A2, + 0x0063, 0x01D5, 0x0528, 0x03C0, 0x043B, 0x0067, 0x02FD, 0x0349, 0x0550, 0x04EE, 0x039C, 0x0345, 0x05C8, 0x05DC, 0x0072, 0x034D, + 0x030D, 0x0355, 0x037C, 0x03FC, 0x0380, 0x03C4, 0x004F, 0x0378, 0x02F9, 0x042F, 0x05D0, 0x05D4, 0x052C, 0x03B8, 0x016D, 0x01CD, + 0x00B7, 0x0201, 0x003B, 0x0463, 0x0588, 0x057C, 0x0578, 0x0340, 0x04C2, 0x03E8, 0x04BE, 0x0482, 0x0315, 0x045B, 0x0371, 0x0394, + 0x0272, 0x0211, 0x0053, 0x0472, 0x0453, 0x0351, 0x0384, 0x044B, 0x03EC, 0x04FF, 0x0700, 0x0800, 0x0701, 0x0801, 0x0702, 0x0802, + 0x0703, 0x0803, 0x0704, 0x0804, 0x0705, 0x0805, 0x0706, 0x0806, 0x0707, 0x0807, 0x0708, 0x0808, 0x0709, 0x0809, 0x070A, 0x080A, + 0x070B, 0x080B, 0x070C, 0x080C, 0x070D, 0x080D, 0x070E, 0x080E, 0x070F, 0x080F, 0x0710, 0x0711, 0x0811, 0x0712, 0x0812, + 0x0713, 0x0813, 0x0714, 0x0814, 0x0715, 0x0815, 0x0716, 0x0816, 0x0717, 0x0817, 0x0718, 0x0818, 0x0719, 0x0819, 0x081A, + 0x071B, 0x081B, 0x071C, 0x081C, 0x071D, 0x081D, 0x071E, 0x081E, 0x071F, 0x081F, 0x0720, 0x0820, 0x004B, 0x035D, 0x031C, 0x0361, + 0x002D, 0x050B, 0x044F, 0x0359, 0x05E0, 0x020D, 0x011E, 0x0286, 0x04E2, 0x04D6, 0x01DD, 0x04DA, 0x00FC, 0x01A9, 0x0185, 0x04DE, + 0x0102, 0x0189, 0x0117, 0x018D, 0x0276, 0x01FD, 0x00DB, 0x017D, 0x00EA, 0x0181, 0x0157, 0x01F9, 0x0328, 0x0560, 0x0129, 0x022D, + 0x0130, 0x03AC, 0x0123, 0x0365, 0x00B1, 0x0033, 0x0138, 0x025A, 0x0171, 0x025E, 0x00E4, 0x0195, 0x013D, 0x0191, 0x014D, 0x01B9, + 0x0246, 0x01C1, 0x0147, 0x01BD, 0x0108, 0x019D, 0x0225, 0x01A1, 0x0219, 0x027E, 0x0554, 0x00BB, 0x0282, 0x0600, 0x04F6, 0x0604, + 0x01F1, 0x0568, 0x05F4, 0x040F, 0x0252, 0x040B, 0x00C5, 0x0301, 0x0407, 0x000C, 0x024E, 0x0305, 0x0175, 0x0417, 0x0423, 0x008D, + 0x02F5, 0x0413, 0x02B2, 0x0457, 0x047A, 0x010E, 0x0608, 0x0564, 0x060C, 0x0610, 0x0580 +}; + +static bool midoGrottoInit = false; +static SkelAnime midoSkelAnime; +static Vec3s midoJointTable[17]; +static Vec3s midoMorphTable[17]; + +static void RandomGrotto_WaitOpen(DoorAna* doorAna, PlayState* play) { + if (!midoGrottoInit) { + midoGrottoInit = true; + SkelAnime_InitFlex(play, &midoSkelAnime, (FlexSkeletonHeader*)&gMidoSkel, (AnimationHeader*)&gMidoWalkingAnim, midoJointTable, midoMorphTable, 17); + } + SkelAnime_Update(&midoSkelAnime); + + Actor* actor = &doorAna->actor; + Player* player = GET_PLAYER(play); + Math_SmoothStepToF(&actor->world.pos.x, player->actor.world.pos.x, 0.1f, 10.0f, 0.0f); + Math_SmoothStepToF(&actor->world.pos.z, player->actor.world.pos.z, 0.1f, 10.0f, 0.0f); + Math_SmoothStepToF(&actor->world.pos.y, player->actor.world.pos.y, 0.1f, 10.0f, 0.0f); + + Math_ApproachS(&doorAna->actor.shape.rot.y, doorAna->actor.yawTowardsPlayer, 5, 0xBB8); + + if (Math_StepToF(&actor->scale.x, 0.01f, 0.001f)) { + if ((actor->targetMode != 0) && (play->transitionTrigger == TRANS_TRIGGER_OFF) && (player->stateFlags1 & PLAYER_STATE1_FLOOR_DISABLED) && (player->av1.actionVar1 == 0)) { + play->nextEntranceIndex = RandomElement(entrances); + DoorAna_SetupAction((DoorAna*)actor, DoorAna_GrabPlayer); + } else { + if (!Player_InCsMode(play) && !(player->stateFlags1 & (PLAYER_STATE1_ON_HORSE | PLAYER_STATE1_IN_WATER)) && + actor->xzDistToPlayer <= 15.0f && -50.0f <= actor->yDistToPlayer && + actor->yDistToPlayer <= 15.0f) { + player->stateFlags1 |= PLAYER_STATE1_FLOOR_DISABLED; + actor->targetMode = 1; + } else { + actor->targetMode = 0; + } + } + } + Actor_SetScale(actor, actor->scale.x); +} + +static void RandomGrotto_Draw(Actor* actor, PlayState* play) { + if (!midoGrottoInit) { + return; + } + OPEN_DISPS(play->state.gfxCtx); + + Gfx_SetupDL_25Xlu(play->state.gfxCtx); + gSPMatrix(POLY_XLU_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), + G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + gSPDisplayList(POLY_XLU_DISP++, (Gfx*)gGrottoDL); + + Matrix_Translate(0.0f, -2700.0f, 0.0f, MTXMODE_APPLY); + gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx, (char*)__FILE__, __LINE__), G_MTX_MODELVIEW | G_MTX_LOAD); + gSPSegment(POLY_OPA_DISP++, 0x08, (uintptr_t)gMidoEyeOpenTex); + func_80034BA0(play, &midoSkelAnime, NULL, NULL, actor, 255); + + CLOSE_DISPS(play->state.gfxCtx); +} + +static void SpawnRandomGrotto() { + Vec3f pos; + pos.y = 9999.0f; + int spawnAttempts = 0; + while (spawnAttempts < 50) { + if (GET_PLAYER(gPlayState) != nullptr) { + pos.x = GET_PLAYER(gPlayState)->actor.world.pos.x; + pos.z = GET_PLAYER(gPlayState)->actor.world.pos.z; + } else { + pos.x = 0; + pos.z = 0; + } + // X/Z anywhere from -1000.0 to +1000.0 from player + pos.x += (float)(Random(0, 2000)) - 1000.0f; + pos.z += (float)(Random(0, 2000)) - 1000.0f; + + raycastResult = BgCheck_AnyRaycastFloor1(&gPlayState->colCtx, &snowballPoly, &pos); + + if (raycastResult > BGCHECK_Y_MIN) { + Actor* grotto = Actor_Spawn(&gPlayState->actorCtx, gPlayState, ACTOR_DOOR_ANA, pos.x, raycastResult, pos.z, 0, 0, 0, 0, false); + midoGrottoInit = false; + DoorAna_SetupAction((DoorAna*)grotto, RandomGrotto_WaitOpen); + grotto->draw = RandomGrotto_Draw; + break; + } + + spawnAttempts++; + } +} + +static void ConfigurationChanged() { + COND_HOOK(OnSceneSpawnActors, CVarGetInteger(CVAR("KrampusHole"), 0), SpawnRandomGrotto); +} + +static void DrawMenu() { + ImGui::SeparatorText(AUTHOR); + + if (UIWidgets::EnhancementCheckbox("The Krampus Hole", CVAR("KrampusHole"))) { + ConfigurationChanged(); + } +} + +static void RegisterMod() { + // #region Leave this alone unless you know what you are doing + ConfigurationChanged(); + // #endregion +} + +static Holiday holiday(DrawMenu, RegisterMod); diff --git a/soh/soh/Enhancements/Holiday/Grimey.cpp b/soh/soh/Enhancements/Holiday/Grimey.cpp new file mode 100644 index 000000000..cd21ce91c --- /dev/null +++ b/soh/soh/Enhancements/Holiday/Grimey.cpp @@ -0,0 +1,208 @@ +#include "Holiday.hpp" +#include "soh/Enhancements/randomizer/3drando/random.hpp" +#include "soh/frame_interpolation.h" +#include "soh_assets.h" +#include "overlays/actors/ovl_En_Nutsball/z_en_nutsball.h" + +extern "C" { +#include "macros.h" +#include "functions.h" +#include "variables.h" + +#include "objects/gameplay_field_keep/gameplay_field_keep.h" +extern PlayState* gPlayState; +void func_80ABBBA8(EnNutsball* nut, PlayState* play); +void EnNutsball_Draw(Actor* nut, PlayState* play); +} + +#define AUTHOR "Grimey" +#define CVAR(v) "gHoliday." AUTHOR "." v + +static bool spawningPenguins = false; + +typedef enum { + PENGUIN_STATE_IDLE, + PENGUIN_STATE_WALK, +} PenguinState; + +struct Penguin { + PenguinState state; + s16 timer; + s16 targetRot; +}; + +std::unordered_map penguins; + +void Penguin_Init(Actor* actor, PlayState* play) { + Penguin penguin; + penguin.state = PENGUIN_STATE_IDLE; + penguin.timer = 0; + actor->world.rot.y = penguin.targetRot = rand() % 0x10000; + penguins[actor] = penguin; + actor->gravity = -1.0f; + actor->flags &= ~ACTOR_FLAG_TARGETABLE; +} + +void Penguin_Update(Actor* actor, PlayState* play) { + Penguin* penguin = &penguins[actor]; + + if (penguin->timer <= 0) { + if (penguin->state == PENGUIN_STATE_IDLE) { + penguin->state = (PenguinState)(rand() % 3); + penguin->timer = rand() % (20 * 10) + (20 * 3); + } else { + penguin->state = PENGUIN_STATE_IDLE; + penguin->timer = rand() % (20 * 10) + (20 * 3); + } + } else { + penguin->timer--; + } + + if (rand() % 100 == 0) { + penguin->targetRot = rand() % 0x10000; + } + + switch (penguin->state) { + case PENGUIN_STATE_IDLE: + break; + case PENGUIN_STATE_WALK: + actor->speedXZ = 0.5f; + break; + } + + Math_SmoothStepToS(&actor->world.rot.y, penguin->targetRot, 1, 200, 0); + actor->shape.rot.y = actor->world.rot.y; + + if (actor->speedXZ < 0.0f) { + actor->speedXZ = 0.0f; + } + + Actor_MoveForward(actor); + + Actor_UpdateBgCheckInfo(play, actor, 10.0f, 10.0f, 0.0f, 0xFF); +} + +void Penguin_Draw(Actor* actor, PlayState* play) { + OPEN_DISPS(play->state.gfxCtx); + + Gfx_SetupDL_25Opa(play->state.gfxCtx); + + Matrix_Scale(0.8f, 0.8f, 0.8f, MTXMODE_APPLY); + Matrix_Translate(0, 2000.0f, 0, MTXMODE_APPLY); + gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx, (char*)__FILE__, __LINE__), G_MTX_MODELVIEW | G_MTX_LOAD); + gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 255, 255, 255, 255); + gSPDisplayList(POLY_OPA_DISP++, (Gfx*)gPenguinDL); + + CLOSE_DISPS(play->state.gfxCtx); +} + +void Penguin_Destroy(Actor* actor, PlayState* play) { + penguins.erase(actor); +} + +static void OnConfigurationChanged() { + COND_HOOK(OnPlayerUpdate, CVarGetInteger(CVAR("Hailstorm"), 0), []() { + // Every frame has a 1/300 chance of spawning hail + if (rand() % 300 == 0) { + int spawned = 0; + while (spawned < 1) { + Vec3f pos = GET_PLAYER(gPlayState)->actor.world.pos; + pos.x += (float)Random(0, 100) - 50.0f; + pos.z += (float)Random(0, 100) - 50.0f; + pos.y += 200.0f; + + Actor* actor = Actor_Spawn(&gPlayState->actorCtx, gPlayState, ACTOR_EN_NUTSBALL, pos.x, pos.y, pos.z, 0, 0, 0, 0, false); + EnNutsball* nut = (EnNutsball*)actor; + nut->actor.draw = EnNutsball_Draw; + nut->actor.shape.rot.y = 0; + nut->timer = 0; + nut->actionFunc = func_80ABBBA8; + nut->actor.speedXZ = 0.0f; + nut->actor.gravity = -2.0f; + spawned++; + } + } + }); + + COND_HOOK(OnSceneSpawnActors, CVarGetInteger(CVAR("Penguins"), 0), []() { + penguins.clear(); + + if (gPlayState->sceneNum != SCENE_HYRULE_FIELD) { + return; + } + + static Vec3f huddlePos; + static Vec3f spawnPos; + static f32 raycastResult; + static CollisionPoly poly; + + spawningPenguins = true; + + int huddlesSpawned = 0; + while (huddlesSpawned < 10) { + huddlePos.x = (float)(Random( + (gPlayState->sceneNum == SCENE_HYRULE_FIELD ? -10000 : -2700) + 10000, + (gPlayState->sceneNum == SCENE_HYRULE_FIELD ? 5000 : 2000) + 10000 + ) - (float)10000.0f); + huddlePos.y = 5000; + huddlePos.z = (float)(Random( + (gPlayState->sceneNum == SCENE_HYRULE_FIELD ? -1000 : -2000) + 10000, + (gPlayState->sceneNum == SCENE_HYRULE_FIELD ? 15000 : 2000) + 10000 + ) - (float)10000.0f); + + if (BgCheck_AnyRaycastFloor1(&gPlayState->colCtx, &poly, &huddlePos) <= BGCHECK_Y_MIN) { + continue; + } + + // 5-10 + int huddleSize = rand() % 6 + 5; + int penguinsSpawned = 0; + while (penguinsSpawned < huddleSize) { + spawnPos.x = huddlePos.x + rand() % 100 - 50; + spawnPos.y = huddlePos.y; + spawnPos.z = huddlePos.z + rand() % 100 - 50; + + raycastResult = BgCheck_AnyRaycastFloor1(&gPlayState->colCtx, &poly, &spawnPos); + + if (raycastResult > BGCHECK_Y_MIN) { + Actor_Spawn(&gPlayState->actorCtx, gPlayState, ACTOR_EN_OE2, spawnPos.x, raycastResult, spawnPos.z, 0, 0, 0, 0, false); + penguinsSpawned++; + } + } + huddlesSpawned++; + } + + spawningPenguins = false; + }); + + COND_ID_HOOK(ShouldActorInit, ACTOR_EN_OE2, CVarGetInteger(CVAR("Penguins"), 0), [](void* actorRef, bool* should) { + Actor* actor = (Actor*)actorRef; + if (spawningPenguins) { + actor->init = Penguin_Init; + actor->update = Penguin_Update; + actor->draw = Penguin_Draw; + actor->destroy = Penguin_Destroy; + } + }); +} + +static void DrawMenu() { + ImGui::SeparatorText(AUTHOR); + if (UIWidgets::EnhancementCheckbox("Penguins", CVAR("Penguins"))) { + OnConfigurationChanged(); + } + if (UIWidgets::EnhancementCheckbox("Hailstorm", CVAR("Hailstorm"))) { + OnConfigurationChanged(); + } +} + +static void RegisterMod() { + // #region Leave this alone unless you know what you are doing + OnConfigurationChanged(); + // #endregion + + // TODO: Anything you want to run once on startup +} + +// TODO: Uncomment this line to enable the mod +static Holiday holiday(DrawMenu, RegisterMod); diff --git a/soh/soh/Enhancements/Holiday/Holiday.hpp b/soh/soh/Enhancements/Holiday/Holiday.hpp new file mode 100644 index 000000000..9a6717060 --- /dev/null +++ b/soh/soh/Enhancements/Holiday/Holiday.hpp @@ -0,0 +1,38 @@ +#ifndef HOLIDAY_HPP +#define HOLIDAY_HPP + +#include +#include +#include +#include "soh/UIWidgets.hpp" +#include "soh/Enhancements/game-interactor/GameInteractor.h" +#include "soh/Enhancements/cosmetics/CosmeticsEditor.h" + +inline std::vector> holidayDrawFuncs = {}; +inline std::vector> holidayRegisterFuncs = {}; + +inline void DrawHolidayMenu() { + if (ImGui::BeginMenu("Holiday")) { + for (auto& drawFunc : holidayDrawFuncs) { + ImGui::PushID(&drawFunc); + drawFunc(); + ImGui::PopID(); + } + ImGui::EndMenu(); + } +} + +inline void RegisterHoliday() { + for (auto& regFunc : holidayRegisterFuncs) { + regFunc(); + } +} + +struct Holiday { + Holiday(std::function drawFunc, std::function registerFunc) { + holidayDrawFuncs.push_back(drawFunc); + holidayRegisterFuncs.push_back(registerFunc); + } +}; + +#endif //HOLIDAY_HPP diff --git a/soh/soh/Enhancements/Holiday/ItsHeckinPat.cpp b/soh/soh/Enhancements/Holiday/ItsHeckinPat.cpp new file mode 100644 index 000000000..778b260ec --- /dev/null +++ b/soh/soh/Enhancements/Holiday/ItsHeckinPat.cpp @@ -0,0 +1,150 @@ +#include "Holiday.hpp" +#include "soh_assets.h" +#include "soh/Enhancements/randomizer/3drando/random.hpp" +#include "soh/frame_interpolation.h" +#include "soh/Notification/Notification.h" +#include "objects/gameplay_field_keep/gameplay_field_keep.h" +#include "soh/Enhancements/custom-message/CustomMessageManager.h" +#include "soh/util.h" +#include "soh/Enhancements/randomizer/randomizer.h" + +extern "C" { +#include "macros.h" +#include "functions.h" +#include "variables.h" +extern PlayState* gPlayState; +} +extern GetItemEntry vanillaQueuedItemEntry; + +#define AUTHOR "ItsHeckinPat" +#define CVAR(v) "gHoliday." AUTHOR "." v + +bool spawningPresents = false; + +int collectedPresent = 0; + +struct Present { +}; + +std::unordered_map presents; + +void Present_Init(Actor* actor, PlayState* play) { + Present present; + presents[actor] = present; + + actor->gravity = -1; + Actor_MoveForward(actor); + actor->shape.rot.y = Random(0, 0xFFFF); + + Actor_UpdateBgCheckInfo(play, actor, 10.0f, 10.0f, 0.0f, 0xFF); +} + +void Present_Update(Actor* actor, PlayState* play) { + Present* present = &presents[actor]; + + if (actor->xzDistToPlayer < 50.0f && actor->yDistToPlayer < 50.0f) { + collectedPresent++; + Notification::Emit({ + .itemIcon = "RG_TRIFORCE_PIECE", + .message = "You collected a present!", + .messageColor = ImVec4(1.0f, 1.0f, 1.0f, 1.0f), + }); + Actor_Kill(actor); + } +} + +void Present_Draw(Actor* actor, PlayState* play) { + OPEN_DISPS(play->state.gfxCtx); + + Gfx_SetupDL_25Opa(play->state.gfxCtx); + + Matrix_Scale(30.0f, 30.0f, 30.0f, MTXMODE_APPLY); + Matrix_Translate(49.20f, 0.0f, -106.60f, MTXMODE_APPLY); + gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx, (char*)__FILE__, __LINE__), G_MTX_MODELVIEW | G_MTX_LOAD); + gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 255, 255, 255, 255); + gSPDisplayList(POLY_OPA_DISP++, (Gfx*)gXmasDecor100DL); + + CLOSE_DISPS(play->state.gfxCtx); +} + +void Present_Destroy(Actor* actor, PlayState* play) { + presents.erase(actor); +} + +static CollisionPoly presentPoly; +static f32 raycastResult; + +static void OnConfigurationChanged() { + COND_HOOK(OnSceneSpawnActors, CVarGetInteger(CVAR("GiftsForNPCs"), 0), []() { + presents.clear(); + Vec3f pos; + pos.y = 9999.0f; + int spawnAttempts = 0; + while (spawnAttempts < 50) { + if (GET_PLAYER(gPlayState) != nullptr) { + pos.x = GET_PLAYER(gPlayState)->actor.world.pos.x; + pos.z = GET_PLAYER(gPlayState)->actor.world.pos.z; + } else { + pos.x = 0; + pos.z = 0; + } + // X/Z anywhere from -1000.0 to +1000.0 from player + pos.x += (float)(Random(0, 2000)) - 1000.0f; + pos.z += (float)(Random(0, 2000)) - 1000.0f; + + raycastResult = BgCheck_AnyRaycastFloor1(&gPlayState->colCtx, &presentPoly, &pos); + + if (raycastResult > BGCHECK_Y_MIN) { + spawningPresents = true; + Actor* actor = Actor_Spawn(&gPlayState->actorCtx, gPlayState, ACTOR_EN_OE2, pos.x, raycastResult, pos.z, 0, 0, 0, 0, false); + spawningPresents = false; + // break; + } + + spawnAttempts++; + } + }); + + COND_ID_HOOK(ShouldActorInit, ACTOR_EN_OE2, CVarGetInteger(CVAR("GiftsForNPCs"), 0), [](void* actorRef, bool* should) { + Actor* actor = (Actor*)actorRef; + if (spawningPresents) { + actor->init = Present_Init; + actor->update = Present_Update; + actor->draw = Present_Draw; + actor->destroy = Present_Destroy; + } + }); + + COND_ID_HOOK(OnOpenText, 0x1019, CVarGetInteger(CVAR("GiftsForNPCs"), 0), [](u16 * textId, bool* loadFromMessageTable) { + if (collectedPresent <= 0) { + return; + } + + auto messageEntry = CustomMessage("A present??? FOR ME???"); + messageEntry.Format(); + messageEntry.LoadIntoFont(); + *loadFromMessageTable = false; + + vanillaQueuedItemEntry = Rando::StaticData::RetrieveItem(RG_PIECE_OF_HEART).GetGIEntry_Copy(); + + collectedPresent--; + }); +} + +static void DrawMenu() { + ImGui::SeparatorText(AUTHOR); + if (UIWidgets::EnhancementCheckbox("Gifts for NPCs", CVAR("GiftsForNPCs"))) { + OnConfigurationChanged(); + } +} + +static void RegisterMod() { + // #region Leave this alone unless you know what you are doing + OnConfigurationChanged(); + // #endregion + + // TODO: Anything you want to run once on startup +} + +// TODO: Uncomment this line to enable the mod +static Holiday holiday(DrawMenu, RegisterMod); diff --git a/soh/soh/Enhancements/Holiday/ProxySaw.cpp b/soh/soh/Enhancements/Holiday/ProxySaw.cpp new file mode 100644 index 000000000..988ae28a9 --- /dev/null +++ b/soh/soh/Enhancements/Holiday/ProxySaw.cpp @@ -0,0 +1,231 @@ +#include "Holiday.hpp" +#include +#include "soh/UIWidgets.hpp" +#include "soh/Enhancements/game-interactor/GameInteractor.h" +#include "objects/object_dog/object_dog.h" +#include "soh/frame_interpolation.h" +#include "soh/Enhancements/randomizer/3drando/random.hpp" +#include "soh/Enhancements/randomizer/3drando/location_access.hpp" +#include "soh/Enhancements/randomizer/entrance.h" + +#include "objects/gameplay_field_keep/gameplay_field_keep.h" +#include "objects/object_md/object_md.h" +#include "src/overlays/actors/ovl_Door_Ana/z_door_ana.h" +extern "C" { +#include "macros.h" +#include "functions.h" +#include "variables.h" + +extern PlayState* gPlayState; +extern "C" s16 gEnSnowballId; +void DoorAna_SetupAction(DoorAna* doorAna, DoorAnaActionFunc actionFunc); +void DoorAna_GrabPlayer(DoorAna* doorAna, PlayState* play); +} + +#define AUTHOR "ProxySaw" +#define CVAR(v) "gHoliday." AUTHOR "." v + +static CollisionPoly snowballPoly; +static Vec3f snowballPos; +static f32 raycastResult; + +static u32 iceBlockParams[] = { + 0x214, + 0x1, + 0x11, + 0x10, + 0x20, +}; + +static void SpawnSnowballs() { + if (gPlayState->sceneNum != SCENE_HYRULE_FIELD && gPlayState->sceneNum != SCENE_KAKARIKO_VILLAGE) { + return; + } + + int actorsSpawned = 0; + + while (actorsSpawned < 30) { + snowballPos.x = (float)(Random( + (gPlayState->sceneNum == SCENE_HYRULE_FIELD ? -10000 : -2700) + 10000, + (gPlayState->sceneNum == SCENE_HYRULE_FIELD ? 5000 : 2000) + 10000 + ) - (float)10000.0f); + snowballPos.y = 5000; + snowballPos.z = (float)(Random( + (gPlayState->sceneNum == SCENE_HYRULE_FIELD ? -1000 : -2000) + 10000, + (gPlayState->sceneNum == SCENE_HYRULE_FIELD ? 15000 : 2000) + 10000 + ) - (float)10000.0f); + + raycastResult = BgCheck_AnyRaycastFloor1(&gPlayState->colCtx, &snowballPoly, &snowballPos); + + if (raycastResult > BGCHECK_Y_MIN) { + Actor_Spawn(&gPlayState->actorCtx, gPlayState, gEnSnowballId, snowballPos.x, raycastResult, + snowballPos.z, 0, 0, 0, gPlayState->sceneNum == SCENE_HYRULE_FIELD, 0); + actorsSpawned++; + } + } +} + +static void SpawnIcebergs() { + if (gPlayState->sceneNum != SCENE_LAKE_HYLIA) { + return; + } + + int actorsSpawned = 0; + + Vec3f spawnedIceBlockPos[15]; + + while (actorsSpawned < 15) { + Vec3f iceBlockPos; + iceBlockPos.x = (float)(Random( + (-4200) + 10000, + (3000) + 10000 + ) - (float)10000.0f); + iceBlockPos.y = -1713.0f; + iceBlockPos.z = (float)(Random( + (2600) + 10000, + (9000) + 10000 + ) - (float)10000.0f); + + raycastResult = BgCheck_AnyRaycastFloor1(&gPlayState->colCtx, &snowballPoly, &iceBlockPos); + + if (raycastResult > BGCHECK_Y_MIN) { + + bool overlaps = false; + for (int i = 0; i < actorsSpawned; i++) { + if (Math_Vec3f_DistXZ(&spawnedIceBlockPos[i], &iceBlockPos) < 500.0f) { + overlaps = true; + break; + } + } + + if (overlaps) { + continue; + } + + if (LINK_IS_ADULT && !Flags_GetEventChkInf(EVENTCHKINF_RAISED_LAKE_HYLIA_WATER)) { + iceBlockPos.y = raycastResult; + } else { + iceBlockPos.y = -1310.0f; + } + + Actor_Spawn(&gPlayState->actorCtx, gPlayState, ACTOR_BG_SPOT08_ICEBLOCK, iceBlockPos.x, iceBlockPos.y, + iceBlockPos.z, 0, (s16)Random(0, 0xFFFF), 0, RandomElement(iceBlockParams), 0); + spawnedIceBlockPos[actorsSpawned] = iceBlockPos; + actorsSpawned++; + } + } +} + +const s16 entrances[] = { + 0x0000, 0x0209, 0x0004, 0x0242, 0x0028, 0x0221, 0x0169, 0x0215, 0x0165, 0x024A, 0x0010, 0x021D, 0x0082, 0x01E1, 0x0037, 0x0205, + 0x0098, 0x02A6, 0x0088, 0x03D4, 0x0008, 0x03A8, 0x0467, 0x023D, 0x0433, 0x0443, 0x0437, 0x0447, 0x009C, 0x033C, 0x00C9, 0x026A, + 0x00C1, 0x0266, 0x0043, 0x03CC, 0x045F, 0x0309, 0x03A0, 0x03D0, 0x007E, 0x026E, 0x0530, 0x01D1, 0x0507, 0x03BC, 0x0388, 0x02A2, + 0x0063, 0x01D5, 0x0528, 0x03C0, 0x043B, 0x0067, 0x02FD, 0x0349, 0x0550, 0x04EE, 0x039C, 0x0345, 0x05C8, 0x05DC, 0x0072, 0x034D, + 0x030D, 0x0355, 0x037C, 0x03FC, 0x0380, 0x03C4, 0x004F, 0x0378, 0x02F9, 0x042F, 0x05D0, 0x05D4, 0x052C, 0x03B8, 0x016D, 0x01CD, + 0x00B7, 0x0201, 0x003B, 0x0463, 0x0588, 0x057C, 0x0578, 0x0340, 0x04C2, 0x03E8, 0x04BE, 0x0482, 0x0315, 0x045B, 0x0371, 0x0394, + 0x0272, 0x0211, 0x0053, 0x0472, 0x0453, 0x0351, 0x0384, 0x044B, 0x03EC, 0x04FF, 0x0700, 0x0800, 0x0701, 0x0801, 0x0702, 0x0802, + 0x0703, 0x0803, 0x0704, 0x0804, 0x0705, 0x0805, 0x0706, 0x0806, 0x0707, 0x0807, 0x0708, 0x0808, 0x0709, 0x0809, 0x070A, 0x080A, + 0x070B, 0x080B, 0x070C, 0x080C, 0x070D, 0x080D, 0x070E, 0x080E, 0x070F, 0x080F, 0x0710, 0x0711, 0x0811, 0x0712, 0x0812, + 0x0713, 0x0813, 0x0714, 0x0814, 0x0715, 0x0815, 0x0716, 0x0816, 0x0717, 0x0817, 0x0718, 0x0818, 0x0719, 0x0819, 0x081A, + 0x071B, 0x081B, 0x071C, 0x081C, 0x071D, 0x081D, 0x071E, 0x081E, 0x071F, 0x081F, 0x0720, 0x0820, 0x004B, 0x035D, 0x031C, 0x0361, + 0x002D, 0x050B, 0x044F, 0x0359, 0x05E0, 0x020D, 0x011E, 0x0286, 0x04E2, 0x04D6, 0x01DD, 0x04DA, 0x00FC, 0x01A9, 0x0185, 0x04DE, + 0x0102, 0x0189, 0x0117, 0x018D, 0x0276, 0x01FD, 0x00DB, 0x017D, 0x00EA, 0x0181, 0x0157, 0x01F9, 0x0328, 0x0560, 0x0129, 0x022D, + 0x0130, 0x03AC, 0x0123, 0x0365, 0x00B1, 0x0033, 0x0138, 0x025A, 0x0171, 0x025E, 0x00E4, 0x0195, 0x013D, 0x0191, 0x014D, 0x01B9, + 0x0246, 0x01C1, 0x0147, 0x01BD, 0x0108, 0x019D, 0x0225, 0x01A1, 0x0219, 0x027E, 0x0554, 0x00BB, 0x0282, 0x0600, 0x04F6, 0x0604, + 0x01F1, 0x0568, 0x05F4, 0x040F, 0x0252, 0x040B, 0x00C5, 0x0301, 0x0407, 0x000C, 0x024E, 0x0305, 0x0175, 0x0417, 0x0423, 0x008D, + 0x02F5, 0x0413, 0x02B2, 0x0457, 0x047A, 0x010E, 0x0608, 0x0564, 0x060C, 0x0610, 0x0580 +}; + +static void RandomGrotto_WaitOpen(DoorAna* doorAna, PlayState* play) { + Actor* actor = &doorAna->actor; + Player* player = GET_PLAYER(play); + if (Math_StepToF(&actor->scale.x, 0.01f, 0.001f)) { + if ((actor->targetMode != 0) && (play->transitionTrigger == TRANS_TRIGGER_OFF) && (player->stateFlags1 & PLAYER_STATE1_FLOOR_DISABLED) && (player->av1.actionVar1 == 0)) { + play->nextEntranceIndex = RandomElement(entrances); + DoorAna_SetupAction((DoorAna*)actor, DoorAna_GrabPlayer); + } else { + if (!Player_InCsMode(play) && !(player->stateFlags1 & (PLAYER_STATE1_ON_HORSE | PLAYER_STATE1_IN_WATER)) && + actor->xzDistToPlayer <= 15.0f && -50.0f <= actor->yDistToPlayer && + actor->yDistToPlayer <= 15.0f) { + player->stateFlags1 |= PLAYER_STATE1_FLOOR_DISABLED; + actor->targetMode = 1; + } else { + actor->targetMode = 0; + } + } + } + Actor_SetScale(actor, actor->scale.x); +} + +static void SpawnRandomGrotto() { + Vec3f pos; + pos.y = 9999.0f; + int spawnAttempts = 0; + while (spawnAttempts < 50) { + if (GET_PLAYER(gPlayState) != nullptr) { + pos.x = GET_PLAYER(gPlayState)->actor.world.pos.x; + pos.z = GET_PLAYER(gPlayState)->actor.world.pos.z; + } else { + pos.x = 0; + pos.z = 0; + } + // X/Z anywhere from -1000.0 to +1000.0 from player + pos.x += (float)(Random(0, 2000)) - 1000.0f; + pos.z += (float)(Random(0, 2000)) - 1000.0f; + + raycastResult = BgCheck_AnyRaycastFloor1(&gPlayState->colCtx, &snowballPoly, &pos); + + if (raycastResult > BGCHECK_Y_MIN) { + Actor* grotto = Actor_Spawn(&gPlayState->actorCtx, gPlayState, ACTOR_DOOR_ANA, pos.x, raycastResult, pos.z, 0, 0, 0, 0, false); + DoorAna_SetupAction((DoorAna*)grotto, RandomGrotto_WaitOpen); + break; + } + + spawnAttempts++; + } + +} + +static void ConfigurationChanged() { + COND_HOOK(OnSceneSpawnActors, CVarGetInteger(CVAR("Snowballs"), 0), SpawnSnowballs); + COND_HOOK(OnPlayerUpdate, CVarGetInteger(CVAR("SuperBonk"), 0), []() { + Player* player = GET_PLAYER(gPlayState); + if (player->actor.bgCheckFlags & 0x08 && ABS(player->linearVelocity) > 15.0f) { + player->yaw = ((player->actor.wallYaw - player->yaw) + player->actor.wallYaw) - 0x8000; + Player_PlaySfx(&player->actor, NA_SE_PL_BODY_HIT); + } + }); + + COND_HOOK(OnPlayerBonk, CVarGetInteger(CVAR("SuperBonk"), 0), []() { + Player* player = GET_PLAYER(gPlayState); + + player->linearVelocity = -100.0f; + }); + COND_HOOK(OnSceneSpawnActors, CVarGetInteger(CVAR("Icebergs"), 0), SpawnIcebergs); + COND_HOOK(OnSceneSpawnActors, CVarGetInteger(CVAR("DownTheRabbitHole"), 0), SpawnRandomGrotto); +} + +static void DrawMenu() { + ImGui::SeparatorText(AUTHOR); + + if (UIWidgets::EnhancementCheckbox("Snowballs", CVAR("Snowballs"))) { + ConfigurationChanged(); + } + if (UIWidgets::EnhancementCheckbox("Lake Hylia Icebergs", CVAR("Icebergs"))) { + ConfigurationChanged(); + } + if (UIWidgets::EnhancementCheckbox("Down the Rabbit Hole", CVAR("DownTheRabbitHole"))) { + ConfigurationChanged(); + } + if (UIWidgets::EnhancementCheckbox("Super Bonk", CVAR("SuperBonk"))) { + ConfigurationChanged(); + } +} + +static void RegisterMod() { + // #region Leave this alone unless you know what you are doing + ConfigurationChanged(); + // #endregion +} + +static Holiday holiday(DrawMenu, RegisterMod); diff --git a/soh/soh/Enhancements/custom-message/CustomMessageManager.cpp b/soh/soh/Enhancements/custom-message/CustomMessageManager.cpp index c24b83fb6..477cb765e 100644 --- a/soh/soh/Enhancements/custom-message/CustomMessageManager.cpp +++ b/soh/soh/Enhancements/custom-message/CustomMessageManager.cpp @@ -7,6 +7,12 @@ #include #include +#include "soh/util.h" + +extern "C" { + PlayState* gPlayState; +} + using namespace std::literals::string_literals; static const std::unordered_map textBoxSpecialCharacters = { @@ -177,6 +183,15 @@ const TextBoxPosition& CustomMessage::GetTextBoxPosition() const { return position; } +void CustomMessage::LoadIntoFont() { + MessageContext* msgCtx = &gPlayState->msgCtx; + Font* font = &msgCtx->font; + char* buffer = font->msgBuf; + const int maxBufferSize = sizeof(font->msgBuf); + font->charTexBuf[0] = (type << 4) | position; + msgCtx->msgLength = font->msgLength = SohUtils::CopyStringToCharBuffer(GetEnglish(MF_RAW), buffer, maxBufferSize); +} + CustomMessage CustomMessage::operator+(const CustomMessage& right) const { std::vector newColors = colors; std::vector rColors = right.GetColors(); diff --git a/soh/soh/Enhancements/custom-message/CustomMessageManager.h b/soh/soh/Enhancements/custom-message/CustomMessageManager.h index 130feda73..ef9ecd725 100644 --- a/soh/soh/Enhancements/custom-message/CustomMessageManager.h +++ b/soh/soh/Enhancements/custom-message/CustomMessageManager.h @@ -69,6 +69,9 @@ class CustomMessage { void SetTextBoxType(TextBoxType boxType); const TextBoxPosition& GetTextBoxPosition() const; + // To only be used with OnOpenText hook + void LoadIntoFont(); + CustomMessage operator+(const CustomMessage& right) const; CustomMessage operator+(const std::string& right) const; void operator+=(const std::string& right); diff --git a/soh/soh/Enhancements/game-interactor/GameInteractor.h b/soh/soh/Enhancements/game-interactor/GameInteractor.h index 1667cda00..1ffea910e 100644 --- a/soh/soh/Enhancements/game-interactor/GameInteractor.h +++ b/soh/soh/Enhancements/game-interactor/GameInteractor.h @@ -571,6 +571,33 @@ struct HookInfo { body; \ va_end(args); \ }) +#define COND_HOOK(hookType, condition, body) \ + { \ + static HOOK_ID hookId = 0; \ + GameInteractor::Instance->UnregisterGameHook(hookId); \ + hookId = 0; \ + if (condition) { \ + hookId = GameInteractor::Instance->RegisterGameHook(body); \ + } \ + } +#define COND_ID_HOOK(hookType, id, condition, body) \ + { \ + static HOOK_ID hookId = 0; \ + GameInteractor::Instance->UnregisterGameHookForID(hookId); \ + hookId = 0; \ + if (condition) { \ + hookId = GameInteractor::Instance->RegisterGameHookForID(id, body); \ + } \ + } +#define COND_VB_SHOULD(id, condition, body) \ + { \ + static HOOK_ID hookId = 0; \ + GameInteractor::Instance->UnregisterGameHookForID(hookId); \ + hookId = 0; \ + if (condition) { \ + hookId = REGISTER_VB_SHOULD(id, body); \ + } \ + } class GameInteractor { public: diff --git a/soh/soh/Enhancements/game-interactor/GameInteractor_HookTable.h b/soh/soh/Enhancements/game-interactor/GameInteractor_HookTable.h index a2d5c56ec..06ef7cc21 100644 --- a/soh/soh/Enhancements/game-interactor/GameInteractor_HookTable.h +++ b/soh/soh/Enhancements/game-interactor/GameInteractor_HookTable.h @@ -20,6 +20,7 @@ DEFINE_HOOK(OnSceneSpawnActors, ()); DEFINE_HOOK(OnPlayerUpdate, ()); DEFINE_HOOK(OnOcarinaSongAction, ()); DEFINE_HOOK(OnShopSlotChange, (uint8_t cursorIndex, int16_t price)); +DEFINE_HOOK(ShouldActorInit, (void* actor, bool* result)); DEFINE_HOOK(OnActorInit, (void* actor)); DEFINE_HOOK(OnActorUpdate, (void* actor)); DEFINE_HOOK(OnActorKill, (void* actor)); @@ -31,6 +32,7 @@ DEFINE_HOOK(OnPlayerHealthChange, (int16_t amount)); DEFINE_HOOK(OnPlayerBottleUpdate, (int16_t contents)); DEFINE_HOOK(OnPlayDestroy, ()); DEFINE_HOOK(OnPlayDrawEnd, ()); +DEFINE_HOOK(OnOpenText, (u16 * textId, bool* loadFromMessageTable)); DEFINE_HOOK(OnVanillaBehavior, (GIVanillaBehavior flag, bool* result, va_list originalArgs)); DEFINE_HOOK(OnSaveFile, (int32_t fileNum)); DEFINE_HOOK(OnLoadFile, (int32_t fileNum)); diff --git a/soh/soh/Enhancements/game-interactor/GameInteractor_Hooks.cpp b/soh/soh/Enhancements/game-interactor/GameInteractor_Hooks.cpp index 39fc298a8..a2235f7f0 100644 --- a/soh/soh/Enhancements/game-interactor/GameInteractor_Hooks.cpp +++ b/soh/soh/Enhancements/game-interactor/GameInteractor_Hooks.cpp @@ -79,6 +79,15 @@ void GameInteractor_ExecuteOnActorInit(void* actor) { GameInteractor::Instance->ExecuteHooksForFilter(actor); } +bool GameInteractor_ShouldActorInit(void* actor) { + bool result = true; + GameInteractor::Instance->ExecuteHooks(actor, &result); + GameInteractor::Instance->ExecuteHooksForID(((Actor*)actor)->id, actor, &result); + GameInteractor::Instance->ExecuteHooksForPtr((uintptr_t)actor, actor, &result); + GameInteractor::Instance->ExecuteHooksForFilter(actor, &result); + return result; +} + void GameInteractor_ExecuteOnActorUpdate(void* actor) { GameInteractor::Instance->ExecuteHooks(actor); GameInteractor::Instance->ExecuteHooksForID(((Actor*)actor)->id, actor); @@ -131,6 +140,12 @@ void GameInteractor_ExecuteOnPlayDrawEnd() { GameInteractor::Instance->ExecuteHooks(); } +void GameInteractor_ExecuteOnOpenText(u16* textId, bool* loadFromMessageTable) { + GameInteractor::Instance->ExecuteHooks(textId, loadFromMessageTable); + GameInteractor::Instance->ExecuteHooksForID(*textId, textId, loadFromMessageTable); + GameInteractor::Instance->ExecuteHooksForFilter(textId, loadFromMessageTable); +} + bool GameInteractor_Should(GIVanillaBehavior flag, u32 result, ...) { // Only the external function can use the Variadic Function syntax // To pass the va args to the next caller must be done using va_list and reading the args into it diff --git a/soh/soh/Enhancements/game-interactor/GameInteractor_Hooks.h b/soh/soh/Enhancements/game-interactor/GameInteractor_Hooks.h index 3438d269d..60326614d 100644 --- a/soh/soh/Enhancements/game-interactor/GameInteractor_Hooks.h +++ b/soh/soh/Enhancements/game-interactor/GameInteractor_Hooks.h @@ -19,6 +19,7 @@ void GameInteractor_ExecuteOnFlagUnset(int16_t flagType, int16_t flag); void GameInteractor_ExecuteOnSceneSpawnActors(); void GameInteractor_ExecuteOnPlayerUpdate(); void GameInteractor_ExecuteOnOcarinaSongAction(); +bool GameInteractor_ShouldActorInit(void* actor); void GameInteractor_ExecuteOnActorInit(void* actor); void GameInteractor_ExecuteOnActorUpdate(void* actor); void GameInteractor_ExecuteOnActorKill(void* actor); @@ -32,6 +33,7 @@ void GameInteractor_ExecuteOnOcarinaSongAction(); void GameInteractor_ExecuteOnShopSlotChangeHooks(uint8_t cursorIndex, int16_t price); void GameInteractor_ExecuteOnPlayDestroy(); void GameInteractor_ExecuteOnPlayDrawEnd(); +void GameInteractor_ExecuteOnOpenText(u16* textId, bool* loadFromMessageTable); bool GameInteractor_Should(GIVanillaBehavior flag, uint32_t result, ...); // MARK: - Save Files diff --git a/soh/soh/Enhancements/mods.cpp b/soh/soh/Enhancements/mods.cpp index 5059d9b83..2e943b37f 100644 --- a/soh/soh/Enhancements/mods.cpp +++ b/soh/soh/Enhancements/mods.cpp @@ -13,6 +13,7 @@ #include "soh/Enhancements/TimeSavers/TimeSavers.h" #include "soh/Enhancements/cheat_hook_handlers.h" #include "soh/Enhancements/randomizer/hook_handlers.h" +#include "soh/Enhancements/Holiday/Holiday.hpp" #include "objects/object_gi_compass/object_gi_compass.h" #include "src/overlays/actors/ovl_En_Bb/z_en_bb.h" @@ -1413,99 +1414,6 @@ void RegisterRandomizerCompasses() { }); } -static CollisionPoly snowballPoly; -static Vec3f snowballPos; -static f32 raycastResult; - -static u32 iceBlockParams[] = { - 0x214, - 0x1, - 0x11, - 0x10, - 0x20, -}; - -void RegisterSnowballs() { - GameInteractor::Instance->RegisterGameHook([]() { - if (gPlayState->sceneNum != SCENE_HYRULE_FIELD && gPlayState->sceneNum != SCENE_KAKARIKO_VILLAGE) { - return; - } - - int actorsSpawned = 0; - - while (actorsSpawned < 30) { - snowballPos.x = (float)(Random( - (gPlayState->sceneNum == SCENE_HYRULE_FIELD ? -10000 : -2700) + 10000, - (gPlayState->sceneNum == SCENE_HYRULE_FIELD ? 5000 : 2000) + 10000 - ) - (float)10000.0f); - snowballPos.y = 5000; - snowballPos.z = (float)(Random( - (gPlayState->sceneNum == SCENE_HYRULE_FIELD ? -1000 : -2000) + 10000, - (gPlayState->sceneNum == SCENE_HYRULE_FIELD ? 15000 : 2000) + 10000 - ) - (float)10000.0f); - - raycastResult = BgCheck_AnyRaycastFloor1(&gPlayState->colCtx, &snowballPoly, &snowballPos); - - if (raycastResult > BGCHECK_Y_MIN) { - Actor_Spawn(&gPlayState->actorCtx, gPlayState, gEnSnowballId, snowballPos.x, raycastResult, - snowballPos.z, 0, 0, 0, gPlayState->sceneNum == SCENE_HYRULE_FIELD, 0); - actorsSpawned++; - } - } - }); - - GameInteractor::Instance->RegisterGameHook([]() { - if (gPlayState->sceneNum != SCENE_LAKE_HYLIA) { - return; - } - - int actorsSpawned = 0; - - Vec3f spawnedIceBlockPos[15]; - - while (actorsSpawned < 15) { - Vec3f iceBlockPos; - iceBlockPos.x = (float)(Random( - (-4200) + 10000, - (3000) + 10000 - ) - (float)10000.0f); - iceBlockPos.y = -1713.0f; - iceBlockPos.z = (float)(Random( - (2600) + 10000, - (9000) + 10000 - ) - (float)10000.0f); - - raycastResult = BgCheck_AnyRaycastFloor1(&gPlayState->colCtx, &snowballPoly, &iceBlockPos); - - if (raycastResult > BGCHECK_Y_MIN) { - - bool overlaps = false; - for (int i = 0; i < actorsSpawned; i++) { - if (Math_Vec3f_DistXZ(&spawnedIceBlockPos[i], &iceBlockPos) < 500.0f) { - overlaps = true; - break; - } - } - - if (overlaps) { - continue; - } - - if (LINK_IS_ADULT && !Flags_GetEventChkInf(EVENTCHKINF_RAISED_LAKE_HYLIA_WATER)) { - iceBlockPos.y = raycastResult; - } else { - iceBlockPos.y = -1310.0f; - } - - Actor_Spawn(&gPlayState->actorCtx, gPlayState, ACTOR_BG_SPOT08_ICEBLOCK, iceBlockPos.x, iceBlockPos.y, - iceBlockPos.z, 0, (s16)Random(0, 0xFFFF), 0, RandomElement(iceBlockParams), 0); - spawnedIceBlockPos[actorsSpawned] = iceBlockPos; - actorsSpawned++; - } - } - }); -} - void InitMods() { BossRush_RegisterHooks(); RandomizerRegisterHooks(); @@ -1544,11 +1452,11 @@ void InitMods() { RegisterOpenAllHours(); RegisterToTMedallions(); RegisterRandomizerCompasses(); - RegisterSnowballs(); NameTag_RegisterHooks(); RegisterFloorSwitchesHook(); RegisterPatchHandHandler(); RegisterHurtContainerModeHandler(); RegisterPauseMenuHooks(); RandoKaleido_RegisterHooks(); + RegisterHoliday(); } diff --git a/soh/soh/Enhancements/timesaver_hook_handlers.cpp b/soh/soh/Enhancements/timesaver_hook_handlers.cpp index 3e1bc9de1..e5ddf73e7 100644 --- a/soh/soh/Enhancements/timesaver_hook_handlers.cpp +++ b/soh/soh/Enhancements/timesaver_hook_handlers.cpp @@ -892,7 +892,7 @@ void TimeSaverOnSceneInitHandler(int16_t sceneNum) { } } -static GetItemEntry vanillaQueuedItemEntry = GET_ITEM_NONE; +GetItemEntry vanillaQueuedItemEntry = GET_ITEM_NONE; void TimeSaverOnFlagSetHandler(int16_t flagType, int16_t flag) { if (!CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.Story"), IS_RANDO)) return; @@ -1063,11 +1063,11 @@ void TimeSaverRegisterHooks() { onVanillaBehaviorHook = GameInteractor::Instance->RegisterGameHook(TimeSaverOnVanillaBehaviorHandler); onActorInitHook = GameInteractor::Instance->RegisterGameHook(TimeSaverOnActorInitHandler); onGameFrameUpdate = GameInteractor::Instance->RegisterGameHook(TimeSaverOnGameFrameUpdateHandler); + onPlayerUpdateHook = GameInteractor::Instance->RegisterGameHook(TimeSaverOnPlayerUpdateHandler); + onItemReceiveHook = GameInteractor::Instance->RegisterGameHook(TimeSaverOnItemReceiveHandler); if (IS_RANDO) return; onFlagSetHook = GameInteractor::Instance->RegisterGameHook(TimeSaverOnFlagSetHandler); - onPlayerUpdateHook = GameInteractor::Instance->RegisterGameHook(TimeSaverOnPlayerUpdateHandler); - onItemReceiveHook = GameInteractor::Instance->RegisterGameHook(TimeSaverOnItemReceiveHandler); }); } diff --git a/soh/soh/SohMenuBar.cpp b/soh/soh/SohMenuBar.cpp index bec69cceb..01f54b276 100644 --- a/soh/soh/SohMenuBar.cpp +++ b/soh/soh/SohMenuBar.cpp @@ -41,6 +41,7 @@ #include "Enhancements/resolution-editor/ResolutionEditor.h" #include "Enhancements/enemyrandomizer.h" #include "Enhancements/timesplits/TimeSplits.h" +#include "Enhancements/Holiday/Holiday.hpp" // FA icons are kind of wonky, if they worked how I expected them to the "+ 2.0f" wouldn't be needed, but // they don't work how I expect them to so I added that because it looked good when I eyeballed it @@ -2256,6 +2257,10 @@ void SohMenuBar::DrawElement() { DrawRandomizerMenu(); + ImGui::SetCursorPosY(0.0f); + + DrawHolidayMenu(); + ImGui::PopStyleVar(1); ImGui::EndMenuBar(); } diff --git a/soh/soh/util.cpp b/soh/soh/util.cpp index faa171231..297e63db3 100644 --- a/soh/soh/util.cpp +++ b/soh/soh/util.cpp @@ -391,6 +391,19 @@ size_t SohUtils::CopyStringToCharBuffer(char* buffer, const std::string& source, return 0; } +int SohUtils::CopyStringToCharBuffer(const std::string& inputStr, char* buffer, const int maxBufferSize) { + if (!inputStr.empty()) { + // Prevent potential horrible overflow due to implicit conversion of maxBufferSize to an unsigned. Prevents negatives. + memset(buffer, 0, std::max(0, maxBufferSize)); + // Gaurentee that this value will be greater than 0, regardless of passed variables. + const int copiedCharLen = std::min(std::max(0, maxBufferSize - 1), inputStr.length()); + memcpy(buffer, inputStr.c_str(), copiedCharLen); + return copiedCharLen; + } + + return 0; +} + bool SohUtils::IsStringEmpty(std::string str) { // Remove spaces at the beginning of the string std::string::size_type start = str.find_first_not_of(' '); diff --git a/soh/soh/util.h b/soh/soh/util.h index a37279a18..a566a5382 100644 --- a/soh/soh/util.h +++ b/soh/soh/util.h @@ -20,6 +20,7 @@ namespace SohUtils { // Copies a string into a char buffer up to maxBufferSize characters. This does NOT insert a null terminator // on the end, as this is used for in-game messages which are not null-terminated. size_t CopyStringToCharBuffer(char* buffer, const std::string& source, size_t maxBufferSize); + int CopyStringToCharBuffer(const std::string& inputStr, char* buffer, const int maxBufferSize); bool IsStringEmpty(std::string str); } // namespace SohUtils diff --git a/soh/src/code/z_actor.c b/soh/src/code/z_actor.c index dccb4d9bf..165ff4c47 100644 --- a/soh/src/code/z_actor.c +++ b/soh/src/code/z_actor.c @@ -1232,14 +1232,19 @@ void Actor_Init(Actor* actor, PlayState* play) { ActorShape_Init(&actor->shape, 0.0f, NULL, 0.0f); if (Object_IsLoaded(&play->objectCtx, actor->objBankIndex)) { Actor_SetObjectDependency(play, actor); - actor->init(actor, play); - actor->init = NULL; + if (GameInteractor_ShouldActorInit(actor)) { + actor->init(actor, play); + actor->init = NULL; - GameInteractor_ExecuteOnActorInit(actor); + GameInteractor_ExecuteOnActorInit(actor); - // For enemy health bar we need to know the max health during init - if (actor->category == ACTORCAT_ENEMY) { - actor->maximumHealth = actor->colChkInfo.health; + // For enemy health bar we need to know the max health during init + if (actor->category == ACTORCAT_ENEMY) { + actor->maximumHealth = actor->colChkInfo.health; + } + } else { + actor->init = NULL; + Actor_Kill(actor); } } } @@ -2577,14 +2582,19 @@ void Actor_UpdateAll(PlayState* play, ActorContext* actorCtx) { if (Object_IsLoaded(&play->objectCtx, actor->objBankIndex)) { Actor_SetObjectDependency(play, actor); - actor->init(actor, play); - actor->init = NULL; + if (GameInteractor_ShouldActorInit(actor)) { + actor->init(actor, play); + actor->init = NULL; - GameInteractor_ExecuteOnActorInit(actor); + GameInteractor_ExecuteOnActorInit(actor); - // For enemy health bar we need to know the max health during init - if (actor->category == ACTORCAT_ENEMY) { - actor->maximumHealth = actor->colChkInfo.health; + // For enemy health bar we need to know the max health during init + if (actor->category == ACTORCAT_ENEMY) { + actor->maximumHealth = actor->colChkInfo.health; + } + } else { + actor->init = NULL; + Actor_Kill(actor); } } actor = actor->next; diff --git a/soh/src/code/z_message_PAL.c b/soh/src/code/z_message_PAL.c index 53b2bb943..a53626ed9 100644 --- a/soh/src/code/z_message_PAL.c +++ b/soh/src/code/z_message_PAL.c @@ -1594,6 +1594,9 @@ void Message_OpenText(PlayState* play, u16 textId) { Font* font = &msgCtx->font; s16 textBoxType; + bool loadFromMessageTable = true; + GameInteractor_ExecuteOnOpenText(&textId, &loadFromMessageTable); + if (msgCtx->msgMode == MSGMODE_NONE) { gSaveContext.unk_13EE = gSaveContext.unk_13EA; } @@ -1652,7 +1655,9 @@ void Message_OpenText(PlayState* play, u16 textId) { } // RANDOTODO: Use this for ice trap messages - if (CustomMessage_RetrieveIfExists(play)) { + if (!loadFromMessageTable) { + // no-op + } else if (CustomMessage_RetrieveIfExists(play)) { osSyncPrintf("Found custom message"); } else if (sTextIsCredits) { Message_FindCreditsMessage(play, textId); diff --git a/soh/src/overlays/actors/ovl_Door_Ana/z_door_ana.c b/soh/src/overlays/actors/ovl_Door_Ana/z_door_ana.c index ef2134f6e..8471b2303 100644 --- a/soh/src/overlays/actors/ovl_Door_Ana/z_door_ana.c +++ b/soh/src/overlays/actors/ovl_Door_Ana/z_door_ana.c @@ -179,7 +179,7 @@ void DoorAna_Update(Actor* thisx, PlayState* play) { this->actionFunc(this, play); // Changes the grottos facing angle based on camera angle - if (!CVarGetInteger(CVAR_ENHANCEMENT("DisableGrottoRotation"), 0)) { + if (!CVarGetInteger(CVAR_ENHANCEMENT("DisableGrottoRotation"), 0) && thisx->draw == DoorAna_Draw) { this->actor.shape.rot.y = Camera_GetCamDirYaw(GET_ACTIVE_CAM(play)) + 0x8000; } } diff --git a/soh/src/overlays/actors/ovl_En_Clear_Tag/z_en_clear_tag.c b/soh/src/overlays/actors/ovl_En_Clear_Tag/z_en_clear_tag.c index c19f43dc3..7b381ef1c 100644 --- a/soh/src/overlays/actors/ovl_En_Clear_Tag/z_en_clear_tag.c +++ b/soh/src/overlays/actors/ovl_En_Clear_Tag/z_en_clear_tag.c @@ -244,15 +244,22 @@ void EnClearTag_Init(Actor* thisx, PlayState* play) { if (this->actor.params == CLEAR_TAG_LASER) { this->state = CLEAR_TAG_STATE_LASER; this->timers[CLEAR_TAG_TIMER_LASER_DEATH] = 70; - this->actor.speedXZ = 35.0f; - func_8002D908(&this->actor); - for (j = 0; j <= 0; j++) { - func_8002D7EC(&this->actor); + if (CVarGetInteger("gHoliday.AGreenSpoon.EvilGossipStone", 0)) { + this->actor.scale.x = 0.4f; + this->actor.scale.y = 0.4f; + this->actor.scale.z = 2.0f; + this->actor.speedXZ = MAX(10.0f, Actor_WorldDistXZToActor(thisx, &GET_PLAYER(gPlayState)->actor) * 0.33f); + } else { + this->actor.speedXZ = 35.0f; + func_8002D908(&this->actor); + for (j = 0; j <= 0; j++) { + func_8002D7EC(&this->actor); + } + this->actor.scale.x = 0.4f; + this->actor.scale.y = 0.4f; + this->actor.scale.z = 2.0f; + this->actor.speedXZ = 70.0f; } - this->actor.scale.x = 0.4f; - this->actor.scale.y = 0.4f; - this->actor.scale.z = 2.0f; - this->actor.speedXZ = 70.0f; this->actor.shape.rot.x = -this->actor.shape.rot.x; func_8002D908(&this->actor); @@ -570,12 +577,21 @@ void EnClearTag_Update(Actor* thisx, PlayState* play2) { } // Set laser collider properties. - this->collider.dim.radius = 23; - this->collider.dim.height = 25; - this->collider.dim.yShift = -10; - Collider_UpdateCylinder(&this->actor, &this->collider); - CollisionCheck_SetAT(play, &play->colChkCtx, &this->collider.base); - Actor_UpdateBgCheckInfo(play, &this->actor, 50.0f, 80.0f, 100.0f, 5); + if (CVarGetInteger("gHoliday.AGreenSpoon.EvilGossipStone", 0)) { + this->collider.dim.radius = 10; + this->collider.dim.height = 25; + this->collider.dim.yShift = -10; + Collider_UpdateCylinder(&this->actor, &this->collider); + CollisionCheck_SetAT(play, &play->colChkCtx, &this->collider.base); + Actor_UpdateBgCheckInfo(play, &this->actor, 10.0f, 10.0f, 10.0f, 5); + } else { + this->collider.dim.radius = 23; + this->collider.dim.height = 25; + this->collider.dim.yShift = -10; + Collider_UpdateCylinder(&this->actor, &this->collider); + CollisionCheck_SetAT(play, &play->colChkCtx, &this->collider.base); + Actor_UpdateBgCheckInfo(play, &this->actor, 50.0f, 80.0f, 100.0f, 5); + } // Check if the laser has hit a target, timed out, or hit the ground. if (this->actor.bgCheckFlags & 9 || hasAtHit || this->timers[CLEAR_TAG_TIMER_LASER_DEATH] == 0) { diff --git a/soh/src/overlays/actors/ovl_En_Nutsball/z_en_nutsball.c b/soh/src/overlays/actors/ovl_En_Nutsball/z_en_nutsball.c index 2a37c90f6..2816c50d2 100644 --- a/soh/src/overlays/actors/ovl_En_Nutsball/z_en_nutsball.c +++ b/soh/src/overlays/actors/ovl_En_Nutsball/z_en_nutsball.c @@ -78,7 +78,7 @@ void EnNutsball_Init(Actor* thisx, PlayState* play) { ActorShape_Init(&this->actor.shape, 400.0f, ActorShadow_DrawCircle, 13.0f); Collider_InitCylinder(play, &this->collider); Collider_SetCylinder(play, &this->collider, &this->actor, &sCylinderInit); - if (CVarGetInteger(CVAR_ENHANCEMENT("RandomizedEnemies"), 0)) { + if (CVarGetInteger(CVAR_ENHANCEMENT("RandomizedEnemies"), 0) || CVarGetInteger("gLetItSnow", 0)) { this->objBankIndex = 0; } else { this->objBankIndex = Object_GetIndex(&play->objectCtx, sObjectIDs[this->actor.params]); From 8d4adb0f50554c8bb835b12a4823f6d060e31afa Mon Sep 17 00:00:00 2001 From: Garrett Cox Date: Fri, 1 Nov 2024 10:46:28 -0500 Subject: [PATCH 03/18] Fix build issue (#4504) --- soh/soh/Enhancements/Holiday/Fredomato.cpp | 3 +-- soh/soh/Enhancements/custom-message/CustomMessageManager.cpp | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/soh/soh/Enhancements/Holiday/Fredomato.cpp b/soh/soh/Enhancements/Holiday/Fredomato.cpp index 5ac148c2d..bb01ea991 100644 --- a/soh/soh/Enhancements/Holiday/Fredomato.cpp +++ b/soh/soh/Enhancements/Holiday/Fredomato.cpp @@ -92,8 +92,7 @@ static void RandomGrotto_Draw(Actor* actor, PlayState* play) { OPEN_DISPS(play->state.gfxCtx); Gfx_SetupDL_25Xlu(play->state.gfxCtx); - gSPMatrix(POLY_XLU_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), - G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx, (char*)__FILE__, __LINE__), G_MTX_MODELVIEW | G_MTX_LOAD); gSPDisplayList(POLY_XLU_DISP++, (Gfx*)gGrottoDL); Matrix_Translate(0.0f, -2700.0f, 0.0f, MTXMODE_APPLY); diff --git a/soh/soh/Enhancements/custom-message/CustomMessageManager.cpp b/soh/soh/Enhancements/custom-message/CustomMessageManager.cpp index 477cb765e..c165a1364 100644 --- a/soh/soh/Enhancements/custom-message/CustomMessageManager.cpp +++ b/soh/soh/Enhancements/custom-message/CustomMessageManager.cpp @@ -10,7 +10,7 @@ #include "soh/util.h" extern "C" { - PlayState* gPlayState; +extern PlayState* gPlayState; } using namespace std::literals::string_literals; From 5c98cdacde94f01be48152265fc9c8185c5a3312 Mon Sep 17 00:00:00 2001 From: Garrett Cox Date: Sat, 2 Nov 2024 11:38:17 -0500 Subject: [PATCH 04/18] Add ganon dating sim PoC (#4510) --- soh/soh/Enhancements/Holiday/NotProxySaw.cpp | 146 ++++++++++++++++++ .../game-interactor/GameInteractor.h | 3 +- .../actors/ovl_Boss_Ganon/z_boss_ganon.c | 5 +- 3 files changed, 152 insertions(+), 2 deletions(-) create mode 100644 soh/soh/Enhancements/Holiday/NotProxySaw.cpp diff --git a/soh/soh/Enhancements/Holiday/NotProxySaw.cpp b/soh/soh/Enhancements/Holiday/NotProxySaw.cpp new file mode 100644 index 000000000..b6cf85091 --- /dev/null +++ b/soh/soh/Enhancements/Holiday/NotProxySaw.cpp @@ -0,0 +1,146 @@ +#include "Holiday.hpp" +#include +#include "soh/UIWidgets.hpp" +#include "soh/Enhancements/game-interactor/GameInteractor.h" +#include "soh/Enhancements/custom-message/CustomMessageManager.h" +#include "include/message_data_fmt.h" + +extern "C" { +#include "macros.h" +#include "functions.h" +#include "variables.h" +extern PlayState* gPlayState; +} + +#define AUTHOR "NotProxySaw" +#define CVAR(v) "gHoliday." AUTHOR "." v + +int dialogIndex = 0; +int affection = 0; +int TARGET_AFFECTION = 10; +struct DialogOption { + std::string text; + int affectionChange; + int nextDialogIndex; +}; +struct Dialog { + std::string ganonText; + std::vector options; +}; + +const std::vector dialogs = { + { // 0 + "Think you can defeat me? Foolish!", + { + {"You're lonely. You don't have to be.", 3, 1}, + {"I'm here to end this... peacefully.", 1, 2}, + {"I respect a man with ambition.", -1, 3}, + } + }, + { // 1 + "Lonely? Power's my only ally.", + { + {"There's more to you than that.", 3, 4}, + {"I get it more than you think.", 5, 4}, + {"Why not let someone in?", 2, 4}, + } + }, + { // 2 + "Peace? It's meaningless here.", + { + {"Maybe you've forgotten peace.", 2, 4}, + {"Power isn't everything.", 4, 4}, + {"Ally, not enemy.. that's my goal.", 1, 4}, + } + }, + { // 3 + "Respect? From you?", + { + {"We're not so different.", 3, 4}, + {"Maybe I admire your strength.", 5, 4}, + {"True power must be earned.", -1, 4}, + } + }, + { // 4 + "You're... different than I thought.", + { + {"Together, we'd be unstoppable.", 5, 5}, + {"Power won't bring fulfillment.", 3, 5}, + {"Let's change the world.", 4, 5}, + } + }, + { // 5 + "What if I trusted you with power?", + { + {"I'll protect it. And you.", 10, -1}, + {"Together, we're unstoppable.", 5, -1}, + {"Our way. Our history.", -3, -1}, + } + } +}; + +static void ConfigurationChanged() { + COND_ID_HOOK(OnActorInit, ACTOR_BOSS_GANON, CVarGetInteger(CVAR("GanonDatingSim"), 0), [](void* actorRef) { + dialogIndex = 0; + affection = 0; + }); + + COND_VB_SHOULD(VB_GANONDORF_DECIDE_TO_FIGHT, CVarGetInteger(CVAR("GanonDatingSim"), 0), { + MessageContext* msgCtx = &gPlayState->msgCtx; + + if (dialogIndex == -1) { + if (affection >= TARGET_AFFECTION) { + gPlayState->nextEntranceIndex = ENTR_CHAMBER_OF_THE_SAGES_0; + gSaveContext.nextCutsceneIndex = 0xFFF2; + gPlayState->transitionTrigger = TRANS_TRIGGER_START; + gPlayState->transitionType = TRANS_TYPE_FADE_WHITE; + GameInteractor::State::TriforceHuntCreditsWarpActive = 0; + *should = false; + return; + } + return; + } + + affection += dialogs[dialogIndex].options[msgCtx->choiceIndex].affectionChange; + dialogIndex = dialogs[dialogIndex].options[msgCtx->choiceIndex].nextDialogIndex; + + *should = false; + Message_StartTextbox(gPlayState, 0x70CB, NULL); + }); + + COND_ID_HOOK(OnOpenText, 0x70CB, CVarGetInteger(CVAR("GanonDatingSim"), 0), [](u16 * textId, bool* loadFromMessageTable) { + std::string message; + if (dialogIndex == -1) { + if (affection >= TARGET_AFFECTION) { + message = "I've never felt this way before...\x01Take my power, Link. I trust you."; + } else { + message = "Liar! You're just like the rest of\x01them! Now I must destroy you!"; + } + } else { + message = dialogs[dialogIndex].ganonText + "\x01\x1C" + + dialogs[dialogIndex].options[0].text + "\x01" + + dialogs[dialogIndex].options[1].text + "\x01" + + dialogs[dialogIndex].options[2].text; + } + + auto messageEntry = CustomMessage(message); + messageEntry.Format(); + messageEntry.LoadIntoFont(); + *loadFromMessageTable = false; + }); +} + +static void DrawMenu() { + ImGui::SeparatorText(AUTHOR); + if (UIWidgets::EnhancementCheckbox("Ganon Dating Sim", CVAR("GanonDatingSim"))) { + ConfigurationChanged(); + } +} + +static void RegisterMod() { + // #region Leave this alone unless you know what you are doing + ConfigurationChanged(); + // #endregion +} + +static Holiday holiday(DrawMenu, RegisterMod); diff --git a/soh/soh/Enhancements/game-interactor/GameInteractor.h b/soh/soh/Enhancements/game-interactor/GameInteractor.h index 1ffea910e..3e9c48365 100644 --- a/soh/soh/Enhancements/game-interactor/GameInteractor.h +++ b/soh/soh/Enhancements/game-interactor/GameInteractor.h @@ -341,6 +341,7 @@ typedef enum { VB_SHOULD_GIVE_VANILLA_FISHING_PRIZE, VB_GIVE_RANDO_FISHING_PRIZE, VB_PLAY_THROW_ANIMATION, + VB_GANONDORF_DECIDE_TO_FIGHT, /*** Give Items ***/ @@ -592,7 +593,7 @@ struct HookInfo { #define COND_VB_SHOULD(id, condition, body) \ { \ static HOOK_ID hookId = 0; \ - GameInteractor::Instance->UnregisterGameHookForID(hookId); \ + GameInteractor::Instance->UnregisterGameHookForID(hookId); \ hookId = 0; \ if (condition) { \ hookId = REGISTER_VB_SHOULD(id, body); \ diff --git a/soh/src/overlays/actors/ovl_Boss_Ganon/z_boss_ganon.c b/soh/src/overlays/actors/ovl_Boss_Ganon/z_boss_ganon.c index 63f74694f..a0ef9aa54 100644 --- a/soh/src/overlays/actors/ovl_Boss_Ganon/z_boss_ganon.c +++ b/soh/src/overlays/actors/ovl_Boss_Ganon/z_boss_ganon.c @@ -571,7 +571,7 @@ void BossGanon_IntroCutscene(BossGanon* this, PlayState* play) { Play_ChangeCameraStatus(play, this->csCamIndex, CAM_STAT_ACTIVE); this->csCamFov = 60.0f; - if (Flags_GetEventChkInf(EVENTCHKINF_BEGAN_GANONDORF_BATTLE) || IS_RANDO || IS_BOSS_RUSH) { + if (Flags_GetEventChkInf(EVENTCHKINF_BEGAN_GANONDORF_BATTLE) || IS_RANDO || IS_BOSS_RUSH || CVarGetInteger("gHoliday.NotProxySaw.GanonDatingSim", 0)) { // watched cutscene already, skip most of it this->csState = 17; this->csTimer = 0; @@ -926,6 +926,9 @@ void BossGanon_IntroCutscene(BossGanon* this, PlayState* play) { if ((this->csTimer <= 50) || (Message_GetState(&play->msgCtx) != TEXT_STATE_NONE)) { break; } + if (!GameInteractor_Should(VB_GANONDORF_DECIDE_TO_FIGHT, true)) { + break; + } this->csState = 19; this->csTimer = 0; From ee186f6c22c62c9754fa105617da6b5b6e65cbc8 Mon Sep 17 00:00:00 2001 From: Garrett Cox Date: Tue, 12 Nov 2024 09:33:25 -0600 Subject: [PATCH 05/18] Fix issue with ornament get item messages --- .../Enhancements/randomizer/randomizer.cpp | 30 +++++++++---------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/randomizer.cpp b/soh/soh/Enhancements/randomizer/randomizer.cpp index 0575e56a7..0242c9eb8 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer.cpp @@ -2194,29 +2194,29 @@ CustomMessage Randomizer::GetRupeeMessage(u16 rupeeTextId) { void CreateTriforcePieceMessages() { CustomMessage TriforcePieceMessages[NUM_TRIFORCE_PIECE_MESSAGES] = { - { "You found a %yChristmas Ornament%w!&%g{{current}}%w down, %c{{remaining}}%w to go. It's a start!", - "Ein %yTriforce-Splitter%w! Du hast&%g{{current}}%w von %c{{required}}%w gefunden. Es ist ein&Anfang!", - "Vous trouvez un %yFragment de la&Triforce%w! Vous en avez %g{{current}}%w, il en&reste %c{{remaining}}%w à trouver. C'est un début!" }, + { "You found a %yChristmas Ornament%w!&%g[[current]]%w down, %c[[remaining]]%w to go. It's a start!", + "Ein %yTriforce-Splitter%w! Du hast&%g[[current]]%w von %c[[required]]%w gefunden. Es ist ein&Anfang!", + "Vous trouvez un %yFragment de la&Triforce%w! Vous en avez %g[[current]]%w, il en&reste %c[[remaining]]%w à trouver. C'est un début!" }, - { "You found a %yChristmas Ornament%w!&%g{{current}}%w down, %c{{remaining}}%w to go. Progress!", - "Ein %yTriforce-Splitter%w! Du hast&%g{{current}}%w von %c{{required}}%w gefunden. Es geht voran!", - "Vous trouvez un %yFragment de la&Triforce%w! Vous en avez %g{{current}}%w, il en&reste %c{{remaining}}%w à trouver. Ça avance!" }, + { "You found a %yChristmas Ornament%w!&%g[[current]]%w down, %c[[remaining]]%w to go. Progress!", + "Ein %yTriforce-Splitter%w! Du hast&%g[[current]]%w von %c[[required]]%w gefunden. Es geht voran!", + "Vous trouvez un %yFragment de la&Triforce%w! Vous en avez %g[[current]]%w, il en&reste %c[[remaining]]%w à trouver. Ça avance!" }, - { "You found a %yChristmas Ornament%w!&%g{{current}}%w down, %c{{remaining}}%w to go. Over half-way&there!", - "Ein %yTriforce-Splitter%w! Du hast&schon %g{{current}}%w von %c{{required}}%w gefunden. Schon&über die Hälfte!", - "Vous trouvez un %yFragment de la&Triforce%w! Vous en avez %g{{current}}%w, il en&reste %c{{remaining}}%w à trouver. Il en reste un&peu moins que la moitié!" }, + { "You found a %yChristmas Ornament%w!&%g[[current]]%w down, %c[[remaining]]%w to go. Over half-way&there!", + "Ein %yTriforce-Splitter%w! Du hast&schon %g[[current]]%w von %c[[required]]%w gefunden. Schon&über die Hälfte!", + "Vous trouvez un %yFragment de la&Triforce%w! Vous en avez %g[[current]]%w, il en&reste %c[[remaining]]%w à trouver. Il en reste un&peu moins que la moitié!" }, - { "You found a %yChristmas Ornament%w!&%g{{current}}%w down, %c{{remaining}}%w to go. Almost done!", - "Ein %yTriforce-Splitter%w! Du hast&schon %g{{current}}%w von %c{{required}}%w gefunden. Fast&geschafft!", - "Vous trouvez un %yFragment de la&Triforce%w! Vous en avez %g{{current}}%w, il en&reste %c{{remaining}}%w à trouver. C'est presque&terminé!" }, + { "You found a %yChristmas Ornament%w!&%g[[current]]%w down, %c[[remaining]]%w to go. Almost done!", + "Ein %yTriforce-Splitter%w! Du hast&schon %g[[current]]%w von %c[[required]]%w gefunden. Fast&geschafft!", + "Vous trouvez un %yFragment de la&Triforce%w! Vous en avez %g[[current]]%w, il en&reste %c[[remaining]]%w à trouver. C'est presque&terminé!" }, { "You found all of the %yChristmas&Ornaments%w! Visit the %gChristmas&tree%w in Kakariko Village!", "Das %yTriforce des Mutes%w! Du hast&alle Splitter gefunden. %gGut gemacht%w!", "Vous avez complété la %yTriforce&du Courage%w! %gFélicitations%w!" }, - { "You found a spare %yChristmas Ornament%w!&You only needed %c{{required}}%w, but you have %g{{current}}%w!", - "Ein übriger %yTriforce-Splitter%w! Du&hast nun %g{{current}}%w von %c{{required}}%w nötigen gefunden.", - "Vous avez trouvé un %yFragment de&Triforce%w en plus! Vous n'aviez besoin&que de %c{{required}}%w, mais vous en avez %g{{current}}%w en&tout!" }, + { "You found a spare %yChristmas Ornament%w!&You only needed %c[[required]]%w, but you have %g[[current]]%w!", + "Ein übriger %yTriforce-Splitter%w! Du&hast nun %g[[current]]%w von %c[[required]]%w nötigen gefunden.", + "Vous avez trouvé un %yFragment de&Triforce%w en plus! Vous n'aviez besoin&que de %c[[required]]%w, mais vous en avez %g[[current]]%w en&tout!" }, }; CustomMessageManager* customMessageManager = CustomMessageManager::Instance; customMessageManager->AddCustomMessageTable(Randomizer::triforcePieceMessageTableID); From bfd54abada20e30d36959b66e4df2d11d5bb0888 Mon Sep 17 00:00:00 2001 From: Garrett Cox Date: Wed, 13 Nov 2024 14:19:11 -0600 Subject: [PATCH 06/18] Fix christmas tree messages --- soh/soh/Enhancements/Holiday/Rando.cpp | 49 +++++++++++++++++++ .../randomizer/option_descriptions.cpp | 10 ++-- .../Enhancements/randomizer/randomizer.cpp | 35 ------------- soh/soh/Enhancements/randomizer/randomizer.h | 2 - soh/soh/Enhancements/randomizer/settings.cpp | 6 +-- soh/soh/OTRGlobals.cpp | 4 +- 6 files changed, 58 insertions(+), 48 deletions(-) create mode 100644 soh/soh/Enhancements/Holiday/Rando.cpp diff --git a/soh/soh/Enhancements/Holiday/Rando.cpp b/soh/soh/Enhancements/Holiday/Rando.cpp new file mode 100644 index 000000000..e5466dccf --- /dev/null +++ b/soh/soh/Enhancements/Holiday/Rando.cpp @@ -0,0 +1,49 @@ +#include "Holiday.hpp" +#include +#include "soh/UIWidgets.hpp" +#include "soh/Enhancements/game-interactor/GameInteractor.h" +#include "soh/Enhancements/custom-message/CustomMessageManager.h" +#include "include/message_data_fmt.h" +#include "soh/OTRGlobals.h" + +extern "C" { +#include "macros.h" +#include "functions.h" +#include "variables.h" +extern PlayState* gPlayState; +} + +static void ConfigurationChanged() { + COND_ID_HOOK(OnOpenText, 0x406B, IS_RANDO, [](u16 * textId, bool* loadFromMessageTable) { + if (gPlayState->sceneNum != SCENE_KAKARIKO_VILLAGE) { + return; + } + + std::string message; + uint8_t current = gSaveContext.triforcePiecesCollected; + uint8_t required = OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_TRIFORCE_HUNT_PIECES_REQUIRED); + + if (current < required) { + message = "The %yChristmas tree%w seems to be&missing some of %gits magic%w... Find all&ornaments to save %rChristmas%w!"; + } else { + message = "The tree's magic has been fully&restored. %gMerry %rChristmas%w!"; + } + + auto messageEntry = CustomMessage(message); + messageEntry.Format(); + messageEntry.LoadIntoFont(); + *loadFromMessageTable = false; + }); +} + +static void RegisterMod() { + // #region Leave this alone unless you know what you are doing + ConfigurationChanged(); + // #endregion + + GameInteractor::Instance->RegisterGameHook([](int16_t fileNum) { + ConfigurationChanged(); + }); +} + +static Holiday holiday([]() {}, RegisterMod); diff --git a/soh/soh/Enhancements/randomizer/option_descriptions.cpp b/soh/soh/Enhancements/randomizer/option_descriptions.cpp index 7de98b3d0..bd3f5dd77 100644 --- a/soh/soh/Enhancements/randomizer/option_descriptions.cpp +++ b/soh/soh/Enhancements/randomizer/option_descriptions.cpp @@ -109,14 +109,14 @@ void Settings::CreateOptionDescriptions() { "set to either MQ or Random here, you will have fewer MQ Dungeons than the number you " "set."; mOptionDescriptions[RSK_TRIFORCE_HUNT] = - "Pieces of the Triforce of Courage have been scattered across the world. Find them all to finish the game!\n\n" - "When the required amount of pieces have been found, the game is saved and Ganon's Boss key is given " + "Ornaments have been scattered across the world. Find them all to finish the game!\n\n" + "When the required amount of ornaments have been found, the game is saved and Ganon's Boss key is given " "to you when you load back into the game if you desire to beat Ganon afterwards.\n\n" "Keep in mind Ganon might not be logically beatable when \"All Locations Reachable\" is turned off."; mOptionDescriptions[RSK_TRIFORCE_HUNT_PIECES_TOTAL] = - "The amount of Triforce pieces that will be placed in the world. " - "Keep in mind seed generation can fail if more pieces are placed than there are junk items in the item pool."; - mOptionDescriptions[RSK_TRIFORCE_HUNT_PIECES_REQUIRED] = "The amount of Triforce pieces required to win the game."; + "The amount of Ornaments that will be placed in the world. " + "Keep in mind seed generation can fail if more ornaments are placed than there are junk items in the item pool."; + mOptionDescriptions[RSK_TRIFORCE_HUNT_PIECES_REQUIRED] = "The amount of Ornaments required to win the game."; mOptionDescriptions[RSK_SHUFFLE_DUNGEON_ENTRANCES] = "Shuffle the pool of dungeon entrances, including Bottom of the Well, Ice Cavern and Gerudo Training Grounds.\n" "\n" diff --git a/soh/soh/Enhancements/randomizer/randomizer.cpp b/soh/soh/Enhancements/randomizer/randomizer.cpp index 0242c9eb8..d6a2bdfaa 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer.cpp @@ -64,7 +64,6 @@ const std::string Randomizer::hintMessageTableID = "RandomizerHints"; const std::string Randomizer::merchantMessageTableID = "RandomizerMerchants"; const std::string Randomizer::rupeeMessageTableID = "RandomizerRupees"; const std::string Randomizer::triforcePieceMessageTableID = "RandomizerTriforcePiece"; -const std::string Randomizer::christmasTreeMessageTableID = "RandomizerChristmasTree"; const std::string Randomizer::NaviRandoMessageTableID = "RandomizerNavi"; const std::string Randomizer::IceTrapRandoMessageTableID = "RandomizerIceTrap"; const std::string Randomizer::randoMiscHintsTableID = "RandomizerMiscHints"; @@ -2255,39 +2254,6 @@ CustomMessage Randomizer::GetTriforcePieceMessage() { messageEntry.Format(); return messageEntry; } -void CreateChristmasTreeMessages() { - CustomMessage ChristmasTreeMessages[2] = { - - { "The %yChristmas tree%w seems to be&missing some of %gits magic%w... Find all&ornaments to save %rChristmas%w!", - "The %yChristmas tree%w seems to be&missing some of %gits magic%w... Find all&ornaments to save %rChristmas%w!", - "The %yChristmas tree%w seems to be&missing some of %gits magic%w... Find all&ornaments to save %rChristmas%w!" }, - - { "The tree's magic has been fully&restored. %gMerry %rChristmas%w!", - "The tree's magic has been fully&restored. %gMerry %rChristmas%w!", - "The tree's magic has been fully&restored. %gMerry %rChristmas%w!" } - }; - CustomMessageManager* customMessageManager = CustomMessageManager::Instance; - customMessageManager->AddCustomMessageTable(Randomizer::christmasTreeMessageTableID); - for (unsigned int i = 0; i <= 1; i++) { - customMessageManager->CreateMessage(Randomizer::christmasTreeMessageTableID, i, ChristmasTreeMessages[i]); - } -} - -CustomMessage Randomizer::GetChristmasTreeMessage() { - // Item is only given after the textbox, so reflect that inside the textbox. - uint8_t current = gSaveContext.triforcePiecesCollected; - uint8_t required = OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_TRIFORCE_HUNT_PIECES_REQUIRED); - uint8_t messageIndex; - - if (current < required) { - messageIndex = 0; - } else { - messageIndex = 1; - } - - CustomMessage messageEntry = CustomMessageManager::Instance->RetrieveMessage(Randomizer::christmasTreeMessageTableID, messageIndex); - return messageEntry; -} void CreateNaviRandoMessages() { CustomMessage NaviMessages[NUM_NAVI_MESSAGES] = { @@ -3038,7 +3004,6 @@ void Randomizer::CreateCustomMessages() { CreateGetItemMessages(&getItemMessages); CreateRupeeMessages(); CreateTriforcePieceMessages(); - CreateChristmasTreeMessages(); CreateNaviRandoMessages(); CreateFireTempleGoronMessages(); } diff --git a/soh/soh/Enhancements/randomizer/randomizer.h b/soh/soh/Enhancements/randomizer/randomizer.h index 0ec13452a..4a84d6302 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.h +++ b/soh/soh/Enhancements/randomizer/randomizer.h @@ -35,7 +35,6 @@ class Randomizer { static const std::string merchantMessageTableID; static const std::string rupeeMessageTableID; static const std::string triforcePieceMessageTableID; - static const std::string christmasTreeMessageTableID; static const std::string NaviRandoMessageTableID; static const std::string IceTrapRandoMessageTableID; static const std::string randoMiscHintsTableID; @@ -68,7 +67,6 @@ class Randomizer { static CustomMessage GetRupeeMessage(u16 rupeeTextId); static CustomMessage GetIceTrapMessage(); static CustomMessage GetTriforcePieceMessage(); - static CustomMessage GetChristmasTreeMessage(); }; #ifdef __cplusplus diff --git a/soh/soh/Enhancements/randomizer/settings.cpp b/soh/soh/Enhancements/randomizer/settings.cpp index 56c1a8111..62a8316be 100644 --- a/soh/soh/Enhancements/randomizer/settings.cpp +++ b/soh/soh/Enhancements/randomizer/settings.cpp @@ -139,9 +139,9 @@ void Settings::CreateOptions() { mOptions[RSK_BOMBCHUS_IN_LOGIC] = Option::Bool("Bombchus in Logic", CVAR_RANDOMIZER_SETTING("BombchusInLogic"), mOptionDescriptions[RSK_BOMBCHUS_IN_LOGIC]); mOptions[RSK_ENABLE_BOMBCHU_DROPS] = Option::U8("Bombchu Drops", {"No", "Yes"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("EnableBombchuDrops"), mOptionDescriptions[RSK_ENABLE_BOMBCHU_DROPS], WidgetType::Combobox, RO_AMMO_DROPS_ON); // TODO: AmmoDrops and/or HeartDropRefill, combine with/separate Ammo Drops from Bombchu Drops? - mOptions[RSK_TRIFORCE_HUNT] = Option::Bool("Triforce Hunt", CVAR_RANDOMIZER_SETTING("TriforceHunt"), mOptionDescriptions[RSK_TRIFORCE_HUNT], IMFLAG_NONE); - mOptions[RSK_TRIFORCE_HUNT_PIECES_TOTAL] = Option::U8("Triforce Hunt Total Pieces", {NumOpts(1, 100)}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("TriforceHuntTotalPieces"), mOptionDescriptions[RSK_TRIFORCE_HUNT_PIECES_TOTAL], WidgetType::Slider, 29, false, IMFLAG_NONE); - mOptions[RSK_TRIFORCE_HUNT_PIECES_REQUIRED] = Option::U8("Triforce Hunt Required Pieces", {NumOpts(1, 100)}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("TriforceHuntRequiredPieces"), mOptionDescriptions[RSK_TRIFORCE_HUNT_PIECES_REQUIRED], WidgetType::Slider, 19); + mOptions[RSK_TRIFORCE_HUNT] = Option::Bool("Ornament Hunt", CVAR_RANDOMIZER_SETTING("TriforceHunt"), mOptionDescriptions[RSK_TRIFORCE_HUNT], IMFLAG_NONE); + mOptions[RSK_TRIFORCE_HUNT_PIECES_TOTAL] = Option::U8("Ornament Hunt Total Pieces", {NumOpts(1, 100)}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("TriforceHuntTotalPieces"), mOptionDescriptions[RSK_TRIFORCE_HUNT_PIECES_TOTAL], WidgetType::Slider, 29, false, IMFLAG_NONE); + mOptions[RSK_TRIFORCE_HUNT_PIECES_REQUIRED] = Option::U8("Ornament Hunt Required Pieces", {NumOpts(1, 100)}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("TriforceHuntRequiredPieces"), mOptionDescriptions[RSK_TRIFORCE_HUNT_PIECES_REQUIRED], WidgetType::Slider, 19); mOptions[RSK_MQ_DUNGEON_RANDOM] = Option::U8("MQ Dungeon Setting", {"None", "Set Number", "Random", "Selection Only"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("MQDungeons"), mOptionDescriptions[RSK_MQ_DUNGEON_RANDOM], WidgetType::Combobox, RO_MQ_DUNGEONS_NONE, true, IMFLAG_NONE); mOptions[RSK_MQ_DUNGEON_COUNT] = Option::U8("MQ Dungeon Count", {NumOpts(0, 12)}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("MQDungeonCount"), "", WidgetType::Slider, 12, true, IMFLAG_NONE); mOptions[RSK_MQ_DUNGEON_SET] = Option::Bool("Set Dungeon Quests", {"Off", "On"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("MQDungeonsSelection"), mOptionDescriptions[RSK_MQ_DUNGEON_SET], WidgetType::Checkbox, false, false, IMFLAG_NONE); diff --git a/soh/soh/OTRGlobals.cpp b/soh/soh/OTRGlobals.cpp index 53367935e..7f58f7e8c 100644 --- a/soh/soh/OTRGlobals.cpp +++ b/soh/soh/OTRGlobals.cpp @@ -2557,9 +2557,7 @@ extern "C" int CustomMessage_RetrieveIfExists(PlayState* play) { bool nonBeanMerchants = ctx->GetOption(RSK_SHUFFLE_MERCHANTS).Is(RO_SHUFFLE_MERCHANTS_ALL_BUT_BEANS) || ctx->GetOption(RSK_SHUFFLE_MERCHANTS).Is(RO_SHUFFLE_MERCHANTS_ALL); Player* player = GET_PLAYER(play); - if (textId == 0x406B && play->sceneNum == SCENE_KAKARIKO_VILLAGE) { - messageEntry = Randomizer::GetChristmasTreeMessage(); - } else if (textId == TEXT_RANDOMIZER_CUSTOM_ITEM) { + if (textId == TEXT_RANDOMIZER_CUSTOM_ITEM) { if (player->getItemEntry.getItemId == RG_ICE_TRAP) { messageEntry = Randomizer::GetIceTrapMessage(); } else if (player->getItemEntry.getItemId == RG_TRIFORCE_PIECE) { From d9d831f241f9a6c1b12e1a94065a93d4207a76e5 Mon Sep 17 00:00:00 2001 From: Caladius Date: Fri, 15 Nov 2024 22:12:58 -0500 Subject: [PATCH 07/18] Holiday Fever (#4551) * Holiday Fever * Swap to Int32 for safety net --- soh/soh/Enhancements/Holiday/Caladius.cpp | 103 ++++++++++++++++++++++ soh/soh/Enhancements/Holiday/Caladius.h | 11 +++ soh/soh/SohGui.cpp | 6 ++ 3 files changed, 120 insertions(+) create mode 100644 soh/soh/Enhancements/Holiday/Caladius.cpp create mode 100644 soh/soh/Enhancements/Holiday/Caladius.h diff --git a/soh/soh/Enhancements/Holiday/Caladius.cpp b/soh/soh/Enhancements/Holiday/Caladius.cpp new file mode 100644 index 000000000..340c63432 --- /dev/null +++ b/soh/soh/Enhancements/Holiday/Caladius.cpp @@ -0,0 +1,103 @@ +#include "Caladius.h" +#include "Holiday.hpp" +#include "soh/Notification/Notification.h" +#include "soh/Enhancements/gameplaystats.h" + +extern "C" { +#include "macros.h" +#include "functions.h" +#include "variables.h" +extern PlayState* gPlayState; +uint64_t GetUnixTimestamp(); +} + +#define AUTHOR "Caladius" +#define CVAR(v) "gHoliday." AUTHOR "." v + +bool isDisabled = false; +float fontScale = 1.0f; + +std::string formatTimestampIceTrapFever(uint32_t value) { + uint32_t sec = value / 10; + uint32_t hh = sec / 3600; + uint32_t mm = (sec - hh * 3600) / 60; + uint32_t ss = sec - hh * 3600 - mm * 60; + return fmt::format("{}:{:0>2}:{:0>2}", hh, mm, ss); +} + +void OnTimeOver() { + gSaveContext.health = 0; +} + +int32_t calculateRemainingTime() { + int32_t timeRemaining = + ((gSaveContext.sohStats.count[COUNT_ICE_TRAPS] * (CVarGetInteger(CVAR("ExtendTimer"), 0) * 600)) + + (CVarGetInteger(CVAR("StartTimer"), 0) * 600) - GAMEPLAYSTAT_TOTAL_TIME); + if (timeRemaining <= 0) { + OnTimeOver(); + timeRemaining = 0; + } + return timeRemaining; +} + +static void OnConfigurationChanged() { + isDisabled = !CVarGetInteger(CVAR("Enabled"), 0); + fontScale = CVarGetFloat(CVAR("FontScale"), 1.0f); + if (fontScale < 1.0f) { + fontScale = 1.0f; + } + if (CVarGetInteger(CVAR("ExtendTimer"), 0) < 1) { + CVarSetInteger(CVAR("ExtendTimer"), 1); + } + if (CVarGetInteger(CVAR("StartTimer"), 0) < 1) { + CVarSetInteger(CVAR("StartTimer"), 1); + } +} + +void CaladiusWindow::Draw() { + if (!CVarGetInteger(CVAR("Enabled"), 0)) { + return; + } + + ImGui::PushStyleColor(ImGuiCol_WindowBg, ImVec4(0, 0, 0, 0.5f)); + ImGui::PushStyleColor(ImGuiCol_Border, ImVec4(0, 0, 0, 0)); + ImGui::PushStyleVar(ImGuiStyleVar_WindowRounding, 4.0f); + ImGui::Begin("TimerDisplay", nullptr, ImGuiWindowFlags_AlwaysAutoResize | + ImGuiWindowFlags_NoNav | + ImGuiWindowFlags_NoFocusOnAppearing | + ImGuiWindowFlags_NoResize | + ImGuiWindowFlags_NoDocking | + ImGuiWindowFlags_NoTitleBar | + ImGuiWindowFlags_NoScrollWithMouse | + ImGuiWindowFlags_NoScrollbar); + ImGui::SetWindowFontScale(fontScale); + ImGui::Text(formatTimestampIceTrapFever(calculateRemainingTime()).c_str()); + ImGui::End(); + + ImGui::PopStyleColor(2); + ImGui::PopStyleVar(1); +} + +static void DrawMenu() { + ImGui::SeparatorText(AUTHOR); + if (UIWidgets::EnhancementCheckbox("Holiday Fever", CVAR("Enabled"))) { + OnConfigurationChanged(); + } + UIWidgets::Tooltip("Can you beat your objective before the Fever sets in?\n" + "- Obtaining Ice Traps extends your timer."); + ImGui::Text("Options"); + if (UIWidgets::PaddedEnhancementSliderFloat("", "##FontScale", CVAR("FontScale"), + 1.0f, 5.0f, "%.1fx", 1.0f, false, false, false, false, isDisabled)) { + OnConfigurationChanged(); + } + UIWidgets::PaddedEnhancementSliderInt("Starting Timer: %d minutes", "##StartTime", CVAR("StartTimer"), + 5, 30, "", 15, true, true, false, isDisabled); + UIWidgets::PaddedEnhancementSliderInt("Time Extensions: %d minutes", "##ExtendTime", CVAR("ExtendTimer"), + 1, 10, "", 5, true, true, false, isDisabled); +} + +static void RegisterMod() { + OnConfigurationChanged(); +} + +static Holiday holiday(DrawMenu, RegisterMod); diff --git a/soh/soh/Enhancements/Holiday/Caladius.h b/soh/soh/Enhancements/Holiday/Caladius.h new file mode 100644 index 000000000..4bbd1ad8e --- /dev/null +++ b/soh/soh/Enhancements/Holiday/Caladius.h @@ -0,0 +1,11 @@ +#include + +class CaladiusWindow : public Ship::GuiWindow { + public: + using GuiWindow::GuiWindow; + + void InitElement() override {}; + void DrawElement() override {}; + void Draw() override; + void UpdateElement() override {}; +}; \ No newline at end of file diff --git a/soh/soh/SohGui.cpp b/soh/soh/SohGui.cpp index c70f544b0..3c5e4e985 100644 --- a/soh/soh/SohGui.cpp +++ b/soh/soh/SohGui.cpp @@ -38,6 +38,7 @@ #include "Enhancements/resolution-editor/ResolutionEditor.h" #include "Enhancements/debugger/MessageViewer.h" #include "soh/Notification/Notification.h" +#include "soh/Enhancements/Holiday/Caladius.h" bool isBetaQuestEnabled = false; @@ -135,6 +136,7 @@ namespace SohGui { std::shared_ptr mAdvancedResolutionSettingsWindow; std::shared_ptr mModalWindow; std::shared_ptr mNotificationWindow; + std::shared_ptr mCaladiusWindow; void SetupGuiElements() { auto gui = Ship::Context::GetInstance()->GetWindow()->GetGui(); @@ -218,6 +220,9 @@ namespace SohGui { mNotificationWindow = std::make_shared(CVAR_WINDOW("Notifications"), "Notifications Window"); gui->AddGuiWindow(mNotificationWindow); mNotificationWindow->Show(); + mCaladiusWindow = std::make_shared(CVAR_WINDOW("Holiday Cal"), "Holiday Cal"); + gui->AddGuiWindow(mCaladiusWindow); + mCaladiusWindow->Show(); } void Destroy() { @@ -252,6 +257,7 @@ namespace SohGui { mInputViewer = nullptr; mInputViewerSettings = nullptr; mTimeSplitWindow = nullptr; + mCaladiusWindow = nullptr; } void RegisterPopup(std::string title, std::string message, std::string button1, std::string button2, std::function button1callback, std::function button2callback) { From d459043644f604be278938a3120e583b8ea3bbcc Mon Sep 17 00:00:00 2001 From: Caladius Date: Tue, 19 Nov 2024 18:22:07 -0500 Subject: [PATCH 08/18] Boulder Shuffle - Shuffles all Boulders randomly (#4554) --- soh/soh/Enhancements/Holiday/Caladius.cpp | 84 ++++++++++++++++++++--- soh/src/code/z_actor.c | 2 +- 2 files changed, 77 insertions(+), 9 deletions(-) diff --git a/soh/soh/Enhancements/Holiday/Caladius.cpp b/soh/soh/Enhancements/Holiday/Caladius.cpp index 340c63432..fe8629a1c 100644 --- a/soh/soh/Enhancements/Holiday/Caladius.cpp +++ b/soh/soh/Enhancements/Holiday/Caladius.cpp @@ -2,6 +2,7 @@ #include "Holiday.hpp" #include "soh/Notification/Notification.h" #include "soh/Enhancements/gameplaystats.h" +#include "soh/Enhancements/game-interactor/GameInteractor.h" extern "C" { #include "macros.h" @@ -17,6 +18,8 @@ uint64_t GetUnixTimestamp(); bool isDisabled = false; float fontScale = 1.0f; +std::vector boulderList = { ACTOR_OBJ_BOMBIWA, ACTOR_BG_ICE_SHELTER, ACTOR_EN_ISHI, ACTOR_OBJ_HAMISHI }; + std::string formatTimestampIceTrapFever(uint32_t value) { uint32_t sec = value / 10; uint32_t hh = sec / 3600; @@ -40,8 +43,66 @@ int32_t calculateRemainingTime() { return timeRemaining; } -static void OnConfigurationChanged() { - isDisabled = !CVarGetInteger(CVAR("Enabled"), 0); +s32 ActorSnapToFloor(Actor* refActor, PlayState* play, f32 arg2) { + CollisionPoly* poly; + Vec3f pos; + s32 bgId; + f32 floorY; + + pos.x = refActor->world.pos.x; + pos.y = refActor->world.pos.y + 30.0f; + pos.z = refActor->world.pos.z; + floorY = BgCheck_EntityRaycastFloor4(&play->colCtx, &poly, &bgId, refActor, &pos); + if (floorY > BGCHECK_Y_MIN) { + refActor->world.pos.y = floorY + arg2; + Math_Vec3f_Copy(&refActor->home.pos, &refActor->world.pos); + } + return refActor->world.pos.y; +} + +void RandomizeBoulder(Actor* refActor) { + Actor* actor = (Actor*) refActor; + int16_t param = actor->params; + int32_t yAdj = 0; + uint32_t roll = rand() % boulderList.size(); + if (boulderList[roll] == ACTOR_EN_ISHI) { + param = 3; + } + yAdj = ActorSnapToFloor(actor, gPlayState, 0.0f); + //if (actor->id != ACTOR_EN_ISHI && boulderList[roll] == ACTOR_EN_ISHI) { + // yAdj = 20; + //} + //if (actor->id == ACTOR_EN_ISHI && boulderList[roll] != ACTOR_EN_ISHI) { + // yAdj = -20; + //} + + Actor_Spawn(&gPlayState->actorCtx, gPlayState, boulderList[roll], actor->world.pos.x, ActorSnapToFloor(actor, gPlayState, 0.0f), + actor->world.pos.z, 0, 0, 0, param, false); + Actor_Kill(actor); +} + +static void OnBlitzChange() { + COND_HOOK(OnSceneSpawnActors, CVarGetInteger(CVAR("Blitz.Enabled"), 0), []() { + if (!gPlayState) { + return; + } + ActorListEntry boulders = gPlayState->actorCtx.actorLists[ACTORCAT_PROP]; + Actor* currentActor = boulders.head; + if (currentActor != nullptr) { + while (currentActor != nullptr) { + for (auto& boulderActor : boulderList) { + if (currentActor->id == boulderActor) { + RandomizeBoulder(currentActor); + } + } + currentActor = currentActor->next; + } + } + }); +} + +static void OnFeverConfigurationChanged() { + isDisabled = !CVarGetInteger(CVAR("Fever.Enabled"), 0); fontScale = CVarGetFloat(CVAR("FontScale"), 1.0f); if (fontScale < 1.0f) { fontScale = 1.0f; @@ -55,7 +116,7 @@ static void OnConfigurationChanged() { } void CaladiusWindow::Draw() { - if (!CVarGetInteger(CVAR("Enabled"), 0)) { + if (!CVarGetInteger(CVAR("Fever.Enabled"), 0)) { return; } @@ -80,24 +141,31 @@ void CaladiusWindow::Draw() { static void DrawMenu() { ImGui::SeparatorText(AUTHOR); - if (UIWidgets::EnhancementCheckbox("Holiday Fever", CVAR("Enabled"))) { - OnConfigurationChanged(); + if (UIWidgets::EnhancementCheckbox("Holiday Fever", CVAR("Fever.Enabled"))) { + OnFeverConfigurationChanged(); } - UIWidgets::Tooltip("Can you beat your objective before the Fever sets in?\n" + UIWidgets::Tooltip("Can you beat your objective before the Fever sets in?/n" "- Obtaining Ice Traps extends your timer."); ImGui::Text("Options"); if (UIWidgets::PaddedEnhancementSliderFloat("", "##FontScale", CVAR("FontScale"), 1.0f, 5.0f, "%.1fx", 1.0f, false, false, false, false, isDisabled)) { - OnConfigurationChanged(); + OnFeverConfigurationChanged(); } UIWidgets::PaddedEnhancementSliderInt("Starting Timer: %d minutes", "##StartTime", CVAR("StartTimer"), 5, 30, "", 15, true, true, false, isDisabled); UIWidgets::PaddedEnhancementSliderInt("Time Extensions: %d minutes", "##ExtendTime", CVAR("ExtendTimer"), 1, 10, "", 5, true, true, false, isDisabled); + UIWidgets::PaddedSeparator(); + + if (UIWidgets::EnhancementCheckbox("Boulder Blitz", CVAR("Blitz.Enabled"))) { + OnBlitzChange(); + } } + static void RegisterMod() { - OnConfigurationChanged(); + OnFeverConfigurationChanged(); + OnBlitzChange(); } static Holiday holiday(DrawMenu, RegisterMod); diff --git a/soh/src/code/z_actor.c b/soh/src/code/z_actor.c index 34e09bdb7..38843bbec 100644 --- a/soh/src/code/z_actor.c +++ b/soh/src/code/z_actor.c @@ -3297,7 +3297,7 @@ Actor* Actor_Spawn(ActorContext* actorCtx, PlayState* play, s16 actorId, f32 pos objBankIndex = Object_GetIndex(&gPlayState->objectCtx, dbEntry->objectId); - if (objBankIndex < 0 && (!gMapLoading || CVarGetInteger(CVAR_ENHANCEMENT("RandomizedEnemies"), 0))) { + if (objBankIndex < 0 && (!gMapLoading || CVarGetInteger(CVAR_ENHANCEMENT("RandomizedEnemies"), 0) || CVarGetInteger("gHoliday.Caladius.Blitz.Enabled", 0))) { objBankIndex = 0; } From 0f48970576bcad6f237fb2f576aaf2c59fc0b6d6 Mon Sep 17 00:00:00 2001 From: Pepe20129 <72659707+Pepe20129@users.noreply.github.com> Date: Thu, 21 Nov 2024 23:08:49 +0100 Subject: [PATCH 09/18] Shiny enemies (#4570) --- soh/include/z64actor.h | 1 + soh/soh/Enhancements/Holiday/Pablo.cpp | 199 ++++++++++++++++++ .../GameInteractor_HookTable.h | 1 + .../game-interactor/GameInteractor_Hooks.cpp | 7 + .../game-interactor/GameInteractor_Hooks.h | 1 + soh/src/code/z_actor.c | 1 + 6 files changed, 210 insertions(+) create mode 100644 soh/soh/Enhancements/Holiday/Pablo.cpp diff --git a/soh/include/z64actor.h b/soh/include/z64actor.h index 156f1d679..08ca0032f 100644 --- a/soh/include/z64actor.h +++ b/soh/include/z64actor.h @@ -182,6 +182,7 @@ typedef struct Actor { /* 0x13C */ char dbgPad[0x10]; // Padding that only exists in the debug rom // #region SOH [General] /* */ u8 maximumHealth; // Max health value for use with health bars, set on actor init + /* */ u8 isShiny; // #endregion } Actor; // size = 0x14C diff --git a/soh/soh/Enhancements/Holiday/Pablo.cpp b/soh/soh/Enhancements/Holiday/Pablo.cpp new file mode 100644 index 000000000..08173df86 --- /dev/null +++ b/soh/soh/Enhancements/Holiday/Pablo.cpp @@ -0,0 +1,199 @@ +#include "Holiday.hpp" +#include "z64.h" +#include "macros.h" +#include "functions.h" +#include "src/overlays/effects/ovl_Effect_Ss_En_Ice/z_eff_ss_en_ice.h" + +extern "C" { + extern PlayState* gPlayState; +} + +#define AUTHOR "Pablo" +#define CVAR(v) "gHoliday." AUTHOR "." v + +#pragma region Shiny + +static Vec3f shineSpots[12] = { + { 20.0f, 20.0f, 0.0f }, { 10.0f, 40.0f, 10.0f }, { -10.0f, 40.0f, 10.0f }, { -20.0f, 20.0f, 0.0f }, + { 10.0f, 40.0f, -10.0f }, { -10.0f, 40.0f, -10.0f }, { 0.0f, 20.0f, -20.0f }, { 10.0f, 0.0f, 10.0f }, + { 10.0f, 0.0f, -10.0f }, { 0.0f, 20.0f, 20.0f }, { -10.0f, 0.0f, 10.0f }, { -10.0f, 0.0f, -10.0f }, +}; + +static u8 shinyableActorIds[51] = { + ACTOR_EN_WALLMAS, + ACTOR_EN_ZF, + ACTOR_EN_YUKABYUN, + ACTOR_EN_WF, + ACTOR_EN_WEIYER, + ACTOR_EN_VM, + ACTOR_EN_TUBO_TRAP, + ACTOR_EN_VALI, + ACTOR_EN_TP, + ACTOR_EN_TORCH2, + ACTOR_EN_TITE, + ACTOR_EN_TEST, + ACTOR_EN_SW, + ACTOR_EN_ST, + ACTOR_EN_SKB, + ACTOR_EN_SKJ, + ACTOR_EN_PEEHAT, + ACTOR_EN_SB, + ACTOR_EN_RR, + ACTOR_EN_REEBA, + ACTOR_EN_RD, + ACTOR_EN_PO_SISTERS, + ACTOR_EN_PO_FIELD, + ACTOR_EN_POH, + ACTOR_EN_KAREBABA, + ACTOR_EN_OKUTA, + ACTOR_EN_NY, + ACTOR_EN_MB, + ACTOR_EN_IK, + ACTOR_EN_GOMA, + ACTOR_EN_GELDB, + ACTOR_EN_FZ, + ACTOR_EN_FLOORMAS, + ACTOR_EN_FIREFLY, + ACTOR_EN_FD, + ACTOR_EN_EIYER, + ACTOR_EN_DODONGO, + ACTOR_EN_DODOJR, + ACTOR_EN_DH, + ACTOR_EN_DEKUBABA, + ACTOR_EN_CROW, + ACTOR_EN_CLEAR_TAG, + ACTOR_EN_BW, + ACTOR_EN_BUBBLE, + ACTOR_EN_AM, + ACTOR_EN_BILI, + ACTOR_EN_BIGOKUTA, + ACTOR_EN_BB, + ACTOR_EN_BA, + ACTOR_EN_ANUBICE, + ACTOR_DOOR_KILLER +}; + +u8 CanBeShiny(Actor* actor) { + for (u8 i = 0; i < ARRAY_COUNT(shinyableActorIds); i += 1) { + if (shinyableActorIds[i] == actor->id) { + return true; + } + } + return false; +} + +void ApplyShinyness(Actor* actor) { + if (!CanBeShiny(actor)) { + assert(false); + return; + } + + actor->isShiny = true; + actor->colChkInfo.health *= 4; + actor->maximumHealth *= 4; + actor->scale.x *= 1.25f; + actor->scale.y *= 1.25f; + actor->scale.z *= 1.25f; +} + +void RenderShines(Actor* actor) { + if (!CanBeShiny(actor) || !actor->isShiny) { + assert(false); + return; + } + + if (gSaveContext.gameMode != GAMEMODE_NORMAL || gPlayState->pauseCtx.state != 0) { + return; + } + + if (Rand_ZeroOne() < 0.1f) { + Vec3f shinePos; + s32 i = (s32)(Rand_ZeroOne() * ARRAY_COUNT(shineSpots)); + + shinePos.x = actor->world.pos.x + shineSpots[i].x; + shinePos.y = actor->world.pos.y + shineSpots[i].y; + shinePos.z = actor->world.pos.z + shineSpots[i].z; + + EffectSsEnIceInitParams initParams; + + initParams.actor = actor; + initParams.pos = shinePos; + initParams.type = 0; + + // 50/50 chance of red or green + if (Rand_Next() % 2 == 0) { + initParams.primColor.r = 255; + initParams.primColor.g = 0; + initParams.envColor.r = 255; + initParams.envColor.g = 0; + } else { + initParams.primColor.r = 0; + initParams.primColor.g = 255; + initParams.envColor.r = 0; + initParams.envColor.g = 255; + } + + initParams.primColor.b = 0; + initParams.primColor.a = 250; + initParams.envColor.b = 0; + initParams.scale = 0.5f; + + EffectSs_Spawn(gPlayState, EFFECT_SS_EN_ICE, 80, &initParams); + } +} + +void SpawnShinyReward(Actor* actor) { + if (!CanBeShiny(actor)) { + assert(false); + return; + } + + for (u8 i = 0; i < 10; i += 1) { + Item_DropCollectible(gPlayState, &actor->world.pos, ITEM00_RUPEE_RED); + Item_DropCollectible(gPlayState, &actor->world.pos, ITEM00_RUPEE_GREEN); + } +} + +void RegisterShiny() { + GameInteractor::Instance->RegisterGameHook([](void* refActor) { + Actor* actor = static_cast(refActor); + if (CVarGetInteger(CVAR("Shiny.Enabled"), 0) && CanBeShiny(actor) && Rand_ZeroOne() < (1.0f / (s32)CVarGetInteger(CVAR("Shiny.Chance"), 8192))) { + ApplyShinyness(actor); + } + }); + + GameInteractor::Instance->RegisterGameHook([](void* refActor) { + Actor* actor = static_cast(refActor); + if (CVarGetInteger(CVAR("Shiny.Enabled"), 0) && actor->isShiny) { + SpawnShinyReward(actor); + } + }); + + GameInteractor::Instance->RegisterGameHook([](void* refActor) { + Actor* actor = static_cast(refActor); + if (CVarGetInteger(CVAR("Shiny.Enabled"), 0) && actor->isShiny) { + RenderShines(actor); + } + }); +} + +void ShinyDrawImGui() { + UIWidgets::PaddedEnhancementCheckbox("Enable Shiny Enemies", CVAR("Shiny.Enabled"), true, false); + UIWidgets::Tooltip("Allows enemies to be shiny.\nShiny enemies are 25% bigger and have 4 times the health but drop the equivalent of a gold rupee upon death"); + + UIWidgets::PaddedEnhancementSliderInt("Shiny Chance: %d", "##ShinyChance", CVAR("Shiny.Chance"), 1, 8192, "", 8192, true, true, false, false, ""); + UIWidgets::Tooltip("The chance for an enemy to be shiny is 1 / Shiny Chance"); +} + +#pragma endregion + +static void DrawMenu() { + ImGui::SeparatorText(AUTHOR); + ShinyDrawImGui(); +} + +static void RegisterMod() { + RegisterShiny(); +} + +static Holiday holiday(DrawMenu, RegisterMod); \ No newline at end of file diff --git a/soh/soh/Enhancements/game-interactor/GameInteractor_HookTable.h b/soh/soh/Enhancements/game-interactor/GameInteractor_HookTable.h index 06ef7cc21..989a56c75 100644 --- a/soh/soh/Enhancements/game-interactor/GameInteractor_HookTable.h +++ b/soh/soh/Enhancements/game-interactor/GameInteractor_HookTable.h @@ -23,6 +23,7 @@ DEFINE_HOOK(OnShopSlotChange, (uint8_t cursorIndex, int16_t price)); DEFINE_HOOK(ShouldActorInit, (void* actor, bool* result)); DEFINE_HOOK(OnActorInit, (void* actor)); DEFINE_HOOK(OnActorUpdate, (void* actor)); +DEFINE_HOOK(OnActorDraw, (void* actor)); DEFINE_HOOK(OnActorKill, (void* actor)); DEFINE_HOOK(OnEnemyDefeat, (void* actor)); DEFINE_HOOK(OnBossDefeat, (void* actor)); diff --git a/soh/soh/Enhancements/game-interactor/GameInteractor_Hooks.cpp b/soh/soh/Enhancements/game-interactor/GameInteractor_Hooks.cpp index a2235f7f0..f0de65364 100644 --- a/soh/soh/Enhancements/game-interactor/GameInteractor_Hooks.cpp +++ b/soh/soh/Enhancements/game-interactor/GameInteractor_Hooks.cpp @@ -95,6 +95,13 @@ void GameInteractor_ExecuteOnActorUpdate(void* actor) { GameInteractor::Instance->ExecuteHooksForFilter(actor); } +void GameInteractor_ExecuteOnActorDraw(void* actor) { + GameInteractor::Instance->ExecuteHooks(actor); + GameInteractor::Instance->ExecuteHooksForID(((Actor*)actor)->id, actor); + GameInteractor::Instance->ExecuteHooksForPtr((uintptr_t)actor, actor); + GameInteractor::Instance->ExecuteHooksForFilter(actor); +} + void GameInteractor_ExecuteOnActorKill(void* actor) { GameInteractor::Instance->ExecuteHooks(actor); GameInteractor::Instance->ExecuteHooksForID(((Actor*)actor)->id, actor); diff --git a/soh/soh/Enhancements/game-interactor/GameInteractor_Hooks.h b/soh/soh/Enhancements/game-interactor/GameInteractor_Hooks.h index 60326614d..24fe78dc1 100644 --- a/soh/soh/Enhancements/game-interactor/GameInteractor_Hooks.h +++ b/soh/soh/Enhancements/game-interactor/GameInteractor_Hooks.h @@ -22,6 +22,7 @@ void GameInteractor_ExecuteOnOcarinaSongAction(); bool GameInteractor_ShouldActorInit(void* actor); void GameInteractor_ExecuteOnActorInit(void* actor); void GameInteractor_ExecuteOnActorUpdate(void* actor); +void GameInteractor_ExecuteOnActorDraw(void* actor); void GameInteractor_ExecuteOnActorKill(void* actor); void GameInteractor_ExecuteOnEnemyDefeat(void* actor); void GameInteractor_ExecuteOnBossDefeat(void* actor); diff --git a/soh/src/code/z_actor.c b/soh/src/code/z_actor.c index 38843bbec..1c514f92f 100644 --- a/soh/src/code/z_actor.c +++ b/soh/src/code/z_actor.c @@ -2744,6 +2744,7 @@ void Actor_Draw(PlayState* play, Actor* actor) { } actor->draw(actor, play); + GameInteractor_ExecuteOnActorDraw(actor); if (actor->colorFilterTimer != 0) { if (actor->colorFilterParams & 0x2000) { From f1dc43258942400fa72942eca0de17fb1b8148c4 Mon Sep 17 00:00:00 2001 From: lilDavid <1337lilDavid@gmail.com> Date: Fri, 22 Nov 2024 21:03:37 -0600 Subject: [PATCH 10/18] Holiday Modding Event - Bomb Arrows (#4573) * Bomb Arrows: Turn arrows into bomb arrows * Bomb Arrows: Drain bombs when fired * Bomb Arrows: Equip Over Bow * Bomb Arrows: Item icons and ammo counts * Bomb Arrows: Save files * Bomb Arrows: Fix equip and ammo display bugs * Bomb Arrows: Interactions with multi-arrows * Bomb Arrows: Fix fuse graphics --- soh/soh/Enhancements/Holiday/lilDavid.cpp | 136 ++++++++++++++++++ .../GameInteractor_HookTable.h | 1 + .../game-interactor/GameInteractor_Hooks.cpp | 4 + .../game-interactor/GameInteractor_Hooks.h | 1 + soh/soh/SaveManager.cpp | 1 + soh/src/code/z_parameter.c | 31 ++++ soh/src/overlays/actors/ovl_En_Bom/z_en_bom.c | 7 +- .../misc/ovl_kaleido_scope/z_kaleido_item.c | 15 ++ 8 files changed, 195 insertions(+), 1 deletion(-) create mode 100644 soh/soh/Enhancements/Holiday/lilDavid.cpp diff --git a/soh/soh/Enhancements/Holiday/lilDavid.cpp b/soh/soh/Enhancements/Holiday/lilDavid.cpp new file mode 100644 index 000000000..1ed871920 --- /dev/null +++ b/soh/soh/Enhancements/Holiday/lilDavid.cpp @@ -0,0 +1,136 @@ +#include "Holiday.hpp" + +#include "utils/StringHelper.h" + +extern "C" { +#include "macros.h" +#include "functions.h" +#include "variables.h" +extern PlayState* gPlayState; +} + +#include "src/overlays/actors/ovl_En_Arrow/z_en_arrow.h" +#include "src/overlays/actors/ovl_En_Bom/z_en_bom.h" + +extern "C" { + void func_809B45E0(EnArrow*, PlayState*); + void func_809B4640(EnArrow*, PlayState*); +} + +#define AUTHOR "lilDavid" +#define CVAR(v) "gHoliday." AUTHOR "." v + +static void OnConfigurationChanged() { + if (!CVarGetInteger(CVAR("BombArrows.Enabled"), 0)) + CVarSetInteger(CVAR("BombArrows.Active"), 0); + + COND_HOOK(OnSaveFile, CVarGetInteger(CVAR("BombArrows.Enabled"), 0), [](int32_t file) { + std::string cvar = StringHelper::Sprintf("%s%d", CVAR("BombArrows.Save"), file); + CVarSetInteger(cvar.c_str(), CVarGetInteger(CVAR("BombArrows.Active"), 0)); + Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesOnNextTick(); + }); + + COND_HOOK(OnLoadFile, CVarGetInteger(CVAR("BombArrows.Enabled"), 0), [](int32_t file) { + std::string cvar = StringHelper::Sprintf("%s%d", CVAR("BombArrows.Save"), file); + CVarSetInteger(CVAR("BombArrows.Active"), CVarGetInteger(cvar.c_str(), 0)); + }); + + COND_HOOK(OnCopyFile, CVarGetInteger(CVAR("BombArrows.Enabled"), 0), [](int32_t from, int32_t to) { + std::string cvarFrom = StringHelper::Sprintf("%s%d", CVAR("BombArrows.Save"), from); + std::string cvarTo = StringHelper::Sprintf("%s%d", CVAR("BombArrows.Save"), to); + CVarSetInteger(cvarTo.c_str(), CVarGetInteger(cvarFrom.c_str(), 0)); + Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesOnNextTick(); + }); + + COND_HOOK(OnDeleteFile, CVarGetInteger(CVAR("BombArrows.Enabled"), 0), [](int32_t file) { + std::string cvar = StringHelper::Sprintf("%s%d", CVAR("BombArrows.Save"), file); + CVarSetInteger(cvar.c_str(), 0); + Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesOnNextTick(); + }); + + COND_ID_HOOK(OnActorInit, ACTOR_EN_ARROW, CVarGetInteger(CVAR("BombArrows.Enabled"), 0), [](void* actorRef) { + EnArrow* arrow = (EnArrow*) actorRef; + if (!CVarGetInteger(CVAR("BombArrows.Active"), 0) || + arrow->actor.params != ARROW_NORMAL || AMMO(ITEM_BOMB) == 0 || + gSaveContext.minigameState == 1 || gPlayState->shootingGalleryStatus > 1) + return; + + EnBom* bomb = (EnBom*) Actor_SpawnAsChild(&gPlayState->actorCtx, &arrow->actor, gPlayState, ACTOR_EN_BOM, + arrow->actor.world.pos.x, arrow->actor.world.pos.y, arrow->actor.world.pos.z, + 0, 0, 0, BOMB_BODY); + if (bomb == nullptr) + return; + + Actor_SetScale(&bomb->actor, 0.003f); + bomb->timer = 65; + }); + + COND_ID_HOOK(OnActorUpdate, ACTOR_EN_ARROW, CVarGetInteger(CVAR("BombArrows.Enabled"), 0), [](void* actorRef) { + EnArrow* arrow = (EnArrow*) actorRef; + if (!arrow->actor.child || arrow->actor.child->id != ACTOR_EN_BOM) + return; + + EnBom* bomb = (EnBom*) arrow->actor.child; + bomb->actor.world.pos = arrow->actor.world.pos; + f32 r = 8.0f; + f32 xrot = arrow->actor.world.rot.x; + f32 yrot = arrow->actor.world.rot.y; + bomb->actor.world.pos.x += r * Math_CosS(xrot) * Math_SinS(yrot); + bomb->actor.world.pos.y -= r * Math_SinS(xrot) + 2.0f; + bomb->actor.world.pos.z += r * Math_CosS(xrot) * Math_CosS(yrot); + + if (arrow->actor.parent == nullptr) { + if (bomb->timer > 60) { + Inventory_ChangeAmmo(ITEM_BOMB, -1); + } + bomb->timer = 52; + } else { + bomb->timer = 62; + } + + if (arrow->actionFunc == func_809B45E0 || + arrow->actionFunc == func_809B4640 || + arrow->actor.params == ARROW_NORMAL_LIT) + { + arrow->actor.child = nullptr; + bomb->actor.parent = nullptr; + bomb->timer = 2; + Actor_Kill(&arrow->actor); + } + }); + + COND_ID_HOOK(OnActorKill, ACTOR_EN_ARROW, CVarGetInteger(CVAR("BombArrows.Enabled"), 0), [](void* actorRef) { + EnArrow* arrow = (EnArrow*) actorRef; + if (!arrow->actor.child || arrow->actor.child->id != ACTOR_EN_BOM) + return; + Actor_Kill(arrow->actor.child); + }); + + COND_ID_HOOK(OnActorUpdate, ACTOR_EN_BOM, CVarGetInteger(CVAR("BombArrows.Enabled"), 0), [](void* actorRef) { + EnBom* bomb = (EnBom*) actorRef; + if (!bomb->actor.parent || bomb->actor.parent->id != ACTOR_EN_ARROW) + return; + + if (bomb->timer > 55 && bomb->timer < 60) + bomb->timer += 4; + if (bomb->timer > 45 && bomb->timer < 50) + bomb->timer += 4; + }); +} + +static void DrawMenu() { + ImGui::SeparatorText(AUTHOR); + if (UIWidgets::EnhancementCheckbox("Bomb Arrows", CVAR("BombArrows.Enabled"))) { + OnConfigurationChanged(); + } +} + +static void RegisterMod() { + // #region Leave this alone unless you know what you are doing + OnConfigurationChanged(); + // #endregion + + CVarSetInteger(CVAR("BombArrows.Active"), 0); +} + +static Holiday holiday(DrawMenu, RegisterMod); diff --git a/soh/soh/Enhancements/game-interactor/GameInteractor_HookTable.h b/soh/soh/Enhancements/game-interactor/GameInteractor_HookTable.h index 989a56c75..e60acf496 100644 --- a/soh/soh/Enhancements/game-interactor/GameInteractor_HookTable.h +++ b/soh/soh/Enhancements/game-interactor/GameInteractor_HookTable.h @@ -37,6 +37,7 @@ DEFINE_HOOK(OnOpenText, (u16 * textId, bool* loadFromMessageTable)); DEFINE_HOOK(OnVanillaBehavior, (GIVanillaBehavior flag, bool* result, va_list originalArgs)); DEFINE_HOOK(OnSaveFile, (int32_t fileNum)); DEFINE_HOOK(OnLoadFile, (int32_t fileNum)); +DEFINE_HOOK(OnCopyFile, (int32_t sourceFileNum, uint32_t destFileNum)); DEFINE_HOOK(OnDeleteFile, (int32_t fileNum)); DEFINE_HOOK(OnDialogMessage, ()); diff --git a/soh/soh/Enhancements/game-interactor/GameInteractor_Hooks.cpp b/soh/soh/Enhancements/game-interactor/GameInteractor_Hooks.cpp index f0de65364..8f56f6fd4 100644 --- a/soh/soh/Enhancements/game-interactor/GameInteractor_Hooks.cpp +++ b/soh/soh/Enhancements/game-interactor/GameInteractor_Hooks.cpp @@ -184,6 +184,10 @@ void GameInteractor_ExecuteOnLoadFile(int32_t fileNum) { GameInteractor::Instance->ExecuteHooks(fileNum); } +void GameInteractor_ExecuteOnCopyFile(int32_t sourceFileNum, int32_t destFileNum) { + GameInteractor::Instance->ExecuteHooks(sourceFileNum, destFileNum); +} + void GameInteractor_ExecuteOnDeleteFile(int32_t fileNum) { GameInteractor::Instance->ExecuteHooks(fileNum); } diff --git a/soh/soh/Enhancements/game-interactor/GameInteractor_Hooks.h b/soh/soh/Enhancements/game-interactor/GameInteractor_Hooks.h index 24fe78dc1..99f1451c0 100644 --- a/soh/soh/Enhancements/game-interactor/GameInteractor_Hooks.h +++ b/soh/soh/Enhancements/game-interactor/GameInteractor_Hooks.h @@ -40,6 +40,7 @@ bool GameInteractor_Should(GIVanillaBehavior flag, uint32_t result, ...); // MARK: - Save Files void GameInteractor_ExecuteOnSaveFile(int32_t fileNum); void GameInteractor_ExecuteOnLoadFile(int32_t fileNum); +void GameInteractor_ExecuteOnCopyFile(int32_t sourceFileNum, int32_t destFileNum); void GameInteractor_ExecuteOnDeleteFile(int32_t fileNum); // MARK: - Dialog diff --git a/soh/soh/SaveManager.cpp b/soh/soh/SaveManager.cpp index 407372575..1e92cb3bf 100644 --- a/soh/soh/SaveManager.cpp +++ b/soh/soh/SaveManager.cpp @@ -2458,6 +2458,7 @@ void SaveManager::CopyZeldaFile(int from, int to) { fileMetaInfo[to].buildVersionPatch = fileMetaInfo[from].buildVersionPatch; SohUtils::CopyStringToCharArray(fileMetaInfo[to].buildVersion, fileMetaInfo[from].buildVersion, ARRAY_COUNT(fileMetaInfo[to].buildVersion)); + GameInteractor::Instance->ExecuteHooks(from, to); } void SaveManager::DeleteZeldaFile(int fileNum) { diff --git a/soh/src/code/z_parameter.c b/soh/src/code/z_parameter.c index a9fa846d2..aeeaed138 100644 --- a/soh/src/code/z_parameter.c +++ b/soh/src/code/z_parameter.c @@ -4722,6 +4722,11 @@ void Interface_DrawAmmoCount(PlayState* play, s16 button, s16 alpha) { } ammo = AMMO(i); + if (CVarGetInteger("gHoliday.lilDavid.BombArrows.Active", 0) && + gSaveContext.equips.buttonItems[button] == ITEM_BOW && + AMMO(ITEM_BOMB) != 0 && AMMO(ITEM_BOMB) < AMMO(ITEM_BOW)) { + ammo = AMMO(ITEM_BOMB); + } gDPPipeSync(OVERLAY_DISP++); @@ -4734,6 +4739,11 @@ void Interface_DrawAmmoCount(PlayState* play, s16 button, s16 alpha) { if (ammo < 0) { ammo = 0; } + } else if (gSaveContext.equips.buttonItems[button] == ITEM_BOW && + CVarGetInteger("gHoliday.lilDavid.BombArrows.Active", 0)) { + if (AMMO(ITEM_BOMB) != 0 && ammo == MIN(CUR_CAPACITY(UPG_QUIVER), CUR_CAPACITY(UPG_BOMB_BAG))) { + gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 120, 255, 0, alpha); + } } else if (((i == ITEM_BOW) && (AMMO(i) == CUR_CAPACITY(UPG_QUIVER))) || ((i == ITEM_BOMB) && (AMMO(i) == CUR_CAPACITY(UPG_BOMB_BAG))) || ((i == ITEM_SLINGSHOT) && (AMMO(i) == CUR_CAPACITY(UPG_BULLET_BAG))) || @@ -5311,6 +5321,9 @@ void Interface_Draw(PlayState* play) { if (gSaveContext.equips.buttonItems[1] < 0xF0) { gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 255, 255, 255, interfaceCtx->cLeftAlpha); gDPSetCombineMode(OVERLAY_DISP++, G_CC_MODULATERGBA_PRIM, G_CC_MODULATERGBA_PRIM); + if (gSaveContext.equips.buttonItems[1] == ITEM_BOW && CVarGetInteger("gHoliday.lilDavid.BombArrows.Active", 0)) { + Interface_DrawItemIconTexture(play, gItemIcons[ITEM_BOMB], 1); + } Interface_DrawItemIconTexture(play, gItemIcons[gSaveContext.equips.buttonItems[1]], 1); gDPPipeSync(OVERLAY_DISP++); gDPSetCombineLERP(OVERLAY_DISP++, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0, @@ -5324,6 +5337,9 @@ void Interface_Draw(PlayState* play) { if (gSaveContext.equips.buttonItems[2] < 0xF0) { gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 255, 255, 255, interfaceCtx->cDownAlpha); gDPSetCombineMode(OVERLAY_DISP++, G_CC_MODULATERGBA_PRIM, G_CC_MODULATERGBA_PRIM); + if (gSaveContext.equips.buttonItems[2] == ITEM_BOW && CVarGetInteger("gHoliday.lilDavid.BombArrows.Active", 0)) { + Interface_DrawItemIconTexture(play, gItemIcons[ITEM_BOMB], 2); + } Interface_DrawItemIconTexture(play, gItemIcons[gSaveContext.equips.buttonItems[2]], 2); gDPPipeSync(OVERLAY_DISP++); gDPSetCombineLERP(OVERLAY_DISP++, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0, @@ -5337,6 +5353,9 @@ void Interface_Draw(PlayState* play) { if (gSaveContext.equips.buttonItems[3] < 0xF0) { gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 255, 255, 255, interfaceCtx->cRightAlpha); gDPSetCombineMode(OVERLAY_DISP++, G_CC_MODULATERGBA_PRIM, G_CC_MODULATERGBA_PRIM); + if (gSaveContext.equips.buttonItems[3] == ITEM_BOW && CVarGetInteger("gHoliday.lilDavid.BombArrows.Active", 0)) { + Interface_DrawItemIconTexture(play, gItemIcons[ITEM_BOMB], 3); + } Interface_DrawItemIconTexture(play, gItemIcons[gSaveContext.equips.buttonItems[3]], 3); gDPPipeSync(OVERLAY_DISP++); gDPSetCombineLERP(OVERLAY_DISP++, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0, @@ -5396,6 +5415,9 @@ void Interface_Draw(PlayState* play) { if (gSaveContext.equips.buttonItems[4] < 0xF0) { gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 255, 255, 255, interfaceCtx->dpadUpAlpha); gDPSetCombineMode(OVERLAY_DISP++, G_CC_MODULATERGBA_PRIM, G_CC_MODULATERGBA_PRIM); + if (gSaveContext.equips.buttonItems[4] == ITEM_BOW && CVarGetInteger("gHoliday.lilDavid.BombArrows.Active", 0)) { + Interface_DrawItemIconTexture(play, gItemIcons[ITEM_BOMB], 4); + } Interface_DrawItemIconTexture(play, gItemIcons[gSaveContext.equips.buttonItems[4]], 4); gDPPipeSync(OVERLAY_DISP++); gDPSetCombineLERP(OVERLAY_DISP++, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0, @@ -5407,6 +5429,9 @@ void Interface_Draw(PlayState* play) { if (gSaveContext.equips.buttonItems[5] < 0xF0) { gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 255, 255, 255, interfaceCtx->dpadDownAlpha); gDPSetCombineMode(OVERLAY_DISP++, G_CC_MODULATERGBA_PRIM, G_CC_MODULATERGBA_PRIM); + if (gSaveContext.equips.buttonItems[5] == ITEM_BOW && CVarGetInteger("gHoliday.lilDavid.BombArrows.Active", 0)) { + Interface_DrawItemIconTexture(play, gItemIcons[ITEM_BOMB], 5); + } Interface_DrawItemIconTexture(play, gItemIcons[gSaveContext.equips.buttonItems[5]], 5); gDPPipeSync(OVERLAY_DISP++); gDPSetCombineLERP(OVERLAY_DISP++, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0, @@ -5418,6 +5443,9 @@ void Interface_Draw(PlayState* play) { if (gSaveContext.equips.buttonItems[6] < 0xF0) { gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 255, 255, 255, interfaceCtx->dpadLeftAlpha); gDPSetCombineMode(OVERLAY_DISP++, G_CC_MODULATERGBA_PRIM, G_CC_MODULATERGBA_PRIM); + if (gSaveContext.equips.buttonItems[6] == ITEM_BOW && CVarGetInteger("gHoliday.lilDavid.BombArrows.Active", 0)) { + Interface_DrawItemIconTexture(play, gItemIcons[ITEM_BOMB], 6); + } Interface_DrawItemIconTexture(play, gItemIcons[gSaveContext.equips.buttonItems[6]], 6); gDPPipeSync(OVERLAY_DISP++); gDPSetCombineLERP(OVERLAY_DISP++, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0, @@ -5429,6 +5457,9 @@ void Interface_Draw(PlayState* play) { if (gSaveContext.equips.buttonItems[7] < 0xF0) { gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 255, 255, 255, interfaceCtx->dpadRightAlpha); gDPSetCombineMode(OVERLAY_DISP++, G_CC_MODULATERGBA_PRIM, G_CC_MODULATERGBA_PRIM); + if (gSaveContext.equips.buttonItems[7] == ITEM_BOW && CVarGetInteger("gHoliday.lilDavid.BombArrows.Active", 0)) { + Interface_DrawItemIconTexture(play, gItemIcons[ITEM_BOMB], 7); + } Interface_DrawItemIconTexture(play, gItemIcons[gSaveContext.equips.buttonItems[7]], 7); gDPPipeSync(OVERLAY_DISP++); gDPSetCombineLERP(OVERLAY_DISP++, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0, diff --git a/soh/src/overlays/actors/ovl_En_Bom/z_en_bom.c b/soh/src/overlays/actors/ovl_En_Bom/z_en_bom.c index e379f0095..829c75570 100644 --- a/soh/src/overlays/actors/ovl_En_Bom/z_en_bom.c +++ b/soh/src/overlays/actors/ovl_En_Bom/z_en_bom.c @@ -287,7 +287,12 @@ void EnBom_Update(Actor* thisx, PlayState* play2) { // spawn spark effect on even frames effPos = thisx->world.pos; - effPos.y += 17.0f; + if (CVarGetInteger("gHoliday.lilDavid.BombArrows.Active", 0) && + thisx->parent && thisx->parent->id == ACTOR_EN_ARROW) { + effPos.y += 5.0f; + } else { + effPos.y += 17.0f; + } if ((play->gameplayFrames % 2) == 0) { EffectSsGSpk_SpawnFuse(play, thisx, &effPos, &effVelocity, &effAccel); } diff --git a/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_item.c b/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_item.c index 105b59e03..d4a586b2b 100644 --- a/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_item.c +++ b/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_item.c @@ -1136,6 +1136,21 @@ void KaleidoScope_UpdateItemEquip(PlayState* play) { } } + if (CVarGetInteger("gHoliday.lilDavid.BombArrows.Enabled", 0)) { + if (pauseCtx->equipTargetSlot == SLOT_BOW) { + CVarSetInteger("gHoliday.lilDavid.BombArrows.Active", 0); + } + u8 equipped_slot = gSaveContext.equips.cButtonSlots[pauseCtx->equipTargetCBtn]; + if (!CVarGetInteger("gHoliday.lilDavid.BombArrows.Active", 0) && + pauseCtx->equipTargetItem == ITEM_BOMB && equipped_slot == SLOT_BOW) + { + CVarSetInteger("gHoliday.lilDavid.BombArrows.Active", 1); + pauseCtx->equipTargetItem = ITEM_BOW; + pauseCtx->equipTargetSlot = SLOT_BOW; + Audio_PlaySoundGeneral(NA_SE_SY_SET_FIRE_ARROW, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale, &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb); + } + } + // If the item is on another button already, swap the two uint16_t targetButtonIndex = pauseCtx->equipTargetCBtn + 1; for (uint16_t otherSlotIndex = 0; otherSlotIndex < ARRAY_COUNT(gSaveContext.equips.cButtonSlots); From 7d3b9e8211eb5de0b1bf74724230b3fc10899201 Mon Sep 17 00:00:00 2001 From: aMannus Date: Sun, 24 Nov 2024 15:18:01 +0100 Subject: [PATCH 11/18] Rocs Feather - LetItSnow Edition - No Save Edition - Limited Edition (#4577) * Rocs Feather Take 2 * Tooltip --- soh/include/functions.h | 3 + soh/soh/Enhancements/Holiday/aMannus.cpp | 76 +++++++++++++++++++ .../game-interactor/GameInteractor.h | 1 + .../actors/ovl_player_actor/z_player.c | 6 +- 4 files changed, 84 insertions(+), 2 deletions(-) create mode 100644 soh/soh/Enhancements/Holiday/aMannus.cpp diff --git a/soh/include/functions.h b/soh/include/functions.h index 97e3be4d9..a8595680d 100644 --- a/soh/include/functions.h +++ b/soh/include/functions.h @@ -2461,6 +2461,9 @@ s32 Ship_CalcShouldDrawAndUpdate(PlayState* play, Actor* actor, Vec3f* projected void PauseWarp_HandleSelection(); void PauseWarp_Execute(); +// Exposing for Roc's Feather +void func_80838940(Player* this, LinkAnimationHeader* anim, f32 arg2, PlayState* play, u16 sfxId); + // #endregion #ifdef __cplusplus diff --git a/soh/soh/Enhancements/Holiday/aMannus.cpp b/soh/soh/Enhancements/Holiday/aMannus.cpp new file mode 100644 index 000000000..8cf854b1d --- /dev/null +++ b/soh/soh/Enhancements/Holiday/aMannus.cpp @@ -0,0 +1,76 @@ +#include "Holiday.hpp" + +#define AUTHOR "aMannus" +#define CVAR(v) "gHoliday." AUTHOR "." v + +extern "C" { +#include ; +#include "functions.h"; +#include "variables.h"; +#include "macros.h"; +#include "objects/gameplay_keep/gameplay_keep.h" +extern PlayState* gPlayState; +} + +uint8_t rocsUseCount = 0; + +static void ConfigurationChanged() { + + COND_HOOK(OnPlayerUpdate, CVarGetInteger(CVAR("RocsFeather"), 0), []() { + Player* player = GET_PLAYER(gPlayState); + // Reset Rocs count when touching the ground + if (player->actor.bgCheckFlags & 1) { + rocsUseCount = 0; + } + }); + + COND_VB_SHOULD(VB_USE_ITEM, CVarGetInteger(CVAR("RocsFeather"), 0), { + int32_t* usedItem = va_arg(args, int32_t*); + Player* player = GET_PLAYER(gPlayState); + + // Roc's Feather behaviour + if (*usedItem == ITEM_NAYRUS_LOVE) { + *should = false; + + if (!rocsUseCount) { + rocsUseCount++; + player->linearVelocity = 5.0f; + player->actor.velocity.y = 8.0f; + player->actor.world.rot.y = player->yaw = player->actor.shape.rot.y; + + func_80838940(player, (LinkAnimationHeader*)&gPlayerAnim_link_fighter_backturn_jump, + !(2 & 1) ? 5.8f : 3.5f, gPlayState, 0); + + Vec3f effectsPos = player->actor.home.pos; + effectsPos.y += 3; + f32 effectsScale = 1; + if (!gSaveContext.linkAge) { + effectsScale = 1.5f; + } + EffectSsGRipple_Spawn(gPlayState, &effectsPos, 200 * effectsScale, 300 * effectsScale, 1); + EffectSsGSplash_Spawn(gPlayState, &effectsPos, NULL, NULL, 0, 150 * effectsScale); + + player->stateFlags2 &= ~(PLAYER_STATE2_HOPPING); + + Player_PlaySfx(&player->actor, NA_SE_PL_SKIP); + } + } + }); +} + +static void DrawMenu() { + ImGui::SeparatorText(AUTHOR); + + if (UIWidgets::EnhancementCheckbox("Roc's Feather", CVAR("RocsFeather"))) { + ConfigurationChanged(); + } + UIWidgets::Tooltip("Using Nayru's Love will now act as Roc's Feather instead! No magic required."); +} + +static void RegisterMod() { + // #region Leave this alone unless you know what you are doing + ConfigurationChanged(); + // #endregion +} + +static Holiday holiday(DrawMenu, RegisterMod); diff --git a/soh/soh/Enhancements/game-interactor/GameInteractor.h b/soh/soh/Enhancements/game-interactor/GameInteractor.h index 0225d8585..d33ff090c 100644 --- a/soh/soh/Enhancements/game-interactor/GameInteractor.h +++ b/soh/soh/Enhancements/game-interactor/GameInteractor.h @@ -344,6 +344,7 @@ typedef enum { VB_PLAY_THROW_ANIMATION, VB_INFLICT_VOID_DAMAGE, VB_GANONDORF_DECIDE_TO_FIGHT, + VB_USE_ITEM, /*** Give Items ***/ diff --git a/soh/src/overlays/actors/ovl_player_actor/z_player.c b/soh/src/overlays/actors/ovl_player_actor/z_player.c index 28ef6e29d..151a47c13 100644 --- a/soh/src/overlays/actors/ovl_player_actor/z_player.c +++ b/soh/src/overlays/actors/ovl_player_actor/z_player.c @@ -2572,8 +2572,10 @@ void Player_ProcessItemButtons(Player* this, PlayState* play) { sHeldItemButtonIsHeldDown = true; } } else { - this->heldItemButton = i; - Player_UseItem(play, this, item); + if (GameInteractor_Should(VB_USE_ITEM, true, &item)) { + this->heldItemButton = i; + Player_UseItem(play, this, item); + } } } } From 60a70bc795fc48e18c700a1e34003f7179c33231 Mon Sep 17 00:00:00 2001 From: Caladius Date: Mon, 2 Dec 2024 10:44:35 -0500 Subject: [PATCH 12/18] Ornament Exchange (#4582) --- soh/soh/Enhancements/Holiday/Caladius.cpp | 87 ++++++++++++++++--- soh/soh/Enhancements/Holiday/Holiday.hpp | 2 + soh/soh/Enhancements/Holiday/ItsHeckinPat.cpp | 6 +- 3 files changed, 79 insertions(+), 16 deletions(-) diff --git a/soh/soh/Enhancements/Holiday/Caladius.cpp b/soh/soh/Enhancements/Holiday/Caladius.cpp index fe8629a1c..5c4b76499 100644 --- a/soh/soh/Enhancements/Holiday/Caladius.cpp +++ b/soh/soh/Enhancements/Holiday/Caladius.cpp @@ -3,6 +3,8 @@ #include "soh/Notification/Notification.h" #include "soh/Enhancements/gameplaystats.h" #include "soh/Enhancements/game-interactor/GameInteractor.h" +#include "soh/Enhancements/custom-message/CustomMessageManager.h" +#include "soh/Enhancements/randomizer/randomizer.h" extern "C" { #include "macros.h" @@ -15,9 +17,12 @@ uint64_t GetUnixTimestamp(); #define AUTHOR "Caladius" #define CVAR(v) "gHoliday." AUTHOR "." v -bool isDisabled = false; +bool isFeverDisabled = false; +bool isExchangeDisabled = false; float fontScale = 1.0f; +extern GetItemEntry vanillaQueuedItemEntry; + std::vector boulderList = { ACTOR_OBJ_BOMBIWA, ACTOR_BG_ICE_SHELTER, ACTOR_EN_ISHI, ACTOR_OBJ_HAMISHI }; std::string formatTimestampIceTrapFever(uint32_t value) { @@ -69,18 +74,61 @@ void RandomizeBoulder(Actor* refActor) { param = 3; } yAdj = ActorSnapToFloor(actor, gPlayState, 0.0f); - //if (actor->id != ACTOR_EN_ISHI && boulderList[roll] == ACTOR_EN_ISHI) { - // yAdj = 20; - //} - //if (actor->id == ACTOR_EN_ISHI && boulderList[roll] != ACTOR_EN_ISHI) { - // yAdj = -20; - //} Actor_Spawn(&gPlayState->actorCtx, gPlayState, boulderList[roll], actor->world.pos.x, ActorSnapToFloor(actor, gPlayState, 0.0f), actor->world.pos.z, 0, 0, 0, param, false); Actor_Kill(actor); } +static void OnPresentChange() { + isExchangeDisabled = !CVarGetInteger(CVAR("OrnExch.Enabled"), 0); + COND_ID_HOOK(OnActorKill, ACTOR_EN_OE2, CVarGetInteger(CVAR("OrnExch.Enabled"), 0), [](void* actorRef) { + uint32_t giftsCollected = CVarGetInteger(CVAR("GiftsCollected"), 0); + giftsCollected++; + CVarSetInteger(CVAR("GiftsCollected"), giftsCollected); + Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesOnNextTick(); + std::string msg = std::to_string(giftsCollected).c_str(); + msg += " Gifts in Inventory."; + Notification::Emit({ + .itemIcon = "RG_TRIFORCE_PIECE", + .message = msg + }); + }); + COND_ID_HOOK(OnOpenText, 0x204A, CVarGetInteger(CVAR("OrnExch.Enabled"), 0), [](u16 * textId, bool* loadFromMessageTable) { + auto messageEntry = CustomMessage(""); + bool reduceGifts = false; + uint32_t giftsCollected = CVarGetInteger(CVAR("GiftsCollected"), 0); + uint32_t giftsRequired = CVarGetInteger(CVAR("OrnExch.Amount"), 15); + if (giftsCollected < giftsRequired) { + std::string msg = "You only have %r " + std::to_string(giftsCollected) + "%w If you bring me %g" + + std::to_string(giftsRequired) + "%w I'll give you a reward!"; + messageEntry = CustomMessage(msg); + } else { + std::string msg = "A present? And %g" + std::to_string(giftsRequired) + + "%w to boot? Here's your reward, bring me more if you find any!"; + messageEntry = CustomMessage(msg); + reduceGifts = true; + } + messageEntry.AutoFormat(); + messageEntry.LoadIntoFont(); + *loadFromMessageTable = false; + + if (reduceGifts) { + vanillaQueuedItemEntry = Rando::StaticData::RetrieveItem(RG_TRIFORCE_PIECE).GetGIEntry_Copy(); + giftsCollected -= giftsRequired; + CVarSetInteger(CVAR("GiftsCollected"), giftsCollected); + Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesOnNextTick(); + + std::string msg = std::to_string(giftsCollected).c_str(); + msg += " Gifts in Inventory."; + Notification::Emit({ + .itemIcon = "RG_TRIFORCE_PIECE", + .message = msg + }); + } + }); +} + static void OnBlitzChange() { COND_HOOK(OnSceneSpawnActors, CVarGetInteger(CVAR("Blitz.Enabled"), 0), []() { if (!gPlayState) { @@ -102,7 +150,7 @@ static void OnBlitzChange() { } static void OnFeverConfigurationChanged() { - isDisabled = !CVarGetInteger(CVAR("Fever.Enabled"), 0); + isFeverDisabled = !CVarGetInteger(CVAR("Fever.Enabled"), 0); fontScale = CVarGetFloat(CVAR("FontScale"), 1.0f); if (fontScale < 1.0f) { fontScale = 1.0f; @@ -146,26 +194,39 @@ static void DrawMenu() { } UIWidgets::Tooltip("Can you beat your objective before the Fever sets in?/n" "- Obtaining Ice Traps extends your timer."); - ImGui::Text("Options"); - if (UIWidgets::PaddedEnhancementSliderFloat("", "##FontScale", CVAR("FontScale"), - 1.0f, 5.0f, "%.1fx", 1.0f, false, false, false, false, isDisabled)) { + if (UIWidgets::EnhancementSliderFloat("", "##FontScale", CVAR("FontScale"), + 1.0f, 5.0f, "Font: %.1fx", 1.0f, false, false, isFeverDisabled)) { OnFeverConfigurationChanged(); } UIWidgets::PaddedEnhancementSliderInt("Starting Timer: %d minutes", "##StartTime", CVAR("StartTimer"), - 5, 30, "", 15, true, true, false, isDisabled); + 5, 30, "", 15, true, true, false, isFeverDisabled); UIWidgets::PaddedEnhancementSliderInt("Time Extensions: %d minutes", "##ExtendTime", CVAR("ExtendTimer"), - 1, 10, "", 5, true, true, false, isDisabled); + 1, 10, "", 5, true, true, false, isFeverDisabled); UIWidgets::PaddedSeparator(); if (UIWidgets::EnhancementCheckbox("Boulder Blitz", CVAR("Blitz.Enabled"))) { OnBlitzChange(); } + UIWidgets::PaddedSeparator(); + + if (UIWidgets::EnhancementCheckbox("Ornament Exchange", CVAR("OrnExch.Enabled"))) { + OnPresentChange(); + bool toggle = CVarGetInteger(CVAR("OrnExch.Enabled"), 0); + CVarSetInteger("gHoliday.ItsHeckinPat.GiftsForNPCs", toggle); + OnConfigChanged(); + } + UIWidgets::Tooltip("See Malon as Young Link in Lon Lon Ranch to exchange Gifts for Ornaments!\n" + "Note: Enabling this will set \"Gifts For NPCs\" to match."); + UIWidgets::PaddedEnhancementSliderInt("Gifts Required: %d Gifts", "##GiftsReq", CVAR("OrnExch.Amount"), + 5, 30, "", 15, true, true, false, isExchangeDisabled); + } static void RegisterMod() { OnFeverConfigurationChanged(); OnBlitzChange(); + OnPresentChange(); } static Holiday holiday(DrawMenu, RegisterMod); diff --git a/soh/soh/Enhancements/Holiday/Holiday.hpp b/soh/soh/Enhancements/Holiday/Holiday.hpp index 9a6717060..e16bd005a 100644 --- a/soh/soh/Enhancements/Holiday/Holiday.hpp +++ b/soh/soh/Enhancements/Holiday/Holiday.hpp @@ -8,6 +8,8 @@ #include "soh/Enhancements/game-interactor/GameInteractor.h" #include "soh/Enhancements/cosmetics/CosmeticsEditor.h" +void OnConfigChanged(); + inline std::vector> holidayDrawFuncs = {}; inline std::vector> holidayRegisterFuncs = {}; diff --git a/soh/soh/Enhancements/Holiday/ItsHeckinPat.cpp b/soh/soh/Enhancements/Holiday/ItsHeckinPat.cpp index 778b260ec..9f3192a80 100644 --- a/soh/soh/Enhancements/Holiday/ItsHeckinPat.cpp +++ b/soh/soh/Enhancements/Holiday/ItsHeckinPat.cpp @@ -74,7 +74,7 @@ void Present_Destroy(Actor* actor, PlayState* play) { static CollisionPoly presentPoly; static f32 raycastResult; -static void OnConfigurationChanged() { +void OnConfigChanged() { COND_HOOK(OnSceneSpawnActors, CVarGetInteger(CVAR("GiftsForNPCs"), 0), []() { presents.clear(); Vec3f pos; @@ -134,13 +134,13 @@ static void OnConfigurationChanged() { static void DrawMenu() { ImGui::SeparatorText(AUTHOR); if (UIWidgets::EnhancementCheckbox("Gifts for NPCs", CVAR("GiftsForNPCs"))) { - OnConfigurationChanged(); + OnConfigChanged(); } } static void RegisterMod() { // #region Leave this alone unless you know what you are doing - OnConfigurationChanged(); + OnConfigChanged(); // #endregion // TODO: Anything you want to run once on startup From 05539fee03474618a96fc640c51a904f7aa64bcb Mon Sep 17 00:00:00 2001 From: Garrett Cox Date: Wed, 4 Dec 2024 20:26:11 -0600 Subject: [PATCH 13/18] Add custom collectible thing --- soh/include/z64item.h | 8 +- .../custom-collectible/CustomCollectible.cpp | 209 ++++++++++++++++++ .../custom-collectible/CustomCollectible.h | 24 ++ soh/soh/OTRGlobals.cpp | 3 + soh/src/code/z_draw.c | 3 + soh/src/code/z_parameter.c | 11 + .../actors/ovl_player_actor/z_player.c | 1 + 7 files changed, 256 insertions(+), 3 deletions(-) create mode 100644 soh/soh/Enhancements/custom-collectible/CustomCollectible.cpp create mode 100644 soh/soh/Enhancements/custom-collectible/CustomCollectible.h diff --git a/soh/include/z64item.h b/soh/include/z64item.h index 214d82711..1731800aa 100644 --- a/soh/include/z64item.h +++ b/soh/include/z64item.h @@ -306,6 +306,7 @@ typedef enum { /* 0x99 */ ITEM_STICK_UPGRADE_30, /* 0x9A */ ITEM_NUT_UPGRADE_30, /* 0x9B */ ITEM_NUT_UPGRADE_40, + /* 0x9C */ ITEM_SHIP, // SOH [Enhancement] Added to enable custom item gives /* 0xFC */ ITEM_LAST_USED = 0xFC, /* 0xFE */ ITEM_NONE_FE = 0xFE, /* 0xFF */ ITEM_NONE = 0xFF @@ -455,9 +456,10 @@ typedef enum { /* 0x79 */ GI_NUT_UPGRADE_30, /* 0x7A */ GI_NUT_UPGRADE_40, /* 0x7B */ GI_BULLET_BAG_50, - /* 0x7C */ GI_ICE_TRAP, // freezes link when opened from a chest - /* 0x7D */ GI_TEXT_0, // no model appears over Link, shows text id 0 (pocket egg) - /* 0x84 */ GI_MAX + /* 0x7C */ GI_SHIP, // SOH [Enhancement] Added to enable custom item gives + /* 0x7D */ GI_ICE_TRAP, // freezes link when opened from a chest + /* 0x7E */ GI_TEXT_0, // no model appears over Link, shows text id 0 (pocket egg) + /* 0x7F */ GI_MAX } GetItemID; typedef enum { diff --git a/soh/soh/Enhancements/custom-collectible/CustomCollectible.cpp b/soh/soh/Enhancements/custom-collectible/CustomCollectible.cpp new file mode 100644 index 000000000..7bbbd8b55 --- /dev/null +++ b/soh/soh/Enhancements/custom-collectible/CustomCollectible.cpp @@ -0,0 +1,209 @@ +#include "CustomCollectible.h" +#include +#include "soh/Enhancements/game-interactor/GameInteractor.h" +#include "soh/Enhancements/randomizer/3drando/random.hpp" +#include "soh/frame_interpolation.h" +#include "soh/Enhancements/custom-message/CustomMessageManager.h" + +extern "C" { +#include "z64actor.h" +#include "functions.h" +#include "variables.h" +#include "macros.h" +#include "objects/object_md/object_md.h" +extern PlayState* gPlayState; +} + +EnItem00* CustomCollectible::Spawn(f32 posX, f32 posY, f32 posZ, s16 rot, s16 flags, s16 params, ActorFunc actionFunc, + ActorFunc drawFunc) { + if (!gPlayState) { + return nullptr; + } + + Actor* actor = Actor_Spawn(&gPlayState->actorCtx, gPlayState, ACTOR_EN_ITEM00, posX, posY, posZ, flags, rot, params, ITEM00_NONE, 0); + EnItem00* enItem00 = (EnItem00*)actor; + + if (actionFunc != NULL) { + enItem00->actionFunc = (EnItem00ActionFunc)actionFunc; + } + + if (drawFunc != NULL) { + actor->draw = drawFunc; + } + + return enItem00; +} + +void CustomCollectible_Init(Actor* actor, PlayState* play) { + EnItem00* enItem00 = (EnItem00*)actor; + + if (CUSTOM_ITEM_FLAGS & CustomCollectible::STOP_BOBBING) { + actor->shape.yOffset = 1250.0f; + } else { + actor->shape.yOffset = (Math_SinS(actor->shape.rot.y) * 150.0f) + 1250.0f; + } + + if (CUSTOM_ITEM_FLAGS & CustomCollectible::HIDE_TILL_OVERHEAD) { + Actor_SetScale(actor, 0.0f); + } else { + Actor_SetScale(actor, 0.015f); + } + + if (CUSTOM_ITEM_FLAGS & CustomCollectible::KEEP_ON_PLAYER) { + Math_Vec3f_Copy(&actor->world.pos, &GET_PLAYER(play)->actor.world.pos); + } + + if (CUSTOM_ITEM_FLAGS & CustomCollectible::TOSS_ON_SPAWN) { + actor->velocity.y = 8.0f; + actor->speedXZ = 2.0f; + actor->gravity = -1.4f; + actor->world.rot.y = Rand_ZeroOne() * 40000.0f; + } + + enItem00->unk_15A = -1; +} + +// By default this will just assume the GID was passed in as the rot z, if you want different functionality you should +// override the draw +void CustomCollectible_Draw(Actor* actor, PlayState* play) { + Matrix_Scale(30.0f, 30.0f, 30.0f, MTXMODE_APPLY); + GetItem_Draw(play, CUSTOM_ITEM_PARAM); +} + +void CustomCollectible_Update(Actor* actor, PlayState* play) { + EnItem00* enItem00 = (EnItem00*)actor; + Player* player = GET_PLAYER(play); + + if (!(CUSTOM_ITEM_FLAGS & CustomCollectible::STOP_SPINNING)) { + actor->shape.rot.y += 960; + } + + if (CUSTOM_ITEM_FLAGS & CustomCollectible::STOP_BOBBING) { + actor->shape.yOffset = 1250.0f; + } else { + actor->shape.yOffset = (Math_SinS(actor->shape.rot.y) * 150.0f) + 1250.0f; + } + + if (CUSTOM_ITEM_FLAGS & CustomCollectible::HIDE_TILL_OVERHEAD) { + Actor_SetScale(actor, 0.0f); + } + + if (CUSTOM_ITEM_FLAGS & CustomCollectible::KEEP_ON_PLAYER) { + actor->gravity = 0.0f; + Math_Vec3f_Copy(&actor->world.pos, &GET_PLAYER(play)->actor.world.pos); + } + + if (CUSTOM_ITEM_FLAGS & CustomCollectible::KILL_ON_TOUCH) { + // Pretty self explanatory, if the player is within range, kill the actor and call the action function + if ((actor->xzDistToPlayer <= 50.0f) && (fabsf(actor->yDistToPlayer) <= fabsf(20.0f))) { + if (enItem00->actionFunc != NULL) { + enItem00->actionFunc(enItem00, play); + CUSTOM_ITEM_FLAGS |= CustomCollectible::CALLED_ACTION; + } + Actor_Kill(actor); + } + } else if (CUSTOM_ITEM_FLAGS & CustomCollectible::GIVE_OVERHEAD) { + // If the item hasn't been picked up (unk_15A == -1) and the player is within range + if (enItem00->unk_15A == -1 && (actor->xzDistToPlayer <= 50.0f) && + (fabsf(actor->yDistToPlayer) <= fabsf(20.0f))) { + // Fire the action function + if (enItem00->actionFunc != NULL) { + enItem00->actionFunc(enItem00, play); + CUSTOM_ITEM_FLAGS |= CustomCollectible::CALLED_ACTION; + } + Sfx_PlaySfxCentered(NA_SE_SY_GET_ITEM); + // Set the unk_15A to 15, this indicates the item has been picked up and will start the overhead animation + enItem00->unk_15A = 15; + CUSTOM_ITEM_FLAGS |= CustomCollectible::STOP_BOBBING; + CUSTOM_ITEM_FLAGS |= CustomCollectible::KEEP_ON_PLAYER; + } + + // If the item has been picked up + if (enItem00->unk_15A > 0) { + // Reduce the size a bit, but also makes it visible for HIDE_TILL_OVERHEAD + Actor_SetScale(actor, 0.010f); + + // Decrement the unk_15A, which will be used to bob the item up and down + enItem00->unk_15A--; + + // Account for the different heights of the player forms + f32 height = 45.0f; + // TODO: Check for adult? + + // Bob the item up and down + actor->world.pos.y += (height + (Math_SinS(enItem00->unk_15A * 15000) * (enItem00->unk_15A * 0.3f))); + } + + // Finally, once the bobbing animation is done, kill the actor + if (enItem00->unk_15A == 0) { + Actor_Kill(actor); + } + } else if (CUSTOM_ITEM_FLAGS & CustomCollectible::GIVE_ITEM_CUTSCENE) { + // If the item hasn't been picked up and the player is within range + if (!Actor_HasParent(actor, play) && enItem00->unk_15A == -1) { + Actor_OfferGetItem(actor, play, GI_SHIP, 50.0f, 20.0f); + } else { + if (enItem00->unk_15A == -1) { + CUSTOM_ITEM_FLAGS |= CustomCollectible::STOP_BOBBING; + CUSTOM_ITEM_FLAGS |= CustomCollectible::KEEP_ON_PLAYER; + CUSTOM_ITEM_FLAGS |= CustomCollectible::HIDE_TILL_OVERHEAD; + } + + // Begin incrementing the unk_15A, indicating the item has been picked up + enItem00->unk_15A++; + + // For the first 20 frames, wait while the player's animation plays + if (enItem00->unk_15A >= 20) { + // After the first 20 frames, show the item and call the action function + if (enItem00->unk_15A == 20 && enItem00->actionFunc != NULL) { + enItem00->actionFunc(enItem00, play); + CUSTOM_ITEM_FLAGS |= CustomCollectible::CALLED_ACTION; + } + // Override the bobbing animation to be a fixed height + actor->shape.yOffset = 900.0f; + Actor_SetScale(actor, 0.007f); + + f32 height = 45.0f; + // TODO: Check for adult? + + actor->world.pos.y += height; + } + + // Once the player is no longer in the "Give Item" state, kill the actor + if (!(player->stateFlags1 & PLAYER_STATE1_GETTING_ITEM)) { + Actor_Kill(actor); + } + } + } + + if (actor->gravity != 0.0f) { + Actor_MoveForward(actor); + Actor_UpdateBgCheckInfo(play, actor, 20.0f, 15.0f, 15.0f, 0x1D); + } + + if (actor->bgCheckFlags & 0x0003) { + actor->speedXZ = 0.0f; + } + + Collider_UpdateCylinder(actor, &enItem00->collider); + CollisionCheck_SetAC(play, &play->colChkCtx, &enItem00->collider.base); +} + +void CustomCollectible::RegisterHooks() { + GameInteractor::Instance->RegisterGameHookForID( + ACTOR_EN_ITEM00, [](void* actorRef, bool* should) { + Actor* actor = (Actor*)actorRef; + if (actor->params != ITEM00_NONE) { + return; + } + + actor->init = CustomCollectible_Init; + actor->update = CustomCollectible_Update; + actor->draw = CustomCollectible_Draw; + actor->destroy = NULL; + + // Set the rotX/rotZ back to 0, the original values can be accessed from actor->home + actor->world.rot.x = 0; + actor->world.rot.z = 0; + }); +} diff --git a/soh/soh/Enhancements/custom-collectible/CustomCollectible.h b/soh/soh/Enhancements/custom-collectible/CustomCollectible.h new file mode 100644 index 000000000..ff2549b0f --- /dev/null +++ b/soh/soh/Enhancements/custom-collectible/CustomCollectible.h @@ -0,0 +1,24 @@ +extern "C" { +#include "z64actor.h" +} + +#define CUSTOM_ITEM_FLAGS (actor->home.rot.x) +#define CUSTOM_ITEM_PARAM (actor->home.rot.z) + +namespace CustomCollectible { + +enum CustomCollectibleFlags : int16_t { + KILL_ON_TOUCH = 1 << 0, // 0000 0000 0000 0001 + GIVE_OVERHEAD = 1 << 1, // 0000 0000 0000 0010 + GIVE_ITEM_CUTSCENE = 1 << 2, // 0000 0000 0000 0100 + HIDE_TILL_OVERHEAD = 1 << 3, // 0000 0000 0000 1000 + KEEP_ON_PLAYER = 1 << 4, // 0000 0000 0001 0000 + STOP_BOBBING = 1 << 5, // 0000 0000 0010 0000 + STOP_SPINNING = 1 << 6, // 0000 0000 0100 0000 + CALLED_ACTION = 1 << 7, // 0000 0000 1000 0000 + TOSS_ON_SPAWN = 1 << 8, // 0000 0001 0000 0000 +}; +void RegisterHooks(); +EnItem00* Spawn(f32 posX, f32 posY, f32 posZ, s16 rot, s16 flags, s16 params, ActorFunc actionFunc = NULL, + ActorFunc drawFunc = NULL); +}; // namespace CustomCollectible diff --git a/soh/soh/OTRGlobals.cpp b/soh/soh/OTRGlobals.cpp index 0ae870a33..87e1fee5a 100644 --- a/soh/soh/OTRGlobals.cpp +++ b/soh/soh/OTRGlobals.cpp @@ -84,6 +84,7 @@ Sail* Sail::Instance; #include "Enhancements/mods.h" #include "Enhancements/game-interactor/GameInteractor.h" #include "Enhancements/randomizer/draw.h" +#include "Enhancements/custom-collectible/CustomCollectible.h" #include // Resource Types/Factories @@ -703,6 +704,7 @@ extern "C" void VanillaItemTable_Init() { GET_ITEM(ITEM_NUT_UPGRADE_30, OBJECT_GI_NUTS, GID_NUTS, 0xA7, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_LESSER, MOD_NONE, GI_NUT_UPGRADE_30), GET_ITEM(ITEM_NUT_UPGRADE_40, OBJECT_GI_NUTS, GID_NUTS, 0xA8, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_LESSER, MOD_NONE, GI_NUT_UPGRADE_40), GET_ITEM(ITEM_BULLET_BAG_50, OBJECT_GI_DEKUPOUCH, GID_BULLET_BAG_50, 0x6C, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_NONE, GI_BULLET_BAG_50), + GET_ITEM(ITEM_SHIP, OBJECT_UNSET_16E, GID_MAXIMUM, 0x00, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_NONE, GI_SHIP), GET_ITEM_NONE, GET_ITEM_NONE, GET_ITEM_NONE // GI_MAX - if you need to add to this table insert it before this entry. @@ -1173,6 +1175,7 @@ extern "C" void InitOTR() { DebugConsole_Init(); InitMods(); + CustomCollectible::RegisterHooks(); ActorDB::AddBuiltInCustomActors(); // #region SOH [Randomizer] TODO: Remove these and refactor spoiler file handling for randomizer CVarClear(CVAR_GENERAL("RandomizerNewFileDropped")); diff --git a/soh/src/code/z_draw.c b/soh/src/code/z_draw.c index e27f230b1..caf31a234 100644 --- a/soh/src/code/z_draw.c +++ b/soh/src/code/z_draw.c @@ -399,6 +399,9 @@ DrawItemTableEntry sDrawItemTable[] = { * Calls the corresponding draw function for the given draw ID */ void GetItem_Draw(PlayState* play, s16 drawId) { + if (drawId < 0 || drawId >= GID_MAXIMUM) { + return; + } sDrawItemTable[drawId].drawFunc(play, drawId); } diff --git a/soh/src/code/z_parameter.c b/soh/src/code/z_parameter.c index be3a28442..71bc672ac 100644 --- a/soh/src/code/z_parameter.c +++ b/soh/src/code/z_parameter.c @@ -1891,6 +1891,12 @@ u8 Return_Item(u8 itemID, ModIndex modId, ItemID returnItem) { * @return u8 */ u8 Item_Give(PlayState* play, u8 item) { + // TODO: Add ShouldItemGive + // if (!GameInteractor_ShouldItemGive(item) || item == ITEM_SHIP) { + if (item == ITEM_SHIP) { + return ITEM_NONE; + } + //prevents getting sticks without the bag in case something got missed if ( IS_RANDO && @@ -2486,6 +2492,11 @@ u8 Item_CheckObtainability(u8 item) { s16 slot = SLOT(item); s32 temp; + // SOH [Enhancements] Added to enable custom item gives + if (item == ITEM_SHIP) { + return ITEM_NONE; + } + if (item >= ITEM_STICKS_5) { slot = SLOT(sExtraItemBases[item - ITEM_STICKS_5]); } diff --git a/soh/src/overlays/actors/ovl_player_actor/z_player.c b/soh/src/overlays/actors/ovl_player_actor/z_player.c index 9275f9cab..11ed30ad8 100644 --- a/soh/src/overlays/actors/ovl_player_actor/z_player.c +++ b/soh/src/overlays/actors/ovl_player_actor/z_player.c @@ -7312,6 +7312,7 @@ s32 Player_ActionHandler_2(Player* this, PlayState* play) { interactedActor->id == ACTOR_EN_ITEM00 && interactedActor->params != ITEM00_HEART_PIECE && interactedActor->params != ITEM00_SMALL_KEY && + interactedActor->params != ITEM00_NONE && interactedActor->params != ITEM00_SOH_GIVE_ITEM_ENTRY && interactedActor->params != ITEM00_SOH_GIVE_ITEM_ENTRY_GI ) || From a8f384047501ef39a6f233a2791d88480722093b Mon Sep 17 00:00:00 2001 From: Archez Date: Sun, 15 Dec 2024 23:01:00 -0500 Subject: [PATCH 14/18] let-it-snow: Snow Golems (Skeleton override) (#4695) * Add Snow Golems (Skeleton override) * update snowball to use new snowball DL --- .../objects/custom_snowball/LightNoise.rgba32 | Bin 0 -> 4188 bytes .../objects/custom_snowball/mat_snowball_snow | 16 +++ .../custom/objects/custom_snowball/model.xml | 10 ++ .../custom/objects/custom_snowball/snowball | 10 ++ .../objects/custom_snowball/snowball_tri_0 | 47 +++++++ .../objects/custom_snowball/snowball_vtx_0 | 92 +++++++++++++ .../objects/custom_snowball/snowball_vtx_cull | 10 ++ soh/assets/soh_assets.h | 3 + soh/soh/Enhancements/Holiday/Archez.cpp | 123 ++++++++++++++++++ soh/soh/Enhancements/Holiday/Archez.h | 17 +++ .../game-interactor/GameInteractor.h | 3 + soh/src/code/z_player_lib.c | 13 ++ soh/src/code/z_skelanime.c | 63 ++++++--- .../ovl_Boss_Ganondrof/z_boss_ganondrof.c | 8 ++ .../actors/ovl_Boss_Goma/z_boss_goma.c | 5 + .../overlays/actors/ovl_Boss_Sst/z_boss_sst.c | 7 + .../overlays/actors/ovl_Boss_Tw/z_boss_tw.c | 9 ++ .../overlays/actors/ovl_Boss_Va/z_boss_va.c | 3 + .../actors/ovl_Door_Killer/z_door_killer.c | 3 + soh/src/overlays/actors/ovl_En_Am/z_en_am.c | 3 + .../overlays/actors/ovl_En_Arrow/z_en_arrow.c | 3 + .../actors/ovl_En_Bigokuta/z_en_bigokuta.c | 7 + .../overlays/actors/ovl_En_Door/z_en_door.c | 3 + soh/src/overlays/actors/ovl_En_Go/z_en_go.c | 27 +++- soh/src/overlays/actors/ovl_En_Go2/z_en_go2.c | 28 +++- .../overlays/actors/ovl_En_Hata/z_en_hata.c | 7 + .../actors/ovl_En_Heishi1/z_en_heishi1.c | 6 + .../actors/ovl_En_Heishi2/z_en_heishi2.c | 6 + .../actors/ovl_En_Heishi3/z_en_heishi3.c | 6 + .../actors/ovl_En_Heishi4/z_en_heishi4.c | 7 + soh/src/overlays/actors/ovl_En_Ik/z_en_ik.c | 12 ++ soh/src/overlays/actors/ovl_En_Jj/z_en_jj.c | 3 + soh/src/overlays/actors/ovl_En_Mb/z_en_mb.c | 20 ++- .../actors/ovl_En_Snowball/z_en_snowball.c | 8 +- .../overlays/actors/ovl_En_Test/z_en_test.c | 6 + .../actors/ovl_En_Torch2/z_en_torch2.c | 6 + soh/src/overlays/actors/ovl_En_Vm/z_en_vm.c | 3 + soh/src/overlays/actors/ovl_En_Zf/z_en_zf.c | 6 +- 38 files changed, 572 insertions(+), 37 deletions(-) create mode 100644 soh/assets/custom/objects/custom_snowball/LightNoise.rgba32 create mode 100644 soh/assets/custom/objects/custom_snowball/mat_snowball_snow create mode 100644 soh/assets/custom/objects/custom_snowball/model.xml create mode 100644 soh/assets/custom/objects/custom_snowball/snowball create mode 100644 soh/assets/custom/objects/custom_snowball/snowball_tri_0 create mode 100644 soh/assets/custom/objects/custom_snowball/snowball_vtx_0 create mode 100644 soh/assets/custom/objects/custom_snowball/snowball_vtx_cull create mode 100644 soh/soh/Enhancements/Holiday/Archez.cpp create mode 100644 soh/soh/Enhancements/Holiday/Archez.h diff --git a/soh/assets/custom/objects/custom_snowball/LightNoise.rgba32 b/soh/assets/custom/objects/custom_snowball/LightNoise.rgba32 new file mode 100644 index 0000000000000000000000000000000000000000..73bcf2a59c1a8ae147f592dada13c779cef4b9fb GIT binary patch literal 4188 zcma*o!EsYt5QO1N282K+tXQ*QK{zBt3WP!gwvc3%WV>u%>l6H{DXn-_Q!{6#r@PP5 zeRx@x<@=X!Uq77lpI<+Ji*xzk|JnQWFa9q5_`EFV__!>G!(n}Vd|Z#m)@Ev$<_`}K>)YGg1#9MP|Mm6tnql?KpP!#E7#wNIY1vCdwnrPUj7#3_c9#sZ z-EJ>+d@yP|_2S`GO)pJ2x?yD;Y2`z%HnVS6=(le+d;0wL2F~#I)h{nEm#h|c-7%j$ zJ2%e*Tp06q=fOIP3ESp9i^n!nz0CX0y5S#AOB(KcDvFPeZ@^+fm1x z9;|+z@&(sj)%tgLch|f026)oJ!I#Lx{r&y*jo|brCXM>C9xfSwUhJovmfY`_rgumS zULB8n2z%XCZMW!c=%%eF@+8x77qzgT7EkT;erEYftDF~ST+?5({NOde{hrtJfA;gK zZny8qj0gLAFlw6k;LW>}`^A@cvwE`qcGA~V!{XrGd*PoR?3v}Gop_ynL-EVF&GB}I z!_&-L(8`+`FZHUO)x61tzDO58P4n4vrXiaPd+^@3zH?e?ec{dHb?z-@FTOmOsp-zp z?IOTqWsf#Cln9eef-5akSjDA?XcJTC`Ve%s5f>o#4j!dKb zd#60h>B8Z07hHXt-L1QNzuWi0Vc&0?FFvOy`}00HXz1N~&@)d5r(Rxg=d<^SKMX&3 zdy_oY%ct}FX7Q!nuAabI^!H+7d9)L^9d(*<*T-e2Jvm+&XZ%yM+T8CI9@ZQ9ePy_* zr!Km07`r08H&pXo?YHVZ?A5mirziV9)V%>*+&FoY!af)lr^kzL#V%|)y)&(mK y?Y`md!t@5P_Vh)1d2QzG-u&|xHb1gmxU}?UZH~`7s?)~VF5dR4;qi2q?Ysjy|A!<1 literal 0 HcmV?d00001 diff --git a/soh/assets/custom/objects/custom_snowball/mat_snowball_snow b/soh/assets/custom/objects/custom_snowball/mat_snowball_snow new file mode 100644 index 000000000..49b24d2b5 --- /dev/null +++ b/soh/assets/custom/objects/custom_snowball/mat_snowball_snow @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/custom_snowball/model.xml b/soh/assets/custom/objects/custom_snowball/model.xml new file mode 100644 index 000000000..8e2e4aa6e --- /dev/null +++ b/soh/assets/custom/objects/custom_snowball/model.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/custom/objects/custom_snowball/snowball b/soh/assets/custom/objects/custom_snowball/snowball new file mode 100644 index 000000000..ca9fb8e40 --- /dev/null +++ b/soh/assets/custom/objects/custom_snowball/snowball @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/custom/objects/custom_snowball/snowball_tri_0 b/soh/assets/custom/objects/custom_snowball/snowball_tri_0 new file mode 100644 index 000000000..7c4fb871d --- /dev/null +++ b/soh/assets/custom/objects/custom_snowball/snowball_tri_0 @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/custom_snowball/snowball_vtx_0 b/soh/assets/custom/objects/custom_snowball/snowball_vtx_0 new file mode 100644 index 000000000..69080c089 --- /dev/null +++ b/soh/assets/custom/objects/custom_snowball/snowball_vtx_0 @@ -0,0 +1,92 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/custom_snowball/snowball_vtx_cull b/soh/assets/custom/objects/custom_snowball/snowball_vtx_cull new file mode 100644 index 000000000..8e2e4aa6e --- /dev/null +++ b/soh/assets/custom/objects/custom_snowball/snowball_vtx_cull @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/soh_assets.h b/soh/assets/soh_assets.h index 9e171a023..28902f3e7 100644 --- a/soh/assets/soh_assets.h +++ b/soh/assets/soh_assets.h @@ -59,6 +59,9 @@ static const ALIGN_ASSET(2) char gSkullTreasureChestFrontTex[] = dgSkullTreasure #define dgSkullTreasureChestSideAndTopTex "__OTR__objects/object_box/gSkullTreasureChestSideAndTopTex" static const ALIGN_ASSET(2) char gSkullTreasureChestSideAndTopTex[] = dgSkullTreasureChestSideAndTopTex; +#define dgSnowballDL "__OTR__objects/custom_snowball/snowball" +static const ALIGN_ASSET(2) char gSnowballDL[] = dgSnowballDL; + #define dgTitleRandomizerSubtitleTex "__OTR__objects/object_mag/gTitleRandomizerSubtitleTex" static const ALIGN_ASSET(2) char gTitleRandomizerSubtitleTex[] = dgTitleRandomizerSubtitleTex; diff --git a/soh/soh/Enhancements/Holiday/Archez.cpp b/soh/soh/Enhancements/Holiday/Archez.cpp new file mode 100644 index 000000000..0665c9d29 --- /dev/null +++ b/soh/soh/Enhancements/Holiday/Archez.cpp @@ -0,0 +1,123 @@ +#include "Holiday.hpp" +#include "Archez.h" +#include +#include "soh/UIWidgets.hpp" +#include "soh/Enhancements/game-interactor/GameInteractor.h" +#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" +#include "soh_assets.h" + +extern "C" { +#include "macros.h" +#include "functions.h" +#include "variables.h" +#include "objects/object_goroiwa/object_goroiwa.h" + +extern PlayState* gPlayState; +} + +#define AUTHOR "Archez" +#define CVAR(v) "gHoliday." AUTHOR "." v + +static bool sSkipNextLimb = false; +static bool sSkipNextSkeleton = false; + +extern "C" void SkipOverrideNextLimb() { + sSkipNextLimb = true; +} + +extern "C" void SkipOverrideNextSkeleton() { + sSkipNextSkeleton = true; +} + +extern "C" void ClearOverrideSkips() { + sSkipNextLimb = false; + sSkipNextSkeleton = false; +} + +static void ConfigurationChanged() { + COND_VB_SHOULD(VB_DRAW_SKEL_LIMB, CVarGetInteger(CVAR("SnowGolems"), 0), { + if (!*should) { + return; + } + + if (sSkipNextLimb) { + sSkipNextLimb = false; + return; + } + + if (sSkipNextSkeleton) { + return; + } + + Gfx** gfxP = va_arg(args, Gfx**); + void* dList = va_arg(args, void*); + + *should = false; + + Gfx* gfx = *gfxP; + + Matrix_Push(); + + Matrix_Scale(0.55f, 0.55f, 0.55f, MTXMODE_APPLY); + gSPMatrix(gfx++, Matrix_NewMtx(gPlayState->state.gfxCtx, (char*)__FILE__, __LINE__), G_MTX_LOAD); + gSPDisplayList(gfx++, (Gfx*)gSnowballDL); + + Matrix_Pop(); + + gSPMatrix(gfx++, Matrix_NewMtx(gPlayState->state.gfxCtx, (char*)__FILE__, __LINE__), G_MTX_LOAD); + + *gfxP = gfx; + }); + + COND_VB_SHOULD(VB_DRAW_SKEL_FLEX_LIMB, CVarGetInteger(CVAR("SnowGolems"), 0), { + if (!*should) { + return; + } + + if (sSkipNextLimb) { + sSkipNextLimb = false; + } + + if (sSkipNextSkeleton) { + return; + } + + Gfx** gfxP = va_arg(args, Gfx**); + void* dList = va_arg(args, void*); + Mtx* mtx = va_arg(args, Mtx*); + + *should = false; + + Gfx* gfx = *gfxP; + MtxF mtxF; + + Matrix_Push(); + Matrix_MtxToMtxF(mtx, &mtxF); + Matrix_Put(&mtxF); + + Matrix_Scale(0.55f, 0.55f, 0.55f, MTXMODE_APPLY); + gSPMatrix(gfx++, Matrix_NewMtx(gPlayState->state.gfxCtx, (char*)__FILE__, __LINE__), G_MTX_LOAD); + gSPDisplayList(gfx++, (Gfx*)gSnowballDL); + + Matrix_Pop(); + + gSPMatrix(gfx++, mtx, G_MTX_LOAD); + + *gfxP = gfx; + }); +} + +static void DrawMenu() { + ImGui::SeparatorText(AUTHOR); + + if (UIWidgets::EnhancementCheckbox("Snow Golems", CVAR("SnowGolems"))) { + ConfigurationChanged(); + } + UIWidgets::Tooltip("Overrides most charactor skeletons with snow balls to make them look like Snow Golems"); +} + +static void RegisterMod() { + ConfigurationChanged(); +} + +static Holiday holiday(DrawMenu, RegisterMod); diff --git a/soh/soh/Enhancements/Holiday/Archez.h b/soh/soh/Enhancements/Holiday/Archez.h new file mode 100644 index 000000000..93bd27457 --- /dev/null +++ b/soh/soh/Enhancements/Holiday/Archez.h @@ -0,0 +1,17 @@ +#ifndef ARCHEZ_H +#define ARCHEZ_H + + +#ifdef __cplusplus +extern "C" { +#endif + +void SkipOverrideNextLimb(); +void SkipOverrideNextSkeleton(); +void ClearOverrideSkips(); + +#ifdef __cplusplus +} +#endif + +#endif // ARCHEZ_H diff --git a/soh/soh/Enhancements/game-interactor/GameInteractor.h b/soh/soh/Enhancements/game-interactor/GameInteractor.h index 105a44334..1fb5d2d90 100644 --- a/soh/soh/Enhancements/game-interactor/GameInteractor.h +++ b/soh/soh/Enhancements/game-interactor/GameInteractor.h @@ -502,6 +502,9 @@ typedef enum { // Vanilla condition: Actor is ACTOR_EN_ELF, ACTOR_EN_FISH, ACTOR_EN_ICE_HONO, or ACTOR_EN_INSECT // Opt: *Actor VB_BOTTLE_ACTOR, + + VB_DRAW_SKEL_LIMB, + VB_DRAW_SKEL_FLEX_LIMB, } GIVanillaBehavior; #ifdef __cplusplus diff --git a/soh/src/code/z_player_lib.c b/soh/src/code/z_player_lib.c index 52a2d49fa..576bf1eaf 100644 --- a/soh/src/code/z_player_lib.c +++ b/soh/src/code/z_player_lib.c @@ -12,6 +12,7 @@ #include #include +#include "soh/Enhancements/Holiday/Archez.h" typedef struct { /* 0x00 */ u8 flag; @@ -1422,6 +1423,10 @@ s32 Player_OverrideLimbDrawGameplayDefault(PlayState* play, s32 limbIndex, Gfx** sLeftHandType = PLAYER_MODELTYPE_LH_CLOSED; } + if (sLeftHandType != PLAYER_MODELTYPE_LH_OPEN && sLeftHandType != PLAYER_MODELTYPE_LH_CLOSED) { + SkipOverrideNextLimb(); + } + *dList = ResourceMgr_LoadGfxByName(dLists[sDListsLodOffset]); } else if (limbIndex == PLAYER_LIMB_R_HAND) { Gfx** dLists = this->rightHandDLists; @@ -1433,8 +1438,13 @@ s32 Player_OverrideLimbDrawGameplayDefault(PlayState* play, s32 limbIndex, Gfx** sRightHandType = PLAYER_MODELTYPE_RH_CLOSED; } + if (sRightHandType != PLAYER_MODELTYPE_RH_OPEN && sRightHandType != PLAYER_MODELTYPE_RH_CLOSED) { + SkipOverrideNextLimb(); + } + *dList = ResourceMgr_LoadGfxByName(dLists[sDListsLodOffset]); } else if (limbIndex == PLAYER_LIMB_SHEATH) { + SkipOverrideNextLimb(); Gfx** dLists = this->sheathDLists; if ((this->sheathType == PLAYER_MODELTYPE_SHEATH_18) || (this->sheathType == PLAYER_MODELTYPE_SHEATH_19)) { @@ -1491,10 +1501,13 @@ s32 Player_OverrideLimbDrawGameplayFirstPerson(PlayState* play, s32 limbIndex, G } *dList = sFirstPersonLeftHandDLs[handOutDlIndex]; } else if (limbIndex == PLAYER_LIMB_R_SHOULDER) { + SkipOverrideNextLimb(); *dList = sFirstPersonRightShoulderDLs[gSaveContext.linkAge]; } else if (limbIndex == PLAYER_LIMB_R_FOREARM) { + SkipOverrideNextLimb(); *dList = sFirstPersonForearmDLs[gSaveContext.linkAge]; } else if (limbIndex == PLAYER_LIMB_R_HAND) { + SkipOverrideNextLimb(); s32 firstPersonWeaponIndex = gSaveContext.linkAge; if (CVarGetInteger(CVAR_ENHANCEMENT("BowSlingshotAmmoFix"), 0) || CVarGetInteger(CVAR_ENHANCEMENT("EquipmentAlwaysVisible"), 0)) { if (Player_HoldsBow(this)) { diff --git a/soh/src/code/z_skelanime.c b/soh/src/code/z_skelanime.c index e91de847b..d513973fb 100644 --- a/soh/src/code/z_skelanime.c +++ b/soh/src/code/z_skelanime.c @@ -5,6 +5,9 @@ #include #include "soh/OTRGlobals.h" #include "soh/ResourceManagerHelpers.h" +#include "soh/Enhancements/game-interactor/GameInteractor.h" +#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" +#include "soh/Enhancements/Holiday/Archez.h" #define ANIM_INTERP 1 @@ -45,7 +48,7 @@ void SkelAnime_DrawLimbLod(PlayState* play, s32 limbIndex, void** skeleton, Vec3 if ((overrideLimbDraw == NULL) || !overrideLimbDraw(play, limbIndex, &dList, &pos, &rot, arg)) { Matrix_TranslateRotateZYX(&pos, &rot); - if (dList != NULL) { + if (GameInteractor_Should(VB_DRAW_SKEL_LIMB, dList != NULL, &POLY_OPA_DISP, dList)) { gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), G_MTX_LOAD); gSPDisplayList(POLY_OPA_DISP++, dList); } @@ -105,7 +108,7 @@ void SkelAnime_DrawLod(PlayState* play, void** skeleton, Vec3s* jointTable, if ((overrideLimbDraw == NULL) || !overrideLimbDraw(play, 1, &dList, &pos, &rot, arg)) { Matrix_TranslateRotateZYX(&pos, &rot); - if (dList != NULL) { + if (GameInteractor_Should(VB_DRAW_SKEL_LIMB, dList != NULL, &POLY_OPA_DISP, dList)) { gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), G_MTX_LOAD); gSPDisplayList(POLY_OPA_DISP++, dList); } @@ -122,6 +125,8 @@ void SkelAnime_DrawLod(PlayState* play, void** skeleton, Vec3s* jointTable, Matrix_Pop(); CLOSE_DISPS(play->state.gfxCtx); + + ClearOverrideSkips(); } /** @@ -158,8 +163,10 @@ void SkelAnime_DrawFlexLimbLod(PlayState* play, s32 limbIndex, void** skeleton, MATRIX_TOMTX(*mtx); { OPEN_DISPS(play->state.gfxCtx); - gSPMatrix(POLY_OPA_DISP++, *mtx, G_MTX_LOAD); - gSPDisplayList(POLY_OPA_DISP++, newDList); + if (GameInteractor_Should(VB_DRAW_SKEL_LIMB, true, &POLY_OPA_DISP, newDList, *mtx)) { + gSPMatrix(POLY_OPA_DISP++, *mtx, G_MTX_LOAD); + gSPDisplayList(POLY_OPA_DISP++, newDList); + } CLOSE_DISPS(play->state.gfxCtx); } (*mtx)++; @@ -231,8 +238,10 @@ void SkelAnime_DrawFlexLod(PlayState* play, void** skeleton, Vec3s* jointTable, if (newDList != NULL) { MATRIX_TOMTX(mtx); gDPNoOpString(POLY_OPA_DISP++, "T5ST", 0); - gSPMatrix(POLY_OPA_DISP++, mtx, G_MTX_LOAD); - gSPDisplayList(POLY_OPA_DISP++, newDList); + if (GameInteractor_Should(VB_DRAW_SKEL_LIMB, true, &POLY_OPA_DISP, newDList, *mtx)) { + gSPMatrix(POLY_OPA_DISP++, mtx, G_MTX_LOAD); + gSPDisplayList(POLY_OPA_DISP++, newDList); + } mtx++; } else if (limbDList != NULL) { MATRIX_TOMTX(mtx); @@ -251,6 +260,8 @@ void SkelAnime_DrawFlexLod(PlayState* play, void** skeleton, Vec3s* jointTable, Matrix_Pop(); CLOSE_DISPS(play->state.gfxCtx); + + ClearOverrideSkips(); } /** @@ -276,7 +287,7 @@ void SkelAnime_DrawLimbOpa(PlayState* play, s32 limbIndex, void** skeleton, Vec3 if ((overrideLimbDraw == NULL) || !overrideLimbDraw(play, limbIndex, &dList, &pos, &rot, arg)) { Matrix_TranslateRotateZYX(&pos, &rot); - if (dList != NULL) { + if (GameInteractor_Should(VB_DRAW_SKEL_LIMB, dList != NULL, &POLY_OPA_DISP, dList)) { gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), G_MTX_LOAD); gSPDisplayList(POLY_OPA_DISP++, dList); } @@ -358,7 +369,7 @@ void SkelAnime_DrawOpa(PlayState* play, void** skeleton, Vec3s* jointTable, if ((overrideLimbDraw == NULL) || !overrideLimbDraw(play, 1, &dList, &pos, &rot, arg)) { Matrix_TranslateRotateZYX(&pos, &rot); - if (dList != NULL) { + if (GameInteractor_Should(VB_DRAW_SKEL_LIMB, dList != NULL, &POLY_OPA_DISP, dList)) { gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), G_MTX_LOAD); gSPDisplayList(POLY_OPA_DISP++, dList); } @@ -375,6 +386,8 @@ void SkelAnime_DrawOpa(PlayState* play, void** skeleton, Vec3s* jointTable, Matrix_Pop(); CLOSE_DISPS(play->state.gfxCtx); + + ClearOverrideSkips(); } /** @@ -409,8 +422,10 @@ void SkelAnime_DrawFlexLimbOpa(PlayState* play, s32 limbIndex, void** skeleton, Matrix_TranslateRotateZYX(&pos, &rot); if (newDList != NULL) { MATRIX_TOMTX(*limbMatricies); - gSPMatrix(POLY_OPA_DISP++, *limbMatricies, G_MTX_LOAD); - gSPDisplayList(POLY_OPA_DISP++, newDList); + if (GameInteractor_Should(VB_DRAW_SKEL_LIMB, true, &POLY_OPA_DISP, newDList, *limbMatricies)) { + gSPMatrix(POLY_OPA_DISP++, *limbMatricies, G_MTX_LOAD); + gSPDisplayList(POLY_OPA_DISP++, newDList); + } (*limbMatricies)++; } else if (limbDList != NULL) { MATRIX_TOMTX(*limbMatricies); @@ -478,8 +493,10 @@ void SkelAnime_DrawFlexOpa(PlayState* play, void** skeleton, Vec3s* jointTable, Matrix_TranslateRotateZYX(&pos, &rot); if (newDList != NULL) { MATRIX_TOMTX(mtx); - gSPMatrix(POLY_OPA_DISP++, mtx, G_MTX_LOAD); - gSPDisplayList(POLY_OPA_DISP++, newDList); + if (GameInteractor_Should(VB_DRAW_SKEL_LIMB, true, &POLY_OPA_DISP, newDList, *mtx)) { + gSPMatrix(POLY_OPA_DISP++, mtx, G_MTX_LOAD); + gSPDisplayList(POLY_OPA_DISP++, newDList); + } mtx++; } else if (limbDList != NULL) { MATRIX_TOMTX(mtx); @@ -498,6 +515,8 @@ void SkelAnime_DrawFlexOpa(PlayState* play, void** skeleton, Vec3s* jointTable, Matrix_Pop(); CLOSE_DISPS(play->state.gfxCtx); + + ClearOverrideSkips(); } /** @@ -576,7 +595,7 @@ Gfx* SkelAnime_DrawLimb(PlayState* play, s32 limbIndex, void** skeleton, Vec3s* if ((overrideLimbDraw == NULL) || !overrideLimbDraw(play, limbIndex, &dList, &pos, &rot, arg, &gfx)) { Matrix_TranslateRotateZYX(&pos, &rot); - if (dList != NULL) { + if (GameInteractor_Should(VB_DRAW_SKEL_LIMB, dList != NULL, &gfx, dList)) { gSPMatrix(gfx++, MATRIX_NEWMTX(play->state.gfxCtx), G_MTX_LOAD); gSPDisplayList(gfx++, dList); } @@ -634,7 +653,7 @@ Gfx* SkelAnime_Draw(PlayState* play, void** skeleton, Vec3s* jointTable, Overrid if ((overrideLimbDraw == NULL) || !overrideLimbDraw(play, 1, &dList, &pos, &rot, arg, &gfx)) { Matrix_TranslateRotateZYX(&pos, &rot); - if (dList != NULL) { + if (GameInteractor_Should(VB_DRAW_SKEL_LIMB, dList != NULL, &gfx, dList)) { gSPMatrix(gfx++, MATRIX_NEWMTX(play->state.gfxCtx), G_MTX_LOAD); gSPDisplayList(gfx++, dList); } @@ -651,6 +670,8 @@ Gfx* SkelAnime_Draw(PlayState* play, void** skeleton, Vec3s* jointTable, Overrid Matrix_Pop(); + ClearOverrideSkips(); + return gfx; } @@ -681,8 +702,10 @@ Gfx* SkelAnime_DrawFlexLimb(PlayState* play, s32 limbIndex, void** skeleton, Vec Matrix_TranslateRotateZYX(&pos, &rot); if (newDList != NULL) { MATRIX_TOMTX(*mtx); - gSPMatrix(gfx++, *mtx, G_MTX_LOAD); - gSPDisplayList(gfx++, newDList); + if (GameInteractor_Should(VB_DRAW_SKEL_LIMB, true, &gfx, newDList, *mtx)) { + gSPMatrix(gfx++, *mtx, G_MTX_LOAD); + gSPDisplayList(gfx++, newDList); + } (*mtx)++; } else if (limbDList != NULL) { MATRIX_TOMTX(*mtx); @@ -746,8 +769,10 @@ Gfx* SkelAnime_DrawFlex(PlayState* play, void** skeleton, Vec3s* jointTable, s32 Matrix_TranslateRotateZYX(&pos, &rot); if (newDList != NULL) { MATRIX_TOMTX(mtx); - gSPMatrix(gfx++, mtx, G_MTX_LOAD); - gSPDisplayList(gfx++, newDList); + if (GameInteractor_Should(VB_DRAW_SKEL_LIMB, true, &gfx, newDList, *mtx)) { + gSPMatrix(gfx++, mtx, G_MTX_LOAD); + gSPDisplayList(gfx++, newDList); + } mtx++; } else if (limbDList != NULL) { MATRIX_TOMTX(mtx); @@ -764,6 +789,8 @@ Gfx* SkelAnime_DrawFlex(PlayState* play, void** skeleton, Vec3s* jointTable, s32 Matrix_Pop(); + ClearOverrideSkips(); + return gfx; } diff --git a/soh/src/overlays/actors/ovl_Boss_Ganondrof/z_boss_ganondrof.c b/soh/src/overlays/actors/ovl_Boss_Ganondrof/z_boss_ganondrof.c index e256042ee..468f8059e 100644 --- a/soh/src/overlays/actors/ovl_Boss_Ganondrof/z_boss_ganondrof.c +++ b/soh/src/overlays/actors/ovl_Boss_Ganondrof/z_boss_ganondrof.c @@ -15,6 +15,8 @@ #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" #include "soh_assets.h" +#include "soh/Enhancements/Holiday/Archez.h" + #define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_HOSTILE | ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_DRAW_WHILE_CULLED) typedef enum { @@ -1351,6 +1353,8 @@ s32 BossGanondrof_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, case 15: if ((this->actionFunc == BossGanondrof_Intro) && this->work[GND_MASK_OFF]) { *dList = gPhantomGanonFaceDL; + } else { + SkipOverrideNextLimb(); } rot->y += this->rideRotY[limbIndex]; rot->z += this->rideRotZ[limbIndex]; @@ -1410,6 +1414,10 @@ s32 BossGanondrof_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, break; } + if (limbIndex == 12) { + SkipOverrideNextLimb(); + } + return 0; } diff --git a/soh/src/overlays/actors/ovl_Boss_Goma/z_boss_goma.c b/soh/src/overlays/actors/ovl_Boss_Goma/z_boss_goma.c index e3551d90f..d2ce91a69 100644 --- a/soh/src/overlays/actors/ovl_Boss_Goma/z_boss_goma.c +++ b/soh/src/overlays/actors/ovl_Boss_Goma/z_boss_goma.c @@ -8,6 +8,8 @@ #include "soh/Enhancements/game-interactor/GameInteractor.h" #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" +#include "soh/Enhancements/Holiday/Archez.h" + #define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_HOSTILE | ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_DRAW_WHILE_CULLED) // IRIS_FOLLOW: gohma looks towards the player (iris rotation) @@ -1980,6 +1982,7 @@ s32 BossGoma_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f switch (limbIndex) { case BOSSGOMA_LIMB_EYE: + SkipOverrideNextLimb(); if (this->eyeState == EYESTATE_IRIS_FOLLOW_BONUS_IFRAMES && this->eyeLidBottomRotX < -0xA8C) { *dList = NULL; } else if (this->invincibilityFrames != 0) { @@ -1992,10 +1995,12 @@ s32 BossGoma_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f break; case BOSSGOMA_LIMB_EYE_LID_BOTTOM_ROOT2: + SkipOverrideNextLimb(); rot->x += this->eyeLidBottomRotX; break; case BOSSGOMA_LIMB_EYE_LID_TOP_ROOT2: + SkipOverrideNextLimb(); rot->x += this->eyeLidTopRotX; break; diff --git a/soh/src/overlays/actors/ovl_Boss_Sst/z_boss_sst.c b/soh/src/overlays/actors/ovl_Boss_Sst/z_boss_sst.c index 005a8a089..0126ce3de 100644 --- a/soh/src/overlays/actors/ovl_Boss_Sst/z_boss_sst.c +++ b/soh/src/overlays/actors/ovl_Boss_Sst/z_boss_sst.c @@ -15,6 +15,8 @@ #include "soh/Enhancements/game-interactor/GameInteractor.h" #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" +#include "soh/Enhancements/Holiday/Archez.h" + #define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_HOSTILE | ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_DRAW_WHILE_CULLED | ACTOR_FLAG_DRAGGED_BY_HOOKSHOT) #define vParity actionVar @@ -2862,6 +2864,11 @@ s32 BossSst_OverrideHeadDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* rot->z -= 0x200; } } + + if (limbIndex == 7) { + SkipOverrideNextLimb(); + } + return false; } diff --git a/soh/src/overlays/actors/ovl_Boss_Tw/z_boss_tw.c b/soh/src/overlays/actors/ovl_Boss_Tw/z_boss_tw.c index 0e3c3ba08..cc6fa356b 100644 --- a/soh/src/overlays/actors/ovl_Boss_Tw/z_boss_tw.c +++ b/soh/src/overlays/actors/ovl_Boss_Tw/z_boss_tw.c @@ -8,6 +8,7 @@ #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" #include +#include "soh/Enhancements/Holiday/Archez.h" #define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_HOSTILE | ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_DRAW_WHILE_CULLED) @@ -3191,6 +3192,10 @@ s32 BossTw_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* } } + if (limbIndex == 14) { + SkipOverrideNextLimb(); + } + return false; } @@ -3621,6 +3626,10 @@ s32 BossTw_TwinrovaOverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, *dList = NULL; } + if (limbIndex == 34 || limbIndex == 40) { + SkipOverrideNextLimb(); + } + CLOSE_DISPS(play->state.gfxCtx); return false; diff --git a/soh/src/overlays/actors/ovl_Boss_Va/z_boss_va.c b/soh/src/overlays/actors/ovl_Boss_Va/z_boss_va.c index 8a7368647..327e3b053 100644 --- a/soh/src/overlays/actors/ovl_Boss_Va/z_boss_va.c +++ b/soh/src/overlays/actors/ovl_Boss_Va/z_boss_va.c @@ -19,6 +19,8 @@ #include "soh/Enhancements/game-interactor/GameInteractor.h" #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" +#include "soh/Enhancements/Holiday/Archez.h" + #define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_HOSTILE | ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_DRAW_WHILE_CULLED) #define GET_BODY(this) ((BossVa*)(this)->actor.parent) @@ -3265,6 +3267,7 @@ void BossVa_Draw(Actor* thisx, PlayState* play) { break; default: if (!this->isDead) { + SkipOverrideNextSkeleton(); SkelAnime_DrawSkeletonOpa(play, &this->skelAnime, BossVa_BariOverrideLimbDraw, BossVa_BariPostLimbDraw, this); Collider_UpdateSpheres(0, &this->colliderSph); diff --git a/soh/src/overlays/actors/ovl_Door_Killer/z_door_killer.c b/soh/src/overlays/actors/ovl_Door_Killer/z_door_killer.c index aeb3e1f33..01245ccb2 100644 --- a/soh/src/overlays/actors/ovl_Door_Killer/z_door_killer.c +++ b/soh/src/overlays/actors/ovl_Door_Killer/z_door_killer.c @@ -13,6 +13,8 @@ #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" #include "soh/ResourceManagerHelpers.h" +#include "soh/Enhancements/Holiday/Archez.h" + #define FLAGS ACTOR_FLAG_UPDATE_WHILE_CULLED typedef enum { @@ -533,6 +535,7 @@ void DoorKiller_DrawDoor(Actor* thisx, PlayState* play) { Gfx_SetupDL_37Opa(play->state.gfxCtx); DoorKiller_SetTexture(&this->actor, play); + SkipOverrideNextSkeleton(); SkelAnime_DrawSkeletonOpa(play, &this->skelAnime, NULL, NULL, NULL); } diff --git a/soh/src/overlays/actors/ovl_En_Am/z_en_am.c b/soh/src/overlays/actors/ovl_En_Am/z_en_am.c index a619b2bf0..8a4fdd006 100644 --- a/soh/src/overlays/actors/ovl_En_Am/z_en_am.c +++ b/soh/src/overlays/actors/ovl_En_Am/z_en_am.c @@ -11,6 +11,8 @@ #include "soh_assets.h" #include "soh/ResourceManagerHelpers.h" +#include "soh/Enhancements/Holiday/Archez.h" + #define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_HOSTILE | ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_CAN_PRESS_SWITCH) void EnAm_Init(Actor* thisx, PlayState* play); @@ -978,6 +980,7 @@ void EnAm_Draw(Actor* thisx, PlayState* play) { Gfx_SetupDL_25Opa(play->state.gfxCtx); gDPSetEnvColor(POLY_OPA_DISP++, 0, 0, 0, this->textureBlend); + SkipOverrideNextSkeleton(); SkelAnime_DrawSkeletonOpa(play, &this->skelAnime, NULL, EnAm_PostLimbDraw, this); diff --git a/soh/src/overlays/actors/ovl_En_Arrow/z_en_arrow.c b/soh/src/overlays/actors/ovl_En_Arrow/z_en_arrow.c index c13833d6d..7323509d1 100644 --- a/soh/src/overlays/actors/ovl_En_Arrow/z_en_arrow.c +++ b/soh/src/overlays/actors/ovl_En_Arrow/z_en_arrow.c @@ -8,6 +8,8 @@ #include "objects/gameplay_keep/gameplay_keep.h" #include "objects/object_gi_nuts/object_gi_nuts.h" +#include "soh/Enhancements/Holiday/Archez.h" + #define FLAGS (ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_DRAW_WHILE_CULLED) void EnArrow_Init(Actor* thisx, PlayState* play); @@ -501,6 +503,7 @@ void EnArrow_Draw(Actor* thisx, PlayState* play) { if (this->actor.params <= ARROW_0E) { Gfx_SetupDL_25Opa(play->state.gfxCtx); + SkipOverrideNextSkeleton(); SkelAnime_DrawLod(play, this->skelAnime.skeleton, this->skelAnime.jointTable, NULL, NULL, this, (this->actor.projectedPos.z < MREG(95)) ? 0 : 1); } else if (this->actor.speedXZ != 0.0f) { diff --git a/soh/src/overlays/actors/ovl_En_Bigokuta/z_en_bigokuta.c b/soh/src/overlays/actors/ovl_En_Bigokuta/z_en_bigokuta.c index ca210b62b..95bf11825 100644 --- a/soh/src/overlays/actors/ovl_En_Bigokuta/z_en_bigokuta.c +++ b/soh/src/overlays/actors/ovl_En_Bigokuta/z_en_bigokuta.c @@ -3,6 +3,8 @@ #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" #include "soh/ResourceManagerHelpers.h" +#include "soh/Enhancements/Holiday/Archez.h" + #define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_HOSTILE | ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_DRAW_WHILE_CULLED) void EnBigokuta_Init(Actor* thisx, PlayState* play); @@ -868,6 +870,11 @@ s32 EnBigokuta_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec Matrix_Scale(1.0f, 1.25f - temp_f0, 1.25f - temp_f0, MTXMODE_APPLY); } } + + if (limbIndex == 15 || limbIndex == 16 || limbIndex == CVarGetInteger("gMyThing", 0)) { + SkipOverrideNextLimb(); + } + return false; } diff --git a/soh/src/overlays/actors/ovl_En_Door/z_en_door.c b/soh/src/overlays/actors/ovl_En_Door/z_en_door.c index 56f1f5b1e..621b0d79f 100644 --- a/soh/src/overlays/actors/ovl_En_Door/z_en_door.c +++ b/soh/src/overlays/actors/ovl_En_Door/z_en_door.c @@ -12,6 +12,8 @@ #include "objects/object_haka_door/object_haka_door.h" #include "soh/ResourceManagerHelpers.h" +#include "soh/Enhancements/Holiday/Archez.h" + #define FLAGS ACTOR_FLAG_UPDATE_WHILE_CULLED #define DOOR_AJAR_SLAM_RANGE 120.0f @@ -339,6 +341,7 @@ void EnDoor_Draw(Actor* thisx, PlayState* play) { OPEN_DISPS(play->state.gfxCtx); Gfx_SetupDL_25Opa(play->state.gfxCtx); + SkipOverrideNextSkeleton(); SkelAnime_DrawSkeletonOpa(play, &this->skelAnime, EnDoor_OverrideLimbDraw, NULL, &this->actor); diff --git a/soh/src/overlays/actors/ovl_En_Go/z_en_go.c b/soh/src/overlays/actors/ovl_En_Go/z_en_go.c index e538949b8..767e1a244 100644 --- a/soh/src/overlays/actors/ovl_En_Go/z_en_go.c +++ b/soh/src/overlays/actors/ovl_En_Go/z_en_go.c @@ -6,6 +6,8 @@ #include "soh/Enhancements/randomizer/adult_trade_shuffle.h" #include "soh/OTRGlobals.h" +#include "soh_assets.h" + #define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_DRAW_WHILE_CULLED) void EnGo_Init(Actor* thisx, PlayState* play); @@ -1055,10 +1057,15 @@ void EnGo_DrawCurledUp(EnGo* this, PlayState* play) { Matrix_Push(); Gfx_SetupDL_25Opa(play->state.gfxCtx); - gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), - G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); - - gSPDisplayList(POLY_OPA_DISP++, gGoronDL_00BD80); + if (CVarGetInteger("gHoliday.Archez.SnowGolems", 0)) { + Matrix_Translate(0.0f, 10.0f, 0.0f, MTXMODE_APPLY); + Matrix_Scale(1.75f, 1.75f, 1.75f, MTXMODE_APPLY); + gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + gSPDisplayList(POLY_OPA_DISP++, gSnowballDL); + } else { + gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + gSPDisplayList(POLY_OPA_DISP++, gGoronDL_00BD80); + } Matrix_MultVec3f(&D_80A41BB4, &this->actor.focus.pos); Matrix_Pop(); @@ -1075,9 +1082,15 @@ void EnGo_DrawRolling(EnGo* this, PlayState* play) { Gfx_SetupDL_25Opa(play->state.gfxCtx); Matrix_RotateZYX((s16)(play->state.frames * ((s16)this->actor.speedXZ * 1400)), 0, this->actor.shape.rot.z, MTXMODE_APPLY); - gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), - G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); - gSPDisplayList(POLY_OPA_DISP++, gGoronDL_00C140); + if (CVarGetInteger("gHoliday.Archez.SnowGolems", 0)) { + Matrix_Translate(0.0f, -10.0f, 0.0f, MTXMODE_APPLY); + Matrix_Scale(1.75f, 1.75f, 1.75f, MTXMODE_APPLY); + gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + gSPDisplayList(POLY_OPA_DISP++, gSnowballDL); + } else { + gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + gSPDisplayList(POLY_OPA_DISP++, gGoronDL_00C140); + } Matrix_MultVec3f(&D_80A41BC0, &this->actor.focus.pos); Matrix_Pop(); diff --git a/soh/src/overlays/actors/ovl_En_Go2/z_en_go2.c b/soh/src/overlays/actors/ovl_En_Go2/z_en_go2.c index a483de7d5..5028a997a 100644 --- a/soh/src/overlays/actors/ovl_En_Go2/z_en_go2.c +++ b/soh/src/overlays/actors/ovl_En_Go2/z_en_go2.c @@ -8,6 +8,8 @@ #include "soh/ResourceManagerHelpers.h" #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" +#include "soh_assets.h" + #define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_DRAW_WHILE_CULLED) /* @@ -2010,9 +2012,15 @@ s32 EnGo2_DrawCurledUp(EnGo2* this, PlayState* play) { OPEN_DISPS(play->state.gfxCtx); Gfx_SetupDL_25Opa(play->state.gfxCtx); - gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), - G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); - gSPDisplayList(POLY_OPA_DISP++, gGoronDL_00BD80); + if (CVarGetInteger("gHoliday.Archez.SnowGolems", 0)) { + Matrix_Translate(0.0f, 10.0f, 0.0f, MTXMODE_APPLY); + Matrix_Scale(1.75f, 1.75f, 1.75f, MTXMODE_APPLY); + gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + gSPDisplayList(POLY_OPA_DISP++, gSnowballDL); + } else { + gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + gSPDisplayList(POLY_OPA_DISP++, gGoronDL_00BD80); + } CLOSE_DISPS(play->state.gfxCtx); Matrix_MultVec3f(&D_80A48554, &this->actor.focus.pos); @@ -2028,9 +2036,17 @@ s32 EnGo2_DrawRolling(EnGo2* this, PlayState* play) { Gfx_SetupDL_25Opa(play->state.gfxCtx); speedXZ = this->actionFunc == EnGo2_ReverseRolling ? 0.0f : this->actor.speedXZ; Matrix_RotateZYX((play->state.frames * ((s16)speedXZ * 1400)), 0, this->actor.shape.rot.z, MTXMODE_APPLY); - gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), - G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); - gSPDisplayList(POLY_OPA_DISP++, gGoronDL_00C140); + if (CVarGetInteger("gHoliday.Archez.SnowGolems", 0)) { + Matrix_Translate(0.0f, -10.0f, 0.0f, MTXMODE_APPLY); + Matrix_Scale(1.75f, 1.75f, 1.75f, MTXMODE_APPLY); + gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), + G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + gSPDisplayList(POLY_OPA_DISP++, gSnowballDL); + } else { + gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), + G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + gSPDisplayList(POLY_OPA_DISP++, gGoronDL_00C140); + } CLOSE_DISPS(play->state.gfxCtx); Matrix_MultVec3f(&D_80A48560, &this->actor.focus.pos); return 1; diff --git a/soh/src/overlays/actors/ovl_En_Hata/z_en_hata.c b/soh/src/overlays/actors/ovl_En_Hata/z_en_hata.c index 6e36e2027..4a5917733 100644 --- a/soh/src/overlays/actors/ovl_En_Hata/z_en_hata.c +++ b/soh/src/overlays/actors/ovl_En_Hata/z_en_hata.c @@ -7,6 +7,8 @@ #include "z_en_hata.h" #include "objects/object_hata/object_hata.h" +#include "soh/Enhancements/Holiday/Archez.h" + #define FLAGS 0 void EnHata_Init(Actor* thisx, PlayState* play); @@ -130,6 +132,11 @@ s32 EnHata_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* rot->y += limbs[limbIndex].y; rot->z += limbs[limbIndex].z; } + + if (limbIndex == FLAGPOLE_LIMB_POLE_BASE || limbIndex == FLAGPOLE_LIMB_POLE) { + SkipOverrideNextLimb(); + } + return false; } diff --git a/soh/src/overlays/actors/ovl_En_Heishi1/z_en_heishi1.c b/soh/src/overlays/actors/ovl_En_Heishi1/z_en_heishi1.c index 90d47b098..a0dc814ad 100644 --- a/soh/src/overlays/actors/ovl_En_Heishi1/z_en_heishi1.c +++ b/soh/src/overlays/actors/ovl_En_Heishi1/z_en_heishi1.c @@ -9,6 +9,8 @@ #include "vt.h" #include "soh/ResourceManagerHelpers.h" +#include "soh/Enhancements/Holiday/Archez.h" + #define FLAGS ACTOR_FLAG_UPDATE_WHILE_CULLED void EnHeishi1_Init(Actor* thisx, PlayState* play); @@ -498,6 +500,10 @@ s32 EnHeishi1_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3 rot->x += (s16)this->headAngle; } + if (limbIndex == 15) { + SkipOverrideNextLimb(); + } + return false; } diff --git a/soh/src/overlays/actors/ovl_En_Heishi2/z_en_heishi2.c b/soh/src/overlays/actors/ovl_En_Heishi2/z_en_heishi2.c index 763f73df4..6adccbb1a 100644 --- a/soh/src/overlays/actors/ovl_En_Heishi2/z_en_heishi2.c +++ b/soh/src/overlays/actors/ovl_En_Heishi2/z_en_heishi2.c @@ -13,6 +13,8 @@ #include "overlays/actors/ovl_Bg_Spot15_Saku/z_bg_spot15_saku.h" #include "soh/ResourceManagerHelpers.h" +#include "soh/Enhancements/Holiday/Archez.h" + #define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY) void EnHeishi2_Init(Actor* thisx, PlayState* play); @@ -817,6 +819,10 @@ s32 EnHeishi2_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3 } } + if (limbIndex == 15) { + SkipOverrideNextLimb(); + } + return false; } diff --git a/soh/src/overlays/actors/ovl_En_Heishi3/z_en_heishi3.c b/soh/src/overlays/actors/ovl_En_Heishi3/z_en_heishi3.c index 755c687bf..8a8113de3 100644 --- a/soh/src/overlays/actors/ovl_En_Heishi3/z_en_heishi3.c +++ b/soh/src/overlays/actors/ovl_En_Heishi3/z_en_heishi3.c @@ -9,6 +9,8 @@ #include "vt.h" #include "soh/ResourceManagerHelpers.h" +#include "soh/Enhancements/Holiday/Archez.h" + #define FLAGS 0 void EnHeishi3_Init(Actor* thisx, PlayState* play); @@ -245,6 +247,10 @@ s32 EnHeishi3_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3 rot->z += this->unk_264; } + if (limbIndex == 15) { + SkipOverrideNextLimb(); + } + return false; } diff --git a/soh/src/overlays/actors/ovl_En_Heishi4/z_en_heishi4.c b/soh/src/overlays/actors/ovl_En_Heishi4/z_en_heishi4.c index 40d61a15e..4d590711c 100644 --- a/soh/src/overlays/actors/ovl_En_Heishi4/z_en_heishi4.c +++ b/soh/src/overlays/actors/ovl_En_Heishi4/z_en_heishi4.c @@ -5,6 +5,8 @@ #include "soh/OTRGlobals.h" #include "soh/ResourceManagerHelpers.h" +#include "soh/Enhancements/Holiday/Archez.h" + #define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY) void EnHeishi4_Init(Actor* thisx, PlayState* play); @@ -414,6 +416,11 @@ s32 EnHeishi_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f rot->x += this->unk_260.y; rot->z += this->unk_260.z; } + + if (limbIndex == 15) { + SkipOverrideNextLimb(); + } + return false; } diff --git a/soh/src/overlays/actors/ovl_En_Ik/z_en_ik.c b/soh/src/overlays/actors/ovl_En_Ik/z_en_ik.c index 53712235e..bba742b73 100644 --- a/soh/src/overlays/actors/ovl_En_Ik/z_en_ik.c +++ b/soh/src/overlays/actors/ovl_En_Ik/z_en_ik.c @@ -12,6 +12,8 @@ #include "soh_assets.h" #include "soh/ResourceManagerHelpers.h" +#include "soh/Enhancements/Holiday/Archez.h" + #define FLAGS ACTOR_FLAG_UPDATE_WHILE_CULLED typedef void (*EnIkDrawFunc)(struct EnIk*, PlayState*); @@ -846,6 +848,11 @@ s32 EnIk_OverrideLimbDraw3(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* p *dList = NULL; } } + + if (limbIndex == 17) { + SkipOverrideNextLimb(); + } + return false; } @@ -1193,6 +1200,10 @@ s32 EnIk_OverrideLimbDraw2(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* p } } + if (limbIndex == 17) { + SkipOverrideNextLimb(); + } + return 0; } @@ -1359,6 +1370,7 @@ s32 EnIk_OverrideLimbDraw1(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* p if (curFrame < 120.0f) { *dList = NULL; } else { + SkipOverrideNextLimb(); func_80A76E2C(this, play, pos); } break; diff --git a/soh/src/overlays/actors/ovl_En_Jj/z_en_jj.c b/soh/src/overlays/actors/ovl_En_Jj/z_en_jj.c index fa1a4a776..7e1b72518 100644 --- a/soh/src/overlays/actors/ovl_En_Jj/z_en_jj.c +++ b/soh/src/overlays/actors/ovl_En_Jj/z_en_jj.c @@ -10,6 +10,8 @@ #include "soh_assets.h" #include "soh/ResourceManagerHelpers.h" +#include "soh/Enhancements/Holiday/Archez.h" + #define FLAGS (ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_DRAW_WHILE_CULLED) typedef enum { @@ -340,6 +342,7 @@ void EnJj_Draw(Actor* thisx, PlayState* play2) { Matrix_Translate(0.0f, (cosf(this->skelAnime.curFrame * (M_PI / 41.0f)) * 10.0f) - 10.0f, 0.0f, MTXMODE_APPLY); Matrix_Scale(10.0f, 10.0f, 10.0f, MTXMODE_APPLY); gSPSegment(POLY_OPA_DISP++, 0x08, SEGMENTED_TO_VIRTUAL(eyeTextures[this->eyeIndex])); + SkipOverrideNextSkeleton(); SkelAnime_DrawSkeletonOpa(play, &this->skelAnime, NULL, EnJj_PostLimbDraw, this); CLOSE_DISPS(play->state.gfxCtx); diff --git a/soh/src/overlays/actors/ovl_En_Mb/z_en_mb.c b/soh/src/overlays/actors/ovl_En_Mb/z_en_mb.c index 979cc8d68..c92ac65fd 100644 --- a/soh/src/overlays/actors/ovl_En_Mb/z_en_mb.c +++ b/soh/src/overlays/actors/ovl_En_Mb/z_en_mb.c @@ -9,6 +9,8 @@ #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" #include "soh/ResourceManagerHelpers.h" +#include "soh/Enhancements/Holiday/Archez.h" + /* * This actor can have three behaviors: * - "Spear Guard" (variable -1): uses a spear, walks around home point, charges player if too close @@ -1551,6 +1553,22 @@ void EnMb_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot, } } +s32 EnMb_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s* rot, void* thisx) { + EnMb* this = (EnMb*)thisx; + + if (this->actor.params == ENMB_TYPE_CLUB) { + if (limbIndex == ENMB_LIMB_LHAND) { + SkipOverrideNextLimb(); + } + } else { + if (limbIndex == ENMB_LIMB_RHAND) { + SkipOverrideNextLimb(); + } + } + + return 0; +} + void EnMb_Draw(Actor* thisx, PlayState* play) { static Vec3f frontShieldingTriModel0[] = { { 4000.0f, 7000.0f, 3500.0f }, @@ -1570,7 +1588,7 @@ void EnMb_Draw(Actor* thisx, PlayState* play) { EnMb* this = (EnMb*)thisx; Gfx_SetupDL_25Opa(play->state.gfxCtx); - SkelAnime_DrawSkeletonOpa(play, &this->skelAnime, NULL, EnMb_PostLimbDraw, thisx); + SkelAnime_DrawSkeletonOpa(play, &this->skelAnime, EnMb_OverrideLimbDraw, EnMb_PostLimbDraw, thisx); if (thisx->params != ENMB_TYPE_CLUB) { if (this->attack > ENMB_ATTACK_NONE) { diff --git a/soh/src/overlays/actors/ovl_En_Snowball/z_en_snowball.c b/soh/src/overlays/actors/ovl_En_Snowball/z_en_snowball.c index a6c07a245..39df87867 100644 --- a/soh/src/overlays/actors/ovl_En_Snowball/z_en_snowball.c +++ b/soh/src/overlays/actors/ovl_En_Snowball/z_en_snowball.c @@ -218,12 +218,12 @@ void EnSnowball_Draw(Actor* thisx, PlayState* play) { Gfx_SetupDL_25Opa(play->state.gfxCtx); Matrix_RotateZYX(this->sRot, thisx->world.rot.y, 0, MTXMODE_APPLY); - - Matrix_Translate(0.0f, 7600.0f, -148.649f, MTXMODE_APPLY); - Matrix_Scale(4.844f, 4.844f, 4.844f, MTXMODE_APPLY); + + Matrix_Translate(0.0f, 5.0f, 0.0f, MTXMODE_APPLY); + Matrix_Scale(0.5f, 0.5f, 0.5f, MTXMODE_APPLY); gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); - gSPDisplayList(POLY_OPA_DISP++, gLinkAdultPompomDL); + gSPDisplayList(POLY_OPA_DISP++, gSnowballDL); CLOSE_DISPS(play->state.gfxCtx); } diff --git a/soh/src/overlays/actors/ovl_En_Test/z_en_test.c b/soh/src/overlays/actors/ovl_En_Test/z_en_test.c index 2306ef2f9..5603aa253 100644 --- a/soh/src/overlays/actors/ovl_En_Test/z_en_test.c +++ b/soh/src/overlays/actors/ovl_En_Test/z_en_test.c @@ -10,6 +10,8 @@ #include "soh_assets.h" #include "soh/ResourceManagerHelpers.h" +#include "soh/Enhancements/Holiday/Archez.h" + #define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_HOSTILE | ACTOR_FLAG_UPDATE_WHILE_CULLED) void EnTest_Init(Actor* thisx, PlayState* play); @@ -1845,6 +1847,10 @@ s32 EnTest_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* *dList = NULL; } + if (limbIndex == STALFOS_LIMB_SWORD || limbIndex == STALFOS_LIMB_SHIELD) { + SkipOverrideNextLimb(); + } + return false; } diff --git a/soh/src/overlays/actors/ovl_En_Torch2/z_en_torch2.c b/soh/src/overlays/actors/ovl_En_Torch2/z_en_torch2.c index 28bc936c5..4186534c1 100644 --- a/soh/src/overlays/actors/ovl_En_Torch2/z_en_torch2.c +++ b/soh/src/overlays/actors/ovl_En_Torch2/z_en_torch2.c @@ -8,6 +8,8 @@ #include "objects/object_torch2/object_torch2.h" #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" +#include "soh/Enhancements/Holiday/Archez.h" + #define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_HOSTILE | ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_DRAW_WHILE_CULLED) typedef enum { @@ -772,6 +774,10 @@ s32 EnTorch2_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f Gfx** gfx) { Player* this = (Player*)thisx; + if (limbIndex == PLAYER_LIMB_L_HAND || limbIndex == PLAYER_LIMB_R_HAND) { + SkipOverrideNextLimb(); + } + return Player_OverrideLimbDrawGameplayCommon(play, limbIndex, dList, pos, rot, &this->actor); } diff --git a/soh/src/overlays/actors/ovl_En_Vm/z_en_vm.c b/soh/src/overlays/actors/ovl_En_Vm/z_en_vm.c index d30607ea0..02c4190a1 100644 --- a/soh/src/overlays/actors/ovl_En_Vm/z_en_vm.c +++ b/soh/src/overlays/actors/ovl_En_Vm/z_en_vm.c @@ -12,6 +12,8 @@ #include "soh_assets.h" #include "soh/ResourceManagerHelpers.h" +#include "soh/Enhancements/Holiday/Archez.h" + #define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_UPDATE_WHILE_CULLED) void EnVm_Init(Actor* thisx, PlayState* play); @@ -544,6 +546,7 @@ void EnVm_Draw(Actor* thisx, PlayState* play2) { Gfx_SetupDL_25Opa(play->state.gfxCtx); Gfx_SetupDL_25Xlu(play->state.gfxCtx); + SkipOverrideNextSkeleton(); SkelAnime_DrawSkeletonOpa(play, &this->skelAnime, EnVm_OverrideLimbDraw, EnVm_PostLimbDraw, this); actorPos = this->actor.world.pos; diff --git a/soh/src/overlays/actors/ovl_En_Zf/z_en_zf.c b/soh/src/overlays/actors/ovl_En_Zf/z_en_zf.c index 2ef15102c..81fbb684d 100644 --- a/soh/src/overlays/actors/ovl_En_Zf/z_en_zf.c +++ b/soh/src/overlays/actors/ovl_En_Zf/z_en_zf.c @@ -10,6 +10,8 @@ #include "soh_assets.h" #include "soh/ResourceManagerHelpers.h" +#include "soh/Enhancements/Holiday/Archez.h" + #define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_HOSTILE | ACTOR_FLAG_UPDATE_WHILE_CULLED) void EnZf_Init(Actor* thisx, PlayState* play); @@ -2132,11 +2134,13 @@ s32 EnZf_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* po rot->y -= this->headRot; break; case ENZF_LIMB_SWORD: + SkipOverrideNextLimb(); if (this->swordSheathed) { *dList = gZfEmptyHandDL; } break; case ENZF_LIMB_SCABBARD: + SkipOverrideNextLimb(); if (this->swordSheathed) { *dList = gZfSheathedSwordDL; } @@ -2434,4 +2438,4 @@ s32 EnZf_DodgeRangedWaiting(PlayState* play, EnZf* this) { void EnZf_Reset(void) { D_80B4A1B0 = 0; D_80B4A1B4 = 1; -} \ No newline at end of file +} From 31ee15dcc8b50a9a2d32d39262a294754039a54f Mon Sep 17 00:00:00 2001 From: Garrett Cox Date: Sun, 20 Oct 2024 01:31:29 -0500 Subject: [PATCH 15/18] WIP --- .../GameInteractor_HookTable.h | 9 +- .../game-interactor/GameInteractor_Hooks.cpp | 26 +- .../game-interactor/GameInteractor_Hooks.h | 8 +- .../Enhancements/randomizer/hook_handlers.cpp | 4 +- .../Enhancements/randomizer/item_location.cpp | 2 + .../randomizer/randomizer_entrance.c | 3 + soh/soh/Network/Anchor/Anchor.cpp | 394 ++++++++++++++++++ soh/soh/Network/Anchor/Anchor.h | 176 ++++++++ soh/soh/Network/Anchor/AnchorRoomWindow.cpp | 118 ++++++ soh/soh/Network/Anchor/DummyPlayer.cpp | 216 ++++++++++ soh/soh/Network/Anchor/JsonConversions.hpp | 186 +++++++++ .../Network/Anchor/Packets/AllClientState.cpp | 74 ++++ .../Anchor/Packets/ConsumeAdultTradeItem.cpp | 46 ++ .../Network/Anchor/Packets/DamagePlayer.cpp | 62 +++ .../Network/Anchor/Packets/DisableAnchor.cpp | 18 + .../Anchor/Packets/EntranceDiscovered.cpp | 37 ++ .../Network/Anchor/Packets/GameComplete.cpp | 48 +++ soh/soh/Network/Anchor/Packets/GiveItem.cpp | 104 +++++ soh/soh/Network/Anchor/Packets/Handshake.cpp | 26 ++ soh/soh/Network/Anchor/Packets/PlayerSfx.cpp | 51 +++ .../Network/Anchor/Packets/PlayerUpdate.cpp | 120 ++++++ .../Anchor/Packets/RequestTeamState.cpp | 37 ++ .../Anchor/Packets/RequestTeleport.cpp | 36 ++ .../Network/Anchor/Packets/ServerMessage.cpp | 21 + .../Network/Anchor/Packets/SetCheckStatus.cpp | 53 +++ soh/soh/Network/Anchor/Packets/SetFlag.cpp | 50 +++ soh/soh/Network/Anchor/Packets/TeleportTo.cpp | 63 +++ soh/soh/Network/Anchor/Packets/UnsetFlag.cpp | 51 +++ .../Anchor/Packets/UpdateBeansCount.cpp | 43 ++ .../Anchor/Packets/UpdateClientState.cpp | 77 ++++ .../Anchor/Packets/UpdateDungeonItems.cpp | 42 ++ .../Anchor/Packets/UpdateRoomState.cpp | 47 +++ .../Anchor/Packets/UpdateTeamState.cpp | 259 ++++++++++++ soh/soh/OTRGlobals.cpp | 9 + soh/soh/SaveManager.cpp | 2 +- soh/soh/SohGui.cpp | 13 + soh/soh/SohMenuBar.cpp | 2 + soh/soh/UIWidgets.cpp | 4 +- soh/soh/UIWidgets.hpp | 2 +- soh/soh/cvar_prefixes.h | 3 +- soh/soh/util.cpp | 1 + soh/src/code/z_actor.c | 40 +- soh/src/code/z_en_item00.c | 7 + .../actors/ovl_Bg_Bombwall/z_bg_bombwall.c | 4 +- .../actors/ovl_Bg_Breakwall/z_bg_breakwall.c | 4 +- .../actors/ovl_Bg_Haka_Zou/z_bg_haka_zou.c | 4 +- .../ovl_Bg_Hidan_Dalm/z_bg_hidan_dalm.c | 6 +- .../ovl_Bg_Hidan_Hamstep/z_bg_hidan_hamstep.c | 4 +- .../ovl_Bg_Hidan_Hrock/z_bg_hidan_hrock.c | 4 +- .../z_bg_hidan_kowarerukabe.c | 4 +- .../ovl_Bg_Ice_Shelter/z_bg_ice_shelter.c | 6 +- .../z_bg_jya_bombchuiwa.c | 4 +- .../ovl_Bg_Jya_Bombiwa/z_bg_jya_bombiwa.c | 4 +- .../ovl_Bg_Mizu_Bwall/z_bg_mizu_bwall.c | 4 +- .../z_bg_spot08_bakudankabe.c | 4 +- .../z_bg_spot11_bakudankabe.c | 4 +- .../z_bg_spot17_bakudankabe.c | 4 +- .../ovl_Bg_Ydan_Maruta/z_bg_ydan_maruta.c | 4 +- .../actors/ovl_Bg_Ydan_Sp/z_bg_ydan_sp.c | 11 + .../actors/ovl_Door_Gerudo/z_door_gerudo.c | 2 + .../actors/ovl_Door_Shutter/z_door_shutter.c | 6 + .../overlays/actors/ovl_En_Door/z_en_door.c | 7 + soh/src/overlays/actors/ovl_En_Si/z_en_si.c | 7 + soh/src/overlays/actors/ovl_En_Sw/z_en_sw.c | 7 + .../actors/ovl_Item_B_Heart/z_item_b_heart.c | 7 + .../actors/ovl_Obj_Bombiwa/z_obj_bombiwa.c | 4 +- .../actors/ovl_Obj_Hamishi/z_obj_hamishi.c | 6 +- 67 files changed, 2668 insertions(+), 43 deletions(-) create mode 100644 soh/soh/Network/Anchor/Anchor.cpp create mode 100644 soh/soh/Network/Anchor/Anchor.h create mode 100644 soh/soh/Network/Anchor/AnchorRoomWindow.cpp create mode 100644 soh/soh/Network/Anchor/DummyPlayer.cpp create mode 100644 soh/soh/Network/Anchor/JsonConversions.hpp create mode 100644 soh/soh/Network/Anchor/Packets/AllClientState.cpp create mode 100644 soh/soh/Network/Anchor/Packets/ConsumeAdultTradeItem.cpp create mode 100644 soh/soh/Network/Anchor/Packets/DamagePlayer.cpp create mode 100644 soh/soh/Network/Anchor/Packets/DisableAnchor.cpp create mode 100644 soh/soh/Network/Anchor/Packets/EntranceDiscovered.cpp create mode 100644 soh/soh/Network/Anchor/Packets/GameComplete.cpp create mode 100644 soh/soh/Network/Anchor/Packets/GiveItem.cpp create mode 100644 soh/soh/Network/Anchor/Packets/Handshake.cpp create mode 100644 soh/soh/Network/Anchor/Packets/PlayerSfx.cpp create mode 100644 soh/soh/Network/Anchor/Packets/PlayerUpdate.cpp create mode 100644 soh/soh/Network/Anchor/Packets/RequestTeamState.cpp create mode 100644 soh/soh/Network/Anchor/Packets/RequestTeleport.cpp create mode 100644 soh/soh/Network/Anchor/Packets/ServerMessage.cpp create mode 100644 soh/soh/Network/Anchor/Packets/SetCheckStatus.cpp create mode 100644 soh/soh/Network/Anchor/Packets/SetFlag.cpp create mode 100644 soh/soh/Network/Anchor/Packets/TeleportTo.cpp create mode 100644 soh/soh/Network/Anchor/Packets/UnsetFlag.cpp create mode 100644 soh/soh/Network/Anchor/Packets/UpdateBeansCount.cpp create mode 100644 soh/soh/Network/Anchor/Packets/UpdateClientState.cpp create mode 100644 soh/soh/Network/Anchor/Packets/UpdateDungeonItems.cpp create mode 100644 soh/soh/Network/Anchor/Packets/UpdateRoomState.cpp create mode 100644 soh/soh/Network/Anchor/Packets/UpdateTeamState.cpp diff --git a/soh/soh/Enhancements/game-interactor/GameInteractor_HookTable.h b/soh/soh/Enhancements/game-interactor/GameInteractor_HookTable.h index a2d5c56ec..b2789b14d 100644 --- a/soh/soh/Enhancements/game-interactor/GameInteractor_HookTable.h +++ b/soh/soh/Enhancements/game-interactor/GameInteractor_HookTable.h @@ -18,8 +18,11 @@ DEFINE_HOOK(OnFlagSet, (int16_t flagType, int16_t flag)); DEFINE_HOOK(OnFlagUnset, (int16_t flagType, int16_t flag)); DEFINE_HOOK(OnSceneSpawnActors, ()); DEFINE_HOOK(OnPlayerUpdate, ()); +DEFINE_HOOK(OnPlayerSfx, (u16 sfxId)); DEFINE_HOOK(OnOcarinaSongAction, ()); DEFINE_HOOK(OnShopSlotChange, (uint8_t cursorIndex, int16_t price)); +DEFINE_HOOK(OnDungeonKeyUsed, (uint16_t mapIndex)); +DEFINE_HOOK(ShouldActorInit, (void* actor, bool* result)); DEFINE_HOOK(OnActorInit, (void* actor)); DEFINE_HOOK(OnActorUpdate, (void* actor)); DEFINE_HOOK(OnActorKill, (void* actor)); @@ -32,7 +35,7 @@ DEFINE_HOOK(OnPlayerBottleUpdate, (int16_t contents)); DEFINE_HOOK(OnPlayDestroy, ()); DEFINE_HOOK(OnPlayDrawEnd, ()); DEFINE_HOOK(OnVanillaBehavior, (GIVanillaBehavior flag, bool* result, va_list originalArgs)); -DEFINE_HOOK(OnSaveFile, (int32_t fileNum)); +DEFINE_HOOK(OnSaveFile, (int32_t fileNum, int32_t sectionID)); DEFINE_HOOK(OnLoadFile, (int32_t fileNum)); DEFINE_HOOK(OnDeleteFile, (int32_t fileNum)); @@ -59,3 +62,7 @@ DEFINE_HOOK(OnSetGameLanguage, ()); DEFINE_HOOK(OnFileDropped, (std::string filePath)); DEFINE_HOOK(OnAssetAltChange, ()); DEFINE_HOOK(OnKaleidoUpdate, ()); + +DEFINE_HOOK(OnRandoSetCheckStatus, (RandomizerCheck rc, RandomizerCheckStatus status)); +DEFINE_HOOK(OnRandoSetIsSkipped, (RandomizerCheck rc, bool isSkipped)); +DEFINE_HOOK(OnRandoEntranceDiscovered, (u16 entranceIndex, u8 isReversedEntrance)); diff --git a/soh/soh/Enhancements/game-interactor/GameInteractor_Hooks.cpp b/soh/soh/Enhancements/game-interactor/GameInteractor_Hooks.cpp index 39fc298a8..ad9ad90a4 100644 --- a/soh/soh/Enhancements/game-interactor/GameInteractor_Hooks.cpp +++ b/soh/soh/Enhancements/game-interactor/GameInteractor_Hooks.cpp @@ -64,6 +64,10 @@ void GameInteractor_ExecuteOnPlayerUpdate() { GameInteractor::Instance->ExecuteHooks(); } +void GameInteractor_ExecuteOnPlayerSfx(u16 sfxId) { + GameInteractor::Instance->ExecuteHooks(sfxId); +} + void GameInteractor_ExecuteOnOcarinaSongAction() { GameInteractor::Instance->ExecuteHooks(); } @@ -72,6 +76,19 @@ void GameInteractor_ExecuteOnShopSlotChangeHooks(uint8_t cursorIndex, int16_t pr GameInteractor::Instance->ExecuteHooks(cursorIndex, price); } +void GameInteractor_ExecuteOnDungeonKeyUsedHooks(uint16_t mapIndex) { + GameInteractor::Instance->ExecuteHooks(mapIndex); +} + +bool GameInteractor_ShouldActorInit(void* actor) { + bool result = true; + GameInteractor::Instance->ExecuteHooks(actor, &result); + GameInteractor::Instance->ExecuteHooksForID(((Actor*)actor)->id, actor, &result); + GameInteractor::Instance->ExecuteHooksForPtr((uintptr_t)actor, actor, &result); + GameInteractor::Instance->ExecuteHooksForFilter(actor, &result); + return result; +} + void GameInteractor_ExecuteOnActorInit(void* actor) { GameInteractor::Instance->ExecuteHooks(actor); GameInteractor::Instance->ExecuteHooksForID(((Actor*)actor)->id, actor); @@ -154,8 +171,8 @@ bool GameInteractor_Should(GIVanillaBehavior flag, u32 result, ...) { // MARK: - Save Files -void GameInteractor_ExecuteOnSaveFile(int32_t fileNum) { - GameInteractor::Instance->ExecuteHooks(fileNum); +void GameInteractor_ExecuteOnSaveFile(int32_t fileNum, int32_t sectionID) { + GameInteractor::Instance->ExecuteHooks(fileNum, sectionID); } void GameInteractor_ExecuteOnLoadFile(int32_t fileNum) { @@ -255,3 +272,8 @@ void GameInteractor_RegisterOnAssetAltChange(void (*fn)(void)) { void GameInteractor_ExecuteOnKaleidoUpdate() { GameInteractor::Instance->ExecuteHooks(); } + +// MARK: - Rando +void GameInteractor_ExecuteOnRandoEntranceDiscovered(u16 entranceIndex, u8 isReversedEntrance) { + GameInteractor::Instance->ExecuteHooks(entranceIndex, isReversedEntrance); +} diff --git a/soh/soh/Enhancements/game-interactor/GameInteractor_Hooks.h b/soh/soh/Enhancements/game-interactor/GameInteractor_Hooks.h index 3438d269d..f484bc95d 100644 --- a/soh/soh/Enhancements/game-interactor/GameInteractor_Hooks.h +++ b/soh/soh/Enhancements/game-interactor/GameInteractor_Hooks.h @@ -18,7 +18,9 @@ void GameInteractor_ExecuteOnFlagSet(int16_t flagType, int16_t flag); void GameInteractor_ExecuteOnFlagUnset(int16_t flagType, int16_t flag); void GameInteractor_ExecuteOnSceneSpawnActors(); void GameInteractor_ExecuteOnPlayerUpdate(); +void GameInteractor_ExecuteOnPlayerSfx(u16 sfxId); void GameInteractor_ExecuteOnOcarinaSongAction(); +bool GameInteractor_ShouldActorInit(void* actor); void GameInteractor_ExecuteOnActorInit(void* actor); void GameInteractor_ExecuteOnActorUpdate(void* actor); void GameInteractor_ExecuteOnActorKill(void* actor); @@ -30,12 +32,13 @@ void GameInteractor_ExecuteOnPlayerHealthChange(int16_t amount); void GameInteractor_ExecuteOnPlayerBottleUpdate(int16_t contents); void GameInteractor_ExecuteOnOcarinaSongAction(); void GameInteractor_ExecuteOnShopSlotChangeHooks(uint8_t cursorIndex, int16_t price); +void GameInteractor_ExecuteOnDungeonKeyUsedHooks(uint16_t mapIndex); void GameInteractor_ExecuteOnPlayDestroy(); void GameInteractor_ExecuteOnPlayDrawEnd(); bool GameInteractor_Should(GIVanillaBehavior flag, uint32_t result, ...); // MARK: - Save Files -void GameInteractor_ExecuteOnSaveFile(int32_t fileNum); +void GameInteractor_ExecuteOnSaveFile(int32_t fileNum, int32_t sectionID); void GameInteractor_ExecuteOnLoadFile(int32_t fileNum); void GameInteractor_ExecuteOnDeleteFile(int32_t fileNum); @@ -69,6 +72,9 @@ void GameInteractor_RegisterOnAssetAltChange(void (*fn)(void)); //Mark: - Pause Menu void GameInteractor_ExecuteOnKaleidoUpdate(); +// MARK: - Rando +void GameInteractor_ExecuteOnRandoEntranceDiscovered(u16 entranceIndex, u8 isReversedEntrance); + #ifdef __cplusplus } #endif diff --git a/soh/soh/Enhancements/randomizer/hook_handlers.cpp b/soh/soh/Enhancements/randomizer/hook_handlers.cpp index 0bdd2b0cc..6a6ac103d 100644 --- a/soh/soh/Enhancements/randomizer/hook_handlers.cpp +++ b/soh/soh/Enhancements/randomizer/hook_handlers.cpp @@ -995,12 +995,12 @@ void RandomizerOnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, va_l if (item00->itemEntry.modIndex == MOD_NONE) { Notification::Emit({ .itemIcon = GetTextureForItemId(item00->itemEntry.itemId), - .message = "You found ", + .message = "You found", .suffix = SohUtils::GetItemName(item00->itemEntry.itemId), }); } else if (item00->itemEntry.modIndex == MOD_RANDOMIZER) { Notification::Emit({ - .message = "You found ", + .message = "You found", .suffix = Rando::StaticData::RetrieveItem((RandomizerGet)item00->itemEntry.getItemId).GetName().english, }); } diff --git a/soh/soh/Enhancements/randomizer/item_location.cpp b/soh/soh/Enhancements/randomizer/item_location.cpp index 9f0f84509..1a11c087c 100644 --- a/soh/soh/Enhancements/randomizer/item_location.cpp +++ b/soh/soh/Enhancements/randomizer/item_location.cpp @@ -130,6 +130,7 @@ bool ItemLocation::HasObtained() const { void ItemLocation::SetCheckStatus(RandomizerCheckStatus status_) { status = status_; + GameInteractor::Instance->ExecuteHooks(rc, status); } RandomizerCheckStatus ItemLocation::GetCheckStatus() { @@ -138,6 +139,7 @@ RandomizerCheckStatus ItemLocation::GetCheckStatus() { void ItemLocation::SetIsSkipped(bool isSkipped_) { isSkipped = isSkipped_; + GameInteractor::Instance->ExecuteHooks(rc, isSkipped); } bool ItemLocation::GetIsSkipped() { diff --git a/soh/soh/Enhancements/randomizer/randomizer_entrance.c b/soh/soh/Enhancements/randomizer/randomizer_entrance.c index 7a492fe9c..cb770c54f 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_entrance.c +++ b/soh/soh/Enhancements/randomizer/randomizer_entrance.c @@ -15,6 +15,7 @@ #include "global.h" #include "entrance.h" +#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" extern PlayState* gPlayState; @@ -778,6 +779,8 @@ void Entrance_SetEntranceDiscovered(u16 entranceIndex, u8 isReversedEntrance) { return; } + GameInteractor_ExecuteOnRandoEntranceDiscovered(entranceIndex, isReversedEntrance); + u16 bitsPerIndex = sizeof(u32) * 8; u32 idx = entranceIndex / bitsPerIndex; if (idx < SAVEFILE_ENTRANCES_DISCOVERED_IDX_COUNT) { diff --git a/soh/soh/Network/Anchor/Anchor.cpp b/soh/soh/Network/Anchor/Anchor.cpp new file mode 100644 index 000000000..7d1b701ab --- /dev/null +++ b/soh/soh/Network/Anchor/Anchor.cpp @@ -0,0 +1,394 @@ +#ifdef ENABLE_REMOTE_CONTROL + +#include "Anchor.h" +#include +#include +#include "soh/Enhancements/game-interactor/GameInteractor.h" +#include "soh/OTRGlobals.h" +#include "soh/Enhancements/nametag.h" + +extern "C" { +#include "variables.h" +#include "functions.h" +extern PlayState* gPlayState; +} + +// MARK: - Overrides + +void Anchor::Enable() { + Network::Enable(CVarGetString(CVAR_REMOTE_ANCHOR("Host"), "anchor.proxysaw.dev"), CVarGetInteger(CVAR_REMOTE_ANCHOR("Port"), 43383)); + ownClientId = CVarGetInteger(CVAR_REMOTE_ANCHOR("LastClientId"), 0); + roomState.ownerClientId = 0; +} + +void Anchor::Disable() { + Network::Disable(); + + clients.clear(); + RefreshClientActors(); +} + +void Anchor::OnConnected() { + SendPacket_Handshake(); + RegisterHooks(); + + if (IsSaveLoaded()) { + SendPacket_RequestTeamState(); + } +} + +void Anchor::OnDisconnected() { + RegisterHooks(); +} + +void Anchor::SendJsonToRemote(nlohmann::json payload) { + if (!isConnected) { + return; + } + + payload["clientId"] = ownClientId; + if (!payload.contains("quiet")) { + SPDLOG_INFO("[Anchor] Sending payload:\n{}", payload.dump()); + } + Network::SendJsonToRemote(payload); +} + +void Anchor::OnIncomingJson(nlohmann::json payload) { + // If it doesn't contain a type, it's not a valid payload + if (!payload.contains("type")) { + return; + } + + // If it's not a quiet payload, log it + if (!payload.contains("quiet")) { + SPDLOG_INFO("[Anchor] Received payload:\n{}", payload.dump()); + } + + std::string packetType = payload["type"].get(); + + // Ignore packets from mismatched clients, except for ALL_CLIENT_STATE or UPDATE_CLIENT_STATE + if (packetType != ALL_CLIENT_STATE && packetType != UPDATE_CLIENT_STATE) { + if (payload.contains("clientId")) { + uint32_t clientId = payload["clientId"].get(); + if (clients.contains(clientId) && clients[clientId].clientVersion != clientVersion) { + return; + } + } + } + + // packetType here is a string so we can't use a switch statement + if (packetType == ALL_CLIENT_STATE) HandlePacket_AllClientState(payload); + else if (packetType == CONSUME_ADULT_TRADE_ITEM) HandlePacket_ConsumeAdultTradeItem(payload); + else if (packetType == DAMAGE_PLAYER) HandlePacket_DamagePlayer(payload); + else if (packetType == DISABLE_ANCHOR) HandlePacket_DisableAnchor(payload); + else if (packetType == ENTRANCE_DISCOVERED) HandlePacket_EntranceDiscovered(payload); + else if (packetType == GAME_COMPLETE) HandlePacket_GameComplete(payload); + else if (packetType == GIVE_ITEM) HandlePacket_GiveItem(payload); + else if (packetType == PLAYER_SFX) HandlePacket_PlayerSfx(payload); + else if (packetType == PLAYER_UPDATE) HandlePacket_PlayerUpdate(payload); + else if (packetType == UPDATE_TEAM_STATE) HandlePacket_UpdateTeamState(payload); + else if (packetType == REQUEST_TEAM_STATE) HandlePacket_RequestTeamState(payload); + else if (packetType == REQUEST_TELEPORT) HandlePacket_RequestTeleport(payload); + else if (packetType == SERVER_MESSAGE) HandlePacket_ServerMessage(payload); + else if (packetType == SET_CHECK_STATUS) HandlePacket_SetCheckStatus(payload); + else if (packetType == SET_FLAG) HandlePacket_SetFlag(payload); + else if (packetType == TELEPORT_TO) HandlePacket_TeleportTo(payload); + else if (packetType == UNSET_FLAG) HandlePacket_UnsetFlag(payload); + else if (packetType == UPDATE_BEANS_COUNT) HandlePacket_UpdateBeansCount(payload); + else if (packetType == UPDATE_CLIENT_STATE) HandlePacket_UpdateClientState(payload); + else if (packetType == UPDATE_ROOM_STATE) HandlePacket_UpdateRoomState(payload); + else if (packetType == UPDATE_DUNGEON_ITEMS) HandlePacket_UpdateDungeonItems(payload); +} + +// Macros to let us easily register and unregister functions when the anchor is enabled/disabled +#define HOOK(hook, condition, body) \ + static HOOK_ID hook = 0; \ + GameInteractor::Instance->UnregisterGameHook(hook); \ + hook = 0; \ + if (condition) { \ + hook = GameInteractor::Instance->RegisterGameHook(body); \ + } + +#define HOOK_FOR_ID(hook, condition, id, body) \ + static HOOK_ID hook = 0; \ + GameInteractor::Instance->UnregisterGameHookForID(hook); \ + hook = 0; \ + if (condition) { \ + hook = GameInteractor::Instance->RegisterGameHookForID(id, body); \ + } + +void Anchor::RegisterHooks() { + HOOK(OnSceneSpawnActors, isConnected, [&]() { + SendPacket_UpdateClientState(); + + if (IsSaveLoaded()) { + RefreshClientActors(); + } + }); + + HOOK(OnPresentFileSelect, isConnected, [&]() { + SendPacket_UpdateClientState(); + }); + + HOOK_FOR_ID(ShouldActorInit, isConnected, ACTOR_PLAYER, [&](void* actorRef, bool* should) { + Actor* actor = (Actor*)actorRef; + + if (refreshingActors) { + // By the time we get here, the actor was already added to the ACTORCAT_PLAYER list, so we need to move it + Actor_ChangeCategory(gPlayState, &gPlayState->actorCtx, actor, ACTORCAT_NPC); + actor->id = ACTOR_EN_OE2; + actor->category = ACTORCAT_NPC; + actor->init = DummyPlayer_Init; + actor->update = DummyPlayer_Update; + actor->draw = DummyPlayer_Draw; + actor->destroy = DummyPlayer_Destroy; + } + }); + + HOOK(OnPlayerUpdate, isConnected, [&]() { + if (justLoadedSave) { + justLoadedSave = false; + SendPacket_RequestTeamState(); + } + SendPacket_PlayerUpdate(); + }); + + HOOK(OnPlayerSfx, isConnected, [&](u16 sfxId) { + SendPacket_PlayerSfx(sfxId); + }); + + HOOK(OnLoadGame, isConnected, [&](s16 fileNum) { + justLoadedSave = true; + }); + + HOOK(OnSaveFile, isConnected, [&](s16 fileNum, int sectionID) { + if (sectionID == 0) { + SendPacket_UpdateTeamState(); + } + }); + + HOOK(OnFlagSet, isConnected, [&](s16 flagType, s16 flag) { + SendPacket_SetFlag(SCENE_ID_MAX, flagType, flag); + }); + + HOOK(OnFlagUnset, isConnected, [&](s16 flagType, s16 flag) { + SendPacket_UnsetFlag(SCENE_ID_MAX, flagType, flag); + }); + + HOOK(OnSceneFlagSet, isConnected, [&](s16 sceneNum, s16 flagType, s16 flag) { + SendPacket_SetFlag(sceneNum, flagType, flag); + }); + + HOOK(OnSceneFlagUnset, isConnected, [&](s16 sceneNum, s16 flagType, s16 flag) { + SendPacket_UnsetFlag(sceneNum, flagType, flag); + }); + + HOOK(OnRandoSetCheckStatus, isConnected, [&](RandomizerCheck rc, RandomizerCheckStatus status) { + if (!isHandlingUpdateTeamState) { + SendPacket_SetCheckStatus(rc); + } + }); + + HOOK(OnRandoSetIsSkipped, isConnected, [&](RandomizerCheck rc, bool isSkipped) { + if (!isHandlingUpdateTeamState) { + SendPacket_SetCheckStatus(rc); + } + }); + + HOOK(OnRandoEntranceDiscovered, isConnected, [&](u16 entranceIndex, u8 isReversedEntrance) { + SendPacket_EntranceDiscovered(entranceIndex); + }); + + HOOK_FOR_ID(OnBossDefeat, isConnected, ACTOR_BOSS_GANON2, [&](void* refActor) { + SendPacket_GameComplete(); + }); + + HOOK(OnItemReceive, isConnected, [&](GetItemEntry itemEntry) { + // Handle vanilla dungeon items a bit differently + if (itemEntry.modIndex == MOD_NONE && (itemEntry.itemId >= ITEM_KEY_BOSS && itemEntry.itemId <= ITEM_KEY_SMALL)) { + SendPacket_UpdateDungeonItems(); + return; + } + + SendPacket_GiveItem(itemEntry.tableId, itemEntry.getItemId); + }); + + HOOK(OnDungeonKeyUsed, isConnected, [&](uint16_t mapIndex) { + // Handle vanilla dungeon items a bit differently + SendPacket_UpdateDungeonItems(); + }); +} + +// MARK: - Misc/Helpers + +// Kills all existing anchor actors and respawns them with the new client data +void Anchor::RefreshClientActors() { + if (!IsSaveLoaded()) { + return; + } + + Actor* actor = gPlayState->actorCtx.actorLists[ACTORCAT_NPC].head; + + while (actor != NULL) { + if (actor->id == ACTOR_EN_OE2 && actor->update == DummyPlayer_Update) { + NameTag_RemoveAllForActor(actor); + Actor_Kill(actor); + } + actor = actor->next; + } + + actorIndexToClientId.clear(); + refreshingActors = true; + for (auto& [clientId, client] : clients) { + if (!client.online || client.self) { + continue; + } + + actorIndexToClientId.push_back(clientId); + // We are using a hook `ShouldActorInit` to override the init/update/draw/destroy functions of the Player we spawn + // We quickly store a mapping of "index" to clientId, then within the init function we use this to get the clientId + // and store it on player->zTargetActiveTimer (unused s32 for the dummy) for convenience + auto dummy = Actor_Spawn(&gPlayState->actorCtx, gPlayState, ACTOR_PLAYER, client.posRot.pos.x, + client.posRot.pos.y, client.posRot.pos.z, client.posRot.rot.x, client.posRot.rot.y, + client.posRot.rot.z, actorIndexToClientId.size() - 1, false); + client.player = (Player*)dummy; + } + refreshingActors = false; +} + +bool Anchor::IsSaveLoaded() { + if (gPlayState == nullptr) { + return false; + } + + if (GET_PLAYER(gPlayState) == nullptr) { + return false; + } + + if (gSaveContext.fileNum < 0 || gSaveContext.fileNum > 2) { + return false; + } + + if (gSaveContext.gameMode != GAMEMODE_NORMAL) { + return false; + } + + return true; +} + +// MARK: - UI + +void Anchor::DrawMenu() { + ImGui::PushID("Anchor"); + + std::string host = CVarGetString(CVAR_REMOTE_ANCHOR("Host"), "anchor.proxysaw.dev"); + uint16_t port = CVarGetInteger(CVAR_REMOTE_ANCHOR("Port"), 43383); + std::string anchorTeamId = CVarGetString(CVAR_REMOTE_ANCHOR("TeamId"), "default"); + std::string anchorRoomId = CVarGetString(CVAR_REMOTE_ANCHOR("RoomId"), ""); + std::string anchorName = CVarGetString(CVAR_REMOTE_ANCHOR("Name"), ""); + bool isFormValid = !SohUtils::IsStringEmpty(host) && port > 1024 && port < 65535 && + !SohUtils::IsStringEmpty(anchorRoomId) && !SohUtils::IsStringEmpty(anchorName); + + ImGui::SeparatorText("Anchor"); + // UIWidgets::Tooltip("Anchor Stuff"); + if (ImGui::IsItemClicked()) { + // ImGui::SetClipboardText("https://github.com/garrettjoecox/anchor"); + } + + ImGui::BeginDisabled(isEnabled); + ImGui::Text("Host & Port"); + if (UIWidgets::InputString("##Host", &host)) { + CVarSetString(CVAR_REMOTE_ANCHOR("Host"), host.c_str()); + Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); + } + + ImGui::SameLine(); + ImGui::SetNextItemWidth(ImGui::GetFontSize() * 5); + if (ImGui::InputScalar("##Port", ImGuiDataType_U16, &port)) { + CVarSetInteger(CVAR_REMOTE_ANCHOR("Port"), port); + Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); + } + + ImGui::Text("Tunic Color & Name"); + static Color_RGBA8 color = CVarGetColor(CVAR_REMOTE_ANCHOR("Color"), { 100, 255, 100, 255 }); + static ImVec4 colorVec = ImVec4(color.r / 255.0, color.g / 255.0, color.b / 255.0, 1); + if (ImGui::ColorEdit3("##Color", (float*)&colorVec, + ImGuiColorEditFlags_NoInputs | ImGuiColorEditFlags_NoLabel)) { + color.r = colorVec.x * 255.0; + color.g = colorVec.y * 255.0; + color.b = colorVec.z * 255.0; + + CVarSetColor(CVAR_REMOTE_ANCHOR("Color"), color); + Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); + } + ImGui::SameLine(); + ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x); + if (UIWidgets::InputString("##Name", &anchorName)) { + CVarSetString(CVAR_REMOTE_ANCHOR("Name"), anchorName.c_str()); + Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); + } + ImGui::Text("Room ID"); + ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x); + if (UIWidgets::InputString("##RoomId", &anchorRoomId, isEnabled ? ImGuiInputTextFlags_Password : 0)) { + CVarSetString(CVAR_REMOTE_ANCHOR("RoomId"), anchorRoomId.c_str()); + Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); + } + ImGui::Text("Team ID (Items & Flags Shared)"); + ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x); + if (UIWidgets::InputString("##TeamId", &anchorTeamId)) { + CVarSetString(CVAR_REMOTE_ANCHOR("TeamId"), anchorTeamId.c_str()); + Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); + } + ImGui::EndDisabled(); + + ImGui::Spacing(); + + ImGui::BeginDisabled(!isFormValid); + const char* buttonLabel = isEnabled ? "Disable" : "Enable"; + if (ImGui::Button(buttonLabel, ImVec2(-1.0f, 0.0f))) { + if (isEnabled) { + CVarClear(CVAR_REMOTE_ANCHOR("Enabled")); + Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); + Disable(); + } else { + CVarSetInteger(CVAR_REMOTE_ANCHOR("Enabled"), 1); + Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); + Enable(); + } + } + ImGui::EndDisabled(); + + if (isEnabled) { + ImGui::Spacing(); + if (isConnected) { + ImGui::Text("Connected"); + + if (roomState.ownerClientId == ownClientId) { + if (ImGui::BeginMenu("Room Settings")) { + ImGui::Text("PvP Mode:"); + static const char* pvpModes[3] = { "Off", "On", "On + Friendly Fire" }; + if (UIWidgets::EnhancementCombobox(CVAR_REMOTE_ANCHOR("RoomSettings.PvpMode"), pvpModes, 1)) { + SendPacket_UpdateRoomState(); + } + ImGui::Text("Show Locations For:"); + static const char* showLocationsModes[3] = { "None", "Team Only", "All" }; + if (UIWidgets::EnhancementCombobox(CVAR_REMOTE_ANCHOR("RoomSettings.ShowLocationsMode"), showLocationsModes, 1)) { + SendPacket_UpdateRoomState(); + } + ImGui::Text("Allow Teleporting To:"); + static const char* teleportModes[3] = { "None", "Team Only", "All" }; + if (UIWidgets::EnhancementCombobox(CVAR_REMOTE_ANCHOR("RoomSettings.TeleportMode"), teleportModes, 1)) { + SendPacket_UpdateRoomState(); + } + ImGui::EndMenu(); + } + } + } else { + ImGui::Text("Connecting..."); + } + } + + ImGui::PopID(); +} + +#endif diff --git a/soh/soh/Network/Anchor/Anchor.h b/soh/soh/Network/Anchor/Anchor.h new file mode 100644 index 000000000..eceb02c1d --- /dev/null +++ b/soh/soh/Network/Anchor/Anchor.h @@ -0,0 +1,176 @@ +#ifdef ENABLE_REMOTE_CONTROL +#ifndef NETWORK_ANCHOR_H +#define NETWORK_ANCHOR_H +#ifdef __cplusplus + +#include "soh/Network/Network.h" +#include + +extern "C" { +#include "variables.h" +#include "z64.h" +} + +void DummyPlayer_Init(Actor* actor, PlayState* play); +void DummyPlayer_Update(Actor* actor, PlayState* play); +void DummyPlayer_Draw(Actor* actor, PlayState* play); +void DummyPlayer_Destroy(Actor* actor, PlayState* play); + +typedef struct { + uint32_t clientId; + std::string name; + Color_RGB8 color; + std::string clientVersion; + std::string teamId; + bool online; + bool self; + uint32_t seed; + bool isSaveLoaded; + bool isGameComplete; + s16 sceneNum; + s32 entranceIndex; + + // Only available in PLAYER_UPDATE packets + s32 linkAge; + PosRot posRot; + Vec3s jointTable[24]; + Vec3s upperLimbRot; + s8 currentBoots; + s8 currentShield; + s8 currentTunic; + u32 stateFlags1; + u32 stateFlags2; + u8 buttonItem0; + s8 itemAction; + s8 heldItemAction; + u8 modelGroup; + s8 invincibilityTimer; + s16 unk_862; + s8 actionVar1; + + // Ptr to the dummy player + Player* player; +} AnchorClient; + +typedef struct { + uint32_t ownerClientId; + u8 pvpMode; // 0 = off, 1 = on, 2 = on with friendly fire + u8 showLocationsMode; // 0 = none, 1 = team, 2 = all + u8 teleportMode; // 0 = off, 1 = team, 2 = all +} RoomState; + +class Anchor : public Network { + private: + bool refreshingActors = false; + bool justLoadedSave = false; + bool isHandlingUpdateTeamState = false; + uint32_t ownClientId; + + nlohmann::json PrepClientState(); + nlohmann::json PrepRoomState(); + void RegisterHooks(); + void RefreshClientActors(); + void HandlePacket_AllClientState(nlohmann::json payload); + void HandlePacket_ConsumeAdultTradeItem(nlohmann::json payload); + void HandlePacket_DamagePlayer(nlohmann::json payload); + void HandlePacket_DisableAnchor(nlohmann::json payload); + void HandlePacket_EntranceDiscovered(nlohmann::json payload); + void HandlePacket_GameComplete(nlohmann::json payload); + void HandlePacket_GiveItem(nlohmann::json payload); + void HandlePacket_PlayerSfx(nlohmann::json payload); + void HandlePacket_PlayerUpdate(nlohmann::json payload); + void HandlePacket_RequestTeamState(nlohmann::json payload); + void HandlePacket_RequestTeleport(nlohmann::json payload); + void HandlePacket_ServerMessage(nlohmann::json payload); + void HandlePacket_SetCheckStatus(nlohmann::json payload); + void HandlePacket_SetFlag(nlohmann::json payload); + void HandlePacket_TeleportTo(nlohmann::json payload); + void HandlePacket_UnsetFlag(nlohmann::json payload); + void HandlePacket_UpdateBeansCount(nlohmann::json payload); + void HandlePacket_UpdateClientState(nlohmann::json payload); + void HandlePacket_UpdateDungeonItems(nlohmann::json payload); + void HandlePacket_UpdateRoomState(nlohmann::json payload); + void HandlePacket_UpdateTeamState(nlohmann::json payload); + + public: + inline static const std::string clientVersion = (char*)gBuildVersion; + + // Packet types // + inline static const std::string ALL_CLIENT_STATE = "ALL_CLIENT_STATE"; + inline static const std::string CONSUME_ADULT_TRADE_ITEM = "CONSUME_ADULT_TRADE_ITEM"; + inline static const std::string DAMAGE_PLAYER = "DAMAGE_PLAYER"; + inline static const std::string DISABLE_ANCHOR = "DISABLE_ANCHOR"; + inline static const std::string ENTRANCE_DISCOVERED = "ENTRANCE_DISCOVERED"; + inline static const std::string GAME_COMPLETE = "GAME_COMPLETE"; + inline static const std::string GIVE_ITEM = "GIVE_ITEM"; + inline static const std::string HANDSHAKE = "HANDSHAKE"; + inline static const std::string PLAYER_SFX = "PLAYER_SFX"; + inline static const std::string PLAYER_UPDATE = "PLAYER_UPDATE"; + inline static const std::string REQUEST_TEAM_STATE = "REQUEST_TEAM_STATE"; + inline static const std::string REQUEST_TELEPORT = "REQUEST_TELEPORT"; + inline static const std::string SERVER_MESSAGE = "SERVER_MESSAGE"; + inline static const std::string SET_CHECK_STATUS = "SET_CHECK_STATUS"; + inline static const std::string SET_FLAG = "SET_FLAG"; + inline static const std::string TELEPORT_TO = "TELEPORT_TO"; + inline static const std::string UNSET_FLAG = "UNSET_FLAG"; + inline static const std::string UPDATE_BEANS_COUNT = "UPDATE_BEANS_COUNT"; + inline static const std::string UPDATE_CLIENT_STATE = "UPDATE_CLIENT_STATE"; + inline static const std::string UPDATE_DUNGEON_ITEMS = "UPDATE_DUNGEON_ITEMS"; + inline static const std::string UPDATE_ROOM_STATE = "UPDATE_ROOM_STATE"; + inline static const std::string UPDATE_TEAM_STATE = "UPDATE_TEAM_STATE"; + + static Anchor* Instance; + std::map clients; + std::vector actorIndexToClientId; + RoomState roomState; + + void Enable(); + void Disable(); + void OnIncomingJson(nlohmann::json payload); + void OnConnected(); + void OnDisconnected(); + void DrawMenu(); + void SendJsonToRemote(nlohmann::json packet); + bool IsSaveLoaded(); + + void SendPacket_ConsumeAdultTradeItem(u8 itemId); + void SendPacket_DamagePlayer(u32 clientId, u8 damageEffect, u8 damage); + void SendPacket_EntranceDiscovered(u16 entranceIndex); + void SendPacket_GameComplete(); + void SendPacket_GiveItem(u16 modId, s16 getItemId); + void SendPacket_Handshake(); + void SendPacket_PlayerSfx(u16 sfxId); + void SendPacket_PlayerUpdate(); + void SendPacket_RequestTeamState(); + void SendPacket_RequestTeleport(u32 clientId); + void SendPacket_SetCheckStatus(RandomizerCheck rc); + void SendPacket_SetFlag(s16 sceneNum, s16 flagType, s16 flag); + void SendPacket_TeleportTo(u32 clientId); + void SendPacket_UnsetFlag(s16 sceneNum, s16 flagType, s16 flag); + void SendPacket_UpdateBeansCount(); + void SendPacket_UpdateClientState(); + void SendPacket_UpdateDungeonItems(); + void SendPacket_UpdateRoomState(); + void SendPacket_UpdateTeamState(); +}; + +typedef enum { + // Starting at 5 to continue from the last value in the PlayerDamageResponseType enum + DUMMY_PLAYER_HIT_RESPONSE_STUN = 5, + DUMMY_PLAYER_HIT_RESPONSE_FIRE, + DUMMY_PLAYER_HIT_RESPONSE_NORMAL, +} DummyPlayerDamageResponseType; + +class AnchorRoomWindow : public Ship::GuiWindow { + public: + using GuiWindow::GuiWindow; + + void InitElement() override {}; + void DrawElement() override {}; + void Draw() override; + void UpdateElement() override {}; +}; + +#endif // __cplusplus +#endif // NETWORK_ANCHOR_H +#endif // ENABLE_REMOTE_CONTROL diff --git a/soh/soh/Network/Anchor/AnchorRoomWindow.cpp b/soh/soh/Network/Anchor/AnchorRoomWindow.cpp new file mode 100644 index 000000000..7a683eca0 --- /dev/null +++ b/soh/soh/Network/Anchor/AnchorRoomWindow.cpp @@ -0,0 +1,118 @@ +#ifdef ENABLE_REMOTE_CONTROL + +#include "Anchor.h" +#include "soh/OTRGlobals.h" + +extern "C" { +#include "variables.h" +#include "functions.h" +extern PlayState* gPlayState; +} + +void AnchorRoomWindow::Draw() { + if (!Anchor::Instance->isConnected) { + return; + } + + + ImGui::PushStyleColor(ImGuiCol_WindowBg, ImVec4(0, 0, 0, CVarGetFloat(CVAR_SETTING("Notifications.BgOpacity"), 0.5f))); + ImGui::PushStyleColor(ImGuiCol_Border, ImVec4(0, 0, 0, 0)); + ImGui::PushStyleVar(ImGuiStyleVar_WindowRounding, 4.0f); + + auto vp = ImGui::GetMainViewport(); + ImGui::SetNextWindowViewport(vp->ID); + + ImGui::Begin("Anchor Room", nullptr, + ImGuiWindowFlags_AlwaysAutoResize | + ImGuiWindowFlags_NoNav | + ImGuiWindowFlags_NoFocusOnAppearing | + ImGuiWindowFlags_NoResize | + ImGuiWindowFlags_NoDocking | + ImGuiWindowFlags_NoTitleBar | + ImGuiWindowFlags_NoScrollWithMouse | + ImGuiWindowFlags_NoScrollbar + ); + + // First build a list of teams + std::set teams; + for (auto& [clientId, client] : Anchor::Instance->clients) { + teams.insert(client.teamId); + } + + for (auto& team : teams) { + if (teams.size() > 1) { + ImGui::SeparatorText(team.c_str()); + } + bool isOwnTeam = team == CVarGetString(CVAR_REMOTE_ANCHOR("TeamId"), "default"); + for (auto& [clientId, client] : Anchor::Instance->clients) { + if (client.teamId != team) { + continue; + } + + if (client.clientId == Anchor::Instance->roomState.ownerClientId) { + ImGui::TextColored(ImVec4(1, 1, 0, 1), "%s", ICON_FA_GAVEL); + ImGui::SameLine(); + } + + if (client.self) { + ImGui::TextColored(ImVec4(0.8f, 1.0f, 0.8f, 1.0f), "%s", CVarGetString(CVAR_REMOTE_ANCHOR("Name"), "")); + } else if (!client.online) { + ImGui::TextColored(ImVec4(1, 1, 1, 0.3f), "%s - offline", client.name.c_str()); + continue; + } else { + ImGui::Text("%s", client.name.c_str()); + } + + if (Anchor::Instance->roomState.showLocationsMode == 2 || (Anchor::Instance->roomState.showLocationsMode == 1 && isOwnTeam)) { + if ((client.self ? Anchor::Instance->IsSaveLoaded() : client.isSaveLoaded)) { + ImGui::SameLine(); + ImGui::TextColored(ImVec4(1, 1, 1, 0.5f), "- %s", SohUtils::GetSceneName(client.self ? gPlayState->sceneNum : client.sceneNum).c_str()); + } + } + + if ( + Anchor::Instance->IsSaveLoaded() && !client.self && client.isSaveLoaded && + (Anchor::Instance->roomState.teleportMode == 2 || (Anchor::Instance->roomState.teleportMode == 1 && isOwnTeam)) + ) { + ImGui::SameLine(); + ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(0, 0)); + if (ImGui::Button(ICON_FA_LOCATION_ARROW, ImVec2(15.0f, 15.0f))) { + Anchor::Instance->SendPacket_RequestTeleport(client.clientId); + } + ImGui::PopStyleVar(); + } + + if (client.clientVersion != Anchor::clientVersion) { + ImGui::SameLine(); + ImGui::TextColored(ImVec4(1, 0, 0, 1), ICON_FA_EXCLAMATION_TRIANGLE); + if (ImGui::IsItemHovered()) { + ImGui::BeginTooltip(); + ImGui::Text("Incompatible version! Will not work together!"); + ImGui::Text("Yours: %s", Anchor::clientVersion.c_str()); + ImGui::Text("Theirs: %s", client.clientVersion.c_str()); + ImGui::EndTooltip(); + } + } + uint32_t seed = IS_RANDO ? Rando::Context::GetInstance()->GetSettings()->GetSeed() : 0; + if (client.isSaveLoaded && Anchor::Instance->IsSaveLoaded() && client.seed != seed && client.online) { + ImGui::SameLine(); + ImGui::TextColored(ImVec4(1, 0, 0, 1), ICON_FA_EXCLAMATION_TRIANGLE); + if (ImGui::IsItemHovered()) { + ImGui::BeginTooltip(); + ImGui::Text("Seed mismatch! Continuing will break things!"); + ImGui::Text("Yours: %u", seed); + ImGui::Text("Theirs: %u", client.seed); + ImGui::EndTooltip(); + } + } + } + } + + + ImGui::End(); + + ImGui::PopStyleVar(); + ImGui::PopStyleColor(2); +} + +#endif // ENABLE_REMOTE_CONTROL diff --git a/soh/soh/Network/Anchor/DummyPlayer.cpp b/soh/soh/Network/Anchor/DummyPlayer.cpp new file mode 100644 index 000000000..63c6daf03 --- /dev/null +++ b/soh/soh/Network/Anchor/DummyPlayer.cpp @@ -0,0 +1,216 @@ +#ifdef ENABLE_REMOTE_CONTROL + +#include "Anchor.h" +#include "soh/Enhancements/nametag.h" +#include "soh/frame_interpolation.h" + +extern "C" { +#include "macros.h" +#include "variables.h" +#include "functions.h" +extern PlayState* gPlayState; + +void Player_UseItem(PlayState* play, Player* player, s32 item); +void Player_Draw(Actor* actor, PlayState* play); +} + +// Hijacking player->zTargetActiveTimer (unused s32 for the dummy) to store the clientId for convenience +#define DUMMY_CLIENT_ID player->zTargetActiveTimer + +static DamageTable DummyPlayerDamageTable = { + /* Deku nut */ DMG_ENTRY(0, DUMMY_PLAYER_HIT_RESPONSE_STUN), + /* Deku stick */ DMG_ENTRY(2, DUMMY_PLAYER_HIT_RESPONSE_NORMAL), + /* Slingshot */ DMG_ENTRY(1, DUMMY_PLAYER_HIT_RESPONSE_NORMAL), + /* Explosive */ DMG_ENTRY(2, DUMMY_PLAYER_HIT_RESPONSE_NORMAL), + /* Boomerang */ DMG_ENTRY(0, DUMMY_PLAYER_HIT_RESPONSE_STUN), + /* Normal arrow */ DMG_ENTRY(2, DUMMY_PLAYER_HIT_RESPONSE_NORMAL), + /* Hammer swing */ DMG_ENTRY(2, PLAYER_HIT_RESPONSE_KNOCKBACK_LARGE), + /* Hookshot */ DMG_ENTRY(0, DUMMY_PLAYER_HIT_RESPONSE_STUN), + /* Kokiri sword */ DMG_ENTRY(1, DUMMY_PLAYER_HIT_RESPONSE_NORMAL), + /* Master sword */ DMG_ENTRY(2, DUMMY_PLAYER_HIT_RESPONSE_NORMAL), + /* Giant's Knife */ DMG_ENTRY(4, DUMMY_PLAYER_HIT_RESPONSE_NORMAL), + /* Fire arrow */ DMG_ENTRY(2, DUMMY_PLAYER_HIT_RESPONSE_FIRE), + /* Ice arrow */ DMG_ENTRY(4, PLAYER_HIT_RESPONSE_ICE_TRAP), + /* Light arrow */ DMG_ENTRY(2, PLAYER_HIT_RESPONSE_ELECTRIC_SHOCK), + /* Unk arrow 1 */ DMG_ENTRY(2, PLAYER_HIT_RESPONSE_NONE), + /* Unk arrow 2 */ DMG_ENTRY(2, PLAYER_HIT_RESPONSE_NONE), + /* Unk arrow 3 */ DMG_ENTRY(2, PLAYER_HIT_RESPONSE_NONE), + /* Fire magic */ DMG_ENTRY(0, DUMMY_PLAYER_HIT_RESPONSE_FIRE), + /* Ice magic */ DMG_ENTRY(3, PLAYER_HIT_RESPONSE_ICE_TRAP), + /* Light magic */ DMG_ENTRY(0, PLAYER_HIT_RESPONSE_ELECTRIC_SHOCK), + /* Shield */ DMG_ENTRY(0, PLAYER_HIT_RESPONSE_NONE), + /* Mirror Ray */ DMG_ENTRY(0, PLAYER_HIT_RESPONSE_NONE), + /* Kokiri spin */ DMG_ENTRY(1, DUMMY_PLAYER_HIT_RESPONSE_NORMAL), + /* Giant spin */ DMG_ENTRY(4, DUMMY_PLAYER_HIT_RESPONSE_NORMAL), + /* Master spin */ DMG_ENTRY(2, DUMMY_PLAYER_HIT_RESPONSE_NORMAL), + /* Kokiri jump */ DMG_ENTRY(2, DUMMY_PLAYER_HIT_RESPONSE_NORMAL), + /* Giant jump */ DMG_ENTRY(8, DUMMY_PLAYER_HIT_RESPONSE_NORMAL), + /* Master jump */ DMG_ENTRY(4, DUMMY_PLAYER_HIT_RESPONSE_NORMAL), + /* Unknown 1 */ DMG_ENTRY(0, PLAYER_HIT_RESPONSE_NONE), + /* Unblockable */ DMG_ENTRY(0, PLAYER_HIT_RESPONSE_NONE), + /* Hammer jump */ DMG_ENTRY(4, PLAYER_HIT_RESPONSE_KNOCKBACK_LARGE), + /* Unknown 2 */ DMG_ENTRY(0, PLAYER_HIT_RESPONSE_NONE), +}; + +void DummyPlayer_Init(Actor* actor, PlayState* play) { + Player* player = (Player*)actor; + + uint32_t clientId = Anchor::Instance->actorIndexToClientId[actor->params]; + DUMMY_CLIENT_ID = clientId; + + if (!Anchor::Instance->clients.contains(DUMMY_CLIENT_ID)) { + Actor_Kill(actor); + return; + } + + AnchorClient& client = Anchor::Instance->clients[DUMMY_CLIENT_ID]; + + // Hack to account for usage of gSaveContext in Player_Init + s32 originalAge = gSaveContext.linkAge; + gSaveContext.linkAge = client.linkAge; + + // #region modeled after EnTorch2_Init and Player_Init + actor->room = -1; + player->itemAction = player->heldItemAction = -1; + player->heldItemId = ITEM_NONE; + Player_UseItem(play, player, ITEM_NONE); + Player_SetModelGroup(player, Player_ActionToModelGroup(player, player->heldItemAction)); + play->playerInit(player, play, gPlayerSkelHeaders[client.linkAge]); + + play->func_11D54(player, play); + // #endregion + + player->cylinder.base.acFlags = AC_ON | AC_TYPE_PLAYER; + player->cylinder.base.ocFlags2 = OC2_TYPE_1; + player->cylinder.info.bumperFlags = BUMP_ON | BUMP_HOOKABLE | BUMP_NO_HITMARK; + player->actor.flags |= ACTOR_FLAG_DRAGGED_BY_HOOKSHOT; + player->cylinder.dim.radius = 30; + player->actor.colChkInfo.damageTable = &DummyPlayerDamageTable; + + gSaveContext.linkAge = originalAge; + + NameTag_RegisterForActorWithOptions(actor, client.name.c_str(), { .yOffset = 30 }); +} + +void Math_Vec3s_Copy(Vec3s* dest, Vec3s* src) { + dest->x = src->x; + dest->y = src->y; + dest->z = src->z; +} + +// Update the actor with new data from the client +void DummyPlayer_Update(Actor* actor, PlayState* play) { + Player* player = (Player*)actor; + + if (!Anchor::Instance->clients.contains(DUMMY_CLIENT_ID)) { + Actor_Kill(actor); + return; + } + + AnchorClient& client = Anchor::Instance->clients[DUMMY_CLIENT_ID]; + + if (client.sceneNum != gPlayState->sceneNum || !client.online || !client.isSaveLoaded) { + actor->world.pos.x = -9999.0f; + actor->world.pos.y = -9999.0f; + actor->world.pos.z = -9999.0f; + actor->shape.shadowAlpha = 0; + return; + } + + actor->shape.shadowAlpha = 255; + Math_Vec3s_Copy(&player->upperLimbRot, &client.upperLimbRot); + Math_Vec3s_Copy(&actor->shape.rot, &client.posRot.rot); + Math_Vec3f_Copy(&actor->world.pos, &client.posRot.pos); + player->skelAnime.jointTable = client.jointTable; + player->currentBoots = client.currentBoots; + player->currentShield = client.currentShield; + player->currentTunic = client.currentTunic; + player->stateFlags1 = client.stateFlags1; + player->stateFlags2 = client.stateFlags2; + player->itemAction = client.itemAction; + player->heldItemAction = client.heldItemAction; + player->invincibilityTimer = client.invincibilityTimer; + player->unk_862 = client.unk_862; + player->av1.actionVar1 = client.actionVar1; + + if (player->modelGroup != client.modelGroup) { + // Hack to account for usage of gSaveContext + s32 originalAge = gSaveContext.linkAge; + gSaveContext.linkAge = client.linkAge; + u8 originalButtonItem0 = gSaveContext.equips.buttonItems[0]; + gSaveContext.equips.buttonItems[0] = client.buttonItem0; + Player_SetModelGroup(player, client.modelGroup); + gSaveContext.linkAge = originalAge; + gSaveContext.equips.buttonItems[0] = originalButtonItem0; + } + + if ( + Anchor::Instance->roomState.pvpMode == 0 || + (Anchor::Instance->roomState.pvpMode == 1 && client.teamId == CVarGetString(CVAR_REMOTE_ANCHOR("TeamId"), "default")) + ) { + return; + } + + if (player->cylinder.base.acFlags & AC_HIT && player->invincibilityTimer == 0) { + Anchor::Instance->SendPacket_DamagePlayer(client.clientId, player->actor.colChkInfo.damageEffect, player->actor.colChkInfo.damage); + if (player->actor.colChkInfo.damageEffect == DUMMY_PLAYER_HIT_RESPONSE_STUN) { + Actor_SetColorFilter(&player->actor, 0, 0xFF, 0, 24); + } else { + player->invincibilityTimer = 20; + } + } + + Collider_UpdateCylinder(&player->actor, &player->cylinder); + + if (!(player->stateFlags2 & PLAYER_STATE2_FROZEN)) { + if (!(player->stateFlags1 & (PLAYER_STATE1_DEAD | PLAYER_STATE1_HANGING_OFF_LEDGE | PLAYER_STATE1_CLIMBING_LEDGE | PLAYER_STATE1_ON_HORSE))) { + CollisionCheck_SetOC(play, &play->colChkCtx, &player->cylinder.base); + } + + if (!(player->stateFlags1 & (PLAYER_STATE1_DEAD | PLAYER_STATE1_DAMAGED)) && (player->invincibilityTimer <= 0)) { + CollisionCheck_SetAC(play, &play->colChkCtx, &player->cylinder.base); + + if (player->invincibilityTimer < 0) { + CollisionCheck_SetAT(play, &play->colChkCtx, &player->cylinder.base); + } + } + } + + if (player->stateFlags1 & (PLAYER_STATE1_DEAD | PLAYER_STATE1_IN_ITEM_CS | PLAYER_STATE1_IN_CUTSCENE)) { + player->actor.colChkInfo.mass = MASS_IMMOVABLE; + } else { + player->actor.colChkInfo.mass = 50; + } + + Collider_ResetCylinderAC(play, &player->cylinder.base); +} + +void DummyPlayer_Draw(Actor* actor, PlayState* play) { + Player* player = (Player*)actor; + + if (!Anchor::Instance->clients.contains(DUMMY_CLIENT_ID)) { + Actor_Kill(actor); + return; + } + + AnchorClient& client = Anchor::Instance->clients[DUMMY_CLIENT_ID]; + + if (client.sceneNum != gPlayState->sceneNum || !client.online || !client.isSaveLoaded) { + return; + } + + // Hack to account for usage of gSaveContext in Player_Draw + s32 originalAge = gSaveContext.linkAge; + gSaveContext.linkAge = client.linkAge; + u8 originalButtonItem0 = gSaveContext.equips.buttonItems[0]; + gSaveContext.equips.buttonItems[0] = client.buttonItem0; + + Player_Draw((Actor*)player, play); + gSaveContext.linkAge = originalAge; + gSaveContext.equips.buttonItems[0] = originalButtonItem0; +} + +void DummyPlayer_Destroy(Actor* actor, PlayState* play) { +} + +#endif // ENABLE_REMOTE_CONTROL diff --git a/soh/soh/Network/Anchor/JsonConversions.hpp b/soh/soh/Network/Anchor/JsonConversions.hpp new file mode 100644 index 000000000..3ec04f043 --- /dev/null +++ b/soh/soh/Network/Anchor/JsonConversions.hpp @@ -0,0 +1,186 @@ +#ifdef ENABLE_REMOTE_CONTROL +#ifndef NETWORK_ANCHOR_JSON_CONVERSIONS_H +#define NETWORK_ANCHOR_JSON_CONVERSIONS_H +#ifdef __cplusplus + +#include +#include +#include "Anchor.h" + +extern "C" { +#include "z64.h" +} + +using json = nlohmann::json; + +inline void from_json(const json& j, Color_RGB8& color) { + j.at("r").get_to(color.r); + j.at("g").get_to(color.g); + j.at("b").get_to(color.b); +} + +inline void to_json(json& j, const Color_RGB8& color) { + j = json{ + {"r", color.r}, + {"g", color.g}, + {"b", color.b} + }; +} + +inline void to_json(json& j, const Vec3f& vec) { + j = json{ + {"x", vec.x}, + {"y", vec.y}, + {"z", vec.z} + }; +} + +inline void to_json(json& j, const Vec3s& vec) { + j = json{ + {"x", vec.x}, + {"y", vec.y}, + {"z", vec.z} + }; +} + +inline void from_json(const json& j, Vec3f& vec) { + j.at("x").get_to(vec.x); + j.at("y").get_to(vec.y); + j.at("z").get_to(vec.z); +} + +inline void from_json(const json& j, Vec3s& vec) { + j.at("x").get_to(vec.x); + j.at("y").get_to(vec.y); + j.at("z").get_to(vec.z); +} + +inline void to_json(json& j, const PosRot& posRot) { + j = json{ + {"pos", posRot.pos}, + {"rot", posRot.rot} + }; +} + +inline void from_json(const json& j, PosRot& posRot) { + j.at("pos").get_to(posRot.pos); + j.at("rot").get_to(posRot.rot); +} + +inline void from_json(const json& j, AnchorClient& client) { + j.contains("clientId") ? j.at("clientId").get_to(client.clientId) : client.clientId = 0; + j.contains("name") ? j.at("name").get_to(client.name) : client.name = "???"; + j.contains("color") ? j.at("color").get_to(client.color) : client.color = { 255, 255, 255 }; + j.contains("clientVersion") ? j.at("clientVersion").get_to(client.clientVersion) : client.clientVersion = "???"; + j.contains("teamId") ? j.at("teamId").get_to(client.teamId) : client.teamId = "default"; + j.contains("online") ? j.at("online").get_to(client.online) : client.online = false; + j.contains("seed") ? j.at("seed").get_to(client.seed) : client.seed = 0; + j.contains("isSaveLoaded") ? j.at("isSaveLoaded").get_to(client.isSaveLoaded) : client.isSaveLoaded = false; + j.contains("isGameComplete") ? j.at("isGameComplete").get_to(client.isGameComplete) : client.isGameComplete = false; + j.contains("sceneNum") ? j.at("sceneNum").get_to(client.sceneNum) : client.sceneNum = SCENE_ID_MAX; + j.contains("entranceIndex") ? j.at("entranceIndex").get_to(client.entranceIndex) : client.entranceIndex = 0; + j.contains("self") ? j.at("self").get_to(client.self) : client.self = false; +} + +inline void to_json(json& j, const Inventory& inventory) { + j = json{ + {"items", inventory.items}, + {"ammo", inventory.ammo}, + {"equipment", inventory.equipment}, + {"upgrades", inventory.upgrades}, + {"questItems", inventory.questItems}, + {"dungeonItems", inventory.dungeonItems}, + {"dungeonKeys", inventory.dungeonKeys}, + {"defenseHearts", inventory.defenseHearts}, + {"gsTokens", inventory.gsTokens} + }; +} + +inline void from_json(const json& j, Inventory& inventory) { + j.at("items").get_to(inventory.items); + j.at("ammo").get_to(inventory.ammo); + j.at("equipment").get_to(inventory.equipment); + j.at("upgrades").get_to(inventory.upgrades); + j.at("questItems").get_to(inventory.questItems); + j.at("dungeonItems").get_to(inventory.dungeonItems); + j.at("dungeonKeys").get_to(inventory.dungeonKeys); + j.at("defenseHearts").get_to(inventory.defenseHearts); + j.at("gsTokens").get_to(inventory.gsTokens); +} + +inline void to_json(json& j, const SohStats& sohStats) { + j = json{ + {"entrancesDiscovered", sohStats.entrancesDiscovered}, + {"fileCreatedAt", sohStats.fileCreatedAt}, + }; +} + +inline void from_json(const json& j, SohStats& sohStats) { + j.at("entrancesDiscovered").get_to(sohStats.entrancesDiscovered); + j.at("fileCreatedAt").get_to(sohStats.fileCreatedAt); +} + +inline void to_json(json& j, const SaveContext& saveContext) { + std::vector sceneFlagsArray; + for (const auto& sceneFlags : saveContext.sceneFlags) { + sceneFlagsArray.push_back(sceneFlags.chest); + sceneFlagsArray.push_back(sceneFlags.swch); + sceneFlagsArray.push_back(sceneFlags.clear); + sceneFlagsArray.push_back(sceneFlags.collect); + } + + j = json{ + {"healthCapacity", saveContext.healthCapacity}, + {"magicLevel", saveContext.magicLevel}, + {"magicCapacity", saveContext.magicCapacity}, + {"isMagicAcquired", saveContext.isMagicAcquired}, + {"isDoubleMagicAcquired", saveContext.isDoubleMagicAcquired}, + {"isDoubleDefenseAcquired", saveContext.isDoubleDefenseAcquired}, + {"bgsFlag", saveContext.bgsFlag}, + {"swordHealth", saveContext.swordHealth}, + {"sceneFlags", sceneFlagsArray}, + {"eventChkInf", saveContext.eventChkInf}, + {"itemGetInf", saveContext.itemGetInf}, + {"infTable", saveContext.infTable}, + {"randomizerInf", saveContext.randomizerInf}, + {"gsFlags", saveContext.gsFlags}, + {"inventory", saveContext.inventory}, + {"sohStats", saveContext.sohStats}, + {"adultTradeItems", saveContext.adultTradeItems}, + {"triforcePiecesCollected", saveContext.triforcePiecesCollected}, + {"questId", saveContext.questId}, + }; +} + +inline void from_json(const json& j, SaveContext& saveContext) { + j.at("healthCapacity").get_to(saveContext.healthCapacity); + j.at("magicLevel").get_to(saveContext.magicLevel); + j.at("magicCapacity").get_to(saveContext.magicCapacity); + j.at("isMagicAcquired").get_to(saveContext.isMagicAcquired); + j.at("isDoubleMagicAcquired").get_to(saveContext.isDoubleMagicAcquired); + j.at("isDoubleDefenseAcquired").get_to(saveContext.isDoubleDefenseAcquired); + j.at("bgsFlag").get_to(saveContext.bgsFlag); + j.at("swordHealth").get_to(saveContext.swordHealth); + std::vector sceneFlagsArray; + j.at("sceneFlags").get_to(sceneFlagsArray); + for (int i = 0; i < 124; i++) { + saveContext.sceneFlags[i].chest = sceneFlagsArray[i * 4]; + saveContext.sceneFlags[i].swch = sceneFlagsArray[i * 4 + 1]; + saveContext.sceneFlags[i].clear = sceneFlagsArray[i * 4 + 2]; + saveContext.sceneFlags[i].collect = sceneFlagsArray[i * 4 + 3]; + } + j.at("eventChkInf").get_to(saveContext.eventChkInf); + j.at("itemGetInf").get_to(saveContext.itemGetInf); + j.at("infTable").get_to(saveContext.infTable); + j.at("randomizerInf").get_to(saveContext.randomizerInf); + j.at("gsFlags").get_to(saveContext.gsFlags); + j.at("inventory").get_to(saveContext.inventory); + j.at("sohStats").get_to(saveContext.sohStats); + j.at("adultTradeItems").get_to(saveContext.adultTradeItems); + j.at("triforcePiecesCollected").get_to(saveContext.triforcePiecesCollected); + j.at("questId").get_to(saveContext.questId); +} + +#endif // __cplusplus +#endif // NETWORK_ANCHOR_JSON_CONVERSIONS_H +#endif // ENABLE_REMOTE_CONTROL diff --git a/soh/soh/Network/Anchor/Packets/AllClientState.cpp b/soh/soh/Network/Anchor/Packets/AllClientState.cpp new file mode 100644 index 000000000..d9d455535 --- /dev/null +++ b/soh/soh/Network/Anchor/Packets/AllClientState.cpp @@ -0,0 +1,74 @@ +#ifdef ENABLE_REMOTE_CONTROL + +#include "soh/Network/Anchor/Anchor.h" +#include "soh/Network/Anchor/JsonConversions.hpp" +#include +#include +#include "soh/OTRGlobals.h" +#include "soh/Notification/Notification.h" + +/** + * ALL_CLIENT_STATE + * + * Contains a list of all clients and their CLIENT_STATE currently connected to the server + * + * The server itself sends this packet to all clients when a client connects or disconnects + */ + +void Anchor::HandlePacket_AllClientState(nlohmann::json payload) { + std::vector newClients = payload["state"].get>(); + + // add new clients + for (auto& client : newClients) { + if (client.self) { + ownClientId = client.clientId; + CVarSetInteger(CVAR_REMOTE_ANCHOR("LastClientId"), ownClientId); + Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); + clients[client.clientId].self = true; + } else { + clients[client.clientId].self = false; + if (clients.contains(client.clientId)) { + if (clients[client.clientId].online != client.online) { + Notification::Emit({ + .prefix = client.name, + .message = client.online ? "Connected" : "Disconnected", + }); + } + } else if (client.online) { + Notification::Emit({ + .prefix = client.name, + .message = "Connected", + }); + } + } + + clients[client.clientId].clientId = client.clientId; + clients[client.clientId].name = client.name; + clients[client.clientId].color = client.color; + clients[client.clientId].clientVersion = client.clientVersion; + clients[client.clientId].teamId = client.teamId; + clients[client.clientId].online = client.online; + clients[client.clientId].seed = client.seed; + clients[client.clientId].isSaveLoaded = client.isSaveLoaded; + clients[client.clientId].isGameComplete = client.isGameComplete; + clients[client.clientId].sceneNum = client.sceneNum; + clients[client.clientId].entranceIndex = client.entranceIndex; + } + + // remove clients that are no longer in the list + std::vector clientsToRemove; + for (auto& [clientId, client] : clients) { + if (std::find_if(newClients.begin(), newClients.end(), + [clientId](AnchorClient& c) { return c.clientId == clientId; }) == newClients.end()) { + clientsToRemove.push_back(clientId); + } + } + // (seperate loop to avoid iterator invalidation) + for (auto& clientId : clientsToRemove) { + clients.erase(clientId); + } + + RefreshClientActors(); +} + +#endif // ENABLE_REMOTE_CONTROL diff --git a/soh/soh/Network/Anchor/Packets/ConsumeAdultTradeItem.cpp b/soh/soh/Network/Anchor/Packets/ConsumeAdultTradeItem.cpp new file mode 100644 index 000000000..645916f6d --- /dev/null +++ b/soh/soh/Network/Anchor/Packets/ConsumeAdultTradeItem.cpp @@ -0,0 +1,46 @@ +#ifdef ENABLE_REMOTE_CONTROL + +#include "soh/Network/Anchor/Anchor.h" +#include +#include +#include "soh/Enhancements/game-interactor/GameInteractor.h" +#include "soh/OTRGlobals.h" + +extern "C" { +#include "functions.h" +#include "soh/Enhancements/randomizer/adult_trade_shuffle.h" +extern PlayState* gPlayState; +} + +/** + * CONSUME_ADULT_TRADE_ITEM + * + * This is primarily to just get rid of used adult trade items to prevent confusion for other players. + * Whatever flags/items are given from adult trade checks are synced by other packets. + */ + +void Anchor::SendPacket_ConsumeAdultTradeItem(u8 itemId) { + if (!IsSaveLoaded()) { + return; + } + + nlohmann::json payload; + payload["type"] = CONSUME_ADULT_TRADE_ITEM; + payload["targetTeamId"] = CVarGetString(CVAR_REMOTE_ANCHOR("TeamId"), "default"); + payload["addToQueue"] = true; + payload["itemId"] = itemId; + + SendJsonToRemote(payload); +} + +void Anchor::HandlePacket_ConsumeAdultTradeItem(nlohmann::json payload) { + if (!IsSaveLoaded()) { + return; + } + + uint8_t itemId = payload["itemId"].get(); + gSaveContext.adultTradeItems &= ~ADULT_TRADE_FLAG(itemId); + Inventory_ReplaceItem(gPlayState, itemId, Randomizer_GetNextAdultTradeItem()); +} + +#endif // ENABLE_REMOTE_CONTROL diff --git a/soh/soh/Network/Anchor/Packets/DamagePlayer.cpp b/soh/soh/Network/Anchor/Packets/DamagePlayer.cpp new file mode 100644 index 000000000..e2da27eef --- /dev/null +++ b/soh/soh/Network/Anchor/Packets/DamagePlayer.cpp @@ -0,0 +1,62 @@ +#ifdef ENABLE_REMOTE_CONTROL + +#include "soh/Network/Anchor/Anchor.h" +#include +#include +#include "soh/Enhancements/game-interactor/GameInteractor.h" + +extern "C" { +#include "macros.h" +#include "functions.h" +extern PlayState* gPlayState; +void func_80838280(Player* player); +} + +/** + * DAMAGE_PLAYER + */ + +void Anchor::SendPacket_DamagePlayer(u32 clientId, u8 damageEffect, u8 damage) { + if (!IsSaveLoaded()) { + return; + } + + nlohmann::json payload; + payload["type"] = DAMAGE_PLAYER; + payload["targetClientId"] = clientId; + payload["damageEffect"] = damageEffect; + payload["damage"] = damage; + + SendJsonToRemote(payload); +} + +void Anchor::HandlePacket_DamagePlayer(nlohmann::json payload) { + uint32_t clientId = payload["clientId"].get(); + if (!clients.contains(clientId) || clients[clientId].player == nullptr) { + return; + } + + AnchorClient& anchorClient = clients[clientId]; + Player* otherPlayer = anchorClient.player; + Player* self = GET_PLAYER(gPlayState); + + u8 damageEffect = payload["damageEffect"].get(); + u8 damage = payload["damage"].get(); + + self->actor.colChkInfo.damage = damage * 8; // Arbitrary number currently, need to fine tune + + if (damageEffect == DUMMY_PLAYER_HIT_RESPONSE_FIRE) { + for (int i = 0; i < ARRAY_COUNT(self->bodyFlameTimers); i++) { + self->bodyFlameTimers[i] = Rand_S16Offset(0, 200); + } + self->bodyIsBurning = true; + } else if (damageEffect == DUMMY_PLAYER_HIT_RESPONSE_STUN) { + self->actor.freezeTimer = 20; + Actor_SetColorFilter(&self->actor, 0, 0xFF, 0, 24); + return; + } + + func_80837C0C(gPlayState, self, damageEffect, 4.0f, 5.0f, Actor_WorldYawTowardActor(&otherPlayer->actor, &self->actor), 20); +} + +#endif // ENABLE_REMOTE_CONTROL diff --git a/soh/soh/Network/Anchor/Packets/DisableAnchor.cpp b/soh/soh/Network/Anchor/Packets/DisableAnchor.cpp new file mode 100644 index 000000000..6f01ddef6 --- /dev/null +++ b/soh/soh/Network/Anchor/Packets/DisableAnchor.cpp @@ -0,0 +1,18 @@ +#ifdef ENABLE_REMOTE_CONTROL + +#include "soh/Network/Anchor/Anchor.h" +#include +#include +#include "soh/Enhancements/game-interactor/GameInteractor.h" + +/** + * DISABLE_ANCHOR + * + * No current use, potentially will be used for a future feature. + */ + +void Anchor::HandlePacket_DisableAnchor(nlohmann::json payload) { + Disable(); +} + +#endif // ENABLE_REMOTE_CONTROL diff --git a/soh/soh/Network/Anchor/Packets/EntranceDiscovered.cpp b/soh/soh/Network/Anchor/Packets/EntranceDiscovered.cpp new file mode 100644 index 000000000..f5c27a82f --- /dev/null +++ b/soh/soh/Network/Anchor/Packets/EntranceDiscovered.cpp @@ -0,0 +1,37 @@ +#ifdef ENABLE_REMOTE_CONTROL + +#include "soh/Network/Anchor/Anchor.h" +#include +#include +#include "soh/Enhancements/game-interactor/GameInteractor.h" +#include "soh/Enhancements/randomizer/randomizer_entrance.h" +#include "soh/OTRGlobals.h" + +/** + * ENTRANCE_DISCOVERED + */ + +void Anchor::SendPacket_EntranceDiscovered(u16 entranceIndex) { + if (!IsSaveLoaded()) { + return; + } + + nlohmann::json payload; + payload["type"] = ENTRANCE_DISCOVERED; + payload["targetTeamId"] = CVarGetString(CVAR_REMOTE_ANCHOR("TeamId"), "default"); + payload["entranceIndex"] = entranceIndex; + payload["quiet"] = true; + + SendJsonToRemote(payload); +} + +void Anchor::HandlePacket_EntranceDiscovered(nlohmann::json payload) { + if (!IsSaveLoaded()) { + return; + } + + u16 entranceIndex = payload["entranceIndex"].get(); + Entrance_SetEntranceDiscovered(entranceIndex, 1); +} + +#endif // ENABLE_REMOTE_CONTROL diff --git a/soh/soh/Network/Anchor/Packets/GameComplete.cpp b/soh/soh/Network/Anchor/Packets/GameComplete.cpp new file mode 100644 index 000000000..cd7d72d5b --- /dev/null +++ b/soh/soh/Network/Anchor/Packets/GameComplete.cpp @@ -0,0 +1,48 @@ +#ifdef ENABLE_REMOTE_CONTROL + +#include "soh/Network/Anchor/Anchor.h" +#include +#include +#include "soh/Enhancements/game-interactor/GameInteractor.h" +#include "soh/Notification/Notification.h" +#include "soh/Enhancements/randomizer/3drando/random.hpp" + +const std::string gameCompleteMessages[] = { + "killed Ganon", + "saved Zelda", + "proved their Courage", + "collected the Triforce", + "is the Hero of Time", + "proved Mido wrong", +}; + +/** + * GAME_COMPLETE + */ + +void Anchor::SendPacket_GameComplete() { + if (!IsSaveLoaded()) { + return; + } + + nlohmann::json payload; + payload["type"] = GAME_COMPLETE; + + SendJsonToRemote(payload); +} + +void Anchor::HandlePacket_GameComplete(nlohmann::json payload) { + uint32_t clientId = payload["clientId"].get(); + if (!clients.contains(clientId)) { + return; + } + + AnchorClient& anchorClient = clients[clientId]; + anchorClient.isGameComplete = true; + Notification::Emit({ + .prefix = anchorClient.name, + .message = RandomElement(gameCompleteMessages), + }); +} + +#endif // ENABLE_REMOTE_CONTROL diff --git a/soh/soh/Network/Anchor/Packets/GiveItem.cpp b/soh/soh/Network/Anchor/Packets/GiveItem.cpp new file mode 100644 index 000000000..f6a6e05d2 --- /dev/null +++ b/soh/soh/Network/Anchor/Packets/GiveItem.cpp @@ -0,0 +1,104 @@ +#ifdef ENABLE_REMOTE_CONTROL + +#include "soh/Network/Anchor/Anchor.h" +#include +#include +#include "soh/Enhancements/game-interactor/GameInteractor.h" +#include "soh/Notification/Notification.h" +#include "soh/Enhancements/randomizer/randomizer.h" +#include "soh/ImGuiUtils.h" +#include "soh/Enhancements/item-tables/ItemTableManager.h" +#include "soh/OTRGlobals.h" + +extern "C" { +#include "functions.h" +extern PlayState* gPlayState; +} + +/** + * GIVE_ITEM + */ + +static bool gettingItem; +static uint8_t incomingIceTraps; + +void Anchor::SendPacket_GiveItem(u16 modId, s16 getItemId) { + if (!IsSaveLoaded() || gettingItem) { + return; + } + + if (modId == MOD_RANDOMIZER && getItemId == RG_ICE_TRAP && incomingIceTraps > 0) { + incomingIceTraps = MAX(incomingIceTraps - 1, 0); + return; + } + + nlohmann::json payload; + payload["type"] = GIVE_ITEM; + payload["targetTeamId"] = CVarGetString(CVAR_REMOTE_ANCHOR("TeamId"), "default"); + payload["addToQueue"] = true; + payload["modId"] = modId; + payload["getItemId"] = getItemId; + + SendJsonToRemote(payload); +} + +void Anchor::HandlePacket_GiveItem(nlohmann::json payload) { + if (!IsSaveLoaded()) { + return; + } + + uint32_t clientId = payload["clientId"].get(); + AnchorClient& client = clients[clientId]; + + GetItemEntry getItemEntry; + if (payload["modId"].get() == MOD_NONE) { + getItemEntry = ItemTableManager::Instance->RetrieveItemEntry(MOD_NONE, payload["getItemId"].get()); + } else { + getItemEntry = Rando::StaticData::RetrieveItem(payload["getItemId"].get()).GetGIEntry_Copy(); + } + + gettingItem = true; + if (getItemEntry.modIndex == MOD_NONE) { + if (getItemEntry.getItemId == GI_SWORD_BGS) { + gSaveContext.bgsFlag = true; + } + Item_Give(gPlayState, getItemEntry.itemId); + } else if (getItemEntry.modIndex == MOD_RANDOMIZER) { + if (getItemEntry.getItemId == RG_ICE_TRAP) { + gSaveContext.pendingIceTrapCount++; + incomingIceTraps++; + } else { + Randomizer_Item_Give(gPlayState, getItemEntry); + } + } + + // Handle if the player gets a 4th heart piece (usually handled in z_message) + s32 heartPieces = (s32)(gSaveContext.inventory.questItems & 0xF0000000) >> (QUEST_HEART_PIECE + 4); + if (heartPieces >= 4) { + gSaveContext.inventory.questItems &= ~0xF0000000; + gSaveContext.inventory.questItems += (heartPieces % 4) << (QUEST_HEART_PIECE + 4); + gSaveContext.healthCapacity += 0x10 * (heartPieces / 4); + gSaveContext.health += 0x10 * (heartPieces / 4); + gSaveContext.healthAccumulator = 0x140; + } + gettingItem = false; + + if (getItemEntry.getItemCategory != ITEM_CATEGORY_JUNK) { + if (getItemEntry.modIndex == MOD_NONE) { + Notification::Emit({ + .itemIcon = GetTextureForItemId(getItemEntry.itemId), + .prefix = client.name, + .message = "found", + .suffix = SohUtils::GetItemName(getItemEntry.itemId), + }); + } else if (getItemEntry.modIndex == MOD_RANDOMIZER) { + Notification::Emit({ + .prefix = client.name, + .message = "found", + .suffix = Rando::StaticData::RetrieveItem((RandomizerGet)getItemEntry.getItemId).GetName().english, + }); + } + } +} + +#endif // ENABLE_REMOTE_CONTROL diff --git a/soh/soh/Network/Anchor/Packets/Handshake.cpp b/soh/soh/Network/Anchor/Packets/Handshake.cpp new file mode 100644 index 000000000..592da4932 --- /dev/null +++ b/soh/soh/Network/Anchor/Packets/Handshake.cpp @@ -0,0 +1,26 @@ +#ifdef ENABLE_REMOTE_CONTROL + +#include "soh/Network/Anchor/Anchor.h" +#include +#include +#include "soh/Enhancements/game-interactor/GameInteractor.h" +#include "soh/OTRGlobals.h" + +/** + * HANDSHAKE + * + * Sent by the client to the server when it first connects to the server, sends over both the local room settings + * in case the room needs to be created, along with the current client state + */ + +void Anchor::SendPacket_Handshake() { + nlohmann::json payload; + payload["type"] = HANDSHAKE; + payload["roomId"] = CVarGetString(CVAR_REMOTE_ANCHOR("RoomId"), ""); + payload["roomState"] = PrepRoomState(); + payload["clientState"] = PrepClientState(); + + SendJsonToRemote(payload); +} + +#endif // ENABLE_REMOTE_CONTROL diff --git a/soh/soh/Network/Anchor/Packets/PlayerSfx.cpp b/soh/soh/Network/Anchor/Packets/PlayerSfx.cpp new file mode 100644 index 000000000..dc2741d9a --- /dev/null +++ b/soh/soh/Network/Anchor/Packets/PlayerSfx.cpp @@ -0,0 +1,51 @@ +#ifdef ENABLE_REMOTE_CONTROL + +#include "soh/Network/Anchor/Anchor.h" +#include "soh/Network/Anchor/JsonConversions.hpp" +#include +#include + +extern "C" { +#include "macros.h" +#include "functions.h" +#include "variables.h" +extern PlayState* gPlayState; +} + +/** + * PLAYER_SFX + * + * Sound effects, only sent to other clients in the same scene as the player + */ + +void Anchor::SendPacket_PlayerSfx(u16 sfxId) { + if (!IsSaveLoaded()) { + return; + } + + nlohmann::json payload; + + payload["type"] = PLAYER_SFX; + payload["sfxId"] = sfxId; + payload["quiet"] = true; + + for (auto& [clientId, client] : clients) { + if (client.sceneNum == gPlayState->sceneNum && client.online && client.isSaveLoaded) { + payload["targetClientId"] = clientId; + SendJsonToRemote(payload); + } + } +} + +void Anchor::HandlePacket_PlayerSfx(nlohmann::json payload) { + uint32_t clientId = payload["clientId"].get(); + u16 sfxId = payload["sfxId"].get(); + + if (!clients.contains(clientId) || !clients[clientId].player) { + return; + } + + Player_PlaySfx((Actor*)clients[clientId].player, sfxId); +} + +#endif // ENABLE_REMOTE_CONTROL diff --git a/soh/soh/Network/Anchor/Packets/PlayerUpdate.cpp b/soh/soh/Network/Anchor/Packets/PlayerUpdate.cpp new file mode 100644 index 000000000..7a604d802 --- /dev/null +++ b/soh/soh/Network/Anchor/Packets/PlayerUpdate.cpp @@ -0,0 +1,120 @@ +#ifdef ENABLE_REMOTE_CONTROL + +#include "soh/Network/Anchor/Anchor.h" +#include "soh/Network/Anchor/JsonConversions.hpp" +#include +#include + +extern "C" { +#include "macros.h" +#include "variables.h" +extern PlayState* gPlayState; +} + +/** + * PLAYER_UPDATE + * + * Contains real-time data necessary to update other clients in the same scene as the player + * + * Sent every frame to other clients within the same scene + * + * Note: This packet is sent _a lot_, so please do not include any unnecessary data in it + */ + +void Anchor::SendPacket_PlayerUpdate() { + if (!IsSaveLoaded()) { + return; + } + + uint32_t currentPlayerCount = 0; + for (auto& [clientId, client] : clients) { + if (client.sceneNum == gPlayState->sceneNum && client.online && client.isSaveLoaded) { + currentPlayerCount++; + } + } + if (currentPlayerCount == 0) { + return; + } + + Player* player = GET_PLAYER(gPlayState); + nlohmann::json payload; + + payload["type"] = PLAYER_UPDATE; + payload["sceneNum"] = gPlayState->sceneNum; + payload["entranceIndex"] = gSaveContext.entranceIndex; + payload["linkAge"] = gSaveContext.linkAge; + payload["posRot"]["pos"] = player->actor.world.pos; + payload["posRot"]["rot"] = player->actor.shape.rot; + std::vector jointArray; + for (const auto& joint : player->jointTable) { + jointArray.push_back(joint.x); + jointArray.push_back(joint.y); + jointArray.push_back(joint.z); + } + payload["jointTable"] = jointArray; + payload["upperLimbRot"] = player->upperLimbRot; + payload["currentBoots"] = player->currentBoots; + payload["currentShield"] = player->currentShield; + payload["currentTunic"] = player->currentTunic; + payload["stateFlags1"] = player->stateFlags1; + payload["stateFlags2"] = player->stateFlags2; + payload["buttonItem0"] = gSaveContext.equips.buttonItems[0]; + payload["itemAction"] = player->itemAction; + payload["heldItemAction"] = player->heldItemAction; + payload["modelGroup"] = player->modelGroup; + payload["invincibilityTimer"] = player->invincibilityTimer; + payload["unk_862"] = player->unk_862; + payload["actionVar1"] = player->av1.actionVar1; + payload["quiet"] = true; + + for (auto& [clientId, client] : clients) { + if (client.sceneNum == gPlayState->sceneNum && client.online && client.isSaveLoaded) { + payload["targetClientId"] = clientId; + SendJsonToRemote(payload); + } + } +} + +void Anchor::HandlePacket_PlayerUpdate(nlohmann::json payload) { + uint32_t clientId = payload["clientId"].get(); + + bool shouldRefreshActors = false; + + if (clients.contains(clientId)) { + auto& client = clients[clientId]; + + if (client.linkAge != payload["linkAge"].get()) { + shouldRefreshActors = true; + } + + client.sceneNum = payload["sceneNum"].get(); + client.entranceIndex = payload["entranceIndex"].get(); + client.linkAge = payload["linkAge"].get(); + client.posRot = payload["posRot"].get(); + std::vector jointArray = payload["jointTable"]; + for (int i = 0; i < 24; i++) { + client.jointTable[i].x = jointArray[i * 3]; + client.jointTable[i].y = jointArray[i * 3 + 1]; + client.jointTable[i].z = jointArray[i * 3 + 2]; + } + client.upperLimbRot = payload["upperLimbRot"].get(); + client.currentBoots = payload["currentBoots"].get(); + client.currentShield = payload["currentShield"].get(); + client.currentTunic = payload["currentTunic"].get(); + client.stateFlags1 = payload["stateFlags1"].get(); + client.stateFlags2 = payload["stateFlags2"].get(); + client.buttonItem0 = payload["buttonItem0"].get(); + client.itemAction = payload["itemAction"].get(); + client.heldItemAction = payload["heldItemAction"].get(); + client.modelGroup = payload["modelGroup"].get(); + client.invincibilityTimer = payload["invincibilityTimer"].get(); + client.unk_862 = payload["unk_862"].get(); + client.actionVar1 = payload["actionVar1"].get(); + } + + if (shouldRefreshActors) { + RefreshClientActors(); + } +} + +#endif // ENABLE_REMOTE_CONTROL diff --git a/soh/soh/Network/Anchor/Packets/RequestTeamState.cpp b/soh/soh/Network/Anchor/Packets/RequestTeamState.cpp new file mode 100644 index 000000000..f2a556dd1 --- /dev/null +++ b/soh/soh/Network/Anchor/Packets/RequestTeamState.cpp @@ -0,0 +1,37 @@ +#ifdef ENABLE_REMOTE_CONTROL + +#include "soh/Network/Anchor/Anchor.h" +#include +#include +#include "soh/OTRGlobals.h" + +/** + * REQUEST_TEAM_STATE + * + * Requests team state from the server, which will pass on the request to any connected teammates, or send the last known + * state if no teammates are connected. + * + * This fires when loading into a file while Anchor is connected, or when Anchor is connected while a file is already + * loaded + * + * Note: This can additionally be fired with a button in the menus to fix any desyncs that may have occurred in the save + * state + */ + +void Anchor::SendPacket_RequestTeamState() { + nlohmann::json payload; + payload["type"] = REQUEST_TEAM_STATE; + payload["targetTeamId"] = CVarGetString(CVAR_REMOTE_ANCHOR("TeamId"), "default"); + + SendJsonToRemote(payload); +} + +void Anchor::HandlePacket_RequestTeamState(nlohmann::json payload) { + if (!IsSaveLoaded()) { + return; + } + + SendPacket_UpdateTeamState(); +} + +#endif // ENABLE_REMOTE_CONTROL diff --git a/soh/soh/Network/Anchor/Packets/RequestTeleport.cpp b/soh/soh/Network/Anchor/Packets/RequestTeleport.cpp new file mode 100644 index 000000000..fdd79e536 --- /dev/null +++ b/soh/soh/Network/Anchor/Packets/RequestTeleport.cpp @@ -0,0 +1,36 @@ +#ifdef ENABLE_REMOTE_CONTROL + +#include "soh/Network/Anchor/Anchor.h" +#include +#include +#include "soh/Enhancements/game-interactor/GameInteractor.h" + +/** + * REQUEST_TELEPORT + * + * Because we don't have all the necessary information to directly teleport to a player, we emit a request, + * in which they will respond with a TELEPORT_TO packet, with the necessary information. + */ + +void Anchor::SendPacket_RequestTeleport(uint32_t clientId) { + if (!IsSaveLoaded()) { + return; + } + + nlohmann::json payload; + payload["type"] = REQUEST_TELEPORT; + payload["targetClientId"] = clientId; + + SendJsonToRemote(payload); +} + +void Anchor::HandlePacket_RequestTeleport(nlohmann::json payload) { + if (!IsSaveLoaded()) { + return; + } + + uint32_t clientId = payload["clientId"].get(); + SendPacket_TeleportTo(clientId); +} + +#endif // ENABLE_REMOTE_CONTROL diff --git a/soh/soh/Network/Anchor/Packets/ServerMessage.cpp b/soh/soh/Network/Anchor/Packets/ServerMessage.cpp new file mode 100644 index 000000000..3af07c8b8 --- /dev/null +++ b/soh/soh/Network/Anchor/Packets/ServerMessage.cpp @@ -0,0 +1,21 @@ +#ifdef ENABLE_REMOTE_CONTROL + +#include "soh/Network/Anchor/Anchor.h" +#include +#include +#include "soh/Enhancements/game-interactor/GameInteractor.h" +#include "soh/Notification/Notification.h" + +/** + * SERVER_MESSAGE + */ + +void Anchor::HandlePacket_ServerMessage(nlohmann::json payload) { + Notification::Emit({ + .prefix = "Server:", + .prefixColor = ImVec4(1.0f, 0.5f, 0.5f, 1.0f), + .message = payload["message"].get(), + }); +} + +#endif // ENABLE_REMOTE_CONTROL diff --git a/soh/soh/Network/Anchor/Packets/SetCheckStatus.cpp b/soh/soh/Network/Anchor/Packets/SetCheckStatus.cpp new file mode 100644 index 000000000..276e52586 --- /dev/null +++ b/soh/soh/Network/Anchor/Packets/SetCheckStatus.cpp @@ -0,0 +1,53 @@ +#ifdef ENABLE_REMOTE_CONTROL + +#include "soh/Network/Anchor/Anchor.h" +#include +#include +#include "soh/Enhancements/game-interactor/GameInteractor.h" +#include "soh/OTRGlobals.h" + +/** + * SET_CHECK_STATUS + * + * Fired when a check status is updated or skipped + */ + +void Anchor::SendPacket_SetCheckStatus(RandomizerCheck rc) { + if (!IsSaveLoaded()) { + return; + } + + auto randoContext = Rando::Context::GetInstance(); + + nlohmann::json payload; + payload["type"] = SET_CHECK_STATUS; + payload["targetTeamId"] = CVarGetString(CVAR_REMOTE_ANCHOR("TeamId"), "default"); + payload["addToQueue"] = true; + payload["rc"] = rc; + payload["status"] = randoContext->GetItemLocation(rc)->GetCheckStatus(); + payload["skipped"] = randoContext->GetItemLocation(rc)->GetIsSkipped(); + payload["quiet"] = true; + + SendJsonToRemote(payload); +} + +void Anchor::HandlePacket_SetCheckStatus(nlohmann::json payload) { + if (!IsSaveLoaded()) { + return; + } + + auto randoContext = Rando::Context::GetInstance(); + + RandomizerCheck rc = payload["rc"].get(); + RandomizerCheckStatus status = payload["status"].get(); + bool skipped = payload["skipped"].get(); + + if (randoContext->GetItemLocation(rc)->GetCheckStatus() != status) { + randoContext->GetItemLocation(rc)->SetCheckStatus(status); + } + if (randoContext->GetItemLocation(rc)->GetIsSkipped() != skipped) { + randoContext->GetItemLocation(rc)->SetIsSkipped(skipped); + } +} + +#endif // ENABLE_REMOTE_CONTROL diff --git a/soh/soh/Network/Anchor/Packets/SetFlag.cpp b/soh/soh/Network/Anchor/Packets/SetFlag.cpp new file mode 100644 index 000000000..b7438ab95 --- /dev/null +++ b/soh/soh/Network/Anchor/Packets/SetFlag.cpp @@ -0,0 +1,50 @@ +#ifdef ENABLE_REMOTE_CONTROL + +#include "soh/Network/Anchor/Anchor.h" +#include +#include +#include "soh/Enhancements/game-interactor/GameInteractor.h" +#include "soh/OTRGlobals.h" + +/** + * SET_FLAG + * + * Fired when a flag is set in the save context + */ + +void Anchor::SendPacket_SetFlag(s16 sceneNum, s16 flagType, s16 flag) { + nlohmann::json payload; + payload["type"] = SET_FLAG; + payload["targetTeamId"] = CVarGetString(CVAR_REMOTE_ANCHOR("TeamId"), "default"); + payload["addToQueue"] = true; + payload["sceneNum"] = sceneNum; + payload["flagType"] = flagType; + payload["flag"] = flag; + + SendJsonToRemote(payload); +} + +void Anchor::HandlePacket_SetFlag(nlohmann::json payload) { + if (!IsSaveLoaded()) { + return; + } + + s16 sceneNum = payload["sceneNum"].get(); + s16 flagType = payload["flagType"].get(); + s16 flag = payload["flag"].get(); + + if (sceneNum == SCENE_ID_MAX) { + auto effect = new GameInteractionEffect::SetFlag(); + effect->parameters[0] = payload["flagType"].get(); + effect->parameters[1] = payload["flag"].get(); + effect->Apply(); + } else { + auto effect = new GameInteractionEffect::SetSceneFlag(); + effect->parameters[0] = payload["sceneNum"].get(); + effect->parameters[1] = payload["flagType"].get(); + effect->parameters[2] = payload["flag"].get(); + effect->Apply(); + } +} + +#endif // ENABLE_REMOTE_CONTROL diff --git a/soh/soh/Network/Anchor/Packets/TeleportTo.cpp b/soh/soh/Network/Anchor/Packets/TeleportTo.cpp new file mode 100644 index 000000000..05e3cbb83 --- /dev/null +++ b/soh/soh/Network/Anchor/Packets/TeleportTo.cpp @@ -0,0 +1,63 @@ +#ifdef ENABLE_REMOTE_CONTROL + +#include "soh/Network/Anchor/Anchor.h" +#include +#include +#include "soh/Enhancements/game-interactor/GameInteractor.h" +#include "soh/Network/Anchor/JsonConversions.hpp" + +extern "C" { +#include "macros.h" +extern PlayState* gPlayState; +} + +/** + * TELEPORT_TO + * + * See REQUEST_TELEPORT for more information, this is the second part of the process. + */ + +void Anchor::SendPacket_TeleportTo(uint32_t clientId) { + if (!IsSaveLoaded()) { + return; + } + + Player* player = GET_PLAYER(gPlayState); + + nlohmann::json payload; + payload["type"] = TELEPORT_TO; + payload["targetClientId"] = clientId; + payload["entranceIndex"] = gSaveContext.entranceIndex; + payload["roomIndex"] = gPlayState->roomCtx.curRoom.num; + payload["posRot"] = player->actor.world; + + SendJsonToRemote(payload); +} + +void Anchor::HandlePacket_TeleportTo(nlohmann::json payload) { + if (!IsSaveLoaded()) { + return; + } + + s32 entranceIndex = payload["entranceIndex"].get(); + s8 roomIndex = payload["roomIndex"].get(); + PosRot posRot = payload["posRot"].get(); + + gPlayState->nextEntranceIndex = entranceIndex; + gPlayState->transitionTrigger = TRANS_TRIGGER_START; + gPlayState->transitionType = TRANS_TYPE_INSTANT; + gSaveContext.respawn[RESPAWN_MODE_DOWN].entranceIndex = entranceIndex; + gSaveContext.respawn[RESPAWN_MODE_DOWN].roomIndex = roomIndex; + gSaveContext.respawn[RESPAWN_MODE_DOWN].pos = posRot.pos; + gSaveContext.respawn[RESPAWN_MODE_DOWN].yaw = posRot.rot.y; + gSaveContext.respawn[RESPAWN_MODE_DOWN].playerParams = 0xDFF; + gSaveContext.nextTransitionType = TRANS_TYPE_FADE_BLACK_FAST; + gSaveContext.respawnFlag = 1; + static HOOK_ID hookId = 0; + hookId = REGISTER_VB_SHOULD(VB_INFLICT_VOID_DAMAGE, { + *should = false; + GameInteractor::Instance->UnregisterGameHookForID(hookId); + }); +} + +#endif // ENABLE_REMOTE_CONTROL diff --git a/soh/soh/Network/Anchor/Packets/UnsetFlag.cpp b/soh/soh/Network/Anchor/Packets/UnsetFlag.cpp new file mode 100644 index 000000000..91da3f9b1 --- /dev/null +++ b/soh/soh/Network/Anchor/Packets/UnsetFlag.cpp @@ -0,0 +1,51 @@ +#ifdef ENABLE_REMOTE_CONTROL + +#include "soh/Network/Anchor/Anchor.h" +#include +#include +#include "soh/Enhancements/game-interactor/GameInteractor.h" +#include "soh/OTRGlobals.h" + +/** + * UNSET_FLAG + * + * Fired when a flag is unset in the save context + */ + +void Anchor::SendPacket_UnsetFlag(s16 sceneNum, s16 flagType, s16 flag) { + nlohmann::json payload; + payload["type"] = UNSET_FLAG; + payload["targetTeamId"] = CVarGetString(CVAR_REMOTE_ANCHOR("TeamId"), "default"); + payload["addToQueue"] = true; + payload["sceneNum"] = sceneNum; + payload["flagType"] = flagType; + payload["flag"] = flag; + + SendJsonToRemote(payload); +} + +void Anchor::HandlePacket_UnsetFlag(nlohmann::json payload) { + if (!IsSaveLoaded()) { + return; + } + + s16 sceneNum = payload["sceneNum"].get(); + s16 flagType = payload["flagType"].get(); + s16 flag = payload["flag"].get(); + + if (sceneNum == SCENE_ID_MAX) { + auto effect = new GameInteractionEffect::UnsetFlag(); + effect->parameters[0] = payload["flagType"].get(); + effect->parameters[1] = payload["flag"].get(); + effect->Apply(); + } else { + auto effect = new GameInteractionEffect::UnsetSceneFlag(); + effect->parameters[0] = payload["sceneNum"].get(); + effect->parameters[1] = payload["flagType"].get(); + effect->parameters[2] = payload["flag"].get(); + effect->Apply(); + } + +} + +#endif // ENABLE_REMOTE_CONTROL diff --git a/soh/soh/Network/Anchor/Packets/UpdateBeansCount.cpp b/soh/soh/Network/Anchor/Packets/UpdateBeansCount.cpp new file mode 100644 index 000000000..89e1d6443 --- /dev/null +++ b/soh/soh/Network/Anchor/Packets/UpdateBeansCount.cpp @@ -0,0 +1,43 @@ +#ifdef ENABLE_REMOTE_CONTROL + +#include "soh/Network/Anchor/Anchor.h" +#include +#include +#include "soh/Enhancements/game-interactor/GameInteractor.h" +#include "soh/OTRGlobals.h" + +extern "C" { +#include "macros.h" +} + +/** + * UPDATE_BEANS_COUNT + * + * Keeps the client's bean count in sync as they buy/use them + */ + +void Anchor::SendPacket_UpdateBeansCount() { + if (!IsSaveLoaded()) { + return; + } + + nlohmann::json payload; + payload["type"] = UPDATE_BEANS_COUNT; + payload["targetTeamId"] = CVarGetString(CVAR_REMOTE_ANCHOR("TeamId"), "default"); + payload["addToQueue"] = true; + payload["amount"] = AMMO(ITEM_BEAN); + payload["amountBought"] = BEANS_BOUGHT; + + SendJsonToRemote(payload); +} + +void Anchor::HandlePacket_UpdateBeansCount(nlohmann::json payload) { + if (!IsSaveLoaded()) { + return; + } + + AMMO(ITEM_BEAN) = payload["amount"].get(); + BEANS_BOUGHT = payload["amountBought"].get(); +} + +#endif // ENABLE_REMOTE_CONTROL diff --git a/soh/soh/Network/Anchor/Packets/UpdateClientState.cpp b/soh/soh/Network/Anchor/Packets/UpdateClientState.cpp new file mode 100644 index 000000000..237f1baa0 --- /dev/null +++ b/soh/soh/Network/Anchor/Packets/UpdateClientState.cpp @@ -0,0 +1,77 @@ +#ifdef ENABLE_REMOTE_CONTROL + +#include "soh/Network/Anchor/Anchor.h" +#include "soh/Network/Anchor/JsonConversions.hpp" +#include +#include +#include "soh/OTRGlobals.h" + +extern "C" { +#include "variables.h" +extern PlayState* gPlayState; +} + +/** + * UPDATE_CLIENT_STATE + * + * Contains a small subset of data that is cached on the server and important for the client to know for various reasons + * + * Sent on various events, such as changing scenes, soft resetting, finishing the game, opening file select, etc. + * + * Note: This packet should be cross version compatible, so if you add anything here don't assume all clients will be + * providing it, consider doing a `contains` check before accessing any version specific data + */ + +nlohmann::json Anchor::PrepClientState() { + nlohmann::json payload; + payload["name"] = CVarGetString(CVAR_REMOTE_ANCHOR("Name"), ""); + payload["color"] = CVarGetColor24(CVAR_REMOTE_ANCHOR("Color"), { 100, 255, 100 }); + payload["clientVersion"] = clientVersion; + payload["teamId"] = CVarGetString(CVAR_REMOTE_ANCHOR("TeamId"), "default"); + payload["online"] = true; + + if (IsSaveLoaded()) { + payload["seed"] = IS_RANDO ? Rando::Context::GetInstance()->GetSettings()->GetSeed() : 0; + payload["isSaveLoaded"] = true; + payload["isGameComplete"] = gSaveContext.sohStats.gameComplete; + payload["sceneNum"] = gPlayState->sceneNum; + payload["entranceIndex"] = gSaveContext.entranceIndex; + } else { + payload["seed"] = 0; + payload["isSaveLoaded"] = false; + payload["isGameComplete"] = false; + payload["sceneNum"] = SCENE_ID_MAX; + payload["entranceIndex"] = 0x00; + } + + return payload; +} + +void Anchor::SendPacket_UpdateClientState() { + nlohmann::json payload; + payload["type"] = UPDATE_CLIENT_STATE; + payload["state"] = PrepClientState(); + + SendJsonToRemote(payload); +} + +void Anchor::HandlePacket_UpdateClientState(nlohmann::json payload) { + uint32_t clientId = payload["clientId"].get(); + + if (clients.contains(clientId)) { + AnchorClient client = payload["state"].get(); + clients[clientId].clientId = clientId; + clients[clientId].name = client.name; + clients[clientId].color = client.color; + clients[clientId].clientVersion = client.clientVersion; + clients[clientId].teamId = client.teamId; + clients[clientId].online = client.online; + clients[clientId].seed = client.seed; + clients[clientId].isSaveLoaded = client.isSaveLoaded; + clients[clientId].isGameComplete = client.isGameComplete; + clients[clientId].sceneNum = client.sceneNum; + clients[clientId].entranceIndex = client.entranceIndex; + } +} + +#endif // ENABLE_REMOTE_CONTROL diff --git a/soh/soh/Network/Anchor/Packets/UpdateDungeonItems.cpp b/soh/soh/Network/Anchor/Packets/UpdateDungeonItems.cpp new file mode 100644 index 000000000..c7beaa6b8 --- /dev/null +++ b/soh/soh/Network/Anchor/Packets/UpdateDungeonItems.cpp @@ -0,0 +1,42 @@ +#ifdef ENABLE_REMOTE_CONTROL + +#include "soh/Network/Anchor/Anchor.h" +#include +#include +#include "soh/Enhancements/game-interactor/GameInteractor.h" +#include "soh/OTRGlobals.h" + +/** + * UPDATE_DUNGEON_ITEMS + * + * This is for 2 things, first is updating the dungeon items in vanilla saves, and second is + * for ensuring the amount of keys used is synced as players are using them. + */ + +void Anchor::SendPacket_UpdateDungeonItems() { + if (!IsSaveLoaded()) { + return; + } + + nlohmann::json payload; + payload["type"] = UPDATE_DUNGEON_ITEMS; + payload["targetTeamId"] = CVarGetString(CVAR_REMOTE_ANCHOR("TeamId"), "default"); + payload["addToQueue"] = true; + payload["mapIndex"] = gSaveContext.mapIndex; + payload["dungeonItems"] = gSaveContext.inventory.dungeonItems[gSaveContext.mapIndex]; + payload["dungeonKeys"] = gSaveContext.inventory.dungeonKeys[gSaveContext.mapIndex]; + + SendJsonToRemote(payload); +} + +void Anchor::HandlePacket_UpdateDungeonItems(nlohmann::json payload) { + if (!IsSaveLoaded()) { + return; + } + + u16 mapIndex = payload["mapIndex"].get(); + gSaveContext.inventory.dungeonItems[mapIndex] = payload["dungeonItems"].get(); + gSaveContext.inventory.dungeonKeys[mapIndex] = payload["dungeonKeys"].get(); +} + +#endif // ENABLE_REMOTE_CONTROL diff --git a/soh/soh/Network/Anchor/Packets/UpdateRoomState.cpp b/soh/soh/Network/Anchor/Packets/UpdateRoomState.cpp new file mode 100644 index 000000000..ce08f3640 --- /dev/null +++ b/soh/soh/Network/Anchor/Packets/UpdateRoomState.cpp @@ -0,0 +1,47 @@ +#ifdef ENABLE_REMOTE_CONTROL + +#include "soh/Network/Anchor/Anchor.h" +#include "soh/Network/Anchor/JsonConversions.hpp" +#include +#include +#include "soh/OTRGlobals.h" + +extern "C" { +#include "variables.h" +extern PlayState* gPlayState; +} + +/** + * UPDATE_ROOM_STATE + */ + +nlohmann::json Anchor::PrepRoomState() { + nlohmann::json payload; + payload["ownerClientId"] = ownClientId; + payload["pvpMode"] = CVarGetInteger(CVAR_REMOTE_ANCHOR("RoomSettings.PvpMode"), 1); + payload["showLocationsMode"] = CVarGetInteger(CVAR_REMOTE_ANCHOR("RoomSettings.ShowLocationsMode"), 1); + payload["teleportMode"] = CVarGetInteger(CVAR_REMOTE_ANCHOR("RoomSettings.TeleportMode"), 1); + + return payload; +} + +void Anchor::SendPacket_UpdateRoomState() { + nlohmann::json payload; + payload["type"] = UPDATE_ROOM_STATE; + payload["state"] = PrepRoomState(); + + Network::SendJsonToRemote(payload); +} + +void Anchor::HandlePacket_UpdateRoomState(nlohmann::json payload) { + if (!payload.contains("state")) { + return; + } + + roomState.ownerClientId = payload["state"]["ownerClientId"].get(); + roomState.pvpMode = payload["state"]["pvpMode"].get(); + roomState.showLocationsMode = payload["state"]["showLocationsMode"].get(); + roomState.teleportMode = payload["state"]["teleportMode"].get(); +} + +#endif // ENABLE_REMOTE_CONTROL diff --git a/soh/soh/Network/Anchor/Packets/UpdateTeamState.cpp b/soh/soh/Network/Anchor/Packets/UpdateTeamState.cpp new file mode 100644 index 000000000..cbc9088eb --- /dev/null +++ b/soh/soh/Network/Anchor/Packets/UpdateTeamState.cpp @@ -0,0 +1,259 @@ +#ifdef ENABLE_REMOTE_CONTROL + +#include "soh/Network/Anchor/Anchor.h" +#include "soh/Network/Anchor/JsonConversions.hpp" +#include +#include +#include "soh/Enhancements/randomizer/entrance.h" +#include "soh/Enhancements/randomizer/dungeon.h" +#include "soh/OTRGlobals.h" +#include "soh/Notification/Notification.h" + +extern "C" { +#include "variables.h" +extern PlayState* gPlayState; +} + +/** + * UPDATE_TEAM_STATE + * + * Pushes the current save state to the server for other teammates to use. + * + * Fires when the server passes on a REQUEST_TEAM_STATE packet, or when this client saves the game + * + * When sending this packet we will assume that the team queue has been emptied for this client, so the queue + * stored in the server will be cleared. + * + * When receiving this packet, if there is items in the team queue, we will play them back in order. + */ + +void Anchor::SendPacket_UpdateTeamState() { + if (!IsSaveLoaded()) { + return; + } + + json payload; + payload["type"] = UPDATE_TEAM_STATE; + payload["targetTeamId"] = CVarGetString(CVAR_REMOTE_ANCHOR("TeamId"), "default"); + + // Assume the team queue has been emptied, so clear it + payload["queue"] = json::array(); + + payload["state"] = gSaveContext; + // manually update current scene flags + payload["state"]["sceneFlags"][gPlayState->sceneNum * 4] = gPlayState->actorCtx.flags.chest; + payload["state"]["sceneFlags"][gPlayState->sceneNum * 4 + 1] = gPlayState->actorCtx.flags.swch; + payload["state"]["sceneFlags"][gPlayState->sceneNum * 4 + 2] = gPlayState->actorCtx.flags.clear; + payload["state"]["sceneFlags"][gPlayState->sceneNum * 4 + 3] = gPlayState->actorCtx.flags.collect; + + // The commented out code below is an attempt at sending the entire randomizer seed over, in hopes that a player doesn't have to generate the seed themselves + // Currently it doesn't work :) + if (IS_RANDO) { + auto randoContext = Rando::Context::GetInstance(); + + payload["state"]["rando"] = json::object(); + payload["state"]["rando"]["itemLocations"] = json::array(); + for (int i = 0; i < RC_MAX; i++) { + payload["state"]["rando"]["itemLocations"][i] = json::array(); + // payload["state"]["rando"]["itemLocations"][i]["rgID"] = randoContext->GetItemLocation(i)->GetPlacedRandomizerGet(); + payload["state"]["rando"]["itemLocations"][i][0] = randoContext->GetItemLocation(i)->GetCheckStatus(); + payload["state"]["rando"]["itemLocations"][i][1] = (u8)randoContext->GetItemLocation(i)->GetIsSkipped(); + + // if (randoContext->GetItemLocation(i)->GetPlacedRandomizerGet() == RG_ICE_TRAP) { + // payload["state"]["rando"]["itemLocations"][i]["fakeRgID"] = randoContext->GetItemOverride(i).LooksLike(); + // payload["state"]["rando"]["itemLocations"][i]["trickName"] = json::object(); + // payload["state"]["rando"]["itemLocations"][i]["trickName"]["english"] = randoContext->GetItemOverride(i).GetTrickName().GetEnglish(); + // payload["state"]["rando"]["itemLocations"][i]["trickName"]["french"] = randoContext->GetItemOverride(i).GetTrickName().GetFrench(); + // } + // if (randoContext->GetItemLocation(i)->HasCustomPrice()) { + // payload["state"]["rando"]["itemLocations"][i]["price"] = randoContext->GetItemLocation(i)->GetPrice(); + // } + } + + // auto entranceCtx = randoContext->GetEntranceShuffler(); + // for (int i = 0; i < ENTRANCE_OVERRIDES_MAX_COUNT; i++) { + // payload["state"]["rando"]["entrances"][i] = json::object(); + // payload["state"]["rando"]["entrances"][i]["type"] = entranceCtx->entranceOverrides[i].type; + // payload["state"]["rando"]["entrances"][i]["index"] = entranceCtx->entranceOverrides[i].index; + // payload["state"]["rando"]["entrances"][i]["destination"] = entranceCtx->entranceOverrides[i].destination; + // payload["state"]["rando"]["entrances"][i]["override"] = entranceCtx->entranceOverrides[i].override; + // payload["state"]["rando"]["entrances"][i]["overrideDestination"] = entranceCtx->entranceOverrides[i].overrideDestination; + // } + + // payload["state"]["rando"]["seed"] = json::array(); + // for (int i = 0; i < randoContext->hashIconIndexes.size(); i++) { + // payload["state"]["rando"]["seed"][i] = randoContext->hashIconIndexes[i]; + // } + // payload["state"]["rando"]["inputSeed"] = randoContext->GetSettings()->GetSeedString(); + // payload["state"]["rando"]["finalSeed"] = randoContext->GetSettings()->GetSeed(); + + // payload["state"]["rando"]["randoSettings"] = json::array(); + // for (int i = 0; i < RSK_MAX; i++) { + // payload["state"]["rando"]["randoSettings"][i] = randoContext->GetOption((RandomizerSettingKey(i))).GetSelectedOptionIndex(); + // } + + // payload["state"]["rando"]["masterQuestDungeonCount"] = randoContext->GetDungeons()->CountMQ(); + // payload["state"]["rando"]["masterQuestDungeons"] = json::array(); + // for (int i = 0; i < randoContext->GetDungeons()->GetDungeonListSize(); i++) { + // payload["state"]["rando"]["masterQuestDungeons"][i] = randoContext->GetDungeon(i)->IsMQ(); + // } + // for (int i = 0; i < randoContext->GetTrials()->GetTrialListSize(); i++) { + // payload["state"]["rando"]["requiredTrials"][i] = randoContext->GetTrial(i)->IsRequired(); + // } + } + + SendJsonToRemote(payload); +} + +void Anchor::HandlePacket_UpdateTeamState(nlohmann::json payload) { + isHandlingUpdateTeamState = true; + // This can happen in between file select and the game starting, so we cant use this check, but we need to ensure we + // be careful to wrap PlayState usage in this check + // if (!IsSaveLoaded()) { + // return; + // } + + if (payload.contains("state")) { + SaveContext loadedData = payload["state"].get(); + + gSaveContext.questId = loadedData.questId; + gSaveContext.healthCapacity = loadedData.healthCapacity; + gSaveContext.magicLevel = loadedData.magicLevel; + gSaveContext.magicCapacity = gSaveContext.magic = loadedData.magicCapacity; + gSaveContext.isMagicAcquired = loadedData.isMagicAcquired; + gSaveContext.isDoubleMagicAcquired = loadedData.isDoubleMagicAcquired; + gSaveContext.isDoubleDefenseAcquired = loadedData.isDoubleDefenseAcquired; + gSaveContext.bgsFlag = loadedData.bgsFlag; + gSaveContext.swordHealth = loadedData.swordHealth; + gSaveContext.adultTradeItems = loadedData.adultTradeItems; + gSaveContext.triforcePiecesCollected = loadedData.triforcePiecesCollected; + + for (int i = 0; i < 124; i++) { + gSaveContext.sceneFlags[i] = loadedData.sceneFlags[i]; + if (IsSaveLoaded() && gPlayState->sceneNum == i) { + gPlayState->actorCtx.flags.chest = loadedData.sceneFlags[i].chest; + gPlayState->actorCtx.flags.swch = loadedData.sceneFlags[i].swch; + gPlayState->actorCtx.flags.clear = loadedData.sceneFlags[i].clear; + gPlayState->actorCtx.flags.collect = loadedData.sceneFlags[i].collect; + } + } + + for (int i = 0; i < 14; i++) { + gSaveContext.eventChkInf[i] = loadedData.eventChkInf[i]; + } + + for (int i = 0; i < 4; i++) { + gSaveContext.itemGetInf[i] = loadedData.itemGetInf[i]; + } + + // Skip last row of infTable, don't want to sync swordless flag + for (int i = 0; i < 29; i++) { + gSaveContext.infTable[i] = loadedData.infTable[i]; + } + + for (int i = 0; i < 17; i++) { + gSaveContext.randomizerInf[i] = loadedData.randomizerInf[i]; + } + + for (int i = 0; i < 6; i++) { + gSaveContext.gsFlags[i] = loadedData.gsFlags[i]; + } + + gSaveContext.sohStats.fileCreatedAt = loadedData.sohStats.fileCreatedAt; + + // Restore master sword state + u8 hasMasterSword = CHECK_OWNED_EQUIP(EQUIP_TYPE_SWORD, 1); + if (hasMasterSword) { + loadedData.inventory.equipment |= 0x2; + } else { + loadedData.inventory.equipment &= ~0x2; + } + + // Restore bottle contents (unless it's ruto's letter) + for (int i = 0; i < 4; i++) { + if (gSaveContext.inventory.items[SLOT_BOTTLE_1 + i] != ITEM_NONE && gSaveContext.inventory.items[SLOT_BOTTLE_1 + i] != ITEM_LETTER_RUTO) { + loadedData.inventory.items[SLOT_BOTTLE_1 + i] = gSaveContext.inventory.items[SLOT_BOTTLE_1 + i]; + } + } + + // Restore ammo if it's non-zero, unless it's beans + for (int i = 0; i < ARRAY_COUNT(gSaveContext.inventory.ammo); i++) { + if (gSaveContext.inventory.ammo[i] != 0 && i != SLOT(ITEM_BEAN) && i != SLOT(ITEM_BEAN + 1)) { + loadedData.inventory.ammo[i] = gSaveContext.inventory.ammo[i]; + } + } + + gSaveContext.inventory = loadedData.inventory; + + // The commented out code below is an attempt at sending the entire randomizer seed over, in hopes that a player doesn't have to generate the seed themselves + // Currently it doesn't work :) + if (IS_RANDO && payload["state"].contains("rando")) { + auto randoContext = Rando::Context::GetInstance(); + + for (int i = 0; i < RC_MAX; i++) { + // randoContext->GetItemLocation(i)->RefPlacedItem() = payload["state"]["rando"]["itemLocations"][i]["rgID"].get(); + OTRGlobals::Instance->gRandoContext->GetItemLocation(i)->SetCheckStatus(payload["state"]["rando"]["itemLocations"][i][0].get()); + OTRGlobals::Instance->gRandoContext->GetItemLocation(i)->SetIsSkipped(payload["state"]["rando"]["itemLocations"][i][0].get()); + + // if (payload["state"]["rando"]["itemLocations"][i].contains("fakeRgID")) { + // randoContext->overrides.emplace(static_cast(i), Rando::ItemOverride(static_cast(i), payload["state"]["rando"]["itemLocations"][i]["fakeRgID"].get())); + // randoContext->GetItemOverride(i).GetTrickName().english = payload["state"]["rando"]["itemLocations"][i]["trickName"]["english"].get(); + // randoContext->GetItemOverride(i).GetTrickName().french = payload["state"]["rando"]["itemLocations"][i]["trickName"]["french"].get(); + // } + // if (payload["state"]["rando"]["itemLocations"][i].contains("price")) { + // u16 price = payload["state"]["rando"]["itemLocations"][i]["price"].get(); + // if (price > 0) { + // randoContext->GetItemLocation(i)->SetCustomPrice(price); + // } + // } + } + + // auto entranceCtx = randoContext->GetEntranceShuffler(); + // for (int i = 0; i < ENTRANCE_OVERRIDES_MAX_COUNT; i++) { + // entranceCtx->entranceOverrides[i].type = payload["state"]["rando"]["entrances"][i]["type"].get(); + // entranceCtx->entranceOverrides[i].index = payload["state"]["rando"]["entrances"][i]["index"].get(); + // entranceCtx->entranceOverrides[i].destination = payload["state"]["rando"]["entrances"][i]["destination"].get(); + // entranceCtx->entranceOverrides[i].override = payload["state"]["rando"]["entrances"][i]["override"].get(); + // entranceCtx->entranceOverrides[i].overrideDestination = payload["state"]["rando"]["entrances"][i]["overrideDestination"].get(); + // } + + // for (int i = 0; i < randoContext->hashIconIndexes.size(); i++) { + // randoContext->hashIconIndexes[i] = payload["state"]["rando"]["seed"][i].get(); + // } + // randoContext->GetSettings()->SetSeedString(payload["state"]["rando"]["inputSeed"].get()); + // randoContext->GetSettings()->SetSeed(payload["state"]["rando"]["finalSeed"].get()); + + // for (int i = 0; i < RSK_MAX; i++) { + // randoContext->GetOption(RandomizerSettingKey(i)).SetSelectedIndex(payload["state"]["rando"]["randoSettings"][i].get()); + // } + + // randoContext->GetDungeons()->ClearAllMQ(); + // for (int i = 0; i < randoContext->GetDungeons()->GetDungeonListSize(); i++) { + // if (payload["state"]["rando"]["masterQuestDungeons"][i].get()) { + // randoContext->GetDungeon(i)->SetMQ(); + // } + // } + + // randoContext->GetTrials()->SkipAll(); + // for (int i = 0; i < randoContext->GetTrials()->GetTrialListSize(); i++) { + // if (payload["state"]["rando"]["requiredTrials"][i].get()) { + // randoContext->GetTrial(i)->SetAsRequired(); + // } + // } + } + + Notification::Emit({ + .message = "Save updated from team", + }); + } + + if (payload.contains("queue")) { + for (auto& item : payload["queue"]) { + nlohmann::json itemPayload = nlohmann::json::parse(item.get()); + Anchor::Instance->OnIncomingJson(itemPayload); + } + } + isHandlingUpdateTeamState = false; +} + +#endif // ENABLE_REMOTE_CONTROL diff --git a/soh/soh/OTRGlobals.cpp b/soh/soh/OTRGlobals.cpp index b5627db36..362aab447 100644 --- a/soh/soh/OTRGlobals.cpp +++ b/soh/soh/OTRGlobals.cpp @@ -77,8 +77,10 @@ #ifdef ENABLE_REMOTE_CONTROL #include "soh/Network/CrowdControl/CrowdControl.h" #include "soh/Network/Sail/Sail.h" +#include "soh/Network/Anchor/Anchor.h" CrowdControl* CrowdControl::Instance; Sail* Sail::Instance; +Anchor* Anchor::Instance; #endif #include "Enhancements/mods.h" @@ -1164,6 +1166,7 @@ extern "C" void InitOTR() { #ifdef ENABLE_REMOTE_CONTROL CrowdControl::Instance = new CrowdControl(); Sail::Instance = new Sail(); + Anchor::Instance = new Anchor(); #endif OTRMessage_Init(); @@ -1199,6 +1202,9 @@ extern "C" void InitOTR() { if (CVarGetInteger(CVAR_REMOTE_SAIL("Enabled"), 0)) { Sail::Instance->Enable(); } + if (CVarGetInteger(CVAR_REMOTE_ANCHOR("Enabled"), 0)) { + Anchor::Instance->Enable(); + } #endif } @@ -1216,6 +1222,9 @@ extern "C" void DeinitOTR() { if (CVarGetInteger(CVAR_REMOTE_SAIL("Enabled"), 0)) { Sail::Instance->Disable(); } + if (CVarGetInteger(CVAR_REMOTE_ANCHOR("Enabled"), 0)) { + Anchor::Instance->Disable(); + } SDLNet_Quit(); #endif diff --git a/soh/soh/SaveManager.cpp b/soh/soh/SaveManager.cpp index 1edec3025..4f12f00c7 100644 --- a/soh/soh/SaveManager.cpp +++ b/soh/soh/SaveManager.cpp @@ -1223,7 +1223,7 @@ void SaveManager::SaveFileThreaded(int fileNum, SaveContext* saveContext, int se delete saveContext; InitMeta(fileNum); - GameInteractor::Instance->ExecuteHooks(fileNum); + GameInteractor::Instance->ExecuteHooks(fileNum, sectionID); SPDLOG_INFO("Save File Finish - fileNum: {}", fileNum); saveMtx.unlock(); } diff --git a/soh/soh/SohGui.cpp b/soh/soh/SohGui.cpp index 2dbf62a99..fdfe76d3f 100644 --- a/soh/soh/SohGui.cpp +++ b/soh/soh/SohGui.cpp @@ -39,6 +39,9 @@ #include "Enhancements/debugger/MessageViewer.h" #include "soh/Notification/Notification.h" #include "soh/Enhancements/TimeDisplay/TimeDisplay.h" +#ifdef ENABLE_REMOTE_CONTROL +#include "soh/Network/Anchor/Anchor.h" +#endif bool isBetaQuestEnabled = false; @@ -138,6 +141,9 @@ namespace SohGui { std::shared_ptr mModalWindow; std::shared_ptr mNotificationWindow; std::shared_ptr mTimeDisplayWindow; +#ifdef ENABLE_REMOTE_CONTROL + std::shared_ptr mAnchorRoomWindow; +#endif void SetupGuiElements() { auto gui = Ship::Context::GetInstance()->GetWindow()->GetGui(); @@ -225,6 +231,10 @@ namespace SohGui { mNotificationWindow->Show(); mTimeDisplayWindow = std::make_shared(CVAR_WINDOW("TimeDisplayEnabled"), "Additional Timers"); gui->AddGuiWindow(mTimeDisplayWindow); +#ifdef ENABLE_REMOTE_CONTROL + mAnchorRoomWindow = std::make_shared(CVAR_WINDOW("AnchorRoom"), "Anchor Room"); + gui->AddGuiWindow(mAnchorRoomWindow); +#endif } void Destroy() { @@ -261,6 +271,9 @@ namespace SohGui { mTimeSplitWindow = nullptr; mPlandomizerWindow = nullptr; mTimeDisplayWindow = nullptr; +#ifdef ENABLE_REMOTE_CONTROL + mAnchorRoomWindow = nullptr; +#endif } void RegisterPopup(std::string title, std::string message, std::string button1, std::string button2, std::function button1callback, std::function button2callback) { diff --git a/soh/soh/SohMenuBar.cpp b/soh/soh/SohMenuBar.cpp index ba9e683bf..a76bf509e 100644 --- a/soh/soh/SohMenuBar.cpp +++ b/soh/soh/SohMenuBar.cpp @@ -22,6 +22,7 @@ #ifdef ENABLE_REMOTE_CONTROL #include "soh/Network/CrowdControl/CrowdControl.h" #include "soh/Network/Sail/Sail.h" +#include "soh/Network/Anchor/Anchor.h" #endif @@ -2102,6 +2103,7 @@ void DrawRemoteControlMenu() { if (ImGui::BeginMenu("Network")) { Sail::Instance->DrawMenu(); CrowdControl::Instance->DrawMenu(); + Anchor::Instance->DrawMenu(); ImGui::EndMenu(); } } diff --git a/soh/soh/UIWidgets.cpp b/soh/soh/UIWidgets.cpp index 23af9f613..958685eac 100644 --- a/soh/soh/UIWidgets.cpp +++ b/soh/soh/UIWidgets.cpp @@ -825,7 +825,7 @@ namespace UIWidgets { return 0; } - bool InputString(const char* label, std::string* value) { - return ImGui::InputText(label, (char*)value->c_str(), value->capacity() + 1, ImGuiInputTextFlags_CallbackResize, InputTextResizeCallback, value); + bool InputString(const char* label, std::string* value, ImGuiInputTextFlags flags) { + return ImGui::InputText(label, (char*)value->c_str(), value->capacity() + 1, ImGuiInputTextFlags_CallbackResize | flags, InputTextResizeCallback, value); } } diff --git a/soh/soh/UIWidgets.hpp b/soh/soh/UIWidgets.hpp index 5903220d2..0ad2a4703 100644 --- a/soh/soh/UIWidgets.hpp +++ b/soh/soh/UIWidgets.hpp @@ -102,7 +102,7 @@ namespace UIWidgets { void DrawFlagArray16(const std::string& name, uint16_t& flags); void DrawFlagArray8(const std::string& name, uint8_t& flags); bool StateButton(const char* str_id, const char* label); - bool InputString(const char* label, std::string* value); + bool InputString(const char* label, std::string* value, ImGuiInputTextFlags flags = 0); } #endif /* UIWidgets_hpp */ diff --git a/soh/soh/cvar_prefixes.h b/soh/soh/cvar_prefixes.h index 6ddde97bd..cee81167e 100644 --- a/soh/soh/cvar_prefixes.h +++ b/soh/soh/cvar_prefixes.h @@ -14,4 +14,5 @@ #define CVAR_GENERAL(var) CVAR_PREFIX_GENERAL "." var #define CVAR_REMOTE(var) CVAR_PREFIX_REMOTE "." var #define CVAR_REMOTE_CROWD_CONTROL(var) CVAR_REMOTE(".CrowdControl." var) -#define CVAR_REMOTE_SAIL(var) CVAR_REMOTE(".Sail." var) \ No newline at end of file +#define CVAR_REMOTE_SAIL(var) CVAR_REMOTE(".Sail." var) +#define CVAR_REMOTE_ANCHOR(var) CVAR_REMOTE(".Anchor." var) diff --git a/soh/soh/util.cpp b/soh/soh/util.cpp index faa171231..4b43e2ba9 100644 --- a/soh/soh/util.cpp +++ b/soh/soh/util.cpp @@ -117,6 +117,7 @@ std::vector sceneNames = { "Castle Hedge Maze (Early)", "Sasa Test", "Treasure Chest Room", + "Unknown", }; std::vector itemNames = { diff --git a/soh/src/code/z_actor.c b/soh/src/code/z_actor.c index 70c7a3233..9c241898f 100644 --- a/soh/src/code/z_actor.c +++ b/soh/src/code/z_actor.c @@ -1231,14 +1231,20 @@ void Actor_Init(Actor* actor, PlayState* play) { ActorShape_Init(&actor->shape, 0.0f, NULL, 0.0f); if (Object_IsLoaded(&play->objectCtx, actor->objBankIndex)) { Actor_SetObjectDependency(play, actor); - actor->init(actor, play); - actor->init = NULL; - GameInteractor_ExecuteOnActorInit(actor); + if (GameInteractor_ShouldActorInit(actor)) { + actor->init(actor, play); + actor->init = NULL; - // For enemy health bar we need to know the max health during init - if (actor->category == ACTORCAT_ENEMY) { - actor->maximumHealth = actor->colChkInfo.health; + GameInteractor_ExecuteOnActorInit(actor); + + // For enemy health bar we need to know the max health during init + if (actor->category == ACTORCAT_ENEMY) { + actor->maximumHealth = actor->colChkInfo.health; + } + } else { + actor->init = NULL; + Actor_Kill(actor); } } } @@ -2210,6 +2216,10 @@ void Player_PlaySfx(Actor* actor, u16 sfxId) { // Audio_PlaySoundGeneral(sfxId, &actor->projectedPos, 4, &D_801333E0 , &D_801333E0, &D_801333E8); Audio_PlaySoundGeneral(sfxId, &actor->projectedPos, 4, &freqMultiplier, &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb); } + + if (actor->id == ACTOR_PLAYER) { + GameInteractor_ExecuteOnPlayerSfx(sfxId); + } } void Audio_PlayActorSound2(Actor* actor, u16 sfxId) { @@ -2589,14 +2599,20 @@ void Actor_UpdateAll(PlayState* play, ActorContext* actorCtx) { if (Object_IsLoaded(&play->objectCtx, actor->objBankIndex)) { Actor_SetObjectDependency(play, actor); - actor->init(actor, play); - actor->init = NULL; - GameInteractor_ExecuteOnActorInit(actor); + if (GameInteractor_ShouldActorInit(actor)) { + actor->init(actor, play); + actor->init = NULL; - // For enemy health bar we need to know the max health during init - if (actor->category == ACTORCAT_ENEMY) { - actor->maximumHealth = actor->colChkInfo.health; + GameInteractor_ExecuteOnActorInit(actor); + + // For enemy health bar we need to know the max health during init + if (actor->category == ACTORCAT_ENEMY) { + actor->maximumHealth = actor->colChkInfo.health; + } + } else { + actor->init = NULL; + Actor_Kill(actor); } } actor = actor->next; diff --git a/soh/src/code/z_en_item00.c b/soh/src/code/z_en_item00.c index 1bd859718..b71a19feb 100644 --- a/soh/src/code/z_en_item00.c +++ b/soh/src/code/z_en_item00.c @@ -775,6 +775,13 @@ void EnItem00_Update(Actor* thisx, PlayState* play) { EnItem00* this = (EnItem00*)thisx; s32 pad; + // #region SOH [Co-op] + if (Flags_GetCollectible(play, this->collectibleFlag)) { + Actor_Kill(&this->actor); + return; + } + // #endregion + // Rotate some drops when 3D drops are on, otherwise reset rotation back to 0 for billboard effect if ( (this->actor.params == ITEM00_HEART && this->unk_15A >= 0) || diff --git a/soh/src/overlays/actors/ovl_Bg_Bombwall/z_bg_bombwall.c b/soh/src/overlays/actors/ovl_Bg_Bombwall/z_bg_bombwall.c index 160dc15f9..cf57bdc55 100644 --- a/soh/src/overlays/actors/ovl_Bg_Bombwall/z_bg_bombwall.c +++ b/soh/src/overlays/actors/ovl_Bg_Bombwall/z_bg_bombwall.c @@ -211,7 +211,9 @@ void func_8086ED50(BgBombwall* this, PlayState* play) { } void func_8086ED70(BgBombwall* this, PlayState* play) { - if (this->collider.base.acFlags & AC_HIT) { + // #region SOH [Co-op] + if ((this->collider.base.acFlags & AC_HIT) || Flags_GetSwitch(play, this->dyna.actor.params & 0x3F)) { + // #endregion this->collider.base.acFlags &= ~AC_HIT; func_8086EDFC(this, play); Flags_SetSwitch(play, this->dyna.actor.params & 0x3F); diff --git a/soh/src/overlays/actors/ovl_Bg_Breakwall/z_bg_breakwall.c b/soh/src/overlays/actors/ovl_Bg_Breakwall/z_bg_breakwall.c index 9f89e7980..bee6b1155 100644 --- a/soh/src/overlays/actors/ovl_Bg_Breakwall/z_bg_breakwall.c +++ b/soh/src/overlays/actors/ovl_Bg_Breakwall/z_bg_breakwall.c @@ -277,7 +277,9 @@ void BgBreakwall_Wait(BgBreakwall* this, PlayState* play) { } } - if (GameInteractor_Should(VB_BG_BREAKWALL_BREAK, this->collider.base.acFlags & 2 || blueFireArrowHit)) { + // #region SOH [Co-op] + if (GameInteractor_Should(VB_BG_BREAKWALL_BREAK, this->collider.base.acFlags & 2 || blueFireArrowHit) || Flags_GetSwitch(play, this->dyna.actor.params & 0x3F)) { + // #endregion Vec3f effectPos; s32 wallType = ((this->dyna.actor.params >> 13) & 3) & 0xFF; diff --git a/soh/src/overlays/actors/ovl_Bg_Haka_Zou/z_bg_haka_zou.c b/soh/src/overlays/actors/ovl_Bg_Haka_Zou/z_bg_haka_zou.c index f41964603..4d3ed967f 100644 --- a/soh/src/overlays/actors/ovl_Bg_Haka_Zou/z_bg_haka_zou.c +++ b/soh/src/overlays/actors/ovl_Bg_Haka_Zou/z_bg_haka_zou.c @@ -268,7 +268,9 @@ void func_80882E54(BgHakaZou* this, PlayState* play) { } void func_80883000(BgHakaZou* this, PlayState* play) { - if (this->collider.base.acFlags & AC_HIT) { + // #region SOH [Co-op] + if ((this->collider.base.acFlags & AC_HIT) || Flags_GetSwitch(play, this->switchFlag)) { + // #endregion Flags_SetSwitch(play, this->switchFlag); if (this->dyna.actor.params == STA_GIANT_BIRD_STATUE) { diff --git a/soh/src/overlays/actors/ovl_Bg_Hidan_Dalm/z_bg_hidan_dalm.c b/soh/src/overlays/actors/ovl_Bg_Hidan_Dalm/z_bg_hidan_dalm.c index c1d402188..6ce78615c 100644 --- a/soh/src/overlays/actors/ovl_Bg_Hidan_Dalm/z_bg_hidan_dalm.c +++ b/soh/src/overlays/actors/ovl_Bg_Hidan_Dalm/z_bg_hidan_dalm.c @@ -126,8 +126,10 @@ void BgHidanDalm_Destroy(Actor* thisx, PlayState* play) { void BgHidanDalm_Wait(BgHidanDalm* this, PlayState* play) { Player* player = GET_PLAYER(play); - if ((this->collider.base.acFlags & AC_HIT) && !Player_InCsMode(play) && - (player->meleeWeaponAnimation == 22 || player->meleeWeaponAnimation == 23)) { + // #region SOH [Co-op] + if (((this->collider.base.acFlags & AC_HIT) && !Player_InCsMode(play) && + (player->meleeWeaponAnimation == 22 || player->meleeWeaponAnimation == 23)) || Flags_GetSwitch(play, this->switchFlag)) { + // #endregion this->collider.base.acFlags &= ~AC_HIT; if ((this->collider.elements[0].info.bumperFlags & BUMP_HIT) || (this->collider.elements[1].info.bumperFlags & BUMP_HIT)) { diff --git a/soh/src/overlays/actors/ovl_Bg_Hidan_Hamstep/z_bg_hidan_hamstep.c b/soh/src/overlays/actors/ovl_Bg_Hidan_Hamstep/z_bg_hidan_hamstep.c index 818533571..e49f33a9a 100644 --- a/soh/src/overlays/actors/ovl_Bg_Hidan_Hamstep/z_bg_hidan_hamstep.c +++ b/soh/src/overlays/actors/ovl_Bg_Hidan_Hamstep/z_bg_hidan_hamstep.c @@ -278,7 +278,9 @@ void func_80888734(BgHidanHamstep* this) { } void func_808887C4(BgHidanHamstep* this, PlayState* play) { - if (this->collider.base.acFlags & AC_HIT) { + // #region SOH [Co-op] + if ((this->collider.base.acFlags & AC_HIT) || Flags_GetSwitch(play, (this->dyna.actor.params >> 8) & 0xFF)) { + // #endregion OnePointCutscene_Init(play, 3310, 100, &this->dyna.actor, MAIN_CAM); Audio_PlayActorSound2(&this->dyna.actor, NA_SE_EV_HAMMER_SWITCH); this->collider.base.acFlags = AC_NONE; diff --git a/soh/src/overlays/actors/ovl_Bg_Hidan_Hrock/z_bg_hidan_hrock.c b/soh/src/overlays/actors/ovl_Bg_Hidan_Hrock/z_bg_hidan_hrock.c index ea49fbd4f..5079c200e 100644 --- a/soh/src/overlays/actors/ovl_Bg_Hidan_Hrock/z_bg_hidan_hrock.c +++ b/soh/src/overlays/actors/ovl_Bg_Hidan_Hrock/z_bg_hidan_hrock.c @@ -201,7 +201,9 @@ void func_8088960C(BgHidanHrock* this, PlayState* play) { } void func_808896B8(BgHidanHrock* this, PlayState* play) { - if (this->collider.base.acFlags & 2) { + // #region SOH [Co-op] + if ((this->collider.base.acFlags & 2) || Flags_GetSwitch(play, this->unk_16A)) { + // #endregion this->collider.base.acFlags &= ~2; this->actionFunc = func_808894B0; this->dyna.actor.flags |= ACTOR_FLAG_UPDATE_WHILE_CULLED; diff --git a/soh/src/overlays/actors/ovl_Bg_Hidan_Kowarerukabe/z_bg_hidan_kowarerukabe.c b/soh/src/overlays/actors/ovl_Bg_Hidan_Kowarerukabe/z_bg_hidan_kowarerukabe.c index c9cbb039f..71f586f45 100644 --- a/soh/src/overlays/actors/ovl_Bg_Hidan_Kowarerukabe/z_bg_hidan_kowarerukabe.c +++ b/soh/src/overlays/actors/ovl_Bg_Hidan_Kowarerukabe/z_bg_hidan_kowarerukabe.c @@ -303,7 +303,9 @@ void BgHidanKowarerukabe_Update(Actor* thisx, PlayState* play) { BgHidanKowarerukabe* this = (BgHidanKowarerukabe*)thisx; s32 pad; - if (Actor_GetCollidedExplosive(play, &this->collider.base) != NULL) { + // #region SOH [Co-op] + if ((Actor_GetCollidedExplosive(play, &this->collider.base) != NULL) || Flags_GetSwitch(play, (this->dyna.actor.params >> 8) & 0x3F)) { + // #endregion BgHidanKowarerukabe_Break(this, play); Flags_SetSwitch(play, (this->dyna.actor.params >> 8) & 0x3F); diff --git a/soh/src/overlays/actors/ovl_Bg_Ice_Shelter/z_bg_ice_shelter.c b/soh/src/overlays/actors/ovl_Bg_Ice_Shelter/z_bg_ice_shelter.c index 9810f2749..d09980978 100644 --- a/soh/src/overlays/actors/ovl_Bg_Ice_Shelter/z_bg_ice_shelter.c +++ b/soh/src/overlays/actors/ovl_Bg_Ice_Shelter/z_bg_ice_shelter.c @@ -333,10 +333,12 @@ void func_8089107C(BgIceShelter* this, PlayState* play) { MeltOnIceArrowHit(this, this->cylinder2, type, play); } // Default blue fire check - if (this->cylinder1.base.acFlags & AC_HIT) { + // #region SOH [Co-op] + if ((this->cylinder1.base.acFlags & AC_HIT) || Flags_GetSwitch(play, this->dyna.actor.params & 0x3F)) { this->cylinder1.base.acFlags &= ~AC_HIT; - if ((this->cylinder1.base.ac != NULL) && (this->cylinder1.base.ac->id == ACTOR_EN_ICE_HONO)) { + if (((this->cylinder1.base.ac != NULL) && (this->cylinder1.base.ac->id == ACTOR_EN_ICE_HONO)) || Flags_GetSwitch(play, this->dyna.actor.params & 0x3F)) { + // #endregion if (type == 4) { if (this->dyna.actor.parent != NULL) { this->dyna.actor.parent->freezeTimer = 50; diff --git a/soh/src/overlays/actors/ovl_Bg_Jya_Bombchuiwa/z_bg_jya_bombchuiwa.c b/soh/src/overlays/actors/ovl_Bg_Jya_Bombchuiwa/z_bg_jya_bombchuiwa.c index cb36b743d..bb7333c52 100644 --- a/soh/src/overlays/actors/ovl_Bg_Jya_Bombchuiwa/z_bg_jya_bombchuiwa.c +++ b/soh/src/overlays/actors/ovl_Bg_Jya_Bombchuiwa/z_bg_jya_bombchuiwa.c @@ -142,7 +142,9 @@ void BgJyaBombchuiwa_SetupWaitForExplosion(BgJyaBombchuiwa* this, PlayState* pla } void BgJyaBombchuiwa_WaitForExplosion(BgJyaBombchuiwa* this, PlayState* play) { - if ((this->collider.base.acFlags & AC_HIT) || (this->timer > 0)) { + // #region SOH [Co-op] + if (((this->collider.base.acFlags & AC_HIT) || (this->timer > 0)) || Flags_GetSwitch(play, this->actor.params & 0x3F)) { + // #endregion if (this->timer == 0) { OnePointCutscene_Init(play, 3410, -99, &this->actor, MAIN_CAM); } diff --git a/soh/src/overlays/actors/ovl_Bg_Jya_Bombiwa/z_bg_jya_bombiwa.c b/soh/src/overlays/actors/ovl_Bg_Jya_Bombiwa/z_bg_jya_bombiwa.c index d0e4b9471..9edb9edc6 100644 --- a/soh/src/overlays/actors/ovl_Bg_Jya_Bombiwa/z_bg_jya_bombiwa.c +++ b/soh/src/overlays/actors/ovl_Bg_Jya_Bombiwa/z_bg_jya_bombiwa.c @@ -163,7 +163,9 @@ void BgJyaBombiwa_Break(BgJyaBombiwa* this, PlayState* play) { void BgJyaBombiwa_Update(Actor* thisx, PlayState* play) { BgJyaBombiwa* this = (BgJyaBombiwa*)thisx; - if (this->collider.base.acFlags & AC_HIT) { + // #region SOH [Co-op] + if ((this->collider.base.acFlags & AC_HIT) || Flags_GetSwitch(play, this->dyna.actor.params & 0x3F)) { + // #endregion BgJyaBombiwa_Break(this, play); Flags_SetSwitch(play, this->dyna.actor.params & 0x3F); SoundSource_PlaySfxAtFixedWorldPos(play, &this->dyna.actor.world.pos, 40, NA_SE_EV_WALL_BROKEN); diff --git a/soh/src/overlays/actors/ovl_Bg_Mizu_Bwall/z_bg_mizu_bwall.c b/soh/src/overlays/actors/ovl_Bg_Mizu_Bwall/z_bg_mizu_bwall.c index 89db58c0e..8eaa8ff10 100644 --- a/soh/src/overlays/actors/ovl_Bg_Mizu_Bwall/z_bg_mizu_bwall.c +++ b/soh/src/overlays/actors/ovl_Bg_Mizu_Bwall/z_bg_mizu_bwall.c @@ -467,7 +467,9 @@ void BgMizuBwall_SpawnDebris(BgMizuBwall* this, PlayState* play) { void BgMizuBwall_Idle(BgMizuBwall* this, PlayState* play) { BgMizuBwall_SetAlpha(this, play); - if (this->collider.base.acFlags & AC_HIT) { + // #region SOH [Co-op] + if ((this->collider.base.acFlags & AC_HIT) || Flags_GetSwitch(play, ((u16)this->dyna.actor.params >> 8) & 0x3F)) { + // #endregion this->collider.base.acFlags &= ~AC_HIT; Flags_SetSwitch(play, ((u16)this->dyna.actor.params >> 8) & 0x3F); this->breakTimer = 1; diff --git a/soh/src/overlays/actors/ovl_Bg_Spot08_Bakudankabe/z_bg_spot08_bakudankabe.c b/soh/src/overlays/actors/ovl_Bg_Spot08_Bakudankabe/z_bg_spot08_bakudankabe.c index e40302b66..5269510fe 100644 --- a/soh/src/overlays/actors/ovl_Bg_Spot08_Bakudankabe/z_bg_spot08_bakudankabe.c +++ b/soh/src/overlays/actors/ovl_Bg_Spot08_Bakudankabe/z_bg_spot08_bakudankabe.c @@ -183,7 +183,9 @@ void BgSpot08Bakudankabe_Destroy(Actor* thisx, PlayState* play) { void BgSpot08Bakudankabe_Update(Actor* thisx, PlayState* play) { BgSpot08Bakudankabe* this = (BgSpot08Bakudankabe*)thisx; - if (this->collider.base.acFlags & AC_HIT) { + // #region SOH [Co-op] + if ((this->collider.base.acFlags & AC_HIT) || Flags_GetSwitch(play, (this->dyna.actor.params & 0x3F))) { + // #endregion func_808B0324(this, play); Flags_SetSwitch(play, (this->dyna.actor.params & 0x3F)); SoundSource_PlaySfxAtFixedWorldPos(play, &this->dyna.actor.world.pos, 40, NA_SE_EV_WALL_BROKEN); diff --git a/soh/src/overlays/actors/ovl_Bg_Spot11_Bakudankabe/z_bg_spot11_bakudankabe.c b/soh/src/overlays/actors/ovl_Bg_Spot11_Bakudankabe/z_bg_spot11_bakudankabe.c index 3b7f7c7e4..81fe0a06b 100644 --- a/soh/src/overlays/actors/ovl_Bg_Spot11_Bakudankabe/z_bg_spot11_bakudankabe.c +++ b/soh/src/overlays/actors/ovl_Bg_Spot11_Bakudankabe/z_bg_spot11_bakudankabe.c @@ -135,7 +135,9 @@ void BgSpot11Bakudankabe_Destroy(Actor* thisx, PlayState* play) { void BgSpot11Bakudankabe_Update(Actor* thisx, PlayState* play) { BgSpot11Bakudankabe* this = (BgSpot11Bakudankabe*)thisx; - if (this->collider.base.acFlags & AC_HIT) { + // #region SOH [Co-op] + if ((this->collider.base.acFlags & AC_HIT) || Flags_GetSwitch(play, (this->dyna.actor.params & 0x3F))) { + // #endregion func_808B2218(this, play); Flags_SetSwitch(play, (this->dyna.actor.params & 0x3F)); SoundSource_PlaySfxAtFixedWorldPos(play, &D_808B2738, 40, NA_SE_EV_WALL_BROKEN); diff --git a/soh/src/overlays/actors/ovl_Bg_Spot17_Bakudankabe/z_bg_spot17_bakudankabe.c b/soh/src/overlays/actors/ovl_Bg_Spot17_Bakudankabe/z_bg_spot17_bakudankabe.c index 6537a1690..fe934bd2d 100644 --- a/soh/src/overlays/actors/ovl_Bg_Spot17_Bakudankabe/z_bg_spot17_bakudankabe.c +++ b/soh/src/overlays/actors/ovl_Bg_Spot17_Bakudankabe/z_bg_spot17_bakudankabe.c @@ -114,7 +114,9 @@ void BgSpot17Bakudankabe_Destroy(Actor* thisx, PlayState* play) { void BgSpot17Bakudankabe_Update(Actor* thisx, PlayState* play) { BgSpot17Bakudankabe* this = (BgSpot17Bakudankabe*)thisx; - if (this->dyna.actor.xzDistToPlayer < 650.0f && func_80033684(play, &this->dyna.actor) != NULL) { + // #region SOH [Co-op] + if ((this->dyna.actor.xzDistToPlayer < 650.0f && func_80033684(play, &this->dyna.actor) != NULL) || Flags_GetSwitch(play, (this->dyna.actor.params & 0x3F))) { + // #endregion func_808B6BC0(this, play); Flags_SetSwitch(play, (this->dyna.actor.params & 0x3F)); SoundSource_PlaySfxAtFixedWorldPos(play, &this->dyna.actor.world.pos, 40, NA_SE_EV_WALL_BROKEN); diff --git a/soh/src/overlays/actors/ovl_Bg_Ydan_Maruta/z_bg_ydan_maruta.c b/soh/src/overlays/actors/ovl_Bg_Ydan_Maruta/z_bg_ydan_maruta.c index 23d7fac96..f2556541b 100644 --- a/soh/src/overlays/actors/ovl_Bg_Ydan_Maruta/z_bg_ydan_maruta.c +++ b/soh/src/overlays/actors/ovl_Bg_Ydan_Maruta/z_bg_ydan_maruta.c @@ -146,7 +146,9 @@ void func_808BEFF4(BgYdanMaruta* this, PlayState* play) { } void func_808BF078(BgYdanMaruta* this, PlayState* play) { - if (this->collider.base.acFlags & AC_HIT) { + // #region SOH [Co-op] + if ((this->collider.base.acFlags & AC_HIT) || Flags_GetSwitch(play, this->switchFlag)) { + // #endregion this->unk_16A = 20; Flags_SetSwitch(play, this->switchFlag); Sfx_PlaySfxCentered(NA_SE_SY_CORRECT_CHIME); diff --git a/soh/src/overlays/actors/ovl_Bg_Ydan_Sp/z_bg_ydan_sp.c b/soh/src/overlays/actors/ovl_Bg_Ydan_Sp/z_bg_ydan_sp.c index 59402d658..f448d55a0 100644 --- a/soh/src/overlays/actors/ovl_Bg_Ydan_Sp/z_bg_ydan_sp.c +++ b/soh/src/overlays/actors/ovl_Bg_Ydan_Sp/z_bg_ydan_sp.c @@ -282,6 +282,12 @@ void BgYdanSp_FloorWebIdle(BgYdanSp* this, PlayState* play) { webPos.x = this->dyna.actor.world.pos.x; webPos.y = this->dyna.actor.world.pos.y - 50.0f; webPos.z = this->dyna.actor.world.pos.z; + // #region SOH [Co-op] + if (Flags_GetSwitch(play, this->isDestroyedSwitchFlag)) { + BgYdanSp_BurnWeb(this, play); + return; + } + // #endregion if (Player_IsBurningStickInRange(play, &webPos, 70.0f, 50.0f) != 0) { this->dyna.actor.home.pos.x = player->meleeWeaponInfo[0].tip.x; this->dyna.actor.home.pos.z = player->meleeWeaponInfo[0].tip.z; @@ -411,6 +417,11 @@ void BgYdanSp_WallWebIdle(BgYdanSp* this, PlayState* play) { BgYdanSp_BurnWeb(this, play); } } + // #region SOH [Co-op] + if (Flags_GetSwitch(play, this->isDestroyedSwitchFlag)) { + BgYdanSp_BurnWeb(this, play); + } + // #endregion CollisionCheck_SetAC(play, &play->colChkCtx, &this->trisCollider.base); } diff --git a/soh/src/overlays/actors/ovl_Door_Gerudo/z_door_gerudo.c b/soh/src/overlays/actors/ovl_Door_Gerudo/z_door_gerudo.c index 99dd5e43f..3db8803a6 100644 --- a/soh/src/overlays/actors/ovl_Door_Gerudo/z_door_gerudo.c +++ b/soh/src/overlays/actors/ovl_Door_Gerudo/z_door_gerudo.c @@ -6,6 +6,7 @@ #include "z_door_gerudo.h" #include "objects/object_door_gerudo/object_door_gerudo.h" +#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" #define FLAGS 0 @@ -103,6 +104,7 @@ void func_8099485C(DoorGerudo* this, PlayState* play) { gSaveContext.inventory.dungeonKeys[gSaveContext.mapIndex] -= 1; Flags_SetSwitch(play, this->dyna.actor.params & 0x3F); Audio_PlayActorSound2(&this->dyna.actor, NA_SE_EV_CHAIN_KEY_UNLOCK); + GameInteractor_ExecuteOnDungeonKeyUsedHooks(gSaveContext.mapIndex); } else { s32 direction = func_80994750(this, play); diff --git a/soh/src/overlays/actors/ovl_Door_Shutter/z_door_shutter.c b/soh/src/overlays/actors/ovl_Door_Shutter/z_door_shutter.c index c842571e7..14cff8380 100644 --- a/soh/src/overlays/actors/ovl_Door_Shutter/z_door_shutter.c +++ b/soh/src/overlays/actors/ovl_Door_Shutter/z_door_shutter.c @@ -379,6 +379,7 @@ void func_80996B0C(DoorShutter* this, PlayState* play) { if (this->doorType != SHUTTER_BOSS) { gSaveContext.inventory.dungeonKeys[gSaveContext.mapIndex]--; Audio_PlayActorSound2(&this->dyna.actor, NA_SE_EV_CHAIN_KEY_UNLOCK); + GameInteractor_ExecuteOnDungeonKeyUsedHooks(gSaveContext.mapIndex); } else { Audio_PlayActorSound2(&this->dyna.actor, NA_SE_EV_CHAIN_KEY_UNLOCK_B); } @@ -645,6 +646,11 @@ void DoorShutter_Update(Actor* thisx, PlayState* play) { if (!(player->stateFlags1 & (PLAYER_STATE1_TALKING | PLAYER_STATE1_DEAD | PLAYER_STATE1_GETTING_ITEM | PLAYER_STATE1_IN_ITEM_CS)) || (this->actionFunc == DoorShutter_SetupType)) { this->actionFunc(this, play); } + // #region SOH [Co-op] + if (Flags_GetSwitch(play, this->dyna.actor.params & 0x3F)) { + DECR(this->unk_16E); + } + // #endregion } Gfx* func_80997838(PlayState* play, DoorShutter* this, Gfx* p) { diff --git a/soh/src/overlays/actors/ovl_En_Door/z_en_door.c b/soh/src/overlays/actors/ovl_En_Door/z_en_door.c index 92670921d..c8edec4b2 100644 --- a/soh/src/overlays/actors/ovl_En_Door/z_en_door.c +++ b/soh/src/overlays/actors/ovl_En_Door/z_en_door.c @@ -11,6 +11,7 @@ #include "objects/object_mizu_objects/object_mizu_objects.h" #include "objects/object_haka_door/object_haka_door.h" #include "soh/ResourceManagerHelpers.h" +#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" #define FLAGS ACTOR_FLAG_UPDATE_WHILE_CULLED @@ -204,6 +205,7 @@ void EnDoor_Idle(EnDoor* this, PlayState* play) { gSaveContext.inventory.dungeonKeys[gSaveContext.mapIndex]--; Flags_SetSwitch(play, this->actor.params & 0x3F); Audio_PlayActorSound2(&this->actor, NA_SE_EV_CHAIN_KEY_UNLOCK); + GameInteractor_ExecuteOnDungeonKeyUsedHooks(gSaveContext.mapIndex); } } else if (!Player_InCsMode(play)) { if (fabsf(playerPosRelToDoor.y) < 20.0f && fabsf(playerPosRelToDoor.x) < 20.0f && @@ -231,6 +233,11 @@ void EnDoor_Idle(EnDoor* this, PlayState* play) { this->actionFunc = EnDoor_AjarOpen; } } + // #region SOH [Co-op] + if (Flags_GetSwitch(play, this->actor.params & 0x3F)) { + DECR(this->lockTimer); + } + // #endregion } void EnDoor_WaitForCheck(EnDoor* this, PlayState* play) { diff --git a/soh/src/overlays/actors/ovl_En_Si/z_en_si.c b/soh/src/overlays/actors/ovl_En_Si/z_en_si.c index 338dfaf12..8f64213cb 100644 --- a/soh/src/overlays/actors/ovl_En_Si/z_en_si.c +++ b/soh/src/overlays/actors/ovl_En_Si/z_en_si.c @@ -149,6 +149,13 @@ void func_80AFB950(EnSi* this, PlayState* play) { void EnSi_Update(Actor* thisx, PlayState* play) { EnSi* this = (EnSi*)thisx; + // #region SOH [Co-op] + if (GET_GS_FLAGS((thisx->params & 0x1F00) >> 8) & (thisx->params & 0xFF)) { + Actor_Kill(&this->actor); + return; + } + // #endregion + Actor_MoveXZGravity(&this->actor); Actor_UpdateBgCheckInfo(play, &this->actor, 0.0f, 0.0f, 0.0f, 4); this->actionFunc(this, play); diff --git a/soh/src/overlays/actors/ovl_En_Sw/z_en_sw.c b/soh/src/overlays/actors/ovl_En_Sw/z_en_sw.c index 93dd9c9d3..98da453f3 100644 --- a/soh/src/overlays/actors/ovl_En_Sw/z_en_sw.c +++ b/soh/src/overlays/actors/ovl_En_Sw/z_en_sw.c @@ -916,6 +916,13 @@ void func_80B0E9BC(EnSw* this, PlayState* play) { void EnSw_Update(Actor* thisx, PlayState* play) { EnSw* this = (EnSw*)thisx; + // #region SOH [Co-op] + if (GET_GS_FLAGS((thisx->params & 0x1F00) >> 8) & (thisx->params & 0xFF)) { + Actor_Kill(&this->actor); + return; + } + // #endregion + SkelAnime_Update(&this->skelAnime); func_80B0C9F0(this, play); this->actionFunc(this, play); diff --git a/soh/src/overlays/actors/ovl_Item_B_Heart/z_item_b_heart.c b/soh/src/overlays/actors/ovl_Item_B_Heart/z_item_b_heart.c index 9d3c9c240..a47b63cf3 100644 --- a/soh/src/overlays/actors/ovl_Item_B_Heart/z_item_b_heart.c +++ b/soh/src/overlays/actors/ovl_Item_B_Heart/z_item_b_heart.c @@ -55,6 +55,13 @@ void ItemBHeart_Destroy(Actor* thisx, PlayState* play) { void ItemBHeart_Update(Actor* thisx, PlayState* play) { ItemBHeart* this = (ItemBHeart*)thisx; + // #region SOH [Co-op] + if (Flags_GetCollectible(play, 0x1F)) { + Actor_Kill(&this->actor); + return; + } + // #endregion + func_80B85264(this, play); Actor_UpdateBgCheckInfo(play, &this->actor, 0.0f, 0.0f, 0.0f, 4); if (Actor_HasParent(&this->actor, play)) { diff --git a/soh/src/overlays/actors/ovl_Obj_Bombiwa/z_obj_bombiwa.c b/soh/src/overlays/actors/ovl_Obj_Bombiwa/z_obj_bombiwa.c index 602236816..9ec4f10bf 100644 --- a/soh/src/overlays/actors/ovl_Obj_Bombiwa/z_obj_bombiwa.c +++ b/soh/src/overlays/actors/ovl_Obj_Bombiwa/z_obj_bombiwa.c @@ -125,8 +125,10 @@ void ObjBombiwa_Update(Actor* thisx, PlayState* play) { ObjBombiwa* this = (ObjBombiwa*)thisx; s32 pad; + // #region SOH [Co-op] if ((func_80033684(play, &this->actor) != NULL) || - ((this->collider.base.acFlags & AC_HIT) && (this->collider.info.acHitInfo->toucher.dmgFlags & 0x40000040))) { + ((this->collider.base.acFlags & AC_HIT) && (this->collider.info.acHitInfo->toucher.dmgFlags & 0x40000040)) || Flags_GetSwitch(play, this->actor.params & 0x3F)) { + // #endregion ObjBombiwa_Break(this, play); Flags_SetSwitch(play, this->actor.params & 0x3F); SoundSource_PlaySfxAtFixedWorldPos(play, &this->actor.world.pos, 80, NA_SE_EV_WALL_BROKEN); diff --git a/soh/src/overlays/actors/ovl_Obj_Hamishi/z_obj_hamishi.c b/soh/src/overlays/actors/ovl_Obj_Hamishi/z_obj_hamishi.c index e17cf0d80..2611f25ce 100644 --- a/soh/src/overlays/actors/ovl_Obj_Hamishi/z_obj_hamishi.c +++ b/soh/src/overlays/actors/ovl_Obj_Hamishi/z_obj_hamishi.c @@ -171,10 +171,12 @@ void ObjHamishi_Update(Actor* thisx, PlayState* play) { ObjHamishi_Shake(this); - if ((this->collider.base.acFlags & AC_HIT) && (this->collider.info.acHitInfo->toucher.dmgFlags & 0x40000040)) { + // #region SOH [Co-op] + if (((this->collider.base.acFlags & AC_HIT) && (this->collider.info.acHitInfo->toucher.dmgFlags & 0x40000040)) || Flags_GetSwitch(play, this->actor.params & 0x3F)) { this->collider.base.acFlags &= ~AC_HIT; this->hitCount++; - if (this->hitCount < 2) { + if (this->hitCount < 2 && !Flags_GetSwitch(play, this->actor.params & 0x3F)) { + // #endregion this->shakeFrames = 15; this->shakePosSize = 2.0f; this->shakeRotSize = 400.0f; From 39609bdac96678e5c6432377ae0cdc4136aa6e7b Mon Sep 17 00:00:00 2001 From: Garrett Cox Date: Mon, 16 Dec 2024 13:22:09 -0600 Subject: [PATCH 16/18] Various cleanup --- soh/soh/Enhancements/Holiday/AGreenSpoon.cpp | 1 + soh/soh/Enhancements/Holiday/Caladius.cpp | 127 +++++- soh/soh/Enhancements/Holiday/Fredomato.cpp | 376 +++++++++++++++++- soh/soh/Enhancements/Holiday/Fredomato.h | 18 + soh/soh/Enhancements/Holiday/Grimey.cpp | 30 +- soh/soh/Enhancements/Holiday/Holiday.hpp | 2 - soh/soh/Enhancements/Holiday/ItsHeckinPat.cpp | 150 ------- soh/soh/Enhancements/Holiday/NotProxySaw.cpp | 1 + soh/soh/Enhancements/Holiday/Pablo.cpp | 6 +- soh/soh/Enhancements/Holiday/ProxySaw.cpp | 17 +- soh/soh/Enhancements/Holiday/lilDavid.cpp | 1 + .../Enhancements/TimeDisplay/TimeDisplay.cpp | 14 +- .../Enhancements/TimeDisplay/TimeDisplay.h | 3 +- .../game-interactor/GameInteractor.h | 1 + .../GameInteractor_HookTable.h | 1 + .../game-interactor/GameInteractor_Hooks.cpp | 4 + .../game-interactor/GameInteractor_Hooks.h | 1 + .../Network/Anchor/Packets/SetCheckStatus.cpp | 8 +- .../Anchor/Packets/UpdateTeamState.cpp | 2 +- soh/soh/Notification/Notification.cpp | 2 +- soh/soh/SohMenuBar.cpp | 2 +- soh/src/code/z_player_lib.c | 1 + soh/src/overlays/actors/ovl_En_Hy/z_en_hy.c | 4 +- .../actors/ovl_En_Wood02/z_en_wood02.c | 5 +- .../actors/ovl_player_actor/z_player.c | 15 + 25 files changed, 584 insertions(+), 208 deletions(-) create mode 100644 soh/soh/Enhancements/Holiday/Fredomato.h delete mode 100644 soh/soh/Enhancements/Holiday/ItsHeckinPat.cpp diff --git a/soh/soh/Enhancements/Holiday/AGreenSpoon.cpp b/soh/soh/Enhancements/Holiday/AGreenSpoon.cpp index 2e745a9ee..6885aa345 100644 --- a/soh/soh/Enhancements/Holiday/AGreenSpoon.cpp +++ b/soh/soh/Enhancements/Holiday/AGreenSpoon.cpp @@ -67,6 +67,7 @@ static void DrawMenu() { if (UIWidgets::EnhancementCheckbox("Evil Gossip Stone", CVAR("EvilGossipStone"))) { OnConfigurationChanged(); } + UIWidgets::Tooltip("Don't you dare talk to them."); } static void RegisterMod() { diff --git a/soh/soh/Enhancements/Holiday/Caladius.cpp b/soh/soh/Enhancements/Holiday/Caladius.cpp index 61d8a84d9..5eb632a5d 100644 --- a/soh/soh/Enhancements/Holiday/Caladius.cpp +++ b/soh/soh/Enhancements/Holiday/Caladius.cpp @@ -5,6 +5,8 @@ #include "soh/Enhancements/game-interactor/GameInteractor.h" #include "soh/Enhancements/custom-message/CustomMessageManager.h" #include "soh/Enhancements/randomizer/randomizer.h" +#include "soh/frame_interpolation.h" +#include "soh_assets.h" extern "C" { #include "macros.h" @@ -80,9 +82,28 @@ void RandomizeBoulder(Actor* refActor) { Actor_Kill(actor); } -static void OnPresentChange() { - isExchangeDisabled = !CVarGetInteger(CVAR("OrnExch.Enabled"), 0); - COND_ID_HOOK(OnActorKill, ACTOR_EN_OE2, CVarGetInteger(CVAR("OrnExch.Enabled"), 0), [](void* actorRef) { +bool spawningPresents = false; + +struct Present { +}; + +std::unordered_map presents; + +void Present_Init(Actor* actor, PlayState* play) { + Present present; + presents[actor] = present; + + actor->gravity = -1; + Actor_MoveXZGravity(actor); + actor->shape.rot.y = Random(0, 0xFFFF); + + Actor_UpdateBgCheckInfo(play, actor, 10.0f, 10.0f, 0.0f, 0xFF); +} + +void Present_Update(Actor* actor, PlayState* play) { + Present* present = &presents[actor]; + + if (actor->xzDistToPlayer < 50.0f && actor->yDistToPlayer < 50.0f) { uint32_t giftsCollected = CVarGetInteger(CVAR("GiftsCollected"), 0); giftsCollected++; CVarSetInteger(CVAR("GiftsCollected"), giftsCollected); @@ -91,9 +112,33 @@ static void OnPresentChange() { msg += " Gifts in Inventory."; Notification::Emit({ .itemIcon = "RG_TRIFORCE_PIECE", - .message = msg + .message = msg, + .messageColor = ImVec4(1.0f, 1.0f, 1.0f, 1.0f), }); - }); + Actor_Kill(actor); + } +} + +void Present_Draw(Actor* actor, PlayState* play) { + OPEN_DISPS(play->state.gfxCtx); + + Gfx_SetupDL_25Opa(play->state.gfxCtx); + + Matrix_Scale(30.0f, 30.0f, 30.0f, MTXMODE_APPLY); + Matrix_Translate(49.20f, 0.0f, -106.60f, MTXMODE_APPLY); + gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx, (char*)__FILE__, __LINE__), G_MTX_MODELVIEW | G_MTX_LOAD); + gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 255, 255, 255, 255); + gSPDisplayList(POLY_OPA_DISP++, (Gfx*)gXmasDecor100DL); + + CLOSE_DISPS(play->state.gfxCtx); +} + +void Present_Destroy(Actor* actor, PlayState* play) { + presents.erase(actor); +} + +static void OnPresentChange() { + isExchangeDisabled = !CVarGetInteger(CVAR("OrnExch.Enabled"), 0); COND_ID_HOOK(OnOpenText, 0x204A, CVarGetInteger(CVAR("OrnExch.Enabled"), 0), [](u16 * textId, bool* loadFromMessageTable) { auto messageEntry = CustomMessage(""); bool reduceGifts = false; @@ -127,6 +172,48 @@ static void OnPresentChange() { }); } }); + + COND_HOOK(OnSceneSpawnActors, CVarGetInteger(CVAR("OrnExch.Enabled"), 0), []() { + presents.clear(); + Vec3f pos; + static CollisionPoly presentPoly; + static f32 raycastResult; + pos.y = 9999.0f; + int spawnAttempts = 0; + while (spawnAttempts < 20) { + if (GET_PLAYER(gPlayState) != nullptr) { + pos.x = GET_PLAYER(gPlayState)->actor.world.pos.x; + pos.z = GET_PLAYER(gPlayState)->actor.world.pos.z; + } else { + pos.x = 0; + pos.z = 0; + } + // X/Z anywhere from -1000.0 to +1000.0 from player + pos.x += (float)(Random(0, 20000)) - 10000.0f; + pos.z += (float)(Random(0, 20000)) - 10000.0f; + + raycastResult = BgCheck_AnyRaycastFloor1(&gPlayState->colCtx, &presentPoly, &pos); + + if (raycastResult > BGCHECK_Y_MIN) { + spawningPresents = true; + Actor* actor = Actor_Spawn(&gPlayState->actorCtx, gPlayState, ACTOR_EN_OE2, pos.x, raycastResult, pos.z, 0, 0, 0, 0, false); + spawningPresents = false; + // break; + } + + spawnAttempts++; + } + }); + + COND_ID_HOOK(ShouldActorInit, ACTOR_EN_OE2, CVarGetInteger(CVAR("OrnExch.Enabled"), 0), [](void* actorRef, bool* should) { + Actor* actor = (Actor*)actorRef; + if (spawningPresents) { + actor->init = Present_Init; + actor->update = Present_Update; + actor->draw = Present_Draw; + actor->destroy = Present_Destroy; + } + }); } static void OnBlitzChange() { @@ -194,32 +281,32 @@ static void DrawMenu() { } UIWidgets::Tooltip("Can you beat your objective before the Fever sets in?/n" "- Obtaining Ice Traps extends your timer."); - if (UIWidgets::EnhancementSliderFloat("", "##FontScale", CVAR("FontScale"), - 1.0f, 5.0f, "Font: %.1fx", 1.0f, false, false, isFeverDisabled)) { - OnFeverConfigurationChanged(); + if (CVarGetInteger(CVAR("Fever.Enabled"), 0)) { + if (UIWidgets::EnhancementSliderFloat("", "##FontScale", CVAR("FontScale"), + 1.0f, 5.0f, "Font: %.1fx", 1.0f, false, false, isFeverDisabled)) { + OnFeverConfigurationChanged(); + } + UIWidgets::PaddedEnhancementSliderInt("Starting Timer: %d minutes", "##StartTime", CVAR("StartTimer"), + 5, 30, "", 15, true, true, false, isFeverDisabled); + UIWidgets::PaddedEnhancementSliderInt("Time Extensions: %d minutes", "##ExtendTime", CVAR("ExtendTimer"), + 1, 10, "", 5, true, true, false, isFeverDisabled); } - UIWidgets::PaddedEnhancementSliderInt("Starting Timer: %d minutes", "##StartTime", CVAR("StartTimer"), - 5, 30, "", 15, true, true, false, isFeverDisabled); - UIWidgets::PaddedEnhancementSliderInt("Time Extensions: %d minutes", "##ExtendTime", CVAR("ExtendTimer"), - 1, 10, "", 5, true, true, false, isFeverDisabled); UIWidgets::PaddedSeparator(); if (UIWidgets::EnhancementCheckbox("Boulder Blitz", CVAR("Blitz.Enabled"))) { OnBlitzChange(); } + UIWidgets::Tooltip("Boulders will randomly be replaced with other boulder types."); UIWidgets::PaddedSeparator(); if (UIWidgets::EnhancementCheckbox("Ornament Exchange", CVAR("OrnExch.Enabled"))) { OnPresentChange(); - bool toggle = CVarGetInteger(CVAR("OrnExch.Enabled"), 0); - CVarSetInteger("gHoliday.ItsHeckinPat.GiftsForNPCs", toggle); - OnConfigChanged(); } - UIWidgets::Tooltip("See Malon as Young Link in Lon Lon Ranch to exchange Gifts for Ornaments!\n" - "Note: Enabling this will set \"Gifts For NPCs\" to match."); - UIWidgets::PaddedEnhancementSliderInt("Gifts Required: %d Gifts", "##GiftsReq", CVAR("OrnExch.Amount"), - 5, 30, "", 15, true, true, false, isExchangeDisabled); - + UIWidgets::Tooltip("See Malon as Young Link in Lon Lon Ranch to exchange Gifts for Ornaments!"); + if (CVarGetInteger(CVAR("OrnExch.Enabled"), 0)) { + UIWidgets::PaddedEnhancementSliderInt("Gifts Required: %d Gifts", "##GiftsReq", CVAR("OrnExch.Amount"), + 5, 30, "", 15, true, true, false, isExchangeDisabled); + } } diff --git a/soh/soh/Enhancements/Holiday/Fredomato.cpp b/soh/soh/Enhancements/Holiday/Fredomato.cpp index bb01ea991..df33ccfe8 100644 --- a/soh/soh/Enhancements/Holiday/Fredomato.cpp +++ b/soh/soh/Enhancements/Holiday/Fredomato.cpp @@ -7,9 +7,15 @@ #include "soh/Enhancements/randomizer/3drando/random.hpp" #include "soh/Enhancements/randomizer/3drando/location_access.hpp" #include "soh/Enhancements/randomizer/entrance.h" +#include "soh/Enhancements/custom-collectible/CustomCollectible.h" +#include "soh/Notification/Notification.h" +#include "soh/Enhancements/nametag.h" #include "objects/gameplay_field_keep/gameplay_field_keep.h" +#include "objects/gameplay_keep/gameplay_keep.h" #include "objects/object_md/object_md.h" +#include "objects/object_trap/object_trap.h" +#include "objects/object_toryo/object_toryo.h" #include "src/overlays/actors/ovl_Door_Ana/z_door_ana.h" extern "C" { #include "macros.h" @@ -20,6 +26,7 @@ extern PlayState* gPlayState; void DoorAna_SetupAction(DoorAna* doorAna, DoorAnaActionFunc actionFunc); void DoorAna_GrabPlayer(DoorAna* doorAna, PlayState* play); } +extern GetItemEntry vanillaQueuedItemEntry; #define AUTHOR "Fredomato" #define CVAR(v) "gHoliday." AUTHOR "." v @@ -36,7 +43,7 @@ const s16 entrances[] = { 0x00B7, 0x0201, 0x003B, 0x0463, 0x0588, 0x057C, 0x0578, 0x0340, 0x04C2, 0x03E8, 0x04BE, 0x0482, 0x0315, 0x045B, 0x0371, 0x0394, 0x0272, 0x0211, 0x0053, 0x0472, 0x0453, 0x0351, 0x0384, 0x044B, 0x03EC, 0x04FF, 0x0700, 0x0800, 0x0701, 0x0801, 0x0702, 0x0802, 0x0703, 0x0803, 0x0704, 0x0804, 0x0705, 0x0805, 0x0706, 0x0806, 0x0707, 0x0807, 0x0708, 0x0808, 0x0709, 0x0809, 0x070A, 0x080A, - 0x070B, 0x080B, 0x070C, 0x080C, 0x070D, 0x080D, 0x070E, 0x080E, 0x070F, 0x080F, 0x0710, 0x0711, 0x0811, 0x0712, 0x0812, + 0x070B, 0x080B, 0x080C, 0x070D, 0x080D, 0x070E, 0x080E, 0x070F, 0x080F, 0x0710, 0x0711, 0x0811, 0x0712, 0x0812, 0x0713, 0x0813, 0x0714, 0x0814, 0x0715, 0x0815, 0x0716, 0x0816, 0x0717, 0x0817, 0x0718, 0x0818, 0x0719, 0x0819, 0x081A, 0x071B, 0x081B, 0x071C, 0x081C, 0x071D, 0x081D, 0x071E, 0x081E, 0x071F, 0x081F, 0x0720, 0x0820, 0x004B, 0x035D, 0x031C, 0x0361, 0x002D, 0x050B, 0x044F, 0x0359, 0x05E0, 0x020D, 0x011E, 0x0286, 0x04E2, 0x04D6, 0x01DD, 0x04DA, 0x00FC, 0x01A9, 0x0185, 0x04DE, @@ -51,6 +58,15 @@ static bool midoGrottoInit = false; static SkelAnime midoSkelAnime; static Vec3s midoJointTable[17]; static Vec3s midoMorphTable[17]; +int FredsQuestWoodCollected = 0; +int FredsQuestWoodOnHand = 0; +static int lastDisplayedCount = -1; +static bool FredsQuestComplete = false; +static SkelAnime collectionPointSkelAnime; +static Vec3s collectionPointJointTable[17]; +static Vec3s collectionPointMorphTable[17]; +static std::string collectionPointNametag; + static void RandomGrotto_WaitOpen(DoorAna* doorAna, PlayState* play) { if (!midoGrottoInit) { @@ -61,9 +77,11 @@ static void RandomGrotto_WaitOpen(DoorAna* doorAna, PlayState* play) { Actor* actor = &doorAna->actor; Player* player = GET_PLAYER(play); - Math_SmoothStepToF(&actor->world.pos.x, player->actor.world.pos.x, 0.1f, 10.0f, 0.0f); - Math_SmoothStepToF(&actor->world.pos.z, player->actor.world.pos.z, 0.1f, 10.0f, 0.0f); - Math_SmoothStepToF(&actor->world.pos.y, player->actor.world.pos.y, 0.1f, 10.0f, 0.0f); + if (!Player_InCsMode(play)) { + Math_SmoothStepToF(&actor->world.pos.x, player->actor.world.pos.x, 0.1f, 10.0f, 0.0f); + Math_SmoothStepToF(&actor->world.pos.z, player->actor.world.pos.z, 0.1f, 10.0f, 0.0f); + Math_SmoothStepToF(&actor->world.pos.y, player->actor.world.pos.y, 0.1f, 10.0f, 0.0f); + } Math_ApproachS(&doorAna->actor.shape.rot.y, doorAna->actor.yawTowardsPlayer, 5, 0xBB8); @@ -103,11 +121,10 @@ static void RandomGrotto_Draw(Actor* actor, PlayState* play) { CLOSE_DISPS(play->state.gfxCtx); } -static void SpawnRandomGrotto() { +static Vec3f FindValidPos(f32 distance) { Vec3f pos; pos.y = 9999.0f; - int spawnAttempts = 0; - while (spawnAttempts < 50) { + while (true) { if (GET_PLAYER(gPlayState) != nullptr) { pos.x = GET_PLAYER(gPlayState)->actor.world.pos.x; pos.z = GET_PLAYER(gPlayState)->actor.world.pos.z; @@ -115,34 +132,355 @@ static void SpawnRandomGrotto() { pos.x = 0; pos.z = 0; } - // X/Z anywhere from -1000.0 to +1000.0 from player - pos.x += (float)(Random(0, 2000)) - 1000.0f; - pos.z += (float)(Random(0, 2000)) - 1000.0f; + pos.x += (float)(Random(0, distance)) - distance / 2; + pos.z += (float)(Random(0, distance)) - distance / 2; raycastResult = BgCheck_AnyRaycastFloor1(&gPlayState->colCtx, &snowballPoly, &pos); if (raycastResult > BGCHECK_Y_MIN) { - Actor* grotto = Actor_Spawn(&gPlayState->actorCtx, gPlayState, ACTOR_DOOR_ANA, pos.x, raycastResult, pos.z, 0, 0, 0, 0, false); - midoGrottoInit = false; - DoorAna_SetupAction((DoorAna*)grotto, RandomGrotto_WaitOpen); - grotto->draw = RandomGrotto_Draw; - break; + pos.y = raycastResult; + return pos; } - - spawnAttempts++; } } +// TODO: If in hyrule field and treeChopper is on, teleport somewhere else in hyrule field +static void SpawnRandomGrotto() { + if ( + gPlayState->sceneNum == SCENE_TEMPLE_OF_TIME_EXTERIOR_DAY || + gPlayState->sceneNum == SCENE_TEMPLE_OF_TIME_EXTERIOR_NIGHT || + gPlayState->sceneNum == SCENE_TEMPLE_OF_TIME_EXTERIOR_RUINS + ) { + return; + } + + Vec3f pos = FindValidPos(2000.0f); + Actor* grotto = Actor_Spawn(&gPlayState->actorCtx, gPlayState, ACTOR_DOOR_ANA, pos.x, pos.y, pos.z, 0, 0, 0, 0, false); + midoGrottoInit = false; + DoorAna_SetupAction((DoorAna*)grotto, RandomGrotto_WaitOpen); + grotto->draw = RandomGrotto_Draw; +} + +void SpawnStick(Vec3f pos) { + CustomCollectible::Spawn(pos.x, pos.y + 150.0f, pos.z, 0, CustomCollectible::KILL_ON_TOUCH | CustomCollectible::TOSS_ON_SPAWN, 0, [](Actor* actor, PlayState* play) { + FredsQuestWoodOnHand++; + Audio_PlaySoundGeneral(NA_SE_SY_METRONOME, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale, &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb); + }, [](Actor* actor, PlayState* play) { + Matrix_Scale(40.0f, 40.0f, 40.0f, MTXMODE_APPLY); + for (int i = 4; i < 7; i++) { + Matrix_RotateZYX(800 * i, 0, 800 * i, MTXMODE_APPLY); + GetItem_Draw(play, GID_STICK); + } + }); +} + +Actor* specialTree = nullptr; + +void ChooseSpecialTree() { + Actor* actor = gPlayState->actorCtx.actorLists[ACTORCAT_PROP].head; + std::vector trees; + + specialTree = nullptr; + + while (actor != NULL) { + if (ACTOR_EN_WOOD02 == actor->id && actor->params < 10) { + trees.push_back(actor); + } + actor = actor->next; + } + + if (trees.size() <= 1) { + return; + } + + specialTree = trees[Random(0, trees.size() - 1)]; +} + +extern "C" bool HandleTreeBonk(Actor* actor) { + if (!CVarGetInteger(CVAR("FredsQuest.Enabled"), 0)) { + return false; + } + + int damage = 2; + // random chance of doing a crit + if (Random(0, 100) < 30) { + damage = 4; + } + + if (actor->colChkInfo.health - damage <= 0) { + if (specialTree == actor) { + ChooseSpecialTree(); + + for (int i = 0; i < CVarGetInteger(CVAR("FredsQuest.SpecialBreakDropRate"), 10); i++) { + SpawnStick(actor->world.pos); + } + } else { + for (int i = 0; i < CVarGetInteger(CVAR("FredsQuest.TreeBreakDropRate"), 3); i++) { + SpawnStick(actor->world.pos); + } + } + + // Move tree (instead of killing and spawning another) + actor->colChkInfo.health = 8; + Vec3f pos = FindValidPos(5000.0f); + actor->world.pos.x = pos.x; + actor->world.pos.y = pos.y; + actor->world.pos.z = pos.z; + } else { + actor->colChkInfo.health -= damage; + for (int i = 0; i < CVarGetInteger(CVAR("FredsQuest.TreeBonkDropRate"), 1); i++) { + SpawnStick(actor->world.pos); + } + } + + return true; +} + +void DrawCrazyTaxiArrow(Actor* actor, PlayState* play) { + if (specialTree == nullptr || !CVarGetInteger(CVAR("FredsQuest.CrazyTaxiArrow"), 0)) { + return; + } + + s16 yaw = Actor_WorldYawTowardActor(actor, specialTree); + Math_ApproachS(&actor->shape.rot.y, yaw, 5, 10000); + + OPEN_DISPS(gPlayState->state.gfxCtx); + + Gfx_SetupDL_4Xlu(gPlayState->state.gfxCtx); + + Matrix_Scale(50.0f, 50.0f, 50.0f, MTXMODE_APPLY); + Matrix_Translate(0.0f, 70.0f, 0.0f, MTXMODE_APPLY); + Matrix_RotateY(5.86f, MTXMODE_APPLY); + + gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx, (char*)__FILE__, __LINE__), G_MTX_MODELVIEW | G_MTX_LOAD); + gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 0, 255, 0, 255); + gDPSetEnvColor(POLY_XLU_DISP++, 0, 255, 0, 255); + gSPDisplayList(POLY_XLU_DISP++, (Gfx*)gDebugArrowDL); + + CLOSE_DISPS(gPlayState->state.gfxCtx); +} + +void SpawnCrazyTaxiArrow() { + EnItem00* arrow = CustomCollectible::Spawn(0, 0, 0, 0, CustomCollectible::KEEP_ON_PLAYER, 0, NULL, NULL); + arrow->actor.draw = DrawCrazyTaxiArrow; +} + +void CollectionPoint_Update(Actor* actor, PlayState* play) { + EnItem00* enItem00 = (EnItem00*)actor; + + SkelAnime_Update(&collectionPointSkelAnime); + + if (FredsQuestComplete) { + return; + } + + if (lastDisplayedCount != FredsQuestWoodCollected) { + lastDisplayedCount = FredsQuestWoodCollected; + collectionPointNametag = "Bring me wood!"; + if (FredsQuestWoodCollected > 0) { + collectionPointNametag += std::string(" (") + std::to_string(FredsQuestWoodCollected) + "/" + std::to_string(CVarGetInteger(CVAR("FredsQuest.WoodNeeded"), 300)) + ")"; + } + NameTag_RemoveAllForActor(actor); + NameTag_RegisterForActorWithOptions(actor, collectionPointNametag.c_str(), { .yOffset = 100 }); + } + + if ((actor->xzDistToPlayer <= 200.0f) && (fabsf(actor->yDistToPlayer) <= fabsf(50.0f))) { + if (FredsQuestWoodOnHand) { + FredsQuestWoodCollected++; + FredsQuestWoodOnHand--; + Audio_PlaySoundGeneral(NA_SE_SY_METRONOME, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale, &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb); + + if (FredsQuestWoodCollected >= CVarGetInteger(CVAR("FredsQuest.WoodNeeded"), 300)) { + FredsQuestComplete = true; + collectionPointNametag = "You're a hero!"; + NameTag_RemoveAllForActor(actor); + NameTag_RegisterForActorWithOptions(actor, collectionPointNametag.c_str(), { .yOffset = 100 }); + + if (IS_RANDO && Rando::Context::GetInstance()->GetOption(RSK_TRIFORCE_HUNT)) { + vanillaQueuedItemEntry = Rando::StaticData::RetrieveItem(RG_TRIFORCE_PIECE).GetGIEntry_Copy(); + } else { + vanillaQueuedItemEntry = Rando::StaticData::RetrieveItem(RG_HEART_CONTAINER).GetGIEntry_Copy(); + } + + } + } + } +} + +void CollectionPoint_Draw(Actor* actor, PlayState* play) { + OPEN_DISPS(play->state.gfxCtx); + + Gfx_SetupDL_25Opa(play->state.gfxCtx); + SkelAnime_DrawSkeletonOpa(play, &collectionPointSkelAnime, NULL, NULL, actor); + + // For every 2% of the goal, draw a stick at a different angle, building a tree + Matrix_Scale(40.0f, 40.0f, 40.0f, MTXMODE_APPLY); + Matrix_Translate(0, 0, -300.0f, MTXMODE_APPLY); + for (int i = 0; i < FredsQuestWoodCollected / (CVarGetInteger(CVAR("FredsQuest.WoodNeeded"), 300) / 50); i++) { + float angle = 10 * i; + float radius = (50 - i) * 0.5f; // Radius decreases as it goes up + float height = 10.0f; // Incremental height + + Matrix_Translate(radius * cosf(angle), height, radius * sinf(angle), MTXMODE_APPLY); + Matrix_RotateY(angle, MTXMODE_APPLY); + GetItem_Draw(play, GID_STICK); + } + + CLOSE_DISPS(play->state.gfxCtx); +} + +void SpawnCollectionPoint() { + EnItem00* collectionPoint = CustomCollectible::Spawn(859.0f, 347.0f, 5185.0f, 0xB000, 0, 0, NULL, NULL); + collectionPoint->actor.update = CollectionPoint_Update; + collectionPoint->actor.draw = CollectionPoint_Draw; + collectionPoint->actor.flags |= ACTOR_FLAG_DRAW_WHILE_CULLED; + SkelAnime_InitFlex(gPlayState, &collectionPointSkelAnime, (FlexSkeletonHeader*)&object_toryo_Skel_007150, + (AnimationHeader*)&object_toryo_Anim_000E50, collectionPointJointTable, collectionPointMorphTable, 17); +} + +void RandomTrap_Update(Actor* actor, PlayState* play) { + EnItem00* enItem00 = (EnItem00*)actor; + + enItem00->unk_158--; + if (enItem00->unk_158 == 0) { + Actor_Kill(actor); + return; + } + + Math_ApproachS(&actor->world.rot.y, actor->yawTowardsPlayer, 5, 0xBB8); + actor->speedXZ = 3.0f; + + // TODO: CVar for speed + // Multiply speed by distance + actor->speedXZ += actor->xzDistToPlayer * 0.01f; + if (actor->xzDistToPlayer > 1000.0f && actor->velocity.y < -3.0f) { + actor->velocity.y += ABS(actor->yDistToPlayer) * 0.01f; + } + + actor->shape.rot.y += 0x1000; + + if ((actor->xzDistToPlayer <= 50.0f) && (fabsf(actor->yDistToPlayer) <= fabsf(20.0f))) { + // TODO: Random crowd control effect + GameInteractor::RawAction::KnockbackPlayer(5.0f); + Actor_Kill(actor); + } + + if (actor->gravity != 0.0f) { + Actor_MoveXZGravity(actor); + Actor_UpdateBgCheckInfo(play, actor, 20.0f, 15.0f, 15.0f, 0x1D); + } + + if (actor->bgCheckFlags & 0x0003) { + actor->speedXZ = 0.0f; + } +} + +void RandomTrap_Draw(Actor* actor, PlayState* play) { + OPEN_DISPS(play->state.gfxCtx); + + Matrix_Scale(4.0f, 4.0f, 4.0f, MTXMODE_APPLY); + Matrix_Translate(0, -200.0f, 0, MTXMODE_APPLY); + func_8002EBCC(actor, play, 1); + Gfx_DrawDListOpa(play, (Gfx*)gSlidingBladeTrapDL); + + CLOSE_DISPS(play->state.gfxCtx); +} + +void SpawnRandomTrap() { + Vec3f pos = FindValidPos(2000.0f); + EnItem00* randomTrap = CustomCollectible::Spawn(pos.x, pos.y, pos.z, 0, CustomCollectible::TOSS_ON_SPAWN, 0, NULL, NULL); + SoundSource_PlaySfxAtFixedWorldPos(gPlayState, &randomTrap->actor.world.pos, 20, NA_SE_EV_LIGHTNING); + randomTrap->actor.update = RandomTrap_Update; + randomTrap->actor.draw = RandomTrap_Draw; + randomTrap->unk_158 = 20 * CVarGetInteger(CVAR("RandomTraps.Lifetime"), 30); +} + +void OnSceneInit() { + // Reset wood collected + FredsQuestWoodCollected = 0; + FredsQuestWoodOnHand = 0; + lastDisplayedCount = -1; + FredsQuestComplete = false; + + if (gPlayState->sceneNum != SCENE_HYRULE_FIELD) { + return; + } + + ChooseSpecialTree(); + SpawnCrazyTaxiArrow(); + SpawnCollectionPoint(); +} + static void ConfigurationChanged() { - COND_HOOK(OnSceneSpawnActors, CVarGetInteger(CVAR("KrampusHole"), 0), SpawnRandomGrotto); + COND_HOOK(OnSceneSpawnActors, CVarGetInteger(CVAR("FredsQuest.Enabled"), 0), OnSceneInit); + + COND_HOOK(OnPlayerUpdate, CVarGetInteger(CVAR("RandomTraps.Enabled"), 0), []() { + if (rand() % CVarGetInteger(CVAR("RandomTraps.SpawnChance"), 400) == 0) { + SpawnRandomTrap(); + } + }); + + COND_HOOK(OnPlayerUpdate, CVarGetInteger(CVAR("FredsQuest.Enabled"), 0), []() { + if (CVarGetInteger(CVAR("FredsQuest.EncumberedThreshold"), 60) == 0 || FredsQuestWoodOnHand <= CVarGetInteger(CVAR("FredsQuest.EncumberedThreshold"), 60)) { + GameInteractor::State::RunSpeedModifier = 0; + } else { + GameInteractor::State::RunSpeedModifier = -2; + } + }); + + COND_VB_SHOULD(VB_PLAYER_ROLL, CVarGetInteger(CVAR("FredsQuest.Enabled"), 0), { + if (FredsQuestWoodOnHand > CVarGetInteger(CVAR("FredsQuest.EncumberedThreshold"), 0)) { + *should = false; + } + }); } static void DrawMenu() { ImGui::SeparatorText(AUTHOR); - if (UIWidgets::EnhancementCheckbox("The Krampus Hole", CVAR("KrampusHole"))) { + // UIWidgets::EnhancementSliderFloat("Xfloat", "Xfloat", CVAR("tmpxf"), 0.0f, 10.0f, "%.2f", 1.0f, false); + // UIWidgets::EnhancementSliderFloat("Yfloat", "Yfloat", CVAR("tmpyf"), 0.0f, 10.0f, "%.2f", 1.0f, false); + // UIWidgets::EnhancementSliderFloat("Zfloat", "Zfloat", CVAR("tmpzf"), 0.0f, 10.0f, "%.2f", 1.0f, false); + // UIWidgets::EnhancementSliderInt("Xs", "Xs", CVAR("tmpxs"), 0, UINT16_MAX, "%d", 1, false); + // UIWidgets::EnhancementSliderInt("Ys", "Ys", CVAR("tmpys"), 0, UINT16_MAX, "%d", 1, false); + // UIWidgets::EnhancementSliderInt("Zs", "Zs", CVAR("tmpzs"), 0, UINT16_MAX, "%d", 1, false); + if (UIWidgets::EnhancementCheckbox("Fred's Quest", CVAR("FredsQuest.Enabled"))) { ConfigurationChanged(); } + UIWidgets::Tooltip("Collect wood and bring it to the collection point in Hyrule Field for a small reward."); + if (CVarGetInteger(CVAR("FredsQuest.Enabled"), 0)) { + if (UIWidgets::EnhancementCheckbox("Crazy Taxi Arrow", CVAR("FredsQuest.CrazyTaxiArrow"))) { + ConfigurationChanged(); + } + if (UIWidgets::EnhancementSliderInt("Wood Needed", "##FredsQuest.WoodNeeded", CVAR("FredsQuest.WoodNeeded"), 0, 1000, "%d", 300, false)) { + ConfigurationChanged(); + } + if (UIWidgets::EnhancementSliderInt("Tree Bonk Drop Rate", "##FredsQuest.TreeBonkDropRate", CVAR("FredsQuest.TreeBonkDropRate"), 0, 10, "%d", 1, false)) { + ConfigurationChanged(); + } + if (UIWidgets::EnhancementSliderInt("Tree Break Drop Rate", "##FredsQuest.TreeBreakDropRate", CVAR("FredsQuest.TreeBreakDropRate"), 0, 50, "%d", 3, false)) { + ConfigurationChanged(); + } + if (UIWidgets::EnhancementSliderInt("Special Break Drop Rate", "##FredsQuest.SpecialBreakDropRate", CVAR("FredsQuest.SpecialBreakDropRate"), 0, 50, "%d", 10, false)) { + ConfigurationChanged(); + } + if (UIWidgets::EnhancementSliderInt("Encumbered Threshold", "##FredsQuest.EncumberedThreshold", CVAR("FredsQuest.EncumberedThreshold"), 0, 200, "%d", 60, false)) { + ConfigurationChanged(); + } + UIWidgets::Tooltip("If you have more than this many sticks, you will be encumbered and run slower. 0 for disabled"); + } + if (UIWidgets::EnhancementCheckbox("Random Traps", CVAR("RandomTraps.Enabled"))) { + ConfigurationChanged(); + } + UIWidgets::Tooltip("Random traps will spawn around you at a configurable rate. (Currently only knockback)"); + if (CVarGetInteger(CVAR("RandomTraps.Enabled"), 0)) { + if (UIWidgets::EnhancementSliderInt("Trap Lifetime (Seconds)", "##RandomTraps.Lifetime", CVAR("RandomTraps.Lifetime"), 0, 60, "%d", 30, false)) { + ConfigurationChanged(); + } + if (UIWidgets::EnhancementSliderInt("Spawn Chance", "##RandomTraps.SpawnChance", CVAR("RandomTraps.SpawnChance"), 40, 2000, "%d", 1000, false)) { + ConfigurationChanged(); + } + } } static void RegisterMod() { diff --git a/soh/soh/Enhancements/Holiday/Fredomato.h b/soh/soh/Enhancements/Holiday/Fredomato.h new file mode 100644 index 000000000..3479b3f1e --- /dev/null +++ b/soh/soh/Enhancements/Holiday/Fredomato.h @@ -0,0 +1,18 @@ +#ifndef FRED_H +#define FRED_H + +#ifdef __cplusplus +extern int FredsQuestWoodCollected; +extern int FredsQuestWoodOnHand; + +extern "C" { +#include "z64actor.h" +#endif + +bool HandleTreeBonk(Actor* actor); + +#ifdef __cplusplus +} +#endif + +#endif \ No newline at end of file diff --git a/soh/soh/Enhancements/Holiday/Grimey.cpp b/soh/soh/Enhancements/Holiday/Grimey.cpp index 3bc5733b9..094a355c2 100644 --- a/soh/soh/Enhancements/Holiday/Grimey.cpp +++ b/soh/soh/Enhancements/Holiday/Grimey.cpp @@ -102,13 +102,33 @@ void Penguin_Destroy(Actor* actor, PlayState* play) { static void OnConfigurationChanged() { COND_HOOK(OnPlayerUpdate, CVarGetInteger(CVAR("Hailstorm"), 0), []() { - // Every frame has a 1/300 chance of spawning hail - if (rand() % 300 == 0) { + // Every frame has a 1/500 chance of spawning close hail + if (rand() % 500 == 0) { int spawned = 0; while (spawned < 1) { Vec3f pos = GET_PLAYER(gPlayState)->actor.world.pos; - pos.x += (float)Random(0, 100) - 50.0f; - pos.z += (float)Random(0, 100) - 50.0f; + pos.x += (float)Random(0, 50) - 25.0f; + pos.z += (float)Random(0, 50) - 25.0f; + pos.y += 200.0f; + + Actor* actor = Actor_Spawn(&gPlayState->actorCtx, gPlayState, ACTOR_EN_NUTSBALL, pos.x, pos.y, pos.z, 0, 0, 0, 0, false); + EnNutsball* nut = (EnNutsball*)actor; + nut->actor.draw = EnNutsball_Draw; + nut->actor.shape.rot.y = 0; + nut->timer = 0; + nut->actionFunc = func_80ABBBA8; + nut->actor.speedXZ = 0.0f; + nut->actor.gravity = -2.0f; + spawned++; + } + } + // Every frame has a 1/50 chance of spawning far hail + if (rand() % 50 == 0) { + int spawned = 0; + while (spawned < 1) { + Vec3f pos = GET_PLAYER(gPlayState)->actor.world.pos; + pos.x += (float)Random(0, 500) - 250.0f; + pos.z += (float)Random(0, 500) - 250.0f; pos.y += 200.0f; Actor* actor = Actor_Spawn(&gPlayState->actorCtx, gPlayState, ACTOR_EN_NUTSBALL, pos.x, pos.y, pos.z, 0, 0, 0, 0, false); @@ -191,9 +211,11 @@ static void DrawMenu() { if (UIWidgets::EnhancementCheckbox("Penguins", CVAR("Penguins"))) { OnConfigurationChanged(); } + UIWidgets::Tooltip("Penguins will spawn in huddles throughout hyrule"); if (UIWidgets::EnhancementCheckbox("Hailstorm", CVAR("Hailstorm"))) { OnConfigurationChanged(); } + UIWidgets::Tooltip("Ever persistent hailstorm throughout hyrule"); } static void RegisterMod() { diff --git a/soh/soh/Enhancements/Holiday/Holiday.hpp b/soh/soh/Enhancements/Holiday/Holiday.hpp index e16bd005a..9a6717060 100644 --- a/soh/soh/Enhancements/Holiday/Holiday.hpp +++ b/soh/soh/Enhancements/Holiday/Holiday.hpp @@ -8,8 +8,6 @@ #include "soh/Enhancements/game-interactor/GameInteractor.h" #include "soh/Enhancements/cosmetics/CosmeticsEditor.h" -void OnConfigChanged(); - inline std::vector> holidayDrawFuncs = {}; inline std::vector> holidayRegisterFuncs = {}; diff --git a/soh/soh/Enhancements/Holiday/ItsHeckinPat.cpp b/soh/soh/Enhancements/Holiday/ItsHeckinPat.cpp deleted file mode 100644 index b2c8cc8ee..000000000 --- a/soh/soh/Enhancements/Holiday/ItsHeckinPat.cpp +++ /dev/null @@ -1,150 +0,0 @@ -#include "Holiday.hpp" -#include "soh_assets.h" -#include "soh/Enhancements/randomizer/3drando/random.hpp" -#include "soh/frame_interpolation.h" -#include "soh/Notification/Notification.h" -#include "objects/gameplay_field_keep/gameplay_field_keep.h" -#include "soh/Enhancements/custom-message/CustomMessageManager.h" -#include "soh/util.h" -#include "soh/Enhancements/randomizer/randomizer.h" - -extern "C" { -#include "macros.h" -#include "functions.h" -#include "variables.h" -extern PlayState* gPlayState; -} -extern GetItemEntry vanillaQueuedItemEntry; - -#define AUTHOR "ItsHeckinPat" -#define CVAR(v) "gHoliday." AUTHOR "." v - -bool spawningPresents = false; - -int collectedPresent = 0; - -struct Present { -}; - -std::unordered_map presents; - -void Present_Init(Actor* actor, PlayState* play) { - Present present; - presents[actor] = present; - - actor->gravity = -1; - Actor_MoveXZGravity(actor); - actor->shape.rot.y = Random(0, 0xFFFF); - - Actor_UpdateBgCheckInfo(play, actor, 10.0f, 10.0f, 0.0f, 0xFF); -} - -void Present_Update(Actor* actor, PlayState* play) { - Present* present = &presents[actor]; - - if (actor->xzDistToPlayer < 50.0f && actor->yDistToPlayer < 50.0f) { - collectedPresent++; - Notification::Emit({ - .itemIcon = "RG_TRIFORCE_PIECE", - .message = "You collected a present!", - .messageColor = ImVec4(1.0f, 1.0f, 1.0f, 1.0f), - }); - Actor_Kill(actor); - } -} - -void Present_Draw(Actor* actor, PlayState* play) { - OPEN_DISPS(play->state.gfxCtx); - - Gfx_SetupDL_25Opa(play->state.gfxCtx); - - Matrix_Scale(30.0f, 30.0f, 30.0f, MTXMODE_APPLY); - Matrix_Translate(49.20f, 0.0f, -106.60f, MTXMODE_APPLY); - gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx, (char*)__FILE__, __LINE__), G_MTX_MODELVIEW | G_MTX_LOAD); - gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 255, 255, 255, 255); - gSPDisplayList(POLY_OPA_DISP++, (Gfx*)gXmasDecor100DL); - - CLOSE_DISPS(play->state.gfxCtx); -} - -void Present_Destroy(Actor* actor, PlayState* play) { - presents.erase(actor); -} - -static CollisionPoly presentPoly; -static f32 raycastResult; - -void OnConfigChanged() { - COND_HOOK(OnSceneSpawnActors, CVarGetInteger(CVAR("GiftsForNPCs"), 0), []() { - presents.clear(); - Vec3f pos; - pos.y = 9999.0f; - int spawnAttempts = 0; - while (spawnAttempts < 50) { - if (GET_PLAYER(gPlayState) != nullptr) { - pos.x = GET_PLAYER(gPlayState)->actor.world.pos.x; - pos.z = GET_PLAYER(gPlayState)->actor.world.pos.z; - } else { - pos.x = 0; - pos.z = 0; - } - // X/Z anywhere from -1000.0 to +1000.0 from player - pos.x += (float)(Random(0, 2000)) - 1000.0f; - pos.z += (float)(Random(0, 2000)) - 1000.0f; - - raycastResult = BgCheck_AnyRaycastFloor1(&gPlayState->colCtx, &presentPoly, &pos); - - if (raycastResult > BGCHECK_Y_MIN) { - spawningPresents = true; - Actor* actor = Actor_Spawn(&gPlayState->actorCtx, gPlayState, ACTOR_EN_OE2, pos.x, raycastResult, pos.z, 0, 0, 0, 0, false); - spawningPresents = false; - // break; - } - - spawnAttempts++; - } - }); - - COND_ID_HOOK(ShouldActorInit, ACTOR_EN_OE2, CVarGetInteger(CVAR("GiftsForNPCs"), 0), [](void* actorRef, bool* should) { - Actor* actor = (Actor*)actorRef; - if (spawningPresents) { - actor->init = Present_Init; - actor->update = Present_Update; - actor->draw = Present_Draw; - actor->destroy = Present_Destroy; - } - }); - - COND_ID_HOOK(OnOpenText, 0x1019, CVarGetInteger(CVAR("GiftsForNPCs"), 0), [](u16 * textId, bool* loadFromMessageTable) { - if (collectedPresent <= 0) { - return; - } - - auto messageEntry = CustomMessage("A present??? FOR ME???"); - messageEntry.Format(); - messageEntry.LoadIntoFont(); - *loadFromMessageTable = false; - - vanillaQueuedItemEntry = Rando::StaticData::RetrieveItem(RG_PIECE_OF_HEART).GetGIEntry_Copy(); - - collectedPresent--; - }); -} - -static void DrawMenu() { - ImGui::SeparatorText(AUTHOR); - if (UIWidgets::EnhancementCheckbox("Gifts for NPCs", CVAR("GiftsForNPCs"))) { - OnConfigChanged(); - } -} - -static void RegisterMod() { - // #region Leave this alone unless you know what you are doing - OnConfigChanged(); - // #endregion - - // TODO: Anything you want to run once on startup -} - -// TODO: Uncomment this line to enable the mod -static Holiday holiday(DrawMenu, RegisterMod); diff --git a/soh/soh/Enhancements/Holiday/NotProxySaw.cpp b/soh/soh/Enhancements/Holiday/NotProxySaw.cpp index b6cf85091..fe0995467 100644 --- a/soh/soh/Enhancements/Holiday/NotProxySaw.cpp +++ b/soh/soh/Enhancements/Holiday/NotProxySaw.cpp @@ -135,6 +135,7 @@ static void DrawMenu() { if (UIWidgets::EnhancementCheckbox("Ganon Dating Sim", CVAR("GanonDatingSim"))) { ConfigurationChanged(); } + UIWidgets::Tooltip("Prior to fighting him at the top of his Castle, you make an attempt to convince Ganon to join you instead."); } static void RegisterMod() { diff --git a/soh/soh/Enhancements/Holiday/Pablo.cpp b/soh/soh/Enhancements/Holiday/Pablo.cpp index 08173df86..0299964d7 100644 --- a/soh/soh/Enhancements/Holiday/Pablo.cpp +++ b/soh/soh/Enhancements/Holiday/Pablo.cpp @@ -181,8 +181,10 @@ void ShinyDrawImGui() { UIWidgets::PaddedEnhancementCheckbox("Enable Shiny Enemies", CVAR("Shiny.Enabled"), true, false); UIWidgets::Tooltip("Allows enemies to be shiny.\nShiny enemies are 25% bigger and have 4 times the health but drop the equivalent of a gold rupee upon death"); - UIWidgets::PaddedEnhancementSliderInt("Shiny Chance: %d", "##ShinyChance", CVAR("Shiny.Chance"), 1, 8192, "", 8192, true, true, false, false, ""); - UIWidgets::Tooltip("The chance for an enemy to be shiny is 1 / Shiny Chance"); + if (CVarGetInteger(CVAR("Shiny.Enabled"), 0)) { + UIWidgets::PaddedEnhancementSliderInt("Shiny Chance: %d", "##ShinyChance", CVAR("Shiny.Chance"), 1, 8192, "", 8192, true, true, false, false, ""); + UIWidgets::Tooltip("The chance for an enemy to be shiny is 1 / Shiny Chance"); + } } #pragma endregion diff --git a/soh/soh/Enhancements/Holiday/ProxySaw.cpp b/soh/soh/Enhancements/Holiday/ProxySaw.cpp index 988ae28a9..a4c9fe122 100644 --- a/soh/soh/Enhancements/Holiday/ProxySaw.cpp +++ b/soh/soh/Enhancements/Holiday/ProxySaw.cpp @@ -125,7 +125,7 @@ const s16 entrances[] = { 0x00B7, 0x0201, 0x003B, 0x0463, 0x0588, 0x057C, 0x0578, 0x0340, 0x04C2, 0x03E8, 0x04BE, 0x0482, 0x0315, 0x045B, 0x0371, 0x0394, 0x0272, 0x0211, 0x0053, 0x0472, 0x0453, 0x0351, 0x0384, 0x044B, 0x03EC, 0x04FF, 0x0700, 0x0800, 0x0701, 0x0801, 0x0702, 0x0802, 0x0703, 0x0803, 0x0704, 0x0804, 0x0705, 0x0805, 0x0706, 0x0806, 0x0707, 0x0807, 0x0708, 0x0808, 0x0709, 0x0809, 0x070A, 0x080A, - 0x070B, 0x080B, 0x070C, 0x080C, 0x070D, 0x080D, 0x070E, 0x080E, 0x070F, 0x080F, 0x0710, 0x0711, 0x0811, 0x0712, 0x0812, + 0x070B, 0x080B, 0x080C, 0x070D, 0x080D, 0x070E, 0x080E, 0x070F, 0x080F, 0x0710, 0x0711, 0x0811, 0x0712, 0x0812, 0x0713, 0x0813, 0x0714, 0x0814, 0x0715, 0x0815, 0x0716, 0x0816, 0x0717, 0x0817, 0x0718, 0x0818, 0x0719, 0x0819, 0x081A, 0x071B, 0x081B, 0x071C, 0x081C, 0x071D, 0x081D, 0x071E, 0x081E, 0x071F, 0x081F, 0x0720, 0x0820, 0x004B, 0x035D, 0x031C, 0x0361, 0x002D, 0x050B, 0x044F, 0x0359, 0x05E0, 0x020D, 0x011E, 0x0286, 0x04E2, 0x04D6, 0x01DD, 0x04DA, 0x00FC, 0x01A9, 0x0185, 0x04DE, @@ -158,6 +158,14 @@ static void RandomGrotto_WaitOpen(DoorAna* doorAna, PlayState* play) { } static void SpawnRandomGrotto() { + if ( + gPlayState->sceneNum == SCENE_TEMPLE_OF_TIME_EXTERIOR_DAY || + gPlayState->sceneNum == SCENE_TEMPLE_OF_TIME_EXTERIOR_NIGHT || + gPlayState->sceneNum == SCENE_TEMPLE_OF_TIME_EXTERIOR_RUINS + ) { + return; + } + Vec3f pos; pos.y = 9999.0f; int spawnAttempts = 0; @@ -170,8 +178,8 @@ static void SpawnRandomGrotto() { pos.z = 0; } // X/Z anywhere from -1000.0 to +1000.0 from player - pos.x += (float)(Random(0, 2000)) - 1000.0f; - pos.z += (float)(Random(0, 2000)) - 1000.0f; + pos.x += (float)(Random(0, 5000)) - 2500.0f; + pos.z += (float)(Random(0, 5000)) - 2500.0f; raycastResult = BgCheck_AnyRaycastFloor1(&gPlayState->colCtx, &snowballPoly, &pos); @@ -211,12 +219,15 @@ static void DrawMenu() { if (UIWidgets::EnhancementCheckbox("Snowballs", CVAR("Snowballs"))) { ConfigurationChanged(); } + UIWidgets::Tooltip("Rogue snowballs will spawn in Hyrule Field and Kakariko Village."); if (UIWidgets::EnhancementCheckbox("Lake Hylia Icebergs", CVAR("Icebergs"))) { ConfigurationChanged(); } + UIWidgets::Tooltip("Icebergs will spawn in Lake Hylia."); if (UIWidgets::EnhancementCheckbox("Down the Rabbit Hole", CVAR("DownTheRabbitHole"))) { ConfigurationChanged(); } + UIWidgets::Tooltip("Random grottos will spawn throughout Hyrule. Who knows where they will take you?"); if (UIWidgets::EnhancementCheckbox("Super Bonk", CVAR("SuperBonk"))) { ConfigurationChanged(); } diff --git a/soh/soh/Enhancements/Holiday/lilDavid.cpp b/soh/soh/Enhancements/Holiday/lilDavid.cpp index e96c1def0..33d8b2847 100644 --- a/soh/soh/Enhancements/Holiday/lilDavid.cpp +++ b/soh/soh/Enhancements/Holiday/lilDavid.cpp @@ -123,6 +123,7 @@ static void DrawMenu() { if (UIWidgets::EnhancementCheckbox("Bomb Arrows", CVAR("BombArrows.Enabled"))) { OnConfigurationChanged(); } + UIWidgets::Tooltip("Equip bombs over an already equipped Bow to shoot bomb arrows"); } static void RegisterMod() { diff --git a/soh/soh/Enhancements/TimeDisplay/TimeDisplay.cpp b/soh/soh/Enhancements/TimeDisplay/TimeDisplay.cpp index cb9dfbb46..0247e98dd 100644 --- a/soh/soh/Enhancements/TimeDisplay/TimeDisplay.cpp +++ b/soh/soh/Enhancements/TimeDisplay/TimeDisplay.cpp @@ -1,5 +1,6 @@ #include "TimeDisplay.h" #include "soh/Enhancements/gameplaystats.h" +#include "soh/Enhancements/Holiday/Fredomato.h" #include #include "assets/textures/parameter_static/parameter_static.h" @@ -40,7 +41,8 @@ const std::vector timeDisplayList = { { DISPLAY_IN_GAME_TIMER, "Display Gameplay Timer", CVAR_ENHANCEMENT("TimeDisplay.Timers.InGameTimer") }, { DISPLAY_TIME_OF_DAY, "Display Time of Day", CVAR_ENHANCEMENT("TimeDisplay.Timers.TimeofDay") }, { DISPLAY_CONDITIONAL_TIMER, "Display Conditional Timer", CVAR_ENHANCEMENT("TimeDisplay.Timers.HotWater") }, - { DISPLAY_NAVI_TIMER, "Display Navi Timer", CVAR_ENHANCEMENT("TimeDisplay.Timers.NaviTimer") } + { DISPLAY_NAVI_TIMER, "Display Navi Timer", CVAR_ENHANCEMENT("TimeDisplay.Timers.NaviTimer") }, + { DISPLAY_FRED_QUEST, "Display Fred's Quest", CVAR_ENHANCEMENT("TimeDisplay.Timers.FredsQuest") } }; static std::vector activeTimers; @@ -134,6 +136,10 @@ static void TimeDisplayGetTimer(uint32_t timeID) { } textureDisplay = Ship::Context::GetInstance()->GetWindow()->GetGui()->GetTextureByName("NAVI_TIMER"); break; + case DISPLAY_FRED_QUEST: + timeDisplayTime = std::to_string(FredsQuestWoodOnHand) + "/" + std::to_string(FredsQuestWoodCollected) + "/" + + std::to_string(CVarGetInteger("gHoliday.Fredomato.FredsQuest.WoodNeeded", 300)); + textureDisplay = Ship::Context::GetInstance()->GetWindow()->GetGui()->GetTextureByName("ITEM_STICK"); default: break; } @@ -189,6 +195,12 @@ void TimeDisplayWindow::Draw() { ImGui::Image(textureDisplay, ImVec2(16.0f * fontScale, 16.0f * fontScale)); ImGui::TableNextColumn(); + if (timers.timeID == DISPLAY_FRED_QUEST) { + ImGui::Text("%s", timeDisplayTime.c_str()); + ImGui::PopID(); + continue; + } + if (timeDisplayTime != "-:--") { char* textToDecode = new char[timeDisplayTime.size() + 1]; textToDecode = std::strcpy(textToDecode, timeDisplayTime.c_str()); diff --git a/soh/soh/Enhancements/TimeDisplay/TimeDisplay.h b/soh/soh/Enhancements/TimeDisplay/TimeDisplay.h index 090ac2901..3002ac8a4 100644 --- a/soh/soh/Enhancements/TimeDisplay/TimeDisplay.h +++ b/soh/soh/Enhancements/TimeDisplay/TimeDisplay.h @@ -17,7 +17,8 @@ typedef enum { DISPLAY_IN_GAME_TIMER, DISPLAY_TIME_OF_DAY, DISPLAY_CONDITIONAL_TIMER, - DISPLAY_NAVI_TIMER + DISPLAY_NAVI_TIMER, + DISPLAY_FRED_QUEST, }; typedef enum { diff --git a/soh/soh/Enhancements/game-interactor/GameInteractor.h b/soh/soh/Enhancements/game-interactor/GameInteractor.h index 0e24e0ae5..333f6cc89 100644 --- a/soh/soh/Enhancements/game-interactor/GameInteractor.h +++ b/soh/soh/Enhancements/game-interactor/GameInteractor.h @@ -371,6 +371,7 @@ typedef enum { // Vanilla condition: !Flags_GetInfTable(INFTABLE_145) // Opt: *EnRu1 VB_RUTO_BE_CONSIDERED_NOT_KIDNAPPED, + VB_PLAYER_ROLL, /*** Give Items ***/ diff --git a/soh/soh/Enhancements/game-interactor/GameInteractor_HookTable.h b/soh/soh/Enhancements/game-interactor/GameInteractor_HookTable.h index 59f8cb11e..5754df7f3 100644 --- a/soh/soh/Enhancements/game-interactor/GameInteractor_HookTable.h +++ b/soh/soh/Enhancements/game-interactor/GameInteractor_HookTable.h @@ -31,6 +31,7 @@ DEFINE_HOOK(OnEnemyDefeat, (void* actor)); DEFINE_HOOK(OnBossDefeat, (void* actor)); DEFINE_HOOK(OnTimestamp, (u8 item)); DEFINE_HOOK(OnPlayerBonk, ()); +DEFINE_HOOK(OnPlayerRoll, ()); DEFINE_HOOK(OnPlayerHealthChange, (int16_t amount)); DEFINE_HOOK(OnPlayerBottleUpdate, (int16_t contents)); DEFINE_HOOK(OnPlayDestroy, ()); diff --git a/soh/soh/Enhancements/game-interactor/GameInteractor_Hooks.cpp b/soh/soh/Enhancements/game-interactor/GameInteractor_Hooks.cpp index 2ccd8e100..2ea19806c 100644 --- a/soh/soh/Enhancements/game-interactor/GameInteractor_Hooks.cpp +++ b/soh/soh/Enhancements/game-interactor/GameInteractor_Hooks.cpp @@ -139,6 +139,10 @@ void GameInteractor_ExecuteOnPlayerBonk() { GameInteractor::Instance->ExecuteHooks(); } +void GameInteractor_ExecuteOnPlayerRoll() { + GameInteractor::Instance->ExecuteHooks(); +} + void GameInteractor_ExecuteOnPlayerHealthChange(int16_t amount) { GameInteractor::Instance->ExecuteHooks(amount); } diff --git a/soh/soh/Enhancements/game-interactor/GameInteractor_Hooks.h b/soh/soh/Enhancements/game-interactor/GameInteractor_Hooks.h index fd5d746f8..9a2703f81 100644 --- a/soh/soh/Enhancements/game-interactor/GameInteractor_Hooks.h +++ b/soh/soh/Enhancements/game-interactor/GameInteractor_Hooks.h @@ -29,6 +29,7 @@ void GameInteractor_ExecuteOnEnemyDefeat(void* actor); void GameInteractor_ExecuteOnBossDefeat(void* actor); void GameInteractor_ExecuteOnTimestamp (u8 item); void GameInteractor_ExecuteOnPlayerBonk(); +void GameInteractor_ExecuteOnPlayerRoll(); void GameInteractor_ExecuteOnPlayerHealthChange(int16_t amount); void GameInteractor_ExecuteOnPlayerBottleUpdate(int16_t contents); void GameInteractor_ExecuteOnOcarinaSongAction(); diff --git a/soh/soh/Network/Anchor/Packets/SetCheckStatus.cpp b/soh/soh/Network/Anchor/Packets/SetCheckStatus.cpp index 276e52586..802b33a69 100644 --- a/soh/soh/Network/Anchor/Packets/SetCheckStatus.cpp +++ b/soh/soh/Network/Anchor/Packets/SetCheckStatus.cpp @@ -6,6 +6,8 @@ #include "soh/Enhancements/game-interactor/GameInteractor.h" #include "soh/OTRGlobals.h" +static bool isResultOfHandling = false; + /** * SET_CHECK_STATUS * @@ -13,7 +15,7 @@ */ void Anchor::SendPacket_SetCheckStatus(RandomizerCheck rc) { - if (!IsSaveLoaded()) { + if (!IsSaveLoaded() || isResultOfHandling) { return; } @@ -41,6 +43,8 @@ void Anchor::HandlePacket_SetCheckStatus(nlohmann::json payload) { RandomizerCheck rc = payload["rc"].get(); RandomizerCheckStatus status = payload["status"].get(); bool skipped = payload["skipped"].get(); + + isResultOfHandling = true; if (randoContext->GetItemLocation(rc)->GetCheckStatus() != status) { randoContext->GetItemLocation(rc)->SetCheckStatus(status); @@ -48,6 +52,8 @@ void Anchor::HandlePacket_SetCheckStatus(nlohmann::json payload) { if (randoContext->GetItemLocation(rc)->GetIsSkipped() != skipped) { randoContext->GetItemLocation(rc)->SetIsSkipped(skipped); } + + isResultOfHandling = false; } #endif // ENABLE_REMOTE_CONTROL diff --git a/soh/soh/Network/Anchor/Packets/UpdateTeamState.cpp b/soh/soh/Network/Anchor/Packets/UpdateTeamState.cpp index cbc9088eb..fb937b4d1 100644 --- a/soh/soh/Network/Anchor/Packets/UpdateTeamState.cpp +++ b/soh/soh/Network/Anchor/Packets/UpdateTeamState.cpp @@ -151,7 +151,7 @@ void Anchor::HandlePacket_UpdateTeamState(nlohmann::json payload) { gSaveContext.infTable[i] = loadedData.infTable[i]; } - for (int i = 0; i < 17; i++) { + for (int i = 0; i < 52; i++) { gSaveContext.randomizerInf[i] = loadedData.randomizerInf[i]; } diff --git a/soh/soh/Notification/Notification.cpp b/soh/soh/Notification/Notification.cpp index ebc4e168b..5bc0e8974 100644 --- a/soh/soh/Notification/Notification.cpp +++ b/soh/soh/Notification/Notification.cpp @@ -20,7 +20,7 @@ void Window::Draw() { const float margin = 30.0f; const float padding = 10.0f; - int position = CVarGetInteger(CVAR_SETTING("Notifications.Position"), 0); + int position = CVarGetInteger(CVAR_SETTING("Notifications.Position"), 3); // Top Left ImVec2 basePosition; diff --git a/soh/soh/SohMenuBar.cpp b/soh/soh/SohMenuBar.cpp index 6d504afe5..8e36abe6c 100644 --- a/soh/soh/SohMenuBar.cpp +++ b/soh/soh/SohMenuBar.cpp @@ -586,7 +586,7 @@ void DrawSettingsMenu() { }; ImGui::Text("Position"); - UIWidgets::EnhancementCombobox(CVAR_SETTING("Notifications.Position"), notificationPosition, 0); + UIWidgets::EnhancementCombobox(CVAR_SETTING("Notifications.Position"), notificationPosition, 3); UIWidgets::EnhancementSliderFloat("Duration: %.1f seconds", "##NotificationDuration", CVAR_SETTING("Notifications.Duration"), 3.0f, 30.0f, "", 10.0f, false, true, false); UIWidgets::EnhancementSliderFloat("BG Opacity: %.1f %%", "##NotificaitonBgOpacity", CVAR_SETTING("Notifications.BgOpacity"), 0.0f, 1.0f, "", 0.5f, true, true, false); UIWidgets::EnhancementSliderFloat("Size: %.1f", "##NotificaitonSize", CVAR_SETTING("Notifications.Size"), 1.0f, 20.0f, "", 1.8f, false, true, false); diff --git a/soh/src/code/z_player_lib.c b/soh/src/code/z_player_lib.c index 576bf1eaf..e662f8c46 100644 --- a/soh/src/code/z_player_lib.c +++ b/soh/src/code/z_player_lib.c @@ -8,6 +8,7 @@ #include "soh/Enhancements/game-interactor/GameInteractor.h" #include "soh/Enhancements/randomizer/draw.h" +#include "soh/Enhancements/Holiday/Fredomato.h" #include "soh/ResourceManagerHelpers.h" #include diff --git a/soh/src/overlays/actors/ovl_En_Hy/z_en_hy.c b/soh/src/overlays/actors/ovl_En_Hy/z_en_hy.c index 514e84bd3..084fbdf5c 100644 --- a/soh/src/overlays/actors/ovl_En_Hy/z_en_hy.c +++ b/soh/src/overlays/actors/ovl_En_Hy/z_en_hy.c @@ -543,7 +543,9 @@ u16 func_80A6F810(PlayState* play, Actor* thisx) { return 0x5058; } case ENHY_TYPE_BOB_18: - if (!LINK_IS_ADULT) { + if (CVarGetInteger("gHoliday.Fredomato.TreeChopper", 0)) { + return 0x505e; + } else if (!LINK_IS_ADULT) { return (Flags_GetEventChkInf(EVENTCHKINF_ZELDA_FLED_HYRULE_CASTLE)) ? 0x505F : ((Flags_GetInfTable(INFTABLE_163)) ? 0x505E : 0x505D); } else { return (this->unk_330 & 0x800) ? 0x5062 : ((Flags_GetInfTable(INFTABLE_164)) ? 0x5061 : 0x5060); diff --git a/soh/src/overlays/actors/ovl_En_Wood02/z_en_wood02.c b/soh/src/overlays/actors/ovl_En_Wood02/z_en_wood02.c index 7ecb21288..a185540ab 100644 --- a/soh/src/overlays/actors/ovl_En_Wood02/z_en_wood02.c +++ b/soh/src/overlays/actors/ovl_En_Wood02/z_en_wood02.c @@ -6,6 +6,7 @@ #include "z_en_wood02.h" #include "objects/object_wood02/object_wood02.h" +#include "soh/Enhancements/Holiday/Fredomato.h" #define FLAGS 0 @@ -368,7 +369,9 @@ void EnWood02_Update(Actor* thisx, PlayState* play2) { dropsSpawnPt = this->actor.world.pos; dropsSpawnPt.y += 200.0f; - if ((this->unk_14C >= 0) && (this->unk_14C < 0x64) && (CVarGetInteger(CVAR_ENHANCEMENT("TreesDropSticks"), 0)) && !(INV_CONTENT(ITEM_STICK) == ITEM_NONE)) { + if (HandleTreeBonk(&this->actor)) { + // no-op + } else if ((this->unk_14C >= 0) && (this->unk_14C < 0x64) && (CVarGetInteger(CVAR_ENHANCEMENT("TreesDropSticks"), 0)) && !(INV_CONTENT(ITEM_STICK) == ITEM_NONE)) { (numDrops = (Rand_ZeroOne() * 4)); for (i = 0; i < numDrops; ++i) { Item_DropCollectible(play, &dropsSpawnPt, ITEM00_STICK); diff --git a/soh/src/overlays/actors/ovl_player_actor/z_player.c b/soh/src/overlays/actors/ovl_player_actor/z_player.c index 28b33657b..a5a68b455 100644 --- a/soh/src/overlays/actors/ovl_player_actor/z_player.c +++ b/soh/src/overlays/actors/ovl_player_actor/z_player.c @@ -6265,11 +6265,16 @@ s32 func_8083BBA0(Player* this, PlayState* play) { } void Player_SetupRoll(Player* this, PlayState* play) { + if (!GameInteractor_Should(VB_PLAYER_ROLL, true)) { + return; + } + Player_SetupAction(play, this, Player_Action_Roll, 0); LinkAnimation_PlayOnceSetSpeed(play, &this->skelAnime, GET_PLAYER_ANIM(PLAYER_ANIMGROUP_landing_roll, this->modelAnimType), 1.25f * sWaterSpeedFactor); gSaveContext.sohStats.count[COUNT_ROLLS]++; + GameInteractor_ExecuteOnPlayerRoll(); } s32 Player_TryRoll(Player* this, PlayState* play) { @@ -8554,6 +8559,16 @@ void Player_Action_808414F8(Player* this, PlayState* play) { } Player_GetMovementSpeedAndYaw(this, &speedTarget, &yawTarget, SPEED_MODE_LINEAR, play); + + int32_t giSpeedModifier = GameInteractor_RunSpeedModifier(); + if (giSpeedModifier != 0) { + if (giSpeedModifier > 0) { + speedTarget *= giSpeedModifier; + } else { + speedTarget /= abs(giSpeedModifier); + } + } + sp2C = func_8083FD78(this, &speedTarget, &yawTarget, play); if (sp2C >= 0) { From d725125f9b12a48a5086944103ca3632daf85de5 Mon Sep 17 00:00:00 2001 From: lilacLunatic <8488221+lilacLunatic@users.noreply.github.com> Date: Tue, 17 Dec 2024 07:35:54 -0300 Subject: [PATCH 17/18] [Holiday] Custom rainbows (#4698) * [Holiday] Custom rainbows * Update soh/soh/Enhancements/Holiday/LL.h Co-authored-by: briaguya <70942617+briaguya-ai@users.noreply.github.com> --------- Co-authored-by: briaguya <70942617+briaguya-ai@users.noreply.github.com> --- soh/soh/Enhancements/Holiday/LL.cpp | 129 ++++++++++++++++++ soh/soh/Enhancements/Holiday/LL.h | 86 ++++++++++++ .../cosmetics/CosmeticsEditor.cpp | 42 +++++- 3 files changed, 254 insertions(+), 3 deletions(-) create mode 100644 soh/soh/Enhancements/Holiday/LL.cpp create mode 100644 soh/soh/Enhancements/Holiday/LL.h diff --git a/soh/soh/Enhancements/Holiday/LL.cpp b/soh/soh/Enhancements/Holiday/LL.cpp new file mode 100644 index 000000000..344d8043e --- /dev/null +++ b/soh/soh/Enhancements/Holiday/LL.cpp @@ -0,0 +1,129 @@ +#include "Holiday.hpp" +#include "LL.h" + +extern "C" { +#include "macros.h" +#include "functions.h" +#include "variables.h" +extern PlayState* gPlayState; + +// TODO: Include anything you need here from C land +} + +// TODO: Change this to YourName +#define AUTHOR "LL" +#define CVAR(v) "gHoliday." AUTHOR "." v + +static ImVec4 customColorZero = RAINBOW_PRESETS[0][0]; +static ImVec4 customColorOne = RAINBOW_PRESETS[0][1]; +static ImVec4 customColorMinusZero = RAINBOW_PRESETS[0][2]; +static ImVec4 customColorMinusOne = RAINBOW_PRESETS[0][3]; + +ImVec4 Color_LUSToImGui(Color_RGBA8 color) { + ImVec4 result; + + result.x = color.r / 255.0f; + result.y = color.g / 255.0f; + result.z = color.b / 255.0f; + result.w = color.a / 255.0f; + + return result; +} + +Color_RGBA8 Color_ImGuiToLUS(ImVec4 color) { + Color_RGBA8 result; + + result.r = static_cast(color.x * 255); + result.g = static_cast(color.y * 255); + result.b = static_cast(color.z * 255); + result.a = static_cast(color.w * 255); + + return result; +} + +static void OnConfigurationChanged() { + Color_RGBA8 c1 = CVarGetColor(CVAR("lCustomRainbow1"), Color_ImGuiToLUS(RAINBOW_PRESETS[0][0])); + Color_RGBA8 c2 = CVarGetColor(CVAR("lCustomRainbow2"), Color_ImGuiToLUS(RAINBOW_PRESETS[0][1])); + Color_RGBA8 c3 = CVarGetColor(CVAR("lCustomRainbow3"), Color_ImGuiToLUS(RAINBOW_PRESETS[0][2])); + Color_RGBA8 c4 = CVarGetColor(CVAR("lCustomRainbow4"), Color_ImGuiToLUS(RAINBOW_PRESETS[0][3])); + + customColorZero = Color_LUSToImGui((Color_RGBA8)c1); + customColorOne = Color_LUSToImGui((Color_RGBA8)c2); + customColorMinusZero = Color_LUSToImGui((Color_RGBA8)c3); + customColorMinusOne = Color_LUSToImGui((Color_RGBA8)c4); + + // TODO: Register any hooks or things that need to run on startup and when the main CVar is toggled + // Note: Hooks should be registered/unregistered depending on the CVar state (Use COND_HOOK or COND_ID_HOOK) + + // COND_HOOK(OnSceneSpawnActors, CVarGetInteger(CVAR("Enabled"), 0), []() { + // // Spawn your own actors? + // }); + + // COND_ID_HOOK(OnActorInit, ACTOR_OBJ_TSUBO, CVarGetInteger(CVAR("DoSomethingWithPots"), 0), [](void* actorRef) { + // // Do something with pots? + // }); +} + +static void DrawMenu() { + ImGui::SeparatorText(AUTHOR); + if (ImGui::BeginMenu("Customize Rainbows")) { + UIWidgets::EnhancementCheckbox("Enable", CVAR("lEnableCustomRainbows")); + if (CVarGetInteger(CVAR("lEnableCustomRainbows"), 0)) { + ImGui::ColorEdit3("Color 1", (float*)&customColorZero, ImGuiColorEditFlags_NoInputs); + ImGui::ColorEdit3("Color 2", (float*)&customColorOne, ImGuiColorEditFlags_NoInputs); + ImGui::ColorEdit3("Color 3", (float*)&customColorMinusZero, ImGuiColorEditFlags_NoInputs); + ImGui::ColorEdit3("Color 4", (float*)&customColorMinusOne, ImGuiColorEditFlags_NoInputs); + + UIWidgets::PaddedText("Presets", true, false); + size_t rainbowPresetIdx = 0; + if (UIWidgets::EnhancementCombobox(CVAR("lCustomRainbowPreset"), RAINBOW_PRESET_NAMES, 0) && + (rainbowPresetIdx = CVarGetInteger(CVAR("lCustomRainbowPreset"), 0)) <= RAINBOW_PRESET_LEN) { //paranoia + customColorZero = RAINBOW_PRESETS[rainbowPresetIdx][0]; + customColorOne = RAINBOW_PRESETS[rainbowPresetIdx][1]; + customColorMinusZero = RAINBOW_PRESETS[rainbowPresetIdx][2]; + customColorMinusOne = RAINBOW_PRESETS[rainbowPresetIdx][3]; + } + + Color_RGBA8 color1, color2, color3, color4; + color1.r = static_cast(customColorZero.x * 255.0f); + color1.g = static_cast(customColorZero.y * 255.0f); + color1.b = static_cast(customColorZero.z * 255.0f); + + color2.r = static_cast(customColorOne.x * 255.0f); + color2.g = static_cast(customColorOne.y * 255.0f); + color2.b = static_cast(customColorOne.z * 255.0f); + + color3.r = static_cast(customColorMinusZero.x * 255.0f); + color3.g = static_cast(customColorMinusZero.y * 255.0f); + color3.b = static_cast(customColorMinusZero.z * 255.0f); + + color4.r = static_cast(customColorMinusOne.x * 255.0f); + color4.g = static_cast(customColorMinusOne.y * 255.0f); + color4.b = static_cast(customColorMinusOne.z * 255.0f); + + CVarSetColor(CVAR("lCustomRainbow1"), color1); + CVarSetColor(CVAR("lCustomRainbow2"), color2); + CVarSetColor(CVAR("lCustomRainbow3"), color3); + CVarSetColor(CVAR("lCustomRainbow4"), color4); + + OnConfigurationChanged(); + } + + ImGui::EndMenu(); + + } + //if (UIWidgets::EnhancementCheckbox("DoSomethingWithPots", CVAR("DoSomethingWithPots"))) { + // OnConfigurationChanged(); + //} +} + +static void RegisterMod() { + // #region Leave this alone unless you know what you are doing + OnConfigurationChanged(); + // #endregion + + // TODO: Anything you want to run once on startup +} + +// TODO: Uncomment this line to enable the mod +static Holiday holiday(DrawMenu, RegisterMod); diff --git a/soh/soh/Enhancements/Holiday/LL.h b/soh/soh/Enhancements/Holiday/LL.h new file mode 100644 index 000000000..ba936b6c3 --- /dev/null +++ b/soh/soh/Enhancements/Holiday/LL.h @@ -0,0 +1,86 @@ +#ifndef LL_H +#define LL_H + +#include "soh/Enhancements/cosmetics/CosmeticsEditor.h" +#include "soh/Enhancements/game-interactor/GameInteractor.h" + +const size_t RAINBOW_PRESET_LEN = 9; + +static const char* RAINBOW_PRESET_NAMES[RAINBOW_PRESET_LEN] = { + "Christmas", + "Transgender", + "Nonbinary", + "Bisexual", + "Lesbian", + "Gay (MLM)", + "Asexual", + "Brazil", + "Italy" +}; + +static const ImVec4 RAINBOW_PRESETS[RAINBOW_PRESET_LEN][4] = { + { //christmas + {0.0/255.0, 140.0/255.0, 69.0/255.0, 0}, + {205.0/255.0, 33.0/255.0, 42.0/255.0, 0}, + {0.0/255.0, 140.0/255.0, 69.0/255.0, 0}, + {205.0/255.0, 33.0/255.0, 42.0/255.0, 0} + }, + { //trans + {255.0/255.0, 255.0/255.0, 255.0/255.0, 0}, + {255.0/255.0, 159.0/255.0, 186.0/255.0, 0}, + {255.0/255.0, 255.0/255.0, 255.0/255.0, 0}, + {71.0/255.0, 186.0/255.0, 230.0/255.0, 0} + }, + + { //enby + {252.0/255.0, 244.0/255.0, 52.0/255.0, 0}, + {255.0/255.0, 255.0/255.0, 255.0/255.0, 0}, + {156.0/255.0, 89.0/255.0, 209.0/255.0, 0}, + {0.0/255.0, 0.0/255.0, 0.0/255.0, 0} + }, + + { //bi + {155.0/255.0, 79.0/255.0, 150.0/255.0, 0}, + {0.0/255.0, 56.0/255.0, 168.0/255.0, 0}, + {155.0/255.0, 79.0/255.0, 150.0/255.0, 0}, + {214.0/255.0, 2.0/255.0, 112.0/255.0, 0} + }, + + { //lesbian + {255.0/255.0, 255.0/255.0, 255.0/255.0, 0}, + {213.0/255.0, 45.0/255.0, 0.0/255.0, 0}, + {255.0/255.0, 255.0/255.0, 255.0/255.0, 0}, + {163.0/255.0, 2.0/255.0, 98.0/255.0, 0} + }, + + { //gay + {7.0/255.0, 141.0/255.0, 112.0/255.0, 0}, + {255.0/255.0, 255.0/255.0, 255.0/255.0, 0}, + {123.0/255.0, 173.0/255.0, 226.0/255.0, 0}, + {61.0/255.0, 26.0/255.0, 120.0/255.0, 0} + }, + + { //ace + {0.0/255.0, 0.0/255.0, 0.0/255.0, 0}, + {163.0/255.0, 163.0/255.0, 163.0/255.0, 0}, + {255.0/255.0, 255.0/255.0, 255.0/255.0, 0}, + {128.0/255.0, 0.0/255.0, 128.0/255.0, 0} + }, + + { //br + {0.0/255.0, 151.0/255.0, 57.0/255.0, 0}, + {254.0/255.0, 221.0/255.0, 0.0/255.0, 0}, + {255.0/255.0, 255.0/255.0, 255.0/255.0, 0}, + {1.0/255.0, 33.0/255.0, 105.0/255.0, 0} + }, + + { //it + {255.0/255.0, 255.0/255.0, 255.0/255.0, 0}, + {0.0/255.0, 140.0/255.0, 69.0/255.0, 0}, + {255.0/255.0, 255.0/255.0, 255.0/255.0, 0}, + {205.0/255.0, 33.0/255.0, 42.0/255.0, 0} + } + +}; + +#endif diff --git a/soh/soh/Enhancements/cosmetics/CosmeticsEditor.cpp b/soh/soh/Enhancements/cosmetics/CosmeticsEditor.cpp index ee6b08fd4..426101fdd 100644 --- a/soh/soh/Enhancements/cosmetics/CosmeticsEditor.cpp +++ b/soh/soh/Enhancements/cosmetics/CosmeticsEditor.cpp @@ -493,6 +493,8 @@ void ResetPositionAll() { int hue = 0; +#define CVAR_LL(v) "gHoliday." "LL" "." v + // Runs every frame to update rainbow hue, a potential future optimization is to only run this a once or twice a second and increase the speed of the rainbow hue rotation. void CosmeticsUpdateTick() { int index = 0; @@ -501,10 +503,44 @@ void CosmeticsUpdateTick() { if (cosmeticOption.supportsRainbow && CVarGetInteger(cosmeticOption.rainbowCvar, 0)) { double frequency = 2 * M_PI / (360 * rainbowSpeed); Color_RGBA8 newColor; - newColor.r = static_cast(sin(frequency * (hue + index) + 0) * 127) + 128; - newColor.g = static_cast(sin(frequency * (hue + index) + (2 * M_PI / 3)) * 127) + 128; - newColor.b = static_cast(sin(frequency * (hue + index) + (4 * M_PI / 3)) * 127) + 128; + newColor.a = 255; + + if (!CVarGetInteger(CVAR_LL("lEnableCustomRainbows"), 0)) { + newColor.r = static_cast(sin(frequency * (hue + index) + 0) * 127) + 128; + newColor.g = static_cast(sin(frequency * (hue + index) + (2 * M_PI / 3)) * 127) + 128; + newColor.b = static_cast(sin(frequency * (hue + index) + (4 * M_PI / 3)) * 127) + 128; + } + else { + Color_RGBA8 customColorZero = CVarGetColor(CVAR_LL("lCustomRainbow1"), {}); + Color_RGBA8 customColorOne = CVarGetColor(CVAR_LL("lCustomRainbow2"), {}); + Color_RGBA8 customColorMinusZero = CVarGetColor(CVAR_LL("lCustomRainbow3"), {}); + Color_RGBA8 customColorMinusOne = CVarGetColor(CVAR_LL("lCustomRainbow4"), {}); + float sinangle = sin(frequency * (hue + index)); + bool quadrant1 = hue <= (360 * rainbowSpeed) / 4; + bool quadrant2 = hue >= (360 * rainbowSpeed) / 4 && hue <= (360 * rainbowSpeed) / 2; + bool quadrant3 = hue >= (360 * rainbowSpeed) / 2 && hue <= (360 * rainbowSpeed) * 3 / 4; + bool quadrant4 = hue >= (360 * rainbowSpeed) * 3 / 4; + + if (quadrant1) { //zero to one + newColor.r = sinangle * (customColorOne.r - customColorZero.r) + customColorZero.r; + newColor.g = sinangle * (customColorOne.g - customColorZero.g) + customColorZero.g; + newColor.b = sinangle * (customColorOne.b - customColorZero.b) + customColorZero.b; + } else if (quadrant2) { //one to zero + newColor.r = sinangle * (customColorOne.r - customColorMinusZero.r) + customColorMinusZero.r; + newColor.g = sinangle * (customColorOne.g - customColorMinusZero.g) + customColorMinusZero.g; + newColor.b = sinangle * (customColorOne.b - customColorMinusZero.b) + customColorMinusZero.b; + } else if (quadrant3) { //zero to minus one + newColor.r = -sinangle * (customColorMinusOne.r - customColorMinusZero.r) + customColorMinusZero.r; + newColor.g = -sinangle * (customColorMinusOne.g - customColorMinusZero.g) + customColorMinusZero.g; + newColor.b = -sinangle * (customColorMinusOne.b - customColorMinusZero.b) + customColorMinusZero.b; + } else if (quadrant4) { //minus one to zero + newColor.r = -sinangle * (customColorMinusOne.r - customColorZero.r) + customColorZero.r; + newColor.g = -sinangle * (customColorMinusOne.g - customColorZero.g) + customColorZero.g; + newColor.b = -sinangle * (customColorMinusOne.b - customColorZero.b) + customColorZero.b; + } + } + // For alpha supported options, retain the last set alpha instead of overwriting if (cosmeticOption.supportsAlpha) { newColor.a = static_cast(cosmeticOption.currentColor.w * 255.0f); From 69d6631bbc7ccc179d277505529c6e4e11ac79d9 Mon Sep 17 00:00:00 2001 From: Garrett Cox Date: Tue, 17 Dec 2024 11:03:54 -0600 Subject: [PATCH 18/18] Some tweaks to WIP (#4706) --- soh/soh/Network/Anchor/Anchor.cpp | 9 +++++++++ soh/soh/Network/Anchor/Anchor.h | 1 + soh/soh/Network/Anchor/AnchorRoomWindow.cpp | 4 ++++ .../Network/Anchor/Packets/EntranceDiscovered.cpp | 6 +++++- .../Network/Anchor/Packets/RequestTeamState.cpp | 4 ++++ soh/soh/Network/Anchor/Packets/SetFlag.cpp | 4 ++++ soh/soh/Network/Anchor/Packets/UnsetFlag.cpp | 4 ++++ soh/soh/Network/Anchor/Packets/UpdateTeamState.cpp | 14 ++++++++++++++ 8 files changed, 45 insertions(+), 1 deletion(-) diff --git a/soh/soh/Network/Anchor/Anchor.cpp b/soh/soh/Network/Anchor/Anchor.cpp index 7d1b701ab..bc40f13b5 100644 --- a/soh/soh/Network/Anchor/Anchor.cpp +++ b/soh/soh/Network/Anchor/Anchor.cpp @@ -383,6 +383,15 @@ void Anchor::DrawMenu() { ImGui::EndMenu(); } } + + if (ImGui::Button("Request Team State", ImVec2(ImGui::GetContentRegionAvail().x - 25.0f, 0.0f))) { + SendPacket_RequestTeamState(); + } + ImGui::SameLine(); + if (ImGui::Button(ICON_FA_TRASH)) { + SendPacket_ClearTeamState(); + } + UIWidgets::Tooltip("Clear Team State"); } else { ImGui::Text("Connecting..."); } diff --git a/soh/soh/Network/Anchor/Anchor.h b/soh/soh/Network/Anchor/Anchor.h index eceb02c1d..16e3dd142 100644 --- a/soh/soh/Network/Anchor/Anchor.h +++ b/soh/soh/Network/Anchor/Anchor.h @@ -133,6 +133,7 @@ class Anchor : public Network { void SendJsonToRemote(nlohmann::json packet); bool IsSaveLoaded(); + void SendPacket_ClearTeamState(); void SendPacket_ConsumeAdultTradeItem(u8 itemId); void SendPacket_DamagePlayer(u32 clientId, u8 damageEffect, u8 damage); void SendPacket_EntranceDiscovered(u16 entranceIndex); diff --git a/soh/soh/Network/Anchor/AnchorRoomWindow.cpp b/soh/soh/Network/Anchor/AnchorRoomWindow.cpp index 7a683eca0..4e20713ad 100644 --- a/soh/soh/Network/Anchor/AnchorRoomWindow.cpp +++ b/soh/soh/Network/Anchor/AnchorRoomWindow.cpp @@ -49,6 +49,8 @@ void AnchorRoomWindow::Draw() { continue; } + ImGui::PushID(clientId); + if (client.clientId == Anchor::Instance->roomState.ownerClientId) { ImGui::TextColored(ImVec4(1, 1, 0, 1), "%s", ICON_FA_GAVEL); ImGui::SameLine(); @@ -58,6 +60,7 @@ void AnchorRoomWindow::Draw() { ImGui::TextColored(ImVec4(0.8f, 1.0f, 0.8f, 1.0f), "%s", CVarGetString(CVAR_REMOTE_ANCHOR("Name"), "")); } else if (!client.online) { ImGui::TextColored(ImVec4(1, 1, 1, 0.3f), "%s - offline", client.name.c_str()); + ImGui::PopID(); continue; } else { ImGui::Text("%s", client.name.c_str()); @@ -105,6 +108,7 @@ void AnchorRoomWindow::Draw() { ImGui::EndTooltip(); } } + ImGui::PopID(); } } diff --git a/soh/soh/Network/Anchor/Packets/EntranceDiscovered.cpp b/soh/soh/Network/Anchor/Packets/EntranceDiscovered.cpp index f5c27a82f..71773dcfd 100644 --- a/soh/soh/Network/Anchor/Packets/EntranceDiscovered.cpp +++ b/soh/soh/Network/Anchor/Packets/EntranceDiscovered.cpp @@ -7,12 +7,14 @@ #include "soh/Enhancements/randomizer/randomizer_entrance.h" #include "soh/OTRGlobals.h" +static bool isResultOfHandling = false; + /** * ENTRANCE_DISCOVERED */ void Anchor::SendPacket_EntranceDiscovered(u16 entranceIndex) { - if (!IsSaveLoaded()) { + if (!IsSaveLoaded() || isResultOfHandling) { return; } @@ -30,8 +32,10 @@ void Anchor::HandlePacket_EntranceDiscovered(nlohmann::json payload) { return; } + isResultOfHandling = true; u16 entranceIndex = payload["entranceIndex"].get(); Entrance_SetEntranceDiscovered(entranceIndex, 1); + isResultOfHandling = false; } #endif // ENABLE_REMOTE_CONTROL diff --git a/soh/soh/Network/Anchor/Packets/RequestTeamState.cpp b/soh/soh/Network/Anchor/Packets/RequestTeamState.cpp index f2a556dd1..88638b082 100644 --- a/soh/soh/Network/Anchor/Packets/RequestTeamState.cpp +++ b/soh/soh/Network/Anchor/Packets/RequestTeamState.cpp @@ -19,6 +19,10 @@ */ void Anchor::SendPacket_RequestTeamState() { + if (!IsSaveLoaded()) { + return; + } + nlohmann::json payload; payload["type"] = REQUEST_TEAM_STATE; payload["targetTeamId"] = CVarGetString(CVAR_REMOTE_ANCHOR("TeamId"), "default"); diff --git a/soh/soh/Network/Anchor/Packets/SetFlag.cpp b/soh/soh/Network/Anchor/Packets/SetFlag.cpp index b7438ab95..693c75350 100644 --- a/soh/soh/Network/Anchor/Packets/SetFlag.cpp +++ b/soh/soh/Network/Anchor/Packets/SetFlag.cpp @@ -13,6 +13,10 @@ */ void Anchor::SendPacket_SetFlag(s16 sceneNum, s16 flagType, s16 flag) { + if (!IsSaveLoaded()) { + return; + } + nlohmann::json payload; payload["type"] = SET_FLAG; payload["targetTeamId"] = CVarGetString(CVAR_REMOTE_ANCHOR("TeamId"), "default"); diff --git a/soh/soh/Network/Anchor/Packets/UnsetFlag.cpp b/soh/soh/Network/Anchor/Packets/UnsetFlag.cpp index 91da3f9b1..5de78595a 100644 --- a/soh/soh/Network/Anchor/Packets/UnsetFlag.cpp +++ b/soh/soh/Network/Anchor/Packets/UnsetFlag.cpp @@ -13,6 +13,10 @@ */ void Anchor::SendPacket_UnsetFlag(s16 sceneNum, s16 flagType, s16 flag) { + if (!IsSaveLoaded()) { + return; + } + nlohmann::json payload; payload["type"] = UNSET_FLAG; payload["targetTeamId"] = CVarGetString(CVAR_REMOTE_ANCHOR("TeamId"), "default"); diff --git a/soh/soh/Network/Anchor/Packets/UpdateTeamState.cpp b/soh/soh/Network/Anchor/Packets/UpdateTeamState.cpp index fb937b4d1..d17981f4f 100644 --- a/soh/soh/Network/Anchor/Packets/UpdateTeamState.cpp +++ b/soh/soh/Network/Anchor/Packets/UpdateTeamState.cpp @@ -105,6 +105,20 @@ void Anchor::SendPacket_UpdateTeamState() { SendJsonToRemote(payload); } +void Anchor::SendPacket_ClearTeamState() { + if (!IsSaveLoaded()) { + return; + } + + json payload; + payload["type"] = UPDATE_TEAM_STATE; + payload["targetTeamId"] = CVarGetString(CVAR_REMOTE_ANCHOR("TeamId"), "default"); + + payload["queue"] = json::array(); + payload["state"] = json::object(); + SendJsonToRemote(payload); +} + void Anchor::HandlePacket_UpdateTeamState(nlohmann::json payload) { isHandlingUpdateTeamState = true; // This can happen in between file select and the game starting, so we cant use this check, but we need to ensure we