From aa59485a58fed954b6d5da80699b60d5e1bba862 Mon Sep 17 00:00:00 2001 From: GunHog Date: Fri, 24 Apr 2015 09:23:20 -0500 Subject: [PATCH 1/5] Positronic Brains! -Adds positronic brains - Fixes a runtime in mechs for pilots without DNA --- code/game/mecha/mecha.dm | 9 +- code/game/objects/items/robot/robot_parts.dm | 1 + .../mob/living/carbon/brain/posibrain.dm | 162 ++++++++++++++++++ .../modules/mob/living/silicon/robot/robot.dm | 28 +-- .../research/designs/medical_designs.dm | 13 ++ icons/obj/assemblies.dmi | Bin 22397 -> 27559 bytes tgstation.dme | 1 + 7 files changed, 199 insertions(+), 15 deletions(-) create mode 100644 code/modules/mob/living/carbon/brain/posibrain.dm diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index 2e9ddccfaaf..f06a3a4de22 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -666,9 +666,9 @@ obj/mecha/proc/can_use(mob/user) if(istype(W, /obj/item/device/mmi)) if(mmi_move_inside(W,user)) - user << "[src]-MMI interface initialized successfuly" + user << "[src]-[W] interface initialized successfuly" else - user << "[src]-MMI interface initialization failed." + user << "[src]-[W] interface initialization failed." return if(istype(W, /obj/item/mecha_parts/mecha_equipment)) @@ -1137,6 +1137,9 @@ obj/mecha/proc/can_use(mob/user) if(mmi.brainmob) occupant.loc = mmi mmi.mecha = null + if(istype(mmi,/obj/item/device/mmi/posibrain)) + var/obj/item/device/mmi/posibrain/P = mmi + P.handle_posibrain_icon() src.occupant.canmove = 0 src.verbs += /obj/mecha/verb/eject src.occupant = null @@ -1518,7 +1521,7 @@ var/year_integer = text2num(year) // = 2013??? return if(href_list["dna_lock"]) if(usr != src.occupant) return - if(src.occupant) + if(src.occupant && occupant.dna) src.dna = src.occupant.dna.unique_enzymes src.occupant_message("You feel a prick as the needle takes your DNA sample.") return diff --git a/code/game/objects/items/robot/robot_parts.dm b/code/game/objects/items/robot/robot_parts.dm index 9641f540d89..8cbcc221aae 100644 --- a/code/game/objects/items/robot/robot_parts.dm +++ b/code/game/objects/items/robot/robot_parts.dm @@ -223,6 +223,7 @@ chest.cell = null W.loc = O//Should fix cybros run time erroring when blown up. It got deleted before, along with the frame. O.mmi = W + O.updatename() feedback_inc("cyborg_birth",1) diff --git a/code/modules/mob/living/carbon/brain/posibrain.dm b/code/modules/mob/living/carbon/brain/posibrain.dm new file mode 100644 index 00000000000..d842c09730e --- /dev/null +++ b/code/modules/mob/living/carbon/brain/posibrain.dm @@ -0,0 +1,162 @@ +/obj/item/device/mmi/posibrain + name = "positronic brain" + desc = "A cube of shining metal, four inches to a side and covered in shallow grooves." + icon = 'icons/obj/assemblies.dmi' + icon_state = "posibrain" + w_class = 3 + origin_tech = "biotech=3;programming=2" + var/searching = 0 + var/askDelay = 10 * 60 * 1 + brainmob = null + req_access = list(access_robotics) + locked = 0 + mecha = null//This does not appear to be used outside of reference in mecha.dm. + + +/obj/item/device/mmi/posibrain/attack_self(mob/user as mob) + if(brainmob && !brainmob.key && searching == 0) + //Start the process of searching for a new user. + user << "You carefully locate the manual activation switch and start the positronic brain's boot process." + searching = 1 + handle_posibrain_icon() + request_player() + spawn(600) + reset_search() + +/obj/item/device/mmi/posibrain/proc/request_player() + for(var/mob/dead/observer/O in player_list) + if(jobban_isbanned(O, "pAI")) + continue + if(O.client) + if(O.client.prefs.be_special & BE_PAI) + question(O.client) + +/obj/item/device/mmi/posibrain/proc/question(var/client/C) + spawn(0) + if(!C) return + var/response = alert(C, "Someone is requesting a personality for a positronic brain. Would you like to play as one?", "Positronic brain request", "Yes", "No", "Never for this round") + if(!C || brainmob.key || 0 == searching) + return //handle logouts that happen whilst the alert is waiting for a response, and responses issued after a brain has been located. + if(response == "Yes") + transfer_personality(C.mob) + else if (response == "Never for this round") + C.prefs.be_special ^= BE_PAI + + +/obj/item/device/mmi/posibrain/transfer_identity(var/mob/living/carbon/H) + name = "positronic brain ([H])" + brainmob.name = H.real_name + brainmob.real_name = H.real_name + brainmob.dna = H.dna + brainmob.timeofhostdeath = H.timeofdeath + brainmob.stat = 0 + if(brainmob.mind) + brainmob.mind.assigned_role = "Positronic Brain" + if(H.mind) + H.mind.transfer_to(brainmob) + + brainmob.mind.remove_all_antag() + brainmob.mind.wipe_memory() + + brainmob << "ALL PAST LIVES ARE FORGOTTEN." + + brainmob << "Hello World!" + handle_posibrain_icon() + return + +/obj/item/device/mmi/posibrain/proc/transfer_personality(var/mob/candidate) + + searching = 0 + brainmob.mind = candidate.mind + brainmob.ckey = candidate.ckey + name = "positronic brain ([brainmob.name])" + + brainmob.mind.remove_all_antag() + brainmob.mind.wipe_memory() + + brainmob << "ALL PAST LIVES ARE FORGOTTEN." + + brainmob << "You are a positronic brain, brought into existence on [station_name()]." + brainmob << "As a synthetic intelligence, you answer to all crewmembers, as well as the AI." + brainmob << "Remember, the purpose of your existence is to serve the crew and the station. Above all else, do no harm." + brainmob.mind.assigned_role = "Positronic Brain" + + var/turf/T = get_turf() + for (var/mob/M in viewers(T)) + M.show_message("The positronic brain chimes quietly.") + handle_posibrain_icon() + +/obj/item/device/mmi/posibrain/proc/reset_search() //We give the players sixty seconds to decide, then reset the timer. + + if(brainmob && brainmob.key) return + + searching = 0 + handle_posibrain_icon() + + var/turf/T = get_turf() + for (var/mob/M in viewers(T)) + M.show_message("The positronic brain buzzes quietly, and the golden lights fade away. Perhaps you could try again?") + +/obj/item/device/mmi/posibrain/examine() + + set src in oview() + + if(!usr || !src) return + if( (usr.disabilities & BLIND || usr.stat) && !istype(usr,/mob/dead/observer) ) + usr << "Something is there but you can't see it." + return + + var/msg = "*---------*\nThis is \icon[src] \a [src]!\n[desc]\n" + msg += "" + + if(brainmob && brainmob.key) + switch(brainmob.stat) + if(CONSCIOUS) + if(!src.brainmob.client) msg += "It appears to be in stand-by mode.\n" //afk + if(UNCONSCIOUS) msg += "It doesn't seem to be responsive.\n" + if(DEAD) msg += "It appears to be completely inactive.\n" + else + msg += "It appears to be completely inactive.\n" + msg += "*---------*" + usr << msg + return + +/obj/item/device/mmi/posibrain/emp_act(severity) + if(!brainmob) + return + else + switch(severity) + if(1) + brainmob.emp_damage += rand(20,30) + if(2) + brainmob.emp_damage += rand(10,20) + if(3) + brainmob.emp_damage += rand(0,10) + ..() + +/obj/item/device/mmi/posibrain/New() + + brainmob = new(src) + brainmob.name = "[pick(list("PBU","HIU","SINA","ARMA","OSI","HBL","MSO"))]-[rand(100, 999)]" + brainmob.real_name = brainmob.name + brainmob.loc = src + brainmob.container = src + brainmob.stat = 0 + brainmob.silent = 0 + dead_mob_list -= brainmob + + ..() + + +/obj/item/device/mmi/posibrain/attackby(var/obj/item/O as obj, var/mob/user as mob) + return + + +/obj/item/device/mmi/posibrain/proc/handle_posibrain_icon() + if(searching) + icon_state = "posibrain-searching" + return + if(brainmob) + icon_state = "posibrain-occupied" + else + icon_state = "posibrain" diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index 15b7d70d17c..9c2e710a752 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -100,17 +100,18 @@ ..() //MMI stuff. Held togheter by magic. ~Miauw - mmi = new(src) - mmi.brain = new /obj/item/organ/brain(mmi) - mmi.brain.name = "[real_name]'s brain" - mmi.locked = 1 - mmi.icon_state = "mmi_full" - mmi.name = "Man-Machine Interface: [real_name]" - mmi.brainmob = new(src) - mmi.brainmob.name = src.real_name - mmi.brainmob.real_name = src.real_name - mmi.brainmob.container = mmi - mmi.contents += mmi.brainmob + if(!mmi || !mmi.brainmob) + mmi = new(src) + mmi.brain = new /obj/item/organ/brain(mmi) + mmi.brain.name = "[real_name]'s brain" + mmi.locked = 1 + mmi.icon_state = "mmi_full" + mmi.name = "Man-Machine Interface: [real_name]" + mmi.brainmob = new(src) + mmi.brainmob.name = src.real_name + mmi.brainmob.real_name = src.real_name + mmi.brainmob.container = mmi + mmi.contents += mmi.brainmob playsound(loc, 'sound/voice/liveagain.ogg', 75, 1) aicamera = new/obj/item/device/camera/siliconcam/robot_camera(src) @@ -123,6 +124,9 @@ if(T) mmi.loc = T if(mmi.brainmob) mind.transfer_to(mmi.brainmob) + if(istype(mmi,/obj/item/device/mmi/posibrain)) + var/obj/item/device/mmi/posibrain/P = mmi + P.handle_posibrain_icon() else src << "Oops! Something went very wrong, your MMI was unable to receive your mind. You have been ghosted. Please make a bug report so we can fix this bug." ghostize() @@ -236,7 +240,7 @@ if(custom_name) changed_name = custom_name else - changed_name = "[(designation ? "[designation] " : "")]Cyborg-[num2text(ident)]" + changed_name = "[(designation ? "[designation] " : "")][istype(mmi, /obj/item/device/mmi/posibrain) ? "Android" : "Cyborg"]-[num2text(ident)]" real_name = changed_name name = real_name if(camera) diff --git a/code/modules/research/designs/medical_designs.dm b/code/modules/research/designs/medical_designs.dm index 14f20655f4b..22bf227cd59 100644 --- a/code/modules/research/designs/medical_designs.dm +++ b/code/modules/research/designs/medical_designs.dm @@ -48,6 +48,19 @@ datum/design/mmi_radio build_path = /obj/item/device/mmi/radio_enabled category = list("Misc","Medical Designs") +datum/design/posibrain + name = "Positronic Brain" + desc = "The latest in Artificial Intelligences." + id = "mmi_posi" + req_tech = list("programming" = 5, "biotech" = 4) + build_type = PROTOLATHE | MECHFAB + materials = list("$metal" = 1700, "$glass" = 1350, "$gold" = 500) //Gold, because SWAG. + reliability = 74 + construction_time = 75 + build_path = /obj/item/device/mmi/posibrain + category = list("Misc", "Medical Designs") + + datum/design/synthetic_flash name = "Flash" desc = "When a problem arises, SCIENCE is the solution." diff --git a/icons/obj/assemblies.dmi b/icons/obj/assemblies.dmi index 8325e86e0f1ecdf8a6c44008543dc1bb7f40ef47..b2bbe321a2fcfc750b2a0d23abb6e3fbd91f0f12 100644 GIT binary patch literal 27559 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 literal 22397 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 T+mT>dUBKMDtN diff --git a/tgstation.dme b/tgstation.dme index 27d86163d90..0dc6dadd47f 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -1121,6 +1121,7 @@ #include "code\modules\mob\living\carbon\brain\emote.dm" #include "code\modules\mob\living\carbon\brain\life.dm" #include "code\modules\mob\living\carbon\brain\MMI.dm" +#include "code\modules\mob\living\carbon\brain\posibrain.dm" #include "code\modules\mob\living\carbon\brain\say.dm" #include "code\modules\mob\living\carbon\human\blood.dm" #include "code\modules\mob\living\carbon\human\death.dm" From 1f6af46a1fd0bfb6c577529940e8e6ef84e2c3e2 Mon Sep 17 00:00:00 2001 From: GunHog Date: Fri, 24 Apr 2015 19:58:05 -0500 Subject: [PATCH 2/5] Tweaks and changes! --- code/game/mecha/mecha.dm | 4 +-- code/modules/mob/living/carbon/brain/MMI.dm | 21 ++++++++---- .../mob/living/carbon/brain/posibrain.dm | 34 +++++-------------- .../modules/mob/living/silicon/robot/robot.dm | 10 +++--- 4 files changed, 30 insertions(+), 39 deletions(-) diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index f06a3a4de22..802339c6fa5 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -1137,9 +1137,7 @@ obj/mecha/proc/can_use(mob/user) if(mmi.brainmob) occupant.loc = mmi mmi.mecha = null - if(istype(mmi,/obj/item/device/mmi/posibrain)) - var/obj/item/device/mmi/posibrain/P = mmi - P.handle_posibrain_icon() + mmi.update_icon() src.occupant.canmove = 0 src.verbs += /obj/mecha/verb/eject src.occupant = null diff --git a/code/modules/mob/living/carbon/brain/MMI.dm b/code/modules/mob/living/carbon/brain/MMI.dm index 49a3bc558d3..e47bc74f4cb 100644 --- a/code/modules/mob/living/carbon/brain/MMI.dm +++ b/code/modules/mob/living/carbon/brain/MMI.dm @@ -7,6 +7,7 @@ icon_state = "mmi_empty" w_class = 3 origin_tech = "biotech=3" + var/braintype = "Cyborg" req_access = list(access_robotics) @@ -18,6 +19,17 @@ var/obj/mecha = null //This does not appear to be used outside of reference in mecha.dm. var/obj/item/organ/brain/brain = null //The actual brain +/obj/item/device/mmi/update_icon() + if(brain) + if(istype(brain,/obj/item/organ/brain/alien)) + icon_state = "mmi_alien" + braintype = "Xenoborg" //HISS....Beep. + else + icon_state = "mmi_full" + braintype = "Cyborg" + else + icon_state = "mmi_empty" + /obj/item/device/mmi/attackby(var/obj/item/O as obj, var/mob/user as mob, params) if(istype(O,/obj/item/organ/brain)) //Time to stick a brain in it --NEO var/obj/item/organ/brain/newbrain = O @@ -42,10 +54,7 @@ brain = newbrain name = "Man-Machine Interface: [brainmob.real_name]" - if(istype(newbrain,/obj/item/organ/brain/alien)) - icon_state = "mmi_alien" - else - icon_state = "mmi_full" + update_icon() locked = 1 @@ -82,7 +91,7 @@ brain.loc = usr.loc brain = null //No more brain in here - icon_state = "mmi_empty" + update_icon() name = "Man-Machine Interface" /obj/item/device/mmi/proc/transfer_identity(var/mob/living/carbon/human/H) //Same deal as the regular brain proc. Used for human-->robot people. @@ -99,7 +108,7 @@ brain = newbrain name = "Man-Machine Interface: [brainmob.real_name]" - icon_state = "mmi_full" + update_icon() locked = 1 return diff --git a/code/modules/mob/living/carbon/brain/posibrain.dm b/code/modules/mob/living/carbon/brain/posibrain.dm index d842c09730e..7fd2f633ada 100644 --- a/code/modules/mob/living/carbon/brain/posibrain.dm +++ b/code/modules/mob/living/carbon/brain/posibrain.dm @@ -11,6 +11,7 @@ req_access = list(access_robotics) locked = 0 mecha = null//This does not appear to be used outside of reference in mecha.dm. + braintype = "Android" /obj/item/device/mmi/posibrain/attack_self(mob/user as mob) @@ -18,7 +19,7 @@ //Start the process of searching for a new user. user << "You carefully locate the manual activation switch and start the positronic brain's boot process." searching = 1 - handle_posibrain_icon() + update_icon() request_player() spawn(600) reset_search() @@ -61,7 +62,7 @@ brainmob << "ALL PAST LIVES ARE FORGOTTEN." brainmob << "Hello World!" - handle_posibrain_icon() + update_icon() return /obj/item/device/mmi/posibrain/proc/transfer_personality(var/mob/candidate) @@ -81,21 +82,17 @@ brainmob << "Remember, the purpose of your existence is to serve the crew and the station. Above all else, do no harm." brainmob.mind.assigned_role = "Positronic Brain" - var/turf/T = get_turf() - for (var/mob/M in viewers(T)) - M.show_message("The positronic brain chimes quietly.") - handle_posibrain_icon() + visible_message("The positronic brain chimes quietly.") + update_icon() /obj/item/device/mmi/posibrain/proc/reset_search() //We give the players sixty seconds to decide, then reset the timer. if(brainmob && brainmob.key) return searching = 0 - handle_posibrain_icon() + update_icon() - var/turf/T = get_turf() - for (var/mob/M in viewers(T)) - M.show_message("The positronic brain buzzes quietly, and the golden lights fade away. Perhaps you could try again?") + visible_message("The positronic brain buzzes quietly, and the golden lights fade away. Perhaps you could try again?") /obj/item/device/mmi/posibrain/examine() @@ -121,23 +118,10 @@ usr << msg return -/obj/item/device/mmi/posibrain/emp_act(severity) - if(!brainmob) - return - else - switch(severity) - if(1) - brainmob.emp_damage += rand(20,30) - if(2) - brainmob.emp_damage += rand(10,20) - if(3) - brainmob.emp_damage += rand(0,10) - ..() - /obj/item/device/mmi/posibrain/New() brainmob = new(src) - brainmob.name = "[pick(list("PBU","HIU","SINA","ARMA","OSI","HBL","MSO"))]-[rand(100, 999)]" + brainmob.name = "[pick(list("PBU","HIU","SINA","ARMA","OSI","HBL","MSO","RR"))]-[rand(100, 999)]" brainmob.real_name = brainmob.name brainmob.loc = src brainmob.container = src @@ -152,7 +136,7 @@ return -/obj/item/device/mmi/posibrain/proc/handle_posibrain_icon() +/obj/item/device/mmi/posibrain/update_icon() if(searching) icon_state = "posibrain-searching" return diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index 9c2e710a752..1037d5b2604 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -59,6 +59,7 @@ var/toner = 0 var/tonermax = 40 var/jetpackoverlay = 0 + var/braintype = "Cyborg" /mob/living/silicon/robot/New(loc) spark_system = new /datum/effect/effect/system/spark_spread() @@ -72,7 +73,6 @@ robot_modules_background.layer = 19 //Objects that appear on screen are on layer 20, UI should be just below it. ident = rand(1, 999) - updatename() update_icons() if(!cell) @@ -113,6 +113,8 @@ mmi.brainmob.container = mmi mmi.contents += mmi.brainmob + updatename() + playsound(loc, 'sound/voice/liveagain.ogg', 75, 1) aicamera = new/obj/item/device/camera/siliconcam/robot_camera(src) toner = 40 @@ -124,9 +126,7 @@ if(T) mmi.loc = T if(mmi.brainmob) mind.transfer_to(mmi.brainmob) - if(istype(mmi,/obj/item/device/mmi/posibrain)) - var/obj/item/device/mmi/posibrain/P = mmi - P.handle_posibrain_icon() + mmi.update_icon() else src << "Oops! Something went very wrong, your MMI was unable to receive your mind. You have been ghosted. Please make a bug report so we can fix this bug." ghostize() @@ -240,7 +240,7 @@ if(custom_name) changed_name = custom_name else - changed_name = "[(designation ? "[designation] " : "")][istype(mmi, /obj/item/device/mmi/posibrain) ? "Android" : "Cyborg"]-[num2text(ident)]" + changed_name = "[(designation ? "[designation] " : "")][mmi.braintype]-[num2text(ident)]" real_name = changed_name name = real_name if(camera) From ae1ad22f9788165168f076d065fcae4d61440b9d Mon Sep 17 00:00:00 2001 From: GunHog Date: Mon, 27 Apr 2015 11:07:36 -0500 Subject: [PATCH 3/5] pAI -> Ghost Roles Changes the BE_PAI and "pAI" flag names to "BE_GHOST_ROLE" and "Ghost Roles". Name subject to change. --- code/__DEFINES/preferences.dm | 2 +- code/_globalvars/configuration.dm | 2 +- code/controllers/subsystem/pai.dm | 4 ++-- code/modules/admin/topic.dm | 8 ++++---- code/modules/client/preferences.dm | 2 +- code/modules/mob/living/carbon/brain/posibrain.dm | 6 +++--- .../simple_animal/friendly/drone/drones_as_items.dm | 2 +- 7 files changed, 13 insertions(+), 13 deletions(-) diff --git a/code/__DEFINES/preferences.dm b/code/__DEFINES/preferences.dm index bc0dd8fc2b4..6fc106cb655 100644 --- a/code/__DEFINES/preferences.dm +++ b/code/__DEFINES/preferences.dm @@ -34,7 +34,7 @@ #define BE_MALF 16 #define BE_REV 32 #define BE_ALIEN 64 -#define BE_PAI 128 +#define BE_GHOST_ROLE 128 #define BE_CULTIST 256 #define BE_BLOB 512 #define BE_NINJA 1024 diff --git a/code/_globalvars/configuration.dm b/code/_globalvars/configuration.dm index 0db83ac6adb..819cc7667a0 100644 --- a/code/_globalvars/configuration.dm +++ b/code/_globalvars/configuration.dm @@ -41,7 +41,7 @@ var/list/be_special_flags = list( "Malf AI" = BE_MALF, "Revolutionary" = BE_REV, "Alien Lifeform" = BE_ALIEN, - "pAI" = BE_PAI, + "Ghost Roles" = BE_GHOST_ROLE, "Cultist" = BE_CULTIST, "Blob" = BE_BLOB, "Ninja" = BE_NINJA, diff --git a/code/controllers/subsystem/pai.dm b/code/controllers/subsystem/pai.dm index 431f68c348e..e88bc863c09 100644 --- a/code/controllers/subsystem/pai.dm +++ b/code/controllers/subsystem/pai.dm @@ -181,7 +181,7 @@ var/datum/subsystem/pai/SSpai /datum/subsystem/pai/proc/requestRecruits() for(var/mob/dead/observer/O in player_list) - if(jobban_isbanned(O, "pAI")) + if(jobban_isbanned(O, "Ghost Roles")) continue if(asked.Find(O.key)) if(world.time < asked[O.key] + askDelay) @@ -193,7 +193,7 @@ var/datum/subsystem/pai/SSpai for(var/datum/paiCandidate/c in SSpai.candidates) if(c.key == O.key) hasSubmitted = 1 - if(!hasSubmitted && (O.client.prefs.be_special & BE_PAI)) + if(!hasSubmitted && (O.client.prefs.be_special & BE_GHOST_ROLE)) question(O.client) /datum/subsystem/pai/proc/question(var/client/C) diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index 73b5e59c713..c0c1342f323 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -642,11 +642,11 @@ jobs += "" counter = 0 - //pAI isn't technically a job, but it goes in here. - if(jobban_isbanned(M, "pAI")) - jobs += "pAI" + //Ghost Roles (pAI/Drone/Positronic Brains) are not technically jobs, but they go in here. + if(jobban_isbanned(M, "Ghost Roles")) + jobs += "Ghost Roles (pAI/Drone/Positronic Brains)" else - jobs += "pAI" + jobs += "Ghost Roles (pAI/Drone/Positronic Brains)" jobs += "" diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index bd3044071c4..87f5a53950e 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -11,7 +11,7 @@ var/global/list/special_roles = list( //keep synced with the defines BE_* in set "malf AI" = /datum/game_mode/malfunction, //4 "revolutionary" = /datum/game_mode/revolution, //5 "alien", //6 - "pAI", //7 + "Ghost Roles", //7 "cultist" = /datum/game_mode/cult, //8 "blob" = /datum/game_mode/blob, //9 "ninja", //10 diff --git a/code/modules/mob/living/carbon/brain/posibrain.dm b/code/modules/mob/living/carbon/brain/posibrain.dm index 7fd2f633ada..a56d3ecc436 100644 --- a/code/modules/mob/living/carbon/brain/posibrain.dm +++ b/code/modules/mob/living/carbon/brain/posibrain.dm @@ -26,10 +26,10 @@ /obj/item/device/mmi/posibrain/proc/request_player() for(var/mob/dead/observer/O in player_list) - if(jobban_isbanned(O, "pAI")) + if(jobban_isbanned(O, "Ghost Roles")) continue if(O.client) - if(O.client.prefs.be_special & BE_PAI) + if(O.client.prefs.be_special & BE_GHOST_ROLE) question(O.client) /obj/item/device/mmi/posibrain/proc/question(var/client/C) @@ -41,7 +41,7 @@ if(response == "Yes") transfer_personality(C.mob) else if (response == "Never for this round") - C.prefs.be_special ^= BE_PAI + C.prefs.be_special ^= BE_GHOST_ROLE /obj/item/device/mmi/posibrain/transfer_identity(var/mob/living/carbon/H) diff --git a/code/modules/mob/living/simple_animal/friendly/drone/drones_as_items.dm b/code/modules/mob/living/simple_animal/friendly/drone/drones_as_items.dm index cd4c33c7ee1..b089d526e4c 100644 --- a/code/modules/mob/living/simple_animal/friendly/drone/drones_as_items.dm +++ b/code/modules/mob/living/simple_animal/friendly/drone/drones_as_items.dm @@ -16,7 +16,7 @@ var/drone_type = /mob/living/simple_animal/drone //Type of drone that will be spawned /obj/item/drone_shell/attack_ghost(mob/user) - if(jobban_isbanned(user,"pAI")) + if(jobban_isbanned(user,"Ghost Roles")) return var/be_drone = alert("Become a drone? (Warning, You can no longer be cloned!)",,"Yes","No") From 7fee8372fa660c34f45644649b9de58268123bea Mon Sep 17 00:00:00 2001 From: GunHog Date: Mon, 27 Apr 2015 11:32:44 -0500 Subject: [PATCH 4/5] Changelog Adds a changelog, drawn in blood, and performed according to the rites as scribed in the Unholy One's guide to changelogs. Long may he reign. --- .../Gun-Hog-PR-9147-Blood-Tithe-to-Jordie.yml | 37 +++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 html/changelogs/Gun-Hog-PR-9147-Blood-Tithe-to-Jordie.yml diff --git a/html/changelogs/Gun-Hog-PR-9147-Blood-Tithe-to-Jordie.yml b/html/changelogs/Gun-Hog-PR-9147-Blood-Tithe-to-Jordie.yml new file mode 100644 index 00000000000..78035d54353 --- /dev/null +++ b/html/changelogs/Gun-Hog-PR-9147-Blood-Tithe-to-Jordie.yml @@ -0,0 +1,37 @@ +################################ +# Example Changelog File +# +# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. +# +# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) +# When it is, any changes listed below will disappear. +# +# Valid Prefixes: +# bugfix +# wip (For works in progress) +# tweak +# soundadd +# sounddel +# rscadd (general adding of nice things) +# rscdel (general deleting of nice things) +# imageadd +# imagedel +# spellcheck (typo fixes) +# experiment +# tgs (TG-ported fixes?) +################################# + +# Your name. +author: Gun Hog + +# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again. +delete-after: True + +# Any changes you've made. See valid prefix list above. +# INDENT WITH TWO SPACES. NOT TABS. SPACES. +# SCREW THIS UP AND IT WON'T WORK. +# Also, this gets changed to [] after reading. Just remove the brackets when you add new shit. +# Please surround your changes in double quotes ("). It works without them, but if you use certain characters it screws up compiling. The quotes will not show up in the changelog. +changes: + - rscadd: "Top scientists at Nanotrasen have made strong progress in Artificial Intelligence technology, and have completed a design for replicating a human mind: Positronic Brains. Prototypes produced on your research station should be compatible with all Man-Machine Interface compliant machines, be it Mechs, AIs, and even Cyborg bodies. Please note that Cyborgs created from artificial brains are called Androids." + - tweak: "The pAI role preference and related jobbans have been renamed to properly reflect that they are not soley for pAI, but include drones and positroinc prains." From 00a676283843cb061e14f9e6bff527176df9cc45 Mon Sep 17 00:00:00 2001 From: GunHog Date: Tue, 28 Apr 2015 14:45:59 -0500 Subject: [PATCH 5/5] Ban panel and preferences changes - Deathsquad moved from Antagonist to Ghost Roles. - pAI jobbans split into drone, pAI, and posibrains. - Posibrains back under pAI preference flag (the byte is full) - Fixed Posibrain sprite if it fails to get a ghost. --- code/__DEFINES/preferences.dm | 2 +- code/_globalvars/configuration.dm | 2 +- code/controllers/subsystem/pai.dm | 4 +- code/modules/admin/topic.dm | 43 ++++++++++++++----- code/modules/client/preferences.dm | 2 +- .../mob/living/carbon/brain/posibrain.dm | 8 ++-- .../friendly/drone/drones_as_items.dm | 2 +- 7 files changed, 43 insertions(+), 20 deletions(-) diff --git a/code/__DEFINES/preferences.dm b/code/__DEFINES/preferences.dm index 6fc106cb655..9c2e1ccb84a 100644 --- a/code/__DEFINES/preferences.dm +++ b/code/__DEFINES/preferences.dm @@ -34,7 +34,7 @@ #define BE_MALF 16 #define BE_REV 32 #define BE_ALIEN 64 -#define BE_GHOST_ROLE 128 +#define BE_PAI 128 //Includes Positronic brains, but the flag is already maxed. #define BE_CULTIST 256 #define BE_BLOB 512 #define BE_NINJA 1024 diff --git a/code/_globalvars/configuration.dm b/code/_globalvars/configuration.dm index 819cc7667a0..d42d812db7a 100644 --- a/code/_globalvars/configuration.dm +++ b/code/_globalvars/configuration.dm @@ -41,7 +41,7 @@ var/list/be_special_flags = list( "Malf AI" = BE_MALF, "Revolutionary" = BE_REV, "Alien Lifeform" = BE_ALIEN, - "Ghost Roles" = BE_GHOST_ROLE, + "pAI/Positronic Brain" = BE_PAI, "Cultist" = BE_CULTIST, "Blob" = BE_BLOB, "Ninja" = BE_NINJA, diff --git a/code/controllers/subsystem/pai.dm b/code/controllers/subsystem/pai.dm index e88bc863c09..431f68c348e 100644 --- a/code/controllers/subsystem/pai.dm +++ b/code/controllers/subsystem/pai.dm @@ -181,7 +181,7 @@ var/datum/subsystem/pai/SSpai /datum/subsystem/pai/proc/requestRecruits() for(var/mob/dead/observer/O in player_list) - if(jobban_isbanned(O, "Ghost Roles")) + if(jobban_isbanned(O, "pAI")) continue if(asked.Find(O.key)) if(world.time < asked[O.key] + askDelay) @@ -193,7 +193,7 @@ var/datum/subsystem/pai/SSpai for(var/datum/paiCandidate/c in SSpai.candidates) if(c.key == O.key) hasSubmitted = 1 - if(!hasSubmitted && (O.client.prefs.be_special & BE_GHOST_ROLE)) + if(!hasSubmitted && (O.client.prefs.be_special & BE_PAI)) question(O.client) /datum/subsystem/pai/proc/question(var/client/C) diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index c0c1342f323..65df4760502 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -642,11 +642,38 @@ jobs += "" counter = 0 - //Ghost Roles (pAI/Drone/Positronic Brains) are not technically jobs, but they go in here. - if(jobban_isbanned(M, "Ghost Roles")) - jobs += "Ghost Roles (pAI/Drone/Positronic Brains)" + jobs += "" + + //Ghost Roles (light light gray) + jobs += "" + jobs += "" + + //pAI + if(jobban_isbanned(M, "pAI")) + jobs += "" else - jobs += "" + jobs += "" + + + //Drones + if(jobban_isbanned(M, "drone")) + jobs += "" + else + jobs += "" + + + //Positronic Brains + if(jobban_isbanned(M, "posibrain")) + jobs += "" + else + jobs += "" + + + //Deathsquad + if(jobban_isbanned(M, "deathsquad")) + jobs += "" + else + jobs += "" jobs += "
Ghost Roles
[replacetext("pAI", " ", " ")]Ghost Roles (pAI/Drone/Positronic Brains)[replacetext("pAI", " ", " ")][replacetext("Drone", " ", " ")][replacetext("Drone", " ", " ")][replacetext("Posibrain", " ", " ")][replacetext("Posibrain", " ", " ")][replacetext("Deathsquad", " ", " ")][replacetext("Deathsquad", " ", " ")]
" @@ -705,12 +732,6 @@ else jobs += "[replacetext("Abductor", " ", " ")]" - //Deathsquad - if(jobban_isbanned(M, "deathsquad") || isbanned_dept) - jobs += "[replacetext("Deathsquad", " ", " ")]" - else - jobs += "[replacetext("Deathsquad", " ", " ")]" - /* //Malfunctioning AI //Removed Malf-bans because they're a pain to impliment if(jobban_isbanned(M, "malf AI") || isbanned_dept) jobs += "[replacetext("Malf AI", " ", " ")]" @@ -800,6 +821,8 @@ var/datum/job/temp = SSjob.GetJob(jobPos) if(!temp) continue joblist += temp.title + if("ghostroles") + joblist += list("pAI", "posibrain", "drone", "deathsquad") else joblist += href_list["jobban3"] diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index 87f5a53950e..f853991c7ce 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -11,7 +11,7 @@ var/global/list/special_roles = list( //keep synced with the defines BE_* in set "malf AI" = /datum/game_mode/malfunction, //4 "revolutionary" = /datum/game_mode/revolution, //5 "alien", //6 - "Ghost Roles", //7 + "pAI/posibrain", //7 "cultist" = /datum/game_mode/cult, //8 "blob" = /datum/game_mode/blob, //9 "ninja", //10 diff --git a/code/modules/mob/living/carbon/brain/posibrain.dm b/code/modules/mob/living/carbon/brain/posibrain.dm index a56d3ecc436..9a788562cdb 100644 --- a/code/modules/mob/living/carbon/brain/posibrain.dm +++ b/code/modules/mob/living/carbon/brain/posibrain.dm @@ -26,10 +26,10 @@ /obj/item/device/mmi/posibrain/proc/request_player() for(var/mob/dead/observer/O in player_list) - if(jobban_isbanned(O, "Ghost Roles")) + if(jobban_isbanned(O, "posibrain")) continue if(O.client) - if(O.client.prefs.be_special & BE_GHOST_ROLE) + if(O.client.prefs.be_special & BE_PAI) question(O.client) /obj/item/device/mmi/posibrain/proc/question(var/client/C) @@ -41,7 +41,7 @@ if(response == "Yes") transfer_personality(C.mob) else if (response == "Never for this round") - C.prefs.be_special ^= BE_GHOST_ROLE + C.prefs.be_special ^= BE_PAI /obj/item/device/mmi/posibrain/transfer_identity(var/mob/living/carbon/H) @@ -140,7 +140,7 @@ if(searching) icon_state = "posibrain-searching" return - if(brainmob) + if(brainmob && brainmob.key) icon_state = "posibrain-occupied" else icon_state = "posibrain" diff --git a/code/modules/mob/living/simple_animal/friendly/drone/drones_as_items.dm b/code/modules/mob/living/simple_animal/friendly/drone/drones_as_items.dm index b089d526e4c..930dff33f2e 100644 --- a/code/modules/mob/living/simple_animal/friendly/drone/drones_as_items.dm +++ b/code/modules/mob/living/simple_animal/friendly/drone/drones_as_items.dm @@ -16,7 +16,7 @@ var/drone_type = /mob/living/simple_animal/drone //Type of drone that will be spawned /obj/item/drone_shell/attack_ghost(mob/user) - if(jobban_isbanned(user,"Ghost Roles")) + if(jobban_isbanned(user,"drone")) return var/be_drone = alert("Become a drone? (Warning, You can no longer be cloned!)",,"Yes","No")