Merge remote-tracking branch 'Upstream/master' into TGUIs_Nexties
This commit is contained in:
@@ -1,4 +1,5 @@
|
||||
#define GLOBAL_PROC "some_magic_bullshit"
|
||||
|
||||
/// A shorthand for the callback datum, [documented here](datum/callback.html)
|
||||
#define CALLBACK new /datum/callback
|
||||
#define INVOKE_ASYNC world.ImmediateInvokeAsync
|
||||
#define CALLBACK_NEW(typepath, args) CALLBACK(GLOBAL_PROC, /proc/___callbacknew, typepath, args)
|
||||
|
||||
@@ -537,3 +537,10 @@ GLOBAL_LIST_INIT(pda_reskins, list(PDA_SKIN_CLASSIC = 'icons/obj/pda.dmi', PDA_S
|
||||
#define HOLOFORM_FILTER_STATIC "FILTER_STATIC"
|
||||
|
||||
#define CANT_REENTER_ROUND -1
|
||||
|
||||
//Nightshift levels.
|
||||
#define NIGHTSHIFT_AREA_FORCED 0 //ALWAYS nightshift if nightshift is enabled
|
||||
#define NIGHTSHIFT_AREA_PUBLIC 1 //hallways
|
||||
#define NIGHTSHIFT_AREA_RECREATION 2 //dorms common areas, etc
|
||||
#define NIGHTSHIFT_AREA_DEPARTMENT_HALLS 3 //interior hallways, etc
|
||||
#define NIGHTSHIFT_AREA_NONE 4 //default/highest.
|
||||
|
||||
@@ -11,14 +11,12 @@
|
||||
#define QDEL_HINT_IFFAIL_FINDREFERENCE 6 //Above but only if gc fails.
|
||||
//defines for the gc_destroyed var
|
||||
|
||||
#define GC_QUEUE_PREQUEUE 1
|
||||
#define GC_QUEUE_CHECK 2
|
||||
#define GC_QUEUE_HARDDELETE 3
|
||||
#define GC_QUEUE_COUNT 3 //increase this when adding more steps.
|
||||
#define GC_QUEUE_CHECK 1
|
||||
#define GC_QUEUE_HARDDELETE 2
|
||||
#define GC_QUEUE_COUNT 2 //increase this when adding more steps.
|
||||
|
||||
#define GC_QUEUED_FOR_QUEUING -1
|
||||
#define GC_QUEUED_FOR_HARD_DEL -2
|
||||
#define GC_CURRENTLY_BEING_QDELETED -3
|
||||
#define GC_CURRENTLY_BEING_QDELETED -2
|
||||
|
||||
#define QDELING(X) (X.gc_destroyed)
|
||||
#define QDELETED(X) (!X || QDELING(X))
|
||||
|
||||
@@ -1452,6 +1452,37 @@ GLOBAL_DATUM_INIT(dview_mob, /mob/dview, new)
|
||||
else
|
||||
D.vars[var_name] = var_value
|
||||
|
||||
#define TRAIT_CALLBACK_ADD(target, trait, source) CALLBACK(GLOBAL_PROC, /proc/___TraitAdd, ##target, ##trait, ##source)
|
||||
#define TRAIT_CALLBACK_REMOVE(target, trait, source) CALLBACK(GLOBAL_PROC, /proc/___TraitRemove, ##target, ##trait, ##source)
|
||||
|
||||
///DO NOT USE ___TraitAdd OR ___TraitRemove as a replacement for ADD_TRAIT / REMOVE_TRAIT defines. To be used explicitly for callback.
|
||||
/proc/___TraitAdd(target,trait,source)
|
||||
if(!target || !trait || !source)
|
||||
return
|
||||
if(islist(target))
|
||||
for(var/i in target)
|
||||
if(!isatom(i))
|
||||
continue
|
||||
var/atom/the_atom = i
|
||||
ADD_TRAIT(the_atom,trait,source)
|
||||
else if(isatom(target))
|
||||
var/atom/the_atom2 = target
|
||||
ADD_TRAIT(the_atom2,trait,source)
|
||||
|
||||
///DO NOT USE ___TraitAdd OR ___TraitRemove as a replacement for ADD_TRAIT / REMOVE_TRAIT defines. To be used explicitly for callback.
|
||||
/proc/___TraitRemove(target,trait,source)
|
||||
if(!target || !trait || !source)
|
||||
return
|
||||
if(islist(target))
|
||||
for(var/i in target)
|
||||
if(!isatom(i))
|
||||
continue
|
||||
var/atom/the_atom = i
|
||||
REMOVE_TRAIT(the_atom,trait,source)
|
||||
else if(isatom(target))
|
||||
var/atom/the_atom2 = target
|
||||
REMOVE_TRAIT(the_atom2,trait,source)
|
||||
|
||||
/proc/get_random_food()
|
||||
var/list/blocked = list(/obj/item/reagent_containers/food/snacks,
|
||||
/obj/item/reagent_containers/food/snacks/store/bread,
|
||||
|
||||
@@ -362,6 +362,15 @@
|
||||
|
||||
/datum/config_entry/flag/enable_night_shifts
|
||||
|
||||
/datum/config_entry/number/night_shift_public_areas_only
|
||||
config_entry_value = NIGHTSHIFT_AREA_PUBLIC
|
||||
|
||||
/datum/config_entry/flag/nightshift_toggle_requires_auth
|
||||
config_entry_value = FALSE
|
||||
|
||||
/datum/config_entry/flag/nightshift_toggle_public_requires_auth
|
||||
config_entry_value = TRUE
|
||||
|
||||
/datum/config_entry/flag/randomize_shift_time
|
||||
|
||||
/datum/config_entry/flag/shift_time_realtime
|
||||
|
||||
@@ -8,6 +8,7 @@
|
||||
**/
|
||||
|
||||
//This is the ABSOLUTE ONLY THING that should init globally like this
|
||||
//2019 update: the failsafe,config and Global controllers also do it
|
||||
GLOBAL_REAL(Master, /datum/controller/master) = new
|
||||
|
||||
//THIS IS THE INIT ORDER
|
||||
@@ -614,4 +615,4 @@ GLOBAL_REAL(Master, /datum/controller/master) = new
|
||||
if (client_count < CONFIG_GET(number/mc_tick_rate/disable_high_pop_mc_mode_amount))
|
||||
processing = CONFIG_GET(number/mc_tick_rate/base_mc_tick_rate)
|
||||
else if (client_count > CONFIG_GET(number/mc_tick_rate/high_pop_mc_mode_amount))
|
||||
processing = CONFIG_GET(number/mc_tick_rate/high_pop_mc_tick_rate)
|
||||
processing = CONFIG_GET(number/mc_tick_rate/high_pop_mc_tick_rate)
|
||||
|
||||
@@ -35,21 +35,29 @@ SUBSYSTEM_DEF(nightshift)
|
||||
if(!emergency)
|
||||
announce("Restoring night lighting configuration to normal operation.")
|
||||
else
|
||||
announce("Disabling night lighting: Station is in a state of emergency.")
|
||||
announce("Disabling night lighting: Station is in a state of emergency.")
|
||||
if(emergency)
|
||||
night_time = FALSE
|
||||
if(nightshift_active != night_time)
|
||||
update_nightshift(night_time, announcing)
|
||||
|
||||
/datum/controller/subsystem/nightshift/proc/update_nightshift(active, announce = TRUE)
|
||||
/datum/controller/subsystem/nightshift/proc/update_nightshift(active, announce = TRUE, max_level_override)
|
||||
nightshift_active = active
|
||||
if(announce)
|
||||
if (active)
|
||||
announce("Good evening, crew. To reduce power consumption and stimulate the circadian rhythms of some species, all of the lights aboard the station have been dimmed for the night.")
|
||||
else
|
||||
announce("Good morning, crew. As it is now day time, all of the lights aboard the station have been restored to their former brightness.")
|
||||
var/max_level
|
||||
var/configured_level = CONFIG_GET(number/night_shift_public_areas_only)
|
||||
if(isnull(max_level_override))
|
||||
max_level = active? configured_level : INFINITY //by default, deactivating shuts off nightshifts everywhere.
|
||||
else
|
||||
max_level = max_level_override
|
||||
for(var/A in GLOB.apcs_list)
|
||||
var/obj/machinery/power/apc/APC = A
|
||||
if (APC.area && (APC.area.type in GLOB.the_station_areas))
|
||||
APC.set_nightshift(active)
|
||||
CHECK_TICK
|
||||
if(APC.area?.type in GLOB.the_station_areas)
|
||||
var/their_level = APC.area.nightshift_public_area
|
||||
if(!max_level || (their_level <= max_level)) //if max level is 0, it means public area-only config is disabled so hit everything. if their level is 0, it means they have nightshift forced.
|
||||
APC.set_nightshift(active)
|
||||
CHECK_TICK
|
||||
|
||||
@@ -24,265 +24,263 @@ SUBSYSTEM_DEF(research)
|
||||
var/list/techweb_categories = list() //category name = list(node.id = TRUE)
|
||||
var/list/techweb_boost_items = list() //associative double-layer path = list(id = list(point_type = point_discount))
|
||||
var/list/techweb_nodes_hidden = list() //Node ids that should be hidden by default.
|
||||
|
||||
var/list/techweb_point_items = list( //path = list(point type = value)
|
||||
/obj/item/assembly/signaler/anomaly = list(TECHWEB_POINT_TYPE_GENERIC = 2500),
|
||||
/obj/item/assembly/signaler/anomaly = list(TECHWEB_POINT_TYPE_GENERIC = 5000), // Cit three more anomalys anomalys
|
||||
/obj/item/assembly/signaler/anomaly = list(TECHWEB_POINT_TYPE_GENERIC = 7500),
|
||||
/obj/item/assembly/signaler/anomaly = list(TECHWEB_POINT_TYPE_GENERIC = 10000),
|
||||
// - Slime Extracts! -
|
||||
/obj/item/slime_extract/grey = list(TECHWEB_POINT_TYPE_GENERIC = 500), // Adds in slime core deconing
|
||||
/obj/item/slime_extract/metal = list(TECHWEB_POINT_TYPE_GENERIC = 750),
|
||||
/obj/item/slime_extract/purple = list(TECHWEB_POINT_TYPE_GENERIC = 750),
|
||||
/obj/item/slime_extract/orange = list(TECHWEB_POINT_TYPE_GENERIC = 750),
|
||||
/obj/item/slime_extract/blue = list(TECHWEB_POINT_TYPE_GENERIC = 750),
|
||||
/obj/item/slime_extract/yellow = list(TECHWEB_POINT_TYPE_GENERIC = 1000),
|
||||
/obj/item/slime_extract/silver = list(TECHWEB_POINT_TYPE_GENERIC = 1000),
|
||||
/obj/item/slime_extract/darkblue = list(TECHWEB_POINT_TYPE_GENERIC = 1000),
|
||||
/obj/item/slime_extract/darkpurple = list(TECHWEB_POINT_TYPE_GENERIC = 1000),
|
||||
/obj/item/slime_extract/bluespace = list(TECHWEB_POINT_TYPE_GENERIC = 1250),
|
||||
/obj/item/slime_extract/sepia = list(TECHWEB_POINT_TYPE_GENERIC = 1250),
|
||||
/obj/item/slime_extract/cerulean = list(TECHWEB_POINT_TYPE_GENERIC = 1250),
|
||||
/obj/item/slime_extract/pyrite = list(TECHWEB_POINT_TYPE_GENERIC = 1250),
|
||||
/obj/item/slime_extract/red = list(TECHWEB_POINT_TYPE_GENERIC = 1250),
|
||||
/obj/item/slime_extract/green = list(TECHWEB_POINT_TYPE_GENERIC = 1250),
|
||||
/obj/item/slime_extract/pink = list(TECHWEB_POINT_TYPE_GENERIC = 1250),
|
||||
/obj/item/slime_extract/gold = list(TECHWEB_POINT_TYPE_GENERIC = 1250),
|
||||
/obj/item/slime_extract/black = list(TECHWEB_POINT_TYPE_GENERIC = 1500),
|
||||
/obj/item/slime_extract/adamantine =list (TECHWEB_POINT_TYPE_GENERIC = 1500),
|
||||
/obj/item/slime_extract/oil = list(TECHWEB_POINT_TYPE_GENERIC = 1500),
|
||||
/obj/item/slime_extract/lightpink = list(TECHWEB_POINT_TYPE_GENERIC = 1500),
|
||||
/obj/item/slime_extract/rainbow = list(TECHWEB_POINT_TYPE_GENERIC = 2500),
|
||||
/obj/item/assembly/signaler/anomaly = list(TECHWEB_POINT_TYPE_GENERIC = 10000),
|
||||
// - Slime Extracts! - Basics
|
||||
/obj/item/slime_extract/grey = list(TECHWEB_POINT_TYPE_GENERIC = 500),
|
||||
/obj/item/slime_extract/metal = list(TECHWEB_POINT_TYPE_GENERIC = 750),
|
||||
/obj/item/slime_extract/purple = list(TECHWEB_POINT_TYPE_GENERIC = 750),
|
||||
/obj/item/slime_extract/orange = list(TECHWEB_POINT_TYPE_GENERIC = 750),
|
||||
/obj/item/slime_extract/blue = list(TECHWEB_POINT_TYPE_GENERIC = 750),
|
||||
/obj/item/slime_extract/yellow = list(TECHWEB_POINT_TYPE_GENERIC = 1000),
|
||||
/obj/item/slime_extract/silver = list(TECHWEB_POINT_TYPE_GENERIC = 1000),
|
||||
/obj/item/slime_extract/darkblue = list(TECHWEB_POINT_TYPE_GENERIC = 1000),
|
||||
/obj/item/slime_extract/darkpurple = list(TECHWEB_POINT_TYPE_GENERIC = 1000),
|
||||
/obj/item/slime_extract/bluespace = list(TECHWEB_POINT_TYPE_GENERIC = 1250),
|
||||
/obj/item/slime_extract/sepia = list(TECHWEB_POINT_TYPE_GENERIC = 1250),
|
||||
/obj/item/slime_extract/cerulean = list(TECHWEB_POINT_TYPE_GENERIC = 1250),
|
||||
/obj/item/slime_extract/pyrite = list(TECHWEB_POINT_TYPE_GENERIC = 1250),
|
||||
/obj/item/slime_extract/red = list(TECHWEB_POINT_TYPE_GENERIC = 1250),
|
||||
/obj/item/slime_extract/green = list(TECHWEB_POINT_TYPE_GENERIC = 1250),
|
||||
/obj/item/slime_extract/pink = list(TECHWEB_POINT_TYPE_GENERIC = 1250),
|
||||
/obj/item/slime_extract/gold = list(TECHWEB_POINT_TYPE_GENERIC = 1250),
|
||||
/obj/item/slime_extract/black = list(TECHWEB_POINT_TYPE_GENERIC = 1500),
|
||||
/obj/item/slime_extract/adamantine = list(TECHWEB_POINT_TYPE_GENERIC = 1500),
|
||||
/obj/item/slime_extract/oil = list(TECHWEB_POINT_TYPE_GENERIC = 1500),
|
||||
/obj/item/slime_extract/lightpink = list(TECHWEB_POINT_TYPE_GENERIC = 1500),
|
||||
/obj/item/slime_extract/rainbow = list(TECHWEB_POINT_TYPE_GENERIC = 2500),
|
||||
// Reproductive - Crossbreading Cores! - (Grey Cores)
|
||||
/obj/item/slimecross/reproductive/grey = list(TECHWEB_POINT_TYPE_GENERIC = 1000),
|
||||
/obj/item/slimecross/reproductive/orange = list(TECHWEB_POINT_TYPE_GENERIC = 1500),
|
||||
/obj/item/slimecross/reproductive/purple = list(TECHWEB_POINT_TYPE_GENERIC = 1500),
|
||||
/obj/item/slimecross/reproductive/blue = list(TECHWEB_POINT_TYPE_GENERIC = 1500),
|
||||
/obj/item/slimecross/reproductive/metal = list(TECHWEB_POINT_TYPE_GENERIC = 1500),
|
||||
/obj/item/slimecross/reproductive/yellow = list(TECHWEB_POINT_TYPE_GENERIC = 1750),
|
||||
/obj/item/slimecross/reproductive/darkpurple = list(TECHWEB_POINT_TYPE_GENERIC = 1750),
|
||||
/obj/item/slimecross/reproductive/darkblue = list(TECHWEB_POINT_TYPE_GENERIC = 1750),
|
||||
/obj/item/slimecross/reproductive/silver = list(TECHWEB_POINT_TYPE_GENERIC = 1750),
|
||||
/obj/item/slimecross/reproductive/bluespace = list(TECHWEB_POINT_TYPE_GENERIC = 2000),
|
||||
/obj/item/slimecross/reproductive/sepia = list(TECHWEB_POINT_TYPE_GENERIC = 2000),
|
||||
/obj/item/slimecross/reproductive/cerulean = list(TECHWEB_POINT_TYPE_GENERIC = 2000),
|
||||
/obj/item/slimecross/reproductive/pyrite = list(TECHWEB_POINT_TYPE_GENERIC = 2000),
|
||||
/obj/item/slimecross/reproductive/red = list(TECHWEB_POINT_TYPE_GENERIC = 2250),
|
||||
/obj/item/slimecross/reproductive/green = list(TECHWEB_POINT_TYPE_GENERIC = 2250),
|
||||
/obj/item/slimecross/reproductive/pink = list(TECHWEB_POINT_TYPE_GENERIC = 2250),
|
||||
/obj/item/slimecross/reproductive/gold = list(TECHWEB_POINT_TYPE_GENERIC = 2250),
|
||||
/obj/item/slimecross/reproductive/oil = list(TECHWEB_POINT_TYPE_GENERIC = 2500),
|
||||
/obj/item/slimecross/reproductive/black = list(TECHWEB_POINT_TYPE_GENERIC = 2500),
|
||||
/obj/item/slimecross/reproductive/lightpink = list(TECHWEB_POINT_TYPE_GENERIC = 2500),
|
||||
/obj/item/slimecross/reproductive/adamantine = list(TECHWEB_POINT_TYPE_GENERIC = 2500),
|
||||
/obj/item/slimecross/reproductive/rainbow = list(TECHWEB_POINT_TYPE_GENERIC = 2750),
|
||||
/obj/item/slimecross/reproductive/grey = list(TECHWEB_POINT_TYPE_GENERIC = 1000),
|
||||
/obj/item/slimecross/reproductive/orange = list(TECHWEB_POINT_TYPE_GENERIC = 1500),
|
||||
/obj/item/slimecross/reproductive/purple = list(TECHWEB_POINT_TYPE_GENERIC = 1500),
|
||||
/obj/item/slimecross/reproductive/blue = list(TECHWEB_POINT_TYPE_GENERIC = 1500),
|
||||
/obj/item/slimecross/reproductive/metal = list(TECHWEB_POINT_TYPE_GENERIC = 1500),
|
||||
/obj/item/slimecross/reproductive/yellow = list(TECHWEB_POINT_TYPE_GENERIC = 1750),
|
||||
/obj/item/slimecross/reproductive/darkpurple = list(TECHWEB_POINT_TYPE_GENERIC = 1750),
|
||||
/obj/item/slimecross/reproductive/darkblue = list(TECHWEB_POINT_TYPE_GENERIC = 1750),
|
||||
/obj/item/slimecross/reproductive/silver = list(TECHWEB_POINT_TYPE_GENERIC = 1750),
|
||||
/obj/item/slimecross/reproductive/bluespace = list(TECHWEB_POINT_TYPE_GENERIC = 2000),
|
||||
/obj/item/slimecross/reproductive/sepia = list(TECHWEB_POINT_TYPE_GENERIC = 2000),
|
||||
/obj/item/slimecross/reproductive/cerulean = list(TECHWEB_POINT_TYPE_GENERIC = 2000),
|
||||
/obj/item/slimecross/reproductive/pyrite = list(TECHWEB_POINT_TYPE_GENERIC = 2000),
|
||||
/obj/item/slimecross/reproductive/red = list(TECHWEB_POINT_TYPE_GENERIC = 2250),
|
||||
/obj/item/slimecross/reproductive/green = list(TECHWEB_POINT_TYPE_GENERIC = 2250),
|
||||
/obj/item/slimecross/reproductive/pink = list(TECHWEB_POINT_TYPE_GENERIC = 2250),
|
||||
/obj/item/slimecross/reproductive/gold = list(TECHWEB_POINT_TYPE_GENERIC = 2250),
|
||||
/obj/item/slimecross/reproductive/oil = list(TECHWEB_POINT_TYPE_GENERIC = 2500),
|
||||
/obj/item/slimecross/reproductive/black = list(TECHWEB_POINT_TYPE_GENERIC = 2500),
|
||||
/obj/item/slimecross/reproductive/lightpink = list(TECHWEB_POINT_TYPE_GENERIC = 2500),
|
||||
/obj/item/slimecross/reproductive/adamantine = list(TECHWEB_POINT_TYPE_GENERIC = 2500),
|
||||
/obj/item/slimecross/reproductive/rainbow = list(TECHWEB_POINT_TYPE_GENERIC = 2750),
|
||||
// Burning - Crossbreading Cores! - (Orange Cores)
|
||||
/obj/item/slimecross/burning/grey = list(TECHWEB_POINT_TYPE_GENERIC = 2000),
|
||||
/obj/item/slimecross/burning/orange = list(TECHWEB_POINT_TYPE_GENERIC = 2500),
|
||||
/obj/item/slimecross/burning/purple = list(TECHWEB_POINT_TYPE_GENERIC = 2500),
|
||||
/obj/item/slimecross/burning/blue = list(TECHWEB_POINT_TYPE_GENERIC = 2500),
|
||||
/obj/item/slimecross/burning/metal = list(TECHWEB_POINT_TYPE_GENERIC = 2500),
|
||||
/obj/item/slimecross/burning/yellow = list(TECHWEB_POINT_TYPE_GENERIC = 2750),
|
||||
/obj/item/slimecross/burning/darkpurple = list(TECHWEB_POINT_TYPE_GENERIC = 2750),
|
||||
/obj/item/slimecross/burning/darkblue = list(TECHWEB_POINT_TYPE_GENERIC = 2750),
|
||||
/obj/item/slimecross/burning/silver = list(TECHWEB_POINT_TYPE_GENERIC = 2750),
|
||||
/obj/item/slimecross/burning/bluespace = list(TECHWEB_POINT_TYPE_GENERIC = 3000),
|
||||
/obj/item/slimecross/burning/sepia = list(TECHWEB_POINT_TYPE_GENERIC = 3000),
|
||||
/obj/item/slimecross/burning/cerulean = list(TECHWEB_POINT_TYPE_GENERIC = 3000),
|
||||
/obj/item/slimecross/burning/pyrite = list(TECHWEB_POINT_TYPE_GENERIC = 3000),
|
||||
/obj/item/slimecross/burning/red = list(TECHWEB_POINT_TYPE_GENERIC = 3250),
|
||||
/obj/item/slimecross/burning/green = list(TECHWEB_POINT_TYPE_GENERIC = 3250),
|
||||
/obj/item/slimecross/burning/pink = list(TECHWEB_POINT_TYPE_GENERIC = 3250),
|
||||
/obj/item/slimecross/burning/gold = list(TECHWEB_POINT_TYPE_GENERIC = 3250),
|
||||
/obj/item/slimecross/burning/oil = list(TECHWEB_POINT_TYPE_GENERIC = 3500),
|
||||
/obj/item/slimecross/burning/black = list(TECHWEB_POINT_TYPE_GENERIC = 3500),
|
||||
/obj/item/slimecross/burning/lightpink = list(TECHWEB_POINT_TYPE_GENERIC = 3500),
|
||||
/obj/item/slimecross/burning/adamantine = list(TECHWEB_POINT_TYPE_GENERIC = 3500),
|
||||
/obj/item/slimecross/burning/rainbow = list(TECHWEB_POINT_TYPE_GENERIC = 3750),
|
||||
/obj/item/slimecross/burning/grey = list(TECHWEB_POINT_TYPE_GENERIC = 2000),
|
||||
/obj/item/slimecross/burning/orange = list(TECHWEB_POINT_TYPE_GENERIC = 2500),
|
||||
/obj/item/slimecross/burning/purple = list(TECHWEB_POINT_TYPE_GENERIC = 2500),
|
||||
/obj/item/slimecross/burning/blue = list(TECHWEB_POINT_TYPE_GENERIC = 2500),
|
||||
/obj/item/slimecross/burning/metal = list(TECHWEB_POINT_TYPE_GENERIC = 2500),
|
||||
/obj/item/slimecross/burning/yellow = list(TECHWEB_POINT_TYPE_GENERIC = 2750),
|
||||
/obj/item/slimecross/burning/darkpurple = list(TECHWEB_POINT_TYPE_GENERIC = 2750),
|
||||
/obj/item/slimecross/burning/darkblue = list(TECHWEB_POINT_TYPE_GENERIC = 2750),
|
||||
/obj/item/slimecross/burning/silver = list(TECHWEB_POINT_TYPE_GENERIC = 2750),
|
||||
/obj/item/slimecross/burning/bluespace = list(TECHWEB_POINT_TYPE_GENERIC = 3000),
|
||||
/obj/item/slimecross/burning/sepia = list(TECHWEB_POINT_TYPE_GENERIC = 3000),
|
||||
/obj/item/slimecross/burning/cerulean = list(TECHWEB_POINT_TYPE_GENERIC = 3000),
|
||||
/obj/item/slimecross/burning/pyrite = list(TECHWEB_POINT_TYPE_GENERIC = 3000),
|
||||
/obj/item/slimecross/burning/red = list(TECHWEB_POINT_TYPE_GENERIC = 3250),
|
||||
/obj/item/slimecross/burning/green = list(TECHWEB_POINT_TYPE_GENERIC = 3250),
|
||||
/obj/item/slimecross/burning/pink = list(TECHWEB_POINT_TYPE_GENERIC = 3250),
|
||||
/obj/item/slimecross/burning/gold = list(TECHWEB_POINT_TYPE_GENERIC = 3250),
|
||||
/obj/item/slimecross/burning/oil = list(TECHWEB_POINT_TYPE_GENERIC = 3500),
|
||||
/obj/item/slimecross/burning/black = list(TECHWEB_POINT_TYPE_GENERIC = 3500),
|
||||
/obj/item/slimecross/burning/lightpink = list(TECHWEB_POINT_TYPE_GENERIC = 3500),
|
||||
/obj/item/slimecross/burning/adamantine = list(TECHWEB_POINT_TYPE_GENERIC = 3500),
|
||||
/obj/item/slimecross/burning/rainbow = list(TECHWEB_POINT_TYPE_GENERIC = 3750),
|
||||
// Regenerative - Crossbreading Cores! - (Purple Cores)
|
||||
/obj/item/slimecross/regenerative/grey = list(TECHWEB_POINT_TYPE_GENERIC = 2000),
|
||||
/obj/item/slimecross/regenerative/orange = list(TECHWEB_POINT_TYPE_GENERIC = 2500),
|
||||
/obj/item/slimecross/regenerative/purple = list(TECHWEB_POINT_TYPE_GENERIC = 2500),
|
||||
/obj/item/slimecross/regenerative/blue = list(TECHWEB_POINT_TYPE_GENERIC = 2500),
|
||||
/obj/item/slimecross/regenerative/metal = list(TECHWEB_POINT_TYPE_GENERIC = 2500),
|
||||
/obj/item/slimecross/regenerative/yellow = list(TECHWEB_POINT_TYPE_GENERIC = 2750),
|
||||
/obj/item/slimecross/regenerative/darkpurple = list(TECHWEB_POINT_TYPE_GENERIC = 2750),
|
||||
/obj/item/slimecross/regenerative/darkblue = list(TECHWEB_POINT_TYPE_GENERIC = 2750),
|
||||
/obj/item/slimecross/regenerative/silver = list(TECHWEB_POINT_TYPE_GENERIC = 2750),
|
||||
/obj/item/slimecross/regenerative/bluespace = list(TECHWEB_POINT_TYPE_GENERIC = 3000),
|
||||
/obj/item/slimecross/regenerative/sepia = list(TECHWEB_POINT_TYPE_GENERIC = 3000),
|
||||
/obj/item/slimecross/regenerative/cerulean = list(TECHWEB_POINT_TYPE_GENERIC = 3000),
|
||||
/obj/item/slimecross/regenerative/pyrite = list(TECHWEB_POINT_TYPE_GENERIC = 3000),
|
||||
/obj/item/slimecross/regenerative/red = list(TECHWEB_POINT_TYPE_GENERIC = 3250),
|
||||
/obj/item/slimecross/regenerative/green = list(TECHWEB_POINT_TYPE_GENERIC = 3250),
|
||||
/obj/item/slimecross/regenerative/pink = list(TECHWEB_POINT_TYPE_GENERIC = 3250),
|
||||
/obj/item/slimecross/regenerative/gold = list(TECHWEB_POINT_TYPE_GENERIC = 3250),
|
||||
/obj/item/slimecross/regenerative/oil = list(TECHWEB_POINT_TYPE_GENERIC = 3500),
|
||||
/obj/item/slimecross/regenerative/black = list(TECHWEB_POINT_TYPE_GENERIC = 3500),
|
||||
/obj/item/slimecross/regenerative/lightpink = list(TECHWEB_POINT_TYPE_GENERIC = 3500),
|
||||
/obj/item/slimecross/regenerative/adamantine = list(TECHWEB_POINT_TYPE_GENERIC = 3500),
|
||||
/obj/item/slimecross/regenerative/rainbow = list(TECHWEB_POINT_TYPE_GENERIC = 3750),
|
||||
/obj/item/slimecross/regenerative/grey = list(TECHWEB_POINT_TYPE_GENERIC = 2000),
|
||||
/obj/item/slimecross/regenerative/orange = list(TECHWEB_POINT_TYPE_GENERIC = 2500),
|
||||
/obj/item/slimecross/regenerative/purple = list(TECHWEB_POINT_TYPE_GENERIC = 2500),
|
||||
/obj/item/slimecross/regenerative/blue = list(TECHWEB_POINT_TYPE_GENERIC = 2500),
|
||||
/obj/item/slimecross/regenerative/metal = list(TECHWEB_POINT_TYPE_GENERIC = 2500),
|
||||
/obj/item/slimecross/regenerative/yellow = list(TECHWEB_POINT_TYPE_GENERIC = 2750),
|
||||
/obj/item/slimecross/regenerative/darkpurple = list(TECHWEB_POINT_TYPE_GENERIC = 2750),
|
||||
/obj/item/slimecross/regenerative/darkblue = list(TECHWEB_POINT_TYPE_GENERIC = 2750),
|
||||
/obj/item/slimecross/regenerative/silver = list(TECHWEB_POINT_TYPE_GENERIC = 2750),
|
||||
/obj/item/slimecross/regenerative/bluespace = list(TECHWEB_POINT_TYPE_GENERIC = 3000),
|
||||
/obj/item/slimecross/regenerative/sepia = list(TECHWEB_POINT_TYPE_GENERIC = 3000),
|
||||
/obj/item/slimecross/regenerative/cerulean = list(TECHWEB_POINT_TYPE_GENERIC = 3000),
|
||||
/obj/item/slimecross/regenerative/pyrite = list(TECHWEB_POINT_TYPE_GENERIC = 3000),
|
||||
/obj/item/slimecross/regenerative/red = list(TECHWEB_POINT_TYPE_GENERIC = 3250),
|
||||
/obj/item/slimecross/regenerative/green = list(TECHWEB_POINT_TYPE_GENERIC = 3250),
|
||||
/obj/item/slimecross/regenerative/pink = list(TECHWEB_POINT_TYPE_GENERIC = 3250),
|
||||
/obj/item/slimecross/regenerative/gold = list(TECHWEB_POINT_TYPE_GENERIC = 3250),
|
||||
/obj/item/slimecross/regenerative/oil = list(TECHWEB_POINT_TYPE_GENERIC = 3500),
|
||||
/obj/item/slimecross/regenerative/black = list(TECHWEB_POINT_TYPE_GENERIC = 3500),
|
||||
/obj/item/slimecross/regenerative/lightpink = list(TECHWEB_POINT_TYPE_GENERIC = 3500),
|
||||
/obj/item/slimecross/regenerative/adamantine = list(TECHWEB_POINT_TYPE_GENERIC = 3500),
|
||||
/obj/item/slimecross/regenerative/rainbow = list(TECHWEB_POINT_TYPE_GENERIC = 3750),
|
||||
// Stabilized - Crossbreading Cores! - (Blue Cores)
|
||||
/obj/item/slimecross/stabilized/grey = list(TECHWEB_POINT_TYPE_GENERIC = 2000),
|
||||
/obj/item/slimecross/stabilized/orange = list(TECHWEB_POINT_TYPE_GENERIC = 2500),
|
||||
/obj/item/slimecross/stabilized/purple = list(TECHWEB_POINT_TYPE_GENERIC = 2500),
|
||||
/obj/item/slimecross/stabilized/blue = list(TECHWEB_POINT_TYPE_GENERIC = 2500),
|
||||
/obj/item/slimecross/stabilized/metal = list(TECHWEB_POINT_TYPE_GENERIC = 2500),
|
||||
/obj/item/slimecross/stabilized/yellow = list(TECHWEB_POINT_TYPE_GENERIC = 2750),
|
||||
/obj/item/slimecross/stabilized/darkpurple = list(TECHWEB_POINT_TYPE_GENERIC = 2750),
|
||||
/obj/item/slimecross/stabilized/darkblue = list(TECHWEB_POINT_TYPE_GENERIC = 2750),
|
||||
/obj/item/slimecross/stabilized/silver = list(TECHWEB_POINT_TYPE_GENERIC = 2750),
|
||||
/obj/item/slimecross/stabilized/bluespace = list(TECHWEB_POINT_TYPE_GENERIC = 3000),
|
||||
/obj/item/slimecross/stabilized/sepia = list(TECHWEB_POINT_TYPE_GENERIC = 3000),
|
||||
/obj/item/slimecross/stabilized/cerulean = list(TECHWEB_POINT_TYPE_GENERIC = 3000),
|
||||
/obj/item/slimecross/stabilized/pyrite = list(TECHWEB_POINT_TYPE_GENERIC = 3000),
|
||||
/obj/item/slimecross/stabilized/red = list(TECHWEB_POINT_TYPE_GENERIC = 3250),
|
||||
/obj/item/slimecross/stabilized/green = list(TECHWEB_POINT_TYPE_GENERIC = 3250),
|
||||
/obj/item/slimecross/stabilized/pink = list(TECHWEB_POINT_TYPE_GENERIC = 3250),
|
||||
/obj/item/slimecross/stabilized/gold = list(TECHWEB_POINT_TYPE_GENERIC = 3250),
|
||||
/obj/item/slimecross/stabilized/oil = list(TECHWEB_POINT_TYPE_GENERIC = 3500),
|
||||
/obj/item/slimecross/stabilized/black = list(TECHWEB_POINT_TYPE_GENERIC = 3500),
|
||||
/obj/item/slimecross/stabilized/lightpink = list(TECHWEB_POINT_TYPE_GENERIC = 3500),
|
||||
/obj/item/slimecross/stabilized/adamantine = list(TECHWEB_POINT_TYPE_GENERIC = 3500),
|
||||
/obj/item/slimecross/stabilized/rainbow = list(TECHWEB_POINT_TYPE_GENERIC = 3750),
|
||||
/obj/item/slimecross/stabilized/grey = list(TECHWEB_POINT_TYPE_GENERIC = 2000),
|
||||
/obj/item/slimecross/stabilized/orange = list(TECHWEB_POINT_TYPE_GENERIC = 2500),
|
||||
/obj/item/slimecross/stabilized/purple = list(TECHWEB_POINT_TYPE_GENERIC = 2500),
|
||||
/obj/item/slimecross/stabilized/blue = list(TECHWEB_POINT_TYPE_GENERIC = 2500),
|
||||
/obj/item/slimecross/stabilized/metal = list(TECHWEB_POINT_TYPE_GENERIC = 2500),
|
||||
/obj/item/slimecross/stabilized/yellow = list(TECHWEB_POINT_TYPE_GENERIC = 2750),
|
||||
/obj/item/slimecross/stabilized/darkpurple = list(TECHWEB_POINT_TYPE_GENERIC = 2750),
|
||||
/obj/item/slimecross/stabilized/darkblue = list(TECHWEB_POINT_TYPE_GENERIC = 2750),
|
||||
/obj/item/slimecross/stabilized/silver = list(TECHWEB_POINT_TYPE_GENERIC = 2750),
|
||||
/obj/item/slimecross/stabilized/bluespace = list(TECHWEB_POINT_TYPE_GENERIC = 3000),
|
||||
/obj/item/slimecross/stabilized/sepia = list(TECHWEB_POINT_TYPE_GENERIC = 3000),
|
||||
/obj/item/slimecross/stabilized/cerulean = list(TECHWEB_POINT_TYPE_GENERIC = 3000),
|
||||
/obj/item/slimecross/stabilized/pyrite = list(TECHWEB_POINT_TYPE_GENERIC = 3000),
|
||||
/obj/item/slimecross/stabilized/red = list(TECHWEB_POINT_TYPE_GENERIC = 3250),
|
||||
/obj/item/slimecross/stabilized/green = list(TECHWEB_POINT_TYPE_GENERIC = 3250),
|
||||
/obj/item/slimecross/stabilized/pink = list(TECHWEB_POINT_TYPE_GENERIC = 3250),
|
||||
/obj/item/slimecross/stabilized/gold = list(TECHWEB_POINT_TYPE_GENERIC = 3250),
|
||||
/obj/item/slimecross/stabilized/oil = list(TECHWEB_POINT_TYPE_GENERIC = 3500),
|
||||
/obj/item/slimecross/stabilized/black = list(TECHWEB_POINT_TYPE_GENERIC = 3500),
|
||||
/obj/item/slimecross/stabilized/lightpink = list(TECHWEB_POINT_TYPE_GENERIC = 3500),
|
||||
/obj/item/slimecross/stabilized/adamantine = list(TECHWEB_POINT_TYPE_GENERIC = 3500),
|
||||
/obj/item/slimecross/stabilized/rainbow = list(TECHWEB_POINT_TYPE_GENERIC = 3750),
|
||||
// Industrial - Crossbreading Cores! - (Metal Cores)
|
||||
/obj/item/slimecross/industrial/grey = list(TECHWEB_POINT_TYPE_GENERIC = 2000),
|
||||
/obj/item/slimecross/industrial/orange = list(TECHWEB_POINT_TYPE_GENERIC = 2500),
|
||||
/obj/item/slimecross/industrial/purple = list(TECHWEB_POINT_TYPE_GENERIC = 2500),
|
||||
/obj/item/slimecross/industrial/blue = list(TECHWEB_POINT_TYPE_GENERIC = 2500),
|
||||
/obj/item/slimecross/industrial/metal = list(TECHWEB_POINT_TYPE_GENERIC = 2500),
|
||||
/obj/item/slimecross/industrial/yellow = list(TECHWEB_POINT_TYPE_GENERIC = 2750),
|
||||
/obj/item/slimecross/industrial/darkpurple = list(TECHWEB_POINT_TYPE_GENERIC = 2750),
|
||||
/obj/item/slimecross/industrial/darkblue = list(TECHWEB_POINT_TYPE_GENERIC = 2750),
|
||||
/obj/item/slimecross/industrial/silver = list(TECHWEB_POINT_TYPE_GENERIC = 2750),
|
||||
/obj/item/slimecross/industrial/bluespace = list(TECHWEB_POINT_TYPE_GENERIC = 3000),
|
||||
/obj/item/slimecross/industrial/sepia = list(TECHWEB_POINT_TYPE_GENERIC = 3000),
|
||||
/obj/item/slimecross/industrial/cerulean = list(TECHWEB_POINT_TYPE_GENERIC = 3000),
|
||||
/obj/item/slimecross/industrial/pyrite = list(TECHWEB_POINT_TYPE_GENERIC = 3000),
|
||||
/obj/item/slimecross/industrial/red = list(TECHWEB_POINT_TYPE_GENERIC = 3250),
|
||||
/obj/item/slimecross/industrial/green = list(TECHWEB_POINT_TYPE_GENERIC = 3250),
|
||||
/obj/item/slimecross/industrial/pink = list(TECHWEB_POINT_TYPE_GENERIC = 3250),
|
||||
/obj/item/slimecross/industrial/gold = list(TECHWEB_POINT_TYPE_GENERIC = 3250),
|
||||
/obj/item/slimecross/industrial/oil = list(TECHWEB_POINT_TYPE_GENERIC = 3500),
|
||||
/obj/item/slimecross/industrial/black = list(TECHWEB_POINT_TYPE_GENERIC = 3500),
|
||||
/obj/item/slimecross/industrial/lightpink = list(TECHWEB_POINT_TYPE_GENERIC = 3500),
|
||||
/obj/item/slimecross/industrial/adamantine = list(TECHWEB_POINT_TYPE_GENERIC = 3500),
|
||||
/obj/item/slimecross/industrial/rainbow = list(TECHWEB_POINT_TYPE_GENERIC = 3750),
|
||||
/obj/item/slimecross/industrial/grey = list(TECHWEB_POINT_TYPE_GENERIC = 2000),
|
||||
/obj/item/slimecross/industrial/orange = list(TECHWEB_POINT_TYPE_GENERIC = 2500),
|
||||
/obj/item/slimecross/industrial/purple = list(TECHWEB_POINT_TYPE_GENERIC = 2500),
|
||||
/obj/item/slimecross/industrial/blue = list(TECHWEB_POINT_TYPE_GENERIC = 2500),
|
||||
/obj/item/slimecross/industrial/metal = list(TECHWEB_POINT_TYPE_GENERIC = 2500),
|
||||
/obj/item/slimecross/industrial/yellow = list(TECHWEB_POINT_TYPE_GENERIC = 2750),
|
||||
/obj/item/slimecross/industrial/darkpurple = list(TECHWEB_POINT_TYPE_GENERIC = 2750),
|
||||
/obj/item/slimecross/industrial/darkblue = list(TECHWEB_POINT_TYPE_GENERIC = 2750),
|
||||
/obj/item/slimecross/industrial/silver = list(TECHWEB_POINT_TYPE_GENERIC = 2750),
|
||||
/obj/item/slimecross/industrial/bluespace = list(TECHWEB_POINT_TYPE_GENERIC = 3000),
|
||||
/obj/item/slimecross/industrial/sepia = list(TECHWEB_POINT_TYPE_GENERIC = 3000),
|
||||
/obj/item/slimecross/industrial/cerulean = list(TECHWEB_POINT_TYPE_GENERIC = 3000),
|
||||
/obj/item/slimecross/industrial/pyrite = list(TECHWEB_POINT_TYPE_GENERIC = 3000),
|
||||
/obj/item/slimecross/industrial/red = list(TECHWEB_POINT_TYPE_GENERIC = 3250),
|
||||
/obj/item/slimecross/industrial/green = list(TECHWEB_POINT_TYPE_GENERIC = 3250),
|
||||
/obj/item/slimecross/industrial/pink = list(TECHWEB_POINT_TYPE_GENERIC = 3250),
|
||||
/obj/item/slimecross/industrial/gold = list(TECHWEB_POINT_TYPE_GENERIC = 3250),
|
||||
/obj/item/slimecross/industrial/oil = list(TECHWEB_POINT_TYPE_GENERIC = 3500),
|
||||
/obj/item/slimecross/industrial/black = list(TECHWEB_POINT_TYPE_GENERIC = 3500),
|
||||
/obj/item/slimecross/industrial/lightpink = list(TECHWEB_POINT_TYPE_GENERIC = 3500),
|
||||
/obj/item/slimecross/industrial/adamantine = list(TECHWEB_POINT_TYPE_GENERIC = 3500),
|
||||
/obj/item/slimecross/industrial/rainbow = list(TECHWEB_POINT_TYPE_GENERIC = 3750),
|
||||
// Charged - Crossbreading Cores! - (Yellow Cores)
|
||||
/obj/item/slimecross/charged/grey = list(TECHWEB_POINT_TYPE_GENERIC = 2250),
|
||||
/obj/item/slimecross/charged/orange = list(TECHWEB_POINT_TYPE_GENERIC = 2750),
|
||||
/obj/item/slimecross/charged/purple = list(TECHWEB_POINT_TYPE_GENERIC = 2750),
|
||||
/obj/item/slimecross/charged/blue = list(TECHWEB_POINT_TYPE_GENERIC = 2750),
|
||||
/obj/item/slimecross/charged/metal = list(TECHWEB_POINT_TYPE_GENERIC = 2750),
|
||||
/obj/item/slimecross/charged/yellow = list(TECHWEB_POINT_TYPE_GENERIC = 3000),
|
||||
/obj/item/slimecross/charged/darkpurple = list(TECHWEB_POINT_TYPE_GENERIC = 3000),
|
||||
/obj/item/slimecross/charged/darkblue = list(TECHWEB_POINT_TYPE_GENERIC = 3000),
|
||||
/obj/item/slimecross/charged/silver = list(TECHWEB_POINT_TYPE_GENERIC = 3000),
|
||||
/obj/item/slimecross/charged/bluespace = list(TECHWEB_POINT_TYPE_GENERIC = 3250),
|
||||
/obj/item/slimecross/charged/sepia = list(TECHWEB_POINT_TYPE_GENERIC = 3250),
|
||||
/obj/item/slimecross/charged/cerulean = list(TECHWEB_POINT_TYPE_GENERIC = 3250),
|
||||
/obj/item/slimecross/charged/pyrite = list(TECHWEB_POINT_TYPE_GENERIC = 3250),
|
||||
/obj/item/slimecross/charged/red = list(TECHWEB_POINT_TYPE_GENERIC = 3500),
|
||||
/obj/item/slimecross/charged/green = list(TECHWEB_POINT_TYPE_GENERIC = 3500),
|
||||
/obj/item/slimecross/charged/pink = list(TECHWEB_POINT_TYPE_GENERIC = 3500),
|
||||
/obj/item/slimecross/charged/gold = list(TECHWEB_POINT_TYPE_GENERIC = 3500),
|
||||
/obj/item/slimecross/charged/oil = list(TECHWEB_POINT_TYPE_GENERIC = 3750),
|
||||
/obj/item/slimecross/charged/black = list(TECHWEB_POINT_TYPE_GENERIC = 3750),
|
||||
/obj/item/slimecross/charged/lightpink = list(TECHWEB_POINT_TYPE_GENERIC = 3750),
|
||||
/obj/item/slimecross/charged/adamantine = list(TECHWEB_POINT_TYPE_GENERIC = 3750),
|
||||
/obj/item/slimecross/charged/rainbow = list(TECHWEB_POINT_TYPE_GENERIC = 4000),
|
||||
/obj/item/slimecross/charged/grey = list(TECHWEB_POINT_TYPE_GENERIC = 2250),
|
||||
/obj/item/slimecross/charged/orange = list(TECHWEB_POINT_TYPE_GENERIC = 2750),
|
||||
/obj/item/slimecross/charged/purple = list(TECHWEB_POINT_TYPE_GENERIC = 2750),
|
||||
/obj/item/slimecross/charged/blue = list(TECHWEB_POINT_TYPE_GENERIC = 2750),
|
||||
/obj/item/slimecross/charged/metal = list(TECHWEB_POINT_TYPE_GENERIC = 2750),
|
||||
/obj/item/slimecross/charged/yellow = list(TECHWEB_POINT_TYPE_GENERIC = 3000),
|
||||
/obj/item/slimecross/charged/darkpurple = list(TECHWEB_POINT_TYPE_GENERIC = 3000),
|
||||
/obj/item/slimecross/charged/darkblue = list(TECHWEB_POINT_TYPE_GENERIC = 3000),
|
||||
/obj/item/slimecross/charged/silver = list(TECHWEB_POINT_TYPE_GENERIC = 3000),
|
||||
/obj/item/slimecross/charged/bluespace = list(TECHWEB_POINT_TYPE_GENERIC = 3250),
|
||||
/obj/item/slimecross/charged/sepia = list(TECHWEB_POINT_TYPE_GENERIC = 3250),
|
||||
/obj/item/slimecross/charged/cerulean = list(TECHWEB_POINT_TYPE_GENERIC = 3250),
|
||||
/obj/item/slimecross/charged/pyrite = list(TECHWEB_POINT_TYPE_GENERIC = 3250),
|
||||
/obj/item/slimecross/charged/red = list(TECHWEB_POINT_TYPE_GENERIC = 3500),
|
||||
/obj/item/slimecross/charged/green = list(TECHWEB_POINT_TYPE_GENERIC = 3500),
|
||||
/obj/item/slimecross/charged/pink = list(TECHWEB_POINT_TYPE_GENERIC = 3500),
|
||||
/obj/item/slimecross/charged/gold = list(TECHWEB_POINT_TYPE_GENERIC = 3500),
|
||||
/obj/item/slimecross/charged/oil = list(TECHWEB_POINT_TYPE_GENERIC = 3750),
|
||||
/obj/item/slimecross/charged/black = list(TECHWEB_POINT_TYPE_GENERIC = 3750),
|
||||
/obj/item/slimecross/charged/lightpink = list(TECHWEB_POINT_TYPE_GENERIC = 3750),
|
||||
/obj/item/slimecross/charged/adamantine = list(TECHWEB_POINT_TYPE_GENERIC = 3750),
|
||||
/obj/item/slimecross/charged/rainbow = list(TECHWEB_POINT_TYPE_GENERIC = 4000),
|
||||
// Selfsustaining - Crossbreading Cores! - (Dark Purple Cores)
|
||||
/obj/item/slimecross/selfsustaining/grey = list(TECHWEB_POINT_TYPE_GENERIC = 2250),
|
||||
/obj/item/slimecross/selfsustaining/orange = list(TECHWEB_POINT_TYPE_GENERIC = 2750),
|
||||
/obj/item/slimecross/selfsustaining/purple = list(TECHWEB_POINT_TYPE_GENERIC = 2750),
|
||||
/obj/item/slimecross/selfsustaining/blue = list(TECHWEB_POINT_TYPE_GENERIC = 2750),
|
||||
/obj/item/slimecross/selfsustaining/metal = list(TECHWEB_POINT_TYPE_GENERIC = 2750),
|
||||
/obj/item/slimecross/selfsustaining/yellow = list(TECHWEB_POINT_TYPE_GENERIC = 3000),
|
||||
/obj/item/slimecross/selfsustaining/grey = list(TECHWEB_POINT_TYPE_GENERIC = 2250),
|
||||
/obj/item/slimecross/selfsustaining/orange = list(TECHWEB_POINT_TYPE_GENERIC = 2750),
|
||||
/obj/item/slimecross/selfsustaining/purple = list(TECHWEB_POINT_TYPE_GENERIC = 2750),
|
||||
/obj/item/slimecross/selfsustaining/blue = list(TECHWEB_POINT_TYPE_GENERIC = 2750),
|
||||
/obj/item/slimecross/selfsustaining/metal = list(TECHWEB_POINT_TYPE_GENERIC = 2750),
|
||||
/obj/item/slimecross/selfsustaining/yellow = list(TECHWEB_POINT_TYPE_GENERIC = 3000),
|
||||
/obj/item/slimecross/selfsustaining/darkpurple = list(TECHWEB_POINT_TYPE_GENERIC = 3000),
|
||||
/obj/item/slimecross/selfsustaining/darkblue = list(TECHWEB_POINT_TYPE_GENERIC = 3000),
|
||||
/obj/item/slimecross/selfsustaining/silver = list(TECHWEB_POINT_TYPE_GENERIC = 3000),
|
||||
/obj/item/slimecross/selfsustaining/bluespace = list(TECHWEB_POINT_TYPE_GENERIC = 3250),
|
||||
/obj/item/slimecross/selfsustaining/sepia = list(TECHWEB_POINT_TYPE_GENERIC = 3250),
|
||||
/obj/item/slimecross/selfsustaining/cerulean = list(TECHWEB_POINT_TYPE_GENERIC = 3250),
|
||||
/obj/item/slimecross/selfsustaining/pyrite = list(TECHWEB_POINT_TYPE_GENERIC = 3250),
|
||||
/obj/item/slimecross/selfsustaining/red = list(TECHWEB_POINT_TYPE_GENERIC = 3500),
|
||||
/obj/item/slimecross/selfsustaining/green = list(TECHWEB_POINT_TYPE_GENERIC = 3500),
|
||||
/obj/item/slimecross/selfsustaining/pink = list(TECHWEB_POINT_TYPE_GENERIC = 3500),
|
||||
/obj/item/slimecross/selfsustaining/gold = list(TECHWEB_POINT_TYPE_GENERIC = 3500),
|
||||
/obj/item/slimecross/selfsustaining/oil = list(TECHWEB_POINT_TYPE_GENERIC = 3750),
|
||||
/obj/item/slimecross/selfsustaining/black = list(TECHWEB_POINT_TYPE_GENERIC = 3750),
|
||||
/obj/item/slimecross/selfsustaining/lightpink = list(TECHWEB_POINT_TYPE_GENERIC = 3750),
|
||||
/obj/item/slimecross/selfsustaining/darkblue = list(TECHWEB_POINT_TYPE_GENERIC = 3000),
|
||||
/obj/item/slimecross/selfsustaining/silver = list(TECHWEB_POINT_TYPE_GENERIC = 3000),
|
||||
/obj/item/slimecross/selfsustaining/bluespace = list(TECHWEB_POINT_TYPE_GENERIC = 3250),
|
||||
/obj/item/slimecross/selfsustaining/sepia = list(TECHWEB_POINT_TYPE_GENERIC = 3250),
|
||||
/obj/item/slimecross/selfsustaining/cerulean = list(TECHWEB_POINT_TYPE_GENERIC = 3250),
|
||||
/obj/item/slimecross/selfsustaining/pyrite = list(TECHWEB_POINT_TYPE_GENERIC = 3250),
|
||||
/obj/item/slimecross/selfsustaining/red = list(TECHWEB_POINT_TYPE_GENERIC = 3500),
|
||||
/obj/item/slimecross/selfsustaining/green = list(TECHWEB_POINT_TYPE_GENERIC = 3500),
|
||||
/obj/item/slimecross/selfsustaining/pink = list(TECHWEB_POINT_TYPE_GENERIC = 3500),
|
||||
/obj/item/slimecross/selfsustaining/gold = list(TECHWEB_POINT_TYPE_GENERIC = 3500),
|
||||
/obj/item/slimecross/selfsustaining/oil = list(TECHWEB_POINT_TYPE_GENERIC = 3750),
|
||||
/obj/item/slimecross/selfsustaining/black = list(TECHWEB_POINT_TYPE_GENERIC = 3750),
|
||||
/obj/item/slimecross/selfsustaining/lightpink = list(TECHWEB_POINT_TYPE_GENERIC = 3750),
|
||||
/obj/item/slimecross/selfsustaining/adamantine = list(TECHWEB_POINT_TYPE_GENERIC = 3750),
|
||||
/obj/item/slimecross/selfsustaining/rainbow = list(TECHWEB_POINT_TYPE_GENERIC = 4000),
|
||||
/obj/item/slimecross/selfsustaining/rainbow = list(TECHWEB_POINT_TYPE_GENERIC = 4000),
|
||||
// Consuming - Crossbreading Cores! - (Sliver Cores)
|
||||
/obj/item/slimecross/consuming/grey = list(TECHWEB_POINT_TYPE_GENERIC = 2250),
|
||||
/obj/item/slimecross/consuming/orange = list(TECHWEB_POINT_TYPE_GENERIC = 2750),
|
||||
/obj/item/slimecross/consuming/purple = list(TECHWEB_POINT_TYPE_GENERIC = 2750),
|
||||
/obj/item/slimecross/consuming/blue = list(TECHWEB_POINT_TYPE_GENERIC = 2750),
|
||||
/obj/item/slimecross/consuming/metal = list(TECHWEB_POINT_TYPE_GENERIC = 2750),
|
||||
/obj/item/slimecross/consuming/yellow = list(TECHWEB_POINT_TYPE_GENERIC = 3000),
|
||||
/obj/item/slimecross/consuming/darkpurple = list(TECHWEB_POINT_TYPE_GENERIC = 3000),
|
||||
/obj/item/slimecross/consuming/darkblue = list(TECHWEB_POINT_TYPE_GENERIC = 3000),
|
||||
/obj/item/slimecross/consuming/silver = list(TECHWEB_POINT_TYPE_GENERIC = 3000),
|
||||
/obj/item/slimecross/consuming/bluespace = list(TECHWEB_POINT_TYPE_GENERIC = 3250),
|
||||
/obj/item/slimecross/consuming/sepia = list(TECHWEB_POINT_TYPE_GENERIC = 3250),
|
||||
/obj/item/slimecross/consuming/cerulean = list(TECHWEB_POINT_TYPE_GENERIC = 3250),
|
||||
/obj/item/slimecross/consuming/pyrite = list(TECHWEB_POINT_TYPE_GENERIC = 3250),
|
||||
/obj/item/slimecross/consuming/red = list(TECHWEB_POINT_TYPE_GENERIC = 3500),
|
||||
/obj/item/slimecross/consuming/green = list(TECHWEB_POINT_TYPE_GENERIC = 3500),
|
||||
/obj/item/slimecross/consuming/pink = list(TECHWEB_POINT_TYPE_GENERIC = 3500),
|
||||
/obj/item/slimecross/consuming/gold = list(TECHWEB_POINT_TYPE_GENERIC = 3500),
|
||||
/obj/item/slimecross/consuming/oil = list(TECHWEB_POINT_TYPE_GENERIC = 3750),
|
||||
/obj/item/slimecross/consuming/black = list(TECHWEB_POINT_TYPE_GENERIC = 3750),
|
||||
/obj/item/slimecross/consuming/lightpink = list(TECHWEB_POINT_TYPE_GENERIC = 3750),
|
||||
/obj/item/slimecross/consuming/adamantine = list(TECHWEB_POINT_TYPE_GENERIC = 3750),
|
||||
/obj/item/slimecross/consuming/rainbow = list(TECHWEB_POINT_TYPE_GENERIC = 4000),
|
||||
/obj/item/slimecross/consuming/grey = list(TECHWEB_POINT_TYPE_GENERIC = 2250),
|
||||
/obj/item/slimecross/consuming/orange = list(TECHWEB_POINT_TYPE_GENERIC = 2750),
|
||||
/obj/item/slimecross/consuming/purple = list(TECHWEB_POINT_TYPE_GENERIC = 2750),
|
||||
/obj/item/slimecross/consuming/blue = list(TECHWEB_POINT_TYPE_GENERIC = 2750),
|
||||
/obj/item/slimecross/consuming/metal = list(TECHWEB_POINT_TYPE_GENERIC = 2750),
|
||||
/obj/item/slimecross/consuming/yellow = list(TECHWEB_POINT_TYPE_GENERIC = 3000),
|
||||
/obj/item/slimecross/consuming/darkpurple = list(TECHWEB_POINT_TYPE_GENERIC = 3000),
|
||||
/obj/item/slimecross/consuming/darkblue = list(TECHWEB_POINT_TYPE_GENERIC = 3000),
|
||||
/obj/item/slimecross/consuming/silver = list(TECHWEB_POINT_TYPE_GENERIC = 3000),
|
||||
/obj/item/slimecross/consuming/bluespace = list(TECHWEB_POINT_TYPE_GENERIC = 3250),
|
||||
/obj/item/slimecross/consuming/sepia = list(TECHWEB_POINT_TYPE_GENERIC = 3250),
|
||||
/obj/item/slimecross/consuming/cerulean = list(TECHWEB_POINT_TYPE_GENERIC = 3250),
|
||||
/obj/item/slimecross/consuming/pyrite = list(TECHWEB_POINT_TYPE_GENERIC = 3250),
|
||||
/obj/item/slimecross/consuming/red = list(TECHWEB_POINT_TYPE_GENERIC = 3500),
|
||||
/obj/item/slimecross/consuming/green = list(TECHWEB_POINT_TYPE_GENERIC = 3500),
|
||||
/obj/item/slimecross/consuming/pink = list(TECHWEB_POINT_TYPE_GENERIC = 3500),
|
||||
/obj/item/slimecross/consuming/gold = list(TECHWEB_POINT_TYPE_GENERIC = 3500),
|
||||
/obj/item/slimecross/consuming/oil = list(TECHWEB_POINT_TYPE_GENERIC = 3750),
|
||||
/obj/item/slimecross/consuming/black = list(TECHWEB_POINT_TYPE_GENERIC = 3750),
|
||||
/obj/item/slimecross/consuming/lightpink = list(TECHWEB_POINT_TYPE_GENERIC = 3750),
|
||||
/obj/item/slimecross/consuming/adamantine = list(TECHWEB_POINT_TYPE_GENERIC = 3750),
|
||||
/obj/item/slimecross/consuming/rainbow = list(TECHWEB_POINT_TYPE_GENERIC = 4000),
|
||||
// Prismatic - Crossbreading Cores! - (Pyrite Cores)
|
||||
/obj/item/slimecross/prismatic/grey = list(TECHWEB_POINT_TYPE_GENERIC = 2500),
|
||||
/obj/item/slimecross/prismatic/orange = list(TECHWEB_POINT_TYPE_GENERIC = 3000),
|
||||
/obj/item/slimecross/prismatic/purple = list(TECHWEB_POINT_TYPE_GENERIC = 3000),
|
||||
/obj/item/slimecross/prismatic/blue = list(TECHWEB_POINT_TYPE_GENERIC = 3000),
|
||||
/obj/item/slimecross/prismatic/metal = list(TECHWEB_POINT_TYPE_GENERIC = 3000),
|
||||
/obj/item/slimecross/prismatic/yellow = list(TECHWEB_POINT_TYPE_GENERIC = 3250),
|
||||
/obj/item/slimecross/prismatic/darkpurple = list(TECHWEB_POINT_TYPE_GENERIC = 3250),
|
||||
/obj/item/slimecross/prismatic/darkblue = list(TECHWEB_POINT_TYPE_GENERIC = 3250),
|
||||
/obj/item/slimecross/prismatic/silver = list(TECHWEB_POINT_TYPE_GENERIC = 3250),
|
||||
/obj/item/slimecross/prismatic/bluespace = list(TECHWEB_POINT_TYPE_GENERIC = 3500),
|
||||
/obj/item/slimecross/prismatic/sepia = list(TECHWEB_POINT_TYPE_GENERIC = 3500),
|
||||
/obj/item/slimecross/prismatic/cerulean = list(TECHWEB_POINT_TYPE_GENERIC = 3500),
|
||||
/obj/item/slimecross/prismatic/pyrite = list(TECHWEB_POINT_TYPE_GENERIC = 3500),
|
||||
/obj/item/slimecross/prismatic/red = list(TECHWEB_POINT_TYPE_GENERIC = 3750),
|
||||
/obj/item/slimecross/prismatic/green = list(TECHWEB_POINT_TYPE_GENERIC = 3750),
|
||||
/obj/item/slimecross/prismatic/pink = list(TECHWEB_POINT_TYPE_GENERIC = 3750),
|
||||
/obj/item/slimecross/prismatic/gold = list(TECHWEB_POINT_TYPE_GENERIC = 3750),
|
||||
/obj/item/slimecross/prismatic/oil = list(TECHWEB_POINT_TYPE_GENERIC = 4000),
|
||||
/obj/item/slimecross/prismatic/black = list(TECHWEB_POINT_TYPE_GENERIC = 4000),
|
||||
/obj/item/slimecross/prismatic/lightpink = list(TECHWEB_POINT_TYPE_GENERIC = 4000),
|
||||
/obj/item/slimecross/prismatic/adamantine = list(TECHWEB_POINT_TYPE_GENERIC = 4000),
|
||||
/obj/item/slimecross/prismatic/rainbow = list(TECHWEB_POINT_TYPE_GENERIC = 4250),
|
||||
/obj/item/slimecross/prismatic/grey = list(TECHWEB_POINT_TYPE_GENERIC = 2500),
|
||||
/obj/item/slimecross/prismatic/orange = list(TECHWEB_POINT_TYPE_GENERIC = 3000),
|
||||
/obj/item/slimecross/prismatic/purple = list(TECHWEB_POINT_TYPE_GENERIC = 3000),
|
||||
/obj/item/slimecross/prismatic/blue = list(TECHWEB_POINT_TYPE_GENERIC = 3000),
|
||||
/obj/item/slimecross/prismatic/metal = list(TECHWEB_POINT_TYPE_GENERIC = 3000),
|
||||
/obj/item/slimecross/prismatic/yellow = list(TECHWEB_POINT_TYPE_GENERIC = 3250),
|
||||
/obj/item/slimecross/prismatic/darkpurple = list(TECHWEB_POINT_TYPE_GENERIC = 3250),
|
||||
/obj/item/slimecross/prismatic/darkblue = list(TECHWEB_POINT_TYPE_GENERIC = 3250),
|
||||
/obj/item/slimecross/prismatic/silver = list(TECHWEB_POINT_TYPE_GENERIC = 3250),
|
||||
/obj/item/slimecross/prismatic/bluespace = list(TECHWEB_POINT_TYPE_GENERIC = 3500),
|
||||
/obj/item/slimecross/prismatic/sepia = list(TECHWEB_POINT_TYPE_GENERIC = 3500),
|
||||
/obj/item/slimecross/prismatic/cerulean = list(TECHWEB_POINT_TYPE_GENERIC = 3500),
|
||||
/obj/item/slimecross/prismatic/pyrite = list(TECHWEB_POINT_TYPE_GENERIC = 3500),
|
||||
/obj/item/slimecross/prismatic/red = list(TECHWEB_POINT_TYPE_GENERIC = 3750),
|
||||
/obj/item/slimecross/prismatic/green = list(TECHWEB_POINT_TYPE_GENERIC = 3750),
|
||||
/obj/item/slimecross/prismatic/pink = list(TECHWEB_POINT_TYPE_GENERIC = 3750),
|
||||
/obj/item/slimecross/prismatic/gold = list(TECHWEB_POINT_TYPE_GENERIC = 3750),
|
||||
/obj/item/slimecross/prismatic/oil = list(TECHWEB_POINT_TYPE_GENERIC = 4000),
|
||||
/obj/item/slimecross/prismatic/black = list(TECHWEB_POINT_TYPE_GENERIC = 4000),
|
||||
/obj/item/slimecross/prismatic/lightpink = list(TECHWEB_POINT_TYPE_GENERIC = 4000),
|
||||
/obj/item/slimecross/prismatic/adamantine = list(TECHWEB_POINT_TYPE_GENERIC = 4000),
|
||||
/obj/item/slimecross/prismatic/rainbow = list(TECHWEB_POINT_TYPE_GENERIC = 4250),
|
||||
// Recurring - Crossbreading Cores! - (Cerulean Cores)
|
||||
/obj/item/slimecross/recurring/grey = list(TECHWEB_POINT_TYPE_GENERIC = 2500),
|
||||
/obj/item/slimecross/recurring/orange = list(TECHWEB_POINT_TYPE_GENERIC = 3000),
|
||||
/obj/item/slimecross/recurring/purple = list(TECHWEB_POINT_TYPE_GENERIC = 3000),
|
||||
/obj/item/slimecross/recurring/blue = list(TECHWEB_POINT_TYPE_GENERIC = 3000),
|
||||
/obj/item/slimecross/recurring/metal = list(TECHWEB_POINT_TYPE_GENERIC = 3000),
|
||||
/obj/item/slimecross/recurring/yellow = list(TECHWEB_POINT_TYPE_GENERIC = 3250),
|
||||
/obj/item/slimecross/recurring/darkpurple = list(TECHWEB_POINT_TYPE_GENERIC = 3250),
|
||||
/obj/item/slimecross/recurring/darkblue = list(TECHWEB_POINT_TYPE_GENERIC = 3250),
|
||||
/obj/item/slimecross/recurring/silver = list(TECHWEB_POINT_TYPE_GENERIC = 3250),
|
||||
/obj/item/slimecross/recurring/bluespace = list(TECHWEB_POINT_TYPE_GENERIC = 3500),
|
||||
/obj/item/slimecross/recurring/sepia = list(TECHWEB_POINT_TYPE_GENERIC = 3500),
|
||||
/obj/item/slimecross/recurring/cerulean = list(TECHWEB_POINT_TYPE_GENERIC = 3500),
|
||||
/obj/item/slimecross/recurring/pyrite = list(TECHWEB_POINT_TYPE_GENERIC = 3500),
|
||||
/obj/item/slimecross/recurring/red = list(TECHWEB_POINT_TYPE_GENERIC = 3750),
|
||||
/obj/item/slimecross/recurring/green = list(TECHWEB_POINT_TYPE_GENERIC = 3750),
|
||||
/obj/item/slimecross/recurring/pink = list(TECHWEB_POINT_TYPE_GENERIC = 3750),
|
||||
/obj/item/slimecross/recurring/gold = list(TECHWEB_POINT_TYPE_GENERIC = 3750),
|
||||
/obj/item/slimecross/recurring/oil = list(TECHWEB_POINT_TYPE_GENERIC = 4000),
|
||||
/obj/item/slimecross/recurring/black = list(TECHWEB_POINT_TYPE_GENERIC = 4000),
|
||||
/obj/item/slimecross/recurring/lightpink = list(TECHWEB_POINT_TYPE_GENERIC = 4000),
|
||||
/obj/item/slimecross/recurring/adamantine = list(TECHWEB_POINT_TYPE_GENERIC = 4000),
|
||||
/obj/item/slimecross/recurring/rainbow = list(TECHWEB_POINT_TYPE_GENERIC = 4250)
|
||||
) // End of Cit changes
|
||||
/obj/item/slimecross/recurring/grey = list(TECHWEB_POINT_TYPE_GENERIC = 2500),
|
||||
/obj/item/slimecross/recurring/orange = list(TECHWEB_POINT_TYPE_GENERIC = 3000),
|
||||
/obj/item/slimecross/recurring/purple = list(TECHWEB_POINT_TYPE_GENERIC = 3000),
|
||||
/obj/item/slimecross/recurring/blue = list(TECHWEB_POINT_TYPE_GENERIC = 3000),
|
||||
/obj/item/slimecross/recurring/metal = list(TECHWEB_POINT_TYPE_GENERIC = 3000),
|
||||
/obj/item/slimecross/recurring/yellow = list(TECHWEB_POINT_TYPE_GENERIC = 3250),
|
||||
/obj/item/slimecross/recurring/darkpurple = list(TECHWEB_POINT_TYPE_GENERIC = 3250),
|
||||
/obj/item/slimecross/recurring/darkblue = list(TECHWEB_POINT_TYPE_GENERIC = 3250),
|
||||
/obj/item/slimecross/recurring/silver = list(TECHWEB_POINT_TYPE_GENERIC = 3250),
|
||||
/obj/item/slimecross/recurring/bluespace = list(TECHWEB_POINT_TYPE_GENERIC = 3500),
|
||||
/obj/item/slimecross/recurring/sepia = list(TECHWEB_POINT_TYPE_GENERIC = 3500),
|
||||
/obj/item/slimecross/recurring/cerulean = list(TECHWEB_POINT_TYPE_GENERIC = 3500),
|
||||
/obj/item/slimecross/recurring/pyrite = list(TECHWEB_POINT_TYPE_GENERIC = 3500),
|
||||
/obj/item/slimecross/recurring/red = list(TECHWEB_POINT_TYPE_GENERIC = 3750),
|
||||
/obj/item/slimecross/recurring/green = list(TECHWEB_POINT_TYPE_GENERIC = 3750),
|
||||
/obj/item/slimecross/recurring/pink = list(TECHWEB_POINT_TYPE_GENERIC = 3750),
|
||||
/obj/item/slimecross/recurring/gold = list(TECHWEB_POINT_TYPE_GENERIC = 3750),
|
||||
/obj/item/slimecross/recurring/oil = list(TECHWEB_POINT_TYPE_GENERIC = 4000),
|
||||
/obj/item/slimecross/recurring/black = list(TECHWEB_POINT_TYPE_GENERIC = 4000),
|
||||
/obj/item/slimecross/recurring/lightpink = list(TECHWEB_POINT_TYPE_GENERIC = 4000),
|
||||
/obj/item/slimecross/recurring/adamantine = list(TECHWEB_POINT_TYPE_GENERIC = 4000),
|
||||
/obj/item/slimecross/recurring/rainbow = list(TECHWEB_POINT_TYPE_GENERIC = 4250)
|
||||
)
|
||||
var/list/errored_datums = list()
|
||||
var/list/point_types = list() //typecache style type = TRUE list
|
||||
//----------------------------------------------
|
||||
@@ -304,6 +302,13 @@ SUBSYSTEM_DEF(research)
|
||||
autosort_categories()
|
||||
error_design = new
|
||||
error_node = new
|
||||
|
||||
for(var/A in subtypesof(/obj/item/seeds))
|
||||
var/obj/item/seeds/S = A
|
||||
var/list/L = list()
|
||||
L[TECHWEB_POINT_TYPE_GENERIC] = 50 + initial(S.rarity) * 2
|
||||
techweb_point_items[S] = L
|
||||
|
||||
return ..()
|
||||
|
||||
/datum/controller/subsystem/research/fire()
|
||||
|
||||
@@ -8,6 +8,10 @@ SUBSYSTEM_DEF(server_maint)
|
||||
init_order = INIT_ORDER_SERVER_MAINT
|
||||
runlevels = RUNLEVEL_LOBBY | RUNLEVELS_DEFAULT
|
||||
var/list/currentrun
|
||||
var/cleanup_ticker = 0
|
||||
|
||||
/datum/controller/subsystem/server_maint/PreInit()
|
||||
world.hub_password = "" //quickly! before the hubbies see us.
|
||||
|
||||
/datum/controller/subsystem/server_maint/Initialize(timeofday)
|
||||
if (CONFIG_GET(flag/hub))
|
||||
@@ -18,10 +22,30 @@ SUBSYSTEM_DEF(server_maint)
|
||||
if(!resumed)
|
||||
if(listclearnulls(GLOB.clients))
|
||||
log_world("Found a null in clients list!")
|
||||
if(listclearnulls(GLOB.player_list))
|
||||
log_world("Found a null in player list!")
|
||||
src.currentrun = GLOB.clients.Copy()
|
||||
|
||||
switch (cleanup_ticker) // do only one of these at a time, once per 5 fires
|
||||
if (0)
|
||||
if(listclearnulls(GLOB.player_list))
|
||||
log_world("Found a null in player_list!")
|
||||
cleanup_ticker++
|
||||
if (5)
|
||||
if(listclearnulls(GLOB.mob_list))
|
||||
log_world("Found a null in mob_list!")
|
||||
cleanup_ticker++
|
||||
if (10)
|
||||
if(listclearnulls(GLOB.alive_mob_list))
|
||||
log_world("Found a null in alive_mob_list!")
|
||||
cleanup_ticker++
|
||||
if (15)
|
||||
if(listclearnulls(GLOB.dead_mob_list))
|
||||
log_world("Found a null in dead_mob_list!")
|
||||
cleanup_ticker++
|
||||
if (20)
|
||||
cleanup_ticker = 0
|
||||
else
|
||||
cleanup_ticker++
|
||||
|
||||
var/list/currentrun = src.currentrun
|
||||
var/round_started = SSticker.HasRoundStarted()
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
#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_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
|
||||
|
||||
@@ -38,15 +38,15 @@ SUBSYSTEM_DEF(timer)
|
||||
|
||||
/datum/controller/subsystem/timer/fire(resumed = FALSE)
|
||||
var/lit = last_invoke_tick
|
||||
var/last_check = world.time - TIMER_NO_INVOKE_WARNING
|
||||
var/last_check = world.time - TICKS2DS(BUCKET_LEN*1.5)
|
||||
var/list/bucket_list = src.bucket_list
|
||||
|
||||
if(!bucket_count)
|
||||
last_invoke_tick = world.time
|
||||
|
||||
if(lit && lit < last_check && last_invoke_warning < last_check)
|
||||
if(lit && lit < last_check && head_offset < last_check && last_invoke_warning < last_check)
|
||||
last_invoke_warning = world.time
|
||||
var/msg = "No regular timers processed in the last [TIMER_NO_INVOKE_WARNING] ticks[bucket_auto_reset ? ", resetting buckets" : ""]!"
|
||||
var/msg = "No regular timers processed in the last [BUCKET_LEN*1.5] ticks[bucket_auto_reset ? ", resetting buckets" : ""]!"
|
||||
message_admins(msg)
|
||||
WARNING(msg)
|
||||
if(bucket_auto_reset)
|
||||
@@ -121,7 +121,7 @@ SUBSYSTEM_DEF(timer)
|
||||
if (!resumed)
|
||||
timer = null
|
||||
|
||||
while (practical_offset <= BUCKET_LEN && head_offset + (practical_offset*world.tick_lag) <= world.time)
|
||||
while (practical_offset <= BUCKET_LEN && head_offset + ((practical_offset-1)*world.tick_lag) <= world.time)
|
||||
var/datum/timedevent/head = bucket_list[practical_offset]
|
||||
if (!timer || !head || timer == head)
|
||||
head = bucket_list[practical_offset]
|
||||
@@ -159,7 +159,7 @@ SUBSYSTEM_DEF(timer)
|
||||
|
||||
if (timer.timeToRun < head_offset)
|
||||
bucket_resolution = null //force bucket recreation
|
||||
CRASH("[i] Invalid timer state: Timer in long run queue with a time to run less then head_offset. [get_timer_debug_string(timer)] world.time: [world.time], head_offset: [head_offset], practical_offset: [practical_offset]")
|
||||
stack_trace("[i] Invalid timer state: Timer in long run queue with a time to run less then head_offset. [get_timer_debug_string(timer)] world.time: [world.time], head_offset: [head_offset], practical_offset: [practical_offset]")
|
||||
|
||||
if (timer.callBack && !timer.spent)
|
||||
timer.callBack.InvokeAsync()
|
||||
@@ -169,9 +169,9 @@ SUBSYSTEM_DEF(timer)
|
||||
qdel(timer)
|
||||
continue
|
||||
|
||||
if (timer.timeToRun < head_offset + TICKS2DS(practical_offset))
|
||||
if (timer.timeToRun < head_offset + TICKS2DS(practical_offset-1))
|
||||
bucket_resolution = null //force bucket recreation
|
||||
CRASH("[i] Invalid timer state: Timer in long run queue that would require a backtrack to transfer to short run queue. [get_timer_debug_string(timer)] world.time: [world.time], head_offset: [head_offset], practical_offset: [practical_offset]")
|
||||
stack_trace("[i] Invalid timer state: Timer in long run queue that would require a backtrack to transfer to short run queue. [get_timer_debug_string(timer)] world.time: [world.time], head_offset: [head_offset], practical_offset: [practical_offset]")
|
||||
if (timer.callBack && !timer.spent)
|
||||
timer.callBack.InvokeAsync()
|
||||
spent += timer
|
||||
@@ -447,6 +447,7 @@ SUBSYSTEM_DEF(timer)
|
||||
next.prev = src
|
||||
prev.next = src
|
||||
|
||||
///Returns a string of the type of the callback for this timer
|
||||
/datum/timedevent/proc/getcallingtype()
|
||||
. = "ERROR"
|
||||
if (callBack.object == GLOBAL_PROC)
|
||||
@@ -454,6 +455,14 @@ SUBSYSTEM_DEF(timer)
|
||||
else
|
||||
. = "[callBack.object.type]"
|
||||
|
||||
/**
|
||||
* Create a new timer and insert it in the queue
|
||||
*
|
||||
* Arguments:
|
||||
* * callback the callback to call on timer finish
|
||||
* * wait deciseconds to run the timer for
|
||||
* * flags flags for this timer, see: code\__DEFINES\subsystems.dm
|
||||
*/
|
||||
/proc/addtimer(datum/callback/callback, wait = 0, flags = 0)
|
||||
if (!callback)
|
||||
CRASH("addtimer called without a callback")
|
||||
@@ -498,6 +507,12 @@ SUBSYSTEM_DEF(timer)
|
||||
var/datum/timedevent/timer = new(callback, wait, flags, hash)
|
||||
return timer.id
|
||||
|
||||
/**
|
||||
* Delete a timer
|
||||
*
|
||||
* Arguments:
|
||||
* * id a timerid or a /datum/timedevent
|
||||
*/
|
||||
/proc/deltimer(id)
|
||||
if (!id)
|
||||
return FALSE
|
||||
@@ -514,6 +529,26 @@ SUBSYSTEM_DEF(timer)
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
/**
|
||||
* Get the remaining deciseconds on a timer
|
||||
*
|
||||
* Arguments:
|
||||
* * id a timerid or a /datum/timedevent
|
||||
*/
|
||||
/proc/timeleft(id)
|
||||
if (!id)
|
||||
return null
|
||||
if (id == TIMER_ID_NULL)
|
||||
CRASH("Tried to get timeleft of a null timerid. Use TIMER_STOPPABLE flag")
|
||||
if (!istext(id))
|
||||
if (istype(id, /datum/timedevent))
|
||||
var/datum/timedevent/timer = id
|
||||
return timer.timeToRun - world.time
|
||||
//id is string
|
||||
var/datum/timedevent/timer = SStimer.timer_id_dict[id]
|
||||
if (timer && !timer.spent)
|
||||
return timer.timeToRun - world.time
|
||||
return null
|
||||
|
||||
#undef BUCKET_LEN
|
||||
#undef BUCKET_POS
|
||||
|
||||
+103
-58
@@ -1,55 +1,72 @@
|
||||
/*
|
||||
USAGE:
|
||||
|
||||
var/datum/callback/C = new(object|null, /proc/type/path|"procstring", arg1, arg2, ... argn)
|
||||
var/timerid = addtimer(C, time, timertype)
|
||||
OR
|
||||
var/timerid = addtimer(CALLBACK(object|null, /proc/type/path|procstring, arg1, arg2, ... argn), time, timertype)
|
||||
|
||||
Note: proc strings can only be given for datum proc calls, global procs must be proc paths
|
||||
Also proc strings are strongly advised against because they don't compile error if the proc stops existing
|
||||
See the note on proc typepath shortcuts
|
||||
|
||||
INVOKING THE CALLBACK:
|
||||
var/result = C.Invoke(args, to, add) //additional args are added after the ones given when the callback was created
|
||||
OR
|
||||
var/result = C.InvokeAsync(args, to, add) //Sleeps will not block, returns . on the first sleep (then continues on in the "background" after the sleep/block ends), otherwise operates normally.
|
||||
OR
|
||||
INVOKE_ASYNC(<CALLBACK args>) to immediately create and call InvokeAsync
|
||||
|
||||
PROC TYPEPATH SHORTCUTS (these operate on paths, not types, so to these shortcuts, datum is NOT a parent of atom, etc...)
|
||||
|
||||
global proc while in another global proc:
|
||||
.procname
|
||||
Example:
|
||||
CALLBACK(GLOBAL_PROC, .some_proc_here)
|
||||
|
||||
proc defined on current(src) object (when in a /proc/ and not an override) OR overridden at src or any of it's parents:
|
||||
.procname
|
||||
Example:
|
||||
CALLBACK(src, .some_proc_here)
|
||||
|
||||
|
||||
when the above doesn't apply:
|
||||
.proc/procname
|
||||
Example:
|
||||
CALLBACK(src, .proc/some_proc_here)
|
||||
|
||||
proc defined on a parent of a some type:
|
||||
/some/type/.proc/some_proc_here
|
||||
|
||||
|
||||
|
||||
Other wise you will have to do the full typepath of the proc (/type/of/thing/proc/procname)
|
||||
|
||||
*/
|
||||
|
||||
/**
|
||||
*# Callback Datums
|
||||
*A datum that holds a proc to be called on another object, used to track proccalls to other objects
|
||||
*
|
||||
* ## USAGE
|
||||
*
|
||||
* ```
|
||||
* var/datum/callback/C = new(object|null, /proc/type/path|"procstring", arg1, arg2, ... argn)
|
||||
* var/timerid = addtimer(C, time, timertype)
|
||||
* you can also use the compiler define shorthand
|
||||
* var/timerid = addtimer(CALLBACK(object|null, /proc/type/path|procstring, arg1, arg2, ... argn), time, timertype)
|
||||
* ```
|
||||
*
|
||||
* Note: proc strings can only be given for datum proc calls, global procs must be proc paths
|
||||
*
|
||||
* Also proc strings are strongly advised against because they don't compile error if the proc stops existing
|
||||
*
|
||||
* In some cases you can provide a shortform of the procname, see the proc typepath shortcuts documentation below
|
||||
*
|
||||
* ## INVOKING THE CALLBACK
|
||||
*`var/result = C.Invoke(args, to, add)` additional args are added after the ones given when the callback was created
|
||||
*
|
||||
* `var/result = C.InvokeAsync(args, to, add)` Asyncronous - returns . on the first sleep then continues on in the background
|
||||
* after the sleep/block ends, otherwise operates normally.
|
||||
*
|
||||
* ## PROC TYPEPATH SHORTCUTS
|
||||
* (these operate on paths, not types, so to these shortcuts, datum is NOT a parent of atom, etc...)
|
||||
*
|
||||
* ### global proc while in another global proc:
|
||||
* .procname
|
||||
*
|
||||
* `CALLBACK(GLOBAL_PROC, .some_proc_here)`
|
||||
*
|
||||
* ### proc defined on current(src) object (when in a /proc/ and not an override) OR overridden at src or any of it's parents:
|
||||
* .procname
|
||||
*
|
||||
* `CALLBACK(src, .some_proc_here)`
|
||||
*
|
||||
* ### when the above doesn't apply:
|
||||
*.proc/procname
|
||||
*
|
||||
* `CALLBACK(src, .proc/some_proc_here)`
|
||||
*
|
||||
*
|
||||
* proc defined on a parent of a some type
|
||||
*
|
||||
* `/some/type/.proc/some_proc_here`
|
||||
*
|
||||
* Otherwise you must always provide the full typepath of the proc (/type/of/thing/proc/procname)
|
||||
*/
|
||||
/datum/callback
|
||||
|
||||
///The object we will be calling the proc on
|
||||
var/datum/object = GLOBAL_PROC
|
||||
///The proc we will be calling on the object
|
||||
var/delegate
|
||||
///A list of arguments to pass into the proc
|
||||
var/list/arguments
|
||||
///A weak reference to the user who triggered this callback
|
||||
var/datum/weakref/user
|
||||
|
||||
/**
|
||||
* Create a new callback datum
|
||||
*
|
||||
* Arguments
|
||||
* * thingtocall the object to call the proc on
|
||||
* * proctocall the proc to call on the target object
|
||||
* * ... an optional list of extra arguments to pass to the proc
|
||||
*/
|
||||
/datum/callback/New(thingtocall, proctocall, ...)
|
||||
if (thingtocall)
|
||||
object = thingtocall
|
||||
@@ -58,7 +75,14 @@
|
||||
arguments = args.Copy(3)
|
||||
if(usr)
|
||||
user = WEAKREF(usr)
|
||||
|
||||
/**
|
||||
* Immediately Invoke proctocall on thingtocall, with waitfor set to false
|
||||
*
|
||||
* Arguments:
|
||||
* * thingtocall Object to call on
|
||||
* * proctocall Proc to call on that object
|
||||
* * ... optional list of arguments to pass as arguments to the proc being called
|
||||
*/
|
||||
/world/proc/ImmediateInvokeAsync(thingtocall, proctocall, ...)
|
||||
set waitfor = FALSE
|
||||
|
||||
@@ -72,6 +96,14 @@
|
||||
else
|
||||
call(thingtocall, proctocall)(arglist(calling_arguments))
|
||||
|
||||
/**
|
||||
* Invoke this callback
|
||||
*
|
||||
* Calls the registered proc on the registered object, if the user ref
|
||||
* can be resolved it also inclues that as an arg
|
||||
*
|
||||
* If the datum being called on is varedited, the call is wrapped via WrapAdminProcCall
|
||||
*/
|
||||
/datum/callback/proc/Invoke(...)
|
||||
if(!usr)
|
||||
var/datum/weakref/W = user
|
||||
@@ -97,7 +129,14 @@
|
||||
return call(delegate)(arglist(calling_arguments))
|
||||
return call(object, delegate)(arglist(calling_arguments))
|
||||
|
||||
//copy and pasted because fuck proc overhead
|
||||
/**
|
||||
* Invoke this callback async (waitfor=false)
|
||||
*
|
||||
* Calls the registered proc on the registered object, if the user ref
|
||||
* can be resolved it also inclues that as an arg
|
||||
*
|
||||
* If the datum being called on is varedited, the call is wrapped via WrapAdminProcCall
|
||||
*/
|
||||
/datum/callback/proc/InvokeAsync(...)
|
||||
set waitfor = FALSE
|
||||
|
||||
@@ -125,7 +164,9 @@
|
||||
return call(delegate)(arglist(calling_arguments))
|
||||
return call(object, delegate)(arglist(calling_arguments))
|
||||
|
||||
|
||||
/**
|
||||
Helper datum for the select callbacks proc
|
||||
*/
|
||||
/datum/callback_select
|
||||
var/list/finished
|
||||
var/pendingcount
|
||||
@@ -150,15 +191,17 @@
|
||||
if (savereturn)
|
||||
finished[index] = rtn
|
||||
|
||||
|
||||
|
||||
|
||||
//runs a list of callbacks asynchronously, returning once all of them return.
|
||||
//callbacks can be repeated.
|
||||
//callbacks-args is an optional list of argument lists, in the same order as the callbacks,
|
||||
// the inner lists will be sent to the callbacks when invoked() as additional args.
|
||||
//can optionly save and return a list of return values, in the same order as the original list of callbacks
|
||||
//resolution is the number of byond ticks between checks.
|
||||
/**
|
||||
* Runs a list of callbacks asyncronously, returning only when all have finished
|
||||
*
|
||||
* Callbacks can be repeated, to call it multiple times
|
||||
*
|
||||
* Arguments:
|
||||
* * list/callbacks the list of callbacks to be called
|
||||
* * list/callback_args the list of lists of arguments to pass into each callback
|
||||
* * savereturns Optionally save and return the list of returned values from each of the callbacks
|
||||
* * resolution The number of byond ticks between each time you check if all callbacks are complete
|
||||
*/
|
||||
/proc/callback_select(list/callbacks, list/callback_args, savereturns = TRUE, resolution = 1)
|
||||
if (!callbacks)
|
||||
return
|
||||
@@ -178,3 +221,5 @@
|
||||
sleep(resolution*world.tick_lag)
|
||||
return CS.finished
|
||||
|
||||
/proc/___callbacknew(typepath, arguments)
|
||||
new typepath(arglist(arguments))
|
||||
|
||||
@@ -259,6 +259,9 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
|
||||
|
||||
//Hallway
|
||||
|
||||
/area/hallway
|
||||
nightshift_public_area = NIGHTSHIFT_AREA_PUBLIC
|
||||
|
||||
/area/hallway/primary/aft
|
||||
name = "Aft Primary Hallway"
|
||||
icon_state = "hallA"
|
||||
@@ -404,14 +407,17 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
|
||||
name = "Dormitories"
|
||||
icon_state = "Sleep"
|
||||
safe = TRUE
|
||||
nightshift_public_area = NIGHTSHIFT_AREA_RECREATION
|
||||
|
||||
/area/crew_quarters/dorms/male
|
||||
name = "Male Dorm"
|
||||
icon_state = "Sleep"
|
||||
nightshift_public_area = NIGHTSHIFT_AREA_NONE
|
||||
|
||||
/area/crew_quarters/dorms/female
|
||||
name = "Female Dorm"
|
||||
icon_state = "Sleep"
|
||||
nightshift_public_area = NIGHTSHIFT_AREA_NONE
|
||||
|
||||
/area/crew_quarters/rehab_dome
|
||||
name = "Rehabilitation Dome"
|
||||
@@ -448,26 +454,32 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
|
||||
/area/crew_quarters/locker
|
||||
name = "Locker Room"
|
||||
icon_state = "locker"
|
||||
nightshift_public_area = NIGHTSHIFT_AREA_RECREATION
|
||||
|
||||
/area/crew_quarters/lounge
|
||||
name = "Lounge"
|
||||
icon_state = "yellow"
|
||||
nightshift_public_area = NIGHTSHIFT_AREA_RECREATION
|
||||
|
||||
/area/crew_quarters/fitness
|
||||
name = "Fitness Room"
|
||||
icon_state = "fitness"
|
||||
nightshift_public_area = NIGHTSHIFT_AREA_RECREATION
|
||||
|
||||
/area/crew_quarters/fitness/recreation
|
||||
name = "Recreation Area"
|
||||
icon_state = "fitness"
|
||||
nightshift_public_area = NIGHTSHIFT_AREA_RECREATION
|
||||
|
||||
/area/crew_quarters/cafeteria
|
||||
name = "Cafeteria"
|
||||
icon_state = "cafeteria"
|
||||
nightshift_public_area = NIGHTSHIFT_AREA_RECREATION
|
||||
|
||||
/area/crew_quarters/cafeteria/lunchroom
|
||||
name = "Lunchroom"
|
||||
icon_state = "cafeteria"
|
||||
nightshift_public_area = NIGHTSHIFT_AREA_RECREATION
|
||||
|
||||
/area/crew_quarters/kitchen
|
||||
name = "Kitchen"
|
||||
@@ -480,6 +492,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
|
||||
/area/crew_quarters/bar
|
||||
name = "Bar"
|
||||
icon_state = "bar"
|
||||
nightshift_public_area = NIGHTSHIFT_AREA_RECREATION
|
||||
|
||||
/area/crew_quarters/bar/atrium
|
||||
name = "Atrium"
|
||||
@@ -518,6 +531,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
|
||||
name = "Library"
|
||||
icon_state = "library"
|
||||
flags_1 = NONE
|
||||
nightshift_public_area = NIGHTSHIFT_AREA_RECREATION
|
||||
|
||||
/area/library/lounge
|
||||
name = "Library Lounge"
|
||||
@@ -527,6 +541,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
|
||||
name = "Abandoned Library"
|
||||
icon_state = "library"
|
||||
flags_1 = NONE
|
||||
nightshift_public_area = NIGHTSHIFT_AREA_NONE
|
||||
|
||||
/area/chapel
|
||||
icon_state = "chapel"
|
||||
@@ -534,12 +549,14 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
|
||||
flags_1 = NONE
|
||||
clockwork_warp_allowed = FALSE
|
||||
clockwork_warp_fail = "The consecration here prevents you from warping in."
|
||||
nightshift_public_area = NIGHTSHIFT_AREA_RECREATION
|
||||
|
||||
/area/chapel/main
|
||||
name = "Chapel"
|
||||
|
||||
/area/chapel/main/monastery
|
||||
name = "Monastery"
|
||||
nightshift_public_area = NIGHTSHIFT_AREA_NONE
|
||||
|
||||
/area/chapel/office
|
||||
name = "Chapel Office"
|
||||
|
||||
@@ -63,6 +63,8 @@
|
||||
var/xenobiology_compatible = FALSE //Can the Xenobio management console transverse this area by default?
|
||||
var/list/canSmoothWithAreas //typecache to limit the areas that atoms in this area can smooth with
|
||||
|
||||
var/nightshift_public_area = NIGHTSHIFT_AREA_NONE //considered a public area for nightshift
|
||||
|
||||
/*Adding a wizard area teleport list because motherfucking lag -- Urist*/
|
||||
/*I am far too lazy to make it a proper list of areas so I'll just make it run the usual telepot routine at the start of the game*/
|
||||
GLOBAL_LIST_EMPTY(teleportlocs)
|
||||
|
||||
@@ -378,3 +378,11 @@
|
||||
/obj/item/circuitboard/computer/apc_control,
|
||||
/obj/item/circuitboard/computer/robotics
|
||||
)
|
||||
|
||||
/obj/effect/spawner/lootdrop/keg
|
||||
name = "random keg spawner"
|
||||
lootcount = 1
|
||||
loot = list(/obj/structure/reagent_dispensers/keg/mead = 5,
|
||||
/obj/structure/reagent_dispensers/keg/aphro = 2,
|
||||
/obj/structure/reagent_dispensers/keg/aphro/strong = 2,
|
||||
/obj/structure/reagent_dispensers/keg/gargle = 1)
|
||||
|
||||
@@ -10,6 +10,7 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE)
|
||||
var/item_state = null
|
||||
var/lefthand_file = 'icons/mob/inhands/items_lefthand.dmi'
|
||||
var/righthand_file = 'icons/mob/inhands/items_righthand.dmi'
|
||||
var/list/alternate_screams = list() //REEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE
|
||||
|
||||
//Dimensions of the icon file used when this item is worn, eg: hats.dmi
|
||||
//eg: 32x32 sprite, 64x64 sprite, etc.
|
||||
|
||||
@@ -0,0 +1,92 @@
|
||||
/* BALLS - GLORIOUS BALLS
|
||||
//
|
||||
// Includes:-
|
||||
// 1) Tennis balls, lines 10 - 92
|
||||
//
|
||||
//
|
||||
//
|
||||
*/
|
||||
|
||||
/obj/item/toy/tennis
|
||||
name = "tennis ball"
|
||||
desc = "A classical tennis ball. It appears to have faint bite marks scattered all over its surface."
|
||||
icon = 'modular_citadel/icons/obj/balls.dmi'
|
||||
icon_state = "tennis_classic"
|
||||
lefthand_file = 'modular_citadel/icons/mob/inhands/balls_left.dmi'
|
||||
righthand_file = 'modular_citadel/icons/mob/inhands/balls_right.dmi'
|
||||
item_state = "tennis_classic"
|
||||
alternate_worn_icon = 'modular_citadel/icons/mob/mouthball.dmi'
|
||||
slot_flags = ITEM_SLOT_HEAD | ITEM_SLOT_NECK | ITEM_SLOT_EARS //Fluff item, put it wherever you want!
|
||||
throw_range = 14
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
|
||||
/obj/item/toy/tennis/pre_altattackby(atom/A, mob/living/user, params) //checks if it can do right click memes
|
||||
altafterattack(A, user, TRUE, params)
|
||||
return TRUE
|
||||
|
||||
/obj/item/toy/tennis/altafterattack(atom/target, mob/living/carbon/user, proximity_flag, click_parameters) //does right click memes
|
||||
if(istype(user))
|
||||
user.visible_message("<span class='notice'>[user] waggles [src] at [target].</span>", "<span class='notice'>You waggle [src] at [target].</span>")
|
||||
return TRUE
|
||||
|
||||
/obj/item/toy/tennis/rainbow
|
||||
name = "pseudo-euclidean interdimensional tennis sphere"
|
||||
desc = "A tennis ball from another plane of existance. Really groovy."
|
||||
icon_state = "tennis_rainbow"
|
||||
item_state = "tennis_rainbow"
|
||||
actions_types = list(/datum/action/item_action/squeeze) //Giving the masses easy access to unilimted honks would be annoying
|
||||
|
||||
/obj/item/toy/tennis/rainbow/Initialize()
|
||||
. = ..()
|
||||
AddComponent(/datum/component/squeak)
|
||||
|
||||
/obj/item/toy/tennis/rainbow/izzy //izzyinbox's donator item
|
||||
name = "Katlin's Ball"
|
||||
desc = "A tennis ball that's seen a good bit of love, being covered in a few black and white hairs and slobber."
|
||||
icon_state = "tennis_izzy"
|
||||
item_state = "tennis_izzy"
|
||||
|
||||
/obj/item/toy/tennis/red //da red wuns go fasta
|
||||
name = "red tennis ball"
|
||||
desc = "A red tennis ball. It goes three times faster!"
|
||||
icon_state = "tennis_red"
|
||||
item_state = "tennis_red"
|
||||
throw_speed = 9
|
||||
|
||||
/obj/item/toy/tennis/yellow //because yellow is hot I guess
|
||||
name = "yellow tennis ball"
|
||||
desc = "A yellow tennis ball. It seems to have a flame-retardant coating."
|
||||
icon_state = "tennis_yellow"
|
||||
item_state = "tennis_yellow"
|
||||
resistance_flags = FIRE_PROOF
|
||||
|
||||
/obj/item/toy/tennis/green //pestilence
|
||||
name = "green tennis ball"
|
||||
desc = "A green tennis ball. It seems to have an impermeable coating."
|
||||
icon_state = "tennis_green"
|
||||
item_state = "tennis_green"
|
||||
permeability_coefficient = 0.9
|
||||
|
||||
/obj/item/toy/tennis/cyan //electric
|
||||
name = "cyan tennis ball"
|
||||
desc = "A cyan tennis ball. It seems to have odd electrical properties."
|
||||
icon_state = "tennis_cyan"
|
||||
item_state = "tennis_cyan"
|
||||
siemens_coefficient = 0.9
|
||||
|
||||
/obj/item/toy/tennis/blue //reliability
|
||||
name = "blue tennis ball"
|
||||
desc = "A blue tennis ball. It seems ever so slightly more robust than normal."
|
||||
icon_state = "tennis_blue"
|
||||
item_state = "tennis_blue"
|
||||
max_integrity = 300
|
||||
|
||||
/obj/item/toy/tennis/purple //because purple dyes have high pH and would neutralize acids I guess
|
||||
name = "purple tennis ball"
|
||||
desc = "A purple tennis ball. It seems to have an acid-resistant coating."
|
||||
icon_state = "tennis_purple"
|
||||
item_state = "tennis_purple"
|
||||
resistance_flags = ACID_PROOF
|
||||
|
||||
/datum/action/item_action/squeeze
|
||||
name = "Squeak!"
|
||||
@@ -0,0 +1,61 @@
|
||||
/obj/item/boombox
|
||||
name = "boombox"
|
||||
desc = "A dusty, gray, bulky, battery-powered, auto-looping stereo cassette player. An ancient relic from prehistoric times on that one planet with humans and stuff. Yeah, that one."
|
||||
icon = 'modular_citadel/icons/obj/boombox.dmi'
|
||||
icon_state = "raiqbawks_off"//PLACEHOLDER UNTIL SOMEONE SPRITES PLAIN NON-FANCY BOOMBOXES
|
||||
w_class = WEIGHT_CLASS_NORMAL
|
||||
force = 3
|
||||
var/baseiconstate = "raiqbawks"
|
||||
var/boomingandboxing = FALSE
|
||||
var/list/availabletrackids
|
||||
|
||||
/obj/item/boombox/attack_self(mob/user)
|
||||
. = ..()
|
||||
if(boomingandboxing)
|
||||
SSjukeboxes.removejukebox(SSjukeboxes.findjukeboxindex(src))
|
||||
boomingandboxing = FALSE
|
||||
to_chat(user, "<span class='notice'>You flip a switch on [src], and the music immediately stops.")
|
||||
update_icon()
|
||||
return
|
||||
if(!availabletrackids || !availabletrackids.len)
|
||||
to_chat(user, "<span class='notice'>[src] flashes as you prod it senselessly. It doesn't have any songs stored on it.</span>")
|
||||
return
|
||||
if(!boomingandboxing)
|
||||
var/list/tracklist = list()
|
||||
for(var/datum/track/S in SSjukeboxes.songs)
|
||||
if(istype(S) && S.song_associated_id in availabletrackids)
|
||||
tracklist[S.song_name] = S
|
||||
var/selected = input(user, "Play song", "Track:") as null|anything in tracklist
|
||||
if(QDELETED(src) || !selected || !istype(tracklist[selected], /datum/track))
|
||||
return
|
||||
var/jukeboxslottotake = SSjukeboxes.addjukebox(src, tracklist[selected])
|
||||
if(jukeboxslottotake)
|
||||
boomingandboxing = TRUE
|
||||
update_icon()
|
||||
|
||||
/obj/item/boombox/Destroy(mob/user)
|
||||
SSjukeboxes.removejukebox(SSjukeboxes.findjukeboxindex(src))
|
||||
. = ..()
|
||||
|
||||
/obj/item/boombox/update_icon()
|
||||
icon_state = "[baseiconstate]_[boomingandboxing ? "on" : "off"]"
|
||||
return
|
||||
|
||||
/obj/item/boombox/raiq
|
||||
name = "Miami Boomer"
|
||||
desc = "A shiny, fashionable boombox filled to the brim with neon lights, synthesizers, gang violence, and broken R keys. A worn-out sticker on the back states \"Includes three kickin' beats!\""
|
||||
icon_state = "raiqbawks_off"
|
||||
baseiconstate = "raiqbawks"
|
||||
availabletrackids = list("hotline.ogg","chiptune.ogg","genesis.ogg")
|
||||
|
||||
/obj/item/boombox/raiq/update_icon()
|
||||
. = ..()
|
||||
if(boomingandboxing)
|
||||
START_PROCESSING(SSobj, src)
|
||||
else
|
||||
STOP_PROCESSING(SSobj, src)
|
||||
set_light(0)
|
||||
|
||||
/obj/item/boombox/raiq/process()
|
||||
set_light(5,0.95,pick("#d87aff","#7a7aff","#89ecff","#b88eff","#ff59ad"))
|
||||
return
|
||||
@@ -144,3 +144,80 @@ Code:
|
||||
user << browse(dat, "window=radio")
|
||||
onclose(user, "radio")
|
||||
return
|
||||
|
||||
/obj/item/electropack/shockcollar
|
||||
name = "shock collar"
|
||||
desc = "A reinforced metal collar. It seems to have some form of wiring near the front. Strange.."
|
||||
icon = 'modular_citadel/icons/obj/clothing/cit_neck.dmi'
|
||||
alternate_worn_icon = 'modular_citadel/icons/mob/citadel/neck.dmi'
|
||||
icon_state = "shockcollar"
|
||||
item_state = "shockcollar"
|
||||
body_parts_covered = NECK
|
||||
slot_flags = ITEM_SLOT_NECK | ITEM_SLOT_DENYPOCKET //no more pocket shockers
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
strip_delay = 60
|
||||
equip_delay_other = 60
|
||||
materials = list(MAT_METAL=5000, MAT_GLASS=2000)
|
||||
|
||||
var/tagname = null
|
||||
|
||||
/datum/design/electropack/shockcollar
|
||||
name = "Shockcollar"
|
||||
id = "shockcollar"
|
||||
build_type = AUTOLATHE
|
||||
build_path = /obj/item/electropack/shockcollar
|
||||
materials = list(MAT_METAL=5000, MAT_GLASS=2000)
|
||||
category = list("hacked", "Misc")
|
||||
|
||||
/obj/item/electropack/shockcollar/attack_hand(mob/user)
|
||||
if(loc == user && user.get_item_by_slot(SLOT_NECK))
|
||||
to_chat(user, "<span class='warning'>The collar is fastened tight! You'll need help taking this off!</span>")
|
||||
return
|
||||
return ..()
|
||||
|
||||
/obj/item/electropack/shockcollar/receive_signal(datum/signal/signal)
|
||||
if(!signal || signal.data["code"] != code)
|
||||
return
|
||||
|
||||
if(isliving(loc) && on)
|
||||
if(shock_cooldown == TRUE)
|
||||
return
|
||||
shock_cooldown = TRUE
|
||||
addtimer(VARSET_CALLBACK(src, shock_cooldown, FALSE), 100)
|
||||
var/mob/living/L = loc
|
||||
step(L, pick(GLOB.cardinals))
|
||||
|
||||
to_chat(L, "<span class='danger'>You feel a sharp shock from the collar!</span>")
|
||||
var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
|
||||
s.set_up(3, 1, L)
|
||||
s.start()
|
||||
|
||||
L.Knockdown(100)
|
||||
|
||||
if(master)
|
||||
master.receive_signal()
|
||||
return
|
||||
|
||||
/obj/item/electropack/shockcollar/attackby(obj/item/W, mob/user, params) //moves it here because on_click is being bad
|
||||
if(istype(W, /obj/item/pen))
|
||||
var/t = input(user, "Would you like to change the name on the tag?", "Name your new pet", tagname ? tagname : "Spot") as null|text
|
||||
if(t)
|
||||
tagname = copytext(sanitize(t), 1, MAX_NAME_LEN)
|
||||
name = "[initial(name)] - [tagname]"
|
||||
else
|
||||
return ..()
|
||||
|
||||
/obj/item/electropack/shockcollar/ui_interact(mob/user) //on_click calls this
|
||||
var/dat = {"
|
||||
<TT>
|
||||
<B>Frequency/Code</B> for shock collar:<BR>
|
||||
Frequency:
|
||||
[format_frequency(src.frequency)]
|
||||
<A href='byond://?src=[REF(src)];set=freq'>Set</A><BR>
|
||||
Code:
|
||||
[src.code]
|
||||
<A href='byond://?src=[REF(src)];set=code'>Set</A><BR>
|
||||
</TT>"}
|
||||
user << browse(dat, "window=radio")
|
||||
onclose(user, "radio")
|
||||
return
|
||||
|
||||
@@ -92,7 +92,13 @@
|
||||
/obj/item/encryptionkey/heads/hop
|
||||
name = "\proper the head of personnel's encryption key"
|
||||
icon_state = "hop_cypherkey"
|
||||
channels = list(RADIO_CHANNEL_SUPPLY = 1, RADIO_CHANNEL_SERVICE = 1, RADIO_CHANNEL_COMMAND = 1)
|
||||
channels = list(RADIO_CHANNEL_SERVICE = 1, RADIO_CHANNEL_COMMAND = 1)
|
||||
|
||||
/obj/item/encryptionkey/heads/qm
|
||||
name = "\proper the quartermaster's encryption key"
|
||||
desc = "An encryption key for a radio headset. Channels are as follows: :u - supply, :c - command."
|
||||
icon_state = "hop_cypherkey"
|
||||
channels = list(RADIO_CHANNEL_SUPPLY = 1, RADIO_CHANNEL_COMMAND = 1)
|
||||
|
||||
/obj/item/encryptionkey/headset_cargo
|
||||
name = "supply radio encryption key"
|
||||
|
||||
@@ -206,6 +206,12 @@ GLOBAL_LIST_INIT(channel_tokens, list(
|
||||
icon_state = "com_headset"
|
||||
keyslot = new /obj/item/encryptionkey/heads/hop
|
||||
|
||||
/obj/item/radio/headset/heads/qm
|
||||
name = "\proper the quartermaster's headset"
|
||||
desc = "The headset of the king (or queen) of paperwork."
|
||||
icon_state = "com_headset"
|
||||
keyslot = new /obj/item/encryptionkey/heads/qm
|
||||
|
||||
/obj/item/radio/headset/headset_cargo
|
||||
name = "supply radio headset"
|
||||
desc = "A headset used by the QM and his slaves."
|
||||
|
||||
@@ -466,7 +466,7 @@ SLIME SCANNER
|
||||
msg += "<span class='notice'>Subject is not addicted to any reagents.</span>\n"
|
||||
|
||||
var/datum/reagent/impure/fermiTox/F = M.reagents.has_reagent(/datum/reagent/impure/fermiTox)
|
||||
if(istype(F))
|
||||
if(istype(F,/datum/reagent/impure/fermiTox))
|
||||
switch(F.volume)
|
||||
if(5 to 10)
|
||||
msg += "<span class='notice'>Subject contains a low amount of toxic isomers.</span>\n"
|
||||
|
||||
@@ -122,3 +122,6 @@
|
||||
owner.visible_message("<span class='danger'>[attack_text] hits [owner]'s [src], setting it off! What a shot!</span>")
|
||||
prime()
|
||||
return TRUE //It hit the grenade, not them
|
||||
|
||||
/obj/item/proc/grenade_prime_react(obj/item/grenade/nade)
|
||||
return
|
||||
|
||||
@@ -9,8 +9,10 @@
|
||||
icon_state = "datadisk3"
|
||||
|
||||
|
||||
/obj/item/malf_upgrade/afterattack(mob/living/silicon/ai/AI, mob/user)
|
||||
/obj/item/malf_upgrade/afterattack(mob/living/silicon/ai/AI, mob/user, proximity)
|
||||
. = ..()
|
||||
if(!proximity)
|
||||
return
|
||||
if(!istype(AI))
|
||||
return
|
||||
if(AI.malf_picker)
|
||||
@@ -18,7 +20,11 @@
|
||||
to_chat(AI, "<span class='userdanger'>[user] has attempted to upgrade you with combat software that you already possess. You gain 50 points to spend on Malfunction Modules instead.</span>")
|
||||
else
|
||||
to_chat(AI, "<span class='userdanger'>[user] has upgraded you with combat software!</span>")
|
||||
to_chat(AI, "<span class='userdanger'>Your current laws and objectives remain unchanged.</span>") //this unlocks malf powers, but does not give the license to plasma flood
|
||||
AI.add_malf_picker()
|
||||
AI.hack_software = TRUE
|
||||
log_game("[key_name(user)] has upgraded [key_name(AI)] with a [src].")
|
||||
message_admins("[ADMIN_LOOKUPFLW(user)] has upgraded [ADMIN_LOOKUPFLW(AI)] with a [src].")
|
||||
to_chat(user, "<span class='notice'>You upgrade [AI]. [src] is consumed in the process.</span>")
|
||||
qdel(src)
|
||||
|
||||
@@ -26,12 +32,14 @@
|
||||
//Lipreading
|
||||
/obj/item/surveillance_upgrade
|
||||
name = "surveillance software upgrade"
|
||||
desc = "A software package that will allow an artificial intelligence to 'hear' from its cameras via lip reading."
|
||||
desc = "An illegal software package that will allow an artificial intelligence to 'hear' from its cameras via lip reading and hidden microphones."
|
||||
icon = 'icons/obj/module.dmi'
|
||||
icon_state = "datadisk3"
|
||||
|
||||
/obj/item/surveillance_upgrade/afterattack(mob/living/silicon/ai/AI, mob/user)
|
||||
/obj/item/surveillance_upgrade/afterattack(mob/living/silicon/ai/AI, mob/user, proximity)
|
||||
. = ..()
|
||||
if(!proximity)
|
||||
return
|
||||
if(!istype(AI))
|
||||
return
|
||||
if(AI.eyeobj)
|
||||
@@ -39,4 +47,6 @@
|
||||
to_chat(AI, "<span class='userdanger'>[user] has upgraded you with surveillance software!</span>")
|
||||
to_chat(AI, "Via a combination of hidden microphones and lip reading software, you are able to use your cameras to listen in on conversations.")
|
||||
to_chat(user, "<span class='notice'>You upgrade [AI]. [src] is consumed in the process.</span>")
|
||||
log_game("[key_name(user)] has upgraded [key_name(AI)] with a [src].")
|
||||
message_admins("[ADMIN_LOOKUPFLW(user)] has upgraded [ADMIN_LOOKUPFLW(AI)] with a [src].")
|
||||
qdel(src)
|
||||
|
||||
@@ -223,6 +223,46 @@
|
||||
if(!iscyborg(loc))
|
||||
deductcharge(1000 / severity, TRUE, FALSE)
|
||||
|
||||
/obj/item/melee/baton/stunsword
|
||||
name = "stunsword"
|
||||
desc = "not actually sharp, this sword is functionally identical to a stunbaton"
|
||||
icon = 'modular_citadel/icons/obj/stunsword.dmi'
|
||||
icon_state = "stunsword"
|
||||
item_state = "sword"
|
||||
lefthand_file = 'modular_citadel/icons/mob/inhands/stunsword_left.dmi'
|
||||
righthand_file = 'modular_citadel/icons/mob/inhands/stunsword_right.dmi'
|
||||
|
||||
/obj/item/melee/baton/stunsword/get_belt_overlay()
|
||||
if(istype(loc, /obj/item/storage/belt/sabre))
|
||||
return mutable_appearance('icons/obj/clothing/belt_overlays.dmi', "stunsword")
|
||||
return ..()
|
||||
|
||||
/obj/item/melee/baton/stunsword/get_worn_belt_overlay(icon_file)
|
||||
return mutable_appearance(icon_file, "-stunsword")
|
||||
|
||||
/obj/item/ssword_kit
|
||||
name = "stunsword kit"
|
||||
desc = "a modkit for making a stunbaton into a stunsword"
|
||||
icon = 'icons/obj/vending_restock.dmi'
|
||||
icon_state = "refill_donksoft"
|
||||
var/product = /obj/item/melee/baton/stunsword //what it makes
|
||||
var/list/fromitem = list(/obj/item/melee/baton, /obj/item/melee/baton/loaded) //what it needs
|
||||
afterattack(obj/O, mob/user as mob)
|
||||
if(istype(O, product))
|
||||
to_chat(user,"<span class='warning'>[O] is already modified!")
|
||||
else if(O.type in fromitem) //makes sure O is the right thing
|
||||
var/obj/item/melee/baton/B = O
|
||||
if(!B.cell) //checks for a powercell in the baton. If there isn't one, continue. If there is, warn the user to take it out
|
||||
new product(usr.loc) //spawns the product
|
||||
user.visible_message("<span class='warning'>[user] modifies [O]!","<span class='warning'>You modify the [O]!")
|
||||
qdel(O) //Gets rid of the baton
|
||||
qdel(src) //gets rid of the kit
|
||||
|
||||
else
|
||||
to_chat(user,"<span class='warning'>Remove the powercell first!</span>") //We make this check because the stunsword starts without a battery.
|
||||
else
|
||||
to_chat(user, "<span class='warning'> You can't modify [O] with this kit!</span>")
|
||||
|
||||
//Makeshift stun baton. Replacement for stun gloves.
|
||||
/obj/item/melee/baton/cattleprod
|
||||
name = "stunprod"
|
||||
@@ -249,5 +289,6 @@
|
||||
sparkler?.activate()
|
||||
. = ..()
|
||||
|
||||
|
||||
#undef STUNBATON_CHARGE_LENIENCY
|
||||
#undef STUNBATON_DEPLETION_RATE
|
||||
|
||||
+322
-322
@@ -1,322 +1,322 @@
|
||||
#define RESTART_COUNTER_PATH "data/round_counter.txt"
|
||||
|
||||
GLOBAL_VAR(restart_counter)
|
||||
|
||||
GLOBAL_VAR(topic_status_lastcache)
|
||||
GLOBAL_LIST(topic_status_cache)
|
||||
|
||||
//This happens after the Master subsystem new(s) (it's a global datum)
|
||||
//So subsystems globals exist, but are not initialised
|
||||
/world/New()
|
||||
|
||||
log_world("World loaded at [TIME_STAMP("hh:mm:ss", FALSE)]!")
|
||||
|
||||
SetupExternalRSC()
|
||||
|
||||
GLOB.config_error_log = GLOB.world_manifest_log = GLOB.world_pda_log = GLOB.world_job_debug_log = GLOB.sql_error_log = GLOB.world_href_log = GLOB.world_runtime_log = GLOB.world_attack_log = GLOB.world_game_log = "data/logs/config_error.[GUID()].log" //temporary file used to record errors with loading config, moved to log directory once logging is set bl
|
||||
|
||||
make_datum_references_lists() //initialises global lists for referencing frequently used datums (so that we only ever do it once)
|
||||
|
||||
TgsNew()
|
||||
|
||||
GLOB.revdata = new
|
||||
|
||||
config.Load(params[OVERRIDE_CONFIG_DIRECTORY_PARAMETER])
|
||||
|
||||
//SetupLogs depends on the RoundID, so lets check
|
||||
//DB schema and set RoundID if we can
|
||||
SSdbcore.CheckSchemaVersion()
|
||||
SSdbcore.SetRoundID()
|
||||
SetupLogs()
|
||||
|
||||
#ifndef USE_CUSTOM_ERROR_HANDLER
|
||||
world.log = file("[GLOB.log_directory]/dd.log")
|
||||
#endif
|
||||
|
||||
load_admins()
|
||||
LoadVerbs(/datum/verbs/menu)
|
||||
if(CONFIG_GET(flag/usewhitelist))
|
||||
load_whitelist()
|
||||
LoadBans()
|
||||
reload_custom_roundstart_items_list()//Cit change - loads donator items. Remind me to remove when I port over bay's loadout system
|
||||
|
||||
GLOB.timezoneOffset = text2num(time2text(0,"hh")) * 36000
|
||||
|
||||
if(fexists(RESTART_COUNTER_PATH))
|
||||
GLOB.restart_counter = text2num(trim(file2text(RESTART_COUNTER_PATH)))
|
||||
fdel(RESTART_COUNTER_PATH)
|
||||
|
||||
if(NO_INIT_PARAMETER in params)
|
||||
return
|
||||
|
||||
cit_initialize()
|
||||
|
||||
Master.Initialize(10, FALSE, TRUE)
|
||||
|
||||
if(TEST_RUN_PARAMETER in params)
|
||||
HandleTestRun()
|
||||
|
||||
/world/proc/HandleTestRun()
|
||||
//trigger things to run the whole process
|
||||
Master.sleep_offline_after_initializations = FALSE
|
||||
SSticker.start_immediately = TRUE
|
||||
CONFIG_SET(number/round_end_countdown, 0)
|
||||
var/datum/callback/cb
|
||||
#ifdef UNIT_TESTS
|
||||
cb = CALLBACK(GLOBAL_PROC, /proc/RunUnitTests)
|
||||
#else
|
||||
cb = VARSET_CALLBACK(SSticker, force_ending, TRUE)
|
||||
#endif
|
||||
SSticker.OnRoundstart(CALLBACK(GLOBAL_PROC, /proc/addtimer, cb, 10 SECONDS))
|
||||
|
||||
/world/proc/SetupExternalRSC()
|
||||
#if (PRELOAD_RSC == 0)
|
||||
GLOB.external_rsc_urls = world.file2list("[global.config.directory]/external_rsc_urls.txt","\n")
|
||||
var/i=1
|
||||
while(i<=GLOB.external_rsc_urls.len)
|
||||
if(GLOB.external_rsc_urls[i])
|
||||
i++
|
||||
else
|
||||
GLOB.external_rsc_urls.Cut(i,i+1)
|
||||
#endif
|
||||
|
||||
/world/proc/SetupLogs()
|
||||
var/override_dir = params[OVERRIDE_LOG_DIRECTORY_PARAMETER]
|
||||
if(!override_dir)
|
||||
var/realtime = world.realtime
|
||||
var/texttime = time2text(realtime, "YYYY/MM/DD")
|
||||
GLOB.log_directory = "data/logs/[texttime]/round-"
|
||||
GLOB.picture_logging_prefix = "L_[time2text(realtime, "YYYYMMDD")]_"
|
||||
GLOB.picture_log_directory = "data/picture_logs/[texttime]/round-"
|
||||
if(GLOB.round_id)
|
||||
GLOB.log_directory += "[GLOB.round_id]"
|
||||
GLOB.picture_logging_prefix += "R_[GLOB.round_id]_"
|
||||
GLOB.picture_log_directory += "[GLOB.round_id]"
|
||||
else
|
||||
var/timestamp = replacetext(TIME_STAMP("hh:mm:ss", FALSE), ":", ".")
|
||||
GLOB.log_directory += "[timestamp]"
|
||||
GLOB.picture_log_directory += "[timestamp]"
|
||||
GLOB.picture_logging_prefix += "T_[timestamp]_"
|
||||
else
|
||||
GLOB.log_directory = "data/logs/[override_dir]"
|
||||
GLOB.picture_logging_prefix = "O_[override_dir]_"
|
||||
GLOB.picture_log_directory = "data/picture_logs/[override_dir]"
|
||||
|
||||
GLOB.world_game_log = "[GLOB.log_directory]/game.log"
|
||||
GLOB.world_virus_log = "[GLOB.log_directory]/virus.log"
|
||||
GLOB.world_attack_log = "[GLOB.log_directory]/attack.log"
|
||||
GLOB.world_pda_log = "[GLOB.log_directory]/pda.log"
|
||||
GLOB.world_telecomms_log = "[GLOB.log_directory]/telecomms.log"
|
||||
GLOB.world_manifest_log = "[GLOB.log_directory]/manifest.log"
|
||||
GLOB.world_href_log = "[GLOB.log_directory]/hrefs.log"
|
||||
GLOB.sql_error_log = "[GLOB.log_directory]/sql.log"
|
||||
GLOB.world_qdel_log = "[GLOB.log_directory]/qdel.log"
|
||||
GLOB.world_map_error_log = "[GLOB.log_directory]/map_errors.log"
|
||||
GLOB.world_runtime_log = "[GLOB.log_directory]/runtime.log"
|
||||
GLOB.query_debug_log = "[GLOB.log_directory]/query_debug.log"
|
||||
GLOB.world_job_debug_log = "[GLOB.log_directory]/job_debug.log"
|
||||
GLOB.tgui_log = "[GLOB.log_directory]/tgui.log"
|
||||
GLOB.subsystem_log = "[GLOB.log_directory]/subsystem.log"
|
||||
|
||||
|
||||
#ifdef UNIT_TESTS
|
||||
GLOB.test_log = file("[GLOB.log_directory]/tests.log")
|
||||
start_log(GLOB.test_log)
|
||||
#endif
|
||||
start_log(GLOB.world_game_log)
|
||||
start_log(GLOB.world_attack_log)
|
||||
start_log(GLOB.world_pda_log)
|
||||
start_log(GLOB.world_telecomms_log)
|
||||
start_log(GLOB.world_manifest_log)
|
||||
start_log(GLOB.world_href_log)
|
||||
start_log(GLOB.world_qdel_log)
|
||||
start_log(GLOB.world_runtime_log)
|
||||
start_log(GLOB.world_job_debug_log)
|
||||
start_log(GLOB.tgui_log)
|
||||
start_log(GLOB.subsystem_log)
|
||||
|
||||
GLOB.changelog_hash = md5('html/changelog.html') //for telling if the changelog has changed recently
|
||||
if(fexists(GLOB.config_error_log))
|
||||
fcopy(GLOB.config_error_log, "[GLOB.log_directory]/config_error.log")
|
||||
fdel(GLOB.config_error_log)
|
||||
|
||||
if(GLOB.round_id)
|
||||
log_game("Round ID: [GLOB.round_id]")
|
||||
|
||||
// This was printed early in startup to the world log and config_error.log,
|
||||
// but those are both private, so let's put the commit info in the runtime
|
||||
// log which is ultimately public.
|
||||
log_runtime(GLOB.revdata.get_log_message())
|
||||
|
||||
/world/Topic(T, addr, master, key)
|
||||
TGS_TOPIC //redirect to server tools if necessary
|
||||
|
||||
if(!SSfail2topic)
|
||||
return "Server not initialized."
|
||||
else if(SSfail2topic.IsRateLimited(addr))
|
||||
return "Rate limited."
|
||||
|
||||
if(length(T) > CONFIG_GET(number/topic_max_size))
|
||||
return "Payload too large!"
|
||||
|
||||
var/static/list/topic_handlers = TopicHandlers()
|
||||
|
||||
var/list/input = params2list(T)
|
||||
var/datum/world_topic/handler
|
||||
for(var/I in topic_handlers)
|
||||
if(I in input)
|
||||
handler = topic_handlers[I]
|
||||
break
|
||||
|
||||
if((!handler || initial(handler.log)) && config && CONFIG_GET(flag/log_world_topic))
|
||||
log_topic("\"[T]\", from:[addr], master:[master], key:[key]")
|
||||
|
||||
if(!handler)
|
||||
return
|
||||
|
||||
handler = new handler()
|
||||
return handler.TryRun(input, addr)
|
||||
|
||||
/world/proc/AnnouncePR(announcement, list/payload)
|
||||
var/static/list/PRcounts = list() //PR id -> number of times announced this round
|
||||
var/id = "[payload["pull_request"]["id"]]"
|
||||
if(!PRcounts[id])
|
||||
PRcounts[id] = 1
|
||||
else
|
||||
++PRcounts[id]
|
||||
if(PRcounts[id] > PR_ANNOUNCEMENTS_PER_ROUND)
|
||||
return
|
||||
|
||||
var/final_composed = "<span class='announce'>PR: [announcement]</span>"
|
||||
for(var/client/C in GLOB.clients)
|
||||
C.AnnouncePR(final_composed)
|
||||
|
||||
/world/proc/FinishTestRun()
|
||||
set waitfor = FALSE
|
||||
var/list/fail_reasons
|
||||
if(GLOB)
|
||||
if(GLOB.total_runtimes != 0)
|
||||
fail_reasons = list("Total runtimes: [GLOB.total_runtimes]")
|
||||
#ifdef UNIT_TESTS
|
||||
if(GLOB.failed_any_test)
|
||||
LAZYADD(fail_reasons, "Unit Tests failed!")
|
||||
#endif
|
||||
if(!GLOB.log_directory)
|
||||
LAZYADD(fail_reasons, "Missing GLOB.log_directory!")
|
||||
else
|
||||
fail_reasons = list("Missing GLOB!")
|
||||
if(!fail_reasons)
|
||||
text2file("Success!", "[GLOB.log_directory]/clean_run.lk")
|
||||
else
|
||||
log_world("Test run failed!\n[fail_reasons.Join("\n")]")
|
||||
sleep(0) //yes, 0, this'll let Reboot finish and prevent byond memes
|
||||
qdel(src) //shut it down
|
||||
|
||||
/world/Reboot(reason = 0, fast_track = FALSE)
|
||||
TgsReboot()
|
||||
if (reason || fast_track) //special reboot, do none of the normal stuff
|
||||
if (usr)
|
||||
log_admin("[key_name(usr)] Has requested an immediate world restart via client side debugging tools")
|
||||
message_admins("[key_name_admin(usr)] Has requested an immediate world restart via client side debugging tools")
|
||||
to_chat(world, "<span class='boldannounce'>Rebooting World immediately due to host request</span>")
|
||||
else
|
||||
to_chat(world, "<span class='boldannounce'>Rebooting world...</span>")
|
||||
Master.Shutdown() //run SS shutdowns
|
||||
|
||||
if(TEST_RUN_PARAMETER in params)
|
||||
FinishTestRun()
|
||||
return
|
||||
|
||||
if(TgsAvailable())
|
||||
var/do_hard_reboot
|
||||
// check the hard reboot counter
|
||||
var/ruhr = CONFIG_GET(number/rounds_until_hard_restart)
|
||||
switch(ruhr)
|
||||
if(-1)
|
||||
do_hard_reboot = FALSE
|
||||
if(0)
|
||||
do_hard_reboot = TRUE
|
||||
else
|
||||
if(GLOB.restart_counter >= ruhr)
|
||||
do_hard_reboot = TRUE
|
||||
else
|
||||
text2file("[++GLOB.restart_counter]", RESTART_COUNTER_PATH)
|
||||
do_hard_reboot = FALSE
|
||||
|
||||
if(do_hard_reboot)
|
||||
log_world("World hard rebooted at [TIME_STAMP("hh:mm:ss", FALSE)]")
|
||||
shutdown_logging() // See comment below.
|
||||
TgsEndProcess()
|
||||
|
||||
log_world("World rebooted at [TIME_STAMP("hh:mm:ss", FALSE)]")
|
||||
shutdown_logging() // Past this point, no logging procs can be used, at risk of data loss.
|
||||
..()
|
||||
|
||||
/world/proc/update_status()
|
||||
|
||||
var/list/features = list()
|
||||
|
||||
/*if(GLOB.master_mode) CIT CHANGE - hides the gamemode from the hub entry, removes some useless info from the hub entry
|
||||
features += GLOB.master_mode
|
||||
|
||||
if (!GLOB.enter_allowed)
|
||||
features += "closed"*/
|
||||
|
||||
var/s = ""
|
||||
var/hostedby
|
||||
if(config)
|
||||
var/server_name = CONFIG_GET(string/servername)
|
||||
if (server_name)
|
||||
s += "<b>[server_name]</b> — "
|
||||
/*features += "[CONFIG_GET(flag/norespawn) ? "no " : ""]respawn" CIT CHANGE - removes some useless info from the hub entry
|
||||
if(CONFIG_GET(flag/allow_vote_mode))
|
||||
features += "vote"
|
||||
if(CONFIG_GET(flag/allow_ai))
|
||||
features += "AI allowed"*/
|
||||
hostedby = CONFIG_GET(string/hostedby)
|
||||
|
||||
s += "<b>[station_name()]</b>";
|
||||
s += " ("
|
||||
s += "<a href=\"https://citadel-station.net/home/\">" //Change this to wherever you want the hub to link to. CIT CHANGE - links to cit's website on the hub
|
||||
s += "Citadel" //Replace this with something else. Or ever better, delete it and uncomment the game version. CIT CHANGE - modifies the hub entry link
|
||||
s += "</a>"
|
||||
s += ")\]" //CIT CHANGE - encloses the server title in brackets to make the hub entry fancier
|
||||
s += "<br>[CONFIG_GET(string/servertagline)]<br>" //CIT CHANGE - adds a tagline!
|
||||
|
||||
var/n = 0
|
||||
for (var/mob/M in GLOB.player_list)
|
||||
if (M.client)
|
||||
n++
|
||||
|
||||
if(SSmapping.config) // this just stops the runtime, honk.
|
||||
features += "[SSmapping.config.map_name]" //CIT CHANGE - makes the hub entry display the current map
|
||||
|
||||
if(get_security_level())//CIT CHANGE - makes the hub entry show the security level
|
||||
features += "[get_security_level()] alert"
|
||||
|
||||
if (n > 1)
|
||||
features += "~[n] players"
|
||||
else if (n > 0)
|
||||
features += "~[n] player"
|
||||
|
||||
if (!host && hostedby)
|
||||
features += "hosted by <b>[hostedby]</b>"
|
||||
|
||||
if (features)
|
||||
s += "\[[jointext(features, ", ")]" //CIT CHANGE - replaces the colon here with a left bracket
|
||||
|
||||
status = s
|
||||
|
||||
/world/proc/update_hub_visibility(new_visibility)
|
||||
if(new_visibility == GLOB.hub_visibility)
|
||||
return
|
||||
GLOB.hub_visibility = new_visibility
|
||||
if(GLOB.hub_visibility)
|
||||
hub_password = "kMZy3U5jJHSiBQjr"
|
||||
else
|
||||
hub_password = "SORRYNOPASSWORD"
|
||||
|
||||
/world/proc/incrementMaxZ()
|
||||
maxz++
|
||||
SSmobs.MaxZChanged()
|
||||
SSidlenpcpool.MaxZChanged()
|
||||
#define RESTART_COUNTER_PATH "data/round_counter.txt"
|
||||
|
||||
GLOBAL_VAR(restart_counter)
|
||||
|
||||
GLOBAL_VAR(topic_status_lastcache)
|
||||
GLOBAL_LIST(topic_status_cache)
|
||||
|
||||
//This happens after the Master subsystem new(s) (it's a global datum)
|
||||
//So subsystems globals exist, but are not initialised
|
||||
/world/New()
|
||||
|
||||
log_world("World loaded at [TIME_STAMP("hh:mm:ss", FALSE)]!")
|
||||
|
||||
SetupExternalRSC()
|
||||
|
||||
GLOB.config_error_log = GLOB.world_manifest_log = GLOB.world_pda_log = GLOB.world_job_debug_log = GLOB.sql_error_log = GLOB.world_href_log = GLOB.world_runtime_log = GLOB.world_attack_log = GLOB.world_game_log = "data/logs/config_error.[GUID()].log" //temporary file used to record errors with loading config, moved to log directory once logging is set bl
|
||||
|
||||
make_datum_references_lists() //initialises global lists for referencing frequently used datums (so that we only ever do it once)
|
||||
|
||||
TgsNew()
|
||||
|
||||
GLOB.revdata = new
|
||||
|
||||
config.Load(params[OVERRIDE_CONFIG_DIRECTORY_PARAMETER])
|
||||
|
||||
//SetupLogs depends on the RoundID, so lets check
|
||||
//DB schema and set RoundID if we can
|
||||
SSdbcore.CheckSchemaVersion()
|
||||
SSdbcore.SetRoundID()
|
||||
SetupLogs()
|
||||
|
||||
#ifndef USE_CUSTOM_ERROR_HANDLER
|
||||
world.log = file("[GLOB.log_directory]/dd.log")
|
||||
#endif
|
||||
|
||||
load_admins()
|
||||
load_mentors()
|
||||
LoadVerbs(/datum/verbs/menu)
|
||||
if(CONFIG_GET(flag/usewhitelist))
|
||||
load_whitelist()
|
||||
LoadBans()
|
||||
initialize_global_loadout_items()
|
||||
reload_custom_roundstart_items_list()//Cit change - loads donator items. Remind me to remove when I port over bay's loadout system
|
||||
|
||||
GLOB.timezoneOffset = text2num(time2text(0,"hh")) * 36000
|
||||
|
||||
if(fexists(RESTART_COUNTER_PATH))
|
||||
GLOB.restart_counter = text2num(trim(file2text(RESTART_COUNTER_PATH)))
|
||||
fdel(RESTART_COUNTER_PATH)
|
||||
|
||||
if(NO_INIT_PARAMETER in params)
|
||||
return
|
||||
|
||||
Master.Initialize(10, FALSE, TRUE)
|
||||
|
||||
if(TEST_RUN_PARAMETER in params)
|
||||
HandleTestRun()
|
||||
|
||||
/world/proc/HandleTestRun()
|
||||
//trigger things to run the whole process
|
||||
Master.sleep_offline_after_initializations = FALSE
|
||||
SSticker.start_immediately = TRUE
|
||||
CONFIG_SET(number/round_end_countdown, 0)
|
||||
var/datum/callback/cb
|
||||
#ifdef UNIT_TESTS
|
||||
cb = CALLBACK(GLOBAL_PROC, /proc/RunUnitTests)
|
||||
#else
|
||||
cb = VARSET_CALLBACK(SSticker, force_ending, TRUE)
|
||||
#endif
|
||||
SSticker.OnRoundstart(CALLBACK(GLOBAL_PROC, /proc/addtimer, cb, 10 SECONDS))
|
||||
|
||||
/world/proc/SetupExternalRSC()
|
||||
#if (PRELOAD_RSC == 0)
|
||||
GLOB.external_rsc_urls = world.file2list("[global.config.directory]/external_rsc_urls.txt","\n")
|
||||
var/i=1
|
||||
while(i<=GLOB.external_rsc_urls.len)
|
||||
if(GLOB.external_rsc_urls[i])
|
||||
i++
|
||||
else
|
||||
GLOB.external_rsc_urls.Cut(i,i+1)
|
||||
#endif
|
||||
|
||||
/world/proc/SetupLogs()
|
||||
var/override_dir = params[OVERRIDE_LOG_DIRECTORY_PARAMETER]
|
||||
if(!override_dir)
|
||||
var/realtime = world.realtime
|
||||
var/texttime = time2text(realtime, "YYYY/MM/DD")
|
||||
GLOB.log_directory = "data/logs/[texttime]/round-"
|
||||
GLOB.picture_logging_prefix = "L_[time2text(realtime, "YYYYMMDD")]_"
|
||||
GLOB.picture_log_directory = "data/picture_logs/[texttime]/round-"
|
||||
if(GLOB.round_id)
|
||||
GLOB.log_directory += "[GLOB.round_id]"
|
||||
GLOB.picture_logging_prefix += "R_[GLOB.round_id]_"
|
||||
GLOB.picture_log_directory += "[GLOB.round_id]"
|
||||
else
|
||||
var/timestamp = replacetext(TIME_STAMP("hh:mm:ss", FALSE), ":", ".")
|
||||
GLOB.log_directory += "[timestamp]"
|
||||
GLOB.picture_log_directory += "[timestamp]"
|
||||
GLOB.picture_logging_prefix += "T_[timestamp]_"
|
||||
else
|
||||
GLOB.log_directory = "data/logs/[override_dir]"
|
||||
GLOB.picture_logging_prefix = "O_[override_dir]_"
|
||||
GLOB.picture_log_directory = "data/picture_logs/[override_dir]"
|
||||
|
||||
GLOB.world_game_log = "[GLOB.log_directory]/game.log"
|
||||
GLOB.world_virus_log = "[GLOB.log_directory]/virus.log"
|
||||
GLOB.world_attack_log = "[GLOB.log_directory]/attack.log"
|
||||
GLOB.world_pda_log = "[GLOB.log_directory]/pda.log"
|
||||
GLOB.world_telecomms_log = "[GLOB.log_directory]/telecomms.log"
|
||||
GLOB.world_manifest_log = "[GLOB.log_directory]/manifest.log"
|
||||
GLOB.world_href_log = "[GLOB.log_directory]/hrefs.log"
|
||||
GLOB.sql_error_log = "[GLOB.log_directory]/sql.log"
|
||||
GLOB.world_qdel_log = "[GLOB.log_directory]/qdel.log"
|
||||
GLOB.world_map_error_log = "[GLOB.log_directory]/map_errors.log"
|
||||
GLOB.world_runtime_log = "[GLOB.log_directory]/runtime.log"
|
||||
GLOB.query_debug_log = "[GLOB.log_directory]/query_debug.log"
|
||||
GLOB.world_job_debug_log = "[GLOB.log_directory]/job_debug.log"
|
||||
GLOB.tgui_log = "[GLOB.log_directory]/tgui.log"
|
||||
GLOB.subsystem_log = "[GLOB.log_directory]/subsystem.log"
|
||||
|
||||
|
||||
#ifdef UNIT_TESTS
|
||||
GLOB.test_log = file("[GLOB.log_directory]/tests.log")
|
||||
start_log(GLOB.test_log)
|
||||
#endif
|
||||
start_log(GLOB.world_game_log)
|
||||
start_log(GLOB.world_attack_log)
|
||||
start_log(GLOB.world_pda_log)
|
||||
start_log(GLOB.world_telecomms_log)
|
||||
start_log(GLOB.world_manifest_log)
|
||||
start_log(GLOB.world_href_log)
|
||||
start_log(GLOB.world_qdel_log)
|
||||
start_log(GLOB.world_runtime_log)
|
||||
start_log(GLOB.world_job_debug_log)
|
||||
start_log(GLOB.tgui_log)
|
||||
start_log(GLOB.subsystem_log)
|
||||
|
||||
GLOB.changelog_hash = md5('html/changelog.html') //for telling if the changelog has changed recently
|
||||
if(fexists(GLOB.config_error_log))
|
||||
fcopy(GLOB.config_error_log, "[GLOB.log_directory]/config_error.log")
|
||||
fdel(GLOB.config_error_log)
|
||||
|
||||
if(GLOB.round_id)
|
||||
log_game("Round ID: [GLOB.round_id]")
|
||||
|
||||
// This was printed early in startup to the world log and config_error.log,
|
||||
// but those are both private, so let's put the commit info in the runtime
|
||||
// log which is ultimately public.
|
||||
log_runtime(GLOB.revdata.get_log_message())
|
||||
|
||||
/world/Topic(T, addr, master, key)
|
||||
TGS_TOPIC //redirect to server tools if necessary
|
||||
|
||||
if(!SSfail2topic)
|
||||
return "Server not initialized."
|
||||
else if(SSfail2topic.IsRateLimited(addr))
|
||||
return "Rate limited."
|
||||
|
||||
if(length(T) > CONFIG_GET(number/topic_max_size))
|
||||
return "Payload too large!"
|
||||
|
||||
var/static/list/topic_handlers = TopicHandlers()
|
||||
|
||||
var/list/input = params2list(T)
|
||||
var/datum/world_topic/handler
|
||||
for(var/I in topic_handlers)
|
||||
if(I in input)
|
||||
handler = topic_handlers[I]
|
||||
break
|
||||
|
||||
if((!handler || initial(handler.log)) && config && CONFIG_GET(flag/log_world_topic))
|
||||
log_topic("\"[T]\", from:[addr], master:[master], key:[key]")
|
||||
|
||||
if(!handler)
|
||||
return
|
||||
|
||||
handler = new handler()
|
||||
return handler.TryRun(input, addr)
|
||||
|
||||
/world/proc/AnnouncePR(announcement, list/payload)
|
||||
var/static/list/PRcounts = list() //PR id -> number of times announced this round
|
||||
var/id = "[payload["pull_request"]["id"]]"
|
||||
if(!PRcounts[id])
|
||||
PRcounts[id] = 1
|
||||
else
|
||||
++PRcounts[id]
|
||||
if(PRcounts[id] > PR_ANNOUNCEMENTS_PER_ROUND)
|
||||
return
|
||||
|
||||
var/final_composed = "<span class='announce'>PR: [announcement]</span>"
|
||||
for(var/client/C in GLOB.clients)
|
||||
C.AnnouncePR(final_composed)
|
||||
|
||||
/world/proc/FinishTestRun()
|
||||
set waitfor = FALSE
|
||||
var/list/fail_reasons
|
||||
if(GLOB)
|
||||
if(GLOB.total_runtimes != 0)
|
||||
fail_reasons = list("Total runtimes: [GLOB.total_runtimes]")
|
||||
#ifdef UNIT_TESTS
|
||||
if(GLOB.failed_any_test)
|
||||
LAZYADD(fail_reasons, "Unit Tests failed!")
|
||||
#endif
|
||||
if(!GLOB.log_directory)
|
||||
LAZYADD(fail_reasons, "Missing GLOB.log_directory!")
|
||||
else
|
||||
fail_reasons = list("Missing GLOB!")
|
||||
if(!fail_reasons)
|
||||
text2file("Success!", "[GLOB.log_directory]/clean_run.lk")
|
||||
else
|
||||
log_world("Test run failed!\n[fail_reasons.Join("\n")]")
|
||||
sleep(0) //yes, 0, this'll let Reboot finish and prevent byond memes
|
||||
qdel(src) //shut it down
|
||||
|
||||
/world/Reboot(reason = 0, fast_track = FALSE)
|
||||
TgsReboot()
|
||||
if (reason || fast_track) //special reboot, do none of the normal stuff
|
||||
if (usr)
|
||||
log_admin("[key_name(usr)] Has requested an immediate world restart via client side debugging tools")
|
||||
message_admins("[key_name_admin(usr)] Has requested an immediate world restart via client side debugging tools")
|
||||
to_chat(world, "<span class='boldannounce'>Rebooting World immediately due to host request</span>")
|
||||
else
|
||||
to_chat(world, "<span class='boldannounce'>Rebooting world...</span>")
|
||||
Master.Shutdown() //run SS shutdowns
|
||||
|
||||
if(TEST_RUN_PARAMETER in params)
|
||||
FinishTestRun()
|
||||
return
|
||||
|
||||
if(TgsAvailable())
|
||||
var/do_hard_reboot
|
||||
// check the hard reboot counter
|
||||
var/ruhr = CONFIG_GET(number/rounds_until_hard_restart)
|
||||
switch(ruhr)
|
||||
if(-1)
|
||||
do_hard_reboot = FALSE
|
||||
if(0)
|
||||
do_hard_reboot = TRUE
|
||||
else
|
||||
if(GLOB.restart_counter >= ruhr)
|
||||
do_hard_reboot = TRUE
|
||||
else
|
||||
text2file("[++GLOB.restart_counter]", RESTART_COUNTER_PATH)
|
||||
do_hard_reboot = FALSE
|
||||
|
||||
if(do_hard_reboot)
|
||||
log_world("World hard rebooted at [TIME_STAMP("hh:mm:ss", FALSE)]")
|
||||
shutdown_logging() // See comment below.
|
||||
TgsEndProcess()
|
||||
|
||||
log_world("World rebooted at [TIME_STAMP("hh:mm:ss", FALSE)]")
|
||||
shutdown_logging() // Past this point, no logging procs can be used, at risk of data loss.
|
||||
..()
|
||||
|
||||
/world/proc/update_status()
|
||||
|
||||
var/list/features = list()
|
||||
|
||||
/*if(GLOB.master_mode) CIT CHANGE - hides the gamemode from the hub entry, removes some useless info from the hub entry
|
||||
features += GLOB.master_mode
|
||||
|
||||
if (!GLOB.enter_allowed)
|
||||
features += "closed"*/
|
||||
|
||||
var/s = ""
|
||||
var/hostedby
|
||||
if(config)
|
||||
var/server_name = CONFIG_GET(string/servername)
|
||||
if (server_name)
|
||||
s += "<b>[server_name]</b> — "
|
||||
/*features += "[CONFIG_GET(flag/norespawn) ? "no " : ""]respawn" CIT CHANGE - removes some useless info from the hub entry
|
||||
if(CONFIG_GET(flag/allow_vote_mode))
|
||||
features += "vote"
|
||||
if(CONFIG_GET(flag/allow_ai))
|
||||
features += "AI allowed"*/
|
||||
hostedby = CONFIG_GET(string/hostedby)
|
||||
|
||||
s += "<b>[station_name()]</b>";
|
||||
s += " ("
|
||||
s += "<a href=\"https://citadel-station.net/home/\">" //Change this to wherever you want the hub to link to. CIT CHANGE - links to cit's website on the hub
|
||||
s += "Citadel" //Replace this with something else. Or ever better, delete it and uncomment the game version. CIT CHANGE - modifies the hub entry link
|
||||
s += "</a>"
|
||||
s += ")\]" //CIT CHANGE - encloses the server title in brackets to make the hub entry fancier
|
||||
s += "<br>[CONFIG_GET(string/servertagline)]<br>" //CIT CHANGE - adds a tagline!
|
||||
|
||||
var/n = 0
|
||||
for (var/mob/M in GLOB.player_list)
|
||||
if (M.client)
|
||||
n++
|
||||
|
||||
if(SSmapping.config) // this just stops the runtime, honk.
|
||||
features += "[SSmapping.config.map_name]" //CIT CHANGE - makes the hub entry display the current map
|
||||
|
||||
if(get_security_level())//CIT CHANGE - makes the hub entry show the security level
|
||||
features += "[get_security_level()] alert"
|
||||
|
||||
if (n > 1)
|
||||
features += "~[n] players"
|
||||
else if (n > 0)
|
||||
features += "~[n] player"
|
||||
|
||||
if (!host && hostedby)
|
||||
features += "hosted by <b>[hostedby]</b>"
|
||||
|
||||
if (features)
|
||||
s += "\[[jointext(features, ", ")]" //CIT CHANGE - replaces the colon here with a left bracket
|
||||
|
||||
status = s
|
||||
|
||||
/world/proc/update_hub_visibility(new_visibility)
|
||||
if(new_visibility == GLOB.hub_visibility)
|
||||
return
|
||||
GLOB.hub_visibility = new_visibility
|
||||
if(GLOB.hub_visibility)
|
||||
hub_password = "kMZy3U5jJHSiBQjr"
|
||||
else
|
||||
hub_password = "SORRYNOPASSWORD"
|
||||
|
||||
/world/proc/incrementMaxZ()
|
||||
maxz++
|
||||
SSmobs.MaxZChanged()
|
||||
SSidlenpcpool.MaxZChanged()
|
||||
|
||||
@@ -319,9 +319,9 @@
|
||||
L.dust()
|
||||
else
|
||||
if(!GLOB.ratvar_awakens && L.stat == CONSCIOUS)
|
||||
vitality_drained = L.adjustToxLoss(1)
|
||||
vitality_drained = L.adjustToxLoss(1, forced = TRUE)
|
||||
else
|
||||
vitality_drained = L.adjustToxLoss(1.5)
|
||||
vitality_drained = L.adjustToxLoss(1.5, forced = TRUE)
|
||||
if(vitality_drained)
|
||||
GLOB.clockwork_vitality += vitality_drained
|
||||
else
|
||||
|
||||
@@ -24,7 +24,8 @@ Credit dupes that require a lot of manual work shouldn't be removed, unless they
|
||||
var/list/exported_atoms = list()//names of atoms sold/deleted by export
|
||||
var/list/total_amount = list() //export instance => total count of sold objects of its type, only exists if any were sold
|
||||
var/list/total_value = list() //export instance => total value of sold objects
|
||||
var/list/total_reagents = list()//export reagents => into the total vaule of the object sold
|
||||
var/list/reagents_volume = list()//export reagents => into the total volume of the object sold
|
||||
var/list/reagents_value = list()//export reagents => into the reagent type total value.
|
||||
|
||||
// external_report works as "transaction" object, pass same one in if you're doing more than one export in single go
|
||||
/proc/export_item_and_contents(atom/movable/AM, allowed_categories = EXPORT_CARGO, apply_elastic = TRUE, delete_unsold = TRUE, dry_run=FALSE, datum/export_report/external_report)
|
||||
@@ -49,8 +50,12 @@ Credit dupes that require a lot of manual work shouldn't be removed, unless they
|
||||
report.exported_atoms += " [thing.name]"
|
||||
break
|
||||
if(thing.reagents)
|
||||
for(var/datum/reagent/R in thing.reagents.reagent_list)
|
||||
report.total_reagents[R] += R.volume
|
||||
for(var/A in thing.reagents.reagent_list)
|
||||
var/datum/reagent/R = A
|
||||
if(!R.value)
|
||||
continue
|
||||
report.reagents_volume[R.name] += R.volume
|
||||
report.reagents_value[R.name] += R.volume * R.value
|
||||
if(!dry_run && (sold || delete_unsold))
|
||||
if(ismob(thing))
|
||||
thing.investigate_log("deleted through cargo export",INVESTIGATE_CARGO)
|
||||
|
||||
@@ -178,6 +178,7 @@
|
||||
icon_state = "xenos"
|
||||
item_state = "xenos_helm"
|
||||
desc = "A helmet made out of chitinous alien hide."
|
||||
alternate_screams = list('sound/voice/hiss6.ogg')
|
||||
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR|HIDESNOUT
|
||||
|
||||
/obj/item/clothing/head/fedora
|
||||
@@ -421,4 +422,4 @@
|
||||
name = "security cowboy hat"
|
||||
desc = "A security cowboy hat, perfect for any true lawman"
|
||||
icon_state = "cowboyhat_sec"
|
||||
item_state= "cowboyhat_sec"
|
||||
item_state= "cowboyhat_sec"
|
||||
|
||||
@@ -86,6 +86,7 @@
|
||||
desc = "Perfect for winter in Siberia, da?"
|
||||
icon_state = "ushankadown"
|
||||
item_state = "ushankadown"
|
||||
alternate_screams = list('sound/voice/human/cyka1.ogg', 'sound/voice/human/cheekibreeki.ogg')
|
||||
flags_inv = HIDEEARS|HIDEHAIR
|
||||
var/earflaps = 1
|
||||
cold_protection = HEAD
|
||||
@@ -164,6 +165,7 @@
|
||||
icon_state = "cardborg_h"
|
||||
item_state = "cardborg_h"
|
||||
flags_cover = HEADCOVERSEYES
|
||||
alternate_screams = list('modular_citadel/sound/voice/scream_silicon.ogg')
|
||||
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR|HIDESNOUT
|
||||
|
||||
dog_fashion = /datum/dog_fashion/head/cardborg
|
||||
|
||||
@@ -434,7 +434,7 @@ Contains:
|
||||
strip_delay = 65
|
||||
|
||||
/obj/item/clothing/suit/space/fragile/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK)
|
||||
if(!torn && prob(50))
|
||||
if(!torn && prob(50) && damage >= 5)
|
||||
to_chat(owner, "<span class='warning'>[src] tears from the damage, breaking the air-tight seal!</span>")
|
||||
clothing_flags &= ~STOPSPRESSUREDAMAGE
|
||||
name = "torn [src]."
|
||||
|
||||
@@ -826,6 +826,22 @@
|
||||
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0)
|
||||
real = FALSE
|
||||
|
||||
/obj/item/clothing/suit/hooded/wintercoat/durathread
|
||||
name = "durathread winter coat"
|
||||
desc = "The one coat to rule them all. Extremely durable while providing the utmost comfort."
|
||||
icon_state = "coatdurathread"
|
||||
item_state = "coatdurathread"
|
||||
armor = list("melee" = 15, "bullet" = 8, "laser" = 25, "energy" = 5, "bomb" = 12, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 50)
|
||||
hoodtype = /obj/item/clothing/head/hooded/winterhood/durathread
|
||||
|
||||
/obj/item/clothing/suit/hooded/wintercoat/durathread/Initialize()
|
||||
. = ..()
|
||||
allowed = GLOB.security_wintercoat_allowed
|
||||
|
||||
/obj/item/clothing/head/hooded/winterhood/durathread
|
||||
icon_state = "winterhood_durathread"
|
||||
armor = list("melee" = 20, "bullet" = 8, "laser" = 15, "energy" = 8, "bomb" = 25, "bio" = 10, "rad" = 15, "fire" = 75, "acid" = 37)
|
||||
|
||||
|
||||
/obj/item/clothing/suit/spookyghost
|
||||
name = "spooky ghost"
|
||||
|
||||
@@ -471,6 +471,7 @@
|
||||
name = "white sundress"
|
||||
desc = "Makes you want to frolic in a field of lillies."
|
||||
icon_state = "sundress_white"
|
||||
item_state = "sundress"
|
||||
item_color = "sundress_white"
|
||||
body_parts_covered = CHEST|GROIN
|
||||
fitted = FEMALE_UNIFORM_TOP
|
||||
@@ -527,6 +528,16 @@
|
||||
item_color = "assistant_formal"
|
||||
can_adjust = FALSE
|
||||
|
||||
/obj/item/clothing/under/staffassistant
|
||||
name = "staff assistant's jumpsuit"
|
||||
desc = "It's a generic grey jumpsuit. That's about what assistants are worth, anyway."
|
||||
icon = 'goon/icons/obj/item_js_rank.dmi'
|
||||
alternate_worn_icon = 'goon/icons/mob/worn_js_rank.dmi'
|
||||
icon_state = "assistant"
|
||||
item_state = "gy_suit"
|
||||
item_color = "assistant"
|
||||
mutantrace_variation = NONE
|
||||
|
||||
/obj/item/clothing/under/blacktango
|
||||
name = "black tango dress"
|
||||
desc = "Filled with Latin fire."
|
||||
@@ -580,7 +591,7 @@
|
||||
icon_state = "flower_dress"
|
||||
item_state = "sailordress"
|
||||
item_color = "flower_dress"
|
||||
body_parts_covered = CHEST|GROIN
|
||||
body_parts_covered = CHEST|GROIN|LEGS
|
||||
fitted = FEMALE_UNIFORM_TOP
|
||||
can_adjust = FALSE
|
||||
|
||||
@@ -605,9 +616,8 @@
|
||||
/obj/item/clothing/under/croptop
|
||||
name = "crop top"
|
||||
desc = "We've saved money by giving you half a shirt!"
|
||||
icon_state = "sailor_dress"
|
||||
item_state = "sailordress"
|
||||
item_color = "sailor_dress"
|
||||
icon_state = "croptop"
|
||||
item_color = "croptop"
|
||||
body_parts_covered = CHEST|GROIN|ARMS
|
||||
fitted = FEMALE_UNIFORM_TOP
|
||||
can_adjust = FALSE
|
||||
|
||||
@@ -159,6 +159,14 @@
|
||||
always_availible = TRUE
|
||||
category = CAT_CLOTHING
|
||||
|
||||
/datum/crafting_recipe/durathread_wintercoat
|
||||
name = "Durathread Winter Coat"
|
||||
result = /obj/item/clothing/suit/hooded/wintercoat/durathread
|
||||
reqs = list(/obj/item/stack/sheet/durathread = 12,
|
||||
/obj/item/stack/sheet/leather = 10)
|
||||
time = 70
|
||||
category = CAT_CLOTHING
|
||||
|
||||
/datum/crafting_recipe/wintercoat_cosmic
|
||||
name = "Cosmic Winter Coat"
|
||||
result = /obj/item/clothing/suit/hooded/wintercoat/cosmic
|
||||
|
||||
@@ -234,8 +234,8 @@
|
||||
dat += "<tr><td width='260px'>[G.get_name()]</td><td>"
|
||||
if(can_extract && G.mutability_flags & PLANT_GENE_EXTRACTABLE)
|
||||
dat += "<a href='?src=[REF(src)];gene=[REF(G)];op=extract'>Extract</a>"
|
||||
if(G.mutability_flags & PLANT_GENE_REMOVABLE)
|
||||
dat += "<a href='?src=[REF(src)];gene=[REF(G)];op=remove'>Remove</a>"
|
||||
if(G.mutability_flags & PLANT_GENE_REMOVABLE)
|
||||
dat += "<a href='?src=[REF(src)];gene=[REF(G)];op=remove'>Remove</a>"
|
||||
dat += "</td></tr>"
|
||||
dat += "</table>"
|
||||
else
|
||||
|
||||
+39
-15
@@ -98,6 +98,7 @@
|
||||
var/force_update = 0
|
||||
var/emergency_lights = FALSE
|
||||
var/nightshift_lights = FALSE
|
||||
var/nightshift_requires_auth = FALSE
|
||||
var/last_nightshift_switch = 0
|
||||
var/update_state = -1
|
||||
var/update_overlay = -1
|
||||
@@ -239,6 +240,7 @@
|
||||
update_icon()
|
||||
|
||||
make_terminal()
|
||||
update_nightshift_auth_requirement()
|
||||
|
||||
addtimer(CALLBACK(src, .proc/update), 5)
|
||||
|
||||
@@ -852,6 +854,7 @@
|
||||
/obj/machinery/power/apc/ui_data(mob/user)
|
||||
var/list/data = list(
|
||||
"locked" = locked && !(integration_cog && is_servant_of_ratvar(user)),
|
||||
"lock_nightshift" = nightshift_requires_auth,
|
||||
"failTime" = failure_timer,
|
||||
"isOperating" = operating,
|
||||
"externalPower" = main_status,
|
||||
@@ -959,7 +962,18 @@
|
||||
. = UI_INTERACTIVE
|
||||
|
||||
/obj/machinery/power/apc/ui_act(action, params)
|
||||
if(..() || !can_use(usr, 1) || (locked && !usr.has_unlimited_silicon_privilege && !failure_timer && !(integration_cog && (is_servant_of_ratvar(usr)))))
|
||||
if(..() || !can_use(usr, 1))
|
||||
return
|
||||
if(failure_timer)
|
||||
if(action == "reboot")
|
||||
failure_timer = 0
|
||||
update_icon()
|
||||
update()
|
||||
var/authorized = (!locked || usr.has_unlimited_silicon_privilege || (integration_cog && (is_servant_of_ratvar(usr))))
|
||||
if((action == "toggle_nightshift") && (!nightshift_requires_auth || authorized))
|
||||
toggle_nightshift_lights()
|
||||
return TRUE
|
||||
if(!authorized)
|
||||
return
|
||||
switch(action)
|
||||
if("lock")
|
||||
@@ -969,22 +983,19 @@
|
||||
else
|
||||
locked = !locked
|
||||
update_icon()
|
||||
. = TRUE
|
||||
return TRUE
|
||||
if("cover")
|
||||
coverlocked = !coverlocked
|
||||
. = TRUE
|
||||
return TRUE
|
||||
if("breaker")
|
||||
toggle_breaker()
|
||||
. = TRUE
|
||||
if("toggle_nightshift")
|
||||
toggle_nightshift_lights()
|
||||
. = TRUE
|
||||
return TRUE
|
||||
if("charge")
|
||||
chargemode = !chargemode
|
||||
if(!chargemode)
|
||||
charging = APC_NOT_CHARGING
|
||||
update_icon()
|
||||
. = TRUE
|
||||
return TRUE
|
||||
if("channel")
|
||||
if(params["eqp"])
|
||||
equipment = setsubsystem(text2num(params["eqp"]))
|
||||
@@ -998,24 +1009,23 @@
|
||||
environ = setsubsystem(text2num(params["env"]))
|
||||
update_icon()
|
||||
update()
|
||||
. = TRUE
|
||||
return TRUE
|
||||
if("overload")
|
||||
if(usr.has_unlimited_silicon_privilege)
|
||||
overload_lighting()
|
||||
. = TRUE
|
||||
return TRUE
|
||||
if("hack")
|
||||
if(get_malf_status(usr))
|
||||
malfhack(usr)
|
||||
return TRUE
|
||||
if("occupy")
|
||||
if(get_malf_status(usr))
|
||||
malfoccupy(usr)
|
||||
return TRUE
|
||||
if("deoccupy")
|
||||
if(get_malf_status(usr))
|
||||
malfvacate()
|
||||
if("reboot")
|
||||
failure_timer = 0
|
||||
update_icon()
|
||||
update()
|
||||
return TRUE
|
||||
if("emergency_lighting")
|
||||
emergency_lights = !emergency_lights
|
||||
for(var/obj/machinery/light/L in area)
|
||||
@@ -1023,7 +1033,7 @@
|
||||
L.no_emergency = emergency_lights
|
||||
INVOKE_ASYNC(L, /obj/machinery/light/.proc/update, FALSE)
|
||||
CHECK_TICK
|
||||
return 1
|
||||
return TRUE
|
||||
|
||||
/obj/machinery/power/apc/proc/toggle_breaker()
|
||||
if(!is_operational() || failure_timer)
|
||||
@@ -1429,6 +1439,8 @@
|
||||
|
||||
/obj/machinery/power/apc/proc/set_nightshift(on)
|
||||
set waitfor = FALSE
|
||||
if(nightshift_lights == on)
|
||||
return
|
||||
nightshift_lights = on
|
||||
for(var/obj/machinery/light/L in area)
|
||||
if(L.nightshift_allowed)
|
||||
@@ -1436,6 +1448,18 @@
|
||||
L.update(FALSE)
|
||||
CHECK_TICK
|
||||
|
||||
/obj/machinery/power/apc/proc/update_nightshift_auth_requirement()
|
||||
nightshift_requires_auth = nightshift_toggle_requires_auth()
|
||||
|
||||
/obj/machinery/power/apc/proc/nightshift_toggle_requires_auth()
|
||||
if(!area)
|
||||
return FALSE
|
||||
var/configured_level = CONFIG_GET(number/night_shift_public_areas_only)
|
||||
var/our_level = area.nightshift_public_area
|
||||
var/public_requires_auth = CONFIG_GET(flag/nightshift_toggle_public_requires_auth)
|
||||
var/normal_requires_auth = CONFIG_GET(flag/nightshift_toggle_requires_auth)
|
||||
return (configured_level && our_level && ((our_level <= configured_level)? public_requires_auth : normal_requires_auth))
|
||||
|
||||
#undef UPSTATE_CELL_IN
|
||||
#undef UPSTATE_OPENED1
|
||||
#undef UPSTATE_OPENED2
|
||||
|
||||
@@ -434,11 +434,11 @@
|
||||
state = "Gas"
|
||||
var/const/P = 3 //The number of seconds between life ticks
|
||||
var/T = initial(R.metabolization_rate) * (60 / P)
|
||||
var/datum/chemical_reaction/Rcr = get_chemical_reaction(R.type)
|
||||
var/datum/chemical_reaction/Rcr = get_chemical_reaction(R)
|
||||
if(Rcr && Rcr.FermiChem)
|
||||
fermianalyze = TRUE
|
||||
var/pHpeakCache = (Rcr.OptimalpHMin + Rcr.OptimalpHMax)/2
|
||||
var/datum/reagent/targetReagent = beaker.reagents.has_reagent(R.type)
|
||||
var/datum/reagent/targetReagent = beaker.reagents.has_reagent(R)
|
||||
|
||||
if(!targetReagent)
|
||||
CRASH("Tried to find a reagent that doesn't exist in the chem_master!")
|
||||
@@ -463,9 +463,9 @@
|
||||
var/T = initial(R.metabolization_rate) * (60 / P)
|
||||
if(istype(R, /datum/reagent/fermi))
|
||||
fermianalyze = TRUE
|
||||
var/datum/chemical_reaction/Rcr = get_chemical_reaction(R.type)
|
||||
var/datum/chemical_reaction/Rcr = get_chemical_reaction(R)
|
||||
var/pHpeakCache = (Rcr.OptimalpHMin + Rcr.OptimalpHMax)/2
|
||||
var/datum/reagent/targetReagent = reagents.has_reagent(R.type)
|
||||
var/datum/reagent/targetReagent = reagents.has_reagent(R)
|
||||
|
||||
if(!targetReagent)
|
||||
CRASH("Tried to find a reagent that doesn't exist in the chem_master!")
|
||||
@@ -724,7 +724,7 @@
|
||||
return FALSE
|
||||
|
||||
/obj/machinery/chem_master/proc/end_fermi_reaction()//Ends any reactions upon moving.
|
||||
if(beaker.reagents.fermiIsReacting)
|
||||
if(beaker && beaker.reagents.fermiIsReacting)
|
||||
beaker.reagents.fermiEnd()
|
||||
|
||||
/obj/machinery/chem_master/proc/isgoodnumber(num)
|
||||
|
||||
@@ -60,7 +60,7 @@
|
||||
B = new(T)
|
||||
if(data["blood_DNA"])
|
||||
B.blood_DNA[data["blood_DNA"]] = data["blood_type"]
|
||||
if(!B.reagents)
|
||||
if(B.reagents)
|
||||
B.reagents.add_reagent(type, reac_volume)
|
||||
B.update_icon()
|
||||
|
||||
|
||||
@@ -128,8 +128,7 @@
|
||||
target.visible_message("<span class='danger'>[M] has been splashed with something!</span>", \
|
||||
"<span class='userdanger'>[M] has been splashed with something!</span>")
|
||||
for(var/datum/reagent/A in reagents.reagent_list)
|
||||
R += A.type + " ("
|
||||
R += num2text(A.volume) + "),"
|
||||
R += "[A.type] ([A.volume]),"
|
||||
|
||||
if(thrownby)
|
||||
log_combat(thrownby, M, "splashed", R)
|
||||
|
||||
@@ -199,6 +199,9 @@
|
||||
amount_per_transfer_from_this = 5
|
||||
list_reagents = list(/datum/reagent/consumable/condensedcapsaicin = 40)
|
||||
|
||||
/obj/item/reagent_containers/spray/pepper/empty // for techfab printing
|
||||
list_reagents = null
|
||||
|
||||
/obj/item/reagent_containers/spray/pepper/suicide_act(mob/living/carbon/user)
|
||||
user.visible_message("<span class='suicide'>[user] begins huffing \the [src]! It looks like [user.p_theyre()] getting a dirty high!</span>")
|
||||
return OXYLOSS
|
||||
|
||||
@@ -54,7 +54,7 @@
|
||||
/datum/design/desttagger
|
||||
name = "Destination Tagger"
|
||||
id = "desttagger"
|
||||
build_type = AUTOLATHE
|
||||
build_type = AUTOLATHE | PROTOLATHE
|
||||
materials = list(MAT_METAL = 250, MAT_GLASS = 125)
|
||||
build_path = /obj/item/destTagger
|
||||
category = list("initial", "Electronics")
|
||||
@@ -62,7 +62,7 @@
|
||||
/datum/design/handlabeler
|
||||
name = "Hand Labeler"
|
||||
id = "handlabel"
|
||||
build_type = AUTOLATHE
|
||||
build_type = AUTOLATHE | PROTOLATHE
|
||||
materials = list(MAT_METAL = 150, MAT_GLASS = 125)
|
||||
build_path = /obj/item/hand_labeler
|
||||
category = list("initial", "Electronics")
|
||||
@@ -73,4 +73,4 @@
|
||||
build_type = AUTOLATHE
|
||||
materials = list(MAT_GLASS = 20)
|
||||
build_path = /obj/item/stock_parts/cell/emergency_light
|
||||
category = list("initial", "Electronics")
|
||||
category = list("initial", "Electronics")
|
||||
|
||||
+33
-22
@@ -68,66 +68,74 @@
|
||||
/datum/design/scalpel
|
||||
name = "Scalpel"
|
||||
id = "scalpel"
|
||||
build_type = AUTOLATHE
|
||||
build_type = AUTOLATHE | PROTOLATHE
|
||||
materials = list(MAT_METAL = 4000, MAT_GLASS = 1000)
|
||||
build_path = /obj/item/scalpel
|
||||
category = list("initial", "Medical")
|
||||
category = list("initial", "Medical","Tool Designs")
|
||||
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE
|
||||
|
||||
/datum/design/circular_saw
|
||||
name = "Circular Saw"
|
||||
id = "circular_saw"
|
||||
build_type = AUTOLATHE
|
||||
build_type = AUTOLATHE | PROTOLATHE
|
||||
materials = list(MAT_METAL = 10000, MAT_GLASS = 6000)
|
||||
build_path = /obj/item/circular_saw
|
||||
category = list("initial", "Medical")
|
||||
category = list("initial", "Medical","Tool Designs")
|
||||
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE
|
||||
|
||||
/datum/design/surgicaldrill
|
||||
name = "Surgical Drill"
|
||||
id = "surgicaldrill"
|
||||
build_type = AUTOLATHE
|
||||
build_type = AUTOLATHE | PROTOLATHE
|
||||
materials = list(MAT_METAL = 10000, MAT_GLASS = 6000)
|
||||
build_path = /obj/item/surgicaldrill
|
||||
category = list("initial", "Medical")
|
||||
category = list("initial", "Medical","Tool Designs")
|
||||
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE
|
||||
|
||||
/datum/design/retractor
|
||||
name = "Retractor"
|
||||
id = "retractor"
|
||||
build_type = AUTOLATHE
|
||||
build_type = AUTOLATHE | PROTOLATHE
|
||||
materials = list(MAT_METAL = 6000, MAT_GLASS = 3000)
|
||||
build_path = /obj/item/retractor
|
||||
category = list("initial", "Medical")
|
||||
category = list("initial", "Medical","Tool Designs")
|
||||
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE
|
||||
|
||||
/datum/design/cautery
|
||||
name = "Cautery"
|
||||
id = "cautery"
|
||||
build_type = AUTOLATHE
|
||||
build_type = AUTOLATHE | PROTOLATHE
|
||||
materials = list(MAT_METAL = 2500, MAT_GLASS = 750)
|
||||
build_path = /obj/item/cautery
|
||||
category = list("initial", "Medical")
|
||||
category = list("initial", "Medical","Tool Designs")
|
||||
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE
|
||||
|
||||
/datum/design/hemostat
|
||||
name = "Hemostat"
|
||||
id = "hemostat"
|
||||
build_type = AUTOLATHE
|
||||
build_type = AUTOLATHE | PROTOLATHE
|
||||
materials = list(MAT_METAL = 5000, MAT_GLASS = 2500)
|
||||
build_path = /obj/item/hemostat
|
||||
category = list("initial", "Medical")
|
||||
category = list("initial", "Medical","Tool Designs")
|
||||
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE
|
||||
|
||||
/datum/design/beaker
|
||||
name = "Beaker"
|
||||
id = "beaker"
|
||||
build_type = AUTOLATHE
|
||||
build_type = AUTOLATHE | PROTOLATHE
|
||||
materials = list(MAT_GLASS = 500)
|
||||
build_path = /obj/item/reagent_containers/glass/beaker
|
||||
category = list("initial", "Medical")
|
||||
category = list("initial", "Medical","Medical Designs")
|
||||
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SERVICE | DEPARTMENTAL_FLAG_SCIENCE
|
||||
|
||||
/datum/design/large_beaker
|
||||
name = "Large Beaker"
|
||||
id = "large_beaker"
|
||||
build_type = AUTOLATHE
|
||||
build_type = AUTOLATHE | PROTOLATHE
|
||||
materials = list(MAT_GLASS = 2500)
|
||||
build_path = /obj/item/reagent_containers/glass/beaker/large
|
||||
category = list("initial", "Medical")
|
||||
category = list("initial", "Medical","Medical Designs")
|
||||
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SERVICE | DEPARTMENTAL_FLAG_SCIENCE
|
||||
|
||||
/datum/design/healthanalyzer
|
||||
name = "Health Analyzer"
|
||||
@@ -141,10 +149,11 @@
|
||||
/datum/design/pillbottle
|
||||
name = "Pill Bottle"
|
||||
id = "pillbottle"
|
||||
build_type = AUTOLATHE
|
||||
build_type = AUTOLATHE | PROTOLATHE
|
||||
materials = list(MAT_METAL = 20, MAT_GLASS = 100)
|
||||
build_path = /obj/item/storage/pill_bottle
|
||||
category = list("initial", "Medical")
|
||||
category = list("initial", "Medical","Medical Designs")
|
||||
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
|
||||
|
||||
/datum/design/syringe
|
||||
name = "Syringe"
|
||||
@@ -165,15 +174,17 @@
|
||||
/datum/design/hypovialsmall
|
||||
name = "Hypovial"
|
||||
id = "hypovial"
|
||||
build_type = AUTOLATHE
|
||||
build_type = AUTOLATHE | PROTOLATHE
|
||||
materials = list(MAT_METAL = 500)
|
||||
build_path = /obj/item/reagent_containers/glass/bottle/vial/small
|
||||
category = list("initial","Medical")
|
||||
category = list("initial","Medical","Medical Designs")
|
||||
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
|
||||
|
||||
/datum/design/hypoviallarge
|
||||
name = "Large Hypovial"
|
||||
id = "large_hypovial"
|
||||
build_type = AUTOLATHE
|
||||
build_type = AUTOLATHE | PROTOLATHE
|
||||
materials = list(MAT_METAL = 2500)
|
||||
build_path = /obj/item/reagent_containers/glass/bottle/vial/large
|
||||
category = list("initial","Medical")
|
||||
category = list("initial","Medical","Medical Designs")
|
||||
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
|
||||
|
||||
+24
-17
@@ -68,58 +68,65 @@
|
||||
/datum/design/pipe_painter
|
||||
name = "Pipe Painter"
|
||||
id = "pipe_painter"
|
||||
build_type = AUTOLATHE
|
||||
build_type = AUTOLATHE | PROTOLATHE
|
||||
materials = list(MAT_METAL = 5000, MAT_GLASS = 2000)
|
||||
build_path = /obj/item/pipe_painter
|
||||
category = list("initial", "Misc")
|
||||
category = list("initial", "Misc","Tool Designs")
|
||||
departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING
|
||||
|
||||
/datum/design/airlock_painter
|
||||
name = "Airlock Painter"
|
||||
id = "airlock_painter"
|
||||
build_type = AUTOLATHE
|
||||
build_type = AUTOLATHE | PROTOLATHE
|
||||
materials = list(MAT_METAL = 50, MAT_GLASS = 50)
|
||||
build_path = /obj/item/airlock_painter
|
||||
category = list("initial", "Misc")
|
||||
category = list("initial", "Misc","Tool Designs")
|
||||
departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING
|
||||
|
||||
/datum/design/cultivator
|
||||
name = "Cultivator"
|
||||
id = "cultivator"
|
||||
build_type = AUTOLATHE
|
||||
build_type = AUTOLATHE | PROTOLATHE
|
||||
materials = list(MAT_METAL=50)
|
||||
build_path = /obj/item/cultivator
|
||||
category = list("initial","Misc")
|
||||
category = list("initial","Misc","Tool Designs")
|
||||
departmental_flags = DEPARTMENTAL_FLAG_SERVICE
|
||||
|
||||
/datum/design/plant_analyzer
|
||||
name = "Plant Analyzer"
|
||||
id = "plant_analyzer"
|
||||
build_type = AUTOLATHE
|
||||
build_type = AUTOLATHE | PROTOLATHE
|
||||
materials = list(MAT_METAL = 30, MAT_GLASS = 20)
|
||||
build_path = /obj/item/plant_analyzer
|
||||
category = list("initial","Misc")
|
||||
category = list("initial","Misc","Tool Designs")
|
||||
departmental_flags = DEPARTMENTAL_FLAG_SERVICE
|
||||
|
||||
/datum/design/shovel
|
||||
name = "Shovel"
|
||||
id = "shovel"
|
||||
build_type = AUTOLATHE
|
||||
build_type = AUTOLATHE | PROTOLATHE
|
||||
materials = list(MAT_METAL = 50)
|
||||
build_path = /obj/item/shovel
|
||||
category = list("initial","Misc")
|
||||
category = list("initial","Misc","Tool Designs")
|
||||
departmental_flags = DEPARTMENTAL_FLAG_SERVICE | DEPARTMENTAL_FLAG_CARGO
|
||||
|
||||
/datum/design/spade
|
||||
name = "Spade"
|
||||
id = "spade"
|
||||
build_type = AUTOLATHE
|
||||
build_type = AUTOLATHE | PROTOLATHE
|
||||
materials = list(MAT_METAL = 50)
|
||||
build_path = /obj/item/shovel/spade
|
||||
category = list("initial","Misc")
|
||||
category = list("initial","Misc","Tool Designs")
|
||||
departmental_flags = DEPARTMENTAL_FLAG_SERVICE
|
||||
|
||||
/datum/design/hatchet
|
||||
name = "Hatchet"
|
||||
id = "hatchet"
|
||||
build_type = AUTOLATHE
|
||||
build_type = AUTOLATHE | PROTOLATHE
|
||||
materials = list(MAT_METAL = 15000)
|
||||
build_path = /obj/item/hatchet
|
||||
category = list("initial","Misc")
|
||||
category = list("initial","Misc","Tool Designs")
|
||||
departmental_flags = DEPARTMENTAL_FLAG_SERVICE
|
||||
|
||||
/datum/design/recorder
|
||||
name = "Universal Recorder"
|
||||
@@ -220,10 +227,10 @@
|
||||
/datum/design/packageWrap
|
||||
name = "Package Wrapping"
|
||||
id = "packagewrap"
|
||||
build_type = AUTOLATHE
|
||||
build_type = AUTOLATHE | PROTOLATHE
|
||||
materials = list(MAT_METAL = 200, MAT_GLASS = 200)
|
||||
build_path = /obj/item/stack/packageWrap
|
||||
category = list("initial", "Misc")
|
||||
category = list("initial", "Misc","Equipment")
|
||||
maxstack = 30
|
||||
|
||||
/datum/design/holodisk
|
||||
@@ -248,4 +255,4 @@
|
||||
build_type = AUTOLATHE
|
||||
materials = list(MAT_METAL = 300, MAT_GLASS = 150)
|
||||
build_path = /obj/item/key/collar
|
||||
category = list("initial", "Misc")
|
||||
category = list("initial", "Misc")
|
||||
|
||||
@@ -7,18 +7,20 @@
|
||||
/datum/design/bucket
|
||||
name = "Bucket"
|
||||
id = "bucket"
|
||||
build_type = AUTOLATHE
|
||||
build_type = AUTOLATHE | PROTOLATHE
|
||||
materials = list(MAT_METAL = 200)
|
||||
build_path = /obj/item/reagent_containers/glass/bucket
|
||||
category = list("initial","Tools")
|
||||
category = list("initial","Tools","Tool Designs")
|
||||
departmental_flags = DEPARTMENTAL_FLAG_SERVICE
|
||||
|
||||
/datum/design/crowbar
|
||||
name = "Pocket Crowbar"
|
||||
id = "crowbar"
|
||||
build_type = AUTOLATHE
|
||||
build_type = AUTOLATHE | PROTOLATHE
|
||||
materials = list(MAT_METAL = 50)
|
||||
build_path = /obj/item/crowbar
|
||||
category = list("initial","Tools")
|
||||
category = list("initial","Tools","Tool Designs")
|
||||
departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING | DEPARTMENTAL_FLAG_SCIENCE
|
||||
|
||||
/datum/design/flashlight
|
||||
name = "Flashlight"
|
||||
@@ -63,10 +65,11 @@
|
||||
/datum/design/tscanner
|
||||
name = "T-Ray Scanner"
|
||||
id = "tscanner"
|
||||
build_type = AUTOLATHE
|
||||
build_type = AUTOLATHE | PROTOLATHE
|
||||
materials = list(MAT_METAL = 150)
|
||||
build_path = /obj/item/t_scanner
|
||||
category = list("initial","Tools")
|
||||
category = list("initial","Tools","Tool Designs")
|
||||
departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING
|
||||
|
||||
/datum/design/weldingtool
|
||||
name = "Welding Tool"
|
||||
@@ -74,7 +77,8 @@
|
||||
build_type = AUTOLATHE
|
||||
materials = list(MAT_METAL = 70, MAT_GLASS = 20)
|
||||
build_path = /obj/item/weldingtool
|
||||
category = list("initial","Tools")
|
||||
category = list("initial","Tools","Tool Designs")
|
||||
departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING | DEPARTMENTAL_FLAG_SCIENCE
|
||||
|
||||
/datum/design/mini_weldingtool
|
||||
name = "Emergency Welding Tool"
|
||||
@@ -87,26 +91,28 @@
|
||||
/datum/design/screwdriver
|
||||
name = "Screwdriver"
|
||||
id = "screwdriver"
|
||||
build_type = AUTOLATHE
|
||||
build_type = AUTOLATHE | PROTOLATHE
|
||||
materials = list(MAT_METAL = 75)
|
||||
build_path = /obj/item/screwdriver
|
||||
category = list("initial","Tools")
|
||||
|
||||
category = list("initial","Tools","Tool Designs")
|
||||
departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING | DEPARTMENTAL_FLAG_SCIENCE
|
||||
/datum/design/wirecutters
|
||||
name = "Wirecutters"
|
||||
id = "wirecutters"
|
||||
build_type = AUTOLATHE
|
||||
build_type = AUTOLATHE | PROTOLATHE
|
||||
materials = list(MAT_METAL = 80)
|
||||
build_path = /obj/item/wirecutters
|
||||
category = list("initial","Tools")
|
||||
category = list("initial","Tools","Tool Designs")
|
||||
departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING | DEPARTMENTAL_FLAG_SCIENCE
|
||||
|
||||
/datum/design/wrench
|
||||
name = "Wrench"
|
||||
id = "wrench"
|
||||
build_type = AUTOLATHE
|
||||
build_type = AUTOLATHE | PROTOLATHE
|
||||
materials = list(MAT_METAL = 150)
|
||||
build_path = /obj/item/wrench
|
||||
category = list("initial","Tools")
|
||||
category = list("initial","Tools","Tool Designs")
|
||||
departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING | DEPARTMENTAL_FLAG_SCIENCE
|
||||
|
||||
/datum/design/welding_helmet
|
||||
name = "Welding Helmet"
|
||||
@@ -122,8 +128,9 @@
|
||||
build_type = AUTOLATHE
|
||||
materials = list(MAT_METAL = 10, MAT_GLASS = 5)
|
||||
build_path = /obj/item/stack/cable_coil/random
|
||||
category = list("initial","Tools")
|
||||
category = list("initial","Tools","Tool Designs")
|
||||
maxstack = 30
|
||||
departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING | DEPARTMENTAL_FLAG_SCIENCE
|
||||
|
||||
/datum/design/toolbox
|
||||
name = "Toolbox"
|
||||
|
||||
@@ -53,7 +53,7 @@
|
||||
materials = list(MAT_DIAMOND = 1500, MAT_PLASMA = 1500)
|
||||
build_path = /obj/item/stack/ore/bluespace_crystal/artificial
|
||||
category = list("Bluespace Designs")
|
||||
departmental_flags = DEPARTMENTAL_FLAG_SCIENCE
|
||||
departmental_flags = DEPARTMENTAL_FLAG_SCIENCE | DEPARTMENTAL_FLAG_ENGINEERING
|
||||
|
||||
/datum/design/telesci_gps
|
||||
name = "GPS Device"
|
||||
|
||||
@@ -23,6 +23,16 @@
|
||||
category = list("Electronics")
|
||||
departmental_flags = DEPARTMENTAL_FLAG_ALL
|
||||
|
||||
/datum/design/ai_cam_upgrade
|
||||
name = "AI Surveillance Software Update"
|
||||
desc = "A software package that will allow an artificial intelligence to 'hear' from its cameras via lip reading."
|
||||
id = "ai_cam_upgrade"
|
||||
build_type = PROTOLATHE
|
||||
materials = list(MAT_METAL = 5000, MAT_GLASS = 5000, MAT_GOLD = 15000, MAT_SILVER = 15000, MAT_DIAMOND = 20000, MAT_PLASMA = 10000)
|
||||
build_path = /obj/item/surveillance_upgrade
|
||||
category = list("Electronics")
|
||||
departmental_flags = DEPARTMENTAL_FLAG_SCIENCE
|
||||
|
||||
///////////////////////////////////
|
||||
//////////Nanite Devices///////////
|
||||
///////////////////////////////////
|
||||
|
||||
@@ -162,16 +162,6 @@
|
||||
category = list("Medical Designs")
|
||||
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
|
||||
|
||||
/datum/design/holobarrier_med
|
||||
name = "PENLITE holobarrier projector"
|
||||
desc = "PENLITE holobarriers, a device that halts individuals with malicious diseases."
|
||||
build_type = PROTOLATHE
|
||||
build_path = /obj/item/holosign_creator/medical
|
||||
materials = list(MAT_METAL = 500, MAT_GLASS = 500, MAT_SILVER = 100) //a hint of silver since it can troll 2 antags (bad viros and sentient disease)
|
||||
id = "holobarrier_med"
|
||||
category = list("Medical Designs")
|
||||
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
|
||||
|
||||
/datum/design/healthanalyzer_advanced
|
||||
name = "Advanced Health Analyzer"
|
||||
desc = "A hand-held body scanner able to distinguish vital signs of the subject with high accuracy."
|
||||
@@ -182,6 +172,16 @@
|
||||
category = list("Medical Designs")
|
||||
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
|
||||
|
||||
/datum/design/medspray
|
||||
name = "Medical Spray"
|
||||
desc = "A medical spray bottle, designed for precision application, with an unscrewable cap."
|
||||
id = "medspray"
|
||||
build_path = /obj/item/reagent_containers/medspray
|
||||
build_type = PROTOLATHE
|
||||
materials = list(MAT_METAL = 2500, MAT_GLASS = 500)
|
||||
category = list("Medical Designs")
|
||||
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
|
||||
|
||||
/datum/design/medicalkit
|
||||
name = "Empty Medkit"
|
||||
desc = "A plastic medical kit for storging medical items."
|
||||
@@ -217,7 +217,7 @@
|
||||
desc = "Produce additional disks for storing genetic data."
|
||||
id = "cloning_disk"
|
||||
build_type = PROTOLATHE
|
||||
materials = list(MAT_METAL = 300, MAT_GLASS = 100, MAT_SILVER=50)
|
||||
materials = list(MAT_METAL = 300, MAT_GLASS = 100, MAT_SILVER = 50)
|
||||
build_path = /obj/item/disk/data
|
||||
category = list("Medical Designs")
|
||||
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE
|
||||
@@ -238,6 +238,7 @@
|
||||
|
||||
/datum/design/defibrillator
|
||||
name = "Defibrillator"
|
||||
desc = "A portable defibrillator, used for resuscitating recently deceased crew."
|
||||
id = "defibrillator"
|
||||
build_type = PROTOLATHE
|
||||
build_path = /obj/item/defibrillator
|
||||
@@ -257,10 +258,10 @@
|
||||
|
||||
/datum/design/defib_heal
|
||||
name = "Defibrillator Healing disk"
|
||||
desc = "An upgrade which increases the healing power of the defibrillator"
|
||||
desc = "An upgrade which increases the healing power of the defibrillator."
|
||||
id = "defib_heal"
|
||||
build_type = PROTOLATHE
|
||||
materials = list(MAT_METAL=16000, MAT_GLASS = 18000, MAT_GOLD = 6000, MAT_SILVER = 6000)
|
||||
materials = list(MAT_METAL = 16000, MAT_GLASS = 18000, MAT_GOLD = 6000, MAT_SILVER = 6000)
|
||||
build_path = /obj/item/disk/medical/defib_heal
|
||||
construction_time = 10
|
||||
category = list("Misc")
|
||||
@@ -268,10 +269,10 @@
|
||||
|
||||
/datum/design/defib_shock
|
||||
name = "Defibrillator Anti-Shock Disk"
|
||||
desc = "A safety upgrade that guarantees only the patient will get shocked"
|
||||
desc = "A safety upgrade that guarantees only the patient will get shocked."
|
||||
id = "defib_shock"
|
||||
build_type = PROTOLATHE
|
||||
materials = list(MAT_METAL=16000, MAT_GLASS = 18000, MAT_GOLD = 6000, MAT_SILVER = 6000)
|
||||
materials = list(MAT_METAL = 16000, MAT_GLASS = 18000, MAT_GOLD = 6000, MAT_SILVER = 6000)
|
||||
build_path = /obj/item/disk/medical/defib_shock
|
||||
construction_time = 10
|
||||
category = list("Misc")
|
||||
@@ -279,10 +280,10 @@
|
||||
|
||||
/datum/design/defib_decay
|
||||
name = "Defibrillator Body-Decay Extender Disk"
|
||||
desc = "An upgrade allowing the defibrillator to work on more decayed bodies"
|
||||
desc = "An upgrade allowing the defibrillator to work on more decayed bodies."
|
||||
id = "defib_decay"
|
||||
build_type = PROTOLATHE
|
||||
materials = list(MAT_METAL=16000, MAT_GLASS = 18000, MAT_GOLD = 16000, MAT_SILVER = 6000, MAT_TITANIUM = 2000)
|
||||
materials = list(MAT_METAL = 16000, MAT_GLASS = 18000, MAT_GOLD = 16000, MAT_SILVER = 6000, MAT_TITANIUM = 2000)
|
||||
build_path = /obj/item/disk/medical/defib_decay
|
||||
construction_time = 10
|
||||
category = list("Misc")
|
||||
@@ -290,15 +291,23 @@
|
||||
|
||||
/datum/design/defib_speed
|
||||
name = "Defibrillator Fast Charge Disk"
|
||||
desc = "An upgrade to the defibrillator capacitors, which let it charge faster"
|
||||
desc = "An upgrade to the defibrillator's capacitors, which lets it charge faster."
|
||||
id = "defib_speed"
|
||||
build_type = PROTOLATHE
|
||||
build_path = /obj/item/disk/medical/defib_speed
|
||||
materials = list(MAT_METAL=16000, MAT_GLASS = 8000, MAT_GOLD = 26000, MAT_SILVER = 26000)
|
||||
materials = list(MAT_METAL = 16000, MAT_GLASS = 8000, MAT_GOLD = 26000, MAT_SILVER = 26000)
|
||||
construction_time = 10
|
||||
category = list("Misc")
|
||||
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
|
||||
|
||||
/datum/design/defibrillator_compact
|
||||
name = "Compact Defibrillator"
|
||||
desc = "A compact defibrillator that can be worn on a belt."
|
||||
id = "defibrillator_compact"
|
||||
build_type = PROTOLATHE
|
||||
build_path = /obj/item/defibrillator/compact
|
||||
materials = list(MAT_METAL = 16000, MAT_GLASS = 8000, MAT_SILVER = 6000, MAT_GOLD = 3000)
|
||||
|
||||
/////////////////////////////////////////
|
||||
//////////Cybernetic Implants////////////
|
||||
/////////////////////////////////////////
|
||||
@@ -595,115 +604,6 @@
|
||||
category = list("Medical Designs")
|
||||
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
|
||||
|
||||
/////////////////////
|
||||
//Adv Surgery Tools//
|
||||
/////////////////////
|
||||
|
||||
/datum/design/drapes
|
||||
name = "Plastic Drapes"
|
||||
desc = "A large surgery drape made of plastic."
|
||||
id = "drapes"
|
||||
build_type = PROTOLATHE
|
||||
materials = list(MAT_PLASTIC = 2500)
|
||||
build_path = /obj/item/surgical_drapes
|
||||
category = list("Medical Designs")
|
||||
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE
|
||||
|
||||
/datum/design/retractor_adv
|
||||
name = "Advanced Retractor"
|
||||
desc = "An almagation of rods and gears, able to function as both a surgical clamp and retractor. "
|
||||
id = "retractor_adv"
|
||||
build_type = PROTOLATHE
|
||||
materials = list(MAT_METAL = 500, MAT_GLASS = 500, MAT_SILVER = 1500, MAT_GOLD = 1000)
|
||||
build_path = /obj/item/retractor/advanced
|
||||
category = list("Medical Designs")
|
||||
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE
|
||||
|
||||
/datum/design/surgicaldrill_adv
|
||||
name = "Surgical Laser Drill"
|
||||
desc = "It projects a high power laser used for medical applications."
|
||||
id = "surgicaldrill_adv"
|
||||
build_type = PROTOLATHE
|
||||
materials = list(MAT_METAL = 2500, MAT_GLASS = 2500, MAT_SILVER = 6000, MAT_GOLD = 5500, MAT_DIAMOND = 3500)
|
||||
build_path = /obj/item/surgicaldrill/advanced
|
||||
category = list("Medical Designs")
|
||||
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE
|
||||
|
||||
/datum/design/scalpel_adv
|
||||
name = "Laser Scalpel"
|
||||
desc = "An advanced scalpel which uses laser technology to cut."
|
||||
id = "scalpel_adv"
|
||||
build_type = PROTOLATHE
|
||||
materials = list(MAT_METAL = 1500, MAT_GLASS = 1500, MAT_SILVER = 4000, MAT_GOLD = 2500)
|
||||
build_path = /obj/item/scalpel/advanced
|
||||
category = list("Medical Designs")
|
||||
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE
|
||||
|
||||
|
||||
/////////////////////////////////////////
|
||||
//////////Alien Surgery Tools////////////
|
||||
/////////////////////////////////////////
|
||||
|
||||
/datum/design/alienscalpel
|
||||
name = "Alien Scalpel"
|
||||
desc = "An advanced scalpel obtained through Abductor technology."
|
||||
id = "alien_scalpel"
|
||||
build_path = /obj/item/scalpel/alien
|
||||
build_type = PROTOLATHE
|
||||
materials = list(MAT_METAL = 2000, MAT_SILVER = 1500, MAT_PLASMA = 500, MAT_TITANIUM = 1500)
|
||||
category = list("Medical Designs")
|
||||
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
|
||||
|
||||
/datum/design/alienhemostat
|
||||
name = "Alien Hemostat"
|
||||
desc = "An advanced hemostat obtained through Abductor technology."
|
||||
id = "alien_hemostat"
|
||||
build_path = /obj/item/hemostat/alien
|
||||
build_type = PROTOLATHE
|
||||
materials = list(MAT_METAL = 2000, MAT_SILVER = 1500, MAT_PLASMA = 500, MAT_TITANIUM = 1500)
|
||||
category = list("Medical Designs")
|
||||
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
|
||||
|
||||
/datum/design/alienretractor
|
||||
name = "Alien Retractor"
|
||||
desc = "An advanced retractor obtained through Abductor technology."
|
||||
id = "alien_retractor"
|
||||
build_path = /obj/item/retractor/alien
|
||||
build_type = PROTOLATHE
|
||||
materials = list(MAT_METAL = 2000, MAT_SILVER = 1500, MAT_PLASMA = 500, MAT_TITANIUM = 1500)
|
||||
category = list("Medical Designs")
|
||||
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
|
||||
|
||||
/datum/design/aliensaw
|
||||
name = "Alien Circular Saw"
|
||||
desc = "An advanced surgical saw obtained through Abductor technology."
|
||||
id = "alien_saw"
|
||||
build_path = /obj/item/circular_saw/alien
|
||||
build_type = PROTOLATHE
|
||||
materials = list(MAT_METAL = 10000, MAT_SILVER = 2500, MAT_PLASMA = 1000, MAT_TITANIUM = 1500)
|
||||
category = list("Medical Designs")
|
||||
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
|
||||
|
||||
/datum/design/aliendrill
|
||||
name = "Alien Drill"
|
||||
desc = "An advanced drill obtained through Abductor technology."
|
||||
id = "alien_drill"
|
||||
build_path = /obj/item/surgicaldrill/alien
|
||||
build_type = PROTOLATHE
|
||||
materials = list(MAT_METAL = 10000, MAT_SILVER = 2500, MAT_PLASMA = 1000, MAT_TITANIUM = 1500)
|
||||
category = list("Medical Designs")
|
||||
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
|
||||
|
||||
/datum/design/aliencautery
|
||||
name = "Alien Cautery"
|
||||
desc = "An advanced cautery obtained through Abductor technology."
|
||||
id = "alien_cautery"
|
||||
build_path = /obj/item/cautery/alien
|
||||
build_type = PROTOLATHE
|
||||
materials = list(MAT_METAL = 2000, MAT_SILVER = 1500, MAT_PLASMA = 500, MAT_TITANIUM = 1500)
|
||||
category = list("Medical Designs")
|
||||
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
|
||||
|
||||
/datum/design/cybernetic_ears
|
||||
name = "Cybernetic Ears"
|
||||
desc = "A pair of cybernetic ears."
|
||||
|
||||
@@ -257,7 +257,7 @@
|
||||
departmental_flags = DEPARTMENTAL_FLAG_SERVICE
|
||||
|
||||
/datum/design/roastingstick
|
||||
name = "Advanced roasting stick"
|
||||
name = "Advanced Roasting Stick"
|
||||
desc = "A roasting stick for cooking sausages in exotic ovens."
|
||||
id = "roastingstick"
|
||||
build_type = PROTOLATHE
|
||||
@@ -267,7 +267,7 @@
|
||||
departmental_flags = DEPARTMENTAL_FLAG_SERVICE
|
||||
|
||||
/datum/design/locator
|
||||
name = "Bluespace locator"
|
||||
name = "Bluespace Locator"
|
||||
desc = "Used to track portable teleportation beacons and targets with embedded tracking implants."
|
||||
id = "locator"
|
||||
build_type = PROTOLATHE
|
||||
@@ -276,6 +276,15 @@
|
||||
category = list("Equipment")
|
||||
departmental_flags = DEPARTMENTAL_FLAG_SECURITY
|
||||
|
||||
/datum/design/donksoft_refill
|
||||
name = "Donksoft Toy Vendor Refill"
|
||||
desc = "A refill canister for Donksoft Toy Vendors."
|
||||
id = "donksoft_refill"
|
||||
build_type = PROTOLATHE
|
||||
materials = list(MAT_METAL = 25000, MAT_GLASS = 15000, MAT_PLASMA = 20000, MAT_GOLD = 10000, MAT_SILVER = 10000)
|
||||
build_path = /obj/item/vending_refill/donksoft
|
||||
category = list("Equipment")
|
||||
|
||||
/////////////////////////////////////////
|
||||
////////////Janitor Designs//////////////
|
||||
/////////////////////////////////////////
|
||||
@@ -320,8 +329,28 @@
|
||||
category = list("Equipment")
|
||||
departmental_flags = DEPARTMENTAL_FLAG_SERVICE
|
||||
|
||||
/datum/design/spraybottle
|
||||
name = "Spray Bottle"
|
||||
desc = "A spray bottle, with an unscrewable top."
|
||||
id = "spraybottle"
|
||||
build_type = PROTOLATHE
|
||||
materials = list(MAT_METAL = 3000, MAT_GLASS = 200)
|
||||
build_path = /obj/item/reagent_containers/spray
|
||||
category = list("Equipment")
|
||||
departmental_flags = DEPARTMENTAL_FLAG_SERVICE
|
||||
|
||||
/datum/design/beartrap
|
||||
name = "Bear Trap"
|
||||
desc = "A trap used to catch space bears and other legged creatures."
|
||||
id = "beartrap"
|
||||
build_type = PROTOLATHE
|
||||
materials = list(MAT_METAL = 5000, MAT_TITANIUM = 1000)
|
||||
build_path = /obj/item/restraints/legcuffs/beartrap
|
||||
category = list("Equipment")
|
||||
departmental_flags = DEPARTMENTAL_FLAG_SERVICE
|
||||
|
||||
/////////////////////////////////////////
|
||||
////////////Holosign Designs//////////////
|
||||
////////////Holosign Designs/////////////
|
||||
/////////////////////////////////////////
|
||||
|
||||
/datum/design/holosign
|
||||
@@ -384,141 +413,20 @@
|
||||
category = list("Equipment")
|
||||
departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING
|
||||
|
||||
/datum/design/holobarrier_med
|
||||
name = "PENLITE holobarrier projector"
|
||||
desc = "PENLITE holobarriers, a device that halts individuals with malicious diseases."
|
||||
build_type = PROTOLATHE
|
||||
build_path = /obj/item/holosign_creator/medical
|
||||
materials = list(MAT_METAL = 500, MAT_GLASS = 500, MAT_SILVER = 100) //a hint of silver since it can troll 2 antags (bad viros and sentient disease)
|
||||
id = "holobarrier_med"
|
||||
category = list("Medical Designs")
|
||||
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
|
||||
|
||||
///////////////////////////////
|
||||
////////////Tools//////////////
|
||||
///////////////////////////////
|
||||
|
||||
/datum/design/rcd_upgrade/frames
|
||||
name = "RCD frames designs upgrade"
|
||||
desc = "Adds the computer frame and machine frame to the RCD."
|
||||
id = "rcd_upgrade_frames"
|
||||
build_type = PROTOLATHE
|
||||
materials = list(MAT_METAL = 5000, MAT_GLASS = 2500, MAT_SILVER = 1500, MAT_TITANIUM = 2000)
|
||||
build_path = /obj/item/rcd_upgrade/frames
|
||||
category = list("Equipment")
|
||||
departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING
|
||||
|
||||
/datum/design/rcd_upgrade/simple_circuits
|
||||
name = "RCD simple circuits designs upgrade"
|
||||
desc = "Adds the simple circuits to the RCD."
|
||||
id = "rcd_upgrade_simple_circuits"
|
||||
build_type = PROTOLATHE
|
||||
materials = list(MAT_METAL = 5000, MAT_GLASS = 2500, MAT_SILVER = 1500, MAT_TITANIUM = 2000)
|
||||
build_path = /obj/item/rcd_upgrade/simple_circuits
|
||||
category = list("Equipment")
|
||||
departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING
|
||||
|
||||
/datum/design/exwelder
|
||||
name = "Experimental Welding Tool"
|
||||
desc = "An experimental welder capable of self-fuel generation."
|
||||
id = "exwelder"
|
||||
build_type = PROTOLATHE
|
||||
materials = list(MAT_METAL = 1000, MAT_GLASS = 500, MAT_PLASMA = 1500, MAT_URANIUM = 200)
|
||||
build_path = /obj/item/weldingtool/experimental
|
||||
category = list("Equipment")
|
||||
departmental_flags = DEPARTMENTAL_FLAG_SCIENCE | DEPARTMENTAL_FLAG_ENGINEERING
|
||||
|
||||
/datum/design/handdrill
|
||||
name = "Hand Drill"
|
||||
desc = "A small electric hand drill with an interchangeable screwdriver and bolt bit"
|
||||
id = "handdrill"
|
||||
build_type = PROTOLATHE
|
||||
materials = list(MAT_METAL = 3500, MAT_SILVER = 1500, MAT_TITANIUM = 2500)
|
||||
build_path = /obj/item/screwdriver/power
|
||||
category = list("Equipment")
|
||||
departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING
|
||||
|
||||
/datum/design/jawsoflife
|
||||
name = "Jaws of Life"
|
||||
desc = "A small, compact Jaws of Life with an interchangeable pry jaws and cutting jaws"
|
||||
id = "jawsoflife" // added one more requirment since the Jaws of Life are a bit OP
|
||||
build_path = /obj/item/crowbar/power
|
||||
build_type = PROTOLATHE
|
||||
materials = list(MAT_METAL = 4500, MAT_SILVER = 2500, MAT_TITANIUM = 3500)
|
||||
category = list("Equipment")
|
||||
departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING
|
||||
|
||||
/datum/design/rcd_loaded
|
||||
name = "Rapid Construction Device"
|
||||
desc = "A tool that can construct and deconstruct walls, airlocks and floors on the fly."
|
||||
id = "rcd_loaded"
|
||||
build_type = PROTOLATHE
|
||||
materials = list(MAT_METAL = MINERAL_MATERIAL_AMOUNT, MAT_GLASS = MINERAL_MATERIAL_AMOUNT) // costs more than what it did in the autolathe, this one comes loaded.
|
||||
build_path = /obj/item/construction/rcd/loaded
|
||||
category = list("Equipment")
|
||||
departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING
|
||||
|
||||
/datum/design/rpd
|
||||
name = "Rapid Pipe Dispenser"
|
||||
desc = "A tool that can construct and deconstruct pipes on the fly."
|
||||
id = "rpd"
|
||||
build_type = PROTOLATHE
|
||||
materials = list(MAT_METAL = 75000, MAT_GLASS = 37500)
|
||||
build_path = /obj/item/pipe_dispenser
|
||||
category = list("Equipment")
|
||||
departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING
|
||||
|
||||
/datum/design/alienwrench
|
||||
name = "Alien Wrench"
|
||||
desc = "An advanced wrench obtained through Abductor technology."
|
||||
id = "alien_wrench"
|
||||
build_path = /obj/item/wrench/abductor
|
||||
build_type = PROTOLATHE
|
||||
materials = list(MAT_METAL = 5000, MAT_SILVER = 2500, MAT_PLASMA = 1000, MAT_TITANIUM = 2000, MAT_DIAMOND = 2000)
|
||||
category = list("Equipment")
|
||||
departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING
|
||||
|
||||
/datum/design/alienwirecutters
|
||||
name = "Alien Wirecutters"
|
||||
desc = "Advanced wirecutters obtained through Abductor technology."
|
||||
id = "alien_wirecutters"
|
||||
build_path = /obj/item/wirecutters/abductor
|
||||
build_type = PROTOLATHE
|
||||
materials = list(MAT_METAL = 5000, MAT_SILVER = 2500, MAT_PLASMA = 1000, MAT_TITANIUM = 2000, MAT_DIAMOND = 2000)
|
||||
category = list("Equipment")
|
||||
departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING
|
||||
|
||||
/datum/design/alienscrewdriver
|
||||
name = "Alien Screwdriver"
|
||||
desc = "An advanced screwdriver obtained through Abductor technology."
|
||||
id = "alien_screwdriver"
|
||||
build_path = /obj/item/screwdriver/abductor
|
||||
build_type = PROTOLATHE
|
||||
materials = list(MAT_METAL = 5000, MAT_SILVER = 2500, MAT_PLASMA = 1000, MAT_TITANIUM = 2000, MAT_DIAMOND = 2000)
|
||||
category = list("Equipment")
|
||||
departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING
|
||||
|
||||
/datum/design/aliencrowbar
|
||||
name = "Alien Crowbar"
|
||||
desc = "An advanced crowbar obtained through Abductor technology."
|
||||
id = "alien_crowbar"
|
||||
build_path = /obj/item/crowbar/abductor
|
||||
build_type = PROTOLATHE
|
||||
materials = list(MAT_METAL = 5000, MAT_SILVER = 2500, MAT_PLASMA = 1000, MAT_TITANIUM = 2000, MAT_DIAMOND = 2000)
|
||||
category = list("Equipment")
|
||||
departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING
|
||||
|
||||
/datum/design/alienwelder
|
||||
name = "Alien Welding Tool"
|
||||
desc = "An advanced welding tool obtained through Abductor technology."
|
||||
id = "alien_welder"
|
||||
build_path = /obj/item/weldingtool/abductor
|
||||
build_type = PROTOLATHE
|
||||
materials = list(MAT_METAL = 5000, MAT_SILVER = 2500, MAT_PLASMA = 5000, MAT_TITANIUM = 2000, MAT_DIAMOND = 2000)
|
||||
category = list("Equipment")
|
||||
departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING
|
||||
|
||||
/datum/design/alienmultitool
|
||||
name = "Alien Multitool"
|
||||
desc = "An advanced multitool obtained through Abductor technology."
|
||||
id = "alien_multitool"
|
||||
build_path = /obj/item/multitool/abductor
|
||||
build_type = PROTOLATHE
|
||||
materials = list(MAT_METAL = 5000, MAT_SILVER = 2500, MAT_PLASMA = 5000, MAT_TITANIUM = 2000, MAT_DIAMOND = 2000)
|
||||
category = list("Equipment")
|
||||
departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING
|
||||
|
||||
/datum/design/quantum_keycard
|
||||
name = "Quantum Keycard"
|
||||
desc = "Allows for the construction of a quantum keycard."
|
||||
@@ -550,7 +458,7 @@
|
||||
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE
|
||||
|
||||
/////////////////////////////////////////
|
||||
////////////Armour///////////////////////
|
||||
/////////////////Armour//////////////////
|
||||
/////////////////////////////////////////
|
||||
|
||||
/datum/design/reactive_armour
|
||||
@@ -564,7 +472,71 @@
|
||||
departmental_flags = DEPARTMENTAL_FLAG_SCIENCE | DEPARTMENTAL_FLAG_ENGINEERING
|
||||
|
||||
/////////////////////////////////////////
|
||||
////////////Meteor///////////////////////
|
||||
/////////////Security////////////////////
|
||||
/////////////////////////////////////////
|
||||
|
||||
/datum/design/seclite
|
||||
name = "Seclite"
|
||||
desc = "A robust flashlight used by security."
|
||||
id = "seclite"
|
||||
build_type = PROTOLATHE
|
||||
materials = list(MAT_METAL = 2500)
|
||||
build_path = /obj/item/flashlight/seclite
|
||||
category = list("Equipment")
|
||||
departmental_flags = DEPARTMENTAL_FLAG_SECURITY
|
||||
|
||||
/datum/design/detective_scanner
|
||||
name = "Forensic Scanner"
|
||||
desc = "Used to remotely scan objects and biomass for DNA and fingerprints. Can print a report of the findings."
|
||||
id = "detective_scanner"
|
||||
build_type = PROTOLATHE
|
||||
materials = list(MAT_METAL = 5000, MAT_GLASS = 1000, MAT_GOLD = 2500, MAT_SILVER = 2000)
|
||||
build_path = /obj/item/detective_scanner
|
||||
category = list("Equipment")
|
||||
departmental_flags = DEPARTMENTAL_FLAG_SECURITY
|
||||
|
||||
/datum/design/pepperspray
|
||||
name = "Pepper Spray"
|
||||
desc = "Manufactured by UhangInc, used to blind and down an opponent quickly. Printed pepper sprays do not contain reagents."
|
||||
id = "pepperspray"
|
||||
build_type = PROTOLATHE
|
||||
materials = list(MAT_METAL = 5000, MAT_GLASS = 1000)
|
||||
build_path = /obj/item/reagent_containers/spray/pepper/empty
|
||||
category = list("Equipment")
|
||||
departmental_flags = DEPARTMENTAL_FLAG_SECURITY
|
||||
|
||||
/datum/design/bola_energy
|
||||
name = "Energy Bola"
|
||||
desc = "A specialized hard-light bola designed to ensnare fleeing criminals and aid in arrests."
|
||||
id = "bola_energy"
|
||||
build_type = PROTOLATHE
|
||||
materials = list(MAT_SILVER = 500, MAT_PLASMA = 500, MAT_TITANIUM = 500)
|
||||
build_path = /obj/item/restraints/legcuffs/bola/energy
|
||||
category = list("Equipment")
|
||||
departmental_flags = DEPARTMENTAL_FLAG_SECURITY
|
||||
|
||||
/datum/design/zipties
|
||||
name = "Zipties"
|
||||
desc = "Plastic, disposable zipties that can be used to restrain temporarily but are destroyed after use."
|
||||
id = "zipties"
|
||||
build_type = PROTOLATHE
|
||||
materials = list(MAT_PLASTIC = 250)
|
||||
build_path = /obj/item/restraints/handcuffs/cable/zipties
|
||||
category = list("Equipment")
|
||||
departmental_flags = DEPARTMENTAL_FLAG_SECURITY
|
||||
|
||||
/datum/design/evidencebag
|
||||
name = "Evidence Bag"
|
||||
desc = "An empty evidence bag."
|
||||
id = "evidencebag"
|
||||
build_type = PROTOLATHE
|
||||
materials = list(MAT_PLASTIC = 100)
|
||||
build_path = /obj/item/evidencebag
|
||||
category = list("Equipment")
|
||||
departmental_flags = DEPARTMENTAL_FLAG_SECURITY
|
||||
|
||||
/////////////////////////////////////////
|
||||
/////////////////Meteors/////////////////
|
||||
/////////////////////////////////////////
|
||||
|
||||
/datum/design/meteor_defence
|
||||
|
||||
@@ -68,4 +68,4 @@
|
||||
materials = list(MAT_METAL = 4000, MAT_PLASMA = 4000)
|
||||
build_path = /obj/item/stack/sheet/mineral/abductor
|
||||
category = list("Stock Parts")
|
||||
departmental_flags = DEPARTMENTAL_FLAG_CARGO | DEPARTMENTAL_FLAG_SCIENCE
|
||||
departmental_flags = DEPARTMENTAL_FLAG_CARGO | DEPARTMENTAL_FLAG_SCIENCE | DEPARTMENTAL_FLAG_ENGINEERING
|
||||
|
||||
@@ -0,0 +1,246 @@
|
||||
/////////////////////////////////////////
|
||||
/////////////////Tools///////////////////
|
||||
/////////////////////////////////////////
|
||||
|
||||
/datum/design/rcd_upgrade/frames
|
||||
name = "RCD frames designs upgrade"
|
||||
desc = "Adds the computer frame and machine frame to the RCD."
|
||||
id = "rcd_upgrade_frames"
|
||||
build_type = PROTOLATHE
|
||||
materials = list(MAT_METAL = 5000, MAT_GLASS = 2500, MAT_SILVER = 1500, MAT_TITANIUM = 2000)
|
||||
build_path = /obj/item/rcd_upgrade/frames
|
||||
category = list("Tool Designs")
|
||||
departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING
|
||||
|
||||
/datum/design/rcd_upgrade/simple_circuits
|
||||
name = "RCD simple circuits designs upgrade"
|
||||
desc = "Adds the simple circuits to the RCD."
|
||||
id = "rcd_upgrade_simple_circuits"
|
||||
build_type = PROTOLATHE
|
||||
materials = list(MAT_METAL = 5000, MAT_GLASS = 2500, MAT_SILVER = 1500, MAT_TITANIUM = 2000)
|
||||
build_path = /obj/item/rcd_upgrade/simple_circuits
|
||||
category = list("Tool Designs")
|
||||
departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING
|
||||
|
||||
/datum/design/rcd_loaded
|
||||
name = "Rapid Construction Device"
|
||||
desc = "A tool that can construct and deconstruct walls, airlocks and floors on the fly."
|
||||
id = "rcd_loaded"
|
||||
build_type = PROTOLATHE
|
||||
materials = list(MAT_METAL = MINERAL_MATERIAL_AMOUNT, MAT_GLASS = MINERAL_MATERIAL_AMOUNT) // costs more than what it did in the autolathe, this one comes loaded.
|
||||
build_path = /obj/item/construction/rcd/loaded
|
||||
category = list("Tool Designs")
|
||||
departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING
|
||||
|
||||
/datum/design/rpd
|
||||
name = "Rapid Pipe Dispenser"
|
||||
desc = "A tool that can construct and deconstruct pipes on the fly."
|
||||
id = "rpd"
|
||||
build_type = PROTOLATHE
|
||||
materials = list(MAT_METAL = 75000, MAT_GLASS = 37500)
|
||||
build_path = /obj/item/pipe_dispenser
|
||||
category = list("Tool Designs")
|
||||
departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING
|
||||
|
||||
/datum/design/handdrill
|
||||
name = "Hand Drill"
|
||||
desc = "A small electric hand drill with an interchangeable screwdriver and bolt bit"
|
||||
id = "handdrill"
|
||||
build_type = PROTOLATHE
|
||||
materials = list(MAT_METAL = 3500, MAT_SILVER = 1500, MAT_TITANIUM = 2500)
|
||||
build_path = /obj/item/screwdriver/power
|
||||
category = list("Tool Designs")
|
||||
departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING
|
||||
|
||||
/datum/design/jawsoflife
|
||||
name = "Jaws of Life"
|
||||
desc = "A small, compact Jaws of Life with an interchangeable pry jaws and cutting jaws"
|
||||
id = "jawsoflife" // added one more requirment since the Jaws of Life are a bit OP
|
||||
build_path = /obj/item/crowbar/power
|
||||
build_type = PROTOLATHE
|
||||
materials = list(MAT_METAL = 4500, MAT_SILVER = 2500, MAT_TITANIUM = 3500)
|
||||
category = list("Tool Designs")
|
||||
departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING
|
||||
|
||||
/datum/design/exwelder
|
||||
name = "Experimental Welding Tool"
|
||||
desc = "An experimental welder capable of self-fuel generation."
|
||||
id = "exwelder"
|
||||
build_type = PROTOLATHE
|
||||
materials = list(MAT_METAL = 1000, MAT_GLASS = 500, MAT_PLASMA = 1500, MAT_URANIUM = 200)
|
||||
build_path = /obj/item/weldingtool/experimental
|
||||
category = list("Tool Designs")
|
||||
departmental_flags = DEPARTMENTAL_FLAG_SCIENCE | DEPARTMENTAL_FLAG_ENGINEERING
|
||||
|
||||
/////////////////////////////////////////
|
||||
//////////////Alien Tools////////////////
|
||||
/////////////////////////////////////////
|
||||
|
||||
/datum/design/alienwrench
|
||||
name = "Alien Wrench"
|
||||
desc = "An advanced wrench obtained through Abductor technology."
|
||||
id = "alien_wrench"
|
||||
build_path = /obj/item/wrench/abductor
|
||||
build_type = PROTOLATHE
|
||||
materials = list(MAT_METAL = 5000, MAT_SILVER = 2500, MAT_PLASMA = 1000, MAT_TITANIUM = 2000, MAT_DIAMOND = 2000)
|
||||
category = list("Tool Designs")
|
||||
departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING
|
||||
|
||||
/datum/design/alienwirecutters
|
||||
name = "Alien Wirecutters"
|
||||
desc = "Advanced wirecutters obtained through Abductor technology."
|
||||
id = "alien_wirecutters"
|
||||
build_path = /obj/item/wirecutters/abductor
|
||||
build_type = PROTOLATHE
|
||||
materials = list(MAT_METAL = 5000, MAT_SILVER = 2500, MAT_PLASMA = 1000, MAT_TITANIUM = 2000, MAT_DIAMOND = 2000)
|
||||
category = list("Tool Designs")
|
||||
departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING
|
||||
|
||||
/datum/design/alienscrewdriver
|
||||
name = "Alien Screwdriver"
|
||||
desc = "An advanced screwdriver obtained through Abductor technology."
|
||||
id = "alien_screwdriver"
|
||||
build_path = /obj/item/screwdriver/abductor
|
||||
build_type = PROTOLATHE
|
||||
materials = list(MAT_METAL = 5000, MAT_SILVER = 2500, MAT_PLASMA = 1000, MAT_TITANIUM = 2000, MAT_DIAMOND = 2000)
|
||||
category = list("Tool Designs")
|
||||
departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING
|
||||
|
||||
/datum/design/aliencrowbar
|
||||
name = "Alien Crowbar"
|
||||
desc = "An advanced crowbar obtained through Abductor technology."
|
||||
id = "alien_crowbar"
|
||||
build_path = /obj/item/crowbar/abductor
|
||||
build_type = PROTOLATHE
|
||||
materials = list(MAT_METAL = 5000, MAT_SILVER = 2500, MAT_PLASMA = 1000, MAT_TITANIUM = 2000, MAT_DIAMOND = 2000)
|
||||
category = list("Tool Designs")
|
||||
departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING
|
||||
|
||||
/datum/design/alienwelder
|
||||
name = "Alien Welding Tool"
|
||||
desc = "An advanced welding tool obtained through Abductor technology."
|
||||
id = "alien_welder"
|
||||
build_path = /obj/item/weldingtool/abductor
|
||||
build_type = PROTOLATHE
|
||||
materials = list(MAT_METAL = 5000, MAT_SILVER = 2500, MAT_PLASMA = 5000, MAT_TITANIUM = 2000, MAT_DIAMOND = 2000)
|
||||
category = list("Tool Designs")
|
||||
departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING
|
||||
|
||||
/datum/design/alienmultitool
|
||||
name = "Alien Multitool"
|
||||
desc = "An advanced multitool obtained through Abductor technology."
|
||||
id = "alien_multitool"
|
||||
build_path = /obj/item/multitool/abductor
|
||||
build_type = PROTOLATHE
|
||||
materials = list(MAT_METAL = 5000, MAT_SILVER = 2500, MAT_PLASMA = 5000, MAT_TITANIUM = 2000, MAT_DIAMOND = 2000)
|
||||
category = list("Tool Designs")
|
||||
departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING
|
||||
|
||||
/////////////////////////////////////////
|
||||
/////////Alien Surgical Tools////////////
|
||||
/////////////////////////////////////////
|
||||
|
||||
/datum/design/alienscalpel
|
||||
name = "Alien Scalpel"
|
||||
desc = "An advanced scalpel obtained through Abductor technology."
|
||||
id = "alien_scalpel"
|
||||
build_path = /obj/item/scalpel/alien
|
||||
build_type = PROTOLATHE
|
||||
materials = list(MAT_METAL = 2000, MAT_SILVER = 1500, MAT_PLASMA = 500, MAT_TITANIUM = 1500)
|
||||
category = list("Tool Designs")
|
||||
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
|
||||
|
||||
/datum/design/alienhemostat
|
||||
name = "Alien Hemostat"
|
||||
desc = "An advanced hemostat obtained through Abductor technology."
|
||||
id = "alien_hemostat"
|
||||
build_path = /obj/item/hemostat/alien
|
||||
build_type = PROTOLATHE
|
||||
materials = list(MAT_METAL = 2000, MAT_SILVER = 1500, MAT_PLASMA = 500, MAT_TITANIUM = 1500)
|
||||
category = list("Tool Designs")
|
||||
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
|
||||
|
||||
/datum/design/alienretractor
|
||||
name = "Alien Retractor"
|
||||
desc = "An advanced retractor obtained through Abductor technology."
|
||||
id = "alien_retractor"
|
||||
build_path = /obj/item/retractor/alien
|
||||
build_type = PROTOLATHE
|
||||
materials = list(MAT_METAL = 2000, MAT_SILVER = 1500, MAT_PLASMA = 500, MAT_TITANIUM = 1500)
|
||||
category = list("Tool Designs")
|
||||
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
|
||||
|
||||
/datum/design/aliensaw
|
||||
name = "Alien Circular Saw"
|
||||
desc = "An advanced surgical saw obtained through Abductor technology."
|
||||
id = "alien_saw"
|
||||
build_path = /obj/item/circular_saw/alien
|
||||
build_type = PROTOLATHE
|
||||
materials = list(MAT_METAL = 10000, MAT_SILVER = 2500, MAT_PLASMA = 1000, MAT_TITANIUM = 1500)
|
||||
category = list("Tool Designs")
|
||||
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
|
||||
|
||||
/datum/design/aliendrill
|
||||
name = "Alien Drill"
|
||||
desc = "An advanced drill obtained through Abductor technology."
|
||||
id = "alien_drill"
|
||||
build_path = /obj/item/surgicaldrill/alien
|
||||
build_type = PROTOLATHE
|
||||
materials = list(MAT_METAL = 10000, MAT_SILVER = 2500, MAT_PLASMA = 1000, MAT_TITANIUM = 1500)
|
||||
category = list("Tool Designs")
|
||||
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
|
||||
|
||||
/datum/design/aliencautery
|
||||
name = "Alien Cautery"
|
||||
desc = "An advanced cautery obtained through Abductor technology."
|
||||
id = "alien_cautery"
|
||||
build_path = /obj/item/cautery/alien
|
||||
build_type = PROTOLATHE
|
||||
materials = list(MAT_METAL = 2000, MAT_SILVER = 1500, MAT_PLASMA = 500, MAT_TITANIUM = 1500)
|
||||
category = list("Tool Designs")
|
||||
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
|
||||
|
||||
|
||||
//////////////////////
|
||||
//Adv. Surgery Tools//
|
||||
//////////////////////
|
||||
|
||||
/datum/design/drapes
|
||||
name = "Plastic Drapes"
|
||||
desc = "A large surgery drape made of plastic."
|
||||
id = "drapes"
|
||||
build_type = PROTOLATHE
|
||||
materials = list(MAT_PLASTIC = 2500)
|
||||
build_path = /obj/item/surgical_drapes
|
||||
category = list("Tool Designs")
|
||||
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE
|
||||
|
||||
/datum/design/retractor_adv
|
||||
name = "Advanced Retractor"
|
||||
desc = "An almagation of rods and gears, able to function as both a surgical clamp and retractor. "
|
||||
id = "retractor_adv"
|
||||
build_type = PROTOLATHE
|
||||
materials = list(MAT_METAL = 500, MAT_GLASS = 500, MAT_SILVER = 1500, MAT_GOLD = 1000)
|
||||
build_path = /obj/item/retractor/advanced
|
||||
category = list("Tool Designs")
|
||||
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE
|
||||
|
||||
/datum/design/surgicaldrill_adv
|
||||
name = "Surgical Laser Drill"
|
||||
desc = "It projects a high power laser used for medical applications."
|
||||
id = "surgicaldrill_adv"
|
||||
build_type = PROTOLATHE
|
||||
materials = list(MAT_METAL = 2500, MAT_GLASS = 2500, MAT_SILVER = 6000, MAT_GOLD = 5500, MAT_DIAMOND = 3500)
|
||||
build_path = /obj/item/surgicaldrill/advanced
|
||||
category = list("Tool Designs")
|
||||
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE
|
||||
|
||||
/datum/design/scalpel_adv
|
||||
name = "Laser Scalpel"
|
||||
desc = "An advanced scalpel which uses laser technology to cut."
|
||||
id = "scalpel_adv"
|
||||
build_type = PROTOLATHE
|
||||
materials = list(MAT_METAL = 1500, MAT_GLASS = 1500, MAT_SILVER = 4000, MAT_GOLD = 2500)
|
||||
build_path = /obj/item/scalpel/advanced
|
||||
category = list("Tool Designs")
|
||||
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE
|
||||
@@ -9,6 +9,7 @@
|
||||
"Bluespace Designs",
|
||||
"Stock Parts",
|
||||
"Equipment",
|
||||
"Tool Designs",
|
||||
"Mining Designs",
|
||||
"Electronics",
|
||||
"Weapons",
|
||||
@@ -21,4 +22,4 @@
|
||||
|
||||
/obj/machinery/rnd/production/protolathe/disconnect_console()
|
||||
linked_console.linked_lathe = null
|
||||
..()
|
||||
..()
|
||||
|
||||
@@ -9,6 +9,7 @@
|
||||
"Bluespace Designs",
|
||||
"Stock Parts",
|
||||
"Equipment",
|
||||
"Tool Designs",
|
||||
"Mining Designs",
|
||||
"Electronics",
|
||||
"Weapons",
|
||||
@@ -31,4 +32,4 @@
|
||||
production_animation = "protolathe_n"
|
||||
requires_console = FALSE
|
||||
consoleless_interface = TRUE
|
||||
allowed_buildtypes = PROTOLATHE | IMPRINTER
|
||||
allowed_buildtypes = PROTOLATHE | IMPRINTER
|
||||
|
||||
@@ -8,9 +8,9 @@
|
||||
display_name = "Basic Research Technology"
|
||||
description = "NT default research technologies."
|
||||
// Default research tech, prevents bricking
|
||||
design_ids = list("basic_matter_bin", "basic_cell", "basic_scanning", "basic_capacitor", "basic_micro_laser", "micro_mani",
|
||||
design_ids = list("basic_matter_bin", "basic_cell", "basic_scanning", "basic_capacitor", "basic_micro_laser", "micro_mani", "desttagger", "handlabel", "packagewrap",
|
||||
"destructive_analyzer", "circuit_imprinter", "experimentor", "rdconsole", "design_disk", "tech_disk", "rdserver", "rdservercontrol", "mechfab",
|
||||
"space_heater", "xlarge_beaker", "sec_beanbag", "sec_rshot", "sec_bshot", "sec_slug", "sec_Islug", "sec_dart", "sec_38", "sec_38lethal",
|
||||
"space_heater", "beaker", "large_beaker", "bucket", "xlarge_beaker", "sec_beanbag", "sec_rshot", "sec_bshot", "sec_slug", "sec_Islug", "sec_dart", "sec_38", "sec_38lethal",
|
||||
"rglass","plasteel","plastitanium","plasmaglass","plasmareinforcedglass","titaniumglass","plastitaniumglass")
|
||||
|
||||
/datum/techweb_node/mmi
|
||||
@@ -71,7 +71,7 @@
|
||||
display_name = "Biological Technology"
|
||||
description = "What makes us tick." //the MC, silly!
|
||||
prereq_ids = list("base")
|
||||
design_ids = list("medicalkit", "chem_heater", "chem_master", "chem_dispenser", "sleeper", "vr_sleeper", "pandemic", "defibmount", "operating", "soda_dispenser", "beer_dispenser", "healthanalyzer", "blood_bag", "bloodbankgen", "telescopiciv")
|
||||
design_ids = list("medicalkit", "chem_heater", "chem_master", "chem_dispenser", "sleeper", "vr_sleeper", "pandemic", "defibrillator", "defibmount", "operating", "soda_dispenser", "beer_dispenser", "healthanalyzer", "blood_bag", "bloodbankgen", "telescopiciv", "medspray")
|
||||
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
|
||||
export_price = 5000
|
||||
|
||||
@@ -80,7 +80,7 @@
|
||||
display_name = "Advanced Biotechnology"
|
||||
description = "Advanced Biotechnology"
|
||||
prereq_ids = list("biotech")
|
||||
design_ids = list("piercesyringe", "crewpinpointer", "smoke_machine", "plasmarefiller", "limbgrower", "defibrillator", "meta_beaker", "healthanalyzer_advanced","harvester","holobarrier_med","smartdartgun","medicinalsmartdart", "pHmeter")
|
||||
design_ids = list("piercesyringe", "crewpinpointer", "smoke_machine", "plasmarefiller", "limbgrower", "meta_beaker", "healthanalyzer_advanced", "harvester", "holobarrier_med", "detective_scanner", "defibrillator_compact", "smartdartgun", "medicinalsmartdart", "pHmeter")
|
||||
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
|
||||
export_price = 5000
|
||||
|
||||
@@ -595,6 +595,15 @@
|
||||
export_price = 5000
|
||||
|
||||
////////////////////////Tools////////////////////////
|
||||
/datum/techweb_node/basic_tools
|
||||
id = "basic_tools"
|
||||
display_name = "Basic Tools"
|
||||
description = "Basic mechanical, electronic, surgical and botanical tools."
|
||||
prereq_ids = list("base")
|
||||
design_ids = list("screwdriver", "wrench", "wirecutters", "crowbar", "multitool", "welding_tool", "tscanner", "analyzer", "cable_coil", "pipe_painter", "airlock_painter", "scalpel", "circular_saw", "surgicaldrill", "retractor", "cautery", "hemostat", "cultivator", "plant_analyzer", "shovel", "spade", "hatchet")
|
||||
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 500)
|
||||
export_price = 5000
|
||||
|
||||
/datum/techweb_node/basic_mining
|
||||
id = "basic_mining"
|
||||
display_name = "Mining Technology"
|
||||
@@ -618,7 +627,7 @@
|
||||
display_name = "Advanced Sanitation Technology"
|
||||
description = "Clean things better, faster, stronger, and harder!"
|
||||
prereq_ids = list("adv_engi")
|
||||
design_ids = list("advmop", "buffer", "light_replacer")
|
||||
design_ids = list("advmop", "buffer", "light_replacer", "spraybottle", "beartrap")
|
||||
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 1750) // No longer has its bag
|
||||
export_price = 5000
|
||||
|
||||
@@ -640,6 +649,15 @@
|
||||
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2750)
|
||||
export_price = 5000
|
||||
|
||||
/datum/techweb_node/sec_basic
|
||||
id = "sec_basic"
|
||||
display_name = "Basic Security Equipment"
|
||||
description = "Standard equipment used by security."
|
||||
design_ids = list("seclite", "pepperspray", "bola_energy", "zipties", "evidencebag")
|
||||
prereq_ids = list("base")
|
||||
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 750)
|
||||
export_price = 5000
|
||||
|
||||
/////////////////////////weaponry tech/////////////////////////
|
||||
/datum/techweb_node/weaponry
|
||||
id = "weaponry"
|
||||
@@ -1081,7 +1099,7 @@
|
||||
display_name = "Illegal Technology"
|
||||
description = "Dangerous research used to create dangerous objects."
|
||||
prereq_ids = list("adv_engi", "adv_weaponry", "explosive_weapons")
|
||||
design_ids = list("decloner", "borg_syndicate_module", "suppressor", "largecrossbow", "donksofttoyvendor", "syndiesleeper")
|
||||
design_ids = list("decloner", "borg_syndicate_module", "ai_cam_upgrade", "suppressor", "largecrossbow", "donksofttoyvendor", "donksoft_refill", "syndiesleeper")
|
||||
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 10000)
|
||||
export_price = 5000
|
||||
hidden = TRUE
|
||||
|
||||
@@ -166,13 +166,12 @@ GLOBAL_LIST_INIT(cargo_shuttle_leave_behind_typecache, typecacheof(list(
|
||||
msg += export_text + "\n"
|
||||
SSshuttle.points += ex.total_value[E]
|
||||
|
||||
for(var/datum/reagent/R in ex.total_reagents)
|
||||
var/amount = ex.total_reagents[R]
|
||||
var/value = amount*R.value
|
||||
if(!value)
|
||||
continue
|
||||
msg += "[value] credits: received [amount]u of [R.name].\n"
|
||||
for(var/chem in ex.reagents_value)
|
||||
var/value = ex.reagents_value[chem]
|
||||
msg += "[value] credits: received [ex.reagents_volume[chem]]u of [chem].\n"
|
||||
SSshuttle.points += value
|
||||
|
||||
msg = copytext(msg, 1, MAX_MESSAGE_LEN)
|
||||
|
||||
SSshuttle.centcom_message = msg
|
||||
investigate_log("Shuttle contents sold for [SSshuttle.points - presale_points] credits. Contents: [ex.exported_atoms || "none."] Message: [SSshuttle.centcom_message || "none."]", INVESTIGATE_CARGO)
|
||||
|
||||
@@ -154,8 +154,9 @@
|
||||
/obj/item/clothing/suit/jacket/letterman_syndie = 5,
|
||||
/obj/item/clothing/under/jabroni = 2,
|
||||
/obj/item/clothing/suit/vapeshirt = 2,
|
||||
/obj/item/clothing/under/geisha = 4,,
|
||||
/obj/item/clothing/under/keyholesweater = 3)
|
||||
/obj/item/clothing/under/geisha = 4,
|
||||
/obj/item/clothing/under/keyholesweater = 3,
|
||||
/obj/item/clothing/under/staffassistant = 5)
|
||||
premium = list(/obj/item/clothing/under/suit_jacket/checkered = 4,
|
||||
/obj/item/clothing/head/mailman = 2,
|
||||
/obj/item/clothing/under/rank/mailman = 2,
|
||||
|
||||
Reference in New Issue
Block a user