diff --git a/code/game/objects/items/stacks/tape.dm b/code/game/objects/items/stacks/tape.dm
index 92fe31d32a98..d22b1be85344 100644
--- a/code/game/objects/items/stacks/tape.dm
+++ b/code/game/objects/items/stacks/tape.dm
@@ -47,7 +47,7 @@
/obj/item/stack/sticky_tape/super
name = "super sticky tape"
singular_name = "super sticky tape"
- desc = "Quite possibly the most mischevious substance in the galaxy. Use with extreme lack of caution."
+ desc = "Quite possibly the most mischievous substance in the galaxy. Use with extreme lack of caution."
icon_state = "tape_y"
prefix = "super sticky"
conferred_embed = EMBED_HARMLESS_SUPERIOR
diff --git a/code/modules/mob/living/silicon/pai/pai.dm b/code/modules/mob/living/silicon/pai/pai.dm
index be79cf7184ab..405cda36580c 100644
--- a/code/modules/mob/living/silicon/pai/pai.dm
+++ b/code/modules/mob/living/silicon/pai/pai.dm
@@ -67,7 +67,7 @@
var/can_receive = TRUE
var/obj/item/card/id/access_card = null
var/chassis = "repairbot"
- var/list/possible_chassis = list("cat" = TRUE, "mouse" = TRUE, "monkey" = TRUE, "corgi" = FALSE, "fox" = FALSE, "repairbot" = TRUE, "rabbit" = TRUE, "bat" = FALSE, "butterfly" = FALSE, "hawk" = FALSE, "lizard" = FALSE, "duffel" = TRUE, "snake" = FALSE) //assoc value is whether it can be picked up.
+ var/list/possible_chassis = list("bat" = TRUE, "butterfly" = TRUE, "carp" = TRUE, "cat" = TRUE, "corgi" = TRUE, "corgi_puppy" = TRUE, "crow" = TRUE, "duffel" = TRUE, "fox" = TRUE, "frog" = TRUE, "hawk" = TRUE, "lizard" = TRUE, "monkey" = TRUE, "mothroach" = TRUE, "mouse" = TRUE, "rabbit" = TRUE, "repairbot" = TRUE, "snake" = TRUE, "spider" = TRUE) //assoc value is whether it can be picked up.
var/emitterhealth = 20
var/emittermaxhealth = 20
diff --git a/code/modules/mob/living/silicon/pai/pai_shell.dm b/code/modules/mob/living/silicon/pai/pai_shell.dm
index ca65a416691c..31a807b319b2 100644
--- a/code/modules/mob/living/silicon/pai/pai_shell.dm
+++ b/code/modules/mob/living/silicon/pai/pai_shell.dm
@@ -72,11 +72,18 @@
holoform = FALSE
set_resting(resting)
+
+//Sets a new holochassis skin based on a pAI's choice
+
/mob/living/silicon/pai/proc/choose_chassis()
- if(!isturf(loc) && loc != card)
- to_chat(src, "You can not change your holochassis composite while not on the ground or in your card!")
- return FALSE
- var/choice = input(src, "What would you like to use for your holochassis composite?") as null|anything in sortList(possible_chassis)
+ var/list/skins = list()
+ for(var/holochassis_option in possible_chassis)
+ var/image/item_image = image(icon = src.icon, icon_state = holochassis_option)
+ skins += list("[holochassis_option]" = item_image)
+ sortList(skins)
+
+ var/atom/anchor = get_atom_on_turf(src)
+ var/choice = show_radial_menu(src, anchor, skins, custom_check = CALLBACK(src, PROC_REF(check_menu), anchor), radius = 40, require_near = TRUE)
if(!choice)
return FALSE
chassis = choice
@@ -85,6 +92,18 @@
update_resting()
to_chat(src, "You switch your holochassis projection composite to [chassis].")
+//Checks if we are allowed to interact with a radial menu
+
+/mob/living/silicon/pai/proc/check_menu(atom/anchor)
+ if(incapacitated())
+ return FALSE
+ if(get_turf(src) != get_turf(anchor))
+ return FALSE
+ if(!isturf(loc) && loc != card)
+ to_chat(src, "You can not change your holochassis composite while not on the ground or in your card!")
+ return FALSE
+ return TRUE
+
/mob/living/silicon/pai/update_resting()
. = ..()
if(resting)
diff --git a/code/modules/mob/living/silicon/pai/software.dm b/code/modules/mob/living/silicon/pai/software.dm
index a099c05488fa..08e41f3bee44 100644
--- a/code/modules/mob/living/silicon/pai/software.dm
+++ b/code/modules/mob/living/silicon/pai/software.dm
@@ -29,7 +29,7 @@ GLOBAL_LIST_INIT(pai_faces, list(
"laugh",
"lenny",
"loss",
- "michevious",
+ "mischievous",
"missingno",
"mistake",
"moth",
@@ -53,6 +53,60 @@ GLOBAL_LIST_INIT(pai_faces, list(
"woozy",
))
+// I AM A FAKE AND A FRAUD
+// in order to get radials to work, the below list utilizes an entirely new .dmi that combines the base pAI card sprite along with the two overlays.
+// if you want to add a pAI screen in future, you will need to use one of the two bases I included in aicardsradial.dmi in addition to adding the
+// screen sprite in aicards.dmi
+// I pray to god someone more talented than me can fix this hack in future
+
+GLOBAL_LIST_INIT(pai_faces_icons, list(
+ ":>" = image(icon = 'icons/obj/aicardsradial.dmi', icon_state = "pai-:>"),
+ "=_=" = image(icon = 'icons/obj/aicardsradial.dmi', icon_state = "pai-=_="),
+ "angry" = image(icon = 'icons/obj/aicardsradial.dmi', icon_state = "pai-angry"),
+ "ashamed" = image(icon = 'icons/obj/aicardsradial.dmi', icon_state = "pai-ashamed"),
+ "bookworm" = image(icon = 'icons/obj/aicardsradial.dmi', icon_state = "pai-bookworm"),
+ "boykisser" = image(icon = 'icons/obj/aicardsradial.dmi', icon_state = "pai-boykisser"),
+ "cat" = image(icon = 'icons/obj/aicardsradial.dmi', icon_state = "pai-cat"),
+ "clueless" = image(icon = 'icons/obj/aicardsradial.dmi', icon_state = "pai-clueless"),
+ "concerned" = image(icon = 'icons/obj/aicardsradial.dmi', icon_state = "pai-concerned"),
+ "dread" = image(icon = 'icons/obj/aicardsradial.dmi', icon_state = "pai-dread"),
+ "estatic" = image(icon = 'icons/obj/aicardsradial.dmi', icon_state = "pai-estatic"),
+ "exclaim" = image(icon = 'icons/obj/aicardsradial.dmi', icon_state = "pai-exclaim"),
+ "eye" = image(icon = 'icons/obj/aicardsradial.dmi', icon_state = "pai-eye"),
+ "eyewall" = image(icon = 'icons/obj/aicardsradial.dmi', icon_state = "pai-eyewall"),
+ "face" = image(icon = 'icons/obj/aicardsradial.dmi', icon_state = "pai-face"),
+ "fangs" = image(icon = 'icons/obj/aicardsradial.dmi', icon_state = "pai-fangs"),
+ "flushed" = image(icon = 'icons/obj/aicardsradial.dmi', icon_state = "pai-flushed"),
+ "foureyes" = image(icon = 'icons/obj/aicardsradial.dmi', icon_state = "pai-foureyes"),
+ "greenjary" = image(icon = 'icons/obj/aicardsradial.dmi', icon_state = "pai-greenjary"),
+ "happy" = image(icon = 'icons/obj/aicardsradial.dmi', icon_state = "pai-happy"),
+ "heart" = image(icon = 'icons/obj/aicardsradial.dmi', icon_state = "pai-heart"),
+ "laugh" = image(icon = 'icons/obj/aicardsradial.dmi', icon_state = "pai-laugh"),
+ "lenny" = image(icon = 'icons/obj/aicardsradial.dmi', icon_state = "pai-lenny"),
+ "loss" = image(icon = 'icons/obj/aicardsradial.dmi', icon_state = "pai-loss"),
+ "mischievous" = image(icon = 'icons/obj/aicardsradial.dmi', icon_state = "pai-mischievous"),
+ "missingno" = image(icon = 'icons/obj/aicardsradial.dmi', icon_state = "pai-missingno"),
+ "mistake" = image(icon = 'icons/obj/aicardsradial.dmi', icon_state = "pai-mistake"),
+ "moth" = image(icon = 'icons/obj/aicardsradial.dmi', icon_state = "pai-moth"),
+ "moyai" = image(icon = 'icons/obj/aicardsradial.dmi', icon_state = "pai-moyai"),
+ "neko" = image(icon = 'icons/obj/aicardsradial.dmi', icon_state = "pai-neko"),
+ "null" = image(icon = 'icons/obj/aicardsradial.dmi', icon_state = "pai-null"),
+ "o.o" = image(icon = 'icons/obj/aicardsradial.dmi', icon_state = "pai-o.o"),
+ "off" = image(icon = 'icons/obj/aicardsradial.dmi', icon_state = "pai-off"),
+ "pleading" = image(icon = 'icons/obj/aicardsradial.dmi', icon_state = "pai-pleading"),
+ "question" = image(icon = 'icons/obj/aicardsradial.dmi', icon_state = "pai-question"),
+ "sadcat" = image(icon = 'icons/obj/aicardsradial.dmi', icon_state = "pai-sadcat"),
+ "smug" = image(icon = 'icons/obj/aicardsradial.dmi', icon_state = "pai-smug"),
+ "snek" = image(icon = 'icons/obj/aicardsradial.dmi', icon_state = "pai-snek"),
+ "spiral" = image(icon = 'icons/obj/aicardsradial.dmi', icon_state = "pai-spiral"),
+ "sunglasses" = image(icon = 'icons/obj/aicardsradial.dmi', icon_state = "pai-sunglasses"),
+ "syndisnake" = image(icon = 'icons/obj/aicardsradial.dmi', icon_state = "pai-syndisnake"), //what if cybersun was right all along actually
+ "twoeyes" = image(icon = 'icons/obj/aicardsradial.dmi', icon_state = "pai-twoeyes"),
+ "T_T" = image(icon = 'icons/obj/aicardsradial.dmi', icon_state = "pai-T_T"),
+ "what" = image(icon = 'icons/obj/aicardsradial.dmi', icon_state = "pai-what"),
+ "wink" = image(icon = 'icons/obj/aicardsradial.dmi', icon_state = "pai-wink"),
+ "woozy" = image(icon = 'icons/obj/aicardsradial.dmi', icon_state = "pai-woozy"),
+ ))
/mob/living/silicon/pai/var/list/available_software = list( //WS -- idk what to do about removing code so i'm just putting this note here to say, removes messanger and manifest, thet get it for free now
//Nightvision
@@ -204,7 +258,8 @@ GLOBAL_LIST_INIT(pai_faces, list(
radio.attack_self(src)
if("image") // Set pAI card display face
- var/new_emotion = input("Select your new display image.", "Display Image", "null") in sortList(GLOB.pai_faces)
+ var/atom/anchor = get_atom_on_turf(src)
+ var/new_emotion = show_radial_menu(usr, anchor, GLOB.pai_faces_icons, radius = 40, require_near = TRUE)
card.set_emotion(new_emotion)
if("news")
diff --git a/icons/mob/pai.dmi b/icons/mob/pai.dmi
index 1c609686be11..4e46503e87c7 100644
Binary files a/icons/mob/pai.dmi and b/icons/mob/pai.dmi differ
diff --git a/icons/mob/pai_item_head.dmi b/icons/mob/pai_item_head.dmi
index 337e22254ea8..38db9379be12 100644
Binary files a/icons/mob/pai_item_head.dmi and b/icons/mob/pai_item_head.dmi differ
diff --git a/icons/mob/pai_item_lh.dmi b/icons/mob/pai_item_lh.dmi
index fb9c77f5abae..49cd390f8d2f 100644
Binary files a/icons/mob/pai_item_lh.dmi and b/icons/mob/pai_item_lh.dmi differ
diff --git a/icons/mob/pai_item_rh.dmi b/icons/mob/pai_item_rh.dmi
index ced27446a451..de7bc143b9c3 100644
Binary files a/icons/mob/pai_item_rh.dmi and b/icons/mob/pai_item_rh.dmi differ
diff --git a/icons/obj/aicards.dmi b/icons/obj/aicards.dmi
index 5698962eb9fb..a0b0ecba5be7 100644
Binary files a/icons/obj/aicards.dmi and b/icons/obj/aicards.dmi differ
diff --git a/icons/obj/aicardsradial.dmi b/icons/obj/aicardsradial.dmi
new file mode 100644
index 000000000000..ad5b874b221c
Binary files /dev/null and b/icons/obj/aicardsradial.dmi differ