From 63013f89641c739d72ccd546e34309f682131ef7 Mon Sep 17 00:00:00 2001 From: deathride58 Date: Mon, 2 Jul 2018 00:10:31 -0400 Subject: [PATCH] everything to controllers --- code/__DEFINES/DNA.dm | 1 + code/__DEFINES/access.dm | 46 +++--- code/__DEFINES/components.dm | 30 +++- code/__DEFINES/flags.dm | 8 +- code/__DEFINES/logging.dm | 1 + code/__DEFINES/maps.dm | 3 + code/__DEFINES/misc.dm | 6 + code/__DEFINES/obj_flags.dm | 4 + code/__DEFINES/preferences.dm | 2 + code/__DEFINES/reagents.dm | 1 - code/__DEFINES/reagents_specific_heat.dm | 3 + code/__DEFINES/status_effects.dm | 2 + code/__DEFINES/subsystems.dm | 24 ++- code/__DEFINES/wires.dm | 2 +- code/__HELPERS/_logging.dm | 4 + code/__HELPERS/game.dm | 2 +- code/__HELPERS/mobs.dm | 1 + code/__HELPERS/radio.dm | 2 +- code/__HELPERS/roundend.dm | 2 + code/__HELPERS/time.dm | 4 +- code/__HELPERS/type2type.dm | 15 -- code/__HELPERS/unsorted.dm | 14 +- code/_globalvars/bitfields.dm | 15 +- code/_globalvars/game_modes.dm | 4 +- code/_globalvars/logging.dm | 2 + code/_globalvars/misc.dm | 2 +- code/_onclick/click.dm | 82 ++++++---- code/_onclick/cyborg.dm | 6 +- code/_onclick/drag_drop.dm | 10 +- code/_onclick/hud/action_button.dm | 2 +- code/_onclick/hud/ai.dm | 4 +- code/_onclick/hud/alert.dm | 15 +- code/_onclick/hud/alien.dm | 7 +- code/_onclick/hud/alien_larva.dm | 3 + code/_onclick/hud/constructs.dm | 5 +- code/_onclick/hud/devil.dm | 6 +- code/_onclick/hud/drones.dm | 2 +- code/_onclick/hud/generic_dextrous.dm | 6 +- code/_onclick/hud/ghost.dm | 4 +- code/_onclick/hud/guardian.dm | 4 +- code/_onclick/hud/hud.dm | 79 +++++----- code/_onclick/hud/human.dm | 6 +- code/_onclick/hud/monkey.dm | 6 +- code/_onclick/hud/robot.dm | 4 +- code/_onclick/item_attack.dm | 15 +- code/_onclick/observer.dm | 2 +- code/_onclick/other_mobs.dm | 6 +- code/_onclick/telekinesis.dm | 2 +- .../controllers/configuration/config_entry.dm | 5 + .../configuration/configuration.dm | 20 ++- .../configuration/entries/game_options.dm | 2 +- .../configuration/entries/general.dm | 2 + code/controllers/subsystem/blackbox.dm | 86 ++++++---- code/controllers/subsystem/garbage.dm | 4 +- code/controllers/subsystem/job.dm | 149 +++++++++--------- code/controllers/subsystem/mapping.dm | 1 + code/controllers/subsystem/overlays.dm | 83 +++++----- code/controllers/subsystem/shuttle.dm | 2 +- code/controllers/subsystem/ticker.dm | 7 +- code/controllers/subsystem/timer.dm | 5 +- 60 files changed, 486 insertions(+), 356 deletions(-) create mode 100644 code/__DEFINES/reagents_specific_heat.dm 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