44using Monocle ;
55using MonoMod . Cil ;
66using System ;
7- using System . Collections . Generic ;
8- using System . Linq ;
9- using System . Text ;
10- using System . Threading . Tasks ;
117
128namespace Celeste . Mod . SpringCollab2020 . Triggers {
139 [ CustomEntity ( "SpringCollab2020/MadelineSilhouetteTrigger" ) ]
1410 class MadelineSilhouetteTrigger : Trigger {
1511 public static void Load ( ) {
1612 On . Celeste . Player . Added += onPlayerAdded ;
1713 IL . Celeste . Player . Render += patchPlayerRender ;
14+ On . Celeste . Player . ResetSprite += onPlayerResetSprite ;
1815 }
1916
2017 public static void Unload ( ) {
2118 On . Celeste . Player . Added -= onPlayerAdded ;
2219 IL . Celeste . Player . Render -= patchPlayerRender ;
20+ On . Celeste . Player . ResetSprite -= onPlayerResetSprite ;
2321 }
2422
2523 private static void onPlayerAdded ( On . Celeste . Player . orig_Added orig , Player self , Scene scene ) {
@@ -33,9 +31,18 @@ private static void onPlayerAdded(On.Celeste.Player.orig_Added orig, Player self
3331 private static void patchPlayerRender ( ILContext il ) {
3432 ILCursor cursor = new ILCursor ( il ) ;
3533
34+ // jump to the usage of the Red color
35+ if ( cursor . TryGotoNext ( instr => instr . MatchCall < Color > ( "get_Red" ) ) ) {
36+ Logger . Log ( "SpringCollab2020/MadelineSilhouetteTrigger" , $ "Patching silhouette hair color at { cursor . Index } in IL code for Player.Render()") ;
37+
38+ // when Madeline blinks red, make the hair blink red.
39+ cursor . Emit ( OpCodes . Ldarg_0 ) ;
40+ cursor . EmitDelegate < Action < Player > > ( player => player . Hair . Color = Color . Red ) ;
41+ }
42+
3643 // jump to the usage of the White color
3744 if ( cursor . TryGotoNext ( instr => instr . MatchCall < Color > ( "get_White" ) ) ) {
38- Logger . Log ( "SpringCollab2020/MadelineSilhouetteTrigger" , $ "Patching player color at { cursor . Index } in IL code for Player.Render()") ;
45+ Logger . Log ( "SpringCollab2020/MadelineSilhouetteTrigger" , $ "Patching silhouette color at { cursor . Index } in IL code for Player.Render()") ;
3946
4047 // instead of calling Color.White, call getMadelineColor just below.
4148 cursor . Emit ( OpCodes . Ldarg_0 ) ;
@@ -66,6 +73,14 @@ private static void refreshPlayerSpriteMode(Player player, bool enableSilhouette
6673 }
6774 }
6875
76+ private static void onPlayerResetSprite ( On . Celeste . Player . orig_ResetSprite orig , Player self , PlayerSpriteMode mode ) {
77+ // filter all calls to ResetSprite when MadelineIsSilhouette is enabled, only the ones with Playback will go through.
78+ // this prevents Madeline from turning back into normal when the Other Self variant is toggled.
79+ if ( ! SpringCollab2020Module . Instance . Session . MadelineIsSilhouette || mode == PlayerSpriteMode . Playback ) {
80+ orig ( self , mode ) ;
81+ }
82+ }
83+
6984
7085 private bool enable ;
7186
0 commit comments