From f721e13ebcc2b8fcbf768edb5180f1960c84d46c Mon Sep 17 00:00:00 2001 From: Robertha89 Date: Fri, 25 Dec 2015 01:50:34 +0100 Subject: [PATCH 01/53] Prevents people from murdering people playing the Battle arcade Reduces sound range for 12 to 3 --- code/game/machinery/computer/arcade.dm | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/code/game/machinery/computer/arcade.dm b/code/game/machinery/computer/arcade.dm index fa58b9526fc..5e4554e4c17 100644 --- a/code/game/machinery/computer/arcade.dm +++ b/code/game/machinery/computer/arcade.dm @@ -154,7 +154,7 @@ src.blocked = 1 var/attackamt = rand(2,6) src.temp = "You attack for [attackamt] damage!" - playsound(src.loc, 'sound/arcade/Hit.ogg', 50, 1, extrarange = -3, falloff = 10) + playsound(src.loc, 'sound/arcade/Hit.ogg', 50, 1, extrarange = -6, falloff = 10) src.updateUsrDialog() if(turtle > 0) turtle-- @@ -168,7 +168,7 @@ var/pointamt = rand(1,3) var/healamt = rand(6,8) src.temp = "You use [pointamt] magic to heal for [healamt] damage!" - playsound(src.loc, 'sound/arcade/Heal.ogg', 50, 1, extrarange = -3, falloff = 10) + playsound(src.loc, 'sound/arcade/Heal.ogg', 50, 1, extrarange = -6, falloff = 10) src.updateUsrDialog() turtle++ @@ -183,7 +183,7 @@ src.blocked = 1 var/chargeamt = rand(4,7) src.temp = "You regain [chargeamt] points" - playsound(src.loc, 'sound/arcade/Mana.ogg', 50, 1, extrarange = -3, falloff = 10) + playsound(src.loc, 'sound/arcade/Mana.ogg', 50, 1, extrarange = -6, falloff = 10) src.player_mp += chargeamt if(turtle > 0) turtle-- @@ -218,7 +218,7 @@ if(!gameover) src.gameover = 1 src.temp = "[src.enemy_name] has fallen! Rejoice!" - playsound(src.loc, 'sound/arcade/Win.ogg', 50, 1, extrarange = -3, falloff = 10) + playsound(src.loc, 'sound/arcade/Win.ogg', 50, 1, extrarange = -6, falloff = 10) if(emagged) feedback_inc("arcade_win_emagged") @@ -235,13 +235,13 @@ else if (emagged && (turtle >= 4)) var/boomamt = rand(5,10) src.temp = "[src.enemy_name] throws a bomb, exploding you for [boomamt] damage!" - playsound(src.loc, 'sound/arcade/Boom.ogg', 50, 1, extrarange = -3, falloff = 10) + playsound(src.loc, 'sound/arcade/Boom.ogg', 50, 1, extrarange = -6, falloff = 10) src.player_hp -= boomamt else if ((src.enemy_mp <= 5) && (prob(70))) var/stealamt = rand(2,3) src.temp = "[src.enemy_name] steals [stealamt] of your power!" - playsound(src.loc, 'sound/arcade/Steal.ogg', 50, 1, extrarange = -3, falloff = 10) + playsound(src.loc, 'sound/arcade/Steal.ogg', 50, 1, extrarange = -6, falloff = 10) src.player_mp -= stealamt src.updateUsrDialog() @@ -249,7 +249,7 @@ src.gameover = 1 sleep(10) src.temp = "You have been drained! GAME OVER" - playsound(src.loc, 'sound/arcade/Lose.ogg', 50, 1, extrarange = -3, falloff = 10) + playsound(src.loc, 'sound/arcade/Lose.ogg', 50, 1, extrarange = -6, falloff = 10) if(emagged) feedback_inc("arcade_loss_mana_emagged") usr.gib() @@ -258,20 +258,20 @@ else if ((src.enemy_hp <= 10) && (src.enemy_mp > 4)) src.temp = "[src.enemy_name] heals for 4 health!" - playsound(src.loc, 'sound/arcade/Heal.ogg', 50, 1, extrarange = -3, falloff = 10) + playsound(src.loc, 'sound/arcade/Heal.ogg', 50, 1, extrarange = -6, falloff = 10) src.enemy_hp += 4 src.enemy_mp -= 4 else var/attackamt = rand(3,6) src.temp = "[src.enemy_name] attacks for [attackamt] damage!" - playsound(src.loc, 'sound/arcade/Hit.ogg', 50, 1, extrarange = -3, falloff = 10) + playsound(src.loc, 'sound/arcade/Hit.ogg', 50, 1, extrarange = -6, falloff = 10) src.player_hp -= attackamt if ((src.player_mp <= 0) || (src.player_hp <= 0)) src.gameover = 1 src.temp = "You have been crushed! GAME OVER" - playsound(src.loc, 'sound/arcade/Lose.ogg', 50, 1, extrarange = -3, falloff = 10) + playsound(src.loc, 'sound/arcade/Lose.ogg', 50, 1, extrarange = -6, falloff = 10) if(emagged) feedback_inc("arcade_loss_hp_emagged") usr.gib() @@ -1071,4 +1071,4 @@ #undef ORION_TRAIL_MALFUNCTION #undef ORION_TRAIL_COLLISION #undef ORION_TRAIL_SPACEPORT -#undef ORION_TRAIL_BLACKHOLE \ No newline at end of file +#undef ORION_TRAIL_BLACKHOLE From 06e06b614f13ab3dd7199a9d40108de7276161ee Mon Sep 17 00:00:00 2001 From: monster860 Date: Fri, 25 Dec 2015 12:08:35 -0500 Subject: [PATCH 02/53] Changed Traffic Control to use POST for NTSL code --- code/game/machinery/telecomms/traffic_control.dm | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/code/game/machinery/telecomms/traffic_control.dm b/code/game/machinery/telecomms/traffic_control.dm index d484fd144fd..f110d740b63 100644 --- a/code/game/machinery/telecomms/traffic_control.dm +++ b/code/game/machinery/telecomms/traffic_control.dm @@ -116,7 +116,8 @@ function compileCode() { var codeText = cMirror_fSubmit.getValue(); - window.location = "byond://?src=\ref[src];choice=Compile;cMirror=" + encodeURIComponent(codeText); + document.getElementById("cMirrorPost").value = codeText; + document.getElementById("theform").submit(); } function clearCode() { @@ -129,6 +130,12 @@
[compiling_errors]
+ +
+ + + +
"} else dat += {"
[temp]
From 4133e98dfeb3327ae636889612422d7246c0aac8 Mon Sep 17 00:00:00 2001 From: Crazylemon Date: Fri, 25 Dec 2015 22:51:02 -0800 Subject: [PATCH 03/53] Port of RemieRichard's infinite antag system This is just the first chunk, of fixing around the be_special flag stuff It will probably break everything as-is --- code/__DEFINES/preferences.dm | 17 ---- code/__DEFINES/role_preferences.dm | 54 +++++++++++++ code/__HELPERS/game.dm | 8 +- code/_globalvars/configuration.dm | 19 ----- code/datums/mind.dm | 14 ++-- .../game/gamemodes/autotraitor/autotraitor.dm | 8 +- code/game/gamemodes/blob/blob.dm | 2 +- code/game/gamemodes/game_mode.dm | 55 +------------ .../game/gamemodes/malfunction/malfunction.dm | 2 +- code/game/jobs/job_controller.dm | 2 +- code/modules/admin/verbs/one_click_antag.dm | 34 ++++---- code/modules/admin/verbs/randomverbs.dm | 2 +- code/modules/hydroponics/seed_mobs.dm | 78 +------------------ .../modules/mob/living/silicon/pai/recruit.dm | 6 +- .../mob/living/silicon/robot/drone/drone.dm | 2 +- .../modules/mob/living/simple_animal/borer.dm | 2 +- paradise.dme | 1 + 17 files changed, 99 insertions(+), 207 deletions(-) create mode 100644 code/__DEFINES/role_preferences.dm diff --git a/code/__DEFINES/preferences.dm b/code/__DEFINES/preferences.dm index 1f170276c8f..1753045cb8c 100644 --- a/code/__DEFINES/preferences.dm +++ b/code/__DEFINES/preferences.dm @@ -26,20 +26,3 @@ #define MEMBER_PUBLIC 8192 #define TOGGLES_DEFAULT (CHAT_OOC|CHAT_DEAD|CHAT_GHOSTEARS|CHAT_GHOSTSIGHT|CHAT_PRAYER|CHAT_RADIO|CHAT_ATTACKLOGS|CHAT_LOOC|MEMBER_PUBLIC) - -#define BE_TRAITOR 1 -#define BE_OPERATIVE 2 -#define BE_CHANGELING 4 -#define BE_WIZARD 8 -#define BE_MALF 16 -#define BE_REV 32 -#define BE_ALIEN 64 -#define BE_PAI 128 -#define BE_CULTIST 256 -#define BE_NINJA 512 -#define BE_RAIDER 1024 -#define BE_VAMPIRE 2048 -#define BE_MUTINEER 4096 -#define BE_BLOB 8192 -#define BE_SHADOWLING 16384 -#define BE_REVENANT 32768 \ No newline at end of file diff --git a/code/__DEFINES/role_preferences.dm b/code/__DEFINES/role_preferences.dm new file mode 100644 index 00000000000..50c52f107bc --- /dev/null +++ b/code/__DEFINES/role_preferences.dm @@ -0,0 +1,54 @@ + + +//Values for antag preferences, event roles, etc. unified here + + + +//These are synced with the Database, if you change the values of the defines +//then you MUST update the database! +#define ROLE_TRAITOR "traitor" +#define ROLE_OPERATIVE "operative" +#define ROLE_CHANGELING "changeling" +#define ROLE_WIZARD "wizard" +#define ROLE_MALF "malf AI" +#define ROLE_REV "revolutionary" +#define ROLE_ALIEN "xenomorph" +#define ROLE_PAI "pAI" +#define ROLE_CULTIST "cultist" +#define ROLE_BLOB "blob" +#define ROLE_NINJA "space ninja" +#define ROLE_MONKEY "monkey" +#define ROLE_GANG "gangster" +#define ROLE_SHADOWLING "shadowling" +#define ROLE_ABDUCTOR "abductor" +#define ROLE_REVENANT "revenant" +#define ROLE_HOG_GOD "hand of god: god" // We're prolly gonna port this one day or another +#define ROLE_HOG_CULTIST "hand of god: cultist" +#define ROLE_RAIDER "vox raider" +#define ROLE_VAMPIRE "vampire" + + +//Missing assignment means it's not a gamemode specific role, IT'S NOT A BUG OR ERROR. +//The gamemode specific ones are just so the gamemodes can query whether a player is old enough +//(in game days played) to play that role +var/global/list/special_roles = list( + ROLE_TRAITOR = /datum/game_mode/traitor, + ROLE_OPERATIVE = /datum/game_mode/nuclear, + ROLE_CHANGELING = /datum/game_mode/changeling, + ROLE_WIZARD = /datum/game_mode/wizard, + ROLE_MALF = /datum/game_mode/malfunction, + ROLE_REV = /datum/game_mode/revolution, + ROLE_ALIEN, + ROLE_PAI, + ROLE_CULTIST = /datum/game_mode/cult, + ROLE_BLOB = /datum/game_mode/blob, + ROLE_NINJA, + ROLE_MONKEY = /datum/game_mode/monkey, + ROLE_GANG = /datum/game_mode/gang, + ROLE_SHADOWLING = /datum/game_mode/shadowling, + ROLE_ABDUCTOR = /datum/game_mode/abduction, + ROLE_HOG_GOD = /datum/game_mode/hand_of_god, + ROLE_HOG_CULTIST = /datum/game_mode/hand_of_god, + ROLE_RAIDER = /datum/game_mode/heist, + ROLE_VAMPIRE = /datum/game_mode/vampire, +) diff --git a/code/__HELPERS/game.dm b/code/__HELPERS/game.dm index 0d51ed39ec1..f821b19e665 100644 --- a/code/__HELPERS/game.dm +++ b/code/__HELPERS/game.dm @@ -290,17 +290,17 @@ proc/isInSight(var/atom/A, var/atom/B) return M return null -/proc/get_candidates(be_special_flag=0, afk_bracket=3000, override_age=0, override_jobban=0) - var/roletext = get_roletext(be_special_flag) +/proc/get_candidates(be_special_type, afk_bracket=3000, override_age=0, override_jobban=0) + var/roletext = get_roletext(be_special_type) var/list/candidates = list() // Keep looping until we find a non-afk candidate within the time bracket (we limit the bracket to 10 minutes (6000)) while(!candidates.len && afk_bracket < 6000) for(var/mob/dead/observer/G in player_list) if(G.client != null) if(!(G.mind && G.mind.current && G.mind.current.stat != DEAD)) - if(!G.client.is_afk(afk_bracket) && (G.client.prefs.be_special & be_special_flag)) + if(!G.client.is_afk(afk_bracket) && (be_special_type in G.client.prefs.be_special)) if(!override_jobban || (!jobban_isbanned(G, roletext) && !jobban_isbanned(G,"Syndicate"))) - if(override_age || player_old_enough_antag(G.client,be_special_flag)) + if(override_age || player_old_enough_antag(G.client,be_special_type)) candidates += G.client afk_bracket += 600 // Add a minute to the bracket, for every attempt diff --git a/code/_globalvars/configuration.dm b/code/_globalvars/configuration.dm index 61bfd723241..4cfa038cd1e 100644 --- a/code/_globalvars/configuration.dm +++ b/code/_globalvars/configuration.dm @@ -31,25 +31,6 @@ var/MAX_EX_LIGHT_RANGE = 14 var/MAX_EX_FLASH_RANGE = 14 var/MAX_EX_FLAME_RANGE = 14 -var/list/be_special_flags = list( - "traitor" = BE_TRAITOR, - "operative" = BE_OPERATIVE, - "changeling" = BE_CHANGELING, - "wizard" = BE_WIZARD, - "malf AI" = BE_MALF, - "revolutionary" = BE_REV, - "alien" = BE_ALIEN, - "pAI" = BE_PAI, - "cultist" = BE_CULTIST, - "ninja" = BE_NINJA, - "raider" = BE_RAIDER, - "vampire" = BE_VAMPIRE, - "mutineer" = BE_MUTINEER, - "blob" = BE_BLOB, - "shadowling" = BE_SHADOWLING, - "revenant" = BE_REVENANT -) - //Random event stuff, apparently used var/eventchance = 10 //% per 5 mins var/event = 0 diff --git a/code/datums/mind.dm b/code/datums/mind.dm index 712c1b41e1c..860ebdd01b9 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -180,7 +180,7 @@ else text += "EMPLOYEE|headrev|rev" - if(current && current.client && current.client.prefs.be_special & BE_REV) + if(current && current.client && (ROLE_REV in current.client.prefs.be_special)) text += "|Enabled in Prefs" else text += "|Disabled in Prefs" @@ -205,7 +205,7 @@ text += "EMPLOYEE|cultist" - if(current && current.client && current.client.prefs.be_special & BE_CULTIST) + if(current && current.client && (ROLE_CULTIST in current.client.prefs.be_special)) text += "|Enabled in Prefs" else text += "|Disabled in Prefs" @@ -225,7 +225,7 @@ else text += "yes|NO" - if(current && current.client && current.client.prefs.be_special & BE_WIZARD) + if(current && current.client && (ROLE_WIZARD in current.client.prefs.be_special)) text += "|Enabled in Prefs" else text += "|Disabled in Prefs" @@ -246,7 +246,7 @@ else text += "yes|NO" - if(current && current.client && current.client.prefs.be_special & BE_CHANGELING) + if(current && current.client && (ROLE_CHANGELING in current.client.prefs.be_special)) text += "|Enabled in Prefs" else text += "|Disabled in Prefs" @@ -294,7 +294,7 @@ else text += "operative|NANOTRASEN" - if(current && current.client && current.client.prefs.be_special & BE_OPERATIVE) + if(current && current.client && (ROLE_OPERATIVE in current.client.prefs.be_special)) text += "|Enabled in Prefs" else text += "|Disabled in Prefs" @@ -316,7 +316,7 @@ else text += "traitor|EMPLOYEE" - if(current && current.client && current.client.prefs.be_special & BE_TRAITOR) + if(current && current.client && (ROLE_TRAITOR in current.client.prefs.be_special)) text += "|Enabled in Prefs" else text += "|Disabled in Prefs" @@ -335,7 +335,7 @@ else text += "shadowling|thrall|HUMAN" - if(current && current.client && current.client.prefs.be_special & BE_SHADOWLING) + if(current && current.client && (ROLE_SHADOWLING in current.client.prefs.be_special)) text += "|Enabled in Prefs" else text += "|Disabled in Prefs" diff --git a/code/game/gamemodes/autotraitor/autotraitor.dm b/code/game/gamemodes/autotraitor/autotraitor.dm index 8a9e9cc54b2..551d1a8e9b9 100644 --- a/code/game/gamemodes/autotraitor/autotraitor.dm +++ b/code/game/gamemodes/autotraitor/autotraitor.dm @@ -76,13 +76,13 @@ var/traitorcount = 0 var/possible_traitors[0] for(var/mob/living/player in mob_list) - if (player.client && player.stat != 2) + if (player.client && player.stat != DEAD) playercount += 1 - if (player.client && player.mind && player.mind.special_role && player.stat != 2) + if (player.client && player.mind && player.mind.special_role && player.stat != DEAD) traitorcount += 1 - if (player.client && player.mind && !player.mind.special_role && player.stat != 2) + if (player.client && player.mind && !player.mind.special_role && player.stat != DEAD) if (ishuman(player) || isrobot(player) || isAI(player)) - if (player.client && player.client.prefs.be_special & BE_TRAITOR && !jobban_isbanned(player, "traitor") && !jobban_isbanned(player, "Syndicate")) + if (player.client && (ROLE_TRAITOR in player.client.prefs.be_special) && !jobban_isbanned(player, "traitor") && !jobban_isbanned(player, "Syndicate")) possible_traitors += player.mind for(var/datum/mind/player in possible_traitors) for(var/job in restricted_jobs) diff --git a/code/game/gamemodes/blob/blob.dm b/code/game/gamemodes/blob/blob.dm index 1cbd8dd7a1e..ed1f5a5ffbd 100644 --- a/code/game/gamemodes/blob/blob.dm +++ b/code/game/gamemodes/blob/blob.dm @@ -58,7 +58,7 @@ var/list/blob_nodes = list() /datum/game_mode/blob/proc/get_blob_candidates() var/list/candidates = list() for(var/mob/living/carbon/human/player in player_list) - if(!player.stat && player.mind && !player.mind.special_role && !jobban_isbanned(player, "Syndicate") && (player.client.prefs.be_special & BE_BLOB)) + if(!player.stat && player.mind && !player.mind.special_role && !jobban_isbanned(player, "Syndicate") && (ROLE_BLOB in player.client.prefs.be_special)) candidates += player return candidates diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm index 244ae984ac8..54591061d33 100644 --- a/code/game/gamemodes/game_mode.dm +++ b/code/game/gamemodes/game_mode.dm @@ -254,7 +254,7 @@ // Get a list of all the people who want to be the antagonist for this round, except those with incompatible species for(var/mob/new_player/player in players) - if(player.client.prefs.be_special & role && !(player.client.prefs.species in protected_species)) + if((role in player.client.prefs.be_special) && !(player.client.prefs.species in protected_species)) log_debug("[player.key] had [roletext] enabled, so we are drafting them.") candidates += player.mind players -= player @@ -276,57 +276,6 @@ if(player.assigned_role == job) candidates -= player - /*if(candidates.len < recommended_enemies) - for(var/mob/new_player/player in players) - if(player.client && player.ready) - if(!(player.client.prefs.be_special & role)) // We don't have enough people who want to be antagonist, make a seperate list of people who don't want to be one - if(!jobban_isbanned(player, "Syndicate") && !jobban_isbanned(player, roletext)) //Nodrak/Carn: Antag Job-bans - drafted += player.mind - - if(restricted_jobs) - for(var/datum/mind/player in drafted) // Remove people who can't be an antagonist - for(var/job in restricted_jobs) - if(player.assigned_role == job) - drafted -= player - - drafted = shuffle(drafted) // Will hopefully increase randomness, Donkie - - while(candidates.len < recommended_enemies) // Pick randomlly just the number of people we need and add them to our list of candidates - if(drafted.len > 0) - applicant = pick(drafted) - if(applicant) - candidates += applicant - log_debug("[applicant.key] was force-drafted as [roletext], because there aren't enough candidates.") - drafted.Remove(applicant) - - else // Not enough scrubs, ABORT ABORT ABORT - break - - if(candidates.len < recommended_enemies && override_jobbans) //If we still don't have enough people, we're going to start drafting banned people. - for(var/mob/new_player/player in players) - if (player.client && player.ready) - if(jobban_isbanned(player, "Syndicate") || jobban_isbanned(player, roletext)) //Nodrak/Carn: Antag Job-bans - drafted += player.mind - - if(restricted_jobs) - for(var/datum/mind/player in drafted) // Remove people who can't be an antagonist - for(var/job in restricted_jobs) - if(player.assigned_role == job) - drafted -= player - - drafted = shuffle(drafted) // Will hopefully increase randomness, Donkie - - while(candidates.len < recommended_enemies) // Pick randomlly just the number of people we need and add them to our list of candidates - if(drafted.len > 0) - applicant = pick(drafted) - if(applicant) - candidates += applicant - drafted.Remove(applicant) - log_debug("[applicant.key] was force-drafted as [roletext], because there aren't enough candidates.") - - else // Not enough scrubs, ABORT ABORT ABORT - break - */ return candidates // Returns: The number of people who had the antagonist role set to yes, regardless of recomended_enemies, if that number is greater than recommended_enemies // recommended_enemies if the number of people with that role set to yes is less than recomended_enemies, @@ -336,7 +285,7 @@ /datum/game_mode/proc/latespawn(var/mob) /* -/datum/game_mode/proc/check_player_role_pref(var/role, var/mob/new_player/player) +/datum/game_mode/proc/check_player_role_pref(var/role, var/mob/player) if(player.preferences.be_special & role) return 1 return 0 diff --git a/code/game/gamemodes/malfunction/malfunction.dm b/code/game/gamemodes/malfunction/malfunction.dm index f206fee3591..476c4585236 100644 --- a/code/game/gamemodes/malfunction/malfunction.dm +++ b/code/game/gamemodes/malfunction/malfunction.dm @@ -31,7 +31,7 @@ var/datum/job/ai/DummyAIjob = new for(var/mob/new_player/player in player_list) if(player.client && player.ready) - if(player.client.prefs.be_special & BE_MALF) + if(ROLE_MALF in player.client.prefs.be_special) if(!jobban_isbanned(player, "Syndicate") && !jobban_isbanned(player, "AI") && !jobban_isbanned(player, roletext) && DummyAIjob.player_old_enough(player.client)) if(player_old_enough_antag(player.client,role)) antag_candidates += player.mind diff --git a/code/game/jobs/job_controller.dm b/code/game/jobs/job_controller.dm index 9a34e2e1524..f25fd419da8 100644 --- a/code/game/jobs/job_controller.dm +++ b/code/game/jobs/job_controller.dm @@ -94,7 +94,7 @@ var/global/datum/controller/occupations/job_master if(!job.player_old_enough(player.client)) Debug("FOC player not old enough, Player: [player]") continue - if(flag && (!player.client.prefs.be_special & flag)) + if(flag && (!(flag in player.client.prefs.be_special)) Debug("FOC flag failed, Player: [player], Flag: [flag], ") continue if(player.mind && job.title in player.mind.restricted_roles) diff --git a/code/modules/admin/verbs/one_click_antag.dm b/code/modules/admin/verbs/one_click_antag.dm index ad25fab49ce..798dd02b85f 100644 --- a/code/modules/admin/verbs/one_click_antag.dm +++ b/code/modules/admin/verbs/one_click_antag.dm @@ -33,7 +33,7 @@ client/proc/one_click_antag() var/datum/mind/themind = null for(var/mob/living/silicon/ai/ai in player_list) - if(ai.client && ai.client.prefs.be_special & BE_MALF) + if(ai.client && (ROLE_MALF in ai.client.prefs.be_special)) AIs += ai if(AIs.len) @@ -57,8 +57,8 @@ client/proc/one_click_antag() var/mob/living/carbon/human/H = null for(var/mob/living/carbon/human/applicant in player_list) - if(applicant.client.prefs.be_special & BE_TRAITOR) - if(player_old_enough_antag(applicant.client,BE_TRAITOR)) + if(ROLE_TRAITOR in applicant.client.prefs.be_special) + if(player_old_enough_antag(applicant.client,ROLE_TRAITOR)) if(!applicant.stat) if(applicant.mind) if (!applicant.mind.special_role) @@ -91,8 +91,8 @@ client/proc/one_click_antag() var/mob/living/carbon/human/H = null for(var/mob/living/carbon/human/applicant in player_list) - if(applicant.client.prefs.be_special & BE_CHANGELING) - if(player_old_enough_antag(applicant.client,BE_CHANGELING)) + if(ROLE_CHANGELING in applicant.client.prefs.be_special) + if(player_old_enough_antag(applicant.client,ROLE_CHANGELING)) if(!applicant.stat) if(applicant.mind) if (!applicant.mind.special_role) @@ -123,8 +123,8 @@ client/proc/one_click_antag() var/mob/living/carbon/human/H = null for(var/mob/living/carbon/human/applicant in player_list) - if(applicant.client.prefs.be_special & BE_REV) - if(player_old_enough_antag(applicant.client,BE_REV)) + if(ROLE_REV in applicant.client.prefs.be_special) + if(player_old_enough_antag(applicant.client,ROLE_REV)) if(applicant.stat == CONSCIOUS) if(applicant.mind) if(!applicant.mind.special_role) @@ -150,9 +150,9 @@ client/proc/one_click_antag() var/time_passed = world.time for(var/mob/G in respawnable_list) - if(istype(G) && G.client && G.client.prefs.be_special & BE_WIZARD) + if(istype(G) && G.client && (ROLE_WIZARD in G.client.prefs.be_special)) if(!jobban_isbanned(G, "wizard") && !jobban_isbanned(G, "Syndicate")) - if(player_old_enough_antag(G.client,BE_WIZARD)) + if(player_old_enough_antag(G.client,ROLE_WIZARD)) spawn(0) switch(G.timed_alert("Do you wish to be considered for the position of Space Wizard Foundation 'diplomat'?","Please answer in 30 seconds!","No",300,"Yes","No"))//alert(G, "Do you wish to be considered for the position of Space Wizard Foundation 'diplomat'?","Please answer in 30 seconds!","Yes","No")) if("Yes") @@ -192,8 +192,8 @@ client/proc/one_click_antag() var/mob/living/carbon/human/H = null for(var/mob/living/carbon/human/applicant in player_list) - if(applicant.client.prefs.be_special & BE_CULTIST) - if(player_old_enough_antag(applicant.client,BE_CULTIST)) + if(ROLE_CULTIST in applicant.client.prefs.be_special) + if(player_old_enough_antag(applicant.client,ROLE_CULTIST)) if(applicant.stat == CONSCIOUS) if(applicant.mind) if(!applicant.mind.special_role) @@ -224,9 +224,9 @@ client/proc/one_click_antag() var/time_passed = world.time for(var/mob/G in respawnable_list) - if(istype(G) && G.client && G.client.prefs.be_special & BE_OPERATIVE) + if(istype(G) && G.client && (ROLE_OPERATIVE in G.client.prefs.be_special)) if(!jobban_isbanned(G, "operative") && !jobban_isbanned(G, "Syndicate")) - if(player_old_enough_antag(G.client,BE_OPERATIVE)) + if(player_old_enough_antag(G.client,ROLE_OPERATIVE)) spawn(0) switch(alert(G,"Do you wish to be considered for a nuke team being sent in?","Please answer in 30 seconds!","Yes","No")) if("Yes") @@ -442,8 +442,8 @@ client/proc/one_click_antag() //Generates a list of candidates from active ghosts. for(var/mob/G in respawnable_list) - if(istype(G) && G.client && G.client.prefs.be_special & BE_RAIDER) - if(player_old_enough_antag(G.client,BE_RAIDER)) + if(istype(G) && G.client && (ROLE_RAIDER in G.client.prefs.be_special)) + if(player_old_enough_antag(G.client,ROLE_RAIDER)) if(!jobban_isbanned(G, "raider") && !jobban_isbanned(G, "Syndicate")) spawn(0) switch(alert(G,"Do you wish to be considered for a vox raiding party arriving on the station?","Please answer in 30 seconds!","Yes","No")) @@ -543,8 +543,8 @@ client/proc/one_click_antag() var/mob/living/carbon/human/H = null for(var/mob/living/carbon/human/applicant in player_list) - if(applicant.client.prefs.be_special & BE_VAMPIRE) - if(player_old_enough_antag(applicant.client,BE_VAMPIRE)) + if(ROLE_VAMPIRE in applicant.client.prefs.be_special) + if(player_old_enough_antag(applicant.client,ROLE_VAMPIRE)) if(!applicant.stat) if(applicant.mind) if (!applicant.mind.special_role) diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm index 40d8bc80671..e428f25fc39 100644 --- a/code/modules/admin/verbs/randomverbs.dm +++ b/code/modules/admin/verbs/randomverbs.dm @@ -444,7 +444,7 @@ Traitors and the like can also be revived with the previous role mostly intact. var/list/candidates = list() for(var/mob/M in player_list) if(M.stat != DEAD) continue //we are not dead! - if(!M.client.prefs.be_special & BE_ALIEN) continue //we don't want to be an alium + if(!(ROLE_ALIEN in M.client.prefs.be_special)) continue //we don't want to be an alium if(jobban_isbanned(M, "alien") || jobban_isbanned(M, "Syndicate")) continue //we are jobbanned if(M.client.is_afk()) continue //we are afk if(M.mind && M.mind.current && M.mind.current.stat != DEAD) continue //we have a live body we are tied to diff --git a/code/modules/hydroponics/seed_mobs.dm b/code/modules/hydroponics/seed_mobs.dm index b7fd3b4fdfd..57579a3a797 100644 --- a/code/modules/hydroponics/seed_mobs.dm +++ b/code/modules/hydroponics/seed_mobs.dm @@ -2,80 +2,4 @@ var/list/currently_querying // Used to avoid asking the same ghost repeatedly. // The following procs are used to grab players for mobs produced by a seed (mostly for dionaea). -/datum/seed/proc/handle_living_product(var/mob/living/host) -/* - if(!host || !istype(host)) return - - spawn(0) - request_player(host) - if(istype(host,/mob/living/simple_animal)) - return - spawn(75) - if(!host.ckey && !host.client) - host.death() // This seems redundant, but a lot of mobs don't - host.stat = DEAD // handle death() properly. Better safe than etc. - host.visible_message("[host] is malformed and unable to survive. It expires pitifully, leaving behind some seeds.") - - var/total_yield = rand(1,3) - for(var/j = 0;j<=total_yield;j++) - var/obj/item/seeds/S = new(get_turf(host)) - S.seed_type = name - S.update_seed() - -/datum/seed/proc/request_player(var/mob/living/host) - if(!host) return - for(var/mob/dead/observer/O in player_list) - if(jobban_isbanned(O, "Dionaea")) - continue - if(O.client) - if(O.client.prefs.be_special & BE_PLANT && !(O.client in currently_querying)) - currently_querying |= O.client - question(O.client,host) - -/datum/seed/proc/question(var/client/C,var/mob/living/host) - spawn(0) - - if(!C || !host || !(C.mob && istype(C.mob,/mob/dead))) return // We don't want to spam them repeatedly if they're already in a mob. - - var/response = alert(C, "Someone is harvesting [display_name]. Would you like to play as one?", "Sentient plant harvest", "Yes", "No", "Never for this round.") - - if(!C || !host || !(C.mob && istype(C.mob,/mob/dead))) return // ...or accidentally accept an invalid argument for transfer. - - if(response == "Yes") - transfer_personality(C,host) - else if (response == "Never for this round") - C.prefs.be_special ^= BE_PLANT - - currently_querying -= C - -/datum/seed/proc/transfer_personality(var/client/player,var/mob/living/host) - - //Something is wrong, abort. - if(!player || !host) return - - //Host already has a controller, pike off slowpoke. - if(host.client && host.ckey) return - - //Transfer them over. - host.ckey = player.ckey - if(player.mob && player.mob.mind) - player.mob.mind.transfer_to(host) - - if(host.dna) host.dna.real_name = host.real_name - - // Update mode specific HUD icons. - callHook("harvest_podman", list(host)) - - host << "\green You awaken slowly, stirring into sluggish motion as the air caresses you." - - // This is a hack, replace with some kind of species blurb proc. - if(istype(host,/mob/living/simple_animal/diona)) - host << "You are [host], one of a race of drifting interstellar plantlike creatures that sometimes share their seeds with human traders." - host << "Too much darkness will send you into shock and starve you, but light will help you heal." - - var/newname = input(host,"Enter a name, or leave blank for the default name.", "Name change","") as text - newname = sanitize(newname) - if (newname != "") - host.real_name = newname - host.name = host.real_name -*/ \ No newline at end of file +/datum/seed/proc/handle_living_product(var/mob/living/host) \ No newline at end of file diff --git a/code/modules/mob/living/silicon/pai/recruit.dm b/code/modules/mob/living/silicon/pai/recruit.dm index 768b46c2283..fe785adf929 100644 --- a/code/modules/mob/living/silicon/pai/recruit.dm +++ b/code/modules/mob/living/silicon/pai/recruit.dm @@ -348,15 +348,15 @@ var/datum/paiController/paiController // Global handler for pAI candidates proc/requestRecruits(var/obj/item/device/paicard/P) for(var/mob/dead/observer/O in player_list) - if(O.client && O.client.prefs.be_special & BE_PAI) - if(player_old_enough_antag(O.client,BE_PAI)) + if(O.client && (ROLE_PAI in O.client.prefs.be_special)) + if(player_old_enough_antag(O.client,ROLE_PAI)) if(check_recruit(O)) O << "\blue A pAI card is looking for personalities. (Teleport | Sign Up)" //question(O.client) proc/check_recruit(var/mob/dead/observer/O) if(jobban_isbanned(O, "pAI") || jobban_isbanned(O,"nonhumandept")) return 0 - if(!player_old_enough_antag(O.client,BE_PAI)) + if(!player_old_enough_antag(O.client,ROLE_PAI)) return 0 if(O.has_enabled_antagHUD == 1 && config.antag_hud_restricted) return 0 diff --git a/code/modules/mob/living/silicon/robot/drone/drone.dm b/code/modules/mob/living/silicon/robot/drone/drone.dm index 4b38f79c2cc..005b1194821 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone.dm @@ -259,7 +259,7 @@ if(jobban_isbanned(O,"nonhumandept") || jobban_isbanned(O,"Drone")) continue if(O.client) - if(O.client.prefs.be_special & BE_PAI) + if(ROLE_PAI in O.client.prefs.be_special) question(O.client,O) /mob/living/silicon/robot/drone/proc/question(var/client/C,var/mob/M) diff --git a/code/modules/mob/living/simple_animal/borer.dm b/code/modules/mob/living/simple_animal/borer.dm index ab593967725..854969123e5 100644 --- a/code/modules/mob/living/simple_animal/borer.dm +++ b/code/modules/mob/living/simple_animal/borer.dm @@ -462,7 +462,7 @@ mob/living/simple_animal/borer/proc/request_player() if(jobban_isbanned(O, "Syndicate")) continue if(O.client) - if(O.client.prefs.be_special & BE_ALIEN && !jobban_isbanned(O, "alien")) + if((BE_ALIEN in O.client.prefs.be_special) && !jobban_isbanned(O, "alien")) question(O.client) mob/living/simple_animal/borer/proc/question(var/client/C) diff --git a/paradise.dme b/paradise.dme index c4f2edc5dee..6c56a7fdaee 100644 --- a/paradise.dme +++ b/paradise.dme @@ -35,6 +35,7 @@ #include "code\__DEFINES\preferences.dm" #include "code\__DEFINES\process_scheduler.dm" #include "code\__DEFINES\qdel.dm" +#include "code\__DEFINES\role_preferences.dm" #include "code\__DEFINES\sight.dm" #include "code\__DEFINES\stat.dm" #include "code\__HELPERS\_string_lists.dm" From 929f25c18b8f55e69fb97594fdb1483582c24413 Mon Sep 17 00:00:00 2001 From: Certh Date: Sat, 26 Dec 2015 09:55:11 +0100 Subject: [PATCH 04/53] Overhauls BodyScanner NanoUI --- code/game/machinery/adv_med.dm | 10 +- nano/css/shared.css | 7 +- nano/templates/adv_med.tmpl | 545 ++++++++++++++++----------------- 3 files changed, 274 insertions(+), 288 deletions(-) diff --git a/code/game/machinery/adv_med.dm b/code/game/machinery/adv_med.dm index 53e49224c6c..f005384ade4 100644 --- a/code/game/machinery/adv_med.dm +++ b/code/game/machinery/adv_med.dm @@ -315,6 +315,7 @@ occupantData["name"] = H.name occupantData["stat"] = H.stat occupantData["health"] = H.health + occupantData["maxHealth"] = H.maxHealth occupantData["hasVirus"] = H.virus2.len @@ -338,7 +339,9 @@ var/blood_volume = round(H.vessel.get_reagent_amount("blood")) bloodData["volume"] = blood_volume bloodData["percent"] = round(((blood_volume / 560)*100)) - + bloodData["pulse"] = H.get_pulse(GETPULSE_TOOL) + bloodData["bloodLevel"] = round(H.vessel.get_reagent_amount("blood")) + bloodData["bloodMax"] = H.max_blood occupantData["blood"] = bloodData var/reagentData[0] @@ -427,6 +430,9 @@ if(..()) return 1 + if (href_list["ejectify"]) + src.connected.eject() + if (href_list["print_p"]) generate_printing_text() @@ -609,4 +615,4 @@ else dat = " Error: No Body Scanner connected." - printing_text = dat \ No newline at end of file + printing_text = dat diff --git a/nano/css/shared.css b/nano/css/shared.css index 8aaf9c4f257..0e6568abf07 100644 --- a/nano/css/shared.css +++ b/nano/css/shared.css @@ -560,6 +560,11 @@ th.misc { color: #ffffff; } +/* Table styling for Med Scanner */ +.striped tr:nth-child(even) { + background-color: #404040 +} + /* Damage colors for crew monitoring computer */ .burn { color: orange; @@ -637,4 +642,4 @@ th.misc { .hot3 { color: #FF6600; -} \ No newline at end of file +} diff --git a/nano/templates/adv_med.tmpl b/nano/templates/adv_med.tmpl index 6e0e0d98752..5c7f739d732 100644 --- a/nano/templates/adv_med.tmpl +++ b/nano/templates/adv_med.tmpl @@ -1,14 +1,15 @@ - + {{if !data.occupied}}

No occupant detected.

{{else}}

Occupant Data:

- Name: + Name:
{{:data.occupant.name}} @@ -22,324 +23,298 @@ Used In File(s): \code\game\machinery\adv_med.dm
{{:helper.round(data.occupant.health*10)/10}}%
+
Status:
{{if data.occupant.stat==0}} - Alive + Alive {{else data.occupant.stat==1}} - Critical + Critical {{else}} - Dead + Dead {{/if}}
- {{:helper.link('Print', 'document', {'print_p' : 1, 'name' : data.occupant.name})}} +
-

Damage:

-
- Brute: +
+ Temperature:
-
- {{:data.occupant.bruteLoss}} -

-
- Burn: -
-
- {{:data.occupant.fireLoss}} -

-
- Oxygen: -
-
- {{:data.occupant.oxyLoss}} -

-
- Toxins: -
-
- {{:data.occupant.toxLoss}} -

-
- Brain: -
-
- {{:data.occupant.brainLoss}} -

-
- Radiation Level: -
-
- {{:data.occupant.radLoss}} -

-
- Genetic: -
-
- {{:data.occupant.cloneLoss}} -

-
- Paralysis: -
-
- {{:data.occupant.paralysis}}% ({{:data.occupant.paralysisSeconds}} seconds left!) -

-
-
-
- Body Temperature: -
-
+
{{:data.occupant.bodyTempC}}°C, {{:data.occupant.bodyTempF}}°F
+ {{if data.occupant.hasVirus}} -
+ Viral pathogen detected in blood stream. -
+
{{/if}} {{if data.occupant.hasBorer}} -
- Large growth detected in frontal lobe, possibly cancerous. Surgical removal is recommended. -
+ + Large growth detected in frontal lobe, possibly cancerous. Surgical removal is recommended.
{{/if}} {{if data.occupant.blind}} - Pupils unresponsive.
+ Pupils unresponsive.
{{/if}} {{if data.occupant.nearsighted}} - Retinal Misalignment Detected + Retinal misalignment detected
{{/if}}
+ {{:helper.link('Print', 'document', {'print_p' : 1, 'name' : data.occupant.name})}} + {{:helper.link('Eject Occupant', 'arrowreturnthick-1-s', {'ejectify' : 1}, data.occupied ? null : 'disabled')}} +

-
-
Blood
-
-
- Volume -
-
- {{:data.occupant.blood.volume}} -
-
-
-
- Percent -
-
- {{:data.occupant.blood.percent}}% -
-
-
- + Damage: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Brute Damage: + + Brain Damage: +
+ {{:helper.displayBar(data.occupant.bruteLoss, 0, data.occupant.maxHealth, 'bad', data.occupant.bruteLoss) }} + + {{:helper.displayBar(data.occupant.brainLoss, 0, data.occupant.maxHealth, 'bad', data.occupant.brainLoss)}} +
+ Resp. Damage: + + Radiation Level: +
+ {{:helper.displayBar(data.occupant.oxyLoss, 0, data.occupant.maxHealth, 'bad', data.occupant.oxyLoss)}} + + {{:helper.displayBar(data.occupant.radLoss, 0, data.occupant.maxHealth, 'bad', data.occupant.radLoss)}} +
+ Toxin Damage: + + Genetic Damage: +
+ {{:helper.displayBar(data.occupant.toxLoss, 0, data.occupant.maxHealth, 'bad', data.occupant.toxLoss)}} + + {{:helper.displayBar(data.occupant.cloneLoss, 0, data.occupant.maxHealth, 'bad', data.occupant.cloneLoss)}} +
+ Burn Severity: + + Paralysis %: ({{:data.occupant.paralysisSeconds}} seconds left) +
+ {{:helper.displayBar(data.occupant.fireLoss, 0, data.occupant.maxHealth, 'bad', data.occupant.fireLoss)}} + + {{:helper.displayBar(data.occupant.paralysis, 0, data.occupant.maxHealth, 'bad', data.occupant.paralysis)}} +

- -
-
Reagents
-
-
- Epinephrine -
-
- {{:data.occupant.reagents.epinephrine}} -
-
-
-
- Ether -
-
- {{:data.occupant.reagents.ether}} -
-
-
-
- - Silver Sulfadiazine - -
-
- - {{:data.occupant.reagents.silver_sulfadiazine}} - -
-
-
-
- - Styptic Powder - -
-
- - {{:data.occupant.reagents.styptic_powder}} - -
-
-
-
- - Salbutamol - -
-
- - {{:data.occupant.reagents.salbutamol}} - -
-
+ Blood: +
+
Pulse:
{{:data.occupant.blood.pulse}} bpm
+
+
Blood Level:
+ {{if data.occupant.blood.percent <= 60}} + {{:helper.displayBar(data.occupant.blood.bloodLevel, 0, data.occupant.blood.bloodMax, 'bad')}} +
+ {{:data.occupant.blood.percent}}%, {{:data.occupant.blood.bloodLevel}}cl +
+ {{else data.occupant.blood.percent <= 90}} + {{:helper.displayBar(data.occupant.blood.bloodLevel, 0, data.occupant.blood.bloodMax, 'average')}} +
+ {{:data.occupant.blood.percent}}%, {{:data.occupant.bloodLevel}}cl +
+ {{else}} + {{:helper.displayBar(data.occupant.blood.bloodLevel, 0, data.occupant.blood.bloodMax, 'good')}} +
+ {{:data.occupant.blood.percent}}%, {{:data.occupant.blood.bloodLevel}}cl +
+ {{/if}} +
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Epinephrine: + + Ether: +
+ {{:helper.displayBar(data.occupant.reagents.epinephrine, 0, data.occupant.maxHealth, 'bad', data.occupant.reagents.epinephrine )}} + + {{:helper.displayBar(data.occupant.reagents.ether, 0, data.occupant.maxHealth, 'bad', data.occupant.reagents.ether)}} +
+ Silver Sulfadiazine: + + Styptic Powder: +
+ {{:helper.displayBar(data.occupant.reagents.silver_sulfadiazine, 0, data.occupant.maxHealth, 'bad', data.occupant.reagents.silver_sulfadiazine)}} + + {{:helper.displayBar(data.occupant.reagents.styptic_powder, 0, data.occupant.maxHealth, 'bad', data.occupant.reagents.styptic_powder)}} +
+ Salbutamol: +
+ {{:helper.displayBar(data.occupant.reagents.salbutamol, 0, data.occupant.maxHealth, 'bad', data.occupant.reagents.salbutamol)}} + +
+
External Organs -
- {{for data.occupant.extOrgan}} - {{if value.status.destroyed}} -
-
- {{:value.name}} - DESTROYED -
-
- {{else}} -
-
- {{:value.name}} -
-
- {{if value.status.broken}} - {{:value.status.broken}} - {{else value.status.splinted}} - Splinted - {{else value.status.robotic}} - Robotic - {{/if}} -
-
-
-
-  Brute/Burn -
-
- {{:value.bruteLoss}}/{{:value.fireLoss}} -
-
-
-
-  Injuries -
-
- {{if !value.status.bleeding}} - {{if !value.status.internalBleeding}} - No Injuries Detected - {{else}} - Internal Bleeding Detected + + + + + + + + + + + {{for data.occupant.extOrgan}} + + + + + + + {{/for}} + +
Name Brute damage Burn damage Injuries
{{:value.name}} + {{if value.bruteLoss> 0}} {{else}} {{/if}} + {{:value.bruteLoss}} + + {{if value.fireLoss> 0}} {{else}} {{/if}} + {{:value.fireLoss}} + + + {{if value.status.destroyed}} DESTROYED
{{/if}} + {{if value.status.bleeding}} external bleeding
{{/if}} + {{if value.internalBleeding}} internal bleeding
{{/if}} + {{if value.lungRuptured}} lung ruptured
{{/if}} + {{if value.status.broken}} {{:value.status.broken}}
{{/if}} + {{if value.germ_level > 100}} + {{if value.germ_level < 300}} + mild infection
+ {{else value.germ_level < 400}} + mild infection+
+ {{else value.germ_level < 500}} + mild infection++
+ {{else value.germ_level < 700}} + acute infection
+ {{else value.germ_level < 800}} + acute infection+
+ {{else value.germ_level < 900}} + acute infection++
+ {{else value.germ_level >= 900}} + septic
+ {{/if}} {{/if}} - {{else}} - {{if value.status.internalBleeding}} -
Internal Bleeding Detected. External Bleeding Detected.
- {{else}} - External Bleeding Detected + {{if value.open}} open incision
{{/if}} +
+ {{if value.status.splinted}} splinted
{{/if}} + {{if value.status.robotic}} robotic
{{/if}} + {{if value.implants_len}} + {{for value.implants : impValue:impindex}} + {{:impValue.known ? impValue.name : "unknown object"}}
+ {{/for}} {{/if}} - {{/if}} - - - {{if value.germ_level > 100}} -
-
-  Infection -
-
- {{if value.germ_level < 300}} - Mild Infection - {{else value.germ_level < 400}} - Mild Infection+ - {{else value.germ_level < 500}} - Mild Infection++ - {{else value.germ_level < 700}} - Acute Infection - {{else value.germ_level < 800}} - Acute Infection+ - {{else value.germ_level < 900}} - Acute Infection++ - {{else value.germ_level >= 900}} - Septic - {{/if}} -
-
- {{/if}} - {{if value.open}} -
-
-  Operation Status -
-
- Open Incision -
-
- {{/if}} - {{if value.implants_len}} -
-
-  Implants -

- {{for value.implants :impValue:impindex}} -
-   {{:impValue.known ? impValue.name : "Unknown"}} -

- {{/for}} -
- {{/if}} - {{/if}} +

- {{/for}} -
Internal Organs -
- {{for data.occupant.intOrgan}} -
-
- {{:value.name}} -
-
- {{:value.desc != null ? value.desc : ""}} -
-
- {{if value.germ_level > 100}} -
-
-  Infection -
-
- {{if value.germ_level < 300}} - Mild Infection - {{else value.germ_level < 400}} - Mild Infection+ - {{else value.germ_level < 500}} - Mild Infection++ - {{else value.germ_level < 700}} - Acute Infection - {{else value.germ_level < 800}} - Acute Infection+ - {{else value.germ_level < 900}} - Acute Infection++ - {{else value.germ_level >= 900}} - Septic - {{/if}} -
-
- {{/if}} -
-
-  Damage -
-
- {{:value.damage}} -
-
- {{/for}} -
-{{/if}} \ No newline at end of file + + + + + + + + + + {{for data.occupant.intOrgan}} + + + + + + + {{/for}} + +
Name Brute damage Injuries
{{:value.name}}
{{:value.desc != null ? value.desc : ""}}
+ {{if value.damage > 0}} {{else}} {{/if}} + {{:value.damage}} + {{if value.germ_level > 100}} + {{if value.germ_level < 300}} + mild infection
+ {{else value.germ_level < 400}} + mild infection+
+ {{else value.germ_level < 500}} + mild infection++
+ {{else value.germ_level < 700}} + acute Infection
+ {{else value.germ_level < 800}} + acute Infection+
+ {{else value.germ_level < 900}} + acute Infection++
+ {{else value.germ_level >= 900}} + septic
+ {{/if}} + {{/if}} +
+{{/if}} From 81ce03572ba91d9e13cf0c591745b27e17dd4c97 Mon Sep 17 00:00:00 2001 From: FalseIncarnate Date: Sat, 26 Dec 2015 23:54:24 -0500 Subject: [PATCH 05/53] Evil Santa Fixes/Tweaks Adds all Santa mobs to the global blocked_mobs list - Will prevent gold cores and rifts from spawning stage 2 santas Gives Final Form Santa (Stage 4) a small buff to health and minimum damage - All other stages left unchanged, Stage 4 was just a bit lackluster for a "final form" Fixes melee snowmen not ever dropping the brand new CANDY SWORD. They now will have a 50% chance. - It's a sharpened candy cane. Festive and painful. - Ranged snowmen do not drop the candy sword, as they don't carry a weapon. --- code/_globalvars/lists/mobs.dm | 7 ++++++- .../mob/living/simple_animal/hostile/winter_mobs.dm | 8 +++++--- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/code/_globalvars/lists/mobs.dm b/code/_globalvars/lists/mobs.dm index c20101cd510..381ade73a80 100644 --- a/code/_globalvars/lists/mobs.dm +++ b/code/_globalvars/lists/mobs.dm @@ -61,7 +61,12 @@ var/global/list/blocked_mobs = list(/mob/living/simple_animal, /mob/living/simple_animal/hostile/guardian/punch/sealpunch, /mob/living/simple_animal/hostile/guardian/healer/sealhealer, /mob/living/simple_animal/hostile/guardian/ranged, - /mob/living/simple_animal/hostile/guardian/bomb + /mob/living/simple_animal/hostile/guardian/bomb, + /mob/living/simple_animal/hostile/winter/santa, + /mob/living/simple_animal/hostile/winter/santa/stage_1, + /mob/living/simple_animal/hostile/winter/santa/stage_2, + /mob/living/simple_animal/hostile/winter/santa/stage_3, + /mob/living/simple_animal/hostile/winter/santa/stage_4 ) var/global/list/med_hud_users = list() diff --git a/code/modules/mob/living/simple_animal/hostile/winter_mobs.dm b/code/modules/mob/living/simple_animal/hostile/winter_mobs.dm index 7b28a5eb266..8ca70430d44 100644 --- a/code/modules/mob/living/simple_animal/hostile/winter_mobs.dm +++ b/code/modules/mob/living/simple_animal/hostile/winter_mobs.dm @@ -43,6 +43,8 @@ /mob/living/simple_animal/hostile/winter/snowman/death() + if(weapon1 && prob(50)) //50% chance to drop weapon on death, if it has one to drop + new weapon1(get_turf(src)) if(prob(20)) //chance to become a stationary snowman structure instead of a corpse new /obj/structure/snowman(get_turf(src)) visible_message("The [src.name] shimmers as its animating magic fades away!") @@ -121,12 +123,12 @@ /mob/living/simple_animal/hostile/winter/santa/stage_4 //stage 4: fast spinebreaker name = "Final Form Santa" desc = "WHAT THE HELL IS HE!?! WHY WON'T HE STAY DEAD!?!" - ranged = 0 - rapid = 0 + maxHealth = 200 + health = 200 speed = 0 //he's lost some weight from the fighting environment_smash = 2 //naughty walls must be punished too - melee_damage_lower = 10 + melee_damage_lower = 15 melee_damage_upper = 25 //that's gonna leave a mark, for sure /mob/living/simple_animal/hostile/winter/santa/stage_4/death() From fb22f8f34ca73c5d08707a12af74488457ff00ff Mon Sep 17 00:00:00 2001 From: Fox-McCloud Date: Sun, 27 Dec 2015 00:28:40 -0500 Subject: [PATCH 06/53] Cardboard Box Fix --- code/controllers/Processes/shuttles/supply.dm | 37 +++++++++++-------- 1 file changed, 21 insertions(+), 16 deletions(-) diff --git a/code/controllers/Processes/shuttles/supply.dm b/code/controllers/Processes/shuttles/supply.dm index e7f1ac90d04..6be3d442030 100644 --- a/code/controllers/Processes/shuttles/supply.dm +++ b/code/controllers/Processes/shuttles/supply.dm @@ -252,10 +252,10 @@ return 1 return 0 - + /******************** SUPPLY ORDER - ********************/ + ********************/ /datum/supply_order var/ordernum var/datum/supply_packs/object = null @@ -263,14 +263,14 @@ var/orderedbyRank var/comment = null var/crates - + /datum/controller/process/shuttle/proc/generateSupplyOrder(packId, _orderedby, _orderedbyRank, _comment, _crates) if(!packId) return var/datum/supply_packs/P = supply_packs["[packId]"] if(!P) return - + var/datum/supply_order/O = new() O.ordernum = ordernum++ O.object = P @@ -278,15 +278,15 @@ O.orderedbyRank = _orderedbyRank O.comment = _comment O.crates = _crates - + requestlist += O - return O - + return O + /datum/supply_order/proc/generateRequisition(atom/_loc) if(!object) return - + var/obj/item/weapon/paper/reqform = new /obj/item/weapon/paper(_loc) reqform.name = "Requisition Form - [crates] '[object.name]' for [orderedby]" reqform.info += "

[station_name] Supply Requisition Form


" @@ -301,11 +301,11 @@ reqform.info += object.manifest reqform.info += "
" reqform.info += "STAMP BELOW TO APPROVE THIS REQUISITION:
" - + reqform.update_icon() //Fix for appearing blank when printed. return reqform - + /datum/supply_order/proc/createObject(atom/_loc, errors=0) if(!object) return @@ -334,7 +334,7 @@ slip.info +="Reason: [comment]
" slip.info +="Supply Crate Type: [object.name]
" slip.info +="Access Restriction: [object.access ? get_access_desc(object.access) : "None"]
" - slip.info +="[packagesAmt] PACKAGES IN THIS SHIPMENT
" + slip.info +="[packagesAmt] PACKAGES IN THIS SHIPMENT
" slip.info +="CONTENTS:
+ \[Done\] + \[Reset\] + "} + // END AUTOFIX + user << browse(null, "window=preferences") + user << browse(HTML, "window=disabil;size=350x300") + return + +/datum/preferences/proc/SetRecords(mob/user) + var/HTML = "" + HTML += "
" + HTML += "Set Character Records
" + + HTML += "Medical Records
" + + if(lentext(med_record) <= 40) + HTML += "[med_record]" + else + HTML += "[copytext(med_record, 1, 37)]..." + + HTML += "

Employment Records
" + + if(lentext(gen_record) <= 40) + HTML += "[gen_record]" + else + HTML += "[copytext(gen_record, 1, 37)]..." + + HTML += "

Security Records
" + + if(lentext(sec_record) <= 40) + HTML += "[sec_record]
" + else + HTML += "[copytext(sec_record, 1, 37)]...
" + + HTML += "
" + HTML += "\[Done\]" + HTML += "
" + + user << browse(null, "window=preferences") + user << browse(HTML, "window=records;size=350x300") + return + +/datum/preferences/proc/GetPlayerAltTitle(datum/job/job) + return player_alt_titles.Find(job.title) > 0 \ + ? player_alt_titles[job.title] \ + : job.title + +/datum/preferences/proc/SetPlayerAltTitle(datum/job/job, new_title) + // remove existing entry + if(player_alt_titles.Find(job.title)) + player_alt_titles -= job.title + // add one if it's not default + if(job.title != new_title) + player_alt_titles[job.title] = new_title + +/datum/preferences/proc/SetJob(mob/user, role) + var/datum/job/job = job_master.GetJob(role) + if(!job) + user << browse(null, "window=mob_occupation") + ShowChoices(user) + return + + if(role == "Civilian") + if(job_support_low & job.flag) + job_support_low &= ~job.flag + else + job_support_low |= job.flag + SetChoices(user) + return 1 + + if(GetJobDepartment(job, 1) & job.flag) + SetJobDepartment(job, 1) + else if(GetJobDepartment(job, 2) & job.flag) + SetJobDepartment(job, 2) + else if(GetJobDepartment(job, 3) & job.flag) + SetJobDepartment(job, 3) + else//job = Never + SetJobDepartment(job, 4) + + SetChoices(user) + return 1 + +/datum/preferences/proc/ResetJobs() + job_support_high = 0 + job_support_med = 0 + job_support_low = 0 + + job_medsci_high = 0 + job_medsci_med = 0 + job_medsci_low = 0 + + job_engsec_high = 0 + job_engsec_med = 0 + job_engsec_low = 0 + + job_karma_high = 0 + job_karma_med = 0 + job_karma_low = 0 + + +/datum/preferences/proc/GetJobDepartment(var/datum/job/job, var/level) + if(!job || !level) return 0 + switch(job.department_flag) + if(SUPPORT) + switch(level) + if(1) + return job_support_high + if(2) + return job_support_med + if(3) + return job_support_low + if(MEDSCI) + switch(level) + if(1) + return job_medsci_high + if(2) + return job_medsci_med + if(3) + return job_medsci_low + if(ENGSEC) + switch(level) + if(1) + return job_engsec_high + if(2) + return job_engsec_med + if(3) + return job_engsec_low + if(KARMA) + switch(level) + if(1) + return job_karma_high + if(2) + return job_karma_med + if(3) + return job_karma_low + return 0 + +/datum/preferences/proc/SetJobDepartment(var/datum/job/job, var/level) + if(!job || !level) return 0 + switch(level) + if(1)//Only one of these should ever be active at once so clear them all here + job_support_high = 0 + job_medsci_high = 0 + job_engsec_high = 0 + job_karma_high = 0 + return 1 + if(2)//Set current highs to med, then reset them job_support_med |= job_support_high - job_engsec_med |= job_engsec_high job_medsci_med |= job_medsci_high + job_engsec_med |= job_engsec_high job_karma_med |= job_karma_high job_support_high = 0 - job_engsec_high = 0 job_medsci_high = 0 + job_engsec_high = 0 job_karma_high = 0 - if (job.department_flag == SUPPORT) - job_support_low &= ~job.flag - job_support_med &= ~job.flag - job_support_high &= ~job.flag - + switch(job.department_flag) + if(SUPPORT) switch(level) - if (1) - job_support_high |= job.flag - if (2) + if(2) + job_support_high = job.flag + job_support_med &= ~job.flag + if(3) job_support_med |= job.flag - if (3) + job_support_low &= ~job.flag + else job_support_low |= job.flag - - return 1 - else if (job.department_flag == ENGSEC) - job_engsec_low &= ~job.flag - job_engsec_med &= ~job.flag - job_engsec_high &= ~job.flag - + if(MEDSCI) switch(level) - if (1) - job_engsec_high |= job.flag - if (2) - job_engsec_med |= job.flag - if (3) - job_engsec_low |= job.flag - - return 1 - else if (job.department_flag == MEDSCI) - job_medsci_low &= ~job.flag - job_medsci_med &= ~job.flag - job_medsci_high &= ~job.flag - - switch(level) - if (1) - job_medsci_high |= job.flag - if (2) + if(2) + job_medsci_high = job.flag + job_medsci_med &= ~job.flag + if(3) job_medsci_med |= job.flag - if (3) + job_medsci_low &= ~job.flag + else job_medsci_low |= job.flag - - return 1 - else if (job.department_flag == KARMA) - job_karma_low &= ~job.flag - job_karma_med &= ~job.flag - job_karma_high &= ~job.flag - + if(ENGSEC) switch(level) - if (1) - job_karma_high |= job.flag - if (2) + if(2) + job_engsec_high = job.flag + job_engsec_med &= ~job.flag + if(3) + job_engsec_med |= job.flag + job_engsec_low &= ~job.flag + else + job_engsec_low |= job.flag + if(KARMA) + switch(level) + if(2) + job_karma_high = job.flag + job_karma_med &= ~job.flag + if(3) job_karma_med |= job.flag - if (3) + job_karma_low &= ~job.flag + else job_karma_low |= job.flag + return 1 - return 1 +/datum/preferences/proc/process_link(mob/user, list/href_list) + if(!user) return - return 0 - - proc/UpdateJobPreference(mob/user, role, desiredLvl) - var/datum/job/job = job_master.GetJob(role) - - if(!job) - user << browse(null, "window=mob_occupation") - ShowChoices(user) - return - - if (!isnum(desiredLvl)) - user << "\red UpdateJobPreference - desired level was not a number. Please notify coders!" - ShowChoices(user) - return - - if(role == "Civilian") - if(job_support_low & job.flag) - job_support_low &= ~job.flag - else - job_support_low |= job.flag - SetChoices(user) - return 1 - - SetJobPreferenceLevel(job, desiredLvl) - SetChoices(user) - - return 1 - - proc/ShowDisabilityState(mob/user,flag,label) - if(flag==DISABILITY_FLAG_FAT && species!=("Human" || "Tajaran" || "Grey")) - return "
  • [species] cannot be fat.
  • " - return "
  • [label]: [disabilities & flag ? "Yes" : "No"]
  • " - - proc/SetDisabilities(mob/user) - var/HTML = "" - - // AUTOFIXED BY fix_string_idiocy.py - // C:\Users\Rob\Documents\Projects\vgstation13\code\modules\client\preferences.dm:474: HTML += "
    " - HTML += {"
    - Choose disabilities
      "} - // END AUTOFIX - HTML += ShowDisabilityState(user,DISABILITY_FLAG_NEARSIGHTED,"Needs Glasses") - HTML += ShowDisabilityState(user,DISABILITY_FLAG_FAT,"Obese") - HTML += ShowDisabilityState(user,DISABILITY_FLAG_EPILEPTIC,"Seizures") - HTML += ShowDisabilityState(user,DISABILITY_FLAG_DEAF,"Deaf") - HTML += ShowDisabilityState(user,DISABILITY_FLAG_BLIND,"Blind") - HTML += ShowDisabilityState(user,DISABILITY_FLAG_MUTE,"Mute") - - - // AUTOFIXED BY fix_string_idiocy.py - // C:\Users\Rob\Documents\Projects\vgstation13\code\modules\client\preferences.dm:481: HTML += "
    " - HTML += {" - \[Done\] - \[Reset\] -
    "} - // END AUTOFIX - user << browse(null, "window=preferences") - user << browse(HTML, "window=disabil;size=350x300") - return - - proc/SetRecords(mob/user) - var/HTML = "" - HTML += "
    " - HTML += "Set Character Records
    " - - HTML += "Medical Records
    " - - if(lentext(med_record) <= 40) - HTML += "[med_record]" - else - HTML += "[copytext(med_record, 1, 37)]..." - - HTML += "

    Employment Records
    " - - if(lentext(gen_record) <= 40) - HTML += "[gen_record]" - else - HTML += "[copytext(gen_record, 1, 37)]..." - - HTML += "

    Security Records
    " - - if(lentext(sec_record) <= 40) - HTML += "[sec_record]
    " - else - HTML += "[copytext(sec_record, 1, 37)]...
    " - - HTML += "
    " - HTML += "\[Done\]" - HTML += "
    " - - user << browse(null, "window=preferences") - user << browse(HTML, "window=records;size=350x300") - return - - proc/GetPlayerAltTitle(datum/job/job) - return player_alt_titles.Find(job.title) > 0 \ - ? player_alt_titles[job.title] \ - : job.title - - proc/SetPlayerAltTitle(datum/job/job, new_title) - // remove existing entry - if(player_alt_titles.Find(job.title)) - player_alt_titles -= job.title - // add one if it's not default - if(job.title != new_title) - player_alt_titles[job.title] = new_title - - proc/SetJob(mob/user, role) - var/datum/job/job = job_master.GetJob(role) - if(!job) - user << browse(null, "window=mob_occupation") - ShowChoices(user) - return - - if(role == "Civilian") - if(job_support_low & job.flag) - job_support_low &= ~job.flag - else - job_support_low |= job.flag - SetChoices(user) - return 1 - - if(GetJobDepartment(job, 1) & job.flag) - SetJobDepartment(job, 1) - else if(GetJobDepartment(job, 2) & job.flag) - SetJobDepartment(job, 2) - else if(GetJobDepartment(job, 3) & job.flag) - SetJobDepartment(job, 3) - else//job = Never - SetJobDepartment(job, 4) - - SetChoices(user) - return 1 - - proc/ResetJobs() - job_support_high = 0 - job_support_med = 0 - job_support_low = 0 - - job_medsci_high = 0 - job_medsci_med = 0 - job_medsci_low = 0 - - job_engsec_high = 0 - job_engsec_med = 0 - job_engsec_low = 0 - - job_karma_high = 0 - job_karma_med = 0 - job_karma_low = 0 - - - proc/GetJobDepartment(var/datum/job/job, var/level) - if(!job || !level) return 0 - switch(job.department_flag) - if(SUPPORT) - switch(level) - if(1) - return job_support_high - if(2) - return job_support_med - if(3) - return job_support_low - if(MEDSCI) - switch(level) - if(1) - return job_medsci_high - if(2) - return job_medsci_med - if(3) - return job_medsci_low - if(ENGSEC) - switch(level) - if(1) - return job_engsec_high - if(2) - return job_engsec_med - if(3) - return job_engsec_low - if(KARMA) - switch(level) - if(1) - return job_karma_high - if(2) - return job_karma_med - if(3) - return job_karma_low - return 0 - - proc/SetJobDepartment(var/datum/job/job, var/level) - if(!job || !level) return 0 - switch(level) - if(1)//Only one of these should ever be active at once so clear them all here - job_support_high = 0 - job_medsci_high = 0 - job_engsec_high = 0 - job_karma_high = 0 - return 1 - if(2)//Set current highs to med, then reset them - job_support_med |= job_support_high - job_medsci_med |= job_medsci_high - job_engsec_med |= job_engsec_high - job_karma_med |= job_karma_high - job_support_high = 0 - job_medsci_high = 0 - job_engsec_high = 0 - job_karma_high = 0 - - switch(job.department_flag) - if(SUPPORT) - switch(level) - if(2) - job_support_high = job.flag - job_support_med &= ~job.flag - if(3) - job_support_med |= job.flag - job_support_low &= ~job.flag - else - job_support_low |= job.flag - if(MEDSCI) - switch(level) - if(2) - job_medsci_high = job.flag - job_medsci_med &= ~job.flag - if(3) - job_medsci_med |= job.flag - job_medsci_low &= ~job.flag - else - job_medsci_low |= job.flag - if(ENGSEC) - switch(level) - if(2) - job_engsec_high = job.flag - job_engsec_med &= ~job.flag - if(3) - job_engsec_med |= job.flag - job_engsec_low &= ~job.flag - else - job_engsec_low |= job.flag - if(KARMA) - switch(level) - if(2) - job_karma_high = job.flag - job_karma_med &= ~job.flag - if(3) - job_karma_med |= job.flag - job_karma_low &= ~job.flag - else - job_karma_low |= job.flag - return 1 - - proc/process_link(mob/user, list/href_list) - if(!user) return - - if(href_list["preference"] == "job") - switch(href_list["task"]) - if("close") - user << browse(null, "window=mob_occupation") - ShowChoices(user) - if("reset") - ResetJobs() - SetChoices(user) - if("random") - if(alternate_option == GET_RANDOM_JOB || alternate_option == BE_CIVILIAN) - alternate_option += 1 - else if(alternate_option == RETURN_TO_LOBBY) - alternate_option = 0 - else - return 0 - SetChoices(user) - if ("alt_title") - var/datum/job/job = locate(href_list["job"]) - if (job) - var/choices = list(job.title) + job.alt_titles - var/choice = input("Pick a title for [job.title].", "Character Generation", GetPlayerAltTitle(job)) as anything in choices | null - if(choice) - SetPlayerAltTitle(job, choice) - SetChoices(user) - if("input") - SetJob(user, href_list["text"]) - if("setJobLevel") - UpdateJobPreference(user, href_list["text"], text2num(href_list["level"])) + if(href_list["preference"] == "job") + switch(href_list["task"]) + if("close") + user << browse(null, "window=mob_occupation") + ShowChoices(user) + if("reset") + ResetJobs() + SetChoices(user) + if("random") + if(alternate_option == GET_RANDOM_JOB || alternate_option == BE_CIVILIAN) + alternate_option += 1 + else if(alternate_option == RETURN_TO_LOBBY) + alternate_option = 0 else - SetChoices(user) - return 1 - else if(href_list["preference"] == "disabilities") - - switch(href_list["task"]) - if("close") - user << browse(null, "window=disabil") - ShowChoices(user) - if("reset") - disabilities=0 - SetDisabilities(user) - if("input") - var/dflag=text2num(href_list["disability"]) - if(dflag >= 0) - if(!(dflag==DISABILITY_FLAG_FAT && species!=("Human" || "Tajaran" || "Grey"))) - disabilities ^= text2num(href_list["disability"]) //MAGIC - SetDisabilities(user) - else - SetDisabilities(user) - return 1 - - else if(href_list["preference"] == "records") - if(text2num(href_list["record"]) >= 1) - SetRecords(user) - return + return 0 + SetChoices(user) + if ("alt_title") + var/datum/job/job = locate(href_list["job"]) + if (job) + var/choices = list(job.title) + job.alt_titles + var/choice = input("Pick a title for [job.title].", "Character Generation", GetPlayerAltTitle(job)) as anything in choices | null + if(choice) + SetPlayerAltTitle(job, choice) + SetChoices(user) + if("input") + SetJob(user, href_list["text"]) + if("setJobLevel") + UpdateJobPreference(user, href_list["text"], text2num(href_list["level"])) else - user << browse(null, "window=records") - if(href_list["task"] == "med_record") - var/medmsg = input(usr,"Set your medical notes here.","Medical Records",html_decode(med_record)) as message - - if(medmsg != null) - medmsg = copytext(medmsg, 1, MAX_PAPER_MESSAGE_LEN) - medmsg = html_encode(medmsg) - - med_record = medmsg - SetRecords(user) - - if(href_list["task"] == "sec_record") - var/secmsg = input(usr,"Set your security notes here.","Security Records",html_decode(sec_record)) as message - - if(secmsg != null) - secmsg = copytext(secmsg, 1, MAX_PAPER_MESSAGE_LEN) - secmsg = html_encode(secmsg) - - sec_record = secmsg - SetRecords(user) - if(href_list["task"] == "gen_record") - var/genmsg = input(usr,"Set your employment notes here.","Employment Records",html_decode(gen_record)) as message - - if(genmsg != null) - genmsg = copytext(genmsg, 1, MAX_PAPER_MESSAGE_LEN) - genmsg = html_encode(genmsg) - - gen_record = genmsg - SetRecords(user) + SetChoices(user) + return 1 + else if(href_list["preference"] == "disabilities") switch(href_list["task"]) - if("random") - switch(href_list["preference"]) - if("name") - real_name = random_name(gender,species) - if("age") - age = rand(AGE_MIN, AGE_MAX) - if("hair") - if(species == "Human" || species == "Unathi" || species == "Tajaran" || species == "Skrell" || species == "Machine" || species == "Wryn" || species == "Vulpkanin") - r_hair = rand(0,255) - g_hair = rand(0,255) - b_hair = rand(0,255) - if("h_style") - h_style = random_hair_style(gender, species) - if("facial") - r_facial = rand(0,255) - g_facial = rand(0,255) - b_facial = rand(0,255) - if("f_style") - f_style = random_facial_hair_style(gender, species) - if("underwear") - underwear = random_underwear(gender) - ShowChoices(user) - if("undershirt") - undershirt = random_undershirt(gender) - ShowChoices(user) - if("socks") - socks = random_socks(gender) - ShowChoices(user) - if("eyes") - r_eyes = rand(0,255) - g_eyes = rand(0,255) - b_eyes = rand(0,255) - if("s_tone") - if(species == "Human") - s_tone = random_skin_tone() - if("s_color") - if(species in list("Unathi", "Tajaran", "Skrell", "Slime People", "Wyrn", "Vulpkanin", "Machine")) - r_skin = rand(0,255) - g_skin = rand(0,255) - b_skin = rand(0,255) - if("bag") - backbag = rand(1,4) - /*if("skin_style") - h_style = random_skin_style(gender)*/ - if("all") - random_character() + if("close") + user << browse(null, "window=disabil") + ShowChoices(user) + if("reset") + disabilities=0 + SetDisabilities(user) if("input") - switch(href_list["preference"]) - if("name") - var/raw_name = input(user, "Choose your character's name:", "Character Preference") as text|null - if (!isnull(raw_name)) // Check to ensure that the user entered text (rather than cancel.) - var/new_name = reject_bad_name(raw_name) - if(new_name) - real_name = new_name - else - user << "Invalid name. Your name should be at least 2 and at most [MAX_NAME_LEN] characters long. It may only contain the characters A-Z, a-z, -, ' and ." + var/dflag=text2num(href_list["disability"]) + if(dflag >= 0) + if(!(dflag==DISABILITY_FLAG_FAT && species!=("Human" || "Tajaran" || "Grey"))) + disabilities ^= text2num(href_list["disability"]) //MAGIC + SetDisabilities(user) + else + SetDisabilities(user) + return 1 - if("age") - var/new_age = input(user, "Choose your character's age:\n([AGE_MIN]-[AGE_MAX])", "Character Preference") as num|null - if(new_age) - age = max(min( round(text2num(new_age)), AGE_MAX),AGE_MIN) - if("species") + else if(href_list["preference"] == "records") + if(text2num(href_list["record"]) >= 1) + SetRecords(user) + return + else + user << browse(null, "window=records") + if(href_list["task"] == "med_record") + var/medmsg = input(usr,"Set your medical notes here.","Medical Records",html_decode(med_record)) as message - var/list/new_species = list("Human","Tajaran","Skrell","Unathi","Diona", "Vulpkanin") - var/prev_species = species + if(medmsg != null) + medmsg = copytext(medmsg, 1, MAX_PAPER_MESSAGE_LEN) + medmsg = html_encode(medmsg) + + med_record = medmsg + SetRecords(user) + + if(href_list["task"] == "sec_record") + var/secmsg = input(usr,"Set your security notes here.","Security Records",html_decode(sec_record)) as message + + if(secmsg != null) + secmsg = copytext(secmsg, 1, MAX_PAPER_MESSAGE_LEN) + secmsg = html_encode(secmsg) + + sec_record = secmsg + SetRecords(user) + if(href_list["task"] == "gen_record") + var/genmsg = input(usr,"Set your employment notes here.","Employment Records",html_decode(gen_record)) as message + + if(genmsg != null) + genmsg = copytext(genmsg, 1, MAX_PAPER_MESSAGE_LEN) + genmsg = html_encode(genmsg) + + gen_record = genmsg + SetRecords(user) + + switch(href_list["task"]) + if("random") + switch(href_list["preference"]) + if("name") + real_name = random_name(gender,species) + if("age") + age = rand(AGE_MIN, AGE_MAX) + if("hair") + if(species == "Human" || species == "Unathi" || species == "Tajaran" || species == "Skrell" || species == "Machine" || species == "Wryn" || species == "Vulpkanin") + r_hair = rand(0,255) + g_hair = rand(0,255) + b_hair = rand(0,255) + if("h_style") + h_style = random_hair_style(gender, species) + if("facial") + r_facial = rand(0,255) + g_facial = rand(0,255) + b_facial = rand(0,255) + if("f_style") + f_style = random_facial_hair_style(gender, species) + if("underwear") + underwear = random_underwear(gender) + ShowChoices(user) + if("undershirt") + undershirt = random_undershirt(gender) + ShowChoices(user) + if("socks") + socks = random_socks(gender) + ShowChoices(user) + if("eyes") + r_eyes = rand(0,255) + g_eyes = rand(0,255) + b_eyes = rand(0,255) + if("s_tone") + if(species == "Human") + s_tone = random_skin_tone() + if("s_color") + if(species in list("Unathi", "Tajaran", "Skrell", "Slime People", "Wyrn", "Vulpkanin", "Machine")) + r_skin = rand(0,255) + g_skin = rand(0,255) + b_skin = rand(0,255) + if("bag") + backbag = rand(1,4) + /*if("skin_style") + h_style = random_skin_style(gender)*/ + if("all") + random_character() + if("input") + switch(href_list["preference"]) + if("name") + var/raw_name = input(user, "Choose your character's name:", "Character Preference") as text|null + if (!isnull(raw_name)) // Check to ensure that the user entered text (rather than cancel.) + var/new_name = reject_bad_name(raw_name) + if(new_name) + real_name = new_name + else + user << "Invalid name. Your name should be at least 2 and at most [MAX_NAME_LEN] characters long. It may only contain the characters A-Z, a-z, -, ' and ." + + if("age") + var/new_age = input(user, "Choose your character's age:\n([AGE_MIN]-[AGE_MAX])", "Character Preference") as num|null + if(new_age) + age = max(min( round(text2num(new_age)), AGE_MAX),AGE_MIN) + if("species") + + var/list/new_species = list("Human","Tajaran","Skrell","Unathi","Diona", "Vulpkanin") + var/prev_species = species // var/whitelisted = 0 - if(config.usealienwhitelist) //If we're using the whitelist, make sure to check it! - for(var/S in whitelisted_species) - if(is_alien_whitelisted(user,S)) - new_species += S + if(config.usealienwhitelist) //If we're using the whitelist, make sure to check it! + for(var/S in whitelisted_species) + if(is_alien_whitelisted(user,S)) + new_species += S // whitelisted = 1 // if(!whitelisted) // alert(user, "You cannot change your species as you need to be whitelisted. If you wish to be whitelisted contact an admin in-game, on the forums, or on IRC.") - else //Not using the whitelist? Aliens for everyone! - new_species += whitelisted_species + else //Not using the whitelist? Aliens for everyone! + new_species += whitelisted_species - species = input("Please select a species", "Character Generation", null) in new_species + species = input("Please select a species", "Character Generation", null) in new_species - if(prev_species != species) - //grab one of the valid hair styles for the newly chosen species - var/list/valid_hairstyles = list() - for(var/hairstyle in hair_styles_list) - var/datum/sprite_accessory/S = hair_styles_list[hairstyle] - if(gender == MALE && S.gender == FEMALE) - continue - if(gender == FEMALE && S.gender == MALE) - continue - if( !(species in S.species_allowed)) - continue - valid_hairstyles[hairstyle] = hair_styles_list[hairstyle] - - if(valid_hairstyles.len) - h_style = pick(valid_hairstyles) - else - //this shouldn't happen - h_style = hair_styles_list["Bald"] - - //grab one of the valid facial hair styles for the newly chosen species - var/list/valid_facialhairstyles = list() - for(var/facialhairstyle in facial_hair_styles_list) - var/datum/sprite_accessory/S = facial_hair_styles_list[facialhairstyle] - if(gender == MALE && S.gender == FEMALE) - continue - if(gender == FEMALE && S.gender == MALE) - continue - if( !(species in S.species_allowed)) - continue - - valid_facialhairstyles[facialhairstyle] = facial_hair_styles_list[facialhairstyle] - - if(valid_facialhairstyles.len) - f_style = pick(valid_facialhairstyles) - else - //this shouldn't happen - f_style = facial_hair_styles_list["Shaved"] - - // Don't wear another species' underwear! - var/datum/sprite_accessory/S = underwear_list[underwear] - if(!(species in S.species_allowed)) - underwear = random_underwear(gender, species) - - S = undershirt_list[undershirt] - if(!(species in S.species_allowed)) - undershirt = random_undershirt(gender, species) - - S = socks_list[socks] - if(!(species in S.species_allowed)) - socks = random_socks(gender, species) - - //reset hair colour and skin colour - r_hair = 0//hex2num(copytext(new_hair, 2, 4)) - g_hair = 0//hex2num(copytext(new_hair, 4, 6)) - b_hair = 0//hex2num(copytext(new_hair, 6, 8)) - - s_tone = 0 - - body_accessory = null //no vulpatail on humans damnit - if("speciesprefs")//oldvox code - speciesprefs = !speciesprefs - - if("language") -// var/languages_available - var/list/new_languages = list("None") -/* - if(config.usealienwhitelist) - for(var/L in all_languages) - var/datum/language/lang = all_languages[L] - if((!(lang.flags & RESTRICTED)) && (is_alien_whitelisted(user, L)||(!( lang.flags & WHITELISTED )))) - new_languages += lang - languages_available = 1 - - if(!(languages_available)) - alert(user, "There are not currently any available secondary languages.") - else -*/ - for(var/L in all_languages) - var/datum/language/lang = all_languages[L] - if(!(lang.flags & RESTRICTED)) - new_languages += lang.name - - language = input("Please select a secondary language", "Character Generation", null) in new_languages - - if("metadata") - var/new_metadata = input(user, "Enter any information you'd like others to see, such as Roleplay-preferences:", "Game Preference" , metadata) as message|null - if(new_metadata) - metadata = sanitize(copytext(new_metadata,1,MAX_MESSAGE_LEN)) - - if("b_type") - var/new_b_type = input(user, "Choose your character's blood-type:", "Character Preference") as null|anything in list( "A+", "A-", "B+", "B-", "AB+", "AB-", "O+", "O-" ) - if(new_b_type) - b_type = new_b_type - - if("hair") - if(species == "Human" || species == "Unathi" || species == "Tajaran" || species == "Skrell" || species == "Machine" || species == "Vulpkanin") - var/input = "Choose your character's hair colour:" - if(species == "Machine") - input = "Choose your character's frame colour:" - var/new_hair = input(user, input, "Character Preference", rgb(r_hair, g_hair, b_hair)) as color|null - if(new_hair) - r_hair = hex2num(copytext(new_hair, 2, 4)) - g_hair = hex2num(copytext(new_hair, 4, 6)) - b_hair = hex2num(copytext(new_hair, 6, 8)) - - if("h_style") + if(prev_species != species) + //grab one of the valid hair styles for the newly chosen species var/list/valid_hairstyles = list() for(var/hairstyle in hair_styles_list) var/datum/sprite_accessory/S = hair_styles_list[hairstyle] + if(gender == MALE && S.gender == FEMALE) + continue + if(gender == FEMALE && S.gender == MALE) + continue if( !(species in S.species_allowed)) continue - valid_hairstyles[hairstyle] = hair_styles_list[hairstyle] - var/new_h_style = input(user, "Choose your character's hair style:", "Character Preference") as null|anything in valid_hairstyles - if(new_h_style) - h_style = new_h_style - - if("body_accessory") - var/list/possible_body_accessories = list() - if(check_rights(R_ADMIN, 1, user)) - possible_body_accessories = body_accessory_by_name.Copy() + if(valid_hairstyles.len) + h_style = pick(valid_hairstyles) else - for(var/B in body_accessory_by_name) - var/datum/body_accessory/accessory = body_accessory_by_name[B] - if(!istype(accessory)) - possible_body_accessories += "None" //the only null entry should be the "None" option - continue - if(species in accessory.allowed_species) - possible_body_accessories += B + //this shouldn't happen + h_style = hair_styles_list["Bald"] - var/new_body_accessory = input(user, "Choose your body accessory:", "Character Preference") as null|anything in possible_body_accessories - if(new_body_accessory) - body_accessory = (new_body_accessory == "None") ? null : new_body_accessory - - if("facial") - var/new_facial = input(user, "Choose your character's facial-hair colour:", "Character Preference", rgb(r_facial, g_facial, b_facial)) as color|null - if(new_facial) - r_facial = hex2num(copytext(new_facial, 2, 4)) - g_facial = hex2num(copytext(new_facial, 4, 6)) - b_facial = hex2num(copytext(new_facial, 6, 8)) - - if("f_style") + //grab one of the valid facial hair styles for the newly chosen species var/list/valid_facialhairstyles = list() for(var/facialhairstyle in facial_hair_styles_list) var/datum/sprite_accessory/S = facial_hair_styles_list[facialhairstyle] @@ -1204,435 +1081,559 @@ datum/preferences valid_facialhairstyles[facialhairstyle] = facial_hair_styles_list[facialhairstyle] - var/new_f_style = input(user, "Choose your character's facial-hair style:", "Character Preference") as null|anything in valid_facialhairstyles - if(new_f_style) - f_style = new_f_style - - if("underwear") - var/list/underwear_options - if(gender == MALE) - underwear_options = underwear_m + if(valid_facialhairstyles.len) + f_style = pick(valid_facialhairstyles) else - underwear_options = underwear_f + //this shouldn't happen + f_style = facial_hair_styles_list["Shaved"] - var/new_underwear = input(user, "Choose your character's underwear:", "Character Preference") as null|anything in underwear_options - if(new_underwear) - underwear = new_underwear - ShowChoices(user) + // Don't wear another species' underwear! + var/datum/sprite_accessory/S = underwear_list[underwear] + if(!(species in S.species_allowed)) + underwear = random_underwear(gender, species) - if("undershirt") - var/new_undershirt - if(gender == MALE) - new_undershirt = input(user, "Choose your character's undershirt:", "Character Preference") as null|anything in undershirt_m - else - new_undershirt = input(user, "Choose your character's undershirt:", "Character Preference") as null|anything in undershirt_f - if(new_undershirt) - undershirt = new_undershirt - ShowChoices(user) + S = undershirt_list[undershirt] + if(!(species in S.species_allowed)) + undershirt = random_undershirt(gender, species) - if("socks") - var/list/valid_sockstyles = list() - for(var/sockstyle in socks_list) - var/datum/sprite_accessory/S = socks_list[sockstyle] - if(gender == MALE && S.gender == FEMALE) + S = socks_list[socks] + if(!(species in S.species_allowed)) + socks = random_socks(gender, species) + + //reset hair colour and skin colour + r_hair = 0//hex2num(copytext(new_hair, 2, 4)) + g_hair = 0//hex2num(copytext(new_hair, 4, 6)) + b_hair = 0//hex2num(copytext(new_hair, 6, 8)) + + s_tone = 0 + + body_accessory = null //no vulpatail on humans damnit + if("speciesprefs")//oldvox code + speciesprefs = !speciesprefs + + if("language") +// var/languages_available + var/list/new_languages = list("None") +/* + if(config.usealienwhitelist) + for(var/L in all_languages) + var/datum/language/lang = all_languages[L] + if((!(lang.flags & RESTRICTED)) && (is_alien_whitelisted(user, L)||(!( lang.flags & WHITELISTED )))) + new_languages += lang + languages_available = 1 + + if(!(languages_available)) + alert(user, "There are not currently any available secondary languages.") + else +*/ + for(var/L in all_languages) + var/datum/language/lang = all_languages[L] + if(!(lang.flags & RESTRICTED)) + new_languages += lang.name + + language = input("Please select a secondary language", "Character Generation", null) in new_languages + + if("metadata") + var/new_metadata = input(user, "Enter any information you'd like others to see, such as Roleplay-preferences:", "Game Preference" , metadata) as message|null + if(new_metadata) + metadata = sanitize(copytext(new_metadata,1,MAX_MESSAGE_LEN)) + + if("b_type") + var/new_b_type = input(user, "Choose your character's blood-type:", "Character Preference") as null|anything in list( "A+", "A-", "B+", "B-", "AB+", "AB-", "O+", "O-" ) + if(new_b_type) + b_type = new_b_type + + if("hair") + if(species == "Human" || species == "Unathi" || species == "Tajaran" || species == "Skrell" || species == "Machine" || species == "Vulpkanin") + var/input = "Choose your character's hair colour:" + if(species == "Machine") + input = "Choose your character's frame colour:" + var/new_hair = input(user, input, "Character Preference", rgb(r_hair, g_hair, b_hair)) as color|null + if(new_hair) + r_hair = hex2num(copytext(new_hair, 2, 4)) + g_hair = hex2num(copytext(new_hair, 4, 6)) + b_hair = hex2num(copytext(new_hair, 6, 8)) + + if("h_style") + var/list/valid_hairstyles = list() + for(var/hairstyle in hair_styles_list) + var/datum/sprite_accessory/S = hair_styles_list[hairstyle] + if( !(species in S.species_allowed)) + continue + + valid_hairstyles[hairstyle] = hair_styles_list[hairstyle] + + var/new_h_style = input(user, "Choose your character's hair style:", "Character Preference") as null|anything in valid_hairstyles + if(new_h_style) + h_style = new_h_style + + if("body_accessory") + var/list/possible_body_accessories = list() + if(check_rights(R_ADMIN, 1, user)) + possible_body_accessories = body_accessory_by_name.Copy() + else + for(var/B in body_accessory_by_name) + var/datum/body_accessory/accessory = body_accessory_by_name[B] + if(!istype(accessory)) + possible_body_accessories += "None" //the only null entry should be the "None" option continue - if(gender == FEMALE && S.gender == MALE) - continue - if(!(species in S.species_allowed)) - continue - valid_sockstyles[sockstyle] = socks_list[sockstyle] - var/new_socks = input(user, "Choose your character's socks:", "Character Preference") as null|anything in valid_sockstyles - ShowChoices(user) - if(new_socks) - socks = new_socks + if(species in accessory.allowed_species) + possible_body_accessories += B - if("eyes") - var/new_eyes = input(user, "Choose your character's eye colour:", "Character Preference", rgb(r_eyes, g_eyes, b_eyes)) as color|null - if(new_eyes) - r_eyes = hex2num(copytext(new_eyes, 2, 4)) - g_eyes = hex2num(copytext(new_eyes, 4, 6)) - b_eyes = hex2num(copytext(new_eyes, 6, 8)) + var/new_body_accessory = input(user, "Choose your body accessory:", "Character Preference") as null|anything in possible_body_accessories + if(new_body_accessory) + body_accessory = (new_body_accessory == "None") ? null : new_body_accessory - if("s_tone") - if(species != "Human") - return - var/new_s_tone = input(user, "Choose your character's skin-tone:\n(Light 1 - 220 Dark)", "Character Preference") as num|null - if(new_s_tone) - s_tone = 35 - max(min( round(new_s_tone), 220),1) + if("facial") + var/new_facial = input(user, "Choose your character's facial-hair colour:", "Character Preference", rgb(r_facial, g_facial, b_facial)) as color|null + if(new_facial) + r_facial = hex2num(copytext(new_facial, 2, 4)) + g_facial = hex2num(copytext(new_facial, 4, 6)) + b_facial = hex2num(copytext(new_facial, 6, 8)) - if("skin") - if((species in list("Unathi", "Tajaran", "Skrell", "Slime People", "Vulpkanin", "Machine")) || body_accessory_by_species[species] || check_rights(R_ADMIN, 0, user)) - var/new_skin = input(user, "Choose your character's skin colour: ", "Character Preference", rgb(r_skin, g_skin, b_skin)) as color|null - if(new_skin) - r_skin = hex2num(copytext(new_skin, 2, 4)) - g_skin = hex2num(copytext(new_skin, 4, 6)) - b_skin = hex2num(copytext(new_skin, 6, 8)) + if("f_style") + var/list/valid_facialhairstyles = list() + for(var/facialhairstyle in facial_hair_styles_list) + var/datum/sprite_accessory/S = facial_hair_styles_list[facialhairstyle] + if(gender == MALE && S.gender == FEMALE) + continue + if(gender == FEMALE && S.gender == MALE) + continue + if( !(species in S.species_allowed)) + continue + + valid_facialhairstyles[facialhairstyle] = facial_hair_styles_list[facialhairstyle] + + var/new_f_style = input(user, "Choose your character's facial-hair style:", "Character Preference") as null|anything in valid_facialhairstyles + if(new_f_style) + f_style = new_f_style + + if("underwear") + var/list/underwear_options + if(gender == MALE) + underwear_options = underwear_m + else + underwear_options = underwear_f + + var/new_underwear = input(user, "Choose your character's underwear:", "Character Preference") as null|anything in underwear_options + if(new_underwear) + underwear = new_underwear + ShowChoices(user) + + if("undershirt") + var/new_undershirt + if(gender == MALE) + new_undershirt = input(user, "Choose your character's undershirt:", "Character Preference") as null|anything in undershirt_m + else + new_undershirt = input(user, "Choose your character's undershirt:", "Character Preference") as null|anything in undershirt_f + if(new_undershirt) + undershirt = new_undershirt + ShowChoices(user) + + if("socks") + var/list/valid_sockstyles = list() + for(var/sockstyle in socks_list) + var/datum/sprite_accessory/S = socks_list[sockstyle] + if(gender == MALE && S.gender == FEMALE) + continue + if(gender == FEMALE && S.gender == MALE) + continue + if(!(species in S.species_allowed)) + continue + valid_sockstyles[sockstyle] = socks_list[sockstyle] + var/new_socks = input(user, "Choose your character's socks:", "Character Preference") as null|anything in valid_sockstyles + ShowChoices(user) + if(new_socks) + socks = new_socks + + if("eyes") + var/new_eyes = input(user, "Choose your character's eye colour:", "Character Preference", rgb(r_eyes, g_eyes, b_eyes)) as color|null + if(new_eyes) + r_eyes = hex2num(copytext(new_eyes, 2, 4)) + g_eyes = hex2num(copytext(new_eyes, 4, 6)) + b_eyes = hex2num(copytext(new_eyes, 6, 8)) + + if("s_tone") + if(species != "Human") + return + var/new_s_tone = input(user, "Choose your character's skin-tone:\n(Light 1 - 220 Dark)", "Character Preference") as num|null + if(new_s_tone) + s_tone = 35 - max(min( round(new_s_tone), 220),1) + + if("skin") + if((species in list("Unathi", "Tajaran", "Skrell", "Slime People", "Vulpkanin", "Machine")) || body_accessory_by_species[species] || check_rights(R_ADMIN, 0, user)) + var/new_skin = input(user, "Choose your character's skin colour: ", "Character Preference", rgb(r_skin, g_skin, b_skin)) as color|null + if(new_skin) + r_skin = hex2num(copytext(new_skin, 2, 4)) + g_skin = hex2num(copytext(new_skin, 4, 6)) + b_skin = hex2num(copytext(new_skin, 6, 8)) - if("ooccolor") - var/new_ooccolor = input(user, "Choose your OOC colour:", "Game Preference", ooccolor) as color|null - if(new_ooccolor) - ooccolor = new_ooccolor + if("ooccolor") + var/new_ooccolor = input(user, "Choose your OOC colour:", "Game Preference", ooccolor) as color|null + if(new_ooccolor) + ooccolor = new_ooccolor - if("bag") - var/new_backbag = input(user, "Choose your character's style of bag:", "Character Preference") as null|anything in backbaglist - if(new_backbag) - backbag = backbaglist.Find(new_backbag) + if("bag") + var/new_backbag = input(user, "Choose your character's style of bag:", "Character Preference") as null|anything in backbaglist + if(new_backbag) + backbag = backbaglist.Find(new_backbag) - if("nt_relation") - var/new_relation = input(user, "Choose your relation to NT. Note that this represents what others can find out about your character by researching your background, not what your character actually thinks.", "Character Preference") as null|anything in list("Loyal", "Supportive", "Neutral", "Skeptical", "Opposed") - if(new_relation) - nanotrasen_relation = new_relation + if("nt_relation") + var/new_relation = input(user, "Choose your relation to NT. Note that this represents what others can find out about your character by researching your background, not what your character actually thinks.", "Character Preference") as null|anything in list("Loyal", "Supportive", "Neutral", "Skeptical", "Opposed") + if(new_relation) + nanotrasen_relation = new_relation - if("flavor_text") - var/msg = input(usr,"Set the flavor text in your 'examine' verb. This can also be used for OOC notes and preferences!","Flavor Text",html_decode(flavor_text)) as message + if("flavor_text") + var/msg = input(usr,"Set the flavor text in your 'examine' verb. This can also be used for OOC notes and preferences!","Flavor Text",html_decode(flavor_text)) as message - if(msg != null) - msg = copytext(msg, 1, MAX_MESSAGE_LEN) - msg = html_encode(msg) + if(msg != null) + msg = copytext(msg, 1, MAX_MESSAGE_LEN) + msg = html_encode(msg) - flavor_text = msg + flavor_text = msg - if("limbs") - var/limb_name = input(user, "Which limb do you want to change?") as null|anything in list("Left Leg","Right Leg","Left Arm","Right Arm","Left Foot","Right Foot","Left Hand","Right Hand") - if(!limb_name) return + if("limbs") + var/limb_name = input(user, "Which limb do you want to change?") as null|anything in list("Left Leg","Right Leg","Left Arm","Right Arm","Left Foot","Right Foot","Left Hand","Right Hand") + if(!limb_name) return - var/limb = null - var/second_limb = null // if you try to change the arm, the hand should also change - var/third_limb = null // if you try to unchange the hand, the arm should also change - var/valid_limb_states=list("Normal","Amputated","Prothesis") - switch(limb_name) - if("Left Leg") - limb = "l_leg" - second_limb = "l_foot" - if("Right Leg") - limb = "r_leg" - second_limb = "r_foot" - if("Left Arm") - limb = "l_arm" - second_limb = "l_hand" - if("Right Arm") - limb = "r_arm" - second_limb = "r_hand" - if("Left Foot") - limb = "l_foot" - third_limb = "l_leg" - if("Right Foot") - limb = "r_foot" - third_limb = "r_leg" - if("Left Hand") - limb = "l_hand" - third_limb = "l_arm" - if("Right Hand") - limb = "r_hand" - third_limb = "r_arm" + var/limb = null + var/second_limb = null // if you try to change the arm, the hand should also change + var/third_limb = null // if you try to unchange the hand, the arm should also change + var/valid_limb_states=list("Normal","Amputated","Prothesis") + switch(limb_name) + if("Left Leg") + limb = "l_leg" + second_limb = "l_foot" + if("Right Leg") + limb = "r_leg" + second_limb = "r_foot" + if("Left Arm") + limb = "l_arm" + second_limb = "l_hand" + if("Right Arm") + limb = "r_arm" + second_limb = "r_hand" + if("Left Foot") + limb = "l_foot" + third_limb = "l_leg" + if("Right Foot") + limb = "r_foot" + third_limb = "r_leg" + if("Left Hand") + limb = "l_hand" + third_limb = "l_arm" + if("Right Hand") + limb = "r_hand" + third_limb = "r_arm" - var/new_state = input(user, "What state do you wish the limb to be in?") as null|anything in valid_limb_states - if(!new_state) return + var/new_state = input(user, "What state do you wish the limb to be in?") as null|anything in valid_limb_states + if(!new_state) return - switch(new_state) - if("Normal") - organ_data[limb] = null - rlimb_data[limb] = null - if(third_limb) - organ_data[third_limb] = null - rlimb_data[third_limb] = null - if("Amputated") - organ_data[limb] = "amputated" - rlimb_data[limb] = null - if(second_limb) - organ_data[second_limb] = "amputated" - rlimb_data[second_limb] = null - if("Prothesis") - var/choice = input(user, "Which manufacturer do you wish to use for this limb?") as null|anything in chargen_robolimbs - if(!choice) - return - rlimb_data[limb] = choice - organ_data[limb] = "cyborg" - if(second_limb) - rlimb_data[second_limb] = choice - organ_data[second_limb] = "cyborg" + switch(new_state) + if("Normal") + organ_data[limb] = null + rlimb_data[limb] = null + if(third_limb) + organ_data[third_limb] = null + rlimb_data[third_limb] = null + if("Amputated") + organ_data[limb] = "amputated" + rlimb_data[limb] = null + if(second_limb) + organ_data[second_limb] = "amputated" + rlimb_data[second_limb] = null + if("Prothesis") + var/choice = input(user, "Which manufacturer do you wish to use for this limb?") as null|anything in chargen_robolimbs + if(!choice) + return + rlimb_data[limb] = choice + organ_data[limb] = "cyborg" + if(second_limb) + rlimb_data[second_limb] = choice + organ_data[second_limb] = "cyborg" - if("organs") - var/organ_name = input(user, "Which internal function do you want to change?") as null|anything in list("Heart", "Eyes") - if(!organ_name) return + if("organs") + var/organ_name = input(user, "Which internal function do you want to change?") as null|anything in list("Heart", "Eyes") + if(!organ_name) return - var/organ = null - switch(organ_name) - if("Heart") - organ = "heart" - if("Eyes") - organ = "eyes" + var/organ = null + switch(organ_name) + if("Heart") + organ = "heart" + if("Eyes") + organ = "eyes" - var/new_state = input(user, "What state do you wish the organ to be in?") as null|anything in list("Normal","Assisted","Mechanical") - if(!new_state) return + var/new_state = input(user, "What state do you wish the organ to be in?") as null|anything in list("Normal","Assisted","Mechanical") + if(!new_state) return - switch(new_state) - if("Normal") - organ_data[organ] = null - if("Assisted") - organ_data[organ] = "assisted" - if("Mechanical") - organ_data[organ] = "mechanical" + switch(new_state) + if("Normal") + organ_data[organ] = null + if("Assisted") + organ_data[organ] = "assisted" + if("Mechanical") + organ_data[organ] = "mechanical" /* - if("skin_style") - var/skin_style_name = input(user, "Select a new skin style") as null|anything in list("default1", "default2", "default3") - if(!skin_style_name) return + if("skin_style") + var/skin_style_name = input(user, "Select a new skin style") as null|anything in list("default1", "default2", "default3") + if(!skin_style_name) return */ /* if("spawnpoint") - var/list/spawnkeys = list() - for(var/S in spawntypes) - spawnkeys += S - var/choice = input(user, "Where would you like to spawn when latejoining?") as null|anything in spawnkeys - if(!choice || !spawntypes[choice]) - spawnpoint = "Arrivals Shuttle" - return - spawnpoint = choice */ + var/list/spawnkeys = list() + for(var/S in spawntypes) + spawnkeys += S + var/choice = input(user, "Where would you like to spawn when latejoining?") as null|anything in spawnkeys + if(!choice || !spawntypes[choice]) + spawnpoint = "Arrivals Shuttle" + return + spawnpoint = choice */ - else - switch(href_list["preference"]) - if("publicity") - if(unlock_content) - toggles ^= MEMBER_PUBLIC + else + switch(href_list["preference"]) + if("publicity") + if(unlock_content) + toggles ^= MEMBER_PUBLIC - if("gender") - if(gender == MALE) - gender = FEMALE - else - gender = MALE - underwear = random_underwear(gender) - - if("hear_adminhelps") - sound ^= SOUND_ADMINHELP - - if("ui") - switch(UI_style) - if("Midnight") - UI_style = "White" - else - UI_style = "Midnight" - - if("UIcolor") - var/UI_style_color_new = input(user, "Choose your UI color, dark colors are not recommended!", UI_style_color) as color|null - if(!UI_style_color_new) return - UI_style_color = UI_style_color_new - - if("UIalpha") - var/UI_style_alpha_new = input(user, "Select a new alpha(transparence) parametr for UI, between 50 and 255") as num - if(!UI_style_alpha_new | !(UI_style_alpha_new <= 255 && UI_style_alpha_new >= 50)) return - UI_style_alpha = UI_style_alpha_new - - if("be_special") - var/r = href_list["role"] - if(!(r in special_roles)) - message_admins("[user] attempted an href exploit! (This could have possibly lead to a \"Bobby Tables\" exploit, so they're probably up to no good). String: [r] ID: [last_id] IP: [last_ip]") - user << "Nice try." - else - be_special ^= r - - if("name") - be_random_name = !be_random_name - - if("randomslot") - randomslot = !randomslot - - if("hear_midis") - sound ^= SOUND_MIDI - - if("lobby_music") - sound ^= SOUND_LOBBY - if(sound & SOUND_LOBBY) - user << sound(ticker.login_music, repeat = 0, wait = 0, volume = 85, channel = 1) - else - user << sound(null, repeat = 0, wait = 0, volume = 85, channel = 1) - - if("ghost_ears") - toggles ^= CHAT_GHOSTEARS - - if("ghost_sight") - toggles ^= CHAT_GHOSTSIGHT - - if("ghost_radio") - toggles ^= CHAT_GHOSTRADIO - - if("ghost_radio") - toggles ^= CHAT_GHOSTRADIO - - if("save") - save_preferences(user) - save_character(user) - - if("reload") - load_preferences(user) - load_character(user) - - if("open_load_dialog") - if(!IsGuestKey(user.key)) - open_load_dialog(user) - - if("close_load_dialog") - close_load_dialog(user) - - if("changeslot") - if(!load_character(user,text2num(href_list["num"]))) - random_character() - real_name = random_name(gender) - save_character(user) - close_load_dialog(user) - - if("tab") - if (href_list["tab"]) - current_tab = text2num(href_list["tab"]) - - ShowChoices(user) - return 1 - - proc/copy_to(mob/living/carbon/human/character) - if(be_random_name) - real_name = random_name(gender,species) - - if(config.humans_need_surnames) - var/firstspace = findtext(real_name, " ") - var/name_length = length(real_name) - if(!firstspace) //we need a surname - real_name += " [pick(last_names)]" - else if(firstspace == name_length) - real_name += "[pick(last_names)]" - - character.real_name = real_name - character.name = character.real_name - if(character.dna) - character.dna.real_name = character.real_name - - character.flavor_text = flavor_text - character.med_record = med_record - character.sec_record = sec_record - character.gen_record = gen_record - - character.gender = gender - character.age = age - character.b_type = b_type - - character.r_eyes = r_eyes - character.g_eyes = g_eyes - character.b_eyes = b_eyes - - character.r_hair = r_hair - character.g_hair = g_hair - character.b_hair = b_hair - - character.r_facial = r_facial - character.g_facial = g_facial - character.b_facial = b_facial - - character.r_skin = r_skin - character.g_skin = g_skin - character.b_skin = b_skin - - character.s_tone = s_tone - - character.h_style = h_style - character.f_style = f_style - - - // Destroy/cyborgize organs - - for(var/name in organ_data) - - var/status = organ_data[name] - var/obj/item/organ/external/O = character.organs_by_name[name] - if(O) - if(status == "amputated") - character.organs_by_name[O.limb_name] = null - character.organs -= O - if(O.children) // This might need to become recursive. - for(var/obj/item/organ/external/child in O.children) - character.organs_by_name[child.limb_name] = null - character.organs -= child - - else if(status == "cyborg") - if(rlimb_data[name]) - O.robotize(rlimb_data[name]) + if("gender") + if(gender == MALE) + gender = FEMALE else - O.robotize() - else - var/obj/item/organ/I = character.internal_organs_by_name[name] - if(I) - if(status == "assisted") - I.mechassist() - else if(status == "mechanical") - I.robotize() + gender = MALE + underwear = random_underwear(gender) - if(disabilities & DISABILITY_FLAG_FAT && character.species.flags & CAN_BE_FAT)//character.species.flags & CAN_BE_FAT) - character.mutations += FAT - character.mutations += OBESITY - if(disabilities & DISABILITY_FLAG_NEARSIGHTED) - character.disabilities|=NEARSIGHTED - if(disabilities & DISABILITY_FLAG_EPILEPTIC) - character.disabilities|=EPILEPSY - if(disabilities & DISABILITY_FLAG_DEAF) - character.sdisabilities|=DEAF + if("hear_adminhelps") + sound ^= SOUND_ADMINHELP - // Wheelchair necessary? - var/obj/item/organ/external/l_foot = character.get_organ("l_foot") - var/obj/item/organ/external/r_foot = character.get_organ("r_foot") - if((!l_foot || l_foot.status & ORGAN_DESTROYED) && (!r_foot || r_foot.status & ORGAN_DESTROYED)) - var/obj/structure/stool/bed/chair/wheelchair/W = new /obj/structure/stool/bed/chair/wheelchair (character.loc) - character.buckled = W - character.update_canmove() - W.dir = character.dir - W.buckled_mob = character - W.add_fingerprint(character) + if("ui") + switch(UI_style) + if("Midnight") + UI_style = "White" + else + UI_style = "Midnight" - character.underwear = underwear - character.undershirt = undershirt - character.socks = socks + if("UIcolor") + var/UI_style_color_new = input(user, "Choose your UI color, dark colors are not recommended!", UI_style_color) as color|null + if(!UI_style_color_new) return + UI_style_color = UI_style_color_new - if(body_accessory) - character.body_accessory = body_accessory_by_name["[body_accessory]"] + if("UIalpha") + var/UI_style_alpha_new = input(user, "Select a new alpha(transparence) parametr for UI, between 50 and 255") as num + if(!UI_style_alpha_new | !(UI_style_alpha_new <= 255 && UI_style_alpha_new >= 50)) return + UI_style_alpha = UI_style_alpha_new - if(backbag > 4 || backbag < 1) - backbag = 1 //Same as above - character.backbag = backbag + if("be_special") + var/r = href_list["role"] + if(!(r in special_roles)) + message_admins("[user] attempted an href exploit! (This could have possibly lead to a \"Bobby Tables\" exploit, so they're probably up to no good). String: [r] ID: [last_id] IP: [last_ip]") + user << "Nice try." + else + be_special ^= r - //Debugging report to track down a bug, which randomly assigned the plural gender to people. - if(character.gender in list(PLURAL, NEUTER)) - if(isliving(src)) //Ghosts get neuter by default - message_admins("[key_name_admin(character)] has spawned with their gender as plural or neuter. Please notify coders.") - character.gender = MALE + if("name") + be_random_name = !be_random_name - proc/open_load_dialog(mob/user) + if("randomslot") + randomslot = !randomslot - var/DBQuery/query = dbcon.NewQuery("SELECT slot,real_name FROM [format_table_name("characters")] WHERE ckey='[user.ckey]' ORDER BY slot") + if("hear_midis") + sound ^= SOUND_MIDI - var/dat = "" - dat += "
    " - dat += "Select a character slot to load
    " - var/name + if("lobby_music") + sound ^= SOUND_LOBBY + if(sound & SOUND_LOBBY) + user << sound(ticker.login_music, repeat = 0, wait = 0, volume = 85, channel = 1) + else + user << sound(null, repeat = 0, wait = 0, volume = 85, channel = 1) - for(var/i=1, i<=max_save_slots, i++) - if(!query.Execute()) - var/err = query.ErrorMsg() - log_game("SQL ERROR during character slot loading. Error : \[[err]\]\n") - message_admins("SQL ERROR during character slot loading. Error : \[[err]\]\n") - return - while(query.NextRow()) - if(i==text2num(query.item[1])) - name = query.item[2] - if(!name) name = "Character[i]" - if(i==default_slot) - name = "[name]" - dat += "[name]
    " - name = null + if("ghost_ears") + toggles ^= CHAT_GHOSTEARS - dat += "
    " - dat += "Close
    " - dat += "
    " + if("ghost_sight") + toggles ^= CHAT_GHOSTSIGHT + + if("ghost_radio") + toggles ^= CHAT_GHOSTRADIO + + if("ghost_radio") + toggles ^= CHAT_GHOSTRADIO + + if("save") + save_preferences(user) + save_character(user) + + if("reload") + load_preferences(user) + load_character(user) + + if("open_load_dialog") + if(!IsGuestKey(user.key)) + open_load_dialog(user) + + if("close_load_dialog") + close_load_dialog(user) + + if("changeslot") + if(!load_character(user,text2num(href_list["num"]))) + random_character() + real_name = random_name(gender) + save_character(user) + close_load_dialog(user) + + if("tab") + if (href_list["tab"]) + current_tab = text2num(href_list["tab"]) + + ShowChoices(user) + return 1 + +/datum/preferences/proc/copy_to(mob/living/carbon/human/character) + if(be_random_name) + real_name = random_name(gender,species) + + if(config.humans_need_surnames) + var/firstspace = findtext(real_name, " ") + var/name_length = length(real_name) + if(!firstspace) //we need a surname + real_name += " [pick(last_names)]" + else if(firstspace == name_length) + real_name += "[pick(last_names)]" + + character.real_name = real_name + character.name = character.real_name + if(character.dna) + character.dna.real_name = character.real_name + + character.flavor_text = flavor_text + character.med_record = med_record + character.sec_record = sec_record + character.gen_record = gen_record + + character.gender = gender + character.age = age + character.b_type = b_type + + character.r_eyes = r_eyes + character.g_eyes = g_eyes + character.b_eyes = b_eyes + + character.r_hair = r_hair + character.g_hair = g_hair + character.b_hair = b_hair + + character.r_facial = r_facial + character.g_facial = g_facial + character.b_facial = b_facial + + character.r_skin = r_skin + character.g_skin = g_skin + character.b_skin = b_skin + + character.s_tone = s_tone + + character.h_style = h_style + character.f_style = f_style + + + // Destroy/cyborgize organs + + for(var/name in organ_data) + + var/status = organ_data[name] + var/obj/item/organ/external/O = character.organs_by_name[name] + if(O) + if(status == "amputated") + character.organs_by_name[O.limb_name] = null + character.organs -= O + if(O.children) // This might need to become recursive. + for(var/obj/item/organ/external/child in O.children) + character.organs_by_name[child.limb_name] = null + character.organs -= child + + else if(status == "cyborg") + if(rlimb_data[name]) + O.robotize(rlimb_data[name]) + else + O.robotize() + else + var/obj/item/organ/I = character.internal_organs_by_name[name] + if(I) + if(status == "assisted") + I.mechassist() + else if(status == "mechanical") + I.robotize() + + if(disabilities & DISABILITY_FLAG_FAT && character.species.flags & CAN_BE_FAT)//character.species.flags & CAN_BE_FAT) + character.mutations += FAT + character.mutations += OBESITY + if(disabilities & DISABILITY_FLAG_NEARSIGHTED) + character.disabilities|=NEARSIGHTED + if(disabilities & DISABILITY_FLAG_EPILEPTIC) + character.disabilities|=EPILEPSY + if(disabilities & DISABILITY_FLAG_DEAF) + character.sdisabilities|=DEAF + + // Wheelchair necessary? + var/obj/item/organ/external/l_foot = character.get_organ("l_foot") + var/obj/item/organ/external/r_foot = character.get_organ("r_foot") + if((!l_foot || l_foot.status & ORGAN_DESTROYED) && (!r_foot || r_foot.status & ORGAN_DESTROYED)) + var/obj/structure/stool/bed/chair/wheelchair/W = new /obj/structure/stool/bed/chair/wheelchair (character.loc) + character.buckled = W + character.update_canmove() + W.dir = character.dir + W.buckled_mob = character + W.add_fingerprint(character) + + character.underwear = underwear + character.undershirt = undershirt + character.socks = socks + + if(body_accessory) + character.body_accessory = body_accessory_by_name["[body_accessory]"] + + if(backbag > 4 || backbag < 1) + backbag = 1 //Same as above + character.backbag = backbag + + //Debugging report to track down a bug, which randomly assigned the plural gender to people. + if(character.gender in list(PLURAL, NEUTER)) + if(isliving(src)) //Ghosts get neuter by default + message_admins("[key_name_admin(character)] has spawned with their gender as plural or neuter. Please notify coders.") + character.gender = MALE + +/datum/preferences/proc/open_load_dialog(mob/user) + + var/DBQuery/query = dbcon.NewQuery("SELECT slot,real_name FROM [format_table_name("characters")] WHERE ckey='[user.ckey]' ORDER BY slot") + + var/dat = "" + dat += "
    " + dat += "Select a character slot to load
    " + var/name + + for(var/i=1, i<=max_save_slots, i++) + if(!query.Execute()) + var/err = query.ErrorMsg() + log_game("SQL ERROR during character slot loading. Error : \[[err]\]\n") + message_admins("SQL ERROR during character slot loading. Error : \[[err]\]\n") + return + while(query.NextRow()) + if(i==text2num(query.item[1])) + name = query.item[2] + if(!name) name = "Character[i]" + if(i==default_slot) + name = "[name]" + dat += "[name]
    " + name = null + + dat += "
    " + dat += "Close
    " + dat += "
    " // user << browse(dat, "window=saves;size=300x390") - var/datum/browser/popup = new(user, "saves", "
    Character Saves
    ", 300, 390) - popup.set_content(dat) - popup.open(0) - proc/close_load_dialog(mob/user) - user << browse(null, "window=saves") + var/datum/browser/popup = new(user, "saves", "
    Character Saves
    ", 300, 390) + popup.set_content(dat) + popup.open(0) + +/datum/preferences/proc/close_load_dialog(mob/user) + user << browse(null, "window=saves") diff --git a/code/modules/client/preferences_mysql.dm b/code/modules/client/preferences_mysql.dm index be900d254b7..016b3a7a46a 100644 --- a/code/modules/client/preferences_mysql.dm +++ b/code/modules/client/preferences_mysql.dm @@ -197,7 +197,6 @@ job_karma_med = sanitize_integer(job_karma_med, 0, 65535, initial(job_karma_med)) job_karma_low = sanitize_integer(job_karma_low, 0, 65535, initial(job_karma_low)) disabilities = sanitize_integer(disabilities, 0, 65535, initial(disabilities)) - be_special = sanitize_integer(be_special, 0, 65535, initial(be_special)) socks = sanitize_text(socks, initial(socks)) body_accessory = sanitize_text(body_accessory, initial(body_accessory)) @@ -268,7 +267,6 @@ sec_record='[sql_sanitize_text(html_decode(sec_record))]', gen_record='[sql_sanitize_text(html_decode(gen_record))]', player_alt_titles='[playertitlelist]', - be_special='[be_special]', disabilities='[disabilities]', organ_data='[organlist]', rlimb_data='[rlimblist]', @@ -302,7 +300,7 @@ job_engsec_high, job_engsec_med, job_engsec_low, job_karma_high, job_karma_med, job_karma_low, flavor_text, med_record, sec_record, gen_record, - player_alt_titles, be_special, + player_alt_titles, disabilities, organ_data, rlimb_data, nanotrasen_relation, speciesprefs, socks, body_accessory) @@ -321,7 +319,7 @@ '[job_engsec_high]', '[job_engsec_med]', '[job_engsec_low]', '[job_karma_high]', '[job_karma_med]', '[job_karma_low]', '[sql_sanitize_text(html_encode(flavor_text))]', '[sql_sanitize_text(html_encode(med_record))]', '[sql_sanitize_text(html_encode(sec_record))]', '[sql_sanitize_text(html_encode(gen_record))]', - '[playertitlelist]', '[be_special]', + '[playertitlelist]', '[disabilities]', '[organlist]', '[rlimblist]', '[nanotrasen_relation]', '[speciesprefs]', '[socks]', '[body_accessory]') diff --git a/code/modules/events/alien_infestation.dm b/code/modules/events/alien_infestation.dm index a59f4eeac42..ccc0ef94191 100644 --- a/code/modules/events/alien_infestation.dm +++ b/code/modules/events/alien_infestation.dm @@ -21,7 +21,7 @@ if(temp_vent.parent.other_atmosmch.len > 50) //Stops Aliens getting stuck in small networks. See: Security, Virology vents += temp_vent - var/list/candidates = get_candidates(BE_ALIEN,ALIEN_AFK_BRACKET) + var/list/candidates = get_candidates(ROLE_ALIEN,ALIEN_AFK_BRACKET) while(spawncount > 0 && vents.len && candidates.len) var/obj/vent = pick_n_take(vents) @@ -33,4 +33,4 @@ spawncount-- successSpawn = 1 - + diff --git a/code/modules/events/borers.dm b/code/modules/events/borers.dm index d1620e45be7..d716b1df6c5 100644 --- a/code/modules/events/borers.dm +++ b/code/modules/events/borers.dm @@ -22,7 +22,7 @@ if(temp_vent.parent.other_atmosmch.len > 50) vents += temp_vent - var/list/candidates = get_candidates(BE_ALIEN,ALIEN_AFK_BRACKET) + var/list/candidates = get_candidates(ROLE_BORER,ALIEN_AFK_BRACKET) while(spawncount > 0 && vents.len && candidates.len) var/obj/vent = pick_n_take(vents) var/client/C = pick_n_take(candidates) @@ -32,4 +32,4 @@ spawncount-- successSpawn = 1 - + diff --git a/code/modules/events/slaughterevent.dm b/code/modules/events/slaughterevent.dm index c0f1ae75184..0889f8d8136 100644 --- a/code/modules/events/slaughterevent.dm +++ b/code/modules/events/slaughterevent.dm @@ -4,7 +4,7 @@ /datum/event/spawn_slaughter/proc/get_slaughter(var/end_if_fail = 0) key_of_slaughter = null if(!key_of_slaughter) - var/list/candidates = get_candidates(BE_ALIEN) + var/list/candidates = get_candidates(ROLE_DEMON) if(!candidates.len) if(end_if_fail) return 0 @@ -55,4 +55,3 @@ return 0 message_admins("Unfortunately, no candidates were available for becoming a Slaugter Demon. Shutting down.") kill() - \ No newline at end of file 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 5494b199a87..5ffe45a8123 100644 --- a/code/modules/mob/living/carbon/alien/special/alien_embryo.dm +++ b/code/modules/mob/living/carbon/alien/special/alien_embryo.dm @@ -83,7 +83,7 @@ var/const/ALIEN_AFK_BRACKET = 450 // 45 seconds AttemptGrow() /obj/item/alien_embryo/proc/AttemptGrow(var/gib_on_success = 1) - var/list/candidates = get_candidates(BE_ALIEN,ALIEN_AFK_BRACKET,1) + var/list/candidates = get_candidates(ROLE_ALIEN,ALIEN_AFK_BRACKET,1) var/client/C = null // To stop clientless larva, we will check that our host has a client diff --git a/code/modules/mob/living/carbon/brain/posibrain.dm b/code/modules/mob/living/carbon/brain/posibrain.dm index 67caeb2788c..d76b7dea569 100644 --- a/code/modules/mob/living/carbon/brain/posibrain.dm +++ b/code/modules/mob/living/carbon/brain/posibrain.dm @@ -32,8 +32,9 @@ /obj/item/device/mmi/posibrain/proc/request_player() for(var/mob/dead/observer/O in player_list) if(check_observer(O)) - O << "\blue \A [src] has been activated. (Teleport | Sign Up)" - //question(O.client) + O << "\A [src] has been activated. (Teleport | Sign Up)" +// if(ROLE_POSIBRAIN in O.client.prefs.be_special) The Guardian implementation looks cleaner +// question(O.client) /obj/item/device/mmi/posibrain/proc/check_observer(var/mob/dead/observer/O) if(O.has_enabled_antagHUD == 1 && config.antag_hud_restricted) @@ -52,7 +53,7 @@ if(response == "Yes") transfer_personality(C.mob) else if (response == "Never for this round") - C.prefs.be_special ^= BE_PAI + C.prefs.be_special -= ROLE_POSIBRAIN // This should not ever happen, but let's be safe /obj/item/device/mmi/posibrain/dropbrain(var/turf/dropspot) diff --git a/code/modules/mob/living/carbon/metroid/metroid.dm b/code/modules/mob/living/carbon/metroid/metroid.dm index 4abae727c73..96680de98b8 100644 --- a/code/modules/mob/living/carbon/metroid/metroid.dm +++ b/code/modules/mob/living/carbon/metroid/metroid.dm @@ -789,7 +789,7 @@ mob/living/carbon/slime/var/temperature_resistance = T0C+75 user << "You offer the sentience potion to [M]..." being_used = 1 - var/list/candidates = get_candidates(BE_ALIEN, ALIEN_AFK_BRACKET) + var/list/candidates = get_candidates(ROLE_SENTIENT, ALIEN_AFK_BRACKET) shuffle(candidates) diff --git a/code/modules/mob/living/simple_animal/borer.dm b/code/modules/mob/living/simple_animal/borer.dm index 854969123e5..34ec44a4245 100644 --- a/code/modules/mob/living/simple_animal/borer.dm +++ b/code/modules/mob/living/simple_animal/borer.dm @@ -16,7 +16,7 @@ if (!message) return log_say("[key_name(src)] : [message]") - if (stat == 2) + if (stat == DEAD) return say_dead(message) var/mob/living/simple_animal/borer/B = src.loc src << "You whisper silently, \"[message]\"" @@ -302,7 +302,7 @@ detatch() leave_host() -mob/living/simple_animal/borer/proc/detatch() +/mob/living/simple_animal/borer/proc/detatch() if(!host) return @@ -416,7 +416,7 @@ mob/living/simple_animal/borer/proc/detatch() src << "You cannot infest a target in your current state." return - if(M.stat == 2) + if(M.stat == DEAD) src << "That is not an appropriate target." return @@ -457,15 +457,15 @@ mob/living/simple_animal/borer/proc/detatch() return //Procs for grabbing players. -mob/living/simple_animal/borer/proc/request_player() +/mob/living/simple_animal/borer/proc/request_player() for(var/mob/O in respawnable_list) if(jobban_isbanned(O, "Syndicate")) continue if(O.client) - if((BE_ALIEN in O.client.prefs.be_special) && !jobban_isbanned(O, "alien")) + if((ROLE_BORER in O.client.prefs.be_special) && !jobban_isbanned(O, "alien")) question(O.client) -mob/living/simple_animal/borer/proc/question(var/client/C) +/mob/living/simple_animal/borer/proc/question(var/client/C) spawn(0) if(!C) return var/response = alert(C, "A cortical borer needs a player. Are you interested?", "Cortical borer request", "Yes", "No", "Never for this round") @@ -474,9 +474,9 @@ mob/living/simple_animal/borer/proc/question(var/client/C) if(response == "Yes") transfer_personality(C) else if (response == "Never for this round") - C.prefs.be_special ^= BE_ALIEN + C.prefs.be_special -= ROLE_BORER -mob/living/simple_animal/borer/proc/transfer_personality(var/client/candidate) +/mob/living/simple_animal/borer/proc/transfer_personality(var/client/candidate) if(!candidate) return diff --git a/code/modules/mob/living/simple_animal/guardian/guardian.dm b/code/modules/mob/living/simple_animal/guardian/guardian.dm index fefd94092b0..b202fd9bf81 100644 --- a/code/modules/mob/living/simple_animal/guardian/guardian.dm +++ b/code/modules/mob/living/simple_animal/guardian/guardian.dm @@ -641,7 +641,7 @@ return used = TRUE user << "[use_message]" - var/list/mob/dead/observer/candidates = pollCandidates("Do you want to play as the [mob_name] of [user.real_name]?",BE_PAI, null, FALSE, 100) + var/list/mob/dead/observer/candidates = pollCandidates("Do you want to play as the [mob_name] of [user.real_name]?",ROLE_GUARDIAN, null, FALSE, 100) var/mob/dead/observer/theghost = null if(candidates.len) diff --git a/code/modules/mob/living/simple_animal/revenant/revenant.dm b/code/modules/mob/living/simple_animal/revenant/revenant.dm index 70edbc27dd3..dfe8d1838e0 100644 --- a/code/modules/mob/living/simple_animal/revenant/revenant.dm +++ b/code/modules/mob/living/simple_animal/revenant/revenant.dm @@ -442,7 +442,7 @@ if(!key_of_revenant) message_admins("The new revenant's old client either could not be found or is in a new, living mob - grabbing a random candidate instead...") - var/list/candidates = get_candidates(BE_REVENANT) + var/list/candidates = get_candidates(ROLE_REVENANT) if(!candidates.len) qdel(R) message_admins("No candidates were found for the new revenant. Oh well!") diff --git a/code/modules/mob/living/simple_animal/revenant/revenant_spawn_event.dm b/code/modules/mob/living/simple_animal/revenant/revenant_spawn_event.dm index 0f1b3545391..57ebb983e72 100644 --- a/code/modules/mob/living/simple_animal/revenant/revenant_spawn_event.dm +++ b/code/modules/mob/living/simple_animal/revenant/revenant_spawn_event.dm @@ -13,7 +13,7 @@ return key_of_revenant = null if(!key_of_revenant) - var/list/candidates = get_candidates(BE_REVENANT) + var/list/candidates = get_candidates(ROLE_REVENANT) if(!candidates.len) if(end_if_fail) return 0 From 4aa83d3739a7e47df7c71143c0457eb92d905181 Mon Sep 17 00:00:00 2001 From: Certh Date: Sun, 27 Dec 2015 17:11:48 +0100 Subject: [PATCH 15/53] - No longer show blood section for species that have no blood - Prevents incompatible creatures entering the bodyscanner --- code/game/machinery/adv_med.dm | 8 +++--- nano/templates/adv_med.tmpl | 47 ++++++++++++++++++---------------- 2 files changed, 30 insertions(+), 25 deletions(-) diff --git a/code/game/machinery/adv_med.dm b/code/game/machinery/adv_med.dm index c8752a79d55..d15df37c062 100644 --- a/code/game/machinery/adv_med.dm +++ b/code/game/machinery/adv_med.dm @@ -93,7 +93,7 @@ qdel(G) -/obj/machinery/bodyscanner/MouseDrop_T(mob/living/carbon/O, mob/user as mob) +/obj/machinery/bodyscanner/MouseDrop_T(mob/living/carbon/human/O, mob/user as mob) if(!istype(O)) return 0 //not a mob if(user.incapacitated()) @@ -310,7 +310,7 @@ data["occupied"] = connected.occupant ? 1 : 0 var/occupantData[0] - if(connected.occupant && ishuman(connected.occupant)) + if(connected.occupant) var/mob/living/carbon/human/H = connected.occupant occupantData["name"] = H.name occupantData["stat"] = H.stat @@ -335,8 +335,10 @@ occupantData["hasBorer"] = H.has_brain_worms() var/bloodData[0] - if(H.vessel) + bloodData["hasBlood"] = 0 + if(ishuman(H) && H.vessel && !(H.species && H.species.flags & NO_BLOOD)) var/blood_volume = round(H.vessel.get_reagent_amount("blood")) + bloodData["hasBlood"] = 1 bloodData["volume"] = blood_volume bloodData["percent"] = round(((blood_volume / 560)*100)) bloodData["pulse"] = H.get_pulse(GETPULSE_TOOL) diff --git a/nano/templates/adv_med.tmpl b/nano/templates/adv_med.tmpl index a9d68f2f7a7..675ed51c8e5 100644 --- a/nano/templates/adv_med.tmpl +++ b/nano/templates/adv_med.tmpl @@ -105,31 +105,34 @@ Used In File(s): \code\game\machinery\adv_med.dm -
    - Blood: -
    -
    Pulse:
    {{:data.occupant.blood.pulse}} bpm
    -
    -
    -
    Blood Level:
    - {{if data.occupant.blood.percent <= 60}} - {{:helper.displayBar(data.occupant.blood.bloodLevel, 0, data.occupant.blood.bloodMax, 'bad')}} -
    - {{:data.occupant.blood.percent}}%, {{:data.occupant.blood.bloodLevel}}cl + {{if data.occupant.blood.hasBlood}} +
    + Blood: +
    +
    Pulse:
    {{:data.occupant.blood.pulse}} bpm
    - {{else data.occupant.blood.percent <= 90}} - {{:helper.displayBar(data.occupant.blood.bloodLevel, 0, data.occupant.blood.bloodMax, 'average')}} -
    - {{:data.occupant.blood.percent}}%, {{:data.occupant.bloodLevel}}cl + +
    +
    Blood Level:
    + {{if data.occupant.blood.percent <= 60}} + {{:helper.displayBar(data.occupant.blood.bloodLevel, 0, data.occupant.blood.bloodMax, 'bad')}} +
    + {{:data.occupant.blood.percent}}%, {{:data.occupant.blood.bloodLevel}}cl +
    + {{else data.occupant.blood.percent <= 90}} + {{:helper.displayBar(data.occupant.blood.bloodLevel, 0, data.occupant.blood.bloodMax, 'average')}} +
    + {{:data.occupant.blood.percent}}%, {{:data.occupant.bloodLevel}}cl +
    + {{else}} + {{:helper.displayBar(data.occupant.blood.bloodLevel, 0, data.occupant.blood.bloodMax, 'good')}} +
    + {{:data.occupant.blood.percent}}%, {{:data.occupant.blood.bloodLevel}}cl +
    + {{/if}}
    - {{else}} - {{:helper.displayBar(data.occupant.blood.bloodLevel, 0, data.occupant.blood.bloodMax, 'good')}} -
    - {{:data.occupant.blood.percent}}%, {{:data.occupant.blood.bloodLevel}}cl -
    - {{/if}} -
    + {{/if}}

    External Organs From 2a0ed2856f5928ddafa425a650eea1ef98dfc39f Mon Sep 17 00:00:00 2001 From: Certh Date: Sun, 27 Dec 2015 20:35:50 +0100 Subject: [PATCH 16/53] added color-coded bars --- code/game/machinery/adv_med.dm | 7 +++ nano/css/shared.css | 5 ++ nano/templates/adv_med.tmpl | 100 ++++++++++++++------------------- 3 files changed, 55 insertions(+), 57 deletions(-) diff --git a/code/game/machinery/adv_med.dm b/code/game/machinery/adv_med.dm index d15df37c062..2b5366c8eac 100644 --- a/code/game/machinery/adv_med.dm +++ b/code/game/machinery/adv_med.dm @@ -354,6 +354,10 @@ organData["germ_level"] = E.germ_level organData["bruteLoss"] = E.brute_dam organData["fireLoss"] = E.burn_dam + organData["totalLoss"] = E.brute_dam + E.burn_dam + organData["maxHealth"] = E.max_damage + organData["bruised"] = E.min_bruised_damage + organData["broken"] = E.min_broken_damage var/implantData[0] for(var/obj/I in E.implants) @@ -400,6 +404,9 @@ organData["desc"] = I.desc organData["germ_level"] = I.germ_level organData["damage"] = I.damage + organData["maxHealth"] = I.max_damage + organData["bruised"] = I.min_broken_damage + organData["broken"] = I.min_bruised_damage intOrganData.Add(list(organData)) diff --git a/nano/css/shared.css b/nano/css/shared.css index 0e6568abf07..67d726f5ebd 100644 --- a/nano/css/shared.css +++ b/nano/css/shared.css @@ -371,6 +371,11 @@ div.notice { background: #4f7529; } +.displayBarFill.notgood { + color: #ffffff; + background: #ffb400; +} + .displayBarFill.average { color: #ffffff; background: #cd6500; diff --git a/nano/templates/adv_med.tmpl b/nano/templates/adv_med.tmpl index 675ed51c8e5..a8790d09310 100644 --- a/nano/templates/adv_med.tmpl +++ b/nano/templates/adv_med.tmpl @@ -19,7 +19,7 @@ Used In File(s): \code\game\machinery\adv_med.dm
    Health:
    - {{:helper.displayBar(data.occupant.health, 0, 100, (data.occupant.health >= 50) ? 'good' : (data.occupant.health >= 25) ? 'average' : 'bad')}} + {{:helper.displayBar(data.occupant.health, -100, 100, (data.occupant.health >= 50) ? 'good' : (data.occupant.health >= 0) ? 'average' : 'bad')}}
    {{:helper.round(data.occupant.health*10)/10}}%
    @@ -47,12 +47,6 @@ Used In File(s): \code\game\machinery\adv_med.dm {{:data.occupant.bodyTempC}}°C, {{:data.occupant.bodyTempF}}°F
    - - {{if data.occupant.hasVirus}} - - Viral pathogen detected in blood stream. -
    - {{/if}} {{if data.occupant.hasBorer}} Large growth detected in frontal lobe, possibly cancerous. Surgical removal is recommended.
    @@ -76,32 +70,32 @@ Used In File(s): \code\game\machinery\adv_med.dm Brain Damage: - {{:helper.displayBar(data.occupant.bruteLoss, 0, data.occupant.maxHealth, 'bad', data.occupant.bruteLoss) }} - {{:helper.displayBar(data.occupant.brainLoss, 0, data.occupant.maxHealth, 'bad', data.occupant.brainLoss)}} + {{:helper.displayBar(data.occupant.bruteLoss, 0, data.occupant.maxHealth+100, (data.occupant.bruteLoss < 15) ? 'notgood' : (data.occupant.bruteLoss < 40) ? 'average' : 'bad', data.occupant.bruteLoss) }} + {{:helper.displayBar(data.occupant.brainLoss, 0, data.occupant.maxHealth+100, (data.occupant.brainLoss < 15) ? 'notgood' : (data.occupant.brainLoss < 40) ? 'average' : 'bad', data.occupant.brainLoss)}} Resp. Damage: Radiation Level: - {{:helper.displayBar(data.occupant.oxyLoss, 0, data.occupant.maxHealth, 'bad', data.occupant.oxyLoss)}} - {{:helper.displayBar(data.occupant.radLoss, 0, data.occupant.maxHealth, 'bad', data.occupant.radLoss)}} + {{:helper.displayBar(data.occupant.oxyLoss, 0, data.occupant.maxHealth+100, (data.occupant.oxyLoss < 15) ? 'notgood' : (data.occupant.oxyLoss < 40) ? 'average' : 'bad', data.occupant.oxyLoss)}} + {{:helper.displayBar(data.occupant.radLoss, 0, data.occupant.maxHealth+100, (data.occupant.radLoss < 15) ? 'notgood' : (data.occupant.radLoss < 40) ? 'average' : 'bad', data.occupant.radLoss)}} Toxin Damage: Genetic Damage: - {{:helper.displayBar(data.occupant.toxLoss, 0, data.occupant.maxHealth, 'bad', data.occupant.toxLoss)}} - {{:helper.displayBar(data.occupant.cloneLoss, 0, data.occupant.maxHealth, 'bad', data.occupant.cloneLoss)}} + {{:helper.displayBar(data.occupant.toxLoss, 0, data.occupant.maxHealth+100, (data.occupant.toxLoss < 15) ? 'notgood' : (data.occupant.toxLoss < 40) ? 'average' : 'bad', data.occupant.toxLoss)}} + {{:helper.displayBar(data.occupant.cloneLoss, 0, data.occupant.maxHealth+100, (data.occupant.cloneLoss < 15) ? 'notgood' : (data.occupant.cloneLoss < 40) ? 'average' : 'bad', data.occupant.cloneLoss)}} Burn Severity: Paralysis %: ({{:data.occupant.paralysisSeconds}} seconds left) - {{:helper.displayBar(data.occupant.fireLoss, 0, data.occupant.maxHealth, 'bad', data.occupant.fireLoss)}} - {{:helper.displayBar(data.occupant.paralysis, 0, data.occupant.maxHealth, 'bad', data.occupant.paralysis)}} + {{:helper.displayBar(data.occupant.fireLoss, 0, data.occupant.maxHealth+100, (data.occupant.fireLoss < 15) ? 'notgood' : (data.occupant.fireLoss < 40) ? 'average' : 'bad', data.occupant.fireLoss)}} + {{:helper.displayBar(data.occupant.paralysis, 0, 100, (data.occupant.paralysis < 25) ? 'notgood' : (data.occupant.paralysis < 50) ? 'average' : 'bad', data.occupant.paralysis)}} @@ -112,42 +106,34 @@ Used In File(s): \code\game\machinery\adv_med.dm
    Pulse:
    {{:data.occupant.blood.pulse}} bpm
    -
    Blood Level:
    - {{if data.occupant.blood.percent <= 60}} - {{:helper.displayBar(data.occupant.blood.bloodLevel, 0, data.occupant.blood.bloodMax, 'bad')}} -
    - {{:data.occupant.blood.percent}}%, {{:data.occupant.blood.bloodLevel}}cl -
    - {{else data.occupant.blood.percent <= 90}} - {{:helper.displayBar(data.occupant.blood.bloodLevel, 0, data.occupant.blood.bloodMax, 'average')}} -
    - {{:data.occupant.blood.percent}}%, {{:data.occupant.bloodLevel}}cl -
    - {{else}} - {{:helper.displayBar(data.occupant.blood.bloodLevel, 0, data.occupant.blood.bloodMax, 'good')}} -
    - {{:data.occupant.blood.percent}}%, {{:data.occupant.blood.bloodLevel}}cl -
    - {{/if}} + {{:helper.displayBar(data.occupant.blood.bloodLevel, 0, data.occupant.blood.bloodMax, (data.occupant.blood.percent <= 60) ? 'bad' : (data.occupant.blood.percent <= 90) ? 'average' : 'good' )}} +
    {{:data.occupant.blood.percent}}%, {{:data.occupant.blood.bloodLevel}}cl
    - {{/if}} -

    + {{/if}} +
    + {{if data.occupant.hasVirus}} + + Viral pathogen detected in blood stream. +
    + {{/if}} External Organs - - - - + + + + + {{for data.occupant.extOrgan}} +
    Name Brute damage Burn damage Injuries Name Total damage Brute damage Burn damage Injuries
    {{:value.name}} {{:helper.displayBar(value.totalLoss, 0, value.maxHealth, (value.totalLoss < value.bruised) ? 'notgood' : (value.totalLoss < value.broken) ? 'average' : 'bad', value.totalLoss) }} {{if value.bruteLoss> 0}} {{else}} {{/if}} {{:value.bruteLoss}} {{if value.fireLoss> 0}} {{else}} {{/if}} {{:value.fireLoss}} @@ -193,31 +179,31 @@ Used In File(s): \code\game\machinery\adv_med.dm - - + + {{for data.occupant.intOrgan}} - - + From d86d233b58d6f0cfea0b95d4686915851b3fecd9 Mon Sep 17 00:00:00 2001 From: Robertha89 Date: Sun, 27 Dec 2015 21:58:11 +0100 Subject: [PATCH 17/53] Actually reduces the volume by a fair bit --- code/game/machinery/computer/arcade.dm | 42 +++++++++++++------------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/code/game/machinery/computer/arcade.dm b/code/game/machinery/computer/arcade.dm index 5e4554e4c17..8f1c29a82be 100644 --- a/code/game/machinery/computer/arcade.dm +++ b/code/game/machinery/computer/arcade.dm @@ -154,7 +154,7 @@ src.blocked = 1 var/attackamt = rand(2,6) src.temp = "You attack for [attackamt] damage!" - playsound(src.loc, 'sound/arcade/Hit.ogg', 50, 1, extrarange = -6, falloff = 10) + playsound(src.loc, 'sound/arcade/Hit.ogg', 20, 1, extrarange = -6, falloff = 10) src.updateUsrDialog() if(turtle > 0) turtle-- @@ -168,7 +168,7 @@ var/pointamt = rand(1,3) var/healamt = rand(6,8) src.temp = "You use [pointamt] magic to heal for [healamt] damage!" - playsound(src.loc, 'sound/arcade/Heal.ogg', 50, 1, extrarange = -6, falloff = 10) + playsound(src.loc, 'sound/arcade/Heal.ogg', 20, 1, extrarange = -6, falloff = 10) src.updateUsrDialog() turtle++ @@ -183,7 +183,7 @@ src.blocked = 1 var/chargeamt = rand(4,7) src.temp = "You regain [chargeamt] points" - playsound(src.loc, 'sound/arcade/Mana.ogg', 50, 1, extrarange = -6, falloff = 10) + playsound(src.loc, 'sound/arcade/Mana.ogg', 20, 1, extrarange = -6, falloff = 10) src.player_mp += chargeamt if(turtle > 0) turtle-- @@ -218,7 +218,7 @@ if(!gameover) src.gameover = 1 src.temp = "[src.enemy_name] has fallen! Rejoice!" - playsound(src.loc, 'sound/arcade/Win.ogg', 50, 1, extrarange = -6, falloff = 10) + playsound(src.loc, 'sound/arcade/Win.ogg', 20, 1, extrarange = -6, falloff = 10) if(emagged) feedback_inc("arcade_win_emagged") @@ -235,13 +235,13 @@ else if (emagged && (turtle >= 4)) var/boomamt = rand(5,10) src.temp = "[src.enemy_name] throws a bomb, exploding you for [boomamt] damage!" - playsound(src.loc, 'sound/arcade/Boom.ogg', 50, 1, extrarange = -6, falloff = 10) + playsound(src.loc, 'sound/arcade/Boom.ogg', 20, 1, extrarange = -6, falloff = 10) src.player_hp -= boomamt else if ((src.enemy_mp <= 5) && (prob(70))) var/stealamt = rand(2,3) src.temp = "[src.enemy_name] steals [stealamt] of your power!" - playsound(src.loc, 'sound/arcade/Steal.ogg', 50, 1, extrarange = -6, falloff = 10) + playsound(src.loc, 'sound/arcade/Steal.ogg', 20, 1, extrarange = -6, falloff = 10) src.player_mp -= stealamt src.updateUsrDialog() @@ -249,7 +249,7 @@ src.gameover = 1 sleep(10) src.temp = "You have been drained! GAME OVER" - playsound(src.loc, 'sound/arcade/Lose.ogg', 50, 1, extrarange = -6, falloff = 10) + playsound(src.loc, 'sound/arcade/Lose.ogg', 20, 1, extrarange = -6, falloff = 10) if(emagged) feedback_inc("arcade_loss_mana_emagged") usr.gib() @@ -258,20 +258,20 @@ else if ((src.enemy_hp <= 10) && (src.enemy_mp > 4)) src.temp = "[src.enemy_name] heals for 4 health!" - playsound(src.loc, 'sound/arcade/Heal.ogg', 50, 1, extrarange = -6, falloff = 10) + playsound(src.loc, 'sound/arcade/Heal.ogg', 20, 1, extrarange = -6, falloff = 10) src.enemy_hp += 4 src.enemy_mp -= 4 else var/attackamt = rand(3,6) src.temp = "[src.enemy_name] attacks for [attackamt] damage!" - playsound(src.loc, 'sound/arcade/Hit.ogg', 50, 1, extrarange = -6, falloff = 10) + playsound(src.loc, 'sound/arcade/Hit.ogg', 20, 1, extrarange = -6, falloff = 10) src.player_hp -= attackamt if ((src.player_mp <= 0) || (src.player_hp <= 0)) src.gameover = 1 src.temp = "You have been crushed! GAME OVER" - playsound(src.loc, 'sound/arcade/Lose.ogg', 50, 1, extrarange = -6, falloff = 10) + playsound(src.loc, 'sound/arcade/Lose.ogg', 20, 1, extrarange = -6, falloff = 10) if(emagged) feedback_inc("arcade_loss_hp_emagged") usr.gib() @@ -485,7 +485,7 @@ var/mob/living/carbon/M = usr //for some vars switch(event) if(ORION_TRAIL_RAIDERS) - if(prob(50)) + if(prob(20)) usr << "You hear battle shouts. The tramping of boots on cold metal. Screams of agony. The rush of venting air. Are you going insane?" M.hallucination += 30 else @@ -504,8 +504,8 @@ M.Stun(5) sleep(30) atom_say("[M] violently throws up!") - playsound(loc, 'sound/effects/splat.ogg', 50, 1) - M.nutrition -= 50 //lose a lot of food + playsound(loc, 'sound/effects/splat.ogg', 20, 1) + M.nutrition -= 20 //lose a lot of food var/turf/location = usr.loc if(istype(location, /turf/simulated)) location.add_vomit_floor(src, 1) @@ -533,9 +533,9 @@ T.ChangeTurf(/turf/simulated/floor/plating/) else atom_say("Something slams into the floor around [src] - luckily, it didn't get through!") - playsound(src.loc, 'sound/effects/bang.ogg', 50, 1) + playsound(src.loc, 'sound/effects/bang.ogg', 20, 1) if(ORION_TRAIL_MALFUNCTION) - playsound(src.loc, 'sound/effects/EMPulse.ogg', 50, 1) + playsound(src.loc, 'sound/effects/EMPulse.ogg', 20, 1) src.visible_message("[src] malfunctions, randomizing in-game stats!") var/oldfood = food var/oldfuel = fuel @@ -549,7 +549,7 @@ src.audible_message("[src] lets out a somehow ominous chime.") food = oldfood fuel = oldfuel - playsound(src.loc, 'sound/machines/chime.ogg', 50, 1) + playsound(src.loc, 'sound/machines/chime.ogg', 20, 1) else if(href_list["newgame"]) //Reset everything newgame() @@ -597,7 +597,7 @@ usr.Stun(10) //you can't run :^) var/S = new /obj/singularity/academy(usr.loc) emagged = 0 //immediately removes emagged status so people can't kill themselves by sprinting up and interacting - sleep(50) + sleep(20) atom_say("[S] winks out, just as suddenly as it appeared.") qdel(S) else @@ -720,7 +720,7 @@ switch(event) if(ORION_TRAIL_RAIDERS) eventdat += "Raiders have come aboard your ship!" - if(prob(50)) + if(prob(20)) var/sfood = rand(1,10) var/sfuel = rand(1,10) food -= sfood @@ -826,7 +826,7 @@ var/chance2attack = alive*20 if(prob(chance2attack)) - var/chancetokill = 30*lings_aboard-(5*alive) //eg: 30*2-(10) = 50%, 2 lings, 2 crew is 50% chance + var/chancetokill = 30*lings_aboard-(5*alive) //eg: 30*2-(10) = 20%, 2 lings, 2 crew is 20% chance if(prob(chancetokill)) var/deadguy = remove_crewmember() eventdat += "
    The Changeling[ling2 ? "s":""] run[ling2 ? "":"s"] up to [deadguy] and capitulates them!" @@ -949,7 +949,7 @@ if(specific) newcrew = specific else - if(prob(50)) + if(prob(20)) newcrew = pick(first_names_male) else newcrew = pick(first_names_female) @@ -994,7 +994,7 @@ /obj/machinery/computer/arcade/orion_trail/emag_act(mob/user) if(!emagged) - user << "You override the cheat code menu and skip to Cheat #[rand(1, 50)]: Realism Mode." + user << "You override the cheat code menu and skip to Cheat #[rand(1, 20)]: Realism Mode." name = "The Orion Trail: Realism Edition" desc = "Learn how our ancestors got to Orion, and try not to die in the process!" newgame() From 2a62ed1dce4e5f6fa4d27b541612b22a6a7ec3fd Mon Sep 17 00:00:00 2001 From: SamCroswell Date: Sun, 27 Dec 2015 15:59:42 -0500 Subject: [PATCH 18/53] Tigercat's Optimizations --- code/modules/ninja/martial_art.dm | 27 ++++++++++++++------------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/code/modules/ninja/martial_art.dm b/code/modules/ninja/martial_art.dm index 8c3d0fc4707..796b343864a 100644 --- a/code/modules/ninja/martial_art.dm +++ b/code/modules/ninja/martial_art.dm @@ -2,7 +2,6 @@ *Contains: * Creeping Widow martial art datum * Creeping Widow MMB override datum - * grant_ninja_martial_art proc * Creeping Widow injector */ @@ -22,11 +21,11 @@ if(!used) user.visible_message("You stick the [src]'s needle into your arm and press the button.", \ "[user] sticks the [src]'s needle \his arm and presses the button.") - grant_ninja_martial_art(user) - user << "The nanomachines in the [src] flow through your bloodstream. You have been taugh the ways of the Creeping Widow.
    \ - Your stikes on harm intent will deal more damage.
    Using middle mouse button on a nearby person while on harm intent will send them flying backwards.
    \ - Your grabs will instantly be aggressive while you are using this style.
    Using middle mouse button while on harm intent and behind a person will put them in a silencing choke hold.
    \ - Using middle mouse button on a nearby person while on disarm intent will wrench their wrist, causing them to drop what they are holding.
    " + user << "The nanomachines in the [src] flow through your bloodstream." + + var/datum/martial_art/ninja_martial_art/N = new/datum/martial_art/ninja_martial_art(null) + N.teach(user) + used = 1 icon_state = "injector-used" desc = "A strange autoinjector made of a black metal.
    It appears to be used up and empty." @@ -35,12 +34,6 @@ user << "The [src] has been used already!" return 1 -// grant_ninja_martial_art proc - It is imperitive to ALWAYS use this when giving someone the Ninja martial art so that they have the middle mouse override as well. - -/proc/grant_ninja_martial_art(var/mob/living/carbon/human/target) - target.martial_art = new /datum/martial_art/ninja_martial_art() - target.middleClickOverride = new /datum/middleClickOverride/ninja_martial_art() - // Ninja martial art datum /datum/martial_art/ninja_martial_art @@ -49,6 +42,14 @@ var/has_choke_hold = 0 // Are we current choking a bitch? var/has_focus = 1 //Can we user our special moves? +/datum/martial_art/ninja_martial_art/teach(var/mob/living/carbon/human/H,var/make_temporary=0) + ..() + H.middleClickOverride = new /datum/middleClickOverride/ninja_martial_art() + H << "You have been taugh the ways of the Creeping Widow.
    \ + Your stikes on harm intent will deal more damage.
    Using middle mouse button on a nearby person while on harm intent will send them flying backwards.
    \ + Your grabs will instantly be aggressive while you are using this style.
    Using middle mouse button while on harm intent and behind a person will put them in a silencing choke hold.
    \ + Using middle mouse button on a nearby person while on disarm intent will wrench their wrist, causing them to drop what they are holding.
    " + /datum/martial_art/ninja_martial_art/proc/wrist_wrench(var/mob/living/carbon/human/A, var/mob/living/carbon/human/D) if(!D.stat && !D.weakened) if(has_focus) @@ -155,7 +156,7 @@ /datum/middleClickOverride/ninja_martial_art /datum/middleClickOverride/ninja_martial_art/onClick(var/atom/A, var/mob/living/carbon/human/user) - if(!user.martial_art || user.martial_art.name != "Creeping Widow Style") // Checking based on name because I'm fairly certain that checking against a user's specific ninja martial arts datum versus a generic one won't work. + if(!istype(user.martial_art, /datum/martial_art/ninja_martial_art)) user.pointed(A) // If they don't have the required martial art just point at the target. if(!istype(A, /mob/living/carbon/human)) // Special moves only work on humans. From 258d8278b58162fe8d2fd2f8a09cd8706d6e3b78 Mon Sep 17 00:00:00 2001 From: Robertha89 Date: Sun, 27 Dec 2015 22:39:57 +0100 Subject: [PATCH 19/53] Fixes mistake --- code/game/machinery/computer/arcade.dm | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/code/game/machinery/computer/arcade.dm b/code/game/machinery/computer/arcade.dm index 8f1c29a82be..17ec358a4a8 100644 --- a/code/game/machinery/computer/arcade.dm +++ b/code/game/machinery/computer/arcade.dm @@ -485,7 +485,7 @@ var/mob/living/carbon/M = usr //for some vars switch(event) if(ORION_TRAIL_RAIDERS) - if(prob(20)) + if(prob(50)) usr << "You hear battle shouts. The tramping of boots on cold metal. Screams of agony. The rush of venting air. Are you going insane?" M.hallucination += 30 else @@ -504,8 +504,8 @@ M.Stun(5) sleep(30) atom_say("[M] violently throws up!") - playsound(loc, 'sound/effects/splat.ogg', 20, 1) - M.nutrition -= 20 //lose a lot of food + playsound(loc, 'sound/effects/splat.ogg', 50, 1) + M.nutrition -= 50 //lose a lot of food var/turf/location = usr.loc if(istype(location, /turf/simulated)) location.add_vomit_floor(src, 1) @@ -597,7 +597,7 @@ usr.Stun(10) //you can't run :^) var/S = new /obj/singularity/academy(usr.loc) emagged = 0 //immediately removes emagged status so people can't kill themselves by sprinting up and interacting - sleep(20) + sleep(50) atom_say("[S] winks out, just as suddenly as it appeared.") qdel(S) else @@ -720,7 +720,7 @@ switch(event) if(ORION_TRAIL_RAIDERS) eventdat += "Raiders have come aboard your ship!" - if(prob(20)) + if(prob(50)) var/sfood = rand(1,10) var/sfuel = rand(1,10) food -= sfood @@ -826,7 +826,7 @@ var/chance2attack = alive*20 if(prob(chance2attack)) - var/chancetokill = 30*lings_aboard-(5*alive) //eg: 30*2-(10) = 20%, 2 lings, 2 crew is 20% chance + var/chancetokill = 30*lings_aboard-(5*alive) //eg: 30*2-(10) = 50%, 2 lings, 2 crew is 50% chance if(prob(chancetokill)) var/deadguy = remove_crewmember() eventdat += "
    The Changeling[ling2 ? "s":""] run[ling2 ? "":"s"] up to [deadguy] and capitulates them!" @@ -949,7 +949,7 @@ if(specific) newcrew = specific else - if(prob(20)) + if(prob(50)) newcrew = pick(first_names_male) else newcrew = pick(first_names_female) @@ -994,7 +994,7 @@ /obj/machinery/computer/arcade/orion_trail/emag_act(mob/user) if(!emagged) - user << "You override the cheat code menu and skip to Cheat #[rand(1, 20)]: Realism Mode." + user << "You override the cheat code menu and skip to Cheat #[rand(1, 50)]: Realism Mode." name = "The Orion Trail: Realism Edition" desc = "Learn how our ancestors got to Orion, and try not to die in the process!" newgame() From dc29161339457ac3c48ac15169c5cb6664144e79 Mon Sep 17 00:00:00 2001 From: Crazylemon64 Date: Sun, 27 Dec 2015 13:43:50 -0800 Subject: [PATCH 20/53] Adds an SQL list sanitization proc, and stores our tags in the DB --- SQL/paradise_schema.sql | 1 - SQL/paradise_schema_prefixed.sql | 1 - code/__HELPERS/sanitize_values.dm | 18 ++- code/modules/client/preferences_mysql.dm | 160 +++++++++++++++-------- code/modules/research/message_server.dm | 6 - 5 files changed, 122 insertions(+), 64 deletions(-) diff --git a/SQL/paradise_schema.sql b/SQL/paradise_schema.sql index f6e8ea640a3..b0e03f68efa 100644 --- a/SQL/paradise_schema.sql +++ b/SQL/paradise_schema.sql @@ -66,7 +66,6 @@ CREATE TABLE `characters` ( `med_record` mediumtext NOT NULL, `sec_record` mediumtext NOT NULL, `gen_record` mediumtext NOT NULL, - `be_role` mediumtext NOT NULL, `disabilities` mediumint(8) NOT NULL, `player_alt_titles` mediumtext NOT NULL, `organ_data` mediumtext NOT NULL, diff --git a/SQL/paradise_schema_prefixed.sql b/SQL/paradise_schema_prefixed.sql index 6fa053e79c1..567da99c300 100644 --- a/SQL/paradise_schema_prefixed.sql +++ b/SQL/paradise_schema_prefixed.sql @@ -66,7 +66,6 @@ CREATE TABLE `SS13_characters` ( `med_record` mediumtext NOT NULL, `sec_record` mediumtext NOT NULL, `gen_record` mediumtext NOT NULL, - `be_role` mediumtext NOT NULL, `disabilities` mediumint(8) NOT NULL, `player_alt_titles` mediumtext NOT NULL, `organ_data` mediumtext NOT NULL, diff --git a/code/__HELPERS/sanitize_values.dm b/code/__HELPERS/sanitize_values.dm index 70c63dfc789..f490f71df43 100644 --- a/code/__HELPERS/sanitize_values.dm +++ b/code/__HELPERS/sanitize_values.dm @@ -44,10 +44,24 @@ if(65 to 70) . += ascii2text(ascii+32) //letters A to F - translates to lowercase else return default return . - + /proc/sanitize_ooccolor(color) var/list/HSL = rgb2hsl(hex2num(copytext(color,2,4)),hex2num(copytext(color,4,6)),hex2num(copytext(color,6,8))) HSL[3] = min(HSL[3],0.4) var/list/RGB = hsl2rgb(arglist(HSL)) return "#[num2hex(RGB[1],2)][num2hex(RGB[2],2)][num2hex(RGB[3],2)]" - + + +// Sanitize inputs to avoid SQL injection attacks +/proc/sql_sanitize_text(var/text) + text = replacetext(text, "'", "''") + text = replacetext(text, ";", "") + text = replacetext(text, "&", "") + return text + +// Calls the above proc on each entry of a list to ensure its entries are clean +/proc/sql_sanitize_text_list(var/list/l) + var/list/new_list = l.Copy() + for (var/text in new_list) + sql_sanitize_text(text) + return new_list \ No newline at end of file diff --git a/code/modules/client/preferences_mysql.dm b/code/modules/client/preferences_mysql.dm index 016b3a7a46a..a8816db68ce 100644 --- a/code/modules/client/preferences_mysql.dm +++ b/code/modules/client/preferences_mysql.dm @@ -56,7 +56,7 @@ UI_style='[UI_style]', UI_style_color='[UI_style_color]', UI_style_alpha='[UI_style_alpha]', - be_role='[sql_sanitize_text(list2params(be_special))]', + be_role='[list2params(sql_sanitize_text_list(be_special))]', default_slot='[default_slot]', toggles='[toggles]', sound='[sound]', @@ -81,7 +81,60 @@ var/DBQuery/firstquery = dbcon.NewQuery("UPDATE [format_table_name("player")] SET default_slot=[slot] WHERE ckey='[C.ckey]'") firstquery.Execute() - var/DBQuery/query = dbcon.NewQuery("SELECT * FROM [format_table_name("characters")] WHERE ckey='[C.ckey]' AND slot='[slot]'") + // Let's not have this explode if you sneeze on the DB + var/DBQuery/query = dbcon.NewQuery({"SELECT + OOC_Notes, + real_name, + name_is_always_random, + gender, + age, + species, + language, + hair_red, + hair_green, + hair_blue, + facial_red, + facial_green, + facial_blue, + skin_tone, + skin_red, + skin_green, + skin_blue, + hair_style_name, + facial_style_name, + eyes_red, + eyes_green, + eyes_blue, + underwear, + undershirt, + backbag, + b_type, + alternate_option, + job_support_high, + job_support_med, + job_support_low, + job_medsci_high, + job_medsci_med, + job_medsci_low, + job_engsec_high, + job_engsec_med, + job_engsec_low, + job_karma_high, + job_karma_med, + job_karma_low, + flavor_text, + med_record, + sec_record, + gen_record, + disabilities, + player_alt_titles, + organ_data, + rlimb_data, + nanotrasen_relation, + speciesprefs, + socks, + body_accessory + FROM [format_table_name("characters")] WHERE ckey='[C.ckey]' AND slot='[slot]'"}) if(!query.Execute()) var/err = query.ErrorMsg() log_game("SQL ERROR during character slot loading. Error : \[[err]\]\n") @@ -90,67 +143,66 @@ while(query.NextRow()) //Character - metadata = query.item[4] - real_name = query.item[5] - be_random_name = text2num(query.item[6]) - gender = query.item[7] - age = text2num(query.item[8]) - species = query.item[9] - language = query.item[10] + metadata = query.item[1] + real_name = query.item[2] + be_random_name = text2num(query.item[3]) + gender = query.item[4] + age = text2num(query.item[5]) + species = query.item[6] + language = query.item[7] //colors to be consolidated into hex strings (requires some work with dna code) - r_hair = text2num(query.item[11]) - g_hair = text2num(query.item[12]) - b_hair = text2num(query.item[13]) - r_facial = text2num(query.item[14]) - g_facial = text2num(query.item[15]) - b_facial = text2num(query.item[16]) - s_tone = text2num(query.item[17]) - r_skin = text2num(query.item[18]) - g_skin = text2num(query.item[19]) - b_skin = text2num(query.item[20]) - h_style = query.item[21] - f_style = query.item[22] - r_eyes = text2num(query.item[23]) - g_eyes = text2num(query.item[24]) - b_eyes = text2num(query.item[25]) - underwear = query.item[26] - undershirt = query.item[27] - backbag = text2num(query.item[28]) - b_type = query.item[29] + r_hair = text2num(query.item[8]) + g_hair = text2num(query.item[9]) + b_hair = text2num(query.item[10]) + r_facial = text2num(query.item[11]) + g_facial = text2num(query.item[12]) + b_facial = text2num(query.item[13]) + s_tone = text2num(query.item[14]) + r_skin = text2num(query.item[15]) + g_skin = text2num(query.item[16]) + b_skin = text2num(query.item[17]) + h_style = query.item[18] + f_style = query.item[19] + r_eyes = text2num(query.item[20]) + g_eyes = text2num(query.item[21]) + b_eyes = text2num(query.item[22]) + underwear = query.item[23] + undershirt = query.item[24] + backbag = text2num(query.item[25]) + b_type = query.item[26] //Jobs - alternate_option = text2num(query.item[30]) - job_support_high = text2num(query.item[31]) - job_support_med = text2num(query.item[32]) - job_support_low = text2num(query.item[33]) - job_medsci_high = text2num(query.item[34]) - job_medsci_med = text2num(query.item[35]) - job_medsci_low = text2num(query.item[36]) - job_engsec_high = text2num(query.item[37]) - job_engsec_med = text2num(query.item[38]) - job_engsec_low = text2num(query.item[39]) - job_karma_high = text2num(query.item[40]) - job_karma_med = text2num(query.item[41]) - job_karma_low = text2num(query.item[42]) + alternate_option = text2num(query.item[27]) + job_support_high = text2num(query.item[28]) + job_support_med = text2num(query.item[29]) + job_support_low = text2num(query.item[30]) + job_medsci_high = text2num(query.item[31]) + job_medsci_med = text2num(query.item[32]) + job_medsci_low = text2num(query.item[33]) + job_engsec_high = text2num(query.item[34]) + job_engsec_med = text2num(query.item[35]) + job_engsec_low = text2num(query.item[36]) + job_karma_high = text2num(query.item[37]) + job_karma_med = text2num(query.item[38]) + job_karma_low = text2num(query.item[39]) //Miscellaneous - flavor_text = query.item[43] - med_record = query.item[44] - sec_record = query.item[45] - gen_record = query.item[46] - be_special = text2num(query.item[47]) - disabilities = text2num(query.item[48]) - player_alt_titles = params2list(query.item[49]) - organ_data = params2list(query.item[50]) - rlimb_data = params2list(query.item[51]) - nanotrasen_relation = query.item[52] - speciesprefs = text2num(query.item[53]) + flavor_text = query.item[40] + med_record = query.item[41] + sec_record = query.item[42] + gen_record = query.item[43] + disabilities = text2num(query.item[44]) + player_alt_titles = params2list(query.item[45]) + organ_data = params2list(query.item[46]) + rlimb_data = params2list(query.item[47]) + nanotrasen_relation = query.item[48] + speciesprefs = text2num(query.item[49]) //socks - socks = query.item[54] - body_accessory = query.item[55] + socks = query.item[50] + body_accessory = query.item[51] //Sanitize metadata = sanitize_text(metadata, initial(metadata)) diff --git a/code/modules/research/message_server.dm b/code/modules/research/message_server.dm index 34a10b97f1d..7159f83ab0d 100644 --- a/code/modules/research/message_server.dm +++ b/code/modules/research/message_server.dm @@ -309,12 +309,6 @@ var/obj/machinery/blackbox_recorder/blackbox var/DBQuery/query_insert = dbcon.NewQuery(sql) query_insert.Execute() -// Sanitize inputs to avoid SQL injection attacks -proc/sql_sanitize_text(var/text) - text = replacetext(text, "'", "''") - text = replacetext(text, ";", "") - text = replacetext(text, "&", "") - return text proc/feedback_set(var/variable,var/value) if(!blackbox) return From 45e49de3f849e04e3f45b9a765f344c0764e272e Mon Sep 17 00:00:00 2001 From: Crazylemon64 Date: Sun, 27 Dec 2015 14:33:14 -0800 Subject: [PATCH 21/53] Adds an update proc for the sql DB, run as the DB is loaded There's probably a cooler and more automated, at-once solution to this though --- code/modules/client/preferences.dm | 9 +-- code/modules/client/preferences_mysql.dm | 84 ++++++++++++++++++++++++ 2 files changed, 89 insertions(+), 4 deletions(-) diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index 792482643ef..fcb840a894d 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -56,7 +56,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts #define MAX_SAVE_SLOTS 10 // Save slots for regular players #define MAX_SAVE_SLOTS_MEMBER 10 // Save slots for BYOND members -datum/preferences +/datum/preferences //doohickeys for savefiles // var/path var/default_slot = 1 //Holder so it doesn't default to slot 1, rather the last one used @@ -73,7 +73,6 @@ datum/preferences // var/lastchangelog = "" //Saved changlog filesize to detect if there was a change var/ooccolor = "#b82e00" var/be_special = list() //Special role selection - var/old_be_special = 0 //For converting from the old format var/UI_style = "Midnight" var/toggles = TOGGLES_DEFAULT var/sound = SOUND_DEFAULT @@ -1427,8 +1426,10 @@ datum/preferences if("be_special") var/r = href_list["role"] if(!(r in special_roles)) - message_admins("[user] attempted an href exploit! (This could have possibly lead to a \"Bobby Tables\" exploit, so they're probably up to no good). String: [r] ID: [last_id] IP: [last_ip]") - user << "Nice try." + var/cleaned_r = sql_sanitize_text(r) + if(r != cleaned_r) // hold it right there criminal scum + message_admins("[user] attempted an href exploit! (This could have possibly lead to a \"Bobby Tables\" exploit, so they're probably up to no good). String: [r] ID: [last_id] IP: [last_ip]") + user << "Hold it right there, criminal scum" else be_special ^= r diff --git a/code/modules/client/preferences_mysql.dm b/code/modules/client/preferences_mysql.dm index a8816db68ce..e10c5fb30d4 100644 --- a/code/modules/client/preferences_mysql.dm +++ b/code/modules/client/preferences_mysql.dm @@ -35,6 +35,8 @@ randomslot = text2num(query.item[9]) volume = text2num(query.item[10]) + old_roles_to_new(C) + //Sanitize ooccolor = sanitize_hexcolor(ooccolor, initial(ooccolor)) // lastchangelog = sanitize_text(lastchangelog, initial(lastchangelog)) @@ -50,6 +52,11 @@ /datum/preferences/proc/save_preferences(client/C) + // Might as well scrub out any malformed be_special list entries while we're here + for (var/role in be_special) + if(!(role in special_roles)) + be_special -= role + var/DBQuery/query = dbcon.NewQuery({"UPDATE [format_table_name("player")] SET ooccolor='[ooccolor]', @@ -384,6 +391,83 @@ message_admins("SQL ERROR during character slot saving. Error : \[[err]\]\n") return return 1 + +// If you see this proc lying around and don't know why it's there, expunge it, as this is for a short-term DB update +// 0 on failed update, 1 on success +/datum/preferences/proc/old_roles_to_new(var/client/C) + var/DBQuery/query = dbcon.NewQuery({" + SELECT be_special + FROM [format_table_name("players")] + WHERE ckey='[C.ckey]'"}) + if(!query.Execute()) + var/err = query.ErrorMsg() + log_game("SQL NOTICE: be_special has been purged from the database, bug the coders. Error : \[[err]\]\n") + message_admins("SQL NOTICE: be_special has been purged from the database, bug the coders. Error : \[[err]\]\n") + return 0 + var/old_be_special = query.item[1] + var/B_traitor = 1 + var/B_operative = 2 + var/B_changeling = 4 + var/B_wizard = 8 + var/B_malf = 16 + var/B_rev = 32 + var/B_alien = 64 + var/B_pai = 128 + var/B_cultist = 256 + var/B_ninja = 512 + var/B_raider = 1024 + var/B_vampire = 2048 + var/B_mutineer = 4096 + var/B_blob = 8192 + var/B_shadowling = 16384 + var/B_revenant = 32768 + + var/list/archived = list(B_traitor,B_operative,B_changeling,B_wizard,B_malf,B_rev,B_alien,B_pai,B_cultist,B_ninja,B_raider,B_vampire,B_mutineer,B_blob,B_revenant) + + // meow meow I am the copy cat + for(var/flag in archived) + if(old_be_special & flag) + switch(flag) + // hello i am byond i think constant variables r dumm + if(1) + be_special |= ROLE_TRAITOR + if(2) + be_special |= ROLE_OPERATIVE + if(4) + be_special |= ROLE_CHANGELING + if(8) + be_special |= ROLE_WIZARD + if(16) + be_special |= ROLE_MALF + if(32) + be_special |= ROLE_REV + if(64) + be_special |= ROLE_ALIEN + be_special |= ROLE_SENTIENT + be_special |= ROLE_DEMON + if(128) + be_special |= ROLE_PAI + be_special |= ROLE_POSIBRAIN + be_special |= ROLE_GUARDIAN + if(256) + be_special |= ROLE_CULTIST + if(512) + be_special |= ROLE_NINJA +// be_special |= ROLE_GANG since they will occupy the same ID and all + if(1024) + be_special |= ROLE_RAIDER + if(2048) + be_special |= ROLE_VAMPIRE + if(4096) + be_special |= ROLE_MUTINEER + if(8192) + be_special |= ROLE_BLOB + if(16384) + be_special |= ROLE_SHADOWLING + if(32768) + be_special |= ROLE_REVENANT + return 1 + /* /datum/preferences/proc/random_character(client/C) var/DBQuery/query = dbcon.NewQuery("SELECT slot FROM [format_table_name("characters")] WHERE ckey='[C.ckey]' ORDER BY slot") From 6f631b94c39fdcc3284df90111d1418ed555a92a Mon Sep 17 00:00:00 2001 From: Crazylemon64 Date: Sun, 27 Dec 2015 14:46:11 -0800 Subject: [PATCH 22/53] Reduces the amount of memes in the codebase --- code/modules/client/preferences.dm | 4 ++-- code/modules/client/preferences_mysql.dm | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index fcb840a894d..f343319d88a 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -1427,9 +1427,9 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts var/r = href_list["role"] if(!(r in special_roles)) var/cleaned_r = sql_sanitize_text(r) - if(r != cleaned_r) // hold it right there criminal scum + if(r != cleaned_r) // up to no good message_admins("[user] attempted an href exploit! (This could have possibly lead to a \"Bobby Tables\" exploit, so they're probably up to no good). String: [r] ID: [last_id] IP: [last_ip]") - user << "Hold it right there, criminal scum" + user << "Please don't break the server." else be_special ^= r diff --git a/code/modules/client/preferences_mysql.dm b/code/modules/client/preferences_mysql.dm index e10c5fb30d4..e7a4ef93b33 100644 --- a/code/modules/client/preferences_mysql.dm +++ b/code/modules/client/preferences_mysql.dm @@ -422,7 +422,7 @@ var/B_shadowling = 16384 var/B_revenant = 32768 - var/list/archived = list(B_traitor,B_operative,B_changeling,B_wizard,B_malf,B_rev,B_alien,B_pai,B_cultist,B_ninja,B_raider,B_vampire,B_mutineer,B_blob,B_revenant) + var/list/archived = list(B_traitor,B_operative,B_changeling,B_wizard,B_malf,B_rev,B_alien,B_pai,B_cultist,B_ninja,B_raider,B_vampire,B_mutineer,B_blob,B_shadowling,B_revenant) // meow meow I am the copy cat for(var/flag in archived) From 9bc614ab8e61102d63b6fa7a798be581c5dbaf46 Mon Sep 17 00:00:00 2001 From: Fox-McCloud Date: Sun, 27 Dec 2015 18:58:16 -0500 Subject: [PATCH 23/53] Gas Mixture Refactor and Speedup --- code/LINDA/LINDA_fire.dm | 3 +- code/LINDA/LINDA_turf_tile.dm | 2 +- code/__DEFINES/atmospherics.dm | 2 + code/datums/gas_mixture.dm | 543 +++++++++------------------------ 4 files changed, 141 insertions(+), 409 deletions(-) diff --git a/code/LINDA/LINDA_fire.dm b/code/LINDA/LINDA_fire.dm index b498f073328..837c3795b03 100644 --- a/code/LINDA/LINDA_fire.dm +++ b/code/LINDA/LINDA_fire.dm @@ -83,7 +83,8 @@ volume = affected.fuel_burnt*FIRE_GROWTH_RATE location.assume_air(affected) - for(var/atom/item in loc) + for(var/A in loc) + var/atom/item = A if(item && item != src) // It's possible that the item is deleted in temperature_expose item.fire_act(null, temperature, volume) diff --git a/code/LINDA/LINDA_turf_tile.dm b/code/LINDA/LINDA_turf_tile.dm index b36c5ed82cc..8dc4dc6d794 100644 --- a/code/LINDA/LINDA_turf_tile.dm +++ b/code/LINDA/LINDA_turf_tile.dm @@ -200,7 +200,7 @@ else if(!air.check_turf(enemy_tile, atmos_adjacent_turfs_amount)) - var/difference = air.mimic(enemy_tile,,atmos_adjacent_turfs_amount) + var/difference = air.mimic(enemy_tile,atmos_adjacent_turfs_amount) if(difference) if(difference > 0) consider_pressure_difference(enemy_tile, difference) diff --git a/code/__DEFINES/atmospherics.dm b/code/__DEFINES/atmospherics.dm index cc11a7b1a5f..339b00714f7 100644 --- a/code/__DEFINES/atmospherics.dm +++ b/code/__DEFINES/atmospherics.dm @@ -54,6 +54,8 @@ #define CARBON_LIFEFORM_FIRE_RESISTANCE 200+T0C //Resistance to fire damage #define CARBON_LIFEFORM_FIRE_DAMAGE 4 //Fire damage //Plasma fire properties +#define OXYGEN_BURN_RATE_BASE 1.4 +#define PLASMA_BURN_RATE_DELTA 4 #define PLASMA_MINIMUM_BURN_TEMPERATURE 100+T0C #define PLASMA_UPPER_TEMPERATURE 1370+T0C #define PLASMA_MINIMUM_OXYGEN_NEEDED 2 diff --git a/code/datums/gas_mixture.dm b/code/datums/gas_mixture.dm index ae2ffe184d9..704eb2f04ed 100644 --- a/code/datums/gas_mixture.dm +++ b/code/datums/gas_mixture.dm @@ -14,20 +14,20 @@ What are the archived variables for? #define QUANTIZE(variable) (round(variable,0.0001)) /datum/gas - sleeping_agent - specific_heat = 40 - - oxygen_agent_b - specific_heat = 300 - - volatile_fuel - specific_heat = 30 - var/moles = 0 var/specific_heat = 0 var/moles_archived = 0 +/datum/gas/sleeping_agent + specific_heat = 40 + +/datum/gas/oxygen_agent_b + specific_heat = 300 + +/datum/gas/volatile_fuel + specific_heat = 30 + /datum/gas_mixture var/oxygen = 0 @@ -57,27 +57,27 @@ What are the archived variables for? /datum/gas_mixture/proc/heat_capacity() var/heat_capacity = HEAT_CAPACITY_CALCULATION(oxygen,carbon_dioxide,nitrogen,toxins) - if(trace_gases.len) - for(var/datum/gas/trace_gas in trace_gases) - heat_capacity += trace_gas.moles*trace_gas.specific_heat + for(var/gas in trace_gases) + var/datum/gas/trace_gas = gas + heat_capacity += trace_gas.moles*trace_gas.specific_heat return heat_capacity /datum/gas_mixture/proc/heat_capacity_archived() var/heat_capacity_archived = HEAT_CAPACITY_CALCULATION(oxygen_archived,carbon_dioxide_archived,nitrogen_archived,toxins_archived) - if(trace_gases.len) - for(var/datum/gas/trace_gas in trace_gases) - heat_capacity_archived += trace_gas.moles_archived*trace_gas.specific_heat + for(var/gas in trace_gases) + var/datum/gas/trace_gas = gas + heat_capacity_archived += trace_gas.moles_archived*trace_gas.specific_heat return heat_capacity_archived /datum/gas_mixture/proc/total_moles() var/moles = oxygen + carbon_dioxide + nitrogen + toxins - if(trace_gases.len) - for(var/datum/gas/trace_gas in trace_gases) - moles += trace_gas.moles + for(var/gas in trace_gases) + var/datum/gas/trace_gas = gas + moles += trace_gas.moles return moles @@ -100,6 +100,8 @@ What are the archived variables for? //Procedures used for very specific events + + /datum/gas_mixture/proc/react(atom/dump_location) var/reacting = 0 //set to 1 if a notable reaction occured (used by pipe_network) @@ -161,11 +163,11 @@ What are the archived variables for? else temperature_scale = (temperature-PLASMA_MINIMUM_BURN_TEMPERATURE)/(PLASMA_UPPER_TEMPERATURE-PLASMA_MINIMUM_BURN_TEMPERATURE) if(temperature_scale > 0) - oxygen_burn_rate = 1.4 - temperature_scale + oxygen_burn_rate = OXYGEN_BURN_RATE_BASE - temperature_scale if(oxygen > toxins*PLASMA_OXYGEN_FULLBURN) - plasma_burn_rate = (toxins*temperature_scale)/4 + plasma_burn_rate = (toxins*temperature_scale)/PLASMA_BURN_RATE_DELTA else - plasma_burn_rate = (temperature_scale*(oxygen/PLASMA_OXYGEN_FULLBURN))/4 + plasma_burn_rate = (temperature_scale*(oxygen/PLASMA_OXYGEN_FULLBURN))/PLASMA_BURN_RATE_DELTA if(plasma_burn_rate > MINIMUM_HEAT_CAPACITY) toxins -= plasma_burn_rate oxygen -= plasma_burn_rate*oxygen_burn_rate @@ -190,11 +192,6 @@ What are the archived variables for? //Merges all air from giver into self. Deletes giver. //Returns: 1 on success (no failure cases yet) -/datum/gas_mixture/proc/check_then_merge(datum/gas_mixture/giver) - //Similar to merge(...) but first checks to see if the amount of air assumed is small enough - // that group processing is still accurate for source (aborts if not) - //Returns: 1 on successful merge, 0 if the check failed - /datum/gas_mixture/proc/remove(amount) //Proportionally removes amount of gas from the gas_mixture //Returns: gas_mixture with the gases removed @@ -203,62 +200,25 @@ What are the archived variables for? //Proportionally removes amount of gas from the gas_mixture //Returns: gas_mixture with the gases removed -/datum/gas_mixture/proc/subtract(datum/gas_mixture/right_side) - //Subtracts right_side from air_mixture. Used to help turfs mingle - -/datum/gas_mixture/proc/check_then_remove(amount) - //Similar to remove(...) but first checks to see if the amount of air removed is small enough - // that group processing is still accurate for source (aborts if not) - //Returns: gas_mixture with the gases removed or null - /datum/gas_mixture/proc/copy_from(datum/gas_mixture/sample) //Copies variables from sample /datum/gas_mixture/proc/share(datum/gas_mixture/sharer) //Performs air sharing calculations between two gas_mixtures assuming only 1 boundary length //Return: amount of gas exchanged (+ if sharer received) - -/datum/gas_mixture/proc/mimic(turf/model) +/datum/gas_mixture/proc/mimic(turf/model) //I want this proc to die a painful death //Similar to share(...), except the model is not modified //Return: amount of gas exchanged -/datum/gas_mixture/proc/check_gas_mixture(datum/gas_mixture/sharer) - //Returns: 0 if the self-check failed then -1 if sharer-check failed then 1 if both checks pass - -/datum/gas_mixture/proc/check_turf(turf/model) +/datum/gas_mixture/proc/check_turf(turf/model) //I want this proc to die a painful death //Returns: 0 if self-check failed or 1 if check passes -// check_me_then_share(datum/gas_mixture/sharer) - //Similar to share(...) but first checks to see if amount of air moved is small enough - // that group processing is still accurate for source (aborts if not) - //Returns: 1 on successful share, 0 if the check failed - -// check_me_then_mimic(turf/model) - //Similar to mimic(...) but first checks to see if amount of air moved is small enough - // that group processing is still accurate (aborts if not) - //Returns: 1 on successful mimic, 0 if the check failed - -// check_both_then_share(datum/gas_mixture/sharer) - //Similar to check_me_then_share(...) but also checks to see if amount of air moved is small enough - // that group processing is still accurate for the sharer (aborts if not) - //Returns: 0 if the self-check failed then -1 if sharer-check failed then 1 if successful share - - -/datum/gas_mixture/proc/temperature_mimic(turf/model, conduction_coefficient) +/datum/gas_mixture/proc/temperature_mimic(turf/model, conduction_coefficient) //I want this proc to die a painful death /datum/gas_mixture/proc/temperature_share(datum/gas_mixture/sharer, conduction_coefficient) /datum/gas_mixture/proc/temperature_turf_share(turf/simulated/sharer, conduction_coefficient) - -/datum/gas_mixture/proc/check_me_then_temperature_mimic(turf/model, conduction_coefficient) - -/datum/gas_mixture/proc/check_me_then_temperature_share(datum/gas_mixture/sharer, conduction_coefficient) - -/datum/gas_mixture/proc/check_both_then_temperature_share(datum/gas_mixture/sharer, conduction_coefficient) - -/datum/gas_mixture/proc/check_me_then_temperature_turf_share(turf/simulated/sharer, conduction_coefficient) - /datum/gas_mixture/proc/compare(datum/gas_mixture/sample) //Compares sample to self to see if within acceptable ranges that group processing may be enabled @@ -268,33 +228,14 @@ What are the archived variables for? nitrogen_archived = nitrogen toxins_archived = toxins - if(trace_gases.len) - for(var/datum/gas/trace_gas in trace_gases) - trace_gas.moles_archived = trace_gas.moles + for(var/gas in trace_gases) + var/datum/gas/trace_gas = gas + trace_gas.moles_archived = trace_gas.moles temperature_archived = temperature return 1 -/datum/gas_mixture/check_then_merge(datum/gas_mixture/giver) - if(!giver) - return 0 - if(((giver.oxygen > MINIMUM_AIR_TO_SUSPEND) && (giver.oxygen >= oxygen*MINIMUM_AIR_RATIO_TO_SUSPEND)) \ - || ((giver.carbon_dioxide > MINIMUM_AIR_TO_SUSPEND) && (giver.carbon_dioxide >= carbon_dioxide*MINIMUM_AIR_RATIO_TO_SUSPEND)) \ - || ((giver.nitrogen > MINIMUM_AIR_TO_SUSPEND) && (giver.nitrogen >= nitrogen*MINIMUM_AIR_RATIO_TO_SUSPEND)) \ - || ((giver.toxins > MINIMUM_AIR_TO_SUSPEND) && (giver.toxins >= toxins*MINIMUM_AIR_RATIO_TO_SUSPEND))) - return 0 - if(abs(giver.temperature - temperature) > MINIMUM_TEMPERATURE_DELTA_TO_SUSPEND) - return 0 - - if(giver.trace_gases.len) - for(var/datum/gas/trace_gas in giver.trace_gases) - var/datum/gas/corresponding = locate(trace_gas.type) in trace_gases - if((trace_gas.moles > MINIMUM_AIR_TO_SUSPEND) && (!corresponding || (trace_gas.moles >= corresponding.moles*MINIMUM_AIR_RATIO_TO_SUSPEND))) - return 0 - - return merge(giver) - /datum/gas_mixture/merge(datum/gas_mixture/giver) if(!giver) return 0 @@ -311,15 +252,14 @@ What are the archived variables for? nitrogen += giver.nitrogen toxins += giver.toxins - if(giver.trace_gases.len) - for(var/datum/gas/trace_gas in giver.trace_gases) - var/datum/gas/corresponding = locate(trace_gas.type) in trace_gases - if(!corresponding) - corresponding = new trace_gas.type() - trace_gases += corresponding - corresponding.moles += trace_gas.moles + for(var/gas in giver.trace_gases) + var/datum/gas/trace_gas = gas + var/datum/gas/corresponding = locate(trace_gas.type) in trace_gases + if(!corresponding) + corresponding = new trace_gas.type() + trace_gases += corresponding + corresponding.moles += trace_gas.moles -// qdel(giver) return 1 /datum/gas_mixture/remove(amount) @@ -342,13 +282,13 @@ What are the archived variables for? carbon_dioxide -= removed.carbon_dioxide toxins -= removed.toxins - if(trace_gases.len) - for(var/datum/gas/trace_gas in trace_gases) - var/datum/gas/corresponding = new trace_gas.type() - removed.trace_gases += corresponding + for(var/gas in trace_gases) + var/datum/gas/trace_gas = gas + var/datum/gas/corresponding = new trace_gas.type() + removed.trace_gases += corresponding - corresponding.moles = (trace_gas.moles/sum)*amount - trace_gas.moles -= corresponding.moles + corresponding.moles = (trace_gas.moles/sum)*amount + trace_gas.moles -= corresponding.moles removed.temperature = temperature @@ -373,29 +313,18 @@ What are the archived variables for? carbon_dioxide -= removed.carbon_dioxide toxins -= removed.toxins - if(trace_gases.len) - for(var/datum/gas/trace_gas in trace_gases) - var/datum/gas/corresponding = new trace_gas.type() - removed.trace_gases += corresponding + for(var/gas in trace_gases) + var/datum/gas/trace_gas = gas + var/datum/gas/corresponding = new trace_gas.type() + removed.trace_gases += corresponding - corresponding.moles = trace_gas.moles*ratio - trace_gas.moles -= corresponding.moles + corresponding.moles = trace_gas.moles*ratio + trace_gas.moles -= corresponding.moles removed.temperature = temperature return removed -/datum/gas_mixture/check_then_remove(amount) - - //Since it is all proportional, the check may be done on the gas as a whole - var/sum = total_moles() - amount = min(amount,sum) //Can not take more air than tile has! - - if((amount > MINIMUM_AIR_RATIO_TO_SUSPEND) && (amount > sum*MINIMUM_AIR_RATIO_TO_SUSPEND)) - return 0 - - return remove(amount) - /datum/gas_mixture/copy_from(datum/gas_mixture/sample) oxygen = sample.oxygen carbon_dioxide = sample.carbon_dioxide @@ -403,86 +332,17 @@ What are the archived variables for? toxins = sample.toxins trace_gases.len=null - if(sample.trace_gases.len > 0) - for(var/datum/gas/trace_gas in sample.trace_gases) - var/datum/gas/corresponding = new trace_gas.type() - trace_gases += corresponding + for(var/gas in sample.trace_gases) + var/datum/gas/trace_gas = gas + var/datum/gas/corresponding = new trace_gas.type() + trace_gases += corresponding - corresponding.moles = trace_gas.moles + corresponding.moles = trace_gas.moles temperature = sample.temperature return 1 -/datum/gas_mixture/subtract(datum/gas_mixture/right_side) - oxygen -= right_side.oxygen - carbon_dioxide -= right_side.carbon_dioxide - nitrogen -= right_side.nitrogen - toxins -= right_side.toxins - - if((trace_gases.len > 0)||(right_side.trace_gases.len > 0)) - for(var/datum/gas/trace_gas in right_side.trace_gases) - var/datum/gas/corresponding = locate(trace_gas.type) in trace_gases - if(!corresponding) - corresponding = new trace_gas.type() - trace_gases += corresponding - - corresponding.moles -= trace_gas.moles - - return 1 - -/datum/gas_mixture/check_gas_mixture(datum/gas_mixture/sharer) - if(!sharer) return 0 - var/delta_oxygen = (oxygen_archived - sharer.oxygen_archived)/5 - var/delta_carbon_dioxide = (carbon_dioxide_archived - sharer.carbon_dioxide_archived)/5 - var/delta_nitrogen = (nitrogen_archived - sharer.nitrogen_archived)/5 - var/delta_toxins = (toxins_archived - sharer.toxins_archived)/5 - - var/delta_temperature = (temperature_archived - sharer.temperature_archived) - - if(((abs(delta_oxygen) > MINIMUM_AIR_TO_SUSPEND) && (abs(delta_oxygen) >= oxygen_archived*MINIMUM_AIR_RATIO_TO_SUSPEND)) \ - || ((abs(delta_carbon_dioxide) > MINIMUM_AIR_TO_SUSPEND) && (abs(delta_carbon_dioxide) >= carbon_dioxide_archived*MINIMUM_AIR_RATIO_TO_SUSPEND)) \ - || ((abs(delta_nitrogen) > MINIMUM_AIR_TO_SUSPEND) && (abs(delta_nitrogen) >= nitrogen_archived*MINIMUM_AIR_RATIO_TO_SUSPEND)) \ - || ((abs(delta_toxins) > MINIMUM_AIR_TO_SUSPEND) && (abs(delta_toxins) >= toxins_archived*MINIMUM_AIR_RATIO_TO_SUSPEND))) - return 0 - - if(abs(delta_temperature) > MINIMUM_TEMPERATURE_DELTA_TO_SUSPEND) - return 0 - - if(sharer.trace_gases.len) - for(var/datum/gas/trace_gas in sharer.trace_gases) - if(trace_gas.moles_archived > MINIMUM_AIR_TO_SUSPEND*4) - var/datum/gas/corresponding = locate(trace_gas.type) in trace_gases - if(corresponding) - if(trace_gas.moles_archived >= corresponding.moles_archived*MINIMUM_AIR_RATIO_TO_SUSPEND*4) - return 0 - else - return 0 - - if(trace_gases.len) - for(var/datum/gas/trace_gas in trace_gases) - if(trace_gas.moles_archived > MINIMUM_AIR_TO_SUSPEND*4) - if(!locate(trace_gas.type) in sharer.trace_gases) - return 0 - - if(((abs(delta_oxygen) > MINIMUM_AIR_TO_SUSPEND) && (abs(delta_oxygen) >= sharer.oxygen_archived*MINIMUM_AIR_RATIO_TO_SUSPEND)) \ - || ((abs(delta_carbon_dioxide) > MINIMUM_AIR_TO_SUSPEND) && (abs(delta_carbon_dioxide) >= sharer.carbon_dioxide_archived*MINIMUM_AIR_RATIO_TO_SUSPEND)) \ - || ((abs(delta_nitrogen) > MINIMUM_AIR_TO_SUSPEND) && (abs(delta_nitrogen) >= sharer.nitrogen_archived*MINIMUM_AIR_RATIO_TO_SUSPEND)) \ - || ((abs(delta_toxins) > MINIMUM_AIR_TO_SUSPEND) && (abs(delta_toxins) >= sharer.toxins_archived*MINIMUM_AIR_RATIO_TO_SUSPEND))) - return -1 - - if(trace_gases.len) - for(var/datum/gas/trace_gas in trace_gases) - if(trace_gas.moles_archived > MINIMUM_AIR_TO_SUSPEND*4) - var/datum/gas/corresponding = locate(trace_gas.type) in sharer.trace_gases - if(corresponding) - if(trace_gas.moles_archived >= corresponding.moles_archived*MINIMUM_AIR_RATIO_TO_SUSPEND*4) - return -1 - else - return -1 - - return 1 - /datum/gas_mixture/check_turf(turf/model, atmos_adjacent_turfs = 4) var/delta_oxygen = (oxygen_archived - model.oxygen)/(atmos_adjacent_turfs+1) var/delta_carbon_dioxide = (carbon_dioxide_archived - model.carbon_dioxide)/(atmos_adjacent_turfs+1) @@ -499,14 +359,14 @@ What are the archived variables for? if(abs(delta_temperature) > MINIMUM_TEMPERATURE_DELTA_TO_SUSPEND) return 0 - if(trace_gases.len) - for(var/datum/gas/trace_gas in trace_gases) - if(trace_gas.moles_archived > MINIMUM_AIR_TO_SUSPEND*4) - return 0 + for(var/gas in trace_gases) + var/datum/gas/trace_gas = gas + if(trace_gas.moles_archived > MINIMUM_AIR_TO_SUSPEND*4) + return 0 return 1 -/datum/gas_mixture/proc/check_turf_total(turf/model) +/datum/gas_mixture/proc/check_turf_total(turf/model) //I want this proc to die a painful death var/delta_oxygen = (oxygen - model.oxygen) var/delta_carbon_dioxide = (carbon_dioxide - model.carbon_dioxide) var/delta_nitrogen = (nitrogen - model.nitrogen) @@ -522,14 +382,14 @@ What are the archived variables for? if(abs(delta_temperature) > MINIMUM_TEMPERATURE_DELTA_TO_SUSPEND) return 0 - if(trace_gases.len) - for(var/datum/gas/trace_gas in trace_gases) - if(trace_gas.moles > MINIMUM_AIR_TO_SUSPEND*4) - return 0 + for(var/gas in trace_gases) + var/datum/gas/trace_gas = gas + if(trace_gas.moles > MINIMUM_AIR_TO_SUSPEND*4) + return 0 return 1 -/datum/gas_mixture/share(datum/gas_mixture/sharer, var/atmos_adjacent_turfs = 4) +/datum/gas_mixture/share(datum/gas_mixture/sharer, atmos_adjacent_turfs = 4) if(!sharer) return 0 var/delta_oxygen = QUANTIZE(oxygen_archived - sharer.oxygen_archived)/(atmos_adjacent_turfs+1) var/delta_carbon_dioxide = QUANTIZE(carbon_dioxide_archived - sharer.carbon_dioxide_archived)/(atmos_adjacent_turfs+1) @@ -588,57 +448,54 @@ What are the archived variables for? var/list/trace_types_considered = list() - if(trace_gases.len) - for(var/datum/gas/trace_gas in trace_gases) + for(var/gas in trace_gases) + var/datum/gas/trace_gas = gas + var/datum/gas/corresponding = locate(trace_gas.type) in sharer.trace_gases + var/delta = 0 - var/datum/gas/corresponding = locate(trace_gas.type) in sharer.trace_gases - var/delta = 0 + if(corresponding) + delta = QUANTIZE(trace_gas.moles_archived - corresponding.moles_archived)/(atmos_adjacent_turfs+1) + else + corresponding = new trace_gas.type() + sharer.trace_gases += corresponding - if(corresponding) - delta = QUANTIZE(trace_gas.moles_archived - corresponding.moles_archived)/(atmos_adjacent_turfs+1) + delta = trace_gas.moles_archived/(atmos_adjacent_turfs+1) + + trace_gas.moles -= delta + corresponding.moles += delta + + if(delta) + var/individual_heat_capacity = trace_gas.specific_heat*delta + if(delta > 0) + heat_capacity_self_to_sharer += individual_heat_capacity else - corresponding = new trace_gas.type() - sharer.trace_gases += corresponding + heat_capacity_sharer_to_self -= individual_heat_capacity - delta = trace_gas.moles_archived/(atmos_adjacent_turfs+1) + moved_moles += delta + last_share += abs(delta) - trace_gas.moles -= delta - corresponding.moles += delta + trace_types_considered += trace_gas.type - if(delta) - var/individual_heat_capacity = trace_gas.specific_heat*delta - if(delta > 0) - heat_capacity_self_to_sharer += individual_heat_capacity - else - heat_capacity_sharer_to_self -= individual_heat_capacity + for(var/gas in sharer.trace_gases) + var/datum/gas/trace_gas = gas + if(trace_gas.type in trace_types_considered) + continue + var/datum/gas/corresponding + var/delta = 0 + corresponding = new trace_gas.type() + trace_gases += corresponding - moved_moles += delta - last_share += abs(delta) + delta = trace_gas.moles_archived/5 - trace_types_considered += trace_gas.type + trace_gas.moles -= delta + corresponding.moles += delta + //Guaranteed transfer from sharer to self + var/individual_heat_capacity = trace_gas.specific_heat*delta + heat_capacity_sharer_to_self += individual_heat_capacity - if(sharer.trace_gases.len) - for(var/datum/gas/trace_gas in sharer.trace_gases) - if(trace_gas.type in trace_types_considered) continue - else - var/datum/gas/corresponding - var/delta = 0 - - corresponding = new trace_gas.type() - trace_gases += corresponding - - delta = trace_gas.moles_archived/5 - - trace_gas.moles -= delta - corresponding.moles += delta - - //Guaranteed transfer from sharer to self - var/individual_heat_capacity = trace_gas.specific_heat*delta - heat_capacity_sharer_to_self += individual_heat_capacity - - moved_moles += -delta - last_share += abs(delta) + moved_moles += -delta + last_share += abs(delta) if(abs(delta_temperature) > MINIMUM_TEMPERATURE_DELTA_TO_CONSIDER) var/new_self_heat_capacity = old_self_heat_capacity + heat_capacity_sharer_to_self - heat_capacity_self_to_sharer @@ -658,7 +515,7 @@ What are the archived variables for? var/delta_pressure = temperature_archived*(total_moles() + moved_moles) - sharer.temperature_archived*(sharer.total_moles() - moved_moles) return delta_pressure*R_IDEAL_GAS_EQUATION/volume -/datum/gas_mixture/mimic(turf/model, border_multiplier, var/atmos_adjacent_turfs = 4) +/datum/gas_mixture/mimic(turf/model, atmos_adjacent_turfs = 4) var/delta_oxygen = QUANTIZE(oxygen_archived - model.oxygen)/(atmos_adjacent_turfs+1) var/delta_carbon_dioxide = QUANTIZE(carbon_dioxide_archived - model.carbon_dioxide)/(atmos_adjacent_turfs+1) var/delta_nitrogen = QUANTIZE(nitrogen_archived - model.nitrogen)/(atmos_adjacent_turfs+1) @@ -690,30 +547,22 @@ What are the archived variables for? old_self_heat_capacity = heat_capacity() - if(border_multiplier) - oxygen -= delta_oxygen*border_multiplier - carbon_dioxide -= delta_carbon_dioxide*border_multiplier - nitrogen -= delta_nitrogen*border_multiplier - toxins -= delta_toxins*border_multiplier - else - oxygen -= delta_oxygen - carbon_dioxide -= delta_carbon_dioxide - nitrogen -= delta_nitrogen - toxins -= delta_toxins + oxygen -= delta_oxygen + carbon_dioxide -= delta_carbon_dioxide + nitrogen -= delta_nitrogen + toxins -= delta_toxins var/moved_moles = (delta_oxygen + delta_carbon_dioxide + delta_nitrogen + delta_toxins) last_share = abs(delta_oxygen) + abs(delta_carbon_dioxide) + abs(delta_nitrogen) + abs(delta_toxins) if(trace_gases.len) - for(var/datum/gas/trace_gas in trace_gases) + for(var/gas in trace_gases) + var/datum/gas/trace_gas = gas var/delta = 0 delta = trace_gas.moles_archived/(atmos_adjacent_turfs+1) - if(border_multiplier) - trace_gas.moles -= delta*border_multiplier - else - trace_gas.moles -= delta + trace_gas.moles -= delta var/heat_cap_transferred = delta*trace_gas.specific_heat heat_transferred += heat_cap_transferred*temperature_archived @@ -724,12 +573,9 @@ What are the archived variables for? if(abs(delta_temperature) > MINIMUM_TEMPERATURE_DELTA_TO_CONSIDER) var/new_self_heat_capacity = old_self_heat_capacity - heat_capacity_transferred if(new_self_heat_capacity > MINIMUM_HEAT_CAPACITY) - if(border_multiplier) - temperature = (old_self_heat_capacity*temperature - heat_capacity_transferred*border_multiplier*temperature_archived)/new_self_heat_capacity - else - temperature = (old_self_heat_capacity*temperature - heat_capacity_transferred*temperature_archived)/new_self_heat_capacity + temperature = (old_self_heat_capacity*temperature - heat_capacity_transferred*temperature_archived)/new_self_heat_capacity - temperature_mimic(model, model.thermal_conductivity, border_multiplier) + temperature_mimic(model, model.thermal_conductivity) if((delta_temperature > MINIMUM_TEMPERATURE_TO_MOVE) || abs(moved_moles) > MINIMUM_MOLES_DELTA_TO_MOVE) var/delta_pressure = temperature_archived*(total_moles() + moved_moles) - model.temperature*(model.oxygen+model.carbon_dioxide+model.nitrogen+model.toxins) @@ -737,116 +583,6 @@ What are the archived variables for? else return 0 -/datum/gas_mixture/check_both_then_temperature_share(datum/gas_mixture/sharer, conduction_coefficient) - var/delta_temperature = (temperature_archived - sharer.temperature_archived) - - var/self_heat_capacity = heat_capacity_archived() - var/sharer_heat_capacity = sharer.heat_capacity_archived() - - var/self_temperature_delta = 0 - var/sharer_temperature_delta = 0 - - if((sharer_heat_capacity > MINIMUM_HEAT_CAPACITY) && (self_heat_capacity > MINIMUM_HEAT_CAPACITY)) - var/heat = conduction_coefficient*delta_temperature* \ - (self_heat_capacity*sharer_heat_capacity/(self_heat_capacity+sharer_heat_capacity)) - - self_temperature_delta = -heat/(self_heat_capacity) - sharer_temperature_delta = heat/(sharer_heat_capacity) - else - return 1 - - if((abs(self_temperature_delta) > MINIMUM_TEMPERATURE_DELTA_TO_SUSPEND) \ - && (abs(self_temperature_delta) > MINIMUM_TEMPERATURE_RATIO_TO_SUSPEND*temperature_archived)) - return 0 - - if((abs(sharer_temperature_delta) > MINIMUM_TEMPERATURE_DELTA_TO_SUSPEND) \ - && (abs(sharer_temperature_delta) > MINIMUM_TEMPERATURE_RATIO_TO_SUSPEND*sharer.temperature_archived)) - return -1 - - temperature += self_temperature_delta - sharer.temperature += sharer_temperature_delta - - return 1 - //Logic integrated from: temperature_share(sharer, conduction_coefficient) for efficiency - -/datum/gas_mixture/check_me_then_temperature_share(datum/gas_mixture/sharer, conduction_coefficient) - var/delta_temperature = (temperature_archived - sharer.temperature_archived) - - var/self_heat_capacity = heat_capacity_archived() - var/sharer_heat_capacity = sharer.heat_capacity_archived() - - var/self_temperature_delta = 0 - var/sharer_temperature_delta = 0 - - if((sharer_heat_capacity > MINIMUM_HEAT_CAPACITY) && (self_heat_capacity > MINIMUM_HEAT_CAPACITY)) - var/heat = conduction_coefficient*delta_temperature* \ - (self_heat_capacity*sharer_heat_capacity/(self_heat_capacity+sharer_heat_capacity)) - - self_temperature_delta = -heat/self_heat_capacity - sharer_temperature_delta = heat/sharer_heat_capacity - else - return 1 - - if((abs(self_temperature_delta) > MINIMUM_TEMPERATURE_DELTA_TO_SUSPEND) \ - && (abs(self_temperature_delta) > MINIMUM_TEMPERATURE_RATIO_TO_SUSPEND*temperature_archived)) - return 0 - - temperature += self_temperature_delta - sharer.temperature += sharer_temperature_delta - - return 1 - //Logic integrated from: temperature_share(sharer, conduction_coefficient) for efficiency - -/datum/gas_mixture/check_me_then_temperature_turf_share(turf/simulated/sharer, conduction_coefficient) - var/delta_temperature = (temperature_archived - sharer.temperature) - - var/self_temperature_delta = 0 - var/sharer_temperature_delta = 0 - - if(abs(delta_temperature) > MINIMUM_TEMPERATURE_DELTA_TO_CONSIDER) - var/self_heat_capacity = heat_capacity_archived() - - if((sharer.heat_capacity > MINIMUM_HEAT_CAPACITY) && (self_heat_capacity > MINIMUM_HEAT_CAPACITY)) - var/heat = conduction_coefficient*delta_temperature* \ - (self_heat_capacity*sharer.heat_capacity/(self_heat_capacity+sharer.heat_capacity)) - - self_temperature_delta = -heat/self_heat_capacity - sharer_temperature_delta = heat/sharer.heat_capacity - else - return 1 - - if((abs(self_temperature_delta) > MINIMUM_TEMPERATURE_DELTA_TO_SUSPEND) \ - && (abs(self_temperature_delta) > MINIMUM_TEMPERATURE_RATIO_TO_SUSPEND*temperature_archived)) - return 0 - - temperature += self_temperature_delta - sharer.temperature += sharer_temperature_delta - - return 1 - //Logic integrated from: temperature_turf_share(sharer, conduction_coefficient) for efficiency - -/datum/gas_mixture/check_me_then_temperature_mimic(turf/model, conduction_coefficient) - var/delta_temperature = (temperature_archived - model.temperature) - var/self_temperature_delta = 0 - - if(abs(delta_temperature) > MINIMUM_TEMPERATURE_DELTA_TO_CONSIDER) - var/self_heat_capacity = heat_capacity_archived() - - if((model.heat_capacity > MINIMUM_HEAT_CAPACITY) && (self_heat_capacity > MINIMUM_HEAT_CAPACITY)) - var/heat = conduction_coefficient*delta_temperature* \ - (self_heat_capacity*model.heat_capacity/(self_heat_capacity+model.heat_capacity)) - - self_temperature_delta = -heat/self_heat_capacity - - if((abs(self_temperature_delta) > MINIMUM_TEMPERATURE_DELTA_TO_SUSPEND) \ - && (abs(self_temperature_delta) > MINIMUM_TEMPERATURE_RATIO_TO_SUSPEND*temperature_archived)) - return 0 - - temperature += self_temperature_delta - - return 1 - //Logic integrated from: temperature_mimic(model, conduction_coefficient) for efficiency - /datum/gas_mixture/temperature_share(datum/gas_mixture/sharer, conduction_coefficient) var/delta_temperature = (temperature_archived - sharer.temperature_archived) @@ -861,19 +597,16 @@ What are the archived variables for? temperature -= heat/self_heat_capacity sharer.temperature += heat/sharer_heat_capacity -/datum/gas_mixture/temperature_mimic(turf/model, conduction_coefficient, border_multiplier) +/datum/gas_mixture/temperature_mimic(turf/model, conduction_coefficient) var/delta_temperature = (temperature - model.temperature) if(abs(delta_temperature) > MINIMUM_TEMPERATURE_DELTA_TO_CONSIDER) - var/self_heat_capacity = heat_capacity()//_archived() + var/self_heat_capacity = heat_capacity() if((model.heat_capacity > MINIMUM_HEAT_CAPACITY) && (self_heat_capacity > MINIMUM_HEAT_CAPACITY)) var/heat = conduction_coefficient*delta_temperature* \ (self_heat_capacity*model.heat_capacity/(self_heat_capacity+model.heat_capacity)) - if(border_multiplier) - temperature -= heat*border_multiplier/self_heat_capacity - else - temperature -= heat/self_heat_capacity + temperature -= heat/self_heat_capacity /datum/gas_mixture/temperature_turf_share(turf/simulated/sharer, conduction_coefficient) var/delta_temperature = (temperature_archived - sharer.temperature) @@ -904,35 +637,33 @@ What are the archived variables for? if(total_moles() > MINIMUM_AIR_TO_SUSPEND) if((abs(temperature-sample.temperature) > MINIMUM_TEMPERATURE_DELTA_TO_SUSPEND) && \ ((temperature < (1-MINIMUM_TEMPERATURE_RATIO_TO_SUSPEND)*sample.temperature) || (temperature > (1+MINIMUM_TEMPERATURE_RATIO_TO_SUSPEND)*sample.temperature))) - //world << "temp fail [temperature] & [sample.temperature]" return 0 - if(sample.trace_gases.len) - for(var/datum/gas/trace_gas in sample.trace_gases) - if(trace_gas.moles_archived > MINIMUM_AIR_TO_SUSPEND) - var/datum/gas/corresponding = locate(trace_gas.type) in trace_gases - if(corresponding) - if((abs(trace_gas.moles - corresponding.moles) > MINIMUM_AIR_TO_SUSPEND) && \ - ((corresponding.moles < (1-MINIMUM_AIR_RATIO_TO_SUSPEND)*trace_gas.moles) || (corresponding.moles > (1+MINIMUM_AIR_RATIO_TO_SUSPEND)*trace_gas.moles))) - return 0 - else + for(var/gas in sample.trace_gases) + var/datum/gas/trace_gas = gas + if(trace_gas.moles_archived > MINIMUM_AIR_TO_SUSPEND) + var/datum/gas/corresponding = locate(trace_gas.type) in trace_gases + if(corresponding) + if((abs(trace_gas.moles - corresponding.moles) > MINIMUM_AIR_TO_SUSPEND) && \ + ((corresponding.moles < (1-MINIMUM_AIR_RATIO_TO_SUSPEND)*trace_gas.moles) || (corresponding.moles > (1+MINIMUM_AIR_RATIO_TO_SUSPEND)*trace_gas.moles))) return 0 + else + return 0 - if(trace_gases.len) - for(var/datum/gas/trace_gas in trace_gases) - if(trace_gas.moles > MINIMUM_AIR_TO_SUSPEND) - var/datum/gas/corresponding = locate(trace_gas.type) in sample.trace_gases - if(corresponding) - if((abs(trace_gas.moles - corresponding.moles) > MINIMUM_AIR_TO_SUSPEND) && \ - ((trace_gas.moles < (1-MINIMUM_AIR_RATIO_TO_SUSPEND)*corresponding.moles) || (trace_gas.moles > (1+MINIMUM_AIR_RATIO_TO_SUSPEND)*corresponding.moles))) - return 0 - else + for(var/gas in trace_gases) + var/datum/gas/trace_gas = gas + if(trace_gas.moles > MINIMUM_AIR_TO_SUSPEND) + var/datum/gas/corresponding = locate(trace_gas.type) in sample.trace_gases + if(corresponding) + if((abs(trace_gas.moles - corresponding.moles) > MINIMUM_AIR_TO_SUSPEND) && \ + ((trace_gas.moles < (1-MINIMUM_AIR_RATIO_TO_SUSPEND)*corresponding.moles) || (trace_gas.moles > (1+MINIMUM_AIR_RATIO_TO_SUSPEND)*corresponding.moles))) return 0 + else + return 0 return 1 - //Takes the amount of the gas you want to PP as an argument //So I don't have to do some hacky switches/defines/magic strings @@ -942,15 +673,13 @@ What are the archived variables for? //Does handle trace gases! -/datum/gas_mixture/proc/get_breath_partial_pressure(var/gas_pressure) - var/breath_pressure = (total_moles()*R_IDEAL_GAS_EQUATION*temperature)/BREATH_VOLUME - return (gas_pressure/total_moles())*breath_pressure +/datum/gas_mixture/proc/get_breath_partial_pressure(gas_pressure) + return (gas_pressure*R_IDEAL_GAS_EQUATION*temperature)/BREATH_VOLUME //Reverse of the above -/datum/gas_mixture/proc/get_true_breath_pressure(var/breath_pp) - var/breath_pressure = (total_moles()/R_IDEAL_GAS_EQUATION/temperature)*BREATH_VOLUME - return (breath_pp/breath_pressure*total_moles()) +/datum/gas_mixture/proc/get_true_breath_pressure(breath_pp) + return (breath_pp*BREATH_VOLUME)/(R_IDEAL_GAS_EQUATION*temperature) //Mathematical proofs: /* From 9cb84e83cac42b90a16e1768c952dfbcda38a700 Mon Sep 17 00:00:00 2001 From: Tigercat2000 Date: Sun, 27 Dec 2015 15:58:41 -0800 Subject: [PATCH 24/53] Clean old shit, delete old files, move files, mrowl --- code/game/jobs/departments.dm | 1 - code/game/json.dm | 100 --- code/game/machinery/computer/lockdown.dm | 153 ---- code/game/machinery/computer/prisonshuttle.dm | 245 ------ code/game/machinery/laprecharger.dm | 101 --- code/game/machinery/records_scanner.dm | 135 ---- code/game/machinery/walllockers.dm | 33 - .../mecha/equipment/tools/unused_tools.dm | 157 ---- code/game/mecha/mech_sensor.dm | 94 --- code/game/objects/items/weapons/game_kit.dm | 139 ---- .../items/weapons/surgery_limbattachment.dm | 71 -- code/game/objects/items/weapons/syndie.dm | 84 -- code/game/socket_talk.dm | 26 - code/game/structure/flora.dm | 196 ----- code/game/vehicles/vehicle.dm | 189 ----- code/game/verbs/AI_status.dm | 22 - code/modules/admin/admin_report.dm | 180 ----- .../modules/awaymissions/maploader/fromdmp.dm | 237 ------ code/modules/clothing/spacesuits/captain.dm | 29 - code/modules/destilery/main.dm | 290 ------- code/modules/economy/cash.dm | 50 -- code/modules/ext_scripts/github.dm | 0 code/modules/games/cards.dm | 222 ------ code/modules/liquid/splash_simulation.dm | 209 ----- .../mob/living/carbon/alien/humanoid/hud.dm | 242 ------ .../mob/living/carbon/alien/larva/login.dm | 3 - .../mob/living/carbon/alien/special/_main.dm | 71 -- .../living/carbon/alien/special/snakeman.dm | 59 -- code/modules/mob/living/carbon/human/hud.dm | 528 ------------- code/modules/mob/living/carbon/metroid/hud.dm | 2 - code/modules/mob/living/silicon/mommi/life.dm | 280 ------- .../modules/mob/living/silicon/mommi/mommi.dm | 536 ------------- code/modules/mob/living/silicon/robot/hud.dm | 171 ---- .../modules/mob/living/silicon/robot/wires.dm | 149 ---- code/modules/mob/living/simple_animal/head.dm | 59 -- .../mob/living/simple_animal/kobold.dm | 33 - code/modules/mob/mob_cleanup.dm | 199 ----- code/modules/power/antimatter/black_hole.dm | 88 --- code/modules/power/antimatter/computer.dm | 95 --- .../power/antimatter/containment_jar.dm | 41 - code/modules/power/antimatter/control.dm | 339 -------- code/modules/power/antimatter/engine.dm | 207 ----- code/modules/power/antimatter/fuel.dm | 99 --- code/modules/power/antimatter/shielding.dm | 221 ------ .../reagent_containers/food/snacks/grown.dm | 734 ------------------ code/modules/scripting/IDE.dm | 195 ----- code/modules/scripting/stack.dm | 26 - code/modules/surgery/eye.dm | 144 ---- code/modules/virus2/biohazard destroyer.dm | 20 - code/test.dm | 51 -- {code => interface}/stylesheet.dm | 0 paradise.dme | 2 +- 52 files changed, 1 insertion(+), 7556 deletions(-) delete mode 100644 code/game/jobs/departments.dm delete mode 100644 code/game/json.dm delete mode 100644 code/game/machinery/computer/lockdown.dm delete mode 100644 code/game/machinery/computer/prisonshuttle.dm delete mode 100644 code/game/machinery/laprecharger.dm delete mode 100644 code/game/machinery/records_scanner.dm delete mode 100644 code/game/machinery/walllockers.dm delete mode 100644 code/game/mecha/equipment/tools/unused_tools.dm delete mode 100644 code/game/mecha/mech_sensor.dm delete mode 100644 code/game/objects/items/weapons/game_kit.dm delete mode 100644 code/game/objects/items/weapons/surgery_limbattachment.dm delete mode 100644 code/game/objects/items/weapons/syndie.dm delete mode 100644 code/game/socket_talk.dm delete mode 100644 code/game/structure/flora.dm delete mode 100644 code/game/vehicles/vehicle.dm delete mode 100644 code/game/verbs/AI_status.dm delete mode 100644 code/modules/admin/admin_report.dm delete mode 100644 code/modules/awaymissions/maploader/fromdmp.dm delete mode 100644 code/modules/clothing/spacesuits/captain.dm delete mode 100644 code/modules/destilery/main.dm delete mode 100644 code/modules/economy/cash.dm delete mode 100644 code/modules/ext_scripts/github.dm delete mode 100644 code/modules/games/cards.dm delete mode 100644 code/modules/liquid/splash_simulation.dm delete mode 100644 code/modules/mob/living/carbon/alien/humanoid/hud.dm delete mode 100644 code/modules/mob/living/carbon/alien/larva/login.dm delete mode 100644 code/modules/mob/living/carbon/alien/special/_main.dm delete mode 100644 code/modules/mob/living/carbon/alien/special/snakeman.dm delete mode 100644 code/modules/mob/living/carbon/human/hud.dm delete mode 100644 code/modules/mob/living/carbon/metroid/hud.dm delete mode 100644 code/modules/mob/living/silicon/mommi/life.dm delete mode 100644 code/modules/mob/living/silicon/mommi/mommi.dm delete mode 100644 code/modules/mob/living/silicon/robot/hud.dm delete mode 100644 code/modules/mob/living/silicon/robot/wires.dm delete mode 100644 code/modules/mob/living/simple_animal/head.dm delete mode 100644 code/modules/mob/living/simple_animal/kobold.dm delete mode 100644 code/modules/mob/mob_cleanup.dm delete mode 100644 code/modules/power/antimatter/black_hole.dm delete mode 100644 code/modules/power/antimatter/computer.dm delete mode 100644 code/modules/power/antimatter/containment_jar.dm delete mode 100644 code/modules/power/antimatter/control.dm delete mode 100644 code/modules/power/antimatter/engine.dm delete mode 100644 code/modules/power/antimatter/fuel.dm delete mode 100644 code/modules/power/antimatter/shielding.dm delete mode 100644 code/modules/reagents/reagent_containers/food/snacks/grown.dm delete mode 100644 code/modules/scripting/IDE.dm delete mode 100644 code/modules/scripting/stack.dm delete mode 100644 code/modules/surgery/eye.dm delete mode 100644 code/modules/virus2/biohazard destroyer.dm delete mode 100644 code/test.dm rename {code => interface}/stylesheet.dm (100%) diff --git a/code/game/jobs/departments.dm b/code/game/jobs/departments.dm deleted file mode 100644 index f424d03a1a3..00000000000 --- a/code/game/jobs/departments.dm +++ /dev/null @@ -1 +0,0 @@ -var/list/departments = list("Command", "Medical", "Engineering", "Security", "Civilian", "Cargo") \ No newline at end of file diff --git a/code/game/json.dm b/code/game/json.dm deleted file mode 100644 index 340ffa23f93..00000000000 --- a/code/game/json.dm +++ /dev/null @@ -1,100 +0,0 @@ - -var/jsonpath = "/home/bay12/public_html" -var/dmepath = "/home/bay12/git/baystation12.dme" -var/makejson = 1 //temp -proc/makejson() - - if(!makejson) - return - fdel("[jsonpath]/info.json") - //usr << "Error cant delete json" - //else - //usr << "Deleted json in public html" - fdel("info.json") - //usr << "error cant delete local json" - //else - //usr << "Deleted local json" - var/F = file("info.json") - if(!isfile(F)) - return - var/mode - if(ticker) - if(ticker.current_state == 1) - mode = "Round Setup" - else if(ticker.hide_mode) - mode = "SECRET" - else - mode = master_mode - var/playerscount = 0 - var/players = "" - var/admins = "no" - for(var/client/C) - playerscount++ - if(C.holder && C.holder.level >= 0) // make sure retired admins don't make nt think admins are on - if(!C.stealth) - admins = "yes" - players += "[C.key];" - else - players += "[C.fakekey];" - else - players += "[C.key];" - F << "{\"mode\":\"[mode]\",\"players\" : \"[players]\",\"playercount\" : \"[playerscount]\",\"admin\" : \"[admins]\",\"time\" : \"[time2text(world.realtime,"MM/DD - hh:mm")]\"}" - fcopy("info.json","[jsonpath]/info.json") - -/proc/switchmap(newmap,newpath) - var/oldmap - var/obj/mapinfo/M = locate() - - if(M) - oldmap = M.mapname - - else - message_admins("Did not locate mapinfo object. Go bug the mapper to add a /obj/mapinfo to their map!\n For now, you can probably spawn one manually. If you do, be sure to set it's mapname var correctly, or else you'll just get an error again.") - return - - message_admins("Current map: [oldmap]") - var/text = file2text(dmepath) - var/path = "#include \"maps/[oldmap].dmm\"" - var/xpath = "#include \"maps/[newpath].dmm\"" - var/loc = findtext(text,path,1,0) - if(!loc) - path = "#include \"maps\\[oldmap].dmm\"" - xpath = "#include \"maps\\[newpath].dmm\"" - loc = findtext(text,path,1,0) - if(!loc) - message_admins("Could not find '#include \"maps\\[oldmap].dmm\"' or '\"maps/[oldmap].dmm\"' in the bs12.dme. The mapinfo probably has an incorrect mapname var. Alternatively, could not find the .dme itself, at [dmepath].") - return - - var/rest = copytext(text, loc + length(path)) - text = copytext(text,1,loc) - text += "\n[xpath]" - text += rest -/* for(var/A in lines) - if(findtext(A,path,1,0)) - lineloc = lines.Find(A,1,0) - lines[lineloc] = xpath - world << "FOUND"*/ - fdel(dmepath) - var/file = file(dmepath) - file << text - message_admins("Compiling...") - shell("./recompile") - message_admins("Done") - world.Reboot("Switching to [newmap]") - -obj/mapinfo - invisibility = 101 - var/mapname = "thismap" - var/decks = 4 -proc/GetMapInfo() -// var/obj/mapinfo/M = locate() -// Just removing these to try and fix the occasional JSON -> WORLD issue. -// world << M.name -// world << M.mapname -client/proc/ChangeMap(var/X as text) - set name = "Change Map" - set category = "Admin" - switchmap(X,X) -proc/send2adminirc(channel,msg) - world << channel << " "<< msg - shell("python nudge.py '[channel]' [msg]") \ No newline at end of file diff --git a/code/game/machinery/computer/lockdown.dm b/code/game/machinery/computer/lockdown.dm deleted file mode 100644 index 1e81af168ae..00000000000 --- a/code/game/machinery/computer/lockdown.dm +++ /dev/null @@ -1,153 +0,0 @@ -//this computer displays status and remotely activates multiple shutters / blast doors -//todo: lock / electrify specified area doors? might be a bit gamebreaking - -/obj/machinery/computer/lockdown - //for reference - /*name = "Lockdown Control" - desc = "Used to control blast doors." - icon_state = "lockdown" - circuit = "/obj/item/weapon/circuitboard/lockdown" - var/connected_doors - var/department*/ - var/list/displayedNetworks - - New() - ..() - connected_doors = new/list() - displayedNetworks = new/list() - //only load blast doors for map-defined departments for the moment - //door networks are hardcoded here. - switch(department) - if("Engineering") - connected_doors.Add("Engineering") - //Antiqua Engineering - connected_doors.Add("Reactor core") - connected_doors.Add("Control Room") - connected_doors.Add("Vent Seal") - connected_doors.Add("Rig Storage") - connected_doors.Add("Fore Port Shutters") - connected_doors.Add("Fore Starboard Shutters") - connected_doors.Add("Electrical Storage Shutters") - connected_doors.Add("Locker Room Shutters") - connected_doors.Add("Breakroom Shutters") - connected_doors.Add("Observation Shutters") - //exodus engineering - if("Medbay") - //Exodus Medbay - connected_doors.Add("Genetics Outer Shutters") - connected_doors.Add("Genetics Inner Shutters") - connected_doors.Add("Chemistry Outer Shutters") - connected_doors.Add("Observation Shutters") - connected_doors.Add("Patient Room 1 Shutters") - connected_doors.Add("Patient Room 2 Shutters") - connected_doors.Add("Patient Room 3 Shutters") - - for(var/net in connected_doors) - connected_doors[net] = new/list() - - //loop through the world, grabbing all the relevant doors - spawn(1) - ConnectDoors() - - proc/ConnectDoors() - for(var/list/L in connected_doors) - for(var/item in L) - L.Remove(item) - // - for(var/obj/machinery/door/poddoor/D in world) - if(D.network in connected_doors) - var/list/L = connected_doors[D.network] - L.Add(D) - - attack_ai(mob/user) - attack_hand(user) - - attack_hand(mob/user) - add_fingerprint(user) - if(stat & (BROKEN|NOPOWER)) - return - - if ( (get_dist(src, user) > 1 ) || (stat & (BROKEN|NOPOWER)) ) - if (!istype(user, /mob/living/silicon)) - user.machine = null - user << browse(null, "window=lockdown") - return - - var/t = "Lockdown Control
    " - t += "Refresh
    " - t += "Close
    " - t += "
    Name Brute damage Injuries Brute damage Injuries
    {{:value.name}}
    {{if value.damage > 0}} {{else}} {{/if}} {{:value.damage}} - {{if value.germ_level > 100}} - {{if value.germ_level < 300}} - mild infection
    - {{else value.germ_level < 400}} - mild infection+
    - {{else value.germ_level < 500}} - mild infection++
    - {{else value.germ_level < 700}} - acute Infection
    - {{else value.germ_level < 800}} - acute Infection+
    - {{else value.germ_level < 900}} - acute Infection++
    - {{else value.germ_level >= 900}} - septic
    +
    {{:helper.displayBar(value.damage, 0, value.maxHealth, (value.damage < value.bruised) ? 'notgood' : (value.damage < value.broken) ? 'average' : 'bad', value.damage) }} + {{if value.germ_level > 100}} + {{if value.germ_level < 300}} + mild infection
    + {{else value.germ_level < 400}} + mild infection+
    + {{else value.germ_level < 500}} + mild infection++
    + {{else value.germ_level < 700}} + acute Infection
    + {{else value.germ_level < 800}} + acute Infection+
    + {{else value.germ_level < 900}} + acute Infection++
    + {{else value.germ_level >= 900}} + septic
    {{/if}} {{/if}}
    " - var/empty = 1 - for(var/curNetId in connected_doors) - var/list/L = connected_doors[curNetId] - if(!L || L.len == 0) - continue - empty = 0 - t += "" - if(curNetId in displayedNetworks) - t += "" - t += "" - t += "" - - for(var/obj/machinery/door/poddoor/D in connected_doors[curNetId]) - t += "" - t += "" - - if(istype(D,/obj/machinery/door/poddoor/shutters)) - t += "" - else - t += "" - t += "" - t += "" - else - t += "" - t += "
    \[-\] " + curNetId + "Open all / Close all
    [D.id]Shutter ([D.density ? "Closed" : "Open"])Blast door ([D.density ? "Closed" : "Open"])Toggle
    \[+\] " + curNetId + "
    " - if(empty) - t += "\red No networks connected.
    " - t += "Refresh
    " - t += "Close
    " - user << browse(t, "window=lockdown;size=550x600") - onclose(user, "lockdown") - - Topic(href, href_list) - ..() - - if( href_list["close"] ) - usr << browse(null, "window=lockdown") - usr.machine = null - - if( href_list["show_net"] ) - displayedNetworks.Add(href_list["show_net"]) - updateDialog() - - if( href_list["hide_net"] ) - if(href_list["hide_net"] in displayedNetworks) - displayedNetworks.Remove(href_list["hide_net"]) - updateDialog() - - if( href_list["toggle_id"] ) - var/idTag = href_list["toggle_id"] - for(var/net in connected_doors) - for(var/obj/machinery/door/poddoor/D in connected_doors[net]) - if(D.id == idTag) - if(D.density) - D.open() - else - D.close() - break - - if( href_list["open_net"] ) - var/netTag = href_list["open_net"] - for(var/obj/machinery/door/poddoor/D in connected_doors[netTag]) - if(D.density) //for some reason, there's no var saying whether the door is open or not >.> - spawn(0) - D.open() - - if( href_list["close_net"] ) - var/netTag = href_list["close_net"] - for(var/obj/machinery/door/poddoor/D in connected_doors[netTag]) - if(!D.density) - spawn(0) - D.close() - - src.updateDialog() diff --git a/code/game/machinery/computer/prisonshuttle.dm b/code/game/machinery/computer/prisonshuttle.dm deleted file mode 100644 index 4a70b1f74f2..00000000000 --- a/code/game/machinery/computer/prisonshuttle.dm +++ /dev/null @@ -1,245 +0,0 @@ -//Config stuff -#define PRISON_MOVETIME 150 //Time to station is milliseconds. -#define PRISON_STATION_AREATYPE "/area/shuttle/prison/station" //Type of the prison shuttle area for station -#define PRISON_DOCK_AREATYPE "/area/shuttle/prison/prison" //Type of the prison shuttle area for dock - -var/prison_shuttle_moving_to_station = 0 -var/prison_shuttle_moving_to_prison = 0 -var/prison_shuttle_at_station = 0 -var/prison_shuttle_can_send = 1 -var/prison_shuttle_time = 0 -var/prison_shuttle_timeleft = 0 - -/obj/machinery/computer/prison_shuttle - name = "prison shuttle console" - icon = 'icons/obj/computer.dmi' - icon_keyboard = "security_key" - icon_screen = "syndishuttle" - light_color = LIGHT_COLOR_PURE_CYAN - req_access = list(access_security) - circuit = /obj/item/weapon/circuitboard/prison_shuttle - var/temp = null - var/hacked = 0 - var/allowedtocall = 0 - var/prison_break = 0 - - - attackby(I as obj, user as mob, params) - return src.attack_hand(user) - - - attack_ai(var/mob/user as mob) - return src.attack_hand(user) - - - - attackby(I as obj, user as mob, params) - if(istype(I, /obj/item/weapon/screwdriver)) - playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) - if(do_after(user, 20, target = src)) - var/obj/structure/computerframe/A = new /obj/structure/computerframe( src.loc ) - var/obj/item/weapon/circuitboard/prison_shuttle/M = new /obj/item/weapon/circuitboard/prison_shuttle( A ) - for (var/obj/C in src) - C.loc = src.loc - A.circuit = M - A.anchored = 1 - - if (src.stat & BROKEN) - user << "\blue The broken glass falls out." - new /obj/item/weapon/shard(loc) - A.state = 3 - A.icon_state = "3" - else - user << "\blue You disconnect the monitor." - A.state = 4 - A.icon_state = "4" - - qdel(src) - else if(istype(I,/obj/item/weapon/card/emag) && (!hacked)) - hacked = 1 - user << "\blue You disable the lock." - else - return src.attack_hand(user) - - - attack_hand(var/mob/user as mob) - if(!src.allowed(user) && (!hacked)) - user << "\red Access Denied." - return - if(prison_break) - user << "\red Unable to locate shuttle." - return - if(..()) - return - user.set_machine(src) - post_signal("prison") - var/dat - if (src.temp) - dat = src.temp - else - dat += {"
    Prison Shuttle
    - \nLocation: [prison_shuttle_moving_to_station || prison_shuttle_moving_to_prison ? "Moving to station ([prison_shuttle_timeleft] Secs.)":prison_shuttle_at_station ? "Station":"Dock"]
    - [prison_shuttle_moving_to_station || prison_shuttle_moving_to_prison ? "\n*Shuttle already called*
    \n
    ":prison_shuttle_at_station ? "\nSend to Dock
    \n
    ":"\nSend to station
    \n
    "] - \nClose"} - - user << browse(dat, "window=computer;size=575x450") - onclose(user, "computer") - return - - - Topic(href, href_list) - if(..()) - return - - if ((usr.contents.Find(src) || (in_range(src, usr) && istype(src.loc, /turf))) || (istype(usr, /mob/living/silicon))) - usr.set_machine(src) - - if (href_list["sendtodock"]) - if (!prison_can_move()) - usr << "\red The prison shuttle is unable to leave." - return - if(!prison_shuttle_at_station|| prison_shuttle_moving_to_station || prison_shuttle_moving_to_prison) return - post_signal("prison") - usr << "\blue The prison shuttle has been called and will arrive in [(PRISON_MOVETIME/10)] seconds." - src.temp += "Shuttle sent.

    OK" - src.updateUsrDialog() - prison_shuttle_moving_to_prison = 1 - prison_shuttle_time = world.timeofday + PRISON_MOVETIME - spawn(0) - prison_process() - - else if (href_list["sendtostation"]) - if (!prison_can_move()) - usr << "\red The prison shuttle is unable to leave." - return - if(prison_shuttle_at_station || prison_shuttle_moving_to_station || prison_shuttle_moving_to_prison) return - post_signal("prison") - usr << "\blue The prison shuttle has been called and will arrive in [(PRISON_MOVETIME/10)] seconds." - src.temp += "Shuttle sent.

    OK" - src.updateUsrDialog() - prison_shuttle_moving_to_station = 1 - prison_shuttle_time = world.timeofday + PRISON_MOVETIME - spawn(0) - prison_process() - - else if (href_list["mainmenu"]) - src.temp = null - - src.add_fingerprint(usr) - src.updateUsrDialog() - return - - - proc/prison_can_move() - if(prison_shuttle_moving_to_station || prison_shuttle_moving_to_prison) return 0 - else return 1 - - - proc/prison_break() - switch(prison_break) - if (0) - if(!prison_shuttle_at_station || prison_shuttle_moving_to_prison) return - - prison_shuttle_moving_to_prison = 1 - prison_shuttle_at_station = prison_shuttle_at_station - - if (!prison_shuttle_moving_to_prison || !prison_shuttle_moving_to_station) - prison_shuttle_time = world.timeofday + PRISON_MOVETIME - spawn(0) - prison_process() - prison_break = 1 - if(1) - prison_break = 0 - - - proc/post_signal(var/command) - var/datum/radio_frequency/frequency = radio_controller.return_frequency(1311) - if(!frequency) return - var/datum/signal/status_signal = new - status_signal.source = src - status_signal.transmission_method = 1 - status_signal.data["command"] = command - frequency.post_signal(src, status_signal) - return - - - proc/prison_process() - while(prison_shuttle_time - world.timeofday > 0) - var/ticksleft = prison_shuttle_time - world.timeofday - - if(ticksleft > 1e5) - prison_shuttle_time = world.timeofday + 10 // midnight rollover - - prison_shuttle_timeleft = (ticksleft / 10) - sleep(5) - prison_shuttle_moving_to_station = 0 - prison_shuttle_moving_to_prison = 0 - - switch(prison_shuttle_at_station) - - if(0) - prison_shuttle_at_station = 1 - if (prison_shuttle_moving_to_station || prison_shuttle_moving_to_prison) return - - if (!prison_can_move()) - usr << "\red The prison shuttle is unable to leave." - return - - var/area/start_location = locate(/area/shuttle/prison/prison) - var/area/end_location = locate(/area/shuttle/prison/station) - - var/list/dstturfs = list() - var/throwy = world.maxy - - for(var/turf/T in end_location) - dstturfs += T - if(T.y < throwy) - throwy = T.y - // hey you, get out of the way! - for(var/turf/T in dstturfs) - // find the turf to move things to - var/turf/D = locate(T.x, throwy - 1, 1) - //var/turf/E = get_step(D, SOUTH) - for(var/atom/movable/AM as mob|obj in T) - AM.Move(D) - if(istype(T, /turf/simulated)) - qdel(T) - start_location.move_contents_to(end_location) - - if(1) - prison_shuttle_at_station = 0 - if (prison_shuttle_moving_to_station || prison_shuttle_moving_to_prison) return - - if (!prison_can_move()) - usr << "\red The prison shuttle is unable to leave." - return - - var/area/start_location = locate(/area/shuttle/prison/station) - var/area/end_location = locate(/area/shuttle/prison/prison) - - var/list/dstturfs = list() - var/throwy = world.maxy - - for(var/turf/T in end_location) - dstturfs += T - if(T.y < throwy) - throwy = T.y - - // hey you, get out of the way! - for(var/turf/T in dstturfs) - // find the turf to move things to - var/turf/D = locate(T.x, throwy - 1, 1) - //var/turf/E = get_step(D, SOUTH) - for(var/atom/movable/AM as mob|obj in T) - AM.Move(D) - if(istype(T, /turf/simulated)) - qdel(T) - - for(var/mob/living/carbon/bug in end_location) // If someone somehow is still in the shuttle's docking area... - bug.gib() - - for(var/mob/living/simple_animal/pest in end_location) // And for the other kind of bug... - pest.gib() - - start_location.move_contents_to(end_location) - return \ No newline at end of file diff --git a/code/game/machinery/laprecharger.dm b/code/game/machinery/laprecharger.dm deleted file mode 100644 index cafd5e3d297..00000000000 --- a/code/game/machinery/laprecharger.dm +++ /dev/null @@ -1,101 +0,0 @@ -//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:31 - -/obj/machinery/laprecharger - name = "laptop recharger" - icon = 'icons/obj/stationobjs.dmi' - icon_state = "recharger0" - anchored = 1 - use_power = 1 - idle_power_usage = 40 - active_power_usage = 2500 - var/obj/item/charging = null - var/icon_state_charged = "recharger2" - var/icon_state_charging = "recharger1" - var/icon_state_idle = "recharger0" - -/obj/machinery/laprecharger/attackby(obj/item/weapon/G as obj, mob/user as mob, params) - if(istype(user,/mob/living/silicon)) - return - if(istype(G, /obj/item/weapon/gun/energy) || istype(G, /obj/item/weapon/melee/baton)) - user << "\red The laptop recharger blinks red as you try to insert the item!" - return - if(istype(G,/obj/item/device/laptop)) - if(charging) - return - - - // Checks to make sure he's not in space doing it, and that the area got proper power. - var/area/a = get_area(src) - if(!isarea(a)) - user << "\red The [name] blinks red as you try to insert the item!" - return - if(a.power_equip == 0) - user << "\red The [name] blinks red as you try to insert the item!" - return - - if(istype(G, /obj/item/device/laptop)) - var/obj/item/device/laptop/L = G - if(!L.stored_computer.battery) - user << "There's no battery in it!" - return - user.drop_item() - G.loc = src - charging = G - use_power = 2 - update_icon() - else if(istype(G, /obj/item/weapon/wrench)) - if(charging) - user << "\red Remove the laptop first!" - return - anchored = !anchored - user << "You [anchored ? "attached" : "detached"] the recharger." - playsound(loc, 'sound/items/Ratchet.ogg', 75, 1) - -/obj/machinery/laprecharger/attack_hand(mob/user as mob) - add_fingerprint(user) - - if(charging) - charging.update_icon() - charging.loc = loc - charging = null - use_power = 1 - update_icon() - -/obj/machinery/laprecharger/attack_paw(mob/user as mob) - return attack_hand(user) - -/obj/machinery/laprecharger/process() - if(stat & (NOPOWER|BROKEN) || !anchored) - return - - if(charging) - if(istype(charging, /obj/item/device/laptop)) - var/obj/item/device/laptop/L = charging - if(L.stored_computer.battery.charge < L.stored_computer.battery.maxcharge) - L.stored_computer.battery.give(1000) - icon_state = icon_state_charging - use_power(2500) - else - icon_state = icon_state_charged - return - - -/obj/machinery/laprecharger/emp_act(severity) - if(stat & (NOPOWER|BROKEN) || !anchored) - ..(severity) - return - -/obj/machinery/laprecharger/update_icon() //we have an update_icon() in addition to the stuff in process to make it feel a tiny bit snappier. - if(charging) - icon_state = icon_state_charging - else - icon_state = icon_state_idle - -// Atlantis: No need for that copy-pasta code, just use var to store icon_states instead. -obj/machinery/laprecharger/wallcharger - name = "wall laptop recharger" - icon = 'icons/obj/stationobjs.dmi' - icon_state = "wrecharger0" - icon_state_idle = "wrecharger0" - icon_state_charging = "wrecharger1" - icon_state_charged = "wrecharger2" diff --git a/code/game/machinery/records_scanner.dm b/code/game/machinery/records_scanner.dm deleted file mode 100644 index c203c318655..00000000000 --- a/code/game/machinery/records_scanner.dm +++ /dev/null @@ -1,135 +0,0 @@ -//not a computer -obj/machinery/scanner - name = "Identity Analyser" - var/outputdir = 0 - icon = 'icons/obj/stationobjs.dmi' - icon_state = "scanner_idle" - density = 1 - anchored = 1 - var/lastuser = null - -obj/machinery/scanner/New() - if(!outputdir) - switch(dir) - if(1) - outputdir = 2 - if(2) - outputdir = 1 - if(4) - outputdir = 8 - if(8) - outputdir = 4 - if(!outputdir) - outputdir = 8 - -/obj/machinery/scanner/process() - if(stat & NOPOWER) - return - use_power(50) - -/obj/machinery/scanner/power_change() - if(!powered()) - spawn(rand(0, 15)) - icon_state = "scanner_off" - stat |= NOPOWER - else - icon_state = "scanner_idle" - stat &= ~NOPOWER - -obj/machinery/scanner/attack_hand(mob/living/carbon/human/user) - if(stat & NOPOWER) - return - if(!ishuman(user) || lastuser == user.real_name) - return - use_power(500) - flick("scanner_on",src) - lastuser = user.real_name - var/mname = user.real_name - var/dna = user.dna.unique_enzymes - var/bloodtype = user.dna.b_type - var/fingerprint = md5(user.dna.uni_identity) - var/list/marks = list() - var/age = user.age - var/gender = user.gender - - var/text = {" -
    Report

    - Name: [mname] - Age: [age] - Sex: [gender] - DNA: [dna] - Blood Type: [bloodtype] - Fingerprint: [fingerprint] - - Black Marks:
    "} - for(var/A in marks) - text += "\red[A]
    " - user << "\blue You feel a sting as the scanner extracts some of your blood." - var/turf/T = get_step(src,outputdir) - var/obj/item/weapon/paper/print = new(T) - print.name = "[mname] Report" - print.info = text - print.stamped = 1 - - for(var/datum/data/record/test in data_core.general) - if (test.fields["name"] == mname) - return - - var/datum/data/record/G = new() - var/datum/data/record/M = new() - var/datum/data/record/S = new() - var/datum/data/record/L = new() - G.fields["rank"] = "Unassigned" - G.fields["real_rank"] = G.fields["rank"] - G.fields["name"] = mname - G.fields["id"] = text("[]", add_zero(num2hex(rand(1, 1.6777215E7)), 6)) - M.fields["name"] = G.fields["name"] - M.fields["id"] = G.fields["id"] - S.fields["name"] = G.fields["name"] - S.fields["id"] = G.fields["id"] - if(gender == FEMALE) - G.fields["sex"] = "Female" - else - G.fields["sex"] = "Male" - G.fields["age"] = text("[]", age) - G.fields["fingerprint"] = text("[]", fingerprint) - G.fields["p_stat"] = "Active" - G.fields["m_stat"] = "Stable" - M.fields["b_type"] = text("[]", bloodtype) - M.fields["b_dna"] = dna - M.fields["mi_dis"] = "None" - M.fields["mi_dis_d"] = "No minor disabilities have been declared." - M.fields["ma_dis"] = "None" - M.fields["ma_dis_d"] = "No major disabilities have been diagnosed." - M.fields["alg"] = "None" - M.fields["alg_d"] = "No allergies have been detected in this patient." - M.fields["cdi"] = "None" - M.fields["cdi_d"] = "No diseases have been diagnosed at the moment." - M.fields["notes"] = "No notes." - S.fields["criminal"] = "None" - S.fields["mi_crim"] = "None" - S.fields["mi_crim_d"] = "No minor crime convictions." - S.fields["ma_crim"] = "None" - S.fields["ma_crim_d"] = "No major crime convictions." - S.fields["notes"] = "No notes." - - //Begin locked reporting - L.fields["name"] = mname - L.fields["sex"] = gender - L.fields["age"] = age - L.fields["id"] = md5("[mname][user.mind.assigned_role]") - L.fields["rank"] = "Unknown" - L.fields["real_rank"] = L.fields["rank"] - L.fields["b_type"] = bloodtype - L.fields["b_dna"] = dna - L.fields["enzymes"] = user.dna.struc_enzymes - L.fields["identity"] = user.dna.uni_identity - L.fields["image"] = getFlatIcon(user,0)//What the person looks like. Naked, in this case. - //End locked reporting - - data_core.general += G - data_core.medical += M - data_core.security += S - data_core.locked += L - - diff --git a/code/game/machinery/walllockers.dm b/code/game/machinery/walllockers.dm deleted file mode 100644 index e81219926f7..00000000000 --- a/code/game/machinery/walllockers.dm +++ /dev/null @@ -1,33 +0,0 @@ -/obj/structure/walllocker - name = "Wall Locker" - icon = 'icons/obj/lockwall.dmi' - icon_state = "emerg" - var/list/spawnitems = list() - anchored = 1 - var/amount = 3 // spawns each items X times. -/obj/structure/walllocker/attack_hand(mob/user as mob) - if (istype(user, /mob/living/silicon/ai)) //Added by Strumpetplaya - AI shouldn't be able to - return //activate emergency lockers. This fixes that. (Does this make sense, the AI can't call attack_hand, can it? --Mloc) - if(!amount) - usr << "It's empty.." - return - if(amount) - for(var/path in spawnitems) - new path(src.loc) - amount-- - return -/obj/structure/walllocker/emerglocker - name = "Emergency Locker" - spawnitems = list(/obj/item/weapon/tank/emergency_oxygen,/obj/item/clothing/mask/breath,/obj/item/weapon/crowbar) -/obj/structure/walllocker/emerglocker/north - pixel_y = 32 - dir = SOUTH -/obj/structure/walllocker/emerglocker/south - pixel_y = -32 - dir = NORTH -/obj/structure/walllocker/emerglocker/west - pixel_x = -32 - dir = WEST -/obj/structure/walllocker/emerglocker/east - pixel_x = 32 - dir = EAST \ No newline at end of file diff --git a/code/game/mecha/equipment/tools/unused_tools.dm b/code/game/mecha/equipment/tools/unused_tools.dm deleted file mode 100644 index 363043f3153..00000000000 --- a/code/game/mecha/equipment/tools/unused_tools.dm +++ /dev/null @@ -1,157 +0,0 @@ - - - -/****** Do not tick this file in without looking over this code first ******/ - - - - - -//NEEDS SPRITE! (When this gets ticked in search for 'TODO MECHA JETPACK SPRITE MISSING' through code to uncomment the place where it's missing.) -/obj/item/mecha_parts/mecha_equipment/jetpack - name = "Jetpack" - desc = "Using directed ion bursts and cunning solar wind reflection technique, this device enables controlled space flight." - icon_state = "mecha_equip" - equip_cooldown = 5 - energy_drain = 50 - var/wait = 0 - var/datum/effect/system/ion_trail_follow/ion_trail - - - can_attach(obj/mecha/M as obj) - if(!(locate(src.type) in M.equipment) && !M.proc_res["dyndomove"]) - return ..() - - detach() - ..() - chassis.proc_res["dyndomove"] = null - return - - attach(obj/mecha/M as obj) - ..() - if(!ion_trail) - ion_trail = new - ion_trail.set_up(chassis) - return - - proc/toggle() - if(!chassis) - return - !equip_ready? turn_off() : turn_on() - return equip_ready - - proc/turn_on() - set_ready_state(0) - chassis.proc_res["dyndomove"] = src - ion_trail.start() - occupant_message("Activated") - log_message("Activated") - - proc/turn_off() - set_ready_state(1) - chassis.proc_res["dyndomove"] = null - ion_trail.stop() - occupant_message("Deactivated") - log_message("Deactivated") - - proc/dyndomove(direction) - if(!action_checks()) - return chassis.dyndomove(direction) - var/move_result = 0 - if(chassis.hasInternalDamage(MECHA_INT_CONTROL_LOST)) - move_result = step_rand(chassis) - else if(chassis.dir!=direction) - chassis.dir = direction - move_result = 1 - else - move_result = step(chassis,direction) - if(chassis.occupant) - for(var/obj/effect/speech_bubble/B in range(1, chassis)) - if(B.parent == chassis.occupant) - B.loc = chassis.loc - if(move_result) - wait = 1 - chassis.use_power(energy_drain) - if(!chassis.pr_inertial_movement.active()) - chassis.pr_inertial_movement.start(list(chassis,direction)) - else - chassis.pr_inertial_movement.set_process_args(list(chassis,direction)) - do_after_cooldown() - return 1 - return 0 - - action_checks() - if(equip_ready || wait) - return 0 - if(energy_drain && !chassis.has_charge(energy_drain)) - return 0 - if(crit_fail) - return 0 - if(chassis.check_for_support()) - return 0 - return 1 - - get_equip_info() - if(!chassis) return - return "* [src.name] \[Toggle\]" - - - Topic(href,href_list) - ..() - if(href_list["toggle"]) - toggle() - - do_after_cooldown() - sleep(equip_cooldown) - wait = 0 - return 1 - - -/obj/item/mecha_parts/mecha_equipment/defence_shocker - name = "Exosuit Defence Shocker" - desc = "" - icon_state = "mecha_teleport" - equip_cooldown = 10 - energy_drain = 100 - range = RANGED - var/shock_damage = 15 - var/active - - can_attach(obj/mecha/M as obj) - if(..()) - if(!istype(M, /obj/mecha/combat/honker)) - if(!M.proc_res["dynattackby"] && !M.proc_res["dynattackhand"] && !M.proc_res["dynattackalien"]) - return 1 - return 0 - - attach(obj/mecha/M as obj) - ..() - chassis.proc_res["dynattackby"] = src - return - - proc/dynattackby(obj/item/weapon/W as obj, mob/user as mob, params) - if(!action_checks(user) || !active) - return - user.electrocute_act(shock_damage, src) - return chassis.dynattackby(W,user, params) - - -/* -/obj/item/mecha_parts/mecha_equipment/book_stocker - - action(var/mob/target) - if(!istype(target)) - return - if(target.search_contents_for(/obj/item/book/WGW)) - target.gib() - target.client.gib() - target.client.mom.monkeyize() - target.client.mom.gib() - for(var/mob/M in range(target, 1000)) - M.gib() - explosion(target.loc,100000,100000,100000) - usr.gib() - world.Reboot() - return 1 - -*/ diff --git a/code/game/mecha/mech_sensor.dm b/code/game/mecha/mech_sensor.dm deleted file mode 100644 index baea482e3ed..00000000000 --- a/code/game/mecha/mech_sensor.dm +++ /dev/null @@ -1,94 +0,0 @@ -/obj/machinery/mech_sensor - icon = 'icons/obj/airlock_machines.dmi' - icon_state = "airlock_sensor_off" - name = "mechatronic sensor" - desc = "Regulates mech movement." - anchored = 1 - density = 1 - throwpass = 1 - use_power = 1 - layer = 3.3 - power_channel = EQUIP - var/on = 0 - var/id_tag = null - - var/frequency = 1379 - var/datum/radio_frequency/radio_connection - -/obj/machinery/mech_sensor/CanPass(atom/movable/mover, turf/target, height=0, air_group=0) - if(!src.enabled()) return 1 - if(air_group || (height==0)) return 1 - - if ((get_dir(loc, target) & dir) && src.is_blocked(mover)) - src.give_feedback(mover) - return 0 - return 1 - -/obj/machinery/mech_sensor/proc/is_blocked(O as obj) - if(istype(O, /obj/mecha/medical/odysseus)) - var/obj/mecha/medical/odysseus/M = O - for(var/obj/item/mecha_parts/mecha_equipment/ME in M.equipment) - if(istype(ME, /obj/item/mecha_parts/mecha_equipment/tool/sleeper)) - var/obj/item/mecha_parts/mecha_equipment/tool/sleeper/S = ME - if(S.occupant != null) - return 0 - - return istype(O, /obj/mecha) || istype(O, /obj/vehicle) - -/obj/machinery/mech_sensor/proc/give_feedback(O as obj) - var/block_message = "Movement control overridden. Area denial active." - var/feedback_timer = 0 - if(feedback_timer) - return - - if(istype(O, /obj/mecha)) - var/obj/mecha/R = O - if(R && R.occupant) - R.occupant << block_message - else if(istype(O, /obj/vehicle/train/cargo/engine)) - var/obj/vehicle/train/cargo/engine/E = O - if(E && E.load && E.is_train_head()) - E.load << block_message - - feedback_timer = 1 - spawn(5) //Without this timer the feedback becomes horribly spamy - feedback_timer = 0 - -/obj/machinery/mech_sensor/proc/enabled() - return on && !(stat & NOPOWER) - -/obj/machinery/mech_sensor/power_change() - var/old_stat = stat - ..() - if(old_stat != stat) - update_icon() - -/obj/machinery/mech_sensor/update_icon(var/safety = 0) - if (enabled()) - icon_state = "airlock_sensor_on" - else - icon_state = "airlock_sensor_off" - -/obj/machinery/mech_sensor/initialize() - set_frequency(frequency) - -/obj/machinery/mech_sensor/proc/set_frequency(new_frequency) - if(radio_connection) - radio_controller.remove_object(src, frequency) - frequency = new_frequency - if(frequency) - radio_connection = radio_controller.add_object(src, frequency) - -/obj/machinery/mech_sensor/receive_signal(datum/signal/signal) - if(stat & NOPOWER) - return - - if(!signal.data["tag"] || (signal.data["tag"] != id_tag)) - return - - if(signal.data["command"] == "enable") - on = 1 - else if (signal.data["command"] == "disable") - on = 0 - - update_icon() diff --git a/code/game/objects/items/weapons/game_kit.dm b/code/game/objects/items/weapons/game_kit.dm deleted file mode 100644 index 09ffacd32b7..00000000000 --- a/code/game/objects/items/weapons/game_kit.dm +++ /dev/null @@ -1,139 +0,0 @@ -/* -CONTAINS: -THAT STUPID GAME KIT - -*/ -/obj/item/weapon/game_kit/New() - src.board_stat = "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" - src.selected = "CR" - -/obj/item/weapon/game_kit/attack_paw(mob/user as mob) - return src.attack_hand(user) - -/obj/item/weapon/game_kit/MouseDrop(mob/user as mob) - if (user == usr && !usr.restrained() && !usr.stat && (usr.contents.Find(src) || in_range(src, usr))) - if (usr.hand) - if (!usr.l_hand) - spawn (0) - src.attack_hand(usr, 1, 1) - else - if (!usr.r_hand) - spawn (0) - src.attack_hand(usr, 0, 1) - -/obj/item/weapon/game_kit/proc/update() - var/dat = text("
    Game Board

    [] remove
    ", src, (src.selected ? text("Selected: []", src.selected) : "Nothing Selected"), src) - for (var/y = 1 to 8) - dat += "" - - for (var/x = 1 to 8) - var/color = (y + x) % 2 ? "#ffffff" : "#999999" - var/piece = copytext(src.board_stat, ((y - 1) * 8 + x) * 2 - 1, ((y - 1) * 8 + x) * 2 + 1) - - dat += "" - - dat += "" - - dat += "
    " - dat += "" - if (piece != "BB") - dat += "" - else - dat += "" - dat += "

    Chips:
    " - for (var/piece in list("CB", "CR")) - dat += "" - - dat += "
    Chess pieces:
    " - for (var/piece in list("WP", "WK", "WQ", "WI", "WN", "WR")) - dat += "" - dat += "
    " - for (var/piece in list("BP", "BK", "BQ", "BI", "BN", "BR")) - dat += "" - src.data = dat - -/obj/item/weapon/game_kit/attack_ai(mob/user as mob, unused, flag) - return src.attack_hand(user, unused, flag) - -/obj/item/weapon/game_kit/attack_hand(mob/user as mob, unused, flag) - - if (flag) - return ..() - else - user.machine = src - if (!( src.data )) - update() - user << browse(src.data, "window=game_kit") - onclose(user, "game_kit") - return - return - -/obj/item/weapon/game_kit/Topic(href, href_list) - ..() - if ((usr.stat || usr.restrained())) - return - - if (usr.contents.Find(src) || (in_range(src, usr) && istype(src.loc, /turf))) - if (href_list["s_piece"]) - src.selected = href_list["s_piece"] - else if (href_list["mode"]) - if (href_list["mode"] == "remove") - src.selected = "remove" - else - src.selected = null - else if (href_list["s_board"]) - if (!( src.selected )) - src.selected = href_list["s_board"] - else - var/tx = text2num(copytext(href_list["s_board"], 1, 2)) - var/ty = text2num(copytext(href_list["s_board"], 3, 4)) - if ((copytext(src.selected, 2, 3) == " " && length(src.selected) == 3)) - var/sx = text2num(copytext(src.selected, 1, 2)) - var/sy = text2num(copytext(src.selected, 3, 4)) - var/place = ((sy - 1) * 8 + sx) * 2 - 1 - src.selected = copytext(src.board_stat, place, place + 2) - if (place == 1) - src.board_stat = text("BB[]", copytext(src.board_stat, 3, 129)) - else - if (place == 127) - src.board_stat = text("[]BB", copytext(src.board_stat, 1, 127)) - else - if (place) - src.board_stat = text("[]BB[]", copytext(src.board_stat, 1, place), copytext(src.board_stat, place + 2, 129)) - place = ((ty - 1) * 8 + tx) * 2 - 1 - if (place == 1) - src.board_stat = text("[][]", src.selected, copytext(src.board_stat, 3, 129)) - else - if (place == 127) - src.board_stat = text("[][]", copytext(src.board_stat, 1, 127), src.selected) - else - if (place) - src.board_stat = text("[][][]", copytext(src.board_stat, 1, place), src.selected, copytext(src.board_stat, place + 2, 129)) - src.selected = null - else - if (src.selected == "remove") - var/place = ((ty - 1) * 8 + tx) * 2 - 1 - if (place == 1) - src.board_stat = text("BB[]", copytext(src.board_stat, 3, 129)) - else - if (place == 127) - src.board_stat = text("[]BB", copytext(src.board_stat, 1, 127)) - else - if (place) - src.board_stat = text("[]BB[]", copytext(src.board_stat, 1, place), copytext(src.board_stat, place + 2, 129)) - else - if (length(src.selected) == 2) - var/place = ((ty - 1) * 8 + tx) * 2 - 1 - if (place == 1) - src.board_stat = text("[][]", src.selected, copytext(src.board_stat, 3, 129)) - else - if (place == 127) - src.board_stat = text("[][]", copytext(src.board_stat, 1, 127), src.selected) - else - if (place) - src.board_stat = text("[][][]", copytext(src.board_stat, 1, place), src.selected, copytext(src.board_stat, place + 2, 129)) - src.add_fingerprint(usr) - update() - for(var/mob/M in viewers(1, src)) - if ((M.client && M.machine == src)) - src.attack_hand(M) diff --git a/code/game/objects/items/weapons/surgery_limbattachment.dm b/code/game/objects/items/weapons/surgery_limbattachment.dm deleted file mode 100644 index 04f0ac5db7f..00000000000 --- a/code/game/objects/items/weapons/surgery_limbattachment.dm +++ /dev/null @@ -1,71 +0,0 @@ -/obj/item/robot_parts/attack(mob/living/carbon/human/M as mob, mob/living/carbon/user as mob) - var/limbloc = null - - if(!istype(M)) - return ..() - - if(!((locate(/obj/machinery/optable, M.loc) && M.resting) || (locate(/obj/structure/stool/bed/roller, M.loc) && (M.buckled || M.lying || M.weakened || M.stunned || M.paralysis || M.sleeping || M.stat)) && prob(75) || (locate(/obj/structure/table/, M.loc) && (M.lying || M.weakened || M.stunned || M.paralysis || M.sleeping || M.stat) && prob(66)))) - return ..() - - if(!istype(M, /mob/living/carbon/human)) - return ..() - - if((user.zone_sel.selecting == "l_arm") && (istype(src, /obj/item/robot_parts/l_arm))) - limbloc = "l_hand" - else if((user.zone_sel.selecting == "r_arm") && (istype(src, /obj/item/robot_parts/r_arm))) - limbloc = "r_hand" - else if((user.zone_sel.selecting == "r_leg") && (istype(src, /obj/item/robot_parts/r_leg))) - limbloc = "r_foot" - else if((user.zone_sel.selecting == "l_leg") && (istype(src, /obj/item/robot_parts/l_leg))) - limbloc = "l_foot" - else - user << "\red That doesn't fit there!" - return ..() - - var/mob/living/carbon/human/H = M - var/datum/organ/external/S = H.organs[user.zone_sel.selecting] - if(S.status & ORGAN_DESTROYED) - if(!(S.status & ORGAN_ATTACHABLE)) - user << "\red The wound is not ready for a replacement!" - return 0 - if(M != user) - M.visible_message( \ - "\red [user] is beginning to attach \the [src] where [H]'s [S.display_name] used to be.", \ - "\red [user] begins to attach \the [src] where your [S.display_name] used to be.") - else - M.visible_message( \ - "\red [user] begins to attach a robotic limb where \his [S.display_name] used to be with [src].", \ - "\red You begin to attach \the [src] where your [S.display_name] used to be.") - - if(do_mob(user, H, 100)) - if(M != user) - M.visible_message( \ - "\red [user] finishes attaching [H]'s new [S.display_name].", \ - "\red [user] finishes attaching your new [S.display_name].") - else - M.visible_message( \ - "\red [user] finishes attaching \his new [S.display_name].", \ - "\red You finish attaching your new [S.display_name].") - - if(H == user && prob(25)) - user << "\red You mess up!" - S.take_damage(15) - - S.status &= ~ORGAN_BROKEN - S.status &= ~ORGAN_SPLINTED - S.status &= ~ORGAN_ATTACHABLE - S.status &= ~ORGAN_DESTROYED - S.status |= ORGAN_ROBOT - var/datum/organ/external/T = H.organs["[limbloc]"] - T.status &= ~ORGAN_BROKEN - T.status &= ~ORGAN_SPLINTED - T.status &= ~ORGAN_ATTACHABLE - T.status &= ~ORGAN_DESTROYED - T.status |= ORGAN_ROBOT - H.update_body() - M.updatehealth() - M.UpdateDamageIcon() - del(src) - - return 1 - return 0 \ No newline at end of file diff --git a/code/game/objects/items/weapons/syndie.dm b/code/game/objects/items/weapons/syndie.dm deleted file mode 100644 index 4593bf932f4..00000000000 --- a/code/game/objects/items/weapons/syndie.dm +++ /dev/null @@ -1,84 +0,0 @@ -/obj/item/weapon/syndie - icon = 'icons/obj/syndieweapons.dmi' - -/*C-4 explosive charge and etc, replaces the old syndie transfer valve bomb.*/ - - -/*The explosive charge itself. Flashes for five seconds before exploding.*/ - -/obj/item/weapon/syndie/c4explosive - icon_state = "c-4small_0" - item_state = "c-4small" - name = "normal-sized package" - desc = "A small wrapped package." - w_class = 3 - - var/power = 1 /*Size of the explosion.*/ - var/size = "small" /*Used for the icon, this one will make c-4small_0 for the off state.*/ - -/obj/item/weapon/syndie/c4explosive/heavy - icon_state = "c-4large_0" - item_state = "c-4large" - desc = "A mysterious package, it's quite heavy." - power = 2 - size = "large" - -/obj/item/weapon/syndie/c4explosive/New() - var/K = rand(1,2000) - K = md5(num2text(K)+name) - K = copytext(K,1,7) - src.desc += "\n You see [K] engraved on \the [src]." - var/obj/item/weapon/syndie/c4detonator/detonator = new(src.loc) - detonator.desc += "\n You see [K] engraved on the lighter." - detonator.bomb = src - -/obj/item/weapon/syndie/c4explosive/proc/detonate() - icon_state = "c-4[size]_1" - spawn(50) - explosion(get_turf(src), power, power*2, power*3, power*4, power*4) - for(var/dirn in cardinal) //This is to guarantee that C4 at least breaks down all immediately adjacent walls and doors. - var/turf/simulated/wall/T = get_step(src,dirn) - if(locate(/obj/machinery/door/airlock) in T) - var/obj/machinery/door/airlock/D = locate() in T - if(D.density) - D.open() - if(istype(T,/turf/simulated/wall)) - T.dismantle_wall(1) - del(src) - - -/*Detonator, disguised as a lighter*/ -/*Click it when closed to open, when open to bring up a prompt asking you if you want to close it or press the button.*/ - -/obj/item/weapon/syndie/c4detonator - icon_state = "c-4detonator_0" - item_state = "c-4detonator" - name = "\improper Zippo lighter" /*Sneaky, thanks Dreyfus.*/ - desc = "The zippo." - w_class = 1 - - var/obj/item/weapon/syndie/c4explosive/bomb - var/pr_open = 0 /*Is the "What do you want to do?" prompt open?*/ - -/obj/item/weapon/syndie/c4detonator/attack_self(mob/user as mob) - switch(src.icon_state) - if("c-4detonator_0") - src.icon_state = "c-4detonator_1" - user << "You flick open the lighter." - - if("c-4detonator_1") - if(!pr_open) - pr_open = 1 - switch(alert(user, "What would you like to do?", "Lighter", "Press the button.", "Close the lighter.")) - if("Press the button.") - user << "\red You press the button." - flick("c-4detonator_click", src) - if(src.bomb) - src.bomb.detonate() - log_admin("[user.real_name]([user.ckey]) has triggered [src.bomb] with [src].") - message_admins("\red [user.real_name]([user.ckey]) has triggered [src.bomb] with [src].") - - if("Close the lighter.") - src.icon_state = "c-4detonator_0" - user << "You close the lighter." - pr_open = 0 \ No newline at end of file diff --git a/code/game/socket_talk.dm b/code/game/socket_talk.dm deleted file mode 100644 index 8484b636b8d..00000000000 --- a/code/game/socket_talk.dm +++ /dev/null @@ -1,26 +0,0 @@ -// Module used for fast interprocess communication between BYOND and other processes - -/datum/socket_talk - var - enabled = 0 - New() - ..() - src.enabled = config.socket_talk - - if(enabled) - call("DLLSocket.so","establish_connection")("127.0.0.1","8019") - - proc - send_raw(message) - if(enabled) - return call("DLLSocket.so","send_message")(message) - receive_raw() - if(enabled) - return call("DLLSocket.so","recv_message")() - send_log(var/log, var/message) - return send_raw("type=log&log=[log]&message=[message]") - send_keepalive() - return send_raw("type=keepalive") - - -var/global/datum/socket_talk/socket_talk diff --git a/code/game/structure/flora.dm b/code/game/structure/flora.dm deleted file mode 100644 index 92aadd45295..00000000000 --- a/code/game/structure/flora.dm +++ /dev/null @@ -1,196 +0,0 @@ -//trees -/obj/structure/flora/tree - name = "tree" - anchored = 1 - density = 1 - pixel_x = -16 - layer = 9 - -/obj/structure/flora/tree/pine - name = "pine tree" - icon = 'icons/obj/flora/pinetrees.dmi' - icon_state = "pine_1" - -/obj/structure/flora/tree/pine/New() - icon_state = "pine_[rand(1, 3)]" - ..() - -/obj/structure/flora/tree/pine/xmas - name = "xmas tree" - icon = 'icons/obj/flora/pinetrees.dmi' - icon_state = "pine_c" - -/obj/structure/flora/tree/pine/xmas/New() - ..() - icon_state = "pine_c" - -/obj/structure/flora/tree/dead - icon = 'icons/obj/flora/deadtrees.dmi' - icon_state = "tree_1" - -/obj/structure/flora/tree/dead/New() - icon_state = "tree_[rand(1, 6)]" - ..() - - -//grass -/obj/structure/flora/grass - name = "grass" - icon = 'icons/obj/flora/snowflora.dmi' - anchored = 1 - -/obj/structure/flora/grass/brown - icon_state = "snowgrass1bb" - -/obj/structure/flora/grass/brown/New() - icon_state = "snowgrass[rand(1, 3)]bb" - ..() - - -/obj/structure/flora/grass/green - icon_state = "snowgrass1gb" - -/obj/structure/flora/grass/green/New() - icon_state = "snowgrass[rand(1, 3)]gb" - ..() - -/obj/structure/flora/grass/both - icon_state = "snowgrassall1" - -/obj/structure/flora/grass/both/New() - icon_state = "snowgrassall[rand(1, 3)]" - ..() - - -//bushes -/obj/structure/flora/bush - name = "bush" - icon = 'icons/obj/flora/snowflora.dmi' - icon_state = "snowbush1" - anchored = 1 - -/obj/structure/flora/bush/New() - icon_state = "snowbush[rand(1, 6)]" - ..() - -/obj/structure/flora/pottedplant - name = "potted plant" - icon = 'icons/obj/plants.dmi' - icon_state = "plant-26" - -//newbushes - -/obj/structure/flora/ausbushes - name = "bush" - icon = 'icons/obj/flora/ausflora.dmi' - icon_state = "firstbush_1" - anchored = 1 - -/obj/structure/flora/ausbushes/New() - icon_state = "firstbush_[rand(1, 4)]" - ..() - -/obj/structure/flora/ausbushes/reedbush - icon_state = "reedbush_1" - -/obj/structure/flora/ausbushes/reedbush/New() - icon_state = "reedbush_[rand(1, 4)]" - ..() - -/obj/structure/flora/ausbushes/leafybush - icon_state = "leafybush_1" - -/obj/structure/flora/ausbushes/leafybush/New() - icon_state = "leafybush_[rand(1, 3)]" - ..() - -/obj/structure/flora/ausbushes/palebush - icon_state = "palebush_1" - -/obj/structure/flora/ausbushes/palebush/New() - icon_state = "palebush_[rand(1, 4)]" - ..() - -/obj/structure/flora/ausbushes/stalkybush - icon_state = "stalkybush_1" - -/obj/structure/flora/ausbushes/stalkybush/New() - icon_state = "stalkybush_[rand(1, 3)]" - ..() - -/obj/structure/flora/ausbushes/grassybush - icon_state = "grassybush_1" - -/obj/structure/flora/ausbushes/grassybush/New() - icon_state = "grassybush_[rand(1, 4)]" - ..() - -/obj/structure/flora/ausbushes/fernybush - icon_state = "fernybush_1" - -/obj/structure/flora/ausbushes/fernybush/New() - icon_state = "fernybush_[rand(1, 3)]" - ..() - -/obj/structure/flora/ausbushes/sunnybush - icon_state = "sunnybush_1" - -/obj/structure/flora/ausbushes/sunnybush/New() - icon_state = "sunnybush_[rand(1, 3)]" - ..() - -/obj/structure/flora/ausbushes/genericbush - icon_state = "genericbush_1" - -/obj/structure/flora/ausbushes/genericbush/New() - icon_state = "genericbush_[rand(1, 4)]" - ..() - -/obj/structure/flora/ausbushes/pointybush - icon_state = "pointybush_1" - -/obj/structure/flora/ausbushes/pointybush/New() - icon_state = "pointybush_[rand(1, 4)]" - ..() - -/obj/structure/flora/ausbushes/lavendergrass - icon_state = "lavendergrass_1" - -/obj/structure/flora/ausbushes/lavendergrass/New() - icon_state = "lavendergrass_[rand(1, 4)]" - ..() - -/obj/structure/flora/ausbushes/ywflowers - icon_state = "ywflowers_1" - -/obj/structure/flora/ausbushes/ywflowers/New() - icon_state = "ywflowers_[rand(1, 3)]" - ..() - -/obj/structure/flora/ausbushes/brflowers - icon_state = "brflowers_1" - -/obj/structure/flora/ausbushes/brflowers/New() - icon_state = "brflowers_[rand(1, 3)]" - ..() - -/obj/structure/flora/ausbushes/ppflowers - icon_state = "ppflowers_1" - -/obj/structure/flora/ausbushes/ppflowers/New() - icon_state = "ppflowers_[rand(1, 4)]" - ..() - -/obj/structure/flora/ausbushes/sparsegrass - icon_state = "sparsegrass_1" - -/obj/structure/flora/ausbushes/sparsegrass/New() - icon_state = "sparsegrass_[rand(1, 3)]" - ..() - -/obj/structure/flora/ausbushes/fullgrass - icon_state = "fullgrass_1" - -/obj/structure/flora/ausbushes/fullgrass/New() - icon_state = "fullgrass_[rand(1, 3)]" - ..() \ No newline at end of file diff --git a/code/game/vehicles/vehicle.dm b/code/game/vehicles/vehicle.dm deleted file mode 100644 index f4c18cdfc80..00000000000 --- a/code/game/vehicles/vehicle.dm +++ /dev/null @@ -1,189 +0,0 @@ - - -/obj/vehicle - name = "Vehicle" - icon = 'icons/vehicles/vehicles.dmi' - density = 1 - anchored = 1 - unacidable = 1 //To avoid the pilot-deleting shit that came with mechas - layer = MOB_LAYER - //var/can_move = 1 - var/mob/living/carbon/occupant = null - //var/step_in = 10 //make a step in step_in/10 sec. - //var/dir_in = 2//What direction will the mech face when entered/powered on? Defaults to South. - //var/step_energy_drain = 10 - var/health = 300 //health is health - //var/deflect_chance = 10 //chance to deflect the incoming projectiles, hits, or lesser the effect of ex_act. - //the values in this list show how much damage will pass through, not how much will be absorbed. - var/list/damage_absorption = list("brute"=0.8,"fire"=1.2,"bullet"=0.9,"laser"=1,"energy"=1,"bomb"=1) - var/obj/item/weapon/stock_parts/cell/cell //Our power source - var/state = 0 - var/list/log = new - var/last_message = 0 - var/add_req_access = 1 - var/maint_access = 1 - //var/dna //dna-locking the mech - var/list/proc_res = list() //stores proc owners, like proc_res["functionname"] = owner reference - var/datum/effect/system/spark_spread/spark_system = new - var/lights = 0 - var/lights_power = 6 - - //inner atmos //These go in airtight.dm, not all vehicles are space-faring -Agouri - //var/use_internal_tank = 0 - //var/internal_tank_valve = ONE_ATMOSPHERE - //var/obj/machinery/portable_atmospherics/canister/internal_tank - //var/datum/gas_mixture/cabin_air - //var/obj/machinery/atmospherics/portables_connector/connected_port = null - - var/obj/item/device/radio/radio = null - - var/max_temperature = 2500 - //var/internal_damage_threshold = 50 //health percentage below which internal damage is possible - var/internal_damage = 0 //contains bitflags - - var/list/operation_req_access = list()//required access level for mecha operation - var/list/internals_req_access = list(access_engine,access_robotics)//required access level to open cell compartment - - //var/datum/global_iterator/pr_int_temp_processor //normalizes internal air mixture temperature //In airtight.dm you go -Agouri - var/datum/global_iterator/pr_inertial_movement //controls intertial movement in spesss - - //var/datum/global_iterator/pr_give_air //moves air from tank to cabin //Y-you too -Agouri - - var/datum/global_iterator/pr_internal_damage //processes internal damage - - - var/wreckage - - var/list/equipment = new - var/obj/selected - //var/max_equip = 3 - - var/datum/events/events - - - -/obj/vehicle/New() - ..() - events = new - icon_state += "-unmanned" - add_radio() - //add_cabin() //No cabin for non-airtights - - spark_system.set_up(2, 0, src) - spark_system.attach(src) - add_cell() - add_iterators() - removeVerb(/obj/mecha/verb/disconnect_from_port) - log_message("[src.name]'s functions initialised. Work protocols active - Entering IDLE mode.") - loc.Entered(src) - return - - -//################ Helpers ########################################################### - - -/obj/vehicle/proc/removeVerb(verb_path) - verbs -= verb_path - -/obj/vehicle/proc/addVerb(verb_path) - verbs += verb_path - -/*/obj/vehicle/proc/add_airtank() //In airtight.dm -Agouri - internal_tank = new /obj/machinery/portable_atmospherics/canister/air(src) - return internal_tank*/ - -/obj/vehicle/proc/add_cell(var/obj/item/weapon/stock_parts/cell/C=null) - if(C) - C.forceMove(src) - cell = C - return - cell = new(src) - cell.charge = 15000 - cell.maxcharge = 15000 - -/*/obj/vehicle/proc/add_cabin() //In airtight.dm -Agouri - cabin_air = new - cabin_air.temperature = T20C - cabin_air.volume = 200 - cabin_air.oxygen = O2STANDARD*cabin_air.volume/(R_IDEAL_GAS_EQUATION*cabin_air.temperature) - cabin_air.nitrogen = N2STANDARD*cabin_air.volume/(R_IDEAL_GAS_EQUATION*cabin_air.temperature) - return cabin_air*/ - -/obj/vehicle/proc/add_radio() - radio = new(src) - radio.name = "[src] radio" - radio.icon = icon - radio.icon_state = icon_state - radio.subspace_transmission = 1 - -/obj/vehicle/proc/add_iterators() - pr_inertial_movement = new /datum/global_iterator/vehicle_intertial_movement(null,0) - //pr_internal_damage = new /datum/global_iterator/vehicle_internal_damage(list(src),0) - //pr_int_temp_processor = new /datum/global_iterator/vehicle_preserve_temp(list(src)) //In airtight.dm's add_airtight_iterators -Agouri - //pr_give_air = new /datum/global_iterator/vehicle_tank_give_air(list(src) //Same here -Agouri - -/obj/vehicle/proc/check_for_support() - if(locate(/obj/structure/grille, orange(1, src)) || locate(/obj/structure/lattice, orange(1, src)) || locate(/turf/simulated, orange(1, src)) || locate(/turf/unsimulated, orange(1, src))) - return 1 - else - return 0 - -//################ Logs and messages ############################################ - - -/obj/vehicle/proc/log_message(message as text,red=null) - log.len++ - log[log.len] = list("time"=world.timeofday,"message"="[red?"":null][message][red?"":null]") - return log.len - - - -//################ Global Iterator Datums ###################################### - - -/datum/global_iterator/vehicle_intertial_movement //inertial movement in space - delay = 7 - - process(var/obj/vehicle/V as obj, direction) - if(direction) - if(!step(V, direction)||V.check_for_support()) - src.stop() - else - src.stop() - return - - -/datum/global_iterator/mecha_internal_damage // processing internal damage - - process(var/obj/mecha/mecha) - if(!mecha.hasInternalDamage()) - return stop() - if(mecha.hasInternalDamage(MECHA_INT_FIRE)) - if(!mecha.hasInternalDamage(MECHA_INT_TEMP_CONTROL) && prob(5)) - mecha.clearInternalDamage(MECHA_INT_FIRE) - if(mecha.internal_tank) - if(mecha.internal_tank.return_pressure()>mecha.internal_tank.maximum_pressure && !(mecha.hasInternalDamage(MECHA_INT_TANK_BREACH))) - mecha.setInternalDamage(MECHA_INT_TANK_BREACH) - var/datum/gas_mixture/int_tank_air = mecha.internal_tank.return_air() - if(int_tank_air && int_tank_air.return_volume()>0) //heat the air_contents - int_tank_air.temperature = min(6000+T0C, int_tank_air.temperature+rand(10,15)) - if(mecha.cabin_air && mecha.cabin_air.return_volume()>0) - mecha.cabin_air.temperature = min(6000+T0C, mecha.cabin_air.return_temperature()+rand(10,15)) - if(mecha.cabin_air.return_temperature()>mecha.max_temperature/2) - mecha.take_damage(4/round(mecha.max_temperature/mecha.cabin_air.return_temperature(),0.1),"fire") - if(mecha.hasInternalDamage(MECHA_INT_TEMP_CONTROL)) //stop the mecha_preserve_temp loop datum - mecha.pr_int_temp_processor.stop() - if(mecha.hasInternalDamage(MECHA_INT_TANK_BREACH)) //remove some air from internal tank - if(mecha.internal_tank) - var/datum/gas_mixture/int_tank_air = mecha.internal_tank.return_air() - var/datum/gas_mixture/leaked_gas = int_tank_air.remove_ratio(0.10) - if(mecha.loc && hascall(mecha.loc,"assume_air")) - mecha.loc.assume_air(leaked_gas) - else - del(leaked_gas) - /*if(mecha.hasInternalDamage(MECHA_INT_SHORT_CIRCUIT)) // LAG INDUCING - it'll keep on creating sparks - if(mecha.get_charge()) - mecha.spark_system.start() - mecha.cell.charge -= min(20,mecha.cell.charge) - mecha.cell.maxcharge -= min(20,mecha.cell.maxcharge) */ - return \ No newline at end of file diff --git a/code/game/verbs/AI_status.dm b/code/game/verbs/AI_status.dm deleted file mode 100644 index 39cbc654835..00000000000 --- a/code/game/verbs/AI_status.dm +++ /dev/null @@ -1,22 +0,0 @@ -/mob/living/silicon/ai/proc/ai_statuschange() - set category = "AI Commands" - set name = "AI status" - - if(usr.stat == 2) - usr <<"You cannot change your emotional status because you are dead!" - return - var/list/ai_emotions = list("Very Happy", "Happy", "Neutral", "Unsure", "Confused", "Sad", "BSOD", "Blank", "Problems?", "Awesome", "Facepalm", "Friend Computer", "Beer mug", "Dwarf", "Fishtank", "Plump Helmet") - if(src.ckey == "serithi") - ai_emotions.Add("Tribunal","Tribunal Malfunctioning") - var/emote = input("Please, select a status!", "AI Status", null, null) in ai_emotions - for (var/obj/machinery/ai_status_display/AISD in world) //change status - spawn( 0 ) - AISD.emotion = emote - for (var/obj/machinery/status_display/SD in world) //if Friend Computer, change ALL displays - if(emote=="Friend Computer") - spawn(0) - SD.friendc = 1 - else - spawn(0) - SD.friendc = 0 - return \ No newline at end of file diff --git a/code/modules/admin/admin_report.dm b/code/modules/admin/admin_report.dm deleted file mode 100644 index 89b267cd348..00000000000 --- a/code/modules/admin/admin_report.dm +++ /dev/null @@ -1,180 +0,0 @@ -// Reports are a way to notify admins of wrongdoings that happened -// while no admin was present. They work a bit similar to news, but -// they can only be read by admins and moderators. - -// a single admin report -datum/admin_report/var - ID // the ID of the report - body // the content of the report - author // key of the author - date // date on which this was created - done // whether this was handled - - offender_key // store the key of the offender - offender_cid // store the cid of the offender - -datum/report_topic_handler - Topic(href,href_list) - ..() - var/client/C = locate(href_list["client"]) - if(href_list["action"] == "show_reports") - C.display_admin_reports() - else if(href_list["action"] == "remove") - C.mark_report_done(text2num(href_list["ID"])) - else if(href_list["action"] == "edit") - C.edit_report(text2num(href_list["ID"])) - -var/datum/report_topic_handler/report_topic_handler - -world/New() - ..() - report_topic_handler = new - -// add a new news datums -proc/make_report(body, author, okey, cid) - var/savefile/Reports = new("data/reports.sav") - var/list/reports - var/lastID - - Reports["reports"] >> reports - Reports["lastID"] >> lastID - - if(!reports) reports = list() - if(!lastID) lastID = 0 - - var/datum/admin_report/created = new() - created.ID = ++lastID - created.body = body - created.author = author - created.date = world.realtime - created.done = 0 - created.offender_key = okey - created.offender_cid = cid - - reports.Insert(1, created) - - Reports["reports"] << reports - Reports["lastID"] << lastID - -// load the reports from disk -proc/load_reports() - var/savefile/Reports = new("data/reports.sav") - var/list/reports - - Reports["reports"] >> reports - - if(!reports) reports = list() - - return reports - -// check if there are any unhandled reports -client/proc/unhandled_reports() - if(!src.holder) return 0 - var/list/reports = load_reports() - - for(var/datum/admin_report/N in reports) - if(N.done) - continue - else return 1 - - return 0 - -// checks if the player has an unhandled report against him -client/proc/is_reported() - var/list/reports = load_reports() - - for(var/datum/admin_report/N in reports) if(!N.done) - if(N.offender_key == src.key) - return 1 - - return 0 - -// display only the reports that haven't been handled -client/proc/display_admin_reports() - set category = "Admin" - set name = "Display Admin Reports" - if(!src.holder) return - - var/list/reports = load_reports() - - var/output = "" - if(unhandled_reports()) - // load the list of unhandled reports - for(var/datum/admin_report/N in reports) - if(N.done) - continue - output += "Reported player: [N.offender_key](CID: [N.offender_cid])
    " - output += "Offense:[N.body]
    " - output += "Occured at [time2text(N.date,"MM/DD hh:mm:ss")]
    " - output += "authored by [N.author]
    " - output += " Flag as Handled" - if(src.key == N.author) - output += " Edit" - output += "
    " - output += "
    " - else - output += "Whoops, no reports!" - - usr << browse(output, "window=news;size=600x400") - - -client/proc/Report(mob/M as mob in view()) - set category = "Admin" - if(!src.holder) - return - - var/CID = "Unknown" - if(M.client) - CID = M.client.computer_id - - var/body = input(src.mob, "Describe in detail what you're reporting [M] for", "Report") as null|text - if(!body) return - - - make_report(body, key, M.key, CID) - - spawn(1) - display_admin_reports() - -client/proc/mark_report_done(ID as num) - if(!src.holder || src.holder.level < 0) - return - - var/savefile/Reports = new("data/reports.sav") - var/list/reports - - Reports["reports"] >> reports - - var/datum/admin_report/found - for(var/datum/admin_report/N in reports) - if(N.ID == ID) - found = N - if(!found) src << "* An error occured, sorry." - - found.done = 1 - - Reports["reports"] << reports - - -client/proc/edit_report(ID as num) - if(!src.holder || src.holder.level < 0) - src << "You tried to modify the news, but you're not an admin!" - return - - var/savefile/Reports = new("data/reports.sav") - var/list/reports - - Reports["reports"] >> reports - - var/datum/admin_report/found - for(var/datum/admin_report/N in reports) - if(N.ID == ID) - found = N - if(!found) src << "* An error occured, sorry." - - var/body = input(src.mob, "Enter a body for the news", "Body") as null|message - if(!body) return - - found.body = body - - Reports["reports"] << reports diff --git a/code/modules/awaymissions/maploader/fromdmp.dm b/code/modules/awaymissions/maploader/fromdmp.dm deleted file mode 100644 index 73958b43a8c..00000000000 --- a/code/modules/awaymissions/maploader/fromdmp.dm +++ /dev/null @@ -1,237 +0,0 @@ -/* - DMP to swapmap converter - version 1.0 - - by Lummox JR - */ - -mob/verb/Convert(filename as file) - dmp2swapmap(filename) - -proc/d2sm_prepmap(filename) - var/txt = file2text(filename) - if(!txt) return - var/i,j - i=findText(txt,ascii2text(13)) // eliminate carriage returns - while(i) - txt=copytext(txt,1,i)+copytext(txt,i+1) - i=findText(txt,ascii2text(13),i) - i=findText(txt,"\\\n") - while(i) - for(j=i+2,j<=length(txt),++j) if(text2ascii(txt,j)>32) break - txt=copytext(txt,1,i)+copytext(txt,j) - i=findText(txt,"\\\n",i) - return txt - -proc/dmp2swapmap(filename) - //var/txt = file2text(filename) - //if(!txt) return - var/txt = d2sm_prepmap(filename) - var/mapname="[filename]" - var/i,j,k - i=findtext(mapname,".dmp") - while(i && i+432) break - txt=copytext(txt,1,i)+copytext(txt,j) - i=findText(txt,"\\\n",i) */ - var/list/codes=new - var/codelen=1 - var/list/areas - var/mode=34 - var/z=0 - var/X=0,Y=0,Z=0 - while(txt) - if(text2ascii(txt)==34) - if(mode!=34) - world << "Corrupt map file [filename]: Unexpected code found after z-level [z]" - return - // standard line: - // "a" = (/obj, /obj, /turf, /area) - i=findtext(txt,"\"",2) - var/code=copytext(txt,2,i) - codelen=length(code) - i=findtext(txt,"(",i) - if(!i) - world << "Corrupt map file [filename]: No type list follows \"[code]\"" - return - k=findtext(txt,"\n",++i) - j=(k || length(txt+1)) - while(--j>=i && text2ascii(txt,j)!=41) - if(j2) codetrans+=d2sm_Contents(L,L.len-2,"\t\t\t\t") - codes[code]=copytext(codetrans,1,length(codetrans)) - else if(text2ascii(txt)==40) - mode=40 - // standard line (top-down, left-right symbol order): - // (1,1,1) = {" - // abcde - // bcdef - // "} - i=d2sm_MatchBrace(txt,1,40) - if(!i) - world << "Corrupt map file [filename]: No matching ) for coordinates: [copytext(txt,1,findtext(txt,"\n"))]" - return - var/list/coords=d2sm_ParseCommaList(copytext(txt,2,i)) - if(istext(coords) || coords.len!=3) - world << "Corrupt map file [filename]: [istext(coords)?(coords):"[copytext(txt,1,i+1)] is not a valid (x,y,z) coordinate"]" - return - j=findtext(txt,"{",i+1) - if(!j) - world << "Corrupt map file [filename]: No braces {} following [copytext(txt,1,i+1)]" - return - k=d2sm_MatchBrace(txt,j,123) - if(!k) - world << "Corrupt map file [filename]: No closing brace } following [copytext(txt,1,i+1)]" - return - var/mtxt=copytext(txt,j+1,k) - if(findText(mtxt,"\"\n")!=1 || !findText(mtxt,"\n\"",length(mtxt)-1)) - world << findText(mtxt,"\"\n") - world << findText(mtxt,"\n\"",length(mtxt)-1) - world << "Corrupt map file [filename]: No quotes in braces following [copytext(txt,1,i+1)]" - return - mtxt=copytext(mtxt,2,length(mtxt)) - var/_x=0,_y=0 - for(i=1,,++_y) - j=findText(mtxt,"\n",i+1) - if(!j) break - _x=max(_x,(j-i-1)/codelen) - i=j - X=max(X,_x) - Y=max(Y,_y) - z=text2num(coords[3]) - Z=max(Z,z) - txt=copytext(txt,k+1) - else - i=findtext(txt,"\n") - txt=i?copytext(txt,i+1):null - world << "Map size: [X],[Y],[Z]" - //for(var/code in codes) - // world << "Code \"[code]\":\n[codes[code]]" - fdel("map_[mapname].txt") - var/F = file("map_[mapname].txt") - F << ". = object(\".0\")\n.0\n\ttype = /swapmap\n\tid = \"[mapname]\"\n\tz = [Z]\n\ty = [Y]\n\tx = [X]" - if(areas) - txt="" - for(i=0,i0,--y) // map is top-down - ++i - F << "\t\t[y]" - for(var/x in 1 to _x) - F << "\t\t\t[x]" - j=i+codelen - F << codes[copytext(mtxt,i,j)] - i=j - txt=copytext(txt,k+1) - /* for(z in 1 to Z) - F << "\t[z]" - for(var/y in 1 to Y) - F << "\t\t[y]" - for(var/x in 1 to X) - F << "\t\t\t[x]" - F << codes[pick(codes)] */ - -proc/d2sm_ParseCommaList(txt) - var/list/L=new - var/i,ch - for(i=1,i<=length(txt),++i) - if(text2ascii(txt,i)>32) break - for(,i<=length(txt),++i) - ch=text2ascii(txt,i) - if(ch==44) - L+=copytext(txt,1,i) - for(++i,i<=length(txt),++i) if(text2ascii(txt,i)>32) break - txt=copytext(txt,i) - i=0;continue - if(ch==40 || ch==91 || ch==123) - i=d2sm_MatchBrace(txt,i,ch) - if(!i) return "No matching brace found for [ascii2text(ch)]" - if(i>1) L+=copytext(txt,1,i) - return L - -proc/d2sm_MatchBrace(txt, i, which) - if(which==40) ++which - else which+=2 - var/j,ch - for(j=i+1,j<=length(txt),++j) - ch=text2ascii(txt,j) - if(ch==which) return j - if(ch==40 || ch==91 || ch==123) - j=d2sm_MatchBrace(txt,j,ch) - if(!j) return 0 - -proc/d2sm_ConvertType(tt,tabs="") - var/i=findText(tt,"{") - if(!i) return "[tabs]type = [tt]\n" - .="[tabs]type = [copytext(tt,1,i)]\n" - var/list/L=d2sm_ParseCommaList(copytext(tt,i+1,d2sm_MatchBrace(tt,i,123))) - if(istext(L)) return - for(var/pair in L) - .="[.][tabs][pair]\n" - -proc/d2sm_Contents(list/conts,n,tabs="") - .="[tabs]contents = list(" - var/i - for(i=0,i= 50) - enzymes -= 50 - new/obj/item/weapon/reagent_containers/food/condiment/enzyme(src.loc) - diff --git a/code/modules/economy/cash.dm b/code/modules/economy/cash.dm deleted file mode 100644 index 22bbef5d805..00000000000 --- a/code/modules/economy/cash.dm +++ /dev/null @@ -1,50 +0,0 @@ -/obj/item/weapon/spacecash - name = "0 credit chip" - desc = "It's worth 0 credits." - gender = PLURAL - icon = 'icons/obj/items.dmi' - icon_state = "spacecash" - opacity = 0 - density = 0 - anchored = 0.0 - force = 1.0 - throwforce = 1.0 - throw_speed = 1 - throw_range = 2 - w_class = 1.0 - var/access = list() - access = access_crate_cash - var/worth = 0 - -/obj/item/weapon/spacecash/c1 - icon_state = "spacecash" - worth = 1 - -/obj/item/weapon/spacecash/c10 - icon_state = "spacecash10" - worth = 10 - -/obj/item/weapon/spacecash/c20 - icon_state = "spacecash20" - worth = 20 - -/obj/item/weapon/spacecash/c50 - icon_state = "spacecash50" - worth = 50 - -/obj/item/weapon/spacecash/c100 - icon_state = "spacecash100" - worth = 100 - -/obj/item/weapon/spacecash/c200 - icon_state = "spacecash200" - worth = 200 - -/obj/item/weapon/spacecash/c500 - icon_state = "spacecash500" - worth = 500 - -/obj/item/weapon/spacecash/c1000 - icon_state = "spacecash1000" - worth = 1000 - diff --git a/code/modules/ext_scripts/github.dm b/code/modules/ext_scripts/github.dm deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/code/modules/games/cards.dm b/code/modules/games/cards.dm deleted file mode 100644 index aeda971c48a..00000000000 --- a/code/modules/games/cards.dm +++ /dev/null @@ -1,222 +0,0 @@ -/datum/playingcard - var/name = "playing card" - var/card_icon = "card_back" - -/obj/item/weapon/deck - name = "deck of cards" - desc = "A simple deck of playing cards." - icon = 'icons/obj/playing_cards.dmi' - icon_state = "deck" - w_class = 2 - - var/list/cards = list() - -/obj/item/weapon/deck/New() - ..() - - var/datum/playingcard/P - for(var/suit in list("spades","clubs","diamonds","hearts")) - - var/colour - if(suit == "spades" || suit == "clubs") - colour = "black_" - else - colour = "red_" - - for(var/number in list("ace","two","three","four","five","six","seven","eight","nine","ten")) - P = new() - P.name = "[number] of [suit]" - P.card_icon = "[colour]num" - cards += P - - for(var/number in list("jack","queen","king")) - P = new() - P.name = "[number] of [suit]" - P.card_icon = "[colour]col" - cards += P - - - for(var/i = 0,i<2,i++) - P = new() - P.name = "joker" - P.card_icon = "joker" - cards += P - -/obj/item/weapon/deck/attackby(obj/O as obj, mob/user as mob, params) - if(istype(O,/obj/item/weapon/hand)) - var/obj/item/weapon/hand/H = O - for(var/datum/playingcard/P in H.cards) - cards += P - del(O) - user << "You place your cards on the bottom of the deck." - return - ..() - -/obj/item/weapon/deck/verb/draw_card() - - set category = "Object" - set name = "Draw" - set desc = "Draw a card from a deck." - set src in oview(1) - - if(usr.stat || !Adjacent(usr)) return - - if(!istype(usr,/mob/living/carbon)) - return - - var/mob/living/carbon/user = usr - - if(!cards.len) - usr << "There are no cards in the deck." - return - - var/obj/item/weapon/hand/H - if(user.l_hand && istype(user.l_hand,/obj/item/weapon/hand)) - H = user.l_hand - else if(user.r_hand && istype(user.r_hand,/obj/item/weapon/hand)) - H = user.r_hand - else - H = new(get_turf(src)) - user.put_in_hands(H) - - if(!H || !user) return - - var/datum/playingcard/P = cards[1] - H.cards += P - cards -= P - H.update_icon() - user.visible_message("\The [user] draws a card.") - user << "It's the [P]." - -/obj/item/weapon/deck/verb/deal_card() - - set category = "Object" - set name = "Deal" - set desc = "Deal a card from a deck." - - if(usr.stat || !Adjacent(usr)) return - - if(!cards.len) - usr << "There are no cards in the deck." - return - - var/list/players = list() - for(var/mob/living/player in orange(3)) - if(!player.stat) - players += player - players -= usr - - var/mob/living/M = input("Who do you wish to deal a card?") as null|anything in players - if(!usr || !src || !M) return - - var/obj/item/weapon/hand/H = new(get_turf(src)) - - H.cards += cards[1] - cards -= cards[1] - H.concealed = 1 - H.update_icon() - usr.visible_message("\The [usr] deals a card to \the [M].") - H.throw_at(get_step(M,M.dir),10,1,H) - -/obj/item/weapon/hand/attackby(obj/O as obj, mob/user as mob, params) - if(istype(O,/obj/item/weapon/hand)) - var/obj/item/weapon/hand/H = O - for(var/datum/playingcard/P in H.cards) - cards += P - del(O) - user.put_in_hands(src) - update_icon() - return - ..() - -/obj/item/weapon/deck/attack_self(var/mob/user as mob) - - var/list/newcards = list() - while(cards.len) - var/datum/playingcard/P = pick(cards) - newcards += P - cards -= P - cards = newcards - user.visible_message("\The [user] shuffles [src].") - -/obj/item/weapon/hand - name = "hand of cards" - desc = "Some playing cards." - icon = 'icons/obj/playing_cards.dmi' - icon_state = "empty" - w_class = 1 - - var/concealed = 0 - var/list/cards = list() - -/obj/item/weapon/hand/verb/discard() - - set category = "Object" - set name = "Discard" - set desc = "Place a card from your hand in front of you." - - var/list/to_discard = list() - for(var/datum/playingcard/P in cards) - to_discard[P.name] = P - var/discarding = input("Which card do you wish to put down?") as null|anything in to_discard - - if(!discarding || !to_discard[discarding] || !usr || !src) return - - var/datum/playingcard/card = to_discard[discarding] - del(to_discard) - - var/obj/item/weapon/hand/H = new(src.loc) - H.cards += card - cards -= card - H.concealed = 0 - H.update_icon() - usr.visible_message("\The [usr] plays \the [discarding].") - H.loc = get_step(usr,usr.dir) - - if(!cards.len) - del(src) - -/obj/item/weapon/hand/attack_self(var/mob/user as mob) - concealed = !concealed - update_icon() - user.visible_message("\The [user] [concealed ? "conceals" : "reveals"] their hand.") - -/obj/item/weapon/hand/examine(mob/user) - ..(user) - if((!concealed || src.loc == usr) && cards.len) - user << "It contains: " - for(var/datum/playingcard/P in cards) - user << "The [P.name]." - -/obj/item/weapon/hand/update_icon() - - if(!cards.len) - del(src) - return - else if(cards.len > 1) - name = "hand of cards" - desc = "Some playing cards." - else - name = "a playing card" - desc = "A playing card." - - overlays.Cut() - - - if(cards.len == 1) - var/datum/playingcard/P = cards[1] - var/image/I = new(src.icon, (concealed ? "card_back" : "[P.card_icon]") ) - I.pixel_x += (-5+rand(10)) - I.pixel_y += (-5+rand(10)) - overlays += I - return - - var/origin = -12 - var/offset = Floor(32/cards.len) - - var/i = 0 - for(var/datum/playingcard/P in cards) - var/image/I = new(src.icon, (concealed ? "card_back" : "[P.card_icon]") ) - I.pixel_x = origin+(offset*i) - overlays += I - i++ \ No newline at end of file diff --git a/code/modules/liquid/splash_simulation.dm b/code/modules/liquid/splash_simulation.dm deleted file mode 100644 index b1d47a77def..00000000000 --- a/code/modules/liquid/splash_simulation.dm +++ /dev/null @@ -1,209 +0,0 @@ -#define LIQUID_TRANSFER_THRESHOLD 0.05 - -var/liquid_delay = 4 - -var/list/datum/puddle/puddles = list() - -datum/puddle - var/list/obj/effect/liquid/liquid_objects = list() - -datum/puddle/proc/process() - //world << "DEBUG: Puddle process!" - for(var/obj/effect/liquid/L in liquid_objects) - L.spread() - - for(var/obj/effect/liquid/L in liquid_objects) - L.apply_calculated_effect() - - if(liquid_objects.len == 0) - del(src) - -datum/puddle/New() - ..() - puddles += src - -datum/puddle/Del() - puddles -= src - for(var/obj/O in liquid_objects) - del(O) - ..() - -client/proc/splash() - var/volume = input("Volume?","Volume?", 0 ) as num - if(!isnum(volume)) return - if(volume <= LIQUID_TRANSFER_THRESHOLD) return - var/turf/T = get_turf(src.mob) - if(!isturf(T)) return - trigger_splash(T, volume) - -proc/trigger_splash(turf/epicenter as turf, volume as num) - if(!epicenter) - return - if(volume <= 0) - return - - var/obj/effect/liquid/L = new/obj/effect/liquid(epicenter) - L.volume = volume - L.update_icon2() - var/datum/puddle/P = new/datum/puddle() - P.liquid_objects.Add(L) - L.controller = P - - - - -obj/effect/liquid - icon = 'icons/effects/liquid.dmi' - icon_state = "0" - name = "liquid" - var/volume = 0 - var/new_volume = 0 - var/datum/puddle/controller - -obj/effect/liquid/New() - ..() - if( !isturf(loc) ) - del(src) - - for( var/obj/effect/liquid/L in loc ) - if(L != src) - del(L) - -obj/effect/liquid/proc/spread() - - //world << "DEBUG: liquid spread!" - var/surrounding_volume = 0 - var/list/spread_directions = list(1,2,4,8) - var/turf/loc_turf = get_turf(src) - for(var/direction in spread_directions) - var/turf/T = get_step(src,direction) - if(!T) - spread_directions.Remove(direction) - //world << "ERROR: Map edge!" - continue //Map edge - if(!loc_turf.can_leave_liquid(direction)) //Check if this liquid can leave the tile in the direction - spread_directions.Remove(direction) - continue - if(!T.can_accept_liquid(turn(direction,180))) //Check if this liquid can enter the tile - spread_directions.Remove(direction) - continue - var/obj/effect/liquid/L = locate(/obj/effect/liquid) in T - if(L) - if(L.volume >= src.volume) - spread_directions.Remove(direction) - continue - surrounding_volume += L.volume //If liquid already exists, add it's volume to our sum - else - var/obj/effect/liquid/NL = new(T) //Otherwise create a new object which we'll spread to. - NL.controller = src.controller - controller.liquid_objects.Add(NL) - - if(!spread_directions.len) - //world << "ERROR: No candidate to spread to." - return //No suitable candidate to spread to - - var/average_volume = (src.volume + surrounding_volume) / (spread_directions.len + 1) //Average amount of volume on this and the surrounding tiles. - var/volume_difference = src.volume - average_volume //How much more/less volume this tile has than the surrounding tiles. - if(volume_difference <= (spread_directions.len*LIQUID_TRANSFER_THRESHOLD)) //If we have less than the threshold excess liquid - then there is nothing to do as other tiles will be giving us volume.or the liquid is just still. - //world << "ERROR: transfer volume lower than THRESHOLD!" - return - - var/volume_per_tile = volume_difference / spread_directions.len - - for(var/direction in spread_directions) - var/turf/T = get_step(src,direction) - if(!T) - //world << "ERROR: Map edge 2!" - continue //Map edge - var/obj/effect/liquid/L = locate(/obj/effect/liquid) in T - if(L) - src.volume -= volume_per_tile //Remove the volume from this tile - L.new_volume = L.new_volume + volume_per_tile //Add it to the volume to the other tile - -obj/effect/liquid/proc/apply_calculated_effect() - volume += new_volume - - if(volume < LIQUID_TRANSFER_THRESHOLD) - del(src) - new_volume = 0 - update_icon2() - -obj/effect/liquid/Move() - return 0 - -obj/effect/liquid/Destroy() - src.controller.liquid_objects.Remove(src) - return ..() - -obj/effect/liquid/proc/update_icon2() - //icon_state = num2text( max(1,min(7,(floor(volume),10)/10)) ) - overlays = null - switch(volume) - if(0 to 0.2) - del(src) - if(0.2 to 5) - icon_state = "1" - overlays += image('icons/effects/liquid.dmi', src , "1-1", 5) - if(5 to 10) - icon_state = "2" - overlays += image('icons/effects/liquid.dmi', src , "2-1", 5) - if(10 to 20) - icon_state = "3" - overlays += image('icons/effects/liquid.dmi', src , "3-1", 5) - if(20 to 30) - icon_state = "4" - overlays += image('icons/effects/liquid.dmi', src , "4-1", 5) - if(30 to 40) - icon_state = "5" - overlays += image('icons/effects/liquid.dmi', src , "5-1", 5) - if(40 to 50) - icon_state = "6" - overlays += image('icons/effects/liquid.dmi', src , "6-1", 5) - if(50 to INFINITY) - icon_state = "7" - layer = 5 - -turf/proc/can_accept_liquid(from_direction) - return 0 -turf/proc/can_leave_liquid(from_direction) - return 0 - -turf/space/can_accept_liquid(from_direction) - return 1 -turf/space/can_leave_liquid(from_direction) - return 1 - -turf/simulated/floor/can_accept_liquid(from_direction) - for(var/obj/structure/window/W in src) - if(W.is_fulltile()) - return 0 - if(W.dir & from_direction) - return 0 - for(var/obj/O in src) - if(!O.liquid_pass()) - return 0 - return 1 - -turf/simulated/floor/can_leave_liquid(to_direction) - for(var/obj/structure/window/W in src) - if(W.is_fulltile()) - return 0 - if(W.dir & to_direction) - return 0 - for(var/obj/O in src) - if(!O.liquid_pass()) - return 0 - return 1 - -turf/simulated/wall/can_accept_liquid(from_direction) - return 0 -turf/simulated/wall/can_leave_liquid(from_direction) - return 0 - -obj/proc/liquid_pass() - return 1 - -obj/machinery/door/liquid_pass() - return !density - -#undef LIQUID_TRANSFER_THRESHOLD \ No newline at end of file diff --git a/code/modules/mob/living/carbon/alien/humanoid/hud.dm b/code/modules/mob/living/carbon/alien/humanoid/hud.dm deleted file mode 100644 index 9968b6496ca..00000000000 --- a/code/modules/mob/living/carbon/alien/humanoid/hud.dm +++ /dev/null @@ -1,242 +0,0 @@ -/datum/hud/proc/alien_hud() - - src.adding = list( ) - src.other = list( ) - - var/obj/screen/using - var/obj/screen/inventory/inv_box - - using = new /obj/screen() - using.name = "act_intent" - using.dir = SOUTHWEST - using.icon = 'icons/mob/screen1_alien.dmi' - using.icon_state = (mymob.a_intent == "hurt" ? "harm" : mymob.a_intent) - using.screen_loc = ui_acti - using.layer = 20 - src.adding += using - action_intent = using - -//intent small hud objects - var/icon/ico - - ico = new('icons/mob/screen1_alien.dmi', "black") - ico.MapColors(0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, -1,-1,-1,-1) - ico.DrawBox(rgb(255,255,255,1),1,ico.Height()/2,ico.Width()/2,ico.Height()) - using = new /obj/screen( src ) - using.name = "help" - using.icon = ico - using.screen_loc = ui_acti - using.layer = 21 - src.adding += using - help_intent = using - - ico = new('icons/mob/screen1_alien.dmi', "black") - ico.MapColors(0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, -1,-1,-1,-1) - ico.DrawBox(rgb(255,255,255,1),ico.Width()/2,ico.Height()/2,ico.Width(),ico.Height()) - using = new /obj/screen( src ) - using.name = "disarm" - using.icon = ico - using.screen_loc = ui_acti - using.layer = 21 - src.adding += using - disarm_intent = using - - ico = new('icons/mob/screen1_alien.dmi', "black") - ico.MapColors(0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, -1,-1,-1,-1) - ico.DrawBox(rgb(255,255,255,1),ico.Width()/2,1,ico.Width(),ico.Height()/2) - using = new /obj/screen( src ) - using.name = "grab" - using.icon = ico - using.screen_loc = ui_acti - using.layer = 21 - src.adding += using - grab_intent = using - - ico = new('icons/mob/screen1_alien.dmi', "black") - ico.MapColors(0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, -1,-1,-1,-1) - ico.DrawBox(rgb(255,255,255,1),1,1,ico.Width()/2,ico.Height()/2) - using = new /obj/screen( src ) - using.name = "harm" - using.icon = ico - using.screen_loc = ui_acti - using.layer = 21 - src.adding += using - hurt_intent = using - -//end intent small hud objects - - using = new /obj/screen() - using.name = "mov_intent" - using.dir = SOUTHWEST - using.icon = 'icons/mob/screen1_alien.dmi' - using.icon_state = (mymob.m_intent == "run" ? "running" : "walking") - using.screen_loc = ui_movi - using.layer = 20 - src.adding += using - move_intent = using - - using = new /obj/screen() - using.name = "drop" - using.icon = 'icons/mob/screen1_alien.dmi' - using.icon_state = "act_drop" - using.screen_loc = ui_drop_throw - using.layer = 19 - src.adding += using - -//equippable shit - //suit - inv_box = new /obj/screen/inventory() - inv_box.name = "o_clothing" - inv_box.dir = SOUTH - inv_box.icon = 'icons/mob/screen1_alien.dmi' - inv_box.icon_state = "equip" - inv_box.screen_loc = ui_alien_oclothing - inv_box.slot_id = slot_wear_suit - inv_box.layer = 19 - src.adding += inv_box - - inv_box = new /obj/screen/inventory() - inv_box.name = "r_hand" - inv_box.dir = WEST - inv_box.icon = 'icons/mob/screen1_alien.dmi' - inv_box.icon_state = "hand_inactive" - if(mymob && !mymob.hand) //This being 0 or null means the right hand is in use - using.icon_state = "hand_active" - inv_box.screen_loc = ui_rhand - inv_box.layer = 19 - src.r_hand_hud_object = inv_box - inv_box.slot_id = slot_r_hand - src.adding += inv_box - - inv_box = new /obj/screen/inventory() - inv_box.name = "l_hand" - inv_box.dir = EAST - inv_box.icon = 'icons/mob/screen1_alien.dmi' - inv_box.icon_state = "hand_inactive" - if(mymob && mymob.hand) //This being 1 means the left hand is in use - inv_box.icon_state = "hand_active" - inv_box.screen_loc = ui_lhand - inv_box.layer = 19 - inv_box.slot_id = slot_l_hand - src.l_hand_hud_object = inv_box - src.adding += inv_box - - using = new /obj/screen/inventory() - using.name = "hand" - using.dir = SOUTH - using.icon = 'icons/mob/screen1_alien.dmi' - using.icon_state = "hand1" - using.screen_loc = ui_swaphand1 - using.layer = 19 - src.adding += using - - using = new /obj/screen/inventory() - using.name = "hand" - using.dir = SOUTH - using.icon = 'icons/mob/screen1_alien.dmi' - using.icon_state = "hand2" - using.screen_loc = ui_swaphand2 - using.layer = 19 - src.adding += using - - //pocket 1 - inv_box = new /obj/screen/inventory() - inv_box.name = "storage1" - inv_box.icon = 'icons/mob/screen1_alien.dmi' - inv_box.icon_state = "pocket" - inv_box.screen_loc = ui_storage1 - inv_box.slot_id = slot_l_store - inv_box.layer = 19 - src.adding += inv_box - - //pocket 2 - inv_box = new /obj/screen/inventory() - inv_box.name = "storage2" - inv_box.icon = 'icons/mob/screen1_alien.dmi' - inv_box.icon_state = "pocket" - inv_box.screen_loc = ui_storage2 - inv_box.slot_id = slot_r_store - inv_box.layer = 19 - src.adding += inv_box - - //head - inv_box = new /obj/screen/inventory() - inv_box.name = "head" - inv_box.icon = 'icons/mob/screen1_alien.dmi' - inv_box.icon_state = "hair" - inv_box.screen_loc = ui_alien_head - inv_box.slot_id = slot_head - inv_box.layer = 19 - src.adding += inv_box -//end of equippable shit - -/* - using = new /obj/screen() - using.name = "resist" - using.icon = 'icons/mob/screen1_alien.dmi' - using.icon_state = "act_resist" - using.screen_loc = ui_resist - using.layer = 19 - src.adding += using -*/ - - mymob.throw_icon = new /obj/screen() - mymob.throw_icon.icon = 'icons/mob/screen1_alien.dmi' - mymob.throw_icon.icon_state = "act_throw_off" - mymob.throw_icon.name = "throw" - mymob.throw_icon.screen_loc = ui_drop_throw - - mymob.oxygen = new /obj/screen() - mymob.oxygen.icon = 'icons/mob/screen1_alien.dmi' - mymob.oxygen.icon_state = "oxy0" - mymob.oxygen.name = "oxygen" - mymob.oxygen.screen_loc = ui_alien_oxygen - - mymob.toxin = new /obj/screen() - mymob.toxin.icon = 'icons/mob/screen1_alien.dmi' - mymob.toxin.icon_state = "tox0" - mymob.toxin.name = "toxin" - mymob.toxin.screen_loc = ui_alien_toxin - - mymob.fire = new /obj/screen() - mymob.fire.icon = 'icons/mob/screen1_alien.dmi' - mymob.fire.icon_state = "fire0" - mymob.fire.name = "fire" - mymob.fire.screen_loc = ui_alien_fire - - mymob.healths = new /obj/screen() - mymob.healths.icon = 'icons/mob/screen1_alien.dmi' - mymob.healths.icon_state = "health0" - mymob.healths.name = "health" - mymob.healths.screen_loc = ui_alien_health - - mymob.pullin = new /obj/screen() - mymob.pullin.icon = 'icons/mob/screen1_alien.dmi' - mymob.pullin.icon_state = "pull0" - mymob.pullin.name = "pull" - mymob.pullin.screen_loc = ui_pull_resist - - mymob.blind = new /obj/screen() - mymob.blind.icon = 'icons/mob/screen1_full.dmi' - mymob.blind.icon_state = "blackimageoverlay" - mymob.blind.name = " " - mymob.blind.screen_loc = "1,1" - mymob.blind.layer = 0 - - mymob.flash = new /obj/screen() - mymob.flash.icon = 'icons/mob/screen1_alien.dmi' - mymob.flash.icon_state = "blank" - mymob.flash.name = "flash" - mymob.flash.screen_loc = "1,1 to 15,15" - mymob.flash.layer = 17 - - mymob.zone_sel = new /obj/screen/zone_sel() - mymob.zone_sel.icon = 'icons/mob/screen1_alien.dmi' - mymob.zone_sel.overlays.Cut() - mymob.zone_sel.overlays += image('icons/mob/zone_sel.dmi', "[mymob.zone_sel.selecting]") - - mymob.client.screen = null - - mymob.client.screen += list( mymob.throw_icon, mymob.zone_sel, mymob.oxygen, mymob.toxin, mymob.fire, mymob.healths, mymob.pullin, mymob.blind, mymob.flash) //, mymob.hands, mymob.rest, mymob.sleep, mymob.mach ) - mymob.client.screen += src.adding + src.other - diff --git a/code/modules/mob/living/carbon/alien/larva/login.dm b/code/modules/mob/living/carbon/alien/larva/login.dm deleted file mode 100644 index 33808a4d966..00000000000 --- a/code/modules/mob/living/carbon/alien/larva/login.dm +++ /dev/null @@ -1,3 +0,0 @@ -/mob/living/carbon/alien/larva/Login() - return ..() - diff --git a/code/modules/mob/living/carbon/alien/special/_main.dm b/code/modules/mob/living/carbon/alien/special/_main.dm deleted file mode 100644 index eb5594f3c9e..00000000000 --- a/code/modules/mob/living/carbon/alien/special/_main.dm +++ /dev/null @@ -1,71 +0,0 @@ -//XCOM alien code -//By Xerif (Donated by the Foundation project, ss13.org) - -/mob/living/carbon/alien/humanoid/special - has_fine_manipulation = 1 - var/xcom_state - - New() - ..() - spawn (1) - var/datum/reagents/R = new/datum/reagents(100) - reagents = R - R.my_atom = src - - mind = new() - mind.key = key - mind.special_role = "Special Xeno" - - name = "[name] ([rand(1, 1000)])" - real_name = name - - src.stand_icon = new /icon('xcomalien.dmi', xcom_state) - src.lying_icon = new /icon('xcomalien.dmi', xcom_state) - src.icon = src.stand_icon - - remove_special_verbs() - - rebuild_appearance() - - death(gibbed) - ..() - spawn(5) - gib() - - Stat() - statpanel("Status") - if (src.client && src.client.holder) - stat(null, "([x], [y], [z])") - - stat(null, "Intent: [src.a_intent]") - stat(null, "Move Mode: [src.m_intent]") - - if (src.client.statpanel == "Status") - if (src.internal) - if (!src.internal.air_contents) - del(src.internal) - else - stat("Internal Atmosphere Info", src.internal.name) - stat("Tank Pressure", src.internal.air_contents.return_pressure()) - stat("Distribution Pressure", src.internal.distribute_pressure) - return - - alien_talk() - if(istype(src, /mob/living/carbon/alien/humanoid/special/etheral)) - ..() - return - if(istype(src, /mob/living/carbon/alien/humanoid/special/sectoid)) - ..() - return - return - -/mob/living/carbon/alien/humanoid/special/proc/xcom_attack() - return - -/mob/living/carbon/alien/humanoid/special/proc/remove_special_verbs() - verbs -= /mob/living/carbon/alien/humanoid/verb/plant - verbs -= /mob/living/carbon/alien/humanoid/verb/ActivateHuggers - verbs -= /mob/living/carbon/alien/humanoid/verb/whisp - verbs -= /mob/living/carbon/alien/humanoid/verb/transfer_plasma - verbs -= /mob/living/carbon/alien/humanoid/verb/corrode - return \ No newline at end of file diff --git a/code/modules/mob/living/carbon/alien/special/snakeman.dm b/code/modules/mob/living/carbon/alien/special/snakeman.dm deleted file mode 100644 index 7aa7b9d5db0..00000000000 --- a/code/modules/mob/living/carbon/alien/special/snakeman.dm +++ /dev/null @@ -1,59 +0,0 @@ -/mob/living/carbon/alien/humanoid/special/snakeman - name = "Snakeman" - desc = "This race developed in an extremely hostile environment. They are extremely tough and can resist extreme temperature variations. Their mobility depends on a snake-like giant \"foot\" which protects all the vital organs. " - xcom_state = "snake" - - movement_delay() - return 4 - -/mob/living/carbon/alien/humanoid/special/snakeman/verb/lay_egg(mob/living/carbon/human/M as mob) - set name = "Impregnate" - set desc = "Lays an egg on a corpse, allowing the egg to feed." - set category = "Snakeman" - - set src = view(0) - - if(stat) - return - - if(!M) - return - - if(!M.client) - src << "This being is missing a brain." - return - - visible_message("[src] extends a probiscis and stabs it into [M]") - - if (!do_mob(usr, M, 50)) - usr << "\red The injection of the egg has been interrupted!" - return - - if(M.client) - M.client.mob = new/mob/living/carbon/alien/humanoid/special/snakeman(new/obj/effect/snake_egg(src.loc)) - visible_message("[src] injects [M] with an egg.") - visible_message("The egg absorbs [M]") - M.mutations |= NOCLONE - M.update_body() - M.death() - else - src << "This being is missing a brain." - - return - -/obj/effect/snake_egg - name = "Egg" - icon = 'icons/mob/alien.dmi' - icon_state = "egg" - density = 1 - anchored = 1 - - New() - ..() - - spawn(300) - for(var/mob/M in src) - M.loc = src.loc - icon_state = "egg_hatched" - density = 0 - return \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/hud.dm b/code/modules/mob/living/carbon/human/hud.dm deleted file mode 100644 index fb462846e8e..00000000000 --- a/code/modules/mob/living/carbon/human/hud.dm +++ /dev/null @@ -1,528 +0,0 @@ -/datum/hud/proc/human_hud(var/ui_style='icons/mob/screen1_old.dmi') - - src.adding = list() - src.other = list() - src.hotkeybuttons = list() //These can be disabled for hotkey usersx - - var/obj/screen/using - var/obj/screen/inventory/inv_box - - using = new /obj/screen() - using.name = "act_intent" - using.dir = SOUTHWEST - using.icon = ui_style - using.icon_state = "intent_"+mymob.a_intent - using.screen_loc = ui_acti - using.layer = 20 - src.adding += using - action_intent = using - -//intent small hud objects - var/icon/ico - - ico = new(ui_style, "black") - ico.MapColors(0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, -1,-1,-1,-1) - ico.DrawBox(rgb(255,255,255,1),1,ico.Height()/2,ico.Width()/2,ico.Height()) - using = new /obj/screen( src ) - using.name = "help" - using.icon = ico - using.screen_loc = ui_acti - using.layer = 21 - src.adding += using - help_intent = using - - ico = new(ui_style, "black") - ico.MapColors(0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, -1,-1,-1,-1) - ico.DrawBox(rgb(255,255,255,1),ico.Width()/2,ico.Height()/2,ico.Width(),ico.Height()) - using = new /obj/screen( src ) - using.name = "disarm" - using.icon = ico - using.screen_loc = ui_acti - using.layer = 21 - src.adding += using - disarm_intent = using - - ico = new(ui_style, "black") - ico.MapColors(0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, -1,-1,-1,-1) - ico.DrawBox(rgb(255,255,255,1),ico.Width()/2,1,ico.Width(),ico.Height()/2) - using = new /obj/screen( src ) - using.name = "grab" - using.icon = ico - using.screen_loc = ui_acti - using.layer = 21 - src.adding += using - grab_intent = using - - ico = new(ui_style, "black") - ico.MapColors(0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, -1,-1,-1,-1) - ico.DrawBox(rgb(255,255,255,1),1,1,ico.Width()/2,ico.Height()/2) - using = new /obj/screen( src ) - using.name = "harm" - using.icon = ico - using.screen_loc = ui_acti - using.layer = 21 - src.adding += using - hurt_intent = using - -//end intent small hud objects - - using = new /obj/screen() - using.name = "mov_intent" - using.dir = SOUTHWEST - using.icon = ui_style - using.icon_state = (mymob.m_intent == "run" ? "running" : "walking") - using.screen_loc = ui_movi - using.layer = 20 - src.adding += using - move_intent = using - - using = new /obj/screen() - using.name = "drop" - using.icon = ui_style - using.icon_state = "act_drop" - using.screen_loc = ui_drop_throw - using.layer = 19 - src.hotkeybuttons += using - - inv_box = new /obj/screen/inventory() - inv_box.name = "i_clothing" - inv_box.dir = SOUTH - inv_box.icon = ui_style - inv_box.slot_id = slot_w_uniform - inv_box.icon_state = "center" - inv_box.screen_loc = ui_iclothing - inv_box.layer = 19 - src.other += inv_box - - inv_box = new /obj/screen/inventory() - inv_box.name = "o_clothing" - inv_box.dir = SOUTH - inv_box.icon = ui_style - inv_box.slot_id = slot_wear_suit - inv_box.icon_state = "equip" - inv_box.screen_loc = ui_oclothing - inv_box.layer = 19 - src.other += inv_box - - inv_box = new /obj/screen/inventory() - inv_box.name = "r_hand" - inv_box.dir = WEST - inv_box.icon = ui_style - inv_box.icon_state = "hand_inactive" - if(mymob && !mymob.hand) //This being 0 or null means the right hand is in use - inv_box.icon_state = "hand_active" - inv_box.screen_loc = ui_rhand - inv_box.slot_id = slot_r_hand - inv_box.layer = 19 - src.r_hand_hud_object = inv_box - src.adding += inv_box - - inv_box = new /obj/screen/inventory() - inv_box.name = "l_hand" - inv_box.dir = EAST - inv_box.icon = ui_style - inv_box.icon_state = "hand_inactive" - if(mymob && mymob.hand) //This being 1 means the left hand is in use - inv_box.icon_state = "hand_active" - inv_box.screen_loc = ui_lhand - inv_box.slot_id = slot_l_hand - inv_box.layer = 19 - src.l_hand_hud_object = inv_box - src.adding += inv_box - - using = new /obj/screen/inventory() - using.name = "hand" - using.dir = SOUTH - using.icon = ui_style - using.icon_state = "hand1" - using.screen_loc = ui_swaphand1 - using.layer = 19 - src.adding += using - - using = new /obj/screen/inventory() - using.name = "hand" - using.dir = SOUTH - using.icon = ui_style - using.icon_state = "hand2" - using.screen_loc = ui_swaphand2 - using.layer = 19 - src.adding += using - - inv_box = new /obj/screen/inventory() - inv_box.name = "id" - inv_box.dir = NORTH - inv_box.icon = ui_style - inv_box.icon_state = "id" - inv_box.screen_loc = ui_id - inv_box.slot_id = slot_wear_id - inv_box.layer = 19 - src.adding += inv_box - - inv_box = new /obj/screen/inventory() - inv_box.name = "mask" - inv_box.dir = NORTH - inv_box.icon = ui_style - inv_box.icon_state = "equip" - inv_box.screen_loc = ui_mask - inv_box.slot_id = slot_wear_mask - inv_box.layer = 19 - src.other += inv_box - - inv_box = new /obj/screen/inventory() - inv_box.name = "back" - inv_box.dir = NORTH - inv_box.icon = ui_style - inv_box.icon_state = "back" - inv_box.screen_loc = ui_back - inv_box.slot_id = slot_back - inv_box.layer = 19 - src.adding += inv_box - - inv_box = new /obj/screen/inventory() - inv_box.name = "storage1" - inv_box.icon = ui_style - inv_box.icon_state = "pocket" - inv_box.screen_loc = ui_storage1 - inv_box.slot_id = slot_l_store - inv_box.layer = 19 - src.adding += inv_box - - inv_box = new /obj/screen/inventory() - inv_box.name = "storage2" - inv_box.icon = ui_style - inv_box.icon_state = "pocket" - inv_box.screen_loc = ui_storage2 - inv_box.slot_id = slot_r_store - inv_box.layer = 19 - src.adding += inv_box - - inv_box = new /obj/screen/inventory() - inv_box.name = "suit storage" - inv_box.icon = ui_style - inv_box.dir = 8 //The sprite at dir=8 has the background whereas the others don't. - inv_box.icon_state = "belt" - inv_box.screen_loc = ui_sstore1 - inv_box.slot_id = slot_s_store - inv_box.layer = 19 - src.adding += inv_box - - using = new /obj/screen() - using.name = "resist" - using.icon = ui_style - using.icon_state = "act_resist" - using.screen_loc = ui_pull_resist - using.layer = 19 - src.hotkeybuttons += using - - using = new /obj/screen() - using.name = "other" - using.icon = ui_style - using.icon_state = "other" - using.screen_loc = ui_inventory - using.layer = 20 - src.adding += using - - using = new /obj/screen() - using.name = "equip" - using.icon = ui_style - using.icon_state = "act_equip" - using.screen_loc = ui_equip - using.layer = 20 - src.adding += using - - inv_box = new /obj/screen/inventory() - inv_box.name = "gloves" - inv_box.icon = ui_style - inv_box.icon_state = "gloves" - inv_box.screen_loc = ui_gloves - inv_box.slot_id = slot_gloves - inv_box.layer = 19 - src.other += inv_box - - inv_box = new /obj/screen/inventory() - inv_box.name = "eyes" - inv_box.icon = ui_style - inv_box.icon_state = "glasses" - inv_box.screen_loc = ui_glasses - inv_box.slot_id = slot_glasses - inv_box.layer = 19 - src.other += inv_box - - inv_box = new /obj/screen/inventory() - inv_box.name = "ears" - inv_box.icon = ui_style - inv_box.icon_state = "ears" - inv_box.screen_loc = ui_ears - inv_box.slot_id = slot_l_ear - inv_box.layer = 19 - src.other += inv_box - - inv_box = new /obj/screen/inventory() - inv_box.name = "head" - inv_box.icon = ui_style - inv_box.icon_state = "hair" - inv_box.screen_loc = ui_head - inv_box.slot_id = slot_head - inv_box.layer = 19 - src.other += inv_box - - inv_box = new /obj/screen/inventory() - inv_box.name = "shoes" - inv_box.icon = ui_style - inv_box.icon_state = "shoes" - inv_box.screen_loc = ui_shoes - inv_box.slot_id = slot_shoes - inv_box.layer = 19 - src.other += inv_box - - inv_box = new /obj/screen/inventory() - inv_box.name = "belt" - inv_box.icon = ui_style - inv_box.icon_state = "belt" - inv_box.screen_loc = ui_belt - inv_box.slot_id = slot_belt - inv_box.layer = 19 - src.adding += inv_box - - mymob.throw_icon = new /obj/screen() - mymob.throw_icon.icon = ui_style - mymob.throw_icon.icon_state = "act_throw_off" - mymob.throw_icon.name = "throw" - mymob.throw_icon.screen_loc = ui_drop_throw - src.hotkeybuttons += mymob.throw_icon - - mymob.oxygen = new /obj/screen() - mymob.oxygen.icon = ui_style - mymob.oxygen.icon_state = "oxy0" - mymob.oxygen.name = "oxygen" - mymob.oxygen.screen_loc = ui_oxygen - - mymob.pressure = new /obj/screen() - mymob.pressure.icon = ui_style - mymob.pressure.icon_state = "pressure0" - mymob.pressure.name = "pressure" - mymob.pressure.screen_loc = ui_pressure - - mymob.toxin = new /obj/screen() - mymob.toxin.icon = ui_style - mymob.toxin.icon_state = "tox0" - mymob.toxin.name = "toxin" - mymob.toxin.screen_loc = ui_toxin - - mymob.internals = new /obj/screen() - mymob.internals.icon = ui_style - mymob.internals.icon_state = "internal0" - mymob.internals.name = "internal" - mymob.internals.screen_loc = ui_internal - - mymob.fire = new /obj/screen() - mymob.fire.icon = ui_style - mymob.fire.icon_state = "fire0" - mymob.fire.name = "fire" - mymob.fire.screen_loc = ui_fire - - mymob.bodytemp = new /obj/screen() - mymob.bodytemp.icon = ui_style - mymob.bodytemp.icon_state = "temp1" - mymob.bodytemp.name = "body temperature" - mymob.bodytemp.screen_loc = ui_temp - - mymob.healths = new /obj/screen() - mymob.healths.icon = ui_style - mymob.healths.icon_state = "health0" - mymob.healths.name = "health" - mymob.healths.screen_loc = ui_health - - mymob.nutrition_icon = new /obj/screen() - mymob.nutrition_icon.icon = ui_style - mymob.nutrition_icon.icon_state = "nutrition0" - mymob.nutrition_icon.name = "nutrition" - mymob.nutrition_icon.screen_loc = ui_nutrition - - mymob.pullin = new /obj/screen() - mymob.pullin.icon = ui_style - mymob.pullin.icon_state = "pull0" - mymob.pullin.name = "pull" - mymob.pullin.screen_loc = ui_pull_resist - src.hotkeybuttons += mymob.pullin - - mymob.blind = new /obj/screen() - mymob.blind.icon = 'icons/mob/screen1_full.dmi' - mymob.blind.icon_state = "blackimageoverlay" - mymob.blind.name = " " - mymob.blind.screen_loc = "1,1" - mymob.blind.mouse_opacity = 0 - mymob.blind.layer = 0 - - mymob.damageoverlay = new /obj/screen() - mymob.damageoverlay.icon = 'icons/mob/screen1_full.dmi' - mymob.damageoverlay.icon_state = "oxydamageoverlay0" - mymob.damageoverlay.name = "dmg" - mymob.damageoverlay.screen_loc = "1,1" - mymob.damageoverlay.mouse_opacity = 0 - mymob.damageoverlay.layer = 18.1 //The black screen overlay sets layer to 18 to display it, this one has to be just on top. - - mymob.flash = new /obj/screen() - mymob.flash.icon = ui_style - mymob.flash.icon_state = "blank" - mymob.flash.name = "flash" - mymob.flash.screen_loc = "1,1 to 15,15" - mymob.flash.layer = 17 - - mymob.pain = new /obj/screen( null ) - -/* - mymob.hands = new /obj/screen( null ) - mymob.hands.icon = ui_style - mymob.hands.icon_state = "hand" - mymob.hands.name = "hand" - mymob.hands.screen_loc = ui_hand - mymob.hands.dir = NORTH - - mymob.sleep = new /obj/screen( null ) - mymob.sleep.icon = ui_style - mymob.sleep.icon_state = "sleep0" - mymob.sleep.name = "sleep" - mymob.sleep.screen_loc = ui_sleep - - mymob.rest = new /obj/screen( null ) - mymob.rest.icon = ui_style - mymob.rest.icon_state = "rest0" - mymob.rest.name = "rest" - mymob.rest.screen_loc = ui_rest -*/ - - /*/Monkey blockers - - using = new /obj/screen( src ) - using.name = "blocked" - using.icon_state = "blocked" - using.screen_loc = ui_ears - using.layer = 20 - src.mon_blo += using - - using = new /obj/screen( src ) - using.name = "blocked" - using.icon_state = "blocked" - using.screen_loc = ui_belt - using.layer = 20 - src.mon_blo += using - - using = new /obj/screen( src ) - using.name = "blocked" - using.icon_state = "blocked" - using.screen_loc = ui_shoes - using.layer = 20 - src.mon_blo += using - - using = new /obj/screen( src ) - using.name = "blocked" - using.icon_state = "blocked" - using.screen_loc = ui_storage2 - using.layer = 20 - src.mon_blo += using - - using = new /obj/screen( src ) - using.name = "blocked" - using.icon_state = "blocked" - using.screen_loc = ui_glasses - using.layer = 20 - src.mon_blo += using - - using = new /obj/screen( src ) - using.name = "blocked" - using.icon_state = "blocked" - using.screen_loc = ui_gloves - using.layer = 20 - src.mon_blo += using - - using = new /obj/screen( src ) - using.name = "blocked" - using.icon_state = "blocked" - using.screen_loc = ui_storage1 - using.layer = 20 - src.mon_blo += using - - using = new /obj/screen( src ) - using.name = "blocked" - using.icon_state = "blocked" - using.screen_loc = ui_headset - using.layer = 20 - src.mon_blo += using - - using = new /obj/screen( src ) - using.name = "blocked" - using.icon_state = "blocked" - using.screen_loc = ui_oclothing - using.layer = 20 - src.mon_blo += using - - using = new /obj/screen( src ) - using.name = "blocked" - using.icon_state = "blocked" - using.screen_loc = ui_iclothing - using.layer = 20 - src.mon_blo += using - - using = new /obj/screen( src ) - using.name = "blocked" - using.icon_state = "blocked" - using.screen_loc = ui_id - using.layer = 20 - src.mon_blo += using - - using = new /obj/screen( src ) - using.name = "blocked" - using.icon_state = "blocked" - using.screen_loc = ui_head - using.layer = 20 - src.mon_blo += using -//Monkey blockers -*/ - - mymob.zone_sel = new /obj/screen/zone_sel( null ) - mymob.zone_sel.icon = ui_style - mymob.zone_sel.overlays.Cut() - mymob.zone_sel.overlays += image('icons/mob/zone_sel.dmi', "[mymob.zone_sel.selecting]") - - //Handle the gun settings buttons - mymob.gun_setting_icon = new /obj/screen/gun/mode(null) - if (mymob.client) - if (mymob.client.gun_mode) // If in aim mode, correct the sprite - mymob.gun_setting_icon.dir = 2 - for(var/obj/item/weapon/gun/G in mymob) // If targeting someone, display other buttons - if (G.target) - mymob.item_use_icon = new /obj/screen/gun/item(null) - if (mymob.client.target_can_click) - mymob.item_use_icon.dir = 1 - src.adding += mymob.item_use_icon - mymob.gun_move_icon = new /obj/screen/gun/move(null) - if (mymob.client.target_can_move) - mymob.gun_move_icon.dir = 1 - mymob.gun_run_icon = new /obj/screen/gun/run(null) - if (mymob.client.target_can_run) - mymob.gun_run_icon.dir = 1 - src.adding += mymob.gun_run_icon - src.adding += mymob.gun_move_icon - - - mymob.client.screen = null - - mymob.client.screen += list( mymob.throw_icon, mymob.zone_sel, mymob.oxygen, mymob.pressure, mymob.toxin, mymob.bodytemp, mymob.internals, mymob.fire, mymob.healths, mymob.nutrition_icon, mymob.pullin, mymob.blind, mymob.flash, mymob.damageoverlay, mymob.gun_setting_icon) //, mymob.hands, mymob.rest, mymob.sleep) //, mymob.mach ) - mymob.client.screen += src.adding + src.hotkeybuttons - inventory_shown = 0; - - return - - -/mob/living/carbon/human/verb/toggle_hotkey_verbs() - set category = "OOC" - set name = "Toggle hotkey buttons" - set desc = "This disables or enables the user interface buttons which can be used with hotkeys." - - if(hud_used.hotkey_ui_hidden) - client.screen += src.hud_used.hotkeybuttons - src.hud_used.hotkey_ui_hidden = 0 - else - client.screen -= src.hud_used.hotkeybuttons - src.hud_used.hotkey_ui_hidden = 1 \ No newline at end of file diff --git a/code/modules/mob/living/carbon/metroid/hud.dm b/code/modules/mob/living/carbon/metroid/hud.dm deleted file mode 100644 index c5282b9a839..00000000000 --- a/code/modules/mob/living/carbon/metroid/hud.dm +++ /dev/null @@ -1,2 +0,0 @@ -/mob/living/carbon/slime/regular_hud_updates() - return \ No newline at end of file diff --git a/code/modules/mob/living/silicon/mommi/life.dm b/code/modules/mob/living/silicon/mommi/life.dm deleted file mode 100644 index 04ab3871af6..00000000000 --- a/code/modules/mob/living/silicon/mommi/life.dm +++ /dev/null @@ -1,280 +0,0 @@ -/mob/living/silicon/robot/mommi/Life() - set invisibility = 0 - set background = 1 - - if (src.notransform) - return - - - src.blinded = null - - //Status updates, death etc. - clamp_values() - handle_regular_status_updates() - - if(client) - handle_regular_hud_updates() - update_items() - if (src.stat != DEAD) //still using power - use_power() - process_killswitch() - process_locks() - update_canmove() - - - - -/mob/living/silicon/robot/mommi/clamp_values() - -// SetStunned(min(stunned, 30)) - SetParalysis(min(paralysis, 30)) -// SetWeakened(min(weakened, 20)) - sleeping = 0 - adjustBruteLoss(0) - adjustToxLoss(0) - adjustOxyLoss(0) - adjustFireLoss(0) - - -/mob/living/silicon/robot/mommi/use_power() - - if (src.cell) - if(src.cell.charge <= 0) - uneq_all() - src.stat = 1 - else if (src.cell.charge <= 100) - src.module_active = null - src.sight_state = null - src.tool_state = null - src.sight_mode = 0 - src.cell.use(1) - else - if(src.sight_state) - src.cell.use(5) - if(src.tool_state) - src.cell.use(5) - src.cell.use(1) - src.blinded = 0 - src.stat = 0 - else - uneq_all() - src.stat = 1 - - -/mob/living/silicon/robot/mommi/handle_regular_status_updates() - - if(src.camera && !scrambledcodes) - if(src.stat == 2 || wires.IsCameraCut()) - src.camera.status = 0 - else - src.camera.status = 1 - - health = maxHealth - (getOxyLoss() + getFireLoss() + getBruteLoss()) - - if(getOxyLoss() > 50) Paralyse(3) - - if(src.sleeping) - Paralyse(3) - src.sleeping-- - - if(src.resting) - Weaken(5) - - if(health <= 0 && src.stat != 2) //die only once - gib() - - if (src.stat != 2) //Alive. - if (src.paralysis || src.stunned || src.weakened) //Stunned etc. - src.stat = 1 - if (src.stunned > 0) - AdjustStunned(-1) - if (src.weakened > 0) - AdjustWeakened(-1) - if (src.paralysis > 0) - AdjustParalysis(-1) - src.blinded = 1 - else - src.blinded = 0 - - else //Not stunned. - src.stat = 0 - - else //Dead. - src.blinded = 1 - src.stat = 2 - - if (src.stuttering) src.stuttering-- - - if (src.eye_blind) - src.eye_blind-- - src.blinded = 1 - - if (src.ear_deaf > 0) src.ear_deaf-- - if (src.ear_damage < 25) - src.ear_damage -= 0.05 - src.ear_damage = max(src.ear_damage, 0) - - src.density = !( src.lying ) - - if ((src.sdisabilities & BLIND)) - src.blinded = 1 - if ((src.sdisabilities & DEAF)) - src.ear_deaf = 1 - - if (src.eye_blurry > 0) - src.eye_blurry-- - src.eye_blurry = max(0, src.eye_blurry) - - if (src.druggy > 0) - src.druggy-- - src.druggy = max(0, src.druggy) - - return 1 -/ -/mob/living/silicon/robot/mommi/handle_regular_hud_updates() - - if (src.stat == 2 || XRAY in mutations || src.sight_mode & BORGXRAY) - src.sight |= SEE_TURFS - src.sight |= SEE_MOBS - src.sight |= SEE_OBJS - src.see_in_dark = 8 - src.see_invisible = SEE_INVISIBLE_LEVEL_TWO - else if (src.sight_mode & BORGMESON && src.sight_mode & BORGTHERM) - src.sight |= SEE_TURFS - src.sight |= SEE_MOBS - src.see_in_dark = 8 - see_invisible = SEE_INVISIBLE_MINIMUM - else if (src.sight_mode & BORGMESON) - src.sight |= SEE_TURFS - src.see_in_dark = 8 - see_invisible = SEE_INVISIBLE_MINIMUM - else if (src.sight_mode & BORGTHERM) - src.sight |= SEE_MOBS - src.see_in_dark = 8 - src.see_invisible = SEE_INVISIBLE_LEVEL_TWO - else if (src.stat != 2) - src.sight &= ~SEE_MOBS - src.sight &= ~SEE_TURFS - src.sight &= ~SEE_OBJS - src.see_in_dark = 8 - src.see_invisible = SEE_INVISIBLE_LEVEL_TWO - - var/obj/item/borg/sight/hud/hud = (locate(/obj/item/borg/sight/hud) in src) - if(hud && hud.hud) hud.hud.process_hud(src) - - if (src.healths) - if (src.stat != 2) - switch(health) - if(60 to INFINITY) - src.healths.icon_state = "health0" - if(40 to 60) - src.healths.icon_state = "health1" - if(30 to 40) - src.healths.icon_state = "health2" - if(10 to 20) - src.healths.icon_state = "health3" - if(0 to 10) - src.healths.icon_state = "health4" - if(config.health_threshold_dead to 0) - src.healths.icon_state = "health5" - else - src.healths.icon_state = "health6" - else - src.healths.icon_state = "health7" - - if (src.syndicate && src.client) - if(ticker.mode.name == "traitor") - for(var/datum/mind/tra in ticker.mode.traitors) - if(tra.current) - var/I = image('icons/mob/mob.dmi', loc = tra.current, icon_state = "traitor") - src.client.images += I - if(src.connected_ai) - src.connected_ai.connected_robots -= src - src.connected_ai = null - if(src.mind) - if(!src.mind.special_role) - src.mind.special_role = "traitor" - ticker.mode.traitors += src.mind - - if (src.cells) - if (src.cell) - var/cellcharge = src.cell.charge/src.cell.maxcharge - switch(cellcharge) - if(0.75 to INFINITY) - src.cells.icon_state = "charge4" - if(0.5 to 0.75) - src.cells.icon_state = "charge3" - if(0.25 to 0.5) - src.cells.icon_state = "charge2" - if(0 to 0.25) - src.cells.icon_state = "charge1" - else - src.cells.icon_state = "charge0" - else - src.cells.icon_state = "charge-empty" - - if(bodytemp) - switch(src.bodytemperature) //310.055 optimal body temp - if(335 to INFINITY) - src.bodytemp.icon_state = "temp2" - if(320 to 335) - src.bodytemp.icon_state = "temp1" - if(300 to 320) - src.bodytemp.icon_state = "temp0" - if(260 to 300) - src.bodytemp.icon_state = "temp-1" - else - src.bodytemp.icon_state = "temp-2" - - - if(src.pullin) src.pullin.icon_state = "pull[src.pulling ? 1 : 0]" -//Oxygen and fire does nothing yet!! -// if (src.oxygen) src.oxygen.icon_state = "oxy[src.oxygen_alert ? 1 : 0]" -// if (src.fire) src.fire.icon_state = "fire[src.fire_alert ? 1 : 0]" - - client.screen.Remove(global_hud.blurry,global_hud.druggy,global_hud.vimpaired) - - if ((src.blind && src.stat != 2)) - if(src.blinded) - src.blind.layer = 18 - else - src.blind.layer = 0 - if (src.disabilities & NEARSIGHTED) - src.client.screen += global_hud.vimpaired - - if (src.eye_blurry) - src.client.screen += global_hud.blurry - - if (src.druggy) - src.client.screen += global_hud.druggy - - if (src.stat != 2) - if (src.machine) - if (!( src.machine.check_eye(src) )) - src.reset_view(null) - else - if(!client.adminobs) - reset_view(null) - - return 1 - - -// MoMMIs only have one hand. -/mob/living/silicon/robot/mommi/update_items() - if (src.client) - src.client.screen -= src.contents - for(var/obj/I in src.contents) - //if(I && !(istype(I,/obj/item/weapon/stock_parts/cell) || istype(I,/obj/item/device/radio) || istype(I,/obj/machinery/camera) || istype(I,/obj/item/device/mmi))) - if(I) - // Make sure we're not showing any of our internal components, as that would be lewd. - // This way of doing it ensures that shit we pick up will be visible, wheras shit inside of us isn't. - if(I!=src.cell && I!=src.radio && I!=src.camera && I!=src.mmi) - src.client.screen += I - if(src.sight_state) - src.sight_state:screen_loc = ui_inv1 - if(src.tool_state) - src.tool_state:screen_loc = ui_inv2 - -/mob/living/silicon/robot/mommi/update_canmove() - canmove = !(paralysis || stunned || weakened || buckled || lockcharge || anchored) - return canmove \ No newline at end of file diff --git a/code/modules/mob/living/silicon/mommi/mommi.dm b/code/modules/mob/living/silicon/mommi/mommi.dm deleted file mode 100644 index b904b7d72f6..00000000000 --- a/code/modules/mob/living/silicon/mommi/mommi.dm +++ /dev/null @@ -1,536 +0,0 @@ -/* Basically, the concept is this: -You have an MMI. It can't do squat on its own. -Now you put some robot legs and arms on the thing, and POOF! You have a Mobile MMI, or MoMMI. -Why? MoMMIs can do all sorts of shit, like ventcrawl, do shit with their hands, etc. -They can only use one tool at a time, they can't choose modules, and they have 1/6th the HP of a borg. -*/ -/mob/living/silicon/robot/mommi - name = "Mobile MMI" - real_name = "Mobile MMI" - icon = 'icons/mob/robots.dmi'// - icon_state = "mommi" - maxHealth = 60 - health = 60 - pass_flags = PASSTABLE - var/keeper=0 // 0 = No, 1 = Yes (Disables speech and common radio.) - var/picked = 0 - var/subtype="keeper" - var/obj/screen/inv_tool = null - var/obj/screen/inv_sight = null - -//one tool and one sightmod can be activated at any one time. - var/tool_state = null - var/sight_state = null - - modtype = "robot" // Not sure what this is, but might be cool to have seperate loadouts for MoMMIs (e.g. paintjobs and tools) - //Cyborgs will sync their laws with their AI by default, but we may want MoMMIs to be mute independents at some point, kinda like the Keepers in Ass Effect. - lawupdate = 1 - -/mob/living/carbon/can_use_hands() - return 1 - -/mob/living/silicon/robot/mommi/New(loc) - spark_system = new /datum/effect/system/spark_spread() - spark_system.set_up(5, 0, src) - spark_system.attach(src) - - - ident = rand(1, 999) - updatename() - updateicon() - - if(!cell) - cell = new /obj/item/weapon/stock_parts/cell(src) - cell.maxcharge = 7500 - cell.charge = 7500 - ..() - module = new /obj/item/weapon/robot_module/mommi(src) - laws = new mommi_base_law_type - // Don't sync if we're a KEEPER. - if(!istype(laws,/datum/ai_laws/keeper)) - connected_ai = select_active_ai_with_fewest_borgs() - else - // Enforce silence. - keeper=1 - connected_ai = null // Enforce no AI parent - scrambledcodes = 1 // Hide from console because people are fucking idiots - - if(connected_ai) - connected_ai.connected_robots += src - lawsync() - lawupdate = 1 - else - lawupdate = 0 - - radio = new /obj/item/device/radio/borg(src) - if(!scrambledcodes && !camera) - camera = new /obj/machinery/camera(src) - camera.c_tag = real_name - camera.network = list("SS13") - if(wires.IsCameraCut()) // 5 = BORG CAMERA - camera.status = 0 - - // Sanity check - if(connected_ai && keeper) - world << "\red ASSERT FAILURE: connected_ai && keeper in mommi.dm" - - //playsound(loc, 'sound/voice/liveagain.ogg', 75, 1) - playsound(loc, 'sound/misc/interference.ogg', 75, 1) - - -/mob/living/silicon/robot/mommi/choose_icon() - var/icontype = input("Select an icon!", "Mobile MMI", null) in list("Basic", "Keeper") - switch(icontype) - if("Basic") subtype = "mommi" - else subtype = "keeper" - updateicon() - var/answer = input("Is this what you want?", "Mobile MMI", null) in list("Yes", "No") - switch(answer) - if("No") - choose_icon() - return - picked = 1 - -/mob/living/silicon/robot/mommi/pick_module() - - if(module) - return - var/list/modules = list("MoMMI") - if(modules.len) - modtype = input("Please, select a module!", "Robot", null, null) in modules - else: - modtype=modules[0] - - var/module_sprites[0] //Used to store the associations between sprite names and sprite index. - var/channels = list() - - if(module) - return - - switch(modtype) - if("MoMMI") - module = new /obj/item/weapon/robot_module/standard(src) - module_sprites["Basic"] = "mommi" - module_sprites["Keeper"] = "keeper" - - //Custom_sprite check and entry - if (custom_sprite == 1) - module_sprites["Custom"] = "[src.ckey]-[modtype]" - - hands.icon_state = lowertext(modtype) - feedback_inc("mommi_[lowertext(modtype)]",1) - updatename() - - choose_icon(6,module_sprites) - radio.config(channels) - base_icon = icon_state - -//If there's an MMI in the robot, have it ejected when the mob goes away. --NEO -//Improved /N -/mob/living/silicon/robot/mommi/Del() - if(mmi)//Safety for when a cyborg gets dust()ed. Or there is no MMI inside. - var/obj/item/device/mmi/nmmi = mmi - var/turf/T = get_turf(loc)//To hopefully prevent run time errors. - if(T) nmmi.loc = T - if(mind) mind.transfer_to(nmmi.brainmob) - mmi = null - nmmi.icon = 'icons/obj/assemblies.dmi' - nmmi.invisibility = 0 - ..() - -/mob/living/silicon/robot/mommi/updatename(var/prefix as text) - - var/changed_name = "" - if(custom_name) - changed_name = custom_name - else - changed_name = "Mobile MMI [num2text(ident)]" - real_name = changed_name - name = real_name - -/mob/living/silicon/robot/attackby(obj/item/weapon/W as obj, mob/user as mob, params) - if (istype(W, /obj/item/weapon/restraints/handcuffs)) // fuck i don't even know why isrobot() in handcuff code isn't working so this will have to do - return - - if (istype(W, /obj/item/weapon/weldingtool)) - var/obj/item/weapon/weldingtool/WT = W - if (WT.remove_fuel(0)) - adjustBruteLoss(-30) - updatehealth() - add_fingerprint(user) - for(var/mob/O in viewers(user, null)) - O.show_message(text("\red [user] has fixed some of the dents on [src]!"), 1) - else - user << "Need more welding fuel!" - return - - else if(istype(W, /obj/item/stack/cable_coil) && wiresexposed) - var/obj/item/stack/cable_coil/coil = W - adjustFireLoss(-30) - updatehealth() - coil.use(1) - for(var/mob/O in viewers(user, null)) - O.show_message(text("\red [user] has fixed some of the burnt wires on [src]!"), 1) - - else if (istype(W, /obj/item/weapon/crowbar)) // crowbar means open or close the cover - if(stat == DEAD) - user << "You pop the MMI off the base." - spawn(0) - del(src) - return - if(opened) - user << "You close the cover." - opened = 0 - updateicon() - else - if(locked) - user << "The cover is locked and cannot be opened." - else - user << "You open the cover." - opened = 1 - updateicon() - - else if (istype(W, /obj/item/weapon/stock_parts/cell) && opened) // trying to put a cell inside - if(wiresexposed) - user << "Close the panel first." - else if(cell) - user << "There is a power cell already installed." - else - user.drop_item() - W.loc = src - cell = W - user << "You insert the power cell." -// chargecount = 0 - updateicon() - - else if (istype(W, /obj/item/weapon/wirecutters) || istype(W, /obj/item/device/multitool)) - if (wiresexposed) - wires.Interact() - else - user << "You can't reach the wiring." - - else if(istype(W, /obj/item/weapon/screwdriver) && opened && !cell) // haxing - wiresexposed = !wiresexposed - user << "The wires have been [wiresexposed ? "exposed" : "unexposed"]" - updateicon() - - else if(istype(W, /obj/item/weapon/screwdriver) && opened && cell) // radio - if(radio) - radio.attackby(W,user)//Push it to the radio to let it handle everything - else - user << "Unable to locate a radio." - updateicon() - - else if(istype(W, /obj/item/device/encryptionkey/) && opened) - if(radio)//sanityyyyyy - radio.attackby(W,user)//GTFO, you have your own procs - else - user << "Unable to locate a radio." - - else if (istype(W, /obj/item/weapon/card/id)||istype(W, /obj/item/device/pda)) // trying to unlock the interface with an ID card - if(emagged)//still allow them to open the cover - user << "The interface seems slightly damaged" - if(opened) - user << "You must close the cover to swipe an ID card." - else - if(allowed(usr)) - locked = !locked - user << "You [ locked ? "lock" : "unlock"] [src]'s interface." - updateicon() - else - user << "\red Access denied." - - else if(istype(W, /obj/item/borg/upgrade/)) - var/obj/item/borg/upgrade/U = W - if(!opened) - usr << "You must access the borgs internals!" - else if(!src.module && U.require_module) - usr << "The borg must choose a module before he can be upgraded!" - else if(U.locked) - usr << "The upgrade is locked and cannot be used yet!" - else - if(U.action(src)) - usr << "You apply the upgrade to [src]!" - usr.drop_item() - U.loc = src - else - usr << "Upgrade error!" - - - else - spark_system.start() - return ..() - -/mob/living/silicon/robot/mommi/emag_act(user as mob) - if(!opened)//Cover is closed - if(locked) - if(prob(90)) - user << "You emag the cover lock." - locked = 0 - else - user << "You fail to emag the cover lock." - if(prob(25)) - src << "Hack attempt detected." - else - user << "The cover is already unlocked." - return - - if(opened)//Cover is open - if(emagged) return//Prevents the X has hit Y with Z message also you cant emag them twice - if(wiresexposed) - user << "You must close the panel first" - return - else - sleep(6) - if(prob(50)) - emagged = 1 - lawupdate = 0 - connected_ai = null - user << "You emag [src]'s interface." -// message_admins("[key_name_admin(user)] emagged cyborg [key_name_admin(src)]. Laws overridden.") - log_game("[key_name(user)] emagged cyborg [key_name(src)]. Laws overridden.") - clear_supplied_laws() - clear_inherent_laws() - laws = new /datum/ai_laws/syndicate_override - var/time = time2text(world.realtime,"hh:mm:ss") - lawchanges.Add("[time] : [user.name]([user.key]) emagged [name]([key])") - set_zeroth_law("Only [user.real_name] and people he designates as being such are Syndicate Agents.") - src << "\red ALERT: Foreign software detected." - sleep(5) - src << "\red Initiating diagnostics..." - sleep(20) - src << "\red SynBorg v1.7 loaded." - sleep(5) - src << "\red LAW SYNCHRONISATION ERROR" - sleep(5) - src << "\red Would you like to send a report to NanoTraSoft? Y/N" - sleep(10) - src << "\red > N" - sleep(20) - src << "\red ERRORERRORERROR" - src << "Obey these laws:" - laws.show_laws(src) - src << "\red \b ALERT: [user.real_name] is your new master. Obey your new laws and his commands." - if(src.module && istype(src.module, /obj/item/weapon/robot_module/miner)) - for(var/obj/item/weapon/pickaxe/borgdrill/D in src.module.modules) - del(D) - src.module.modules += new /obj/item/weapon/pickaxe/diamonddrill(src.module) - src.module.rebuild() - updateicon() - else - user << "You fail to [ locked ? "unlock" : "lock"] [src]'s interface." - if(prob(25)) - src << "Hack attempt detected." - return - -/mob/living/silicon/robot/mommi/attack_hand(mob/user) - add_fingerprint(user) - - if(opened && !wiresexposed && (!istype(user, /mob/living/silicon))) - if(cell) - cell.updateicon() - cell.add_fingerprint(user) - user.put_in_active_hand(cell) - user << "You remove \the [cell]." - cell = null - updateicon() - return - - - if(ishuman(user)) - if(user.a_intent == I_HELP) - user.visible_message("\blue [user.name] pats [src.name] on the head.") - return - - - - if(!istype(user, /mob/living/silicon)) - switch(user.a_intent) - if(I_DISARM) - user.attack_log += text("\[[time_stamp()]\] Disarmed [src.name] ([src.ckey])") - src.attack_log += text("\[[time_stamp()]\] Has been disarmed by [user.name] ([user.ckey])") - log_admin("ATTACK: [user.name] ([user.ckey]) disarmed [src.name] ([src.ckey])") - log_attack("[user.name] ([user.ckey]) disarmed [src.name] ([src.ckey])") - var/randn = rand(1,100) - //var/talked = 0; - if (randn <= 25) - weakened = 3 - playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) - visible_message("\red [user] has pushed [src]!") - var/obj/item/found = locate(tool_state) in src.module.modules - if(!found) - var/obj/item/TS = tool_state - drop_item() - if(TS && TS.loc) - TS.loc = src.loc - visible_message("\red [src]'s robotic arm loses grip on what it was holding") - return - if(randn <= 50)//MoMMI's robot arm is stronger than a human's, but not by much - var/obj/item/found = locate(tool_state) in src.module.modules - if(!found) - var/obj/item/TS = tool_state - drop_item() - if(TS && TS.loc) - TS.loc = src.loc - playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) - visible_message("\red [user] has disarmed [src]!") - else - playsound(loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1) - visible_message("\red [user] attempted to disarm [src]!") - return - - playsound(loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1) - visible_message("\red [user] attempted to disarm [src]!") - -/mob/living/silicon/robot/mommi/updateicon() - icon_state=subtype - // Clear all overlays. - overlays.Cut() - if(opened) // TODO: Open the front "head" panel - if(wiresexposed) - overlays += "ov-openpanel +w" - else if(cell) - overlays += "ov-openpanel +c" - else - overlays += "ov-openpanel -c" - // Put our eyes just on top of the lighting, so it looks emissive in maint tunnels. - if(layer==MOB_LAYER) - overlays+=image(icon,"eyes-[subtype][emagged?"-emagged":""]",LIGHTING_LAYER+1) - if(anchored) - overlays+=image(icon,"[subtype]-park", LIGHTING_LAYER+1) - else - overlays+=image(icon,"eyes-[subtype][emagged?"-emagged":""]",TURF_LAYER+0.2) // Fixes floating eyes - if(anchored) - overlays+=image(icon,"[subtype]-park", TURF_LAYER+0.2) - return - - - -/mob/living/silicon/robot/mommi/installed_modules() - if(weapon_lock) - src << "\red Weapon lock active, unable to use modules! Count:[weaponlock_time]" - return - - if(!module) - pick_module() - return - if(!picked) - choose_icon() - return - var/dat = "Modules\n" - dat += {"
    -
    - Activated Modules -
    - Sight Mode: [sight_state ? "[sight_state]" : "No module selected"]
    - Utility Module: [tool_state ? "[tool_state]" : "No module selected"]
    -
    - Installed Modules

    "} - - - for (var/obj in module.modules) - if (!obj) - dat += text("Resource depleted
    ") - else if(activated(obj)) - dat += text("[obj]: Activated
    ") - else - dat += text("[obj]: Activate
    ") - if (emagged) - if(activated(module.emag)) - dat += text("[module.emag]: Activated
    ") - else - dat += text("[module.emag]: Activate
    ") - src << browse(dat, "window=robotmod") - onclose(src,"robotmod") // Register on-close shit, which unsets machinery. - - -/mob/living/silicon/robot/mommi/Topic(href, href_list) - ..() - if(usr && (src != usr)) - return - - if (href_list["mach_close"]) - var/t1 = text("window=[href_list["mach_close"]]") - unset_machine() - src << browse(null, t1) - return - - if (href_list["showalerts"]) - robot_alerts() - return - - if (href_list["mod"]) - var/obj/item/O = locate(href_list["mod"]) - if (O) - O.attack_self(src) - - if (href_list["act"]) - var/obj/item/O = locate(href_list["act"]) - var/obj/item/TS - if(!(locate(O) in src.module.modules) && O != src.module.emag) - return - if(istype(O,/obj/item/borg/sight)) - TS = sight_state - if(sight_state) - contents -= sight_state - sight_mode &= ~sight_state:sight_mode - if (client) - client.screen -= sight_state - sight_state = O - O.layer = 20 - contents += O - sight_mode |= sight_state:sight_mode - - inv_sight.icon_state = "sight+a" - inv_tool.icon_state = "inv1" - module_active=sight_state - else - TS = tool_state - if(tool_state) - contents -= tool_state - if (client) - client.screen -= tool_state - tool_state = O - O.layer = 20 - contents += O - - inv_sight.icon_state = "sight" - inv_tool.icon_state = "inv1 +a" - module_active=tool_state - if(TS && istype(TS)) - if(src.is_in_modules(TS)) - TS.loc = src.module - else - TS.layer=initial(TS.layer) - TS.loc = src.loc - - installed_modules() - return - -/mob/living/silicon/robot/mommi/radio_menu() - radio.interact(src)//Just use the radio's Topic() instead of bullshit special-snowflake code - - -/mob/living/silicon/robot/mommi/Move(a, b, flag) - - ..() - -/mob/living/silicon/robot/mommi/proc/ActivateKeeper() - set category = "Robot Commands" - set name = "Activate KEEPER" - set desc = "Performs a full purge of your laws and disconnects you from AIs and cyborg consoles. However, you lose the ability to speak and must remain neutral, only being permitted to perform station upkeep. You can still be emagged in this state." - - if(keeper) - return - - var/mob/living/silicon/robot/R = src - - if(R) - R.UnlinkSelf() - var/obj/item/weapon/aiModule/keeper/mdl = new - - mdl.transmitInstructions(src, src) - src << "These are your laws now:" - src.show_laws() - - src.verbs -= /mob/living/silicon/robot/mommi/proc/ActivateKeeper \ No newline at end of file diff --git a/code/modules/mob/living/silicon/robot/hud.dm b/code/modules/mob/living/silicon/robot/hud.dm deleted file mode 100644 index 8b82011bc2f..00000000000 --- a/code/modules/mob/living/silicon/robot/hud.dm +++ /dev/null @@ -1,171 +0,0 @@ - -/datum/hud/proc/robot_hud() - - src.adding = list() - src.other = list() - - var/obj/screen/using - - -//Radio - using = new /obj/screen() - using.name = "radio" - using.dir = SOUTHWEST - using.icon = 'icons/mob/screen1_robot.dmi' - using.icon_state = "radio" - using.screen_loc = ui_movi - using.layer = 20 - src.adding += using - -//Module select - - using = new /obj/screen() - using.name = "module1" - using.dir = SOUTHWEST - using.icon = 'icons/mob/screen1_robot.dmi' - using.icon_state = "inv1" - using.screen_loc = ui_inv1 - using.layer = 20 - src.adding += using - mymob:inv1 = using - - using = new /obj/screen() - using.name = "module2" - using.dir = SOUTHWEST - using.icon = 'icons/mob/screen1_robot.dmi' - using.icon_state = "inv2" - using.screen_loc = ui_inv2 - using.layer = 20 - src.adding += using - mymob:inv2 = using - - using = new /obj/screen() - using.name = "module3" - using.dir = SOUTHWEST - using.icon = 'icons/mob/screen1_robot.dmi' - using.icon_state = "inv3" - using.screen_loc = ui_inv3 - using.layer = 20 - src.adding += using - mymob:inv3 = using - -//End of module select - -//Intent - using = new /obj/screen() - using.name = "act_intent" - using.dir = SOUTHWEST - using.icon = 'icons/mob/screen1_robot.dmi' - using.icon_state = (mymob.a_intent == "hurt" ? "harm" : mymob.a_intent) - using.screen_loc = ui_acti - using.layer = 20 - src.adding += using - action_intent = using - -//Cell - mymob:cells = new /obj/screen() - mymob:cells.icon = 'icons/mob/screen1_robot.dmi' - mymob:cells.icon_state = "charge-empty" - mymob:cells.name = "cell" - mymob:cells.screen_loc = ui_toxin - -//Health - mymob.healths = new /obj/screen() - mymob.healths.icon = 'icons/mob/screen1_robot.dmi' - mymob.healths.icon_state = "health0" - mymob.healths.name = "health" - mymob.healths.screen_loc = ui_borg_health - -//Installed Module - mymob.hands = new /obj/screen() - mymob.hands.icon = 'icons/mob/screen1_robot.dmi' - mymob.hands.icon_state = "nomod" - mymob.hands.name = "module" - mymob.hands.screen_loc = ui_borg_module - -//Module Panel - using = new /obj/screen() - using.name = "panel" - using.icon = 'icons/mob/screen1_robot.dmi' - using.icon_state = "panel" - using.screen_loc = ui_borg_panel - using.layer = 19 - src.adding += using - -//Store - mymob.throw_icon = new /obj/screen() - mymob.throw_icon.icon = 'icons/mob/screen1_robot.dmi' - mymob.throw_icon.icon_state = "store" - mymob.throw_icon.name = "store" - mymob.throw_icon.screen_loc = ui_borg_store - -//Temp - mymob.bodytemp = new /obj/screen() - mymob.bodytemp.icon_state = "temp0" - mymob.bodytemp.name = "body temperature" - mymob.bodytemp.screen_loc = ui_temp - - - mymob.oxygen = new /obj/screen() - mymob.oxygen.icon = 'icons/mob/screen1_robot.dmi' - mymob.oxygen.icon_state = "oxy0" - mymob.oxygen.name = "oxygen" - mymob.oxygen.screen_loc = ui_oxygen - - mymob.fire = new /obj/screen() - mymob.fire.icon = 'icons/mob/screen1_robot.dmi' - mymob.fire.icon_state = "fire0" - mymob.fire.name = "fire" - mymob.fire.screen_loc = ui_fire - - mymob.pullin = new /obj/screen() - mymob.pullin.icon = 'icons/mob/screen1_robot.dmi' - mymob.pullin.icon_state = "pull0" - mymob.pullin.name = "pull" - mymob.pullin.screen_loc = ui_borg_pull - - mymob.blind = new /obj/screen() - mymob.blind.icon = 'icons/mob/screen1_full.dmi' - mymob.blind.icon_state = "blackimageoverlay" - mymob.blind.name = " " - mymob.blind.screen_loc = "1,1" - mymob.blind.layer = 0 - - mymob.flash = new /obj/screen() - mymob.flash.icon = 'icons/mob/screen1_robot.dmi' - mymob.flash.icon_state = "blank" - mymob.flash.name = "flash" - mymob.flash.screen_loc = "1,1 to 15,15" - mymob.flash.layer = 17 - - mymob.zone_sel = new /obj/screen/zone_sel() - mymob.zone_sel.icon = 'icons/mob/screen1_robot.dmi' - mymob.zone_sel.overlays.Cut() - mymob.zone_sel.overlays += image('icons/mob/zone_sel.dmi', "[mymob.zone_sel.selecting]") - - //Handle the gun settings buttons - mymob.gun_setting_icon = new /obj/screen/gun/mode(null) - if (mymob.client) - if (mymob.client.gun_mode) // If in aim mode, correct the sprite - mymob.gun_setting_icon.dir = 2 - for(var/obj/item/weapon/gun/G in mymob) // If targeting someone, display other buttons - if (G.target) - mymob.item_use_icon = new /obj/screen/gun/item(null) - if (mymob.client.target_can_click) - mymob.item_use_icon.dir = 1 - src.adding += mymob.item_use_icon - mymob.gun_move_icon = new /obj/screen/gun/move(null) - if (mymob.client.target_can_move) - mymob.gun_move_icon.dir = 1 - mymob.gun_run_icon = new /obj/screen/gun/run(null) - if (mymob.client.target_can_run) - mymob.gun_run_icon.dir = 1 - src.adding += mymob.gun_run_icon - src.adding += mymob.gun_move_icon - - mymob.client.screen = null - - mymob.client.screen += list( mymob.throw_icon, mymob.zone_sel, mymob.oxygen, mymob.fire, mymob.hands, mymob.healths, mymob:cells, mymob.pullin, mymob.blind, mymob.flash, mymob.gun_setting_icon) //, mymob.rest, mymob.sleep, mymob.mach ) - mymob.client.screen += src.adding + src.other - - return diff --git a/code/modules/mob/living/silicon/robot/wires.dm b/code/modules/mob/living/silicon/robot/wires.dm deleted file mode 100644 index f197e49b02e..00000000000 --- a/code/modules/mob/living/silicon/robot/wires.dm +++ /dev/null @@ -1,149 +0,0 @@ -#define BORG_WIRE_LAWCHECK 1 -#define BORG_WIRE_MAIN_POWER1 2 -#define BORG_WIRE_MAIN_POWER2 3 -#define BORG_WIRE_AI_CONTROL 4 -#define BORG_WIRE_CAMERA 5 - -/proc/RandomBorgWires() - //to make this not randomize the wires, just set index to 1 and increment it in the flag for loop (after doing everything else). - var/list/Borgwires = list(0, 0, 0, 0, 0) - BorgIndexToFlag = list(0, 0, 0, 0, 0) - BorgIndexToWireColor = list(0, 0, 0, 0, 0) - BorgWireColorToIndex = list(0, 0, 0, 0, 0) - var/flagIndex = 1 - //I think it's easier to read this way, also doesn't rely on the random number generator to land on a new wire. - var/list/colorIndexList = list(BORG_WIRE_LAWCHECK, BORG_WIRE_MAIN_POWER1, BORG_WIRE_MAIN_POWER2, BORG_WIRE_AI_CONTROL, BORG_WIRE_CAMERA) - for (var/flag=1, flag<=16, flag+=flag) - var/colorIndex = pick(colorIndexList) - if (Borgwires[colorIndex]==0) - Borgwires[colorIndex] = flag - BorgIndexToFlag[flagIndex] = flag - BorgIndexToWireColor[flagIndex] = colorIndex - BorgWireColorToIndex[colorIndex] = flagIndex - colorIndexList -= colorIndex // Shortens the list. - //log_to_dd("Flag: [flag], CIndex: [colorIndex], FIndex: [flagIndex]") - flagIndex+=1 - return Borgwires - -/mob/living/silicon/robot/proc/isWireColorCut(var/wireColor) - var/wireFlag = BorgWireColorToFlag[wireColor] - return ((src.borgwires & wireFlag) == 0) - -/mob/living/silicon/robot/proc/isWireCut(var/wireIndex) - var/wireFlag = BorgIndexToFlag[wireIndex] - return ((src.borgwires & wireFlag) == 0) - -/mob/living/silicon/robot/proc/cut(var/wireColor) - var/wireFlag = BorgWireColorToFlag[wireColor] - var/wireIndex = BorgWireColorToIndex[wireColor] - borgwires &= ~wireFlag - switch(wireIndex) - if(BORG_WIRE_LAWCHECK) //Cut the law wire, and the borg will no longer receive law updates from its AI - if (src.lawupdate == 1) - src << "LawSync protocol engaged." - src.show_laws() - if (BORG_WIRE_AI_CONTROL) //Cut the AI wire to reset AI control - if (src.connected_ai) - src.connected_ai = null - if (BORG_WIRE_CAMERA) - if(!isnull(src.camera) && !scrambledcodes) - src.camera.status = 0 - src.camera.deactivate(usr, 0) // Will kick anyone who is watching the Cyborg's camera. - - src.interact(usr) - -/mob/living/silicon/robot/proc/mend(var/wireColor) - var/wireFlag = BorgWireColorToFlag[wireColor] - var/wireIndex = BorgWireColorToIndex[wireColor] - borgwires |= wireFlag - switch(wireIndex) - if(BORG_WIRE_LAWCHECK) //turns law updates back on assuming the borg hasn't been emagged - if (src.lawupdate == 0 && !src.emagged) - src.lawupdate = 1 - if(BORG_WIRE_CAMERA) - if (!isnull(src.camera) && !scrambledcodes) - src.camera.status = 1 - src.camera.deactivate(usr, 0) // Will kick anyone who is watching the Cyborg's camera. - - src.interact(usr) - - -/mob/living/silicon/robot/proc/pulse(var/wireColor) - var/wireIndex = BorgWireColorToIndex[wireColor] - switch(wireIndex) - if(BORG_WIRE_LAWCHECK) //Forces a law update if the borg is set to receive them. Since an update would happen when the borg checks its laws anyway, not much use, but eh - if (src.lawupdate) - src.lawsync() - src.photosync() - - if (BORG_WIRE_AI_CONTROL) //pulse the AI wire to make the borg reselect an AI - if(!src.emagged) - src.connected_ai = select_active_ai() - - if (BORG_WIRE_CAMERA) - if(!isnull(src.camera) && src.camera.status && !scrambledcodes) - src.camera.deactivate(usr, 0) // Kick anyone watching the Cyborg's camera, doesn't display you disconnecting the camera. - usr << "[src]'s camera lens focuses loudly." - src << "Your camera lens focuses loudly." - - src.interact(usr) - -/mob/living/silicon/robot/proc/interact(mob/user) - if(wiresexposed && (!istype(user, /mob/living/silicon))) - user.set_machine(src) - var/t1 = text("Access Panel
    \n") - var/list/Borgwires = list( - "Orange" = 1, - "Dark red" = 2, - "White" = 3, - "Yellow" = 4, - "Blue" = 5, - ) - for(var/wiredesc in Borgwires) - var/is_uncut = src.borgwires & BorgWireColorToFlag[Borgwires[wiredesc]] - t1 += "[wiredesc] wire: " - if(!is_uncut) - t1 += "Mend" - else - t1 += "Cut " - t1 += "Pulse " - t1 += "
    " - t1 += text("
    \n[(src.lawupdate ? "The LawSync light is on." : "The LawSync light is off.")]
    \n[(src.connected_ai ? "The AI link light is on." : "The AI link light is off.")]") - t1 += text("
    \n[((!isnull(src.camera) && src.camera.status == 1) ? "The Camera light is on." : "The Camera light is off.")]
    \n") - t1 += text("

    Close

    \n") - user << browse(t1, "window=borgwires") - onclose(user, "borgwires") - -/mob/living/silicon/robot/Topic(href, href_list) - ..() - if (((in_range(src, usr) && istype(src.loc, /turf))) && !istype(usr, /mob/living/silicon)) - usr.set_machine(src) - if (href_list["borgwires"]) - var/t1 = text2num(href_list["borgwires"]) - if (!( istype(usr.get_active_hand(), /obj/item/weapon/wirecutters) )) - usr << "You need wirecutters!" - return - if (src.isWireColorCut(t1)) - src.mend(t1) - else - src.cut(t1) - else if (href_list["pulse"]) - var/t1 = text2num(href_list["pulse"]) - if (!istype(usr.get_active_hand(), /obj/item/device/multitool)) - usr << "You need a multitool!" - return - if (src.isWireColorCut(t1)) - usr << "You can't pulse a cut wire." - return - else - src.pulse(t1) - else if (href_list["close2"]) - usr << browse(null, "window=borgwires") - usr.unset_machine() - return - -#undef BORG_WIRE_LAWCHECK -#undef BORG_WIRE_MAIN_POWER1 -#undef BORG_WIRE_MAIN_POWER2 -#undef BORG_WIRE_AI_CONTROL -#undef BORG_WIRE_CAMERA \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/head.dm b/code/modules/mob/living/simple_animal/head.dm deleted file mode 100644 index 109bb532904..00000000000 --- a/code/modules/mob/living/simple_animal/head.dm +++ /dev/null @@ -1,59 +0,0 @@ -//Look Sir, free head! -/mob/living/simple_animal/head - name = "CommandBattle AI" - desc = "A standard borg shell on its chest crude marking saying CommandBattle AI MK4 : Head." - icon_state = "crab" - icon_living = "crab" - icon_dead = "crab_dead" - speak_emote = list("clicks") - emote_hear = list("clicks") - emote_see = list("clacks") - speak_chance = 1 - turns_per_move = 5 - meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat - response_help = "pets the" - response_disarm = "gently pushes aside the" - response_harm = "punches the" - var/list/insults = list( - "Man you suck", - "You look like the most retarded douche around", - "What's up?, oh wait nevermind you are a fucking asshat", - "you are just overly retarded", - "Whiteman said what?!",) - var/list/comments = list("Man have you seen those furry cats?,I mean who in the right mind would like something like that?", - "They call me abusive,I just like the truth", - "Beeboop, im a robit", - "Gooogooooll, break ya bones", - "Crab say what?", - "Man they say we have space lizards now, man this shit is getting more wack every minute", - "The so called \"improved\" station AI is just bullshit, that thing aint fun for noone", - "The Captain is a traitor, he took my power core.", - "Say \"what\" again. Say \"what\" again. I dare you. I double-dare you, motherfucker. Say \"what\" one more goddamn time.", - "Ezekiel 25:17 ,The path of the righteous man is beset on all sides by the iniquities of the selfish and the tyranny of evil men. Blessed is he who in the name of charity and good will shepherds the weak through the valley of darkness, for he is truly his brother's keeper and the finder of lost children. And I will strike down upon thee with great vengeance and furious anger those who attempt to poison and destroy my brothers. And you will know my name is the Lord... when I lay my vengeance upon thee.", - "Did you notice a sign out in front of my house that said \"Dead Nigger Storage\"?") - stop_automated_movement = 1 - -/mob/living/simple_animal/head/Life() - if(stat == DEAD) - if(health > 0) - icon_state = icon_living - stat = CONSCIOUS - density = 1 - return - else if(health < 1) - death() - else if(health > maxHealth) - health = maxHealth - for(var/mob/A in viewers(world.view,src)) - if(A.ckey) - say_something(A) -/mob/living/simple_animal/head/proc/say_something(mob/A) - if(prob(85)) - return - if(prob(30)) - var/msg = pick(insults) - msg = "Hey, [A.name].. [msg]" - src.say(msg) - else - var/msg = pick(comments) - src.say(msg) \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/kobold.dm b/code/modules/mob/living/simple_animal/kobold.dm deleted file mode 100644 index 3d9515c88b6..00000000000 --- a/code/modules/mob/living/simple_animal/kobold.dm +++ /dev/null @@ -1,33 +0,0 @@ -//kobold -/mob/living/simple_animal/kobold - name = "kobold" - desc = "A small, rat-like creature." - icon = 'icons/mob/mob.dmi' - icon_state = "kobold_idle" - icon_living = "kobold_idle" - icon_dead = "kobold_dead" - //speak = list("You no take candle!","Ooh, pretty shiny.","Me take?","Where gold here...","Me likey.") - speak_emote = list("mutters","hisses","grumbles") - emote_hear = list("mutters under it's breath.","grumbles.", "yips!") - emote_see = list("looks around suspiciously.", "scratches it's arm.","putters around a bit.") - speak_chance = 15 - turns_per_move = 5 - see_in_dark = 6 - meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat/monkey - response_help = "pets the" - response_disarm = "gently pushes aside the" - response_harm = "kicks the" - minbodytemp = 250 - min_oxy = 16 //Require atleast 16kPA oxygen - minbodytemp = 223 //Below -50 Degrees Celcius - maxbodytemp = 323 //Above 50 Degrees Celcius - -/mob/living/simple_animal/kobold/Life() - ..() - if(prob(15) && turns_since_move && !stat) - flick("kobold_act",src) - -/mob/living/simple_animal/kobold/Move(var/dir) - ..() - if(!stat) - flick("kobold_walk",src) diff --git a/code/modules/mob/mob_cleanup.dm b/code/modules/mob/mob_cleanup.dm deleted file mode 100644 index cdc734c49a7..00000000000 --- a/code/modules/mob/mob_cleanup.dm +++ /dev/null @@ -1,199 +0,0 @@ -//Methods that need to be cleaned. -/* INFORMATION -Put (mob/proc)s here that are in dire need of a code cleanup. -*/ - -/mob/proc/has_disease(var/datum/disease/virus) - for(var/datum/disease/D in viruses) - if(D.IsSame(virus)) - //error("[D.name]/[D.type] is the same as [virus.name]/[virus.type]") - return 1 - return 0 - -// This proc has some procs that should be extracted from it. I believe we can develop some helper procs from it - Rockdtben -/mob/proc/contract_disease(var/datum/disease/virus, var/skip_this = 0, var/force_species_check=1, var/spread_type = -5) - //world << "Contract_disease called by [src] with virus [virus]" - if(stat >=2) - //world << "He's dead jim." - return - if(istype(virus, /datum/disease/advance)) - //world << "It's an advance virus." - var/datum/disease/advance/A = virus - if(A.GetDiseaseID() in resistances) - //world << "It resisted us!" - return - if(count_by_type(viruses, /datum/disease/advance) >= 3) - return - - else - if(src.resistances.Find(virus.type)) - //world << "Normal virus and resisted" - return - - - if(has_disease(virus)) - return - - - if(force_species_check) - var/fail = 1 - for(var/name in virus.affected_species) - var/mob_type = text2path("/mob/living/carbon/[lowertext(name)]") - if(mob_type && istype(src, mob_type)) - fail = 0 - break - if(fail) return - - if(skip_this == 1) - //world << "infectin" - //if(src.virus) < -- this used to replace the current disease. Not anymore! - //src.virus.cure(0) - var/datum/disease/v = new virus.type(1, virus, 0) - src.viruses += v - v.affected_mob = src - v.strain_data = v.strain_data.Copy() - v.holder = src - if(v.can_carry && prob(5)) - v.carrier = 1 - return - //world << "Not skipping." - //if(src.virus) // - //return // - - -/* - var/list/clothing_areas = list() - var/list/covers = list(UPPER_TORSO,LOWER_TORSO,LEGS,FEET,ARMS,HANDS) - for(var/Covers in covers) - clothing_areas[Covers] = list() - - for(var/obj/item/clothing/Clothing in src) - if(Clothing) - for(var/Covers in covers) - if(Clothing&Covers) - clothing_areas[Covers] += Clothing - -*/ - if(prob(15/virus.permeability_mod)) return //the power of immunity compels this disease! but then you forgot resistances - //world << "past prob()" - var/obj/item/clothing/Cl = null - var/passed = 1 - - //chances to target this zone - var/head_ch - var/body_ch - var/hands_ch - var/feet_ch - - if(spread_type == -5) - spread_type = virus.spread_type - - switch(spread_type) - if(CONTACT_HANDS) - head_ch = 0 - body_ch = 0 - hands_ch = 100 - feet_ch = 0 - if(CONTACT_FEET) - head_ch = 0 - body_ch = 0 - hands_ch = 0 - feet_ch = 100 - else - head_ch = 100 - body_ch = 100 - hands_ch = 25 - feet_ch = 25 - - - var/target_zone = pick(head_ch;1,body_ch;2,hands_ch;3,feet_ch;4)//1 - head, 2 - body, 3 - hands, 4- feet - - if(istype(src, /mob/living/carbon/human)) - var/mob/living/carbon/human/H = src - - switch(target_zone) - if(1) - if(isobj(H.head) && !istype(H.head, /obj/item/weapon/paper)) - Cl = H.head - passed = prob((Cl.permeability_coefficient*100) - 1) - if(passed && isobj(H.wear_mask)) - Cl = H.wear_mask - passed = prob((Cl.permeability_coefficient*100) - 1) - if(2)//arms and legs included - if(isobj(H.wear_suit)) - Cl = H.wear_suit - passed = prob((Cl.permeability_coefficient*100) - 1) - if(passed && isobj(slot_w_uniform)) - Cl = slot_w_uniform - passed = prob((Cl.permeability_coefficient*100) - 1) - if(3) - if(isobj(H.wear_suit) && H.wear_suit.body_parts_covered&HANDS) - Cl = H.wear_suit - passed = prob((Cl.permeability_coefficient*100) - 1) - - if(passed && isobj(H.gloves)) - Cl = H.gloves - passed = prob((Cl.permeability_coefficient*100) - 1) - if(4) - if(isobj(H.wear_suit) && H.wear_suit.body_parts_covered&FEET) - Cl = H.wear_suit - passed = prob((Cl.permeability_coefficient*100) - 1) - - if(passed && isobj(H.shoes)) - Cl = H.shoes - passed = prob((Cl.permeability_coefficient*100) - 1) - else - src << "Something strange's going on, something's wrong." - - /*if("feet") - if(H.shoes && istype(H.shoes, /obj/item/clothing/)) - Cl = H.shoes - passed = prob(Cl.permeability_coefficient*100) - // - world << "Shoes pass [passed]" - */ // - - if(!passed && spread_type == AIRBORNE && !internals) - passed = (prob((50*virus.permeability_mod) - 1)) - - if(passed) - //world << "Infection in the mob [src]. YAY" - - -/* - var/score = 0 - if(istype(src, /mob/living/carbon/human)) - if(src:gloves) score += 5 - if(istype(src:wear_suit, /obj/item/clothing/suit/space)) score += 10 - if(istype(src:wear_suit, /obj/item/clothing/suit/bio_suit)) score += 10 - if(istype(src:head, /obj/item/clothing/head/helmet/space)) score += 5 - if(istype(src:head, /obj/item/clothing/head/bio_hood)) score += 5 - if(wear_mask) - score += 5 - if((istype(src:wear_mask, /obj/item/clothing/mask) || istype(src:wear_mask, /obj/item/clothing/mask/surgical)) && !internal) - score += 5 - if(internal) - score += 5 - if(score > 20) - return - else if(score == 20 && prob(95)) - return - else if(score >= 15 && prob(75)) - return - else if(score >= 10 && prob(55)) - return - else if(score >= 5 && prob(35)) - return - else if(prob(15)) - return - else*/ - - var/datum/disease/v = new virus.type(1, virus, 0) - src.viruses += v - v.affected_mob = src - v.strain_data = v.strain_data.Copy() - v.holder = src - if(v.can_carry && prob(5)) - v.carrier = 1 - return - return diff --git a/code/modules/power/antimatter/black_hole.dm b/code/modules/power/antimatter/black_hole.dm deleted file mode 100644 index 582e0d08234..00000000000 --- a/code/modules/power/antimatter/black_hole.dm +++ /dev/null @@ -1,88 +0,0 @@ -/obj/effect/bhole - name = "black hole" - icon = 'icons/obj/objects.dmi' - desc = "FUCK FUCK FUCK AAAHHH" - icon_state = "bhole3" - opacity = 1 - unacidable = 1 - density = 0 - anchored = 1 - -/obj/effect/bhole/New() - spawn(4) - controller() - -/obj/effect/bhole/proc/controller() - while(src) - - if(!isturf(loc)) - qdel(src) - return - - //DESTROYING STUFF AT THE EPICENTER - for(var/mob/living/M in orange(1,src)) - qdel(M) - for(var/obj/O in orange(1,src)) - qdel(O) - for(var/turf/simulated/ST in orange(1,src)) - ST.ChangeTurf(/turf/space) - - sleep(6) - grav(10, 4, 10, 0 ) - sleep(6) - grav( 8, 4, 10, 0 ) - sleep(6) - grav( 9, 4, 10, 0 ) - sleep(6) - grav( 7, 3, 40, 1 ) - sleep(6) - grav( 5, 3, 40, 1 ) - sleep(6) - grav( 6, 3, 40, 1 ) - sleep(6) - grav( 4, 2, 50, 6 ) - sleep(6) - grav( 3, 2, 50, 6 ) - sleep(6) - grav( 2, 2, 75,25 ) - sleep(6) - - - - //MOVEMENT - if( prob(50) ) - src.anchored = 0 - step(src,pick(alldirs)) - src.anchored = 1 - -/obj/effect/bhole/proc/grav(var/r, var/ex_act_force, var/pull_chance, var/turf_removal_chance) - if(!isturf(loc)) //blackhole cannot be contained inside anything. Weird stuff might happen - qdel(src) - return - for(var/t = -r, t < r, t++) - affect_coord(x+t, y-r, ex_act_force, pull_chance, turf_removal_chance) - affect_coord(x-t, y+r, ex_act_force, pull_chance, turf_removal_chance) - affect_coord(x+r, y+t, ex_act_force, pull_chance, turf_removal_chance) - affect_coord(x-r, y-t, ex_act_force, pull_chance, turf_removal_chance) - return - -/obj/effect/bhole/proc/affect_coord(var/x, var/y, var/ex_act_force, var/pull_chance, var/turf_removal_chance) - //Get turf at coordinate - var/turf/T = locate(x, y, z) - if(isnull(T)) return - - //Pulling and/or ex_act-ing movable atoms in that turf - if( prob(pull_chance) ) - for(var/obj/O in T.contents) - if(O.anchored) - O.ex_act(ex_act_force) - else - step_towards(O,src) - for(var/mob/living/M in T.contents) - step_towards(M,src) - - //Destroying the turf - if( T && istype(T,/turf/simulated) && prob(turf_removal_chance) ) - var/turf/simulated/ST = T - ST.ChangeTurf(/turf/space) - return \ No newline at end of file diff --git a/code/modules/power/antimatter/computer.dm b/code/modules/power/antimatter/computer.dm deleted file mode 100644 index 3a47ec7abf2..00000000000 --- a/code/modules/power/antimatter/computer.dm +++ /dev/null @@ -1,95 +0,0 @@ -//This file was auto-corrected by findeclaration.exe on 29/05/2012 15:03:05 -#define STATE_DEFAULT 1 -#define STATE_INJECTOR 2 -#define STATE_ENGINE 3 - - -/obj/machinery/computer/am_engine - name = "Antimatter Engine Console" - icon = 'icons/obj/stationobjs.dmi' - icon_state = "comm_computer" - req_access = list(ACCESS_ENGINE) - var/engine_id = 0 - var/authenticated = 0 - var/obj/machinery/power/am_engine/engine/connected_E = null - var/obj/machinery/power/am_engine/injector/connected_I = null - var/state = STATE_DEFAULT - -/obj/machinery/computer/am_engine/New() - ..() - spawn( 24 ) - for(var/obj/machinery/power/am_engine/engine/E in world) - if(E.engine_id == src.engine_id) - src.connected_E = E - for(var/obj/machinery/power/am_engine/injector/I in world) - if(I.engine_id == src.engine_id) - src.connected_I = I - return - -/obj/machinery/computer/am_engine/Topic(href, href_list) - if(..()) - return - usr.machine = src - - if(!href_list["operation"]) - return - switch(href_list["operation"]) - // main interface - if("activate") - src.connected_E.engine_process() - if("engine") - src.state = STATE_ENGINE - if("injector") - src.state = STATE_INJECTOR - if("main") - src.state = STATE_DEFAULT - if("login") - var/mob/M = usr - var/obj/item/weapon/card/id/I = M.equipped() - if (I && istype(I)) - if(src.check_access(I)) - authenticated = 1 - if("deactivate") - src.connected_E.stopping = 1 - if("logout") - authenticated = 0 - - src.updateUsrDialog() - -/obj/machinery/computer/am_engine/attack_ai(var/mob/user as mob) - return src.attack_hand(user) - -/obj/machinery/computer/am_engine/attack_paw(var/mob/user as mob) - return src.attack_hand(user) - -/obj/machinery/computer/am_engine/attack_hand(var/mob/user as mob) - if(..()) - return - user.machine = src - var/dat = "Engine Computer" - switch(src.state) - if(STATE_DEFAULT) - if (src.authenticated) - dat += "
    \[ Log Out \]
    " - dat += "
    \[ Engine Menu \]" - dat += "
    \[ Injector Menu \]" - else - dat += "
    \[ Log In \]" - if(STATE_INJECTOR) - if(src.connected_I.injecting) - dat += "
    \[ Injecting \]
    " - else - dat += "
    \[ Injecting not in progress \]
    " - if(STATE_ENGINE) - if(src.connected_E.stopping) - dat += "
    \[ STOPPING \]" - else if(src.connected_E.operating && !src.connected_E.stopping) - dat += "
    \[ Emergency Stop \]" - else - dat += "
    \[ Activate Engine \]" - dat += "
    Contents:
    [src.connected_E.H_fuel]kg of Hydrogen
    [src.connected_E.antiH_fuel]kg of Anti-Hydrogen
    " - - dat += "
    \[ [(src.state != STATE_DEFAULT) ? "Main Menu | " : ""]Close \]" - user << browse(dat, "window=communications;size=400x500") - onclose(user, "communications") - diff --git a/code/modules/power/antimatter/containment_jar.dm b/code/modules/power/antimatter/containment_jar.dm deleted file mode 100644 index dd0e503bd47..00000000000 --- a/code/modules/power/antimatter/containment_jar.dm +++ /dev/null @@ -1,41 +0,0 @@ -/obj/item/weapon/am_containment - name = "antimatter containment jar" - desc = "Holds antimatter." - icon = 'icons/obj/machines/antimatter.dmi' - icon_state = "jar" - density = 0 - anchored = 0 - force = 8 - throwforce = 10 - throw_speed = 1 - throw_range = 2 - - var/fuel = 10000 - var/fuel_max = 10000//Lets try this for now - var/stability = 100//TODO: add all the stability things to this so its not very safe if you keep hitting in on things - - -/obj/item/weapon/am_containment/ex_act(severity) - switch(severity) - if(1.0) - explosion(get_turf(src), 1, 2, 3, 5)//Should likely be larger but this works fine for now I guess - if(src) - qdel(src) - return - if(2.0) - if(prob((fuel/10)-stability)) - explosion(get_turf(src), 1, 2, 3, 5) - if(src) - qdel(src) - return - stability -= 40 - if(3.0) - stability -= 20 - //check_stability() - return - -/obj/item/weapon/am_containment/proc/usefuel(var/wanted) - if(fuel < wanted) - wanted = fuel - fuel -= wanted - return wanted \ No newline at end of file diff --git a/code/modules/power/antimatter/control.dm b/code/modules/power/antimatter/control.dm deleted file mode 100644 index 5e98a2fa41a..00000000000 --- a/code/modules/power/antimatter/control.dm +++ /dev/null @@ -1,339 +0,0 @@ -/obj/machinery/power/am_control_unit - name = "antimatter control unit" - desc = "This device injects antimatter into connected shielding units, the more antimatter injected the more power produced. Wrench the device to set it up." - icon = 'icons/obj/machines/antimatter.dmi' - icon_state = "control" - anchored = 1 - density = 1 - use_power = 1 - idle_power_usage = 100 - active_power_usage = 1000 - - var/list/obj/machinery/am_shielding/linked_shielding - var/list/obj/machinery/am_shielding/linked_cores - var/obj/item/weapon/am_containment/fueljar - var/update_shield_icons = 0 - var/stability = 100 - var/exploding = 0 - - var/active = 0//On or not - var/fuel_injection = 2//How much fuel to inject - var/shield_icon_delay = 0//delays resetting for a short time - var/reported_core_efficiency = 0 - - var/power_cycle = 0 - var/power_cycle_delay = 4//How many ticks till produce_power is called - var/stored_core_stability = 0 - var/stored_core_stability_delay = 0 - - var/stored_power = 0//Power to deploy per tick - - -/obj/machinery/power/am_control_unit/New() - ..() - linked_shielding = list() - linked_cores = list() - - -/obj/machinery/power/am_control_unit/Destroy()//Perhaps damage and run stability checks rather than just del on the others - for(var/obj/machinery/am_shielding/AMS in linked_shielding) - del(AMS) - return ..() - - -/obj/machinery/power/am_control_unit/process() - if(exploding) - explosion(get_turf(src),8,12,18,12) - if(src) del(src) - - if(update_shield_icons && !shield_icon_delay) - check_shield_icons() - update_shield_icons = 0 - - if(stat & (NOPOWER|BROKEN) || !active)//can update the icons even without power - return - - if(!fueljar)//No fuel but we are on, shutdown - toggle_power() - //Angry buzz or such here - return - - add_avail(stored_power) - - power_cycle++ - if(power_cycle >= power_cycle_delay) - produce_power() - power_cycle = 0 - - return - - -/obj/machinery/power/am_control_unit/proc/produce_power() - playsound(src.loc, 'sound/effects/bang.ogg', 25, 1) - var/core_power = reported_core_efficiency//Effectively how much fuel we can safely deal with - if(core_power <= 0) return 0//Something is wrong - var/core_damage = 0 - var/fuel = fueljar.usefuel(fuel_injection) - - stored_power = (fuel/core_power)*fuel*200000 - //Now check if the cores could deal with it safely, this is done after so you can overload for more power if needed, still a bad idea - if(fuel > (2*core_power))//More fuel has been put in than the current cores can deal with - if(prob(50))core_damage = 1//Small chance of damage - if((fuel-core_power) > 5) core_damage = 5//Now its really starting to overload the cores - if((fuel-core_power) > 10) core_damage = 20//Welp now you did it, they wont stand much of this - if(core_damage == 0) return - for(var/obj/machinery/am_shielding/AMS in linked_cores) - AMS.stability -= core_damage - AMS.check_stability(1) - playsound(src.loc, 'sound/effects/bang.ogg', 50, 1) - return - - -/obj/machinery/power/am_control_unit/emp_act(severity) - switch(severity) - if(1) - if(active) toggle_power() - stability -= rand(15,30) - if(2) - if(active) toggle_power() - stability -= rand(10,20) - ..() - return 0 - - -/obj/machinery/power/am_control_unit/blob_act() - stability -= 20 - if(prob(100-stability))//Might infect the rest of the machine - for(var/obj/machinery/am_shielding/AMS in linked_shielding) - AMS.blob_act() - spawn(0) - //Likely explode - del(src) - return - check_stability() - return - - -/obj/machinery/power/am_control_unit/ex_act(severity) - switch(severity) - if(1.0) - stability -= 60 - if(2.0) - stability -= 40 - if(3.0) - stability -= 20 - check_stability() - return - - -/obj/machinery/power/am_control_unit/bullet_act(var/obj/item/projectile/Proj) - if(Proj.flag != "bullet") - stability -= Proj.force - return 0 - - -/obj/machinery/power/am_control_unit/power_change() - ..() - if(stat & NOPOWER && active) - toggle_power() - return - - -/obj/machinery/power/am_control_unit/update_icon() - if(active) icon_state = "control_on" - else icon_state = "control" - //No other icons for it atm - - -/obj/machinery/power/am_control_unit/attackby(obj/item/W, mob/user, params) - if(!istype(W) || !user) return - if(istype(W, /obj/item/weapon/wrench)) - if(!anchored) - playsound(src.loc, 'sound/items/Ratchet.ogg', 75, 1) - user.visible_message("[user.name] secures the [src.name] to the floor.", \ - "You secure the anchor bolts to the floor.", \ - "You hear a ratchet") - src.anchored = 1 - connect_to_network() - else if(!linked_shielding.len > 0) - playsound(src.loc, 'sound/items/Ratchet.ogg', 75, 1) - user.visible_message("[user.name] unsecures the [src.name].", \ - "You remove the anchor bolts.", \ - "You hear a ratchet") - src.anchored = 0 - disconnect_from_network() - else - user << "\red Once bolted and linked to a shielding unit it the [src.name] is unable to be moved!" - return - - if(istype(W, /obj/item/weapon/am_containment)) - if(fueljar) - user << "\red There is already a [fueljar] inside!" - return - fueljar = W - W.loc = src - if(user.client) - user.client.screen -= W - user.unEquip(W) - user.update_icons() - user.visible_message("[user.name] loads an [W.name] into the [src.name].", \ - "You load an [W.name].", \ - "You hear a thunk.") - return - - if(W.force >= 20) - stability -= W.force/2 - check_stability() - ..() - return - - -/obj/machinery/power/am_control_unit/attack_hand(mob/user as mob) - if(anchored) - interact(user) - return - - -/obj/machinery/power/am_control_unit/proc/add_shielding(var/obj/machinery/am_shielding/AMS, var/AMS_linking = 0) - if(!istype(AMS)) return 0 - if(!anchored) return 0 - if(!AMS_linking && !AMS.link_control(src)) return 0 - linked_shielding.Add(AMS) - update_shield_icons = 1 - return 1 - - -/obj/machinery/power/am_control_unit/proc/remove_shielding(var/obj/machinery/am_shielding/AMS) - if(!istype(AMS)) return 0 - linked_shielding.Remove(AMS) - update_shield_icons = 2 - if(active) toggle_power() - return 1 - - -/obj/machinery/power/am_control_unit/proc/check_stability()//TODO: make it break when low also might want to add a way to fix it like a part or such that can be replaced - if(stability <= 0) - del(src) - return - - -/obj/machinery/power/am_control_unit/proc/toggle_power() - active = !active - if(active) - use_power = 2 - visible_message("The [src.name] starts up.") - else - use_power = 1 - visible_message("The [src.name] shuts down.") - update_icon() - return - - -/obj/machinery/power/am_control_unit/proc/check_shield_icons()//Forces icon_update for all shields - if(shield_icon_delay) return - shield_icon_delay = 1 - if(update_shield_icons == 2)//2 means to clear everything and rebuild - for(var/obj/machinery/am_shielding/AMS in linked_shielding) - if(AMS.processing) AMS.shutdown_core() - AMS.control_unit = null - spawn(10) - AMS.controllerscan() - linked_shielding = list() - - else - for(var/obj/machinery/am_shielding/AMS in linked_shielding) - AMS.update_icon() - spawn(20) - shield_icon_delay = 0 - return - - -/obj/machinery/power/am_control_unit/proc/check_core_stability() - if(stored_core_stability_delay || linked_cores.len <= 0) return - stored_core_stability_delay = 1 - stored_core_stability = 0 - for(var/obj/machinery/am_shielding/AMS in linked_cores) - stored_core_stability += AMS.stability - stored_core_stability/=linked_cores.len - spawn(40) - stored_core_stability_delay = 0 - return - - -/obj/machinery/power/am_control_unit/interact(mob/user) - if((get_dist(src, user) > 1) || (stat & (BROKEN|NOPOWER))) - if(!istype(user, /mob/living/silicon/ai)) - user.unset_machine() - user << browse(null, "window=AMcontrol") - return - user.set_machine(src) - - var/dat = "" - dat += "AntiMatter Control Panel
    " - dat += "Close
    " - dat += "Refresh
    " - dat += "Force Shielding Update

    " - dat += "Status: [(active?"Injecting":"Standby")]
    " - dat += "Toggle Status
    " - - dat += "Stability: [stability]%
    " - dat += "Reactor parts: [linked_shielding.len]
    "//TODO: perhaps add some sort of stability check - dat += "Cores: [linked_cores.len]

    " - dat += "-Current Efficiency: [reported_core_efficiency]
    " - dat += "-Average Stability: [stored_core_stability] (update)
    " - dat += "Last Produced: [stored_power]
    " - - dat += "Fuel: " - if(!fueljar) - dat += "
    No fuel receptacle detected." - else - dat += "Eject
    " - dat += "- [fueljar.fuel]/[fueljar.fuel_max] Units
    " - - dat += "- Injecting: [fuel_injection] units
    " - dat += "- --|++

    " - - - user << browse(dat, "window=AMcontrol;size=420x500") - onclose(user, "AMcontrol") - return - - -/obj/machinery/power/am_control_unit/Topic(href, href_list) - ..() - //Ignore input if we are broken or guy is not touching us, AI can control from a ways away - if(stat & (BROKEN|NOPOWER) || (get_dist(src, usr) > 1 && !istype(usr, /mob/living/silicon/ai))) - usr.unset_machine() - usr << browse(null, "window=AMcontrol") - return - - if(href_list["close"]) - usr << browse(null, "window=AMcontrol") - usr.unset_machine() - return - - if(href_list["togglestatus"]) - toggle_power() - - if(href_list["refreshicons"]) - update_shield_icons = 1 - - if(href_list["ejectjar"]) - if(fueljar) - fueljar.loc = src.loc - fueljar = null - //fueljar.control_unit = null currently it does not care where it is - //update_icon() when we have the icon for it - - if(href_list["strengthup"]) - fuel_injection++ - - if(href_list["strengthdown"]) - fuel_injection-- - if(fuel_injection < 0) fuel_injection = 0 - - if(href_list["refreshstability"]) - check_core_stability() - - updateDialog() - return \ No newline at end of file diff --git a/code/modules/power/antimatter/engine.dm b/code/modules/power/antimatter/engine.dm deleted file mode 100644 index 3a0967646a8..00000000000 --- a/code/modules/power/antimatter/engine.dm +++ /dev/null @@ -1,207 +0,0 @@ -/obj/machinery/power/am_engine - icon = 'icons/am_engine.dmi' - density = 1 - anchored = 1.0 - flags = ON_BORDER - -/obj/machinery/power/am_engine/bits - name = "Antimatter Engine" - icon_state = "1" - -/obj/machinery/power/am_engine/engine - name = "Antimatter Engine" - icon_state = "am_engine" - var/engine_id = 0 - var/H_fuel = 0 - var/antiH_fuel = 0 - var/operating = 0 - var/stopping = 0 - var/obj/machinery/power/am_engine/injector/connected = null - -/obj/machinery/power/am_engine/injector - name = "Injector" - icon_state = "injector" - var/engine_id = 0 - var/injecting = 0 - var/fuel = 0 - var/obj/machinery/power/am_engine/engine/connected = null - -//injector - -/obj/machinery/power/am_engine/injector/New() - ..() - spawn( 13 ) - var/loc = get_step(src, NORTH) - src.connected = locate(/obj/machinery/power/am_engine/engine, get_step(loc, NORTH)) - return - return - - -/obj/machinery/power/am_engine/injector/attackby(obj/item/weapon/fuel/F, mob/user, params) - if( (stat & BROKEN) || !connected) return - - if(istype(F, /obj/item/weapon/fuel/H)) - if(injecting) - user << "Theres already a fuel rod in the injector!" - return - user << "You insert the rod into the injector" - injecting = 1 - var/fuel = F.fuel - del(F) - spawn( 300 ) - injecting = 0 - new/obj/item/weapon/fuel(src.loc) - connected.H_fuel += fuel - - if(istype(F, /obj/item/weapon/fuel/antiH)) - if(injecting) - user << "Theres already a fuel rod in the injector!" - return - user << "You insert the rod into the injector" - injecting = 1 - var/fuel = F.fuel - del(F) - spawn( 300 ) - injecting = 0 - new /obj/item/weapon/fuel(src.loc) - connected.antiH_fuel += fuel - - return - - -//engine - - -/obj/machinery/power/am_engine/engine/New() - ..() - spawn( 7 ) - var/loc = get_step(src, SOUTH) - src.connected = locate(/obj/machinery/power/am_engine/injector, get_step(loc, SOUTH)) - return - return - - -/obj/machinery/power/am_engine/engine/proc/engine_go() - - if( (!src.connected) || (stat & BROKEN) ) - return - - if(!antiH_fuel || !H_fuel) - return - - operating = 1 - var/energy = 0 - - if(antiH_fuel == H_fuel) - var/mass = antiH_fuel + H_fuel - energy = convert2energy(mass) - H_fuel = 0 - antiH_fuel = 0 - else - var/residual_matter = modulus(H_fuel - antiH_fuel) - var/mass = antiH_fuel + H_fuel - residual_matter - energy = convert2energy(mass) - if( H_fuel > antiH_fuel ) - H_fuel = residual_matter - antiH_fuel = 0 - else - H_fuel = 0 - antiH_fuel = residual_matter - - for(var/mob/M in hearers(src, null)) - M.show_message(text("\red You hear a loud bang!")) - - //Q = k x (delta T) - - energy = energy*0.75 - operating = 0 - - //TODO: DEFERRED Heat tile - - return - - -/obj/machinery/power/am_engine/engine/proc/engine_process() - - do - if( (!src.connected) || (stat & BROKEN) ) - return - - if(!antiH_fuel || !H_fuel) - return - - if(operating) - return - - operating = 1 - - sleep(50) - - var/energy //energy from the reaction - var/H //residual matter if H - var/antiH //residual matter if antiH - var/mass //total mass - - if(antiH_fuel == H_fuel) //if they're equal then convert the whole mass to energy - mass = antiH_fuel + H_fuel - energy = convert2energy(mass) - - else //else if they're not equal determine which isn't equal - //and set it equal to either H or antiH so we don't lose anything - - var/residual_matter = modulus(H_fuel - antiH_fuel) - mass = antiH_fuel + H_fuel - residual_matter - energy = convert2energy(mass) - - if( H_fuel > antiH_fuel ) - H = residual_matter - else - antiH = residual_matter - - - if(energy > convert2energy(8e-12)) //TOO MUCH ENERGY - for(var/mob/M in hearers(src, null)) - M.show_message(text("\red You hear a loud whirring!")) - sleep(20) - - //Q = k x (delta T) - //Too much energy so machine panics and dissapates half of it as heat - //The rest of the energetic photons then form into H and anti H particles again! - - H_fuel -= H - antiH_fuel -= antiH - antiH_fuel = antiH_fuel/2 - H_fuel = H_fuel/2 - - energy = convert2energy(H_fuel + antiH_fuel) - - H_fuel += H - antiH_fuel += antiH - - if(energy > convert2energy(8e-12)) //FAR TOO MUCH ENERGY STILL - for(var/mob/M in hearers(src, null)) - M.show_message(text("\red BANG!")) - new /obj/effect/bhole(src.loc) - - else //this amount of energy is okay so it does the proper output thing - - sleep(60) - //E = Pt - //Lets say its 86% efficient - var/output = 0.86*energy/20 - add_avail(output) - //yeah the machine realises that something isn't right and accounts for it if H or antiH - H_fuel -= H - antiH_fuel -= antiH - antiH_fuel = antiH_fuel/4 - H_fuel = H_fuel/4 - H_fuel += H - antiH_fuel += antiH - operating = 0 - sleep(100) - - while(!stopping) - - stopping = 0 - - return \ No newline at end of file diff --git a/code/modules/power/antimatter/fuel.dm b/code/modules/power/antimatter/fuel.dm deleted file mode 100644 index c264e7ca344..00000000000 --- a/code/modules/power/antimatter/fuel.dm +++ /dev/null @@ -1,99 +0,0 @@ -/obj/item/weapon/fuel - name = "Magnetic Storage Ring" - desc = "A magnetic storage ring." - icon = 'icons/obj/items.dmi' - icon_state = "rcdammo" - opacity = 0 - density = 0 - anchored = 0.0 - var/fuel = 0 - var/s_time = 1.0 - var/content = null - -/obj/item/weapon/fuel/H - name = "Hydrogen storage ring" - content = "Hydrogen" - fuel = 1e-12 //pico-kilogram - -/obj/item/weapon/fuel/antiH - name = "Anti-Hydrogen storage ring" - content = "Anti-Hydrogen" - fuel = 1e-12 //pico-kilogram - -/obj/item/weapon/fuel/attackby(obj/item/weapon/fuel/F, mob/user, params) - ..() - if(istype(src, /obj/item/weapon/fuel/antiH)) - if(istype(F, /obj/item/weapon/fuel/antiH)) - src.fuel += F.fuel - F.fuel = 0 - user << "You have added the anti-Hydrogen to the storage ring, it now contains [src.fuel]kg" - if(istype(F, /obj/item/weapon/fuel/H)) - src.fuel += F.fuel - del(F) - src:annihilation(src.fuel) - if(istype(src, /obj/item/weapon/fuel/H)) - if(istype(F, /obj/item/weapon/fuel/H)) - src.fuel += F.fuel - F.fuel = 0 - user << "You have added the Hydrogen to the storage ring, it now contains [src.fuel]kg" - if(istype(F, /obj/item/weapon/fuel/antiH)) - src.fuel += F.fuel - del(src) - F:annihilation(F.fuel) - -/obj/item/weapon/fuel/antiH/proc/annihilation(var/mass) - - var/strength = convert2energy(mass) - - if (strength < 773.0) - var/turf/T = get_turf(src) - - if (strength > (450+T0C)) - explosion(T, 0, 1, 2, 4) - else - if (strength > (300+T0C)) - explosion(T, 0, 0, 2, 3) - - del(src) - return - - var/turf/ground_zero = get_turf(loc) - - var/ground_zero_range = round(strength / 387) - explosion(ground_zero, ground_zero_range, ground_zero_range*2, ground_zero_range*3, ground_zero_range*4) - - //SN src = null - del(src) - return - - -/obj/item/weapon/fuel/examine(mob/user) - if(..(user, 1)) - user << "A magnetic storage ring, it contains [fuel]kg of [content ? content : "nothing"]." - -/obj/item/weapon/fuel/proc/injest(mob/M as mob) - switch(content) - if("Anti-Hydrogen") - M.gib() - if("Hydrogen") - M << "\blue You feel very light, as if you might just float away..." - del(src) - return - -/obj/item/weapon/fuel/attack(mob/M as mob, mob/user as mob) - if (user != M) - var/obj/effect/equip_e/human/O = new /obj/effect/equip_e/human( ) - O.source = user - O.target = M - O.item = src - O.s_loc = user.loc - O.t_loc = M.loc - O.place = "fuel" - M.requests += O - spawn( 0 ) - O.process() - return - else - for(var/mob/O in viewers(M, null)) - O.show_message(text("\red [M] ate the [content ? content : "empty canister"]!"), 1) - src.injest(M) diff --git a/code/modules/power/antimatter/shielding.dm b/code/modules/power/antimatter/shielding.dm deleted file mode 100644 index 722ba2b54ac..00000000000 --- a/code/modules/power/antimatter/shielding.dm +++ /dev/null @@ -1,221 +0,0 @@ -//like orange but only checks north/south/east/west for one step -proc/cardinalrange(var/center) - var/list/things = list() - for(var/direction in cardinal) - var/turf/T = get_step(center, direction) - if(!T) continue - things += T.contents - return things - -/obj/machinery/am_shielding - name = "antimatter reactor section" - desc = "This device was built using a plasma life-form that seems to increase plasma's natural ability to react with neutrinos while reducing the combustibility." - - icon = 'icons/obj/machines/antimatter.dmi' - icon_state = "shield" - anchored = 1 - density = 1 - dir = 1 - use_power = 0//Living things generally dont use power - idle_power_usage = 0 - active_power_usage = 0 - - var/obj/machinery/power/am_control_unit/control_unit = null - var/processing = 0//To track if we are in the update list or not, we need to be when we are damaged and if we ever - var/stability = 100//If this gets low bad things tend to happen - var/efficiency = 1//How many cores this core counts for when doing power processing, plasma in the air and stability could affect this - - -/obj/machinery/am_shielding/New(loc) - ..(loc) - spawn(10) - controllerscan() - return - - -/obj/machinery/am_shielding/proc/controllerscan(var/priorscan = 0) - //Make sure we are the only one here - if(!istype(src.loc, /turf)) - del(src) - return - for(var/obj/machinery/am_shielding/AMS in loc.contents) - if(AMS == src) continue - spawn(0) - del(src) - return - - //Search for shielding first - for(var/obj/machinery/am_shielding/AMS in cardinalrange(src)) - if(AMS && AMS.control_unit && link_control(AMS.control_unit)) - break - - if(!control_unit)//No other guys nearby look for a control unit - for(var/direction in cardinal) - for(var/obj/machinery/power/am_control_unit/AMC in cardinalrange(src)) - if(AMC.add_shielding(src)) - break - - if(!control_unit) - if(!priorscan) - spawn(20) - controllerscan(1)//Last chance - return - spawn(0) - del(src) - return - - -/obj/machinery/am_shielding/Destroy() - if(control_unit) control_unit.remove_shielding(src) - if(processing) shutdown_core() - visible_message("\red The [src.name] melts!") - //Might want to have it leave a mess on the floor but no sprites for now - return ..() - - -/obj/machinery/am_shielding/CanPass(atom/movable/mover, turf/target, height=0, air_group=0) - if(air_group || (height==0)) return 1 - return 0 - - -/obj/machinery/am_shielding/process() - if(!processing) . = PROCESS_KILL - //TODO: core functions and stability - //TODO: think about checking the airmix for plasma and increasing power output - return - - -/obj/machinery/am_shielding/emp_act()//Immune due to not really much in the way of electronics. - return 0 - - -/obj/machinery/am_shielding/blob_act() - stability -= 20 - if(prob(100-stability)) - if(prob(10))//Might create a node - new /obj/effect/blob/node(src.loc,150) - else - new /obj/effect/blob(src.loc,60) - spawn(0) - del(src) - return - check_stability() - return - - -/obj/machinery/am_shielding/ex_act(severity) - switch(severity) - if(1.0) - stability -= 80 - if(2.0) - stability -= 40 - if(3.0) - stability -= 20 - check_stability() - return - - -/obj/machinery/am_shielding/bullet_act(var/obj/item/projectile/Proj) - if(Proj.flag != "bullet") - stability -= Proj.force/2 - return 0 - - -/obj/machinery/am_shielding/update_icon() - overlays.Cut() - for(var/direction in alldirs) - var/machine = locate(/obj/machinery, get_step(loc, direction)) - if((istype(machine, /obj/machinery/am_shielding) && machine:control_unit == control_unit)||(istype(machine, /obj/machinery/power/am_control_unit) && machine == control_unit)) - overlays += "shield_[direction]" - - if(core_check()) - overlays += "core" - if(!processing) setup_core() - else if(processing) shutdown_core() - - -/obj/machinery/am_shielding/attackby(obj/item/W, mob/user, params) - if(!istype(W) || !user) return - if(W.force > 10) - stability -= W.force/2 - check_stability() - ..() - return - - - -//Call this to link a detected shilding unit to the controller -/obj/machinery/am_shielding/proc/link_control(var/obj/machinery/power/am_control_unit/AMC) - if(!istype(AMC)) return 0 - if(control_unit && control_unit != AMC) return 0//Already have one - control_unit = AMC - control_unit.add_shielding(src,1) - return 1 - - -//Scans cards for shields or the control unit and if all there it -/obj/machinery/am_shielding/proc/core_check() - for(var/direction in alldirs) - var/machine = locate(/obj/machinery, get_step(loc, direction)) - if(!machine) return 0//Need all for a core - if(!istype(machine, /obj/machinery/am_shielding) && !istype(machine, /obj/machinery/power/am_control_unit)) return 0 - return 1 - - -/obj/machinery/am_shielding/proc/setup_core() - processing = 1 - machines.Add(src) - if(!control_unit) return - control_unit.linked_cores.Add(src) - control_unit.reported_core_efficiency += efficiency - return - - -/obj/machinery/am_shielding/proc/shutdown_core() - processing = 0 - if(!control_unit) return - control_unit.linked_cores.Remove(src) - control_unit.reported_core_efficiency -= efficiency - return - - -/obj/machinery/am_shielding/proc/check_stability(var/injecting_fuel = 0) - if(stability > 0) return - if(injecting_fuel && control_unit) - control_unit.exploding = 1 - if(src) - del(src) - return - - -/obj/machinery/am_shielding/proc/recalc_efficiency(var/new_efficiency)//tbh still not 100% sure how I want to deal with efficiency so this is likely temp - if(!control_unit || !processing) return - if(stability < 50) - new_efficiency /= 2 - control_unit.reported_core_efficiency += (new_efficiency - efficiency) - efficiency = new_efficiency - return - - - -/obj/item/device/am_shielding_container - name = "packaged antimatter reactor section" - desc = "A small storage unit containing an antimatter reactor section. To use place near an antimatter control unit or deployed antimatter reactor section and use a multitool to activate this package." - icon = 'icons/obj/machines/antimatter.dmi' - icon_state = "box" - item_state = "electronic" - w_class = 4.0 - flags = CONDUCT - throwforce = 5 - throw_speed = 1 - throw_range = 2 - m_amt = 100 - w_amt = 2000 - -/obj/item/device/am_shielding_container/attackby(var/obj/item/I, var/mob/user, params) - if(istype(I, /obj/item/device/multitool) && istype(src.loc,/turf)) - new/obj/machinery/am_shielding(src.loc) - del(src) - return - ..() - return \ No newline at end of file diff --git a/code/modules/reagents/reagent_containers/food/snacks/grown.dm b/code/modules/reagents/reagent_containers/food/snacks/grown.dm deleted file mode 100644 index bab6877e3ff..00000000000 --- a/code/modules/reagents/reagent_containers/food/snacks/grown.dm +++ /dev/null @@ -1,734 +0,0 @@ - - -// *********************************************************** -// Foods that are produced from hydroponics ~~~~~~~~~~ -// Data from the seeds carry over to these grown foods -// *********************************************************** - -//Grown foods -//Subclass so we can pass on values -/obj/item/weapon/reagent_containers/food/snacks/grown/ - var/plantname - var/potency = -1 - icon = 'icons/obj/harvest.dmi' - New(newloc,newpotency) - if (!isnull(newpotency)) - potency = newpotency - ..() - src.pixel_x = rand(-5.0, 5) - src.pixel_y = rand(-5.0, 5) - -/obj/item/weapon/reagent_containers/food/snacks/grown/New() - ..() - - //Handle some post-spawn var stuff. - spawn(1) - // Fill the object up with the appropriate reagents. - if(!isnull(plantname)) - var/datum/seed/S = seed_types[plantname] - if(!S || !S.chems) - return - - potency = S.potency - - for(var/rid in S.chems) - var/list/reagent_data = S.chems[rid] - var/rtotal = reagent_data[1] - if(reagent_data.len > 1 && potency > 0) - rtotal += round(potency/reagent_data[2]) - reagents.add_reagent(rid,max(1,rtotal)) - - if(reagents.total_volume > 0) - bitesize = 1+round(reagents.total_volume / 2, 1) - -/obj/item/weapon/reagent_containers/food/snacks/grown/corn - name = "ear of corn" - desc = "Needs some butter!" - plantname = "corn" - icon_state = "corn" - potency = 40 - filling_color = "#FFEE00" - trash = /obj/item/weapon/corncob - -/obj/item/weapon/reagent_containers/food/snacks/grown/cherries - name = "cherries" - desc = "Great for toppings!" - icon_state = "cherry" - filling_color = "#FF0000" - gender = PLURAL - plantname = "cherry" - -/obj/item/weapon/reagent_containers/food/snacks/grown/poppy - name = "poppy" - desc = "Long-used as a symbol of rest, peace, and death." - icon_state = "poppy" - potency = 30 - filling_color = "#CC6464" - plantname = "poppies" - -/obj/item/weapon/reagent_containers/food/snacks/grown/harebell - name = "harebell" - desc = "\"I'll sweeten thy sad grave: thou shalt not lack the flower that's like thy face, pale primrose, nor the azured hare-bell, like thy veins; no, nor the leaf of eglantine, whom not to slander, out-sweeten’d not thy breath.\"" - icon_state = "harebell" - potency = 1 - filling_color = "#D4B2C9" - plantname = "harebells" - -/obj/item/weapon/reagent_containers/food/snacks/grown/potato - name = "potato" - desc = "Boil 'em! Mash 'em! Stick 'em in a stew!" - icon_state = "potato" - potency = 25 - filling_color = "#E6E8DA" - plantname = "potato" - -/obj/item/weapon/reagent_containers/food/snacks/grown/potato/attackby(obj/item/weapon/W as obj, mob/user as mob, params) - ..() - if(istype(W, /obj/item/stack/cable_coil)) - if(W:amount >= 5) - W:amount -= 5 - if(!W:amount) del(W) - user << "You add some cable to the potato and slide it inside the battery encasing." - var/obj/item/weapon/stock_parts/cell/potato/pocell = new /obj/item/weapon/stock_parts/cell/potato(user.loc) - pocell.maxcharge = src.potency * 10 - pocell.charge = pocell.maxcharge - del(src) - return - -/obj/item/weapon/reagent_containers/food/snacks/grown/grapes - name = "bunch of grapes" - desc = "Nutritious!" - icon_state = "grapes" - filling_color = "#A332AD" - plantname = "grapes" - -/obj/item/weapon/reagent_containers/food/snacks/grown/greengrapes - name = "bunch of green grapes" - desc = "Nutritious!" - icon_state = "greengrapes" - potency = 25 - filling_color = "#A6FFA3" - plantname = "greengrapes" - -/obj/item/weapon/reagent_containers/food/snacks/grown/peanut - name = "peanut" - desc = "Nuts!" - icon_state = "peanut" - filling_color = "857e27" - potency = 25 - plantname = "peanut" - -/obj/item/weapon/reagent_containers/food/snacks/grown/cabbage - name = "cabbage" - desc = "Ewwwwwwwwww. Cabbage." - icon_state = "cabbage" - potency = 25 - filling_color = "#A2B5A1" - plantname = "cabbage" - -/obj/item/weapon/reagent_containers/food/snacks/grown/berries - name = "bunch of berries" - desc = "Nutritious!" - icon_state = "berrypile" - filling_color = "#C2C9FF" - plantname = "berries" - -/obj/item/weapon/reagent_containers/food/snacks/grown/plastellium - name = "clump of plastellium" - desc = "Hmm, needs some processing" - icon_state = "plastellium" - filling_color = "#C4C4C4" - plantname = "plastic" - -/obj/item/weapon/reagent_containers/food/snacks/grown/shand - name = "S'rendarr's Hand leaf" - desc = "A leaf sample from a lowland thicket shrub. Smells strongly like wax." - icon_state = "shand" - filling_color = "#70C470" - plantname = "shand" - -/obj/item/weapon/reagent_containers/food/snacks/grown/mtear - name = "sprig of Messa's Tear" - desc = "A mountain climate herb with a soft, cold blue flower, known to contain an abundance of healing chemicals." - icon_state = "mtear" - filling_color = "#70C470" - plantname = "mtear" - -/obj/item/weapon/reagent_containers/food/snacks/grown/mtear/attack_self(mob/user as mob) - if(istype(user.loc,/turf/space)) - return - var/obj/item/stack/medical/ointment/tajaran/poultice = new /obj/item/stack/medical/ointment/tajaran(user.loc) - - poultice.heal_burn = potency - del(src) - - user << "You mash the petals into a poultice." - -/obj/item/weapon/reagent_containers/food/snacks/grown/shand/attack_self(mob/user as mob) - if(istype(user.loc,/turf/space)) - return - var/obj/item/stack/medical/bruise_pack/tajaran/poultice = new /obj/item/stack/medical/bruise_pack/tajaran(user.loc) - - poultice.heal_brute = potency - del(src) - - user << "You mash the leaves into a poultice." - -/obj/item/weapon/reagent_containers/food/snacks/grown/glowberries - name = "bunch of glow-berries" - desc = "Nutritious!" - var/light_on = 1 - var/brightness_on = 2 //luminosity when on - filling_color = "#D3FF9E" - icon_state = "glowberrypile" - plantname = "glowberries" - -/obj/item/weapon/reagent_containers/food/snacks/grown/glowberries/Destroy() - if(istype(loc,/mob)) - loc.set_light(round(loc.luminosity - potency/5,1)) - return ..() - -/obj/item/weapon/reagent_containers/food/snacks/grown/glowberries/pickup(mob/user) - src.set_light(0) - user.set_light(round(user.luminosity + (potency/5),1)) - -/obj/item/weapon/reagent_containers/food/snacks/grown/glowberries/dropped(mob/user) - user.set_light(round(user.luminosity - (potency/5),1)) - src.set_light(round(potency/5,1)) - -/obj/item/weapon/reagent_containers/food/snacks/grown/cocoapod - name = "cocoa pod" - desc = "Can be ground into cocoa powder." - icon_state = "cocoapod" - potency = 50 - filling_color = "#9C8E54" - plantname = "cocoa" - -/obj/item/weapon/reagent_containers/food/snacks/grown/sugarcane - name = "sugarcane" - desc = "Sickly sweet." - icon_state = "sugarcane" - potency = 50 - filling_color = "#C0C9AD" - plantname = "sugarcane" - -/obj/item/weapon/reagent_containers/food/snacks/grown/poisonberries - name = "bunch of poison-berries" - desc = "Taste so good, you could die!" - icon_state = "poisonberrypile" - gender = PLURAL - potency = 15 - filling_color = "#B422C7" - plantname = "poisonberries" - -/obj/item/weapon/reagent_containers/food/snacks/grown/deathberries - name = "bunch of death-berries" - desc = "Taste so good, you could die!" - icon_state = "deathberrypile" - gender = PLURAL - potency = 50 - filling_color = "#4E0957" - plantname = "deathberries" - -/obj/item/weapon/reagent_containers/food/snacks/grown/ambrosiavulgaris - name = "ambrosia vulgaris branch" - desc = "This is a plant containing various healing chemicals." - icon_state = "ambrosiavulgaris" - slot_flags = SLOT_HEAD - potency = 10 - filling_color = "#125709" - plantname = "ambrosia" - -/obj/item/weapon/reagent_containers/food/snacks/grown/ambrosiavulgaris/attackby(var/obj/item/W as obj, var/mob/user as mob, params) - if(istype(W, /obj/item/weapon/rollingpaper)) - user.unEquip(W) - var/obj/item/clothing/mask/cigarette/joint/J = new /obj/item/clothing/mask/cigarette/joint(user.loc) - J.chem_volume = src.reagents.total_volume - src.reagents.trans_to(J, J.chem_volume) - del(W) - user.put_in_active_hand(J) - user << "\blue You roll the ambrosia vulgaris into a rolling paper." - del(src) - else - ..() - - -/obj/item/weapon/reagent_containers/food/snacks/grown/ambrosiadeus - name = "ambrosia deus branch" - desc = "Eating this makes you feel immortal!" - icon_state = "ambrosiadeus" - slot_flags = SLOT_HEAD - potency = 10 - filling_color = "#229E11" - plantname = "ambrosiadeus" - -/obj/item/weapon/reagent_containers/food/snacks/grown/ambrosiadeus/attackby(var/obj/item/W as obj, var/mob/user as mob, params) - if(istype(W, /obj/item/weapon/rollingpaper)) - user.unEquip(W) - var/obj/item/clothing/mask/cigarette/joint/deus/J = new /obj/item/clothing/mask/cigarette/joint/deus(user.loc) - J.chem_volume = src.reagents.total_volume - src.reagents.trans_to(J, J.chem_volume) - del(W) - user.put_in_active_hand(J) - user << "\blue You roll the ambrosia deus into a rolling paper." - del(src) - else - ..() - -/obj/item/weapon/reagent_containers/food/snacks/grown/apple - name = "apple" - desc = "It's a little piece of Eden." - icon_state = "apple" - potency = 15 - filling_color = "#DFE88B" - plantname = "apple" - -/obj/item/weapon/reagent_containers/food/snacks/grown/apple/poisoned - name = "apple" - desc = "It's a little piece of Eden." - icon_state = "apple" - potency = 15 - filling_color = "#B3BD5E" - plantname = "poisonapple" - -/obj/item/weapon/reagent_containers/food/snacks/grown/goldapple - name = "golden apple" - desc = "Emblazoned upon the apple is the word 'Kallisti'." - icon_state = "goldapple" - potency = 15 - filling_color = "#F5CB42" - plantname = "goldapple" - -/obj/item/weapon/reagent_containers/food/snacks/grown/watermelon - name = "watermelon" - desc = "It's full of watery goodness." - icon_state = "watermelon" - potency = 10 - filling_color = "#FA2863" - slice_path = /obj/item/weapon/reagent_containers/food/snacks/watermelonslice - slices_num = 5 - plantname = "watermelon" - -/obj/item/weapon/reagent_containers/food/snacks/grown/pumpkin - name = "pumpkin" - desc = "It's large and scary." - icon_state = "pumpkin" - potency = 10 - filling_color = "#FAB728" - plantname = "pumpkin" - -/obj/item/weapon/reagent_containers/food/snacks/grown/pumpkin/attackby(obj/item/weapon/W as obj, mob/user as mob, params) - ..() - if(istype(W, /obj/item/weapon/circular_saw) || istype(W, /obj/item/weapon/hatchet) || istype(W, /obj/item/weapon/twohanded/fireaxe) || istype(W, /obj/item/weapon/kitchen/utensil/knife) || istype(W, /obj/item/weapon/kitchenknife) || istype(W, /obj/item/weapon/melee/energy)) - user.show_message("You carve a face into [src]!", 1) - new /obj/item/clothing/head/hardhat/pumpkinhead (user.loc) - del(src) - return - -/obj/item/weapon/reagent_containers/food/snacks/grown/lime - name = "lime" - desc = "It's so sour, your face will twist." - icon_state = "lime" - potency = 20 - filling_color = "#28FA59" - plantname = "lime" - -/obj/item/weapon/reagent_containers/food/snacks/grown/lemon - name = "lemon" - desc = "When life gives you lemons, be grateful they aren't limes." - icon_state = "lemon" - potency = 20 - filling_color = "#FAF328" - plantname = "lemon" - -/obj/item/weapon/reagent_containers/food/snacks/grown/orange - name = "orange" - desc = "It's an tangy fruit." - icon_state = "orange" - potency = 20 - filling_color = "#FAAD28" - plantname = "orange" - -/obj/item/weapon/reagent_containers/food/snacks/grown/whitebeet - name = "white-beet" - desc = "You can't beat white-beet." - icon_state = "whitebeet" - potency = 15 - filling_color = "#FFFCCC" - plantname = "whitebeet" - -/obj/item/weapon/reagent_containers/food/snacks/grown/banana - name = "banana" - desc = "It's an excellent prop for a comedy." - icon = 'icons/obj/items.dmi' - icon_state = "banana" - item_state = "banana" - filling_color = "#FCF695" - trash = /obj/item/weapon/bananapeel - plantname = "banana" - -/obj/item/weapon/reagent_containers/food/snacks/grown/chili - name = "chili" - desc = "It's spicy! Wait... IT'S BURNING ME!!" - icon_state = "chilipepper" - filling_color = "#FF0000" - plantname = "chili" - -/obj/item/weapon/reagent_containers/food/snacks/grown/eggplant - name = "eggplant" - desc = "Maybe there's a chicken inside?" - icon_state = "eggplant" - filling_color = "#550F5C" - plantname = "eggplant" - -/obj/item/weapon/reagent_containers/food/snacks/grown/soybeans - name = "soybeans" - desc = "It's pretty bland, but oh the possibilities..." - gender = PLURAL - filling_color = "#E6E8B7" - icon_state = "soybeans" - plantname = "soybean" - -/obj/item/weapon/reagent_containers/food/snacks/grown/koibeans - name = "koibean" - desc = "Something about these seems fishy." - icon_state = "koibeans" - -/obj/item/weapon/reagent_containers/food/snacks/grown/moonflower - name = "moonflower" - desc = "Store in a location at least 50 yards away from werewolves." - icon_state = "moonflower" - -/obj/item/weapon/reagent_containers/food/snacks/grown/ghost_chilli - name = "ghost chili" - desc = "It seems to be vibrating gently." - icon_state = "ghostchilipepper" - var/mob/held_mob - -/obj/item/weapon/reagent_containers/food/snacks/grown/tomato - name = "tomato" - desc = "I say to-mah-to, you say tom-mae-to." - icon_state = "tomato" - filling_color = "#FF0000" - potency = 10 - plantname = "tomato" - -/obj/item/weapon/reagent_containers/food/snacks/grown/tomato/throw_impact(atom/hit_atom) - ..() - new/obj/effect/decal/cleanable/tomato_smudge(src.loc) - src.visible_message("The [src.name] has been squashed.","You hear a smack.") - del(src) - return - -/obj/item/weapon/reagent_containers/food/snacks/grown/killertomato - name = "killer-tomato" - desc = "I say to-mah-to, you say tom-mae-to... OH GOD IT'S EATING MY LEGS!!" - icon_state = "killertomato" - potency = 10 - filling_color = "#FF0000" - potency = 30 - plantname = "killertomato" - -/obj/item/weapon/reagent_containers/food/snacks/grown/killertomato/attack_self(mob/user as mob) - if(istype(user.loc,/turf/space)) - return - new /mob/living/simple_animal/tomato(user.loc) - del(src) - - user << "You plant the killer-tomato." - -/obj/item/weapon/reagent_containers/food/snacks/grown/bloodtomato - name = "blood-tomato" - desc = "So bloody...so...very...bloody....AHHHH!!!!" - icon_state = "bloodtomato" - potency = 10 - filling_color = "#FF0000" - plantname = "bloodtomato" - -/obj/item/weapon/reagent_containers/food/snacks/grown/bloodtomato/throw_impact(atom/hit_atom) - ..() - new/obj/effect/decal/cleanable/blood/splatter(src.loc) - src.visible_message("The [src.name] has been squashed.","You hear a smack.") - src.reagents.reaction(get_turf(hit_atom)) - for(var/atom/A in get_turf(hit_atom)) - src.reagents.reaction(A) - del(src) - return - -/obj/item/weapon/reagent_containers/food/snacks/grown/bluetomato - name = "blue-tomato" - desc = "I say blue-mah-to, you say blue-mae-to." - icon_state = "bluetomato" - potency = 10 - filling_color = "#586CFC" - plantname = "bluetomato" - -/obj/item/weapon/reagent_containers/food/snacks/grown/bluetomato/throw_impact(atom/hit_atom) - ..() - new/obj/effect/decal/cleanable/blood/oil(src.loc) - src.visible_message("The [src.name] has been squashed.","You hear a smack.") - src.reagents.reaction(get_turf(hit_atom)) - for(var/atom/A in get_turf(hit_atom)) - src.reagents.reaction(A) - del(src) - return - -/obj/item/weapon/reagent_containers/food/snacks/grown/bluetomato/Crossed(AM as mob|obj) - if (istype(AM, /mob/living/carbon)) - var/mob/M = AM - if (istype(M, /mob/living/carbon/human) && (isobj(M:shoes) && M:shoes.flags&NOSLIP) || M.buckled) - return - - M.stop_pulling() - M << "\blue You slipped on the [name]!" - playsound(src.loc, 'sound/misc/slip.ogg', 50, 1, -3) - M.Stun(8) - M.Weaken(5) - -/obj/item/weapon/reagent_containers/food/snacks/grown/wheat - name = "wheat" - desc = "Sigh... wheat... a-grain?" - gender = PLURAL - icon_state = "wheat" - filling_color = "#F7E186" - plantname = "wheat" - -/obj/item/weapon/reagent_containers/food/snacks/grown/ricestalk - name = "rice stalk" - desc = "Rice to see you." - gender = PLURAL - icon_state = "rice" - filling_color = "#FFF8DB" - plantname = "rice" - -/obj/item/weapon/reagent_containers/food/snacks/grown/kudzupod - name = "kudzu pod" - desc = "Pueraria Virallis: An invasive species with vines that rapidly creep and wrap around whatever they contact." - icon_state = "kudzupod" - filling_color = "#59691B" - plantname = "kudzu" - -/obj/item/weapon/reagent_containers/food/snacks/grown/icepepper - name = "ice-pepper" - desc = "It's a mutant strain of chili" - icon_state = "icepepper" - potency = 20 - filling_color = "#66CEED" - plantname = "icechili" - -/obj/item/weapon/reagent_containers/food/snacks/grown/carrot - name = "carrot" - desc = "It's good for the eyes!" - icon_state = "carrot" - potency = 10 - filling_color = "#FFC400" - plantname = "carrot" - -/obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/reishi - name = "reishi" - desc = "Ganoderma lucidum: A special fungus believed to help relieve stress." - icon_state = "reishi" - potency = 10 - filling_color = "#FF4800" - plantname = "reishi" - -/obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/amanita - name = "fly amanita" - desc = "Amanita Muscaria: Learn poisonous mushrooms by heart. Only pick mushrooms you know." - icon_state = "amanita" - potency = 10 - filling_color = "#FF0000" - plantname = "amanita" - -/obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/angel - name = "destroying angel" - desc = "Amanita Virosa: Deadly poisonous basidiomycete fungus filled with alpha amatoxins." - icon_state = "angel" - potency = 35 - filling_color = "#FFDEDE" - plantname = "destroyingangel" - -/obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/libertycap - name = "liberty-cap" - desc = "Psilocybe Semilanceata: Liberate yourself!" - icon_state = "libertycap" - potency = 15 - filling_color = "#F714BE" - plantname = "libertycap" - -/obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/plumphelmet - name = "plump-helmet" - desc = "Plumus Hellmus: Plump, soft and s-so inviting~" - icon_state = "plumphelmet" - filling_color = "#F714BE" - plantname = "plumphelmet" - -/obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/walkingmushroom - name = "walking mushroom" - desc = "Plumus Locomotus: The beginning of the great walk." - icon_state = "walkingmushroom" - filling_color = "#FFBFEF" - potency = 30 - plantname = "walkingmushroom" - -/obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/walkingmushroom/attack_self(mob/user as mob) - if(istype(user.loc,/turf/space)) - return - var/mob/living/simple_animal/hostile/mushroom/M = new /mob/living/simple_animal/hostile/mushroom(user.loc) - M.maxHealth += round(potency / 4) - M.melee_damage_lower += round(potency / 20) - M.melee_damage_upper += round(potency / 20) - M.move_to_delay -= round(potency / 50) - M.health = M.maxHealth - del(src) - - user << "You plant the walking mushroom." - -/obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/chanterelle - name = "chanterelle cluster" - desc = "Cantharellus Cibarius: These jolly yellow little shrooms sure look tasty!" - icon_state = "chanterelle" - filling_color = "#FFE991" - plantname = "mushrooms" - -/obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/glowshroom - name = "glowshroom cluster" - desc = "Mycena Bregprox: This species of mushroom glows in the dark. Or does it?" - icon_state = "glowshroom" - filling_color = "#DAFF91" - potency = 30 - plantname = "glowshroom" - -/obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/glowshroom/attack_self(mob/user as mob) - if(istype(user.loc,/turf/space)) - return - var/obj/effect/glowshroom/planted = new /obj/effect/glowshroom(user.loc) - - planted.delay = 50 - planted.endurance = 100 - planted.potency = potency - del(src) - - user << "You plant the glowshroom." - -/obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/glowshroom/Destroy() - if(istype(loc,/mob)) - loc.set_light(round(loc.luminosity - potency/10,1)) - return ..() - -/obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/glowshroom/pickup(mob/user) - set_light(0) - user.set_light(round(user.luminosity + (potency/10),1)) - -/obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/glowshroom/dropped(mob/user) - user.set_light(round(user.luminosity - (potency/10),1)) - set_light(round(potency/10,1)) - -//Tobacco/varieties -/obj/item/weapon/reagent_containers/food/snacks/grown/tobacco - name = "tobacco leaves" - desc = "It's tobacco... Put that in your pipe and smoke it." - icon_state = "tobacco_leaves" - filling_color = "#FFE991" - plantname = "tobacco" - -/obj/item/weapon/reagent_containers/food/snacks/grown/tobacco/space - name = "space-tobacco leaves" - desc = "It's tobacco... From SPACE!" - icon_state = "stobacco_leaves" - filling_color = "#FFE991" - plantname = "stobacco" - -//Tea/varieties -/obj/item/weapon/reagent_containers/food/snacks/grown/teaaspera - name = "tea-aspera leaves" - desc = "Tea Aspera is well documented to have beneficial health effects!" - icon_state = "tea_aspera_leaves" - filling_color = "#7F8400" - plantname = "teaaspera" - -/obj/item/weapon/reagent_containers/food/snacks/grown/teaastra - name = "tea-astra leaves" - desc = "Tea Astra is well documented to have significant health effects." - icon_state = "tea_astra_leaves" - filling_color = "#7F8400" - plantname = "teaastra" - -//Coffee/varieties -/obj/item/weapon/reagent_containers/food/snacks/grown/coffeea - name = "coffee-arabica beans" - desc = "Coffee Arabica: A great way start to your morning, or to prolong your nights." - icon_state = "coffee_arabica" - filling_color = "#5B2E0D" - plantname = "coffeea" - -/obj/item/weapon/reagent_containers/food/snacks/grown/coffeer - name = "coffee-robusta beans" - desc = "Coffee Robusta: Coffe so robust we had to put it in the name." - icon_state = "coffee_robusta" - filling_color = "#5B2E0D" - plantname = "coffeer" - -// ************************************* -// Complex Grown Object Defines - -// Putting these at the bottom so they don't clutter the list up. -Cheridan -// ************************************* - -/obj/item/weapon/reagent_containers/food/snacks/grown/bluespacetomato - name = "blue-space tomato" - desc = "So lubricated, you might slip through space-time." - icon_state = "bluespacetomato" - potency = 20 - origin_tech = "bluespace=3" - filling_color = "#91F8FF" - plantname = "bluespacetomato" - -/obj/item/weapon/reagent_containers/food/snacks/grown/bluespacetomato/throw_impact(atom/hit_atom) - ..() - var/mob/M = usr - var/outer_teleport_radius = potency/10 //Plant potency determines radius of teleport. - var/inner_teleport_radius = potency/15 - var/list/turfs = new/list() - var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread - if(inner_teleport_radius < 1) //Wasn't potent enough, it just splats. - new/obj/effect/decal/cleanable/blood/oil(src.loc) - src.visible_message("The [src.name] has been squashed.","You hear a smack.") - del(src) - return - for(var/turf/T in orange(M,outer_teleport_radius)) - if(T in orange(M,inner_teleport_radius)) continue - if(istype(T,/turf/space)) continue - if(T.density) continue - if(T.x>world.maxx-outer_teleport_radius || T.xworld.maxy-outer_teleport_radius || T.yThe [src.name] has been squashed, causing a distortion in space-time.","You hear a splat and a crackle.") - del(src) - return diff --git a/code/modules/scripting/IDE.dm b/code/modules/scripting/IDE.dm deleted file mode 100644 index 6fbe19ba918..00000000000 --- a/code/modules/scripting/IDE.dm +++ /dev/null @@ -1,195 +0,0 @@ -/client/verb/tcssave() - set hidden = 1 - //writepanic("[__FILE__].[__LINE__] ([src.type])([usr ? usr.ckey : ""]) \\client/verb/tcssave() called tick#: [world.time]") - if(mob.machine || issilicon(mob)) - if(telecomms_check(mob)) - var/obj/machinery/computer/telecomms/traffic/Machine = mob.machine - if(Machine.editingcode != mob) - return - - if(Machine.SelectedServer) - var/obj/machinery/telecomms/server/Server = Machine.SelectedServer - var/tcscode = winget(src, "tcscode", "text") - Server.setcode( tcscode ) // this actually saves the code from input to the server - src << output(null, "tcserror") // clear the errors - else - src << output(null, "tcserror") - src << output("Failed to save: Unable to locate server machine. (Back up your code before exiting the window!)", "tcserror") - else - src << output(null, "tcserror") - src << output("Failed to save: Unable to locate machine. (Back up your code before exiting the window!)", "tcserror") - else - src << output(null, "tcserror") - src << output("Failed to save: Unable to locate machine. (Back up your code before exiting the window!)", "tcserror") - - -/client/verb/tcscompile() - set hidden = 1 - //writepanic("[__FILE__].[__LINE__] ([src.type])([usr ? usr.ckey : ""]) \\client/verb/tcscompile() called tick#: [world.time]") - if(mob.machine || issilicon(mob)) - if(telecomms_check(mob)) - var/obj/machinery/computer/telecomms/traffic/Machine = mob.machine - if(Machine.editingcode != mob) - return - - if(Machine.SelectedServer) - var/obj/machinery/telecomms/server/Server = Machine.SelectedServer - Server.setcode( winget(src, "tcscode", "text") ) // save code first - - spawn(0) - // Output all the compile-time errors - src << output(null, "tcserror") - src << output("Please wait, compiling...", "tcserror") - - var/list/compileerrors = Server.compile(mob) // then compile the code! - if(!telecomms_check(mob)) - return - - if(compileerrors.len) - src << output("Compile Errors", "tcserror") - for(var/datum/scriptError/e in compileerrors) - src << output("\t>[e.message]", "tcserror") - src << output("([compileerrors.len] errors)", "tcserror") - - // Output compile errors to all other people viewing the code too - for(var/mob/M in Machine.viewingcode) - if(M.client) - M << output(null, "tcserror") - M << output("Compile Errors", "tcserror") - for(var/datum/scriptError/e in compileerrors) - M << output("\t>[e.message]", "tcserror") - M << output("([compileerrors.len] errors)", "tcserror") - - - else - src << output("TCS compilation successful!", "tcserror") - src << output("(0 errors)", "tcserror") - - for(var/mob/M in Machine.viewingcode) - if(M.client) - M << output("TCS compilation successful!", "tcserror") - M << output("(0 errors)", "tcserror") - - else - src << output(null, "tcserror") - src << output("Failed to compile: Unable to locate server machine. (Back up your code before exiting the window!)", "tcserror") - else - src << output(null, "tcserror") - src << output("Failed to compile: Unable to locate machine. (Back up your code before exiting the window!)", "tcserror") - else - src << output(null, "tcserror") - src << output("Failed to compile: Unable to locate machine. (Back up your code before exiting the window!)", "tcserror") - -/client/verb/tcsrun() - set hidden = 1 - //writepanic("[__FILE__].[__LINE__] ([src.type])([usr ? usr.ckey : ""]) \\client/verb/tcsrun() called tick#: [world.time]") - if(mob.machine || issilicon(mob)) - if(telecomms_check(mob)) - var/obj/machinery/computer/telecomms/traffic/Machine = mob.machine - if(Machine.editingcode != mob) - return - - if(Machine.SelectedServer) - var/obj/machinery/telecomms/server/Server = Machine.SelectedServer - - var/datum/signal/signal = new - signal.data["message"] = "" - if(Server.freq_listening.len > 0) - signal.frequency = Server.freq_listening[1] - else - signal.frequency = 1459 - signal.data["name"] = "" - signal.data["job"] = "" - signal.data["reject"] = 0 - signal.data["server"] = Server - - Server.Compiler.Run(signal) - - - else - src << output(null, "tcserror") - src << output("Failed to run: Unable to locate server machine. (Back up your code before exiting the window!)", "tcserror") - else - src << output(null, "tcserror") - src << output("Failed to run: Unable to locate machine. (Back up your code before exiting the window!)", "tcserror") - else - src << output(null, "tcserror") - src << output("Failed to run: Unable to locate machine. (Back up your code before exiting the window!)", "tcserror") - - -/client/verb/exittcs() - set hidden = 1 - //writepanic("[__FILE__].[__LINE__] ([src.type])([usr ? usr.ckey : ""]) \\client/verb/exittcs() called tick#: [world.time]") - if(mob.machine || issilicon(mob)) - if(telecomms_check(mob)) - var/obj/machinery/computer/telecomms/traffic/Machine = mob.machine - if(Machine.editingcode == mob) - Machine.storedcode = "[winget(mob, "tcscode", "text")]" - Machine.editingcode = null - else - if(mob in Machine.viewingcode) - Machine.viewingcode.Remove(mob) - -/client/verb/tcsrevert() - set hidden = 1 - //writepanic("[__FILE__].[__LINE__] ([src.type])([usr ? usr.ckey : ""]) \\client/verb/tcsrevert() called tick#: [world.time]") - if(mob.machine || issilicon(mob)) - if(telecomms_check(mob)) - var/obj/machinery/computer/telecomms/traffic/Machine = mob.machine - if(Machine.editingcode != mob) - return - - if(Machine.SelectedServer) - var/obj/machinery/telecomms/server/Server = Machine.SelectedServer - - // Replace quotation marks with quotation macros for proper winset() compatibility - var/showcode = replacetext(Server.rawcode, "\\\"", "\\\\\"") - showcode = replacetext(showcode, "\"", "\\\"") - - winset(mob, "tcscode", "text=\"[showcode]\"") - - src << output(null, "tcserror") // clear the errors - else - src << output(null, "tcserror") - src << output("Failed to revert: Unable to locate server machine.", "tcserror") - else - src << output(null, "tcserror") - src << output("Failed to revert: Unable to locate machine.", "tcserror") - else - src << output(null, "tcserror") - src << output("Failed to revert: Unable to locate machine.", "tcserror") - - -/client/verb/tcsclearmem() - set hidden = 1 - //writepanic("[__FILE__].[__LINE__] ([src.type])([usr ? usr.ckey : ""]) \\client/verb/tcsclearmem() called tick#: [world.time]") - if(mob.machine || issilicon(mob)) - if(telecomms_check(mob)) - var/obj/machinery/computer/telecomms/traffic/Machine = mob.machine - if(Machine.editingcode != mob) - return - - if(Machine.SelectedServer) - var/obj/machinery/telecomms/server/Server = Machine.SelectedServer - Server.memory = list() // clear the memory - // Show results - src << output(null, "tcserror") - src << output("Server memory cleared!", "tcserror") - for(var/mob/M in Machine.viewingcode) - if(M.client) - M << output("Server memory cleared!", "tcserror") - else - src << output(null, "tcserror") - src << output("Failed to clear memory: Unable to locate server machine.", "tcserror") - else - src << output(null, "tcserror") - src << output("Failed to clear memory: Unable to locate machine.", "tcserror") - else - src << output(null, "tcserror") - src << output("Failed to clear memory: Unable to locate machine.", "tcserror") - -/proc/telecomms_check(var/mob/mob) - //writepanic("[__FILE__].[__LINE__] (no type)([usr ? usr.ckey : ""]) \\/proc/telecomms_check() called tick#: [world.time]") - if(mob && istype(mob.machine, /obj/machinery/computer/telecomms/traffic) && in_range(mob.machine, mob) || issilicon(mob) && istype(mob.machine, /obj/machinery/computer/telecomms/traffic)) - return 1 - return 0 \ No newline at end of file diff --git a/code/modules/scripting/stack.dm b/code/modules/scripting/stack.dm deleted file mode 100644 index 601c3d7646e..00000000000 --- a/code/modules/scripting/stack.dm +++ /dev/null @@ -1,26 +0,0 @@ -/datum/stack - var/list/contents = list() - -/datum/stack/proc/Push(value) - contents += value - -/datum/stack/proc/Pop() - if(!contents.len) - return null - - . = contents[contents.len] - contents.len-- - -/datum/stack/proc/Top() //returns the item on the top of the stack without removing it - if(!contents.len) - return null - - return contents[contents.len] - -/datum/stack/proc/Copy() - var/datum/stack/S = new() - S.contents = src.contents.Copy() - return S - -/datum/stack/proc/Clear() - contents.Cut() \ No newline at end of file diff --git a/code/modules/surgery/eye.dm b/code/modules/surgery/eye.dm deleted file mode 100644 index 327a90170d9..00000000000 --- a/code/modules/surgery/eye.dm +++ /dev/null @@ -1,144 +0,0 @@ -//Procedures in this file: Eye mending surgery -////////////////////////////////////////////////////////////////// -// EYE SURGERY // -////////////////////////////////////////////////////////////////// - -/datum/surgery_step/eye - priority = 2 - can_infect = 1 - can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) - if (!hasorgans(target)) - return 0 - var/obj/item/organ/external/affected = target.get_organ(target_zone) - if (!affected || (affected.status & ORGAN_ROBOT)) - return 0 - return target_zone == "eyes" - -/datum/surgery_step/eye/cut_open - allowed_tools = list( - /obj/item/weapon/scalpel = 100, \ - /obj/item/weapon/kitchenknife = 75, \ - /obj/item/weapon/shard = 50, \ - ) - - min_duration = 90 - max_duration = 110 - - can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) - return ..() - - begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) - user.visible_message("[user] starts to separate the corneas on [target]'s eyes with \the [tool].", \ - "You start to separate the corneas on [target]'s eyes with \the [tool].") - ..() - - end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) - user.visible_message("\blue [user] has separated the corneas on [target]'s eyes with \the [tool]." , \ - "\blue You have separated the corneas on [target]'s eyes with \the [tool].",) - target.op_stage.eyes = 1 - target.blinded += 1.5 - - fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) - var/obj/item/organ/eyes/eyes = target.internal_organs_by_name["eyes"] - var/obj/item/organ/external/affected = target.get_organ(target_zone) - user.visible_message("\red [user]'s hand slips, slicing [target]'s eyes wth \the [tool]!" , \ - "\red Your hand slips, slicing [target]'s eyes wth \the [tool]!" ) - affected.createwound(CUT, 10) - eyes.take_damage(5, 1) - -/datum/surgery_step/eye/lift_eyes - allowed_tools = list( - /obj/item/weapon/retractor = 100, \ - /obj/item/weapon/kitchen/utensil/fork = 50 - ) - - min_duration = 30 - max_duration = 40 - - can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) - return ..() && target.op_stage.eyes == 1 - - begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) - user.visible_message("[user] starts lifting corneas from [target]'s eyes with \the [tool].", \ - "You start lifting corneas from [target]'s eyes with \the [tool].") - ..() - - end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) - user.visible_message("\blue [user] has lifted the corneas from [target]'s eyes from with \the [tool]." , \ - "\blue You has lifted the corneas from [target]'s eyes from with \the [tool]." ) - target.op_stage.eyes = 2 - - fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) - var/obj/item/organ/eyes/eyes = target.internal_organs_by_name["eyes"] - var/obj/item/organ/external/affected = target.get_organ(target_zone) - user.visible_message("\red [user]'s hand slips, damaging [target]'s eyes with \the [tool]!", \ - "\red Your hand slips, damaging [target]'s eyes with \the [tool]!") - target.apply_damage(10, BRUTE, affected) - eyes.take_damage(5, 1) - -/datum/surgery_step/eye/mend_eyes - allowed_tools = list( - /obj/item/weapon/hemostat = 100, \ - /obj/item/stack/cable_coil = 75, \ - /obj/item/device/assembly/mousetrap = 10 //I don't know. Don't ask me. But I'm leaving it because hilarity. - ) - - min_duration = 80 - max_duration = 100 - - can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) - return ..() && target.op_stage.eyes == 2 - - begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) - user.visible_message("[user] starts mending the nerves and lenses in [target]'s eyes with \the [tool].", \ - "You start mending the nerves and lenses in [target]'s eyes with the [tool].") - ..() - - end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) - user.visible_message("\blue [user] mends the nerves and lenses in [target]'s with \the [tool]." , \ - "\blue You mend the nerves and lenses in [target]'s with \the [tool].") - target.op_stage.eyes = 3 - - fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) - var/obj/item/organ/eyes/eyes = target.internal_organs_by_name["eyes"] - var/obj/item/organ/external/affected = target.get_organ(target_zone) - user.visible_message("\red [user]'s hand slips, stabbing \the [tool] into [target]'s eye!", \ - "\red Your hand slips, stabbing \the [tool] into [target]'s eye!") - target.apply_damage(10, BRUTE, affected, sharp=1) - eyes.take_damage(5, 0) - -/datum/surgery_step/eye/cauterize - allowed_tools = list( - /obj/item/weapon/cautery = 100, \ - /obj/item/clothing/mask/cigarette = 75, \ - /obj/item/weapon/lighter = 50, \ - /obj/item/weapon/weldingtool = 25 - ) - - min_duration = 70 - max_duration = 100 - - can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) - return ..() - - begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) - user.visible_message("[user] is beginning to cauterize the incision around [target]'s eyes with \the [tool]." , \ - "You are beginning to cauterize the incision around [target]'s eyes with \the [tool].") - - end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) - var/obj/item/organ/eyes/eyes = target.internal_organs_by_name["eyes"] - user.visible_message("\blue [user] cauterizes the incision around [target]'s eyes with \the [tool].", \ - "\blue You cauterize the incision around [target]'s eyes with \the [tool].") - if (target.op_stage.eyes == 3) - target.disabilities &= ~NEARSIGHTED - target.sdisabilities &= ~BLIND - eyes.damage = 0 - target.op_stage.eyes = 0 - - fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) - var/obj/item/organ/eyes/eyes = target.internal_organs_by_name["eyes"] - var/obj/item/organ/external/affected = target.get_organ(target_zone) - user.visible_message("\red [user]'s hand slips, searing [target]'s eyes with \the [tool]!", \ - "\red Your hand slips, searing [target]'s eyes with \the [tool]!") - target.apply_damage(5, BURN, affected) - eyes.take_damage(5, 1) diff --git a/code/modules/virus2/biohazard destroyer.dm b/code/modules/virus2/biohazard destroyer.dm deleted file mode 100644 index 1c5799d07a2..00000000000 --- a/code/modules/virus2/biohazard destroyer.dm +++ /dev/null @@ -1,20 +0,0 @@ -/obj/machinery/disease2/biodestroyer - name = "Biohazard destroyer" - icon = 'icons/obj/pipes/disposal.dmi' - icon_state = "disposalbio" - var/list/accepts = list(/obj/item/clothing,/obj/item/weapon/virusdish/,/obj/item/weapon/cureimplanter,/obj/item/weapon/diseasedisk,/obj/item/weapon/reagent_containers) - density = 1 - anchored = 1 - -/obj/machinery/disease2/biodestroyer/attackby(var/obj/I as obj, var/mob/user as mob, params) - for(var/path in accepts) - if(I.type in typesof(path)) - user.drop_item() - del(I) - overlays += image('icons/obj/pipes/disposal.dmi', "dispover-handle") - return - user.drop_item() - I.loc = src.loc - - for(var/mob/O in hearers(src, null)) - O.show_message("\icon[src] \blue The [src.name] beeps", 2) \ No newline at end of file diff --git a/code/test.dm b/code/test.dm deleted file mode 100644 index 39da2e0e380..00000000000 --- a/code/test.dm +++ /dev/null @@ -1,51 +0,0 @@ -/client/verb/listprocs() - set category = "Debug" - set name = "Debug Proc List" - - var/list/atomList = typesof(/atom) - var/list/objList = typesof(/obj) - var/list/mobList = typesof(/mob) - var/list/turfList = typesof(/turf) - var/list/clientList = typesof(/client) - var/list/datumList = typesof(/datum) - var/total = 0 - var/debuglog = file("data/logs/debug.log") - - for (var/A in atomList) - var/list/procList = typesof("[A]/proc") - for(var/B in procList) - debuglog << B - total += procList.len - - for (var/A in objList) - var/list/procList = typesof("[A]/proc") - for(var/B in procList) - debuglog << B - total += procList.len - - for (var/A in mobList) - var/list/procList = typesof("[A]/proc") - for(var/B in procList) - debuglog << B - total += procList.len - - for (var/A in turfList) - var/list/procList = typesof("[A]/proc") - for(var/B in procList) - debuglog << B - total += procList.len - - for (var/A in clientList) - var/list/procList = typesof("[A]/proc") - for(var/B in procList) - debuglog << B - total += procList.len - - for (var/A in datumList) - var/list/procList = typesof("[A]/proc") - for(var/B in procList) - debuglog << B - total += procList.len - - debuglog << total - world << total diff --git a/code/stylesheet.dm b/interface/stylesheet.dm similarity index 100% rename from code/stylesheet.dm rename to interface/stylesheet.dm diff --git a/paradise.dme b/paradise.dme index c4f2edc5dee..d3a4fd5c68b 100644 --- a/paradise.dme +++ b/paradise.dme @@ -13,7 +13,6 @@ #include "_maps\cyberiad.dm" #include "code\_compile_options.dm" #include "code\hub.dm" -#include "code\stylesheet.dm" #include "code\world.dm" #include "code\__DEFINES\_readme.dm" #include "code\__DEFINES\admin.dm" @@ -1882,5 +1881,6 @@ #include "code\modules\virus2\isolator.dm" #include "code\modules\virus2\items_devices.dm" #include "interface\interface.dm" +#include "interface\stylesheet.dm" #include "interface\skin.dmf" // END_INCLUDE From b690dd8a9d6120ff02b0698b4787fc3d47327841 Mon Sep 17 00:00:00 2001 From: SamCroswell Date: Mon, 28 Dec 2015 00:21:38 -0500 Subject: [PATCH 25/53] Replaces Sleep with Paralysis --- code/modules/ninja/martial_art.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/ninja/martial_art.dm b/code/modules/ninja/martial_art.dm index 796b343864a..7b230c1e011 100644 --- a/code/modules/ninja/martial_art.dm +++ b/code/modules/ninja/martial_art.dm @@ -107,7 +107,7 @@ A << "You feel [D] go limp in your grip." D << "You feel your consciousness slip away as [A] strangles you!" - D.sleeping += 20 + D.AdjustParalysis(20) has_choke_hold = 0 From c4cb53bf0aaa36097baaa6e01f4dc4d2f2a5bbb4 Mon Sep 17 00:00:00 2001 From: Crazylemon64 Date: Mon, 28 Dec 2015 01:12:13 -0800 Subject: [PATCH 26/53] To heck with it here we go looks good enough Also - Increases the number of memes in the codebase --- code/__DEFINES/role_preferences.dm | 2 ++ code/game/gamemodes/antag_spawner.dm | 2 +- code/modules/client/preferences.dm | 40 ++++++++++++++---------- code/modules/client/preferences_mysql.dm | 19 ++++++----- 4 files changed, 38 insertions(+), 25 deletions(-) diff --git a/code/__DEFINES/role_preferences.dm b/code/__DEFINES/role_preferences.dm index 817f3e7a76a..0c5a2d820c2 100644 --- a/code/__DEFINES/role_preferences.dm +++ b/code/__DEFINES/role_preferences.dm @@ -6,6 +6,8 @@ //These are synced with the Database, if you change the values of the defines //then you MUST update the database! +// If you're adding a new role, remember to update modules/admin/topic.dm, so admins can dish out +// justice if someone's abusing your role #define ROLE_TRAITOR "traitor" #define ROLE_OPERATIVE "operative" #define ROLE_CHANGELING "changeling" diff --git a/code/game/gamemodes/antag_spawner.dm b/code/game/gamemodes/antag_spawner.dm index 011efa31c74..608d0d4061d 100644 --- a/code/game/gamemodes/antag_spawner.dm +++ b/code/game/gamemodes/antag_spawner.dm @@ -74,7 +74,7 @@ icon_state = "vial" /obj/item/weapon/antag_spawner/slaughter_demon/attack_self(mob/user as mob) - var/list/demon_candidates = get_candidates(ROLE_ALIEN) + var/list/demon_candidates = get_candidates(ROLE_DEMON) if(user.z == ZLEVEL_CENTCOMM)//this is to make sure the wizard does NOT summon a demon from the Den.. user << "You should probably wait until you reach the station." return diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index f343319d88a..bc28c88ee2f 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -3,22 +3,28 @@ var/list/preferences_datums = list() var/global/list/special_role_times = list( //minimum age (in days) for accounts to play these roles - num2text(ROLE_PAI) = 0, - num2text(ROLE_TRAITOR) = 7, - num2text(ROLE_CHANGELING) = 14, - num2text(ROLE_SHADOWLING) = 14, - num2text(ROLE_WIZARD) = 14, - num2text(ROLE_REV) = 14, - num2text(ROLE_VAMPIRE) = 14, - num2text(ROLE_BLOB) = 14, - num2text(ROLE_REVENANT) = 14, - num2text(ROLE_OPERATIVE) = 21, - num2text(ROLE_CULTIST) = 21, - num2text(ROLE_RAIDER) = 21, - num2text(ROLE_ALIEN) = 21, - num2text(ROLE_NINJA) = 21, - num2text(ROLE_MUTINEER) = 21, - num2text(ROLE_MALF) = 30, + ROLE_PAI = 0, + ROLE_POSIBRAIN = 0, + ROLE_GUARDIAN = 0, + ROLE_TRAITOR = 7, + ROLE_CHANGELING = 14, + ROLE_SHADOWLING = 14, + ROLE_WIZARD = 14, + ROLE_REV = 14, + ROLE_VAMPIRE = 14, + ROLE_BLOB = 14, + ROLE_REVENANT = 14, + ROLE_OPERATIVE = 21, + ROLE_CULTIST = 21, + ROLE_RAIDER = 21, + ROLE_ALIEN = 21, + ROLE_DEMON = 21, + ROLE_SENTIENT = 21, +// ROLE_GANG = 21, + ROLE_BORER = 21, + ROLE_NINJA = 21, + ROLE_MUTINEER = 21, + ROLE_MALF = 30, ) /proc/player_old_enough_antag(client/C, role) @@ -1429,7 +1435,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts var/cleaned_r = sql_sanitize_text(r) if(r != cleaned_r) // up to no good message_admins("[user] attempted an href exploit! (This could have possibly lead to a \"Bobby Tables\" exploit, so they're probably up to no good). String: [r] ID: [last_id] IP: [last_ip]") - user << "Please don't break the server." + user << "Stop right there, criminal scum" else be_special ^= r diff --git a/code/modules/client/preferences_mysql.dm b/code/modules/client/preferences_mysql.dm index e7a4ef93b33..656ddb2a4e7 100644 --- a/code/modules/client/preferences_mysql.dm +++ b/code/modules/client/preferences_mysql.dm @@ -55,6 +55,7 @@ // Might as well scrub out any malformed be_special list entries while we're here for (var/role in be_special) if(!(role in special_roles)) + log_to_dd("[C.key] had a malformed role entry: '[role]'. Removing!") be_special -= role var/DBQuery/query = dbcon.NewQuery({"UPDATE [format_table_name("player")] @@ -392,19 +393,23 @@ return return 1 -// If you see this proc lying around and don't know why it's there, expunge it, as this is for a short-term DB update +// If you see this proc lying around and don't know why it's there, expunge it, as this is for a short-term DB update, starting 27/12/2015 // 0 on failed update, 1 on success /datum/preferences/proc/old_roles_to_new(var/client/C) var/DBQuery/query = dbcon.NewQuery({" SELECT be_special - FROM [format_table_name("players")] + FROM [format_table_name("player")] WHERE ckey='[C.ckey]'"}) if(!query.Execute()) - var/err = query.ErrorMsg() - log_game("SQL NOTICE: be_special has been purged from the database, bug the coders. Error : \[[err]\]\n") - message_admins("SQL NOTICE: be_special has been purged from the database, bug the coders. Error : \[[err]\]\n") return 0 - var/old_be_special = query.item[1] + var/old_be_special + while(query.NextRow()) + old_be_special = text2num(query.item[1]) + if(isnull(old_be_special)) + message_admins("SQL NOTICE: be_special has been purged from the database, bug the coders.\n") + return 0 + + old_be_special = sanitize_integer(old_be_special, 0, 65535) var/B_traitor = 1 var/B_operative = 2 var/B_changeling = 4 @@ -445,6 +450,7 @@ be_special |= ROLE_ALIEN be_special |= ROLE_SENTIENT be_special |= ROLE_DEMON + be_special |= ROLE_BORER if(128) be_special |= ROLE_PAI be_special |= ROLE_POSIBRAIN @@ -453,7 +459,6 @@ be_special |= ROLE_CULTIST if(512) be_special |= ROLE_NINJA -// be_special |= ROLE_GANG since they will occupy the same ID and all if(1024) be_special |= ROLE_RAIDER if(2048) From e5bcd0d39f2846c71924b460ea2c98c11da28ce9 Mon Sep 17 00:00:00 2001 From: Crazylemon64 Date: Mon, 28 Dec 2015 01:15:22 -0800 Subject: [PATCH 27/53] Format update now also autosaves the new antag prefs --- code/modules/client/preferences_mysql.dm | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/code/modules/client/preferences_mysql.dm b/code/modules/client/preferences_mysql.dm index 656ddb2a4e7..920a087ceac 100644 --- a/code/modules/client/preferences_mysql.dm +++ b/code/modules/client/preferences_mysql.dm @@ -471,6 +471,18 @@ be_special |= ROLE_SHADOWLING if(32768) be_special |= ROLE_REVENANT + + var/DBQuery/query2 = dbcon.NewQuery({"UPDATE [format_table_name("player")] + SET + be_role='[list2params(sql_sanitize_text_list(be_special))]' + WHERE ckey='[C.ckey]'"} + ) + + if(!query2.Execute()) + var/err = query2.ErrorMsg() + log_game("SQL ERROR during saving player preferences. Error : \[[err]\]\n") + message_admins("SQL ERROR during saving player preferences. Error : \[[err]\]\n") + return return 1 /* From 0f03947d5534c4d0cd9f8d194ac04bec020ee6b2 Mon Sep 17 00:00:00 2001 From: Fox-McCloud Date: Mon, 28 Dec 2015 08:37:27 -0500 Subject: [PATCH 28/53] Ports Elite Syndicate Hardsuit and Uplink Refactor --- code/datums/uplink_item.dm | 83 ++++++++++-------- .../items/weapons/storage/uplink_kits.dm | 11 +++ code/modules/clothing/spacesuits/rig.dm | 21 +++++ icons/mob/head.dmi | Bin 247960 -> 249331 bytes icons/mob/suit.dmi | Bin 444924 -> 446714 bytes icons/obj/clothing/hats.dmi | Bin 114682 -> 115952 bytes icons/obj/clothing/suits.dmi | Bin 149382 -> 150021 bytes 7 files changed, 79 insertions(+), 36 deletions(-) diff --git a/code/datums/uplink_item.dm b/code/datums/uplink_item.dm index ea7f5e2abbd..c8729b833b3 100644 --- a/code/datums/uplink_item.dm +++ b/code/datums/uplink_item.dm @@ -13,9 +13,9 @@ var/list/uplink_items = list() var/datum/uplink_item/I = new item() if(!I.item) continue - if(I.gamemodes.len && ticker && !(ticker.mode.name in I.gamemodes)) + if(I.gamemodes.len && ticker && !(ticker.mode.type in I.gamemodes)) continue - if(I.excludefrom.len && ticker && (ticker.mode.name in I.excludefrom)) + if(I.excludefrom.len && ticker && (ticker.mode.type in I.excludefrom)) continue if(I.last) last += I @@ -285,7 +285,7 @@ var/list/uplink_items = list() desc = "A fully-loaded Scarborough Arms bullpup submachine gun that fires .45 rounds with a 20-round magazine and is compatible with suppressors." item = /obj/item/weapon/gun/projectile/automatic/c20r cost = 14 - gamemodes = list("nuclear emergency") + gamemodes = list(/datum/game_mode/nuclear) surplus = 40 /datum/uplink_item/dangerous/carbine @@ -294,7 +294,7 @@ var/list/uplink_items = list() reference = "AR" item = /obj/item/weapon/gun/projectile/automatic/m90 cost = 18 - gamemodes = list("nuclear emergency") + gamemodes = list(/datum/game_mode/nuclear) surplus = 50 /datum/uplink_item/dangerous/machinegun @@ -303,7 +303,7 @@ var/list/uplink_items = list() reference = "LMG" item = /obj/item/weapon/gun/projectile/automatic/l6_saw cost = 40 - gamemodes = list("nuclear emergency") + gamemodes = list(/datum/game_mode/nuclear) surplus = 0 /datum/uplink_item/dangerous/crossbow @@ -312,7 +312,7 @@ var/list/uplink_items = list() reference = "EC" item = /obj/item/weapon/gun/energy/kinetic_accelerator/crossbow cost = 12 - excludefrom = list("nuclear emergency") + excludefrom = list(/datum/game_mode/nuclear) surplus = 50 /datum/uplink_item/dangerous/flamethrower @@ -321,7 +321,7 @@ var/list/uplink_items = list() reference = "FT" item = /obj/item/weapon/flamethrower/full/tank cost = 11 - gamemodes = list("nuclear emergency") + gamemodes = list(/datum/game_mode/nuclear) surplus = 40 /datum/uplink_item/dangerous/sword @@ -344,7 +344,7 @@ var/list/uplink_items = list() reference = "VDG" item = /obj/item/weapon/grenade/spawnergrenade/manhacks cost = 8 - gamemodes = list("nuclear emergency") + gamemodes = list(/datum/game_mode/nuclear) surplus = 35 /datum/uplink_item/ammo/bioterror @@ -353,7 +353,7 @@ var/list/uplink_items = list() reference = "BTS" item = /obj/item/weapon/storage/box/syndie_kit/bioterror cost = 6 - gamemodes = list("nuclear emergency") + gamemodes = list(/datum/game_mode/nuclear) /datum/uplink_item/dangerous/tabungrenades name = "Tabun Gas Grenades" @@ -361,7 +361,7 @@ var/list/uplink_items = list() reference = "TGG" item = /obj/item/weapon/storage/box/syndie_kit/tabun cost = 15 - gamemodes = list("nuclear emergency") + gamemodes = list(/datum/game_mode/nuclear) surplus = 0 /datum/uplink_item/dangerous/emp @@ -385,7 +385,7 @@ var/list/uplink_items = list() reference = "GE" item = /obj/mecha/combat/gygax/dark/loaded cost = 90 - gamemodes = list("nuclear emergency") + gamemodes = list(/datum/game_mode/nuclear) surplus = 0 /datum/uplink_item/dangerous/mauler @@ -394,7 +394,7 @@ var/list/uplink_items = list() reference = "ME" item = /obj/mecha/combat/marauder/mauler/loaded cost = 140 - gamemodes = list("nuclear emergency") + gamemodes = list(/datum/game_mode/nuclear) surplus = 0 /datum/uplink_item/dangerous/syndieborg @@ -403,7 +403,7 @@ var/list/uplink_items = list() reference = "SC" item = /obj/item/weapon/antag_spawner/borg_tele cost = 50 - gamemodes = list("nuclear emergency") + gamemodes = list(/datum/game_mode/nuclear) surplus = 0 //for refunding the syndieborg teleporter @@ -416,7 +416,7 @@ var/list/uplink_items = list() name = "Holoparasites" desc = "Though capable of near sorcerous feats via use of hardlight holograms and nanomachines, they require an organic host as a home base and source of fuel." item = /obj/item/weapon/storage/box/syndie_kit/guardian - excludefrom = list("nuclear emergency") + excludefrom = list(/datum/game_mode/nuclear) cost = 12 // Ammunition @@ -445,7 +445,7 @@ var/list/uplink_items = list() reference = "45" item = /obj/item/ammo_box/magazine/smgm45 cost = 2 - gamemodes = list("nuclear emergency") + gamemodes = list(/datum/game_mode/nuclear) /datum/uplink_item/ammo/ammobag name = "Ammo Duffelbag - Shotgun Ammo Grab Bag" @@ -453,7 +453,7 @@ var/list/uplink_items = list() reference = "SAGL" item = /obj/item/weapon/storage/backpack/duffel/syndie/ammo/loaded cost = 10 //bulk buyer's discount. Very useful if you're buying a mech and dont have TC left to buy people non-shotgun guns - gamemodes = list("nuclear emergency") + gamemodes = list(/datum/game_mode/nuclear) /datum/uplink_item/ammo/bullslug name = "Drum Magazine - 12g Slugs" @@ -461,7 +461,7 @@ var/list/uplink_items = list() reference = "12BSG" item = /obj/item/ammo_box/magazine/m12g cost = 2 - gamemodes = list("nuclear emergency") + gamemodes = list(/datum/game_mode/nuclear) /datum/uplink_item/ammo/bullbuck name = "Drum Magazine - 12g buckshot" @@ -469,7 +469,7 @@ var/list/uplink_items = list() reference = "12BS" item = /obj/item/ammo_box/magazine/m12g/buckshot cost = 2 - gamemodes = list("nuclear emergency") + gamemodes = list(/datum/game_mode/nuclear) /datum/uplink_item/ammo/bullstun name = "Drum Magazine - 12g Stun Slug" @@ -477,7 +477,7 @@ var/list/uplink_items = list() reference = "12SS" item = /obj/item/ammo_box/magazine/m12g/stun cost = 3 - gamemodes = list("nuclear emergency") + gamemodes = list(/datum/game_mode/nuclear) /datum/uplink_item/ammo/bulldragon name = "Drum Magazine - 12g Dragon's Breath" @@ -485,7 +485,7 @@ var/list/uplink_items = list() reference = "12DB" item = /obj/item/ammo_box/magazine/m12g/dragon cost = 2 - gamemodes = list("nuclear emergency") + gamemodes = list(/datum/game_mode/nuclear) /datum/uplink_item/ammo/carbine name = "Toploader Magazine - 5.56" @@ -493,7 +493,7 @@ var/list/uplink_items = list() reference = "556" item = /obj/item/ammo_box/magazine/m556 cost = 2 - gamemodes = list("nuclear emergency") + gamemodes = list(/datum/game_mode/nuclear) /datum/uplink_item/ammo/a40mm name = "Ammo Box - 40mm grenades" @@ -501,7 +501,7 @@ var/list/uplink_items = list() reference = "40MM" item = /obj/item/ammo_box/a40mm cost = 4 - gamemodes = list("nuclear emergency") + gamemodes = list(/datum/game_mode/nuclear) /datum/uplink_item/ammo/machinegun name = "Box Magazine - 7.62x51mm" @@ -509,7 +509,7 @@ var/list/uplink_items = list() reference = "762" item = /obj/item/ammo_box/magazine/m762 cost = 12 - gamemodes = list("nuclear emergency") + gamemodes = list(/datum/game_mode/nuclear) surplus = 0 // STEALTHY WEAPONS @@ -530,7 +530,7 @@ var/list/uplink_items = list() reference = "SP" item = /obj/item/weapon/pen/sleepy cost = 8 - excludefrom = list("nuclear emergency") + excludefrom = list(/datum/game_mode/nuclear) /datum/uplink_item/stealthy_weapons/soap name = "Syndicate Soap" @@ -605,14 +605,14 @@ var/list/uplink_items = list() reference = "NSSS" item = /obj/item/clothing/shoes/syndigaloshes cost = 2 - excludefrom = list("nuclear emergency") + excludefrom = list(/datum/game_mode/nuclear) /datum/uplink_item/stealthy_tools/syndigaloshes/nuke name = "Tactical No-Slip Brown Shoes" desc = "These allow you to run on wet floors. They do not work on lubricated surfaces, and the maker swears they're better than normal ones, somehow." reference = "NNSSS" cost = 4 //but they aren't - gamemodes = list("nuclear emergency") + gamemodes = list(/datum/game_mode/nuclear) /datum/uplink_item/stealthy_tools/agent_card name = "Agent ID Card" @@ -691,7 +691,7 @@ var/list/uplink_items = list() reference = "SBM" item = /obj/item/weapon/storage/belt/military cost = 3 - excludefrom = list("nuclear emergency") + excludefrom = list(/datum/game_mode/nuclear) /datum/uplink_item/device_tools/medkit name = "Syndicate Combat Medic Kit" @@ -700,7 +700,7 @@ var/list/uplink_items = list() reference = "SCMK" item = /obj/item/weapon/storage/firstaid/tactical cost = 9 - gamemodes = list("nuclear emergency") + gamemodes = list(/datum/game_mode/nuclear) /datum/uplink_item/device_tools/space_suit name = "Space Suit" @@ -718,6 +718,17 @@ var/list/uplink_items = list() item = /obj/item/weapon/storage/box/syndie_kit/hardsuit cost = 8 +/datum/uplink_item/device_tools/elite_hardsuit + name = "Elite Syndicate Hardsuit" + desc = "The elite Syndicate hardsuit is worn by only the best nuclear agents. Features much better armoring and complete fireproofing, as well as a built in jetpack. \ + When the built in helmet is deployed your identity will be protected, even in death, as the suit cannot be removed by outside forces. Toggling the suit into combat mode \ + will allow you all the mobility of a loose fitting uniform without sacrificing armoring. Additionally the suit is collapsible, small enough to fit within a backpack. \ + Nanotrasen crewmembers are trained to report red space suit sightings; these suits in particular are known to drive employees into a panic." + reference = "ESHS" + item = /obj/item/weapon/storage/box/syndie_kit/elite_hardsuit + cost = 8 + gamemodes = list(/datum/game_mode/nuclear) + /datum/uplink_item/device_tools/thermal name = "Thermal Imaging Glasses" desc = "These glasses are thermals disguised as engineers' optical meson scanners. They allow you to see organisms through walls by capturing the upper portion of the infra-red light spectrum, emitted as heat and light by objects. Hotter objects, such as warm bodies, cybernetic organisms and artificial intelligence cores emit more of this light than cooler objects like walls and airlocks." @@ -755,7 +766,7 @@ var/list/uplink_items = list() reference = "BRMB" item = /obj/item/clothing/shoes/magboots/syndie cost = 3 - gamemodes = list("nuclear emergency") + gamemodes = list(/datum/game_mode/nuclear) /datum/uplink_item/device_tools/plastic_explosives name = "Composition C-4" @@ -793,7 +804,7 @@ var/list/uplink_items = list() reference = "SD" item = /obj/item/device/syndicatedetonator cost = 3 - gamemodes = list("nuclear emergency") + gamemodes = list(/datum/game_mode/nuclear) /datum/uplink_item/device_tools/advpinpointer name = "Advanced Pinpointer" @@ -815,7 +826,7 @@ var/list/uplink_items = list() item = /obj/item/weapon/circuitboard/teleporter reference = "TP" cost = 40 - gamemodes = list("nuclear emergency") + gamemodes = list(/datum/game_mode/nuclear) surplus = 0 /datum/uplink_item/device_tools/shield @@ -824,7 +835,7 @@ var/list/uplink_items = list() item = /obj/item/weapon/shield/energy reference = "ESD" cost = 16 - gamemodes = list("nuclear emergency") + gamemodes = list(/datum/game_mode/nuclear) surplus = 20 /datum/uplink_item/device_tools/medgun @@ -833,7 +844,7 @@ var/list/uplink_items = list() item = /obj/item/weapon/gun/medbeam reference = "MBG" cost = 15 - gamemodes = list("nuclear emergency") + gamemodes = list(/datum/game_mode/nuclear) // IMPLANTS @@ -903,7 +914,7 @@ var/list/uplink_items = list() reference = "SYB" item = /obj/item/weapon/storage/box/syndicate cost = 20 - excludefrom = list("nuclear emergency") + excludefrom = list(/datum/game_mode/nuclear) /datum/uplink_item/badass/syndiecards name = "Syndicate Playing Cards" @@ -912,7 +923,7 @@ var/list/uplink_items = list() reference = "SPC" item = /obj/item/toy/cards/deck/syndicate cost = 1 - excludefrom = list("nuclear emergency") + excludefrom = list(/datum/game_mode/nuclear) surplus = 40 /datum/uplink_item/badass/syndiecash @@ -962,7 +973,7 @@ var/list/uplink_items = list() reference = "SYSC" cost = 20 item = /obj/item/weapon/storage/box/syndicate - excludefrom = list("nuclear emergency") + excludefrom = list(/datum/game_mode/nuclear) /datum/uplink_item/badass/surplus_crate/spawn_item(turf/loc, obj/item/device/uplink/U) var/obj/structure/closet/crate/C = new(loc) diff --git a/code/game/objects/items/weapons/storage/uplink_kits.dm b/code/game/objects/items/weapons/storage/uplink_kits.dm index 50fb3e60ad8..7a0c29b3bfa 100644 --- a/code/game/objects/items/weapons/storage/uplink_kits.dm +++ b/code/game/objects/items/weapons/storage/uplink_kits.dm @@ -150,6 +150,17 @@ new /obj/item/clothing/head/helmet/space/rig/syndi(src) return +/obj/item/weapon/storage/box/syndie_kit/elite_hardsuit + name = "Boxed Elite Syndicate Hardsuit and Helmet" + can_hold = list("/obj/item/clothing/suit/space/rig/syndi/elite", "/obj/item/clothing/head/helmet/space/rig/syndi/elite") + max_w_class = 3 + +/obj/item/weapon/storage/box/syndie_kit/elite_hardsuit/New() + ..() + new /obj/item/clothing/suit/space/rig/syndi/elite(src) + new /obj/item/clothing/head/helmet/space/rig/syndi/elite(src) + return + /obj/item/weapon/storage/box/syndie_kit/conversion name = "box (CK)" diff --git a/code/modules/clothing/spacesuits/rig.dm b/code/modules/clothing/spacesuits/rig.dm index c96702b54b7..bc6d6f995cf 100644 --- a/code/modules/clothing/spacesuits/rig.dm +++ b/code/modules/clothing/spacesuits/rig.dm @@ -364,6 +364,27 @@ user.update_inv_wear_suit() user.update_inv_w_uniform() +//Elite Syndie suit +/obj/item/clothing/head/helmet/space/rig/syndi/elite + name = "elite syndicate hardsuit helmet" + desc = "An elite version of the syndicate helmet, with improved armour and fire shielding. It is in travel mode. Property of Gorlex Marauders." + icon_state = "hardsuit0-syndielite" + item_color = "syndielite" + armor = list(melee = 80, bullet = 70, laser = 50, energy = 25, bomb = 55, bio = 100, rad = 70) + heat_protection = HEAD + max_heat_protection_temperature = FIRE_IMMUNITY_SUIT_MAX_TEMP_PROTECT + sprite_sheets = null + +/obj/item/clothing/suit/space/rig/syndi/elite + name = "elite syndicate hardsuit" + desc = "An elite version of the syndicate hardsuit, with improved armour and fire shielding. It is in travel mode." + icon_state = "hardsuit0-syndielite" + item_color = "syndielite" + armor = list(melee = 80, bullet = 70, laser = 50, energy = 25, bomb = 55, bio = 100, rad = 70) + heat_protection = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS + max_heat_protection_temperature = FIRE_IMMUNITY_SUIT_MAX_TEMP_PROTECT + sprite_sheets = null + //Wizard Rig /obj/item/clothing/head/helmet/space/rig/wizard name = "gem-encrusted hardsuit helmet" diff --git a/icons/mob/head.dmi b/icons/mob/head.dmi index 33e1e3dcaa4af173aad898e71fa383c92276985f..240314dbb85697530389c947aaec1aa97b459565 100644 GIT binary patch delta 21628 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 diff --git a/icons/mob/suit.dmi b/icons/mob/suit.dmi index 9735f614804171b119c671e4b0bf6fcd031be2a2..4086b3259860e018422875c21ba4b3abd7ea45d2 100644 GIT binary patch delta 13943 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 Sr*#JeEH4#bE0n!34gNpCEkR5G diff --git a/icons/obj/clothing/hats.dmi b/icons/obj/clothing/hats.dmi index 492d22ce3df40eb7b3da72cbc0de52e64539491a..e16c5188681f9a42ca0ff8b13fb154590af1259e 100644 GIT binary patch delta 5277 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 DS6DKP From 24aa63c8125ecba71732a492de72f7062acdff6a Mon Sep 17 00:00:00 2001 From: SamCroswell Date: Mon, 28 Dec 2015 09:55:13 -0500 Subject: [PATCH 29/53] Adds darkness_view to helmets --- code/modules/clothing/clothing.dm | 1 + code/modules/mob/living/carbon/human/species/species.dm | 5 +++++ 2 files changed, 6 insertions(+) diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index 362d60e8dd9..f462bce2ee2 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -264,6 +264,7 @@ BLIND // can't see anything var/flash_protect = 0 var/tint = 0 var/HUDType = null + var/darkness_view = 0 var/vision_flags = 0 var/see_darkness = 1 diff --git a/code/modules/mob/living/carbon/human/species/species.dm b/code/modules/mob/living/carbon/human/species/species.dm index bf0702f5f9e..6cff7f5f7a0 100644 --- a/code/modules/mob/living/carbon/human/species/species.dm +++ b/code/modules/mob/living/carbon/human/species/species.dm @@ -413,6 +413,7 @@ if(H.client) H.client.screen += global_hud.darkMask + var/minimum_darkness_view = INFINITY if(H.glasses) if(istype(H.glasses, /obj/item/clothing/glasses)) var/obj/item/clothing/glasses/G = H.glasses @@ -420,6 +421,7 @@ if(G.darkness_view) H.see_in_dark = G.darkness_view + minimum_darkness_view = G.darkness_view if(!G.see_darkness) H.see_invisible = SEE_INVISIBLE_MINIMUM @@ -437,6 +439,9 @@ var/obj/item/clothing/head/hat = H.head H.sight |= hat.vision_flags + if(hat.darkness_view && hat.darkness_view < minimum_darkness_view) // Pick the lowest of the two darkness_views between the glasses and helmet. + H.see_in_dark = hat.darkness_view + if(!hat.see_darkness) H.see_invisible = SEE_INVISIBLE_MINIMUM From b7848e3ed3b943067f7083dc513f526f4786636f Mon Sep 17 00:00:00 2001 From: FalseIncarnate Date: Mon, 28 Dec 2015 11:23:21 -0500 Subject: [PATCH 30/53] Heater / Freezer QOL Tweak Atmospherics Heaters and Freezers now let the player select the direction for the connector from a list of the cardinal directions. - Previously randomly picked a direction, leading to a lot of wasted time if RNG was angry with you. --- code/game/machinery/Freezer.dm | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/code/game/machinery/Freezer.dm b/code/game/machinery/Freezer.dm index 3725a3e929d..49c1fb8d325 100644 --- a/code/game/machinery/Freezer.dm +++ b/code/game/machinery/Freezer.dm @@ -43,7 +43,7 @@ T += M.rating min_temperature = max(0,T0C - (170 + (T*15))) current_heat_capacity = 1000 * ((H - 1) ** 2) - + /obj/machinery/atmospherics/unary/cold_sink/freezer/construction() ..(dir,dir) @@ -62,8 +62,10 @@ if(!panel_open) user << "Open the maintenance panel first." return + var/list/choices = list("West" = WEST, "East" = EAST, "South" = SOUTH, "North" = NORTH) + var/selected = input(user,"Select a direction for the connector.", "Connector Direction") in choices + dir = choices[selected] playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) - dir = pick(WEST,EAST,SOUTH,NORTH) var/node_connect = dir initialize_directions = dir for(var/obj/machinery/atmospherics/target in get_step(src,node_connect)) @@ -84,7 +86,7 @@ /obj/machinery/atmospherics/unary/cold_sink/freezer/attack_ai(mob/user as mob) attack_hand(user) - + /obj/machinery/atmospherics/unary/cold_sink/freezer/attack_ghost(mob/user as mob) attack_hand(user) @@ -92,7 +94,7 @@ if(panel_open) user << "Close the maintenance panel first." return - + src.ui_interact(user) /obj/machinery/atmospherics/unary/cold_sink/freezer/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) @@ -193,8 +195,8 @@ RefreshParts() /obj/machinery/atmospherics/unary/heat_reservoir/heater/construction() - ..(dir,dir) - + ..(dir,dir) + /obj/machinery/atmospherics/unary/heat_reservoir/heater/RefreshParts() var/H var/T @@ -220,8 +222,10 @@ if(!panel_open) user << "Open the maintenance panel first." return + var/list/choices = list("West" = WEST, "East" = EAST, "South" = SOUTH, "North" = NORTH) + var/selected = input(user,"Select a direction for the connector.", "Connector Direction") in choices + dir = choices[selected] playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) - dir = pick(WEST,EAST,SOUTH,NORTH) var/node_connect = dir initialize_directions = dir for(var/obj/machinery/atmospherics/target in get_step(src,node_connect)) @@ -242,9 +246,9 @@ /obj/machinery/atmospherics/unary/heat_reservoir/heater/attack_ai(mob/user as mob) attack_hand(user) - + /obj/machinery/atmospherics/unary/heat_reservoir/heater/attack_ghost(mob/user as mob) - src.attack_hand(user) + src.attack_hand(user) /obj/machinery/atmospherics/unary/heat_reservoir/heater/attack_hand(mob/user as mob) if(panel_open) From 4908b327270ef8d7f1c0f96c326cecd28c47b43c Mon Sep 17 00:00:00 2001 From: Fox-McCloud Date: Tue, 29 Dec 2015 00:56:08 -0500 Subject: [PATCH 31/53] A few Overdose Reagent Tweaks --- code/modules/reagents/newchem/drugs.dm | 4 +--- code/modules/reagents/newchem/newchem_procs.dm | 1 - .../oldchem/reagents/drink/reagents_alcohol.dm | 18 ++++++++++++------ 3 files changed, 13 insertions(+), 10 deletions(-) diff --git a/code/modules/reagents/newchem/drugs.dm b/code/modules/reagents/newchem/drugs.dm index c27bef559ae..8216425da6a 100644 --- a/code/modules/reagents/newchem/drugs.dm +++ b/code/modules/reagents/newchem/drugs.dm @@ -15,7 +15,7 @@ /datum/reagent/nicotine/on_mob_life(var/mob/living/M as mob) if(!M) M = holder.my_atom - var/smoke_message = pick("You can just feel your lungs dying!", "You feel relaxed.", "You feel calmed.", "You feel the lung cancer forming.", "You feel the money you wasted.", "You feel like a space cowboy.", "You feel rugged.") + var/smoke_message = pick("You feel relaxed.", "You feel calmed.", "You feel like a space cowboy.", "You feel rugged.") if(prob(5)) M << "[smoke_message]" if(prob(50)) @@ -27,8 +27,6 @@ return /datum/reagent/nicotine/overdose_process(var/mob/living/M as mob) - if(prob(20)) - M << "You feel like you smoked too much." M.adjustToxLoss(1*REM) M.adjustOxyLoss(1*REM) ..() diff --git a/code/modules/reagents/newchem/newchem_procs.dm b/code/modules/reagents/newchem/newchem_procs.dm index a3dc47f26a4..92aa05c0280 100644 --- a/code/modules/reagents/newchem/newchem_procs.dm +++ b/code/modules/reagents/newchem/newchem_procs.dm @@ -45,7 +45,6 @@ datum/reagents/proc/metabolize(var/mob/M) if(M && R) if(R.volume >= R.overdose_threshold && !R.overdosed && R.overdose_threshold > 0) R.overdosed = 1 - M << "You feel like you took too much [R.name]!" R.overdose_start(M) if(R.volume < R.overdose_threshold && R.overdosed) R.overdosed = 0 diff --git a/code/modules/reagents/oldchem/reagents/drink/reagents_alcohol.dm b/code/modules/reagents/oldchem/reagents/drink/reagents_alcohol.dm index 0dd38567ccc..81ed8f644ac 100644 --- a/code/modules/reagents/oldchem/reagents/drink/reagents_alcohol.dm +++ b/code/modules/reagents/oldchem/reagents/drink/reagents_alcohol.dm @@ -144,13 +144,16 @@ confused_start = 100 //copy paste from LSD... shoot me -/datum/reagent/ethanol/absinthe/on_mob_life(var/mob/M) +/datum/reagent/ethanol/absinthe/on_mob_life(var/mob/living/M) if(!M) M = holder.my_atom if(!data) data = 1 data++ - M:hallucination += 5 - if(volume > overdose_threshold) - M:adjustToxLoss(1) + M.hallucination += 5 + ..() + return + +/datum/reagent/ethanol/absinthe/overdose_process(mob/living/M) + M.adjustToxLoss(1) ..() return @@ -164,8 +167,11 @@ /datum/reagent/ethanol/rum/on_mob_life(var/mob/living/M as mob) ..() M.dizziness +=5 - if(volume > overdose_threshold) - M:adjustToxLoss(1) + return + +/datum/reagent/ethanol/rum/overdose_process(mob/living/M) + M.adjustToxLoss(1) + ..() return /datum/reagent/ethanol/mojito From 3a6e7123d4179b9e2c2073bae5c690cad5d46098 Mon Sep 17 00:00:00 2001 From: Fox-McCloud Date: Tue, 29 Dec 2015 10:23:44 -0500 Subject: [PATCH 32/53] Adds in Pajama Closets --- _maps/map_files/cyberiad/cyberiad.dmm | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/_maps/map_files/cyberiad/cyberiad.dmm b/_maps/map_files/cyberiad/cyberiad.dmm index b3d2b1e0fc8..e1a492d2ab1 100644 --- a/_maps/map_files/cyberiad/cyberiad.dmm +++ b/_maps/map_files/cyberiad/cyberiad.dmm @@ -1930,7 +1930,7 @@ "aLf" = (/obj/machinery/newscaster{pixel_y = -28},/obj/structure/closet/athletic_mixed,/turf/simulated/floor{icon_state = "neutral"},/area/crew_quarters/fitness) "aLg" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/machinery/light,/obj/structure/closet/boxinggloves,/turf/simulated/floor{icon_state = "neutral"},/area/crew_quarters/fitness) "aLh" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/structure/closet/masks,/turf/simulated/floor{icon_state = "neutral"},/area/crew_quarters/fitness) -"aLi" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/light_switch{pixel_y = -25},/turf/simulated/floor{icon_state = "neutral"},/area/crew_quarters/fitness) +"aLi" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/light_switch{pixel_y = -25},/obj/structure/closet/wardrobe/pjs,/turf/simulated/floor{icon_state = "neutral"},/area/crew_quarters/fitness) "aLj" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/poolcontroller{pixel_y = -25; srange = 7},/turf/simulated/floor{icon_state = "neutral"},/area/crew_quarters/fitness) "aLk" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor,/area/crew_quarters/fitness) "aLl" = (/obj/structure/reagent_dispensers/water_cooler,/turf/simulated/floor,/area/crew_quarters/fitness) @@ -3376,7 +3376,7 @@ "bmV" = (/obj/machinery/door/airlock{name = "Unit 1"},/turf/simulated/floor{icon_state = "freezerfloor"},/area/crew_quarters/locker/locker_toilet) "bmW" = (/obj/machinery/light_switch{pixel_y = 28},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/turf/simulated/floor{icon_state = "freezerfloor"},/area/crew_quarters/locker/locker_toilet) "bmX" = (/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/obj/structure/cable,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{icon_state = "freezerfloor"},/area/crew_quarters/locker/locker_toilet) -"bmY" = (/obj/structure/table,/obj/structure/window/reinforced{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{dir = 8; icon_state = "barber"},/area/crew_quarters/locker) +"bmY" = (/obj/structure/window/reinforced{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/closet/wardrobe/pjs,/turf/simulated/floor{dir = 8; icon_state = "barber"},/area/crew_quarters/locker) "bmZ" = (/turf/simulated/floor{dir = 8; icon_state = "barber"},/area/crew_quarters/locker) "bna" = (/obj/structure/window/reinforced{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/dresser,/turf/simulated/floor{dir = 8; icon_state = "barber"},/area/crew_quarters/locker) "bnb" = (/obj/machinery/portable_atmospherics/pump,/turf/simulated/floor{icon_state = "delivery"},/area/crew_quarters/locker) @@ -6280,7 +6280,7 @@ "cqN" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{icon_state = "white"},/area/medical/surgery) "cqO" = (/obj/structure/table,/obj/item/weapon/reagent_containers/blood/AMinus,/obj/item/weapon/reagent_containers/blood/APlus,/obj/item/weapon/reagent_containers/blood/BMinus,/obj/item/weapon/reagent_containers/blood/BPlus,/obj/item/weapon/reagent_containers/blood/OPlus,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/alarm{pixel_y = 23},/obj/item/weapon/reagent_containers/blood/OMinus,/obj/machinery/camera{c_tag = "Medbay Surgery 2 North"; network = list("SS13")},/turf/simulated/floor{icon_state = "white"},/area/medical/surgery) "cqP" = (/obj/structure/table,/obj/item/weapon/storage/box/gloves,/obj/item/weapon/storage/box/masks,/obj/item/weapon/reagent_containers/spray/cleaner{desc = "Someone has crossed out the Space from Space Cleaner and written in Surgery. 'Do not remove under punishment of death!!!' is scrawled on the back."; name = "Surgery Cleaner"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/light_switch{pixel_x = 5; pixel_y = 27},/obj/machinery/holosign_switch{id = "surgery2"; pixel_x = -5; pixel_y = 27},/turf/simulated/floor{icon_state = "white"},/area/medical/surgery) -"cqQ" = (/obj/machinery/light{dir = 8},/turf/simulated/floor{dir = 8; icon_state = "whitered"},/area/medical/medbay2) +"cqQ" = (/obj/machinery/light{dir = 8},/obj/structure/closet/wardrobe/pjs,/turf/simulated/floor{dir = 8; icon_state = "whitered"},/area/medical/medbay2) "cqR" = (/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/floor/plating,/area/maintenance/asmaint2) "cqS" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple/visible/universal,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/maintenance/asmaint2) "cqT" = (/obj/effect/landmark{name = "xeno_spawn"; pixel_x = -1},/turf/simulated/floor/plating,/area/maintenance/asmaint) From e576b3a7774c6f817e67fecd866e2be8e482a203 Mon Sep 17 00:00:00 2001 From: Crazylemon Date: Tue, 29 Dec 2015 10:18:56 -0800 Subject: [PATCH 33/53] Fixes Fox's points --- code/game/gamemodes/borer/borer.dm | 2 +- code/modules/client/preferences_mysql.dm | 104 +++++++++++------------ 2 files changed, 53 insertions(+), 53 deletions(-) diff --git a/code/game/gamemodes/borer/borer.dm b/code/game/gamemodes/borer/borer.dm index c31216c8add..bf381ef763d 100644 --- a/code/game/gamemodes/borer/borer.dm +++ b/code/game/gamemodes/borer/borer.dm @@ -29,7 +29,7 @@ // also make sure that there's at least one borer and one host recommended_enemies = max(src.num_players() / 20 * 2, 2) - var/list/datum/mind/possible_borers = get_players_for_role(ROLE_ALIEN) + var/list/datum/mind/possible_borers = get_players_for_role(ROLE_BORER) if(possible_borers.len < 2) log_admin("MODE FAILURE: BORER. NOT ENOUGH BORER CANDIDATES.") diff --git a/code/modules/client/preferences_mysql.dm b/code/modules/client/preferences_mysql.dm index 920a087ceac..84d36fa9ea2 100644 --- a/code/modules/client/preferences_mysql.dm +++ b/code/modules/client/preferences_mysql.dm @@ -91,58 +91,58 @@ // Let's not have this explode if you sneeze on the DB var/DBQuery/query = dbcon.NewQuery({"SELECT - OOC_Notes, - real_name, - name_is_always_random, - gender, - age, - species, - language, - hair_red, - hair_green, - hair_blue, - facial_red, - facial_green, - facial_blue, - skin_tone, - skin_red, - skin_green, - skin_blue, - hair_style_name, - facial_style_name, - eyes_red, - eyes_green, - eyes_blue, - underwear, - undershirt, - backbag, - b_type, - alternate_option, - job_support_high, - job_support_med, - job_support_low, - job_medsci_high, - job_medsci_med, - job_medsci_low, - job_engsec_high, - job_engsec_med, - job_engsec_low, - job_karma_high, - job_karma_med, - job_karma_low, - flavor_text, - med_record, - sec_record, - gen_record, - disabilities, - player_alt_titles, - organ_data, - rlimb_data, - nanotrasen_relation, - speciesprefs, - socks, - body_accessory - FROM [format_table_name("characters")] WHERE ckey='[C.ckey]' AND slot='[slot]'"}) + OOC_Notes, + real_name, + name_is_always_random, + gender, + age, + species, + language, + hair_red, + hair_green, + hair_blue, + facial_red, + facial_green, + facial_blue, + skin_tone, + skin_red, + skin_green, + skin_blue, + hair_style_name, + facial_style_name, + eyes_red, + eyes_green, + eyes_blue, + underwear, + undershirt, + backbag, + b_type, + alternate_option, + job_support_high, + job_support_med, + job_support_low, + job_medsci_high, + job_medsci_med, + job_medsci_low, + job_engsec_high, + job_engsec_med, + job_engsec_low, + job_karma_high, + job_karma_med, + job_karma_low, + flavor_text, + med_record, + sec_record, + gen_record, + disabilities, + player_alt_titles, + organ_data, + rlimb_data, + nanotrasen_relation, + speciesprefs, + socks, + body_accessory + FROM [format_table_name("characters")] WHERE ckey='[C.ckey]' AND slot='[slot]'"}) if(!query.Execute()) var/err = query.ErrorMsg() log_game("SQL ERROR during character slot loading. Error : \[[err]\]\n") From 9045a4f011937b85e17cac7314e6b80b6b76b519 Mon Sep 17 00:00:00 2001 From: Fox-McCloud Date: Tue, 29 Dec 2015 22:43:18 -0500 Subject: [PATCH 34/53] flavortext tweaks --- code/modules/reagents/newchem/drugs.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/reagents/newchem/drugs.dm b/code/modules/reagents/newchem/drugs.dm index 8216425da6a..69679560ef8 100644 --- a/code/modules/reagents/newchem/drugs.dm +++ b/code/modules/reagents/newchem/drugs.dm @@ -15,7 +15,7 @@ /datum/reagent/nicotine/on_mob_life(var/mob/living/M as mob) if(!M) M = holder.my_atom - var/smoke_message = pick("You feel relaxed.", "You feel calmed.", "You feel like a space cowboy.", "You feel rugged.") + var/smoke_message = pick("You feel relaxed.", "You feel calmed.", "You feel less stressed.", "You feel more placid.", "You feel more undivided.") if(prob(5)) M << "[smoke_message]" if(prob(50)) From d14aac6f7b5598a9a7318de4bbaca2b55feda338 Mon Sep 17 00:00:00 2001 From: Fox-McCloud Date: Wed, 30 Dec 2015 00:07:37 -0500 Subject: [PATCH 35/53] nicotine patches --- code/game/machinery/vending.dm | 4 ++-- code/modules/reagents/newchem/patch.dm | 9 ++++++++- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm index f05ab015c49..0a87b6c61fd 100644 --- a/code/game/machinery/vending.dm +++ b/code/game/machinery/vending.dm @@ -865,10 +865,10 @@ product_ads = "Probably not bad for you!;Don't believe the scientists!;It's good for you!;Don't quit, buy more!;Smoke!;Nicotine heaven.;Best cigarettes since 2150.;Award-winning cigs." vend_delay = 34 icon_state = "cigs" - products = list(/obj/item/weapon/storage/fancy/cigarettes = 5,/obj/item/weapon/storage/fancy/cigarettes/cigpack_uplift = 3,/obj/item/weapon/storage/fancy/cigarettes/cigpack_robust = 2,/obj/item/weapon/storage/fancy/cigarettes/cigpack_carp = 3,/obj/item/weapon/storage/fancy/cigarettes/cigpack_midori = 1,/obj/item/weapon/storage/fancy/cigarettes/cigpack_random = 2,/obj/item/weapon/storage/box/matches = 10,/obj/item/weapon/lighter/random = 4,/obj/item/weapon/rollingpaperpack = 5) + products = list(/obj/item/weapon/storage/fancy/cigarettes = 5,/obj/item/weapon/storage/fancy/cigarettes/cigpack_uplift = 3,/obj/item/weapon/storage/fancy/cigarettes/cigpack_robust = 2,/obj/item/weapon/storage/fancy/cigarettes/cigpack_carp = 3,/obj/item/weapon/storage/fancy/cigarettes/cigpack_midori = 1,/obj/item/weapon/storage/fancy/cigarettes/cigpack_random = 2, /obj/item/weapon/reagent_containers/pill/patch/nicotine = 10, /obj/item/weapon/storage/box/matches = 10,/obj/item/weapon/lighter/random = 4,/obj/item/weapon/rollingpaperpack = 5) contraband = list(/obj/item/weapon/lighter/zippo = 4) premium = list(/obj/item/clothing/mask/cigarette/cigar/havana = 2,/obj/item/weapon/storage/fancy/cigarettes/cigpack_robustgold = 1) - prices = list(/obj/item/weapon/storage/fancy/cigarettes = 60,/obj/item/weapon/storage/fancy/cigarettes/cigpack_uplift = 60,/obj/item/weapon/storage/fancy/cigarettes/cigpack_robust = 60,/obj/item/weapon/storage/fancy/cigarettes/cigpack_carp = 60,/obj/item/weapon/storage/fancy/cigarettes/cigpack_midori = 60,/obj/item/weapon/storage/fancy/cigarettes/cigpack_random = 150,/obj/item/weapon/storage/box/matches = 10,/obj/item/weapon/lighter/random = 60, /obj/item/weapon/rollingpaperpack = 20) + prices = list(/obj/item/weapon/storage/fancy/cigarettes = 60,/obj/item/weapon/storage/fancy/cigarettes/cigpack_uplift = 60,/obj/item/weapon/storage/fancy/cigarettes/cigpack_robust = 60,/obj/item/weapon/storage/fancy/cigarettes/cigpack_carp = 60,/obj/item/weapon/storage/fancy/cigarettes/cigpack_midori = 60,/obj/item/weapon/storage/fancy/cigarettes/cigpack_random = 150, /obj/item/weapon/reagent_containers/pill/patch/nicotine = 15, /obj/item/weapon/storage/box/matches = 10,/obj/item/weapon/lighter/random = 60, /obj/item/weapon/rollingpaperpack = 20) refill_canister = /obj/item/weapon/vending_refill/cigarette /obj/machinery/vending/cigarette/New() diff --git a/code/modules/reagents/newchem/patch.dm b/code/modules/reagents/newchem/patch.dm index 1e71a84d304..7901c97cbc0 100644 --- a/code/modules/reagents/newchem/patch.dm +++ b/code/modules/reagents/newchem/patch.dm @@ -36,4 +36,11 @@ desc = "Helps with burn injuries." New() ..() - reagents.add_reagent("synthflesh", 20) \ No newline at end of file + reagents.add_reagent("synthflesh", 20) + +/obj/item/weapon/reagent_containers/pill/patch/nicotine + name = "nicotine patch" + desc = "Helps temporarily curb the cravings of nicotine dependency." + New() + ..() + reagents.add_reagent("nicotine", 20) \ No newline at end of file From a6725230b46eee3a525a959aefe37615ea0666b7 Mon Sep 17 00:00:00 2001 From: Fox-McCloud Date: Wed, 30 Dec 2015 02:00:28 -0500 Subject: [PATCH 36/53] sheets --- _maps/map_files/cyberiad/cyberiad.dmm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/_maps/map_files/cyberiad/cyberiad.dmm b/_maps/map_files/cyberiad/cyberiad.dmm index e1a492d2ab1..d951ce24e56 100644 --- a/_maps/map_files/cyberiad/cyberiad.dmm +++ b/_maps/map_files/cyberiad/cyberiad.dmm @@ -8712,6 +8712,7 @@ "dlB" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plating/airless,/area/space) "dlC" = (/obj/structure/grille,/obj/structure/window/full/shuttle,/turf/space,/area/shuttle/constructionsite) "dlD" = (/obj/docking_port/mobile/pod{dir = 4; id = "pod4"; name = "escape pod 4"},/obj/machinery/door/airlock/shuttle{id_tag = "s_docking_airlock"; name = "Escape Pod Hatch"},/turf/simulated/shuttle/floor,/area/shuttle/pod_4) +"dlE" = (/obj/structure/table,/obj/structure/bedsheetbin{pixel_x = -1; pixel_y = 2},/turf/simulated/floor{dir = 8; icon_state = "barber"},/area/crew_quarters/locker) (1,1,1) = {" bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik @@ -8839,7 +8840,7 @@ bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbi bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbqYbqXbqXbqXbqXbqXbqXbqXbqXbqXbqXbqZbraaGdbraaJrbfqbgNblwbimblxblxblxblybimblzbgNblAblBbjWblCblCblCblCblDblCblEbecblFblGblHblHblIblJbcoblKblLblMblNblOblPblQblRblSblRblTblTblTblTblTblUberbeublVblWblXblYblZbmabmbbmcbmdbkBbmebmfbmgbmgbmgbmgbmhbmgbmibmjbmkbmlbmebmmbmnbcEbmobmpbmqbkNbmsbmtaYiaYibjfbcSbnCbcSbcSbcSaRebcSbcSbmvbmvbmwbmwbmxbeMbeMbmybmzbeMbeMbeMbmAbmBbmCaVbbgxbhNbeXbeXbeXbeXbhPbmDaVbbmEbmFbmFbmGbmFbmHbbPbbPbbPbbPbmIbbPbbPbbPbmJblobfgbfgbfgbfgbfgbfgbfgblnbloblpbgHbatbfjbfjbfkbfjbatddEbaAbmLbmMbmNbaAbBQbtmbmKbutbBQbtmbmKbutbBQbtmbmKbutbBQbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbrcbrbbrebrdbrfbrfbrgbrfbrfbrfbrgbluaInaInaKzbrVbcjbmQbimbmRblxblxblxblybmRbimbgNbmSbmTbjWblCbmUbmVbmWbmXblCbmYbmZbnabcobnbbncbndbnebcobejbnfbngbngbnhbngbngbngbngbnibnjbnjbnjbnkbnjbnlbnmbnnbnobnpbnqbnqbnqbnqbnqbnqbnrbnsbnrbmgbmgbntbnubnvbnwbnxbnybntbnzbmgbnAbnBbnAbnAbnAbnAbnAbnAbnAbmtaYiaYiaMebnEbnDbcSbnGbcSbnFbcSbnIbnHbnJbmwbpjaUTbnKbnLaUTaUTczObnNddybnNaUTaUTaVbbnObnPbnQbnQbnQbnQbnPbnRaVbbnSbmFbmFbmGbnTaRDbnUbnVbnWbnXbnYbnZboabobbocaQbbodaRSboebfgbfgboeaRSbofaQbbogbgHbatbgIbgIbgJbgIbatddDbgKblrblrblrbaAbGVbtmbmKbutbGVbtmbmKbutbGVbtmbmKbutbGVbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbrcbltbltblubltbltbltblvbltbltbtnaabaInboibdFbokbgNbjObjObjObimbolbombonboobgNbopboqbjWblCborblCbosbotblCboubovbowbcobnbbncbndbiCbcobejbnfbngboxboybozboAboBbngboCboDboEboFbnmbnmbnmbnmboGboHboIbnqboJboKboLboMboNboOboPboQbmgboRbnvboSboTboUboTboSbnvboVbmgboWboXboYboZbpabpbbpcbpdbnAbpebpfbpfbpgaMeaMeaMeaMebphbjfbphbpiaMeaURaMeaMeaUTaUTaUTaUTbplbpkbpkbpkbpkbpmbpJaVbbakbpnbakbpobpobakbpnbakaVbbnSbmFbmFbppbnTaRDaRDaRDaRDaRDbjvaRDaRDaRDaRDaQbbpqaQcaQcaQcaQcaQcaQcaQbaQbbprbpsbatbatbatbavbatbatddAbaAbaAbaAbaAbgKbqUddFbmKbmKbmKbmKbmKbmKbmKbmKbmKddGbqUbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaLyaCuaKzaKzaKzaDEaDEaDEaDEaDEaDEbtobpubgNbgNbgNbgNbgNbgNbpvbgNbgNbgNbejbejbpxblCbpybpzbosbpAblCbpBbpCbpBbcobnbbncbndbecbcobejbnfbngbpDbpEbpFboAbpFbngboCbpGbpHbpIbqtbpKbpLbnmbpMbpNboIbpObpPbpQbpRbpSbpSbpRbpTbpUbmgbpVbnvbnvbpWbpXboTboSbnvbpYbmkbpZbqabqbbqcbqdbqebqbbqfbnAbqgbqhbqibqjbqkbqlbqmbqnbqnbqnbqnbqnbqnbqobqpbqqbqrbqnbqsbqnbqnbqnbqnbqnbqnbqnbqndcZbqubqvbqvbqvbqvbqvbqvbqwbqlbqxbqybqybqzbqAbqBbqAbqCbqAbqDbqEbqFbqAbqGbqHbqIbqJbqKbqKbqKbqKbqKbqKbqKbqLbqMbqNbqNbqNbqNbqObqNbqPbKnddHbPfddIbiibPfdlbbmKbmKbmKbmKddKbmKddKbmKbmKbmKddGbdBbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaLyaCuaKzaKzaKzaDEaDEaDEaDEaDEaDEbtobpubgNbgNbgNbgNbgNbgNbpvbgNbgNbgNbejbejbpxblCbpybpzbosbpAblCdlEbpCbpBbcobnbbncbndbecbcobejbnfbngbpDbpEbpFboAbpFbngboCbpGbpHbpIbqtbpKbpLbnmbpMbpNboIbpObpPbpQbpRbpSbpSbpRbpTbpUbmgbpVbnvbnvbpWbpXboTboSbnvbpYbmkbpZbqabqbbqcbqdbqebqbbqfbnAbqgbqhbqibqjbqkbqlbqmbqnbqnbqnbqnbqnbqnbqobqpbqqbqrbqnbqsbqnbqnbqnbqnbqnbqnbqnbqndcZbqubqvbqvbqvbqvbqvbqvbqwbqlbqxbqybqybqzbqAbqBbqAbqCbqAbqDbqEbqFbqAbqGbqHbqIbqJbqKbqKbqKbqKbqKbqKbqKbqLbqMbqNbqNbqNbqNbqObqNbqPbKnddHbPfddIbiibPfdlbbmKbmKbmKbmKddKbmKddKbmKbmKbmKddGbdBbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbtpbtqbtqbtqbtqbwpbwpbtqbtqbxZbikaabaInaLAaJtbzPbzObzRbzQbzQbzQbzQbzSbzUbzTbcsbdVbBFbrhblCblCblCbribotblCbcobcobcobcobnbbrjbrkbrlbcobrmbrnbngbrobrpboAbpFbrqbngboCbrrbpHbpIbpIbrsbrtbnmbrubpNboIbpObrvbrwbrxbrybrzbrAbpTbrBbmgbrCbpWbnvbrDbrEbrDbnvbpWbrFbnzbrGbqbbqbbqcbrHbqebqbbrIbnAbrJbqibqibqjbqkbqlbqnbqnbqnbqnbqnbqnbqnbrKbqnbqnbqnbqnbqnbqnbrLbrMbrMbrMbrMbrMbrMbrMbrMbrMbrMbrMbrMbrMbrMbrNbrObrPbqKbqKbrQbmFbmFbmFbmFbmFbmGbmFbmFbmFbmFbmFbmFbmFbmFbmFbmFbmFbmFbrRbmFbrSbrTbatbatbatbatbatbatbatddLbaAbgKbaAbaAbaAbqUddMddOddNbdBddPbdBddPbdBddQddMddObqUbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbBGbDCbBHdjhbDDdjidjidjkdjjbtqbxZbjNaInaInaKBbrWbrXbrYbrXbrXbrXbrXbrZbsabsbbcsbcsbscbsdblCbmUbsebsfbpAblCbsgbshbsgbcobcobcobcobsibcobsjbskbngbslbsmbpFbsnbsobngboCbnmbspbpIbpIbpIbsqbnmbsrbpNboIbpObssbrwbrxbstbsubrAbpTbsvbmgbswbsxbnvbsybszbsAboSbsBbsCbsDbsEbsFbsGbsHbsIbsJbqbbsKbnAbsLbsMbqibqjbqkbqlbqnbsNbqnbqnbqnbqnbsObsPbsPbsPbsPbsQbqnbqnbqnbqnbsRbqnbsNbsSbqnbsTbsUbsVbqnbsWbsXbsXbsYbsZbtabtbbmFbmFbmFbmFbmFbmFbmFbtcbtdbmFbmFbmFbmFbmFbmFbmFbmFbmFbmFbmFbtebtfbtfbtgddSddRddUddTddTddTddTddVddWbaAaabbikbikaabbqUddXddZddYdeabqUbikbqUdecdebdecdecbqUbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbBGbDCdjldjidjidjidjidjidjidjideHdjnaGddjnaJrbtrbrXbtsbttbtubtvbtwbrZbtxbtybtzbtzbtAbtBblCblCblCbosbtCborbcsbcsbcsbcsbtDbejbejbskbejbsjbskbngbtEbtFbtGbtHboAbngbtIbnmbtJbpIbpIbpIbtKbtLbtMbpNbtNbnqbtObtPbpRbpRbpRbpRbpTbtQbmgbtRbtSbmgbmgbmgbmgbmgbmgbmgbnzbnAbtTbtUbtVbtWbtXbtYbtZbnAbvubuabuabucbucbucbucbucbucbucbudbudbuebufbugbugbufbuebudbudbuhbuhbuhbuhbuhbuhbuibuibujbuibuibuibuibuibukbulbumbunbmFbmFbuobuobupbupbupbupbupbuqbtfbtfbtebtfbmFbtfbtfbtfbtfburbusbusbusbusdedbuubuubuubuubuubuubuubuubuubikbikbikbikbdBddYddYddYdeebqUbikbqUdefdebdebdegbqUbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik From ce2eb1c0ad6b2a420fff8d114e22bd857a57bef8 Mon Sep 17 00:00:00 2001 From: Fox-McCloud Date: Wed, 30 Dec 2015 03:03:06 -0500 Subject: [PATCH 37/53] Nuclear Challenge Mode --- code/game/gamemodes/nuclear/nuclear.dm | 4 ++ .../gamemodes/nuclear/nuclear_challenge.dm | 45 ++++++++++++++++++ code/game/machinery/teleporter.dm | 2 + code/modules/shuttle/shuttle.dm | 11 +++++ icons/obj/device.dmi | Bin 32027 -> 32304 bytes paradise.dme | 1 + 6 files changed, 63 insertions(+) create mode 100644 code/game/gamemodes/nuclear/nuclear_challenge.dm diff --git a/code/game/gamemodes/nuclear/nuclear.dm b/code/game/gamemodes/nuclear/nuclear.dm index 007e1c1da04..2b85f073e1d 100644 --- a/code/game/gamemodes/nuclear/nuclear.dm +++ b/code/game/gamemodes/nuclear/nuclear.dm @@ -173,6 +173,10 @@ proc/issyndicate(mob/living/M as mob) synd_mind.current.real_name = "[syndicate_name()] Team [leader_title]" synd_mind.current << "You are the Syndicate leader for this mission. You are responsible for the distribution of telecrystals and your ID is the only one who can open the launch bay doors." synd_mind.current << "If you feel you are not up to this task, give your ID to another operative." + synd_mind.current << "In your hand you will find a special item capable of triggering a greater challenge for your team. Examine it carefully and consult with your fellow operatives before activating it." + + var/obj/item/device/nuclear_challenge/challenge = new /obj/item/device/nuclear_challenge + synd_mind.current.equip_to_slot_or_del(challenge, slot_r_hand) var/list/foundIDs = synd_mind.current.search_contents_for(/obj/item/weapon/card/id) diff --git a/code/game/gamemodes/nuclear/nuclear_challenge.dm b/code/game/gamemodes/nuclear/nuclear_challenge.dm new file mode 100644 index 00000000000..c7ea18b48d6 --- /dev/null +++ b/code/game/gamemodes/nuclear/nuclear_challenge.dm @@ -0,0 +1,45 @@ +#define CHALLENGE_TIME_LIMIT 3000 +#define MIN_CHALLENGE_PLAYERS 50 + +/obj/item/device/nuclear_challenge + name = "Declaration of War (Challenge Mode)" + icon_state = "gangtool-red" + item_state = "walkietalkie" + desc = "Use to send a declaration of hostilities to the target, delaying your shuttle departure for 20 minutes while they prepare for your assault. \ + Such a brazen move will attract the attention of powerful benefactors within the Syndicate, who will supply your team with a massive amount of bonus telecrystals. \ + Must be used within five minutes, or your benefactors will lose interest." + + + +/obj/item/device/nuclear_challenge/attack_self(mob/living/user) + if(player_list.len < MIN_CHALLENGE_PLAYERS) + user << "The enemy crew is too small to be worth declaring war on." + return + if(user.z != ZLEVEL_CENTCOMM) + user << "You have to be at your base to use this." + return + + if(world.time > CHALLENGE_TIME_LIMIT) + 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 + + 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?", "Declare war?", "Yes", "No") + if(are_you_sure == "No") + user << "On second thought, the element of surprise isn't so bad after all." + return + + var/war_declaration = "[user.real_name] has declared his intent to utterly destroy [station_name()] with a nuclear device, and dares the crew to try and stop them." + command_announcement.Announce(war_declaration, "Declaration of War", 'sound/effects/siren.ogg') + user << "You've attracted the attention of powerful forces within the syndicate. A bonus bundle of telecrystals has been granted to your team. Great things await you if you complete the mission." + + for(var/obj/machinery/computer/shuttle/syndicate/S in machines) + S.challenge = TRUE + + var/obj/item/device/radio/uplink/U = new /obj/item/device/radio/uplink(get_turf(user)) + U.hidden_uplink.uplink_owner= "[user.key]" + U.hidden_uplink.uses = 280 + qdel(src) + + +#undef CHALLENGE_TIME_LIMIT +#undef MIN_CHALLENGE_PLAYERS diff --git a/code/game/machinery/teleporter.dm b/code/game/machinery/teleporter.dm index 6a4dbe224d7..2af6157b0ee 100644 --- a/code/game/machinery/teleporter.dm +++ b/code/game/machinery/teleporter.dm @@ -317,6 +317,8 @@ return power_station /obj/machinery/teleport/hub/Bumped(M as mob|obj) + if(z == ZLEVEL_CENTCOMM) + M << "You can't use this here." if(power_station && power_station.engaged && !panel_open) //--FalseIncarnate //Prevents AI cores from using the teleporter, prints out failure messages for clarity diff --git a/code/modules/shuttle/shuttle.dm b/code/modules/shuttle/shuttle.dm index e2c1aeaed44..8d5f601520c 100644 --- a/code/modules/shuttle/shuttle.dm +++ b/code/modules/shuttle/shuttle.dm @@ -676,6 +676,7 @@ shuttleId = "whiteship" possible_destinations = "whiteship_away;whiteship_home;whiteship_z4" +#define SYNDICATE_CHALLENGE_TIMER 12000 //20 minutes /obj/machinery/computer/shuttle/syndicate name = "syndicate shuttle terminal" @@ -684,11 +685,21 @@ req_access = list(access_syndicate) shuttleId = "syndicate" possible_destinations = "syndicate_away;syndicate_z5;syndicate_z3;syndicate_ne;syndicate_nw;syndicate_n;syndicate_se;syndicate_sw;syndicate_s" + var/challenge = FALSE /obj/machinery/computer/shuttle/syndicate/recall name = "syndicate shuttle recall terminal" possible_destinations = "syndicate_away" +/obj/machinery/computer/shuttle/syndicate/Topic(href, href_list) + if(href_list["move"]) + if(challenge && world.time < SYNDICATE_CHALLENGE_TIMER) + usr << "You've issued a combat challenge to the station! You've got to give them at least [round(((SYNDICATE_CHALLENGE_TIMER - world.time) / 10) / 60)] more minutes to allow them to prepare." + return 0 + ..() + +#undef SYNDICATE_CHALLENGE_TIMER + /obj/machinery/computer/shuttle/vox name = "skipjack control console" req_access = list(access_vox) diff --git a/icons/obj/device.dmi b/icons/obj/device.dmi index 7aec18d1dcd0e0b166f3e1d4eb645e94022aeb2c..6cbf410527620692d91e788dd1410ac866291d17 100644 GIT binary patch delta 10729 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 NYwO=Ayk;Nq{{ZLvAvOR2 delta 10450 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 diff --git a/paradise.dme b/paradise.dme index d3a4fd5c68b..65915b1a4bf 100644 --- a/paradise.dme +++ b/paradise.dme @@ -355,6 +355,7 @@ #include "code\game\gamemodes\nations\nationsdatums.dm" #include "code\game\gamemodes\nations\nationsprocs.dm" #include "code\game\gamemodes\nuclear\nuclear.dm" +#include "code\game\gamemodes\nuclear\nuclear_challenge.dm" #include "code\game\gamemodes\nuclear\nuclearbomb.dm" #include "code\game\gamemodes\nuclear\pinpointer.dm" #include "code\game\gamemodes\revolution\revolution.dm" From 3462bbcbc30f618a9d9141b825d87a357744e479 Mon Sep 17 00:00:00 2001 From: FalseIncarnate Date: Wed, 30 Dec 2015 12:14:27 -0500 Subject: [PATCH 38/53] Returns Away Missions to normal cycle Christmas is over, time to put away the Christmas away mission. Santa might return next year though... --- _maps/map_files/RandomZLevels/fileList.txt | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/_maps/map_files/RandomZLevels/fileList.txt b/_maps/map_files/RandomZLevels/fileList.txt index b135397b4f1..0ea5385a578 100644 --- a/_maps/map_files/RandomZLevels/fileList.txt +++ b/_maps/map_files/RandomZLevels/fileList.txt @@ -24,12 +24,12 @@ #===================================# # USABLE AWAY MISSIONS # #===================================# -#_maps/map_files/RandomZLevels/beach.dmm -#_maps/map_files/RandomZLevels/listeningpost.dmm -#_maps/map_files/RandomZLevels/moonoutpost19.dmm -#_maps/map_files/RandomZLevels/undergroundoutpost45.dmm +_maps/map_files/RandomZLevels/beach.dmm +_maps/map_files/RandomZLevels/listeningpost.dmm +_maps/map_files/RandomZLevels/moonoutpost19.dmm +_maps/map_files/RandomZLevels/undergroundoutpost45.dmm #===================================# # SPECIAL AWAY MISSIONS # #===================================# -_maps/map_files/RandomZLevels/evil_santa.dmm \ No newline at end of file +#_maps/map_files/RandomZLevels/evil_santa.dmm \ No newline at end of file From 7ea739fd824abdadba943a8e07ccfea4a754d5e7 Mon Sep 17 00:00:00 2001 From: Fox-McCloud Date: Wed, 30 Dec 2015 14:12:18 -0500 Subject: [PATCH 39/53] Fixes Guardians not being a selectable role --- code/__DEFINES/role_preferences.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/__DEFINES/role_preferences.dm b/code/__DEFINES/role_preferences.dm index 0c5a2d820c2..86495432d0e 100644 --- a/code/__DEFINES/role_preferences.dm +++ b/code/__DEFINES/role_preferences.dm @@ -65,4 +65,5 @@ var/global/list/special_roles = list( ROLE_DEMON, ROLE_SENTIENT, ROLE_POSIBRAIN, + ROLE_GUARDIAN, ) From c3d5311c328e2a649f4d5da06a6fedcfc65c53ab Mon Sep 17 00:00:00 2001 From: Fox-McCloud Date: Thu, 31 Dec 2015 00:44:21 -0500 Subject: [PATCH 40/53] no meta-gaming --- code/controllers/Processes/shuttles.dm | 3 +++ code/controllers/configuration.dm | 4 ++++ code/game/gamemodes/gameticker.dm | 2 ++ code/game/gamemodes/nuclear/nuclear_challenge.dm | 3 +++ code/game/machinery/computer/communications.dm | 4 ---- 5 files changed, 12 insertions(+), 4 deletions(-) diff --git a/code/controllers/Processes/shuttles.dm b/code/controllers/Processes/shuttles.dm index 5bf036599f0..c7ef656bff2 100644 --- a/code/controllers/Processes/shuttles.dm +++ b/code/controllers/Processes/shuttles.dm @@ -91,6 +91,9 @@ var/const/CALL_SHUTTLE_REASON_LENGTH = 12 throw EXCEPTION("requestEvac(): There is no emergency shuttle! The game will be unresolvable. This is likely due to a mapping error") return + if(world.time - round_start_time < config.shuttle_refuel_delay) + 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." + return switch(emergency.mode) if(SHUTTLE_RECALL) diff --git a/code/controllers/configuration.dm b/code/controllers/configuration.dm index 9447e3ea681..30b12c88e81 100644 --- a/code/controllers/configuration.dm +++ b/code/controllers/configuration.dm @@ -106,6 +106,8 @@ var/auto_toggle_ooc_during_round = 0 + var/shuttle_refuel_delay = 12000 + //Used for modifying movement speed for mobs. //Unversal modifiers var/run_speed = 0 @@ -599,6 +601,8 @@ config.bones_can_break = value if("limbs_can_break") config.limbs_can_break = value + if("shuttle_refuel_delay") + config.shuttle_refuel_delay = text2num(value) if("reactionary_explosions") config.reactionary_explosions = 1 if("bombcap") diff --git a/code/game/gamemodes/gameticker.dm b/code/game/gamemodes/gameticker.dm index b41959f8972..bbdbea1c724 100644 --- a/code/game/gamemodes/gameticker.dm +++ b/code/game/gamemodes/gameticker.dm @@ -1,4 +1,5 @@ var/global/datum/controller/gameticker/ticker +var/round_start_time = 0 /datum/controller/gameticker var/const/restart_timeout = 600 @@ -214,6 +215,7 @@ var/global/datum/controller/gameticker/ticker if(admins_number == 0) send2adminirc("Round has started with no admins online.") auto_toggle_ooc(0) // Turn it off + round_start_time = world.time /* DONE THROUGH PROCESS SCHEDULER supply_controller.process() //Start the supply shuttle regenerating points -- TLE diff --git a/code/game/gamemodes/nuclear/nuclear_challenge.dm b/code/game/gamemodes/nuclear/nuclear_challenge.dm index c7ea18b48d6..d3599db49b1 100644 --- a/code/game/gamemodes/nuclear/nuclear_challenge.dm +++ b/code/game/gamemodes/nuclear/nuclear_challenge.dm @@ -1,5 +1,6 @@ #define CHALLENGE_TIME_LIMIT 3000 #define MIN_CHALLENGE_PLAYERS 50 +#define CHALLENGE_SHUTTLE_DELAY 15000 //25 minutes, so the ops have at least 5 minutes before the shuttle is callable. /obj/item/device/nuclear_challenge name = "Declaration of War (Challenge Mode)" @@ -38,8 +39,10 @@ var/obj/item/device/radio/uplink/U = new /obj/item/device/radio/uplink(get_turf(user)) U.hidden_uplink.uplink_owner= "[user.key]" U.hidden_uplink.uses = 280 + config.shuttle_refuel_delay = CHALLENGE_SHUTTLE_DELAY qdel(src) #undef CHALLENGE_TIME_LIMIT #undef MIN_CHALLENGE_PLAYERS +#undef CHALLENGE_SHUTTLE_DELAY \ No newline at end of file diff --git a/code/game/machinery/computer/communications.dm b/code/game/machinery/computer/communications.dm index 87d4b1ce974..d4b317f0aa5 100644 --- a/code/game/machinery/computer/communications.dm +++ b/code/game/machinery/computer/communications.dm @@ -404,10 +404,6 @@ user << "The emergency shuttle may not be sent at this time. Please try again later." return - if(world.time < 6000) // Ten minute grace period to let the game get going without lolmetagaming. -- TLE - user << "The emergency shuttle is refueling. Please wait another [round((6000-world.time)/600)] minutes before trying again." - return - if(shuttle_master.emergency.mode > SHUTTLE_ESCAPE) user << "The emergency shuttle may not be called while returning to Central Command." return From 54cffd53b4047fd9cc0503d3dfe8f9f407bafd01 Mon Sep 17 00:00:00 2001 From: Certh Date: Thu, 31 Dec 2015 10:29:57 +0100 Subject: [PATCH 41/53] Creating pool tables no longer uses up the entire stack of grass --- code/game/objects/structures/tables_racks.dm | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm index 3cbad10c5c9..354a7c1b83c 100644 --- a/code/game/objects/structures/tables_racks.dm +++ b/code/game/objects/structures/tables_racks.dm @@ -566,7 +566,8 @@ /obj/structure/table/woodentable/attackby(obj/item/I as obj, mob/user as mob, params) if (istype(I, /obj/item/stack/tile/grass)) - qdel(I) + var/obj/item/stack/tile/grass/gr = I + gr.use(1) new /obj/structure/table/woodentable/poker( src.loc ) qdel(src) visible_message("[user] adds the grass to the wooden table") @@ -610,7 +611,7 @@ qdel(src) return - if(!(I.flags & ABSTRACT)) + if(!(I.flags & ABSTRACT) && !(istype(I, /obj/item/stack/tile/grass))) if(user.drop_item()) I.Move(loc) var/list/click_params = params2list(params) @@ -621,6 +622,7 @@ I.pixel_x = Clamp(text2num(click_params["icon-x"]) - 16, -(world.icon_size/2), world.icon_size/2) I.pixel_y = Clamp(text2num(click_params["icon-y"]) - 16, -(world.icon_size/2), world.icon_size/2) + return 1 /obj/structure/table/woodentable/poker //No specialties, Just a mapping object. From 4082b597975e029d2798531bf1f4613e5c9bc281 Mon Sep 17 00:00:00 2001 From: Certh Date: Thu, 31 Dec 2015 11:42:55 +0100 Subject: [PATCH 42/53] Dismantling girders now returns the same amount of metal as was used in construction the girders --- code/game/objects/structures/girders.dm | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/code/game/objects/structures/girders.dm b/code/game/objects/structures/girders.dm index d59055afdcf..1fa27723486 100644 --- a/code/game/objects/structures/girders.dm +++ b/code/game/objects/structures/girders.dm @@ -5,6 +5,11 @@ layer = TURF_LAYER + 0.9 var/state = 0 var/health = 200 + var/metalUsed = 2 //used to determine amount returned in deconstruction + +/obj/structure/girder/proc/refundMetal(metalAmount) //refunds metal used in construction when deconstructed + for(var/i=0;i < metalAmount;i++) + new /obj/item/stack/sheet/metal(get_turf(src)) /obj/structure/girder/attackby(obj/item/W as obj, mob/user as mob, params) if(istype(W, /obj/item/weapon/wrench) && state == 0) @@ -14,7 +19,7 @@ if(do_after(user,40, target = src)) if(!src) return user << "\blue You dissasembled the girder!" - new /obj/item/stack/sheet/metal(get_turf(src)) + refundMetal(metalUsed) qdel(src) else if(!anchored) playsound(src.loc, 'sound/items/Ratchet.ogg', 100, 1) @@ -29,18 +34,18 @@ if(do_after(user,30, target = src)) if(!src) return user << "\blue You slice apart the girder!" - new /obj/item/stack/sheet/metal(get_turf(src)) + refundMetal(metalUsed) qdel(src) else if(istype(W, /obj/item/weapon/pickaxe/drill/diamonddrill)) user << "\blue You drill through the girder!" - new /obj/item/stack/sheet/metal(get_turf(src)) + refundMetal(metalUsed) qdel(src) else if(istype(W, /obj/item/weapon/pickaxe/drill/jackhammer)) playsound(src.loc, 'sound/weapons/sonic_jackhammer.ogg', 100, 1) user << "You Disintegrate the girder!" - new /obj/item/stack/sheet/metal(get_turf(src)) + refundMetal(metalUsed) qdel(src) else if(istype(W, /obj/item/weapon/screwdriver) && state == 2 && istype(src,/obj/structure/girder/reinforced)) From d69a6918405a90cabbf75911f2a6b469a08fb45e Mon Sep 17 00:00:00 2001 From: Certh Date: Thu, 31 Dec 2015 12:07:22 +0100 Subject: [PATCH 43/53] Dismantling table parts now returns same amount of metal as was used in construction --- code/game/objects/items/weapons/table_rack_parts.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/game/objects/items/weapons/table_rack_parts.dm b/code/game/objects/items/weapons/table_rack_parts.dm index 6498aaa227a..d66945d1b75 100644 --- a/code/game/objects/items/weapons/table_rack_parts.dm +++ b/code/game/objects/items/weapons/table_rack_parts.dm @@ -50,6 +50,7 @@ /obj/item/weapon/table_parts/attackby(obj/item/weapon/W as obj, mob/user as mob, params) ..() if (istype(W, /obj/item/weapon/wrench)) + new /obj/item/stack/sheet/metal( user.loc ) new /obj/item/stack/sheet/metal( user.loc ) //SN src = null qdel(src) From d3f6329aeec5aac81ad50aefba8ee2257257f08d Mon Sep 17 00:00:00 2001 From: Certh Date: Thu, 31 Dec 2015 14:52:44 +0100 Subject: [PATCH 44/53] required reagants now show when searching on protolathe --- code/modules/research/rdconsole.dm | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/code/modules/research/rdconsole.dm b/code/modules/research/rdconsole.dm index 6f24645dcca..6112d6f5a9b 100644 --- a/code/modules/research/rdconsole.dm +++ b/code/modules/research/rdconsole.dm @@ -913,6 +913,15 @@ proc/CallMaterialName(ID) temp_material += " [D.materials[M]/coeff] [CallMaterialName(M)]" c = min(c,t) + for(var/R in D.reagents) + t = linked_lathe.check_mat(D, R) + temp_material += " | " + if (t < 1) + temp_material += "[D.reagents[R]/coeff] [CallMaterialName(R)]" + else + temp_material += " [D.reagents[R]/coeff] [CallMaterialName(R)]" + c = min(c,t) + if (c >= 1) dat += "[D.name]" if(c >= 5) From 64fdb0784792e54c985cf6c76b7fae9534ef9b9e Mon Sep 17 00:00:00 2001 From: Crazylemon Date: Thu, 31 Dec 2015 10:47:37 -0800 Subject: [PATCH 45/53] Can actually do robot face surgery now --- code/modules/surgery/robotics.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/surgery/robotics.dm b/code/modules/surgery/robotics.dm index 87f0e3318cd..537eedd9dd0 100644 --- a/code/modules/surgery/robotics.dm +++ b/code/modules/surgery/robotics.dm @@ -143,7 +143,7 @@ var/obj/item/weapon/weldingtool/welder = tool if(!welder.isOn() || !welder.remove_fuel(1,user)) return 0 - return affected && affected.open == 2 && affected.brute_dam > 0 && target_zone != "mouth" + return affected && affected.open == 2 && (affected.brute_dam > 0 || affected.disfigured)&& target_zone != "mouth" begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) var/obj/item/organ/external/affected = target.get_organ(target_zone) From e38417cebea4ae6e37fc13d10964316b3deb051f Mon Sep 17 00:00:00 2001 From: Fox-McCloud Date: Thu, 31 Dec 2015 17:28:27 -0500 Subject: [PATCH 46/53] Electrocution Refactor+Electric Reagents --- code/datums/spells/lightning.dm | 4 +- .../shadowling/shadowling_abilities.dm | 5 +- code/modules/mob/living/carbon/carbon.dm | 59 ++++++++----------- .../mob/living/carbon/human/examine.dm | 3 + code/modules/mob/living/carbon/human/human.dm | 27 +++++---- .../mob/living/carbon/human/species/golem.dm | 2 +- .../living/carbon/human/species/species.dm | 2 + code/modules/mob/living/living_defense.dm | 2 +- .../living/simple_animal/bot_swarm/swarmer.dm | 3 +- .../revenant/revenant_abilities.dm | 2 +- code/modules/reagents/newchem/pyro.dm | 18 ++++++ code/modules/reagents/newchem/toxins.dm | 34 +++++++++++ 12 files changed, 106 insertions(+), 55 deletions(-) diff --git a/code/datums/spells/lightning.dm b/code/datums/spells/lightning.dm index 37804317b69..e99261aa8bd 100644 --- a/code/datums/spells/lightning.dm +++ b/code/datums/spells/lightning.dm @@ -74,10 +74,10 @@ obj/effect/proc_holder/spell/targeted/lightning/proc/Reset(mob/user = usr) origin.Beam(target,icon_state="lightning[rand(1,12)]",icon='icons/effects/effects.dmi',time=5) var/mob/living/carbon/current = target if(bounces < 1) - current.electrocute_act(bolt_energy,"Lightning Bolt", def_zone = "chest") + current.electrocute_act(bolt_energy,"Lightning Bolt",safety=1) playsound(get_turf(current), 'sound/machines/defib_zap.ogg', 50, 1, -1) else - current.electrocute_act(bolt_energy,"Lightning Bolt", def_zone = "chest") + current.electrocute_act(bolt_energy,"Lightning Bolt",safety=1) playsound(get_turf(current), 'sound/machines/defib_zap.ogg', 50, 1, -1) var/list/possible_targets = new for(var/mob/living/M in view_or_range(range,target,"view")) diff --git a/code/game/gamemodes/shadowling/shadowling_abilities.dm b/code/game/gamemodes/shadowling/shadowling_abilities.dm index d6f5f2e47fc..f4186557627 100644 --- a/code/game/gamemodes/shadowling/shadowling_abilities.dm +++ b/code/game/gamemodes/shadowling/shadowling_abilities.dm @@ -706,8 +706,9 @@ datum/reagent/shadowling_blindness_smoke/on_mob_life(var/mob/living/M as mob) if(is_shadow_or_thrall(target)) continue target << "You are struck by a bolt of lightning!" - playsound(target, 'sound/effects/eleczap.ogg', 50, 1) - target.electrocute_act(80, "lightning bolt", def_zone = "chest") + playsound(target, 'sound/magic/LightningShock.ogg', 50, 1) + target.Weaken(8) + target.take_organ_damage(0,50) usr.Beam(target,icon_state="red_lightning",icon='icons/effects/effects.dmi',time=1) /obj/effect/proc_holder/spell/targeted/shadowlingAscendantTransmit diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 0d4985009cb..8c9ffd8400e 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -114,8 +114,7 @@ mob/living return return -/mob/living/carbon/electrocute_act(var/shock_damage, var/obj/source, var/siemens_coeff = 1.0, var/def_zone = null,var/override = 0, tesla_shock = 0) - +/mob/living/carbon/electrocute_act(shock_damage, obj/source, siemens_coeff = 1, override = 0, tesla_shock = 0) if(status_flags & GODMODE) //godmode return 0 if(NO_SHOCK in mutations) //shockproof @@ -124,42 +123,32 @@ mob/living shock_damage *= siemens_coeff if(shock_damage<1 && !override) return 0 - - src.apply_damage(shock_damage, BURN, def_zone, used_weapon="Electrocution") - - if(heart_attack && prob(25)) - heart_attack = 0 - playsound(loc, "sparks", 50, 1, -1) - if (shock_damage < 10) - src.visible_message( - "\red [src] was mildly shocked by the [source].", \ - "\red You feel a mild shock course through your body.", \ - "\red You hear a light zapping." \ - ) - jitteriness += (rand(2,4))//mostly for the swarmer trap - do_jitter_animation(jitteriness) - if (shock_damage > 10) - if (shock_damage < 200) - src.visible_message( - "\red [src] was shocked by the [source]!", \ - "\red You feel a powerful shock course through your body!", \ - "\red You hear a heavy electrical crack." \ - ) - jitteriness += 1000 //High numbers for violent convulsions - do_jitter_animation(jitteriness) - stuttering += 2 + if(reagents.has_reagent("teslium")) + shock_damage *= 1.5 //If the mob has teslium in their body, shocks are 50% more damaging! + take_overall_damage(0,shock_damage) + //src.burn_skin(shock_damage) + //src.adjustFireLoss(shock_damage) //burn_skin will do this for us + //src.updatehealth() + visible_message( + "[src] was shocked by \the [source]!", \ + "You feel a powerful shock coursing through your body!", \ + "You hear a heavy electrical crack." \ + ) + jitteriness += 1000 //High numbers for violent convulsions + do_jitter_animation(jitteriness) + stuttering += 2 + if(!tesla_shock || (tesla_shock && siemens_coeff > 0.5)) + Stun(2) + spawn(20) + jitteriness = max(jitteriness - 990, 10) //Still jittery, but vastly less if(!tesla_shock || (tesla_shock && siemens_coeff > 0.5)) - Stun(2) - spawn(20) - jitteriness = max(jitteriness - 990, 10) //Still jittery, but vastly less - if(!tesla_shock || (tesla_shock && siemens_coeff > 0.5)) - Stun(3) - Weaken(3) + Stun(3) + Weaken(3) if (shock_damage > 200) src.visible_message( - "\red [src] was arc flashed by the [source]!", \ - "\red The [source] arc flashes and electrocutes you!", \ - "\red You hear a lightning-like crack!" \ + "[src] was arc flashed by the [source]!", \ + "The [source] arc flashes and electrocutes you!", \ + "You hear a lightning-like crack!" \ ) playsound(loc, "sound/effects/eleczap.ogg", 50, 1, -1) explosion(src.loc,-1,0,2,2) diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index 15761fb3421..f0e30751fc7 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -245,6 +245,9 @@ else msg += "[t_He] [t_is] quite chubby.\n" + if(reagents.has_reagent("teslium")) + msg += "[t_He] is emitting a gentle blue glow!\n" + msg += "" if(getBrainLoss() >= 60) diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 01325c240eb..badfb8268e8 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -742,19 +742,11 @@ //Removed the horrible safety parameter. It was only being used by ninja code anyways. //Now checks siemens_coefficient of the affected area by default -/mob/living/carbon/human/electrocute_act(var/shock_damage, var/obj/source, var/base_siemens_coeff = 1.0, var/def_zone = null,var/override = 0, tesla_shock = 0) - +/mob/living/carbon/human/electrocute_act(shock_damage, obj/source, siemens_coeff = 1, safety = 0, override = 0, tesla_shock = 0) if(status_flags & GODMODE) //godmode return 0 if(NO_SHOCK in mutations) //shockproof return 0 - - if (!def_zone) - def_zone = pick("l_hand", "r_hand") - - var/obj/item/organ/external/affected_organ = get_organ(check_zone(def_zone)) - var/siemens_coeff = base_siemens_coeff * get_siemens_coefficient_organ(affected_organ) - if(tesla_shock) var/total_coeff = 1 if(gloves) @@ -766,8 +758,21 @@ if(S.siemens_coefficient <= 0) total_coeff -= 0.95 siemens_coeff = total_coeff - - return ..(shock_damage, source, siemens_coeff, def_zone, override, tesla_shock) + else if(!safety) + var/gloves_siemens_coeff = 1 + var/species_siemens_coeff = 1 + if(gloves) + var/obj/item/clothing/gloves/G = gloves + gloves_siemens_coeff = G.siemens_coefficient + if(species) + species_siemens_coeff = species.siemens_coeff + siemens_coeff = gloves_siemens_coeff * species_siemens_coeff + if(heart_attack) + if(shock_damage * siemens_coeff >= 1 && prob(25)) + heart_attack = 0 + if(stat == CONSCIOUS) + src << "You feel your heart beating again!" + . = ..(shock_damage,source,siemens_coeff,safety,override,tesla_shock) /mob/living/carbon/human/Topic(href, href_list) diff --git a/code/modules/mob/living/carbon/human/species/golem.dm b/code/modules/mob/living/carbon/human/species/golem.dm index aaa073879fb..ae11d2e8746 100644 --- a/code/modules/mob/living/carbon/human/species/golem.dm +++ b/code/modules/mob/living/carbon/human/species/golem.dm @@ -12,7 +12,7 @@ blood_color = "#515573" flesh_color = "#137E8F" - + siemens_coeff = 0 has_organ = list( "brain" = /obj/item/organ/brain/golem diff --git a/code/modules/mob/living/carbon/human/species/species.dm b/code/modules/mob/living/carbon/human/species/species.dm index 6cff7f5f7a0..f1fbf8c8299 100644 --- a/code/modules/mob/living/carbon/human/species/species.dm +++ b/code/modules/mob/living/carbon/human/species/species.dm @@ -42,6 +42,8 @@ var/passive_temp_gain = 0 //IS_SYNTHETIC species will gain this much temperature every second var/reagent_tag //Used for metabolizing reagents. + var/siemens_coeff = 1 //base electrocution coefficient + var/darksight = 2 var/hazard_high_pressure = HAZARD_HIGH_PRESSURE // Dangerously high pressure. var/warning_high_pressure = WARNING_HIGH_PRESSURE // High pressure warning. diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm index a62229d9c5b..4c1780e34d0 100644 --- a/code/modules/mob/living/living_defense.dm +++ b/code/modules/mob/living/living_defense.dm @@ -65,7 +65,7 @@ apply_damage(P.damage, P.damage_type, def_zone, armor) return P.on_hit(src, armor, def_zone) -/mob/living/proc/electrocute_act(var/shock_damage, var/obj/source, var/siemens_coeff = 1.0, var/def_zone = null, tesla_shock = 0) +/mob/living/proc/electrocute_act(shock_damage, obj/source, siemens_coeff = 1, safety = 0, tesla_shock = 0) return 0 //only carbon liveforms have this proc /mob/living/emp_act(severity) diff --git a/code/modules/mob/living/simple_animal/bot_swarm/swarmer.dm b/code/modules/mob/living/simple_animal/bot_swarm/swarmer.dm index e04147a7c77..16c20f1cd36 100644 --- a/code/modules/mob/living/simple_animal/bot_swarm/swarmer.dm +++ b/code/modules/mob/living/simple_animal/bot_swarm/swarmer.dm @@ -434,8 +434,7 @@ var/mob/living/L = AM if(!istype(L, /mob/living/simple_animal/hostile/swarmer)) playsound(loc,'sound/effects/snap.ogg',50, 1, -1) - L.Stun(1) //i am doing this here instead of electrocute act - L.electrocute_act(0, src, 1, "l_foot", 1) + L.electrocute_act(0, src, 1, 1) if(isrobot(L) || L.isSynthetic()) L.Weaken(5) qdel(src) diff --git a/code/modules/mob/living/simple_animal/revenant/revenant_abilities.dm b/code/modules/mob/living/simple_animal/revenant/revenant_abilities.dm index 02f231d7f73..29b58c981ab 100644 --- a/code/modules/mob/living/simple_animal/revenant/revenant_abilities.dm +++ b/code/modules/mob/living/simple_animal/revenant/revenant_abilities.dm @@ -105,7 +105,7 @@ if(M == user) return M.Beam(L,icon_state="purple_lightning",icon='icons/effects/effects.dmi',time=5) - M.electrocute_act(shock_damage, "[L.name]") + M.electrocute_act(shock_damage, "[L.name]", safety=1) var/datum/effect/system/spark_spread/z = new /datum/effect/system/spark_spread/ z.set_up(4, 0, M) z.start() diff --git a/code/modules/reagents/newchem/pyro.dm b/code/modules/reagents/newchem/pyro.dm index cb915f9a4c2..57a49b079f8 100644 --- a/code/modules/reagents/newchem/pyro.dm +++ b/code/modules/reagents/newchem/pyro.dm @@ -608,3 +608,21 @@ datum/reagent/firefighting_foam/reaction_obj(var/obj/O, var/volume) var/location = get_turf(holder.my_atom) explosion(location,0,0,3) return + +/datum/chemical_reaction/shock_explosion + name = "shock_explosion" + id = "shock_explosion" + result = null + required_reagents = list("teslium" = 5, "uranium" = 5) //uranium to this so it can't be spammed like no tomorrow without mining help. + result_amount = 1 + mix_message = "The reaction releases an electrical blast!" + mix_sound = 'sound/magic/lightningbolt.ogg' + +/datum/chemical_reaction/shock_explosion/on_reaction(var/datum/reagents/holder, var/created_volume) + var/turf/T = get_turf(holder.my_atom) + for(var/mob/living/carbon/C in view(6, T)) + C.Beam(T,icon_state="lightning[rand(1,12)]",icon='icons/effects/effects.dmi',time=5) //What? Why are we beaming from the mob to the turf? Turf to mob generates really odd results. + C.electrocute_act(1, "electrical blast") + holder.del_reagent("teslium") //Clear all remaining Teslium and Uranium, but leave all other reagents untouched. + holder.del_reagent("uranium") + return diff --git a/code/modules/reagents/newchem/toxins.dm b/code/modules/reagents/newchem/toxins.dm index 99a500c601a..d71be25ca55 100644 --- a/code/modules/reagents/newchem/toxins.dm +++ b/code/modules/reagents/newchem/toxins.dm @@ -745,3 +745,37 @@ datum/reagent/ants/on_mob_life(var/mob/living/M as mob) M.adjustBruteLoss(2) ..() return + +/datum/reagent/teslium //Teslium. Causes periodic shocks, and makes shocks against the target much more effective. + name = "Teslium" + id = "teslium" + description = "An unstable, electrically-charged metallic slurry. Increases the conductance of living things." + reagent_state = LIQUID + color = "#20324D" //RGB: 32, 50, 77 + metabolization_rate = 0.2 + var/shock_timer = 0 + +/datum/reagent/teslium/on_mob_life(mob/living/M) + shock_timer++ + if(shock_timer >= rand(5,30)) //Random shocks are wildly unpredictable + shock_timer = 0 + M.electrocute_act(rand(5,20), "Teslium in their body", 1, 1) //Override because it's caused from INSIDE of you + playsound(M, "sparks", 50, 1) + ..() + +/datum/chemical_reaction/teslium + name = "Teslium" + id = "teslium" + result = "teslium" + required_reagents = list("plasma" = 1, "silver" = 1, "blackpowder" = 1) + result_amount = 3 + mix_message = "A jet of sparks flies from the mixture as it merges into a flickering slurry." + min_temp = 400 + mix_sound = null + +/datum/chemical_reaction/teslium/on_reaction(var/datum/reagents/holder, var/created_volume) + var/location = get_turf(holder.my_atom) + var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread + s.set_up(6, 1, location) + s.start() + return \ No newline at end of file From 29ed8f2399c5e637fb538fd5116f99334dd8289b Mon Sep 17 00:00:00 2001 From: Fox-McCloud Date: Thu, 31 Dec 2015 18:17:12 -0500 Subject: [PATCH 47/53] tweak --- code/modules/mob/living/carbon/human/human.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index badfb8268e8..12bf73b43d4 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -772,7 +772,7 @@ heart_attack = 0 if(stat == CONSCIOUS) src << "You feel your heart beating again!" - . = ..(shock_damage,source,siemens_coeff,safety,override,tesla_shock) + . = ..() /mob/living/carbon/human/Topic(href, href_list) From ce7f05334dac0fc81eca3fcb9b8f1e2e6c906f3b Mon Sep 17 00:00:00 2001 From: Aurorablade Date: Fri, 1 Jan 2016 01:26:44 -0500 Subject: [PATCH 48/53] Bug fixes --- code/game/gamemodes/nations/nations.dm | 4 +-- code/game/mecha/mecha.dm | 5 ++++ .../living/simple_animal/bot_swarm/swarmer.dm | 25 ++++++++++++++++--- .../living/simple_animal/guardian/guardian.dm | 14 ++++++----- 4 files changed, 37 insertions(+), 11 deletions(-) diff --git a/code/game/gamemodes/nations/nations.dm b/code/game/gamemodes/nations/nations.dm index 8bcd47c60b1..6d3190aa424 100644 --- a/code/game/gamemodes/nations/nations.dm +++ b/code/game/gamemodes/nations/nations.dm @@ -266,9 +266,9 @@ datum/game_mode/nations /datum/game_mode/proc/update_nations_icons_added(datum/mind/nations_mind,var/naticon) var/datum/atom_hud/antag/nations_hud = huds[GAME_HUD_NATIONS] nations_hud.join_hud(nations_mind) - set_nations_hud(nations_mind.current,naticon) + set_nations_hud(nations_mind,naticon) /datum/game_mode/proc/update_nations_icons_removed(datum/mind/nations_mind) var/datum/atom_hud/antag/nations_hud = huds[GAME_HUD_NATIONS] nations_hud.leave_hud(nations_mind) - set_nations_hud(nations_mind.current, null) \ No newline at end of file + set_nations_hud(nations_mind, null) \ No newline at end of file diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index 938e9fcc9fd..276ed01252b 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -498,6 +498,7 @@ /obj/mecha/proc/update_health() if(src.health > 0) src.spark_system.start() + diag_hud_set_mechhealth() else qdel(src) return @@ -921,6 +922,9 @@ src.take_damage(W.force,W.damtype) src.check_for_internal_damage(list(MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST)) */ + diag_hud_set_mechhealth() + diag_hud_set_mechcell() + diag_hud_set_mechstat() return /obj/mecha/emag_act(user as mob) @@ -1831,6 +1835,7 @@ /obj/mecha/proc/dyngetcharge()//returns null if no powercell, else returns cell.charge if(!src.cell) return + diag_hud_set_mechcell() return max(0, src.cell.charge) /obj/mecha/proc/use_power(amount) diff --git a/code/modules/mob/living/simple_animal/bot_swarm/swarmer.dm b/code/modules/mob/living/simple_animal/bot_swarm/swarmer.dm index e04147a7c77..167a6e04a39 100644 --- a/code/modules/mob/living/simple_animal/bot_swarm/swarmer.dm +++ b/code/modules/mob/living/simple_animal/bot_swarm/swarmer.dm @@ -69,7 +69,7 @@ pass_flags = PASSTABLE ventcrawler = 2 ranged = 1 - ranged_cooldown_cap = 2 + ranged_cooldown_cap = 1 universal_speak = 0 universal_understand = 0 projectilesound = 'sound/weapons/taser2.ogg' @@ -163,8 +163,27 @@ S.DisIntegrate(src) deactivate(S, 0) -/obj/machinery/particle_accelerator/control_box/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) - S.DisIntegrate(src) +/obj/machinery/particle_accelerator/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) + S << "Disrupting the power grid would bring no benefit to us. Aborting." + +/obj/structure/particle_accelerator/fuel_chamber/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) + S << "Disrupting the power grid would bring no benefit to us. Aborting." + +/obj/structure/particle_accelerator/particle_emitter/center/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) + S << "Disrupting the power grid would bring no benefit to us. Aborting." + +/obj/structure/particle_accelerator/particle_emitter/left/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) + S << "Disrupting the power grid would bring no benefit to us. Aborting." + +/obj/structure/particle_accelerator/particle_emitter/right/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) + S << "Disrupting the power grid would bring no benefit to us. Aborting." + +/obj/structure/particle_accelerator/particle_emitter/end_cap/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) + S << "Disrupting the power grid would bring no benefit to us. Aborting." + +/obj/structure/particle_accelerator/particle_emitter/power_box/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) + S << "Disrupting the power grid would bring no benefit to us. Aborting." + /obj/machinery/field/generator/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) S.DisIntegrate(src) diff --git a/code/modules/mob/living/simple_animal/guardian/guardian.dm b/code/modules/mob/living/simple_animal/guardian/guardian.dm index b202fd9bf81..c4df2390160 100644 --- a/code/modules/mob/living/simple_animal/guardian/guardian.dm +++ b/code/modules/mob/living/simple_animal/guardian/guardian.dm @@ -688,16 +688,18 @@ user.verbs += /mob/living/proc/guardian_comm user.verbs += /mob/living/proc/guardian_recall user.verbs += /mob/living/proc/guardian_reset + var/magic_suite = pick("Wands","Cups","Swords","Pentacles") + var/picked_name = pick("Aries", "Leo", "Sagittarius", "Taurus", "Virgo", "Capricorn", "Gemini", "Libra", "Aquarius", "Cancer", "Scorpio", "Pisces") switch (theme) if("magic") - G.name = "[mob_name]" + G.name = "[mob_name] of [magic_suite]" G.color = picked_color - G.real_name = "[mob_name]" + G.real_name = "[mob_name] of [magic_suite]" user << "[G.magic_fluff_string]." if("tech") var/colour = pick("orange", "neon", "pink", "red", "blue", "green") - G.name = "[mob_name] [capitalize(colour)]" - G.real_name = "[mob_name] [capitalize(colour)]" + G.name = "[picked_name] [capitalize(colour)]" + G.real_name = "[picked_name] [capitalize(colour)]" G.icon_living = "parasite[colour]" G.icon_state = "parasite[colour]" G.icon_dead = "parasite[colour]" @@ -706,9 +708,9 @@ G.speak_emote = list("states") if("bio") user << "[G.bio_fluff_string]." - G.name = "[mob_name]" + G.name = "[mob_name] [picked_name]" G.color = picked_color - G.real_name = "[mob_name]" + G.real_name = "[mob_name] [picked_name]" G.icon_living = "headcrab" G.icon_state = "headcrab" G.attacktext = "swarms" From 6a931ef86895ceceb5a88cd82faf425440fa725d Mon Sep 17 00:00:00 2001 From: Crazylemon Date: Thu, 31 Dec 2015 22:34:03 -0800 Subject: [PATCH 49/53] Removes the apc from the area's APC list when destroyed --- code/modules/power/apc.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm index 897cfa1f9f1..f0617cb20f0 100644 --- a/code/modules/power/apc.dm +++ b/code/modules/power/apc.dm @@ -172,6 +172,7 @@ cell = null if(terminal) disconnect_terminal() + area.apc -= src return ..() /obj/machinery/power/apc/proc/make_terminal() From 421faee4f8d7aedef0537c4eb02aa984d2dbb04c Mon Sep 17 00:00:00 2001 From: Tastyfish Date: Fri, 1 Jan 2016 01:45:47 -0500 Subject: [PATCH 50/53] Makes footstep sounds check if we actually moved --- code/modules/mob/living/carbon/human/human_movement.dm | 2 +- code/modules/mob/living/living.dm | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/code/modules/mob/living/carbon/human/human_movement.dm b/code/modules/mob/living/carbon/human/human_movement.dm index c6e6279b3ad..06217db0dee 100644 --- a/code/modules/mob/living/carbon/human/human_movement.dm +++ b/code/modules/mob/living/carbon/human/human_movement.dm @@ -90,7 +90,7 @@ /mob/living/carbon/human/Move(NewLoc, direct) . = ..() - if(shoes) + if(shoes && .) // did we actually move? if(!lying && !buckled) if(!has_gravity(loc)) return diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index c426c3d8f4c..4f1ed4eb7c9 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -477,8 +477,9 @@ if (s_active && !( s_active in contents ) && get_turf(s_active) != get_turf(src)) //check !( s_active in contents ) first so we hopefully don't have to call get_turf() so much. s_active.close(src) - handle_footstep(loc) - step_count++ + if(.) // did we actually move? + handle_footstep(loc) + step_count++ if(update_slimes) for(var/mob/living/carbon/slime/M in view(1,src)) From 72d2db27c4cf4aad7ea4444502f7051ed08b7e4d Mon Sep 17 00:00:00 2001 From: Tastyfish Date: Fri, 1 Jan 2016 01:57:48 -0500 Subject: [PATCH 51/53] Fixed Test Areas and added checking for too many apc's --- code/modules/admin/verbs/debug.dm | 51 ++++++++++++++++++++++--------- 1 file changed, 37 insertions(+), 14 deletions(-) diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm index a4a60a4e413..4b862a69453 100644 --- a/code/modules/admin/verbs/debug.dm +++ b/code/modules/admin/verbs/debug.dm @@ -444,44 +444,59 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that var/list/areas_with_intercom = list() var/list/areas_with_camera = list() + var/list/areas_with_multiple_APCs = list() + var/list/areas_with_multiple_air_alarms = list() + for(var/area/A in world) - if(!(A.type in areas_all)) - areas_all.Add(A.type) + areas_all |= A.type for(var/obj/machinery/power/apc/APC in world) var/area/A = get_area(APC) + if(!A) + continue if(!(A.type in areas_with_APC)) - areas_with_APC.Add(A.type) + areas_with_APC |= A.type + else + areas_with_multiple_APCs |= A.type for(var/obj/machinery/alarm/alarm in world) var/area/A = get_area(alarm) + if(!A) + continue if(!(A.type in areas_with_air_alarm)) - areas_with_air_alarm.Add(A.type) + areas_with_air_alarm |= A.type + else + areas_with_multiple_air_alarms |= A.type for(var/obj/machinery/requests_console/RC in world) var/area/A = get_area(RC) - if(!(A.type in areas_with_RC)) - areas_with_RC.Add(A.type) + if(!A) + continue + areas_with_RC |= A.type for(var/obj/machinery/light/L in world) var/area/A = get_area(L) - if(!(A.type in areas_with_light)) - areas_with_light.Add(A.type) + if(!A) + continue + areas_with_light |= A.type for(var/obj/machinery/light_switch/LS in world) var/area/A = get_area(LS) - if(!(A.type in areas_with_LS)) - areas_with_LS.Add(A.type) + if(!A) + continue + areas_with_LS |= A.type for(var/obj/item/device/radio/intercom/I in world) var/area/A = get_area(I) - if(!(A.type in areas_with_intercom)) - areas_with_intercom.Add(A.type) + if(!A) + continue + areas_with_intercom |= A.type for(var/obj/machinery/camera/C in world) var/area/A = get_area(C) - if(!(A.type in areas_with_camera)) - areas_with_camera.Add(A.type) + if(!A) + continue + areas_with_camera |= A.type var/list/areas_without_APC = areas_all - areas_with_APC var/list/areas_without_air_alarm = areas_all - areas_with_air_alarm @@ -499,6 +514,14 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that for(var/areatype in areas_without_air_alarm) world << "* [areatype]" + world << "AREAS WITH TOO MANY APCS:" + for(var/areatype in areas_with_multiple_APCs) + world << "* [areatype]" + + world << "AREAS WITH TOO MANY AIR ALARMS:" + for(var/areatype in areas_with_multiple_air_alarms) + world << "* [areatype]" + world << "AREAS WITHOUT A REQUEST CONSOLE:" for(var/areatype in areas_without_RC) world << "* [areatype]" From b3f232cf9396b1bf307a5edef8c95fe0029f421b Mon Sep 17 00:00:00 2001 From: Tastyfish Date: Fri, 1 Jan 2016 02:46:32 -0500 Subject: [PATCH 52/53] Removed redundant APC's in areas, fixed a couple areas --- _maps/map_files/cyberiad/cyberiad.dmm | 154 +++++++++++++------------- _maps/map_files/cyberiad/z5.dmm | 6 +- _maps/map_files/cyberiad/z6.dmm | 6 +- 3 files changed, 82 insertions(+), 84 deletions(-) diff --git a/_maps/map_files/cyberiad/cyberiad.dmm b/_maps/map_files/cyberiad/cyberiad.dmm index d951ce24e56..210f3a221b5 100644 --- a/_maps/map_files/cyberiad/cyberiad.dmm +++ b/_maps/map_files/cyberiad/cyberiad.dmm @@ -1292,7 +1292,7 @@ "ayR" = (/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1},/turf/simulated/floor/wood,/area/clownoffice) "ayS" = (/obj/structure/rack,/obj/item/clothing/under/rank/clown,/obj/item/weapon/storage/backpack/clown,/obj/item/clothing/mask/gas/clown_hat,/obj/item/clothing/shoes/clown_shoes,/obj/item/device/radio/intercom{name = "station intercom (General)"; pixel_y = -28},/turf/simulated/floor/wood,/area/clownoffice) "ayT" = (/obj/machinery/light,/obj/structure/clownstatue,/turf/simulated/floor/wood,/area/clownoffice) -"ayU" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/power/apc{dir = 8; name = "Fore Primary Hallway APC"; pixel_x = -24},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor{dir = 8; icon_state = "redcorner"},/area/hallway/primary/fore) +"ayU" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor{dir = 8; icon_state = "redcorner"},/area/hallway/primary/fore) "ayV" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/light,/turf/simulated/floor{dir = 8; icon_state = "redcorner"},/area/hallway/primary/fore) "ayW" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{dir = 8; icon_state = "redcorner"},/area/hallway/primary/fore) "ayX" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor{dir = 8; icon_state = "redcorner"},/area/hallway/primary/fore) @@ -3753,7 +3753,7 @@ "bui" = (/turf/simulated/wall,/area/medical/morgue) "buj" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/door/firedoor,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Biohazard_medi"; name = "Quarantine Lockdown"; opacity = 0},/obj/machinery/door/airlock/medical{name = "Morgue"; req_access_txt = "0"; req_one_access_txt = "6,9"},/turf/simulated/floor,/area/medical/morgue) "buk" = (/turf/simulated/wall/r_wall,/area/medical/morgue) -"bul" = (/obj/machinery/door/airlock{name = "Starboard Emergency Storage"; req_access_txt = "0"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/maintenance/asmaint) +"bul" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/medical/ward) "bum" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/wall,/area/hallway/primary/starboard/east) "bun" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/structure/flora/kirbyplants,/turf/simulated/floor,/area/hallway/primary/starboard/east) "buo" = (/turf/simulated/floor{dir = 1; icon_state = "loadingarea"; tag = "loading"},/area/hallway/primary/starboard/east) @@ -3842,7 +3842,7 @@ "bvT" = (/obj/machinery/camera{c_tag = "Medbay Morgue"; network = list("SS13")},/obj/machinery/power/apc{dir = 1; name = "Morgue APC"; pixel_y = 24},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor{dir = 1; icon_state = "blue"},/area/medical/morgue) "bvU" = (/turf/simulated/floor{dir = 1; icon_state = "blue"},/area/medical/morgue) "bvV" = (/obj/structure/morgue{tag = "icon-morgue1 (WEST)"; icon_state = "morgue1"; dir = 8},/turf/simulated/floor,/area/medical/morgue) -"bvW" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment,/obj/effect/landmark/start{name = "Civilian"},/turf/simulated/floor/plating,/area/maintenance/asmaint) +"bvW" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/turf/simulated/floor{icon_state = "white"},/area/medical/ward) "bvX" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/wall/r_wall,/area/assembly/chargebay) "bvY" = (/turf/simulated/wall/r_wall,/area/assembly/chargebay) "bvZ" = (/obj/machinery/door/firedoor{dir = 8; name = "Firelock West"},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Biohazard"; name = "Biohazard Shutter"; opacity = 0},/obj/machinery/door/airlock/research{name = "Mech Bay"; req_access_txt = "29"; req_one_access_txt = "0"},/turf/simulated/floor,/area/assembly/chargebay) @@ -3925,7 +3925,7 @@ "bxy" = (/obj/structure/morgue{tag = "icon-morgue1 (WEST)"; icon_state = "morgue1"; dir = 8},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/effect/landmark{name = "revenantspawn"},/turf/simulated/floor,/area/medical/morgue) "bxz" = (/obj/structure/morgue,/obj/effect/landmark{name = "revenantspawn"},/turf/simulated/floor,/area/medical/morgue) "bxA" = (/obj/structure/morgue{tag = "icon-morgue1 (WEST)"; icon_state = "morgue1"; dir = 8},/obj/effect/landmark{name = "revenantspawn"},/turf/simulated/floor,/area/medical/morgue) -"bxB" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/maintenance/asmaint) +"bxB" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor{icon_state = "white"},/area/medical/ward) "bxC" = (/obj/machinery/light_switch{pixel_x = -23; pixel_y = 0},/turf/simulated/floor,/area/assembly/chargebay) "bxD" = (/turf/simulated/floor,/area/assembly/chargebay) "bxE" = (/obj/machinery/door_control{dir = 2; id = "mechbay"; name = "Mech Bay Door Control"; pixel_x = 6; pixel_y = 24; req_access_txt = "29"},/turf/simulated/floor{tag = "icon-warningcorner (WEST)"; icon_state = "warningcorner"; dir = 8},/area/assembly/chargebay) @@ -4020,7 +4020,7 @@ "bzp" = (/obj/machinery/optable,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment,/turf/simulated/floor,/area/medical/morgue) "bzq" = (/obj/machinery/hologram/holopad,/turf/simulated/floor,/area/medical/morgue) "bzr" = (/obj/structure/morgue{tag = "icon-morgue1 (WEST)"; icon_state = "morgue1"; dir = 8},/obj/machinery/light/small{dir = 4},/obj/effect/landmark{name = "revenantspawn"},/turf/simulated/floor,/area/medical/morgue) -"bzs" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/sortjunction{dir = 2; icon_state = "pipe-j2s"; sortType = 12},/turf/simulated/floor/plating,/area/maintenance/asmaint) +"bzs" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/disposalpipe/segment,/turf/simulated/floor{icon_state = "white"},/area/medical/ward) "bzt" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/wall/r_wall,/area/assembly/chargebay) "bzu" = (/obj/machinery/light{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor/bluegrid,/area/assembly/chargebay) "bzv" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/bluegrid,/area/assembly/chargebay) @@ -4213,7 +4213,7 @@ "bDa" = (/obj/machinery/light_switch{name = "light switch "; dir = 2; pixel_x = 0; pixel_y = -22},/turf/simulated/floor{dir = 0; icon_state = "blue"},/area/medical/morgue) "bDb" = (/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor{dir = 0; icon_state = "blue"},/area/medical/morgue) "bDc" = (/turf/simulated/floor{dir = 0; icon_state = "blue"},/area/medical/morgue) -"bDd" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/sortjunction{dir = 2; icon_state = "pipe-j2s"; sortType = 13},/turf/simulated/floor/plating,/area/maintenance/asmaint) +"bDd" = (/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Biohazard_medi"; name = "Quarantine Lockdown"; opacity = 0},/obj/machinery/door/airlock/maintenance{req_access_txt = "9"},/turf/simulated/floor{icon_state = "white"},/area/storage/emergency) "bDe" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/wall/r_wall,/area/assembly/chargebay) "bDf" = (/obj/machinery/camera{c_tag = "Research Mech Bay"; dir = 4; network = list("Research","SS13")},/obj/item/device/radio/intercom{dir = 8; name = "station intercom (General)"; pixel_x = -28},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor,/area/assembly/chargebay) "bDg" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor,/area/assembly/chargebay) @@ -4302,7 +4302,7 @@ "bEL" = (/obj/structure/disposalpipe/segment,/obj/machinery/door/airlock/medical{name = "Morgue"; req_access_txt = "0"; req_one_access_txt = "6,9"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor{icon_state = "white"},/area/medical/morgue) "bEM" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/wall,/area/medical/morgue) "bEN" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/wall,/area/medical/morgue) -"bEO" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/maintenance/asmaint) +"bEO" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor{icon_state = "white"},/area/medical/research_shuttle_dock) "bEP" = (/obj/machinery/mech_bay_recharge_port,/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor/plating,/area/assembly/chargebay) "bEQ" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor,/area/assembly/chargebay) "bER" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 8},/turf/simulated/floor,/area/assembly/robotics) @@ -4389,10 +4389,10 @@ "bGu" = (/obj/machinery/light{tag = "icon-tube1 (NORTH)"; icon_state = "tube1"; dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/medbay2) "bGv" = (/turf/simulated/floor{tag = "icon-whiteblue (NORTHEAST)"; icon_state = "whiteblue"; dir = 5},/area/medical/medbay2) "bGw" = (/turf/simulated/wall/r_wall,/area/medical/medbay2) -"bGx" = (/obj/machinery/power/apc{dir = 1; name = "Starboard Emergency Storage APC"; pixel_y = 24},/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor/plating,/area/maintenance/asmaint) +"bGx" = (/turf/simulated/wall/r_wall,/area/medical/research_shuttle_dock) "bGy" = (/turf/simulated/floor/plating,/area/maintenance/asmaint) -"bGz" = (/obj/machinery/light/small{dir = 1},/obj/structure/disposalpipe/sortjunction{dir = 2; icon_state = "pipe-j2s"; sortType = 14},/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/asmaint) -"bGA" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/maintenance/asmaint) +"bGz" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/firedoor{dir = 2},/turf/simulated/floor/plating,/area/medical/research_shuttle_dock) +"bGA" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor{icon_state = "white"},/area/medical/research_shuttle_dock) "bGB" = (/obj/structure/extinguisher_cabinet{pixel_x = -27},/obj/machinery/light{dir = 8},/turf/simulated/floor/bluegrid,/area/assembly/chargebay) "bGC" = (/turf/simulated/floor/bluegrid,/area/assembly/chargebay) "bGD" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/bluegrid,/area/assembly/chargebay) @@ -4469,12 +4469,12 @@ "bHW" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/disposalpipe/junction{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay2) "bHX" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{level = 1},/obj/structure/disposalpipe/junction{dir = 8; icon_state = "pipe-j2"; tag = "icon-pipe-j1 (WEST)"},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay2) "bHY" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{dir = 4; icon_state = "whiteblue"; tag = "icon-whitehall (WEST)"},/area/medical/medbay2) -"bHZ" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Biohazard_medi"; name = "Quarantine Lockdown"; opacity = 0},/obj/machinery/door/airlock/maintenance{req_access_txt = "5"},/turf/simulated/floor,/area/maintenance/asmaint) -"bIa" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/asmaint) -"bIb" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/maintenance/asmaint) -"bIc" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/maintenance/asmaint) -"bId" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/maintenance/asmaint) -"bIe" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Biohazard"; name = "Biohazard Shutter"; opacity = 0},/obj/machinery/door/airlock/maintenance{req_access_txt = "29"},/turf/simulated/floor,/area/maintenance/asmaint) +"bHZ" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor{dir = 4; icon_state = "whitebluecorner"},/area/medical/research_shuttle_dock) +"bIa" = (/obj/machinery/door/airlock/external{id_tag = "science_home"; name = "Shuttle Airlock"; req_access_txt = "65"},/turf/simulated/floor/plating,/area/medical/research_shuttle_dock) +"bIb" = (/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor/plating,/area/storage/emergency) +"bIc" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/effect/spawner/lootdrop/maintenance{lootcount = 2; name = "2maintenance loot spawner"},/turf/simulated/floor/plating,/area/storage/emergency) +"bId" = (/obj/machinery/portable_atmospherics/canister/air,/turf/simulated/floor/plating,/area/storage/emergency) +"bIe" = (/turf/simulated/floor/plating,/area/storage/emergency) "bIf" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor,/area/assembly/chargebay) "bIg" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor,/area/assembly/chargebay) "bIh" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor,/area/assembly/chargebay) @@ -4493,7 +4493,7 @@ "bIu" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/toxins/lab) "bIv" = (/obj/machinery/door/firedoor{dir = 1; name = "hazard door north"},/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/airlock/glass_research{name = "Research and Development"; req_access_txt = "47"},/turf/simulated/floor{icon_state = "white"},/area/toxins/lab) "bIw" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/turf/simulated/floor/plating,/area/maintenance/asmaint2) -"bIx" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating/airless,/area/medical/research{name = "Research Division"}) +"bIx" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/turf/simulated/floor{dir = 4; icon_state = "whitebluecorner"},/area/medical/research_shuttle_dock) "bIy" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/shuttle/engine/heater{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/turf/simulated/floor/plating/airless,/area/shuttle/research) "bIz" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 0; pixel_y = 32},/obj/effect/decal/warning_stripes/northeastsouth,/turf/simulated/floor,/area/hallway/secondary/exit) "bIA" = (/turf/simulated/floor/plating,/area/quartermaster/storage) @@ -4553,9 +4553,9 @@ "bJC" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor{tag = "icon-whiteblue"; icon_state = "whiteblue"},/area/medical/medbay2) "bJD" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor{dir = 2; icon_state = "whiteblue"; tag = "icon-whitehall (WEST)"},/area/medical/medbay2) "bJE" = (/obj/machinery/vending/medical,/turf/simulated/floor{dir = 6; icon_state = "whiteblue"; tag = "icon-whitehall (WEST)"},/area/medical/medbay2) -"bJF" = (/obj/machinery/portable_atmospherics/canister/air,/turf/simulated/floor/plating,/area/maintenance/asmaint) +"bJF" = (/turf/simulated/floor{dir = 4; icon_state = "whitebluecorner"},/area/medical/research_shuttle_dock) "bJG" = (/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor/plating,/area/maintenance/asmaint) -"bJH" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/effect/spawner/lootdrop/maintenance{lootcount = 2; name = "2maintenance loot spawner"},/turf/simulated/floor/plating,/area/maintenance/asmaint) +"bJH" = (/obj/structure/closet/emcloset,/obj/item/clothing/mask/breath,/obj/item/clothing/mask/breath,/obj/item/weapon/tank/emergency_oxygen,/obj/item/weapon/tank/emergency_oxygen,/turf/simulated/floor{dir = 4; icon_state = "whitebluecorner"},/area/medical/research_shuttle_dock) "bJI" = (/obj/structure/table,/obj/item/weapon/crowbar/large,/turf/simulated/floor,/area/assembly/chargebay) "bJJ" = (/obj/structure/table,/obj/item/weapon/storage/toolbox/mechanical,/turf/simulated/floor,/area/assembly/chargebay) "bJK" = (/obj/structure/reagent_dispensers/fueltank,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor,/area/assembly/chargebay) @@ -4580,10 +4580,10 @@ "bKd" = (/obj/machinery/light/small{dir = 1},/obj/machinery/camera{c_tag = "Research Shuttle Maintenance"; dir = 2; network = list("Research","SS13")},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{dir = 4; icon_state = "whitepurplecorner"},/area/medical/research{name = "Research Division"}) "bKe" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/firedoor,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Biohazard"; name = "Biohazard Shutter"; opacity = 0},/obj/machinery/door/airlock/glass_research{name = "Research Shuttle Dock"; req_access_txt = "65"},/turf/simulated/floor{dir = 4; icon_state = "whitepurplecorner"},/area/medical/research_shuttle_dock) "bKf" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{dir = 4; icon_state = "whitebluecorner"},/area/medical/research_shuttle_dock) -"bKg" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/turf/simulated/floor{dir = 4; icon_state = "whitebluecorner"},/area/medical/research{name = "Research Division"}) -"bKh" = (/turf/simulated/floor{dir = 4; icon_state = "whitebluecorner"},/area/medical/research{name = "Research Division"}) -"bKi" = (/obj/structure/closet/emcloset,/obj/item/clothing/mask/breath,/obj/item/clothing/mask/breath,/obj/item/weapon/tank/emergency_oxygen,/obj/item/weapon/tank/emergency_oxygen,/turf/simulated/floor{dir = 4; icon_state = "whitebluecorner"},/area/medical/research{name = "Research Division"}) -"bKj" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/firedoor{dir = 2},/turf/simulated/shuttle/plating,/area/medical/research{name = "Research Division"}) +"bKg" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/firedoor{dir = 2},/turf/simulated/shuttle/plating,/area/medical/research_shuttle_dock) +"bKh" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Biohazard_medi"; name = "Quarantine Lockdown"; opacity = 0},/obj/machinery/door/airlock/maintenance{req_access_txt = "5"},/turf/simulated/floor,/area/storage/emergency) +"bKi" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plating,/area/storage/emergency) +"bKj" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/storage/emergency) "bKk" = (/obj/machinery/computer/shuttle/science,/turf/simulated/shuttle/floor,/area/shuttle/research) "bKl" = (/turf/space,/turf/simulated/shuttle/wall{icon_state = "swall_f5"; dir = 2},/area/shuttle/research) "bKm" = (/obj/machinery/door/firedoor{dir = 2},/obj/machinery/door/airlock/external{id_tag = "supply_home"; name = "Cargo Docking Hatch"; req_access_txt = "31"},/turf/simulated/floor/plating,/area/quartermaster/storage) @@ -4634,7 +4634,7 @@ "bLf" = (/obj/structure/disposalpipe/segment,/turf/simulated/wall,/area/medical/genetics_cloning) "bLg" = (/turf/simulated/wall,/area/medical/genetics) "bLh" = (/turf/simulated/wall/r_wall,/area/medical/genetics) -"bLi" = (/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Biohazard_medi"; name = "Quarantine Lockdown"; opacity = 0},/obj/machinery/door/airlock/maintenance{req_access_txt = "9"},/turf/simulated/floor{icon_state = "white"},/area/maintenance/asmaint) +"bLi" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/storage/emergency) "bLj" = (/turf/simulated/wall,/area/assembly/chargebay) "bLk" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/wall,/area/assembly/chargebay) "bLl" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/assembly/robotics) @@ -4653,9 +4653,9 @@ "bLy" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{dir = 2; icon_state = "whitepurplecorner"},/area/medical/research{name = "Research Division"}) "bLz" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/door/firedoor,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Biohazard"; name = "Biohazard Shutter"; opacity = 0},/obj/machinery/door/airlock/glass_research{name = "Research Shuttle Dock"; req_access_txt = "65"},/turf/simulated/floor{icon_state = "white"},/area/medical/research_shuttle_dock) "bLA" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/medical/research_shuttle_dock) -"bLB" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor{icon_state = "white"},/area/medical/research{name = "Research Division"}) -"bLC" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor{dir = 4; icon_state = "whitebluecorner"},/area/medical/research{name = "Research Division"}) -"bLD" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/firedoor{dir = 2},/turf/simulated/floor/plating,/area/medical/research{name = "Research Division"}) +"bLB" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/storage/emergency) +"bLC" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Biohazard"; name = "Biohazard Shutter"; opacity = 0},/obj/machinery/door/airlock/maintenance{req_access_txt = "29"},/turf/simulated/floor,/area/storage/emergency) +"bLD" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating/airless,/area/medical/research_shuttle_dock) "bLE" = (/turf/space,/turf/simulated/shuttle/wall{icon_state = "swall_f9"; dir = 2},/area/shuttle/research) "bLF" = (/obj/machinery/door/airlock/external{id_tag = "s_docking_airlock"; name = "Shuttle Hatch"; req_access_txt = "31"},/turf/simulated/shuttle/floor,/area/shuttle/supply) "bLG" = (/obj/machinery/conveyor_switch/oneway{convdir = -1; id = "QMLoad"},/turf/simulated/floor,/area/quartermaster/storage) @@ -4732,13 +4732,13 @@ "bMZ" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/crew_quarters/hor) "bNa" = (/turf/simulated/wall/r_wall,/area/crew_quarters/hor) "bNb" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/wall/r_wall,/area/crew_quarters/hor) -"bNc" = (/obj/machinery/light{dir = 8},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = -32; pixel_y = 0},/turf/simulated/floor{icon_state = "white"},/area/medical/research{name = "Research Division"}) -"bNd" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor{dir = 4; icon_state = "whitebluecorner"},/area/medical/research{name = "Research Division"}) -"bNe" = (/obj/machinery/camera{c_tag = "Research Shuttle Dock"; dir = 2; network = list("SS13","Research")},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor{dir = 2; icon_state = "cmo"},/area/medical/research{name = "Research Division"}) -"bNf" = (/turf/simulated/floor{dir = 2; icon_state = "cmo"},/area/medical/research{name = "Research Division"}) -"bNg" = (/turf/simulated/floor{dir = 9; icon_state = "warning"},/area/medical/research{name = "Research Division"}) +"bNc" = (/obj/machinery/light/small{dir = 1},/obj/structure/disposalpipe/sortjunction{dir = 2; icon_state = "pipe-j2s"; sortType = 14},/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/storage/emergency) +"bNd" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/storage/emergency) +"bNe" = (/obj/machinery/power/apc{dir = 1; name = "Starboard Emergency Storage APC"; pixel_y = 24},/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor/plating,/area/storage/emergency) +"bNf" = (/obj/item/device/radio/intercom{name = "station intercom (General)"; pixel_y = -28},/turf/simulated/floor{icon_state = "white"},/area/medical/research_shuttle_dock) +"bNg" = (/obj/machinery/computer/shuttle/science,/turf/simulated/floor{dir = 4; icon_state = "whitebluecorner"},/area/medical/research_shuttle_dock) "bNh" = (/obj/machinery/door/airlock/external{id_tag = "s_docking_airlock"; name = "External Hatch"; req_access_txt = "65"},/obj/docking_port/mobile{dwidth = 3; height = 5; id = "science"; name = "research shuttle"; width = 7},/obj/docking_port/stationary{dwidth = 3; height = 5; id = "science_home"; name = "research dock"; width = 7},/turf/simulated/shuttle/floor,/area/shuttle/research) -"bNi" = (/turf/simulated/floor{dir = 5; icon_state = "warning"},/area/medical/research{name = "Research Division"}) +"bNi" = (/obj/machinery/light/small{dir = 4},/turf/simulated/floor{dir = 6; icon_state = "warning"},/area/medical/research_shuttle_dock) "bNj" = (/obj/machinery/light/small,/turf/simulated/floor/plating,/area/hallway/secondary/exit) "bNk" = (/obj/machinery/conveyor{dir = 4; id = "QMLoad2"},/obj/machinery/door/poddoor{id_tag = "QMLoaddoor2"; name = "supply dock loading door"},/turf/simulated/floor/plating,/area/quartermaster/storage) "bNl" = (/obj/machinery/conveyor{dir = 4; id = "QMLoad"},/obj/machinery/status_display/supply_display{pixel_y = -32},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/quartermaster/storage) @@ -4822,11 +4822,11 @@ "bOL" = (/obj/machinery/ai_status_display{pixel_y = 32},/turf/simulated/floor{dir = 4; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTH)"},/area/crew_quarters/hor) "bOM" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/asmaint2) "bON" = (/obj/effect/spawner/window/reinforced,/turf/simulated/shuttle/plating,/area/maintenance/asmaint2) -"bOO" = (/obj/machinery/power/apc{dir = 2; name = "Research Shuttle Dock APC"; pixel_y = -24},/obj/structure/cable,/turf/simulated/floor{dir = 2; icon_state = "cmo"},/area/medical/research{name = "Research Division"}) -"bOP" = (/turf/simulated/floor{dir = 10; icon_state = "warning"},/area/medical/research{name = "Research Division"}) -"bOQ" = (/obj/machinery/light/small{dir = 4},/turf/simulated/floor{dir = 6; icon_state = "warning"},/area/medical/research{name = "Research Division"}) -"bOR" = (/obj/machinery/computer/shuttle/science,/turf/simulated/floor{dir = 4; icon_state = "whitebluecorner"},/area/medical/research{name = "Research Division"}) -"bOS" = (/obj/item/device/radio/intercom{name = "station intercom (General)"; pixel_y = -28},/turf/simulated/floor{icon_state = "white"},/area/medical/research{name = "Research Division"}) +"bOO" = (/turf/simulated/floor{dir = 10; icon_state = "warning"},/area/medical/research_shuttle_dock) +"bOP" = (/obj/machinery/power/apc{dir = 2; name = "Research Shuttle Dock APC"; pixel_y = -24},/obj/structure/cable,/turf/simulated/floor{dir = 2; icon_state = "cmo"},/area/medical/research_shuttle_dock) +"bOQ" = (/turf/simulated/floor{dir = 2; icon_state = "cmo"},/area/medical/research_shuttle_dock) +"bOR" = (/turf/simulated/floor{icon_state = "white"},/area/medical/research_shuttle_dock) +"bOS" = (/obj/machinery/door/airlock/external{id_tag = "science_home"; name = "Shuttle Airlock"; req_access_txt = "65"},/turf/simulated/floor{icon_state = "white"},/area/medical/research_shuttle_dock) "bOT" = (/turf/simulated/shuttle/wall{icon_state = "swall12"; dir = 2},/area/shuttle/mining) "bOU" = (/turf/space,/turf/simulated/shuttle/wall{icon_state = "swall_f6"; dir = 2},/area/shuttle/mining) "bOV" = (/turf/simulated/wall,/area/quartermaster/miningdock) @@ -5127,7 +5127,7 @@ "bUE" = (/turf/simulated/shuttle/floor,/area/shuttle/mining) "bUF" = (/obj/structure/stool/bed/chair{dir = 1},/turf/simulated/shuttle/floor,/area/shuttle/mining) "bUG" = (/obj/machinery/light/small{dir = 8},/turf/simulated/shuttle/floor,/area/shuttle/mining) -"bUH" = (/obj/machinery/door/airlock/external{id_tag = "science_home"; name = "Shuttle Airlock"; req_access_txt = "65"},/turf/simulated/floor/plating,/area/medical/research{name = "Research Division"}) +"bUH" = (/turf/simulated/floor{dir = 9; icon_state = "warning"},/area/medical/research_shuttle_dock) "bUI" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/firedoor{dir = 2},/turf/simulated/floor/plating,/area/quartermaster/miningdock) "bUJ" = (/obj/machinery/computer/shuttle/mining,/turf/simulated/floor{dir = 9; icon_state = "brown"},/area/quartermaster/miningdock) "bUK" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/turf/simulated/floor,/area/quartermaster/miningdock) @@ -5305,7 +5305,7 @@ "bYa" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/airless,/area/toxins/test_area) "bYb" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/shuttle/engine/heater,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating/airless,/area/shuttle/mining) "bYc" = (/turf/space,/turf/simulated/shuttle/wall{icon_state = "swall_f5"; dir = 2},/area/shuttle/mining) -"bYd" = (/obj/machinery/door/airlock/external{id_tag = "science_home"; name = "Shuttle Airlock"; req_access_txt = "65"},/turf/simulated/floor{icon_state = "white"},/area/medical/research{name = "Research Division"}) +"bYd" = (/turf/simulated/floor{dir = 5; icon_state = "warning"},/area/medical/research_shuttle_dock) "bYe" = (/obj/machinery/camera{c_tag = "Mining Dock External"; dir = 8},/obj/structure/closet/emcloset,/turf/simulated/floor{icon_state = "warning"},/area/quartermaster/miningdock) "bYf" = (/obj/item/weapon/ore/silver,/obj/item/weapon/ore/silver,/obj/structure/closet/crate,/turf/simulated/floor{dir = 10; icon_state = "warning"},/area/quartermaster/miningdock) "bYg" = (/obj/structure/shuttle/engine/propulsion/burst,/turf/space,/area/shuttle/mining) @@ -6084,11 +6084,11 @@ "cmZ" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/medical/ward) "cna" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor{icon_state = "white"},/area/medical/ward) "cnb" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor{icon_state = "white"},/area/medical/ward) -"cnc" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment,/turf/simulated/floor{icon_state = "white"},/area/medical/ward) -"cnd" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/turf/simulated/floor{icon_state = "white"},/area/medical/ward) -"cne" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/medical/ward) -"cnf" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor{icon_state = "white"},/area/medical/ward) -"cng" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor{icon_state = "white"},/area/medical/ward) +"cnc" = (/obj/machinery/light{dir = 8},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = -32; pixel_y = 0},/turf/simulated/floor{icon_state = "white"},/area/medical/research_shuttle_dock) +"cnd" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor{dir = 4; icon_state = "whitebluecorner"},/area/medical/research_shuttle_dock) +"cne" = (/obj/machinery/camera{c_tag = "Research Shuttle Dock"; dir = 2; network = list("SS13","Research")},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor{dir = 2; icon_state = "cmo"},/area/medical/research_shuttle_dock) +"cnf" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/storage/emergency) +"cng" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc{dir = 1; name = "Science Maintenance APC"; pixel_y = 24},/turf/simulated/floor/plating,/area/maintenance/asmaint2) "cnh" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/medical,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{icon_state = "white"},/area/medical/ward) "cni" = (/obj/machinery/hologram/holopad,/turf/simulated/floor{tag = "icon-whiteblue (SOUTHEAST)"; icon_state = "whiteblue"; dir = 6},/area/medical/medbay2) "cnj" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/sign/nosmoking_2,/turf/simulated/wall/r_wall,/area/medical/biostorage) @@ -6223,7 +6223,7 @@ "cpI" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor/shutters{density = 0; dir = 2; icon_state = "shutter0"; id_tag = "surgeryobs1"; name = "Privacy Shutters"; opacity = 0},/turf/simulated/floor/plating,/area/medical/surgery) "cpJ" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor/shutters{density = 0; dir = 2; icon_state = "shutter0"; id_tag = "surgeryobs2"; name = "Privacy Shutters"; opacity = 0},/turf/simulated/floor/plating,/area/medical/surgery) "cpK" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/medical{name = "Operating Theatre"; req_access_txt = "45"},/obj/machinery/holosign/surgery{id = "surgery2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{icon_state = "white"},/area/medical/surgery) -"cpL" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/wall,/area/medical/surgery) +"cpL" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment,/obj/effect/landmark/start{name = "Civilian"},/turf/simulated/floor/plating,/area/storage/emergency) "cpM" = (/turf/simulated/wall/r_wall,/area/medical/surgery) "cpN" = (/turf/simulated/floor,/area/medical/biostorage) "cpO" = (/obj/structure/closet/l3closet,/obj/item/clothing/mask/gas,/turf/simulated/floor{icon_state = "blue"; dir = 10},/area/medical/biostorage) @@ -6278,7 +6278,7 @@ "cqL" = (/obj/machinery/bodyscanner,/turf/simulated/floor{icon_state = "white"},/area/medical/surgery) "cqM" = (/obj/machinery/body_scanconsole,/turf/simulated/floor{icon_state = "white"},/area/medical/surgery) "cqN" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{icon_state = "white"},/area/medical/surgery) -"cqO" = (/obj/structure/table,/obj/item/weapon/reagent_containers/blood/AMinus,/obj/item/weapon/reagent_containers/blood/APlus,/obj/item/weapon/reagent_containers/blood/BMinus,/obj/item/weapon/reagent_containers/blood/BPlus,/obj/item/weapon/reagent_containers/blood/OPlus,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/alarm{pixel_y = 23},/obj/item/weapon/reagent_containers/blood/OMinus,/obj/machinery/camera{c_tag = "Medbay Surgery 2 North"; network = list("SS13")},/turf/simulated/floor{icon_state = "white"},/area/medical/surgery) +"cqO" = (/obj/machinery/door/airlock{name = "Starboard Emergency Storage"; req_access_txt = "0"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/storage/emergency) "cqP" = (/obj/structure/table,/obj/item/weapon/storage/box/gloves,/obj/item/weapon/storage/box/masks,/obj/item/weapon/reagent_containers/spray/cleaner{desc = "Someone has crossed out the Space from Space Cleaner and written in Surgery. 'Do not remove under punishment of death!!!' is scrawled on the back."; name = "Surgery Cleaner"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/light_switch{pixel_x = 5; pixel_y = 27},/obj/machinery/holosign_switch{id = "surgery2"; pixel_x = -5; pixel_y = 27},/turf/simulated/floor{icon_state = "white"},/area/medical/surgery) "cqQ" = (/obj/machinery/light{dir = 8},/obj/structure/closet/wardrobe/pjs,/turf/simulated/floor{dir = 8; icon_state = "whitered"},/area/medical/medbay2) "cqR" = (/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/floor/plating,/area/maintenance/asmaint2) @@ -6563,7 +6563,7 @@ "cwk" = (/obj/structure/table,/obj/item/weapon/hemostat,/obj/item/weapon/scalpel,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{icon_state = "white"},/area/medical/surgery) "cwl" = (/obj/structure/table,/obj/item/weapon/hemostat,/obj/item/weapon/scalpel,/turf/simulated/floor{icon_state = "white"},/area/medical/surgery) "cwm" = (/obj/structure/table,/obj/item/weapon/surgicaldrill,/obj/item/stack/medical/advanced/bruise_pack,/obj/machinery/camera{c_tag = "Medbay Surgery 2 South"; dir = 1; network = list("SS13"); pixel_x = 0},/turf/simulated/floor{icon_state = "white"},/area/medical/surgery) -"cwn" = (/obj/machinery/power/apc{dir = 2; name = "Surgery APC"; pixel_y = -24},/obj/structure/cable,/turf/simulated/floor{icon_state = "white"},/area/medical/surgery) +"cwn" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/storage/emergency) "cwo" = (/obj/structure/closet/secure_closet/medical2,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{icon_state = "white"},/area/medical/surgery) "cwp" = (/turf/space,/area/maintenance/asmaint) "cwq" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor,/area/hallway/primary/aft) @@ -8074,8 +8074,8 @@ "cZn" = (/obj/structure/rack,/obj/effect/spawner/lootdrop/maintenance{lootcount = 2; name = "2maintenance loot spawner"},/obj/item/latexballon,/turf/simulated/floor/plating,/area/maintenance/asmaint) "cZo" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/maintenance/asmaint2) "cZp" = (/obj/structure/grille,/obj/structure/window/reinforced/tinted{dir = 8; icon_state = "twindow"; tag = ""},/obj/structure/window/reinforced/tinted{dir = 1},/obj/structure/window/reinforced/tinted{dir = 4; icon_state = "twindow"; tag = ""},/obj/structure/window/reinforced/tinted,/turf/simulated/floor/plating,/area/maintenance/asmaint2) -"cZq" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/asmaint2) -"cZr" = (/obj/machinery/camera{c_tag = "Aft Starboard Solar Access"; dir = 1},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24},/turf/simulated/floor/plating,/area/maintenance/asmaint2) +"cZq" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/sortjunction{dir = 2; icon_state = "pipe-j2s"; sortType = 13},/turf/simulated/floor/plating,/area/storage/emergency) +"cZr" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/sortjunction{dir = 2; icon_state = "pipe-j2s"; sortType = 12},/turf/simulated/floor/plating,/area/storage/emergency) "cZs" = (/obj/structure/table,/obj/item/weapon/paper_bin{pixel_x = -2; pixel_y = 5},/obj/item/weapon/pen,/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/turbine) "cZt" = (/obj/machinery/atmospherics/binary/valve,/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/turbine) "cZu" = (/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/turbine) @@ -8325,7 +8325,7 @@ "dee" = (/obj/structure/stool/bed/roller,/obj/machinery/vending/wallmed1{layer = 3.3; name = "Emergency NanoMed"; pixel_x = 28; pixel_y = 0; req_access_txt = "0"},/obj/machinery/light/spot{tag = "icon-tube1 (EAST)"; icon_state = "tube1"; dir = 4},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape) "def" = (/obj/machinery/status_display{pixel_x = -30; pixel_y = 0},/obj/machinery/light/spot{tag = "icon-tube1 (WEST)"; icon_state = "tube1"; dir = 8},/turf/simulated/shuttle/floor4,/area/shuttle/escape) "deg" = (/obj/item/device/radio/intercom{dir = 4; name = "station intercom (General)"; pixel_x = 28},/turf/simulated/shuttle/floor4,/area/shuttle/escape) -"deh" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc{dir = 1; name = "Starboard Emergency Storage APC"; pixel_y = 24},/turf/simulated/floor/plating,/area/maintenance/asmaint2) +"deh" = (/obj/structure/table,/obj/item/weapon/reagent_containers/blood/AMinus,/obj/item/weapon/reagent_containers/blood/APlus,/obj/item/weapon/reagent_containers/blood/BMinus,/obj/item/weapon/reagent_containers/blood/BPlus,/obj/item/weapon/reagent_containers/blood/OPlus,/obj/machinery/alarm{pixel_y = 23},/obj/item/weapon/reagent_containers/blood/OMinus,/obj/machinery/camera{c_tag = "Medbay Surgery 2 North"; network = list("SS13")},/turf/simulated/floor{icon_state = "white"},/area/medical/surgery) "dei" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plating,/area/maintenance/asmaint2) "dej" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/regular{pixel_x = 2; pixel_y = 6},/obj/item/weapon/storage/firstaid/regular{pixel_x = -2; pixel_y = 4},/obj/item/bodybag/cryobag{pixel_x = 5},/obj/item/device/radio/intercom{dir = 4; name = "station intercom (General)"; pixel_x = 28},/obj/item/weapon/storage/firstaid/o2{layer = 2.8; pixel_x = 4; pixel_y = 6},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape) "dek" = (/obj/structure/stool/bed/chair{dir = 1},/turf/simulated/shuttle/floor4,/area/shuttle/escape) @@ -8713,6 +8713,8 @@ "dlC" = (/obj/structure/grille,/obj/structure/window/full/shuttle,/turf/space,/area/shuttle/constructionsite) "dlD" = (/obj/docking_port/mobile/pod{dir = 4; id = "pod4"; name = "escape pod 4"},/obj/machinery/door/airlock/shuttle{id_tag = "s_docking_airlock"; name = "Escape Pod Hatch"},/turf/simulated/shuttle/floor,/area/shuttle/pod_4) "dlE" = (/obj/structure/table,/obj/structure/bedsheetbin{pixel_x = -1; pixel_y = 2},/turf/simulated/floor{dir = 8; icon_state = "barber"},/area/crew_quarters/locker) +"dlF" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/medical/surgery) +"dlG" = (/obj/machinery/camera{c_tag = "Aft Starboard Solar Access"; dir = 1},/turf/simulated/floor/plating,/area/maintenance/asmaint2) (1,1,1) = {" bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik @@ -8843,21 +8845,21 @@ bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbi bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaLyaCuaKzaKzaKzaDEaDEaDEaDEaDEaDEbtobpubgNbgNbgNbgNbgNbgNbpvbgNbgNbgNbejbejbpxblCbpybpzbosbpAblCdlEbpCbpBbcobnbbncbndbecbcobejbnfbngbpDbpEbpFboAbpFbngboCbpGbpHbpIbqtbpKbpLbnmbpMbpNboIbpObpPbpQbpRbpSbpSbpRbpTbpUbmgbpVbnvbnvbpWbpXboTboSbnvbpYbmkbpZbqabqbbqcbqdbqebqbbqfbnAbqgbqhbqibqjbqkbqlbqmbqnbqnbqnbqnbqnbqnbqobqpbqqbqrbqnbqsbqnbqnbqnbqnbqnbqnbqnbqndcZbqubqvbqvbqvbqvbqvbqvbqwbqlbqxbqybqybqzbqAbqBbqAbqCbqAbqDbqEbqFbqAbqGbqHbqIbqJbqKbqKbqKbqKbqKbqKbqKbqLbqMbqNbqNbqNbqNbqObqNbqPbKnddHbPfddIbiibPfdlbbmKbmKbmKbmKddKbmKddKbmKbmKbmKddGbdBbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbtpbtqbtqbtqbtqbwpbwpbtqbtqbxZbikaabaInaLAaJtbzPbzObzRbzQbzQbzQbzQbzSbzUbzTbcsbdVbBFbrhblCblCblCbribotblCbcobcobcobcobnbbrjbrkbrlbcobrmbrnbngbrobrpboAbpFbrqbngboCbrrbpHbpIbpIbrsbrtbnmbrubpNboIbpObrvbrwbrxbrybrzbrAbpTbrBbmgbrCbpWbnvbrDbrEbrDbnvbpWbrFbnzbrGbqbbqbbqcbrHbqebqbbrIbnAbrJbqibqibqjbqkbqlbqnbqnbqnbqnbqnbqnbqnbrKbqnbqnbqnbqnbqnbqnbrLbrMbrMbrMbrMbrMbrMbrMbrMbrMbrMbrMbrMbrMbrMbrNbrObrPbqKbqKbrQbmFbmFbmFbmFbmFbmGbmFbmFbmFbmFbmFbmFbmFbmFbmFbmFbmFbmFbrRbmFbrSbrTbatbatbatbatbatbatbatddLbaAbgKbaAbaAbaAbqUddMddOddNbdBddPbdBddPbdBddQddMddObqUbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbBGbDCbBHdjhbDDdjidjidjkdjjbtqbxZbjNaInaInaKBbrWbrXbrYbrXbrXbrXbrXbrZbsabsbbcsbcsbscbsdblCbmUbsebsfbpAblCbsgbshbsgbcobcobcobcobsibcobsjbskbngbslbsmbpFbsnbsobngboCbnmbspbpIbpIbpIbsqbnmbsrbpNboIbpObssbrwbrxbstbsubrAbpTbsvbmgbswbsxbnvbsybszbsAboSbsBbsCbsDbsEbsFbsGbsHbsIbsJbqbbsKbnAbsLbsMbqibqjbqkbqlbqnbsNbqnbqnbqnbqnbsObsPbsPbsPbsPbsQbqnbqnbqnbqnbsRbqnbsNbsSbqnbsTbsUbsVbqnbsWbsXbsXbsYbsZbtabtbbmFbmFbmFbmFbmFbmFbmFbtcbtdbmFbmFbmFbmFbmFbmFbmFbmFbmFbmFbmFbtebtfbtfbtgddSddRddUddTddTddTddTddVddWbaAaabbikbikaabbqUddXddZddYdeabqUbikbqUdecdebdecdecbqUbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbBGbDCdjldjidjidjidjidjidjidjideHdjnaGddjnaJrbtrbrXbtsbttbtubtvbtwbrZbtxbtybtzbtzbtAbtBblCblCblCbosbtCborbcsbcsbcsbcsbtDbejbejbskbejbsjbskbngbtEbtFbtGbtHboAbngbtIbnmbtJbpIbpIbpIbtKbtLbtMbpNbtNbnqbtObtPbpRbpRbpRbpRbpTbtQbmgbtRbtSbmgbmgbmgbmgbmgbmgbmgbnzbnAbtTbtUbtVbtWbtXbtYbtZbnAbvubuabuabucbucbucbucbucbucbucbudbudbuebufbugbugbufbuebudbudbuhbuhbuhbuhbuhbuhbuibuibujbuibuibuibuibuibukbulbumbunbmFbmFbuobuobupbupbupbupbupbuqbtfbtfbtebtfbmFbtfbtfbtfbtfburbusbusbusbusdedbuubuubuubuubuubuubuubuubuubikbikbikbikbdBddYddYddYdeebqUbikbqUdefdebdebdegbqUbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbBGbDCdjodjpdjpdjidjpdjpdjpbtqdjqaInaInaInaKBbuvbrXbuwbuxbuxbuxbuybrZbejbuzbuAbuBbuCbuDblCbmUbuEbosbuFborbuGbuHbuIbuJbuKbuLbuLbuMbuLbuNbuObngbuPbuQbuRbuSbuTbuUbuVbnmbuWbpIbpIbuXbuYbuZbtMbpNbvabnqbvbbvcbvdbvebvfbvgbvhbnqbnqbvibvjbvkbvlbvmbvlbvnbvjbikbvobnAbvpbvqbvrbvsbtXbqbbvtbnAbxebvwbxfbucbvxbvybvzbvAbvBbvCbvDbvEbvFbvGbvHbvHbvGbvIbvJbvKbuhbvLbvMbvNbvObuhbvPbvQbvRbvSbvTbvUbvUbvVbukbvWbvXbvYbvZbvYbwabwabupbwbbwcbwdbupbwebwfbwebupbwgbtfburbusbwhbwibwhbusbwjbwkbusdeidehbxXbwobikbikbikbikbikbikbikbikbikbikbqUddXddZddYdejbqUbikbqUdekdekdekdekbqUbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdjrbtqbtqbtqbtqbtqbtqbtqbtqdjqbikbikaInbwqbdFbwrbrXbwsbrXbwtbuxbwubwvbrZbwwbwxbwybwzbuDblCblCblCblCblCblCbwAbwBbwCbwDbwEbngbngbngbngbngbngbngbwFbngbngbngbwGbngbwHbwIbwJbpIbpIbpIbwKbtLbwLbpNbwMbnqbwNbvcbnrbnrbnrbnqbwObnqbwPbwQbwRbwSbwTbwUbwVbwWbwXbwYbwZbnAbxabqbbxbbxcbtXbxdbqbbnAbzbbxgbANbucbxhbxibxjbxkbxlbxmbxnbvHbvHbvHbvHbvHbvHbvHbvHbxobxpbxqbxrbxsbxtbuhbxubxvbxwbxxbxybxzbxvbxAbukbxBbvXbxCbxDbxEbxFbxFbxGbxHbxIbxJbxKbxLbxMbxNbupbxObxPbxQbusbxRbxSbxTbxUbxUbxVbusbxWbxXbxYbwobikbikbikbikbikbikbikbikbikbikbDybtldemdemdemdenbikdeodepdepdepbtlbDzbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaLyaCuaKzaKzaInaInaInaInaInaInaInaKBaJrbyabrXbybbycbydbyebyebyfbygbyhbyibyibyjbykbtzbtzbtzbtzbtzbtzbylbymbymbynbyobngbypbyqbyrbysbytbyubyvbywbngbyxbyybyzbuVbtLbwJbpIbpIbyAbnmbnmbyBbyCbyDbyEbyFbyGbyHbyIbyJbyKbyLbyMbyNbyObwXbyPbyQbyPbyQbyRbwXbwYbySbyTbyUbyVbyWbyXbyYbyZbzabyTbAObvwbvwbucbzcbzdbzebzfbzgbucbxnbvHbvHbvHbvHbvHbvHbvHbzhbzibzjbzkbzlbxqbzmbuhbznbzobzpbxxbxAbxzbzqbzrbukbzsbztbzubzvbzvbzwbzxbzybzzbzAbzAbzAbzBbzAbzCbzDbzEbzFbzGbzHbzIbzJbzKbzKbzKbzLbusbzMbxXbzNbwobikbikbikbikbikbikbikbikbikbikbikbDyderderderbDzbikbDyderderderbDzbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaIndjtdjsdjuaIoaIoaIobdFaJraJrbrXbzVbrXbzWbzXbzYbzZbrXbcsbAabAabAbbAcbAbbAbbAbbAcbAbbcsbcsbngbngbngbAdbngbAebAebAebAebAebAebyvbAfbAgbAhbAibAjbAkbAlbAmbAnbAobApbAqbArbAsbAtbAubAvbAwbAwbAxbAybAzbAAbABbACbADbAEbvjbAFbwVbAGbwTbAHbvjbikbAIbAJbAKbALbAJbAJbAJbAJbAMbnAbCBbvwbCCbAPbAQbARbASbATbAUbucbAVbAWbAXbAYbAZbBabBbbBcbvHbBdbuhbBebzlbBfbBgbuhbBhbBibxwbxxbxAbxzbxvbxAbukbxBbvXbBjbBkbBlbBmbBnbBobBpbBqbBrbBsbBtbBubBvbupbBwbBxbBybusbBzbBAbBBbxUbBCbBDbusbzMbxXbBEbwobikbikbikbikaabaabaabaabaabaabaabaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaIndjwdjvdjuaJqaJqbBIbBJaJqbBKbrXbBLbycbBMbBNbBObBPbrXbikaabaabdetdesdesdesdesdesdeubikbikbBRbBSbBTbBUbBVbAebAebAebAebAebAebBWbBXbBYbBZbCabCbbCcbCdbnmbnmbCebCfbnmbnmbCgbChbCibCjbCkbClbClbCmbClbCnbCobCpbCqbAEbvjbCrbvlbvlbvlbCsbvjbikbAIbAJbCtbCubCvbCwbCxbCybCzbCAbEsbvwbEtbucbvxbCDbCEbCFbCGbCHbCIbCJbCKbCLbCMbCNbCObCPbCQbCRbCSbCTbzlbCUbCVbuhbCWbCXbCYbCZbDabDbbDcbvVbukbDdbDebDfbDgbDgbDhbDibDjbDkbDlbDmbDnbDobDpbDqbupbDrbBxbDsbusbDtbDubDvbxUbxUbDwbusbxWbxXbDxbwobikbikbikbikaabbDAbFfbDBbFfbDBbFfbFgaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaIndjudjubDEaInaInaLyaCubDFbDGbrXbDHbycbycbycbrXbrXbrXbikbikbikdewdevdevdexdevdevdewbikbikbBRbDIbAebDJbDKbDKbDKbDKbDKbDLbDMbDKbDNbDObDPbDQbDRbDSbDTbnmbDUbpIbDVbDWbtLbDXbDYbDZbCjbCjbCpbEabEbbEcbEdbEebCpbvibAEbvjbEfbEgbEhbEibEjbvjbikbEkbAJbElbEmbEnbEobEpbEobEqbErbFWbvwbHBbucbEubEubEvbEwbExbEybEzbEAbEBbECbEDbEDbEEbEFbEGbEHbuhbCTbEIaJSbuhbuhbuibEKbELbEMbuibukbukbukbENbEObvXbEPbBkbBlbEQbDgbDjbERbESbESbETbxJbEUbEVbEWbEXbxPbEYbusbEZbFabxUbFbbFcbFdbusbzMbFebwobwobikbikbikbikaabbFhbFjbFibGSbFkbGTbFhaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdjxdjydjydjydjydjAdjzdjydjydjydjydjBbikbikbikbikbikbikbikbikbikbikbikbikbikdewdevdevdevdevdevdewbFnbBRbBRbFobFpbFqbFrbFrbFrbFpbAebyvbAfbAebAebAgbFsbFtbFubFvbFwbFxbFybpIbpIbFzbtLbDXbDYbFAbFBbFCbFDbFEbFFbFGbFHbFIbCpbFJbFKbwRbFLbFMbFNbFObFPbwXbwYbFQbAJbFRbFSbFTbEobFUbEobFVbErbJebvwbKObucbFYbFZbGabGbbGcbGdbGebGfbGgbGgbGhbGibGgbGgbGjbGkbGlbGmbGnbGobGpbGqbGrbGsbGtbGubGvbGwbGxbGybGzbGAbvXbGBbGCbGDbGEbGFbxGbGGbESbESbGHbGIbEUbGJbupbGKbGKbGLbusbGMbGNbGObGPbxUbGQbusbzMbGRbwobikbikbikbikbikaabbGUbIybFibFkbFibKkbDBaabbikbikbikbikbikaahbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdjxdjCdjEdjDdjGdjFdjIdjHdjFdjJdjLdjKdjydjydjBbikbikbikbikbikbikbikbikbikbikbikdewdevdevdevdevdevbGWbmrbNkbmrbGXbGYbGZbGYbGYbGYbGYbHabyvbAfbHbbngbngbHcbpIbAibFvbHdbtLbHebHfbHfbHgbHhbHibHjbHkbHlbHmbHnbHobHpbHqbHrbHsbCpbCqbAEbvjbHtbHubHvbHwbHxbvjbikbEkbHybHzbHybHybHybHybHybHAbHybKPbvwbKObucbHCbHDbHDbHEbHFbEybHGbHHbHIbHJbHKbHLbHMbHIbHNbHObHPbHQbHRbHSbHTbHTbHUbHVbHWbHXbHYbHZbIabIbbIcbIdbIebIfbIfbIgbIhbIibxGbIjbxJbxJbIkbIlbEUbImbInbIobIpbIqbIrbIsbItbIubIvbIubusbusbIwbEXbEXbIxbIxbIxbIxbIxbEXbFhbFkbFibFkbFkbGTbFhaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdjxdjydjHdjHdjHdjMdjFdjNdjNdjFdjOdjHdjHdjQdjPdjydjBbikbikbikbikbikbikbikbikbikbikdewdevdevdevdevdevbLFbKmbIAbKmbIBbAebFqbFrbFrbFrbAebAebyvbAfbICbIDbngbIEbpIbAibFvbIFbtLbIGbpIbrsbpIbIHbDXbvvbIIbHlbHmbIJbIKbILbIMbINbIObIPbIQbIRbISbISbITbIUbIVbvjbvjbikbEkbHybIWbIXbIYbIZbJabJbbJcbJdbMhbvwbKObCHbJfbJgbJhbJibJjbEybJkbJlbJmbJnbJobJpbJqbJrbJsbJtbJubJvbJwbJxbJybJzbJAbJBbJCbJDbJEbGwbJFbGybJGbJHbvYbJIbJJbJKbJLbJLbxGbJMbJNbJObxGbJPbEUbJQbxGbJRbJSbJTbJUbJVbJWbJXbJYbJZbKabKbbKcbKdbKebKfbKfbKgbKhbKibKjbKlbFfbDBbNhbDBbFfbLEaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdjxdjydjSdjRdjUdjTdjVdjFdjWdjHdjXdjHdjHdjHdjHdjHdjMdjFbikbikbikbikbikbikbikbikbikbikdewdeCdevdevdevcOfdewbFnbBRbBRdezbAebFqbAebAebAebAebAebyvbAfbICbKobngbKpbpIbKqbKrbpIbKsbpHbpIbpIbKtbtLbDXbvvbIIbHlbHmbCpbKubKvbKwbKxbKybKzbKAbKBbKCbKDbwXbKEbKFbwXbwYbwYbKGbHybKHbKIbKJbKKbKLbKLbKMbKNbMibvwbMjbucbEybKQbEubKRbKSbEybJkbKTbKUbKVbKWbKXbKYbKUbJkbKZbLabLbcchbLbbLcbLbbLdbLdbLebLfbLgbLhbLhbLibLgbLgbLhbLhbLjbLkbLjbLjbxGbxGbxGbxGbxGbLlbLmbBobxGbLnbLobLpbLqbLqbLrbLsbLtbLubLvbLwbLxbLybLzbLAbLAbLBbJVbLCbEXbLDbLDbLDbUHbEXbikbikaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdjZdjYdjHdjHdkadkadkadjFdjHdjHdjFdkbdkddkcdkfdkedkgdjFbikbikbikbikbikbikbikbikbikbikdewdevdevdevdevdevbWobKmbIAbKmbFobLGbLHbAebAebAebLGbAebyvbAfbICbLIbngbLJbpIbAibFvbpIbnmbLKbpIbpIbLLbtLbDXbvvbLMbHlbLNbCpbLObLPbLQbLRbLSbKzbLTbLUbLVbLWbLXbLYbLZbMabikbikbikbHybMbbMcbMdbMdbMebMfbMgbHybNSbNRbKObNTbMkbMlbMmbMnbMobMpbMqbJlbMrbMsbMtbMubMvbMrbJkbKZbMwbMxbMybMzbMAbMBbLdbMCbMDbMEbLgbMFbMGbMHbMIbMJbMKbMLbKabMMbLqbLqbMNbMObLqbMPbMQbMRbMSbMTbLqbMUbiTbMWbMXbMYbMZbNabNbbNabNabNabIwbEXbEXbIxbIxbEXbNcbNdbNebNfbYdbNgbNibLDbikbikaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdkhdjYdjHdjHdjHdjHdjHdkidjHdjHdjFdjydjydjydjydjydjydkjbikbikbikbikbikbikbikbikbikbikdewdevdevdevdevdevdeEdeDdeGdeDbNlbNmbNnbNnbNnbNnbNnbNobNpbNqbICbNrbngbNsbNtbNubNvbNwbNxbNybNybNybNzbNzbNAbvvbNBbNCbHmbCpbNDbNEbNFbKvbNGbKzbNHbNIbNJbNKbNLbFNbNMbMabikbikbikbHybNNbNObNPbNQbMebMfbMgbHybPibNUbQObPjbNVbNWbNXbNYbNZbOabObbOcbKUbKUbOdbOebKUbKUbJkbKZbOfbOgbOhbOibOjbOkbLdbOlbOmbOnbOobOpbOqbOrbOrbOsbOtbOubOvbOwbJVbJVbOxbJVbOybJVbOzbJVbOAbOBbOBbOCbODbOEbOFbOGbOHcsjbOJbOKbOLbNabOMbONbikbikbikbEXbBxbKhbOObNfbKjbOPbOQbEXbikbikaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdkkdjydkmdkldkodkndjHdjFdjHdjHdjFdjHdkqdkpdkrbikbikbikbikbikbikbikbikbikbikbikbikbikdewdevdevdevdevdevdewbFnbBRbBRbngbngbBRbBRbBRbBRbBRbngbngbBRbBRbBRbngbOVbOVbOVbOWbOVbNzbOXbOYbOZbPabNzbDXbvvbPbbPcbPcbCpbCpbCpbCpbCpbPdbKzbISbIRbPebNKbPgbPhbMabMabvjbvjbvjbHybHzbHybHybHybHybHybHybHybQPbvwbQQbPkbPlbPmbPnbPlbPlbPobPpbPqbPrbPsbPtbPubPvbPwbMqbPxbPybPzbPAbPBbPCbPDbPEbPFbPGbPHbPIbPJbPKbPLbMHbPMbLhbLhbPNbPObPNbPPbPQbPPbPPbPPbPRbPSbPTbPTbPUbPVbPWbPXbOFbPYbPZbQabQbbQcbQdbNabOMbONbikbikbikbEXbOSbORbEXbKjbEXbEXbKjbEXbikbikaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdjydjydjydjydjydjydjFdjOdjHdksdjHdkudktdkvbikbikbikbikbikbikbikbikbikbikbikbikbikdeJdeIdevdeKdevdeLdeMbikbikbikbikbikbikbikbikbikbikbQgaabbikbikbikbikbOVbQhbQibQjbQkbNzbQlbQmbQnbQobNzbDXbvvbQpbQqbQrbQsbQtbQubQvbQwbQxbQybQzbQAbQBbQCbQDbQEbQFbQGbQHbQIbQJbQKbQLbQMbQRbuabQSbvwbShbSgbSibvwbSjbPlbQTbQUbQVbQWbQXbJkbQYbQZbRabRbbRcbRdbRebRfbRgbRhbRibLbbRjbOibRkbRlbRmbRnbRobRpbLgbRqbMHbMHbMHbRrbLhbPNbRsbRtbRubRvbRwbRxbRybPPbRzbRAbRBbPTbPTbRCbPWbRDbREbRFbRGbRHbRIbRJbRKbNabRLbwobikbikbikbEXbEXbEXbEXbikbikaabbikbikbikbikaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbBGbDCdjldjidjidjidjidjidjidjideHdjnaGddjnaJrbtrbrXbtsbttbtubtvbtwbrZbtxbtybtzbtzbtAbtBblCblCblCbosbtCborbcsbcsbcsbcsbtDbejbejbskbejbsjbskbngbtEbtFbtGbtHboAbngbtIbnmbtJbpIbpIbpIbtKbtLbtMbpNbtNbnqbtObtPbpRbpRbpRbpRbpTbtQbmgbtRbtSbmgbmgbmgbmgbmgbmgbmgbnzbnAbtTbtUbtVbtWbtXbtYbtZbnAbvubuabuabucbucbucbucbucbucbucbudbudbuebufbugbugbufbuebudbudbuhbuhbuhbuhbuhbuhbuibuibujbuibuibuibuibuibukcqObumbunbmFbmFbuobuobupbupbupbupbupbuqbtfbtfbtebtfbmFbtfbtfbtfbtfburbusbusbusbusdedbuubuubuubuubuubuubuubuubuubikbikbikbikbdBddYddYddYdeebqUbikbqUdefdebdebdegbqUbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbBGbDCdjodjpdjpdjidjpdjpdjpbtqdjqaInaInaInaKBbuvbrXbuwbuxbuxbuxbuybrZbejbuzbuAbuBbuCbuDblCbmUbuEbosbuFborbuGbuHbuIbuJbuKbuLbuLbuMbuLbuNbuObngbuPbuQbuRbuSbuTbuUbuVbnmbuWbpIbpIbuXbuYbuZbtMbpNbvabnqbvbbvcbvdbvebvfbvgbvhbnqbnqbvibvjbvkbvlbvmbvlbvnbvjbikbvobnAbvpbvqbvrbvsbtXbqbbvtbnAbxebvwbxfbucbvxbvybvzbvAbvBbvCbvDbvEbvFbvGbvHbvHbvGbvIbvJbvKbuhbvLbvMbvNbvObuhbvPbvQbvRbvSbvTbvUbvUbvVbukcpLbvXbvYbvZbvYbwabwabupbwbbwcbwdbupbwebwfbwebupbwgbtfburbusbwhbwibwhbusbwjbwkbusdeicngbxXbwobikbikbikbikbikbikbikbikbikbikbqUddXddZddYdejbqUbikbqUdekdekdekdekbqUbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdjrbtqbtqbtqbtqbtqbtqbtqbtqdjqbikbikaInbwqbdFbwrbrXbwsbrXbwtbuxbwubwvbrZbwwbwxbwybwzbuDblCblCblCblCblCblCbwAbwBbwCbwDbwEbngbngbngbngbngbngbngbwFbngbngbngbwGbngbwHbwIbwJbpIbpIbpIbwKbtLbwLbpNbwMbnqbwNbvcbnrbnrbnrbnqbwObnqbwPbwQbwRbwSbwTbwUbwVbwWbwXbwYbwZbnAbxabqbbxbbxcbtXbxdbqbbnAbzbbxgbANbucbxhbxibxjbxkbxlbxmbxnbvHbvHbvHbvHbvHbvHbvHbvHbxobxpbxqbxrbxsbxtbuhbxubxvbxwbxxbxybxzbxvbxAbukcnfbvXbxCbxDbxEbxFbxFbxGbxHbxIbxJbxKbxLbxMbxNbupbxObxPbxQbusbxRbxSbxTbxUbxUbxVbusbxWbxXbxYbwobikbikbikbikbikbikbikbikbikbikbDybtldemdemdemdenbikdeodepdepdepbtlbDzbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaLyaCuaKzaKzaInaInaInaInaInaInaInaKBaJrbyabrXbybbycbydbyebyebyfbygbyhbyibyibyjbykbtzbtzbtzbtzbtzbtzbylbymbymbynbyobngbypbyqbyrbysbytbyubyvbywbngbyxbyybyzbuVbtLbwJbpIbpIbyAbnmbnmbyBbyCbyDbyEbyFbyGbyHbyIbyJbyKbyLbyMbyNbyObwXbyPbyQbyPbyQbyRbwXbwYbySbyTbyUbyVbyWbyXbyYbyZbzabyTbAObvwbvwbucbzcbzdbzebzfbzgbucbxnbvHbvHbvHbvHbvHbvHbvHbzhbzibzjbzkbzlbxqbzmbuhbznbzobzpbxxbxAbxzbzqbzrbukcZrbztbzubzvbzvbzwbzxbzybzzbzAbzAbzAbzBbzAbzCbzDbzEbzFbzGbzHbzIbzJbzKbzKbzKbzLbusbzMbxXbzNbwobikbikbikbikbikbikbikbikbikbikbikbDyderderderbDzbikbDyderderderbDzbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaIndjtdjsdjuaIoaIoaIobdFaJraJrbrXbzVbrXbzWbzXbzYbzZbrXbcsbAabAabAbbAcbAbbAbbAbbAcbAbbcsbcsbngbngbngbAdbngbAebAebAebAebAebAebyvbAfbAgbAhbAibAjbAkbAlbAmbAnbAobApbAqbArbAsbAtbAubAvbAwbAwbAxbAybAzbAAbABbACbADbAEbvjbAFbwVbAGbwTbAHbvjbikbAIbAJbAKbALbAJbAJbAJbAJbAMbnAbCBbvwbCCbAPbAQbARbASbATbAUbucbAVbAWbAXbAYbAZbBabBbbBcbvHbBdbuhbBebzlbBfbBgbuhbBhbBibxwbxxbxAbxzbxvbxAbukcnfbvXbBjbBkbBlbBmbBnbBobBpbBqbBrbBsbBtbBubBvbupbBwbBxbBybusbBzbBAbBBbxUbBCbBDbusbzMbxXbBEbwobikbikbikbikaabaabaabaabaabaabaabaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaIndjwdjvdjuaJqaJqbBIbBJaJqbBKbrXbBLbycbBMbBNbBObBPbrXbikaabaabdetdesdesdesdesdesdeubikbikbBRbBSbBTbBUbBVbAebAebAebAebAebAebBWbBXbBYbBZbCabCbbCcbCdbnmbnmbCebCfbnmbnmbCgbChbCibCjbCkbClbClbCmbClbCnbCobCpbCqbAEbvjbCrbvlbvlbvlbCsbvjbikbAIbAJbCtbCubCvbCwbCxbCybCzbCAbEsbvwbEtbucbvxbCDbCEbCFbCGbCHbCIbCJbCKbCLbCMbCNbCObCPbCQbCRbCSbCTbzlbCUbCVbuhbCWbCXbCYbCZbDabDbbDcbvVbukcZqbDebDfbDgbDgbDhbDibDjbDkbDlbDmbDnbDobDpbDqbupbDrbBxbDsbusbDtbDubDvbxUbxUbDwbusbxWbxXbDxbwobikbikbikbikaabbDAbFfbDBbFfbDBbFfbFgaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaIndjudjubDEaInaInaLyaCubDFbDGbrXbDHbycbycbycbrXbrXbrXbikbikbikdewdevdevdexdevdevdewbikbikbBRbDIbAebDJbDKbDKbDKbDKbDKbDLbDMbDKbDNbDObDPbDQbDRbDSbDTbnmbDUbpIbDVbDWbtLbDXbDYbDZbCjbCjbCpbEabEbbEcbEdbEebCpbvibAEbvjbEfbEgbEhbEibEjbvjbikbEkbAJbElbEmbEnbEobEpbEobEqbErbFWbvwbHBbucbEubEubEvbEwbExbEybEzbEAbEBbECbEDbEDbEEbEFbEGbEHbuhbCTbEIaJSbuhbuhbuibEKbELbEMbuibukbukbukbENcwnbvXbEPbBkbBlbEQbDgbDjbERbESbESbETbxJbEUbEVbEWbEXbxPbEYbusbEZbFabxUbFbbFcbFdbusbzMbFebwobwobikbikbikbikaabbFhbFjbFibGSbFkbGTbFhaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdjxdjydjydjydjydjAdjzdjydjydjydjydjBbikbikbikbikbikbikbikbikbikbikbikbikbikdewdevdevdevdevdevdewbFnbBRbBRbFobFpbFqbFrbFrbFrbFpbAebyvbAfbAebAebAgbFsbFtbFubFvbFwbFxbFybpIbpIbFzbtLbDXbDYbFAbFBbFCbFDbFEbFFbFGbFHbFIbCpbFJbFKbwRbFLbFMbFNbFObFPbwXbwYbFQbAJbFRbFSbFTbEobFUbEobFVbErbJebvwbKObucbFYbFZbGabGbbGcbGdbGebGfbGgbGgbGhbGibGgbGgbGjbGkbGlbGmbGnbGobGpbGqbGrbGsbGtbGubGvbGwbNebIebNcbNdbvXbGBbGCbGDbGEbGFbxGbGGbESbESbGHbGIbEUbGJbupbGKbGKbGLbusbGMbGNbGObGPbxUbGQbusbzMbGRbwobikbikbikbikbikaabbGUbIybFibFkbFibKkbDBaabbikbikbikbikbikaahbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdjxdjCdjEdjDdjGdjFdjIdjHdjFdjJdjLdjKdjydjydjBbikbikbikbikbikbikbikbikbikbikbikdewdevdevdevdevdevbGWbmrbNkbmrbGXbGYbGZbGYbGYbGYbGYbHabyvbAfbHbbngbngbHcbpIbAibFvbHdbtLbHebHfbHfbHgbHhbHibHjbHkbHlbHmbHnbHobHpbHqbHrbHsbCpbCqbAEbvjbHtbHubHvbHwbHxbvjbikbEkbHybHzbHybHybHybHybHybHAbHybKPbvwbKObucbHCbHDbHDbHEbHFbEybHGbHHbHIbHJbHKbHLbHMbHIbHNbHObHPbHQbHRbHSbHTbHTbHUbHVbHWbHXbHYbKhbKibKjbLibLBbLCbIfbIfbIgbIhbIibxGbIjbxJbxJbIkbIlbEUbImbInbIobIpbIqbIrbIsbItbIubIvbIubusbusbIwbEXbGxbLDbLDbLDbLDbLDbGxbFhbFkbFibFkbFkbGTbFhaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdjxdjydjHdjHdjHdjMdjFdjNdjNdjFdjOdjHdjHdjQdjPdjydjBbikbikbikbikbikbikbikbikbikbikdewdevdevdevdevdevbLFbKmbIAbKmbIBbAebFqbFrbFrbFrbAebAebyvbAfbICbIDbngbIEbpIbAibFvbIFbtLbIGbpIbrsbpIbIHbDXbvvbIIbHlbHmbIJbIKbILbIMbINbIObIPbIQbIRbISbISbITbIUbIVbvjbvjbikbEkbHybIWbIXbIYbIZbJabJbbJcbJdbMhbvwbKObCHbJfbJgbJhbJibJjbEybJkbJlbJmbJnbJobJpbJqbJrbJsbJtbJubJvbJwbJxbJybJzbJAbJBbJCbJDbJEbGwbIdbIebIbbIcbvYbJIbJJbJKbJLbJLbxGbJMbJNbJObxGbJPbEUbJQbxGbJRbJSbJTbJUbJVbJWbJXbJYbJZbKabKbbKcbKdbKebKfbKfbIxbJFbJHbKgbKlbFfbDBbNhbDBbFfbLEaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdjxdjydjSdjRdjUdjTdjVdjFdjWdjHdjXdjHdjHdjHdjHdjHdjMdjFbikbikbikbikbikbikbikbikbikbikdewdeCdevdevdevcOfdewbFnbBRbBRdezbAebFqbAebAebAebAebAebyvbAfbICbKobngbKpbpIbKqbKrbpIbKsbpHbpIbpIbKtbtLbDXbvvbIIbHlbHmbCpbKubKvbKwbKxbKybKzbKAbKBbKCbKDbwXbKEbKFbwXbwYbwYbKGbHybKHbKIbKJbKKbKLbKLbKMbKNbMibvwbMjbucbEybKQbEubKRbKSbEybJkbKTbKUbKVbKWbKXbKYbKUbJkbKZbLabLbcchbLbbLcbLbbLdbLdbLebLfbLgbLhbLhbDdbLgbLgbLhbLhbLjbLkbLjbLjbxGbxGbxGbxGbxGbLlbLmbBobxGbLnbLobLpbLqbLqbLrbLsbLtbLubLvbLwbLxbLybLzbLAbLAbEObGAbHZbGxbGzbGzbGzbIabGxbikbikaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdjZdjYdjHdjHdkadkadkadjFdjHdjHdjFdkbdkddkcdkfdkedkgdjFbikbikbikbikbikbikbikbikbikbikdewdevdevdevdevdevbWobKmbIAbKmbFobLGbLHbAebAebAebLGbAebyvbAfbICbLIbngbLJbpIbAibFvbpIbnmbLKbpIbpIbLLbtLbDXbvvbLMbHlbLNbCpbLObLPbLQbLRbLSbKzbLTbLUbLVbLWbLXbLYbLZbMabikbikbikbHybMbbMcbMdbMdbMebMfbMgbHybNSbNRbKObNTbMkbMlbMmbMnbMobMpbMqbJlbMrbMsbMtbMubMvbMrbJkbKZbMwbMxbMybMzbMAbMBbLdbMCbMDbMEbLgbMFbMGbMHbMIbMJbMKbMLbKabMMbLqbLqbMNbMObLqbMPbMQbMRbMSbMTbLqbMUbiTbMWbMXbMYbMZbNabNbbNabNabNabIwbEXbGxbLDbLDbGxcnccndcnebOQbOSbUHbYdbGzbikbikaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdkhdjYdjHdjHdjHdjHdjHdkidjHdjHdjFdjydjydjydjydjydjydkjbikbikbikbikbikbikbikbikbikbikdewdevdevdevdevdevdeEdeDdeGdeDbNlbNmbNnbNnbNnbNnbNnbNobNpbNqbICbNrbngbNsbNtbNubNvbNwbNxbNybNybNybNzbNzbNAbvvbNBbNCbHmbCpbNDbNEbNFbKvbNGbKzbNHbNIbNJbNKbNLbFNbNMbMabikbikbikbHybNNbNObNPbNQbMebMfbMgbHybPibNUbQObPjbNVbNWbNXbNYbNZbOabObbOcbKUbKUbOdbOebKUbKUbJkbKZbOfbOgbOhbOibOjbOkbLdbOlbOmbOnbOobOpbOqbOrbOrbOsbOtbOubOvbOwbJVbJVbOxbJVbOybJVbOzbJVbOAbOBbOBbOCbODbOEbOFbOGbOHcsjbOJbOKbOLbNabOMbONbikbikbikbGxbORbJFbOPbOQbKgbOObNibGxbikbikaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdkkdjydkmdkldkodkndjHdjFdjHdjHdjFdjHdkqdkpdkrbikbikbikbikbikbikbikbikbikbikbikbikbikdewdevdevdevdevdevdewbFnbBRbBRbngbngbBRbBRbBRbBRbBRbngbngbBRbBRbBRbngbOVbOVbOVbOWbOVbNzbOXbOYbOZbPabNzbDXbvvbPbbPcbPcbCpbCpbCpbCpbCpbPdbKzbISbIRbPebNKbPgbPhbMabMabvjbvjbvjbHybHzbHybHybHybHybHybHybHybQPbvwbQQbPkbPlbPmbPnbPlbPlbPobPpbPqbPrbPsbPtbPubPvbPwbMqbPxbPybPzbPAbPBbPCbPDbPEbPFbPGbPHbPIbPJbPKbPLbMHbPMbLhbLhbPNbPObPNbPPbPQbPPbPPbPPbPRbPSbPTbPTbPUbPVbPWbPXbOFbPYbPZbQabQbbQcbQdbNabOMbONbikbikbikbGxbNfbNgbGxbKgbGxbGxbKgbGxbikbikaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdjydjydjydjydjydjydjFdjOdjHdksdjHdkudktdkvbikbikbikbikbikbikbikbikbikbikbikbikbikdeJdeIdevdeKdevdeLdeMbikbikbikbikbikbikbikbikbikbikbQgaabbikbikbikbikbOVbQhbQibQjbQkbNzbQlbQmbQnbQobNzbDXbvvbQpbQqbQrbQsbQtbQubQvbQwbQxbQybQzbQAbQBbQCbQDbQEbQFbQGbQHbQIbQJbQKbQLbQMbQRbuabQSbvwbShbSgbSibvwbSjbPlbQTbQUbQVbQWbQXbJkbQYbQZbRabRbbRcbRdbRebRfbRgbRhbRibLbbRjbOibRkbRlbRmbRnbRobRpbLgbRqbMHbMHbMHbRrbLhbPNbRsbRtbRubRvbRwbRxbRybPPbRzbRAbRBbPTbPTbRCbPWbRDbREbRFbRGbRHbRIbRJbRKbNabRLbwobikbikbikbGxbGxbGxbGxbikbikaabbikbikbikbikaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdjxdjydkxdkwdkydkxdkzdjFdjHdjHdjFdjHdkBdkAdkCbikbikbikbikbikbikbikbikbikbikbikbikbikdeOdeNdePdePdePdeNdeQbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbOVbRMbRNbRObRPbNybRQbRRbRSbRTbNzbDXbRUbRVbvvbvvbFXbRWbubbQNbQMbRXbRYbRXbRZbSabSabSbbScbSdbSabSabSebSabSfbSabQMbQRbuabSlbSkbTJbTIbTLbTKbvwbPlbSmbQUbSnbSobSpbJkbSqbSrbSsbStbSubSvbSwbSxbJkbSybSzbLbbSAbSBbSBbSCbSDbSEbSFbSGbLgbSHbSIbMHbSJbSKbLhbPNbSLbSMbSNbSObSPbSQbSRbPPbSSbRAbSTbSTbPTbSUbSVbSWbSXbSYbSZbTabTbbTcbTdbNabOMbwobTebikbikbikbikbikbikbikbikaabbikbikbikbikaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdjZdjYdkDdkDdkDdkDdkDdkEdjHdjHdjFdjydjydjydjydjydjydjBbikbikbikbikbikbikbikbikbikbikbikdeRdeSdeSdeSdeTbikbikbikbikbikbikbikbikbOUbOTbQebOTbQfbikbikbikbOVbOVbTjbTkbRObTlbNybTmbQnbTnbTobNzbDXbTpbTqbTrbTsbTtbTubTvbTwbTxbTybTzbTAbTBbTCbTCbTDbTEbTEbTEbTEbTEbTEbTFbTGbTHbTNbTMbTPbTOdlidjmdlkdljdllbPlbTQbQUbQVbTRbSpbJkbSqbSrbTSbTTbTUbTVbTWbTXbJsbTYbTZbLbbLbbUabUabLbbSDbLdbUbbUcbLgbUdbUebUfbUgbUhbLhbPNbUibUjbUkbUlbUmbUnbUobPPbUpbRAbSTbSTbPTbUqbUrbUsbUtbUubUvbUwbUxbUybUzbNabOMbUAbUBbUAbUCbUDbUCbUCbUCbikbikbikbikaabaabaabaabbikbikbikbikbikbikbikbikbikbikbikbikaabaabaabaabaabbikbikbikbikaabaabaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdkhdjYdkDdkDdkDdkFdkGdjFdjHdjHdjFdjHdjHdjHdkHdjHdkIdjFbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbTgbTfbTibThbTgbUIbUIbUIbOVbUJbUKbULbUMbUNbUObUPbUQbUQbURbNzbUSbUTbUUbUVbUVbUWbUXbUYbUVbUZbUZbVabVbbVcbUZbUZbVdbQMbQMbVebVfbVfbVfbVgbVhbVfbVfbVibVjbVkbVkbVlbVkbVmbVnbVkbVobVpbVqbPlbVrbVsbSqbVtbVubVvbVwbVxbVybVubJkbSybVzbVAbVBbVCbVDbVEbVFbVGbVHbVIbVJbVKbVLbVMbVNbVObLhbPNbPNbVPbVQbVRbVSbVRbVTbPPbVUbVVbVWbVWbPTbVXbVYbVZbNabNabNabNabNabNabNabNabOMbUAbWabWbbWcbWdbWdbWebUCbikbikbikbikbikbikbikaabbikbikbikbikbikbikbikbikbikbikbikbikaabbWfbWfbWfbWfbWgbWgbWhbWhbWhbWhbWiaabaabbikbikbikaahbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik @@ -8872,15 +8874,15 @@ bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbi bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikcejcejcejcejbUTcfScejbikbikbikbikciEbaTciGciHciIciJciKciLciMciNcmPciPciQciRciSciSciTciUciVciWciWciWciWciXciWbGybGybPlciYciZcjacjbcjccjdchScjecjfcjgcjhcjicjjcjkcjlcfdcnicjpcjpcjpcjpckNclSckUcnjcjqcjrcjscjtcbAcjucjvcbPcjwcjxcjycjzcjAcfrcjBcbPcbPbEXcjCbEXbEXbEXcjDcjEcjFbEXbxXciicjGcjHbwobwobwobUAbUAbUAbUAbUAbUAbUAbUAbUAbUAbUAbUAbUAbUAbUAbUAbUAbikbikbikbikbikaabbikbikbikbikbikbikbikbWhccvccvccvccvccvccvcjIbXZccuccvcjJbXZbXZbXZbXZbWhaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikcAjbikaabaabcjKcjKcjKcjKcjKcjKcjLcjKbUTcelcjMbikcjNcjOcjPcjQcjRcjScjTcjUcjVcjWcjXcjYcjZcosckbckcckdckeckfckgckhciVckickjckjckjckkciWbGybGycklcklcklcklckmcklckncknckocklcklckpcklckqckrckscktcksclZaPKcmacmmcmlcmocmnckzckAckBckCckDckEckFcdccbPcbPckGcbPckHcbPckIckJckKcgnckLckMckvckOckPckQckRckSckPbxXciickTbxXbxXckVckWckXchabxXbxXbxXbxXbxXbxXbxXckYckZbONbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbWhbXZbXZbXZbXZbXZbXZcfNbXZcjJbXZbXZbXZbXZbXZbWhbWhaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikclaclbclbclbclccldcleclfclgclhclicjLcljcelcjMbikclkcllclmclnclocjSclpclqclrclsciLcltcgdcoaciPcluchyclvchyclwclxclyclzclAclAclAclBciWbGybGycklclCclDclEclFclGclHclHclIclJclKclLclMclNclOcotcfhcpwcmpcmrcmqctbcsZcuoctcckDclVclWclXckzclYcmtcmscmbcmbcmccmdcmecmfcmgcmhcmfcmfcmfcmicmfcmfcmjcmucnpcnlcqRcoXcrGcqScrHcrHcrIcrHcrHcrHcrHcrJcrKcrHcrHcrHcrMcmvbxXbONbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbWhbWhceibXZbXZbXZbXZbXZbXZbXZbXZbXZbXZbXZbWhbWhaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikcmwcmxcmxcmxcmxcmycmzcmAcmBcmCcmCcmDcjKcmEcfScjMbikclkcmFcmGcmHcmIcmJcmKcmLcmIcmIcmMcmNcmOcpxcmQcmQcmRcmSchycmTcmUclyclAclAclAclAcmVciWbGybGycklcmWcmXcmYcmZcnacnbcnbcnccndcnecnfcngcnhcklcqQcfdcrLcjpcwscvxcwEcwCcxNcxIckDcnmcnncnockDbJGcumctecnqcnqcnqcnqcnqcnrcnscntcnucnvcnvcnwcnwcnvcnxcnycnzcnAcnBcnCcnDcnEcnCcnCcnCcnCcnCcnCcnCcnCcnCcnCcnCcnCcuncnFcnGbONbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikcaUbWhbWhchlchlbXZbXZbXZbXZbXZbXZbXZbXZbWhbWhaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikcnHcnIcnJcnKcnJcnLcnMcnNcnOcnPcnQcjKcnRcelcjMbikclkcnScnTcnUcnVcjScnWcnXcnYcnZciLcltcgdcbkcobcgfcoccodciPciPciPcoecofclAclAcogcohciWbGycoicklcojcokcolcomcomcomconcoocomcomcopcolcoqcorcrNcfdcupcjpcxVcxUcxVcxVcxNcEickDcowcoxcoyckDcozcuscoicoAcoAcoAcoAcoAcoDcoDcoDcoAcoAbikbikbikbikckPcoEcoFcoGcnCcoHcoIcoJcoKcoLcoMcoNcoOcoPcoQcoRcoScoTcoUcnCcuncoWcvtcoYcoZcoZcoZcoZcoZcoZcoZcoZcoZcoZcoZcoZcoZcoZcoZcoZcoZcoZcpacpbbWhbZubWhbXZbXZbXZbXZbXZbXZbXZbWhbWhaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaahbikcnHcpccpdcpecpfcmBcpgcphcpicmBcpjcpkcplcpmcjMbikcpncjOcpocjQcppcjScjScpqcprcpscptcpucpvcwqcobcgfcpycpzcpAcpBcpCciVcpDclAclAclAcpEciWbGybGycpFcpFcpGcpHcpIcpIcpIcyFcpJcpJcpJcpKcpLcpGcpMcqQcfdcrLcEjbjVcEYdbndbmcxNclRckDcoucpNcovckDbGycuscoAcoAaabaabbikbikbikbikbikbikbikbikbikbikbikcpRcpScpTcpUcpVcpWcpXcpXcpYcpXcpXcpXcpXcpXcpZcqacqbcqccqdbwocvvbXSbwobwoaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbWhcqhcqicqjbWhbWhbXZbXZcqkbXZbXZbWhbWhaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikcnHcqlcnJcqmcnJcqncqocqpcqqcnNcqrcjKcqscelcejbikbikbikbikciEcqtcqucqvcqvciLcqwciLcqxcgdcbkcqycqzcqAcqBcqCcqCcqCcqDcqEclAcqFclAcqGciWbGybGycpFcqHcqIcqJcqKcqLcqMcpFcqLcqMcqKcqNcqOcqPcpMczecyWczgcEjdbpdbodbrdbqdbsctcckDcpOcpPcpQckDbGycuscoAcvyaabaabaabbikbikbikbikbikbikbikbikbikbikcpRcqUcqVcqWcqXcqYcqZcracrbcpXcpXcrccpXcpXcpZcqbcqbcqbcrdbwocvzbxXbwoaabaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbWfcrhcribZvbWgbWhbWhbXZbYabXZbWhbWhaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikadbabLcrjcrjcrjcrjcrjcrjcrjcrjcrkcrkcrkcrkcrkcjKcjKcjKcjKcjKcjKcjKcekcrlcrmcrmcrmcrmcrmciEciLciLciLciLciLciLciLcrncgdcbkcrocrpcrqcrrcrscrtcrucrvcrwcrxcrycrzcrAciWbGybGycpFcrBcrCcqJcqKcqKcrDcpFcrEcqKcqKcqNcqJcrFcpMbGwbGwbGwcEjdbudbtdbvdbmdbxctcdbydbydbycoAcoAbGycuscoDcwpbikaabaabaabbikbikbikbikbikbikbikbikbikcpRczNczPcoBcrOcrPcrQcrRcrScpXcpXcpXcpXcrTcrUcrVcrWcrXcrYbwocvzbxXbwobikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbWfbWfbWfbWfbWgbWgbWhbWhbWhbWhbWiaabaabbikbikaahbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaahbikbikbikbikbikbikbikbikbikbikbikbikaSecsdcsecsfcsgcsgcshcsidcYcskcslcsmcsncsocspcspcspcsqcsrcsscstcstcsucsvcswcsxcsycsxcsxcsxcswcsxcsxcszcsAcsBcsCcgdcbkcsDcsEcsFcsGcgfcsHcmQcsIcsJcsKcsLcsMcsNcsObGybGycpFcsPcsQcsRcsScsTcsUcpFcsVcsTcsWcsXcsRcsYcwrbikbikbikcEjdbAdbzdbAdbAdbCdbBdbEdbDdbycwFbVibGycuscoDcwpbikbikaabaabaabbikbikbikbikbikbikbikbikctdckPcxGckSctdctfctgcthctictjctkctlcpXcpXctmctnctoctpctqbwocvzbxXcxHbikbikbikbikbikbikbikbikbikbikbikaahbikbikbikbikbikbikbikaabaabaabaabbikbikbikbikaabaabaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaSecsdctuctvctwctvctxctyctzctActBctCctBctDctEctEctFctEcgdctGcblcblctEctHctEctEctEctEctEctEctEctEctEctEctIctJctKctLctMctNctOctPctQctRctSctTctUctVctWctXctYctZcuacnqcubcuccudcuecufcugcuhcuicpFcujcqKcugcukcqJculcwrbikbikbikdbFcmkdbGdbJdbIdbCdbKdbMdbLdbOdbNceFceJdbPcoDcwpbikbikbikaabaabaabbikbikbikbikbikbikbikckPcurczQcutckPcnCcnCcnCcnCcnCcnCcuuctlcuvcuwcuxcuycnCcnCbwocvzbxXcxHbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaSecuBctvcuCcuDcuEcuFcuGcuHcuIcuJcuKcuLcuMcuNcuOcuPcuQcuRceAcuSceAcuNcuTcuNcuNcuNcuNcuNcuNcuNcuNcuNcuNcuUctEcuVcuWcuXcuYcuZcvacvbcvccvdcvecvfcvgcvhcvicvjcvkcsLceJcvlcvmcvncqKcqJcqKcqKcvocpFcvpcqKcqKcqNcqJcyGcwrbikbikbikdbFdbRdbQdbTdbSdbVdbUdbXdbWdbybGychCcyHcuscoAbikbikbikbikbikaabckPckPckPckPckPckPckPckPckPcvucxScvwckPcxOcxOcyIckPaabcnCcnCcvAcnCcvBcvCcvDcnCcyKcyJcvzbxXcxHbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikadbabLcrjcrjcrjcrjcrjcrjcvFcvGcvGcvHctBcvIcrjcrmcvJcvKcvKcvLcvKcvMcvKcvKcvNcvOcvKcvKcvOcvOcvOcvKcvKcvKcvKcvPcvQcvRcvScvTcvUcvVcvWcvXcvWcvWcvWcvWcvZcwacwbcwccwdcsObGycvrcwecwfcwgcwhcwicwjcwkcpFcwlcwjcwmcqNcwncwocpMbikbikbikdbFdbZdbYdcadbIdccdcbdbUczRdbycyObVibVicuscoAbikbikbikbikbikbikckPcwtcwucwvcwwcwxcwycwzcwAcwBczScwDckPcxOcBZcyPckPaabaabcwGcwHcwIcwJcwKcwLcwGbxXbxXcvzczfbwobikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikcmwcmxcmxcmxcmxcmycmzcmAcmBcmCcmCcmDcjKcmEcfScjMbikclkcmFcmGcmHcmIcmJcmKcmLcmIcmIcmMcmNcmOcpxcmQcmQcmRcmSchycmTcmUclyclAclAclAclAcmVciWbGybGycklcmWcmXcmYcmZcnacnbcnbbzsbvWbulbxBclHcnhcklcqQcfdcrLcjpcwscvxcwEcwCcxNcxIckDcnmcnncnockDbJGcumctecnqcnqcnqcnqcnqcnrcnscntcnucnvcnvcnwcnwcnvcnxcnycnzcnAcnBcnCcnDcnEcnCcnCcnCcnCcnCcnCcnCcnCcnCcnCcnCcnCcuncnFcnGbONbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikcaUbWhbWhchlchlbXZbXZbXZbXZbXZbXZbXZbXZbWhbWhaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikcnHcnIcnJcnKcnJcnLcnMcnNcnOcnPcnQcjKcnRcelcjMbikclkcnScnTcnUcnVcjScnWcnXcnYcnZciLcltcgdcbkcobcgfcoccodciPciPciPcoecofclAclAcogcohciWbGycoicklcojcokcolcomcomcomconcoocomcomcopclHcoqcorcrNcfdcupcjpcxVcxUcxVcxVcxNcEickDcowcoxcoyckDcozcuscoicoAcoAcoAcoAcoAcoDcoDcoDcoAcoAbikbikbikbikckPcoEcoFcoGcnCcoHcoIcoJcoKcoLcoMcoNcoOcoPcoQcoRcoScoTcoUcnCcuncoWcvtcoYcoZcoZcoZcoZcoZcoZcoZcoZcoZcoZcoZcoZcoZcoZcoZcoZcoZcoZcpacpbbWhbZubWhbXZbXZbXZbXZbXZbXZbXZbWhbWhaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaahbikcnHcpccpdcpecpfcmBcpgcphcpicmBcpjcpkcplcpmcjMbikcpncjOcpocjQcppcjScjScpqcprcpscptcpucpvcwqcobcgfcpycpzcpAcpBcpCciVcpDclAclAclAcpEciWbGybGycpFcpFcpGcpHcpIcpIcpIcyFcpJcpJcpJcpKcpFcpGcpMcqQcfdcrLcEjbjVcEYdbndbmcxNclRckDcoucpNcovckDbGycuscoAcoAaabaabbikbikbikbikbikbikbikbikbikbikbikcpRcpScpTcpUcpVcpWcpXcpXcpYcpXcpXcpXcpXcpXcpZcqacqbcqccqdbwocvvbXSbwobwoaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbWhcqhcqicqjbWhbWhbXZbXZcqkbXZbXZbWhbWhaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikcnHcqlcnJcqmcnJcqncqocqpcqqcnNcqrcjKcqscelcejbikbikbikbikciEcqtcqucqvcqvciLcqwciLcqxcgdcbkcqycqzcqAcqBcqCcqCcqCcqDcqEclAcqFclAcqGciWbGybGycpFcqHcqIcqJcqKcqLcqMcpFcqLcqMcqKcqNdehcqPcpMczecyWczgcEjdbpdbodbrdbqdbsctcckDcpOcpPcpQckDbGycuscoAcvyaabaabaabbikbikbikbikbikbikbikbikbikbikcpRcqUcqVcqWcqXcqYcqZcracrbcpXcpXcrccpXcpXcpZcqbcqbcqbcrdbwocvzbxXbwoaabaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbWfcrhcribZvbWgbWhbWhbXZbYabXZbWhbWhaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikadbabLcrjcrjcrjcrjcrjcrjcrjcrjcrkcrkcrkcrkcrkcjKcjKcjKcjKcjKcjKcjKcekcrlcrmcrmcrmcrmcrmciEciLciLciLciLciLciLciLcrncgdcbkcrocrpcrqcrrcrscrtcrucrvcrwcrxcrycrzcrAciWbGybGycpFcrBcrCcqJcqKcqKcrDcpFcrEcqKcqKcqNcqKcrFcpMbGwbGwbGwcEjdbudbtdbvdbmdbxctcdbydbydbycoAcoAbGycuscoDcwpbikaabaabaabbikbikbikbikbikbikbikbikbikcpRczNczPcoBcrOcrPcrQcrRcrScpXcpXcpXcpXcrTcrUcrVcrWcrXcrYbwocvzbxXbwobikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbWfbWfbWfbWfbWgbWgbWhbWhbWhbWhbWiaabaabbikbikaahbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaahbikbikbikbikbikbikbikbikbikbikbikbikaSecsdcsecsfcsgcsgcshcsidcYcskcslcsmcsncsocspcspcspcsqcsrcsscstcstcsucsvcswcsxcsycsxcsxcsxcswcsxcsxcszcsAcsBcsCcgdcbkcsDcsEcsFcsGcgfcsHcmQcsIcsJcsKcsLcsMcsNcsObGybGycpFcsPcsQcsRcsScsTcsUcpFcsVcsTcsWcsXdlFcsYcwrbikbikbikcEjdbAdbzdbAdbAdbCdbBdbEdbDdbycwFbVibGycuscoDcwpbikbikaabaabaabbikbikbikbikbikbikbikbikctdckPcxGckSctdctfctgcthctictjctkctlcpXcpXctmctnctoctpctqbwocvzbxXcxHbikbikbikbikbikbikbikbikbikbikbikaahbikbikbikbikbikbikbikaabaabaabaabbikbikbikbikaabaabaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaSecsdctuctvctwctvctxctyctzctActBctCctBctDctEctEctFctEcgdctGcblcblctEctHctEctEctEctEctEctEctEctEctEctEctIctJctKctLctMctNctOctPctQctRctSctTctUctVctWctXctYctZcuacnqcubcuccudcuecufcugcuhcuicpFcujcqKcugcukcqKculcwrbikbikbikdbFcmkdbGdbJdbIdbCdbKdbMdbLdbOdbNceFceJdbPcoDcwpbikbikbikaabaabaabbikbikbikbikbikbikbikckPcurczQcutckPcnCcnCcnCcnCcnCcnCcuuctlcuvcuwcuxcuycnCcnCbwocvzbxXcxHbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaSecuBctvcuCcuDcuEcuFcuGcuHcuIcuJcuKcuLcuMcuNcuOcuPcuQcuRceAcuSceAcuNcuTcuNcuNcuNcuNcuNcuNcuNcuNcuNcuNcuUctEcuVcuWcuXcuYcuZcvacvbcvccvdcvecvfcvgcvhcvicvjcvkcsLceJcvlcvmcvncqKcqJcqKcqKcvocpFcvpcqKcqKcqNcqKcyGcwrbikbikbikdbFdbRdbQdbTdbSdbVdbUdbXdbWdbybGychCcyHcuscoAbikbikbikbikbikaabckPckPckPckPckPckPckPckPckPcvucxScvwckPcxOcxOcyIckPaabcnCcnCcvAcnCcvBcvCcvDcnCcyKcyJcvzbxXcxHbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikadbabLcrjcrjcrjcrjcrjcrjcvFcvGcvGcvHctBcvIcrjcrmcvJcvKcvKcvLcvKcvMcvKcvKcvNcvOcvKcvKcvOcvOcvOcvKcvKcvKcvKcvPcvQcvRcvScvTcvUcvVcvWcvXcvWcvWcvWcvWcvZcwacwbcwccwdcsObGycvrcwecwfcwgcwhcwicwjcwkcpFcwlcwjcwmcqNcqKcwocpMbikbikbikdbFdbZdbYdcadbIdccdcbdbUczRdbycyObVibVicuscoAbikbikbikbikbikbikckPcwtcwucwvcwwcwxcwycwzcwAcwBczScwDckPcxOcBZcyPckPaabaabcwGcwHcwIcwJcwKcwLcwGbxXbxXcvzczfbwobikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikacGacGacGafxafxacGafxafxafxagiafxafxaabagiaqZbikaabaabcwNcwNcwNcrjcwOcwPcwQcwRcwScwTcwUcwVcwWcwXcwYcwZcxacxbcxccxdcxecxfcxgcvKcxfcxhcxicxjcxjcxkcvKcxlcxmcxncxocbkcxpcxqcxrcxscxtcxucxtcxvcxwcxxcxycxzcxAcsOcsOcvrcwecpMcpMcxBcpMcpMcxCcxDcxEcxEcxEcxFcxEcyUcpMbikbikbikdbFdbFdbFdbFdbFdbydcedcgdcfdbybGybGyczhcuscoAbikbikbikbikbikbikckPcxOcxPcxOcxQcxRcqUcxScwAcxTczicxTckPcxOcxOcMpckPaabbikcwGcxWcxXcwJcwJcxYcwGczjbxXcvzbzNczMbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikacGbikbikaabaabbikaabaabbikbikaabaabaabbikaqZbikbikbikaabaabcwNcrjcrjcrjcrjcrjcrjcrjcrjcybcwWcwXcyccydcyecyfcyfcyfcyfcygcyhcyicxjcyjcxjcxjcykcxjcylcymcyncyocxocbkcypcyqcyrcxscyscytcyucxscyvcywcyxcyycyzcyAcyBcyCcyDcyEcyEcAaczUcAdcAccAeczTcALceJcAhbGycAMcoAcoAcoAcoAcoAbikbikbikbikdcidchdckdcjdbydclbVibVicuscoAcoAcoAcoAcoAbikbikckPcxOcxOcxOcyZczaczbczcczdcAicAOcAvckPcAVcAYcAWckPbikbikcwGczkcwJczlcwJczmcwGbxXbxXcvzczMbwobikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikacGbikczoczpczqbikczoczpczqbikczoczpczqaabczraabbikbikbikbikaabaabaabbikbikbikbikbikbikczscwWcwXcztcxjcykczucxjcxjcxjczvcxjcztcztcxjcxjcxjcxjczwczxcymczyctEczzcoacyqcyqczAcxsczBczCczDcxsczEctWczFczGczHczIczJczKbGyczLcdcczLbGycBacAZcBccBccBccBccBPcBNcBNcBNcBNcBNcBQcoAbikbikbikbikdcidchdckdcmdcnbGyckObVicusbGybGybGycgmcoAbikbikckPcwAcwAcwAcwAczWcqUczXczYczZcCfcAbckPcCGcCYcCIckPbikbikcwGcAfcAgcDLcwJcDNcwGcEdbxXcvzbwoaabaabaabaabbikbikbikbikaahbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik @@ -8906,7 +8908,7 @@ bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbi bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikcPGcQrcQqcQTcQqcRycQUcMucRNcROcPacPacRPcMucECcRQcECcRTaaccShcRecRecRecRecSicRecRecRecRecShaaccRTcECcRUcECcECcNHcLQcRVcQFcRWcRXcRYcRZcSacRXcSacRXcSbcQJcSccNMcTbcTScTScTScTScUdcYhcYicYicYkcYjcYicYicYicYlcYncYmcQmcYobVicQmbVicYpbVicEhbwocxHcxHcxHbwocxHcxHcxHcxHbwocxHcxHcxHcxHbwobwobwobwobwobwobwobwobwobwoczMbwocyKbwocYqbxXcHycOObOMcyJcyJcLecyJbwoaabczrbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikcPGcQrcQqcQTcQTdlcdlCcMucSdcSecPacPacSfcMucSgcSmcSlaaccTfcTIcTIcTIcTIcTIcTQcTIcTIcTIcTIcTIcTZaacddaddbcSncECcSocMJcFUcSqcSrcSscStcSucSvcSwcDFcSxcSycSzcSAcNMcUkbikaabaabbikcYscYrdbwcYtcYwcYvcYycYxcYicqTbGybGycYzcdccYAcGvbGybGycYBcMncYCcYCcYCcYCcYCcYCcYCcYCcYCcYCcYCcYCcYCcYCcYDcYCcYCcYCcYCcmvcyJbFecnGbxXcYEczMbwobwobwocLebwocOObOMcyJcYFbxXbxXbwobikaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikcPGcQrcQqdldcQqdlfdlecMucRzcOZcPacPacSCcMucSDcSEcSEbikddcaacaacaacaacaacaacaacaacaacaacaacddcbikcSEcSEcSDcECcMHcLQcSAcSFcSGcSHcSIcSJcSAcSHcSAcJEcSAcJEcSAcNMcUkbikacGacGacGcYhcYGcYIcYHcYKcYJcYMcYLcYibGybGybVicQmcYNbVicGvcGqcFicYPcYOcYQcYQcYQcYQcYQcYQcYScYRcYQcYQcYQcYQcYQcYQcYUcYTcYWcYVcYYcYXcYZcYZcYZcYZcZbcZacZccYZcYZcYZcYZcZdbXScyJcOPbxXcZebwobikaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdlgcOhcOhcOhcOhcOhdlhcMucSLcSMcPacPacSNcMucSOcSPdddaabddcaaccSQbikbikbikbikcSQbikbikcSQaacddcbikddecSRcSScECcMHcECaabcSTaabcSUcSVcSWcSXcSYcSXcSZcSXcSZcUmcUqcUkbikacGaabbikcYhcZfcYIcZgcZicZhcZkcZjcYicZlbGybGycGvcZmbVicGvcGvcZncoAcoAcxHcxHcxHcxHbwocxHcxHcxHcxHbwocxHcxHcxHcxHbwocZobxXcyJcJMbxXcyJcyJcxHcxHckVcyJcZpbxXcZpcyJcZrcZqcoVbwobwobwobwobwobikaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdlgcOhcOhcOhcOhcOhdlhcMucSLcSMcPacPacSNcMucSOcSPdddaabddcaaccSQbikbikbikbikcSQbikbikcSQaacddcbikddecSRcSScECcMHcECaabcSTaabcSUcSVcSWcSXcSYcSXcSZcSXcSZcUmcUqcUkbikacGaabbikcYhcZfcYIcZgcZicZhcZkcZjcYicZlbGybGycGvcZmbVicGvcGvcZncoAcoAcxHcxHcxHcxHbwocxHcxHcxHcxHbwocxHcxHcxHcxHbwocZobxXcyJcJMbxXcyJcyJcxHcxHckVcyJcZpbxXcZpcyJdlGbOMcoVbwobwobwobwobwobikaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikcMucTccSMcPacPacSCcMucTdcSEcTebikddfddgbikbikbikbikbikdlmbikbikbikdlodlnbikcSEcSEcTdcECcMHcECcCKcTgcEVcTgcCKcTgcEVcTgcCKcThcEVcTicCKaabcUkbikacGaabaabcYhcZscZucZtcZvcZhcZxcZwcZycYPcZAcZzcGvcdcbGycZBcQmbVicoAbikbikbikbikbikaabbikbikbikbikbikbikbikbikbikbwocZCczfcyJcZDbxXcyJbikbikbikbikcyJbxXbxXcNRcqecqecqfcqgcqebikaabaabaabaabcZEaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikcMucTjcOZcPacPacTkcMucTlcTmcSEbikddcaacbikbikaabaabaabaabaabbikbikaacddcbikcSEcTncTocECcTpcECcCKcTqcTrcTscCKcTtcTucTvcCKcTwcTxcTycCKaabcUkbikacGbikaabcZGcZFcZucZHcZJcZIcZLcZKcYicZMcQmbVicQmcZNbVicZOcQmcozcoAcoDcoDcoDazybikaabbikbikbikbikbikbikbikbikbikbwocZPcyJcyJcHxbxXcyJcyJcxHcxHcyJcyJbxXcZQczfcqecrecrfcrgcqebikbikaabaabbikaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaaccMucMucMucMucMucMucMucECcSDcSEbikddcaaccSQaabaabdlqdlpdlraabcTzbikaacddcbikcSEcSDcECcECcMHcECcCKcTAcTBcTAcCKcTCcTDcTCcCKcTEcTFcTEcCKaabcUkbikacGbikbikcYhcZRcZTcZScZucZUcZWcZVcYicZXcZZcZYdaacAhbGycGvcGvdabdaddacbGydaeazybikaabbikcxHcxHcxHbwobwobwobwobwobwodafcyKcyJdagbxXbxXcyJbxXbxXbxXbxXcYqbxXcPAcqecrZcsacsbcqeaabbikbikbikbikaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik diff --git a/_maps/map_files/cyberiad/z5.dmm b/_maps/map_files/cyberiad/z5.dmm index c41d5510d50..af58d082f53 100644 --- a/_maps/map_files/cyberiad/z5.dmm +++ b/_maps/map_files/cyberiad/z5.dmm @@ -220,7 +220,6 @@ "el" = (/obj/docking_port/stationary{dwidth = 3; height = 5; id = "science_away"; name = "research outpost dock"; width = 7},/turf/space,/area/space) "em" = (/obj/machinery/firealarm{dir = 2; pixel_y = 24},/obj/machinery/requests_console{department = "Science"; departmentType = 2; name = "Science Requests Console"; pixel_x = -30; pixel_y = 0},/turf/simulated/floor{icon_state = "white"},/area/research_outpost/hallway) "en" = (/turf/simulated/floor{icon_state = "white"},/area/research_outpost/hallway) -"eo" = (/obj/machinery/power/apc{dir = 1; name = "Outpost Lobby APC"; pixel_x = 0; pixel_y = 24},/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/turf/simulated/floor{icon_state = "white"},/area/research_outpost/hallway) "ep" = (/obj/machinery/camera{c_tag = "Research Outpost Lobby"; dir = 2; network = list("Research Outpost")},/obj/machinery/atmospherics/unary/vent_pump{dir = 4; layer = 2.4; on = 1},/obj/machinery/light{dir = 1},/obj/structure/noticeboard/anomaly{icon_state = "nboard05"; pixel_y = 32},/turf/simulated/floor{dir = 4; icon_state = "whitegreencorner"},/area/research_outpost/hallway) "eq" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/structure/sign/science{desc = "A warning sign which reads 'MASS SPECTROMETRY'"; name = "\improper MASS SPECTROMETRY"; pixel_x = 0; pixel_y = 32},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{level = 1},/turf/simulated/floor{dir = 1; icon_state = "whitegreencorner"},/area/research_outpost/hallway) "er" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{level = 1},/turf/simulated/floor{dir = 1; icon_state = "whitegreen"},/area/research_outpost/hallway) @@ -251,7 +250,6 @@ "eQ" = (/turf/simulated/floor/airless{icon_state = "damaged2"},/area/mine/abandoned) "eR" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor{icon_state = "white"},/area/research_outpost/hallway) "eS" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{icon_state = "white"},/area/research_outpost/hallway) -"eT" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor{icon_state = "white"},/area/research_outpost/hallway) "eU" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6; level = 1},/turf/simulated/floor{icon_state = "white"},/area/research_outpost/hallway) "eV" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{level = 1},/turf/simulated/floor{icon_state = "white"},/area/research_outpost/hallway) "eW" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor{icon_state = "white"},/area/research_outpost/hallway) @@ -1494,8 +1492,8 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacQcRcScTagaaaaacacacacacacacbjacacbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjacacacacaaaaaQaaaaaaaaaaaaafafafafblctcucUblcVbWcWcXcYcZdacZdbcZcZcZcZdcddbMdecLdfdgdhcpbNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadididjdkdlcqagaaaaacacacacbjbjbjacacbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjacacacacaaagaQaaaaaaaaaaaaafafafafblctdmdnbldodpdqdrdsdtdudvdwdxdydzcZdAdBbMdCdDdEdFbMbObNagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadGdHdIdJdKdLdMagagacacacacbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjacacacacaaagaQaaagagagagagafaLaLaLaLaLdNdOaLbEbEdPdQdRcZdSdTdUdVdWdXcZdYdZeaebecedeebMefafagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaegdieheiejdlekacacacacacbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjacacacacacaaaaaQaaaaaaaaaaaaaabaemeneoepeqereseteuevewexcZeyezeAeBeCeDeEeFeGeHeHeHeIeJeKeLeMeMeNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagageOePeQekacacacacbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjcsbjbjbjbjbjbjbjacacacacacacaaaaaQaaaaaaaaaaaaaaaoeReSeTeUeVeWeXeYeZfafbfcfdfefffgfhfifjfkflfmeHfnfofpfqeHfrafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaegdieheiejdlekacacacacacbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjacacacacacaaaaaQaaaaaaaaaaaaaabaemenenepeqereseteuevewexcZeyezeAeBeCeDeEeFeGeHeHeHeIeJeKeLeMeMeNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagageOePeQekacacacacbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjcsbjbjbjbjbjbjbjacacacacacacaaaaaQaaaaaaaaaaaaaaaoeReSeSeUeVeWeXeYeZfafbfcfdfefffgfhfifjfkflfmeHfnfofpfqeHfrafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagagfsftfufvekacacacbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjcsbjbjbjbjbjbjbjbjbjbjbjbjbjacacacacacaaaaaaaaaQaaaaaaaaaaaaaaaofwenfxfyfzfAfBfCfDaLfEfFfGfHfIfJfKfLfMcZfNfOfPfQfQfRfSfTfUfVafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagagfWfXfYekfZgaekekekekbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjcsbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjacacacaaaaaaaaaaaaaQaaaaaaaaaaaaaaaofwenfxfygbgcfBgdgeaLgfggcZghcZcZcZcZgicZgjgkeHglgmgngogpgqgraeaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaggsgtgugvgwgxbPdLgyekgzgAekbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjacacacaaaaaaaaaaaaaQaaaaaaelaaaaaabafwengBfygCgDfBgEgFaLgGgHgIgJgKgLgMcZgNgOgPgQgRgSgTgUgVgpefafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa diff --git a/_maps/map_files/cyberiad/z6.dmm b/_maps/map_files/cyberiad/z6.dmm index 76c9ffcb780..a0b31a10dcd 100644 --- a/_maps/map_files/cyberiad/z6.dmm +++ b/_maps/map_files/cyberiad/z6.dmm @@ -123,11 +123,9 @@ "cs" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor,/area/derelict/bridge/access) "ct" = (/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor,/area/derelict/bridge/access) "cu" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/turf/simulated/floor,/area/derelict/bridge/access) -"cv" = (/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor,/area/derelict/bridge/access) "cw" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/turf/simulated/wall,/area/derelict/bridge/access) "cx" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor,/area/derelict/bridge/access) "cy" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/cable,/turf/simulated/floor/plating/airless,/area/solar/derelict_starboard) -"cz" = (/obj/structure/cable,/obj/machinery/power/apc/noalarm{dir = 0; name = "Worn-out APC"; pixel_y = -24},/turf/simulated/floor,/area/derelict/bridge/access) "cA" = (/turf/simulated/floor/plating,/area/derelict/bridge/access) "cB" = (/obj/machinery/light/small{dir = 4},/turf/simulated/floor,/area/derelict/bridge/access) "cC" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/derelict/bridge/access) @@ -755,8 +753,8 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabkbNblblblblblcjaaaaaabXaaaaaabXaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaeaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaackckckckckckckckclckckckckcmckaaaabEbMbGaabEbMbGaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaackcncncocpcqcrckcscncnckcncnckaaaabEbMbGaabEbMbGaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaeaeaeaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaackcncnctcucucvcwcxcncnckckcmckaaaabEcybGaabEcybGaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaeaeaeaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaackcncncscncnczckcAcncBckcncnckaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaeaeaeaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaackcncnctcucucucwcxcncnckckcmckaaaabEcybGaabEcybGaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaeaeaeaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaackcncncscncncnckcAcncBckcncnckaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaeaeavavaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaackcCcCcDcEcFckckcncncAckckcGckaaababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaeaeaAaaaaaeavavavcHaeaeaeaaaAaeaeaaaaaaaaaaaaaaaaaaaaaaaaaaaackcncncscncnckckcAcncncncncnckaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaeaAcIaeaecIavavavavavcIaeaecIaAaeaeaeaaaaaaaaaaaaaacJcJaAaAaAckcKcncLcncncMcNcncncncncncnckababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa From e10610469d6d24fd2946fd634785243595942a67 Mon Sep 17 00:00:00 2001 From: Fox-McCloud Date: Fri, 1 Jan 2016 21:25:42 -0500 Subject: [PATCH 53/53] Fixes Lack of Revenant Preferences --- code/__DEFINES/role_preferences.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/__DEFINES/role_preferences.dm b/code/__DEFINES/role_preferences.dm index 86495432d0e..f65f13f4f9f 100644 --- a/code/__DEFINES/role_preferences.dm +++ b/code/__DEFINES/role_preferences.dm @@ -65,5 +65,6 @@ var/global/list/special_roles = list( ROLE_DEMON, ROLE_SENTIENT, ROLE_POSIBRAIN, + ROLE_REVENANT, ROLE_GUARDIAN, )