mirror of
https://github.com/VOREStation/VOREStation.git
synced 2026-08-27 14:08:44 +01:00
Merge branch 'master' of https://github.com/VOREStation/VOREStation into making-of-shadekin
This commit is contained in:
@@ -1,4 +1,4 @@
|
||||
#### Brief description of the issue
|
||||
#### Brief description of the bug
|
||||
|
||||
|
||||
#### What you expected to happen
|
||||
|
||||
@@ -0,0 +1,57 @@
|
||||
GLOBAL_LIST_EMPTY(shutoff_valves)
|
||||
|
||||
/obj/machinery/atmospherics/valve/shutoff
|
||||
icon = 'icons/atmos/clamp.dmi'
|
||||
icon_state = "map_vclamp0"
|
||||
pipe_state = "vclamp"
|
||||
|
||||
name = "automatic shutoff valve"
|
||||
desc = "An automatic valve with control circuitry and pipe integrity sensor, capable of automatically isolating damaged segments of the pipe network."
|
||||
var/close_on_leaks = TRUE // If false it will be always open
|
||||
level = 1
|
||||
|
||||
/obj/machinery/atmospherics/valve/shutoff/update_icon()
|
||||
icon_state = "vclamp[open]"
|
||||
|
||||
/obj/machinery/atmospherics/valve/shutoff/examine(var/mob/user)
|
||||
..()
|
||||
to_chat(user, "The automatic shutoff circuit is [close_on_leaks ? "enabled" : "disabled"].")
|
||||
|
||||
/obj/machinery/atmospherics/valve/shutoff/Initialize()
|
||||
. = ..()
|
||||
open()
|
||||
GLOB.shutoff_valves += src
|
||||
hide(1)
|
||||
|
||||
/obj/machinery/atmospherics/valve/shutoff/Destroy()
|
||||
GLOB.shutoff_valves -= src
|
||||
..()
|
||||
|
||||
/obj/machinery/atmospherics/valve/shutoff/attack_ai(mob/user as mob)
|
||||
return src.attack_hand(user)
|
||||
|
||||
/obj/machinery/atmospherics/valve/shutoff/attack_hand(var/mob/user)
|
||||
src.add_fingerprint(usr)
|
||||
update_icon(1)
|
||||
close_on_leaks = !close_on_leaks
|
||||
to_chat(user, "You [close_on_leaks ? "enable" : "disable"] the automatic shutoff circuit.")
|
||||
return TRUE
|
||||
|
||||
/obj/machinery/atmospherics/valve/shutoff/process()
|
||||
..()
|
||||
|
||||
if (!network_node1 || !network_node2)
|
||||
if(open)
|
||||
close()
|
||||
return
|
||||
|
||||
if (!close_on_leaks)
|
||||
if (!open)
|
||||
open()
|
||||
return
|
||||
|
||||
if (network_node1.leaks.len || network_node2.leaks.len)
|
||||
if (open)
|
||||
close()
|
||||
else if (!open)
|
||||
open()
|
||||
@@ -1,4 +1,4 @@
|
||||
//Basically a one way passive valve. If the pressure inside is greater than the environment then gas will flow passively,
|
||||
//Basically a one way passive valve. If the pressure inside is greater than the environment then gas will flow passively,
|
||||
//but it does not permit gas to flow back from the environment into the injector. Can be turned off to prevent any gas flow.
|
||||
//When it receives the "inject" signal, it will try to pump it's entire contents into the environment regardless of pressure, using power.
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
use_power = 0
|
||||
idle_power_usage = 150 //internal circuitry, friction losses and stuff
|
||||
power_rating = 15000 //15000 W ~ 20 HP
|
||||
|
||||
|
||||
var/injecting = 0
|
||||
|
||||
var/volume_rate = 50 //flow rate limit
|
||||
@@ -26,7 +26,7 @@
|
||||
|
||||
/obj/machinery/atmospherics/unary/outlet_injector/New()
|
||||
..()
|
||||
air_contents.volume = ATMOS_DEFAULT_VOLUME_PUMP + 500 //Give it a small reservoir for injecting. Also allows it to have a higher flow rate limit than vent pumps, to differentiate injectors a bit more.
|
||||
air_contents.volume = ATMOS_DEFAULT_VOLUME_PUMP + 500 //Give it a small reservoir for injecting. Also allows it to have a higher flow rate limit than vent pumps, to differentiate injectors a bit more.
|
||||
|
||||
/obj/machinery/atmospherics/unary/outlet_injector/Destroy()
|
||||
unregister_radio(src, frequency)
|
||||
@@ -60,21 +60,21 @@
|
||||
|
||||
if((stat & (NOPOWER|BROKEN)) || !use_power)
|
||||
return
|
||||
|
||||
|
||||
var/power_draw = -1
|
||||
var/datum/gas_mixture/environment = loc.return_air()
|
||||
|
||||
|
||||
if(environment && air_contents.temperature > 0)
|
||||
var/transfer_moles = (volume_rate/air_contents.volume)*air_contents.total_moles //apply flow rate limit
|
||||
power_draw = pump_gas(src, air_contents, environment, transfer_moles, power_rating)
|
||||
|
||||
|
||||
if (power_draw >= 0)
|
||||
last_power_draw = power_draw
|
||||
use_power(power_draw)
|
||||
|
||||
|
||||
if(network)
|
||||
network.update = 1
|
||||
|
||||
|
||||
return 1
|
||||
|
||||
/obj/machinery/atmospherics/unary/outlet_injector/proc/inject()
|
||||
@@ -84,7 +84,7 @@
|
||||
var/datum/gas_mixture/environment = loc.return_air()
|
||||
if (!environment)
|
||||
return 0
|
||||
|
||||
|
||||
injecting = 1
|
||||
|
||||
if(air_contents.temperature > 0)
|
||||
@@ -155,4 +155,23 @@
|
||||
update_icon()
|
||||
|
||||
/obj/machinery/atmospherics/unary/outlet_injector/hide(var/i)
|
||||
update_underlays()
|
||||
update_underlays()
|
||||
|
||||
/obj/machinery/atmospherics/unary/outlet_injector/attack_hand(mob/user as mob)
|
||||
to_chat(user, "<span class='notice'>You toggle \the [src].</span>")
|
||||
injecting = !injecting
|
||||
use_power = injecting
|
||||
update_icon()
|
||||
|
||||
/obj/machinery/atmospherics/unary/outlet_injector/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob)
|
||||
if (!W.is_wrench())
|
||||
return ..()
|
||||
|
||||
playsound(src, W.usesound, 50, 1)
|
||||
to_chat(user, "<span class='notice'>You begin to unfasten \the [src]...</span>")
|
||||
if (do_after(user, 40 * W.toolspeed))
|
||||
user.visible_message( \
|
||||
"<span class='notice'>\The [user] unfastens \the [src].</span>", \
|
||||
"<span class='notice'>You have unfastened \the [src].</span>", \
|
||||
"You hear a ratchet.")
|
||||
deconstruct()
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
desc = "Has a valve and pump attached to it"
|
||||
use_power = 0
|
||||
idle_power_usage = 150 //internal circuitry, friction losses and stuff
|
||||
power_rating = 7500 //7500 W ~ 10 HP
|
||||
power_rating = 30000 //7500 W ~ 10 HP //VOREStation Edit - 30000 W
|
||||
|
||||
connect_types = CONNECT_TYPE_REGULAR|CONNECT_TYPE_SUPPLY //connects to regular and supply pipes
|
||||
|
||||
@@ -89,7 +89,7 @@
|
||||
/obj/machinery/atmospherics/unary/vent_pump/high_volume
|
||||
name = "Large Air Vent"
|
||||
power_channel = EQUIP
|
||||
power_rating = 15000 //15 kW ~ 20 HP
|
||||
power_rating = 45000 //15 kW ~ 20 HP //VOREStation Edit - 45000
|
||||
|
||||
/obj/machinery/atmospherics/unary/vent_pump/high_volume/New()
|
||||
..()
|
||||
|
||||
@@ -8,76 +8,83 @@ var/global/list/datum/pipe_network/pipe_networks = list() // TODO - Move into SS
|
||||
var/list/datum/pipeline/line_members = list()
|
||||
//membership roster to go through for updates and what not
|
||||
|
||||
var/list/leaks = list()
|
||||
|
||||
var/update = 1
|
||||
//var/datum/gas_mixture/air_transient = null
|
||||
|
||||
Destroy()
|
||||
STOP_PROCESSING_PIPENET(src)
|
||||
for(var/datum/pipeline/line_member in line_members)
|
||||
line_member.network = null
|
||||
for(var/obj/machinery/atmospherics/normal_member in normal_members)
|
||||
normal_member.reassign_network(src, null)
|
||||
gases.Cut() // Do not qdel the gases, we don't own them
|
||||
return ..()
|
||||
/datum/pipe_network/Destroy()
|
||||
STOP_PROCESSING_PIPENET(src)
|
||||
for(var/datum/pipeline/line_member in line_members)
|
||||
line_member.network = null
|
||||
for(var/obj/machinery/atmospherics/normal_member in normal_members)
|
||||
normal_member.reassign_network(src, null)
|
||||
gases.Cut() // Do not qdel the gases, we don't own them
|
||||
leaks.Cut()
|
||||
return ..()
|
||||
|
||||
process()
|
||||
//Equalize gases amongst pipe if called for
|
||||
if(update)
|
||||
update = 0
|
||||
reconcile_air() //equalize_gases(gases)
|
||||
/datum/pipe_network/process()
|
||||
//Equalize gases amongst pipe if called for
|
||||
if(update)
|
||||
update = 0
|
||||
reconcile_air() //equalize_gases(gases)
|
||||
|
||||
//Give pipelines their process call for pressure checking and what not. Have to remove pressure checks for the time being as pipes dont radiate heat - Mport
|
||||
//for(var/datum/pipeline/line_member in line_members)
|
||||
// line_member.process()
|
||||
listclearnulls(leaks) // Let's not have forever-seals.
|
||||
|
||||
proc/build_network(obj/machinery/atmospherics/start_normal, obj/machinery/atmospherics/reference)
|
||||
//Purpose: Generate membership roster
|
||||
//Notes: Assuming that members will add themselves to appropriate roster in network_expand()
|
||||
//Give pipelines their process call for pressure checking and what not. Have to remove pressure checks for the time being as pipes dont radiate heat - Mport
|
||||
//for(var/datum/pipeline/line_member in line_members)
|
||||
// line_member.process()
|
||||
|
||||
if(!start_normal)
|
||||
qdel(src)
|
||||
return
|
||||
/datum/pipe_network/proc/build_network(obj/machinery/atmospherics/start_normal, obj/machinery/atmospherics/reference)
|
||||
//Purpose: Generate membership roster
|
||||
//Notes: Assuming that members will add themselves to appropriate roster in network_expand()
|
||||
|
||||
start_normal.network_expand(src, reference)
|
||||
if(!start_normal)
|
||||
qdel(src)
|
||||
return
|
||||
|
||||
update_network_gases()
|
||||
start_normal.network_expand(src, reference)
|
||||
|
||||
if((normal_members.len>0)||(line_members.len>0))
|
||||
START_PROCESSING_PIPENET(src)
|
||||
else
|
||||
qdel(src)
|
||||
update_network_gases()
|
||||
|
||||
proc/merge(datum/pipe_network/giver)
|
||||
if(giver==src) return 0
|
||||
if((normal_members.len>0)||(line_members.len>0))
|
||||
START_PROCESSING_PIPENET(src)
|
||||
else
|
||||
qdel(src)
|
||||
|
||||
normal_members |= giver.normal_members
|
||||
/datum/pipe_network/proc/merge(datum/pipe_network/giver)
|
||||
if(giver==src) return 0
|
||||
|
||||
line_members |= giver.line_members
|
||||
normal_members |= giver.normal_members
|
||||
|
||||
for(var/obj/machinery/atmospherics/normal_member in giver.normal_members)
|
||||
normal_member.reassign_network(giver, src)
|
||||
line_members |= giver.line_members
|
||||
|
||||
for(var/datum/pipeline/line_member in giver.line_members)
|
||||
line_member.network = src
|
||||
leaks |= giver.leaks
|
||||
|
||||
update_network_gases()
|
||||
return 1
|
||||
for(var/obj/machinery/atmospherics/normal_member in giver.normal_members)
|
||||
normal_member.reassign_network(giver, src)
|
||||
|
||||
proc/update_network_gases()
|
||||
//Go through membership roster and make sure gases is up to date
|
||||
for(var/datum/pipeline/line_member in giver.line_members)
|
||||
line_member.network = src
|
||||
|
||||
gases = list()
|
||||
volume = 0
|
||||
update_network_gases()
|
||||
return 1
|
||||
|
||||
for(var/obj/machinery/atmospherics/normal_member in normal_members)
|
||||
var/result = normal_member.return_network_air(src)
|
||||
if(result) gases += result
|
||||
/datum/pipe_network/proc/update_network_gases()
|
||||
//Go through membership roster and make sure gases is up to date
|
||||
|
||||
for(var/datum/pipeline/line_member in line_members)
|
||||
gases += line_member.air
|
||||
gases = list()
|
||||
volume = 0
|
||||
|
||||
for(var/datum/gas_mixture/air in gases)
|
||||
volume += air.volume
|
||||
for(var/obj/machinery/atmospherics/normal_member in normal_members)
|
||||
var/result = normal_member.return_network_air(src)
|
||||
if(result) gases += result
|
||||
|
||||
proc/reconcile_air()
|
||||
equalize_gases(gases)
|
||||
for(var/datum/pipeline/line_member in line_members)
|
||||
gases += line_member.air
|
||||
|
||||
for(var/datum/gas_mixture/air in gases)
|
||||
volume += air.volume
|
||||
|
||||
/datum/pipe_network/proc/reconcile_air()
|
||||
equalize_gases(gases)
|
||||
|
||||
+176
-161
@@ -1,219 +1,234 @@
|
||||
|
||||
datum/pipeline
|
||||
/datum/pipeline
|
||||
var/datum/gas_mixture/air
|
||||
|
||||
var/list/obj/machinery/atmospherics/pipe/members
|
||||
var/list/obj/machinery/atmospherics/pipe/edges //Used for building networks
|
||||
|
||||
// Nodes that are leaking. Used for A.S. Valves.
|
||||
var/list/leaks = list()
|
||||
|
||||
var/datum/pipe_network/network
|
||||
|
||||
var/alert_pressure = 0
|
||||
|
||||
Destroy()
|
||||
QDEL_NULL(network)
|
||||
/datum/pipeline/Destroy()
|
||||
QDEL_NULL(network)
|
||||
|
||||
if(air && air.volume)
|
||||
temporarily_store_air()
|
||||
for(var/obj/machinery/atmospherics/pipe/P in members)
|
||||
P.parent = null
|
||||
members = null
|
||||
edges = null
|
||||
. = ..()
|
||||
if(air && air.volume)
|
||||
temporarily_store_air()
|
||||
for(var/obj/machinery/atmospherics/pipe/P in members)
|
||||
P.parent = null
|
||||
members = null
|
||||
edges = null
|
||||
leaks = null
|
||||
. = ..()
|
||||
|
||||
process()//This use to be called called from the pipe networks
|
||||
|
||||
//Check to see if pressure is within acceptable limits
|
||||
var/pressure = air.return_pressure()
|
||||
if(pressure > alert_pressure)
|
||||
for(var/obj/machinery/atmospherics/pipe/member in members)
|
||||
if(!member.check_pressure(pressure))
|
||||
break //Only delete 1 pipe per process
|
||||
|
||||
proc/temporarily_store_air()
|
||||
//Update individual gas_mixtures by volume ratio
|
||||
/datum/pipeline/process()//This use to be called called from the pipe networks
|
||||
|
||||
//Check to see if pressure is within acceptable limits
|
||||
var/pressure = air.return_pressure()
|
||||
if(pressure > alert_pressure)
|
||||
for(var/obj/machinery/atmospherics/pipe/member in members)
|
||||
member.air_temporary = new
|
||||
member.air_temporary.copy_from(air)
|
||||
member.air_temporary.volume = member.volume
|
||||
member.air_temporary.multiply(member.volume / air.volume)
|
||||
if(!member.check_pressure(pressure))
|
||||
break //Only delete 1 pipe per process
|
||||
|
||||
proc/build_pipeline(obj/machinery/atmospherics/pipe/base)
|
||||
/datum/pipeline/proc/temporarily_store_air()
|
||||
//Update individual gas_mixtures by volume ratio
|
||||
|
||||
for(var/obj/machinery/atmospherics/pipe/member in members)
|
||||
member.air_temporary = new
|
||||
member.air_temporary.copy_from(air)
|
||||
member.air_temporary.volume = member.volume
|
||||
member.air_temporary.multiply(member.volume / air.volume)
|
||||
|
||||
/datum/pipeline/proc/build_pipeline(obj/machinery/atmospherics/pipe/base)
|
||||
air = new
|
||||
|
||||
var/list/possible_expansions = list(base)
|
||||
members = list(base)
|
||||
edges = list()
|
||||
|
||||
var/volume = base.volume
|
||||
base.parent = src
|
||||
alert_pressure = base.alert_pressure
|
||||
|
||||
if(base.air_temporary)
|
||||
air = base.air_temporary
|
||||
base.air_temporary = null
|
||||
else
|
||||
air = new
|
||||
|
||||
var/list/possible_expansions = list(base)
|
||||
members = list(base)
|
||||
edges = list()
|
||||
if(base.leaking)
|
||||
leaks |= base
|
||||
|
||||
var/volume = base.volume
|
||||
base.parent = src
|
||||
alert_pressure = base.alert_pressure
|
||||
while(possible_expansions.len>0)
|
||||
for(var/obj/machinery/atmospherics/pipe/borderline in possible_expansions)
|
||||
|
||||
if(base.air_temporary)
|
||||
air = base.air_temporary
|
||||
base.air_temporary = null
|
||||
else
|
||||
air = new
|
||||
var/list/result = borderline.pipeline_expansion()
|
||||
var/edge_check = result.len
|
||||
|
||||
while(possible_expansions.len>0)
|
||||
for(var/obj/machinery/atmospherics/pipe/borderline in possible_expansions)
|
||||
if(result.len>0)
|
||||
for(var/obj/machinery/atmospherics/pipe/item in result)
|
||||
|
||||
var/list/result = borderline.pipeline_expansion()
|
||||
var/edge_check = result.len
|
||||
if(item.in_stasis)
|
||||
continue
|
||||
|
||||
if(result.len>0)
|
||||
for(var/obj/machinery/atmospherics/pipe/item in result)
|
||||
if(!members.Find(item))
|
||||
members += item
|
||||
possible_expansions += item
|
||||
if(!members.Find(item))
|
||||
members += item
|
||||
possible_expansions += item
|
||||
|
||||
volume += item.volume
|
||||
item.parent = src
|
||||
volume += item.volume
|
||||
item.parent = src
|
||||
|
||||
alert_pressure = min(alert_pressure, item.alert_pressure)
|
||||
alert_pressure = min(alert_pressure, item.alert_pressure)
|
||||
|
||||
if(item.air_temporary)
|
||||
air.merge(item.air_temporary)
|
||||
if(item.air_temporary)
|
||||
air.merge(item.air_temporary)
|
||||
|
||||
edge_check--
|
||||
if(item.leaking)
|
||||
leaks |= item
|
||||
|
||||
if(edge_check>0)
|
||||
edges += borderline
|
||||
edge_check--
|
||||
|
||||
possible_expansions -= borderline
|
||||
if(edge_check>0)
|
||||
edges += borderline
|
||||
|
||||
air.volume = volume
|
||||
possible_expansions -= borderline
|
||||
|
||||
proc/network_expand(datum/pipe_network/new_network, obj/machinery/atmospherics/pipe/reference)
|
||||
air.volume = volume
|
||||
|
||||
if(new_network.line_members.Find(src))
|
||||
return 0
|
||||
/datum/pipeline/proc/network_expand(datum/pipe_network/new_network, obj/machinery/atmospherics/pipe/reference)
|
||||
|
||||
new_network.line_members += src
|
||||
if(new_network.line_members.Find(src))
|
||||
return 0
|
||||
|
||||
network = new_network
|
||||
new_network.line_members += src
|
||||
|
||||
for(var/obj/machinery/atmospherics/pipe/edge in edges)
|
||||
for(var/obj/machinery/atmospherics/result in edge.pipeline_expansion())
|
||||
if(!istype(result,/obj/machinery/atmospherics/pipe) && (result!=reference))
|
||||
result.network_expand(new_network, edge)
|
||||
network = new_network
|
||||
network.leaks |= leaks
|
||||
|
||||
return 1
|
||||
for(var/obj/machinery/atmospherics/pipe/edge in edges)
|
||||
for(var/obj/machinery/atmospherics/result in edge.pipeline_expansion())
|
||||
if(!istype(result,/obj/machinery/atmospherics/pipe) && (result!=reference))
|
||||
result.network_expand(new_network, edge)
|
||||
|
||||
proc/return_network(obj/machinery/atmospherics/reference)
|
||||
if(!network)
|
||||
network = new /datum/pipe_network()
|
||||
network.build_network(src, null)
|
||||
//technically passing these parameters should not be allowed
|
||||
//however pipe_network.build_network(..) and pipeline.network_extend(...)
|
||||
// were setup to properly handle this case
|
||||
return 1
|
||||
|
||||
return network
|
||||
/datum/pipeline/proc/return_network(obj/machinery/atmospherics/reference)
|
||||
if(!network)
|
||||
network = new /datum/pipe_network()
|
||||
network.build_network(src, null)
|
||||
//technically passing these parameters should not be allowed
|
||||
//however pipe_network.build_network(..) and pipeline.network_extend(...)
|
||||
// were setup to properly handle this case
|
||||
|
||||
proc/mingle_with_turf(turf/simulated/target, mingle_volume)
|
||||
var/datum/gas_mixture/air_sample = air.remove_ratio(mingle_volume/air.volume)
|
||||
air_sample.volume = mingle_volume
|
||||
return network
|
||||
|
||||
if(istype(target) && target.zone)
|
||||
//Have to consider preservation of group statuses
|
||||
var/datum/gas_mixture/turf_copy = new
|
||||
var/datum/gas_mixture/turf_original = new
|
||||
/datum/pipeline/proc/mingle_with_turf(turf/simulated/target, mingle_volume)
|
||||
var/datum/gas_mixture/air_sample = air.remove_ratio(mingle_volume/air.volume)
|
||||
air_sample.volume = mingle_volume
|
||||
|
||||
turf_copy.copy_from(target.zone.air)
|
||||
turf_copy.volume = target.zone.air.volume //Copy a good representation of the turf from parent group
|
||||
turf_original.copy_from(turf_copy)
|
||||
if(istype(target) && target.zone)
|
||||
//Have to consider preservation of group statuses
|
||||
var/datum/gas_mixture/turf_copy = new
|
||||
var/datum/gas_mixture/turf_original = new
|
||||
|
||||
equalize_gases(list(air_sample, turf_copy))
|
||||
air.merge(air_sample)
|
||||
turf_copy.copy_from(target.zone.air)
|
||||
turf_copy.volume = target.zone.air.volume //Copy a good representation of the turf from parent group
|
||||
turf_original.copy_from(turf_copy)
|
||||
|
||||
equalize_gases(list(air_sample, turf_copy))
|
||||
air.merge(air_sample)
|
||||
|
||||
|
||||
target.zone.air.remove(turf_original.total_moles)
|
||||
target.zone.air.merge(turf_copy)
|
||||
target.zone.air.remove(turf_original.total_moles)
|
||||
target.zone.air.merge(turf_copy)
|
||||
|
||||
else
|
||||
var/datum/gas_mixture/turf_air = target.return_air()
|
||||
else
|
||||
var/datum/gas_mixture/turf_air = target.return_air()
|
||||
|
||||
equalize_gases(list(air_sample, turf_air))
|
||||
air.merge(air_sample)
|
||||
//turf_air already modified by equalize_gases()
|
||||
equalize_gases(list(air_sample, turf_air))
|
||||
air.merge(air_sample)
|
||||
//turf_air already modified by equalize_gases()
|
||||
|
||||
if(network)
|
||||
network.update = 1
|
||||
if(network)
|
||||
network.update = 1
|
||||
|
||||
proc/temperature_interact(turf/target, share_volume, thermal_conductivity)
|
||||
var/total_heat_capacity = air.heat_capacity()
|
||||
var/partial_heat_capacity = total_heat_capacity*(share_volume/air.volume)
|
||||
/datum/pipeline/proc/temperature_interact(turf/target, share_volume, thermal_conductivity)
|
||||
var/total_heat_capacity = air.heat_capacity()
|
||||
var/partial_heat_capacity = total_heat_capacity*(share_volume/air.volume)
|
||||
|
||||
if(istype(target, /turf/simulated))
|
||||
var/turf/simulated/modeled_location = target
|
||||
if(istype(target, /turf/simulated))
|
||||
var/turf/simulated/modeled_location = target
|
||||
|
||||
if(modeled_location.blocks_air)
|
||||
if(modeled_location.blocks_air)
|
||||
|
||||
if((modeled_location.heat_capacity>0) && (partial_heat_capacity>0))
|
||||
var/delta_temperature = air.temperature - modeled_location.temperature
|
||||
|
||||
var/heat = thermal_conductivity*delta_temperature* \
|
||||
(partial_heat_capacity*modeled_location.heat_capacity/(partial_heat_capacity+modeled_location.heat_capacity))
|
||||
|
||||
air.temperature -= heat/total_heat_capacity
|
||||
modeled_location.temperature += heat/modeled_location.heat_capacity
|
||||
|
||||
else
|
||||
var/delta_temperature = 0
|
||||
var/sharer_heat_capacity = 0
|
||||
|
||||
if(modeled_location.zone)
|
||||
delta_temperature = (air.temperature - modeled_location.zone.air.temperature)
|
||||
sharer_heat_capacity = modeled_location.zone.air.heat_capacity()
|
||||
else
|
||||
delta_temperature = (air.temperature - modeled_location.air.temperature)
|
||||
sharer_heat_capacity = modeled_location.air.heat_capacity()
|
||||
|
||||
var/self_temperature_delta = 0
|
||||
var/sharer_temperature_delta = 0
|
||||
|
||||
if((sharer_heat_capacity>0) && (partial_heat_capacity>0))
|
||||
var/heat = thermal_conductivity*delta_temperature* \
|
||||
(partial_heat_capacity*sharer_heat_capacity/(partial_heat_capacity+sharer_heat_capacity))
|
||||
|
||||
self_temperature_delta = -heat/total_heat_capacity
|
||||
sharer_temperature_delta = heat/sharer_heat_capacity
|
||||
else
|
||||
return 1
|
||||
|
||||
air.temperature += self_temperature_delta
|
||||
|
||||
if(modeled_location.zone)
|
||||
modeled_location.zone.air.temperature += sharer_temperature_delta/modeled_location.zone.air.group_multiplier
|
||||
else
|
||||
modeled_location.air.temperature += sharer_temperature_delta
|
||||
|
||||
|
||||
else
|
||||
if((target.heat_capacity>0) && (partial_heat_capacity>0))
|
||||
var/delta_temperature = air.temperature - target.temperature
|
||||
if((modeled_location.heat_capacity>0) && (partial_heat_capacity>0))
|
||||
var/delta_temperature = air.temperature - modeled_location.temperature
|
||||
|
||||
var/heat = thermal_conductivity*delta_temperature* \
|
||||
(partial_heat_capacity*target.heat_capacity/(partial_heat_capacity+target.heat_capacity))
|
||||
(partial_heat_capacity*modeled_location.heat_capacity/(partial_heat_capacity+modeled_location.heat_capacity))
|
||||
|
||||
air.temperature -= heat/total_heat_capacity
|
||||
if(network)
|
||||
network.update = 1
|
||||
modeled_location.temperature += heat/modeled_location.heat_capacity
|
||||
|
||||
//surface must be the surface area in m^2
|
||||
proc/radiate_heat_to_space(surface, thermal_conductivity)
|
||||
var/gas_density = air.total_moles/air.volume
|
||||
thermal_conductivity *= min(gas_density / ( RADIATOR_OPTIMUM_PRESSURE/(R_IDEAL_GAS_EQUATION*GAS_CRITICAL_TEMPERATURE) ), 1) //mult by density ratio
|
||||
else
|
||||
var/delta_temperature = 0
|
||||
var/sharer_heat_capacity = 0
|
||||
|
||||
// We only get heat from the star on the exposed surface area.
|
||||
// If the HE pipes gain more energy from AVERAGE_SOLAR_RADIATION than they can radiate, then they have a net heat increase.
|
||||
var/heat_gain = AVERAGE_SOLAR_RADIATION * (RADIATOR_EXPOSED_SURFACE_AREA_RATIO * surface) * thermal_conductivity
|
||||
if(modeled_location.zone)
|
||||
delta_temperature = (air.temperature - modeled_location.zone.air.temperature)
|
||||
sharer_heat_capacity = modeled_location.zone.air.heat_capacity()
|
||||
else
|
||||
delta_temperature = (air.temperature - modeled_location.air.temperature)
|
||||
sharer_heat_capacity = modeled_location.air.heat_capacity()
|
||||
|
||||
// Previously, the temperature would enter equilibrium at 26C or 294K.
|
||||
// Only would happen if both sides (all 2 square meters of surface area) were exposed to sunlight. We now assume it aligned edge on.
|
||||
// It currently should stabilise at 129.6K or -143.6C
|
||||
heat_gain -= surface * STEFAN_BOLTZMANN_CONSTANT * thermal_conductivity * (air.temperature - COSMIC_RADIATION_TEMPERATURE) ** 4
|
||||
var/self_temperature_delta = 0
|
||||
var/sharer_temperature_delta = 0
|
||||
|
||||
air.add_thermal_energy(heat_gain)
|
||||
if(network)
|
||||
network.update = 1
|
||||
if((sharer_heat_capacity>0) && (partial_heat_capacity>0))
|
||||
var/heat = thermal_conductivity*delta_temperature* \
|
||||
(partial_heat_capacity*sharer_heat_capacity/(partial_heat_capacity+sharer_heat_capacity))
|
||||
|
||||
self_temperature_delta = -heat/total_heat_capacity
|
||||
sharer_temperature_delta = heat/sharer_heat_capacity
|
||||
else
|
||||
return 1
|
||||
|
||||
air.temperature += self_temperature_delta
|
||||
|
||||
if(modeled_location.zone)
|
||||
modeled_location.zone.air.temperature += sharer_temperature_delta/modeled_location.zone.air.group_multiplier
|
||||
else
|
||||
modeled_location.air.temperature += sharer_temperature_delta
|
||||
|
||||
|
||||
else
|
||||
if((target.heat_capacity>0) && (partial_heat_capacity>0))
|
||||
var/delta_temperature = air.temperature - target.temperature
|
||||
|
||||
var/heat = thermal_conductivity*delta_temperature* \
|
||||
(partial_heat_capacity*target.heat_capacity/(partial_heat_capacity+target.heat_capacity))
|
||||
|
||||
air.temperature -= heat/total_heat_capacity
|
||||
if(network)
|
||||
network.update = 1
|
||||
|
||||
//surface must be the surface area in m^2
|
||||
/datum/pipeline/proc/radiate_heat_to_space(surface, thermal_conductivity)
|
||||
var/gas_density = air.total_moles/air.volume
|
||||
thermal_conductivity *= min(gas_density / ( RADIATOR_OPTIMUM_PRESSURE/(R_IDEAL_GAS_EQUATION*GAS_CRITICAL_TEMPERATURE) ), 1) //mult by density ratio
|
||||
|
||||
// We only get heat from the star on the exposed surface area.
|
||||
// If the HE pipes gain more energy from AVERAGE_SOLAR_RADIATION than they can radiate, then they have a net heat increase.
|
||||
var/heat_gain = AVERAGE_SOLAR_RADIATION * (RADIATOR_EXPOSED_SURFACE_AREA_RATIO * surface) * thermal_conductivity
|
||||
|
||||
// Previously, the temperature would enter equilibrium at 26C or 294K.
|
||||
// Only would happen if both sides (all 2 square meters of surface area) were exposed to sunlight. We now assume it aligned edge on.
|
||||
// It currently should stabilise at 129.6K or -143.6C
|
||||
heat_gain -= surface * STEFAN_BOLTZMANN_CONSTANT * thermal_conductivity * (air.temperature - COSMIC_RADIATION_TEMPERATURE) ** 4
|
||||
|
||||
air.add_thermal_energy(heat_gain)
|
||||
if(network)
|
||||
network.update = 1
|
||||
|
||||
@@ -54,7 +54,7 @@
|
||||
alpha = 255
|
||||
|
||||
overlays.Cut()
|
||||
overlays += icon_manager.get_atmos_icon("pipe", , pipe_color, "cap")
|
||||
overlays += icon_manager.get_atmos_icon("pipe", , pipe_color, "cap[icon_connect_type]")
|
||||
|
||||
/obj/machinery/atmospherics/pipe/cap/atmos_init()
|
||||
for(var/obj/machinery/atmospherics/target in get_step(src, dir))
|
||||
|
||||
@@ -67,8 +67,22 @@
|
||||
return
|
||||
|
||||
update_icon()
|
||||
handle_leaking()
|
||||
return
|
||||
|
||||
/obj/machinery/atmospherics/pipe/simple/heat_exchanging/set_leaking(var/new_leaking) // They already process, no need for manual processing toggles.
|
||||
if(new_leaking && !leaking)
|
||||
leaking = TRUE
|
||||
if(parent)
|
||||
parent.leaks |= src
|
||||
if(parent.network)
|
||||
parent.network.leaks |= src
|
||||
else if (!new_leaking && leaking)
|
||||
leaking = FALSE
|
||||
if(parent)
|
||||
parent.leaks -= src
|
||||
if(parent.network)
|
||||
parent.network.leaks -= src
|
||||
|
||||
/obj/machinery/atmospherics/pipe/simple/heat_exchanging/process()
|
||||
if(!parent)
|
||||
@@ -180,4 +194,5 @@
|
||||
return
|
||||
|
||||
update_icon()
|
||||
handle_leaking()
|
||||
return
|
||||
|
||||
@@ -0,0 +1,2 @@
|
||||
/obj/machinery/atmospherics/pipe/simple/heat_exchanging/set_leaking(var/new_leaking)
|
||||
return //Nope
|
||||
@@ -68,9 +68,24 @@
|
||||
node3 = null
|
||||
|
||||
update_icon()
|
||||
handle_leaking()
|
||||
|
||||
..()
|
||||
|
||||
/obj/machinery/atmospherics/pipe/manifold/handle_leaking()
|
||||
if(node1 && node2 && node3)
|
||||
set_leaking(FALSE)
|
||||
else
|
||||
set_leaking(TRUE)
|
||||
|
||||
/obj/machinery/atmospherics/pipe/manifold/process()
|
||||
if(!parent)
|
||||
..()
|
||||
else if(leaking)
|
||||
parent.mingle_with_turf(loc, volume)
|
||||
else
|
||||
. = PROCESS_KILL
|
||||
|
||||
/obj/machinery/atmospherics/pipe/manifold/change_color(var/new_color)
|
||||
..()
|
||||
//for updating connected atmos device pipes (i.e. vents, manifolds, etc)
|
||||
@@ -154,6 +169,7 @@
|
||||
var/turf/T = get_turf(src)
|
||||
if(level == 1 && !T.is_plating()) hide(1)
|
||||
update_icon()
|
||||
handle_leaking()
|
||||
|
||||
/obj/machinery/atmospherics/pipe/manifold/visible
|
||||
icon_state = "map"
|
||||
|
||||
@@ -66,9 +66,24 @@
|
||||
node4 = null
|
||||
|
||||
update_icon()
|
||||
handle_leaking()
|
||||
|
||||
..()
|
||||
|
||||
/obj/machinery/atmospherics/pipe/manifold4w/handle_leaking()
|
||||
if(node1 && node2 && node3 && node4)
|
||||
set_leaking(FALSE)
|
||||
else
|
||||
set_leaking(TRUE)
|
||||
|
||||
/obj/machinery/atmospherics/pipe/manifold4w/process()
|
||||
if(!parent)
|
||||
..()
|
||||
else if(leaking)
|
||||
parent.mingle_with_turf(loc, volume)
|
||||
else
|
||||
. = PROCESS_KILL
|
||||
|
||||
/obj/machinery/atmospherics/pipe/manifold4w/change_color(var/new_color)
|
||||
..()
|
||||
//for updating connected atmos device pipes (i.e. vents, manifolds, etc)
|
||||
@@ -156,6 +171,7 @@
|
||||
var/turf/T = get_turf(src)
|
||||
if(level == 1 && !T.is_plating()) hide(1)
|
||||
update_icon()
|
||||
handle_leaking()
|
||||
|
||||
/obj/machinery/atmospherics/pipe/manifold4w/visible
|
||||
icon_state = "map_4way"
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
var/datum/gas_mixture/air_temporary // used when reconstructing a pipeline that broke
|
||||
var/datum/pipeline/parent
|
||||
var/volume = 0
|
||||
var/leaking = FALSE // Do not set directly, use set_leaking(TRUE/FALSE)
|
||||
|
||||
layer = PIPES_LAYER
|
||||
use_power = 0
|
||||
@@ -13,6 +14,7 @@
|
||||
pipe_flags = 0 // Does not have PIPING_DEFAULT_LAYER_ONLY flag.
|
||||
|
||||
var/alert_pressure = 80*ONE_ATMOSPHERE
|
||||
var/in_stasis = FALSE
|
||||
//minimum pressure before check_pressure(...) should be called
|
||||
|
||||
can_buckle = 1
|
||||
@@ -30,6 +32,31 @@
|
||||
/obj/machinery/atmospherics/pipe/hides_under_flooring()
|
||||
return level != 2
|
||||
|
||||
/obj/machinery/atmospherics/pipe/proc/set_leaking(var/new_leaking)
|
||||
if(new_leaking && !leaking)
|
||||
if(!speed_process)
|
||||
START_MACHINE_PROCESSING(src)
|
||||
else
|
||||
START_PROCESSING(SSfastprocess, src)
|
||||
leaking = TRUE
|
||||
if(parent)
|
||||
parent.leaks |= src
|
||||
if(parent.network)
|
||||
parent.network.leaks |= src
|
||||
else if (!new_leaking && leaking)
|
||||
if(!speed_process)
|
||||
STOP_MACHINE_PROCESSING(src)
|
||||
else
|
||||
STOP_PROCESSING(SSfastprocess, src)
|
||||
leaking = FALSE
|
||||
if(parent)
|
||||
parent.leaks -= src
|
||||
if(parent.network)
|
||||
parent.network.leaks -= src
|
||||
|
||||
/obj/machinery/atmospherics/pipe/proc/handle_leaking() // Used specifically to update leaking status on different pipes.
|
||||
return
|
||||
|
||||
/obj/machinery/atmospherics/pipe/proc/pipeline_expansion()
|
||||
return null
|
||||
|
||||
|
||||
@@ -0,0 +1,2 @@
|
||||
/obj/machinery/atmospherics/pipe/set_leaking(var/new_leaking)
|
||||
return // N O P E
|
||||
@@ -1,6 +1,6 @@
|
||||
//
|
||||
// Simple Pipes - Just a tube, maybe bent
|
||||
//
|
||||
//
|
||||
/obj/machinery/atmospherics/pipe/simple
|
||||
icon = 'icons/atmos/pipes.dmi'
|
||||
icon_state = ""
|
||||
@@ -34,6 +34,14 @@
|
||||
icon = null
|
||||
alpha = 255
|
||||
|
||||
/obj/machinery/atmospherics/pipe/simple/process()
|
||||
if(!parent)
|
||||
..()
|
||||
else if(leaking)
|
||||
parent.mingle_with_turf(loc, volume)
|
||||
else
|
||||
. = PROCESS_KILL
|
||||
|
||||
/obj/machinery/atmospherics/pipe/simple/check_pressure(pressure)
|
||||
var/datum/gas_mixture/environment = loc.return_air()
|
||||
|
||||
@@ -147,6 +155,7 @@
|
||||
var/turf/T = loc
|
||||
if(level == 1 && !T.is_plating()) hide(1)
|
||||
update_icon()
|
||||
handle_leaking()
|
||||
|
||||
/obj/machinery/atmospherics/pipe/simple/disconnect(obj/machinery/atmospherics/reference)
|
||||
if(reference == node1)
|
||||
@@ -160,9 +169,16 @@
|
||||
node2 = null
|
||||
|
||||
update_icon()
|
||||
handle_leaking()
|
||||
|
||||
return null
|
||||
|
||||
/obj/machinery/atmospherics/pipe/simple/handle_leaking()
|
||||
if(node1 && node2)
|
||||
set_leaking(FALSE)
|
||||
else
|
||||
set_leaking(TRUE)
|
||||
|
||||
/obj/machinery/atmospherics/pipe/simple/visible
|
||||
icon_state = "intact"
|
||||
level = 2
|
||||
|
||||
@@ -48,7 +48,7 @@
|
||||
construction_type = /obj/item/pipe/binary
|
||||
pipe_state = "universal"
|
||||
|
||||
/obj/machinery/atmospherics/pipe/simple/hidden/universal/update_icon(var/safety = 0)
|
||||
/obj/machinery/atmospherics/pipe/simple/hidden/universal/update_icon(var/safety = 0) // Doesn't leak. It's a special pipe.
|
||||
if(!check_icon_cache())
|
||||
return
|
||||
|
||||
|
||||
@@ -47,6 +47,12 @@ obj/var/contaminated = 0
|
||||
return 0
|
||||
else if(istype(src,/obj/item/weapon/storage/backpack))
|
||||
return 0 //Cannot be washed :(
|
||||
//VOREStation Addition start
|
||||
else if(isbelly(loc))
|
||||
return 0
|
||||
else if(ismob(loc) && isbelly(loc.loc))
|
||||
return 0
|
||||
//VOREStation Addition end
|
||||
else if(istype(src,/obj/item/clothing))
|
||||
return 1
|
||||
|
||||
|
||||
@@ -145,6 +145,7 @@ What is the naming convention for planes or layers?
|
||||
#define LAYER_HUD_ITEM 3 //Things sitting on HUD items (largely irrelevant because PLANE_PLAYER_HUD_ITEMS)
|
||||
#define LAYER_HUD_ABOVE 4 //Things that reside above items (highlights)
|
||||
#define PLANE_PLAYER_HUD_ITEMS 96 //Separate layer with which to apply colorblindness
|
||||
#define PLANE_PLAYER_HUD_ABOVE 97 //Things above the player hud
|
||||
|
||||
#define PLANE_ADMIN3 99 //Purely for shenanigans (above HUD)
|
||||
|
||||
|
||||
@@ -32,6 +32,7 @@
|
||||
#define DM_FLAG_NUMBING 0x1
|
||||
#define DM_FLAG_STRIPPING 0x2
|
||||
#define DM_FLAG_LEAVEREMAINS 0x4
|
||||
#define DM_FLAG_THICKBELLY 0x8
|
||||
|
||||
//Item related modes
|
||||
#define IM_HOLD "Hold"
|
||||
|
||||
@@ -35,6 +35,7 @@
|
||||
#define CE_ALCOHOL_TOXIC "alcotoxic" // Liver damage
|
||||
#define CE_SPEEDBOOST "gofast" // Hyperzine
|
||||
#define CE_SLOWDOWN "goslow" // Slowdown
|
||||
#define CE_ANTACID "nopuke" // Don't puke.
|
||||
|
||||
#define REAGENTS_PER_SHEET 20
|
||||
|
||||
|
||||
@@ -8,6 +8,7 @@
|
||||
#define HALLOSS "halloss"
|
||||
#define ELECTROCUTE "electrocute"
|
||||
#define BIOACID "bioacid"
|
||||
#define SEARING "searing"
|
||||
|
||||
#define CUT "cut"
|
||||
#define BRUISE "bruise"
|
||||
@@ -47,6 +48,7 @@
|
||||
// Damage above this value must be repaired with surgery.
|
||||
#define ROBOLIMB_REPAIR_CAP 30
|
||||
|
||||
#define ORGAN_FLESH 0 // Normal organic organs.
|
||||
#define ORGAN_ASSISTED 1 // Like pacemakers, not robotic
|
||||
#define ORGAN_ROBOT 2 // Fully robotic, no organic parts
|
||||
#define ORGAN_LIFELIKE 3 // Robotic, made to appear organic
|
||||
|
||||
@@ -38,6 +38,7 @@ GLOBAL_LIST_INIT(bitflags, list(1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 204
|
||||
#define NOSLIP (1<<2) // Prevents from slipping on wet floors, in space, etc.
|
||||
#define BLOCK_GAS_SMOKE_EFFECT (1<<3) // Blocks the effect that chemical clouds would have on a mob -- glasses, mask and helmets ONLY! (NOTE: flag shared with ONESIZEFITSALL)
|
||||
#define FLEXIBLEMATERIAL (1<<4) // At the moment, masks with this flag will not prevent eating even if they are covering your face.
|
||||
#define ALLOW_SURVIVALFOOD (1<<5) // Allows special survival food items to be eaten through it
|
||||
|
||||
// Flags for pass_flags. - Used in /atom/var/pass_flags
|
||||
#define PASSTABLE (1<<0)
|
||||
|
||||
@@ -16,6 +16,8 @@
|
||||
|
||||
#define LIGHTING_SOFT_THRESHOLD 0.05 // If the max of the lighting lumcounts of each spectrum drops below this, disable luminosity on the lighting overlays. This also should be the transparancy of the "soft_dark" icon state.
|
||||
|
||||
#define LIGHTING_MULT_FACTOR 0.5
|
||||
|
||||
// If I were you I'd leave this alone.
|
||||
#define LIGHTING_BASE_MATRIX \
|
||||
list \
|
||||
@@ -77,7 +79,7 @@
|
||||
//Lighting values used by the station lights
|
||||
#define LIGHT_COLOR_FLUORESCENT_TUBE "#E0EFFF"
|
||||
#define LIGHT_COLOR_FLUORESCENT_FLASHLIGHT "#CDDDFF"
|
||||
#define LIGHT_COLOR_INCANDESCENT_TUBE "#FFEEDD"
|
||||
#define LIGHT_COLOR_INCANDESCENT_TUBE "#FFFEB8"
|
||||
#define LIGHT_COLOR_INCANDESCENT_BULB "#FFDDBB"
|
||||
#define LIGHT_COLOR_INCANDESCENT_FLASHLIGHT "#FFCC66"
|
||||
|
||||
|
||||
@@ -0,0 +1,2 @@
|
||||
#define LIGHT_COLOR_INCANDESCENT_TUBE "#E0EFF0"
|
||||
#define LIGHT_COLOR_INCANDESCENT_BULB "#FFFEB8"
|
||||
@@ -34,6 +34,7 @@ var/global/defer_powernet_rebuild = 0 // True if net rebuild will be called
|
||||
#define NETWORK_CRESCENT "Spaceport"
|
||||
// #define NETWORK_CAFE_DOCK "Cafe Dock"
|
||||
#define NETWORK_CARGO "Cargo"
|
||||
#define NETWORK_CIRCUITS "Circuits"
|
||||
#define NETWORK_CIVILIAN "Civilian"
|
||||
// #define NETWORK_CIVILIAN_EAST "Civilian East"
|
||||
// #define NETWORK_CIVILIAN_WEST "Civilian West"
|
||||
@@ -54,8 +55,11 @@ var/global/defer_powernet_rebuild = 0 // True if net rebuild will be called
|
||||
#define NETWORK_SECURITY "Security"
|
||||
#define NETWORK_INTERROGATION "Interrogation"
|
||||
#define NETWORK_TELECOM "Tcomms"
|
||||
#define NETWORK_THUNDER "Thunderdome"
|
||||
#define NETWORK_THUNDER "Entertainment" //VOREStation Edit: broader definition
|
||||
#define NETWORK_COMMUNICATORS "Communicators"
|
||||
#define NETWORK_ALARM_ATMOS "Atmosphere Alarms"
|
||||
#define NETWORK_ALARM_POWER "Power Alarms"
|
||||
#define NETWORK_ALARM_FIRE "Fire Alarms"
|
||||
|
||||
// Those networks can only be accessed by pre-existing terminals. AIs and new terminals can't use them.
|
||||
var/list/restricted_camera_networks = list(NETWORK_ERT,NETWORK_MERCENARY,"Secret", NETWORK_COMMUNICATORS)
|
||||
@@ -69,14 +73,6 @@ var/list/restricted_camera_networks = list(NETWORK_ERT,NETWORK_MERCENARY,"Secret
|
||||
#define STAGE_FIVE 9
|
||||
#define STAGE_SUPER 11
|
||||
|
||||
// computer3 error codes, move lower in the file when it passes dev -Sayu
|
||||
#define PROG_CRASH 0x1 // Generic crash.
|
||||
#define MISSING_PERIPHERAL 0x2 // Missing hardware.
|
||||
#define BUSTED_ASS_COMPUTER 0x4 // Self-perpetuating error. BAC will continue to crash forever.
|
||||
#define MISSING_PROGRAM 0x8 // Some files try to automatically launch a program. This is that failing.
|
||||
#define FILE_DRM 0x10 // Some files want to not be copied/moved. This is them complaining that you tried.
|
||||
#define NETWORK_FAILURE 0x20
|
||||
|
||||
// NanoUI flags
|
||||
#define STATUS_INTERACTIVE 2 // GREEN Visability
|
||||
#define STATUS_UPDATE 1 // ORANGE Visability
|
||||
@@ -106,6 +102,16 @@ var/list/restricted_camera_networks = list(NETWORK_ERT,NETWORK_MERCENARY,"Secret
|
||||
#define ATMOS_DEFAULT_VOLUME_MIXER 200 // L.
|
||||
#define ATMOS_DEFAULT_VOLUME_PIPE 70 // L.
|
||||
|
||||
// These are used by supermatter and supermatter monitor program, mostly for UI updating purposes. Higher should always be worse!
|
||||
#define SUPERMATTER_ERROR -1 // Unknown status, shouldn't happen but just in case.
|
||||
#define SUPERMATTER_INACTIVE 0 // No or minimal energy
|
||||
#define SUPERMATTER_NORMAL 1 // Normal operation
|
||||
#define SUPERMATTER_NOTIFY 2 // Ambient temp > 80% of CRITICAL_TEMPERATURE
|
||||
#define SUPERMATTER_WARNING 3 // Ambient temp > CRITICAL_TEMPERATURE OR integrity damaged
|
||||
#define SUPERMATTER_DANGER 4 // Integrity < 50%
|
||||
#define SUPERMATTER_EMERGENCY 5 // Integrity < 25%
|
||||
#define SUPERMATTER_DELAMINATING 6 // Pretty obvious.
|
||||
|
||||
//wIP - PORT ALL OF THESE TO SUBSYSTEMS AND GET RID OF THE WHOLE LIST PROCESS THING
|
||||
// Fancy-pants START/STOP_PROCESSING() macros that lets us custom define what the list is.
|
||||
#define START_PROCESSING_IN_LIST(DATUM, LIST) \
|
||||
|
||||
@@ -9,4 +9,4 @@
|
||||
#define MAP_LEVEL_XENOARCH_EXEMPT 0x080 // Z-levels exempt from xenoarch digsite generation.
|
||||
|
||||
// Misc map defines.
|
||||
#define SUBMAP_MAP_EDGE_PAD 15 // Automatically created submaps are forbidden from being this close to the main map's edge.
|
||||
#define SUBMAP_MAP_EDGE_PAD 8 // Automatically created submaps are forbidden from being this close to the main map's edge. //VOREStation Edit
|
||||
+39
-3
@@ -113,6 +113,7 @@
|
||||
#define MAX_RECORD_LENGTH 24576
|
||||
#define MAX_LNAME_LEN 64
|
||||
#define MAX_NAME_LEN 52
|
||||
#define MAX_TEXTFILE_LENGTH 128000 // 512GQ file
|
||||
|
||||
// Event defines.
|
||||
#define EVENT_LEVEL_MUNDANE 1
|
||||
@@ -174,6 +175,7 @@
|
||||
#define MAT_LEAD "lead"
|
||||
#define MAT_SUPERMATTER "supermatter"
|
||||
#define MAT_METALHYDROGEN "mhydrogen"
|
||||
#define MAT_OSMIUM "osmium"
|
||||
|
||||
#define SHARD_SHARD "shard"
|
||||
#define SHARD_SHRAPNEL "shrapnel"
|
||||
@@ -191,6 +193,33 @@
|
||||
#define BOMBCAP_HEAVY_RADIUS (max_explosion_range/2)
|
||||
#define BOMBCAP_LIGHT_RADIUS max_explosion_range
|
||||
#define BOMBCAP_FLASH_RADIUS (max_explosion_range*1.5)
|
||||
// NTNet module-configuration values. Do not change these. If you need to add another use larger number (5..6..7 etc)
|
||||
#define NTNET_SOFTWAREDOWNLOAD 1 // Downloads of software from NTNet
|
||||
#define NTNET_PEERTOPEER 2 // P2P transfers of files between devices
|
||||
#define NTNET_COMMUNICATION 3 // Communication (messaging)
|
||||
#define NTNET_SYSTEMCONTROL 4 // Control of various systems, RCon, air alarm control, etc.
|
||||
|
||||
// NTNet transfer speeds, used when downloading/uploading a file/program.
|
||||
#define NTNETSPEED_LOWSIGNAL 0.25 // GQ/s transfer speed when the device is wirelessly connected and on Low signal
|
||||
#define NTNETSPEED_HIGHSIGNAL 0.5 // GQ/s transfer speed when the device is wirelessly connected and on High signal
|
||||
#define NTNETSPEED_ETHERNET 1.0 // GQ/s transfer speed when the device is using wired connection
|
||||
#define NTNETSPEED_DOS_AMPLIFICATION 5 // Multiplier for Denial of Service program. Resulting load on NTNet relay is this multiplied by NTNETSPEED of the device
|
||||
|
||||
// Program bitflags
|
||||
#define PROGRAM_ALL 15
|
||||
#define PROGRAM_CONSOLE 1
|
||||
#define PROGRAM_LAPTOP 2
|
||||
#define PROGRAM_TABLET 4
|
||||
#define PROGRAM_TELESCREEN 8
|
||||
|
||||
#define PROGRAM_STATE_KILLED 0
|
||||
#define PROGRAM_STATE_BACKGROUND 1
|
||||
#define PROGRAM_STATE_ACTIVE 2
|
||||
|
||||
// Caps for NTNet logging. Less than 10 would make logging useless anyway, more than 500 may make the log browser too laggy. Defaults to 100 unless user changes it.
|
||||
#define MAX_NTNET_LOGS 500
|
||||
#define MIN_NTNET_LOGS 10
|
||||
|
||||
|
||||
// Special return values from bullet_act(). Positive return values are already used to indicate the blocked level of the projectile.
|
||||
#define PROJECTILE_CONTINUE -1 //if the projectile should continue flying after calling bullet_act()
|
||||
@@ -319,7 +348,14 @@ var/global/list/##LIST_NAME = list();\
|
||||
#define RCD_MAX_CAPACITY 30 * RCD_SHEETS_PER_MATTER_UNIT
|
||||
|
||||
// Radiation 'levels'. Used for the geiger counter, for visuals and sound. They are in different files so this goes here.
|
||||
#define RAD_LEVEL_LOW 0.01 // Around the level at which radiation starts to become harmful
|
||||
#define RAD_LEVEL_MODERATE 10
|
||||
#define RAD_LEVEL_LOW 0.5 // Around the level at which radiation starts to become harmful
|
||||
#define RAD_LEVEL_MODERATE 5
|
||||
#define RAD_LEVEL_HIGH 25
|
||||
#define RAD_LEVEL_VERY_HIGH 50
|
||||
#define RAD_LEVEL_VERY_HIGH 75
|
||||
|
||||
#define RADIATION_THRESHOLD_CUTOFF 0.1 // Radiation will not affect a tile when below this value.
|
||||
|
||||
//https://secure.byond.com/docs/ref/info.html#/atom/var/mouse_opacity
|
||||
#define MOUSE_OPACITY_TRANSPARENT 0
|
||||
#define MOUSE_OPACITY_ICON 1
|
||||
#define MOUSE_OPACITY_OPAQUE 2
|
||||
|
||||
+23
-2
@@ -194,7 +194,24 @@
|
||||
#define O_KIDNEYS "kidneys"
|
||||
#define O_APPENDIX "appendix"
|
||||
#define O_VOICE "voicebox"
|
||||
#define O_STANDARD list(O_EYES, O_HEART, O_LUNGS, O_BRAIN, O_LIVER, O_KIDNEYS, O_APPENDIX, O_VOICE)
|
||||
#define O_SPLEEN "spleen"
|
||||
#define O_STOMACH "stomach"
|
||||
#define O_INTESTINE "intestine"
|
||||
#define O_STANDARD list(O_EYES, O_HEART, O_LUNGS, O_BRAIN, O_LIVER, O_KIDNEYS, O_SPLEEN, O_APPENDIX, O_VOICE, O_STOMACH, O_INTESTINE)
|
||||
|
||||
// Augments
|
||||
#define O_AUG_EYES "occular augment"
|
||||
|
||||
#define O_AUG_L_FOREARM "left forearm augment"
|
||||
#define O_AUG_R_FOREARM "right forearm augment"
|
||||
#define O_AUG_L_UPPERARM "left upperarm augment"
|
||||
#define O_AUG_R_UPPERARM "right upperarm augment"
|
||||
#define O_AUG_L_HAND "left hand augment"
|
||||
#define O_AUG_R_HAND "right hand augment"
|
||||
|
||||
#define O_AUG_RIBS "rib augment"
|
||||
#define O_AUG_SPINE "spinal augment"
|
||||
#define O_AUG_PELVIC "pelvic augment"
|
||||
|
||||
// Non-Standard organs
|
||||
#define O_MOUTH "mouth"
|
||||
@@ -207,13 +224,17 @@
|
||||
#define O_GBLADDER "gas bladder"
|
||||
#define O_POLYP "polyp segment"
|
||||
#define O_ANCHOR "anchoring ligament"
|
||||
#define O_REGBRUTE "pneumoregenitor"
|
||||
#define O_REGBURN "thermoregenitor"
|
||||
#define O_REGOXY "respiroregenitor"
|
||||
#define O_REGTOX "toxoregenitor"
|
||||
#define O_ACID "acid gland"
|
||||
#define O_EGG "egg sac"
|
||||
#define O_RESIN "resin spinner"
|
||||
#define O_AREJECT "immune hub"
|
||||
#define O_VENTC "morphoplastic node"
|
||||
#define O_VRLINK "virtual node"
|
||||
#define O_ALL list(O_STANDARD, O_MOUTH, O_CELL, O_PLASMA, O_HIVE, O_NUTRIENT, O_STRATA, O_RESPONSE, O_GBLADDER, O_POLYP, O_ANCHOR, O_ACID, O_EGG, O_RESIN, O_AREJECT, O_VENTC, O_VRLINK)
|
||||
#define O_ALL list(O_STANDARD, O_MOUTH, O_CELL, O_PLASMA, O_HIVE, O_NUTRIENT, O_STRATA, O_RESPONSE, O_GBLADDER, O_POLYP, O_ANCHOR, O_REGBRUTE, O_REGBURN, O_REGOXY, O_REGTOX, O_ACID, O_EGG, O_RESIN, O_AREJECT, O_VENTC, O_VRLINK)
|
||||
|
||||
// External organs, aka limbs
|
||||
#define BP_L_FOOT "l_foot"
|
||||
|
||||
@@ -36,10 +36,12 @@
|
||||
#define SPECIES_MONKEY_SERGAL "Saru"
|
||||
#define SPECIES_MONKEY_VULPKANIN "Wolpin"
|
||||
|
||||
#define SPECIES_WEREBEAST "Werebeast"
|
||||
#define SPECIES_SHADEKIN "Shadekin"
|
||||
#define SPECIES_SHADEKIN_BLUE "Blue-eyed Shadekin"
|
||||
#define SPECIES_SHADEKIN_RED "Red-eyed Shadekin"
|
||||
#define SPECIES_SHADEKIN_YELLOW "Yellow-eyed Shadekin"
|
||||
#define SPECIES_SHADEKIN_PURPLE "Purple-eyed Shadekin"
|
||||
#define SPECIES_SHADEKIN_ORANGE "Orange-eyed Shadekin"
|
||||
#define SPECIES_SHADEKIN_GREEN "Green-eyed Shadekin"
|
||||
#define SPECIES_SHADEKIN_GREEN "Green-eyed Shadekin"
|
||||
#define SPECIES_WEREBEAST "Werebeast"
|
||||
|
||||
@@ -8,11 +8,12 @@
|
||||
#define CHANNEL_AMBIENCE 1018
|
||||
#define CHANNEL_BUZZ 1017
|
||||
#define CHANNEL_BICYCLE 1016
|
||||
#define CHANNEL_PREYLOOP 1015 //VORESTATION ADD - Fancy Sound Loop channel
|
||||
|
||||
//THIS SHOULD ALWAYS BE THE LOWEST ONE!
|
||||
//KEEP IT UPDATED
|
||||
|
||||
#define CHANNEL_HIGHEST_AVAILABLE 1015
|
||||
#define CHANNEL_HIGHEST_AVAILABLE 1014 //VORESTATION EDIT - Fancy Sound Loop channel from 1015
|
||||
|
||||
#define SOUND_MINIMUM_PRESSURE 10
|
||||
#define FALLOFF_SOUNDS 0.5
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
#define SPECIES_WHITELIST_SELECTABLE 0x20 // Can select and customize, but not join as
|
||||
|
||||
#define LANGUAGE_SLAVIC "Pan-Slavic"
|
||||
#define LANGUAGE_BIRDSONG "Birdsong"
|
||||
#define LANGUAGE_SAGARU "Sagaru"
|
||||
#define LANGUAGE_CANILUNZT "Canilunzt"
|
||||
|
||||
@@ -78,6 +78,7 @@ var/global/list/runlevel_flags = list(RUNLEVEL_LOBBY, RUNLEVEL_SETUP, RUNLEVEL_G
|
||||
#define FIRE_PRIORITY_VOTE 9
|
||||
#define FIRE_PRIORITY_AI 10
|
||||
#define FIRE_PRIORITY_GARBAGE 15
|
||||
#define FIRE_PRIORITY_CHARSETUP 25
|
||||
#define FIRE_PRIORITY_AIRFLOW 30
|
||||
#define FIRE_PRIORITY_AIR 35
|
||||
#define FIRE_PRIORITY_OBJ 40
|
||||
|
||||
@@ -36,7 +36,8 @@
|
||||
#define ARCHAEO_ALIEN_ITEM 36
|
||||
#define ARCHAEO_ALIEN_BOAT 37
|
||||
#define ARCHAEO_IMPERION_CIRCUIT 38
|
||||
#define MAX_ARCHAEO 38
|
||||
#define ARCHAEO_TELECUBE 39
|
||||
#define MAX_ARCHAEO 39
|
||||
|
||||
#define DIGSITE_GARDEN 1
|
||||
#define DIGSITE_ANIMAL 2
|
||||
|
||||
@@ -5,3 +5,4 @@ GLOBAL_LIST_EMPTY(stealthminID)
|
||||
GLOBAL_LIST_EMPTY(directory) //all ckeys with associated client
|
||||
GLOBAL_LIST_EMPTY(clients)
|
||||
GLOBAL_LIST_EMPTY(players_by_zlevel)
|
||||
GLOBAL_LIST_EMPTY(round_text_log)
|
||||
|
||||
@@ -756,3 +756,10 @@ proc/dd_sortedTextList(list/incoming)
|
||||
. = list()
|
||||
for(var/i in L)
|
||||
. |= i
|
||||
|
||||
#define listequal(A, B) (A.len == B.len && !length(A^B))
|
||||
|
||||
/proc/popleft(list/L)
|
||||
if(L.len)
|
||||
. = L[1]
|
||||
L.Cut(1,2)
|
||||
|
||||
@@ -0,0 +1,43 @@
|
||||
/proc/get_turf_pixel(atom/movable/AM)
|
||||
if(!istype(AM))
|
||||
return
|
||||
|
||||
//Find AM's matrix so we can use it's X/Y pixel shifts
|
||||
var/matrix/M = matrix(AM.transform)
|
||||
|
||||
var/pixel_x_offset = AM.pixel_x + M.get_x_shift()
|
||||
var/pixel_y_offset = AM.pixel_y + M.get_y_shift()
|
||||
|
||||
//Irregular objects
|
||||
if(AM.bound_height != world.icon_size || AM.bound_width != world.icon_size)
|
||||
var/icon/AMicon = icon(AM.icon, AM.icon_state)
|
||||
pixel_x_offset += ((AMicon.Width()/world.icon_size)-1)*(world.icon_size*0.5)
|
||||
pixel_y_offset += ((AMicon.Height()/world.icon_size)-1)*(world.icon_size*0.5)
|
||||
qdel(AMicon)
|
||||
|
||||
//DY and DX
|
||||
var/rough_x = round(round(pixel_x_offset,world.icon_size)/world.icon_size)
|
||||
var/rough_y = round(round(pixel_y_offset,world.icon_size)/world.icon_size)
|
||||
|
||||
//Find coordinates
|
||||
var/turf/T = get_turf(AM) //use AM's turfs, as it's coords are the same as AM's AND AM's coords are lost if it is inside another atom
|
||||
var/final_x = T.x + rough_x
|
||||
var/final_y = T.y + rough_y
|
||||
|
||||
if(final_x || final_y)
|
||||
return locate(final_x, final_y, T.z)
|
||||
|
||||
// Walks up the loc tree until it finds a holder of the given holder_type
|
||||
/proc/get_holder_of_type(atom/A, holder_type)
|
||||
if(!istype(A)) return
|
||||
for(A, A && !istype(A, holder_type), A=A.loc);
|
||||
return A
|
||||
|
||||
/atom/movable/proc/throw_at_random(var/include_own_turf, var/maxrange, var/speed)
|
||||
var/list/turfs = trange(maxrange, src)
|
||||
if(!maxrange)
|
||||
maxrange = 1
|
||||
|
||||
if(!include_own_turf)
|
||||
turfs -= get_turf(src)
|
||||
src.throw_at(pick(turfs), maxrange, speed, src)
|
||||
@@ -11,6 +11,8 @@ var/global/list/positive_traits = list() // Positive custom species traits, inde
|
||||
var/global/list/traits_costs = list() // Just path = cost list, saves time in char setup
|
||||
var/global/list/all_traits = list() // All of 'em at once (same instances)
|
||||
|
||||
var/global/list/sensorpreflist = list("Off", "Binary", "Vitals", "Tracking", "No Preference") //TFF 5/8/19 - Suit Sensors global list
|
||||
|
||||
var/global/list/custom_species_bases = list() // Species that can be used for a Custom Species icon base
|
||||
|
||||
//stores numeric player size options indexed by name
|
||||
@@ -40,40 +42,8 @@ var/global/list/item_vore_blacklist = list(
|
||||
/obj/item/weapon/disk/nuclear,
|
||||
/obj/item/clothing/suit/storage/hooded/wintercoat/roiz)
|
||||
|
||||
var/global/list/digestion_sounds = list(
|
||||
'sound/vore/digest1.ogg',
|
||||
'sound/vore/digest2.ogg',
|
||||
'sound/vore/digest3.ogg',
|
||||
'sound/vore/digest4.ogg',
|
||||
'sound/vore/digest5.ogg',
|
||||
'sound/vore/digest6.ogg',
|
||||
'sound/vore/digest7.ogg',
|
||||
'sound/vore/digest8.ogg',
|
||||
'sound/vore/digest9.ogg',
|
||||
'sound/vore/digest10.ogg',
|
||||
'sound/vore/digest11.ogg',
|
||||
'sound/vore/digest12.ogg')
|
||||
|
||||
var/global/list/death_sounds = list(
|
||||
'sound/vore/death1.ogg',
|
||||
'sound/vore/death2.ogg',
|
||||
'sound/vore/death3.ogg',
|
||||
'sound/vore/death4.ogg',
|
||||
'sound/vore/death5.ogg',
|
||||
'sound/vore/death6.ogg',
|
||||
'sound/vore/death7.ogg',
|
||||
'sound/vore/death8.ogg',
|
||||
'sound/vore/death9.ogg',
|
||||
'sound/vore/death10.ogg')
|
||||
|
||||
var/global/list/hunger_sounds = list(
|
||||
'sound/vore/growl1.ogg',
|
||||
'sound/vore/growl2.ogg',
|
||||
'sound/vore/growl3.ogg',
|
||||
'sound/vore/growl4.ogg',
|
||||
'sound/vore/growl5.ogg')
|
||||
|
||||
var/global/list/vore_sounds = list(
|
||||
//Classic Vore sounds
|
||||
var/global/list/classic_vore_sounds = list(
|
||||
"Gulp" = 'sound/vore/gulp.ogg',
|
||||
"Insert" = 'sound/vore/insert.ogg',
|
||||
"Insertion1" = 'sound/vore/insertion1.ogg',
|
||||
@@ -84,15 +54,55 @@ var/global/list/vore_sounds = list(
|
||||
"Squish2" = 'sound/vore/squish2.ogg',
|
||||
"Squish3" = 'sound/vore/squish3.ogg',
|
||||
"Squish4" = 'sound/vore/squish4.ogg',
|
||||
"Rustle (cloth)" = 'sound/effects/rustle5.ogg',
|
||||
"Rustle (cloth)" = 'sound/effects/rustle1.ogg',
|
||||
"Rustle 2 (cloth)" = 'sound/effects/rustle2.ogg',
|
||||
"Rustle 3 (cloth)" = 'sound/effects/rustle3.ogg',
|
||||
"Rustle 4 (cloth)" = 'sound/effects/rustle4.ogg',
|
||||
"Rustle 5 (cloth)" = 'sound/effects/rustle5.ogg',
|
||||
"None" = null)
|
||||
|
||||
var/global/list/struggle_sounds = list(
|
||||
"Squish1" = 'sound/vore/squish1.ogg',
|
||||
"Squish2" = 'sound/vore/squish2.ogg',
|
||||
"Squish3" = 'sound/vore/squish3.ogg',
|
||||
"Squish4" = 'sound/vore/squish4.ogg')
|
||||
var/global/list/classic_release_sounds = list(
|
||||
"Rustle (cloth)" = 'sound/effects/rustle1.ogg',
|
||||
"Rustle 2 (cloth)" = 'sound/effects/rustle2.ogg',
|
||||
"Rustle 3 (cloth)" = 'sound/effects/rustle3.ogg',
|
||||
"Rustle 4 (cloth)" = 'sound/effects/rustle4.ogg',
|
||||
"Rustle 5 (cloth)" = 'sound/effects/rustle5.ogg',
|
||||
"Splatter" = 'sound/effects/splat.ogg',
|
||||
"None" = null
|
||||
)
|
||||
|
||||
//Poojy's Fancy Sounds
|
||||
var/global/list/fancy_vore_sounds = list(
|
||||
"Gulp" = 'sound/vore/sunesound/pred/swallow_01.ogg',
|
||||
"Swallow" = 'sound/vore/sunesound/pred/swallow_02.ogg',
|
||||
"Insertion1" = 'sound/vore/sunesound/pred/insertion_01.ogg',
|
||||
"Insertion2" = 'sound/vore/sunesound/pred/insertion_02.ogg',
|
||||
"Tauric Swallow" = 'sound/vore/sunesound/pred/taurswallow.ogg',
|
||||
"Stomach Move" = 'sound/vore/sunesound/pred/stomachmove.ogg',
|
||||
"Schlorp" = 'sound/vore/sunesound/pred/schlorp.ogg',
|
||||
"Squish1" = 'sound/vore/sunesound/pred/squish_01.ogg',
|
||||
"Squish2" = 'sound/vore/sunesound/pred/squish_02.ogg',
|
||||
"Squish3" = 'sound/vore/sunesound/pred/squish_03.ogg',
|
||||
"Squish4" = 'sound/vore/sunesound/pred/squish_04.ogg',
|
||||
"Rustle (cloth)" = 'sound/effects/rustle1.ogg',
|
||||
"Rustle 2 (cloth)" = 'sound/effects/rustle2.ogg',
|
||||
"Rustle 3 (cloth)" = 'sound/effects/rustle3.ogg',
|
||||
"Rustle 4 (cloth)" = 'sound/effects/rustle4.ogg',
|
||||
"Rustle 5 (cloth)" = 'sound/effects/rustle5.ogg',
|
||||
"None" = null
|
||||
)
|
||||
|
||||
var/global/list/fancy_release_sounds = list(
|
||||
"Rustle (cloth)" = 'sound/effects/rustle1.ogg',
|
||||
"Rustle 2 (cloth)" = 'sound/effects/rustle2.ogg',
|
||||
"Rustle 3 (cloth)" = 'sound/effects/rustle3.ogg',
|
||||
"Rustle 4 (cloth)" = 'sound/effects/rustle4.ogg',
|
||||
"Rustle 5 (cloth)" = 'sound/effects/rustle5.ogg',
|
||||
"Stomach Move" = 'sound/vore/sunesound/pred/stomachmove.ogg',
|
||||
"Pred Escape" = 'sound/vore/sunesound/pred/escape.ogg',
|
||||
"Splatter" = 'sound/effects/splat.ogg',
|
||||
"None" = null
|
||||
)
|
||||
|
||||
var/global/list/global_vore_egg_types = list(
|
||||
"Unathi" = UNATHI_EGG,
|
||||
@@ -121,6 +131,8 @@ var/global/list/tf_vore_egg_types = list(
|
||||
"Xenomorph" = /obj/structure/closet/secure_closet/egg/xenomorph)
|
||||
|
||||
var/global/list/edible_trash = list(/obj/item/broken_device,
|
||||
/obj/item/clothing/accessory/collar, //TFF 10/7/19 - add option to nom collars,
|
||||
/obj/item/device/communicator, //TFF 19/9/19 - add option to nom communicators and commwatches,
|
||||
/obj/item/clothing/mask,
|
||||
/obj/item/clothing/glasses,
|
||||
/obj/item/clothing/gloves,
|
||||
|
||||
@@ -42,4 +42,18 @@
|
||||
for(var/x_pixel = 1 to I.Width())
|
||||
if (I.GetPixel(x_pixel, y_pixel))
|
||||
return y_pixel - 1
|
||||
return null
|
||||
return null
|
||||
|
||||
//Standard behaviour is to cut pixels from the main icon that are covered by pixels from the mask icon unless passed mask_ready, see below.
|
||||
/proc/get_icon_difference(var/icon/main, var/icon/mask, var/mask_ready)
|
||||
/*You should skip prep if the mask is already sprited properly. This significantly improves performance by eliminating most of the realtime icon work.
|
||||
e.g. A 'ready' mask is a mask where the part you want cut out is missing (no pixels, 0 alpha) from the sprite, and everything else is solid white.*/
|
||||
|
||||
if(istype(main) && istype(mask))
|
||||
if(!mask_ready) //Prep the mask if we're using a regular old sprite and not a special-made mask.
|
||||
mask.Blend(rgb(255,255,255), ICON_SUBTRACT) //Make all pixels on the mask as black as possible.
|
||||
mask.Opaque(rgb(255,255,255)) //Make the transparent pixels (background) white.
|
||||
mask.BecomeAlphaMask() //Make all the black pixels vanish (fully transparent), leaving only the white background pixels.
|
||||
|
||||
main.AddAlphaMask(mask) //Make the pixels in the main icon that are in the transparent zone of the mask icon also vanish (fully transparent).
|
||||
return main
|
||||
|
||||
@@ -61,8 +61,8 @@
|
||||
|
||||
/proc/log_access_in(client/new_client)
|
||||
if (config.log_access)
|
||||
var/message = "[key_name(new_client)] - IP:[new_client.address] - CID:[new_client.computer_id] - BYOND v[new_client.byond_version]"
|
||||
WRITE_LOG(diary, "ACCESS IN: [message]")
|
||||
var/message = "[key_name(new_client)] - IP:[new_client.address] - CID:[new_client.computer_id] - BYOND v[new_client.byond_version]"
|
||||
WRITE_LOG(diary, "ACCESS IN: [message]") //VOREStation Edit
|
||||
|
||||
/proc/log_access_out(mob/last_mob)
|
||||
if (config.log_access)
|
||||
@@ -73,26 +73,46 @@
|
||||
if (config.log_say)
|
||||
WRITE_LOG(diary, "SAY: [speaker.simple_info_line()]: [html_decode(text)]")
|
||||
|
||||
//Log the message to in-game dialogue logs, as well.
|
||||
if(speaker.client)
|
||||
speaker.dialogue_log += "<b>([time_stamp()])</b> (<b>[speaker]/[speaker.client]</b>) <u>SAY:</u> - <span style=\"color:#32cd32\">[text]</span>"
|
||||
GLOB.round_text_log += "<b>([time_stamp()])</b> (<b>[speaker]/[speaker.client]</b>) <u>SAY:</u> - <span style=\"color:#32cd32\">[text]</span>"
|
||||
|
||||
/proc/log_ooc(text, client/user)
|
||||
if (config.log_ooc)
|
||||
WRITE_LOG(diary, "OOC: [user.simple_info_line()]: [html_decode(text)]")
|
||||
|
||||
GLOB.round_text_log += "<b>([time_stamp()])</b> (<b>[user]</b>) <u>OOC:</u> - <span style=\"color:blue\"><b>[text]</b></span>"
|
||||
|
||||
/proc/log_aooc(text, client/user)
|
||||
if (config.log_ooc)
|
||||
WRITE_LOG(diary, "AOOC: [user.simple_info_line()]: [html_decode(text)]")
|
||||
|
||||
GLOB.round_text_log += "<b>([time_stamp()])</b> (<b>[user]</b>) <u>AOOC:</u> - <span style=\"color:red\"><b>[text]</b></span>"
|
||||
|
||||
/proc/log_looc(text, client/user)
|
||||
if (config.log_ooc)
|
||||
WRITE_LOG(diary, "LOOC: [user.simple_info_line()]: [html_decode(text)]")
|
||||
|
||||
GLOB.round_text_log += "<b>([time_stamp()])</b> (<b>[user]</b>) <u>LOOC:</u> - <span style=\"color:orange\"><b>[text]</b></span>"
|
||||
|
||||
/proc/log_whisper(text, mob/speaker)
|
||||
if (config.log_whisper)
|
||||
WRITE_LOG(diary, "WHISPER: [speaker.simple_info_line()]: [html_decode(text)]")
|
||||
|
||||
if(speaker.client)
|
||||
speaker.dialogue_log += "<b>([time_stamp()])</b> (<b>[speaker]/[speaker.client]</b>) <u>SAY:</u> - <span style=\"color:gray\"><i>[text]</i></span>"
|
||||
GLOB.round_text_log += "<b>([time_stamp()])</b> (<b>[speaker]/[speaker.client]</b>) <u>SAY:</u> - <span style=\"color:gray\"><i>[text]</i></span>"
|
||||
|
||||
|
||||
/proc/log_emote(text, mob/speaker)
|
||||
if (config.log_emote)
|
||||
WRITE_LOG(diary, "EMOTE: [speaker.simple_info_line()]: [html_decode(text)]")
|
||||
|
||||
if(speaker.client)
|
||||
speaker.dialogue_log += "<b>([time_stamp()])</b> (<b>[speaker]/[speaker.client]</b>) <u>EMOTE:</u> - <span style=\"color:#CCBADC\">[text]</span>"
|
||||
GLOB.round_text_log += "<b>([time_stamp()])</b> (<b>[speaker]/[speaker.client]</b>) <u>EMOTE:</u> - <span style=\"color:#CCBADC\">[text]</span>"
|
||||
|
||||
/proc/log_attack(attacker, defender, message)
|
||||
if (config.log_attack)
|
||||
WRITE_LOG(diary, "ATTACK: [attacker] against [defender]: [message]")
|
||||
@@ -113,6 +133,10 @@
|
||||
if (config.log_say)
|
||||
WRITE_LOG(diary, "DEADCHAT: [speaker.simple_info_line()]: [html_decode(text)]")
|
||||
|
||||
speaker.dialogue_log += "<b>([time_stamp()])</b> (<b>[speaker]/[speaker.client]</b>) <u>DEADSAY:</u> - <span style=\"color:green\">[text]</span>"
|
||||
GLOB.round_text_log += "<font size=1><span style=\"color:#7e668c\"><b>([time_stamp()])</b> (<b>[src]/[speaker.client]</b>) <u>DEADSAY:</u> - [text]</span></font>"
|
||||
|
||||
|
||||
/proc/log_ghostemote(text, mob/speaker)
|
||||
if (config.log_emote)
|
||||
WRITE_LOG(diary, "DEADEMOTE: [speaker.simple_info_line()]: [html_decode(text)]")
|
||||
@@ -125,6 +149,10 @@
|
||||
if (config.log_pda)
|
||||
WRITE_LOG(diary, "PDA: [speaker.simple_info_line()]: [html_decode(text)]")
|
||||
|
||||
speaker.dialogue_log += "<b>([time_stamp()])</b> (<b>[speaker]/[speaker.client]</b>) <u>MSG:</u> - <span style=\"color:[COLOR_GREEN]\">[text]</span>"
|
||||
GLOB.round_text_log += "<b>([time_stamp()])</b> (<b>[speaker]/[speaker.client]</b>) <u>MSG:</u> - <span style=\"color:[COLOR_GREEN]\">[text]</span>"
|
||||
|
||||
|
||||
/proc/log_to_dd(text)
|
||||
world.log << text //this comes before the config check because it can't possibly runtime
|
||||
if(config.log_world_output)
|
||||
@@ -222,7 +250,7 @@
|
||||
|
||||
if(include_link && is_special_character(M) && highlight_special_characters)
|
||||
name = "<font color='#FFA500'>[name]</font>" //Orange
|
||||
|
||||
|
||||
. += "/([name])"
|
||||
|
||||
return .
|
||||
|
||||
+12
-1
@@ -235,6 +235,12 @@ Proc for attack log creation, because really why not
|
||||
|
||||
var/atom/original_loc = user.loc
|
||||
|
||||
var/obj/mecha/M = null
|
||||
|
||||
if(istype(user.loc, /obj/mecha))
|
||||
original_loc = get_turf(original_loc)
|
||||
M = user.loc
|
||||
|
||||
var/holding = user.get_active_hand()
|
||||
|
||||
var/datum/progressbar/progbar
|
||||
@@ -253,7 +259,12 @@ Proc for attack log creation, because really why not
|
||||
. = FALSE
|
||||
break
|
||||
|
||||
if(user.loc != original_loc && !ignore_movement)
|
||||
if(M)
|
||||
if(user.loc != M || (M.loc != original_loc && !ignore_movement)) // Mech coooooode.
|
||||
. = FALSE
|
||||
break
|
||||
|
||||
else if(user.loc != original_loc && !ignore_movement)
|
||||
. = FALSE
|
||||
break
|
||||
|
||||
|
||||
+49
-1
@@ -84,7 +84,6 @@
|
||||
|
||||
// 0 .. 9
|
||||
if(48 to 57) //Numbers
|
||||
if(!last_char_group) continue //suppress at start of string
|
||||
if(!allow_numbers) continue // If allow_numbers is 0, then don't do this.
|
||||
output += ascii2text(ascii_char)
|
||||
number_of_alphanumeric++
|
||||
@@ -331,6 +330,55 @@ proc/TextPreview(var/string,var/len=40)
|
||||
/proc/strip_improper(var/text)
|
||||
return replacetext(replacetext(text, "\proper", ""), "\improper", "")
|
||||
|
||||
/proc/pencode2html(t)
|
||||
t = replacetext(t, "\n", "<BR>")
|
||||
t = replacetext(t, "\[center\]", "<center>")
|
||||
t = replacetext(t, "\[/center\]", "</center>")
|
||||
t = replacetext(t, "\[br\]", "<BR>")
|
||||
t = replacetext(t, "\[b\]", "<B>")
|
||||
t = replacetext(t, "\[/b\]", "</B>")
|
||||
t = replacetext(t, "\[i\]", "<I>")
|
||||
t = replacetext(t, "\[/i\]", "</I>")
|
||||
t = replacetext(t, "\[u\]", "<U>")
|
||||
t = replacetext(t, "\[/u\]", "</U>")
|
||||
t = replacetext(t, "\[time\]", "[stationtime2text()]")
|
||||
t = replacetext(t, "\[date\]", "[stationdate2text()]")
|
||||
t = replacetext(t, "\[large\]", "<font size=\"4\">")
|
||||
t = replacetext(t, "\[/large\]", "</font>")
|
||||
t = replacetext(t, "\[field\]", "<span class=\"paper_field\"></span>")
|
||||
t = replacetext(t, "\[h1\]", "<H1>")
|
||||
t = replacetext(t, "\[/h1\]", "</H1>")
|
||||
t = replacetext(t, "\[h2\]", "<H2>")
|
||||
t = replacetext(t, "\[/h2\]", "</H2>")
|
||||
t = replacetext(t, "\[h3\]", "<H3>")
|
||||
t = replacetext(t, "\[/h3\]", "</H3>")
|
||||
t = replacetext(t, "\[*\]", "<li>")
|
||||
t = replacetext(t, "\[hr\]", "<HR>")
|
||||
t = replacetext(t, "\[small\]", "<font size = \"1\">")
|
||||
t = replacetext(t, "\[/small\]", "</font>")
|
||||
t = replacetext(t, "\[list\]", "<ul>")
|
||||
t = replacetext(t, "\[/list\]", "</ul>")
|
||||
t = replacetext(t, "\[table\]", "<table border=1 cellspacing=0 cellpadding=3 style='border: 1px solid black;'>")
|
||||
t = replacetext(t, "\[/table\]", "</td></tr></table>")
|
||||
t = replacetext(t, "\[grid\]", "<table>")
|
||||
t = replacetext(t, "\[/grid\]", "</td></tr></table>")
|
||||
t = replacetext(t, "\[row\]", "</td><tr>")
|
||||
t = replacetext(t, "\[cell\]", "<td>")
|
||||
t = replacetext(t, "\[logo\]", "<img src = ntlogo.png>")
|
||||
t = replacetext(t, "\[redlogo\]", "<img src = redntlogo.png>")
|
||||
t = replacetext(t, "\[sglogo\]", "<img src = sglogo.png>")
|
||||
t = replacetext(t, "\[editorbr\]", "")
|
||||
return t
|
||||
|
||||
// Random password generator
|
||||
/proc/GenerateKey()
|
||||
//Feel free to move to Helpers.
|
||||
var/newKey
|
||||
newKey += pick("the", "if", "of", "as", "in", "a", "you", "from", "to", "an", "too", "little", "snow", "dead", "drunk", "rosebud", "duck", "al", "le")
|
||||
newKey += pick("diamond", "beer", "mushroom", "assistant", "clown", "captain", "twinkie", "security", "nuke", "small", "big", "escape", "yellow", "gloves", "monkey", "engine", "nuclear", "ai")
|
||||
newKey += pick("1", "2", "3", "4", "5", "6", "7", "8", "9", "0")
|
||||
return newKey
|
||||
|
||||
//Used for applying byonds text macros to strings that are loaded at runtime
|
||||
/proc/apply_text_macros(string)
|
||||
var/next_backslash = findtext(string, "\\")
|
||||
|
||||
@@ -11,6 +11,7 @@
|
||||
#define log_world(message) world.log << message
|
||||
#define to_file(file_entry, source_var) file_entry << source_var
|
||||
#define from_file(file_entry, target_var) file_entry >> target_var
|
||||
#define show_browser(target, browser_content, browser_name) target << browse(browser_content, browser_name)
|
||||
|
||||
// From TG, might be useful to have.
|
||||
// Didn't port SEND_TEXT() since to_chat() appears to serve the same purpose.
|
||||
@@ -20,4 +21,8 @@
|
||||
|
||||
#define CanInteract(user, state) (CanUseTopic(user, state) == STATUS_INTERACTIVE)
|
||||
|
||||
#define qdel_null(x) if(x) { qdel(x) ; x = null }
|
||||
|
||||
#define random_id(key,min_id,max_id) uniqueness_repository.Generate(/datum/uniqueness_generator/id_random, key, min_id, max_id)
|
||||
|
||||
#define ARGS_DEBUG log_debug("[__FILE__] - [__LINE__]") ; for(var/arg in args) { log_debug("\t[log_info_line(arg)]") }
|
||||
|
||||
@@ -114,6 +114,19 @@
|
||||
trigger_aiming(TARGET_CAN_CLICK)
|
||||
return 1
|
||||
|
||||
// VOREStation Addition Start: inbelly item interaction
|
||||
if(isbelly(loc) && (loc == A.loc))
|
||||
if(W)
|
||||
var/resolved = W.resolve_attackby(A,src)
|
||||
if(!resolved && A && W)
|
||||
W.afterattack(A, src, 1, params) // 1: clicking something Adjacent
|
||||
else
|
||||
if(ismob(A)) // No instant mob attacking
|
||||
setClickCooldown(get_attack_speed())
|
||||
UnarmedAttack(A, 1)
|
||||
return
|
||||
// VOREStation Addition End
|
||||
|
||||
if(!isturf(loc)) // This is going to stop you from telekinesing from inside a closet, but I don't shed many tears for that
|
||||
return
|
||||
|
||||
|
||||
@@ -108,6 +108,22 @@
|
||||
screen_loc = "WEST,SOUTH to EAST,NORTH"
|
||||
icon_state = "druggy"
|
||||
|
||||
/obj/screen/fullscreen/noise
|
||||
icon = 'icons/effects/static.dmi'
|
||||
icon_state = "1 light"
|
||||
screen_loc = ui_entire_screen
|
||||
layer = FULLSCREEN_LAYER
|
||||
|
||||
/obj/screen/fullscreen/scanline
|
||||
icon = 'icons/effects/static.dmi'
|
||||
icon_state = "scanlines"
|
||||
screen_loc = ui_entire_screen
|
||||
alpha = 50
|
||||
layer = FULLSCREEN_LAYER
|
||||
|
||||
/obj/screen/fullscreen/fishbed
|
||||
icon_state = "fishbed"
|
||||
|
||||
#undef FULLSCREEN_LAYER
|
||||
#undef BLIND_LAYER
|
||||
#undef DAMAGE_LAYER
|
||||
|
||||
@@ -0,0 +1,313 @@
|
||||
#define NEXT_PAGE_ID "__next__"
|
||||
#define DEFAULT_CHECK_DELAY 20
|
||||
|
||||
GLOBAL_LIST_EMPTY(radial_menus)
|
||||
|
||||
// Ported from TG
|
||||
|
||||
/obj/screen/radial
|
||||
icon = 'icons/mob/radial.dmi'
|
||||
layer = LAYER_HUD_ABOVE
|
||||
plane = PLANE_PLAYER_HUD_ABOVE
|
||||
var/datum/radial_menu/parent
|
||||
|
||||
/obj/screen/radial/slice
|
||||
icon_state = "radial_slice"
|
||||
var/choice
|
||||
var/next_page = FALSE
|
||||
var/tooltips = FALSE
|
||||
|
||||
/obj/screen/radial/slice/MouseEntered(location, control, params)
|
||||
. = ..()
|
||||
icon_state = "radial_slice_focus"
|
||||
if(tooltips)
|
||||
openToolTip(usr, src, params, title = name)
|
||||
|
||||
/obj/screen/radial/slice/MouseExited(location, control, params)
|
||||
. = ..()
|
||||
icon_state = "radial_slice"
|
||||
if(tooltips)
|
||||
closeToolTip(usr)
|
||||
|
||||
/obj/screen/radial/slice/Click(location, control, params)
|
||||
if(usr.client == parent.current_user)
|
||||
if(next_page)
|
||||
parent.next_page()
|
||||
else
|
||||
parent.element_chosen(choice,usr)
|
||||
|
||||
/obj/screen/radial/center
|
||||
name = "Close Menu"
|
||||
icon_state = "radial_center"
|
||||
|
||||
/obj/screen/radial/center/MouseEntered(location, control, params)
|
||||
. = ..()
|
||||
icon_state = "radial_center_focus"
|
||||
|
||||
/obj/screen/radial/center/MouseExited(location, control, params)
|
||||
. = ..()
|
||||
icon_state = "radial_center"
|
||||
|
||||
/obj/screen/radial/center/Click(location, control, params)
|
||||
if(usr.client == parent.current_user)
|
||||
parent.finished = TRUE
|
||||
|
||||
/datum/radial_menu
|
||||
var/list/choices = list() //List of choice id's
|
||||
var/list/choices_icons = list() //choice_id -> icon
|
||||
var/list/choices_values = list() //choice_id -> choice
|
||||
var/list/page_data = list() //list of choices per page
|
||||
|
||||
|
||||
var/selected_choice
|
||||
var/list/obj/screen/elements = list()
|
||||
var/obj/screen/radial/center/close_button
|
||||
var/client/current_user
|
||||
var/atom/anchor
|
||||
var/image/menu_holder
|
||||
var/finished = FALSE
|
||||
var/datum/callback/custom_check_callback
|
||||
var/next_check = 0
|
||||
var/check_delay = DEFAULT_CHECK_DELAY
|
||||
|
||||
var/radius = 32
|
||||
var/starting_angle = 0
|
||||
var/ending_angle = 360
|
||||
var/zone = 360
|
||||
var/min_angle = 45 //Defaults are setup for this value, if you want to make the menu more dense these will need changes.
|
||||
var/max_elements
|
||||
var/pages = 1
|
||||
var/current_page = 1
|
||||
|
||||
var/hudfix_method = TRUE //TRUE to change anchor to user, FALSE to shift by py_shift
|
||||
var/py_shift = 0
|
||||
var/entry_animation = TRUE
|
||||
|
||||
//If we swap to vis_contens inventory these will need a redo
|
||||
/datum/radial_menu/proc/check_screen_border(mob/user)
|
||||
var/atom/movable/AM = anchor
|
||||
if(!istype(AM) || !AM.screen_loc)
|
||||
return
|
||||
if(AM in user.client.screen)
|
||||
if(hudfix_method)
|
||||
anchor = user
|
||||
else
|
||||
py_shift = 32
|
||||
restrict_to_dir(NORTH) //I was going to parse screen loc here but that's more effort than it's worth.
|
||||
|
||||
//Sets defaults
|
||||
//These assume 45 deg min_angle
|
||||
/datum/radial_menu/proc/restrict_to_dir(dir)
|
||||
switch(dir)
|
||||
if(NORTH)
|
||||
starting_angle = 270
|
||||
ending_angle = 135
|
||||
if(SOUTH)
|
||||
starting_angle = 90
|
||||
ending_angle = 315
|
||||
if(EAST)
|
||||
starting_angle = 0
|
||||
ending_angle = 225
|
||||
if(WEST)
|
||||
starting_angle = 180
|
||||
ending_angle = 45
|
||||
|
||||
/datum/radial_menu/proc/setup_menu(use_tooltips)
|
||||
if(ending_angle > starting_angle)
|
||||
zone = ending_angle - starting_angle
|
||||
else
|
||||
zone = 360 - starting_angle + ending_angle
|
||||
|
||||
max_elements = round(zone / min_angle)
|
||||
var/paged = max_elements < choices.len
|
||||
if(elements.len < max_elements)
|
||||
var/elements_to_add = max_elements - elements.len
|
||||
for(var/i in 1 to elements_to_add) //Create all elements
|
||||
var/obj/screen/radial/slice/new_element = new /obj/screen/radial/slice
|
||||
new_element.tooltips = use_tooltips
|
||||
new_element.parent = src
|
||||
elements += new_element
|
||||
|
||||
var/page = 1
|
||||
page_data = list(null)
|
||||
var/list/current = list()
|
||||
var/list/choices_left = choices.Copy()
|
||||
while(choices_left.len)
|
||||
if(current.len == max_elements)
|
||||
page_data[page] = current
|
||||
page++
|
||||
page_data.len++
|
||||
current = list()
|
||||
if(paged && current.len == max_elements - 1)
|
||||
current += NEXT_PAGE_ID
|
||||
continue
|
||||
else
|
||||
current += popleft(choices_left)
|
||||
if(paged && current.len < max_elements)
|
||||
current += NEXT_PAGE_ID
|
||||
|
||||
page_data[page] = current
|
||||
pages = page
|
||||
current_page = 1
|
||||
update_screen_objects(anim = entry_animation)
|
||||
|
||||
/datum/radial_menu/proc/update_screen_objects(anim = FALSE)
|
||||
var/list/page_choices = page_data[current_page]
|
||||
var/angle_per_element = round(zone / page_choices.len)
|
||||
for(var/i in 1 to elements.len)
|
||||
var/obj/screen/radial/E = elements[i]
|
||||
var/angle = WRAP(starting_angle + (i - 1) * angle_per_element,0,360)
|
||||
if(i > page_choices.len)
|
||||
HideElement(E)
|
||||
else
|
||||
SetElement(E,page_choices[i],angle,anim = anim,anim_order = i)
|
||||
|
||||
/datum/radial_menu/proc/HideElement(obj/screen/radial/slice/E)
|
||||
E.cut_overlays()
|
||||
E.alpha = 0
|
||||
E.name = "None"
|
||||
E.maptext = null
|
||||
E.mouse_opacity = MOUSE_OPACITY_TRANSPARENT
|
||||
E.choice = null
|
||||
E.next_page = FALSE
|
||||
|
||||
/datum/radial_menu/proc/SetElement(obj/screen/radial/slice/E,choice_id,angle,anim,anim_order)
|
||||
//Position
|
||||
var/py = round(cos(angle) * radius) + py_shift
|
||||
var/px = round(sin(angle) * radius)
|
||||
if(anim)
|
||||
var/timing = anim_order * 0.5
|
||||
var/matrix/starting = matrix()
|
||||
starting.Scale(0.1,0.1)
|
||||
E.transform = starting
|
||||
var/matrix/TM = matrix()
|
||||
animate(E,pixel_x = px,pixel_y = py, transform = TM, time = timing)
|
||||
else
|
||||
E.pixel_y = py
|
||||
E.pixel_x = px
|
||||
|
||||
//Visuals
|
||||
E.alpha = 255
|
||||
E.mouse_opacity = MOUSE_OPACITY_ICON
|
||||
E.cut_overlays()
|
||||
if(choice_id == NEXT_PAGE_ID)
|
||||
E.name = "Next Page"
|
||||
E.next_page = TRUE
|
||||
E.add_overlay("radial_next")
|
||||
else
|
||||
if(istext(choices_values[choice_id]))
|
||||
E.name = choices_values[choice_id]
|
||||
else
|
||||
var/atom/movable/AM = choices_values[choice_id] //Movables only
|
||||
E.name = AM.name
|
||||
E.choice = choice_id
|
||||
E.maptext = null
|
||||
E.next_page = FALSE
|
||||
if(choices_icons[choice_id])
|
||||
E.add_overlay(choices_icons[choice_id])
|
||||
|
||||
/datum/radial_menu/New()
|
||||
close_button = new
|
||||
close_button.parent = src
|
||||
|
||||
/datum/radial_menu/proc/Reset()
|
||||
choices.Cut()
|
||||
choices_icons.Cut()
|
||||
choices_values.Cut()
|
||||
current_page = 1
|
||||
|
||||
/datum/radial_menu/proc/element_chosen(choice_id,mob/user)
|
||||
selected_choice = choices_values[choice_id]
|
||||
|
||||
/datum/radial_menu/proc/get_next_id()
|
||||
return "c_[choices.len]"
|
||||
|
||||
/datum/radial_menu/proc/set_choices(list/new_choices, use_tooltips)
|
||||
if(choices.len)
|
||||
Reset()
|
||||
for(var/E in new_choices)
|
||||
var/id = get_next_id()
|
||||
choices += id
|
||||
choices_values[id] = E
|
||||
if(new_choices[E])
|
||||
var/I = extract_image(new_choices[E])
|
||||
if(I)
|
||||
choices_icons[id] = I
|
||||
setup_menu(use_tooltips)
|
||||
|
||||
|
||||
/datum/radial_menu/proc/extract_image(E)
|
||||
var/mutable_appearance/MA = new /mutable_appearance(E)
|
||||
if(MA)
|
||||
MA.layer = LAYER_HUD_ABOVE
|
||||
MA.appearance_flags |= RESET_TRANSFORM
|
||||
return MA
|
||||
|
||||
|
||||
/datum/radial_menu/proc/next_page()
|
||||
if(pages > 1)
|
||||
current_page = WRAP(current_page + 1,1,pages+1)
|
||||
update_screen_objects()
|
||||
|
||||
/datum/radial_menu/proc/show_to(mob/M)
|
||||
if(current_user)
|
||||
hide()
|
||||
if(!M.client || !anchor)
|
||||
return
|
||||
current_user = M.client
|
||||
//Blank
|
||||
menu_holder = image(icon='icons/effects/effects.dmi',loc=anchor,icon_state="nothing",layer = LAYER_HUD_ABOVE)
|
||||
menu_holder.appearance_flags |= KEEP_APART
|
||||
menu_holder.vis_contents += elements + close_button
|
||||
current_user.images += menu_holder
|
||||
|
||||
/datum/radial_menu/proc/hide()
|
||||
if(current_user)
|
||||
current_user.images -= menu_holder
|
||||
|
||||
/datum/radial_menu/proc/wait(atom/user, atom/anchor, require_near = FALSE)
|
||||
while (current_user && !finished && !selected_choice)
|
||||
if(require_near && !in_range(anchor, user))
|
||||
return
|
||||
if(custom_check_callback && next_check < world.time)
|
||||
if(!custom_check_callback.Invoke())
|
||||
return
|
||||
else
|
||||
next_check = world.time + check_delay
|
||||
stoplag(1)
|
||||
|
||||
/datum/radial_menu/Destroy()
|
||||
Reset()
|
||||
hide()
|
||||
QDEL_NULL(custom_check_callback)
|
||||
. = ..()
|
||||
|
||||
/*
|
||||
Presents radial menu to user anchored to anchor (or user if the anchor is currently in users screen)
|
||||
Choices should be a list where list keys are movables or text used for element names and return value
|
||||
and list values are movables/icons/images used for element icons
|
||||
*/
|
||||
/proc/show_radial_menu(mob/user, atom/anchor, list/choices, uniqueid, radius, datum/callback/custom_check, require_near = FALSE, tooltips = FALSE)
|
||||
if(!user || !anchor || !length(choices))
|
||||
return
|
||||
if(!uniqueid)
|
||||
uniqueid = "defmenu_[REF(user)]_[REF(anchor)]"
|
||||
|
||||
if(GLOB.radial_menus[uniqueid])
|
||||
return
|
||||
|
||||
var/datum/radial_menu/menu = new
|
||||
GLOB.radial_menus[uniqueid] = menu
|
||||
if(radius)
|
||||
menu.radius = radius
|
||||
if(istype(custom_check))
|
||||
menu.custom_check_callback = custom_check
|
||||
menu.anchor = anchor
|
||||
menu.check_screen_border(user) //Do what's needed to make it look good near borders or on hud
|
||||
menu.set_choices(choices, tooltips)
|
||||
menu.show_to(user)
|
||||
menu.wait(user, anchor, require_near)
|
||||
var/answer = menu.selected_choice
|
||||
QDEL_NULL(menu)
|
||||
GLOB.radial_menus -= uniqueid
|
||||
return answer
|
||||
@@ -0,0 +1,75 @@
|
||||
/*
|
||||
A derivative of radial menu which persists onscreen until closed and invokes a callback each time an element is clicked
|
||||
*/
|
||||
|
||||
/obj/screen/radial/persistent/center
|
||||
name = "Close Menu"
|
||||
icon_state = "radial_center"
|
||||
|
||||
/obj/screen/radial/persistent/center/Click(location, control, params)
|
||||
if(usr.client == parent.current_user)
|
||||
parent.element_chosen(null,usr)
|
||||
|
||||
/obj/screen/radial/persistent/center/MouseEntered(location, control, params)
|
||||
. = ..()
|
||||
icon_state = "radial_center_focus"
|
||||
|
||||
/obj/screen/radial/persistent/center/MouseExited(location, control, params)
|
||||
. = ..()
|
||||
icon_state = "radial_center"
|
||||
|
||||
|
||||
|
||||
/datum/radial_menu/persistent
|
||||
var/uniqueid
|
||||
var/datum/callback/select_proc_callback
|
||||
|
||||
/datum/radial_menu/persistent/New()
|
||||
close_button = new /obj/screen/radial/persistent/center
|
||||
close_button.parent = src
|
||||
|
||||
|
||||
/datum/radial_menu/persistent/element_chosen(choice_id,mob/user)
|
||||
select_proc_callback.Invoke(choices_values[choice_id])
|
||||
|
||||
|
||||
/datum/radial_menu/persistent/proc/change_choices(list/newchoices, tooltips)
|
||||
if(!newchoices.len)
|
||||
return
|
||||
Reset()
|
||||
set_choices(newchoices,tooltips)
|
||||
|
||||
/datum/radial_menu/persistent/Destroy()
|
||||
QDEL_NULL(select_proc_callback)
|
||||
GLOB.radial_menus -= uniqueid
|
||||
Reset()
|
||||
hide()
|
||||
. = ..()
|
||||
|
||||
/*
|
||||
Creates a persistent radial menu and shows it to the user, anchored to anchor (or user if the anchor is currently in users screen).
|
||||
Choices should be a list where list keys are movables or text used for element names and return value
|
||||
and list values are movables/icons/images used for element icons
|
||||
Select_proc is the proc to be called each time an element on the menu is clicked, and should accept the chosen element as its final argument
|
||||
Clicking the center button will return a choice of null
|
||||
*/
|
||||
/proc/show_radial_menu_persistent(mob/user, atom/anchor, list/choices, datum/callback/select_proc, uniqueid, radius, tooltips = FALSE)
|
||||
if(!user || !anchor || !length(choices) || !select_proc)
|
||||
return
|
||||
if(!uniqueid)
|
||||
uniqueid = "defmenu_[REF(user)]_[REF(anchor)]"
|
||||
|
||||
if(GLOB.radial_menus[uniqueid])
|
||||
return
|
||||
|
||||
var/datum/radial_menu/persistent/menu = new
|
||||
menu.uniqueid = uniqueid
|
||||
GLOB.radial_menus[uniqueid] = menu
|
||||
if(radius)
|
||||
menu.radius = radius
|
||||
menu.select_proc_callback = select_proc
|
||||
menu.anchor = anchor
|
||||
menu.check_screen_border(user) //Do what's needed to make it look good near borders or on hud
|
||||
menu.set_choices(choices, tooltips)
|
||||
menu.show_to(user)
|
||||
return menu
|
||||
@@ -2,6 +2,9 @@
|
||||
/atom/proc/attack_generic(mob/user as mob)
|
||||
return 0
|
||||
|
||||
/atom/proc/take_damage(var/damage)
|
||||
return 0
|
||||
|
||||
/*
|
||||
Humans:
|
||||
Adds an exception for gloves, to allow special glove types like the ninja ones.
|
||||
|
||||
@@ -1,96 +0,0 @@
|
||||
var/datum/controller/process/planet/planet_controller = null
|
||||
|
||||
/datum/controller/process/planet
|
||||
var/list/planets = list()
|
||||
var/list/z_to_planet = list()
|
||||
|
||||
/datum/controller/process/planet/setup()
|
||||
name = "planet controller"
|
||||
planet_controller = src
|
||||
schedule_interval = 1 MINUTE
|
||||
start_delay = 20 SECONDS
|
||||
|
||||
var/list/planet_datums = typesof(/datum/planet) - /datum/planet
|
||||
for(var/P in planet_datums)
|
||||
var/datum/planet/NP = new P()
|
||||
planets.Add(NP)
|
||||
|
||||
allocateTurfs()
|
||||
|
||||
/datum/controller/process/planet/proc/allocateTurfs()
|
||||
for(var/turf/simulated/OT in outdoor_turfs)
|
||||
for(var/datum/planet/P in planets)
|
||||
if(OT.z in P.expected_z_levels)
|
||||
P.planet_floors |= OT
|
||||
OT.vis_contents |= P.weather_holder.visuals
|
||||
break
|
||||
outdoor_turfs.Cut() //Why were you in there INCORRECTLY?
|
||||
|
||||
for(var/turf/unsimulated/wall/planetary/PW in planetary_walls)
|
||||
for(var/datum/planet/P in planets)
|
||||
if(PW.type == P.planetary_wall_type)
|
||||
P.planet_walls |= PW
|
||||
break
|
||||
planetary_walls.Cut()
|
||||
|
||||
/datum/controller/process/planet/proc/unallocateTurf(var/turf/T)
|
||||
for(var/planet in planets)
|
||||
var/datum/planet/P = planet
|
||||
if(T.z in P.expected_z_levels)
|
||||
P.planet_floors -= T
|
||||
T.vis_contents -= P.weather_holder.visuals
|
||||
|
||||
/datum/controller/process/planet/doWork()
|
||||
if(outdoor_turfs.len || planetary_walls.len)
|
||||
allocateTurfs()
|
||||
|
||||
for(var/datum/planet/P in planets)
|
||||
P.process(schedule_interval / 10)
|
||||
SCHECK //Your process() really shouldn't take this long...
|
||||
|
||||
//Sun light needs changing
|
||||
if(P.needs_work & PLANET_PROCESS_SUN)
|
||||
P.needs_work &= ~PLANET_PROCESS_SUN
|
||||
// Remove old value from corners
|
||||
var/list/sunlit_corners = P.sunlit_corners
|
||||
var/old_lum_r = -P.sun["lum_r"]
|
||||
var/old_lum_g = -P.sun["lum_g"]
|
||||
var/old_lum_b = -P.sun["lum_b"]
|
||||
if(old_lum_r || old_lum_g || old_lum_b)
|
||||
for(var/C in P.sunlit_corners)
|
||||
var/datum/lighting_corner/LC = C
|
||||
LC.update_lumcount(old_lum_r, old_lum_g, old_lum_b)
|
||||
SCHECK
|
||||
sunlit_corners.Cut()
|
||||
|
||||
// Calculate new values to apply
|
||||
var/new_brightness = P.sun["brightness"]
|
||||
var/new_color = P.sun["color"]
|
||||
var/lum_r = new_brightness * GetRedPart (new_color) / 255
|
||||
var/lum_g = new_brightness * GetGreenPart(new_color) / 255
|
||||
var/lum_b = new_brightness * GetBluePart (new_color) / 255
|
||||
var/static/update_gen = -1 // Used to prevent double-processing corners. Otherwise would happen when looping over adjacent turfs.
|
||||
for(var/I in P.planet_floors)
|
||||
var/turf/simulated/T = I
|
||||
if(!T.lighting_corners_initialised)
|
||||
T.generate_missing_corners()
|
||||
for(var/C in T.get_corners())
|
||||
var/datum/lighting_corner/LC = C
|
||||
if(LC.update_gen != update_gen && LC.active)
|
||||
sunlit_corners += LC
|
||||
LC.update_gen = update_gen
|
||||
LC.update_lumcount(lum_r, lum_g, lum_b)
|
||||
SCHECK
|
||||
update_gen--
|
||||
P.sun["lum_r"] = lum_r
|
||||
P.sun["lum_g"] = lum_g
|
||||
P.sun["lum_b"] = lum_b
|
||||
|
||||
//Temperature needs updating
|
||||
if(P.needs_work & PLANET_PROCESS_TEMP)
|
||||
P.needs_work &= ~PLANET_PROCESS_TEMP
|
||||
//Set new temperatures
|
||||
for(var/W in P.planet_walls)
|
||||
var/turf/unsimulated/wall/planetary/wall = W
|
||||
wall.set_temperature(P.weather_holder.temperature)
|
||||
SCHECK
|
||||
@@ -1,56 +0,0 @@
|
||||
/datum/controller/process/radiation
|
||||
var/repository/radiation/linked = null
|
||||
|
||||
/datum/controller/process/radiation/setup()
|
||||
name = "radiation controller"
|
||||
schedule_interval = 20 // every 2 seconds
|
||||
linked = radiation_repository
|
||||
|
||||
/datum/controller/process/radiation/doWork()
|
||||
sources_decay()
|
||||
cache_expires()
|
||||
irradiate_targets()
|
||||
|
||||
// Step 1 - Sources Decay
|
||||
/datum/controller/process/radiation/proc/sources_decay()
|
||||
var/list/sources = linked.sources
|
||||
for(var/thing in sources)
|
||||
var/datum/radiation_source/S = thing
|
||||
if(QDELETED(S))
|
||||
sources.Remove(S)
|
||||
continue
|
||||
if(S.decay)
|
||||
S.update_rad_power(S.rad_power - config.radiation_decay_rate)
|
||||
if(S.rad_power <= config.radiation_lower_limit)
|
||||
sources.Remove(S)
|
||||
SCHECK // This scheck probably just wastes resources, but better safe than sorry in this case.
|
||||
|
||||
// Step 2 - Cache Expires
|
||||
/datum/controller/process/radiation/proc/cache_expires()
|
||||
var/list/resistance_cache = linked.resistance_cache
|
||||
for(var/thing in resistance_cache)
|
||||
var/turf/T = thing
|
||||
if(QDELETED(T))
|
||||
resistance_cache.Remove(T)
|
||||
continue
|
||||
if((length(T.contents) + 1) != resistance_cache[T])
|
||||
resistance_cache.Remove(T) // If its stale REMOVE it! It will get added if its needed.
|
||||
SCHECK
|
||||
|
||||
// Step 3 - Registered irradiatable things are checked for radiation
|
||||
/datum/controller/process/radiation/proc/irradiate_targets()
|
||||
var/list/registered_listeners = living_mob_list // For now just use this. Nothing else is interested anyway.
|
||||
if(length(linked.sources) > 0)
|
||||
for(var/thing in registered_listeners)
|
||||
var/atom/A = thing
|
||||
if(QDELETED(A))
|
||||
continue
|
||||
var/turf/T = get_turf(thing)
|
||||
var/rads = linked.get_rads_at_turf(T)
|
||||
if(rads)
|
||||
A.rad_act(rads)
|
||||
SCHECK
|
||||
|
||||
/datum/controller/process/radiation/statProcess()
|
||||
..()
|
||||
stat(null, "[linked.sources.len] sources, [linked.resistance_cache.len] cached turfs")
|
||||
@@ -1,169 +0,0 @@
|
||||
/var/datum/controller/process/scheduler/scheduler
|
||||
|
||||
/************
|
||||
* Scheduler *
|
||||
************/
|
||||
/datum/controller/process/scheduler
|
||||
var/list/scheduled_tasks
|
||||
|
||||
/datum/controller/process/scheduler/setup()
|
||||
name = "scheduler"
|
||||
schedule_interval = 1 SECOND
|
||||
scheduled_tasks = list()
|
||||
scheduler = src
|
||||
|
||||
/datum/controller/process/scheduler/doWork()
|
||||
var/world_time = world.time
|
||||
for(last_object in scheduled_tasks)
|
||||
var/datum/scheduled_task/scheduled_task = last_object
|
||||
if(world_time < scheduled_task.trigger_time)
|
||||
break // Too early for this one, and therefore too early for all remaining.
|
||||
try
|
||||
unschedule(scheduled_task)
|
||||
scheduled_task.pre_process()
|
||||
scheduled_task.process()
|
||||
scheduled_task.post_process()
|
||||
catch(var/exception/e)
|
||||
catchException(e, last_object)
|
||||
SCHECK
|
||||
|
||||
// We've been restarted, probably due to having a massive list of tasks.
|
||||
// Lets copy over the task list as safely as we can and try to chug thru it...
|
||||
// Note: We won't be informed about tasks being destroyed, but this is the best we can do.
|
||||
/datum/controller/process/scheduler/copyStateFrom(var/datum/controller/process/scheduler/target)
|
||||
scheduled_tasks = list()
|
||||
for(var/datum/scheduled_task/st in target.scheduled_tasks)
|
||||
if(!QDELETED(st) && istype(st))
|
||||
schedule(st)
|
||||
scheduler = src
|
||||
|
||||
// We are being killed. Least we can do is deregister all those events we registered
|
||||
/datum/controller/process/scheduler/onKill()
|
||||
for(var/st in scheduled_tasks)
|
||||
GLOB.destroyed_event.unregister(st, src)
|
||||
|
||||
/datum/controller/process/scheduler/statProcess()
|
||||
..()
|
||||
stat(null, "[scheduled_tasks.len] task\s")
|
||||
|
||||
/datum/controller/process/scheduler/proc/schedule(var/datum/scheduled_task/st)
|
||||
dd_insertObjectList(scheduled_tasks, st)
|
||||
|
||||
/datum/controller/process/scheduler/proc/unschedule(var/datum/scheduled_task/st)
|
||||
scheduled_tasks -= st
|
||||
|
||||
/**********
|
||||
* Helpers *
|
||||
**********/
|
||||
/proc/schedule_task_in(var/in_time, var/procedure, var/list/arguments = list())
|
||||
return schedule_task(world.time + in_time, procedure, arguments)
|
||||
|
||||
/proc/schedule_callback_in(var/in_time, var/datum/callback)
|
||||
return schedule_callback(world.time + in_time, callback)
|
||||
|
||||
/proc/schedule_task_with_source_in(var/in_time, var/source, var/procedure, var/list/arguments = list())
|
||||
return schedule_task_with_source(world.time + in_time, source, procedure, arguments)
|
||||
|
||||
/proc/schedule_task(var/trigger_time, var/procedure, var/list/arguments)
|
||||
var/datum/scheduled_task/st = new/datum/scheduled_task(trigger_time, procedure, arguments, /proc/destroy_scheduled_task, list())
|
||||
scheduler.schedule(st)
|
||||
return st
|
||||
|
||||
/proc/schedule_callback(var/trigger_time, var/datum/callback)
|
||||
var/datum/scheduled_task/callback/st = new/datum/scheduled_task/callback(trigger_time, callback, /proc/destroy_scheduled_task, list())
|
||||
scheduler.schedule(st)
|
||||
return st
|
||||
|
||||
/proc/schedule_task_with_source(var/trigger_time, var/source, var/procedure, var/list/arguments)
|
||||
var/datum/scheduled_task/st = new/datum/scheduled_task/source(trigger_time, source, procedure, arguments, /proc/destroy_scheduled_task, list())
|
||||
scheduler.schedule(st)
|
||||
return st
|
||||
|
||||
/proc/schedule_repeating_task(var/trigger_time, var/repeat_interval, var/procedure, var/list/arguments)
|
||||
var/datum/scheduled_task/st = new/datum/scheduled_task(trigger_time, procedure, arguments, /proc/repeat_scheduled_task, list(repeat_interval))
|
||||
scheduler.schedule(st)
|
||||
return st
|
||||
|
||||
/proc/schedule_repeating_task_with_source(var/trigger_time, var/repeat_interval, var/source, var/procedure, var/list/arguments)
|
||||
var/datum/scheduled_task/st = new/datum/scheduled_task/source(trigger_time, source, procedure, arguments, /proc/repeat_scheduled_task, list(repeat_interval))
|
||||
scheduler.schedule(st)
|
||||
return st
|
||||
|
||||
/*************
|
||||
* Task Datum *
|
||||
*************/
|
||||
/datum/scheduled_task
|
||||
var/trigger_time
|
||||
var/procedure
|
||||
var/list/arguments
|
||||
var/task_after_process
|
||||
var/list/task_after_process_args
|
||||
|
||||
/datum/scheduled_task/New(var/trigger_time, var/procedure, var/list/arguments, var/proc/task_after_process, var/list/task_after_process_args)
|
||||
..()
|
||||
src.trigger_time = trigger_time
|
||||
src.procedure = procedure
|
||||
src.arguments = arguments ? arguments : list()
|
||||
src.task_after_process = task_after_process ? task_after_process : /proc/destroy_scheduled_task
|
||||
src.task_after_process_args = istype(task_after_process_args) ? task_after_process_args : list()
|
||||
task_after_process_args += src
|
||||
|
||||
/datum/scheduled_task/Destroy()
|
||||
scheduler.unschedule(src)
|
||||
procedure = null
|
||||
arguments.Cut()
|
||||
task_after_process = null
|
||||
task_after_process_args.Cut()
|
||||
return ..()
|
||||
|
||||
/datum/scheduled_task/dd_SortValue()
|
||||
return trigger_time
|
||||
|
||||
/datum/scheduled_task/proc/pre_process()
|
||||
task_triggered_event.raise_event(list(src))
|
||||
|
||||
/datum/scheduled_task/proc/process()
|
||||
if(procedure)
|
||||
call(procedure)(arglist(arguments))
|
||||
|
||||
/datum/scheduled_task/proc/post_process()
|
||||
call(task_after_process)(arglist(task_after_process_args))
|
||||
|
||||
// Resets the trigger time, has no effect if the task has already triggered
|
||||
/datum/scheduled_task/proc/trigger_task_in(var/trigger_in)
|
||||
src.trigger_time = world.time + trigger_in
|
||||
|
||||
/datum/scheduled_task/callback
|
||||
var/datum/callback/callback
|
||||
|
||||
/datum/scheduled_task/callback/New(var/trigger_time, var/datum/callback, var/proc/task_after_process, var/list/task_after_process_args)
|
||||
src.callback = callback
|
||||
..(trigger_time = trigger_time, task_after_process = task_after_process, task_after_process_args = task_after_process_args)
|
||||
|
||||
/datum/scheduled_task/callback/process()
|
||||
callback.Invoke()
|
||||
|
||||
/datum/scheduled_task/source
|
||||
var/datum/source
|
||||
|
||||
/datum/scheduled_task/source/New(var/trigger_time, var/datum/source, var/procedure, var/list/arguments, var/proc/task_after_process, var/list/task_after_process_args)
|
||||
src.source = source
|
||||
GLOB.destroyed_event.register(src.source, src, /datum/scheduled_task/source/proc/source_destroyed)
|
||||
..(trigger_time, procedure, arguments, task_after_process, task_after_process_args)
|
||||
|
||||
/datum/scheduled_task/source/Destroy()
|
||||
source = null
|
||||
return ..()
|
||||
|
||||
/datum/scheduled_task/source/process()
|
||||
call(source, procedure)(arglist(arguments))
|
||||
|
||||
/datum/scheduled_task/source/proc/source_destroyed()
|
||||
qdel(src)
|
||||
|
||||
/proc/destroy_scheduled_task(var/datum/scheduled_task/st)
|
||||
qdel(st)
|
||||
|
||||
/proc/repeat_scheduled_task(var/trigger_delay, var/datum/scheduled_task/st)
|
||||
st.trigger_time = world.time + trigger_delay
|
||||
scheduler.schedule(st)
|
||||
@@ -224,8 +224,12 @@ var/datum/controller/supply/supply_controller = new()
|
||||
if(SP.access)
|
||||
if(isnum(SP.access))
|
||||
A.req_access = list(SP.access)
|
||||
else if(islist(SP.access))
|
||||
else if(islist(SP.access) && SP.one_access)
|
||||
var/list/L = SP.access // access var is a plain var, we need a list
|
||||
A.req_one_access = L.Copy()
|
||||
A.req_access.Cut()
|
||||
else if(islist(SP.access) && !SP.one_access)
|
||||
var/list/L = SP.access
|
||||
A.req_access = L.Copy()
|
||||
else
|
||||
log_debug("<span class='danger'>Supply pack with invalid access restriction [SP.access] encountered!</span>")
|
||||
|
||||
@@ -5,9 +5,11 @@
|
||||
/datum/configuration
|
||||
var/list/engine_map // Comma separated list of engines to choose from. Blank means fully random.
|
||||
var/time_off = FALSE
|
||||
var/pto_job_change = FALSE
|
||||
var/limit_interns = -1 //Unlimited by default
|
||||
var/limit_visitors = -1 //Unlimited by default
|
||||
var/pto_cap = 100 //Hours
|
||||
var/require_flavor = FALSE
|
||||
|
||||
/hook/startup/proc/read_vs_config()
|
||||
var/list/Lines = file2list("config/config.txt")
|
||||
@@ -52,5 +54,8 @@
|
||||
config.pto_cap = text2num(value)
|
||||
if ("time_off")
|
||||
config.time_off = TRUE
|
||||
|
||||
if ("pto_job_change")
|
||||
config.pto_job_change = TRUE
|
||||
if ("require_flavor")
|
||||
config.require_flavor = TRUE
|
||||
return 1
|
||||
|
||||
@@ -35,7 +35,12 @@ var/global/datum/emergency_shuttle_controller/emergency_shuttle
|
||||
|
||||
if (!shuttle.location) //leaving from the station
|
||||
//launch the pods!
|
||||
for (var/datum/shuttle/ferry/escape_pod/pod in escape_pods)
|
||||
for (var/EP in escape_pods)
|
||||
var/datum/shuttle/ferry/escape_pod/pod
|
||||
if(istype(escape_pods[EP], /datum/shuttle/ferry/escape_pod))
|
||||
pod = escape_pods[EP]
|
||||
else
|
||||
continue
|
||||
if (!pod.arming_controller || pod.arming_controller.armed)
|
||||
pod.launch(src)
|
||||
|
||||
@@ -57,7 +62,12 @@ var/global/datum/emergency_shuttle_controller/emergency_shuttle
|
||||
|
||||
//arm the escape pods
|
||||
if (evac)
|
||||
for (var/datum/shuttle/ferry/escape_pod/pod in escape_pods)
|
||||
for (var/EP in escape_pods)
|
||||
var/datum/shuttle/ferry/escape_pod/pod
|
||||
if(istype(escape_pods[EP], /datum/shuttle/ferry/escape_pod))
|
||||
pod = escape_pods[EP]
|
||||
else
|
||||
continue
|
||||
if (pod.arming_controller)
|
||||
pod.arming_controller.arm()
|
||||
|
||||
|
||||
@@ -0,0 +1,38 @@
|
||||
SUBSYSTEM_DEF(character_setup)
|
||||
name = "Character Setup"
|
||||
init_order = INIT_ORDER_DEFAULT
|
||||
priority = FIRE_PRIORITY_CHARSETUP
|
||||
flags = SS_BACKGROUND
|
||||
wait = 1 SECOND
|
||||
runlevels = RUNLEVEL_LOBBY | RUNLEVELS_DEFAULT
|
||||
|
||||
var/list/prefs_awaiting_setup = list()
|
||||
var/list/preferences_datums = list()
|
||||
var/list/newplayers_requiring_init = list()
|
||||
|
||||
var/list/save_queue = list()
|
||||
/*
|
||||
/datum/controller/subsystem/character_setup/Initialize()
|
||||
while(prefs_awaiting_setup.len)
|
||||
var/datum/preferences/prefs = prefs_awaiting_setup[prefs_awaiting_setup.len]
|
||||
prefs_awaiting_setup.len--
|
||||
prefs.setup()
|
||||
while(newplayers_requiring_init.len)
|
||||
var/mob/new_player/new_player = newplayers_requiring_init[newplayers_requiring_init.len]
|
||||
newplayers_requiring_init.len--
|
||||
new_player.deferred_login()
|
||||
. = ..()
|
||||
*/ //Might be useful if we ever switch to Bay prefs.
|
||||
/datum/controller/subsystem/character_setup/fire(resumed = FALSE)
|
||||
while(save_queue.len)
|
||||
var/datum/preferences/prefs = save_queue[save_queue.len]
|
||||
save_queue.len--
|
||||
|
||||
if(!QDELETED(prefs))
|
||||
prefs.save_preferences()
|
||||
|
||||
if(MC_TICK_CHECK)
|
||||
return
|
||||
|
||||
/datum/controller/subsystem/character_setup/proc/queue_preferences_save(var/datum/preferences/prefs)
|
||||
save_queue |= prefs
|
||||
@@ -240,9 +240,9 @@ SUBSYSTEM_DEF(garbage)
|
||||
time = TICK_DELTA_TO_MS(tick)/100
|
||||
if (time > highest_del_time)
|
||||
highest_del_time = time
|
||||
if (time > 10)
|
||||
log_game("Error: [type]([refID]) took longer than 1 second to delete (took [time/10] seconds to delete)")
|
||||
message_admins("Error: [type]([refID]) took longer than 1 second to delete (took [time/10] seconds to delete).")
|
||||
if (time > 20) //VOREStation Edit
|
||||
log_game("Error: [type]([refID]) took longer than 2 seconds to delete (took [time/10] seconds to delete)") //VOREStation Edit
|
||||
message_admins("Error: [type]([refID]) took longer than 2 seconds to delete (took [time/10] seconds to delete).") //VOREStation Edit
|
||||
postpone(time)
|
||||
|
||||
/datum/controller/subsystem/garbage/proc/HardQueue(datum/D)
|
||||
|
||||
@@ -12,6 +12,8 @@ SUBSYSTEM_DEF(nanoui)
|
||||
var/list/nano_asset_dirs = list(\
|
||||
"nano/css/",\
|
||||
"nano/images/",\
|
||||
"nano/images/status_icons/",\
|
||||
"nano/images/modular_computers/",\
|
||||
"nano/js/",\
|
||||
"nano/templates/"\
|
||||
)
|
||||
@@ -23,9 +25,9 @@ SUBSYSTEM_DEF(nanoui)
|
||||
if(copytext(filename, length(filename)) != "/") // filenames which end in "/" are actually directories, which we want to ignore
|
||||
if(fexists(path + filename))
|
||||
asset_files.Add(fcopy_rsc(path + filename)) // add this file to asset_files for sending to clients when they connect
|
||||
.=..() //VOREStation Edit start: fixing some kevinzing
|
||||
.=..()
|
||||
for(var/i in GLOB.clients)
|
||||
send_resources(i) //VOREStation Edit end: fixing some kevinzing
|
||||
send_resources(i)
|
||||
|
||||
/datum/controller/subsystem/nanoui/Recover()
|
||||
if(SSnanoui.open_uis)
|
||||
@@ -48,4 +50,4 @@ SUBSYSTEM_DEF(nanoui)
|
||||
if(!subsystem_initialized)
|
||||
return
|
||||
for(var/file in asset_files)
|
||||
client << browse_rsc(file) // send the file to the client
|
||||
client << browse_rsc(file) // send the file to the client
|
||||
|
||||
@@ -0,0 +1,135 @@
|
||||
SUBSYSTEM_DEF(radiation)
|
||||
name = "Radiation"
|
||||
wait = 2 SECONDS
|
||||
flags = SS_NO_INIT
|
||||
|
||||
var/list/sources = list() // all radiation source datums
|
||||
var/list/sources_assoc = list() // Sources indexed by turf for de-duplication.
|
||||
var/list/resistance_cache = list() // Cache of turf's radiation resistance.
|
||||
|
||||
var/tmp/list/current_sources = list()
|
||||
var/tmp/list/current_res_cache = list()
|
||||
var/tmp/list/listeners = list()
|
||||
|
||||
/datum/controller/subsystem/radiation/fire(resumed = FALSE)
|
||||
if (!resumed)
|
||||
current_sources = sources.Copy()
|
||||
current_res_cache = resistance_cache.Copy()
|
||||
listeners = living_mob_list.Copy()
|
||||
|
||||
while(current_sources.len)
|
||||
var/datum/radiation_source/S = current_sources[current_sources.len]
|
||||
current_sources.len--
|
||||
|
||||
if(QDELETED(S))
|
||||
sources -= S
|
||||
else if(S.decay)
|
||||
S.update_rad_power(S.rad_power - config.radiation_decay_rate)
|
||||
if (MC_TICK_CHECK)
|
||||
return
|
||||
|
||||
while(current_res_cache.len)
|
||||
var/turf/T = current_res_cache[current_res_cache.len]
|
||||
current_res_cache.len--
|
||||
|
||||
if(QDELETED(T))
|
||||
resistance_cache -= T
|
||||
else if((length(T.contents) + 1) != resistance_cache[T])
|
||||
resistance_cache -= T // If its stale REMOVE it! It will get added if its needed.
|
||||
if (MC_TICK_CHECK)
|
||||
return
|
||||
|
||||
if(!sources.len)
|
||||
listeners.Cut()
|
||||
|
||||
while(listeners.len)
|
||||
var/atom/A = listeners[listeners.len]
|
||||
listeners.len--
|
||||
|
||||
if(!QDELETED(A))
|
||||
var/turf/T = get_turf(A)
|
||||
var/rads = get_rads_at_turf(T)
|
||||
if(rads)
|
||||
A.rad_act(rads)
|
||||
if (MC_TICK_CHECK)
|
||||
return
|
||||
|
||||
/datum/controller/subsystem/radiation/stat_entry()
|
||||
..("S:[sources.len], RC:[resistance_cache.len]")
|
||||
|
||||
// Ray trace from all active radiation sources to T and return the strongest effect.
|
||||
/datum/controller/subsystem/radiation/proc/get_rads_at_turf(var/turf/T)
|
||||
. = 0
|
||||
if(!istype(T))
|
||||
return
|
||||
|
||||
for(var/value in sources)
|
||||
var/datum/radiation_source/source = value
|
||||
if(source.rad_power < .)
|
||||
continue // Already being affected by a stronger source
|
||||
if(source.source_turf.z != T.z)
|
||||
continue // Radiation is not multi-z
|
||||
if(source.respect_maint)
|
||||
var/area/A = T.loc
|
||||
if(A.flags & RAD_SHIELDED)
|
||||
continue // In shielded area
|
||||
|
||||
var/dist = get_dist(source.source_turf, T)
|
||||
if(dist > source.range)
|
||||
continue // Too far to possibly affect
|
||||
if(source.flat)
|
||||
. = max(., source.rad_power)
|
||||
continue // No need to ray trace for flat field
|
||||
|
||||
// Okay, now ray trace to find resistence!
|
||||
var/turf/origin = source.source_turf
|
||||
var/working = source.rad_power
|
||||
while(origin != T)
|
||||
origin = get_step_towards(origin, T) //Raytracing
|
||||
if(!resistance_cache[origin]) //Only get the resistance if we don't already know it.
|
||||
origin.calc_rad_resistance()
|
||||
if(origin.cached_rad_resistance)
|
||||
working = round((working / (origin.cached_rad_resistance * config.radiation_resistance_multiplier)), 0.1)
|
||||
if((working <= .) || (working <= RADIATION_THRESHOLD_CUTOFF))
|
||||
break // Already affected by a stronger source (or its zero...)
|
||||
. = max((working / (dist ** 2)), .) //Butchered version of the inverse square law. Works for this purpose
|
||||
if(. <= RADIATION_THRESHOLD_CUTOFF)
|
||||
. = 0
|
||||
|
||||
// Add a radiation source instance to the repository. It will override any existing source on the same turf.
|
||||
/datum/controller/subsystem/radiation/proc/add_source(var/datum/radiation_source/S)
|
||||
if(!isturf(S.source_turf))
|
||||
return
|
||||
var/datum/radiation_source/existing = sources_assoc[S.source_turf]
|
||||
if(existing)
|
||||
qdel(existing)
|
||||
sources += S
|
||||
sources_assoc[S.source_turf] = S
|
||||
|
||||
// Creates a temporary radiation source that will decay
|
||||
/datum/controller/subsystem/radiation/proc/radiate(source, power) //Sends out a radiation pulse, taking walls into account
|
||||
if(!(source && power)) //Sanity checking
|
||||
return
|
||||
var/datum/radiation_source/S = new()
|
||||
S.source_turf = get_turf(source)
|
||||
S.update_rad_power(power)
|
||||
add_source(S)
|
||||
|
||||
// Sets the radiation in a range to a constant value.
|
||||
/datum/controller/subsystem/radiation/proc/flat_radiate(source, power, range, var/respect_maint = TRUE) //VOREStation edit; Respect shielded areas by default please.
|
||||
if(!(source && power && range))
|
||||
return
|
||||
var/datum/radiation_source/S = new()
|
||||
S.flat = TRUE
|
||||
S.range = range
|
||||
S.respect_maint = respect_maint
|
||||
S.source_turf = get_turf(source)
|
||||
S.update_rad_power(power)
|
||||
add_source(S)
|
||||
|
||||
// Irradiates a full Z-level. Hacky way of doing it, but not too expensive.
|
||||
/datum/controller/subsystem/radiation/proc/z_radiate(var/atom/source, power, var/respect_maint = TRUE) //VOREStation edit; Respect shielded areas by default please.
|
||||
if(!(power && source))
|
||||
return
|
||||
var/turf/epicentre = locate(round(world.maxx / 2), round(world.maxy / 2), source.z)
|
||||
flat_radiate(epicentre, power, world.maxx, respect_maint)
|
||||
@@ -1,12 +1,11 @@
|
||||
#define BUCKET_LEN (world.fps*1*60) //how many ticks should we keep in the bucket. (1 minutes worth)
|
||||
#define BUCKET_POS(timer) ((round((timer.timeToRun - SStimer.head_offset) / world.tick_lag) % BUCKET_LEN)||BUCKET_LEN)
|
||||
#define BUCKET_LEN (round(10*(60/world.tick_lag), 1)) //how many ticks should we keep in the bucket. (1 minutes worth)
|
||||
#define BUCKET_POS(timer) (((round((timer.timeToRun - SStimer.head_offset) / world.tick_lag)+1) % BUCKET_LEN)||BUCKET_LEN)
|
||||
#define TIMER_MAX (world.time + TICKS2DS(min(BUCKET_LEN-(SStimer.practical_offset-DS2TICKS(world.time - SStimer.head_offset))-1, BUCKET_LEN-1)))
|
||||
#define TIMER_ID_MAX (2**24) //max float with integer precision
|
||||
|
||||
SUBSYSTEM_DEF(timer)
|
||||
name = "Timer"
|
||||
wait = 1 //SS_TICKER subsystem, so wait is in ticks
|
||||
priority = FIRE_PRIORITY_TIMERS //VOREStation Emergency Edit
|
||||
init_order = INIT_ORDER_TIMER
|
||||
|
||||
flags = SS_TICKER|SS_NO_INIT
|
||||
@@ -95,8 +94,8 @@ SUBSYSTEM_DEF(timer)
|
||||
|
||||
if(ctime_timer.flags & TIMER_LOOP)
|
||||
ctime_timer.spent = 0
|
||||
clienttime_timers.Insert(ctime_timer, 1)
|
||||
cut_start_index++
|
||||
ctime_timer.timeToRun = REALTIMEOFDAY + ctime_timer.wait
|
||||
BINARY_INSERT(ctime_timer, clienttime_timers, datum/timedevent, timeToRun)
|
||||
else
|
||||
qdel(ctime_timer)
|
||||
|
||||
@@ -270,7 +269,7 @@ SUBSYSTEM_DEF(timer)
|
||||
var/new_bucket_count
|
||||
var/i = 1
|
||||
for (i in 1 to length(alltimers))
|
||||
var/datum/timedevent/timer = alltimers[1]
|
||||
var/datum/timedevent/timer = alltimers[i]
|
||||
if (!timer)
|
||||
continue
|
||||
|
||||
|
||||
@@ -105,7 +105,7 @@ SUBSYSTEM_DEF(vote)
|
||||
factor = 1.4
|
||||
choices["Initiate Crew Transfer"] = round(choices["Initiate Crew Transfer"] * factor)
|
||||
world << "<font color='purple'>Crew Transfer Factor: [factor]</font>"
|
||||
greatest_votes = max(choices["Initiate Crew Transfer"], choices["Continue The Round"])
|
||||
greatest_votes = max(choices["Initiate Crew Transfer"], choices["Extend the Shift"]) //VOREStation Edit
|
||||
|
||||
. = list() // Get all options with that many votes and return them in a list
|
||||
if(greatest_votes)
|
||||
@@ -220,8 +220,8 @@ SUBSYSTEM_DEF(vote)
|
||||
if(ticker.current_state <= GAME_STATE_SETTING_UP)
|
||||
initiator_key << "The crew transfer button has been disabled!"
|
||||
return 0
|
||||
question = "End the shift?"
|
||||
choices.Add("Initiate Crew Transfer", "Continue The Round")
|
||||
question = "Your PDA beeps with a message from Central. Would you like an additional hour to finish ongoing projects?" //VOREStation Edit
|
||||
choices.Add("Initiate Crew Transfer", "Extend the Shift") //VOREStation Edit
|
||||
if(VOTE_ADD_ANTAGONIST)
|
||||
if(!config.allow_extra_antags || ticker.current_state >= GAME_STATE_SETTING_UP)
|
||||
return 0
|
||||
|
||||
@@ -32,3 +32,21 @@
|
||||
name = "magazine (.44 rubber)"
|
||||
path =/obj/item/ammo_magazine/m44/rubber
|
||||
hidden = 1
|
||||
|
||||
/datum/category_item/autolathe/arms/classic_smg_9mm
|
||||
name = "SMG magazine (9mm)"
|
||||
path = /obj/item/ammo_magazine/m9mml
|
||||
hidden = 1
|
||||
/* De-coded?
|
||||
/datum/category_item/autolathe/arms/classic_smg_9mmr
|
||||
name = "SMG magazine (9mm rubber)"
|
||||
path = /obj/item/ammo_magazine/m9mml/rubber
|
||||
|
||||
/datum/category_item/autolathe/arms/classic_smg_9mmp
|
||||
name = "SMG magazine (9mm practice)"
|
||||
path = /obj/item/ammo_magazine/m9mml/practice
|
||||
|
||||
/datum/category_item/autolathe/arms/classic_smg_9mmf
|
||||
name = "SMG magazine (9mm flash)"
|
||||
path = /obj/item/ammo_magazine/m9mml/flash
|
||||
*/
|
||||
@@ -6,10 +6,14 @@ var/datum/category_collection/autolathe/autolathe_recipes
|
||||
if(I.matter && !resources)
|
||||
resources = list()
|
||||
for(var/material in I.matter)
|
||||
resources[material] = I.matter[material]*1.25 // More expensive to produce than they are to recycle.
|
||||
if(is_stack && istype(I, /obj/item/stack))
|
||||
var/obj/item/stack/IS = I
|
||||
max_stack = IS.max_amount
|
||||
var/coeff = (no_scale ? 1 : 1.25) //most objects are more expensive to produce than to recycle
|
||||
resources[material] = I.matter[material]*coeff // but if it's a sheet or RCD cartridge, it's 1:1
|
||||
if(is_stack)
|
||||
if(istype(I, /obj/item/stack))
|
||||
var/obj/item/stack/IS = I
|
||||
max_stack = IS.max_amount
|
||||
else
|
||||
max_stack = 10
|
||||
qdel(I)
|
||||
|
||||
/****************************
|
||||
@@ -64,8 +68,9 @@ var/datum/category_collection/autolathe/autolathe_recipes
|
||||
var/list/resources
|
||||
var/hidden
|
||||
var/power_use = 0
|
||||
var/is_stack
|
||||
var/is_stack // Creates multiple of an item if applied to non-stack items
|
||||
var/max_stack
|
||||
var/no_scale
|
||||
|
||||
/datum/category_item/autolathe/dd_SortValue()
|
||||
return name
|
||||
@@ -93,6 +93,7 @@
|
||||
/datum/category_item/autolathe/engineering/rcd_ammo
|
||||
name = "matter cartridge"
|
||||
path =/obj/item/weapon/rcd_ammo
|
||||
no_scale = TRUE //prevents material duplication exploits
|
||||
|
||||
/datum/category_item/autolathe/engineering/rcd
|
||||
name = "rapid construction device"
|
||||
|
||||
@@ -0,0 +1,7 @@
|
||||
/datum/category_item/autolathe/engineering/timeclock
|
||||
name = "timeclock electronics"
|
||||
path =/obj/item/weapon/circuitboard/timeclock
|
||||
|
||||
/datum/category_item/autolathe/engineering/id_restorer
|
||||
name = "ID restoration console electronics"
|
||||
path =/obj/item/weapon/circuitboard/id_restorer
|
||||
@@ -73,22 +73,26 @@
|
||||
/datum/category_item/autolathe/general/metal
|
||||
name = "steel sheets"
|
||||
path =/obj/item/stack/material/steel
|
||||
is_stack = 1
|
||||
is_stack = TRUE
|
||||
no_scale = TRUE //prevents material duplication exploits
|
||||
|
||||
/datum/category_item/autolathe/general/glass
|
||||
name = "glass sheets"
|
||||
path =/obj/item/stack/material/glass
|
||||
is_stack = 1
|
||||
is_stack = TRUE
|
||||
no_scale = TRUE //prevents material duplication exploits
|
||||
|
||||
/datum/category_item/autolathe/general/rglass
|
||||
name = "reinforced glass sheets"
|
||||
path =/obj/item/stack/material/glass/reinforced
|
||||
is_stack = 1
|
||||
is_stack = TRUE
|
||||
no_scale = TRUE //prevents material duplication exploits
|
||||
|
||||
/datum/category_item/autolathe/general/rods
|
||||
name = "metal rods"
|
||||
path =/obj/item/stack/rods
|
||||
is_stack = 1
|
||||
is_stack = TRUE
|
||||
no_scale = TRUE //prevents material duplication exploits
|
||||
|
||||
/datum/category_item/autolathe/general/knife
|
||||
name = "kitchen knife"
|
||||
@@ -101,10 +105,12 @@
|
||||
/datum/category_item/autolathe/general/tube
|
||||
name = "light tube"
|
||||
path =/obj/item/weapon/light/tube
|
||||
is_stack = TRUE
|
||||
|
||||
/datum/category_item/autolathe/general/bulb
|
||||
name = "light bulb"
|
||||
path =/obj/item/weapon/light/bulb
|
||||
is_stack = TRUE
|
||||
|
||||
/datum/category_item/autolathe/general/ashtray_glass
|
||||
name = "glass ashtray"
|
||||
|
||||
@@ -19,6 +19,7 @@
|
||||
var/list/med = new()
|
||||
var/list/sci = new()
|
||||
var/list/car = new()
|
||||
var/list/pla = new() //VOREStation Edit
|
||||
var/list/civ = new()
|
||||
var/list/bot = new()
|
||||
var/list/misc = new()
|
||||
@@ -72,6 +73,11 @@
|
||||
if(real_rank in cargo_positions)
|
||||
car[name] = rank
|
||||
department = 1
|
||||
//VOREStation Edit Begin
|
||||
if(real_rank in planet_positions)
|
||||
pla[name] = rank
|
||||
department = 1
|
||||
//VOREStation Edit End
|
||||
if(real_rank in civilian_positions)
|
||||
civ[name] = rank
|
||||
department = 1
|
||||
@@ -118,6 +124,13 @@
|
||||
for(name in car)
|
||||
dat += "<tr[even ? " class='alt'" : ""]><td>[name]</td><td>[car[name]]</td><td>[isactive[name]]</td></tr>"
|
||||
even = !even
|
||||
//VOREStation Edit Begin
|
||||
if(pla.len > 0)
|
||||
dat += "<tr><th colspan=3>Exploration</th></tr>"
|
||||
for(name in pla)
|
||||
dat += "<tr[even ? " class='alt'" : ""]><td>[name]</td><td>[pla[name]]</td><td>[isactive[name]]</td></tr>"
|
||||
even = !even
|
||||
//VOREStation Edit End
|
||||
if(civ.len > 0)
|
||||
dat += "<tr><th colspan=3>Civilian</th></tr>"
|
||||
for(name in civ)
|
||||
|
||||
@@ -117,7 +117,7 @@
|
||||
/datum/ghost_query/lost_drone
|
||||
role_name = "Lost Drone"
|
||||
question = "A lost drone onboard has been discovered by a crewmember and they are attempting to reactivate it. Would you like to play as the drone?"
|
||||
be_special_flag = BE_AI
|
||||
//be_special_flag = BE_AI //VOREStation Removal: Positronic role is never used because intended purpose is unfitting, so remove the check
|
||||
check_bans = list("AI", "Cyborg")
|
||||
cutoff_number = 1
|
||||
|
||||
|
||||
@@ -205,7 +205,7 @@
|
||||
if(telemob.can_be_drop_prey && telenommer.can_be_drop_pred)
|
||||
return 1
|
||||
obstructed = 1
|
||||
else if(!isturf(destination.loc) || !destination.x || !destination.y || !destination.z) //If we're inside something or outside universe
|
||||
else if(!((isturf(destination) && !destination.density) || (isturf(destination.loc) && !destination.loc.density)) || !destination.x || !destination.y || !destination.z) //If we're inside something or outside universe
|
||||
obstructed = 1
|
||||
to_chat(teleatom, "<span class='warning'>Something is blocking way on the other side!</span>")
|
||||
if(obstructed)
|
||||
|
||||
@@ -1,3 +1,11 @@
|
||||
//wrapper
|
||||
/proc/do_noeffect_teleport(ateleatom, adestination, aprecision=0, afteleport=1, aeffectin=null, aeffectout=null, asoundin=null, asoundout=null, local=FALSE)
|
||||
new /datum/teleport/instant/science/noeffect(arglist(args))
|
||||
return
|
||||
|
||||
/datum/teleport/instant/science/noeffect/setEffects(datum/effect/effect/system/aeffectin,datum/effect/effect/system/aeffectout)
|
||||
return 1
|
||||
|
||||
/datum/teleport/proc/try_televore()
|
||||
//Destination is in a belly
|
||||
if(isbelly(destination.loc))
|
||||
|
||||
@@ -6,11 +6,6 @@
|
||||
name = OUTFIT_JOB_NAME("Visitor")
|
||||
id_pda_assignment = "Visitor"
|
||||
uniform = /obj/item/clothing/under/assistantformal
|
||||
|
||||
/decl/hierarchy/outfit/job/assistant/resident
|
||||
name = OUTFIT_JOB_NAME("Resident")
|
||||
id_pda_assignment = "Resident"
|
||||
uniform = /obj/item/clothing/under/color/white
|
||||
//VOREStation Add - Interns
|
||||
/decl/hierarchy/outfit/job/assistant/intern
|
||||
name = OUTFIT_JOB_NAME("Intern")
|
||||
@@ -49,6 +44,14 @@
|
||||
name = OUTFIT_JOB_NAME("Cook")
|
||||
id_pda_assignment = "Cook"
|
||||
|
||||
// Rykka adds Server Outfit
|
||||
|
||||
/decl/hierarchy/outfit/job/service/server
|
||||
name = OUTFIT_JOB_NAME("Server")
|
||||
uniform = /obj/item/clothing/under/waiter
|
||||
|
||||
// End Outfit addition
|
||||
|
||||
/decl/hierarchy/outfit/job/service/gardener
|
||||
name = OUTFIT_JOB_NAME("Gardener")
|
||||
uniform = /obj/item/clothing/under/rank/hydroponics
|
||||
|
||||
@@ -0,0 +1,18 @@
|
||||
/decl/hierarchy/outfit/job/assistant/worker
|
||||
id_type = /obj/item/weapon/card/id/civilian
|
||||
|
||||
/decl/hierarchy/outfit/job/assistant/cargo
|
||||
id_type = /obj/item/weapon/card/id/cargo
|
||||
|
||||
/decl/hierarchy/outfit/job/assistant/engineer
|
||||
id_type = /obj/item/weapon/card/id/engineering
|
||||
flags = OUTFIT_HAS_BACKPACK|OUTFIT_EXTENDED_SURVIVAL
|
||||
|
||||
/decl/hierarchy/outfit/job/assistant/medic
|
||||
id_type = /obj/item/weapon/card/id/medical
|
||||
|
||||
/decl/hierarchy/outfit/job/assistant/scientist
|
||||
id_type = /obj/item/weapon/card/id/science
|
||||
|
||||
/decl/hierarchy/outfit/job/assistant/officer
|
||||
id_type = /obj/item/weapon/card/id/security
|
||||
@@ -36,7 +36,7 @@
|
||||
l_ear = /obj/item/device/radio/headset/headset_com
|
||||
shoes = /obj/item/clothing/shoes/brown
|
||||
id_type = /obj/item/weapon/card/id/silver/secretary
|
||||
pda_type = /obj/item/device/pda/heads/hop
|
||||
pda_type = /obj/item/device/pda/heads
|
||||
r_hand = /obj/item/weapon/clipboard
|
||||
|
||||
/decl/hierarchy/outfit/job/secretary/pre_equip(mob/living/carbon/human/H)
|
||||
|
||||
@@ -1,21 +1,21 @@
|
||||
/decl/hierarchy/outfit/military/fleet/pt
|
||||
name = OUTFIT_MILITARY("Fleet PT")
|
||||
uniform = /obj/item/clothing/under/pt/fleet
|
||||
uniform = /obj/item/clothing/under/solgov/pt/fleet
|
||||
shoes = /obj/item/clothing/shoes/black
|
||||
|
||||
/decl/hierarchy/outfit/military/fleet/utility
|
||||
name = OUTFIT_MILITARY("Fleet Utility")
|
||||
uniform = /obj/item/clothing/under/utility/fleet
|
||||
shoes = /obj/item/clothing/shoes/boots/jackboots
|
||||
uniform = /obj/item/clothing/under/solgov/utility/fleet
|
||||
shoes = /obj/item/clothing/shoes/boots/duty
|
||||
|
||||
/decl/hierarchy/outfit/military/fleet/service
|
||||
name = OUTFIT_MILITARY("Fleet Service")
|
||||
uniform = /obj/item/clothing/under/service/fleet
|
||||
uniform = /obj/item/clothing/under/solgov/service/fleet
|
||||
shoes = /obj/item/clothing/shoes/dress/white
|
||||
|
||||
/decl/hierarchy/outfit/military/fleet/dress
|
||||
name = OUTFIT_MILITARY("Fleet Dress")
|
||||
uniform = /obj/item/clothing/under/service/fleet
|
||||
uniform = /obj/item/clothing/under/solgov/service/fleet
|
||||
shoes = /obj/item/clothing/shoes/dress/white
|
||||
suit = /obj/item/clothing/suit/storage/toggle/dress/fleet
|
||||
gloves = /obj/item/clothing/gloves/white
|
||||
|
||||
@@ -1,22 +1,22 @@
|
||||
/decl/hierarchy/outfit/military/marine/pt
|
||||
name = OUTFIT_MILITARY("Marine PT")
|
||||
uniform = /obj/item/clothing/under/pt/marine
|
||||
uniform = /obj/item/clothing/under/solgov/pt/marine
|
||||
shoes = /obj/item/clothing/shoes/black
|
||||
|
||||
/decl/hierarchy/outfit/military/marine/utility
|
||||
name = OUTFIT_MILITARY("Marine Utility")
|
||||
uniform = /obj/item/clothing/under/utility/marine
|
||||
uniform = /obj/item/clothing/under/solgov/utility/marine
|
||||
shoes = /obj/item/clothing/shoes/boots/jungle
|
||||
|
||||
/decl/hierarchy/outfit/military/marine/service
|
||||
name = OUTFIT_MILITARY("Marine Service")
|
||||
uniform = /obj/item/clothing/under/service/marine
|
||||
uniform = /obj/item/clothing/under/solgov/service/marine
|
||||
shoes = /obj/item/clothing/shoes/dress
|
||||
suit = /obj/item/clothing/suit/storage/service/marine
|
||||
|
||||
/decl/hierarchy/outfit/military/marine/dress
|
||||
name = OUTFIT_MILITARY("Marine Dress")
|
||||
uniform = /obj/item/clothing/under/mildress/marine
|
||||
uniform = /obj/item/clothing/under/solgov/mildress/marine
|
||||
shoes = /obj/item/clothing/shoes/dress/white
|
||||
suit = /obj/item/clothing/suit/dress/marine
|
||||
gloves = /obj/item/clothing/gloves/white
|
||||
|
||||
@@ -1,22 +1,22 @@
|
||||
/decl/hierarchy/outfit/military/sifguard/pt
|
||||
name = OUTFIT_MILITARY("SifGuard PT")
|
||||
uniform = /obj/item/clothing/under/pt/sifguard
|
||||
uniform = /obj/item/clothing/under/solgov/pt/sifguard
|
||||
shoes = /obj/item/clothing/shoes/black
|
||||
|
||||
/decl/hierarchy/outfit/military/sifguard/utility
|
||||
name = OUTFIT_MILITARY("SifGuard Utility")
|
||||
uniform = /obj/item/clothing/under/utility/sifguard
|
||||
shoes = /obj/item/clothing/shoes/boots/jackboots
|
||||
uniform = /obj/item/clothing/under/solgov/utility/sifguard
|
||||
shoes = /obj/item/clothing/shoes/boots/tactical
|
||||
|
||||
/decl/hierarchy/outfit/military/sifguard/service
|
||||
name = OUTFIT_MILITARY("SifGuard Service")
|
||||
uniform = /obj/item/clothing/under/utility/sifguard
|
||||
shoes = /obj/item/clothing/shoes/boots/jackboots
|
||||
uniform = /obj/item/clothing/under/solgov/utility/sifguard
|
||||
shoes = /obj/item/clothing/shoes/boots/tactical
|
||||
suit = /obj/item/clothing/suit/storage/service/sifguard
|
||||
|
||||
/decl/hierarchy/outfit/military/sifguard/dress
|
||||
name = OUTFIT_MILITARY("SifGuard Dress")
|
||||
uniform = /obj/item/clothing/under/mildress/sifguard
|
||||
uniform = /obj/item/clothing/under/solgov/mildress/sifguard
|
||||
shoes = /obj/item/clothing/shoes/dress
|
||||
suit = /obj/item/clothing/suit/dress/expedition
|
||||
gloves = /obj/item/clothing/gloves/white
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/decl/hierarchy/outfit/USDF/Marine
|
||||
name = "USDF marine"
|
||||
uniform = /obj/item/clothing/under/utility/marine/green
|
||||
uniform = /obj/item/clothing/under/solgov/utility/marine/green
|
||||
shoes = /obj/item/clothing/shoes/boots/jackboots
|
||||
gloves = /obj/item/clothing/gloves/combat
|
||||
l_ear = /obj/item/device/radio/headset/centcom
|
||||
@@ -30,7 +30,7 @@
|
||||
head = /obj/item/clothing/head/dress/marine/command/admiral
|
||||
shoes = /obj/item/clothing/shoes/boots/jackboots
|
||||
l_ear = /obj/item/device/radio/headset/centcom
|
||||
uniform = /obj/item/clothing/under/mildress/marine/command
|
||||
uniform = /obj/item/clothing/under/solgov/mildress/marine/command
|
||||
back = /obj/item/weapon/storage/backpack/satchel
|
||||
belt = /obj/item/weapon/gun/projectile/revolver/consul
|
||||
l_pocket = /obj/item/ammo_magazine/s44
|
||||
|
||||
@@ -1,138 +0,0 @@
|
||||
var/global/repository/radiation/radiation_repository = new()
|
||||
|
||||
/repository/radiation
|
||||
var/list/sources = list() // all radiation source datums
|
||||
var/list/sources_assoc = list() // Sources indexed by turf for de-duplication.
|
||||
var/list/resistance_cache = list() // Cache of turf's radiation resistance.
|
||||
|
||||
// Describes a point source of radiation. Created either in response to a pulse of radiation, or over an irradiated atom.
|
||||
// Sources will decay over time, unless something is renewing their power!
|
||||
/datum/radiation_source
|
||||
var/turf/source_turf // Location of the radiation source.
|
||||
var/rad_power // Strength of the radiation being emitted.
|
||||
var/decay = TRUE // True for automatic decay. False if owner promises to handle it (i.e. supermatter)
|
||||
var/respect_maint = FALSE // True for not affecting RAD_SHIELDED areas.
|
||||
var/flat = FALSE // True for power falloff with distance.
|
||||
var/range // Cached maximum range, used for quick checks against mobs.
|
||||
|
||||
/datum/radiation_source/Destroy()
|
||||
radiation_repository.sources -= src
|
||||
if(radiation_repository.sources_assoc[src.source_turf] == src)
|
||||
radiation_repository.sources_assoc -= src.source_turf
|
||||
src.source_turf = null
|
||||
. = ..()
|
||||
|
||||
/datum/radiation_source/proc/update_rad_power(var/new_power = null)
|
||||
if(new_power == null || new_power == rad_power)
|
||||
return // No change
|
||||
else if(new_power <= 0)
|
||||
qdel(src) // Decayed to nothing
|
||||
else
|
||||
rad_power = new_power
|
||||
if(!flat)
|
||||
range = min(round(sqrt(rad_power / config.radiation_lower_limit)), 31) // R = rad_power / dist**2 - Solve for dist
|
||||
|
||||
// Ray trace from all active radiation sources to T and return the strongest effect.
|
||||
/repository/radiation/proc/get_rads_at_turf(var/turf/T)
|
||||
if(!istype(T)) return 0
|
||||
|
||||
. = 0
|
||||
for(var/value in sources)
|
||||
var/datum/radiation_source/source = value
|
||||
if(source.rad_power < .)
|
||||
continue // Already being affected by a stronger source
|
||||
if(source.source_turf.z != T.z)
|
||||
continue // Radiation is not multi-z
|
||||
var/dist = get_dist(source.source_turf, T)
|
||||
if(dist > source.range)
|
||||
continue // Too far to possibly affect
|
||||
if(source.respect_maint)
|
||||
var/atom/A = T.loc
|
||||
if(A.flags & RAD_SHIELDED)
|
||||
continue // In shielded area
|
||||
if(source.flat)
|
||||
. = max(., source.rad_power)
|
||||
continue // No need to ray trace for flat field
|
||||
|
||||
// Okay, now ray trace to find resistence!
|
||||
var/turf/origin = source.source_turf
|
||||
var/working = source.rad_power
|
||||
while(origin != T)
|
||||
origin = get_step_towards(origin, T) //Raytracing
|
||||
if(!(origin in resistance_cache)) //Only get the resistance if we don't already know it.
|
||||
origin.calc_rad_resistance()
|
||||
working = max((working - (origin.cached_rad_resistance * config.radiation_resistance_multiplier)), 0)
|
||||
if(working <= .)
|
||||
break // Already affected by a stronger source (or its zero...)
|
||||
. = max((working * (1 / (dist ** 2))), .) //Butchered version of the inverse square law. Works for this purpose
|
||||
|
||||
// Add a radiation source instance to the repository. It will override any existing source on the same turf.
|
||||
/repository/radiation/proc/add_source(var/datum/radiation_source/S)
|
||||
if(!isturf(S.source_turf))
|
||||
return
|
||||
var/datum/radiation_source/existing = sources_assoc[S.source_turf]
|
||||
if(existing)
|
||||
qdel(existing)
|
||||
sources += S
|
||||
sources_assoc[S.source_turf] = S
|
||||
|
||||
// Creates a temporary radiation source that will decay
|
||||
/repository/radiation/proc/radiate(source, power) //Sends out a radiation pulse, taking walls into account
|
||||
if(!(source && power)) //Sanity checking
|
||||
return
|
||||
var/datum/radiation_source/S = new()
|
||||
S.source_turf = get_turf(source)
|
||||
S.update_rad_power(power)
|
||||
add_source(S)
|
||||
|
||||
// Sets the radiation in a range to a constant value.
|
||||
/repository/radiation/proc/flat_radiate(source, power, range, var/respect_maint = TRUE) //VOREStation edit; Respect shielded areas by default please.
|
||||
if(!(source && power && range))
|
||||
return
|
||||
var/datum/radiation_source/S = new()
|
||||
S.flat = TRUE
|
||||
S.range = range
|
||||
S.respect_maint = respect_maint
|
||||
S.source_turf = get_turf(source)
|
||||
S.update_rad_power(power)
|
||||
add_source(S)
|
||||
|
||||
// Irradiates a full Z-level. Hacky way of doing it, but not too expensive.
|
||||
/repository/radiation/proc/z_radiate(var/atom/source, power, var/respect_maint = TRUE) //VOREStation edit; Respect shielded areas by default please.
|
||||
if(!(power && source))
|
||||
return
|
||||
var/turf/epicentre = locate(round(world.maxx / 2), round(world.maxy / 2), source.z)
|
||||
flat_radiate(epicentre, power, world.maxx, respect_maint)
|
||||
|
||||
/turf
|
||||
var/cached_rad_resistance = 0
|
||||
|
||||
/turf/proc/calc_rad_resistance()
|
||||
cached_rad_resistance = 0
|
||||
for(var/obj/O in src.contents)
|
||||
if(O.rad_resistance) //Override
|
||||
cached_rad_resistance += O.rad_resistance
|
||||
|
||||
else if(O.density) //So open doors don't get counted
|
||||
var/material/M = O.get_material()
|
||||
if(!M) continue
|
||||
cached_rad_resistance += M.weight + M.radiation_resistance
|
||||
// Looks like storing the contents length is meant to be a basic check if the cache is stale due to items enter/exiting. Better than nothing so I'm leaving it as is. ~Leshana
|
||||
radiation_repository.resistance_cache[src] = (length(contents) + 1)
|
||||
|
||||
/turf/simulated/wall/calc_rad_resistance()
|
||||
radiation_repository.resistance_cache[src] = (length(contents) + 1)
|
||||
cached_rad_resistance = (density ? material.weight + material.radiation_resistance : 0)
|
||||
|
||||
/obj
|
||||
var/rad_resistance = 0 // Allow overriding rad resistance
|
||||
|
||||
// If people expand the system, this may be useful. Here as a placeholder until then
|
||||
/atom/proc/rad_act(var/severity)
|
||||
return 1
|
||||
|
||||
/mob/living/rad_act(var/severity)
|
||||
if(severity && !isbelly(loc)) //eaten mobs are made immune to radiation //VOREStation Edit Start
|
||||
src.apply_effect(severity, IRRADIATE, src.getarmor(null, "rad"))
|
||||
for(var/atom/I in src)
|
||||
I.rad_act(severity) ///VOREStation Edit End
|
||||
@@ -0,0 +1,70 @@
|
||||
var/repository/unique/uniqueness_repository = new()
|
||||
|
||||
/repository/unique
|
||||
var/list/generators
|
||||
|
||||
/repository/unique/New()
|
||||
..()
|
||||
generators = list()
|
||||
|
||||
/repository/unique/proc/Generate()
|
||||
var/generator_type = args[1]
|
||||
var/datum/uniqueness_generator/generator = generators[generator_type]
|
||||
if(!generator)
|
||||
generator = new generator_type()
|
||||
generators[generator_type] = generator
|
||||
var/list/generator_args = args.Copy() // Cannot cut args directly, BYOND complains about it being readonly.
|
||||
generator_args -= generator_type
|
||||
return generator.Generate(arglist(generator_args))
|
||||
|
||||
/datum/uniqueness_generator/proc/Generate()
|
||||
return
|
||||
|
||||
/datum/uniqueness_generator/id_sequential
|
||||
var/list/ids_by_key
|
||||
|
||||
/datum/uniqueness_generator/id_sequential/New()
|
||||
..()
|
||||
ids_by_key = list()
|
||||
|
||||
/datum/uniqueness_generator/id_sequential/Generate(var/key, var/default_id = 100)
|
||||
var/id = ids_by_key[key]
|
||||
if(id)
|
||||
id++
|
||||
else
|
||||
id = default_id
|
||||
|
||||
ids_by_key[key] = id
|
||||
. = id
|
||||
|
||||
/datum/uniqueness_generator/id_random
|
||||
var/list/ids_by_key
|
||||
|
||||
/datum/uniqueness_generator/id_random/New()
|
||||
..()
|
||||
ids_by_key = list()
|
||||
|
||||
/datum/uniqueness_generator/id_random/Generate(var/key, var/min, var/max)
|
||||
var/list/ids = ids_by_key[key]
|
||||
if(!ids)
|
||||
ids = list()
|
||||
ids_by_key[key] = ids
|
||||
|
||||
if(ids.len >= (max - min) + 1)
|
||||
error("Random ID limit reached for key [key].")
|
||||
ids.Cut()
|
||||
|
||||
if(ids.len >= 0.6 * ((max-min) + 1)) // if more than 60% of possible ids used
|
||||
. = list()
|
||||
for(var/i = min to max)
|
||||
if(i in ids)
|
||||
continue
|
||||
. += i
|
||||
var/id = pick(.)
|
||||
ids += id
|
||||
return id
|
||||
else
|
||||
do
|
||||
. = rand(min, max)
|
||||
while(. in ids)
|
||||
ids += .
|
||||
@@ -101,7 +101,7 @@
|
||||
if(keycheck(user))
|
||||
if(!Process_Spacemove(direction) || !isturf(ridden.loc))
|
||||
return
|
||||
step(ridden, direction)
|
||||
ridden.Move(get_step(ridden, direction))
|
||||
|
||||
handle_vehicle_layer()
|
||||
handle_vehicle_offsets()
|
||||
|
||||
@@ -88,7 +88,8 @@
|
||||
/obj/item/weapon/storage/box/syndie_kit/chameleon,
|
||||
/obj/item/device/encryptionkey/syndicate,
|
||||
/obj/item/weapon/card/id/syndicate,
|
||||
/obj/item/clothing/mask/gas/voice
|
||||
/obj/item/clothing/mask/gas/voice,
|
||||
/obj/item/weapon/makeover
|
||||
),
|
||||
list( //the professional,
|
||||
/obj/item/weapon/gun/projectile/silenced,
|
||||
|
||||
@@ -21,6 +21,20 @@
|
||||
containertype = /obj/structure/closet/crate/engineering
|
||||
containername = "Superconducting Magnetic Coil crate"
|
||||
|
||||
/datum/supply_pack/eng/smescoil/super_capacity
|
||||
name = "Superconducting Capacitance Coil"
|
||||
contains = list(/obj/item/weapon/smes_coil/super_capacity)
|
||||
cost = 90
|
||||
containertype = /obj/structure/closet/crate/engineering
|
||||
containername = "Superconducting Capacitance Coil crate"
|
||||
|
||||
/datum/supply_pack/eng/smescoil/super_io
|
||||
name = "Superconducting Transmission Coil"
|
||||
contains = list(/obj/item/weapon/smes_coil/super_io)
|
||||
cost = 90
|
||||
containertype = /obj/structure/closet/crate/engineering
|
||||
containername = "Superconducting Transmission Coil crate"
|
||||
|
||||
/datum/supply_pack/eng/shield_capacitor
|
||||
name = "Shield Capacitor"
|
||||
contains = list(/obj/machinery/shield_capacitor)
|
||||
@@ -290,4 +304,4 @@
|
||||
cost = 75
|
||||
containername = "Tritium crate"
|
||||
containertype = /obj/structure/closet/crate/engineering
|
||||
contains = list(/obj/fiftyspawner/tritium)
|
||||
contains = list(/obj/fiftyspawner/tritium)
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
cost = 30
|
||||
containertype = /obj/structure/closet/crate/large
|
||||
containername = "thermal regulator crate"
|
||||
access = access_atmospherics
|
||||
|
||||
/datum/supply_pack/eng/radsuit
|
||||
contains = list(
|
||||
|
||||
@@ -1,3 +1,6 @@
|
||||
/datum/supply_pack/randomised/hospitality/pizza
|
||||
cost = 50
|
||||
|
||||
/datum/supply_pack/randomised/hospitality/burgers_vr
|
||||
num_contained = 5
|
||||
contains = list(
|
||||
@@ -79,6 +82,3 @@
|
||||
cost = 50
|
||||
containertype = /obj/structure/closet/crate/freezer
|
||||
containername = "Chinese takeout crate"
|
||||
|
||||
/datum/supply_pack/randomised/hospitality/pizza
|
||||
cost = 25
|
||||
|
||||
@@ -38,3 +38,14 @@
|
||||
cost = 60 //considering a corgi crate is 50, and you get two fennecs
|
||||
containertype = /obj/structure/largecrate/animal/fennec
|
||||
containername = "Fennec crate"
|
||||
|
||||
/datum/supply_pack/hydro/fish
|
||||
name = "Fish supply crate"
|
||||
contains = list(
|
||||
/obj/item/weapon/reagent_containers/food/snacks/lobster = 6,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/cuttlefish = 8,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/sliceable/monkfish = 1
|
||||
)
|
||||
cost = 20
|
||||
containertype = /obj/structure/closet/crate/freezer
|
||||
containername = "Fish crate"
|
||||
@@ -62,7 +62,7 @@
|
||||
/obj/item/weapon/surgical/circular_saw
|
||||
)
|
||||
cost = 25
|
||||
containertype = "/obj/structure/closet/crate/secure"
|
||||
containertype = /obj/structure/closet/crate/secure
|
||||
containername = "Surgery crate"
|
||||
access = access_medical
|
||||
|
||||
@@ -73,7 +73,7 @@
|
||||
/obj/item/weapon/storage/box/cdeathalarm_kit
|
||||
)
|
||||
cost = 40
|
||||
containertype = "/obj/structure/closet/crate/secure"
|
||||
containertype = /obj/structure/closet/crate/secure
|
||||
containername = "Death Alarm crate"
|
||||
access = access_medical
|
||||
|
||||
@@ -83,7 +83,7 @@
|
||||
/obj/item/weapon/storage/firstaid/clotting
|
||||
)
|
||||
cost = 100
|
||||
containertype = "/obj/structure/closet/crate/secure"
|
||||
containertype = /obj/structure/closet/crate/secure
|
||||
containername = "Clotting Medicine crate"
|
||||
access = access_medical
|
||||
|
||||
@@ -97,7 +97,7 @@
|
||||
/obj/item/weapon/storage/belt/medical = 3
|
||||
)
|
||||
cost = 10
|
||||
containertype = "/obj/structure/closet/crate"
|
||||
containertype = /obj/structure/closet/crate
|
||||
containername = "Sterile equipment crate"
|
||||
|
||||
/datum/supply_pack/med/extragear
|
||||
@@ -109,7 +109,7 @@
|
||||
/obj/item/clothing/suit/storage/hooded/wintercoat/medical = 3
|
||||
)
|
||||
cost = 10
|
||||
containertype = "/obj/structure/closet/crate/secure"
|
||||
containertype = /obj/structure/closet/crate/secure
|
||||
containername = "Medical surplus equipment"
|
||||
access = access_medical
|
||||
|
||||
@@ -133,7 +133,7 @@
|
||||
/obj/item/weapon/reagent_containers/syringe
|
||||
)
|
||||
cost = 50
|
||||
containertype = "/obj/structure/closet/crate/secure"
|
||||
containertype = /obj/structure/closet/crate/secure
|
||||
containername = "Chief medical officer equipment"
|
||||
access = access_cmo
|
||||
|
||||
@@ -156,7 +156,7 @@
|
||||
/obj/item/weapon/reagent_containers/syringe
|
||||
)
|
||||
cost = 20
|
||||
containertype = "/obj/structure/closet/crate/secure"
|
||||
containertype = /obj/structure/closet/crate/secure
|
||||
containername = "Medical Doctor equipment"
|
||||
access = access_medical_equip
|
||||
|
||||
@@ -179,7 +179,7 @@
|
||||
/obj/item/weapon/reagent_containers/syringe
|
||||
)
|
||||
cost = 20
|
||||
containertype = "/obj/structure/closet/crate/secure"
|
||||
containertype = /obj/structure/closet/crate/secure
|
||||
containername = "Chemist equipment"
|
||||
access = access_chemistry
|
||||
|
||||
@@ -207,7 +207,7 @@
|
||||
/obj/item/clothing/accessory/storage/white_vest
|
||||
)
|
||||
cost = 20
|
||||
containertype = "/obj/structure/closet/crate/secure"
|
||||
containertype = /obj/structure/closet/crate/secure
|
||||
containername = "Paramedic equipment"
|
||||
access = access_medical_equip
|
||||
|
||||
@@ -226,7 +226,7 @@
|
||||
/obj/item/weapon/cartridge/medical
|
||||
)
|
||||
cost = 20
|
||||
containertype = "/obj/structure/closet/crate/secure"
|
||||
containertype = /obj/structure/closet/crate/secure
|
||||
containername = "Psychiatrist equipment"
|
||||
access = access_psychiatrist
|
||||
|
||||
@@ -247,7 +247,7 @@
|
||||
/obj/item/weapon/storage/box/gloves
|
||||
)
|
||||
cost = 10
|
||||
containertype = "/obj/structure/closet/crate/secure"
|
||||
containertype = /obj/structure/closet/crate/secure
|
||||
containername = "Medical scrubs crate"
|
||||
access = access_medical_equip
|
||||
|
||||
@@ -264,7 +264,7 @@
|
||||
/obj/item/weapon/pen
|
||||
)
|
||||
cost = 20
|
||||
containertype = "/obj/structure/closet/crate/secure"
|
||||
containertype = /obj/structure/closet/crate/secure
|
||||
containername = "Autopsy equipment crate"
|
||||
access = access_morgue
|
||||
|
||||
@@ -291,7 +291,7 @@
|
||||
/obj/item/weapon/storage/box/gloves
|
||||
)
|
||||
cost = 10
|
||||
containertype = "/obj/structure/closet/crate/secure"
|
||||
containertype = /obj/structure/closet/crate/secure
|
||||
containername = "Medical uniform crate"
|
||||
access = access_medical_equip
|
||||
|
||||
@@ -309,7 +309,7 @@
|
||||
/obj/item/weapon/storage/box/gloves
|
||||
)
|
||||
cost = 50
|
||||
containertype = "/obj/structure/closet/crate/secure"
|
||||
containertype = /obj/structure/closet/crate/secure
|
||||
containername = "Medical biohazard equipment"
|
||||
access = access_medical_equip
|
||||
|
||||
@@ -317,7 +317,7 @@
|
||||
name = "Portable freezers crate"
|
||||
contains = list(/obj/item/weapon/storage/box/freezer = 7)
|
||||
cost = 25
|
||||
containertype = "/obj/structure/closet/crate/secure"
|
||||
containertype = /obj/structure/closet/crate/secure
|
||||
containername = "Portable freezers"
|
||||
access = access_medical_equip
|
||||
|
||||
@@ -325,7 +325,7 @@
|
||||
name = "Virus sample crate"
|
||||
contains = list(/obj/item/weapon/virusdish/random = 4)
|
||||
cost = 25
|
||||
containertype = "/obj/structure/closet/crate/secure"
|
||||
containertype = /obj/structure/closet/crate/secure
|
||||
containername = "Virus sample crate"
|
||||
access = access_cmo
|
||||
|
||||
@@ -334,4 +334,39 @@
|
||||
contains = list(/obj/item/device/defib_kit = 2)
|
||||
cost = 30
|
||||
containertype = /obj/structure/closet/crate/medical
|
||||
containername = "Defibrillator crate"
|
||||
containername = "Defibrillator crate"
|
||||
|
||||
/datum/supply_pack/med/distillery
|
||||
name = "Chemical distiller crate"
|
||||
contains = list(/obj/machinery/portable_atmospherics/powered/reagent_distillery = 1)
|
||||
cost = 175
|
||||
containertype = /obj/structure/largecrate
|
||||
containername = "Chemical distiller crate"
|
||||
|
||||
/datum/supply_pack/med/advdistillery
|
||||
name = "Industrial Chemical distiller crate"
|
||||
contains = list(/obj/machinery/portable_atmospherics/powered/reagent_distillery/industrial = 1)
|
||||
cost = 250
|
||||
containertype = /obj/structure/largecrate
|
||||
containername = "Industrial Chemical distiller crate"
|
||||
|
||||
/datum/supply_pack/med/oxypump
|
||||
name = "Oxygen pump crate"
|
||||
contains = list(/obj/machinery/oxygen_pump/mobile = 1)
|
||||
cost = 125
|
||||
containertype = /obj/structure/largecrate
|
||||
containername = "Oxygen pump crate"
|
||||
|
||||
/datum/supply_pack/med/anestheticpump
|
||||
name = "Anesthetic pump crate"
|
||||
contains = list(/obj/machinery/oxygen_pump/mobile/anesthetic = 1)
|
||||
cost = 130
|
||||
containertype = /obj/structure/largecrate
|
||||
containername = "Anesthetic pump crate"
|
||||
|
||||
/datum/supply_pack/med/stablepump
|
||||
name = "Portable stabilizer crate"
|
||||
contains = list(/obj/machinery/oxygen_pump/mobile/stabilizer = 1)
|
||||
cost = 175
|
||||
containertype = /obj/structure/largecrate
|
||||
containername = "Portable stabilizer crate"
|
||||
|
||||
@@ -1,38 +1,50 @@
|
||||
/datum/supply_pack/med/medicalbiosuits
|
||||
contains = list(
|
||||
/obj/item/clothing/head/bio_hood/scientist = 3,
|
||||
/obj/item/clothing/suit/bio_suit/scientist = 3,
|
||||
/obj/item/clothing/suit/bio_suit/virology = 3,
|
||||
/obj/item/clothing/head/bio_hood/virology = 3,
|
||||
/obj/item/clothing/suit/bio_suit/cmo,
|
||||
/obj/item/clothing/head/bio_hood/cmo,
|
||||
/obj/item/clothing/shoes/white = 7,
|
||||
/obj/item/clothing/mask/gas = 7,
|
||||
/obj/item/weapon/tank/oxygen = 7,
|
||||
/obj/item/weapon/storage/box/masks,
|
||||
/obj/item/weapon/storage/box/gloves
|
||||
)
|
||||
cost = 40
|
||||
|
||||
/datum/supply_pack/med/virologybiosuits
|
||||
name = "Virology biohazard gear"
|
||||
contains = list(
|
||||
/obj/item/clothing/suit/bio_suit/virology = 3,
|
||||
/obj/item/clothing/head/bio_hood/virology = 3,
|
||||
/obj/item/clothing/mask/gas = 3,
|
||||
/obj/item/weapon/tank/oxygen = 3,
|
||||
/obj/item/weapon/storage/box/masks,
|
||||
/obj/item/weapon/storage/box/gloves
|
||||
)
|
||||
cost = 40
|
||||
containertype = "/obj/structure/closet/crate/secure"
|
||||
containername = "Virology biohazard equipment"
|
||||
access = access_medical_equip
|
||||
|
||||
/datum/supply_pack/med/virus
|
||||
name = "Virus sample crate"
|
||||
contains = list(/obj/item/weapon/virusdish/random = 4)
|
||||
cost = 25
|
||||
containertype = "/obj/structure/closet/crate/secure"
|
||||
containername = "Virus sample crate"
|
||||
access = access_medical_equip
|
||||
/datum/supply_pack/med/medicalbiosuits
|
||||
contains = list(
|
||||
/obj/item/clothing/head/bio_hood/scientist = 3,
|
||||
/obj/item/clothing/suit/bio_suit/scientist = 3,
|
||||
/obj/item/clothing/suit/bio_suit/virology = 3,
|
||||
/obj/item/clothing/head/bio_hood/virology = 3,
|
||||
/obj/item/clothing/suit/bio_suit/cmo,
|
||||
/obj/item/clothing/head/bio_hood/cmo,
|
||||
/obj/item/clothing/shoes/white = 7,
|
||||
/obj/item/clothing/mask/gas = 7,
|
||||
/obj/item/weapon/tank/oxygen = 7,
|
||||
/obj/item/weapon/storage/box/masks,
|
||||
/obj/item/weapon/storage/box/gloves
|
||||
)
|
||||
cost = 40
|
||||
|
||||
/datum/supply_pack/med/virologybiosuits
|
||||
name = "Virology biohazard gear"
|
||||
contains = list(
|
||||
/obj/item/clothing/suit/bio_suit/virology = 3,
|
||||
/obj/item/clothing/head/bio_hood/virology = 3,
|
||||
/obj/item/clothing/mask/gas = 3,
|
||||
/obj/item/weapon/tank/oxygen = 3,
|
||||
/obj/item/weapon/storage/box/masks,
|
||||
/obj/item/weapon/storage/box/gloves
|
||||
)
|
||||
cost = 40
|
||||
containertype = /obj/structure/closet/crate/secure
|
||||
containername = "Virology biohazard equipment"
|
||||
access = access_medical_equip
|
||||
|
||||
/datum/supply_pack/med/virus
|
||||
name = "Virus sample crate"
|
||||
contains = list(/obj/item/weapon/virusdish/random = 4)
|
||||
cost = 25
|
||||
containertype = /obj/structure/closet/crate/secure
|
||||
containername = "Virus sample crate"
|
||||
access = access_medical_equip
|
||||
|
||||
|
||||
/datum/supply_pack/med/bloodpack
|
||||
containertype = /obj/structure/closet/crate/medical/blood
|
||||
|
||||
/datum/supply_pack/med/compactdefib
|
||||
name = "Compact Defibrillator crate"
|
||||
contains = list(/obj/item/device/defib_kit/compact = 1)
|
||||
cost = 90
|
||||
containertype = /obj/structure/closet/crate/secure
|
||||
containername = "Compact Defibrillator crate"
|
||||
access = access_medical_equip
|
||||
|
||||
@@ -103,7 +103,7 @@
|
||||
/obj/item/weapon/storage/fancy/candle_box = 3
|
||||
)
|
||||
cost = 10
|
||||
containertype = "/obj/structure/closet/crate"
|
||||
containertype = /obj/structure/closet/crate
|
||||
containername = "Chaplain equipment crate"
|
||||
|
||||
/datum/supply_pack/misc/hoverpod
|
||||
@@ -126,7 +126,7 @@
|
||||
/obj/item/clothing/accessory/storage/webbing
|
||||
)
|
||||
cost = 10
|
||||
containertype = "/obj/structure/closet/crate"
|
||||
containertype = /obj/structure/closet/crate
|
||||
containername = "Webbing crate"
|
||||
|
||||
/datum/supply_pack/misc/holoplant
|
||||
@@ -142,5 +142,40 @@
|
||||
/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/glucose = 5
|
||||
)
|
||||
cost = 25
|
||||
containertype = "obj/structure/closet/crate"
|
||||
containername = "Glucose Hypo Crate"
|
||||
containertype = /obj/structure/closet/crate
|
||||
containername = "Glucose Hypo Crate"
|
||||
|
||||
/datum/supply_pack/misc/mre_rations
|
||||
num_contained = 6
|
||||
name = "Emergency - MREs"
|
||||
contains = list(/obj/item/weapon/storage/mre,
|
||||
/obj/item/weapon/storage/mre/menu2,
|
||||
/obj/item/weapon/storage/mre/menu3,
|
||||
/obj/item/weapon/storage/mre/menu4,
|
||||
/obj/item/weapon/storage/mre/menu5,
|
||||
/obj/item/weapon/storage/mre/menu6,
|
||||
/obj/item/weapon/storage/mre/menu7,
|
||||
/obj/item/weapon/storage/mre/menu8,
|
||||
/obj/item/weapon/storage/mre/menu9,
|
||||
/obj/item/weapon/storage/mre/menu10)
|
||||
cost = 50
|
||||
containertype = /obj/structure/closet/crate/freezer
|
||||
containername = "ready to eat rations"
|
||||
|
||||
/datum/supply_pack/misc/paste_rations
|
||||
name = "Emergency - Paste"
|
||||
contains = list(
|
||||
/obj/item/weapon/storage/mre/menu11 = 2
|
||||
)
|
||||
cost = 25
|
||||
containertype = /obj/structure/closet/crate/freezer
|
||||
containername = "emergency rations"
|
||||
|
||||
/datum/supply_pack/misc/medical_rations
|
||||
name = "Emergency - VitaPaste"
|
||||
contains = list(
|
||||
/obj/item/weapon/storage/mre/menu13 = 2
|
||||
)
|
||||
cost = 40
|
||||
containertype = /obj/structure/closet/crate/freezer
|
||||
containername = "emergency rations"
|
||||
|
||||
@@ -13,24 +13,6 @@
|
||||
containername = "Belt-miner gear crate"
|
||||
access = access_mining
|
||||
|
||||
/datum/supply_pack/misc/rations
|
||||
name = "Emergency rations"
|
||||
contains = list(
|
||||
/obj/item/weapon/reagent_containers/food/snacks/liquidfood = 4,
|
||||
)
|
||||
cost = 20
|
||||
containertype = /obj/structure/closet/crate/freezer
|
||||
containername = "emergency rations"
|
||||
|
||||
/datum/supply_pack/misc/proteinrations
|
||||
name = "Emergency meat rations"
|
||||
contains = list(
|
||||
/obj/item/weapon/reagent_containers/food/snacks/liquidprotein = 4,
|
||||
)
|
||||
cost = 30
|
||||
containertype = /obj/structure/closet/crate/freezer
|
||||
containername = "emergency meat rations"
|
||||
|
||||
/datum/supply_pack/misc/eva_rig
|
||||
name = "eva hardsuit (empty)"
|
||||
contains = list(
|
||||
@@ -39,7 +21,11 @@
|
||||
cost = 150
|
||||
containertype = /obj/structure/closet/crate/secure/gear
|
||||
containername = "eva hardsuit crate"
|
||||
access = access_mining
|
||||
access = list(access_mining,
|
||||
access_eva,
|
||||
access_explorer,
|
||||
access_pilot)
|
||||
one_access = TRUE
|
||||
|
||||
/datum/supply_pack/misc/mining_rig
|
||||
name = "industrial hardsuit (empty)"
|
||||
@@ -49,4 +35,46 @@
|
||||
cost = 150
|
||||
containertype = /obj/structure/closet/crate/secure/gear
|
||||
containername = "industrial hardsuit crate"
|
||||
access = access_mining
|
||||
access = list(access_mining,
|
||||
access_eva)
|
||||
one_access = TRUE
|
||||
|
||||
/datum/supply_pack/misc/medical_rig
|
||||
name = "medical hardsuit (empty)"
|
||||
contains = list(
|
||||
/obj/item/weapon/rig/medical = 1
|
||||
)
|
||||
cost = 150
|
||||
containertype = /obj/structure/closet/crate/secure/gear
|
||||
containername = "medical hardsuit crate"
|
||||
access = access_medical
|
||||
|
||||
/datum/supply_pack/misc/security_rig
|
||||
name = "hazard hardsuit (empty)"
|
||||
contains = list(
|
||||
/obj/item/weapon/rig/hazard = 1
|
||||
)
|
||||
cost = 150
|
||||
containertype = /obj/structure/closet/crate/secure/gear
|
||||
containername = "hazard hardsuit crate"
|
||||
access = access_armory
|
||||
|
||||
/datum/supply_pack/misc/science_rig
|
||||
name = "ami hardsuit (empty)"
|
||||
contains = list(
|
||||
/obj/item/weapon/rig/hazmat = 1
|
||||
)
|
||||
cost = 150
|
||||
containertype = /obj/structure/closet/crate/secure/gear
|
||||
containername = "ami hardsuit crate"
|
||||
access = access_rd
|
||||
|
||||
/datum/supply_pack/misc/ce_rig
|
||||
name = "advanced voidsuit (empty)"
|
||||
contains = list(
|
||||
/obj/item/weapon/rig/ce = 1
|
||||
)
|
||||
cost = 150
|
||||
containertype = /obj/structure/closet/crate/secure/gear
|
||||
containername = "advanced voidsuit crate"
|
||||
access = access_ce
|
||||
|
||||
@@ -55,7 +55,7 @@
|
||||
/obj/item/weapon/wrapping_paper = 3
|
||||
)
|
||||
cost = 10
|
||||
containertype = "/obj/structure/closet/crate"
|
||||
containertype = /obj/structure/closet/crate
|
||||
containername = "Arts and Crafts crate"
|
||||
|
||||
/datum/supply_pack/recreation/painters
|
||||
@@ -67,4 +67,34 @@
|
||||
/obj/item/device/pipe_painter = 2,
|
||||
/obj/item/device/floor_painter = 2,
|
||||
/obj/item/device/closet_painter = 2
|
||||
)
|
||||
|
||||
/datum/supply_pack/recreation/cheapbait
|
||||
name = "Cheap Fishing Bait"
|
||||
cost = 10
|
||||
containername = "cheap bait crate"
|
||||
containertype = /obj/structure/closet/crate/freezer
|
||||
contains = list(
|
||||
/obj/item/weapon/storage/box/wormcan/sickly = 5
|
||||
)
|
||||
|
||||
/datum/supply_pack/randomised/recreation/cheapbait
|
||||
name = "Deluxe Fishing Bait"
|
||||
cost = 40
|
||||
containername = "deluxe bait crate"
|
||||
containertype = /obj/structure/closet/crate/freezer
|
||||
num_contained = 8
|
||||
contains = list(
|
||||
/obj/item/weapon/storage/box/wormcan,
|
||||
/obj/item/weapon/storage/box/wormcan/deluxe
|
||||
)
|
||||
|
||||
/datum/supply_pack/recreation/ltagturrets
|
||||
name = "Laser Tag Turrets"
|
||||
cost = 40
|
||||
containername = "laser tag turret crate"
|
||||
containertype = /obj/structure/closet/crate
|
||||
contains = list(
|
||||
/obj/machinery/porta_turret/lasertag/blue,
|
||||
/obj/machinery/porta_turret/lasertag/red
|
||||
)
|
||||
@@ -40,11 +40,11 @@
|
||||
containertype = /obj/structure/closet/crate
|
||||
containername = "wolfgirl cosplay crate"
|
||||
|
||||
/datum/supply_pack/randomised/recreation/figures_vr
|
||||
/datum/supply_pack/randomised/recreation/figures
|
||||
name = "Action figures crate"
|
||||
num_contained = 5
|
||||
contains = list(
|
||||
/obj/random/action_figure
|
||||
/obj/random/action_figure/supplypack
|
||||
)
|
||||
cost = 200
|
||||
containertype = /obj/structure/closet/crate
|
||||
|
||||
@@ -56,3 +56,25 @@
|
||||
cost = 30
|
||||
containertype = /obj/structure/closet/crate
|
||||
containername = "Integrated circuit crate"
|
||||
|
||||
/datum/supply_pack/sci/xenoarch
|
||||
name = "Xenoarchaeology Tech crate"
|
||||
contains = list(
|
||||
/obj/item/weapon/pickaxe/excavationdrill,
|
||||
/obj/item/device/xenoarch_multi_tool,
|
||||
/obj/item/clothing/suit/space/anomaly,
|
||||
/obj/item/clothing/head/helmet/space/anomaly,
|
||||
/obj/item/weapon/storage/belt/archaeology,
|
||||
/obj/item/device/flashlight/lantern,
|
||||
/obj/item/device/core_sampler,
|
||||
/obj/item/device/gps,
|
||||
/obj/item/device/beacon_locator,
|
||||
/obj/item/device/radio/beacon,
|
||||
/obj/item/clothing/glasses/meson,
|
||||
/obj/item/weapon/pickaxe,
|
||||
/obj/item/weapon/storage/bag/fossils,
|
||||
/obj/item/weapon/hand_labeler)
|
||||
cost = 100
|
||||
containertype = /obj/structure/closet/crate/secure/science
|
||||
containername = "Xenoarchaeology Tech crate"
|
||||
access = access_research
|
||||
@@ -31,7 +31,6 @@
|
||||
cost = 40
|
||||
containertype = /obj/structure/closet/crate/secure/gear
|
||||
containername = "Armor crate"
|
||||
access_armory //VOREStation Add - Armor is for the armory.
|
||||
|
||||
/datum/supply_pack/security/riot_gear
|
||||
name = "Gear - Riot"
|
||||
@@ -125,6 +124,30 @@
|
||||
/obj/item/clothing/gloves/black
|
||||
)
|
||||
*/
|
||||
|
||||
/datum/supply_pack/security/flexitac
|
||||
name = "Armor - Tactical Light"
|
||||
containertype = /obj/structure/closet/crate/secure/gear
|
||||
containername = "Tactical Light armor crate"
|
||||
cost = 75
|
||||
access = access_armory
|
||||
contains = list(
|
||||
/obj/item/clothing/suit/storage/vest/heavy/flexitac,
|
||||
/obj/item/clothing/head/helmet/flexitac,
|
||||
/obj/item/clothing/shoes/leg_guard/flexitac,
|
||||
/obj/item/clothing/gloves/arm_guard/flexitac,
|
||||
/obj/item/clothing/mask/balaclava/tactical,
|
||||
/obj/item/clothing/glasses/sunglasses/sechud/tactical,
|
||||
/obj/item/weapon/storage/belt/security/tactical,
|
||||
/obj/item/clothing/suit/storage/vest/heavy/flexitac,
|
||||
/obj/item/clothing/head/helmet/flexitac,
|
||||
/obj/item/clothing/shoes/leg_guard/flexitac,
|
||||
/obj/item/clothing/gloves/arm_guard/flexitac,
|
||||
/obj/item/clothing/mask/balaclava/tactical,
|
||||
/obj/item/clothing/glasses/sunglasses/sechud/tactical,
|
||||
/obj/item/weapon/storage/belt/security/tactical
|
||||
)
|
||||
|
||||
/datum/supply_pack/security/securitybarriers
|
||||
name = "Misc - Security Barriers"
|
||||
contains = list(/obj/machinery/deployable/barrier = 4)
|
||||
@@ -373,4 +396,4 @@
|
||||
cost = 25
|
||||
containertype = /obj/structure/closet/crate/secure
|
||||
containername = "Security biohazard gear"
|
||||
access = access_security
|
||||
access = access_security
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
access = list(
|
||||
access_security,
|
||||
access_xenobiology)
|
||||
one_access = TRUE
|
||||
|
||||
/datum/supply_pack/security/guardmutant
|
||||
name = "VARMAcorp autoNOMous security solution for hostile environments"
|
||||
@@ -15,8 +16,12 @@
|
||||
access = list(
|
||||
access_security,
|
||||
access_xenobiology)
|
||||
one_access = TRUE
|
||||
*/
|
||||
|
||||
/datum/supply_pack/randomised/security/armor
|
||||
access = access_armory
|
||||
|
||||
/datum/supply_pack/security/biosuit
|
||||
contains = list(
|
||||
/obj/item/clothing/head/bio_hood/security = 3,
|
||||
@@ -29,3 +34,23 @@
|
||||
/obj/item/weapon/storage/box/gloves
|
||||
)
|
||||
cost = 40
|
||||
|
||||
/datum/supply_pack/security/trackingimplant
|
||||
name = "Implants - Tracking"
|
||||
contains = list(
|
||||
/obj/item/weapon/storage/box/trackimp = 1
|
||||
)
|
||||
cost = 25
|
||||
containertype = /obj/structure/closet/crate/secure
|
||||
containername = "Tracking implants"
|
||||
access = access_security
|
||||
|
||||
/datum/supply_pack/security/chemicalimplant
|
||||
name = "Implants - Chemical"
|
||||
contains = list(
|
||||
/obj/item/weapon/storage/box/chemimp = 1
|
||||
)
|
||||
cost = 25
|
||||
containertype = /obj/structure/closet/crate/secure
|
||||
containername = "Chemical implants"
|
||||
access = access_security
|
||||
|
||||
@@ -61,7 +61,7 @@
|
||||
/obj/item/weapon/tool/wirecutters,
|
||||
/obj/item/weapon/tape_roll = 2)
|
||||
cost = 10
|
||||
containertype = "/obj/structure/closet/crate"
|
||||
containertype = /obj/structure/closet/crate
|
||||
containername = "Shipping supplies crate"
|
||||
|
||||
/datum/supply_pack/supply/bureaucracy
|
||||
@@ -111,7 +111,7 @@
|
||||
/obj/item/clothing/glasses/meson
|
||||
)
|
||||
cost = 10
|
||||
containertype = "/obj/structure/closet/crate/secure"
|
||||
containertype = /obj/structure/closet/crate/secure
|
||||
containername = "Shaft miner equipment"
|
||||
access = access_mining
|
||||
/* //VOREStation Edit - Pointless on Tether.
|
||||
|
||||
@@ -33,6 +33,7 @@ var/list/all_supply_groups = list("Atmospherics",
|
||||
var/containertype = null
|
||||
var/containername = null
|
||||
var/access = null
|
||||
var/one_access = FALSE
|
||||
var/contraband = 0
|
||||
var/num_contained = 0 //number of items picked to be contained in a /randomised crate
|
||||
var/group = "Miscellaneous"
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
/obj/item/weapon/tank/oxygen = 2,
|
||||
)
|
||||
cost = 40
|
||||
containertype = "/obj/structure/closet/crate/secure"
|
||||
containertype = /obj/structure/closet/crate/secure
|
||||
containername = "Atmospheric voidsuit crate"
|
||||
access = access_atmospherics
|
||||
|
||||
@@ -31,7 +31,7 @@
|
||||
/obj/item/weapon/tank/oxygen = 2,
|
||||
)
|
||||
cost = 50
|
||||
containertype = "/obj/structure/closet/crate/secure"
|
||||
containertype = /obj/structure/closet/crate/secure
|
||||
containername = "Heavy Duty Atmospheric voidsuit crate"
|
||||
access = access_atmospherics
|
||||
|
||||
@@ -45,7 +45,7 @@
|
||||
/obj/item/weapon/tank/oxygen = 2
|
||||
)
|
||||
cost = 40
|
||||
containertype = "/obj/structure/closet/crate/secure"
|
||||
containertype = /obj/structure/closet/crate/secure
|
||||
containername = "Engineering voidsuit crate"
|
||||
access = access_engine_equip
|
||||
|
||||
@@ -59,7 +59,7 @@
|
||||
/obj/item/weapon/tank/oxygen = 2
|
||||
)
|
||||
cost = 40
|
||||
containertype = "/obj/structure/closet/crate/secure"
|
||||
containertype = /obj/structure/closet/crate/secure
|
||||
containername = "Engineering Construction voidsuit crate"
|
||||
access = access_engine_equip
|
||||
|
||||
@@ -73,7 +73,7 @@
|
||||
/obj/item/weapon/tank/oxygen = 2
|
||||
)
|
||||
cost = 45
|
||||
containertype = "/obj/structure/closet/crate/secure"
|
||||
containertype = /obj/structure/closet/crate/secure
|
||||
containername = "Engineering Hazmat voidsuit crate"
|
||||
access = access_engine_equip
|
||||
|
||||
@@ -87,7 +87,7 @@
|
||||
/obj/item/weapon/tank/oxygen = 2
|
||||
)
|
||||
cost = 50
|
||||
containertype = "/obj/structure/closet/crate/secure"
|
||||
containertype = /obj/structure/closet/crate/secure
|
||||
containername = "Reinforced Engineering voidsuit crate"
|
||||
access = access_engine_equip
|
||||
|
||||
@@ -101,7 +101,7 @@
|
||||
/obj/item/weapon/tank/oxygen = 2
|
||||
)
|
||||
cost = 40
|
||||
containertype = "/obj/structure/closet/crate/secure"
|
||||
containertype = /obj/structure/closet/crate/secure
|
||||
containername = "Medical voidsuit crate"
|
||||
access = access_medical_equip
|
||||
|
||||
@@ -115,7 +115,7 @@
|
||||
/obj/item/weapon/tank/oxygen = 2
|
||||
)
|
||||
cost = 40
|
||||
containertype = "/obj/structure/closet/crate/secure"
|
||||
containertype = /obj/structure/closet/crate/secure
|
||||
containername = "Medical EMT voidsuit crate"
|
||||
access = access_medical_equip
|
||||
|
||||
@@ -129,7 +129,7 @@
|
||||
/obj/item/weapon/tank/oxygen = 2
|
||||
)
|
||||
cost = 45
|
||||
containertype = "/obj/structure/closet/crate/secure"
|
||||
containertype = /obj/structure/closet/crate/secure
|
||||
containername = "Medical Biohazard voidsuit crate"
|
||||
access = access_medical_equip
|
||||
|
||||
@@ -143,7 +143,7 @@
|
||||
/obj/item/weapon/tank/oxygen = 2
|
||||
)
|
||||
cost = 60
|
||||
containertype = "/obj/structure/closet/crate/secure"
|
||||
containertype = /obj/structure/closet/crate/secure
|
||||
containername = "Vey-Med Medical voidsuit crate"
|
||||
access = access_medical_equip
|
||||
|
||||
@@ -157,7 +157,7 @@
|
||||
/obj/item/weapon/tank/oxygen = 2
|
||||
)
|
||||
cost = 40
|
||||
containertype = "/obj/structure/closet/crate/secure"
|
||||
containertype = /obj/structure/closet/crate/secure
|
||||
containername = "Security voidsuit crate"
|
||||
|
||||
/datum/supply_pack/voidsuits/security/crowd
|
||||
@@ -170,7 +170,7 @@
|
||||
/obj/item/weapon/tank/oxygen = 2
|
||||
)
|
||||
cost = 40
|
||||
containertype = "/obj/structure/closet/crate/secure"
|
||||
containertype = /obj/structure/closet/crate/secure
|
||||
containername = "Security Crowd Control voidsuit crate"
|
||||
access = access_armory
|
||||
|
||||
@@ -184,7 +184,7 @@
|
||||
/obj/item/weapon/tank/oxygen = 2
|
||||
)
|
||||
cost = 50
|
||||
containertype = "/obj/structure/closet/crate/secure"
|
||||
containertype = /obj/structure/closet/crate/secure
|
||||
containername = "Security EVA Riot voidsuit crate"
|
||||
access = access_armory
|
||||
|
||||
@@ -197,7 +197,7 @@
|
||||
/obj/item/weapon/tank/oxygen = 2
|
||||
)
|
||||
cost = 40
|
||||
containertype = "/obj/structure/closet/crate/secure"
|
||||
containertype = /obj/structure/closet/crate/secure
|
||||
containername = "Mining voidsuit crate"
|
||||
access = access_mining
|
||||
|
||||
@@ -210,7 +210,7 @@
|
||||
/obj/item/weapon/tank/oxygen = 2
|
||||
)
|
||||
cost = 50
|
||||
containertype = "/obj/structure/closet/crate/secure"
|
||||
containertype = /obj/structure/closet/crate/secure
|
||||
containername = "Frontier Mining voidsuit crate"
|
||||
access = access_mining
|
||||
|
||||
@@ -221,6 +221,6 @@
|
||||
/obj/item/clothing/mask/gas/zaddat = 1
|
||||
)
|
||||
cost = 30
|
||||
containertype = "/obj/structure/closet/crate"
|
||||
containertype = /obj/structure/closet/crate
|
||||
containername = "Zaddat Shroud crate"
|
||||
access = null
|
||||
@@ -62,7 +62,6 @@
|
||||
)
|
||||
|
||||
/datum/supply_pack/voidsuits/supply
|
||||
name = "Mining voidsuits"
|
||||
contains = list(
|
||||
/obj/item/clothing/suit/space/void/mining = 3,
|
||||
/obj/item/clothing/head/helmet/space/void/mining = 3,
|
||||
@@ -80,7 +79,7 @@
|
||||
/obj/item/weapon/tank/oxygen = 3
|
||||
)
|
||||
cost = 50
|
||||
containertype = "/obj/structure/closet/crate/secure"
|
||||
containertype = /obj/structure/closet/crate/secure
|
||||
containername = "Exploration voidsuit crate"
|
||||
access = access_explorer
|
||||
|
||||
@@ -94,6 +93,6 @@
|
||||
/obj/item/weapon/tank/oxygen = 1
|
||||
)
|
||||
cost = 20
|
||||
containertype = "/obj/structure/closet/crate/secure"
|
||||
containertype = /obj/structure/closet/crate/secure
|
||||
containername = "Pilot voidsuit crate"
|
||||
access = access_pilot
|
||||
@@ -23,3 +23,53 @@
|
||||
name = "Uplink Implant" //Original name: "Uplink Implant (Contains 5 Telecrystals)"
|
||||
item_cost = 50 //Original cost: 10
|
||||
path = /obj/item/weapon/storage/box/syndie_kit/imp_uplink
|
||||
|
||||
/datum/uplink_item/item/implants/imp_shades
|
||||
name = "Integrated Thermal-Shades Implant (Organic)"
|
||||
item_cost = 80
|
||||
path = /obj/item/weapon/storage/box/syndie_kit/imp_aug
|
||||
|
||||
/datum/uplink_item/item/implants/imp_taser
|
||||
name = "Integrated Taser Implant (Organic)"
|
||||
item_cost = 30
|
||||
path = /obj/item/weapon/storage/box/syndie_kit/imp_aug/taser
|
||||
|
||||
/datum/uplink_item/item/implants/imp_laser
|
||||
name = "Integrated Laser Implant (Organic)"
|
||||
item_cost = 50
|
||||
path = /obj/item/weapon/storage/box/syndie_kit/imp_aug/laser
|
||||
|
||||
/datum/uplink_item/item/implants/imp_dart
|
||||
name = "Integrated Dart Implant (Organic)"
|
||||
item_cost = 60
|
||||
path = /obj/item/weapon/storage/box/syndie_kit/imp_aug/dart
|
||||
|
||||
/datum/uplink_item/item/implants/imp_toolkit
|
||||
name = "Integrated Toolkit Implant (Organic)"
|
||||
item_cost = 80
|
||||
path = /obj/item/weapon/storage/box/syndie_kit/imp_aug/toolkit
|
||||
|
||||
/datum/uplink_item/item/implants/imp_medkit
|
||||
name = "Integrated Medkit Implant (Organic)"
|
||||
item_cost = 60
|
||||
path = /obj/item/weapon/storage/box/syndie_kit/imp_aug/medkit
|
||||
|
||||
/datum/uplink_item/item/implants/imp_analyzer
|
||||
name = "Integrated Research Scanner Implant (Organic)"
|
||||
item_cost = 20
|
||||
path = /obj/item/weapon/storage/box/syndie_kit/imp_aug/analyzer
|
||||
|
||||
/datum/uplink_item/item/implants/imp_sword
|
||||
name = "Integrated Sword Implant (Organic)"
|
||||
item_cost = 40
|
||||
path = /obj/item/weapon/storage/box/syndie_kit/imp_aug/sword
|
||||
|
||||
/datum/uplink_item/item/implants/imp_sprinter
|
||||
name = "Integrated Sprinter Implant (Organic)"
|
||||
item_cost = 40
|
||||
path = /obj/item/weapon/storage/box/syndie_kit/imp_aug/sprinter
|
||||
|
||||
/datum/uplink_item/item/implants/imp_sprinter
|
||||
name = "Integrated Surge Implant (Organic)"
|
||||
item_cost = 40
|
||||
path = /obj/item/weapon/storage/box/syndie_kit/imp_aug/surge
|
||||
|
||||
@@ -0,0 +1,57 @@
|
||||
/**********
|
||||
* Medical *
|
||||
**********/
|
||||
/datum/uplink_item/item/medical/mre
|
||||
name = "Meal, Ready to eat (Random)"
|
||||
item_cost = 5
|
||||
path = /obj/item/weapon/storage/mre/random
|
||||
|
||||
/datum/uplink_item/item/medical/protein
|
||||
name = "Meal, Ready to eat (Protein)"
|
||||
item_cost = 5
|
||||
path = /obj/item/weapon/storage/mre/menu10
|
||||
|
||||
/datum/uplink_item/item/medical/emergency
|
||||
name = "Meal, Ready to eat (Emergency)"
|
||||
item_cost = 5
|
||||
path = /obj/item/weapon/storage/mre/menu11
|
||||
|
||||
/datum/uplink_item/item/medical/glucose
|
||||
name = "Glucose injector"
|
||||
item_cost = 5
|
||||
path = /obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/glucose
|
||||
|
||||
/datum/uplink_item/item/medical/purity
|
||||
name = "Purity injector"
|
||||
item_cost = 5
|
||||
path = /obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/purity
|
||||
|
||||
/datum/uplink_item/item/medical/brute
|
||||
name = "Brute injector"
|
||||
item_cost = 5
|
||||
path = /obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/brute
|
||||
|
||||
/datum/uplink_item/item/medical/burn
|
||||
name = "Burn injector"
|
||||
item_cost = 5
|
||||
path = /obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/burn
|
||||
|
||||
/datum/uplink_item/item/medical/toxin
|
||||
name = "Toxin injector"
|
||||
item_cost = 5
|
||||
path = /obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/toxin
|
||||
|
||||
/datum/uplink_item/item/medical/oxy
|
||||
name = "Oxy injector"
|
||||
item_cost = 5
|
||||
path = /obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/oxy
|
||||
|
||||
/datum/uplink_item/item/medical/nanites
|
||||
name = "Healing Nanite pill bottle"
|
||||
item_cost = 30
|
||||
path = /obj/item/weapon/storage/pill_bottle/healing_nanites
|
||||
|
||||
/datum/uplink_item/item/medical/insiderepair
|
||||
name = "Combat organ kit"
|
||||
item_cost = 120
|
||||
path = /obj/item/weapon/storage/firstaid/insiderepair
|
||||
@@ -34,7 +34,7 @@
|
||||
item_cost = 15
|
||||
path = /obj/item/clothing/mask/gas/voice
|
||||
|
||||
/datum/uplink_item/item/stealth_items/camera_floppy
|
||||
name = "Camera Network Access - Floppy"
|
||||
item_cost = 15
|
||||
path = /obj/item/weapon/disk/file/cameras/syndicate
|
||||
/datum/uplink_item/item/stealth_items/makeover
|
||||
name = "Makeover Kit"
|
||||
item_cost = 5
|
||||
path = /obj/item/weapon/makeover
|
||||
@@ -0,0 +1,42 @@
|
||||
/********************
|
||||
* Devices and Tools *
|
||||
********************/
|
||||
/datum/uplink_item/item/tools/basiclaptop
|
||||
name = "Laptop (Basic)"
|
||||
item_cost = 5
|
||||
path = /obj/item/modular_computer/laptop/preset/custom_loadout/cheap
|
||||
|
||||
/datum/uplink_item/item/tools/survivalcapsule
|
||||
name = "Survival Capsule"
|
||||
item_cost = 5
|
||||
path = /obj/item/device/survivalcapsule
|
||||
|
||||
/datum/uplink_item/item/tools/nanopaste
|
||||
name = "Nanopaste (Advanced)"
|
||||
item_cost = 10
|
||||
path = /obj/item/stack/nanopaste/advanced
|
||||
|
||||
/datum/uplink_item/item/tools/elitetablet
|
||||
name = "Tablet (Advanced)"
|
||||
item_cost = 15
|
||||
path = /obj/item/modular_computer/tablet/preset/custom_loadout/advanced
|
||||
|
||||
/datum/uplink_item/item/tools/elitelaptop
|
||||
name = "Laptop (Advanced)"
|
||||
item_cost = 20
|
||||
path = /obj/item/modular_computer/laptop/preset/custom_loadout/elite
|
||||
|
||||
/datum/uplink_item/item/tools/luxurycapsule
|
||||
name = "Survival Capsule (Luxury)"
|
||||
item_cost = 40
|
||||
path = /obj/item/device/survivalcapsule/luxury
|
||||
|
||||
/datum/uplink_item/item/tools/translocator
|
||||
name = "Translocator"
|
||||
item_cost = 40
|
||||
path = /obj/item/device/perfect_tele
|
||||
|
||||
/datum/uplink_item/item/tools/barcapsule
|
||||
name = "Survival Capsule (Bar)"
|
||||
item_cost = 80
|
||||
path = /obj/item/device/survivalcapsule/luxurybar
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user