Skip to content

Commit 6277026

Browse files
committed
Madeline Silhouette Trigger
1 parent 0002b9d commit 6277026

File tree

5 files changed

+111
-0
lines changed

5 files changed

+111
-0
lines changed

Ahorn/lang/en_gb.lang

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -176,3 +176,6 @@ placements.entities.SpringCollab2020/MultiRoomStrawberry.tooltips.winged=The str
176176
placements.entities.SpringCollab2020/MultiRoomStrawberry.tooltips.checkpointID=Manually determine what checkpoint section strawberries are visually grouped up in, showing up on the start menu during gameplay and level select. Overrides Everest's automatic berry IDs. (Default= -1)
177177
placements.entities.SpringCollab2020/MultiRoomStrawberry.tooltips.order=Manually determine what order strawberries are visually placed in on the start menu during gameplay and level select. Overrides Everest's automatic berry IDs. (Default= -1)
178178
placements.entities.SpringCollab2020/MultiRoomStrawberry.tooltips.moon=Makes the strawberry render as a space berry.\nDoes not work with wings or nodes in the base game.
179+
180+
# Madeline Silhouette Trigger
181+
placements.triggers.SpringCollab2020/MadelineSilhouetteTrigger.tooltips.enable=If checked, the trigger will turn Madeline into a silhouette. If unchecked, it will turn Madeline back to normal.
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
module SpringCollab2020MadelineSilhouetteTrigger
2+
3+
using ..Ahorn, Maple
4+
5+
@mapdef Trigger "SpringCollab2020/MadelineSilhouetteTrigger" MadelineSilhouetteTrigger(x::Integer, y::Integer,
6+
width::Integer=Maple.defaultTriggerWidth, height::Integer=Maple.defaultTriggerHeight, enable::Bool=true)
7+
8+
const placements = Ahorn.PlacementDict(
9+
"Madeline Silhouette (Spring Collab 2020)" => Ahorn.EntityPlacement(
10+
MadelineSilhouetteTrigger,
11+
"rectangle"
12+
)
13+
)
14+
15+
end

SpringCollab2020Module.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ public override void Load() {
2828
FlagTouchSwitch.Load();
2929
DisableIcePhysicsTrigger.Load();
3030
MultiRoomStrawberrySeed.Load();
31+
MadelineSilhouetteTrigger.Load();
3132
}
3233

3334
public override void LoadContent(bool firstLoad) {
@@ -50,6 +51,7 @@ public override void Unload() {
5051
FlagTouchSwitch.Unload();
5152
DisableIcePhysicsTrigger.Unload();
5253
MultiRoomStrawberrySeed.Unload();
54+
MadelineSilhouetteTrigger.Unload();
5355
}
5456

5557
public override void PrepareMapDataProcessors(MapDataFixup context) {

SpringCollab2020Session.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,5 +13,7 @@ public class MultiRoomStrawberrySeedInfo {
1313
public bool IcePhysicsDisabled { get; set; } = false;
1414

1515
public List<MultiRoomStrawberrySeedInfo> CollectedMultiRoomStrawberrySeeds { get; set; } = new List<MultiRoomStrawberrySeedInfo>();
16+
17+
public bool MadelineIsSilhouette { get; set; } = false;
1618
}
1719
}
Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
using Celeste.Mod.Entities;
2+
using Microsoft.Xna.Framework;
3+
using Mono.Cecil.Cil;
4+
using Monocle;
5+
using MonoMod.Cil;
6+
using System;
7+
using System.Collections.Generic;
8+
using System.Linq;
9+
using System.Text;
10+
using System.Threading.Tasks;
11+
12+
namespace Celeste.Mod.SpringCollab2020.Triggers {
13+
[CustomEntity("SpringCollab2020/MadelineSilhouetteTrigger")]
14+
class MadelineSilhouetteTrigger : Trigger {
15+
public static void Load() {
16+
On.Celeste.Player.Added += onPlayerAdded;
17+
IL.Celeste.Player.Render += patchPlayerRender;
18+
}
19+
20+
public static void Unload() {
21+
On.Celeste.Player.Added -= onPlayerAdded;
22+
IL.Celeste.Player.Render -= patchPlayerRender;
23+
}
24+
25+
private static void onPlayerAdded(On.Celeste.Player.orig_Added orig, Player self, Scene scene) {
26+
if (SpringCollab2020Module.Instance.Session.MadelineIsSilhouette) {
27+
refreshPlayerSpriteMode(self, true);
28+
}
29+
30+
orig(self, scene);
31+
}
32+
33+
private static void patchPlayerRender(ILContext il) {
34+
ILCursor cursor = new ILCursor(il);
35+
36+
// jump to the usage of the White color
37+
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()");
39+
40+
// instead of calling Color.White, call getMadelineColor just below.
41+
cursor.Emit(OpCodes.Ldarg_0);
42+
cursor.Next.Operand = typeof(MadelineSilhouetteTrigger).GetMethod("GetMadelineColor");
43+
}
44+
}
45+
46+
public static Color GetMadelineColor(Player player) {
47+
if (SpringCollab2020Module.Instance.Session.MadelineIsSilhouette) {
48+
return player.Hair.Color;
49+
} else {
50+
return Color.White;
51+
}
52+
}
53+
54+
private static void refreshPlayerSpriteMode(Player player, bool enableSilhouette) {
55+
PlayerSpriteMode targetSpriteMode;
56+
if (enableSilhouette) {
57+
targetSpriteMode = PlayerSpriteMode.Playback;
58+
} else {
59+
targetSpriteMode = SaveData.Instance.Assists.PlayAsBadeline ? PlayerSpriteMode.MadelineAsBadeline : player.DefaultSpriteMode;
60+
}
61+
62+
if (player.Active) {
63+
player.ResetSpriteNextFrame(targetSpriteMode);
64+
} else {
65+
player.ResetSprite(targetSpriteMode);
66+
}
67+
}
68+
69+
70+
private bool enable;
71+
72+
public MadelineSilhouetteTrigger(EntityData data, Vector2 offset) : base(data, offset) {
73+
enable = data.Bool("enable", true);
74+
}
75+
76+
public override void OnEnter(Player player) {
77+
base.OnEnter(player);
78+
79+
bool oldValue = SpringCollab2020Module.Instance.Session.MadelineIsSilhouette;
80+
SpringCollab2020Module.Instance.Session.MadelineIsSilhouette = enable;
81+
82+
// if the value changed...
83+
if (oldValue != enable) {
84+
// switch modes right now. this uses the same way as turning the "Other Self" variant on.
85+
refreshPlayerSpriteMode(player, enable);
86+
}
87+
}
88+
}
89+
}

0 commit comments

Comments
 (0)