Merge branch 'master' of https://github.com/PolarisSS13/Polaris into 12/14/2015_communicators_v2

This commit is contained in:
Neerti
2015-12-14 15:44:38 -05:00
197 changed files with 14437 additions and 43205 deletions

View File

@@ -22,6 +22,20 @@ var/global/list/image/splatter_cache=list()
var/amount = 5
var/drytime
/obj/effect/decal/cleanable/blood/reveal_blood()
if(!fluorescent)
fluorescent = 1
basecolor = COLOR_LUMINOL
update_icon()
/obj/effect/decal/cleanable/blood/clean_blood()
fluorescent = 0
if(invisibility != 100)
invisibility = 100
amount = 0
processing_objects -= src
..(ignore=1)
/obj/effect/decal/cleanable/blood/Destroy()
for(var/datum/disease/D in viruses)
D.cure(0)

View File

@@ -29,6 +29,13 @@ var/global/list/image/fluidtrack_cache=list()
src.basecolor=_color
src.wet=_wet
/obj/effect/decal/cleanable/blood/tracks/reveal_blood()
if(!fluorescent)
if(stack && stack.len)
for(var/datum/fluidtrack/track in stack)
track.basecolor = COLOR_LUMINOL
..()
// Footprints, tire trails...
/obj/effect/decal/cleanable/blood/tracks
amount = 0
@@ -114,7 +121,8 @@ var/global/list/image/fluidtrack_cache=list()
updated=1
dirs |= comingdir|realgoing
blood_DNA |= DNA.Copy()
if(islist(blood_DNA))
blood_DNA |= DNA.Copy()
if(updated)
update_icon()

View File

@@ -1,6 +1,12 @@
/obj/effect/decal/cleanable
var/list/random_icon_states = list()
/obj/effect/decal/cleanable/clean_blood(var/ignore = 0)
if(!ignore)
qdel(src)
return
..()
/obj/effect/decal/cleanable/New()
if (random_icon_states && length(src.random_icon_states) > 0)
src.icon_state = pick(src.random_icon_states)

View File

@@ -26,6 +26,10 @@
latejoin_gateway += loc
qdel(src)
return
if("JoinLateElevator")
latejoin_elevator += loc
qdel(src)
return
if("JoinLateCryo")
latejoin_cryo += loc
qdel(src)

View File

@@ -105,27 +105,61 @@
qdel(src)
*/
/client/proc/spawn_tanktransferbomb()
set category = "Debug"
set desc = "Spawn a tank transfer valve bomb"
set name = "Instant TTV"
if(!check_rights(R_SPAWN)) return
var/obj/effect/spawner/newbomb/proto = /obj/effect/spawner/newbomb/radio/custom
var/p = input("Enter phoron amount (mol):","Phoron", initial(proto.phoron_amt)) as num|null
if(p == null) return
var/o = input("Enter oxygen amount (mol):","Oxygen", initial(proto.oxygen_amt)) as num|null
if(o == null) return
var/c = input("Enter carbon dioxide amount (mol):","Carbon Dioxide", initial(proto.carbon_amt)) as num|null
if(c == null) return
new /obj/effect/spawner/newbomb/radio/custom(get_turf(mob), p, o, c)
/obj/effect/spawner/newbomb
name = "bomb"
name = "TTV bomb"
icon = 'icons/mob/screen1.dmi'
icon_state = "x"
var/btype = 0 // 0=radio, 1=prox, 2=time
var/assembly_type = /obj/item/device/assembly/signaler
//Note that the maximum amount of gas you can put in a 70L air tank at 1013.25 kPa and 519K is 16.44 mol.
var/phoron_amt = 10.96
var/oxygen_amt = 16.44
var/carbon_amt = 0.0
timer
btype = 2
/obj/effect/spawner/newbomb/timer
name = "TTV bomb - timer"
assembly_type = /obj/item/device/assembly/timer
syndicate
/obj/effect/spawner/newbomb/timer/syndicate
name = "TTV bomb - merc"
//High yield bombs. Yes, it is possible to make these with toxins
phoron_amt = 15.66
oxygen_amt = 24.66
proximity
btype = 1
/obj/effect/spawner/newbomb/proximity
name = "TTV bomb - proximity"
assembly_type = /obj/item/device/assembly/prox_sensor
radio
btype = 0
/obj/effect/spawner/newbomb/New()
/obj/effect/spawner/newbomb/radio/custom/New(var/newloc, ph, ox, co)
if(ph != null) phoron_amt = ph
if(ox != null) oxygen_amt = ox
if(co != null) carbon_amt = co
..()
/obj/effect/spawner/newbomb/New(newloc)
..(newloc)
var/obj/item/device/transfer_valve/V = new(src.loc)
var/obj/item/weapon/tank/phoron/PT = new(V)
var/obj/item/weapon/tank/oxygen/OT = new(V)
@@ -137,28 +171,15 @@
OT.master = V
PT.air_contents.temperature = PHORON_FLASHPOINT
PT.air_contents.adjust_multi("phoron", 12, "carbon_dioxide", 8)
PT.air_contents.gas["phoron"] = phoron_amt
PT.air_contents.gas["carbon_dioxide"] = carbon_amt
PT.air_contents.update_values()
OT.air_contents.temperature = PHORON_FLASHPOINT
OT.air_contents.adjust_gas("oxygen", 20)
OT.air_contents.gas["oxygen"] = oxygen_amt
OT.air_contents.update_values()
var/obj/item/device/assembly/S
switch (src.btype)
// radio
if (0)
S = new/obj/item/device/assembly/signaler(V)
// proximity
if (1)
S = new/obj/item/device/assembly/prox_sensor(V)
// timer
if (2)
S = new/obj/item/device/assembly/timer(V)
var/obj/item/device/assembly/S = new assembly_type(V)
V.attached_device = S

View File

@@ -29,9 +29,9 @@
//It should be used purely for appearance. For gameplay effects caused by items covering body parts, use body_parts_covered.
var/flags_inv = 0
var/body_parts_covered = 0 //see setup.dm for appropriate bit flags
var/item_flags = 0 //Miscellaneous flags pertaining to equippable objects.
//var/heat_transfer_coefficient = 1 //0 prevents all transfers, 1 is invisible
var/gas_transfer_coefficient = 1 // for leaking gas from turf to mask and vice-versa (for masks right now, but at some point, i'd like to include space helmets)
var/permeability_coefficient = 1 // for chemicals/diseases
@@ -45,7 +45,6 @@
var/zoom = 0 //1 if item is actively being used to zoom. For scoped guns and binoculars.
var/icon_override = null //Used to override hardcoded clothing dmis in human clothing proc.
var/item_state = null // Used to specify the item state for the on-mob overlays.
//** These specify item/icon overrides for _slots_
@@ -494,6 +493,12 @@ var/list/global/slot_flags_enumeration = list(
var/obj/item/clothing/gloves/G = src
G.transfer_blood = 0
/obj/item/reveal_blood()
if(was_bloodied && !fluorescent)
fluorescent = 1
blood_color = COLOR_LUMINOL
blood_overlay.color = COLOR_LUMINOL
update_icon()
/obj/item/add_blood(mob/living/carbon/human/M as mob)
if (!..())
@@ -608,10 +613,10 @@ modules/mob/living/carbon/human/life.dm if you die, you will be zoomed out.
usr.visible_message("[zoomdevicename ? "[usr] looks up from the [src.name]" : "[usr] lowers the [src.name]"].")
return
/obj/item/proc/pwr_drain()
return 0 // Process Kill
/obj/item/proc/resolve_attackby(atom/A, mob/source)
return A.attackby(src,source)

View File

@@ -272,6 +272,13 @@
item_state = "headset"
ks2type = /obj/item/device/encryptionkey/headset_cargo
/obj/item/device/radio/headset/headset_cargo/alt
name = "supply bowman headset"
desc = "A bowman headset used by the QM and his slaves."
icon_state = "cargo_headset_alt"
item_state = "cargo_headset_alt"
ks2type = /obj/item/device/encryptionkey/headset_cargo
/obj/item/device/radio/headset/headset_service
name = "service radio headset"
desc = "Headset used by the service staff, tasked with keeping the station full, happy and clean."

View File

@@ -100,17 +100,9 @@
if (src.loc != usr)
return 0
if(tank_one && href_list["tankone"])
split_gases()
valve_open = 0
tank_one.loc = get_turf(src)
tank_one = null
update_icon()
remove_tank(tank_one)
else if(tank_two && href_list["tanktwo"])
split_gases()
valve_open = 0
tank_two.loc = get_turf(src)
tank_two = null
update_icon()
remove_tank(tank_two)
else if(href_list["open"])
toggle_valve()
else if(attached_device)
@@ -149,20 +141,43 @@
if(attached_device)
overlays += "device"
/obj/item/device/transfer_valve/proc/remove_tank(obj/item/weapon/tank/T)
if(tank_one == T)
split_gases()
tank_one = null
else if(tank_two == T)
split_gases()
tank_two = null
else
return
T.loc = get_turf(src)
update_icon()
/obj/item/device/transfer_valve/proc/merge_gases()
if(valve_open)
return
tank_two.air_contents.volume += tank_one.air_contents.volume
var/datum/gas_mixture/temp
temp = tank_one.air_contents.remove_ratio(1)
tank_two.air_contents.merge(temp)
valve_open = 1
/obj/item/device/transfer_valve/proc/split_gases()
if (!valve_open || !tank_one || !tank_two)
if(!valve_open)
return
valve_open = 0
if(deleted(tank_one) || deleted(tank_two))
return
var/ratio1 = tank_one.air_contents.volume/tank_two.air_contents.volume
var/datum/gas_mixture/temp
temp = tank_two.air_contents.remove_ratio(ratio1)
tank_one.air_contents.merge(temp)
tank_two.air_contents.volume -= tank_one.air_contents.volume
/*
Exadv1: I know this isn't how it's going to work, but this was just to check
@@ -170,8 +185,7 @@
*/
/obj/item/device/transfer_valve/proc/toggle_valve()
if(valve_open==0 && (tank_one && tank_two))
valve_open = 1
if(!valve_open && (tank_one && tank_two))
var/turf/bombturf = get_turf(src)
var/area/A = get_area(bombturf)
@@ -197,16 +211,11 @@
message_admins(log_str, 0, 1)
log_game(log_str)
merge_gases()
spawn(20) // In case one tank bursts
for (var/i=0,i<5,i++)
src.update_icon()
sleep(10)
src.update_icon()
else if(valve_open==1 && (tank_one && tank_two))
split_gases()
valve_open = 0
src.update_icon()
src.update_icon()
// this doesn't do anything but the timer etc. expects it to be here
// eventually maybe have it update icon to show state (timer, prox etc.) like old bombs

View File

@@ -27,7 +27,7 @@ A list of items and costs is stored under the datum of every game mode, alongsid
src.uplink_owner = owner
purchase_log = list()
world_uplinks += src
uses = telecrystals
uses = owner.tcrystals
/obj/item/device/uplink/Destroy()
world_uplinks -= src
@@ -87,6 +87,7 @@ A list of items and costs is stored under the datum of every game mode, alongsid
/obj/item/device/uplink/hidden/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
var/title = "Remote Uplink"
var/data[0]
uses = user.mind.tcrystals
data["welcome"] = welcome
data["crystals"] = uses

View File

@@ -56,7 +56,7 @@ var/datum/uplink/uplink = new()
return
purchase_log(U)
U.uses -= cost
user.mind.tcrystals -= cost
U.used_TC += cost
return goods
@@ -408,8 +408,8 @@ datum/uplink_item/dd_SortValue()
path = /obj/item/weapon/storage/box/syndie_kit/imp_explosive
/datum/uplink_item/item/implants/imp_uplink
name = "Uplink Implant (Contains 5 Telecrystals)"
item_cost = 10
name = "Uplink Implant" //Original name: "Uplink Implant (Contains 5 Telecrystals)"
item_cost = 5 //Original cost: 10
path = /obj/item/weapon/storage/box/syndie_kit/imp_uplink
/**********

View File

@@ -17,6 +17,7 @@
var/amount = 1
var/max_amount //also see stack recipes initialisation, param "max_res_amount" must be equal to this max_amount
var/stacktype //determines whether different stack types can merge
var/build_type = null //used when directly applied to a turf
var/uses_charge = 0
var/list/charge_costs = null
var/list/datum/matter_synth/synths = null

View File

@@ -12,7 +12,6 @@
desc = "A non-descript floor tile"
w_class = 3
max_amount = 60
var/build_type = null
/obj/item/stack/tile/New()
..()

View File

@@ -716,7 +716,7 @@
/obj/item/toy/therapy_red
name = "red therapy doll"
desc = "A toy for therapeutic and recreational purposes. This one is red."
icon = 'icons/obj/weapons.dmi'
icon = 'icons/obj/toy.dmi'
icon_state = "therapyred"
item_state = "egg4" // It's the red egg in items_left/righthand
w_class = 1
@@ -724,7 +724,7 @@
/obj/item/toy/therapy_purple
name = "purple therapy doll"
desc = "A toy for therapeutic and recreational purposes. This one is purple."
icon = 'icons/obj/weapons.dmi'
icon = 'icons/obj/toy.dmi'
icon_state = "therapypurple"
item_state = "egg1" // It's the magenta egg in items_left/righthand
w_class = 1
@@ -732,7 +732,7 @@
/obj/item/toy/therapy_blue
name = "blue therapy doll"
desc = "A toy for therapeutic and recreational purposes. This one is blue."
icon = 'icons/obj/weapons.dmi'
icon = 'icons/obj/toy.dmi'
icon_state = "therapyblue"
item_state = "egg2" // It's the blue egg in items_left/righthand
w_class = 1
@@ -740,7 +740,7 @@
/obj/item/toy/therapy_yellow
name = "yellow therapy doll"
desc = "A toy for therapeutic and recreational purposes. This one is yellow."
icon = 'icons/obj/weapons.dmi'
icon = 'icons/obj/toy.dmi'
icon_state = "therapyyellow"
item_state = "egg5" // It's the yellow egg in items_left/righthand
w_class = 1
@@ -748,7 +748,7 @@
/obj/item/toy/therapy_orange
name = "orange therapy doll"
desc = "A toy for therapeutic and recreational purposes. This one is orange."
icon = 'icons/obj/weapons.dmi'
icon = 'icons/obj/toy.dmi'
icon_state = "therapyorange"
item_state = "egg4" // It's the red one again, lacking an orange item_state and making a new one is pointless
w_class = 1
@@ -756,7 +756,7 @@
/obj/item/toy/therapy_green
name = "green therapy doll"
desc = "A toy for therapeutic and recreational purposes. This one is green."
icon = 'icons/obj/weapons.dmi'
icon = 'icons/obj/toy.dmi'
icon_state = "therapygreen"
item_state = "egg3" // It's the green egg in items_left/righthand
w_class = 1
@@ -886,3 +886,12 @@
item_state = "inflatable"
icon = 'icons/obj/clothing/belts.dmi'
slot_flags = SLOT_BELT
/obj/item/toy/xmastree
name = "Miniature Christmas tree"
desc = "Tiny cute Christmas tree."
icon = 'icons/obj/toy.dmi'
icon_state = "tinyxmastree"
w_class = 1
force = 1
throwforce = 1

View File

@@ -33,7 +33,7 @@ var/list/syndicate_ids = list()
if(istype(O, /obj/item/weapon/card/id))
var/obj/item/weapon/card/id/I = O
src.access |= I.access
if(player_is_antag(user))
if(player_is_antag(user.mind))
user << "<span class='notice'>The microscanner activates as you pass it over the ID, copying its access.</span>"
/obj/item/weapon/card/id/syndicate/attack_self(mob/user as mob)

View File

@@ -9,3 +9,16 @@
if(empulse(src, 4, 10))
qdel(src)
return
/obj/item/weapon/grenade/empgrenade/low_yield
name = "low yield emp grenade"
desc = "A weaker variant of the classic emp grenade"
icon_state = "lyemp"
item_state = "lyempgrenade"
origin_tech = list(TECH_MATERIAL = 2, TECH_MAGNET = 3)
prime()
..()
if(empulse(src, 4, 1))
qdel(src)
return

View File

@@ -1,16 +1,78 @@
//obj/item/weapon/grenade/explosive
//desc = "A fragmentation grenade, optimized for harming personnel without causing massive structural damage."
//name = "frag grenade"
//icon = 'icons/obj/grenade.dmi'
//det_time = 50
//icon_state = "frggrenade"
//item_state = "frggrenade"
//origin_tech = list(TECH_MATERIAL = 2, TECH_COMBAT = 3)
//obj/item/weapon/grenade/explosive/prime()
// ..()
//spawn(0)
//explosion(src.loc,-1,-1,2) //If you're within two tiles of the grenade, you get hit twice, which tends to do 50+ brute and cause fractures.
//explosion(src.loc,-1,-1,3) //This is preferable to increasing the severity, so we don't decap with frags.
//qdel(src)
//return
//Explosive grenade projectile, borrowed from fragmentation grenade code.
/obj/item/projectile/bullet/pellet/fragment
damage = 10
range_step = 2
base_spread = 0 //causes it to be treated as a shrapnel explosion instead of cone
spread_step = 20
silenced = 1 //embedding messages are still produced so it's kind of weird when enabled.
no_attack_log = 1
muzzle_type = null
/obj/item/weapon/grenade/explosive
name = "fragmentation grenade"
desc = "A fragmentation grenade, optimized for harming personnel without causing massive structural damage."
name = "frag grenade"
icon = 'icons/obj/grenade.dmi'
det_time = 50
icon_state = "frggrenade"
item_state = "frggrenade"
origin_tech = list(TECH_MATERIAL = 2, TECH_COMBAT = 3)
var/num_fragments = 50 //total number of fragments produced by the grenade
var/fragment_damage = 10
var/damage_step = 2 //projectiles lose a fragment each time they travel this distance. Can be a non-integer.
var/explosion_size = 2 //size of the center explosion
//The radius of the circle used to launch projectiles. Lower values mean less projectiles are used but if set too low gaps may appear in the spread pattern
var/spread_range = 7
/obj/item/weapon/grenade/explosive/prime()
..()
spawn(0)
explosion(src.loc,-1,-1,2) //If you're within two tiles of the grenade, you get hit twice, which tends to do 50+ brute and cause fractures.
explosion(src.loc,-1,-1,3) //This is preferable to increasing the severity, so we don't decap with frags.
qdel(src)
return
var/turf/O = get_turf(src)
if(!O) return
if(explosion_size)
explosion(O, -1, -1, 2, round(explosion_size/2), 0)
var/list/target_turfs = getcircle(O, spread_range)
var/fragments_per_projectile = round(num_fragments/target_turfs.len)
for(var/turf/T in target_turfs)
var/obj/item/projectile/bullet/pellet/fragment/P = new (O)
P.damage = fragment_damage
P.pellets = fragments_per_projectile
P.range_step = damage_step
P.shot_from = src.name
P.launch(T)
//var/cone = new /obj/item/weapon/caution/cone (T)
//spawn(100) qdel(cone)
//Make sure to hit any mobs in the source turf
for(var/mob/living/M in O)
//lying on a frag grenade while the grenade is on the ground causes you to absorb most of the shrapnel.
//you will most likely be dead, but others nearby will be spared the fragments that hit you instead.
if(M.lying && isturf(src.loc))
P.attack_mob(M, 0, 0)
else
P.attack_mob(M, 0, 100) //otherwise, allow a decent amount of fragments to pass
qdel(src)

View File

@@ -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"

View File

@@ -6,7 +6,8 @@
/obj/item/weapon/implant/uplink/New()
activation_emote = pick("blink", "blink_r", "eyebrow", "chuckle", "twitch_s", "frown", "nod", "blush", "giggle", "grin", "groan", "shrug", "smile", "pale", "sniff", "whimper", "wink")
hidden_uplink = new(src)
hidden_uplink.uses = 5
//hidden_uplink.uses = 5
//Code currently uses a mind var for telecrystals, balancing is currently an issue. Will investigate.
..()
return

View File

@@ -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)

View File

@@ -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>"

View File

@@ -18,8 +18,22 @@ var/list/tape_roll_applications = list()
anchored = 1
var/lifted = 0
var/crumpled = 0
var/tape_dir = 0
var/icon_base
/obj/item/tape/update_icon()
//Possible directional bitflags: 0 (AIRLOCK), 1 (NORTH), 2 (SOUTH), 4 (EAST), 8 (WEST), 3 (VERTICAL), 12 (HORIZONTAL)
switch (tape_dir)
if(0) // AIRLOCK
icon_state = "[icon_base]_door_[crumpled]"
if(3) // VERTICAL
icon_state = "[icon_base]_v_[crumpled]"
if(12) // HORIZONTAL
icon_state = "[icon_base]_h_[crumpled]"
else // END POINT (1|2|4|8)
icon_state = "[icon_base]_dir_[crumpled]"
dir = tape_dir
/obj/item/tape/New()
..()
if(!hazard_overlays)
@@ -32,7 +46,7 @@ var/list/tape_roll_applications = list()
/obj/item/taperoll/police
name = "police tape"
desc = "A roll of police tape used to block off crime scenes from the public."
icon_state = "police_start"
icon_state = "police"
tape_type = /obj/item/tape/police
icon_base = "police"
@@ -45,7 +59,7 @@ var/list/tape_roll_applications = list()
/obj/item/taperoll/engineering
name = "engineering tape"
desc = "A roll of engineering tape used to block off working areas from the public."
icon_state = "engineering_start"
icon_state = "engineering"
tape_type = /obj/item/tape/engineering
icon_base = "engineering"
@@ -55,58 +69,150 @@ var/list/tape_roll_applications = list()
req_one_access = list(access_engine,access_atmospherics)
icon_base = "engineering"
/obj/item/taperoll/atmos
name = "atmospherics tape"
desc = "A roll of atmospherics tape used to block off working areas from the public."
icon_state = "atmos"
tape_type = /obj/item/tape/atmos
icon_base = "atmos"
/obj/item/tape/atmos
name = "atmospherics tape"
desc = "A length of atmospherics tape. Better not cross it."
req_one_access = list(access_engine,access_atmospherics)
icon_base = "atmos"
/obj/item/taperoll/update_icon()
overlays.Cut()
if(ismob(loc))
if(!start)
overlays += "start"
else
overlays += "stop"
/obj/item/taperoll/dropped(mob/user)
update_icon()
return ..()
/obj/item/taperoll/pickup(mob/user)
update_icon()
return ..()
/obj/item/taperoll/attack_hand()
update_icon()
return ..()
/obj/item/taperoll/attack_self(mob/user as mob)
if(icon_state == "[icon_base]_start")
if(!start)
start = get_turf(src)
usr << "<span class='notice'>You place the first end of \the [src].</span>"
icon_state = "[icon_base]_stop"
update_icon()
else
icon_state = "[icon_base]_start"
end = get_turf(src)
if(start.y != end.y && start.x != end.x || start.z != end.z)
start = null
update_icon()
usr << "<span class='notice'>\The [src] can only be laid horizontally or vertically.</span>"
return
if(start == end)
// spread tape in all directions, provided there is a wall/window
var/turf/T
var/possible_dirs = 0
for(var/dir in cardinal)
T = get_step(start, dir)
if(T && T.density)
possible_dirs += dir
else
for(var/obj/structure/window/W in T)
if(W.is_fulltile() || W.dir == reverse_dir[dir])
possible_dirs += dir
if(!possible_dirs)
start = null
update_icon()
usr << "<span class='notice'>You can't place \the [src] here.</span>"
return
if(possible_dirs & (NORTH|SOUTH))
var/obj/item/tape/TP = new tape_type(start)
for(var/dir in list(NORTH, SOUTH))
if (possible_dirs & dir)
TP.tape_dir += dir
TP.update_icon()
if(possible_dirs & (EAST|WEST))
var/obj/item/tape/TP = new tape_type(start)
for(var/dir in list(EAST, WEST))
if (possible_dirs & dir)
TP.tape_dir += dir
TP.update_icon()
start = null
update_icon()
usr << "<span class='notice'>You finish placing \the [src].</span>"
return
var/turf/cur = start
var/dir
if (start.x == end.x)
var/d = end.y-start.y
if(d) d = d/abs(d)
end = get_turf(locate(end.x,end.y+d,end.z))
dir = "v"
else
var/d = end.x-start.x
if(d) d = d/abs(d)
end = get_turf(locate(end.x+d,end.y,end.z))
dir = "h"
var/orientation = get_dir(start, end)
var/dir = 0
switch(orientation)
if(NORTH, SOUTH) dir = NORTH|SOUTH // North-South taping
if(EAST, WEST) dir = EAST|WEST // East-West taping
var/can_place = 1
while (cur!=end && can_place)
while (can_place)
if(cur.density == 1)
can_place = 0
else if (istype(cur, /turf/space))
can_place = 0
else
for(var/obj/O in cur)
if(!istype(O, /obj/item/tape) && O.density)
if(O.density)
can_place = 0
break
if(cur == end)
break
cur = get_step_towards(cur,end)
if (!can_place)
start = null
update_icon()
usr << "<span class='warning'>You can't run \the [src] through that!</span>"
return
cur = start
var/tapetest = 0
while (cur!=end)
for(var/obj/item/tape/Ptest in cur)
if(Ptest.icon_state == "[Ptest.icon_base]_[dir]")
var/tapetest
var/tape_dir
while (1)
tapetest = 0
tape_dir = dir
if(cur == start)
var/turf/T = get_step(start, reverse_dir[orientation])
if(T && !T.density)
tape_dir = orientation
for(var/obj/structure/window/W in T)
if(W.is_fulltile() || W.dir == orientation)
tape_dir = dir
else if(cur == end)
var/turf/T = get_step(end, orientation)
if(T && !T.density)
tape_dir = reverse_dir[orientation]
for(var/obj/structure/window/W in T)
if(W.is_fulltile() || W.dir == reverse_dir[orientation])
tape_dir = dir
for(var/obj/item/tape/T in cur)
if((T.tape_dir == tape_dir) && (T.icon_base == icon_base))
tapetest = 1
if(tapetest != 1)
var/obj/item/tape/P = new tape_type(cur)
P.icon_state = "[P.icon_base]_[dir]"
break
if(!tapetest)
var/obj/item/tape/T = new tape_type(cur)
T.tape_dir = tape_dir
T.update_icon()
if(tape_dir & SOUTH)
T.layer += 0.1 // Must always show above other tapes
if(cur == end)
break
cur = get_step_towards(cur,end)
start = null
update_icon()
usr << "<span class='notice'>You finish placing \the [src].</span>"
return
/obj/item/taperoll/afterattack(var/atom/A, mob/user as mob, proximity)
if(!proximity)
@@ -116,7 +222,7 @@ var/list/tape_roll_applications = list()
var/turf/T = get_turf(A)
var/obj/item/tape/P = new tape_type(T.x,T.y,T.z)
P.loc = locate(T.x,T.y,T.z)
P.icon_state = "[src.icon_base]_door"
P.update_icon()
P.layer = 3.2
user << "<span class='notice'>You finish placing \the [src].</span>"
@@ -140,7 +246,7 @@ var/list/tape_roll_applications = list()
/obj/item/tape/proc/crumple()
if(!crumpled)
crumpled = 1
icon_state = "[icon_state]_c"
update_icon()
name = "crumpled [name]"
/obj/item/tape/CanPass(atom/movable/mover, turf/target, height=0, air_group=0)
@@ -149,6 +255,8 @@ var/list/tape_roll_applications = list()
add_fingerprint(M)
if (!allowed(M)) //only select few learn art of not crumpling the tape
M << "<span class='warning'>You are not supposed to go past [src]...</span>"
if(M.a_intent == I_HELP)
return 0
crumple()
return ..(mover)
@@ -158,13 +266,45 @@ var/list/tape_roll_applications = list()
/obj/item/tape/attack_hand(mob/user as mob)
if (user.a_intent == I_HELP && src.allowed(user))
user.show_viewers("<span class='notice'>\The [user] lifts \the [src], allowing passage.</span>")
crumple()
lifted = 1
spawn(200)
lifted = 0
for(var/obj/item/tape/T in gettapeline())
T.lift(100) //~10 seconds
else
breaktape(null, user)
/obj/item/tape/proc/lift(time)
lifted = 1
layer = 8
spawn(time)
lifted = 0
layer = initial(layer)
// Returns a list of all tape objects connected to src, including itself.
/obj/item/tape/proc/gettapeline()
var/list/dirs = list()
if(tape_dir & NORTH)
dirs += NORTH
if(tape_dir & SOUTH)
dirs += SOUTH
if(tape_dir & WEST)
dirs += WEST
if(tape_dir & EAST)
dirs += EAST
var/list/obj/item/tape/tapeline = list()
for (var/obj/item/tape/T in get_turf(src))
tapeline += T
for(var/dir in dirs)
var/turf/cur = get_step(src, dir)
var/not_found = 0
while (!not_found)
not_found = 1
for (var/obj/item/tape/T in cur)
tapeline += T
not_found = 0
cur = get_step(cur, dir)
return tapeline
/obj/item/tape/proc/breaktape(obj/item/weapon/W as obj, mob/user as mob)
@@ -173,27 +313,11 @@ var/list/tape_roll_applications = list()
return
user.show_viewers("<span class='notice'>\The [user] breaks \the [src]!</span>")
var/dir[2]
var/icon_dir = src.icon_state
if(icon_dir == "[src.icon_base]_h")
dir[1] = EAST
dir[2] = WEST
if(icon_dir == "[src.icon_base]_v")
dir[1] = NORTH
dir[2] = SOUTH
for(var/i=1;i<3;i++)
var/N = 0
var/turf/cur = get_step(src,dir[i])
while(N != 1)
N = 1
for (var/obj/item/tape/P in cur)
if(P.icon_state == icon_dir)
N = 0
qdel(P)
cur = get_step(cur,dir[i])
qdel(src)
return
for (var/obj/item/tape/T in gettapeline())
if(T == src)
continue
if(T.tape_dir & get_dir(T, src))
qdel(T)
qdel(src) //TODO: Dropping a trash item holding fibers/fingerprints of all broken tape parts
return

View File

@@ -148,8 +148,8 @@
icon_state = "duffle"
item_state = "duffle"
slowdown = 1
max_storage_space = 56
storage_slots = 20
max_storage_space = 38
storage_slots = 12
/obj/item/weapon/storage/backpack/dufflebag/syndie
name = "suspicious looking dufflebag"

View File

@@ -139,6 +139,37 @@
/obj/item/weapon/gun/projectile/colt/detective
)
/obj/item/weapon/storage/belt/detective
name = "forensic utility belt"
desc = "A belt for holding forensics equipment."
icon_state = "securitybelt"
item_state = "security"
storage_slots = 7
max_w_class = 3
can_hold = list(
/obj/item/device/taperecorder,
/obj/item/clothing/glasses,
/obj/item/device/flashlight,
/obj/item/weapon/reagent_containers/spray/luminol,
/obj/item/weapon/sample,
/obj/item/weapon/forensics/sample_kit/powder,
/obj/item/weapon/forensics/swab,
/obj/item/device/uv_light,
/obj/item/weapon/forensics/slide,
/obj/item/weapon/forensics/sample_kit,
/obj/item/weapon/photo,
/obj/item/device/camera_film,
/obj/item/device/camera,
/obj/item/weapon/autopsy_scanner,
/obj/item/device/mass_spectrometer,
/obj/item/device/reagent_scanner,
/obj/item/weapon/reagent_containers/dropper,
/obj/item/weapon/reagent_containers/syringe,
/obj/item/device/pda,
/obj/item/device/radio/headset,
/obj/item/taperoll/police
)
/obj/item/weapon/storage/belt/soulstone
name = "soul stone belt"
desc = "Designed for ease of access to the shards during a fight, as to not let a single enemy spirit slip away"

View File

@@ -298,6 +298,19 @@
new /obj/item/weapon/grenade/empgrenade(src)
new /obj/item/weapon/grenade/empgrenade(src)
/obj/item/weapon/storage/box/empslite
name = "box of low yield emp grenades"
desc = "A box containing 5 low yield EMP grenades.<br> WARNING: Do not use near unshielded electronics or biomechanical augmentations, death or permanent paralysis may occur."
icon_state = "emp"
New()
..()
new /obj/item/weapon/grenade/empgrenade/low_yield(src)
new /obj/item/weapon/grenade/empgrenade/low_yield(src)
new /obj/item/weapon/grenade/empgrenade/low_yield(src)
new /obj/item/weapon/grenade/empgrenade/low_yield(src)
new /obj/item/weapon/grenade/empgrenade/low_yield(src)
/obj/item/weapon/storage/box/smokes
name = "box of smoke bombs"
desc = "A box containing 5 smoke bombs."
@@ -327,7 +340,7 @@
/obj/item/weapon/storage/box/frags
name = "box of fragmentation grenades (WARNING)"
desc = "A box containing 7 military grade fragmentation grenades.<br> WARNING: These devices are extremely dangerous and can cause limb loss or death in repeated use."
desc = "A box containing 5 military grade fragmentation grenades.<br> WARNING: These devices are extremely dangerous and can cause limb loss or death in repeated use."
icon_state = "frag"
@@ -338,8 +351,7 @@
new /obj/item/weapon/grenade/explosive(src)
new /obj/item/weapon/grenade/explosive(src)
new /obj/item/weapon/grenade/explosive(src)
new /obj/item/weapon/grenade/explosive(src)
new /obj/item/weapon/grenade/explosive(src)
/obj/item/weapon/storage/box/trackimp
name = "boxed tracking implant kit"
desc = "Box full of scum-bag tracking utensils."

View File

@@ -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()

View File

@@ -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

View File

@@ -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

View File

@@ -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()
@@ -41,6 +49,10 @@
processing_objects.Remove(src)
if(istype(loc, /obj/item/device/transfer_valve))
var/obj/item/device/transfer_valve/TTV = loc
TTV.remove_tank(src)
..()
/obj/item/weapon/tank/examine(mob/user)
@@ -216,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
@@ -249,7 +281,10 @@
qdel(src)
else if(pressure > TANK_RUPTURE_PRESSURE)
//world << "<span class='notice'>[x],[y] tank is rupturing: [pressure] kPa, integrity [integrity]</span>"
#ifdef FIREDBG
log_debug("\blue[x],[y] tank is rupturing: [pressure] kPa, integrity [integrity]")
#endif
if(integrity <= 0)
var/turf/simulated/T = get_turf(src)
if(!T)
@@ -261,7 +296,10 @@
integrity--
else if(pressure > TANK_LEAK_PRESSURE)
//world << "<span class='notice'>[x],[y] tank is leaking: [pressure] kPa, integrity [integrity]</span>"
#ifdef FIREDBG
log_debug("\blue[x],[y] tank is leaking: [pressure] kPa, integrity [integrity]")
#endif
if(integrity <= 0)
var/turf/simulated/T = get_turf(src)
if(!T)

View File

@@ -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 << "<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)
@@ -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

View File

@@ -116,6 +116,7 @@
/obj/attack_ghost(mob/user)
ui_interact(user)
..()
/obj/proc/interact(mob/user)
return

View File

@@ -10,6 +10,12 @@
New()
..()
if(prob(75))
new /obj/item/weapon/storage/backpack(src)
else
new /obj/item/weapon/storage/backpack/satchel_norm(src)
if(prob(25))
new /obj/item/weapon/storage/backpack/dufflebag(src)
new /obj/item/clothing/under/rank/cargotech(src)
new /obj/item/clothing/under/rank/cargotech/skirt(src)
new /obj/item/clothing/under/rank/cargotech/jeans(src)
@@ -17,6 +23,7 @@
new /obj/item/clothing/suit/storage/hooded/wintercoat/cargo(src)
new /obj/item/clothing/shoes/black(src)
new /obj/item/device/radio/headset/headset_cargo(src)
new /obj/item/device/radio/headset/headset_cargo/alt(src)
new /obj/item/clothing/gloves/black(src)
new /obj/item/clothing/head/soft(src)
// new /obj/item/weapon/cartridge/quartermaster(src)
@@ -34,12 +41,19 @@
New()
..()
if(prob(75))
new /obj/item/weapon/storage/backpack(src)
else
new /obj/item/weapon/storage/backpack/satchel_norm(src)
if(prob(25))
new /obj/item/weapon/storage/backpack/dufflebag(src)
new /obj/item/clothing/under/rank/cargo(src)
new /obj/item/clothing/under/rank/cargo/skirt(src)
new /obj/item/clothing/under/rank/cargo/jeans(src)
new /obj/item/clothing/under/rank/cargo/jeans/female(src)
new /obj/item/clothing/shoes/brown(src)
new /obj/item/device/radio/headset/headset_cargo(src)
new /obj/item/device/radio/headset/headset_cargo/alt(src)
new /obj/item/clothing/gloves/black(src)
// new /obj/item/weapon/cartridge/quartermaster(src)
new /obj/item/clothing/suit/fire/firefighter(src)

View File

@@ -160,6 +160,6 @@
new /obj/item/clothing/suit/storage/hazardvest(src)
new /obj/item/clothing/mask/gas(src)
new /obj/item/weapon/cartridge/atmos(src)
new /obj/item/taperoll/engineering(src)
new /obj/item/taperoll/atmos(src)
new /obj/item/clothing/suit/storage/hooded/wintercoat/engineering/atmos(src)
return

View File

@@ -278,10 +278,10 @@
new /obj/item/clothing/head/det(src)
new /obj/item/clothing/head/det/grey(src)
new /obj/item/clothing/shoes/laceup(src)
new /obj/item/weapon/storage/belt/detective(src)
new /obj/item/weapon/storage/box/evidence(src)
new /obj/item/device/radio/headset/headset_sec(src)
new /obj/item/device/radio/headset/headset_sec/alt(src)
new /obj/item/device/detective_scanner(src)
new /obj/item/clothing/suit/storage/vest/detective(src)
new /obj/item/ammo_magazine/c45m/rubber(src)
new /obj/item/ammo_magazine/c45m/rubber(src)

View File

@@ -60,8 +60,8 @@
new /obj/item/weapon/pinpointer/nukeop(src)
new /obj/item/weapon/pinpointer/nukeop(src)
new /obj/item/device/pda/syndicate(src)
var/obj/item/device/radio/uplink/U = new(src)
U.hidden_uplink.uses = 40
new /obj/item/device/radio/uplink(src)
//U.hidden_uplink.uses = 40
return
/obj/structure/closet/syndicate/resources/

View File

@@ -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)

View File

@@ -199,4 +199,16 @@
/obj/structure/sign/directions/cargo
name = "\improper Cargo department"
desc = "A direction sign, pointing out which way the Cargo department is."
icon_state = "direction_crg"
icon_state = "direction_crg"
/obj/structure/sign/christmas/lights
name = "Christmas lights"
desc = "Flashy and pretty."
icon = 'icons/obj/christmas.dmi'
icon_state = "xmaslights"
/obj/structure/sign/christmas/wreath
name = "wreath"
desc = "Prickly and festive."
icon = 'icons/obj/christmas.dmi'
icon_state = "doorwreath"

View File

@@ -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 << "<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

View File

@@ -186,7 +186,7 @@
playsound(src.loc, 'sound/effects/glassknock.ogg', 80, 1)
user.do_attack_animation(src)
usr.visible_message("<span class='danger'>[usr.name] bangs against the [src.name]!</span>",
"<<span class='danger'>You bang against the [src.name]!</span>",
"<span class='danger'>You bang against the [src.name]!</span>",
"You hear a banging sound.")
else
playsound(src.loc, 'sound/effects/glassknock.ogg', 80, 1)