From eb6eb7bcd69e120ad919ef98ce14a4c8d1c04189 Mon Sep 17 00:00:00 2001 From: Atermonera Date: Tue, 28 Apr 2020 14:55:04 -0700 Subject: [PATCH] Refactor telecomms and consoles to operate on logical zlevels --- code/controllers/subsystems/ticker.dm | 567 ++++++++++++++++++ code/defines/procs/announce.dm | 43 ++ code/game/machinery/telecomms/broadcaster.dm | 10 + .../telecomms/machine_interactions.dm | 16 + .../game/objects/items/devices/radio/radio.dm | 42 +- .../objects/items/devices/radio/radiopack.dm | 22 + code/modules/alarm/atmosphere_alarm.dm | 8 + code/modules/mob/new_player/new_player.dm | 4 + .../programs/engineering/alarm_monitor.dm | 4 + .../programs/medical/suit_sensors.dm | 4 + icons/mob/back.dmi | Bin 104533 -> 105146 bytes maps/~map_system/maps.dm | 11 + vorestation.dme | 6 + 13 files changed, 736 insertions(+), 1 deletion(-) diff --git a/code/controllers/subsystems/ticker.dm b/code/controllers/subsystems/ticker.dm index 397f32078c..35de4f2bbc 100644 --- a/code/controllers/subsystems/ticker.dm +++ b/code/controllers/subsystems/ticker.dm @@ -1,3 +1,4 @@ +<<<<<<< HEAD // // Ticker controls the state of the game, being responsible for round start, game mode, and round end. // @@ -557,3 +558,569 @@ var/global/datum/controller/subsystem/ticker/ticker Bible_name = SSticker.Bible_name Bible_deity_name = SSticker.Bible_deity_name random_players = SSticker.random_players +======= +// +// Ticker controls the state of the game, being responsible for round start, game mode, and round end. +// +SUBSYSTEM_DEF(ticker) + name = "Gameticker" + wait = 2 SECONDS + init_order = INIT_ORDER_TICKER + priority = FIRE_PRIORITY_TICKER + flags = SS_NO_TICK_CHECK | SS_KEEP_TIMING + runlevels = RUNLEVEL_LOBBY | RUNLEVEL_SETUP | RUNLEVEL_GAME | RUNLEVEL_POSTGAME // Every runlevel! + + var/const/restart_timeout = 3 MINUTES // Default time to wait before rebooting in desiseconds. + var/current_state = GAME_STATE_INIT // We aren't even at pregame yet // TODO replace with CURRENT_GAME_STATE + + /* Relies upon the following globals (TODO move those in here) */ + // var/master_mode = "extended" //The underlying game mode (so "secret" or the voted mode). + // Set by SSvote when VOTE_GAMEMODE finishes. + // var/round_progressing = 1 //Whether the lobby clock is ticking down. + + var/pregame_timeleft = 0 // Time remaining until game starts in seconds. Set by config + var/start_immediately = FALSE // If true there is no lobby phase, the game starts immediately. + + var/hide_mode = FALSE // If the true game mode should be hidden (because we chose "secret") + var/datum/game_mode/mode = null // The actual gamemode, if selected. + + var/end_game_state = END_GAME_NOT_OVER // Track where we are ending game/round + var/restart_timeleft // Time remaining until restart in desiseconds + var/last_restart_notify // world.time of last restart warning. + var/delay_end = FALSE // If set, the round will not restart on its own. + + var/login_music // music played in pregame lobby + + var/list/datum/mind/minds = list() // The people in the game. Used for objective tracking. + + // TODO - I am sure there is a better place these can go. + 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/random_players = FALSE // If set to nonzero, ALL players who latejoin or declare-ready join will have random appearances/genders + + // TODO - Should this go here or in the job subsystem? + var/triai = FALSE // Global flag for Triumvirate AI being enabled + + //station_explosion used to be a variable for every mob's hud. Which was a waste! + //Now we have a general cinematic centrally held within the gameticker....far more efficient! + var/obj/screen/cinematic = null + +// This global variable exists for legacy support so we don't have to rename every 'ticker' to 'SSticker' yet. +var/global/datum/controller/subsystem/ticker/ticker +/datum/controller/subsystem/ticker/PreInit() + global.ticker = src // TODO - Remove this! Change everything to point at SSticker intead + login_music = pick(\ + /*'sound/music/halloween/skeletons.ogg',\ + 'sound/music/halloween/halloween.ogg',\ + 'sound/music/halloween/ghosts.ogg'*/ + 'sound/music/space.ogg',\ + 'sound/music/traitor.ogg',\ + 'sound/music/title2.ogg',\ + 'sound/music/clouds.s3m',\ + 'sound/music/space_oddity.ogg') //Ground Control to Major Tom, this song is cool, what's going on? + +/datum/controller/subsystem/ticker/Initialize() + pregame_timeleft = config.pregame_time + send2mainirc("Server lobby is loaded and open at byond://[config.serverurl ? config.serverurl : (config.server ? config.server : "[world.address]:[world.port]")]") + return ..() + +/datum/controller/subsystem/ticker/fire(resumed = FALSE) + switch(current_state) + if(GAME_STATE_INIT) + pregame_welcome() + current_state = GAME_STATE_PREGAME + if(GAME_STATE_PREGAME) + pregame_tick() + if(GAME_STATE_SETTING_UP) + setup_tick() + if(GAME_STATE_PLAYING) + playing_tick() + if(GAME_STATE_FINISHED) + post_game_tick() + +/datum/controller/subsystem/ticker/proc/pregame_welcome() + to_world("Welcome to the pregame lobby!") + to_world("Please set up your character and select ready. The round will start in [pregame_timeleft] seconds.") + +// Called during GAME_STATE_PREGAME (RUNLEVEL_LOBBY) +/datum/controller/subsystem/ticker/proc/pregame_tick() + if(round_progressing && last_fire) + pregame_timeleft -= (world.time - last_fire) / (1 SECOND) + + if(start_immediately) + pregame_timeleft = 0 + else if(SSvote.time_remaining) + return // vote still going, wait for it. + + // Time to start the game! + if(pregame_timeleft <= 0) + current_state = GAME_STATE_SETTING_UP + Master.SetRunLevel(RUNLEVEL_SETUP) + if(start_immediately) + fire() // Don't wait for next tick, do it now! + return + + if(pregame_timeleft <= config.vote_autogamemode_timeleft && !SSvote.gamemode_vote_called) + SSvote.autogamemode() // Start the game mode vote (if we haven't had one already) + +// Called during GAME_STATE_SETTING_UP (RUNLEVEL_SETUP) +/datum/controller/subsystem/ticker/proc/setup_tick(resumed = FALSE) + if(!setup_choose_gamemode()) + // It failed, go back to lobby state and re-send the welcome message + pregame_timeleft = config.pregame_time + SSvote.gamemode_vote_called = FALSE // Allow another autogamemode vote + current_state = GAME_STATE_PREGAME + Master.SetRunLevel(RUNLEVEL_LOBBY) + pregame_welcome() + return + // If we got this far we succeeded in picking a game mode. Punch it! + setup_startgame() + return + +// Formerly the first half of setup() - The part that chooses the game mode. +// Returns 0 if failed to pick a mode, otherwise 1 +/datum/controller/subsystem/ticker/proc/setup_choose_gamemode() + //Create and announce mode + if(master_mode == "secret") + src.hide_mode = TRUE + + var/list/runnable_modes = config.get_runnable_modes() + if((master_mode == "random") || (master_mode == "secret")) + if(!runnable_modes.len) + to_world("Unable to choose playable game mode. Reverting to pregame lobby.") + return 0 + if(secret_force_mode != "secret") + src.mode = config.pick_mode(secret_force_mode) + if(!src.mode) + var/list/weighted_modes = list() + for(var/datum/game_mode/GM in runnable_modes) + weighted_modes[GM.config_tag] = config.probabilities[GM.config_tag] + src.mode = gamemode_cache[pickweight(weighted_modes)] + else + src.mode = config.pick_mode(master_mode) + + if(!src.mode) + to_world("Serious error in mode setup! Reverting to pregame lobby.") //Uses setup instead of set up due to computational context. + return 0 + + job_master.ResetOccupations() + src.mode.create_antagonists() + src.mode.pre_setup() + job_master.DivideOccupations() // Apparently important for new antagonist system to register specific job antags properly. + + if(!src.mode.can_start()) + to_world("Unable to start [mode.name]. Not enough players readied, [config.player_requirements[mode.config_tag]] players needed. Reverting to pregame lobby.") + mode.fail_setup() + mode = null + job_master.ResetOccupations() + return 0 + + if(hide_mode) + to_world("The current game mode is - Secret!") + if(runnable_modes.len) + var/list/tmpmodes = new + for (var/datum/game_mode/M in runnable_modes) + tmpmodes+=M.name + tmpmodes = sortList(tmpmodes) + if(tmpmodes.len) + to_world("Possibilities: [english_list(tmpmodes, and_text= "; ", comma_text = "; ")]") + else + src.mode.announce() + return 1 + +// Formerly the second half of setup() - The part that actually initializes everything and starts the game. +/datum/controller/subsystem/ticker/proc/setup_startgame() + setup_economy() + create_characters() //Create player characters and transfer them. + collect_minds() + equip_characters() + data_core.manifest() + + callHook("roundstart") + + spawn(0)//Forking here so we dont have to wait for this to finish + mode.post_setup() + //Cleanup some stuff + for(var/obj/effect/landmark/start/S in landmarks_list) + //Deleting Startpoints but we need the ai point to AI-ize people later + if (S.name != "AI") + qdel(S) + to_world("Enjoy the game!") + world << sound('sound/AI/welcome.ogg') // Skie + //Holiday Round-start stuff ~Carn + Holiday_Game_Start() + + var/list/adm = get_admin_counts() + if(adm["total"] == 0) + send2adminirc("A round has started with no admins online.") + +/* supply_controller.process() //Start the supply shuttle regenerating points -- TLE // handled in scheduler + master_controller.process() //Start master_controller.process() + lighting_controller.process() //Start processing DynamicAreaLighting updates + */ + + processScheduler.start() + current_state = GAME_STATE_PLAYING + Master.SetRunLevel(RUNLEVEL_GAME) + + if(config.sql_enabled) + statistic_cycle() // Polls population totals regularly and stores them in an SQL DB -- TLE + + return 1 + + +// Called during GAME_STATE_PLAYING (RUNLEVEL_GAME) +/datum/controller/subsystem/ticker/proc/playing_tick(resumed = FALSE) + mode.process() // So THIS is where we run mode.process() huh? Okay + + if(mode.explosion_in_progress) + return // wait until explosion is done. + + // Calculate if game and/or mode are finished (Complicated by the continuous_rounds config option) + var/game_finished = FALSE + var/mode_finished = FALSE + if (config.continous_rounds) // Game keeps going after mode ends. + game_finished = (emergency_shuttle.returned() || mode.station_was_nuked) + mode_finished = ((end_game_state >= END_GAME_MODE_FINISHED) || mode.check_finished()) // Short circuit if already finished. + else // Game ends when mode does + game_finished = (mode.check_finished() || (emergency_shuttle.returned() && emergency_shuttle.evac == 1)) || universe_has_ended + mode_finished = game_finished + + if(game_finished && mode_finished) + end_game_state = END_GAME_READY_TO_END + current_state = GAME_STATE_FINISHED + Master.SetRunLevel(RUNLEVEL_POSTGAME) + INVOKE_ASYNC(src, .proc/declare_completion) + else if (mode_finished && (end_game_state < END_GAME_MODE_FINISHED)) + end_game_state = END_GAME_MODE_FINISHED // Only do this cleanup once! + mode.cleanup() + //call a transfer shuttle vote + to_world("The round has ended!") + SSvote.autotransfer() + +// Called during GAME_STATE_FINISHED (RUNLEVEL_POSTGAME) +/datum/controller/subsystem/ticker/proc/post_game_tick() + switch(end_game_state) + if(END_GAME_READY_TO_END) + callHook("roundend") + + if (mode.station_was_nuked) + feedback_set_details("end_proper", "nuke") + restart_timeleft = 1 MINUTE // No point waiting five minutes if everyone's dead. + if(!delay_end) + to_world("Rebooting due to destruction of [station_name()] in [round(restart_timeleft/600)] minute\s.") + last_restart_notify = world.time + else + feedback_set_details("end_proper", "proper completion") + restart_timeleft = restart_timeout + + if(blackbox) + blackbox.save_all_data_to_sql() // TODO - Blackbox or statistics subsystem + + end_game_state = END_GAME_ENDING + return + if(END_GAME_ENDING) + restart_timeleft -= (world.time - last_fire) + if(delay_end) + to_world("An admin has delayed the round end.") + end_game_state = END_GAME_DELAYED + else if(restart_timeleft <= 0) + world.Reboot() + else if (world.time - last_restart_notify >= 1 MINUTE) + to_world("Restarting in [round(restart_timeleft/600, 1)] minute\s.") + last_restart_notify = world.time + return + if(END_GAME_DELAYED) + restart_timeleft -= (world.time - last_fire) + if(!delay_end) + end_game_state = END_GAME_ENDING + else + log_error("Ticker arrived at round end in an unexpected endgame state '[end_game_state]'.") + end_game_state = END_GAME_READY_TO_END + + +// ---------------------------------------------------------------------- +// These two below are not used! But they could be + +// Use these preferentially to directly examining ticker.current_state to help prepare for transition to ticker as subsystem! + +/datum/controller/subsystem/ticker/proc/PreRoundStart() + return (current_state < GAME_STATE_PLAYING) + +/datum/controller/subsystem/ticker/proc/IsSettingUp() + return (current_state == GAME_STATE_SETTING_UP) + +/datum/controller/subsystem/ticker/proc/IsRoundInProgress() + return (current_state == GAME_STATE_PLAYING) + +/datum/controller/subsystem/ticker/proc/HasRoundStarted() + return (current_state >= GAME_STATE_PLAYING) + +// ------------------------------------------------------------------------ +// HELPER PROCS! +// ------------------------------------------------------------------------ + +//Plus it provides an easy way to make cinematics for other events. Just use this as a template :) +/datum/controller/subsystem/ticker/proc/station_explosion_cinematic(var/station_missed=0, var/override = null) + if( cinematic ) return //already a cinematic in progress! + + //initialise our cinematic screen object + cinematic = new(src) + cinematic.icon = 'icons/effects/station_explosion.dmi' + cinematic.icon_state = "station_intact" + cinematic.layer = 100 + cinematic.plane = PLANE_PLAYER_HUD + cinematic.mouse_opacity = 0 + cinematic.screen_loc = "1,0" + + var/obj/structure/bed/temp_buckle = new(src) + //Incredibly hackish. It creates a bed within the gameticker (lol) to stop mobs running around + if(station_missed) + for(var/mob/living/M in living_mob_list) + M.buckled = temp_buckle //buckles the mob so it can't do anything + if(M.client) + M.client.screen += cinematic //show every client the cinematic + else //nuke kills everyone on z-level 1 to prevent "hurr-durr I survived" + for(var/mob/living/M in living_mob_list) + M.buckled = temp_buckle + if(M.client) + M.client.screen += cinematic + + switch(M.z) + if(0) //inside a crate or something + var/turf/T = get_turf(M) + if(T && T.z in using_map.station_levels) //we don't use M.death(0) because it calls a for(/mob) loop and + M.health = 0 + M.set_stat(DEAD) + if(1) //on a z-level 1 turf. + M.health = 0 + M.set_stat(DEAD) + + //Now animate the cinematic + switch(station_missed) + if(1) //nuke was nearby but (mostly) missed + if( mode && !override ) + override = mode.name + switch( override ) + if("mercenary") //Nuke wasn't on station when it blew up + flick("intro_nuke",cinematic) + sleep(35) + world << sound('sound/effects/explosionfar.ogg') + flick("station_intact_fade_red",cinematic) + cinematic.icon_state = "summary_nukefail" + else + flick("intro_nuke",cinematic) + sleep(35) + world << sound('sound/effects/explosionfar.ogg') + //flick("end",cinematic) + + + if(2) //nuke was nowhere nearby //TODO: a really distant explosion animation + sleep(50) + world << sound('sound/effects/explosionfar.ogg') + + + else //station was destroyed + if( mode && !override ) + override = mode.name + switch( override ) + if("mercenary") //Nuke Ops successfully bombed the station + flick("intro_nuke",cinematic) + sleep(35) + flick("station_explode_fade_red",cinematic) + world << sound('sound/effects/explosionfar.ogg') + cinematic.icon_state = "summary_nukewin" + if("AI malfunction") //Malf (screen,explosion,summary) + flick("intro_malf",cinematic) + sleep(76) + flick("station_explode_fade_red",cinematic) + world << sound('sound/effects/explosionfar.ogg') + cinematic.icon_state = "summary_malf" + if("blob") //Station nuked (nuke,explosion,summary) + flick("intro_nuke",cinematic) + sleep(35) + flick("station_explode_fade_red",cinematic) + world << sound('sound/effects/explosionfar.ogg') + cinematic.icon_state = "summary_selfdes" + else //Station nuked (nuke,explosion,summary) + flick("intro_nuke",cinematic) + sleep(35) + flick("station_explode_fade_red", cinematic) + world << sound('sound/effects/explosionfar.ogg') + cinematic.icon_state = "summary_selfdes" + for(var/mob/living/M in living_mob_list) + if(M.loc.z in using_map.station_levels) + M.death()//No mercy + //If its actually the end of the round, wait for it to end. + //Otherwise if its a verb it will continue on afterwards. + sleep(300) + + if(cinematic) qdel(cinematic) //end the cinematic + if(temp_buckle) qdel(temp_buckle) //release everybody + return + + +/datum/controller/subsystem/ticker/proc/create_characters() + for(var/mob/new_player/player in player_list) + if(player && player.ready && player.mind) + if(player.mind.assigned_role=="AI") + player.close_spawn_windows() + player.AIize() + else if(!player.mind.assigned_role) + continue + else + player.create_character() + qdel(player) + + +/datum/controller/subsystem/ticker/proc/collect_minds() + for(var/mob/living/player in player_list) + if(player.mind) + minds += player.mind + + +/datum/controller/subsystem/ticker/proc/equip_characters() + var/captainless=1 + for(var/mob/living/carbon/human/player in player_list) + if(player && player.mind && player.mind.assigned_role) + if(player.mind.assigned_role == "Colony Director") + captainless=0 + if(!player_is_antag(player.mind, only_offstation_roles = 1)) + job_master.EquipRank(player, player.mind.assigned_role, 0) + UpdateFactionList(player) + equip_custom_items(player) + player.apply_traits() + if(captainless) + for(var/mob/M in player_list) + if(!istype(M,/mob/new_player)) + to_chat(M, "Colony Directorship not forced on anyone.") + + +/datum/controller/subsystem/ticker/proc/declare_completion() + to_world("


A round of [mode.name] has ended!

") + for(var/mob/Player in player_list) + if(Player.mind && !isnewplayer(Player)) + if(Player.stat != DEAD) + var/turf/playerTurf = get_turf(Player) + if(emergency_shuttle.departed && emergency_shuttle.evac) + if(isNotAdminLevel(playerTurf.z)) + to_chat(Player, "You survived the round, but remained on [station_name()] as [Player.real_name].") + else + to_chat(Player, "You managed to survive the events on [station_name()] as [Player.real_name].") + else if(isAdminLevel(playerTurf.z)) + to_chat(Player, "You successfully underwent crew transfer after events on [station_name()] as [Player.real_name].") + else if(issilicon(Player)) + to_chat(Player, "You remain operational after the events on [station_name()] as [Player.real_name].") + else + to_chat(Player, "You missed the crew transfer after the events on [station_name()] as [Player.real_name].") + else + if(istype(Player,/mob/observer/dead)) + var/mob/observer/dead/O = Player + if(!O.started_as_observer) + to_chat(Player, "You did not survive the events on [station_name()]...") + else + to_chat(Player, "You did not survive the events on [station_name()]...") + to_world("
") + + for (var/mob/living/silicon/ai/aiPlayer in mob_list) + if (aiPlayer.stat != 2) + to_world("[aiPlayer.name] (Played by: [aiPlayer.key])'s laws at the end of the round were:") + else + to_world("[aiPlayer.name] (Played by: [aiPlayer.key])'s laws when it was deactivated were:") + aiPlayer.show_laws(1) + + if (aiPlayer.connected_robots.len) + var/robolist = "The AI's loyal minions were: " + for(var/mob/living/silicon/robot/robo in aiPlayer.connected_robots) + robolist += "[robo.name][robo.stat?" (Deactivated) (Played by: [robo.key]), ":" (Played by: [robo.key]), "]" + to_world("[robolist]") + + var/dronecount = 0 + + for (var/mob/living/silicon/robot/robo in mob_list) + + if(istype(robo,/mob/living/silicon/robot/drone) && !istype(robo,/mob/living/silicon/robot/drone/swarm)) + dronecount++ + continue + + if (!robo.connected_ai) + if (robo.stat != 2) + to_world("[robo.name] (Played by: [robo.key]) survived as an AI-less stationbound synthetic! Its laws were:") + else + to_world("[robo.name] (Played by: [robo.key]) was unable to survive the rigors of being a stationbound synthetic without an AI. Its laws were:") + + if(robo) //How the hell do we lose robo between here and the world messages directly above this? + robo.laws.show_laws(world) + + if(dronecount) + to_world("There [dronecount>1 ? "were" : "was"] [dronecount] industrious maintenance [dronecount>1 ? "drones" : "drone"] at the end of this round.") + + mode.declare_completion()//To declare normal completion. + + //Ask the event manager to print round end information + SSevents.RoundEnd() + + //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) + 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 + total_antagonists[temprole] += ", [Mind.name]([Mind.key])" + else + total_antagonists.Add(temprole) //If the role doesnt exist in the list, create it and add the mob + total_antagonists[temprole] += ": [Mind.name]([Mind.key])" + + //Now print them all into the log! + log_game("Antagonists at round end were...") + for(var/i in total_antagonists) + log_game("[i]s[total_antagonists[i]].") + + return 1 + +/datum/controller/subsystem/ticker/stat_entry() + switch(current_state) + if(GAME_STATE_INIT) + ..() + if(GAME_STATE_PREGAME) // RUNLEVEL_LOBBY + ..("START [round_progressing ? "[round(pregame_timeleft)]s" : "(PAUSED)"]") + if(GAME_STATE_SETTING_UP) // RUNLEVEL_SETUP + ..("SETUP") + if(GAME_STATE_PLAYING) // RUNLEVEL_GAME + ..("GAME") + if(GAME_STATE_FINISHED) // RUNLEVEL_POSTGAME + switch(end_game_state) + if(END_GAME_MODE_FINISHED) + ..("MODE OVER, WAITING") + if(END_GAME_READY_TO_END) + ..("ENDGAME PROCESSING") + if(END_GAME_ENDING) + ..("END IN [round(restart_timeleft/10)]s") + if(END_GAME_DELAYED) + ..("END PAUSED") + else + ..("ENDGAME ERROR:[end_game_state]") + +/datum/controller/subsystem/ticker/Recover() + flags |= SS_NO_INIT // Don't initialize again + + current_state = SSticker.current_state + mode = SSticker.mode + pregame_timeleft = SSticker.pregame_timeleft + + end_game_state = SSticker.end_game_state + delay_end = SSticker.delay_end + restart_timeleft = SSticker.restart_timeleft + + minds = SSticker.minds + + Bible_icon_state = SSticker.Bible_icon_state + Bible_item_state = SSticker.Bible_item_state + Bible_name = SSticker.Bible_name + Bible_deity_name = SSticker.Bible_deity_name + random_players = SSticker.random_players +>>>>>>> e92ed43... Merge pull request #6990 from VOREStation/pol-tcomupdate diff --git a/code/defines/procs/announce.dm b/code/defines/procs/announce.dm index c739ffbf85..a05372a5e4 100644 --- a/code/defines/procs/announce.dm +++ b/code/defines/procs/announce.dm @@ -32,7 +32,11 @@ title = "Security Announcement" announcement_type = "Security Announcement" +<<<<<<< HEAD /datum/announcement/proc/Announce(var/message as text, var/new_title = "", var/new_sound = null, var/do_newscast = newscast, var/msg_sanitized = 0, zlevel) +======= +/datum/announcement/proc/Announce(var/message as text, var/new_title = "", var/new_sound = null, var/do_newscast = newscast, var/msg_sanitized = 0, var/zlevel) +>>>>>>> e92ed43... Merge pull request #6990 from VOREStation/pol-tcomupdate if(!message) return var/message_title = new_title ? new_title : title @@ -52,11 +56,46 @@ Sound(message_sound, zlevels) Log(message, message_title) +<<<<<<< HEAD datum/announcement/proc/Message(var/message as text, var/message_title as text, var/list/zlevels) global_announcer.autosay("[message_title]: [message]", announcer ? announcer : ANNOUNCER_NAME, zlevels) datum/announcement/minor/Message(var/message as text, var/message_title as text, var/list/zlevels) global_announcer.autosay(message, announcer ? announcer : ANNOUNCER_NAME, zlevels) +======= +datum/announcement/proc/Message(message as text, message_title as text, var/list/zlevels) + for(var/mob/M in player_list) + if(!istype(M,/mob/new_player) && !isdeaf(M)) + to_chat(M, "

[title]

") + to_chat(M, "[message]") + if (announcer) + to_chat(M, " -[html_encode(announcer)]") + +// You'll need to update these to_world usages if you want to make these z-level specific ~Aro +datum/announcement/minor/Message(message as text, message_title as text) + to_world("[message]") + +datum/announcement/priority/Message(message as text, message_title as text) + to_world("

[message_title]

") + to_world("[message]") + if(announcer) + to_world(" -[html_encode(announcer)]") + to_world("
") + +datum/announcement/priority/command/Message(message as text, message_title as text, var/list/zlevels) + var/command + command += "

[command_name()] Update

" + if (message_title) + command += "

[message_title]

" + + command += "
[message]
" + command += "
" + for(var/mob/M in player_list) + if(zlevels && !(get_z(M) in zlevels)) + continue + if(!istype(M,/mob/new_player) && !isdeaf(M)) + to_chat(M, command) +>>>>>>> e92ed43... Merge pull request #6990 from VOREStation/pol-tcomupdate datum/announcement/priority/Message(var/message as text, var/message_title as text, var/list/zlevels) global_announcer.autosay("[message_title]: [message]", announcer ? announcer : ANNOUNCER_NAME, zlevels) @@ -122,4 +161,8 @@ datum/announcement/proc/Log(message as text, message_title as text) AnnounceArrivalSimple(character.real_name, rank, join_message, channel, zlevels) /proc/AnnounceArrivalSimple(var/name, var/rank = "visitor", var/join_message = "will arrive at the station shortly", var/channel = "Common", var/list/zlevels) +<<<<<<< HEAD global_announcer.autosay("[name], [rank], [join_message].", "Arrivals Announcement Computer", channel, zlevels) +======= + global_announcer.autosay("[name], [rank], [join_message].", "Arrivals Announcement Computer", channel, zlevels) +>>>>>>> e92ed43... Merge pull request #6990 from VOREStation/pol-tcomupdate diff --git a/code/game/machinery/telecomms/broadcaster.dm b/code/game/machinery/telecomms/broadcaster.dm index 9a9ec69278..4334bc9e89 100644 --- a/code/game/machinery/telecomms/broadcaster.dm +++ b/code/game/machinery/telecomms/broadcaster.dm @@ -87,7 +87,10 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept signal.data["realname"], signal.data["vname"], DATA_NORMAL, signal.data["compression"], signal.data["level"], signal.frequency, signal.data["verb"], forced_radios) +<<<<<<< HEAD +======= +>>>>>>> e92ed43... Merge pull request #6990 from VOREStation/pol-tcomupdate /** #### - Simple Broadcast - #### **/ @@ -345,7 +348,10 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept var/list/message_pieces, var/name, var/job, var/realname, var/vname, var/data, var/compression, var/list/level, var/freq, var/verbage = "says", var/list/forced_radios) +<<<<<<< HEAD +======= +>>>>>>> e92ed43... Merge pull request #6990 from VOREStation/pol-tcomupdate /* ###### Prepare the radio connection ###### */ @@ -355,7 +361,11 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept for(var/obj/item/device/radio/R in forced_radios) //Cursory check to ensure they are 'on' and stuff +<<<<<<< HEAD if(R.receive_range(display_freq, list(0)) > -1) +======= + if(R.receive_range(display_freq, list(0))) +>>>>>>> e92ed43... Merge pull request #6990 from VOREStation/pol-tcomupdate radios |= R // --- Broadcast only to intercom devices --- diff --git a/code/game/machinery/telecomms/machine_interactions.dm b/code/game/machinery/telecomms/machine_interactions.dm index d1449882af..f4afda41d5 100644 --- a/code/game/machinery/telecomms/machine_interactions.dm +++ b/code/game/machinery/telecomms/machine_interactions.dm @@ -229,11 +229,19 @@ if(href_list["range_down"]) if(overmap_range > overmap_range_min) overmap_range-- +<<<<<<< HEAD update_idle_power_usage(initial(idle_power_usage)**(overmap_range+1)) if(href_list["range_up"]) if(overmap_range < overmap_range_max) overmap_range++ update_idle_power_usage(initial(idle_power_usage)**(overmap_range+1)) +======= + idle_power_usage = initial(idle_power_usage)**(overmap_range+1) + if(href_list["range_up"]) + if(overmap_range < overmap_range_max) + overmap_range++ + idle_power_usage = initial(idle_power_usage)**(overmap_range+1) +>>>>>>> e92ed43... Merge pull request #6990 from VOREStation/pol-tcomupdate // RECEIVER /obj/machinery/telecomms/receiver/Options_Menu() @@ -245,11 +253,19 @@ if(href_list["range_down"]) if(overmap_range > overmap_range_min) overmap_range-- +<<<<<<< HEAD update_idle_power_usage(initial(idle_power_usage)**(overmap_range+1)) if(href_list["range_up"]) if(overmap_range < overmap_range_max) overmap_range++ update_idle_power_usage(initial(idle_power_usage)**(overmap_range+1)) +======= + idle_power_usage = initial(idle_power_usage)**(overmap_range+1) + if(href_list["range_up"]) + if(overmap_range < overmap_range_max) + overmap_range++ + idle_power_usage = initial(idle_power_usage)**(overmap_range+1) +>>>>>>> e92ed43... Merge pull request #6990 from VOREStation/pol-tcomupdate /obj/machinery/telecomms/Topic(href, href_list) diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm index 65ab5023c7..38223d0a2c 100644 --- a/code/game/objects/items/devices/radio/radio.dm +++ b/code/game/objects/items/devices/radio/radio.dm @@ -287,7 +287,11 @@ var/global/list/default_medbay_channels = list( /obj/item/device/radio/proc/autosay(var/message, var/from, var/channel, var/list/zlevels) //BS12 EDIT var/datum/radio_frequency/connection = null if(channel && channels && channels.len > 0) +<<<<<<< HEAD if (channel == "department") +======= + if(channel == "department") +>>>>>>> e92ed43... Merge pull request #6990 from VOREStation/pol-tcomupdate channel = channels[1] connection = secure_radio_connections[channel] else @@ -304,7 +308,11 @@ var/global/list/default_medbay_channels = list( Broadcast_Message(connection, A, 0, "*garbled automated announcement*", src, message_to_multilingual(message), from, "Automated Announcement", from, "synthesized voice", +<<<<<<< HEAD 4, 0, zlevels, connection.frequency, "states") +======= + DATA_FAKE, 0, zlevels, connection.frequency, "states") +>>>>>>> e92ed43... Merge pull request #6990 from VOREStation/pol-tcomupdate // Interprets the message mode when talking into a radio, possibly returning a connection datum /obj/item/device/radio/proc/handle_message_mode(mob/living/M as mob, list/message_pieces, message_mode) @@ -363,8 +371,12 @@ var/global/list/default_medbay_channels = list( if(!istype(message_mode, /datum/radio_frequency)) return FALSE - var/datum/radio_frequency/connection = message_mode var/pos_z = get_z(src) + var/datum/radio_frequency/connection = message_mode +<<<<<<< HEAD + var/pos_z = get_z(src) +======= +>>>>>>> e92ed43... Merge pull request #6990 from VOREStation/pol-tcomupdate //#### Tagging the signal with all appropriate identity values ####// @@ -425,7 +437,11 @@ var/global/list/default_medbay_channels = list( "name" = displayname, // the mob's display name "job" = jobname, // the mob's job "key" = mobkey, // the mob's key +<<<<<<< HEAD "vmessage" = message_to_multilingual(pick(M.speak_emote)), // the message to display if the voice wasn't understood +======= + "vmessage" = pick(M.speak_emote), // the message to display if the voice wasn't understood +>>>>>>> e92ed43... Merge pull request #6990 from VOREStation/pol-tcomupdate "vname" = M.voice_name, // the name to display if the voice wasn't understood "vmask" = voicemask, // 1 if the mob is using a voice gas mask @@ -477,9 +493,13 @@ var/global/list/default_medbay_channels = list( // First, we want to generate a new radio signal signal.transmission_method = TRANSMISSION_SUBSPACE +<<<<<<< HEAD //#### Sending the signal to all subspace receivers ####// +======= +>>>>>>> e92ed43... Merge pull request #6990 from VOREStation/pol-tcomupdate + //#### Sending the signal to all subspace receivers ####// for(var/obj/machinery/telecomms/receiver/R in telecomms_list) R.receive_signal(signal) @@ -494,6 +514,7 @@ var/global/list/default_medbay_channels = list( else if(adhoc_fallback) //Less huzzah, we have to fallback to_chat(loc, "\The [src] pings as it falls back to local radio transmission.") subspace_transmission = FALSE +<<<<<<< HEAD else //Oh well return FALSE @@ -508,6 +529,22 @@ var/global/list/default_medbay_channels = list( signal.transmission_method = TRANSMISSION_SUBSPACE signal.data["compression"] = 0 +======= + + else //Oh well + return FALSE + + /* ###### Intercoms and station-bounced radios ###### */ + else + /* --- Intercoms can only broadcast to other intercoms, but bounced radios can broadcast to bounced radios and intercoms --- */ + if(istype(src, /obj/item/device/radio/intercom)) + filter_type = DATA_INTERCOM + + /* --- Try to send a normal subspace broadcast first */ + signal.transmission_method = TRANSMISSION_SUBSPACE + signal.data["compression"] = 0 + +>>>>>>> e92ed43... Merge pull request #6990 from VOREStation/pol-tcomupdate for(var/obj/machinery/telecomms/receiver/R in telecomms_list) R.receive_signal(signal) @@ -536,8 +573,11 @@ var/global/list/default_medbay_channels = list( if(get_dist(src, M) <= canhear_range) talk_into(M, message_pieces, null, verb) +<<<<<<< HEAD +======= +>>>>>>> e92ed43... Merge pull request #6990 from VOREStation/pol-tcomupdate /obj/item/device/radio/proc/receive_range(freq, level) // check if this radio can receive on the given frequency, and if so, // what the range is in which mobs will hear the radio diff --git a/code/game/objects/items/devices/radio/radiopack.dm b/code/game/objects/items/devices/radio/radiopack.dm index 8f2e849320..9bac512543 100644 --- a/code/game/objects/items/devices/radio/radiopack.dm +++ b/code/game/objects/items/devices/radio/radiopack.dm @@ -132,6 +132,7 @@ return -1 if(!listening) return -1 +<<<<<<< HEAD if(!on) return -1 if(!freq) @@ -142,3 +143,24 @@ return canhear_range else return -1 +======= + if(is_jammed(src)) + return -1 + if (!on) + return -1 + if (!freq) //recieved on main frequency + if (!listening) + return -1 + else + var/accept = (freq==frequency && listening) + if (!accept) + for (var/ch_name in channels) + var/datum/radio_frequency/RF = secure_radio_connections[ch_name] + if (RF && RF.frequency==freq && (channels[ch_name]&FREQ_LISTENING)) + accept = 1 + break + if (!accept) + return -1 + + return canhear_range +>>>>>>> e92ed43... Merge pull request #6990 from VOREStation/pol-tcomupdate diff --git a/code/modules/alarm/atmosphere_alarm.dm b/code/modules/alarm/atmosphere_alarm.dm index f19044a6b7..cd45d25386 100644 --- a/code/modules/alarm/atmosphere_alarm.dm +++ b/code/modules/alarm/atmosphere_alarm.dm @@ -5,7 +5,11 @@ var/list/major_alarms = new() var/list/map_levels = using_map.get_map_levels(z) for(var/datum/alarm/A in visible_alarms()) +<<<<<<< HEAD if(z && (z && !(A.origin?.z in map_levels))) +======= + if(z && !(A.origin?.z in map_levels)) +>>>>>>> e92ed43... Merge pull request #6990 from VOREStation/pol-tcomupdate continue if(A.max_severity() > 1) major_alarms.Add(A) @@ -15,7 +19,11 @@ var/list/minor_alarms = new() var/list/map_levels = using_map.get_map_levels(z) for(var/datum/alarm/A in visible_alarms()) +<<<<<<< HEAD if(z && (z && !(A.origin?.z in map_levels))) +======= + if(z && !(A.origin?.z in map_levels)) +>>>>>>> e92ed43... Merge pull request #6990 from VOREStation/pol-tcomupdate continue if(A.max_severity() == 1) minor_alarms.Add(A) diff --git a/code/modules/mob/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm index 8677e8f880..c619369682 100644 --- a/code/modules/mob/new_player/new_player.dm +++ b/code/modules/mob/new_player/new_player.dm @@ -377,7 +377,11 @@ var/turf/T = join_props["turf"] var/join_message = join_props["msg"] +<<<<<<< HEAD var/announce_channel = join_props["channel"] || "Common" // VOREStation Add +======= + var/announce_channel = join_props["channel"] || "Common" +>>>>>>> e92ed43... Merge pull request #6990 from VOREStation/pol-tcomupdate if(!T || !join_message) return 0 diff --git a/code/modules/modular_computers/file_system/programs/engineering/alarm_monitor.dm b/code/modules/modular_computers/file_system/programs/engineering/alarm_monitor.dm index 8c03238bff..367f536137 100644 --- a/code/modules/modular_computers/file_system/programs/engineering/alarm_monitor.dm +++ b/code/modules/modular_computers/file_system/programs/engineering/alarm_monitor.dm @@ -111,7 +111,11 @@ var/z = get_z(nano_host()) for(var/datum/alarm_handler/AH in alarm_handlers) categories[++categories.len] = list("category" = AH.category, "alarms" = list()) +<<<<<<< HEAD for(var/datum/alarm/A in AH.visible_alarms(z)) +======= + for(var/datum/alarm/A in AH.major_alarms(z)) +>>>>>>> e92ed43... Merge pull request #6990 from VOREStation/pol-tcomupdate var/cameras[0] var/lost_sources[0] diff --git a/code/modules/modular_computers/file_system/programs/medical/suit_sensors.dm b/code/modules/modular_computers/file_system/programs/medical/suit_sensors.dm index 2b25951926..7b2c3ed3da 100644 --- a/code/modules/modular_computers/file_system/programs/medical/suit_sensors.dm +++ b/code/modules/modular_computers/file_system/programs/medical/suit_sensors.dm @@ -44,9 +44,13 @@ if(!data["map_levels"].len) to_chat(user, "The crew monitor doesn't seem like it'll work here.") +<<<<<<< HEAD if(program) program.kill_program() else if(ui) +======= + if(ui) +>>>>>>> e92ed43... Merge pull request #6990 from VOREStation/pol-tcomupdate ui.close() return diff --git a/icons/mob/back.dmi b/icons/mob/back.dmi index 99f3f4fd4c9c5ab0912ef0cc17fe54270164246e..5555d0e1adec3814686d5cb88905f5bd62e65347 100644 GIT binary patch delta 18889 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 delta 18271 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 e92ed43... Merge pull request #6990 from VOREStation/pol-tcomupdate //Just the sector we're in if(om_range == -1) @@ -192,9 +197,15 @@ var/list/all_maps = list() //If in station levels, return station levels else if (srcz in station_levels) return station_levels.Copy() +<<<<<<< HEAD //Anything in multiz then (or just themselves) else return GetConnectedZlevels(srcz) +======= + //Just give them back their zlevel + else + return list(srcz) +>>>>>>> e92ed43... Merge pull request #6990 from VOREStation/pol-tcomupdate /datum/map/proc/get_zlevel_name(var/index) var/datum/map_z_level/Z = zlevels["[index]"] diff --git a/vorestation.dme b/vorestation.dme index ec81d482c9..ca15d2235e 100644 --- a/vorestation.dme +++ b/vorestation.dme @@ -1132,7 +1132,10 @@ #include "code\game\objects\items\devices\radio\jammer.dm" #include "code\game\objects\items\devices\radio\jammer_vr.dm" #include "code\game\objects\items\devices\radio\radio.dm" +<<<<<<< HEAD:vorestation.dme #include "code\game\objects\items\devices\radio\radio_vr.dm" +======= +>>>>>>> e92ed43... Merge pull request #6990 from VOREStation/pol-tcomupdate:polaris.dme #include "code\game\objects\items\devices\radio\radiopack.dm" #include "code\game\objects\items\robot\robot_items.dm" #include "code\game\objects\items\robot\robot_parts.dm" @@ -2912,8 +2915,11 @@ #include "code\modules\organs\subtypes\vox.dm" #include "code\modules\organs\subtypes\vox_vr.dm" #include "code\modules\organs\subtypes\xenos.dm" +<<<<<<< HEAD:vorestation.dme #include "code\modules\overmap\bluespace_rift_vr.dm" #include "code\modules\overmap\champagne.dm" +======= +>>>>>>> e92ed43... Merge pull request #6990 from VOREStation/pol-tcomupdate:polaris.dme #include "code\modules\overmap\helpers.dm" #include "code\modules\overmap\overmap_object.dm" #include "code\modules\overmap\overmap_shuttle.dm"