diff --git a/code/game/objects/items/weapons/grenades/chem_grenade.dm b/code/game/objects/items/weapons/grenades/chem_grenade.dm index cf241435d6..ce4e4f2ce6 100644 --- a/code/game/objects/items/weapons/grenades/chem_grenade.dm +++ b/code/game/objects/items/weapons/grenades/chem_grenade.dm @@ -22,6 +22,7 @@ if(!stage || stage==1) if(detonator) // detonator.loc=src.loc + detonator.detached() usr.put_in_hands(detonator) detonator=null stage=0 @@ -69,17 +70,14 @@ path = 1 if(beakers.len) user << "\blue You lock the assembly." - playsound(src.loc, 'sound/items/Screwdriver.ogg', 25, -3) name = "grenade" - icon_state = initial(icon_state) +"_locked" - stage = 2 else // user << "\red You need to add at least one beaker before locking the assembly." user << "\blue You lock the empty assembly." - playsound(src.loc, 'sound/items/Screwdriver.ogg', 25, -3) name = "fake grenade" - icon_state = initial(icon_state) +"_locked" - stage = 2 + playsound(src.loc, 'sound/items/Screwdriver.ogg', 25, -3) + icon_state = initial(icon_state) +"_locked" + stage = 2 else if(stage == 2) if(active && prob(95)) user << "\red You trigger the assembly!" @@ -114,8 +112,9 @@ if(detonator) usr << "With attached [detonator.name]" - activate() + activate(mob/user as mob) if(active) return + if(detonator) if(!isigniter(detonator.a_left)) detonator.a_left.activate() @@ -126,6 +125,11 @@ if(active) icon_state = initial(icon_state) + "_active" + if(user) + log_attack("[user.name] ([user.ckey]) primed \a [src]") + log_admin("ATTACK: [user] ([user.ckey]) primed \a [src]") + message_admins("ATTACK: [user] ([user.ckey]) primed \a [src]") + return proc/primed(var/primed = 1) @@ -195,9 +199,11 @@ B2.reagents.add_reagent("foaming_agent", 10) B2.reagents.add_reagent("pacid", 10) + detonator = new/obj/item/device/assembly_holder/timer_igniter(src) + beakers += B1 beakers += B2 - icon_state = "grenade" + icon_state = initial(icon_state) +"_locked" /obj/item/weapon/grenade/chem_grenade/incendiary name = "Incendiary Grenade" @@ -214,9 +220,11 @@ B2.reagents.add_reagent("plasma", 25) B2.reagents.add_reagent("sacid", 25) + detonator = new/obj/item/device/assembly_holder/timer_igniter(src) + beakers += B1 beakers += B2 - icon_state = "grenade" + icon_state = initial(icon_state) +"_locked" /obj/item/weapon/grenade/chem_grenade/cleaner name = "Cleaner Grenade" @@ -233,6 +241,8 @@ B2.reagents.add_reagent("water", 40) B2.reagents.add_reagent("cleaner", 10) + detonator = new/obj/item/device/assembly_holder/timer_igniter(src) + beakers += B1 beakers += B2 - icon_state = "grenade" + icon_state = initial(icon_state) +"_locked" diff --git a/code/game/objects/items/weapons/grenades/grenade.dm b/code/game/objects/items/weapons/grenades/grenade.dm index c381a8d513..99466a9d2a 100644 --- a/code/game/objects/items/weapons/grenades/grenade.dm +++ b/code/game/objects/items/weapons/grenades/grenade.dm @@ -16,11 +16,7 @@ if((CLUMSY in user.mutations) && prob(50)) user << "Huh? How does this thing work?" - log_attack("[user.name] ([user.ckey]) clumsily primed \a [src]") - log_admin("ATTACK: [user] ([user.ckey]) clumsily primed \a [src]") - message_admins("ATTACK: [user] ([user.ckey]) clumsily primed \a [src]") - - activate() + activate(user) add_fingerprint(user) spawn(5) prime() @@ -60,11 +56,7 @@ if(clown_check(user)) user << "You prime \the [name]! [det_time/10] seconds!" - log_attack("[user.name] ([user.ckey]) primed \a [src].") - log_admin("ATTACK: [user] ([user.ckey]) primed \a [src].") - message_admins("ATTACK: [user] ([user.ckey]) primed \a [src].") - - activate() + activate(user) add_fingerprint(user) if(iscarbon(user)) var/mob/living/carbon/C = user @@ -72,10 +64,15 @@ return -/obj/item/weapon/grenade/proc/activate() +/obj/item/weapon/grenade/proc/activate(mob/user as mob) if(active) return + if(user) + log_attack("[user.name] ([user.ckey]) primed \a [src]") + log_admin("ATTACK: [user] ([user.ckey]) primed \a [src]") + message_admins("ATTACK: [user] ([user.ckey]) primed \a [src]") + icon_state = initial(icon_state) + "_active" active = 1 playsound(loc, 'sound/weapons/armbomb.ogg', 75, 1, -3) diff --git a/code/modules/assembly/holder.dm b/code/modules/assembly/holder.dm index e021cd4158..b8fd910719 100644 --- a/code/modules/assembly/holder.dm +++ b/code/modules/assembly/holder.dm @@ -23,6 +23,8 @@ proc/process_activation(var/obj/item/device/D) return + proc/detached() + return IsAssemblyHolder() @@ -196,6 +198,58 @@ +/obj/item/device/assembly_holder/timer_igniter + name = "timer-igniter assembly" + New() + ..() + var/obj/item/device/assembly/igniter/ign = new(src) + ign.secured = 1 + ign.holder = src + var/obj/item/device/assembly/timer/tmr = new(src) + tmr.time=5 + tmr.secured = 1 + tmr.holder = src + processing_objects.Add(tmr) + a_left = tmr + a_right = ign + secured = 1 + update_icon() + name = initial(name) + " ([tmr.time] secs)" + loc.verbs += /obj/item/device/assembly_holder/timer_igniter/verb/configure + + detached() + loc.verbs -= /obj/item/device/assembly_holder/timer_igniter/verb/configure + ..() + + verb/configure() + set name = "Set Timer" + set category = "Object" + set src in usr + + if ( !(usr.stat || usr.restrained()) ) + var/obj/item/device/assembly_holder/holder + if(istype(src,/obj/item/weapon/grenade/chem_grenade)) + var/obj/item/weapon/grenade/chem_grenade/gren = src + holder=gren.detonator + var/obj/item/device/assembly/timer/tmr = holder.a_left + if(!istype(tmr,/obj/item/device/assembly/timer)) + tmr = holder.a_right + if(!istype(tmr,/obj/item/device/assembly/timer)) + usr << "This detonator has no timer." + return + + if(tmr.timing) + usr << "Clock is ticking already." + else + var/ntime = input("Enter desired time in seconds", "Time", "5") as num + if (ntime>0 && ntime<1000) + tmr.time = ntime + name = initial(name) + "([tmr.time] secs)" + usr << "Timer set to [tmr.time] seconds." + else + usr << "Timer can't be [ntime<=0?"negative":"more than 1000 seconds"]." + else + usr << "You cannot do this while [usr.stat?"unconscious/dead":"restrained"]." diff --git a/code/modules/assembly/proximity.dm b/code/modules/assembly/proximity.dm index 3549fe9954..c54afdc0c6 100644 --- a/code/modules/assembly/proximity.dm +++ b/code/modules/assembly/proximity.dm @@ -48,8 +48,7 @@ sense() - var/obj/mainloc = loc - if(holder) mainloc=holder.loc + var/turf/mainloc = get_turf(src) // if(scanning && cooldown <= 0) // mainloc.visible_message("\icon[src] *boop* *boop*", "*boop* *boop*") if((!holder && !secured)||(!scanning)||(cooldown > 0)) return 0 @@ -64,8 +63,7 @@ process() if(scanning) - var/obj/mainloc = loc - if(holder) mainloc=holder.loc + var/turf/mainloc = get_turf(src) for(var/mob/living/A in range(range,mainloc)) if (A.move_speed < 12) sense() diff --git a/code/modules/assembly/timer.dm b/code/modules/assembly/timer.dm index fc7c65b39b..5ed584eecb 100644 --- a/code/modules/assembly/timer.dm +++ b/code/modules/assembly/timer.dm @@ -20,7 +20,9 @@ activate() if(!..()) return 0//Cooldown check + timing = !timing + update_icon() return 0 @@ -37,7 +39,7 @@ timer_end() - if((!secured)||(cooldown > 0)) return 0 + if(!secured) return 0 pulse(0) if(!holder) visible_message("\icon[src] *beep* *beep*", "*beep* *beep*")