diff --git a/code/_globalvars/lists/flavor_misc.dm b/code/_globalvars/lists/flavor_misc.dm
index 8b0ac278cd..47b7e2ab62 100644
--- a/code/_globalvars/lists/flavor_misc.dm
+++ b/code/_globalvars/lists/flavor_misc.dm
@@ -40,6 +40,54 @@ GLOBAL_LIST_EMPTY(caps_list)
GLOBAL_LIST_INIT(ghost_forms_with_directions_list, list("ghost")) //stores the ghost forms that support directional sprites
GLOBAL_LIST_INIT(ghost_forms_with_accessories_list, list("ghost")) //stores the ghost forms that support hair and other such things
+GLOBAL_LIST_INIT(ai_core_display_screens, list(
+ ":thinking:",
+ "Alien",
+ "Angel",
+ "Banned",
+ "Bliss",
+ "Blue",
+ "Clown",
+ "Database",
+ "Dorf",
+ "Firewall",
+ "Fuzzy",
+ "Gentoo",
+ "Glitchman",
+ "Gondola",
+ "Goon",
+ "Hades",
+ "Heartline",
+ "Helios",
+ "House",
+ "Inverted",
+ "Matrix",
+ "Monochrome",
+ "Murica",
+ "Nanotrasen",
+ "Not Malf",
+ "President",
+ "Random",
+ "Rainbow",
+ "Red",
+ "Red October",
+ "Static",
+ "Syndicat Meow",
+ "TechDemon",
+ "Text",
+ "Too Deep",
+ "Triumvirate",
+ "Triumvirate-M",
+ "Weird"))
+
+/proc/resolve_ai_icon(input)
+ if(!input || !(input in GLOB.ai_core_display_screens))
+ return "ai"
+ else
+ if(input == "Random")
+ input = pick(GLOB.ai_core_display_screens - "Random")
+ return "ai-[lowertext(input)]"
+
GLOBAL_LIST_INIT(security_depts_prefs, list(SEC_DEPT_RANDOM, SEC_DEPT_NONE, SEC_DEPT_ENGINEERING, SEC_DEPT_MEDICAL, SEC_DEPT_SCIENCE, SEC_DEPT_SUPPLY))
//Backpacks
@@ -117,7 +165,7 @@ GLOBAL_LIST_INIT(TAGGERLOCATIONS, list("Disposals",
"CMO Office", "Chemistry", "Research", "RD Office",
"Robotics", "HoP Office", "Library", "Chapel", "Theatre",
"Bar", "Kitchen", "Hydroponics", "Janitor Closet","Genetics",
- "Circuitry", "Toxins", "Dormitories", "Virology",
+ "Circuitry", "Toxins", "Dormitories", "Virology",
"Xenobiology", "Law Office","Detective's Office"))
GLOBAL_LIST_INIT(station_prefixes, world.file2list("strings/station_prefixes.txt") + "")
diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm
index 91a329c67b..a0eea344a3 100644
--- a/code/modules/client/preferences.dm
+++ b/code/modules/client/preferences.dm
@@ -154,6 +154,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
)
var/list/custom_names = list()
+ var/preferred_ai_core_display = "Blue"
var/prefered_security_department = SEC_DEPT_RANDOM
var/custom_species = null
@@ -303,10 +304,11 @@ GLOBAL_LIST_EMPTY(preferences_datums)
old_group = namedata["group"]
dat += "
"
dat += "[namedata["pref_name"]]: [custom_names[custom_name_id]] "
- dat += "
"
- dat += "Custom job preferences:
"
- dat += "Prefered security department: [prefered_security_department]
"
+ dat += "
"
+ dat += "Custom job preferences:
"
+ dat += "Preferred AI Core Display: [preferred_ai_core_display]
"
+ dat += "Preferred Security Department: [prefered_security_department]
"
dat += ""
//Character Appearance
@@ -1939,8 +1941,13 @@ GLOBAL_LIST_EMPTY(preferences_datums)
if(new_loc)
uplink_spawn_loc = new_loc
+ if("ai_core_icon")
+ var/ai_core_icon = input(user, "Choose your preferred AI core display screen:", "AI Core Display Screen Selection") as null|anything in GLOB.ai_core_display_screens
+ if(ai_core_icon)
+ preferred_ai_core_display = ai_core_icon
+
if("sec_dept")
- var/department = input(user, "Choose your prefered security department:", "Security Departments") as null|anything in GLOB.security_depts_prefs
+ var/department = input(user, "Choose your preferred security department:", "Security Departments") as null|anything in GLOB.security_depts_prefs
if(department)
prefered_security_department = department
diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm
index c2675ba867..7401a54efc 100644
--- a/code/modules/client/preferences_savefile.dm
+++ b/code/modules/client/preferences_savefile.dm
@@ -284,6 +284,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
var/savefile_slot_name = custom_name_id + "_name" //TODO remove this
S[savefile_slot_name] >> custom_names[custom_name_id]
+ S["preferred_ai_core_display"] >> preferred_ai_core_display
S["prefered_security_department"] >> prefered_security_department
//Jobs
@@ -483,6 +484,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
var/savefile_slot_name = custom_name_id + "_name" //TODO remove this
WRITE_FILE(S[savefile_slot_name],custom_names[custom_name_id])
+ WRITE_FILE(S["preferred_ai_core_display"] , preferred_ai_core_display)
WRITE_FILE(S["prefered_security_department"] , prefered_security_department)
//Jobs
diff --git a/code/modules/jobs/job_types/silicon.dm b/code/modules/jobs/job_types/silicon.dm
index 662f666cf1..ab963eb8f3 100644
--- a/code/modules/jobs/job_types/silicon.dm
+++ b/code/modules/jobs/job_types/silicon.dm
@@ -35,6 +35,7 @@ AI
qdel(lateJoinCore)
var/mob/living/silicon/ai/AI = H
AI.apply_pref_name("ai", M.client) //If this runtimes oh well jobcode is fucked.
+ AI.set_core_display_icon(null, M.client)
//we may have been created after our borg
if(SSticker.current_state == GAME_STATE_SETTING_UP)
diff --git a/code/modules/mob/dead/new_player/preferences_setup.dm b/code/modules/mob/dead/new_player/preferences_setup.dm
index fc879ed7a8..353df3aa66 100644
--- a/code/modules/mob/dead/new_player/preferences_setup.dm
+++ b/code/modules/mob/dead/new_player/preferences_setup.dm
@@ -28,7 +28,7 @@
if(job_engsec_high)
switch(job_engsec_high)
if(AI_JF)
- parent.show_character_previews(image('icons/mob/ai.dmi', icon_state = "AI", dir = SOUTH))
+ parent.show_character_previews(image('icons/mob/ai.dmi', resolve_ai_icon(preferred_ai_core_display), dir = SOUTH))
return
if(CYBORG)
parent.show_character_previews(image('icons/mob/robots.dmi', icon_state = "robot", dir = SOUTH))
diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm
index b4524a54e6..16141b4a10 100644
--- a/code/modules/mob/living/silicon/ai/ai.dm
+++ b/code/modules/mob/living/silicon/ai/ai.dm
@@ -86,12 +86,13 @@
var/datum/action/innate/deploy_last_shell/redeploy_action = new
var/chnotify = 0
-
+
var/multicam_on = FALSE
var/obj/screen/movable/pic_in_pic/ai/master_multicam
var/list/multicam_screens = list()
var/list/all_eyes = list()
var/max_multicams = 6
+ var/display_icon_override
/mob/living/silicon/ai/Initialize(mapload, datum/ai_laws/L, mob/target_ai)
. = ..()
@@ -127,6 +128,8 @@
create_eye()
apply_pref_name("ai")
+ set_core_display_icon()
+
holo_icon = getHologramIcon(icon('icons/mob/ai.dmi',"default"))
spark_system = new /datum/effect_system/spark_spread()
@@ -172,81 +175,33 @@
fire_stacks = 0
. = ..()
+/mob/living/silicon/ai/proc/set_core_display_icon(input, client/C)
+ if(client && !C)
+ C = client
+ if(!input && !C?.prefs?.preferred_ai_core_display)
+ icon_state = initial(icon_state)
+ else
+ var/preferred_icon = input ? input : C.prefs.preferred_ai_core_display
+ icon_state = resolve_ai_icon(preferred_icon)
+
/mob/living/silicon/ai/verb/pick_icon()
set category = "AI Commands"
set name = "Set AI Core Display"
if(incapacitated())
return
+ var/list/iconstates = GLOB.ai_core_display_screens
+ for(var/option in iconstates)
+ if(option == "Random")
+ iconstates[option] = image(icon = src.icon, icon_state = "ai-random")
+ continue
+ iconstates[option] = image(icon = src.icon, icon_state = resolve_ai_icon(option))
- var/icontype = input("Please, select a display!", "AI", null/*, null*/) in list("Clown", ":thinking:", "Monochrome", "Blue", "Inverted", "Firewall", "Green", "Red", "Static", "Red October", "House", "Heartline", "Hades", "Helios", "President", "Syndicat Meow", "Alien", "Too Deep", "Triumvirate", "Triumvirate-M", "Text", "Matrix", "Dorf", "Bliss", "Not Malf", "Fuzzy", "Goon", "Database", "Glitchman", "Murica", "Nanotrasen", "Gentoo", "Angel", "TechDemon") //CIT CHANGE - adds 'TechDemon
- if(icontype == "Clown")
- icon_state = "ai-clown2"
- else if (icontype == ":thinking:")
- icon_state = "ai-:thinking:"
- else if(icontype == "Monochrome")
- icon_state = "ai-mono"
- else if(icontype == "Blue")
- icon_state = "ai"
- else if(icontype == "Inverted")
- icon_state = "ai-u"
- else if(icontype == "Firewall")
- icon_state = "ai-magma"
- else if(icontype == "Green")
- icon_state = "ai-wierd"
- else if(icontype == "Red")
- icon_state = "ai-malf"
- else if(icontype == "Static")
- icon_state = "ai-static"
- else if(icontype == "Red October")
- icon_state = "ai-redoctober"
- else if(icontype == "House")
- icon_state = "ai-house"
- else if(icontype == "Heartline")
- icon_state = "ai-heartline"
- else if(icontype == "Hades")
- icon_state = "ai-hades"
- else if(icontype == "Helios")
- icon_state = "ai-helios"
- else if(icontype == "President")
- icon_state = "ai-pres"
- else if(icontype == "Syndicat Meow")
- icon_state = "ai-syndicatmeow"
- else if(icontype == "Alien")
- icon_state = "ai-alien"
- else if(icontype == "Too Deep")
- icon_state = "ai-toodeep"
- else if(icontype == "Triumvirate")
- icon_state = "ai-triumvirate"
- else if(icontype == "Triumvirate-M")
- icon_state = "ai-triumvirate-malf"
- else if(icontype == "Text")
- icon_state = "ai-text"
- else if(icontype == "Matrix")
- icon_state = "ai-matrix"
- else if(icontype == "Dorf")
- icon_state = "ai-dorf"
- else if(icontype == "Bliss")
- icon_state = "ai-bliss"
- else if(icontype == "Not Malf")
- icon_state = "ai-notmalf"
- else if(icontype == "Fuzzy")
- icon_state = "ai-fuzz"
- else if(icontype == "Goon")
- icon_state = "ai-goon"
- else if(icontype == "Database")
- icon_state = "ai-database"
- else if(icontype == "Glitchman")
- icon_state = "ai-glitchman"
- else if(icontype == "Murica")
- icon_state = "ai-murica"
- else if(icontype == "Nanotrasen")
- icon_state = "ai-nanotrasen"
- else if(icontype == "Gentoo")
- icon_state = "ai-gentoo"
- else if(icontype == "Angel")
- icon_state = "ai-angel"
- else if(icontype == "TechDemon") //CIT CHANGE - adds 'TechDemon
- icon_state = "ai-techdemon"
+ var/ai_core_icon = show_radial_menu(src, src , iconstates, radius = 42)
+ if(!ai_core_icon || incapacitated())
+ return
+ to_chat(src, "Core display screen set to \"[ai_core_icon]\".")
+ display_icon_override = ai_core_icon
+ set_core_display_icon(ai_core_icon)
/mob/living/silicon/ai/Stat()
..()
@@ -915,9 +870,9 @@
clear_fullscreen("remote_view", 0)
/mob/living/silicon/ai/revive(full_heal = 0, admin_revive = 0)
- if(..()) //successfully ressuscitated from death
- icon_state = "ai"
- . = 1
+ . = ..()
+ if(.) //successfully ressuscitated from death
+ set_core_display_icon(display_icon_override)
/mob/living/silicon/ai/proc/malfhacked(obj/machinery/power/apc/apc)
malfhack = null
diff --git a/code/modules/mob/living/silicon/ai/death.dm b/code/modules/mob/living/silicon/ai/death.dm
index 9b982d4bd5..301d2bd218 100644
--- a/code/modules/mob/living/silicon/ai/death.dm
+++ b/code/modules/mob/living/silicon/ai/death.dm
@@ -4,10 +4,13 @@
. = ..()
- if("[icon_state]_dead" in icon_states(src.icon,1))
+ var/old_icon = icon_state
+ if("[icon_state]_dead" in icon_states(icon))
icon_state = "[icon_state]_dead"
else
icon_state = "ai_dead"
+ if("[old_icon]_death_transition" in icon_states(icon))
+ flick("[old_icon]_death_transition", src)
cameraFollow = null
diff --git a/icons/mob/AI.dmi b/icons/mob/AI.dmi
index dac88d62fc..7de8152118 100644
Binary files a/icons/mob/AI.dmi and b/icons/mob/AI.dmi differ