diff --git a/code/ATMOSPHERICS/pipes.dm b/code/ATMOSPHERICS/pipes.dm
index 808e3580f7..16a0a6bcd5 100644
--- a/code/ATMOSPHERICS/pipes.dm
+++ b/code/ATMOSPHERICS/pipes.dm
@@ -12,6 +12,9 @@
var/alert_pressure = 80*ONE_ATMOSPHERE
//minimum pressure before check_pressure(...) should be called
+/obj/machinery/atmospherics/pipe/drain_power()
+ return -1
+
/obj/machinery/atmospherics/pipe/New()
..()
//so pipes under walls are hidden
diff --git a/code/_onclick/other_mobs.dm b/code/_onclick/other_mobs.dm
index 906069b876..479e097251 100644
--- a/code/_onclick/other_mobs.dm
+++ b/code/_onclick/other_mobs.dm
@@ -131,7 +131,7 @@
if(ishuman(M))
var/mob/living/carbon/human/H = M
- if(H.species.flags & IS_SYNTHETIC || H.species.insulated)
+ if(H.species.flags & IS_SYNTHETIC || (H.species.siemens_coefficient<0.5))
return
var/power = max(0,min(10,(powerlevel+rand(0,3))))
diff --git a/code/datums/mind.dm b/code/datums/mind.dm
index b9dc5db81f..a92712af50 100644
--- a/code/datums/mind.dm
+++ b/code/datums/mind.dm
@@ -777,7 +777,7 @@ datum/mind
ticker.mode.greet_syndicate(src)
log_admin("[key_name_admin(usr)] has merc'd [current].")
if("lair")
- current.loc = get_turf(locate("landmark*Syndicate-Spawn"))
+ current.loc = pick(synd_spawn)
if("dressup")
del(H.belt)
del(H.back)
@@ -1065,7 +1065,7 @@ datum/mind
ticker.mode.forge_syndicate_objectives(src)
ticker.mode.greet_syndicate(src)
- current.loc = get_turf(locate("landmark*Syndicate-Spawn"))
+ current.loc = pick(synd_spawn)
var/mob/living/carbon/human/H = current
del(H.belt)
diff --git a/code/game/gamemodes/changeling/changeling_powers.dm b/code/game/gamemodes/changeling/changeling_powers.dm
index d353c77ad0..d8568c8f60 100644
--- a/code/game/gamemodes/changeling/changeling_powers.dm
+++ b/code/game/gamemodes/changeling/changeling_powers.dm
@@ -149,7 +149,7 @@
src << "We do not know how to parse this creature's DNA!"
return
- if(NOCLONE in T.mutations)
+ if(HUSK in T.mutations)
src << "This creature's DNA is ruined beyond useability!"
return
@@ -176,7 +176,6 @@
var/datum/organ/external/affecting = T.get_organ(src.zone_sel.selecting)
if(affecting.take_damage(39,0,1,0,"large organic needle"))
T:UpdateDamageIcon()
- continue
feedback_add_details("changeling_powers","A[stage]")
if(!do_mob(src, T, 150))
diff --git a/code/game/gamemodes/setupgame.dm b/code/game/gamemodes/setupgame.dm
index d2b54fe5ba..9c1b30bc89 100644
--- a/code/game/gamemodes/setupgame.dm
+++ b/code/game/gamemodes/setupgame.dm
@@ -121,7 +121,7 @@
blocks_assigned[G.block]=assignedToBlock
//testing("DNA2: Gene [G.name] assigned to block [G.block].")
- testing("DNA2: [numsToAssign.len] blocks are unused: [english_list(numsToAssign)]")
+ //testing("DNA2: [numsToAssign.len] blocks are unused: [english_list(numsToAssign)]")
// HIDDEN MUTATIONS / SUPERPOWERS INITIALIZTION
diff --git a/code/game/machinery/atmoalter/canister.dm b/code/game/machinery/atmoalter/canister.dm
index 5219bd22b7..3e91d70f6c 100644
--- a/code/game/machinery/atmoalter/canister.dm
+++ b/code/game/machinery/atmoalter/canister.dm
@@ -19,6 +19,9 @@
var/release_log = ""
var/update_flag = 0
+/obj/machinery/portable_atmospherics/canister/drain_power()
+ return -1
+
/obj/machinery/portable_atmospherics/canister/sleeping_agent
name = "Canister: \[N2O\]"
icon_state = "redws"
diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm
index 866e2c1b9f..d5c8ae93e2 100644
--- a/code/game/machinery/doors/airlock.dm
+++ b/code/game/machinery/doors/airlock.dm
@@ -30,6 +30,20 @@
var/secured_wires = 0
var/datum/wires/airlock/wires = null
+/obj/machinery/door/airlock/attack_generic(var/mob/user, var/damage)
+ if(stat & (BROKEN|NOPOWER))
+ if(damage >= 10)
+ if(src.density)
+ visible_message("\The [user] forces \the [src] open!")
+ open()
+ else
+ visible_message("\The [user] forces \the [src] closed!")
+ close()
+ else
+ visible_message("\The [user] strains fruitlessly to force \the [src] [density ? "open" : "closed"].")
+ return
+ ..()
+
/obj/machinery/door/airlock/command
name = "Airlock"
icon = 'icons/obj/doors/Doorcom.dmi'
diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm
index 306af92f37..f771c16c24 100644
--- a/code/game/machinery/doors/door.dm
+++ b/code/game/machinery/doors/door.dm
@@ -37,6 +37,13 @@
dir = EAST
var/width = 1
+/obj/machinery/door/attack_generic(var/mob/user, var/damage)
+ if(damage >= 10)
+ visible_message("\The [user] smashes into the [src]!")
+ take_damage(damage)
+ else
+ visible_message("\The [user] bonks \the [src] harmlessly.")
+
/obj/machinery/door/New()
. = ..()
if(density)
@@ -187,7 +194,7 @@
user = null
if(!src.requiresID())
user = null
-
+
if(istype(I, /obj/item/stack/sheet/metal))
if(stat & BROKEN)
user << "It looks like \the [src] is pretty busted. It's going to need more than just patching up now."
@@ -198,11 +205,11 @@
if(!density)
user << "\The [src] must be closed before you can repair it."
return
-
+
//figure out how much metal we need
- var/amount_needed = (maxhealth - health) / DOOR_REPAIR_AMOUNT
+ var/amount_needed = (maxhealth - health) / DOOR_REPAIR_AMOUNT
amount_needed = (round(amount_needed) == amount_needed)? amount_needed : round(amount_needed) + 1 //Why does BYOND not have a ceiling proc?
-
+
var/obj/item/stack/sheet/metal/metalstack = I
var/transfer
if (repairing)
@@ -214,17 +221,17 @@
if (repairing)
repairing.loc = src
transfer = repairing.amount
-
+
if (transfer)
user << "You fit [transfer] [metalstack.singular_name]\s to damaged and broken parts on \the [src]."
-
+
return
if(repairing && istype(I, /obj/item/weapon/weldingtool))
if(!density)
user << "\The [src] must be closed before you can repair it."
return
-
+
var/obj/item/weapon/weldingtool/welder = I
if(welder.remove_fuel(0,user))
user << "You start to fix dents and weld \the [repairing] into place."
@@ -249,7 +256,7 @@
open()
operating = -1
return 1
-
+
//psa to whoever coded this, there are plenty of objects that need to call attack() on doors without bludgeoning them.
if(src.density && istype(I, /obj/item/weapon) && user.a_intent == "hurt" && !istype(I, /obj/item/weapon/card))
var/obj/item/weapon/W = I
@@ -261,7 +268,7 @@
playsound(src.loc, hitsound, 100, 1)
take_damage(W.force)
return
-
+
if(src.allowed(user) && operable())
if(src.density)
open()
diff --git a/code/game/machinery/suit_storage_unit.dm b/code/game/machinery/suit_storage_unit.dm
index 28affd94a8..4bf1c07abc 100644
--- a/code/game/machinery/suit_storage_unit.dm
+++ b/code/game/machinery/suit_storage_unit.dm
@@ -330,6 +330,7 @@
for(i=0,i<4,i++)
sleep(50)
if(src.OCCUPANT)
+ OCCUPANT.radiation += 50
var/datum/organ/internal/diona/nutrients/rad_organ = locate() in OCCUPANT.internal_organs
if (!rad_organ)
if(src.issuperUV)
diff --git a/code/game/objects/items/stacks/sheets/light.dm b/code/game/objects/items/stacks/sheets/light.dm
index cf6bb1e7dc..c5df032d64 100644
--- a/code/game/objects/items/stacks/sheets/light.dm
+++ b/code/game/objects/items/stacks/sheets/light.dm
@@ -26,7 +26,7 @@
var/obj/item/stack/sheet/metal/M = O
if (M.use(1))
use(1)
- new/obj/item/stack/tile/light(user.loc)
+ new/obj/item/stack/tile/light(get_turf(user))
user << "You make a light tile."
else
user << "You need one metal sheet to finish the light tile."
diff --git a/code/game/objects/items/weapons/shards.dm b/code/game/objects/items/weapons/shards.dm
index 8bd126584c..a57463eee7 100644
--- a/code/game/objects/items/weapons/shards.dm
+++ b/code/game/objects/items/weapons/shards.dm
@@ -76,17 +76,18 @@
if(ishuman(M))
var/mob/living/carbon/human/H = M
- if(H.species.flags & IS_SYNTHETIC || H.species.insulated)
+ if(H.species.flags & IS_SYNTHETIC || (H.species.siemens_coefficient<0.5)) //Thick skin.
return
if( !H.shoes && ( !H.wear_suit || !(H.wear_suit.body_parts_covered & FEET) ) )
var/datum/organ/external/affecting = H.get_organ(pick("l_foot", "r_foot"))
if(affecting.status & ORGAN_ROBOT)
return
- H.Weaken(3)
if(affecting.take_damage(5, 0))
H.UpdateDamageIcon()
H.updatehealth()
+ if(!(H.species & NO_PAIN))
+ H.Weaken(3)
..()
// Shrapnel
diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm
index 608bd782dc..cd55637b35 100644
--- a/code/game/objects/structures/window.dm
+++ b/code/game/objects/structures/window.dm
@@ -157,8 +157,11 @@
/obj/structure/window/attack_generic(var/mob/user, var/damage)
if(!damage)
return
- user.visible_message("[user] smashes into [src]!")
- take_damage(damage)
+ if(damage >= 10)
+ visible_message("[user] smashes into [src]!")
+ take_damage(damage)
+ else
+ visible_message("\The [user] bonks \the [src] harmlessly.")
return 1
/obj/structure/window/attackby(obj/item/W as obj, mob/user as mob)
diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm
index 601d889b90..38b60890c0 100644
--- a/code/modules/clothing/clothing.dm
+++ b/code/modules/clothing/clothing.dm
@@ -23,9 +23,8 @@
return 0
if(species_restricted && istype(M,/mob/living/carbon/human))
-
- var/wearable = null
var/exclusive = null
+ var/wearable = null
var/mob/living/carbon/human/H = M
if("exclude" in species_restricted)
@@ -39,10 +38,9 @@
if(H.species.name in species_restricted)
wearable = 1
- if(!wearable && (slot != 15 && slot != 16)) //Pockets.
- M << "\red Your species cannot wear [src]."
+ if(!wearable && !(slot in list(slot_l_store, slot_r_store, slot_s_store)))
+ H << "Your species cannot wear [src]."
return 0
-
return 1
/obj/item/clothing/proc/refit_for_species(var/target_species)
@@ -352,6 +350,7 @@ BLIND // can't see anything
permeability_coefficient = 0.50
slowdown = SHOES_SLOWDOWN
+ force = 2
species_restricted = list("exclude","Unathi","Tajara")
sprite_sheets = list("Vox" = 'icons/mob/species/vox/shoes.dmi')
diff --git a/code/modules/clothing/shoes/magboots.dm b/code/modules/clothing/shoes/magboots.dm
index 287d3ed748..637a84e765 100644
--- a/code/modules/clothing/shoes/magboots.dm
+++ b/code/modules/clothing/shoes/magboots.dm
@@ -3,6 +3,7 @@
name = "magboots"
icon_state = "magboots0"
species_restricted = null
+ force = 3
var/magpulse = 0
var/icon_base = "magboots"
icon_action_button = "action_blank"
@@ -13,12 +14,14 @@
flags &= ~NOSLIP
slowdown = SHOES_SLOWDOWN
magpulse = 0
+ force = 3
if(icon_base) icon_state = "[icon_base]0"
user << "You disable the mag-pulse traction system."
else
flags |= NOSLIP
slowdown = 2
magpulse = 1
+ force = 5
if(icon_base) icon_state = "[icon_base]1"
user << "You enable the mag-pulse traction system."
user.update_inv_shoes() //so our mob-overlays update
diff --git a/code/modules/clothing/shoes/miscellaneous.dm b/code/modules/clothing/shoes/miscellaneous.dm
index 13e2aac284..e52b2fce8c 100644
--- a/code/modules/clothing/shoes/miscellaneous.dm
+++ b/code/modules/clothing/shoes/miscellaneous.dm
@@ -19,6 +19,7 @@
name = "\improper SWAT shoes"
desc = "When you want to turn up the heat."
icon_state = "swat"
+ force = 3
armor = list(melee = 80, bullet = 60, laser = 50,energy = 25, bomb = 50, bio = 10, rad = 0)
flags = NOSLIP
siemens_coefficient = 0.6
@@ -27,6 +28,7 @@
name = "combat boots"
desc = "When you REALLY want to turn up the heat"
icon_state = "swat"
+ force = 5
armor = list(melee = 80, bullet = 60, laser = 50,energy = 25, bomb = 50, bio = 10, rad = 0)
flags = NOSLIP
siemens_coefficient = 0.6
@@ -65,6 +67,7 @@
item_state = "clown_shoes"
slowdown = SHOES_SLOWDOWN+1
item_color = "clown"
+ force = 0
var/footstep = 1 //used for squeeks whilst walking
species_restricted = null
@@ -74,6 +77,7 @@
icon_state = "jackboots"
item_state = "jackboots"
item_color = "hosred"
+ force = 3
siemens_coefficient = 0.7
/obj/item/clothing/shoes/cult
@@ -82,6 +86,7 @@
icon_state = "cult"
item_state = "cult"
item_color = "cult"
+ force = 2
siemens_coefficient = 0.7
cold_protection = FEET
@@ -100,6 +105,7 @@
desc = "Fluffy!"
icon_state = "slippers"
item_state = "slippers"
+ force = 0
species_restricted = null
w_class = 2
@@ -108,6 +114,7 @@
desc = "Fluffy..."
icon_state = "slippers_worn"
item_state = "slippers_worn"
+ force = 0
w_class = 2
/obj/item/clothing/shoes/laceup
diff --git a/code/modules/clothing/spacesuits/rig/modules/combat.dm b/code/modules/clothing/spacesuits/rig/modules/combat.dm
index c45fdd7fd3..f8457375cc 100644
--- a/code/modules/clothing/spacesuits/rig/modules/combat.dm
+++ b/code/modules/clothing/spacesuits/rig/modules/combat.dm
@@ -142,6 +142,7 @@
toggleable = 1
use_power_cost = 50
active_power_cost = 5
+ passive_power_cost = 0
gun_type = /obj/item/weapon/gun/energy/crossbow/ninja
@@ -152,7 +153,7 @@
deactivate()
return 0
- ..()
+ return ..()
/obj/item/rig_module/mounted/energy_blade/activate()
diff --git a/code/modules/clothing/spacesuits/rig/modules/ninja.dm b/code/modules/clothing/spacesuits/rig/modules/ninja.dm
index 63231dcd95..12ea8e7fb2 100644
--- a/code/modules/clothing/spacesuits/rig/modules/ninja.dm
+++ b/code/modules/clothing/spacesuits/rig/modules/ninja.dm
@@ -172,14 +172,14 @@
engage()
/obj/item/rig_module/self_destruct/engage()
- explosion(get_turf(src), 0, 0, 3, 4)
+ explosion(get_turf(src), 1, 2, 4, 5)
if(holder && holder.wearer)
holder.wearer.drop_from_inventory(src)
del(holder)
del(src)
/obj/item/rig_module/self_destruct/small/engage()
- explosion(get_turf(src), 0, 0, 1, 2)
+ explosion(get_turf(src), 0, 0, 3, 4)
if(holder && holder.wearer)
holder.wearer.drop_from_inventory(src)
del(holder)
diff --git a/code/modules/clothing/spacesuits/rig/rig.dm b/code/modules/clothing/spacesuits/rig/rig.dm
index 196d3d5d76..ba6096b1b4 100644
--- a/code/modules/clothing/spacesuits/rig/rig.dm
+++ b/code/modules/clothing/spacesuits/rig/rig.dm
@@ -22,6 +22,7 @@
max_heat_protection_temperature = SPACE_SUIT_MAX_HEAT_PROTECTION_TEMPERATURE
siemens_coefficient = 0.1
permeability_coefficient = 0.1
+ unacidable = 1
var/interface_path = "hardsuit.tmpl"
var/ai_interface_path = "hardsuit.tmpl"
@@ -141,6 +142,7 @@
piece.max_heat_protection_temperature = max_heat_protection_temperature
piece.siemens_coefficient = siemens_coefficient
piece.permeability_coefficient = permeability_coefficient
+ piece.unacidable = unacidable
update_icon(1)
diff --git a/code/modules/clothing/spacesuits/rig/rig_attackby.dm b/code/modules/clothing/spacesuits/rig/rig_attackby.dm
index 1b54b8f1ee..061973c137 100644
--- a/code/modules/clothing/spacesuits/rig/rig_attackby.dm
+++ b/code/modules/clothing/spacesuits/rig/rig_attackby.dm
@@ -117,7 +117,10 @@
user << "There is not tank to remove."
return
- user.put_in_hands(air_supply)
+ if(user.r_hand && user.l_hand)
+ air_supply.loc = get_turf(user)
+ else
+ user.put_in_hands(air_supply)
user << "You detach and remove \the [air_supply]."
air_supply = null
return
@@ -146,7 +149,10 @@
user << "You detatch \the [cell] from \the [src]'s battery mount."
for(var/obj/item/rig_module/module in installed_modules)
module.deactivate()
- cell.loc = user.put_in_hands(cell)
+ if(user.r_hand && user.l_hand)
+ cell.loc = get_turf(user)
+ else
+ cell.loc = user.put_in_hands(cell)
cell = null
else
user << "There is nothing loaded in that mount."
diff --git a/code/modules/mob/language.dm b/code/modules/mob/language.dm
index d6510a1f8a..4191a8d140 100755
--- a/code/modules/mob/language.dm
+++ b/code/modules/mob/language.dm
@@ -61,7 +61,9 @@
var/ending = copytext(scrambled_text, length(scrambled_text))
if(ending == ".")
scrambled_text = copytext(scrambled_text,1,length(scrambled_text)-1)
- scrambled_text += copytext(input, length(input))
+ var/input_ending = copytext(input, input_size)
+ if(input_ending in list("!","?","."))
+ scrambled_text += input_ending
return scrambled_text
/datum/language/proc/format_message(message, verb)
@@ -251,11 +253,11 @@
space_chance = 100
syllables = list("lorem", "ipsum", "dolor", "sit", "amet", "consectetur", "adipiscing", "elit",
"sed", "do", "eiusmod", "tempor", "incididunt", "ut", "labore", "et", "dolore",
- "magna", "aliqua", "ut", "enim", "ad", "minim", "veniam", "quis", "nostrud",
- "exercitation", "ullamco", "laboris", "nisi", "ut", "aliquip", "ex", "ea", "commodo",
- "consequat", "duis", "aute", "irure", "dolor", "in", "reprehenderit", "in",
- "voluptate", "velit", "esse", "cillum", "dolore", "eu", "fugiat", "nulla",
- "pariatur", "excepteur", "sint", "occaecat", "cupidatat", "non", "proident", "sunt",
+ "magna", "aliqua", "ut", "enim", "ad", "minim", "veniam", "quis", "nostrud",
+ "exercitation", "ullamco", "laboris", "nisi", "ut", "aliquip", "ex", "ea", "commodo",
+ "consequat", "duis", "aute", "irure", "dolor", "in", "reprehenderit", "in",
+ "voluptate", "velit", "esse", "cillum", "dolore", "eu", "fugiat", "nulla",
+ "pariatur", "excepteur", "sint", "occaecat", "cupidatat", "non", "proident", "sunt",
"in", "culpa", "qui", "officia", "deserunt", "mollit", "anim", "id", "est", "laborum")
/datum/language/gutter
diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm
index 42de429752..b1170468d8 100644
--- a/code/modules/mob/living/carbon/carbon.dm
+++ b/code/modules/mob/living/carbon/carbon.dm
@@ -90,9 +90,8 @@
return 0
src.apply_damage(shock_damage, BURN, def_zone, used_weapon="Electrocution")
-
playsound(loc, "sparks", 50, 1, -1)
- if (shock_damage > 10)
+ if (shock_damage > 15)
src.visible_message(
"\red [src] was shocked by the [source]!", \
"\red You feel a powerful shock course through your body!", \
@@ -200,7 +199,7 @@
if (istype(src,/mob/living/carbon/human) && src:w_uniform)
var/mob/living/carbon/human/H = src
H.w_uniform.add_fingerprint(M)
-
+
if(player_logged)
M.visible_message("[M] shakes [src] trying to wake [t_him] up!", \
"You shake [src], but they do not respond... Maybe they have S.S.D?")
diff --git a/code/modules/mob/living/carbon/human/death.dm b/code/modules/mob/living/carbon/human/death.dm
index ef0a507c20..9ed050b5ae 100644
--- a/code/modules/mob/living/carbon/human/death.dm
+++ b/code/modules/mob/living/carbon/human/death.dm
@@ -84,7 +84,7 @@
/mob/living/carbon/human/proc/Drain()
ChangeToHusk()
- //mutations |= NOCLONE
+ mutations |= HUSK
return
/mob/living/carbon/human/proc/ChangeToSkeleton()
diff --git a/code/modules/mob/living/carbon/human/human_attackhand.dm b/code/modules/mob/living/carbon/human/human_attackhand.dm
index 070084a471..bb02aee5e0 100644
--- a/code/modules/mob/living/carbon/human/human_attackhand.dm
+++ b/code/modules/mob/living/carbon/human/human_attackhand.dm
@@ -184,7 +184,7 @@
return 0
var/real_damage = rand_damage
- real_damage += attack.damage // Adding species attack base damage
+ real_damage += attack.get_unarmed_damage(H)
real_damage *= damage_multiplier
rand_damage *= damage_multiplier
if(HULK in H.mutations)
diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm
index cd91d77cf3..3cefdc836d 100644
--- a/code/modules/mob/living/carbon/human/human_defense.dm
+++ b/code/modules/mob/living/carbon/human/human_defense.dm
@@ -77,8 +77,8 @@ emp_act
if (affected.status & ORGAN_ROBOT)
emote("me", 1, "drops what they were holding, their [affected.display_name] malfunctioning!")
else
- var/emote_scream = pick("screams in pain and", "lets out a sharp cry and", "cries out and")
- emote("me", 1, "[(species && species.flags & NO_PAIN) ? "" : emote_scream ] drops what they were holding in their [affected.display_name]!")
+ var/emote_scream = pick("screams in pain and ", "lets out a sharp cry and ", "cries out and ")
+ emote("me", 1, "[(species && species.flags & NO_PAIN) ? "" : emote_scream ]drops what they were holding in their [affected.display_name]!")
..(stun_amount, agony_amount, def_zone)
@@ -107,7 +107,7 @@ emp_act
if (!def_zone)
return 1.0
- var/siemens_coefficient = 1.0
+ var/siemens_coefficient = species.siemens_coefficient
var/list/clothing_items = list(head, wear_mask, wear_suit, w_uniform, gloves, shoes) // What all are we checking?
for(var/obj/item/clothing/C in clothing_items)
@@ -282,7 +282,7 @@ emp_act
forcesay(hit_appends) //forcesay checks stat already
//Melee weapon embedded object code.
- if (I.damtype == BRUTE && !I.is_robot_module())
+ if (I && I.damtype == BRUTE && !I.is_robot_module())
var/damage = I.force
if (armor)
damage /= armor+1
diff --git a/code/modules/mob/living/carbon/human/human_powers.dm b/code/modules/mob/living/carbon/human/human_powers.dm
index 9996efc8b6..13dd13413e 100644
--- a/code/modules/mob/living/carbon/human/human_powers.dm
+++ b/code/modules/mob/living/carbon/human/human_powers.dm
@@ -98,7 +98,7 @@
T.Weaken(5)
//Only official cool kids get the grab and no self-prone.
- if(src.mind && !src.mind.special_role)
+ if(!(src.mind && src.mind.special_role))
src.Weaken(5)
return
diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm
index 808025cf5f..194050bc26 100644
--- a/code/modules/mob/living/carbon/human/life.dm
+++ b/code/modules/mob/living/carbon/human/life.dm
@@ -280,6 +280,7 @@
radiation -= rads
nutrition += rads
adjustBruteLoss(-(rads))
+ adjustFireLoss(-(rads))
adjustOxyLoss(-(rads))
adjustToxLoss(-(rads))
updatehealth()
@@ -949,10 +950,11 @@
traumatic_shock -= light_amount
if(species.flags & IS_PLANT)
- if(nutrition > 500)
- nutrition = 500
+ if(nutrition > 450)
+ nutrition = 450
if(light_amount >= 3) //if there's enough light, heal
- adjustBruteLoss(-(light_amount))
+ adjustBruteLoss(-(round(light_amount/2)))
+ adjustFireLoss(-(round(light_amount/2)))
adjustToxLoss(-(light_amount))
adjustOxyLoss(-(light_amount))
//TODO: heal wounds, heal broken limbs.
@@ -995,7 +997,7 @@
proc/handle_regular_status_updates()
if(status_flags & GODMODE) return 0
-
+
//SSD check, if a logged player is awake put them back to sleep!
if(player_logged && sleeping < 2)
sleeping = 2
@@ -1055,7 +1057,7 @@
adjustHalLoss(-3)
if (mind)
//Are they SSD? If so we'll keep them asleep but work off some of that sleep var in case of stoxin or similar.
- if(player_logged)
+ if(player_logged)
sleeping = max(sleeping-1, 2)
else
sleeping = max(sleeping-1, 0)
diff --git a/code/modules/mob/living/carbon/human/species/outsider/shadow.dm b/code/modules/mob/living/carbon/human/species/outsider/shadow.dm
index e9584143ee..fa40f8ee00 100644
--- a/code/modules/mob/living/carbon/human/species/outsider/shadow.dm
+++ b/code/modules/mob/living/carbon/human/species/outsider/shadow.dm
@@ -10,6 +10,7 @@
light_dam = 2
darksight = 8
has_organ = list()
+ siemens_coefficient = 0
blood_color = "#CCCCCC"
flesh_color = "#AAAAAA"
diff --git a/code/modules/mob/living/carbon/human/species/outsider/vox.dm b/code/modules/mob/living/carbon/human/species/outsider/vox.dm
index 3c44fbd5c6..bf007450e3 100644
--- a/code/modules/mob/living/carbon/human/species/outsider/vox.dm
+++ b/code/modules/mob/living/carbon/human/species/outsider/vox.dm
@@ -28,7 +28,7 @@
breath_type = "nitrogen"
poison_type = "oxygen"
- insulated = 1
+ siemens_coefficient = 0.2
flags = IS_WHITELISTED | NO_SCAN | HAS_EYE_COLOR
diff --git a/code/modules/mob/living/carbon/human/species/species.dm b/code/modules/mob/living/carbon/human/species/species.dm
index 119e624550..64783251ef 100644
--- a/code/modules/mob/living/carbon/human/species/species.dm
+++ b/code/modules/mob/living/carbon/human/species/species.dm
@@ -72,7 +72,7 @@
// Body/form vars.
var/list/inherent_verbs // Species-specific verbs.
var/has_fine_manipulation = 1 // Can use small items.
- var/insulated // Immune to electrocution and glass shards to the feet.
+ var/siemens_coefficient = 1 // The lower, the thicker the skin and better the insulation.
var/darksight = 2 // Native darksight distance.
var/flags = 0 // Various specific features.
var/slowdown = 0 // Passive movement speed malus (or boost, if negative)
diff --git a/code/modules/mob/living/carbon/human/species/species_attack.dm b/code/modules/mob/living/carbon/human/species/species_attack.dm
index 4ebfb91092..fe5eac0f07 100644
--- a/code/modules/mob/living/carbon/human/species/species_attack.dm
+++ b/code/modules/mob/living/carbon/human/species/species_attack.dm
@@ -1,87 +1,3 @@
-//Species unarmed attacks
-/datum/unarmed_attack
- var/attack_verb = list("attack") // Empty hand hurt intent verb.
- var/attack_noun = list("fist")
- var/damage = 0 // Extra empty hand attack damage.
- var/attack_sound = "punch"
- var/miss_sound = 'sound/weapons/punchmiss.ogg'
- var/shredding = 0 // Calls the old attack_alien() behavior on objects/mobs when on harm intent.
- var/sharp = 0
- var/edge = 0
-
-/datum/unarmed_attack/proc/is_usable(var/mob/living/carbon/human/user)
- if(user.restrained())
- return 0
-
- // Check if they have a functioning hand.
- var/datum/organ/external/E = user.organs_by_name["l_hand"]
- if(E && !(E.status & ORGAN_DESTROYED))
- return 1
-
- E = user.organs_by_name["r_hand"]
- if(E && !(E.status & ORGAN_DESTROYED))
- return 1
-
- return 0
-
-/datum/unarmed_attack/proc/apply_effects(var/mob/living/carbon/human/user,var/mob/living/carbon/human/target,var/armour,var/attack_damage,var/zone)
-
- var/stun_chance = rand(0, 100)
-
- if(attack_damage >= 5 && armour < 2 && !(target == user) && stun_chance <= attack_damage * 5) // 25% standard chance
- switch(zone) // strong punches can have effects depending on where they hit
- if("head", "mouth", "eyes")
- // Induce blurriness
- target.visible_message("[target] looks dazed.", "You see stars.")
- target.apply_effect(attack_damage*2, EYE_BLUR, armour)
- if("l_arm", "l_hand")
- if (target.l_hand)
- // Disarm left hand
- target.visible_message("[src] [pick("dropped", "let go off")] \the [target.l_hand][pick("", " with a scream")]!")
- target.drop_l_hand()
- if("r_arm", "r_hand")
- if (target.r_hand)
- // Disarm right hand
- target.visible_message("[src] [pick("dropped", "let go off")] \the [target.r_hand][pick("", " with a scream")]!")
- target.drop_r_hand()
- if("chest")
- if(!target.lying)
- var/turf/T = get_step(get_turf(target), get_dir(get_turf(user), get_turf(target)))
- if(!T.density)
- step(target, get_dir(get_turf(user), get_turf(target)))
- target.visible_message("[pick("[target] was sent flying backward!", "[target] staggers back from the impact!")]")
- else
- target.visible_message("[target] slams into [T]!")
- if(prob(50))
- target.set_dir(reverse_dir[target.dir])
- target.apply_effect(attack_damage * 0.4, WEAKEN, armour)
- if("groin")
- target.visible_message("[target] looks like \he is in pain!", "[(target.gender=="female") ? "Oh god that hurt!" : "Oh no, not your[pick("testicles", "crown jewels", "clockweights", "family jewels", "marbles", "bean bags", "teabags", "sweetmeats", "goolies")]!"]")
- target.apply_effects(stutter = attack_damage * 2, agony = attack_damage* 3, blocked = armour)
- if("l_leg", "l_foot", "r_leg", "r_foot")
- if(!target.lying)
- target.visible_message("[src] gives way slightly.")
- target.apply_effect(attack_damage*3, AGONY, armour)
- else if(attack_damage >= 5 && !(target == user) && (stun_chance + attack_damage * 5 >= 100) && armour < 2) // Chance to get the usual throwdown as well (25% standard chance)
- if(!target.lying)
- target.visible_message("[target] [pick("slumps", "falls", "drops")] down to the ground!")
- else
- target.visible_message("[target] has been weakened!")
- target.apply_effect(3, WEAKEN, armour)
-
-/datum/unarmed_attack/proc/show_attack(var/mob/living/carbon/human/user, var/mob/living/carbon/human/target, var/zone, var/attack_damage)
- var/datum/organ/external/affecting = target.get_organ(zone)
- user.visible_message("[user] [pick(attack_verb)] [target] in the [affecting.display_name]!")
- playsound(user.loc, attack_sound, 25, 1, -1)
-
-/datum/unarmed_attack/bite
- attack_verb = list("bit")
- attack_sound = 'sound/weapons/bite.ogg'
- shredding = 0
- damage = 0
- sharp = 0
- edge = 0
-
/datum/unarmed_attack/bite/sharp //eye teeth
attack_verb = list("bit", "chomped on")
attack_sound = 'sound/weapons/bite.ogg'
@@ -90,120 +6,6 @@
sharp = 1
edge = 1
-/datum/unarmed_attack/bite/is_usable(var/mob/living/carbon/human/user, var/mob/living/carbon/human/target, var/zone)
- if (user.wear_mask && istype(user.wear_mask, /obj/item/clothing/mask/muzzle))
- return 0
- if (user == target && (zone == "head" || zone == "eyes" || zone == "mouth"))
- return 0
- return 1
-
-/datum/unarmed_attack/punch
- attack_verb = list("punched")
- attack_noun = list("fist")
- damage = 0
-
-/datum/unarmed_attack/punch/show_attack(var/mob/living/carbon/human/user, var/mob/living/carbon/human/target, var/zone, var/attack_damage)
- var/datum/organ/external/affecting = target.get_organ(zone)
- var/organ = affecting.display_name
-
- attack_damage = Clamp(attack_damage, 1, 5) // We expect damage input of 1 to 5 for this proc. But we leave this check juuust in case.
-
- if(target == user)
- user.visible_message("[user] [pick(attack_verb)] \himself in the [organ]!")
- return 0
-
- if(!target.lying)
- switch(zone)
- if("head", "mouth", "eyes")
- // ----- HEAD ----- //
- switch(attack_damage)
- if(1 to 2) user.visible_message("[user] slapped [target] across \his cheek!")
- if(3 to 4) user.visible_message("[user] struck [target] in the head[pick("", " with a closed fist")]!")
- if(5) user.visible_message("[user] gave [target] a resounding slap to the face!")
- if("chest", "l_arm", "r_arm", "l_hand", "r_hand", "groin", "l_leg", "r_let", "l_foot", "r_foot")
- // ----- BODY ----- //
- switch(attack_damage)
- if(1 to 2) user.visible_message("[user] slapped [target]'s [organ]!")
- if(3 to 4) user.visible_message("[user] [pick(attack_verb)] [target] in \his [organ]!")
- if(5) user.visible_message("[user] slammed \his [pick(attack_noun)] into [target]'s [organ]!")
- else
- user.visible_message("[user] [pick("punched", "threw a punch", "struck", "slapped", "rammed their [pick(attack_noun)] into")] [target]'s [organ]!")
-
-/datum/unarmed_attack/kick
- attack_verb = list("kicked", "kneed")
- attack_noun = list("kick")
- attack_sound = "swing_hit"
- damage = 1
-
-/datum/unarmed_attack/kick/is_usable(var/mob/living/carbon/human/user, var/mob/living/carbon/human/target, var/zone)
- if (target.legcuffed)
- return 0
-
- if(!(zone in list("l_leg", "r_leg", "l_foot", "r_foot", "groin")))
- return 0
-
- var/datum/organ/external/E = user.organs_by_name["l_foot"]
- if(E && !(E.status & ORGAN_DESTROYED))
- return 1
-
- E = user.organs_by_name["r_foot"]
- if(E && !(E.status & ORGAN_DESTROYED))
- return 1
-
- return 0
-
-/datum/unarmed_attack/kick/show_attack(var/mob/living/carbon/human/user, var/mob/living/carbon/human/target, var/zone, var/attack_damage)
- var/datum/organ/external/affecting = target.get_organ(zone)
- var/organ = affecting.display_name
-
- attack_damage = Clamp(attack_damage, 1, 5)
-
- switch(zone)
- if("groin", "l_leg", "r_leg")
- // -- LOWER BODY -- //
- switch(attack_damage)
- if(1 to 2) user.visible_message("[user] gave [target] a light [pick(attack_noun)] to the [organ]!")
- if(3 to 4) user.visible_message("[user] [pick(attack_verb)] [target] in \his [organ]!")
- if(5) user.visible_message("[user] landed a strong [pick(attack_noun)] against [target]'s [organ]!")
- if("l_foot", "r_foot")
- // ----- FEET ----- //
- switch(attack_damage)
- if(1 to 4) user.visible_message("[user] kicked [target] in \his [organ]!")
- if(5) user.visible_message("[user] stomped down hard on [target]'s [organ]!")
-
-/datum/unarmed_attack/stomp
- attack_verb = null
- attack_noun = list("kick")
- attack_sound = "swing_hit"
- damage = 3
-
-/datum/unarmed_attack/stomp/is_usable(var/mob/living/carbon/human/user, var/mob/living/carbon/human/target, var/zone)
- if (target.legcuffed)
- return 0
-
- if (target.lying && !user.lying)
- var/datum/organ/external/E = user.organs_by_name["l_foot"]
- if(E && !(E.status & ORGAN_DESTROYED))
- return 1
-
- E = user.organs_by_name["r_foot"]
- if(E && !(E.status & ORGAN_DESTROYED))
- return 1
-
- return 0
-
-/datum/unarmed_attack/stomp/show_attack(var/mob/living/carbon/human/user, var/mob/living/carbon/human/target, var/zone, var/attack_damage)
- var/datum/organ/external/affecting = target.get_organ(zone)
- var/organ = affecting.display_name
-
- attack_damage = Clamp(attack_damage, 1, 5)
-
- switch(attack_damage)
- if(1 to 3)
- user.visible_message("[user] [pick("gave a kick against", "kicked against", "stomped down on", "slammed their foot into")] [target]'s [organ]!")
- if(4 to 5)
- user.visible_message("[user] [pick("landed a strong kick against", "kicked against", "stomped down hard on", "rammed their foot into")] [target]'s [organ]!")
-
/datum/unarmed_attack/diona
attack_verb = list("lashed", "bludgeoned")
attack_noun = list("tendril")
diff --git a/code/modules/mob/living/carbon/human/species/species_hud.dm b/code/modules/mob/living/carbon/human/species/species_hud.dm
index 7a041691b1..b7b05f48c9 100644
--- a/code/modules/mob/living/carbon/human/species/species_hud.dm
+++ b/code/modules/mob/living/carbon/human/species/species_hud.dm
@@ -6,7 +6,7 @@
var/has_pressure = 1 // Draw the pressure indicator.
var/has_nutrition = 1 // Draw the nutrition indicator.
var/has_bodytemp = 1 // Draw the bodytemp indicator.
- var/has_hands = 1 // Set to draw shand.
+ var/has_hands = 1 // Set to draw hands.
var/has_drop = 1 // Set to draw drop button.
var/has_throw = 1 // Set to draw throw button.
var/has_resist = 1 // Set to draw resist button.
@@ -18,8 +18,8 @@
// unless you know exactly what it does.
var/list/gear = list(
"i_clothing" = list("loc" = ui_iclothing, "slot" = slot_w_uniform, "state" = "center", "toggle" = 1, "dir" = SOUTH),
- "o_clothing" = list("loc" = ui_oclothing, "slot" = slot_wear_suit, "state" = "equip", "toggle" = 1, "dir" = SOUTH),
- "mask" = list("loc" = ui_mask, "slot" = slot_wear_mask, "state" = "equip", "toggle" = 1, "dir" = NORTH),
+ "o_clothing" = list("loc" = ui_oclothing, "slot" = slot_wear_suit, "state" = "equip", "toggle" = 1, "dir" = SOUTH),
+ "mask" = list("loc" = ui_mask, "slot" = slot_wear_mask, "state" = "equip", "toggle" = 1, "dir" = NORTH),
"gloves" = list("loc" = ui_gloves, "slot" = slot_gloves, "state" = "gloves", "toggle" = 1),
"eyes" = list("loc" = ui_glasses, "slot" = slot_glasses, "state" = "glasses","toggle" = 1),
"l_ear" = list("loc" = ui_l_ear, "slot" = slot_l_ear, "state" = "ears", "toggle" = 1),
@@ -51,3 +51,18 @@
equip_slots |= slot_tie
equip_slots |= slot_legcuffed
+
+/datum/hud_data/diona
+ has_internals = 0
+ gear = list(
+ "i_clothing" = list("loc" = ui_iclothing, "slot" = slot_w_uniform, "state" = "center", "toggle" = 1, "dir" = SOUTH),
+ "o_clothing" = list("loc" = ui_shoes, "slot" = slot_wear_suit, "state" = "equip", "toggle" = 1, "dir" = SOUTH),
+ "l_ear" = list("loc" = ui_gloves, "slot" = slot_l_ear, "state" = "ears", "toggle" = 1),
+ "head" = list("loc" = ui_oclothing, "slot" = slot_head, "state" = "hair", "toggle" = 1),
+ "suit storage" = list("loc" = ui_sstore1, "slot" = slot_s_store, "state" = "belt", "dir" = 8),
+ "back" = list("loc" = ui_back, "slot" = slot_back, "state" = "back", "dir" = NORTH),
+ "id" = list("loc" = ui_id, "slot" = slot_wear_id, "state" = "id", "dir" = NORTH),
+ "storage1" = list("loc" = ui_storage1, "slot" = slot_l_store, "state" = "pocket"),
+ "storage2" = list("loc" = ui_storage2, "slot" = slot_r_store, "state" = "pocket"),
+ "belt" = list("loc" = ui_belt, "slot" = slot_belt, "state" = "belt")
+ )
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/human/species/station/golem.dm b/code/modules/mob/living/carbon/human/species/station/golem.dm
index 137472a23a..7d7b364f5d 100644
--- a/code/modules/mob/living/carbon/human/species/station/golem.dm
+++ b/code/modules/mob/living/carbon/human/species/station/golem.dm
@@ -8,6 +8,7 @@
language = "Sol Common" //todo?
unarmed_types = list(/datum/unarmed_attack/stomp, /datum/unarmed_attack/kick, /datum/unarmed_attack/punch)
flags = IS_RESTRICTED | NO_BREATHE | NO_PAIN | NO_BLOOD | IS_SYNTHETIC | NO_SCAN | NO_POISON
+ siemens_coefficient = 0
breath_type = null
poison_type = null
diff --git a/code/modules/mob/living/carbon/human/species/station/slime.dm b/code/modules/mob/living/carbon/human/species/station/slime.dm
index 9fc44f7e30..d573558143 100644
--- a/code/modules/mob/living/carbon/human/species/station/slime.dm
+++ b/code/modules/mob/living/carbon/human/species/station/slime.dm
@@ -8,17 +8,23 @@
language = "Sol Common" //todo?
unarmed_types = list(/datum/unarmed_attack/slime_glomp)
flags = IS_RESTRICTED | NO_BLOOD | NO_SCAN | NO_SLIP | NO_BREATHE
+ siemens_coefficient = 3
darksight = 3
blood_color = "#05FF9B"
flesh_color = "#05FFFB"
+ remains_type = /obj/effect/decal/cleanable/ash
+ death_message = "rapidly loses cohesion, splattering across the ground..."
+
has_organ = list(
"brain" = /datum/organ/internal/brain/slime
)
- inherent_verbs = list(
- )
-
breath_type = null
- poison_type = null
\ No newline at end of file
+ poison_type = null
+
+/datum/species/slime/handle_death(var/mob/living/carbon/human/H)
+ spawn(1)
+ if(H)
+ H.gib()
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/human/species/station/station.dm b/code/modules/mob/living/carbon/human/species/station/station.dm
index 83fa48e48f..91852a83d7 100644
--- a/code/modules/mob/living/carbon/human/species/station/station.dm
+++ b/code/modules/mob/living/carbon/human/species/station/station.dm
@@ -107,6 +107,9 @@
primitive = /mob/living/carbon/alien/diona
slowdown = 7
rarity_value = 3
+ hud_type = /datum/hud_data/diona
+ siemens_coefficient = 0.3
+
blurb = "Commonly referred to (erroneously) as 'plant people', the Dionaea are a strange space-dwelling collective \
species hailing from Epsilon Ursae Minoris. Each 'diona' is a cluster of numerous cat-sized organisms called nymphs; \
there is no effective upper limit to the number that can fuse in gestalt, and reports exist of the Epsilon Ursae \
diff --git a/code/modules/mob/living/carbon/human/species/xenomorphs/alien_species.dm b/code/modules/mob/living/carbon/human/species/xenomorphs/alien_species.dm
index 51e466f176..5159dba0fa 100644
--- a/code/modules/mob/living/carbon/human/species/xenomorphs/alien_species.dm
+++ b/code/modules/mob/living/carbon/human/species/xenomorphs/alien_species.dm
@@ -10,7 +10,7 @@
rarity_value = 3
has_fine_manipulation = 0
- insulated = 1
+ siemens_coefficient = 0
gluttonous = 2
eyes = "blank_eyes"
diff --git a/code/modules/mob/living/carbon/human/unarmed_attack.dm b/code/modules/mob/living/carbon/human/unarmed_attack.dm
index e69de29bb2..ca3d955109 100644
--- a/code/modules/mob/living/carbon/human/unarmed_attack.dm
+++ b/code/modules/mob/living/carbon/human/unarmed_attack.dm
@@ -0,0 +1,204 @@
+//Species unarmed attacks
+/datum/unarmed_attack
+ var/attack_verb = list("attack") // Empty hand hurt intent verb.
+ var/attack_noun = list("fist")
+ var/damage = 0 // Extra empty hand attack damage.
+ var/attack_sound = "punch"
+ var/miss_sound = 'sound/weapons/punchmiss.ogg'
+ var/shredding = 0 // Calls the old attack_alien() behavior on objects/mobs when on harm intent.
+ var/sharp = 0
+ var/edge = 0
+
+/datum/unarmed_attack/proc/is_usable(var/mob/living/carbon/human/user)
+ if(user.restrained())
+ return 0
+
+ // Check if they have a functioning hand.
+ var/datum/organ/external/E = user.organs_by_name["l_hand"]
+ if(E && !(E.status & ORGAN_DESTROYED))
+ return 1
+
+ E = user.organs_by_name["r_hand"]
+ if(E && !(E.status & ORGAN_DESTROYED))
+ return 1
+
+ return 0
+
+/datum/unarmed_attack/proc/get_unarmed_damage()
+ return damage
+
+/datum/unarmed_attack/proc/apply_effects(var/mob/living/carbon/human/user,var/mob/living/carbon/human/target,var/armour,var/attack_damage,var/zone)
+
+ var/stun_chance = rand(0, 100)
+
+ if(attack_damage >= 5 && armour < 2 && !(target == user) && stun_chance <= attack_damage * 5) // 25% standard chance
+ switch(zone) // strong punches can have effects depending on where they hit
+ if("head", "mouth", "eyes")
+ // Induce blurriness
+ target.visible_message("[target] looks dazed.", "You see stars.")
+ target.apply_effect(attack_damage*2, EYE_BLUR, armour)
+ if("l_arm", "l_hand")
+ if (target.l_hand)
+ // Disarm left hand
+ target.visible_message("[src] [pick("dropped", "let go off")] \the [target.l_hand][pick("", " with a scream")]!")
+ target.drop_l_hand()
+ if("r_arm", "r_hand")
+ if (target.r_hand)
+ // Disarm right hand
+ target.visible_message("[src] [pick("dropped", "let go off")] \the [target.r_hand][pick("", " with a scream")]!")
+ target.drop_r_hand()
+ if("chest")
+ if(!target.lying)
+ var/turf/T = get_step(get_turf(target), get_dir(get_turf(user), get_turf(target)))
+ if(!T.density)
+ step(target, get_dir(get_turf(user), get_turf(target)))
+ target.visible_message("[pick("[target] was sent flying backward!", "[target] staggers back from the impact!")]")
+ else
+ target.visible_message("[target] slams into [T]!")
+ if(prob(50))
+ target.set_dir(reverse_dir[target.dir])
+ target.apply_effect(attack_damage * 0.4, WEAKEN, armour)
+ if("groin")
+ target.visible_message("[target] looks like \he is in pain!", "[(target.gender=="female") ? "Oh god that hurt!" : "Oh no, not your[pick("testicles", "crown jewels", "clockweights", "family jewels", "marbles", "bean bags", "teabags", "sweetmeats", "goolies")]!"]")
+ target.apply_effects(stutter = attack_damage * 2, agony = attack_damage* 3, blocked = armour)
+ if("l_leg", "l_foot", "r_leg", "r_foot")
+ if(!target.lying)
+ target.visible_message("[src] gives way slightly.")
+ target.apply_effect(attack_damage*3, AGONY, armour)
+ else if(attack_damage >= 5 && !(target == user) && (stun_chance + attack_damage * 5 >= 100) && armour < 2) // Chance to get the usual throwdown as well (25% standard chance)
+ if(!target.lying)
+ target.visible_message("[target] [pick("slumps", "falls", "drops")] down to the ground!")
+ else
+ target.visible_message("[target] has been weakened!")
+ target.apply_effect(3, WEAKEN, armour)
+
+/datum/unarmed_attack/proc/show_attack(var/mob/living/carbon/human/user, var/mob/living/carbon/human/target, var/zone, var/attack_damage)
+ var/datum/organ/external/affecting = target.get_organ(zone)
+ user.visible_message("[user] [pick(attack_verb)] [target] in the [affecting.display_name]!")
+ playsound(user.loc, attack_sound, 25, 1, -1)
+
+/datum/unarmed_attack/bite
+ attack_verb = list("bit")
+ attack_sound = 'sound/weapons/bite.ogg'
+ shredding = 0
+ damage = 0
+ sharp = 0
+ edge = 0
+
+/datum/unarmed_attack/bite/is_usable(var/mob/living/carbon/human/user, var/mob/living/carbon/human/target, var/zone)
+ if (user.wear_mask && istype(user.wear_mask, /obj/item/clothing/mask/muzzle))
+ return 0
+ if (user == target && (zone == "head" || zone == "eyes" || zone == "mouth"))
+ return 0
+ return 1
+
+/datum/unarmed_attack/punch
+ attack_verb = list("punched")
+ attack_noun = list("fist")
+ damage = 0
+
+/datum/unarmed_attack/punch/show_attack(var/mob/living/carbon/human/user, var/mob/living/carbon/human/target, var/zone, var/attack_damage)
+ var/datum/organ/external/affecting = target.get_organ(zone)
+ var/organ = affecting.display_name
+
+ attack_damage = Clamp(attack_damage, 1, 5) // We expect damage input of 1 to 5 for this proc. But we leave this check juuust in case.
+
+ if(target == user)
+ user.visible_message("[user] [pick(attack_verb)] \himself in the [organ]!")
+ return 0
+
+ if(!target.lying)
+ switch(zone)
+ if("head", "mouth", "eyes")
+ // ----- HEAD ----- //
+ switch(attack_damage)
+ if(1 to 2) user.visible_message("[user] slapped [target] across \his cheek!")
+ if(3 to 4) user.visible_message("[user] struck [target] in the head[pick("", " with a closed fist")]!")
+ if(5) user.visible_message("[user] gave [target] a resounding slap to the face!")
+ if("chest", "l_arm", "r_arm", "l_hand", "r_hand", "groin", "l_leg", "r_let", "l_foot", "r_foot")
+ // ----- BODY ----- //
+ switch(attack_damage)
+ if(1 to 2) user.visible_message("[user] slapped [target]'s [organ]!")
+ if(3 to 4) user.visible_message("[user] [pick(attack_verb)] [target] in \his [organ]!")
+ if(5) user.visible_message("[user] slammed \his [pick(attack_noun)] into [target]'s [organ]!")
+ else
+ user.visible_message("[user] [pick("punched", "threw a punch", "struck", "slapped", "rammed their [pick(attack_noun)] into")] [target]'s [organ]!")
+
+/datum/unarmed_attack/kick
+ attack_verb = list("kicked", "kneed")
+ attack_noun = list("kick", "knee strike")
+ attack_sound = "swing_hit"
+ damage = 0
+
+/datum/unarmed_attack/kick/is_usable(var/mob/living/carbon/human/user, var/mob/living/carbon/human/target, var/zone)
+ if (user.legcuffed)
+ return 0
+
+ if(!(zone in list("l_leg", "r_leg", "l_foot", "r_foot", "groin")))
+ return 0
+
+ var/datum/organ/external/E = user.organs_by_name["l_foot"]
+ if(E && !(E.status & ORGAN_DESTROYED))
+ return 1
+
+ E = user.organs_by_name["r_foot"]
+ if(E && !(E.status & ORGAN_DESTROYED))
+ return 1
+
+ return 0
+
+/datum/unarmed_attack/kick/get_unarmed_damage(var/mob/living/carbon/human/user)
+ var/obj/item/clothing/shoes = user.shoes
+ if(!istype(shoes))
+ return damage
+ return damage + (shoes ? shoes.force : 0)
+
+/datum/unarmed_attack/kick/show_attack(var/mob/living/carbon/human/user, var/mob/living/carbon/human/target, var/zone, var/attack_damage)
+ var/datum/organ/external/affecting = target.get_organ(zone)
+ var/organ = affecting.display_name
+
+ attack_damage = Clamp(attack_damage, 1, 5)
+
+ switch(attack_damage)
+ if(1 to 2) user.visible_message("[user] gave [target] a light [pick(attack_noun)] to the [organ]!")
+ if(3 to 4) user.visible_message("[user] [pick(attack_verb)] [target] in \his [organ]!")
+ if(5) user.visible_message("[user] landed a strong [pick(attack_noun)] against [target]'s [organ]!")
+
+/datum/unarmed_attack/stomp
+ attack_verb = null
+ attack_noun = list("kick")
+ attack_sound = "swing_hit"
+ damage = 0
+
+/datum/unarmed_attack/stomp/is_usable(var/mob/living/carbon/human/user, var/mob/living/carbon/human/target, var/zone)
+ if (user.legcuffed)
+ return 0
+
+ if (!user.lying && (target.lying || zone in list("l_foot", "r_foot")))
+ if(target.grabbed_by == user && target.lying)
+ return 0
+ var/datum/organ/external/E = user.organs_by_name["l_foot"]
+ if(E && !(E.status & ORGAN_DESTROYED))
+ return 1
+
+ E = user.organs_by_name["r_foot"]
+ if(E && !(E.status & ORGAN_DESTROYED))
+ return 1
+
+ return 0
+
+/datum/unarmed_attack/stomp/get_unarmed_damage(var/mob/living/carbon/human/user)
+ var/obj/item/clothing/shoes = user.shoes
+ return damage + (shoes ? shoes.force : 0)
+
+/datum/unarmed_attack/stomp/show_attack(var/mob/living/carbon/human/user, var/mob/living/carbon/human/target, var/zone, var/attack_damage)
+ var/datum/organ/external/affecting = target.get_organ(zone)
+ var/organ = affecting.display_name
+ var/obj/item/clothing/shoes = user.shoes
+
+ attack_damage = Clamp(attack_damage, 1, 5)
+
+ switch(attack_damage)
+ if(1 to 2) user.visible_message("[user] [pick("clomped on", "treaded on")] [target]'s [organ]!")
+ if(3 to 4) user.visible_message("[pick("[user] stomped down on", "[user] slammed \his [shoes ? copytext(shoes.name, 1, -1) : "foot"] down onto")] [target]'s [organ]!")
+ if(5) user.visible_message("[pick("[user] landed a devastating stomp on", "[user] stomped down hard on", "[user] slammed \his [shoes ? copytext(shoes.name, 1, -1) : "foot"] down hard onto")] [target]'s [organ]!")
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm
index 88000af9eb..cc053f219d 100644
--- a/code/modules/mob/living/carbon/human/update_icons.dm
+++ b/code/modules/mob/living/carbon/human/update_icons.dm
@@ -388,9 +388,6 @@ proc/get_damage_icon_part(damage_state, body_part)
//tail
update_tail_showing(0)
-
-
-
//HAIR OVERLAY
/mob/living/carbon/human/proc/update_hair(var/update_icons=1)
//Reset our hair
@@ -411,7 +408,7 @@ proc/get_damage_icon_part(damage_state, body_part)
if(f_style)
var/datum/sprite_accessory/facial_hair_style = facial_hair_styles_list[f_style]
- if(facial_hair_style && facial_hair_style.species_allowed && src.species.name in facial_hair_style.species_allowed)
+ if(facial_hair_style && facial_hair_style.species_allowed && (src.species.name in facial_hair_style.species_allowed))
var/icon/facial_s = new/icon("icon" = facial_hair_style.icon, "icon_state" = "[facial_hair_style.icon_state]_s")
if(facial_hair_style.do_colouration)
facial_s.Blend(rgb(r_facial, g_facial, b_facial), ICON_ADD)
diff --git a/code/modules/organs/organ_external.dm b/code/modules/organs/organ_external.dm
index e340909790..f6d5de69cb 100644
--- a/code/modules/organs/organ_external.dm
+++ b/code/modules/organs/organ_external.dm
@@ -829,8 +829,8 @@ Note that amputating the affected organ does in fact remove the infection from t
if(is_broken())
owner.u_equip(c_hand)
- var/emote_scream = pick("screams in pain and", "lets out a sharp cry and", "cries out and")
- owner.emote("me", 1, "[(owner.species && owner.species.flags & NO_PAIN) ? "" : emote_scream ] drops what they were holding in their [hand_name]!")
+ var/emote_scream = pick("screams in pain and ", "lets out a sharp cry and ", "cries out and ")
+ owner.emote("me", 1, "[(owner.species && owner.species.flags & NO_PAIN) ? "" : emote_scream ]drops what they were holding in their [hand_name]!")
if(is_malfunctioning())
owner.u_equip(c_hand)
owner.emote("me", 1, "drops what they were holding, their [hand_name] malfunctioning!")
diff --git a/code/modules/power/power.dm b/code/modules/power/power.dm
index 7b9c9f5847..76b712d4cb 100644
--- a/code/modules/power/power.dm
+++ b/code/modules/power/power.dm
@@ -301,10 +301,11 @@
if(istype(M.loc,/obj/mecha)) return 0 //feckin mechs are dumb
if(istype(M,/mob/living/carbon/human))
var/mob/living/carbon/human/H = M
+ if(H.species.siemens_coefficient == 0)
+ return
if(H.gloves)
var/obj/item/clothing/gloves/G = H.gloves
if(G.siemens_coefficient == 0) return 0 //to avoid spamming with insulated glvoes on
-
var/area/source_area
if(istype(power_source,/area))
source_area = power_source
diff --git a/code/modules/projectiles/guns/projectile/shotgun.dm b/code/modules/projectiles/guns/projectile/shotgun.dm
index 9c30e31102..87d214f067 100644
--- a/code/modules/projectiles/guns/projectile/shotgun.dm
+++ b/code/modules/projectiles/guns/projectile/shotgun.dm
@@ -91,7 +91,6 @@
if(AC.BB)
in_chamber = AC.BB //Load projectile into chamber.
- AC.BB.loc = src //Set projectile loc to gun.
return 1
return 0
diff --git a/code/modules/reagents/Chemistry-Reagents.dm b/code/modules/reagents/Chemistry-Reagents.dm
index 7e11d25f9a..bd2e5001e4 100644
--- a/code/modules/reagents/Chemistry-Reagents.dm
+++ b/code/modules/reagents/Chemistry-Reagents.dm
@@ -1594,7 +1594,7 @@ datum
id = "phoron"
description = "Phoron in its liquid form."
reagent_state = LIQUID
- color = "#E71B00" // rgb: 231, 27, 0
+ color = "#9D14DB"
toxpwr = 3
on_mob_life(var/mob/living/M as mob)