diff --git a/code/__DEFINES/DNA.dm b/code/__DEFINES/DNA.dm
index bb8d902fae..1c5185b8dc 100644
--- a/code/__DEFINES/DNA.dm
+++ b/code/__DEFINES/DNA.dm
@@ -96,6 +96,7 @@
#define ORGAN_SLOT_RIGHT_ARM_AUG "r_arm_device"
#define ORGAN_SLOT_LEFT_ARM_AUG "l_arm_device"
#define ORGAN_SLOT_STOMACH "stomach"
+#define ORGAN_SLOT_STOMACH_AID "stomach_aid"
#define ORGAN_SLOT_BREATHING_TUBE "breathing_tube"
#define ORGAN_SLOT_EARS "ears"
#define ORGAN_SLOT_EYES "eye_sight"
diff --git a/code/__DEFINES/access.dm b/code/__DEFINES/access.dm
index d00645846b..c9d545fc03 100644
--- a/code/__DEFINES/access.dm
+++ b/code/__DEFINES/access.dm
@@ -1,22 +1,22 @@
-#define ACCESS_SECURITY 1 // Security equipment
-#define ACCESS_BRIG 2 // Brig timers and permabrig
-#define ACCESS_ARMORY 3
-#define ACCESS_FORENSICS_LOCKERS 4
+#define ACCESS_SECURITY 1 // Security equipment, security records, gulag item storage, secbots
+#define ACCESS_BRIG 2 // Brig cells+timers, permabrig, gulag+gulag shuttle, prisoner management console
+#define ACCESS_ARMORY 3 // Armory, gulag teleporter, execution chamber
+#define ACCESS_FORENSICS_LOCKERS 4 //Detective's office, forensics lockers, security+medical records
#define ACCESS_MEDICAL 5
#define ACCESS_MORGUE 6
-#define ACCESS_TOX 7
-#define ACCESS_TOX_STORAGE 8
-#define ACCESS_GENETICS 9
-#define ACCESS_ENGINE 10
-#define ACCESS_ENGINE_EQUIP 11
+#define ACCESS_TOX 7 //R&D department, R&D console, burn chamber on some maps
+#define ACCESS_TOX_STORAGE 8 //Toxins storage, burn chamber on some maps
+#define ACCESS_GENETICS 9
+#define ACCESS_ENGINE 10 //Engineering area, power monitor, power flow control console
+#define ACCESS_ENGINE_EQUIP 11 //APCs, EngiVend/YouTool, engineering equipment lockers
#define ACCESS_MAINT_TUNNELS 12
#define ACCESS_EXTERNAL_AIRLOCKS 13
-#define ACCESS_EMERGENCY_STORAGE 14
+#define ACCESS_EMERGENCY_STORAGE 14 //Not in use
#define ACCESS_CHANGE_IDS 15
#define ACCESS_AI_UPLOAD 16
#define ACCESS_TELEPORTER 17
#define ACCESS_EVA 18
-#define ACCESS_HEADS 19
+#define ACCESS_HEADS 19 //Bridge, EVA storage windoors, gateway shutters, AI integrity restorer, clone record deletion, comms console
#define ACCESS_CAPTAIN 20
#define ACCESS_ALL_PERSONAL_LOCKERS 21
#define ACCESS_CHAPEL_OFFICE 22
@@ -31,9 +31,9 @@
#define ACCESS_CARGO 31
#define ACCESS_CONSTRUCTION 32
#define ACCESS_CHEMISTRY 33
-#define ACCESS_CARGO_BOT 34
+#define ACCESS_CARGO_BOT 34 //Not in use
#define ACCESS_HYDROPONICS 35
-#define ACCESS_MANUFACTURING 36
+#define ACCESS_MANUFACTURING 36 //Only used on research.dmm away mission
#define ACCESS_LIBRARY 37
#define ACCESS_LAWYER 38
#define ACCESS_VIROLOGY 39
@@ -44,10 +44,10 @@
#define ACCESS_THEATRE 46
#define ACCESS_RESEARCH 47
#define ACCESS_MINING 48
-#define ACCESS_MINING_OFFICE 49 //not in use
+#define ACCESS_MINING_OFFICE 49 //Not in use
#define ACCESS_MAILSORTING 50
-#define ACCESS_MINT 51
-#define ACCESS_MINT_VAULT 52
+#define ACCESS_MINT 51 //Not in use
+#define ACCESS_MINT_VAULT 52 //Not in use
#define ACCESS_VAULT 53
#define ACCESS_MINING_STATION 54
#define ACCESS_XENOBIOLOGY 55
@@ -58,19 +58,19 @@
#define ACCESS_KEYCARD_AUTH 60 //Used for events which require at least two people to confirm them
#define ACCESS_TCOMSAT 61 // has access to the entire telecomms satellite / machinery
#define ACCESS_GATEWAY 62
-#define ACCESS_SEC_DOORS 63 // Security front doors
-#define ACCESS_MINERAL_STOREROOM 64
+#define ACCESS_SEC_DOORS 63 // Outer brig doors, department security posts
+#define ACCESS_MINERAL_STOREROOM 64 //For releasing minerals from the ORM
#define ACCESS_MINISAT 65
#define ACCESS_WEAPONS 66 //Weapon authorization for secbots
-#define ACCESS_NETWORK 67
-#define ACCESS_CLONING 68 //Cloning room
+#define ACCESS_NETWORK 67 //NTnet diagnostics/monitoring software
+#define ACCESS_CLONING 68 //Cloning room and clone pod ejection
//BEGIN CENTCOM ACCESS
/*Should leave plenty of room if we need to add more access levels.
Mostly for admin fun times.*/
-#define ACCESS_CENT_GENERAL 101//General facilities.
+#define ACCESS_CENT_GENERAL 101//General facilities. CentCom ferry.
#define ACCESS_CENT_THUNDER 102//Thunderdome.
-#define ACCESS_CENT_SPECOPS 103//Special Ops.
+#define ACCESS_CENT_SPECOPS 103//Special Ops. Captain's display case, Marauder and Seraph mechs.
#define ACCESS_CENT_MEDICAL 104//Medical/Research
#define ACCESS_CENT_LIVING 105//Living quarters.
#define ACCESS_CENT_STORAGE 106//Generic storage areas.
@@ -79,7 +79,7 @@
#define ACCESS_CENT_BAR 110 // The non-existent CentCom Bar
//The Syndicate
-#define ACCESS_SYNDICATE 150//General Syndicate Access
+#define ACCESS_SYNDICATE 150//General Syndicate Access. Includes Syndicate mechs and ruins.
#define ACCESS_SYNDICATE_LEADER 151//Nuke Op Leader Access
//Away Missions or Ruins
diff --git a/code/__DEFINES/components.dm b/code/__DEFINES/components.dm
index 7c00573089..940a9af56f 100644
--- a/code/__DEFINES/components.dm
+++ b/code/__DEFINES/components.dm
@@ -1,6 +1,7 @@
#define SEND_SIGNAL(target, sigtype, arguments...) ( !target.datum_components ? NONE : target._SendSignal(sigtype, list(##arguments)) )
#define SEND_GLOBAL_SIGNAL(sigtype, arguments...) ( !SSdcs.comp_lookup[sigtype] ? NONE : SSdcs._SendGlobalSignal(sigtype, list(##arguments)) )
+
//shorthand
#define GET_COMPONENT_FROM(varname, path, target) var##path/##varname = ##target.GetComponent(##path)
#define GET_COMPONENT(varname, path) GET_COMPONENT_FROM(varname, path, src)
@@ -98,6 +99,11 @@
#define COMSIG_MOVABLE_THROW "movable_throw" //from base of atom/movable/throw_at(): (datum/thrownthing, spin)
#define COMSIG_MOVABLE_Z_CHANGED "movable_ztransit" //from base of atom/movable/onTransitZ(): (old_z, new_z)
+// /mob/living signals
+#define COMSIG_LIVING_RESIST "living_resist" //from base of mob/living/resist() (/mob/living)
+#define COMSIG_LIVING_IGNITED "living_ignite" //from base of mob/living/IgniteMob() (/mob/living)
+#define COMSIG_LIVING_EXTINGUISHED "living_extinguished" //from base of mob/living/ExtinguishMob() (/mob/living)
+
// /mob/living/carbon signals
#define COMSIG_CARBON_SOUNDBANG "carbon_soundbang" //from base of mob/living/carbon/soundbang_act(): (list(intensity))
@@ -107,6 +113,7 @@
// /obj/item signals
#define COMSIG_ITEM_ATTACK "item_attack" //from base of obj/item/attack(): (/mob/living/target, /mob/living/user)
#define COMSIG_ITEM_ATTACK_SELF "item_attack_self" //from base of obj/item/attack_self(): (/mob)
+ #define COMPONENT_NO_INTERACT 1
#define COMSIG_ITEM_ATTACK_OBJ "item_attack_obj" //from base of obj/item/attack_obj(): (/obj, /mob)
#define COMPONENT_NO_ATTACK_OBJ 1
#define COMSIG_ITEM_PRE_ATTACK "item_pre_attack" //from base of obj/item/pre_attack(): (atom/target, mob/user, params)
@@ -120,6 +127,27 @@
// /obj/item/clothing signals
#define COMSIG_SHOES_STEP_ACTION "shoes_step_action" //from base of obj/item/clothing/shoes/proc/step_action(): ()
+// /obj/item/implant signals
+#define COMSIG_IMPLANT_ACTIVATED "implant_activated" //from base of /obj/item/implant/proc/activate(): ()
+#define COMSIG_IMPLANT_IMPLANTING "implant_implanting" //from base of /obj/item/implant/proc/implant(): (list/args)
+ #define COMPONENT_STOP_IMPLANTING 1
+#define COMSIG_IMPLANT_OTHER "implant_other" //called on already installed implants when a new one is being added in /obj/item/implant/proc/implant(): (list/args, obj/item/implant/new_implant)
+ //#define COMPONENT_STOP_IMPLANTING 1 //The name makes sense for both
+ #define COMPONENT_DELETE_NEW_IMPLANT 2
+ #define COMPONENT_DELETE_OLD_IMPLANT 4
+#define COMSIG_IMPLANT_EXISTING_UPLINK "implant_uplink_exists" //called on implants being implanted into someone with an uplink implant: (datum/component/uplink)
+ //This uses all return values of COMSIG_IMPLANT_OTHER
+
+// /obj/item/pda signals
+#define COMSIG_PDA_CHANGE_RINGTONE "pda_change_ringtone" //called on pda when the user changes the ringtone: (mob/living/user, new_ringtone)
+ #define COMPONENT_STOP_RINGTONE_CHANGE 1
+
+// /obj/item/radio signals
+#define COMSIG_RADIO_NEW_FREQUENCY "radio_new_frequency" //called from base of /obj/item/radio/proc/set_frequency(): (list/args)
+
+// /obj/item/pen signals
+#define COMSIG_PEN_ROTATED "pen_rotated" //called after rotation in /obj/item/pen/attack_self(): (rotation, mob/living/carbon/user)
+
// /mob/living/carbon/human signals
#define COMSIG_HUMAN_MELEE_UNARMED_ATTACK "human_melee_unarmed_attack" //from mob/living/carbon/human/UnarmedAttack(): (atom/target)
#define COMSIG_HUMAN_MELEE_UNARMED_ATTACKBY "human_melee_unarmed_attackby" //from mob/living/carbon/human/UnarmedAttack(): (mob/living/carbon/human/attacker)
@@ -139,7 +167,7 @@
#define COMSIG_CLEAR_MOOD_EVENT "clear_mood" //Called when you clear a mood event from anywhere in the code.
//NTnet
-#define COMSIG_COMPONENT_NTNET_RECIEVE "ntnet_recieve" //called on an object by its NTNET connection component on recieve. (sending_id(number), sending_netname(text), data(datum/netdata))
+#define COMSIG_COMPONENT_NTNET_RECEIVE "ntnet_receive" //called on an object by its NTNET connection component on receive. (sending_id(number), sending_netname(text), data(datum/netdata))
// /datum/component/storage signals
#define COMSIG_CONTAINS_STORAGE "is_storage" //() - returns bool.
diff --git a/code/__DEFINES/flags.dm b/code/__DEFINES/flags.dm
index 43cdbcb646..3ed28c4693 100644
--- a/code/__DEFINES/flags.dm
+++ b/code/__DEFINES/flags.dm
@@ -13,16 +13,12 @@ GLOBAL_LIST_INIT(bitflags, list(1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 204
//FLAGS BITMASK
-#define NODROP_1 (1<<1) // This flag makes it so that an item literally cannot be removed at all, or at least that's how it should be. Only deleted.
-#define NOBLUDGEON_1 (1<<2) // when an item has this it produces no "X has been hit by Y with Z" message in the default attackby()
#define HEAR_1 (1<<3) // This flag is what recursive_hear_check() uses to determine wether to add an item to the hearer list or not.
#define CHECK_RICOCHET_1 (1<<4) // Projectiels will check ricochet on things impacted that have this.
#define CONDUCT_1 (1<<5) // conducts electricity (metal etc.)
-#define ABSTRACT_1 (1<<6) // for all things that are technically items but used for various different stuff, made it 128 because it could conflict with other flags other way
#define NODECONSTRUCT_1 (1<<7) // For machines and structures that should not break into parts, eg, holodeck stuff
#define OVERLAY_QUEUED_1 (1<<8) // atom queued to SSoverlay
#define ON_BORDER_1 (1<<9) // item has priority to check when entering or leaving
-#define DROPDEL_1 (1<<10) // When dropped, it calls qdel on itself
#define PREVENT_CLICK_UNDER_1 (1<<11) //Prevent clicking things below it on the same turf eg. doors/ fulltile windows
#define HOLOGRAM_1 (1<<12)
#define TESLA_IGNORE_1 (1<<13) // TESLA_IGNORE grants immunity from being targeted by tesla-style electricity
@@ -33,9 +29,8 @@ GLOBAL_LIST_INIT(bitflags, list(1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 204
#define NOJAUNT_1 (1<<0)
#define UNUSED_RESERVATION_TURF_1 (1<<1)
#define CAN_BE_DIRTY_1 (1<<2) // If a turf can be made dirty at roundstart. This is also used in areas.
-#define NO_DEATHRATTLE_1 (1<<4) // Do not notify deadchat about any deaths that occur on this turf.
-#define NO_RUINS_1 (1<<5) //Blocks ruins spawning on the turf
#define NO_LAVA_GEN_1 (1<<6) //Blocks lava rivers being generated on the turf
+#define NO_RUINS_1 (1<<10) //Blocks ruins spawning on the turf
/*
These defines are used specifically with the atom/pass_flags bitmask
@@ -81,4 +76,3 @@ GLOBAL_LIST_INIT(bitflags, list(1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 204
#define EMP_PROTECT_SELF (1<<0)
#define EMP_PROTECT_CONTENTS (1<<1)
#define EMP_PROTECT_WIRES (1<<2)
-
diff --git a/code/__DEFINES/logging.dm b/code/__DEFINES/logging.dm
index 197c315f78..485cfa65c1 100644
--- a/code/__DEFINES/logging.dm
+++ b/code/__DEFINES/logging.dm
@@ -14,6 +14,7 @@
#define INVESTIGATE_HALLUCINATIONS "hallucinations"
#define INVESTIGATE_RADIATION "radiation"
#define INVESTIGATE_EXONET "exonet"
+#define INVESTIGATE_CIRCUIT "circuit"
//Individual logging defines
#define INDIVIDUAL_ATTACK_LOG "Attack log"
diff --git a/code/__DEFINES/maps.dm b/code/__DEFINES/maps.dm
index 98d022d27e..1defe2bc39 100644
--- a/code/__DEFINES/maps.dm
+++ b/code/__DEFINES/maps.dm
@@ -41,6 +41,9 @@ require only minor tweaks.
// number - bombcap is multiplied by this before being applied to bombs
#define ZTRAIT_BOMBCAP_MULTIPLIER "Bombcap Multiplier"
+// number - default gravity if there's no gravity generators or area overrides present
+#define ZTRAIT_GRAVITY "Gravity"
+
// numeric offsets - e.g. {"Down": -1} means that chasms will fall to z - 1 rather than oblivion
#define ZTRAIT_UP "Up"
#define ZTRAIT_DOWN "Down"
diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm
index 43c706e58e..78f86475ac 100644
--- a/code/__DEFINES/misc.dm
+++ b/code/__DEFINES/misc.dm
@@ -430,6 +430,7 @@ GLOBAL_LIST_INIT(pda_styles, list(MONO, VT, ORBITRON, SHARE))
#define ION_FILE "ion_laws.json"
#define PIRATE_NAMES_FILE "pirates.json"
+
//Fullscreen overlay resolution in tiles.
#define FULLSCREEN_OVERLAY_RESOLUTION_X 15
#define FULLSCREEN_OVERLAY_RESOLUTION_Y 15
@@ -448,5 +449,10 @@ GLOBAL_LIST_INIT(pda_styles, list(MONO, VT, ORBITRON, SHARE))
// Used by PDA and cartridge code to reduce repetitiveness of spritesheets
#define PDAIMG(what) {""}
+
//Filters
#define AMBIENT_OCCLUSION filter(type="drop_shadow", x=0, y=-2, size=4, border=4, color="#04080FAA")
+
+
+#define STANDARD_GRAVITY 1 //Anything above this is high gravity, anything below no grav
+#define GRAVITY_DAMAGE_TRESHOLD 3 //Starting with this value gravity will start to damage mobs
\ No newline at end of file
diff --git a/code/__DEFINES/obj_flags.dm b/code/__DEFINES/obj_flags.dm
index f8287cf34e..76f66521a7 100644
--- a/code/__DEFINES/obj_flags.dm
+++ b/code/__DEFINES/obj_flags.dm
@@ -21,6 +21,10 @@
#define NEEDS_PERMIT (1<<3) //Used by security bots to determine if this item is safe for public use.
#define SLOWS_WHILE_IN_HAND (1<<4)
#define NO_MAT_REDEMPTION (1<<5) // Stops you from putting things like an RCD or other items into an ORM or protolathe for materials.
+#define DROPDEL (1<<6) // When dropped, it calls qdel on itself
+#define NOBLUDGEON (1<<7) // when an item has this it produces no "X has been hit by Y with Z" message in the default attackby()
+#define NODROP (1<<8) // This flag makes it so that an item literally cannot be removed at all, or at least that's how it should be. Only deleted.
+#define ABSTRACT (1<<9) // for all things that are technically items but used for various different stuff
// Flags for the clothing_flags var on /obj/item/clothing
diff --git a/code/__DEFINES/preferences.dm b/code/__DEFINES/preferences.dm
index 0dc8a38899..02f151dcd9 100644
--- a/code/__DEFINES/preferences.dm
+++ b/code/__DEFINES/preferences.dm
@@ -68,3 +68,5 @@
//Flags in the players table in the db
#define DB_FLAG_EXEMPT 1
+
+#define DEFAULT_CYBORG_NAME "Default Cyborg Name"
\ No newline at end of file
diff --git a/code/__DEFINES/reagents.dm b/code/__DEFINES/reagents.dm
index 6fca8786f5..f8f59a367f 100644
--- a/code/__DEFINES/reagents.dm
+++ b/code/__DEFINES/reagents.dm
@@ -2,7 +2,6 @@
#define LIQUID 2
#define GAS 3
-
// container_type defines
#define INJECTABLE (1<<0) // Makes it possible to add reagents through droppers and syringes.
#define DRAWABLE (1<<1) // Makes it possible to remove reagents through syringes.
diff --git a/code/__DEFINES/reagents_specific_heat.dm b/code/__DEFINES/reagents_specific_heat.dm
new file mode 100644
index 0000000000..90a379d7de
--- /dev/null
+++ b/code/__DEFINES/reagents_specific_heat.dm
@@ -0,0 +1,3 @@
+#define SPECIFIC_HEAT_DEFAULT 200
+
+#define SPECIFIC_HEAT_PLASMA 500
diff --git a/code/__DEFINES/status_effects.dm b/code/__DEFINES/status_effects.dm
index 6b16e352e5..ffaaa04d0f 100644
--- a/code/__DEFINES/status_effects.dm
+++ b/code/__DEFINES/status_effects.dm
@@ -80,6 +80,8 @@
#define STATUS_EFFECT_SYPHONMARK /datum/status_effect/syphon_mark //tracks kills for the KA death syphon module
+#define STATUS_EFFECT_INLOVE /datum/status_effect/in_love //Displays you as being in love with someone else, and makes hearts appear around them.
+
/////////////
// SLIME //
/////////////
diff --git a/code/__DEFINES/subsystems.dm b/code/__DEFINES/subsystems.dm
index 149be99aea..48b3260dd7 100644
--- a/code/__DEFINES/subsystems.dm
+++ b/code/__DEFINES/subsystems.dm
@@ -124,21 +124,19 @@
#define COMPILE_OVERLAYS(A)\
if (TRUE) {\
- var/list/oo = A.our_overlays;\
+ var/list/ad = A.add_overlays;\
+ var/list/rm = A.remove_overlays;\
var/list/po = A.priority_overlays;\
+ if(LAZYLEN(rm)){\
+ A.overlays -= rm;\
+ rm.Cut();\
+ }\
+ if(LAZYLEN(ad)){\
+ A.overlays |= ad;\
+ ad.Cut();\
+ }\
if(LAZYLEN(po)){\
- if(LAZYLEN(oo)){\
- A.overlays = oo + po;\
- }\
- else{\
- A.overlays = po;\
- }\
- }\
- else if(LAZYLEN(oo)){\
- A.overlays = oo;\
- }\
- else{\
- A.overlays.Cut();\
+ A.overlays |= po;\
}\
A.flags_1 &= ~OVERLAY_QUEUED_1;\
}
diff --git a/code/__DEFINES/wires.dm b/code/__DEFINES/wires.dm
index 35fa37257b..960d0479be 100644
--- a/code/__DEFINES/wires.dm
+++ b/code/__DEFINES/wires.dm
@@ -34,7 +34,7 @@
#define WIRE_POWER1 "Main Power 1"
#define WIRE_POWER2 "Main Power 2"
#define WIRE_PROCEED "Proceed"
-#define WIRE_RX "Recieve"
+#define WIRE_RX "Receive"
#define WIRE_RESET_MODULE "Reset Module"
#define WIRE_SAFETY "Safety"
#define WIRE_SHOCK "High Voltage Ground"
diff --git a/code/__HELPERS/_logging.dm b/code/__HELPERS/_logging.dm
index 48e2baac6e..4289fd5ad0 100644
--- a/code/__HELPERS/_logging.dm
+++ b/code/__HELPERS/_logging.dm
@@ -131,6 +131,10 @@
/proc/log_query_debug(text)
WRITE_LOG(GLOB.query_debug_log, "SQL: [text]")
+/proc/log_job_debug(text)
+ if (CONFIG_GET(flag/log_job_debug))
+ WRITE_LOG(GLOB.world_job_debug_log, "JOB: [text]")
+
/* Log to both DD and the logfile. */
/proc/log_world(text)
WRITE_LOG(GLOB.world_runtime_log, text)
diff --git a/code/__HELPERS/game.dm b/code/__HELPERS/game.dm
index e75e1ed88a..13f415823c 100644
--- a/code/__HELPERS/game.dm
+++ b/code/__HELPERS/game.dm
@@ -433,7 +433,7 @@
if(!gametypeCheck.age_check(M.client))
continue
if(jobbanType)
- if(jobban_isbanned(M, jobbanType) || jobban_isbanned(M, ROLE_SYNDICATE))
+ if(jobban_isbanned(M, jobbanType) || QDELETED(M) || jobban_isbanned(M, ROLE_SYNDICATE) || QDELETED(M))
continue
showCandidatePollWindow(M, poll_time, Question, result, ignore_category, time_passed, flashwindow)
diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm
index 7a8cf5f3a2..1fefb27497 100644
--- a/code/__HELPERS/mobs.dm
+++ b/code/__HELPERS/mobs.dm
@@ -529,6 +529,7 @@ Proc for attack log creation, because really why not
step(X, pick(NORTH, SOUTH, EAST, WEST))
/proc/deadchat_broadcast(message, mob/follow_target=null, turf/turf_target=null, speaker_key=null, message_type=DEADCHAT_REGULAR)
+ message = "[message]"
for(var/mob/M in GLOB.player_list)
var/datum/preferences/prefs
if(M.client && M.client.prefs)
diff --git a/code/__HELPERS/radio.dm b/code/__HELPERS/radio.dm
index 39fe55c67c..84b354b6cd 100644
--- a/code/__HELPERS/radio.dm
+++ b/code/__HELPERS/radio.dm
@@ -1,4 +1,4 @@
-// Ensure the frequency is within bounds of what it should be sending/recieving at
+// Ensure the frequency is within bounds of what it should be sending/receiving at
/proc/sanitize_frequency(frequency, free = FALSE)
. = round(frequency)
if(free)
diff --git a/code/__HELPERS/roundend.dm b/code/__HELPERS/roundend.dm
index a0051c3b1e..e86c57ac24 100644
--- a/code/__HELPERS/roundend.dm
+++ b/code/__HELPERS/roundend.dm
@@ -524,6 +524,8 @@
return
var/datum/DBQuery/query_admin_rank_update = SSdbcore.NewQuery("UPDATE [format_table_name("player")] p INNER JOIN [format_table_name("admin")] a ON p.ckey = a.ckey SET p.lastadminrank = a.rank")
query_admin_rank_update.Execute()
+ qdel(query_admin_rank_update)
+
//json format backup file generation stored per server
var/json_file = file("data/admins_backup.json")
var/list/file_data = list("ranks" = list(), "admins" = list())
diff --git a/code/__HELPERS/time.dm b/code/__HELPERS/time.dm
index a550206ff6..3ffb583332 100644
--- a/code/__HELPERS/time.dm
+++ b/code/__HELPERS/time.dm
@@ -64,7 +64,7 @@ GLOBAL_VAR_INIT(rollovercheck_last_timeofday, 0)
//Takes a value of time in deciseconds.
//Returns a text value of that number in hours, minutes, or seconds.
/proc/DisplayTimeText(time_value, truncate = FALSE)
- var/second = time_value*0.1
+ var/second = (time_value)*0.1
var/second_adjusted = null
var/second_rounded = FALSE
var/minute = null
@@ -144,7 +144,7 @@ GLOBAL_VAR_INIT(rollovercheck_last_timeofday, 0)
else if(day && (!minute || !second))
hour = " and 1 hour"
else
- hour = "[truncate ? "hour" : "1 hour"]"
+ hour = "[truncate ? "hour" : "1 hour"]"
else
hour = null
diff --git a/code/__HELPERS/type2type.dm b/code/__HELPERS/type2type.dm
index 1f788cf445..b474915e10 100644
--- a/code/__HELPERS/type2type.dm
+++ b/code/__HELPERS/type2type.dm
@@ -218,21 +218,6 @@
. = "NONE"
return .
-/proc/ui_style2icon(ui_style)
- switch(ui_style)
- if("Retro")
- return 'icons/mob/screen_retro.dmi'
- if("Plasmafire")
- return 'icons/mob/screen_plasmafire.dmi'
- if("Slimecore")
- return 'icons/mob/screen_slimecore.dmi'
- if("Operative")
- return 'icons/mob/screen_operative.dmi'
- if("Clockwork")
- return 'icons/mob/screen_clockwork.dmi'
- else
- return 'icons/mob/screen_midnight.dmi'
-
//colour formats
/proc/rgb2hsl(red, green, blue)
red /= 255;green /= 255;blue /= 255;
diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm
index d10619f369..273e1cf1b7 100644
--- a/code/__HELPERS/unsorted.dm
+++ b/code/__HELPERS/unsorted.dm
@@ -186,7 +186,7 @@ Turf and target are separate in case you want to teleport some distance from a t
return 1
//Generalised helper proc for letting mobs rename themselves. Used to be clname() and ainame()
-/mob/proc/rename_self(role, client/C)
+/mob/proc/apply_pref_name(role, client/C)
if(!C)
C = client
var/oldname = real_name
@@ -194,8 +194,10 @@ Turf and target are separate in case you want to teleport some distance from a t
var/loop = 1
var/safety = 0
+ var/banned = jobban_isbanned(src, "appearance")
+
while(loop && safety < 5)
- if(C && C.prefs.custom_names[role] && !safety && (!jobban_isbanned(src, "appearance")))
+ if(C && C.prefs.custom_names[role] && !safety && !banned)
newname = C.prefs.custom_names[role]
else
switch(role)
@@ -207,10 +209,8 @@ Turf and target are separate in case you want to teleport some distance from a t
newname = pick(GLOB.mime_names)
if("ai")
newname = pick(GLOB.ai_names)
- if("deity")
- newname = pick(GLOB.clown_names|GLOB.ai_names|GLOB.mime_names) //pick any old name
else
- return
+ return FALSE
for(var/mob/living/M in GLOB.player_list)
if(M == src)
@@ -224,6 +224,8 @@ Turf and target are separate in case you want to teleport some distance from a t
if(newname)
fully_replace_character_name(oldname,newname)
+ return TRUE
+ return FALSE
//Picks a string of symbols to display as the law number for hacked or ion laws
@@ -899,7 +901,7 @@ GLOBAL_LIST_INIT(WALLITEMS_INVERSE, typecacheof(list(
/proc/check_target_facings(mob/living/initator, mob/living/target)
/*This can be used to add additional effects on interactions between mobs depending on how the mobs are facing each other, such as adding a crit damage to blows to the back of a guy's head.
Given how click code currently works (Nov '13), the initiating mob will be facing the target mob most of the time
- That said, this proc should not be used if the change facing proc of the click code is overriden at the same time*/
+ That said, this proc should not be used if the change facing proc of the click code is overridden at the same time*/
if(!ismob(target) || target.lying)
//Make sure we are not doing this for things that can't have a logical direction to the players given that the target would be on their side
return FALSE
diff --git a/code/_globalvars/bitfields.dm b/code/_globalvars/bitfields.dm
index aa872fa75e..2ad35a6b1b 100644
--- a/code/_globalvars/bitfields.dm
+++ b/code/_globalvars/bitfields.dm
@@ -45,6 +45,10 @@ GLOBAL_LIST_INIT(bitfields, list(
"NEEDS_PERMIT" = NEEDS_PERMIT,
"SLOWS_WHILE_IN_HAND" = SLOWS_WHILE_IN_HAND,
"NO_MAT_REDEMPTION" = NO_MAT_REDEMPTION,
+ "DROPDEL" = DROPDEL,
+ "NOBLUDGEON" = NOBLUDGEON,
+ "NODROP" = NODROP,
+ "ABSTRACT" = ABSTRACT,
),
"admin_flags" = list(
"BUILDMODE" = R_BUILDMODE,
@@ -113,12 +117,15 @@ GLOBAL_LIST_INIT(bitfields, list(
"NOJAUNT_1" = NOJAUNT_1,
"UNUSED_RESERVATION_TURF_1" = UNUSED_RESERVATION_TURF_1,
"CAN_BE_DIRTY_1" = CAN_BE_DIRTY_1,
- "HEAR_1 / NO_DEATHRATTLE_1 (turfs)" = HEAR_1,
- "CHECK_RICOCHET_1 / NO_RUINS_1 (turfs)" = CHECK_RICOCHET_1,
- "CONDUCT_1 / NO_LAVA_GEN_1" = CONDUCT_1,
- "ABSTRACT_1" = ABSTRACT_1,
+ "HEAR_1" = HEAR_1,
+ "CHECK_RICOCHET_1" = CHECK_RICOCHET_1,
+ "CONDUCT_1" = CONDUCT_1,
+ "NO_LAVA_GEN_1" = NO_LAVA_GEN_1,
"NODECONSTRUCT_1" = NODECONSTRUCT_1,
"OVERLAY_QUEUED_1" = OVERLAY_QUEUED_1,
+ "ON_BORDER_1" = ON_BORDER_1,
+ "NO_RUINS_1" = NO_RUINS_1,
+ "PREVENT_CLICK_UNDER_1" = PREVENT_CLICK_UNDER_1,
"HOLOGRAM_1" = HOLOGRAM_1,
"TESLA_IGNORE_1" = TESLA_IGNORE_1,
"INITIALIZED_1" = INITIALIZED_1,
diff --git a/code/_globalvars/game_modes.dm b/code/_globalvars/game_modes.dm
index 3822f7077d..f6022cdd59 100644
--- a/code/_globalvars/game_modes.dm
+++ b/code/_globalvars/game_modes.dm
@@ -1,7 +1,7 @@
GLOBAL_VAR_INIT(master_mode, "traitor") //"extended"
GLOBAL_VAR_INIT(secret_force_mode, "secret") // if this is anything but "secret", the secret rotation will forceably choose this mode
-GLOBAL_VAR(common_report) //Contains commmon part of roundend report
-GLOBAL_VAR(survivor_report) //Contains shared surivor report for roundend report (part of personal report)
+GLOBAL_VAR(common_report) //Contains common part of roundend report
+GLOBAL_VAR(survivor_report) //Contains shared survivor report for roundend report (part of personal report)
GLOBAL_VAR_INIT(wavesecret, 0) // meteor mode, delays wave progression, terrible name
diff --git a/code/_globalvars/logging.dm b/code/_globalvars/logging.dm
index e00e4775ac..2951ddf165 100644
--- a/code/_globalvars/logging.dm
+++ b/code/_globalvars/logging.dm
@@ -22,6 +22,8 @@ GLOBAL_VAR(world_manifest_log)
GLOBAL_PROTECT(world_manifest_log)
GLOBAL_VAR(query_debug_log)
GLOBAL_PROTECT(query_debug_log)
+GLOBAL_VAR(world_job_debug_log)
+GLOBAL_PROTECT(world_job_debug_log)
GLOBAL_LIST_EMPTY(bombers)
GLOBAL_PROTECT(bombers)
diff --git a/code/_globalvars/misc.dm b/code/_globalvars/misc.dm
index 2415c1fea3..fa0ecf117d 100644
--- a/code/_globalvars/misc.dm
+++ b/code/_globalvars/misc.dm
@@ -10,7 +10,7 @@ GLOBAL_VAR_INIT(TAB, " ")
GLOBAL_DATUM_INIT(data_core, /datum/datacore, new)
-GLOBAL_VAR_INIT(CELLRATE, 0.002) // multiplier for watts per tick <> cell storage (eg: .002 means if there is a load of 1000 watts, 20 units will be taken from a cell per second)
+GLOBAL_VAR_INIT(CELLRATE, 0.002) // conversion ratio between a watt-tick and kilojoule
GLOBAL_VAR_INIT(CHARGELEVEL, 0.001) // Cap for how fast cells charge, as a percentage-per-tick (.001 means cellcharge is capped to 1% per second)
GLOBAL_LIST_EMPTY(powernets)
diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm
index ae66b9c131..f98de83c23 100644
--- a/code/_onclick/click.dm
+++ b/code/_onclick/click.dm
@@ -40,7 +40,7 @@
*/
/atom/Click(location,control,params)
if(flags_1 & INITIALIZED_1)
- SendSignal(COMSIG_CLICK, location, control, params)
+ SEND_SIGNAL(src, COMSIG_CLICK, location, control, params)
usr.ClickOn(src, params)
/atom/DblClick(location,control,params)
@@ -57,7 +57,7 @@
After that, mostly just check your state, check whether you're holding an item,
check whether you're adjacent to the target, then pass off the click to whoever
- is recieving it.
+ is receiving it.
The most common are:
* mob/UnarmedAttack(atom,adjacent) - used here only when adjacent, with no item in hand; in the case of humans, checks gloves
* atom/attackby(item,user) - used only when adjacent
@@ -129,7 +129,7 @@
//These are always reachable.
//User itself, current loc, and user inventory
- if(DirectAccess(A))
+ if(A in DirectAccess())
if(W)
W.melee_attack_chain(src, A, params)
else
@@ -174,40 +174,52 @@
return TRUE
return FALSE
-/atom/movable/proc/CanReach(atom/target,obj/item/tool,view_only = FALSE)
- if(isturf(target) || isturf(target.loc) || DirectAccess(target)) //Directly accessible atoms
- if(Adjacent(target) || (tool && CheckToolReach(src, target, tool.reach))) //Adjacent or reaching attacks
- return TRUE
- else
- //Things inside storage insde another storage
- //Eg Contents of a box in a backpack
- var/atom/outer_storage = get_atom_on_turf(target)
- if(outer_storage == target) //whatever that is we don't want infinite loop.
- return FALSE
- if(outer_storage && CanReach(outer_storage,tool) && outer_storage.CanReachStorage(target,src,view_only ? STORAGE_VIEW_DEPTH : INVENTORY_DEPTH))
- return TRUE
+/atom/movable/proc/CanReach(atom/ultimate_target, obj/item/tool, view_only = FALSE)
+ // A backwards depth-limited breadth-first-search to see if the target is
+ // logically "in" anything adjacent to us.
+ var/list/direct_access = DirectAccess()
+ var/depth = 1 + (view_only ? STORAGE_VIEW_DEPTH : INVENTORY_DEPTH)
+
+ var/list/closed = list()
+ var/list/checking = list(ultimate_target)
+ while (checking.len && depth > 0)
+ var/list/next = list()
+ --depth
+
+ for(var/atom/target in checking) // will filter out nulls
+ if(closed[target] || isarea(target)) // avoid infinity situations
+ continue
+ closed[target] = TRUE
+ if(isturf(target) || isturf(target.loc) || (target in direct_access)) //Directly accessible atoms
+ if(Adjacent(target) || (tool && CheckToolReach(src, target, tool.reach))) //Adjacent or reaching attacks
+ return TRUE
+
+ if (!target.loc)
+ continue
+ GET_COMPONENT_FROM(storage, /datum/component/storage, target.loc)
+ if (storage)
+ var/datum/component/storage/concrete/master = storage.master()
+ if (master)
+ next += master.parent
+ for(var/S in master.slaves)
+ var/datum/component/storage/slave = S
+ next += slave.parent
+ else
+ next += target.loc
+ else
+ next += target.loc
+
+ checking = next
return FALSE
-//Can [target] in this container be reached by [user], can't be more than [depth] levels deep
-/atom/proc/CanReachStorage(atom/target,user,depth)
- return FALSE
-
-/obj/item/storage/CanReachStorage(atom/target,user,depth)
- while(target && depth > 0)
- target = target.loc
- depth--
- if(target == src)
- return TRUE
- return FALSE
-
-/atom/movable/proc/DirectAccess(atom/target)
- return (target == src || target == loc)
+/atom/movable/proc/DirectAccess()
+ return list(src, loc)
/mob/DirectAccess(atom/target)
- return (..() || (target in contents))
+ return ..() + contents
/mob/living/DirectAccess(atom/target)
- return (..() || (target in GetAllContents()))
+ return ..() + GetAllContents()
/atom/proc/AllowClick()
return FALSE
@@ -309,7 +321,7 @@
A.ShiftClick(src)
return
/atom/proc/ShiftClick(mob/user)
- SendSignal(COMSIG_CLICK_SHIFT, user)
+ SEND_SIGNAL(src, COMSIG_CLICK_SHIFT, user)
if(user.client && user.client.eye == user || user.client.eye == user.loc)
user.examinate(src)
return
@@ -324,7 +336,7 @@
return
/atom/proc/CtrlClick(mob/user)
- SendSignal(COMSIG_CLICK_CTRL, user)
+ SEND_SIGNAL(src, COMSIG_CLICK_CTRL, user)
var/mob/living/ML = user
if(istype(ML))
ML.pulled(src)
@@ -356,7 +368,7 @@
..()
/atom/proc/AltClick(mob/user)
- SendSignal(COMSIG_CLICK_ALT, user)
+ SEND_SIGNAL(src, COMSIG_CLICK_ALT, user)
var/turf/T = get_turf(src)
if(T && user.TurfAdjacent(T))
if(user.listed_turf == T)
@@ -381,7 +393,7 @@
return
/atom/proc/CtrlShiftClick(mob/user)
- SendSignal(COMSIG_CLICK_CTRL_SHIFT)
+ SEND_SIGNAL(src, COMSIG_CLICK_CTRL_SHIFT)
return
/*
diff --git a/code/_onclick/cyborg.dm b/code/_onclick/cyborg.dm
index 36b363db56..006207c3f3 100644
--- a/code/_onclick/cyborg.dm
+++ b/code/_onclick/cyborg.dm
@@ -101,7 +101,7 @@
/mob/living/silicon/robot/AltClickOn(atom/A)
A.BorgAltClick(src)
-/atom/proc/BorgCtrlShiftClick(mob/living/silicon/robot/user) //forward to human click if not overriden
+/atom/proc/BorgCtrlShiftClick(mob/living/silicon/robot/user) //forward to human click if not overridden
CtrlShiftClick(user)
/obj/machinery/door/airlock/BorgCtrlShiftClick(mob/living/silicon/robot/user) // Sets/Unsets Emergency Access Override Forwards to AI code.
@@ -111,7 +111,7 @@
..()
-/atom/proc/BorgShiftClick(mob/living/silicon/robot/user) //forward to human click if not overriden
+/atom/proc/BorgShiftClick(mob/living/silicon/robot/user) //forward to human click if not overridden
ShiftClick(user)
/obj/machinery/door/airlock/BorgShiftClick(mob/living/silicon/robot/user) // Opens and closes doors! Forwards to AI code.
@@ -121,7 +121,7 @@
..()
-/atom/proc/BorgCtrlClick(mob/living/silicon/robot/user) //forward to human click if not overriden
+/atom/proc/BorgCtrlClick(mob/living/silicon/robot/user) //forward to human click if not overridden
CtrlClick(user)
/obj/machinery/door/airlock/BorgCtrlClick(mob/living/silicon/robot/user) // Bolts doors. Forwards to AI code.
diff --git a/code/_onclick/drag_drop.dm b/code/_onclick/drag_drop.dm
index 97924be2d4..2f97401af7 100644
--- a/code/_onclick/drag_drop.dm
+++ b/code/_onclick/drag_drop.dm
@@ -2,13 +2,13 @@
MouseDrop:
Called on the atom you're dragging. In a lot of circumstances we want to use the
- recieving object instead, so that's the default action. This allows you to drag
+ receiving object instead, so that's the default action. This allows you to drag
almost anything into a trash can.
*/
/atom/MouseDrop(atom/over, src_location, over_location, src_control, over_control, params)
if(!usr || !over)
return
- if(SendSignal(COMSIG_MOUSEDROP_ONTO, over, usr) & COMPONENT_NO_MOUSEDROP) //Whatever is recieving will verify themselves for adjacency.
+ if(SEND_SIGNAL(src, COMSIG_MOUSEDROP_ONTO, over, usr) & COMPONENT_NO_MOUSEDROP) //Whatever is receiving will verify themselves for adjacency.
return
if(over == src)
return usr.client.Click(src, src_location, src_control, params)
@@ -18,9 +18,9 @@
over.MouseDrop_T(src,usr)
return
-// recieve a mousedrop
+// receive a mousedrop
/atom/proc/MouseDrop_T(atom/dropping, mob/user)
- SendSignal(COMSIG_MOUSEDROPPED_ONTO, dropping, user)
+ SEND_SIGNAL(src, COMSIG_MOUSEDROPPED_ONTO, dropping, user)
return
@@ -140,4 +140,4 @@
if (middragatom == src_object)
middragtime = 0
middragatom = null
- ..()
+ ..()
\ No newline at end of file
diff --git a/code/_onclick/hud/action_button.dm b/code/_onclick/hud/action_button.dm
index 47cb76a978..4ae61169b7 100644
--- a/code/_onclick/hud/action_button.dm
+++ b/code/_onclick/hud/action_button.dm
@@ -138,7 +138,7 @@
/datum/hud/proc/get_action_buttons_icons()
. = list()
- .["bg_icon"] = ui_style_icon
+ .["bg_icon"] = ui_style
.["bg_state"] = "template"
//TODO : Make these fit theme
diff --git a/code/_onclick/hud/ai.dm b/code/_onclick/hud/ai.dm
index 463051c6b4..2bb514d008 100644
--- a/code/_onclick/hud/ai.dm
+++ b/code/_onclick/hud/ai.dm
@@ -186,9 +186,9 @@
/datum/hud/ai
- ui_style_icon = 'icons/mob/screen_ai.dmi'
+ ui_style = 'icons/mob/screen_ai.dmi'
-/datum/hud/ai/New(mob/owner, ui_style = 'icons/mob/screen_ai.dmi')
+/datum/hud/ai/New(mob/owner)
..()
var/obj/screen/using
diff --git a/code/_onclick/hud/alert.dm b/code/_onclick/hud/alert.dm
index bb61f2218d..3d22cb5522 100644
--- a/code/_onclick/hud/alert.dm
+++ b/code/_onclick/hud/alert.dm
@@ -237,6 +237,16 @@ magboots would let you walk around normally on the floor. Barring those, you can
or shoot a gun to move around via Newton's 3rd Law of Motion."
icon_state = "weightless"
+/obj/screen/alert/highgravity
+ name = "High Gravity"
+ desc = "You're getting crushed by high gravity, picking up items and movement will be slowed."
+ icon_state = "paralysis"
+
+/obj/screen/alert/veryhighgravity
+ name = "Crushing Gravity"
+ desc = "You're getting crushed by high gravity, picking up items and movement will be slowed. You'll also accumulate brute damage!"
+ icon_state = "paralysis"
+
/obj/screen/alert/fire
name = "On Fire"
desc = "You're on fire. Stop, drop and roll to put the fire out or move to a vacuum area."
@@ -588,7 +598,6 @@ so as to remain in compliance with the most up-to-date laws."
// Re-render all alerts - also called in /datum/hud/show_hud() because it's needed there
/datum/hud/proc/reorganize_alerts()
var/list/alerts = mymob.alerts
- var/icon_pref
if(!hud_shown)
for(var/i = 1, i <= alerts.len, i++)
mymob.client.screen -= alerts[alerts[i]]
@@ -596,9 +605,7 @@ so as to remain in compliance with the most up-to-date laws."
for(var/i = 1, i <= alerts.len, i++)
var/obj/screen/alert/alert = alerts[alerts[i]]
if(alert.icon_state == "template")
- if(!icon_pref)
- icon_pref = ui_style2icon(mymob.client.prefs.UI_style)
- alert.icon = icon_pref
+ alert.icon = ui_style
switch(i)
if(1)
. = ui_alert1
diff --git a/code/_onclick/hud/alien.dm b/code/_onclick/hud/alien.dm
index 5a8cff1df0..3b943209d3 100644
--- a/code/_onclick/hud/alien.dm
+++ b/code/_onclick/hud/alien.dm
@@ -24,11 +24,10 @@
desc = "Allows you to sense the general direction of your Queen."
screen_loc = ui_alien_queen_finder
-
/datum/hud/alien
- ui_style_icon = 'icons/mob/screen_alien.dmi'
+ ui_style = 'icons/mob/screen_alien.dmi'
-/datum/hud/alien/New(mob/living/carbon/alien/humanoid/owner, ui_style = 'icons/mob/screen_alien.dmi')
+/datum/hud/alien/New(mob/living/carbon/alien/humanoid/owner)
..()
var/obj/screen/using
@@ -36,7 +35,7 @@
//equippable shit
//hands
- build_hand_slots(ui_style)
+ build_hand_slots()
//begin buttons
diff --git a/code/_onclick/hud/alien_larva.dm b/code/_onclick/hud/alien_larva.dm
index 0f044a2bc7..1ce916f61d 100644
--- a/code/_onclick/hud/alien_larva.dm
+++ b/code/_onclick/hud/alien_larva.dm
@@ -1,3 +1,6 @@
+/datum/hud/larva
+ ui_style = 'icons/mob/screen_alien.dmi'
+
/datum/hud/larva/New(mob/owner)
..()
var/obj/screen/using
diff --git a/code/_onclick/hud/constructs.dm b/code/_onclick/hud/constructs.dm
index 729de9da4a..d4f6b90ca6 100644
--- a/code/_onclick/hud/constructs.dm
+++ b/code/_onclick/hud/constructs.dm
@@ -1,11 +1,10 @@
-
/datum/hud/constructs
- ui_style_icon = 'icons/mob/screen_construct.dmi'
+ ui_style = 'icons/mob/screen_construct.dmi'
/datum/hud/constructs/New(mob/owner)
..()
pull_icon = new /obj/screen/pull()
- pull_icon.icon = 'icons/mob/screen_construct.dmi'
+ pull_icon.icon = ui_style
pull_icon.update_icon(mymob)
pull_icon.screen_loc = ui_construct_pull
static_inventory += pull_icon
diff --git a/code/_onclick/hud/devil.dm b/code/_onclick/hud/devil.dm
index 0cd0b6a6a9..b30eeefc1b 100644
--- a/code/_onclick/hud/devil.dm
+++ b/code/_onclick/hud/devil.dm
@@ -2,7 +2,7 @@
//Soul counter is stored with the humans, it does weird when you place it here apparently...
-/datum/hud/devil/New(mob/owner, ui_style = 'icons/mob/screen_midnight.dmi')
+/datum/hud/devil/New(mob/owner)
..()
var/obj/screen/using
@@ -17,7 +17,7 @@
pull_icon.screen_loc = ui_drone_pull
static_inventory += pull_icon
- build_hand_slots(ui_style)
+ build_hand_slots()
using = new /obj/screen/inventory()
using.name = "hand"
@@ -62,4 +62,4 @@
/mob/living/carbon/true_devil/create_mob_hud()
if(client && !hud_used)
- hud_used = new /datum/hud/devil(src, ui_style2icon(client.prefs.UI_style))
+ hud_used = new /datum/hud/devil(src)
diff --git a/code/_onclick/hud/drones.dm b/code/_onclick/hud/drones.dm
index 8e39d96bf6..bcdfa084d3 100644
--- a/code/_onclick/hud/drones.dm
+++ b/code/_onclick/hud/drones.dm
@@ -1,4 +1,4 @@
-/datum/hud/dextrous/drone/New(mob/owner, ui_style = 'icons/mob/screen_midnight.dmi')
+/datum/hud/dextrous/drone/New(mob/owner)
..()
var/obj/screen/inventory/inv_box
diff --git a/code/_onclick/hud/generic_dextrous.dm b/code/_onclick/hud/generic_dextrous.dm
index 39a79b108b..c42714ba7c 100644
--- a/code/_onclick/hud/generic_dextrous.dm
+++ b/code/_onclick/hud/generic_dextrous.dm
@@ -1,5 +1,5 @@
//Used for normal mobs that have hands.
-/datum/hud/dextrous/New(mob/living/owner, ui_style = 'icons/mob/screen_midnight.dmi')
+/datum/hud/dextrous/New(mob/living/owner)
..()
var/obj/screen/using
@@ -14,7 +14,7 @@
pull_icon.screen_loc = ui_drone_pull
static_inventory += pull_icon
- build_hand_slots(ui_style)
+ build_hand_slots()
using = new /obj/screen/swap_hand()
using.icon = ui_style
@@ -78,6 +78,6 @@
/mob/living/simple_animal/create_mob_hud()
if(client && !hud_used)
if(dextrous)
- hud_used = new dextrous_hud_type(src, ui_style2icon(client.prefs.UI_style))
+ hud_used = new dextrous_hud_type(src)
else
..()
diff --git a/code/_onclick/hud/ghost.dm b/code/_onclick/hud/ghost.dm
index 8cff8fe09e..ea78da5952 100644
--- a/code/_onclick/hud/ghost.dm
+++ b/code/_onclick/hud/ghost.dm
@@ -44,7 +44,7 @@
var/mob/dead/observer/G = usr
G.register_pai()
-/datum/hud/ghost/New(mob/owner, ui_style = 'icons/mob/screen_midnight.dmi')
+/datum/hud/ghost/New(mob/owner)
..()
var/obj/screen/using
@@ -90,4 +90,4 @@
/mob/dead/observer/create_mob_hud()
if(client && !hud_used)
- hud_used = new /datum/hud/ghost(src, ui_style2icon(client.prefs.UI_style))
+ hud_used = new /datum/hud/ghost(src)
diff --git a/code/_onclick/hud/guardian.dm b/code/_onclick/hud/guardian.dm
index 628efbffe5..687d47c017 100644
--- a/code/_onclick/hud/guardian.dm
+++ b/code/_onclick/hud/guardian.dm
@@ -32,9 +32,9 @@
if(dextrous)
..()
else
- hud_used = new /datum/hud/guardian(src, ui_style2icon(client.prefs.UI_style))
+ hud_used = new /datum/hud/guardian(src)
-/datum/hud/dextrous/guardian/New(mob/living/simple_animal/hostile/guardian/owner, ui_style = 'icons/mob/screen_midnight.dmi') //for a dextrous guardian
+/datum/hud/dextrous/guardian/New(mob/living/simple_animal/hostile/guardian/owner) //for a dextrous guardian
..()
var/obj/screen/using
if(istype(owner, /mob/living/simple_animal/hostile/guardian/dextrous))
diff --git a/code/_onclick/hud/hud.dm b/code/_onclick/hud/hud.dm
index 5678b14484..b5b42e06e1 100644
--- a/code/_onclick/hud/hud.dm
+++ b/code/_onclick/hud/hud.dm
@@ -4,6 +4,19 @@
including inventories and item quick actions.
*/
+// The default UI style is the first one in the list
+GLOBAL_LIST_INIT(available_ui_styles, list(
+ "Midnight" = 'icons/mob/screen_midnight.dmi',
+ "Retro" = 'icons/mob/screen_retro.dmi',
+ "Plasmafire" = 'icons/mob/screen_plasmafire.dmi',
+ "Slimecore" = 'icons/mob/screen_slimecore.dmi',
+ "Operative" = 'icons/mob/screen_operative.dmi',
+ "Clockwork" = 'icons/mob/screen_clockwork.dmi'
+))
+
+/proc/ui_style2icon(ui_style)
+ return GLOB.available_ui_styles[ui_style] || GLOB.available_ui_styles[GLOB.available_ui_styles[1]]
+
/datum/hud
var/mob/mymob
@@ -45,12 +58,15 @@
var/obj/screen/internals
var/obj/screen/mood
- var/ui_style_icon = 'icons/mob/screen_midnight.dmi'
+ // subtypes can override this to force a specific UI style
+ var/ui_style
-/datum/hud/New(mob/owner , ui_style = 'icons/mob/screen_midnight.dmi')
+/datum/hud/New(mob/owner)
mymob = owner
- ui_style_icon = ui_style
+ if (!ui_style)
+ // will fall back to the default if any of these are null
+ ui_style = ui_style2icon(owner.client && owner.client.prefs && owner.client.prefs.UI_style)
hide_actions_toggle = new
hide_actions_toggle.InitialiseIcon(src)
@@ -68,38 +84,19 @@
if(mymob.hud_used == src)
mymob.hud_used = null
- qdel(hide_actions_toggle)
- hide_actions_toggle = null
-
- qdel(module_store_icon)
- module_store_icon = null
-
- if(static_inventory.len)
- for(var/thing in static_inventory)
- qdel(thing)
- static_inventory.Cut()
+ QDEL_NULL(hide_actions_toggle)
+ QDEL_NULL(module_store_icon)
+ QDEL_LIST(static_inventory)
inv_slots.Cut()
action_intent = null
zone_select = null
pull_icon = null
- if(toggleable_inventory.len)
- for(var/thing in toggleable_inventory)
- qdel(thing)
- toggleable_inventory.Cut()
-
- if(hotkeybuttons.len)
- for(var/thing in hotkeybuttons)
- qdel(thing)
- hotkeybuttons.Cut()
-
+ QDEL_LIST(toggleable_inventory)
+ QDEL_LIST(hotkeybuttons)
throw_icon = null
-
- if(infodisplay.len)
- for(var/thing in infodisplay)
- qdel(thing)
- infodisplay.Cut()
+ QDEL_LIST(infodisplay)
healths = null
healthdoll = null
@@ -112,15 +109,8 @@
alien_plasma_display = null
alien_queen_finder = null
- if(plane_masters.len)
- for(var/thing in plane_masters)
- qdel(plane_masters[thing])
- plane_masters.Cut()
-
- if(screenoverlays.len)
- for(var/thing in screenoverlays)
- qdel(thing)
- screenoverlays.Cut()
+ QDEL_LIST_ASSOC_VAL(plane_masters)
+ QDEL_LIST(screenoverlays)
mymob = null
return ..()
@@ -239,6 +229,19 @@
if(!mymob)
return
+/datum/hud/proc/update_ui_style(new_ui_style)
+ // do nothing if overridden by a subtype or already on that style
+ if (initial(ui_style) || ui_style == new_ui_style)
+ return
+
+ for(var/atom/item in static_inventory + toggleable_inventory + hotkeybuttons + infodisplay + screenoverlays + inv_slots)
+ if (item.icon == ui_style)
+ item.icon = new_ui_style
+
+ ui_style = new_ui_style
+ build_hand_slots()
+ hide_actions_toggle.InitialiseIcon(src)
+
//Triggered when F12 is pressed (Unless someone changed something in the DMF)
/mob/verb/button_pressed_F12()
set name = "F12"
@@ -254,7 +257,7 @@
//(re)builds the hand ui slots, throwing away old ones
//not really worth jugglying existing ones so we just scrap+rebuild
//9/10 this is only called once per mob and only for 2 hands
-/datum/hud/proc/build_hand_slots(ui_style = 'icons/mob/screen_midnight.dmi')
+/datum/hud/proc/build_hand_slots()
for(var/h in hand_slots)
var/obj/screen/inventory/hand/H = hand_slots[h]
if(H)
diff --git a/code/_onclick/hud/human.dm b/code/_onclick/hud/human.dm
index 2ac0f14f95..fdb209d0bc 100644
--- a/code/_onclick/hud/human.dm
+++ b/code/_onclick/hud/human.dm
@@ -82,10 +82,10 @@
/mob/living/carbon/human/create_mob_hud()
if(client && !hud_used)
- hud_used = new /datum/hud/human(src, ui_style2icon(client.prefs.UI_style))
+ hud_used = new /datum/hud/human(src)
-/datum/hud/human/New(mob/living/carbon/human/owner, ui_style = 'icons/mob/screen_midnight.dmi')
+/datum/hud/human/New(mob/living/carbon/human/owner)
..()
owner.overlay_fullscreen("see_through_darkness", /obj/screen/fullscreen/see_through_darkness)
@@ -152,7 +152,7 @@
inv_box.screen_loc = ui_oclothing
toggleable_inventory += inv_box
- build_hand_slots(ui_style)
+ build_hand_slots()
using = new /obj/screen/swap_hand()
using.icon = ui_style
diff --git a/code/_onclick/hud/monkey.dm b/code/_onclick/hud/monkey.dm
index c469c1ef20..479fd59dae 100644
--- a/code/_onclick/hud/monkey.dm
+++ b/code/_onclick/hud/monkey.dm
@@ -1,4 +1,4 @@
-/datum/hud/monkey/New(mob/living/carbon/monkey/owner, ui_style = 'icons/mob/screen_midnight.dmi')
+/datum/hud/monkey/New(mob/living/carbon/monkey/owner)
..()
var/obj/screen/using
var/obj/screen/inventory/inv_box
@@ -24,7 +24,7 @@
using.screen_loc = ui_drop_throw
static_inventory += using
- build_hand_slots(ui_style)
+ build_hand_slots()
using = new /obj/screen/swap_hand()
using.icon = ui_style
@@ -152,4 +152,4 @@
/mob/living/carbon/monkey/create_mob_hud()
if(client && !hud_used)
- hud_used = new /datum/hud/monkey(src, ui_style2icon(client.prefs.UI_style))
+ hud_used = new /datum/hud/monkey(src)
diff --git a/code/_onclick/hud/robot.dm b/code/_onclick/hud/robot.dm
index 769cdb2244..7cc51fade1 100644
--- a/code/_onclick/hud/robot.dm
+++ b/code/_onclick/hud/robot.dm
@@ -89,9 +89,9 @@
R.toggle_ionpulse()
/datum/hud/robot
- ui_style_icon = 'icons/mob/screen_cyborg.dmi'
+ ui_style = 'icons/mob/screen_cyborg.dmi'
-/datum/hud/robot/New(mob/owner, ui_style = 'icons/mob/screen_cyborg.dmi')
+/datum/hud/robot/New(mob/owner)
..()
var/mob/living/silicon/robot/mymobR = mymob
var/obj/screen/using
diff --git a/code/_onclick/item_attack.dm b/code/_onclick/item_attack.dm
index b48d86ec0e..df0935d8ab 100644
--- a/code/_onclick/item_attack.dm
+++ b/code/_onclick/item_attack.dm
@@ -17,17 +17,18 @@
// Called when the item is in the active hand, and clicked; alternately, there is an 'activate held object' verb or you can hit pagedown.
/obj/item/proc/attack_self(mob/user)
- SendSignal(COMSIG_ITEM_ATTACK_SELF, user)
+ if(SEND_SIGNAL(src, COMSIG_ITEM_ATTACK_SELF, user) & COMPONENT_NO_INTERACT)
+ return
interact(user)
/obj/item/proc/pre_attack(atom/A, mob/living/user, params) //do stuff before attackby!
- if(SendSignal(COMSIG_ITEM_PRE_ATTACK, A, user, params) & COMPONENT_NO_ATTACK)
+ if(SEND_SIGNAL(src, COMSIG_ITEM_PRE_ATTACK, A, user, params) & COMPONENT_NO_ATTACK)
return FALSE
return TRUE //return FALSE to avoid calling attackby after this proc does stuff
// No comment
/atom/proc/attackby(obj/item/W, mob/user, params)
- if(SendSignal(COMSIG_PARENT_ATTACKBY, W, user, params) & COMPONENT_NO_AFTERATTACK)
+ if(SEND_SIGNAL(src, COMSIG_PARENT_ATTACKBY, W, user, params) & COMPONENT_NO_AFTERATTACK)
return TRUE
return FALSE
@@ -52,8 +53,8 @@
/obj/item/proc/attack(mob/living/M, mob/living/user)
- SendSignal(COMSIG_ITEM_ATTACK, M, user)
- if(flags_1 & NOBLUDGEON_1)
+ SEND_SIGNAL(src, COMSIG_ITEM_ATTACK, M, user)
+ if(item_flags & NOBLUDGEON)
return
if(user.getStaminaLoss() >= STAMINA_SOFTCRIT) // CIT CHANGE - makes it impossible to attack in stamina softcrit
@@ -82,9 +83,9 @@
//the equivalent of the standard version of attack() but for object targets.
/obj/item/proc/attack_obj(obj/O, mob/living/user)
- if(SendSignal(COMSIG_ITEM_ATTACK_OBJ, O, user) & COMPONENT_NO_ATTACK_OBJ)
+ if(SEND_SIGNAL(src, COMSIG_ITEM_ATTACK_OBJ, O, user) & COMPONENT_NO_ATTACK_OBJ)
return
- if(flags_1 & NOBLUDGEON_1)
+ if(item_flags & NOBLUDGEON)
return
if(user.getStaminaLoss() >= STAMINA_SOFTCRIT) // CIT CHANGE - makes it impossible to attack in stamina softcrit
to_chat(user, "You're too exhausted.") // CIT CHANGE - ditto
diff --git a/code/_onclick/observer.dm b/code/_onclick/observer.dm
index e7ec2255ae..63e1a14aa6 100644
--- a/code/_onclick/observer.dm
+++ b/code/_onclick/observer.dm
@@ -48,7 +48,7 @@
// Oh by the way this didn't work with old click code which is why clicking shit didn't spam you
/atom/proc/attack_ghost(mob/dead/observer/user)
- if(SendSignal(COMSIG_ATOM_ATTACK_GHOST, user) & COMPONENT_NO_ATTACK_HAND)
+ if(SEND_SIGNAL(src, COMSIG_ATOM_ATTACK_GHOST, user) & COMPONENT_NO_ATTACK_HAND)
return TRUE
if(user.client)
if(IsAdminGhost(user))
diff --git a/code/_onclick/other_mobs.dm b/code/_onclick/other_mobs.dm
index 2c1c60c6e4..26823133f3 100644
--- a/code/_onclick/other_mobs.dm
+++ b/code/_onclick/other_mobs.dm
@@ -25,7 +25,7 @@
if(override)
return
- SendSignal(COMSIG_HUMAN_MELEE_UNARMED_ATTACK, A)
+ SEND_SIGNAL(src, COMSIG_HUMAN_MELEE_UNARMED_ATTACK, A)
A.attack_hand(src)
//Return TRUE to cancel other attack hand effects that respect it.
@@ -33,7 +33,7 @@
. = FALSE
if(!(interaction_flags_atom & INTERACT_ATOM_NO_FINGERPRINT_ATTACK_HAND))
add_fingerprint(user)
- if(SendSignal(COMSIG_ATOM_ATTACK_HAND, user) & COMPONENT_NO_ATTACK_HAND)
+ if(SEND_SIGNAL(src, COMSIG_ATOM_ATTACK_HAND, user) & COMPONENT_NO_ATTACK_HAND)
. = TRUE
if(interaction_flags_atom & INTERACT_ATOM_ATTACK_HAND)
. = _try_interact(user)
@@ -111,7 +111,7 @@
A.attack_paw(src)
/atom/proc/attack_paw(mob/user)
- if(SendSignal(COMSIG_ATOM_ATTACK_PAW, user) & COMPONENT_NO_ATTACK_HAND)
+ if(SEND_SIGNAL(src, COMSIG_ATOM_ATTACK_PAW, user) & COMPONENT_NO_ATTACK_HAND)
return TRUE
return FALSE
diff --git a/code/_onclick/telekinesis.dm b/code/_onclick/telekinesis.dm
index 18f1c61d94..85e7958b53 100644
--- a/code/_onclick/telekinesis.dm
+++ b/code/_onclick/telekinesis.dm
@@ -70,7 +70,7 @@
desc = "Magic"
icon = 'icons/obj/magic.dmi'//Needs sprites
icon_state = "2"
- flags_1 = NOBLUDGEON_1 | ABSTRACT_1 | DROPDEL_1
+ item_flags = NOBLUDGEON | ABSTRACT | DROPDEL
//item_state = null
w_class = WEIGHT_CLASS_GIGANTIC
layer = ABOVE_HUD_LAYER
diff --git a/code/controllers/configuration/config_entry.dm b/code/controllers/configuration/config_entry.dm
index 24bf518a03..c683f55c59 100644
--- a/code/controllers/configuration/config_entry.dm
+++ b/code/controllers/configuration/config_entry.dm
@@ -10,6 +10,8 @@
var/resident_file //the file which this was loaded from, if any
var/modified = FALSE //set to TRUE if the default has been overridden by a config entry
+ var/deprecated_by //the /datum/config_entry type that supercedes this one
+
var/protection = NONE
var/abstract_type = /datum/config_entry //do not instantiate if type matches this
@@ -85,6 +87,9 @@
/datum/config_entry/proc/ValidateListEntry(key_name, key_value)
return TRUE
+/datum/config_entry/proc/DeprecationUpdate(value)
+ return
+
/datum/config_entry/string
config_entry_value = ""
abstract_type = /datum/config_entry/string
diff --git a/code/controllers/configuration/configuration.dm b/code/controllers/configuration/configuration.dm
index 25b3a46fa0..5c22fc320f 100644
--- a/code/controllers/configuration/configuration.dm
+++ b/code/controllers/configuration/configuration.dm
@@ -3,6 +3,7 @@
var/directory = "config"
+ var/warned_deprecated_configs = FALSE
var/hiding_entries_by_type = TRUE //Set for readability, admins can set this to FALSE if they want to debug it
var/list/entries
var/list/entries_by_type
@@ -123,11 +124,26 @@
if(lockthis)
E.protection |= CONFIG_ENTRY_LOCKED
+ if(E.deprecated_by)
+ var/datum/config_entry/new_ver = entries_by_type[E.deprecated_by]
+ var/new_value = E.DeprecationUpdate(value)
+ var/good_update = istext(new_value)
+ log_config("Entry [entry] is deprecated and will be removed soon. Migrate to [new_ver.name]![good_update ? " Suggested new value is: [new_value]" : ""]")
+ if(!warned_deprecated_configs)
+ addtimer(CALLBACK(GLOBAL_PROC, /proc/message_admins, "This server is using deprecated configuration settings. Please check the logs and update accordingly."), 0)
+ warned_deprecated_configs = TRUE
+ if(good_update)
+ value = new_value
+ E = new_ver
+ else
+ warning("[new_ver.type] is deprecated but gave no proper return for DeprecationUpdate()")
+
var/validated = E.ValidateAndSet(value)
if(!validated)
log_config("Failed to validate setting \"[value]\" for [entry]")
- else if(E.modified && !E.dupes_allowed)
- log_config("Duplicate setting for [entry] ([value], [E.resident_file]) detected! Using latest.")
+ else
+ if(E.modified && !E.dupes_allowed)
+ log_config("Duplicate setting for [entry] ([value], [E.resident_file]) detected! Using latest.")
E.resident_file = filename
diff --git a/code/controllers/configuration/entries/game_options.dm b/code/controllers/configuration/entries/game_options.dm
index 5f2c583d59..88ce13db92 100644
--- a/code/controllers/configuration/entries/game_options.dm
+++ b/code/controllers/configuration/entries/game_options.dm
@@ -134,7 +134,7 @@
/datum/config_entry/flag/no_summon_events //Allowed
-/datum/config_entry/flag/no_intercept_report //Whether or not to send a communications intercept report roundstart. This may be overriden by gamemodes.
+/datum/config_entry/flag/no_intercept_report //Whether or not to send a communications intercept report roundstart. This may be overridden by gamemodes.
/datum/config_entry/number/arrivals_shuttle_dock_window //Time from when a player late joins on the arrivals shuttle to when the shuttle docks on the station
config_entry_value = 55
diff --git a/code/controllers/configuration/entries/general.dm b/code/controllers/configuration/entries/general.dm
index 99644ce88f..1d41e9a765 100644
--- a/code/controllers/configuration/entries/general.dm
+++ b/code/controllers/configuration/entries/general.dm
@@ -55,6 +55,8 @@
/datum/config_entry/flag/log_manifest // log crew manifest to seperate file
+/datum/config_entry/flag/log_job_debug // log roundstart divide occupations debug information to a file
+
/datum/config_entry/flag/allow_admin_ooccolor // Allows admins with relevant permissions to have their own ooc colour
/datum/config_entry/flag/allow_vote_restart // allow votes to restart
diff --git a/code/controllers/subsystem/blackbox.dm b/code/controllers/subsystem/blackbox.dm
index f25244a6b1..bdf0302a3e 100644
--- a/code/controllers/subsystem/blackbox.dm
+++ b/code/controllers/subsystem/blackbox.dm
@@ -24,6 +24,17 @@ SUBSYSTEM_DEF(blackbox)
//poll population
/datum/controller/subsystem/blackbox/fire()
+ set waitfor = FALSE //for population query
+
+ CheckPlayerCount()
+
+ if(CONFIG_GET(flag/use_exp_tracking))
+ if((triggertime < 0) || (world.time > (triggertime +3000))) //subsystem fires once at roundstart then once every 10 minutes. a 5 min check skips the first fire. The <0 is midnight rollover check
+ update_exp(10,FALSE)
+
+/datum/controller/subsystem/blackbox/proc/CheckPlayerCount()
+ set waitfor = FALSE
+
if(!SSdbcore.Connect())
return
var/playercount = 0
@@ -33,11 +44,7 @@ SUBSYSTEM_DEF(blackbox)
var/admincount = GLOB.admins.len
var/datum/DBQuery/query_record_playercount = SSdbcore.NewQuery("INSERT INTO [format_table_name("legacy_population")] (playercount, admincount, time, server_ip, server_port, round_id) VALUES ([playercount], [admincount], '[SQLtime()]', INET_ATON(IF('[world.internet_address]' LIKE '', '0', '[world.internet_address]')), '[world.port]', '[GLOB.round_id]')")
query_record_playercount.Execute()
-
- if(CONFIG_GET(flag/use_exp_tracking))
- if((triggertime < 0) || (world.time > (triggertime +3000))) //subsystem fires once at roundstart then once every 10 minutes. a 5 min check skips the first fire. The <0 is midnight rollover check
- update_exp(10,FALSE)
-
+ qdel(query_record_playercount)
/datum/controller/subsystem/blackbox/Recover()
feedback = SSblackbox.feedback
@@ -144,7 +151,7 @@ feedback data can be recorded in 5 formats:
SSblackbox.record_feedback("text", "example", 1, "other text")
json: {"data":["sample text","other text"]}
"amount"
- used to record simple counts of data i.e. the number of ahelps recieved
+ used to record simple counts of data i.e. the number of ahelps received
further calls to the same key will add or subtract (if increment argument is a negative) from the saved amount
calls: SSblackbox.record_feedback("amount", "example", 8)
SSblackbox.record_feedback("amount", "example", 2)
@@ -255,6 +262,7 @@ Versioning
key_type = new_key_type
/datum/controller/subsystem/blackbox/proc/ReportDeath(mob/living/L)
+ set waitfor = FALSE
if(sealed)
return
if(!L || !L.key || !L.mind)
@@ -267,28 +275,50 @@ Versioning
first_death["area"] = "[AREACOORD(L)]"
first_death["damage"] = "[L.getBruteLoss()]/[L.getFireLoss()]/[L.getToxLoss()]/[L.getOxyLoss()]/[L.getCloneLoss()]"
first_death["last_words"] = L.last_words
+ var/sqlname = L.real_name
+ var/sqlkey = L.ckey
+ var/sqljob = L.mind.assigned_role
+ var/sqlspecial = L.mind.special_role
+ var/sqlpod = get_area_name(L, TRUE)
+ var/laname = L.lastattacker
+ var/lakey = L.lastattackerckey
+ var/sqlbrute = L.getBruteLoss()
+ var/sqlfire = L.getFireLoss()
+ var/sqlbrain = L.getBrainLoss()
+ var/sqloxy = L.getOxyLoss()
+ var/sqltox = L.getToxLoss()
+ var/sqlclone = L.getCloneLoss()
+ var/sqlstamina = L.getStaminaLoss()
+ var/x_coord = L.x
+ var/y_coord = L.y
+ var/z_coord = L.z
+ var/last_words = L.last_words
+ var/suicide = L.suiciding
+ var/map = SSmapping.config.map_name
+
if(!SSdbcore.Connect())
return
- var/area/placeofdeath = get_area(L)
- var/sqlname = sanitizeSQL(L.real_name)
- var/sqlkey = sanitizeSQL(L.ckey)
- var/sqljob = sanitizeSQL(L.mind.assigned_role)
- var/sqlspecial = sanitizeSQL(L.mind.special_role)
- var/sqlpod = sanitizeSQL(placeofdeath.name)
- var/laname = sanitizeSQL(L.lastattacker)
- var/lakey = sanitizeSQL(L.lastattackerckey)
- var/sqlbrute = sanitizeSQL(L.getBruteLoss())
- var/sqlfire = sanitizeSQL(L.getFireLoss())
- var/sqlbrain = sanitizeSQL(L.getBrainLoss())
- var/sqloxy = sanitizeSQL(L.getOxyLoss())
- var/sqltox = sanitizeSQL(L.getToxLoss())
- var/sqlclone = sanitizeSQL(L.getCloneLoss())
- var/sqlstamina = sanitizeSQL(L.getStaminaLoss())
- var/x_coord = sanitizeSQL(L.x)
- var/y_coord = sanitizeSQL(L.y)
- var/z_coord = sanitizeSQL(L.z)
- var/last_words = sanitizeSQL(L.last_words)
- var/suicide = sanitizeSQL(L.suiciding)
- var/map = sanitizeSQL(SSmapping.config.map_name)
+
+ sqlname = sanitizeSQL(sqlname)
+ sqlkey = sanitizeSQL(sqlkey)
+ sqljob = sanitizeSQL(sqljob)
+ sqlspecial = sanitizeSQL(sqlspecial)
+ sqlpod = sanitizeSQL(sqlpod)
+ laname = sanitizeSQL(laname)
+ lakey = sanitizeSQL(lakey)
+ sqlbrute = sanitizeSQL(sqlbrute)
+ sqlfire = sanitizeSQL(sqlfire)
+ sqlbrain = sanitizeSQL(sqlbrain)
+ sqloxy = sanitizeSQL(sqloxy)
+ sqltox = sanitizeSQL(sqltox)
+ sqlclone = sanitizeSQL(sqlclone)
+ sqlstamina = sanitizeSQL(sqlstamina)
+ x_coord = sanitizeSQL(x_coord)
+ y_coord = sanitizeSQL(y_coord)
+ z_coord = sanitizeSQL(z_coord)
+ last_words = sanitizeSQL(last_words)
+ suicide = sanitizeSQL(suicide)
+ map = sanitizeSQL(map)
var/datum/DBQuery/query_report_death = SSdbcore.NewQuery("INSERT INTO [format_table_name("death")] (pod, x_coord, y_coord, z_coord, mapname, server_ip, server_port, round_id, tod, job, special, name, byondkey, laname, lakey, bruteloss, fireloss, brainloss, oxyloss, toxloss, cloneloss, staminaloss, last_words, suicide) VALUES ('[sqlpod]', '[x_coord]', '[y_coord]', '[z_coord]', '[map]', INET_ATON(IF('[world.internet_address]' LIKE '', '0', '[world.internet_address]')), '[world.port]', [GLOB.round_id], '[SQLtime()]', '[sqljob]', '[sqlspecial]', '[sqlname]', '[sqlkey]', '[laname]', '[lakey]', [sqlbrute], [sqlfire], [sqlbrain], [sqloxy], [sqltox], [sqlclone], [sqlstamina], '[last_words]', [suicide])")
- query_report_death.Execute()
\ No newline at end of file
+ query_report_death.Execute()
+ qdel(query_report_death)
diff --git a/code/controllers/subsystem/garbage.dm b/code/controllers/subsystem/garbage.dm
index f276da972c..15a668b038 100644
--- a/code/controllers/subsystem/garbage.dm
+++ b/code/controllers/subsystem/garbage.dm
@@ -293,13 +293,13 @@ SUBSYSTEM_DEF(garbage)
if(isnull(D.gc_destroyed))
- if (D.SendSignal(COMSIG_PARENT_PREQDELETED, force)) // Give the components a chance to prevent their parent from being deleted
+ if (SEND_SIGNAL(D, COMSIG_PARENT_PREQDELETED, force)) // Give the components a chance to prevent their parent from being deleted
return
D.gc_destroyed = GC_CURRENTLY_BEING_QDELETED
var/start_time = world.time
var/start_tick = world.tick_usage
var/hint = D.Destroy(arglist(args.Copy(2))) // Let our friend know they're about to get fucked up.
- D.SendSignal(COMSIG_PARENT_QDELETED, force, hint) // Let the (remaining) components know about the result of Destroy
+ SEND_SIGNAL(D, COMSIG_PARENT_QDELETED, force, hint) // Let the (remaining) components know about the result of Destroy
if(world.time != start_time)
I.slept_destroy++
else
diff --git a/code/controllers/subsystem/job.dm b/code/controllers/subsystem/job.dm
index 7a506acbe5..36fd630789 100644
--- a/code/controllers/subsystem/job.dm
+++ b/code/controllers/subsystem/job.dm
@@ -7,7 +7,6 @@ SUBSYSTEM_DEF(job)
var/list/name_occupations = list() //Dict of all jobs, keys are titles
var/list/type_occupations = list() //Dict of all jobs, keys are types
var/list/unassigned = list() //Players who need jobs
- var/list/job_debug = list() //Debug info
var/initial_players_to_assign = 0 //used for checking against population caps
var/list/prioritized_jobs = list()
@@ -36,6 +35,7 @@ SUBSYSTEM_DEF(job)
old_overflow.spawn_positions = initial(old_overflow.spawn_positions)
old_overflow.total_positions = initial(old_overflow.total_positions)
overflow_role = new_overflow_role
+ JobDebug("Overflow role set to : [new_overflow_role]")
/datum/controller/subsystem/job/proc/SetupOccupations(faction = "Station")
occupations = list()
@@ -62,13 +62,6 @@ SUBSYSTEM_DEF(job)
return 1
-/datum/controller/subsystem/job/proc/Debug(text)
- if(!GLOB.Debug2)
- return 0
- job_debug.Add(text)
- return 1
-
-
/datum/controller/subsystem/job/proc/GetJob(rank)
if(!occupations.len)
SetupOccupations()
@@ -80,12 +73,12 @@ SUBSYSTEM_DEF(job)
return type_occupations[jobtype]
/datum/controller/subsystem/job/proc/AssignRole(mob/dead/new_player/player, rank, latejoin = FALSE)
- Debug("Running AR, Player: [player], Rank: [rank], LJ: [latejoin]")
+ JobDebug("Running AR, Player: [player], Rank: [rank], LJ: [latejoin]")
if(player && player.mind && rank)
var/datum/job/job = GetJob(rank)
if(!job)
return FALSE
- if(jobban_isbanned(player, rank))
+ if(jobban_isbanned(player, rank) || QDELETED(player))
return FALSE
if(!job.player_old_enough(player.client))
return FALSE
@@ -94,41 +87,41 @@ SUBSYSTEM_DEF(job)
var/position_limit = job.total_positions
if(!latejoin)
position_limit = job.spawn_positions
- Debug("Player: [player] is now Rank: [rank], JCP:[job.current_positions], JPL:[position_limit]")
+ JobDebug("Player: [player] is now Rank: [rank], JCP:[job.current_positions], JPL:[position_limit]")
player.mind.assigned_role = rank
unassigned -= player
job.current_positions++
return TRUE
- Debug("AR has failed, Player: [player], Rank: [rank]")
+ JobDebug("AR has failed, Player: [player], Rank: [rank]")
return FALSE
/datum/controller/subsystem/job/proc/FindOccupationCandidates(datum/job/job, level, flag)
- Debug("Running FOC, Job: [job], Level: [level], Flag: [flag]")
+ JobDebug("Running FOC, Job: [job], Level: [level], Flag: [flag]")
var/list/candidates = list()
for(var/mob/dead/new_player/player in unassigned)
- if(jobban_isbanned(player, job.title))
- Debug("FOC isbanned failed, Player: [player]")
+ if(jobban_isbanned(player, job.title) || QDELETED(player))
+ JobDebug("FOC isbanned failed, Player: [player]")
continue
if(!job.player_old_enough(player.client))
- Debug("FOC player not old enough, Player: [player]")
+ JobDebug("FOC player not old enough, Player: [player]")
continue
if(job.required_playtime_remaining(player.client))
- Debug("FOC player not enough xp, Player: [player]")
+ JobDebug("FOC player not enough xp, Player: [player]")
continue
if(flag && (!(flag in player.client.prefs.be_special)))
- Debug("FOC flag failed, Player: [player], Flag: [flag], ")
+ JobDebug("FOC flag failed, Player: [player], Flag: [flag], ")
continue
if(player.mind && job.title in player.mind.restricted_roles)
- Debug("FOC incompatible with antagonist role, Player: [player]")
+ JobDebug("FOC incompatible with antagonist role, Player: [player]")
continue
if(player.client.prefs.GetJobDepartment(job, level) & job.flag)
- Debug("FOC pass, Player: [player], Level:[level]")
+ JobDebug("FOC pass, Player: [player], Level:[level]")
candidates += player
return candidates
/datum/controller/subsystem/job/proc/GiveRandomJob(mob/dead/new_player/player)
- Debug("GRJ Giving random job, Player: [player]")
+ JobDebug("GRJ Giving random job, Player: [player]")
. = FALSE
for(var/datum/job/job in shuffle(occupations))
if(!job)
@@ -140,32 +133,37 @@ SUBSYSTEM_DEF(job)
if(job.title in GLOB.command_positions) //If you want a command position, select it!
continue
- if(jobban_isbanned(player, job.title))
- Debug("GRJ isbanned failed, Player: [player], Job: [job.title]")
+ if(jobban_isbanned(player, job.title) || QDELETED(player))
+ if(QDELETED(player))
+ JobDebug("GRJ isbanned failed, Player deleted")
+ break
+ JobDebug("GRJ isbanned failed, Player: [player], Job: [job.title]")
continue
if(!job.player_old_enough(player.client))
- Debug("GRJ player not old enough, Player: [player]")
+ JobDebug("GRJ player not old enough, Player: [player]")
continue
if(job.required_playtime_remaining(player.client))
- Debug("GRJ player not enough xp, Player: [player]")
+ JobDebug("GRJ player not enough xp, Player: [player]")
continue
if(player.mind && job.title in player.mind.restricted_roles)
- Debug("GRJ incompatible with antagonist role, Player: [player], Job: [job.title]")
+ JobDebug("GRJ incompatible with antagonist role, Player: [player], Job: [job.title]")
continue
if((job.current_positions < job.spawn_positions) || job.spawn_positions == -1)
- Debug("GRJ Random job given, Player: [player], Job: [job]")
+ JobDebug("GRJ Random job given, Player: [player], Job: [job]")
if(AssignRole(player, job.title))
return TRUE
/datum/controller/subsystem/job/proc/ResetOccupations()
+ JobDebug("Occupations reset.")
for(var/mob/dead/new_player/player in GLOB.player_list)
if((player) && (player.mind))
player.mind.assigned_role = null
player.mind.special_role = null
+ SSpersistence.antag_rep_change[player.ckey] = 0
SetupOccupations()
unassigned = list()
return
@@ -231,7 +229,7 @@ SUBSYSTEM_DEF(job)
**/
/datum/controller/subsystem/job/proc/DivideOccupations()
//Setup new player list and get the jobs list
- Debug("Running DO")
+ JobDebug("Running DO")
//Holder for Triumvirate is stored in the SSticker, this just processes it
if(SSticker.triai)
@@ -247,7 +245,7 @@ SUBSYSTEM_DEF(job)
initial_players_to_assign = unassigned.len
- Debug("DO, Len: [unassigned.len]")
+ JobDebug("DO, Len: [unassigned.len]")
if(unassigned.len == 0)
return 0
@@ -268,28 +266,28 @@ SUBSYSTEM_DEF(job)
HandleFeedbackGathering()
//People who wants to be the overflow role, sure, go on.
- Debug("DO, Running Overflow Check 1")
+ JobDebug("DO, Running Overflow Check 1")
var/datum/job/overflow = GetJob(SSjob.overflow_role)
var/list/overflow_candidates = FindOccupationCandidates(overflow, 3)
- Debug("AC1, Candidates: [overflow_candidates.len]")
+ JobDebug("AC1, Candidates: [overflow_candidates.len]")
for(var/mob/dead/new_player/player in overflow_candidates)
- Debug("AC1 pass, Player: [player]")
+ JobDebug("AC1 pass, Player: [player]")
AssignRole(player, SSjob.overflow_role)
overflow_candidates -= player
- Debug("DO, AC1 end")
+ JobDebug("DO, AC1 end")
//Select one head
- Debug("DO, Running Head Check")
+ JobDebug("DO, Running Head Check")
FillHeadPosition()
- Debug("DO, Head Check end")
+ JobDebug("DO, Head Check end")
//Check for an AI
- Debug("DO, Running AI Check")
+ JobDebug("DO, Running AI Check")
FillAIPosition()
- Debug("DO, AI Check end")
+ JobDebug("DO, AI Check end")
//Other jobs are now checked
- Debug("DO, Running Standard Check")
+ JobDebug("DO, Running Standard Check")
// New job giving system by Donkie
@@ -313,66 +311,71 @@ SUBSYSTEM_DEF(job)
continue
if(jobban_isbanned(player, job.title))
- Debug("DO isbanned failed, Player: [player], Job:[job.title]")
+ JobDebug("DO isbanned failed, Player: [player], Job:[job.title]")
continue
+ if(QDELETED(player))
+ JobDebug("DO player deleted during job ban check")
+ break
+
if(!job.player_old_enough(player.client))
- Debug("DO player not old enough, Player: [player], Job:[job.title]")
+ JobDebug("DO player not old enough, Player: [player], Job:[job.title]")
continue
if(job.required_playtime_remaining(player.client))
- Debug("DO player not enough xp, Player: [player], Job:[job.title]")
+ JobDebug("DO player not enough xp, Player: [player], Job:[job.title]")
continue
if(player.mind && job.title in player.mind.restricted_roles)
- Debug("DO incompatible with antagonist role, Player: [player], Job:[job.title]")
+ JobDebug("DO incompatible with antagonist role, Player: [player], Job:[job.title]")
continue
// If the player wants that job on this level, then try give it to him.
if(player.client.prefs.GetJobDepartment(job, level) & job.flag)
-
// If the job isn't filled
if((job.current_positions < job.spawn_positions) || job.spawn_positions == -1)
- Debug("DO pass, Player: [player], Level:[level], Job:[job.title]")
+ JobDebug("DO pass, Player: [player], Level:[level], Job:[job.title]")
AssignRole(player, job.title)
unassigned -= player
break
+ JobDebug("DO, Handling unassigned.")
// Hand out random jobs to the people who didn't get any in the last check
// Also makes sure that they got their preference correct
for(var/mob/dead/new_player/player in unassigned)
- if(PopcapReached())
- RejectPlayer(player)
- else if(jobban_isbanned(player, SSjob.overflow_role))
- GiveRandomJob(player) //you get to roll for random before everyone else just to be sure you don't get overflow. you're so speshul
-
- for(var/mob/dead/new_player/player in unassigned)
- if(PopcapReached())
- RejectPlayer(player)
- else if(player.client.prefs.joblessrole == BERANDOMJOB)
- GiveRandomJob(player)
-
- Debug("DO, Standard Check end")
-
- Debug("DO, Running AC2")
-
- // For those who wanted to be assistant if their preferences were filled, here you go.
- for(var/mob/dead/new_player/player in unassigned)
- if(PopcapReached())
- RejectPlayer(player)
- if(player.client.prefs.joblessrole == BEOVERFLOW)
- Debug("AC2 Assistant located, Player: [player]")
- AssignRole(player, SSjob.overflow_role)
- else // For those who don't want to play if their preference were filled, back you go.
- RejectPlayer(player)
+ HandleUnassigned(player)
+ JobDebug("DO, Handling unrejectable unassigned")
+ //Mop up people who can't leave.
for(var/mob/dead/new_player/player in unassigned) //Players that wanted to back out but couldn't because they're antags (can you feel the edge case?)
if(!GiveRandomJob(player))
AssignRole(player, SSjob.overflow_role) //If everything is already filled, make them an assistant
return 1
+//We couldn't find a job from prefs for this guy.
+/datum/controller/subsystem/job/proc/HandleUnassigned(mob/dead/new_player/player)
+ if(PopcapReached())
+ RejectPlayer(player)
+ else if(player.client.prefs.joblessrole == BEOVERFLOW)
+ var/allowed_to_be_a_loser = !jobban_isbanned(player, SSjob.overflow_role)
+ if(QDELETED(player) || !allowed_to_be_a_loser)
+ RejectPlayer(player)
+ else
+ if(!AssignRole(player, SSjob.overflow_role))
+ RejectPlayer(player)
+ else if(player.client.prefs.joblessrole == BERANDOMJOB)
+ if(!GiveRandomJob(player))
+ RejectPlayer(player)
+ else if(player.client.prefs.joblessrole == RETURNTOLOBBY)
+ RejectPlayer(player)
+ else //Something gone wrong if we got here.
+ var/message = "DO: [player] fell through handling unassigned"
+ JobDebug(message)
+ log_game(message)
+ message_admins(message)
+ RejectPlayer(player)
//Gives the player the stuff he should have with his rank
/datum/controller/subsystem/job/proc/EquipRank(mob/M, rank, joined_late = FALSE)
var/mob/dead/new_player/N
@@ -448,7 +451,7 @@ SUBSYSTEM_DEF(job)
if(ssc > 0)
if(J.spawn_positions > 0)
var/officer_positions = min(12, max(J.spawn_positions, round(unassigned.len / ssc))) //Scale between configured minimum and 12 officers
- Debug("Setting open security officer positions to [officer_positions]")
+ JobDebug("Setting open security officer positions to [officer_positions]")
J.total_positions = officer_positions
J.spawn_positions = officer_positions
@@ -484,7 +487,7 @@ SUBSYSTEM_DEF(job)
for(var/mob/dead/new_player/player in GLOB.player_list)
if(!(player.ready == PLAYER_READY_TO_PLAY && player.mind && !player.mind.assigned_role))
continue //This player is not ready
- if(jobban_isbanned(player, job.title))
+ if(jobban_isbanned(player, job.title) || QDELETED(player))
banned++
continue
if(!job.player_old_enough(player.client))
@@ -520,7 +523,8 @@ SUBSYSTEM_DEF(job)
if(player.mind && player.mind.special_role)
return
if(PopcapReached())
- Debug("Popcap overflow Check observer located, Player: [player]")
+ JobDebug("Popcap overflow Check observer located, Player: [player]")
+ JobDebug("Player rejected :[player]")
to_chat(player, "You have failed to qualify for any job you desired.")
unassigned -= player
player.ready = PLAYER_NOT_READY
@@ -625,3 +629,6 @@ SUBSYSTEM_DEF(job)
for(var/mob/living/carbon/human/player in GLOB.carbon_list)
if(player.mind && (player.mind.assigned_role in GLOB.security_positions))
. |= player.mind
+
+/datum/controller/subsystem/job/proc/JobDebug(message)
+ log_job_debug(message)
\ No newline at end of file
diff --git a/code/controllers/subsystem/mapping.dm b/code/controllers/subsystem/mapping.dm
index e2698670e9..ba46a774fe 100644
--- a/code/controllers/subsystem/mapping.dm
+++ b/code/controllers/subsystem/mapping.dm
@@ -219,6 +219,7 @@ SUBSYSTEM_DEF(mapping)
if(SSdbcore.Connect())
var/datum/DBQuery/query_round_map_name = SSdbcore.NewQuery("UPDATE [format_table_name("round")] SET map_name = '[config.map_name]' WHERE id = [GLOB.round_id]")
query_round_map_name.Execute()
+ qdel(query_round_map_name)
#ifndef LOWMEMORYMODE
// TODO: remove this when the DB is prepared for the z-levels getting reordered
diff --git a/code/controllers/subsystem/overlays.dm b/code/controllers/subsystem/overlays.dm
index 2f3b6c9668..1a7bd43fd2 100644
--- a/code/controllers/subsystem/overlays.dm
+++ b/code/controllers/subsystem/overlays.dm
@@ -115,38 +115,43 @@ SUBSYSTEM_DEF(overlays)
#define NOT_QUEUED_ALREADY (!(flags_1 & OVERLAY_QUEUED_1))
#define QUEUE_FOR_COMPILE flags_1 |= OVERLAY_QUEUED_1; SSoverlays.queue += src;
/atom/proc/cut_overlays(priority = FALSE)
- var/list/cached_overlays = our_overlays
- var/list/cached_priority = priority_overlays
+ LAZYINITLIST(priority_overlays)
+ LAZYINITLIST(remove_overlays)
+ LAZYINITLIST(add_overlays)
+ remove_overlays = overlays.Copy()
+ add_overlays.Cut()
- var/need_compile = FALSE
+ if(priority)
+ priority_overlays.Cut()
- if(LAZYLEN(cached_overlays)) //don't queue empty lists, don't cut priority overlays
- cached_overlays.Cut() //clear regular overlays
- need_compile = TRUE
-
- if(priority && LAZYLEN(cached_priority))
- cached_priority.Cut()
- need_compile = TRUE
-
- if(NOT_QUEUED_ALREADY && need_compile)
+ //If not already queued for work and there are overlays to remove
+ if(NOT_QUEUED_ALREADY && remove_overlays.len)
QUEUE_FOR_COMPILE
/atom/proc/cut_overlay(list/overlays, priority)
if(!overlays)
return
-
overlays = build_appearance_list(overlays)
+ LAZYINITLIST(add_overlays) //always initialized after this point
+ LAZYINITLIST(priority_overlays)
+ LAZYINITLIST(remove_overlays)
+ var/a_len = add_overlays.len
+ var/r_len = remove_overlays.len
+ var/p_len = priority_overlays.len
+ remove_overlays += overlays
+ add_overlays -= overlays
- var/list/cached_overlays = our_overlays //sanic
- var/list/cached_priority = priority_overlays
- var/init_o_len = LAZYLEN(cached_overlays)
- var/init_p_len = LAZYLEN(cached_priority) //starter pokemon
- LAZYREMOVE(cached_overlays, overlays)
if(priority)
+ var/list/cached_priority = priority_overlays
LAZYREMOVE(cached_priority, overlays)
- if(NOT_QUEUED_ALREADY && ((init_o_len != LAZYLEN(cached_overlays)) || (init_p_len != LAZYLEN(cached_priority))))
+ var/fa_len = add_overlays.len
+ var/fr_len = remove_overlays.len
+ var/fp_len = priority_overlays.len
+
+ //If not already queued and there is work to be done
+ if(NOT_QUEUED_ALREADY && (fa_len != a_len || fr_len != r_len || fp_len != p_len))
QUEUE_FOR_COMPILE
/atom/proc/add_overlay(list/overlays, priority = FALSE)
@@ -155,24 +160,21 @@ SUBSYSTEM_DEF(overlays)
overlays = build_appearance_list(overlays)
- LAZYINITLIST(our_overlays) //always initialized after this point
+ LAZYINITLIST(add_overlays) //always initialized after this point
LAZYINITLIST(priority_overlays)
-
- var/list/cached_overlays = our_overlays //sanic
- var/list/cached_priority = priority_overlays
- var/init_o_len = cached_overlays.len
- var/init_p_len = cached_priority.len //starter pokemon
- var/need_compile
+ var/a_len = add_overlays.len
+ var/p_len = priority_overlays.len
if(priority)
- cached_priority += overlays //or in the image. Can we use [image] = image?
- need_compile = init_p_len != cached_priority.len
+ priority_overlays += overlays //or in the image. Can we use [image] = image?
+ var/fp_len = priority_overlays.len
+ if(NOT_QUEUED_ALREADY && fp_len != p_len)
+ QUEUE_FOR_COMPILE
else
- cached_overlays += overlays
- need_compile = init_o_len != cached_overlays.len
-
- if(NOT_QUEUED_ALREADY && need_compile) //have we caught more pokemon?
- QUEUE_FOR_COMPILE
+ add_overlays += overlays
+ var/fa_len = add_overlays.len
+ if(NOT_QUEUED_ALREADY && fa_len != a_len)
+ QUEUE_FOR_COMPILE
/atom/proc/copy_overlays(atom/other, cut_old) //copys our_overlays from another atom
if(!other)
@@ -180,12 +182,11 @@ SUBSYSTEM_DEF(overlays)
cut_overlays()
return
- var/list/cached_other = other.our_overlays
+ var/list/cached_other = other.overlays.Copy()
if(cached_other)
- if(cut_old || !LAZYLEN(our_overlays))
- our_overlays = cached_other.Copy()
- else
- our_overlays |= cached_other
+ if(cut_old || !LAZYLEN(overlays))
+ remove_overlays = overlays
+ add_overlays = cached_other
if(NOT_QUEUED_ALREADY)
QUEUE_FOR_COMPILE
else if(cut_old)
@@ -196,7 +197,7 @@ SUBSYSTEM_DEF(overlays)
//TODO: Better solution for these?
/image/proc/add_overlay(x)
- overlays += x
+ overlays |= x
/image/proc/cut_overlay(x)
overlays -= x
@@ -210,10 +211,10 @@ SUBSYSTEM_DEF(overlays)
cut_overlays()
return
- var/list/cached_other = other.our_overlays
+ var/list/cached_other = other.overlays.Copy()
if(cached_other)
if(cut_old || !overlays.len)
- overlays = cached_other.Copy()
+ overlays = cached_other
else
overlays |= cached_other
else if(cut_old)
diff --git a/code/controllers/subsystem/shuttle.dm b/code/controllers/subsystem/shuttle.dm
index d67ef40597..dcce2c0462 100644
--- a/code/controllers/subsystem/shuttle.dm
+++ b/code/controllers/subsystem/shuttle.dm
@@ -611,4 +611,4 @@ SUBSYSTEM_DEF(shuttle)
var/obj/machinery/computer/camera_advanced/shuttle_docker/C = V
C.update_hidden_docking_ports(remove_images, add_images)
- QDEL_LIST(remove_images)
\ No newline at end of file
+ QDEL_LIST(remove_images)
diff --git a/code/controllers/subsystem/ticker.dm b/code/controllers/subsystem/ticker.dm
index 774453c331..e515d3da34 100755
--- a/code/controllers/subsystem/ticker.dm
+++ b/code/controllers/subsystem/ticker.dm
@@ -42,6 +42,7 @@ SUBSYSTEM_DEF(ticker)
var/timeLeft //pregame timer
var/start_at
+
var/gametime_offset = 432000 //Deciseconds to add to world.time for station time.
var/station_time_rate_multiplier = 12 //factor of station time progressal vs real time.
@@ -263,8 +264,8 @@ SUBSYSTEM_DEF(ticker)
if(!GLOB.Debug2)
if(!can_continue)
- qdel(mode)
- mode = null
+ log_game("[mode.name] failed pre_setup, cause: [mode.setup_error]")
+ QDEL_NULL(mode)
to_chat(world, "Error setting up [GLOB.master_mode]. Reverting to pre-game lobby.")
SSjob.ResetOccupations()
return 0
@@ -453,7 +454,7 @@ SUBSYSTEM_DEF(ticker)
queued_players -= next_in_line //Client disconnected, remove he
queue_delay = 0 //No vacancy: restart timer
if(25 to INFINITY) //No response from the next in line when a vacancy exists, remove he
- to_chat(next_in_line, "No response recieved. You have been removed from the line.")
+ to_chat(next_in_line, "No response received. You have been removed from the line.")
queued_players -= next_in_line
queue_delay = 0
diff --git a/code/controllers/subsystem/timer.dm b/code/controllers/subsystem/timer.dm
index 3d553a57b1..5866575809 100644
--- a/code/controllers/subsystem/timer.dm
+++ b/code/controllers/subsystem/timer.dm
@@ -485,6 +485,8 @@ SUBSYSTEM_DEF(timer)
if (hash_timer.flags & TIMER_STOPPABLE)
. = hash_timer.id
return
+ else if(flags & TIMER_OVERRIDE)
+ stack_trace("TIMER_OVERRIDE used without TIMER_UNIQUE")
var/timeToRun = world.time + wait
@@ -510,9 +512,6 @@ SUBSYSTEM_DEF(timer)
return TRUE
return FALSE
-/datum/controller/subsystem/timer/proc/tump_buckets()
- reset_buckets()
- SSticker.tumpedbuckets = TRUE
#undef BUCKET_LEN
#undef BUCKET_POS