From e57fcd57677fbfe8d7201d534b9b9daa80da5b4c Mon Sep 17 00:00:00 2001 From: Kiri Date: Sat, 26 Aug 2023 15:25:44 -0700 Subject: [PATCH] Stream work. --- TODO.md | 2 +- zscript.zs | 218 +++++++++++++++++++++++------------------------------ 2 files changed, 95 insertions(+), 125 deletions(-) diff --git a/TODO.md b/TODO.md index 7b89679..ac5150d 100644 --- a/TODO.md +++ b/TODO.md @@ -24,6 +24,6 @@ x 1st-person sprites - Fault detection sound - +- ready animation diff --git a/zscript.zs b/zscript.zs index 9190c35..ceda82e 100644 --- a/zscript.zs +++ b/zscript.zs @@ -28,16 +28,6 @@ class JumperCablesMapLoader : EventHandler worldScanCompleted = false; } - override void WorldLoaded(WorldEvent e) - { - // JumperCablesMapLoader loader = Get(); - - // // Clear out anything from the last level. - // deployedCables.Clear(); - // loader.originalLinedefSpecials2.Clear(); - // worldScanCompleted = false; - } - override void WorldTick() { JumperCablesMapLoader loader = Get(); @@ -54,21 +44,16 @@ class JumperCablesMapLoader : EventHandler } loader.worldScanCompleted = true; - - Console.printf("JMP: World scan completed."); } } override void WorldLineActivated(WorldEvent e) { - // TODO: Deplete batteries. - //Console.printf("Line activated: %d %d\n", e.ActivatedLine.index(), e.ActivatedLine.special); - + // Is this line affected by a battery? for(int cableIndex = 0; cableIndex < deployedCables.size(); cableIndex++) { if(deployedCables[cableIndex].lineDefIndex == e.ActivatedLine.index()) { - + // Yes. Deplete the battery. deployedCables[cableIndex].DecrementBattery(); - break; } } @@ -76,24 +61,16 @@ class JumperCablesMapLoader : EventHandler void RegisterCables(JumperCablesDeployed cableActor) { - // Console.printf("REGISTERING %d\n", deployedCables.Find(cableActor)); if(deployedCables.Find(cableActor) == deployedCables.size()) { deployedCables.Push(cableActor); - - // FIXME: Remove this. - // Console.printf("Cables registered %d\n", deployedCables.size()); } } void UnregisterCables(JumperCablesDeployed cableActor) { - // Console.printf("UNREGISTERING %d\n", deployedCables.Find(cableActor)); int index = deployedCables.find(cableActor); if(index != deployedCables.size()) { deployedCables.delete(index); - - // FIXME: Remove this. - // Console.printf("Cables unregistered %d\n", deployedCables.size()); } } } @@ -120,7 +97,6 @@ class JumperCablesDeployed : HDUPK override void PostBeginPlay() { - // Console.printf("IS THIS EVEN GETTING CALLED!?\n"); bNoGravity = true; // Register us with the global event handler so we can @@ -235,10 +211,13 @@ class JumperCablesDeployed : HDUPK 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*? + // Despawn to battery if the sector gets re-destroyed. + if(level.lines[lineDefIndex].special == 0) + { + DespawnToBattery(); + } + } } class JumperCablesUsable : HDWeapon @@ -290,18 +269,13 @@ class JumperCablesUsable : HDWeapon Actor hpc, String whichdot) { - // int cx,cy,cw,ch; - // [cx,cy,cw,ch]=screen.GetClipRect(); - // statusBar.SetClipRect(cx,cy,cw,ch); - + // Switch reticle colors depending on the LED status. String filename = String.Format("graphics/jmpr_reticle%d.png", lastIndicatorStatus + 1); - // console.printf("blep, %s %d\n", filename, frame); statusBar.drawImage( filename, (0, 0) + bob, statusBar.DI_SCREEN_CENTER | statusBar.DI_ITEM_TOP, scale : (0.5, 0.5)); - } states @@ -313,9 +287,21 @@ class JumperCablesUsable : HDWeapon stop; select: - JMPP A 0; + JMPP A 1; + + // Raise it back up... + JMPP A 1 offset(0, 128); + JMPP A 1 offset(0, 96); + JMPP A 1 offset(0, 72); + JMPP A 1 offset(0, 64); + JMPP A 1 offset(0, 48); + JMPP A 1 offset(0, 32); + JMPP A 1 offset(0, 16); + JMPP A 1 offset(0, 0); + goto super::select; + // LCD overlay states. ledd_left_indicator: JMIL A 1 offset(0, -32); wait; ledd_right_indicator: @@ -329,27 +315,18 @@ class JumperCablesUsable : HDWeapon } A_WeaponReady(WRF_NOFIRE | WRF_ALLOWUSER3); // USER3 = MagManager. + // Line trace to see what we might be inspecting. FLineTraceData linetraceData; DoLineTrace(HDPlayerPawn(invoker.owner), linetraceData); - Vector3 hitPos; - if(linetraceData.hitType != TRACE_HitNone) { - hitPos = linetraceData.hitLocation - Vec3Offset(0, 0, 0); - } - + // Overlay setup. A_Overlay(355, "ledd_left_indicator"); A_Overlay(356, "ledd_right_indicator"); - SpawnParticleForLineTrace( + // Update displays. + UpdateVisualsForLineTrace( HDPlayerPawn(invoker.owner), linetraceData); - - // console.printf("blep, %d\n", frame); - - //player.getpsprite(PSP_WEAPON).frame = randompick(0, 1, 2); - - // invoker.lastIndicatorStatus += 1; - // invoker.lastIndicatorStatus %= 3; } goto readyend; @@ -399,28 +376,18 @@ class JumperCablesUsable : HDWeapon } - action void SpawnParticleForLineTrace(HDPlayerPawn pawn, FLineTraceData linetraceData) + action void UpdateVisualsForLineTrace(HDPlayerPawn pawn, FLineTraceData linetraceData) { Line hitLine = linetraceData.hitLine; String particleColor = "darkred"; - - // if(linetraceData.hitType == TRACE_HitWall) { - // JumperCablesMapLoader loader = JumperCablesMapLoader.Get(); - // int originalSpecial = loader.originalLinedefSpecials2.Get(hitLine.index()); - // int thisLineSpecial = hitLine.special; - - // if(originalSpecial != thisLineSpecial) { - // particleColor = "green"; - // } - // } - Line brokenLine = LineTraceFindbrokenLine(linetraceData); + // Set main frame (LEDs) based on raytrace status. if(brokenLine) { - particleColor = "green"; // Found somethine we can fix! + particleColor = "green"; player.getpsprite(PSP_WEAPON).frame = 1; } else { @@ -439,6 +406,9 @@ class JumperCablesUsable : HDWeapon } + // Set display overlay frames. + + // Default to random numbers. int frame_left = random(0, 15); int frame_right = random(0, 15); @@ -449,25 +419,26 @@ class JumperCablesUsable : HDWeapon if(lineForDisplay) { JumperCablesMapLoader loader = JumperCablesMapLoader.Get(); int originalSpecial = loader.originalLinedefSpecials2.Get(lineForDisplay.index()); - console.printf("Original special: %d", originalSpecial); frame_right = originalSpecial % 16; frame_left = originalSpecial / 16; } - player.getpsprite(355).frame = frame_left; player.getpsprite(356).frame = frame_right; + // Set indicator status fo the HUD. invoker.lastIndicatorStatus = player.getpsprite(PSP_WEAPON).frame; - if(linetraceData.hitType != TRACE_HitNone) { - Vector3 hitPos = linetraceData.hitLocation - Vec3Offset(0, 0, 0); - // console.printf("hit pos: %f %f %f\n", hitPos.x, hitPos.y, hitPos.z); - A_SpawnParticle( - particleColor, - 0, 10, 2, 0, - hitPos.x, - hitPos.y, - hitPos.z); + // Debug particle display for the linetrace. + if(hd_debug > 1) { + if(linetraceData.hitType != TRACE_HitNone) { + Vector3 hitPos = linetraceData.hitLocation - Vec3Offset(0, 0, 0); + A_SpawnParticle( + particleColor, + 0, 10, 2, 0, + hitPos.x, + hitPos.y, + hitPos.z); + } } } @@ -519,7 +490,7 @@ class JumperCablesUsable : HDWeapon 48, pawn.pitch, flags : TRF_THRUACTORS | TRF_ABSOFFSET, - offsetz : pawn.gunPos.z - 1, // * 0.8, + offsetz : pawn.gunPos.z - 1, offsetforward : pawn.gunPos.x, offsetside : pawn.gunPos.y, data : linetraceData); @@ -592,10 +563,6 @@ class JumperCablesUsable : HDWeapon // If we found something broken, then return the closest // thing we found. if(closestLineInRange) { - // Console.printf( - // "Dist to line: %f\n", - // GetDistanceToLine( - // closestLineInRange, linetraceData.hitLocation)); return closestLineInRange; } @@ -606,8 +573,8 @@ class JumperCablesUsable : HDWeapon action void AttachCables(HDPlayerPawn pawn) { + // Do we have enough ammo? HDMagAmmo batteryAmmo = HDMagAmmo(FindInventory("HDBattery")); - if(!batteryAmmo || batteryAmmo.amount < 1) { invoker.owner.A_Log("You need a battery to use this."); return; @@ -617,53 +584,56 @@ class JumperCablesUsable : HDWeapon FLineTraceData linetraceData; DoLineTrace(pawn, linetraceData); + // Are we even close enough to a line? Line brokenLine = LineTraceFindbrokenLine(linetraceData); - - if(brokenLine) { - - if(loader.originalLinedefSpecials2.CheckKey(brokenLine.index())) { - - // pawn.A_Log(string.Format("Blep3 %d", - // loader.originalLinedefSpecials2.Get(hitLine.index()))); - - int originalSpecial = loader.originalLinedefSpecials2.Get(brokenLine.index()); - int currentSpecial = brokenLine.special; - - if(originalSpecial != currentSpecial) { - - // Remove battery from inventory. - int batteryCharges = batteryAmmo.TakeMag(true); - // Console.printf("batteryCharges: %d", batteryCharges); - - if(batteryCharges < 1) { - - // Handle getting an empty battery. Just give it back. - invoker.owner.A_Log("No charged batteries available to use."); - batteryAmmo.AddAMag(batteryCharges); - - } else { - - JumperCablesDeployed deployed = JumperCablesDeployed( - Spawn( - "JumperCablesDeployed", - 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; - } - } - } + if(!brokenLine) { + invoker.owner.A_Log("Not close enough to repair."); + return; } + + if(!loader.originalLinedefSpecials2.CheckKey(brokenLine.index())) { + invoker.owner.A_Log("No mechanism present to repair."); + return; + } + + // Check to see if it's something that actually needs fixing. + int originalSpecial = loader.originalLinedefSpecials2.Get(brokenLine.index()); + int currentSpecial = brokenLine.special; + if(originalSpecial == currentSpecial) { + invoker.owner.A_Log("This is already functioning as normal."); + return; + } + + // Remove battery from inventory, but make sure we're actually + // getting a charged one. + int batteryCharges = batteryAmmo.TakeMag(true); + if(batteryCharges < 1) { + invoker.owner.A_Log("No charged batteries available to use."); + batteryAmmo.AddAMag(batteryCharges); // Just give it back. + return; + } + + // Actually spawn the deployed item. + JumperCablesDeployed deployed = JumperCablesDeployed( + Spawn( + "JumperCablesDeployed", + linetraceData.hitLocation - linetraceData.hitDir * 4)); + + deployed.lineDefIndex = brokenLine.index(); + deployed.bNoGravity = true; + deployed.charges = batteryCharges; + + // Use a different kind of flat sprite and angle depending on + // if we're attaching to wall or floor/ceiling. + 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); + } + + // Restore the damn line special already. + brokenLine.special = originalSpecial; } override void DrawHUDStuff(HDStatusBar statusBar, HDWeapon weapon, HDPlayerPawn pawn)