diff --git a/code/game/antagonist/antagonist_update.dm b/code/game/antagonist/antagonist_update.dm
index 4eb81cc709..dbbae8a5e1 100644
--- a/code/game/antagonist/antagonist_update.dm
+++ b/code/game/antagonist/antagonist_update.dm
@@ -32,7 +32,7 @@
if(!antag_indicator || !other.current || !recipient.current)
return
var/indicator = (faction_indicator && (other in faction_members)) ? faction_indicator : antag_indicator
- return image('icons/mob/mob.dmi', loc = other.current, icon_state = indicator)
+ return image('icons/mob/mob.dmi', loc = other.current, icon_state = indicator, layer = LIGHTING_LAYER+0.1)
/datum/antagonist/proc/update_all_icons()
if(!antag_indicator)
diff --git a/code/game/machinery/autolathe_datums.dm b/code/game/machinery/autolathe_datums.dm
index 700f0686d0..a29f6ab08c 100644
--- a/code/game/machinery/autolathe_datums.dm
+++ b/code/game/machinery/autolathe_datums.dm
@@ -413,5 +413,3 @@
path = /obj/item/weapon/handcuffs
hidden = 1
category = "General"
-
-
diff --git a/code/game/objects/items/weapons/handcuffs.dm b/code/game/objects/items/weapons/handcuffs.dm
index c88ad3e641..03814de92c 100644
--- a/code/game/objects/items/weapons/handcuffs.dm
+++ b/code/game/objects/items/weapons/handcuffs.dm
@@ -12,6 +12,7 @@
throw_range = 5
origin_tech = list(TECH_MATERIAL = 1)
matter = list(DEFAULT_WALL_MATERIAL = 500)
+ var/elastic
var/dispenser = 0
var/breakouttime = 1200 //Deciseconds = 120s = 2 minutes
var/cuff_sound = 'sound/weapons/handcuffs.ogg'
@@ -53,20 +54,20 @@
var/mob/living/carbon/human/H = target
if(!istype(H))
- return
+ return 0
if (!H.has_organ_for_slot(slot_handcuffed))
user << "\The [H] needs at least two wrists before you can cuff them together!"
- return
+ return 0
- if(istype(H.gloves,/obj/item/clothing/gloves/rig)) // Can't cuff someone who's in a deployed hardsuit.
- user << "The cuffs won't fit around \the [H.gloves]!"
- return
+ if(istype(H.gloves,/obj/item/clothing/gloves/rig) && !elastic) // Can't cuff someone who's in a deployed hardsuit.
+ user << "\The [src] won't fit around \the [H.gloves]!"
+ return 0
user.visible_message("\The [user] is attempting to put [cuff_type] on \the [H]!")
if(!do_after(user,30))
- return
+ return 0
H.attack_log += text("\[[time_stamp()]\] Has been handcuffed (attempt) by [user.name] ([user.ckey])")
user.attack_log += text("\[[time_stamp()]\] Attempted to handcuff [H.name] ([H.ckey])")
@@ -84,7 +85,7 @@
cuffs.loc = target
target.handcuffed = cuffs
target.update_inv_handcuffed()
- return
+ return 1
var/last_chew = 0
/mob/living/carbon/human/RestrainedClickOn(var/atom/A)
@@ -118,6 +119,7 @@ var/last_chew = 0
breakouttime = 300 //Deciseconds = 30s
cuff_sound = 'sound/weapons/cablecuff.ogg'
cuff_type = "cable restraints"
+ elastic = 1
/obj/item/weapon/handcuffs/cable/red
color = "#DD0000"
@@ -156,3 +158,12 @@ var/last_chew = 0
/obj/item/weapon/handcuffs/cyborg
dispenser = 1
+
+/obj/item/weapon/handcuffs/cable/tape
+ name = "tape restraints"
+ desc = "DIY!"
+ icon_state = "tape_cross"
+ item_state = null
+ icon = 'icons/obj/bureaucracy.dmi'
+ breakouttime = 200
+ cuff_type = "duct tape"
\ No newline at end of file
diff --git a/code/game/objects/items/weapons/material/bats.dm b/code/game/objects/items/weapons/material/bats.dm
index eccc13a298..d622cc2f28 100644
--- a/code/game/objects/items/weapons/material/bats.dm
+++ b/code/game/objects/items/weapons/material/bats.dm
@@ -10,6 +10,7 @@
default_material = "wood"
force_divisor = 1.1 // 22 when wielded with weight 20 (steel)
unwielded_force_divisor = 0.7 // 15 when unwielded based on above.
+ slot_flags = SLOT_BACK
//Predefined materials go here.
/obj/item/weapon/material/twohanded/baseballbat/metal/New(var/newloc)
diff --git a/code/game/objects/items/weapons/material/kitchen.dm b/code/game/objects/items/weapons/material/kitchen.dm
index d0e81e9548..6b2d0abf41 100644
--- a/code/game/objects/items/weapons/material/kitchen.dm
+++ b/code/game/objects/items/weapons/material/kitchen.dm
@@ -75,6 +75,17 @@
icon_state = "knife"
force_divisor = 0.1 // 6 when wielded with hardness 60 (steel)
+// Identical to the tactical knife but nowhere near as stabby.
+// Kind of like the toy esword compared to the real thing.
+/obj/item/weapon/material/kitchen/utensil/knife/boot
+ name = "boot knife"
+ desc = "A small fixed-blade knife for putting inside a boot."
+ icon = 'icons/obj/weapons.dmi'
+ icon_state = "tacknife"
+ item_state = "knife"
+ applies_material_colour = 0
+ unbreakable = 1
+
/obj/item/weapon/material/kitchen/utensil/knife/attack(target as mob, mob/living/user as mob)
if ((CLUMSY in user.mutations) && prob(50))
user << "You accidentally cut yourself with the [src]."
diff --git a/code/game/objects/items/weapons/storage/fancy.dm b/code/game/objects/items/weapons/storage/fancy.dm
index 95eefcf764..dd33c7a6f2 100644
--- a/code/game/objects/items/weapons/storage/fancy.dm
+++ b/code/game/objects/items/weapons/storage/fancy.dm
@@ -135,7 +135,7 @@
throwforce = 2
slot_flags = SLOT_BELT
storage_slots = 6
- can_hold = list(/obj/item/clothing/mask/smokable/cigarette)
+ can_hold = list(/obj/item/clothing/mask/smokable/cigarette, /obj/item/weapon/flame/lighter)
icon_type = "cigarette"
/obj/item/weapon/storage/fancy/cigarettes/New()
diff --git a/code/game/objects/items/weapons/tanks/jetpack.dm b/code/game/objects/items/weapons/tanks/jetpack.dm
index 1389e9b17d..003e4b2ac9 100644
--- a/code/game/objects/items/weapons/tanks/jetpack.dm
+++ b/code/game/objects/items/weapons/tanks/jetpack.dm
@@ -4,6 +4,7 @@
name = "jetpack (empty)"
desc = "A tank of compressed gas for use as propulsion in zero-gravity areas. Use with caution."
icon_state = "jetpack"
+ gauge_icon = null
w_class = 4.0
item_state = "jetpack"
distribute_pressure = ONE_ATMOSPHERE*O2STANDARD
diff --git a/code/game/objects/items/weapons/tanks/tank_types.dm b/code/game/objects/items/weapons/tanks/tank_types.dm
index 1c6056c25e..2940ef0268 100644
--- a/code/game/objects/items/weapons/tanks/tank_types.dm
+++ b/code/game/objects/items/weapons/tanks/tank_types.dm
@@ -85,6 +85,7 @@
name = "phoron tank"
desc = "Contains dangerous phoron. Do not inhale. Warning: extremely flammable."
icon_state = "phoron"
+ gauge_icon = null
flags = CONDUCT
slot_flags = null //they have no straps!
@@ -114,6 +115,8 @@
name = "emergency oxygen tank"
desc = "Used for emergencies. Contains very little oxygen, so try to conserve it until you actually need it."
icon_state = "emergency"
+ gauge_icon = "indicator_emergency"
+ gauge_cap = 4
flags = CONDUCT
slot_flags = SLOT_BELT
w_class = 2.0
@@ -142,12 +145,15 @@
/obj/item/weapon/tank/emergency_oxygen/double
name = "double emergency oxygen tank"
icon_state = "emergency_double"
+ gauge_icon = "indicator_emergency_double"
volume = 10
/obj/item/weapon/tank/emergency_nitrogen
name = "emergency nitrogen tank"
desc = "An emergency air tank hastily painted red and issued to Vox crewmembers."
icon_state = "emergency_nitro"
+ gauge_icon = "indicator_emergency"
+ gauge_cap = 4
flags = CONDUCT
slot_flags = SLOT_BELT
w_class = 2.0
diff --git a/code/game/objects/items/weapons/tanks/tanks.dm b/code/game/objects/items/weapons/tanks/tanks.dm
index b131e03ee4..a00cb019d4 100644
--- a/code/game/objects/items/weapons/tanks/tanks.dm
+++ b/code/game/objects/items/weapons/tanks/tanks.dm
@@ -1,9 +1,17 @@
#define TANK_MAX_RELEASE_PRESSURE (3*ONE_ATMOSPHERE)
#define TANK_DEFAULT_RELEASE_PRESSURE 24
+#define TANK_IDEAL_PRESSURE 1015 //Arbitrary.
+
+var/list/global/tank_gauge_cache = list()
/obj/item/weapon/tank
name = "tank"
icon = 'icons/obj/tank.dmi'
+
+ var/gauge_icon = "indicator_tank"
+ var/last_gauge_pressure
+ var/gauge_cap = 6
+
flags = CONDUCT
slot_flags = SLOT_BACK
w_class = 3
@@ -31,8 +39,8 @@
src.air_contents = new /datum/gas_mixture()
src.air_contents.volume = volume //liters
src.air_contents.temperature = T20C
-
processing_objects.Add(src)
+ update_gauge()
return
/obj/item/weapon/tank/Destroy()
@@ -220,8 +228,28 @@
/obj/item/weapon/tank/process()
//Allow for reactions
air_contents.react() //cooking up air tanks - add phoron and oxygen, then heat above PHORON_MINIMUM_BURN_TEMPERATURE
+ if(gauge_icon)
+ update_gauge()
check_status()
+/obj/item/weapon/tank/proc/update_gauge()
+ var/gauge_pressure = 0
+ if(air_contents)
+ gauge_pressure = air_contents.return_pressure()
+ if(gauge_pressure > TANK_IDEAL_PRESSURE)
+ gauge_pressure = -1
+ else
+ gauge_pressure = round((gauge_pressure/TANK_IDEAL_PRESSURE)*gauge_cap)
+
+ if(gauge_pressure == last_gauge_pressure)
+ return
+
+ last_gauge_pressure = gauge_pressure
+ overlays.Cut()
+ var/indicator = "[gauge_icon][(gauge_pressure == -1) ? "overload" : gauge_pressure]"
+ if(!tank_gauge_cache[indicator])
+ tank_gauge_cache[indicator] = image(icon, indicator)
+ overlays += tank_gauge_cache[indicator]
/obj/item/weapon/tank/proc/check_status()
//Handle exploding, leaking, and rupturing of the tank
diff --git a/code/game/objects/items/weapons/tape.dm b/code/game/objects/items/weapons/tape.dm
index 911a6334d2..04c0a5fbfe 100644
--- a/code/game/objects/items/weapons/tape.dm
+++ b/code/game/objects/items/weapons/tape.dm
@@ -5,18 +5,71 @@
icon_state = "taperoll"
w_class = 1
-/* -- Disabled for now until it has a use --
-/obj/item/weapon/tape_roll/attack_self(mob/user as mob)
- user << "You remove a length of tape from [src]."
-
- var/obj/item/weapon/ducttape/tape = new()
- user.put_in_hands(tape)
-*/
+/obj/item/weapon/tape_roll/attack(var/mob/living/carbon/human/H, var/mob/user)
+ if(istype(H))
+ if(user.zone_sel.selecting == "eyes")
+
+ if(!H.organs_by_name["head"])
+ user << "\The [H] doesn't have a head."
+ return
+ if(!H.has_eyes())
+ user << "\The [H] doesn't have any eyes."
+ return
+ if(H.glasses)
+ user << "\The [H] is already wearing somethign on their eyes."
+ return
+ if(H.head && (H.head.body_parts_covered & FACE))
+ user << "Remove their [H.head] first."
+ return
+ user.visible_message("\The [user] begins taping over \the [H]'s eyes!")
+
+ if(!do_after(user, 30))
+ return
+
+ // Repeat failure checks.
+ if(!H || !src || !H.organs_by_name["head"] || !H.has_eyes() || H.glasses || (H.head && (H.head.body_parts_covered & FACE)))
+ return
+
+ user.visible_message("\The [user] has taped up \the [H]'s eyes!")
+ H.equip_to_slot_or_del(new /obj/item/clothing/glasses/sunglasses/blindfold/tape(H), slot_glasses)
+
+ else if(user.zone_sel.selecting == "mouth" || user.zone_sel.selecting == "head")
+ if(!H.organs_by_name["head"])
+ user << "\The [H] doesn't have a head."
+ return
+ if(!H.check_has_mouth())
+ user << "\The [H] doesn't have a mouth."
+ return
+ if(H.wear_mask)
+ user << "\The [H] is already wearing a mask."
+ return
+ if(H.head && (H.head.body_parts_covered & FACE))
+ user << "Remove their [H.head] first."
+ return
+ user.visible_message("\The [user] begins taping up \the [H]'s mouth!")
+
+ if(!do_after(user, 30))
+ return
+
+ // Repeat failure checks.
+ if(!H || !src || !H.organs_by_name["head"] || !H.check_has_mouth() || H.wear_mask || (H.head && (H.head.body_parts_covered & FACE)))
+ return
+
+ user.visible_message("\The [user] has taped up \the [H]'s mouth!")
+ H.equip_to_slot_or_del(new /obj/item/clothing/mask/muzzle/tape(H), slot_wear_mask)
+
+ else if(user.zone_sel.selecting == "r_hand" || user.zone_sel.selecting == "l_hand")
+ var/obj/item/weapon/handcuffs/cable/tape/T = new(user)
+ if(!T.place_handcuffs(H, user))
+ user.unEquip(T)
+ qdel(T)
+ else
+ return ..()
+ return 1
/obj/item/weapon/tape_roll/proc/stick(var/obj/item/weapon/W, mob/user)
if(!istype(W, /obj/item/weapon/paper))
return
-
user.drop_from_inventory(W)
var/obj/item/weapon/ducttape/tape = new(get_turf(src))
tape.attach(W)
@@ -52,7 +105,7 @@
return
user << "You remove \the [initial(name)] from [stuck]."
-
+
user.drop_from_inventory(src)
stuck.forceMove(get_turf(src))
user.put_in_hands(stuck)
@@ -61,6 +114,7 @@
qdel(src)
/obj/item/weapon/ducttape/afterattack(var/A, mob/user, flag, params)
+
if(!in_range(user, A) || istype(A, /obj/machinery/door) || !stuck)
return
diff --git a/code/game/objects/structures/mop_bucket.dm b/code/game/objects/structures/mop_bucket.dm
index fcad40a0f0..2fb8566dc9 100644
--- a/code/game/objects/structures/mop_bucket.dm
+++ b/code/game/objects/structures/mop_bucket.dm
@@ -20,8 +20,8 @@
/obj/structure/mopbucket/attackby(obj/item/I, mob/user)
if(istype(I, /obj/item/weapon/mop))
if(reagents.total_volume < 1)
- user << "[src] is out of water!"
+ user << "\The [src] is out of water!"
else
reagents.trans_to_obj(I, 5)
- user << "You wet [I] in [src]."
+ user << "You wet \the [I] in \the [src]."
playsound(loc, 'sound/effects/slosh.ogg', 25, 1)
diff --git a/code/game/objects/structures/watercloset.dm b/code/game/objects/structures/watercloset.dm
index 9239687dc7..f254d193f8 100644
--- a/code/game/objects/structures/watercloset.dm
+++ b/code/game/objects/structures/watercloset.dm
@@ -316,11 +316,11 @@
/obj/machinery/shower/proc/process_heat(mob/living/M)
if(!on || !istype(M)) return
-
+
var/temperature = temperature_settings[watertemp]
var/temp_adj = between(BODYTEMP_COOLING_MAX, temperature - M.bodytemperature, BODYTEMP_HEATING_MAX)
M.bodytemperature += temp_adj
-
+
if(ishuman(M))
var/mob/living/carbon/human/H = M
if(temperature >= H.species.heat_level_1)
@@ -411,6 +411,11 @@
// Short of a rewrite, this is necessary to stop monkeycubes being washed.
else if(istype(O, /obj/item/weapon/reagent_containers/food/snacks/monkeycube))
return
+ else if(istype(O, /obj/item/weapon/mop))
+ O.reagents.add_reagent("water", 5)
+ user << "You wet \the [O] in \the [src]."
+ playsound(loc, 'sound/effects/slosh.ogg', 25, 1)
+ return
var/turf/location = user.loc
if(!isturf(location)) return
diff --git a/code/modules/client/preferences_gear.dm b/code/modules/client/preferences_gear.dm
index c8f811641a..002b0807d3 100644
--- a/code/modules/client/preferences_gear.dm
+++ b/code/modules/client/preferences_gear.dm
@@ -1616,6 +1616,12 @@ var/global/list/gear_datums = list()
sort_category = "misc"
cost = 1
+/datum/gear/boot_knife
+ display_name = "boot knife"
+ path = /obj/item/weapon/material/kitchen/utensil/knife/boot
+ sort_category = "misc"
+ cost = 3
+
/datum/gear/cane
display_name = "cane"
path = /obj/item/weapon/cane
diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm
index 5f9a19fa45..6f5615d7e1 100644
--- a/code/modules/clothing/clothing.dm
+++ b/code/modules/clothing/clothing.dm
@@ -419,6 +419,9 @@ BLIND // can't see anything
body_parts_covered = FEET
slot_flags = SLOT_FEET
+ var/can_hold_knife
+ var/obj/item/holding
+
permeability_coefficient = 0.50
slowdown = SHOES_SLOWDOWN
force = 2
@@ -429,6 +432,54 @@ BLIND // can't see anything
"Resomi" = 'icons/mob/species/resomi/shoes.dmi',
)
+/obj/item/clothing/shoes/proc/draw_knife()
+ set name = "Draw Boot Knife"
+ set desc = "Pull out your boot knife."
+ set category = "IC"
+ set src in usr
+
+ if(usr.stat || usr.restrained() || usr.incapacitated())
+ return
+
+ holding.forceMove(get_turf(usr))
+
+ if(usr.put_in_hands(holding))
+ usr.visible_message("\The [usr] pulls a knife out of their boot!")
+ holding = null
+ else
+ usr << "Your need an empty, unbroken hand to do that."
+ holding.forceMove(src)
+
+ if(!holding)
+ verbs -= /obj/item/clothing/shoes/proc/draw_knife
+
+ update_icon()
+ return
+
+
+/obj/item/clothing/shoes/attackby(var/obj/item/I, var/mob/user)
+ if(can_hold_knife && istype(I, /obj/item/weapon/material/shard) || \
+ istype(I, /obj/item/weapon/material/butterfly) || \
+ istype(I, /obj/item/weapon/material/kitchen/utensil) || \
+ istype(I, /obj/item/weapon/material/hatchet/tacknife))
+ if(holding)
+ user << "\The [src] is already holding \a [holding]."
+ return
+ user.unEquip(I)
+ I.forceMove(src)
+ holding = I
+ user.visible_message("\The [user] shoves \the [I] into \the [src].")
+ verbs |= /obj/item/clothing/shoes/proc/draw_knife
+ update_icon()
+ else
+ return ..()
+
+/obj/item/clothing/shoes/update_icon()
+ overlays.Cut()
+ if(holding)
+ overlays += image(icon, "[icon_state]_knife")
+ return ..()
+
/obj/item/clothing/shoes/proc/handle_movement(var/turf/walking, var/running)
return
diff --git a/code/modules/clothing/glasses/glasses.dm b/code/modules/clothing/glasses/glasses.dm
index c5fadf4463..0ba28aa3cc 100644
--- a/code/modules/clothing/glasses/glasses.dm
+++ b/code/modules/clothing/glasses/glasses.dm
@@ -183,6 +183,14 @@
item_state = "blindfold"
//vision_flags = BLIND // This flag is only supposed to be used if it causes permanent blindness, not temporary because of glasses
+/obj/item/clothing/glasses/sunglasses/blindfold/tape
+ name = "length of tape"
+ desc = "It's a robust DIY blindfold!"
+ icon = 'icons/obj/bureaucracy.dmi'
+ icon_state = "tape_cross"
+ item_state = null
+ w_class = 1
+
/obj/item/clothing/glasses/sunglasses/prescription
name = "prescription sunglasses"
prescription = 1
diff --git a/code/modules/clothing/masks/miscellaneous.dm b/code/modules/clothing/masks/miscellaneous.dm
index c0b99d954a..f4cd0dbbc8 100644
--- a/code/modules/clothing/masks/miscellaneous.dm
+++ b/code/modules/clothing/masks/miscellaneous.dm
@@ -8,6 +8,14 @@
gas_transfer_coefficient = 0.90
voicechange = 1
+/obj/item/clothing/mask/muzzle/tape
+ name = "length of tape"
+ desc = "It's a robust DIY muzzle!"
+ icon = 'icons/obj/bureaucracy.dmi'
+ icon_state = "tape_cross"
+ item_state = null
+ w_class = 1
+
/obj/item/clothing/mask/muzzle/New()
..()
say_messages = list("Mmfph!", "Mmmf mrrfff!", "Mmmf mnnf!")
diff --git a/code/modules/clothing/shoes/jobs.dm b/code/modules/clothing/shoes/jobs.dm
index 9610337906..9e3bc0e2cf 100644
--- a/code/modules/clothing/shoes/jobs.dm
+++ b/code/modules/clothing/shoes/jobs.dm
@@ -15,6 +15,7 @@
force = 3
armor = list(melee = 30, bullet = 10, laser = 10, energy = 15, bomb = 20, bio = 0, rad = 0)
siemens_coefficient = 0.7
+ can_hold_knife = 1
/obj/item/clothing/shoes/jackboots/unathi
name = "toe-less jackboots"
@@ -30,3 +31,4 @@
item_state = "workboots"
armor = list(melee = 40, bullet = 0, laser = 0, energy = 15, bomb = 20, bio = 0, rad = 20)
siemens_coefficient = 0.7
+ can_hold_knife = 1
\ No newline at end of file
diff --git a/code/modules/clothing/under/accessories/holster.dm b/code/modules/clothing/under/accessories/holster.dm
index 25b5cf2f86..5d71a00420 100644
--- a/code/modules/clothing/under/accessories/holster.dm
+++ b/code/modules/clothing/under/accessories/holster.dm
@@ -20,6 +20,11 @@
holstered.add_fingerprint(user)
w_class = max(w_class, holstered.w_class)
user.visible_message("[user] holsters \the [holstered].", "You holster \the [holstered].")
+ name = "occupied [initial(name)]"
+
+/obj/item/clothing/accessory/holster/proc/clear_holster()
+ holstered = null
+ name = initial(name)
/obj/item/clothing/accessory/holster/proc/unholster(mob/user as mob)
if(!holstered)
@@ -40,8 +45,8 @@
)
user.put_in_hands(holstered)
holstered.add_fingerprint(user)
- holstered = null
w_class = initial(w_class)
+ clear_holster()
/obj/item/clothing/accessory/holster/attack_hand(mob/user as mob)
if (has_suit) //if we are part of a suit
diff --git a/code/modules/hydroponics/grown.dm b/code/modules/hydroponics/grown.dm
index 5433361bbd..17a4d36569 100644
--- a/code/modules/hydroponics/grown.dm
+++ b/code/modules/hydroponics/grown.dm
@@ -5,6 +5,7 @@
icon = 'icons/obj/hydroponics_products.dmi'
icon_state = "blank"
desc = "Nutritious! Probably."
+ slot_flags = SLOT_HOLSTER
var/plantname
var/datum/seed/seed
diff --git a/code/modules/mining/ore.dm b/code/modules/mining/ore.dm
index ef501c0325..19cdf2a18b 100644
--- a/code/modules/mining/ore.dm
+++ b/code/modules/mining/ore.dm
@@ -25,10 +25,23 @@
material = "carbon"
/obj/item/weapon/ore/glass
- name = "impure silicates"
+ name = "sand"
icon_state = "ore_glass"
origin_tech = list(TECH_MATERIAL = 1)
material = "sand"
+ slot_flags = SLOT_HOLSTER
+
+// POCKET SAND!
+/obj/item/weapon/ore/glass/throw_impact(atom/hit_atom)
+ ..()
+ var/mob/living/carbon/human/H = hit_atom
+ if(istype(H) && H.has_eyes() && prob(85))
+ H << "Some of \the [src] gets in your eyes!"
+ H.eye_blind += 5
+ H.eye_blurry += 10
+ spawn(1)
+ if(istype(loc, /turf/)) qdel(src)
+
/obj/item/weapon/ore/phoron
name = "phoron crystals"
diff --git a/code/modules/mining/ore_datum.dm b/code/modules/mining/ore_datum.dm
index 32f03c072f..a69a66a210 100644
--- a/code/modules/mining/ore_datum.dm
+++ b/code/modules/mining/ore_datum.dm
@@ -59,7 +59,7 @@ var/global/list/ore_data = list()
/ore/glass
name = "sand"
- display_name = "impure silicates"
+ display_name = "sand"
smelts_to = "glass"
compresses_to = "sandstone"
diff --git a/code/modules/mob/holder.dm b/code/modules/mob/holder.dm
index 97bdb5ab04..39c8270c6a 100644
--- a/code/modules/mob/holder.dm
+++ b/code/modules/mob/holder.dm
@@ -5,7 +5,7 @@ var/list/holder_mob_icon_cache = list()
name = "holder"
desc = "You shouldn't ever see this."
icon = 'icons/obj/objects.dmi'
- slot_flags = SLOT_HEAD
+ slot_flags = SLOT_HEAD | SLOT_HOLSTER
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/head.dmi',
@@ -62,7 +62,7 @@ var/list/holder_mob_icon_cache = list()
//Mob specific holders.
/obj/item/weapon/holder/diona
origin_tech = list(TECH_MAGNET = 3, TECH_BIO = 5)
- slot_flags = SLOT_HEAD | SLOT_OCLOTHING
+ slot_flags = SLOT_HEAD | SLOT_OCLOTHING | SLOT_HOLSTER
/obj/item/weapon/holder/drone
origin_tech = list(TECH_MAGNET = 3, TECH_ENGINEERING = 5)
diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm
index b783e46a2d..07619bff1f 100644
--- a/code/modules/mob/living/carbon/human/examine.dm
+++ b/code/modules/mob/living/carbon/human/examine.dm
@@ -215,6 +215,7 @@
msg += "[T.He] [T.is] on fire!.\n"
msg += ""
+ /*
if(nutrition < 100)
msg += "[T.He] [T.is] severely malnourished.\n"
else if(nutrition >= 500)
@@ -222,6 +223,7 @@
msg += "[T.He] [T.is] plump and delicious looking - Like a fat little piggy. A tasty piggy.\n"
else*/
msg += "[T.He] [T.is] quite chubby.\n"
+ */
msg += ""
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index 2e3fc00722..eef1b95245 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -1413,3 +1413,13 @@
get_scooped(H)
return
return ..()
+
+/mob/living/carbon/human/verb/pull_punches()
+ set name = "Pull Punches"
+ set desc = "Try not to hurt them."
+ set category = "IC"
+
+ if(stat) return
+ pulling_punches = !pulling_punches
+ src << "You are now [pulling_punches ? "pulling your punches" : "not pulling your punches"]."
+ return
diff --git a/code/modules/mob/living/carbon/human/human_attackhand.dm b/code/modules/mob/living/carbon/human/human_attackhand.dm
index 6b12d0ea9b..a0af1f2fcf 100644
--- a/code/modules/mob/living/carbon/human/human_attackhand.dm
+++ b/code/modules/mob/living/carbon/human/human_attackhand.dm
@@ -1,6 +1,10 @@
/mob/living/carbon/human/proc/get_unarmed_attack(var/mob/living/carbon/human/target, var/hit_zone)
for(var/datum/unarmed_attack/u_attack in species.unarmed_attacks)
if(u_attack.is_usable(src, target, hit_zone))
+ if(pulling_punches)
+ var/datum/unarmed_attack/soft_variant = u_attack.get_sparring_variant()
+ if(soft_variant)
+ return soft_variant
return u_attack
return null
@@ -221,7 +225,7 @@
attack.apply_effects(H, src, armour, rand_damage, hit_zone)
// Finally, apply damage to target
- apply_damage(real_damage, BRUTE, affecting, armour, sharp=attack.sharp, edge=attack.edge)
+ apply_damage(real_damage, (attack.deal_halloss ? HALLOSS : BRUTE), affecting, armour, sharp=attack.sharp, edge=attack.edge)
if(I_DISARM)
M.attack_log += text("\[[time_stamp()]\] Disarmed [src.name] ([src.ckey])")
diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm
index bde26ceb60..7ed171a1f1 100644
--- a/code/modules/mob/living/carbon/human/human_defines.dm
+++ b/code/modules/mob/living/carbon/human/human_defines.dm
@@ -82,6 +82,7 @@
var/list/flavor_texts = list()
var/gunshot_residue
+ var/pulling_punches // Are you trying not to hurt your opponent?
mob_bump_flag = HUMAN
mob_push_flags = ~HEAVY
diff --git a/code/modules/mob/living/carbon/human/unarmed_attack.dm b/code/modules/mob/living/carbon/human/unarmed_attack.dm
index 289b4a2273..92a6089e9f 100644
--- a/code/modules/mob/living/carbon/human/unarmed_attack.dm
+++ b/code/modules/mob/living/carbon/human/unarmed_attack.dm
@@ -1,3 +1,5 @@
+var/global/list/sparring_attack_cache = list()
+
//Species unarmed attacks
/datum/unarmed_attack
var/attack_verb = list("attack") // Empty hand hurt intent verb.
@@ -8,10 +10,19 @@
var/shredding = 0 // Calls the old attack_alien() behavior on objects/mobs when on harm intent.
var/sharp = 0
var/edge = 0
-
+
+ var/deal_halloss
+ var/sparring_variant_type = /datum/unarmed_attack/light_strike
+
var/eye_attack_text
var/eye_attack_text_victim
+/datum/unarmed_attack/proc/get_sparring_variant()
+ if(sparring_variant_type)
+ if(!sparring_attack_cache[sparring_variant_type])
+ sparring_attack_cache[sparring_variant_type] = new sparring_variant_type()
+ return sparring_attack_cache[sparring_variant_type]
+
/datum/unarmed_attack/proc/is_usable(var/mob/living/carbon/human/user, var/mob/living/carbon/human/target, var/zone)
if(user.restrained())
return 0
@@ -84,7 +95,7 @@
/datum/unarmed_attack/proc/handle_eye_attack(var/mob/living/carbon/human/user, var/mob/living/carbon/human/target)
var/obj/item/organ/eyes/eyes = target.internal_organs_by_name["eyes"]
eyes.take_damage(rand(3,4), 1)
-
+
user.visible_message("[user] presses \his [eye_attack_text] into [target]'s [eyes.name]!")
target << "You experience[(target.species.flags & NO_PAIN)? "" : " immense pain as you feel" ] [eye_attack_text_victim] being pressed into your [eyes.name][(target.species.flags & NO_PAIN)? "." : "!"]"
@@ -233,4 +244,14 @@
switch(attack_damage)
if(1 to 4) user.visible_message("[pick("[user] stomped 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 powerful stomp on", "[user] stomped down hard on", "[user] slammed \his [shoes ? copytext(shoes.name, 1, -1) : "foot"] down hard onto")] [target]'s [organ]!") //Devastated lol. No. We want to say that the stomp was powerful or forceful, not that it /wrought devastation/
\ No newline at end of file
+ if(5) user.visible_message("[pick("[user] landed a powerful stomp on", "[user] stomped down hard on", "[user] slammed \his [shoes ? copytext(shoes.name, 1, -1) : "foot"] down hard onto")] [target]'s [organ]!") //Devastated lol. No. We want to say that the stomp was powerful or forceful, not that it /wrought devastation/
+
+/datum/unarmed_attack/light_strike
+ deal_halloss = 3
+ attack_noun = list("tap","light strike")
+ attack_verb = list("tapped", "lightly struck")
+ damage = 2
+ shredding = 0
+ damage = 0
+ sharp = 0
+ edge = 0
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/resist.dm b/code/modules/mob/living/carbon/resist.dm
index bb0e27e73e..8b33f7a586 100644
--- a/code/modules/mob/living/carbon/resist.dm
+++ b/code/modules/mob/living/carbon/resist.dm
@@ -20,7 +20,7 @@
return
..()
-
+
if(handcuffed)
spawn() escape_handcuffs()
else if(legcuffed)
@@ -47,6 +47,11 @@
breakouttime = HC.breakouttime
displaytime = breakouttime / 600 //Minutes
+ var/mob/living/carbon/human/H = src
+ if(istype(H) && H.gloves && istype(H.gloves,/obj/item/clothing/gloves/rig))
+ breakouttime /= 2
+ displaytime /= 2
+
visible_message(
"\The [src] attempts to remove \the [HC]!",
"You attempt to remove \the [HC]. (This will take around [displaytime] minutes and you need to stand still)"
diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm
index 88193d1895..ef7a33fd40 100644
--- a/code/modules/mob/living/living.dm
+++ b/code/modules/mob/living/living.dm
@@ -604,18 +604,24 @@ default behaviour is:
if(istype(M))
M.drop_from_inventory(H)
- M << "[H] wriggles out of your grip!"
- src << "You wriggle out of [M]'s grip!"
- else if(istype(H.loc,/obj/item))
- src << "You struggle free of [H.loc]."
- H.forceMove(get_turf(H))
+ M << "\The [H] wriggles out of your grip!"
+ src << "You wriggle out of \the [M]'s grip!"
- if(istype(M))
+ // Update whether or not this mob needs to pass emotes to contents.
for(var/atom/A in M.contents)
if(istype(A,/mob/living/simple_animal/borer) || istype(A,/obj/item/weapon/holder))
return
+ M.status_flags &= ~PASSEMOTES
- M.status_flags &= ~PASSEMOTES
+ else if(istype(H.loc,/obj/item/clothing/accessory/holster))
+ var/obj/item/clothing/accessory/holster/holster = H.loc
+ if(holster.holstered == H)
+ holster.clear_holster()
+ src << "You extricate yourself from \the [holster]."
+ H.forceMove(get_turf(H))
+ else if(istype(H.loc,/obj/item))
+ src << "You struggle free of \the [H.loc]."
+ H.forceMove(get_turf(H))
/mob/living/proc/escape_buckle()
if(buckled)
diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm
index f3d7ffd848..302b8eb101 100644
--- a/code/modules/mob/living/silicon/robot/robot_modules.dm
+++ b/code/modules/mob/living/silicon/robot/robot_modules.dm
@@ -665,7 +665,7 @@ var/global/list/robot_modules = list(
no_slip = 1
networks = list(NETWORK_ENGINEERING)
-/obj/item/weapon/robot_module/drone/New()
+/obj/item/weapon/robot_module/drone/New(var/mob/living/silicon/robot/robot)
src.modules += new /obj/item/weapon/weldingtool(src)
src.modules += new /obj/item/weapon/screwdriver(src)
src.modules += new /obj/item/weapon/wrench(src)
@@ -675,6 +675,11 @@ var/global/list/robot_modules = list(
src.modules += new /obj/item/device/lightreplacer(src)
src.modules += new /obj/item/weapon/gripper(src)
src.modules += new /obj/item/weapon/soap(src)
+ src.modules += new /obj/item/weapon/extinguisher(src)
+
+ robot.internals = new/obj/item/weapon/tank/jetpack/carbondioxide(src)
+ src.modules += robot.internals
+
src.emag = new /obj/item/weapon/pickaxe/plasmacutter(src)
src.emag.name = "Plasma Cutter"
diff --git a/code/modules/reagents/reagent_containers/food/snacks.dm b/code/modules/reagents/reagent_containers/food/snacks.dm
index 12af8c4a7f..e4e4ed4c31 100644
--- a/code/modules/reagents/reagent_containers/food/snacks.dm
+++ b/code/modules/reagents/reagent_containers/food/snacks.dm
@@ -914,7 +914,7 @@
/obj/item/weapon/reagent_containers/food/snacks/pie/throw_impact(atom/hit_atom)
..()
new/obj/effect/decal/cleanable/pie_smudge(src.loc)
- src.visible_message("\red [src.name] splats.","\red You hear a splat.")
+ src.visible_message("\The [src.name] splats.","You hear a splat.")
qdel(src)
/obj/item/weapon/reagent_containers/food/snacks/berryclafoutis
diff --git a/code/modules/reagents/reagent_containers/glass.dm b/code/modules/reagents/reagent_containers/glass.dm
index 223484b3d9..3a084fc6e4 100644
--- a/code/modules/reagents/reagent_containers/glass.dm
+++ b/code/modules/reagents/reagent_containers/glass.dm
@@ -221,20 +221,31 @@
flags = OPENCONTAINER
unacidable = 0
- attackby(var/obj/D, mob/user as mob)
- if(isprox(D))
- user << "You add [D] to [src]."
- qdel(D)
- user.put_in_hands(new /obj/item/weapon/bucket_sensor)
- user.drop_from_inventory(src)
- qdel(src)
+/obj/item/weapon/reagent_containers/glass/bucket/attackby(var/obj/D, mob/user as mob)
- update_icon()
- overlays.Cut()
+ if(isprox(D))
+ user << "You add [D] to [src]."
+ qdel(D)
+ user.put_in_hands(new /obj/item/weapon/bucket_sensor)
+ user.drop_from_inventory(src)
+ qdel(src)
+ return
+ else if(istype(D, /obj/item/weapon/mop))
+ if(reagents.total_volume < 1)
+ user << "\The [src] is empty!"
+ else
+ reagents.trans_to_obj(D, 5)
+ user << "You wet \the [D] in \the [src]."
+ playsound(loc, 'sound/effects/slosh.ogg', 25, 1)
+ return
+ else
+ return ..()
- if (!is_open_container())
- var/image/lid = image(icon, src, "lid_[initial(icon_state)]")
- overlays += lid
+/obj/item/weapon/reagent_containers/glass/bucket/update_icon()
+ overlays.Cut()
+ if (!is_open_container())
+ var/image/lid = image(icon, src, "lid_[initial(icon_state)]")
+ overlays += lid
/*
/obj/item/weapon/reagent_containers/glass/blender_jug
diff --git a/icons/mob/back.dmi b/icons/mob/back.dmi
index 40184e4c72..8600c9c26a 100644
Binary files a/icons/mob/back.dmi and b/icons/mob/back.dmi differ
diff --git a/icons/mob/eyes.dmi b/icons/mob/eyes.dmi
index 22ab5327e2..5e6d56b219 100644
Binary files a/icons/mob/eyes.dmi and b/icons/mob/eyes.dmi differ
diff --git a/icons/mob/mask.dmi b/icons/mob/mask.dmi
index 7928b24698..7ff6b43cb8 100644
Binary files a/icons/mob/mask.dmi and b/icons/mob/mask.dmi differ
diff --git a/icons/obj/bureaucracy.dmi b/icons/obj/bureaucracy.dmi
index 3a479f85d0..f8b7e566d3 100644
Binary files a/icons/obj/bureaucracy.dmi and b/icons/obj/bureaucracy.dmi differ
diff --git a/icons/obj/clothing/shoes.dmi b/icons/obj/clothing/shoes.dmi
index 2f191e20c3..3d0fa01bee 100644
Binary files a/icons/obj/clothing/shoes.dmi and b/icons/obj/clothing/shoes.dmi differ
diff --git a/icons/obj/tank.dmi b/icons/obj/tank.dmi
index 9f39eb1bee..c1b956645b 100644
Binary files a/icons/obj/tank.dmi and b/icons/obj/tank.dmi differ