From f581ee258cf2a5263745bfb8dae0c121b98bad82 Mon Sep 17 00:00:00 2001 From: Chiefwaffles Date: Tue, 7 Jul 2015 16:30:37 -0700 Subject: [PATCH 01/24] Underlings are now told who their head is When heads are present at roundstart, or latejoin the round, all their alive underlings will be notified. --- code/controllers/subsystem/jobs.dm | 1 + code/game/jobs/job/captain.dm | 2 ++ code/game/jobs/job/engineering.dm | 2 ++ code/game/jobs/job/job.dm | 11 ++++++++++- code/game/jobs/job/medical.dm | 2 ++ code/game/jobs/job/science.dm | 2 ++ code/game/jobs/job/security.dm | 2 ++ html/changelogs/Chiefwaffles-Who_is_my_boss.yml | 6 ++++++ 8 files changed, 27 insertions(+), 1 deletion(-) create mode 100644 html/changelogs/Chiefwaffles-Who_is_my_boss.yml diff --git a/code/controllers/subsystem/jobs.dm b/code/controllers/subsystem/jobs.dm index 5f85d3f162c..c8495566dd4 100644 --- a/code/controllers/subsystem/jobs.dm +++ b/code/controllers/subsystem/jobs.dm @@ -390,6 +390,7 @@ var/datum/subsystem/job/SSjob else //We ran out of spare locker spawns! break + /datum/subsystem/job/proc/LoadJobs(jobsfile) //ran during round setup, reads info from jobs.txt -- Urist if(!config.load_jobs_from_txt) return 0 diff --git a/code/game/jobs/job/captain.dm b/code/game/jobs/job/captain.dm index f94c21e1d2f..5a2c960e1ea 100644 --- a/code/game/jobs/job/captain.dm +++ b/code/game/jobs/job/captain.dm @@ -95,3 +95,5 @@ Head of Personnel else H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/ids(H.back), slot_in_backpack) H.equip_to_slot_or_del(new /obj/item/weapon/melee/classic_baton/telescopic(H), slot_in_backpack) + + announce_head(H.mind) //tell underlings they have a head \ No newline at end of file diff --git a/code/game/jobs/job/engineering.dm b/code/game/jobs/job/engineering.dm index 8c8c69ce873..7ec90b356c1 100644 --- a/code/game/jobs/job/engineering.dm +++ b/code/game/jobs/job/engineering.dm @@ -42,6 +42,8 @@ Chief Engineer if(H.backbag == 2 || H.backbag == 3) H.equip_to_slot_or_del(new /obj/item/weapon/melee/classic_baton/telescopic(H), slot_in_backpack) + announce_head(H.mind) //tell underlings they have a head + /* Station Engineer */ diff --git a/code/game/jobs/job/job.dm b/code/game/jobs/job/job.dm index 93c43bd653d..773d861feda 100644 --- a/code/game/jobs/job/job.dm +++ b/code/game/jobs/job/job.dm @@ -171,4 +171,13 @@ return max(0, minimal_player_age - C.player_age) /datum/job/proc/config_check() - return 1 \ No newline at end of file + return 1 + +/datum/job/proc/announce_head(var/datum/mind/o_mind) //Announces to underlings of the mind's assigned job that the mind is their head. + for(var/datum/mind/p_mind in ticker.minds) + if(p_mind.current && p_mind.current.stat != DEAD) + var/datum/job/p_job = SSjob.GetJob(p_mind.assigned_role) + if(p_job.department_head) + for(var/head in p_job.department_head) + if(head == o_mind.assigned_role) + p_mind.current << "[o_mind.name] is your department head! " \ No newline at end of file diff --git a/code/game/jobs/job/medical.dm b/code/game/jobs/job/medical.dm index 6e11a228224..698401ecc9c 100644 --- a/code/game/jobs/job/medical.dm +++ b/code/game/jobs/job/medical.dm @@ -38,6 +38,8 @@ Chief Medical Officer if(H.backbag == 2 || H.backbag == 3) H.equip_to_slot_or_del(new /obj/item/weapon/melee/classic_baton/telescopic(H), slot_in_backpack) + announce_head(H.mind) //tell underlings they have a head + /* Medical Doctor */ diff --git a/code/game/jobs/job/science.dm b/code/game/jobs/job/science.dm index 27451f9dedd..e57f6903bde 100644 --- a/code/game/jobs/job/science.dm +++ b/code/game/jobs/job/science.dm @@ -40,6 +40,8 @@ Research Director if(H.backbag == 2 || H.backbag == 3) H.equip_to_slot_or_del(new /obj/item/weapon/melee/classic_baton/telescopic(H), slot_in_backpack) + announce_head(H.mind) //tell underlings they have a head + /* Scientist */ diff --git a/code/game/jobs/job/security.dm b/code/game/jobs/job/security.dm index 12c9fec1d69..6daa0d5a3b0 100644 --- a/code/game/jobs/job/security.dm +++ b/code/game/jobs/job/security.dm @@ -55,6 +55,8 @@ Head of Security L.implanted = 1 H.sec_hud_set_implants() + announce_head(H.mind) //tell underlings they have a head + /* Warden */ diff --git a/html/changelogs/Chiefwaffles-Who_is_my_boss.yml b/html/changelogs/Chiefwaffles-Who_is_my_boss.yml new file mode 100644 index 00000000000..4cc98fd9d8e --- /dev/null +++ b/html/changelogs/Chiefwaffles-Who_is_my_boss.yml @@ -0,0 +1,6 @@ +author: Chiefwaffles + +delete-after: True + +changes: + - rscadd: "Department Heads, on arrival, (latejoin or start) now have their name announced to their underlings." From 9e20546b40df357fd06219b0092b222243fa7a39 Mon Sep 17 00:00:00 2001 From: Chiefwaffles Date: Tue, 7 Jul 2015 20:39:00 -0700 Subject: [PATCH 02/24] Made message 'boldannounce' and added rank before name The span class of the message is now "boldannounce", and the rank of your head is given before their name. --- code/game/jobs/job/job.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/jobs/job/job.dm b/code/game/jobs/job/job.dm index 773d861feda..b0bc8029941 100644 --- a/code/game/jobs/job/job.dm +++ b/code/game/jobs/job/job.dm @@ -180,4 +180,4 @@ if(p_job.department_head) for(var/head in p_job.department_head) if(head == o_mind.assigned_role) - p_mind.current << "[o_mind.name] is your department head! " \ No newline at end of file + p_mind.current << "[head] [o_mind.name] is your department head! " \ No newline at end of file From ea8f1a24d63b35615559a075124478dfd8712a15 Mon Sep 17 00:00:00 2001 From: Chiefwaffles Date: Wed, 8 Jul 2015 16:48:08 -0700 Subject: [PATCH 03/24] Radically changes branch to work similar to AI late-join announcements in that the AI broadcasts the message to the respective department. --- code/game/jobs/job/captain.dm | 3 ++- code/game/jobs/job/engineering.dm | 3 ++- code/game/jobs/job/job.dm | 16 ++++++++-------- code/game/jobs/job/medical.dm | 3 ++- code/game/jobs/job/science.dm | 3 ++- code/game/jobs/job/security.dm | 3 ++- 6 files changed, 18 insertions(+), 13 deletions(-) diff --git a/code/game/jobs/job/captain.dm b/code/game/jobs/job/captain.dm index 5a2c960e1ea..37cc2630220 100644 --- a/code/game/jobs/job/captain.dm +++ b/code/game/jobs/job/captain.dm @@ -96,4 +96,5 @@ Head of Personnel H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/ids(H.back), slot_in_backpack) H.equip_to_slot_or_del(new /obj/item/weapon/melee/classic_baton/telescopic(H), slot_in_backpack) - announce_head(H.mind) //tell underlings they have a head \ No newline at end of file + spawn(2) //to wait for initialization stuff + announce_head(H.mind, list(":u", ":v")) //tell underlings (cargo and service radio) they have a head \ No newline at end of file diff --git a/code/game/jobs/job/engineering.dm b/code/game/jobs/job/engineering.dm index 7ec90b356c1..5200efc6f39 100644 --- a/code/game/jobs/job/engineering.dm +++ b/code/game/jobs/job/engineering.dm @@ -42,7 +42,8 @@ Chief Engineer if(H.backbag == 2 || H.backbag == 3) H.equip_to_slot_or_del(new /obj/item/weapon/melee/classic_baton/telescopic(H), slot_in_backpack) - announce_head(H.mind) //tell underlings they have a head + spawn(2) //to wait for initialization stuff + announce_head(H.mind, list(":e")) //tell underlings (engineering radio) they have a head /* Station Engineer diff --git a/code/game/jobs/job/job.dm b/code/game/jobs/job/job.dm index b0bc8029941..8b5a32d0e94 100644 --- a/code/game/jobs/job/job.dm +++ b/code/game/jobs/job/job.dm @@ -173,11 +173,11 @@ /datum/job/proc/config_check() return 1 -/datum/job/proc/announce_head(var/datum/mind/o_mind) //Announces to underlings of the mind's assigned job that the mind is their head. - for(var/datum/mind/p_mind in ticker.minds) - if(p_mind.current && p_mind.current.stat != DEAD) - var/datum/job/p_job = SSjob.GetJob(p_mind.assigned_role) - if(p_job.department_head) - for(var/head in p_job.department_head) - if(head == o_mind.assigned_role) - p_mind.current << "[head] [o_mind.name] is your department head! " \ No newline at end of file +/datum/job/proc/announce_head(var/datum/mind/o_mind, var/channel) //tells the given channel that the given mind is the new department head. Channel must be given like so: ":n" for science, etc. + var/ailist[] = list() + for (var/mob/living/silicon/ai/A in living_mob_list) + ailist += A + if (ailist.len) + for(var/a_channel in channel) + var/mob/living/silicon/ai/announcer = pick(ailist) + announcer.say("[a_channel] [o_mind.name], [o_mind.assigned_role], is the new department head.") \ No newline at end of file diff --git a/code/game/jobs/job/medical.dm b/code/game/jobs/job/medical.dm index 698401ecc9c..1c3047ce249 100644 --- a/code/game/jobs/job/medical.dm +++ b/code/game/jobs/job/medical.dm @@ -38,7 +38,8 @@ Chief Medical Officer if(H.backbag == 2 || H.backbag == 3) H.equip_to_slot_or_del(new /obj/item/weapon/melee/classic_baton/telescopic(H), slot_in_backpack) - announce_head(H.mind) //tell underlings they have a head + spawn(2) //to wait for initialization stuff + announce_head(H.mind, list(":m")) //tell underlings (medical radio) they have a head /* Medical Doctor diff --git a/code/game/jobs/job/science.dm b/code/game/jobs/job/science.dm index e57f6903bde..60a54359744 100644 --- a/code/game/jobs/job/science.dm +++ b/code/game/jobs/job/science.dm @@ -40,7 +40,8 @@ Research Director if(H.backbag == 2 || H.backbag == 3) H.equip_to_slot_or_del(new /obj/item/weapon/melee/classic_baton/telescopic(H), slot_in_backpack) - announce_head(H.mind) //tell underlings they have a head + spawn(2) //to wait for initialization stuff + announce_head(H.mind, list(":n")) //tell underlings (science radio) they have a head /* Scientist diff --git a/code/game/jobs/job/security.dm b/code/game/jobs/job/security.dm index 6daa0d5a3b0..a21d907aa7b 100644 --- a/code/game/jobs/job/security.dm +++ b/code/game/jobs/job/security.dm @@ -55,7 +55,8 @@ Head of Security L.implanted = 1 H.sec_hud_set_implants() - announce_head(H.mind) //tell underlings they have a head + spawn(2) //to wait for initialization stuff + announce_head(H.mind, list(":s")) //tell underlings (security radio) they have a head /* Warden From cbfe3c65bd138c40ebd5be6199308aa021e29dea Mon Sep 17 00:00:00 2001 From: Chiefwaffles Date: Sun, 12 Jul 2015 19:00:33 -0700 Subject: [PATCH 04/24] Adds Automated Announcement System, makes head-announcement from previous branch (who_is_my_boss) work with it instead of AI radio. --- code/game/jobs/job/captain.dm | 3 +-- code/game/jobs/job/engineering.dm | 3 +-- code/game/jobs/job/job.dm | 13 +++++-------- code/game/jobs/job/medical.dm | 3 +-- code/game/jobs/job/science.dm | 3 +-- code/game/jobs/job/security.dm | 3 +-- .../objects/structures/announcement_system.dm | 18 ++++++++++++++++++ 7 files changed, 28 insertions(+), 18 deletions(-) create mode 100644 code/game/objects/structures/announcement_system.dm diff --git a/code/game/jobs/job/captain.dm b/code/game/jobs/job/captain.dm index 37cc2630220..d594bb01f70 100644 --- a/code/game/jobs/job/captain.dm +++ b/code/game/jobs/job/captain.dm @@ -96,5 +96,4 @@ Head of Personnel H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/ids(H.back), slot_in_backpack) H.equip_to_slot_or_del(new /obj/item/weapon/melee/classic_baton/telescopic(H), slot_in_backpack) - spawn(2) //to wait for initialization stuff - announce_head(H.mind, list(":u", ":v")) //tell underlings (cargo and service radio) they have a head \ No newline at end of file + announce_head(H.mind, list("Supply", "Service")) //tell underlings (cargo and service radio) they have a head \ No newline at end of file diff --git a/code/game/jobs/job/engineering.dm b/code/game/jobs/job/engineering.dm index 5200efc6f39..3f7f9ec8874 100644 --- a/code/game/jobs/job/engineering.dm +++ b/code/game/jobs/job/engineering.dm @@ -42,8 +42,7 @@ Chief Engineer if(H.backbag == 2 || H.backbag == 3) H.equip_to_slot_or_del(new /obj/item/weapon/melee/classic_baton/telescopic(H), slot_in_backpack) - spawn(2) //to wait for initialization stuff - announce_head(H.mind, list(":e")) //tell underlings (engineering radio) they have a head + announce_head(H.mind, list("Engineering")) //tell underlings (engineering radio) they have a head /* Station Engineer diff --git a/code/game/jobs/job/job.dm b/code/game/jobs/job/job.dm index 8b5a32d0e94..8af3a6b897b 100644 --- a/code/game/jobs/job/job.dm +++ b/code/game/jobs/job/job.dm @@ -173,11 +173,8 @@ /datum/job/proc/config_check() return 1 -/datum/job/proc/announce_head(var/datum/mind/o_mind, var/channel) //tells the given channel that the given mind is the new department head. Channel must be given like so: ":n" for science, etc. - var/ailist[] = list() - for (var/mob/living/silicon/ai/A in living_mob_list) - ailist += A - if (ailist.len) - for(var/a_channel in channel) - var/mob/living/silicon/ai/announcer = pick(ailist) - announcer.say("[a_channel] [o_mind.name], [o_mind.assigned_role], is the new department head.") \ No newline at end of file +/datum/job/proc/announce_head(var/datum/mind/o_mind, var/channels) //tells the given channel that the given mind is the new department head. See communications.dm for valid channels. + sleep(2) //to allow some initialization + if(announcement_systems.len) + var/obj/structure/announcement_system/announcer = pick(announcement_systems) + announcer.announce("[o_mind.name], [o_mind.assigned_role], is the new department head.", channels) \ No newline at end of file diff --git a/code/game/jobs/job/medical.dm b/code/game/jobs/job/medical.dm index 1c3047ce249..b4fcbd2a57b 100644 --- a/code/game/jobs/job/medical.dm +++ b/code/game/jobs/job/medical.dm @@ -38,8 +38,7 @@ Chief Medical Officer if(H.backbag == 2 || H.backbag == 3) H.equip_to_slot_or_del(new /obj/item/weapon/melee/classic_baton/telescopic(H), slot_in_backpack) - spawn(2) //to wait for initialization stuff - announce_head(H.mind, list(":m")) //tell underlings (medical radio) they have a head + announce_head(H.mind, list("Medical")) //tell underlings (medical radio) they have a head /* Medical Doctor diff --git a/code/game/jobs/job/science.dm b/code/game/jobs/job/science.dm index 60a54359744..184622d8414 100644 --- a/code/game/jobs/job/science.dm +++ b/code/game/jobs/job/science.dm @@ -40,8 +40,7 @@ Research Director if(H.backbag == 2 || H.backbag == 3) H.equip_to_slot_or_del(new /obj/item/weapon/melee/classic_baton/telescopic(H), slot_in_backpack) - spawn(2) //to wait for initialization stuff - announce_head(H.mind, list(":n")) //tell underlings (science radio) they have a head + announce_head(H.mind, list("Science")) //tell underlings (science radio) they have a head /* Scientist diff --git a/code/game/jobs/job/security.dm b/code/game/jobs/job/security.dm index a21d907aa7b..40d9763c144 100644 --- a/code/game/jobs/job/security.dm +++ b/code/game/jobs/job/security.dm @@ -55,8 +55,7 @@ Head of Security L.implanted = 1 H.sec_hud_set_implants() - spawn(2) //to wait for initialization stuff - announce_head(H.mind, list(":s")) //tell underlings (security radio) they have a head + announce_head(H.mind, list("Security")) //tell underlings (security radio) they have a head /* Warden diff --git a/code/game/objects/structures/announcement_system.dm b/code/game/objects/structures/announcement_system.dm new file mode 100644 index 00000000000..093cf51e055 --- /dev/null +++ b/code/game/objects/structures/announcement_system.dm @@ -0,0 +1,18 @@ +var/list/announcement_systems = list() + +/obj/structure/announcement_system + density = 1 + anchored = 1 + name = "\improper Automated Announcement System" + icon = 'icons/obj/radio.dmi' + icon_state = "beacon" + var/obj/item/device/radio/headset/radio + +/obj/structure/announcement_system/New() + announcement_systems += src + radio = new /obj/item/device/radio/headset/ai(src) + +/obj/structure/announcement_system/proc/announce(message, channels) + for(var/channel in channels) + world << "Talking into radio. Message: [message]. Channel: [channel]." + radio.talk_into(src, message, channel, list(SPAN_ROBOT)) \ No newline at end of file From af1a720fcf550628bb94a101974a8bda824b490d Mon Sep 17 00:00:00 2001 From: Chiefwaffles Date: Sun, 12 Jul 2015 20:40:53 -0700 Subject: [PATCH 05/24] Add description, change density. --- code/game/objects/structures/announcement_system.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/game/objects/structures/announcement_system.dm b/code/game/objects/structures/announcement_system.dm index 093cf51e055..325a465dac0 100644 --- a/code/game/objects/structures/announcement_system.dm +++ b/code/game/objects/structures/announcement_system.dm @@ -1,9 +1,10 @@ var/list/announcement_systems = list() /obj/structure/announcement_system - density = 1 + density = 0 anchored = 1 name = "\improper Automated Announcement System" + desc = "An automated announcement system that handles minor announcements over the radio." icon = 'icons/obj/radio.dmi' icon_state = "beacon" var/obj/item/device/radio/headset/radio @@ -14,5 +15,4 @@ var/list/announcement_systems = list() /obj/structure/announcement_system/proc/announce(message, channels) for(var/channel in channels) - world << "Talking into radio. Message: [message]. Channel: [channel]." radio.talk_into(src, message, channel, list(SPAN_ROBOT)) \ No newline at end of file From 38e8ae883e4ddd6f00225248285fa90684d05861 Mon Sep 17 00:00:00 2001 From: Chiefwaffles Date: Sun, 12 Jul 2015 21:29:55 -0700 Subject: [PATCH 06/24] Added the AAS to TComms. --- _maps/map_files/TgStation/tgstation.2.1.3.dmm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_maps/map_files/TgStation/tgstation.2.1.3.dmm b/_maps/map_files/TgStation/tgstation.2.1.3.dmm index 96db2ec9155..9545d8b0b42 100644 --- a/_maps/map_files/TgStation/tgstation.2.1.3.dmm +++ b/_maps/map_files/TgStation/tgstation.2.1.3.dmm @@ -5416,7 +5416,7 @@ "cah" = (/obj/machinery/telecomms/broadcaster/preset_left,/turf/simulated/floor/bluegrid{icon_state = "dark"; name = "Mainframe Floor"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/server) "cai" = (/obj/machinery/telecomms/receiver/preset_left,/turf/simulated/floor/bluegrid{icon_state = "dark"; name = "Mainframe Floor"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/server) "caj" = (/obj/structure/table,/obj/item/device/multitool,/turf/simulated/floor/plasteel{dir = 9; icon_state = "yellow"},/area/tcommsat/computer) -"cak" = (/obj/machinery/light_switch{pixel_x = 27},/turf/simulated/floor/plasteel,/area/tcommsat/computer) +"cak" = (/obj/machinery/light_switch{pixel_x = 27},/obj/structure/announcement_system,/turf/simulated/floor/plasteel,/area/tcommsat/computer) "cal" = (/turf/simulated/floor/plasteel{dir = 9; icon_state = "yellow"},/area/hallway/primary/aft) "cam" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{dir = 1; icon_state = "yellow"},/area/hallway/primary/aft) "can" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{dir = 1; icon_state = "yellowcorner"},/area/hallway/primary/aft) From 14fb54ce8d34ccaa810faf6d75490b59fd044fe9 Mon Sep 17 00:00:00 2001 From: Chiefwaffles Date: Sun, 12 Jul 2015 22:56:12 -0700 Subject: [PATCH 07/24] Adds support for common channel announcements; moves over latejoin announcement to announcement system. --- code/game/objects/structures/announcement_system.dm | 10 +++++++--- code/modules/mob/new_player/new_player.dm | 9 +++------ 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/code/game/objects/structures/announcement_system.dm b/code/game/objects/structures/announcement_system.dm index 325a465dac0..ecb18084db0 100644 --- a/code/game/objects/structures/announcement_system.dm +++ b/code/game/objects/structures/announcement_system.dm @@ -13,6 +13,10 @@ var/list/announcement_systems = list() announcement_systems += src radio = new /obj/item/device/radio/headset/ai(src) -/obj/structure/announcement_system/proc/announce(message, channels) - for(var/channel in channels) - radio.talk_into(src, message, channel, list(SPAN_ROBOT)) \ No newline at end of file +/obj/structure/announcement_system/proc/announce(var/message, list/channels) + spawn(1) //to wait for people joining, roundstart init, etc. + if(channels.len == 0) + radio.talk_into(src, message, null, list(SPAN_ROBOT)) + else + for(var/channel in channels) + radio.talk_into(src, message, channel, list(SPAN_ROBOT)) \ No newline at end of file diff --git a/code/modules/mob/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm index 009ecd8ab0f..72001d16c5d 100644 --- a/code/modules/mob/new_player/new_player.dm +++ b/code/modules/mob/new_player/new_player.dm @@ -275,14 +275,11 @@ /mob/new_player/proc/AnnounceArrival(var/mob/living/carbon/human/character, var/rank) if (ticker.current_state == GAME_STATE_PLAYING) - var/ailist[] = list() - for (var/mob/living/silicon/ai/A in living_mob_list) - ailist += A - if (ailist.len) - var/mob/living/silicon/ai/announcer = pick(ailist) + if(announcement_systems.len) if(character.mind) if((character.mind.assigned_role != "Cyborg") && (character.mind.assigned_role != character.mind.special_role)) - announcer.say("[announcer.radiomod] [character.real_name] has signed up as [rank].") + var/obj/structure/announcement_system/announcer = pick(announcement_systems) + announcer.announce("[character.real_name] has signed up as [rank].", list()) //make the list empty to make it announce it in common /mob/new_player/proc/LateChoices() var/mills = world.time // 1/10 of a second, not real milliseconds but whatever From 0cc125d24b4a1276bd6a7c63242023e263f03ed4 Mon Sep 17 00:00:00 2001 From: Chiefwaffles Date: Sun, 12 Jul 2015 23:17:48 -0700 Subject: [PATCH 08/24] Updates changelog --- html/changelogs/Chiefwaffles-Who_is_my_boss.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/html/changelogs/Chiefwaffles-Who_is_my_boss.yml b/html/changelogs/Chiefwaffles-Who_is_my_boss.yml index 4cc98fd9d8e..d823720793a 100644 --- a/html/changelogs/Chiefwaffles-Who_is_my_boss.yml +++ b/html/changelogs/Chiefwaffles-Who_is_my_boss.yml @@ -3,4 +3,4 @@ author: Chiefwaffles delete-after: True changes: - - rscadd: "Department Heads, on arrival, (latejoin or start) now have their name announced to their underlings." + - rscadd: "After realizing how often AIs tend to 'disappear', Centcomm has authorized the shipment of the Automated Announcement System to take over the AI's responsibility of announcing new arrivals." From b752fe8841413cf6448e9027a7c1350d4949c7a4 Mon Sep 17 00:00:00 2001 From: Chiefwaffles Date: Sun, 12 Jul 2015 23:29:53 -0700 Subject: [PATCH 09/24] AAAAAAH --- tgstation.dme | 1 + 1 file changed, 1 insertion(+) diff --git a/tgstation.dme b/tgstation.dme index ca68b0b100e..bb2dc8375ad 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -697,6 +697,7 @@ #include "code\game\objects\items\weapons\tanks\tanks.dm" #include "code\game\objects\items\weapons\tanks\watertank.dm" #include "code\game\objects\structures\ai_core.dm" +#include "code\game\objects\structures\announcement_system.dm" #include "code\game\objects\structures\artstuff.dm" #include "code\game\objects\structures\barsigns.dm" #include "code\game\objects\structures\bedsheet_bin.dm" From 5e27090cfb82152c64a8306861205b683cd4cd55 Mon Sep 17 00:00:00 2001 From: Chiefwaffles Date: Mon, 13 Jul 2015 14:07:27 -0700 Subject: [PATCH 10/24] indentations why Removes spawn(1) because I forgot to indent the stuff after it. --- code/game/objects/structures/announcement_system.dm | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/code/game/objects/structures/announcement_system.dm b/code/game/objects/structures/announcement_system.dm index ecb18084db0..4e55ad1265b 100644 --- a/code/game/objects/structures/announcement_system.dm +++ b/code/game/objects/structures/announcement_system.dm @@ -14,9 +14,8 @@ var/list/announcement_systems = list() radio = new /obj/item/device/radio/headset/ai(src) /obj/structure/announcement_system/proc/announce(var/message, list/channels) - spawn(1) //to wait for people joining, roundstart init, etc. if(channels.len == 0) radio.talk_into(src, message, null, list(SPAN_ROBOT)) else for(var/channel in channels) - radio.talk_into(src, message, channel, list(SPAN_ROBOT)) \ No newline at end of file + radio.talk_into(src, message, channel, list(SPAN_ROBOT)) From f2ffeee1316fc30e242620f68f115c027bf3fabf Mon Sep 17 00:00:00 2001 From: Chiefwaffles Date: Mon, 13 Jul 2015 14:09:09 -0700 Subject: [PATCH 11/24] Removes "new" from head announcements --- code/game/jobs/job/job.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/jobs/job/job.dm b/code/game/jobs/job/job.dm index 8af3a6b897b..a2363424534 100644 --- a/code/game/jobs/job/job.dm +++ b/code/game/jobs/job/job.dm @@ -177,4 +177,4 @@ sleep(2) //to allow some initialization if(announcement_systems.len) var/obj/structure/announcement_system/announcer = pick(announcement_systems) - announcer.announce("[o_mind.name], [o_mind.assigned_role], is the new department head.", channels) \ No newline at end of file + announcer.announce("[o_mind.name], [o_mind.assigned_role], is the department head.", channels) From 0059afb89c114d521a2f7ab94d7937cae97228da Mon Sep 17 00:00:00 2001 From: Chiefwaffles Date: Mon, 13 Jul 2015 17:40:58 -0700 Subject: [PATCH 12/24] Adds announcement configuration. --- code/game/jobs/job/job.dm | 2 +- .../objects/structures/announcement_system.dm | 64 ++++++++++++++++++- code/modules/mob/new_player/new_player.dm | 2 +- 3 files changed, 65 insertions(+), 3 deletions(-) diff --git a/code/game/jobs/job/job.dm b/code/game/jobs/job/job.dm index a2363424534..1ed2ee7e924 100644 --- a/code/game/jobs/job/job.dm +++ b/code/game/jobs/job/job.dm @@ -177,4 +177,4 @@ sleep(2) //to allow some initialization if(announcement_systems.len) var/obj/structure/announcement_system/announcer = pick(announcement_systems) - announcer.announce("[o_mind.name], [o_mind.assigned_role], is the department head.", channels) + announcer.announce("NEWHEAD", o_mind.name, o_mind.assigned_role, channels) diff --git a/code/game/objects/structures/announcement_system.dm b/code/game/objects/structures/announcement_system.dm index 4e55ad1265b..c91f2a64c70 100644 --- a/code/game/objects/structures/announcement_system.dm +++ b/code/game/objects/structures/announcement_system.dm @@ -9,13 +9,75 @@ var/list/announcement_systems = list() icon_state = "beacon" var/obj/item/device/radio/headset/radio + var/arrival = "%PERSON has signed up as %RANK" + var/newhead = "%PERSON, %RANK, is the department head." + /obj/structure/announcement_system/New() announcement_systems += src radio = new /obj/item/device/radio/headset/ai(src) -/obj/structure/announcement_system/proc/announce(var/message, list/channels) +/obj/structure/announcement_system/proc/CompileText(str, user, rank) //replaces user-given variables with actual thingies. + str = replacetext(str, "%PERSON", "[user]") + str = replacetext(str, "%RANK", "[rank]") + return str + +/obj/structure/announcement_system/proc/announce(message_type, user, rank, list/channels) + var/message + + if(message_type == "ARRIVAL") + message = CompileText(arrival, user, rank) + else if(message_type == "NEWHEAD") + message = CompileText(newhead, user, rank) + if(channels.len == 0) radio.talk_into(src, message, null, list(SPAN_ROBOT)) else for(var/channel in channels) radio.talk_into(src, message, channel, list(SPAN_ROBOT)) + +//config stuff + +/obj/structure/announcement_system/proc/Interact(mob/user) + var/contents = "Arrival Announcement:
\n[arrival]
\n" + contents += "Departmental Head Announcement:
\n[newhead]
\n" + + var/datum/browser/popup = new(user, "announcement_config", "Automated Announcement Configuration", 340, 220) + popup.set_content(contents) + popup.open() + +/obj/structure/announcement_system/Topic(href, href_list) + if(usr.lying || usr.stat || usr.stunned || (!Adjacent(usr)) && !isAI(usr)) + return + + var/mob/living/living_user = usr + var/obj/item/item_in_hand = living_user.get_active_hand() + if(!istype(item_in_hand, /obj/item/device/multitool) && !isAI(usr)) + living_user << "You need a multitool!" + return + + if(href_list["ArrivalTopic"]) + var/NewMessage = stripped_input(usr, "Enter in the arrivals announcement configuration.", "Arrivals Announcement Config", arrival) + if(!in_range(src, usr) && src.loc != usr && !isAI(usr)) + return + if(NewMessage) + arrival = NewMessage + else if(href_list["NewheadTopic"]) + var/NewMessage = stripped_input(usr, "Enter in the departmental head announcement configuration.", "Arrivals Announcement Config", newhead) + if(!in_range(src, usr) && src.loc != usr && !isAI(usr)) + return + if(NewMessage) + newhead = NewMessage + + add_fingerprint(usr) + Interact(usr) + return + +/obj/structure/announcement_system/attackby(obj/item/W, mob/user, params) + ..() + if (istype(W, /obj/item/device/multitool)) + Interact(user) + +/obj/structure/announcement_system/attack_ai(var/mob/living/silicon/ai/user) + if(!isAI(user)) + return + Interact(user) \ No newline at end of file diff --git a/code/modules/mob/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm index 72001d16c5d..287aca6880b 100644 --- a/code/modules/mob/new_player/new_player.dm +++ b/code/modules/mob/new_player/new_player.dm @@ -279,7 +279,7 @@ if(character.mind) if((character.mind.assigned_role != "Cyborg") && (character.mind.assigned_role != character.mind.special_role)) var/obj/structure/announcement_system/announcer = pick(announcement_systems) - announcer.announce("[character.real_name] has signed up as [rank].", list()) //make the list empty to make it announce it in common + announcer.announce("ARRIVAL", character.real_name, rank, list()) //make the list empty to make it announce it in common /mob/new_player/proc/LateChoices() var/mills = world.time // 1/10 of a second, not real milliseconds but whatever From aa2329ce964bba67ec91fd27f9f10ce474024da6 Mon Sep 17 00:00:00 2001 From: Chiefwaffles Date: Mon, 13 Jul 2015 17:42:44 -0700 Subject: [PATCH 13/24] Update changelog So players know about config thing now. --- html/changelogs/Chiefwaffles-Who_is_my_boss.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/html/changelogs/Chiefwaffles-Who_is_my_boss.yml b/html/changelogs/Chiefwaffles-Who_is_my_boss.yml index d823720793a..02d58a3ad89 100644 --- a/html/changelogs/Chiefwaffles-Who_is_my_boss.yml +++ b/html/changelogs/Chiefwaffles-Who_is_my_boss.yml @@ -4,3 +4,4 @@ delete-after: True changes: - rscadd: "After realizing how often AIs tend to 'disappear', Centcomm has authorized the shipment of the Automated Announcement System to take over the AI's responsibility of announcing new arrivals." + - rscadd: "In addition, you can now configure the radio announcements by using a multitool on the AAS. AIs can manipulate the messages as well." From 493fcf44c1c945ce663af68a711b6e4709b712f4 Mon Sep 17 00:00:00 2001 From: Chiefwaffles Date: Tue, 14 Jul 2015 17:33:37 -0700 Subject: [PATCH 14/24] Moves AAS to /obj/machinery, adds power usage, deconstruction(/construction?) and new sprite. --- _maps/map_files/TgStation/tgstation.2.1.3.dmm | 8 +-- code/game/jobs/job/job.dm | 2 +- .../announcement_system.dm | 62 ++++++++++++++---- code/modules/mob/new_player/new_player.dm | 2 +- icons/obj/machines/announcement_system.dmi | Bin 0 -> 1349 bytes tgstation.dme | 2 +- 6 files changed, 55 insertions(+), 21 deletions(-) rename code/game/{objects/structures => machinery}/announcement_system.dm (57%) create mode 100644 icons/obj/machines/announcement_system.dmi diff --git a/_maps/map_files/TgStation/tgstation.2.1.3.dmm b/_maps/map_files/TgStation/tgstation.2.1.3.dmm index 9545d8b0b42..a81b4e76482 100644 --- a/_maps/map_files/TgStation/tgstation.2.1.3.dmm +++ b/_maps/map_files/TgStation/tgstation.2.1.3.dmm @@ -5416,7 +5416,7 @@ "cah" = (/obj/machinery/telecomms/broadcaster/preset_left,/turf/simulated/floor/bluegrid{icon_state = "dark"; name = "Mainframe Floor"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/server) "cai" = (/obj/machinery/telecomms/receiver/preset_left,/turf/simulated/floor/bluegrid{icon_state = "dark"; name = "Mainframe Floor"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/server) "caj" = (/obj/structure/table,/obj/item/device/multitool,/turf/simulated/floor/plasteel{dir = 9; icon_state = "yellow"},/area/tcommsat/computer) -"cak" = (/obj/machinery/light_switch{pixel_x = 27},/obj/structure/announcement_system,/turf/simulated/floor/plasteel,/area/tcommsat/computer) +"cak" = (/obj/machinery/light{dir = 1},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/machinery/announcement_system,/turf/simulated/floor/plasteel,/area/tcommsat/computer) "cal" = (/turf/simulated/floor/plasteel{dir = 9; icon_state = "yellow"},/area/hallway/primary/aft) "cam" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{dir = 1; icon_state = "yellow"},/area/hallway/primary/aft) "can" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{dir = 1; icon_state = "yellowcorner"},/area/hallway/primary/aft) @@ -6262,7 +6262,7 @@ "cqv" = (/turf/simulated/floor/plasteel{icon_state = "dark"},/area/aisat) "cqw" = (/obj/machinery/door/airlock/hatch{name = "Teleporter Room"; req_access_txt = "17;65"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/aisat) "cqx" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/wall/r_wall,/area/tcommsat/computer) -"cqy" = (/obj/machinery/light{dir = 1},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/plasteel,/area/tcommsat/computer) +"cqy" = (/obj/machinery/light_switch{pixel_x = 27},/turf/simulated/floor/plasteel,/area/tcommsat/computer) "cqz" = (/obj/structure/closet/crate/freezer,/obj/item/weapon/reagent_containers/blood/empty,/obj/item/weapon/reagent_containers/blood/empty{pixel_x = -3; pixel_y = -3},/obj/item/weapon/reagent_containers/blood/AMinus,/obj/item/weapon/reagent_containers/blood/BMinus{pixel_x = -4; pixel_y = 4},/obj/item/weapon/reagent_containers/blood/BPlus{pixel_x = 1; pixel_y = 2},/obj/item/weapon/reagent_containers/blood/OMinus,/obj/item/weapon/reagent_containers/blood/OPlus{pixel_x = -2; pixel_y = -1},/obj/item/weapon/reagent_containers/blood/random,/obj/item/weapon/reagent_containers/blood/random,/obj/item/weapon/reagent_containers/blood/random,/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/virology) "cqA" = (/obj/machinery/camera/emp_proof{c_tag = "Singularity West"; dir = 1; network = list("Singularity")},/turf/simulated/floor/plating/airless,/area/engine/engineering) "cqB" = (/obj/machinery/camera/emp_proof{c_tag = "Singularity East"; dir = 1; network = list("Singularity")},/turf/simulated/floor/plating/airless,/area/engine/engineering) @@ -6679,13 +6679,13 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaafaafbRzaafaafaafbBcbBcbBcbBcbBcbBcbBcbBcbBcbBcbRAbBcbBcbBcbJYbJYbJYbRBbRCbRDbREbRFbRGbRCbRHbPFbPFbPFbPFcqrbMkbMkbMkbMkbMkcqtbRKbOAbRLbKmbRMbRNbPNbRObPNbLnbMFbMFbMFbQRbRPbRQbRQbRRbRSbRTbNGbRUbRVbRWbNKbLDbNLbRXbRYbRYbMKbMLbyebKvbRZbSabSabSabSbbScbMUbSdbMUbMUbMUbPebMUbMUbMUbLFbKvbBMbCWbCWbCWbSebSfbQobSgbKKbShbSibQkbQkbSjbItbSkbSlbPlbSmbSnbPobQybSobRrbSpbOpbSqbSqbSqbPvbSrbSsbGVbjoaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabStbSubSubSubSubSvbSwbSwbSxbSybSzbSAbSBbSCbSDbSEbBcbGnbGnbGnbGnbGnbGnbGnbSFbSGbSHbSIbSJbSKbSKbSKbSKbSLbSMbSMbSMbSNcqubSObDybDybSPbBccqnbMqbOAbSQbSRbSSbSTbRQbRQbSUbSVbRQbRQbSWbSXbSYbMFbSZbTabTbbTcbMFbTdbTebTfbOUaafbOVbTgbThbTibMKbMLbNPbTjbTkbTkbTkbTlbLFbTmbQZbTnbTobTpbTqbTrbTsbTsbTtbLFbKvbBMbItbItbItbItbTubTvbRjbTwbTubItbItbItbItbItbTxbTybTzbTAbTBbTCbTCbTCbTCbTDbOmbSqbSqbTEbPvbTFbSsbGVbjobjobjoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaagaaaaafaaaaaabJYbJYbJYbGnbTHbTIbTJbTKbTLbBcbTMbJYbJYbJYbJYbJYbJYbJYbJYbDCbTNbTObTObTObTObTObTObTObTObTPbTPcqxbTPbTPbTQbTRbBccqnbMqbOAbSQbTSbTTbTUbTVbPSbTWbTXbPSbPSbTYbTZbUabUbbUcbUdbUebUfbMFbTdbUgbUhbQabQbbNLbUibRYbRYbMKbMLbNPbUjbyebyebyebNYbLFbUkbMUbMUbUlbUmbUnbVibUpbVibUnbLFbKvbBMbQjbQkbQkbUqbQmbKKbQnbQobUrbUsbCWbCWbCWbItbUtbUubUvbUwbRnbRpbUxbUybUzbUAbOpbSqbSqbSqbPvbTFbSsbGVbsebsebjoaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaagaagaagaagaagbUDbGnbUDbGnbUEbTIbTIbUFbGnbBcbGnbJYaaaaaaaafaaaaaaaafaaabDCbTNbTObUGbUHbUIbUJbUKbULbUGbUMbUNcqCcqybTPbTPbTRbBccqDbMqbOAbURbUSbUTbUTbUUbKmbKmbKmbKmbKmbUVbUWbLnbLnbLnbUXbMFbTbbMFbTdbTebUYbOUaafbMKbMKbMKbMKbMKbMLbNPbUjbyebUZbzibNYbMMbVabVbbVcbVdbVebVfbVgbUpbVgbVhbLFbKvbBMbCWcqUbCWbVjbRibKKbRjbKKbRkbVkbCWcqUbCWbItbVlbVmbVnbVobVpbVqbVrbVsbVtbVubOmbVvbVwbVxbPvbSqbSsbHzbjobsebjobjobjoaagaagaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaagaagaagaagaagbUDbGnbUDbGnbUEbTIbTIbUFbGnbBcbGnbJYaaaaaaaafaaaaaaaafaaabDCbTNbTObUGbUHbUIbUJbUKbULbUGbUMbUNcqCcakbTPbTPbTRbBccqDbMqbOAbURbUSbUTbUTbUUbKmbKmbKmbKmbKmbUVbUWbLnbLnbLnbUXbMFbTbbMFbTdbTebUYbOUaafbMKbMKbMKbMKbMKbMLbNPbUjbyebUZbzibNYbMMbVabVbbVcbVdbVebVfbVgbUpbVgbVhbLFbKvbBMbCWcqUbCWbVjbRibKKbRjbKKbRkbVkbCWcqUbCWbItbVlbVmbVnbVobVpbVqbVrbVsbVtbVubOmbVvbVwbVxbPvbSqbSsbHzbjobsebjobjobjoaagaagaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafbJYbJYbJYbVzbVAbVBbVCbVDbGnbVEbGnbJYaaaaaaaafaaaaaaaafaaabDCbTNbTObUGbVFbVGbVHbVIbVJbUGbVKbVLcqEbVNbVObTPbTRbBccqnbMqbOAbVPbVQbKmbVRbVSbKmbVTbVUbVVbKmbVWbQRbVXbLnbVYbUfbMFbUdbVZbWabRVbWbbNKbLDbNLbWcbWdbWebMKbMLbyebUjbyebABbzibNYbLFbWfbWgbWhbWibUmbWgbWjbUpbWjbNVbNXbKvbBMbCWbCWbCWbWkbWlbQobSgbKKbShbWmbQkbQkbSjbBMbPvbWnbWobWobPvbPvbWpbWqbWrbWsbWtbWubTCbWvbSqbSqbSsbGVbjobWwbjobWxbjoaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafbJYbWybWzbWzbWAbTLbWBbBcbJYbJYaaaaaaaaaaaaaaaaaaaaabDCbTNbTObWCbWDbWEbVHbWFbWCbWCbVKbWGcqGcqFbWIbTPbTRbBccqnbMqbWJbWKbWKbWLbWMbWNbWObWPbWQbWRbKmbMFbQRbWSbWTbVYbWUbMFbUdbVZbTdbTebWVbOUaafbOVbWWbWXbWYbMKbMLbyebUjbyebGHbGHbNYbLFbLGbWZbXabLGbXbbLGbLGbLGbLGbLGbLFbKvbBMbItbItbItbItbTubXcbRjbXdbTubItbItbItbItbBMbRrbXebRrbRrbRrbPvbWpbWqbXfbXgbXhbXibUwbXjbPvbSqbSsbGVbjobsebsebsebXkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafaafaafaafaafaafaafaafaafaafbBcbBcbBcbBcbBcbBcbVEbBcbBcbBcbBcaafaaaaaabXlaaaaaaaaaaaaaaabEZbTNbTObWCbWCbXmbXnbXobWCbXpbXqbXrcqIcqHbXsbTPbTRbBccqJbXwbCrbWKbXxbXybXybXzbXAbXBbXCbXDbKmbXEbXFbVXbLnbVYbXGbMFbXHbVZbTdbXIbXJbQabQbbNLbXKbWdbWdbMKbMLbNPbUjbyebXLbzibNYbXMbSabSabXNbLGbIHbIkbQBbyebXRbXSbKwbKvbBMbQjbQkbQkbXTbQmbKKbQnbQobXUbXVbCWbCWbCWbBMbXWbRrbRrbRrbRrbPvbXXbXXbXYbXZbOpbOpbUwbOpbPvbOpbSsbGVbjobYabYbbYcbXkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfabfabfabfabfabfabfabfabfabqabfabfabfabfabfaaaaaabBcbGnbGnbGnbGnbGnbGnbGnbGnbWBbJYaafaaaaaaaafaaIbYdaaaaaaaaabEZbTNbTObYebYfbYgbYhbYibYjbYkbYlbYmcqMcqKbYobTPbYpbYqbYrbYsbGybWKbYtbXybYubYvbYwbYxbYybYzbYAbNFbYBbLnbLnbLnbYCbMFbYDbYEbTdbTebMFbOUaafbMKbMKbMKbMKbMKbMLbNPbUjbyebYFbzibYGbYHbTkbYIbYJbyebRybQCbTGbyebYNbKFbYObYPbBMbCWbUobCWbYQbRibKKbRjbKKbRkbYRbCWbUobCWbBMbYSbRrbYTbRrbRrbYUbYVbYWbYXbYYbOpbUwbUwbYZbPvbBRbZabUBbjobZcbZdbsebXkaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaaaaafaaaaafaaaaafaaaacfaaaaafaaaaafaaaabfaafaafbBcbZebGnbBcbBcbBcbRAbBcbBcbBcbBcaaaaaaaaaaaIbZfbZgaaIaaIaafbEZbTNbTObZhbWCbUGbUGbUGbWCbZibZjbZkcqGcqNcqPbTPbBcbBcbZnbZobZpbWKbWKbZqbXybZrbZsbZtbZsbZubKmbMFbZvbZwbZxbZybONbZzbZAbZBbWabRVbZCbNKbLDbNLbZDbZEbZEbMKbMLbNPbUjbyebyebyebZFbZGbyebZHbZIbyebyebZJbyebyebZIbZKbZLbZMbBMbCWbCWbCWbZNbZObQobZPbKKbShbZQbQkbQkbSjbBMbRrbRrbZRbRrbRrbPvbXXbXXbZSbZTbOpbZUbZVbZWbPvboUbZabGVbjobjobjobsebjoaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaaabZXbZYbZZaaabZXbZYbZZaaabZXbZYbZZaaaabfaaaaaabBccaacabbBccacbGnbGncadbOucaebBcaaaaaaaaacafaaIaaIaafaaaaaabEZbTNbTObWCcagcahbUGcaibWCbWCbVKcajcqGcqKcakbTPcalcamcancaocapcaqcarcascatcascatcaucatcavbKmcawcaxcaybPSbPSbPUbRPcazbRUbPVbTecaAbOUaafbOVcaBcaCcaDbMKbMLbyebUjbzicaEcaFbZFcaGbyebZHcaHcaIcaJcaKcaLcaIcaMbZHbgxcaNbBMbBMbBMbBMbBMbBMcaOcaPcaObBMbBMbBMbBMbBMbBMbPvbPvbPvbPvbPvbPvcaQcaQcaRcaSbPvbPvbPvbPvbPvbjobRxbGVbjocaTcaUbsebjoaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaaabZXbZYbZZaaabZXbZYbZZaaabZXbZYbZZaaaabfaaaaaabBccaacabbBccacbGnbGncadbOucaebBcaaaaaaaaacafaaIaaIaafaaaaaabEZbTNbTObWCcagcahbUGcaibWCbWCbVKcajcqGcqKcqybTPcalcamcancaocapcaqcarcascatcascatcaucatcavbKmcawcaxcaybPSbPSbPUbRPcazbRUbPVbTecaAbOUaafbOVcaBcaCcaDbMKbMLbyebUjbzicaEcaFbZFcaGbyebZHcaHcaIcaJcaKcaLcaIcaMbZHbgxcaNbBMbBMbBMbBMbBMbBMcaOcaPcaObBMbBMbBMbBMbBMbBMbPvbPvbPvbPvbPvbPvcaQcaQcaRcaSbPvbPvbPvbPvbPvbjobRxbGVbjocaTcaUbsebjoaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaafbZXcaVbZZaaabZXcaVbZZaaabZXcaVbZZaafaafaaaaaabBcbJYbJYbBcbBccaWcaXbOubGnbQDbBcaaaaaaaaaaaaaafaaaaaaaaaaaabDCbTNbTObUGcaYcaZbUGcbacbbbUGbVKcbccqEcqQcqVcuPcqXcqWbOAaZDcbgcbhcbicbjcbkcblcbmcbnbXycbobKmcbpbMFbZvbRPbRQcbqcbrcbscbtbLAcbucbvbQabQbbNLcbwbZEbZEbMKbMLbyecbxcbycbzcbAcbBcbCbyecbDcbEcbFcbGcbHcbGcbIcbEcbJbgxcbKbjoaaaaaaaaaaafaaaaaacbLaaaaafaaaaaaaaaaaabjocbMbMfbkGcbNcbNbPvcbOcbOcaRbQtcbPcbQbsebsebsebBRbRxbHzbjocbRbsebsebjobjobjoaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaaabZXcaVbZZaafbZXcaVbZZaafbZXcaVbZZaaaaafaafaafaafaafaafaafbBcbBcbBcbBcbRAbBcbBcaaaaaaaaaaaaaafaaaaaaaafaaabDCbTNbTObUGcbScbTcbUcbVcbWbUGcbXcbYcbZccaccbbTPccccqYcceccfccgcchcciccjcckcclccmccnccoccpccqccrbMFbZvcctbMFbMFbMFcctcctcctbTeaVSaVRaafbMKbMKbMKbMKbMKbMLbyebYFccuccvccwccxccybyebyecczccAccBbKwccCccDbyebyebgxcbKbjoaaaaaaaaaaafaaaaaacbLaaaaafaaaaaaaaaaaabjobseccEbqvccFccGbPvccHccHccIbQtbPvbOpbjoccJccKbBRbRxbGVbsebsebsebUCbkHbVybkHaagaagaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafbZXcaVbZZaaabZXcaVbZZaaabZXcaVbZZaafaafaaaaaaaaaaaaaaaaaabBcccRbBcbGnbGnbBcaafaaaaafaaaaaaaafaaaaaaaafaaabDCbTNbTObTObTObTObTObTObTObTObTPbTPbTPbTPbTPbTPbBcccSbBcccTccUccUccUccVccWccXccUccYccZcdabKmbMFbOQccscctbMFbMFbMFbMHbSYcctbTecctbKmaafaafaafaafaafaafbMLcdjcdjcdjcdkcvdcdjcdjcdjcdmbyecdncdncdocdncdnbyebABbZGcbKbjobXkbXkbXkbjobXkbXkcdpbXkbjobXkbXkbXkbXkbjobjobRxcdqbjobjobPvbPvbPvcdrcdsbPvbBRbjobYcbseboTbRxbUBbjobjocdtbjobjobjobjoaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa diff --git a/code/game/jobs/job/job.dm b/code/game/jobs/job/job.dm index 1ed2ee7e924..f36aa23cfb6 100644 --- a/code/game/jobs/job/job.dm +++ b/code/game/jobs/job/job.dm @@ -176,5 +176,5 @@ /datum/job/proc/announce_head(var/datum/mind/o_mind, var/channels) //tells the given channel that the given mind is the new department head. See communications.dm for valid channels. sleep(2) //to allow some initialization if(announcement_systems.len) - var/obj/structure/announcement_system/announcer = pick(announcement_systems) + var/obj/machinery/announcement_system/announcer = pick(announcement_systems) announcer.announce("NEWHEAD", o_mind.name, o_mind.assigned_role, channels) diff --git a/code/game/objects/structures/announcement_system.dm b/code/game/machinery/announcement_system.dm similarity index 57% rename from code/game/objects/structures/announcement_system.dm rename to code/game/machinery/announcement_system.dm index c91f2a64c70..e0ba952807d 100644 --- a/code/game/objects/structures/announcement_system.dm +++ b/code/game/machinery/announcement_system.dm @@ -1,27 +1,58 @@ var/list/announcement_systems = list() -/obj/structure/announcement_system - density = 0 +/obj/machinery/announcement_system + density = 1 anchored = 1 name = "\improper Automated Announcement System" desc = "An automated announcement system that handles minor announcements over the radio." - icon = 'icons/obj/radio.dmi' - icon_state = "beacon" + icon = 'icons/obj/machines/announcement_system.dmi' + icon_state = "AAS_on_closed" var/obj/item/device/radio/headset/radio + idle_power_usage = 20 + var/arrival = "%PERSON has signed up as %RANK" var/newhead = "%PERSON, %RANK, is the department head." -/obj/structure/announcement_system/New() +/obj/machinery/announcement_system/New() + ..() announcement_systems += src radio = new /obj/item/device/radio/headset/ai(src) -/obj/structure/announcement_system/proc/CompileText(str, user, rank) //replaces user-given variables with actual thingies. +/obj/machinery/announcement_system/update_icon() + if(is_operational()) + icon_state = (panel_open ? "AAS_on_open" : "AAS_on_closed") + else + icon_state = (panel_open ? "AAS_off_open" : "AAS_off_closed") + +/obj/machinery/announcement_system/power_change() + ..() + update_icon() + +/obj/machinery/announcement_system/attackby(obj/item/P, mob/user, params) + if(istype(P, obj/item/weapon/screwdriver)) + if(state_open) + playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) + user << "You open the control panel of [src]." + panel_open = 1 + else + playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) + user << "You close the control panel of [src]." + panel_open = 0 + update_icon() + return + + default_deconstruction_crowbar(P) + +/obj/machinery/announcement_system/proc/CompileText(str, user, rank) //replaces user-given variables with actual thingies. str = replacetext(str, "%PERSON", "[user]") str = replacetext(str, "%RANK", "[rank]") return str -/obj/structure/announcement_system/proc/announce(message_type, user, rank, list/channels) +/obj/machinery/announcement_system/proc/announce(message_type, user, rank, list/channels) + if(!is_operational()) + return + var/message if(message_type == "ARRIVAL") @@ -37,16 +68,19 @@ var/list/announcement_systems = list() //config stuff -/obj/structure/announcement_system/proc/Interact(mob/user) +/obj/machinery/announcement_system/proc/Interact(mob/user) + if(!is_operational()) + return + var/contents = "Arrival Announcement:
\n[arrival]
\n" contents += "Departmental Head Announcement:
\n[newhead]
\n" - var/datum/browser/popup = new(user, "announcement_config", "Automated Announcement Configuration", 340, 220) + var/datum/browser/popup = new(user, "announcement_config", "Automated Announcement Configuration", 350, 240) popup.set_content(contents) popup.open() -/obj/structure/announcement_system/Topic(href, href_list) - if(usr.lying || usr.stat || usr.stunned || (!Adjacent(usr)) && !isAI(usr)) +/obj/machinery/announcement_system/Topic(href, href_list) + if(!is_operational() || usr.lying || usr.stat || usr.stunned || (!Adjacent(usr)) && !isAI(usr)) return var/mob/living/living_user = usr @@ -62,7 +96,7 @@ var/list/announcement_systems = list() if(NewMessage) arrival = NewMessage else if(href_list["NewheadTopic"]) - var/NewMessage = stripped_input(usr, "Enter in the departmental head announcement configuration.", "Arrivals Announcement Config", newhead) + var/NewMessage = stripped_input(usr, "Enter in the departmental head announcement configuration.", "Head Departmental Announcement Config", newhead) if(!in_range(src, usr) && src.loc != usr && !isAI(usr)) return if(NewMessage) @@ -72,12 +106,12 @@ var/list/announcement_systems = list() Interact(usr) return -/obj/structure/announcement_system/attackby(obj/item/W, mob/user, params) +/obj/machinery/announcement_system/attackby(obj/item/W, mob/user, params) ..() if (istype(W, /obj/item/device/multitool)) Interact(user) -/obj/structure/announcement_system/attack_ai(var/mob/living/silicon/ai/user) +/obj/machinery/announcement_system/attack_ai(var/mob/living/silicon/ai/user) if(!isAI(user)) return Interact(user) \ No newline at end of file diff --git a/code/modules/mob/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm index 287aca6880b..6c34b61108c 100644 --- a/code/modules/mob/new_player/new_player.dm +++ b/code/modules/mob/new_player/new_player.dm @@ -278,7 +278,7 @@ if(announcement_systems.len) if(character.mind) if((character.mind.assigned_role != "Cyborg") && (character.mind.assigned_role != character.mind.special_role)) - var/obj/structure/announcement_system/announcer = pick(announcement_systems) + var/obj/machinery/announcement_system/announcer = pick(announcement_systems) announcer.announce("ARRIVAL", character.real_name, rank, list()) //make the list empty to make it announce it in common /mob/new_player/proc/LateChoices() diff --git a/icons/obj/machines/announcement_system.dmi b/icons/obj/machines/announcement_system.dmi new file mode 100644 index 0000000000000000000000000000000000000000..c7997693b697736faf783a44ff353c0342cb81f0 GIT binary patch literal 1349 zcmV-L1-kl)P)005u}0{{R3yb+fl0000{P)t-sz`(#W zGc!v|OIKG{GXMZkP*4Cf0000pMn*;e04Xy7Ggeks0GXKpGc!m?NX(f4J3BjJVPOC% zDGxtC&z}!JKR*wjpZ@>=0L(MY0GYtRz#?f+s{jB10d!JMQvg8b*k%9#0J3^iSad{X zb7OL8aCB*JZU6vyoKseCa&`CgQ*iP1zLzfBgv{Yl$o0oqp$v~6n& znybY4PQf(ot$QTUzWU+QlP<9QW#nkzDp=-w>B>}~eQU(c?kcMS?W=<4XH~G@@0(qx zHC5Y?w6mrPeQQGds^I0tjMx;+73Kn1-*liyyi_a~!1}7-_4PX9=moI8 zDrnw<5jz)Xj)YIGXZe?cKi3h*F97vT2ku`{*dfP1a@Ly;oDp|nhcG{S#v&8o_`w;w z$B%XpIU_LNoj~+9V09Sxi>`M&h+hEe7r&4F!hNu9^B2JSs^IH5< zs(i5WL4fZ(FjhWD_`Q}?KG=U~^&-Q@=!3Q%PVtu#6$cyt0ewM9pukUsc;d5x;oj?TM+~B{J^xY0djc-yNjuXEd zv;L6rha0XR!lUA6jJ4kFAif1q-|Zm21zCO;So7n>jQtGOUW(3`Wwyfl6;Qh zcl`CY@xdgYL;L2nImzeHKAitiepQtO`84ESzqA@Azbh@0&k=rUX&CZ2zbh>^zgsil zL;S9MKqkN2e0{AH@Iii8J|L6dl@^=dk^25-24wQP(qi*FwtjwyfFA$L^1TSZD=jv^ zD<9C|a|6Zi{0XlSkjL*<2*~4iD+J{6yA=Ym_}>}<@8x$RZh{Z+y)^>z_}vNteLk4x zcM(LqLO>?JD<6=@_f`nVRgpsTKT2r+M+wdUD8cz3B{=`11m}O0 zX#NKl&HuoH^FK;_{#RIV{zs`i|6?lPe`~`bN^t&1$@~1E$beY>M+weeD8cz3C5jKi zRc^^<49}b`3Z700000NkvXX Hu0mjfqU($H literal 0 HcmV?d00001 diff --git a/tgstation.dme b/tgstation.dme index bb2dc8375ad..0bc85ac4a1e 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -377,6 +377,7 @@ #include "code\game\machinery\ai_slipper.dm" #include "code\game\machinery\airlock_control.dm" #include "code\game\machinery\alarm.dm" +#include "code\game\machinery\announcement_system.dm" #include "code\game\machinery\atmo_control.dm" #include "code\game\machinery\autolathe.dm" #include "code\game\machinery\Beacon.dm" @@ -697,7 +698,6 @@ #include "code\game\objects\items\weapons\tanks\tanks.dm" #include "code\game\objects\items\weapons\tanks\watertank.dm" #include "code\game\objects\structures\ai_core.dm" -#include "code\game\objects\structures\announcement_system.dm" #include "code\game\objects\structures\artstuff.dm" #include "code\game\objects\structures\barsigns.dm" #include "code\game\objects\structures\bedsheet_bin.dm" From d31d1a017a25767e6022c03d2b158b4c6812a2c4 Mon Sep 17 00:00:00 2001 From: Chiefwaffles Date: Tue, 14 Jul 2015 20:34:53 -0700 Subject: [PATCH 15/24] Adds emag/emp effects, makes AAS fully constructable, adds a circuitboard for the AAS, and adds overlays for announcements/errors. --- code/game/jobs/job/job.dm | 8 +- code/game/machinery/announcement_system.dm | 84 +++++++++++++++---- code/game/machinery/constructable_frame.dm | 9 ++ .../research/designs/machine_designs.dm | 10 +++ 4 files changed, 90 insertions(+), 21 deletions(-) diff --git a/code/game/jobs/job/job.dm b/code/game/jobs/job/job.dm index f36aa23cfb6..84563ae6880 100644 --- a/code/game/jobs/job/job.dm +++ b/code/game/jobs/job/job.dm @@ -174,7 +174,7 @@ return 1 /datum/job/proc/announce_head(var/datum/mind/o_mind, var/channels) //tells the given channel that the given mind is the new department head. See communications.dm for valid channels. - sleep(2) //to allow some initialization - if(announcement_systems.len) - var/obj/machinery/announcement_system/announcer = pick(announcement_systems) - announcer.announce("NEWHEAD", o_mind.name, o_mind.assigned_role, channels) + spawn(4) //to allow some initialization + if(announcement_systems.len) + var/obj/machinery/announcement_system/announcer = pick(announcement_systems) + announcer.announce("NEWHEAD", o_mind.name, o_mind.assigned_role, channels) diff --git a/code/game/machinery/announcement_system.dm b/code/game/machinery/announcement_system.dm index e0ba952807d..d4b710340cf 100644 --- a/code/game/machinery/announcement_system.dm +++ b/code/game/machinery/announcement_system.dm @@ -9,7 +9,10 @@ var/list/announcement_systems = list() icon_state = "AAS_on_closed" var/obj/item/device/radio/headset/radio + var/broken = 0 + idle_power_usage = 20 + active_power_usage = 50 var/arrival = "%PERSON has signed up as %RANK" var/newhead = "%PERSON, %RANK, is the department head." @@ -19,6 +22,12 @@ var/list/announcement_systems = list() announcement_systems += src radio = new /obj/item/device/radio/headset/ai(src) + component_parts = list() + component_parts += new /obj/item/weapon/circuitboard/announcement_system(null) + component_parts += new /obj/item/stack/cable_coil(null, 2) + component_parts += new /obj/item/weapon/stock_parts/console_screen(null) + RefreshParts() + /obj/machinery/announcement_system/update_icon() if(is_operational()) icon_state = (panel_open ? "AAS_on_open" : "AAS_on_closed") @@ -30,8 +39,8 @@ var/list/announcement_systems = list() update_icon() /obj/machinery/announcement_system/attackby(obj/item/P, mob/user, params) - if(istype(P, obj/item/weapon/screwdriver)) - if(state_open) + if(istype(P, /obj/item/weapon/screwdriver)) + if(!panel_open) playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) user << "You open the control panel of [src]." panel_open = 1 @@ -42,7 +51,16 @@ var/list/announcement_systems = list() update_icon() return - default_deconstruction_crowbar(P) + if(panel_open) + default_deconstruction_crowbar(P) + if(istype(P, /obj/item/device/multitool) && broken) + user << "You reset [src]'s firmware." + broken = 0 + overlays.Remove("error_light") + +/obj/machinery/announcement_system/attack_hand(mob/user) + if((panel_open || isAI(user)) && can_be_used_by(user)) + Interact(user) /obj/machinery/announcement_system/proc/CompileText(str, user, rank) //replaces user-given variables with actual thingies. str = replacetext(str, "%PERSON", "[user]") @@ -57,9 +75,20 @@ var/list/announcement_systems = list() if(message_type == "ARRIVAL") message = CompileText(arrival, user, rank) + + spawn(0) + overlays += "green_light" //this is += instead of |= because if we get lots of arrivals at once, we want to keep the light up for the proper duration. + sleep(3) + overlays.Remove("green_light") + else if(message_type == "NEWHEAD") message = CompileText(newhead, user, rank) + spawn(0) + overlays += "pink_light" //see above for why "+=" instead of "|=" + sleep(3) + overlays.Remove("pink_light") + if(channels.len == 0) radio.talk_into(src, message, null, list(SPAN_ROBOT)) else @@ -69,24 +98,28 @@ var/list/announcement_systems = list() //config stuff /obj/machinery/announcement_system/proc/Interact(mob/user) - if(!is_operational()) + if(!(panel_open || isAI(user)) || !can_be_used_by(user)) return + if(broken) + visible_message("[src] buzzes", "You hear a faint buzz.") + playsound(src.loc, 'sound/machines/buzz-two.ogg', 50, 1) + return + + var/contents = "Arrival Announcement:
\n[arrival]
\n" contents += "Departmental Head Announcement:
\n[newhead]
\n" - var/datum/browser/popup = new(user, "announcement_config", "Automated Announcement Configuration", 350, 240) + var/datum/browser/popup = new(user, "announcement_config", "Automated Announcement Configuration", 370, 220) popup.set_content(contents) popup.open() /obj/machinery/announcement_system/Topic(href, href_list) - if(!is_operational() || usr.lying || usr.stat || usr.stunned || (!Adjacent(usr)) && !isAI(usr)) + if(!(panel_open || isAI(usr)) || !can_be_used_by(usr) || usr.lying || usr.stat || usr.stunned) return - - var/mob/living/living_user = usr - var/obj/item/item_in_hand = living_user.get_active_hand() - if(!istype(item_in_hand, /obj/item/device/multitool) && !isAI(usr)) - living_user << "You need a multitool!" + if(broken) + visible_message("[src] buzzes", "You hear a faint buzz.") + playsound(src.loc, 'sound/machines/buzz-two.ogg', 50, 1) return if(href_list["ArrivalTopic"]) @@ -106,12 +139,29 @@ var/list/announcement_systems = list() Interact(usr) return -/obj/machinery/announcement_system/attackby(obj/item/W, mob/user, params) - ..() - if (istype(W, /obj/item/device/multitool)) - Interact(user) - /obj/machinery/announcement_system/attack_ai(var/mob/living/silicon/ai/user) if(!isAI(user)) return - Interact(user) \ No newline at end of file + if(broken) + user << "[src]'s firmware appears to be malfunctioning!" + return + Interact(user) + +/obj/machinery/announcement_system/proc/act_up() //does funny breakage stuff + broken = 1 + + overlays |= "error_light" //as if it wasn't already obvious + arrival = "#!@%ERR-34%2 CANNOT LOCAT@# JO# F*LE!" + newhead = "OV#RL()D: \[UNKNOWN??\] DET*#CT)D!" + +/obj/machinery/announcement_system/emp_act(severity) + if(stat & (NOPOWER|BROKEN)) + ..(severity) + return + act_up() + ..(severity) + +/obj/machinery/announcement_system/emag_act() + ..() + emagged = 1 + act_up() \ No newline at end of file diff --git a/code/game/machinery/constructable_frame.dm b/code/game/machinery/constructable_frame.dm index 6d83a84185d..5a250e90e51 100644 --- a/code/game/machinery/constructable_frame.dm +++ b/code/game/machinery/constructable_frame.dm @@ -257,6 +257,15 @@ to destroy them and players will be able to make replacements. user << "You set the board to [names_paths[build_path]]." req_components = list(text2path("/obj/item/weapon/vending_refill/[copytext("[build_path]", 24)]") = 3) //Never before has i used a method as horrible as this one, im so sorry +/obj/item/weapon/circuitboard/announcement_system + name = "circuit board (Announcement System)" + build_path = /obj/machinery/announcement_system + board_type = "machine" + origin_tech = "programming=3;bluespace=2" + req_components = list( + /obj/item/stack/cable_coil = 2, + /obj/item/weapon/stock_parts/console_screen = 1) + /obj/item/weapon/circuitboard/smes name = "circuit board (SMES)" build_path = /obj/machinery/power/smes diff --git a/code/modules/research/designs/machine_designs.dm b/code/modules/research/designs/machine_designs.dm index 8c0cfe30ea1..75202c87387 100644 --- a/code/modules/research/designs/machine_designs.dm +++ b/code/modules/research/designs/machine_designs.dm @@ -12,6 +12,16 @@ build_path = /obj/item/weapon/circuitboard/smes category = list ("Engineering Machinery") +/datum/design/announcement_system + name = "Machine Design (Automated Announcement System Board)" + desc = "The circuit board for an automated announcement system." + id = "automated_announcement" + req_tech = list("programming" = 3, "bluespace" = 2) + build_type = IMPRINTER + materials = list(MAT_GLASS = 1000, "sacid" = 20) + build_path = /obj/item/weapon/circuitboard/announcement_system + category = list("Subspace Telecomms") + /datum/design/turbine_computer name = "Computer Design (Power Turbine Console Board)" desc = "The circuit board for a power turbine console." From f881c1749a93c88aa5d9127ba7c7b7b0cfb7935d Mon Sep 17 00:00:00 2001 From: Chiefwaffles Date: Tue, 14 Jul 2015 21:46:17 -0700 Subject: [PATCH 16/24] Allows users to toggle an announcement on/off, and changes overlays to show whether their respective channels are on/off. --- code/game/machinery/announcement_system.dm | 54 +++++++++++++++------- 1 file changed, 38 insertions(+), 16 deletions(-) diff --git a/code/game/machinery/announcement_system.dm b/code/game/machinery/announcement_system.dm index d4b710340cf..582d1d3bcee 100644 --- a/code/game/machinery/announcement_system.dm +++ b/code/game/machinery/announcement_system.dm @@ -15,7 +15,13 @@ var/list/announcement_systems = list() active_power_usage = 50 var/arrival = "%PERSON has signed up as %RANK" + var/arrivalToggle = 1 var/newhead = "%PERSON, %RANK, is the department head." + var/newheadToggle = 1 + + var/greenlight = "green_light" + var/pinklight = "pink_light" + var/errorlight = "error_light" /obj/machinery/announcement_system/New() ..() @@ -28,12 +34,31 @@ var/list/announcement_systems = list() component_parts += new /obj/item/weapon/stock_parts/console_screen(null) RefreshParts() + update_icon() + /obj/machinery/announcement_system/update_icon() if(is_operational()) icon_state = (panel_open ? "AAS_on_open" : "AAS_on_closed") else icon_state = (panel_open ? "AAS_off_open" : "AAS_off_closed") + + overlays.Cut() + if(arrivalToggle) + overlays |= greenlight + else + overlays -= greenlight + + if(newheadToggle) + overlays |= pinklight + else + overlays -= pinklight + + if(broken) + overlays |= errorlight + else + overlays -= errorlight + /obj/machinery/announcement_system/power_change() ..() update_icon() @@ -56,7 +81,7 @@ var/list/announcement_systems = list() if(istype(P, /obj/item/device/multitool) && broken) user << "You reset [src]'s firmware." broken = 0 - overlays.Remove("error_light") + update_icon() /obj/machinery/announcement_system/attack_hand(mob/user) if((panel_open || isAI(user)) && can_be_used_by(user)) @@ -73,22 +98,12 @@ var/list/announcement_systems = list() var/message - if(message_type == "ARRIVAL") + if(message_type == "ARRIVAL" && arrivalToggle) message = CompileText(arrival, user, rank) - spawn(0) - overlays += "green_light" //this is += instead of |= because if we get lots of arrivals at once, we want to keep the light up for the proper duration. - sleep(3) - overlays.Remove("green_light") - - else if(message_type == "NEWHEAD") + else if(message_type == "NEWHEAD" && newheadToggle) message = CompileText(newhead, user, rank) - spawn(0) - overlays += "pink_light" //see above for why "+=" instead of "|=" - sleep(3) - overlays.Remove("pink_light") - if(channels.len == 0) radio.talk_into(src, message, null, list(SPAN_ROBOT)) else @@ -107,8 +122,8 @@ var/list/announcement_systems = list() return - var/contents = "Arrival Announcement:
\n[arrival]
\n" - contents += "Departmental Head Announcement:
\n[newhead]
\n" + var/contents = "Arrival Announcement: ([(arrivalToggle ? "On" : "Off")])
\n[arrival]

\n" + contents += "Departmental Head Announcement: ([(newheadToggle ? "On" : "Off")])
\n[newhead]

\n" var/datum/browser/popup = new(user, "announcement_config", "Automated Announcement Configuration", 370, 220) popup.set_content(contents) @@ -135,6 +150,13 @@ var/list/announcement_systems = list() if(NewMessage) newhead = NewMessage + else if(href_list["NewheadT-Topic"]) + newheadToggle = !newheadToggle + update_icon() + else if(href_list["ArrivalT-Topic"]) + arrivalToggle = !arrivalToggle + update_icon() + add_fingerprint(usr) Interact(usr) return @@ -149,8 +171,8 @@ var/list/announcement_systems = list() /obj/machinery/announcement_system/proc/act_up() //does funny breakage stuff broken = 1 + update_icon() - overlays |= "error_light" //as if it wasn't already obvious arrival = "#!@%ERR-34%2 CANNOT LOCAT@# JO# F*LE!" newhead = "OV#RL()D: \[UNKNOWN??\] DET*#CT)D!" From 5509a0220bb7ea746da1860062cfdd0abe2600ce Mon Sep 17 00:00:00 2001 From: Chiefwaffles Date: Tue, 14 Jul 2015 21:52:51 -0700 Subject: [PATCH 17/24] AASes now remove themselves from the AAS list when destroyed. --- code/game/machinery/announcement_system.dm | 3 +++ 1 file changed, 3 insertions(+) diff --git a/code/game/machinery/announcement_system.dm b/code/game/machinery/announcement_system.dm index 582d1d3bcee..a7d6920bd3d 100644 --- a/code/game/machinery/announcement_system.dm +++ b/code/game/machinery/announcement_system.dm @@ -59,6 +59,9 @@ var/list/announcement_systems = list() else overlays -= errorlight +/obj/machinery/announcement_system/Destroy() + announcement_systems -= src //"OH GOD WHY ARE THERE 100,000 LISTED ANNOUNCEMENT SYSTEMS?!!" + /obj/machinery/announcement_system/power_change() ..() update_icon() From bc228f84bdc6c3caff6d7f7f852268801cbb5329 Mon Sep 17 00:00:00 2001 From: Chiefwaffles Date: Tue, 14 Jul 2015 22:20:05 -0700 Subject: [PATCH 18/24] Changelogs: So easy-to-forget they may as well be ninjas. --- html/changelogs/Chiefwaffles-Obsolete_AI_2016.yml | 8 ++++++++ html/changelogs/Chiefwaffles-Who_is_my_boss.yml | 7 ------- 2 files changed, 8 insertions(+), 7 deletions(-) create mode 100644 html/changelogs/Chiefwaffles-Obsolete_AI_2016.yml delete mode 100644 html/changelogs/Chiefwaffles-Who_is_my_boss.yml diff --git a/html/changelogs/Chiefwaffles-Obsolete_AI_2016.yml b/html/changelogs/Chiefwaffles-Obsolete_AI_2016.yml new file mode 100644 index 00000000000..28b3f8fdbb0 --- /dev/null +++ b/html/changelogs/Chiefwaffles-Obsolete_AI_2016.yml @@ -0,0 +1,8 @@ +author: Chiefwaffles + +delete-after: True + +changes: + - rscadd: "After realizing how often AIs tend to 'disappear', Centcomm has authorized the shipment of the Automated Announcement System to take over the AI's responsibility of announcing new arrivals." + - rscadd: "In addition, by opening the panel with a screwdriver, users are able to configure the messages to their liking. Early testing has shown that this feature may be vulnerable to malicious external elements!" + - rscadd: "Furthermore, the R&D software has been updated so it can now succesfully create its own prototype AAS board once the prerequisite levels have been met." diff --git a/html/changelogs/Chiefwaffles-Who_is_my_boss.yml b/html/changelogs/Chiefwaffles-Who_is_my_boss.yml deleted file mode 100644 index 02d58a3ad89..00000000000 --- a/html/changelogs/Chiefwaffles-Who_is_my_boss.yml +++ /dev/null @@ -1,7 +0,0 @@ -author: Chiefwaffles - -delete-after: True - -changes: - - rscadd: "After realizing how often AIs tend to 'disappear', Centcomm has authorized the shipment of the Automated Announcement System to take over the AI's responsibility of announcing new arrivals." - - rscadd: "In addition, you can now configure the radio announcements by using a multitool on the AAS. AIs can manipulate the messages as well." From 11e50f7221f373527532feff185558d83fde3de6 Mon Sep 17 00:00:00 2001 From: Chiefwaffles Date: Thu, 16 Jul 2015 12:41:15 -0700 Subject: [PATCH 19/24] Fixing conflicts, step 2. --- _maps/map_files/TgStation/tgstation.2.1.3.dmm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/_maps/map_files/TgStation/tgstation.2.1.3.dmm b/_maps/map_files/TgStation/tgstation.2.1.3.dmm index 5ecc04343bb..86767bd1ad8 100644 --- a/_maps/map_files/TgStation/tgstation.2.1.3.dmm +++ b/_maps/map_files/TgStation/tgstation.2.1.3.dmm @@ -4660,6 +4660,7 @@ "bLF" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/wall/r_wall,/area/medical/virology) "bLG" = (/turf/simulated/wall/r_wall,/area/medical/virology) "bLH" = (/turf/simulated/wall,/area/medical/virology) +"bLI" = (/obj/machinery/light{dir = 1},/obj/machinery/atmospherics/components/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/machinery/announcement_system,/turf/simulated/floor/plasteel,/area/tcommsat/computer) "bLJ" = (/obj/structure/sign/biohazard,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/wall,/area/medical/virology) "bLK" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/disposalpipe/sortjunction{dir = 2; icon_state = "pipe-j2s"; sortType = 13},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plating,/area/maintenance/asmaint) "bLL" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/airlock/maintenance{name = "Xenobiology Maintenance"; req_access_txt = "55"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plating,/area/toxins/xenobiology) @@ -6258,7 +6259,6 @@ "cqv" = (/turf/simulated/floor/plasteel{icon_state = "dark"},/area/aisat) "cqw" = (/obj/machinery/door/airlock/hatch{name = "Teleporter Room"; req_access_txt = "17;65"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/aisat) "cqx" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/wall/r_wall,/area/tcommsat/computer) -"cqy" = (/obj/machinery/light{dir = 1},/obj/machinery/atmospherics/components/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/plasteel,/area/tcommsat/computer) "cqz" = (/obj/structure/closet/crate/freezer,/obj/item/weapon/reagent_containers/blood/empty,/obj/item/weapon/reagent_containers/blood/empty{pixel_x = -3; pixel_y = -3},/obj/item/weapon/reagent_containers/blood/AMinus,/obj/item/weapon/reagent_containers/blood/BMinus{pixel_x = -4; pixel_y = 4},/obj/item/weapon/reagent_containers/blood/BPlus{pixel_x = 1; pixel_y = 2},/obj/item/weapon/reagent_containers/blood/OMinus,/obj/item/weapon/reagent_containers/blood/OPlus{pixel_x = -2; pixel_y = -1},/obj/item/weapon/reagent_containers/blood/random,/obj/item/weapon/reagent_containers/blood/random,/obj/item/weapon/reagent_containers/blood/random,/obj/machinery/atmospherics/components/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/virology) "cqA" = (/obj/machinery/camera/emp_proof{c_tag = "Singularity West"; dir = 1; network = list("Singularity")},/turf/simulated/floor/plating/airless,/area/engine/engineering) "cqB" = (/obj/machinery/camera/emp_proof{c_tag = "Singularity East"; dir = 1; network = list("Singularity")},/turf/simulated/floor/plating/airless,/area/engine/engineering) @@ -6666,7 +6666,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaafaafbRzaafaafaafbBcbBcbBcbBcbBcbBcbBcbBcbBcbBcbRAbBcbBcbBcbJYbJYbJYbRBbRCbRDbREbRFbRGbRCbRHbPFbPFbPFbPFcqrbMkbMkbMkbMkbMkcqtbRKbOAbRLbKmbRMbRNbPNbRObPNbLnbMFbMFbMFbQRbRPbRQbRQbRRbRSbRTbNGbRUbRVbRWbNKbLDbNLbRXbRYbRYbMKbMLbyebKvbRZbSabSabSabSbbScbMUbSdbMUbMUbMUbPebMUbMUbMUbLFbKvbBMbCWbCWbCWbSebSfbQobSgbKKbShbSibQkbQkbSjbItbSkbSlbPlbSmbSnbPobQybSobRrbSpbOpbSqbSqbSqbPvbSrbSsbGVbjoaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabStbSubSubSubSubSvbSwbSwbSxbSybSzbSAbSBbSCbSDbSEbBcbGnbGnbGnbGnbGnbGnbGnbSFbSGbSHbSIbSJbSKbSKbSKbSKbSLbSMbSMbSMbSNcqubSObDybDybSPbBccqnbMqbOAbSQbSRbSSbSTbRQbRQbSUbSVbRQbRQbSWbSXbSYbMFbSZbTabTbbTcbMFbTdbTebTfbOUaafbOVbTgbThbTibMKbMLbNPbTjbTkbTkbTkbTlbLFbTmbQZbTnbTobTpbTqbTrbTsbTsbTtbLFbKvbBMbItbItbItbItbTubTvbRjbTwbTubItbItbItbItbItbTxbTybTzbTAbTBbTCbTCbTCbTCbTDbOmbSqbSqbTEbPvbTFbSsbGVbjobjobjoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaagaaaaafaaaaaabJYbJYbJYbGnbTHbTIbTJbTKbTLbBcbTMbJYbJYbJYbJYbJYbJYbJYbJYbDCbTNbTObTObTObTObTObTObTObTObTPbTPcqxbTPbTPbTQbTRbBccqnbMqbOAbSQbTSbTTbTUbTVbPSbTWbTXbPSbPSbTYbTZbUabUbbUcbUdbUebUfbMFbTdbUgbUhbQabQbbNLbUibRYbRYbMKbMLbNPbUjbyebyebyebNYbLFbUkbMUbMUbUlbUmbUnbVibUpbVibUnbLFbKvbBMbQjbQkbQkbUqbQmbKKbQnbQobUrbUsbCWbCWbCWbItbUtbUubUvbUwbRnbRpbUxbUybUzbUAbOpbSqbSqbSqbPvbTFbSsbGVbsebsebjoaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaagaagaagaagaagbUDbGnbUDbGnbUEbTIbTIbUFbGnbBcbGnbJYaaaaaaaafaaaaaaaafaaabDCbTNbTObUGbUHbUIbUJbUKbULbUGbUMbUNcqCcqybTPbTPbTRbBccqDbMqbOAbURbUSbUTbUTbUUbKmbKmbKmbKmbKmbUVbUWbLnbLnbLnbUXbMFbTbbMFbTdbTebUYbOUaafbMKbMKbMKbMKbMKbMLbNPbUjbyebUZbzibNYbMMbVabVbbVcbVdbVebVfbVgbUpbVgbVhbLFbKvbBMbCWcqUbCWbVjbRibKKbRjbKKbRkbVkbCWcqUbCWbItbVlbVmbVnbVobVpbVqbVrbVsbVtbVubOmbVvbVwbVxbPvbSqbSsbHzbjobsebjobjobjoaagaagaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaagaagaagaagaagbUDbGnbUDbGnbUEbTIbTIbUFbGnbBcbGnbJYaaaaaaaafaaaaaaaafaaabDCbTNbTObUGbUHbUIbUJbUKbULbUGbUMbUNcqCbLIbTPbTPbTRbBccqDbMqbOAbURbUSbUTbUTbUUbKmbKmbKmbKmbKmbUVbUWbLnbLnbLnbUXbMFbTbbMFbTdbTebUYbOUaafbMKbMKbMKbMKbMKbMLbNPbUjbyebUZbzibNYbMMbVabVbbVcbVdbVebVfbVgbUpbVgbVhbLFbKvbBMbCWcqUbCWbVjbRibKKbRjbKKbRkbVkbCWcqUbCWbItbVlbVmbVnbVobVpbVqbVrbVsbVtbVubOmbVvbVwbVxbPvbSqbSsbHzbjobsebjobjobjoaagaagaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafbJYbJYbJYbVzbVAbVBbVCbVDbGnbVEbGnbJYaaaaaaaafaaaaaaaafaaabDCbTNbTObUGbVFbVGbVHbVIbVJbUGbVKbVLcqEbVNbVObTPbTRbBccqnbMqbOAbVPbVQbKmbVRbVSbKmbVTbVUbVVbKmbVWbQRbVXbLnbVYbUfbMFbUdbVZbWabRVbWbbNKbLDbNLbWcbWdbWebMKbMLbyebUjbyebABbzibNYbLFbWfbWgbWhbWibUmbWgbWjbUpbWjbNVbNXbKvbBMbCWbCWbCWbWkbWlbQobSgbKKbShbWmbQkbQkbSjbBMbPvbWnbWobWobPvbPvbWpbWqbWrbWsbWtbWubTCbWvbSqbSqbSsbGVbjobWwbjobWxbjoaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafbJYbWybWzbWzbWAbTLbWBbBcbJYbJYaaaaaaaaaaaaaaaaaaaaabDCbTNbTObWCbWDbWEbVHbWFbWCbWCbVKbWGcqGcqFbWIbTPbTRbBccqnbMqbWJbWKbWKbWLbWMbWNbWObWPbWQbWRbKmbMFbQRbWSbWTbVYbWUbMFbUdbVZbTdbTebWVbOUaafbOVbWWbWXbWYbMKbMLbyebUjbyebGHbGHbNYbLFbLGbWZbXabLGbXbbLGbLGbLGbLGbLGbLFbKvbBMbItbItbItbItbTubXcbRjbXdbTubItbItbItbItbBMbRrbXebRrbRrbRrbPvbWpbWqbXfbXgbXhbXibUwbXjbPvbSqbSsbGVbjobsebsebsebXkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafaafaafaafaafaafaafaafaafaafbBcbBcbBcbBcbBcbBcbVEbBcbBcbBcbBcaafaaaaaabXlaaaaaaaaaaaaaaabEZbTNbTObWCbWCbXmbXnbXobWCbXpbXqbXrcqIcqHbXsbTPbTRbBccqJbXwbCrbWKbXxbXybXybXzbXAbXBbXCbXDbKmbXEbXFbVXbLnbVYbXGbMFbXHbVZbTdbXIbXJbQabQbbNLbXKbWdbWdbMKbMLbNPbUjbyebXLbzibNYbXMbSabSabXNbLGbIHbIkbQBbyebXRbXSbKwbKvbBMbQjbQkbQkbXTbQmbKKbQnbQobXUbXVbCWbCWbCWbBMbXWbRrbRrbRrbRrbPvbXXbXXbXYbXZbOpbOpbUwbOpbPvbOpbSsbGVbjobYabYbbYcbXkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa From a057c19b91b4cdca67135f5009367517f3e70f24 Mon Sep 17 00:00:00 2001 From: Chiefwaffles Date: Fri, 17 Jul 2015 19:09:15 -0700 Subject: [PATCH 20/24] please work fucking git --- code/game/gamemodes/malfunction/malfunction.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/game/gamemodes/malfunction/malfunction.dm b/code/game/gamemodes/malfunction/malfunction.dm index 50f10083921..3b453e491cc 100644 --- a/code/game/gamemodes/malfunction/malfunction.dm +++ b/code/game/gamemodes/malfunction/malfunction.dm @@ -212,7 +212,7 @@ /datum/game_mode/malfunction/proc/ai_win() set category = "Malfunction" set name = "Explode" - //set desc = "Activates the self-destruct device on [world.name]." + set desc = "Activates the self-destruct device on [world.name]." if (!ticker.mode:to_nuke_or_not_to_nuke) return ticker.mode:to_nuke_or_not_to_nuke = 0 @@ -302,4 +302,4 @@ text += "
" world << text - return 1 \ No newline at end of file + return 1 From c903b510c58997933d518e26b3af5863f6dcfe8a Mon Sep 17 00:00:00 2001 From: Chiefwaffles Date: Fri, 17 Jul 2015 19:13:18 -0700 Subject: [PATCH 21/24] Remove myself from admins.txt Didn't mean to include this. I'll put it in another PR someday perhaps. --- config/admins.txt | 1 - 1 file changed, 1 deletion(-) diff --git a/config/admins.txt b/config/admins.txt index e6ce8e1b2fd..66009e74574 100644 --- a/config/admins.txt +++ b/config/admins.txt @@ -89,4 +89,3 @@ fayrik = Game Master shadowlight213 = Game Master drovidicorv = Game Master Dunc = Game Master -Chiefwaffles = Game Master \ No newline at end of file From 0600f05657859de6790dcd23946c6999fe964d7f Mon Sep 17 00:00:00 2001 From: Chiefwaffles Date: Sat, 25 Jul 2015 15:30:11 -0700 Subject: [PATCH 22/24] Adds a new sprite, moves location of sprite, adds span classes, general code consistency stuff. --- code/game/machinery/announcement_system.dm | 40 +++++++++++---------- icons/obj/machines/announcement_system.dmi | Bin 1349 -> 0 bytes icons/obj/machines/telecomms.dmi | Bin 20864 -> 23547 bytes 3 files changed, 22 insertions(+), 18 deletions(-) delete mode 100644 icons/obj/machines/announcement_system.dmi diff --git a/code/game/machinery/announcement_system.dm b/code/game/machinery/announcement_system.dm index b29badde41b..e69df9c883c 100644 --- a/code/game/machinery/announcement_system.dm +++ b/code/game/machinery/announcement_system.dm @@ -5,10 +5,14 @@ var/list/announcement_systems = list() anchored = 1 name = "\improper Automated Announcement System" desc = "An automated announcement system that handles minor announcements over the radio." - icon = 'icons/obj/machines/announcement_system.dmi' - icon_state = "AAS_on_closed" + icon = 'icons/obj/machines/telecomms.dmi' + icon_state = "AAS_On" var/obj/item/device/radio/headset/radio + verb_say = "coldly states" + verb_ask = "queries" + verb_exclaim = "alarms" + var/broken = 0 idle_power_usage = 20 @@ -19,9 +23,9 @@ var/list/announcement_systems = list() var/newhead = "%PERSON, %RANK, is the department head." var/newheadToggle = 1 - var/greenlight = "green_light" - var/pinklight = "pink_light" - var/errorlight = "error_light" + var/greenlight = "Light_Green" + var/pinklight = "Light_Pink" + var/errorlight = "Error_Red" /obj/machinery/announcement_system/New() ..() @@ -38,9 +42,9 @@ var/list/announcement_systems = list() /obj/machinery/announcement_system/update_icon() if(is_operational()) - icon_state = (panel_open ? "AAS_on_open" : "AAS_on_closed") + icon_state = (panel_open ? "AAS_On_Open" : "AAS_On") else - icon_state = (panel_open ? "AAS_off_open" : "AAS_off_closed") + icon_state = (panel_open ? "AAS_Off_Open" : "AAS_Off") overlays.Cut() @@ -70,11 +74,11 @@ var/list/announcement_systems = list() if(istype(P, /obj/item/weapon/screwdriver)) if(!panel_open) playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) - user << "You open the control panel of [src]." + user << "You open the maintenance hatch of [src]." panel_open = 1 else playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) - user << "You close the control panel of [src]." + user << "You close the maintenance hatch of [src]." panel_open = 0 update_icon() return @@ -82,12 +86,12 @@ var/list/announcement_systems = list() if(panel_open) default_deconstruction_crowbar(P) if(istype(P, /obj/item/device/multitool) && broken) - user << "You reset [src]'s firmware." + user << "You reset [src]'s firmware." broken = 0 update_icon() /obj/machinery/announcement_system/attack_hand(mob/user) - if((panel_open || isAI(user)) && can_be_used_by(user)) + if(can_be_used_by(user)) Interact(user) /obj/machinery/announcement_system/proc/CompileText(str, user, rank) //replaces user-given variables with actual thingies. @@ -116,11 +120,11 @@ var/list/announcement_systems = list() //config stuff /obj/machinery/announcement_system/proc/Interact(mob/user) - if(!(panel_open || isAI(user)) || !can_be_used_by(user)) + if(!can_be_used_by(user)) return if(broken) - visible_message("[src] buzzes", "You hear a faint buzz.") + visible_message("[src] buzzes.", "You hear a faint buzz.") playsound(src.loc, 'sound/machines/buzz-two.ogg', 50, 1) return @@ -133,10 +137,10 @@ var/list/announcement_systems = list() popup.open() /obj/machinery/announcement_system/Topic(href, href_list) - if(!(panel_open || isAI(usr)) || !can_be_used_by(usr) || usr.lying || usr.stat || usr.stunned) + if(!can_be_used_by(usr) || usr.lying || usr.stat || usr.stunned) return if(broken) - visible_message("[src] buzzes", "You hear a faint buzz.") + visible_message("[src] buzzes.", "You hear a faint buzz.") playsound(src.loc, 'sound/machines/buzz-two.ogg', 50, 1) return @@ -168,7 +172,7 @@ var/list/announcement_systems = list() if(!isAI(user)) return if(broken) - user << "[src]'s firmware appears to be malfunctioning!" + user << "[src]'s firmware appears to be malfunctioning!" return Interact(user) @@ -176,8 +180,8 @@ var/list/announcement_systems = list() broken = 1 update_icon() - arrival = "#!@%ERR-34%2 CANNOT LOCAT@# JO# F*LE!" - newhead = "OV#RL()D: \[UNKNOWN??\] DET*#CT)D!" + arrival = pick("#!@%ERR-34%2 CANNOT LOCAT@# JO# F*LE!", "CRITICAL ERROR 99.", "ERR)#: DA#AB@#E NOT F(*ND!") + newhead = pick("OV#RL()D: \[UNKNOWN??\] DET*#CT)D!", "ER)#R - B*@ TEXT F*O(ND!", "AAS.exe is not responding. NanoOS is searching for a solution to the problem.") /obj/machinery/announcement_system/emp_act(severity) if(stat & (NOPOWER|BROKEN)) diff --git a/icons/obj/machines/announcement_system.dmi b/icons/obj/machines/announcement_system.dmi deleted file mode 100644 index c7997693b697736faf783a44ff353c0342cb81f0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1349 zcmV-L1-kl)P)005u}0{{R3yb+fl0000{P)t-sz`(#W zGc!v|OIKG{GXMZkP*4Cf0000pMn*;e04Xy7Ggeks0GXKpGc!m?NX(f4J3BjJVPOC% zDGxtC&z}!JKR*wjpZ@>=0L(MY0GYtRz#?f+s{jB10d!JMQvg8b*k%9#0J3^iSad{X zb7OL8aCB*JZU6vyoKseCa&`CgQ*iP1zLzfBgv{Yl$o0oqp$v~6n& znybY4PQf(ot$QTUzWU+QlP<9QW#nkzDp=-w>B>}~eQU(c?kcMS?W=<4XH~G@@0(qx zHC5Y?w6mrPeQQGds^I0tjMx;+73Kn1-*liyyi_a~!1}7-_4PX9=moI8 zDrnw<5jz)Xj)YIGXZe?cKi3h*F97vT2ku`{*dfP1a@Ly;oDp|nhcG{S#v&8o_`w;w z$B%XpIU_LNoj~+9V09Sxi>`M&h+hEe7r&4F!hNu9^B2JSs^IH5< zs(i5WL4fZ(FjhWD_`Q}?KG=U~^&-Q@=!3Q%PVtu#6$cyt0ewM9pukUsc;d5x;oj?TM+~B{J^xY0djc-yNjuXEd zv;L6rha0XR!lUA6jJ4kFAif1q-|Zm21zCO;So7n>jQtGOUW(3`Wwyfl6;Qh zcl`CY@xdgYL;L2nImzeHKAitiepQtO`84ESzqA@Azbh@0&k=rUX&CZ2zbh>^zgsil zL;S9MKqkN2e0{AH@Iii8J|L6dl@^=dk^25-24wQP(qi*FwtjwyfFA$L^1TSZD=jv^ zD<9C|a|6Zi{0XlSkjL*<2*~4iD+J{6yA=Ym_}>}<@8x$RZh{Z+y)^>z_}vNteLk4x zcM(LqLO>?JD<6=@_f`nVRgpsTKT2r+M+wdUD8cz3B{=`11m}O0 zX#NKl&HuoH^FK;_{#RIV{zs`i|6?lPe`~`bN^t&1$@~1E$beY>M+weeD8cz3C5jKi zRc^^<49}b`3Z700000NkvXX Hu0mjfqU($H diff --git a/icons/obj/machines/telecomms.dmi b/icons/obj/machines/telecomms.dmi index f47fcc63f870ca74a01f3876c2ce20aee4fc8277..7f5f05e3aff7341313167493b78a2e3c00d08b44 100644 GIT binary patch literal 23547 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 Date: Sat, 25 Jul 2015 16:12:22 -0700 Subject: [PATCH 23/24] Fixes merge conflict, Part Deux. Also fixes dumb byond stuff. --- _maps/map_files/TgStation/tgstation.2.1.3.dmm | 4 ++-- tgstation.dme | 4 ++++ 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/_maps/map_files/TgStation/tgstation.2.1.3.dmm b/_maps/map_files/TgStation/tgstation.2.1.3.dmm index e5eb356d0c2..7019df8a6a9 100644 --- a/_maps/map_files/TgStation/tgstation.2.1.3.dmm +++ b/_maps/map_files/TgStation/tgstation.2.1.3.dmm @@ -6262,7 +6262,7 @@ "cqv" = (/turf/simulated/floor/plasteel{icon_state = "dark"},/area/aisat) "cqw" = (/obj/machinery/door/airlock/hatch{name = "Teleporter Room"; req_access_txt = "17;65"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/aisat) "cqx" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/wall/r_wall,/area/tcommsat/computer) -"cqy" = (/obj/machinery/light{dir = 1},/obj/machinery/atmospherics/components/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/plasteel,/area/tcommsat/computer) +"cqy" = (/obj/machinery/light{dir = 1},/obj/machinery/atmospherics/components/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/machinery/announcement_system,/turf/simulated/floor/plasteel,/area/tcommsat/computer) "cqz" = (/obj/structure/closet/crate/freezer,/obj/item/weapon/reagent_containers/blood/empty,/obj/item/weapon/reagent_containers/blood/empty{pixel_x = -3; pixel_y = -3},/obj/item/weapon/reagent_containers/blood/AMinus,/obj/item/weapon/reagent_containers/blood/BMinus{pixel_x = -4; pixel_y = 4},/obj/item/weapon/reagent_containers/blood/BPlus{pixel_x = 1; pixel_y = 2},/obj/item/weapon/reagent_containers/blood/OMinus,/obj/item/weapon/reagent_containers/blood/OPlus{pixel_x = -2; pixel_y = -1},/obj/item/weapon/reagent_containers/blood/random,/obj/item/weapon/reagent_containers/blood/random,/obj/item/weapon/reagent_containers/blood/random,/obj/machinery/atmospherics/components/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/virology) "cqA" = (/obj/machinery/camera/emp_proof{c_tag = "Singularity West"; dir = 1; network = list("Singularity")},/turf/simulated/floor/plating/airless,/area/engine/engineering) "cqB" = (/obj/machinery/camera/emp_proof{c_tag = "Singularity East"; dir = 1; network = list("Singularity")},/turf/simulated/floor/plating/airless,/area/engine/engineering) @@ -6587,7 +6587,7 @@ "cwI" = (/obj/structure/table,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/pen,/turf/simulated/floor/plasteel{icon_state = "showroomfloor"},/area/security/brig) "cwJ" = (/obj/machinery/camera{c_tag = "Brig Evidence Storage"; dir = 1},/obj/machinery/light,/obj/structure/table,/obj/item/weapon/hand_labeler,/turf/simulated/floor/plasteel{icon_state = "showroomfloor"},/area/security/brig) "cwK" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'RADIOACTIVE AREA'"; icon_state = "radiation"; name = "RADIOACTIVE AREA"; pixel_x = 0; pixel_y = 0},/turf/simulated/wall,/area/engine/engineering) - + (1,1,1) = {" aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa diff --git a/tgstation.dme b/tgstation.dme index 284c384d82f..3aeb99ee87f 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -241,6 +241,7 @@ #include "code\datums\spells\projectile.dm" #include "code\datums\spells\santa.dm" #include "code\datums\spells\summonitem.dm" +#include "code\datums\spells\touch_attacks.dm" #include "code\datums\spells\trigger.dm" #include "code\datums\spells\turf_teleport.dm" #include "code\datums\spells\wizard.dm" @@ -357,6 +358,7 @@ #include "code\game\gamemodes\traitor\double_agents.dm" #include "code\game\gamemodes\traitor\traitor.dm" #include "code\game\gamemodes\wizard\artefact.dm" +#include "code\game\gamemodes\wizard\godhand.dm" #include "code\game\gamemodes\wizard\raginmages.dm" #include "code\game\gamemodes\wizard\rightandwrong.dm" #include "code\game\gamemodes\wizard\soulstone.dm" @@ -900,6 +902,7 @@ #include "code\modules\clothing\masks\boxing.dm" #include "code\modules\clothing\masks\breath.dm" #include "code\modules\clothing\masks\gasmask.dm" +#include "code\modules\clothing\masks\hailer.dm" #include "code\modules\clothing\masks\miscellaneous.dm" #include "code\modules\clothing\shoes\bananashoes.dm" #include "code\modules\clothing\shoes\colour.dm" @@ -1220,6 +1223,7 @@ #include "code\modules\mob\living\simple_animal\friendly\butterfly.dm" #include "code\modules\mob\living\simple_animal\friendly\cat.dm" #include "code\modules\mob\living\simple_animal\friendly\crab.dm" +#include "code\modules\mob\living\simple_animal\friendly\dog.dm" #include "code\modules\mob\living\simple_animal\friendly\farm_animals.dm" #include "code\modules\mob\living\simple_animal\friendly\fox.dm" #include "code\modules\mob\living\simple_animal\friendly\lizard.dm" From 73f5b313ed46febc5429810fa7c937a60f83f337 Mon Sep 17 00:00:00 2001 From: Chiefwaffles Date: Sat, 25 Jul 2015 16:15:34 -0700 Subject: [PATCH 24/24] Stupid changelogs. --- html/changelogs/Chiefwaffles-Obsolete_AI_2016.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/html/changelogs/Chiefwaffles-Obsolete_AI_2016.yml b/html/changelogs/Chiefwaffles-Obsolete_AI_2016.yml index 28b3f8fdbb0..3a38249e8bb 100644 --- a/html/changelogs/Chiefwaffles-Obsolete_AI_2016.yml +++ b/html/changelogs/Chiefwaffles-Obsolete_AI_2016.yml @@ -3,6 +3,6 @@ author: Chiefwaffles delete-after: True changes: - - rscadd: "After realizing how often AIs tend to 'disappear', Centcomm has authorized the shipment of the Automated Announcement System to take over the AI's responsibility of announcing new arrivals." - - rscadd: "In addition, by opening the panel with a screwdriver, users are able to configure the messages to their liking. Early testing has shown that this feature may be vulnerable to malicious external elements!" - - rscadd: "Furthermore, the R&D software has been updated so it can now succesfully create its own prototype AAS board once the prerequisite levels have been met." + - rscadd: "After realizing how often AIs tend to 'disappear', Central Command has authorized the shipment of the Automated Announcement System to take over the AI's responsibility of announcing new arrivals." + - rscadd: "In addition, users are able to configure the messages to their liking. Early testing has shown that this feature may be vulnerable to malicious external elements!" + - rscadd: "The station's R&D software has been updated so it can now succesfully create its own prototype AAS board once the prerequisite levels have been met."