diff --git a/code/game/objects/items/weapons/stunbaton.dm b/code/game/objects/items/weapons/stunbaton.dm
index 43a79de4c46..79a25e3cd0b 100644
--- a/code/game/objects/items/weapons/stunbaton.dm
+++ b/code/game/objects/items/weapons/stunbaton.dm
@@ -181,3 +181,12 @@
stunforce = 5
hitcost = 2500
slot_flags = null
+ var/obj/item/device/assembly/igniter/sparkler = 0
+
+/obj/item/weapon/melee/baton/cattleprod/New()
+ ..()
+ sparkler = new (src)
+
+/obj/item/weapon/melee/baton/cattleprod/baton_stun()
+ if(sparkler.activate())
+ ..()
\ No newline at end of file
diff --git a/code/game/objects/items/weapons/weaponry.dm b/code/game/objects/items/weapons/weaponry.dm
index 9087ec8dc77..910c3dfc84a 100644
--- a/code/game/objects/items/weapons/weaponry.dm
+++ b/code/game/objects/items/weapons/weaponry.dm
@@ -117,7 +117,7 @@
qdel(I)
qdel(src)
- else if(istype(I, /obj/item/weapon/wirecutters) && !(I.flags & NODROP))
+ else if(istype(I, /obj/item/device/assembly/igniter) && !(I.flags & NODROP))
var/obj/item/weapon/melee/baton/cattleprod/P = new /obj/item/weapon/melee/baton/cattleprod
if(!remove_item_from_storage(user))
@@ -125,7 +125,7 @@
user.unEquip(I)
user.put_in_hands(P)
- user << "You fasten the wirecutters to the top of the rod with the cable, prongs outward."
+ user << "You fasten [I] to the top of the rod with the cable."
qdel(I)
qdel(src)
diff --git a/code/modules/assembly/timer.dm b/code/modules/assembly/timer.dm
index 889136ec691..55f99638f2d 100644
--- a/code/modules/assembly/timer.dm
+++ b/code/modules/assembly/timer.dm
@@ -8,6 +8,8 @@
var/timing = 0
var/time = 5
+ var/saved_time = 5
+ var/loop = 0
/obj/item/device/assembly/timer/New()
@@ -46,6 +48,8 @@
cooldown = 2
spawn(10)
process_cooldown()
+ if(loop)
+ timing = 1
update_icon()
@@ -55,7 +59,7 @@
if(time <= 0)
timing = 0
timer_end()
- time = initial(time)
+ time = saved_time
/obj/item/device/assembly/timer/update_icon()
@@ -73,6 +77,7 @@
var/second = time % 60
var/minute = (time - second) / 60
var/dat = "Timing Unit\n[(timing ? "Timing" : "Not Timing")] [minute]:[second]\n- - + +\n"
+ dat += "
Stop repeating" : "1'>Set to repeat")]"
dat += "
Refresh"
dat += "
Close"
var/datum/browser/popup = new(user, "timer", name)
@@ -95,11 +100,14 @@
bombers += timer_message
log_game("[key_name(usr)] activated [src] attachment for [loc]")
update_icon()
+ if(href_list["repeat"])
+ loop = text2num(href_list["repeat"])
if(href_list["tp"])
var/tp = text2num(href_list["tp"])
time += tp
time = min(max(round(time), 1), 600)
+ saved_time = time
if(href_list["close"])
usr << browse(null, "window=timer")
diff --git a/code/modules/assembly/voice.dm b/code/modules/assembly/voice.dm
index 9364743c5db..68299dfa829 100644
--- a/code/modules/assembly/voice.dm
+++ b/code/modules/assembly/voice.dm
@@ -11,20 +11,65 @@
verb_exclaim = "beeps"
var/listening = 0
var/recorded = "" //the activation message
+ var/mode = 1
+ var/global/list/modes = list("inclusive",
+ "exclusive",
+ "recognizer",
+ "voice sensor")
/obj/item/device/assembly/voice/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq, list/spans)
if(speaker == src)
return
if(listening && !radio_freq)
- recorded = raw_message
- listening = 0
- say("Activation message is '[recorded]'.")
+ record_speech(speaker, raw_message)
else
- if(findtextEx(raw_message, recorded))
+ if(check_activation(speaker, raw_message))
spawn(10)
pulse(0)
+/obj/item/device/assembly/voice/proc/record_speech(atom/movable/speaker, raw_message)
+ switch(mode)
+ if(1)
+ recorded = raw_message
+ listening = 0
+ say("Activation message is '[recorded]'.")
+ if(2)
+ recorded = raw_message
+ listening = 0
+ say("Activation message is '[recorded]'.")
+ if(3)
+ recorded = speaker
+ listening = 0
+ say("Your voice pattern is saved.")
+ if(4)
+ if(length(raw_message))
+ spawn(10)
+ pulse(0)
+
+/obj/item/device/assembly/voice/proc/check_activation(atom/movable/speaker, raw_message)
+ . = 0
+ switch(mode)
+ if(1)
+ if(findtextEx(raw_message, recorded))
+ . = 1
+ if(2)
+ if(raw_message == recorded)
+ . = 1
+ if(3)
+ if(speaker == recorded)
+ . = 1
+ if(4)
+ if(length(raw_message))
+ . = 1
+
+/obj/item/device/assembly/voice/attackby(obj/item/weapon/W, mob/user, params)
+ if(istype(W, /obj/item/device/multitool))
+ mode %= modes.len
+ mode++
+ user << "You set [src] into a [modes[mode]] mode."
+ listening = 0
+
/obj/item/device/assembly/voice/activate()
if(secured)
if(!holder)
diff --git a/code/modules/crafting/recipes.dm b/code/modules/crafting/recipes.dm
index 1b242b34cfa..76e0cead24a 100644
--- a/code/modules/crafting/recipes.dm
+++ b/code/modules/crafting/recipes.dm
@@ -63,7 +63,7 @@
result = /obj/item/weapon/melee/baton/cattleprod
reqs = list(/obj/item/weapon/restraints/handcuffs/cable = 1,
/obj/item/stack/rods = 1,
- /obj/item/weapon/wirecutters = 1,
+ /obj/item/device/assembly/igniter = 1,
/obj/item/weapon/stock_parts/cell = 1)
time = 80
parts = list(/obj/item/weapon/stock_parts/cell = 1)
diff --git a/icons/mob/inhands/items_lefthand.dmi b/icons/mob/inhands/items_lefthand.dmi
index 5093003a035..8e8cdeb2fc2 100644
Binary files a/icons/mob/inhands/items_lefthand.dmi and b/icons/mob/inhands/items_lefthand.dmi differ
diff --git a/icons/mob/inhands/items_righthand.dmi b/icons/mob/inhands/items_righthand.dmi
index f5868458340..37d22120d7d 100644
Binary files a/icons/mob/inhands/items_righthand.dmi and b/icons/mob/inhands/items_righthand.dmi differ
diff --git a/icons/obj/weapons.dmi b/icons/obj/weapons.dmi
index 93ed62314d3..675da21434a 100644
Binary files a/icons/obj/weapons.dmi and b/icons/obj/weapons.dmi differ