diff --git a/TODO.md b/TODO.md new file mode 100644 index 0000000..3dea199 --- /dev/null +++ b/TODO.md @@ -0,0 +1,21 @@ +# TODO + +n Deployed sprites for every angle (wall) +n - Showing charge level +n Deployed sprites for every angle (ceiling) +n - Showing charge level +x flat sprite? Advantages: One direction, can probably be used on ceiling and wall. +x - Showing charge level + +- Pickup sprites for every angle + - Spool of wire, a tool, and some electical tape + +- 1st-person sprites + - Wire cutters and electrical tape + +x Sparks +x Debris when destroyed + +- Switching to mag manager goes to batteries screen + +- Show remaining batteries as ammo diff --git a/sprites/jmpra0.aseprite b/sprites/jmpra0.aseprite new file mode 100644 index 0000000..acefa32 Binary files /dev/null and b/sprites/jmpra0.aseprite differ diff --git a/sprites/jmpra0.png b/sprites/jmpra0.png new file mode 100644 index 0000000..42665d7 Binary files /dev/null and b/sprites/jmpra0.png differ diff --git a/textures.txt b/textures.txt new file mode 100644 index 0000000..960187a --- /dev/null +++ b/textures.txt @@ -0,0 +1,16 @@ +sprite JMPRA0, 49, 43 { + offset 24, 21 + patch JMPRA0,0,0 { } +} +sprite JMPRB0, 49, 43 { + offset 24, 21 + patch JMPRA0,0,0 { translation "112:120=160:167" } +} +sprite JMPRC0, 49, 43 { + offset 24, 21 + patch JMPRA0,0,0 { translation "112:120=32:47" } +} +sprite JMPRD0, 49, 43 { + offset 24, 21 + patch JMPRA0,0,0 { translation "112:120=96:111" } +} diff --git a/zscript.zs b/zscript.zs index 7e38f1a..8bbf52d 100644 --- a/zscript.zs +++ b/zscript.zs @@ -52,6 +52,7 @@ class JumperCablesMapLoader : EventHandler void RegisterCables(JumperCablesDeployed cableActor) { + Console.printf("REGISTERING %d\n", deployedCables.Find(cableActor)); if(deployedCables.Find(cableActor) == deployedCables.size()) { deployedCables.Push(cableActor); @@ -62,7 +63,7 @@ class JumperCablesMapLoader : EventHandler void UnregisterCables(JumperCablesDeployed cableActor) { - Console.printf("UNREGISTERING\n"); + Console.printf("UNREGISTERING %d\n", deployedCables.Find(cableActor)); int index = deployedCables.find(cableActor); if(index != deployedCables.size()) { deployedCables.delete(index); @@ -80,23 +81,58 @@ class JumperCablesDeployed : HDUPK default { + radius 2; + height 4; + +SpriteAngle; + Scale 0.4; } states { spawn: - DERP A -1 nodelay { - invoker.bNoGravity = true; - - // Register us with the global event handler so we can - // respond to the linedef getting used. - JumperCablesMapLoader loader = JumperCablesMapLoader.Get(); - loader.RegisterCables(self); - } + JMPR CABD -1; stop; - give: - DERP A 0; - goto spawn; + } + + override void PostBeginPlay() + { + Console.printf("IS THIS EVEN GETTING CALLED!?\n"); + bNoGravity = true; + + // Register us with the global event handler so we can + // respond to the linedef getting used. + JumperCablesMapLoader loader = JumperCablesMapLoader.Get(); + loader.RegisterCables(self); + + UpdateSprite(); + } + + void SetWallSprite(Vector2 lineDir) + { + bFlatSprite = false; + bWallSprite = true; + A_SetAngle(atan2(lineDir) + 90); + } + + void SetFlatSprite(float angle) + { + bFlatSprite = true; + bWallSprite = false; + A_SetAngle(angle); + } + + void UpdateSprite() + { + // Charge levels correspond to battery sprite charge levels. + if(charges > 13) { + frame = 0; + } else if(charges > 6) { + frame = 1; + } else if(charges > 0) { + frame = 2; + } else { + frame = 3; + } } void DecrementBattery() @@ -106,6 +142,8 @@ class JumperCablesDeployed : HDUPK if(charges <= 0) { DespawnToBattery(); } + + UpdateSprite(); } void DespawnToBattery() @@ -116,7 +154,23 @@ class JumperCablesDeployed : HDUPK // Spawn a battery, with the same level of charge. HDMagAmmo.SpawnMag(self, "HDBattery", self.charges); - // TODO: Spawn debris. + // Spawn some smoke. + int smokeCount = random(1, 4); + float smokeVel = 20.0; + for(int k = 0; k < smokeCount; k++) { + A_SpawnItemEx( + "HDSmokeChunk", + 0.0, 0.0, 0.0, + frandom(-smokeVel, smokeVel), + frandom(-smokeVel, smokeVel), + frandom(-smokeVel, smokeVel)); + } + + // Spawn a bunch of sparks. + int sparkAmount = random(3,6); + for(int k = 0; k < sparkAmount; k++) { + SpawnSpark(); + } JumperCablesMapLoader loader = JumperCablesMapLoader.Get(); loader.UnregisterCables(self); @@ -130,8 +184,34 @@ class JumperCablesDeployed : HDUPK return false; } - // TODO: Tick function where we add sparks and stuff? - // TODO: Tick function where we set the sprite to indicate the charge level. + void SpawnSpark() + { + A_StartSound("misc/arccrackle", CHAN_AUTO); + A_SpawnParticle( + "white", + SPF_RELATIVE | SPF_FULLBRIGHT, + random(1, 10), // lifetime + frandom(1, 7), // size + 0, // angle + // offset... + frandom(-1.0, 1.0), + frandom(-1.0, 1.0), + frandom(-1.0, 1.0), + // vel... + frandom(-1.0, 1.0), + frandom(-1.0, 1.0), + frandom(-1.0, 1.0)); + } + + override void Tick() + { + if(frandom(0.0, 1.0) < 0.02) { + SpawnSpark(); + } + + } + + // TODO: Tick function (or whatever) where we set the sprite to indicate the charge level. // TODO: Despawn if the sector gets broken *again*? } @@ -403,12 +483,19 @@ class JumperCablesUsable : HDWeapon JumperCablesDeployed deployed = JumperCablesDeployed( Spawn( "JumperCablesDeployed", - linetraceData.hitLocation - linetraceData.hitDir * 8)); + linetraceData.hitLocation - linetraceData.hitDir * 4)); deployed.lineDefIndex = brokenLine.index(); deployed.bNoGravity = true; deployed.charges = batteryCharges; + if(linetraceData.hitType == TRACE_HitFloor || linetraceData.hitType == TRACE_HitCeiling) { + deployed.SetFlatSprite(invoker.owner.angle); + } else { + Vector2 lineDir = linetraceData.hitLine.v2.p - linetraceData.hitLine.v1.p; + deployed.SetWallSprite(lineDir); + } + brokenLine.special = originalSpecial; } }