From 08a3b660b7e4e8000cc98a2f6e78ee788f6b2e41 Mon Sep 17 00:00:00 2001 From: Timothy Teakettle <59849408+timothyteakettle@users.noreply.github.com> Date: Sat, 30 Mar 2024 17:07:36 +0000 Subject: [PATCH] allows pAIs to place up to 5 holograms of things they have scanned (#6363) --- citadel.dme | 1 + code/game/click/other_mobs.dm | 7 --- code/game/objects/items/devices/paicard.dm | 2 + .../modules/mob/living/silicon/pai/actions.dm | 18 ++++++++ code/modules/mob/living/silicon/pai/death.dm | 1 + .../mob/living/silicon/pai/hologram_effect.dm | 22 ++++++++++ code/modules/mob/living/silicon/pai/pai.dm | 41 +++++++++++++++++- code/modules/mob/living/silicon/pai/verbs.dm | 14 ++++++ icons/screen/actions/pai.dmi | Bin 2556 -> 3244 bytes 9 files changed, 97 insertions(+), 9 deletions(-) create mode 100644 code/modules/mob/living/silicon/pai/hologram_effect.dm diff --git a/citadel.dme b/citadel.dme index 309ebc096b1..5c263975e1b 100644 --- a/citadel.dme +++ b/citadel.dme @@ -3603,6 +3603,7 @@ #include "code\modules\mob\living\silicon\pai\death.dm" #include "code\modules\mob\living\silicon\pai\defense.dm" #include "code\modules\mob\living\silicon\pai\examine.dm" +#include "code\modules\mob\living\silicon\pai\hologram_effect.dm" #include "code\modules\mob\living\silicon\pai\life.dm" #include "code\modules\mob\living\silicon\pai\mobility.dm" #include "code\modules\mob\living\silicon\pai\pai.dm" diff --git a/code/game/click/other_mobs.dm b/code/game/click/other_mobs.dm index 0b0ae6ee346..8cbc452f270 100644 --- a/code/game/click/other_mobs.dm +++ b/code/game/click/other_mobs.dm @@ -139,13 +139,6 @@ setClickCooldown(get_attack_speed()) A.attack_generic(src,rand(5,6),"bitten") -/* - pAI -*/ - -/mob/living/silicon/pai/UnarmedAttack(atom/A)//Stops runtimes due to attack_animal being the default - return - /* New Players: Have no reason to click on anything at all. diff --git a/code/game/objects/items/devices/paicard.dm b/code/game/objects/items/devices/paicard.dm index 310b2988846..b67926c6097 100644 --- a/code/game/objects/items/devices/paicard.dm +++ b/code/game/objects/items/devices/paicard.dm @@ -295,6 +295,8 @@ GLOBAL_LIST_BOILERPLATE(all_pai_cards, /obj/item/paicard) pai.update_action_buttons() /obj/item/paicard/proc/removePersonality() + if(pai) + pai.delete_all_holograms() QDEL_NULL(pai) pai = null cached_holo_image = null diff --git a/code/modules/mob/living/silicon/pai/actions.dm b/code/modules/mob/living/silicon/pai/actions.dm index dee8c3e1fdb..e4c68bd00c8 100644 --- a/code/modules/mob/living/silicon/pai/actions.dm +++ b/code/modules/mob/living/silicon/pai/actions.dm @@ -87,3 +87,21 @@ var/mob/living/silicon/pai/user = owner button_visibility = (user.loc == user.card) + +/// Hologram Placement +/datum/action/pai/place_hologram + name = "Place Hologram" + desc = "Place a hologram of a scanned object on the floor." + button_icon_state = "pai_place_hologram" + +/datum/action/pai/place_hologram/on_trigger(mob/living/silicon/pai/user) + user.prompt_hologram_placement() + +/// Delete All Holograms +/datum/action/pai/delete_holograms + name = "Delete All Holograms" + desc = "Delete all placed holograms." + button_icon_state = "pai_delete_holograms" + +/datum/action/pai/delete_holograms/on_trigger(mob/living/silicon/pai/user) + user.delete_all_holograms() diff --git a/code/modules/mob/living/silicon/pai/death.dm b/code/modules/mob/living/silicon/pai/death.dm index 86fdf29ad54..df6796a3917 100644 --- a/code/modules/mob/living/silicon/pai/death.dm +++ b/code/modules/mob/living/silicon/pai/death.dm @@ -1,4 +1,5 @@ /mob/living/silicon/pai/death(gibbed) + delete_all_holograms() if(card) card.removePersonality() src.loc = get_turf(card) diff --git a/code/modules/mob/living/silicon/pai/hologram_effect.dm b/code/modules/mob/living/silicon/pai/hologram_effect.dm new file mode 100644 index 00000000000..8c84bf80b10 --- /dev/null +++ b/code/modules/mob/living/silicon/pai/hologram_effect.dm @@ -0,0 +1,22 @@ +/obj/effect/pai_hologram + name = "blank hologram" + desc = "You shouldn't be seeing this!" + + hit_sound_brute = 'sound/weapons/egloves.ogg' + hit_sound_burn = 'sound/weapons/egloves.ogg' + + var/mob/living/silicon/pai/owner + +/obj/effect/pai_hologram/attackby(obj/item/W, mob/user) + hologram_destroy(user) + +/obj/effect/pai_hologram/attack_hand(mob/user, list/params) + hologram_destroy(user) + +/obj/effect/pai_hologram/proc/hologram_destroy(mob/user) + user.visible_message(SPAN_WARNING("[user] dissipates the holographic [src.name]")) + QDEL_NULL(src) + +/obj/effect/pai_hologram/Destroy() + owner.handle_hologram_destroy(src) + . = ..() diff --git a/code/modules/mob/living/silicon/pai/pai.dm b/code/modules/mob/living/silicon/pai/pai.dm index 1ec81b7a729..6c0d29201ba 100644 --- a/code/modules/mob/living/silicon/pai/pai.dm +++ b/code/modules/mob/living/silicon/pai/pai.dm @@ -1,3 +1,5 @@ +#define MAX_HOLOGRAMS 5 + /datum/category_item/catalogue/fauna/silicon/pai name = "Silicons - pAI" desc = "There remains some dispute over whether the 'p' stands \ @@ -123,7 +125,11 @@ /datum/action/pai/change_chassis, /datum/action/pai/clothing_transform, /datum/action/pai/revert_to_card, - /datum/action/pai/hologram_display) + /datum/action/pai/hologram_display, + /datum/action/pai/place_hologram, + /datum/action/pai/delete_holograms) + + var/list/active_holograms = list() /mob/living/silicon/pai/Initialize(mapload) . = ..() @@ -325,7 +331,7 @@ return /obj/item/clothing/suit /mob/living/silicon/pai/AltClickOn(var/atom/A) - if((isobj(A) || ismob(A)) && in_range_of(src, A) && !istype(A, /obj/item/paicard)) + if((isobj(A) || ismob(A)) && in_range_of(src, A) && !istype(A, /obj/item/paicard) && !istype(A, /obj/effect/pai_hologram)) if(world.time > last_scanned_time + 600) last_scanned_time = world.time scan_object(A) @@ -464,3 +470,34 @@ if(A.update_on_chassis_change) A.update_button() update_action_buttons() + +/mob/living/silicon/pai/proc/handle_hologram_destroy(var/obj/effect/pai_hologram/hologram) + active_holograms -= hologram + +/mob/living/silicon/pai/proc/place_hologram(var/scanned_object_name) + var/image/I = scanned_objects[scanned_object_name] + var/obj/effect/pai_hologram/hologram = new(get_turf(src)) + hologram.icon = I + hologram.name = scanned_object_name + hologram.desc = "It's a holographic [scanned_object_name]." + hologram.owner = src + active_holograms += hologram + +/mob/living/silicon/pai/proc/delete_all_holograms() + for(var/obj/effect/pai_hologram/hologram in active_holograms) + QDEL_NULL(hologram) + +/mob/living/silicon/pai/proc/prompt_hologram_placement() + if(length(active_holograms) >= MAX_HOLOGRAMS) + to_chat(src, SPAN_NOTICE("You cannot have more than [MAX_HOLOGRAMS] holograms active!")) + return + + var/scanned_item_to_show = tgui_input_list(usr, "Select Scanned Object", "Scanned Objects", scanned_objects) + if(scanned_item_to_show) + place_hologram(scanned_item_to_show) + +/mob/living/silicon/pai/UnarmedAttack(var/atom/A, var/proximity_flag) + if(istype(A, /obj/effect/pai_hologram)) + A.attack_hand(src) + +#undef MAX_HOLOGRAMS diff --git a/code/modules/mob/living/silicon/pai/verbs.dm b/code/modules/mob/living/silicon/pai/verbs.dm index f8b04001571..94fe7d62856 100644 --- a/code/modules/mob/living/silicon/pai/verbs.dm +++ b/code/modules/mob/living/silicon/pai/verbs.dm @@ -105,3 +105,17 @@ set desc = "Allows you to pick a scanned object to display from your holoprojector." card_hologram_display() + +/mob/living/silicon/pai/verb/hologram_place() + set name = "Place Hologram" + set category = "pAI Commands" + set desc = "Allows you to deploy a holographic version of something you have scanned." + + prompt_hologram_placement() + +/mob/living/silicon/pai/verb/delete_holograms() + set name = "Delete All Holograms" + set category = "pAI Commands" + set desc = "Allows you to delete all holograms you have placed." + + delete_all_holograms() diff --git a/icons/screen/actions/pai.dmi b/icons/screen/actions/pai.dmi index dc0dcd3251700b4b9c8f1487019105e5fa0d6294..c3eb658f886b7dab79c977e22450d74173c7bedd 100644 GIT binary patch literal 3244 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