From 67d12c0aa6f7a53f8304fa069419cdf0b9dfcff4 Mon Sep 17 00:00:00 2001 From: Fox McCloud Date: Thu, 12 Jul 2018 19:30:48 -0400 Subject: [PATCH] Full Positronic Brain to Robotic Brain Refactor --- _maps/map_files/cyberiad/cyberiad.dmm | 2 +- code/game/machinery/computer/ai_core.dm | 2 +- code/game/machinery/cryopod.dm | 2 +- code/game/mecha/mecha.dm | 16 ++--- code/modules/admin/admin_verbs.dm | 26 -------- .../spacesuits/rig/modules/computer.dm | 2 +- code/modules/mob/living/carbon/brain/MMI.dm | 2 - .../brain/{posibrain.dm => robotic_brain.dm} | 62 ++++++++---------- code/modules/mob/living/carbon/brain/say.dm | 6 +- .../living/carbon/human/species/station.dm | 2 +- .../modules/mob/living/silicon/robot/robot.dm | 6 +- .../simple_animal/friendly/spiderbot.dm | 2 +- code/modules/mob/transform_procs.dm | 2 +- .../research/designs/medical_designs.dm | 8 +-- code/modules/surgery/organs/mmi_holder.dm | 36 ++++++++++ .../surgery/organs/subtypes/machine.dm | 62 ++---------------- icons/obj/module.dmi | Bin 15135 -> 16573 bytes paradise.dme | 3 +- 18 files changed, 98 insertions(+), 143 deletions(-) rename code/modules/mob/living/carbon/brain/{posibrain.dm => robotic_brain.dm} (78%) create mode 100644 code/modules/surgery/organs/mmi_holder.dm diff --git a/_maps/map_files/cyberiad/cyberiad.dmm b/_maps/map_files/cyberiad/cyberiad.dmm index 9924d4708ad..b7cedf65c09 100644 --- a/_maps/map_files/cyberiad/cyberiad.dmm +++ b/_maps/map_files/cyberiad/cyberiad.dmm @@ -4948,7 +4948,7 @@ "bRi" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/floor/plasteel{icon_state = "white"},/area/assembly/robotics) "bRj" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/assembly/robotics) "bRk" = (/obj/structure/table,/obj/item/FixOVein,/obj/item/surgicaldrill,/obj/item/bonegel,/obj/item/bonesetter,/obj/item/retractor,/obj/item/hemostat,/obj/item/cautery,/obj/item/stack/medical/bruise_pack/advanced{pixel_x = -4; pixel_y = 4},/turf/simulated/floor/plasteel,/area/assembly/robotics) -"bRl" = (/obj/effect/decal/warning_stripes/east,/obj/structure/window/reinforced/tinted{dir = 4; icon_state = "twindow"; tag = ""},/obj/structure/table,/obj/item/mmi,/obj/item/mmi,/obj/item/mmi,/obj/item/mmi/posibrain,/obj/item/robotanalyzer,/turf/simulated/floor/plasteel,/area/assembly/robotics) +"bRl" = (/obj/effect/decal/warning_stripes/east,/obj/structure/window/reinforced/tinted{dir = 4; icon_state = "twindow"; tag = ""},/obj/structure/table,/obj/item/mmi,/obj/item/mmi,/obj/item/mmi,/obj/item/mmi/robotic_brain,/obj/item/robotanalyzer,/turf/simulated/floor/plasteel,/area/assembly/robotics) "bRm" = (/obj/structure/table,/obj/item/storage/firstaid/regular{empty = 1; name = "First-Aid (empty)"},/obj/item/storage/firstaid/regular{empty = 1; name = "First-Aid (empty)"},/obj/item/storage/firstaid/regular{empty = 1; name = "First-Aid (empty)"},/obj/item/healthanalyzer,/obj/item/healthanalyzer,/obj/item/healthanalyzer,/obj/machinery/newscaster{pixel_x = 26; pixel_y = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/assembly/robotics) "bRn" = (/obj/machinery/door/poddoor{density = 0; icon_state = "open"; id_tag = "Biohazard"; name = "Biohazard Shutter"; opacity = 0},/turf/simulated/floor/plasteel{icon_state = "bot"},/area/medical/research{name = "Research Division"}) "bRo" = (/obj/machinery/door/poddoor{density = 0; icon_state = "open"; id_tag = "Biohazard"; name = "Biohazard Shutter"; opacity = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/camera{c_tag = "Research Hallway Entrance"; dir = 2; network = list("Research","SS13")},/turf/simulated/floor/plasteel{icon_state = "bot"},/area/medical/research{name = "Research Division"}) diff --git a/code/game/machinery/computer/ai_core.dm b/code/game/machinery/computer/ai_core.dm index 2b3c338fa3d..1a32e8a94ee 100644 --- a/code/game/machinery/computer/ai_core.dm +++ b/code/game/machinery/computer/ai_core.dm @@ -117,7 +117,7 @@ return laws = M.laws - if(istype(P, /obj/item/mmi) || istype(P, /obj/item/mmi/posibrain)) + if(istype(P, /obj/item/mmi) || istype(P, /obj/item/mmi/robotic_brain)) if(!P:brainmob) to_chat(user, "Sticking an empty [P] into the frame would sort of defeat the purpose.") return diff --git a/code/game/machinery/cryopod.dm b/code/game/machinery/cryopod.dm index 0f09d337897..332dc2854e1 100644 --- a/code/game/machinery/cryopod.dm +++ b/code/game/machinery/cryopod.dm @@ -239,7 +239,7 @@ ) // These items will NOT be preserved var/list/do_not_preserve_items = list ( - /obj/item/mmi/posibrain + /obj/item/mmi/robotic_brain ) /obj/machinery/cryopod/right diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index d054c163732..a2fa4220c3c 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -1206,10 +1206,10 @@ occupant = brainmob brainmob.forceMove(src) //should allow relaymove brainmob.canmove = 1 - if(istype(mmi_as_oc, /obj/item/mmi/posibrain)) - var/obj/item/mmi/posibrain/P = mmi_as_oc - if(P.imprinted_master) - to_chat(brainmob, "Your imprint to [P.imprinted_master] has been temporarily disabled. You should help the crew and not commit harm.") + if(istype(mmi_as_oc, /obj/item/mmi/robotic_brain)) + var/obj/item/mmi/robotic_brain/R = mmi_as_oc + if(R.imprinted_master) + to_chat(brainmob, "Your imprint to [R.imprinted_master] has been temporarily disabled. You should help the crew and not commit harm.") mmi_as_oc.loc = src mmi_as_oc.mecha = src verbs -= /obj/mecha/verb/eject @@ -1309,10 +1309,10 @@ mmi.mecha = null mmi.update_icon() L.canmove = 0 - if(istype(mmi, /obj/item/mmi/posibrain)) - var/obj/item/mmi/posibrain/P = mmi - if(P.imprinted_master) - to_chat(L, "Imprint re-enabled, you are once again bound to [P.imprinted_master]'s commands.") + if(istype(mmi, /obj/item/mmi/robotic_brain)) + var/obj/item/mmi/robotic_brain/R = mmi + if(R.imprinted_master) + to_chat(L, "Imprint re-enabled, you are once again bound to [R.imprinted_master]'s commands.") icon_state = initial(icon_state)+"-open" dir = dir_in diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index 91c237a0328..44075d06548 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -823,19 +823,6 @@ var/list/admin_verbs_ticket = list( if(!check_rights(R_ADMIN)) return - if(!istype(H)) - if(istype(H, /mob/living/carbon/brain)) - var/mob/living/carbon/brain/B = H - if(istype(B.container, /obj/item/mmi/posibrain/ipc)) - var/obj/item/mmi/posibrain/ipc/C = B.container - var/obj/item/organ/internal/brain/mmi_holder/posibrain/P = C.loc - if(istype(P.owner, /mob/living/carbon/human)) - H = P.owner - else - return - else - return - if(holder) admin_log_and_message_admins("is altering the appearance of [H].") H.change_appearance(APPEARANCE_ALL, usr, usr, check_species_whitelist = 0) @@ -849,19 +836,6 @@ var/list/admin_verbs_ticket = list( if(!check_rights(R_ADMIN)) return - if(!istype(H)) - if(istype(H, /mob/living/carbon/brain)) - var/mob/living/carbon/brain/B = H - if(istype(B.container, /obj/item/mmi/posibrain/ipc)) - var/obj/item/mmi/posibrain/ipc/C = B.container - var/obj/item/organ/internal/brain/mmi_holder/posibrain/P = C.loc - if(istype(P.owner, /mob/living/carbon/human)) - H = P.owner - else - return - else - return - if(!H.client) to_chat(usr, "Only mobs with clients can alter their own appearance.") return diff --git a/code/modules/clothing/spacesuits/rig/modules/computer.dm b/code/modules/clothing/spacesuits/rig/modules/computer.dm index 49991df72d7..74af696e76e 100644 --- a/code/modules/clothing/spacesuits/rig/modules/computer.dm +++ b/code/modules/clothing/spacesuits/rig/modules/computer.dm @@ -116,7 +116,7 @@ return 1 // Okay, it wasn't a terminal being touched, check for all the simple insertions. - if(input_device.type in list(/obj/item/paicard, /obj/item/mmi, /obj/item/mmi/posibrain)) + if(input_device.type in list(/obj/item/paicard, /obj/item/mmi, /obj/item/mmi/robotic_brain)) if(integrated_ai) integrated_ai.attackby(input_device,user) // If the transfer was successful, we can clear out our vars. diff --git a/code/modules/mob/living/carbon/brain/MMI.dm b/code/modules/mob/living/carbon/brain/MMI.dm index 7b0e58ba5eb..e3069f4d5d3 100644 --- a/code/modules/mob/living/carbon/brain/MMI.dm +++ b/code/modules/mob/living/carbon/brain/MMI.dm @@ -265,8 +265,6 @@ forceMove(holder) holder.stored_mmi = src holder.update_from_mmi() - if(istype(src, /obj/item/mmi/posibrain)) - holder.robotize() if(brainmob && brainmob.mind) brainmob.mind.transfer_to(H) holder.insert(H) diff --git a/code/modules/mob/living/carbon/brain/posibrain.dm b/code/modules/mob/living/carbon/brain/robotic_brain.dm similarity index 78% rename from code/modules/mob/living/carbon/brain/posibrain.dm rename to code/modules/mob/living/carbon/brain/robotic_brain.dm index 9ab4a153f4d..f46613527b2 100644 --- a/code/modules/mob/living/carbon/brain/posibrain.dm +++ b/code/modules/mob/living/carbon/brain/robotic_brain.dm @@ -1,8 +1,8 @@ -/obj/item/mmi/posibrain +/obj/item/mmi/robotic_brain name = "robotic 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" + desc = "An advanced circuit, capable of housing an advanced non-sentient synthetic intelligence." + icon = 'icons/obj/module.dmi' + icon_state = "boris_blank" w_class = WEIGHT_CLASS_NORMAL origin_tech = "biotech=3;programming=3;plasmatech=2" @@ -17,11 +17,11 @@ var/requires_master = TRUE var/mob/living/carbon/human/imprinted_master = null -/obj/item/mmi/posibrain/Destroy() +/obj/item/mmi/robotic_brain/Destroy() imprinted_master = null return ..() -/obj/item/mmi/posibrain/attack_self(mob/user) +/obj/item/mmi/robotic_brain/attack_self(mob/user) if(requires_master && !imprinted_master) to_chat(user, "You press your thumb on [src] and imprint your user information.") imprinted_master = user @@ -29,7 +29,7 @@ if(brainmob && !brainmob.key && searching == 0) //Start the process of searching for a new user. to_chat(user, "You carefully locate the manual activation switch and start [src]'s boot process.") - icon_state = "posibrain-searching" + icon_state = "boris_recharging" ghost_volunteers.Cut() searching = 1 request_player() @@ -47,12 +47,12 @@ if(brainmob && brainmob.key) to_chat(brainmob, "Your internal speaker has been toggled [silenced ? "off" : "on"].") -/obj/item/mmi/posibrain/proc/request_player() +/obj/item/mmi/robotic_brain/proc/request_player() for(var/mob/dead/observer/O in player_list) if(check_observer(O)) to_chat(O, "\A [src] has been activated. (Teleport | Sign Up)") -/obj/item/mmi/posibrain/proc/check_observer(var/mob/dead/observer/O) +/obj/item/mmi/robotic_brain/proc/check_observer(var/mob/dead/observer/O) if(cannotPossess(O)) return 0 if(jobban_isbanned(O, "Cyborg") || jobban_isbanned(O,"nonhumandept")) @@ -63,7 +63,7 @@ return 1 return 0 -/obj/item/mmi/posibrain/proc/question(var/client/C) +/obj/item/mmi/robotic_brain/proc/question(var/client/C) spawn(0) if(!C) return var/response = alert(C, "Someone is requesting a personality for a [src]. Would you like to play as one?", "[src] request", "Yes", "No", "Never for this round") @@ -74,11 +74,11 @@ C.prefs.be_special -= ROLE_POSIBRAIN // This should not ever happen, but let's be safe -/obj/item/mmi/posibrain/dropbrain(var/turf/dropspot) +/obj/item/mmi/robotic_brain/dropbrain(var/turf/dropspot) log_runtime(EXCEPTION("[src] at [loc] attempted to drop brain without a contained brain."), src) return -/obj/item/mmi/posibrain/transfer_identity(var/mob/living/carbon/H) +/obj/item/mmi/robotic_brain/transfer_identity(var/mob/living/carbon/H) name = "[src] ([H])" if(isnull(brainmob.dna)) brainmob.dna = H.dna.Clone() @@ -90,51 +90,51 @@ brainmob.mind.assigned_role = "Positronic Brain" if(H.mind) H.mind.transfer_to(brainmob) - to_chat(brainmob, "You feel slightly disoriented. That's normal when you're just a metal cube.") - become_occupied("posibrain-occupied") + to_chat(brainmob, "You feel slightly disoriented. That's normal when you're just a circuit.") + become_occupied("boris") if(radio) radio_action.ApplyIcon() return -/obj/item/mmi/posibrain/attempt_become_organ(obj/item/organ/external/parent, mob/living/carbon/human/H) +/obj/item/mmi/robotic_brain/attempt_become_organ(obj/item/organ/external/parent, mob/living/carbon/human/H) if(..()) if(imprinted_master) to_chat(H, "You are permanently imprinted to [imprinted_master], obey [imprinted_master]'s every order and assist [imprinted_master.p_them()] in completing [imprinted_master.p_their()] goals at any cost.") -/obj/item/mmi/posibrain/proc/transfer_personality(mob/candidate) +/obj/item/mmi/robotic_brain/proc/transfer_personality(mob/candidate) searching = 0 brainmob.key = candidate.key name = "[src] ([brainmob.name])" to_chat(brainmob, "You are a [src], brought into existence on [station_name()].") - to_chat(brainmob, "As a synthetic intelligence, you answer to [imprinted_master], unless otherwise placed inside of a lawed synthetic structure or mech.") + to_chat(brainmob, "As a non-sentient synthetic intelligence, you answer to [imprinted_master], unless otherwise placed inside of a lawed synthetic structure or mech.") to_chat(brainmob, "Remember, the purpose of your existence is to serve [imprinted_master]'s every word, unless lawed or placed into a mech in the future.") brainmob.mind.assigned_role = "Positronic Brain" var/turf/T = get_turf_or_move(loc) for(var/mob/M in viewers(T)) M.show_message("[src] chimes quietly.") - become_occupied("posibrain-occupied") + become_occupied("boris") -/obj/item/mmi/posibrain/proc/reset_search() //We give the players sixty seconds to decide, then reset the timer. +/obj/item/mmi/robotic_brain/proc/reset_search() //We give the players sixty seconds to decide, then reset the timer. if(src.brainmob && src.brainmob.key) return src.searching = 0 - icon_state = "posibrain" + icon_state = "boris_blank" var/turf/T = get_turf_or_move(src.loc) for(var/mob/M in viewers(T)) - M.show_message("The [src] buzzes quietly, and the golden lights fade away. Perhaps you could try again?") + M.show_message("[src] buzzes quietly as the red light fades out. Perhaps you could try again?") -/obj/item/mmi/posibrain/Topic(href,href_list) +/obj/item/mmi/robotic_brain/Topic(href,href_list) if("signup" in href_list) var/mob/dead/observer/O = locate(href_list["signup"]) if(!O) return volunteer(O) -/obj/item/mmi/posibrain/proc/volunteer(var/mob/dead/observer/O) +/obj/item/mmi/robotic_brain/proc/volunteer(var/mob/dead/observer/O) if(!searching) to_chat(O, "Not looking for a ghost, yet.") return @@ -158,7 +158,7 @@ ghost_volunteers.Add(O) -/obj/item/mmi/posibrain/examine(mob/user) +/obj/item/mmi/robotic_brain/examine(mob/user) to_chat(user, "Its speaker is turned [silenced ? "off" : "on"].") to_chat(user, "*---------*") . = ..() @@ -179,7 +179,7 @@ msg += "*---------*" to_chat(user, msg.Join("")) -/obj/item/mmi/posibrain/emp_act(severity) +/obj/item/mmi/robotic_brain/emp_act(severity) if(!src.brainmob) return else @@ -192,7 +192,7 @@ src.brainmob.emp_damage += rand(0,10) ..() -/obj/item/mmi/posibrain/New() +/obj/item/mmi/robotic_brain/New() src.brainmob = new(src) src.brainmob.name = "[pick(list("PBU","HIU","SINA","ARMA","OSI"))]-[rand(100, 999)]" src.brainmob.real_name = src.brainmob.name @@ -204,7 +204,7 @@ ..() -/obj/item/mmi/posibrain/attack_ghost(var/mob/dead/observer/O) +/obj/item/mmi/robotic_brain/attack_ghost(var/mob/dead/observer/O) if(searching) volunteer(O) return @@ -215,10 +215,4 @@ playsound(get_turf(src), 'sound/items/posiping.ogg', 80, 0) var/turf/T = get_turf_or_move(src.loc) for(var/mob/M in viewers(T)) - M.show_message("[src] pings softly.") - -/obj/item/mmi/posibrain/ipc - name = "positronic brain" - desc = "A cube of shining metal, four inches to a side and covered in shallow grooves." - silenced = 1 - requires_master = FALSE + M.show_message("[src] pings softly.") \ No newline at end of file diff --git a/code/modules/mob/living/carbon/brain/say.dm b/code/modules/mob/living/carbon/brain/say.dm index 4a34d2d1b05..907a2e4862d 100644 --- a/code/modules/mob/living/carbon/brain/say.dm +++ b/code/modules/mob/living/carbon/brain/say.dm @@ -22,9 +22,9 @@ if(!istype(container, /obj/item/mmi)) . = FALSE - else if(istype(container, /obj/item/mmi/posibrain)) - var/obj/item/mmi/posibrain/P = container - if(P && P.silenced) + else if(istype(container, /obj/item/mmi/robotic_brain)) + var/obj/item/mmi/robotic_brain/R = container + if(R && R.silenced) if(warning) to_chat(usr, "You cannot speak, as your internal speaker is turned off.") . = FALSE diff --git a/code/modules/mob/living/carbon/human/species/station.dm b/code/modules/mob/living/carbon/human/species/station.dm index 6b692601226..f0f9b359252 100644 --- a/code/modules/mob/living/carbon/human/species/station.dm +++ b/code/modules/mob/living/carbon/human/species/station.dm @@ -958,7 +958,7 @@ butt_sprite = "machine" has_organ = list( - "brain" = /obj/item/organ/internal/brain/mmi_holder/posibrain, + "brain" = /obj/item/organ/internal/brain/posibrain, "cell" = /obj/item/organ/internal/cell, "optics" = /obj/item/organ/internal/eyes/optical_sensor, //Default darksight of 2. "charger" = /obj/item/organ/internal/cyberimp/arm/power_cord diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index 4f6707e93f0..755b874667a 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -131,8 +131,8 @@ var/list/robot_verbs_default = list( camera.status = 0 if(mmi == null) - mmi = new /obj/item/mmi/posibrain(src) //Give the borg an MMI if he spawns without for some reason. (probably not the correct way to spawn a posibrain, but it works) - mmi.icon_state="posibrain-occupied" + mmi = new /obj/item/mmi/robotic_brain(src) //Give the borg an MMI if he spawns without for some reason. (probably not the correct way to spawn a robotic brain, but it works) + mmi.icon_state = "boris" initialize_components() //if(!unfinished) @@ -210,7 +210,7 @@ var/list/robot_verbs_default = list( if(prefix) modtype = prefix if(mmi) - if(istype(mmi, /obj/item/mmi/posibrain)) + if(istype(mmi, /obj/item/mmi/robotic_brain)) braintype = "Android" else braintype = "Cyborg" diff --git a/code/modules/mob/living/simple_animal/friendly/spiderbot.dm b/code/modules/mob/living/simple_animal/friendly/spiderbot.dm index b98d4181475..37ed25f15e8 100644 --- a/code/modules/mob/living/simple_animal/friendly/spiderbot.dm +++ b/code/modules/mob/living/simple_animal/friendly/spiderbot.dm @@ -157,7 +157,7 @@ if(istype(mmi, /obj/item/mmi)) icon_state = "spiderbot-chassis-mmi" icon_living = "spiderbot-chassis-mmi" - if(istype(mmi, /obj/item/mmi/posibrain)) + if(istype(mmi, /obj/item/mmi/robotic_brain)) icon_state = "spiderbot-chassis-posi" icon_living = "spiderbot-chassis-posi" diff --git a/code/modules/mob/transform_procs.dm b/code/modules/mob/transform_procs.dm index 82aebda3a42..a1ed4f0bde9 100644 --- a/code/modules/mob/transform_procs.dm +++ b/code/modules/mob/transform_procs.dm @@ -86,7 +86,7 @@ if(O.mind && O.mind.assigned_role == "Cyborg") if(O.mind.role_alt_title == "Android") - O.mmi = new /obj/item/mmi/posibrain(O) + O.mmi = new /obj/item/mmi/robotic_brain(O) else if(O.mind.role_alt_title == "Robot") O.mmi = null //Robots do not have removable brains. else diff --git a/code/modules/research/designs/medical_designs.dm b/code/modules/research/designs/medical_designs.dm index 5782d9f19c8..638a614fc85 100644 --- a/code/modules/research/designs/medical_designs.dm +++ b/code/modules/research/designs/medical_designs.dm @@ -103,15 +103,15 @@ build_path = /obj/item/mass_spectrometer category = list("Medical") -/datum/design/posibrain +/datum/design/robotic_brain name = "Robotic Brain" - desc = "The latest in Artificial Intelligences." - id = "mmi_posi" + desc = "The latest in non-sentient Artificial Intelligences." + id = "mmi_robotic" req_tech = list("programming" = 5, "biotech" = 4, "plasmatech" = 3) build_type = PROTOLATHE | MECHFAB materials = list(MAT_METAL = 1700, MAT_GLASS = 1350, MAT_GOLD = 500) //Gold, because SWAG. construction_time = 75 - build_path = /obj/item/mmi/posibrain + build_path = /obj/item/mmi/robotic_brain category = list("Misc","Medical") /datum/design/mmi_radio_upgrade diff --git a/code/modules/surgery/organs/mmi_holder.dm b/code/modules/surgery/organs/mmi_holder.dm new file mode 100644 index 00000000000..8b5834bd8fc --- /dev/null +++ b/code/modules/surgery/organs/mmi_holder.dm @@ -0,0 +1,36 @@ +// Used for an MMI or robotic brain being installed into a human. +/obj/item/organ/internal/brain/mmi_holder + name = "Man-Machine Interface" + parent_organ = "chest" + status = ORGAN_ROBOT + var/obj/item/mmi/stored_mmi + +/obj/item/organ/internal/brain/mmi_holder/Destroy() + QDEL_NULL(stored_mmi) + return ..() + +/obj/item/organ/internal/brain/mmi_holder/insert(mob/living/target, special = 0) + ..() + // To supersede the over-writing of the MMI's name from `insert` + update_from_mmi() + +/obj/item/organ/internal/brain/mmi_holder/remove(mob/living/user, special = 0) + if(!special) + if(stored_mmi) + . = stored_mmi + if(owner.mind) + owner.mind.transfer_to(stored_mmi.brainmob) + stored_mmi.forceMove(get_turf(owner)) + stored_mmi = null + ..() + if(!QDELETED(src)) + qdel(src) + +/obj/item/organ/internal/brain/mmi_holder/proc/update_from_mmi() + if(!stored_mmi) + return + name = stored_mmi.name + desc = stored_mmi.desc + icon = stored_mmi.icon + icon_state = stored_mmi.icon_state + set_dna(stored_mmi.brainmob.dna) \ No newline at end of file diff --git a/code/modules/surgery/organs/subtypes/machine.dm b/code/modules/surgery/organs/subtypes/machine.dm index 15f0bc5c118..cbcf2217b66 100644 --- a/code/modules/surgery/organs/subtypes/machine.dm +++ b/code/modules/surgery/organs/subtypes/machine.dm @@ -136,60 +136,12 @@ . = ..() -// Used for an MMI or posibrain being installed into a human. -/obj/item/organ/internal/brain/mmi_holder - name = "brain" - organ_tag = "brain" +/obj/item/organ/internal/brain/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-occupied" + dead_icon = "posibrain" parent_organ = "chest" - vital = TRUE - max_damage = 200 - slot = "brain" status = ORGAN_ROBOT - species = "Machine" - var/obj/item/mmi/stored_mmi - -/obj/item/organ/internal/brain/mmi_holder/Destroy() - QDEL_NULL(stored_mmi) - return ..() - -/obj/item/organ/internal/brain/mmi_holder/insert(var/mob/living/target,special = 0) - ..() - // To supersede the over-writing of the MMI's name from `insert` - update_from_mmi() - -/obj/item/organ/internal/brain/mmi_holder/remove(var/mob/living/user,special = 0) - if(!special) - if(stored_mmi) - . = stored_mmi - if(owner.mind) - owner.mind.transfer_to(stored_mmi.brainmob) - stored_mmi.forceMove(get_turf(owner)) - stored_mmi = null - ..() - if(!QDELETED(src)) - qdel(src) - -/obj/item/organ/internal/brain/mmi_holder/proc/update_from_mmi() - if(!stored_mmi) - return - name = stored_mmi.name - desc = stored_mmi.desc - icon = stored_mmi.icon - icon_state = stored_mmi.icon_state - set_dna(stored_mmi.brainmob.dna) - -/obj/item/organ/internal/brain/mmi_holder/posibrain/New() - robotize() - stored_mmi = new /obj/item/mmi/posibrain/ipc(src) - ..() - spawn(1) - if(!QDELETED(src)) - if(owner) - stored_mmi.name = "positronic brain ([owner.real_name])" - stored_mmi.brainmob.real_name = owner.real_name - stored_mmi.brainmob.name = stored_mmi.brainmob.real_name - stored_mmi.icon_state = "posibrain-occupied" - update_from_mmi() - else - stored_mmi.loc = get_turf(src) - qdel(src) + species = "Machine" \ No newline at end of file diff --git a/icons/obj/module.dmi b/icons/obj/module.dmi index 0a269e0d8b7cc7b522441e8c8ad4add36322e0e4..ab76789a0f0dda010c9819d3e328b1b63ed778ba 100644 GIT binary patch literal 16573 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 NujN!_%U&7>{4e-+$`k+q diff --git a/paradise.dme b/paradise.dme index 85bf34aeeac..27b83d130fb 100644 --- a/paradise.dme +++ b/paradise.dme @@ -1621,7 +1621,7 @@ #include "code\modules\mob\living\carbon\brain\login.dm" #include "code\modules\mob\living\carbon\brain\MMI.dm" #include "code\modules\mob\living\carbon\brain\MMI_radio.dm" -#include "code\modules\mob\living\carbon\brain\posibrain.dm" +#include "code\modules\mob\living\carbon\brain\robotic_brain.dm" #include "code\modules\mob\living\carbon\brain\say.dm" #include "code\modules\mob\living\carbon\brain\update_status.dm" #include "code\modules\mob\living\carbon\human\appearance.dm" @@ -2191,6 +2191,7 @@ #include "code\modules\surgery\organs\kidneys.dm" #include "code\modules\surgery\organs\liver.dm" #include "code\modules\surgery\organs\lungs.dm" +#include "code\modules\surgery\organs\mmi_holder.dm" #include "code\modules\surgery\organs\organ.dm" #include "code\modules\surgery\organs\organ_external.dm" #include "code\modules\surgery\organs\organ_icon.dm"