diff --git a/code/datums/wires/syndicatebomb.dm b/code/datums/wires/syndicatebomb.dm index df660b266c2..e45bbd6ad38 100644 --- a/code/datums/wires/syndicatebomb.dm +++ b/code/datums/wires/syndicatebomb.dm @@ -20,7 +20,7 @@ if(WIRE_BOOM) if(B.active) holder.visible_message("\icon[B] An alarm sounds! It's go-") - B.timer = 0 + B.explode_now = TRUE tell_admins(B) if(WIRE_UNBOLT) holder.visible_message("\icon[B] The bolts spin in place for a moment.") @@ -30,28 +30,28 @@ else holder.visible_message("\icon[B] The bomb chirps.") playsound(B, 'sound/machines/chime.ogg', 30, 1) - B.timer += 30 + B.detonation_timer += 300 B.delayedbig = TRUE if(WIRE_PROCEED) holder.visible_message("\icon[B] The bomb buzzes ominously!") playsound(B, 'sound/machines/buzz-sigh.ogg', 30, 1) - if(B.timer >= 61) // Long fuse bombs can suddenly become more dangerous if you tinker with them. - B.timer = 60 - else if(B.timer >= 21) - B.timer -= 10 - else if(B.timer >= 11) // Both to prevent negative timers and to have a little mercy. - B.timer = 10 + var/seconds = B.seconds_remaining() + if(seconds >= 61) // Long fuse bombs can suddenly become more dangerous if you tinker with them. + B.detonation_timer = world.time + 600 + else if(seconds >= 21) + B.detonation_timer -= 100 + else if(seconds >= 11) // Both to prevent negative timers and to have a little mercy. + B.detonation_timer = world.time + 100 if(WIRE_ACTIVATE) if(!B.active && !B.defused) holder.visible_message("\icon[B] You hear the bomb start ticking!") - playsound(B, 'sound/machines/click.ogg', 30, 1) - B.active = TRUE + B.activate() B.update_icon() else if(B.delayedlittle) holder.visible_message("\icon[B] Nothing happens.") else holder.visible_message("\icon[B] The bomb seems to hesitate for a moment.") - B.timer += 10 + B.detonation_timer += 100 B.delayedlittle = TRUE /datum/wires/syndicatebomb/on_cut(wire, mend) @@ -63,7 +63,7 @@ else if(B.active) holder.visible_message("\icon[B] An alarm sounds! It's go-") - B.timer = 0 + B.explode_now = TRUE tell_admins(B) else B.defused = TRUE @@ -71,11 +71,11 @@ if(!mend && B.anchored) holder.visible_message("\icon[B] The bolts lift out of the ground!") playsound(B, 'sound/effects/stealthoff.ogg', 30, 1) - B.anchored = 0 + B.anchored = FALSE if(WIRE_PROCEED) if(!mend && B.active) holder.visible_message("\icon[B] An alarm sounds! It's go-") - B.timer = 0 + B.explode_now = TRUE tell_admins(B) if(WIRE_ACTIVATE) if(!mend && B.active) @@ -87,5 +87,7 @@ /datum/wires/syndicatebomb/proc/tell_admins(obj/machinery/syndicatebomb/B) if(istype(B, /obj/machinery/syndicatebomb/training)) return - log_game("A [B.name] was detonated via boom wire at X=[B.x], Y=[B.y], Z=[B.z].") - message_admins("A [B.name] was detonated via boom wire at (JMP).") + var/turf/T = get_turf(B) + log_game("\A [B] was detonated via boom wire at [COORD(T)].") + message_admins("A [B.name] was detonated via boom wire at \ + [ADMIN_COORDJMP(T)].") diff --git a/code/game/machinery/syndicatebomb.dm b/code/game/machinery/syndicatebomb.dm index b9c6a7b26c7..8e7912622b5 100644 --- a/code/game/machinery/syndicatebomb.dm +++ b/code/game/machinery/syndicatebomb.dm @@ -11,7 +11,10 @@ layer = BELOW_MOB_LAYER //so people can't hide it and it's REALLY OBVIOUS unacidable = 1 - var/timer = 60 + var/minimum_timer = 60 + var/timer_set = 60 + var/maximum_timer = 60000 + var/open_panel = FALSE //are the wires exposed? var/active = FALSE //is the bomb counting down? var/defused = FALSE //is the bomb capable of exploding? @@ -21,22 +24,48 @@ var/delayedlittle = FALSE //activation wire pulsed? var/obj/effect/countdown/syndicatebomb/countdown + var/next_beep + var/detonation_timer + var/explode_now = FALSE + /obj/machinery/syndicatebomb/process() - if(active && !defused && (timer > 0)) //Tick Tock - var/volume = (timer <= 5 ? 50 : 2) // Tick louder when the bomb is closer to being detonated. + if(!active) + STOP_PROCESSING(SSfastprocess, src) + detonation_timer = null + next_beep = null + countdown.stop() + return + + if(!isnull(next_beep) && (next_beep <= world.time)) + var/volume + switch(seconds_remaining()) + if(0 to 5) + volume = 50 + if(5 to 10) + volume = 40 + if(10 to 15) + volume = 30 + if(15 to 20) + volume = 20 + if(20 to 25) + volume = 10 + else + volume = 5 playsound(loc, beepsound, volume, 0) - timer-- - if(active && !defused && (timer <= 0)) //Boom - active = 0 - timer = initial(timer) + next_beep = world.time + 10 + + if(active && !defused && ((detonation_timer <= world.time) || explode_now)) + active = FALSE + timer_set = initial(timer_set) update_icon() if(payload in src) payload.detonate() - return - if(!active || defused) //Counter terrorists win + //Counter terrorists win + else if(!active || defused) if(defused && payload in src) payload.defuse() countdown.stop() + STOP_PROCESSING(SSfastprocess, src) /obj/machinery/syndicatebomb/New() wires = new /datum/wires/syndicatebomb(src) @@ -49,15 +78,25 @@ /obj/machinery/syndicatebomb/Destroy() qdel(wires) wires = null - return ..() + if(countdown) + qdel(countdown) + countdown = null + STOP_PROCESSING(SSfastprocess, src) + . = ..() /obj/machinery/syndicatebomb/examine(mob/user) ..() - user << "A digital display on it reads \"[timer]\"." + user << "A digital display on it reads \"[seconds_remaining()]\"." /obj/machinery/syndicatebomb/update_icon() icon_state = "[initial(icon_state)][active ? "-active" : "-inactive"][open_panel ? "-wires" : ""]" +/obj/machinery/syndicatebomb/proc/seconds_remaining() + if(active) + . = max(0, round((detonation_timer - world.time) / 10)) + else + . = timer_set + /obj/machinery/syndicatebomb/attackby(obj/item/I, mob/user, params) if(istype(I, /obj/item/weapon/wrench)) if(!anchored) @@ -124,9 +163,8 @@ user << "You cut the [src] apart." new /obj/item/stack/sheet/plasteel( loc, 5) qdel(src) - return else - return ..() + . = ..() /obj/machinery/syndicatebomb/attack_hand(mob/user) interact(user) @@ -142,22 +180,27 @@ else if(anchored) user << "The bomb is bolted to the floor!" +/obj/machinery/syndicatebomb/proc/activate() + active = TRUE + START_PROCESSING(SSfastprocess, src) + countdown.start() + next_beep = world.time + 10 + detonation_timer = world.time + (timer_set * 10) + playsound(loc, 'sound/machines/click.ogg', 30, 1) + /obj/machinery/syndicatebomb/proc/settings(mob/user) - var/newtime = input(user, "Please set the timer.", "Timer", "[timer]") as num - newtime = Clamp(newtime, initial(timer), 60000) + var/new_timer = input(user, "Please set the timer.", "Timer", "[timer_set]") as num if(in_range(src, user) && isliving(user)) //No running off and setting bombs from across the station - timer = newtime - src.loc.visible_message("\icon[src] timer set for [timer] seconds.") + timer_set = Clamp(new_timer, minimum_timer, maximum_timer) + src.loc.visible_message("\icon[src] timer set for [timer_set] seconds.") if(alert(user,"Would you like to start the countdown now?",,"Yes","No") == "Yes" && in_range(src, user) && isliving(user)) if(defused || active) if(defused) src.loc.visible_message("\icon[src] Device error: User intervention required.") return else - src.loc.visible_message("\icon[src] [timer] seconds until detonation, please clear the area.") - countdown.start() - playsound(loc, 'sound/machines/click.ogg', 30, 1) - active = 1 + src.loc.visible_message("\icon[src] [timer_set] seconds until detonation, please clear the area.") + activate() update_icon() add_fingerprint(user) @@ -197,7 +240,7 @@ desc = "An ominous looking device designed to detonate an explosive payload. Can be bolted down using a wrench." payload = null open_panel = TRUE - timer = 120 + timer_set = 120 /obj/machinery/syndicatebomb/empty/New() ..() @@ -475,9 +518,11 @@ if(timer < world.time) for(var/obj/machinery/syndicatebomb/B in machines) if(B.active) - B.timer = 0 + B.explode_now = TRUE detonated++ existant++ + var/turf/T = get_turf(B) + world << "[COORD(T)]" playsound(user, 'sound/machines/click.ogg', 20, 1) user << "[existant] found, [detonated] triggered." if(detonated) diff --git a/code/modules/countdown/countdown.dm b/code/modules/countdown/countdown.dm index b722ca39880..7167440898b 100644 --- a/code/modules/countdown/countdown.dm +++ b/code/modules/countdown/countdown.dm @@ -70,7 +70,7 @@ if(!istype(S)) return else if(S.active) - return S.timer + return S.seconds_remaining() /obj/effect/countdown/nuclearbomb name = "nuclear bomb countdown"