Skip to content

Commit e4ecf94

Browse files
committed
Add an option for the seeds to ignore lighting
1 parent 71e37fa commit e4ecf94

File tree

9 files changed

+59
-5
lines changed

9 files changed

+59
-5
lines changed

Ahorn/entities/multiRoomStrawberry.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
using ..Ahorn, Maple
44

55
@mapdef Entity "SpringCollab2020/MultiRoomStrawberry" MultiRoomStrawberry(x::Integer, y::Integer,
6-
name::String="multi_room_strawberry",winged::Bool=false, moon::Bool=false, checkpointID::Integer=-1, order::Integer=-1)
6+
name::String="multi_room_strawberry", winged::Bool=false, moon::Bool=false, checkpointID::Integer=-1, order::Integer=-1)
77

88
const placements = Ahorn.PlacementDict(
99
"Multi-Room Strawberry (Spring Collab 2020)" => Ahorn.EntityPlacement(

Ahorn/entities/multiRoomStrawberrySeed.jl

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,10 @@
33
using ..Ahorn, Maple
44

55
@mapdef Entity "SpringCollab2020/MultiRoomStrawberrySeed" MultiRoomStrawberrySeed(x::Integer, y::Integer,
6-
strawberryName::String="multi_room_strawberry", sprite::String="strawberry/seed", ghostSprite::String="ghostberry/seed", index::Int=-1)
6+
strawberryName::String="multi_room_strawberry", sprite::String="strawberry/seed", ghostSprite::String="ghostberry/seed", index::Int=-1, ignoreLighting::Bool=false)
7+
8+
const bundledSprites = String["strawberry/seed", "SpringCollab2020/miniberry/miniberry"]
9+
const bundledGhostSprites = String["ghostberry/seed", "SpringCollab2020/miniberry/ghostminiberry"]
710

811
const placements = Ahorn.PlacementDict(
912
"Multi-Room Strawberry Seed (Spring Collab 2020)" => Ahorn.EntityPlacement(
@@ -12,6 +15,11 @@ const placements = Ahorn.PlacementDict(
1215
)
1316

1417

18+
Ahorn.editingOptions(entity::MultiRoomStrawberrySeed) = Dict{String,Any}(
19+
"sprite" => bundledSprites,
20+
"ghostSprite" => bundledGhostSprites
21+
)
22+
1523
function Ahorn.selection(entity::MultiRoomStrawberrySeed)
1624
x, y = Ahorn.position(entity)
1725
sprite = "collectables/" * get(entity.data, "sprite", "strawberry/seed") * "00"

Ahorn/lang/en_gb.lang

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -146,3 +146,17 @@ placements.entities.SpringCollab2020/MultiNodeMovingPlatform.tooltips.pauseTime=
146146
placements.entities.SpringCollab2020/MultiNodeMovingPlatform.tooltips.mode=Determines the way the platform will move between its nodes. For example, with 3 nodes A, B, C:\n- Loop: A > B > C > A\n- LoopNoPause: A > A (going through B and C)\n- BackAndForth: A > B > C > B > A\n- BackAndForthNoPause: A > C > A (going through B)\n- TeleportBack: A > B > C, then the platform teleports to A upon reaching C
147147
placements.entities.SpringCollab2020/MultiNodeMovingPlatform.tooltips.texture=What texture to use for the platform.
148148
placements.entities.SpringCollab2020/MultiNodeMovingPlatform.tooltips.easing=Whether the platform movement should be eased (speedup/slowdown around each position).
149+
150+
# Multi-Room Strawberry Seed
151+
placements.entities.SpringCollab2020/MultiRoomStrawberrySeed.tooltips.strawberryName=The name of the strawberry this seed belongs to.
152+
placements.entities.SpringCollab2020/MultiRoomStrawberrySeed.tooltips.sprite=The path to the sprite folder (relative to Graphics/Atlas/Gameplay/collectables).
153+
placements.entities.SpringCollab2020/MultiRoomStrawberrySeed.tooltips.ghostSprite=The path to the sprite folder (relative to Graphics/Atlas/Gameplay/collectables) used when the strawberry is already collected.
154+
placements.entities.SpringCollab2020/MultiRoomStrawberrySeed.tooltips.index=The order for this seed (determines the sound played on collection). If left to -1, Everest will auto-assign it.
155+
placements.entities.SpringCollab2020/MultiRoomStrawberrySeed.tooltips.ignoreLighting=If checked, the berry seed will appear bright at all times, even if the room is dark.
156+
157+
# Multi-Room Strawberry
158+
placements.entities.SpringCollab2020/MultiRoomStrawberry.tooltips.name=The strawberry name, used to pair it with its seeds.
159+
placements.entities.SpringCollab2020/MultiRoomStrawberry.tooltips.winged=The strawberry attempts to vertically rise offscreen when the player dashes.
160+
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)
161+
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)
162+
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.

Entities/MultiRoomStrawberrySeed.cs

Lines changed: 34 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,22 @@
11
using Celeste.Mod.Entities;
22
using Microsoft.Xna.Framework;
3+
using Microsoft.Xna.Framework.Graphics;
34
using Monocle;
45
using System;
56
using System.Reflection;
67

78
namespace Celeste.Mod.SpringCollab2020.Entities {
89
[CustomEntity("SpringCollab2020/MultiRoomStrawberrySeed")]
10+
[Tracked]
911
class MultiRoomStrawberrySeed : StrawberrySeed {
1012
public static void Load() {
1113
On.Celeste.Level.LoadLevel += onLoadLevel;
14+
On.Celeste.LightingRenderer.BeforeRender += onLightingBeforeRender;
1215
}
1316

1417
public static void Unload() {
1518
On.Celeste.Level.LoadLevel -= onLoadLevel;
19+
On.Celeste.LightingRenderer.BeforeRender -= onLightingBeforeRender;
1620
}
1721

1822
private static void onLoadLevel(On.Celeste.Level.orig_LoadLevel orig, Level self, Player.IntroTypes playerIntro, bool isFromLoader) {
@@ -34,6 +38,20 @@ private static void onLoadLevel(On.Celeste.Level.orig_LoadLevel orig, Level self
3438
}
3539
}
3640

41+
private static void onLightingBeforeRender(On.Celeste.LightingRenderer.orig_BeforeRender orig, LightingRenderer self, Scene scene) {
42+
orig(self, scene);
43+
44+
Draw.SpriteBatch.GraphicsDevice.SetRenderTarget(GameplayBuffers.Light);
45+
Draw.SpriteBatch.Begin(SpriteSortMode.Deferred, BlendState.AlphaBlend, SamplerState.PointClamp, DepthStencilState.None, RasterizerState.CullNone, null, Matrix.Identity);
46+
foreach (MultiRoomStrawberrySeed seed in scene.Tracker.GetEntities<MultiRoomStrawberrySeed>()) {
47+
if (seed.cutoutTexture != null) {
48+
Draw.SpriteBatch.Draw(seed.cutoutTexture.Texture.Texture, seed.Position + seed.spriteObject.Position - (scene as Level).Camera.Position
49+
- new Vector2(seed.cutoutTexture.Width / 2, seed.cutoutTexture.Height / 2), Color.White);
50+
}
51+
}
52+
Draw.SpriteBatch.End();
53+
}
54+
3755
private static FieldInfo seedFollower = typeof(StrawberrySeed).GetField("follower", BindingFlags.NonPublic | BindingFlags.Instance);
3856
private static FieldInfo seedCanLoseTimer = typeof(StrawberrySeed).GetField("canLoseTimer", BindingFlags.NonPublic | BindingFlags.Instance);
3957
private static FieldInfo seedSprite = typeof(StrawberrySeed).GetField("sprite", BindingFlags.NonPublic | BindingFlags.Instance);
@@ -48,11 +66,18 @@ private static void onLoadLevel(On.Celeste.Level.orig_LoadLevel orig, Level self
4866
private string sprite;
4967
private bool ghost;
5068

51-
public MultiRoomStrawberrySeed(Vector2 position, int index, bool ghost, string sprite, string ghostSprite) : base(null, position, index, ghost) {
69+
private Sprite spriteObject;
70+
private MTexture cutoutTexture;
71+
72+
public MultiRoomStrawberrySeed(Vector2 position, int index, bool ghost, string sprite, string ghostSprite, bool ignoreLighting) : base(null, position, index, ghost) {
5273
this.index = index;
5374
this.ghost = ghost;
5475
this.sprite = ghost ? ghostSprite : sprite;
5576

77+
if (ignoreLighting) {
78+
cutoutTexture = GFX.Game["collectables/" + sprite + "_cutout"];
79+
}
80+
5681
foreach (Component component in this) {
5782
if (component is PlayerCollider playerCollider) {
5883
playerCollider.OnCollide = OnPlayer;
@@ -62,19 +87,21 @@ public MultiRoomStrawberrySeed(Vector2 position, int index, bool ghost, string s
6287

6388
public MultiRoomStrawberrySeed(EntityData data, Vector2 offset) : this(data.Position + offset, data.Int("index"),
6489
SaveData.Instance.CheckStrawberry(new EntityID(data.Attr("berryLevel"), data.Int("berryID"))),
65-
data.Attr("sprite", "strawberry/seed"), data.Attr("ghostSprite", "ghostberry/seed")) {
90+
data.Attr("sprite", "strawberry/seed"), data.Attr("ghostSprite", "ghostberry/seed"), data.Bool("ignoreLighting")) {
6691

6792
BerryID = new EntityID(data.Attr("berryLevel"), data.Int("berryID"));
6893
}
6994

7095
private MultiRoomStrawberrySeed(Player player, Vector2 position, SpringCollab2020Session.MultiRoomStrawberrySeedInfo sessionSeedInfo)
71-
: this(position, sessionSeedInfo.Index, SaveData.Instance.CheckStrawberry(sessionSeedInfo.BerryID), sessionSeedInfo.Sprite, sessionSeedInfo.Sprite) {
96+
: this(position, sessionSeedInfo.Index, SaveData.Instance.CheckStrawberry(sessionSeedInfo.BerryID), sessionSeedInfo.Sprite, sessionSeedInfo.Sprite, sessionSeedInfo.IgnoreLighting) {
7297

7398
BerryID = sessionSeedInfo.BerryID;
7499

75100
// the seed is collected right away.
76101
this.player = player;
77102
spawnedAsFollower = true;
103+
104+
Add(new EffectCutout());
78105
}
79106

80107
public override void Added(Scene scene) {
@@ -136,6 +163,9 @@ public override void Awake(Scene scene) {
136163
Depth = -1000000;
137164
AddTag(Tags.Persistent);
138165
}
166+
167+
// get a reference to the sprite. this will be used to "cut out" the lighting renderer.
168+
spriteObject = (Sprite) seedSprite.GetValue(this);
139169
}
140170

141171
private void OnPlayer(Player player) {
@@ -151,6 +181,7 @@ private void OnPlayer(Player player) {
151181
sessionSeedInfo.Index = index;
152182
sessionSeedInfo.BerryID = BerryID;
153183
sessionSeedInfo.Sprite = sprite;
184+
sessionSeedInfo.IgnoreLighting = (cutoutTexture != null);
154185
SpringCollab2020Module.Instance.Session.CollectedMultiRoomStrawberrySeeds.Add(sessionSeedInfo);
155186
}
156187

165 Bytes
Loading
165 Bytes
Loading
178 Bytes
Loading
178 Bytes
Loading

SpringCollab2020Session.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ public class MultiRoomStrawberrySeedInfo {
77
public int Index { get; set; }
88
public EntityID BerryID { get; set; }
99
public string Sprite { get; set; }
10+
public bool IgnoreLighting { get; set; }
1011
}
1112

1213
public bool IcePhysicsDisabled { get; set; } = false;

0 commit comments

Comments
 (0)