Merge pull request #8347 from Atermonera/cynosure_map

Cynosure map
This commit is contained in:
Atermonera
2022-01-04 20:00:57 -08:00
committed by GitHub
813 changed files with 8168 additions and 316889 deletions
+2 -2
View File
@@ -34,8 +34,8 @@ Pipelines + Other Objects -> Pipe network
var/obj/machinery/atmospherics/node1
var/obj/machinery/atmospherics/node2
/obj/machinery/atmospherics/New(loc, newdir)
..()
/obj/machinery/atmospherics/Initialize(var/ml, newdir)
. = ..()
if(!icon_manager)
icon_manager = new()
if(!isnull(newdir))
@@ -9,8 +9,8 @@
var/datum/pipe_network/network1
var/datum/pipe_network/network2
/obj/machinery/atmospherics/binary/New()
..()
/obj/machinery/atmospherics/binary/Initialize()
. = ..()
air1 = new
air2 = new
@@ -23,8 +23,8 @@
density = 1
/obj/machinery/atmospherics/binary/circulator/New()
..()
/obj/machinery/atmospherics/binary/circulator/Initialize()
. = ..()
desc = initial(desc) + " Its outlet port is to the [dir2text(dir)]."
air1.volume = 400
@@ -42,8 +42,10 @@
//2: Do not pass input_pressure_min
//4: Do not pass output_pressure_max
/obj/machinery/atmospherics/binary/dp_vent_pump/New()
..()
/obj/machinery/atmospherics/binary/dp_vent_pump/Initialize()
. = ..()
if(frequency)
set_frequency(frequency)
air1.volume = ATMOS_DEFAULT_VOLUME_PUMP
air2.volume = ATMOS_DEFAULT_VOLUME_PUMP
icon = null
@@ -55,8 +57,8 @@
/obj/machinery/atmospherics/binary/dp_vent_pump/high_volume
name = "Large Dual Port Air Vent"
/obj/machinery/atmospherics/binary/dp_vent_pump/high_volume/New()
..()
/obj/machinery/atmospherics/binary/dp_vent_pump/high_volume/Initialize()
. = ..()
air1.volume = ATMOS_DEFAULT_VOLUME_PUMP + 800
air2.volume = ATMOS_DEFAULT_VOLUME_PUMP + 800
@@ -194,11 +196,6 @@
return 1
/obj/machinery/atmospherics/binary/dp_vent_pump/Initialize()
. = ..()
if(frequency)
set_frequency(frequency)
/obj/machinery/atmospherics/binary/dp_vent_pump/examine(mob/user)
. = ..()
if(Adjacent(user))
@@ -27,10 +27,12 @@
var/id = null
var/datum/radio_frequency/radio_connection
/obj/machinery/atmospherics/binary/passive_gate/New()
..()
/obj/machinery/atmospherics/binary/passive_gate/Initialize()
. = ..()
air1.volume = ATMOS_DEFAULT_VOLUME_PUMP * 2.5
air2.volume = ATMOS_DEFAULT_VOLUME_PUMP * 2.5
if(frequency)
set_frequency(frequency)
/obj/machinery/atmospherics/binary/passive_gate/Destroy()
unregister_radio(src, frequency)
@@ -166,14 +168,8 @@
)
radio_connection.post_signal(src, signal, radio_filter = RADIO_ATMOSIA)
return 1
/obj/machinery/atmospherics/binary/passive_gate/Initialize()
. = ..()
if(frequency)
set_frequency(frequency)
/obj/machinery/atmospherics/binary/passive_gate/receive_signal(datum/signal/signal)
if(!signal.data["tag"] || (signal.data["tag"] != id) || (signal.data["sigtype"]!="command"))
return 0
@@ -37,10 +37,12 @@ Thus, the two variables affect pump operation are set in New():
var/id = null
var/datum/radio_frequency/radio_connection
/obj/machinery/atmospherics/binary/pump/New()
..()
/obj/machinery/atmospherics/binary/pump/Initialize()
. = ..()
air1.volume = ATMOS_DEFAULT_VOLUME_PUMP
air2.volume = ATMOS_DEFAULT_VOLUME_PUMP
if(frequency)
set_frequency(frequency)
/obj/machinery/atmospherics/binary/pump/Destroy()
unregister_radio(src, frequency)
@@ -166,11 +168,6 @@ Thus, the two variables affect pump operation are set in New():
return data
/obj/machinery/atmospherics/binary/pump/Initialize()
. = ..()
if(frequency)
set_frequency(frequency)
/obj/machinery/atmospherics/binary/pump/receive_signal(datum/signal/signal)
if(!signal.data["tag"] || (signal.data["tag"] != id) || (signal.data["sigtype"]!="command"))
return 0
@@ -20,8 +20,8 @@
var/list/filtering_outputs = list() //maps gasids to gas_mixtures
/obj/machinery/atmospherics/omni/atmos_filter/New()
..()
/obj/machinery/atmospherics/omni/atmos_filter/Initialize()
. = ..()
rebuild_filtering_list()
for(var/datum/omni_port/P in ports)
P.air.volume = ATMOS_DEFAULT_VOLUME_FILTER
@@ -24,8 +24,8 @@
var/list/mixing_inputs = list()
/obj/machinery/atmospherics/omni/mixer/New()
..()
/obj/machinery/atmospherics/omni/mixer/Initialize()
. = ..()
if(mapper_set())
var/con = 0
for(var/datum/omni_port/P in ports)
@@ -25,8 +25,8 @@
var/list/ports = new()
/obj/machinery/atmospherics/omni/New()
..()
/obj/machinery/atmospherics/omni/Initialize()
. = ..()
icon_state = "base"
ports = new()
@@ -39,8 +39,8 @@
if(frequency)
radio_connection = radio_controller.add_object(src, frequency, RADIO_ATMOSIA)
/obj/machinery/atmospherics/trinary/atmos_filter/New()
..()
/obj/machinery/atmospherics/trinary/atmos_filter/Initialize()
. = ..()
switch(filter_type)
if(0) //removing hydrocarbons
filtered_out = list("phoron")
@@ -56,6 +56,8 @@
air1.volume = ATMOS_DEFAULT_VOLUME_FILTER
air2.volume = ATMOS_DEFAULT_VOLUME_FILTER
air3.volume = ATMOS_DEFAULT_VOLUME_FILTER
if(frequency)
set_frequency(frequency)
/obj/machinery/atmospherics/trinary/atmos_filter/Destroy()
unregister_radio(src, frequency)
@@ -106,11 +108,6 @@
return 1
/obj/machinery/atmospherics/trinary/atmos_filter/Initialize()
. = ..()
if(frequency)
set_frequency(frequency)
/obj/machinery/atmospherics/trinary/atmos_filter/attack_hand(user) // -- TLE
if(..())
return
@@ -37,8 +37,8 @@
icon_state += "off"
update_use_power(USE_POWER_OFF)
/obj/machinery/atmospherics/trinary/mixer/New()
..()
/obj/machinery/atmospherics/trinary/mixer/Initialize()
. = ..()
air1.volume = ATMOS_DEFAULT_VOLUME_MIXER
air2.volume = ATMOS_DEFAULT_VOLUME_MIXER
air3.volume = ATMOS_DEFAULT_VOLUME_MIXER * 1.5
@@ -17,8 +17,8 @@
var/datum/pipe_network/network2
var/datum/pipe_network/network3
/obj/machinery/atmospherics/trinary/New()
..()
/obj/machinery/atmospherics/trinary/Initialize()
. = ..()
air1 = new
air2 = new
@@ -24,9 +24,11 @@
level = 1
/obj/machinery/atmospherics/unary/outlet_injector/New()
..()
/obj/machinery/atmospherics/unary/outlet_injector/Initialize()
. = ..()
air_contents.volume = ATMOS_DEFAULT_VOLUME_PUMP + 500 //Give it a small reservoir for injecting. Also allows it to have a higher flow rate limit than vent pumps, to differentiate injectors a bit more.
if(frequency)
set_frequency(frequency)
/obj/machinery/atmospherics/unary/outlet_injector/Destroy()
unregister_radio(src, frequency)
@@ -122,11 +124,6 @@
return 1
/obj/machinery/atmospherics/unary/outlet_injector/Initialize()
. = ..()
if(frequency)
set_frequency(frequency)
/obj/machinery/atmospherics/unary/outlet_injector/receive_signal(datum/signal/signal)
if(!signal.data["tag"] || (signal.data["tag"] != id) || (signal.data["sigtype"]!="command"))
return 0
@@ -13,8 +13,8 @@
var/welded = 0 //defining this here for ventcrawl stuff
/obj/machinery/atmospherics/unary/New()
..()
/obj/machinery/atmospherics/unary/Initialize()
. = ..()
air_contents = new
air_contents.volume = 200
@@ -78,9 +78,6 @@
/obj/machinery/atmospherics/unary/vent_pump/Initialize()
. = ..()
soundloop = new(list(src), FALSE)
/obj/machinery/atmospherics/unary/vent_pump/New()
..()
air_contents.volume = ATMOS_DEFAULT_VOLUME_PUMP
icon = null
@@ -108,8 +105,8 @@
icon_connect_type = "-aux"
connect_types = CONNECT_TYPE_AUX //connects to aux pipes
/obj/machinery/atmospherics/unary/vent_pump/high_volume/New()
..()
/obj/machinery/atmospherics/unary/vent_pump/high_volume/Initialize()
. = ..()
air_contents.volume = ATMOS_DEFAULT_VOLUME_PUMP + 800
/obj/machinery/atmospherics/unary/vent_pump/engine
@@ -117,8 +114,8 @@
power_channel = ENVIRON
power_rating = 30000 //15 kW ~ 20 HP
/obj/machinery/atmospherics/unary/vent_pump/engine/New()
..()
/obj/machinery/atmospherics/unary/vent_pump/engine/Initialize()
. = ..()
air_contents.volume = ATMOS_DEFAULT_VOLUME_PUMP + 500 //meant to match air injector
/obj/machinery/atmospherics/unary/vent_pump/update_icon(var/safety = 0)
@@ -32,8 +32,8 @@
use_power = USE_POWER_IDLE
icon_state = "map_scrubber_on"
/obj/machinery/atmospherics/unary/vent_scrubber/New()
..()
/obj/machinery/atmospherics/unary/vent_scrubber/Initialize()
. = ..()
air_contents.volume = ATMOS_DEFAULT_VOLUME_FILTER
icon = null
+2 -2
View File
@@ -23,8 +23,8 @@
buckle_lying = 1
// BubbleWrap
/obj/machinery/atmospherics/pipe/simple/heat_exchanging/New()
..()
/obj/machinery/atmospherics/pipe/simple/heat_exchanging/Initialize()
. = ..()
// BubbleWrap END
color = "#404040" //we don't make use of the fancy overlay system for colours, use this to set the default.
+2 -2
View File
@@ -19,8 +19,8 @@
level = 1
/obj/machinery/atmospherics/pipe/manifold/New()
..()
/obj/machinery/atmospherics/pipe/manifold/Initialize()
. = ..()
alpha = 255
icon = null
+2 -2
View File
@@ -20,8 +20,8 @@
level = 1
/obj/machinery/atmospherics/pipe/manifold4w/New()
..()
/obj/machinery/atmospherics/pipe/manifold4w/Initialize()
. = ..()
alpha = 255
icon = null
+2 -2
View File
@@ -24,10 +24,10 @@
/obj/machinery/atmospherics/pipe/drain_power()
return -1
/obj/machinery/atmospherics/pipe/New()
/obj/machinery/atmospherics/pipe/Initialize()
if(istype(get_turf(src), /turf/simulated/wall) || istype(get_turf(src), /turf/simulated/shuttle/wall) || istype(get_turf(src), /turf/unsimulated/wall))
level = 1
..()
. = ..()
/obj/machinery/atmospherics/pipe/hides_under_flooring()
return level != 2
+2 -2
View File
@@ -26,8 +26,8 @@
level = 1
/obj/machinery/atmospherics/pipe/simple/New()
..()
/obj/machinery/atmospherics/pipe/simple/Initialize()
. = ..()
// Pipe colors and icon states are handled by an image cache - so color and icon should
// be null. For mapping purposes color is defined in the object definitions.
+14 -27
View File
@@ -18,9 +18,9 @@
pipe_flags = PIPING_DEFAULT_LAYER_ONLY
density = 1
/obj/machinery/atmospherics/pipe/tank/New()
/obj/machinery/atmospherics/pipe/tank/Initialize()
icon_state = "air"
..()
. = ..()
/obj/machinery/atmospherics/pipe/tank/init_dir()
initialize_directions = dir
@@ -74,58 +74,49 @@
name = "Pressure Tank (Air)"
icon_state = "air_map"
/obj/machinery/atmospherics/pipe/tank/air/New()
/obj/machinery/atmospherics/pipe/tank/air/Initialize()
air_temporary = new
air_temporary.volume = volume
air_temporary.temperature = T20C
air_temporary.adjust_multi("oxygen", (start_pressure*O2STANDARD)*(air_temporary.volume)/(R_IDEAL_GAS_EQUATION*air_temporary.temperature), \
"nitrogen",(start_pressure*N2STANDARD)*(air_temporary.volume)/(R_IDEAL_GAS_EQUATION*air_temporary.temperature))
..()
. = ..()
icon_state = "air"
/obj/machinery/atmospherics/pipe/tank/oxygen
name = "Pressure Tank (Oxygen)"
icon_state = "o2_map"
/obj/machinery/atmospherics/pipe/tank/oxygen/New()
/obj/machinery/atmospherics/pipe/tank/oxygen/Initialize()
air_temporary = new
air_temporary.volume = volume
air_temporary.temperature = T20C
air_temporary.adjust_gas("oxygen", (start_pressure)*(air_temporary.volume)/(R_IDEAL_GAS_EQUATION*air_temporary.temperature))
..()
. = ..()
icon_state = "o2"
/obj/machinery/atmospherics/pipe/tank/nitrogen
name = "Pressure Tank (Nitrogen)"
icon_state = "n2_map"
/obj/machinery/atmospherics/pipe/tank/nitrogen/New()
/obj/machinery/atmospherics/pipe/tank/nitrogen/Initialize()
air_temporary = new
air_temporary.volume = volume
air_temporary.temperature = T20C
air_temporary.adjust_gas("nitrogen", (start_pressure)*(air_temporary.volume)/(R_IDEAL_GAS_EQUATION*air_temporary.temperature))
..()
. = ..()
icon_state = "n2"
/obj/machinery/atmospherics/pipe/tank/carbon_dioxide
name = "Pressure Tank (Carbon Dioxide)"
icon_state = "co2_map"
/obj/machinery/atmospherics/pipe/tank/carbon_dioxide/New()
/obj/machinery/atmospherics/pipe/tank/carbon_dioxide/Initialize()
air_temporary = new
air_temporary.volume = volume
air_temporary.temperature = T20C
air_temporary.adjust_gas("carbon_dioxide", (start_pressure)*(air_temporary.volume)/(R_IDEAL_GAS_EQUATION*air_temporary.temperature))
..()
. = ..()
icon_state = "co2"
/obj/machinery/atmospherics/pipe/tank/phoron
@@ -133,26 +124,22 @@
icon_state = "phoron_map"
connect_types = CONNECT_TYPE_REGULAR|CONNECT_TYPE_FUEL
/obj/machinery/atmospherics/pipe/tank/phoron/New()
/obj/machinery/atmospherics/pipe/tank/phoron/Initialize()
air_temporary = new
air_temporary.volume = volume
air_temporary.temperature = T20C
air_temporary.adjust_gas("phoron", (start_pressure)*(air_temporary.volume)/(R_IDEAL_GAS_EQUATION*air_temporary.temperature))
..()
. = ..()
icon_state = "phoron"
/obj/machinery/atmospherics/pipe/tank/nitrous_oxide
name = "Pressure Tank (Nitrous Oxide)"
icon_state = "n2o_map"
/obj/machinery/atmospherics/pipe/tank/nitrous_oxide/New()
/obj/machinery/atmospherics/pipe/tank/nitrous_oxide/Initialize()
air_temporary = new
air_temporary.volume = volume
air_temporary.temperature = T0C
air_temporary.adjust_gas("nitrous_oxide", (start_pressure)*(air_temporary.volume)/(R_IDEAL_GAS_EQUATION*air_temporary.temperature))
..()
. = ..()
icon_state = "n2o"
+2 -2
View File
@@ -180,8 +180,8 @@ If it gains pressure too slowly, it may leak or just rupture instead of explodin
animate(src, color = fire_color(air_contents.temperature), 5)
set_light(l_color = color)
/obj/fire/New(newLoc,fl)
..()
/obj/fire/Initialize(var/ml, fl)
. = ..()
if(!istype(loc, /turf))
qdel(src)
+8 -4
View File
@@ -55,8 +55,8 @@
#define COMSIG_ATOM_AFTER_SUCCESSFUL_INITIALIZE "atom_init_success"
///from base of atom/attackby(): (/obj/item, /mob/living, params)
#define COMSIG_PARENT_ATTACKBY "atom_attackby"
///Return this in response if you don't want afterattack to be called
#define COMPONENT_NO_AFTERATTACK (1<<0)
///Return this in response if you don't want later item attack procs to be called.
#define COMPONENT_CANCEL_ATTACK_CHAIN (1<<0)
///from base of atom/attack_hulk(): (/mob/living/carbon/human)
#define COMSIG_ATOM_HULK_ATTACK "hulk_attack"
///from base of atom/animal_attack(): (/mob/user)
@@ -89,6 +89,7 @@
#define COMSIG_ATOM_BUMPED "atom_bumped"
///from base of atom/ex_act(): (severity, target)
#define COMSIG_ATOM_EX_ACT "atom_ex_act"
#define COMPONENT_IGNORE_EXPLOSION (1<<0)
///from base of atom/emp_act(): (severity)
#define COMSIG_ATOM_EMP_ACT "atom_emp_act"
///from base of atom/fire_act(): (exposed_temperature, exposed_volume)
@@ -218,7 +219,7 @@
// /atom/movable signals
///from base of atom/movable/Moved(): (/atom)
///from base of atom/movable/Move(): (atom/newloc, dir, movetime)
#define COMSIG_MOVABLE_PRE_MOVE "movable_pre_move"
#define COMPONENT_MOVABLE_BLOCK_PRE_MOVE (1<<0)
///from base of atom/movable/Moved(): (/atom, dir)
@@ -735,4 +736,7 @@
#define COMSIG_TRIGGERED_ALARM "ssalarm_triggered"
#define COMSIG_CANCELLED_ALARM "ssalarm_cancelled"
#define COMSIG_REAGENTS_CRAFTING_PING "reagents_crafting_ping"
#define COMSIG_REAGENTS_CRAFTING_PING "reagents_crafting_ping"
//From reagents touch_x.
#define COMSIG_REAGENTS_TOUCH "reagent_touch"
+4
View File
@@ -43,6 +43,10 @@
#define MAT_PAINITE "painite"
#define MAT_BOROSILICATE "borosilicate glass"
#define MAT_SANDSTONE "sandstone"
#define MAT_PLATINUM "platinum"
#define MAT_TRITIUM "tritium"
#define MAT_DEUTERIUM "deuterium"
#define DEFAULT_TABLE_MATERIAL MAT_PLASTIC
#define DEFAULT_WALL_MATERIAL MAT_STEEL
+2 -1
View File
@@ -37,9 +37,10 @@
#define ALLERGEN_COFFEE 0x200 // Mostly here for tajara.
#define ALLERGEN_SUGARS 0x400 // For unathi-like reactions
#define ALLERGEN_EGGS 0x800 // For Skrell eggs allergy
#define ALLERGEN_STIMULANT 0x1000 // Stimulants are what makes the Tajaran heart go ruh roh - not just coffee!
// Allergen reactions
#define AG_TOX_DMG 0x1 // the classic
#define AG_TOX_DMG 0x1 // the classic
#define AG_OXY_DMG 0x2 // intense airway reactions
#define AG_EMOTE 0x4 // general emote reactions based on affect type
#define AG_PAIN 0x8 // short-lived hurt
+4 -3
View File
@@ -19,9 +19,10 @@
#define TIMER_ID_NULL -1
#define INITIALIZATION_INSSATOMS 0 //New should not call Initialize
#define INITIALIZATION_INNEW_MAPLOAD 1 //New should call Initialize(TRUE)
#define INITIALIZATION_INNEW_REGULAR 2 //New should call Initialize(FALSE)
#define INITIALIZATION_INSSATOMS 0 //New should not call Initialize
#define INITIALIZATION_INSSATOMS_LATE 1 //New should not call Initialize; after the first pass is complete (handled differently)
#define INITIALIZATION_INNEW_MAPLOAD 2 //New should call Initialize(TRUE)
#define INITIALIZATION_INNEW_REGULAR 3 //New should call Initialize(FALSE)
#define INITIALIZE_HINT_NORMAL 0 //Nothing happens
#define INITIALIZE_HINT_LATELOAD 1 //Call LateInitialize
+1 -1
View File
@@ -108,7 +108,7 @@
if(istype(T,/turf/simulated/shuttle))
shuttlework = 1
var/turf/simulated/shuttle/SS = T
if(!SS.landed_holder) SS.landed_holder = new(turf = SS)
if(!SS.landed_holder) SS.landed_holder = new(SS)
X = SS.landed_holder.land_on(B)
//Generic non-shuttle turf move.
+4 -3
View File
@@ -803,7 +803,7 @@ Turf and target are seperate in case you want to teleport some distance from a t
if(istype(T,/turf/simulated/shuttle))
shuttlework = 1
var/turf/simulated/shuttle/SS = T
if(!SS.landed_holder) SS.landed_holder = new(turf = SS)
if(!SS.landed_holder) SS.landed_holder = new(SS)
X = SS.landed_holder.land_on(B)
//Generic non-shuttle turf move.
@@ -1310,8 +1310,9 @@ var/mob/dview/dview_mob = new
color = origin.color
set_light(origin.light_range, origin.light_power, origin.light_color)
/mob/dview/New()
..()
INITIALIZE_IMMEDIATE(/mob/dview)
/mob/dview/Initialize()
. = ..()
// We don't want to be in any mob lists; we're a dummy not a mob.
mob_list -= src
if(stat == DEAD)
+6 -5
View File
@@ -12,12 +12,13 @@
var/mob/my_mob = null // The mob that possesses this hud object.
/obj/screen/movable/ability_master/New(owner)
/obj/screen/movable/ability_master/Initialize(ml, owner)
. = ..()
if(owner)
my_mob = owner
update_abilities(0, owner)
else
message_admins("ERROR: ability_master's New() was not given an owner argument. This is a bug.")
message_admins("ERROR: ability_master's Initialize() was not given an owner argument. This is a bug.")
/obj/screen/movable/ability_master/Destroy()
. = ..()
@@ -178,9 +179,9 @@
ability_master.toggle_open(1)
client.screen -= ability_master
/mob/New()
..()
ability_master = new /obj/screen/movable/ability_master(src)
/mob/Initialize()
. = ..()
ability_master = new /obj/screen/movable/ability_master(null, src)
///////////ACTUAL ABILITIES////////////
//This is what you click to do things//
+10
View File
@@ -191,6 +191,11 @@ The box in your backpack has an oxygen tank and gas mask in it."
desc = "Your battery is about to die! Charge it ASAP!"
icon_state = "c_starving"
/obj/screen/alert/warm
name = "Too Warm"
desc = "You're uncomfortably warm. Take off some clothes or tweak the thermostat a few degrees cooler."
icon_state = "mildhot"
/obj/screen/alert/hot
name = "Too Hot"
desc = "You're flaming hot! Get somewhere cooler and take off any insulating clothing like a fire suit."
@@ -199,6 +204,11 @@ The box in your backpack has an oxygen tank and gas mask in it."
/obj/screen/alert/hot/robot
desc = "The air around you is too hot for a humanoid. Be careful to avoid exposing them to this enviroment."
/obj/screen/alert/chilly
name = "Too Chilly"
desc = "You're uncomfortably cold. Rug up or tweak the thermostat a few degrees higher."
icon_state = "mildcold"
/obj/screen/alert/cold
name = "Too Cold"
desc = "You're freezing cold! Get somewhere warmer and take off any insulating clothing like a space suit."
+8 -4
View File
@@ -622,8 +622,9 @@
plane = PLANE_PLAYER_HUD_ABOVE
var/client/holder
/obj/screen/splash/New(client/C, visible)
. = ..()
INITIALIZE_IMMEDIATE(/obj/screen/splash)
/obj/screen/splash/Initialize(var/ml, client/C, visible)
. = ..(ml)
holder = C
@@ -691,6 +692,9 @@
var/obj/screen/mapper/extras_holder/extras_holder
/obj/screen/movable/mapper_holder/Initialize(mapload, newowner)
. = ..()
owner = newowner
mask_full = new(src) // Full white square mask
@@ -778,8 +782,8 @@
mouse_opacity = 0
var/obj/screen/movable/mapper_holder/parent
/obj/screen/mapper/New()
..()
/obj/screen/mapper/Initialize()
. = ..()
parent = loc
/obj/screen/mapper/Destroy()
+26 -7
View File
@@ -25,27 +25,46 @@ avoid code duplication. This includes items that may sometimes act as a standard
return
return
// Called at the start of resolve_attackby(), before the actual attack.
/obj/item/proc/pre_attack(atom/a, mob/user)
return
/**
* Called at the start of resolve_attackby(), before the actual attack.
*
* Arguments:
* * atom/A - The atom about to be hit
* * mob/living/user - The mob doing the htting
* * params - click params such as alt/shift etc
*
* See: [/obj/item/proc/melee_attack_chain]
*/
/obj/item/proc/pre_attack(atom/A, mob/user, params) //do stuff before attackby!
if(SEND_SIGNAL(src, COMSIG_ITEM_PRE_ATTACK, A, user, params) & COMPONENT_CANCEL_ATTACK_CHAIN)
return TRUE
return FALSE //return TRUE to avoid calling attackby after this proc does stuff
//I would prefer to rename this to attack(), but that would involve touching hundreds of files.
/obj/item/proc/resolve_attackby(atom/A, mob/user, var/attack_modifier = 1, var/click_parameters)
pre_attack(A, user)
add_fingerprint(user)
. = pre_attack(A, user, click_parameters)
if(.) // We're returning the value of pre_attack, important if it has a special return.
return
return A.attackby(src, user, attack_modifier, click_parameters)
// No comment
/atom/proc/attackby(obj/item/W, mob/user, var/attack_modifier, var/click_parameters)
if(SEND_SIGNAL(src, COMSIG_PARENT_ATTACKBY, W, user, click_parameters) & COMPONENT_NO_AFTERATTACK)
if(SEND_SIGNAL(src, COMSIG_PARENT_ATTACKBY, W, user, click_parameters) & COMPONENT_CANCEL_ATTACK_CHAIN)
return TRUE
return FALSE
/mob/living/attackby(obj/item/I, mob/user, var/attack_modifier, var/click_parameters)
if(!ismob(user))
return 0
return FALSE
if(SEND_SIGNAL(src, COMSIG_PARENT_ATTACKBY, I, user, click_parameters) & COMPONENT_CANCEL_ATTACK_CHAIN)
return FALSE
if(can_operate(src, user) && I.do_surgery(src,user))
return 1
return TRUE
return I.attack(src, user, user.zone_sel.selecting, attack_modifier)
// Used to get how fast a mob should attack, and influences click delay.
+3 -1
View File
@@ -26,7 +26,9 @@
A.attack_hand(src)
/atom/proc/attack_hand(mob/user as mob)
return
if(SEND_SIGNAL(src, COMSIG_ATOM_ATTACK_HAND, user) & COMPONENT_CANCEL_ATTACK_CHAIN)
return TRUE
return FALSE
/mob/living/carbon/human/RestrainedClickOn(var/atom/A)
return
@@ -251,8 +251,8 @@ var/global/datum/emergency_shuttle_controller/emergency_shuttle = new
layer = TURF_LAYER
plane = TURF_PLANE
/obj/effect/bgstar/New()
..()
/obj/effect/bgstar/Initialize()
. = ..()
pixel_x += rand(-2,30)
pixel_y += rand(-2,30)
var/starnum = pick("1", "1", "1", "2", "3", "4")
+56 -41
View File
@@ -8,70 +8,66 @@ SUBSYSTEM_DEF(atoms)
init_order = INIT_ORDER_ATOMS
flags = SS_NO_FIRE
var/static/initialized = INITIALIZATION_INSSATOMS
// var/list/created_atoms // This is never used, so don't bother. ~Leshana
var/static/old_initialized
// override and GetArguments() exists for mod-override/downstream hook functionality.
// Useful for total-overhaul type modifications.
var/adjust_init_arguments = FALSE
var/atom_init_stage = INITIALIZATION_INSSATOMS
var/old_init_stage
var/list/late_loaders
var/list/created_atoms
var/list/BadInitializeCalls = list()
/datum/controller/subsystem/atoms/Initialize(timeofday)
if(!plant_controller) // Initialize seed repo for /obj/item/seed and /obj/item/weapon/grown
plant_controller = new
setupgenetics() //to set the mutations' place in structural enzymes, so initializers know where to put mutations.
initialized = INITIALIZATION_INNEW_MAPLOAD
to_world_log("Initializing objects")
admin_notice("<span class='danger'>Initializing objects</span>", R_DEBUG)
atom_init_stage = INITIALIZATION_INNEW_MAPLOAD
InitializeAtoms()
return ..()
/datum/controller/subsystem/atoms/proc/InitializeAtoms(list/atoms)
if(initialized == INITIALIZATION_INSSATOMS)
/datum/controller/subsystem/atoms/proc/InitializeAtoms(var/list/supplied_atoms)
if(atom_init_stage <= INITIALIZATION_INSSATOMS_LATE)
return
initialized = INITIALIZATION_INNEW_MAPLOAD
atom_init_stage = INITIALIZATION_INNEW_MAPLOAD
LAZYINITLIST(late_loaders)
var/count
var/list/mapload_arg = list(TRUE)
if(atoms)
created_atoms = list()
count = atoms.len
for(var/I in atoms)
var/atom/A = I
var/count = LAZYLEN(supplied_atoms)
if(count)
while(supplied_atoms.len)
var/atom/A = supplied_atoms[supplied_atoms.len]
supplied_atoms.len--
if(!A.initialized)
if(InitAtom(I, mapload_arg))
atoms -= I
InitAtom(A, GetArguments(A, mapload_arg))
CHECK_TICK
else
count = 0
for(var/atom/A in world) // This must be world, since this operation adds all the atoms to their specific lists.
else if(!subsystem_initialized)
// If wondering why not just store all atoms in a list and use the block above: that turns out unbearably expensive.
// Instead, atoms without extra arguments in New created on server start are fished out of world directly.
// We do this exactly once.
for(var/atom/A in world)
if(!A.initialized)
InitAtom(A, mapload_arg)
InitAtom(A, GetArguments(A, mapload_arg, FALSE))
++count
CHECK_TICK
log_world("Initialized [count] atoms")
report_progress("Initialized [count] atom\s")
initialized = INITIALIZATION_INNEW_REGULAR
atom_init_stage = INITIALIZATION_INNEW_REGULAR
if(late_loaders.len)
for(var/I in late_loaders)
var/atom/A = I
A.LateInitialize()
CHECK_TICK
testing("Late initialized [late_loaders.len] atoms")
A.LateInitialize(arglist(late_loaders[A]))
report_progress("Late initialized [late_loaders.len] atom\s")
late_loaders.Cut()
// Nothing ever checks return value of this proc, so don't bother. If this ever changes fix code in /atom/New() ~Leshana
// if(atoms)
// . = created_atoms + atoms
// created_atoms = null
/datum/controller/subsystem/atoms/proc/InitAtom(atom/A, list/arguments)
LAZYREMOVE(global.pre_init_created_atoms, A)
var/the_type = A.type
if(QDELING(A))
BadInitializeCalls[the_type] |= BAD_INIT_QDEL_BEFORE
@@ -90,9 +86,9 @@ SUBSYSTEM_DEF(atoms)
switch(result)
if(INITIALIZE_HINT_LATELOAD)
if(arguments[1]) //mapload
late_loaders += A
late_loaders[A] = arguments
else
A.LateInitialize()
A.LateInitialize(arglist(arguments))
if(INITIALIZE_HINT_QDEL)
qdel(A)
qdeleted = TRUE
@@ -106,18 +102,37 @@ SUBSYSTEM_DEF(atoms)
return qdeleted || QDELING(A)
// override and GetArguments() exists for mod-override/downstream hook functionality.
// Useful for total-overhaul type modifications.
/atom/proc/AdjustInitializeArguments(list/arguments)
// Lists are passed by reference so can simply modify the arguments list without returning it
/datum/controller/subsystem/atoms/proc/GetArguments(atom/A, list/mapload_arg, created=TRUE)
if(!created && !adjust_init_arguments)
return mapload_arg // Performance optimization. Nothing to do.
var/list/arguments = mapload_arg.Copy()
var/extra_args = LAZYACCESS(global.pre_init_created_atoms, A)
if(created && extra_args)
arguments += extra_args
if(adjust_init_arguments)
A.AdjustInitializeArguments(arguments)
return arguments
/datum/controller/subsystem/atoms/stat_entry(msg)
..("Bad Initialize Calls:[BadInitializeCalls.len]")
/datum/controller/subsystem/atoms/proc/map_loader_begin()
old_initialized = initialized
initialized = INITIALIZATION_INSSATOMS
old_init_stage = atom_init_stage
atom_init_stage = INITIALIZATION_INSSATOMS_LATE
/datum/controller/subsystem/atoms/proc/map_loader_stop()
initialized = old_initialized
atom_init_stage = old_init_stage
/datum/controller/subsystem/atoms/Recover()
initialized = SSatoms.initialized
if(initialized == INITIALIZATION_INNEW_MAPLOAD)
atom_init_stage = SSatoms.atom_init_stage
if(atom_init_stage == INITIALIZATION_INNEW_MAPLOAD)
InitializeAtoms()
old_initialized = SSatoms.old_initialized
old_init_stage = SSatoms.old_init_stage
BadInitializeCalls = SSatoms.BadInitializeCalls
/datum/controller/subsystem/atoms/proc/InitLog()
+4
View File
@@ -26,6 +26,10 @@ SUBSYSTEM_DEF(mapping)
maploader = new()
load_map_templates()
#if UNIT_TEST
config.generate_map = TRUE
#endif
if(config.generate_map)
// Load the engine and other submaps.
load_static_submaps(static_submap_landmarks)
-11
View File
@@ -87,17 +87,6 @@ SUBSYSTEM_DEF(open_space)
// log_debug("[T] ([T.x],[T.y],[T.z]) queued for update for [src].update_icon()")
SSopen_space.add_turf(T, 1)
// Ouch... this is painful. But is there any other way?
/* - No for now
/obj/New()
. = ..()
if(open_space_initialised && !invisibility)
var/turf/T = GetAbove(src)
if(isopenspace(T))
// log_debug("[T] ([T.x],[T.y],[T.z]) queued for update for [src]New()")
OS_controller.add_turf(T, 1)
*/
// We probably should hook Destroy() If we can think of something more efficient, lets hear it.
/obj/Destroy()
if(GLOB.open_space_initialised && !invisibility && isturf(loc))
+1 -1
View File
@@ -425,7 +425,7 @@ var/global/datum/controller/subsystem/ticker/ticker
if(new_char)
qdel(player)
if(new_char.client)
var/obj/screen/splash/S = new(new_char.client, TRUE)
var/obj/screen/splash/S = new(null, new_char.client, TRUE)
S.Fade(TRUE)
// If they're a carbon, they can get manifested
+3 -2
View File
@@ -6,8 +6,9 @@
name = "Initializing..."
var/target
/obj/effect/statclick/New(loc, text, target) //Don't port this to Initialize it's too critical
..()
INITIALIZE_IMMEDIATE(/obj/effect/statclick)
/obj/effect/statclick/Initialize(ml, text, target)
. = ..(ml)
name = text
src.target = target
+1 -1
View File
@@ -344,7 +344,7 @@
amt--
// Prepare to stuff inside product, don't delete it
if(is_path_in_list(path_key, parts))
if(is_path_in_list(path_key, R.parts))
parts["items"] += I
amt_to_transfer--
continue
+11 -4
View File
@@ -25,8 +25,7 @@
var/obj/item/weapon/storage/briefcase/new_briefcase = new(H)
for(var/obj/item/briefcase_item in new_briefcase)
qdel(briefcase_item)
new_briefcase.contents += new /obj/item/toy/crossbow
new_briefcase.contents += new /obj/item/weapon/gun/projectile/revolver/capgun
new_briefcase.contents += new /obj/item/weapon/gun/projectile/pistol/toy
new_briefcase.contents += new /obj/item/clothing/mask/gas/clown_hat
H.equip_to_slot_or_del(new_briefcase, slot_l_hand)
@@ -103,7 +102,7 @@
suit = /obj/item/clothing/suit/storage/toggle/brown_jacket/sleeveless
shoes = /obj/item/clothing/shoes/boots/jackboots
gloves = /obj/item/clothing/gloves/fingerless
l_pocket = /obj/item/toy/crossbow
l_pocket = /obj/item/weapon/gun/projectile/revolver/toy/crossbow
r_pocket = /obj/item/device/flashlight/color/red
/decl/hierarchy/outfit/costume/pirate
@@ -120,4 +119,12 @@
shoes = /obj/item/clothing/shoes/white
suit = /obj/item/clothing/suit/storage/hooded/chaplain_hoodie/whiteout
gloves = /obj/item/clothing/gloves/white
mask = /obj/item/clothing/mask/surgical
mask = /obj/item/clothing/mask/surgical
/decl/hierarchy/outfit/costume/marine
name = OUTFIT_COSTUME("Ruin Marine")
uniform = /obj/item/clothing/under/color/grey
shoes = /obj/item/clothing/shoes/brown
head = /obj/item/clothing/head/marine
suit = /obj/item/clothing/suit/marine
r_hand = /obj/item/weapon/gun/projectile/revolver/toy/sawnoff
+1 -1
View File
@@ -1,6 +1,6 @@
/decl/hierarchy/outfit/job/engineering
hierarchy_type = /decl/hierarchy/outfit/job/engineering
belt = /obj/item/weapon/storage/belt/utility/full
belt = /obj/item/weapon/storage/belt/utility/full/multitool
l_ear = /obj/item/device/radio/headset/headset_eng
shoes = /obj/item/clothing/shoes/boots/workboots
r_pocket = /obj/item/device/t_scanner
+1 -1
View File
@@ -33,7 +33,7 @@
name = OUTFIT_JOB_NAME("Roboticist")
uniform = /obj/item/clothing/under/rank/roboticist
shoes = /obj/item/clothing/shoes/black
belt = /obj/item/weapon/storage/belt/utility/full
belt = /obj/item/weapon/storage/belt/utility/full/multitool
id_type = /obj/item/weapon/card/id/science
pda_slot = slot_r_store
pda_type = /obj/item/device/pda/roboticist
+7
View File
@@ -23,6 +23,13 @@
containertype = /obj/structure/closet/crate/allico
containername = "foam weapon crate"
/datum/supply_pack/recreation/donksoftvend
name = "Donk-Soft Vendor Crate"
contains = list()
cost = 75
containertype = /obj/structure/largecrate/donksoftvendor
containername = "\improper Donk-Soft vendor crate"
/datum/supply_pack/recreation/lasertag
name = "Lasertag equipment"
contains = list(
+5 -5
View File
@@ -47,9 +47,9 @@
/obj/item/weapon/soap/deluxe
icon_state = "soapdeluxe"
/obj/item/weapon/soap/deluxe/New()
/obj/item/weapon/soap/deluxe/Initialize()
desc = "A deluxe Waffle Co. brand bar of soap. Smells of [pick("lavender", "vanilla", "strawberry", "chocolate" ,"space")]."
..()
. = ..()
/obj/item/weapon/soap/syndie
desc = "An untrustworthy bar of soap. Smells of fear."
@@ -363,10 +363,10 @@
drop_sound = 'sound/items/drop/component.ogg'
pickup_sound = 'sound/items/pickup/component.ogg'
/obj/item/weapon/stock_parts/New()
/obj/item/weapon/stock_parts/Initialize()
src.pixel_x = rand(-5.0, 5)
src.pixel_y = rand(-5.0, 5)
..()
. = ..()
/obj/item/weapon/stock_parts/get_rating()
return rating
@@ -390,7 +390,7 @@
var/charge = 0
var/max_charge = 1000
/obj/item/weapon/stock_parts/capacitor/New()
/obj/item/weapon/stock_parts/capacitor/Initialize()
. = ..()
max_charge *= rating
-18
View File
@@ -1831,24 +1831,6 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
icon_state = "Tactical"
ambience = AMBIENCE_HIGHSEC
/*
New()
..()
spawn(10) //let objects set up first
for(var/turf/turfToGrayscale in src)
if(turfToGrayscale.icon)
var/icon/newIcon = icon(turfToGrayscale.icon)
newIcon.GrayScale()
turfToGrayscale.icon = newIcon
for(var/obj/objectToGrayscale in turfToGrayscale) //1 level deep, means tables, apcs, locker, etc, but not locker contents
if(objectToGrayscale.icon)
var/icon/newIcon = icon(objectToGrayscale.icon)
newIcon.GrayScale()
objectToGrayscale.icon = newIcon
*/
/area/security/nuke_storage
name = "\improper Vault"
icon_state = "nuke_storage"
+6 -13
View File
@@ -2,17 +2,12 @@
name = "AI Monitored Area"
var/obj/machinery/camera/motioncamera = null
/area/ai_monitored/New()
..()
// locate and store the motioncamera
spawn (20) // spawn on a delay to let turfs/objs load
for (var/obj/machinery/camera/M in src)
if(M.isMotion())
motioncamera = M
M.area_motion = src
return
return
/area/ai_monitored/LateInitialize()
. = ..()
for(var/obj/machinery/camera/M in src)
if(M.isMotion())
motioncamera = M
M.area_motion = src
/area/ai_monitored/Entered(atom/movable/O)
..()
@@ -22,5 +17,3 @@
/area/ai_monitored/Exited(atom/movable/O)
if (ismob(O) && motioncamera)
motioncamera.lostTarget(O)
+10 -3
View File
@@ -19,7 +19,7 @@
var/debug = 0
var/requires_power = 1
var/always_unpowered = 0 //this gets overriden to 1 for space in area/New()
var/always_unpowered = 0 //this gets overriden to 1 for space in area/Initialize()
// Power channel status - Is it currently energized?
var/power_equip = TRUE
@@ -52,10 +52,13 @@
var/no_spoilers = FALSE // If true, makes it much more difficult to see what is inside an area with things like mesons.
var/soundproofed = FALSE // If true, blocks sounds from other areas and prevents hearers on other areas from hearing the sounds within.
/area/New()
icon_state = ""
luminosity = !dynamic_lighting
..()
/area/Initialize()
. = ..()
luminosity = !(dynamic_lighting)
icon_state = ""
return INITIALIZE_HINT_LATELOAD // Areas tradiationally are initialized AFTER other atoms.
/area/LateInitialize()
@@ -67,6 +70,10 @@
if(no_spoilers)
set_spoiler_obfuscation(TRUE)
icon = 'icons/turf/areas.dmi'
icon_state = "white"
blend_mode = BLEND_MULTIPLY
// Changes the area of T to A. Do not do this manually.
// Area is expected to be a non-null instance.
/proc/ChangeArea(var/turf/T, var/area/A)
+24 -22
View File
@@ -43,27 +43,22 @@
/// The chat color var, without alpha.
var/chat_color_hover
var/global/list/pre_init_created_atoms // atom creation ordering means some stuff is trying to init before SSatoms exists, temp workaround
/atom/New(loc, ...)
// Don't call ..() unless /datum/New() ever exists
// During dynamic mapload (reader.dm) this assigns the var overrides from the .dmm file
// Native BYOND maploading sets those vars before invoking New(), by doing this FIRST we come as close to that behavior as we can.
if(use_preloader && (src.type == _preloader.target_path))//in case the instanciated atom is creating other atoms in New()
_preloader.load(src)
// Pass our arguments to InitAtom so they can be passed to initialize(), but replace 1st with if-we're-during-mapload.
var/do_initialize = SSatoms.initialized
if(do_initialize > INITIALIZATION_INSSATOMS)
args[1] = (do_initialize == INITIALIZATION_INNEW_MAPLOAD)
if(SSatoms.InitAtom(src, args))
// We were deleted. No sense continuing
return
// Uncomment if anything ever uses the return value of SSatoms.InitializeAtoms ~Leshana
// If a map is being loaded, it might want to know about newly created objects so they can be handled.
// var/list/created = SSatoms.created_atoms
// if(created)
// created += src
//atom creation method that preloads variables at creation
if(global.use_preloader && (src.type == global._preloader.target_path))//in case the instanciated atom is creating other atoms in New()
global._preloader.load(src)
var/do_initialize = SSatoms?.atom_init_stage
if(do_initialize > INITIALIZATION_INSSATOMS_LATE)
args[1] = do_initialize == INITIALIZATION_INNEW_MAPLOAD
SSatoms.InitAtom(src, args)
else
var/list/argument_list
if(length(args) > 1)
argument_list = args.Copy(2)
if(length(argument_list))
LAZYSET(global.pre_init_created_atoms, src, argument_list)
// Note: I removed "auto_init" feature (letting types disable auto-init) since it shouldn't be needed anymore.
// You can replicate the same by checking the value of the first parameter to initialize() ~Leshana
@@ -75,6 +70,8 @@
// Other parameters are passed from New (excluding loc), this does not happen if mapload is TRUE
// Must return an Initialize hint. Defined in code/__defines/subsystems.dm
/atom/proc/Initialize(mapload, ...)
SHOULD_CALL_PARENT(TRUE)
SHOULD_NOT_SLEEP(TRUE)
if(QDELETED(src))
crash_with("GC: -- [type] had initialize() called after qdel() --")
if(initialized)
@@ -111,6 +108,8 @@
/atom/proc/Bumped(AM as mob|obj)
set waitfor = FALSE
SEND_SIGNAL(src, COMSIG_ATOM_BUMPED, AM)
// Convenience proc to see if a container is open for chemistry handling
// returns true if open
// false if closed
@@ -157,6 +156,9 @@
return
/atom/proc/bullet_act(obj/item/projectile/P, def_zone)
if(SEND_SIGNAL(src, COMSIG_ATOM_BULLET_ACT, P, def_zone) & COMPONENT_CANCEL_ATTACK_CHAIN)
return
P.on_hit(src, 0, def_zone)
. = 0
@@ -237,8 +239,8 @@
. = new_dir != dir
dir = new_dir
/atom/proc/ex_act()
return
/atom/proc/ex_act(var/strength = 3)
return (SEND_SIGNAL(src, COMSIG_ATOM_EX_ACT, strength, src) & COMPONENT_IGNORE_EXPLOSION)
/atom/proc/emag_act(var/remaining_charges, var/mob/user, var/emag_source)
return -1
+12 -2
View File
@@ -60,6 +60,9 @@
if(!loc || !newloc)
return FALSE
if(SEND_SIGNAL(src, COMSIG_MOVABLE_PRE_MOVE, newloc, direct, movetime) & COMPONENT_MOVABLE_BLOCK_PRE_MOVE)
return FALSE
// Store this early before we might move, it's used several places
var/atom/oldloc = loc
@@ -205,6 +208,9 @@
if(riding_datum)
riding_datum.handle_vehicle_layer()
riding_datum.handle_vehicle_offsets()
SEND_SIGNAL(src, COMSIG_MOVABLE_MOVED, old_loc, direction)
return TRUE
/atom/movable/set_dir(newdir)
@@ -247,6 +253,9 @@
throwing = 0
if(QDELETED(A))
return
SEND_SIGNAL(src, COMSIG_MOVABLE_BUMP, A)
A.Bumped(src)
A.last_bumped = world.time
@@ -404,6 +413,7 @@
src.throw_impact(A,speed)
/atom/movable/proc/throw_at(atom/target, range, speed, thrower)
set waitfor = FALSE
if(!target || !src)
return 0
if(target.z != src.z)
@@ -495,10 +505,10 @@
var/atom/master = null
anchored = 1
/atom/movable/overlay/New()
/atom/movable/overlay/Initialize()
for(var/x in src.verbs)
src.verbs -= x
..()
. = ..()
/atom/movable/overlay/attackby(a, b)
if (src.master)
@@ -88,7 +88,7 @@ var/global/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","E
verbs.Add(P.verbpath)
if(P.make_hud_button)
if(!src.ability_master)
src.ability_master = new /obj/screen/movable/ability_master(src)
src.ability_master = new /obj/screen/movable/ability_master(null, src)
src.ability_master.add_ling_ability(
object_given = src,
verb_given = P.verbpath,
@@ -102,7 +102,8 @@ var/global/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","E
var/mob/living/carbon/human/H = src
if(istype(H))
var/datum/absorbed_dna/newDNA = new(H.real_name, H.dna, H.species.name, H.languages, H.identifying_gender, H.flavor_texts)
var/saved_dna = H.dna.Clone() /// Prevent transform from breaking.
var/datum/absorbed_dna/newDNA = new(H.real_name, saved_dna, H.species.name, H.languages, H.identifying_gender, H.flavor_texts, H.modifiers)
absorbDNA(newDNA)
return 1
@@ -344,7 +344,7 @@ var/list/datum/power/changeling/powerinstances = list()
if(Thepower.make_hud_button && Thepower.isVerb)
if(!M.current.ability_master)
M.current.ability_master = new /obj/screen/movable/ability_master(M.current)
M.current.ability_master = new /obj/screen/movable/ability_master(null, M.current)
M.current.ability_master.add_ling_ability(
object_given = M.current,
verb_given = Thepower.verbpath,
@@ -65,8 +65,8 @@
defend_chance = 40 // The base chance for the weapon to parry.
projectile_parry_chance = 15 // The base chance for a projectile to be deflected.
/obj/item/weapon/melee/changeling/New(location)
..()
/obj/item/weapon/melee/changeling/Initialize()
. = ..()
START_PROCESSING(SSobj, src)
if(ismob(loc))
visible_message("<span class='warning'>A grotesque weapon forms around [loc.name]\'s arm!</span>",
@@ -88,11 +88,6 @@
creator = null
..()
/obj/item/weapon/melee/changeling/suicide_act(mob/user)
var/datum/gender/T = gender_datums[user.get_visible_gender()]
user.visible_message("<span class='danger'>[user] is impaling [T.himself] with the [src.name]! It looks like [T.he] [T.is] trying to commit suicide.</span>")
return(BRUTELOSS)
/obj/item/weapon/melee/changeling/process() //Stolen from ninja swords.
if(!creator || loc != creator || !creator.item_is_in_hands(src))
// Tidy up a bit.
@@ -41,8 +41,8 @@
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) //No armor at all.
canremove = 0
/obj/item/clothing/suit/space/changeling/New()
..()
/obj/item/clothing/suit/space/changeling/Initialize()
. = ..()
if(ismob(loc))
loc.visible_message("<span class='warning'>[loc.name]\'s flesh rapidly inflates, forming a bloated mass around their body!</span>",
"<span class='warning'>We inflate our flesh, creating a spaceproof suit!</span>",
@@ -105,8 +105,8 @@
max_heat_protection_temperature = FIRESUIT_MAX_HEAT_PROTECTION_TEMPERATURE
slowdown = 1.5
/obj/item/clothing/suit/space/changeling/armored/New()
..()
/obj/item/clothing/suit/space/changeling/armored/Initialize()
. = ..()
if(ismob(loc))
loc.visible_message("<span class='warning'>[loc.name]\'s flesh turns black, quickly transforming into a hard, chitinous mass!</span>",
"<span class='warning'>We harden our flesh, creating a suit of armor!</span>",
@@ -113,7 +113,8 @@
agony_amount = 80
electrocute_amount = 20
/obj/item/weapon/electric_hand/New()
/obj/item/weapon/electric_hand/Initialize()
. = ..()
if(ismob(loc))
visible_message("<span class='warning'>Electrical arcs form around [loc.name]\'s hand!</span>",
"<span class='warning'>We store a charge of electricity in our hand.</span>",
@@ -32,7 +32,8 @@
icon_state = "electric_hand"
show_examine = FALSE
/obj/item/weapon/finger_lockpick/New()
/obj/item/weapon/finger_lockpick/Initialize()
. = ..()
if(ismob(loc))
to_chat(loc, "<span class='notice'>We shape our finger to fit inside electronics, and are ready to force them open.</span>")
@@ -37,7 +37,8 @@
add_attack_logs(src,T,"DNA extraction sting (changeling)")
var/datum/absorbed_dna/newDNA = new(T.real_name, T.dna, T.species.name, T.languages)
var/saved_dna = T.dna.Clone() /// Prevent transforming bugginess.
var/datum/absorbed_dna/newDNA = new(T.real_name, saved_dna, T.species.name, T.languages, T.identifying_gender, T.flavor_text, T.modifiers)
absorbDNA(newDNA)
feedback_add_details("changeling_powers","ED")
@@ -264,12 +264,10 @@ var/global/list/changeling_fabricated_clothing = list(
access = null
canremove = 0
/obj/item/weapon/card/id/syndicate/changeling/New(mob/user as mob)
..()
registered_user = user
/obj/item/weapon/card/id/syndicate/changeling/Initialize()
. = ..()
if(ismob(loc))
registered_user = loc
access = null
/obj/item/weapon/card/id/syndicate/changeling/verb/shred()
+1 -8
View File
@@ -439,16 +439,9 @@
toggled = 0 // Mainly used for overlays.
cooldown = 0 // If set, will add a cooldown overlay and adjust click delay. Must be a multiple of 5 for overlays.
cast_sound = null // Sound file played when this is used.
needs_core = FALSE // Does not need a core.
var/last_castcheck = null // The last time this spell was cast.
/obj/item/weapon/spell/construct/New()
//..() //This kills the spell, because super on this calls the default spell's New, which checks for a core. Can't have that.
if(isliving(loc))
owner = loc
if(!owner)
qdel(src)
update_icon()
/obj/item/weapon/spell/construct/adjust_instability(var/amount) //The only drawback to the boons of the geometer is the use of a mortal's blood as fuel. Constructs have already paid that price long ago.
return
@@ -154,6 +154,7 @@
return
/obj/effect/gateway/active/Initialize()
. = ..()
addtimer(CALLBACK(src, .proc/spawn_and_qdel), rand(30, 60) SECONDS)
/obj/effect/gateway/active/proc/spawn_and_qdel()
+5 -4
View File
@@ -16,8 +16,8 @@ var/global/list/narsie_list = list()
consume_range = 3 //How many tiles out do we eat
/obj/singularity/narsie/New()
..()
/obj/singularity/narsie/Initialize()
. = ..()
narsie_list.Add(src)
/obj/singularity/narsie/Destroy()
@@ -40,8 +40,8 @@ var/global/list/narsie_list = list()
var/announce=1
var/cause_hell = 1
/obj/singularity/narsie/large/New()
..()
/obj/singularity/narsie/large/Initialize()
. = ..()
if(announce)
to_world("<font size='15' color='red'><b>[uppertext(name)] HAS RISEN</b></font>")
world << sound('sound/effects/weather/wind/wind_5_1.ogg')
@@ -358,6 +358,7 @@ var/global/list/narsie_list = list()
consume(T)
/obj/singularity/narsie/proc/narsie_spawn_animation()
set waitfor = FALSE
icon = 'icons/obj/narsie_spawn_anim.dmi'
dir = SOUTH
move_self = 0
@@ -21,7 +21,7 @@
/turf/unsimulated/wall/supermatter/Destroy()
STOP_PROCESSING(SSturfs, src)
..()
return ..()
/turf/unsimulated/wall/supermatter/process()
// Only check infrequently.
@@ -14,9 +14,9 @@
consume_range = 6
/obj/singularity/narsie/large/exit/New()
..()
START_PROCESSING(SSobj, src)
/obj/singularity/narsie/large/exit/Initialize()
. = ..()
START_PROCESSING(SSobj, src)
/obj/singularity/narsie/large/exit/update_icon()
overlays = 0
+3 -3
View File
@@ -8,9 +8,9 @@
density = 0
anchored = 1
/obj/effect/bhole/New()
spawn(4)
controller()
/obj/effect/bhole/Initialize()
. = ..()
addtimer(CALLBACK(src, .proc/controller), 4)
/obj/effect/bhole/proc/controller()
while(src)
@@ -23,9 +23,6 @@
desc = "Directions for use: Requires two people, one to pull each end."
var/cracked = 0
/obj/item/weapon/toy/xmas_cracker/New()
..()
/obj/item/weapon/toy/xmas_cracker/attack(mob/target, mob/user)
if( !cracked && (istype(target,/mob/living/silicon) || (istype(target,/mob/living/carbon/human) && !target.get_active_hand())) && target.stat == CONSCIOUS)
target.visible_message("<span class='notice'>[user] and [target] pop \an [src]! *pop*</span>", "<span class='notice'>You pull \an [src] with [target]! *pop*</span>", "<span class='notice'>You hear a *pop*.</span>")
+1 -4
View File
@@ -130,6 +130,7 @@
. = ..()
z_original = z
GLOB.meteor_list += src
SpinAnimation()
/obj/effect/meteor/Move()
if(z != z_original || loc == dest)
@@ -151,10 +152,6 @@
GLOB.meteor_list -= src
return ..()
/obj/effect/meteor/New()
..()
SpinAnimation()
/obj/effect/meteor/Bump(atom/A)
if(A)
if(A.handle_meteor_impact(src)) // Used for special behaviour when getting hit specifically by a meteor, like a shield.
+2 -2
View File
@@ -62,8 +62,8 @@ var/list/all_technomancer_assistance = typesof(/datum/technomancer/assistance) -
// Proc: New()
// Parameters: 0
// Description: Sets up the catalog, as shown below.
/obj/item/weapon/technomancer_catalog/New()
..()
/obj/item/weapon/technomancer_catalog/Initialize()
. = ..()
set_up()
// Proc: set_up()
+5 -4
View File
@@ -36,8 +36,8 @@
var/list/wards_in_use = list() // Wards don't count against the cap for other summons.
var/max_summons = 10 // Maximum allowed summoned entities. Some cores will have different caps.
/obj/item/weapon/technomancer_core/New()
..()
/obj/item/weapon/technomancer_core/Initialize()
. = ..()
START_PROCESSING(SSobj, src)
/obj/item/weapon/technomancer_core/Destroy()
@@ -141,9 +141,10 @@
var/obj/item/weapon/technomancer_core/core = null
var/ability_icon_state = null
/obj/spellbutton/New(loc, var/path, var/new_name, var/new_icon_state)
/obj/spellbutton/Initialize(var/ml, var/path, var/new_name, var/new_icon_state)
. = ..()
if(!path || !ispath(path))
message_admins("ERROR: /obj/spellbutton/New() was not given a proper path!")
message_admins("ERROR: /obj/spellbutton/Initialize() was not given a proper path!")
qdel(src)
src.name = new_name
src.spellpath = path
@@ -36,9 +36,9 @@
wearer.custom_pain("Your hands hurt like hell!",1)
wearer = null
/obj/item/clothing/gloves/regen/New()
/obj/item/clothing/gloves/regen/Initialize()
START_PROCESSING(SSobj, src)
..()
. = ..()
/obj/item/clothing/gloves/regen/Destroy()
wearer = null
@@ -24,8 +24,8 @@
var/datum/effect/effect/system/spark_spread/spark_system = null
var/block_percentage = 75
/obj/item/clothing/suit/armor/shield/New()
..()
/obj/item/clothing/suit/armor/shield/Initialize()
. = ..()
spark_system = new /datum/effect/effect/system/spark_spread()
spark_system.set_up(5, 0, src)
@@ -108,7 +108,7 @@
name = "hypo belt"
desc = "A medical belt designed to carry autoinjectors and other medical equipment."
/obj/item/weapon/storage/belt/medical/technomancer/New()
/obj/item/weapon/storage/belt/medical/technomancer/Initialize()
new /obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/brute(src)
new /obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/burn(src)
new /obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/toxin(src)
@@ -117,7 +117,7 @@
new /obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/pain(src)
new /obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/organ(src)
new /obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/combat(src)
..()
. = ..()
/datum/technomancer/equipment/belt_of_holding
name = "Belt of Holding"
@@ -18,6 +18,7 @@
var/toggled = 0 // Mainly used for overlays.
var/cooldown = 0 // If set, will add a cooldown overlay and adjust click delay. Must be a multiple of 5 for overlays.
var/cast_sound = null // Sound file played when this is used.
var/needs_core = TRUE // Does this spell need a core to be usable?
// Proc: on_use_cast()
// Parameters: 1 (user - the technomancer casting the spell)
@@ -110,18 +111,18 @@
// Proc: New()
// Parameters: 0
// Description: Sets owner to equal its loc, links to the owner's core, then applies overlays if needed.
/obj/item/weapon/spell/New()
..()
/obj/item/weapon/spell/Initialize()
. = ..()
if(isliving(loc))
owner = loc
if(owner)
core = owner.get_technomancer_core()
if(!core)
if(!core && needs_core)
to_chat(owner, "<span class='warning'>You need a Core to do that.</span>")
qdel(src)
return
// if(istype(/obj/item/weapon/technomancer_core, owner.back))
// core = owner.back
return INITIALIZE_HINT_QDEL
else
return INITIALIZE_HINT_QDEL
update_icon()
// Proc: Destroy()
@@ -41,8 +41,8 @@
aspect = ASPECT_CHROMATIC
var/glow_color = "#FFFFFF"
/obj/item/weapon/spell/aura/New()
..()
/obj/item/weapon/spell/aura/Initialize()
. = ..()
set_light(7, 4, l_color = glow_color)
START_PROCESSING(SSobj, src)
@@ -6,8 +6,8 @@
aspect = null
var/glow_color = "#FFFFFF"
/obj/item/weapon/spell/aura/New()
..()
/obj/item/weapon/spell/aura/Initialize()
. = ..()
set_light(calculate_spell_power(7), calculate_spell_power(4), l_color = glow_color)
START_PROCESSING(SSobj, src)
log_and_message_admins("has started casting [src].")
@@ -14,8 +14,8 @@
aspect = ASPECT_LIGHT
var/color_to_use = "#FFFFFF"
/obj/item/weapon/spell/chroma/New()
..()
/obj/item/weapon/spell/chroma/Initialize()
. = ..()
set_light(6, 5, l_color = color_to_use)
/obj/effect/temporary_effect/chroma
@@ -20,8 +20,8 @@
var/list/things_to_siphon = list() //Things which are actually drained as a result of the above not being null.
var/flow_rate = 1000 // Limits how much electricity can be drained per second. Measured by default in god knows what.
/obj/item/weapon/spell/energy_siphon/New()
..()
/obj/item/weapon/spell/energy_siphon/Initialize()
. = ..()
START_PROCESSING(SSobj, src)
/obj/item/weapon/spell/energy_siphon/Destroy()
@@ -14,8 +14,8 @@
aspect = ASPECT_FIRE
var/obj/item/weapon/weldingtool/spell/welder = null
/obj/item/weapon/spell/flame_tongue/New()
..()
/obj/item/weapon/spell/flame_tongue/Initialize()
. = ..()
set_light(3, 2, l_color = "#FF6A00")
visible_message("<span class='warning'>\The [loc]'s hand begins to emit a flame.</span>")
welder = new /obj/item/weapon/weldingtool/spell(src)
@@ -11,8 +11,8 @@
var/obj/item/weapon/inserted_spell/inserting = null
var/allow_stacking = 0
/obj/item/weapon/spell/insert/New()
..()
/obj/item/weapon/spell/insert/Initialize()
. = ..()
set_light(spell_light_range, spell_light_intensity, l_color = light_color)
/obj/item/weapon/inserted_spell
@@ -20,9 +20,9 @@
var/mob/living/host = null
var/spell_power_at_creation = 1.0 // This is here because the spell object that made this object probably won't exist.
/obj/item/weapon/inserted_spell/New(var/newloc, var/user, var/obj/item/weapon/spell/insert/inserter)
..(newloc)
host = newloc
/obj/item/weapon/inserted_spell/Initialize(var/ml, var/user, var/obj/item/weapon/spell/insert/inserter)
. = ..()
host = loc
origin = user
if(light_color)
spawn(1)
@@ -14,8 +14,8 @@
cast_methods = CAST_USE
aspect = ASPECT_UNSTABLE
/obj/item/weapon/spell/instability_tap/New()
..()
/obj/item/weapon/spell/instability_tap/Initialize()
. = ..()
set_light(3, 2, l_color = "#FA58F4")
/obj/item/weapon/spell/instability_tap/on_use_cast(mob/user)
@@ -9,8 +9,8 @@
var/spell_light_intensity = 2
var/spell_light_range = 3
/obj/item/weapon/spell/modifier/New()
..()
/obj/item/weapon/spell/modifier/Initialize()
. = ..()
set_light(spell_light_range, spell_light_intensity, l_color = light_color)
/obj/item/weapon/spell/modifier/on_melee_cast(atom/hit_atom, mob/user)
@@ -15,8 +15,8 @@
cast_methods = CAST_USE
aspect = ASPECT_TELE
/obj/item/weapon/spell/phase_shift/New()
..()
/obj/item/weapon/spell/phase_shift/Initialize()
. = ..()
set_light(3, 2, l_color = "#FA58F4")
/obj/effect/phase_shift
@@ -28,8 +28,8 @@
/obj/effect/phase_shift/ex_act()
return
/obj/effect/phase_shift/New()
..()
/obj/effect/phase_shift/Initialize()
. = ..()
set_light(3, 5, l_color = "#FA58F4")
START_PROCESSING(SSobj, src)
@@ -16,8 +16,8 @@
var/power = 250
toggled = 1
/obj/item/weapon/spell/radiance/New()
..()
/obj/item/weapon/spell/radiance/Initialize()
. = ..()
set_light(7, 4, l_color = "#D9D900")
START_PROCESSING(SSobj, src)
log_and_message_admins("has casted [src].")
@@ -16,8 +16,8 @@
var/damage_to_energy_multiplier = 60.0 //Determines how much energy to charge for blocking, e.g. 20 damage attack = 1200 energy cost
var/datum/effect/effect/system/spark_spread/spark_system = null
/obj/item/weapon/spell/reflect/New()
..()
/obj/item/weapon/spell/reflect/Initialize()
. = ..()
set_light(3, 2, l_color = "#006AFF")
spark_system = new /datum/effect/effect/system/spark_spread()
spark_system.set_up(5, 0, src)
@@ -18,8 +18,8 @@
var/damage_to_energy_multiplier = 30.0 //Determines how much energy to charge for blocking, e.g. 20 damage attack = 600 energy cost
var/datum/effect/effect/system/spark_spread/spark_system = null
/obj/item/weapon/spell/shield/New()
..()
/obj/item/weapon/spell/shield/Initialize()
. = ..()
set_light(3, 2, l_color = "#006AFF")
spark_system = new /datum/effect/effect/system/spark_spread()
spark_system.set_up(5, 0, src)
@@ -18,8 +18,8 @@
adjust_instability(4)
..()
/obj/item/weapon/spell/spawner/darkness/New()
..()
/obj/item/weapon/spell/spawner/darkness/Initialize()
. = ..()
set_light(6, -20, l_color = "#FFFFFF")
/obj/effect/temporary_effect/darkness
@@ -14,8 +14,8 @@
aspect = ASPECT_UNSTABLE
spawner_type = /obj/effect/temporary_effect/destablize
/obj/item/weapon/spell/spawner/destablize/New()
..()
/obj/item/weapon/spell/spawner/destablize/Initialize()
. = ..()
set_light(3, 2, l_color = "#C26DDE")
/obj/item/weapon/spell/spawner/destablize/on_ranged_cast(atom/hit_atom, mob/user)
@@ -13,8 +13,8 @@
aspect = ASPECT_EMP
spawner_type = /obj/effect/temporary_effect/pulse/pulsar
/obj/item/weapon/spell/spawner/pulsar/New()
..()
/obj/item/weapon/spell/spawner/pulsar/Initialize()
. = ..()
set_light(3, 2, l_color = "#2ECCFA")
/obj/item/weapon/spell/spawner/pulsar/on_ranged_cast(atom/hit_atom, mob/user)
@@ -14,8 +14,8 @@
aspect = ASPECT_TELE
var/datum/effect/effect/system/spark_spread/sparks
/obj/item/weapon/spell/warp_strike/New()
..()
/obj/item/weapon/spell/warp_strike/Initialize()
. = ..()
sparks = new /datum/effect/effect/system/spark_spread()
sparks.set_up(5, 0, src)
sparks.attach(loc)
+7
View File
@@ -23,7 +23,10 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 1)
economic_modifier = 20
minimum_character_age = 25
min_age_by_species = list(SPECIES_HUMAN_VATBORN = 14)
ideal_character_age = 70 // Old geezer captains ftw
ideal_age_by_species = list(SPECIES_HUMAN_VATBORN = 55) /// Vatborn live shorter, no other race eligible for captain besides human/skrell
banned_job_species = list(SPECIES_UNATHI, SPECIES_TAJ, SPECIES_DIONA, SPECIES_PROMETHEAN, SPECIES_ZADDAT, "mechanical", "digital")
outfit_type = /decl/hierarchy/outfit/job/captain
job_description = "The Site Manager manages the other Command Staff, and through them the rest of the station. Though they have access to everything, \
@@ -31,6 +34,7 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 1)
have an understanding of Standard Operating Procedure, and is subject to it, and legal action, in the same way as every other crew member."
alt_titles = list("Overseer"= /datum/alt_title/overseer)
/*
/datum/job/captain/equip(var/mob/living/carbon/human/H)
. = ..()
@@ -66,7 +70,10 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 1)
economic_modifier = 10
minimum_character_age = 25
min_age_by_species = list(SPECIES_UNATHI = 70, SPECIES_TESHARI = 20, "mechanical" = 10, SPECIES_HUMAN_VATBORN = 14)
ideal_character_age = 50
ideal_age_by_species = list(SPECIES_UNATHI = 140, SPECIES_TESHARI = 27, "mechanical" = 20, SPECIES_HUMAN_VATBORN = 20)
banned_job_species = list(SPECIES_PROMETHEAN, SPECIES_ZADDAT, "digital", SPECIES_DIONA)
outfit_type = /decl/hierarchy/outfit/job/hop
job_description = "The Head of Personnel manages the Service department, the Exploration team, and most other civilians. They also \
+2
View File
@@ -99,6 +99,7 @@
economic_modifier = 5
access = list(access_maint_tunnels, access_mailsorting, access_cargo, access_cargo_bot, access_qm, access_mining, access_mining_station)
minimal_access = list(access_maint_tunnels, access_mailsorting, access_cargo, access_cargo_bot, access_qm, access_mining, access_mining_station)
banned_job_species = list("digital", SPECIES_PROMETHEAN)
ideal_character_age = 40
@@ -231,6 +232,7 @@
access = list(access_lawyer, access_sec_doors, access_maint_tunnels, access_heads)
minimal_access = list(access_lawyer, access_sec_doors, access_heads)
minimal_player_age = 7
banned_job_species = list(SPECIES_PROMETHEAN, SPECIES_UNATHI, SPECIES_DIONA, SPECIES_TESHARI, SPECIES_ZADDAT, "digital")
outfit_type = /decl/hierarchy/outfit/job/internal_affairs_agent
job_description = "An Internal Affairs Agent makes sure that the crew is following Standard Operating Procedure. They also \
+5
View File
@@ -17,7 +17,10 @@
economic_modifier = 10
minimum_character_age = 25
min_age_by_species = list(SPECIES_UNATHI = 70, "mechanical" = 10, SPECIES_HUMAN_VATBORN = 14)
ideal_character_age = 50
ideal_age_by_species = list(SPECIES_UNATHI = 140, "mechanical" = 20, SPECIES_HUMAN_VATBORN = 20)
banned_job_species = list(SPECIES_TESHARI, SPECIES_DIONA, SPECIES_PROMETHEAN, SPECIES_ZADDAT, "digital")
access = list(access_engine, access_engine_equip, access_tech_storage, access_maint_tunnels,
@@ -55,6 +58,7 @@
"Engine Technician" = /datum/alt_title/engine_tech, "Electrician" = /datum/alt_title/electrician)
minimal_player_age = 3
min_age_by_species = list(SPECIES_PROMETHEAN = 2)
outfit_type = /decl/hierarchy/outfit/job/engineering/engineer
job_description = "An Engineer keeps the station running. They repair damages, keep the atmosphere stable, and ensure that power is being \
@@ -94,6 +98,7 @@
minimal_access = list(access_eva, access_engine, access_atmospherics, access_maint_tunnels, access_emergency_storage, access_construction, access_external_airlocks)
minimal_player_age = 3
min_age_by_species = list(SPECIES_PROMETHEAN = 2)
outfit_type = /decl/hierarchy/outfit/job/engineering/atmos
job_description = "An Atmospheric Technician is primarily concerned with keeping the station's atmosphere breathable. They are expected to have a good \
+20 -1
View File
@@ -22,7 +22,10 @@
var/department_accounts = null // Which department accounts should people with this position be given the pin for?
var/assignable = TRUE // Should it show up on things like the ID computer?
var/minimum_character_age = 0
var/list/min_age_by_species = null
var/ideal_character_age = 30
var/list/ideal_age_by_species = null
var/list/banned_job_species = null
var/has_headset = TRUE //Do people with this job need to be given headsets and told how to use them? E.g. Cyborgs don't.
var/account_allowed = 1 // Does this job type come with a station account?
@@ -158,4 +161,20 @@
if(mannequin.back)
var/obj/O = mannequin.back
mannequin.drop_from_inventory(O)
qdel(O)
qdel(O)
///Assigns minimum age by race & brain type. Code says Positronic = mechanical and Drone = digital because nothing can be simple.
///Will first check based on brain type, then based on species.
/datum/job/proc/get_min_age(species_name, brain_type)
return (brain_type && LAZYACCESS(min_age_by_species, brain_type)) || LAZYACCESS(min_age_by_species, species_name) || minimum_character_age
/datum/job/proc/get_ideal_age(species_name, brain_type)
return (brain_type && LAZYACCESS(ideal_age_by_species, brain_type)) || LAZYACCESS(ideal_age_by_species, brain_type) || ideal_character_age
/datum/job/proc/is_species_banned(species_name, brain_type)
if(banned_job_species == null)
return
if(species_name in banned_job_species)
return TRUE
if(brain_type in banned_job_species)
return TRUE
+10
View File
@@ -23,8 +23,11 @@
access_keycard_auth, access_sec_doors, access_psychiatrist, access_eva, access_external_airlocks, access_maint_tunnels)
minimum_character_age = 25
min_age_by_species = list(SPECIES_UNATHI = 70, "mechanical" = 10, SPECIES_HUMAN_VATBORN = 14)
minimal_player_age = 10
ideal_character_age = 50
ideal_age_by_species = list(SPECIES_UNATHI = 140, "mechanical" = 20, SPECIES_HUMAN_VATBORN = 20)
banned_job_species = list(SPECIES_TESHARI, SPECIES_DIONA, SPECIES_PROMETHEAN, SPECIES_ZADDAT, "digital")
outfit_type = /decl/hierarchy/outfit/job/medical/cmo
job_description = "The CMO manages the Medical department and is a position requiring experience and skill; their goal is to ensure that their \
@@ -58,6 +61,8 @@
"Nurse" = /datum/alt_title/nurse,
"Virologist" = /datum/alt_title/virologist)
min_age_by_species = list(SPECIES_PROMETHEAN = 3)
//Medical Doctor Alt Titles
/datum/alt_title/surgeon
title = "Surgeon"
@@ -103,6 +108,7 @@
access = list(access_medical, access_medical_equip, access_morgue, access_surgery, access_chemistry, access_virology, access_genetics)
minimal_access = list(access_medical, access_medical_equip, access_chemistry)
minimal_player_age = 3
min_age_by_species = list(SPECIES_PROMETHEAN = 3)
outfit_type = /decl/hierarchy/outfit/job/medical/chemist
job_description = "A Chemist produces and maintains a stock of basic to advanced chemicals for medical and occasionally research use. \
@@ -157,6 +163,7 @@
job_description = "A Psychiatrist provides mental health services to crew members in need. They may also be called upon to determine whatever \
ails the mentally unwell, frequently under Security supervision. They understand the effects of various psychoactive drugs."
alt_titles = list("Psychologist" = /datum/alt_title/psychologist)
banned_job_species = list(SPECIES_PROMETHEAN, SPECIES_DIONA)
//Psychiatrist Alt Titles
/datum/alt_title/psychologist
@@ -185,6 +192,9 @@
job_description = "A Paramedic is primarily concerned with the recovery of patients who are unable to make it to the Medical Department on their own. \
They may also be called upon to keep patients stable when Medical is busy or understaffed."
alt_titles = list("Emergency Medical Technician" = /datum/alt_title/emt)
banned_job_species = list(SPECIES_DIONA)
min_age_by_species = list(SPECIES_PROMETHEAN = 2)
// Paramedic Alt Titles
/datum/alt_title/emt
+10
View File
@@ -26,7 +26,10 @@
minimum_character_age = 25
minimal_player_age = 14
min_age_by_species = list(SPECIES_UNATHI = 70, "mechanical" = 10, SPECIES_HUMAN_VATBORN = 14)
ideal_character_age = 50
ideal_age_by_species = list(SPECIES_UNATHI = 140, "mechanical" = 20, SPECIES_HUMAN_VATBORN = 20)
banned_job_species = list(SPECIES_TESHARI, SPECIES_DIONA, SPECIES_PROMETHEAN, SPECIES_ZADDAT, "digital")
outfit_type = /decl/hierarchy/outfit/job/science/rd
job_description = "The Research Director manages and maintains the Research department. They are required to ensure the safety of the entire crew, \
@@ -35,6 +38,7 @@
are encouraged to allow their staff to perform their own duties."
alt_titles = list("Research Supervisor" = /datum/alt_title/research_supervisor)
// Research Director Alt Titles
/datum/alt_title/research_supervisor
title = "Research Supervisor"
@@ -55,6 +59,8 @@
economic_modifier = 7
access = list(access_robotics, access_tox, access_tox_storage, access_research, access_xenobiology, access_xenoarch)
minimal_access = list(access_tox, access_tox_storage, access_research, access_xenoarch)
min_age_by_species = list(SPECIES_PROMETHEAN = 2)
banned_job_species = list("digital")
minimal_player_age = 14
@@ -98,8 +104,10 @@
economic_modifier = 7
access = list(access_robotics, access_tox, access_tox_storage, access_research, access_xenobiology, access_hydroponics)
minimal_access = list(access_research, access_xenobiology, access_hydroponics, access_tox_storage)
banned_job_species = list("digital")
minimal_player_age = 14
min_age_by_species = list(SPECIES_PROMETHEAN = 2)
outfit_type = /decl/hierarchy/outfit/job/science/xenobiologist
job_description = "A Xenobiologist studies esoteric lifeforms, usually in the relative safety of their lab. They attempt to find ways to benefit \
@@ -129,6 +137,8 @@
access = list(access_robotics, access_tox, access_tox_storage, access_tech_storage, access_morgue, access_research) //As a job that handles so many corpses, it makes sense for them to have morgue access.
minimal_access = list(access_robotics, access_tech_storage, access_morgue, access_research) //As a job that handles so many corpses, it makes sense for them to have morgue access.
minimal_player_age = 7
min_age_by_species = list(SPECIES_PROMETHEAN = 2)
banned_job_species = list("digital")
outfit_type = /decl/hierarchy/outfit/job/science/roboticist
job_description = "A Roboticist maintains and repairs the station's synthetics, including crew with prosthetic limbs. \
+10
View File
@@ -24,7 +24,11 @@
access_research, access_engine, access_mining, access_medical, access_construction, access_mailsorting,
access_heads, access_hos, access_RC_announce, access_keycard_auth, access_gateway, access_external_airlocks)
minimum_character_age = 25
min_age_by_species = list(SPECIES_HUMAN_VATBORN = 14)
minimal_player_age = 14
ideal_character_age = 50
ideal_age_by_species = list(SPECIES_HUMAN_VATBORN = 20)
banned_job_species = list(SPECIES_TESHARI, SPECIES_DIONA, SPECIES_PROMETHEAN, SPECIES_ZADDAT, "digital", SPECIES_UNATHI, "mechanical")
outfit_type = /decl/hierarchy/outfit/job/security/hos
job_description = " The Head of Security manages the Security Department, keeping the station safe and making sure the rules are followed. They are expected to \
@@ -32,6 +36,7 @@
perform the duties of absent Security roles, such as distributing gear from the Armory."
alt_titles = list("Security Commander" = /datum/alt_title/sec_commander, "Chief of Security" = /datum/alt_title/sec_chief)
// Head of Security Alt Titles
/datum/alt_title/sec_commander
title = "Security Commander"
@@ -57,6 +62,7 @@
access = list(access_security, access_eva, access_sec_doors, access_brig, access_armory, access_maint_tunnels, access_morgue, access_external_airlocks)
minimal_access = list(access_security, access_eva, access_sec_doors, access_brig, access_armory, access_maint_tunnels, access_external_airlocks)
minimal_player_age = 5
banned_job_species = list(SPECIES_ZADDAT, SPECIES_PROMETHEAN, SPECIES_TESHARI, SPECIES_DIONA)
outfit_type = /decl/hierarchy/outfit/job/security/warden
job_description = "The Warden watches over the physical Security Department, making sure the Brig and Armoury are secure and in order at all times. They oversee \
@@ -81,6 +87,7 @@
minimal_access = list(access_security, access_sec_doors, access_forensics_lockers, access_morgue, access_maint_tunnels, access_eva, access_external_airlocks)
economic_modifier = 5
minimal_player_age = 3
banned_job_species = list(SPECIES_ZADDAT, SPECIES_PROMETHEAN, SPECIES_DIONA)
outfit_type = /decl/hierarchy/outfit/job/security/detective
job_description = "A Detective works to help Security find criminals who have not properly been identified, through interviews and forensic work. \
@@ -110,6 +117,7 @@
access = list(access_security, access_eva, access_sec_doors, access_brig, access_maint_tunnels, access_morgue, access_external_airlocks)
minimal_access = list(access_security, access_eva, access_sec_doors, access_brig, access_maint_tunnels, access_external_airlocks)
minimal_player_age = 3
banned_job_species = list(SPECIES_ZADDAT, SPECIES_TESHARI, SPECIES_DIONA)
outfit_type = /decl/hierarchy/outfit/job/security/officer
job_description = "A Security Officer is concerned with maintaining the safety and security of the station as a whole, dealing with external threats and \
@@ -117,6 +125,8 @@
No one is above the Law, not Security or Command."
alt_titles = list("Junior Officer" = /datum/alt_title/junior_officer)
min_age_by_species = list(SPECIES_PROMETHEAN = 3)
// Security Officer Alt Titles
/datum/alt_title/junior_officer
title = "Junior Officer"
+19 -15
View File
@@ -54,7 +54,7 @@ var/global/datum/controller/occupations/job_master
var/datum/job/job = GetJob(rank)
if(!job)
return 0
if(job.minimum_character_age && (player.client.prefs.age < job.minimum_character_age))
if((job.minimum_character_age || job.min_age_by_species) && (player.client.prefs.age < job.get_min_age(player.client.prefs.species, player.client.prefs.organ_data["brain"])))
return 0
if(jobban_isbanned(player, rank))
return 0
@@ -91,9 +91,12 @@ var/global/datum/controller/occupations/job_master
if(!job.player_old_enough(player.client))
Debug("FOC player not old enough, Player: [player]")
continue
if(job.minimum_character_age && (player.client.prefs.age < job.minimum_character_age))
if(job.minimum_character_age && (player.client.prefs.age < job.get_min_age(player.client.prefs.species, player.client.prefs.organ_data["brain"])))
Debug("FOC character not old enough, Player: [player]")
continue
if(job.is_species_banned(player.client.prefs.species, player.client.prefs.organ_data["brain"]) == TRUE)
Debug("FOC character species invalid for job, Player: [player]")
continue
if(flag && !(player.client.prefs.be_special & flag))
Debug("FOC flag failed, Player: [player], Flag: [flag], ")
continue
@@ -108,7 +111,10 @@ var/global/datum/controller/occupations/job_master
if(!job)
continue
if(job.minimum_character_age && (player.client.prefs.age < job.minimum_character_age))
if((job.minimum_character_age || job.min_age_by_species) && (player.client.prefs.age < job.get_min_age(player.client.prefs.species, player.client.prefs.organ_data["brain"])))
continue
if(job.is_species_banned(player.client.prefs.species, player.client.prefs.organ_data["brain"]) == TRUE)
continue
if(istype(job, GetJob("Assistant"))) // We don't want to give him assistant, that's boring!
@@ -157,20 +163,18 @@ var/global/datum/controller/occupations/job_master
if(!V.client) continue
var/age = V.client.prefs.age
if(age < job.minimum_character_age) // Nope.
if(age < job.get_min_age(V.client.prefs.species, V.client.prefs.organ_data["brain"])) // Nope.
continue
switch(age)
if(job.minimum_character_age to (job.minimum_character_age+10))
weightedCandidates[V] = 3 // Still a bit young.
if((job.minimum_character_age+10) to (job.ideal_character_age-10))
weightedCandidates[V] = 6 // Better.
if((job.ideal_character_age-10) to (job.ideal_character_age+10))
weightedCandidates[V] = 10 // Great.
if((job.ideal_character_age+10) to (job.ideal_character_age+20))
weightedCandidates[V] = 6 // Still good.
if((job.ideal_character_age+20) to INFINITY)
weightedCandidates[V] = 3 // Geezer.
var/idealage = job.get_ideal_age(V.client.prefs.species, V.client.prefs.organ_data["brain"])
var/agediff = abs(idealage - age) // Compute the absolute difference in age from target
switch(agediff) /// If the math sucks, it's because I almost failed algebra in high school.
if(20 to INFINITY)
weightedCandidates[V] = 3 // Too far off
if(10 to 20)
weightedCandidates[V] = 6 // Nearer the mark, but not quite
if(0 to 10)
weightedCandidates[V] = 10 // On the mark
else
// If there's ABSOLUTELY NOBODY ELSE
if(candidates.len == 1) weightedCandidates[V] = 1
+2 -2
View File
@@ -10,8 +10,8 @@
idle_power_usage = 0
var/obj/item/device/radio/beacon/Beacon
/obj/machinery/bluespace_beacon/New()
..()
/obj/machinery/bluespace_beacon/Initialize()
. = ..()
var/turf/T = src.loc
Beacon = new /obj/item/device/radio/beacon
Beacon.invisibility = INVISIBILITY_MAXIMUM
+2 -2
View File
@@ -8,10 +8,10 @@
var/max_cable = 100
var/on = 0
/obj/machinery/cablelayer/New()
/obj/machinery/cablelayer/Initialize()
cable = new(src)
cable.amount = 100
..()
. = ..()
/obj/machinery/cablelayer/Moved(atom/old_loc, direction, forced = FALSE)
. = ..()
+2 -2
View File
@@ -14,8 +14,8 @@
var/strapped = 0.0
var/obj/machinery/computer/operating/computer = null
/obj/machinery/optable/New()
..()
/obj/machinery/optable/Initialize()
. = ..()
for(var/direction in list(NORTH,EAST,SOUTH,WEST))
computer = locate(/obj/machinery/computer/operating, get_step(src, direction))
if(computer)

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