From ed9e83951be27b958ae2761dc4b7650dc1ea6f49 Mon Sep 17 00:00:00 2001 From: Sharivan Date: Mon, 27 Mar 2023 08:09:42 -0300 Subject: [PATCH] - Rebalanced Penguin RNG again. - Changed sprite rendering priority system to render first to last again instead doing it in reverse order. Sprite class now have a property named Priority which indicates its rendering priority in its containing layer, lower values indicates lower priority and therefore will be rendered first, while high values indicate higher priority, rendering last and thus displaying ahead of lower priority sprites. New methods named BringToFront and SendToBack has been added to Sprite class to, these methods can be called to make sprite with highest or lowest priority, respectively. - Baed on the update above, an update was needed in the class AxeMaxTrunk to keep it rendering always with lower priority. --- .../Entities/Enemies/Amenhopper/Amenhopper.cs | 5 + .../Entities/Enemies/AxeMax/AxeMaxTrunk.cs | 2 + XSharp/Engine/Entities/Enemies/BallDeVoux.cs | 5 + XSharp/Engine/Entities/Enemies/BattonM501.cs | 5 + .../ArmoredArmadillo/ArmoredArmadillo.cs | 5 + .../Bosses/BoomerKuwanger/BoomerKuwanger.cs | 5 + .../Enemies/Bosses/Bosspider/Bosspider.cs | 5 + .../Enemies/Bosses/Bosspider/Petitpider.cs | 5 + .../Bosses/ChillPenguin/ChillPenguin.cs | 48 ++-- .../Entities/Enemies/Bosses/DRex/DRex.cs | 5 + .../Bosses/FlameMammoth/FlameMammoth.cs | 5 + .../Bosses/LauchOctupus/LauchOctupus.cs | 5 + .../Bosses/RangdaBangda/RangdaBangda.cs | 5 + .../Entities/Enemies/Bosses/Sigma/CapSigma.cs | 5 + .../Enemies/Bosses/Sigma/JediSigma.cs | 5 + .../Enemies/Bosses/Sigma/KaiserSigma.cs | 5 + .../Entities/Enemies/Bosses/Sigma/NeoSigma.cs | 5 + .../Enemies/Bosses/Sigma/SigmaVirus.cs | 5 + .../Enemies/Bosses/Sigma/WolfSigma.cs | 5 + .../Bosses/SparkMandrill/SparkMandrill.cs | 5 + .../Bosses/StingChameleon/StingChameleon.cs | 5 + .../Enemies/Bosses/StormEagle/StormEagle.cs | 5 + .../Enemies/Bosses/Velguarder/Velguarder.cs | 5 + .../Entities/Enemies/Bosses/Vile/Vile.cs | 5 + XSharp/Engine/Entities/Enemies/CragMan.cs | 5 + XSharp/Engine/Entities/Enemies/Creeper.cs | 5 + .../Entities/Enemies/Crusher/Crusher.cs | 5 + .../Enemies/DodgeBlaster/DodgeBlasterShot.cs | 5 + .../Engine/Entities/Enemies/Flamer/Flamer.cs | 5 + XSharp/Engine/Entities/Enemies/Gulpfer.cs | 5 + .../Entities/Enemies/Hoganmer/Hoganmer.cs | 5 + .../Entities/Enemies/Hotarion/Hotarion.cs | 5 + XSharp/Engine/Entities/Enemies/Iworm.cs | 5 + .../Engine/Entities/Enemies/LadderYadder.cs | 5 + XSharp/Engine/Entities/Enemies/MadPecker.cs | 5 + XSharp/Engine/Entities/Enemies/MetalWing.cs | 5 + .../Entities/Enemies/MetallC15/MetallC15.cs | 5 + XSharp/Engine/Entities/Enemies/Planty.cs | 5 + .../Entities/Enemies/RayTrap/RayTrap.cs | 5 + .../Enemies/RoadAttackers/RoadAttacker.cs | 5 + .../Entities/Enemies/RollingGabyoall.cs | 5 + XSharp/Engine/Entities/Enemies/Scrap.cs | 5 + .../Entities/Enemies/ScrapRobo/ScrapRobo.cs | 5 + XSharp/Engine/Entities/Enemies/SeaAttacker.cs | 5 + .../Enemies/SlideCannon/SlideCannon.cs | 5 + XSharp/Engine/Entities/Sprite.cs | 39 +++- XSharp/Engine/GameEngine.cs | 210 ++++++++++++++++-- XSharp/XSharp.csproj | 12 - 48 files changed, 474 insertions(+), 52 deletions(-) create mode 100644 XSharp/Engine/Entities/Enemies/Amenhopper/Amenhopper.cs create mode 100644 XSharp/Engine/Entities/Enemies/BallDeVoux.cs create mode 100644 XSharp/Engine/Entities/Enemies/BattonM501.cs create mode 100644 XSharp/Engine/Entities/Enemies/Bosses/ArmoredArmadillo/ArmoredArmadillo.cs create mode 100644 XSharp/Engine/Entities/Enemies/Bosses/BoomerKuwanger/BoomerKuwanger.cs create mode 100644 XSharp/Engine/Entities/Enemies/Bosses/Bosspider/Bosspider.cs create mode 100644 XSharp/Engine/Entities/Enemies/Bosses/Bosspider/Petitpider.cs create mode 100644 XSharp/Engine/Entities/Enemies/Bosses/DRex/DRex.cs create mode 100644 XSharp/Engine/Entities/Enemies/Bosses/FlameMammoth/FlameMammoth.cs create mode 100644 XSharp/Engine/Entities/Enemies/Bosses/LauchOctupus/LauchOctupus.cs create mode 100644 XSharp/Engine/Entities/Enemies/Bosses/RangdaBangda/RangdaBangda.cs create mode 100644 XSharp/Engine/Entities/Enemies/Bosses/Sigma/CapSigma.cs create mode 100644 XSharp/Engine/Entities/Enemies/Bosses/Sigma/JediSigma.cs create mode 100644 XSharp/Engine/Entities/Enemies/Bosses/Sigma/KaiserSigma.cs create mode 100644 XSharp/Engine/Entities/Enemies/Bosses/Sigma/NeoSigma.cs create mode 100644 XSharp/Engine/Entities/Enemies/Bosses/Sigma/SigmaVirus.cs create mode 100644 XSharp/Engine/Entities/Enemies/Bosses/Sigma/WolfSigma.cs create mode 100644 XSharp/Engine/Entities/Enemies/Bosses/SparkMandrill/SparkMandrill.cs create mode 100644 XSharp/Engine/Entities/Enemies/Bosses/StingChameleon/StingChameleon.cs create mode 100644 XSharp/Engine/Entities/Enemies/Bosses/StormEagle/StormEagle.cs create mode 100644 XSharp/Engine/Entities/Enemies/Bosses/Velguarder/Velguarder.cs create mode 100644 XSharp/Engine/Entities/Enemies/Bosses/Vile/Vile.cs create mode 100644 XSharp/Engine/Entities/Enemies/CragMan.cs create mode 100644 XSharp/Engine/Entities/Enemies/Creeper.cs create mode 100644 XSharp/Engine/Entities/Enemies/Crusher/Crusher.cs create mode 100644 XSharp/Engine/Entities/Enemies/DodgeBlaster/DodgeBlasterShot.cs create mode 100644 XSharp/Engine/Entities/Enemies/Flamer/Flamer.cs create mode 100644 XSharp/Engine/Entities/Enemies/Gulpfer.cs create mode 100644 XSharp/Engine/Entities/Enemies/Hoganmer/Hoganmer.cs create mode 100644 XSharp/Engine/Entities/Enemies/Hotarion/Hotarion.cs create mode 100644 XSharp/Engine/Entities/Enemies/Iworm.cs create mode 100644 XSharp/Engine/Entities/Enemies/LadderYadder.cs create mode 100644 XSharp/Engine/Entities/Enemies/MadPecker.cs create mode 100644 XSharp/Engine/Entities/Enemies/MetalWing.cs create mode 100644 XSharp/Engine/Entities/Enemies/MetallC15/MetallC15.cs create mode 100644 XSharp/Engine/Entities/Enemies/Planty.cs create mode 100644 XSharp/Engine/Entities/Enemies/RayTrap/RayTrap.cs create mode 100644 XSharp/Engine/Entities/Enemies/RoadAttackers/RoadAttacker.cs create mode 100644 XSharp/Engine/Entities/Enemies/RollingGabyoall.cs create mode 100644 XSharp/Engine/Entities/Enemies/Scrap.cs create mode 100644 XSharp/Engine/Entities/Enemies/ScrapRobo/ScrapRobo.cs create mode 100644 XSharp/Engine/Entities/Enemies/SeaAttacker.cs create mode 100644 XSharp/Engine/Entities/Enemies/SlideCannon/SlideCannon.cs diff --git a/XSharp/Engine/Entities/Enemies/Amenhopper/Amenhopper.cs b/XSharp/Engine/Entities/Enemies/Amenhopper/Amenhopper.cs new file mode 100644 index 0000000..dcaf19a --- /dev/null +++ b/XSharp/Engine/Entities/Enemies/Amenhopper/Amenhopper.cs @@ -0,0 +1,5 @@ +namespace XSharp.Engine.Entities.Enemies.Amenhopper; + +public class Amenhopper : Enemy +{ +} \ No newline at end of file diff --git a/XSharp/Engine/Entities/Enemies/AxeMax/AxeMaxTrunk.cs b/XSharp/Engine/Entities/Enemies/AxeMax/AxeMaxTrunk.cs index 7eb2774..14a02ef 100644 --- a/XSharp/Engine/Entities/Enemies/AxeMax/AxeMaxTrunk.cs +++ b/XSharp/Engine/Entities/Enemies/AxeMax/AxeMaxTrunk.cs @@ -145,6 +145,8 @@ protected override void OnSpawn() AutoAdjustOnTheFloor = false; CollisionData = CollisionData.SOLID; + SendToBack(); + if (TrunkBase.FirstRegenerating) { State = AxeMaxTrunkState.IDLE; diff --git a/XSharp/Engine/Entities/Enemies/BallDeVoux.cs b/XSharp/Engine/Entities/Enemies/BallDeVoux.cs new file mode 100644 index 0000000..547b733 --- /dev/null +++ b/XSharp/Engine/Entities/Enemies/BallDeVoux.cs @@ -0,0 +1,5 @@ +namespace XSharp.Engine.Entities.Enemies; + +public class BallDeVoux : Enemy +{ +} \ No newline at end of file diff --git a/XSharp/Engine/Entities/Enemies/BattonM501.cs b/XSharp/Engine/Entities/Enemies/BattonM501.cs new file mode 100644 index 0000000..8b135fd --- /dev/null +++ b/XSharp/Engine/Entities/Enemies/BattonM501.cs @@ -0,0 +1,5 @@ +namespace XSharp.Engine.Entities.Enemies; + +public class BattonM501 : Enemy +{ +} \ No newline at end of file diff --git a/XSharp/Engine/Entities/Enemies/Bosses/ArmoredArmadillo/ArmoredArmadillo.cs b/XSharp/Engine/Entities/Enemies/Bosses/ArmoredArmadillo/ArmoredArmadillo.cs new file mode 100644 index 0000000..10c9e0d --- /dev/null +++ b/XSharp/Engine/Entities/Enemies/Bosses/ArmoredArmadillo/ArmoredArmadillo.cs @@ -0,0 +1,5 @@ +namespace XSharp.Engine.Entities.Enemies.Bosses.ArmoredArmadillo; + +public class ArmoredArmadillo : Boss +{ +} \ No newline at end of file diff --git a/XSharp/Engine/Entities/Enemies/Bosses/BoomerKuwanger/BoomerKuwanger.cs b/XSharp/Engine/Entities/Enemies/Bosses/BoomerKuwanger/BoomerKuwanger.cs new file mode 100644 index 0000000..863ad8e --- /dev/null +++ b/XSharp/Engine/Entities/Enemies/Bosses/BoomerKuwanger/BoomerKuwanger.cs @@ -0,0 +1,5 @@ +namespace XSharp.Engine.Entities.Enemies.Bosses.BoomerKuwanger; + +public class BoomerKuwanger : Boss +{ +} \ No newline at end of file diff --git a/XSharp/Engine/Entities/Enemies/Bosses/Bosspider/Bosspider.cs b/XSharp/Engine/Entities/Enemies/Bosses/Bosspider/Bosspider.cs new file mode 100644 index 0000000..a9db0e5 --- /dev/null +++ b/XSharp/Engine/Entities/Enemies/Bosses/Bosspider/Bosspider.cs @@ -0,0 +1,5 @@ +namespace XSharp.Engine.Entities.Enemies.Bosses.Bosspider; + +public class Bosspider : Boss +{ +} \ No newline at end of file diff --git a/XSharp/Engine/Entities/Enemies/Bosses/Bosspider/Petitpider.cs b/XSharp/Engine/Entities/Enemies/Bosses/Bosspider/Petitpider.cs new file mode 100644 index 0000000..ecfbbe1 --- /dev/null +++ b/XSharp/Engine/Entities/Enemies/Bosses/Bosspider/Petitpider.cs @@ -0,0 +1,5 @@ +namespace XSharp.Engine.Entities.Enemies.Bosses.Bosspider; + +public class Petitpider : Enemy +{ +} \ No newline at end of file diff --git a/XSharp/Engine/Entities/Enemies/Bosses/ChillPenguin/ChillPenguin.cs b/XSharp/Engine/Entities/Enemies/Bosses/ChillPenguin/ChillPenguin.cs index 4edf56e..cec3f81 100644 --- a/XSharp/Engine/Entities/Enemies/Bosses/ChillPenguin/ChillPenguin.cs +++ b/XSharp/Engine/Entities/Enemies/Bosses/ChillPenguin/ChillPenguin.cs @@ -553,19 +553,19 @@ private void OnIdle(EntityState state, long frameCounter) { switch (value) { - case >= 0 and < 2: + case >= 0 and < 4: State = ChillPenguinState.SLIDING; break; - case >= 2 and < 4: + case >= 4 and < 8: State = ChillPenguinState.SHOOTING_ICE; break; - case >= 4 and < 6: + case >= 8 and < 10: State = ChillPenguinState.JUMPING; break; - case >= 6 and < 12: + case >= 10 and < 12: if (AtLeastOneSculpturesAlive()) State = ChillPenguinState.HANGING; else @@ -592,19 +592,19 @@ private void OnIdle(EntityState state, long frameCounter) { switch (value) { - case >= 0 and < 2: + case >= 0 and < 4: State = ChillPenguinState.SLIDING; break; - case >= 2 and < 4: + case >= 4 and < 6: State = ChillPenguinState.SHOOTING_ICE; break; - case >= 4 and < 6: + case >= 6 and < 10: State = ChillPenguinState.JUMPING; break; - case >= 6 and < 14: + case >= 10 and < 14: if (AtLeastOneSculpturesAlive()) State = ChillPenguinState.HANGING; else @@ -639,11 +639,11 @@ private void OnIdle(EntityState state, long frameCounter) State = ChillPenguinState.SHOOTING_ICE; break; - case >= 6 and < 8: + case >= 6 and < 10: State = ChillPenguinState.JUMPING; break; - case >= 8 and < 12: + case >= 10 and < 12: if (AtLeastOneSculpturesAlive()) State = ChillPenguinState.HANGING; else @@ -674,11 +674,11 @@ private void OnIdle(EntityState state, long frameCounter) State = ChillPenguinState.SLIDING; break; - case >= 4 and < 6: + case >= 4 and < 8: State = ChillPenguinState.SHOOTING_ICE; break; - case >= 6 and < 12: + case >= 8 and < 12: if (AtLeastOneSculpturesAlive()) State = ChillPenguinState.HANGING; else @@ -713,7 +713,11 @@ private void OnIdle(EntityState state, long frameCounter) State = ChillPenguinState.SHOOTING_ICE; break; - case >= 6 and < 12: + case >= 6 and < 10: + State = ChillPenguinState.JUMPING; + break; + + case >= 10 and < 12: if (AtLeastOneSculpturesAlive()) State = ChillPenguinState.HANGING; else @@ -741,15 +745,19 @@ private void OnIdle(EntityState state, long frameCounter) { switch (value) { - case >= 0 and < 2: + case >= 0 and < 4: State = ChillPenguinState.SLIDING; break; - case >= 2 and < 6: + case >= 4 and < 8: State = ChillPenguinState.SHOOTING_ICE; break; - case >= 6 and < 12: + case >= 8 and < 10: + State = ChillPenguinState.JUMPING; + break; + + case >= 10 and < 12: if (AtLeastOneSculpturesAlive()) State = ChillPenguinState.HANGING; else @@ -776,19 +784,19 @@ private void OnIdle(EntityState state, long frameCounter) { switch (value) { - case >= 0 and < 2: + case >= 0 and < 4: State = ChillPenguinState.SLIDING; break; - case >= 2 and < 4: + case >= 4 and < 8: State = ChillPenguinState.SHOOTING_ICE; break; - case >= 4 and < 8: + case >= 8 and < 10: State = ChillPenguinState.JUMPING; break; - case >= 8 and < 12: + case >= 10 and < 12: if (AtLeastOneSculpturesAlive()) State = ChillPenguinState.HANGING; else diff --git a/XSharp/Engine/Entities/Enemies/Bosses/DRex/DRex.cs b/XSharp/Engine/Entities/Enemies/Bosses/DRex/DRex.cs new file mode 100644 index 0000000..5876a21 --- /dev/null +++ b/XSharp/Engine/Entities/Enemies/Bosses/DRex/DRex.cs @@ -0,0 +1,5 @@ +namespace XSharp.Engine.Entities.Enemies.Bosses.DRex; + +public class DRex : Boss +{ +} \ No newline at end of file diff --git a/XSharp/Engine/Entities/Enemies/Bosses/FlameMammoth/FlameMammoth.cs b/XSharp/Engine/Entities/Enemies/Bosses/FlameMammoth/FlameMammoth.cs new file mode 100644 index 0000000..1ebe838 --- /dev/null +++ b/XSharp/Engine/Entities/Enemies/Bosses/FlameMammoth/FlameMammoth.cs @@ -0,0 +1,5 @@ +namespace XSharp.Engine.Entities.Enemies.Bosses.FlameMammoth; + +public class FlameMammoth : Boss +{ +} \ No newline at end of file diff --git a/XSharp/Engine/Entities/Enemies/Bosses/LauchOctupus/LauchOctupus.cs b/XSharp/Engine/Entities/Enemies/Bosses/LauchOctupus/LauchOctupus.cs new file mode 100644 index 0000000..0cf58d8 --- /dev/null +++ b/XSharp/Engine/Entities/Enemies/Bosses/LauchOctupus/LauchOctupus.cs @@ -0,0 +1,5 @@ +namespace XSharp.Engine.Entities.Enemies.Bosses.LauchOctupus; + +public class LauchOctupus : Boss +{ +} \ No newline at end of file diff --git a/XSharp/Engine/Entities/Enemies/Bosses/RangdaBangda/RangdaBangda.cs b/XSharp/Engine/Entities/Enemies/Bosses/RangdaBangda/RangdaBangda.cs new file mode 100644 index 0000000..a5aada0 --- /dev/null +++ b/XSharp/Engine/Entities/Enemies/Bosses/RangdaBangda/RangdaBangda.cs @@ -0,0 +1,5 @@ +namespace XSharp.Engine.Entities.Enemies.Bosses.RangdaBangda; + +public class RangdaBangda : Boss +{ +} \ No newline at end of file diff --git a/XSharp/Engine/Entities/Enemies/Bosses/Sigma/CapSigma.cs b/XSharp/Engine/Entities/Enemies/Bosses/Sigma/CapSigma.cs new file mode 100644 index 0000000..67ed0b2 --- /dev/null +++ b/XSharp/Engine/Entities/Enemies/Bosses/Sigma/CapSigma.cs @@ -0,0 +1,5 @@ +namespace XSharp.Engine.Entities.Enemies.Bosses.Sigma; + +public class CapSigma : Boss +{ +} \ No newline at end of file diff --git a/XSharp/Engine/Entities/Enemies/Bosses/Sigma/JediSigma.cs b/XSharp/Engine/Entities/Enemies/Bosses/Sigma/JediSigma.cs new file mode 100644 index 0000000..03846b5 --- /dev/null +++ b/XSharp/Engine/Entities/Enemies/Bosses/Sigma/JediSigma.cs @@ -0,0 +1,5 @@ +namespace XSharp.Engine.Entities.Enemies.Bosses.Sigma; + +public class JediSigma : Boss +{ +} \ No newline at end of file diff --git a/XSharp/Engine/Entities/Enemies/Bosses/Sigma/KaiserSigma.cs b/XSharp/Engine/Entities/Enemies/Bosses/Sigma/KaiserSigma.cs new file mode 100644 index 0000000..e379127 --- /dev/null +++ b/XSharp/Engine/Entities/Enemies/Bosses/Sigma/KaiserSigma.cs @@ -0,0 +1,5 @@ +namespace XSharp.Engine.Entities.Enemies.Bosses.Sigma; + +public class KaiserSigma : Boss +{ +} \ No newline at end of file diff --git a/XSharp/Engine/Entities/Enemies/Bosses/Sigma/NeoSigma.cs b/XSharp/Engine/Entities/Enemies/Bosses/Sigma/NeoSigma.cs new file mode 100644 index 0000000..70116b7 --- /dev/null +++ b/XSharp/Engine/Entities/Enemies/Bosses/Sigma/NeoSigma.cs @@ -0,0 +1,5 @@ +namespace XSharp.Engine.Entities.Enemies.Bosses.Sigma; + +public class NeoSigma : Boss +{ +} \ No newline at end of file diff --git a/XSharp/Engine/Entities/Enemies/Bosses/Sigma/SigmaVirus.cs b/XSharp/Engine/Entities/Enemies/Bosses/Sigma/SigmaVirus.cs new file mode 100644 index 0000000..2b47c2c --- /dev/null +++ b/XSharp/Engine/Entities/Enemies/Bosses/Sigma/SigmaVirus.cs @@ -0,0 +1,5 @@ +namespace XSharp.Engine.Entities.Enemies.Bosses.Sigma; + +public class SigmaVirus : Boss +{ +} \ No newline at end of file diff --git a/XSharp/Engine/Entities/Enemies/Bosses/Sigma/WolfSigma.cs b/XSharp/Engine/Entities/Enemies/Bosses/Sigma/WolfSigma.cs new file mode 100644 index 0000000..ef481b5 --- /dev/null +++ b/XSharp/Engine/Entities/Enemies/Bosses/Sigma/WolfSigma.cs @@ -0,0 +1,5 @@ +namespace XSharp.Engine.Entities.Enemies.Bosses.Sigma; + +public class WolfSigma : Boss +{ +} \ No newline at end of file diff --git a/XSharp/Engine/Entities/Enemies/Bosses/SparkMandrill/SparkMandrill.cs b/XSharp/Engine/Entities/Enemies/Bosses/SparkMandrill/SparkMandrill.cs new file mode 100644 index 0000000..06b8891 --- /dev/null +++ b/XSharp/Engine/Entities/Enemies/Bosses/SparkMandrill/SparkMandrill.cs @@ -0,0 +1,5 @@ +namespace XSharp.Engine.Entities.Enemies.Bosses.SparkMandrill; + +public class SparkMandrill : Boss +{ +} \ No newline at end of file diff --git a/XSharp/Engine/Entities/Enemies/Bosses/StingChameleon/StingChameleon.cs b/XSharp/Engine/Entities/Enemies/Bosses/StingChameleon/StingChameleon.cs new file mode 100644 index 0000000..e499836 --- /dev/null +++ b/XSharp/Engine/Entities/Enemies/Bosses/StingChameleon/StingChameleon.cs @@ -0,0 +1,5 @@ +namespace XSharp.Engine.Entities.Enemies.Bosses.StingChameleon; + +public class StingChameleon : Boss +{ +} \ No newline at end of file diff --git a/XSharp/Engine/Entities/Enemies/Bosses/StormEagle/StormEagle.cs b/XSharp/Engine/Entities/Enemies/Bosses/StormEagle/StormEagle.cs new file mode 100644 index 0000000..51ea36e --- /dev/null +++ b/XSharp/Engine/Entities/Enemies/Bosses/StormEagle/StormEagle.cs @@ -0,0 +1,5 @@ +namespace XSharp.Engine.Entities.Enemies.Bosses.StormEagle; + +public class StormEagle : Boss +{ +} \ No newline at end of file diff --git a/XSharp/Engine/Entities/Enemies/Bosses/Velguarder/Velguarder.cs b/XSharp/Engine/Entities/Enemies/Bosses/Velguarder/Velguarder.cs new file mode 100644 index 0000000..820801b --- /dev/null +++ b/XSharp/Engine/Entities/Enemies/Bosses/Velguarder/Velguarder.cs @@ -0,0 +1,5 @@ +namespace XSharp.Engine.Entities.Enemies.Bosses.Velguarder; + +public class Velguarder : Boss +{ +} \ No newline at end of file diff --git a/XSharp/Engine/Entities/Enemies/Bosses/Vile/Vile.cs b/XSharp/Engine/Entities/Enemies/Bosses/Vile/Vile.cs new file mode 100644 index 0000000..35667e5 --- /dev/null +++ b/XSharp/Engine/Entities/Enemies/Bosses/Vile/Vile.cs @@ -0,0 +1,5 @@ +namespace XSharp.Engine.Entities.Enemies.Bosses.Vile; + +public class Vile : Boss +{ +} \ No newline at end of file diff --git a/XSharp/Engine/Entities/Enemies/CragMan.cs b/XSharp/Engine/Entities/Enemies/CragMan.cs new file mode 100644 index 0000000..9172da3 --- /dev/null +++ b/XSharp/Engine/Entities/Enemies/CragMan.cs @@ -0,0 +1,5 @@ +namespace XSharp.Engine.Entities.Enemies; + +public class CragMan : Enemy +{ +} \ No newline at end of file diff --git a/XSharp/Engine/Entities/Enemies/Creeper.cs b/XSharp/Engine/Entities/Enemies/Creeper.cs new file mode 100644 index 0000000..6376c02 --- /dev/null +++ b/XSharp/Engine/Entities/Enemies/Creeper.cs @@ -0,0 +1,5 @@ +namespace XSharp.Engine.Entities.Enemies; + +public class Creeper : Enemy +{ +} \ No newline at end of file diff --git a/XSharp/Engine/Entities/Enemies/Crusher/Crusher.cs b/XSharp/Engine/Entities/Enemies/Crusher/Crusher.cs new file mode 100644 index 0000000..46ebc62 --- /dev/null +++ b/XSharp/Engine/Entities/Enemies/Crusher/Crusher.cs @@ -0,0 +1,5 @@ +namespace XSharp.Engine.Entities.Enemies.Crusher; + +public class Crusher : Enemy +{ +} \ No newline at end of file diff --git a/XSharp/Engine/Entities/Enemies/DodgeBlaster/DodgeBlasterShot.cs b/XSharp/Engine/Entities/Enemies/DodgeBlaster/DodgeBlasterShot.cs new file mode 100644 index 0000000..e3ebf29 --- /dev/null +++ b/XSharp/Engine/Entities/Enemies/DodgeBlaster/DodgeBlasterShot.cs @@ -0,0 +1,5 @@ +namespace XSharp.Engine.Entities.Enemies.DodgeBlaster; + +public class DodgeBlasterShot : Enemy +{ +} \ No newline at end of file diff --git a/XSharp/Engine/Entities/Enemies/Flamer/Flamer.cs b/XSharp/Engine/Entities/Enemies/Flamer/Flamer.cs new file mode 100644 index 0000000..3d855d3 --- /dev/null +++ b/XSharp/Engine/Entities/Enemies/Flamer/Flamer.cs @@ -0,0 +1,5 @@ +namespace XSharp.Engine.Entities.Enemies.Flamer; + +public class Flamer : Enemy +{ +} \ No newline at end of file diff --git a/XSharp/Engine/Entities/Enemies/Gulpfer.cs b/XSharp/Engine/Entities/Enemies/Gulpfer.cs new file mode 100644 index 0000000..96e6178 --- /dev/null +++ b/XSharp/Engine/Entities/Enemies/Gulpfer.cs @@ -0,0 +1,5 @@ +namespace XSharp.Engine.Entities.Enemies; + +public class Gulpfer : Enemy +{ +} \ No newline at end of file diff --git a/XSharp/Engine/Entities/Enemies/Hoganmer/Hoganmer.cs b/XSharp/Engine/Entities/Enemies/Hoganmer/Hoganmer.cs new file mode 100644 index 0000000..b3dd5b9 --- /dev/null +++ b/XSharp/Engine/Entities/Enemies/Hoganmer/Hoganmer.cs @@ -0,0 +1,5 @@ +namespace XSharp.Engine.Entities.Enemies.Hoganmer; + +public class Hoganmer : Enemy +{ +} \ No newline at end of file diff --git a/XSharp/Engine/Entities/Enemies/Hotarion/Hotarion.cs b/XSharp/Engine/Entities/Enemies/Hotarion/Hotarion.cs new file mode 100644 index 0000000..50a92b7 --- /dev/null +++ b/XSharp/Engine/Entities/Enemies/Hotarion/Hotarion.cs @@ -0,0 +1,5 @@ +namespace XSharp.Engine.Entities.Enemies.Hotarion; + +public class Hotarion : Enemy +{ +} \ No newline at end of file diff --git a/XSharp/Engine/Entities/Enemies/Iworm.cs b/XSharp/Engine/Entities/Enemies/Iworm.cs new file mode 100644 index 0000000..58ae8ea --- /dev/null +++ b/XSharp/Engine/Entities/Enemies/Iworm.cs @@ -0,0 +1,5 @@ +namespace XSharp.Engine.Entities.Enemies; + +public class Iworm : Enemy +{ +} \ No newline at end of file diff --git a/XSharp/Engine/Entities/Enemies/LadderYadder.cs b/XSharp/Engine/Entities/Enemies/LadderYadder.cs new file mode 100644 index 0000000..3cfc7a5 --- /dev/null +++ b/XSharp/Engine/Entities/Enemies/LadderYadder.cs @@ -0,0 +1,5 @@ +namespace XSharp.Engine.Entities.Enemies; + +public class LadderYadder : Enemy +{ +} \ No newline at end of file diff --git a/XSharp/Engine/Entities/Enemies/MadPecker.cs b/XSharp/Engine/Entities/Enemies/MadPecker.cs new file mode 100644 index 0000000..634e2bb --- /dev/null +++ b/XSharp/Engine/Entities/Enemies/MadPecker.cs @@ -0,0 +1,5 @@ +namespace XSharp.Engine.Entities.Enemies; + +public class MadPecker : Enemy +{ +} \ No newline at end of file diff --git a/XSharp/Engine/Entities/Enemies/MetalWing.cs b/XSharp/Engine/Entities/Enemies/MetalWing.cs new file mode 100644 index 0000000..3d94530 --- /dev/null +++ b/XSharp/Engine/Entities/Enemies/MetalWing.cs @@ -0,0 +1,5 @@ +namespace XSharp.Engine.Entities.Enemies; + +public class MetalWing : Enemy +{ +} \ No newline at end of file diff --git a/XSharp/Engine/Entities/Enemies/MetallC15/MetallC15.cs b/XSharp/Engine/Entities/Enemies/MetallC15/MetallC15.cs new file mode 100644 index 0000000..1fe5f29 --- /dev/null +++ b/XSharp/Engine/Entities/Enemies/MetallC15/MetallC15.cs @@ -0,0 +1,5 @@ +namespace XSharp.Engine.Entities.Enemies.MetallC15; + +public class MetallC15 : Enemy +{ +} \ No newline at end of file diff --git a/XSharp/Engine/Entities/Enemies/Planty.cs b/XSharp/Engine/Entities/Enemies/Planty.cs new file mode 100644 index 0000000..bbcd33e --- /dev/null +++ b/XSharp/Engine/Entities/Enemies/Planty.cs @@ -0,0 +1,5 @@ +namespace XSharp.Engine.Entities.Enemies; + +public class Planty : Enemy +{ +} \ No newline at end of file diff --git a/XSharp/Engine/Entities/Enemies/RayTrap/RayTrap.cs b/XSharp/Engine/Entities/Enemies/RayTrap/RayTrap.cs new file mode 100644 index 0000000..ed5fca6 --- /dev/null +++ b/XSharp/Engine/Entities/Enemies/RayTrap/RayTrap.cs @@ -0,0 +1,5 @@ +namespace XSharp.Engine.Entities.Enemies.RayTrap; + +public class RayTrap : Enemy +{ +} \ No newline at end of file diff --git a/XSharp/Engine/Entities/Enemies/RoadAttackers/RoadAttacker.cs b/XSharp/Engine/Entities/Enemies/RoadAttackers/RoadAttacker.cs new file mode 100644 index 0000000..56c2232 --- /dev/null +++ b/XSharp/Engine/Entities/Enemies/RoadAttackers/RoadAttacker.cs @@ -0,0 +1,5 @@ +namespace XSharp.Engine.Entities.Enemies.RoadAttackers; + +public class RoadAttacker : Enemy +{ +} \ No newline at end of file diff --git a/XSharp/Engine/Entities/Enemies/RollingGabyoall.cs b/XSharp/Engine/Entities/Enemies/RollingGabyoall.cs new file mode 100644 index 0000000..1e23bb3 --- /dev/null +++ b/XSharp/Engine/Entities/Enemies/RollingGabyoall.cs @@ -0,0 +1,5 @@ +namespace XSharp.Engine.Entities.Enemies; + +public class RollingGabyoall : Enemy +{ +} \ No newline at end of file diff --git a/XSharp/Engine/Entities/Enemies/Scrap.cs b/XSharp/Engine/Entities/Enemies/Scrap.cs new file mode 100644 index 0000000..d05ba9a --- /dev/null +++ b/XSharp/Engine/Entities/Enemies/Scrap.cs @@ -0,0 +1,5 @@ +namespace XSharp.Engine.Entities.Enemies; + +public class Scrap : Enemy +{ +} \ No newline at end of file diff --git a/XSharp/Engine/Entities/Enemies/ScrapRobo/ScrapRobo.cs b/XSharp/Engine/Entities/Enemies/ScrapRobo/ScrapRobo.cs new file mode 100644 index 0000000..513bbdf --- /dev/null +++ b/XSharp/Engine/Entities/Enemies/ScrapRobo/ScrapRobo.cs @@ -0,0 +1,5 @@ +namespace XSharp.Engine.Entities.Enemies.ScrapRobo; + +public class ScrapRobo : Enemy +{ +} \ No newline at end of file diff --git a/XSharp/Engine/Entities/Enemies/SeaAttacker.cs b/XSharp/Engine/Entities/Enemies/SeaAttacker.cs new file mode 100644 index 0000000..fe7a2af --- /dev/null +++ b/XSharp/Engine/Entities/Enemies/SeaAttacker.cs @@ -0,0 +1,5 @@ +namespace XSharp.Engine.Entities.Enemies; + +public class SeaAttacker : Enemy +{ +} \ No newline at end of file diff --git a/XSharp/Engine/Entities/Enemies/SlideCannon/SlideCannon.cs b/XSharp/Engine/Entities/Enemies/SlideCannon/SlideCannon.cs new file mode 100644 index 0000000..54a098a --- /dev/null +++ b/XSharp/Engine/Entities/Enemies/SlideCannon/SlideCannon.cs @@ -0,0 +1,5 @@ +namespace XSharp.Engine.Entities.Enemies.SlideCannon; + +public class SlideCannon : Enemy +{ +} \ No newline at end of file diff --git a/XSharp/Engine/Entities/Sprite.cs b/XSharp/Engine/Entities/Sprite.cs index b6d59c9..93f5194 100644 --- a/XSharp/Engine/Entities/Sprite.cs +++ b/XSharp/Engine/Entities/Sprite.cs @@ -46,7 +46,8 @@ public abstract class Sprite : Entity, IRenderable private SpriteSheet spriteSheet = null; private bool visible = true; - private int layer = 0; + internal int layer = 0; + internal int priority = -1; private (string name, int count)[] animationNames; private AnimationReference currentAnimation = null; @@ -91,6 +92,7 @@ public bool UpsideDown public bool Visible { get => visible; + set { visible = value; @@ -101,12 +103,26 @@ public bool Visible public int Layer { get => layer; + set { - if (Alive && layer != value) + if (!Alive) + layer = value; + else if (layer != value) Engine.UpdateSpriteLayer(this, value); + } + } - layer = value; + public int Priority + { + get => priority; + + set + { + if (!Alive) + priority = value; + else if (priority != value) + Engine.UpdateSpritePriority(this, value); } } @@ -989,6 +1005,17 @@ public override void Place(bool respawnable = true) Spawn(); } + public void BringToFront() + { + int count = this is HUD.HUD ? Engine.GetHUDs(Layer).Count : Engine.GetSprites(Layer).Count; + Priority = count - 1; + } + + public void SendToBack() + { + Priority = 0; + } + protected virtual bool OnTakeDamage(Sprite attacker, ref FixedSingle damage) { return !Invincible && !NoClip; @@ -1667,10 +1694,10 @@ protected virtual void OnLanded() LandedEvent?.Invoke(this); } + // TODO : Implement call to this protected bool CollisionCheck(Sprite sprite) - { - // TODO : Implement call to this - return ShouldCollide(sprite) || sprite.ShouldCollide(this); + { + return ShouldCollide(sprite) && sprite.ShouldCollide(this); } public Animation GetAnimation(int index) diff --git a/XSharp/Engine/GameEngine.cs b/XSharp/Engine/GameEngine.cs index bbb6841..c099daf 100644 --- a/XSharp/Engine/GameEngine.cs +++ b/XSharp/Engine/GameEngine.cs @@ -3,6 +3,7 @@ using System.Configuration; using System.Diagnostics; using System.IO; +using System.Linq; using System.Reflection; using System.Runtime.InteropServices; using System.Threading; @@ -27,6 +28,7 @@ using XSharp.Engine.Entities.Enemies.DigLabour; using XSharp.Engine.Entities.Enemies.Flammingle; using XSharp.Engine.Entities.Enemies.GunVolt; +using XSharp.Engine.Entities.Enemies.MetallC15; using XSharp.Engine.Entities.Enemies.RayBit; using XSharp.Engine.Entities.Enemies.Snowball; using XSharp.Engine.Entities.Enemies.SnowShooter; @@ -2194,16 +2196,64 @@ private bool OnFrame() foreach (var added in spawnedEntities) { aliveEntities.Add(added); + added.NotifySpawn(); if (added is Sprite sprite) { if (sprite is HUD hud) - huds[sprite.Layer].Add(hud); + { + int newLayer = hud.Layer; + if (newLayer < 0 || newLayer >= huds.Length) + throw new IndexOutOfRangeException($"Invalid layer '{newLayer}'."); + + var layer = huds[newLayer]; + + if (hud.priority >= 0) + { + layer.Insert(hud.priority, hud); + + for (int i = hud.priority + 1; i < layer.Count; i++) + { + var otherHUD = layer[i]; + otherHUD.priority = i; + } + } + else + { + hud.priority = layer.Count; + layer.Add(hud); + } + + hud.priority = layer.Count - 1; + } else - sprites[sprite.Layer].Add(sprite); + { + int newLayer = sprite.Layer; + if (newLayer < 0 || newLayer >= huds.Length) + throw new IndexOutOfRangeException($"Invalid layer '{newLayer}'."); + + var layer = sprites[newLayer]; + + if (sprite.priority >= 0) + { + layer.Insert(sprite.priority, sprite); + + for (int i = sprite.priority + 1; i < layer.Count; i++) + { + var otherSprite = layer[i]; + otherSprite.priority = i; + } + } + else + { + sprite.priority = layer.Count; + layer.Add(sprite); + } + + sprite.priority = layer.Count - 1; + } } - added.NotifySpawn(); added.PostSpawn(); } @@ -2342,6 +2392,22 @@ public RectangleF WorldBoxToScreen(Box box) return ToRectangleF((box.LeftTopOrigin().RoundOriginToFloor() - Camera.LeftTop.RoundToFloor()) * DrawScale + drawBox.LeftTop); } + public IReadOnlyList GetSprites(int layer) + { + if (layer < 0 || layer >= sprites.Length) + throw new IndexOutOfRangeException($"Invalid layer '{layer}'."); + + return sprites[layer]; + } + + public IReadOnlyList GetHUDs(int layer) + { + if (layer < 0 || layer >= huds.Length) + throw new IndexOutOfRangeException($"Invalid layer '{layer}'."); + + return huds[layer]; + } + public void TogglePauseGame() { if (paused) @@ -2998,9 +3064,8 @@ public void Render(IRenderTarget target) if (drawSprites) { // Render down layer sprites - for (int i = sprites[0].Count - 1; i >= 0; i--) + foreach (var sprite in sprites[0]) { - var sprite = sprites[0][i]; if (!sprite.Alive || !sprite.Visible) continue; @@ -3022,9 +3087,8 @@ public void Render(IRenderTarget target) if (drawSprites) { // Render up layer sprites - for (int i = sprites[1].Count - 1; i >= 0; i--) + foreach (var sprite in sprites[1]) { - var sprite = sprites[1][i]; if (!sprite.Alive || !sprite.Visible) continue; @@ -3941,6 +4005,7 @@ public Sprite AddObjectEvent(ushort id, ushort subid, Vector origin) 0x29 when mmx.Type == 0 => AddGunVolt(subid, origin), 0x2C when mmx.Type == 1 => AddProbe8201U(subid, origin), 0x2D when mmx.Type == 0 => AddBattonBoneG(subid, origin), + 0x2E when mmx.Type == 0 => AddMetallC15(subid, origin), 0x2F => AddArmorSoldier(subid, origin), 0x30 when mmx.Type == 0 => AddDigLabour(subid, origin), 0x36 when mmx.Type == 0 => AddJamminger(subid, origin), @@ -4318,6 +4383,18 @@ public EntityReference AddBattonBoneG(ushort subid, Vector origin) return Entities.GetReferenceTo(entity); } + + public EntityReference AddMetallC15(ushort subid, Vector origin) + { + MetallC15 entity = Entities.Create(new + { + Origin = origin + }); + + entity.Place(); + return Entities.GetReferenceTo(entity); + } + public ArmorSoldier AddArmorSoldier(ushort subid, Vector origin) { ArmorSoldier entity = Entities.Create(new @@ -4432,9 +4509,33 @@ private void RemoveEntity(Entity entity, bool force = false) if (entity is Sprite sprite) { if (sprite is HUD hud) - huds[sprite.Layer].Remove(hud); + { + var layer = huds[sprite.Layer]; + layer.Remove(hud); + + int priority = hud.priority; + hud.priority = -1; + + for (int i = priority; i < layer.Count; i++) + { + hud = layer[i]; + hud.priority = i; + } + } else - sprites[sprite.Layer].Remove(sprite); + { + var layer = sprites[sprite.Layer]; + layer.Remove(sprite); + + int priority = sprite.priority; + sprite.priority = -1; + + for (int i = priority; i < layer.Count; i++) + { + sprite = layer[i]; + sprite.priority = i; + } + } } entity.Cleanup(); @@ -5330,17 +5431,98 @@ internal void OnPlayerTeleported() FadingControl.Start(Color.Black, 60, ReloadLevel); } - internal void UpdateSpriteLayer(Sprite sprite, int layer) + internal void UpdateSpriteLayer(Sprite sprite, int newLayer) { if (sprite is HUD hud) { - huds[hud.Layer].Remove(hud); - huds[layer].Add(hud); + if (newLayer < 0 || newLayer >= huds.Length) + throw new IndexOutOfRangeException($"Invalid layer '{newLayer}'."); + + var layer = huds[hud.Layer]; + layer.Remove(hud); + + for (int i = hud.Priority; i < layer.Count; i++) + { + var otherHUD = layer[i]; + otherHUD.priority = i; + } + + layer = huds[newLayer]; + layer.Add(hud); + hud.priority = layer.Count - 1; + } + else + { + if (newLayer < 0 || newLayer >= sprites.Length) + throw new IndexOutOfRangeException($"Invalid layer '{newLayer}'."); + + var layer = sprites[sprite.Layer]; + layer.Remove(sprite); + + for (int i = sprite.Priority; i < layer.Count; i++) + { + var otherSprite = layer[i]; + otherSprite.priority = i; + } + + layer = sprites[newLayer]; + layer.Add(sprite); + sprite.priority = layer.Count - 1; + } + + sprite.layer = newLayer; + } + + internal void UpdateSpritePriority(Sprite sprite, int priority) + { + int layerIndex = sprite.Layer; + int lastPriority = sprite.Priority; + + if (sprite is HUD hud) + { + var layer = huds[layerIndex]; + + if (priority < 0) + priority = 0; + else if (priority >= layer.Count) + priority = layer.Count - 1; + + int start = System.Math.Min(priority, lastPriority); + int end = System.Math.Max(priority, lastPriority); + + if (layer.Contains(hud)) + layer.Remove(hud); + + layer.Insert(priority, hud); + + for (int i = start; i <= end; i++) + { + hud = layer[i]; + hud.priority = i; + } } else { - sprites[sprite.Layer].Remove(sprite); - sprites[layer].Add(sprite); + var layer = sprites[layerIndex]; + + if (priority < 0) + priority = 0; + else if (priority >= layer.Count) + priority = layer.Count - 1; + + if (layer.Contains(sprite)) + layer.Remove(sprite); + + int start = System.Math.Min(priority, lastPriority); + int end = System.Math.Max(priority, lastPriority); + + layer.Insert(priority, sprite); + + for (int i = start; i <= end; i++) + { + sprite = layer[i]; + sprite.priority = i; + } } } diff --git a/XSharp/XSharp.csproj b/XSharp/XSharp.csproj index fa27817..65bebf4 100644 --- a/XSharp/XSharp.csproj +++ b/XSharp/XSharp.csproj @@ -209,18 +209,6 @@ - - - - - - - - - - - -