Skip to content

Commit c287e3f

Browse files
committed
Merge branch 'master' into multiple_room_seeded_berry
2 parents 13a8c99 + a9a38ce commit c287e3f

File tree

9 files changed

+569
-2
lines changed

9 files changed

+569
-2
lines changed
Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
module SpringCollab2020CassetteFriendlyStrawberry
2+
3+
using ..Ahorn, Maple
4+
5+
@mapdef Entity "SpringCollab2020/CassetteFriendlyStrawberry" CassetteFriendlyStrawberry(x::Integer, y::Integer, winged::Bool=false, moon::Bool=false,
6+
checkpointID::Integer=-1, order::Integer=-1, nodes::Array{Tuple{Integer, Integer}, 1}=Tuple{Integer, Integer}[])
7+
8+
const placements = Ahorn.PlacementDict(
9+
"Cassette-Friendly Strawberry (Spring Collab 2020)" => Ahorn.EntityPlacement(
10+
CassetteFriendlyStrawberry
11+
)
12+
)
13+
14+
# winged, has pips, moon
15+
sprites = Dict{Tuple{Bool, Bool, Bool}, String}(
16+
(false, false, false) => "collectables/strawberry/normal00",
17+
(true, false, false) => "collectables/strawberry/wings01",
18+
(false, true, false) => "collectables/ghostberry/idle00",
19+
(true, true, false) => "collectables/ghostberry/wings01",
20+
21+
(false, false, true) => "collectables/moonBerry/normal00",
22+
(true, false, true) => "collectables/moonBerry/ghost00",
23+
(false, true, true) => "collectables/moonBerry/ghost00",
24+
(true, true, true) => "collectables/moonBerry/ghost00"
25+
)
26+
27+
seedSprite = "collectables/strawberry/seed00"
28+
29+
Ahorn.nodeLimits(entity::CassetteFriendlyStrawberry) = 0, -1
30+
31+
function Ahorn.selection(entity::CassetteFriendlyStrawberry)
32+
x, y = Ahorn.position(entity)
33+
34+
nodes = get(entity.data, "nodes", ())
35+
moon = get(entity.data, "moon", false)
36+
winged = get(entity.data, "winged", false)
37+
hasPips = length(nodes) > 0
38+
39+
sprite = sprites[(winged, hasPips, moon)]
40+
41+
res = Ahorn.Rectangle[Ahorn.getSpriteRectangle(sprite, x, y)]
42+
43+
for node in nodes
44+
nx, ny = node
45+
46+
push!(res, Ahorn.getSpriteRectangle(seedSprite, nx, ny))
47+
end
48+
49+
return res
50+
end
51+
52+
function Ahorn.renderSelectedAbs(ctx::Ahorn.Cairo.CairoContext, entity::CassetteFriendlyStrawberry)
53+
x, y = Ahorn.position(entity)
54+
55+
for node in get(entity.data, "nodes", ())
56+
nx, ny = node
57+
58+
Ahorn.drawLines(ctx, Tuple{Number, Number}[(x, y), (nx, ny)], Ahorn.colors.selection_selected_fc)
59+
end
60+
end
61+
62+
function Ahorn.renderAbs(ctx::Ahorn.Cairo.CairoContext, entity::CassetteFriendlyStrawberry, room::Maple.Room)
63+
x, y = Ahorn.position(entity)
64+
65+
nodes = get(entity.data, "nodes", ())
66+
moon = get(entity.data, "moon", false)
67+
winged = get(entity.data, "winged", false)
68+
hasPips = length(nodes) > 0
69+
70+
sprite = sprites[(winged, hasPips, moon)]
71+
72+
for node in nodes
73+
nx, ny = node
74+
75+
Ahorn.drawSprite(ctx, seedSprite, nx, ny)
76+
end
77+
78+
Ahorn.drawSprite(ctx, sprite, x, y)
79+
end
80+
81+
end

Ahorn/entities/trollStrawberry.jl

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
module SpringCollab2020TrollStrawberry
2+
3+
using ..Ahorn, Maple
4+
5+
@mapdef Entity "SpringCollab2020/trollStrawberry" TrollStrawberry(x::Integer, y::Integer, winged::Bool=false)
6+
7+
const placements = Ahorn.PlacementDict(
8+
"Troll Strawberry (Spring Collab 2020)" => Ahorn.EntityPlacement(
9+
TrollStrawberry
10+
),
11+
12+
"Troll Strawberry (Winged) (Spring Collab 2020)" => Ahorn.EntityPlacement(
13+
TrollStrawberry,
14+
"point",
15+
Dict{String, Any}(
16+
"winged" => true
17+
)
18+
),
19+
)
20+
21+
# name, winged
22+
sprites = Dict{Tuple{String, Bool}, String}(
23+
("SpringCollab2020/trollStrawberry", false) => "collectables/strawberry/normal00",
24+
("SpringCollab2020/trollStrawberry", true) => "collectables/strawberry/wings01",
25+
)
26+
27+
fallback = "collectables/strawberry/normal00"
28+
29+
Ahorn.nodeLimits(entity::TrollStrawberry) = 0, -1
30+
31+
function Ahorn.selection(entity::TrollStrawberry)
32+
x, y = Ahorn.position(entity)
33+
34+
winged = get(entity.data, "winged", false)
35+
36+
sprite = sprites[(entity.name, winged)]
37+
38+
res = Ahorn.Rectangle[Ahorn.getSpriteRectangle(sprite, x, y)]
39+
40+
return res
41+
end
42+
43+
function Ahorn.renderSelectedAbs(ctx::Ahorn.Cairo.CairoContext, entity::TrollStrawberry)
44+
45+
end
46+
47+
function Ahorn.renderAbs(ctx::Ahorn.Cairo.CairoContext, entity::TrollStrawberry, room::Maple.Room)
48+
x, y = Ahorn.position(entity)
49+
50+
winged = get(entity.data, "winged", false)
51+
52+
sprite = sprites[(entity.name, winged)]
53+
54+
Ahorn.drawSprite(ctx, sprite, x, y)
55+
end
56+
57+
end

Ahorn/lang/en_gb.lang

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,13 @@ placements.entities.SpringCollab2020/LightningDashSwitch.tooltips.persistent=Whe
2020
# Cave Wall
2121
placements.entities.SpringCollab2020/caveWall.tooltips.tiletype=Changes the visual appearance of the wall.
2222

23+
# Lightning Strike Trigger
24+
placements.triggers.SpringCollab2020/LightningStrikeTrigger.tooltips.playerOffset=The X offset of the lightning relative to the player's position.
25+
placements.triggers.SpringCollab2020/LightningStrikeTrigger.tooltips.seed=The seed for the randomizer which generates the lightning strike.
26+
placements.triggers.SpringCollab2020/LightningStrikeTrigger.tooltips.delay=The delay, in seconds, between the player entering the trigger and the appearance of the lightning strike.
27+
placements.triggers.SpringCollab2020/LightningStrikeTrigger.tooltips.rain=Upon lightning strike, rain will begin falling in the level.
28+
placements.triggers.SpringCollab2020/LightningStrikeTrigger.tooltips.flash=Upon lightning strike, the screen will flash white.
29+
2330
# Variable Crumble Blocks
2431
placements.entities.SpringCollab2020/variableCrumbleBlock.tooltips.texture=The texture of the blocks that are crumbling.2
2532
placements.entities.SpringCollab2020/variableCrumbleBlock.tooltips.timer=How long the blocks will shake for before falling.
@@ -140,13 +147,22 @@ placements.entities.SpringCollab2020/CustomBirdTutorial.tooltips.controls=The co
140147
placements.triggers.SpringCollab2020/CustomBirdTutorialTrigger.tooltips.birdId=The ID of the bird this trigger is controlling.
141148
placements.triggers.SpringCollab2020/CustomBirdTutorialTrigger.tooltips.showTutorial=If checked, the trigger will make the bird show the tutorial bubble. If unchecked, the trigger will make the bird fly away.
142149

150+
# Troll Strawberry
151+
placements.entities.SpringCollab2020/trollStrawberry.tooltips.winged=The strawberry attempts to vertically rise offscreen when the player dashes.
152+
143153
# Multi-Node Moving Platform
144154
placements.entities.SpringCollab2020/MultiNodeMovingPlatform.tooltips.moveTime=The time the platform takes to move between two successive positions. Default is 2 seconds.
145155
placements.entities.SpringCollab2020/MultiNodeMovingPlatform.tooltips.pauseTime=The time the platform stops at each position. Default is 0 seconds.
146156
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
147157
placements.entities.SpringCollab2020/MultiNodeMovingPlatform.tooltips.texture=What texture to use for the platform.
148158
placements.entities.SpringCollab2020/MultiNodeMovingPlatform.tooltips.easing=Whether the platform movement should be eased (speedup/slowdown around each position).
149159

160+
# Cassette-Friendly Strawberry
161+
placements.entities.SpringCollab2020/CassetteFriendlyStrawberry.tooltips.winged=The strawberry attempts to vertically rise offscreen when the player dashes.
162+
placements.entities.SpringCollab2020/CassetteFriendlyStrawberry.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)
163+
placements.entities.SpringCollab2020/CassetteFriendlyStrawberry.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)
164+
placements.entities.SpringCollab2020/CassetteFriendlyStrawberry.tooltips.moon=Makes the strawberry render as a space berry.\nDoes not work with wings or nodes in the base game.
165+
150166
# Multi-Room Strawberry Seed
151167
placements.entities.SpringCollab2020/MultiRoomStrawberrySeed.tooltips.strawberryName=The name of the strawberry this seed belongs to.
152168
placements.entities.SpringCollab2020/MultiRoomStrawberrySeed.tooltips.sprite=The path to the sprite folder (relative to Graphics/Atlas/Gameplay/collectables).
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
module SpringCollab2020LightningStrikeTrigger
2+
3+
using ..Ahorn, Maple
4+
5+
@mapdef Trigger "SpringCollab2020/LightningStrikeTrigger" LightningStrikeTrigger(x::Integer, y::Integer, width::Integer=Maple.defaultTriggerWidth, height::Integer=Maple.defaultTriggerHeight, playerOffset::Number=0.0, seed::Integer=0, delay::Number=0.0, rain::Bool=true, flash::Bool=true)
6+
7+
const placements = Ahorn.PlacementDict(
8+
"Lightning Strike (Spring Collab 2020)" => Ahorn.EntityPlacement(
9+
LightningStrikeTrigger,
10+
"rectangle",
11+
),
12+
)
13+
14+
end
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
using Celeste.Mod.Entities;
2+
using Microsoft.Xna.Framework;
3+
using System.Collections.Generic;
4+
5+
namespace Celeste.Mod.SpringCollab2020.Entities {
6+
/// <summary>
7+
/// Just a strawberry with cassette-friendly strawberry seeds.
8+
/// </summary>
9+
[CustomEntity("SpringCollab2020/CassetteFriendlyStrawberry")]
10+
[RegisterStrawberry(true, false)]
11+
class CassetteFriendlyStrawberry : Strawberry {
12+
public CassetteFriendlyStrawberry(EntityData data, Vector2 offset, EntityID gid) : base(data, offset, gid) {
13+
bool isGhostBerry = SaveData.Instance.CheckStrawberry(ID);
14+
15+
// we just want to create cassette-friendly strawberry seeds to replace vanilla seeds.
16+
if (data.Nodes != null && data.Nodes.Length != 0) {
17+
Seeds = new List<StrawberrySeed>();
18+
for (int i = 0; i < data.Nodes.Length; i++) {
19+
Seeds.Add(new CassetteFriendlyStrawberrySeed(this, offset + data.Nodes[i], i, isGhostBerry));
20+
}
21+
}
22+
}
23+
}
24+
}
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
using Microsoft.Xna.Framework;
2+
using Monocle;
3+
using System.Linq;
4+
5+
namespace Celeste.Mod.SpringCollab2020.Entities {
6+
/// <summary>
7+
/// Strawberry seeds that deal nicer with being hidden in cassette blocks.
8+
/// - Their depth is adjusted to appear in front of disabled cassette blocks, but behind enabled ones.
9+
/// - They are not "attached", meaning they won't disappear when the cassette block disappears.
10+
/// </summary>
11+
class CassetteFriendlyStrawberrySeed : StrawberrySeed {
12+
13+
private bool isInCassetteBlock;
14+
15+
public CassetteFriendlyStrawberrySeed(Strawberry strawberry, Vector2 position, int index, bool ghost)
16+
: base(strawberry, position, index, ghost) { }
17+
18+
public override void Added(Scene scene) {
19+
if (scene.Entities.OfType<CassetteBlock>().Any(block => block.Collider.Bounds.Contains(Collider.Bounds))) {
20+
// our seed is entirely inside a cassette block: look for the static mover.
21+
foreach (Component component in this) {
22+
if (component is StaticMover mover) {
23+
Remove(mover); // get rid of behavior like "disappear with cassette block" or "get double-size hitbox"
24+
Depth = 11; // display just below active cassette blocks
25+
isInCassetteBlock = true;
26+
break;
27+
}
28+
}
29+
}
30+
31+
base.Added(scene);
32+
}
33+
34+
public override void Update() {
35+
base.Update();
36+
37+
if (isInCassetteBlock && !Visible) {
38+
Depth = 11; // reset depth when losing the seed
39+
}
40+
}
41+
}
42+
}

Entities/MultiRoomStrawberrySeed.cs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,6 @@
33
using Microsoft.Xna.Framework.Graphics;
44
using Monocle;
55
using MonoMod.Utils;
6-
using System;
7-
using System.Reflection;
86

97
namespace Celeste.Mod.SpringCollab2020.Entities {
108
[CustomEntity("SpringCollab2020/MultiRoomStrawberrySeed")]

0 commit comments

Comments
 (0)