From ba63e2f65f9c903226d1ada3cae41a5e7738cdb5 Mon Sep 17 00:00:00 2001 From: Vesperlitune <104312459+cyrus0729@users.noreply.github.com> Date: Mon, 24 Aug 2026 16:29:49 +0800 Subject: [PATCH 1/2] change csproj to net 8 --- Code/IsaGrabBag.csproj | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/Code/IsaGrabBag.csproj b/Code/IsaGrabBag.csproj index cd5ab0c..130736d 100644 --- a/Code/IsaGrabBag.csproj +++ b/Code/IsaGrabBag.csproj @@ -1,7 +1,7 @@  - net7.0 + net8.0 IsaMods Celeste.Mod.IsaGrabBag latest @@ -11,31 +11,33 @@ - - + + - + + compile; build; native; contentfiles; analyzers; buildtransitive + - - - + + + - - + + - + $(MSBuildProjectDirectory)=IsaGrabBag/ - + None - + \ No newline at end of file From f5be9518d83ddaea0fd6d183f174c661c9432edb Mon Sep 17 00:00:00 2001 From: Vesperlitune <104312459+cyrus0729@users.noreply.github.com> Date: Mon, 24 Aug 2026 17:12:04 +0800 Subject: [PATCH 2/2] retexturable dream spinner split the files into 4 seperate ones and also made the textures not hardcoded so people can retexture it --- Code/DreamSpinner.cs | 99 +++++++++++------- .../isafriend/danger/crystal/dreamBorder.png | Bin 280 -> 0 bytes .../danger/crystal/dreamBorder_bg.png | Bin 0 -> 167 bytes .../danger/crystal/dreamBorder_fg.png | Bin 0 -> 229 bytes .../isafriend/danger/crystal/dreamSpinner.png | Bin 260 -> 0 bytes .../danger/crystal/dreamSpinner_bg.png | Bin 0 -> 152 bytes .../danger/crystal/dreamSpinner_fg.png | Bin 0 -> 205 bytes .../danger/crystal/fg_dreamspinner.png | Bin 10877 -> 342 bytes .../danger/crystal/fg_dreamspinner_fake.png | Bin 422 -> 317 bytes Loenn/entities/dream_spinner.lua | 2 + Loenn/entities/dream_spinner_fake.lua | 3 + 11 files changed, 67 insertions(+), 37 deletions(-) delete mode 100644 Graphics/Atlases/Gameplay/isafriend/danger/crystal/dreamBorder.png create mode 100644 Graphics/Atlases/Gameplay/isafriend/danger/crystal/dreamBorder_bg.png create mode 100644 Graphics/Atlases/Gameplay/isafriend/danger/crystal/dreamBorder_fg.png delete mode 100644 Graphics/Atlases/Gameplay/isafriend/danger/crystal/dreamSpinner.png create mode 100644 Graphics/Atlases/Gameplay/isafriend/danger/crystal/dreamSpinner_bg.png create mode 100644 Graphics/Atlases/Gameplay/isafriend/danger/crystal/dreamSpinner_fg.png diff --git a/Code/DreamSpinner.cs b/Code/DreamSpinner.cs index a32f826..f22ced8 100644 --- a/Code/DreamSpinner.cs +++ b/Code/DreamSpinner.cs @@ -1,18 +1,19 @@ using Celeste.Mod.Entities; using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Graphics; +using Mono.Cecil.Cil; using Monocle; using System.Collections.Generic; namespace Celeste.Mod.IsaGrabBag { - [Tracked] - [CustomEntity("isaBag/dreamSpinner", "isaBag/dreamSpinFake")] + [Tracked] [CustomEntity("isaBag/dreamSpinner", "isaBag/dreamSpinFake")] public class DreamSpinner : Entity { private static readonly Color debrisColor = Calc.HexToColor("c18a53"); public bool OneUse; public bool Fake; public bool ShouldRender; + public string imagePath; internal float rotation; internal Color color; @@ -22,28 +23,24 @@ public class DreamSpinner : Entity { private DreamBlock block; private bool hasCollided; - public DreamSpinner(Vector2 position, bool _useOnce, bool _fake) + public DreamSpinner(Vector2 position, bool _useOnce, bool _fake, string _imagePath) : base(position) { - Collider = new ColliderList(new Collider[] { - new Circle(6f, 0f, 0f), - new Hitbox(16f, 4f, -8f, -3f) - }); - + Collider = !_fake ? new ColliderList(new Circle(6f), new Hitbox(16f, 4f, -8f, -3f)) : null; Add(new PlayerCollider(OnPlayer)); Add(new LedgeBlocker()); OneUse = _useOnce; Fake = _fake; + imagePath = _imagePath; Depth = -8499; // Update just before our renderer Collidable = false; Visible = false; - rotation = Calc.Random.Choose(0, 1, 2, 3) * MathHelper.PiOver2; offsets = new List(); } public DreamSpinner(EntityData data, Vector2 offset) - : this(data.Position + offset, data.Bool("useOnce", false), _fake: data.Name == "isaBag/dreamSpinFake") { + : this(data.Position + offset, data.Bool("useOnce", false), _fake: data.Name == "isaBag/dreamSpinFake",data.Attr("texturePath", "isafriend/danger/crystal")) { ID = data.ID; } @@ -80,12 +77,12 @@ public override void Awake(Scene scene) { public override void Update() { if (Fake) { return; - } else if (!InView()) { + } + if (!InView()) { block.Active = false; return; - } else { - block.Active = true; } + block.Active = true; base.Update(); @@ -123,7 +120,7 @@ public override void Update() { } public bool InView() { - Camera camera = (Scene as Level).Camera; + Camera camera = SceneAs().Camera; return X > camera.X - 16f && Y > camera.Y - 16f && X < camera.X + 320f + 16f && Y < camera.Y + 180f + 16f; } @@ -144,10 +141,15 @@ public class DreamSpinnerRenderer : Entity { }; private readonly MTexture[] particleTextures; - private readonly MTexture fgSpinnerTexture; - private readonly MTexture bgSpinnerTexture; - private readonly MTexture fgBorderTexture; - private readonly MTexture bgBorderTexture; + private readonly Dictionary textureSets = new(); + + private class SpinnerTextures { + public MTexture FgSpinner; + public MTexture BgSpinner; + public MTexture FgBorder; + public MTexture BgBorder; + } + private VirtualRenderTarget dreamSpinnerTarget; private List spinnersToRender; @@ -160,17 +162,32 @@ public DreamSpinnerRenderer() { AddTag(Tags.Global | Tags.TransitionUpdate); Add(new BeforeRenderHook(BeforeRender)); - fgSpinnerTexture = GFX.Game["isafriend/danger/crystal/dreamSpinner"].GetSubtexture(0, 0, 24, 24); - bgSpinnerTexture = GFX.Game["isafriend/danger/crystal/dreamSpinner"].GetSubtexture(24, 0, 24, 24); - fgBorderTexture = GFX.Game["isafriend/danger/crystal/dreamBorder"].GetSubtexture(0, 0, 24, 24); - bgBorderTexture = GFX.Game["isafriend/danger/crystal/dreamBorder"].GetSubtexture(24, 0, 24, 24); - particleTextures = new MTexture[] { + particleTextures = [ GFX.Game["objects/dreamblock/particles"].GetSubtexture(14, 0, 7, 7), GFX.Game["objects/dreamblock/particles"].GetSubtexture(7, 0, 7, 7), GFX.Game["objects/dreamblock/particles"].GetSubtexture(0, 0, 7, 7), GFX.Game["objects/dreamblock/particles"].GetSubtexture(7, 0, 7, 7) - }; + ]; + + } + private SpinnerTextures GetTextures(string imagePath) { + if (imagePath == "") { + imagePath = "isafriend/danger/crystal"; + } + // handle backslashes because people can be dumb sometimes + imagePath = imagePath.Replace('\\', '/').TrimEnd('/'); + + // kind of hate this but its okay enough + if (!textureSets.TryGetValue(imagePath, out SpinnerTextures textures)) { + textures = new SpinnerTextures { FgSpinner = GFX.Game[$"{imagePath}/dreamSpinner_fg"], BgSpinner = GFX.Game[$"{imagePath}/dreamSpinner_bg"], + FgBorder = GFX.Game[$"{imagePath}/dreamBorder_fg"], BgBorder = GFX.Game[$"{imagePath}/dreamBorder_bg"] }; + textureSets[imagePath] = textures; + } + + return textures; + } + public override void Awake(Scene scene) { base.Awake(scene); @@ -260,13 +277,31 @@ private void BeforeRender() { private void DrawSpinnerTextures() { foreach (DreamSpinner spinner in spinnersToRender) { - fgSpinnerTexture.Draw(spinner.Position, origin, spinner.color, Vector2.One, spinner.rotation); + SpinnerTextures textures = GetTextures(spinner.imagePath); + + textures.FgSpinner.Draw(spinner.Position, origin, spinner.color, Vector2.One, spinner.rotation); + + foreach (Vector2 bgOffset in spinner.offsets) { + textures.BgSpinner.Draw(bgOffset, origin, spinner.color); + } + } + } + + private void DrawSpinnerBorders() { + foreach (DreamSpinner spinner in spinnersToRender) { + SpinnerTextures textures = GetTextures(spinner.imagePath); + + Color borderColor = !dreamDashEnabled ? Color.Gray : spinner.OneUse ? Color.Orange * 0.9f : Color.White; + + textures.FgBorder.Draw(spinner.Position, origin, borderColor, Vector2.One, spinner.rotation); + foreach (Vector2 bgOffset in spinner.offsets) { - bgSpinnerTexture.Draw(bgOffset, origin, spinner.color); + textures.BgBorder.Draw(bgOffset, origin, borderColor); } } } + private void DrawDreamParticles(Vector2 cameraPos) { for (int i = 0; i < particles.Length; i++) { int layer = particles[i].Layer; @@ -288,16 +323,6 @@ private void DrawDreamParticles(Vector2 cameraPos) { } } - private void DrawSpinnerBorders() { - foreach (DreamSpinner spinner in spinnersToRender) { - Color borderColor = !dreamDashEnabled ? Color.Gray : spinner.OneUse ? Color.Orange * 0.9f : Color.White; - fgBorderTexture.Draw(spinner.Position, origin, borderColor, Vector2.One, spinner.rotation); - foreach (Vector2 bgOffset in spinner.offsets) { - bgBorderTexture.Draw(bgOffset, origin, borderColor); - } - } - } - private List GetSpinnersToRender() { List spinnersToRender = new(); foreach (DreamSpinner spinner in Scene.Tracker.GetEntities()) { @@ -323,4 +348,4 @@ public struct DreamParticle { public float TimeOffset; } } -} +} \ No newline at end of file diff --git a/Graphics/Atlases/Gameplay/isafriend/danger/crystal/dreamBorder.png b/Graphics/Atlases/Gameplay/isafriend/danger/crystal/dreamBorder.png deleted file mode 100644 index dd8a4b3a59561a3ddd87a064754e8d5b531a7dd7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 280 zcmV+z0q6dSP)Px#(n&-?R9J=WS4k4YAP5xy|7UV?%5g-R#h9v09}{evEs|2+1ZL*b8b%Om*o!A3 z_}p&P(*mLp1L!lZwa&@bnzjNWsI^gcYcVrhc-#R@$(#X5{t&*j8ORo|y=(Xhz*@rb zELuI(R*QE!7TJ1sC3 emYV diff --git a/Graphics/Atlases/Gameplay/isafriend/danger/crystal/dreamBorder_bg.png b/Graphics/Atlases/Gameplay/isafriend/danger/crystal/dreamBorder_bg.png new file mode 100644 index 0000000000000000000000000000000000000000..9c2208e3e2a266e2acaa1e6f40b6612224861e5a GIT binary patch literal 167 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjjKx9jP7LeL$-D$|5 zdSxs$^Oc*{(uT?PEc;RvI4z7Dn#=SZxexNlOusN;ZkeOj?m6=p?wrBi{ZU1vb#|X2 P&@u*3S3j3^P6dpWEi^?UBHE?LOr`qZoeo0hZw^g5$VUy{WWIvaOyR>fyhN&gIxzU|g zYPUB_CA;rr_q%UBIPx#zDYzuR9J=WmeCG?AP7aZ_5Z(256#Un#fzY3^E|btmkXp6!eJwbh*o>xT&oRO z`ELUG=Tdu?-pxYn0Fs2ad97ab5Q;HYbr5Q?5Zz)2h={DFP^3a3MRe&v2yeC09wd3M z4!hk#8uOZUEpBdLH;PrTCWBTNjU(x~o&nAJp=V&m=j3$;M3EV@pcSK~E8apHQ@vfY zcEZ$wJh=86Eydz{k%0;&kVJSwv!=B~bC7Y9UohRx$iL9TVG$2(l8^Gm-VCDv0000< KMNUMnLSTY(&~ADF diff --git a/Graphics/Atlases/Gameplay/isafriend/danger/crystal/dreamSpinner_bg.png b/Graphics/Atlases/Gameplay/isafriend/danger/crystal/dreamSpinner_bg.png new file mode 100644 index 0000000000000000000000000000000000000000..2f0f27218fa911ac59d54b79e45e0028bfea206a GIT binary patch literal 152 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjjKx9jP7LeL$-D$|f;?RuLp(a) zPI6>o5a3{W`oBI-K0y0W>T|7SIcqsT$}pU`a{J`sG`IJcnXVa5-qAjDeTPcz_RXO& zj-vlrZkGCRuQJ-PZ<$H+Do>5go~w$4l+qYpwkq%*J+AN=XgY(ZtDnm{r-UW|z3Vkm literal 0 HcmV?d00001 diff --git a/Graphics/Atlases/Gameplay/isafriend/danger/crystal/dreamSpinner_fg.png b/Graphics/Atlases/Gameplay/isafriend/danger/crystal/dreamSpinner_fg.png new file mode 100644 index 0000000000000000000000000000000000000000..c80da9303515372ce18a08f3f335e84b1ed1ee45 GIT binary patch literal 205 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjjKx9jP7LeL$-D$|+C5zyLp(a) zPVweCV8G$B^~t~Rd3jL<55;*!E=4|V{%m5XXywHa(7W^7l25D+HhkG{*0wh2sO%Cy zH^V(C?Xvq?28KNgy4-GIGw;gHPX0cz`vu7144$rjF6*2UngD;F BO)dZc literal 0 HcmV?d00001 diff --git a/Graphics/Atlases/Gameplay/isafriend/danger/crystal/fg_dreamspinner.png b/Graphics/Atlases/Gameplay/isafriend/danger/crystal/fg_dreamspinner.png index deb574f27d2a05faebff4bb04054e55e6bd34bfd..fc4cf72105105a1dd3d91a70241d530e3282dcaf 100644 GIT binary patch delta 316 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 Tju}TT00000NkvXXu0mjf-Dnc? diff --git a/Graphics/Atlases/Gameplay/isafriend/danger/crystal/fg_dreamspinner_fake.png b/Graphics/Atlases/Gameplay/isafriend/danger/crystal/fg_dreamspinner_fake.png index 57ff9e0bb5e7408a69d3b828634e9eeda7b06b1e..b9a76d08e006a8ddae44fa61f98c1b0749795dd1 100644 GIT binary patch delta 278 zcmV+x0qOpx1HA%}Fn<8|Nklttmk;qJuK)l507*qoM6N<$f|z80YybcN delta 383 zcmV-_0f7F!0;U6yFniWH6f-~6#N4h=ao0Id3+FcZwoL^PWttYjA= z;MM&Lm^sYRda?_iczJ;a_g| zVN*^XJ{pibWOzRXDY$ib+Ks>k)$3pV1{+*7*Vpa7=Ws!-)AW;AS002ovPDHLkV1f^6t33b! diff --git a/Loenn/entities/dream_spinner.lua b/Loenn/entities/dream_spinner.lua index bacca2b..7a8b320 100644 --- a/Loenn/entities/dream_spinner.lua +++ b/Loenn/entities/dream_spinner.lua @@ -9,12 +9,14 @@ dreamSpinner.placements = { { name = "default", data = { + texturePath = "isafriend/danger/crystal", useOnce = false } }, { name = "oneUse", data = { + texturePath = "isafriend/danger/crystal", useOnce = true } } diff --git a/Loenn/entities/dream_spinner_fake.lua b/Loenn/entities/dream_spinner_fake.lua index 6db7e84..ed3aea1 100644 --- a/Loenn/entities/dream_spinner_fake.lua +++ b/Loenn/entities/dream_spinner_fake.lua @@ -6,6 +6,9 @@ dreamSpinnerFake.name = "isaBag/dreamSpinFake" dreamSpinnerFake.depth = -8500 dreamSpinnerFake.placements = { name = "default", + data = { + texturePath = "isafriend/danger/crystal" + } } dreamSpinnerFake.texture = "isafriend/danger/crystal/fg_dreamspinner_fake"