From ec790efeaaf7986b989fd1c0d9bda801bb4b0030 Mon Sep 17 00:00:00 2001 From: AffectedArc07 Date: Wed, 24 Apr 2019 14:07:34 +0100 Subject: [PATCH 01/55] SSticker --- code/__DEFINES/gamemode.dm | 12 +- code/__DEFINES/misc.dm | 2 +- code/__HELPERS/_logging.dm | 2 +- code/__HELPERS/time.dm | 4 +- code/controllers/Processes/ticker.dm | 36 -- code/controllers/configuration.dm | 2 +- code/controllers/master.dm | 4 +- code/controllers/subsystem/jobs.dm | 4 +- code/controllers/subsystem/nightshift.dm | 2 +- code/controllers/subsystem/shuttles.dm | 6 +- .../subsystem/ticker.dm} | 147 ++++--- code/controllers/subsystem/vote.dm | 14 +- code/controllers/verbs.dm | 2 +- code/datums/cache/air_alarm.dm | 2 +- code/datums/hud.dm | 4 +- code/datums/mind.dm | 410 +++++++++--------- code/datums/periodic_news.dm | 2 +- code/datums/spells/chaplain.dm | 4 +- code/datums/spells/lichdom.dm | 2 +- code/datums/uplink_item.dm | 4 +- code/game/data_huds.dm | 2 +- code/game/gamemodes/blob/powers.dm | 4 +- code/game/gamemodes/cult/cult.dm | 26 +- code/game/gamemodes/cult/cult_objectives.dm | 20 +- code/game/gamemodes/cult/ritual.dm | 32 +- code/game/gamemodes/cult/runes.dm | 34 +- code/game/gamemodes/cult/talisman.dm | 2 +- code/game/gamemodes/devil/devilinfo.dm | 4 +- code/game/gamemodes/devil/objectives.dm | 2 +- code/game/gamemodes/game_mode.dm | 4 +- code/game/gamemodes/heist/heist.dm | 2 +- code/game/gamemodes/intercept_report.dm | 4 +- .../gamemodes/malfunction/Malf_Modules.dm | 2 +- .../miniantags/abduction/abduction.dm | 4 +- .../abduction/machinery/experiment.dm | 4 +- .../gamemodes/miniantags/morph/morph_event.dm | 2 +- .../gamemodes/miniantags/revenant/revenant.dm | 4 +- .../revenant/revenant_spawn_event.dm | 2 +- .../miniantags/slaughter/slaughter.dm | 4 +- code/game/gamemodes/nuclear/nuclear.dm | 12 +- .../gamemodes/nuclear/nuclear_challenge.dm | 4 +- code/game/gamemodes/nuclear/nuclearbomb.dm | 26 +- code/game/gamemodes/nuclear/pinpointer.dm | 4 +- code/game/gamemodes/objective.dm | 26 +- code/game/gamemodes/revolution/revolution.dm | 10 +- code/game/gamemodes/scoreboard.dm | 16 +- code/game/gamemodes/setupgame.dm | 8 +- code/game/gamemodes/shadowling/shadowling.dm | 6 +- .../shadowling/shadowling_abilities.dm | 22 +- .../special_shadowling_abilities.dm | 4 +- code/game/gamemodes/traitor/traitor.dm | 4 +- code/game/gamemodes/vampire/vampire.dm | 6 +- code/game/gamemodes/vampire/vampire_powers.dm | 20 +- code/game/gamemodes/wizard/artefact.dm | 8 +- code/game/gamemodes/wizard/soulstone.dm | 34 +- code/game/gamemodes/wizard/spellbook.dm | 10 +- code/game/gamemodes/wizard/wizard.dm | 6 +- code/game/jobs/job/support_chaplain.dm | 10 +- code/game/jobs/job_objective.dm | 2 +- code/game/machinery/cloning.dm | 32 +- code/game/machinery/computer/ai_core.dm | 4 +- .../game/machinery/computer/communications.dm | 6 +- code/game/machinery/cryopod.dm | 12 +- code/game/machinery/doors/windowdoor.dm | 2 +- code/game/machinery/syndicatebeacon.dm | 4 +- code/game/magic/Uristrunes.dm | 8 +- .../effects/decals/Cleanable/humans.dm | 4 +- .../effects/effect_system/effect_system.dm | 4 +- code/game/objects/items/devices/flash.dm | 6 +- code/game/objects/items/devices/flashlight.dm | 2 +- code/game/objects/items/devices/uplinks.dm | 4 +- code/game/objects/items/robot/robot_parts.dm | 2 +- .../objects/items/weapons/holy_weapons.dm | 20 +- .../weapons/implants/implant_mindshield.dm | 8 +- .../items/weapons/implants/implant_traitor.dm | 24 +- code/game/objects/items/weapons/staff.dm | 2 +- .../objects/items/weapons/storage/bible.dm | 2 +- code/game/objects/structures.dm | 6 +- code/game/sound.dm | 4 +- code/game/turfs/simulated/floor/plating.dm | 4 +- code/game/turfs/simulated/walls_misc.dm | 4 +- code/game/turfs/turf.dm | 6 +- code/game/verbs/suicide.dm | 4 +- code/game/world.dm | 17 +- code/modules/admin/admin.dm | 42 +- code/modules/admin/player_panel.dm | 98 ++--- code/modules/admin/topic.dm | 66 +-- code/modules/admin/verbs/cinematic.dm | 4 +- code/modules/admin/verbs/debug.dm | 14 +- code/modules/admin/verbs/gimmick_team.dm | 4 +- code/modules/admin/verbs/honksquad.dm | 4 +- .../admin/verbs/infiltratorteam_syndicate.dm | 4 +- code/modules/admin/verbs/one_click_antag.dm | 12 +- code/modules/admin/verbs/onlyone.dm | 8 +- code/modules/admin/verbs/onlyoneteam.dm | 2 +- code/modules/admin/verbs/pray.dm | 6 +- code/modules/admin/verbs/randomverbs.dm | 32 +- code/modules/admin/verbs/striketeam.dm | 10 +- .../admin/verbs/striketeam_syndicate.dm | 4 +- code/modules/admin/verbs/tripAI.dm | 10 +- .../antagonists/_common/antag_spawner.dm | 26 +- code/modules/awaymissions/corpse.dm | 2 +- code/modules/clothing/shoes/magboots.dm | 2 +- code/modules/events/abductor.dm | 12 +- code/modules/events/alien_infestation.dm | 4 +- code/modules/karma/karma.dm | 2 +- code/modules/library/computers/checkout.dm | 10 +- .../mining/lavaland/loot/colossus_loot.dm | 2 +- .../mob/living/carbon/alien/alien_defense.dm | 2 +- .../carbon/alien/special/alien_embryo.dm | 4 +- code/modules/mob/living/carbon/human/death.dm | 2 +- code/modules/mob/living/carbon/human/human.dm | 2 +- .../mob/living/carbon/human/human_damage.dm | 2 +- .../mob/living/carbon/human/human_defense.dm | 2 +- .../carbon/human/interactive/interactive.dm | 6 +- .../living/carbon/human/species/_species.dm | 4 +- code/modules/mob/living/carbon/superheroes.dm | 8 +- code/modules/mob/living/death.dm | 4 +- code/modules/mob/living/living.dm | 2 +- code/modules/mob/living/living_defense.dm | 2 +- .../mob/living/silicon/ai/ai_defense.dm | 2 +- .../living/silicon/ai/freelook/cameranet.dm | 2 +- .../modules/mob/living/silicon/ai/latejoin.dm | 4 +- code/modules/mob/living/silicon/login.dm | 20 +- .../modules/mob/living/silicon/pai/recruit.dm | 4 +- .../mob/living/silicon/robot/drone/drone.dm | 2 +- .../silicon/robot/drone/drone_manufacturer.dm | 4 +- .../modules/mob/living/silicon/robot/robot.dm | 6 +- .../mob/living/simple_animal/constructs.dm | 12 +- .../mob/living/simple_animal/friendly/cat.dm | 4 +- .../simple_animal/friendly/cockroach.dm | 2 +- code/modules/mob/logout.dm | 2 +- code/modules/mob/mob.dm | 4 +- code/modules/mob/new_player/new_player.dm | 34 +- code/modules/power/singularity/narsie.dm | 10 +- code/modules/power/smes.dm | 2 +- .../reagents/chemistry/reagents/food.dm | 4 +- .../reagents/chemistry/reagents/water.dm | 4 +- code/modules/response_team/ert.dm | 10 +- .../security_levels/keycard authentication.dm | 2 +- code/modules/station_goals/dna_vault.dm | 6 +- code/modules/station_goals/shield.dm | 2 +- code/modules/station_goals/station_goal.dm | 2 +- code/modules/surgery/other.dm | 2 +- paradise.dme | 3 +- 145 files changed, 896 insertions(+), 925 deletions(-) delete mode 100644 code/controllers/Processes/ticker.dm rename code/{game/gamemodes/gameticker.dm => controllers/subsystem/ticker.dm} (87%) diff --git a/code/__DEFINES/gamemode.dm b/code/__DEFINES/gamemode.dm index a1e469e3c94..a3efbab50d9 100644 --- a/code/__DEFINES/gamemode.dm +++ b/code/__DEFINES/gamemode.dm @@ -8,12 +8,12 @@ #define TARGET_INVALID_EVENT 7 //gamemode istype helpers -#define GAMEMODE_IS_BLOB (ticker && istype(ticker.mode, /datum/game_mode/blob)) -#define GAMEMODE_IS_CULT (ticker && istype(ticker.mode, /datum/game_mode/cult)) -#define GAMEMODE_IS_HEIST (ticker && istype(ticker.mode, /datum/game_mode/heist)) -#define GAMEMODE_IS_NUCLEAR (ticker && istype(ticker.mode, /datum/game_mode/nuclear)) -#define GAMEMODE_IS_REVOLUTION (ticker && istype(ticker.mode, /datum/game_mode/revolution)) -#define GAMEMODE_IS_WIZARD (ticker && istype(ticker.mode, /datum/game_mode/wizard)) +#define GAMEMODE_IS_BLOB (SSticker && istype(SSticker.mode, /datum/game_mode/blob)) +#define GAMEMODE_IS_CULT (SSticker && istype(SSticker.mode, /datum/game_mode/cult)) +#define GAMEMODE_IS_HEIST (SSticker && istype(SSticker.mode, /datum/game_mode/heist)) +#define GAMEMODE_IS_NUCLEAR (SSticker && istype(SSticker.mode, /datum/game_mode/nuclear)) +#define GAMEMODE_IS_REVOLUTION (SSticker && istype(SSticker.mode, /datum/game_mode/revolution)) +#define GAMEMODE_IS_WIZARD (SSticker && istype(SSticker.mode, /datum/game_mode/wizard)) //special roles // Distinct from the ROLE_X defines because some antags have multiple special roles but only one ban type diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm index dff9426c641..0bf7e3bcafe 100644 --- a/code/__DEFINES/misc.dm +++ b/code/__DEFINES/misc.dm @@ -303,7 +303,7 @@ #define TRIGGER_GUARD_NORMAL 1 // Macro to get the current elapsed round time, rather than total world runtime -#define ROUND_TIME (round_start_time ? (world.time - round_start_time) : 0) +#define ROUND_TIME (SSticker.round_start_time ? (world.time - SSticker.round_start_time) : 0) // Macro that returns true if it's too early in a round to freely ghost out #define TOO_EARLY_TO_GHOST (config && (ROUND_TIME < (config.round_abandon_penalty_period))) diff --git a/code/__HELPERS/_logging.dm b/code/__HELPERS/_logging.dm index e7f5262db1f..65fc87c3b34 100644 --- a/code/__HELPERS/_logging.dm +++ b/code/__HELPERS/_logging.dm @@ -150,7 +150,7 @@ // A logging proc that only outputs after setup is done, to // help devs test initialization stuff that happens a lot /proc/log_after_setup(var/message) - if(ticker && ticker.current_state > GAME_STATE_SETTING_UP) + if(SSticker && SSticker.current_state > GAME_STATE_SETTING_UP) to_chat(world, "[message]") log_world(message) diff --git a/code/__HELPERS/time.dm b/code/__HELPERS/time.dm index 54fd47a220d..d13bf08c58b 100644 --- a/code/__HELPERS/time.dm +++ b/code/__HELPERS/time.dm @@ -35,7 +35,7 @@ * If you want to display the canonical station "time" (aka the in-character time of the station) use station_time_timestamp */ /proc/classic_worldtime2text(time = world.time) - time = (round_start_time ? (time - round_start_time) : (time - world.time)) + time = (SSticker.round_start_time ? (time - SSticker.round_start_time) : (time - world.time)) return "[round(time / 36000)+12]:[(time / 600 % 60) < 10 ? add_zero(time / 600 % 60, 1) : time / 600 % 60]" //Returns the world time in english @@ -59,7 +59,7 @@ - You can use this, for example, to do "This will expire at [station_time_at(world.time + 500)]" to display a "station time" expiration date which is much more useful for a player)*/ /proc/station_time(time=world.time, display_only=FALSE) - return ((((time - round_start_time)) + GLOB.gametime_offset) % 864000) - (display_only ? GLOB.timezoneOffset : 0) + return ((((time - SSticker.round_start_time)) + GLOB.gametime_offset) % 864000) - (display_only ? GLOB.timezoneOffset : 0) /proc/station_time_timestamp(format = "hh:mm:ss", time=world.time) return time2text(station_time(time, TRUE), format) diff --git a/code/controllers/Processes/ticker.dm b/code/controllers/Processes/ticker.dm deleted file mode 100644 index 578c2725710..00000000000 --- a/code/controllers/Processes/ticker.dm +++ /dev/null @@ -1,36 +0,0 @@ -var/global/datum/controller/process/ticker/tickerProcess - -/datum/controller/process/ticker - var/lastTickerTimeDuration - var/lastTickerTime - -/datum/controller/process/ticker/setup() - name = "ticker" - schedule_interval = 20 // every 2 seconds - - lastTickerTime = world.timeofday - log_startup_progress("Time ticker starting up.") - - if(!ticker) - ticker = new - - spawn(0) - if(ticker) - ticker.pregame() - -DECLARE_GLOBAL_CONTROLLER(ticker, tickerProcess) - -/datum/controller/process/ticker/doWork() - var/currentTime = world.timeofday - - if(currentTime < lastTickerTime) // check for midnight rollover - lastTickerTimeDuration = (currentTime - (lastTickerTime - TICKS_IN_DAY)) / TICKS_IN_SECOND - else - lastTickerTimeDuration = (currentTime - lastTickerTime) / TICKS_IN_SECOND - - lastTickerTime = currentTime - - ticker.process_decrepit() - -/datum/controller/process/ticker/proc/getLastTickerTimeDuration() - return lastTickerTimeDuration diff --git a/code/controllers/configuration.dm b/code/controllers/configuration.dm index 12b5b0fd1a5..bd76d0575cb 100644 --- a/code/controllers/configuration.dm +++ b/code/controllers/configuration.dm @@ -787,7 +787,7 @@ config.sql_enabled = 0 log_config("WARNING: DB_CONFIG DEFINITION MISMATCH!") spawn(60) - if(ticker.current_state == GAME_STATE_PREGAME) + if(SSticker.current_state == GAME_STATE_PREGAME) going = 0 spawn(600) to_chat(world, "DB_CONFIG MISMATCH, ROUND START DELAYED.
Please check database version for recent upstream changes!
") diff --git a/code/controllers/master.dm b/code/controllers/master.dm index a9c7e0dbb7b..fa2465854f3 100644 --- a/code/controllers/master.dm +++ b/code/controllers/master.dm @@ -194,8 +194,8 @@ GLOBAL_REAL(Master, /datum/controller/master) = new to_chat(world, "[msg]") log_world(msg) - if(config.developer_express_start & ticker.current_state == GAME_STATE_PREGAME) - ticker.current_state = GAME_STATE_SETTING_UP + if(config.developer_express_start & SSticker.current_state == GAME_STATE_PREGAME) + SSticker.current_state = GAME_STATE_SETTING_UP if(!current_runlevel) SetRunLevel(1) diff --git a/code/controllers/subsystem/jobs.dm b/code/controllers/subsystem/jobs.dm index 02f2681b22d..48fdf269b89 100644 --- a/code/controllers/subsystem/jobs.dm +++ b/code/controllers/subsystem/jobs.dm @@ -270,9 +270,9 @@ SUBSYSTEM_DEF(jobs) SetupOccupations() //Holder for Triumvirate is stored in the ticker, this just processes it - if(ticker) + if(SSticker) for(var/datum/job/ai/A in occupations) - if(ticker.triai) + if(SSticker.triai) A.spawn_positions = 3 //Get the players who are ready diff --git a/code/controllers/subsystem/nightshift.dm b/code/controllers/subsystem/nightshift.dm index 358076c5652..4ebe1dceb0e 100644 --- a/code/controllers/subsystem/nightshift.dm +++ b/code/controllers/subsystem/nightshift.dm @@ -20,7 +20,7 @@ SUBSYSTEM_DEF(nightshift) return ..() /datum/controller/subsystem/nightshift/fire(resumed = FALSE) - if(world.time - round_start_time < nightshift_first_check) + if(world.time - SSticker.round_start_time < nightshift_first_check) return check_nightshift() diff --git a/code/controllers/subsystem/shuttles.dm b/code/controllers/subsystem/shuttles.dm index 30021df4fb1..a1ca9b5fdad 100644 --- a/code/controllers/subsystem/shuttles.dm +++ b/code/controllers/subsystem/shuttles.dm @@ -106,8 +106,8 @@ SUBSYSTEM_DEF(shuttle) return emergency = backup_shuttle - if(world.time - round_start_time < config.shuttle_refuel_delay) - to_chat(user, "The emergency shuttle is refueling. Please wait another [abs(round(((world.time - round_start_time) - config.shuttle_refuel_delay)/600))] minutes before trying again.") + if(world.time - SSticker.round_start_time < config.shuttle_refuel_delay) + to_chat(user, "The emergency shuttle is refueling. Please wait another [abs(round(((world.time - SSticker.round_start_time) - config.shuttle_refuel_delay)/600))] minutes before trying again.") return switch(emergency.mode) @@ -169,7 +169,7 @@ SUBSYSTEM_DEF(shuttle) return if(!emergency.canRecall) return - if(ticker.mode.name == "meteor") + if(SSticker.mode.name == "meteor") return if(seclevel2num(get_security_level()) >= SEC_LEVEL_RED) if(emergency.timeLeft(1) < emergencyCallTime * 0.25) diff --git a/code/game/gamemodes/gameticker.dm b/code/controllers/subsystem/ticker.dm similarity index 87% rename from code/game/gamemodes/gameticker.dm rename to code/controllers/subsystem/ticker.dm index 972075ceece..0e67479b531 100644 --- a/code/game/gamemodes/gameticker.dm +++ b/code/controllers/subsystem/ticker.dm @@ -1,55 +1,64 @@ -var/global/datum/controller/gameticker/ticker -var/round_start_time = 0 +SUBSYSTEM_DEF(ticker) + name = "Ticker" + init_order = INIT_ORDER_TICKER -/datum/controller/gameticker + priority = FIRE_PRIORITY_TICKER + flags = SS_KEEP_TIMING + runlevels = RUNLEVEL_LOBBY | RUNLEVEL_SETUP | RUNLEVEL_GAME + // Time ticker related vars + var/lastTickerTimeDuration + var/lastTickerTime + // Game ticker related vars + var/round_start_time = 0 var/const/restart_timeout = 600 var/current_state = GAME_STATE_PREGAME var/force_ending = 0 - var/hide_mode = 0 // leave here at 0 ! setup() will take care of it when needed for Secret mode -walter0o var/datum/game_mode/mode = null var/event_time = null var/event = 0 - var/login_music // music played in pregame lobby - var/list/datum/mind/minds = list()//The people in the game. Used for objective tracking. - var/Bible_icon_state // icon_state the chaplain has chosen for his bible var/Bible_item_state // item_state the chaplain has chosen for his bible var/Bible_name // name of the bible var/Bible_deity_name - var/datum/cult_info/cultdat = null //here instead of cult for adminbus purposes - var/random_players = 0 // if set to nonzero, ALL players who latejoin or declare-ready join will have random appearances/genders - var/list/syndicate_coalition = list() // list of traitor-compatible factions var/list/factions = list() // list of all factions var/list/availablefactions = list() // list of factions with openings - var/tipped = FALSE //Did we broadcast the tip of the day yet? var/selected_tip // What will be the tip of the day? - - var/pregame_timeleft = 0 + var/pregame_timeleft = "Initializing" var/delay_end = 0 //if set to nonzero, the round will not restart on it's own - var/triai = 0//Global holder for Triumvirate var/initialtpass = 0 //holder for inital autotransfer vote timer - var/obj/screen/cinematic = null //used for station explosion cinematic - var/round_end_announced = 0 // Spam Prevention. Announce round end only once.\ - -/datum/controller/gameticker/proc/pregame() +/datum/controller/subsystem/ticker/Initialize() + lastTickerTime = world.timeofday login_music = pick(\ 'sound/music/thunderdome.ogg',\ 'sound/music/space.ogg',\ 'sound/music/title1.ogg',\ 'sound/music/title2.ogg',\ 'sound/music/title3.ogg',) - do + ..() + + +/datum/controller/subsystem/ticker/fire() + // This code is EXTREMELY important shit for checking midnight time rollover. Dont fuck with it + var/currentTime = world.timeofday + if(currentTime < lastTickerTime) + lastTickerTimeDuration = (currentTime - (lastTickerTime - TICKS_IN_DAY)) / TICKS_IN_SECOND + else + lastTickerTimeDuration = (currentTime - lastTickerTime) / TICKS_IN_SECOND + lastTickerTime = currentTime + + // Startup loop + if(current_state == GAME_STATE_PREGAME) pregame_timeleft = config.pregame_timestart to_chat(world, "Welcome to the pre-game lobby!") to_chat(world, "Please, setup your character and select ready. Game will start in [pregame_timeleft] seconds") @@ -63,11 +72,43 @@ var/round_start_time = 0 tipped = TRUE if(pregame_timeleft <= 0) - current_state = GAME_STATE_SETTING_UP - Master.SetRunLevel(RUNLEVEL_SETUP) - while(!setup()) + if(setup()) // Try to start the round + current_state = GAME_STATE_SETTING_UP + Master.SetRunLevel(RUNLEVEL_SETUP) + else // It didnt work, lets loop again + break + + // This makes sure the game keeps going + if(current_state != GAME_STATE_PLAYING) + return 0 -/datum/controller/gameticker/proc/votetimer() + mode.process() + mode.process_job_tasks() + var/game_finished = SSshuttle.emergency.mode >= SHUTTLE_ENDGAME || mode.station_was_nuked + if(config.continuous_rounds) + mode.check_finished() // some modes contain var-changing code in here, so call even if we don't uses result + else + game_finished |= mode.check_finished() + + if((!mode.explosion_in_progress && game_finished) || force_ending) + current_state = GAME_STATE_FINISHED + Master.SetRunLevel(RUNLEVEL_POSTGAME) + auto_toggle_ooc(1) // Turn it on + spawn + declare_completion() + + spawn(50) + callHook("roundend") + + if(mode.station_was_nuked) + world.Reboot("Station destroyed by Nuclear Device.", "end_proper", "nuke") + else + world.Reboot("Round ended.", "end_proper", "proper completion") + + return 1 + + +/datum/controller/subsystem/ticker/proc/votetimer() var/timerbuffer = 0 if(initialtpass == 0) timerbuffer = config.vote_autotransfer_initial @@ -78,7 +119,8 @@ var/round_start_time = 0 initialtpass = 1 votetimer() -/datum/controller/gameticker/proc/setup() + +/datum/controller/subsystem/ticker/proc/setup() cultdat = setupcult() //Create and announce mode if(master_mode=="secret") @@ -252,9 +294,7 @@ var/round_start_time = 0 return 1 - //Plus it provides an easy way to make cinematics for other events. Just use this as a template :) -//Plus it provides an easy way to make cinematics for other events. Just use this as a template -/datum/controller/gameticker/proc/station_explosion_cinematic(station_missed = 0, override = null) +/datum/controller/subsystem/ticker/proc/station_explosion_cinematic(station_missed = 0, override = null) if(cinematic) return //already a cinematic in progress! @@ -350,7 +390,7 @@ var/round_start_time = 0 -/datum/controller/gameticker/proc/create_characters() +/datum/controller/subsystem/ticker/proc/create_characters() for(var/mob/new_player/player in GLOB.player_list) if(player.ready && player.mind) if(player.mind.assigned_role == "AI") @@ -364,13 +404,13 @@ var/round_start_time = 0 qdel(player) -/datum/controller/gameticker/proc/collect_minds() +/datum/controller/subsystem/ticker/proc/collect_minds() for(var/mob/living/player in GLOB.player_list) if(player.mind) - ticker.minds += player.mind + SSticker.minds += player.mind -/datum/controller/gameticker/proc/equip_characters() +/datum/controller/subsystem/ticker/proc/equip_characters() var/captainless=1 for(var/mob/living/carbon/human/player in GLOB.player_list) if(player && player.mind && player.mind.assigned_role) @@ -385,7 +425,7 @@ var/round_start_time = 0 if(!istype(M,/mob/new_player)) to_chat(M, "Captainship not forced on anyone.") -/datum/controller/gameticker/proc/send_tip_of_the_round() +/datum/controller/subsystem/ticker/proc/send_tip_of_the_round() var/m if(selected_tip) m = selected_tip @@ -400,45 +440,13 @@ var/round_start_time = 0 if(m) to_chat(world, "Tip of the round: [html_encode(m)]") -/datum/controller/gameticker/proc/process_decrepit() - if(current_state != GAME_STATE_PLAYING) - return 0 - - mode.process() - mode.process_job_tasks() - - //emergency_shuttle.process() DONE THROUGH PROCESS SCHEDULER - - var/game_finished = SSshuttle.emergency.mode >= SHUTTLE_ENDGAME || mode.station_was_nuked - if(config.continuous_rounds) - mode.check_finished() // some modes contain var-changing code in here, so call even if we don't uses result - else - game_finished |= mode.check_finished() - - if((!mode.explosion_in_progress && game_finished) || force_ending) - current_state = GAME_STATE_FINISHED - Master.SetRunLevel(RUNLEVEL_POSTGAME) - auto_toggle_ooc(1) // Turn it on - spawn - declare_completion() - - spawn(50) - callHook("roundend") - - if(mode.station_was_nuked) - world.Reboot("Station destroyed by Nuclear Device.", "end_proper", "nuke") - else - world.Reboot("Round ended.", "end_proper", "proper completion") - - return 1 - -/datum/controller/gameticker/proc/getfactionbyname(var/name) +/datum/controller/subsystem/ticker/proc/getfactionbyname(var/name) for(var/datum/faction/F in factions) if(F.name == name) return F -/datum/controller/gameticker/proc/declare_completion() +/datum/controller/subsystem/ticker/proc/declare_completion() nologevent = 1 //end of round murder and shenanigans are legal; there's no need to jam up attack logs past this point. //Round statistics report var/datum/station_state/end_state = new /datum/station_state() @@ -483,9 +491,9 @@ var/round_start_time = 0 if(dronecount) to_chat(world, "There [dronecount>1 ? "were" : "was"] [dronecount] industrious maintenance [dronecount>1 ? "drones" : "drone"] this round.") - if(ticker.mode.eventmiscs.len) + if(mode.eventmiscs.len) var/emobtext = "" - for(var/datum/mind/eventmind in ticker.mode.eventmiscs) + for(var/datum/mind/eventmind in mode.eventmiscs) emobtext += printeventplayer(eventmind) emobtext += "
" emobtext += printobjectives(eventmind) @@ -516,5 +524,6 @@ var/round_start_time = 0 return 1 -/datum/controller/gameticker/proc/HasRoundStarted() +/datum/controller/subsystem/ticker/proc/HasRoundStarted() return current_state >= GAME_STATE_PLAYING + diff --git a/code/controllers/subsystem/vote.dm b/code/controllers/subsystem/vote.dm index 4b267fe757f..27d499254a1 100644 --- a/code/controllers/subsystem/vote.dm +++ b/code/controllers/subsystem/vote.dm @@ -19,7 +19,7 @@ SUBSYSTEM_DEF(vote) /datum/controller/subsystem/vote/fire() if(mode) // No more change mode votes after the game has started. - if(mode == "gamemode" && ticker.current_state >= GAME_STATE_SETTING_UP) + if(mode == "gamemode" && SSticker.current_state >= GAME_STATE_SETTING_UP) to_chat(world, "Voting aborted due to game start.") reset() return @@ -125,7 +125,7 @@ SUBSYSTEM_DEF(vote) var/text if(winners.len > 0) if(winners.len > 1) - if(mode != "gamemode" || ticker.hide_mode == 0) // Here we are making sure we don't announce potential game modes + if(mode != "gamemode" || SSticker.hide_mode == 0) // Here we are making sure we don't announce potential game modes text = "Vote Tied Between:\n" for(var/option in winners) text += "\t[option]\n" @@ -134,7 +134,7 @@ SUBSYSTEM_DEF(vote) for(var/key in current_votes) if(choices[current_votes[key]] == .) round_voters += key // Keep track of who voted for the winning round. - if(mode == "gamemode" && (. == "extended" || ticker.hide_mode == 0)) // Announce Extended gamemode, but not other gamemodes + if(mode == "gamemode" && (. == "extended" || SSticker.hide_mode == 0)) // Announce Extended gamemode, but not other gamemodes text += "Vote Result: [.] ([choices[.]] vote\s)" else if(mode == "custom") @@ -166,7 +166,7 @@ SUBSYSTEM_DEF(vote) if("gamemode") if(master_mode != .) world.save_mode(.) - if(ticker && ticker.mode) + if(SSticker && SSticker.mode) restart = 1 else master_mode = . @@ -208,17 +208,17 @@ SUBSYSTEM_DEF(vote) if("restart") choices.Add("Restart Round","Continue Playing") if("gamemode") - if(ticker.current_state >= 2) + if(SSticker.current_state >= 2) return 0 choices.Add(config.votable_modes) if("crew_transfer") if(check_rights(R_ADMIN|R_MOD)) - if(ticker.current_state <= 2) + if(SSticker.current_state <= 2) return 0 question = "End the shift?" choices.Add("Initiate Crew Transfer", "Continue The Round") else - if(ticker.current_state <= 2) + if(SSticker.current_state <= 2) return 0 question = "End the shift?" choices.Add("Initiate Crew Transfer", "Continue The Round") diff --git a/code/controllers/verbs.dm b/code/controllers/verbs.dm index eeef65bd2e2..5f009f2d6e4 100644 --- a/code/controllers/verbs.dm +++ b/code/controllers/verbs.dm @@ -36,7 +36,7 @@ debug_variables(Master) feedback_add_details("admin_verb","Dsmc") if("Ticker") - debug_variables(ticker) + debug_variables(SSticker) feedback_add_details("admin_verb","DTicker") if("Air") debug_variables(SSair) diff --git a/code/datums/cache/air_alarm.dm b/code/datums/cache/air_alarm.dm index a4b3ee21c56..a4d012df464 100644 --- a/code/datums/cache/air_alarm.dm +++ b/code/datums/cache/air_alarm.dm @@ -11,7 +11,7 @@ var/global/datum/repository/air_alarm/air_alarm_repository = new() if(!refresh) return cache_entry.data - if(ticker && ticker.current_state < GAME_STATE_PLAYING && istype(passed_alarm)) // Generating the list for the first time as the game hasn't started - no need to run through the machines list everything every time + if(SSticker && SSticker.current_state < GAME_STATE_PLAYING && istype(passed_alarm)) // Generating the list for the first time as the game hasn't started - no need to run through the machines list everything every time alarms = cache_entry.data // Don't deleate the list if(is_station_contact(passed_alarm.z)) // Still need sanity checks alarms[++alarms.len] = passed_alarm.get_nano_data_console() diff --git a/code/datums/hud.dm b/code/datums/hud.dm index 2dd2d72a816..e5948a47e30 100644 --- a/code/datums/hud.dm +++ b/code/datums/hud.dm @@ -93,8 +93,8 @@ var/datum/atom_hud/huds = list( \ // gang_huds += G.ganghud var/serv_huds = list()//mindslaves and/or vampire thralls - if(ticker.mode) - for(var/datum/mindslaves/serv in (ticker.mode.vampires | ticker.mode.traitors)) + if(SSticker.mode) + for(var/datum/mindslaves/serv in (SSticker.mode.vampires | SSticker.mode.traitors)) serv_huds += serv.thrallhud diff --git a/code/datums/mind.dm b/code/datums/mind.dm index 65b3940cde2..c20ded784a1 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -84,7 +84,7 @@ soulOwner = src /datum/mind/Destroy() - ticker.minds -= src + SSticker.minds -= src if(islist(antag_datums)) for(var/i in antag_datums) var/datum/antagonist/antag_datum = i @@ -163,7 +163,7 @@ /datum/mind/proc/_memory_edit_header(gamemode, list/alt) . = gamemode - if(ticker.mode.config_tag == gamemode || (LAZYLEN(alt) && (ticker.mode.config_tag in alt))) + if(SSticker.mode.config_tag == gamemode || (LAZYLEN(alt) && (SSticker.mode.config_tag in alt))) . = uppertext(.) . = "[.]: " @@ -183,7 +183,7 @@ . = _memory_edit_header("revolution") if(ismindshielded(H)) . += "NO|headrev|rev" - else if(src in ticker.mode.head_revolutionaries) + else if(src in SSticker.mode.head_revolutionaries) . += "no|HEADREV|rev" . += "
Flash: give" @@ -200,7 +200,7 @@ . += " Reequip (gives traitor uplink)." if(objectives.len==0) . += "
Objectives are empty! Set to kill all heads." - else if(src in ticker.mode.revolutionaries) + else if(src in SSticker.mode.revolutionaries) . += "no|headrev|REV" else . += "NO|headrev|rev" @@ -211,7 +211,7 @@ . = _memory_edit_header("cult") if(ismindshielded(H)) . += "NO|cultist" - else if(src in ticker.mode.cult) + else if(src in SSticker.mode.cult) . += "no|CULTIST" . += "
Give tome|equip." else @@ -221,7 +221,7 @@ /datum/mind/proc/memory_edit_wizard(mob/living/carbon/human/H) . = _memory_edit_header("wizard") - if(src in ticker.mode.wizards) + if(src in SSticker.mode.wizards) . += "WIZARD|no" . += "
To lair, undress, dress up, let choose name." if(objectives.len==0) @@ -233,7 +233,7 @@ /datum/mind/proc/memory_edit_changeling(mob/living/carbon/human/H) . = _memory_edit_header("changeling", list("traitorchan")) - if(src in ticker.mode.changelings) + if(src in SSticker.mode.changelings) . += "CHANGELING|no" if(objectives.len==0) . += "
Objectives are empty! Randomize!" @@ -246,7 +246,7 @@ /datum/mind/proc/memory_edit_vampire(mob/living/carbon/human/H) . = _memory_edit_header("vampire", list("traitorvamp")) - if(src in ticker.mode.vampires) + if(src in SSticker.mode.vampires) . += "VAMPIRE|no" if(objectives.len==0) . += "
Objectives are empty! Randomize!" @@ -256,14 +256,14 @@ . += _memory_edit_role_enabled(ROLE_VAMPIRE) /** Enthralled ***/ . += "
enthralled: " - if(src in ticker.mode.vampire_enthralled) + if(src in SSticker.mode.vampire_enthralled) . += "THRALL|no" else . += "thrall|NO" /datum/mind/proc/memory_edit_nuclear(mob/living/carbon/human/H) . = _memory_edit_header("nuclear") - if(src in ticker.mode.syndicates) + if(src in SSticker.mode.syndicates) . += "OPERATIVE|no" . += "
To shuttle, undress, dress up." var/code @@ -280,9 +280,9 @@ /datum/mind/proc/memory_edit_shadowling(mob/living/carbon/human/H) . = _memory_edit_header("shadowling") - if(src in ticker.mode.shadows) + if(src in SSticker.mode.shadows) . += "SHADOWLING|thrall|no" - else if(src in ticker.mode.shadowling_thralls) + else if(src in SSticker.mode.shadowling_thralls) . += "Shadowling|THRALL|no" else . += "shadowling|thrall|NO" @@ -291,7 +291,7 @@ /datum/mind/proc/memory_edit_abductor(mob/living/carbon/human/H) . = _memory_edit_header("abductor") - if(src in ticker.mode.abductors) + if(src in SSticker.mode.abductors) . += "ABDUCTOR|no" . += "|undress|equip" else @@ -301,14 +301,14 @@ /datum/mind/proc/memory_edit_devil(mob/living/H) . = _memory_edit_header("devil", list("devilagents")) - if(src in ticker.mode.devils) + if(src in SSticker.mode.devils) if(!devilinfo) . += "No devilinfo found! Yell at a coder!" else if(!devilinfo.ascendable) . += "DEVIL|Ascendable Devil|sintouched|no" else . += "DEVIL|ASCENDABLE DEVIL|sintouched|no" - else if(src in ticker.mode.sintouched) + else if(src in SSticker.mode.sintouched) . += "devil|Ascendable Devil|SINTOUCHED|no" else . += "devil|Ascendable Devil|sintouched|NO" @@ -317,14 +317,14 @@ /datum/mind/proc/memory_edit_eventmisc(mob/living/H) . = _memory_edit_header("event", list()) - if(src in ticker.mode.eventmiscs) + if(src in SSticker.mode.eventmiscs) . += "YES|no" else . += "Event Role|NO" /datum/mind/proc/memory_edit_traitor() . = _memory_edit_header("traitor", list("traitorchan", "traitorvamp")) - if(src in ticker.mode.traitors) + if(src in SSticker.mode.traitors) . += "TRAITOR|no" if(objectives.len==0) . += "
Objectives are empty! Randomize!" @@ -348,9 +348,9 @@ /datum/mind/proc/memory_edit_uplink() . = "" - if(ishuman(current) && ((src in ticker.mode.head_revolutionaries) || \ - (src in ticker.mode.traitors) || \ - (src in ticker.mode.syndicates))) + if(ishuman(current) && ((src in SSticker.mode.head_revolutionaries) || \ + (src in SSticker.mode.traitors) || \ + (src in SSticker.mode.syndicates))) . = "Uplink: give" var/obj/item/uplink/hidden/suplink = find_syndicate_uplink() var/crystals @@ -366,7 +366,7 @@ // ^ whoever left this comment is literally a grammar nazi. stalin better. in russia grammar correct you. /datum/mind/proc/edit_memory() - if(!ticker || !ticker.mode) + if(!SSticker || !SSticker.mode) alert("Not before round-start!", "Alert") return @@ -419,7 +419,7 @@ This prioritizes antags relevant to the current round to make them appear at the top of the panel. Traitorchan and traitorvamp are snowflaked in because they have multiple sections. */ - if(ticker.mode.config_tag == "traitorchan") + if(SSticker.mode.config_tag == "traitorchan") if(sections["traitor"]) out += sections["traitor"] + "
" if(sections["changeling"]) @@ -427,7 +427,7 @@ sections -= "traitor" sections -= "changeling" // Elif technically unnecessary but it makes the following else look better - else if(ticker.mode.config_tag == "traitorvamp") + else if(SSticker.mode.config_tag == "traitorvamp") if(sections["traitor"]) out += sections["traitor"] + "
" if(sections["vampire"]) @@ -435,9 +435,9 @@ sections -= "traitor" sections -= "vampire" else - if(sections[ticker.mode.config_tag]) - out += sections[ticker.mode.config_tag] + "
" - sections -= ticker.mode.config_tag + if(sections[SSticker.mode.config_tag]) + out += sections[SSticker.mode.config_tag] + "
" + sections -= SSticker.mode.config_tag for(var/i in sections) if(sections[i]) @@ -512,7 +512,7 @@ var/objective_type = "[objective_type_capital][objective_type_text]"//Add them together into a text string. var/list/possible_targets = list() - for(var/datum/mind/possible_target in ticker.minds) + for(var/datum/mind/possible_target in SSticker.minds) if((possible_target != src) && istype(possible_target.current, /mob/living/carbon/human)) possible_targets += possible_target.current @@ -612,7 +612,7 @@ if("identity theft") var/list/possible_targets = list() - for(var/datum/mind/possible_target in ticker.minds) + for(var/datum/mind/possible_target in SSticker.minds) if((possible_target != src) && ishuman(possible_target.current)) possible_targets += possible_target possible_targets = sortAtom(possible_targets) @@ -687,19 +687,19 @@ message_admins("[key_name_admin(usr)] has given [key_name_admin(current)] a mindshield implant") to_chat(H, "You somehow have become the recepient of a mindshield transplant, and it just activated!") - if(src in ticker.mode.revolutionaries) + if(src in SSticker.mode.revolutionaries) special_role = null - ticker.mode.revolutionaries -= src + SSticker.mode.revolutionaries -= src to_chat(src, "The nanobots in the mindshield implant remove all thoughts about being a revolutionary. Get back to work!") - if(src in ticker.mode.head_revolutionaries) + if(src in SSticker.mode.head_revolutionaries) special_role = null - ticker.mode.head_revolutionaries -=src + SSticker.mode.head_revolutionaries -=src to_chat(src, "The nanobots in the mindshield implant remove all thoughts about being a revolutionary. Get back to work!") - if(src in ticker.mode.cult) - ticker.mode.cult -= src - ticker.mode.update_cult_icons_removed(src) + if(src in SSticker.mode.cult) + SSticker.mode.cult -= src + SSticker.mode.update_cult_icons_removed(src) special_role = null - var/datum/game_mode/cult/cult = ticker.mode + var/datum/game_mode/cult/cult = SSticker.mode if(istype(cult)) cult.memorize_cult_objectives(src) to_chat(current, "The nanobots in the mindshield implant remove all thoughts about being in a cult. Have a productive day!") @@ -709,46 +709,46 @@ switch(href_list["revolution"]) if("clear") - if(src in ticker.mode.revolutionaries) - ticker.mode.revolutionaries -= src + if(src in SSticker.mode.revolutionaries) + SSticker.mode.revolutionaries -= src to_chat(current, "You have been brainwashed! You are no longer a revolutionary!") - ticker.mode.update_rev_icons_removed(src) + SSticker.mode.update_rev_icons_removed(src) special_role = null - if(src in ticker.mode.head_revolutionaries) - ticker.mode.head_revolutionaries -= src + if(src in SSticker.mode.head_revolutionaries) + SSticker.mode.head_revolutionaries -= src to_chat(current, "You have been brainwashed! You are no longer a head revolutionary!") - ticker.mode.update_rev_icons_removed(src) + SSticker.mode.update_rev_icons_removed(src) special_role = null log_admin("[key_name(usr)] has de-rev'd [key_name(current)]") message_admins("[key_name_admin(usr)] has de-rev'd [key_name_admin(current)]") if("rev") - if(src in ticker.mode.head_revolutionaries) - ticker.mode.head_revolutionaries -= src - ticker.mode.update_rev_icons_removed(src) + if(src in SSticker.mode.head_revolutionaries) + SSticker.mode.head_revolutionaries -= src + SSticker.mode.update_rev_icons_removed(src) to_chat(current, "Revolution has been disappointed of your leadership traits! You are a regular revolutionary now!") - else if(!(src in ticker.mode.revolutionaries)) + else if(!(src in SSticker.mode.revolutionaries)) to_chat(current, " You are now a revolutionary! Help your cause. Do not harm your fellow freedom fighters. You can identify your comrades by the red \"R\" icons, and your leaders by the blue \"R\" icons. Help them kill the heads to win the revolution!") else return - ticker.mode.revolutionaries += src - ticker.mode.update_rev_icons_added(src) + SSticker.mode.revolutionaries += src + SSticker.mode.update_rev_icons_added(src) special_role = SPECIAL_ROLE_REV log_admin("[key_name(usr)] has rev'd [key_name(current)]") message_admins("[key_name_admin(usr)] has rev'd [key_name_admin(current)]") if("headrev") - if(src in ticker.mode.revolutionaries) - ticker.mode.revolutionaries -= src - ticker.mode.update_rev_icons_removed(src) + if(src in SSticker.mode.revolutionaries) + SSticker.mode.revolutionaries -= src + SSticker.mode.update_rev_icons_removed(src) to_chat(current, "You have proven your devotion to revolution! You are a head revolutionary now!") - else if(!(src in ticker.mode.head_revolutionaries)) + else if(!(src in SSticker.mode.head_revolutionaries)) to_chat(current, "You are a member of the revolutionaries' leadership now!") else return - if(ticker.mode.head_revolutionaries.len>0) + if(SSticker.mode.head_revolutionaries.len>0) // copy targets - var/datum/mind/valid_head = locate() in ticker.mode.head_revolutionaries + var/datum/mind/valid_head = locate() in SSticker.mode.head_revolutionaries if(valid_head) for(var/datum/objective/mutiny/O in valid_head.objectives) var/datum/objective/mutiny/rev_obj = new @@ -756,21 +756,21 @@ rev_obj.target = O.target rev_obj.explanation_text = "Assassinate [O.target.name], the [O.target.assigned_role]." objectives += rev_obj - ticker.mode.greet_revolutionary(src,0) - ticker.mode.head_revolutionaries += src - ticker.mode.update_rev_icons_added(src) + SSticker.mode.greet_revolutionary(src,0) + SSticker.mode.head_revolutionaries += src + SSticker.mode.update_rev_icons_added(src) special_role = SPECIAL_ROLE_HEAD_REV log_admin("[key_name(usr)] has head-rev'd [key_name(current)]") message_admins("[key_name_admin(usr)] has head-rev'd [key_name_admin(current)]") if("autoobjectives") - ticker.mode.forge_revolutionary_objectives(src) - ticker.mode.greet_revolutionary(src,0) + SSticker.mode.forge_revolutionary_objectives(src) + SSticker.mode.greet_revolutionary(src,0) log_admin("[key_name(usr)] has automatically forged revolutionary objectives for [key_name(current)]") message_admins("[key_name_admin(usr)] has automatically forged revolutionary objectives for [key_name_admin(current)]") if("flash") - if(!ticker.mode.equip_revolutionary(current)) + if(!SSticker.mode.equip_revolutionary(current)) to_chat(usr, "Spawning flash failed!") log_admin("[key_name(usr)] has given [key_name(current)] a flash") message_admins("[key_name_admin(usr)] has given [key_name_admin(current)] a flash") @@ -800,8 +800,8 @@ qdel(flash) take_uplink() var/fail = 0 - fail |= !ticker.mode.equip_traitor(current, 1) - fail |= !ticker.mode.equip_revolutionary(current) + fail |= !SSticker.mode.equip_traitor(current, 1) + fail |= !SSticker.mode.equip_revolutionary(current) if(fail) to_chat(usr, "Reequipping revolutionary goes wrong!") return @@ -811,17 +811,17 @@ else if(href_list["cult"]) switch(href_list["cult"]) if("clear") - if(src in ticker.mode.cult) - ticker.mode.remove_cultist(src) + if(src in SSticker.mode.cult) + SSticker.mode.remove_cultist(src) special_role = null log_admin("[key_name(usr)] has de-culted [key_name(current)]") message_admins("[key_name_admin(usr)] has de-culted [key_name_admin(current)]") if("cultist") - if(!(src in ticker.mode.cult)) - ticker.mode.add_cultist(src) + if(!(src in SSticker.mode.cult)) + SSticker.mode.add_cultist(src) special_role = SPECIAL_ROLE_CULTIST - to_chat(current, "You catch a glimpse of the Realm of [ticker.cultdat.entity_name], [ticker.cultdat.entity_title3]. You now see how flimsy the world is, you see that it should be open to the knowledge of [ticker.cultdat.entity_name].") - to_chat(current, "Assist your new compatriots in their dark dealings. Their goal is yours, and yours is theirs. You serve [ticker.cultdat.entity_title2] above all else. Bring It back.") + to_chat(current, "You catch a glimpse of the Realm of [SSticker.cultdat.entity_name], [SSticker.cultdat.entity_title3]. You now see how flimsy the world is, you see that it should be open to the knowledge of [SSticker.cultdat.entity_name].") + to_chat(current, "Assist your new compatriots in their dark dealings. Their goal is yours, and yours is theirs. You serve [SSticker.cultdat.entity_title2] above all else. Bring It back.") log_admin("[key_name(usr)] has culted [key_name(current)]") message_admins("[key_name_admin(usr)] has culted [key_name_admin(current)]") if("tome") @@ -846,7 +846,7 @@ message_admins("[key_name_admin(usr)] has spawned a tome for [key_name_admin(current)]") if("equip") - if(!ticker.mode.equip_cultist(current)) + if(!SSticker.mode.equip_cultist(current)) to_chat(usr, "Spawning equipment failed!") log_admin("[key_name(usr)] has equipped [key_name(current)] as a cultist") message_admins("[key_name_admin(usr)] has equipped [key_name_admin(current)] as a cultist") @@ -855,21 +855,21 @@ switch(href_list["wizard"]) if("clear") - if(src in ticker.mode.wizards) - ticker.mode.wizards -= src + if(src in SSticker.mode.wizards) + SSticker.mode.wizards -= src special_role = null current.spellremove(current) current.faction = list("Station") - ticker.mode.update_wiz_icons_removed(src) + SSticker.mode.update_wiz_icons_removed(src) to_chat(current, "You have been brainwashed! You are no longer a wizard!") log_admin("[key_name(usr)] has de-wizarded [key_name(current)]") message_admins("[key_name_admin(usr)] has de-wizarded [key_name_admin(current)]") if("wizard") - if(!(src in ticker.mode.wizards)) - ticker.mode.wizards += src + if(!(src in SSticker.mode.wizards)) + SSticker.mode.wizards += src special_role = SPECIAL_ROLE_WIZARD //ticker.mode.learn_basic_spells(current) - ticker.mode.update_wiz_icons_added(src) + SSticker.mode.update_wiz_icons_added(src) SEND_SOUND(current, 'sound/ambience/antag/ragesmages.ogg') to_chat(current, "You are a Space Wizard!") current.faction = list("wizard") @@ -880,15 +880,15 @@ log_admin("[key_name(usr)] has moved [key_name(current)] to the wizard's lair") message_admins("[key_name_admin(usr)] has moved [key_name_admin(current)] to the wizard's lair") if("dressup") - ticker.mode.equip_wizard(current) + SSticker.mode.equip_wizard(current) log_admin("[key_name(usr)] has equipped [key_name(current)] as a wizard") message_admins("[key_name_admin(usr)] has equipped [key_name_admin(current)] as a wizard") if("name") - ticker.mode.name_wizard(current) + SSticker.mode.name_wizard(current) log_admin("[key_name(usr)] has allowed wizard [key_name(current)] to name themselves") message_admins("[key_name_admin(usr)] has allowed wizard [key_name_admin(current)] to name themselves") if("autoobjectives") - ticker.mode.forge_wizard_objectives(src) + SSticker.mode.forge_wizard_objectives(src) to_chat(usr, "The objectives for wizard [key] have been generated. You can edit them and announce manually.") log_admin("[key_name(usr)] has automatically forged wizard objectives for [key_name(current)]") message_admins("[key_name_admin(usr)] has automatically forged wizard objectives for [key_name_admin(current)]") @@ -897,20 +897,20 @@ else if(href_list["changeling"]) switch(href_list["changeling"]) if("clear") - if(src in ticker.mode.changelings) - ticker.mode.changelings -= src + if(src in SSticker.mode.changelings) + SSticker.mode.changelings -= src special_role = null current.remove_changeling_powers() - ticker.mode.update_change_icons_removed(src) + SSticker.mode.update_change_icons_removed(src) if(changeling) qdel(changeling) to_chat(current, "You grow weak and lose your powers! You are no longer a changeling and are stuck in your current form!") log_admin("[key_name(usr)] has de-changelinged [key_name(current)]") message_admins("[key_name_admin(usr)] has de-changelinged [key_name_admin(current)]") if("changeling") - if(!(src in ticker.mode.changelings)) - ticker.mode.changelings += src - ticker.mode.grant_changeling_powers(current) - ticker.mode.update_change_icons_added(src) + if(!(src in SSticker.mode.changelings)) + SSticker.mode.changelings += src + SSticker.mode.grant_changeling_powers(current) + SSticker.mode.update_change_icons_added(src) special_role = SPECIAL_ROLE_CHANGELING SEND_SOUND(current, 'sound/ambience/antag/ling_aler.ogg') to_chat(current, "Your powers have awoken. A flash of memory returns to us... we are a changeling!") @@ -918,7 +918,7 @@ message_admins("[key_name_admin(usr)] has changelinged [key_name_admin(current)]") if("autoobjectives") - ticker.mode.forge_changeling_objectives(src) + SSticker.mode.forge_changeling_objectives(src) to_chat(usr, "The objectives for changeling [key] have been generated. You can edit them and announce manually.") log_admin("[key_name(usr)] has automatically forged objectives for [key_name(current)]") message_admins("[key_name_admin(usr)] has automatically forged objectives for [key_name_admin(current)]") @@ -937,22 +937,22 @@ else if(href_list["vampire"]) switch(href_list["vampire"]) if("clear") - if(src in ticker.mode.vampires) - ticker.mode.vampires -= src + if(src in SSticker.mode.vampires) + SSticker.mode.vampires -= src special_role = null if(vampire) vampire.remove_vampire_powers() qdel(vampire) vampire = null - ticker.mode.update_vampire_icons_removed(src) + SSticker.mode.update_vampire_icons_removed(src) to_chat(current, "You grow weak and lose your powers! You are no longer a vampire and are stuck in your current form!") log_admin("[key_name(usr)] has de-vampired [key_name(current)]") message_admins("[key_name_admin(usr)] has de-vampired [key_name_admin(current)]") if("vampire") - if(!(src in ticker.mode.vampires)) - ticker.mode.vampires += src - ticker.mode.grant_vampire_powers(current) - ticker.mode.update_vampire_icons_added(src) + if(!(src in SSticker.mode.vampires)) + SSticker.mode.vampires += src + SSticker.mode.grant_vampire_powers(current) + SSticker.mode.update_vampire_icons_added(src) var/datum/mindslaves/slaved = new() slaved.masters += src som = slaved //we MIGT want to mindslave someone @@ -963,7 +963,7 @@ message_admins("[key_name_admin(usr)] has vampired [key_name_admin(current)]") if("autoobjectives") - ticker.mode.forge_vampire_objectives(src) + SSticker.mode.forge_vampire_objectives(src) to_chat(usr, "The objectives for vampire [key] have been generated. You can edit them and announce manually.") log_admin("[key_name(usr)] has automatically forged objectives for [key_name(current)]") message_admins("[key_name_admin(usr)] has automatically forged objectives for [key_name_admin(current)]") @@ -971,8 +971,8 @@ else if(href_list["vampthrall"]) switch(href_list["vampthrall"]) if("clear") - if(src in ticker.mode.vampire_enthralled) - ticker.mode.remove_vampire_mind(src) + if(src in SSticker.mode.vampire_enthralled) + SSticker.mode.remove_vampire_mind(src) log_admin("[key_name(usr)] has de-vampthralled [key_name(current)]") message_admins("[key_name_admin(usr)] has de-vampthralled [key_name_admin(current)]") @@ -981,9 +981,9 @@ switch(href_list["nuclear"]) if("clear") - if(src in ticker.mode.syndicates) - ticker.mode.syndicates -= src - ticker.mode.update_synd_icons_removed(src) + if(src in SSticker.mode.syndicates) + SSticker.mode.syndicates -= src + SSticker.mode.update_synd_icons_removed(src) special_role = null for(var/datum/objective/nuclear/O in objectives) objectives-=O @@ -992,17 +992,17 @@ log_admin("[key_name(usr)] has de-nuke op'd [key_name(current)]") message_admins("[key_name_admin(usr)] has de-nuke op'd [key_name_admin(current)]") if("nuclear") - if(!(src in ticker.mode.syndicates)) - ticker.mode.syndicates += src - ticker.mode.update_synd_icons_added(src) - if(ticker.mode.syndicates.len==1) - ticker.mode.prepare_syndicate_leader(src) + if(!(src in SSticker.mode.syndicates)) + SSticker.mode.syndicates += src + SSticker.mode.update_synd_icons_added(src) + if(SSticker.mode.syndicates.len==1) + SSticker.mode.prepare_syndicate_leader(src) else - current.real_name = "[syndicate_name()] Operative #[ticker.mode.syndicates.len-1]" + current.real_name = "[syndicate_name()] Operative #[SSticker.mode.syndicates.len-1]" special_role = SPECIAL_ROLE_NUKEOPS to_chat(current, "You are a [syndicate_name()] agent!") - ticker.mode.forge_syndicate_objectives(src) - ticker.mode.greet_syndicate(src) + SSticker.mode.forge_syndicate_objectives(src) + SSticker.mode.greet_syndicate(src) log_admin("[key_name(usr)] has nuke op'd [key_name(current)]") message_admins("[key_name_admin(usr)] has nuke op'd [key_name_admin(current)]") if("lair") @@ -1022,10 +1022,10 @@ qdel(H.wear_suit) qdel(H.w_uniform) - if(!ticker.mode.equip_syndicate(current)) + if(!SSticker.mode.equip_syndicate(current)) to_chat(usr, "Equipping a syndicate failed!") return - ticker.mode.update_syndicate_id(current.mind, ticker.mode.syndicates.len == 1) + SSticker.mode.update_syndicate_id(current.mind, SSticker.mode.syndicates.len == 1) log_admin("[key_name(usr)] has equipped [key_name(current)] as a nuclear operative") message_admins("[key_name_admin(usr)] has equipped [key_name_admin(current)] as a nuclear operative") @@ -1046,27 +1046,27 @@ else if(href_list["eventmisc"]) switch(href_list["eventmisc"]) if("clear") - if(src in ticker.mode.eventmiscs) - ticker.mode.eventmiscs -= src - ticker.mode.update_eventmisc_icons_removed(src) + if(src in SSticker.mode.eventmiscs) + SSticker.mode.eventmiscs -= src + SSticker.mode.update_eventmisc_icons_removed(src) special_role = null message_admins("[key_name_admin(usr)] has de-eventantag'ed [current].") log_admin("[key_name(usr)] has de-eventantag'ed [current].") if("eventmisc") - ticker.mode.eventmiscs += src + SSticker.mode.eventmiscs += src special_role = SPECIAL_ROLE_EVENTMISC - ticker.mode.update_eventmisc_icons_added(src) + SSticker.mode.update_eventmisc_icons_added(src) message_admins("[key_name_admin(usr)] has eventantag'ed [current].") log_admin("[key_name(usr)] has eventantag'ed [current].") else if(href_list["devil"]) switch(href_list["devil"]) if("clear") - if(src in ticker.mode.devils) + if(src in SSticker.mode.devils) if(istype(current,/mob/living/carbon/true_devil/)) to_chat(usr,"This cannot be used on true or arch-devils.") else - ticker.mode.devils -= src - ticker.mode.update_devil_icons_removed(src) + SSticker.mode.devils -= src + SSticker.mode.update_devil_icons_removed(src) special_role = null to_chat(current,"Your infernal link has been severed! You are no longer a devil!") RemoveSpell(/obj/effect/proc_holder/spell/targeted/infernal_jaunt) @@ -1085,8 +1085,8 @@ S.laws.clear_sixsixsix_laws() devilinfo = null log_admin("[key_name(usr)] has de-devil'ed [current].") - else if(src in ticker.mode.sintouched) - ticker.mode.sintouched -= src + else if(src in SSticker.mode.sintouched) + SSticker.mode.sintouched -= src message_admins("[key_name_admin(usr)] has de-sintouch'ed [current].") log_admin("[key_name(usr)] has de-sintouch'ed [current].") if("devil") @@ -1098,12 +1098,12 @@ if(!ishuman(current) && !isrobot(current)) to_chat(usr, "This only works on humans and cyborgs!") return - ticker.mode.devils += src + SSticker.mode.devils += src special_role = "devil" - ticker.mode.update_devil_icons_added(src) - ticker.mode.finalize_devil(src, FALSE) - ticker.mode.forge_devil_objectives(src, 2) - ticker.mode.greet_devil(src) + SSticker.mode.update_devil_icons_added(src) + SSticker.mode.finalize_devil(src, FALSE) + SSticker.mode.forge_devil_objectives(src, 2) + SSticker.mode.greet_devil(src) message_admins("[key_name_admin(usr)] has devil'ed [current].") log_admin("[key_name(usr)] has devil'ed [current].") if("ascendable_devil") @@ -1115,12 +1115,12 @@ if(!ishuman(current) && !isrobot(current)) to_chat(usr, "This only works on humans and cyborgs!") return - ticker.mode.devils += src + SSticker.mode.devils += src special_role = "devil" - ticker.mode.update_devil_icons_added(src) - ticker.mode.finalize_devil(src, TRUE) - ticker.mode.forge_devil_objectives(src, 2) - ticker.mode.greet_devil(src) + SSticker.mode.update_devil_icons_added(src) + SSticker.mode.finalize_devil(src, TRUE) + SSticker.mode.forge_devil_objectives(src, 2) + SSticker.mode.greet_devil(src) message_admins("[key_name_admin(usr)] has devil'ed [current]. The devil has been marked as ascendable.") log_admin("[key_name(usr)] has devil'ed [current]. The devil has been marked as ascendable.") if("sintouched") @@ -1132,8 +1132,8 @@ else if(href_list["traitor"]) switch(href_list["traitor"]) if("clear") - if(src in ticker.mode.traitors) - ticker.mode.traitors -= src + if(src in SSticker.mode.traitors) + SSticker.mode.traitors -= src special_role = null to_chat(current, "You have been brainwashed! You are no longer a traitor!") log_admin("[key_name(usr)] has de-traitored [key_name(current)]") @@ -1145,12 +1145,12 @@ A.verbs -= /mob/living/silicon/ai/proc/choose_modules A.malf_picker.remove_verbs(A) qdel(A.malf_picker) - ticker.mode.update_traitor_icons_removed(src) + SSticker.mode.update_traitor_icons_removed(src) if("traitor") - if(!(src in ticker.mode.traitors)) - ticker.mode.traitors += src + if(!(src in SSticker.mode.traitors)) + SSticker.mode.traitors += src var/datum/mindslaves/slaved = new() slaved.masters += src som = slaved //we MIGT want to mindslave someone @@ -1160,14 +1160,14 @@ message_admins("[key_name_admin(usr)] has traitored [key_name_admin(current)]") if(isAI(current)) var/mob/living/silicon/ai/A = current - ticker.mode.add_law_zero(A) + SSticker.mode.add_law_zero(A) SEND_SOUND(current, 'sound/ambience/antag/malf.ogg') else SEND_SOUND(current, 'sound/ambience/antag/tatoralert.ogg') - ticker.mode.update_traitor_icons_added(src) + SSticker.mode.update_traitor_icons_added(src) if("autoobjectives") - ticker.mode.forge_traitor_objectives(src) + SSticker.mode.forge_traitor_objectives(src) to_chat(usr, "The objectives for traitor [key] have been generated. You can edit them and announce manually.") log_admin("[key_name(usr)] has automatically forged objectives for [key_name(current)]") message_admins("[key_name_admin(usr)] has automatically forged objectives for [key_name_admin(current)]") @@ -1175,17 +1175,17 @@ else if(href_list["shadowling"]) switch(href_list["shadowling"]) if("clear") - ticker.mode.update_shadow_icons_removed(src) - if(src in ticker.mode.shadows) - ticker.mode.shadows -= src + SSticker.mode.update_shadow_icons_removed(src) + if(src in SSticker.mode.shadows) + SSticker.mode.shadows -= src special_role = null to_chat(current, "Your powers have been quenched! You are no longer a shadowling!") message_admins("[key_name_admin(usr)] has de-shadowlinged [current].") log_admin("[key_name(usr)] has de-shadowlinged [current].") current.spellremove(current) current.remove_language("Shadowling Hivemind") - else if(src in ticker.mode.shadowling_thralls) - ticker.mode.remove_thrall(src,0) + else if(src in SSticker.mode.shadowling_thralls) + SSticker.mode.remove_thrall(src,0) message_admins("[key_name_admin(usr)] has de-thrall'ed [current].") log_admin("[key_name(usr)] has de-thralled [key_name(current)]") message_admins("[key_name_admin(usr)] has de-thralled [key_name_admin(current)]") @@ -1193,20 +1193,20 @@ if(!ishuman(current)) to_chat(usr, "This only works on humans!") return - ticker.mode.shadows += src + SSticker.mode.shadows += src special_role = SPECIAL_ROLE_SHADOWLING to_chat(current, "Something stirs deep in your mind. A red light floods your vision, and slowly you remember. Though your human disguise has served you well, the \ time is nigh to cast it off and enter your true form. You have disguised yourself amongst the humans, but you are not one of them. You are a shadowling, and you are to ascend at all costs.\ ") - ticker.mode.finalize_shadowling(src) - ticker.mode.update_shadow_icons_added(src) + SSticker.mode.finalize_shadowling(src) + SSticker.mode.update_shadow_icons_added(src) log_admin("[key_name(usr)] has shadowlinged [key_name(current)]") message_admins("[key_name_admin(usr)] has shadowlinged [key_name_admin(current)]") if("thrall") if(!ishuman(current)) to_chat(usr, "This only works on humans!") return - ticker.mode.add_thrall(src) + SSticker.mode.add_thrall(src) message_admins("[key_name_admin(usr)] has thralled [current].") log_admin("[key_name(usr)] has thralled [current].") @@ -1221,7 +1221,7 @@ return make_Abductor() log_admin("[key_name(usr)] turned [current] into abductor.") - ticker.mode.update_abductor_icons_added(src) + SSticker.mode.update_abductor_icons_added(src) if("equip") if(!ishuman(current)) to_chat(usr, "This only works on humans!") @@ -1306,7 +1306,7 @@ log_admin("[key_name(usr)] has set [key_name(current)]'s telecrystals to [crystals]") message_admins("[key_name_admin(usr)] has set [key_name_admin(current)]'s telecrystals to [crystals]") if("uplink") - if(!ticker.mode.equip_traitor(current, !(src in ticker.mode.traitors))) + if(!SSticker.mode.equip_traitor(current, !(src in SSticker.mode.traitors))) to_chat(usr, "Equipping a syndicate failed!") return log_admin("[key_name(usr)] has given [key_name(current)] an uplink") @@ -1392,27 +1392,27 @@ qdel(H) /datum/mind/proc/make_Traitor() - if(!(src in ticker.mode.traitors)) - ticker.mode.traitors += src + if(!(src in SSticker.mode.traitors)) + SSticker.mode.traitors += src special_role = SPECIAL_ROLE_TRAITOR - ticker.mode.forge_traitor_objectives(src) - ticker.mode.finalize_traitor(src) - ticker.mode.greet_traitor(src) - ticker.mode.update_traitor_icons_added(src) + SSticker.mode.forge_traitor_objectives(src) + SSticker.mode.finalize_traitor(src) + SSticker.mode.greet_traitor(src) + SSticker.mode.update_traitor_icons_added(src) /datum/mind/proc/make_Nuke() - if(!(src in ticker.mode.syndicates)) - ticker.mode.syndicates += src - ticker.mode.update_synd_icons_added(src) - if(ticker.mode.syndicates.len==1) - ticker.mode.prepare_syndicate_leader(src) + if(!(src in SSticker.mode.syndicates)) + SSticker.mode.syndicates += src + SSticker.mode.update_synd_icons_added(src) + if(SSticker.mode.syndicates.len==1) + SSticker.mode.prepare_syndicate_leader(src) else - current.real_name = "[syndicate_name()] Operative #[ticker.mode.syndicates.len-1]" + current.real_name = "[syndicate_name()] Operative #[SSticker.mode.syndicates.len-1]" special_role = SPECIAL_ROLE_NUKEOPS assigned_role = SPECIAL_ROLE_NUKEOPS to_chat(current, "You are a [syndicate_name()] agent!") - ticker.mode.forge_syndicate_objectives(src) - ticker.mode.greet_syndicate(src) + SSticker.mode.forge_syndicate_objectives(src) + SSticker.mode.greet_syndicate(src) current.loc = get_turf(locate("landmark*Syndicate-Spawn")) @@ -1429,34 +1429,34 @@ qdel(H.wear_suit) qdel(H.w_uniform) - ticker.mode.equip_syndicate(current) + SSticker.mode.equip_syndicate(current) /datum/mind/proc/make_Vampire() - if(!(src in ticker.mode.vampires)) - ticker.mode.vampires += src - ticker.mode.grant_vampire_powers(current) + if(!(src in SSticker.mode.vampires)) + SSticker.mode.vampires += src + SSticker.mode.grant_vampire_powers(current) special_role = SPECIAL_ROLE_VAMPIRE - ticker.mode.forge_vampire_objectives(src) - ticker.mode.greet_vampire(src) - ticker.mode.update_vampire_icons_added(src) + SSticker.mode.forge_vampire_objectives(src) + SSticker.mode.greet_vampire(src) + SSticker.mode.update_vampire_icons_added(src) /datum/mind/proc/make_Changeling() - if(!(src in ticker.mode.changelings)) - ticker.mode.changelings += src - ticker.mode.grant_changeling_powers(current) + if(!(src in SSticker.mode.changelings)) + SSticker.mode.changelings += src + SSticker.mode.grant_changeling_powers(current) special_role = SPECIAL_ROLE_CHANGELING - ticker.mode.forge_changeling_objectives(src) - ticker.mode.greet_changeling(src) - ticker.mode.update_change_icons_added(src) + SSticker.mode.forge_changeling_objectives(src) + SSticker.mode.greet_changeling(src) + SSticker.mode.update_change_icons_added(src) /datum/mind/proc/make_Overmind() - if(!(src in ticker.mode.blob_overminds)) - ticker.mode.blob_overminds += src + if(!(src in SSticker.mode.blob_overminds)) + SSticker.mode.blob_overminds += src special_role = SPECIAL_ROLE_BLOB_OVERMIND /datum/mind/proc/make_Wizard() - if(!(src in ticker.mode.wizards)) - ticker.mode.wizards += src + if(!(src in SSticker.mode.wizards)) + SSticker.mode.wizards += src special_role = SPECIAL_ROLE_WIZARD assigned_role = SPECIAL_ROLE_WIZARD //ticker.mode.learn_basic_spells(current) @@ -1466,18 +1466,18 @@ else current.loc = pick(wizardstart) - ticker.mode.equip_wizard(current) + SSticker.mode.equip_wizard(current) for(var/obj/item/spellbook/S in current.contents) S.op = 0 - ticker.mode.name_wizard(current) - ticker.mode.forge_wizard_objectives(src) - ticker.mode.greet_wizard(src) - ticker.mode.update_wiz_icons_added(src) + SSticker.mode.name_wizard(current) + SSticker.mode.forge_wizard_objectives(src) + SSticker.mode.greet_wizard(src) + SSticker.mode.update_wiz_icons_added(src) /datum/mind/proc/make_Rev() - if(ticker.mode.head_revolutionaries.len>0) + if(SSticker.mode.head_revolutionaries.len>0) // copy targets - var/datum/mind/valid_head = locate() in ticker.mode.head_revolutionaries + var/datum/mind/valid_head = locate() in SSticker.mode.head_revolutionaries if(valid_head) for(var/datum/objective/mutiny/O in valid_head.objectives) var/datum/objective/mutiny/rev_obj = new @@ -1485,13 +1485,13 @@ rev_obj.target = O.target rev_obj.explanation_text = "Assassinate [O.target.current.real_name], the [O.target.assigned_role]." objectives += rev_obj - ticker.mode.greet_revolutionary(src,0) - ticker.mode.head_revolutionaries += src - ticker.mode.update_rev_icons_added(src) + SSticker.mode.greet_revolutionary(src,0) + SSticker.mode.head_revolutionaries += src + SSticker.mode.update_rev_icons_added(src) special_role = SPECIAL_ROLE_HEAD_REV - ticker.mode.forge_revolutionary_objectives(src) - ticker.mode.greet_revolutionary(src,0) + SSticker.mode.forge_revolutionary_objectives(src) + SSticker.mode.greet_revolutionary(src,0) var/list/L = current.get_contents() var/obj/item/flash/flash = locate() in L @@ -1499,7 +1499,7 @@ take_uplink() var/fail = 0 // fail |= !ticker.mode.equip_traitor(current, 1) - fail |= !ticker.mode.equip_revolutionary(current) + fail |= !SSticker.mode.equip_revolutionary(current) /datum/mind/proc/make_Abductor() var/role = alert("Abductor Role ?","Role","Agent","Scientist") @@ -1512,7 +1512,7 @@ if(!ishuman(current)) return - ticker.mode.abductors |= src + SSticker.mode.abductors |= src var/datum/objective/experiment/O = new O.owner = src @@ -1621,15 +1621,15 @@ var/list/implanters var/ref = "\ref[missionary.mind]" - if(!(missionary.mind in ticker.mode.implanter)) - ticker.mode.implanter[ref] = list() - implanters = ticker.mode.implanter[ref] + if(!(missionary.mind in SSticker.mode.implanter)) + SSticker.mode.implanter[ref] = list() + implanters = SSticker.mode.implanter[ref] implanters.Add(src) - ticker.mode.implanted.Add(src) - ticker.mode.implanted[src] = missionary.mind + SSticker.mode.implanted.Add(src) + SSticker.mode.implanted[src] = missionary.mind //ticker.mode.implanter[missionary.mind] += src - ticker.mode.implanter[ref] = implanters - ticker.mode.traitors += src + SSticker.mode.implanter[ref] = implanters + SSticker.mode.traitors += src special_role = "traitor" to_chat(current, "You're now a loyal zealot of [missionary.name]! You now must lay down your life to protect [missionary.p_them()] and assist in [missionary.p_their()] goals at any cost.") var/datum/objective/protect/mindslave/MS = new @@ -1640,8 +1640,8 @@ for(var/datum/objective/objective in objectives) to_chat(current, "Objective #1: [objective.explanation_text]") - ticker.mode.update_traitor_icons_added(missionary.mind) - ticker.mode.update_traitor_icons_added(src)//handles datahuds/observerhuds + SSticker.mode.update_traitor_icons_added(missionary.mind) + SSticker.mode.update_traitor_icons_added(src)//handles datahuds/observerhuds if(missionary.mind.som)//do not add if not a traitor..and you just picked up a robe and staff in the hall... var/datum/mindslaves/slaved = missionary.mind.som @@ -1665,7 +1665,7 @@ /datum/mind/proc/remove_zealot(obj/item/clothing/under/jumpsuit = null) if(!zealot_master) //if they aren't a zealot, we can't remove their zealot status, obviously. don't bother with the rest so we don't confuse them with the messages return - ticker.mode.remove_traitor_mind(src) + SSticker.mode.remove_traitor_mind(src) add_attack_logs(zealot_master, current, "Lost control of zealot") zealot_master = null @@ -1696,8 +1696,8 @@ mind.key = key else mind = new /datum/mind(key) - if(ticker) - ticker.minds += mind + if(SSticker) + SSticker.minds += mind else error("mind_initialize(): No ticker ready yet! Please inform Carn") if(!mind.name) diff --git a/code/datums/periodic_news.dm b/code/datums/periodic_news.dm index cdf2d5b9ad8..9a09ec4a7ec 100644 --- a/code/datums/periodic_news.dm +++ b/code/datums/periodic_news.dm @@ -118,7 +118,7 @@ var/global/list/newscaster_standard_feeds = list(/datum/news_announcement/bluespace_research, /datum/news_announcement/lotus_tree, /datum/news_announcement/random_junk, /datum/news_announcement/food_riots) proc/process_newscaster() - check_for_newscaster_updates(ticker.mode.newscaster_announcements) + check_for_newscaster_updates(SSticker.mode.newscaster_announcements) var/global/tmp/announced_news_types = list() proc/check_for_newscaster_updates(type) diff --git a/code/datums/spells/chaplain.dm b/code/datums/spells/chaplain.dm index f9c2641c50e..bdb7bb3f551 100644 --- a/code/datums/spells/chaplain.dm +++ b/code/datums/spells/chaplain.dm @@ -64,9 +64,9 @@ spawn(0) // allows cast to complete even if recipient ignores the prompt if(alert(target, "[user] wants to bless you, in the name of [user.p_their()] religion. Accept?", "Accept Blessing?", "Yes", "No") == "Yes") // prevents forced conversions - user.visible_message("[user] starts blessing [target] in the name of [ticker.Bible_deity_name].", "You start blessing [target] in the name of [ticker.Bible_deity_name].") + user.visible_message("[user] starts blessing [target] in the name of [SSticker.Bible_deity_name].", "You start blessing [target] in the name of [SSticker.Bible_deity_name].") if(do_after(user, 150, target = target)) - user.visible_message("[user] has blessed [target] in the name of [ticker.Bible_deity_name].", "You have blessed [target] in the name of [ticker.Bible_deity_name].") + user.visible_message("[user] has blessed [target] in the name of [SSticker.Bible_deity_name].", "You have blessed [target] in the name of [SSticker.Bible_deity_name].") if(!target.mind.isblessed) target.mind.isblessed = TRUE user.mind.num_blessed++ diff --git a/code/datums/spells/lichdom.dm b/code/datums/spells/lichdom.dm index f1744e22550..f37d48c0a10 100644 --- a/code/datums/spells/lichdom.dm +++ b/code/datums/spells/lichdom.dm @@ -20,7 +20,7 @@ action_icon_state = "skeleton" /obj/effect/proc_holder/spell/targeted/lichdom/Destroy() - for(var/datum/mind/M in ticker.mode.wizards) //Make sure no other bones are about + for(var/datum/mind/M in SSticker.mode.wizards) //Make sure no other bones are about for(var/obj/effect/proc_holder/spell/S in M.spell_list) if(istype(S,/obj/effect/proc_holder/spell/targeted/lichdom) && S != src) return ..() diff --git a/code/datums/uplink_item.dm b/code/datums/uplink_item.dm index a714e17d236..044276f9e41 100644 --- a/code/datums/uplink_item.dm +++ b/code/datums/uplink_item.dm @@ -12,9 +12,9 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) var/datum/uplink_item/I = new path if(!I.item) continue - if(I.gamemodes.len && ticker && !(ticker.mode.type in I.gamemodes)) + if(I.gamemodes.len && SSticker && !(SSticker.mode.type in I.gamemodes)) continue - if(I.excludefrom.len && ticker && (ticker.mode.type in I.excludefrom)) + if(I.excludefrom.len && SSticker && (SSticker.mode.type in I.excludefrom)) continue if(I.last) last += I diff --git a/code/game/data_huds.dm b/code/game/data_huds.dm index 461de475b41..1370b64ecc7 100644 --- a/code/game/data_huds.dm +++ b/code/game/data_huds.dm @@ -218,7 +218,7 @@ /mob/living/carbon/human/proc/sec_hud_set_security_status() var/image/holder = hud_list[WANTED_HUD] var/perpname = get_visible_name(TRUE) //gets the name of the perp, works if they have an id or if their face is uncovered - if(!ticker) return //wait till the game starts or the monkeys runtime.... + if(!SSticker) return //wait till the game starts or the monkeys runtime.... if(perpname) var/datum/data/record/R = find_record("name", perpname, data_core.security) if(R) diff --git a/code/game/gamemodes/blob/powers.dm b/code/game/gamemodes/blob/powers.dm index 61196c9862f..5eb15759d99 100644 --- a/code/game/gamemodes/blob/powers.dm +++ b/code/game/gamemodes/blob/powers.dm @@ -378,8 +378,8 @@ new /obj/structure/blob/core/ (get_turf(N), 200, null, blob_core.point_rate, "offspring") qdel(N) - if(ticker && ticker.mode.name == "blob") - var/datum/game_mode/blob/BL = ticker.mode + if(SSticker && SSticker.mode.name == "blob") + var/datum/game_mode/blob/BL = SSticker.mode BL.blobwincount += initial(BL.blobwincount) diff --git a/code/game/gamemodes/cult/cult.dm b/code/game/gamemodes/cult/cult.dm index 9e45cab4292..2b860756b45 100644 --- a/code/game/gamemodes/cult/cult.dm +++ b/code/game/gamemodes/cult/cult.dm @@ -5,7 +5,7 @@ var/global/list/all_cults = list() var/list/datum/mind/cult = list() /proc/iscultist(mob/living/M as mob) - return istype(M) && M.mind && ticker && ticker.mode && (M.mind in ticker.mode.cult) + return istype(M) && M.mind && SSticker && SSticker.mode && (M.mind in SSticker.mode.cult) /proc/is_convertable_to_cult(datum/mind/mind) @@ -30,8 +30,8 @@ var/global/list/all_cults = list() return 1 /proc/is_sacrifice_target(datum/mind/mind) - if(istype(ticker.mode.name, "cult")) - var/datum/game_mode/cult/cult_mode = ticker.mode + if(istype(SSticker.mode.name, "cult")) + var/datum/game_mode/cult/cult_mode = SSticker.mode if(mind == cult_mode.sacrifice_target) return 1 return 0 @@ -121,7 +121,7 @@ var/global/list/all_cults = list() var/datum/action/innate/cultcomm/C = new() C.Grant(cult_mind.current) update_cult_icons_added(cult_mind) - to_chat(cult_mind.current, "You catch a glimpse of the Realm of [ticker.cultdat.entity_name], [ticker.cultdat.entity_title3]. You now see how flimsy the world is, you see that it should be open to the knowledge of [ticker.cultdat.entity_name].") + to_chat(cult_mind.current, "You catch a glimpse of the Realm of [SSticker.cultdat.entity_name], [SSticker.cultdat.entity_title3]. You now see how flimsy the world is, you see that it should be open to the knowledge of [SSticker.cultdat.entity_name].") first_phase() @@ -135,16 +135,16 @@ var/global/list/all_cults = list() if("survive") explanation = "Our knowledge must live on. Make sure at least [acolytes_needed] acolytes escape on the shuttle to spread their work on an another station." if("convert") - explanation = "We must increase our influence before we can summon [ticker.cultdat.entity_name], Convert [convert_target] crew members. Take it slowly to avoid raising suspicions." + explanation = "We must increase our influence before we can summon [SSticker.cultdat.entity_name], Convert [convert_target] crew members. Take it slowly to avoid raising suspicions." if("bloodspill") - explanation = "We must prepare this place for [ticker.cultdat.entity_title1]'s coming. Spill blood and gibs over [spilltarget] floor tiles." + explanation = "We must prepare this place for [SSticker.cultdat.entity_title1]'s coming. Spill blood and gibs over [spilltarget] floor tiles." if("sacrifice") if(sacrifice_target) explanation = "Sacrifice [sacrifice_target.current.real_name], the [sacrifice_target.assigned_role]. You will need the sacrifice rune and three acolytes to do so." else explanation = "Free objective." if("eldergod") - explanation = "Summon [ticker.cultdat.entity_name] by invoking the 'Tear Reality' rune.The summoning can only be accomplished in [english_list(summon_spots)] - where the veil is weak enough for the ritual to begin." + explanation = "Summon [SSticker.cultdat.entity_name] by invoking the 'Tear Reality' rune.The summoning can only be accomplished in [english_list(summon_spots)] - where the veil is weak enough for the ritual to begin." to_chat(cult_mind.current, "Objective #[obj_count]: [explanation]") cult_mind.memory += "Objective #[obj_count]: [explanation]
" @@ -179,7 +179,7 @@ var/global/list/all_cults = list() /datum/game_mode/proc/add_cultist(datum/mind/cult_mind) //BASE if(!istype(cult_mind)) return 0 - var/datum/game_mode/cult/cult_mode = ticker.mode + var/datum/game_mode/cult/cult_mode = SSticker.mode if(!(cult_mind in cult) && is_convertable_to_cult(cult_mind)) cult += cult_mind cult_mind.current.faction |= "cult" @@ -314,10 +314,10 @@ var/global/list/all_cults = list() feedback_add_details("cult_objective","cult_sacrifice|FAIL|GIBBED") if("eldergod") if(!eldergod) - explanation = "Summon [ticker.cultdat.entity_name]. Success!" + explanation = "Summon [SSticker.cultdat.entity_name]. Success!" feedback_add_details("cult_objective","cult_narsie|SUCCESS") else - explanation = "Summon [ticker.cultdat.entity_name]. Fail." + explanation = "Summon [SSticker.cultdat.entity_name]. Fail." feedback_add_details("cult_objective","cult_narsie|FAIL") if("slaughter") if(demons_summoned) @@ -345,10 +345,10 @@ var/global/list/all_cults = list() if("harvest") if(harvested > harvest_target) - explanation = "Offer [harvest_target] humans for [ticker.cultdat.entity_name]'s first meal of the day. ([harvested] sacrificed) Success!" + explanation = "Offer [harvest_target] humans for [SSticker.cultdat.entity_name]'s first meal of the day. ([harvested] sacrificed) Success!" feedback_add_details("cult_objective","cult_harvest|SUCCESS") else - explanation = "Offer [harvest_target] humans for [ticker.cultdat.entity_name]'s first meal of the day. ([harvested] sacrificed) Fail!" + explanation = "Offer [harvest_target] humans for [SSticker.cultdat.entity_name]'s first meal of the day. ([harvested] sacrificed) Fail!" feedback_add_details("cult_objective","cult_harvest|FAIL") if("hijack") @@ -375,7 +375,7 @@ var/global/list/all_cults = list() /datum/game_mode/proc/auto_declare_completion_cult() - if(cult.len || (ticker && GAMEMODE_IS_CULT)) + if(cult.len || (SSticker && GAMEMODE_IS_CULT)) var/text = "The cultists were:" for(var/datum/mind/cultist in cult) diff --git a/code/game/gamemodes/cult/cult_objectives.dm b/code/game/gamemodes/cult/cult_objectives.dm index beef75e103b..da4e190cb7f 100644 --- a/code/game/gamemodes/cult/cult_objectives.dm +++ b/code/game/gamemodes/cult/cult_objectives.dm @@ -19,10 +19,10 @@ switch(new_objective) if("convert") - explanation = "We must increase our influence before we can summon [ticker.cultdat.entity_name], Convert [convert_target] crew members. Take it slowly to avoid raising suspicions." + explanation = "We must increase our influence before we can summon [SSticker.cultdat.entity_name], Convert [convert_target] crew members. Take it slowly to avoid raising suspicions." if("bloodspill") spilltarget = 100 + rand(0,GLOB.player_list.len * 3) - explanation = "We must prepare this place for [ticker.cultdat.entity_title1]'s coming. Spill blood and gibs over [spilltarget] floor tiles." + explanation = "We must prepare this place for [SSticker.cultdat.entity_title1]'s coming. Spill blood and gibs over [spilltarget] floor tiles." if("sacrifice") explanation = "We need to sacrifice [sacrifice_target.name], the [sacrifice_target.assigned_role], for [sacrifice_target.p_their()] blood is the key that will lead our master to this realm. You will need 3 cultists around a Sacrifice rune to perform the ritual." @@ -59,8 +59,8 @@ message_admins("The Cult has already completed [prenarsie_objectives] objectives! Nar-Sie objective unlocked.") log_admin("The Cult has already completed [prenarsie_objectives] objectives! Nar-Sie objective unlocked.") else - message_admins("There are less than 4 cultists! [ticker.cultdat.entity_name] objective unlocked.") - log_admin("There are less than 4 cultists! [ticker.cultdat.entity_name] objective unlocked.") + message_admins("There are less than 4 cultists! [SSticker.cultdat.entity_name] objective unlocked.") + log_admin("There are less than 4 cultists! [SSticker.cultdat.entity_name] objective unlocked.") gtfo_phase() if(!sacrificed.len && (new_objective != "sacrifice")) @@ -76,10 +76,10 @@ switch(new_objective) if("convert") - explanation = "We must increase our influence before we can summon [ticker.cultdat.entity_name]. Convert [convert_target] crew members. Take it slowly to avoid raising suspicions." + explanation = "We must increase our influence before we can summon [SSticker.cultdat.entity_name]. Convert [convert_target] crew members. Take it slowly to avoid raising suspicions." if("bloodspill") spilltarget = 100 + rand(0,GLOB.player_list.len * 3) - explanation = "We must prepare this place for [ticker.cultdat.entity_title1]'s coming. Spread blood and gibs over [spilltarget] of the Station's floor tiles." + explanation = "We must prepare this place for [SSticker.cultdat.entity_title1]'s coming. Spread blood and gibs over [spilltarget] of the Station's floor tiles." if("sacrifice") explanation = "We need to sacrifice [sacrifice_target.name], the [sacrifice_target.assigned_role], for [sacrifice_target.p_their()] blood is the key that will lead our master to this realm. You will need 3 cultists around a Sacrifice rune to perform the ritual." @@ -111,7 +111,7 @@ if(prob(40))//split the chance of this objectives += "eldergod" - explanation = "Summon [ticker.cultdat.entity_name] on the Station via the use of the Tear Reality rune. The veil is weak enough in [english_list(summon_spots)] for the ritual to begin." + explanation = "Summon [SSticker.cultdat.entity_name] on the Station via the use of the Tear Reality rune. The veil is weak enough in [english_list(summon_spots)] for the ritual to begin." else objectives += "slaughter" explanation = "Bring the Slaughter via the rune 'Bring forth the slaughter'. The veil is weak enough in [english_list(summon_spots)] for the ritual to begin." @@ -135,11 +135,11 @@ switch(last_objective) if("harvest") - explanation = "[ticker.cultdat.entity_title1] hungers for their first meal of this never-ending day. Offer them [harvest_target] humans in sacrifice." + explanation = "[SSticker.cultdat.entity_title1] hungers for their first meal of this never-ending day. Offer them [harvest_target] humans in sacrifice." if("hijack") - explanation = "[ticker.cultdat.entity_name] wishes for their troops to start the assault on Centcom immediately. Hijack the escape shuttle and don't let a single non-cultist board it." + explanation = "[SSticker.cultdat.entity_name] wishes for their troops to start the assault on Centcom immediately. Hijack the escape shuttle and don't let a single non-cultist board it." if("massacre") - explanation = "[ticker.cultdat.entity_name] wants to watch you as you massacre the remaining humans on the station (until less than [massacre_target] humans are left alive)." + explanation = "[SSticker.cultdat.entity_name] wants to watch you as you massacre the remaining humans on the station (until less than [massacre_target] humans are left alive)." for(var/datum/mind/cult_mind in cult) if(cult_mind) diff --git a/code/game/gamemodes/cult/ritual.dm b/code/game/gamemodes/cult/ritual.dm index d561291c19f..fb6bb95a4a8 100644 --- a/code/game/gamemodes/cult/ritual.dm +++ b/code/game/gamemodes/cult/ritual.dm @@ -11,7 +11,7 @@ return /obj/effect/rune/proc/check_icon() - if(!ticker.mode)//work around for maps with runes and cultdat is not loaded all the way + if(!SSticker.mode)//work around for maps with runes and cultdat is not loaded all the way var/bits = make_bit_triplet() icon = get_rune(bits) else @@ -39,16 +39,16 @@ canbypass = 1 /obj/item/tome/New() - if(!ticker.mode) + if(!SSticker.mode) icon_state = "tome" else - icon_state = ticker.cultdat.tome_icon + icon_state = SSticker.cultdat.tome_icon ..() /obj/item/tome/examine(mob/user) ..() if(iscultist(user) || user.stat == DEAD) - to_chat(user, "The scriptures of [ticker.cultdat.entity_title3]. Allows the scribing of runes and access to the knowledge archives of the cult of [ticker.cultdat.entity_name].") + to_chat(user, "The scriptures of [SSticker.cultdat.entity_title3]. Allows the scribing of runes and access to the knowledge archives of the cult of [SSticker.cultdat.entity_name].") to_chat(user, "Striking another cultist with it will purge holy water from them.") to_chat(user, "Striking a noncultist, however, will sear their flesh.") @@ -91,7 +91,7 @@ /obj/item/tome/proc/read_tome(mob/user) var/text = list() - text += "
Archives of [ticker.cultdat.entity_title1]



" + text += "
Archives of [SSticker.cultdat.entity_title1]



" text += "A rune's name and effects can be revealed by examining the rune.<

" text += "Rite of Binding
This rune is one of the most important runes the cult has, being the only way to create new talismans. A blank sheet of paper must be on top of the rune. After \ @@ -102,7 +102,7 @@ text += "Rite of Enlightenment
This rune is critical to the success of the cult. It will allow you to convert normal crew members into cultists. \ To do this, simply place the crew member upon the rune and invoke it. This rune requires two invokers to use. If the target to be converted is mindshielded or a certain assignment, they will \ - be unable to be converted. People [ticker.cultdat.entity_title3] wishes sacrificed will also be ineligible for conversion, and anyone with a shielding presence like the null rod will not be converted.
\ + be unable to be converted. People [SSticker.cultdat.entity_title3] wishes sacrificed will also be ineligible for conversion, and anyone with a shielding presence like the null rod will not be converted.
\ Successful conversions will produce a tome for the new cultist.

" text += "Rite of Tribute
This rune is necessary to achieve your goals. Simply place any dead creature upon the rune and invoke it (this will not \ @@ -135,12 +135,12 @@ text += "Leeching
When invoked, this rune will transfer lifeforce from the victim to the invoker.

" - text += "Rite of Spectral Manifestation
This rune allows you to summon spirits as humanoid fighters. When invoked, a spirit above the rune will be brought to life as a human, wearing nothing, that seeks only to serve you and [ticker.cultdat.entity_title3]. \ + text += "Rite of Spectral Manifestation
This rune allows you to summon spirits as humanoid fighters. When invoked, a spirit above the rune will be brought to life as a human, wearing nothing, that seeks only to serve you and [SSticker.cultdat.entity_title3]. \ However, the spirit's link to reality is fragile - you must remain on top of the rune, and you will slowly take damage. Upon stepping off the rune, all summoned spirits will dissipate, dropping their items to the ground. You may manifest \ multiple spirits with one rune, but you will rapidly take damage in doing so.

" text += "Ritual of Dimensional Rending
This rune is necessary to achieve your goals. On attempting to scribe it, it will produce shields around you and alert everyone you are attempting to scribe it; it takes a very long time to scribe, \ - and does massive damage to the one attempting to scribe it.
Invoking it requires 9 invokers and the sacrifice of a specific crewmember, and once invoked, will summon [ticker.cultdat.entity_title3], [ticker.cultdat.entity_name]. \ + and does massive damage to the one attempting to scribe it.
Invoking it requires 9 invokers and the sacrifice of a specific crewmember, and once invoked, will summon [SSticker.cultdat.entity_title3], [SSticker.cultdat.entity_name]. \ This will complete your objectives.


" text += "Talisman of Teleportation
The talisman form of the Teleport rune will transport the invoker to a selected Teleport rune once.

" @@ -201,12 +201,12 @@ return 1 /obj/item/tome/proc/finale_runes_ok(mob/living/user, obj/effect/rune/rune_to_scribe) - var/datum/game_mode/cult/cult_mode = ticker.mode + var/datum/game_mode/cult/cult_mode = SSticker.mode var/area/A = get_area(src) if(GAMEMODE_IS_CULT) if(!canbypass)//not an admin-tome, check things if(!cult_mode.narsie_condition_cleared) - to_chat(user, "There is still more to do before unleashing [ticker.cultdat.entity_name] power!") + to_chat(user, "There is still more to do before unleashing [SSticker.cultdat.entity_name] power!") return 0 if(!cult_mode.eldergod) to_chat(user, "\"I am already here. There is no need to try to summon me now.\"") @@ -215,19 +215,19 @@ to_chat(user, "\"We are already here. There is no need to try to summon us now.\"") return 0 if(!((CULT_ELDERGOD in cult_mode.objectives) || (CULT_SLAUGHTER in cult_mode.objectives))) - to_chat(user, "[ticker.cultdat.entity_name]'s power does not wish to be unleashed!") + to_chat(user, "[SSticker.cultdat.entity_name]'s power does not wish to be unleashed!") return 0 if(!(A in summon_spots)) - to_chat(user, "[ticker.cultdat.entity_name] can only be summoned where the veil is weak - in [english_list(summon_spots)]!") + to_chat(user, "[SSticker.cultdat.entity_name] can only be summoned where the veil is weak - in [english_list(summon_spots)]!") return 0 - var/confirm_final = alert(user, "This is the FINAL step to summon your deities power, it is a long, painful ritual and the crew will be alerted to your presence", "Are you prepared for the final battle?", "My life for [ticker.cultdat.entity_name]!", "No") + var/confirm_final = alert(user, "This is the FINAL step to summon your deities power, it is a long, painful ritual and the crew will be alerted to your presence", "Are you prepared for the final battle?", "My life for [SSticker.cultdat.entity_name]!", "No") if(confirm_final == "No" || confirm_final == null) to_chat(user, "You decide to prepare further before scribing the rune.") return 0 else return 1 else//the game mode is not cult..but we ARE a cultist...ALL ON THE ADMINBUS - var/confirm_final = alert(user, "This is the FINAL step to summon your deities power, it is a long, painful ritual and the crew will be alerted to your presence", "Are you prepared for the final battle?", "My life for [ticker.cultdat.entity_name]!", "No") + var/confirm_final = alert(user, "This is the FINAL step to summon your deities power, it is a long, painful ritual and the crew will be alerted to your presence", "Are you prepared for the final battle?", "My life for [SSticker.cultdat.entity_name]!", "No") if(confirm_final == "No" || confirm_final == null) to_chat(user, "You decide to prepare further before scribing the rune.") return 0 @@ -296,7 +296,7 @@ var/mob/living/carbon/human/H = user var/dam_zone = pick("head", "chest", "groin", "l_arm", "l_hand", "r_arm", "r_hand", "l_leg", "l_foot", "r_leg", "r_foot") var/obj/item/organ/external/affecting = H.get_organ(ran_zone(dam_zone)) - user.visible_message("[user] cuts open [user.p_their()] [affecting] and begins writing in [user.p_their()] own blood!", "You slice open your [affecting] and begin drawing a sigil of [ticker.cultdat.entity_title3].") + user.visible_message("[user] cuts open [user.p_their()] [affecting] and begins writing in [user.p_their()] own blood!", "You slice open your [affecting] and begin drawing a sigil of [SSticker.cultdat.entity_title3].") user.apply_damage(initial(rune_to_scribe.scribe_damage), BRUTE , affecting) if(!do_after(user, initial(rune_to_scribe.scribe_delay)-scribereduct, target = get_turf(user))) for(var/V in shields) @@ -308,7 +308,7 @@ to_chat(user, "There is already a rune here.") return user.visible_message("[user] creates a strange circle in [user.p_their()] own blood.", \ - "You finish drawing the arcane markings of [ticker.cultdat.entity_title3].") + "You finish drawing the arcane markings of [SSticker.cultdat.entity_title3].") for(var/V in shields) var/obj/machinery/shield/S = V if(S && !QDELETED(S)) diff --git a/code/game/gamemodes/cult/runes.dm b/code/game/gamemodes/cult/runes.dm index 1ed5e812989..ef2a970adb3 100644 --- a/code/game/gamemodes/cult/runes.dm +++ b/code/game/gamemodes/cult/runes.dm @@ -197,7 +197,7 @@ structure_check() searches for nearby cultist structures required for the invoca ..() for(var/M in invokers) var/mob/living/L = M - to_chat(L, "You feel your life force draining. [ticker.cultdat.entity_title3] is displeased.") + to_chat(L, "You feel your life force draining. [SSticker.cultdat.entity_title3] is displeased.") qdel(src) /mob/proc/null_rod_check() //The null rod, if equipped, will protect the holder from the effects of most runes @@ -372,12 +372,12 @@ var/list/teleport_runes = list() new_cultist.visible_message("[new_cultist] writhes in pain as the markings below them glow a bloody red!", \ "AAAAAAAAAAAAAA-") - ticker.mode.add_cultist(new_cultist.mind, 1) + SSticker.mode.add_cultist(new_cultist.mind, 1) new /obj/item/tome(get_turf(src)) new_cultist.mind.special_role = "Cultist" to_chat(new_cultist, "Your blood pulses. Your head throbs. The world goes red. All at once you are aware of a horrible, horrible, truth. The veil of reality has been ripped away \ and something evil takes root.") - to_chat(new_cultist, "Assist your new compatriots in their dark dealings. Your goal is theirs, and theirs is yours. You serve [ticker.cultdat.entity_title3] above all else. Bring it back.\ + to_chat(new_cultist, "Assist your new compatriots in their dark dealings. Your goal is theirs, and theirs is yours. You serve [SSticker.cultdat.entity_title3] above all else. Bring it back.\ ") //Rite of Tribute: Sacrifices a crew member to Nar-Sie. Places them into a soul shard if they're in their body. @@ -391,7 +391,7 @@ var/list/teleport_runes = list() /obj/effect/rune/sacrifice/New() ..() - cultist_desc = "sacrifices a crew member to [ticker.cultdat.entity_title3]. May place them into a soul shard if their spirit remains in their body." + cultist_desc = "sacrifices a crew member to [SSticker.cultdat.entity_title3]. May place them into a soul shard if their spirit remains in their body." /obj/effect/rune/sacrifice/invoke(var/list/invokers) if(rune_in_use) @@ -432,7 +432,7 @@ var/list/teleport_runes = list() /obj/effect/rune/sacrifice/proc/sac(var/list/invokers, mob/living/T) var/sacrifice_fulfilled - var/datum/game_mode/cult/cult_mode = ticker.mode + var/datum/game_mode/cult/cult_mode = SSticker.mode if(T) if(istype(T, /mob/living/simple_animal/pet/corgi)) for(var/M in invokers) @@ -445,7 +445,7 @@ var/list/teleport_runes = list() if(is_sacrifice_target(T.mind)) sacrifice_fulfilled = 1 new /obj/effect/temp_visual/cult/sac(loc) - if(ticker && ticker.mode && ticker.mode.name == "cult") + if(SSticker && SSticker.mode && SSticker.mode.name == "cult") cult_mode.harvested++ for(var/M in invokers) @@ -494,8 +494,8 @@ var/list/teleport_runes = list() /obj/effect/rune/narsie/New() ..() - cultist_name = "Summon [ticker.cultdat.entity_name]" - cultist_desc = "tears apart dimensional barriers, calling forth [ticker.cultdat.entity_title3]. Requires 9 invokers." + cultist_name = "Summon [SSticker.cultdat.entity_name]" + cultist_desc = "tears apart dimensional barriers, calling forth [SSticker.cultdat.entity_title3]. Requires 9 invokers." /obj/effect/rune/narsie/check_icon() @@ -508,7 +508,7 @@ var/list/teleport_runes = list() if(used) return var/mob/living/user = invokers[1] - var/datum/game_mode/cult/cult_mode = ticker.mode + var/datum/game_mode/cult/cult_mode = SSticker.mode if(!(CULT_ELDERGOD in cult_mode.objectives)) message_admins("[key_name_admin(user)] tried to summonn an eldritch horror when the objective was wrong") burn_invokers(invokers) @@ -521,7 +521,7 @@ var/list/teleport_runes = list() return if(!cult_mode.eldergod) for(var/M in invokers) - to_chat(M, "[ticker.cultdat.entity_name] is already on this plane!") + to_chat(M, "[SSticker.cultdat.entity_name] is already on this plane!") log_game("Summon god rune failed - already summoned") return //BEGIN THE SUMMONING @@ -594,7 +594,7 @@ var/list/teleport_runes = list() if(used) return var/mob/living/user = invokers[1] - var/datum/game_mode/cult/cult_mode = ticker.mode + var/datum/game_mode/cult/cult_mode = SSticker.mode if(!(CULT_SLAUGHTER in cult_mode.objectives)) message_admins("[key_name_admin(user)] tried to summon demons when the objective was wrong") burn_invokers(invokers) @@ -856,10 +856,10 @@ var/list/teleport_runes = list() /obj/effect/rune/summon/invoke(var/list/invokers) var/mob/living/user = invokers[1] var/list/cultists = list() - for(var/datum/mind/M in ticker.mode.cult) + for(var/datum/mind/M in SSticker.mode.cult) if(!(M.current in invokers) && M.current && M.current.stat != DEAD) cultists |= M.current - var/mob/living/cultist_to_summon = input(user, "Who do you wish to call to [src]?", "Followers of [ticker.cultdat.entity_title3]") as null|anything in cultists + var/mob/living/cultist_to_summon = input(user, "Who do you wish to call to [src]?", "Followers of [SSticker.cultdat.entity_title3]") as null|anything in cultists if(!Adjacent(user) || !src || QDELETED(src) || user.incapacitated()) return if(!cultist_to_summon) @@ -868,7 +868,7 @@ var/list/teleport_runes = list() log_game("Summon Cultist rune failed - no target") return if(!iscultist(cultist_to_summon)) - to_chat(user, "[cultist_to_summon] is not a follower of [ticker.cultdat.entity_title3]!") + to_chat(user, "[cultist_to_summon] is not a follower of [SSticker.cultdat.entity_title3]!") fail_invoke() log_game("Summon Cultist rune failed - no target") return @@ -977,7 +977,7 @@ var/list/teleport_runes = list() /obj/effect/rune/manifest/New(loc) ..() - cultist_desc = "manifests a spirit as a servant of [ticker.cultdat.entity_title3]. The invoker must not move from atop the rune, and will take damage for each summoned spirit." + cultist_desc = "manifests a spirit as a servant of [SSticker.cultdat.entity_title3]. The invoker must not move from atop the rune, and will take damage for each summoned spirit." notify_ghosts("Manifest rune created in [get_area(src)].", ghost_sound='sound/effects/ghost2.ogg', source = src) @@ -1033,10 +1033,10 @@ var/list/teleport_runes = list() N.health = 20 N.mouse_opacity = MOUSE_OPACITY_TRANSPARENT new_human.key = ghost_to_spawn.key - ticker.mode.add_cultist(new_human.mind, 0) + SSticker.mode.add_cultist(new_human.mind, 0) summoned_guys |= new_human ghosts++ - to_chat(new_human, "You are a servant of [ticker.cultdat.entity_title3]. You have been made semi-corporeal by the cult of [ticker.cultdat.entity_name], and you are to serve them at all costs.") + to_chat(new_human, "You are a servant of [SSticker.cultdat.entity_title3]. You have been made semi-corporeal by the cult of [SSticker.cultdat.entity_name], and you are to serve them at all costs.") while(user in get_turf(src)) if(user.stat) diff --git a/code/game/gamemodes/cult/talisman.dm b/code/game/gamemodes/cult/talisman.dm index 875e8a3d1e9..92fc09490ec 100644 --- a/code/game/gamemodes/cult/talisman.dm +++ b/code/game/gamemodes/cult/talisman.dm @@ -41,7 +41,7 @@ invocation = "Ra'sha yoka!" /obj/item/paper/talisman/malformed/invoke(mob/living/user, successfuluse = 1) - to_chat(user, "You feel a pain in your head. [ticker.cultdat.entity_title3] is displeased.") + to_chat(user, "You feel a pain in your head. [SSticker.cultdat.entity_title3] is displeased.") if(iscarbon(user)) var/mob/living/carbon/C = user C.apply_damage(10, BRUTE, "head") diff --git a/code/game/gamemodes/devil/devilinfo.dm b/code/game/gamemodes/devil/devilinfo.dm index e11d31f7d98..419034a9e1f 100644 --- a/code/game/gamemodes/devil/devilinfo.dm +++ b/code/game/gamemodes/devil/devilinfo.dm @@ -300,9 +300,9 @@ var/global/list/lawlorify = list ( to_chat(world, "SLOTH, WRATH, GLUTTONY, ACEDIA, ENVY, GREED, PRIDE! FIRES OF HELL AWAKEN!!") world << 'sound/hallucinations/veryfar_noise.ogg' sleep(50) - if(!ticker.mode.devil_ascended) + if(!SSticker.mode.devil_ascended) SSshuttle.emergency.request(null, 0.3) - ticker.mode.devil_ascended++ + SSticker.mode.devil_ascended++ /datum/devilinfo/proc/increase_arch_devil() if(!ascendable) diff --git a/code/game/gamemodes/devil/objectives.dm b/code/game/gamemodes/devil/objectives.dm index 5214ab336ec..04d0217b599 100644 --- a/code/game/gamemodes/devil/objectives.dm +++ b/code/game/gamemodes/devil/objectives.dm @@ -68,7 +68,7 @@ explanation_text = "Ensure at least [target_amount] mortals are sintouched." /datum/objective/devil/sintouch/check_completion() - return target_amount <= ticker.mode.sintouched.len + return target_amount <= SSticker.mode.sintouched.len diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm index 5f3ed489107..4f583abdfed 100644 --- a/code/game/gamemodes/game_mode.dm +++ b/code/game/gamemodes/game_mode.dm @@ -75,8 +75,8 @@ display_roundstart_logout_report() feedback_set_details("round_start","[time2text(world.realtime)]") - if(ticker && ticker.mode) - feedback_set_details("game_mode","[ticker.mode]") + if(SSticker && SSticker.mode) + feedback_set_details("game_mode","[SSticker.mode]") // if(revdata) // feedback_set_details("revision","[revdata.revision]") feedback_set_details("server_ip","[world.internet_address]:[world.port]") diff --git a/code/game/gamemodes/heist/heist.dm b/code/game/gamemodes/heist/heist.dm index e8a3ff6c981..2b4d095b327 100644 --- a/code/game/gamemodes/heist/heist.dm +++ b/code/game/gamemodes/heist/heist.dm @@ -312,5 +312,5 @@ datum/game_mode/proc/auto_declare_completion_heist() message_admins("[key_name_admin(user)] has pressed the vox win button.") log_admin("[key_name(user)] pressed the vox win button during a vox round.") - var/datum/game_mode/heist/H = ticker.mode + var/datum/game_mode/heist/H = SSticker.mode H.win_button_triggered = 1 diff --git a/code/game/gamemodes/intercept_report.dm b/code/game/gamemodes/intercept_report.dm index 5e8be8b1229..d1d176f797e 100644 --- a/code/game/gamemodes/intercept_report.dm +++ b/code/game/gamemodes/intercept_report.dm @@ -113,10 +113,10 @@ if(man.client && man.client.prefs.nanotrasen_relation == "Opposed") //don't include suspects who can't possibly be the antag based on their job (no suspecting the captain of being a damned dirty tator) if(man.mind && man.mind.assigned_role) - if((man.mind.assigned_role in ticker.mode.protected_jobs) || (man.mind.assigned_role in ticker.mode.restricted_jobs)) + if((man.mind.assigned_role in SSticker.mode.protected_jobs) || (man.mind.assigned_role in SSticker.mode.restricted_jobs)) return //don't include suspects who can't possibly be the antag based on their species (no suspecting the machines of being sneaky changelings) - if(man.dna.species.name in ticker.mode.protected_species) + if(man.dna.species.name in SSticker.mode.protected_species) return dudes += man for(var/i = 0, i < max(GLOB.player_list.len/10,2), i++) diff --git a/code/game/gamemodes/malfunction/Malf_Modules.dm b/code/game/gamemodes/malfunction/Malf_Modules.dm index bfde102ca35..1c96c0e4329 100644 --- a/code/game/gamemodes/malfunction/Malf_Modules.dm +++ b/code/game/gamemodes/malfunction/Malf_Modules.dm @@ -111,7 +111,7 @@ to_chat(L, "The blast wave from [src] tears you atom from atom!") L.dust() to_chat(world, "The AI cleansed the station of life with the doomsday device!") - ticker.force_ending = 1 + SSticker.force_ending = 1 /datum/AI_Module/large/upgrade_turrets diff --git a/code/game/gamemodes/miniantags/abduction/abduction.dm b/code/game/gamemodes/miniantags/abduction/abduction.dm index 587c2b3d476..aab75687df4 100644 --- a/code/game/gamemodes/miniantags/abduction/abduction.dm +++ b/code/game/gamemodes/miniantags/abduction/abduction.dm @@ -251,14 +251,14 @@ /datum/game_mode/proc/remove_abductor(datum/mind/abductor_mind) if(abductor_mind in abductors) - ticker.mode.abductors -= abductor_mind + SSticker.mode.abductors -= abductor_mind abductor_mind.special_role = null abductor_mind.current.create_attack_log("No longer abductor") if(issilicon(abductor_mind.current)) to_chat(abductor_mind.current, "You have been turned into a robot! You are no longer an abductor.") else to_chat(abductor_mind.current, "You have been brainwashed! You are no longer an abductor.") - ticker.mode.update_abductor_icons_removed(abductor_mind) + SSticker.mode.update_abductor_icons_removed(abductor_mind) /datum/game_mode/proc/update_abductor_icons_added(datum/mind/alien_mind) var/datum/atom_hud/antag/hud = huds[ANTAG_HUD_ABDUCTOR] diff --git a/code/game/gamemodes/miniantags/abduction/machinery/experiment.dm b/code/game/gamemodes/miniantags/abduction/machinery/experiment.dm index 53969aaf7d1..db6f07c1d24 100644 --- a/code/game/gamemodes/miniantags/abduction/machinery/experiment.dm +++ b/code/game/gamemodes/miniantags/abduction/machinery/experiment.dm @@ -140,14 +140,14 @@ to_chat(H, "You can't remember how you got here...") var/objtype = pick(subtypesof(/datum/objective/abductee/)) var/datum/objective/abductee/O = new objtype() - ticker.mode.abductees += H.mind + SSticker.mode.abductees += H.mind H.mind.objectives += O var/obj_count = 1 to_chat(H, "Your current objectives:") for(var/datum/objective/objective in H.mind.objectives) to_chat(H, "Objective #[obj_count]: [objective.explanation_text]") obj_count++ - ticker.mode.update_abductor_icons_added(H.mind) + SSticker.mode.update_abductor_icons_added(H.mind) for(var/obj/item/organ/internal/heart/gland/G in H.internal_organs) G.Start() diff --git a/code/game/gamemodes/miniantags/morph/morph_event.dm b/code/game/gamemodes/miniantags/morph/morph_event.dm index 4a1c8ebeb7e..e80374e2dca 100644 --- a/code/game/gamemodes/miniantags/morph/morph_event.dm +++ b/code/game/gamemodes/miniantags/morph/morph_event.dm @@ -21,7 +21,7 @@ player_mind.transfer_to(S) player_mind.assigned_role = SPECIAL_ROLE_MORPH player_mind.special_role = SPECIAL_ROLE_MORPH - ticker.mode.traitors |= player_mind + SSticker.mode.traitors |= player_mind to_chat(S, S.playstyle_string) S << 'sound/magic/mutate.ogg' message_admins("[key_of_morph] has been made into morph by an event.") diff --git a/code/game/gamemodes/miniantags/revenant/revenant.dm b/code/game/gamemodes/miniantags/revenant/revenant.dm index 54b01ff38ce..7d18c1796dd 100644 --- a/code/game/gamemodes/miniantags/revenant/revenant.dm +++ b/code/game/gamemodes/miniantags/revenant/revenant.dm @@ -182,7 +182,7 @@ objective2.owner = mind mind.objectives += objective2 to_chat(src, "Objective #2: [objective2.explanation_text]") - ticker.mode.traitors |= mind //Necessary for announcing + SSticker.mode.traitors |= mind //Necessary for announcing /mob/living/simple_animal/revenant/proc/giveSpells() mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/night_vision/revenant(null)) @@ -429,7 +429,7 @@ player_mind.transfer_to(R) player_mind.assigned_role = SPECIAL_ROLE_REVENANT player_mind.special_role = SPECIAL_ROLE_REVENANT - ticker.mode.traitors |= player_mind + SSticker.mode.traitors |= player_mind message_admins("[key_of_revenant] has been [client_to_revive ? "re":""]made into a revenant by reforming ectoplasm.") log_game("[key_of_revenant] was [client_to_revive ? "re":""]made as a revenant by reforming ectoplasm.") visible_message("[src] suddenly rises into the air before fading away.") diff --git a/code/game/gamemodes/miniantags/revenant/revenant_spawn_event.dm b/code/game/gamemodes/miniantags/revenant/revenant_spawn_event.dm index 757fbe579a2..437e7637a77 100644 --- a/code/game/gamemodes/miniantags/revenant/revenant_spawn_event.dm +++ b/code/game/gamemodes/miniantags/revenant/revenant_spawn_event.dm @@ -45,7 +45,7 @@ player_mind.transfer_to(revvie) player_mind.assigned_role = SPECIAL_ROLE_REVENANT player_mind.special_role = SPECIAL_ROLE_REVENANT - ticker.mode.traitors |= player_mind + SSticker.mode.traitors |= player_mind message_admins("[key_of_revenant] has been made into a revenant by an event.") log_game("[key_of_revenant] was spawned as a revenant by an event.") return 1 diff --git a/code/game/gamemodes/miniantags/slaughter/slaughter.dm b/code/game/gamemodes/miniantags/slaughter/slaughter.dm index 7e74de27267..a43d03c153a 100644 --- a/code/game/gamemodes/miniantags/slaughter/slaughter.dm +++ b/code/game/gamemodes/miniantags/slaughter/slaughter.dm @@ -72,7 +72,7 @@ if(!(vialspawned)) var/datum/objective/slaughter/objective = new var/datum/objective/demonFluff/fluffObjective = new - ticker.mode.traitors |= mind + SSticker.mode.traitors |= mind objective.owner = mind fluffObjective.owner = mind //Paradise Port:I added the objective for one spawned like this @@ -174,7 +174,7 @@ S.mind.assigned_role = "Harbringer of the Slaughter" S.mind.special_role = "Harbringer of the Slaughter" to_chat(S, playstyle_string) - ticker.mode.add_cultist(S.mind) + SSticker.mode.add_cultist(S.mind) var/obj/effect/proc_holder/spell/targeted/sense_victims/SV = new AddSpell(SV) var/datum/objective/new_objective = new /datum/objective diff --git a/code/game/gamemodes/nuclear/nuclear.dm b/code/game/gamemodes/nuclear/nuclear.dm index d19d2dd7cc5..0c7f46306af 100644 --- a/code/game/gamemodes/nuclear/nuclear.dm +++ b/code/game/gamemodes/nuclear/nuclear.dm @@ -4,7 +4,7 @@ var/list/datum/mind/syndicates = list() proc/issyndicate(mob/living/M as mob) - return istype(M) && M.mind && ticker && ticker.mode && (M.mind in ticker.mode.syndicates) + return istype(M) && M.mind && SSticker && SSticker.mode && (M.mind in SSticker.mode.syndicates) /datum/game_mode/nuclear name = "nuclear emergency" @@ -64,7 +64,7 @@ proc/issyndicate(mob/living/M as mob) /datum/game_mode/proc/remove_operative(datum/mind/operative_mind) if(operative_mind in syndicates) - ticker.mode.syndicates -= operative_mind + SSticker.mode.syndicates -= operative_mind operative_mind.special_role = null for(var/datum/objective/nuclear/O in operative_mind.objectives) operative_mind.objectives -= O @@ -73,7 +73,7 @@ proc/issyndicate(mob/living/M as mob) to_chat(operative_mind.current, "You have been turned into a robot! You are no longer a Syndicate operative.") else to_chat(operative_mind.current, "You have been brainwashed! You are no longer a Syndicate operative.") - ticker.mode.update_synd_icons_removed(operative_mind) + SSticker.mode.update_synd_icons_removed(operative_mind) //////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////// @@ -208,7 +208,7 @@ proc/issyndicate(mob/living/M as mob) P.stamp(stamp) qdel(stamp) - if(ticker.mode.config_tag=="nuclear") + if(SSticker.mode.config_tag=="nuclear") P.loc = synd_mind.current.loc else var/mob/living/carbon/human/H = synd_mind.current @@ -437,7 +437,7 @@ proc/issyndicate(mob/living/M as mob) /datum/game_mode/nuclear/set_scoreboard_gvars() var/foecount = 0 - for(var/datum/mind/M in ticker.mode.syndicates) + for(var/datum/mind/M in SSticker.mode.syndicates) foecount++ if(!M || !M.current) score_opkilled++ @@ -490,7 +490,7 @@ proc/issyndicate(mob/living/M as mob) var/diskdat = "" var/bombdat = null - for(var/datum/mind/M in ticker.mode.syndicates) + for(var/datum/mind/M in SSticker.mode.syndicates) foecount++ for(var/mob/living/C in world) diff --git a/code/game/gamemodes/nuclear/nuclear_challenge.dm b/code/game/gamemodes/nuclear/nuclear_challenge.dm index 45711bb52fc..35c26408c5b 100644 --- a/code/game/gamemodes/nuclear/nuclear_challenge.dm +++ b/code/game/gamemodes/nuclear/nuclear_challenge.dm @@ -21,7 +21,7 @@ return declaring_war = TRUE - var/are_you_sure = alert(user, "Consult your team carefully before you declare war on [station_name()]. Are you sure you want to alert the enemy crew? You have [-round((world.time-round_start_time - CHALLENGE_TIME_LIMIT)/10)] seconds to decide.", "Declare war?", "Yes", "No") + var/are_you_sure = alert(user, "Consult your team carefully before you declare war on [station_name()]. Are you sure you want to alert the enemy crew? You have [-round((world.time-SSticker.round_start_time - CHALLENGE_TIME_LIMIT)/10)] seconds to decide.", "Declare war?", "Yes", "No") declaring_war = FALSE if(!check_allowed(user)) @@ -88,7 +88,7 @@ if(!is_admin_level(user.z)) to_chat(user, "You have to be at your base to use this.") return FALSE - if((world.time - round_start_time) > CHALLENGE_TIME_LIMIT) // Only count after the round started + if((world.time - SSticker.round_start_time) > CHALLENGE_TIME_LIMIT) // Only count after the round started to_chat(user, "It's too late to declare hostilities. Your benefactors are already busy with other schemes. You'll have to make do with what you have on hand.") return FALSE for(var/obj/machinery/computer/shuttle/syndicate/S in GLOB.machines) diff --git a/code/game/gamemodes/nuclear/nuclearbomb.dm b/code/game/gamemodes/nuclear/nuclearbomb.dm index 2e36488cc8a..09de3f917bd 100644 --- a/code/game/gamemodes/nuclear/nuclearbomb.dm +++ b/code/game/gamemodes/nuclear/nuclearbomb.dm @@ -354,8 +354,8 @@ var/bomb_set if(!lighthack) icon_state = "nuclearbomb3" playsound(src,'sound/machines/alarm.ogg',100,0,5) - if(ticker && ticker.mode) - ticker.mode.explosion_in_progress = 1 + if(SSticker && SSticker.mode) + SSticker.mode.explosion_in_progress = 1 sleep(100) enter_allowed = 0 @@ -368,17 +368,17 @@ var/bomb_set else off_station = 2 - if(ticker) - if(ticker.mode && ticker.mode.name == "nuclear emergency") + if(SSticker) + if(SSticker.mode && SSticker.mode.name == "nuclear emergency") var/obj/docking_port/mobile/syndie_shuttle = SSshuttle.getShuttle("syndicate") if(syndie_shuttle) - ticker.mode:syndies_didnt_escape = is_station_level(syndie_shuttle.z) - ticker.mode:nuke_off_station = off_station - ticker.station_explosion_cinematic(off_station,null) - if(ticker.mode) - ticker.mode.explosion_in_progress = 0 - if(ticker.mode.name == "nuclear emergency") - ticker.mode:nukes_left -- + SSticker.mode:syndies_didnt_escape = is_station_level(syndie_shuttle.z) + SSticker.mode:nuke_off_station = off_station + SSticker.station_explosion_cinematic(off_station,null) + if(SSticker.mode) + SSticker.mode.explosion_in_progress = 0 + if(SSticker.mode.name == "nuclear emergency") + SSticker.mode:nukes_left -- else if(off_station == 1) to_chat(world, "A nuclear device was set off, but the explosion was out of reach of the station!") else if(off_station == 2) @@ -386,10 +386,10 @@ var/bomb_set else to_chat(world, "The station was destoyed by the nuclear blast!") - ticker.mode.station_was_nuked = (off_station<2) //offstation==1 is a draw. the station becomes irradiated and needs to be evacuated. + SSticker.mode.station_was_nuked = (off_station<2) //offstation==1 is a draw. the station becomes irradiated and needs to be evacuated. //kinda shit but I couldn't get permission to do what I wanted to do. - if(!ticker.mode.check_finished())//If the mode does not deal with the nuke going off so just reboot because everyone is stuck as is + if(!SSticker.mode.check_finished())//If the mode does not deal with the nuke going off so just reboot because everyone is stuck as is world.Reboot("Station destroyed by Nuclear Device.", "end_error", "nuke - unhandled ending") return return diff --git a/code/game/gamemodes/nuclear/pinpointer.dm b/code/game/gamemodes/nuclear/pinpointer.dm index 61986b34f94..d221c94d39f 100644 --- a/code/game/gamemodes/nuclear/pinpointer.dm +++ b/code/game/gamemodes/nuclear/pinpointer.dm @@ -273,7 +273,7 @@ var/mob/living/carbon/nearest_op = null /obj/item/pinpointer/operative/attack_self() - if(!usr.mind || !(usr.mind in ticker.mode.syndicates)) + if(!usr.mind || !(usr.mind in SSticker.mode.syndicates)) to_chat(usr, "AUTHENTICATION FAILURE. ACCESS DENIED.") return 0 if(!active) @@ -290,7 +290,7 @@ nearest_op = null //Resets nearest_op every time it scans var/closest_distance = 1000 for(var/mob/living/carbon/M in GLOB.mob_list) - if(M.mind && (M.mind in ticker.mode.syndicates)) + if(M.mind && (M.mind in SSticker.mode.syndicates)) if(get_dist(M, get_turf(src)) < closest_distance) //Actually points toward the nearest op, instead of a random one like it used to nearest_op = M diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm index 210b1bb786e..7c358ba951d 100644 --- a/code/game/gamemodes/objective.dm +++ b/code/game/gamemodes/objective.dm @@ -43,7 +43,7 @@ var/list/potential_theft_objectives = subtypesof(/datum/theft_objective) - /datu /datum/objective/proc/find_target() var/list/possible_targets = list() - for(var/datum/mind/possible_target in ticker.minds) + for(var/datum/mind/possible_target in SSticker.minds) if(is_invalid_target(possible_target)) continue @@ -263,9 +263,9 @@ var/list/potential_theft_objectives = subtypesof(/datum/theft_objective) - /datu return 0 if(!owner.current || owner.current.stat == DEAD) return 0 - if(ticker.force_ending) //This one isn't their fault, so lets just assume good faith + if(SSticker.force_ending) //This one isn't their fault, so lets just assume good faith return 1 - if(ticker.mode.station_was_nuked) //If they escaped the blast somehow, let them win + if(SSticker.mode.station_was_nuked) //If they escaped the blast somehow, let them win return 1 if(SSshuttle.emergency.mode < SHUTTLE_ENDGAME) return 0 @@ -287,7 +287,7 @@ var/list/potential_theft_objectives = subtypesof(/datum/theft_objective) - /datu /datum/objective/escape/escape_with_identity/find_target() var/list/possible_targets = list() //Copypasta because NO_DNA races, yay for snowflakes. - for(var/datum/mind/possible_target in ticker.minds) + for(var/datum/mind/possible_target in SSticker.minds) if(possible_target != owner && ishuman(possible_target.current) && (possible_target.current.stat != DEAD) && possible_target.current.client) var/mob/living/carbon/human/H = possible_target.current if(!(NO_DNA in H.dna.species.species_traits)) @@ -452,19 +452,19 @@ var/list/potential_theft_objectives = subtypesof(/datum/theft_objective) - /datu /datum/objective/absorb /datum/objective/absorb/proc/gen_amount_goal(var/lowbound = 4, var/highbound = 6) target_amount = rand (lowbound,highbound) - if(ticker) + if(SSticker) var/n_p = 1 //autowin - if(ticker.current_state == GAME_STATE_SETTING_UP) + if(SSticker.current_state == GAME_STATE_SETTING_UP) for(var/mob/new_player/P in GLOB.player_list) if(P.client && P.ready && P.mind != owner) if(P.client.prefs && (P.client.prefs.species == "Machine")) // Special check for species that can't be absorbed. No better solution. continue n_p++ - else if(ticker.current_state == GAME_STATE_PLAYING) + else if(SSticker.current_state == GAME_STATE_PLAYING) for(var/mob/living/carbon/human/P in GLOB.player_list) if(NO_DNA in P.dna.species.species_traits) continue - if(P.client && !(P.mind in ticker.mode.changelings) && P.mind!=owner) + if(P.client && !(P.mind in SSticker.mode.changelings) && P.mind!=owner) n_p++ target_amount = min(target_amount, n_p) @@ -531,7 +531,7 @@ var/list/potential_theft_objectives = subtypesof(/datum/theft_objective) - /datu var/list/possible_targets = list() var/list/priority_targets = list() - for(var/datum/mind/possible_target in ticker.minds) + for(var/datum/mind/possible_target in SSticker.minds) if(possible_target != owner && ishuman(possible_target.current) && (possible_target.current.stat != DEAD) && (possible_target.assigned_role != possible_target.special_role)) possible_targets += possible_target for(var/role in roles) @@ -627,7 +627,7 @@ var/list/potential_theft_objectives = subtypesof(/datum/theft_objective) - /datu if(total_amount >= target_amount) return 1 - var/datum/game_mode/heist/H = ticker.mode + var/datum/game_mode/heist/H = SSticker.mode for(var/datum/mind/raider in H.raiders) if(raider.current) for(var/obj/O in raider.current.get_contents()) @@ -697,7 +697,7 @@ var/list/potential_theft_objectives = subtypesof(/datum/theft_objective) - /datu S = I total_amount += S.get_amount() - var/datum/game_mode/heist/H = ticker.mode + var/datum/game_mode/heist/H = SSticker.mode for(var/datum/mind/raider in H.raiders) if(raider.current) for(var/obj/item/O in raider.current.get_contents()) @@ -714,7 +714,7 @@ var/list/potential_theft_objectives = subtypesof(/datum/theft_objective) - /datu explanation_text = "Do not leave any Vox behind, alive or dead." /datum/objective/heist/inviolate_crew/check_completion() - var/datum/game_mode/heist/H = ticker.mode + var/datum/game_mode/heist/H = SSticker.mode if(H.is_raider_crew_safe()) return 1 return 0 @@ -726,7 +726,7 @@ var/list/potential_theft_objectives = subtypesof(/datum/theft_objective) - /datu var/vox_allowed_kills = 3 // The number of people the vox can accidently kill. Mostly a counter to people killing themselves if a raider touches them to force fail. var/vox_total_kills = 0 - var/datum/game_mode/heist/H = ticker.mode + var/datum/game_mode/heist/H = SSticker.mode for(var/datum/mind/raider in H.raiders) vox_total_kills += raider.kills.len // Kills are listed in the mind; uses this to calculate vox kills diff --git a/code/game/gamemodes/revolution/revolution.dm b/code/game/gamemodes/revolution/revolution.dm index 7cab3de5aa1..9f7e14ccef2 100644 --- a/code/game/gamemodes/revolution/revolution.dm +++ b/code/game/gamemodes/revolution/revolution.dm @@ -87,7 +87,7 @@ if(check_counter >= 5) if(!finished) check_heads() - ticker.mode.check_win() + SSticker.mode.check_win() check_counter = 0 return FALSE @@ -369,7 +369,7 @@ /datum/game_mode/revolution/set_scoreboard_gvars() var/foecount = 0 - for(var/datum/mind/M in ticker.mode.head_revolutionaries) + for(var/datum/mind/M in SSticker.mode.head_revolutionaries) foecount++ if(!M || !M.current) score_opkilled++ @@ -408,10 +408,10 @@ var/comcount = 0 var/revcount = 0 var/loycount = 0 - for(var/datum/mind/M in ticker.mode:head_revolutionaries) + for(var/datum/mind/M in SSticker.mode:head_revolutionaries) if(M.current && M.current.stat != DEAD) foecount++ - for(var/datum/mind/M in ticker.mode:revolutionaries) + for(var/datum/mind/M in SSticker.mode:revolutionaries) if(M.current && M.current.stat != DEAD) revcount++ for(var/mob/living/carbon/human/player in world) @@ -421,7 +421,7 @@ if(player.stat != DEAD) comcount++ else - if(player.mind in ticker.mode.revolutionaries) continue + if(player.mind in SSticker.mode.revolutionaries) continue loycount++ for(var/mob/living/silicon/X in world) diff --git a/code/game/gamemodes/scoreboard.dm b/code/game/gamemodes/scoreboard.dm index bd17175eaa2..379b4fbdcd9 100644 --- a/code/game/gamemodes/scoreboard.dm +++ b/code/game/gamemodes/scoreboard.dm @@ -1,9 +1,9 @@ -/datum/controller/gameticker/proc/scoreboard() +/datum/controller/subsystem/ticker/proc/scoreboard() //Print a list of antagonists to the server log var/list/total_antagonists = list() //Look into all mobs in world, dead or alive - for(var/datum/mind/Mind in minds) + for(var/datum/mind/Mind in SSticker.minds) var/temprole = Mind.special_role if(temprole) //if they are an antagonist of some sort. if(temprole in total_antagonists) //If the role exists already, add the name to it @@ -66,8 +66,8 @@ score_dmgestjob = E.job score_dmgestkey = E.key - if(ticker && ticker.mode) - ticker.mode.set_scoreboard_gvars() + if(SSticker && SSticker.mode) + SSticker.mode.set_scoreboard_gvars() // Check station's power levels @@ -147,7 +147,7 @@ E.scorestats() // A recursive function to properly determine the wealthiest escapee -/datum/controller/gameticker/proc/get_score_container_worth(atom/C, level=0) +/datum/controller/subsystem/ticker/proc/get_score_container_worth(atom/C, level=0) if(level >= 5) // in case the containers recurse or something return 0 @@ -171,8 +171,8 @@ /mob/proc/scorestats() var/dat = "Round Statistics and Score

" - if(ticker && ticker.mode) - dat += ticker.mode.get_scoreboard_stats() + if(SSticker && SSticker.mode) + dat += SSticker.mode.get_scoreboard_stats() dat += {" General Statistics
@@ -208,7 +208,7 @@ else dat += "No-one escaped!
" - dat += ticker.mode.declare_job_completion() + dat += SSticker.mode.declare_job_completion() dat += {"

diff --git a/code/game/gamemodes/setupgame.dm b/code/game/gamemodes/setupgame.dm index 0c16e88279b..78e6cea4987 100644 --- a/code/game/gamemodes/setupgame.dm +++ b/code/game/gamemodes/setupgame.dm @@ -142,12 +142,12 @@ qdel(F) continue else - ticker.factions.Add(F) - ticker.availablefactions.Add(F) + SSticker.factions.Add(F) + SSticker.availablefactions.Add(F) // Populate the syndicate coalition: - for(var/datum/faction/syndicate/S in ticker.factions) - ticker.syndicate_coalition.Add(S) + for(var/datum/faction/syndicate/S in SSticker.factions) + SSticker.syndicate_coalition.Add(S) /proc/setupcult() var/static/datum/cult_info/picked_cult // Only needs to get picked once diff --git a/code/game/gamemodes/shadowling/shadowling.dm b/code/game/gamemodes/shadowling/shadowling.dm index 230f797626d..b580f88c0b7 100644 --- a/code/game/gamemodes/shadowling/shadowling.dm +++ b/code/game/gamemodes/shadowling/shadowling.dm @@ -56,15 +56,15 @@ Made by Xhuis var/thrall_ratio = 1 /proc/is_thrall(var/mob/living/M) - return istype(M) && M.mind && ticker && ticker.mode && (M.mind in ticker.mode.shadowling_thralls) + return istype(M) && M.mind && SSticker && SSticker.mode && (M.mind in SSticker.mode.shadowling_thralls) /proc/is_shadow_or_thrall(var/mob/living/M) - return istype(M) && M.mind && ticker && ticker.mode && ((M.mind in ticker.mode.shadowling_thralls) || (M.mind in ticker.mode.shadows)) + return istype(M) && M.mind && SSticker && SSticker.mode && ((M.mind in SSticker.mode.shadowling_thralls) || (M.mind in SSticker.mode.shadows)) /proc/is_shadow(var/mob/living/M) - return istype(M) && M.mind && ticker && ticker.mode && (M.mind in ticker.mode.shadows) + return istype(M) && M.mind && SSticker && SSticker.mode && (M.mind in SSticker.mode.shadows) /datum/game_mode/shadowling diff --git a/code/game/gamemodes/shadowling/shadowling_abilities.dm b/code/game/gamemodes/shadowling/shadowling_abilities.dm index ea95f62af57..2515de135fa 100644 --- a/code/game/gamemodes/shadowling/shadowling_abilities.dm +++ b/code/game/gamemodes/shadowling/shadowling_abilities.dm @@ -216,11 +216,11 @@ /obj/effect/proc_holder/spell/targeted/enthrall/cast(list/targets, mob/user = usr) var/mob/living/carbon/human/ling = user - listclearnulls(ticker.mode.shadowling_thralls) - if(!(ling.mind in ticker.mode.shadows)) + listclearnulls(SSticker.mode.shadowling_thralls) + if(!(ling.mind in SSticker.mode.shadows)) return if(!isshadowling(ling)) - if(ticker.mode.shadowling_thralls.len >= 5) + if(SSticker.mode.shadowling_thralls.len >= 5) charge_counter = charge_max return for(var/mob/living/carbon/human/target in targets) @@ -291,7 +291,7 @@ target.visible_message("[target] looks to have experienced a revelation!", \ "False faces all dark not real not real not--") target.setOxyLoss(0) //In case the shadowling was choking them out - ticker.mode.add_thrall(target.mind) + SSticker.mode.add_thrall(target.mind) target.mind.special_role = SPECIAL_ROLE_SHADOWLING_THRALL /obj/effect/proc_holder/spell/targeted/shadowling_regenarmor //Resets a shadowling's species to normal, removes genetic defects, and re-equips their armor @@ -345,7 +345,7 @@ return for(var/mob/living/target in targets) var/thralls = 0 - var/victory_threshold = ticker.mode.required_thralls + var/victory_threshold = SSticker.mode.required_thralls var/mob/M to_chat(target, "You focus your telepathic energies abound, harnessing and drawing together the strength of your thralls.") @@ -359,24 +359,24 @@ to_chat(target, "Your concentration has been broken. The mental hooks you have sent out now retract into your mind.") return - if(thralls >= CEILING(3 * ticker.mode.thrall_ratio, 1) && !screech_acquired) + if(thralls >= CEILING(3 * SSticker.mode.thrall_ratio, 1) && !screech_acquired) screech_acquired = 1 to_chat(target, "The power of your thralls has granted you the Sonic Screech ability. This ability will shatter nearby windows and deafen enemies, plus stunning silicon lifeforms.") target.mind.AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/unearthly_screech(null)) - if(thralls >= CEILING(5 * ticker.mode.thrall_ratio, 1) && !blind_smoke_acquired) + if(thralls >= CEILING(5 * SSticker.mode.thrall_ratio, 1) && !blind_smoke_acquired) blind_smoke_acquired = 1 to_chat(target, "The power of your thralls has granted you the Blinding Smoke ability. \ It will create a choking cloud that will blind any non-thralls who enter.") target.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/blindness_smoke(null)) - if(thralls >= CEILING(7 * ticker.mode.thrall_ratio, 1) && !nullChargeAcquired) + if(thralls >= CEILING(7 * SSticker.mode.thrall_ratio, 1) && !nullChargeAcquired) nullChargeAcquired = 1 to_chat(user, "The power of your thralls has granted you the Null Charge ability. This ability will drain an APC's contents to the void, preventing it from recharging \ or sending power until repaired.") target.mind.AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/null_charge(null)) - if(thralls >= CEILING(9 * ticker.mode.thrall_ratio, 1) && !reviveThrallAcquired) + if(thralls >= CEILING(9 * SSticker.mode.thrall_ratio, 1) && !reviveThrallAcquired) reviveThrallAcquired = 1 to_chat(target, "The power of your thralls has granted you the Black Recuperation ability. \ This will, after a short time, bring a dead thrall completely back to life with no bodily defects.") @@ -578,7 +578,7 @@ charge_counter = charge_max return var/empowered_thralls = 0 - for(var/datum/mind/M in ticker.mode.shadowling_thralls) + for(var/datum/mind/M in SSticker.mode.shadowling_thralls) if(!ishuman(M.current)) return var/mob/living/carbon/human/H = M.current @@ -767,7 +767,7 @@ to_chat(user, "You instantly rearrange [target]'s memories, hyptonitizing [target.p_them()] into a thrall.") to_chat(target, "An agonizing spike of pain drives into your mind, and--") - ticker.mode.add_thrall(target.mind) + SSticker.mode.add_thrall(target.mind) target.mind.special_role = SPECIAL_ROLE_SHADOWLING_THRALL target.add_language("Shadowling Hivemind") diff --git a/code/game/gamemodes/shadowling/special_shadowling_abilities.dm b/code/game/gamemodes/shadowling/special_shadowling_abilities.dm index 29a2c9aadca..772947f0618 100644 --- a/code/game/gamemodes/shadowling/special_shadowling_abilities.dm +++ b/code/game/gamemodes/shadowling/special_shadowling_abilities.dm @@ -179,9 +179,9 @@ var/list/possibleShadowlingNames = list("U'ruan", "Y`shej", "Nex", "Hel-uae", "N H.invisibility = 60 //This is pretty bad, but is also necessary for the shuttle call to function properly H.loc = A sleep(50) - if(!ticker.mode.shadowling_ascended) + if(!SSticker.mode.shadowling_ascended) SSshuttle.emergency.request(null, 0.3) SSshuttle.emergency.canRecall = FALSE - ticker.mode.shadowling_ascended = 1 + SSticker.mode.shadowling_ascended = 1 A.mind.RemoveSpell(src) qdel(H) diff --git a/code/game/gamemodes/traitor/traitor.dm b/code/game/gamemodes/traitor/traitor.dm index de7ce59eaa2..d956e6d76b6 100644 --- a/code/game/gamemodes/traitor/traitor.dm +++ b/code/game/gamemodes/traitor/traitor.dm @@ -348,14 +348,14 @@ /datum/game_mode/proc/remove_traitor(datum/mind/traitor_mind) if(traitor_mind in traitors) - ticker.mode.traitors -= traitor_mind + SSticker.mode.traitors -= traitor_mind traitor_mind.special_role = null traitor_mind.current.create_attack_log("De-traitored") if(issilicon(traitor_mind.current)) to_chat(traitor_mind.current, "You have been turned into a robot! You are no longer a traitor.") else to_chat(traitor_mind.current, "You have been brainwashed! You are no longer a traitor.") - ticker.mode.update_traitor_icons_removed(traitor_mind) + SSticker.mode.update_traitor_icons_removed(traitor_mind) /datum/game_mode/proc/update_traitor_icons_added(datum/mind/traitor_mind) var/datum/atom_hud/antag/tatorhud = huds[ANTAG_HUD_TRAITOR] diff --git a/code/game/gamemodes/vampire/vampire.dm b/code/game/gamemodes/vampire/vampire.dm index 18d36ad57f3..9dec5b573e2 100644 --- a/code/game/gamemodes/vampire/vampire.dm +++ b/code/game/gamemodes/vampire/vampire.dm @@ -288,7 +288,7 @@ You are weak to holy things and starlight. Don't go into space and avoid the Cha else H.LAssailant = owner while(do_mob(owner, H, 50)) - if(!(owner.mind in ticker.mode.vampires)) + if(!(owner.mind in SSticker.mode.vampires)) to_chat(owner, "Your fangs have disappeared!") return old_bloodtotal = bloodtotal @@ -337,7 +337,7 @@ You are weak to holy things and starlight. Don't go into space and avoid the Cha /datum/game_mode/proc/remove_vampire(datum/mind/vampire_mind) if(vampire_mind in vampires) - ticker.mode.vampires -= vampire_mind + SSticker.mode.vampires -= vampire_mind vampire_mind.special_role = null vampire_mind.current.create_attack_log("De-vampired") if(vampire_mind.vampire) @@ -347,7 +347,7 @@ You are weak to holy things and starlight. Don't go into space and avoid the Cha to_chat(vampire_mind.current, "You have been turned into a robot! You can feel your powers fading away...") else to_chat(vampire_mind.current, "You have been brainwashed! You are no longer a vampire.") - ticker.mode.update_vampire_icons_removed(vampire_mind) + SSticker.mode.update_vampire_icons_removed(vampire_mind) //prepare for copypaste /datum/game_mode/proc/update_vampire_icons_added(datum/mind/vampire_mind) diff --git a/code/game/gamemodes/vampire/vampire_powers.dm b/code/game/gamemodes/vampire/vampire_powers.dm index 5e7b8f9a237..01885b21e14 100644 --- a/code/game/gamemodes/vampire/vampire_powers.dm +++ b/code/game/gamemodes/vampire/vampire_powers.dm @@ -276,7 +276,7 @@ /proc/isvampirethrall(mob/living/M as mob) - return istype(M) && M.mind && ticker && ticker.mode && (M.mind in ticker.mode.vampire_enthralled) + return istype(M) && M.mind && SSticker && SSticker.mode && (M.mind in SSticker.mode.vampire_enthralled) /obj/effect/proc_holder/spell/vampire/targetted/enthrall name = "Enthrall (300)" @@ -315,11 +315,11 @@ if(!C.mind) to_chat(user, "[C.name]'s mind is not there for you to enthrall.") return 0 - if(enthrall_safe || ( C.mind in ticker.mode.vampires )||( C.mind.vampire )||( C.mind in ticker.mode.vampire_enthralled )) + if(enthrall_safe || ( C.mind in SSticker.mode.vampires )||( C.mind.vampire )||( C.mind in SSticker.mode.vampire_enthralled )) C.visible_message("[C] seems to resist the takeover!", "You feel a familiar sensation in your skull that quickly dissipates.") return 0 if(!affects(C)) - C.visible_message("[C] seems to resist the takeover!", "Your faith of [ticker.Bible_deity_name] has kept your mind clear of all evil.") + C.visible_message("[C] seems to resist the takeover!", "Your faith of [SSticker.Bible_deity_name] has kept your mind clear of all evil.") return 0 if(!ishuman(C)) to_chat(user, "You can only enthrall humans!") @@ -330,21 +330,21 @@ if(!istype(H)) return 0 var/ref = "\ref[user.mind]" - if(!(ref in ticker.mode.vampire_thralls)) - ticker.mode.vampire_thralls[ref] = list(H.mind) + if(!(ref in SSticker.mode.vampire_thralls)) + SSticker.mode.vampire_thralls[ref] = list(H.mind) else - ticker.mode.vampire_thralls[ref] += H.mind + SSticker.mode.vampire_thralls[ref] += H.mind - ticker.mode.update_vampire_icons_added(H.mind) - ticker.mode.update_vampire_icons_added(user.mind) + SSticker.mode.update_vampire_icons_added(H.mind) + SSticker.mode.update_vampire_icons_added(user.mind) var/datum/mindslaves/slaved = user.mind.som H.mind.som = slaved slaved.serv += H slaved.add_serv_hud(user.mind, "vampire")//handles master servent icons slaved.add_serv_hud(H.mind, "vampthrall") - ticker.mode.vampire_enthralled.Add(H.mind) - ticker.mode.vampire_enthralled[H.mind] = user.mind + SSticker.mode.vampire_enthralled.Add(H.mind) + SSticker.mode.vampire_enthralled[H.mind] = user.mind H.mind.special_role = SPECIAL_ROLE_VAMPIRE_THRALL to_chat(H, "You have been Enthralled by [user]. Follow [user.p_their()] every command.") to_chat(user, "You have successfully Enthralled [H]. If [H.p_they()] refuse[H.p_s()] to do as you say just adminhelp.") diff --git a/code/game/gamemodes/wizard/artefact.dm b/code/game/gamemodes/wizard/artefact.dm index 243f4e3a3fa..cb891ea6b11 100644 --- a/code/game/gamemodes/wizard/artefact.dm +++ b/code/game/gamemodes/wizard/artefact.dm @@ -99,9 +99,9 @@ new_objective:target = H:mind new_objective.explanation_text = "Protect [H.real_name], the wizard." M.mind.objectives += new_objective - ticker.mode.traitors += M.mind + SSticker.mode.traitors += M.mind M.mind.special_role = SPECIAL_ROLE_WIZARD_APPRENTICE - ticker.mode.update_wiz_icons_added(M.mind) + SSticker.mode.update_wiz_icons_added(M.mind) M.faction = list("wizard") else used = 0 @@ -283,7 +283,7 @@ var/global/list/multiverse = list() usr.mind.objectives += hijack_objective hijack_objective.explanation_text = "Ensure only [usr.real_name] and [usr.p_their()] copies are on the shuttle!" to_chat(usr, "Objective #[1]: [hijack_objective.explanation_text]") - ticker.mode.traitors += usr.mind + SSticker.mode.traitors += usr.mind usr.mind.special_role = "[usr.real_name] Prime" evil = TRUE else @@ -293,7 +293,7 @@ var/global/list/multiverse = list() new_objective.explanation_text = "Survive, and help defend the innocent from the mobs of multiverse clones." to_chat(usr, "Objective #[1]: [new_objective.explanation_text]") usr.mind.objectives += new_objective - ticker.mode.traitors += usr.mind + SSticker.mode.traitors += usr.mind usr.mind.special_role = "[usr.real_name] Prime" evil = FALSE else diff --git a/code/game/gamemodes/wizard/soulstone.dm b/code/game/gamemodes/wizard/soulstone.dm index 3e22f3f84df..a71b51c58f0 100644 --- a/code/game/gamemodes/wizard/soulstone.dm +++ b/code/game/gamemodes/wizard/soulstone.dm @@ -273,11 +273,11 @@ Z.key = A.key Z.faction |= "\ref[U]" if(iscultist(U)) - if(ticker.mode.name == "cult") - ticker.mode:add_cultist(Z.mind) + if(SSticker.mode.name == "cult") + SSticker.mode:add_cultist(Z.mind) else - ticker.mode.cult+=Z.mind - ticker.mode.update_cult_icons_added(Z.mind) + SSticker.mode.cult+=Z.mind + SSticker.mode.update_cult_icons_added(Z.mind) qdel(T) to_chat(Z, "You are a Juggernaut. Though slow, your shell can withstand extreme punishment, create shield walls and even deflect energy weapons, and rip apart enemies and walls alike.") to_chat(Z, "You are still bound to serve your creator, follow [U.p_their()] orders and help [U.p_them()] complete [U.p_their()] goals at all costs.") @@ -289,11 +289,11 @@ Z.key = A.key Z.faction |= "\ref[U]" if(iscultist(U)) - if(ticker.mode.name == "cult") - ticker.mode:add_cultist(Z.mind) + if(SSticker.mode.name == "cult") + SSticker.mode:add_cultist(Z.mind) else - ticker.mode.cult+=Z.mind - ticker.mode.update_cult_icons_added(Z.mind) + SSticker.mode.cult+=Z.mind + SSticker.mode.update_cult_icons_added(Z.mind) qdel(T) to_chat(Z, "You are a Wraith. Though relatively fragile, you are fast, deadly, and even able to phase through walls.") to_chat(Z, "You are still bound to serve your creator, follow [U.p_their()] orders and help [U.p_them()] complete [U.p_their()] goals at all costs.") @@ -305,11 +305,11 @@ Z.key = A.key Z.faction |= "\ref[U]" if(iscultist(U)) - if(ticker.mode.name == "cult") - ticker.mode:add_cultist(Z.mind) + if(SSticker.mode.name == "cult") + SSticker.mode:add_cultist(Z.mind) else - ticker.mode.cult+=Z.mind - ticker.mode.update_cult_icons_added(Z.mind) + SSticker.mode.cult+=Z.mind + SSticker.mode.update_cult_icons_added(Z.mind) qdel(T) to_chat(Z, "You are an Artificer. You are incredibly weak and fragile, but you are able to construct fortifications, use magic missile, repair allied constructs (by clicking on them), and most important of all create new constructs (Use your Artificer spell to summon a new construct shell and Summon Soulstone to create a new soulstone).") to_chat(Z, "You are still bound to serve your creator, follow [U.p_their()] orders and help [U.p_them()] complete [U.p_their()] goals at all costs.") @@ -326,11 +326,11 @@ newstruct.faction |= "\ref[stoner]" newstruct.key = target.key if(stoner && iscultist(stoner) || cultoverride) - if(ticker.mode.name == "cult") - ticker.mode:add_cultist(newstruct.mind) + if(SSticker.mode.name == "cult") + SSticker.mode:add_cultist(newstruct.mind) else - ticker.mode.cult+=newstruct.mind - ticker.mode.update_cult_icons_added(newstruct.mind) + SSticker.mode.cult+=newstruct.mind + SSticker.mode.update_cult_icons_added(newstruct.mind) if(stoner && iswizard(stoner)) to_chat(newstruct, "You are still bound to serve your creator, follow [stoner.p_their()] orders and help [stoner.p_them()] complete [stoner.p_their()] goals at all costs.") else if(stoner && iscultist(stoner)) @@ -357,7 +357,7 @@ if(U) S.faction |= "\ref[U]" //Add the master as a faction, allowing inter-mob cooperation if(U && iscultist(U)) - ticker.mode.add_cultist(S.mind, 0) + SSticker.mode.add_cultist(S.mind, 0) S.cancel_camera() name = "soulstone: Shade of [T.real_name]" icon_state = "soulstone2" diff --git a/code/game/gamemodes/wizard/spellbook.dm b/code/game/gamemodes/wizard/spellbook.dm index 0a1340d885b..29be588fe68 100644 --- a/code/game/gamemodes/wizard/spellbook.dm +++ b/code/game/gamemodes/wizard/spellbook.dm @@ -475,7 +475,7 @@ cost = 0 /datum/spellbook_entry/summon/ghosts/IsAvailible() - if(!ticker.mode) + if(!SSticker.mode) return FALSE else return TRUE @@ -495,9 +495,9 @@ log_name = "SG" /datum/spellbook_entry/summon/guns/IsAvailible() - if(!ticker.mode) // In case spellbook is placed on map + if(!SSticker.mode) // In case spellbook is placed on map return 0 - if(ticker.mode.name == "ragin' mages") + if(SSticker.mode.name == "ragin' mages") return 0 else return 1 @@ -518,9 +518,9 @@ log_name = "SU" /datum/spellbook_entry/summon/magic/IsAvailible() - if(!ticker.mode) // In case spellbook is placed on map + if(!SSticker.mode) // In case spellbook is placed on map return 0 - if(ticker.mode.name == "ragin' mages") + if(SSticker.mode.name == "ragin' mages") return 0 else return 1 diff --git a/code/game/gamemodes/wizard/wizard.dm b/code/game/gamemodes/wizard/wizard.dm index b249ebe8520..4a5bf190e04 100644 --- a/code/game/gamemodes/wizard/wizard.dm +++ b/code/game/gamemodes/wizard/wizard.dm @@ -58,7 +58,7 @@ /datum/game_mode/proc/remove_wizard(datum/mind/wizard_mind) if(wizard_mind in wizards) - ticker.mode.wizards -= wizard_mind + SSticker.mode.wizards -= wizard_mind wizard_mind.special_role = null wizard_mind.current.create_attack_log("De-wizarded") wizard_mind.current.spellremove(wizard_mind.current) @@ -67,7 +67,7 @@ to_chat(wizard_mind.current, "You have been turned into a robot! You can feel your magical powers fading away...") else to_chat(wizard_mind.current, "You have been brainwashed! You are no longer a wizard.") - ticker.mode.update_wiz_icons_removed(wizard_mind) + SSticker.mode.update_wiz_icons_removed(wizard_mind) /datum/game_mode/proc/update_wiz_icons_added(datum/mind/wiz_mind) var/datum/atom_hud/antag/wizhud = huds[ANTAG_HUD_WIZ] @@ -282,4 +282,4 @@ Made a proc so this is not repeated 14 (or more) times.*/ return 1 /proc/iswizard(mob/living/M as mob) - return istype(M) && M.mind && ticker && ticker.mode && (M.mind in ticker.mode.wizards) + return istype(M) && M.mind && SSticker && SSticker.mode && (M.mind in SSticker.mode.wizards) diff --git a/code/game/jobs/job/support_chaplain.dm b/code/game/jobs/job/support_chaplain.dm index 73ec2483af1..ac393e277a8 100644 --- a/code/game/jobs/job/support_chaplain.dm +++ b/code/game/jobs/job/support_chaplain.dm @@ -158,11 +158,11 @@ to_chat(H, "Welp, out of time, buddy. You're stuck. Next time choose faster.") accepted = 1 - if(ticker) - ticker.Bible_icon_state = B.icon_state - ticker.Bible_item_state = B.item_state - ticker.Bible_name = B.name - ticker.Bible_deity_name = B.deity_name + if(SSticker) + SSticker.Bible_icon_state = B.icon_state + SSticker.Bible_item_state = B.item_state + SSticker.Bible_name = B.name + SSticker.Bible_deity_name = B.deity_name feedback_set_details("religion_deity", "[new_deity]") feedback_set_details("religion_book", "[new_book_style]") diff --git a/code/game/jobs/job_objective.dm b/code/game/jobs/job_objective.dm index 90bac6d8383..4456bb571e5 100644 --- a/code/game/jobs/job_objective.dm +++ b/code/game/jobs/job_objective.dm @@ -44,7 +44,7 @@ /datum/game_mode/proc/declare_job_completion() var/text = "
Job Completion" - for(var/datum/mind/employee in ticker.minds) + for(var/datum/mind/employee in SSticker.minds) if(!employee.job_objectives.len)//If the employee had no objectives, don't need to process this. continue diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm index 7ce515365ae..80fed112c7a 100644 --- a/code/game/machinery/cloning.dm +++ b/code/game/machinery/cloning.dm @@ -417,24 +417,24 @@ /obj/machinery/clonepod/proc/update_clone_antag(var/mob/living/carbon/human/H) // Check to see if the clone's mind is an antagonist of any kind and handle them accordingly to make sure they get their spells, HUD/whatever else back. callHook("clone", list(H)) - if((H.mind in ticker.mode:revolutionaries) || (H.mind in ticker.mode:head_revolutionaries)) - ticker.mode.update_rev_icons_added() //So the icon actually appears - if(H.mind in ticker.mode.syndicates) - ticker.mode.update_synd_icons_added() - if(H.mind in ticker.mode.cult) - ticker.mode.add_cultist(occupant.mind) - ticker.mode.update_cult_icons_added() //So the icon actually appears - ticker.mode.update_cult_comms_added(H.mind) //So the comms actually appears - if((H.mind in ticker.mode.implanter) || (H.mind in ticker.mode.implanted)) - ticker.mode.update_traitor_icons_added(H.mind) //So the icon actually appears + if((H.mind in SSticker.mode:revolutionaries) || (H.mind in SSticker.mode:head_revolutionaries)) + SSticker.mode.update_rev_icons_added() //So the icon actually appears + if(H.mind in SSticker.mode.syndicates) + SSticker.mode.update_synd_icons_added() + if(H.mind in SSticker.mode.cult) + SSticker.mode.add_cultist(occupant.mind) + SSticker.mode.update_cult_icons_added() //So the icon actually appears + SSticker.mode.update_cult_comms_added(H.mind) //So the comms actually appears + if((H.mind in SSticker.mode.implanter) || (H.mind in SSticker.mode.implanted)) + SSticker.mode.update_traitor_icons_added(H.mind) //So the icon actually appears if(H.mind.vampire) H.mind.vampire.update_owner(H) - if((H.mind in ticker.mode.vampire_thralls) || (H.mind in ticker.mode.vampire_enthralled)) - ticker.mode.update_vampire_icons_added(H.mind) - if(H.mind in ticker.mode.changelings) - ticker.mode.update_change_icons_added(H.mind) - if((H.mind in ticker.mode.shadowling_thralls) || (H.mind in ticker.mode.shadows)) - ticker.mode.update_shadow_icons_added(H.mind) + if((H.mind in SSticker.mode.vampire_thralls) || (H.mind in SSticker.mode.vampire_enthralled)) + SSticker.mode.update_vampire_icons_added(H.mind) + if(H.mind in SSticker.mode.changelings) + SSticker.mode.update_change_icons_added(H.mind) + if((H.mind in SSticker.mode.shadowling_thralls) || (H.mind in SSticker.mode.shadows)) + SSticker.mode.update_shadow_icons_added(H.mind) //Put messages in the connected computer's temp var for display. /obj/machinery/clonepod/proc/connected_message(message) diff --git a/code/game/machinery/computer/ai_core.dm b/code/game/machinery/computer/ai_core.dm index 67f1dba85f0..38cc0b56866 100644 --- a/code/game/machinery/computer/ai_core.dm +++ b/code/game/machinery/computer/ai_core.dm @@ -134,8 +134,8 @@ return if(P:brainmob.mind) - ticker.mode.remove_cultist(P:brainmob.mind, 1) - ticker.mode.remove_revolutionary(P:brainmob.mind, 1) + SSticker.mode.remove_cultist(P:brainmob.mind, 1) + SSticker.mode.remove_revolutionary(P:brainmob.mind, 1) user.drop_item() P.loc = src diff --git a/code/game/machinery/computer/communications.dm b/code/game/machinery/computer/communications.dm index e369b203759..d064dbda743 100644 --- a/code/game/machinery/computer/communications.dm +++ b/code/game/machinery/computer/communications.dm @@ -439,7 +439,7 @@ to_chat(user, "The emergency shuttle may not be called while returning to Central Command.") return - if(ticker.mode.name == "blob") + if(SSticker.mode.name == "blob") to_chat(user, "Under directive 7-10, [station_name()] is quarantined until further notice.") return @@ -464,7 +464,7 @@ to_chat(user, "The shuttle is refueling. Please wait another [round((54000-world.time)/600)] minutes before trying again.") return - if(ticker.mode.name == "epidemic") + if(SSticker.mode.name == "epidemic") to_chat(user, "Under directive 7-10, [station_name()] is quarantined until further notice.") return @@ -481,7 +481,7 @@ /proc/cancel_call_proc(var/mob/user) - if(ticker.mode.name == "meteor") + if(SSticker.mode.name == "meteor") return if(SSshuttle.cancelEvac(user)) diff --git a/code/game/machinery/cryopod.dm b/code/game/machinery/cryopod.dm index 9674a60c7d4..0ab3d01ddf1 100644 --- a/code/game/machinery/cryopod.dm +++ b/code/game/machinery/cryopod.dm @@ -53,7 +53,7 @@ var/dat - if(!( ticker )) + if(!( SSticker )) return dat += "

[storage_name]
" @@ -364,13 +364,13 @@ // Skip past any cult sacrifice objective using this person if(GAMEMODE_IS_CULT && is_sacrifice_target(occupant.mind)) - var/datum/game_mode/cult/cult_mode = ticker.mode + var/datum/game_mode/cult/cult_mode = SSticker.mode var/list/p_s_t = cult_mode.get_possible_sac_targets() if(p_s_t.len) cult_mode.sacrifice_target = pick(p_s_t) - for(var/datum/mind/H in ticker.mode.cult) + for(var/datum/mind/H in SSticker.mode.cult) if(H.current) - to_chat(H.current, "[ticker.cultdat.entity_name] murmurs, [occupant] is beyond your reach. Sacrifice [cult_mode.sacrifice_target.current] instead...
") + to_chat(H.current, "[SSticker.cultdat.entity_name] murmurs, [occupant] is beyond your reach. Sacrifice [cult_mode.sacrifice_target.current] instead...") else cult_mode.bypass_phase() @@ -403,8 +403,8 @@ occupant.mind.objectives.Cut() occupant.mind.special_role = null else - if(ticker.mode.name == "AutoTraitor") - var/datum/game_mode/traitor/autotraitor/current_mode = ticker.mode + if(SSticker.mode.name == "AutoTraitor") + var/datum/game_mode/traitor/autotraitor/current_mode = SSticker.mode current_mode.possible_traitors.Remove(occupant) // Delete them from datacore. diff --git a/code/game/machinery/doors/windowdoor.dm b/code/game/machinery/doors/windowdoor.dm index 21ff909796f..f382af5259a 100644 --- a/code/game/machinery/doors/windowdoor.dm +++ b/code/game/machinery/doors/windowdoor.dm @@ -77,7 +77,7 @@ else do_animate("deny") return - if(!ticker) + if(!SSticker) return var/mob/living/M = AM if(!M.restrained() && M.mob_size > MOB_SIZE_TINY && (!(isrobot(M) && M.stat))) diff --git a/code/game/machinery/syndicatebeacon.dm b/code/game/machinery/syndicatebeacon.dm index 6422e94dc74..1a63371915b 100644 --- a/code/game/machinery/syndicatebeacon.dm +++ b/code/game/machinery/syndicatebeacon.dm @@ -57,8 +57,8 @@ return if(istype(M, /mob/living/carbon/human)) var/mob/living/carbon/human/N = M - ticker.mode.equip_traitor(N) - ticker.mode.traitors += N.mind + SSticker.mode.equip_traitor(N) + SSticker.mode.traitors += N.mind N.mind.special_role = SPECIAL_ROLE_TRAITOR var/objective = "Free Objective" switch(rand(1,100)) diff --git a/code/game/magic/Uristrunes.dm b/code/game/magic/Uristrunes.dm index 1a242594bfe..e0621db3d9b 100644 --- a/code/game/magic/Uristrunes.dm +++ b/code/game/magic/Uristrunes.dm @@ -1,7 +1,7 @@ /proc/get_rune_cult(word) var/animated - if(word && !(ticker.cultdat.theme == "fire" || ticker.cultdat.theme == "death")) + if(word && !(SSticker.cultdat.theme == "fire" || SSticker.cultdat.theme == "death")) animated = 1 else animated = 0 @@ -18,11 +18,11 @@ var/runetype = "rune" var/lookup = "[symbol_bits]-[animated]" - if(!ticker.mode)//work around for maps with runes and cultdat is not loaded all the way + if(!SSticker.mode)//work around for maps with runes and cultdat is not loaded all the way runetype = "rune" - else if(ticker.cultdat.theme == "fire") + else if(SSticker.cultdat.theme == "fire") runetype = "fire-rune" - else if(ticker.cultdat.theme == "death") + else if(SSticker.cultdat.theme == "death") runetype = "death-rune" diff --git a/code/game/objects/effects/decals/Cleanable/humans.dm b/code/game/objects/effects/decals/Cleanable/humans.dm index 7cfd8bbec45..45bfb37f035 100644 --- a/code/game/objects/effects/decals/Cleanable/humans.dm +++ b/code/game/objects/effects/decals/Cleanable/humans.dm @@ -28,7 +28,7 @@ var/global/list/image/splatter_cache = list() . = ..() update_icon() if(GAMEMODE_IS_CULT) - var/datum/game_mode/cult/mode_ticker = ticker.mode + var/datum/game_mode/cult/mode_ticker = SSticker.mode var/turf/T = get_turf(src) if(T && (is_station_level(T.z)))//F I V E T I L E S if(!(T in mode_ticker.bloody_floors)) @@ -48,7 +48,7 @@ var/global/list/image/splatter_cache = list() /obj/effect/decal/cleanable/blood/Destroy() if(GAMEMODE_IS_CULT) - var/datum/game_mode/cult/mode_ticker = ticker.mode + var/datum/game_mode/cult/mode_ticker = SSticker.mode var/turf/T = get_turf(src) if(T && (is_station_level(T.z))) mode_ticker.bloody_floors -= T diff --git a/code/game/objects/effects/effect_system/effect_system.dm b/code/game/objects/effects/effect_system/effect_system.dm index 1231c8136fa..04ea1dc0841 100644 --- a/code/game/objects/effects/effect_system/effect_system.dm +++ b/code/game/objects/effects/effect_system/effect_system.dm @@ -14,11 +14,11 @@ would spawn and follow the beaker, even if it is carried or thrown. /obj/effect/particle_effect/New() ..() - if(ticker) + if(SSticker) cameranet.updateVisibility(src) /obj/effect/particle_effect/Destroy() - if(ticker) + if(SSticker) cameranet.updateVisibility(src) return ..() diff --git a/code/game/objects/items/devices/flash.dm b/code/game/objects/items/devices/flash.dm index 2fb1aae8ff0..a618383a819 100644 --- a/code/game/objects/items/devices/flash.dm +++ b/code/game/objects/items/devices/flash.dm @@ -155,14 +155,14 @@ /obj/item/flash/proc/terrible_conversion_proc(mob/M, mob/user) if(ishuman(M) && ishuman(user) && M.stat != DEAD) - if(user.mind && (user.mind in ticker.mode.head_revolutionaries)) + if(user.mind && (user.mind in SSticker.mode.head_revolutionaries)) if(M.client) if(M.stat == CONSCIOUS) M.mind_initialize() //give them a mind datum if they don't have one. var/resisted if(!ismindshielded(M)) - if(user.mind in ticker.mode.head_revolutionaries) - if(ticker.mode.add_revolutionary(M.mind)) + if(user.mind in SSticker.mode.head_revolutionaries) + if(SSticker.mode.add_revolutionary(M.mind)) times_used -- //Flashes less likely to burn out for headrevs when used for conversion else resisted = 1 diff --git a/code/game/objects/items/devices/flashlight.dm b/code/game/objects/items/devices/flashlight.dm index e65c9a683a7..b051b2f732e 100644 --- a/code/game/objects/items/devices/flashlight.dm +++ b/code/game/objects/items/devices/flashlight.dm @@ -51,7 +51,7 @@ if(((CLUMSY in user.mutations) || user.getBrainLoss() >= 60) && prob(50)) //too dumb to use flashlight properly return ..() //just hit them in the head - if(!(istype(user, /mob/living/carbon/human) || ticker) && ticker.mode.name != "monkey") //don't have dexterity + if(!(istype(user, /mob/living/carbon/human) || SSticker) && SSticker.mode.name != "monkey") //don't have dexterity to_chat(user, "You don't have the dexterity to do this!") return diff --git a/code/game/objects/items/devices/uplinks.dm b/code/game/objects/items/devices/uplinks.dm index e5bbeef7686..c6cfe03a151 100644 --- a/code/game/objects/items/devices/uplinks.dm +++ b/code/game/objects/items/devices/uplinks.dm @@ -31,8 +31,8 @@ var/list/world_uplinks = list() /obj/item/uplink/New() ..() - welcome = ticker.mode.uplink_welcome - uses = ticker.mode.uplink_uses + welcome = SSticker.mode.uplink_welcome + uses = SSticker.mode.uplink_uses uplink_items = get_uplink_items() world_uplinks += src diff --git a/code/game/objects/items/robot/robot_parts.dm b/code/game/objects/items/robot/robot_parts.dm index 65f504b4ae0..5892381a993 100644 --- a/code/game/objects/items/robot/robot_parts.dm +++ b/code/game/objects/items/robot/robot_parts.dm @@ -245,7 +245,7 @@ to_chat(user, "Sticking a dead [M] into the frame would sort of defeat the purpose.") return - if(M.brainmob.mind in ticker.mode.head_revolutionaries) + if(M.brainmob.mind in SSticker.mode.head_revolutionaries) to_chat(user, "The frame's firmware lets out a shrill sound, and flashes 'Abnormal Memory Engram'. It refuses to accept the [M].") return diff --git a/code/game/objects/items/weapons/holy_weapons.dm b/code/game/objects/items/weapons/holy_weapons.dm index a20dd86c897..68e731b8c44 100644 --- a/code/game/objects/items/weapons/holy_weapons.dm +++ b/code/game/objects/items/weapons/holy_weapons.dm @@ -443,15 +443,15 @@ return ..() if(!user.mind || !user.mind.isholy) - to_chat(user, "You are not close enough with [ticker.Bible_deity_name] to use [src].") + to_chat(user, "You are not close enough with [SSticker.Bible_deity_name] to use [src].") return if(praying) to_chat(user, "You are already using [src].") return - user.visible_message("[user] kneels[M == user ? null : " next to [M]"] and begins to utter a prayer to [ticker.Bible_deity_name].", \ - "You kneel[M == user ? null : " next to [M]"] and begin a prayer to [ticker.Bible_deity_name].") + user.visible_message("[user] kneels[M == user ? null : " next to [M]"] and begins to utter a prayer to [SSticker.Bible_deity_name].", \ + "You kneel[M == user ? null : " next to [M]"] and begin a prayer to [SSticker.Bible_deity_name].") praying = 1 if(do_after(user, 150, target = M)) @@ -460,18 +460,18 @@ if(target.mind) if(iscultist(target)) - ticker.mode.remove_cultist(target.mind) // This proc will handle message generation. + SSticker.mode.remove_cultist(target.mind) // This proc will handle message generation. praying = 0 return if(target.mind.vampire && !target.mind.vampire.get_ability(/datum/vampire_passive/full)) // Getting a full prayer off on a vampire will interrupt their powers for a large duration. target.mind.vampire.nullified = max(120, target.mind.vampire.nullified + 120) - to_chat(target, "[user]'s prayer to [ticker.Bible_deity_name] has interfered with your power!") + to_chat(target, "[user]'s prayer to [SSticker.Bible_deity_name] has interfered with your power!") praying = 0 return if(prob(25)) - to_chat(target, "[user]'s prayer to [ticker.Bible_deity_name] has eased your pain!") + to_chat(target, "[user]'s prayer to [SSticker.Bible_deity_name] has eased your pain!") target.adjustToxLoss(-5) target.adjustOxyLoss(-5) target.adjustBruteLoss(-5) @@ -480,7 +480,7 @@ praying = 0 else - to_chat(user, "Your prayer to [ticker.Bible_deity_name] was interrupted.") + to_chat(user, "Your prayer to [SSticker.Bible_deity_name] was interrupted.") praying = 0 /obj/item/nullrod/rosary/process() @@ -506,13 +506,13 @@ /obj/item/nullrod/salt/attack_self(mob/user) if(!user.mind || !user.mind.isholy) - to_chat(user, "You are not close enough with [ticker.Bible_deity_name] to use [src].") + to_chat(user, "You are not close enough with [SSticker.Bible_deity_name] to use [src].") return if(!(ghostcall_CD > world.time)) ghostcall_CD = world.time + 3000 //deciseconds..5 minutes - user.visible_message("[user] kneels and begins to utter a prayer to [ticker.Bible_deity_name] while drawing a circle with salt!", \ - "You kneel and begin a prayer to [ticker.Bible_deity_name] while drawing a circle!") + user.visible_message("[user] kneels and begins to utter a prayer to [SSticker.Bible_deity_name] while drawing a circle with salt!", \ + "You kneel and begin a prayer to [SSticker.Bible_deity_name] while drawing a circle!") notify_ghosts("The Chaplain is calling ghosts to [get_area(src)] with [name]!", source = src) else to_chat(user, "You need to wait before using [src] again.") diff --git a/code/game/objects/items/weapons/implants/implant_mindshield.dm b/code/game/objects/items/weapons/implants/implant_mindshield.dm index 739fe2827e4..bc942b73d81 100644 --- a/code/game/objects/items/weapons/implants/implant_mindshield.dm +++ b/code/game/objects/items/weapons/implants/implant_mindshield.dm @@ -19,14 +19,14 @@ /obj/item/implant/mindshield/implant(mob/target) if(..()) - if(target.mind in ticker.mode.head_revolutionaries || is_shadow_or_thrall(target)) + if(target.mind in SSticker.mode.head_revolutionaries || is_shadow_or_thrall(target)) target.visible_message("[target] seems to resist the implant!", "You feel the corporate tendrils of Nanotrasen try to invade your mind!") removed(target, 1) qdel(src) return -1 - if(target.mind in ticker.mode.revolutionaries) - ticker.mode.remove_revolutionary(target.mind) - if(target.mind in ticker.mode.cult) + if(target.mind in SSticker.mode.revolutionaries) + SSticker.mode.remove_revolutionary(target.mind) + if(target.mind in SSticker.mode.cult) to_chat(target, "You feel the corporate tendrils of Nanotrasen try to invade your mind!") else to_chat(target, "Your mind feels hardened - more resistant to brainwashing.") diff --git a/code/game/objects/items/weapons/implants/implant_traitor.dm b/code/game/objects/items/weapons/implants/implant_traitor.dm index 58f78a7be4e..16d8943567d 100644 --- a/code/game/objects/items/weapons/implants/implant_traitor.dm +++ b/code/game/objects/items/weapons/implants/implant_traitor.dm @@ -45,15 +45,15 @@ return -1 H.implanting = 1 to_chat(H, "You feel completely loyal to [user.name].") - if(!(user.mind in ticker.mode.implanter)) - ticker.mode.implanter[ref] = list() - implanters = ticker.mode.implanter[ref] + if(!(user.mind in SSticker.mode.implanter)) + SSticker.mode.implanter[ref] = list() + implanters = SSticker.mode.implanter[ref] implanters.Add(H.mind) - ticker.mode.implanted.Add(H.mind) - ticker.mode.implanted[H.mind] = user.mind - //ticker.mode.implanter[user.mind] += H.mind - ticker.mode.implanter[ref] = implanters - ticker.mode.traitors += H.mind + SSticker.mode.implanted.Add(H.mind) + SSticker.mode.implanted[H.mind] = user.mind + //SSticker.mode.implanter[user.mind] += H.mind + SSticker.mode.implanter[ref] = implanters + SSticker.mode.traitors += H.mind H.mind.special_role = SPECIAL_ROLE_TRAITOR to_chat(H, "You're now completely loyal to [user.name]! You now must lay down your life to protect [user.p_them()] and assist in [user.p_their()] goals at any cost.") var/datum/objective/protect/mindslave/MS = new @@ -64,8 +64,8 @@ for(var/datum/objective/objective in H.mind.objectives) to_chat(H, "Objective #1: [objective.explanation_text]") - ticker.mode.update_traitor_icons_added(user.mind) - ticker.mode.update_traitor_icons_added(H.mind)//handles datahuds/observerhuds + SSticker.mode.update_traitor_icons_added(user.mind) + SSticker.mode.update_traitor_icons_added(H.mind)//handles datahuds/observerhuds if(user.mind.som)//do not add if not a traitor..and you just picked up an implanter in the hall... var/datum/mindslaves/slaved = user.mind.som @@ -77,12 +77,12 @@ log_admin("[key_name(user)] has mind-slaved [key_name(H)].") activated = 1 if(jobban_isbanned(M, ROLE_SYNDICATE)) - ticker.mode.replace_jobbanned_player(M, ROLE_SYNDICATE) + SSticker.mode.replace_jobbanned_player(M, ROLE_SYNDICATE) return 1 return 0 /obj/item/implant/traitor/removed(mob/target) if(..()) - ticker.mode.remove_traitor_mind(target.mind) + SSticker.mode.remove_traitor_mind(target.mind) return 1 return 0 \ No newline at end of file diff --git a/code/game/objects/items/weapons/staff.dm b/code/game/objects/items/weapons/staff.dm index 54ef5f06f85..15b0b914391 100644 --- a/code/game/objects/items/weapons/staff.dm +++ b/code/game/objects/items/weapons/staff.dm @@ -27,7 +27,7 @@ if(user) user.update_inv_l_hand() user.update_inv_r_hand() - if(user.mind in ticker.mode.wizards) + if(user.mind in SSticker.mode.wizards) user.flying = wielded ? 1 : 0 if(wielded) to_chat(user, "You hold \the [src] between your legs.") diff --git a/code/game/objects/items/weapons/storage/bible.dm b/code/game/objects/items/weapons/storage/bible.dm index dfa1bf97358..eb778b6a280 100644 --- a/code/game/objects/items/weapons/storage/bible.dm +++ b/code/game/objects/items/weapons/storage/bible.dm @@ -45,7 +45,7 @@ else M.LAssailant = user - if(!(istype(user, /mob/living/carbon/human) || ticker) && ticker.mode.name != "monkey") + if(!(istype(user, /mob/living/carbon/human) || SSticker) && SSticker.mode.name != "monkey") to_chat(user, "You don't have the dexterity to do this!") return if(!user.mind || !user.mind.isholy) diff --git a/code/game/objects/structures.dm b/code/game/objects/structures.dm index faf86394dba..58a2d0464fc 100644 --- a/code/game/objects/structures.dm +++ b/code/game/objects/structures.dm @@ -31,17 +31,17 @@ /obj/structure/New() ..() if(smooth) - if(ticker && ticker.current_state == GAME_STATE_PLAYING) + if(SSticker && SSticker.current_state == GAME_STATE_PLAYING) queue_smooth(src) queue_smooth_neighbors(src) icon_state = "" if(climbable) verbs += /obj/structure/proc/climb_on - if(ticker) + if(SSticker) cameranet.updateVisibility(src) /obj/structure/Destroy() - if(ticker) + if(SSticker) cameranet.updateVisibility(src) if(smooth) var/turf/T = get_turf(src) diff --git a/code/game/sound.dm b/code/game/sound.dm index 3846e2edeaa..d27239ae4e7 100644 --- a/code/game/sound.dm +++ b/code/game/sound.dm @@ -108,10 +108,10 @@ SEND_SOUND(src, sound(null, repeat = 0, wait = 0, channel = chan)) /client/proc/playtitlemusic() - if(!ticker || !ticker.login_music || config.disable_lobby_music) + if(!SSticker || !SSticker.login_music || config.disable_lobby_music) return if(prefs.sound & SOUND_LOBBY) - SEND_SOUND(src, sound(ticker.login_music, repeat = 0, wait = 0, volume = 85, channel = CHANNEL_LOBBYMUSIC)) // MAD JAMS + SEND_SOUND(src, sound(SSticker.login_music, repeat = 0, wait = 0, volume = 85, channel = CHANNEL_LOBBYMUSIC)) // MAD JAMS /proc/get_rand_frequency() return rand(32000, 55000) //Frequency stuff only works with 45kbps oggs. diff --git a/code/game/turfs/simulated/floor/plating.dm b/code/game/turfs/simulated/floor/plating.dm index f1172435b1b..069fefe8103 100644 --- a/code/game/turfs/simulated/floor/plating.dm +++ b/code/game/turfs/simulated/floor/plating.dm @@ -144,8 +144,8 @@ /turf/simulated/floor/engine/cult/New() ..() - if(ticker.mode)//only do this if the round is going..otherwise..fucking asteroid.. - icon_state = ticker.cultdat.cult_floor_icon_state + if(SSticker.mode)//only do this if the round is going..otherwise..fucking asteroid.. + icon_state = SSticker.cultdat.cult_floor_icon_state /turf/simulated/floor/engine/cult/narsie_act() return diff --git a/code/game/turfs/simulated/walls_misc.dm b/code/game/turfs/simulated/walls_misc.dm index 18492da2d00..d738b13b07f 100644 --- a/code/game/turfs/simulated/walls_misc.dm +++ b/code/game/turfs/simulated/walls_misc.dm @@ -12,9 +12,9 @@ /turf/simulated/wall/cult/New() ..() - if(ticker.mode)//game hasn't started offically don't do shit.. + if(SSticker.mode)//game hasn't started offically don't do shit.. new /obj/effect/temp_visual/cult/turf(src) - icon_state = ticker.cultdat.cult_wall_icon_state + icon_state = SSticker.cultdat.cult_wall_icon_state /turf/simulated/wall/cult/artificer name = "runed stone wall" diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index 677357cf170..26a71991afd 100644 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -38,7 +38,7 @@ ..() for(var/atom/movable/AM in src) Entered(AM) - if(smooth && ticker && ticker.current_state == GAME_STATE_PLAYING) + if(smooth && SSticker && SSticker.current_state == GAME_STATE_PLAYING) queue_smooth(src) /hook/startup/proc/smooth_world() @@ -403,7 +403,7 @@ return(2) /turf/proc/visibilityChanged() - if(ticker) + if(SSticker) cameranet.updateVisibility(src) /turf/attackby(obj/item/I, mob/user, params) @@ -456,7 +456,7 @@ blueprint_data += I /turf/proc/add_blueprints_preround(atom/movable/AM) - if(!ticker || ticker.current_state != GAME_STATE_PLAYING) + if(!SSticker || SSticker.current_state != GAME_STATE_PLAYING) add_blueprints(AM) /turf/proc/empty(turf_type=/turf/space) diff --git a/code/game/verbs/suicide.dm b/code/game/verbs/suicide.dm index 46d5c4e36ba..8febe20e840 100644 --- a/code/game/verbs/suicide.dm +++ b/code/game/verbs/suicide.dm @@ -59,7 +59,7 @@ to_chat(src, "You're already dead!") return - if(!ticker) + if(!SSticker) to_chat(src, "You can't commit suicide before the game starts!") return @@ -116,7 +116,7 @@ to_chat(src, "You're already dead!") return - if(!ticker) + if(!SSticker) to_chat(src, "You can't commit suicide before the game starts!") return diff --git a/code/game/world.dm b/code/game/world.dm index 86ca6d883bd..8106aca31d3 100644 --- a/code/game/world.dm +++ b/code/game/world.dm @@ -32,7 +32,6 @@ var/global/list/map_transition_config = MAP_TRANSITION_CONFIG processScheduler = new spawn(1) - processScheduler.deferSetupFor(/datum/controller/process/ticker) processScheduler.setup() @@ -122,10 +121,10 @@ var/world_topic_spam_protect_time = world.timeofday s["map_name"] = map_name ? map_name : "Unknown" if(key_valid) - if(ticker && ticker.mode) - s["real_mode"] = ticker.mode.name + if(SSticker && SSticker.mode) + s["real_mode"] = SSticker.mode.name s["security_level"] = get_security_level() - s["ticker_state"] = ticker.current_state + s["ticker_state"] = SSticker.current_state if(SSshuttle && SSshuttle.emergency) // Shuttle status, see /__DEFINES/stat.dm @@ -301,8 +300,8 @@ var/world_topic_spam_protect_time = world.timeofday if(!isnull(time)) delay = max(0,time) else - delay = ticker.restart_timeout - if(ticker.delay_end) + delay = SSticker.restart_timeout + if(SSticker.delay_end) to_chat(world, "An admin has delayed the round end.") return to_chat(world, "Rebooting world in [delay/10] [delay > 10 ? "seconds" : "second"]. [reason]") @@ -311,12 +310,12 @@ var/world_topic_spam_protect_time = world.timeofday var/sound_length = GLOB.round_end_sounds[round_end_sound] if(delay > sound_length) // If there's time, play the round-end sound before rebooting spawn(delay - sound_length) - if(!ticker.delay_end) + if(!SSticker.delay_end) world << round_end_sound sleep(delay) if(blackbox) blackbox.save_all_data_to_sql() - if(ticker.delay_end) + if(SSticker.delay_end) to_chat(world, "Reboot was cancelled by an admin.") return feedback_set_details("[feedback_c]","[feedback_r]") @@ -394,7 +393,7 @@ var/world_topic_spam_protect_time = world.timeofday s += "
" var/list/features = list() - if(ticker) + if(SSticker) if(master_mode && master_mode != "secret") features += master_mode else diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm index 4fcf95dbfd2..74b1aa00efd 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -572,7 +572,7 @@ var/global/nologevent = 0 delay = delay * 10 message_admins("[key_name_admin(usr)] has initiated a server restart with a delay of [delay/10] seconds") log_admin("[key_name(usr)] has initiated a server restart with a delay of [delay/10] seconds") - ticker.delay_end = 0 + SSticker.delay_end = 0 feedback_add_details("admin_verb","R") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! world.Reboot("Initiated by [usr.client.holder.fakekey ? "Admin" : usr.key].", "end_error", "admin reboot - by [usr.key] [usr.client.holder.fakekey ? "(stealth)" : ""]", delay) @@ -672,14 +672,14 @@ var/global/nologevent = 0 if(!check_rights(R_SERVER)) return - if(!ticker) + if(!SSticker) alert("Unable to start the game as it is not set up.") return - if(ticker.current_state == GAME_STATE_PREGAME) + if(SSticker.current_state == GAME_STATE_PREGAME) if(config.start_now_confirmation) if(alert(usr, "This is a live server. Are you sure you want to start now?", "Start game", "Yes", "No") != "Yes") return - ticker.current_state = GAME_STATE_SETTING_UP + SSticker.current_state = GAME_STATE_SETTING_UP log_admin("[key_name(usr)] has started the game.") message_admins("[key_name_admin(usr)] has started the game.") feedback_add_details("admin_verb","SN") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! @@ -763,10 +763,10 @@ var/global/nologevent = 0 if(!check_rights(R_SERVER)) return - if(!ticker || ticker.current_state != GAME_STATE_PREGAME) - ticker.delay_end = !ticker.delay_end - log_admin("[key_name(usr)] [ticker.delay_end ? "delayed the round end" : "has made the round end normally"].") - message_admins("[key_name(usr)] [ticker.delay_end ? "delayed the round end" : "has made the round end normally"].", 1) + if(!SSticker || SSticker.current_state != GAME_STATE_PREGAME) + SSticker.delay_end = !SSticker.delay_end + log_admin("[key_name(usr)] [SSticker.delay_end ? "delayed the round end" : "has made the round end normally"].") + message_admins("[key_name(usr)] [SSticker.delay_end ? "delayed the round end" : "has made the round end normally"].", 1) return //alert("Round end delayed", null, null, null, null, null) going = !( going ) if(!( going )) @@ -780,32 +780,32 @@ var/global/nologevent = 0 ////////////////////////////////////////////////////////////////////////////////////////////////ADMIN HELPER PROCS /proc/is_special_character(mob/M as mob) // returns 1 for specail characters and 2 for heroes of gamemode - if(!ticker || !ticker.mode) + if(!SSticker || !SSticker.mode) return 0 if(!istype(M)) return 0 - if((M.mind in ticker.mode.head_revolutionaries) || (M.mind in ticker.mode.revolutionaries)) - if(ticker.mode.config_tag == "revolution") + if((M.mind in SSticker.mode.head_revolutionaries) || (M.mind in SSticker.mode.revolutionaries)) + if(SSticker.mode.config_tag == "revolution") return 2 return 1 - if(M.mind in ticker.mode.cult) - if(ticker.mode.config_tag == "cult") + if(M.mind in SSticker.mode.cult) + if(SSticker.mode.config_tag == "cult") return 2 return 1 - if(M.mind in ticker.mode.syndicates) - if(ticker.mode.config_tag == "nuclear") + if(M.mind in SSticker.mode.syndicates) + if(SSticker.mode.config_tag == "nuclear") return 2 return 1 - if(M.mind in ticker.mode.wizards) - if(ticker.mode.config_tag == "wizard") + if(M.mind in SSticker.mode.wizards) + if(SSticker.mode.config_tag == "wizard") return 2 return 1 - if(M.mind in ticker.mode.changelings) - if(ticker.mode.config_tag == "changeling") + if(M.mind in SSticker.mode.changelings) + if(SSticker.mode.config_tag == "changeling") return 2 return 1 - if(M.mind in ticker.mode.abductors) - if(ticker.mode.config_tag == "abduction") + if(M.mind in SSticker.mode.abductors) + if(SSticker.mode.config_tag == "abduction") return 2 return 1 if(isrobot(M)) diff --git a/code/modules/admin/player_panel.dm b/code/modules/admin/player_panel.dm index 36c0e5cf90d..c530af2401e 100644 --- a/code/modules/admin/player_panel.dm +++ b/code/modules/admin/player_panel.dm @@ -403,9 +403,9 @@ /datum/admins/proc/check_antagonists() if(!check_rights(R_ADMIN)) return - if(ticker && ticker.current_state >= GAME_STATE_PLAYING) + if(SSticker && SSticker.current_state >= GAME_STATE_PLAYING) var/dat = "Round Status

Round Status

" - dat += "Current Game Mode: [ticker.mode.name]
" + dat += "Current Game Mode: [SSticker.mode.name]
" dat += "Round Duration: [round(ROUND_TIME / 36000)]:[add_zero(num2text(ROUND_TIME / 600 % 60), 2)]:[add_zero(num2text(ROUND_TIME / 10 % 60), 2)]
" dat += "Emergency shuttle
" if(SSshuttle.emergency.mode < SHUTTLE_CALL) @@ -418,10 +418,10 @@ else dat += "ETA: [(timeleft / 60) % 60]:[add_zero(num2text(timeleft % 60), 2)]
" - dat += "[ticker.delay_end ? "End Round Normally" : "Delay Round End"]
" - if(ticker.mode.syndicates.len) + dat += "[SSticker.delay_end ? "End Round Normally" : "Delay Round End"]
" + if(SSticker.mode.syndicates.len) dat += "
" - for(var/datum/mind/N in ticker.mode.syndicates) + for(var/datum/mind/N in SSticker.mode.syndicates) var/mob/M = N.current if(M) dat += check_antagonists_line(M) @@ -442,20 +442,20 @@ dat += "in [disk_loc.loc] at ([disk_loc.x], [disk_loc.y], [disk_loc.z])" dat += "
Syndicates
" - if(ticker.mode.head_revolutionaries.len || ticker.mode.revolutionaries.len) + if(SSticker.mode.head_revolutionaries.len || SSticker.mode.revolutionaries.len) dat += "
" - for(var/datum/mind/N in ticker.mode.head_revolutionaries) + for(var/datum/mind/N in SSticker.mode.head_revolutionaries) var/mob/M = N.current if(!M) dat += "" else dat += check_antagonists_line(M, "(leader)") - for(var/datum/mind/N in ticker.mode.revolutionaries) + for(var/datum/mind/N in SSticker.mode.revolutionaries) var/mob/M = N.current if(M) dat += check_antagonists_line(M) dat += "
Revolutionaries
Head Revolutionary not found!
" - for(var/datum/mind/N in ticker.mode.get_living_heads()) + for(var/datum/mind/N in SSticker.mode.get_living_heads()) var/mob/M = N.current if(M) dat += check_antagonists_line(M) @@ -466,7 +466,7 @@ dat += "
Target(s)Location
" if(GAMEMODE_IS_BLOB) - var/datum/game_mode/blob/mode = ticker.mode + var/datum/game_mode/blob/mode = SSticker.mode dat += "
" dat += "" @@ -479,67 +479,67 @@ dat += "" dat += "
Blob
Progress: [blobs.len]/[mode.blobwincount]
Blob not found!
" - if(ticker.mode.blob_overminds.len) - dat += check_role_table("Blob Overminds", ticker.mode.blob_overminds) + if(SSticker.mode.blob_overminds.len) + dat += check_role_table("Blob Overminds", SSticker.mode.blob_overminds) - if(ticker.mode.changelings.len) - dat += check_role_table("Changelings", ticker.mode.changelings) + if(SSticker.mode.changelings.len) + dat += check_role_table("Changelings", SSticker.mode.changelings) - if(ticker.mode.wizards.len) - dat += check_role_table("Wizards", ticker.mode.wizards) + if(SSticker.mode.wizards.len) + dat += check_role_table("Wizards", SSticker.mode.wizards) - if(ticker.mode.raiders.len) - dat += check_role_table("Raiders", ticker.mode.raiders) + if(SSticker.mode.raiders.len) + dat += check_role_table("Raiders", SSticker.mode.raiders) /*if(ticker.mode.ninjas.len) dat += check_role_table("Ninjas", ticker.mode.ninjas)*/ - if(ticker.mode.cult.len) - dat += check_role_table("Cultists", ticker.mode.cult, 0) + if(SSticker.mode.cult.len) + dat += check_role_table("Cultists", SSticker.mode.cult, 0) dat += "
use Cult Mindspeak" if(GAMEMODE_IS_CULT) - var/datum/game_mode/cult/cult_round = ticker.mode + var/datum/game_mode/cult/cult_round = SSticker.mode if(!cult_round.narsie_condition_cleared) dat += "
complete objective (debug)" - if(ticker.mode.traitors.len) - dat += check_role_table("Traitors", ticker.mode.traitors) + if(SSticker.mode.traitors.len) + dat += check_role_table("Traitors", SSticker.mode.traitors) - if(ticker.mode.shadows.len) - dat += check_role_table("Shadowlings", ticker.mode.shadows) + if(SSticker.mode.shadows.len) + dat += check_role_table("Shadowlings", SSticker.mode.shadows) - if(ticker.mode.shadowling_thralls.len) - dat += check_role_table("Shadowling Thralls", ticker.mode.shadowling_thralls) + if(SSticker.mode.shadowling_thralls.len) + dat += check_role_table("Shadowling Thralls", SSticker.mode.shadowling_thralls) - if(ticker.mode.abductors.len) - dat += check_role_table("Abductors", ticker.mode.abductors) + if(SSticker.mode.abductors.len) + dat += check_role_table("Abductors", SSticker.mode.abductors) - if(ticker.mode.abductees.len) - dat += check_role_table("Abductees", ticker.mode.abductees) + if(SSticker.mode.abductees.len) + dat += check_role_table("Abductees", SSticker.mode.abductees) - if(ticker.mode.vampires.len) - dat += check_role_table("Vampires", ticker.mode.vampires) + if(SSticker.mode.vampires.len) + dat += check_role_table("Vampires", SSticker.mode.vampires) - if(ticker.mode.vampire_enthralled.len) - dat += check_role_table("Vampire Thralls", ticker.mode.vampire_enthralled) + if(SSticker.mode.vampire_enthralled.len) + dat += check_role_table("Vampire Thralls", SSticker.mode.vampire_enthralled) - if(ticker.mode.devils.len) - dat += check_role_table("Devils", ticker.mode.devils) + if(SSticker.mode.devils.len) + dat += check_role_table("Devils", SSticker.mode.devils) - if(ticker.mode.xenos.len) - dat += check_role_table("Xenos", ticker.mode.xenos) + if(SSticker.mode.xenos.len) + dat += check_role_table("Xenos", SSticker.mode.xenos) - if(ticker.mode.superheroes.len) - dat += check_role_table("Superheroes", ticker.mode.superheroes) + if(SSticker.mode.superheroes.len) + dat += check_role_table("Superheroes", SSticker.mode.superheroes) - if(ticker.mode.supervillains.len) - dat += check_role_table("Supervillains", ticker.mode.supervillains) + if(SSticker.mode.supervillains.len) + dat += check_role_table("Supervillains", SSticker.mode.supervillains) - if(ticker.mode.greyshirts.len) - dat += check_role_table("Greyshirts", ticker.mode.greyshirts) + if(SSticker.mode.greyshirts.len) + dat += check_role_table("Greyshirts", SSticker.mode.greyshirts) - if(ticker.mode.eventmiscs.len) - dat += check_role_table("Event Roles", ticker.mode.eventmiscs) + if(SSticker.mode.eventmiscs.len) + dat += check_role_table("Event Roles", SSticker.mode.eventmiscs) if(ts_spiderlist.len) var/list/spider_minds = list() @@ -559,8 +559,8 @@ count_spiderlings += 1 dat += "
Growing TS on-station: [count_eggs] egg[count_eggs != 1 ? "s" : ""], [count_spiderlings] spiderling[count_spiderlings != 1 ? "s" : ""].
" - if(ticker.mode.ert.len) - dat += check_role_table("ERT", ticker.mode.ert) + if(SSticker.mode.ert.len) + dat += check_role_table("ERT", SSticker.mode.ert) dat += "" usr << browse(dat, "window=roundstatus;size=400x500") diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index 88d10abde98..f2be4898209 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -6,7 +6,7 @@ message_admins("[key_name_admin(usr)] has attempted to override the admin panel!") return - if(ticker.mode && ticker.mode.check_antagonists_topic(href, href_list)) + if(SSticker.mode && SSticker.mode.check_antagonists_topic(href, href_list)) check_antagonists() return @@ -315,9 +315,9 @@ else if(href_list["delay_round_end"]) if(!check_rights(R_SERVER)) return - ticker.delay_end = !ticker.delay_end - log_admin("[key_name(usr)] [ticker.delay_end ? "delayed the round end" : "has made the round end normally"].") - message_admins("[key_name_admin(usr)] [ticker.delay_end ? "delayed the round end" : "has made the round end normally"].", 1) + SSticker.delay_end = !SSticker.delay_end + log_admin("[key_name(usr)] [SSticker.delay_end ? "delayed the round end" : "has made the round end normally"].") + message_admins("[key_name_admin(usr)] [SSticker.delay_end ? "delayed the round end" : "has made the round end normally"].", 1) href_list["secretsadmin"] = "check_antagonist" else if(href_list["simplemake"]) @@ -1085,7 +1085,7 @@ else if(href_list["c_mode"]) if(!check_rights(R_ADMIN)) return - if(ticker && ticker.mode) + if(SSticker && SSticker.mode) return alert(usr, "The game has already started.", null, null, null, null) var/dat = {"What mode do you wish to play?
"} for(var/mode in config.modes) @@ -1098,7 +1098,7 @@ else if(href_list["f_secret"]) if(!check_rights(R_ADMIN)) return - if(ticker && ticker.mode) + if(SSticker && SSticker.mode) return alert(usr, "The game has already started.", null, null, null, null) if(master_mode != "secret") return alert(usr, "The game mode has to be secret!", null, null, null, null) @@ -1112,7 +1112,7 @@ else if(href_list["c_mode2"]) if(!check_rights(R_ADMIN|R_SERVER)) return - if(ticker && ticker.mode) + if(SSticker && SSticker.mode) return alert(usr, "The game has already started.", null, null, null, null) master_mode = href_list["c_mode2"] log_admin("[key_name(usr)] set the mode as [master_mode].") @@ -1125,7 +1125,7 @@ else if(href_list["f_secret2"]) if(!check_rights(R_ADMIN|R_SERVER)) return - if(ticker && ticker.mode) + if(SSticker && SSticker.mode) return alert(usr, "The game has already started.", null, null, null, null) if(master_mode != "secret") return alert(usr, "The game mode has to be secret!", null, null, null, null) @@ -1559,25 +1559,25 @@ alert("Couldn't locate cult mode datum! This shouldn't ever happen, tell a coder!") return - var/datum/game_mode/cult/cult_round = ticker.mode + var/datum/game_mode/cult/cult_round = SSticker.mode cult_round.bypass_phase() message_admins("Admin [key_name_admin(usr)] has unlocked the Cult's next objective.") log_admin("Admin [key_name_admin(usr)] has unlocked the Cult's next objective.") else if(href_list["cult_mindspeak"]) - var/input = stripped_input(usr, "Communicate to all the cultists with the voice of [ticker.cultdat.entity_name]", "Voice of [ticker.cultdat.entity_name]", "") + var/input = stripped_input(usr, "Communicate to all the cultists with the voice of [SSticker.cultdat.entity_name]", "Voice of [SSticker.cultdat.entity_name]", "") if(!input) return - for(var/datum/mind/H in ticker.mode.cult) + for(var/datum/mind/H in SSticker.mode.cult) if (H.current) - to_chat(H.current, "[ticker.cultdat.entity_name] murmurs, [input]") + to_chat(H.current, "[SSticker.cultdat.entity_name] murmurs, [input]") for(var/mob/dead/observer/O in GLOB.player_list) - to_chat(O, "[ticker.cultdat.entity_name] murmurs, [input]") + to_chat(O, "[SSticker.cultdat.entity_name] murmurs, [input]") - message_admins("Admin [key_name_admin(usr)] has talked with the Voice of [ticker.cultdat.entity_name].") - log_admin("[key_name(usr)] Voice of [ticker.cultdat.entity_name]: [input]") + message_admins("Admin [key_name_admin(usr)] has talked with the Voice of [SSticker.cultdat.entity_name].") + log_admin("[key_name(usr)] Voice of [SSticker.cultdat.entity_name]: [input]") else if(href_list["adminplayerobservecoodjump"]) if(!check_rights(R_ADMIN)) return @@ -1958,8 +1958,8 @@ kill_objective.target = H.mind kill_objective.explanation_text = "Assassinate [H.real_name], the [H.mind.assigned_role]." newtraitormind.objectives += kill_objective - ticker.mode.equip_traitor(newtraitor) - ticker.mode.traitors |= newtraitor.mind + SSticker.mode.equip_traitor(newtraitor) + SSticker.mode.traitors |= newtraitor.mind to_chat(newtraitor, "ATTENTION: It is time to pay your debt to the Syndicate...") to_chat(newtraitor, "You are now a traitor.") to_chat(newtraitor, "Goal: KILL [H.real_name], currently in [get_area(H.loc)]"); @@ -2341,7 +2341,7 @@ else if(href_list["traitor"]) if(!check_rights(R_ADMIN|R_MOD)) return - if(!ticker || !ticker.mode) + if(!SSticker || !SSticker.mode) alert("The game hasn't started yet!") return @@ -2484,7 +2484,7 @@ else if(href_list["kick_all_from_lobby"]) if(!check_rights(R_ADMIN)) return - if(ticker && ticker.current_state == GAME_STATE_PLAYING) + if(SSticker && SSticker.current_state == GAME_STATE_PLAYING) var/afkonly = text2num(href_list["afkonly"]) if(alert("Are you sure you want to kick all [afkonly ? "AFK" : ""] clients from the lobby?","Confirmation","Yes","Cancel") != "Yes") return @@ -2573,7 +2573,7 @@ feedback_inc("admin_secrets_fun_used",1) feedback_add_details("admin_secrets_fun_used","TriAI") if("gravity") - if(!(ticker && ticker.mode)) + if(!(SSticker && SSticker.mode)) to_chat(usr, "Please wait until the game starts! Not sure how it will work otherwise.") return gravity_is_on = !gravity_is_on @@ -2609,7 +2609,7 @@ message_admins("[key_name_admin(usr)] made all SMESs powered", 1) power_restore_quick() if("prisonwarp") - if(!ticker) + if(!SSticker) alert("The game hasn't started yet!", null, null, null, null, null) return feedback_inc("admin_secrets_fun_used",1) @@ -2651,7 +2651,7 @@ H.loc = pick(prisonsecuritywarp) prisonwarped += H if("traitor_all") - if(!ticker) + if(!SSticker) alert("The game hasn't started yet!") return var/objective = sanitize(copytext(input("Enter an objective"),1,MAX_MESSAGE_LEN)) @@ -2663,24 +2663,24 @@ if(H.stat == 2 || !H.client || !H.mind) continue if(is_special_character(H)) continue //traitorize(H, objective, 0) - ticker.mode.traitors += H.mind + SSticker.mode.traitors += H.mind H.mind.special_role = SPECIAL_ROLE_TRAITOR var/datum/objective/new_objective = new new_objective.owner = H new_objective.explanation_text = objective H.mind.objectives += new_objective - ticker.mode.greet_traitor(H.mind) + SSticker.mode.greet_traitor(H.mind) //ticker.mode.forge_traitor_objectives(H.mind) - ticker.mode.finalize_traitor(H.mind) + SSticker.mode.finalize_traitor(H.mind) for(var/mob/living/silicon/A in GLOB.player_list) - ticker.mode.traitors += A.mind + SSticker.mode.traitors += A.mind A.mind.special_role = SPECIAL_ROLE_TRAITOR var/datum/objective/new_objective = new new_objective.owner = A new_objective.explanation_text = objective A.mind.objectives += new_objective - ticker.mode.greet_traitor(A.mind) - ticker.mode.finalize_traitor(A.mind) + SSticker.mode.greet_traitor(A.mind) + SSticker.mode.finalize_traitor(A.mind) message_admins("[key_name_admin(usr)] used everyone is a traitor secret. Objective is [objective]", 1) log_admin("[key_name(usr)] used everyone is a traitor secret. Objective is [objective]") @@ -2946,10 +2946,10 @@ if("showailaws") output_ai_laws() if("showgm") - if(!ticker) + if(!SSticker) alert("The game hasn't started yet!") - else if(ticker.mode) - alert("The game mode is [ticker.mode.name]") + else if(SSticker.mode) + alert("The game mode is [SSticker.mode.name]") else alert("For some reason there's a ticker, but not a game mode") if("manifest") var/dat = "Showing Crew Manifest.
" @@ -3284,7 +3284,7 @@ return G.report_message = description message_admins("[key_name_admin(usr)] created \"[G.name]\" station goal.") - ticker.mode.station_goals += G + SSticker.mode.station_goals += G modify_goals() else if(href_list["showdetails"]) @@ -3408,7 +3408,7 @@ protect_objective.target = H.mind protect_objective.explanation_text = "Protect [H.real_name], the [H.mind.assigned_role]." hunter_mind.objectives += protect_objective - ticker.mode.traitors |= hunter_mob.mind + SSticker.mode.traitors |= hunter_mob.mind to_chat(hunter_mob, "ATTENTION: You are now on a mission!") to_chat(hunter_mob, "Goal: [killthem ? "MURDER" : "PROTECT"] [H.real_name], currently in [get_area(H.loc)]. "); if(killthem) diff --git a/code/modules/admin/verbs/cinematic.dm b/code/modules/admin/verbs/cinematic.dm index 3449350e11f..63ebd52d09b 100644 --- a/code/modules/admin/verbs/cinematic.dm +++ b/code/modules/admin/verbs/cinematic.dm @@ -3,7 +3,7 @@ set category = "Debug" set desc = "Shows a cinematic." // Intended for testing but I thought it might be nice for events on the rare occasion Feel free to comment it out if it's not wanted. set hidden = 1 - if(!ticker) + if(!SSticker) return switch(cinematic) if("explosion") @@ -14,4 +14,4 @@ override = input(src, "mode = ?","Enter Parameter", null) as anything in list("nuclear emergency", "fake", "no override") if(0) override = input(src, "mode = ?","Enter Parameter", null) as anything in list("blob", "nuclear emergency", "AI malfunction", "no override") - ticker.station_explosion_cinematic(parameter, override) \ No newline at end of file + SSticker.station_explosion_cinematic(parameter, override) \ No newline at end of file diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm index 3492061f1f6..2aabeba57e9 100644 --- a/code/modules/admin/verbs/debug.dm +++ b/code/modules/admin/verbs/debug.dm @@ -215,7 +215,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that if(!check_rights(R_SPAWN)) return - if(!ticker) + if(!SSticker) alert("Wait until the game starts") return if(istype(M, /mob/living/carbon/human)) @@ -233,7 +233,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that if(!check_rights(R_SPAWN)) return - if(!ticker) + if(!SSticker) alert("Wait until the game starts") return @@ -293,7 +293,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that if(!check_rights(R_SPAWN)) return - if(!ticker) + if(!SSticker) alert("Wait until the game starts") return if(ishuman(M)) @@ -313,7 +313,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that if(!check_rights(R_SPAWN)) return - if(!ticker) + if(!SSticker) alert("Wait until the game starts") return if(ishuman(M)) @@ -333,7 +333,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that if(!check_rights(R_SPAWN)) return - if(!ticker) + if(!SSticker) alert("Wait until the game starts") return if(ishuman(M)) @@ -405,7 +405,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that if(!check_rights(R_EVENT)) return - if(!ticker) + if(!SSticker) alert("Wait until the game starts") return if(istype(M, /mob/living/carbon/human)) @@ -818,7 +818,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that if(!check_rights(R_SPAWN)) return - if(!ticker) + if(!SSticker) alert("Wait until the game starts") return if(istype(M, /mob/living/carbon)) diff --git a/code/modules/admin/verbs/gimmick_team.dm b/code/modules/admin/verbs/gimmick_team.dm index 081c820aaee..cad93e8b880 100644 --- a/code/modules/admin/verbs/gimmick_team.dm +++ b/code/modules/admin/verbs/gimmick_team.dm @@ -7,7 +7,7 @@ set desc = "Spawns a group of players in the specified outfit." if(!check_rights(R_EVENT)) return - if(!ticker) + if(!SSticker) alert("The game hasn't started yet!") return if(alert("Do you want to spawn a Gimmick Team at YOUR CURRENT LOCATION?",,"Yes","No")=="No") @@ -82,7 +82,7 @@ H.mind.store_memory("[themission]

") if(is_syndicate) - ticker.mode.traitors |= H.mind //Adds them to extra antag list + SSticker.mode.traitors |= H.mind //Adds them to extra antag list players_spawned++ if(players_spawned >= teamsize) diff --git a/code/modules/admin/verbs/honksquad.dm b/code/modules/admin/verbs/honksquad.dm index b4c0e6a05eb..f4013edbe1e 100644 --- a/code/modules/admin/verbs/honksquad.dm +++ b/code/modules/admin/verbs/honksquad.dm @@ -4,7 +4,7 @@ var/const/honksquad_possible = 6 //if more Commandos are needed in the future var/global/sent_honksquad = 0 /client/proc/honksquad() - if(!ticker) + if(!SSticker) to_chat(usr, "The game hasn't started yet!") return if(world.time < 6000) @@ -95,7 +95,7 @@ var/global/sent_honksquad = 0 new_honksquad.mind.special_role = SPECIAL_ROLE_HONKSQUAD new_honksquad.mind.offstation_role = TRUE new_honksquad.add_language("Clownish") - ticker.mode.traitors |= new_honksquad.mind//Adds them to current traitor list. Which is really the extra antagonist list. + SSticker.mode.traitors |= new_honksquad.mind//Adds them to current traitor list. Which is really the extra antagonist list. new_honksquad.equip_honksquad(honk_leader_selected) return new_honksquad diff --git a/code/modules/admin/verbs/infiltratorteam_syndicate.dm b/code/modules/admin/verbs/infiltratorteam_syndicate.dm index 551076be62a..dad253eed3d 100644 --- a/code/modules/admin/verbs/infiltratorteam_syndicate.dm +++ b/code/modules/admin/verbs/infiltratorteam_syndicate.dm @@ -10,7 +10,7 @@ var/global/sent_syndicate_infiltration_team = 0 if(!check_rights(R_ADMIN)) to_chat(src, "Only administrators may use this command.") return - if(!ticker) + if(!SSticker) alert("The game hasn't started yet!") return if(alert("Do you want to send in the Syndicate Infiltration Team?",,"Yes","No")=="No") @@ -132,7 +132,7 @@ var/global/sent_syndicate_infiltration_team = 0 new_syndicate_infiltrator.mind.assigned_role = "Syndicate Infiltrator" new_syndicate_infiltrator.mind.special_role = "Syndicate Infiltrator" new_syndicate_infiltrator.mind.offstation_role = TRUE //they can flee to z2 so make them inelligible as antag targets - ticker.mode.traitors |= new_syndicate_infiltrator.mind //Adds them to extra antag list + SSticker.mode.traitors |= new_syndicate_infiltrator.mind //Adds them to extra antag list new_syndicate_infiltrator.equip_syndicate_infiltrator(syndicate_leader_selected, uplink_tc, is_mgmt) return new_syndicate_infiltrator diff --git a/code/modules/admin/verbs/one_click_antag.dm b/code/modules/admin/verbs/one_click_antag.dm index 4b3905f37e2..ab7a8ab75e8 100644 --- a/code/modules/admin/verbs/one_click_antag.dm +++ b/code/modules/admin/verbs/one_click_antag.dm @@ -175,7 +175,7 @@ client/proc/one_click_antag() for(var/i = 0, iYou are a Vox Primalis, fresh out of the Shoal. Your ship has arrived at the Tau Ceti system hosting the NSV Exodus... or was it the Luna? NSS? Utopia? Nobody is really sure, but everyong is raring to start pillaging! Your current goal is: [input]") to_chat(new_vox, "Don't forget to turn on your nitrogen internals!") diff --git a/code/modules/admin/verbs/onlyone.dm b/code/modules/admin/verbs/onlyone.dm index c2260a051eb..3db8f102320 100644 --- a/code/modules/admin/verbs/onlyone.dm +++ b/code/modules/admin/verbs/onlyone.dm @@ -1,5 +1,5 @@ /client/proc/only_one() - if(!ticker) + if(!SSticker) alert("The game hasn't started yet!") return @@ -14,7 +14,7 @@ var/datum/preferences/A = new() // Randomize appearance A.copy_to(H) - ticker.mode.traitors += H.mind + SSticker.mode.traitors += H.mind H.mind.special_role = SPECIAL_ROLE_TRAITOR var/datum/objective/hijack/hijack_objective = new @@ -58,7 +58,7 @@ world << sound('sound/music/thunderdome.ogg') /client/proc/only_me() - if(!ticker) + if(!SSticker) alert("The game hasn't started yet!") return @@ -66,7 +66,7 @@ if(H.stat == 2 || !(H.client)) continue if(is_special_character(H)) continue - ticker.mode.traitors += H.mind + SSticker.mode.traitors += H.mind H.mind.special_role = "[H.real_name] Prime" var/datum/objective/hijackclone/hijack_objective = new /datum/objective/hijackclone diff --git a/code/modules/admin/verbs/onlyoneteam.dm b/code/modules/admin/verbs/onlyoneteam.dm index d2490cdf9c3..846a77c508a 100644 --- a/code/modules/admin/verbs/onlyoneteam.dm +++ b/code/modules/admin/verbs/onlyoneteam.dm @@ -1,5 +1,5 @@ /client/proc/only_one_team() - if(!ticker) + if(!SSticker) alert("The game hasn't started yet!") return diff --git a/code/modules/admin/verbs/pray.dm b/code/modules/admin/verbs/pray.dm index 1c75421f4b7..b6986f4960f 100644 --- a/code/modules/admin/verbs/pray.dm +++ b/code/modules/admin/verbs/pray.dm @@ -18,8 +18,8 @@ var/prayer_type = "PRAYER" var/deity if(usr.job == "Chaplain") - if(ticker && ticker.Bible_deity_name) - deity = ticker.Bible_deity_name + if(SSticker && SSticker.Bible_deity_name) + deity = SSticker.Bible_deity_name cross = image('icons/obj/storage.dmi',"kingyellow") font_color = "blue" prayer_type = "CHAPLAIN PRAYER" @@ -27,7 +27,7 @@ cross = image('icons/obj/storage.dmi',"tome") font_color = "red" prayer_type = "CULTIST PRAYER" - deity = ticker.cultdat.entity_name + deity = SSticker.cultdat.entity_name log_say("(PRAYER) [msg]", usr) msg = "[bicon(cross)][prayer_type][deity ? " (to [deity])" : ""][mind && mind.isholy ? " (blessings: [mind.num_blessed])" : ""]: [key_name(src, 1)] ([ADMIN_QUE(src,"?")]) ([ADMIN_PP(src,"PP")]) ([ADMIN_VV(src,"VV")]) ([ADMIN_SM(src,"SM")]) ([admin_jump_link(src)]) (CA) ([ADMIN_SC(src,"SC")]) (BLESS) (SMITE): [msg]" diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm index 15ee321656c..65ea0b17dbc 100644 --- a/code/modules/admin/verbs/randomverbs.dm +++ b/code/modules/admin/verbs/randomverbs.dm @@ -437,11 +437,11 @@ Traitors and the like can also be revived with the previous role mostly intact. if("traitor") SSjobs.AssignRank(new_character, new_character.mind.assigned_role, 0) SSjobs.EquipRank(new_character, new_character.mind.assigned_role, 1) - ticker.mode.equip_traitor(new_character) + SSticker.mode.equip_traitor(new_character) if("Wizard") new_character.loc = pick(wizardstart) //ticker.mode.learn_basic_spells(new_character) - ticker.mode.equip_wizard(new_character) + SSticker.mode.equip_wizard(new_character) if("Syndicate") var/obj/effect/landmark/synd_spawn = locate("landmark*Syndicate-Spawn") if(synd_spawn) @@ -858,7 +858,7 @@ Traitors and the like can also be revived with the previous role mostly intact. set category = "Admin" set name = "Toggle Deny Shuttle" - if(!ticker) + if(!SSticker) return if(!check_rights(R_ADMIN)) @@ -891,12 +891,12 @@ Traitors and the like can also be revived with the previous role mostly intact. if(!check_rights(R_SERVER|R_EVENT)) return - if(ticker && ticker.mode) + if(SSticker && SSticker.mode) to_chat(usr, "Nope you can't do this, the game's already started. This only works before rounds!") return - if(ticker.random_players) - ticker.random_players = 0 + if(SSticker.random_players) + SSticker.random_players = 0 message_admins("Admin [key_name_admin(usr)] has disabled \"Everyone is Special\" mode.", 1) to_chat(usr, "Disabled.") return @@ -914,7 +914,7 @@ Traitors and the like can also be revived with the previous role mostly intact. to_chat(usr, "Remember: you can always disable the randomness by using the verb again, assuming the round hasn't started yet.") - ticker.random_players = 1 + SSticker.random_players = 1 feedback_add_details("admin_verb","MER") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/toggle_random_events() @@ -1009,13 +1009,13 @@ Traitors and the like can also be revived with the previous role mostly intact. if(!check_rights(R_EVENT)) return - if(ticker.mode.ert_disabled) - ticker.mode.ert_disabled = 0 + if(SSticker.mode.ert_disabled) + SSticker.mode.ert_disabled = 0 to_chat(usr, "ERT has been Enabled.") log_admin("Admin [key_name(src)] has enabled ERT calling.") message_admins("Admin [key_name_admin(usr)] has enabled ERT calling.", 1) else - ticker.mode.ert_disabled = 1 + SSticker.mode.ert_disabled = 1 to_chat(usr, "ERT has been Disabled.") log_admin("Admin [key_name(src)] has disabled ERT calling.") message_admins("Admin [key_name_admin(usr)] has disabled ERT calling.", 1) @@ -1033,14 +1033,14 @@ Traitors and the like can also be revived with the previous role mostly intact. if(!input) return - if(!ticker) + if(!SSticker) return - ticker.selected_tip = input + SSticker.selected_tip = input // If we've already tipped, then send it straight away. - if(ticker.tipped) - ticker.send_tip_of_the_round() + if(SSticker.tipped) + SSticker.send_tip_of_the_round() message_admins("[key_name_admin(usr)] sent a Tip of the round.") log_admin("[key_name(usr)] sent \"[input]\" as the Tip of the Round.") @@ -1055,12 +1055,12 @@ Traitors and the like can also be revived with the previous role mostly intact. holder.modify_goals() /datum/admins/proc/modify_goals() - if(!ticker || !ticker.mode) + if(!SSticker || !SSticker.mode) to_chat(usr, "This verb can only be used if the round has started.") return var/dat = "" - for(var/datum/station_goal/S in ticker.mode.station_goals) + for(var/datum/station_goal/S in SSticker.mode.station_goals) dat += "[S.name] - Announce | Remove
" dat += "
Add New Goal" usr << browse(dat, "window=goals;size=400x400") diff --git a/code/modules/admin/verbs/striketeam.dm b/code/modules/admin/verbs/striketeam.dm index a23e6eea69c..4b555bc724a 100644 --- a/code/modules/admin/verbs/striketeam.dm +++ b/code/modules/admin/verbs/striketeam.dm @@ -4,7 +4,7 @@ var/const/commandos_possible = 6 //if more Commandos are needed in the future var/global/sent_strike_team = 0 /client/proc/strike_team() - if(!ticker) + if(!SSticker) to_chat(usr, "The game hasn't started yet!") return if(sent_strike_team == 1) @@ -86,9 +86,9 @@ var/global/sent_strike_team = 0 R.mind.assigned_role = SPECIAL_ROLE_DEATHSQUAD R.mind.special_role = SPECIAL_ROLE_DEATHSQUAD R.mind.offstation_role = TRUE - if(!(R.mind in ticker.minds)) - ticker.minds += R.mind - ticker.mode.traitors += R.mind + if(!(R.mind in SSticker.minds)) + SSticker.minds += R.mind + SSticker.mode.traitors += R.mind R.key = ghost_mob.key if(nuke_code) R.mind.store_memory("Nuke Code: [nuke_code].") @@ -150,7 +150,7 @@ var/global/sent_strike_team = 0 new_commando.mind_initialize() new_commando.mind.assigned_role = SPECIAL_ROLE_DEATHSQUAD new_commando.mind.special_role = SPECIAL_ROLE_DEATHSQUAD - ticker.mode.traitors |= new_commando.mind//Adds them to current traitor list. Which is really the extra antagonist list. + SSticker.mode.traitors |= new_commando.mind//Adds them to current traitor list. Which is really the extra antagonist list. new_commando.equip_death_commando(is_leader) return new_commando diff --git a/code/modules/admin/verbs/striketeam_syndicate.dm b/code/modules/admin/verbs/striketeam_syndicate.dm index bf20d2b5503..7e77fe17df7 100644 --- a/code/modules/admin/verbs/striketeam_syndicate.dm +++ b/code/modules/admin/verbs/striketeam_syndicate.dm @@ -9,7 +9,7 @@ var/global/sent_syndicate_strike_team = 0 if(!src.holder) to_chat(src, "Only administrators may use this command.") return - if(!ticker) + if(!SSticker) alert("The game hasn't started yet!") return if(sent_syndicate_strike_team == 1) @@ -117,7 +117,7 @@ var/global/sent_syndicate_strike_team = 0 new_syndicate_commando.mind.assigned_role = SPECIAL_ROLE_SYNDICATE_DEATHSQUAD new_syndicate_commando.mind.special_role = SPECIAL_ROLE_SYNDICATE_DEATHSQUAD new_syndicate_commando.mind.offstation_role = TRUE - ticker.mode.traitors |= new_syndicate_commando.mind //Adds them to current traitor list. Which is really the extra antagonist list. + SSticker.mode.traitors |= new_syndicate_commando.mind //Adds them to current traitor list. Which is really the extra antagonist list. new_syndicate_commando.equip_syndicate_commando(is_leader) qdel(spawn_location) return new_syndicate_commando diff --git a/code/modules/admin/verbs/tripAI.dm b/code/modules/admin/verbs/tripAI.dm index 10ad3f07020..98a4bf82e98 100644 --- a/code/modules/admin/verbs/tripAI.dm +++ b/code/modules/admin/verbs/tripAI.dm @@ -2,21 +2,21 @@ set category = "Event" set name = "Create AI Triumvirate" - if(ticker.current_state > GAME_STATE_PREGAME) + if(SSticker.current_state > GAME_STATE_PREGAME) to_chat(usr, "This option is currently only usable during pregame. This may change at a later date.") return - if(SSjobs && ticker) + if(SSjobs && SSticker) var/datum/job/job = SSjobs.GetJob("AI") if(!job) to_chat(usr, "Unable to locate the AI job") return - if(ticker.triai) - ticker.triai = 0 + if(SSticker.triai) + SSticker.triai = 0 to_chat(usr, "Only one AI will be spawned at round start.") message_admins("[key_name_admin(usr)] has toggled off triple AIs at round start.", 1) else - ticker.triai = 1 + SSticker.triai = 1 to_chat(usr, "There will be an AI Triumvirate at round start.") message_admins("[key_name_admin(usr)] has toggled on triple AIs at round start.", 1) return diff --git a/code/modules/antagonists/_common/antag_spawner.dm b/code/modules/antagonists/_common/antag_spawner.dm index 5e434887ee0..6faef9a4df5 100644 --- a/code/modules/antagonists/_common/antag_spawner.dm +++ b/code/modules/antagonists/_common/antag_spawner.dm @@ -26,7 +26,7 @@ if(used) to_chat(user, "[src] is out of power!") return FALSE - if(!(user.mind in ticker.mode.syndicates)) + if(!(user.mind in SSticker.mode.syndicates)) to_chat(user, "AUTHENTICATION FAILURE. ACCESS DENIED.") return FALSE if(checking) @@ -62,27 +62,27 @@ /obj/item/antag_spawner/nuke_ops/spawn_antag(client/C, turf/T, kind, datum/mind/user) var/mob/living/carbon/human/M = new/mob/living/carbon/human(T) - var/agent_number = LAZYLEN(ticker.mode.syndicates) + var/agent_number = LAZYLEN(SSticker.mode.syndicates) M.real_name = "[syndicate_name()] Operative #[agent_number]" set_syndicate_values(C, M) - ticker.mode.create_syndicate(M.mind) - ticker.mode.equip_syndicate(M, 0) - ticker.mode.update_syndicate_id(M.mind, FALSE) + SSticker.mode.create_syndicate(M.mind) + SSticker.mode.equip_syndicate(M, 0) + SSticker.mode.update_syndicate_id(M.mind, FALSE) /obj/item/antag_spawner/nuke_ops/proc/set_syndicate_values(client/C, mob/living/M) M.key = C.key - ticker.mode.syndicates += M.mind - ticker.mode.update_synd_icons_added(M.mind) + SSticker.mode.syndicates += M.mind + SSticker.mode.update_synd_icons_added(M.mind) M.mind.assigned_role = SPECIAL_ROLE_NUKEOPS M.mind.special_role = SPECIAL_ROLE_NUKEOPS M.mind.offstation_role = TRUE M.faction = list("syndicate") - ticker.mode.forge_syndicate_objectives(M.mind) - ticker.mode.greet_syndicate(M.mind) + SSticker.mode.forge_syndicate_objectives(M.mind) + SSticker.mode.greet_syndicate(M.mind) //////SYNDICATE BORG /obj/item/antag_spawner/nuke_ops/borg_tele @@ -115,7 +115,7 @@ return TRUE /obj/item/antag_spawner/nuke_ops/borg_tele/spawn_antag(client/C, turf/T, datum/mind/user) - if(!(user in ticker.mode.syndicates)) + if(!(user in SSticker.mode.syndicates)) used = FALSE return @@ -147,7 +147,7 @@ set_syndicate_values(user.current.client, R) L.key = C.key - ticker.mode.greet_syndicate(L.mind) + SSticker.mode.greet_syndicate(L.mind) ///////////SLAUGHTER DEMON @@ -195,7 +195,7 @@ S.key = C.key S.mind.assigned_role = S.name S.mind.special_role = S.name - ticker.mode.traitors += S.mind + SSticker.mode.traitors += S.mind var/datum/objective/assassinate/KillDaWiz = new /datum/objective/assassinate KillDaWiz.owner = S.mind KillDaWiz.target = user.mind @@ -264,7 +264,7 @@ M.mind.assigned_role = SPECIAL_ROLE_MORPH M.mind.special_role = SPECIAL_ROLE_MORPH to_chat(M, M.playstyle_string) - ticker.mode.traitors += M.mind + SSticker.mode.traitors += M.mind var/datum/objective/assassinate/KillDaWiz = new /datum/objective/assassinate KillDaWiz.owner = M.mind KillDaWiz.target = user.mind diff --git a/code/modules/awaymissions/corpse.dm b/code/modules/awaymissions/corpse.dm index 33e12abe788..e213843df8c 100644 --- a/code/modules/awaymissions/corpse.dm +++ b/code/modules/awaymissions/corpse.dm @@ -34,7 +34,7 @@ /obj/effect/mob_spawn/attack_ghost(mob/user) var/mob/dead/observer/O = user - if(ticker.current_state != GAME_STATE_PLAYING || !loc || !ghost_usable) + if(SSticker.current_state != GAME_STATE_PLAYING || !loc || !ghost_usable) return if(!uses) to_chat(user, "This spawner is out of charges!") diff --git a/code/modules/clothing/shoes/magboots.dm b/code/modules/clothing/shoes/magboots.dm index ed4471d7b7c..1805d911caa 100644 --- a/code/modules/clothing/shoes/magboots.dm +++ b/code/modules/clothing/shoes/magboots.dm @@ -83,7 +83,7 @@ obj/item/clothing/shoes/magboots/syndie/advance //For the Syndicate Strike Team /obj/item/clothing/shoes/magboots/wizard/attack_self(mob/user) if(user) - if(user.mind in ticker.mode.wizards) + if(user.mind in SSticker.mode.wizards) if(magpulse) //faint blue light when shoes are turned on gives a reason to turn them off when not needed in maint set_light(0) else diff --git a/code/modules/events/abductor.dm b/code/modules/events/abductor.dm index 18d75f3ef30..3c7dcc6496b 100644 --- a/code/modules/events/abductor.dm +++ b/code/modules/events/abductor.dm @@ -13,11 +13,11 @@ if(candidates.len >= 2) //Oh god why we can't have static functions - var/number = ticker.mode.abductor_teams + 1 + var/number = SSticker.mode.abductor_teams + 1 var/datum/game_mode/abduction/temp - if(ticker.mode.config_tag == "abduction") - temp = ticker.mode + if(SSticker.mode.config_tag == "abduction") + temp = SSticker.mode else temp = new @@ -42,10 +42,10 @@ temp.make_abductor_team(number,preset_scientist=scientist_mind,preset_agent=agent_mind) temp.post_setup_team(number) - ticker.mode.abductor_teams++ + SSticker.mode.abductor_teams++ - if(ticker.mode.config_tag != "abduction") - ticker.mode.abductors |= temp.abductors + if(SSticker.mode.config_tag != "abduction") + SSticker.mode.abductors |= temp.abductors processing = 1 //So it will get gc'd return 1 else diff --git a/code/modules/events/alien_infestation.dm b/code/modules/events/alien_infestation.dm index 7e4473cb0d2..590ff374ad6 100644 --- a/code/modules/events/alien_infestation.dm +++ b/code/modules/events/alien_infestation.dm @@ -27,8 +27,8 @@ GLOB.respawnable_list -= C.client var/mob/living/carbon/alien/larva/new_xeno = new(vent.loc) new_xeno.key = C.key - if(ticker && ticker.mode) - ticker.mode.xenos += new_xeno.mind + if(SSticker && SSticker.mode) + SSticker.mode.xenos += new_xeno.mind spawncount-- successSpawn = 1 diff --git a/code/modules/karma/karma.dm b/code/modules/karma/karma.dm index 107ec3c4f3f..57063b0d743 100644 --- a/code/modules/karma/karma.dm +++ b/code/modules/karma/karma.dm @@ -59,7 +59,7 @@ var/list/karma_spenders = list() if(config.disable_karma) to_chat(src, "Karma is disabled.") return FALSE - if(!ticker || !GLOB.player_list.len || (ticker.current_state == GAME_STATE_PREGAME)) + if(!SSticker || !GLOB.player_list.len || (SSticker.current_state == GAME_STATE_PREGAME)) to_chat(src, "You can't award karma until the game has started.") return FALSE if(client.karma_spent || (ckey in karma_spenders)) diff --git a/code/modules/library/computers/checkout.dm b/code/modules/library/computers/checkout.dm index 10e747b4e31..638aaeee7c3 100644 --- a/code/modules/library/computers/checkout.dm +++ b/code/modules/library/computers/checkout.dm @@ -320,11 +320,11 @@ if(!bibledelay) var/obj/item/storage/bible/B = new /obj/item/storage/bible(src.loc) - if(ticker && ( ticker.Bible_icon_state && ticker.Bible_item_state) ) - B.icon_state = ticker.Bible_icon_state - B.item_state = ticker.Bible_item_state - B.name = ticker.Bible_name - B.deity_name = ticker.Bible_deity_name + if(SSticker && ( SSticker.Bible_icon_state && SSticker.Bible_item_state) ) + B.icon_state = SSticker.Bible_icon_state + B.item_state = SSticker.Bible_item_state + B.name = SSticker.Bible_name + B.deity_name = SSticker.Bible_deity_name bibledelay = 1 spawn(60) diff --git a/code/modules/mining/lavaland/loot/colossus_loot.dm b/code/modules/mining/lavaland/loot/colossus_loot.dm index d7c6232121f..5bfd1104fb6 100644 --- a/code/modules/mining/lavaland/loot/colossus_loot.dm +++ b/code/modules/mining/lavaland/loot/colossus_loot.dm @@ -38,7 +38,7 @@ /obj/machinery/smartfridge/black_box/process() ..() - if(!memory_saved && ticker.current_state == GAME_STATE_FINISHED) + if(!memory_saved && SSticker.current_state == GAME_STATE_FINISHED) WriteMemory() /obj/machinery/smartfridge/black_box/proc/WriteMemory() diff --git a/code/modules/mob/living/carbon/alien/alien_defense.dm b/code/modules/mob/living/carbon/alien/alien_defense.dm index ec2d96ed880..5eb8f5766e4 100644 --- a/code/modules/mob/living/carbon/alien/alien_defense.dm +++ b/code/modules/mob/living/carbon/alien/alien_defense.dm @@ -6,7 +6,7 @@ As such, they can either help or harm other aliens. Help works like the human he In all, this is a lot like the monkey code. /N */ /mob/living/carbon/alien/attack_alien(mob/living/carbon/alien/M) - if(!ticker) + if(!SSticker) to_chat(M, "You cannot attack people before the game has started.") return diff --git a/code/modules/mob/living/carbon/alien/special/alien_embryo.dm b/code/modules/mob/living/carbon/alien/special/alien_embryo.dm index 3a752e61619..0addea8d4b6 100644 --- a/code/modules/mob/living/carbon/alien/special/alien_embryo.dm +++ b/code/modules/mob/living/carbon/alien/special/alien_embryo.dm @@ -93,8 +93,8 @@ spawn(6) var/mob/living/carbon/alien/larva/new_xeno = new(owner.drop_location()) new_xeno.key = C.key - if(ticker && ticker.mode) - ticker.mode.xenos += new_xeno.mind + if(SSticker && SSticker.mode) + SSticker.mode.xenos += new_xeno.mind new_xeno.mind.name = new_xeno.name new_xeno.mind.assigned_role = SPECIAL_ROLE_XENOMORPH new_xeno.mind.special_role = SPECIAL_ROLE_XENOMORPH diff --git a/code/modules/mob/living/carbon/human/death.dm b/code/modules/mob/living/carbon/human/death.dm index 6d245674fd1..64d06dac4db 100644 --- a/code/modules/mob/living/carbon/human/death.dm +++ b/code/modules/mob/living/carbon/human/death.dm @@ -112,7 +112,7 @@ if(H.mind) H.mind.kills += "[key_name(src)]" - if(ticker && ticker.mode) + if(SSticker && SSticker.mode) // log_world("k") sql_report_death(src) diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index bd5817e8867..079f886d055 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -1961,7 +1961,7 @@ Eyes need to have significantly high darksight to shine unless the mob has the X if(7) // Pride log_game("[src] was influenced by the sin of pride.") O = new /datum/objective/sintouched/pride - ticker.mode.sintouched += src.mind + SSticker.mode.sintouched += src.mind src.mind.objectives += O var/obj_count = 1 to_chat(src, "They have no blood!") return - if(target.mind && target.mind.vampire && (target.mind in ticker.mode.vampires)) + if(target.mind && target.mind.vampire && (target.mind in SSticker.mode.vampires)) to_chat(user, "Your fangs fail to pierce [target.name]'s cold flesh") return if(SKELETON in target.mutations) diff --git a/code/modules/mob/living/carbon/superheroes.dm b/code/modules/mob/living/carbon/superheroes.dm index 4e04090b649..62935713a80 100644 --- a/code/modules/mob/living/carbon/superheroes.dm +++ b/code/modules/mob/living/carbon/superheroes.dm @@ -50,11 +50,11 @@ if(class == "Superhero") W.assignment = "Superhero" W.rank = "Superhero" - ticker.mode.superheroes += H.mind + SSticker.mode.superheroes += H.mind else if(class == "Supervillain") W.assignment = "Supervillain" W.rank = "Supervillain" - ticker.mode.supervillains += H.mind + SSticker.mode.supervillains += H.mind W.icon_state = "lifetimeid" W.SetOwnerInfo(H) W.UpdateName() @@ -157,7 +157,7 @@ /obj/effect/proc_holder/spell/targeted/recruit/cast(list/targets,mob/living/user = usr) for(var/mob/living/carbon/human/target in targets) var/obj/item/organ/external/head/head_organ = target.get_organ("head") - if(ticker.mode.greyshirts.len >= 3) + if(SSticker.mode.greyshirts.len >= 3) to_chat(user, "You have already recruited the maximum number of henchmen.") if(!in_range(user, target)) to_chat(user, "You need to be closer to enthrall [target].") @@ -218,7 +218,7 @@ to_chat(target, "You have decided to enroll as a henchman for [user]. You are now part of the feared 'Greyshirts'.") to_chat(target, "You must follow the orders of [user], and help [user.p_them()] succeed in [user.p_their()] dastardly schemes.") to_chat(target, "You may not harm other Greyshirt or [user]. However, you do not need to obey other Greyshirts.") - ticker.mode.greyshirts += target.mind + SSticker.mode.greyshirts += target.mind target.set_species(/datum/species/human) head_organ.h_style = "Bald" head_organ.f_style = "Shaved" diff --git a/code/modules/mob/living/death.dm b/code/modules/mob/living/death.dm index 37077881350..fe762e423fc 100644 --- a/code/modules/mob/living/death.dm +++ b/code/modules/mob/living/death.dm @@ -89,8 +89,8 @@ mind.store_memory("Time of death: [station_time_timestamp("hh:mm:ss", timeofdeath)]", 0) GLOB.respawnable_list += src - if(ticker && ticker.mode) - ticker.mode.check_win() + if(SSticker && SSticker.mode) + SSticker.mode.check_win() if(mind && mind.devilinfo) // Expand this into a general-purpose death-response system when appropriate mind.devilinfo.beginResurrectionCheck(src) diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 52fde3d0d9e..77831689662 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -691,7 +691,7 @@ return name /mob/living/update_gravity(has_gravity) - if(!ticker) + if(!SSticker) return if(has_gravity) clear_alert("weightless") diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm index 88b17124451..e9df2f0edad 100644 --- a/code/modules/mob/living/living_defense.dm +++ b/code/modules/mob/living/living_defense.dm @@ -279,7 +279,7 @@ return G /mob/living/attack_slime(mob/living/carbon/slime/M) - if(!ticker) + if(!SSticker) to_chat(M, "You cannot attack people before the game has started.") return diff --git a/code/modules/mob/living/silicon/ai/ai_defense.dm b/code/modules/mob/living/silicon/ai/ai_defense.dm index 6d32c24bb0a..c8ffebc6647 100644 --- a/code/modules/mob/living/silicon/ai/ai_defense.dm +++ b/code/modules/mob/living/silicon/ai/ai_defense.dm @@ -1,5 +1,5 @@ /mob/living/silicon/ai/attack_alien(mob/living/carbon/alien/humanoid/M) - if(!ticker) + if(!SSticker) to_chat(M, "You cannot attack people before the game has started.") return ..() diff --git a/code/modules/mob/living/silicon/ai/freelook/cameranet.dm b/code/modules/mob/living/silicon/ai/freelook/cameranet.dm index 2771725a96d..6d12559ee9b 100644 --- a/code/modules/mob/living/silicon/ai/freelook/cameranet.dm +++ b/code/modules/mob/living/silicon/ai/freelook/cameranet.dm @@ -101,7 +101,7 @@ var/datum/cameranet/cameranet = new() /datum/cameranet/proc/updateVisibility(atom/A, opacity_check = 1) - if(!ticker || (opacity_check && !A.opacity)) + if(!SSticker || (opacity_check && !A.opacity)) return majorChunkChange(A, 2) diff --git a/code/modules/mob/living/silicon/ai/latejoin.dm b/code/modules/mob/living/silicon/ai/latejoin.dm index 69136e07a99..513b26ee558 100644 --- a/code/modules/mob/living/silicon/ai/latejoin.dm +++ b/code/modules/mob/living/silicon/ai/latejoin.dm @@ -33,8 +33,8 @@ var/global/list/empty_playable_ai_cores = list() mind.objectives.Cut() mind.special_role = null else - if(ticker.mode.name == "AutoTraitor") - var/datum/game_mode/traitor/autotraitor/current_mode = ticker.mode + if(SSticker.mode.name == "AutoTraitor") + var/datum/game_mode/traitor/autotraitor/current_mode = SSticker.mode current_mode.possible_traitors.Remove(src) // Ghost the current player and disallow them to return to the body diff --git a/code/modules/mob/living/silicon/login.dm b/code/modules/mob/living/silicon/login.dm index 01240adf942..4892441b804 100644 --- a/code/modules/mob/living/silicon/login.dm +++ b/code/modules/mob/living/silicon/login.dm @@ -1,12 +1,12 @@ /mob/living/silicon/Login() SetSleeping(0) - if(mind && ticker && ticker.mode) - ticker.mode.remove_revolutionary(mind, 1) - ticker.mode.remove_cultist(mind, 1) - ticker.mode.remove_wizard(mind) - ticker.mode.remove_changeling(mind) - ticker.mode.remove_vampire(mind) - ticker.mode.remove_thrall(mind, 0) - ticker.mode.remove_shadowling(mind) - ticker.mode.remove_abductor(mind) - ..() + if(mind && SSticker && SSticker.mode) + SSticker.mode.remove_revolutionary(mind, 1) + SSticker.mode.remove_cultist(mind, 1) + SSticker.mode.remove_wizard(mind) + SSticker.mode.remove_changeling(mind) + SSticker.mode.remove_vampire(mind) + SSticker.mode.remove_thrall(mind, 0) + SSticker.mode.remove_shadowling(mind) + SSticker.mode.remove_abductor(mind) + ..() diff --git a/code/modules/mob/living/silicon/pai/recruit.dm b/code/modules/mob/living/silicon/pai/recruit.dm index ff859853ea5..b2828070ad3 100644 --- a/code/modules/mob/living/silicon/pai/recruit.dm +++ b/code/modules/mob/living/silicon/pai/recruit.dm @@ -50,8 +50,8 @@ var/datum/paiController/paiController // Global handler for pAI candidates card.setPersonality(pai) card.looking_for_personality = 0 - ticker.mode.update_cult_icons_removed(card.pai.mind) - ticker.mode.update_rev_icons_removed(card.pai.mind) + SSticker.mode.update_cult_icons_removed(card.pai.mind) + SSticker.mode.update_rev_icons_removed(card.pai.mind) pai_candidates -= candidate usr << browse(null, "window=findPai") diff --git a/code/modules/mob/living/silicon/robot/drone/drone.dm b/code/modules/mob/living/silicon/robot/drone/drone.dm index e94f9e072b4..3985bfce50e 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone.dm @@ -182,7 +182,7 @@ to_chat(user, "You swipe the sequencer across [src]'s interface and watch its eyes flicker.") if(jobban_isbanned(src, ROLE_SYNDICATE)) - ticker.mode.replace_jobbanned_player(src, ROLE_SYNDICATE) + SSticker.mode.replace_jobbanned_player(src, ROLE_SYNDICATE) to_chat(src, "You feel a sudden burst of malware loaded into your execute-as-root buffer. Your tiny brain methodically parses, loads and executes the script. You sense you have five minutes before the drone server detects this and automatically shuts you down.") diff --git a/code/modules/mob/living/silicon/robot/drone/drone_manufacturer.dm b/code/modules/mob/living/silicon/robot/drone/drone_manufacturer.dm index 9bf388fe5fe..35bbad68b6a 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone_manufacturer.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone_manufacturer.dm @@ -27,7 +27,7 @@ /obj/machinery/drone_fabricator/process() - if(ticker.current_state < GAME_STATE_PLAYING) + if(SSticker.current_state < GAME_STATE_PLAYING) return if(stat & NOPOWER || !produce_drones) @@ -98,7 +98,7 @@ to_chat(usr, "You are banned from playing drones and cannot spawn as a drone.") return - if(!ticker || ticker.current_state < 3) + if(!SSticker || SSticker.current_state < 3) to_chat(src, "You can't join as a drone before the game starts!") return diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index ae6a832f6ac..9fe06a3fe4a 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -1340,9 +1340,9 @@ var/list/robot_verbs_default = list( mind.special_role = SPECIAL_ROLE_ERT if(cyborg_unlock) crisis = 1 - if(!(mind in ticker.minds)) - ticker.minds += mind - ticker.mode.ert += mind + if(!(mind in SSticker.minds)) + SSticker.minds += mind + SSticker.mode.ert += mind /mob/living/silicon/robot/ert/gamma crisis = 1 diff --git a/code/modules/mob/living/simple_animal/constructs.dm b/code/modules/mob/living/simple_animal/constructs.dm index 2b3d11357d1..c63856fcb0a 100644 --- a/code/modules/mob/living/simple_animal/constructs.dm +++ b/code/modules/mob/living/simple_animal/constructs.dm @@ -29,21 +29,21 @@ /mob/living/simple_animal/hostile/construct/New() ..() - if(!ticker.mode)//work around for maps with runes and cultdat is not loaded all the way + if(!SSticker.mode)//work around for maps with runes and cultdat is not loaded all the way name = "[const_type] ([rand(1, 1000)])" real_name = const_type icon_living = const_type icon_state = const_type else - name = "[ticker.cultdat.get_name(const_type)] ([rand(1, 1000)])" - real_name = ticker.cultdat.get_name(const_type) - icon_living = ticker.cultdat.get_icon(const_type) - icon_state = ticker.cultdat.get_icon(const_type) + name = "[SSticker.cultdat.get_name(const_type)] ([rand(1, 1000)])" + real_name = SSticker.cultdat.get_name(const_type) + icon_living = SSticker.cultdat.get_icon(const_type) + icon_state = SSticker.cultdat.get_icon(const_type) for(var/spell in construct_spells) AddSpell(new spell(null)) - if(ticker.cultdat.theme == "blood") + if(SSticker.cultdat.theme == "blood") updateglow() /mob/living/simple_animal/hostile/construct/examine(mob/user) diff --git a/code/modules/mob/living/simple_animal/friendly/cat.dm b/code/modules/mob/living/simple_animal/friendly/cat.dm index 38787198a5f..b5ce4622052 100644 --- a/code/modules/mob/living/simple_animal/friendly/cat.dm +++ b/code/modules/mob/living/simple_animal/friendly/cat.dm @@ -48,9 +48,9 @@ ..() /mob/living/simple_animal/pet/cat/Runtime/Life(seconds, times_fired) - if(!cats_deployed && ticker.current_state >= GAME_STATE_SETTING_UP) + if(!cats_deployed && SSticker.current_state >= GAME_STATE_SETTING_UP) Deploy_The_Cats() - if(!stat && ticker.current_state == GAME_STATE_FINISHED && !memory_saved) + if(!stat && SSticker.current_state == GAME_STATE_FINISHED && !memory_saved) Write_Memory() ..() diff --git a/code/modules/mob/living/simple_animal/friendly/cockroach.dm b/code/modules/mob/living/simple_animal/friendly/cockroach.dm index e92174bd6c2..1e7b3a61d0c 100644 --- a/code/modules/mob/living/simple_animal/friendly/cockroach.dm +++ b/code/modules/mob/living/simple_animal/friendly/cockroach.dm @@ -22,7 +22,7 @@ del_on_death = 1 /mob/living/simple_animal/cockroach/can_die() - return ..() && !ticker.cinematic //If the nuke is going off, then cockroaches are invincible. Keeps the nuke from killing them, cause cockroaches are immune to nukes. + return ..() && !SSticker.cinematic //If the nuke is going off, then cockroaches are invincible. Keeps the nuke from killing them, cause cockroaches are immune to nukes. /mob/living/simple_animal/cockroach/Crossed(var/atom/movable/AM) if(isliving(AM)) diff --git a/code/modules/mob/logout.dm b/code/modules/mob/logout.dm index f409d184340..40eb94a9ef3 100644 --- a/code/modules/mob/logout.dm +++ b/code/modules/mob/logout.dm @@ -6,7 +6,7 @@ create_attack_log("Logged out at [atom_loc_line(get_turf(src))]") // `holder` is nil'd out by now, so we check the `admin_datums` array directly //Only report this stuff if we are currently playing. - if(admin_datums[ckey] && ticker && ticker.current_state == GAME_STATE_PLAYING) + if(admin_datums[ckey] && SSticker && SSticker.current_state == GAME_STATE_PLAYING) var/datum/admins/temp_admin = admin_datums[ckey] // Triggers on people with banhammer power only - no mentors tripping the alarm if(temp_admin.rights & R_BAN) diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 482bf85491d..e83b60d402f 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -745,7 +745,7 @@ var/list/slot_equipment_priority = list( \ to_chat(usr, "Respawning is disabled.") return - if(stat != DEAD || !ticker) + if(stat != DEAD || !SSticker) to_chat(usr, "You must be dead to use this!") return @@ -1100,7 +1100,7 @@ var/list/slot_equipment_priority = list( \ to_chat(usr, "You are banned from playing as sentient animals.") return - if(!ticker || ticker.current_state < 3) + if(!SSticker || SSticker.current_state < 3) to_chat(src, "You can't respawn as an NPC before the game starts!") return diff --git a/code/modules/mob/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm index a46b9a94fc7..faaf8631ec1 100644 --- a/code/modules/mob/new_player/new_player.dm +++ b/code/modules/mob/new_player/new_player.dm @@ -59,7 +59,7 @@ real_name = "Random Character Slot" var/output = "

Setup Character
[real_name]

" - if(!ticker || ticker.current_state <= GAME_STATE_PREGAME) + if(!SSticker || SSticker.current_state <= GAME_STATE_PREGAME) if(!ready) output += "

Declare Ready

" else output += "

You are ready (Cancel)

" else @@ -106,21 +106,21 @@ /mob/new_player/Stat() statpanel("Lobby") - if(client.statpanel=="Lobby" && ticker) - if(ticker.hide_mode) + if(client.statpanel=="Lobby" && SSticker) + if(SSticker.hide_mode) stat("Game Mode:", "Secret") else - if(ticker.hide_mode == 0) + if(SSticker.hide_mode == 0) stat("Game Mode:", "[master_mode]") // Old setting for showing the game mode else stat("Game Mode: ", "Secret") - if((ticker.current_state == GAME_STATE_PREGAME) && going) - stat("Time To Start:", ticker.pregame_timeleft) - if((ticker.current_state == GAME_STATE_PREGAME) && !going) + if((SSticker.current_state == GAME_STATE_PREGAME) && going) + stat("Time To Start:", SSticker.pregame_timeleft) + if((SSticker.current_state == GAME_STATE_PREGAME) && !going) stat("Time To Start:", "DELAYED") - if(ticker.current_state == GAME_STATE_PREGAME) + if(SSticker.current_state == GAME_STATE_PREGAME) stat("Players:", "[totalPlayers]") if(check_rights(R_ADMIN, 0, src)) stat("Players Ready:", "[totalPlayersReady]") @@ -136,7 +136,7 @@ ..() statpanel("Status") - if(client.statpanel == "Status" && ticker) + if(client.statpanel == "Status" && SSticker) show_stat_station_time() @@ -217,7 +217,7 @@ if(!tos_consent) to_chat(usr, "You must consent to the terms of service before you can join!") return 0 - if(!ticker || ticker.current_state != GAME_STATE_PLAYING) + if(!SSticker || SSticker.current_state != GAME_STATE_PLAYING) to_chat(usr, "The round is either not ready, or has already finished...") return @@ -303,7 +303,7 @@ /mob/new_player/proc/AttemptLateSpawn(rank,var/spawning_at) if(src != usr) return 0 - if(!ticker || ticker.current_state != GAME_STATE_PLAYING) + if(!SSticker || SSticker.current_state != GAME_STATE_PLAYING) to_chat(usr, "The round is either not ready, or has already finished...") return 0 if(!enter_allowed) @@ -330,7 +330,7 @@ ai_character.moveToEmptyCore() AnnounceCyborg(ai_character, rank, "has been downloaded to the empty core in \the [get_area(ai_character)]") - ticker.mode.latespawn(ai_character) + SSticker.mode.latespawn(ai_character) qdel(src) return @@ -370,7 +370,7 @@ character = SSjobs.EquipRank(character, rank, 1) //equips the human EquipCustomItems(character) - ticker.mode.latespawn(character) + SSticker.mode.latespawn(character) if(character.mind.assigned_role == "Cyborg") AnnounceCyborg(character, rank, join_message) @@ -379,7 +379,7 @@ callHook("latespawn", list(character)) else data_core.manifest_inject(character) - ticker.minds += character.mind//Cyborgs and AIs handle this in the transform proc. //TODO!!!!! ~Carn + SSticker.minds += character.mind//Cyborgs and AIs handle this in the transform proc. //TODO!!!!! ~Carn AnnounceArrival(character, rank, join_message) callHook("latespawn", list(character)) AddEmploymentContract(character) @@ -390,7 +390,7 @@ /mob/new_player/proc/AnnounceArrival(var/mob/living/carbon/human/character, var/rank, var/join_message) - if(ticker.current_state == GAME_STATE_PLAYING) + if(SSticker.current_state == GAME_STATE_PLAYING) var/ailist[] = list() for(var/mob/living/silicon/ai/A in GLOB.living_mob_list) ailist += A @@ -422,7 +422,7 @@ employmentCabinet.addFile(employee) /mob/new_player/proc/AnnounceCyborg(var/mob/living/character, var/rank, var/join_message) - if(ticker.current_state == GAME_STATE_PLAYING) + if(SSticker.current_state == GAME_STATE_PLAYING) var/ailist[] = list() for(var/mob/living/silicon/ai/A in GLOB.living_mob_list) ailist += A @@ -536,7 +536,7 @@ var/mob/living/carbon/human/new_character = new(loc) new_character.lastarea = get_area(loc) - if(ticker.random_players || appearance_isbanned(new_character)) + if(SSticker.random_players || appearance_isbanned(new_character)) client.prefs.random_character() client.prefs.real_name = random_name(client.prefs.gender) client.prefs.copy_to(new_character) diff --git a/code/modules/power/singularity/narsie.dm b/code/modules/power/singularity/narsie.dm index e15c727accb..53ab45c58dc 100644 --- a/code/modules/power/singularity/narsie.dm +++ b/code/modules/power/singularity/narsie.dm @@ -25,8 +25,8 @@ /obj/singularity/narsie/large/New() ..() - icon_state = ticker.cultdat.entity_icon_state - name = ticker.cultdat.entity_name + icon_state = SSticker.cultdat.entity_icon_state + name = SSticker.cultdat.entity_name to_chat(world, " [name] HAS RISEN") world << pick(sound('sound/hallucinations/im_here1.ogg'), sound('sound/hallucinations/im_here2.ogg')) @@ -127,12 +127,12 @@ /obj/singularity/narsie/proc/acquire(var/mob/food) if(food == target) return - to_chat(target, "[uppertext(ticker.cultdat.entity_name)] HAS LOST INTEREST IN YOU") + to_chat(target, "[uppertext(SSticker.cultdat.entity_name)] HAS LOST INTEREST IN YOU") target = food if(ishuman(target)) - to_chat(target, "[uppertext(ticker.cultdat.entity_name)] HUNGERS FOR YOUR SOUL") + to_chat(target, "[uppertext(SSticker.cultdat.entity_name)] HUNGERS FOR YOUR SOUL") else - to_chat(target, "[uppertext(ticker.cultdat.entity_name)] HAS CHOSEN YOU TO LEAD HER TO HER NEXT MEAL") + to_chat(target, "[uppertext(SSticker.cultdat.entity_name)] HAS CHOSEN YOU TO LEAD HER TO HER NEXT MEAL") //Wizard narsie /obj/singularity/narsie/wizard diff --git a/code/modules/power/smes.dm b/code/modules/power/smes.dm index 6c9ecb55afc..7ebc4f4471a 100644 --- a/code/modules/power/smes.dm +++ b/code/modules/power/smes.dm @@ -198,7 +198,7 @@ return 0 /obj/machinery/power/smes/Destroy() - if(ticker && ticker.current_state == GAME_STATE_PLAYING) + if(SSticker && SSticker.current_state == GAME_STATE_PLAYING) var/area/area = get_area(src) if(area) message_admins("SMES deleted at ([area.name])") diff --git a/code/modules/reagents/chemistry/reagents/food.dm b/code/modules/reagents/chemistry/reagents/food.dm index bf2417a192e..a67f681973d 100644 --- a/code/modules/reagents/chemistry/reagents/food.dm +++ b/code/modules/reagents/chemistry/reagents/food.dm @@ -9,7 +9,7 @@ var/diet_flags = DIET_OMNI | DIET_HERB | DIET_CARN /datum/reagent/consumable/on_mob_life(mob/living/M) - if(!(M.mind in ticker.mode.vampires)) + if(!(M.mind in SSticker.mode.vampires)) if(ishuman(M)) var/mob/living/carbon/human/H = M if(H.can_eat(diet_flags)) //Make sure the species has it's dietflag set, otherwise it can't digest any nutrients @@ -27,7 +27,7 @@ /datum/reagent/consumable/nutriment/on_mob_life(mob/living/M) var/update_flags = STATUS_UPDATE_NONE - if(!(M.mind in ticker.mode.vampires)) + if(!(M.mind in SSticker.mode.vampires)) if(ishuman(M)) var/mob/living/carbon/human/H = M if(H.can_eat(diet_flags)) //Make sure the species has it's dietflag set, otherwise it can't digest any nutrients diff --git a/code/modules/reagents/chemistry/reagents/water.dm b/code/modules/reagents/chemistry/reagents/water.dm index dcd21f639d1..4816c1f3e50 100644 --- a/code/modules/reagents/chemistry/reagents/water.dm +++ b/code/modules/reagents/chemistry/reagents/water.dm @@ -326,14 +326,14 @@ if(current_cycle >= 75 && prob(33)) // 30 units, 150 seconds M.AdjustConfused(3) if(isvampirethrall(M)) - ticker.mode.remove_vampire_mind(M.mind) + SSticker.mode.remove_vampire_mind(M.mind) holder.remove_reagent(id, volume) M.SetJitter(0) M.SetStuttering(0) M.SetConfused(0) return if(iscultist(M)) - ticker.mode.remove_cultist(M.mind) + SSticker.mode.remove_cultist(M.mind) holder.remove_reagent(id, volume) // maybe this is a little too perfect and a max() cap on the statuses would be better?? M.SetJitter(0) M.SetStuttering(0) diff --git a/code/modules/response_team/ert.dm b/code/modules/response_team/ert.dm index 0bac5824780..2a86d4a4a54 100644 --- a/code/modules/response_team/ert.dm +++ b/code/modules/response_team/ert.dm @@ -21,11 +21,11 @@ var/ert_request_answered = FALSE if(!check_rights(R_EVENT)) return - if(!ticker) + if(!SSticker) to_chat(usr, "The game hasn't started yet!") return - if(ticker.current_state == GAME_STATE_PREGAME) + if(SSticker.current_state == GAME_STATE_PREGAME) to_chat(usr, "The round hasn't started yet!") return @@ -164,9 +164,9 @@ var/ert_request_answered = FALSE M.mind.original = M M.mind.assigned_role = SPECIAL_ROLE_ERT M.mind.special_role = SPECIAL_ROLE_ERT - if(!(M.mind in ticker.minds)) - ticker.minds += M.mind //Adds them to regular mind list. - ticker.mode.ert += M.mind + if(!(M.mind in SSticker.minds)) + SSticker.minds += M.mind //Adds them to regular mind list. + SSticker.mode.ert += M.mind M.forceMove(spawn_location) SSjobs.CreateMoneyAccount(M, class, null) diff --git a/code/modules/security_levels/keycard authentication.dm b/code/modules/security_levels/keycard authentication.dm index 3f074c1246c..834d3ddc907 100644 --- a/code/modules/security_levels/keycard authentication.dm +++ b/code/modules/security_levels/keycard authentication.dm @@ -183,7 +183,7 @@ trigger_armed_response_team(new /datum/response_team/amber) // No admins? No problem. Automatically send a code amber ERT. /obj/machinery/keycard_auth/proc/is_ert_blocked() - return ticker.mode && ticker.mode.ert_disabled + return SSticker.mode && SSticker.mode.ert_disabled var/global/maint_all_access = 0 var/global/station_all_access = 0 diff --git a/code/modules/station_goals/dna_vault.dm b/code/modules/station_goals/dna_vault.dm index 0efe2043ab0..4c945921389 100644 --- a/code/modules/station_goals/dna_vault.dm +++ b/code/modules/station_goals/dna_vault.dm @@ -13,7 +13,7 @@ /datum/station_goal/dna_vault/New() ..() animal_count = rand(15, 20) //might be too few given ~15 roundstart stationside ones - human_count = rand(round(0.75 * ticker.mode.num_players_started()), ticker.mode.num_players_started()) // 75%+ roundstart population. + human_count = rand(round(0.75 * SSticker.mode.num_players_started()), SSticker.mode.num_players_started()) // 75%+ roundstart population. var/non_standard_plants = non_standard_plants_count() plant_count = rand(round(0.5 * non_standard_plants),round(0.7 * non_standard_plants)) @@ -166,8 +166,8 @@ var/list/non_simple_animals = typecacheof(list(/mob/living/carbon/human/monkey,/ F.parent = src fillers += F - if(ticker.mode) - for(var/datum/station_goal/dna_vault/G in ticker.mode.station_goals) + if(SSticker.mode) + for(var/datum/station_goal/dna_vault/G in SSticker.mode.station_goals) animals_max = G.animal_count plants_max = G.plant_count dna_max = G.human_count diff --git a/code/modules/station_goals/shield.dm b/code/modules/station_goals/shield.dm index 09ccb3ce36b..68977b5e14d 100644 --- a/code/modules/station_goals/shield.dm +++ b/code/modules/station_goals/shield.dm @@ -83,7 +83,7 @@ )) data["notice"] = notice - var/datum/station_goal/station_shield/G = locate() in ticker.mode.station_goals + var/datum/station_goal/station_shield/G = locate() in SSticker.mode.station_goals if(G) data["meteor_shield"] = 1 data["meteor_shield_coverage"] = G.get_coverage() diff --git a/code/modules/station_goals/station_goal.dm b/code/modules/station_goals/station_goal.dm index 754e09b4185..90d4defa26c 100644 --- a/code/modules/station_goals/station_goal.dm +++ b/code/modules/station_goals/station_goal.dm @@ -33,7 +33,7 @@ to_chat(world, "Station Goal : [name] : Failed!") /datum/station_goal/Destroy() - ticker.mode.station_goals -= src + SSticker.mode.station_goals -= src . = ..() /datum/station_goal/Topic(href, href_list) diff --git a/code/modules/surgery/other.dm b/code/modules/surgery/other.dm index f959732427a..ebe824f0bbc 100644 --- a/code/modules/surgery/other.dm +++ b/code/modules/surgery/other.dm @@ -328,7 +328,7 @@ if(target.vision_type) //Turns off their darksight if it's still active. to_chat(target, "Your eyes are suddenly wrought with immense pain as your darksight is forcibly dismissed!") target.vision_type = null - ticker.mode.remove_thrall(target.mind, 0) + SSticker.mode.remove_thrall(target.mind, 0) target.visible_message("A strange black mass falls from [target]'s [E]!") var/obj/item/organ/thing = new /obj/item/organ/internal/shadowtumor(get_turf(target)) thing.set_dna(target.dna) diff --git a/paradise.dme b/paradise.dme index 1b7a691c820..0d9cc3045fa 100644 --- a/paradise.dme +++ b/paradise.dme @@ -200,7 +200,6 @@ #include "code\controllers\verbs.dm" #include "code\controllers\Processes\lighting.dm" #include "code\controllers\Processes\npcai.dm" -#include "code\controllers\Processes\ticker.dm" #include "code\controllers\ProcessScheduler\core\process.dm" #include "code\controllers\ProcessScheduler\core\processScheduler.dm" #include "code\controllers\subsystem\air.dm" @@ -227,6 +226,7 @@ #include "code\controllers\subsystem\spacedrift.dm" #include "code\controllers\subsystem\sun.dm" #include "code\controllers\subsystem\throwing.dm" +#include "code\controllers\subsystem\ticker.dm" #include "code\controllers\subsystem\timer.dm" #include "code\controllers\subsystem\vote.dm" #include "code\controllers\subsystem\weather.dm" @@ -443,7 +443,6 @@ #include "code\game\dna\genes\vg_powers.dm" #include "code\game\gamemodes\factions.dm" #include "code\game\gamemodes\game_mode.dm" -#include "code\game\gamemodes\gameticker.dm" #include "code\game\gamemodes\intercept_report.dm" #include "code\game\gamemodes\objective.dm" #include "code\game\gamemodes\scoreboard.dm" From acf43fac3ae0cc399eb8a15acc67087a553fac1a Mon Sep 17 00:00:00 2001 From: AffectedArc07 Date: Tue, 30 Apr 2019 19:19:18 +0100 Subject: [PATCH 02/55] V2 --- code/__DEFINES/game.dm | 1 + code/controllers/subsystem/ticker.dm | 96 +++++++++++------------ code/modules/admin/admin.dm | 21 +++-- code/modules/mob/new_player/new_player.dm | 2 +- 4 files changed, 63 insertions(+), 57 deletions(-) diff --git a/code/__DEFINES/game.dm b/code/__DEFINES/game.dm index 68518e80d6c..5c262724a14 100644 --- a/code/__DEFINES/game.dm +++ b/code/__DEFINES/game.dm @@ -1,3 +1,4 @@ +#define GAME_STATE_STARTUP 0 #define GAME_STATE_PREGAME 1 #define GAME_STATE_SETTING_UP 2 #define GAME_STATE_PLAYING 3 diff --git a/code/controllers/subsystem/ticker.dm b/code/controllers/subsystem/ticker.dm index 0e67479b531..42b36c882f4 100644 --- a/code/controllers/subsystem/ticker.dm +++ b/code/controllers/subsystem/ticker.dm @@ -11,7 +11,8 @@ SUBSYSTEM_DEF(ticker) // Game ticker related vars var/round_start_time = 0 var/const/restart_timeout = 600 - var/current_state = GAME_STATE_PREGAME + var/current_state = GAME_STATE_STARTUP + var/force_start = 0 // Do we want to force-start as soon as we can var/force_ending = 0 var/hide_mode = 0 // leave here at 0 ! setup() will take care of it when needed for Secret mode -walter0o var/datum/game_mode/mode = null @@ -30,7 +31,7 @@ SUBSYSTEM_DEF(ticker) var/list/availablefactions = list() // list of factions with openings var/tipped = FALSE //Did we broadcast the tip of the day yet? var/selected_tip // What will be the tip of the day? - var/pregame_timeleft = "Initializing" + var/pregame_timeleft // This is used for calculations var/delay_end = 0 //if set to nonzero, the round will not restart on it's own var/triai = 0//Global holder for Triumvirate var/initialtpass = 0 //holder for inital autotransfer vote timer @@ -56,56 +57,55 @@ SUBSYSTEM_DEF(ticker) else lastTickerTimeDuration = (currentTime - lastTickerTime) / TICKS_IN_SECOND lastTickerTime = currentTime - - // Startup loop - if(current_state == GAME_STATE_PREGAME) - pregame_timeleft = config.pregame_timestart - to_chat(world, "Welcome to the pre-game lobby!") - to_chat(world, "Please, setup your character and select ready. Game will start in [pregame_timeleft] seconds") - while(current_state == GAME_STATE_PREGAME) - sleep(10) - if(going) - pregame_timeleft-- - - if(pregame_timeleft <= 60 && !tipped) + // Main firing sequence + switch(current_state) + if(GAME_STATE_STARTUP) + // This is ran as soon as the MC starts firing, and should only run ONCE, unless startup fails + round_start_time = world.time + (config.pregame_timestart * 10) + to_chat(world, "Welcome to the pre-game lobby!") + to_chat(world, "Please, setup your character and select ready. Game will start in [config.pregame_timestart] seconds") + current_state = GAME_STATE_PREGAME + fire() // TG says this is a good idea + if(GAME_STATE_PREGAME) + // This is so we dont have sleeps in controllers, because that is a bad, bad thing + pregame_timeleft = max(0,round_start_time - world.time) + + if(pregame_timeleft <= 600 && !tipped) // 60 seconds send_tip_of_the_round() tipped = TRUE - - if(pregame_timeleft <= 0) - if(setup()) // Try to start the round - current_state = GAME_STATE_SETTING_UP - Master.SetRunLevel(RUNLEVEL_SETUP) - else // It didnt work, lets loop again - break - - // This makes sure the game keeps going - if(current_state != GAME_STATE_PLAYING) - return 0 - - mode.process() - mode.process_job_tasks() - var/game_finished = SSshuttle.emergency.mode >= SHUTTLE_ENDGAME || mode.station_was_nuked - if(config.continuous_rounds) - mode.check_finished() // some modes contain var-changing code in here, so call even if we don't uses result - else - game_finished |= mode.check_finished() - - if((!mode.explosion_in_progress && game_finished) || force_ending) - current_state = GAME_STATE_FINISHED - Master.SetRunLevel(RUNLEVEL_POSTGAME) - auto_toggle_ooc(1) // Turn it on - spawn - declare_completion() - - spawn(50) - callHook("roundend") - - if(mode.station_was_nuked) - world.Reboot("Station destroyed by Nuclear Device.", "end_proper", "nuke") + + if(pregame_timeleft <= 0 || force_start) + current_state = GAME_STATE_SETTING_UP + Master.SetRunLevel(RUNLEVEL_SETUP) + if(GAME_STATE_SETTING_UP) + if(!setup()) // Setup failed + current_state = GAME_STATE_STARTUP + Master.SetRunLevel(RUNLEVEL_LOBBY) + if(GAME_STATE_PLAYING) + mode.process() + mode.process_job_tasks() + var/game_finished = SSshuttle.emergency.mode >= SHUTTLE_ENDGAME || mode.station_was_nuked + if(config.continuous_rounds) + mode.check_finished() // some modes contain var-changing code in here, so call even if we don't uses result else - world.Reboot("Round ended.", "end_proper", "proper completion") + game_finished |= mode.check_finished() + if(game_finished) + current_state = GAME_STATE_FINISHED + if(GAME_STATE_FINISHED) + current_state = GAME_STATE_FINISHED + Master.SetRunLevel(RUNLEVEL_POSTGAME) // This shouldnt process more than once, but you never know + auto_toggle_ooc(1) // Turn it on - return 1 + spawn(0) + declare_completion() + + spawn(50) + callHook("roundend") + + if(mode.station_was_nuked) + world.Reboot("Station destroyed by Nuclear Device.", "end_proper", "nuke") + else + world.Reboot("Round ended.", "end_proper", "proper completion") /datum/controller/subsystem/ticker/proc/votetimer() diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm index 74b1aa00efd..2a981e8b9c4 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -675,18 +675,23 @@ var/global/nologevent = 0 if(!SSticker) alert("Unable to start the game as it is not set up.") return - if(SSticker.current_state == GAME_STATE_PREGAME) - if(config.start_now_confirmation) - if(alert(usr, "This is a live server. Are you sure you want to start now?", "Start game", "Yes", "No") != "Yes") - return - SSticker.current_state = GAME_STATE_SETTING_UP - log_admin("[key_name(usr)] has started the game.") - message_admins("[key_name_admin(usr)] has started the game.") + + if(config.start_now_confirmation) + if(alert(usr, "This is a live server. Are you sure you want to start now?", "Start game", "Yes", "No") != "Yes") + return + + if(SSticker.current_state == GAME_STATE_PREGAME || SSticker.current_state == GAME_STATE_STARTUP) + SSticker.force_start = TRUE + log_admin("[usr.key] has started the game.") + var/msg = "" + if(SSticker.current_state == GAME_STATE_STARTUP) + msg = " (The server is still setting up, but the round will be started as soon as possible.)" + message_admins("[usr.key] has started the game.[msg]") feedback_add_details("admin_verb","SN") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! return 1 else to_chat(usr, "Error: Start Now: Game has already started.") - return 0 + return /datum/admins/proc/toggleenter() set category = "Server" diff --git a/code/modules/mob/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm index faaf8631ec1..5cb96a7c532 100644 --- a/code/modules/mob/new_player/new_player.dm +++ b/code/modules/mob/new_player/new_player.dm @@ -116,7 +116,7 @@ stat("Game Mode: ", "Secret") if((SSticker.current_state == GAME_STATE_PREGAME) && going) - stat("Time To Start:", SSticker.pregame_timeleft) + stat("Time To Start:", round(SSticker.pregame_timeleft/10)) if((SSticker.current_state == GAME_STATE_PREGAME) && !going) stat("Time To Start:", "DELAYED") From bdc5452609c671690efa1f0d07dd7f95e3d34a8b Mon Sep 17 00:00:00 2001 From: AffectedArc07 Date: Tue, 30 Apr 2019 21:12:09 +0100 Subject: [PATCH 03/55] Globalise this --- code/__HELPERS/names.dm | 4 +-- code/_globalvars/misc.dm | 5 +++- code/_globalvars/station.dm | 5 ++-- code/controllers/subsystem/ticker.dm | 34 +++++++++++++++----------- code/game/gamemodes/traitor/traitor.dm | 8 +++--- code/game/world.dm | 18 +------------- 6 files changed, 33 insertions(+), 41 deletions(-) diff --git a/code/__HELPERS/names.dm b/code/__HELPERS/names.dm index 5b90cda376e..246377eba32 100644 --- a/code/__HELPERS/names.dm +++ b/code/__HELPERS/names.dm @@ -112,8 +112,8 @@ var/syndicate_name = null //Traitors and traitor silicons will get these. Revs will not. -var/syndicate_code_phrase//Code phrase for traitors. -var/syndicate_code_response//Code response for traitors. +GLOBAL_VAR(syndicate_code_phrase) //Code phrase for traitors. +GLOBAL_VAR(syndicate_code_response) //Code response for traitors. /* Should be expanded. diff --git a/code/_globalvars/misc.dm b/code/_globalvars/misc.dm index 77443fb4ab2..e5674a9b47b 100644 --- a/code/_globalvars/misc.dm +++ b/code/_globalvars/misc.dm @@ -83,4 +83,7 @@ GLOBAL_VAR_INIT(gametime_offset, 432000) // 12:00 in seconds //printers shutdown if too much shit printed var/copier_items_printed = 0 var/copier_max_items = 300 -var/copier_items_printed_logged = FALSE \ No newline at end of file +var/copier_items_printed_logged = FALSE + + +GLOBAL_VAR(map_name) // Self explanatory \ No newline at end of file diff --git a/code/_globalvars/station.dm b/code/_globalvars/station.dm index e997a672e1f..ba8b70991c2 100644 --- a/code/_globalvars/station.dm +++ b/code/_globalvars/station.dm @@ -1,3 +1,2 @@ -var/global/datum/datacore/data_core = null - -var/map_name = "Unknown" //The name of the map that is loaded. Assigned in world/New() \ No newline at end of file +// TODO: Move this to be not in its own fucking file all alone on its own +var/global/datum/datacore/data_core = null \ No newline at end of file diff --git a/code/controllers/subsystem/ticker.dm b/code/controllers/subsystem/ticker.dm index 42b36c882f4..e70374b2779 100644 --- a/code/controllers/subsystem/ticker.dm +++ b/code/controllers/subsystem/ticker.dm @@ -5,10 +5,7 @@ SUBSYSTEM_DEF(ticker) priority = FIRE_PRIORITY_TICKER flags = SS_KEEP_TIMING runlevels = RUNLEVEL_LOBBY | RUNLEVEL_SETUP | RUNLEVEL_GAME - // Time ticker related vars - var/lastTickerTimeDuration - var/lastTickerTime - // Game ticker related vars + var/round_start_time = 0 var/const/restart_timeout = 600 var/current_state = GAME_STATE_STARTUP @@ -39,25 +36,34 @@ SUBSYSTEM_DEF(ticker) var/round_end_announced = 0 // Spam Prevention. Announce round end only once.\ /datum/controller/subsystem/ticker/Initialize() - lastTickerTime = world.timeofday login_music = pick(\ 'sound/music/thunderdome.ogg',\ 'sound/music/space.ogg',\ 'sound/music/title1.ogg',\ 'sound/music/title2.ogg',\ 'sound/music/title3.ogg',) - ..() + // Setup codephrase + if(!GLOB.syndicate_code_phrase) + GLOB.syndicate_code_phrase = generate_code_phrase() + if(!GLOB.syndicate_code_response) + GLOB.syndicate_code_response = generate_code_phrase() + + // Map name + if(using_map && using_map.name) + GLOB.map_name = "[using_map.name]" + else + GLOB.map_name = "Unknown" + + // World name + if(config && config.server_name) + world.name = "[config.server_name]: [station_name()]" + else + world.name = station_name() + + return ..() /datum/controller/subsystem/ticker/fire() - // This code is EXTREMELY important shit for checking midnight time rollover. Dont fuck with it - var/currentTime = world.timeofday - if(currentTime < lastTickerTime) - lastTickerTimeDuration = (currentTime - (lastTickerTime - TICKS_IN_DAY)) / TICKS_IN_SECOND - else - lastTickerTimeDuration = (currentTime - lastTickerTime) / TICKS_IN_SECOND - lastTickerTime = currentTime - // Main firing sequence switch(current_state) if(GAME_STATE_STARTUP) // This is ran as soon as the MC starts firing, and should only run ONCE, unless startup fails diff --git a/code/game/gamemodes/traitor/traitor.dm b/code/game/gamemodes/traitor/traitor.dm index d956e6d76b6..c2855f5c338 100644 --- a/code/game/gamemodes/traitor/traitor.dm +++ b/code/game/gamemodes/traitor/traitor.dm @@ -208,11 +208,11 @@ /datum/game_mode/proc/give_codewords(mob/living/traitor_mob) to_chat(traitor_mob, "The Syndicate provided you with the following information on how to identify their agents:") - to_chat(traitor_mob, "Code Phrase: [syndicate_code_phrase]") - to_chat(traitor_mob, "Code Response: [syndicate_code_response]") + to_chat(traitor_mob, "Code Phrase: [GLOB.syndicate_code_phrase]") + to_chat(traitor_mob, "Code Response: [GLOB.syndicate_code_response]") - traitor_mob.mind.store_memory("Code Phrase: [syndicate_code_phrase]") - traitor_mob.mind.store_memory("Code Response: [syndicate_code_response]") + traitor_mob.mind.store_memory("Code Phrase: [GLOB.syndicate_code_phrase]") + traitor_mob.mind.store_memory("Code Response: [GLOB.syndicate_code_response]") to_chat(traitor_mob, "Use the code words in the order provided, during regular conversation, to identify other agents. Proceed with caution, however, as everyone is a potential foe.") diff --git a/code/game/world.dm b/code/game/world.dm index 8106aca31d3..0341699a254 100644 --- a/code/game/world.dm +++ b/code/game/world.dm @@ -35,22 +35,6 @@ var/global/list/map_transition_config = MAP_TRANSITION_CONFIG processScheduler.setup() - if(!syndicate_code_phrase) - syndicate_code_phrase = generate_code_phrase() - if(!syndicate_code_response) - syndicate_code_response = generate_code_phrase() - if(using_map && using_map.name) - map_name = "[using_map.name]" - else - map_name = "Unknown" - - - if(config && config.server_name) - name = "[config.server_name]: [station_name()]" - else - name = station_name() - - #undef RECOMMENDED_VERSION return @@ -118,7 +102,7 @@ var/world_topic_spam_protect_time = world.timeofday player_count++ s["players"] = player_count s["admins"] = admin_count - s["map_name"] = map_name ? map_name : "Unknown" + s["map_name"] = GLOB.map_name ? GLOB.map_name : "Unknown" if(key_valid) if(SSticker && SSticker.mode) From 4c277b0cabc06ef79ced822a59cbd9f9ad034d61 Mon Sep 17 00:00:00 2001 From: Fel Date: Sun, 5 May 2019 21:11:28 -0400 Subject: [PATCH 04/55] Reverse the polarity! --- code/game/dna/genes/vg_powers.dm | 89 ++++++++++++++++++++++++++++++- icons/mob/actions/actions.dmi | Bin 96413 -> 97125 bytes 2 files changed, 88 insertions(+), 1 deletion(-) diff --git a/code/game/dna/genes/vg_powers.dm b/code/game/dna/genes/vg_powers.dm index 9ab851e86bf..f340ff413aa 100644 --- a/code/game/dna/genes/vg_powers.dm +++ b/code/game/dna/genes/vg_powers.dm @@ -188,9 +188,19 @@ ..() block=REMOTETALKBLOCK +/datum/dna/gene/basic/grant_spell/remotetalk/activate(var/mob/user) + ..() + user.AddSpell(new /obj/effect/proc_holder/spell/targeted/mindscan(null)) + +/datum/dna/gene/basic/grant_spell/remotetalk/deactivate(var/mob/user) + ..() + for(var/obj/effect/proc_holder/spell/S in user.mob_spell_list) + if(istype(S, /obj/effect/proc_holder/spell/targeted/mindscan)) + user.RemoveSpell(S) + /obj/effect/proc_holder/spell/targeted/remotetalk name = "Project Mind" - desc = "Make people understand your thoughts at any range!" + desc = "Make people understand your thoughts!" charge_max = 0 clothes_req = 0 @@ -242,6 +252,83 @@ for(var/mob/dead/observer/G in GLOB.player_list) G.show_message("Telepathic message from [user] ([ghost_follow_link(user, ghost=G)]) to [target] ([ghost_follow_link(target, ghost=G)]): [say]") +/obj/effect/proc_holder/spell/targeted/mindscan + name = "Scan Mind" + desc = "Offer people a chance to share their thoughts!" + charge_max = 0 + clothes_req = 0 + stat_allowed = 0 + invocation_type = "none" + range = -2 + selection_type = "range" + action_icon_state = "genetic_mindscan" + var/list/available_targets = list() + +/obj/effect/proc_holder/spell/targeted/mindscan/choose_targets(mob/user = usr) + var/list/targets = new /list() + var/list/validtargets = new /list() + var/turf/T = get_turf(user) + for(var/mob/living/M in range(14, T)) + if(M && M.mind) + if(M == user) + continue + validtargets += M + + if(!validtargets.len) + to_chat(user, "There are no valid targets!") + start_recharge() + return + + targets += input("Choose the target to listen to.", "Targeting") as null|mob in validtargets + + if(!targets.len || !targets[1]) //doesn't waste the spell + revert_cast(user) + return + + perform(targets, user = user) + +/obj/effect/proc_holder/spell/targeted/mindscan/cast(list/targets, mob/user = usr) + if(!ishuman(user)) return + for(var/mob/living/target in targets) + var/message = "You feel your mind expand briefly... (Click to send a message.)" + if(REMOTE_TALK in target.mutations) + message = "You feel [user.real_name] request a response from you... (Click here to project mind.)" + user.show_message("You offer your mind to [target.name].") + target.show_message("[message]") + available_targets += target + addtimer(CALLBACK(src, .proc/removeAvailability, target), 100) + +/obj/effect/proc_holder/spell/targeted/mindscan/proc/removeAvailability(var/mob/living/target) + if(target in available_targets) + available_targets -= target + return + +/obj/effect/proc_holder/spell/targeted/mindscan/Topic(href, href_list) + var/mob/living/user + if(href_list["user"]) + user = locate(href_list["user"]) + if(href_list["target"]) + if(!user) + return + var/mob/living/target = locate(href_list["target"]) + if(!(target in available_targets)) + return + available_targets -= target + var/say = input("What do you wish to say") as text|null + if(!say) + return + say = strip_html(say) + say = pencode_to_html(say, target, format = 0, fields = 0) + + log_say("(TPATH to [key_name(target)]) [say]", user) + if(REMOTE_TALK in target.mutations) + target.show_message("You project your mind into [user.name]: [say]") + else + target.show_message("You fill the space in your thoughts: [say]") + user.show_message("You hear [target.name]'s voice: [say]") + for(var/mob/dead/observer/G in GLOB.player_list) + G.show_message("Telepathic response from [target] ([ghost_follow_link(target, ghost=G)]) to [user] ([ghost_follow_link(user, ghost=G)]): [say]") + /datum/dna/gene/basic/grant_spell/remoteview name="Remote Viewing" activation_messages=list("Your mind can see things from afar.") diff --git a/icons/mob/actions/actions.dmi b/icons/mob/actions/actions.dmi index 7bc556c628c06f6152ba38303a766e421d6cc105..44fd328e6a208446b7a08d4688fe25e6e62232c2 100644 GIT binary patch literal 97125 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

n2~VWcgrfehoQI~V3~eW=Ev zsBPRB2T|V%@>NHYSsr+aefs<T+yac$GNP`1Y$t+F#=G$$6fUh6xc-fNqeRPHykp z!(_=q%!r8Z>hIwlUw!NkJ**suIKS9e$aRhK6qG*G#DK+$QHL0RnYSw7?T124?5d~B z=G#o-PgiJkfGd92vR}juk}&_Gi3WHa7)iiEz5cWx7}Bp7JbvzD{<~`En>>3?l`6JL z`bve5A9y?i{nWP75lQ_}1lf+huH*5P-}5AG(a0Ke=Y8-FW-&r*?Wy871{%0kb$2T6EFf*W$< z!BzoMXv`G|RM=4f9|Uv^01qVCMY1=%&b$lZ<60*W36O4+mBGlCj+=r+o4Y9**Y8X$ z8=a18x$eI*;PC~;kypK{h!p{#^4X@Aa|FLM4S z@5wveD%YJ*9w1;z!^FIPEPSgf=`OD)Uoqod1&8#Ie*WHoK$W>37;}iem(YFqT2w9!&TJu2BVaIGg%#uum!jBD zG1|weEH|nTa(7KmXQQ0)AQ98_P(qx({-U&!WE%6t%;)`q+QShSmuF+}?wfaljJ?D) zH<1e{cWq`%Au0+2$+nrm(DnJKY2Qt|w4-wrg0lWo1oYiE{V|&?R~owI8hu$|F}VSR z7jgQ1WHG#1jG5R4cPDM9E8M8W0djJiW|Y_i8tLijLlsa(B83pvScB^6Y;IK9$UaMz zP5-<}z5H|?$4@p{TBhZ926ivm#K%myh~qR~=i$pX)EGD^ z!aLwh7s)fodQKPf<`)FNL}k9^$Dp$NIL z(ULFffdCj^T8eiIIyC8Vbfi+hMggV3>)8Jqwr`XXinUv0IijQd(F8CBqtblmn|8TR-RvFlF_m^k{J!Z}jJIYM7b_;#fL9*1hFex)2J9ceiF%s9k? z8fsZ@1kzAgfX`>jUUuD`{EPf2#iAGOkUdnO3Wrz!NI?xIHO^yg=@|1$U@s<8%=^ne z+7XY8^ITmBF>#et=VZC&CcJS0JQ1}$WYG;ug(G=K3!mDcZDbUUMIk)C4o7hglIX~K z2X$yN5v=bvYUbf8%8O*F8AB=!NhArDV~0Lcv8(Vq9ym(NOsuZrlrP4-(zPpWsw9K2 zjl`LzGoy?&Q@8b}wfAmjas#z>kxK*R1a(0%plOR>eVB5&6pmBF$Wtu&bQ2{h~vlc>!+SrY}y zUmD?_v9ez2PR~Dz`q*WBdk`e(9Tti@4Yf7#bP7V?WW%J$@?3l z<2j9jYf)qlVpYMX4m^_)e|fs}JL^K>v*-qq4tcclW*+e9U9rghq=g*E3E?uA;EbPl zyD3kHz0?qpl@bc5PI^?F^NMfC&xJD+YO*Ot37fRw#h=AH@@nH_Dg+09+~Xdojh14f z|AJsXkzZn6cyfApaxw!0cb!gLApA3YSn61c2)e=j&HofmMz+*z1Tl?PcT6g9C#;od zu3vLS(B~PR1kAqiY&4KW2qVK3m?-Gl9QbmS$BLhbTB^mW;HAdl3g@!n10hy1lf#wA z;d5^D$5{RkO;;TiRr_^^p$C-i?hfhhkZus98|jel?v`$(K~hkpySuwXkZuO}?)zKo zo3-X2hJpK>d+rna?6bEdx2=3KbyRfG5b>Z|{BGB^5U`L=UbhuxN^&+Caz9d#7%1vDcFLbefLXL_q)SoizoJRCn`d> z*#1{X#h1QtCiN!02(4}v0W5$U_X|i6u!mO%Y=lF!&ZB~ zih>0mE><^-EE-*5%J&vMD>35egdS!B9FX``>j-1PQr+yL{4W z*dFro(fy|NOGp&KMf9vP-&L7<>)IqHOzSg5RB*>ksl`E_SI4*iyrWVD8A$)Haz)X#w1`7GMn*Qnv`}kkj z`ZeqY9y6smG>xCN$y_?h4ci*EB?gG!DjL6v#1;5ep=~RcOry&M5wG7sfTh(#?CK8& zz;}BRr0RBh$y5tuUKZ9*RA|~tw;qg;$e$%}?i~CFHYRTk_k#)bu$yI~hrjuk5^af! zlw~sF^z;r^At>y*jmQ6r)}hrCXMmy=(ssO~^$U0}6_Q{<>gmNKKrzx?sTC=bG64u7 zKdGppx3O+0V$22DXKhXKXrx3 z0;*0`2N)}+^-^r17B`4_*5$op@EYLA_#k^9AkG&8D*Y~xrPFI`#9~f>USA*d@w)en z%uZ8F8z2U7pvsVLErcMl2Rz+G!Y#2W{5SjcWXelY?68p&BNHxCk>r;{%>Pa<7J@*n zA~;FEyMmi2MG6e`Fwl%5f;V0&&E^&h`%1tej*5yeANqSgCQ=9rex?&r!=@PJ@XT9m z@e5w6>g|)%FYJm>DCumZOOX24;^yF0FaoRD0}I_lEO2~#@43dR$e2}#WwjD)A=WFB zI>9nHtyH_!a9;cFh!*?9(MWC8d@67ij?1T`rrN>XyF~M3C1NIO#y3{%rOMer@kS0a z#gN3(JU9@2UfSjATEp`x(`ai@)ca_({;tQFxW4>OiD}R|_0TJGmrt3h6I&b|Y4SRB zmk(YHQlhDj9p*$#XI+6IMA0X~KqEA{3d{={u{lNbZ8HAa@w@6jlfMKX;Bm#x)?jNW zSW0sRaA;-NVI8$}+_E&7^oGOStKnjN>HA^uC!86x31IIOeq`7EJ~(Ier;H5bv~{F5 zmM=oGYhMAo((DW61;~dKWMT@FHo&?qrZjH2!uhW#@(}YDgB}}szy)KNJ?!o*{pJSI zxZo{8h0a@(-WD$bf_mS#vFxus3e$#3lHXRwNDjQh8G54mbqXup8_$?f=dJkQyM`D& zmm^iBaDUi4Wq+i8P!aVPE&}stcZ>Imxbg5(EG`8yNHn(vM06ITAEJJFtVs)_( zuz+ng3cCkF3fbp70hMhxrv9!~Hz<;9aN!D#^HQDh9^%7zen=RsYyxH2N@P9Ao$p5R zPvq8vvYx7{apk$1E~-x*`tgAInyfr-@E2ZJGsaNn(f`mpawPPhBXIR=r=KkFnu$l9 zx9>9lO)74U)@OY&fH~mcK=DVzpkZ2?YeFss^>#n#hH3h%0sUpScrlp71)!fJY}Gw6 z%ku2qgSmeS3Q_~<;Ak{rE})%nM1U_Eli5G%G>ebP->t=2nAgRpA-av(r1SEHz`ENO zUGz~e$u?=152YlPW@I!JJ^s)OMUz8m-zyJ5M&fsWX~yq2o!Gt01wy%06qvGm;yZ&(+kljFM(N0YVF+l4|F8K zptBpz^S{Y#9x2{JFIU*B?;LjSj-;w$;D+dol%1mbvJp}S?WySc_&0&17rhG1b?_*y z5twqge}Ykb7y_n-%iy;~$n$w!Tl3P!IX9z_X897D`oJO;j zqNhOu0ngL1IOlLB>=(^|Zfa}lPIKA7a1N{Y+>hhHLxUJk`p)l7RF9-C>#HxF#U;Ka zdKyD8)@pCkk}CGZfjwL%3Ug~h0tFvFg6i;$Kzzt){5m$)*?_r13l-j%jn!We-%=oSI+LRi6b#y(T-=sQM;UHY6(mk`15FRb(3P z5n3oe;FYF@Yz#`tgc>$Ux&eDP2?S?Cxn`|*f^i0uU2_y?C0NqMgih&CZ(O!w&DgJ>{K@px%fN0HTU-=%FBGcoa{KG6tHiXl@U%2s z4L`c?pok);=F`%xS>#p;?AG@{L)R_dfv*};HXS~4VcvqSArT7t@xz{Q?4O6fFrkBE zc}4Vp_wcIFoT#@xDSf?>5kFeHffVe+ugv^|krH5~Gpa3wNc}*^8b&0LgO||&z-TQP z@E12a^m5SP{$8ZH}CuC(>9ws;#StMHQJu{%n?X=a^ zAsTR_=DRnzb^Tb*Q-aY1VZ;7Q93Y~bMx%6#tVfQz&!;Sm!Mzmr#YGLKOOi&Or>0Gd zDJ)F_iK2lyMkHV5=FxY~vN2PDmxmLs0O1!t)^=~ExUS!nIVBSlN_5fI>2f2V&mA*B zlLY((?0XVR<>ybma@X6tx&940DJs-zxq?Pg>0` z--7`5r@_Z-n7EVf!3+`6>u8G=)fF<<5s2pbevfMF*|64lz?}&eANaQ|N4WwGDB)IxE5=XYF=!P#F+Sy zU?3NEO151ekSW#n)7<6}<9y+|qYeIuhy%2(wGp-g4SOD{^1W|G4B~VYp+FuDHP~rk z_YXJ|Pmkq5sDz}|sDUjQ%TyRmKNic!@NsgJ!c;wKx#Tv(+NI6ST5}5vX};p1x+SZf zsIokW%^j*C88fqfc`FgXMh!c#{K<%?ki7ZRR%d2_;IzTgvg@yZg9Y2=)Mc|~lMg_7 z7XPdV%)_dIfXl*v({hebM+#U^Oc6UnJFsx9;1YKt9)9~{?Edpl$6Jb}Lp(=@CRLRa z#rn_{D@A|ayZ=!ic4IZwg|s!|$V9Hi=d4u^n8w03d9wullSxU4YVytJz}%H>*3oQ9 zm+e;2XCxTfmC_<5f#NFBwEJ|cOw@CNpShPAp9XlzmuW}MZ}(xRXylSlYIu!Wc)7S< zX$Sz)D{f5KP=jI<^(_|*$K0?pF%W>C^eSp<*ve@ZpbHEM>T%wWIP;eBaN>z9xL?7@ zaUd^ye=+)KO5j^Sr2IsT^plR0#_|UC&FOkXuZF1hj?3~($^0KEK!C%EWD8flJ-`o5 z5W4!PK0t&F5MGT|T>*R)zzs!!esT2EYfedDR5fJwWH$DVp5>_EMUj-dnvTF*DU-Ae zyJPqNHlw%!FVC$E*s3AMGK{~aC9A&*3OnGr&?(Nz0kkib$>nA8);ZqyVD$rVSO%&* z%mhOL!z~=B(+E(CV-G=i1~2n)vNxkqclM3tJAmS9+pgq4KxZjv%xIASGhAhC=@@D` zTmVW>RsWd02SC~okRU}U{2%%TW(AS_+I)3JNN|@e0~&;)Z}hqi?&|`C2Pat(=@JOd zzfWpu7IIY6b@T=2Y9MP0os_MubXCjAEqYauoKgrVk;{cMCTRy26(Jkm6d3dnqGGn7 zWOphURW>*ZdqNo@_F%%Cd|??$d+ZN_*3WFSGpZyaKc@=?4!S;W*E5*_(kjF+YgVQC z(*i`H7|e&0+W2lc$Svx>E{hY%(N{x%*$M0JMF9LL3^9+n@cIy>;4blZ>KHiEm-Nv+ zOwkhD9H}s#O+(6*(WU^@ng2P>0vK?&Y5hfX(F0%n^>^SUUUMf=s2smKdhIJ(GRGjN zp1yeU)vMib`Q%ncxT1olF;VZ079QGPH?HZ$Fh<9>p4GHEQ)fb*Xh3cKm%R{er3sl! zAKRKTtWlQGl!kU8FH^j+u`$A+pBmhFNLt&Yu<#H9&$-JPkbhfnH@95k5To;$8JGkY z62-3h8Gi-UAm|@l!T3=Z0KCgrM5wQ@jB;pUhZU!~0QHRcU7=8PIc#a8fPl``-OG>B zMHk7`B~D*(?9|Xh{jUZevpD_dOU|JwBiBq>qIkc=YMN{G_P(tAq9Ny_A2$5jMyeb}Oe(Vi%O}dH2PnBl} zGKW;TuNag`l||Em))FlTuvyQj{Gf8K*Umc+$e*5P5wvcPsgcNsh)0ZNU@AWqHIr2A zAs$sorNTD?n=CevbTakE;dLS4K~5ElZr=hxBC-rWVLq0m>VZ@xB0n74$L~IA zsH@uvO}YXHE9OxH;8|Gz=Y9_q5g4N>dqa;;flZlue*pOsqP5guCaLh|WX3(OgG<^E zq(OF<57s49rYt$a>gX{L{PYyGrstH6apL^gY$1Su44|DMH9bWJZy!lFePrUm^YeL1 zw=h|m@EfNOsIhfDdx%+__VLE^R)8gGNhmsUrQS6dH0ay_aB&8AkMAFSlheqC{)Szt zhUizX#8{ zNL6dK+%q5>fvoHVVvHtwiM-;{6*EqDbp05~Q<97)1{_F5YTU~|GTeeMSU%Nt&Aph% z_Q@cOVfP@+sape62tG2q;2&7q6eMIo<3p)7G>86fw|CWTldRxi+uYpT*kf1OZ`Ig@ zeQwhU>-xXKA$}BdAZl?Fi4r=TICzUX^r5L-8Gsiad`0s2+ypA9<(TF2F!H2*=q@Ht z#hRev@(kZVk*ahHT21Au5Ha04V{xfl-teR_RnDG>p0(e9=UlnD59FLQ(aE-NB&xi3%5mjgLsoPP1xsQ16~&UXicr{$fdr#3c}VIl!(bpWdz z%aP;c#CuW_UA5fY6eeQK4_C+tcm;$J&06S`j z2j5Qv7Amj3!ms!fj$FhE6w$O%^qJax%)9aKpZpB2+wxwCShPF34=if zNQ1p}RuBX}0$LBK!a+f5+Q{bU16F`mDPgK}M6@yBW9V{)5^kRJL)$eaEWCGFBcP=5 zkac zu)V#~(AZet!)1_pHQWom!!Hw>X1nF!`6`{=c^#wv(%Rq7{Z$Mw_I$l5YCb+pD=S&1 zwB4JpP?4vu&Ne&G z47s{se~P2s_k?v)GUWFyV4|~20yqkIVPRp|j|qiMH{jE?-&mlFI9+Am-E<=ukX^U! zuZvB@1F}l2j8fDk2i)_v2kiE(AGa`#e%|iw{sFfgexN{wj+aw!kmq4OTU)17)lys~en=0+YTAnD zG|gzKppTC`+Wl{u=mi#?DJWC3)XO^IYW=?IVAj6`6ZUzs5bhy;LM#}LozbyLL>L$f z@kN=S*jTX8>y->)0sthVO8<}q1*Y6_`0*3Q+N-RLViE@MC4T#clLr0oHn^VwfIDj| z5}v*j42W(BuLJfeVUyhK(%|6~vG$#6aG-oJ3CSgYrpNh4+>YoN^4hOEwd%KV$GYwP z^lqb)f7yBQ$h-3rGzlB7C@eWy>DZJ4MgwH;0CluD@BGP8mBH<-^$cMTWIa9Q51dEr z`RiM|SJ^t9_pjM(-^|Sun6d=y1t2jBXpX)o_Z2w2{*7OLO|q!LrDQo9ouo09*T>Zx z&`Y2?5dAQsl4%0_Ud6?6advj8_%hGWfh3Tq`|*suW8f)pGGxpF+VHJ~#tVJ|O3z1~ zK*g8KZZ!NrW&i)6yfl{27jZ`Z@GoR9aG)*c%4@b(Z=c&c4z14bo}DSPbec1%yo(5S zwI4MO!PTGY!TGFOqkT9cKJVPmwH*@`k%he{S#B!QH>0vcC(15mL%^EjIV?>z^KqAt zjlgY`G4y}(+J=P-l=Jgr*z~>_JO=#y&Rp(-smy1hnSP8M*$Hs;j$4sUPEM+fz;!37 z8X79k&dzST{{gb;cWbKv!=^ZWG6!akvkxH3zfg-or4926MLVBC^?~6lA`$x7{ZtrP zD5>EjUDjL(?NQfw(F|xFuZ5bbex;IzIWUi?rQDofu1eYZZ=54R*lTHv5H!%`(etNA zBOdd^(7bFqL->ce(euRffH&=@9u&5t)l!x0g8)%~s6XgoM}>Fm&*lqjp3fOSxV%(S zhCFJ^mmq+PUJTTF#rY#&;qSQ>ny+h5G8;4W;Lzcuar1G)!yI&ETbXS+Irb7oSG!e- z8jPIAB{-2M5*6Q^CjEPN;7zLzf}Kl;Mr^-!ee(bf9_R0mX@xNc4&nMLy&FdNUvI11 zUm|Q*v4nYL`~&5EQGu2cdN#JQVe)P#T4gbsdLZ3ZckhgQI29th@sl7IQSZ)Y#)5t6 zH33C%+=)tDatN(>J9`r5f-l}X44e$PTPvUu7~+)fLtD!B2y<>AbuQz0LSSI^wk(!&8eAvVxc+m%O3 z&Quk4cY~ei8U=mtfA#un*@E-+hid8=lVZMNi~Vyz*`TgJm)}`Yz^z3BGn%U@rRo##~^ItxoW&jgUlpjY1-9q$)UJllK-+o!ky7i#{ zp^Y@Fvom|%js^nq4;IHbI)ktU%w_stEU#^A;j415)qiVK17G=yNzclP0Aki{fEy++ z+`1%tK2||I!wH#5dYwSkY~Sa4 zT#m#aXq3I?B-t2gG#{bd=Nwy4FN&_U5kxba+*K1C9UY0eDgb>k655uuw8~kL zW7W*xOGTrX=hG%nscQ0^hZF?L9;WQ3_b!l&rb zKM3%B8f18?uaD=Y#3`uu+`etqywdQ!@bocOxwV>6h(^PmfXFilZ5Rr<-@kKydx(RK zm9VU;&}bKKa!V^Yky$NS%D|9njh|TaKN1|=yztj;Z;K+{==fl^3ap(l#8txWY6a5J zgsEb~18^8D$k*aZ&G+_qx*B(7xfF91n2BU26x%EnQZGieM z2CdSNq>2igU4_jrr(?xW_7&Fl_94u28SI6ixOeaPmOY7SN;m;#m|N3N^K0Bu`~F$0 zIk^VU!F{9OR$B=?2>~1KLqq{hsea zMc%fIab*HK;-~827M!D%{RejA`uP9)28y;H(q8RV1r*wNWimc`Y2qN2f0;b_8jKEB zsFX+4lpEv6kH$YmzQxZrnp|=h&~tX#F=W7=DI}1x0 zNKsr{JEjzrzBPoAzwjfBLxQ;a+WT)s8Q=^mLg?`}9iOku<6)vFWBIfV>!ZdKK=H-) zy{YB05V61vXgE0>5K$x+^+Lc?%nXJOr%W%eMjSV5B1v^`XTc5)jR8GpGG+!!(RAPo(wWoQ%Pdt_uZ1Ij?}a!RYQoI7$y%(D7Z5m z8=T4k>w?*^tH_aSF}Rv$KfI7Oah|YCrO?nOo3r)Y>Lz!{Kk1d{8o%#)@+z`Pflh<; z>X!v))Iw}-oX9Aqb^{h6jxW`|!pdFx7Y98+T!bXlKB_3(Vu+ot4}0vvLvpi4BwJRA z8krzdov(*!jCrNsTQZE-Z~c3&TVS-xcuZ`#T%Rq*q1X9jPGblyoBo3RpI2xF&VGQ$ zCMIrt{2i7X;KL-k6Z~(e&hYImY$GQ#d-b9w5~EE<4F1t~=b6lwDh2M{J}i;FqJIzl zJ8lVKZBI2DOemgi${Ki{f%0V>utATg-k?>@cE^p6h{fPo6?qEPaT0+#EM1t=@8mo@ zrErX5AVMOI&EzvzBh6Htv%uwZAoZ{d(vn=`gEw{9Pg zVrTRemeu#*>EG;D@h~>>&7O3CP*$r=z1ZJnR_7#44sU!*Q4V=v^oLa8f=Q%`xGH0m z(nr&)R2wORB30X_y@P!Xmn*(uIb`c5y=eC{u|iEO3>oD4dKpFn z>DQlXff4UDG4fL}zk^`DzcNS|RdqdeZc_hfLoN4xr^hva#jyRHCp7&;z8$dj*ulhRLb3cc_=m$Z`1v%OD7?gShPh}o;~$} z)c?W6dF_|;SSBZ8Adropp$FNH|8>dQI5^zhZ`PSes+7V8@4ial7^l!<=F>YD|8Bn3 zMyM1cSigiLN&W8@cm(KxhN-Z-@Ct5#Q?5stXj_{yHXKEHI~|gy@%F+i_?v-FbK!iZ zj3G+s1kTpLfZA5lkNp*!lC|Gj>S??c4uwBhmr`_Vk~^>q_kddUtFI_B0%P|Xeb=d7 zg?XIzD&g8|AC^j;ZU24d^Om6Rd@{TY=U;g{oaYPekD=C8ON)n$?C1@Y!3&9jsy8@~ zzMl`s>>#S@0p0cu;G5P;y|IGi9Td$#5)!gI-&cQ)#F@xvH74<}vlI%fwUc)?%(376 zeTSqxW)94J+TE6lw9X+KfzrA82q1WPc!}Y9M}Iv%^`1Vtlnc*xPgUoGF@ogTh@_01 zaFv_srKL#aDk=fm_pbKb6$I)wjSbOX7^^DrIo+9`@Bc|xM2VF|MaIq_vm$OB?bw7$ zySj1$&Chl#O$?E1c>%9p*pRSI7@4z0tWXq>#QWhsT&=P$EjkPX-=ZVl2>I{y2>iXF zCvc6yEzqQ7z;Nps}gce)^X?^3f`AiA|d|A!!t$Z?k`>8t@cdx6o;cx#b zz~9+t1k^Ez5nxWs?J*0s(sN_M?Y7zMOc%3?yLj7Zc?Z1+O7aD#tb(=l$<1A0@g@0J zOSB-kHQqXjQ9npbmKfl~w;l?G&DL1)Y;>vqbJL3_mDN-PV<#Z7#1_;yM*|y*0hJs@3oULu#T?I)T0FR4&buCwZwQq(0g{JqDVWGS?Y(#N)2O&X#_P2yD6=NDe)>0B4oQw z%;I!qI#=vrhrAzg{RUhUxK3nr({e5Y+cvbfe4i{L@r6nBCr;oE1}9(hJ#4^cLqkLS z;F+;MK@cDbvFZT%q5_08iY||w|Mv@@?6IfPko)G=y2s{iK%S5nN6@8n;Sn0VyU3*I z61K5%hNPKU6^=NMZPr4ktoH(UsJE{??X>!|zDAh(Y`ZOlrv2Y7WsG(^)6mJ+7M4%s zv;%`F$$4kzvqV-Is>B;V_rbOy`~v{XwQ(76gcqxrDVVWVrN>4JPDN(=!2j)N$y1XN zhw&Rk4I2Xv9#VoCClgVi$!Yfq_o>|a?sQ2;(N4m>z0vBh31BvvOyuxW{@2j_Q9}a@ z&(O0FaB`Ifr3_O8E#i`~(a}4Ant;XK>9X4*3YUJh5g+AEHm_|Mc}bbv#dIs*948Ln z5e~VS_^494nl;Dma(XS5>Cq3$Q#ozC$Bg0DFYbaaa>H5pO`?g|FzOAo>i%Dtl+qyX zAL1%Bwo_C@F0;i&ANR0Im2;!_zmptgf}uMxY>~0Cdw|7hECCe_38}C**W2rDn|s3M z9p}4|riINezY37W>}IuYqk!*&jjp}dljhD`7nFQ2^MA$?at0+8%Wyi(XaaLTwlEMu| z#U>bo)b6mx-#UlxJAKG!?ThCMy8-Vf0mFyXMOc*_K5=(<_m;u;>7ATh2<%SwY>ebe zX5`CZt7(J6Wv)RZeRxmj%q{ou7~$7Tsf*z3hJ$8ghja{Og7DAJDbqM?Q=@ek(#IR_ zlUlTcm1!bC5FsoC*iDJ#U2_#0YP|R#BRSn{{0Rynsz0Dx?tj#(<^c(aj<-JVF-uOe z7fLcey^EC?4tq#+xj8V0uEZ{WuJ+oZ8zbe;R%-f+fb0eedQ~$%yoQD-!3@xqkf&r; z-vRO<2pyx{7p1r7COICkT3RIrdayZHOPygw5uI!j?3eI&Ue`52OdEE#4Mdbhrc!FE zNURaLbE(*xdcve0PN>h{QP^mOZTSdm-lxxY1AE1&$f;t@im5N$vBPB2e)c#RPxM@^ zNJXgi;IG1TU1B)&RQdxor>Cb5Ria1!`v~M8UxtxrI)8Wv_V5>gVBd06z$?i;H~)|Y zM&RZBej33y5C3hDr2HdBd77A=BICa=@Zz!pJ z{!6ts6GBLL=X-Q{f6zuWC3f*aaisi!!X|x}QZ~;A+XZF^|GyUG(B8Kh1vYr&{gH2C zn*-Z^ME|WTb@d;lBcm!XKM$#ZprQ0NFVjVkMk%j#HsKS(?xt5^=dlMHd&S~^g~B_6 zM0HhF?u&~+DAr5k6wpk-@ortWH02G zoYZBT0vD^D9!=}c&Xlz<*3EuF{io%LltS0U<`QJM5Od0a*^@8nfo<#;0x#~AlAPQV zg=K}$N!vD9SYt}|)P($rDLUgdb~GQiruI6-{d*v&1A3)U`5yafjSTHhVdUn&N2?Sh zPTAe1pC9r5^g9rRL`jl8KzMp4w`fge0%t`F6=5f(a8bogk176ChvD07wKj^D*0(;| z?{!|Q%Cw4EitftqmEyii_4gI4GpNyP_4N<#UO!%V37@hu?nqs#4a5@$t(%l}bmT4X zvUaUli)`Q>E+$2k>5~-kBI!)fr^3PF7?wj&)5-r-{dJjQ>Jqz&2=TJ&Q(cU&yly#1 zDu-E$;qGdT%gDe-mj=ISD@R29TCxUOU>`3N0>%J}a5pf`L|q0UK3r&j&gSlXtPPn& zL1l3s_`jjLe!@c0}{#EI~Ek3B%Hprh|mpcK#E)+0gf-4a|iQ)LT z9a&kt;=g_6>rQvZh7I`to}%4o2mLHVNBr{IAt8&i4S-wTjEsy+4HhUs%M(x{#!?aL zwrAV;dv3;#ze2o71pm;|`J(ix*)H>!X+PvY><==8hNk znQ!{4f&ciM-MEil^u=DAe*cW%eY@8o$jl5_?(j-sKWt#)^K}yCXT<|_8j71s!+{p@ z9k<`?i}P58F~-jeEY_)sc{yDZ_MeBx$Hi64qhhC4MwRn_QStkz=i`q2vu`-Ln=+KX zj|cDdlB}jAe+XkUa^MyUEA14lu4`>e?MlNXp0{PJ;uKD-2jW9!vw&?ErPS zX|~#V1AfqVIl{_Jwmmt@Hv60AuzT%z@Z$OR zf47-kx|qj9CCgNjm*BEe#%Z*erA=kT(J|yn2b}O4{Z1?y<>NVRcHn>?66jL(Nj|#^ z=Lmb9)i?SH8%WDa&2MBGTl}NsmUwn z8qdrf=b1&^i)I2BX*6;7)eRBIk9NJle_C;9BxUWly{fT1eW06ch-OQoQNjYqB5W}~ z=wj-Pv6?ekaP=Ctowkx9=g*NNjwfs4sd0ChYk;cXUQLTbJ;S#*LCe#OO>XYh)H3Bf zatSgyb4_ern_)f@cP>U8ZtnTHg$4Qjq~sL)vS>8cUuMUSBJ|A6LaXW1ETL4LQ$4>5 z{Unr1Np6onBL5I@&+)3*CJAdTMwQeuBwx^3C_=3Z{p$0st`=Ekpj6W6gYDQFjG9UI z`=9U1MOUwDb+6N$uE$Xj`jU*tvw~2VNhKDY%oh*$RN8&Tkp2$+nDqJTtEI(otcw-g zyf1%wNOXnA>;xOYcXJznCL=Ao$!9Z?da{eD(WGsQ^>hB4l#Dc|`;I1MF)AMkPt4Ey zSFQBX>+d2gwO9I7olZyboC*bxjZ}x3PJ@P=%uxyQUxMd!1H>4R^f{~N9r(+0jC(M8 zTWnq_OrP9~Tl%=r6Pd(99mz7d#~On^r0cgYSaZETlQEIWISZ0-n(biK5`UmvwTg_J zwQ+03n!ZFfs>&+z$oLnmHRUF<@jLv^6n1s=W(JFGO3ajy9u)!}8zWutD!cZ4rSSce zl$+w!tWqf1*Qfc&f(5J+QX^M0tpUJ-=<=u2NT;zYM}a+4ky4$e$0Nw2T`UB}>32nQ z6X34XQA|gT7yWE#KqYj)n>{IyH11dX0|PE)*p26av z{tf#4*Yzx7gd|3%4_pk+if_M!HiYNJ&NIPhnDC#yU8PAM=D6}U@TyWf;J~cydp|Y& zy#@ZxR5{NNOc}MxScY!z zi?e4b8eHj@TRZ&yM{|Q@lcesx%}FQU>Q}8?277UM_z&59R72(990k>Kba6b!@Gbyx zvF!ru?fN#ppUE`vQjGKh|AM`s-Rv^@#ZjoUdNrwBn6?Xb)cJ!4bZ#LW_D`Q93Nj;R zOZ0LDr`j(~bhL=~aDT$kOpp#SOB?BCqP^9H&CdEu`a>!_nEmb?t!eTg>XD~+yuLfX|y*zZbN7f!HsZPh++YZzuUignr{*7hV(t!%nyjbS4fr?YTJyHxHyK&>n}1Ba z0d<$Qnd#STymsb;Qss9mfKI1MDDFNlJU+}07P;@n)vK+T>);NK^tx8C336Q{rmX!C z+7OB8?Pu{|00;TN=C7>ke+*?v;Zysqdow@5S6l0cglWh{m>$u*Zp-o0Mo`CCT$Kqu zyaFAUzuSWD>Wc(NdCZg$vqCv~f#UJCpT^T-=K`!ben9EfP7Hr^tqdpugyo0S&l@s{ zZTW+1*Dr!eaWd|`JsJH~${~cN`z$eEucp+b3T+(~{@rIk>Tzw??{^@;tLqQfK=lXL z)x;^WBqN_|j}$0JBGQGoF-d_-vf+Xjrv87U&rRAoC}M-=r_8=YiO66``J+n&Ya7ez zOo+?0;25JnTBrnL`9RMP1^;)~He7^3h<9X`Q264<{I732$Jw1K?tc}P*`xf!MFJE!kg8ey1jPiMO6wnC2l&A!}OhpH~}@B&5zWc zt%CA(RAV_VnQyMn`>bB;lOQ45l+Bv`m>+(EFJWk(o5^4uI)ThxIxFuY2cy1oaa2KG zsn)(hfNgFknwC8AL9^dJB&@8ICkW`a_9aB?>{Nb|3L@aFw4beNSU2NIdU^jGK>V5f|umEw!7!xoX=g`q83URuMLg6|2`8g*g7b zw~D-c55W3ijDL6;xA(`o;rFiK(m98o+2y4JA+cMNM;&XG!#x;+E7_Mu-6nZl8hNcDIV0ynKa7eXfheg>h{VrmdD%0d*==5M-ohZou^Prv@H0(7fXDjga-~{--?ZglODcVEb)0% zM#ZYqG6Fm%9vA&>ORkYXzXb%t1!_z>PqokXBj=vN(WW@TgE0{JQ%8`n=jz%IS8^suKL$>=MFcfRu1FO-LSC4YK%-HW@N2 zD~-RD7#Y@rpWgXe8}vbNf8Rz5@GCV4Ui>=q7Q^d$%2%1#Lm3|FgajM*GB}ci{GPf; zqw0HrO(yh?jOlzK19&n!J`BL?MAkc>6zQ9ar>I~!I`c-|4j}UOXXd#f-qo-RpTqhF z?OE}#V!;hXCRivLv|ms~e6H525DvKf-PU8`+~x$c>AMnIuJ*CCk{s0?{@3Ft+Yja~ zt0YpvvR}~Lbm0+_6N$kTf+f`kf11~KIXF2pg?{@v&aVIQ@bL8A5(;wl2sgeRq#);} zvd>@@A>|nBb+f>siBG!|(Fp1$%@+!nayZ$4;Xp=6Bx89dL-hT)jS)T}BnikDmu=)P zr+g1@Cwh4Xo^k)fjO!^3S~e9bQh~aZ%1ZUvYX|hIN_D922g%*!U=@X=*67$V4! zh=laHo+_^Y=ApUoeYmhxA*hA!zS}+{+n^YM^EfqUNLM5ng)g4*+BPy`|6-2&obXM< zz_En$7SBSTT#+VTVwMqOEAg1caVPGcMb)-VG&bm%FyGX_eSA9A+Sf^^=6LwM+4GJP zlhi8ILWhLu&K@%rO7}tUvQDRfR>rPDPzhk!4bbR-GA+4qoGAw1Tf%#OzYEMi1rE7o zr|MPn*rd>=&lDIW7<%-3kMES}8W|bsqoQ}R`?mI`*9mGl;X(zEkW>R2LrZ#hc1@mg zyZ)Xe%W8v76Cr(atsxHKvY`e2yD5XnHqK z>Fypp-lg&$^?Z&U4U)y(F#Rs7Re*gXA`4LP<&n7$D{WVA{;4>sWmoW;+vwDc&-;sAEAGDGn)J1H<8tFaajA;$*Nwu<}b^b;s_m zNRTHF&PaF28IaK%*~k|onk{Q1dGIeNGIN{~D;ggjKECm_&`QtDj1u49-BH^2UG$0W znRAP$reU`){?uwn69(5lGn{LwZ@ z6TB&@ZhQhVP!W<05fl7Iiu%LWqxSj66xizYC={*ZABK4 za_G;|a3~N+Ur$eu>yx9W2-Os_<;xvaxfbIZsY+QN9TkC2YUGcC_a6JwV@vl*(?`k< z!&~aNPn%g0FBd;TeygqQm^xOov&gZWVfa0}NUKpXhSs6c60}ZgKY{WWf9XeZvEW4z zonz{29zIO@6Wi+XGp0g~ofyUV&s1o6mv4}hDN}~oQ{nzp!X=Q2ZrG6N&d<-yu`^Bd z-XGdVy(n^kY09M?I@AYo+ar1cI}8X~u!d~?Hzhe75eln|`aU#Zj`U&54zd0|zfW{2 zb+=Vwr(QCEx9=Pvd)bbL|GirZXV*wBgdEL?F4GiCw1B-*!`-z5`zKOGQ8vI7tsl{S z8_nQb%b-gC^qSP;ad9ZZhzCyLLHix)-qp$`kb?eZ6+6qEx&BJ<$ziQXdp>VLnwVafvRnI~h zNe>sjTq1X$R8h&Byu)clpclG)OvnZ_ZK_;Faj~I3xAbUQGy48msff6j43C4h9hgo_ zXC0qET60JpN_qPQixul&6RDrSRH#1gG?E-#VJnXIQ}1Gyqzn8J2Nv=&P`c(m;k44S$a;5Y1*oi zk55_pm|i+!_bZ~w0yKE4=+3;+%0jT$%}0sdw-is56;Z_K`J#>d3U-KuH|!^x58m3t z(o@Tx|4d#1`C}dR5(CW0-${L4n84rKdagt5XM^417mF|W*9QqN&*R^4*0qDKLJad4 z^la_q)h5aIG~SDn6PB*+Z#HY4p5T5M`a5Z7KYnAVr4=nAr=qS+81epNX!-r|htHE! zQ_L)kOlIwSmJEGZ-?DxFVN)4}^sYP!&l)@-5*xj~&!w2(WNjISt5D3Iv68O?g8k3$ z?EON=qm|mUx`U;B<_$aH%kgS}Sn# z!+@Rsm2;cTyjIZQKEXNOUuRhe{a-0;(YYOid^`Q>@-$-WVD=^KEnwm0;^G31|DnAU z$RsVFTlGuS3HFe7-Tz#Ax6^-<4_LMAIOP&lw7g@V$f3WqvP!~P`=+zN?phi)Gov_> zGhKu!W?xH3TSiK&C02?nZH|4{Wc?nGTRs2Oj1r*(9BTf)S8N|Isuo`l38|_jdLlf3jHlon&04%)9L40oL`tgBEI&Yn? zBk#M%WUP<#H}A)IfehyC*B49ZWe0uu2Ez`ba1;EUrG1Dh6g*s*(%+$L0N_8=XgJV;{#O=} zxQLGiRkAI$?&0KECPv*VF5#MP>968XzQ<(2Lu?l$N6G4^tP)Y^Pj@07p&px$jSpvn z0l1x=TM&-fS%S>$u8Vwwu&V(SzS|Z$>Bo7UYxo@%ncb_HK+gGjDJdy(Ypz&eHhIJ3 zB6P#RNY&DDRa1C-TYxZIN22R}#^2Xg9agk{V#a}&+YB{Du z98LkDIudjWhswDgM4&C981pQ`Ud-NW0wza33Z02$IvmIx;NWrB_9{gDBao|U!gtI+ za=s+pCN+Ceh-CY(`T9%6yI-$K`|Dp@fEuNri%4b)7JE$qT0tD_Sdh{mxye@ABSeV+ zz8<~~r~&$P*ct2v_pPIldO5^*r(5>%HpR~)U-ELY^G!`rL2kdn_OQ-=SD7_a5NMo` zk(2wNTYov$rg7Dee)7fZ*-<6huLj91iP(UUh-i3tn1YfLoKW`lA1?y~a{gpQ|CfDh zg}1z|AA*i4jIqB;>WhnSm|us{q&-IU8+sMUy{jNvk+>N3>TuuCD3n-`Fbe%nJ=nBL zbldN5NU6Ft>XQ#=A4&m0BUY45FDtBQMOKze z>&Su9st<5C7EA?|gj^qoLI*(kU>)=U>J{hC0>uxx4Bdl0iTPw6LRz0L2VlR8zYiXi zmh;15w8wT&&u*9<{0%&H(RV82`Kh)P9EJReXHow`q{ShVm;2|z3y3&s!!OFgQ{MRjFXo$Thw)C!KV5-l zO_>^xr(rfus+5@qPT$-@S?gx!59~W<;0~`-4Cl4p&T}kG-)U?8v-<}jujG)~(y)JJ zs`S5vyDkgpY^DuAzmz&H=C(u?%a)pY{CaFXB9C$SJw~>WNK8j#_{&&R;G~7@nEMe1 zUopVG>(?F;n>oK&6{cUn51t>b-0aUW|3}kThPBZ>Z{uE^;!>oz6?c~ch2lj6v`BGx z60}g<-Q6kf1g9;<3lw*Ew?N)~e*f$Ju*qh3lkAzZbI#0tX6}g?SSp?oJfP}X%G4RG z5dUOBc|037k>QUi9pdr}b!h0%@9(?sV-z&G=})T!xw?fHnp{=A#w{mn5a(LJ%Ra8y zXd#II+5O<4k8CL~VADF%9CcDX7mqMvxAAQA#i@b6c&eN3#b}u(KZ7Y5W($DDPr<{P6b66|dNdB})F5 zmlS>ZkX73ZEzip7U0o_w4oZVn<64557}XwS0j}>c0yUTavNzGZ#G@3t$w;HjVnZXa zwj><>eo-p7=g0e5B>^ZSdiR$b^!r&_{A~g@xfhPRnFDuWs#w9#o=OD6SdO)EET0=X zB)yfIh-x{$Wyz;!pk}Gcz|eL{RiB2L`e4StbSQQy#CmVcf7ZpVYoxt??UnOjV1okR zd9zf@40bnPfz}YCdv@nI%->|)GmSW(YVjjj zbRE<+g!oocfRhCWsraV<`e!Qt*JgK2g`zydZI51Q;p&vOtiujLWrXSv9_2MDGI-V* zW}R|4t~PQ2tl@Br%GSrbRpxSC9`$XPP|ISZKsS7M=1gSUk0D&-Ckk2H?b|wZT$Bfr z*RQb}$eZd;-IRU^3f05ch3@@Lzr7kQs6J-g_2t_Nk11~IQ?pWhYn17*KYwPqRuG`0 z8(uTB$Zn4w`^9=D!RhMu*q%Z?d%e(f{APCve!12vO=P35T-TkQPhHU8(No5U zv+AQ#Cpunr%T&r`U|8YWNm1l3y0&4RN5UM%_8AV-$E(i=e=T!L1?OTuyw@rIW#dj}WPvR<0EBCuCJ|N~xQi}33W?@$MPMMm z$&%Os1EoKpXk?MKiTR7C^k3)SzqO@Qo~u*_m453$V{skuc-=OMEGT4egR~sK@r}I1 znTOn-AYZGug6tmw=9oZW=SaIWI@y&YH>h7~Mt`hmC}T%oNaLQ(tEs80e5TUnADwJb z|LJA^%+ar(<4T8nutN>ITiqrhbrw)mLfFKDb%@yYobTQb1F znH+a;1k1m?kv^x$QxkVJf+Xgt`Csn!ULB4FoZ>*e*SY(Ha?1X7!V%!l+fv6XkU$2d zI0i)(yF=^WXVUG0gwOs^v%BM*N#g_@p$;7M^uoVkz(+J1Jpx7k1^RNjpMyUY4A>F5U<$ctr`4zd5eVv(KDfVs;8Z zq1P&!2gO6lzIQNK({h*pA?NgT!ODSR**rrf|Ngb_vHC%{O81bWqp749kS1YAK37JZ zGHx_VdSEmh*=kB+0`XPT2b9h;5h`~kxQIMw~<0&arx z`~D%MmWR%pbxE&pAn|k34JQq_#!*Ky3qhVe*7NT68%3*_;@Y04x!_oyy9A}wymWCN zkxnnS>JV3uN^2TMPHb1Z8@Z&%w&q6928P{*r#eeXzPR{&7>!@h z@7*!L0XJ-Y!o+ss<&x5UD1>zW_(Ky%9Kskz(RtmtXbbCtYYyIYTW&IzE% z-l|E9eLK|=304}?v8R|@9@y6hG`>Rp)3k6zJ@qli8cR%!1)<+H>0i_OI9m++rCX~K z8EpZPVtbB7qTcA8#KniCIbEur1FMG0cLl@Y=AlTLN?Wh*GF}cr#jcCuo_VpZM#<%R zS=3zEuU&ekSkgPp(5UTA^EdF@UP#G^@e+yDKdpCmnJ!fug7Uv%C#@$_pdii(A=W5hkr80O_Z4>hMnUO8K%KiLTI|u`6+{vI zYh2FAgA~j9XA9nU=hc#CU;j@{DCK7eYv(>drX#ROwx$j-U%jhlXvv~H`Kz0fkeev4 zr-x$692=jIqY+JV5yi=6*?TX22 zwScIzleLL&gYr0N$c7G8Awe?-gSO3=&rXZAM0mv8hj@UImv9-3^jRrp(DjJZVm;Hs zda?^(pxm^^7Sa(KO7%NlrAYNDF#UnPVQ6GZoY zA%<;qQ3H|QrU7s=Au12^rV8^fsD63b`n!SYp| zB-GPS)|Kt{Ew)t^QTZD|6(yC*WTGJ3X3I~%RAHuYkV zSO=4|hIv{*AFii)OeQvkmDjPMNGL=uD=<90+VG60fNYriwysos(e z4Vh9;jXO8Pk{q`;ekZotWc#^|7rhhdI`@K*aw&6{?hP0D8Tl_9wldYD7$h9=+fbwz zyEwDmG(mMH)(7L7y)U{FE$Pa_B$()S|B9v?8QvvkW@23naQPFs_)nS15J(}V31(#e zl;@Xx^$$^?T!(^C-XTp{G#TGg_`MflHIn7c9u8fHq-vP1Q~ksD>fZ~}zS@M}gkiY6 z?K%sNHdu|;r8M26l5klkYp>x6b1qutsh3PBz z#ZE=o_*JIzQ6sZD!hqeqxl_**qnZJAxCCU#<4xG86j_7I^jQKWU*3m_q_ynr}I~ZY`5%J zs4}hPeMj#XR}zXC8QYIxD$ZMr2SIBBMUk3?ESg1PF3KyyFu#nnyhtI_lh}c`G+&k* z23pR%wK~iBU>kOn!Ef?0;~Pg@pzCuh$nh!zx@kzPt$r1LO{^N!i)a0~`5;g-8Gq z?}5nmx8mmHB_y5vuJOHN2h{u6{Euw!BcsrakGVt?zo_A4-JX3p{fB*jxDK{5;fYyc z8bMHwj8ZJn+4S^udcw{HT^9|WN=jtqqOS!JBWl}M z==SyPY~M2@GxJj`qU|APG2?In##RM2u0$Qi8ZIngJj9|c=)XwjKq!x+@P8|B`>m1Z za>AW9b$>KLDN>?F5dt;NpSYe6POVDplHSUG{kwnvU1g)DxwMRwaQ%E;u6;fvJzqu` zQ8w(g)z=G2kAc^8;`wVllC%QzwCUc z#stSCEPCb#~ph17T2~z>@gqw-He_I^Z0I)(|{lPKICEx94Hp5p{ zMTK5el%l)mxgU!No_5DYsv4 z`J9XwF#6I4*0n@@BHpIZUhz#h>*!@`4HY?F_+$cLKvF8qM+{cx^0#8A6F4W;ez{q zmE*)3wY#8V+XKjZBTWA_r=h!-P-z8{Dbu~(G}C{nwRP^zb!rxNbJZ78UQRs^R&&(` zL_m`Na179^=+rYL?imPTT5fwu(?>W3za5niUTrKPFx~gah=|jAec^Z&qofAs{y9L` z*K~<)Ib7m2-0bGxe&B=6qZOqyNJrIAFe6P*#rqRO$LG@T!6uM+?jI@qE%)&B zakMYZ`kHS_9@W&<9pyq-hT@6-0HIEy>Y7%DOvAyAD!yR~*~?~6q|&_3+z5Y=agIwlG>Z&9dwM@ zTE4LntE6D$N2%W~P_Xd_p(_rTe2;zGh=4)xO}@UOz{NYcUt&6puw)V^Fmo;$i9(=> zOZ5@|+(K^Tw>8Zxt&e!(=YigPIbM&gM5&x7bEsj3jzcQ&J%CQ(>aX^*5xosC`T@aS z&W_S0ahnZY^$V2Ypl9f+XlEm)Gz*&=KC`K-nhpyCO5VJ|^IGdWA}5dy`Z+xdB8QP= zluE8!D_*akO`4&Im96v z%{|}erp`MCH74P_{O_N6LYUq^+Jc9N%jdb*v{^O{i;^0%-b_Wr0uXU(Q(c=>#+8d4frNvEXsacf1UO_>hJA!D%gk|3TKFlMIsMOT*zzf_pK_S`Hj-l74Tv?>) zcs1#Kqg$MX)o3_;dTzxJ{zNxy%$}g&pH}%PM`CcE>VhaigcWMCc@TAk!Pp(ETwC@0 zhzu3JG9g&6%Q(X`Bz&=azS*2{IYK*mxDgsJJA!v_^zUs?#C`Hw_Tu^jkz9fI1ji@1 zT@3p`;Yag67os}}H+hl9JdMMjo8^7QY5YPBYoxDPySbPv4+(QDymLu=P5qU>{-hyF z#-DZd&J*?NCypD~A*dO8((Tc>deP6rxr0xeEH^GY5sUSvcX31S>FfcfqG8NwRUhR5}*t4l-f0JZLr}djx(w`7L zY7E8{h`@RFes)-(PIYM)t@hv;>Duc&;dEfVXJZioXcheAFoxAslWv#GE{{i&_qF}2 z{-uv?e z7eN|X>m#LK5AM$!Ka~`%8QoiUX(OJX?gv_$xQK|X63f3+*wKgJAf=BALnT_z4-{6M zZK}@g#)rdg{2f!z^cJ8qwQa0)R{x7KjrwF@z z;`L|q(}_H>w(+v9Im`x3wq@iB=$_Ql{?U;X<$i?!_VaTEiXR^YvJ40KHI>y=Rkwht zPF_g~{Ujx0%Z&M-tX>1ej@caht_c_5ecCL(@>^!F7E2sIZ z#vzjLA_bIB4$u6%J#Hbv?|)PsIm=j$lAu}$H+yy6%AI_Ym^+h{koG? z*yHIhm^Ed9&$HaVN+=jCbi@4j_C%N~=%lVHSE zB-B9x_c$c&9K1?{yo5VcZPY)L!bITnua-*fGjH=waVeC)vB)3(iP0MDCPOX6iW*R~ zHAGwV>_0DZVj(uh?sEy~%YP_oyAVS)TBGv(bsbd->Qk7h%P%OPDVvF1I?1muNYyNQ z%jYs}zxv<#n6(6*&D$YVi;GAkm&cq$R@bM^*t)&KJ?yY$%dq~I+4#=tk8S%8vIQ3d zfu9?gF)YjCJ`2uo{SeUB@+S+gA#ZHY1s2FKbs-WmEC#<&=CXL7ETYHH=l|S=1@ZWx zCC2f5`0dB8mi1eMwliF8PxWbH?*TftueNe?C%V3nD}^5?_0skc>Wdc_oBf|G3X6*B zKXJV1ySwvaW@UN1Z~GtWpOJTA@z9HYf2_%~BjRdb?tbXSq#LvsEHGapRy}o+p>Lsc zMYfucgVcBT@nvJC>G>*TbBbIZOQRqdQsijG`}^(J1UGi+)7hG)sa32YEa2h?dGZLELKstjSryMHXq7>YpJMwzz(5UE&(|`0oW+5nIzFQ)- z&(~QN2{Y-$H%gq067%Y-y}jDbb-Hp|>1b~1>Jo7Iw&GaU-k#xi+Rl9Bp9d#6ihUX{ zCHnJUL$Oz1KpU;CFL~Z(#VHGo*4oC)nZLP&gwkT{w_BN|%=?z$OM4SBJ%(;N0vV%W zZBc1$Lj!&S4{0mE{m#HN^#Jq4XYmj6!VODgUhAuqGTVX~EHdaD6HV!X~&P z*X;*mzhNxX1*=?#;gW=oEB}Bh*GkAMRNN2v2_rA_*;4~z&dUKv$ z)U^_gmJ6{p7NLsochBu9C^=qkL;sp*FLcT^b#{F*{&%%pOr2ot^!`WPdv_pV46M-Z zelU&5uq&0N*8i+nR9>|(BvJEP+0^$dX_eOvTy%LM8v>AKlptK~h1Xb*0;x#`Sl5&U zKqiKmVMx+l4iNDZlrBXj$eiplc5D~?6EDB5Egg`@Rl*L#>+31w=lb1!p&+ax<_;Rj zCDR*={;=B9Y@KA;tvLR;>%(`JDQ)vjJEe&qXgQ(<@8c8m+aIQ!D{OLu7annVaQ~=da7M8%v|A=qV}MO_Qe;A}H%S ze{l2V%U+V0F9&)Lo4r@;>L1$36n6c{%c{EJPGlWW7aYy2z9e3m51`a?amd z>+rBU07%I*q#%-5VMt-JL1R`|PypEcuT;Z-8+Z4$*1>}y#2S}n<;1IYj5Y!oB7ef+ zyUxO}c98-BO#x*QF=SoCbr*>YH^5UkUg=DO!Tg~ay5L`Sv3_@_|D~jw#L5U#sC4<8eHwq*l5`*JxOJ~ z*a`su%csbLJj?NFS zGgE-*91u`RVPPhjnSU_Rea~7Hg!XnV3stajZRkq#Up*I zsI%T6^to}V;wu6QI}+Rb=K~^{lB3%g@9P7hA*EdJ53s8Q+RIi|(yPHnxQ6k?H2iAq z?+g9#0-QD5W#P8pLHZ+RERZRN@WVVr2koTcBy35xTiP$A|4xcX>3^`j^Wq5@U;;W7SR((Oc!IBsXm2nv0sZq+c^jZ0Ywh>q zjKS|UUOl?rtIWQoK>@qD2OL&%$aL?sh+Bq18o_N_?s|&8DFKb@L&P?)-ae800SxYe z3;5mI0~h*m>@b-6?4;DrBS%M0;M+l8v{FQ#-f7s{CqG^#jLiL6O7mZerpzU=rL#A$ zi2EE_3$1kd-QnYrv^rNwoIrnXOp_O|^O6QdaAaG!-sndOc%_MvPpBE`%7j6!R~C+e zDDHlYLWCP9`CLloFj+V|yzVaguce3#k=8LTD>+$1zUKFUv8bMTw?gCC@K5uBrN6l< z>S~)`ejP~WP1t)_I5uhP>ni%H5E>W|BDBxL^)j*^)$!w)*vLp>aznHA# zIe5#+KT)o4CLrTXjaGf7ACMIRQG1=Q_aQPvoiUgSocdtE!;0|l*wb%ck}@Bt<7FwW zs6;Y4vGD+H#sHWcYikwDW_TO9Lbw^?iW>L-Wt;VBt{4)zxCNueLWa^3M%tT1!jTzj z%;!%#uyfSshd0oW=BT6|%Z;{Jk5g?4txa~(B4$-1kE4n!;pmClqyNok479ed!rB0t ziH?*p(RQ_Z7hD zCJk374cDuB#U_8hKjReHy7Dxi531Qn&R$uK)~gygaL=DTOy@C2(KnWi0daK33fKt& z;Ad}3+uB|G<5EwXH0<(saLv)M={pIny0VUzZ`*^6mzP(+Mkkm>c)uSmQqbS{&c$?p z>7e3RGx`q==6xeV;+KTlIQt$D>fEC*p>~M?c;PxDJu|GiC-<_F;*TCP0KsGassOHD zlr*`*X3Vb>a!6EmMwm>vtg5KkXq=Edx^s)4)n{=x7jBc%Szkz(k`G7`5E2S0?${PI z8fAB;%*WYp#sYHV?(`ILjz<1xOGT2f50pJ^GR!eUkwH<8onuGH1)r52MHWWUN?ghx zUsvS@{tPdD9=Uj^@PIFN&D{=-?-7HJeRR!hh(jm5y6F6SKBxTX*{7|9PpmG5D{1CF zujMVQFlK#`>sPf1#sUgN2C}G<)W{OAIXNhBXsPzK2uey+O6pcNFTVb2XLmDqTXy0` zTl#X!*4#5m|H-JCEis>-4HGGN@*a&Xh!H>0KJkNR;}wk8?*mXU+0)v~+6(#kPFOG_ z&2G1I{`lDcPQ30)yiQX=l1tQ*W^&A?6(!6v9{qtqoa#6U}mADsS!Oj!i}4%^cKR94!@R z_2GqT;f~j-F8e-(uPo1#OA-{1iv4tAi?tk!=KiazOUgy?&X>tI*{G2gSWWjmaQ0-!^I%_`lRL;GR%^SqmQ295>lVy zYSr|Ktx6w=UWpPUO+7w?Jqit5m&WXdXfImvTF!5h%BmiMf5}FRw6wHP#EM{zUOyhy zwZfjgNMg(LpJVi|V)FvbCx!CG-^(qnYQAbpIu*XYjq*y)Y2PRer-dJnLAVeVqgf9v zP(th-9!N%X_14cWd0PWG3nMYvTU?#dyF{(Z4gU$_HK8i4qg^VtlZzCF-g(mK+>JIw zGxpKzqR`57(T1MAVSgGxvI3X1Au$4SP>a zZPHyCe{v=@_z5J!#PFR0TYUSf5emu>J2dlx9(*z{oWz=B*JnSVS%a0nyYMnH$`XBh ze^XVbZe-ivD#Vg|KLmk`u>)y<5o-#hCWEomVt?C=oa)$&m5|_5p&)=|Yx-s$#0__cLoTW~f461L z`Ocu_z-(vP#?LZ-1~rE7dQo@xjo1zSK0emg2bJw&muBLh-93qv*@-&+PzcbF^&h&G zU%#Y=$x^tDj|CxTt&PLCtBH2LL13dh>7L*6AW|vJmyg63evZG=3kx2e4CM%ieAdsj zz^*;~R&SqcdLuuG&x%GB@+QbTpm);!pxrBM zc=}y^&ifYFXddX-->+qjZX<4&@0lT-6?pmWK8+n+t~)BPIX>mbB9G@v7`+O9xSqjF z6zP70792u#d|1*{obCtimaWYtma^H;1=YomD#fmw>2o9Z$txMe5NHIxxKAm-YFbhS zs`Qt*q=i1HNf03OQlos49W5rIOxVfYxSR5_n*?#f58g>nW3?YSW)-S(?9IMNS4352uNk)Chcq@21g6c36YeJij&qAK&9-d>J!U;VcMYPb8_ z=Sl~$A?$$n!YiT`ipL6*) zoj83CtwKQJyyj&){BUfmmu&13LZgM7ntajM)g^wpT-5G(VJUtc4!yb(gAQGSo_Lqz^+Hb%k5`uKrFFGO`5-=y<0}xTwM&k6+!rUVY>l9@_J}<*D$cM-bS9=zzE6)fPIh~j?6nb*2qbN=NOs_(wb}#O!1FIN9Lq}g;p05wqG*S()gNW51Zd_Ky=h4*!Oe}9>W3KEUgN}8+YbbVoULKX2cu}WVnfW` z6hP*})A|pVqumLPLkC_s-SY=te^v2Tj2JYaMW(LYH3@rp=hn4tPmaweS6*u$YDm?6 z&B|9chU-Rl(m-HXrEZmE7U0<-01Qk0uUM;jPqs?ZOg8~iIgJiB)s_c0 zGAz-GO0DHAPEO9l1`JUjK#wX!JF(!ep|&N|!b<~BnPw!NZ!ahXLKuWrdBV}ppa~(=HSW}h>ltO>p>oZU^E!yQJZRz#&C^<5`Ppt# zTnkSjzwhq%FO#dK(a2n%en>YXgpsh^E`)WS8graDotd5W2v#z;&x%t90`wH5($AAa z((X5mLQhL#|JGLfOuV>SbXiQ>A8lhP#YBrrMw*n%JeUWqAE|E=@$ndB3=Opzo<>R1 zwgIt^{fzOtf~|Np-V-v>S$_RsyP3ub<_lF&uBI{4(UBJ(%2&QaTJH@)9$93ST-csR zOJ*brO|+F(X?dtY%ZYe4jCih444~KmDkY{E8X09s1^^3~0J-(Q#}H?lb>_OBeNpgj z7-CvT7q7Mk_Q@wG_@_VFeu>!^Ok~NS6D}gUK=ce{(yVB$eZyC>)HrdZyL&`9X#42d zsE*sKxRE7XEW&6TNF+hrk*MX@Z-}wzT%?i*x<NuXGZ-kVjKc7D6N;?;HMTr2EaLK712Zw^UcU~#v4G*-#?bBzq zXMSAd{SncIYKWm>{BYSaI_$w-{p$T>O!@W~34IGNvD}!KQ$vVH0sfE1C``u`pi@ReOLmciH!-W(3LR>R9qg z?H50OKk`3YAIl^ua)Nq3LjEO~UWj@V5@U7m!Au$7*XiO=x2tMtXPfyXkvP>~$Xz0n z+@m_t9~~c4xLk2}oD18F{7$Afq2uirCX zhX`45yCozuvxFJ}p$TBQKR@2w`^!{TX_S@!8%VvI{``n- zrvY26EH95B?B56+aJj{(SxZg)muW#h|AxXc1^Hq{h*`XhLF9cfiORd5&rN4vOYQ%XNk`CT z&-8p(JwrY9j`AALR?oxnIhBP;JQFKRMv5rM;SGC7+FW^sEQLgYgQY=q<)R;-9({#N zEp+6G_ru(<849KMOu$$@r|JS&O+U4VxxtN*onY}ixtsuwrvrLikK2ni=!4+P3xYCN z>B}Mf2M+{Eg_z}dxjsX_NLm3&T-qrvPFlL&r8yz5(RyMxjMNl+;#K)E$nCfO_#f!~ zSd1dyU>Q~d2HT~BIu^D|1K64Kn2`I#2bYwW-<8_7^}i?TwPxxhnRx|g4~k>%-p;O1 z{4tp^pmKED+BC29!JL0e--;&QhsA$)5lp~i$>pn;|A`x! z?I5{8pCZgFKjZC#`y=-6KuKfbnFUBheVD?!PN^Il2gh#Cutox-!}_;qDhjMEyfCyt zjW>)~Hl6Va4=c2k@fAuI_#)Tz0o~opPf=l^@y>N$<8yZ=HpF`cF!vC9JnP>fcgw*m<#$p<%*~Y7evMlu;TX<8voKCXGA6N-+OZVa`IOhSiAW9_wVHN z^nZ*$9N%+ZsPy7-3DkDP2QcY>YtiN-MV?a~z(lBWez5Oh>vccT zQ-K3+7zGJ>Se-Xh`-L#Dt2}g#An%a;ba=`y$N4$Ji8mP@g+OCU>-JVsoa*eftOl>R zpFpMlsLQ{jV~NZI%l-R>rqunpcKq2l7$M`=a{CxY)`Vh6z;Xk~th^UeK2xDJB)j}Lq8ng+bh!!-aiXFI>k13x0x zoH$%x-@5+!a_`-(McdSD@+(|?BQyyU1$O=I%4sdb?nyORINLr+m?Bb1yuVuz~tfQ!y ze-q7NDL0Je6jgD1=VEB}`Q9I~BLMy2*5hO2o^EaBVt+=|MrGxgfAeQPVri#&nUcy; zX|F-b1eZ^*p)X*myOqDdh1@)Z~AAAmcgpuq9zM_|}mdRdE|7M8eD&-L^TDiJ1to7%}gYg3&)fTfkuv#(499iZNH6JMt3sgS+qGkTs7 zgqnC?Pbrmf8nw`wDh1!mc;h%r%W^qy^V$BzsJKdU7)pcrJ=Vq2nj}JP>z{5bKzM?% z9St~N8Ao{&SAx`t0%i{a%Ny?XU)bxcx8=+d5r3|jv|S)*)!un2ex-!x+f(gcQXr8d zoEAZWASh)4RO)F;h|}Z`U{5#WdqSXj4ojYm4o4%fqag(BTFEq%F-{IsZ{6Rtf5_o8 zblu>GkDL?OT*7HFlxr4?OJ0|YlR#>0&rj}Z7ze| z-npHFLkyNX0N&&I-5%Hb$I2Iw_I&~wSDm>2k|GI(XEKJqZ zebMDUJUjo}fxEl68}2)CfOSoi*|BBU1=7B@U5Lg;#}#-!>UV9=`5cAh|F52wrO-VY z9fL5rAe=rQpHw1w2K$}`4fizA)EbXC^`gWT-ATy7!W9$e8zH3ezxI}ZUhY6UX5n~& zUuTAqKOTQW1$8oV(vFYgc{Tv^tG|QNz|sWo-XDjh7V?&-y{n0;(L#sH<-$tb-o9JU zhv2IT>tC(V4+aM0`SReN%irvQT9*eGQt*tBlatGG-p`ChZj9IrcOSYuMdY`jO0~Zh zZ^&`C>cidOM63!{$=~7~z&}rKXltE)6k{x(@*sP{KEL3Uiye3PMONdxMWp&Wy4h}; zeX%7+r!F72x!kV1_R=48(Z}rePE($QD-IDHk~Osi6Nlmc{mGTC%crs`U!;mgHMV;T zLZYigzl~3LUKCifl@Z6FRm3Alo4cmSe|=;BTu#EGdjHC(`SppkpC4t?+Yegv+)IUO z5$xyv?h4!2OH;+hpr>(qR0?H=S>5EsLv5? z@E>0B%Mq#HNoDFOO?yAEMH0mPU78@C2d`-z{P+m|yoKOSIo~|qlcK=wRxV2rh<#OD zc1apOygy7u#8T2(7rPG&9cZLnw)cpk2C;Z-F8blKSRPqFtH@nq9xrJ049ILTKONwu zXdaI<|2qsf4Y=QAa zeMOiHG};ZwhiMaH{87R4M*_x<_V&f~^#qn$g*NBiYvtdA}>^sSg9>o zDk@-^$*3d5xl?_W;Q@X*WtKbdMKyzK|G^dbWh#i?{Yh36SG3pmmB?1nys*=zNOjgH z`7tF>LYzE7cKwy0E=K0tHOSzN1~#8pnL%)K&x(1_c^dboz6HhljV}pTU93_7S#b&t z1^FthxAcSDlht^%zg)#>mI&YNjntwPyr>4AiZWSw6DFFbys~=mqHGswG@%QF&|YvKlHw(hn&8SyhVq6TqC@Q`1;d5G%d?=miEPx2u2&vh$b#9yaj z{kPXsEo%AFh9pc?0~HZawJg%_@M+!@a=XH#f1&+KZ)44C-?^$?x_|eOjkiQndfLlVhHDeZ@O?UgfZu~v=rLZKJ?@%TR2PF9?6w!Sl(^wojNj?A@TBOf@Sq#Lb>Sb+Nimi{zNLKHE2Zn zkl#8jX-e5AMU}wH&Xamil1z;7!+A_Lx99TffS_S@dT0N;I%$pzBAC_diDbJ{`D!PK zm0v&XR|M@K6kgM>23s!qJ&66HE`_`jNrOpn{Mg0b{o1VZ#{d?&?U z%?5mEe4TEe|eZO^1CkE|i5a zh8Igl#4KW@Wq1DlAoE@(neHw28*u%7nK2(zB#1lWd;f9n>$@&b32Gi9=q_pIS8xG2 zq)dwGB7_XdM*n;?oY@G}XWbOF~1o?QQX6JqcP=OgDu52c(Jzv`P8hZ0^ zg>2|yhRV2Cb&2>=0Z*UkZJ43>QVd`|0=3<%aGQEnJy`W6<@dZmumt%_^rt|xIFj;k z#`khVr2?B}9V!mNnuj5s#aaPh6VwTaM-8LuiW-rNPQFKi-XiHHHX~`&LG@m9i!B}y z9ATF~2ahyvU(=IS)y$#?>KShuxcU-AF9`lZ&!_or=yP!&M$-0m<}JY18LAZr@^M)F zTkaUQ+RAz=$qv(t2PHav<@f>Z1bNIKB(OnKcT+PaGCZs(&~)>a@P}-niZqYy5hr_+x0}{N z9a%I31_H<`YzMZ!*#vy4p@Pw;9BPU9vfPsK2VBmU7a z^9-|1e7^dwfAS?J0ij< z!BsH(UIWs}zg%IBuDf_P+bx`c{X4sPJIf5w_mO_F-k*5A6q2)MOb%lkYD2Te)vgnV zZmnCC+C@HJlv$9!V!ju9Zc|+WUcYYfko0=bf%HcfzAY(5FPpWk#72CS_~Nk9#vhUQ z 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%0Aa{V3RU$W*(MU?yP}s)#;>Eks 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

>>yUc?{`fVL!Riy6r*zbsT*hA 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

dTGGL7AJlJntO@gCkNl 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 B4=Vrw From 88fd88e25bce4a37fa98b9b389667495c148a910 Mon Sep 17 00:00:00 2001 From: Mark van Alphen Date: Mon, 6 May 2019 05:29:04 +0200 Subject: [PATCH 05/55] Add custom glasses for Reyblood --- code/modules/customitems/item_defines.dm | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/code/modules/customitems/item_defines.dm b/code/modules/customitems/item_defines.dm index d2b32f720cf..021146e84dd 100644 --- a/code/modules/customitems/item_defines.dm +++ b/code/modules/customitems/item_defines.dm @@ -1785,4 +1785,18 @@ item_state = "voxbodysuit" item_color = "voxbodysuit" body_parts_covered = HEAD|UPPER_TORSO|LOWER_TORSO|LEGS|ARMS - species_fit = list("Vox") \ No newline at end of file + species_fit = list("Vox") + +/obj/item/clothing/glasses/night/fluff/reyblood //Reyblood: All characters + name = "Custom Night Vision Goggles" + desc = "These customized night vision goggles completely remove all darkness." + lighting_alpha = LIGHTING_PLANE_ALPHA_INVISIBLE + + var/limited_to_ckey = "reyblood" + +/obj/item/clothing/glasses/night/fluff/reyblood/mob_can_equip(mob/user, slot) + . = ..() + + if(. && user.ckey != limited_to_ckey) + to_chat(user, "These glasses can only be used by [limited_to_ckey], as they are not able to play the game with lighting enabled due to hardware limitations.") + . = FALSE From 6c14ac302c3d376d1100eef293dad1ef7248acf1 Mon Sep 17 00:00:00 2001 From: Mark van Alphen Date: Mon, 6 May 2019 05:47:49 +0200 Subject: [PATCH 06/55] Switch to material glasses --- code/modules/clothing/glasses/glasses.dm | 9 +++++++++ code/modules/customitems/item_defines.dm | 14 -------------- 2 files changed, 9 insertions(+), 14 deletions(-) diff --git a/code/modules/clothing/glasses/glasses.dm b/code/modules/clothing/glasses/glasses.dm index b527bb2717d..aa123156775 100644 --- a/code/modules/clothing/glasses/glasses.dm +++ b/code/modules/clothing/glasses/glasses.dm @@ -177,6 +177,15 @@ flags = NODROP flags_cover = null +/obj/item/clothing/glasses/material/lighting + name = "Neutron Goggles" + desc = "These odd glasses use a form of neutron-based imaging to completely negate the effects of light and darkness." + origin_tech = null + vision_flags = 0 + + flags = NODROP + lighting_alpha = LIGHTING_PLANE_ALPHA_INVISIBLE + /obj/item/clothing/glasses/regular name = "prescription glasses" desc = "Made by Nerd. Co." diff --git a/code/modules/customitems/item_defines.dm b/code/modules/customitems/item_defines.dm index 021146e84dd..6181644ffc8 100644 --- a/code/modules/customitems/item_defines.dm +++ b/code/modules/customitems/item_defines.dm @@ -1786,17 +1786,3 @@ item_color = "voxbodysuit" body_parts_covered = HEAD|UPPER_TORSO|LOWER_TORSO|LEGS|ARMS species_fit = list("Vox") - -/obj/item/clothing/glasses/night/fluff/reyblood //Reyblood: All characters - name = "Custom Night Vision Goggles" - desc = "These customized night vision goggles completely remove all darkness." - lighting_alpha = LIGHTING_PLANE_ALPHA_INVISIBLE - - var/limited_to_ckey = "reyblood" - -/obj/item/clothing/glasses/night/fluff/reyblood/mob_can_equip(mob/user, slot) - . = ..() - - if(. && user.ckey != limited_to_ckey) - to_chat(user, "These glasses can only be used by [limited_to_ckey], as they are not able to play the game with lighting enabled due to hardware limitations.") - . = FALSE From 19d8efef6806b27bc10b625362c4c7cb5fe3d1d6 Mon Sep 17 00:00:00 2001 From: AffectedArc07 Date: Mon, 6 May 2019 10:08:28 +0100 Subject: [PATCH 07/55] Morgue Updating [Hooks P4] --- code/controllers/hooks-defs.dm | 16 +--------------- code/game/objects/structures/morgue.dm | 12 +----------- code/modules/mob/login.dm | 3 +-- code/modules/mob/logout.dm | 2 +- code/modules/mob/new_player/login.dm | 2 +- 5 files changed, 5 insertions(+), 30 deletions(-) diff --git a/code/controllers/hooks-defs.dm b/code/controllers/hooks-defs.dm index b080c279d93..433e2647d32 100644 --- a/code/controllers/hooks-defs.dm +++ b/code/controllers/hooks-defs.dm @@ -15,18 +15,4 @@ * Called in supervisor.dm when a captain spawns * Parameters: var/mob/living/carbon/human/captain */ -/hook/captain_spawned - -/** - * Mob login hook. - * Called in login.dm when a player logs in to a mob. - * Parameters: var/client/client, var/mob/mob - */ -/hook/mob_login - - /** - * Mob logout hook. - * Called in logout.dm when a player logs out of a mob. - * Parameters: var/client/client, var/mob/mob - */ -/hook/mob_logout +/hook/captain_spawned \ No newline at end of file diff --git a/code/game/objects/structures/morgue.dm b/code/game/objects/structures/morgue.dm index 3001b52f399..2953744a824 100644 --- a/code/game/objects/structures/morgue.dm +++ b/code/game/objects/structures/morgue.dm @@ -484,14 +484,4 @@ if(istype(C)) //We found our corpse, is it inside a morgue? morgue = get(C.loc, /obj/structure/morgue) if(morgue) - morgue.update() - -/hook/mob_login/proc/update_morgue(var/client/client, var/mob/mob) - //Update morgues on login - mob.update_morgue() - return 1 - -/hook/mob_logout/proc/update_morgue(var/client/client, var/mob/mob) - //Update morgues on logout - mob.update_morgue() - return 1 + morgue.update() \ No newline at end of file diff --git a/code/modules/mob/login.dm b/code/modules/mob/login.dm index 0a1346fd0ed..f5f1924e395 100644 --- a/code/modules/mob/login.dm +++ b/code/modules/mob/login.dm @@ -70,5 +70,4 @@ AA.display_to(list(src)) update_client_colour(0) - - callHook("mob_login", list("client" = client, "mob" = src)) + update_morgue() diff --git a/code/modules/mob/logout.dm b/code/modules/mob/logout.dm index f409d184340..cb92665e2fc 100644 --- a/code/modules/mob/logout.dm +++ b/code/modules/mob/logout.dm @@ -16,5 +16,5 @@ send2irc(config.admin_notify_irc, "[key_name(src)] logged out - No active admins, [admincounter[2]] non-admin staff, [admincounter[3]] inactive staff.") ..() - callHook("mob_logout", list("client" = client, "mob" = src)) + update_morgue() return 1 diff --git a/code/modules/mob/new_player/login.dm b/code/modules/mob/new_player/login.dm index 1c7b06b1ce1..45f64f3acb1 100644 --- a/code/modules/mob/new_player/login.dm +++ b/code/modules/mob/new_player/login.dm @@ -27,7 +27,7 @@ loc = pick(watch_locations) */ - callHook("mob_login", list("client" = client, "mob" = src)) + update_morgue() // Why is this called for new players that dont even have a morgue new_player_panel() From 1d1efe2852091208cef3a9629f2e523d6ea93b07 Mon Sep 17 00:00:00 2001 From: datlo Date: Tue, 7 May 2019 14:29:03 +0100 Subject: [PATCH 08/55] Fix golem getting selected as auto traitors --- code/game/gamemodes/autotraitor/autotraitor.dm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/game/gamemodes/autotraitor/autotraitor.dm b/code/game/gamemodes/autotraitor/autotraitor.dm index 97371f6d35b..d305cc566a5 100644 --- a/code/game/gamemodes/autotraitor/autotraitor.dm +++ b/code/game/gamemodes/autotraitor/autotraitor.dm @@ -96,7 +96,8 @@ for(var/obj/item/implant/mindshield/I in H.contents) if(I && I.implanted) possible_traitors -= player - + if(isgolem(H)) + possible_traitors -= player //message_admins("Live Players: [playercount]") //message_admins("Live Traitors: [traitorcount]") // message_admins("Potential Traitors:") From 29f95173fcfbc7bd2d21b2f114153b79a94f5029 Mon Sep 17 00:00:00 2001 From: AffectedArc07 Date: Tue, 7 May 2019 22:08:38 +0100 Subject: [PATCH 09/55] This wont cause a problem *server dies* --- code/modules/mob/new_player/login.dm | 2 -- 1 file changed, 2 deletions(-) diff --git a/code/modules/mob/new_player/login.dm b/code/modules/mob/new_player/login.dm index 45f64f3acb1..090a661deab 100644 --- a/code/modules/mob/new_player/login.dm +++ b/code/modules/mob/new_player/login.dm @@ -27,8 +27,6 @@ loc = pick(watch_locations) */ - update_morgue() // Why is this called for new players that dont even have a morgue - new_player_panel() spawn(30) From 5049c66af0dbc8d7019740296b16356fba5d790a Mon Sep 17 00:00:00 2001 From: Fel Date: Tue, 7 May 2019 21:31:04 -0400 Subject: [PATCH 10/55] When you imply, you make an imp out of l and y. That doesn't make any sense. --- code/game/dna/genes/vg_powers.dm | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/code/game/dna/genes/vg_powers.dm b/code/game/dna/genes/vg_powers.dm index f340ff413aa..0bc2d14acf3 100644 --- a/code/game/dna/genes/vg_powers.dm +++ b/code/game/dna/genes/vg_powers.dm @@ -188,7 +188,7 @@ ..() block=REMOTETALKBLOCK -/datum/dna/gene/basic/grant_spell/remotetalk/activate(var/mob/user) +/datum/dna/gene/basic/grant_spell/remotetalk/activate(mob/user) ..() user.AddSpell(new /obj/effect/proc_holder/spell/targeted/mindscan(null)) @@ -288,7 +288,8 @@ perform(targets, user = user) /obj/effect/proc_holder/spell/targeted/mindscan/cast(list/targets, mob/user = usr) - if(!ishuman(user)) return + if(!ishuman(user)) + return for(var/mob/living/target in targets) var/message = "You feel your mind expand briefly... (Click to send a message.)" if(REMOTE_TALK in target.mutations) @@ -301,7 +302,6 @@ /obj/effect/proc_holder/spell/targeted/mindscan/proc/removeAvailability(var/mob/living/target) if(target in available_targets) available_targets -= target - return /obj/effect/proc_holder/spell/targeted/mindscan/Topic(href, href_list) var/mob/living/user @@ -329,6 +329,10 @@ for(var/mob/dead/observer/G in GLOB.player_list) G.show_message("Telepathic response from [target] ([ghost_follow_link(target, ghost=G)]) to [user] ([ghost_follow_link(user, ghost=G)]): [say]") +/obj/effect/proc_holder/spell/targeted/mindscan/Destroy() + available_targets.Cut() + ..() + /datum/dna/gene/basic/grant_spell/remoteview name="Remote Viewing" activation_messages=list("Your mind can see things from afar.") From 345664fafcd3aa0ad588ffd09dfac21d6b60cc94 Mon Sep 17 00:00:00 2001 From: Fel Date: Wed, 8 May 2019 05:07:12 -0400 Subject: [PATCH 11/55] Breakfast --- code/game/dna/genes/vg_powers.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/dna/genes/vg_powers.dm b/code/game/dna/genes/vg_powers.dm index 0bc2d14acf3..fb56aa0e2ea 100644 --- a/code/game/dna/genes/vg_powers.dm +++ b/code/game/dna/genes/vg_powers.dm @@ -331,7 +331,7 @@ /obj/effect/proc_holder/spell/targeted/mindscan/Destroy() available_targets.Cut() - ..() + return ..() /datum/dna/gene/basic/grant_spell/remoteview name="Remote Viewing" From 71e3d5187fdb332c6ee23cefceb7b9ef45ad3462 Mon Sep 17 00:00:00 2001 From: Mark van Alphen Date: Wed, 8 May 2019 17:18:27 +0200 Subject: [PATCH 12/55] Lighting fixes: makes sure new_players have a HUD and that sight flags are reset properly --- .../mob/living/carbon/human/species/_species.dm | 3 ++- code/modules/mob/living/life.dm | 2 +- code/modules/mob/new_player/login.dm | 15 +++++---------- 3 files changed, 8 insertions(+), 12 deletions(-) diff --git a/code/modules/mob/living/carbon/human/species/_species.dm b/code/modules/mob/living/carbon/human/species/_species.dm index 18451ff31cf..7b545cd7aa7 100644 --- a/code/modules/mob/living/carbon/human/species/_species.dm +++ b/code/modules/mob/living/carbon/human/species/_species.dm @@ -629,6 +629,8 @@ It'll return null if the organ doesn't correspond, so include null checks when u return has_organ[organ_slot] /datum/species/proc/update_sight(mob/living/carbon/human/H) + H.sight = initial(H.sight) + var/obj/item/organ/internal/eyes/eyes = H.get_int_organ(/obj/item/organ/internal/eyes) if(eyes) H.sight |= eyes.vision_flags @@ -636,7 +638,6 @@ It'll return null if the organ doesn't correspond, so include null checks when u H.see_invisible = eyes.see_invisible H.lighting_alpha = eyes.lighting_alpha else - H.sight = initial(H.sight) H.see_in_dark = initial(H.see_in_dark) H.see_invisible = initial(H.see_invisible) H.lighting_alpha = initial(H.lighting_alpha) diff --git a/code/modules/mob/living/life.dm b/code/modules/mob/living/life.dm index 03182a07ba8..e0c58c484d8 100644 --- a/code/modules/mob/living/life.dm +++ b/code/modules/mob/living/life.dm @@ -211,7 +211,7 @@ sight |= SEE_TURFS sight |= SEE_MOBS sight |= SEE_OBJS - lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE + lighting_alpha = LIGHTING_PLANE_ALPHA_INVISIBLE see_in_dark = 8 see_invisible = SEE_INVISIBLE_OBSERVER sync_lighting_plane_alpha() diff --git a/code/modules/mob/new_player/login.dm b/code/modules/mob/new_player/login.dm index 1c7b06b1ce1..2803df9d5c4 100644 --- a/code/modules/mob/new_player/login.dm +++ b/code/modules/mob/new_player/login.dm @@ -14,19 +14,14 @@ loc = locate(1,1,1) lastarea = loc + if(!hud_used) + create_mob_hud() + if(hud_used) + hud_used.show_hud(hud_used.hud_version) + sight |= SEE_TURFS GLOB.player_list |= src -/* - var/list/watch_locations = list() - for(var/obj/effect/landmark/landmark in GLOB.landmarks_list) - if(landmark.tag == "landmark*new_player") - watch_locations += landmark.loc - - if(watch_locations.len>0) - loc = pick(watch_locations) -*/ - callHook("mob_login", list("client" = client, "mob" = src)) new_player_panel() From 9b60ea5d9535847c9ef2f50093408cc4654111b9 Mon Sep 17 00:00:00 2001 From: Mark van Alphen Date: Wed, 8 May 2019 17:22:24 +0200 Subject: [PATCH 13/55] Make sure the screen is reset, just in case --- code/modules/mob/new_player/login.dm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/code/modules/mob/new_player/login.dm b/code/modules/mob/new_player/login.dm index 2803df9d5c4..c67ccb3f60b 100644 --- a/code/modules/mob/new_player/login.dm +++ b/code/modules/mob/new_player/login.dm @@ -14,6 +14,8 @@ loc = locate(1,1,1) lastarea = loc + client.screen = list() // Remove HUD items just in case. + client.images = list() if(!hud_used) create_mob_hud() if(hud_used) From f8486ced385c49ac689f3fcc1ad0dd48e93c6626 Mon Sep 17 00:00:00 2001 From: Mark van Alphen Date: Wed, 8 May 2019 17:38:25 +0200 Subject: [PATCH 14/55] Fix windowdoor click opening --- code/game/machinery/doors/windowdoor.dm | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/code/game/machinery/doors/windowdoor.dm b/code/game/machinery/doors/windowdoor.dm index 3838a52325f..755c70d393b 100644 --- a/code/game/machinery/doors/windowdoor.dm +++ b/code/game/machinery/doors/windowdoor.dm @@ -214,7 +214,7 @@ return attack_hand(user) /obj/machinery/door/window/attack_hand(mob/user) - return bumpopen(user) + return try_to_activate_door(user) /obj/machinery/door/window/emag_act(mob/user, obj/weapon) if(!operating && density && !emagged) @@ -228,7 +228,6 @@ return 1 /obj/machinery/door/window/attackby(obj/item/I, mob/living/user, params) - //If it's in the process of opening/closing, ignore the click if(operating) return From a83c36179bb1994aa412db755765a3840e4d34c8 Mon Sep 17 00:00:00 2001 From: Mark van Alphen Date: Wed, 8 May 2019 20:13:21 +0200 Subject: [PATCH 15/55] Clarify switch message --- code/modules/antagonists/_common/antag_spawner.dm | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/code/modules/antagonists/_common/antag_spawner.dm b/code/modules/antagonists/_common/antag_spawner.dm index 4e66c7b1797..d92e5ffa86f 100644 --- a/code/modules/antagonists/_common/antag_spawner.dm +++ b/code/modules/antagonists/_common/antag_spawner.dm @@ -18,6 +18,7 @@ icon_state = "locator" var/borg_to_spawn var/checking = FALSE + var/rolename = "Syndicate Operative" /obj/item/antag_spawner/nuke_ops/proc/before_candidate_search(user) return TRUE @@ -45,7 +46,7 @@ checking = TRUE to_chat(user, "You activate [src] and wait for confirmation.") - var/list/nuke_candidates = pollCandidates("Do you want to play as a syndicate [borg_to_spawn ? "[lowertext(borg_to_spawn)] cyborg" : "operative"]?", ROLE_OPERATIVE, TRUE, 150) + var/list/nuke_candidates = pollCandidates("Do you want to play as a [rolename]?", ROLE_OPERATIVE, TRUE, 150) if(LAZYLEN(nuke_candidates)) checking = FALSE if(QDELETED(src) || !check_usability(user)) @@ -109,8 +110,10 @@ if(switch_roles_choice == "Syndicate Cyborg") switch_roles = TRUE + rolename = "Syndicate [borg_to_spawn]" else switch_roles = FALSE + rolename = initial(rolename) return TRUE From 04f1e79b330cacb6e5622501ac6f05f2cc757381 Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Wed, 8 May 2019 16:17:14 -0400 Subject: [PATCH 16/55] Automatic changelog generation for PR #11489 [ci skip] --- html/changelogs/AutoChangeLog-pr-11489.yml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-11489.yml diff --git a/html/changelogs/AutoChangeLog-pr-11489.yml b/html/changelogs/AutoChangeLog-pr-11489.yml new file mode 100644 index 00000000000..ce83f855daf --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11489.yml @@ -0,0 +1,6 @@ +author: "Markolie" +delete-after: True +changes: + - bugfix: "Fixed an issue where a mob's sight wouldn't update properly in certain cases, such as being revived." + - bugfix: "Resolved an issue where the lobby would be bright white when being sent back." + - bugfix: "Resolved an issue where the ambient occlusion preference wouldn't update properly in the lobby." From c213e968a2bafada5d6278489cf1e5426f07cb9e Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Wed, 8 May 2019 16:17:43 -0400 Subject: [PATCH 17/55] Automatic changelog generation for PR #11490 [ci skip] --- html/changelogs/AutoChangeLog-pr-11490.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-11490.yml diff --git a/html/changelogs/AutoChangeLog-pr-11490.yml b/html/changelogs/AutoChangeLog-pr-11490.yml new file mode 100644 index 00000000000..ae1ed2eae11 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11490.yml @@ -0,0 +1,4 @@ +author: "Markolie" +delete-after: True +changes: + - bugfix: "Resolved an issue where clicking on a windoor would no longer prevent it from auto-closing." From 61b337578b97aa8715e1b8abd3cff0f5eefb221b Mon Sep 17 00:00:00 2001 From: Fox McCloud Date: Wed, 8 May 2019 17:25:35 -0400 Subject: [PATCH 18/55] Potentially Solves Disappearing Human Mob Issue? --- code/datums/mutable_appearance.dm | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/code/datums/mutable_appearance.dm b/code/datums/mutable_appearance.dm index 2b0c3e1a44c..31c20315508 100644 --- a/code/datums/mutable_appearance.dm +++ b/code/datums/mutable_appearance.dm @@ -4,6 +4,11 @@ // Mutable appearances are children of images, just so you know. +/mutable_appearance/New() + ..() + plane = FLOAT_PLANE // No clue why this is 0 by default yet images are on FLOAT_PLANE + // And yes this does have to be in the constructor, BYOND ignores it if you set it as a normal var + // Helper similar to image() /proc/mutable_appearance(icon, icon_state = "", layer = FLOAT_LAYER, plane = FLOAT_PLANE) var/mutable_appearance/MA = new() @@ -13,7 +18,7 @@ MA.plane = plane return MA -/mutable_appearance/clean + /mutable_appearance/clean/New() . = ..() alpha = 255 From 443fa06c3169a8c8a7b283a9fe51a58cbd491a0b Mon Sep 17 00:00:00 2001 From: Mark van Alphen Date: Thu, 9 May 2019 02:01:26 +0200 Subject: [PATCH 19/55] Update our getFlatIcon() code to /tg/'s latest --- code/__HELPERS/icons.dm | 326 +++++++++++++++++++++++----------------- 1 file changed, 185 insertions(+), 141 deletions(-) diff --git a/code/__HELPERS/icons.dm b/code/__HELPERS/icons.dm index dad2ecd7630..ed4f3242c4d 100644 --- a/code/__HELPERS/icons.dm +++ b/code/__HELPERS/icons.dm @@ -634,170 +634,214 @@ The _flatIcons list is a cache for generated icon files. */ // Creates a single icon from a given /atom or /image. Only the first argument is required. -/proc/getFlatIcon(image/A, defdir=2, deficon=null, defstate="", defblend=BLEND_DEFAULT) - // We start with a blank canvas, otherwise some icon procs crash silently - var/icon/flat = icon('icons/effects/effects.dmi', "icon_state"="nothing") // Final flattened icon - if(!A) - return flat - if(A.alpha <= 0) - return flat +/proc/getFlatIcon(image/A, defdir, deficon, defstate, defblend, start = TRUE, no_anim = FALSE) + //Define... defines. + var/static/icon/flat_template = icon('icons/effects/effects.dmi', "nothing") + + #define BLANK icon(flat_template) + #define SET_SELF(SETVAR) do { \ + var/icon/SELF_ICON=icon(icon(curicon, curstate, base_icon_dir),"",SOUTH,no_anim?1:null); \ + if(A.alpha<255) { \ + SELF_ICON.Blend(rgb(255,255,255,A.alpha),ICON_MULTIPLY);\ + } \ + if(A.color) { \ + if(islist(A.color)){ \ + SELF_ICON.MapColors(arglist(A.color))} \ + else{ \ + SELF_ICON.Blend(A.color,ICON_MULTIPLY)} \ + } \ + ##SETVAR=SELF_ICON;\ + } while (0) + #define INDEX_X_LOW 1 + #define INDEX_X_HIGH 2 + #define INDEX_Y_LOW 3 + #define INDEX_Y_HIGH 4 + + #define flatX1 flat_size[INDEX_X_LOW] + #define flatX2 flat_size[INDEX_X_HIGH] + #define flatY1 flat_size[INDEX_Y_LOW] + #define flatY2 flat_size[INDEX_Y_HIGH] + #define addX1 add_size[INDEX_X_LOW] + #define addX2 add_size[INDEX_X_HIGH] + #define addY1 add_size[INDEX_Y_LOW] + #define addY2 add_size[INDEX_Y_HIGH] + + if(!A || A.alpha <= 0) + return BLANK + var/noIcon = FALSE + if(start) + if(!defdir) + defdir = A.dir + if(!deficon) + deficon = A.icon + if(!defstate) + defstate = A.icon_state + if(!defblend) + defblend = A.blend_mode - var/curicon - if(A.icon) - curicon = A.icon - else - curicon = deficon + var/curicon = A.icon || deficon + var/curstate = A.icon_state || defstate - if(!curicon) - noIcon = TRUE // Do not render this object. - - var/curstate - if(A.icon_state) - curstate = A.icon_state - else - curstate = defstate - - if(!noIcon && !(curstate in icon_states(curicon))) - if("" in icon_states(curicon)) - curstate = "" - else - noIcon = TRUE // Do not render this object. + if(!((noIcon = (!curicon)))) + var/curstates = icon_states(curicon) + if(!(curstate in curstates)) + if("" in curstates) + curstate = "" + else + noIcon = TRUE // Do not render this object. var/curdir - if(A.dir != 2) - curdir = A.dir - else + var/base_icon_dir //We'll use this to get the icon state to display if not null BUT NOT pass it to overlays as the dir we have + + //These should use the parent's direction (most likely) + if(!A.dir || A.dir == SOUTH) curdir = defdir - - var/curblend - if(A.blend_mode == BLEND_DEFAULT) - curblend = defblend else - curblend = A.blend_mode + curdir = A.dir - // Layers will be a sorted list of icons/overlays, based on the order in which they are displayed - var/list/layers = list() - var/image/copy - // Add the atom's icon itself, without pixel_x/y offsets. - if(!noIcon) - copy = image(icon=curicon, icon_state=curstate, layer=A.layer, dir=curdir) - copy.color = A.color - copy.alpha = A.alpha - copy.blend_mode = curblend - layers[copy] = A.layer - - // Loop through the underlays, then overlays, sorting them into the layers list - var/list/process = A.underlays // Current list being processed - var/pSet=0 // Which list is being processed: 0 = underlays, 1 = overlays - var/curIndex=1 // index of 'current' in list being processed - var/current // Current overlay being sorted - var/currentLayer // Calculated layer that overlay appears on (special case for FLOAT_LAYER) - var/compare // The overlay 'add' is being compared against - var/cmpIndex // The index in the layers list of 'compare' - while(TRUE) - if(curIndex<=process.len) - current = process[curIndex] - if(!current) - curIndex++ //Skip this bad layer item - continue - currentLayer = current:layer - if(currentLayer<0) // Special case for FLY_LAYER - if(currentLayer <= -1000) return flat - if(pSet == 0) // Underlay - currentLayer = A.layer+currentLayer/1000 - else // Overlay - currentLayer = A.layer+(1000+currentLayer)/1000 - - // Sort add into layers list - for(cmpIndex=1,cmpIndex<=layers.len,cmpIndex++) - compare = layers[cmpIndex] - if(currentLayer < layers[compare]) // Associated value is the calculated layer - layers.Insert(cmpIndex,current) - layers[current] = currentLayer - break - if(cmpIndex>layers.len) // Reached end of list without inserting - layers[current]=currentLayer // Place at end - - curIndex++ - - if(curIndex>process.len) - if(pSet == 0) // Switch to overlays - curIndex = 1 - pSet = 1 - process = A.overlays - else // All done + //Try to remove/optimize this section ASAP, CPU hog. + //Determines if there's directionals. + if(!noIcon && curdir != SOUTH) + var/exist = FALSE + var/static/list/checkdirs = list(NORTH, EAST, WEST) + for(var/i in checkdirs) //Not using GLOB for a reason. + if(length(icon_states(icon(curicon, curstate, i)))) + exist = TRUE break + if(!exist) + base_icon_dir = SOUTH + // - var/icon/add // Icon of overlay being added + if(!base_icon_dir) + base_icon_dir = curdir - // Current dimensions of flattened icon - var/flatX1 = 1 - var/flatX2 = flat.Width() - var/flatY1 = 1 - var/flatY2 = flat.Height() - // Dimensions of overlay being added - var/addX1 - var/addX2 - var/addY1 - var/addY2 + ASSERT(!BLEND_DEFAULT) //I might just be stupid but lets make sure this define is 0. - for(var/I in layers) + var/curblend = A.blend_mode || defblend - if(I:alpha == 0) - continue + if(A.overlays.len || A.underlays.len) + var/icon/flat = BLANK + // Layers will be a sorted list of icons/overlays, based on the order in which they are displayed + var/list/layers = list() + var/image/copy + // Add the atom's icon itself, without pixel_x/y offsets. + if(!noIcon) + copy = image(icon=curicon, icon_state=curstate, layer=A.layer, dir=base_icon_dir) + copy.color = A.color + copy.alpha = A.alpha + copy.blend_mode = curblend + layers[copy] = A.layer - if(I == copy) // 'I' is an /image based on the object being flattened. - curblend = BLEND_OVERLAY - add = icon(I:icon, I:icon_state, I:dir) - // This checks for a silent failure mode of the icon routine. If the requested dir - // doesn't exist in this icon state it returns a 32x32 icon with 0 alpha. - if(I:dir != SOUTH && add.Width() == 32 && add.Height() == 32) - // Check every pixel for blank (computationally expensive, but the process is limited - // by the amount of film on the station, only happens when we hit something that's - // turned, and bails at the very first pixel it sees. - var/blankpixel; - for(var/y;y<=32;y++) - for(var/x;x<32;x++) - blankpixel = isnull(add.GetPixel(x,y)) - if(!blankpixel) - break - if(!blankpixel) + // Loop through the underlays, then overlays, sorting them into the layers list + for(var/process_set in 0 to 1) + var/list/process = process_set? A.overlays : A.underlays + for(var/i in 1 to process.len) + var/image/current = process[i] + if(!current) + continue + if(current.plane != FLOAT_PLANE && current.plane != A.plane) + continue + var/current_layer = current.layer + if(current_layer < 0) + if(current_layer <= -1000) + return flat + current_layer = process_set + A.layer + current_layer / 1000 + + for(var/p in 1 to layers.len) + var/image/cmp = layers[p] + if(current_layer < layers[cmp]) + layers.Insert(p, current) break - // If we ALWAYS returned a null (which happens when GetPixel encounters something with alpha 0) - if(blankpixel) - // Pull the default direction. - add = icon(I:icon, I:icon_state) - else // 'I' is an appearance object. - add = getFlatIcon(new/image(I), curdir, curicon, curstate, curblend) + layers[current] = current_layer - // Find the new dimensions of the flat icon to fit the added overlay - addX1 = min(flatX1, I:pixel_x+1) - addX2 = max(flatX2, I:pixel_x+add.Width()) - addY1 = min(flatY1, I:pixel_y+1) - addY2 = max(flatY2, I:pixel_y+add.Height()) + //sortTim(layers, /proc/cmp_image_layer_asc) - if(addX1!=flatX1 || addX2!=flatX2 || addY1!=flatY1 || addY2!=flatY2) - // Resize the flattened icon so the new icon fits - flat.Crop(addX1-flatX1+1, addY1-flatY1+1, addX2-flatX1+1, addY2-flatY1+1) - flatX1=addX1;flatX2=addX2 - flatY1=addY1;flatY2=addY2 + var/icon/add // Icon of overlay being added - // Blend the overlay into the flattened icon - flat.Blend(add, blendMode2iconMode(curblend), I:pixel_x + 2 - flatX1, I:pixel_y + 2 - flatY1) + // Current dimensions of flattened icon + var/list/flat_size = list(1, flat.Width(), 1, flat.Height()) + // Dimensions of overlay being added + var/list/add_size[4] - if(A.color) - flat.Blend(A.color, ICON_MULTIPLY) - if(A.alpha < 255) - flat.Blend(rgb(255, 255, 255, A.alpha), ICON_MULTIPLY) + for(var/V in layers) + var/image/I = V + if(I.alpha == 0) + continue - return icon(flat, "", SOUTH) + if(I == copy) // 'I' is an /image based on the object being flattened. + curblend = BLEND_OVERLAY + add = icon(I.icon, I.icon_state, base_icon_dir) + else // 'I' is an appearance object. + add = getFlatIcon(image(I), curdir, curicon, curstate, curblend, FALSE, no_anim) + if(!add) + continue + // Find the new dimensions of the flat icon to fit the added overlay + add_size = list( + min(flatX1, I.pixel_x+1), + max(flatX2, I.pixel_x+add.Width()), + min(flatY1, I.pixel_y+1), + max(flatY2, I.pixel_y+add.Height()) + ) + + if(flat_size ~! add_size) + // Resize the flattened icon so the new icon fits + flat.Crop( + addX1 - flatX1 + 1, + addY1 - flatY1 + 1, + addX2 - flatX1 + 1, + addY2 - flatY1 + 1 + ) + flat_size = add_size.Copy() + + // Blend the overlay into the flattened icon + flat.Blend(add, blendMode2iconMode(curblend), I.pixel_x + 2 - flatX1, I.pixel_y + 2 - flatY1) + + if(A.color) + if(islist(A.color)) + flat.MapColors(arglist(A.color)) + else + flat.Blend(A.color, ICON_MULTIPLY) + + if(A.alpha < 255) + flat.Blend(rgb(255, 255, 255, A.alpha), ICON_MULTIPLY) + + if(no_anim) + //Clean up repeated frames + var/icon/cleaned = new /icon() + cleaned.Insert(flat, "", SOUTH, 1, 0) + . = cleaned + else + . = icon(flat, "", SOUTH) + else //There's no overlays. + if(!noIcon) + SET_SELF(.) + + //Clear defines + #undef flatX1 + #undef flatX2 + #undef flatY1 + #undef flatY2 + #undef addX1 + #undef addX2 + #undef addY1 + #undef addY2 + + #undef INDEX_X_LOW + #undef INDEX_X_HIGH + #undef INDEX_Y_LOW + #undef INDEX_Y_HIGH + + #undef BLANK + #undef SET_SELF /proc/getIconMask(atom/A)//By yours truly. Creates a dynamic mask for a mob/whatever. /N var/icon/alpha_mask = new(A.icon,A.icon_state)//So we want the default icon and icon state of A. - for(var/I in A.overlays)//For every image in overlays. var/image/I will not work, don't try it. - if(I:layer>A.layer) continue//If layer is greater than what we need, skip it. - var/icon/image_overlay = new(I:icon,I:icon_state)//Blend only works with icon objects. + for(var/V in A.overlays)//For every image in overlays. var/image/I will not work, don't try it. + var/image/I = V + if(I.layer>A.layer) + continue//If layer is greater than what we need, skip it. + var/icon/image_overlay = new(I.icon,I.icon_state)//Blend only works with icon objects. //Also, icons cannot directly set icon_state. Slower than changing variables but whatever. alpha_mask.Blend(image_overlay,ICON_OR)//OR so they are lumped together in a nice overlay. return alpha_mask//And now return the mask. From 9833f4c7f0168fb132ae01e1086e170937e78eb3 Mon Sep 17 00:00:00 2001 From: TDSSS <32099540+TDSSS@users.noreply.github.com> Date: Thu, 9 May 2019 02:10:39 +0200 Subject: [PATCH 20/55] Initial commit --- code/game/machinery/portable_turret.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/game/machinery/portable_turret.dm b/code/game/machinery/portable_turret.dm index e3ba1e642a9..8f542a2ea3c 100644 --- a/code/game/machinery/portable_turret.dm +++ b/code/game/machinery/portable_turret.dm @@ -977,6 +977,7 @@ var/list/turret_icons /atom/movable/porta_turret_cover icon = 'icons/obj/turrets.dmi' + anchored = TRUE // Syndicate turrets /obj/machinery/porta_turret/syndicate From 3d90ccbfb78a2723ac47ff4c8b5673c1ca513a26 Mon Sep 17 00:00:00 2001 From: Fox McCloud Date: Wed, 8 May 2019 20:15:24 -0400 Subject: [PATCH 21/55] nevermind, just generic fixes --- code/__DEFINES/layers.dm | 36 +++++--- code/_onclick/hud/blob_overmind.dm | 3 + code/_onclick/hud/picture_in_picture.dm | 2 +- code/_onclick/hud/screen_objects.dm | 19 ++-- code/datums/components/squeak.dm | 28 +++--- code/game/atoms_movable.dm | 7 +- code/modules/mob/dead/dead.dm | 23 +---- code/modules/mob/dead/observer/observer.dm | 40 ++++---- .../mob/living/carbon/alien/larva/powers.dm | 4 +- code/modules/mob/living/carbon/brain/MMI.dm | 4 +- code/modules/mob/living/carbon/brain/brain.dm | 4 +- code/modules/mob/living/carbon/carbon.dm | 14 +-- .../mob/living/carbon/human/inventory.dm | 92 ++++++++++--------- .../mob/living/carbon/human/update_icons.dm | 2 +- .../modules/mob/living/carbon/slime/powers.dm | 6 +- code/modules/mob/living/living.dm | 3 +- .../living/simple_animal/friendly/mouse.dm | 6 +- code/modules/mob/living/update_status.dm | 4 +- code/modules/mob/mob_grab.dm | 6 +- 19 files changed, 141 insertions(+), 162 deletions(-) diff --git a/code/__DEFINES/layers.dm b/code/__DEFINES/layers.dm index 26894d3e6ea..db88f46a676 100644 --- a/code/__DEFINES/layers.dm +++ b/code/__DEFINES/layers.dm @@ -85,23 +85,29 @@ #define ABOVE_LIGHTING_PLANE 16 #define ABOVE_LIGHTING_LAYER 16 -#define BYOND_LIGHTING_PLANE 17 -#define BYOND_LIGHTING_LAYER 17 +#define FLOOR_OPENSPACE_PLANE 17 +#define OPENSPACE_LAYER 17 + +#define BYOND_LIGHTING_PLANE 18 +#define BYOND_LIGHTING_LAYER 18 + +#define CAMERA_STATIC_PLANE 19 +#define CAMERA_STATIC_LAYER 19 //HUD layer defines -#define FULLSCREEN_PLANE 18 -#define FLASH_LAYER 18 -#define FULLSCREEN_LAYER 18.1 -#define UI_DAMAGE_LAYER 18.2 -#define BLIND_LAYER 18.3 -#define CRIT_LAYER 18.4 -#define CURSE_LAYER 18.5 +#define FULLSCREEN_PLANE 20 +#define FLASH_LAYER 20 +#define FULLSCREEN_LAYER 20.1 +#define UI_DAMAGE_LAYER 20.2 +#define BLIND_LAYER 20.3 +#define CRIT_LAYER 20.4 +#define CURSE_LAYER 20.5 -#define HUD_PLANE 19 -#define HUD_LAYER 19 -#define ABOVE_HUD_PLANE 20 -#define ABOVE_HUD_LAYER 20 +#define HUD_PLANE 21 +#define HUD_LAYER 21 +#define ABOVE_HUD_PLANE 22 +#define ABOVE_HUD_LAYER 22 -#define SPLASHSCREEN_LAYER 21 -#define SPLASHSCREEN_PLANE 21 \ No newline at end of file +#define SPLASHSCREEN_LAYER 23 +#define SPLASHSCREEN_PLANE 23 \ No newline at end of file diff --git a/code/_onclick/hud/blob_overmind.dm b/code/_onclick/hud/blob_overmind.dm index feb57d83c05..6fe3a781642 100644 --- a/code/_onclick/hud/blob_overmind.dm +++ b/code/_onclick/hud/blob_overmind.dm @@ -141,6 +141,9 @@ blobpwrdisplay.name = "blob power" blobpwrdisplay.icon_state = "block" blobpwrdisplay.screen_loc = ui_health + blobpwrdisplay.mouse_opacity = MOUSE_OPACITY_TRANSPARENT + blobpwrdisplay.layer = ABOVE_HUD_LAYER + blobpwrdisplay.plane = ABOVE_HUD_PLANE static_inventory += blobpwrdisplay blobhealthdisplay = new /obj/screen() diff --git a/code/_onclick/hud/picture_in_picture.dm b/code/_onclick/hud/picture_in_picture.dm index bbac6e36df3..e011aea037c 100644 --- a/code/_onclick/hud/picture_in_picture.dm +++ b/code/_onclick/hud/picture_in_picture.dm @@ -1,7 +1,7 @@ /obj/screen/movable/pic_in_pic name = "Picture-in-picture" screen_loc = "CENTER" - plane = GAME_PLANE + plane = FLOOR_PLANE var/atom/center var/width = 0 var/height = 0 diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm index aeda1e5baa6..c583617ac23 100644 --- a/code/_onclick/hud/screen_objects.dm +++ b/code/_onclick/hud/screen_objects.dm @@ -9,9 +9,10 @@ /obj/screen name = "" icon = 'icons/mob/screen_gen.dmi' - layer = HUD_LAYER_SCREEN - plane = ABOVE_HUD_PLANE - unacidable = 1 + layer = HUD_LAYER + plane = HUD_PLANE + resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF + unacidable = TRUE var/obj/master = null //A reference to the object in the slot. Grabs or items, generally. var/datum/hud/hud = null appearance_flags = NO_CLIENT_COLOR @@ -36,6 +37,8 @@ /obj/screen/close name = "close" + layer = ABOVE_HUD_LAYER + plane = ABOVE_HUD_PLANE /obj/screen/close/Click() if(master) @@ -47,8 +50,6 @@ /obj/screen/drop name = "drop" icon_state = "act_drop" - layer = HUD_LAYER - plane = HUD_PLANE /obj/screen/drop/Click() usr.drop_item_v() @@ -144,9 +145,7 @@ name = "resist" icon = 'icons/mob/screen_midnight.dmi' icon_state = "act_resist" - layer = HUD_LAYER - plane = HUD_PLANE - + /obj/screen/resist/Click() if(isliving(usr)) var/mob/living/L = usr @@ -329,8 +328,6 @@ /obj/screen/inventory var/slot_id //The indentifier for the slot. It has nothing to do with ID cards. var/list/object_overlays = list() - layer = HUD_LAYER - plane = HUD_PLANE /obj/screen/inventory/MouseEntered() ..() @@ -420,8 +417,6 @@ return 1 /obj/screen/swap_hand - layer = HUD_LAYER - plane = HUD_PLANE name = "swap hand" /obj/screen/swap_hand/Click() diff --git a/code/datums/components/squeak.dm b/code/datums/components/squeak.dm index 3fe88f7d0e9..e5b948f4f26 100644 --- a/code/datums/components/squeak.dm +++ b/code/datums/components/squeak.dm @@ -1,5 +1,3 @@ -// Squeak component ported over from tg - /datum/component/squeak var/static/list/default_squeak_sounds = list('sound/items/toysqueak1.ogg'=1, 'sound/items/toysqueak2.ogg'=1, 'sound/items/toysqueak3.ogg'=1) var/list/override_squeak_sounds @@ -49,21 +47,12 @@ else playsound(parent, pickweight(override_squeak_sounds), volume, 1, -1) -/datum/component/squeak/proc/step_squeak(datum/source, mob/living/carbon/human/H) - if(H.m_intent == MOVE_INTENT_RUN) - if(steps > step_delay) - play_squeak() - steps = 0 - else - steps++ - else +/datum/component/squeak/proc/step_squeak() + if(steps > step_delay) play_squeak() - -/datum/component/squeak/proc/on_equip(datum/source, mob/equipper, slot) - RegisterSignal(equipper, COMSIG_MOVABLE_DISPOSING, .proc/disposing_react, TRUE) - -/datum/component/squeak/proc/on_drop(datum/source, mob/user) - UnregisterSignal(user, COMSIG_MOVABLE_DISPOSING) + steps = 0 + else + steps++ /datum/component/squeak/proc/play_squeak_crossed(atom/movable/AM) if(isitem(AM)) @@ -83,6 +72,13 @@ last_use = world.time play_squeak() +/datum/component/squeak/proc/on_equip(datum/source, mob/equipper, slot) + RegisterSignal(equipper, COMSIG_MOVABLE_DISPOSING, .proc/disposing_react, TRUE) + +/datum/component/squeak/proc/on_drop(datum/source, mob/user) + UnregisterSignal(user, COMSIG_MOVABLE_DISPOSING) + +// Disposal pipes related shit /datum/component/squeak/proc/disposing_react(datum/source, obj/structure/disposalholder/holder, obj/machinery/disposal/source) //We don't need to worry about unregistering this signal as it will happen for us automaticaly when the holder is qdeleted RegisterSignal(holder, COMSIG_ATOM_DIR_CHANGE, .proc/holder_dir_change) diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index e962365451e..d1bee2bb62e 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -185,11 +185,12 @@ . = 0 // Called after a successful Move(). By this point, we've already moved -/atom/movable/proc/Moved(atom/OldLoc, Dir) - if(!inertia_moving) +/atom/movable/proc/Moved(atom/OldLoc, Dir, Forced = FALSE) + SEND_SIGNAL(src, COMSIG_MOVABLE_MOVED, OldLoc, Dir, Forced) + if (!inertia_moving) inertia_next_move = world.time + inertia_move_delay newtonian_move(Dir) - return 1 + return TRUE // Previously known as HasEntered() // This is automatically called when something enters your square diff --git a/code/modules/mob/dead/dead.dm b/code/modules/mob/dead/dead.dm index ca868b5e88f..f34aa75cd5e 100644 --- a/code/modules/mob/dead/dead.dm +++ b/code/modules/mob/dead/dead.dm @@ -1,23 +1,4 @@ /mob/dead/forceMove(atom/destination) - // Overriden from code/game/atoms_movable.dm#141 to prevent things like mice squeaking when ghosts walk on them. - // Same as parent, except that it does not include Uncrossed or Crossed calls. - var/turf/old_loc = loc + var/oldloc = loc loc = destination - - if(old_loc) - old_loc.Exited(src, destination) - - if(destination) - destination.Entered(src) - - if(isturf(destination) && opacity) - var/turf/new_loc = destination - new_loc.reconsider_lights() - - if(isturf(old_loc) && opacity) - old_loc.reconsider_lights() - - for(var/datum/light_source/L in light_sources) - L.source_atom.update_light() - - return 1 \ No newline at end of file + Moved(oldloc, NONE, TRUE) \ No newline at end of file diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index 3bc9d279eb9..57cf90ddd9a 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -10,7 +10,7 @@ GLOBAL_VAR_INIT(observer_default_invisibility, INVISIBILITY_OBSERVER) desc = "It's a g-g-g-g-ghooooost!" //jinkies! icon = 'icons/mob/mob.dmi' icon_state = "ghost" - layer = 4 + layer = GHOST_LAYER stat = DEAD density = 0 canmove = 0 @@ -228,29 +228,25 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp /mob/dead/observer/Move(NewLoc, direct) following = null - dir = direct - ghostimage.dir = dir + setDir(direct) + ghostimage.setDir(dir) + + var/oldloc = loc + if(NewLoc) forceMove(NewLoc) - return - forceMove(get_turf(src)) //Get out of closets and such as a ghost - if((direct & NORTH) && y < world.maxy) - y++ - else if((direct & SOUTH) && y > 1) - y-- - if((direct & EAST) && x < world.maxx) - x++ - else if((direct & WEST) && x > 1) - x-- + else + forceMove(get_turf(src)) //Get out of closets and such as a ghost + if((direct & NORTH) && y < world.maxy) + y++ + else if((direct & SOUTH) && y > 1) + y-- + if((direct & EAST) && x < world.maxx) + x++ + else if((direct & WEST) && x > 1) + x-- - for(var/obj/effect/step_trigger/S in locate(x, y, z)) //<-- this is dumb - S.Crossed(src) - - var/area/A = get_area(src) - if(A) - A.Entered(src) - - ..() + Moved(oldloc, direct) /mob/dead/observer/can_use_hands() return 0 @@ -399,7 +395,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp var/area/A = input("Area to jump to", "BOOYEA") as null|anything in ghostteleportlocs var/area/thearea = ghostteleportlocs[A] - + if(!thearea) return diff --git a/code/modules/mob/living/carbon/alien/larva/powers.dm b/code/modules/mob/living/carbon/alien/larva/powers.dm index f1076721cf1..27837dc7cf5 100644 --- a/code/modules/mob/living/carbon/alien/larva/powers.dm +++ b/code/modules/mob/living/carbon/alien/larva/powers.dm @@ -7,8 +7,8 @@ if(stat != CONSCIOUS) return - if(layer != TURF_LAYER+0.2) - layer = TURF_LAYER+0.2 + if(layer != ABOVE_NORMAL_TURF_LAYER) + layer = ABOVE_NORMAL_TURF_LAYER visible_message("[src] scurries to the ground!", "You are now hiding.") else layer = MOB_LAYER diff --git a/code/modules/mob/living/carbon/brain/MMI.dm b/code/modules/mob/living/carbon/brain/MMI.dm index 2e4d3e8efd6..6b194315f1d 100644 --- a/code/modules/mob/living/carbon/brain/MMI.dm +++ b/code/modules/mob/living/carbon/brain/MMI.dm @@ -44,7 +44,7 @@ visible_message("[user] sticks \a [O] into \the [src].") brainmob = B.brainmob B.brainmob = null - brainmob.loc = src + brainmob.forceMove(src) brainmob.container = src brainmob.stat = CONSCIOUS GLOB.respawnable_list -= brainmob @@ -152,7 +152,7 @@ held_brain.name = "\the [brainmob.name]'s [initial(held_brain.name)]" brainmob.container = null//Reset brainmob mmi var. - brainmob.loc = held_brain//Throw mob into brain. + brainmob.forceMove(held_brain) //Throw mob into brain. GLOB.respawnable_list += brainmob GLOB.living_mob_list -= brainmob//Get outta here held_brain.brainmob = brainmob//Set the brain to use the brainmob diff --git a/code/modules/mob/living/carbon/brain/brain.dm b/code/modules/mob/living/carbon/brain/brain.dm index 0f7d4230587..df0afa62f49 100644 --- a/code/modules/mob/living/carbon/brain/brain.dm +++ b/code/modules/mob/living/carbon/brain/brain.dm @@ -67,10 +67,10 @@ /mob/living/carbon/brain/on_forcemove(atom/newloc) if(container) - container.loc = newloc + container.forceMove(newloc) else //something went very wrong. CRASH("Brainmob without container.") - loc = container + forceMove(container) /* This will return true if the brain has a container that leaves it less helpless than a naked brain diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 44a333fbe44..1433b9c3358 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -72,7 +72,7 @@ if(prob(src.getBruteLoss() - 50)) for(var/atom/movable/A in stomach_contents) - A.loc = loc + A.forceMove(drop_location()) stomach_contents.Remove(A) src.gib() @@ -833,7 +833,7 @@ var/list/ventcrawl_machinery = list(/obj/machinery/atmospherics/unary/vent_pump, to_chat(src, "You successfully remove [I].") if(I == handcuffed) - handcuffed.loc = loc + handcuffed.forceMove(drop_location()) handcuffed.dropped(src) handcuffed = null if(buckled && buckled.buckle_requires_restraints) @@ -841,7 +841,7 @@ var/list/ventcrawl_machinery = list(/obj/machinery/atmospherics/unary/vent_pump, update_handcuffed() return if(I == legcuffed) - legcuffed.loc = loc + legcuffed.forceMove(drop_location()) legcuffed.dropped() legcuffed = null update_inv_legcuffed() @@ -935,7 +935,7 @@ var/list/ventcrawl_machinery = list(/obj/machinery/atmospherics/unary/vent_pump, if(client) client.screen -= W if(W) - W.loc = loc + W.forceMove(drop_location()) W.dropped(src) if(W) W.layer = initial(W.layer) @@ -947,7 +947,7 @@ var/list/ventcrawl_machinery = list(/obj/machinery/atmospherics/unary/vent_pump, if(client) client.screen -= W if(W) - W.loc = loc + W.forceMove(drop_location()) W.dropped(src) if(W) W.layer = initial(W.layer) @@ -1141,7 +1141,7 @@ so that different stomachs can handle things in different ways VB*/ sight = initial(sight) lighting_alpha = initial(lighting_alpha) - + for(var/obj/item/organ/internal/cyberimp/eyes/E in internal_organs) sight |= E.vision_flags if(E.see_in_dark) @@ -1160,6 +1160,6 @@ so that different stomachs can handle things in different ways VB*/ sight |= (SEE_TURFS|SEE_MOBS|SEE_OBJS) see_in_dark = 8 lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE - + SEND_SIGNAL(src, COMSIG_MOB_UPDATE_SIGHT) sync_lighting_plane_alpha() diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm index 9e6ab986395..e68f5652b01 100644 --- a/code/modules/mob/living/carbon/human/inventory.dm +++ b/code/modules/mob/living/carbon/human/inventory.dm @@ -187,82 +187,85 @@ //This is an UNSAFE proc. Use mob_can_equip() before calling this one! Or rather use equip_to_slot_if_possible() or advanced_equip_to_slot_if_possible() //set redraw_mob to 0 if you don't wish the hud to be updated - if you're doing it manually in your own proc. -/mob/living/carbon/human/equip_to_slot(obj/item/W as obj, slot, redraw_mob = 1) - if(!slot) return - if(!istype(W)) return - if(!has_organ_for_slot(slot)) return +/mob/living/carbon/human/equip_to_slot(obj/item/I, slot, redraw_mob = 1) + if(!slot) + return + if(!istype(I)) + return + if(!has_organ_for_slot(slot)) + return - if(W == src.l_hand) + if(I == src.l_hand) src.l_hand = null update_inv_l_hand() //So items actually disappear from hands. - else if(W == src.r_hand) + else if(I == src.r_hand) src.r_hand = null update_inv_r_hand() - W.screen_loc = null - W.loc = src - W.equipped(src, slot) - W.layer = ABOVE_HUD_LAYER - W.plane = ABOVE_HUD_PLANE + I.screen_loc = null + I.forceMove(src) + I.equipped(src, slot) + I.layer = ABOVE_HUD_LAYER + I.plane = ABOVE_HUD_PLANE switch(slot) if(slot_back) - back = W + back = I update_inv_back(redraw_mob) if(slot_wear_mask) - wear_mask = W + wear_mask = I if((wear_mask.flags & BLOCKHAIR) || (wear_mask.flags & BLOCKHEADHAIR)) update_hair(redraw_mob) //rebuild hair update_fhair(redraw_mob) update_head_accessory(redraw_mob) if(hud_list.len) sec_hud_set_ID() - wear_mask_update(W, toggle_off = TRUE) + wear_mask_update(I, toggle_off = TRUE) update_inv_wear_mask(redraw_mob) if(slot_handcuffed) - handcuffed = W + handcuffed = I update_inv_handcuffed(redraw_mob) if(slot_legcuffed) - legcuffed = W + legcuffed = I update_inv_legcuffed(redraw_mob) if(slot_l_hand) - l_hand = W + l_hand = I update_inv_l_hand(redraw_mob) if(slot_r_hand) - r_hand = W + r_hand = I update_inv_r_hand(redraw_mob) if(slot_belt) - belt = W + belt = I update_inv_belt(redraw_mob) if(slot_wear_id) - wear_id = W + wear_id = I if(hud_list.len) sec_hud_set_ID() update_inv_wear_id(redraw_mob) if(slot_wear_pda) - wear_pda = W + wear_pda = I update_inv_wear_pda(redraw_mob) if(slot_l_ear) - l_ear = W + l_ear = I if(l_ear.slot_flags & SLOT_TWOEARS) - var/obj/item/clothing/ears/offear/O = new(W) - O.loc = src + var/obj/item/clothing/ears/offear/O = new(I) + O.forceMove(src) r_ear = O O.layer = ABOVE_HUD_LAYER O.plane = ABOVE_HUD_PLANE update_inv_ears(redraw_mob) if(slot_r_ear) - r_ear = W + r_ear = I if(r_ear.slot_flags & SLOT_TWOEARS) - var/obj/item/clothing/ears/offear/O = new(W) - O.loc = src + var/obj/item/clothing/ears/offear/O = new(I) + O.forceMove(src) l_ear = O O.layer = ABOVE_HUD_LAYER O.plane = ABOVE_HUD_PLANE update_inv_ears(redraw_mob) if(slot_glasses) - glasses = W - var/obj/item/clothing/glasses/G = W + glasses = I + var/obj/item/clothing/glasses/G = I if(G.tint) update_tint() if(G.prescription) @@ -272,49 +275,48 @@ update_inv_glasses(redraw_mob) update_client_colour() if(slot_gloves) - gloves = W + gloves = I update_inv_gloves(redraw_mob) if(slot_head) - head = W + head = I if((head.flags & BLOCKHAIR) || (head.flags & BLOCKHEADHAIR)) update_hair(redraw_mob) //rebuild hair update_fhair(redraw_mob) update_head_accessory(redraw_mob) // paper + bandanas - if(istype(W, /obj/item/clothing/head)) - var/obj/item/clothing/head/hat = W + if(istype(I, /obj/item/clothing/head)) + var/obj/item/clothing/head/hat = I if(hat.vision_flags || hat.see_in_dark || !isnull(hat.lighting_alpha)) update_sight() - head_update(W) + head_update(I) update_inv_head(redraw_mob) if(slot_shoes) - shoes = W + shoes = I update_inv_shoes(redraw_mob) if(slot_wear_suit) - wear_suit = W + wear_suit = I update_inv_wear_suit(redraw_mob) if(slot_w_uniform) - w_uniform = W + w_uniform = I update_inv_w_uniform(redraw_mob) if(slot_l_store) - l_store = W + l_store = I update_inv_pockets(redraw_mob) if(slot_r_store) - r_store = W + r_store = I update_inv_pockets(redraw_mob) if(slot_s_store) - s_store = W + s_store = I update_inv_s_store(redraw_mob) if(slot_in_backpack) - if(get_active_hand() == W) - unEquip(W) - W.loc = back + if(get_active_hand() == I) + unEquip(I) + I.forceMove(back) if(slot_tie) var/obj/item/clothing/under/uniform = src.w_uniform - uniform.attackby(W,src) + uniform.attackby(I, src) else to_chat(src, "You are trying to equip this item to an unsupported inventory slot. Report this to a coder!") - return /mob/living/carbon/human/put_in_hands(obj/item/W) if(!W) return 0 diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index 6e540c4cf5a..6133c5150e1 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -597,7 +597,7 @@ var/global/list/damage_icon_parts = list() client.screen -= thing // WHAT THE FUCKING FUCK BAY GODDAMNIT // **I FUCKING HATE YOU AAAAAAAAAA** if(thing) // - thing.loc = loc // + thing.forceMove(drop_location()) // thing.dropped(src) // thing.layer = initial(thing.layer) thing.plane = initial(thing.plane) diff --git a/code/modules/mob/living/carbon/slime/powers.dm b/code/modules/mob/living/carbon/slime/powers.dm index 23918680197..40f9060ee63 100644 --- a/code/modules/mob/living/carbon/slime/powers.dm +++ b/code/modules/mob/living/carbon/slime/powers.dm @@ -47,7 +47,7 @@ /mob/living/carbon/slime/proc/Feedon(var/mob/living/M) Victim = M - src.loc = M.loc + forceMove(M.loc) canmove = 0 anchored = 1 var/lastnut = nutrition @@ -64,7 +64,7 @@ canmove = 0 if(Adjacent(Victim)) - loc = M.loc + forceMove(M.loc) if(iscarbon(Victim)) Victim.adjustCloneLoss(rand(5,6)) @@ -163,7 +163,7 @@ /mob/living/carbon/slime/proc/UpdateFeed(var/mob/M) if(Victim) if(Victim == M) - loc = M.loc // simple "attach to head" effect! + forceMove(M.loc) // simple "attach to head" effect! /mob/living/carbon/slime/verb/Evolve() diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 9af52718ab3..dbf2cda075d 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -519,7 +519,6 @@ var/turf/T = loc . = ..() if(.) - SEND_SIGNAL(src, COMSIG_MOVABLE_MOVED) handle_footstep(loc) step_count++ @@ -972,7 +971,7 @@ /mob/living/onTransitZ(old_z,new_z) ..() - update_z(new_z) + update_z(new_z) /mob/living/proc/owns_soul() if(mind) diff --git a/code/modules/mob/living/simple_animal/friendly/mouse.dm b/code/modules/mob/living/simple_animal/friendly/mouse.dm index 869c663e312..3b9b2d720ca 100644 --- a/code/modules/mob/living/simple_animal/friendly/mouse.dm +++ b/code/modules/mob/living/simple_animal/friendly/mouse.dm @@ -35,8 +35,9 @@ can_collar = 1 gold_core_spawnable = CHEM_MOB_SPAWN_FRIENDLY -/mob/living/simple_animal/mouse/Initialize() +/mob/living/simple_animal/mouse/Initialize(mapload) . = ..() + AddComponent(/datum/component/squeak, list('sound/creatures/mousesqueak.ogg' = 1), 100) /mob/living/simple_animal/mouse/handle_automated_speech() ..() @@ -92,10 +93,9 @@ /mob/living/simple_animal/mouse/Crossed(AM as mob|obj) if(ishuman(AM)) - if(stat == CONSCIOUS) + if(!stat) var/mob/M = AM to_chat(M, "[bicon(src)] Squeek!") - SEND_SOUND(M, squeak_sound) ..() /mob/living/simple_animal/mouse/death(gibbed) diff --git a/code/modules/mob/living/update_status.dm b/code/modules/mob/living/update_status.dm index bec41f68698..39357533abb 100644 --- a/code/modules/mob/living/update_status.dm +++ b/code/modules/mob/living/update_status.dm @@ -93,9 +93,9 @@ density = !lying if(lying) if(layer == initial(layer)) - layer = MOB_LAYER - 0.2 + layer = LYING_MOB_LAYER //so mob lying always appear behind standing mobs else - if(layer == MOB_LAYER - 0.2) + if(layer == LYING_MOB_LAYER) layer = initial(layer) update_transform() diff --git a/code/modules/mob/mob_grab.dm b/code/modules/mob/mob_grab.dm index a4a52d4ef1e..077164be6b7 100644 --- a/code/modules/mob/mob_grab.dm +++ b/code/modules/mob/mob_grab.dm @@ -214,12 +214,12 @@ shift = -10 adir = assailant.dir affecting.setDir(assailant.dir) - affecting.loc = assailant.loc + affecting.forceMove(assailant.loc) if(GRAB_KILL) shift = 0 adir = 1 affecting.setDir(SOUTH)//face up - affecting.loc = assailant.loc + affecting.forceMove(assailant.loc) switch(adir) if(NORTH) @@ -387,7 +387,7 @@ if(M == assailant && state >= GRAB_AGGRESSIVE) //no eatin unless you have an agressive grab if(checkvalid(user, affecting)) //wut var/mob/living/carbon/attacker = user - + if(affecting.buckled) to_chat(user, "[affecting] is buckled!") return From 967ebb6805231d34e5481c05d1da93de8edf6898 Mon Sep 17 00:00:00 2001 From: Mark van Alphen Date: Thu, 9 May 2019 02:21:38 +0200 Subject: [PATCH 22/55] Update water plane --- code/game/turfs/simulated/floor/misc_floor.dm | 4 +++- code/game/turfs/unsimulated/beach.dm | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/code/game/turfs/simulated/floor/misc_floor.dm b/code/game/turfs/simulated/floor/misc_floor.dm index 6cfea0cb8f6..06fdcdca18f 100644 --- a/code/game/turfs/simulated/floor/misc_floor.dm +++ b/code/game/turfs/simulated/floor/misc_floor.dm @@ -60,7 +60,9 @@ /turf/simulated/floor/beach/water/New() ..() - overlays += image("icon"='icons/misc/beach.dmi',"icon_state"="water5","layer"=MOB_LAYER+0.1) + var/image/overlay_image = image('icons/misc/beach.dmi', icon_state = "water5", layer = ABOVE_MOB_LAYER) + overlay_image.plane = GAME_PLANE + overlays += overlay_image /turf/simulated/floor/beach/water/Entered(atom/movable/AM, atom/OldLoc) . = ..() diff --git a/code/game/turfs/unsimulated/beach.dm b/code/game/turfs/unsimulated/beach.dm index b7c76359c46..15650c1f00e 100644 --- a/code/game/turfs/unsimulated/beach.dm +++ b/code/game/turfs/unsimulated/beach.dm @@ -7,7 +7,9 @@ /turf/unsimulated/beach/New() ..() if(water_overlay_image) - overlays += image("icon"='icons/misc/beach.dmi',"icon_state"= water_overlay_image,"layer"=MOB_LAYER+0.1) + var/image/overlay_image = image('icons/misc/beach.dmi', icon_state = water_overlay_image, layer = ABOVE_MOB_LAYER) + overlay_image.plane = GAME_PLANE + overlays += overlay_image /turf/unsimulated/beach/sand name = "Sand" From 70cc1de3436d1e1e19f3a70471289787e596903d Mon Sep 17 00:00:00 2001 From: Fox McCloud Date: Wed, 8 May 2019 21:01:41 -0400 Subject: [PATCH 23/55] abductor stuff --- code/game/gamemodes/miniantags/abduction/machinery/pad.dm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/game/gamemodes/miniantags/abduction/machinery/pad.dm b/code/game/gamemodes/miniantags/abduction/machinery/pad.dm index f7ff2864608..697d173716a 100644 --- a/code/game/gamemodes/miniantags/abduction/machinery/pad.dm +++ b/code/game/gamemodes/miniantags/abduction/machinery/pad.dm @@ -7,7 +7,8 @@ var/turf/teleport_target /obj/machinery/abductor/pad/proc/Warp(mob/living/target) - target.Move(src.loc) + if(!target.buckled) + target.forceMove(get_turf(src)) /obj/machinery/abductor/pad/proc/Send() if(teleport_target == null) From 0ed3a09f547f4f83fcef09f587e9cd7ac467cb60 Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Wed, 8 May 2019 21:19:39 -0400 Subject: [PATCH 24/55] Automatic changelog generation for PR #11474 [ci skip] --- html/changelogs/AutoChangeLog-pr-11474.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-11474.yml diff --git a/html/changelogs/AutoChangeLog-pr-11474.yml b/html/changelogs/AutoChangeLog-pr-11474.yml new file mode 100644 index 00000000000..7e793d7bc20 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11474.yml @@ -0,0 +1,4 @@ +author: "AffectedArc07" +delete-after: True +changes: + - tweak: "Morgue updates happen slightly better now" From 75bfb770070e32387e42c43a0b8399fda7316422 Mon Sep 17 00:00:00 2001 From: Kyep Date: Wed, 8 May 2019 19:12:53 -0700 Subject: [PATCH 25/55] fix for $5+ donors not getting more loadout points --- code/modules/client/client procs.dm | 8 +++++++- code/modules/client/preference/preferences.dm | 2 -- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/code/modules/client/client procs.dm b/code/modules/client/client procs.dm index 61e9dec627a..00a9137fe05 100644 --- a/code/modules/client/client procs.dm +++ b/code/modules/client/client procs.dm @@ -74,7 +74,7 @@ //Admin PM if(href_list["priv_msg"]) var/client/C = locate(href_list["priv_msg"]) - + if(!C) // Might be a stealthmin ID, so pass it in straight C = href_list["priv_msg"] else if(C.UID() != href_list["priv_msg"]) @@ -432,6 +432,7 @@ if(check_rights(R_ADMIN, 0, mob)) // Yes, the mob is required, regardless of other examples in this file, it won't work otherwise donator_level = DONATOR_LEVEL_MAX + donor_loadout_points() return //Donator stuff. @@ -443,8 +444,13 @@ donator_level = 0 return donator_level = text2num(query_donor_select.item[2]) + donor_loadout_points() break +/client/proc/donor_loadout_points() + if(donator_level > 0 && prefs) + prefs.max_gear_slots = config.max_loadout_points + 5 + /client/proc/log_client_to_db(connectiontopic) if(IsGuestKey(key)) return diff --git a/code/modules/client/preference/preferences.dm b/code/modules/client/preference/preferences.dm index 849898238b2..632c5053b48 100644 --- a/code/modules/client/preference/preferences.dm +++ b/code/modules/client/preference/preferences.dm @@ -211,8 +211,6 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts unlock_content = C.IsByondMember() if(unlock_content) max_save_slots = MAX_SAVE_SLOTS_MEMBER - if(C.donator_level > 0) - max_gear_slots += 5 loaded_preferences_successfully = load_preferences(C) // Do not call this with no client/C, it generates a runtime / SQL error if(loaded_preferences_successfully) From 502b8aebc51a6644474f7e31485d142c6f228ae7 Mon Sep 17 00:00:00 2001 From: Mark van Alphen Date: Thu, 9 May 2019 05:09:54 +0200 Subject: [PATCH 26/55] Weather lighting fix --- code/datums/weather/weather.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/datums/weather/weather.dm b/code/datums/weather/weather.dm index 2f3a4c4bcba..f1773e9210d 100644 --- a/code/datums/weather/weather.dm +++ b/code/datums/weather/weather.dm @@ -135,6 +135,6 @@ N.color = null N.icon_state = "" N.icon = 'icons/turf/areas.dmi' - N.layer = AREA_LAYER //Just default back to normal area stuff since I assume setting a var is faster than initial - N.invisibility = INVISIBILITY_MAXIMUM + N.layer = initial(N.layer) + N.plane = initial(N.plane) N.set_opacity(FALSE) From b66ac0559ee72213b0c56915c9ce665b8e401ace Mon Sep 17 00:00:00 2001 From: Mark van Alphen Date: Thu, 9 May 2019 05:23:14 +0200 Subject: [PATCH 27/55] Add initial plane to weather --- code/datums/weather/weather.dm | 1 + code/datums/weather/weather_types/floor_is_lava.dm | 1 + 2 files changed, 2 insertions(+) diff --git a/code/datums/weather/weather.dm b/code/datums/weather/weather.dm index f1773e9210d..c6608a88a29 100644 --- a/code/datums/weather/weather.dm +++ b/code/datums/weather/weather.dm @@ -28,6 +28,7 @@ var/impacted_z_levels // The list of z-levels that this weather is actively affecting var/overlay_layer = AREA_LAYER //Since it's above everything else, this is the layer used by default. TURF_LAYER is below mobs and walls if you need to use that. + var/overlay_plane = BLACKNESS_PLANE var/aesthetic = FALSE //If the weather has no purpose other than looks var/immunity_type = "storm" //Used by mobs to prevent them from being affected by the weather diff --git a/code/datums/weather/weather_types/floor_is_lava.dm b/code/datums/weather/weather_types/floor_is_lava.dm index 6d06e3ca1ef..72f49ad5057 100644 --- a/code/datums/weather/weather_types/floor_is_lava.dm +++ b/code/datums/weather/weather_types/floor_is_lava.dm @@ -19,6 +19,7 @@ target_trait = STATION_LEVEL overlay_layer = ABOVE_OPEN_TURF_LAYER //Covers floors only + overlay_plane = FLOOR_PLANE immunity_type = "lava" From 458e59a191e72a91662247d84841292e26ab7667 Mon Sep 17 00:00:00 2001 From: Mark van Alphen Date: Thu, 9 May 2019 05:53:53 +0200 Subject: [PATCH 28/55] Final weather fix --- code/datums/weather/weather.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/datums/weather/weather.dm b/code/datums/weather/weather.dm index c6608a88a29..42700f2725f 100644 --- a/code/datums/weather/weather.dm +++ b/code/datums/weather/weather.dm @@ -122,6 +122,7 @@ for(var/V in impacted_areas) var/area/N = V N.layer = overlay_layer + N.plane = overlay_plane N.icon = 'icons/effects/weather_effects.dmi' N.invisibility = 0 N.color = weather_color From e7e1c92942b1c3b58141f4819248acc71f242d8b Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Thu, 9 May 2019 00:06:49 -0400 Subject: [PATCH 29/55] Automatic changelog generation for PR #11493 [ci skip] --- html/changelogs/AutoChangeLog-pr-11493.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-11493.yml diff --git a/html/changelogs/AutoChangeLog-pr-11493.yml b/html/changelogs/AutoChangeLog-pr-11493.yml new file mode 100644 index 00000000000..fa96ce24f35 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11493.yml @@ -0,0 +1,4 @@ +author: "Fox McCloud" +delete-after: True +changes: + - bugfix: "Fixes weird behavior with ghosts being able to trigger a few things by crossing over them" From c3c8609d204c207c153e3dafd2f86d092eb7e3b0 Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Thu, 9 May 2019 00:09:17 -0400 Subject: [PATCH 30/55] Automatic changelog generation for PR #11494 [ci skip] --- html/changelogs/AutoChangeLog-pr-11494.yml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-11494.yml diff --git a/html/changelogs/AutoChangeLog-pr-11494.yml b/html/changelogs/AutoChangeLog-pr-11494.yml new file mode 100644 index 00000000000..fee8563113e --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11494.yml @@ -0,0 +1,6 @@ +author: "Markolie" +delete-after: True +changes: + - bugfix: "Resolved an issue where cameras couldn't take pictures of non-dynamic lighting areas, such as the holodeck or space." + - bugfix: "Resolved an issue where mobs would appear above water." + - bugfix: "Resolved an issue where radiation storms would make lighting invisible in space." From bc0749c99d60b079f2f58ba07ee9ac76ecbb89ff Mon Sep 17 00:00:00 2001 From: Fox McCloud Date: Thu, 9 May 2019 02:37:13 -0400 Subject: [PATCH 31/55] Fixes Toggles Not Saving Properly --- code/modules/client/preference/preferences_mysql.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/client/preference/preferences_mysql.dm b/code/modules/client/preference/preferences_mysql.dm index 731bf06496e..6b72d71bc9b 100644 --- a/code/modules/client/preference/preferences_mysql.dm +++ b/code/modules/client/preference/preferences_mysql.dm @@ -87,7 +87,7 @@ UI_style_alpha='[UI_style_alpha]', be_role='[sanitizeSQL(list2params(be_special))]', default_slot='[default_slot]', - toggles='[toggles]', + toggles='[num2text(toggles, 7)]', atklog='[atklog]', sound='[sound]', randomslot='[randomslot]', From a7131407f325654e5e43fdd0bc4cf2207bda4f70 Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Thu, 9 May 2019 02:50:51 -0400 Subject: [PATCH 32/55] Automatic changelog generation for PR #11498 [ci skip] --- html/changelogs/AutoChangeLog-pr-11498.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-11498.yml diff --git a/html/changelogs/AutoChangeLog-pr-11498.yml b/html/changelogs/AutoChangeLog-pr-11498.yml new file mode 100644 index 00000000000..17e881fdab0 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11498.yml @@ -0,0 +1,4 @@ +author: "Crazylemon and Fox McCloud" +delete-after: True +changes: + - bugfix: "Fixes toggles not properly saving" From eb95a42672b6a068a831340dead7ea74690436a2 Mon Sep 17 00:00:00 2001 From: Fox McCloud Date: Thu, 9 May 2019 02:51:44 -0400 Subject: [PATCH 33/55] Fixes Ghosts Drifting --- code/modules/mob/dead/observer/observer.dm | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index 57cf90ddd9a..12b9421423a 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -226,6 +226,10 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp P.despawn_occupant() return +// Ghosts have no momentum, being massless ectoplasm +/mob/dead/observer/Process_Spacemove(movement_dir) + return 1 + /mob/dead/observer/Move(NewLoc, direct) following = null setDir(direct) From 461539a74373cac0e4d2360e6ec6532c5f5d6719 Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Thu, 9 May 2019 02:55:56 -0400 Subject: [PATCH 34/55] Automatic changelog generation for PR #11497 [ci skip] --- html/changelogs/AutoChangeLog-pr-11497.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-11497.yml diff --git a/html/changelogs/AutoChangeLog-pr-11497.yml b/html/changelogs/AutoChangeLog-pr-11497.yml new file mode 100644 index 00000000000..d619ca03d3d --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11497.yml @@ -0,0 +1,4 @@ +author: "Kyep" +delete-after: True +changes: + - bugfix: "fixed $5+ donors not getting extra loadout points." From 1b1221acd94383e6258c1affaecd1718d236d907 Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Thu, 9 May 2019 02:56:50 -0400 Subject: [PATCH 35/55] Automatic changelog generation for PR #11495 [ci skip] --- html/changelogs/AutoChangeLog-pr-11495.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-11495.yml diff --git a/html/changelogs/AutoChangeLog-pr-11495.yml b/html/changelogs/AutoChangeLog-pr-11495.yml new file mode 100644 index 00000000000..aad9355db64 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11495.yml @@ -0,0 +1,4 @@ +author: "TDSSS" +delete-after: True +changes: + - bugfix: "opening turret covers now stay on top of their turret." From 0a16f72b456bba9797b98a0a366c47644f161810 Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Thu, 9 May 2019 03:08:32 -0400 Subject: [PATCH 36/55] Automatic changelog generation for PR #11499 [ci skip] --- html/changelogs/AutoChangeLog-pr-11499.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-11499.yml diff --git a/html/changelogs/AutoChangeLog-pr-11499.yml b/html/changelogs/AutoChangeLog-pr-11499.yml new file mode 100644 index 00000000000..d96b64ce5fc --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11499.yml @@ -0,0 +1,4 @@ +author: "Fox McCloud" +delete-after: True +changes: + - bugfix: "Fixes drifting ghosts" From ab60f5418374c6f551cce4e9199d902ca19788cd Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Thu, 9 May 2019 03:11:49 -0400 Subject: [PATCH 37/55] Automatic changelog generation for PR #11492 [ci skip] --- html/changelogs/AutoChangeLog-pr-11492.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-11492.yml diff --git a/html/changelogs/AutoChangeLog-pr-11492.yml b/html/changelogs/AutoChangeLog-pr-11492.yml new file mode 100644 index 00000000000..eb870579c13 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11492.yml @@ -0,0 +1,4 @@ +author: "Markolie" +delete-after: True +changes: + - bugfix: "When a nuclear operative chooses to play as the borg instead of operative using the cyborg teleporter, ghosts will now be informed of this in their acceptance message." From afc22b03edf85ac1e15cb3d5284168f5bba330d6 Mon Sep 17 00:00:00 2001 From: Mark van Alphen Date: Thu, 9 May 2019 19:52:29 +0200 Subject: [PATCH 38/55] Fix X-Ray on death for simple_mobs, fix view variables damage for non-humans --- code/datums/datumvars.dm | 29 ++++++++++++----- code/modules/mob/living/carbon/alien/alien.dm | 1 + code/modules/mob/living/carbon/carbon.dm | 2 ++ code/modules/mob/living/living.dm | 10 ------ code/modules/mob/living/silicon/ai/ai.dm | 2 +- .../mob/living/simple_animal/simple_animal.dm | 31 ++++++++++++++++++- 6 files changed, 56 insertions(+), 19 deletions(-) diff --git a/code/datums/datumvars.dm b/code/datums/datumvars.dm index 6fdb8a359c2..13c3fb64f33 100644 --- a/code/datums/datumvars.dm +++ b/code/datums/datumvars.dm @@ -1242,13 +1242,28 @@ return switch(Text) - if("brute") L.adjustBruteLoss(amount, robotic=1) - if("fire") L.adjustFireLoss(amount, robotic=1) - if("toxin") L.adjustToxLoss(amount) - if("oxygen")L.adjustOxyLoss(amount) - if("brain") L.adjustBrainLoss(amount) - if("clone") L.adjustCloneLoss(amount) - if("stamina") L.adjustStaminaLoss(amount) + if("brute") + if(ishuman(L)) + var/mob/living/carbon/human/H = L + H.adjustBruteLoss(amount, robotic = TRUE) + else + L.adjustBruteLoss(amount) + if("fire") + if(ishuman(L)) + var/mob/living/carbon/human/H = L + H.adjustFireLoss(amount, robotic = TRUE) + else + L.adjustFireLoss(amount) + if("toxin") + L.adjustToxLoss(amount) + if("oxygen") + L.adjustOxyLoss(amount) + if("brain") + L.adjustBrainLoss(amount) + if("clone") + L.adjustCloneLoss(amount) + if("stamina") + L.adjustStaminaLoss(amount) else to_chat(usr, "You caused an error. DEBUG: Text:[Text] Mob:[L]") return diff --git a/code/modules/mob/living/carbon/alien/alien.dm b/code/modules/mob/living/carbon/alien/alien.dm index e6dcaebf51c..ee858138f70 100644 --- a/code/modules/mob/living/carbon/alien/alien.dm +++ b/code/modules/mob/living/carbon/alien/alien.dm @@ -277,6 +277,7 @@ Des: Removes all infected images from the alien. grant_death_vision() return + see_invisible = initial(see_invisible) sight = SEE_MOBS if(nightvision) see_in_dark = 8 diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 44a333fbe44..d748d7a5171 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -1139,6 +1139,8 @@ so that different stomachs can handle things in different ways VB*/ grant_death_vision() return + see_invisible = initial(see_invisible) + see_in_dark = initial(see_in_dark) sight = initial(sight) lighting_alpha = initial(lighting_alpha) diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 9af52718ab3..8a53aa3c81e 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -1039,13 +1039,3 @@ update_transform() if("lighting_alpha") sync_lighting_plane_alpha() - -/mob/living/update_sight() - if(!client) - return - - if(stat == DEAD) - grant_death_vision() - return - - . = ..() \ No newline at end of file diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index 54750e6afc1..80d644152f4 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -1303,8 +1303,8 @@ var/list/ai_verbs_default = list( see_invisible = initial(see_invisible) see_in_dark = initial(see_in_dark) - lighting_alpha = initial(lighting_alpha) sight = initial(sight) + lighting_alpha = initial(lighting_alpha) if(aiRestorePowerRoutine) sight = sight &~ SEE_TURFS diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index 365889344d2..3799daacb63 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -609,4 +609,33 @@ ..() if(AIStatus == AI_Z_OFF) SSidlenpcpool.idle_mobs_by_zlevel[old_z] -= src - toggle_ai(initial(AIStatus)) \ No newline at end of file + toggle_ai(initial(AIStatus)) + +// Simple animals will not be given night vision upon death, as that would result in issues when they are revived. +/mob/living/simple_animal/grant_death_vision() + sight |= SEE_TURFS + sight |= SEE_MOBS + sight |= SEE_OBJS + see_in_dark = 8 + see_invisible = SEE_INVISIBLE_OBSERVER + sync_lighting_plane_alpha() + +/mob/living/simple_animal/update_sight() + if(!client) + return + + if(stat == DEAD) + grant_death_vision() + return + + see_invisible = initial(see_invisible) + see_in_dark = initial(see_in_dark) + sight = initial(sight) + + if(client.eye != src) + var/atom/A = client.eye + if(A.update_remote_sight(src)) //returns 1 if we override all other sight updates. + return + + SEND_SIGNAL(src, COMSIG_MOB_UPDATE_SIGHT) + sync_lighting_plane_alpha() \ No newline at end of file From 2a1f26ff8c4733a74aab45c0c315d1b02710121d Mon Sep 17 00:00:00 2001 From: Fel Date: Thu, 9 May 2019 15:19:05 -0400 Subject: [PATCH 39/55] You should've gone for the \ref *snap --- code/game/dna/genes/vg_powers.dm | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/code/game/dna/genes/vg_powers.dm b/code/game/dna/genes/vg_powers.dm index fb56aa0e2ea..41120751d21 100644 --- a/code/game/dna/genes/vg_powers.dm +++ b/code/game/dna/genes/vg_powers.dm @@ -192,7 +192,7 @@ ..() user.AddSpell(new /obj/effect/proc_holder/spell/targeted/mindscan(null)) -/datum/dna/gene/basic/grant_spell/remotetalk/deactivate(var/mob/user) +/datum/dna/gene/basic/grant_spell/remotetalk/deactivate(mob/user) ..() for(var/obj/effect/proc_holder/spell/S in user.mob_spell_list) if(istype(S, /obj/effect/proc_holder/spell/targeted/mindscan)) @@ -295,22 +295,22 @@ if(REMOTE_TALK in target.mutations) message = "You feel [user.real_name] request a response from you... (Click here to project mind.)" user.show_message("You offer your mind to [target.name].") - target.show_message("[message]") + target.show_message("[message]") available_targets += target addtimer(CALLBACK(src, .proc/removeAvailability, target), 100) -/obj/effect/proc_holder/spell/targeted/mindscan/proc/removeAvailability(var/mob/living/target) +/obj/effect/proc_holder/spell/targeted/mindscan/proc/removeAvailability(mob/living/target) if(target in available_targets) available_targets -= target /obj/effect/proc_holder/spell/targeted/mindscan/Topic(href, href_list) var/mob/living/user if(href_list["user"]) - user = locate(href_list["user"]) + user = locateUID(href_list["user"]) if(href_list["target"]) if(!user) return - var/mob/living/target = locate(href_list["target"]) + var/mob/living/target = locateUID(href_list["target"]) if(!(target in available_targets)) return available_targets -= target From 2ed9e5d3d76f309f3be76e2bcf7f9f75fa92e095 Mon Sep 17 00:00:00 2001 From: Fel Date: Thu, 9 May 2019 15:32:57 -0400 Subject: [PATCH 40/55] Sensation: *fades* --- code/game/dna/genes/vg_powers.dm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/code/game/dna/genes/vg_powers.dm b/code/game/dna/genes/vg_powers.dm index 41120751d21..506ef5714f8 100644 --- a/code/game/dna/genes/vg_powers.dm +++ b/code/game/dna/genes/vg_powers.dm @@ -302,6 +302,8 @@ /obj/effect/proc_holder/spell/targeted/mindscan/proc/removeAvailability(mob/living/target) if(target in available_targets) available_targets -= target + if(!(target in available_targets)) + target.show_message("You feel the sensation fade...") /obj/effect/proc_holder/spell/targeted/mindscan/Topic(href, href_list) var/mob/living/user From a5d6f5692710533cc4fdf1d3f4b626db2632bd89 Mon Sep 17 00:00:00 2001 From: Mark van Alphen Date: Thu, 9 May 2019 22:26:02 +0200 Subject: [PATCH 41/55] Disable NTTC regex --- code/game/machinery/telecomms/ntsl2.dm | 73 +++++++++++++------------- html/nttc/dist/index.html | 2 +- 2 files changed, 38 insertions(+), 37 deletions(-) diff --git a/code/game/machinery/telecomms/ntsl2.dm b/code/game/machinery/telecomms/ntsl2.dm index 604fcdfbe7e..72388c7a7cc 100644 --- a/code/game/machinery/telecomms/ntsl2.dm +++ b/code/game/machinery/telecomms/ntsl2.dm @@ -130,7 +130,7 @@ GLOBAL_DATUM_INIT(nttc_config, /datum/nttc_configuration, new()) var/job_indicator_type = null /* Tables */ - var/list/regex = list() + // var/list/regex = list() /* Arrays */ var/list/firewall = list() @@ -144,7 +144,7 @@ GLOBAL_DATUM_INIT(nttc_config, /datum/nttc_configuration, new()) ) // This is used to sanitize topic data - var/list/tables = list("regex") + // var/list/tables = list("regex") var/list/arrays = list("firewall") // This tells the datum what is safe to serialize and what's not. It also applies to deserialization. @@ -175,7 +175,7 @@ GLOBAL_DATUM_INIT(nttc_config, /datum/nttc_configuration, new()) "toggle_gibberish" = "bool", "toggle_honk" = "bool", "setting_language" = "string", - "regex" = "table", + // "regex" = "table", "firewall" = "array" ) @@ -203,7 +203,7 @@ GLOBAL_DATUM_INIT(nttc_config, /datum/nttc_configuration, new()) job_indicator_type = initial(job_indicator_type) /* Tables */ - regex = list() + // regex = list() /* Arrays */ firewall = list() @@ -245,7 +245,8 @@ GLOBAL_DATUM_INIT(nttc_config, /datum/nttc_configuration, new()) switch(sanitize_method) if("bool") return variable ? TRUE : FALSE - if("table", "array") + // if("table", "array") + if("array") if(!islist(variable)) return list() // Insert html filtering for the regexes here if you're boring @@ -350,14 +351,14 @@ GLOBAL_DATUM_INIT(nttc_config, /datum/nttc_configuration, new()) S.speaking = GLOB.all_languages[setting_language] // Regex replacements - if(islist(regex) && regex.len > 0) - for(var/datum/multilingual_say_piece/S in message_pieces) - var/new_message = S.message - for(var/reg in regex) - var/replacePattern = pencode_to_html(regex[reg]) - var/regex/start = regex("[reg]", "gi") - new_message = start.Replace(new_message, replacePattern) - S.message = new_message + // if(islist(regex) && regex.len > 0) + // for(var/datum/multilingual_say_piece/S in message_pieces) + // var/new_message = S.message + // for(var/reg in regex) + // var/replacePattern = pencode_to_html(regex[reg]) + // var/regex/start = regex("[reg]", "gi") + // new_message = start.Replace(new_message, replacePattern) + // S.message = new_message // Make sure the message is valid after we tinkered with it, otherwise reject it if(signal.data["message"] == "" || !signal.data["message"]) @@ -398,29 +399,29 @@ GLOBAL_DATUM_INIT(nttc_config, /datum/nttc_configuration, new()) log_action(user, new_language == "--DISABLE--" ? "disabled NTTC language conversion" : "set NTTC language conversion to [new_language]", TRUE) // Tables - if(href_list["create_row"]) - if(href_list["table"] && href_list["table"] in tables) - if(requires_unlock[href_list["table"]] && !source.unlocked) - return - var/new_key = input(user, "Provide a key for the new row.", "New Row") as text|null - if(!new_key) - return - var/new_value = input(user, "Provide a new value for the key [new_key]", "New Row") as text|null - if(new_value == null) - return - var/list/table = vars[href_list["table"]] - table[new_key] = new_value - to_chat(user, "Added row [new_key] -> [new_value].") - log_action(user, "updated [href_list["table"]] - new row [new_key] -> [new_value]") + // if(href_list["create_row"]) + // if(href_list["table"] && href_list["table"] in tables) + // if(requires_unlock[href_list["table"]] && !source.unlocked) + // return + // var/new_key = input(user, "Provide a key for the new row.", "New Row") as text|null + // if(!new_key) + // return + // var/new_value = input(user, "Provide a new value for the key [new_key]", "New Row") as text|null + // if(new_value == null) + // return + // var/list/table = vars[href_list["table"]] + // table[new_key] = new_value + // to_chat(user, "Added row [new_key] -> [new_value].") + // log_action(user, "updated [href_list["table"]] - new row [new_key] -> [new_value]") - if(href_list["delete_row"]) - if(href_list["table"] && href_list["table"] in tables) - if(requires_unlock[href_list["table"]] && !source.unlocked) - return - var/list/table = vars[href_list["table"]] - table.Remove(href_list["delete_row"]) - to_chat(user, "Removed row [href_list["delete_row"]] from [href_list["table"]]") - log_action(user, "updated [href_list["table"]] - removed row [href_list["delete_row"]]") + // if(href_list["delete_row"]) + // if(href_list["table"] && href_list["table"] in tables) + // if(requires_unlock[href_list["table"]] && !source.unlocked) + // return + // var/list/table = vars[href_list["table"]] + // table.Remove(href_list["delete_row"]) + // to_chat(user, "Removed row [href_list["delete_row"]] from [href_list["table"]]") + // log_action(user, "updated [href_list["table"]] - removed row [href_list["delete_row"]]") // Arrays if(href_list["create_item"]) @@ -470,7 +471,7 @@ GLOBAL_DATUM_INIT(nttc_config, /datum/nttc_configuration, new()) "tab_hack.html" = 'html/nttc/dist/tab_hack.html', "tab_filtering.html" = 'html/nttc/dist/tab_filtering.html', "tab_firewall.html" = 'html/nttc/dist/tab_firewall.html', - "tab_regex.html" = 'html/nttc/dist/tab_regex.html', + // "tab_regex.html" = 'html/nttc/dist/tab_regex.html', "uiTitleFluff.png" = 'html/nttc/dist/uiTitleFluff.png' ) diff --git a/html/nttc/dist/index.html b/html/nttc/dist/index.html index a8a7a17f1e3..ef7d917b471 100644 --- a/html/nttc/dist/index.html +++ b/html/nttc/dist/index.html @@ -13,7 +13,7 @@

- +
NTTC
From aad23a771c1874b473929a7115ed05450a5549d1 Mon Sep 17 00:00:00 2001 From: Mark van Alphen Date: Thu, 9 May 2019 22:30:07 +0200 Subject: [PATCH 42/55] Fix serialize --- code/game/machinery/telecomms/ntsl2.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/game/machinery/telecomms/ntsl2.dm b/code/game/machinery/telecomms/ntsl2.dm index 090a2102893..f6cab1ef208 100644 --- a/code/game/machinery/telecomms/ntsl2.dm +++ b/code/game/machinery/telecomms/ntsl2.dm @@ -9,7 +9,7 @@ GLOBAL_DATUM_INIT(nttc_config, /datum/nttc_configuration, new()) * as well as allowing users to save and load configurations. */ /datum/nttc_configuration - var/regex/word_blacklist = new("( Date: Thu, 9 May 2019 22:33:47 +0200 Subject: [PATCH 43/55] Regex fix after merge conflict --- code/game/machinery/telecomms/ntsl2.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/machinery/telecomms/ntsl2.dm b/code/game/machinery/telecomms/ntsl2.dm index f6cab1ef208..04f85750516 100644 --- a/code/game/machinery/telecomms/ntsl2.dm +++ b/code/game/machinery/telecomms/ntsl2.dm @@ -9,7 +9,7 @@ GLOBAL_DATUM_INIT(nttc_config, /datum/nttc_configuration, new()) * as well as allowing users to save and load configurations. */ /datum/nttc_configuration - // var/regex/word_blacklist = new("( Date: Thu, 9 May 2019 16:50:18 -0400 Subject: [PATCH 44/55] Automatic changelog generation for PR #11502 [ci skip] --- html/changelogs/AutoChangeLog-pr-11502.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-11502.yml diff --git a/html/changelogs/AutoChangeLog-pr-11502.yml b/html/changelogs/AutoChangeLog-pr-11502.yml new file mode 100644 index 00000000000..775d368b7ba --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11502.yml @@ -0,0 +1,4 @@ +author: "Markolie" +delete-after: True +changes: + - rscdel: "NTTC regex has been disabled due to an urgent security issue." From 5ed836ff614a7e8cbc19a8de6f8705543f9eb2d3 Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Thu, 9 May 2019 16:53:51 -0400 Subject: [PATCH 45/55] Automatic changelog generation for PR #11501 [ci skip] --- html/changelogs/AutoChangeLog-pr-11501.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-11501.yml diff --git a/html/changelogs/AutoChangeLog-pr-11501.yml b/html/changelogs/AutoChangeLog-pr-11501.yml new file mode 100644 index 00000000000..94a9eb83fcc --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11501.yml @@ -0,0 +1,5 @@ +author: "Markolie" +delete-after: True +changes: + - bugfix: "Simple mobs no longer retain their X-Ray upon being revived." + - bugfix: "Applying brute/fire damage through the View Variables menu for non-humans has been fixed." From 6ca7ad4cc418ef28adb2f54fefba1f1bd125529f Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Thu, 9 May 2019 19:38:42 -0400 Subject: [PATCH 46/55] Automatic changelog generation for PR #11470 [ci skip] --- html/changelogs/AutoChangeLog-pr-11470.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-11470.yml diff --git a/html/changelogs/AutoChangeLog-pr-11470.yml b/html/changelogs/AutoChangeLog-pr-11470.yml new file mode 100644 index 00000000000..8ede62b29e1 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11470.yml @@ -0,0 +1,4 @@ +author: "fludd12" +delete-after: True +changes: + - rscadd: "Project Mind now has a corollary ability, Scan Mind. Now communication can be two-way!" From edee2cfceabc4e2ffeac22bffb1d53a4e1efca12 Mon Sep 17 00:00:00 2001 From: datlo Date: Fri, 10 May 2019 13:36:35 +0100 Subject: [PATCH 47/55] Replace by job check --- code/game/gamemodes/autotraitor/autotraitor.dm | 2 +- code/modules/mob/living/carbon/human/species/golem.dm | 2 -- code/modules/reagents/chemistry/reagents/drinks.dm | 6 +++--- 3 files changed, 4 insertions(+), 6 deletions(-) diff --git a/code/game/gamemodes/autotraitor/autotraitor.dm b/code/game/gamemodes/autotraitor/autotraitor.dm index d305cc566a5..63f9d5fbaff 100644 --- a/code/game/gamemodes/autotraitor/autotraitor.dm +++ b/code/game/gamemodes/autotraitor/autotraitor.dm @@ -96,7 +96,7 @@ for(var/obj/item/implant/mindshield/I in H.contents) if(I && I.implanted) possible_traitors -= player - if(isgolem(H)) + if(!H.job) //Golems, special events stuff, etc. possible_traitors -= player //message_admins("Live Players: [playercount]") //message_admins("Live Traitors: [traitorcount]") diff --git a/code/modules/mob/living/carbon/human/species/golem.dm b/code/modules/mob/living/carbon/human/species/golem.dm index e790181188e..c1e416a8a48 100644 --- a/code/modules/mob/living/carbon/human/species/golem.dm +++ b/code/modules/mob/living/carbon/human/species/golem.dm @@ -607,7 +607,6 @@ ..() last_banana = world.time last_honk = world.time - H.job = "Clown" H.mutations.Add(COMIC) H.equip_to_slot_or_del(new /obj/item/reagent_containers/food/drinks/bottle/bottleofbanana(H), slot_r_store) H.equip_to_slot_or_del(new /obj/item/bikehorn(H), slot_l_store) @@ -682,7 +681,6 @@ /datum/species/golem/tranquillite/on_species_gain(mob/living/carbon/human/H) ..() - H.job = "Mime" H.equip_to_slot_or_del(new /obj/item/clothing/head/beret(H), slot_head) H.equip_to_slot_or_del(new /obj/item/reagent_containers/food/drinks/bottle/bottleofnothing(H), slot_r_store) H.equip_to_slot_or_del(new /obj/item/cane(H), slot_l_hand) diff --git a/code/modules/reagents/chemistry/reagents/drinks.dm b/code/modules/reagents/chemistry/reagents/drinks.dm index b50ed09a27c..850df4f2382 100644 --- a/code/modules/reagents/chemistry/reagents/drinks.dm +++ b/code/modules/reagents/chemistry/reagents/drinks.dm @@ -178,7 +178,7 @@ /datum/reagent/consumable/drink/banana/on_mob_life(mob/living/M) var/update_flags = STATUS_UPDATE_NONE - if((ishuman(M) && M.job in list("Clown") ) || issmall(M)) + if((ishuman(M) && COMIC in M.mutations) || issmall(M)) update_flags |= M.adjustBruteLoss(-1, FALSE) update_flags |= M.adjustFireLoss(-1, FALSE) return ..() | update_flags @@ -194,7 +194,7 @@ /datum/reagent/consumable/drink/nothing/on_mob_life(mob/living/M) var/update_flags = STATUS_UPDATE_NONE - if(ishuman(M) && M.job in list("Mime")) + if(ishuman(M) && M.mind && M.mind.miming) update_flags |= M.adjustBruteLoss(-1, FALSE) update_flags |= M.adjustFireLoss(-1, FALSE) return ..() | update_flags @@ -402,7 +402,7 @@ /datum/reagent/consumable/drink/bananahonk/on_mob_life(mob/living/M) var/update_flags = STATUS_UPDATE_NONE - if((ishuman(M) && M.job in list("Clown") ) || issmall(M)) + if((ishuman(M) && COMIC in M.mutations) || issmall(M)) update_flags |= M.adjustBruteLoss(-1, FALSE) update_flags |= M.adjustFireLoss(-1, FALSE) return ..() | update_flags From 7042d4fb777376c9d366c272b8165b1b9c14d4e0 Mon Sep 17 00:00:00 2001 From: datlo Date: Fri, 10 May 2019 14:42:26 +0100 Subject: [PATCH 48/55] Fix ghosts being asked the wrong nukie role MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit #11492 mixed up which players gets which role. The role being selected is the role that the player using the spawner will play, so the role that the ghost gets is the other one. 🆑 fix: Ghosts will no longer get the wrong role offered when a nukie spawns a borg and will properly be informed whether they will spawn as a nuke ops or a syndi cyborg. /🆑 --- code/modules/antagonists/_common/antag_spawner.dm | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/code/modules/antagonists/_common/antag_spawner.dm b/code/modules/antagonists/_common/antag_spawner.dm index d92e5ffa86f..fa605cb627b 100644 --- a/code/modules/antagonists/_common/antag_spawner.dm +++ b/code/modules/antagonists/_common/antag_spawner.dm @@ -32,7 +32,7 @@ return FALSE if(checking) to_chat(user, "The device is already connecting to Syndicate command. Please wait.") - return FALSE + return FALSE return TRUE /obj/item/antag_spawner/nuke_ops/attack_self(mob/user) @@ -110,10 +110,10 @@ if(switch_roles_choice == "Syndicate Cyborg") switch_roles = TRUE - rolename = "Syndicate [borg_to_spawn]" + rolename = initial(rolename) else switch_roles = FALSE - rolename = initial(rolename) + rolename = "Syndicate [borg_to_spawn]" return TRUE From 5dbc319fa90cb772c204f9039fb843dd7404dc59 Mon Sep 17 00:00:00 2001 From: datlo Date: Fri, 10 May 2019 15:07:46 +0100 Subject: [PATCH 49/55] add cyborg to the role name --- code/modules/antagonists/_common/antag_spawner.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/antagonists/_common/antag_spawner.dm b/code/modules/antagonists/_common/antag_spawner.dm index fa605cb627b..c0fc8f66fb5 100644 --- a/code/modules/antagonists/_common/antag_spawner.dm +++ b/code/modules/antagonists/_common/antag_spawner.dm @@ -113,7 +113,7 @@ rolename = initial(rolename) else switch_roles = FALSE - rolename = "Syndicate [borg_to_spawn]" + rolename = "Syndicate [borg_to_spawn] Cyborg" return TRUE From e138db0c7cc834ad2e42cfa63dc83a18d9c7700b Mon Sep 17 00:00:00 2001 From: AffectedArc07 Date: Fri, 10 May 2019 19:18:40 +0100 Subject: [PATCH 50/55] Non-automatic changelog compile [ci run] --- html/changelog.html | 116 ++++++++++++++++++++ html/changelogs/.all_changelog.yml | 119 +++++++++++++++++++++ html/changelogs/AutoChangeLog-pr-11261.yml | 5 - html/changelogs/AutoChangeLog-pr-11315.yml | 4 - html/changelogs/AutoChangeLog-pr-11357.yml | 7 -- html/changelogs/AutoChangeLog-pr-11384.yml | 4 - html/changelogs/AutoChangeLog-pr-11399.yml | 4 - html/changelogs/AutoChangeLog-pr-11403.yml | 4 - html/changelogs/AutoChangeLog-pr-11415.yml | 4 - html/changelogs/AutoChangeLog-pr-11416.yml | 4 - html/changelogs/AutoChangeLog-pr-11418.yml | 4 - html/changelogs/AutoChangeLog-pr-11425.yml | 5 - html/changelogs/AutoChangeLog-pr-11426.yml | 5 - html/changelogs/AutoChangeLog-pr-11427.yml | 4 - html/changelogs/AutoChangeLog-pr-11428.yml | 5 - html/changelogs/AutoChangeLog-pr-11429.yml | 4 - html/changelogs/AutoChangeLog-pr-11431.yml | 4 - html/changelogs/AutoChangeLog-pr-11434.yml | 4 - html/changelogs/AutoChangeLog-pr-11440.yml | 4 - html/changelogs/AutoChangeLog-pr-11441.yml | 4 - html/changelogs/AutoChangeLog-pr-11442.yml | 6 -- html/changelogs/AutoChangeLog-pr-11443.yml | 4 - html/changelogs/AutoChangeLog-pr-11445.yml | 4 - html/changelogs/AutoChangeLog-pr-11446.yml | 4 - html/changelogs/AutoChangeLog-pr-11450.yml | 12 --- html/changelogs/AutoChangeLog-pr-11451.yml | 4 - html/changelogs/AutoChangeLog-pr-11453.yml | 4 - html/changelogs/AutoChangeLog-pr-11455.yml | 4 - html/changelogs/AutoChangeLog-pr-11457.yml | 4 - html/changelogs/AutoChangeLog-pr-11461.yml | 4 - html/changelogs/AutoChangeLog-pr-11463.yml | 4 - html/changelogs/AutoChangeLog-pr-11467.yml | 4 - html/changelogs/AutoChangeLog-pr-11470.yml | 4 - html/changelogs/AutoChangeLog-pr-11474.yml | 4 - html/changelogs/AutoChangeLog-pr-11475.yml | 4 - html/changelogs/AutoChangeLog-pr-11489.yml | 6 -- html/changelogs/AutoChangeLog-pr-11490.yml | 4 - html/changelogs/AutoChangeLog-pr-11492.yml | 4 - html/changelogs/AutoChangeLog-pr-11493.yml | 4 - html/changelogs/AutoChangeLog-pr-11494.yml | 6 -- html/changelogs/AutoChangeLog-pr-11495.yml | 4 - html/changelogs/AutoChangeLog-pr-11497.yml | 4 - html/changelogs/AutoChangeLog-pr-11498.yml | 4 - html/changelogs/AutoChangeLog-pr-11499.yml | 4 - html/changelogs/AutoChangeLog-pr-11501.yml | 5 - html/changelogs/AutoChangeLog-pr-11502.yml | 4 - 46 files changed, 235 insertions(+), 198 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-11261.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-11315.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-11357.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-11384.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-11399.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-11403.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-11415.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-11416.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-11418.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-11425.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-11426.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-11427.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-11428.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-11429.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-11431.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-11434.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-11440.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-11441.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-11442.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-11443.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-11445.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-11446.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-11450.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-11451.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-11453.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-11455.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-11457.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-11461.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-11463.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-11467.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-11470.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-11474.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-11475.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-11489.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-11490.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-11492.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-11493.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-11494.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-11495.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-11497.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-11498.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-11499.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-11501.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-11502.yml diff --git a/html/changelog.html b/html/changelog.html index 6ce02bc19c8..1d3eb4038b5 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -56,6 +56,122 @@ -->
+

10 May 2019

+

AffectedArc07 updated:

+
    +
  • Removes an infinite loop in the code
  • +
  • Removes unused code
  • +
  • Captains display case now actually has captains thumbprint lock on it
  • +
  • Morgue updates happen slightly better now
  • +
  • Fixes a minor NTTC issue
  • +
+

Arkatos updated:

+
    +
  • Patch Pack is now craftable with a cardboard, costs 2 cardboard sheets.
  • +
  • Examine tooltip delay increased slightly
  • +
  • Examine tooltips now work properly on items in storage
  • +
  • Full toolbelts now spawn with randomly a colored cable coil
  • +
  • Added inhand sprites for belts
  • +
  • Species name now shows in a species theme color on examine
  • +
  • Added 4 new plushies
  • +
+

Couls updated:

+
    +
  • necromantic stone now forces the ghost back into the body as a skeleton
  • +
  • allow skeletons to give up their bodies and offer control to ghosts
  • +
+

Crazylemon and Fox McCloud updated:

+
    +
  • Fixes toggles not properly saving
  • +
+

EvadableMoxie updated:

+
    +
  • Added the Nanotrasen Hospital Vessel Asclepius, able to be deployed by admins.
  • +
  • Admin shuttle now requires ERT clearance instead of admin clearance.
  • +
  • Admin shuttle now has a navigation computer and tiny fans at the airlock.
  • +
+

Fox McCloud updated:

+
    +
  • Fixes a few instances generating log spam relating to z-level tracking
  • +
  • Fixes weird behavior with ghosts being able to trigger a few things by crossing over them
  • +
  • Fixes drifting ghosts
  • +
+

Ionward updated:

+
    +
  • Updated the cautery sprite!
  • +
+

KasparoVy updated:

+
    +
  • Adds a verb to eyewear you can use to adjust them so they appear above or below masks. Discover interesting combinations and enjoy a cool look.
  • +
+

Kyep updated:

+
    +
  • Trying to latejoin a round with no open job slots now results in an informative error message, rather than broken-looking blank window.
  • +
  • Added new bonus loadout items for higher-tier patrons. Also gave admins access to patron items, and ensured that during custom events, you see the custom event announcement when you connect.
  • +
  • You can now identify when someone is using internals from a tank in their pocket, without having to remove the tank.
  • +
  • punching a windoor no longer generates a runtime error.
  • +
  • cryogenic_liquid/envenomed_filaments blobs no longer generate runtimes when their blob special attack hits mobs that do not process reagents
  • +
  • fixed $5+ donors not getting extra loadout points.
  • +
+

Markolie updated:

+
    +
  • Ambient occlusion had been added to the game. This represents a shadowy effect on most objects. It can be turned off through the game preferences menu.
  • +
  • Our lighting system has been updated to /tg/'s latest version. Hopefully this means we'll have less lag later in the round.
  • +
  • Night vision has been modified. There are now three levels of night vision. Certain creatures that were previously able to toggle night vision can now switch between all levels. Thermals now give some night vision.
  • +
  • Mesons now no longer fully light up non-visible turfs. It uses slight darkness instead.
  • +
  • Syndicate operatives may now purchase a chameleon bundles (2TC), which allows them to disguise not just their jumpsuit, but all of their equipment. They can change individual clothing as well as the outfit as a whole.
  • +
  • When using a voice changer, NTTC will no longer default to an "Unknown" job: it'll still use the assignment on your card to prevent meta-gaming. Always combine a voice changer and a Syndicate ID.
  • +
  • Admins with advanced admin interaction toggled on can now interact with the small airlock buttons.
  • +
  • The steel_rain runtime fix has been re-applied.
  • +
  • The propulsion on the admin shuttles has been fixed. The shutters on the south side of the hospital shuttle now point the right way.
  • +
  • Nuclear Operative reinforcements now spawn with a properly counted agent designation.
  • +
  • Fixed an issue where a mob's sight wouldn't update properly in certain cases, such as being revived.
  • +
  • Resolved an issue where the lobby would be bright white when being sent back.
  • +
  • Resolved an issue where the ambient occlusion preference wouldn't update properly in the lobby.
  • +
  • Resolved an issue where clicking on a windoor would no longer prevent it from auto-closing.
  • +
  • When a nuclear operative chooses to play as the borg instead of operative using the cyborg teleporter, ghosts will now be informed of this in their acceptance message.
  • +
  • Resolved an issue where cameras couldn't take pictures of non-dynamic lighting areas, such as the holodeck or space.
  • +
  • Resolved an issue where mobs would appear above water.
  • +
  • Resolved an issue where radiation storms would make lighting invisible in space.
  • +
  • Simple mobs no longer retain their X-Ray upon being revived.
  • +
  • Applying brute/fire damage through the View Variables menu for non-humans has been fixed.
  • +
  • NTTC regex has been disabled due to an urgent security issue.
  • +
+

Mitchs98 updated:

+
    +
  • You can now order a Pig Crate from Cargo for 25 points.
  • +
+

TDSSS updated:

+
    +
  • typo on sst shuttle console
  • +
  • opening turret covers now stay on top of their turret.
  • +
+

Twinmold93 updated:

+
    +
  • Adds Server Time to the Status Tab for Admins.
  • +
+

farie82 updated:

+
    +
  • Transforming into another species will now retain the items correctly. Example clings will keep their armblades and they won't get stuck with a non existing armblade they can't put back
  • +
  • Devour and regurgitate use forcemove now. So no being buckled inside an alien
  • +
+

fludd12 updated:

+
    +
  • Project Mind now has a corollary ability, Scan Mind. Now communication can be two-way!
  • +
+

variableundefined updated:

+
    +
  • Simple animals actually use the new subsystem now
  • +
  • What was NPCAI is now renamed to NPCPool - Its the functional equivalent of what it is in tg
  • +
  • Simple animals actually run on subsystem instead of a process now.
  • +
  • idleNPCpool has been added reducing performance impact of hostile simple animals
  • +
  • NPCAI Process (That run both SNPC and SimpleAnimals) that was somehow left out by me
  • +
  • SNPC & assocaited NPCAI Subsystem
  • +
  • Some of space hotel's functions.
  • +
  • Bodysnatch gland.
  • +
  • process_ai has been deprecated
  • +
+

02 May 2019

AffectedArc07 updated:

    diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index 5ad4bdbcd9e..d0e51aa9571 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -10043,3 +10043,122 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. - rscadd: Adds Lumi's vox suit fluff uc_guy: - bugfix: Players in the lobby no longer see cult speak. +2019-05-10: + AffectedArc07: + - tweak: Removes an infinite loop in the code + - rscdel: Removes unused code + - tweak: Captains display case now actually has captains thumbprint lock on it + - tweak: Morgue updates happen slightly better now + - bugfix: Fixes a minor NTTC issue + Arkatos: + - rscadd: Patch Pack is now craftable with a cardboard, costs 2 cardboard sheets. + - tweak: Examine tooltip delay increased slightly + - bugfix: Examine tooltips now work properly on items in storage + - tweak: Full toolbelts now spawn with randomly a colored cable coil + - imageadd: Added inhand sprites for belts + - tweak: Species name now shows in a species theme color on examine + - imageadd: Added 4 new plushies + Couls: + - tweak: necromantic stone now forces the ghost back into the body as a skeleton + - rscadd: allow skeletons to give up their bodies and offer control to ghosts + Crazylemon and Fox McCloud: + - bugfix: Fixes toggles not properly saving + EvadableMoxie: + - rscadd: Added the Nanotrasen Hospital Vessel Asclepius, able to be deployed by + admins. + - tweak: Admin shuttle now requires ERT clearance instead of admin clearance. + - tweak: Admin shuttle now has a navigation computer and tiny fans at the airlock. + Fox McCloud: + - bugfix: Fixes a few instances generating log spam relating to z-level tracking + - bugfix: Fixes weird behavior with ghosts being able to trigger a few things by + crossing over them + - bugfix: Fixes drifting ghosts + Ionward: + - imageadd: Updated the cautery sprite! + KasparoVy: + - rscadd: Adds a verb to eyewear you can use to adjust them so they appear above + or below masks. Discover interesting combinations and enjoy a cool look. + Kyep: + - rscadd: Trying to latejoin a round with no open job slots now results in an informative + error message, rather than broken-looking blank window. + - rscadd: Added new bonus loadout items for higher-tier patrons. Also gave admins + access to patron items, and ensured that during custom events, you see the custom + event announcement when you connect. + - tweak: You can now identify when someone is using internals from a tank in their + pocket, without having to remove the tank. + - bugfix: punching a windoor no longer generates a runtime error. + - bugfix: cryogenic_liquid/envenomed_filaments blobs no longer generate runtimes + when their blob special attack hits mobs that do not process reagents + - bugfix: fixed $5+ donors not getting extra loadout points. + Markolie: + - rscadd: Ambient occlusion had been added to the game. This represents a shadowy + effect on most objects. It can be turned off through the game preferences menu. + - tweak: Our lighting system has been updated to /tg/'s latest version. Hopefully + this means we'll have less lag later in the round. + - tweak: Night vision has been modified. There are now three levels of night vision. + Certain creatures that were previously able to toggle night vision can now switch + between all levels. Thermals now give some night vision. + - tweak: Mesons now no longer fully light up non-visible turfs. It uses slight darkness + instead. + - rscadd: Syndicate operatives may now purchase a chameleon bundles (2TC), which + allows them to disguise not just their jumpsuit, but all of their equipment. + They can change individual clothing as well as the outfit as a whole. + - tweak: 'When using a voice changer, NTTC will no longer default to an "Unknown" + job: it''ll still use the assignment on your card to prevent meta-gaming. Always + combine a voice changer and a Syndicate ID.' + - tweak: Admins with advanced admin interaction toggled on can now interact with + the small airlock buttons. + - bugfix: The steel_rain runtime fix has been re-applied. + - bugfix: The propulsion on the admin shuttles has been fixed. The shutters on the + south side of the hospital shuttle now point the right way. + - bugfix: Nuclear Operative reinforcements now spawn with a properly counted agent + designation. + - bugfix: Fixed an issue where a mob's sight wouldn't update properly in certain + cases, such as being revived. + - bugfix: Resolved an issue where the lobby would be bright white when being sent + back. + - bugfix: Resolved an issue where the ambient occlusion preference wouldn't update + properly in the lobby. + - bugfix: Resolved an issue where clicking on a windoor would no longer prevent + it from auto-closing. + - bugfix: When a nuclear operative chooses to play as the borg instead of operative + using the cyborg teleporter, ghosts will now be informed of this in their acceptance + message. + - bugfix: Resolved an issue where cameras couldn't take pictures of non-dynamic + lighting areas, such as the holodeck or space. + - bugfix: Resolved an issue where mobs would appear above water. + - bugfix: Resolved an issue where radiation storms would make lighting invisible + in space. + - bugfix: Simple mobs no longer retain their X-Ray upon being revived. + - bugfix: Applying brute/fire damage through the View Variables menu for non-humans + has been fixed. + - rscdel: NTTC regex has been disabled due to an urgent security issue. + Mitchs98: + - rscadd: You can now order a Pig Crate from Cargo for 25 points. + TDSSS: + - bugfix: typo on sst shuttle console + - bugfix: opening turret covers now stay on top of their turret. + Twinmold93: + - rscadd: Adds Server Time to the Status Tab for Admins. + farie82: + - bugfix: Transforming into another species will now retain the items correctly. + Example clings will keep their armblades and they won't get stuck with a non + existing armblade they can't put back + - bugfix: Devour and regurgitate use forcemove now. So no being buckled inside an + alien + fludd12: + - rscadd: Project Mind now has a corollary ability, Scan Mind. Now communication + can be two-way! + variableundefined: + - tweak: Simple animals actually use the new subsystem now + - tweak: What was NPCAI is now renamed to NPCPool - Its the functional equivalent + of what it is in tg + - tweak: Simple animals actually run on subsystem instead of a process now. + - rscadd: idleNPCpool has been added reducing performance impact of hostile simple + animals + - rscdel: NPCAI Process (That run both SNPC and SimpleAnimals) that was somehow + left out by me + - rscdel: SNPC & assocaited NPCAI Subsystem + - rscdel: Some of space hotel's functions. + - rscdel: Bodysnatch gland. + - tweak: process_ai has been deprecated diff --git a/html/changelogs/AutoChangeLog-pr-11261.yml b/html/changelogs/AutoChangeLog-pr-11261.yml deleted file mode 100644 index 15595372438..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11261.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Couls" -delete-after: True -changes: - - tweak: "necromantic stone now forces the ghost back into the body as a skeleton" - - rscadd: "allow skeletons to give up their bodies and offer control to ghosts" diff --git a/html/changelogs/AutoChangeLog-pr-11315.yml b/html/changelogs/AutoChangeLog-pr-11315.yml deleted file mode 100644 index e8d1dacb7dd..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11315.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "farie82" -delete-after: True -changes: - - bugfix: "Transforming into another species will now retain the items correctly. Example clings will keep their armblades and they won't get stuck with a non existing armblade they can't put back" diff --git a/html/changelogs/AutoChangeLog-pr-11357.yml b/html/changelogs/AutoChangeLog-pr-11357.yml deleted file mode 100644 index 61304092a00..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11357.yml +++ /dev/null @@ -1,7 +0,0 @@ -author: "Markolie" -delete-after: True -changes: - - rscadd: "Ambient occlusion had been added to the game. This represents a shadowy effect on most objects. It can be turned off through the game preferences menu." - - tweak: "Our lighting system has been updated to /tg/'s latest version. Hopefully this means we'll have less lag later in the round." - - tweak: "Night vision has been modified. There are now three levels of night vision. Certain creatures that were previously able to toggle night vision can now switch between all levels. Thermals now give some night vision." - - tweak: "Mesons now no longer fully light up non-visible turfs. It uses slight darkness instead." diff --git a/html/changelogs/AutoChangeLog-pr-11384.yml b/html/changelogs/AutoChangeLog-pr-11384.yml deleted file mode 100644 index 1dee1b49d8e..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11384.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Kyep" -delete-after: True -changes: - - rscadd: "Trying to latejoin a round with no open job slots now results in an informative error message, rather than broken-looking blank window." diff --git a/html/changelogs/AutoChangeLog-pr-11399.yml b/html/changelogs/AutoChangeLog-pr-11399.yml deleted file mode 100644 index 44c51779cbf..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11399.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Kyep" -delete-after: True -changes: - - rscadd: "Added new bonus loadout items for higher-tier patrons. Also gave admins access to patron items, and ensured that during custom events, you see the custom event announcement when you connect." diff --git a/html/changelogs/AutoChangeLog-pr-11403.yml b/html/changelogs/AutoChangeLog-pr-11403.yml deleted file mode 100644 index 2ffea4e8a9d..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11403.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Kyep" -delete-after: True -changes: - - tweak: "You can now identify when someone is using internals from a tank in their pocket, without having to remove the tank." diff --git a/html/changelogs/AutoChangeLog-pr-11415.yml b/html/changelogs/AutoChangeLog-pr-11415.yml deleted file mode 100644 index 8a197f8f6f4..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11415.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Twinmold93" -delete-after: True -changes: - - rscadd: "Adds Server Time to the Status Tab for Admins." diff --git a/html/changelogs/AutoChangeLog-pr-11416.yml b/html/changelogs/AutoChangeLog-pr-11416.yml deleted file mode 100644 index c3c444d9879..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11416.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "KasparoVy" -delete-after: True -changes: - - rscadd: "Adds a verb to eyewear you can use to adjust them so they appear above or below masks. Discover interesting combinations and enjoy a cool look." diff --git a/html/changelogs/AutoChangeLog-pr-11418.yml b/html/changelogs/AutoChangeLog-pr-11418.yml deleted file mode 100644 index 8e9f296ca97..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11418.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Arkatos" -delete-after: True -changes: - - rscadd: "Patch Pack is now craftable with a cardboard, costs 2 cardboard sheets." diff --git a/html/changelogs/AutoChangeLog-pr-11425.yml b/html/changelogs/AutoChangeLog-pr-11425.yml deleted file mode 100644 index f3ed1d5bd9e..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11425.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Arkatos" -delete-after: True -changes: - - tweak: "Examine tooltip delay increased slightly" - - bugfix: "Examine tooltips now work properly on items in storage" diff --git a/html/changelogs/AutoChangeLog-pr-11426.yml b/html/changelogs/AutoChangeLog-pr-11426.yml deleted file mode 100644 index 49414869223..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11426.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Arkatos" -delete-after: True -changes: - - tweak: "Full toolbelts now spawn with randomly a colored cable coil" - - imageadd: "Added inhand sprites for belts" diff --git a/html/changelogs/AutoChangeLog-pr-11427.yml b/html/changelogs/AutoChangeLog-pr-11427.yml deleted file mode 100644 index 32e770e594f..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11427.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Arkatos" -delete-after: True -changes: - - tweak: "Species name now shows in a species theme color on examine" diff --git a/html/changelogs/AutoChangeLog-pr-11428.yml b/html/changelogs/AutoChangeLog-pr-11428.yml deleted file mode 100644 index fe0d3f99aac..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11428.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Markolie" -delete-after: True -changes: - - rscadd: "Syndicate operatives may now purchase a chameleon bundles (2TC), which allows them to disguise not just their jumpsuit, but all of their equipment. They can change individual clothing as well as the outfit as a whole." - - tweak: "When using a voice changer, NTTC will no longer default to an \"Unknown\" job: it'll still use the assignment on your card to prevent meta-gaming. Always combine a voice changer and a Syndicate ID." diff --git a/html/changelogs/AutoChangeLog-pr-11429.yml b/html/changelogs/AutoChangeLog-pr-11429.yml deleted file mode 100644 index 86509436332..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11429.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Mitchs98" -delete-after: True -changes: - - rscadd: "You can now order a Pig Crate from Cargo for 25 points." diff --git a/html/changelogs/AutoChangeLog-pr-11431.yml b/html/changelogs/AutoChangeLog-pr-11431.yml deleted file mode 100644 index d9f93831773..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11431.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Arkatos" -delete-after: True -changes: - - imageadd: "Added 4 new plushies" diff --git a/html/changelogs/AutoChangeLog-pr-11434.yml b/html/changelogs/AutoChangeLog-pr-11434.yml deleted file mode 100644 index f07ba09cf41..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11434.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "TDSSS" -delete-after: True -changes: - - bugfix: "typo on sst shuttle console" diff --git a/html/changelogs/AutoChangeLog-pr-11440.yml b/html/changelogs/AutoChangeLog-pr-11440.yml deleted file mode 100644 index 1ddb3e68464..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11440.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "farie82" -delete-after: True -changes: - - bugfix: "Devour and regurgitate use forcemove now. So no being buckled inside an alien" diff --git a/html/changelogs/AutoChangeLog-pr-11441.yml b/html/changelogs/AutoChangeLog-pr-11441.yml deleted file mode 100644 index 083b619ed6d..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11441.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Markolie" -delete-after: True -changes: - - tweak: "Admins with advanced admin interaction toggled on can now interact with the small airlock buttons." diff --git a/html/changelogs/AutoChangeLog-pr-11442.yml b/html/changelogs/AutoChangeLog-pr-11442.yml deleted file mode 100644 index 2cdaf2355fe..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11442.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: "EvadableMoxie" -delete-after: True -changes: - - rscadd: "Added the Nanotrasen Hospital Vessel Asclepius, able to be deployed by admins." - - tweak: "Admin shuttle now requires ERT clearance instead of admin clearance." - - tweak: "Admin shuttle now has a navigation computer and tiny fans at the airlock." diff --git a/html/changelogs/AutoChangeLog-pr-11443.yml b/html/changelogs/AutoChangeLog-pr-11443.yml deleted file mode 100644 index 5c3a9a1b8e2..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11443.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Kyep" -delete-after: True -changes: - - bugfix: "punching a windoor no longer generates a runtime error." diff --git a/html/changelogs/AutoChangeLog-pr-11445.yml b/html/changelogs/AutoChangeLog-pr-11445.yml deleted file mode 100644 index 30b9ae088e8..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11445.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Kyep" -delete-after: True -changes: - - bugfix: "cryogenic_liquid/envenomed_filaments blobs no longer generate runtimes when their blob special attack hits mobs that do not process reagents" diff --git a/html/changelogs/AutoChangeLog-pr-11446.yml b/html/changelogs/AutoChangeLog-pr-11446.yml deleted file mode 100644 index ac51997fc92..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11446.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Ionward" -delete-after: True -changes: - - imageadd: "Updated the cautery sprite!" diff --git a/html/changelogs/AutoChangeLog-pr-11450.yml b/html/changelogs/AutoChangeLog-pr-11450.yml deleted file mode 100644 index efa7b8c358e..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11450.yml +++ /dev/null @@ -1,12 +0,0 @@ -author: "variableundefined" -delete-after: True -changes: - - tweak: "Simple animals actually use the new subsystem now" - - tweak: "What was NPCAI is now renamed to NPCPool - Its the functional equivalent of what it is in tg" - - tweak: "Simple animals actually run on subsystem instead of a process now." - - rscadd: "idleNPCpool has been added reducing performance impact of hostile simple animals" - - rscdel: "NPCAI Process (That run both SNPC and SimpleAnimals) that was somehow left out by me" - - rscdel: "SNPC & assocaited NPCAI Subsystem" - - rscdel: "Some of space hotel's functions." - - rscdel: "Bodysnatch gland." - - tweak: "process_ai has been deprecated" diff --git a/html/changelogs/AutoChangeLog-pr-11451.yml b/html/changelogs/AutoChangeLog-pr-11451.yml deleted file mode 100644 index 347ccdf9b19..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11451.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Markolie" -delete-after: True -changes: - - bugfix: "The steel_rain runtime fix has been re-applied." diff --git a/html/changelogs/AutoChangeLog-pr-11453.yml b/html/changelogs/AutoChangeLog-pr-11453.yml deleted file mode 100644 index be5b75e4bfa..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11453.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Fox McCloud" -delete-after: True -changes: - - bugfix: "Fixes a few instances generating log spam relating to z-level tracking" diff --git a/html/changelogs/AutoChangeLog-pr-11455.yml b/html/changelogs/AutoChangeLog-pr-11455.yml deleted file mode 100644 index a571ffc3c0b..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11455.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "AffectedArc07" -delete-after: True -changes: - - tweak: "Removes an infinite loop in the code" diff --git a/html/changelogs/AutoChangeLog-pr-11457.yml b/html/changelogs/AutoChangeLog-pr-11457.yml deleted file mode 100644 index d7b6c6c7de2..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11457.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Markolie" -delete-after: True -changes: - - bugfix: "The propulsion on the admin shuttles has been fixed. The shutters on the south side of the hospital shuttle now point the right way." diff --git a/html/changelogs/AutoChangeLog-pr-11461.yml b/html/changelogs/AutoChangeLog-pr-11461.yml deleted file mode 100644 index d65e90c7079..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11461.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Markolie" -delete-after: True -changes: - - bugfix: "Nuclear Operative reinforcements now spawn with a properly counted agent designation." diff --git a/html/changelogs/AutoChangeLog-pr-11463.yml b/html/changelogs/AutoChangeLog-pr-11463.yml deleted file mode 100644 index dad85167b1a..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11463.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "AffectedArc07" -delete-after: True -changes: - - rscdel: "Removes unused code" diff --git a/html/changelogs/AutoChangeLog-pr-11467.yml b/html/changelogs/AutoChangeLog-pr-11467.yml deleted file mode 100644 index ff6e7c5f739..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11467.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "AffectedArc07" -delete-after: True -changes: - - tweak: "Captains display case now actually has captains thumbprint lock on it" diff --git a/html/changelogs/AutoChangeLog-pr-11470.yml b/html/changelogs/AutoChangeLog-pr-11470.yml deleted file mode 100644 index 8ede62b29e1..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11470.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "fludd12" -delete-after: True -changes: - - rscadd: "Project Mind now has a corollary ability, Scan Mind. Now communication can be two-way!" diff --git a/html/changelogs/AutoChangeLog-pr-11474.yml b/html/changelogs/AutoChangeLog-pr-11474.yml deleted file mode 100644 index 7e793d7bc20..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11474.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "AffectedArc07" -delete-after: True -changes: - - tweak: "Morgue updates happen slightly better now" diff --git a/html/changelogs/AutoChangeLog-pr-11475.yml b/html/changelogs/AutoChangeLog-pr-11475.yml deleted file mode 100644 index 9f7c02a26eb..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11475.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "AffectedArc07" -delete-after: True -changes: - - bugfix: "Fixes a minor NTTC issue" diff --git a/html/changelogs/AutoChangeLog-pr-11489.yml b/html/changelogs/AutoChangeLog-pr-11489.yml deleted file mode 100644 index ce83f855daf..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11489.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: "Markolie" -delete-after: True -changes: - - bugfix: "Fixed an issue where a mob's sight wouldn't update properly in certain cases, such as being revived." - - bugfix: "Resolved an issue where the lobby would be bright white when being sent back." - - bugfix: "Resolved an issue where the ambient occlusion preference wouldn't update properly in the lobby." diff --git a/html/changelogs/AutoChangeLog-pr-11490.yml b/html/changelogs/AutoChangeLog-pr-11490.yml deleted file mode 100644 index ae1ed2eae11..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11490.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Markolie" -delete-after: True -changes: - - bugfix: "Resolved an issue where clicking on a windoor would no longer prevent it from auto-closing." diff --git a/html/changelogs/AutoChangeLog-pr-11492.yml b/html/changelogs/AutoChangeLog-pr-11492.yml deleted file mode 100644 index eb870579c13..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11492.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Markolie" -delete-after: True -changes: - - bugfix: "When a nuclear operative chooses to play as the borg instead of operative using the cyborg teleporter, ghosts will now be informed of this in their acceptance message." diff --git a/html/changelogs/AutoChangeLog-pr-11493.yml b/html/changelogs/AutoChangeLog-pr-11493.yml deleted file mode 100644 index fa96ce24f35..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11493.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Fox McCloud" -delete-after: True -changes: - - bugfix: "Fixes weird behavior with ghosts being able to trigger a few things by crossing over them" diff --git a/html/changelogs/AutoChangeLog-pr-11494.yml b/html/changelogs/AutoChangeLog-pr-11494.yml deleted file mode 100644 index fee8563113e..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11494.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: "Markolie" -delete-after: True -changes: - - bugfix: "Resolved an issue where cameras couldn't take pictures of non-dynamic lighting areas, such as the holodeck or space." - - bugfix: "Resolved an issue where mobs would appear above water." - - bugfix: "Resolved an issue where radiation storms would make lighting invisible in space." diff --git a/html/changelogs/AutoChangeLog-pr-11495.yml b/html/changelogs/AutoChangeLog-pr-11495.yml deleted file mode 100644 index aad9355db64..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11495.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "TDSSS" -delete-after: True -changes: - - bugfix: "opening turret covers now stay on top of their turret." diff --git a/html/changelogs/AutoChangeLog-pr-11497.yml b/html/changelogs/AutoChangeLog-pr-11497.yml deleted file mode 100644 index d619ca03d3d..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11497.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Kyep" -delete-after: True -changes: - - bugfix: "fixed $5+ donors not getting extra loadout points." diff --git a/html/changelogs/AutoChangeLog-pr-11498.yml b/html/changelogs/AutoChangeLog-pr-11498.yml deleted file mode 100644 index 17e881fdab0..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11498.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Crazylemon and Fox McCloud" -delete-after: True -changes: - - bugfix: "Fixes toggles not properly saving" diff --git a/html/changelogs/AutoChangeLog-pr-11499.yml b/html/changelogs/AutoChangeLog-pr-11499.yml deleted file mode 100644 index d96b64ce5fc..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11499.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Fox McCloud" -delete-after: True -changes: - - bugfix: "Fixes drifting ghosts" diff --git a/html/changelogs/AutoChangeLog-pr-11501.yml b/html/changelogs/AutoChangeLog-pr-11501.yml deleted file mode 100644 index 94a9eb83fcc..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11501.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Markolie" -delete-after: True -changes: - - bugfix: "Simple mobs no longer retain their X-Ray upon being revived." - - bugfix: "Applying brute/fire damage through the View Variables menu for non-humans has been fixed." diff --git a/html/changelogs/AutoChangeLog-pr-11502.yml b/html/changelogs/AutoChangeLog-pr-11502.yml deleted file mode 100644 index 775d368b7ba..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11502.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Markolie" -delete-after: True -changes: - - rscdel: "NTTC regex has been disabled due to an urgent security issue." From d45c8a64424580dbdbdf5356cf64a6a2af135b5b Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Fri, 10 May 2019 18:04:20 -0400 Subject: [PATCH 51/55] Automatic changelog generation for PR #11508 [ci skip] --- html/changelogs/AutoChangeLog-pr-11508.yml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-11508.yml diff --git a/html/changelogs/AutoChangeLog-pr-11508.yml b/html/changelogs/AutoChangeLog-pr-11508.yml new file mode 100644 index 00000000000..ebe3ed56455 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11508.yml @@ -0,0 +1,6 @@ +author: "datlo" +delete-after: True +changes: + - bugfix: "Ghosts will no longer get the wrong role offered when a nukie +spawns a borg and will properly be informed whether they will spawn as a +nuke ops or a syndi cyborg." From 7c2600daa7fbc0262210e990fa5e8e98d736b2db Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Sat, 11 May 2019 19:39:29 -0400 Subject: [PATCH 52/55] Automatic changelog generation for PR #11483 [ci skip] --- html/changelogs/AutoChangeLog-pr-11483.yml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-11483.yml diff --git a/html/changelogs/AutoChangeLog-pr-11483.yml b/html/changelogs/AutoChangeLog-pr-11483.yml new file mode 100644 index 00000000000..635f5efede9 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11483.yml @@ -0,0 +1,6 @@ +author: "datlo" +delete-after: True +changes: + - bugfix: "The Syndicate will no longer hire golems as agents." + - tweak: "Banana juice and Banana honk will now heal everyone with the Comic Sans mutation instead of checking for the clown job" + - tweak: "Nothing will now check if the player has an active vow of silence instead of checking for the mime job" From c2df74312e65cce6c252575077a921f203ffc05f Mon Sep 17 00:00:00 2001 From: Fox McCloud Date: Mon, 13 May 2019 03:18:34 -0400 Subject: [PATCH 53/55] Prevents Future SSTicker from Runtiming --- code/datums/cache/cache.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/datums/cache/cache.dm b/code/datums/cache/cache.dm index 2502bb871b2..f401e54517a 100644 --- a/code/datums/cache/cache.dm +++ b/code/datums/cache/cache.dm @@ -1,6 +1,6 @@ /datum/cache_entry var/timestamp - var/data - + var/list/data = list() + /datum/repository var/cache_data \ No newline at end of file From c910cb4009f2e358836a7ab09cfc0b96dd111b02 Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Mon, 13 May 2019 03:57:06 -0400 Subject: [PATCH 54/55] Automatic changelog generation for PR #11523 [ci skip] --- html/changelogs/AutoChangeLog-pr-11523.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-11523.yml diff --git a/html/changelogs/AutoChangeLog-pr-11523.yml b/html/changelogs/AutoChangeLog-pr-11523.yml new file mode 100644 index 00000000000..654203e359b --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11523.yml @@ -0,0 +1,4 @@ +author: "Fox McCloud" +delete-after: True +changes: + - bugfix: "Future proofs the coming Ticker subsystem" From c639b5d0f6230f4c699c9267758fbe9dba322470 Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Mon, 13 May 2019 15:54:19 -0400 Subject: [PATCH 55/55] Automatic changelog generation for PR #11368 [ci skip] --- html/changelogs/AutoChangeLog-pr-11368.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-11368.yml diff --git a/html/changelogs/AutoChangeLog-pr-11368.yml b/html/changelogs/AutoChangeLog-pr-11368.yml new file mode 100644 index 00000000000..f2d543bae3a --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11368.yml @@ -0,0 +1,5 @@ +author: "AffectedArc07" +delete-after: True +changes: + - rscadd: "SSticker" + - tweak: "You can no longer force-start a round unless its fully initialised."