1
+ using Archipelago . MultiClient . Net . Models ;
2
+ using Il2CppAssets . Scripts . Database ;
3
+ using Il2CppAssets . Scripts . TouhouLogic ;
4
+ using Il2CppGameLogic ;
5
+ using Il2CppPeroPeroGames . GlobalDefines ;
6
+
7
+ namespace ArchipelagoMuseDash . Archipelago . Traps ;
8
+
9
+ public class BadAppleTrap : ITrap {
10
+ public string TrapMessage => "★★ Trap Activated ★★\n Bad Apple!" ;
11
+ public NetworkItem NetworkItem { get ; set ; }
12
+
13
+ public void PreGameSceneLoad ( ) {
14
+ GlobalDataBase . dbTouhou . isBadApple = true ;
15
+ GlobalDataBase . s_DbOther . m_HpFx = TouhouLogic . ReplaceBadAppleString ( "fx_hp_ground" ) ;
16
+ GlobalDataBase . s_DbOther . m_MusicFx = TouhouLogic . ReplaceBadAppleString ( "fx_score_ground" ) ;
17
+ GlobalDataBase . s_DbOther . m_DustFx = TouhouLogic . ReplaceBadAppleString ( "dust_fx" ) ;
18
+ }
19
+
20
+ public void LoadMusicDataByFilenameHook ( ) {
21
+ //This is used to force the scene into the Touhou scene. The Touhou scene is the only one that can handle the bad apple look.
22
+ GlobalDataBase . dbBattleStage . m_BeganScene = "scene_08" ;
23
+ GlobalDataBase . dbBattleStage . m_BeganSceneIdx = 8 ;
24
+ }
25
+
26
+ public void SetRuntimeMusicDataHook ( List < MusicData > data ) {
27
+ ArchipelagoStatic . ArchLogger . Log ( "DBStageInfo" , $ "SetRuntimeMusicData { data . Count } ") ;
28
+ ChangeToBadApple ( data ) ;
29
+ TrapHelper . FixIndexes ( data ) ;
30
+ }
31
+
32
+ private void ChangeToBadApple ( List < MusicData > data ) {
33
+ for ( int i = data . Count - 1 ; i >= 0 ; i -- ) {
34
+ var md = data [ i ] ;
35
+
36
+ var noteData = md . noteData ;
37
+
38
+ switch ( noteData . bmsUid ) {
39
+ case BmsNodeUid . ToggleScene1 :
40
+ case BmsNodeUid . ToggleScene2 :
41
+ case BmsNodeUid . ToggleScene3 :
42
+ case BmsNodeUid . ToggleScene4 :
43
+ case BmsNodeUid . ToggleScene5 :
44
+ case BmsNodeUid . ToggleScene6 :
45
+ case BmsNodeUid . ToggleScene7 :
46
+ case BmsNodeUid . ToggleScene8 :
47
+ case BmsNodeUid . ToggleScene9 :
48
+ case BmsNodeUid . ToggleScene10 : {
49
+ TrapHelper . RemoveIndex ( data , i ) ;
50
+ continue ;
51
+ }
52
+ }
53
+
54
+ //BmsNodeUid.Hp and BmsNodeUid.Music do not have stage specific versions, except for touhou. So these require special logic.
55
+ if ( noteData . m_BmsUid is BmsNodeUid . Hp or BmsNodeUid . Music ) {
56
+ ArchipelagoStatic . ArchLogger . Log ( "BadAppleTrap" , "Note is HP or Music" ) ;
57
+ if ( noteData . scene == "scene_08" )
58
+ continue ;
59
+
60
+ noteData . scene = "scene_08" ;
61
+ noteData . prefab_name = string . Concat ( "08" , md . noteData . prefab_name ) ;
62
+ md . noteData = noteData ;
63
+ data [ i ] = md ;
64
+ continue ;
65
+ }
66
+
67
+ if ( noteData . scene is not { Length : > 2 } )
68
+ continue ;
69
+
70
+ noteData . scene = "scene_08" ;
71
+ if ( int . TryParse ( md . noteData . prefab_name . AsSpan ( 0 , 2 ) , out var value ) && value != 8 ) {
72
+ switch ( noteData . m_BmsUid ) {
73
+ case BmsNodeUid . Music :
74
+ case BmsNodeUid . Hp :
75
+ break ;
76
+ default :
77
+ noteData . prefab_name = string . Concat ( "08" , md . noteData . prefab_name . AsSpan ( 2 ) ) ;
78
+ break ;
79
+ }
80
+ }
81
+
82
+ md . noteData = noteData ;
83
+ data [ i ] = md ;
84
+ }
85
+ }
86
+ }
0 commit comments