@@ -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)
|
||||
|
||||
@@ -413,5 +413,3 @@
|
||||
path = /obj/item/weapon/handcuffs
|
||||
hidden = 1
|
||||
category = "General"
|
||||
|
||||
|
||||
|
||||
@@ -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 << "<span class='danger'>\The [H] needs at least two wrists before you can cuff them together!</span>"
|
||||
return
|
||||
return 0
|
||||
|
||||
if(istype(H.gloves,/obj/item/clothing/gloves/rig)) // Can't cuff someone who's in a deployed hardsuit.
|
||||
user << "<span class='danger'>The cuffs won't fit around \the [H.gloves]!</span>"
|
||||
return
|
||||
if(istype(H.gloves,/obj/item/clothing/gloves/rig) && !elastic) // Can't cuff someone who's in a deployed hardsuit.
|
||||
user << "<span class='danger'>\The [src] won't fit around \the [H.gloves]!</span>"
|
||||
return 0
|
||||
|
||||
user.visible_message("<span class='danger'>\The [user] is attempting to put [cuff_type] on \the [H]!</span>")
|
||||
|
||||
if(!do_after(user,30))
|
||||
return
|
||||
return 0
|
||||
|
||||
H.attack_log += text("\[[time_stamp()]\] <font color='orange'>Has been handcuffed (attempt) by [user.name] ([user.ckey])</font>")
|
||||
user.attack_log += text("\[[time_stamp()]\] <font color='red'>Attempted to handcuff [H.name] ([H.ckey])</font>")
|
||||
@@ -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"
|
||||
@@ -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)
|
||||
|
||||
@@ -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 << "<span class='warning'>You accidentally cut yourself with the [src].</span>"
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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]."
|
||||
/obj/item/weapon/tape_roll/attack(var/mob/living/carbon/human/H, var/mob/user)
|
||||
if(istype(H))
|
||||
if(user.zone_sel.selecting == "eyes")
|
||||
|
||||
var/obj/item/weapon/ducttape/tape = new()
|
||||
user.put_in_hands(tape)
|
||||
*/
|
||||
if(!H.organs_by_name["head"])
|
||||
user << "<span class='warning'>\The [H] doesn't have a head.</span>"
|
||||
return
|
||||
if(!H.has_eyes())
|
||||
user << "<span class='warning'>\The [H] doesn't have any eyes.</span>"
|
||||
return
|
||||
if(H.glasses)
|
||||
user << "<span class='warning'>\The [H] is already wearing somethign on their eyes.</span>"
|
||||
return
|
||||
if(H.head && (H.head.body_parts_covered & FACE))
|
||||
user << "<span class='warning'>Remove their [H.head] first.</span>"
|
||||
return
|
||||
user.visible_message("<span class='danger'>\The [user] begins taping over \the [H]'s eyes!</span>")
|
||||
|
||||
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("<span class='danger'>\The [user] has taped up \the [H]'s eyes!</span>")
|
||||
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 << "<span class='warning'>\The [H] doesn't have a head.</span>"
|
||||
return
|
||||
if(!H.check_has_mouth())
|
||||
user << "<span class='warning'>\The [H] doesn't have a mouth.</span>"
|
||||
return
|
||||
if(H.wear_mask)
|
||||
user << "<span class='warning'>\The [H] is already wearing a mask.</span>"
|
||||
return
|
||||
if(H.head && (H.head.body_parts_covered & FACE))
|
||||
user << "<span class='warning'>Remove their [H.head] first.</span>"
|
||||
return
|
||||
user.visible_message("<span class='danger'>\The [user] begins taping up \the [H]'s mouth!</span>")
|
||||
|
||||
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("<span class='danger'>\The [user] has taped up \the [H]'s mouth!</span>")
|
||||
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)
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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 << "<span class='warning'>[src] is out of water!</span>"
|
||||
user << "<span class='warning'>\The [src] is out of water!</span>"
|
||||
else
|
||||
reagents.trans_to_obj(I, 5)
|
||||
user << "<span class='notice'>You wet [I] in [src].</span>"
|
||||
user << "<span class='notice'>You wet \the [I] in \the [src].</span>"
|
||||
playsound(loc, 'sound/effects/slosh.ogg', 25, 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 << "<span class='notice'>You wet \the [O] in \the [src].</span>"
|
||||
playsound(loc, 'sound/effects/slosh.ogg', 25, 1)
|
||||
return
|
||||
|
||||
var/turf/location = user.loc
|
||||
if(!isturf(location)) return
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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("<span class='danger'>\The [usr] pulls a knife out of their boot!</span>")
|
||||
holding = null
|
||||
else
|
||||
usr << "<span class='warning'>Your need an empty, unbroken hand to do that.</span>"
|
||||
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 << "<span class='warning'>\The [src] is already holding \a [holding].</span>"
|
||||
return
|
||||
user.unEquip(I)
|
||||
I.forceMove(src)
|
||||
holding = I
|
||||
user.visible_message("<span class='notice'>\The [user] shoves \the [I] into \the [src].</span>")
|
||||
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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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!")
|
||||
|
||||
@@ -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
|
||||
@@ -20,6 +20,11 @@
|
||||
holstered.add_fingerprint(user)
|
||||
w_class = max(w_class, holstered.w_class)
|
||||
user.visible_message("<span class='notice'>[user] holsters \the [holstered].</span>", "<span class='notice'>You holster \the [holstered].</span>")
|
||||
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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 << "<span class='danger'>Some of \the [src] gets in your eyes!</span>"
|
||||
H.eye_blind += 5
|
||||
H.eye_blurry += 10
|
||||
spawn(1)
|
||||
if(istype(loc, /turf/)) qdel(src)
|
||||
|
||||
|
||||
/obj/item/weapon/ore/phoron
|
||||
name = "phoron crystals"
|
||||
|
||||
@@ -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"
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -215,6 +215,7 @@
|
||||
msg += "<span class='warning'>[T.He] [T.is] on fire!.</span>\n"
|
||||
msg += "<span class='warning'>"
|
||||
|
||||
/*
|
||||
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 += "</span>"
|
||||
|
||||
|
||||
@@ -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 << "<span class='notice'>You are now [pulling_punches ? "pulling your punches" : "not pulling your punches"].</span>"
|
||||
return
|
||||
|
||||
@@ -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()]\] <font color='red'>Disarmed [src.name] ([src.ckey])</font>")
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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.
|
||||
@@ -9,9 +11,18 @@
|
||||
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
|
||||
@@ -234,3 +245,13 @@
|
||||
switch(attack_damage)
|
||||
if(1 to 4) user.visible_message("<span class='danger'>[pick("[user] stomped on", "[user] slammed \his [shoes ? copytext(shoes.name, 1, -1) : "foot"] down onto")] [target]'s [organ]!</span>")
|
||||
if(5) user.visible_message("<span class='danger'>[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]!</span>") //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
|
||||
@@ -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(
|
||||
"<span class='danger'>\The [src] attempts to remove \the [HC]!</span>",
|
||||
"<span class='warning'>You attempt to remove \the [HC]. (This will take around [displaytime] minutes and you need to stand still)</span>"
|
||||
|
||||
@@ -604,19 +604,25 @@ default behaviour is:
|
||||
|
||||
if(istype(M))
|
||||
M.drop_from_inventory(H)
|
||||
M << "<span class='warning'>[H] wriggles out of your grip!</span>"
|
||||
src << "<span class='warning'>You wriggle out of [M]'s grip!</span>"
|
||||
else if(istype(H.loc,/obj/item))
|
||||
src << "<span class='warning'>You struggle free of [H.loc].</span>"
|
||||
H.forceMove(get_turf(H))
|
||||
M << "<span class='warning'>\The [H] wriggles out of your grip!</span>"
|
||||
src << "<span class='warning'>You wriggle out of \the [M]'s grip!</span>"
|
||||
|
||||
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
|
||||
|
||||
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 << "<span class='warning'>You extricate yourself from \the [holster].</span>"
|
||||
H.forceMove(get_turf(H))
|
||||
else if(istype(H.loc,/obj/item))
|
||||
src << "<span class='warning'>You struggle free of \the [H.loc].</span>"
|
||||
H.forceMove(get_turf(H))
|
||||
|
||||
/mob/living/proc/escape_buckle()
|
||||
if(buckled)
|
||||
buckled.user_unbuckle_mob(src)
|
||||
|
||||
@@ -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"
|
||||
|
||||
|
||||
@@ -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("<span class='danger'>\The [src.name] splats.</span>","<span class='danger'>You hear a splat.</span>")
|
||||
qdel(src)
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/snacks/berryclafoutis
|
||||
|
||||
@@ -221,17 +221,28 @@
|
||||
flags = OPENCONTAINER
|
||||
unacidable = 0
|
||||
|
||||
attackby(var/obj/D, mob/user as mob)
|
||||
/obj/item/weapon/reagent_containers/glass/bucket/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)
|
||||
return
|
||||
else if(istype(D, /obj/item/weapon/mop))
|
||||
if(reagents.total_volume < 1)
|
||||
user << "<span class='warning'>\The [src] is empty!</span>"
|
||||
else
|
||||
reagents.trans_to_obj(D, 5)
|
||||
user << "<span class='notice'>You wet \the [D] in \the [src].</span>"
|
||||
playsound(loc, 'sound/effects/slosh.ogg', 25, 1)
|
||||
return
|
||||
else
|
||||
return ..()
|
||||
|
||||
update_icon()
|
||||
/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
|
||||
|
||||
|
Before Width: | Height: | Size: 48 KiB After Width: | Height: | Size: 46 KiB |
|
Before Width: | Height: | Size: 7.8 KiB After Width: | Height: | Size: 8.2 KiB |
|
Before Width: | Height: | Size: 23 KiB After Width: | Height: | Size: 23 KiB |
|
Before Width: | Height: | Size: 15 KiB After Width: | Height: | Size: 14 KiB |
|
Before Width: | Height: | Size: 18 KiB After Width: | Height: | Size: 17 KiB |
|
Before Width: | Height: | Size: 2.4 KiB After Width: | Height: | Size: 2.8 KiB |