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