From 80c2bb78e47f634d4dff2dd25022ec1aedd0c15a Mon Sep 17 00:00:00 2001 From: kyunkyunkyun <120701975+kyunkyunkyun@users.noreply.github.com> Date: Tue, 19 Aug 2025 05:39:23 +0500 Subject: [PATCH] chameleon kit for ghost bar (#30025) --- .../items/devices/radio/radio_objects.dm | 10 +- .../living/carbon/human/species/plasmaman.dm | 2 - code/modules/ruins/ghost_bar.dm | 107 ++++++++++-------- 3 files changed, 67 insertions(+), 52 deletions(-) diff --git a/code/game/objects/items/devices/radio/radio_objects.dm b/code/game/objects/items/devices/radio/radio_objects.dm index 08b000980b6..4daf2bf4661 100644 --- a/code/game/objects/items/devices/radio/radio_objects.dm +++ b/code/game/objects/items/devices/radio/radio_objects.dm @@ -783,13 +783,19 @@ GLOBAL_LIST_EMPTY(deadsay_radio_systems) /obj/item/radio/headset/deadsay name = "spectral radio" ks2type = /obj/item/encryptionkey/centcom + var/datum/action/item_action/chameleon_change/chameleon_action -/obj/item/radio/headset/deadsay/New() - ..() +/obj/item/radio/headset/deadsay/Initialize(mapload) + . = ..() + chameleon_action = new(src) + chameleon_action.chameleon_type = /obj/item/radio/headset + chameleon_action.chameleon_name = "Headset" + chameleon_action.initialize_disguises() GLOB.deadsay_radio_systems.Add(src) make_syndie() /obj/item/radio/headset/deadsay/Destroy() + QDEL_NULL(chameleon_action) GLOB.deadsay_radio_systems.Remove(src) return ..() diff --git a/code/modules/mob/living/carbon/human/species/plasmaman.dm b/code/modules/mob/living/carbon/human/species/plasmaman.dm index 7e4d2bd31f0..58799f9a621 100644 --- a/code/modules/mob/living/carbon/human/species/plasmaman.dm +++ b/code/modules/mob/living/carbon/human/species/plasmaman.dm @@ -160,9 +160,7 @@ O = new /datum/outfit/plasmaman/soo H.equipOutfit(O, visualsOnly) - H.internal = H.r_hand H.update_action_buttons_icon() - return FALSE /datum/species/plasmaman/handle_life(mob/living/carbon/human/H) var/atmos_sealed = !HAS_TRAIT(H, TRAIT_NOFIRE) && (isclothing(H.wear_suit) && H.wear_suit.flags & STOPSPRESSUREDMAGE) && (isclothing(H.head) && H.head.flags & STOPSPRESSUREDMAGE) diff --git a/code/modules/ruins/ghost_bar.dm b/code/modules/ruins/ghost_bar.dm index ea464780285..28f299a117f 100644 --- a/code/modules/ruins/ghost_bar.dm +++ b/code/modules/ruins/ghost_bar.dm @@ -14,6 +14,7 @@ GLOBAL_LIST_EMPTY(occupants_by_key) restrict_antagban = FALSE restrict_respawnability = FALSE restrict_ahud = FALSE + outfit = /datum/outfit/ghost_bar /obj/effect/mob_spawn/human/alive/ghost_bar/create(ckey, flavour = TRUE, name, mob/user = usr) // So divorced from the normal proc it's just being overriden var/datum/character_save/save_to_load @@ -37,16 +38,15 @@ GLOBAL_LIST_EMPTY(occupants_by_key) return save_to_load = new save_to_load.randomise() - var/mob/living/carbon/human/H = new(get_turf(src)) + var/mob/living/carbon/human/human = new(get_turf(src)) + human.speaks_ooc = TRUE - save_to_load.copy_to(H) - if(!H.back) - equip_item(H, /obj/item/storage/backpack, ITEM_SLOT_BACK) - equip_item(H, /obj/item/radio/headset/deadsay, ITEM_SLOT_LEFT_EAR) - H.dna.species.before_equip_job(/datum/job/assistant, H) - H.dna.species.remains_type = /obj/effect/decal/cleanable/ash - var/obj/item/bio_chip/dust/I = new - I.implant(H, null) + save_to_load.copy_to(human) + human.dna.species.before_equip_job(/datum/job/assistant, human) + human.job = assignedrole + if(outfit) + human.equipOutfit(outfit) + human.dna.species.remains_type = /obj/effect/decal/cleanable/ash for(var/gear in save_to_load.loadout_gear) var/datum/gear/G = GLOB.gear_datums[text2path(gear) || gear] if(isnull(G)) @@ -54,56 +54,35 @@ GLOBAL_LIST_EMPTY(occupants_by_key) if(G.allowed_roles) // Fix due to shitty HUD code continue if(G.slot) - if(H.equip_to_slot_or_del(G.spawn_item(H, save_to_load.get_gear_metadata(G)), G.slot, TRUE)) - to_chat(H, "Equipping you with [G.display_name]!") + if(human.equip_to_slot_or_del(G.spawn_item(human, save_to_load.get_gear_metadata(G)), G.slot, TRUE)) + to_chat(human, "Equipping you with [G.display_name]!") else - H.equip_or_collect(G.spawn_item(null, save_to_load.get_gear_metadata(G))) - if(!H.w_uniform) - equip_item(H, /obj/item/clothing/under/color/random, ITEM_SLOT_JUMPSUIT) - if(!H.shoes) - equip_item(H, /obj/item/clothing/shoes/black, ITEM_SLOT_SHOES) - equip_item(H, /obj/item/stack/spacecash/c1000, ITEM_SLOT_LEFT_POCKET) + human.equip_or_collect(G.spawn_item(null, save_to_load.get_gear_metadata(G))) - var/obj/item/card/id/syndicate/our_id = equip_item(H, /obj/item/card/id/syndicate/ghost_bar, ITEM_SLOT_ID) - our_id.assignment = assignedrole - our_id.registered_name = H.real_name - our_id.sex = capitalize(H.gender) - our_id.age = H.age - our_id.name = "[our_id.registered_name]'s ID Card ([our_id.assignment])" - our_id.photo = get_id_photo(H) - our_id.owner_uid = H.UID() - our_id.owner_ckey = H.ckey - H.job = assignedrole - - H.dna.ready_dna(H) - H.mind_initialize() - H.mind.assigned_role = assignedrole - H.mind.special_role = assignedrole - H.mind.offstation_role = TRUE - ADD_TRAIT(H, TRAIT_PACIFISM, GHOST_ROLE) + human.dna.ready_dna(human) + human.mind_initialize() + human.mind.assigned_role = assignedrole + human.mind.special_role = assignedrole + human.mind.offstation_role = TRUE + ADD_TRAIT(human, TRAIT_PACIFISM, GHOST_ROLE) if(isobserver(user)) var/mob/dead/observer/ghost = user if(ghost.can_reenter_corpse) - ADD_TRAIT(H, TRAIT_RESPAWNABLE, GHOST_ROLE) + ADD_TRAIT(human, TRAIT_RESPAWNABLE, GHOST_ROLE) - H.key = ckey - H.dna.species.after_equip_job(/datum/job/assistant, H) - if(isgrey(H)) + human.key = ckey + human.dna.species.after_equip_job(/datum/job/assistant, human) + if(isgrey(human)) var/obj/item/organ/internal/cyberimp/brain/speech_translator/implant = new - implant.insert(H) + implant.insert(human) log_game("[ckey] has entered the ghost bar") playsound(src, 'sound/machines/wooden_closet_open.ogg', 50) - var/mob/old_mob = GLOB.occupants_by_key["[H.ckey]"] + var/mob/old_mob = GLOB.occupants_by_key["[human.ckey]"] if(old_mob) qdel(old_mob) - GLOB.occupants_by_key["[H.ckey]"] = H - RegisterSignal(H, COMSIG_PARENT_QDELETING, PROC_REF(clear_references_to_owner)) - -/obj/effect/mob_spawn/human/alive/ghost_bar/proc/equip_item(mob/living/carbon/human/H, path, slot) - var/obj/item/I = new path(H) - H.equip_or_collect(I, slot, TRUE) - H.speaks_ooc = TRUE - return I + GLOB.occupants_by_key["[human.ckey]"] = human + RegisterSignal(human, COMSIG_PARENT_QDELETING, PROC_REF(clear_references_to_owner)) + return human /obj/effect/mob_spawn/human/alive/ghost_bar/proc/clear_references_to_owner(mob/mob_to_obliterate) SIGNAL_HANDLER // COMSIG_PARENT_QDELETING @@ -132,3 +111,35 @@ GLOBAL_LIST_EMPTY(occupants_by_key) return if(HAS_TRAIT_FROM(M, TRAIT_RESPAWNABLE, GHOST_ROLE)) M.dust() + +// MARK: Ghost Bar outfit +/datum/outfit/ghost_bar + name = "Ghost Bar Occupant" + uniform = /obj/item/clothing/under/color/random + shoes = /obj/item/clothing/shoes/black + back = /obj/item/storage/backpack + l_ear = /obj/item/radio/headset/deadsay + l_pocket = /obj/item/stack/spacecash/c1000 + id = /obj/item/card/id/syndicate/ghost_bar + bio_chips = list(/obj/item/bio_chip/dust) + backpack_contents = list(/obj/item/storage/box/syndie_kit/chameleon/ghost_bar) + +/datum/outfit/ghost_bar/post_equip(mob/living/carbon/human/human, visualsOnly) + . = ..() + var/obj/item/card/id/card = human.wear_id + card.assignment = human.job + card.registered_name = human.real_name + card.sex = capitalize(human.gender) + card.age = human.age + card.name = "[card.registered_name]'s ID Card ([card.assignment])" + card.photo = get_id_photo(human) + card.owner_uid = human.UID() + card.owner_ckey = human.ckey + +// MARK: Ghost Bar chameleon kit +/obj/item/storage/box/syndie_kit/chameleon/ghost_bar/populate_contents() + . = ..() + for(var/obj/item/pda/pda in contents) + qdel(pda) + for(var/obj/item/radio/headset/headset in contents) + qdel(headset)