diff --git a/code/game/objects/items/weapons/stunbaton.dm b/code/game/objects/items/weapons/stunbaton.dm
index 5dec465c1db..6c7ad5958d7 100644
--- a/code/game/objects/items/weapons/stunbaton.dm
+++ b/code/game/objects/items/weapons/stunbaton.dm
@@ -5,7 +5,7 @@
icon_state = "stunbaton"
item_state = "baton"
slot_flags = SLOT_BELT
- force = 15
+ force = 5
sharp = 0
edge = 0
throwforce = 7
@@ -18,6 +18,7 @@
var/obj/item/weapon/cell/bcell
var/hitcost = 1000 //oh god why do power cells carry so much charge? We probably need to make a distinction between "industrial" sized power cells for APCs and power cells for everything else.
var/baton_color = "#FF6A00"
+ var/sheathed = 1 //electrocutes only on harm intent
/obj/item/weapon/melee/baton/Initialize()
. = ..()
@@ -125,6 +126,10 @@
stun *= 0.5
if(status) //Checks to see if the stunbaton is on.
agony *= 0.5 //whacking someone causes a much poorer contact than prodding them.
+ if(sheathed) //however breaking the skin results in a more potent electric shock or some bullshit. im a coder, not a doctor
+ L.electrocute_act(force * 2, src, def_zone = target_zone)
+ else
+ L.electrocute_act(force * 2, src, ground_zero = target_zone)
else
agony = 0
//we can't really extract the actual hit zone from ..(), unfortunately. Just act like they attacked the area they intended to.
@@ -151,6 +156,7 @@
return 1
else
H.visible_message("[L] has been prodded in the [affecting.name] with [src] by [user]!")
+ H.electrocute_act(force * 2, src, ground_zero = target_zone)
else
if(!status)
L.visible_message("[L] has been prodded with [src] by [user]. Luckily it was off.")
@@ -221,6 +227,7 @@
attack_verb = list("poked")
slot_flags = null
baton_color = "#FFDF00"
+ sheathed = 0
/obj/item/weapon/melee/baton/stunrod
name = "stunrod"
@@ -228,10 +235,11 @@
icon = 'icons/obj/stunrod.dmi'
icon_state = "stunrod"
item_state = "stunrod"
- force = 20
+ force = 7
baton_color = "#75ACFF"
origin_tech = list(TECH_COMBAT = 4, TECH_ILLEGAL = 2)
contained_sprite = 1
+ sheathed = 0
/obj/item/weapon/melee/baton/stunrod/Initialize()
bcell = new/obj/item/weapon/cell/high(src)
@@ -262,6 +270,7 @@
stunforce = 1
origin_tech = list(TECH_COMBAT = 1)
contained_sprite = 1
+ sheathed = 0
/obj/item/weapon/melee/baton/slime/Initialize()
bcell = new/obj/item/weapon/cell/high(src)
diff --git a/code/game/objects/structures/crates_lockers/crates.dm b/code/game/objects/structures/crates_lockers/crates.dm
index d5ace98cb75..4349345c0bf 100644
--- a/code/game/objects/structures/crates_lockers/crates.dm
+++ b/code/game/objects/structures/crates_lockers/crates.dm
@@ -31,9 +31,14 @@
if(rigged && locate(/obj/item/device/radio/electropack) in src)
if(isliving(usr))
var/mob/living/L = usr
- if(L.electrocute_act(17, src))
+ var/touchy_hand
+ if(L.hand)
+ touchy_hand = "r_hand"
+ else
+ touchy_hand = "l_hand"
+ if(L.electrocute_act(17, src, ground_zero = touchy_hand))
spark(src, 5, alldirs)
- if(usr.stunned)
+ if(L.stunned)
return 2
playsound(loc, 'sound/machines/click.ogg', 15, 1, -3)
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index 640ffefa6e1..e1224414152 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -404,8 +404,9 @@
if(wear_id)
return wear_id.GetID()
-/mob/living/carbon/human/electrocute_act(var/shock_damage, var/obj/source, var/base_siemens_coeff = 1.0, var/def_zone = null, var/tesla_shock = 0)
+/mob/living/carbon/human/electrocute_act(var/shock_damage, var/obj/source, var/base_siemens_coeff = 1.0, var/def_zone = null, var/tesla_shock = 0, var/ground_zero)
var/hairvar = 0
+ var/list/damage_areas = list()
if(status_flags & GODMODE) return 0 //godmode
if (!tesla_shock)
@@ -414,7 +415,7 @@
return 0
if(!def_zone)
- var/list/damage_areas = list() //The way this works is by damaging multiple areas in an "Arc" if no def_zone is provided. should be pretty easy to add more arcs if it's needed. though I can't imangine a situation that can apply.
+ //The way this works is by damaging multiple areas in an "Arc" if no def_zone is provided. should be pretty easy to add more arcs if it's needed. though I can't imangine a situation that can apply.
if(istype(user, /mob/living/carbon/human))
if(h_style == "Floorlength Braid" || h_style == "Very Long Hair")
hairvar = 1
@@ -423,7 +424,7 @@
if(1)
damage_areas = list("l_hand", "l_arm", "chest", "r_arm", "r_hand")
if(2)
- damage_areas = list("r_hand", "r_arm", "chest", "l_arm", "L_hand")
+ damage_areas = list("r_hand", "r_arm", "chest", "l_arm", "l_hand")
if(3)
damage_areas = list("l_hand", "l_arm", "chest", "groin", "l_leg", "l_foot")
if(4)
@@ -437,31 +438,65 @@
h_style = "skinhead"
visible_message("[src]'s hair gets a burst of electricty through it, burning and turning to dust!", "your hair burns as the current flows through it, turning to dust!", "You hear a crackling sound, and smell burned hair!.")
update_hair()
- if(gloves)
- shock_damage *= gloves.siemens_coefficient
+ else
+ damage_areas = list(def_zone)
- for (var/area in damage_areas)
- apply_damage(shock_damage, BURN, area, used_weapon="Electrocution")
- shock_damage *= 0.4
- playsound(loc, "sparks", 50, 1, -1)
+ if(!ground_zero)
+ ground_zero = pick(damage_areas)
- if (shock_damage > 15 || tesla_shock)
- visible_message(
- "[src] was shocked by the [source]!",
- "You feel a powerful shock course through your body!",
- "You hear a heavy electrical crack."
- )
- Stun(10)//This should work for now, more is really silly and makes you lay there forever
- Weaken(10)
+ if(!(ground_zero in damage_areas))
+ damage_areas.Add(ground_zero) //sucks to suck, get more zappy time bitch
- else
- visible_message(
- "[src] was mildly shocked by the [source].",
- "You feel a mild shock course through your body.",
- "You hear a light zapping."
- )
+ var/obj/item/organ/external/contact = get_organ(check_zone(ground_zero))
+ shock_damage *= get_siemens_coefficient_organ(contact)
- spark(loc, 5, alldirs)
+ var/obj/item/organ/external/affecting
+ for (var/area in damage_areas)
+
+ affecting = get_organ(check_zone(area))
+ var/emp_damage
+ switch(shock_damage)
+ if(-INFINITY to 5)
+ emp_damage = 0
+ if(6 to 19)
+ emp_damage = 3
+ if(20 to 49)
+ emp_damage = 2
+ else
+ emp_damage = 1
+
+ if(emp_damage)
+ for(var/obj/item/organ/O in affecting.internal_organs)
+ O.emp_act(emp_damage)
+ emp_damage *= 0.4
+ for(var/obj/item/I in affecting.implants)
+ I.emp_act(emp_damage)
+ emp_damage *= 0.4
+ for(var/obj/item/I in affecting)
+ I.emp_act(emp_damage)
+ emp_damage *= 0.4
+
+ apply_damage(shock_damage, BURN, area, used_weapon="Electrocution")
+ shock_damage *= 0.4
+ playsound(loc, "sparks", 50, 1, -1)
+
+ if (shock_damage > 15 || tesla_shock)
+ visible_message(
+ "[src] was shocked by the [source]!",
+ "You feel a powerful shock course through your body!",
+ "You hear a heavy electrical crack."
+ )
+ Stun(10)//This should work for now, more is really silly and makes you lay there forever
+ Weaken(10)
+
+ else
+ visible_message(
+ "[src] was mildly shocked by the [source].",
+ "You feel a mild shock course through your body.",
+ "You hear a light zapping."
+ )
+
+ spark(loc, 5, alldirs)
return shock_damage
diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm
index 5dae43d44b5..010b6c8d612 100644
--- a/code/modules/mob/living/living_defense.dm
+++ b/code/modules/mob/living/living_defense.dm
@@ -128,7 +128,7 @@
return target_zone
//Called when the mob is hit with an item in combat. Returns the blocked result
-/mob/living/proc/hit_with_weapon(obj/item/I, mob/living/user, var/effective_force, var/hit_zone)
+/mob/living/proc/hit_with_weapon(obj/item/I, mob/living/user, var/effective_force, var/hit_zone, var/ground_zero)
visible_message("[src] has been [LAZYPICK(I.attack_verb,"attacked")] with [I] by [user]!")
var/blocked = run_armor_check(hit_zone, "melee")
diff --git a/code/modules/organs/organ.dm b/code/modules/organs/organ.dm
index 98f3b837a28..5e57c1ce380 100644
--- a/code/modules/organs/organ.dm
+++ b/code/modules/organs/organ.dm
@@ -283,13 +283,12 @@
/obj/item/organ/emp_act(severity)
if(!(status & ORGAN_ROBOT))
return
+
switch (severity)
if (1.0)
take_damage(rand(7,20) * emp_coeff)
- return
if (2.0)
take_damage(rand(3,7) * emp_coeff)
- return
if(3.0)
take_damage(rand(3) * emp_coeff)
diff --git a/code/modules/organs/subtypes/machine.dm b/code/modules/organs/subtypes/machine.dm
index 81130b4e5ec..5234641d457 100644
--- a/code/modules/organs/subtypes/machine.dm
+++ b/code/modules/organs/subtypes/machine.dm
@@ -65,11 +65,23 @@
organ_tag = "cell"
parent_organ = "chest"
vital = 1
+ var/emp_counter = 0
/obj/item/organ/cell/Initialize()
robotize()
. = ..()
+/obj/item/organ/cell/process()
+ ..()
+ if(emp_counter)
+ emp_counter--
+
+/obj/item/organ/cell/emp_act(severity)
+ emp_counter += 30/severity
+ if(emp_counter >= 30)
+ owner.Paralyse(emp_counter/6)
+ owner << "%#/ERR: Power leak detected!$%^/"
+
/obj/item/organ/cell/replaced()
. = ..()
// This is very ghetto way of rebooting an IPC. TODO better way.
diff --git a/code/modules/power/power.dm b/code/modules/power/power.dm
index 7d276aebfd5..37705e74b7b 100644
--- a/code/modules/power/power.dm
+++ b/code/modules/power/power.dm
@@ -383,7 +383,12 @@
else
power_source = cell
shock_damage = cell_damage
- var/drained_hp = M.electrocute_act(shock_damage, source, siemens_coeff) //zzzzzzap!
+ var/touchy_hand
+ if(M.hand)
+ touchy_hand = "r_hand"
+ else
+ touchy_hand = "l_hand"
+ var/drained_hp = M.electrocute_act(shock_damage, source, siemens_coeff, ground_zero = touchy_hand) //zzzzzzap!
var/drained_energy = drained_hp*20
if (source_area)
diff --git a/html/changelogs/harmbaton.yml b/html/changelogs/harmbaton.yml
new file mode 100644
index 00000000000..4d80ebdedfe
--- /dev/null
+++ b/html/changelogs/harmbaton.yml
@@ -0,0 +1,40 @@
+################################
+# Example Changelog File
+#
+# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb.
+#
+# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.)
+# When it is, any changes listed below will disappear.
+#
+# Valid Prefixes:
+# bugfix
+# wip (For works in progress)
+# tweak
+# soundadd
+# sounddel
+# rscadd (general adding of nice things)
+# rscdel (general deleting of nice things)
+# imageadd
+# imagedel
+# maptweak
+# spellcheck (typo fixes)
+# experiment
+# balance
+#################################
+
+# Your name.
+author: LordFowl
+
+# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again.
+delete-after: True
+
+# Any changes you've made. See valid prefix list above.
+# INDENT WITH TWO SPACES. NOT TABS. SPACES.
+# SCREW THIS UP AND IT WON'T WORK.
+# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries.
+# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog.
+changes:
+ - tweak: "Batons will now deal both brute and shock damage."
+ - tweak: "Electricity system modified to be more realistic in its arcing and damage,"
+ - tweak: "Electricity can now cause electronic damage."
+ - rscadd: "IPCs will now be paralysed by cattleprods, stunrods, and harmbatons targeted at the chest."