diff --git a/zscript.zs b/zscript.zs index d761318..7e38f1a 100644 --- a/zscript.zs +++ b/zscript.zs @@ -8,6 +8,7 @@ const jumperCablesFixRange = 48; // Maximum distance to a broken linedef to class JumperCablesMapLoader : EventHandler { Map originalLinedefSpecials2; + Array deployedCables; static JumperCablesMapLoader Get() { @@ -20,28 +21,62 @@ class JumperCablesMapLoader : EventHandler { JumperCablesMapLoader loader = Get(); + // Clear out anything from the last level. + deployedCables.Clear(); loader.originalLinedefSpecials2.Clear(); - // Console.printf("butt\n"); - // Console.printf("butt %s\n", level.MapName); - // Console.printf("linedefs %d\n", level.Lines.size()); - + // Go through all the linedefs and make note of what they're + // supposed to do. for(int k = 0; k < level.Lines.size(); k++) { Line line = level.Lines[k]; - if(line.special != 0) { - // Console.printf(" %d = %d\n", line.index(), line.special); loader.originalLinedefSpecials2.Insert(line.index(), line.special); } } + } + override void WorldLineActivated(WorldEvent e) + { + // TODO: Deplete batteries. + Console.printf("Line activated: %d %d\n", e.ActivatedLine.index(), e.ActivatedLine.special); + + for(int cableIndex = 0; cableIndex < deployedCables.size(); cableIndex++) { + if(deployedCables[cableIndex].lineDefIndex == e.ActivatedLine.index()) { + + deployedCables[cableIndex].DecrementBattery(); + + break; + } + } + } + + void RegisterCables(JumperCablesDeployed 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\n"); + int index = deployedCables.find(cableActor); + if(index != deployedCables.size()) { + deployedCables.delete(index); + + // FIXME: Remove this. + Console.printf("Cables unregistered %d\n", deployedCables.size()); + } } } - class JumperCablesDeployed : HDUPK { int lineDefIndex; + int charges; default { @@ -50,32 +85,54 @@ class JumperCablesDeployed : HDUPK states { spawn: - DERP A -1 { + 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); } stop; give: - DERP A 0 { - Console.printf("yoink\n"); - // Re-break the line. - level.Lines[lineDefIndex].special = 0; - Destroy(); - } + DERP A 0; goto spawn; } - override bool OnGrab(Actor grabber) + void DecrementBattery() + { + charges -= 1; + Console.printf("battery used, now: %d", charges); + if(charges <= 0) { + DespawnToBattery(); + } + } + + void DespawnToBattery() { // Re-break the linedef. level.Lines[lineDefIndex].special = 0; - // TODO: Spawn a battery. + // Spawn a battery, with the same level of charge. + HDMagAmmo.SpawnMag(self, "HDBattery", self.charges); + // TODO: Spawn debris. - Console.printf("NO!\n"); + JumperCablesMapLoader loader = JumperCablesMapLoader.Get(); + loader.UnregisterCables(self); + Destroy(); + } + + override bool OnGrab(Actor grabber) + { + DespawnToBattery(); return false; } + + // TODO: Tick function where we add sparks and stuff? + // TODO: Tick function where we set the sprite to indicate the charge level. + // TODO: Despawn if the sector gets broken *again*? } class JumperCablesUsable : HDWeapon @@ -314,6 +371,13 @@ class JumperCablesUsable : HDWeapon action void AttachCables(HDPlayerPawn pawn) { + HDMagAmmo batteryAmmo = HDMagAmmo(FindInventory("HDBattery")); + + if(!batteryAmmo || batteryAmmo.amount < 1) { + invoker.owner.A_Log("You need a battery to use this."); + return; + } + JumperCablesMapLoader loader = JumperCablesMapLoader.Get(); FLineTraceData linetraceData; DoLineTrace(pawn, linetraceData); @@ -332,10 +396,18 @@ class JumperCablesUsable : HDWeapon if(originalSpecial != currentSpecial) { + // Remove battery from inventory. + int batteryCharges = batteryAmmo.TakeMag(true); + Console.printf("batteryCharges: %d", batteryCharges); + JumperCablesDeployed deployed = JumperCablesDeployed( - Spawn("JumperCablesDeployed", linetraceData.hitLocation)); + Spawn( + "JumperCablesDeployed", + linetraceData.hitLocation - linetraceData.hitDir * 8)); + deployed.lineDefIndex = brokenLine.index(); deployed.bNoGravity = true; + deployed.charges = batteryCharges; brokenLine.special = originalSpecial; }