Merge branch 'master' into medbay_fixes_and_shit

This commit is contained in:
alberyk
2021-09-22 22:29:51 -03:00
189 changed files with 3116 additions and 1107 deletions
+31 -18
View File
@@ -2,7 +2,7 @@
name = "portable suit cooling unit"
desc = "A portable heat sink and liquid cooled radiator that can be hooked up to a space suit's existing temperature controls to provide industrial levels of cooling."
w_class = ITEMSIZE_LARGE
icon = 'icons/obj/suitcooler.dmi'
icon = 'icons/obj/contained_items/tools/suitcooler.dmi'
icon_state = "suitcooler0"
item_state = "coolingpack"
contained_sprite = TRUE
@@ -24,7 +24,7 @@
var/cover_open = 0 //is the cover open?
var/obj/item/cell/cell
var/max_cooling = 12 //in degrees per second - probably don't need to mess with heat capacity here
var/charge_consumption = 16.6 //charge per second at max_cooling
var/charge_consumption = 8.3 //charge per second at max_cooling
var/thermostat = T20C
//TODO: make it heat up the surroundings when not in space
@@ -134,8 +134,13 @@
src.cell = null
update_icon()
return
toggle_power(user)
//TODO use a UI like the air tanks
/obj/item/device/suit_cooling_unit/AltClick(mob/user)
if(Adjacent(user))
toggle_power(user)
/obj/item/device/suit_cooling_unit/proc/toggle_power(var/mob/user)
if(on)
turn_off()
else
@@ -177,23 +182,31 @@
return
icon_state = "suitcooler0"
item_state = "coolingpack"
if(!cell || !on)
return
if(cell && on)
var/battery_level = 0
switch(round(cell.percent()))
if(86 to INFINITY)
battery_level = 0
if(69 to 85)
battery_level = 1
if(52 to 68)
battery_level = 2
if(35 to 51)
battery_level = 3
if(18 to 34)
battery_level = 4
if(-INFINITY to 17)
battery_level = 5
switch(round(cell.percent()))
if(86 to INFINITY)
add_overlay("battery-0")
if(69 to 85)
add_overlay("battery-1")
if(52 to 68)
add_overlay("battery-2")
if(35 to 51)
add_overlay("battery-3")
if(18 to 34)
add_overlay("battery-4")
if(-INFINITY to 17)
add_overlay("battery-5")
add_overlay("battery-[battery_level]")
item_state = "coolingpack[battery_level]"
if(ismob(loc))
var/mob/M = loc
M.update_inv_back()
M.update_inv_s_store()
/obj/item/device/suit_cooling_unit/examine(mob/user)
if(!..(user, 1))
+4
View File
@@ -211,6 +211,10 @@ RFD Construction-Class
build_cost = 1
build_type = "floor"
build_atom = /turf/simulated/floor/airless
else if(istype(T, /turf/simulated/open))
build_cost = 1
build_type = "floor"
build_atom = /turf/simulated/floor/airless
else if(istype(T, /turf/simulated/floor))
build_delay = 20
build_cost = 3
+3 -3
View File
@@ -41,7 +41,7 @@
can_place = TRUE
else
for (var/obj/item/grab/G in C.grabbed_by)
if (G.loc == user && G.state >= GRAB_AGGRESSIVE)
if (G.state >= GRAB_AGGRESSIVE)
can_place = TRUE
break
@@ -102,7 +102,7 @@
user.drop_from_inventory(cuffs,target)
else
cuffs.forceMove(target)
if(!legcuff)
target.handcuffed = cuffs
target.update_inv_handcuffed()
@@ -250,4 +250,4 @@
icon_state = "legcuff"
legcuff = TRUE
breakouttime = 30 SECONDS
cuff_type = "legcuffs"
cuff_type = "legcuffs"
@@ -172,12 +172,6 @@
desc = "It's an orange backpack which was designed to hold beakers, pill bottles and bottles."
icon_state = "chempack"
/obj/item/storage/backpack/cloak
name = "tunnel cloak"
desc = "It's a Vaurca cloak with storage pockets."
icon_state = "cape"
sprite_sheets = list(BODYTYPE_VAURCA = 'icons/mob/species/vaurca/back.dmi')
/obj/item/storage/backpack/syndie
name = "syndicate rucksack"
desc = "The latest in carbon fiber and red satin combat rucksack technology. Comfortable and tough!"
@@ -625,4 +619,71 @@
desc = "A small, fashionable bag typically worn over the shoulder."
icon_state = "purse"
item_state = "purse"
max_storage_space = 16
max_storage_space = 16
//**Vaurca cloaks**//
/obj/item/storage/backpack/cloak
name = "tunnel cloak"
desc = "A Vaurca cloak with storage pockets."
icon_state = "cape"
item_state = "cape"
sprite_sheets = list(BODYTYPE_VAURCA = 'icons/mob/species/vaurca/back.dmi')
var/hooded = FALSE
/obj/item/storage/backpack/cloak/verb/toggle_cloak_hood()
set name = "Toggle Cloak Hood"
set desc = "Toggle your cloak hood."
set category = "Object"
set src in usr
if(use_check_and_message(usr))
return 0
hooded = !hooded
to_chat(usr, "You [hooded ? "raise" : "lower"] \the [src] hood.")
icon_state = "[initial(icon_state)][hooded ? "_up" : ""]"
item_state = "icon_state"
var/mob/living/carbon/human/H = src.loc
H.update_icon()
H.update_inv_back()
/obj/item/storage/backpack/cloak/sedantis
name = "Sedantis tunnel cloak"
desc = "A Vaurca cloak with storage pockets. This one has the Sedantis flag design."
icon_state = "sedcape"
item_state = "sedcape"
/obj/item/storage/backpack/cloak/medical
name = "medical tunnel cloak"
desc = "A Vaurca cloak with storage pockets. This one has the medical department design."
icon_state = "medcape"
item_state = "medcape"
/obj/item/storage/backpack/cloak/engi
name = "engineering tunnel cloak"
desc = "A Vaurca cloak with storage pockets. This one has the engineering department design."
icon_state = "engicape"
item_state = "engicape"
/obj/item/storage/backpack/cloak/atmos
name = "atmospherics tunnel cloak"
desc = "A Vaurca cloak with storage pockets. This one has the atmospherics design."
icon_state = "atmoscape"
item_state = "atmoscape"
/obj/item/storage/backpack/cloak/cargo
name = "cargo tunnel cloak"
desc = "A Vaurca cloak with storage pockets. This one has the supply department design."
icon_state = "cargocape"
item_state = "cargocape"
/obj/item/storage/backpack/cloak/sci
name = "science tunnel cloak"
desc = "A Vaurca cloak with storage pockets. This one has the science department design."
icon_state = "scicape"
item_state = "scicape"
/obj/item/storage/backpack/cloak/sec
name = "security tunnel cloak"
desc = "A Vaurca cloak with storage pockets. This one has the security department design."
icon_state = "seccape"
item_state = "seccape"
@@ -46,19 +46,24 @@
var/flipped = null
var/flippable = 1
var/wear_over_suit = 0
var/base_name = ""
/obj/item/storage/wallet/Initialize()
. = ..()
base_name = name
AddComponent(/datum/component/base_name, name)
/obj/item/storage/wallet/proc/update_name(var/base_name = initial(name))
SEND_SIGNAL(src, COMSIG_BASENAME_SETNAME, args)
if(front_id)
name = "[base_name] ([front_id])"
else
name = "[base_name]"
/obj/item/storage/wallet/remove_from_storage(obj/item/W as obj, atom/new_location)
. = ..(W, new_location)
if(.)
if(W == front_id)
front_id = null
name = base_name
update_name()
update_icon()
/obj/item/storage/wallet/handle_item_insertion(obj/item/W as obj, prevent_warning = 0)
@@ -66,7 +71,7 @@
if(.)
if(!front_id && istype(W, /obj/item/card/id))
front_id = W
name = "[name] ([front_id])"
update_name()
update_icon()
/obj/item/storage/wallet/update_icon()
@@ -124,7 +124,7 @@
new /obj/item/clothing/mask/gas/alt(src)
new /obj/item/clothing/mask/gas/half(src)
new /obj/item/auto_cpr(src)
new /obj/item/clothing/suit/storage/toggle/first_responder_jacket(src)
new /obj/item/clothing/suit/storage/toggle/fr_jacket/alt(src)
/obj/structure/closet/secure_closet/CMO
name = "chief medical officer's locker"
@@ -140,6 +140,8 @@
new /obj/item/clothing/accessory/badge/hos(src)
new /obj/item/clothing/gloves/black_leather(src)
new /obj/item/clothing/suit/storage/toggle/armor/hos(src)
new /obj/item/clothing/mask/gas/alt(src)
new /obj/item/clothing/mask/gas/half(src)
//Tools
new /obj/item/device/radio/headset/heads/hos(src)
new /obj/item/device/radio/headset/heads/hos/alt(src)
@@ -0,0 +1,52 @@
/obj/structure/window_frame
name = "window frame"
desc = "An empty window frame."
icon = 'icons/obj/smooth/full_window.dmi'
icon_state = "window_frame"
build_amt = 4
anchored = FALSE
/obj/structure/window_frame/anchored
anchored = TRUE
/obj/structure/window_frame/attackby(obj/item/W, mob/user)
if((W.isscrewdriver()) && (istype(loc, /turf/simulated) || anchored))
playsound(src, W.usesound, 80, 1)
anchored = !anchored
user.visible_message("<span class='notice'>[user] [anchored ? "fastens" : "unfastens"] \the [src].</span>", \
"<span class='notice'>You have [anchored ? "fastened the grille to" : "unfastened the grill from"] the floor.</span>")
return
else if(W.iswelder())
var/obj/item/weldingtool/WT = W
if(!WT.isOn())
to_chat(user, SPAN_WARNING("\The [WT] isn't turned on."))
return
if(WT.remove_fuel(0, user))
to_chat(user, SPAN_NOTICE("You use \the [WT] to remove \the [src]."))
playsound(src, WT.usesound, 80, 1)
new /obj/item/stack/material/steel(get_turf(src),rand(1,3))
qdel(src)
return
else if(istype(W, /obj/item/stack/material) && W.get_material_name() == MATERIAL_GLASS_REINFORCED && anchored)
var/obj/item/stack/material/G = W
if(G.use(4))
playsound(src, 'sound/items/Deconstruct.ogg', 50, 1)
to_chat(user, SPAN_WARNING ("You place the glass on the window frame."))
new /obj/structure/window/full(get_turf(src))
qdel(src)
return
else
to_chat(user, SPAN_WARNING ("You need at least four sheets of reinforced glass to finished the window."))
else if(istype(W, /obj/item/stack/material) && W.get_material_name() == MATERIAL_GLASS_REINFORCED_PHORON && anchored)
var/obj/item/stack/material/G = W
if(G.use(4))
playsound(src, 'sound/items/Deconstruct.ogg', 50, 1)
to_chat(user, SPAN_WARNING ("You place the glass on the window frame."))
new /obj/structure/window/full/phoron(get_turf(src))
qdel(src)
return
else
to_chat(user, SPAN_WARNING ("You need at least four sheets of reinforced borosilicate glass to finished the window."))
+1
View File
@@ -10,6 +10,7 @@
anchored = TRUE
flags = CONDUCT
explosion_resistance = 1
layer = 2.98
var/health = 10
var/destroyed = 0
+24
View File
@@ -870,6 +870,30 @@
/obj/structure/sign/flag/gadpathur/right
icon_state = "gadpathur_r"
/obj/item/flag/vysoka
name = "Free System of Vysoka flag"
desc = "The flag of the Free System of Vysoka."
desc_fluff = "The red, yellow and Coalition-blue flag of Vysoka, as drawn when one wishes to represent the planet as a whole. As Vysokan communities are rather traditional and tied to their respective Host, village or city-state, natives are more likely to \
identify with local symbols. This has not stopped the original flag from being flown in times of much-needed unity."
flag_path = "vysoka"
/obj/structure/sign/flag/vysoka
name = "Free System of Vysoka flag"
desc = "The flag of the Free System of Vysoka."
desc_fluff = "The red, yellow and Coalition-blue flag of Vysoka, as drawn when one wishes to represent the planet as a whole. As Vysokan communities are rather traditional and tied to their respective Host, village or city-state, natives are more likely to \
identify with local symbols. This has not stopped the original flag from being flown in times of much-needed unity."
icon_state = "vysoka"
/obj/item/flag/vysoka/l
name = "large Free System of Vysoka flag"
flag_size = 1
/obj/structure/sign/flag/vysoka/left
icon_state = "vysoka_l"
/obj/structure/sign/flag/vysoka/right
icon_state = "vysoka_r"
/obj/item/flag/afterattack(var/atom/A, var/mob/user, var/adjacent, var/clickparams)
if (!adjacent)
return
@@ -432,9 +432,16 @@
bedpath = /obj/structure/bed/roller/hover
/obj/item/roller/attack_self(mob/user)
var/obj/structure/bed/roller/R = new bedpath(user.loc)
R.add_fingerprint(user)
qdel(src)
..()
deploy_roller(user, user.loc)
/obj/item/roller/afterattack(obj/target, mob/user, proximity)
if(!proximity)
return
if(isturf(target))
var/turf/T = target
if(!T.density)
deploy_roller(user, target)
/obj/item/roller/attackby(obj/item/W as obj, mob/user as mob)
@@ -448,6 +455,11 @@
..()
/obj/item/roller/proc/deploy_roller(mob/user, atom/location)
var/obj/structure/bed/roller/R = new bedpath(location)
R.add_fingerprint(user)
qdel(src)
/obj/item/roller_holder
name = "roller bed rack"
desc = "A rack for carrying a collapsed roller bed."
+83 -39
View File
@@ -19,6 +19,7 @@
var/shardtype = /obj/item/material/shard
var/glasstype = null // Set this in subtypes. Null is assumed strange or otherwise impossible to dismantle, such as for shuttle glass.
var/silicate = 0 // number of units of silicate
var/base_frame = null
atmos_canpass = CANPASS_PROC
@@ -45,6 +46,12 @@
else
to_chat(user, SPAN_NOTICE("There is a thick layer of silicate covering it."))
/obj/structure/window/proc/update_nearby_icons()
queue_smooth_neighbors(src)
/obj/structure/window/update_icon()
queue_smooth(src)
/obj/structure/window/proc/take_damage(var/damage = 0, var/sound_effect = 1)
var/initialhealth = health
@@ -102,6 +109,14 @@
new shardtype(loc) //todo pooling?
if(reinf)
new /obj/item/stack/rods(loc)
if(base_frame)
if(prob(50))
var/obj/F = new base_frame(loc)
F.anchored = anchored
else
new /obj/item/material/shard/shrapnel(loc)
qdel(src)
return
@@ -233,6 +248,7 @@
to_chat(user, (state == 1 ? SPAN_NOTICE("You have unfastened the window from the frame.") : SPAN_NOTICE("You have fastened the window to the frame.")))
else if(reinf && state == 0)
anchored = !anchored
update_icon()
update_nearby_icons()
playsound(loc, W.usesound, 75, 1)
to_chat(user, (anchored ? SPAN_NOTICE("You have fastened the frame to the floor.") : SPAN_NOTICE("You have unfastened the frame from the floor.")))
@@ -241,6 +257,8 @@
update_nearby_icons()
playsound(loc, W.usesound, 75, 1)
to_chat(user, (anchored ? SPAN_NOTICE("You have fastened the window to the floor.") : SPAN_NOTICE("You have unfastened the window.")))
update_icon()
update_nearby_icons()
else if(W.iscrowbar() && reinf && state <= 1)
state = 1 - state
playsound(loc, W.usesound, 75, 1)
@@ -250,12 +268,7 @@
to_chat(user, SPAN_NOTICE("You're not sure how to dismantle \the [src] properly."))
else
visible_message(SPAN_NOTICE("[user] dismantles \the [src]."))
if(dir == SOUTHWEST)
var/obj/item/stack/material/mats = new glasstype(loc)
mats.amount = is_fulltile() ? 4 : 2
else
new glasstype(loc)
qdel(src)
dismantle_window()
else
user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN)
if(W.damtype == BRUTE || W.damtype == BURN)
@@ -300,6 +313,14 @@
take_damage(damage)
return
/obj/structure/window/proc/dismantle_window()
if(dir == SOUTHWEST)
var/obj/item/stack/material/mats = new glasstype(loc)
mats.amount = is_fulltile() ? 4 : 2
else
new glasstype(loc)
qdel(src)
/obj/structure/window/Initialize(mapload, start_dir = null, constructed=0)
. = ..()
@@ -342,33 +363,6 @@
return 1
return 0
//This proc is used to update the icons of nearby windows. It should not be confused with update_nearby_tiles(), which is an atmos proc!
/obj/structure/window/proc/update_nearby_icons()
update_icon()
for(var/obj/structure/window/W in orange(src, 1))
W.update_icon()
//merges adjacent full-tile windows into one (blatant ripoff from game/smoothwall.dm)
/obj/structure/window/update_icon()
//A little cludge here, since I don't know how it will work with slim windows. Most likely VERY wrong.
//this way it will only update full-tile ones
cut_overlays()
if(!is_fulltile())
icon_state = "[basestate]"
return
var/list/dirs = list()
if(anchored)
for(var/obj/structure/window/W in orange(src,1))
if(W.anchored && W.density && W.type == src.type && W.is_fulltile()) //Only counts anchored, not-destroyed fill-tile windows.
dirs += get_dir(src, W)
var/list/connections = dirs_to_corner_states(dirs)
icon_state = ""
for(var/i = 1 to 4)
var/image/I = image(icon, "[basestate][connections[i]]", dir = 1<<(i-1))
add_overlay(I)
/obj/structure/window/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume)
if(exposed_temperature > maximal_heat)
hit(damage_per_fire_tick, 0)
@@ -514,12 +508,6 @@
/obj/structure/window/shuttle/crescent/take_damage()
return
/obj/structure/window/shuttle/update_nearby_icons()
queue_smooth_neighbors(src)
/obj/structure/window/update_icon()
queue_smooth(src)
/obj/structure/window/reinforced/polarized
name = "electrochromic window"
desc = "Adjusts its tint with voltage. Might take a few good hits to shatter it."
@@ -581,3 +569,59 @@
/obj/machinery/button/switch/windowtint/update_icon()
icon_state = "light[active]"
/obj/structure/window/full
name = "reinforced window"
desc = "It looks rather strong. Might take a few good hits to shatter it."
icon = 'icons/obj/smooth/full_window.dmi'
icon_state = "window_glass"
basestate = "window_glass"
maxhealth = 40
reinf = TRUE
maximal_heat = T0C + 750
dir = 5
smooth = SMOOTH_TRUE
damage_per_fire_tick = 2.0
can_be_unanchored = TRUE
glasstype = /obj/item/stack/material/glass/reinforced
layer = 2.99
base_frame = /obj/structure/window_frame
/obj/structure/window/full/dismantle_window()
var/obj/item/stack/material/mats = new glasstype(loc)
mats.amount = 4
var/obj/structure/window_frame/F = new/obj/structure/window_frame (get_turf(src))
F.anchored = anchored
qdel(src)
/obj/structure/window/full/phoron
name = "reinforced borosilicate window"
desc = "A borosilicate alloy window, with rods supporting it. It seems to be very strong."
icon = 'icons/obj/smooth/phoron_full_window.dmi'
icon_state = "window_glass"
basestate = "window_glass"
shardtype = /obj/item/material/shard/phoron
glasstype = /obj/item/stack/material/glass/phoronrglass
maximal_heat = T0C + 4000
damage_per_fire_tick = 1.0
maxhealth = 80.0
layer = 2.99
base_frame = /obj/structure/window_frame
/obj/structure/window/reinforced/polarized/full
name = "reinforced electrochromic window"
desc = "Adjusts its tint with voltage. Might take a few good hits to shatter it."
icon = 'icons/obj/smooth/full_window.dmi'
icon_state = "window_glass"
basestate = "window_glass"
dir = 5
smooth = SMOOTH_TRUE
layer = 2.99
base_frame = /obj/structure/window_frame
/obj/structure/window/reinforced/polarized/full/dismantle_window()
var/obj/item/stack/material/mats = new glasstype(loc)
mats.amount = 4
var/obj/structure/window_frame/F = new/obj/structure/window_frame (get_turf(src))
F.anchored = anchored
qdel(src)