Merge pull request #1493 from VOREStation/aro-tether-wip

Tether Map
This commit is contained in:
Arokha Sieyes
2017-05-20 17:19:32 -04:00
committed by GitHub
281 changed files with 24686 additions and 690 deletions
+2 -2
View File
@@ -171,12 +171,12 @@ var/global/list/pipe_colors = list("grey" = PIPE_COLOR_GREY, "red" = PIPE_COLOR_
if(!omni_icons)
omni_icons = new()
var/icon/omni = new('icons/atmos/omni_devices.dmi')
var/icon/omni = new('icons/atmos/omni_devices_vr.dmi') //VOREStation Edit - New Icons
for(var/state in omni.IconStates())
if(!state || findtext(state, "map"))
continue
omni_icons[state] = image('icons/atmos/omni_devices.dmi', icon_state = state)
omni_icons[state] = image('icons/atmos/omni_devices_vr.dmi', icon_state = state) //VOREStation Edit - New Icons
/datum/pipe_icon_manager/proc/gen_underlay_icons()
@@ -0,0 +1,271 @@
#define MATERIAL_ALGAE "algae"
#define MATERIAL_CARBON "carbon"
/obj/machinery/atmospherics/binary/algae_farm
name = "algae oxygen generator"
desc = "An oxygen generator using algae to convert carbon dioxide to oxygen."
icon = 'icons/obj/machines/algae_vr.dmi'
icon_state = "algae-off"
circuit = /obj/item/weapon/circuitboard/algae_farm
anchored = 1
density = 1
use_power = 2
idle_power_usage = 100 // Minimal lights to keep algae alive
active_power_usage = 5000 // Powerful grow lights to stimulate oxygen production
//power_rating = 7500 //7500 W ~ 10 HP
var/list/stored_material = list(MATERIAL_ALGAE = 10000, MATERIAL_CARBON = 0)
// Capacity increases with matter bin quality
var/list/storage_capacity = list(MATERIAL_ALGAE = 10000, MATERIAL_CARBON = 10000)
// Speed at which we convert CO2 to O2. Increases with manipulator quality
var/moles_per_tick = 1
// Power required to convert one mole of CO2 to O2 (this is powering the grow lights). Improves with capacitors
var/power_per_mole = 1000
var/algae_per_mole = 2
var/carbon_per_mole = 2
var/recent_power_used = 0
var/recent_moles_transferred = 0
var/ui_error = null // For error messages to show up in nano ui.
var/datum/gas_mixture/internal = new()
var/const/input_gas = "carbon_dioxide"
var/const/output_gas = "oxygen"
/obj/machinery/atmospherics/binary/algae_farm/New()
..()
desc = initial(desc) + " Its outlet port is to the [dir2text(dir)]."
default_apply_parts()
update_icon()
// TODO - Make these in acutal icon states so its not silly like this
var/image/I = image(icon = icon, icon_state = "algae-pipe-overlay", dir = dir)
I.color = PIPE_COLOR_BLUE
overlays += I
I = image(icon = icon, icon_state = "algae-pipe-overlay", dir = reverse_dir[dir])
I.color = PIPE_COLOR_BLACK
overlays += I
/obj/machinery/atmospherics/binary/algae_farm/Destroy()
..()
internal = null
/obj/machinery/atmospherics/binary/algae_farm/process()
..()
recent_moles_transferred = 0
if(inoperable() || use_power < 2)
return 0
// STEP 1 - Check material resources
if(stored_material[MATERIAL_ALGAE] < algae_per_mole)
ui_error = "Insufficient [material_display_name(MATERIAL_ALGAE)] to process."
return
if(stored_material[MATERIAL_CARBON] + carbon_per_mole > storage_capacity[MATERIAL_CARBON])
ui_error = "[material_display_name(MATERIAL_CARBON)] output storage is full."
return
var/moles_to_convert = min(moles_per_tick,\
stored_material[MATERIAL_ALGAE] * algae_per_mole,\
storage_capacity[MATERIAL_CARBON] - stored_material[MATERIAL_CARBON] * carbon_per_mole)
// STEP 2 - Take the CO2 out of the input!
var/power_draw = scrub_gas(src, list(input_gas), air1, internal, moles_to_convert)
if(network1)
network1.update = 1
if (power_draw > 0)
use_power(power_draw)
last_power_draw += power_draw
// STEP 3 - Convert CO2 to O2 (Note: We know our internal group multipier is 1, so just be cool)
var/co2_moles = internal.gas[input_gas]
if(co2_moles < MINIMUM_MOLES_TO_FILTER)
ui_error = "Insufficient [gas_data.name[input_gas]] to process."
return
// STEP 4 - Consume the resources
var/converted_moles = min(co2_moles, moles_per_tick)
use_power(converted_moles * power_per_mole)
last_power_draw += converted_moles * power_per_mole
stored_material[MATERIAL_ALGAE] -= converted_moles * algae_per_mole
stored_material[MATERIAL_CARBON] += converted_moles * carbon_per_mole
// STEP 5 - Output the converted oxygen. Fow now we output for free!
internal.adjust_gas(input_gas, -converted_moles)
air2.adjust_gas_temp(output_gas, converted_moles, internal.temperature)
if(network2)
network2.update = 1
recent_moles_transferred = converted_moles
ui_error = null // Success!
update_icon()
/obj/machinery/atmospherics/binary/algae_farm/update_icon()
if(inoperable() || !anchored)
icon_state = "algae-off"
else if(recent_moles_transferred >= moles_per_tick)
icon_state = "aglae-full"
else if(recent_moles_transferred > 0)
icon_state = "algae-full"
else
icon_state = "algae-on"
return 1
/obj/machinery/atmospherics/binary/algae_farm/attackby(obj/item/weapon/W as obj, mob/user as mob)
src.add_fingerprint(user)
if(default_deconstruction_screwdriver(user, W))
return
if(default_deconstruction_crowbar(user, W))
return
if(try_load_materials(user, W))
return
else
user << "<span class='notice'>You cannot insert this item into \the [src]!</span>"
return
/obj/machinery/atmospherics/binary/algae_farm/attack_hand(mob/user)
if(..()) return 1
ui_interact(user)
/obj/machinery/atmospherics/binary/algae_farm/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1, var/datum/nano_ui/master_ui = null, var/datum/topic_state/state = default_state)
var/data[0]
data["panelOpen"] = panel_open
var/materials_ui[0]
for(var/M in stored_material)
materials_ui[++materials_ui.len] = list(
"name" = M,
"display" = material_display_name(M),
"qty" = stored_material[M],
"max" = storage_capacity[M],
"percent" = (stored_material[M] / storage_capacity[M] * 100))
data["materials"] = materials_ui
data["last_flow_rate"] = last_flow_rate
data["last_power_draw"] = last_power_draw
data["inputDir"] = dir2text(reverse_dir[dir])
data["outputDir"] = dir2text(dir)
data["usePower"] = use_power
data["errorText"] = ui_error
if(air1 && network1 && node1)
data["input"] = list(
"pressure" = air1.return_pressure(),
"name" = gas_data.name[input_gas],
"percent" = air1.total_moles > 0 ? round((air1.gas[input_gas] / air1.total_moles) * 100) : 0,
"moles" = round(air1.gas[input_gas], 0.01))
if(air2 && network2 && node2)
data["output"] = list(
"pressure" = air2.return_pressure(),
"name" = gas_data.name[output_gas],
"percent" = air2.total_moles ? round((air2.gas[output_gas] / air2.total_moles) * 100) : 0,
"moles" = round(air2.gas[output_gas], 0.01))
// update the ui if it exists, returns null if no ui is passed/found
ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
if (!ui)
ui = new(user, src, ui_key, "algae_farm_vr.tmpl", "Algae Farm Control Panel", 500, 600)
ui.set_initial_data(data)
ui.set_auto_update(TRUE)
ui.open()
/obj/machinery/atmospherics/binary/algae_farm/Topic(href, href_list)
if(..())
return 1
usr.set_machine(src)
add_fingerprint(usr)
// Queue management can be done even while busy
if(href_list["activate"])
update_use_power(2)
update_icon()
updateUsrDialog()
return
if(href_list["deactivate"])
update_use_power(1)
update_icon()
updateUsrDialog()
return
if(href_list["ejectMaterial"])
var/matName = href_list["ejectMaterial"]
if(!(matName in stored_material))
return
eject_materials(matName, 0)
updateUsrDialog()
return
// TODO - These should be replaced with materials datum.
// 0 amount = 0 means ejecting a full stack; -1 means eject everything
/obj/machinery/atmospherics/binary/algae_farm/proc/eject_materials(var/material_name, var/amount)
var/recursive = amount == -1 ? 1 : 0
var/material/matdata = get_material_by_name(material_name)
var/stack_type = matdata.stack_type
var/obj/item/stack/material/S = new stack_type(loc)
if(amount <= 0)
amount = S.max_amount
var/ejected = min(round(stored_material[material_name] / S.perunit), amount)
S.amount = min(ejected, amount)
if(S.amount <= 0)
qdel(S)
return
stored_material[material_name] -= ejected * S.perunit
if(recursive && stored_material[material_name] >= S.perunit)
eject_materials(material_name, -1)
// Attept to load materials. Returns 0 if item wasn't a stack of materials, otherwise 1 (even if failed to load)
/obj/machinery/atmospherics/binary/algae_farm/proc/try_load_materials(var/mob/user, var/obj/item/stack/material/S)
if(!istype(S))
return 0
if(!(S.material.name in stored_material))
user << "<span class='warning'>\The [src] doesn't accept [material_display_name(S.material)]!</span>"
return 1
var/max_res_amount = storage_capacity[S.material.name]
if(stored_material[S.material.name] + S.perunit <= max_res_amount)
var/count = 0
while(stored_material[S.material.name] + S.perunit <= max_res_amount && S.amount >= 1)
stored_material[S.material.name] += S.perunit
S.use(1)
count++
user.visible_message("\The [user] inserts [S.name] into \the [src].", "<span class='notice'>You insert [count] [S.name] into \the [src].</span>")
updateUsrDialog()
else
user << "<span class='warning'>\The [src] cannot hold more [S.name].</span>"
return 1
/material/algae
name = MATERIAL_ALGAE
stack_type = /obj/item/stack/material/algae
icon_colour = "#557722"
shard_type = SHARD_STONE_PIECE
weight = 10
hardness = 10
sheet_singular_name = "sheet"
sheet_plural_name = "sheets"
/obj/item/stack/material/algae
name = "algae sheet"
icon_state = "sheet-uranium"
color = "#557722"
default_type = MATERIAL_ALGAE
/material/carbon
name = MATERIAL_CARBON
stack_type = /obj/item/stack/material/carbon
icon_colour = "#303030"
shard_type = SHARD_SPLINTER
weight = 5
hardness = 20
icon_base = "stone"
icon_reinf = "reinf_stone"
door_icon_base = "stone"
sheet_singular_name = "sheet"
sheet_plural_name = "sheets"
/obj/item/stack/material/carbon
name = "carbon sheet"
icon_state = "sheet-metal"
color = "#303030"
default_type = MATERIAL_CARBON
#undef MATERIAL_ALGAE
#undef MATERIAL_CARBON
@@ -3,7 +3,7 @@
//--------------------------------------------
/obj/machinery/atmospherics/omni
name = "omni device"
icon = 'icons/atmos/omni_devices.dmi'
icon = 'icons/atmos/omni_devices_vr.dmi' //VOREStation Edit - New Icon
icon_state = "base"
use_power = 1
initialize_directions = 0
@@ -4,7 +4,7 @@
/obj/machinery/atmospherics/unary/freezer
name = "gas cooling system"
desc = "Cools gas when connected to pipe network"
icon = 'icons/obj/Cryogenic2.dmi'
icon = 'icons/obj/Cryogenic2_vr.dmi'
icon_state = "freezer_0"
density = 1
anchored = 1
@@ -4,7 +4,7 @@
/obj/machinery/atmospherics/unary/heater
name = "gas heating system"
desc = "Heats gas when connected to a pipe network"
icon = 'icons/obj/Cryogenic2.dmi'
icon = 'icons/obj/Cryogenic2_vr.dmi'
icon_state = "heater_0"
density = 1
anchored = 1
+1 -1
View File
@@ -1053,7 +1053,7 @@
/obj/machinery/atmospherics/pipe/tank
icon = 'icons/atmos/tank.dmi'
icon = 'icons/atmos/tank_vr.dmi' //VOREStation Edit - New Icons
icon_state = "air_map"
name = "Pressure Tank"
+10
View File
@@ -87,6 +87,12 @@ Class Procs:
/datum/controller/air_system/var/next_id = 1 //Used to keep track of zone UIDs.
#if UNIT_TEST
#define CHECK_SLEEP_ZAS_SETUP // For unit tests we don't care about a smooth lobby screen experience. We care about speed.
#else
#define CHECK_SLEEP_ZAS_SETUP if(++done_turfs > 10000) { done_turfs=0;sleep(world.tick_lag); }
#endif
/datum/controller/air_system/proc/Setup()
//Purpose: Call this at the start to setup air groups geometry
// (Warning: Very processor intensive but only must be done once per round)
@@ -94,6 +100,9 @@ Class Procs:
//Inputs: None.
//Outputs: None.
#if !UNIT_TEST
var/done_turfs = 0
#endif
#ifndef ZASDBG
set background = 1
#endif
@@ -108,6 +117,7 @@ Class Procs:
for(var/turf/simulated/S in world)
simulated_turf_count++
S.update_air_properties()
CHECK_SLEEP_ZAS_SETUP
admin_notice({"<span class='danger'>Geometry initialized in [round(0.1*(world.timeofday-start_time),0.1)] seconds.</span>
<span class='info'>
+1 -1
View File
@@ -28,7 +28,7 @@ Notes for people who used ZAS before:
*/
//#define ZASDBG
//#define MULTIZAS
#define MULTIZAS
#define AIR_BLOCKED 1
#define ZONE_BLOCKED 2
#define BLOCKED 3
+54
View File
@@ -0,0 +1,54 @@
/*This file is a list of all preclaimed planes & layers
All planes & layers should be given a value here instead of using a magic/arbitrary number.
After fiddling with planes and layers for some time, I figured I may as well provide some documentation:
What are planes?
Think of Planes as a sort of layer for a layer - if plane X is a larger number than plane Y, the highest number for a layer in X will be below the lowest
number for a layer in Y.
Planes also have the added bonus of having planesmasters.
What are Planesmasters?
Planesmasters, when in the sight of a player, will have its appearance properties (for example, colour matrices, alpha, transform, etc)
applied to all the other objects in the plane. This is all client sided.
Usually you would want to add the planesmaster as an invisible image in the client's screen.
What can I do with Planesmasters?
You can: Make certain players not see an entire plane,
Make an entire plane have a certain colour matrices,
Make an entire plane transform in a certain way,
Make players see a plane which is hidden to normal players - I intend to implement this with the antag HUDs for example.
Planesmasters can be used as a neater way to deal with client images or potentially to do some neat things
How do planes work?
A plane can be any integer from -100 to 100. (If you want more, bug lummox.)
All planes above 0, the 'base plane', are visible even when your character cannot 'see' them, for example, the HUD.
All planes below 0, the 'base plane', are only visible when a character can see them.
How do I add a plane?
Think of where you want the plane to appear, look through the pre-existing planes and find where it is above and where it is below
Slot it in in that place, and change the pre-existing planes, making sure no plane shares a number.
Add a description with a comment as to what the plane does.
How do I make something a planesmaster?
Add the PLANE_MASTER appearance flag to the appearance_flags variable.
What is the naming convention for planes or layers?
Make sure to use the name of your object before the _LAYER or _PLANE, eg: [NAME_OF_YOUR_OBJECT HERE]_LAYER or [NAME_OF_YOUR_OBJECT HERE]_PLANE
Also, as it's a define, it is standard practice to use capital letters for the variable so people know this.
*/
#define DEFAULT_PLANE 0 // BYOND's default value for plane, the "base plane"
#define SPACE_PLANE -32 // Reserved for use in space/parallax
#define PARALLAX_PLANE -30 // Reserved for use in space/parallax
// OPENSPACE_PLANE reserves all planes between OPENSPACE_PLANE_START and OPENSPACE_PLANE_END inclusive
#define OPENSPACE_PLANE_START -23
#define OPENSPACE_PLANE_END -8
#define OPENSPACE_PLANE -25 // /turf/simulated/open will use OPENSPACE_PLANE + z (Valid z's being 2 thru 17)
#define OVER_OPENSPACE_PLANE -7
+49
View File
@@ -0,0 +1,49 @@
//
// Constants and standard colors for the holomap
//
#define WORLD_ICON_SIZE 32 // Size of a standard tile in pixels (world.icon_size)
#define PIXEL_MULTIPLIER WORLD_ICON_SIZE/32 // Convert from normal icon size of 32 to whatever insane thing this server is using.
#define HOLOMAP_ICON 'icons/480x480_vr.dmi' // Icon file to start with when drawing holomaps (to get a 480x480 canvas).
#define ui_holomap "CENTER-7, CENTER-7" // Screen location of the holomap "hud"
// Holomap colors
#define HOLOMAP_OBSTACLE "#FFFFFFDD" // Color of walls and barriers
#define HOLOMAP_PATH "#66666699" // Color of floors
#define HOLOMAP_ROCK "#66666644" // Color of mineral walls
#define HOLOMAP_HOLOFIER "#79FF79" // Whole map is multiplied by this to give it a green holoish look
#define HOLOMAP_AREACOLOR_COMMAND "#0000F099"
#define HOLOMAP_AREACOLOR_SECURITY "#AE121299"
#define HOLOMAP_AREACOLOR_MEDICAL "#447FC299"
#define HOLOMAP_AREACOLOR_SCIENCE "#A154A699"
#define HOLOMAP_AREACOLOR_ENGINEERING "#F1C23199"
#define HOLOMAP_AREACOLOR_CARGO "#E06F0099"
#define HOLOMAP_AREACOLOR_HALLWAYS "#FFFFFF66"
#define HOLOMAP_AREACOLOR_ARRIVALS "#0000FFCC"
#define HOLOMAP_AREACOLOR_ESCAPE "#FF0000CC"
#define HOLOMAP_AREACOLOR_DORMS "#CCCC0099"
// Handy defines to lookup the pixel offsets for this Z-level. Cache these if you use them in a loop tho.
#define HOLOMAP_PIXEL_OFFSET_X(zLevel) ((using_map.holomap_offset_x.len >= zLevel) ? using_map.holomap_offset_x[zLevel] : 0)
#define HOLOMAP_PIXEL_OFFSET_Y(zLevel) ((using_map.holomap_offset_y.len >= zLevel) ? using_map.holomap_offset_y[zLevel] : 0)
#define HOLOMAP_LEGEND_X(zLevel) ((using_map.holomap_legend_x.len >= zLevel) ? using_map.holomap_legend_x[zLevel] : 96)
#define HOLOMAP_LEGEND_Y(zLevel) ((using_map.holomap_legend_y.len >= zLevel) ? using_map.holomap_legend_y[zLevel] : 96)
// VG stuff we probably won't use
// #define HOLOMAP_FILTER_DEATHSQUAD 1
// #define HOLOMAP_FILTER_ERT 2
// #define HOLOMAP_FILTER_NUKEOPS 4
// #define HOLOMAP_FILTER_ELITESYNDICATE 8
// #define HOLOMAP_FILTER_VOX 16
// #define HOLOMAP_FILTER_STATIONMAP 32
// #define HOLOMAP_FILTER_STATIONMAP_STRATEGIC 64//features markers over the captain's office, the armory, the SMES
// #define HOLOMAP_MARKER_SMES "smes"
// #define HOLOMAP_MARKER_DISK "diskspawn"
// #define HOLOMAP_MARKER_SKIPJACK "skipjack"
// #define HOLOMAP_MARKER_SYNDISHUTTLE "syndishuttle"
#define HOLOMAP_EXTRA_STATIONMAP "stationmapformatted"
#define HOLOMAP_EXTRA_STATIONMAPAREAS "stationareas"
#define HOLOMAP_EXTRA_STATIONMAPSMALL "stationmapsmall"
+2
View File
@@ -87,6 +87,7 @@
#define SHUTTLE_IDLE 0
#define SHUTTLE_WARMUP 1
#define SHUTTLE_INTRANSIT 2
#define SHUTTLE_CRASHED 3 // VOREStation Edit - Yup that can happen now
// Ferry shuttle processing status.
#define IDLE_STATE 0
@@ -126,6 +127,7 @@
#define HUD_LAYER 20 //Above lighting, but below obfuscation. For in-game HUD effects (whereas SCREEN_LAYER is for abstract/OOC things like inventory slots)
#define OBFUSCATION_LAYER 21 //Where images covering the view for eyes are put
#define SCREEN_LAYER 22 //Mob HUD/effects layer
#define ABOVE_WINDOW_LAYER 3.25 //Above full tile windows so wall items are clickable // VOREStation Edit
// Convoluted setup so defines can be supplied by Bay12 main server compile script.
// Should still work fine for people jamming the icons into their repo.
+15 -1
View File
@@ -12,7 +12,8 @@ var/list/global_huds = list(
global_hud.nvg,
global_hud.thermal,
global_hud.meson,
global_hud.science
global_hud.science,
global_hud.holomap
)
/datum/hud/var/obj/screen/grab_intent
@@ -30,6 +31,7 @@ var/list/global_huds = list(
var/obj/screen/thermal
var/obj/screen/meson
var/obj/screen/science
var/obj/screen/holomap
/datum/global_hud/proc/setup_overlay(var/icon_state)
var/obj/screen/screen = new /obj/screen()
@@ -69,6 +71,18 @@ var/list/global_huds = list(
meson = setup_overlay("meson_hud")
science = setup_overlay("science_hud")
// The holomap screen object is actually totally invisible.
// Station maps work by setting it as an images location before sending to client, not
// actually changing the icon or icon state of the screen object itself!
// Why do they work this way? I don't know really, that is how /vg designed them, but since they DO
// work this way, we can take advantage of their immutability by making them part of
// the global_hud (something we have and /vg doesn't) instead of an instance per mob.
holomap = new /obj/screen()
holomap.name = "holomap"
holomap.icon = null
holomap.screen_loc = ui_holomap
holomap.mouse_opacity = 0
var/obj/screen/O
var/i
//that nasty looking dither you get when you're short-sighted
+51 -29
View File
@@ -38,34 +38,18 @@ datum/controller/game_controller/proc/setup()
SetupXenoarch()
transfer_controller = new
admin_notice("<span class='danger'>Initializations complete.</span>", R_DEBUG)
#if UNIT_TEST
#define CHECK_SLEEP_MASTER // For unit tests we don't care about a smooth lobby screen experience. We care about speed.
#else
#define CHECK_SLEEP_MASTER if(++initialized_objects > 500) { initialized_objects=0;sleep(world.tick_lag); }
#endif
datum/controller/game_controller/proc/setup_objects()
admin_notice("<span class='danger'>Initializing objects</span>", R_DEBUG)
sleep(-1)
for(var/atom/movable/object in world)
if(isnull(object.gcDestroyed))
object.initialize()
admin_notice("<span class='danger'>Initializing areas</span>", R_DEBUG)
sleep(-1)
for(var/area/area in all_areas)
area.initialize()
admin_notice("<span class='danger'>Initializing pipe networks</span>", R_DEBUG)
sleep(-1)
for(var/obj/machinery/atmospherics/machine in machines)
machine.build_network()
admin_notice("<span class='danger'>Initializing atmos machinery.</span>", R_DEBUG)
sleep(-1)
for(var/obj/machinery/atmospherics/unary/U in machines)
if(istype(U, /obj/machinery/atmospherics/unary/vent_pump))
var/obj/machinery/atmospherics/unary/vent_pump/T = U
T.broadcast_status()
else if(istype(U, /obj/machinery/atmospherics/unary/vent_scrubber))
var/obj/machinery/atmospherics/unary/vent_scrubber/T = U
T.broadcast_status()
#if !UNIT_TEST
var/initialized_objects = 0
#endif
// Set up antagonists.
populate_antag_type_list()
@@ -73,12 +57,50 @@ datum/controller/game_controller/proc/setup_objects()
//Set up spawn points.
populate_spawn_points()
admin_notice("<span class='danger'>Initializing Floor Decals</span>", R_DEBUG)
var/list/turfs_with_decals = list()
for(var/obj/effect/floor_decal/D in world)
var/T = D.add_to_turf_decals()
if(T) turfs_with_decals |= T
CHECK_SLEEP_MASTER
for(var/item in turfs_with_decals)
var/turf/T = item
if(T.decals) T.apply_decals()
CHECK_SLEEP_MASTER
floor_decals_initialized = TRUE
sleep(1)
admin_notice("<span class='danger'>Initializing objects</span>", R_DEBUG)
for(var/obj/object in world)
if(isnull(object.gcDestroyed))
object.initialize()
CHECK_SLEEP_MASTER
sleep(1)
admin_notice("<span class='danger'>Initializing areas</span>", R_DEBUG)
for(var/area/area in all_areas)
area.initialize()
CHECK_SLEEP_MASTER
sleep(1)
admin_notice("<span class='danger'>Initializing pipe networks</span>", R_DEBUG)
for(var/obj/machinery/atmospherics/machine in machines)
machine.build_network()
CHECK_SLEEP_MASTER
admin_notice("<span class='danger'>Initializing atmos machinery.</span>", R_DEBUG)
for(var/obj/machinery/atmospherics/unary/U in machines)
if(istype(U, /obj/machinery/atmospherics/unary/vent_pump))
var/obj/machinery/atmospherics/unary/vent_pump/T = U
T.broadcast_status()
else if(istype(U, /obj/machinery/atmospherics/unary/vent_scrubber))
var/obj/machinery/atmospherics/unary/vent_scrubber/T = U
T.broadcast_status()
CHECK_SLEEP_MASTER
admin_notice("<span class='danger'>Initializing turbolifts</span>", R_DEBUG)
for(var/thing in turbolifts)
if(!deleted(thing))
var/obj/turbolift_map_holder/lift = thing
lift.initialize()
sleep(-1)
admin_notice("<span class='danger'>Initializations complete.</span>", R_DEBUG)
sleep(-1)
CHECK_SLEEP_MASTER
+210
View File
@@ -0,0 +1,210 @@
var/global/datum/shuttle_controller/shuttle_controller
/datum/shuttle_controller
var/list/shuttles //maps shuttle tags to shuttle datums, so that they can be looked up.
var/list/process_shuttles //simple list of shuttles, for processing
/datum/shuttle_controller/proc/process()
//process ferry shuttles
for (var/datum/shuttle/ferry/shuttle in process_shuttles)
if (shuttle.process_state)
shuttle.process()
//This is called by gameticker after all the machines and radio frequencies have been properly initialized
/datum/shuttle_controller/proc/setup_shuttle_docks()
for(var/shuttle_tag in shuttles)
var/datum/shuttle/shuttle = shuttles[shuttle_tag]
shuttle.init_docking_controllers()
shuttle.dock() //makes all shuttles docked to something at round start go into the docked state
for(var/obj/machinery/embedded_controller/C in machines)
if(istype(C.program, /datum/computer/file/embedded_program/docking))
C.program.tag = null //clear the tags, 'cause we don't need 'em anymore
/datum/shuttle_controller/New()
shuttles = list()
process_shuttles = list()
var/datum/shuttle/ferry/shuttle
//////////////////////////////////////////////////////////////
// Escape shuttle and pods
shuttle = new/datum/shuttle/ferry/emergency()
shuttle.location = 1 // At offsite
shuttle.warmup_time = 10
shuttle.area_offsite = locate(/area/shuttle/escape/centcom)
shuttle.area_station = locate(/area/shuttle/escape/station)
shuttle.area_transition = locate(/area/shuttle/escape/transit)
shuttle.docking_controller_tag = "escape_shuttle"
shuttle.dock_target_station = "escape_dock"
shuttle.dock_target_offsite = "centcom_dock"
shuttle.move_time = SHUTTLE_TRANSIT_DURATION_RETURN
shuttles["Escape"] = shuttle
process_shuttles += shuttle
//////////////////////////////////////////////////////////////
shuttle = new/datum/shuttle/ferry/escape_pod()
shuttle.location = 0 // At station
shuttle.warmup_time = 0
shuttle.area_station = locate(/area/shuttle/large_escape_pod1/station)
shuttle.area_offsite = locate(/area/shuttle/large_escape_pod1/centcom)
shuttle.area_transition = locate(/area/shuttle/large_escape_pod1/transit)
shuttle.docking_controller_tag = "large_escape_pod_1"
shuttle.dock_target_station = "large_escape_pod_1_berth"
shuttle.move_time = SHUTTLE_TRANSIT_DURATION_RETURN + rand(-30, 60) //randomize this so it seems like the pods are being picked up one by one
process_shuttles += shuttle
shuttles["Large Escape Pod 1"] = shuttle
//////////////////////////////////////////////////////////////
shuttle = new/datum/shuttle/ferry/escape_pod()
shuttle.location = 0 // At station
shuttle.warmup_time = 0
shuttle.area_station = locate(/area/shuttle/large_escape_pod2/station)
shuttle.area_offsite = locate(/area/shuttle/large_escape_pod2/centcom)
shuttle.area_transition = locate(/area/shuttle/large_escape_pod2/transit)
shuttle.docking_controller_tag = "large_escape_pod_2"
shuttle.dock_target_station = "large_escape_pod_2_berth"
shuttle.move_time = SHUTTLE_TRANSIT_DURATION_RETURN + rand(-30, 60) //randomize this so it seems like the pods are being picked up one by one
process_shuttles += shuttle
shuttles["Large Escape Pod 2"] = shuttle
//give the emergency shuttle controller it's shuttles
emergency_shuttle.shuttle = shuttles["Escape"]
emergency_shuttle.escape_pods = list(
shuttles["Large Escape Pod 1"],
shuttles["Large Escape Pod 2"],
)
//////////////////////////////////////////////////////////////
// Supply shuttle
shuttle = new/datum/shuttle/ferry/supply()
shuttle.location = 1
shuttle.warmup_time = 10
shuttle.area_offsite = locate(/area/supply/dock)
shuttle.area_station = locate(/area/supply/station)
shuttle.docking_controller_tag = "supply_shuttle"
shuttle.dock_target_station = "cargo_bay"
shuttles["Supply"] = shuttle
process_shuttles += shuttle
supply_controller.shuttle = shuttle
//////////////////////////////////////////////////////////////
// Trade Ship
shuttle = new()
shuttle.location = 1
shuttle.warmup_time = 10 //want some warmup time so people can cancel.
shuttle.area_offsite = locate(/area/shuttle/trade/centcom)
shuttle.area_station = locate(/area/shuttle/trade/station)
shuttle.docking_controller_tag = "trade_shuttle"
shuttle.dock_target_station = "trade_shuttle_dock_airlock"
shuttle.dock_target_offsite = "trade_shuttle_bay"
shuttles["Trade"] = shuttle
process_shuttles += shuttle
//////////////////////////////////////////////////////////////
// Away Mission Shuttle
var/datum/shuttle/multi_shuttle/AM = new/datum/shuttle/multi_shuttle()
AM.legit = 1
AM.origin = locate(/area/shuttle/awaymission/home)
AM.start_location = "NSS Adephagia (AM)"
AM.destinations = list(
"Old Engineering Base (AM)" = locate(/area/shuttle/awaymission/oldengbase)
)
AM.docking_controller_tag = "awaymission_shuttle"
AM.destination_dock_targets = list(
"NSS Adephagia (AM)" = "d1a2_dock_airlock"
)
var/area/awaym_dest = locate(/area/shuttle/awaymission/away)
if(awaym_dest.contents.len) //Otherwise this is an empty imaginary area
AM.destinations["Unknown Location [rand(1000,9999)]"] = awaym_dest
AM.announcer = "Automated Traffic Control"
//These seem backwards because they are written from the perspective of the merc and vox ships
AM.departure_message = "Attention. The away mission vessel is approaching the colony."
AM.arrival_message = "Attention. The away mission vessel is now leaving from the colony."
AM.interim = locate(/area/shuttle/awaymission/warp)
AM.move_time = 60
AM.warmup_time = 8
shuttles["AwayMission"] = AM
// TODO - Not implemented yet on new map
///////////////////////////////////////////////
//VOREStation Add - Belter Shuttle
// shuttle = new/datum/shuttle/ferry()
// shuttle.location = 0
// shuttle.warmup_time = 6
// shuttle.area_station = locate(/area/shuttle/belter/station)
// shuttle.area_offsite = locate(/area/shuttle/belter/belt/zone1)
// shuttle.area_transition = locate(/area/shuttle/belter/transit)
// shuttle.docking_controller_tag = "belter_docking"
// shuttle.dock_target_station = "belter_nodocking" //Fake tags to prevent the shuttle from opening doors.
// shuttle.dock_target_offsite = "belter_nodocking"
// shuttle.transit_direction = EAST
// shuttle.move_time = 60 + rand(10,40)
// process_shuttles += shuttle
// shuttles["Belter"] = shuttle
//VOREStation Add End - Belter Shuttle
//////////////////////////////////////////////////////////////
// Tether Shuttle
var/datum/shuttle/ferry/tether_backup/TB = new()
TB.location = 1 // At offsite
TB.warmup_time = 5
TB.move_time = 45
TB.area_offsite = locate(/area/shuttle/tether/surface)
TB.area_station = locate(/area/shuttle/tether/station)
TB.area_transition = locate(/area/shuttle/tether/transit)
TB.crash_areas = list(locate(/area/shuttle/tether/crash1), locate(/area/shuttle/tether/crash2))
TB.docking_controller_tag = "tether_shuttle"
TB.dock_target_station = "tether_dock_airlock"
TB.dock_target_offsite = "tether_pad_airlock"
shuttles["Tether Backup"] = TB
process_shuttles += TB
for(var/obj/structure/shuttle/engine/propulsion/E in TB.area_offsite)
TB.engines += E
for(var/obj/machinery/computer/shuttle_control/tether_backup/comp in TB.area_offsite)
TB.computer = comp
break
//////////////////////////////////////////////////////////////
// Antag Space "Proto Shuttle" Shuttle
AM = new/datum/shuttle/multi_shuttle()
AM.docking_controller_tag = "antag_space_shuttle"
AM.start_location = "Home Base"
AM.origin = locate(/area/shuttle/antag_space/base)
AM.interim = locate(/area/shuttle/antag_space/transit)
AM.destinations = list(
"Nearby" = locate(/area/shuttle/antag_space/north),
"Docks" = locate(/area/shuttle/antag_space/docks)
)
AM.destination_dock_targets = list("Home Base" = "antag_space_dock")
AM.move_time = 60
AM.warmup_time = 8
shuttles["Proto"] = AM
//////////////////////////////////////////////////////////////
// Antag Surface "Land Crawler" Shuttle
AM = new/datum/shuttle/multi_shuttle()
AM.docking_controller_tag = "antag_ground_shuttle"
AM.start_location = "Home Base"
AM.origin = locate(/area/shuttle/antag_ground/base)
AM.interim = locate(/area/shuttle/antag_ground/transit)
AM.destinations = list(
"Solar Array" = locate(/area/shuttle/antag_ground/solars),
"Mining Outpost" = locate(/area/shuttle/antag_ground/mining)
)
AM.destination_dock_targets = list("Home Base" = "antag_ground_dock")
AM.move_time = 60
AM.warmup_time = 8
shuttles["Land Crawler"] = AM
+21 -1
View File
@@ -11,4 +11,24 @@
/datum/category_item/autolathe/arms/speedloader_357_rubber
name = "speedloader (.357 rubber)"
path =/obj/item/ammo_magazine/a357/rubber
hidden = 1
hidden = 1
/datum/category_item/autolathe/arms/speedloader_44
name = "speedloader (.44)"
path =/obj/item/ammo_magazine/a44sl
hidden = 1
/datum/category_item/autolathe/arms/speedloader_44_rubber
name = "speedloader (.44 rubber)"
path =/obj/item/ammo_magazine/a44sl/rubber
hidden = 1
/datum/category_item/autolathe/arms/mag_44
name = "magazine (.44)"
path =/obj/item/ammo_magazine/a44
hidden = 1
/datum/category_item/autolathe/arms/mag_44_rubber
name = "magazine (.44 rubber)"
path =/obj/item/ammo_magazine/a44/rubber
hidden = 1
+5 -4
View File
@@ -7,12 +7,12 @@ var/global/datum/repository/crew/crew_repository = new()
cache_data = list()
..()
/datum/repository/crew/proc/health_data(var/turf/T)
/datum/repository/crew/proc/health_data(var/zLevel)
var/list/crewmembers = list()
if(!T)
if(!zLevel)
return crewmembers
var/z_level = "[T.z]"
var/z_level = "[zLevel]"
var/datum/cache_entry/cache_entry = cache_data[z_level]
if(!cache_entry)
cache_entry = new/datum/cache_entry
@@ -24,7 +24,7 @@ var/global/datum/repository/crew/crew_repository = new()
var/tracked = scan()
for(var/obj/item/clothing/under/C in tracked)
var/turf/pos = get_turf(C)
if((C) && (C.has_sensor) && (pos) && (T && pos.z == T.z) && (C.sensor_mode != SUIT_SENSOR_OFF))
if((C) && (C.has_sensor) && (pos) && (pos.z == zLevel) && (C.sensor_mode != SUIT_SENSOR_OFF))
if(istype(C.loc, /mob/living/carbon/human))
var/mob/living/carbon/human/H = C.loc
if(H.w_uniform != C)
@@ -51,6 +51,7 @@ var/global/datum/repository/crew/crew_repository = new()
crewmemberData["area"] = sanitize(A.name)
crewmemberData["x"] = pos.x
crewmemberData["y"] = pos.y
crewmemberData["z"] = pos.z
crewmembers[++crewmembers.len] = crewmemberData
+1
View File
@@ -1443,6 +1443,7 @@ area/space/atmosalert()
name = "\improper Library"
icon_state = "library"
sound_env = LARGE_SOFTFLOOR
lightswitch = 0 // VOREStation Edit - We like dark libraries
/area/library_conference_room
name = "\improper Library Conference Room"
+62 -22
View File
@@ -145,49 +145,89 @@
/area/houseboat/bridge
name = "Houseboat - Bridge"
icon_state = "red"
icon_state = "blue2"
/area/houseboat/neck
name = "Houseboat - Neck"
icon_state = "blue"
icon_state = "blue2"
/area/houseboat/cap_room
name = "Houseboat - Captain's Room"
icon_state = "blue2"
/area/houseboat/guest_room
name = "Houseboat - Guest Room"
icon_state = "blue"
/area/houseboat/office
name = "Houseboat - Office"
icon_state = "red2"
/area/houseboat/teleporter
name = "Houseboat - Teleporter"
icon_state = "blue"
icon_state = "blue2"
/area/houseboat/robotics
name = "Houseboat - Robotics"
icon_state = "red2"
icon_state = "blue2"
/area/houseboat/cargo
name = "Houseboat - Cargo"
icon_state = "blue2"
/area/houseboat/medical
name = "Houseboat - Medical"
icon_state = "red"
icon_state = "blue2"
/area/houseboat/engineering
name = "Houseboat - Engineering"
icon_state = "red2"
icon_state = "blue2"
/area/houseboat/shower
name = "Houseboat - Shower"
icon_state = "blue2"
/area/houseboat/toilet
name = "Houseboat - Toilet"
icon_state = "red2"
/area/houseboat/docking
name = "Houseboat - Docking"
icon_state = "blue2"
/area/houseboat/airlock
name = "Houseboat - Airlock"
icon_state = "red"
/area/houseboat/common_area
name = "Houseboat - Common Area"
icon_state = "blue2"
/area/houseboat/dining_area
name = "Houseboat - Dining Area"
icon_state = "red"
icon_state = "blue2"
/area/houseboat/holodeck_area
name = "Houseboat - Holodeck"
icon_state = "blue2"
/area/houseboat/lockers
name = "Houseboat - Locker Room"
icon_state = "blue2"
/area/houseboat/fountain
name = "Houseboat - Fountain"
icon_state = "blue2"
/area/houseboat/holodeck/off
name = "Houseboat Holo - Off"
icon_state = "blue2"
/area/houseboat/holodeck/beach
name = "Houseboat Holo - Beach"
icon_state = "blue2"
/area/houseboat/holodeck/snow
name = "Houseboat Holo - Snow"
icon_state = "blue2"
/area/houseboat/holodeck/desert
name = "Houseboat Holo - Desert"
icon_state = "blue2"
/area/houseboat/holodeck/picnic
name = "Houseboat Holo - Picnic"
icon_state = "blue2"
/area/houseboat/holodeck/thunderdome
name = "Houseboat Holo - Thunderdome"
icon_state = "blue2"
/area/houseboat/holodeck/basketball
name = "Houseboat Holo - Basketball"
icon_state = "blue2"
/area/houseboat/holodeck/gaming
name = "Houseboat Holo - Gaming Table"
icon_state = "blue2"
/area/houseboat/holodeck/space
name = "Houseboat Holo - Space"
icon_state = "blue2"
/area/houseboat/holodeck/bunking
name = "Houseboat Holo - Bunking"
icon_state = "blue2"
// Tether Map has this shuttle
/area/shuttle/tether/surface
name = "Tether Shuttle Landed"
icon_state = "shuttle"
base_turf = /turf/simulated/floor/reinforced
/area/shuttle/tether/station
name = "Tether Shuttle Dock"
icon_state = "shuttle2"
/area/shuttle/tether/transit
name = "Tether Shuttle Transit"
icon_state = "shuttle2"
+13 -1
View File
@@ -68,8 +68,20 @@
/area/proc/firedoors_update()
if(fire || party || atmosalm)
firedoors_close()
// VOREStation Edit - Make the lights colored!
if(fire)
for(var/obj/machinery/light/L in src)
L.set_alert_fire()
else if(atmosalm)
for(var/obj/machinery/light/L in src)
L.set_alert_atmos()
// VOREStation Edit End
else
firedoors_open()
// VOREStation Edit - Put the lights back!
for(var/obj/machinery/light/L in src)
L.reset_alert()
// VOREStation Edit End
// Close all firedoors in the area
/area/proc/firedoors_close()
@@ -137,7 +149,7 @@
/area/proc/updateicon()
if ((fire || eject || party) && (!requires_power||power_environ) && !istype(src, /area/space))//If it doesn't require power, can still activate this proc.
if(fire && !eject && !party)
icon_state = "blue"
icon_state = null // Let lights take care of it
/*else if(atmosalm && !fire && !eject && !party)
icon_state = "bluenew"*/
else if(!fire && eject && !party)
-11
View File
@@ -10,8 +10,6 @@ var/global/datum/controller/gameticker/ticker
var/event_time = null
var/event = 0
var/login_music // music played in pregame lobby
var/list/datum/mind/minds = list()//The people in the game. Used for objective tracking.
var/Bible_icon_state // icon_state the chaplain has chosen for his bible
@@ -34,15 +32,6 @@ var/global/datum/controller/gameticker/ticker
var/round_end_announced = 0 // Spam Prevention. Announce round end only once.
/datum/controller/gameticker/proc/pregame()
login_music = pick(\
/*'sound/music/halloween/skeletons.ogg',\
'sound/music/halloween/halloween.ogg',\
'sound/music/halloween/ghosts.ogg'*/
'sound/music/space.ogg',\
'sound/music/traitor.ogg',\
'sound/music/title2.ogg',\
'sound/music/clouds.s3m',\
'sound/music/space_oddity.ogg') //Ground Control to Major Tom, this song is cool, what's going on?
do
pregame_timeleft = 180
world << "<B><FONT color='blue'>Welcome to the pre-game lobby!</FONT></B>"
+4 -4
View File
@@ -14,12 +14,12 @@
economic_modifier = 10
access = list(access_security, access_eva, access_sec_doors, access_brig, access_armory,
access_forensics_lockers, access_morgue, access_maint_tunnels, access_all_personal_lockers,
access_research, access_engine, access_mining, access_medical, access_construction, access_mailsorting,
access_heads, access_hos, access_RC_announce, access_keycard_auth, access_gateway, access_external_airlocks)
access_research, access_engine, access_mining, access_construction, access_mailsorting,
access_heads, access_hos, access_RC_announce, access_keycard_auth, access_gateway, access_external_airlocks)//VOREStation Edit
minimal_access = list(access_security, access_eva, access_sec_doors, access_brig, access_armory,
access_forensics_lockers, access_morgue, access_maint_tunnels, access_all_personal_lockers,
access_research, access_engine, access_mining, access_medical, access_construction, access_mailsorting,
access_heads, access_hos, access_RC_announce, access_keycard_auth, access_gateway, access_external_airlocks)
access_research, access_engine, access_mining, access_construction, access_mailsorting,
access_heads, access_hos, access_RC_announce, access_keycard_auth, access_gateway, access_external_airlocks)//VOREStation Edit
alt_titles = list("Commander", "Chief of Security")
minimum_character_age = 25
minimal_player_age = 14
+1 -1
View File
@@ -626,7 +626,7 @@ var/global/datum/controller/occupations/job_master
else
spawnpos = spawntypes[H.client.prefs.spawnpoint]
if(spawnpos && istype(spawnpos))
if(spawnpos && istype(spawnpos) && spawnpos.turfs.len) // VOREStation Edit - Fix runtime if no landmarks exist for a spawntype
if(spawnpos.check_job_spawning(rank))
H.forceMove(pick(spawnpos.turfs))
. = spawnpos.msg
+3 -3
View File
@@ -1,10 +1,10 @@
/obj/machinery/sleep_console
name = "Sleeper Console"
icon = 'icons/obj/Cryogenic2.dmi'
icon = 'icons/obj/Cryogenic2_vr.dmi' //VOREStation Edit - Better icon.
icon_state = "sleeperconsole"
var/obj/machinery/sleeper/sleeper
anchored = 1 //About time someone fixed this.
density = 0
density = 1 //VOREStation Edit - Big console
dir = 8
use_power = 1
idle_power_usage = 40
@@ -62,7 +62,7 @@
/obj/machinery/sleeper
name = "sleeper"
desc = "A fancy bed with built-in injectors, a dialysis machine, and a limited health scanner."
icon = 'icons/obj/Cryogenic2.dmi'
icon = 'icons/obj/Cryogenic2_vr.dmi' //VOREStation Edit - Better icons
icon_state = "sleeper_0"
density = 1
anchored = 1
+7 -3
View File
@@ -56,7 +56,7 @@
return
M.forceMove(src)
occupant = M
icon_state = "body_scanner_1"
update_icon() //icon_state = "body_scanner_1" //VOREStation Edit - Health display for consoles with light and such.
add_fingerprint(user)
qdel(G)
@@ -95,7 +95,7 @@
O.forceMove(src)
occupant = O
icon_state = "body_scanner_1"
update_icon() //icon_state = "body_scanner_1" //VOREStation Edit - Health display for consoles with light and such.
add_fingerprint(user)
/obj/machinery/bodyscanner/relaymove(mob/user as mob)
@@ -121,7 +121,7 @@
occupant.client.perspective = MOB_PERSPECTIVE
occupant.loc = src.loc
occupant = null
icon_state = "body_scanner_0"
update_icon() //icon_state = "body_scanner_1" //VOREStation Edit - Health display for consoles with light and such.
return
/obj/machinery/bodyscanner/ex_act(severity)
@@ -194,6 +194,7 @@
return attack_hand(user)
/obj/machinery/body_scanconsole/power_change()
/* VOREStation Removal
if(stat & BROKEN)
icon_state = "body_scannerconsole-p"
else if(powered() && !panel_open)
@@ -203,6 +204,8 @@
spawn(rand(0, 15))
icon_state = "body_scannerconsole-p"
stat |= NOPOWER
*/
update_icon() //icon_state = "body_scanner_1" //VOREStation Edit - Health display for consoles with light and such.
/obj/machinery/body_scanconsole/ex_act(severity)
switch(severity)
@@ -262,6 +265,7 @@
var/occupantData[0]
if(scanner.occupant && ishuman(scanner.occupant))
update_icon() //VOREStation Edit - Health display for consoles with light and such.
var/mob/living/carbon/human/H = scanner.occupant
occupantData["name"] = H.name
occupantData["stat"] = H.stat
+60
View File
@@ -1,3 +1,12 @@
/obj/machinery/bodyscanner
icon = 'icons/obj/Cryogenic2_vr.dmi'
icon_state = "scanner_open"
/obj/machinery/body_scanconsole
icon = 'icons/obj/Cryogenic2_vr.dmi'
icon_state = "scanner_terminal_off"
density = 1
/obj/machinery/bodyscanner/proc/get_occupant_data_vr(list/incoming,mob/living/carbon/human/H)
var/humanprey = 0
var/livingprey = 0
@@ -19,3 +28,54 @@
incoming["weight"] = H.weight
return incoming
/obj/machinery/bodyscanner/update_icon()
if(stat & (NOPOWER|BROKEN))
icon_state = "scanner_off"
set_light(0)
else
var/h_ratio
if(occupant)
h_ratio = occupant.health / occupant.maxHealth
switch(h_ratio)
if(1.000)
icon_state = "scanner_green"
set_light(l_range = 1.5, l_power = 2, l_color = COLOR_LIME)
if(0.001 to 0.999)
icon_state = "scanner_yellow"
set_light(l_range = 1.5, l_power = 2, l_color = COLOR_YELLOW)
if(-0.999 to 0.000)
icon_state = "scanner_red"
set_light(l_range = 1.5, l_power = 2, l_color = COLOR_RED)
else
icon_state = "scanner_death"
set_light(l_range = 1.5, l_power = 2, l_color = COLOR_RED)
else
icon_state = "scanner_open"
set_light(0)
if(console)
console.update_icon(h_ratio)
/obj/machinery/body_scanconsole/update_icon(var/h_ratio)
if(stat & (NOPOWER|BROKEN))
icon_state = "scanner_terminal_off"
set_light(0)
else
if(scanner)
if(h_ratio)
switch(h_ratio)
if(1.000)
icon_state = "scanner_terminal_green"
set_light(l_range = 1.5, l_power = 2, l_color = COLOR_LIME)
if(-0.999 to 0.000)
icon_state = "scanner_terminal_red"
set_light(l_range = 1.5, l_power = 2, l_color = COLOR_RED)
else
icon_state = "scanner_terminal_dead"
set_light(l_range = 1.5, l_power = 2, l_color = COLOR_RED)
else
icon_state = "scanner_terminal_blue"
set_light(l_range = 1.5, l_power = 2, l_color = COLOR_BLUE)
else
icon_state = "scanner_terminal_off"
set_light(0)
+2 -1
View File
@@ -262,6 +262,7 @@
if(environment_pressure <= pressure_levels[1]) //low pressures
if(!(mode == AALARM_MODE_PANIC || mode == AALARM_MODE_CYCLE))
playsound(src.loc, 'sound/machines/airalarm.ogg', 25, 0, 4)
return 1
return 0
@@ -972,7 +973,7 @@ FIRE ALARM
for(var/obj/machinery/firealarm/FA in area)
fire_alarm.triggerAlarm(loc, FA, duration)
update_icon()
//playsound(src.loc, 'sound/ambience/signal.ogg', 75, 0)
playsound(src.loc, 'sound/machines/airalarm.ogg', 25, 0, 4)
return
/obj/machinery/firealarm/proc/set_security_level(var/newlevel)
@@ -6,177 +6,155 @@
light_color = "#e6ffff"
circuit = /obj/item/weapon/circuitboard/area_atmos
var/list/connectedscrubbers = new()
var/list/connectedscrubbers = list()
var/status = ""
var/range = 25
//Simple variable to prevent me from doing attack_hand in both this and the child computer
var/zone = "This computer is working on a wireless range, the range is currently limited to 25 meters."
var/zone = "This computer is working on a wireless range, the range is currently limited to "
New()
..()
//So the scrubbers have time to spawn
spawn(10)
scanscrubbers()
/obj/machinery/computer/area_atmos/New()
..()
//So the scrubbers have time to spawn
desc += "[range] meters."
scanscrubbers()
attack_ai(var/mob/user as mob)
return src.attack_hand(user)
/obj/machinery/computer/area_atmos/attack_ai(var/mob/user as mob)
return src.attack_hand(user)
attack_hand(var/mob/user as mob)
if(..(user))
return
src.add_fingerprint(usr)
var/dat = {"
<html>
<head>
<style type="text/css">
a.green:link
{
color:#00CC00;
}
a.green:visited
{
color:#00CC00;
}
a.green:hover
{
color:#00CC00;
}
a.green:active
{
color:#00CC00;
}
a.red:link
{
color:#FF0000;
}
a.red:visited
{
color:#FF0000;
}
a.red:hover
{
color:#FF0000;
}
a.red:active
{
color:#FF0000;
}
</style>
</head>
<body>
<center><h1>Area Air Control</h1></center>
<font color="red">[status]</font><br>
<a href="?src=\ref[src];scan=1">Scan</a>
<table border="1" width="90%">"}
for(var/obj/machinery/portable_atmospherics/powered/scrubber/huge/scrubber in connectedscrubbers)
dat += {"
<tr>
<td>
[scrubber.name]<br>
Pressure: [round(scrubber.air_contents.return_pressure(), 0.01)] kPa<br>
Flow Rate: [round(scrubber.last_flow_rate,0.1)] L/s<br>
</td>
<td width="150">
<a class="green" href="?src=\ref[src];scrub=\ref[scrubber];toggle=1">Turn On</a>
<a class="red" href="?src=\ref[src];scrub=\ref[scrubber];toggle=0">Turn Off</a><br>
Load: [round(scrubber.last_power_draw)] W
</td>
</tr>"}
/obj/machinery/computer/area_atmos/attack_hand(var/mob/user as mob)
if(..(user))
return
src.add_fingerprint(usr)
var/dat = {"
<html>
<head>
<style type="text/css">
a.green:link
{
color:#00CC00;
}
a.green:visited
{
color:#00CC00;
}
a.green:hover
{
color:#00CC00;
}
a.green:active
{
color:#00CC00;
}
a.red:link
{
color:#FF0000;
}
a.red:visited
{
color:#FF0000;
}
a.red:hover
{
color:#FF0000;
}
a.red:active
{
color:#FF0000;
}
</style>
</head>
<body>
<center><h1>Area Air Control</h1></center>
<font color="red">[status]</font><br>
<a href="?src=\ref[src];scan=1">Scan</a>
<table border="1" width="90%">"}
for(var/obj/machinery/portable_atmospherics/powered/scrubber/huge/scrubber in connectedscrubbers)
dat += {"
</table><br>
<i>[zone]</i>
</body>
</html>"}
user << browse("[dat]", "window=miningshuttle;size=400x400")
status = ""
<tr>
<td>
[scrubber.name]<br>
Pressure: [round(scrubber.air_contents.return_pressure(), 0.01)] kPa<br>
Flow Rate: [round(scrubber.last_flow_rate,0.1)] L/s<br>
</td>
<td width="150">
<a class="green" href="?src=\ref[src];scrub=\ref[scrubber];toggle=1">Turn On</a>
<a class="red" href="?src=\ref[src];scrub=\ref[scrubber];toggle=0">Turn Off</a><br>
Load: [round(scrubber.last_power_draw)] W
</td>
</tr>"}
Topic(href, href_list)
if(..())
dat += {"
</table><br>
<i>[zone]</i>
</body>
</html>"}
user << browse("[dat]", "window=miningshuttle;size=400x400")
status = ""
/obj/machinery/computer/area_atmos/Topic(href, href_list)
if(..())
return
usr.set_machine(src)
src.add_fingerprint(usr)
if(href_list["scan"])
scanscrubbers()
else if(href_list["toggle"])
var/obj/machinery/portable_atmospherics/powered/scrubber/huge/scrubber = locate(href_list["scrub"])
if(!validscrubber(scrubber))
spawn(20)
status = "ERROR: Couldn't connect to scrubber! (timeout)"
connectedscrubbers -= scrubber
src.updateUsrDialog()
return
usr.set_machine(src)
src.add_fingerprint(usr)
scrubber.on = text2num(href_list["toggle"])
scrubber.update_icon()
if(href_list["scan"])
scanscrubbers()
else if(href_list["toggle"])
var/obj/machinery/portable_atmospherics/powered/scrubber/huge/scrubber = locate(href_list["scrub"])
/obj/machinery/computer/area_atmos/proc/scanscrubbers()
connectedscrubbers.Cut()
if(!validscrubber(scrubber))
spawn(20)
status = "ERROR: Couldn't connect to scrubber! (timeout)"
connectedscrubbers -= scrubber
src.updateUsrDialog()
return
var/found = 0
for(var/obj/machinery/portable_atmospherics/powered/scrubber/huge/scrubber in range(range, src.loc))
found = 1
connectedscrubbers += scrubber
scrubber.on = text2num(href_list["toggle"])
scrubber.update_icon()
if(!found)
status = "ERROR: No scrubber found!"
proc/validscrubber( var/obj/machinery/portable_atmospherics/powered/scrubber/huge/scrubber as obj )
if(!isobj(scrubber) || get_dist(scrubber.loc, src.loc) > src.range || scrubber.loc.z != src.loc.z)
return 0
src.updateUsrDialog()
/obj/machinery/computer/area_atmos/proc/validscrubber(var/obj/machinery/portable_atmospherics/powered/scrubber/huge/scrubber)
if((get_dist(src,scrubber) <= range) && src.z == scrubber.z)
return 1
proc/scanscrubbers()
connectedscrubbers = new()
var/found = 0
for(var/obj/machinery/portable_atmospherics/powered/scrubber/huge/scrubber in range(range, src.loc))
if(istype(scrubber))
found = 1
connectedscrubbers += scrubber
if(!found)
status = "ERROR: No scrubber found!"
src.updateUsrDialog()
return 0
// The one that only works in the same map area
/obj/machinery/computer/area_atmos/area
zone = "This computer is working in a wired network limited to this area."
validscrubber( var/obj/machinery/portable_atmospherics/powered/scrubber/huge/scrubber as obj )
if(!isobj(scrubber))
return 0
/obj/machinery/computer/area_atmos/area/scanscrubbers()
connectedscrubbers.Cut()
/*
wow this is stupid, someone help me
*/
var/turf/T_src = get_turf(src)
if(!T_src.loc) return 0
var/area/A_src = T_src.loc
var/found = 0
var/area/A = get_area(src)
for(var/obj/machinery/portable_atmospherics/powered/scrubber/huge/scrubber in A)
connectedscrubbers += scrubber
found = 1
var/turf/T_scrub = get_turf(scrubber)
if(!T_scrub.loc) return 0
var/area/A_scrub = T_scrub.loc
if(!found)
status = "ERROR: No scrubber found!"
if(A_scrub != A_src)
return 0
src.updateUsrDialog()
/obj/machinery/computer/area_atmos/area/validscrubber(var/obj/machinery/portable_atmospherics/powered/scrubber/huge/scrubber)
if(get_area(scrubber) == get_area(src))
return 1
scanscrubbers()
connectedscrubbers = new()
var/found = 0
var/turf/T = get_turf(src)
if(!T.loc) return
var/area/A = T.loc
for(var/obj/machinery/portable_atmospherics/powered/scrubber/huge/scrubber in world )
var/turf/T2 = get_turf(scrubber)
if(T2 && T2.loc)
var/area/A2 = T2.loc
if(istype(A2) && A2 == A)
connectedscrubbers += scrubber
found = 1
if(!found)
status = "ERROR: No scrubber found!"
src.updateUsrDialog()
return 0
@@ -0,0 +1,28 @@
// The one that only works in the same map area
/obj/machinery/portable_atmospherics/powered/scrubber/huge/var/scrub_id = "generic"
/obj/machinery/computer/area_atmos/tag
name = "Heavy Scrubber Control"
zone = "This computer is operating industrial scrubbers nearby."
var/scrub_id = "generic"
var/last_scan = 0
/obj/machinery/computer/area_atmos/tag/scanscrubbers()
if(last_scan && world.time - last_scan < 20 SECONDS)
return 0
else
last_scan = world.time
connectedscrubbers.Cut()
for(var/obj/machinery/portable_atmospherics/powered/scrubber/huge/scrubber in world)
if(scrubber.scrub_id == src.scrub_id)
connectedscrubbers += scrubber
src.updateUsrDialog()
/obj/machinery/computer/area_atmos/tag/validscrubber(var/obj/machinery/portable_atmospherics/powered/scrubber/huge/scrubber)
if(scrubber.scrub_id == src.scrub_id)
return 1
return 0
+1 -1
View File
@@ -1,7 +1,7 @@
/obj/machinery/meter
name = "meter"
desc = "It measures something."
icon = 'icons/obj/meter.dmi'
icon = 'icons/obj/meter_vr.dmi'
icon_state = "meterX"
var/obj/machinery/atmospherics/pipe/target = null
anchored = 1.0
+15 -8
View File
@@ -144,14 +144,16 @@
//Huge scrubber
/obj/machinery/portable_atmospherics/powered/scrubber/huge
name = "Huge Air Scrubber"
icon = 'icons/obj/atmos_vr.dmi' //VOREStation Edit - New Sprite
icon_state = "scrubber:0"
anchored = 1
volume = 50000
volume_rate = 5000
volume = 500000
volume_rate = 7000
use_power = 1
idle_power_usage = 500 //internal circuitry, friction losses and stuff
active_power_usage = 100000 //100 kW ~ 135 HP
idle_power_usage = 50 //internal circuitry, friction losses and stuff
active_power_usage = 1000 // Blowers running
power_rating = 100000 //100 kW ~ 135 HP
var/global/gid = 1
var/id = 0
@@ -183,12 +185,17 @@
update_icon()
/obj/machinery/portable_atmospherics/powered/scrubber/huge/process()
if(!on || (stat & (NOPOWER|BROKEN)))
update_use_power(0)
if(!anchored || (stat & (NOPOWER|BROKEN)))
on = 0
last_flow_rate = 0
last_power_draw = 0
return 0
update_icon()
var/new_use_power = 1 + on
if(new_use_power != use_power)
update_use_power(new_use_power)
if(!on)
return
var/power_draw = -1
var/datum/gas_mixture/environment = loc.return_air()
+1
View File
@@ -1,6 +1,7 @@
/obj/machinery/autolathe
name = "autolathe"
desc = "It produces items using metal and glass."
icon = 'icons/obj/stationobjs_vr.dmi'
icon_state = "autolathe"
density = 1
anchored = 1
+7 -1
View File
@@ -14,4 +14,10 @@
return attack_hand(user)
/obj/machinery/button/attackby(obj/item/weapon/W, mob/user as mob)
return attack_hand(user)
return attack_hand(user)
// VOREStation Edit Begin
/obj/machinery/button/attack_hand(obj/item/weapon/W, mob/user as mob)
if(..()) return 1
playsound(loc, 'sound/machines/button.ogg', 100, 1)
// VOREStation Edit End
+6 -1
View File
@@ -1,7 +1,7 @@
/obj/machinery/camera
name = "security camera"
desc = "It's used to monitor rooms."
icon = 'icons/obj/monitors.dmi'
icon = 'icons/obj/monitors_vr.dmi' //VOREStation Edit - New Icons
icon_state = "camera"
use_power = 2
idle_power_usage = 5
@@ -56,7 +56,12 @@
error("[src.name] in [get_area(src)]has errored. [src.network?"Empty network list":"Null network list"]")
ASSERT(src.network)
ASSERT(src.network.len > 0)
// VOREStation Edit Start - Make mapping with cameras easier
if(!c_tag)
var/area/A = get_area(src)
c_tag = "[A ? A : "Unknown"] #[rand(111,999)]"
..()
// VOREStation Edit End
/obj/machinery/camera/Destroy()
deactivate(null, 0) //kick anyone viewing out
@@ -1,7 +1,7 @@
/obj/item/weapon/camera_assembly
name = "camera assembly"
desc = "A pre-fabricated security camera kit, ready to be assembled and mounted to a surface."
icon = 'icons/obj/monitors.dmi'
icon = 'icons/obj/monitors_vr.dmi' //VOREStation Edit - New Icons
icon_state = "cameracase"
w_class = ITEMSIZE_SMALL
anchored = 0
+2 -2
View File
@@ -12,8 +12,8 @@
/obj/machinery/computer/operating/New()
..()
for(dir in list(NORTH,EAST,SOUTH,WEST))
table = locate(/obj/machinery/optable, get_step(src, dir))
for(var/direction in list(NORTH,EAST,SOUTH,WEST)) //VOREStation Edit - Stop turning
table = locate(/obj/machinery/optable, get_step(src, direction))
if (table)
table.computer = src
break
+2 -2
View File
@@ -8,7 +8,7 @@
name = "\improper RCON console"
desc = "Console used to remotely control machinery on the station."
icon_keyboard = "power_key"
icon_screen = "power:0"
icon_screen = "ai_fixer" //VOREStation Edit
light_color = "#a97faa"
circuit = /obj/item/weapon/circuitboard/rcon_console
req_one_access = list(access_engine)
@@ -40,4 +40,4 @@
/obj/machinery/computer/rcon/update_icon()
..()
if(!(stat & (NOPOWER|BROKEN)))
overlays += image('icons/obj/computer.dmi', "ai-fixer-empty", overlay_layer)
overlays += image(icon, "ai-fixer-empty", overlay_layer) //VOREStation Edit
+1 -1
View File
@@ -35,7 +35,6 @@
return viewflag
/obj/machinery/computer/security/ui_interact(mob/user, ui_key = "main", datum/nanoui/ui = null, force_open = 1)
if(src.z > 6) return
if(stat & (NOPOWER|BROKEN)) return
if(user.stat) return
@@ -48,6 +47,7 @@
data["cameras"] = camera_repository.cameras_in_network(current_network)
if(current_camera)
switch_to_camera(user, current_camera)
data["station_levels"] = using_map.station_levels
ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
if (!ui)
@@ -52,7 +52,7 @@
/obj/machinery/computer/communications/Topic(href, href_list)
if(..())
return 1
if (src.z > 1)
if (using_map && !(src.z in using_map.station_levels)) //VOREStation Edit
usr << "\red <b>Unable to establish a connection</b>: \black You're too far away from the station!"
return
usr.set_machine(src)
+1 -1
View File
@@ -1,6 +1,6 @@
/obj/machinery/computer
name = "computer"
icon = 'icons/obj/computer.dmi'
icon = 'icons/obj/computer_vr.dmi'
icon_state = "computer"
density = 1
anchored = 1.0
@@ -0,0 +1,17 @@
//Various overrides to make Eris sprites look nicer
/obj/machinery/computer/power_monitor
icon_keyboard = "power_key"
icon_screen = "power_monitor"
/obj/machinery/computer/power_monitor/update_icon()
if(stat & BROKEN)
icon_screen = "broken"
else if(alerting)
icon_screen = "power_monitor_warn"
else
icon_screen = "power_monitor"
..()
/obj/machinery/computer/rcon
icon_keyboard = "power_key"
icon_screen = "ai-fixer"
+6 -6
View File
@@ -11,7 +11,7 @@
/obj/machinery/computer/cryopod
name = "cryogenic oversight console"
desc = "An interface between crew and the cryogenic storage oversight systems."
icon = 'icons/obj/Cryogenic2.dmi'
icon = 'icons/obj/Cryogenic2_vr.dmi' //VOREStation Edit - New Icon
icon_state = "cellconsole"
circuit = /obj/item/weapon/circuitboard/cryopodcontrol
density = 0
@@ -191,7 +191,7 @@
name = "cryogenic feed"
desc = "A bewildering tangle of machinery and pipes."
icon = 'icons/obj/Cryogenic2.dmi'
icon = 'icons/obj/Cryogenic2_vr.dmi' //VOREStation Edit - New Icon
icon_state = "cryo_rear"
anchored = 1
dir = WEST
@@ -200,14 +200,14 @@
/obj/machinery/cryopod
name = "cryogenic freezer"
desc = "A man-sized pod for entering suspended animation."
icon = 'icons/obj/Cryogenic2.dmi'
icon_state = "body_scanner_0"
icon = 'icons/obj/Cryogenic2_vr.dmi' //VOREStation Edit - New Icon
icon_state = "cryopod_0" //VOREStation Edit - New Icon
density = 1
anchored = 1
dir = WEST
var/base_icon_state = "body_scanner_0"
var/occupied_icon_state = "body_scanner_1"
var/base_icon_state = "cryopod_0" //VOREStation Edit - New Icon
var/occupied_icon_state = "cryopod_1" //VOREStation Edit - New Icon
var/on_store_message = "has entered long-term storage."
var/on_store_name = "Cryogenic Oversight"
var/on_enter_visible_message = "starts climbing into the"
+2
View File
@@ -78,6 +78,7 @@
#define SAFE 0x10
/obj/machinery/button/remote/airlock
icon = 'icons/obj/stationobjs_vr.dmi' // VOREStation Edit
name = "remote door-control"
desc = "It controls doors, remotely."
@@ -131,6 +132,7 @@
Blast door remote control
*/
/obj/machinery/button/remote/blast_door
icon = 'icons/obj/stationobjs_vr.dmi'
name = "remote blast door-control"
desc = "It controls blast doors, remotely."
+80 -18
View File
@@ -1,3 +1,11 @@
//VOREStation Edit - Redone a lot of airlock things:
/*
- Specific department maintenance doors
- Named doors properly according to type
- Gave them default access levels with the access constants
- Improper'd all of the names in the new()
*/
/obj/machinery/door/airlock
name = "Airlock"
icon = 'icons/obj/doors/Doorint.dmi'
@@ -63,41 +71,78 @@
return get_material_by_name(DEFAULT_WALL_MATERIAL)
/obj/machinery/door/airlock/command
name = "Airlock"
name = "Command Airlock"
icon = 'icons/obj/doors/Doorcom.dmi'
req_one_access = list(access_heads)
assembly_type = /obj/structure/door_assembly/door_assembly_com
/obj/machinery/door/airlock/security
name = "Airlock"
name = "Security Airlock"
icon = 'icons/obj/doors/Doorsec.dmi'
req_one_access = list(access_security)
assembly_type = /obj/structure/door_assembly/door_assembly_sec
/obj/machinery/door/airlock/engineering
name = "Airlock"
name = "Engineering Airlock"
icon = 'icons/obj/doors/Dooreng.dmi'
req_one_access = list(access_engine)
assembly_type = /obj/structure/door_assembly/door_assembly_eng
/obj/machinery/door/airlock/engineeringatmos
name = "Airlock"
name = "Atmospherics Airlock"
icon = 'icons/obj/doors/Doorengatmos.dmi'
req_one_access = list(access_atmospherics)
assembly_type = /obj/structure/door_assembly/door_assembly_eat
/obj/machinery/door/airlock/medical
name = "Airlock"
name = "Medical Airlock"
icon = 'icons/obj/doors/Doormed.dmi'
req_one_access = list(access_medical)
assembly_type = /obj/structure/door_assembly/door_assembly_med
/obj/machinery/door/airlock/maintenance
name = "Maintenance Access"
icon = 'icons/obj/doors/Doormaint.dmi'
req_one_access = list(access_maint_tunnels)
assembly_type = /obj/structure/door_assembly/door_assembly_mai
/obj/machinery/door/airlock/maintenance/cargo
icon = 'icons/obj/doors/Doormaint_cargo.dmi'
req_one_access = list(access_cargo)
/obj/machinery/door/airlock/maintenance/command
icon = 'icons/obj/doors/Doormaint_command.dmi'
req_one_access = list(access_heads)
/obj/machinery/door/airlock/maintenance/common
icon = 'icons/obj/doors/Doormaint_common.dmi'
/obj/machinery/door/airlock/maintenance/engi
icon = 'icons/obj/doors/Doormaint_engi.dmi'
req_one_access = list(access_engine)
/obj/machinery/door/airlock/maintenance/int
icon = 'icons/obj/doors/Doormaint_int.dmi'
/obj/machinery/door/airlock/maintenance/medical
icon = 'icons/obj/doors/Doormaint_med.dmi'
req_one_access = list(access_medical)
/obj/machinery/door/airlock/maintenance/rnd
icon = 'icons/obj/doors/Doormaint_rnd.dmi'
req_one_access = list(access_research)
/obj/machinery/door/airlock/maintenance/sec
icon = 'icons/obj/doors/Doormaint_sec.dmi'
req_one_access = list(access_security)
/obj/machinery/door/airlock/external
name = "External Airlock"
icon = 'icons/obj/doors/Doorext.dmi'
assembly_type = /obj/structure/door_assembly/door_assembly_ext
opacity = 0
glass = 1
req_one_access = list(access_external_airlocks)
/obj/machinery/door/airlock/glass
name = "Glass Airlock"
@@ -110,9 +155,10 @@
glass = 1
/obj/machinery/door/airlock/centcom
name = "Airlock"
name = "Centcom Airlock"
icon = 'icons/obj/doors/Doorele.dmi'
opacity = 0
//opacity = 0 //VOREStation Edit - Why is this like this??
req_one_access = list(access_cent_general)
/obj/machinery/door/airlock/vault
name = "Vault"
@@ -121,6 +167,7 @@
opacity = 1
secured_wires = 1
assembly_type = /obj/structure/door_assembly/door_assembly_highsecurity //Until somebody makes better sprites.
req_one_access = list(access_heads_vault)
/obj/machinery/door/airlock/vault/bolted
icon_state = "door_locked"
@@ -138,6 +185,7 @@
explosion_resistance = 20
opacity = 1
assembly_type = /obj/structure/door_assembly/door_assembly_hatch
req_one_access = list(access_maint_tunnels)
/obj/machinery/door/airlock/maintenance_hatch
name = "Maintenance Hatch"
@@ -145,9 +193,10 @@
explosion_resistance = 20
opacity = 1
assembly_type = /obj/structure/door_assembly/door_assembly_mhatch
req_one_access = list(access_maint_tunnels)
/obj/machinery/door/airlock/glass_command
name = "Maintenance Hatch"
name = "Command Airlock"
icon = 'icons/obj/doors/Doorcomglass.dmi'
hitsound = 'sound/effects/Glasshit.ogg'
maxhealth = 300
@@ -155,9 +204,10 @@
opacity = 0
assembly_type = /obj/structure/door_assembly/door_assembly_com
glass = 1
req_one_access = list(access_heads)
/obj/machinery/door/airlock/glass_engineering
name = "Maintenance Hatch"
name = "Engineering Airlock"
icon = 'icons/obj/doors/Doorengglass.dmi'
hitsound = 'sound/effects/Glasshit.ogg'
maxhealth = 300
@@ -165,9 +215,10 @@
opacity = 0
assembly_type = /obj/structure/door_assembly/door_assembly_eng
glass = 1
req_one_access = list(access_engine)
/obj/machinery/door/airlock/glass_engineeringatmos
name = "Maintenance Hatch"
name = "Atmospherics Airlock"
icon = 'icons/obj/doors/Doorengatmoglass.dmi'
hitsound = 'sound/effects/Glasshit.ogg'
maxhealth = 300
@@ -175,9 +226,10 @@
opacity = 0
assembly_type = /obj/structure/door_assembly/door_assembly_eat
glass = 1
req_one_access = list(access_atmospherics)
/obj/machinery/door/airlock/glass_security
name = "Maintenance Hatch"
name = "Security Airlock"
icon = 'icons/obj/doors/Doorsecglass.dmi'
hitsound = 'sound/effects/Glasshit.ogg'
maxhealth = 300
@@ -185,9 +237,10 @@
opacity = 0
assembly_type = /obj/structure/door_assembly/door_assembly_sec
glass = 1
req_one_access = list(access_security)
/obj/machinery/door/airlock/glass_medical
name = "Maintenance Hatch"
name = "Medical Airlock"
icon = 'icons/obj/doors/Doormedglass.dmi'
hitsound = 'sound/effects/Glasshit.ogg'
maxhealth = 300
@@ -195,24 +248,27 @@
opacity = 0
assembly_type = /obj/structure/door_assembly/door_assembly_med
glass = 1
req_one_access = list(access_medical)
/obj/machinery/door/airlock/mining
name = "Mining Airlock"
icon = 'icons/obj/doors/Doormining.dmi'
assembly_type = /obj/structure/door_assembly/door_assembly_min
req_one_access = list(access_mining)
/obj/machinery/door/airlock/atmos
name = "Atmospherics Airlock"
icon = 'icons/obj/doors/Dooratmo.dmi'
assembly_type = /obj/structure/door_assembly/door_assembly_atmo
req_one_access = list(access_atmospherics)
/obj/machinery/door/airlock/research
name = "Airlock"
name = "Research Airlock"
icon = 'icons/obj/doors/Doorresearch.dmi'
assembly_type = /obj/structure/door_assembly/door_assembly_research
/obj/machinery/door/airlock/glass_research
name = "Maintenance Hatch"
name = "Research Airlock"
icon = 'icons/obj/doors/Doorresearchglass.dmi'
hitsound = 'sound/effects/Glasshit.ogg'
maxhealth = 300
@@ -220,10 +276,10 @@
opacity = 0
assembly_type = /obj/structure/door_assembly/door_assembly_research
glass = 1
heat_proof = 1
req_one_access = list(access_research)
/obj/machinery/door/airlock/glass_mining
name = "Maintenance Hatch"
name = "Mining Airlock"
icon = 'icons/obj/doors/Doorminingglass.dmi'
hitsound = 'sound/effects/Glasshit.ogg'
maxhealth = 300
@@ -231,9 +287,10 @@
opacity = 0
assembly_type = /obj/structure/door_assembly/door_assembly_min
glass = 1
req_one_access = list(access_mining)
/obj/machinery/door/airlock/glass_atmos
name = "Maintenance Hatch"
name = "Atmospherics Airlock"
icon = 'icons/obj/doors/Dooratmoglass.dmi'
hitsound = 'sound/effects/Glasshit.ogg'
maxhealth = 300
@@ -241,6 +298,7 @@
opacity = 0
assembly_type = /obj/structure/door_assembly/door_assembly_atmo
glass = 1
req_one_access = list(access_atmospherics)
/obj/machinery/door/airlock/gold
name = "Gold Airlock"
@@ -320,9 +378,10 @@
mineral = "sandstone"
/obj/machinery/door/airlock/science
name = "Airlock"
name = "Research Airlock"
icon = 'icons/obj/doors/Doorsci.dmi'
assembly_type = /obj/structure/door_assembly/door_assembly_science
req_one_access = list(access_research)
/obj/machinery/door/airlock/glass_science
name = "Glass Airlocks"
@@ -330,6 +389,7 @@
opacity = 0
assembly_type = /obj/structure/door_assembly/door_assembly_science
glass = 1
req_one_access = list(access_research)
/obj/machinery/door/airlock/highsecurity
name = "Secure Airlock"
@@ -337,6 +397,7 @@
explosion_resistance = 20
secured_wires = 1
assembly_type = /obj/structure/door_assembly/door_assembly_highsecurity
req_one_access = list(access_heads_vault)
/obj/machinery/door/airlock/voidcraft
name = "voidcraft hatch"
@@ -1076,6 +1137,7 @@ About the new airlock wires panel:
if(A.closeOtherId == src.closeOtherId && A != src)
src.closeOther = A
break
name = "\improper [name]"
/obj/machinery/door/airlock/Destroy()
qdel(wires)
+2 -1
View File
@@ -437,7 +437,8 @@
var/obj/fire/fire = locate() in loc
if(fire)
qdel(fire)
return
return 1
/obj/machinery/door/proc/requiresID()
return 1
+9
View File
@@ -0,0 +1,9 @@
/obj/machinery/door/firedoor/glass/hidden
name = "\improper Emergency Shutter System"
desc = "Emergency air-tight shutter, capable of sealing off breached areas. This model fits flush with the walls, and has a panel in the floor for maintenance."
icon = 'icons/obj/doors/DoorHazardHidden.dmi'
/obj/machinery/door/firedoor/glass/hidden/steel
name = "\improper Emergency Shutter System"
desc = "Emergency air-tight shutter, capable of sealing off breached areas. This model fits flush with the walls, and has a panel in the floor for maintenance."
icon = 'icons/obj/doors/DoorHazardHidden_steel.dmi'
+58
View File
@@ -2,15 +2,46 @@
/obj/machinery/door/airlock/multi_tile
width = 2
appearance_flags = 0
var/obj/machinery/filler_object/filler1
var/obj/machinery/filler_object/filler2
/obj/machinery/door/airlock/multi_tile/New()
..()
SetBounds()
if(opacity)
create_fillers()
/obj/machinery/door/airlock/multi_tile/Destroy()
if(filler1)
qdel(filler1)
if(filler2)
qdel(filler2)
..()
/obj/machinery/door/airlock/multi_tile/Move()
. = ..()
SetBounds()
/obj/machinery/door/airlock/multi_tile/open()
. = ..()
if(filler1)
filler1.set_opacity(opacity)
if(filler2)
filler2.set_opacity(opacity)
return .
/obj/machinery/door/airlock/multi_tile/close()
. = ..()
if(filler1)
filler1.set_opacity(opacity)
if(filler2)
filler2.set_opacity(opacity)
return .
/obj/machinery/door/airlock/multi_tile/proc/SetBounds()
if(dir in list(EAST, WEST))
bound_width = width * world.icon_size
@@ -19,9 +50,36 @@
bound_width = world.icon_size
bound_height = width * world.icon_size
/obj/machinery/door/airlock/multi_tile/proc/create_fillers()
if(src.dir > 3)
filler1 = new/obj/machinery/filler_object (src.loc)
filler2 = new/obj/machinery/filler_object (get_step(src,EAST))
else
filler1 = new/obj/machinery/filler_object (src.loc)
filler2 = new/obj/machinery/filler_object (get_step(src,NORTH))
filler1.density = 0
filler2.density = 0
filler1.set_opacity(opacity)
filler2.set_opacity(opacity)
/obj/machinery/door/airlock/multi_tile/glass
name = "Glass Airlock"
icon = 'icons/obj/doors/Door2x1glass.dmi'
opacity = 0
glass = 1
assembly_type = /obj/structure/door_assembly/multi_tile
/obj/machinery/door/airlock/multi_tile/metal
name = "Airlock"
icon = 'icons/obj/doors/Door2x1metal.dmi'
assembly_type = /obj/structure/door_assembly/multi_tile
/obj/machinery/filler_object
name = ""
icon = 'icons/obj/doors/rapid_pdoor.dmi'
icon_state = ""
density = 0
/obj/machinery/door/airlock/multi_tile/metal/mait
icon = 'icons/obj/doors/Door2x1_Maint.dmi'
req_one_access = list(access_maint_tunnels)
+17 -10
View File
@@ -17,13 +17,20 @@
construction_frame_floor += cancel
/datum/frame/frame_types
var/name
var/frame_size = 5
var/frame_class
var/circuit
var/frame_style = "floor"
var/x_offset
var/y_offset
var/icon/icon_override // Icon to set on frame object when building. If null icon is unchanged.
var/name // Name assigned to the frame object.
var/frame_size = 5 // Sheets of metal required to build.
var/frame_class // Determines construction method. "machine", "computer", "alarm", or "display"
var/circuit // Type path of the circuit board that comes built in with this frame. Null to require adding a circuit.
var/frame_style = "floor" // "floor" or "wall"
var/x_offset // For wall frames: pixel_x
var/y_offset // For wall frames: pixel_y
// Get the icon state to use at a given state. Default implementation is based on the frame's name
/datum/frame/frame_types/proc/get_icon_state(var/state)
var/type = lowertext(name)
type = replacetext(type, " ", "_")
return "[type]_[state]"
/datum/frame/frame_types/computer
name = "Computer"
@@ -203,9 +210,9 @@
/obj/structure/frame/update_icon()
..()
var/type = lowertext(frame_type.name)
type = replacetext(type, " ", "_")
icon_state = "[type]_[state]"
if(frame_type.icon_override)
icon = frame_type.icon_override
icon_state = frame_type.get_icon_state(state)
/obj/structure/frame/proc/check_components(mob/user as mob)
components = list()
+2 -1
View File
@@ -4,7 +4,7 @@
/obj/machinery/light_switch
name = "light switch"
desc = "It turns lights on and off. What are you, simple?"
icon = 'icons/obj/power.dmi'
icon = 'icons/obj/power_vr.dmi' // VOREStation Edit
icon_state = "light1"
anchored = 1.0
use_power = 1
@@ -53,6 +53,7 @@
area.lightswitch = on
area.updateicon()
playsound(src, 'sound/machines/button.ogg', 100, 1, 0) // VOREStation Edit
for(var/obj/machinery/light_switch/L in area)
L.on = on
+1 -1
View File
@@ -1,7 +1,7 @@
//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:31
obj/machinery/recharger
name = "recharger"
icon = 'icons/obj/stationobjs.dmi'
icon = 'icons/obj/stationobjs_vr.dmi' //VOREStation Edit
icon_state = "recharger0"
anchored = 1
use_power = 1
@@ -0,0 +1,92 @@
// Request Console Presets! Make mapping 400% easier!
// By using these presets we can rename the departments easily.
//Request Console Department Types
// #define RC_ASSIST 1 //Request Assistance
// #define RC_SUPPLY 2 //Request Supplies
// #define RC_INFO 4 //Relay Info
/obj/machinery/requests_console/preset
name = ""
department = ""
departmentType = ""
announcementConsole = 0
// Departments
/obj/machinery/requests_console/preset/cargo
name = "Cargo RC"
department = "Cargo Bay"
departmentType = RC_SUPPLY
/obj/machinery/requests_console/preset/security
name = "Security RC"
department = "Security"
departmentType = RC_ASSIST
/obj/machinery/requests_console/preset/engineering
name = "Engineering RC"
department = "Engineering"
departmentType = RC_ASSIST|RC_SUPPLY
/obj/machinery/requests_console/preset/atmos
name = "Atmospherics RC"
department = "Atmospherics"
departmentType = RC_ASSIST|RC_SUPPLY
/obj/machinery/requests_console/preset/medical
name = "Medical RC"
department = "Medical Department"
departmentType = RC_ASSIST|RC_SUPPLY
/obj/machinery/requests_console/preset/research
name = "Research RC"
department = "Research Department"
departmentType = RC_ASSIST|RC_SUPPLY
/obj/machinery/requests_console/preset/janitor
name = "Janitor RC"
department = "Janitorial"
departmentType = RC_ASSIST
/obj/machinery/requests_console/preset/bridge
name = "Bridge RC"
department = "Bridge"
departmentType = RC_ASSIST|RC_INFO
announcementConsole = 1
// Heads
/obj/machinery/requests_console/preset/ce
name = "Chief Engineer RC"
department = "Chief Engineer's Desk"
departmentType = RC_ASSIST|RC_INFO
announcementConsole = 1
/obj/machinery/requests_console/preset/cmo
name = "Chief Medical Officer RC"
department = "Chief Medical Officer's Desk"
departmentType = RC_ASSIST|RC_INFO
announcementConsole = 1
/obj/machinery/requests_console/preset/hos
name = "Head of Security RC"
department = "Head of Security's Desk"
departmentType = RC_ASSIST|RC_INFO
announcementConsole = 1
/obj/machinery/requests_console/preset/rd
name = "Research Director RC"
department = "Research Director's Desk"
departmentType = RC_ASSIST|RC_INFO
announcementConsole = 1
/obj/machinery/requests_console/preset/captain
name = "Captain RC"
department = "Captain's Desk"
departmentType = RC_ASSIST|RC_INFO
announcementConsole = 1
/obj/machinery/requests_console/preset/ai
name = "AI RC"
department = "AI"
departmentType = RC_ASSIST|RC_INFO
+1 -1
View File
@@ -4,7 +4,7 @@
/obj/machinery/vending
name = "Vendomat"
desc = "A generic vending machine."
icon = 'icons/obj/vending.dmi'
icon = 'icons/obj/vending_vr.dmi' //VOREStation Edit - Eris vending machine sprites
icon_state = "generic"
layer = 2.9
anchored = 1
+12 -1
View File
@@ -115,4 +115,15 @@
/obj/item/weapon/reagent_containers/food/snacks/sliceable/creamcheesebread = 2
)
contraband = list(/obj/item/weapon/reagent_containers/food/snacks/mysterysoup = 10)
vend_delay = 15
vend_delay = 15
/* For later, then
/obj/machinery/vending/weapon_machine
name = "Frozen Star Guns&Ammo"
desc = "A self-defense equipment vending machine. When you need to take care of that clown."
product_slogans = "The best defense is good offense!;Buy for your whole family today!;Nobody can outsmart bullet!;God created man - Frozen Star made them EQUAL!;Nobody can outsmart bullet!;Stupidity can be cured! By LEAD.;Dead kids can't bully your children!"
product_ads = "Stunning!;Take justice in your own hands!;LEADearship!"
icon_state = "weapon"
products = list(/obj/item/device/flash = 6,/obj/item/weapon/reagent_containers/spray/pepper = 6, /obj/item/weapon/gun/projectile/olivaw = 5, /obj/item/weapon/gun/projectile/giskard = 5, /obj/item/ammo_magazine/mg/cl32/rubber = 20)
contraband = list(/obj/item/weapon/reagent_containers/food/snacks/syndicake = 6)
prices = list(/obj/item/device/flash = 600,/obj/item/weapon/reagent_containers/spray/pepper = 800, /obj/item/weapon/gun/projectile/olivaw = 1600, /obj/item/weapon/gun/projectile/giskard = 1200, /obj/item/ammo_magazine/mg/cl32/rubber = 200)
*/
+1 -1
View File
@@ -1,5 +1,5 @@
/obj/machinery/mecha_part_fabricator
icon = 'icons/obj/robotics.dmi'
icon = 'icons/obj/robotics_vr.dmi' //VOREStation Edit - New icon
icon_state = "fab-idle"
name = "Exosuit Fabricator"
desc = "A machine used for construction of mechas."
+1 -1
View File
@@ -1,5 +1,5 @@
/obj/machinery/pros_fabricator
icon = 'icons/obj/robotics.dmi'
icon = 'icons/obj/robotics_vr.dmi' //VOREStation Edit - New icon
icon_state = "fab-idle"
name = "Prosthetics Fabricator"
desc = "A machine used for construction of prosthetics."
@@ -123,4 +123,5 @@
/obj/item/device/encryptionkey/ert
name = "\improper ERT radio encryption key"
icon_state = "cent_cypherkey"
channels = list("Response Team" = 1, "Science" = 1, "Command" = 1, "Medical" = 1, "Engineering" = 1, "Security" = 1, "Supply" = 1, "Service" = 1)
@@ -1,13 +1,17 @@
/obj/item/device/radio/headset/centcom
name = "centcom radio headset"
desc = "The headset of the boss's boss."
icon_state = "com_headset"
icon_state = "cent_headset"
item_state = "headset"
ks2type = /obj/item/device/encryptionkey/ert
/obj/item/device/radio/headset/centcom/alt
name = "centcom bowman headset"
desc = "The headset of the boss's boss."
icon_state = "com_headset_alt"
item_state = "com_headset_alt"
ks2type = /obj/item/device/encryptionkey/ert
/obj/item/device/radio/headset/nanotrasen
name = "\improper NT radio headset"
desc = "The headset of a Nanotrasen corporate employee."
icon_state = "nt_headset"
ks2type = /obj/item/device/encryptionkey/ert
@@ -1,6 +1,7 @@
/obj/item/device/radio/intercom
name = "station intercom (General)"
desc = "Talk through this."
icon = 'icons/obj/radio_vr.dmi' //VOREStation Edit - New Icon
icon_state = "intercom"
anchored = 1
w_class = ITEMSIZE_LARGE
@@ -22,8 +22,8 @@ var/global/list/default_medbay_channels = list(
)
/obj/item/device/radio
icon = 'icons/obj/radio.dmi'
name = "station bounced radio"
icon = 'icons/obj/radio_vr.dmi' //VOREStation Edit
name = "shortwave radio" //VOREStation Edit
suffix = "\[3\]"
icon_state = "walkietalkie"
item_state = "radio"
+3 -2
View File
@@ -21,10 +21,11 @@
/obj/item/device/uplink/New(var/location, var/datum/mind/owner, var/telecrystals = DEFAULT_TELECRYSTAL_AMOUNT)
..()
src.uplink_owner = owner
if(owner) //VOREStation Edit - Owner optional
src.uplink_owner = owner
uses = owner.tcrystals
purchase_log = list()
world_uplinks += src
uses = owner.tcrystals
processing_objects += src
/obj/item/device/uplink/Destroy()
+189 -153
View File
@@ -1,154 +1,190 @@
/* Diffrent misc types of tiles
* Contains:
* Prototype
* Grass
* Wood
* Carpet
* Blue Carpet
* Linoleum
*
* Put your stuff in fifty_stacks_tiles.dm as well.
*/
/obj/item/stack/tile
name = "tile"
singular_name = "tile"
desc = "A non-descript floor tile"
w_class = ITEMSIZE_NORMAL
max_amount = 60
/obj/item/stack/tile/New()
..()
pixel_x = rand(-7, 7)
pixel_y = rand(-7, 7)
/*
* Grass
*/
/obj/item/stack/tile/grass
name = "grass tile"
singular_name = "grass floor tile"
desc = "A patch of grass like they often use on golf courses."
icon_state = "tile_grass"
force = 1.0
throwforce = 1.0
throw_speed = 5
throw_range = 20
flags = 0
origin_tech = list(TECH_BIO = 1)
/obj/item/stack/tile/grass/fifty
amount = 50
/*
* Wood
*/
/obj/item/stack/tile/wood
name = "wood floor tile"
singular_name = "wood floor tile"
desc = "An easy to fit wooden floor tile."
icon_state = "tile-wood"
force = 1.0
throwforce = 1.0
throw_speed = 5
throw_range = 20
flags = 0
/obj/item/stack/tile/wood/fifty
amount = 50
/obj/item/stack/tile/wood/cyborg
name = "wood floor tile synthesizer"
desc = "A device that makes wood floor tiles."
uses_charge = 1
charge_costs = list(250)
stacktype = /obj/item/stack/tile/wood
build_type = /obj/item/stack/tile/wood
/*
* Carpets
*/
/obj/item/stack/tile/carpet
name = "carpet"
singular_name = "carpet"
desc = "A piece of carpet. It is the same size as a normal floor tile!"
icon_state = "tile-carpet"
force = 1.0
throwforce = 1.0
throw_speed = 5
throw_range = 20
flags = 0
/obj/item/stack/tile/carpet/blue
name = "blue carpet"
singular_name = "blue carpet"
desc = "A piece of blue carpet. It is the same size as a normal floor tile!"
icon_state = "tile-bluecarpet"
/obj/item/stack/tile/floor
name = "floor tile"
singular_name = "floor tile"
desc = "Those could work as a pretty decent throwing weapon" //why?
icon_state = "tile"
force = 6.0
matter = list(DEFAULT_WALL_MATERIAL = SHEET_MATERIAL_AMOUNT / 4)
throwforce = 15.0
throw_speed = 5
throw_range = 20
flags = CONDUCT
/obj/item/stack/tile/floor_red
name = "red floor tile"
singular_name = "red floor tile"
color = COLOR_RED_GRAY
icon_state = "tile_white"
/obj/item/stack/tile/floor_steel
name = "steel floor tile"
singular_name = "steel floor tile"
icon_state = "tile_steel"
matter = list("plasteel" = SHEET_MATERIAL_AMOUNT / 4)
/obj/item/stack/tile/floor_white
name = "white floor tile"
singular_name = "white floor tile"
icon_state = "tile_white"
matter = list("plastic" = SHEET_MATERIAL_AMOUNT / 4)
/obj/item/stack/tile/floor_yellow
name = "yellow floor tile"
singular_name = "yellow floor tile"
color = COLOR_BROWN
icon_state = "tile_white"
/obj/item/stack/tile/floor_dark
name = "dark floor tile"
singular_name = "dark floor tile"
icon_state = "fr_tile"
matter = list("plasteel" = SHEET_MATERIAL_AMOUNT / 4)
/obj/item/stack/tile/floor_freezer
name = "freezer floor tile"
singular_name = "freezer floor tile"
icon_state = "tile_freezer"
matter = list("plastic" = SHEET_MATERIAL_AMOUNT / 4)
/obj/item/stack/tile/floor/cyborg
name = "floor tile synthesizer"
desc = "A device that makes floor tiles."
gender = NEUTER
matter = null
uses_charge = 1
charge_costs = list(250)
stacktype = /obj/item/stack/tile/floor
build_type = /obj/item/stack/tile/floor
/obj/item/stack/tile/linoleum
name = "linoleum"
singular_name = "linoleum"
desc = "A piece of linoleum. It is the same size as a normal floor tile!"
icon_state = "tile-linoleum"
force = 1.0
throwforce = 1.0
throw_speed = 5
throw_range = 20
/* Diffrent misc types of tiles
* Contains:
* Prototype
* Grass
* Wood
* Carpet
* Blue Carpet
* Linoleum
*
* Put your stuff in fifty_stacks_tiles.dm as well.
*/
/obj/item/stack/tile
name = "tile"
singular_name = "tile"
desc = "A non-descript floor tile"
w_class = ITEMSIZE_NORMAL
max_amount = 60
/obj/item/stack/tile/New()
..()
pixel_x = rand(-7, 7)
pixel_y = rand(-7, 7)
/*
* Grass
*/
/obj/item/stack/tile/grass
name = "grass tile"
singular_name = "grass floor tile"
desc = "A patch of grass like they often use on golf courses."
icon_state = "tile_grass"
force = 1.0
throwforce = 1.0
throw_speed = 5
throw_range = 20
flags = 0
origin_tech = list(TECH_BIO = 1)
/obj/item/stack/tile/grass/fifty
amount = 50
/*
* Wood
*/
/obj/item/stack/tile/wood
name = "wood floor tile"
singular_name = "wood floor tile"
desc = "An easy to fit wooden floor tile."
icon_state = "tile-wood"
force = 1.0
throwforce = 1.0
throw_speed = 5
throw_range = 20
flags = 0
/obj/item/stack/tile/wood/fifty
amount = 50
/obj/item/stack/tile/wood/cyborg
name = "wood floor tile synthesizer"
desc = "A device that makes wood floor tiles."
uses_charge = 1
charge_costs = list(250)
stacktype = /obj/item/stack/tile/wood
build_type = /obj/item/stack/tile/wood
/*
* Carpets
*/
/obj/item/stack/tile/carpet
name = "carpet"
singular_name = "carpet"
desc = "A piece of carpet. It is the same size as a normal floor tile!"
icon_state = "tile-carpet"
force = 1.0
throwforce = 1.0
throw_speed = 5
throw_range = 20
flags = 0
/obj/item/stack/tile/carpet/blue
name = "blue carpet"
singular_name = "blue carpet"
desc = "A piece of blue carpet. It is the same size as a normal floor tile!"
icon_state = "tile-bluecarpet"
// VOREStation Edit
// TODO - Add descriptions to these
/obj/item/stack/tile/carpet/bcarpet
icon_state = "tile-bcarpet"
/obj/item/stack/tile/carpet/blucarpet
icon_state = "tile-blucarpet"
/obj/item/stack/tile/carpet/turcarpet
icon_state = "tile-turcarpet"
/obj/item/stack/tile/carpet/sblucarpet
icon_state = "tile-sblucarpet"
/obj/item/stack/tile/carpet/gaycarpet
icon_state = "tile-gaycarpet"
/obj/item/stack/tile/carpet/purcarpet
icon_state = "tile-purcarpet"
/obj/item/stack/tile/carpet/oracarpet
icon_state = "tile-oracarpet"
// VOREStation Edit End
/obj/item/stack/tile/floor
name = "floor tile"
singular_name = "floor tile"
desc = "Those could work as a pretty decent throwing weapon" //why?
icon_state = "tile"
force = 6.0
matter = list(DEFAULT_WALL_MATERIAL = SHEET_MATERIAL_AMOUNT / 4)
throwforce = 15.0
throw_speed = 5
throw_range = 20
flags = CONDUCT
/obj/item/stack/tile/floor/red
name = "red floor tile"
singular_name = "red floor tile"
color = COLOR_RED_GRAY
icon_state = "tile_white"
// VOREStation Edit
/obj/item/stack/tile/floor/techgrey
name = "grey techfloor tile"
singular_name = "grey techfloor tile"
icon_state = "techtile_grey"
/obj/item/stack/tile/floor/techgrid
name = "grid techfloor tile"
singular_name = "grid techfloor tile"
icon_state = "techtile_grid"
/obj/item/stack/tile/floor/steel_dirty
name = "steel floor tile"
singular_name = "steel floor tile"
icon_state = "tile_steel"
matter = list("plasteel" = SHEET_MATERIAL_AMOUNT / 4)
// VOREStation Edit End
/obj/item/stack/tile/floor/steel
name = "steel floor tile"
singular_name = "steel floor tile"
icon_state = "tile_steel"
matter = list("plasteel" = SHEET_MATERIAL_AMOUNT / 4)
/obj/item/stack/tile/floor/white
name = "white floor tile"
singular_name = "white floor tile"
icon_state = "tile_white"
matter = list("plastic" = SHEET_MATERIAL_AMOUNT / 4)
/obj/item/stack/tile/floor/yellow
name = "yellow floor tile"
singular_name = "yellow floor tile"
color = COLOR_BROWN
icon_state = "tile_white"
/obj/item/stack/tile/floor/dark
name = "dark floor tile"
singular_name = "dark floor tile"
icon_state = "fr_tile"
matter = list("plasteel" = SHEET_MATERIAL_AMOUNT / 4)
/obj/item/stack/tile/floor/freezer
name = "freezer floor tile"
singular_name = "freezer floor tile"
icon_state = "tile_freezer"
matter = list("plastic" = SHEET_MATERIAL_AMOUNT / 4)
/obj/item/stack/tile/floor/cyborg
name = "floor tile synthesizer"
desc = "A device that makes floor tiles."
gender = NEUTER
matter = null
uses_charge = 1
charge_costs = list(250)
stacktype = /obj/item/stack/tile/floor
build_type = /obj/item/stack/tile/floor
/obj/item/stack/tile/linoleum
name = "linoleum"
singular_name = "linoleum"
desc = "A piece of linoleum. It is the same size as a normal floor tile!"
icon_state = "tile-linoleum"
force = 1.0
throwforce = 1.0
throw_speed = 5
throw_range = 20
flags = 0
@@ -14,3 +14,15 @@
/obj/item/weapon/stock_parts/matter_bin = 2,
/obj/item/weapon/stock_parts/manipulator = 2,
/obj/item/weapon/stock_parts/console_screen = 1)
// Board for the algae oxygen generator in algae_generator.dm
/obj/item/weapon/circuitboard/algae_farm
name = T_BOARD("algae oxygen generator")
build_path = /obj/machinery/atmospherics/binary/algae_farm
board_type = new /datum/frame/frame_types/machine
origin_tech = list(TECH_ENGINEERING = 3, TECH_BIO = 2)
req_components = list(
/obj/item/weapon/stock_parts/matter_bin = 2,
/obj/item/weapon/stock_parts/manipulator = 1,
/obj/item/weapon/stock_parts/capacitor = 1,
/obj/item/weapon/stock_parts/console_screen = 1)
@@ -54,7 +54,7 @@
/obj/item/weapon/storage/box/survival/New()
..()
new /obj/item/clothing/mask/breath(src)
new /obj/item/clothing/mask/gas(src) // VOREStation Edit - Tether
new /obj/item/weapon/tank/emergency/oxygen(src)
//VS Edit
+83
View File
@@ -0,0 +1,83 @@
// Based on catwalk.dm from https://github.com/Endless-Horizon/CEV-Eris
/obj/structure/catwalk
layer = TURF_LAYER + 0.5
icon = 'icons/turf/catwalks.dmi'
icon_state = "catwalk"
name = "catwalk"
desc = "Cats really don't like these things."
density = 0
anchored = 1.0
/obj/structure/catwalk/New()
..()
spawn(4)
if(src)
for(var/obj/structure/catwalk/C in get_turf(src))
if(C != src)
qdel(C)
update_icon()
redraw_nearby_catwalks()
/obj/structure/catwalk/Destroy()
..()
redraw_nearby_catwalks()
/obj/structure/catwalk/proc/redraw_nearby_catwalks()
for(var/direction in alldirs)
if(locate(/obj/structure/catwalk, get_step(src, direction)))
var/obj/structure/catwalk/L = locate(/obj/structure/catwalk, get_step(src, direction))
L.update_icon() //so siding get updated properly
/obj/structure/catwalk/update_icon()
var/connectdir = 0
for(var/direction in cardinal)
if(locate(/obj/structure/catwalk, get_step(src, direction)))
connectdir |= direction
//Check the diagonal connections for corners, where you have, for example, connections both north and east. In this case it checks for a north-east connection to determine whether to add a corner marker or not.
var/diagonalconnect = 0 //1 = NE; 2 = SE; 4 = NW; 8 = SW
//NORTHEAST
if(connectdir & NORTH && connectdir & EAST)
if(locate(/obj/structure/catwalk, get_step(src, NORTHEAST)))
diagonalconnect |= 1
//SOUTHEAST
if(connectdir & SOUTH && connectdir & EAST)
if(locate(/obj/structure/catwalk, get_step(src, SOUTHEAST)))
diagonalconnect |= 2
//NORTHWEST
if(connectdir & NORTH && connectdir & WEST)
if(locate(/obj/structure/catwalk, get_step(src, NORTHWEST)))
diagonalconnect |= 4
//SOUTHWEST
if(connectdir & SOUTH && connectdir & WEST)
if(locate(/obj/structure/catwalk, get_step(src, SOUTHWEST)))
diagonalconnect |= 8
icon_state = "catwalk[connectdir]-[diagonalconnect]"
/obj/structure/catwalk/ex_act(severity)
switch(severity)
if(1.0)
qdel(src)
if(2.0)
qdel(src)
return
/obj/structure/catwalk/attackby(obj/item/C as obj, mob/user as mob)
if (istype(C, /obj/item/weapon/weldingtool))
var/obj/item/weapon/weldingtool/WT = C
if(WT.isOn())
if(WT.remove_fuel(0, user))
to_chat(user, "<span class='notice'>Slicing lattice joints ...</span>")
new /obj/item/stack/rods(src.loc)
new /obj/item/stack/rods(src.loc)
new /obj/structure/lattice(src.loc)
qdel(src)
return ..()
/obj/structure/catwalk/Crossed()
. = ..()
if(isliving(usr))
playsound(src, pick('sound/effects/footstep/catwalk1.ogg', 'sound/effects/footstep/catwalk2.ogg', 'sound/effects/footstep/catwalk3.ogg', 'sound/effects/footstep/catwalk4.ogg', 'sound/effects/footstep/catwalk5.ogg'), 25, 1)
@@ -46,6 +46,7 @@
new /obj/item/clothing/gloves/sterile/latex(src)
new /obj/item/device/radio/headset/heads/rd(src)
new /obj/item/device/radio/headset/heads/rd/alt(src)
new /obj/item/weapon/bluespace_harpoon //VOREStation Edit
new /obj/item/weapon/tank/air(src)
new /obj/item/clothing/mask/gas(src)
new /obj/item/device/flash(src)
@@ -43,8 +43,8 @@
new /obj/item/device/radio/headset/heads/hop/alt(src)
new /obj/item/weapon/storage/box/ids(src)
new /obj/item/weapon/storage/box/ids( src )
new /obj/item/weapon/gun/energy/gun(src)
new /obj/item/weapon/gun/projectile/sec/flash(src)
new /obj/item/weapon/gun/energy/gun/martin(src) //VOREStation Edit
//new /obj/item/weapon/gun/projectile/sec/flash(src) //VOREStation Edit
new /obj/item/device/flash(src)
return
@@ -83,7 +83,7 @@
/obj/structure/closet/secure_closet/hos
name = "head of security's locker"
name = "head of security's attire" //VOREStation Edit
req_access = list(access_hos)
icon_state = "hossecure1"
icon_closed = "hossecure"
@@ -92,7 +92,7 @@
icon_broken = "hossecurebroken"
icon_off = "hossecureoff"
storage_capacity = 2.5 * MOB_MEDIUM
//VOREStation Edit - This list split into two lockers
New()
..()
if(prob(50))
@@ -108,33 +108,50 @@
new /obj/item/clothing/suit/storage/vest/hoscoat/jensen(src)
new /obj/item/clothing/suit/storage/vest/hoscoat(src)
new /obj/item/clothing/head/helmet/HoS/dermal(src)
new /obj/item/weapon/cartridge/hos(src)
new /obj/item/device/radio/headset/heads/hos(src)
new /obj/item/device/radio/headset/heads/hos/alt(src)
new /obj/item/clothing/glasses/sunglasses/sechud(src)
new /obj/item/weapon/storage/belt/security(src)
new /obj/item/clothing/accessory/holster/waist(src)
new /obj/item/clothing/head/beret/sec/corporate/hos(src)
new /obj/item/clothing/suit/storage/hooded/wintercoat/security(src)
new /obj/item/clothing/mask/gas/half(src)
return
//VOREStation Edit - Locker has too much junk in it, splitting it up
/obj/structure/closet/secure_closet/hos2
name = "head of security's gear"
req_access = list(access_hos)
icon_state = "hossecure1"
icon_closed = "hossecure"
icon_locked = "hossecure1"
icon_opened = "hossecureopen"
icon_broken = "hossecurebroken"
icon_off = "hossecureoff"
storage_capacity = 2.5 * MOB_MEDIUM
New()
..()
new /obj/item/weapon/cartridge/hos(src)
new /obj/item/taperoll/police(src)
new /obj/item/weapon/shield/riot(src)
new /obj/item/weapon/shield/riot/tele(src)
new /obj/item/weapon/storage/box/holobadge/hos(src)
new /obj/item/clothing/accessory/badge/holo/hos(src)
new /obj/item/weapon/reagent_containers/spray/pepper(src)
new /obj/item/weapon/crowbar/red(src)
new /obj/item/weapon/storage/box/flashbangs(src)
new /obj/item/weapon/storage/belt/security(src)
new /obj/item/device/flash(src)
new /obj/item/weapon/melee/baton/loaded(src)
new /obj/item/weapon/gun/projectile/lamia(src)
new /obj/item/ammo_magazine/a44/rubber(src)
new /obj/item/ammo_magazine/a44(src)
new /obj/item/ammo_magazine/a44(src)
new /obj/item/weapon/gun/energy/gun(src)
new /obj/item/weapon/cell/device/weapon(src)
new /obj/item/clothing/accessory/holster/waist(src)
new /obj/item/weapon/melee/telebaton(src)
new /obj/item/clothing/head/beret/sec/corporate/hos(src)
new /obj/item/clothing/suit/storage/hooded/wintercoat/security(src)
new /obj/item/device/flashlight/maglight(src)
new /obj/item/clothing/mask/gas/half(src)
return
/obj/structure/closet/secure_closet/warden
name = "warden's locker"
req_access = list(access_armory)
@@ -277,10 +294,10 @@
new /obj/item/device/radio/headset/headset_sec(src)
new /obj/item/device/radio/headset/headset_sec/alt(src)
new /obj/item/clothing/suit/storage/vest/detective(src)
new /obj/item/ammo_magazine/c45m/rubber(src)
new /obj/item/ammo_magazine/c45m/rubber(src)
new /obj/item/ammo_magazine/a44sl/rubber(src) //VOREStation Edit
new /obj/item/ammo_magazine/a44sl/rubber(src) //VOREStation Edit
new /obj/item/taperoll/police(src)
new /obj/item/weapon/gun/projectile/colt/detective(src)
new /obj/item/weapon/gun/projectile/revolver/consul(src) //VOREStation Edit
new /obj/item/clothing/accessory/holster/armpit(src)
new /obj/item/device/flashlight/maglight(src)
new /obj/item/weapon/reagent_containers/food/drinks/flask/detflask(src)
@@ -7,4 +7,151 @@
icon_opened = "hossecureopen"
icon_broken = "hossecurebroken"
icon_off = "hossecureoff"
storage_capacity = 3 * MOB_MEDIUM
storage_capacity = 3 * MOB_MEDIUM
//Custom NT Security Lockers, Only found at central command
/obj/structure/closet/secure_closet/nanotrasen_security
name = "NanoTrasen security officer's locker"
req_access = list(access_brig)
icon = 'icons/obj/closet_vr.dmi'
icon_state = "secC1"
icon_closed = "secC"
icon_locked = "sec1C"
icon_opened = "secCopen"
icon_broken = "secCbroken"
icon_off = "seCcoff"
storage_capacity = 3.5 * MOB_MEDIUM
New()
..()
if(prob(25))
new /obj/item/weapon/storage/backpack/security(src)
else
new /obj/item/weapon/storage/backpack/satchel/sec(src)
if(prob(75))
new /obj/item/weapon/storage/backpack/dufflebag/sec(src)
new /obj/item/clothing/suit/storage/vest/nanotrasen(src)
new /obj/item/clothing/head/helmet(src)
new /obj/item/weapon/cartridge/security(src)
new /obj/item/device/radio/headset/headset_sec(src)
new /obj/item/device/radio/headset/headset_sec/alt(src)
new /obj/item/weapon/storage/belt/security(src)
new /obj/item/device/flash(src)
new /obj/item/weapon/reagent_containers/spray/pepper(src)
new /obj/item/weapon/grenade/flashbang(src)
new /obj/item/weapon/melee/baton/loaded(src)
new /obj/item/clothing/glasses/sunglasses/sechud(src)
new /obj/item/taperoll/police(src)
new /obj/item/device/hailer(src)
new /obj/item/device/flashlight/flare(src)
new /obj/item/clothing/accessory/storage/black_vest(src)
new /obj/item/weapon/gun/energy/taser(src)
new /obj/item/weapon/cell/device/weapon(src)
new /obj/item/device/flashlight/maglight(src)
new /obj/item/clothing/head/soft/nanotrasen(src)
new /obj/item/clothing/head/beret/nanotrasen(src)
new /obj/item/clothing/under/nanotrasen/security(src)
new /obj/item/clothing/gloves/black(src)
new /obj/item/clothing/shoes/boots/jackboots(src)
new /obj/item/clothing/shoes/boots/jackboots/toeless(src)
return
/obj/structure/closet/secure_closet/nanotrasen_commander
name = "NanoTrasen commander's locker"
req_access = list(access_brig)
icon = 'icons/obj/closet_vr.dmi'
icon_state = "secC1"
icon_closed = "secC"
icon_locked = "sec1C"
icon_opened = "secCopen"
icon_broken = "secCbroken"
icon_off = "seCcoff"
storage_capacity = 3.5 * MOB_MEDIUM
New()
..()
if(prob(25))
new /obj/item/weapon/storage/backpack/security(src)
else
new /obj/item/weapon/storage/backpack/satchel/sec(src)
if(prob(75))
new /obj/item/weapon/storage/backpack/dufflebag/sec(src)
new /obj/item/clothing/head/helmet/HoS(src)
new /obj/item/clothing/suit/storage/vest/hos(src)
new /obj/item/clothing/under/rank/head_of_security/jensen(src)
new /obj/item/clothing/suit/storage/vest/hoscoat/jensen(src)
new /obj/item/clothing/suit/storage/vest/hoscoat(src)
new /obj/item/clothing/head/helmet/HoS/dermal(src)
new /obj/item/weapon/cartridge/hos(src)
new /obj/item/device/radio/headset/heads/hos(src)
new /obj/item/device/radio/headset/heads/hos/alt(src)
new /obj/item/clothing/glasses/sunglasses/sechud(src)
new /obj/item/taperoll/police(src)
new /obj/item/weapon/shield/riot(src)
new /obj/item/weapon/shield/riot/tele(src)
new /obj/item/weapon/storage/box/holobadge/hos(src)
new /obj/item/clothing/accessory/badge/holo/hos(src)
new /obj/item/weapon/reagent_containers/spray/pepper(src)
new /obj/item/weapon/crowbar/red(src)
new /obj/item/weapon/storage/box/flashbangs(src)
new /obj/item/weapon/storage/belt/security(src)
new /obj/item/device/flash(src)
new /obj/item/weapon/melee/baton/loaded(src)
new /obj/item/weapon/gun/energy/gun(src)
new /obj/item/weapon/cell/device/weapon(src)
new /obj/item/clothing/accessory/holster/waist(src)
new /obj/item/weapon/melee/telebaton(src)
new /obj/item/clothing/head/beret/sec/corporate/hos(src)
new /obj/item/device/flashlight/maglight(src)
new /obj/item/clothing/gloves/black(src)
new /obj/item/clothing/shoes/boots/jackboots(src)
new /obj/item/clothing/shoes/boots/jackboots/toeless(src)
new /obj/item/clothing/under/nanotrasen/security/commander(src)
return
/obj/structure/closet/secure_closet/nanotrasen_warden
name = "NanoTrasen warden's locker"
req_access = list(access_brig)
icon = 'icons/obj/closet_vr.dmi'
icon_state = "secC1"
icon_closed = "secC"
icon_locked = "sec1C"
icon_opened = "secCopen"
icon_broken = "secCbroken"
icon_off = "seCcoff"
storage_capacity = 3.5 * MOB_MEDIUM
New()
..()
if(prob(25))
new /obj/item/weapon/storage/backpack/security(src)
else
new /obj/item/weapon/storage/backpack/satchel/sec(src)
if(prob(75))
new /obj/item/weapon/storage/backpack/dufflebag/sec(src)
new /obj/item/clothing/suit/storage/vest/warden(src)
new /obj/item/clothing/under/nanotrasen/security/warden(src)
new /obj/item/clothing/suit/storage/vest/wardencoat/alt(src)
new /obj/item/clothing/head/helmet/warden(src)
new /obj/item/weapon/cartridge/security(src)
new /obj/item/device/radio/headset/headset_sec(src)
new /obj/item/device/radio/headset/headset_sec/alt(src)
new /obj/item/clothing/glasses/sunglasses/sechud(src)
new /obj/item/taperoll/police(src)
new /obj/item/clothing/accessory/badge/holo/warden(src)
new /obj/item/weapon/storage/box/flashbangs(src)
new /obj/item/weapon/storage/belt/security(src)
new /obj/item/weapon/reagent_containers/spray/pepper(src)
new /obj/item/weapon/melee/baton/loaded(src)
new /obj/item/weapon/gun/energy/gun(src)
new /obj/item/weapon/cell/device/weapon(src)
new /obj/item/weapon/storage/box/holobadge(src)
new /obj/item/clothing/head/beret/sec/corporate/warden(src)
new /obj/item/device/flashlight/maglight(src)
new /obj/item/device/megaphone(src)
new /obj/item/clothing/gloves/black(src)
new /obj/item/clothing/shoes/boots/jackboots(src)
new /obj/item/clothing/shoes/boots/jackboots/toeless(src)
return
+1 -1
View File
@@ -1,7 +1,7 @@
/obj/structure/grille
name = "grille"
desc = "A flimsy lattice of metal rods, with screws to secure it to the floor."
icon = 'icons/obj/structures.dmi'
icon = 'icons/obj/structures_vr.dmi' // VOREStation Edit - New icons
icon_state = "grille"
density = 1
anchored = 1
+12 -1
View File
@@ -67,7 +67,18 @@
user << "<span class='notice'>Slicing lattice joints ...</span>"
new /obj/item/stack/rods(src.loc)
qdel(src)
return
// VOREStation Edit - Added Catwalks
if (istype(C, /obj/item/stack/rods))
var/obj/item/stack/rods/R = C
if(R.use(2))
user << "<span class='notice'>You start connecting \the [R.name] to \the [src.name] ...</span>"
if(do_after(user, 5 SECONDS))
src.alpha = 0 // Note: I don't know why this is set, Eris did it, just trusting for now. ~Leshana
new /obj/structure/catwalk(src.loc)
qdel(src)
return
// VOREStation Edit End
return
/obj/structure/lattice/proc/updateOverlays()
+318
View File
@@ -0,0 +1,318 @@
// Based on railing.dmi from https://github.com/Endless-Horizon/CEV-Eris
/obj/structure/railing
name = "railing"
desc = "A standard steel railing. Play stupid games win stupid prizes."
icon = 'icons/obj/railing.dmi'
density = 1
throwpass = 1
climbable = 1
layer = 3.2 //Just above doors
anchored = 1
flags = ON_BORDER
icon_state = "railing0"
var/broken = FALSE
var/health = 70
var/maxhealth = 70
var/check = 0
/obj/structure/railing/New(loc, constructed = 0)
..()
// TODO - "constructed" is not passed to us. We need to find a way to do this safely.
if (constructed) // player-constructed railings
anchored = 0
if(climbable)
verbs += /obj/structure/proc/climb_on
/obj/structure/railing/initialize()
..()
if(src.anchored)
update_icon(0)
/obj/structure/railing/Destroy()
for(var/obj/structure/railing/R in oview(src, 1))
R.update_icon()
..()
/obj/structure/railing/CanPass(atom/movable/mover, turf/target, height=0, air_group=0)
if(!mover)
return 1
if(istype(mover) && mover.checkpass(PASSTABLE))
return 1
if(get_dir(loc, target) == dir)
return !density
else
return 1
/obj/structure/railing/examine(mob/user)
. = ..()
if(health < maxhealth)
switch(health / maxhealth)
if(0.0 to 0.5)
to_chat(user, "<span class='warning'>It looks severely damaged!</span>")
if(0.25 to 0.5)
to_chat(user, "<span class='warning'>It looks damaged!</span>")
if(0.5 to 1.0)
to_chat(user, "<span class='notice'>It has a few scrapes and dents.</span>")
/obj/structure/railing/proc/take_damage(amount)
health -= amount
if(health <= 0)
visible_message("<span class='warning'>\The [src] breaks down!</span>")
playsound(loc, 'sound/effects/grillehit.ogg', 50, 1)
new /obj/item/stack/rods(get_turf(usr))
qdel(src)
/obj/structure/railing/proc/NeighborsCheck(var/UpdateNeighbors = 1)
check = 0
//if (!anchored) return
var/Rturn = turn(src.dir, -90)
var/Lturn = turn(src.dir, 90)
for(var/obj/structure/railing/R in src.loc)
if ((R.dir == Lturn) && R.anchored)
check |= 32
if (UpdateNeighbors)
R.update_icon(0)
if ((R.dir == Rturn) && R.anchored)
check |= 2
if (UpdateNeighbors)
R.update_icon(0)
for (var/obj/structure/railing/R in get_step(src, Lturn))
if ((R.dir == src.dir) && R.anchored)
check |= 16
if (UpdateNeighbors)
R.update_icon(0)
for (var/obj/structure/railing/R in get_step(src, Rturn))
if ((R.dir == src.dir) && R.anchored)
check |= 1
if (UpdateNeighbors)
R.update_icon(0)
for (var/obj/structure/railing/R in get_step(src, (Lturn + src.dir)))
if ((R.dir == Rturn) && R.anchored)
check |= 64
if (UpdateNeighbors)
R.update_icon(0)
for (var/obj/structure/railing/R in get_step(src, (Rturn + src.dir)))
if ((R.dir == Lturn) && R.anchored)
check |= 4
if (UpdateNeighbors)
R.update_icon(0)
/obj/structure/railing/update_icon(var/UpdateNeighgors = 1)
NeighborsCheck(UpdateNeighgors)
layer = (dir == SOUTH) ? FLY_LAYER : initial(layer)
overlays.Cut()
if (!check || !anchored)//|| !anchored
icon_state = "railing0"
else
icon_state = "railing1"
if (check & 32)
overlays += image ('icons/obj/railing.dmi', src, "corneroverlay")
if ((check & 16) || !(check & 32) || (check & 64))
overlays += image ('icons/obj/railing.dmi', src, "frontoverlay_l")
if (!(check & 2) || (check & 1) || (check & 4))
overlays += image ('icons/obj/railing.dmi', src, "frontoverlay_r")
if(check & 4)
switch (src.dir)
if (NORTH)
overlays += image ('icons/obj/railing.dmi', src, "mcorneroverlay", pixel_x = 32)
if (SOUTH)
overlays += image ('icons/obj/railing.dmi', src, "mcorneroverlay", pixel_x = -32)
if (EAST)
overlays += image ('icons/obj/railing.dmi', src, "mcorneroverlay", pixel_y = -32)
if (WEST)
overlays += image ('icons/obj/railing.dmi', src, "mcorneroverlay", pixel_y = 32)
/obj/structure/railing/verb/rotate()
set name = "Rotate Railing Counter-Clockwise"
set category = "Object"
set src in oview(1)
if(usr.incapacitated())
return 0
if(anchored)
to_chat(usr, "It is fastened to the floor therefore you can't rotate it!")
return 0
set_dir(turn(dir, 90))
update_icon()
return
/obj/structure/railing/verb/revrotate()
set name = "Rotate Railing Clockwise"
set category = "Object"
set src in oview(1)
if(usr.incapacitated())
return 0
if(anchored)
to_chat(usr, "It is fastened to the floor therefore you can't rotate it!")
return 0
set_dir(turn(dir, -90))
update_icon()
return
/obj/structure/railing/verb/flip() // This will help push railing to remote places, such as open space turfs
set name = "Flip Railing"
set category = "Object"
set src in oview(1)
if(usr.incapacitated())
return 0
if(anchored)
to_chat(usr, "It is fastened to the floor therefore you can't flip it!")
return 0
var/obj/occupied = neighbor_turf_impassable()
if(occupied)
to_chat(usr, "You can't flip \the [src] because there's \a [occupied] in the way.")
return 0
src.loc = get_step(src, src.dir)
set_dir(turn(dir, 180))
update_icon()
return
/obj/structure/railing/CheckExit(atom/movable/O as mob|obj, target as turf)
if(istype(O) && O.checkpass(PASSTABLE))
return 1
if(get_dir(O.loc, target) == dir)
return 0
return 1
/obj/structure/railing/attackby(obj/item/W as obj, mob/user as mob)
// Dismantle
if(istype(W, /obj/item/weapon/wrench) && !anchored)
playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
if(do_after(user, 20, src))
user.visible_message("<span class='notice'>\The [user] dismantles \the [src].</span>", "<span class='notice'>You dismantle \the [src].</span>")
new /obj/item/stack/material/steel(get_turf(usr), 2)
qdel(src)
return
// Repair
if(health < maxhealth && istype(W, /obj/item/weapon/weldingtool))
var/obj/item/weapon/weldingtool/F = W
if(F.welding)
playsound(src.loc, 'sound/items/Welder.ogg', 50, 1)
if(do_after(user, 20, src))
user.visible_message("<span class='notice'>\The [user] repairs some damage to \the [src].</span>", "<span class='notice'>You repair some damage to \the [src].</span>")
health = min(health+(maxhealth/5), maxhealth) // 20% repair per application
return
// Install
if(istype(W, /obj/item/weapon/screwdriver))
user.visible_message(anchored ? "<span class='notice'>\The [user] begins unscrewing \the [src].</span>" : "<span class='notice'>\The [user] begins fasten \the [src].</span>" )
playsound(loc, 'sound/items/Screwdriver.ogg', 75, 1)
if(do_after(user, 10, src))
to_chat(user, (anchored ? "<span class='notice'>You have unfastened \the [src] from the floor.</span>" : "<span class='notice'>You have fastened \the [src] to the floor.</span>"))
anchored = !anchored
update_icon()
return
// Handle harm intent grabbing/tabling.
if(istype(W, /obj/item/weapon/grab) && get_dist(src,user)<2)
var/obj/item/weapon/grab/G = W
if (istype(G.affecting, /mob/living))
var/mob/living/M = G.affecting
var/obj/occupied = turf_is_crowded()
if(occupied)
to_chat(user, "<span class='danger'>There's \a [occupied] in the way.</span>")
return
if (G.state < 2)
if(user.a_intent == I_HURT)
if (prob(15)) M.Weaken(5)
M.apply_damage(8,def_zone = "head")
take_damage(8)
visible_message("<span class='danger'>[G.assailant] slams [G.affecting]'s face against \the [src]!</span>")
playsound(loc, 'sound/effects/grillehit.ogg', 50, 1)
else
to_chat(user, "<span class='danger'>You need a better grip to do that!</span>")
return
else
if (get_turf(G.affecting) == get_turf(src))
G.affecting.forceMove(get_step(src, src.dir))
else
G.affecting.forceMove(get_turf(src))
G.affecting.Weaken(5)
visible_message("<span class='danger'>[G.assailant] throws [G.affecting] over \the [src]!</span>")
qdel(W)
return
else
playsound(loc, 'sound/effects/grillehit.ogg', 50, 1)
take_damage(W.force)
return ..()
/obj/structure/railing/ex_act(severity)
switch(severity)
if(1.0)
qdel(src)
return
if(2.0)
qdel(src)
return
if(3.0)
qdel(src)
return
else
return
// Duplicated from structures.dm, but its a bit different.
/obj/structure/railing/do_climb(var/mob/living/user)
if(!can_climb(user))
return
usr.visible_message("<span class='warning'>[user] starts climbing onto \the [src]!</span>")
climbers |= user
if(!do_after(user,(issmall(user) ? 20 : 34)))
climbers -= user
return
if(!can_climb(user, post_climb_check=1))
climbers -= user
return
if(get_turf(user) == get_turf(src))
usr.forceMove(get_step(src, src.dir))
else
usr.forceMove(get_turf(src))
usr.visible_message("<span class='warning'>[user] climbed over \the [src]!</span>")
if(!anchored) take_damage(maxhealth) // Fatboy
climbers -= user
/obj/structure/railing/can_climb(var/mob/living/user, post_climb_check=0)
if(!..())
return 0
// Normal can_climb() handles climbing from adjacent turf onto our turf. But railings also allow climbing
// from our turf onto an adjacent! If that is the case we need to do checks for that too...
if(get_turf(user) == get_turf(src))
var/obj/occupied = neighbor_turf_impassable()
if(occupied)
to_chat(user, "<span class='danger'>You can't climb there, there's \a [occupied] in the way.</span>")
return 0
return 1
// TODO - This here might require some investigation
/obj/structure/proc/neighbor_turf_impassable()
var/turf/T = get_step(src, src.dir)
if(!T || !istype(T))
return 0
if(T.density == 1)
return T
for(var/obj/O in T.contents)
if(istype(O,/obj/structure))
var/obj/structure/S = O
if(S.climbable) continue
if(O && O.density && !(O.flags & ON_BORDER && !(turn(O.dir, 180) & dir)))
return O
+352
View File
@@ -304,6 +304,20 @@
desc = "A direction sign, pointing out which way the Cargo department is."
icon_state = "direction_crg"
// VOREStation Edit - New signs for us
/obj/structure/sign/directions/command
icon = 'icons/obj/decals_vr.dmi'
name = "\improper Command department"
desc = "A direction sign, pointing out which way the Command department is."
icon_state = "direction_cmd"
/obj/structure/sign/directions/elevator
icon = 'icons/obj/decals_vr.dmi'
name = "\improper Space Elevator"
desc = "A direction sign, pointing out which way the Space Elevator is."
icon_state = "direction_elv"
// VOREStation Edit End
/obj/structure/sign/christmas/lights
name = "Christmas lights"
desc = "Flashy and pretty."
@@ -315,3 +329,341 @@
desc = "Prickly and festive."
icon = 'icons/obj/christmas.dmi'
icon_state = "doorwreath"
//Eris signs
/obj/structure/sign/ironhammer
icon = 'icons/obj/decals_vr.dmi'
name = "Ironhammer Security"
desc = "Sign depicts the symbolic of Ironhammer Security, the largest security provider within Trade Union of Hansa."
icon_state = "ironhammer"
/obj/structure/sign/atmos_co2
icon = 'icons/obj/decals_vr.dmi'
name = "CO2 warning sign"
desc = "WARNING! CO2 flow tube. Ensure the flow is disengaged before working."
icon_state = "atmos_co2"
/obj/structure/sign/atmos_n2o
icon = 'icons/obj/decals_vr.dmi'
name = "N2O warning sign"
desc = "WARNING! N2O flow tube. Ensure the flow is disengaged before working."
icon_state = "atmos_n2o"
/obj/structure/sign/atmos_plasma
icon = 'icons/obj/decals_vr.dmi'
name = "Plasma warning sign"
desc = "WARNING! Plasma flow tube. Ensure the flow is disengaged before working."
icon_state = "atmos_plasma"
/obj/structure/sign/atmos_n2
icon = 'icons/obj/decals_vr.dmi'
name = "N2 warning sign"
desc = "WARNING! N2 flow tube. Ensure the flow is disengaged before working."
icon_state = "atmos_n2"
/obj/structure/sign/atmos_o2
icon = 'icons/obj/decals_vr.dmi'
name = "O2 warning sign"
desc = "WARNING! O2 flow tube. Ensure the flow is disengaged before working."
icon_state = "atmos_o2"
/obj/structure/sign/atmos_air
icon = 'icons/obj/decals_vr.dmi'
name = "Air warning sign"
desc = "WARNING! Air flow tube. Ensure the flow is disengaged before working."
icon_state = "atmos_air"
/obj/structure/sign/atmos_waste
icon = 'icons/obj/decals_vr.dmi'
name = "Atmos waste warning sign"
desc = "WARNING! Waste flow tube. Ensure the flow is disengaged before working."
icon_state = "atmos_waste"
/obj/structure/sign/deck1
icon = 'icons/obj/decals_vr.dmi'
desc = "A silver sign which reads 'DECK I'."
name = "DECK I"
icon_state = "deck1"
/obj/structure/sign/deck2
icon = 'icons/obj/decals_vr.dmi'
desc = "A silver sign which reads 'DECK II'."
name = "DECK II"
icon_state = "deck2"
/obj/structure/sign/deck3
icon = 'icons/obj/decals_vr.dmi'
desc = "A silver sign which reads 'DECK III'."
name = "DECK III"
icon_state = "deck3"
/obj/structure/sign/deck4
icon = 'icons/obj/decals_vr.dmi'
desc = "A silver sign which reads 'DECK IV'."
name = "DECK IV"
icon_state = "deck4"
/obj/structure/sign/sec1
icon = 'icons/obj/decals_vr.dmi'
desc = "A silver sign which reads 'SECTION I'."
name = "SECTION I"
icon_state = "sec1"
/obj/structure/sign/sec2
icon = 'icons/obj/decals_vr.dmi'
desc = "A silver sign which reads 'SECTION II'."
name = "SECTION II"
icon_state = "sec2"
/obj/structure/sign/sec3
icon = 'icons/obj/decals_vr.dmi'
desc = "A silver sign which reads 'SECTION III'."
name = "SECTION III"
icon_state = "sec3"
/obj/structure/sign/sec4
icon = 'icons/obj/decals_vr.dmi'
desc = "A silver sign which reads 'SECTION IV'."
name = "SECTION IV"
icon_state = "sec4"
/obj/structure/sign/nanotrasen
icon = 'icons/obj/decals_vr.dmi'
name = "\improper NanoTrasen"
desc = "An old metal sign which reads 'NanoTrasen'."
icon_state = "NT"
// Eris standards compliant hazards
/obj/structure/sign/signnew
icon = 'icons/obj/decals_vr.dmi'
/obj/structure/sign/signnew/biohazard
name = "BIOLOGICAL HAZARD"
desc = "Warning: Biological and-or toxic hazards present in this area!"
icon_state = "biohazard"
/obj/structure/sign/signnew/corrosives
name = "CORROSIVE SUBSTANCES"
desc = "Warning: Corrosive substances prezent in this area!"
icon_state = "corrosives"
/obj/structure/sign/signnew/explosives
name = "EXPLOSIVE SUBSTANCES"
desc = "Warning: Explosive substances present in this area!"
icon_state = "explosives"
/obj/structure/sign/signnew/flammables
name = "FLAMMABLE SUBSTANCES"
desc = "Warning: Flammable substances present in this area!"
icon_state = "flammable"
/obj/structure/sign/signnew/laserhazard
name = "LASER HAZARD"
desc = "Warning: High powered laser emitters operating in this area!"
icon_state = "laser"
/obj/structure/sign/signnew/danger
name = "DANGEROUS AREA"
desc = "Warning: Generally hazardous area! Exercise caution."
icon_state = "danger"
/obj/structure/sign/signnew/magnetics
name = "MAGNETIC FIELD HAZARD"
desc = "Warning: Extremely powerful magnetic fields present in this area!"
icon_state = "magnetics"
/obj/structure/sign/signnew/opticals
name = "OPTICAL HAZARD"
desc = "Warning: Optical hazards present in this area!"
icon_state = "optical"
/obj/structure/sign/signnew/radiation
name = "RADIATION HAZARD"
desc = "Warning: Significant levels of radiation present in this area!"
icon_state = "radiation"
/obj/structure/sign/signnew/secure
name = "SECURE AREA"
desc = "Warning: Secure Area! Do not enter without authorization!"
icon_state = "secure"
/obj/structure/sign/signnew/electrical
name = "ELECTRICAL HAZARD"
desc = "Warning: Electrical hazards! Wear protective equipment."
icon_state = "electrical"
/obj/structure/sign/signnew/cryogenics
name = "CRYOGENIC TEMPERATURES"
desc = "Warning: Extremely low temperatures in this area."
icon_state = "cryogenics"
/obj/structure/sign/signnew/canisters
name = "PRESSURIZED CANISTERS"
desc = "Warning: Highly pressurized canister storage."
icon_state = "canisters"
/obj/structure/sign/signnew/oxidants
name = "OXIDIZING AGENTS"
desc = "Warning: Oxidizing agents in this area, do not start fires!"
icon_state = "oxidants"
/obj/structure/sign/signnew/memetic
name = "MEMETIC HAZARD"
desc = "Warning: Memetic hazard, wear meson goggles!"
icon_state = "memetic"
//Eris departments
/obj/structure/sign/department
icon = 'icons/obj/decals_vr.dmi'
name = "department sign"
desc = "Sign of some important ship compartment."
/obj/structure/sign/department/medbay
name = "MEDBAY"
icon_state = "medbay"
/obj/structure/sign/department/virology
name = "VIROLOGY"
icon_state = "virology"
/obj/structure/sign/department/chem
name = "CHEMISTRY"
icon_state = "chem"
/obj/structure/sign/department/gene
name = "GENETICS"
icon_state = "gene"
/obj/structure/sign/department/morgue
name = "MORGUE"
icon_state = "morgue"
/obj/structure/sign/department/operational
name = "SURGERY"
icon_state = "operational"
/obj/structure/sign/department/sci
name = "SCIENCE"
icon_state = "sci"
/obj/structure/sign/department/xenolab
name = "XENOLAB"
icon_state = "xenolab"
/obj/structure/sign/department/anomaly
name = "ANOMALYLAB"
icon_state = "anomaly"
/obj/structure/sign/department/dock
name = "DOKUCHAYEV DOCK"
icon_state = "dock"
/obj/structure/sign/department/rnd
name = "RND"
icon_state = "rnd"
/obj/structure/sign/department/robo
name = "ROBOTICS"
icon_state = "robo"
/obj/structure/sign/department/toxins
name = "TOXINS"
icon_state = "toxins"
/obj/structure/sign/department/toxin_res
name = "TOXINLAB"
icon_state = "toxin_res"
/obj/structure/sign/department/eva
name = "E.V.A."
icon_state = "eva"
/obj/structure/sign/department/ass
name = "TOOL STORAGE"
icon_state = "ass"
/obj/structure/sign/department/bar
name = "BAR"
icon_state = "bar"
/obj/structure/sign/department/biblio
name = "LIBRARY"
icon_state = "biblio"
/obj/structure/sign/department/chapel
name = "CHAPEL"
icon_state = "chapel"
/obj/structure/sign/department/bridge
name = "BRIDGE"
icon_state = "bridge"
/obj/structure/sign/department/telecoms
name = "TELECOMS"
icon_state = "telecoms"
/obj/structure/sign/department/conference_room
name = "CONFERENCE"
icon_state = "conference_room"
/obj/structure/sign/department/ai
name = "AI"
icon_state = "ai"
/obj/structure/sign/department/cargo
name = "CARGO"
icon_state = "cargo"
/obj/structure/sign/department/mail
name = "MAIL"
icon_state = "mail"
/obj/structure/sign/department/miner_dock
name = "MINING DOCK"
icon_state = "miner_dock"
/obj/structure/sign/department/cargo_dock
name = "CARGO DOCK"
icon_state = "cargo_dock"
/obj/structure/sign/department/eng
name = "ENGINEERING"
icon_state = "eng"
/obj/structure/sign/department/engine
name = "ENGINE"
icon_state = "engine"
/obj/structure/sign/department/gravi
name = "GRAVGEN"
icon_state = "gravi"
/obj/structure/sign/department/atmos
name = "ATMOSPHERICS"
icon_state = "atmos"
/obj/structure/sign/department/shield
name = "SHIELDGEN"
icon_state = "shield"
/obj/structure/sign/department/drones
name = "DRONES"
icon_state = "drones"
/obj/structure/sign/department/interrogation
name = "INTERROGATION"
icon_state = "interrogation"
/obj/structure/sign/department/commander
name = "COMMANDER"
icon_state = "commander"
/obj/structure/sign/department/armory
name = "ARMORY"
icon_state = "armory"
/obj/structure/sign/department/prison
name = "PRISON"
icon_state = "prison"
@@ -20,6 +20,7 @@
var/material/material
var/material/padding_material
var/base_icon = "bed"
var/applies_material_colour = 1 //VOREStation Add - For special color beds/chairs
/obj/structure/bed/New(var/newloc, var/new_material, var/new_padding_material)
..(newloc)
@@ -45,8 +46,9 @@
// Base icon.
var/cache_key = "[base_icon]-[material.name]"
if(isnull(stool_cache[cache_key]))
var/image/I = image('icons/obj/furniture.dmi', base_icon)
I.color = material.icon_colour
var/image/I = image(icon, base_icon) //VOREStation Edit
if(applies_material_colour) //VOREStation Add - Goes with added var
I.color = material.icon_colour
stool_cache[cache_key] = I
overlays |= stool_cache[cache_key]
// Padding overlay.
@@ -1,6 +1,7 @@
/obj/structure/bed/chair //YES, chairs are a type of bed, which are a type of stool. This works, believe me. -Pete
name = "chair"
desc = "You sit in this. Either by will or force."
icon = 'icons/obj/furniture_vr.dmi' //VOREStation Edit - Using Eris furniture
icon_state = "chair_preview"
color = "#666666"
base_icon = "chair"
@@ -82,6 +83,15 @@
src.set_dir(turn(src.dir, 90))
return
//VOREStation Add - Shuttle Chair
/obj/structure/bed/chair/shuttle
name = "chair"
desc = "You sit in this. Either by will or force."
icon_state = "shuttle_chair"
color = null
base_icon = "shuttle_chair"
applies_material_colour = 0
//VOREStation Add End
// Leaving this in for the sake of compilation.
/obj/structure/bed/chair/comfy
desc = "It's a chair. It looks comfy."
@@ -4,7 +4,7 @@ var/global/list/stool_cache = list() //haha stool
/obj/item/weapon/stool
name = "stool"
desc = "Apply butt."
icon = 'icons/obj/furniture.dmi'
icon = 'icons/obj/furniture_vr.dmi' //VOREStation Edit - new Icons
icon_state = "stool_preview" //set for the map
force = 10
throwforce = 10
+1 -1
View File
@@ -1,7 +1,7 @@
/obj/structure/window
name = "window"
desc = "A window."
icon = 'icons/obj/structures.dmi'
icon = 'icons/obj/structures_vr.dmi' // VOREStation Edit - New icons
density = 1
w_class = ITEMSIZE_NORMAL
+4 -2
View File
@@ -157,9 +157,11 @@ var/const/FALLOFF_SOUNDS = 0.5
src << S
/client/proc/playtitlemusic()
if(!ticker || !ticker.login_music) return
if(!ticker || !all_lobby_tracks.len || !media) return
if(is_preference_enabled(/datum/client_preference/play_lobby_music))
src << sound(ticker.login_music, repeat = 0, wait = 0, volume = 85, channel = 1) // MAD JAMS
var/datum/track/T = pick(all_lobby_tracks)
media.push_music(T.url, world.time, 0.85)
to_chat(src,"<span class='notice'>Lobby music: <b>[T.title]</b> by <b>[T.artist]</b>.</span>")
/proc/get_rand_frequency()
return rand(32000, 55000) //Frequency stuff only works with 45kbps oggs.
+94 -29
View File
@@ -18,7 +18,7 @@ var/list/flooring_types
// [icon_base]_corners: directional overlays for non-edge corners.
/decl/flooring
var/name
var/name = "floor"
var/desc
var/icon
var/icon_base
@@ -86,7 +86,7 @@ var/list/flooring_types
/decl/flooring/carpet
name = "carpet"
desc = "Imported and comfy."
icon = 'icons/turf/flooring/carpet.dmi'
icon = 'icons/turf/flooring/carpet_vr.dmi'
icon_base = "carpet"
build_type = /obj/item/stack/tile/carpet
damage_temperature = T0C+200
@@ -98,18 +98,49 @@ var/list/flooring_types
'sound/effects/footstep/carpet4.ogg',
'sound/effects/footstep/carpet5.ogg'))
/decl/flooring/carpet/blue
name = "carpet"
// VOREStation Edit - Eris Carpets
/decl/flooring/carpet/bcarpet
name = "black carpet"
icon_base = "bcarpet"
build_type = /obj/item/stack/tile/carpet/blue
flags = TURF_HAS_EDGES | TURF_REMOVE_CROWBAR
build_type = /obj/item/stack/tile/carpet/bcarpet
/decl/flooring/carpet/blucarpet
name = "blue carpet"
icon_base = "blucarpet"
build_type = /obj/item/stack/tile/carpet/blucarpet
/decl/flooring/carpet/turcarpet
name = "tur carpet"
icon_base = "turcarpet"
build_type = /obj/item/stack/tile/carpet/turcarpet
/decl/flooring/carpet/sblucarpet
name = "silver blue carpet"
icon_base = "sblucarpet"
build_type = /obj/item/stack/tile/carpet/sblucarpet
/decl/flooring/carpet/gaycarpet
name = "clown carpet"
icon_base = "gaycarpet"
build_type = /obj/item/stack/tile/carpet/gaycarpet
/decl/flooring/carpet/purcarpet
name = "purple carpet"
icon_base = "purcarpet"
build_type = /obj/item/stack/tile/carpet/purcarpet
/decl/flooring/carpet/oracarpet
name = "orange carpet"
icon_base = "oracarpet"
build_type = /obj/item/stack/tile/carpet/oracarpet
// VOREStation Edit End
/decl/flooring/tiling
name = "floor"
desc = "Scuffed from the passage of countless greyshirts."
icon = 'icons/turf/flooring/tiles.dmi'
icon_base = "steel"
has_damage_range = 4
icon = 'icons/turf/flooring/tiles_vr.dmi' // VOREStation Edit - Eris floors
icon_base = "tiled" // VOREStation Edit - Eris floors
has_damage_range = 2 // VOREStation Edit - Eris floors
damage_temperature = T0C+1400
flags = TURF_REMOVE_CROWBAR | TURF_CAN_BREAK | TURF_CAN_BURN
build_type = /obj/item/stack/tile/floor
@@ -121,6 +152,45 @@ var/list/flooring_types
'sound/effects/footstep/floor4.ogg',
'sound/effects/footstep/floor5.ogg'))
//VOREStation Edit for icons and extra types
/decl/flooring/tiling/tech
desc = "Scuffed from the passage of countless greyshirts."
icon = 'icons/turf/flooring/techfloor_vr.dmi'
icon_base = "techfloor_gray"
build_type = /obj/item/stack/tile/floor/techgrey
can_paint = null
/decl/flooring/tiling/tech/grid
icon_base = "techfloor_grid"
build_type = /obj/item/stack/tile/floor/techgrid
/decl/flooring/tiling/new_tile
name = "floor"
icon_base = "tile_full"
flags = TURF_CAN_BREAK | TURF_CAN_BURN | TURF_IS_FRAGILE
build_type = null
/decl/flooring/tiling/new_tile/cargo_one
icon_base = "cargo_one_full"
/decl/flooring/tiling/new_tile/kafel
icon_base = "kafel_full"
/decl/flooring/tiling/new_tile/techmaint
icon_base = "techmaint"
/decl/flooring/tiling/new_tile/monofloor
icon_base = "monofloor"
/decl/flooring/tiling/new_tile/monotile
icon_base = "monotile"
/decl/flooring/tiling/new_tile/steel_grid
icon_base = "steel_grid"
/decl/flooring/tiling/new_tile/steel_ridged
icon_base = "steel_ridged"
/decl/flooring/linoleum
name = "linoleum"
desc = "It's like the 2390's all over again."
@@ -135,36 +205,37 @@ var/list/flooring_types
icon_base = "white"
has_damage_range = null
flags = TURF_REMOVE_CROWBAR
build_type = /obj/item/stack/tile/floor_red
build_type = /obj/item/stack/tile/floor/red
/decl/flooring/tiling/steel
name = "floor"
icon_base = "steel"
build_type = /obj/item/stack/tile/floor/steel
/decl/flooring/tiling/steel_dirty
name = "floor"
icon_base = "steel_dirty"
has_damage_range = null
flags = TURF_REMOVE_CROWBAR
build_type = /obj/item/stack/tile/floor_steel
build_type = /obj/item/stack/tile/floor/steel_dirty
/decl/flooring/tiling/asteroidfloor
name = "floor"
icon_base = "asteroidfloor"
has_damage_range = null
flags = TURF_REMOVE_CROWBAR
build_type = /obj/item/stack/tile/floor_steel
build_type = /obj/item/stack/tile/floor/steel
/decl/flooring/tiling/white
name = "floor"
desc = "How sterile."
icon_base = "white"
has_damage_range = null
flags = TURF_REMOVE_CROWBAR
build_type = /obj/item/stack/tile/floor_white
build_type = /obj/item/stack/tile/floor/white
/decl/flooring/tiling/yellow
name = "floor"
icon_base = "white"
has_damage_range = null
flags = TURF_REMOVE_CROWBAR
build_type = /obj/item/stack/tile/floor_yellow
build_type = /obj/item/stack/tile/floor/yellow
/decl/flooring/tiling/dark
name = "floor"
@@ -172,34 +243,28 @@ var/list/flooring_types
icon_base = "dark"
has_damage_range = null
flags = TURF_REMOVE_CROWBAR
build_type = /obj/item/stack/tile/floor_dark
build_type = /obj/item/stack/tile/floor/dark
/decl/flooring/tiling/hydro
name = "floor"
icon_base = "hydrofloor"
has_damage_range = null
flags = TURF_REMOVE_CROWBAR
build_type = /obj/item/stack/tile/floor_steel
build_type = /obj/item/stack/tile/floor/steel
/decl/flooring/tiling/neutral
name = "floor"
icon_base = "neutral"
has_damage_range = null
flags = TURF_REMOVE_CROWBAR
build_type = /obj/item/stack/tile/floor_steel
build_type = /obj/item/stack/tile/floor/steel
/decl/flooring/tiling/freezer
name = "floor"
desc = "Don't slip."
icon_base = "freezer"
has_damage_range = null
flags = TURF_REMOVE_CROWBAR
build_type = /obj/item/stack/tile/floor_freezer
build_type = /obj/item/stack/tile/floor/freezer
/decl/flooring/wood
name = "wooden floor"
desc = "Polished redwood planks."
icon = 'icons/turf/flooring/wood.dmi'
icon = 'icons/turf/flooring/wood_vr.dmi'
icon_base = "wood"
has_damage_range = 6
damage_temperature = T0C+200
+761 -15
View File
@@ -5,7 +5,7 @@ var/list/floor_decals = list()
/obj/effect/floor_decal
name = "floor decal"
icon = 'icons/turf/flooring/decals.dmi'
icon = 'icons/turf/flooring/decals_vr.dmi'
layer = TURF_LAYER + 0.01
var/supplied_dir
@@ -14,22 +14,16 @@ var/list/floor_decals = list()
if(newcolour) color = newcolour
..(newloc)
// VOREStation Edit - Hack to workaround byond crash bug
/obj/effect/floor_decal/initialize()
if(supplied_dir) set_dir(supplied_dir)
if(!floor_decals_initialized || !loc || deleted(src))
return
add_to_turf_decals()
var/turf/T = get_turf(src)
if(istype(T, /turf/simulated/floor) || istype(T, /turf/unsimulated/floor) || istype(T, /turf/simulated/shuttle/floor))
var/cache_key = "[alpha]-[color]-[dir]-[icon_state]-[layer]"
if(!floor_decals[cache_key])
var/image/I = image(icon = src.icon, icon_state = src.icon_state, dir = src.dir)
I.layer = T.layer
I.color = src.color
I.alpha = src.alpha
floor_decals[cache_key] = I
if(!T.decals) T.decals = list()
T.decals |= floor_decals[cache_key]
T.overlays |= floor_decals[cache_key]
T.apply_decals()
qdel(src)
return
// VOREStation Edit End
/obj/effect/floor_decal/reset
name = "reset marker"
@@ -55,6 +49,24 @@ var/list/floor_decals = list()
/obj/effect/floor_decal/corner/black/full
icon_state = "corner_white_full"
/obj/effect/floor_decal/corner/black/three_quarters
icon_state = "corner_white_three_quarters"
/obj/effect/floor_decal/corner/black/border
icon_state = "bordercolor"
/obj/effect/floor_decal/corner/black/bordercorner
icon_state = "bordercolorcorner"
/obj/effect/floor_decal/corner/black/bordercorner2
icon_state = "bordercolorcorner2"
/obj/effect/floor_decal/corner/black/borderfull
icon_state = "bordercolorfull"
/obj/effect/floor_decal/corner/black/bordercee
icon_state = "bordercolorcee"
/obj/effect/floor_decal/corner/blue
name = "blue corner"
color = COLOR_BLUE_GRAY
@@ -65,6 +77,24 @@ var/list/floor_decals = list()
/obj/effect/floor_decal/corner/blue/full
icon_state = "corner_white_full"
/obj/effect/floor_decal/corner/blue/three_quarters
icon_state = "corner_white_three_quarters"
/obj/effect/floor_decal/corner/blue/border
icon_state = "bordercolor"
/obj/effect/floor_decal/corner/blue/bordercorner
icon_state = "bordercolorcorner"
/obj/effect/floor_decal/corner/blue/bordercorner2
icon_state = "bordercolorcorner2"
/obj/effect/floor_decal/corner/blue/borderfull
icon_state = "bordercolorfull"
/obj/effect/floor_decal/corner/blue/bordercee
icon_state = "bordercolorcee"
/obj/effect/floor_decal/corner/paleblue
name = "pale blue corner"
color = COLOR_PALE_BLUE_GRAY
@@ -75,6 +105,24 @@ var/list/floor_decals = list()
/obj/effect/floor_decal/corner/paleblue/full
icon_state = "corner_white_full"
/obj/effect/floor_decal/corner/paleblue/three_quarters
icon_state = "corner_white_three_quarters"
/obj/effect/floor_decal/corner/paleblue/border
icon_state = "bordercolor"
/obj/effect/floor_decal/corner/paleblue/bordercorner
icon_state = "bordercolorcorner"
/obj/effect/floor_decal/corner/paleblue/bordercorner2
icon_state = "bordercolorcorner2"
/obj/effect/floor_decal/corner/paleblue/borderfull
icon_state = "bordercolorfull"
/obj/effect/floor_decal/corner/paleblue/bordercee
icon_state = "bordercolorcee"
/obj/effect/floor_decal/corner/green
name = "green corner"
color = COLOR_GREEN_GRAY
@@ -85,6 +133,24 @@ var/list/floor_decals = list()
/obj/effect/floor_decal/corner/green/full
icon_state = "corner_white_full"
/obj/effect/floor_decal/corner/green/three_quarters
icon_state = "corner_white_three_quarters"
/obj/effect/floor_decal/corner/green/border
icon_state = "bordercolor"
/obj/effect/floor_decal/corner/green/bordercorner
icon_state = "bordercolorcorner"
/obj/effect/floor_decal/corner/green/bordercorner2
icon_state = "bordercolorcorner2"
/obj/effect/floor_decal/corner/green/borderfull
icon_state = "bordercolorfull"
/obj/effect/floor_decal/corner/green/bordercee
icon_state = "bordercolorcee"
/obj/effect/floor_decal/corner/lime
name = "lime corner"
color = COLOR_PALE_GREEN_GRAY
@@ -95,6 +161,24 @@ var/list/floor_decals = list()
/obj/effect/floor_decal/corner/lime/full
icon_state = "corner_white_full"
/obj/effect/floor_decal/corner/lime/three_quarters
icon_state = "corner_white_three_quarters"
/obj/effect/floor_decal/corner/lime/border
icon_state = "bordercolor"
/obj/effect/floor_decal/corner/lime/bordercorner
icon_state = "bordercolorcorner"
/obj/effect/floor_decal/corner/lime/bordercorner2
icon_state = "bordercolorcorner2"
/obj/effect/floor_decal/corner/lime/borderfull
icon_state = "bordercolorfull"
/obj/effect/floor_decal/corner/lime/bordercee
icon_state = "bordercolorcee"
/obj/effect/floor_decal/corner/yellow
name = "yellow corner"
color = COLOR_BROWN
@@ -105,6 +189,27 @@ var/list/floor_decals = list()
/obj/effect/floor_decal/corner/yellow/full
icon_state = "corner_white_full"
/obj/effect/floor_decal/corner/yellow/three_quarters
icon_state = "corner_white_three_quarters"
/obj/effect/floor_decal/corner/yellow/full
icon_state = "corner_white_full"
/obj/effect/floor_decal/corner/yellow/border
icon_state = "bordercolor"
/obj/effect/floor_decal/corner/yellow/bordercorner
icon_state = "bordercolorcorner"
/obj/effect/floor_decal/corner/yellow/bordercorner2
icon_state = "bordercolorcorner2"
/obj/effect/floor_decal/corner/yellow/borderfull
icon_state = "bordercolorfull"
/obj/effect/floor_decal/corner/yellow/bordercee
icon_state = "bordercolorcee"
/obj/effect/floor_decal/corner/beige
name = "beige corner"
color = COLOR_BEIGE
@@ -115,6 +220,24 @@ var/list/floor_decals = list()
/obj/effect/floor_decal/corner/beige/full
icon_state = "corner_white_full"
/obj/effect/floor_decal/corner/beige/three_quarters
icon_state = "corner_white_three_quarters"
/obj/effect/floor_decal/corner/beige/border
icon_state = "bordercolor"
/obj/effect/floor_decal/corner/beige/bordercorner
icon_state = "bordercolorcorner"
/obj/effect/floor_decal/corner/beige/bordercorner2
icon_state = "bordercolorcorner2"
/obj/effect/floor_decal/corner/beige/borderfull
icon_state = "bordercolorfull"
/obj/effect/floor_decal/corner/beige/bordercee
icon_state = "bordercolorcee"
/obj/effect/floor_decal/corner/red
name = "red corner"
color = COLOR_RED_GRAY
@@ -125,6 +248,27 @@ var/list/floor_decals = list()
/obj/effect/floor_decal/corner/red/full
icon_state = "corner_white_full"
/obj/effect/floor_decal/corner/red/three_quarters
icon_state = "corner_white_three_quarters"
/obj/effect/floor_decal/corner/red/full
icon_state = "corner_white_full"
/obj/effect/floor_decal/corner/red/border
icon_state = "bordercolor"
/obj/effect/floor_decal/corner/red/bordercorner
icon_state = "bordercolorcorner"
/obj/effect/floor_decal/corner/red/bordercorner2
icon_state = "bordercolorcorner2"
/obj/effect/floor_decal/corner/red/borderfull
icon_state = "bordercolorfull"
/obj/effect/floor_decal/corner/red/bordercee
icon_state = "bordercolorcee"
/obj/effect/floor_decal/corner/pink
name = "pink corner"
color = COLOR_PALE_RED_GRAY
@@ -135,6 +279,24 @@ var/list/floor_decals = list()
/obj/effect/floor_decal/corner/pink/full
icon_state = "corner_white_full"
/obj/effect/floor_decal/corner/pink/three_quarters
icon_state = "corner_white_three_quarters"
/obj/effect/floor_decal/corner/pink/border
icon_state = "bordercolor"
/obj/effect/floor_decal/corner/pink/bordercorner
icon_state = "bordercolorcorner"
/obj/effect/floor_decal/corner/pink/bordercorner2
icon_state = "bordercolorcorner2"
/obj/effect/floor_decal/corner/pink/borderfull
icon_state = "bordercolorfull"
/obj/effect/floor_decal/corner/pink/bordercee
icon_state = "bordercolorcee"
/obj/effect/floor_decal/corner/purple
name = "purple corner"
color = COLOR_PURPLE_GRAY
@@ -145,6 +307,24 @@ var/list/floor_decals = list()
/obj/effect/floor_decal/corner/purple/full
icon_state = "corner_white_full"
/obj/effect/floor_decal/corner/purple/three_quarters
icon_state = "corner_white_three_quarters"
/obj/effect/floor_decal/corner/purple/border
icon_state = "bordercolor"
/obj/effect/floor_decal/corner/purple/bordercorner
icon_state = "bordercolorcorner"
/obj/effect/floor_decal/corner/purple/bordercorner2
icon_state = "bordercolorcorner2"
/obj/effect/floor_decal/corner/purple/borderfull
icon_state = "bordercolorfull"
/obj/effect/floor_decal/corner/purple/bordercee
icon_state = "bordercolorcee"
/obj/effect/floor_decal/corner/mauve
name = "mauve corner"
color = COLOR_PALE_PURPLE_GRAY
@@ -155,6 +335,24 @@ var/list/floor_decals = list()
/obj/effect/floor_decal/corner/mauve/full
icon_state = "corner_white_full"
/obj/effect/floor_decal/corner/mauve/three_quarters
icon_state = "corner_white_three_quarters"
/obj/effect/floor_decal/corner/mauve/border
icon_state = "bordercolor"
/obj/effect/floor_decal/corner/mauve/bordercorner
icon_state = "bordercolorcorner"
/obj/effect/floor_decal/corner/mauve/bordercorner2
icon_state = "bordercolorcorner2"
/obj/effect/floor_decal/corner/mauve/borderfull
icon_state = "bordercolorfull"
/obj/effect/floor_decal/corner/mauve/bordercee
icon_state = "bordercolorcee"
/obj/effect/floor_decal/corner/orange
name = "orange corner"
color = COLOR_DARK_ORANGE
@@ -165,6 +363,24 @@ var/list/floor_decals = list()
/obj/effect/floor_decal/corner/orange/full
icon_state = "corner_white_full"
/obj/effect/floor_decal/corner/orange/three_quarters
icon_state = "corner_white_three_quarters"
/obj/effect/floor_decal/corner/orange/border
icon_state = "bordercolor"
/obj/effect/floor_decal/corner/orange/bordercorner
icon_state = "bordercolorcorner"
/obj/effect/floor_decal/corner/orange/bordercorner2
icon_state = "bordercolorcorner2"
/obj/effect/floor_decal/corner/orange/borderfull
icon_state = "bordercolorfull"
/obj/effect/floor_decal/corner/orange/bordercee
icon_state = "bordercolorcee"
/obj/effect/floor_decal/corner/brown
name = "brown corner"
color = COLOR_DARK_BROWN
@@ -175,6 +391,25 @@ var/list/floor_decals = list()
/obj/effect/floor_decal/corner/brown/full
icon_state = "corner_white_full"
/obj/effect/floor_decal/corner/brown/three_quarters
icon_state = "corner_white_three_quarters"
/obj/effect/floor_decal/corner/brown/border
icon_state = "bordercolor"
/obj/effect/floor_decal/corner/brown/bordercorner
icon_state = "bordercolorcorner"
/obj/effect/floor_decal/corner/brown/bordercorner2
icon_state = "bordercolorcorner2"
/obj/effect/floor_decal/corner/brown/borderfull
icon_state = "bordercolorfull"
/obj/effect/floor_decal/corner/brown/bordercee
icon_state = "bordercolorcee"
/obj/effect/floor_decal/corner/white
name = "white corner"
icon_state = "corner_white"
@@ -185,6 +420,24 @@ var/list/floor_decals = list()
/obj/effect/floor_decal/corner/white/full
icon_state = "corner_white_full"
/obj/effect/floor_decal/corner/white/three_quarters
icon_state = "corner_white_three_quarters"
/obj/effect/floor_decal/corner/white/border
icon_state = "bordercolor"
/obj/effect/floor_decal/corner/white/bordercorner
icon_state = "bordercolorcorner"
/obj/effect/floor_decal/corner/white/bordercorner2
icon_state = "bordercolorcorner2"
/obj/effect/floor_decal/corner/white/borderfull
icon_state = "bordercolorfull"
/obj/effect/floor_decal/corner/white/bordercee
icon_state = "bordercolorcee"
/obj/effect/floor_decal/corner/grey
name = "grey corner"
color = "#8D8C8C"
@@ -195,6 +448,49 @@ var/list/floor_decals = list()
/obj/effect/floor_decal/corner/grey/full
icon_state = "corner_white_full"
/obj/effect/floor_decal/corner/grey/three_quarters
icon_state = "corner_white_three_quarters"
/obj/effect/floor_decal/corner/grey/border
icon_state = "bordercolor"
/obj/effect/floor_decal/corner/grey/bordercorner
icon_state = "bordercolorcorner"
/obj/effect/floor_decal/corner/grey/bordercorner
icon_state = "bordercolorcorner"
/obj/effect/floor_decal/corner/grey/borderfull
icon_state = "bordercolorfull"
/obj/effect/floor_decal/corner/grey/bordercee
icon_state = "bordercolorcee"
/obj/effect/floor_decal/corner/lightgrey
name = "lightgrey corner"
color = "#A8B2B6"
/obj/effect/floor_decal/corner/lightgrey/diagonal
icon_state = "corner_white_diagonal"
/obj/effect/floor_decal/corner/lightgrey/three_quarters
icon_state = "corner_white_three_quarters"
/obj/effect/floor_decal/corner/lightgrey/border
icon_state = "bordercolor"
/obj/effect/floor_decal/corner/lightgrey/bordercorner
icon_state = "bordercolorcorner"
/obj/effect/floor_decal/corner/lightgrey/bordercorner2
icon_state = "bordercolorcorner2"
/obj/effect/floor_decal/corner/lightgrey/borderfull
icon_state = "bordercolorfull"
/obj/effect/floor_decal/corner/lightgrey/bordercee
icon_state = "bordercolorcee"
/obj/effect/floor_decal/spline/plain
name = "spline - plain"
icon_state = "spline_plain"
@@ -213,7 +509,7 @@ var/list/floor_decals = list()
/obj/effect/floor_decal/spline/fancy/wood/cee
icon_state = "spline_fancy_cee"
/obj/effect/floor_decal/spline/fancy/wood/full
/obj/effect/floor_decal/spline/fancy/wood/three_quarters
icon_state = "spline_fancy_full"
/obj/effect/floor_decal/industrial/warning
@@ -229,6 +525,19 @@ var/list/floor_decals = list()
/obj/effect/floor_decal/industrial/warning/cee
icon_state = "warningcee"
/obj/effect/floor_decal/industrial/danger
name = "hazard stripes"
icon_state = "danger"
/obj/effect/floor_decal/industrial/danger/corner
icon_state = "dangercorner"
/obj/effect/floor_decal/industrial/danger/full
icon_state = "dangerfull"
/obj/effect/floor_decal/industrial/danger/cee
icon_state = "dangercee"
/obj/effect/floor_decal/industrial/warning/dust
name = "hazard stripes"
icon_state = "warning_dust"
@@ -403,4 +712,441 @@ var/list/floor_decals = list()
icon_state = "white_d2"
/obj/effect/floor_decal/sign/dock/three
icon_state = "white_d3"
icon_state = "white_d3"
/obj/effect/floor_decal/rust
name = "rust"
icon_state = "rust"
/obj/effect/floor_decal/rust/mono_rusted1
icon_state = "mono_rusted1"
/obj/effect/floor_decal/rust/mono_rusted2
icon_state = "mono_rusted2"
/obj/effect/floor_decal/rust/mono_rusted3
icon_state = "mono_rusted3"
/obj/effect/floor_decal/rust/part_rusted1
icon_state = "part_rusted1"
/obj/effect/floor_decal/rust/part_rusted2
icon_state = "part_rusted2"
/obj/effect/floor_decal/rust/part_rusted3
icon_state = "part_rusted3"
/obj/effect/floor_decal/rust/color_rusted
icon_state = "color_rusted"
/obj/effect/floor_decal/rust/color_rustedcorner
icon_state = "color_rustedcorner"
/obj/effect/floor_decal/rust/color_rustedfull
icon_state = "color_rustedfull"
/obj/effect/floor_decal/rust/color_rustedcee
icon_state = "color_rustedcee"
/obj/effect/floor_decal/rust/steel_decals_rusted1
icon_state = "steel_decals_rusted1"
/obj/effect/floor_decal/rust/steel_decals_rusted2
icon_state = "steel_decals_rusted2"
//Old tile
/obj/effect/floor_decal/corner_oldtile
name = "corner oldtile"
icon_state = "corner_oldtile"
/obj/effect/floor_decal/corner_oldtile/white
name = "corner oldtile"
icon_state = "corner_oldtile"
color = "#d9d9d9"
/obj/effect/floor_decal/corner_oldtile/white/diagonal
name = "corner oldtile diagonal"
icon_state = "corner_oldtile_diagonal"
/obj/effect/floor_decal/corner_oldtile/white/full
name = "corner oldtile full"
icon_state = "corner_oldtile_full"
/obj/effect/floor_decal/corner_oldtile/blue
name = "corner oldtile"
icon_state = "corner_oldtile"
color = "#8ba7ad"
/obj/effect/floor_decal/corner_oldtile/blue/diagonal
name = "corner oldtile diagonal"
icon_state = "corner_oldtile_diagonal"
/obj/effect/floor_decal/corner_oldtile/blue/full
name = "corner oldtile full"
icon_state = "corner_oldtile_full"
/obj/effect/floor_decal/corner_oldtile/yellow
name = "corner oldtile"
icon_state = "corner_oldtile"
color = "#8c6d46"
/obj/effect/floor_decal/corner_oldtile/yellow/diagonal
name = "corner oldtile diagonal"
icon_state = "corner_oldtile_diagonal"
/obj/effect/floor_decal/corner_oldtile/yellow/full
name = "corner oldtile full"
icon_state = "corner_oldtile_full"
/obj/effect/floor_decal/corner_oldtile/gray
name = "corner oldtile"
icon_state = "corner_oldtile"
color = "#687172"
/obj/effect/floor_decal/corner_oldtile/gray/diagonal
name = "corner oldtile diagonal"
icon_state = "corner_oldtile_diagonal"
/obj/effect/floor_decal/corner_oldtile/gray/full
name = "corner oldtile full"
icon_state = "corner_oldtile_full"
/obj/effect/floor_decal/corner_oldtile/beige
name = "corner oldtile"
icon_state = "corner_oldtile"
color = "#385e60"
/obj/effect/floor_decal/corner_oldtile/beige/diagonal
name = "corner oldtile diagonal"
icon_state = "corner_oldtile_diagonal"
/obj/effect/floor_decal/corner_oldtile/beige/full
name = "corner oldtile full"
icon_state = "corner_oldtile_full"
/obj/effect/floor_decal/corner_oldtile/red
name = "corner oldtile"
icon_state = "corner_oldtile"
color = "#964e51"
/obj/effect/floor_decal/corner_oldtile/red/diagonal
name = "corner oldtile diagonal"
icon_state = "corner_oldtile_diagonal"
/obj/effect/floor_decal/corner_oldtile/red/full
name = "corner oldtile full"
icon_state = "corner_oldtile_full"
/obj/effect/floor_decal/corner_oldtile/purple
name = "corner oldtile"
icon_state = "corner_oldtile"
color = "#906987"
/obj/effect/floor_decal/corner_oldtile/purple/diagonal
name = "corner oldtile diagonal"
icon_state = "corner_oldtile_diagonal"
/obj/effect/floor_decal/corner_oldtile/purple/full
name = "corner oldtile full"
icon_state = "corner_oldtile_full"
/obj/effect/floor_decal/corner_oldtile/green
name = "corner oldtile"
icon_state = "corner_oldtile"
color = "#46725c"
/obj/effect/floor_decal/corner_oldtile/green/diagonal
name = "corner oldtile diagonal"
icon_state = "corner_oldtile_diagonal"
/obj/effect/floor_decal/corner_oldtile/green/full
name = "corner oldtile full"
icon_state = "corner_oldtile_full"
//Kafel
/obj/effect/floor_decal/corner_kafel
name = "corner kafel"
icon_state = "corner_kafel"
/obj/effect/floor_decal/corner_kafel/white
name = "corner kafel"
icon_state = "corner_kafel"
color = "#d9d9d9"
/obj/effect/floor_decal/corner_kafel/white/diagonal
name = "corner kafel diagonal"
icon_state = "corner_kafel_diagonal"
/obj/effect/floor_decal/corner_kafel/white/full
name = "corner kafel full"
icon_state = "corner_kafel_full"
/obj/effect/floor_decal/corner_kafel/blue
name = "corner kafel"
icon_state = "corner_kafel"
color = "#8ba7ad"
/obj/effect/floor_decal/corner_kafel/blue/diagonal
name = "corner kafel diagonal"
icon_state = "corner_kafel_diagonal"
/obj/effect/floor_decal/corner_kafel/blue/full
name = "corner kafel full"
icon_state = "corner_kafel_full"
/obj/effect/floor_decal/corner_kafel/yellow
name = "corner kafel"
icon_state = "corner_kafel"
color = "#8c6d46"
/obj/effect/floor_decal/corner_kafel/yellow/diagonal
name = "corner kafel diagonal"
icon_state = "corner_kafel_diagonal"
/obj/effect/floor_decal/corner_kafel/yellow/full
name = "corner kafel full"
icon_state = "corner_kafel_full"
/obj/effect/floor_decal/corner_kafel/gray
name = "corner kafel"
icon_state = "corner_kafel"
color = "#687172"
/obj/effect/floor_decal/corner_kafel/gray/diagonal
name = "corner kafel diagonal"
icon_state = "corner_kafel_diagonal"
/obj/effect/floor_decal/corner_kafel/gray/full
name = "corner kafel full"
icon_state = "corner_kafel_full"
/obj/effect/floor_decal/corner_kafel/beige
name = "corner kafel"
icon_state = "corner_kafel"
color = "#385e60"
/obj/effect/floor_decal/corner_kafel/beige/diagonal
name = "corner kafel diagonal"
icon_state = "corner_kafel_diagonal"
/obj/effect/floor_decal/corner_kafel/beige/full
name = "corner kafel full"
icon_state = "corner_kafel_full"
/obj/effect/floor_decal/corner_kafel/red
name = "corner kafel"
icon_state = "corner_kafel"
color = "#964e51"
/obj/effect/floor_decal/corner_kafel/red/diagonal
name = "corner kafel diagonal"
icon_state = "corner_kafel_diagonal"
/obj/effect/floor_decal/corner_kafel/red/full
name = "corner kafel full"
icon_state = "corner_kafel_full"
/obj/effect/floor_decal/corner_kafel/purple
name = "corner kafel"
icon_state = "corner_kafel"
color = "#906987"
/obj/effect/floor_decal/corner_kafel/purple/diagonal
name = "corner kafel diagonal"
icon_state = "corner_kafel_diagonal"
/obj/effect/floor_decal/corner_kafel/purple/full
name = "corner kafel full"
icon_state = "corner_kafel_full"
/obj/effect/floor_decal/corner_kafel/green
name = "corner kafel"
icon_state = "corner_kafel"
color = "#46725c"
/obj/effect/floor_decal/corner_kafel/green/diagonal
name = "corner kafel diagonal"
icon_state = "corner_kafel_diagonal"
/obj/effect/floor_decal/corner_kafel/green/full
name = "corner kafel full"
icon_state = "corner_kafel_full"
//Techfloor
/obj/effect/floor_decal/corner_techfloor_gray
name = "corner techfloorgray"
icon_state = "corner_techfloor_gray"
/obj/effect/floor_decal/corner_techfloor_gray/diagonal
name = "corner techfloorgray diagonal"
icon_state = "corner_techfloor_gray_diagonal"
/obj/effect/floor_decal/corner_techfloor_gray/full
name = "corner techfloorgray full"
icon_state = "corner_techfloor_gray_full"
/obj/effect/floor_decal/corner_techfloor_grid
name = "corner techfloorgrid"
icon_state = "corner_techfloor_grid"
/obj/effect/floor_decal/corner_techfloor_grid/diagonal
name = "corner techfloorgrid diagonal"
icon_state = "corner_techfloor_grid_diagonal"
/obj/effect/floor_decal/corner_techfloor_grid/full
name = "corner techfloorgrid full"
icon_state = "corner_techfloor_grid_full"
/obj/effect/floor_decal/corner_steel_grid
name = "corner steel_grid"
icon_state = "steel_grid"
/obj/effect/floor_decal/corner_steel_grid/diagonal
name = "corner tsteel_grid diagonal"
icon_state = "steel_grid_diagonal"
/obj/effect/floor_decal/corner_steel_grid/full
name = "corner steel_grid full"
icon_state = "steel_grid_full"
/obj/effect/floor_decal/borderfloor
name = "border floor"
icon_state = "borderfloor"
/obj/effect/floor_decal/borderfloor/corner
icon_state = "borderfloorcorner"
/obj/effect/floor_decal/borderfloor/corner2
icon_state = "borderfloorcorner2"
/obj/effect/floor_decal/borderfloor/full
icon_state = "borderfloorfull"
/obj/effect/floor_decal/borderfloor/cee
icon_state = "borderfloorcee"
/obj/effect/floor_decal/borderfloorblack
name = "border floor"
icon_state = "borderfloor_black"
/obj/effect/floor_decal/borderfloorblack/corner
icon_state = "borderfloorcorner_black"
/obj/effect/floor_decal/borderfloorblack/corner2
icon_state = "borderfloorcorner2_black"
/obj/effect/floor_decal/borderfloorblack/full
icon_state = "borderfloorfull_black"
/obj/effect/floor_decal/borderfloorblack/cee
icon_state = "borderfloorcee_black"
/obj/effect/floor_decal/borderfloorwhite
name = "border floor"
icon_state = "borderfloor_white"
/obj/effect/floor_decal/borderfloorwhite/corner
icon_state = "borderfloorcorner_white"
/obj/effect/floor_decal/borderfloorwhite/corner2
icon_state = "borderfloorcorner2_white"
/obj/effect/floor_decal/borderfloorwhite/full
icon_state = "borderfloorfull_white"
/obj/effect/floor_decal/borderfloorwhite/cee
icon_state = "borderfloorcee_white"
/obj/effect/floor_decal/steeldecal
name = "steel decal"
icon_state = "steel_decals1"
/obj/effect/floor_decal/steeldecal/steel_decals1
icon_state = "steel_decals1"
/obj/effect/floor_decal/steeldecal/steel_decals2
icon_state = "steel_decals2"
/obj/effect/floor_decal/steeldecal/steel_decals3
icon_state = "steel_decals3"
/obj/effect/floor_decal/steeldecal/steel_decals4
icon_state = "steel_decals4"
/obj/effect/floor_decal/steeldecal/steel_decals5
icon_state = "steel_decals5"
/obj/effect/floor_decal/steeldecal/steel_decals6
icon_state = "steel_decals6"
/obj/effect/floor_decal/steeldecal/steel_decals7
icon_state = "steel_decals7"
/obj/effect/floor_decal/steeldecal/steel_decals8
icon_state = "steel_decals8"
/obj/effect/floor_decal/steeldecal/steel_decals9
icon_state = "steel_decals9"
/obj/effect/floor_decal/steeldecal/steel_decals10
icon_state = "steel_decals10"
/obj/effect/floor_decal/steeldecal/steel_decals_central1
icon_state = "steel_decals_central1"
/obj/effect/floor_decal/steeldecal/steel_decals_central2
icon_state = "steel_decals_central2"
/obj/effect/floor_decal/steeldecal/steel_decals_central3
icon_state = "steel_decals_central3"
/obj/effect/floor_decal/steeldecal/steel_decals_central4
icon_state = "steel_decals_central4"
/obj/effect/floor_decal/steeldecal/steel_decals_central5
icon_state = "steel_decals_central5"
/obj/effect/floor_decal/steeldecal/steel_decals_central6
icon_state = "steel_decals_central6"
/obj/effect/floor_decal/steeldecal/steel_decals_central7
icon_state = "steel_decals_central7"
/obj/effect/floor_decal/techfloor
name = "techfloor edges"
icon_state = "techfloor_edges"
/obj/effect/floor_decal/techfloor/corner
name = "techfloor corner"
icon_state = "techfloor_corners"
/obj/effect/floor_decal/techfloor/orange
name = "techfloor edges"
icon_state = "techfloororange_edges"
/obj/effect/floor_decal/techfloor/orange/corner
name = "techfloor corner"
icon_state = "techfloororange_corners"
/obj/effect/floor_decal/techfloor/hole
name = "hole left"
icon_state = "techfloor_hole_left"
/obj/effect/floor_decal/techfloor/hole/right
name = "hole right"
icon_state = "techfloor_hole_right"
//Grass for ship garden
/obj/effect/floor_decal/grass_edge
name = "grass edge"
icon_state = "grass_edge"
/obj/effect/floor_decal/grass_edge/corner
name = "grass edge"
icon_state = "grass_edge_corner"
+159 -10
View File
@@ -1,9 +1,50 @@
/turf/simulated/floor/carpet
name = "carpet"
icon = 'icons/turf/flooring/carpet.dmi'
icon = 'icons/turf/flooring/carpet_vr.dmi'
icon_state = "carpet"
initial_flooring = /decl/flooring/carpet
/turf/simulated/floor/carpet/bcarpet
name = "black carpet"
icon_state = "bcarpet"
initial_flooring = /decl/flooring/carpet/bcarpet
/turf/simulated/floor/carpet/blucarpet
name = "blue carpet"
icon_state = "blucarpet"
initial_flooring = /decl/flooring/carpet/blucarpet
// Legacy support for existing paths for blue carpet
/turf/simulated/floor/carpet/blue
name = "blue carpet"
icon_state = "blucarpet"
initial_flooring = /decl/flooring/carpet/blucarpet
/turf/simulated/floor/carpet/turcarpet
name = "tur carpet"
icon_state = "turcarpet"
initial_flooring = /decl/flooring/carpet/turcarpet
/turf/simulated/floor/carpet/sblucarpet
name = "sblue carpet"
icon_state = "sblucarpet"
initial_flooring = /decl/flooring/carpet/sblucarpet
/turf/simulated/floor/carpet/gaycarpet
name = "clown carpet"
icon_state = "gaycarpet"
initial_flooring = /decl/flooring/carpet/gaycarpet
/turf/simulated/floor/carpet/purcarpet
name = "purple carpet"
icon_state = "purcarpet"
initial_flooring = /decl/flooring/carpet/purcarpet
/turf/simulated/floor/carpet/oracarpet
name = "orange carpet"
icon_state = "oracarpet"
initial_flooring = /decl/flooring/carpet/oracarpet
/turf/simulated/floor/bluegrid
name = "mainframe floor"
icon = 'icons/turf/flooring/circuit.dmi'
@@ -18,7 +59,7 @@
/turf/simulated/floor/wood
name = "wooden floor"
icon = 'icons/turf/flooring/wood.dmi'
icon = 'icons/turf/flooring/wood_vr.dmi'
icon_state = "wood"
initial_flooring = /decl/flooring/wood
@@ -28,17 +69,120 @@
icon_state = "grass0"
initial_flooring = /decl/flooring/grass
/turf/simulated/floor/carpet/blue
name = "blue carpet"
icon_state = "bcarpet"
initial_flooring = /decl/flooring/carpet/blue
/turf/simulated/floor/tiled
name = "floor"
icon = 'icons/turf/flooring/tiles.dmi'
icon_state = "steel"
icon = 'icons/turf/flooring/tiles_vr.dmi'
icon_state = "tiled"
initial_flooring = /decl/flooring/tiling
/turf/simulated/floor/tiled/techmaint
name = "floor"
icon = 'icons/turf/flooring/tiles_vr.dmi'
icon_state = "techmaint"
initial_flooring = /decl/flooring/tiling/new_tile/techmaint
/turf/simulated/floor/tiled/monofloor
name = "floor"
icon = 'icons/turf/flooring/tiles_vr.dmi'
icon_state = "monofloor"
initial_flooring = /decl/flooring/tiling/new_tile/monofloor
/turf/simulated/floor/tiled/techfloor
name = "floor"
icon = 'icons/turf/flooring/techfloor_vr.dmi'
icon_state = "techfloor_gray"
initial_flooring = /decl/flooring/tiling/tech
/turf/simulated/floor/tiled/monotile
name = "floor"
icon = 'icons/turf/flooring/tiles_vr.dmi'
icon_state = "monotile"
initial_flooring = /decl/flooring/tiling/new_tile/monotile
/turf/simulated/floor/tiled/steel_grid
name = "floor"
icon = 'icons/turf/flooring/tiles_vr.dmi'
icon_state = "steel_grid"
initial_flooring = /decl/flooring/tiling/new_tile/steel_grid
/turf/simulated/floor/tiled/steel_ridged
name = "floor"
icon = 'icons/turf/flooring/tiles_vr.dmi'
icon_state = "steel_ridged"
initial_flooring = /decl/flooring/tiling/new_tile/steel_ridged
/turf/simulated/floor/tiled/old_tile
name = "floor"
icon_state = "tile_full"
initial_flooring = /decl/flooring/tiling/new_tile
/turf/simulated/floor/tiled/old_tile/white
color = "#d9d9d9"
/turf/simulated/floor/tiled/old_tile/blue
color = "#8ba7ad"
/turf/simulated/floor/tiled/old_tile/yellow
color = "#8c6d46"
/turf/simulated/floor/tiled/old_tile/gray
color = "#687172"
/turf/simulated/floor/tiled/old_tile/beige
color = "#385e60"
/turf/simulated/floor/tiled/old_tile/red
color = "#964e51"
/turf/simulated/floor/tiled/old_tile/purple
color = "#906987"
/turf/simulated/floor/tiled/old_tile/green
color = "#46725c"
/turf/simulated/floor/tiled/old_cargo
name = "floor"
icon_state = "cargo_one_full"
initial_flooring = /decl/flooring/tiling/new_tile/cargo_one
/turf/simulated/floor/tiled/old_cargo/white
color = "#d9d9d9"
/turf/simulated/floor/tiled/old_cargo/blue
color = "#8ba7ad"
/turf/simulated/floor/tiled/old_cargo/yellow
color = "#8c6d46"
/turf/simulated/floor/tiled/old_cargo/gray
color = "#687172"
/turf/simulated/floor/tiled/old_cargo/beige
color = "#385e60"
/turf/simulated/floor/tiled/old_cargo/red
color = "#964e51"
/turf/simulated/floor/tiled/old_cargo/purple
color = "#906987"
/turf/simulated/floor/tiled/old_cargo/green
color = "#46725c"
/turf/simulated/floor/tiled/kafel_full
name = "floor"
icon_state = "kafel_full"
initial_flooring = /decl/flooring/tiling/new_tile/kafel
/turf/simulated/floor/tiled/kafel_full/white
color = "#d9d9d9"
/turf/simulated/floor/tiled/kafel_full/blue
color = "#8ba7ad"
/turf/simulated/floor/tiled/kafel_full/yellow
color = "#8c6d46"
/turf/simulated/floor/tiled/kafel_full/gray
color = "#687172"
/turf/simulated/floor/tiled/kafel_full/beige
color = "#385e60"
/turf/simulated/floor/tiled/kafel_full/red
color = "#964e51"
/turf/simulated/floor/tiled/kafel_full/purple
color = "#906987"
/turf/simulated/floor/tiled/kafel_full/green
color = "#46725c"
/turf/simulated/floor/tiled/techfloor/grid
name = "floor"
icon_state = "techfloor_grid"
initial_flooring = /decl/flooring/tiling/tech/grid
/turf/simulated/floor/reinforced
name = "reinforced floor"
icon = 'icons/turf/flooring/tiles.dmi'
@@ -113,9 +257,14 @@
/turf/simulated/floor/tiled/steel
name = "steel floor"
icon_state = "steel_dirty"
icon_state = "steel"
initial_flooring = /decl/flooring/tiling/steel
/turf/simulated/floor/tiled/steel_dirty
name = "steel floor"
icon_state = "steel_dirty"
initial_flooring = /decl/flooring/tiling/steel_dirty
/turf/simulated/floor/tiled/steel/airless
oxygen = 0
nitrogen = 0
@@ -0,0 +1,90 @@
//
// Initialize floor decals! Woo! This is crazy.
//
var/global/floor_decals_initialized = FALSE
// The Turf Decal Holder
// Since it is unsafe to add overlays to turfs, we hold them here for now.
// Since I want this object to basically not exist, I am modeling it in part after lighting_overlay
/atom/movable/turf_overlay_holder
name = "turf overlay holder"
density = 0
simulated = 0
anchored = 1
layer = TURF_LAYER
icon = null
icon_state = null
mouse_opacity = 0
auto_init = 0
/atom/movable/turf_overlay_holder/New(var/atom/newloc)
..()
verbs.Cut()
var/turf/T = loc
T.overlay_holder = src
/atom/movable/turf_overlay_holder/Destroy()
if(loc)
var/turf/T = loc
if(T.overlay_holder == src)
T.overlay_holder = null
. = ..()
// Variety of overrides so the overlays don't get affected by weird things.
/atom/movable/turf_overlay_holder/ex_act()
return
/atom/movable/turf_overlay_holder/singularity_act()
return
/atom/movable/turf_overlay_holder/singularity_pull()
return
/atom/movable/turf_overlay_holder/forceMove()
return 0 //should never move
/atom/movable/turf_overlay_holder/Move()
return 0
/atom/movable/turf_overlay_holder/throw_at()
return 0
/obj/effect/floor_decal/proc/add_to_turf_decals()
if(src.supplied_dir) src.set_dir(src.supplied_dir)
var/turf/T = get_turf(src)
if(istype(T, /turf/simulated/floor) || istype(T, /turf/unsimulated/floor) || istype(T, /turf/simulated/shuttle/floor))
var/cache_key = "[src.alpha]-[src.color]-[src.dir]-[src.icon_state]-[T.layer]"
var/image/I = floor_decals[cache_key]
if(!I)
I = image(icon = src.icon, icon_state = src.icon_state, dir = src.dir)
I.layer = T.layer
I.color = src.color
I.alpha = src.alpha
floor_decals[cache_key] = I
if(!T.decals) T.decals = list()
//world.log << "About to add img:\ref[I] onto decals at turf:\ref[T] ([T.x],[T.y],[T.z]) which has appearance:\ref[T.appearance] and decals.len=[T.decals.len]"
T.decals += I
return T
// qdel(D)
src.loc = null
src.tag = null
// Changes to turf to let us do this
/turf
var/atom/movable/turf_overlay_holder/overlay_holder = null
// After a turf change, destroy the old overlay holder since we will have lost access to it.
/turf/post_change()
var/atom/movable/turf_overlay_holder/TOH = locate(/atom/movable/turf_overlay_holder, src)
if(TOH)
qdel(TOH)
..()
/turf/proc/apply_decals()
if(decals)
if(!overlay_holder)
overlay_holder = new(src)
overlay_holder.overlays = src.decals
else if(overlay_holder)
overlay_holder.overlays.Cut()
+13 -3
View File
@@ -1,7 +1,7 @@
/turf/simulated/floor
name = "plating"
desc = "Unfinished flooring."
icon = 'icons/turf/flooring/plating.dmi'
icon = 'icons/turf/flooring/plating_vr.dmi'
icon_state = "plating"
// Damage to flooring.
@@ -11,7 +11,7 @@
// Plating data.
var/base_name = "plating"
var/base_desc = "The naked hull."
var/base_icon = 'icons/turf/flooring/plating.dmi'
var/base_icon = 'icons/turf/flooring/plating_vr.dmi'
var/base_icon_state = "plating"
var/static/list/base_footstep_sounds = list("human" = list(
'sound/effects/footstep/plating1.ogg',
@@ -20,6 +20,8 @@
'sound/effects/footstep/plating4.ogg',
'sound/effects/footstep/plating5.ogg'))
var/list/old_decals = null // VOREStation Edit - Remember what decals we had between being pried up and replaced.
// Flooring data.
var/flooring_override
var/initial_flooring
@@ -46,6 +48,11 @@
make_plating(defer_icon_update = 1)
flooring = newflooring
footstep_sounds = newflooring.footstep_sounds
// VOREStation Edit - Remember decals from before we were pried up
if(islist(old_decals))
decals = old_decals
old_decals = null
// VOREStation Edit End
update_icon(1)
levelupdate()
@@ -55,7 +62,10 @@
overlays.Cut()
if(islist(decals))
decals.Cut()
// VOREStation Edit - Don't forget decals when pried up
if(flooring)
old_decals = decals
// VOREStation Edit End
decals = null
name = base_name
+5 -2
View File
@@ -60,8 +60,11 @@ var/list/flooring_cache = list()
if(!(istype(T) && T.flooring && T.flooring.name == flooring.name))
overlays |= get_flooring_overlay("[flooring.icon_base]-corner-[SOUTHWEST]", "[flooring.icon_base]_corners", SOUTHWEST)
if(decals && decals.len)
overlays |= decals
// VOREStation Edit - Hack workaround to byond crash bug
//if(decals && decals.len)
//overlays |= decals
apply_decals()
// VOREStation Edit End
if(is_plating() && !(isnull(broken) && isnull(burnt))) //temp, todo
icon = 'icons/turf/flooring/plating.dmi'
+7 -7
View File
@@ -316,37 +316,37 @@
for(var/obj/machinery/power/apc/APC in world)
var/area/A = get_area(APC)
if(!(A.type in areas_with_APC))
if(A && !(A.type in areas_with_APC))
areas_with_APC.Add(A.type)
for(var/obj/machinery/alarm/alarm in world)
var/area/A = get_area(alarm)
if(!(A.type in areas_with_air_alarm))
if(A && !(A.type in areas_with_air_alarm))
areas_with_air_alarm.Add(A.type)
for(var/obj/machinery/requests_console/RC in world)
var/area/A = get_area(RC)
if(!(A.type in areas_with_RC))
if(A && !(A.type in areas_with_RC))
areas_with_RC.Add(A.type)
for(var/obj/machinery/light/L in world)
var/area/A = get_area(L)
if(!(A.type in areas_with_light))
if(A && !(A.type in areas_with_light))
areas_with_light.Add(A.type)
for(var/obj/machinery/light_switch/LS in world)
var/area/A = get_area(LS)
if(!(A.type in areas_with_LS))
if(A && !(A.type in areas_with_LS))
areas_with_LS.Add(A.type)
for(var/obj/item/device/radio/intercom/I in world)
var/area/A = get_area(I)
if(!(A.type in areas_with_intercom))
if(A && !(A.type in areas_with_intercom))
areas_with_intercom.Add(A.type)
for(var/obj/machinery/camera/C in world)
var/area/A = get_area(C)
if(!(A.type in areas_with_camera))
if(A && !(A.type in areas_with_camera))
areas_with_camera.Add(A.type)
var/list/areas_without_APC = areas_all - areas_with_APC
@@ -60,10 +60,13 @@ var/list/_client_preferences_by_type
key = "SOUND_LOBBY"
/datum/client_preference/play_lobby_music/toggled(var/mob/preference_mob, var/enabled)
if(!preference_mob.client || !preference_mob.client.media)
return
if(enabled)
preference_mob << sound(ticker.login_music, repeat = 0, wait = 0, volume = 85, channel = 1)
preference_mob.client.playtitlemusic()
else
preference_mob << sound(null, repeat = 0, wait = 0, volume = 85, channel = 1)
preference_mob.client.media.stop_music()
/datum/client_preference/play_ambiance
description ="Play ambience"
+25
View File
@@ -22,3 +22,28 @@
to_chat(user,"<span class='notice'>You shake [M] out of \the [src]!</span>")
..()
//Mask
/obj/item/clothing/mask
name = "mask"
icon = 'icons/obj/clothing/masks_vr.dmi'
item_icons = list(
slot_l_hand_str = 'icons/mob/items/lefthand_masks.dmi',
slot_r_hand_str = 'icons/mob/items/righthand_masks.dmi',
)
body_parts_covered = HEAD
slot_flags = SLOT_MASK
body_parts_covered = FACE|EYES
sprite_sheets = list(
"Teshari" = 'icons/mob/species/seromi/masks_vr.dmi',
"Vox" = 'icons/mob/species/vox/masks.dmi',
"Tajara" = 'icons/mob/species/tajaran/mask_vr.dmi',
"Unathi" = 'icons/mob/species/unathi/mask_vr.dmi',
"Sergal" = 'icons/mob/species/sergal/mask_vr.dmi',
"Nevrean" = 'icons/mob/species/nevrean/mask_vr.dmi',
"Fox" = 'icons/mob/species/fox/mask_vr.dmi',
"Fennec" = 'icons/mob/species/fennec/mask_vr.dmi',
"Akula" = 'icons/mob/species/akula/mask_vr.dmi',
"Vulpkanin" = 'icons/mob/species/vulpkanin/mask.dmi',
"Xenochimera" = 'icons/mob/species/tajaran/mask_vr.dmi'
)
+15
View File
@@ -1,6 +1,7 @@
/obj/item/clothing/mask/gas
name = "gas mask"
desc = "A face-covering mask that can be connected to an air supply. Filters harmful gases from the air."
//icon = 'icons/obj/clothing/masks_vr.dmi'
icon_state = "gas_alt"
item_flags = BLOCK_GAS_SMOKE_EFFECT | AIRTIGHT
flags_inv = HIDEEARS|HIDEEYES|HIDEFACE
@@ -27,6 +28,20 @@
return filtered
// VOREStation Edit - Our clear gas masks don't hide faces. But changing the var on mask/gas would require un-chaging it on all children. This is nicer.
/obj/item/clothing/mask/gas/New()
if(type == /obj/item/clothing/mask/gas)
flags_inv &= ~HIDEFACE
..()
// VOREStation Edit End
// VOREStation Edit - Since we changed the gas mask sprite, if we want the old one for some reason use this.
/obj/item/clothing/mask/gas/wwii
icon = 'icons/obj/clothing/masks.dmi'
icon_override = 'icons/mob/mask.dmi'
flags_inv = HIDEEARS|HIDEEYES|HIDEFACE
// VOREStation Edit End
/obj/item/clothing/mask/gas/half
name = "face mask"
desc = "A compact, durable gas mask that can be connected to an air supply."
@@ -0,0 +1,55 @@
//NanoTrasen Security Uniforms
/obj/item/clothing/under/nanotrasen
name = "NanoTrasen uniform"
desc = "A comfortable turtleneck and black trousers sporting nanotrasen symbols."
icon_state = "navyutility"
worn_state = "navyutility"
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
siemens_coefficient = 0.9
/obj/item/clothing/under/nanotrasen/security
name = "NanoTrasen security uniform"
desc = "The security uniform of NanoTrasen's security. It looks sturdy and well padded"
icon_state = "navyutility_sec"
worn_state = "navyutility_sec"
armor = list(melee = 10, bullet = 10, laser = 10,energy = 10, bomb = 10, bio = 10, rad = 10)
/obj/item/clothing/under/nanotrasen/security/warden
name = "NanoTrasen warden uniform"
desc = "The uniform of the NanoTrasen's prison wardens. It looks sturdy and well padded. This one has gold cuffs."
icon_state = "navyutility_com"
worn_state = "navyutility_com"
/obj/item/clothing/under/nanotrasen/security/commander
name = "NanoTrasen security command uniform"
desc = "The uniform of the NanoTrasen's security commanding officers. It looks sturdy and well padded. This one has gold trim and red blazes."
icon_state = "blackutility_seccom"
worn_state = "blackutility_seccom"
//Head Gear
/obj/item/clothing/head/soft/nanotrasen
name = "NanoTrasen security cap"
desc = "It's a NT blue ballcap with a NanoTrasen crest. It looks surprisingly sturdy."
icon_state = "fleetsoft"
item_state_slots = list(
slot_l_hand_str = "darkbluesoft",
slot_r_hand_str = "darkbluesoft",
)
armor = list(melee = 10, bullet = 5, laser = 5,energy = 5, bomb = 5, bio = 5, rad = 0)
/obj/item/clothing/head/beret/nanotrasen
name = "NanoTrasen security beret"
desc = "A NT blue beret belonging to the NanoTrasen security forces. For personnel that are more inclined towards style than safety."
icon_state = "beret_navy"
//Armor
/obj/item/clothing/suit/storage/vest/nanotrasen
name = "security armor vest"
desc = "A Sturdy kevlar plate carrier with webbing attached."
icon_state = "webvest"
item_state_slots = list(slot_r_hand_str = "swat", slot_l_hand_str = "swat")
armor = list(melee = 50, bullet = 40, laser = 40, energy = 25, bomb = 25, bio = 0, rad = 0)
slowdown = 0.5
+6 -4
View File
@@ -128,8 +128,8 @@
if(href_list["program"])
var/prog = href_list["program"]
if(prog in (supported_programs + restricted_programs))
loadProgram(prog)
current_program = prog
if(loadProgram(prog))
current_program = prog
else if(href_list["AIoverride"])
if(!issilicon(usr))
@@ -294,11 +294,11 @@
if(check_delay)
if(world.time < (last_change + 25))
if(world.time < (last_change + 15))//To prevent super-spam clicking, reduced process size and annoyance -Sieve
return
return 0
for(var/mob/M in range(3,src))
M.show_message("\b ERROR. Recalibrating projection apparatus.")
last_change = world.time
return
return 0
last_change = world.time
active = 1
@@ -349,6 +349,8 @@
update_projections()
return 1
/obj/machinery/computer/HolodeckControl/proc/toggleGravity(var/area/A)
if(world.time < (last_gravity_change + 25))
+8
View File
@@ -231,7 +231,15 @@
if(istype(W, /obj/item/weapon/wrench))
user << ("<span class='notice'>It's a holochair, you can't dismantle it!</span>")
return
//VOREStation Add
/obj/structure/bed/holobed/Destroy()
..()
/obj/structure/bed/holobed/attackby(obj/item/weapon/W as obj, mob/user as mob)
if(istype(W, /obj/item/weapon/wrench))
user << ("<span class='notice'>It's a holochair, you can't dismantle it!</span>")
return
//VOREStation Add End
/obj/item/weapon/holo
damtype = HALLOSS
no_attack_log = 1
+187
View File
@@ -0,0 +1,187 @@
//
// Holomap generation.
// Based on /vg/station but trimmed down (without antag stuff) and massively optimized (you should have seen it before!) ~Leshana
//
// Define what criteria makes a turf a path or not
// Turfs that will be colored as HOLOMAP_ROCK
#define IS_ROCK(tile) (istype(tile, /turf/simulated/mineral) && tile.density)
// Turfs that will be colored as HOLOMAP_OBSTACLE
#define IS_OBSTACLE(tile) ((!istype(tile, /turf/space) && istype(tile.loc, /area/mine/unexplored)) \
|| istype(tile, /turf/simulated/wall) \
|| istype(tile, /turf/unsimulated/mineral) \
|| (istype(tile, /turf/unsimulated/wall) && !istype(tile, /turf/unsimulated/wall/planetary)) \
/*|| istype(tile, /turf/simulated/shuttle/wall)*/ \
|| (locate(/obj/structure/grille) in tile) \
/*|| (locate(/obj/structure/window/full) in tile)*/)
// Turfs that will be colored as HOLOMAP_PATH
#define IS_PATH(tile) ((istype(tile, /turf/simulated/floor) && !istype(tile, /turf/simulated/floor/outdoors)) \
|| istype(tile, /turf/unsimulated/floor) \
/*|| istype(tile, /turf/simulated/shuttle/floor)*/ \
|| (locate(/obj/structure/catwalk) in tile))
// WARNING - TOTAL HACK - HOOKING INIT
/datum/controller/game_controller/setup_objects()
..()
generateHoloMinimaps()
/// Generates all the holo minimaps, initializing it all nicely, probably.
// TODO - This should be a subsystem ~Leshana
var/global/holomaps_initialized = FALSE
var/global/list/holoMiniMaps = list()
var/global/list/extraMiniMaps = list()
/proc/generateHoloMinimaps()
var/start_time = world.timeofday
// Build the base map for each z level
for (var/z = 1 to world.maxz)
global.holoMiniMaps |= z // hack, todo fix
global.holoMiniMaps[z] = generateHoloMinimap(z)
// Generate the area overlays, small maps, etc for the station levels.
for (var/z in using_map.station_levels)
generateStationMinimap(z)
if(using_map.holomap_smoosh)
for(var/smoosh_list in using_map.holomap_smoosh)
smooshTetherHolomaps(smoosh_list)
global.holomaps_initialized = TRUE
admin_notice("<span class='notice'>Holomaps initialized in [round(0.1*(world.timeofday-start_time),0.1)] seconds.</span>", R_DEBUG)
// TODO - Check - They had a delayed init perhaps?
for (var/obj/machinery/station_map/S in station_holomaps)
S.initialize()
// Generates the "base" holomap for one z-level, showing only the physical structure of walls and paths.
/proc/generateHoloMinimap(var/zLevel = 1)
// Save these values now to avoid a bazillion array lookups
var/offset_x = HOLOMAP_PIXEL_OFFSET_X(zLevel)
var/offset_y = HOLOMAP_PIXEL_OFFSET_Y(zLevel)
// Sanity checks - Better to generate a helpful error message now than have DrawBox() runtime
var/icon/canvas = icon(HOLOMAP_ICON, "blank")
if(world.maxx + offset_x > canvas.Width())
crash_with("Minimap for z=[zLevel] : world.maxx ([world.maxx]) + holomap_offset_x ([offset_x]) must be <= [canvas.Width()]")
if(world.maxy + offset_y > canvas.Height())
crash_with("Minimap for z=[zLevel] : world.maxy ([world.maxy]) + holomap_offset_y ([offset_y]) must be <= [canvas.Height()]")
for(var/x = 1 to world.maxx)
for(var/y = 1 to world.maxy)
var/turf/tile = locate(x, y, zLevel)
if(tile && tile.loc:holomapAlwaysDraw())
if(IS_ROCK(tile))
canvas.DrawBox(HOLOMAP_ROCK, x + offset_x, y + offset_y)
if(IS_OBSTACLE(tile))
canvas.DrawBox(HOLOMAP_OBSTACLE, x + offset_x, y + offset_y)
else if(IS_PATH(tile))
canvas.DrawBox(HOLOMAP_PATH, x + offset_x, y + offset_y)
// Check sleeping after each row to avoid *completely* destroying the server
if(world.tick_usage >= 80) sleep(world.tick_lag * 0.2)
return canvas
// Okay, what does this one do?
// This seems to do the drawing thing, but draws only the areas, having nothing to do with the tiles.
// Leshana: I'm guessing this map will get overlayed on top of the base map at runtime? We'll see.
// Wait, seems we actually blend the area map on top of it right now! Huh.
/proc/generateStationMinimap(var/zLevel)
// Save these values now to avoid a bazillion array lookups
var/offset_x = HOLOMAP_PIXEL_OFFSET_X(zLevel)
var/offset_y = HOLOMAP_PIXEL_OFFSET_Y(zLevel)
// Sanity checks - Better to generate a helpful error message now than have DrawBox() runtime
var/icon/canvas = icon(HOLOMAP_ICON, "blank")
if(world.maxx + offset_x > canvas.Width())
crash_with("Minimap for z=[zLevel] : world.maxx ([world.maxx]) + holomap_offset_x ([offset_x]) must be <= [canvas.Width()]")
if(world.maxy + offset_y > canvas.Height())
crash_with("Minimap for z=[zLevel] : world.maxy ([world.maxy]) + holomap_offset_y ([offset_y]) must be <= [canvas.Height()]")
for(var/x = 1 to world.maxx)
for(var/y = 1 to world.maxy)
var/turf/tile = locate(x, y, zLevel)
if(tile && tile.loc)
var/area/areaToPaint = tile.loc
if(areaToPaint.holomap_color)
canvas.DrawBox(areaToPaint.holomap_color, x + offset_x, y + offset_y)
// Save this nice area-colored canvas in case we want to layer it or something I guess
extraMiniMaps["[HOLOMAP_EXTRA_STATIONMAPAREAS]_[zLevel]"] = canvas
var/icon/map_base = icon(holoMiniMaps[zLevel])
map_base.Blend(HOLOMAP_HOLOFIER, ICON_MULTIPLY)
// Generate the full sized map by blending the base and areas onto the backdrop
var/icon/big_map = icon(HOLOMAP_ICON, "stationmap")
big_map.Blend(map_base, ICON_OVERLAY)
big_map.Blend(canvas, ICON_OVERLAY)
extraMiniMaps["[HOLOMAP_EXTRA_STATIONMAP]_[zLevel]"] = big_map
// Generate the "small" map (I presume for putting on wall map things?)
var/icon/small_map = icon(HOLOMAP_ICON, "blank")
small_map.Blend(map_base, ICON_OVERLAY)
small_map.Blend(canvas, ICON_OVERLAY)
small_map.Scale(WORLD_ICON_SIZE, WORLD_ICON_SIZE)
// And rotate it in every direction of course!
var/icon/actual_small_map = icon(small_map)
actual_small_map.Insert(new_icon = small_map, dir = SOUTH)
actual_small_map.Insert(new_icon = turn(small_map, 90), dir = WEST)
actual_small_map.Insert(new_icon = turn(small_map, 180), dir = NORTH)
actual_small_map.Insert(new_icon = turn(small_map, 270), dir = EAST)
extraMiniMaps["[HOLOMAP_EXTRA_STATIONMAPSMALL]_[zLevel]"] = actual_small_map
// For tiny multi-z maps like the tether, we want to smoosh em together into a nice big one!
/proc/smooshTetherHolomaps(var/list/zlevels)
var/icon/big_map = icon(HOLOMAP_ICON, "stationmap")
var/icon/small_map = icon(HOLOMAP_ICON, "blank")
// For each zlevel in turn, overlay them on top of each other
for(var/zLevel in zlevels)
var/icon/z_terrain = icon(holoMiniMaps[zLevel])
z_terrain.Blend(HOLOMAP_HOLOFIER, ICON_MULTIPLY)
big_map.Blend(z_terrain, ICON_OVERLAY)
small_map.Blend(z_terrain, ICON_OVERLAY)
var/icon/z_areas = extraMiniMaps["[HOLOMAP_EXTRA_STATIONMAPAREAS]_[zLevel]"]
big_map.Blend(z_areas, ICON_OVERLAY)
small_map.Blend(z_areas, ICON_OVERLAY)
// Then scale and rotate to make the actual small map we will use
small_map.Scale(WORLD_ICON_SIZE, WORLD_ICON_SIZE)
var/icon/actual_small_map = icon(small_map)
actual_small_map.Insert(new_icon = small_map, dir = SOUTH)
actual_small_map.Insert(new_icon = turn(small_map, 90), dir = WEST)
actual_small_map.Insert(new_icon = turn(small_map, 180), dir = NORTH)
actual_small_map.Insert(new_icon = turn(small_map, 270), dir = EAST)
// Then assign this icon as the icon for all those levels!
for(var/zLevel in zlevels)
extraMiniMaps["[HOLOMAP_EXTRA_STATIONMAP]_[zLevel]"] = big_map
extraMiniMaps["[HOLOMAP_EXTRA_STATIONMAPSMALL]_[zLevel]"] = actual_small_map
// TODO - Holomap Markers!
// /proc/generateMinimapMarkers(var/zLevel)
// // Save these values now to avoid a bazillion array lookups
// var/offset_x = HOLOMAP_PIXEL_OFFSET_X(zLevel)
// var/offset_y = HOLOMAP_PIXEL_OFFSET_Y(zLevel)
// // TODO - Holomap markers
// for(var/filter in list(HOLOMAP_FILTER_STATIONMAP))
// var/icon/canvas = icon(HOLOMAP_ICON, "blank")
// for(/datum/holomap_marker/holomarker in holomap_markers)
// if(holomarker.z == zLevel && holomarker.filter & filter)
// canvas.Blend(icon(holomarker.icon, holomarker.icon_state), ICON_OVERLAY, holomarker.x + offset_x, holomarker.y + offset_y)
// extraMiniMaps["[HOLOMAP_EXTRA_MARKERS]_[filter]_[zLevel]"] = canvas
// /datum/holomap_marker
// var/x
// var/y
// var/z
// var/filter
// var/icon = 'icons/holomap_markers.dmi'
// var/icon_state
#undef IS_ROCK
#undef IS_OBSTACLE
#undef IS_PATH
+78
View File
@@ -0,0 +1,78 @@
/*
** Holomap vars and procs on /area
*/
/area
var/holomap_color = null // Color of this area on station holomap
/area/rnd
holomap_color = HOLOMAP_AREACOLOR_SCIENCE
/area/outpost/research
holomap_color = HOLOMAP_AREACOLOR_SCIENCE
/area/server
holomap_color = HOLOMAP_AREACOLOR_SCIENCE
/area/assembly
holomap_color = HOLOMAP_AREACOLOR_SCIENCE
/area/bridge
holomap_color = HOLOMAP_AREACOLOR_COMMAND
/area/teleporter
holomap_color = HOLOMAP_AREACOLOR_COMMAND
/area/teleporter/departing
holomap_color = null
/area/security
holomap_color = HOLOMAP_AREACOLOR_SECURITY
/area/tether/surfacebase/security
holomap_color = HOLOMAP_AREACOLOR_SECURITY
/area/medical
holomap_color = HOLOMAP_AREACOLOR_MEDICAL
/area/tether/surfacebase/medical
holomap_color = HOLOMAP_AREACOLOR_MEDICAL
/area/engineering
holomap_color = HOLOMAP_AREACOLOR_ENGINEERING
/area/maintenance/substation/engineering
holomap_color = HOLOMAP_AREACOLOR_ENGINEERING
/area/storage/tech
holomap_color = HOLOMAP_AREACOLOR_ENGINEERING
/area/quartermaster
holomap_color = HOLOMAP_AREACOLOR_CARGO
/area/tether/surfacebase/mining_main
holomap_color = HOLOMAP_AREACOLOR_CARGO
/area/hallway
holomap_color = HOLOMAP_AREACOLOR_HALLWAYS
/area/bridge/hallway
holomap_color = HOLOMAP_AREACOLOR_HALLWAYS
/area/crew_quarters/sleep
holomap_color = HOLOMAP_AREACOLOR_DORMS
/area/crew_quarters/sleep/cryo
holomap_color = null
// Heads
/area/crew_quarters/captain
holomap_color = HOLOMAP_AREACOLOR_COMMAND
/area/crew_quarters/heads/hop
holomap_color = HOLOMAP_AREACOLOR_COMMAND
/area/crew_quarters/heads/hor
holomap_color = HOLOMAP_AREACOLOR_SCIENCE
/area/crew_quarters/heads/chief
holomap_color = HOLOMAP_AREACOLOR_ENGINEERING
/area/crew_quarters/heads/hos
holomap_color = HOLOMAP_AREACOLOR_SECURITY
/area/crew_quarters/heads/cmo
holomap_color = HOLOMAP_AREACOLOR_MEDICAL
/area/crew_quarters/medbreak
holomap_color = HOLOMAP_AREACOLOR_MEDICAL
// ### PROCS ###
// Whether the turfs in the area should be drawn onto the "base" holomap.
/area/proc/holomapAlwaysDraw()
return TRUE
/area/shuttle/holomapAlwaysDraw()
return FALSE
+40
View File
@@ -0,0 +1,40 @@
// Simple datum to keep track of a running holomap. Each machine capable of displaying the holomap will have one.
/datum/station_holomap
var/image/station_map
var/image/cursor
var/image/legend
/datum/station_holomap/proc/initialize_holomap(var/turf/T, var/isAI = null, var/mob/user = null, var/reinit = FALSE)
if(!station_map || reinit)
station_map = image(extraMiniMaps["[HOLOMAP_EXTRA_STATIONMAP]_[T.z]"])
if(!cursor || reinit)
cursor = image('icons/holomap_markers_vr.dmi', "you")
if(!legend || reinit)
legend = image('icons/effects/64x64_vr.dmi', "legend")
if(isAI)
T = get_turf(user.client.eye)
cursor.pixel_x = (T.x - 6 + HOLOMAP_PIXEL_OFFSET_X(T.z)) * PIXEL_MULTIPLIER
cursor.pixel_y = (T.y - 6 + HOLOMAP_PIXEL_OFFSET_Y(T.z)) * PIXEL_MULTIPLIER
legend.pixel_x = HOLOMAP_LEGEND_X(T.z)
legend.pixel_y = HOLOMAP_LEGEND_Y(T.z)
station_map.overlays |= cursor
station_map.overlays |= legend
/datum/station_holomap/proc/initialize_holomap_bogus()
station_map = image('icons/480x480_vr.dmi', "stationmap")
legend = image('icons/effects/64x64_vr.dmi', "notfound")
legend.pixel_x = 7 * WORLD_ICON_SIZE
legend.pixel_y = 7 * WORLD_ICON_SIZE
station_map.overlays |= legend
// TODO - Strategic Holomap support
// /datum/station_holomap/strategic/initialize_holomap(var/turf/T, var/isAI=null, var/mob/user=null)
// ..()
// station_map = image(extraMiniMaps[HOLOMAP_EXTRA_STATIONMAP_STRATEGIC])
// legend = image('icons/effects/64x64.dmi', "strategic")
// legend.pixel_x = 3*WORLD_ICON_SIZE
// legend.pixel_y = 3*WORLD_ICON_SIZE
// station_map.overlays |= legend
+44
View File
@@ -0,0 +1,44 @@
//
// An enhancement to /datum/map to store more and better meta-info about Z-levels
//
// Structure to hold zlevel info together in one nice convenient package.
// Wouldn't this be nicer than having to do those dumb arrays?
/datum/map_z_level
var/name // Friendly name of the zlevel
var/z = -1 // Actual z-index of the zlevel. This had better be right!
var/holomap_offset_x = 0 // Number of pixels to offset right (for centering)
var/holomap_offset_y = 0 // Number of pixels to offset up (for centering)
var/holomap_legend_x = 96 // x position of the holomap legend for this z
var/holomap_legend_y = 96 // y position of the holomap legend for this z
/datum/map_z_level/New(z, name, holomap_zoom = initial(holomap_zoom), holomap_offset_x = initial(holomap_offset_x), holomap_offset_y = initial(holomap_offset_y))
src.z = z
src.name = name
src.holomap_offset_x = holomap_offset_x
src.holomap_offset_y = holomap_offset_y
// Map datum stuff we need
// TODO - Put this into ~map_system/maps.dm
/datum/map
var/list/zlevels = list()
// LEGACY - This is how /vg does it, and how the code uses it. I'm in transition to use my new way (above)
// but for now lets just initialize this stuff so the code works.
/datum/map
var/list/holomap_smoosh // List of lists of zlevels to smoosh into single icons
var/list/holomap_offset_x = list()
var/list/holomap_offset_y = list()
var/list/holomap_legend_x = list()
var/list/holomap_legend_y = list()
/datum/map/New()
..()
// Auto-calculate any missing holomap offsets to center them, assuming they are full sized maps.
for(var/i in (holomap_offset_x.len + 1) to world.maxx)
holomap_offset_x += ((480 - world.maxx) / 2)
for(var/i in (holomap_offset_y.len + 1) to world.maxy)
holomap_offset_y += ((480 - world.maxy) / 2)
for(var/z in 1 to world.maxz)
holomap_legend_x += 96
holomap_legend_y += 96
+246
View File
@@ -0,0 +1,246 @@
var/global/list/station_holomaps = list()
/obj/machinery/station_map
name = "station holomap"
desc = "A virtual map of the surrounding station."
icon = 'icons/obj/machines/stationmap_vr.dmi'
icon_state = "station_map"
anchored = 1
density = 0
use_power = 1
idle_power_usage = 10
active_power_usage = 500
auto_init = 0 // We handle our own special initialization needs. // TODO - Make this not ~Leshana
circuit = /obj/item/weapon/circuitboard/station_map
// TODO - Port use_auto_lights from /vg - for now declare here
var/use_auto_lights = 1
var/light_power_on = 1
var/light_range_on = 2
light_color = "#64C864"
layer = ABOVE_WINDOW_LAYER
var/mob/watching_mob = null
var/image/small_station_map = null
var/image/floor_markings = null
var/image/panel = null
var/original_zLevel = 1 // zLevel on which the station map was initialized.
var/bogus = TRUE // set to 0 when you initialize the station map on a zLevel that has its own icon formatted for use by station holomaps.
var/datum/station_holomap/holomap_datum
/obj/machinery/station_map/New()
..()
holomap_datum = new()
original_zLevel = loc.z
station_holomaps += src
flags |= ON_BORDER // Why? It doesn't help if its not density
if(ticker && holomaps_initialized)
spawn(1) // Tragically we need to spawn this in order to give the frame construcing us time to set pixel_x/y
initialize()
/obj/machinery/station_map/Destroy()
station_holomaps -= src
stopWatching()
holomap_datum = null
..()
/obj/machinery/station_map/initialize()
bogus = FALSE
var/turf/T = get_turf(src)
original_zLevel = T.z
if(!("[HOLOMAP_EXTRA_STATIONMAP]_[original_zLevel]" in extraMiniMaps))
bogus = TRUE
holomap_datum.initialize_holomap_bogus()
update_icon()
return
holomap_datum.initialize_holomap(T, reinit = TRUE)
small_station_map = image(extraMiniMaps["[HOLOMAP_EXTRA_STATIONMAPSMALL]_[original_zLevel]"], dir = dir)
// small_station_map.plane = LIGHTING_PLANE // Not until we do planes ~Leshana
// small_station_map.layer = LIGHTING_LAYER+1 // Weird things will happen!
floor_markings = image('icons/obj/machines/stationmap_vr.dmi', "decal_station_map")
floor_markings.dir = src.dir
// floor_markings.plane = ABOVE_TURF_PLANE // Not until we do planes ~Leshana
// floor_markings.layer = DECAL_LAYER
update_icon()
/obj/machinery/station_map/attack_hand(var/mob/user)
if(watching_mob && (watching_mob != user))
to_chat(user, "<span class='warning'>Someone else is currently watching the holomap.</span>")
return
if(user.loc != loc)
to_chat(user, "<span class='warning'>You need to stand in front of \the [src].</span>")
return
startWatching(user)
// Let people bump up against it to watch
/obj/machinery/station_map/Bumped(var/atom/movable/AM)
if(!watching_mob && isliving(AM) && AM.loc == loc)
startWatching(AM)
// In order to actually get Bumped() we need to block movement. We're (visually) on a wall, so people
// couldn't really walk into us anyway. But in reality we are on the turf in front of the wall, so bumping
// against where we seem is actually trying to *exit* our real loc
/obj/machinery/station_map/CheckExit(atom/movable/mover as mob|obj, turf/target as turf)
// log_debug("[src] (dir=[dir]) CheckExit([mover], [target]) get_dir() = [get_dir(target, loc)]")
if(get_dir(target, loc) == dir) // Opposite of "normal" since we are visually in the next turf over
return FALSE
else
return TRUE
/obj/machinery/station_map/proc/startWatching(var/mob/user)
// Okay, does this belong on a screen thing or what?
// One argument is that this is an "in game" object becuase its in the world.
// But I think it actually isn't. The map isn't holo projected into the whole room, (maybe strat one is!)
// But for this, the on screen object just represents you leaning in and looking at it closely.
// So it SHOULD be a screen object.
// But it is not QUITE a hud either. So I think it shouldn't go in /datum/hud
// Okay? Yeah. Lets use screen objects but manage them manually here in the item.
// That might be a mistake... I'd rather they be managed by some central hud management system.
// But the /vg code, while the screen obj is managed, its still adding and removing image, so this is
// just as good.
// EH JUST HACK IT FOR NOW SO WE CAN SEE HOW IT LOOKS! STOP OBSESSING, ITS BEEN AN HOUR NOW!
// TODO - This part!! ~Leshana
if(isliving(user) && anchored && !(stat & (NOPOWER|BROKEN)))
if(user.client)
holomap_datum.station_map.loc = global_hud.holomap // Put the image on the holomap hud
holomap_datum.station_map.alpha = 0 // Set to transparent so we can fade in
animate(holomap_datum.station_map, alpha = 255, time = 5, easing = LINEAR_EASING)
flick("station_map_activate", src)
// Wait, if wea re not modifying the holomap_obj... can't it be part of the global hud?
user.client.screen |= global_hud.holomap // TODO - HACK! This should be there permenently really.
user.client.images |= holomap_datum.station_map
watching_mob = user
moved_event.register(watching_mob, src, /obj/machinery/station_map/proc/checkPosition)
dir_set_event.register(watching_mob, src, /obj/machinery/station_map/proc/checkPosition)
destroyed_event.register(watching_mob, src, /obj/machinery/station_map/proc/stopWatching)
update_use_power(2)
if(bogus)
to_chat(user, "<span class='warning'>The holomap failed to initialize. This area of space cannot be mapped.</span>")
else
to_chat(user, "<span class='notice'>A hologram of the station appears before your eyes.</span>")
/obj/machinery/station_map/attack_ai(var/mob/living/silicon/robot/user)
return // TODO - Implement for AI ~Leshana
// user.station_holomap.toggleHolomap(user, isAI(user))
/obj/machinery/station_map/process()
if((stat & (NOPOWER|BROKEN)) || !anchored)
stopWatching()
/obj/machinery/station_map/proc/checkPosition()
if(!watching_mob || (watching_mob.loc != loc) || (dir != watching_mob.dir))
stopWatching()
/obj/machinery/station_map/proc/stopWatching()
if(watching_mob)
if(watching_mob.client)
animate(holomap_datum.station_map, alpha = 0, time = 5, easing = LINEAR_EASING)
var/mob/M = watching_mob
spawn(5) //we give it time to fade out
M.client.images -= holomap_datum.station_map
moved_event.unregister(watching_mob, src)
dir_set_event.unregister(watching_mob, src)
destroyed_event.unregister(watching_mob, src)
watching_mob = null
update_use_power(1)
/obj/machinery/station_map/power_change()
. = ..()
update_icon()
// TODO - Port use_auto_lights from /vg - For now implement it manually here
if(stat & NOPOWER)
set_light(0)
else
set_light(light_range_on, light_power_on)
/obj/machinery/station_map/proc/set_broken()
stat |= BROKEN
update_icon()
/obj/machinery/station_map/update_icon()
overlays.Cut()
if(stat & BROKEN)
icon_state = "station_mapb"
else if((stat & NOPOWER) || !anchored)
icon_state = "station_map0"
else
icon_state = "station_map"
if(bogus)
holomap_datum.initialize_holomap_bogus()
else
small_station_map.icon = extraMiniMaps["[HOLOMAP_EXTRA_STATIONMAPSMALL]_[original_zLevel]"]
overlays |= small_station_map
holomap_datum.initialize_holomap(get_turf(src))
// Put the little "map" overlay down where it looks nice
if(floor_markings)
floor_markings.dir = src.dir
floor_markings.pixel_x = -src.pixel_x
floor_markings.pixel_y = -src.pixel_y
overlays += floor_markings
if(panel_open)
overlays += "station_map-panel"
else
overlays -= "station_map-panel"
/obj/machinery/station_map/attackby(obj/item/weapon/W as obj, mob/user as mob)
src.add_fingerprint(user)
if(default_deconstruction_screwdriver(user, W))
return
if(default_deconstruction_crowbar(user, W))
return
return ..()
/obj/machinery/station_map/ex_act(severity)
switch(severity)
if(1)
qdel(src)
if(2)
if (prob(50))
qdel(src)
else
set_broken()
if(3)
if (prob(25))
set_broken()
/datum/frame/frame_types/station_map
name = "Station Map Frame"
frame_class = "display"
frame_size = 3
frame_style = "wall"
x_offset = WORLD_ICON_SIZE
y_offset = WORLD_ICON_SIZE
circuit = /obj/item/weapon/circuitboard/station_map
icon_override = 'icons/obj/machines/stationmap_vr.dmi'
/datum/frame/frame_types/station_map/get_icon_state(var/state)
return "station_map_frame_[state]"
/obj/structure/frame
layer = ABOVE_WINDOW_LAYER
/obj/item/weapon/circuitboard/station_map
name = T_BOARD("Station Map")
board_type = new /datum/frame/frame_types/station_map
build_path = /obj/machinery/station_map
origin_tech = list(TECH_DATA = 3, TECH_ENGINEERING = 2)
req_components = list()
// TODO
// //Portable holomaps, currently AI/Borg/MoMMI only
// TODO
// OHHHH YEAH - STRATEGIC HOLOMAP! NICE!
// It will need to wait until later tho.
+1 -1
View File
@@ -20,7 +20,7 @@
/obj/machinery/seed_storage
name = "Seed storage"
desc = "It stores, sorts, and dispenses seeds."
icon = 'icons/obj/vending.dmi'
icon = 'icons/obj/vending_vr.dmi' //VOREStation Edit - Dunno why this isn't a vending subtype
icon_state = "seeds"
density = 1
anchored = 1
@@ -112,6 +112,15 @@
/atom/movable/lighting_overlay/singularity_pull()
return
/atom/movable/lighting_overlay/forceMove()
return 0 //should never move
/atom/movable/lighting_overlay/Move()
return 0
/atom/movable/lighting_overlay/throw_at()
return 0
/atom/movable/lighting_overlay/Destroy()
total_lighting_overlays--
global.lighting_update_overlays -= src
+4 -3
View File
@@ -55,6 +55,7 @@
recipes += new/datum/stack_recipe("fire extinguisher cabinet frame", /obj/item/frame/extinguisher_cabinet, 4, time = 5, one_per_turf = 0, on_floor = 1)
//recipes += new/datum/stack_recipe("fire axe cabinet frame", /obj/item/frame/fireaxe_cabinet, 4, time = 5, one_per_turf = 0, on_floor = 1)
recipes += new/datum/stack_recipe("wall girders", /obj/structure/girder, 2, time = 50, one_per_turf = 1, on_floor = 1)
recipes += new/datum/stack_recipe("railing", /obj/structure/railing, 2, time = 50, one_per_turf = 0, on_floor = 1)
recipes += new/datum/stack_recipe("turret frame", /obj/machinery/porta_turret_construct, 5, time = 25, one_per_turf = 1, on_floor = 1)
recipes += new/datum/stack_recipe_list("airlock assemblies", list( \
new/datum/stack_recipe("standard airlock assembly", /obj/structure/door_assembly, 4, time = 50, one_per_turf = 1, on_floor = 1), \
@@ -95,7 +96,7 @@
recipes += new/datum/stack_recipe("AI core", /obj/structure/AIcore, 4, time = 50, one_per_turf = 1)
recipes += new/datum/stack_recipe("Metal crate", /obj/structure/closet/crate, 10, time = 50, one_per_turf = 1)
recipes += new/datum/stack_recipe("knife grip", /obj/item/weapon/material/butterflyhandle, 4, time = 20, one_per_turf = 0, on_floor = 1, supplied_material = "[name]")
recipes += new/datum/stack_recipe("dark floor tile", /obj/item/stack/tile/floor_dark, 1, 4, 20)
recipes += new/datum/stack_recipe("dark floor tile", /obj/item/stack/tile/floor/dark, 1, 4, 20)
recipes += new/datum/stack_recipe("roller bed", /obj/item/roller, 5, time = 30, on_floor = 1)
recipes += new/datum/stack_recipe("whetstone", /obj/item/weapon/whetstone, 2, time = 10)
@@ -111,8 +112,8 @@
recipes += new/datum/stack_recipe("reagent dispenser cartridge (large)", /obj/item/weapon/reagent_containers/chem_disp_cartridge, 5, on_floor=0) // 500u
recipes += new/datum/stack_recipe("reagent dispenser cartridge (med)", /obj/item/weapon/reagent_containers/chem_disp_cartridge/medium, 3, on_floor=0) // 250u
recipes += new/datum/stack_recipe("reagent dispenser cartridge (small)", /obj/item/weapon/reagent_containers/chem_disp_cartridge/small, 1, on_floor=0) // 100u
recipes += new/datum/stack_recipe("white floor tile", /obj/item/stack/tile/floor_white, 1, 4, 20)
recipes += new/datum/stack_recipe("freezer floor tile", /obj/item/stack/tile/floor_freezer, 1, 4, 20)
recipes += new/datum/stack_recipe("white floor tile", /obj/item/stack/tile/floor/white, 1, 4, 20)
recipes += new/datum/stack_recipe("freezer floor tile", /obj/item/stack/tile/floor/freezer, 1, 4, 20)
recipes += new/datum/stack_recipe("shower curtain", /obj/structure/curtain, 4, time = 15, one_per_turf = 1, on_floor = 1)
recipes += new/datum/stack_recipe("plastic flaps", /obj/structure/plasticflaps, 4, time = 25, one_per_turf = 1, on_floor = 1)
recipes += new/datum/stack_recipe("airtight plastic flaps", /obj/structure/plasticflaps/mining, 5, time = 25, one_per_turf = 1, on_floor = 1)
+7 -1
View File
@@ -9,13 +9,15 @@
var/artist // Song's creator
var/duration // Song length in deciseconds
var/secret // Show up in regular playlist or secret playlist?
var/lobby // Be one of the choices for lobby music?
/datum/track/New(var/url, var/title, var/duration, var/artist = "", var/secret = 0)
/datum/track/New(var/url, var/title, var/duration, var/artist = "", var/secret = 0, var/lobby = 0)
src.url = url
src.title = title
src.artist = artist
src.duration = duration
src.secret = secret
src.lobby = lobby
/datum/track/proc/display()
var str = "\"[title]\""
@@ -29,6 +31,7 @@
// Global list holding all configured jukebox tracks
var/global/list/all_jukebox_tracks = list()
var/global/list/all_lobby_tracks = list()
// Read the jukebox configuration file on system startup.
/hook/startup/proc/load_jukebox_tracks()
@@ -53,5 +56,8 @@ var/global/list/all_jukebox_tracks = list()
if(istext(entry["artist"]))
T.artist = entry["artist"]
T.secret = entry["secret"] ? 1 : 0
T.lobby = entry["lobby"] ? 1 : 0
all_jukebox_tracks += T
if(T.lobby)
all_lobby_tracks += T
return 1
+5 -9
View File
@@ -16,16 +16,12 @@
#define MP_DEBUG(x)
#endif
// Set up player on login to a mob.
// This means they get a new media manager every time they switch mobs!
// Is this wasteful? Granted switching mobs doesn't happen very often so maybe its fine.
// TODO - While this direct override might technically be faster, probably better code to use observer or hooks ~Leshana
/mob/Login()
// Set up player on login.
/client/New()
. = ..()
ASSERT(src.client)
src.client.media = new /datum/media_manager(src.client)
src.client.media.open()
src.client.media.update_music()
media = new /datum/media_manager(src)
media.open()
media.update_music()
// Stop media when the round ends. I guess so it doesn't play forever or something (for some reason?)
/hook/roundend/proc/stop_all_media()
+18 -2
View File
@@ -301,6 +301,22 @@ proc/get_radio_key_from_channel(var/channel)
var/image/speech_bubble = image('icons/mob/talk_vr.dmi',src,"h[speech_bubble_test]") //VOREStation Edit - Right-side talk icons
spawn(30) qdel(speech_bubble)
// VOREStation Edit - Attempt Multi-Z Talking
var/mob/above = src.shadow
while(!deleted(above))
var/turf/ST = get_turf(above)
if(ST)
var/list/results = get_mobs_and_objs_in_view_fast(ST, world.view)
var/image/z_speech_bubble = image('icons/mob/talk_vr.dmi', above, "h[speech_bubble_test]")
spawn(30) qdel(z_speech_bubble)
for(var/item in results["mobs"])
if(item != above && !(item in listening))
listening[item] = z_speech_bubble
listening_obj |= results["objs"]
above = above.shadow
// VOREStation Edit End
//Main 'say' and 'whisper' message delivery
for(var/mob/M in listening)
spawn(0) //Using spawns to queue all the messages for AFTER this proc is done, and stop runtimes
@@ -309,12 +325,12 @@ proc/get_radio_key_from_channel(var/channel)
var/dst = get_dist(get_turf(M),get_turf(src))
if(dst <= message_range || (M.stat == DEAD && !forbid_seeing_deadchat)) //Inside normal message range, or dead with ears (handled in the view proc)
M << speech_bubble
M << (listening[M] || speech_bubble) // VOREStation Edit - Send the image attached to shadow mob if available
M.hear_say(message, verb, speaking, alt_name, italics, src, speech_sound, sound_vol)
if(whispering) //Don't even bother with these unless whispering
if(dst > message_range && dst <= w_scramble_range) //Inside whisper scramble range
M << speech_bubble
M << (listening[M] || speech_bubble) // VOREStation Edit - Send the image attached to shadow mob if available
M.hear_say(stars(message), verb, speaking, alt_name, italics, src, speech_sound, sound_vol*0.2)
if(dst > w_scramble_range && dst <= world.view) //Inside whisper 'visible' range
M.show_message("<span class='game say'><span class='name'>[src.name]</span> [w_not_heard].</span>", 2)
@@ -2,7 +2,7 @@
name = "Maintenance Drone Control"
desc = "Used to monitor the station's drone population and the assembler that services them."
icon_keyboard = "power_key"
icon_screen = "power"
icon_screen = "generic" //VOREStation Edit
req_access = list(access_engine_equip)
circuit = /obj/item/weapon/circuitboard/drone_control

Some files were not shown because too many files have changed in this diff Show More