Merge branch 'master' into upstream-merge-11065

This commit is contained in:
Nadyr
2021-07-15 19:19:34 -04:00
committed by GitHub
94 changed files with 1291 additions and 416 deletions
+1 -1
View File
@@ -11,7 +11,7 @@ env:
jobs:
autochangelog:
name: Autochangelog
runs-on: ubuntu-16.04
runs-on: ubuntu-20.04
if: github.event.pull_request.merged == true
steps:
- uses: /actions/checkout@v2
+4 -4
View File
@@ -10,7 +10,7 @@ env:
jobs:
file_tests:
name: Run Linters
runs-on: ubuntu-18.04
runs-on: ubuntu-20.04
steps:
- uses: actions/checkout@v2
- name: Ensure +x on CI directory
@@ -26,7 +26,7 @@ jobs:
# dreamchecker:
# name: DreamChecker
# runs-on: ubuntu-18.04
# runs-on: ubuntu-20.04
# steps:
# - uses: actions/checkout@v2
#
@@ -54,7 +54,7 @@ jobs:
unit_tests:
name: Integration Tests
runs-on: ubuntu-18.04
runs-on: ubuntu-20.04
steps:
- uses: actions/checkout@v2
- name: Ensure +x on CI directory
@@ -69,7 +69,7 @@ jobs:
run: |
sudo dpkg --add-architecture i386
sudo apt update || true
sudo apt install libc6:i386 libgcc1:i386 libstdc++6:i386 libssl1.0.0:i386 zlib1g:i386
sudo apt install zlib1g-dev:i386 libssl-dev:i386 pkg-config:i386
ldd librust_g.so
- name: Unit Tests
run: |
+1 -1
View File
@@ -14,7 +14,7 @@ on:
jobs:
generate_maps:
name: 'Generate NanoMaps'
runs-on: ubuntu-18.04
runs-on: ubuntu-20.04
steps:
- name: Clone
uses: actions/checkout@v2
+2 -2
View File
@@ -4,8 +4,8 @@ export SPACEMAN_DMM_VERSION=suite-1.7
# For NanoUI + TGUI
export NODE_VERSION=12
# Byond Major
export BYOND_MAJOR=513
export BYOND_MAJOR=514
# Byond Minor
export BYOND_MINOR=1542
export BYOND_MINOR=1557
# Macro Count
export MACRO_COUNT=4
+11 -6
View File
@@ -114,7 +114,7 @@ SUBSYSTEM_DEF(transcore)
else
if(curr_MR.dead_state != MR_DEAD) //First time switching to dead
if(curr_MR.do_notify)
db.notify(curr_MR.mindname)
db.notify(curr_MR)
curr_MR.last_notification = world.time
curr_MR.dead_state = MR_DEAD
@@ -250,10 +250,15 @@ SUBSYSTEM_DEF(transcore)
return 1
// Send a past-due notification to the medical radio channel.
/datum/transcore_db/proc/notify(var/name)
ASSERT(name)
global_announcer.autosay("[name] is past-due for a mind backup.", "TransCore Oversight", "Medical")
// Send a past-due notification to the proper radio channel.
/datum/transcore_db/proc/notify(var/datum/transhuman/mind_record/MR)
ASSERT(MR)
var/datum/transcore_db/db = SStranscore.db_by_mind_name(MR.mindname)
var/datum/transhuman/body_record/BR = db.body_scans[MR.mindname]
if(!BR)
global_announcer.autosay("[MR.mindname] is past-due for a mind backup, but lacks a corresponding body record.", "TransCore Oversight", "Medical")
return
global_announcer.autosay("[MR.mindname] is past-due for a mind backup.", "TransCore Oversight", BR.synthetic ? "Science" : "Medical")
// Called from mind_record to add itself to the transcore.
/datum/transcore_db/proc/add_backup(var/datum/transhuman/mind_record/MR)
@@ -295,4 +300,4 @@ SUBSYSTEM_DEF(transcore)
return disk.stored.len
#undef SSTRANSCORE_BACKUPS
#undef SSTRANSCORE_IMPLANTS
#undef SSTRANSCORE_IMPLANTS
+2 -2
View File
@@ -92,7 +92,7 @@
/decl/hierarchy/outfit/job/medical/paramedic
name = OUTFIT_JOB_NAME("Paramedic")
uniform = /obj/item/clothing/under/rank/medical/scrubs/black
uniform = /obj/item/clothing/under/rank/medical/paramedic
suit = /obj/item/clothing/suit/storage/toggle/fr_jacket
shoes = /obj/item/clothing/shoes/boots/jackboots
l_hand = /obj/item/weapon/storage/firstaid/regular
@@ -103,5 +103,5 @@
/decl/hierarchy/outfit/job/medical/paramedic/emt
name = OUTFIT_JOB_NAME("Emergency Medical Technician")
uniform = /obj/item/clothing/under/rank/medical/paramedic
uniform = /obj/item/clothing/under/rank/medical/paramedic_alt
suit = /obj/item/clothing/suit/storage/toggle/labcoat/emt
+3 -3
View File
@@ -202,7 +202,7 @@
/obj/item/clothing/under/rank/medical/paramedic,
/obj/item/clothing/suit/storage/toggle/fr_jacket,
/obj/item/clothing/mask/gas,
/obj/item/clothing/under/rank/medical/paramedic,
/obj/item/clothing/under/rank/medical/paramedic_alt,
/obj/item/clothing/accessory/stethoscope,
/obj/item/weapon/storage/firstaid/adv,
/obj/item/clothing/shoes/boots/jackboots,
@@ -305,8 +305,8 @@
/datum/supply_pack/med/medicalbiosuits
name = "Medical biohazard gear"
contains = list(
/obj/item/clothing/head/bio_hood = 3,
/obj/item/clothing/suit/bio_suit = 3,
/obj/item/clothing/head/bio_hood/modern = 3,
/obj/item/clothing/suit/bio_suit/modern = 3,
/obj/item/clothing/head/bio_hood/virology = 2,
/obj/item/clothing/suit/bio_suit/cmo,
/obj/item/clothing/head/bio_hood/cmo,
+183 -51
View File
@@ -229,57 +229,6 @@
busy = FALSE
/obj/structure/wheel_of_fortune
name = "wheel of fortune"
desc = "May fortune favour the lucky one!"
icon = 'icons/obj/casino_ch.dmi'
icon_state = "wheel_of_fortune"
density = 1
anchored = 1
var/interval = 1
var/busy = 0
var/datum/effect/effect/system/confetti_spread
var/confetti_strength = 8
/obj/structure/wheel_of_fortune/verb/setinterval()
set name = "Change interval"
set category = "Object"
set src in view(1)
if(usr.incapacitated())
return
if(ishuman(usr) || istype(usr, /mob/living/silicon/robot))
interval = input("Put the desired interval (1-100)", "Set Interval") as num
if(interval>100 || interval<1)
usr << "<span class='notice'>Invalid interval.</span>"
return
usr << "<span class='notice'>You set the interval to [interval]</span>"
return
/obj/structure/wheel_of_fortune/attack_hand(mob/user as mob)
if (busy)
to_chat(user,"<span class='notice'>The wheel of fortune is already spinning!</span> ")
return
visible_message("<span class='notice'>\ [user] spins the wheel of fortune!</span>")
busy = 1
icon_state = "wheel_of_fortune_spinning"
var/result = rand(1,interval)
add_fingerprint(user)
spawn(5 SECONDS)
visible_message("<span class='notice'>The wheel of fortune stops spinning, the number is [result]!</span>")
src.confetti_spread = new /datum/effect/effect/system/confetti_spread()
src.confetti_spread.attach(src) //If somehow people start dragging slot machine
spawn(0)
for(var/i = 1 to confetti_strength)
src.confetti_spread.start()
sleep(10)
busy=0
icon_state = "wheel_of_fortune"
/obj/structure/stripper_pole
name = "stripper pole"
icon = 'icons/obj/casino_ch.dmi'
@@ -1009,3 +958,186 @@
spawn_money(round(I:worth/2.5), src.loc)
src.attack_hand(user)
qdel(I)
/obj/machinery/wheel_of_fortune
name = "wheel of fortune"
desc = "The Wheel of Fortune! Insert chips and may fortune favour the lucky one at the next lottery!"
icon = 'icons/obj/64x64_ch.dmi'
icon_state = "wheel_of_fortune"
density = 1
anchored = 1
pixel_x = -16
req_access = list(300)
var/interval = 1
var/busy = 0
var/public_spin = 0
var/lottery_sale = "disabled"
var/lottery_price = 100
var/lottery_entries = 0
var/lottery_tickets = list()
var/lottery_tickets_ckeys = list()
var/datum/effect/effect/system/confetti_spread
var/confetti_strength = 15
/obj/machinery/wheel_of_fortune/attack_hand(mob/user as mob)
if (busy)
to_chat(user,"<span class='notice'>The wheel of fortune is already spinning!</span> ")
return
if(usr.incapacitated())
return
if(ishuman(usr) || istype(usr, /mob/living/silicon/robot))
switch(input(user,"Choose what to do","Wheel Of Fortune") in list("Spin the Wheel! (Not Lottery)", "Set the interval", "Cancel"))
if("Cancel")
return
if("Spin the Wheel! (Not Lottery)")
if(public_spin == 0)
to_chat(user,"<span class='notice'>The Wheel makes a sad beep, public spins are not enabled right now..</span> ")
return
else
to_chat(user,"<span class='notice'>You spin the wheel!</span> ")
spin_the_wheel("not_lottery")
if("Set the interval")
setinterval()
/obj/machinery/wheel_of_fortune/attackby(obj/item/weapon/W as obj, mob/user as mob)
if (busy)
to_chat(user,"<span class='notice'>The wheel of fortune is already spinning!</span> ")
return
if(usr.incapacitated())
return
if(istype(W, /obj/item/weapon/card/id)||istype(W, /obj/item/device/pda))
if(!check_access(W))
to_chat(user, "<span class='warning'>Access Denied.</span>")
return
else
to_chat(user, "<span class='warning'>Proper access, allowed staff controls.</span>")
if(ishuman(usr) || istype(usr, /mob/living/silicon/robot))
switch(input(user,"Choose what to do (Management)","Wheel Of Fortune (Management)") in list("Spin the Lottery Wheel!", "Toggle Lottery Sales", "Toggle Public Spins", "Reset Lottery", "Cancel"))
if("Cancel")
return
if("Spin the Lottery Wheel!")
to_chat(user,"<span class='notice'>You spin the wheel for the lottery!</span> ")
spin_the_wheel("lottery")
if("Toggle Lottery Sales")
if(lottery_sale == "disabled")
lottery_sale = "enabled"
to_chat(user,"<span class='notice'>Public Lottery sale has been enabled.</span> ")
else
lottery_sale = "disabled"
to_chat(user,"<span class='notice'>Public Lottery sale has been disabled.</span> ")
if("Toggle Public Spins")
if(public_spin == 0)
public_spin = 1
to_chat(user,"<span class='notice'>Public spins has been enabled.</span> ")
else
public_spin = 0
to_chat(user,"<span class='notice'>Public spins has been disabled.</span> ")
if("Reset Lottery")
var/confirm = tgui_alert(usr, "Are you sure you want to reset Lottery?", "Confirm Lottery Reset", list("Yes", "No"))
if(confirm == "Yes")
to_chat(user, "<span class='warning'>Lottery has been Reset!</span>")
lottery_entries = 0
lottery_tickets = list()
lottery_tickets_ckeys = list()
if(istype(W, /obj/item/weapon/spacecasinocash))
if(lottery_sale == "disabled")
to_chat(user, "<span class='warning'>Lottery sales are currently disabled.</span>")
return
else
if(user.client.ckey in lottery_tickets_ckeys)
to_chat(user, "<span class='warning'>The scanner beeps in an upset manner, you already have a ticket!</span>")
return
var/obj/item/weapon/spacecasinocash/C = W
insert_chip(C, user)
/obj/machinery/wheel_of_fortune/proc/insert_chip(var/obj/item/weapon/spacecasinocash/cashmoney, mob/user)
if (busy)
to_chat(user,"<span class='notice'>The Wheel of Fortune is busy, wait for it to be done to buy a lottery ticket.</span> ")
return
if(cashmoney.worth < lottery_price)
to_chat(user,"<span class='notice'>You dont have enough chips to buy a lottery ticket!</span> ")
return
to_chat(user,"<span class='notice'>You put [lottery_price] credits worth of chips into the Wheel of Fortune and it pings to notify of your lottery ticket registered!</span>")
cashmoney.worth -= lottery_price
cashmoney.update_icon()
if(cashmoney.worth <= 0)
usr.drop_from_inventory(cashmoney)
qdel(cashmoney)
cashmoney.update_icon()
lottery_entries++
lottery_tickets += "Number.[lottery_entries] [user.name]"
lottery_tickets_ckeys += user.client.ckey
/obj/machinery/wheel_of_fortune/proc/spin_the_wheel(var/mode)
var/result = 0
if(mode == "not_lottery")
busy = 1
icon_state = "wheel_of_fortune_spinning"
result = rand(1,interval)
spawn(5 SECONDS)
visible_message("<span class='notice'>The wheel of fortune stops spinning, the number is [result]!</span>")
src.confetti_spread = new /datum/effect/effect/system/confetti_spread()
src.confetti_spread.attach(src) //If somehow people start dragging slot machine
spawn(0)
for(var/i = 1 to confetti_strength)
src.confetti_spread.start()
sleep(10)
flick("[icon_state]-winning",src)
busy = 0
icon_state = "wheel_of_fortune"
if(mode == "lottery")
if(lottery_entries == 0)
visible_message("<span class='notice'>There are no tickets in the system!</span>")
return
busy = 1
icon_state = "wheel_of_fortune_spinning"
result = pick(lottery_tickets)
spawn(5 SECONDS)
visible_message("<span class='notice'>The wheel of fortune stops spinning, and the winner is [result]!</span>")
src.confetti_spread = new /datum/effect/effect/system/confetti_spread()
src.confetti_spread.attach(src) //If somehow people start dragging slot machine
spawn(0)
for(var/i = 1 to confetti_strength)
src.confetti_spread.start()
sleep(10)
flick("[icon_state]-winning",src)
busy = 0
icon_state = "wheel_of_fortune"
/obj/machinery/wheel_of_fortune/verb/setinterval()
set name = "Change interval"
set category = "Object"
set src in view(1)
if(usr.incapacitated())
return
if(ishuman(usr) || istype(usr, /mob/living/silicon/robot))
interval = input("Put the desired interval (1-1000)", "Set Interval") as num
if(interval>1000 || interval<1)
usr << "<span class='notice'>Invalid interval.</span>"
return
usr << "<span class='notice'>You set the interval to [interval]</span>"
return
+62 -8
View File
@@ -13,12 +13,13 @@
var/list/network = list()
var/datum/tgui_module/camera/camera
var/camera_datum_type = /datum/tgui_module/camera
/obj/machinery/computer/security/Initialize()
. = ..()
if(!LAZYLEN(network))
network = get_default_networks()
camera = new(src, network)
camera = new camera_datum_type(src, network)
/obj/machinery/computer/security/proc/get_default_networks()
. = using_map.station_networks.Copy()
@@ -67,19 +68,41 @@
density = 0
circuit = null
GLOBAL_LIST_EMPTY(entertainment_screens)
/obj/machinery/computer/security/telescreen/entertainment
name = "entertainment monitor"
desc = "Damn, why do they never have anything interesting on these things?"
icon = 'icons/obj/status_display.dmi'
icon_screen = "entertainment"
icon = 'icons/obj/entertainment_monitor.dmi'
icon_state = "screen"
icon_screen = null
light_color = "#FFEEDB"
light_range_on = 2
network = list(NETWORK_THUNDER)
circuit = /obj/item/weapon/circuitboard/security/telescreen/entertainment
camera_datum_type = /datum/tgui_module/camera/bigscreen
var/obj/item/device/radio/radio = null
var/obj/effect/overlay/vis/pinboard
var/weakref/showing
/obj/machinery/computer/security/telescreen/entertainment/Initialize()
GLOB.entertainment_screens += src
var/static/icon/mask = icon('icons/obj/entertainment_monitor.dmi', "mask")
add_overlay("glass")
pinboard = new()
pinboard.icon = icon
pinboard.icon_state = "pinboard"
pinboard.layer = 0.1
pinboard.vis_flags = VIS_UNDERLAY|VIS_INHERIT_ID|VIS_INHERIT_PLANE
pinboard.appearance_flags = KEEP_TOGETHER
pinboard.add_filter("screen cutter", 1, alpha_mask_filter(icon = mask))
vis_contents += pinboard
. = ..()
radio = new(src)
radio.listening = TRUE
radio.broadcasting = FALSE
@@ -87,13 +110,44 @@
radio.canhear_range = 7 // Same as default sight range.
power_change()
/obj/machinery/computer/security/telescreen/entertainment/Destroy()
if(showing)
stop_showing()
vis_contents.Cut()
qdel_null(pinboard)
qdel_null(radio)
return ..()
/obj/machinery/computer/security/telescreen/entertainment/Click(location, control, params)
attack_hand(usr)
/obj/machinery/computer/security/telescreen/entertainment/update_icon()
return // NUH
/obj/machinery/computer/security/telescreen/entertainment/proc/show_thing(atom/thing)
if(showing)
stop_showing()
if(stat & NOPOWER)
return
showing = weakref(thing)
pinboard.vis_contents = list(thing)
/obj/machinery/computer/security/telescreen/entertainment/proc/stop_showing()
// Reverse of the above
pinboard.vis_contents = null
showing = null
/obj/machinery/computer/security/telescreen/entertainment/proc/maybe_stop_showing(weakref/thingref)
if(showing == thingref)
stop_showing()
/obj/machinery/computer/security/telescreen/entertainment/power_change()
..()
if(radio)
if(stat & NOPOWER)
radio.on = FALSE
else
radio.on = TRUE
if(stat & NOPOWER)
radio?.on = FALSE
stop_showing()
else
radio?.on = TRUE
/obj/machinery/computer/security/wooden_tv
name = "security camera monitor"
+13
View File
@@ -491,6 +491,19 @@
for(var/datum/data/record/G in data_core.general)
if((G.fields["name"] == to_despawn.real_name))
qdel(G)
// Also check the hidden version of each datacore, if they're an offmap role.
var/datum/job/J = SSjob.get_job(job)
if(J?.offmap_spawn)
for(var/datum/data/record/R in data_core.hidden_general)
if((R.fields["name"] == to_despawn.real_name))
qdel(R)
for(var/datum/data/record/T in data_core.hidden_security)
if((T.fields["name"] == to_despawn.real_name))
qdel(T)
for(var/datum/data/record/G in data_core.hidden_medical)
if((G.fields["name"] == to_despawn.real_name))
qdel(G)
icon_state = base_icon_state
+25 -6
View File
@@ -80,15 +80,16 @@ var/list/dispenser_presets = list()
var/spawned = list()
voidsuit = new voidsuit_type(T)
spawned += voidsuit
spawned += voidsuit // We only add the voidsuit so the game doesn't try to put the tank/helmet/boots etc into their hands
// If we're supposed to make a helmet
if(voidhelmet_type)
// The coder may not have realized this type spawns its own helmet
if(voidsuit.helmet)
error("[src] created a voidsuit [voidsuit] and wants to add a helmet but it already has one")
else
voidsuit.attach_helmet(new voidhelmet_type())
spawned += voidhelmet
voidhelmet = new voidhelmet_type()
voidsuit.attach_helmet(voidhelmet)
// If we're supposed to make boots
if(magboots_type)
// The coder may not have realized thist ype spawns its own boots
@@ -97,7 +98,6 @@ var/list/dispenser_presets = list()
else
magboots = new magboots_type(voidsuit)
voidsuit.boots = magboots
spawned += magboots
if(refit)
voidsuit.refit_for_species(user.species?.get_bodytype()) // does helmet and boots if they're attached
@@ -109,7 +109,6 @@ var/list/dispenser_presets = list()
else
var/obj/item/life_support = new /obj/item/device/suit_cooling_unit(voidsuit)
voidsuit.cooler = life_support
spawned += life_support
else if(user.species?.breath_type)
if(voidsuit.tank)
error("[src] created a voidsuit [voidsuit] and wants to add a tank but it already has one")
@@ -121,7 +120,6 @@ var/list/dispenser_presets = list()
if(tankpath)
var/obj/item/life_support = new tankpath(voidsuit)
voidsuit.tank = life_support
spawned += life_support
else
voidsuit.audible_message("Dispenser warning: Unable to locate suitable airtank for user.")
@@ -567,6 +565,27 @@ var/list/dispenser_presets = list()
one_setting = /datum/gear_disp/voidsuit/autolok
special_frame = "frame_grey"
////////////////////////////// MOEBIUS SUIT DISPENSERS ///////////////////////////
/datum/gear_disp/voidsuit/aether
name = "Aether Voidsuit"
voidsuit_type = /obj/item/clothing/suit/space/void/aether
voidhelmet_type = /obj/item/clothing/head/helmet/space/void/aether
refit = FALSE // No animal sprites AAA!
/obj/machinery/gear_dispenser/suit/aether
name = "\improper Aether Voidsuit Dispenser"
desc = "An industrial U-Tak-It Dispenser unit designed to fetch a specific Aether-produced high-end suit."
icon_state = "suitdispenserMB"
dispenser_flags = GD_ONEITEM|GD_NOGREED|GD_UNLIMITED
one_setting = /datum/gear_disp/voidsuit/aether
/obj/machinery/gear_dispenser/suit_fancy/aether
name = "\improper Aether Voidsuit Dispenser"
desc = "A commercial U-Tak-It Dispenser unit designed to fetch a specific Aether-produced high-end suit."
dispenser_flags = GD_ONEITEM|GD_NOGREED|GD_UNLIMITED
one_setting = /datum/gear_disp/voidsuit/aether
special_frame = "frame_purple"
// Adminbuse
/obj/machinery/gear_dispenser/vv_get_dropdown()
. = ..()
@@ -8,6 +8,8 @@
var/channel = "NCS Northern Star News Feed"
var/obj/machinery/camera/network/thunder/camera
var/obj/item/device/radio/radio
var/weakref/showing
var/showing_name
/obj/item/device/tvcamera/New()
..()
@@ -45,9 +47,14 @@
/obj/item/device/tvcamera/attack_self(mob/user)
add_fingerprint(user)
user.set_machine(src)
show_ui(user)
/obj/item/device/tvcamera/proc/show_ui(mob/user)
var/dat = list()
dat += "Channel name is: <a href='?src=\ref[src];channel=1'>[channel ? channel : "unidentified broadcast"]</a><br>"
dat += "Video streaming is <a href='?src=\ref[src];video=1'>[camera.status ? "on" : "off"]</a><br>"
if(camera.status && showing_name)
dat += "- You're showing [showing_name] to your viewers.<br>"
dat += "Mic is <a href='?src=\ref[src];sound=1'>[radio.broadcasting ? "on" : "off"]</a><br>"
dat += "Sound is being broadcasted on frequency [format_frequency(radio.frequency)] ([get_frequency_name(radio.frequency)])<br>"
var/datum/browser/popup = new(user, "Hovercamera", "Eye Buddy", 300, 390, src)
@@ -67,8 +74,12 @@
camera.set_status(!camera.status)
if(camera.status)
to_chat(usr,"<span class='notice'>Video streaming activated. Broadcasting on channel '[channel]'</span>")
show_tvs(loc)
else
to_chat(usr,"<span class='notice'>Video streaming deactivated.</span>")
hide_tvs()
for(var/obj/machinery/computer/security/telescreen/entertainment/ES as anything in GLOB.entertainment_screens)
ES.stop_showing()
update_icon()
if(href_list["sound"])
radio.ToggleBroadcast()
@@ -79,6 +90,50 @@
if(!href_list["close"])
attack_self(usr)
/obj/item/device/tvcamera/proc/show_tvs(atom/thing)
if(showing)
hide_tvs(showing)
showing = weakref(thing)
showing_name = "[thing]"
for(var/obj/machinery/computer/security/telescreen/entertainment/ES as anything in GLOB.entertainment_screens)
ES.show_thing(thing)
START_PROCESSING(SSobj, src)
/obj/item/device/tvcamera/proc/hide_tvs()
if(!showing)
return
for(var/obj/machinery/computer/security/telescreen/entertainment/ES as anything in GLOB.entertainment_screens)
ES.maybe_stop_showing(showing)
STOP_PROCESSING(SSobj, src)
showing = null
showing_name = null
/obj/item/device/tvcamera/Moved(atom/old_loc, direction, forced = FALSE, movetime)
. = ..()
if(camera.status && loc != old_loc)
show_tvs(loc)
/obj/item/device/tvcamera/afterattack(atom/target, mob/user, proximity_flag, click_parameters)
. = ..()
if(camera.status && !isturf(target))
show_tvs(target)
user.visible_message("<b>[user]</b> aims [src] at [target].", "You aim [src] at [target].")
if(user.machine == src)
show_ui(user) // refresh the UI
/obj/item/device/tvcamera/process()
if(!showing)
return PROCESS_KILL
var/atom/A = showing.resolve()
if(!A || QDELETED(A))
show_tvs(loc)
if(get_dist(get_turf(src), get_turf(A)) > 5)
show_tvs(loc)
/obj/item/device/tvcamera/update_icon()
..()
if(camera.status)
+2 -2
View File
@@ -10,8 +10,8 @@
var/list/climbers
var/block_turf_edges = FALSE // If true, turf edge icons will not be made on the turf this occupies.
var/list/connections = list("0", "0", "0", "0")
var/list/other_connections = list("0", "0", "0", "0")
var/list/connections
var/list/other_connections
var/list/blend_objects = newlist() // Objects which to blend with
var/list/noblend_objects = newlist() //Objects to avoid blending with (such as children of listed blend objects.
+2 -1
View File
@@ -144,7 +144,8 @@
var/image/I
for(var/i = 1 to 4)
I = image('icons/obj/sandbags.dmi', "sandbags[connections[i]]", dir = 1<<(i-1))
var/connect = connections?[i] || 0
I = image('icons/obj/sandbags.dmi', "sandbags[connect]", dir = 1<<(i-1))
I.color = material.icon_colour
add_overlay(I)
+2 -1
View File
@@ -51,7 +51,8 @@
var/image/I
if(!hatch_open)
for(var/i = 1 to 4)
I = image(icon, "catwalk[connections[i]]", dir = 1<<(i-1))
var/connect = connections?[i] || 0
I = image(icon, "catwalk[connect]", dir = 1<<(i-1))
add_overlay(I)
if(plating_color)
I = image(icon, "plated")
@@ -33,6 +33,7 @@
/obj/item/clothing/under/rank/nurse,
/obj/item/clothing/under/rank/orderly,
/obj/item/clothing/suit/storage/toggle/labcoat,
/obj/item/clothing/suit/storage/toggle/labcoat/modern,
/obj/item/clothing/suit/storage/toggle/fr_jacket,
/obj/item/clothing/shoes/white,
/obj/item/weapon/cartridge/medical,
@@ -127,6 +128,7 @@
/obj/item/clothing/under/rank/chief_medical_officer/skirt,
/obj/item/clothing/suit/storage/toggle/labcoat/cmo,
/obj/item/clothing/suit/storage/toggle/labcoat/cmoalt,
/obj/item/clothing/suit/storage/toggle/labcoat/modern/cmo,
/obj/item/weapon/cartridge/cmo,
/obj/item/clothing/gloves/sterile/latex,
/obj/item/clothing/shoes/brown,
@@ -33,6 +33,7 @@
/obj/item/clothing/under/rank/research_director/rdalt,
/obj/item/clothing/under/rank/research_director/dress_rd,
/obj/item/clothing/suit/storage/toggle/labcoat,
/obj/item/clothing/suit/storage/toggle/labcoat/modern,
/obj/item/weapon/cartridge/rd,
/obj/item/clothing/shoes/white,
/obj/item/clothing/shoes/laceup/brown,
@@ -54,6 +55,7 @@
starts_with = list(
/obj/item/clothing/under/rank/scientist,
/obj/item/clothing/suit/storage/toggle/labcoat,
/obj/item/clothing/suit/storage/toggle/labcoat/modern,
/obj/item/clothing/shoes/white,
/obj/item/weapon/melee/umbrella, // vorestation addition,
/obj/item/clothing/glasses/science,
@@ -220,6 +220,7 @@
/obj/item/clothing/under/rank/scientist/skirt = 2,
/obj/item/clothing/under/rank/scientist/turtleneck = 3,
/obj/item/clothing/suit/storage/toggle/labcoat = 3,
/obj/item/clothing/suit/storage/toggle/labcoat/modern = 3,
/obj/item/clothing/shoes/white = 3,
/obj/item/clothing/shoes/slippers = 3,
/obj/item/clothing/suit/storage/hooded/wintercoat/science,
@@ -10,7 +10,7 @@
mod_list(target, null, "list", "contents", target_index, autodetect_class = FALSE)
if(href_list[VV_HK_LIST_REMOVE])
var/variable = target[target_index]
var/prompt = tgui_alert(usr, "Do you want to remove item number [target_index] from list?", "Confirm", "Yes", "No")
var/prompt = tgui_alert(usr, "Do you want to remove item number [target_index] from list?", "Confirm", list("Yes", "No"))
if (prompt != "Yes")
return
target.Cut(target_index, target_index+1)
+1 -1
View File
@@ -1402,7 +1402,7 @@
//////////////////////////////////////////////////////////////////////////////////
// Other
/datum/lore/organization/other/kitsuhana //sorry KHI, but you're not a coherent stellar government, and you're definitely not a TSC. you get to go in the Others pool.
/datum/lore/organization/other/kitsuhana //sorry KHI, but you're not a coherent stellar government, and you're definitely not a TSC. you get to go in the Others pool. //makes sense to me!
name = "Kitsuhana Heavy Industries"
short_name = "" //whitespace haaaack
desc = "A large post-scarcity amalgamation of races, Kitsuhana is no longer a company but rather a loose association of 'members' \
@@ -135,43 +135,39 @@
gear_tweaks += new/datum/gear_tweak/path(sortAssoc(hoodies))
/datum/gear/suit/labcoat
display_name = "labcoat"
display_name = "labcoat selection, public"
path = /obj/item/clothing/suit/storage/toggle/labcoat
/datum/gear/suit/labcoat/blue
display_name = "labcoat, blue"
path = /obj/item/clothing/suit/storage/toggle/labcoat/blue
/datum/gear/suit/labcoat/New()
..()
var/list/labcoats = list(
"White labcoat" = /obj/item/clothing/suit/storage/toggle/labcoat,
"Blue-edge labcoat" = /obj/item/clothing/suit/storage/toggle/labcoat/blue_edge,
"Green labcoat" = /obj/item/clothing/suit/storage/toggle/labcoat/green,
"Orange labcoat" = /obj/item/clothing/suit/storage/toggle/labcoat/orange,
"Purple labcoat" = /obj/item/clothing/suit/storage/toggle/labcoat/purple,
"Pink labcoat" = /obj/item/clothing/suit/storage/toggle/labcoat/pink,
"Red labcoat" = /obj/item/clothing/suit/storage/toggle/labcoat/red,
"Yellow labcoat" = /obj/item/clothing/suit/storage/toggle/labcoat/yellow
)
gear_tweaks += new/datum/gear_tweak/path(labcoats)
/datum/gear/suit/labcoat/blue_edge
display_name = "labcoat, blue-edged"
path = /obj/item/clothing/suit/storage/toggle/labcoat/blue_edge
/datum/gear/suit/labcoat_cmo
display_name = "labcoat selection, cmo"
path = /obj/item/clothing/suit/storage/toggle/labcoat/cmo
allowed_roles = list("Chief Medical Officer")
/datum/gear/suit/labcoat/green
display_name = "labcoat, green"
path = /obj/item/clothing/suit/storage/toggle/labcoat/green
/datum/gear/suit/labcoat/orange
display_name = "labcoat, orange"
path = /obj/item/clothing/suit/storage/toggle/labcoat/orange
/datum/gear/suit/labcoat/purple
display_name = "labcoat, purple"
path = /obj/item/clothing/suit/storage/toggle/labcoat/purple
/datum/gear/suit/labcoat/pink
display_name = "labcoat, pink"
path = /obj/item/clothing/suit/storage/toggle/labcoat/pink
/datum/gear/suit/labcoat/red
display_name = "labcoat, red"
path = /obj/item/clothing/suit/storage/toggle/labcoat/red
/datum/gear/suit/labcoat/yellow
display_name = "labcoat, yellow"
path = /obj/item/clothing/suit/storage/toggle/labcoat/yellow
/datum/gear/suit/labcoat_cmo/New()
..()
var/list/labcoats = list(
"CMO labcoat" = /obj/item/clothing/suit/storage/toggle/labcoat/cmo,
"CMO labcoat (alt)" = /obj/item/clothing/suit/storage/toggle/labcoat/cmoalt,
"CMO labcoat (modern)" = /obj/item/clothing/suit/storage/toggle/labcoat/modern/cmo
)
gear_tweaks += new/datum/gear_tweak/path(labcoats)
/datum/gear/suit/labcoat/emt
display_name = "labcoat, EMT (Medical)"
display_name = "labcoat, EMT"
path = /obj/item/clothing/suit/storage/toggle/labcoat/emt
allowed_roles = list("Medical Doctor","Chief Medical Officer","Chemist","Paramedic","Geneticist", "Psychiatrist")
@@ -189,6 +185,11 @@
path = /obj/item/clothing/suit/storage/apron/overalls
cost = 1
/datum/gear/suit/cyberpunk
display_name = "cyberpunk jacket"
path = /obj/item/clothing/suit/cyberpunk
cost = 2
/datum/gear/suit/poncho
display_name = "poncho selection"
path = /obj/item/clothing/accessory/poncho
@@ -203,96 +204,77 @@
gear_tweaks += new/datum/gear_tweak/path(sortAssoc(ponchos))
/datum/gear/suit/roles/poncho
display_name = "poncho, cargo"
display_name = "poncho selection, departments"
path = /obj/item/clothing/accessory/poncho/roles/cargo
cost = 1
/datum/gear/suit/roles/poncho/security
display_name = "poncho, security"
path = /obj/item/clothing/accessory/poncho/roles/security
/datum/gear/suit/roles/poncho/New()
..()
var/list/ponchos = list(
"Cargo poncho" = /obj/item/clothing/accessory/poncho/roles/cargo,
"Security poncho" = /obj/item/clothing/accessory/poncho/roles/security,
"Medical poncho" = /obj/item/clothing/accessory/poncho/roles/medical,
"Engineering poncho" = /obj/item/clothing/accessory/poncho/roles/engineering,
"Science poncho" = /obj/item/clothing/accessory/poncho/roles/science
)
gear_tweaks += new/datum/gear_tweak/path(ponchos)
/datum/gear/suit/roles/poncho/medical
display_name = "poncho, medical"
path = /obj/item/clothing/accessory/poncho/roles/medical
/datum/gear/suit/roles/poncho/engineering
display_name = "poncho, engineering"
path = /obj/item/clothing/accessory/poncho/roles/engineering
/datum/gear/suit/roles/cloak
display_name = "cloak selection, departments"
path = /obj/item/clothing/accessory/poncho/roles/cloak/cargo
/datum/gear/suit/roles/poncho/science
display_name = "poncho, science"
path = /obj/item/clothing/accessory/poncho/roles/science
/datum/gear/suit/roles/cloak/New()
..()
var/list/cloaks = list(
"Cargo cloak" = /obj/item/clothing/accessory/poncho/roles/cloak/cargo,
"Mining cloak" = /obj/item/clothing/accessory/poncho/roles/cloak/mining,
"Security cloak" = /obj/item/clothing/accessory/poncho/roles/cloak/security,
"Service cloak" = /obj/item/clothing/accessory/poncho/roles/cloak/service,
"Engineer cloak" = /obj/item/clothing/accessory/poncho/roles/cloak/engineer,
"Atmos cloak" = /obj/item/clothing/accessory/poncho/roles/cloak/atmos,
"Research cloak" = /obj/item/clothing/accessory/poncho/roles/cloak/research,
"Medical cloak" = /obj/item/clothing/accessory/poncho/roles/cloak/medical
)
gear_tweaks += new/datum/gear_tweak/path(cloaks)
/datum/gear/suit/roles/poncho/cloak/hos
/datum/gear/suit/roles/poncho/cloak_hos
display_name = "cloak, head of security"
path = /obj/item/clothing/accessory/poncho/roles/cloak/hos
allowed_roles = list("Head of Security")
/datum/gear/suit/roles/poncho/cloak/cmo
/datum/gear/suit/roles/poncho/cloak_cmo
display_name = "cloak, chief medical officer"
path = /obj/item/clothing/accessory/poncho/roles/cloak/cmo
allowed_roles = list("Chief Medical Officer")
/datum/gear/suit/roles/poncho/cloak/ce
/datum/gear/suit/roles/poncho/cloak_ce
display_name = "cloak, chief engineer"
path = /obj/item/clothing/accessory/poncho/roles/cloak/ce
allowed_roles = list("Chief Engineer")
/datum/gear/suit/roles/poncho/cloak/rd
/datum/gear/suit/roles/poncho/cloak_rd
display_name = "cloak, research director"
path = /obj/item/clothing/accessory/poncho/roles/cloak/rd
allowed_roles = list("Research Director")
/datum/gear/suit/roles/poncho/cloak/qm
/datum/gear/suit/roles/poncho/cloak_qm
display_name = "cloak, quartermaster"
path = /obj/item/clothing/accessory/poncho/roles/cloak/qm
allowed_roles = list("Quartermaster")
/datum/gear/suit/roles/poncho/cloak/captain
/datum/gear/suit/roles/poncho/cloak_captain
display_name = "cloak, site manager"
path = /obj/item/clothing/accessory/poncho/roles/cloak/captain
allowed_roles = list("Site Manager")
/datum/gear/suit/roles/poncho/cloak/hop
/datum/gear/suit/roles/poncho/cloak_hop
display_name = "cloak, head of personnel"
path = /obj/item/clothing/accessory/poncho/roles/cloak/hop
allowed_roles = list("Head of Personnel")
/datum/gear/suit/roles/poncho/cloak/cargo
display_name = "cloak, cargo"
path = /obj/item/clothing/accessory/poncho/roles/cloak/cargo
/datum/gear/suit/roles/poncho/cloak/mining
display_name = "cloak, mining"
path = /obj/item/clothing/accessory/poncho/roles/cloak/mining
/datum/gear/suit/roles/poncho/cloak/security
display_name = "cloak, security"
path = /obj/item/clothing/accessory/poncho/roles/cloak/security
allowed_roles = list("Head of Security","Detective","Warden","Security Officer","Blueshield Guard","Security Pilot") //YW ADDITIONS
/datum/gear/suit/roles/poncho/cloak/service
display_name = "cloak, service"
path = /obj/item/clothing/accessory/poncho/roles/cloak/service
/datum/gear/suit/roles/poncho/cloak/engineer
display_name = "cloak, engineer"
path = /obj/item/clothing/accessory/poncho/roles/cloak/engineer
/datum/gear/suit/roles/poncho/cloak/atmos
display_name = "cloak, atmos"
path = /obj/item/clothing/accessory/poncho/roles/cloak/atmos
/datum/gear/suit/roles/poncho/cloak/research
display_name = "cloak, science"
path = /obj/item/clothing/accessory/poncho/roles/cloak/research
/datum/gear/suit/roles/poncho/cloak/medical
display_name = "cloak, medical"
path = /obj/item/clothing/accessory/poncho/roles/cloak/medical
/datum/gear/suit/roles/poncho/cloak/custom //A colorable cloak
display_name = "cloak (colorable)"
/datum/gear/suit/roles/poncho/cloak_custom //A colorable cloak
display_name = "cloak, colorable"
path = /obj/item/clothing/accessory/poncho/roles/cloak/custom
/datum/gear/suit/roles/poncho/cloak/custom/New()
@@ -304,44 +286,51 @@
path = /obj/item/clothing/suit/unathi/robe
cost = 1
/datum/gear/suit/black_lawyer_jacket
display_name = "suit jacket, black"
/datum/gear/suit/lawyer_jackets
display_name = "suit jacket selection"
path = /obj/item/clothing/suit/storage/toggle/internalaffairs
/datum/gear/suit/blue_lawyer_jacket
display_name = "suit jacket, blue"
path = /obj/item/clothing/suit/storage/toggle/lawyer/bluejacket
/datum/gear/suit/purple_lawyer_jacket
display_name = "suit jacket, purple"
path = /obj/item/clothing/suit/storage/toggle/lawyer/purpjacket
/datum/gear/suit/lawyer_jackets/New()
..()
var/list/jackets = list(
"Black suit jacket" = /obj/item/clothing/suit/storage/toggle/internalaffairs,
"Blue suit jacket" = /obj/item/clothing/suit/storage/toggle/lawyer/bluejacket,
"Purple suit jacket" = /obj/item/clothing/suit/storage/toggle/lawyer/purpjacket
)
gear_tweaks += new/datum/gear_tweak/path(jackets)
/datum/gear/suit/suspenders
display_name = "suspenders"
path = /obj/item/clothing/suit/suspenders
/datum/gear/suit/forensics
display_name = "forensics long, red"
display_name = "forensics uniform selection (Detective)"
path = /obj/item/clothing/suit/storage/forensics/red/long
allowed_roles = list("Detective")
/datum/gear/suit/forensics/blue
display_name = "forensics long, blue"
path = /obj/item/clothing/suit/storage/forensics/blue/long
allowed_roles = list("Detective")
/datum/gear/suit/forensics/New()
..()
var/list/uniforms = list(
"Red, long uniform" = /obj/item/clothing/suit/storage/forensics/red/long,
"Blue, long uniform" = /obj/item/clothing/suit/storage/forensics/blue/long,
"Red, short uniform" = /obj/item/clothing/suit/storage/forensics/red,
"Blue, short uniform" = /obj/item/clothing/suit/storage/forensics/blue
)
gear_tweaks += new/datum/gear_tweak/path(uniforms)
/datum/gear/suit/forensics/blue/short
display_name = "forensics, blue"
path = /obj/item/clothing/suit/storage/forensics/blue
allowed_roles = list("Detective")
/datum/gear/suit/qm_coat
display_name = "coat, quartermaster"
path = /obj/item/clothing/suit/storage/qm
allowed_roles = list("Quartermaster")
/datum/gear/suit/forensics/red/short
display_name = "forensics, red"
path = /obj/item/clothing/suit/storage/forensics/red
allowed_roles = list("Detective")
/datum/gear/suit/cargo_coat
display_name = "coat, cargo tech"
path = /obj/item/clothing/suit/storage/cargo
allowed_roles = list("Quartermaster","Shaft Miner","Cargo Technician","Head of Personnel")
/obj/item/clothing/suit/storage/cargo
// winter coats go here
/datum/gear/suit/wintercoat
display_name = "winter coat"
path = /obj/item/clothing/suit/storage/hooded/wintercoat
@@ -406,7 +395,6 @@
path = /obj/item/clothing/suit/storage/hooded/wintercoat/science
allowed_roles = list("Research Director","Scientist", "Roboticist", "Xenobiologist", "Xenobotanist")
/datum/gear/suit/wintercoat/science/robotics
display_name = "winter coat, robotics"
path = /obj/item/clothing/suit/storage/hooded/wintercoat/science/robotics
@@ -477,7 +465,6 @@
/datum/gear/suit/wintercoat/cosmic
display_name = "winter coat, cosmic"
path = /obj/item/clothing/suit/storage/hooded/wintercoat/cosmic
// winter coats end here
/datum/gear/suit/varsity
@@ -505,20 +492,18 @@
gear_tweaks += new/datum/gear_tweak/path(sortAssoc(tracks))
/datum/gear/suit/flannel
display_name = "grey flannel"
display_name = "flannel jacket selection"
path = /obj/item/clothing/suit/storage/flannel
/datum/gear/suit/flannel/red
display_name = "red flannel"
path = /obj/item/clothing/suit/storage/flannel/red
/datum/gear/suit/flannel/aqua
display_name = "aqua flannel"
path = /obj/item/clothing/suit/storage/flannel/aqua
/datum/gear/suit/flannel/brown
display_name = "brown flannel"
path = /obj/item/clothing/suit/storage/flannel/brown
/datum/gear/suit/flannel/New()
..()
var/list/flannel = list(
"Grey flannel" = /obj/item/clothing/suit/storage/flannel,
"Red flannel" = /obj/item/clothing/suit/storage/flannel/red,
"Aqua flannel" = /obj/item/clothing/suit/storage/flannel/aqua,
"Brown flannel" = /obj/item/clothing/suit/storage/flannel/brown
)
gear_tweaks += new/datum/gear_tweak/path(flannel)
/datum/gear/suit/denim_jacket
display_name = "denim jacket"
@@ -544,25 +529,20 @@
..()
gear_tweaks += gear_tweak_free_color_choice
/datum/gear/suit/miscellaneous/sec_dep_jacket
display_name = "department jacket, security"
/datum/gear/suit/miscellaneous/dep_jacket
display_name = "department jacket selection"
path = /obj/item/clothing/suit/storage/toggle/sec_dep_jacket
/datum/gear/suit/miscellaneous/engi_dep_jacket
display_name = "department jacket, engineering"
path = /obj/item/clothing/suit/storage/toggle/engi_dep_jacket
/datum/gear/suit/miscellaneous/supply_dep_jacket
display_name = "department jacket, supply"
path = /obj/item/clothing/suit/storage/toggle/supply_dep_jacket
/datum/gear/suit/miscellaneous/sci_dep_jacket
display_name = "department jacket, science"
path = /obj/item/clothing/suit/storage/toggle/sci_dep_jacket
/datum/gear/suit/miscellaneous/med_dep_jacket
display_name = "department jacket, medical"
path = /obj/item/clothing/suit/storage/toggle/med_dep_jacket
/datum/gear/suit/miscellaneous/dep_jacket/New()
..()
var/list/jacket = list(
"Security department jacket" = /obj/item/clothing/suit/storage/toggle/sec_dep_jacket,
"Engineering department jacket" = /obj/item/clothing/suit/storage/toggle/engi_dep_jacket,
"Cargo department jacket" = /obj/item/clothing/suit/storage/toggle/supply_dep_jacket,
"Science department jacket" = /obj/item/clothing/suit/storage/toggle/sci_dep_jacket,
"Medical department jacket" = /obj/item/clothing/suit/storage/toggle/med_dep_jacket
)
gear_tweaks += new/datum/gear_tweak/path(jacket)
/datum/gear/suit/miscellaneous/peacoat
display_name = "peacoat"
@@ -616,4 +596,4 @@
/datum/gear/suit/miscellaneous/cardigan/New()
..()
gear_tweaks += gear_tweak_free_color_choice
gear_tweaks += gear_tweak_free_color_choice
@@ -31,16 +31,20 @@
path = /obj/item/clothing/suit/poncho
//Detective alternative
/datum/gear/uniform/detective_alt
display_name = "sleek modern coat, detective"
/datum/gear/suit/detective_alt
display_name = "sleek modern coat selection, detective"
path = /obj/item/clothing/suit/storage/det_trench/alt
allowed_roles = list("Head of Security", "Detective")
//Detective alternative
/datum/gear/uniform/detective_alt2
display_name = "sleek modern coat (long), detective"
path = /obj/item/clothing/suit/storage/det_trench/alt2
allowed_roles = list("Head of Security", "Detective")
/datum/gear/suit/detective_alt/New()
..()
var/list/coats = list(
"Modern coat (tan)" = /obj/item/clothing/suit/storage/det_trench/alt,
"Modern coat (long, tan)" = /obj/item/clothing/suit/storage/det_trench/alt2,
"Modern coat (black)" = /obj/item/clothing/suit/storage/det_trench/alt/black,
"Modern coat (long, black)" = /obj/item/clothing/suit/storage/det_trench/alt2/black
)
gear_tweaks += new/datum/gear_tweak/path(coats)
//Emergency Responder jackets for Parameds & EMTs, but also general Medical Staff
/datum/gear/suit/roles/medical/ems_jacket
@@ -235,4 +235,18 @@ Talon jumpsuit
/datum/gear/uniform/talonbasic
display_name = "ITV Jumpsuit"
description = "A jumpsuit that is usually issued to ITV contractors, however others can purchase it to show their support towards ITV."
path = /obj/item/clothing/under/rank/talon/basic
path = /obj/item/clothing/under/rank/talon/basic
// Summer dresses
/datum/gear/uniform/summerdress
display_name = "summer dress selection"
path = /obj/item/clothing/under/summerdress
/datum/gear/uniform/summerdress/New()
..()
var/list/dresses = list(
"black and white" = /obj/item/clothing/under/summerdress,
"blue and white" = /obj/item/clothing/under/summerdress/blue,
"red and white" = /obj/item/clothing/under/summerdress/red
)
gear_tweaks += new/datum/gear_tweak/path(dresses)
+2 -2
View File
@@ -542,7 +542,7 @@
// Generate and cache the on-mob icon, which is used in update_inv_head().
var/body_type = (H && H.species.get_bodytype(H))
var/cache_key = "[light_overlay][body_type && sprite_sheets[body_type] ? "_[body_type]" : ""]"
var/cache_key = "[light_overlay][body_type && sprite_sheets[body_type] ? body_type : ""]"
if(!light_overlay_cache[cache_key])
var/use_icon = LAZYACCESS(sprite_sheets,body_type) || 'icons/mob/light_overlays.dmi'
light_overlay_cache[cache_key] = image(icon = use_icon, icon_state = "[light_overlay]")
@@ -736,7 +736,7 @@
var/fire_resist = T0C+100
body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS|LEGS
allowed = list(/obj/item/weapon/tank/emergency/oxygen)
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0)
slot_flags = SLOT_OCLOTHING
var/blood_overlay_type = "suit"
blood_sprite_state = "suitblood" //Defaults to the suit's blood overlay, so that some blood renders instead of no blood.
@@ -41,6 +41,7 @@
// Icons.
var/suit_overlay
var/suit_overlay_icon = 'icons/mob/rig_modules.dmi'
var/suit_overlay_active // If set, drawn over icon and mob when effect is active.
var/suit_overlay_inactive // As above, inactive.
var/suit_overlay_used // As above, when engaged.
@@ -8,7 +8,6 @@
* /obj/item/rig_module/device/arch_drill
* /obj/item/rig_module/device/anomaly_scanner
* /obj/item/rig_module/maneuvering_jets
* /obj/item/rig_module/foam_sprayer
* /obj/item/rig_module/device/broadcaster
* /obj/item/rig_module/chem_dispenser
* /obj/item/rig_module/chem_dispenser/injector
@@ -411,11 +410,7 @@
jets.holder = null
jets.ion_trail.set_up(jets)
/obj/item/rig_module/foam_sprayer
//Deployable Mop
/obj/item/rig_module/mounted/mop
name = "mop projector"
+23 -19
View File
@@ -7,7 +7,6 @@
*/
/obj/item/weapon/rig
name = "hardsuit control module"
icon = 'icons/obj/rig_modules.dmi'
desc = "A back-mounted hardsuit deployment and control mechanism."
@@ -27,6 +26,8 @@
unacidable = 1
preserve_item = 1
var/default_mob_icon = 'icons/mob/rig_back.dmi'
var/suit_state //The string used for the suit's icon_state.
var/interface_path = "RIGSuit"
@@ -98,22 +99,8 @@
var/datum/effect/effect/system/spark_spread/spark_system
var/datum/mini_hud/rig/minihud
/obj/item/weapon/rig/examine()
. = ..()
if(wearer)
for(var/obj/item/piece in list(helmet,gloves,chest,boots))
if(!piece || piece.loc != wearer)
continue
. += "[bicon(piece)] \The [piece] [piece.gender == PLURAL ? "are" : "is"] deployed."
if(src.loc == usr)
. += "The access panel is [locked? "locked" : "unlocked"]."
. += "The maintenance panel is [open ? "open" : "closed"]."
. += "Hardsuit systems are [offline ? "<span class='warning'>offline</span>" : "<span class='notice'>online</span>"]."
. += "The cooling stystem is [cooling_on ? "active" : "inactive"]."
if(open)
. += "It's equipped with [english_list(installed_modules)]."
// Action button
action_button_name = "Hardsuit Interface"
/obj/item/weapon/rig/New()
..()
@@ -186,6 +173,23 @@
spark_system = null
return ..()
/obj/item/weapon/rig/examine()
. = ..()
if(wearer)
for(var/obj/item/piece in list(helmet,gloves,chest,boots))
if(!piece || piece.loc != wearer)
continue
. += "[bicon(piece)] \The [piece] [piece.gender == PLURAL ? "are" : "is"] deployed."
if(src.loc == usr)
. += "The access panel is [locked? "locked" : "unlocked"]."
. += "The maintenance panel is [open ? "open" : "closed"]."
. += "Hardsuit systems are [offline ? "<span class='warning'>offline</span>" : "<span class='notice'>online</span>"]."
. += "The cooling stystem is [cooling_on ? "active" : "inactive"]."
if(open)
. += "It's equipped with [english_list(installed_modules)]."
// We only care about processing when we're on a mob
/obj/item/weapon/rig/Moved(old_loc, direction, forced)
if(ismob(loc))
@@ -589,7 +593,7 @@
cut_overlays()
if(!mob_icon || update_mob_icon)
var/species_icon = 'icons/mob/rig_back.dmi'
var/species_icon = default_mob_icon
// Since setting mob_icon will override the species checks in
// update_inv_wear_suit(), handle species checks here.
if(wearer && sprite_sheets && sprite_sheets[wearer.species.get_bodytype(wearer)])
@@ -599,7 +603,7 @@
if(installed_modules.len)
for(var/obj/item/rig_module/module in installed_modules)
if(module.suit_overlay)
chest.add_overlay(image('icons/mob/rig_modules.dmi', icon_state = "[module.suit_overlay]", dir = SOUTH))
chest.add_overlay(image(module.suit_overlay_icon, icon_state = "[module.suit_overlay]", dir = SOUTH))
if(wearer)
wearer.update_inv_shoes()
@@ -9,6 +9,11 @@
if(wearer && (wearer.back == src || wearer.belt == src))
tgui_interact(usr)
// So the UI button clicks come here
/obj/item/weapon/rig/ui_action_click()
if(usr == wearer && (wearer.back == src || wearer.belt == src))
tgui_interact(usr)
/obj/item/weapon/rig/verb/toggle_vision()
set name = "Toggle Visor"
@@ -53,3 +53,128 @@
/obj/item/weapon/rig/robotics
allowed = list(/obj/item/device/flashlight, /obj/item/weapon/storage/box, /obj/item/weapon/storage/belt, /obj/item/device/defib_kit/compact)
// 'Technomancer' hardsuit
/obj/item/weapon/rig/focalpoint
name = "\improper F.P.E. hardsuit control module"
desc = "A high-end hardsuit produced by Focal Point Energistics, focused around repair and construction."
icon = 'icons/obj/rig_modules_vr.dmi' // the item
default_mob_icon = 'icons/mob/rig_back_vr.dmi' // the onmob
icon_state = "techno_rig"
suit_type = "\improper F.P.E. hardsuit"
cell_type = /obj/item/weapon/cell/hyper
// Copied from CE rig
slowdown = 0
offline_slowdown = 0
offline_vision_restriction = 0
rigsuit_max_pressure = 20 * ONE_ATMOSPHERE // Max pressure the rig protects against when sealed
rigsuit_min_pressure = 0 // Min pressure the rig protects against when sealed
min_cold_protection_temperature = SPACE_SUIT_MIN_COLD_PROTECTION_TEMPERATURE
max_heat_protection_temperature = FIRESUIT_MAX_HEAT_PROTECTION_TEMPERATURE // so it's like a rig firesuit
armor = list("melee" = 40, "bullet" = 10, "laser" = 30, "energy" = 55, "bomb" = 70, "bio" = 100, "rad" = 100)
chest_type = /obj/item/clothing/suit/space/rig/focalpoint
helm_type = /obj/item/clothing/head/helmet/space/rig/focalpoint
boot_type = /obj/item/clothing/shoes/magboots/rig/focalpoint
glove_type = /obj/item/clothing/gloves/gauntlets/rig/focalpoint
/obj/item/weapon/rig/focalpoint/equipped
initial_modules = list(
/obj/item/rig_module/maneuvering_jets,
/obj/item/rig_module/teleporter, // Try not to set yourself on fire
/obj/item/rig_module/device/rcd,
/obj/item/rig_module/grenade_launcher/metalfoam
)
/obj/item/clothing/head/helmet/space/rig/focalpoint
icon = 'icons/inventory/head/item_vr.dmi'
default_worn_icon = 'icons/inventory/head/mob_vr.dmi'
icon_state = "techno_rig"
// No animal people sprites for these yet, sad times
species_restricted = list("exclude", SPECIES_TESHARI, SPECIES_VOX, SPECIES_DIONA)
sprite_sheets = list()
/obj/item/clothing/suit/space/rig/focalpoint
icon = 'icons/inventory/suit/item_vr.dmi'
default_worn_icon = 'icons/inventory/suit/mob_vr.dmi'
icon_state = "techno_rig"
// No animal people sprites for these yet, sad times
species_restricted = list("exclude", SPECIES_TESHARI, SPECIES_VOX, SPECIES_DIONA)
sprite_sheets = list()
/obj/item/clothing/shoes/magboots/rig/focalpoint
icon = 'icons/inventory/feet/item_vr.dmi'
default_worn_icon = 'icons/inventory/feet/mob_vr.dmi'
icon_state = "techno_rig"
// No animal people sprites for these yet, sad times
species_restricted = list("exclude", SPECIES_TESHARI, SPECIES_VOX, SPECIES_DIONA)
sprite_sheets = list()
/obj/item/clothing/gloves/gauntlets/rig/focalpoint
icon = 'icons/inventory/hands/item_vr.dmi'
default_worn_icon = 'icons/inventory/hands/mob_vr.dmi'
icon_state = "techno_rig"
siemens_coefficient = 0
// No animal people sprites for these yet, sad times
species_restricted = list("exclude", SPECIES_TESHARI, SPECIES_VOX, SPECIES_DIONA)
sprite_sheets = list()
// 'Ironhammer' hardsuit
/obj/item/weapon/rig/hephaestus
name = "\improper Hephaestus hardsuit control module"
desc = "A high-end hardsuit produced by Hephaestus Industries, focused on destroying the competition. Literally."
icon = 'icons/obj/rig_modules_vr.dmi' // the item
default_mob_icon = 'icons/mob/rig_back_vr.dmi' // the onmob
icon_state = "ihs_rig"
suit_type = "\improper Hephaestus hardsuit"
cell_type = /obj/item/weapon/cell/super
armor = list("melee" = 70, "bullet" = 70, "laser" = 70, "energy" = 50, "bomb" = 60, "bio" = 100, "rad" = 20)
chest_type = /obj/item/clothing/suit/space/rig/hephaestus
helm_type = /obj/item/clothing/head/helmet/space/rig/hephaestus
boot_type = /obj/item/clothing/shoes/magboots/rig/hephaestus
glove_type = /obj/item/clothing/gloves/gauntlets/rig/hephaestus
/obj/item/weapon/rig/hephaestus/equipped
initial_modules = list(
/obj/item/rig_module/maneuvering_jets,
/obj/item/rig_module/grenade_launcher,
/obj/item/rig_module/mounted/egun,
/obj/item/rig_module/mounted/energy_blade
)
/obj/item/clothing/head/helmet/space/rig/hephaestus
icon = 'icons/inventory/head/item_vr.dmi'
default_worn_icon = 'icons/inventory/head/mob_vr.dmi'
icon_state = "ihs_rig"
// No animal people sprites for these yet, sad times
species_restricted = list("exclude", SPECIES_TESHARI, SPECIES_VOX, SPECIES_DIONA)
sprite_sheets = list()
/obj/item/clothing/suit/space/rig/hephaestus
icon = 'icons/inventory/suit/item_vr.dmi'
default_worn_icon = 'icons/inventory/suit/mob_vr.dmi'
icon_state = "ihs_rig"
// No animal people sprites for these yet, sad times
species_restricted = list("exclude", SPECIES_TESHARI, SPECIES_VOX, SPECIES_DIONA)
sprite_sheets = list()
/obj/item/clothing/shoes/magboots/rig/hephaestus
icon = 'icons/inventory/feet/item_vr.dmi'
default_worn_icon = 'icons/inventory/feet/mob_vr.dmi'
icon_state = "ihs_rig"
// No animal people sprites for these yet, sad times
species_restricted = list("exclude", SPECIES_TESHARI, SPECIES_VOX, SPECIES_DIONA)
sprite_sheets = list()
/obj/item/clothing/gloves/gauntlets/rig/hephaestus
icon = 'icons/inventory/hands/item_vr.dmi'
default_worn_icon = 'icons/inventory/hands/mob_vr.dmi'
icon_state = "ihs_rig"
// No animal people sprites for these yet, sad times
species_restricted = list("exclude", SPECIES_TESHARI, SPECIES_VOX, SPECIES_DIONA)
sprite_sheets = list()
@@ -73,4 +73,161 @@
/obj/item/clothing/suit/space/void/refurb/mercenary/talon
name = "talon mercenary's voidsuit"
desc = "A refurbished early contact era voidsuit of human design. These things aren't especially good against modern weapons but they're sturdy, incredibly easy to come by, and there are lots of spare parts for repairs. Many old-timer mercs swear by these old things, even if new powered hardsuits have more features and better armor. The red markings indicate this as the mercenary variant. \"ITV TALON\" has been stamped onto each pauldron and the right side of the breastplate."
desc = "A refurbished early contact era voidsuit of human design. These things aren't especially good against modern weapons but they're sturdy, incredibly easy to come by, and there are lots of spare parts for repairs. Many old-timer mercs swear by these old things, even if new powered hardsuits have more features and better armor. The red markings indicate this as the mercenary variant. \"ITV TALON\" has been stamped onto each pauldron and the right side of the breastplate."
// HEV Suits
/obj/item/clothing/suit/space/void/hev
name = "hazardous environment suit"
desc = "Has a strange smell to it, but you feel like it might be an old friend."
icon = 'icons/inventory/suit/item_vr.dmi'
default_worn_icon = 'icons/inventory/suit/mob_vr.dmi'
icon_state = "hev_orange"
// No animal people sprites for these yet, sad times
species_restricted = list("exclude", SPECIES_TESHARI, SPECIES_VOX, SPECIES_DIONA)
sprite_sheets = list()
/obj/item/clothing/suit/space/void/hev/violet
icon_state = "hev_violet"
desc = "Has a strange smell to it, but you feel like it might be an old friend. This one has 'Dr. Coomer' engraved on the collar."
/obj/item/clothing/head/helmet/space/void/hev
name = "hazardous environment helmet"
desc = "Has a strange smell to it, but you feel like it might be an old friend."
icon = 'icons/inventory/head/item_vr.dmi'
default_worn_icon = 'icons/inventory/head/mob_vr.dmi'
icon_state = "hev_orange"
// No animal people sprites for these yet, sad times
species_restricted = list("exclude", SPECIES_TESHARI, SPECIES_VOX, SPECIES_DIONA)
sprite_sheets = list()
/obj/item/clothing/head/helmet/space/void/hev/violet
icon_state = "hev_violet"
desc = "Has a strange smell to it, but you feel like it might be an old friend. This one has 'Dr. Coomer' engraved on the collar."
// Makeshift void suit
/obj/item/clothing/suit/space/void/makeshift
name = "makeshift voidsuit"
desc = "This is not something you should use if you have other options, but it's better than nothing!"
icon = 'icons/inventory/suit/item_vr.dmi'
default_worn_icon = 'icons/inventory/suit/mob_vr.dmi'
icon_state = "makeshift_void"
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 0)
// No animal people sprites for these yet, sad times
species_restricted = list("exclude", SPECIES_TESHARI, SPECIES_VOX, SPECIES_DIONA)
sprite_sheets = list()
/obj/item/clothing/head/helmet/space/void/makeshift
name = "makeshift voidsuit helmet"
desc = "This is not something you should use if you have other options, but it's better than nothing!"
icon = 'icons/inventory/head/item_vr.dmi'
default_worn_icon = 'icons/inventory/head/mob_vr.dmi'
icon_state = "makeshift_void"
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 0)
// No animal people sprites for these yet, sad times
species_restricted = list("exclude", SPECIES_TESHARI, SPECIES_VOX, SPECIES_DIONA)
sprite_sheets = list()
// 'Custodian' armor
/obj/item/clothing/suit/space/void/custodian
name = "custodian suit"
desc = "Vacuum-capable armor for a Custodian to do their duty."
icon = 'icons/inventory/suit/item_vr.dmi'
default_worn_icon = 'icons/inventory/suit/mob_vr.dmi'
icon_state = "custodian"
armor = list("melee" = 70, "bullet" = 70, "laser" = 70, "energy" = 50, "bomb" = 40, "bio" = 0, "rad" = 20)
// No animal people sprites for these yet, sad times
species_restricted = list("exclude", SPECIES_TESHARI, SPECIES_VOX, SPECIES_DIONA)
sprite_sheets = list()
/obj/item/clothing/head/helmet/space/void/custodian
name = "custodian helmet"
desc = "Vacuum-capable helmet for a Custodian to do their duty."
icon = 'icons/inventory/head/item_vr.dmi'
default_worn_icon = 'icons/inventory/head/mob_vr.dmi'
icon_state = "custodian"
armor = list("melee" = 70, "bullet" = 70, "laser" = 70, "energy" = 50, "bomb" = 40, "bio" = 0, "rad" = 20)
// No animal people sprites for these yet, sad times
species_restricted = list("exclude", SPECIES_TESHARI, SPECIES_VOX, SPECIES_DIONA)
sprite_sheets = list()
// 'Moebius' armor
/obj/item/clothing/suit/space/void/aether
name = "\improper Aether voidsuit"
desc = "This suit seems rather high-end for a standard voidsuit. The air in it has a hint of 'new car smell', courtesy of Aether Atmospherics."
icon = 'icons/inventory/suit/item_vr.dmi'
default_worn_icon = 'icons/inventory/suit/mob_vr.dmi'
icon_state = "moebiussuit"
armor = list("melee" = 30, "bullet" = 30, "laser" = 30, "energy" = 20, "bomb" = 20, "bio" = 100, "rad" = 20)
// No animal people sprites for these yet, sad times
species_restricted = list("exclude", SPECIES_TESHARI, SPECIES_VOX, SPECIES_DIONA)
sprite_sheets = list()
/obj/item/clothing/head/helmet/space/void/aether
name = "\improper Aether voidsuit helmet"
desc = "Aether Atmospherics thought that giving this helmet selectable colored lighting would improve market penetration. Very comfortable, regardless."
icon = 'icons/inventory/head/item_vr.dmi'
default_worn_icon = 'icons/inventory/head/mob_vr.dmi'
icon_state = "moebiushelm_White"
armor = list("melee" = 30, "bullet" = 30, "laser" = 30, "energy" = 20, "bomb" = 20, "bio" = 100, "rad" = 20)
// No animal people sprites for these yet, sad times
species_restricted = list("exclude", SPECIES_TESHARI, SPECIES_VOX, SPECIES_DIONA)
sprite_sheets = list()
/obj/item/clothing/head/helmet/space/void/aether/verb/select_color()
set name = "Helmet Color"
set desc = "Change the color of [src]"
set category = "Object"
var/choice = tgui_input_list(usr, "Select a new color:", "[src] Color", list("White", "Blue", "Purple", "Yellow", "Red", "Green"))
if(!choice)
return
icon_state = "moebiushelm_[choice]"
update_clothing_icon()
to_chat(usr, "<span class='notice'>[src] color changed to: [choice]</span>")
// Excelsior suit
/obj/item/clothing/suit/space/void/excelsior
name = "\improper Excelsior voidsuit"
desc = "A space suit from a particular spaceship: Excelsior."
icon = 'icons/inventory/suit/item_vr.dmi'
default_worn_icon = 'icons/inventory/suit/mob_vr.dmi'
icon_state = "excelsior"
// No animal people sprites for these yet, sad times
species_restricted = list("exclude", SPECIES_TESHARI, SPECIES_VOX, SPECIES_DIONA)
sprite_sheets = list()
/obj/item/clothing/head/helmet/space/void/excelsior
name = "\improper Excelsior voidsuit helmet"
desc = "A space helmet from a particular spaceship: Excelsior."
icon = 'icons/inventory/head/item_vr.dmi'
default_worn_icon = 'icons/inventory/head/mob_vr.dmi'
icon_state = "excelsior"
// No animal people sprites for these yet, sad times
species_restricted = list("exclude", SPECIES_TESHARI, SPECIES_VOX, SPECIES_DIONA)
sprite_sheets = list()
+21
View File
@@ -118,3 +118,24 @@
/obj/item/clothing/suit/armor/pcarrier/explorer/deluxe
name = "modular explorer suit"
desc = "A modification of the explorer suit with a modular armor system. Requires you to insert armor plates."
// 'Crusader' armor
/obj/item/clothing/suit/armor/crusader
name = "crusader armor"
desc = "God will protect those who defend his faith."
armor = list("melee" = 50, "bullet" = 50, "laser" = 50, "energy" = 25, "bomb" = 30, "bio" = 0, "rad" = 0)
icon = 'icons/inventory/suit/item_vr.dmi'
default_worn_icon = 'icons/inventory/suit/mob_vr.dmi'
icon_state = "crusader_suit"
/obj/item/clothing/head/helmet/crusader
name = "crusader helmet"
desc = "God will protect those who defend his faith."
armor = list("melee" = 50, "bullet" = 50, "laser" = 50, "energy" = 25, "bomb" = 30, "bio" = 0, "rad" = 0)
icon = 'icons/inventory/head/item_vr.dmi'
default_worn_icon = 'icons/inventory/head/mob_vr.dmi'
icon_state = "crusader_head"
+18
View File
@@ -0,0 +1,18 @@
// Cargotech jacket
/obj/item/clothing/suit/storage/cargo
name = "cargo jacket"
desc = "A jacket typically assigned to cargo technicians when it's chilly in cargonia."
icon = 'icons/inventory/suit/item_vr.dmi'
default_worn_icon = 'icons/inventory/suit/mob_vr.dmi'
icon_state = "cargo_jacket"
// QM Coat
/obj/item/clothing/suit/storage/qm
name = "\improper QM coat"
desc = "A coat typically assigned to quartermasters when it's chilly in cargonia."
icon = 'icons/inventory/suit/item_vr.dmi'
default_worn_icon = 'icons/inventory/suit/mob_vr.dmi'
icon_state = "qm_coat"
+27
View File
@@ -0,0 +1,27 @@
// 'Modern' labcoats
/obj/item/clothing/suit/storage/toggle/labcoat/modern
name = "modern labcoat"
icon = 'icons/inventory/suit/item_vr.dmi'
default_worn_icon = 'icons/inventory/suit/mob_vr.dmi'
icon_state = "labcoat_mod"
/obj/item/clothing/suit/storage/toggle/labcoat/modern/cmo
name = "modern cmo's labcoat"
desc = "A suit that protects against minor chemical spills. This one has distinct markings on the arms."
icon_state = "labcoat_cmo_mod"
// 'Modern' biosuits
/obj/item/clothing/suit/bio_suit/modern
name = "modern bio suit"
icon = 'icons/inventory/suit/item_vr.dmi'
default_worn_icon = 'icons/inventory/suit/mob_vr.dmi'
icon_state = "bio_mod"
/obj/item/clothing/head/bio_hood/modern
name = "modern bio hood"
icon = 'icons/inventory/head/item_vr.dmi'
default_worn_icon = 'icons/inventory/head/mob_vr.dmi'
icon_state = "bio_mod"
@@ -88,18 +88,24 @@
/obj/item/clothing/suit/storage/det_trench/alt
name = "sleek modern coat"
desc = "A sleek overcoat made of neo-laminated fabric. Has a reasonably sized pocket on the inside."
icon = 'icons/inventory/suit/item_vr.dmi'
icon_override = 'icons/inventory/suit/mob_vr.dmi'
default_worn_icon = 'icons/inventory/suit/mob_vr.dmi'
icon_state = "cyberpunksleek"
item_state = "cyberpunksleek"
/obj/item/clothing/suit/storage/det_trench/alt2
name = "sleek modern coat (long)"
desc = "A sleek long overcoat made of neo-laminated fabric. Has a reasonably sized pocket on the inside."
icon = 'icons/inventory/suit/item_vr.dmi'
icon_override = 'icons/inventory/suit/mob_vr.dmi'
default_worn_icon = 'icons/inventory/suit/mob_vr.dmi'
icon_state = "cyberpunksleek_long"
item_state = "cyberpunksleek_long"
/obj/item/clothing/suit/storage/det_trench/alt/black
icon_state = "cyberpunksleek_black"
/obj/item/clothing/suit/storage/det_trench/alt2/black
icon_state = "cyberpunksleek_long_black"
//Talon Hoodie
/obj/item/clothing/suit/storage/toggle/hoodie/talon
@@ -108,4 +114,24 @@
icon = 'icons/inventory/suit/item_vr.dmi'
icon_override = 'icons/inventory/suit/mob_vr.dmi'
icon_state = "talonhoodie"
item_state_slots = list(slot_r_hand_str = "suit_blue", slot_l_hand_str = "suit_blue")
item_state_slots = list(slot_r_hand_str = "suit_blue", slot_l_hand_str = "suit_blue")
// Bladerunner coat
/obj/item/clothing/suit/storage/bladerunner
name = "leather coat"
desc = "An old leather coat. Has probably seen things you wouldn't believe."
icon = 'icons/inventory/suit/item_vr.dmi'
default_worn_icon = 'icons/inventory/suit/mob_vr.dmi'
icon_state = "bladerunner_coat"
// Cyberpunk 'orange' vest
/obj/item/clothing/suit/cyberpunk
name = "cyberpunk vest"
desc = "A red vest with golden streaks. It's made out of tough materials, and can protect fairly well against bullets. Wake the fuck up, Samurai."
icon = 'icons/inventory/suit/item_vr.dmi'
default_worn_icon = 'icons/inventory/suit/mob_vr.dmi'
icon_state = "cyberpunk"
armor = list("melee" = 10, "bullet" = 20, "laser" = 10, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0)
@@ -122,6 +122,15 @@
rolled_sleeves = -1
/obj/item/clothing/under/rank/medical/paramedic
name = "paramedic uniform"
desc = "It's made of a special fiber that provides minor protection against biohazards. This one is the color scheme that designates a rapid first responder."
icon_state = "paramedic"
item_state_slots = list(slot_r_hand_str = "white", slot_l_hand_str = "white")
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS
rolled_down = -1
rolled_sleeves = -1
/obj/item/clothing/under/rank/medical/paramedic_alt
name = "short sleeve medical jumpsuit"
desc = "It's made of a special fiber that provides minor protection against biohazards. This one has a cross on the chest denoting that the wearer is trained medical personnel."
icon_state = "medical_short"
@@ -196,4 +196,32 @@
icon_override = 'icons/inventory/uniform/mob_vr.dmi'
icon_state = "talon_captain"
item_state = "talon_captain"
rolled_sleeves = 0
rolled_sleeves = 0
// Excelsior uniforms
/obj/item/clothing/under/excelsior
name = "\improper Excelsior uniform"
desc = "A uniform from a particular spaceship: Excelsior."
icon = 'icons/inventory/uniform/item_vr.dmi'
default_worn_icon = 'icons/inventory/uniform/mob_vr.dmi'
icon_state = "excelsior_white"
/obj/item/clothing/under/excelsior/mixed
icon_state = "excelsior_mixed"
/obj/item/clothing/under/excelsior/orange
icon_state = "excelsior_orange"
// Summer dresses
/obj/item/clothing/under/summerdress
name = "summer dress"
desc = "A nice summer dress."
icon = 'icons/inventory/uniform/item_vr.dmi'
default_worn_icon = 'icons/inventory/uniform/mob_vr.dmi'
icon_state = "summerdress"
/obj/item/clothing/under/summerdress/red
icon_state = "summerdress3"
/obj/item/clothing/under/summerdress/blue
icon_state = "summerdress2"
+3
View File
@@ -1156,6 +1156,7 @@
/obj/item/clothing/head/surgery/black = 5,
/obj/item/clothing/shoes/white = 5,
/obj/item/clothing/suit/storage/toggle/labcoat = 5,
/obj/item/clothing/suit/storage/toggle/labcoat/modern = 5,
/obj/item/clothing/mask/surgical = 5,
/obj/item/clothing/suit/storage/hooded/wintercoat/medical = 5,
/obj/item/clothing/shoes/boots/winter/medical = 5
@@ -1227,6 +1228,7 @@
/obj/item/clothing/under/rank/scientist/skirt = 5,
/obj/item/clothing/under/rank/scientist/turtleneck = 5,
/obj/item/clothing/suit/storage/toggle/labcoat = 5,
/obj/item/clothing/suit/storage/toggle/labcoat/modern = 5,
/obj/item/clothing/shoes/white = 5,
/obj/item/clothing/shoes/slippers = 5,
/obj/item/clothing/suit/storage/hooded/wintercoat/science = 5,
@@ -1348,6 +1350,7 @@
/obj/item/clothing/under/rank/cargotech/jeans = 5,
/obj/item/clothing/under/rank/cargotech/jeans/female = 5,
/obj/item/clothing/suit/storage/hooded/wintercoat/cargo = 5,
/obj/item/clothing/suit/storage/cargo = 5,
/obj/item/clothing/shoes/boots/winter/supply = 5,
/obj/item/clothing/shoes/black = 5,
/obj/item/clothing/gloves/black = 5,
@@ -73,7 +73,7 @@
else if((world.time - record.last_notification) < 5 MINUTES)
to_chat(src, "<span class='warning'>Too little time has passed since your last notification.</span>")
else
db.notify(record.mindname)
db.notify(record)
record.last_notification = world.time
to_chat(src, "<span class='notice'>New notification has been sent.</span>")
else
@@ -22,6 +22,17 @@
. = ..()
delete_inventory()
/mob/living/carbon/human/dummy/mannequin/autoequip
icon = 'icons/effects/species.dmi'
icon_state = "lizard_f_s_full"
/mob/living/carbon/human/dummy/mannequin/autoequip/Initialize()
icon = null
icon_state = ""
. = ..()
for(var/obj/item/I in loc)
equip_to_appropriate_slot(I)
/mob/living/carbon/human/skrell/Initialize(var/new_loc)
h_style = "Skrell Short Tentacles"
return ..(new_loc, SPECIES_SKRELL)
@@ -129,6 +129,11 @@
message_data[2] = pick(M.say_verbs)
. = 1
if(CE_SPEEDBOOST in chem_effects || is_jittery) // motor mouth
for(var/datum/multilingual_say_piece/S in message_data[1])
S.message = replacetext(S.message," ","")
S.message = replacetext(S.message,",","")
S.message = replacetext(S.message,";","")
else
. = ..(message_data)
@@ -110,7 +110,7 @@
var/alcohol_mod = 1 // Multiplier to alcohol strength; 0.5 = half, 0 = no effect at all, 2 = double, etc.
var/pain_mod = 1 // Multiplier to pain effects; 0.5 = half, 0 = no effect (equal to NO_PAIN, really), 2 = double, etc.
var/spice_mod = 1 // Multiplier to spice/capsaicin/frostoil effects; 0.5 = half, 0 = no effect (immunity), 2 = double, etc.
var/trauma_mod = 1 // Affects traumatic shock (how fast pain crit happens). 0 = no effect (immunity to pain crit), 2 = double etc.Overriden by "can_feel_pain" var
var/trauma_mod = 1 // Affects traumatic shock (how fast pain crit happens). 0 = no effect (immunity to pain crit), 2 = double etc.Overriden by "can_feel_pain" var
// set below is EMP interactivity for nonsynth carbons
var/emp_sensitivity = 0 // bitflag. valid flags are: EMP_PAIN, EMP_BLIND, EMP_DEAFEN, EMP_CONFUSE, EMP_STUN, and EMP_(BRUTE/BURN/TOX/OXY)_DMG
var/emp_dmg_mod = 1 // Multiplier to all EMP damage sustained by the mob, if it's EMP-sensitive
@@ -431,6 +431,8 @@
H.visible_message( \
"<span class='notice'>[H] boops [target]'s nose.</span>", \
"<span class='notice'>You boop [target] on the nose.</span>", )
else if(H.zone_sel.selecting == BP_GROIN) //CHOMPEdit
H.vore_bellyrub(target)
//VOREStation Edit End
else
H.visible_message("<span class='notice'>[H] hugs [target] to make [t_him] feel better!</span>", \
@@ -49,8 +49,8 @@
flags = NO_SCAN | IS_PLANT | NO_MINOR_CUT
appearance_flags = HAS_HAIR_COLOR | HAS_LIPS | HAS_UNDERWEAR | HAS_SKIN_COLOR | HAS_EYE_COLOR
inherent_verbs = list(
/mob/living/carbon/human/proc/alraune_fruit_select) //Give them the voremodes related to wrapping people in vines and sapping their fluids
inherent_verbs = list(/mob/living/carbon/human/proc/alraune_fruit_select, //Give them the voremodes related to wrapping people in vines and sapping their fluids
/mob/living/carbon/human/proc/tie_hair)
color_mult = 1
icobase = 'icons/mob/human_races/r_human_vr.dmi'
@@ -25,6 +25,7 @@
health_hud_intensity = 2
num_alternate_languages = 3
assisted_langs = list(LANGUAGE_EAL, LANGUAGE_ROOTLOCAL, LANGUAGE_ROOTGLOBAL, LANGUAGE_VOX)
inherent_verbs = list(/mob/living/carbon/human/proc/tie_hair)
genders = list(MALE, FEMALE, PLURAL, NEUTER)
@@ -633,7 +633,9 @@
if(isturf(H.loc)) //else, there's considered to be no light
var/turf/T = H.loc
light_amount = T.get_lumcount() * 10
H.adjust_nutrition(light_amount)
// Don't overfeed, just make them full without going over.
if((H.nutrition + light_amount) < initial(H.nutrition))
H.adjust_nutrition(light_amount)
H.shock_stage -= light_amount
if(light_amount >= 3) //if there's enough light, heal
@@ -27,7 +27,8 @@
/mob/living/carbon/human/proc/sonar_ping,
/mob/living/carbon/human/proc/tie_hair,
/mob/living/proc/flying_toggle,
/mob/living/proc/start_wings_hovering) //Xenochimera get all the special verbs since they can't select traits.
/mob/living/proc/start_wings_hovering,
/mob/living/carbon/human/proc/tie_hair) //Xenochimera get all the special verbs since they can't select traits.
virus_immune = 1 // They practically ARE one.
min_age = 18
@@ -337,7 +338,8 @@
/mob/living/carbon/human/proc/toggle_silk_production,
/mob/living/carbon/human/proc/weave_structure,
/mob/living/carbon/human/proc/weave_item,
/mob/living/carbon/human/proc/set_silk_color)
/mob/living/carbon/human/proc/set_silk_color,
/mob/living/carbon/human/proc/tie_hair)
min_age = 18
max_age = 80
@@ -15,6 +15,7 @@
secondary_langs = list(LANGUAGE_SAGARU)
name_language = LANGUAGE_SAGARU
color_mult = 1
inherent_verbs = list(/mob/living/carbon/human/proc/tie_hair)
min_age = 18
max_age = 110
@@ -84,7 +85,7 @@
name_language = LANGUAGE_SKRELLIAN
color_mult = 1
assisted_langs = list(LANGUAGE_EAL, LANGUAGE_ROOTLOCAL, LANGUAGE_ROOTGLOBAL, LANGUAGE_VOX)
inherent_verbs = list(/mob/living/carbon/human/proc/tie_hair)
min_age = 18
max_age = 110
@@ -135,8 +136,9 @@
secondary_langs = list(LANGUAGE_BIRDSONG)
name_language = LANGUAGE_BIRDSONG
color_mult = 1
inherent_verbs = list(/mob/living/proc/flying_toggle,/mob/living/proc/start_wings_hovering)
inherent_verbs = list(/mob/living/proc/flying_toggle,
/mob/living/proc/start_wings_hovering,
/mob/living/carbon/human/proc/tie_hair)
min_age = 18
max_age = 110
@@ -181,7 +183,9 @@
num_alternate_languages = 3
secondary_langs = list(LANGUAGE_TERMINUS)
name_language = LANGUAGE_TERMINUS
inherent_verbs = list(/mob/living/carbon/human/proc/lick_wounds)
inherent_verbs = list(/mob/living/carbon/human/proc/lick_wounds,
/mob/living/proc/shred_limb,
/mob/living/carbon/human/proc/tie_hair)
assisted_langs = list(LANGUAGE_EAL, LANGUAGE_SKRELLIAN, LANGUAGE_SKRELLIANFAR, LANGUAGE_ROOTLOCAL, LANGUAGE_ROOTGLOBAL, LANGUAGE_VOX) //AEIOU edit: Zorren can speak Terminus unassisted.
min_age = 18
@@ -218,7 +222,6 @@
"You feel uncomfortably warm.",
"Your overheated skin itches."
)
inherent_verbs = list(/mob/living/proc/shred_limb)
/datum/species/vulpkanin
name = SPECIES_VULPKANIN
@@ -237,7 +240,8 @@
// gluttonous = 1
num_alternate_languages = 3
color_mult = 1
inherent_verbs = list(/mob/living/carbon/human/proc/lick_wounds)
inherent_verbs = list(/mob/living/carbon/human/proc/lick_wounds,
/mob/living/carbon/human/proc/tie_hair)
male_scream_sound = null //CHOMPedit
female_scream_sound = null //CHOMPedit
@@ -274,6 +278,7 @@
tail_animation = 'icons/mob/species/unathi/tail_vr.dmi'
color_mult = 1
min_age = 18
inherent_verbs = list(/mob/living/carbon/human/proc/tie_hair)
gluttonous = 0
inherent_verbs = list(/mob/living/proc/shred_limb)
genders = list(MALE, FEMALE, PLURAL, NEUTER)
@@ -289,6 +294,7 @@
tail_animation = 'icons/mob/species/tajaran/tail_vr.dmi'
color_mult = 1
min_age = 18
inherent_verbs = list(/mob/living/carbon/human/proc/tie_hair)
allergens = null
gluttonous = 0 //Moving this here so I don't have to fix this conflict every time polaris glances at station.dm
inherent_verbs = list(/mob/living/carbon/human/proc/lick_wounds)
@@ -305,6 +311,7 @@
deform = 'icons/mob/human_races/r_def_skrell_vr.dmi'
color_mult = 1
min_age = 18
inherent_verbs = list(/mob/living/carbon/human/proc/tie_hair)
reagent_tag = null
allergens = null
assisted_langs = list(LANGUAGE_EAL, LANGUAGE_ROOTLOCAL, LANGUAGE_ROOTGLOBAL, LANGUAGE_VOX)
@@ -316,6 +323,7 @@
/datum/species/zaddat
spawn_flags = SPECIES_CAN_JOIN
min_age = 18
inherent_verbs = list(/mob/living/carbon/human/proc/tie_hair) //I don't even know if Zaddat can HAVE hair, but here we are, I suppose
gluttonous = 0
genders = list(MALE, FEMALE, PLURAL, NEUTER)
descriptors = list()
@@ -365,8 +373,9 @@
/datum/species/vox
gluttonous = 0
spawn_flags = SPECIES_CAN_JOIN | SPECIES_IS_WHITELISTED | SPECIES_WHITELIST_SELECTABLE //CHOMPStation Edit TFF 20/1/20 - restore whitelist requirement
min_age = 18
spawn_flags = SPECIES_CAN_JOIN | SPECIES_IS_WHITELISTED | SPECIES_WHITELIST_SELECTABLE //CHOMPStation Edit
min_age = 18
inherent_verbs = list(/mob/living/carbon/human/proc/tie_hair) //Get ya quills done did
icobase = 'icons/mob/human_races/r_vox_old.dmi'
deform = 'icons/mob/human_races/r_def_vox_old.dmi'
descriptors = list(
@@ -389,7 +398,7 @@
name_language = null
color_mult = 1
genders = list(MALE, FEMALE, PLURAL, NEUTER)
inherent_verbs = list(/mob/living/proc/flying_toggle,/mob/living/proc/start_wings_hovering)
inherent_verbs = list(/mob/living/proc/flying_toggle,/mob/living/proc/start_wings_hovering,/mob/living/carbon/human/proc/tie_hair)
min_age = 18
max_age = 80
@@ -544,7 +553,7 @@
num_alternate_languages = 3
secondary_langs = list(LANGUAGE_TERMINUS)
name_language = LANGUAGE_TERMINUS
inherent_verbs = list(/mob/living/carbon/human/proc/lick_wounds)
inherent_verbs = list(/mob/living/carbon/human/proc/lick_wounds,/mob/living/proc/shred_limb,/mob/living/carbon/human/proc/tie_hair)
min_age = 18
max_age = 80
@@ -561,7 +570,6 @@
base_color = "#333333"
blood_color = "#240bc4"
color_mult = 1
inherent_verbs = list(/mob/living/proc/shred_limb)
heat_discomfort_strings = list(
"Your fur prickles in the heat.",
@@ -16,6 +16,9 @@
switch(L.a_intent)
if(I_HELP)
if(health > 0)
if(L.zone_sel.selecting == BP_GROIN) //CHOMPEdit
if(L.vore_bellyrub(src))
return
L.visible_message("<span class='notice'>\The [L] [response_help] \the [src].</span>")
if(I_DISARM)
@@ -14,6 +14,9 @@
switch(a_intent)
if(I_HELP)
if(isliving(A))
if(src.zone_sel.selecting == BP_GROIN) //CHOMPEdit
if(src.vore_bellyrub(A))
return
custom_emote(1,"[pick(friendly)] \the [A]!")
if(I_HURT)
@@ -274,11 +274,15 @@
switch(M.a_intent)
if(I_HELP)
if(health > 0)
if(M.zone_sel.selecting == BP_GROIN) //CHOMPEdit
if(M.vore_bellyrub(src))
return
M.visible_message("<span class='notice'>[M] [response_help] \the [src].</span>")
if(has_AI())
var/datum/ai_holder/AI = ai_holder
AI.set_stance(STANCE_IDLE)
if(prob(tame_chance))
AI.violent_breakthrough = FALSE
AI.hostile = FALSE
friend = M
AI.set_follow(friend)
+1
View File
@@ -169,6 +169,7 @@
// If dead and we try to move in our mob, it leaves our body
if(my_mob.stat == DEAD && isliving(my_mob) && !my_mob.forbid_seeing_deadchat)
my_mob.setMoveCooldown(my_mob.movement_delay(n, direct))
my_mob.ghostize()
return
+1
View File
@@ -215,6 +215,7 @@
render_target = O_LIGHTING_VISUAL_RENDER_TARGET
blend_mode = BLEND_MULTIPLY
alpha = 255
appearance_flags = PLANE_MASTER|NO_CLIENT_COLOR // NO_CLIENT_COLOR because it has some naughty interactions with colorblindness that I can't figure out. Byond bug?
/obj/screen/plane_master/emissive
plane = PLANE_EMISSIVE
+7 -4
View File
@@ -359,24 +359,27 @@ var/list/table_icon_cache = list()
// Base frame shape. Mostly done for glass/diamond tables, where this is visible.
for(var/i = 1 to 4)
var/image/I = get_table_image(icon, connections[i], 1<<(i-1))
var/image/I = get_table_image(icon, connections?[i] || 0, 1<<(i-1))
add_overlay(I)
// Standard table image
if(material)
for(var/i = 1 to 4)
var/image/I = get_table_image(icon, "[material.icon_base]_[connections[i]]", 1<<(i-1), material.icon_colour, 255 * material.opacity)
var/connect = connections?[i] || 0
var/image/I = get_table_image(icon, "[material.icon_base]_[connect]", 1<<(i-1), material.icon_colour, 255 * material.opacity)
add_overlay(I)
// Reinforcements
if(reinforced)
for(var/i = 1 to 4)
var/image/I = get_table_image(icon, "[reinforced.icon_reinf]_[connections[i]]", 1<<(i-1), reinforced.icon_colour, 255 * reinforced.opacity)
var/connect = connections?[i] || 0
var/image/I = get_table_image(icon, "[reinforced.icon_reinf]_[connect]", 1<<(i-1), reinforced.icon_colour, 255 * reinforced.opacity)
add_overlay(I)
if(carpeted)
for(var/i = 1 to 4)
var/image/I = get_table_image(icon, "carpet_[connections[i]]", 1<<(i-1))
var/connect = connections?[i] || 0
var/image/I = get_table_image(icon, "carpet_[connect]", 1<<(i-1))
add_overlay(I)
else
cut_overlays()
+2
View File
@@ -245,6 +245,8 @@
var/list/gateway_zs = GetConnectedZlevels(GLOB.gateway_away.z)
if(z in gateway_zs)
return FALSE // It's not calibrated and we're in a connected z
return TRUE
/obj/machinery/power/quantumpad/proc/gateway_scatter(mob/user)
var/obj/effect/landmark/dest = pick(awaydestinations)
+4
View File
@@ -296,3 +296,7 @@
/datum/tgui_module/camera/ntos/hacked/New(host)
. = ..(host, using_map.station_networks.Copy())
/datum/tgui_module/camera/bigscreen/tgui_state(mob/user)
return GLOB.tgui_physical_state_bigscreen
+20 -4
View File
@@ -85,7 +85,7 @@
*
* Check the distance for a living mob.
* Really only used for checks outside the context of a mob.
* Otherwise, use shared_living_ui_distance().
* Otherwise, use shared_living_tgui_distance().
*
* required src_object The object which owns the UI.
* required user mob The mob who opened/is using the UI.
@@ -119,10 +119,26 @@
return STATUS_DISABLED
return STATUS_CLOSE // Otherwise, we got nothing.
/mob/living/carbon/human/shared_living_tgui_distance(atom/movable/src_object, viewcheck = TRUE)
if((TK in mutations) && (get_dist(src, src_object) <= 2))
/**
* public
*
* Distance versus interaction check, with max'd update range.
*
* required src_object atom/movable The object which owns the UI.
*
* return UI_state The state of the UI.
*/
/mob/living/proc/shared_living_tgui_distance_bigscreen(atom/movable/src_object, viewcheck = TRUE)
// If the object is obscured, close it.
if(viewcheck && !(src_object in view(src)))
return STATUS_CLOSE
var/dist = get_dist(src_object, src)
if(dist <= 1) // Open and interact if 1-0 tiles away.
return STATUS_INTERACTIVE
return ..()
else if(dist <= world.view)
return STATUS_UPDATE
return STATUS_CLOSE // Otherwise, we got nothing.
// Topic Extensions for old UIs
/datum/proc/CanUseTopic(var/mob/user, var/datum/tgui_state/state)
+26
View File
@@ -47,3 +47,29 @@ GLOBAL_DATUM_INIT(tgui_physical_obscured_state, /datum/tgui_state/physical_obscu
/mob/living/silicon/ai/physical_obscured_can_use_topic(src_object)
return STATUS_UPDATE // AIs are not physical.
/**
* tgui state: physical_state_bigscreen
*
* Short-circuits the default state to only check physical distance,
* but allows updates out to the full size of the screen.
**/
GLOBAL_DATUM_INIT(tgui_physical_state_bigscreen, /datum/tgui_state/physical_bigscreen, new)
/datum/tgui_state/physical_bigscreen/can_use_topic(src_object, mob/user)
. = user.shared_tgui_interaction(src_object)
if(. > STATUS_CLOSE)
return min(., user.physical_can_use_tgui_topic_bigscreen(src_object))
/mob/proc/physical_can_use_tgui_topic_bigscreen(src_object)
return STATUS_CLOSE
/mob/living/physical_can_use_tgui_topic_bigscreen(src_object)
return shared_living_tgui_distance_bigscreen(src_object)
/mob/living/silicon/physical_can_use_tgui_topic_bigscreen(src_object)
return max(STATUS_UPDATE, shared_living_tgui_distance_bigscreen(src_object)) // Silicons can always see.
/mob/living/silicon/ai/physical_can_use_tgui_topic(src_object)
return STATUS_UPDATE // AIs are not physical.
+2 -1
View File
@@ -10,7 +10,8 @@ var/list/ventcrawl_machinery = list(
/obj/item/weapon/holder,
/obj/machinery/camera,
/obj/belly,
/obj/screen
/obj/screen,
/atom/movable/emissive_blocker
)
//VOREStation Edit : added /obj/belly, to this list, CI is complaining about this in his indentation check
//mob/living/simple_mob/borer, //VORESTATION AI TEMPORARY REMOVAL REPLACE BACK IN LIST WHEN RESOLVED //VOREStation Edit
+48 -1
View File
@@ -1,4 +1,4 @@
//CHOMP vore additions, currently only consists of reagent stuff - Jack
//CHOMP vore additions.
/obj/belly
//CHOMP - liquid bellies
@@ -303,3 +303,50 @@
else
// Didn't transfer, so wait before retrying
addtimer(CALLBACK(src, /obj/belly/.proc/check_autotransfer, prey, autotransferlocation), autotransferwait)
/////////////////////////// Process Cycle Lite /////////////////////////// CHOMP PCL
/obj/belly/proc/quick_cycle() //For manual belly cycling without straining the bellies subsystem.
HandleBellyReagents() //CHOMP reagent belly stuff.
// VERY early exit
if(!contents.len)
return
var/to_update = FALSE //Did anything update worthy happen?
/////////////////////////// Exit Early //////////////////////////// CHOMP PCL
var/list/touchable_atoms = contents - items_preserved
if(!length(touchable_atoms))
return
var/datum/digest_mode/DM = GLOB.digest_modes["[digest_mode]"]
if(!DM)
log_debug("Digest mode [digest_mode] didn't exist in the digest_modes list!!")
return FALSE
if(DM.handle_atoms(src, touchable_atoms))
updateVRPanels()
return
var/list/touchable_mobs = null
var/list/hta_returns = handle_touchable_atoms(touchable_atoms)
if(islist(hta_returns))
if(hta_returns["touchable_mobs"])
touchable_mobs = hta_returns["touchable_mobs"]
if(hta_returns["to_update"])
to_update = hta_returns["to_update"]
if(!LAZYLEN(touchable_mobs))
return
///////////////////// Time to actually process mobs ///////////////////// CHOMP PCL
for(var/target in touchable_mobs)
var/mob/living/L = target
if(!istype(L))
continue
var/list/returns = DM.process_mob(src, target)
if(istype(returns) && returns["to_update"])
to_update = TRUE
if(to_update)
updateVRPanels()
/////////////////////////// CHOMP PCL END ///////////////////////////
+54 -42
View File
@@ -17,8 +17,10 @@
var/play_sound //Potential sound to play at the end to avoid code duplication.
var/to_update = FALSE //Did anything update worthy happen?
///////////////////// Prey Loop Refresh/hack //////////////////////
prey_loop()
/////////////////////////// Exit Early ////////////////////////////
var/list/touchable_atoms = contents - items_preserved
if(!length(touchable_atoms))
return
/////////////////////////// Sound Selections ///////////////////////////
var/digestion_noise_chance = 0
@@ -31,10 +33,7 @@
prey_digest = sound(get_sfx("fancy_digest_prey"))
pred_digest = sound(get_sfx("fancy_digest_pred"))
/////////////////////////// Exit Early ////////////////////////////
var/list/touchable_atoms = contents - items_preserved
if(!length(touchable_atoms))
return
///////////////////// Early Non-Mode Handling /////////////////////
var/datum/digest_mode/DM = GLOB.digest_modes["[digest_mode]"]
if(!DM)
@@ -55,10 +54,58 @@
if(hta_returns["to_update"])
to_update = hta_returns["to_update"]
if(!digestion_noise_chance)
digestion_noise_chance = DM.noise_chance
/////////////////////////// Make any noise ///////////////////////////
if(digestion_noise_chance && prob(digestion_noise_chance))
for(var/mob/M in contents)
if(M && M.is_preference_enabled(/datum/client_preference/digestion_noises))
SEND_SOUND(M, prey_digest)
play_sound = pred_digest
if(to_update)
updateVRPanels()
if(!LAZYLEN(touchable_mobs))
if(play_sound)
for(var/mob/M in hearers(VORE_SOUND_RANGE, get_turf(owner))) //so we don't fill the whole room with the sound effect
if(!M.is_preference_enabled(/datum/client_preference/digestion_noises))
continue
if(isturf(M.loc) || (M.loc != src)) //to avoid people on the inside getting the outside sounds and their direct sounds + built in sound pref check
if(fancy_vore)
M.playsound_local(get_turf(owner), play_sound, vol = 100, vary = 1, falloff = VORE_SOUND_FALLOFF)
else
M.playsound_local(get_turf(owner), play_sound, vol = 100, vary = 1, falloff = VORE_SOUND_FALLOFF)
//these are all external sound triggers now, so it's ok.
return
///////////////////// Early Non-Mode Handling /////////////////////
///////////////////// Prey Loop Refresh/hack //////////////////////
prey_loop()
///////////////////// Time to actually process mobs /////////////////////
for(var/target in touchable_mobs)
var/mob/living/L = target
if(!istype(L))
continue
var/list/returns = DM.process_mob(src, target)
if(istype(returns) && returns["to_update"])
to_update = TRUE
if(istype(returns) && returns["soundToPlay"] && !play_sound)
play_sound = returns["soundToPlay"]
if(play_sound)
for(var/mob/M in hearers(VORE_SOUND_RANGE, get_turf(owner))) //so we don't fill the whole room with the sound effect
if(!M.is_preference_enabled(/datum/client_preference/digestion_noises))
continue
if(isturf(M.loc) || (M.loc != src)) //to avoid people on the inside getting the outside sounds and their direct sounds + built in sound pref check
if(fancy_vore)
M.playsound_local(get_turf(owner), play_sound, vol = 100, vary = 1, falloff = VORE_SOUND_FALLOFF)
else
M.playsound_local(get_turf(owner), play_sound, vol = 100, vary = 1, falloff = VORE_SOUND_FALLOFF)
//these are all external sound triggers now, so it's ok.
if(emote_active)
var/list/EL = emote_lists[digest_mode]
if(LAZYLEN(EL) && next_emote <= world.time)
@@ -79,41 +126,6 @@
formatted_message = replacetext(formatted_message, "%countprey", living_count)
to_chat(M, "<span class='notice'>[formatted_message]</span>")
if(!digestion_noise_chance)
digestion_noise_chance = DM.noise_chance
///////////////////// Time to actually process mobs /////////////////////
for(var/target in touchable_mobs)
var/mob/living/L = target
if(!istype(L))
continue
var/list/returns = DM.process_mob(src, target)
if(istype(returns) && returns["to_update"])
to_update = TRUE
if(istype(returns) && returns["soundToPlay"] && !play_sound)
play_sound = returns["soundToPlay"]
/////////////////////////// Make any noise ///////////////////////////
if(digestion_noise_chance && prob(digestion_noise_chance))
for(var/mob/M in contents)
if(M && M.is_preference_enabled(/datum/client_preference/digestion_noises))
SEND_SOUND(M, prey_digest)
play_sound = pred_digest
if(play_sound)
for(var/mob/M in hearers(VORE_SOUND_RANGE, get_turf(owner))) //so we don't fill the whole room with the sound effect
if(!M.is_preference_enabled(/datum/client_preference/digestion_noises))
continue
if(isturf(M.loc) || (M.loc != src)) //to avoid people on the inside getting the outside sounds and their direct sounds + built in sound pref check
if(fancy_vore)
M.playsound_local(get_turf(owner), play_sound, vol = 100, vary = 1, falloff = VORE_SOUND_FALLOFF)
else
M.playsound_local(get_turf(owner), play_sound, vol = 100, vary = 1, falloff = VORE_SOUND_FALLOFF)
//these are all external sound triggers now, so it's ok.
if(to_update)
updateVRPanels()
/obj/belly/proc/handle_touchable_atoms(list/touchable_atoms)
var/did_an_item = FALSE // Only do one item per cycle.
+18
View File
@@ -219,3 +219,21 @@ mob/living/proc/check_vorefootstep(var/m_intent, var/turf/T)
soundfile = fancy_release_sounds[RTB.release_sound]
if(soundfile)
playsound(src, soundfile, vol = 100, vary = 1, falloff = VORE_SOUND_FALLOFF, preference = /datum/client_preference/eating_noises)
/mob/living/proc/vore_bellyrub(var/mob/living/T)
set name = "Give Bellyrubs"
set category = "Abilities"
set desc = "Provide bellyrubs to either yourself or another mob with a belly."
if(!T)
T = input("Choose whose belly to rub") as null| mob in view(src.loc,1)
if(!T)
return FALSE
if(T.vore_selected)
var/obj/belly/B = T.vore_selected
if(istype(B))
custom_emote_vr(1, "gives some rubs over [T]'s [B].")
B.quick_cycle()
return TRUE
to_chat(src, "<span class='warning'>There is no suitable belly for rubs.</span>")
return FALSE
+2 -1
View File
@@ -52,6 +52,7 @@
M.verbs += /mob/living/proc/insidePanel
M.verbs += /mob/living/proc/vore_transfer_reagents //CHOMP If mob doesnt have bellies it cant use this verb for anything
M.verbs += /mob/living/proc/vore_check_reagents //CHOMP If mob doesnt have bellies it cant use this verb for anything
M.verbs += /mob/living/proc/vore_bellyrub //CHOMP If mob doesnt have bellies it probably won't be needing this anyway
//Tries to load prefs if a client is present otherwise gives freebie stomach
spawn(2 SECONDS)
@@ -544,7 +545,7 @@
// Their AI should get notified so they can stab us
prey.ai_holder?.react_to_attack(user)
//Timer and progress bar
if(!do_after(user, swallow_time, prey, exclusive = TASK_USER_EXCLUSIVE))
return FALSE // Prey escpaed (or user disabled) before timer expired.
@@ -889,74 +889,56 @@ No. With a teleporter? Just *no*. - Hawk, YW
//catalogue_data = list(/datum/category_item/catalogue/information/organization/khi)
sensor_mode = 3
icon = 'icons/vore/custom_clothes_vr.dmi'
icon_state = "khi_uniform_i"
icon_override = 'icons/vore/custom_clothes_vr.dmi'
item_state = ""
icon = 'icons/inventory/uniform/item_vr.dmi'
default_worn_icon = 'icons/inventory/uniform/mob_vr.dmi'
icon_state = "khi_uniform"
/obj/item/clothing/under/rank/khi/cmd //Command version
name = "GE command suit" //CHOMPedit: Change to GE
desc = "Gilthari Exports uniform. An extra-comfortable command one, at that." //CHOMPedit
icon_state = "khi_uniform_cmd_i"
item_state = "khi_uniform_cmd"
worn_state = "khi_uniform_cmd"
icon_state = "khi_uniform_cmd"
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0)
/obj/item/clothing/under/rank/khi/sec //Security version
name = "GE security suit" //CHOMPedit: Change to GE
desc = "Gilthari Exports uniform. This one has angry red security stripes. Keepin' the peace in style." //CHOMPedit
icon_state = "khi_uniform_sec_i"
item_state = "khi_uniform_sec"
worn_state = "khi_uniform_sec"
icon_state = "khi_uniform_sec"
armor = list(melee = 10, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0)
/obj/item/clothing/under/rank/khi/med //Medical version
name = "GE medical suit" //CHOMPedit: Change to GE
desc = "Gilthari Exports uniform. The medical version. Why not just get a new body, anyway?"//CHOMPedit
icon_state = "khi_uniform_med_i"
item_state = "khi_uniform_med"
worn_state = "khi_uniform_med"
icon_state = "khi_uniform_med"
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 10, rad = 0)
/obj/item/clothing/under/rank/khi/eng //Engineering version
name = "GE engineering suit" //CHOMPedit: Change to GE
desc = "Gilthari Exports uniform. One fit for an engineer, by the looks of it. Building the future, one disaster at a time." //CHOMPedit
icon_state = "khi_uniform_eng_i"
item_state = "khi_uniform_eng"
worn_state = "khi_uniform_eng"
icon_state = "khi_uniform_eng"
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 10)
/obj/item/clothing/under/rank/khi/sci //Science version
name = "GE science suit" //CHOMPedit: Change to GE
desc = "Gilthari Exports uniform. For performing science in, based on the color! Only SCIENCE can save us now." //CHOMPedit
icon_state = "khi_uniform_sci_i"
item_state = "khi_uniform_sci"
worn_state = "khi_uniform_sci"
icon_state = "khi_uniform_sci"
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 10, bio = 0, rad = 0)
/obj/item/clothing/under/rank/khi/crg //Cargo version
name = "GE cargo suit" //CHOMPedit: Change to GE
desc = "A sleek cargo uniform from Gilthari Exports." //CHOMPedit
icon_state = "khi_uniform_crg_i"
item_state = "khi_uniform_crg"
worn_state = "khi_uniform_crg"
icon_state = "khi_uniform_crg"
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0)
/obj/item/clothing/under/rank/khi/civ //Science version
name = "GE civilian suit" //CHOMPedit: Change to GE
desc = "A sleek civilian uniform from Gilthari Exports." //CHOMPedit
icon_state = "khi_uniform_civ_i"
item_state = "khi_uniform_civ"
worn_state = "khi_uniform_civ"
icon_state = "khi_uniform_civ"
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0)
/obj/item/clothing/under/rank/khi/fluff/aronai //Aro fluff version
name = "KHI meditech suit"
desc = "An outdated uniform of some sort. You get the sense that whoever wore this must've been very full of themselves"
icon_state = "khi_uniform_aro_i"
item_state = "khi_uniform_aro"
worn_state = "khi_uniform_aro"
desc = "An outdated uniform of some sort. You get the sense that whoever wore this must've been very full of themselves" //YW edit
icon_state = "khi_uniform_aro"
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 10, rad = 0)
//jacobdragon:Earthen Breath
@@ -1189,30 +1171,26 @@ Departamental Swimsuits, for general use
/obj/item/clothing/under/rank/trek
name = "Section 31 Uniform"
desc = "Oooh... right."
icon = 'icons/vore/custom_clothes_vr.dmi'
icon_override = 'icons/vore/custom_clothes_vr.dmi'
item_state = ""
icon = 'icons/inventory/uniform/item_vr.dmi'
default_worn_icon = 'icons/inventory/uniform/mob_vr.dmi'
//TOS
/obj/item/clothing/under/rank/trek/command
name = "Command Uniform"
desc = "The uniform worn by command officers in the mid 2260s."
icon_state = "trek_command"
item_state = "trek_command"
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) // Considering only staff heads get to pick it
/obj/item/clothing/under/rank/trek/eng //CHOMPEdit: Engineering only
name = "Operations Uniform"
desc = "The uniform worn by operations officers of the mid 2260s. You feel strangely vulnerable just seeing this..."
icon_state = "trek_engsec"
item_state = "trek_engsec"
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) // since they're shared between jobs and kinda moot. //CHOMPEdit: I'll tell you what, the armor values are NOT shared. Removed melee bonus.
/obj/item/clothing/under/rank/trek/medsci
name = "MedSci Uniform"
desc = "The uniform worn by medsci officers in the mid 2260s."
icon_state = "trek_medsci"
item_state = "trek_medsci"
permeability_coefficient = 0.50
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0) // basically a copy of vanilla sci/med
@@ -1220,59 +1198,48 @@ Departamental Swimsuits, for general use
/obj/item/clothing/under/rank/trek/command/next
desc = "The uniform worn by command officers. This one's from the mid 2360s."
icon_state = "trek_next_command"
item_state = "trek_next_command"
/obj/item/clothing/under/rank/trek/eng/next //CHOMPEdit: Engineering only
desc = "The uniform worn by operation officers. This one's from the mid 2360s."
icon_state = "trek_next_engsec"
item_state = "trek_next_engsec"
/obj/item/clothing/under/rank/trek/medsci/next
desc = "The uniform worn by medsci officers. This one's from the mid 2360s."
icon_state = "trek_next_medsci"
item_state = "trek_next_medsci"
//ENT
/obj/item/clothing/under/rank/trek/command/ent
desc = "The uniform worn by command officers of the 2140s."
icon_state = "trek_ent_command"
item_state = "trek_ent_command"
/obj/item/clothing/under/rank/trek/eng/ent //CHOMPEdit: Engineering only
desc = "The uniform worn by operations officers of the 2140s."
icon_state = "trek_ent_engsec"
item_state = "trek_ent_engsec"
/obj/item/clothing/under/rank/trek/medsci/ent
desc = "The uniform worn by medsci officers of the 2140s."
icon_state = "trek_ent_medsci"
item_state = "trek_ent_medsci"
//VOY
/obj/item/clothing/under/rank/trek/command/voy
desc = "The uniform worn by command officers of the 2370s."
icon_state = "trek_voy_command"
item_state = "trek_voy_command"
/obj/item/clothing/under/rank/trek/eng/voy //CHOMPEdit: Engineering only
desc = "The uniform worn by operations officers of the 2370s."
icon_state = "trek_voy_engsec"
item_state = "trek_voy_engsec"
/obj/item/clothing/under/rank/trek/medsci/voy
desc = "The uniform worn by medsci officers of the 2370s."
icon_state = "trek_voy_medsci"
item_state = "trek_voy_medsci"
//DS9
/obj/item/clothing/suit/storage/trek/ds9
name = "Padded Overcoat"
desc = "The overcoat worn by all officers of the 2380s."
icon = 'icons/inventory/suit/item_vr.dmi'
default_worn_icon = 'icons/inventory/suit/mob_vr.dmi'
icon_state = "trek_ds9_coat"
icon = 'icons/vore/custom_clothes_vr.dmi'
item_state = "trek_ds9_coat_mob"
icon_override = 'icons/vore/custom_clothes_vr.dmi'
body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS
permeability_coefficient = 0.50
allowed = list(
@@ -1289,23 +1256,21 @@ Departamental Swimsuits, for general use
name = "Admiral Overcoat"
desc = "Admirality specialty coat to keep flag officers fashionable and protected."
icon_state = "trek_ds9_coat_adm"
item_state = "trek_ds9_coat_adm_mob"
armor = list(melee = 45, bullet = 35, laser = 35, energy = 20, bomb = 0, bio = 40, rad = 55)
/obj/item/clothing/under/rank/trek/command/ds9
desc = "The uniform worn by command officers of the 2380s."
icon_state = "trek_command"
icon_state = "trek_command" // no unique state for this one
item_state = "trek_ds9_command"
/obj/item/clothing/under/rank/trek/eng/ds9 //CHOMPEdit: Engineering only
desc = "The uniform worn by operations officers of the 2380s."
icon_state = "trek_engsec"
icon_state = "trek_engsec" // no unique state for this one
item_state = "trek_ds9_engsec"
/obj/item/clothing/under/rank/trek/medsci/ds9
desc = "The uniform undershit worn by medsci officers of the 2380s."
icon_state = "trek_medsci"
icon_state = "trek_medsci" // no unique state for this one
item_state = "trek_ds9_medsci"
//For general use maybe
@@ -1941,7 +1906,7 @@ Departamental Swimsuits, for general use
item_icons = list()
default_worn_icon = 'icons/vore/custom_clothes_vr.dmi'
color = COLOR_NAVY
sprite_sheets = null
sprite_sheets = list()
//SweetBlueSylveon:Pip Shyner
/obj/item/clothing/accessory/poncho/roles/cloak/hop/fluff/pip
Binary file not shown.

Before

Width:  |  Height:  |  Size: 61 KiB

After

Width:  |  Height:  |  Size: 60 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.7 KiB

After

Width:  |  Height:  |  Size: 8.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 894 B

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 449 B

After

Width:  |  Height:  |  Size: 975 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 37 KiB

After

Width:  |  Height:  |  Size: 47 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 17 KiB

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 62 KiB

After

Width:  |  Height:  |  Size: 83 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 126 KiB

After

Width:  |  Height:  |  Size: 127 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.4 KiB

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 440 KiB

After

Width:  |  Height:  |  Size: 442 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 25 KiB

After

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 543 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.2 KiB

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 784 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 23 KiB

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 455 B

After

Width:  |  Height:  |  Size: 738 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 31 KiB

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 215 KiB

After

Width:  |  Height:  |  Size: 195 KiB

BIN
View File
Binary file not shown.
+21 -1
View File
@@ -2589,6 +2589,10 @@
/obj/structure/table/marble,
/turf/simulated/floor/tiled/eris/cafe,
/area/aro3/kitchen)
"vP" = (
/obj/machinery/gear_dispenser/suit_fancy/aether,
/turf/simulated/floor/tiled/eris/steel/panels,
/area/aro3/eva_hall)
"vQ" = (
/obj/structure/table/steel,
/obj/item/device/flashlight/lamp,
@@ -3953,6 +3957,22 @@
/obj/machinery/atmospherics/unary/vent_scrubber/on{
dir = 8
},
<<<<<<< HEAD
||||||| parent of df7a88506f... Merge pull request #11032 from VOREStation/Arokha/megaport
/obj/machinery/light_switch{
dir = 1;
pixel_y = -24
},
/obj/item/device/uav/loaded,
=======
/obj/machinery/light_switch{
dir = 1;
pixel_y = -24
},
/obj/item/device/uav/loaded{
nickname = "FoxBot Beta"
},
>>>>>>> df7a88506f... Merge pull request #11032 from VOREStation/Arokha/megaport
/turf/simulated/floor/tiled/eris/dark/gray_perforated,
/area/aro3/repair_bay)
"Gy" = (
@@ -42234,7 +42254,7 @@ el
el
vZ
lu
DM
vP
XF
XF
Nu
+1 -1
View File
@@ -343,7 +343,7 @@ speaking of, if some dumbass does take it and fly off solo then get themselves k
/obj/item/clothing/under/rank/medical,
/obj/item/clothing/under/rank/nurse,
/obj/item/clothing/under/rank/orderly,
/obj/item/clothing/suit/storage/toggle/labcoat,
/obj/item/clothing/suit/storage/toggle/labcoat/modern,
/obj/item/clothing/suit/storage/toggle/fr_jacket,
/obj/item/clothing/shoes/white,
/obj/item/device/radio/headset/talon,
@@ -1,3 +1,4 @@
"aa" = (/obj/effect/zone_divider,/mob/living/simple_mob/animal/passive/penguin{hovering = 1},/turf/simulated/floor/outdoors/ice,/area/surface/outside/plains/outpost)
"ab" = (/turf/simulated/wall/golddiamond,/area/casino/casino_ship/wing_left)
"ac" = (/turf/simulated/wall/golddiamond,/area/casino/casino_ship)
"af" = (/obj/structure/reagent_dispensers/watertank/high,/turf/simulated/floor/wood/sif,/area/submap/lonehome)
@@ -91,7 +92,6 @@
"cU" = (/obj/machinery/door/airlock/silver{name = "Sauna"},/obj/structure/fans/tiny,/turf/simulated/floor/wood,/area/casino/casino_ship)
"cY" = (/obj/effect/decal/cleanable/dirt,/obj/random/junk,/turf/simulated/floor/wood/sif,/area/submap/lonehome)
"cZ" = (/obj/structure/bed/chair/sofa/yellow/corner,/turf/simulated/floor/carpet/oracarpet,/area/casino/casino_ship)
"da" = (/obj/structure/wheel_of_fortune{pixel_y = 8},/obj/structure/table/fancyblack,/turf/simulated/floor/carpet/turcarpet,/area/casino/casino_ship)
"db" = (/obj/structure/table/rack/shelf/steel,/obj/item/stack/material/log/sif{amount = 25},/obj/item/stack/material/log/sif{amount = 25},/turf/simulated/floor/plating,/area/submap/lonehome)
"dc" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/flora/ausbushes/ppflowers,/turf/simulated/floor/outdoors/grass/heavy{outdoors = 0},/area/casino/casino_ship)
"dd" = (/obj/machinery/light/small{dir = 1},/obj/machinery/recharge_station,/turf/simulated/floor/tiled/freezer,/area/casino/casino_ship)
@@ -1020,7 +1020,6 @@
"YV" = (/obj/structure/bed/chair/oldsofa/left{dir = 8},/turf/simulated/floor/carpet/bcarpet,/area/casino/casino_ship)
"YX" = (/obj/structure/bed/chair/sofa/yellow/right,/turf/simulated/floor/carpet/oracarpet,/area/casino/casino_ship)
"Zc" = (/obj/structure/casino_table/roulette_chart,/turf/simulated/floor/carpet/oracarpet,/area/casino/casino_ship)
"Zi" = (/mob/living/simple_mob/animal/passive/penguin{hovering = 1},/obj/effect/zone_divider,/turf/simulated/floor/outdoors/ice,/area/surface/outside/plains/outpost)
"Zj" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4; health = 1e+006},/obj/machinery/door/blast/shutters{dir = 2; id = "Casinodormshutters5"; layer = 3.5; name = "Casino Privacy shutters"},/turf/simulated/floor,/area/casino/casino_ship/dorms)
"Zl" = (/obj/structure/bed/chair/comfy/red{dir = 4},/turf/simulated/floor/carpet/oracarpet,/area/casino/casino_ship)
"Zn" = (/obj/effect/floor_decal/borderfloor{dir = 8},/obj/effect/floor_decal/corner/brown/border{dir = 8},/obj/machinery/light{dir = 8},/turf/simulated/floor/tiled,/area/casino/casino_ship/wing_left)
@@ -1151,7 +1150,7 @@ hPmcmcmcmcmcmcmcmcmcmcmcmcmcmcmcmNmNmNmNfBwtmNmNmNwtmNmNmNeGmNmNcCmNeGmNmNmNhXmN
hPmcmcmcmcmcmcmcmcmcmcmcmcmcmcmcmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNwtaFmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNcCmNmNmNmNcCmNmNcCmNmNfBmNmNcCfBmNfBmNmNfBfBcCmNmNmNfBcCcCmNmNmNmNcCmNmNmNmNmNmNmNmNmNmNfBmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNdqmNmNbKbKbKbKbKgabKbKbKbKbKbKbKbKbKbKbKbKbKbKbKbKmNmNmNmNhXmNmNfBmNmNmNmNmNmNmNmNeGmNmNmNmNmNblmNmNmNmNmNmNmNav
hPmcmcmcmcmcmcmcmcmcmcmcmcmcmcmNmNmNmNcCmNmNmNmNmNcjmNmNmNmNmNxrmNmNmNmNfBmNmNmNmNmNaFmNmNmNmNhYmNmNmNmNmNmNmNmNmNeGanmNmNmNmNmNgSmNmNmNmNmNmNmNmNmNmNmNmNmNmNKPmNmNcCmNmNmNmNmNaimNmNcCfBmNfBmNmNmNcCmNcCmNmNmNYhaFmNmNmNwtmNmNmNmNmNmNmNmNmNmNmNcChYmNmNmNmNmNmNbKbKbKbKbKbKbKbKgabKbKbKbKbKbKbKbKbKbKbKbKbKbKbKbKbKbKmNmNmNmNmNnfmNmNmNeGmNfBmNmNmNmNfBhXmNmNblmNmNmNwtmNmNmNav
hPmcmcmcmcmcmcmcmcmcmcmcmcmcmcmNmNmNmNmNcCmNmNmNmNmNmNmNmNcCmNmNmNmNmNmNeGmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNwtmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNeGmNmNmNmNmNhXmNmNmNmNmNmNmNmNcCaFmNmNmNmNfBmNcCmNfBmNcCmNmNmNmNmNfBmNmNmNmNmNmNmNmNmNmNeGmNmNmNmNmNmNmNmNmNmNmNmNbKbKbKbKbKbKbKbKbKgabKbKbKbKbKbKbKbKbKbKbKbKbKbKbKbKbKbKmNmNmNmNmNmNmNmNfBmNmNmNmNmNmNhXmNmNmNmNblmNmNmNmNmNmNmNav
ZLgrgrgrgrgrgrgrgrgrgrgrgrgrgrlFlFxplFlFlFlFlFlFfXlFlFlFlFlFlFlFlFlFlFlFlFlFlFwrlFlFlFlFyPlFlFlFlFpOlFlFlFlFlFlFlFlFlFPBUNlFlFlFlFlFlFlFlFlFlFlFlFlFlFyPlFlFlFlFlFlFlFlFPBlFlFlFlFlFPBlFyPlFlFlFlFlFlFyPlFlFlFlFlFlFlFlFlFlFlFlFlFlFlFlFlFlFlFyPlFlFlFlFlFlFlFgagagagagagagagagagagagagagagagagagagaZigagagagagagagagagagalFlFlFlFlFlFlFlFlFlFlFlFlFlFlFlFlFlFlFDwXflFlFlFlFlFlFbG
ZLgrgrgrgrgrgrgrgrgrgrgrgrgrgrlFlFxplFlFlFlFlFlFfXlFlFlFlFlFlFlFlFlFlFlFlFlFlFwrlFlFlFlFyPlFlFlFlFpOlFlFlFlFlFlFlFlFlFPBUNlFlFlFlFlFlFlFlFlFlFlFlFlFlFyPlFlFlFlFlFlFlFlFPBlFlFlFlFlFPBlFyPlFlFlFlFlFlFyPlFlFlFlFlFlFlFlFlFlFlFlFlFlFlFlFlFlFlFyPlFlFlFlFlFlFlFgagagagagagagagagagagagagagagagagagagaaagagagagagagagagagagalFlFlFlFlFlFlFlFlFlFlFlFlFlFlFlFlFlFlFDwXflFlFlFlFlFlFbG
hPmcmcmcmcmcmcmcmcmcmcmcmcmcmcmNmNmNmNcCmNmNmNmNmNaFmNmNmNmNmNcCaFmNmNmNmNmNmNwteGmNmNmNmNeGmNmNmNmNmNmNmNmNmNmNmNmNmNmNcCmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNfBmNmNmNfBmNmNcCmNmNcCcCfBmNmNmNmNcCmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNcCmNmNmNmNmNbKbKbKbKbKbKbKbKbKUdbKgabKbKbKbKbKbKbKbKbKbKbKbKbKbKbKbKbKbKbKmNmNmNmNmNhXmNmNmNmNmNmNmNmNmNmNmNmNmNblmNmNmNmNmNmNmNav
hPmcmcmcmcmcmcmcmcmcmcmcmcmcmcmNmNmNfBmNmNcCXPfBmNmNcCmNmNmNmNdqmNfBmNmNfBmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNhXmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNeGmNmNcncCmNmNmNmNmNmNmNmNcCmNmNmNfBfBOvmNfBmNmNmNmNmNmNmNmNaFmNmNwtmNmNmNmNmNmNmNmNmNmNmNeGmNmNmNmNmNbKbKbKbKbKbKbKbKbKbKbKgabKbKbKbKbKbKbKbKbKbKbKbKbKbKbKbKbKbKbKbKmNmNmNmNmNmNmNmNmNmNdqmNmNmNmNmNmNmNblmNmNmNmNmNmNmNav
hPmcmcmcmcmcmcmcmcmcmcmcmcmcmcmNmNmNmNmNaFmNmNmNmNmNmNmNmNmNmNfBmNmNmNmNmNmNaFmNmNmNmNmNmNmNmNeGmNmNfBmNmNmNmNmNeGmNmNmNmNmNmNmNmNcCmNmNmNmNmNmNhXmNmNcCmNmNmNmNmNmNmNmNmNmNmNmNmNmNfBmNfBfBmNmNmNmNmNmNfBmNmNmNmNcCaFmNmNmNmNmNmNmNmNmNmNhYmNmNmNmNmNmNmNdqbKbKbKbKbKbKbKbKbKbKbKgabKbKbKbKbKbKbKbKbKbKbKbKbKbKbKbKbKbKbKbKmNmNmNmNmNmNmNmNmNmNmNfBmNmNmNmNmNmNblmNmNmNmNmNdqmNav
@@ -1167,7 +1166,7 @@ hPmcmcmcmcmcmcmcmcmcmcmcmcmNmNdqmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmN
hPmcmcmcmcmcmcmcmcmcmcmcmcmcmNmNmNmNmNmNmNmNcCmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNhYmNmNmNmNgNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNwtmNmNmNmNmNmNeGmNmNmNmNhYmNmNmNmNmNmNmNwtmNmNmNmNmNmNmNmNmNmNaFmNmNmNmNeGmNcCmNmNmNmNmNmNmNmNmNmNmNeGmNmNmNmNmNmNeGmNmNmNmNmNmNlFmNmNmNmNmNdqmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNfBdqmNfBmNmNblmNmNmNmNmNdqmNav
hPmcmcmcmcmcmcmcmcmcmcmcmcmcmNmNmNmNmNmNmNmNmNgNgNgNgNmNgNgNgNmNeGmNmNeGmNmNmNmNmNmNgNgNmNmNmNhYmNmNmNmNmNmNmNmNmNmNmNmNmNgNmNmNgNgNmNmNmNgNgNgNgNgNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNhYmNmNmNmNwtmNmNmNmNmNmNmNmNcCmNmNmNmNmNmNmNwtmNmNmNmNmNmNaFmNmNmNmNaFmNmNmNmNmNmNmNmNmNeGmNmNlFmNmNmNmNmNmNmNmNmNhYmNmNmNmNmNmNmNmNmNmNmNmNmNwtmNmNmNmNmNhXmNmNmNmNmNmNmNmNblmNhYmNmNmNmNmNav
hPmcmcmcmcmcmcmcmcmcmcmcmcmcmNmNmNmNmNmNgNababababababababababmNmNgNmNmNmNmNmNmNmNmNgNgNmNmNmNmNmNmNgNgNgNmNgNgNmNgNgNmNacbMbPbPbPbWacacacbMbPbPbPbWacmNgNgNgNgNgNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNaFmNmNmNmNmNmNmNhXmNmNmNmNeGmNmNmNeGcCmNmNmNfBmNmNmNmNmNmNmNlFmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNaFmNmNmNmNeGmNmNmNmNmNblmNmNmNmNmNmNmNav
hPmcmcmcmcmcmcmcmcmcmcmcmcmcmNmNmNmNgNgNgNabababbZcfcgclcwabababababmNgNmNmNmNmNmNgNgNgNgNmNmNmNaccxcycycydKaccxcycycydKacdzfvcDfvfldgdadgflfvcDfvdzacbMbPbPbPbPbPbWacgNmNgNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNaFmNmNmNmNmNmNmNmNmNmNmNmNmNmNhXmNPchXmNmNmNmNcCmNmNlFmNmNcCmNmNmNmNmNmNmNmNmNmNmNdqmNmNmNmNmNmNmNmNmNmNmNhXmNmNfByfmNmNmNmNmNmNwtblmNmNmNmNmNmNmNav
hPmcmcmcmcmcmcmcmcmcmcmcmcmcmNmNmNmNgNgNgNabababbZcfcgclcwabababababmNgNmNmNmNmNmNgNgNgNgNmNmNmNaccxcycycydKaccxcycycydKacdzfvcDfvfldgfpdgflfvcDfvdzacbMbPbPbPbPbPbWacgNmNgNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNaFmNmNmNmNmNmNmNmNmNmNmNmNmNmNhXmNPchXmNmNmNmNcCmNmNlFmNmNcCmNmNmNmNmNmNmNmNmNmNmNdqmNmNmNmNmNmNmNmNmNmNmNhXmNmNfByfmNmNmNmNmNmNwtblmNmNmNmNmNmNmNav
hPmcmcmcmcmcmcmcmcmcmcmcmcmcgNmNmNgNgNgNgNdrcqabdAdJdJdJdRabdTdXabababababgNgNgNmNOuUgUggNgNmNmNacSWekekekkaeOyZyZffyZyZCLdzfvfvfvflfpfpfpflfvfvfvdzfCYjYjfIYjYjHheFacbMbWacmNmNmNgNmNgNmNmNmNgNgNmNgNgNgNgNgNgNmNgNgNgNgNgNgNmNgNgNgNmNmNmNmNmNmNwtmNmNhXmNmNmNfBmNmNmNmNaFhXmNmNfXmNmNmNmNmNmNhXmNmNmNmNcCmNmNmNmNmNmNmNeGmNmNmNmNmNhXmNmNhXmNmNmNmNdqmNmNmNmNblmNmNmNmNhXmNmNav
hPmcmcmcmcmcmcmcmcmcmcmcmcmcmNgNgNgNgNgNgNdrcqabfQfYgbgcdJgmdJdJgogpgvgAababababababgDgGacacacacacgZqphbhDcMeFeZeZbNeZeZeZdzdzdzdzflflflflfldzdzdzdzIqIqIqbDIqIqeFeFiKgyzlaPjojpjpjpjvaPjwjHjHjHjIaPjJjWjWjWkgaPbMbPbPbPbPbPbPbPbPbPbWacacgNmNmNmNmNmNmNmNmNmNmNmNfBmNmNfBhYmNmNmNlFmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNhXmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNblmNmNwtmNmNmNmNav
hPmcmcmcmcmcmcmcmcmcmcmcmcmcmNmNmNgNgNcpgNdrcqabababababababkDdJlRdJdJwHabababababablSlWacnAlXacJcmomvmwmycMeFbNbNbNbNbNbNeFeFeFdzdzdzdzdzdzdzeFeFeFbDbDbDbDbDbDeFeFMzfhNGaPmOKusuMIkTaPmOfGsuMIkTaPmOfGsuMIkTaPoZoZoZikoZqWxzMexexeTxacacacacmNmNgNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNlFaFmNmNmNmNmNmNmNmNmNmNmNmNhXmNmNmNmNmNmNmNmNwtmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNblmNmNmNmNmNeGmNav
@@ -13,6 +13,7 @@
/obj/item/clothing/under/rank/chief_medical_officer/skirt,
/obj/item/clothing/suit/storage/toggle/labcoat/cmo,
/obj/item/clothing/suit/storage/toggle/labcoat/cmoalt,
/obj/item/clothing/suit/storage/toggle/labcoat/modern/cmo,
/obj/item/weapon/cartridge/cmo,
/obj/item/clothing/gloves/sterile/latex,
/obj/item/clothing/shoes/brown,
@@ -60,6 +60,10 @@
allowed_spawns = list("Arrivals Shuttle","Gateway","Cryogenic Storage","Cyborg Storage")
/datum/map/virgo_minitest/New()
..()
SSticker.start_immediately = TRUE
/datum/map_z_level/minitest/station
z = Z_LEVEL_MAIN_VIRGO_TESTING
name = "Station Level"
BIN
View File
Binary file not shown.
+9 -1
View File
@@ -78,13 +78,21 @@ export const createSearch = (searchText, stringifier) => {
};
};
export const isUppercase = chr => {
return chr.toUpperCase() === chr;
};
export const capitalize = str => {
// Handle array
if (Array.isArray(str)) {
return str.map(capitalize);
}
// Handle string
return str.charAt(0).toUpperCase() + str.slice(1).toLowerCase();
let chr = str.charAt(0);
if (isUppercase(chr)) {
return str; // Already caps, might be an acronym, so don't mess it up by lowercasing the rest
}
return chr.toUpperCase() + str.slice(1).toLowerCase();
};
export const toTitleCase = str => {
File diff suppressed because one or more lines are too long
+11 -10
View File
@@ -20,14 +20,15 @@ THE SOFTWARE.
import argparse, re, sys
from collections import defaultdict
from os import path, walk
from codecs import open
opt = argparse.ArgumentParser()
opt.add_argument('dir', help='The directory to scan for *.dm files with non-matching spans')
args = opt.parse_args()
if(not path.isdir(args.dir)):
print('Not a directory')
sys.exit(1)
print('Not a directory')
sys.exit(1)
# These tuples are expected to be ordered as:
# A unique human readable name (henceforth referred to as tuple name), a regex pattern matching an opening tag, a regex pattern matching a closing tag
@@ -54,13 +55,13 @@ def get_tag_matches(line):
# Support def that simply checks if a given dictionary in the format tag/list of unmatched lines has mismatch entries.
def has_mismatch(match_list):
for tag, list_of_mismatched_lines in match_list.iteritems():
for tag, list_of_mismatched_lines in match_list.items():
if(len(list_of_mismatched_lines) > 0):
return 1
return 0
def arrange_mismatches(mismatches_by_tag, mismatch_line, mismatch_counts):
for tag, mismatch_count in mismatch_counts.iteritems():
for tag, mismatch_count in mismatch_counts.items():
stack_of_existing_mismatches = mismatches_by_tag[tag]
for i in range(0, abs(mismatch_count)):
if len(stack_of_existing_mismatches) == 0:
@@ -83,10 +84,10 @@ def arrange_mismatches(mismatches_by_tag, mismatch_line, mismatch_counts):
# This section parses all *.dm files in the given directory, recursively.
for root, subdirs, files in walk(args.dir):
for filename in files:
if filename.endswith('.dm'):
file_path = path.join(root, filename)
with open(file_path, 'r') as file:
for filename in files:
if filename.endswith('.dm'):
file_path = path.join(root, filename)
with open(file_path, 'r', encoding='utf-8', errors='ignore') as file:
mismatches_by_file[file_path] = defaultdict(list)
for line_number, line in enumerate(file, 1):
# Then for each line in the file, conduct the tuple open/close matching.
@@ -97,10 +98,10 @@ for root, subdirs, files in walk(args.dir):
# Loops over all matches and checks if there is a mismatch of tags.
# If so, then and only then is the corresponding file path printed along with the number of unmatched open/close tags.
total_mismatches = 0
for file, mismatches_by_tag in mismatches_by_file.iteritems():
for file, mismatches_by_tag in mismatches_by_file.items():
if has_mismatch(mismatches_by_tag):
print(file)
for tag, mismatch_list in mismatches_by_tag.iteritems():
for tag, mismatch_list in mismatches_by_tag.items():
# A positive number means an excess of opening tag, a negative number means an excess of closing tags.
total_mismatches += len(mismatch_list)
if len(mismatch_list) > 0:
+2
View File
@@ -2142,7 +2142,9 @@
#include "code\modules\clothing\suits\hooded_vr.dm"
#include "code\modules\clothing\suits\hooded_yw.dm"
#include "code\modules\clothing\suits\jobs.dm"
#include "code\modules\clothing\suits\jobs_vr.dm"
#include "code\modules\clothing\suits\labcoat.dm"
#include "code\modules\clothing\suits\labcoat_vr.dm"
#include "code\modules\clothing\suits\miscellaneous.dm"
#include "code\modules\clothing\suits\miscellaneous_vr.dm"
#include "code\modules\clothing\suits\solgov.dm"