diff --git a/code/__DEFINES/dcs/signals/signals_atom/signals_atom_movable.dm b/code/__DEFINES/dcs/signals/signals_atom/signals_atom_movable.dm index d75d8bacec7..0e6578d6e9a 100644 --- a/code/__DEFINES/dcs/signals/signals_atom/signals_atom_movable.dm +++ b/code/__DEFINES/dcs/signals/signals_atom/signals_atom_movable.dm @@ -119,6 +119,9 @@ /// From base of area/Exited(): (area/left, direction) #define COMSIG_MOVABLE_EXITED_AREA "movable_exited_area" +///from base of /atom/movable/point_at: (atom/A, obj/effect/temp_visual/point/point) +#define COMSIG_MOVABLE_POINTED "movable_pointed" + /// Sent to movables when they are being stolen by a spy: (mob/living/spy, datum/spy_bounty/bounty) #define COMSIG_MOVABLE_SPY_STEALING "movable_spy_stealing" /// Called when something is pushed by a living mob bumping it: (mob/living/pusher, push force) diff --git a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_main.dm b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_main.dm index 4f625ee7b74..5d33cd284df 100644 --- a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_main.dm +++ b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_main.dm @@ -151,8 +151,6 @@ /// from base of mob/swap_hand(): () /// Performed after the hands are swapped. #define COMSIG_MOB_SWAP_HANDS "mob_swap_hands" -///from base of /mob/verb/pointed: (atom/A) -#define COMSIG_MOB_POINTED "mob_pointed" ///Mob is trying to open the wires of a target [/atom], from /datum/wires/interactable(): (atom/target) #define COMSIG_TRY_WIRES_INTERACT "try_wires_interact" #define COMPONENT_CANT_INTERACT_WIRES (1<<0) diff --git a/code/controllers/subsystem/id_access.dm b/code/controllers/subsystem/id_access.dm index 86f2e124a8f..7142f898b4f 100644 --- a/code/controllers/subsystem/id_access.dm +++ b/code/controllers/subsystem/id_access.dm @@ -399,6 +399,8 @@ SUBSYSTEM_DEF(id_access) id_card.clear_access() id_card.trim = trim + id_card.big_pointer = trim.big_pointer + id_card.pointer_color = trim.pointer_color if(copy_access) id_card.access = trim.access.Copy() @@ -442,6 +444,8 @@ SUBSYSTEM_DEF(id_access) id_card.department_color_override = trim.department_color id_card.department_state_override = trim.department_state id_card.subdepartment_color_override = trim.subdepartment_color + id_card.big_pointer = trim.big_pointer + id_card.pointer_color = trim.pointer_color if(!check_forged || !id_card.forged) id_card.assignment = trim.assignment @@ -462,6 +466,8 @@ SUBSYSTEM_DEF(id_access) id_card.department_color_override = null id_card.department_state_override = null id_card.subdepartment_color_override = null + id_card.big_pointer = id_card.trim.big_pointer + id_card.pointer_color = id_card.trim.pointer_color /** * Adds the accesses associated with a trim to an ID card. diff --git a/code/datums/ai/oldhostile/hostile_tameable.dm b/code/datums/ai/oldhostile/hostile_tameable.dm index 1c30cb95487..0d68fe0abbe 100644 --- a/code/datums/ai/oldhostile/hostile_tameable.dm +++ b/code/datums/ai/oldhostile/hostile_tameable.dm @@ -77,14 +77,14 @@ if(pawn.Adjacent(pawn, new_friend)) new_friend.visible_message("[pawn] looks at [new_friend] in a friendly manner!", span_notice("[pawn] looks at you in a friendly manner!")) set_blackboard_key(BB_HOSTILE_FRIEND, new_friend) - RegisterSignal(new_friend, COMSIG_MOB_POINTED, PROC_REF(check_point)) + RegisterSignal(new_friend, COMSIG_MOVABLE_POINTED, PROC_REF(check_point)) RegisterSignal(new_friend, COMSIG_MOB_SAY, PROC_REF(check_verbal_command)) /// Someone is being mean to us, take them off our friends (add actual enemies behavior later) /datum/ai_controller/hostile_friend/proc/unfriend() var/mob/living/old_friend = blackboard[BB_HOSTILE_FRIEND] if(old_friend) - UnregisterSignal(old_friend, list(COMSIG_MOB_POINTED, COMSIG_MOB_SAY)) + UnregisterSignal(old_friend, list(COMSIG_MOVABLE_POINTED, COMSIG_MOB_SAY)) clear_blackboard_key(BB_HOSTILE_FRIEND) /// Someone is looking at us, if we're currently carrying something then show what it is, and include a message if they're our friend @@ -190,7 +190,7 @@ set_blackboard_key(BB_HOSTILE_ORDER_MODE, HOSTILE_COMMAND_ATTACK) /// Someone we like is pointing at something, see if it's something we might want to interact with (like if they might want us to fetch something for them) -/datum/ai_controller/hostile_friend/proc/check_point(mob/pointing_friend, atom/movable/pointed_movable) +/datum/ai_controller/hostile_friend/proc/check_point(mob/pointing_friend, atom/movable/pointed_movable, obj/effect/temp_visual/point/point) SIGNAL_HANDLER var/mob/living/simple_animal/hostile/living_pawn = pawn diff --git a/code/datums/components/pet_commands/pet_command.dm b/code/datums/components/pet_commands/pet_command.dm index a8db88d3a44..52b4cc88349 100644 --- a/code/datums/components/pet_commands/pet_command.dm +++ b/code/datums/components/pet_commands/pet_command.dm @@ -186,14 +186,14 @@ /datum/pet_command/point_targeting/add_new_friend(mob/living/tamer) . = ..() - RegisterSignal(tamer, COMSIG_MOB_POINTED, PROC_REF(on_point)) + RegisterSignal(tamer, COMSIG_MOVABLE_POINTED, PROC_REF(on_point)) /datum/pet_command/point_targeting/remove_friend(mob/living/unfriended) . = ..() - UnregisterSignal(unfriended, COMSIG_MOB_POINTED) + UnregisterSignal(unfriended, COMSIG_MOVABLE_POINTED) /// Target the pointed atom for actions -/datum/pet_command/point_targeting/proc/on_point(mob/living/friend, atom/pointed_atom) +/datum/pet_command/point_targeting/proc/on_point(mob/living/friend, atom/pointed_atom, obj/effect/temp_visual/point/point) SIGNAL_HANDLER var/mob/living/parent = weak_parent.resolve() diff --git a/code/datums/components/riding/riding_mob.dm b/code/datums/components/riding/riding_mob.dm index 8f3be39e918..02da884284a 100644 --- a/code/datums/components/riding/riding_mob.dm +++ b/code/datums/components/riding/riding_mob.dm @@ -542,9 +542,9 @@ /datum/component/riding/creature/leaper/Initialize(mob/living/riding_mob, force = FALSE, ride_check_flags = NONE, potion_boost = FALSE) . = ..() - RegisterSignal(riding_mob, COMSIG_MOB_POINTED, PROC_REF(attack_pointed)) + RegisterSignal(riding_mob, COMSIG_MOVABLE_POINTED, PROC_REF(attack_pointed)) -/datum/component/riding/creature/leaper/proc/attack_pointed(mob/living/rider, atom/pointed) +/datum/component/riding/creature/leaper/proc/attack_pointed(mob/living/rider, atom/pointed, obj/effect/temp_visual/point/point) SIGNAL_HANDLER if(!isclosedturf(pointed)) return @@ -556,7 +556,7 @@ /datum/component/riding/leaper/handle_unbuckle(mob/living/rider) . = ..() - UnregisterSignal(rider, COMSIG_MOB_POINTED) + UnregisterSignal(rider, COMSIG_MOVABLE_POINTED) /datum/component/riding/creature/raptor require_minigame = TRUE diff --git a/code/datums/id_trim/_id_trim.dm b/code/datums/id_trim/_id_trim.dm index 067e2e38263..562232214b3 100644 --- a/code/datums/id_trim/_id_trim.dm +++ b/code/datums/id_trim/_id_trim.dm @@ -24,6 +24,11 @@ /// Accesses that this trim unlocks on a card that require wildcard slots to apply. If a card cannot accept all a trim's wildcard accesses, the card is incompatible with the trim. var/list/wildcard_access = list() + ///If true, IDs with this trim will grant wearers with bigger arrows when pointing + var/big_pointer = FALSE + ///If set, IDs with this trim will give wearers arrows of different colors when pointing + var/pointer_color + /// Returns the SecHUD job icon state for whatever this object's ID card is, if it has one. /obj/item/proc/get_sechud_job_icon_state() var/obj/item/card/id/id_card = GetID() diff --git a/code/datums/id_trim/admin.dm b/code/datums/id_trim/admin.dm index 9de155c9a04..ee0cf1b977e 100644 --- a/code/datums/id_trim/admin.dm +++ b/code/datums/id_trim/admin.dm @@ -5,6 +5,8 @@ department_color = COLOR_CENTCOM_BLUE subdepartment_color = COLOR_SERVICE_LIME threat_modifier = -INFINITY + big_pointer = TRUE + pointer_color = COLOR_GREEN /datum/id_trim/admin/New() . = ..() diff --git a/code/datums/id_trim/centcom.dm b/code/datums/id_trim/centcom.dm index 5cc24f4bd6e..498a4de254e 100644 --- a/code/datums/id_trim/centcom.dm +++ b/code/datums/id_trim/centcom.dm @@ -7,6 +7,8 @@ department_color = COLOR_CENTCOM_BLUE subdepartment_color = COLOR_CENTCOM_BLUE threat_modifier = -10 // Centcom are legally allowed to do whatever they want + big_pointer = TRUE + pointer_color = COLOR_CENTCOM_BLUE /// Trim for Centcom VIPs /datum/id_trim/centcom/vip @@ -20,6 +22,7 @@ trim_state = "trim_janitor" department_color = COLOR_CENTCOM_BLUE subdepartment_color = COLOR_SERVICE_LIME + big_pointer = FALSE /// Trim for Centcom Thunderdome Overseers. /datum/id_trim/centcom/thunderdome_overseer @@ -35,10 +38,12 @@ /datum/id_trim/centcom/intern access = list(ACCESS_CENT_GENERAL, ACCESS_CENT_LIVING, ACCESS_WEAPONS) assignment = "CentCom Intern" + big_pointer = FALSE /// Trim for Centcom Head Interns. Different assignment, common station access added on. /datum/id_trim/centcom/intern/head assignment = "CentCom Head Intern" + big_pointer = TRUE /datum/id_trim/centcom/intern/head/New() . = ..() @@ -49,11 +54,13 @@ /datum/id_trim/centcom/bounty_hunter access = list(ACCESS_CENT_GENERAL) assignment = "Bounty Hunter" + big_pointer = FALSE /// Trim for Centcom Bartenders. /datum/id_trim/centcom/bartender access = list(ACCESS_CENT_GENERAL, ACCESS_CENT_LIVING, ACCESS_CENT_BAR) assignment = JOB_CENTCOM_BARTENDER + big_pointer = FALSE /// Trim for Centcom Medical Officers. /datum/id_trim/centcom/medical_officer @@ -68,6 +75,7 @@ /// Trim for Centcom Specops Officers. All Centcom and Station Access. /datum/id_trim/centcom/specops_officer assignment = JOB_CENTCOM_SPECIAL_OFFICER + big_pointer = FALSE /datum/id_trim/centcom/specops_officer/New() . = ..() @@ -129,6 +137,7 @@ trim_state = "trim_securityofficer" subdepartment_color = COLOR_SECURITY_RED sechud_icon_state = SECHUD_SECURITY_RESPONSE_OFFICER + big_pointer = FALSE /datum/id_trim/centcom/ert/security/New() . = ..() @@ -141,6 +150,7 @@ trim_state = "trim_stationengineer" subdepartment_color = COLOR_ENGINEERING_ORANGE sechud_icon_state = SECHUD_ENGINEERING_RESPONSE_OFFICER + big_pointer = FALSE /datum/id_trim/centcom/ert/engineer/New() . = ..() @@ -153,6 +163,7 @@ trim_state = "trim_medicaldoctor" subdepartment_color = COLOR_MEDICAL_BLUE sechud_icon_state = SECHUD_MEDICAL_RESPONSE_OFFICER + big_pointer = FALSE /datum/id_trim/centcom/ert/medical/New() . = ..() @@ -165,6 +176,7 @@ trim_state = "trim_chaplain" subdepartment_color = COLOR_SERVICE_LIME sechud_icon_state = SECHUD_RELIGIOUS_RESPONSE_OFFICER + big_pointer = FALSE /datum/id_trim/centcom/ert/chaplain/New() . = ..() @@ -177,6 +189,7 @@ trim_state = "trim_ert_janitor" subdepartment_color = COLOR_SERVICE_LIME sechud_icon_state = SECHUD_JANITORIAL_RESPONSE_OFFICER + big_pointer = FALSE /datum/id_trim/centcom/ert/janitor/New() . = ..() @@ -189,6 +202,7 @@ trim_state = "trim_clown" subdepartment_color = COLOR_MAGENTA sechud_icon_state = SECHUD_ENTERTAINMENT_RESPONSE_OFFICER + big_pointer = FALSE /datum/id_trim/centcom/ert/clown/New() . = ..() @@ -197,6 +211,8 @@ /datum/id_trim/centcom/ert/militia assignment = "Frontier Militia" + big_pointer = FALSE /datum/id_trim/centcom/ert/militia/general assignment = "Frontier Militia General" + big_pointer = TRUE diff --git a/code/datums/id_trim/jobs.dm b/code/datums/id_trim/jobs.dm index b5893380fde..a42018406b2 100644 --- a/code/datums/id_trim/jobs.dm +++ b/code/datums/id_trim/jobs.dm @@ -238,6 +238,8 @@ ACCESS_CHANGE_IDS, ) job = /datum/job/captain + big_pointer = TRUE + pointer_color = COLOR_COMMAND_BLUE /// Captain gets all station accesses hardcoded in because it's the Captain. /datum/id_trim/job/captain/New() @@ -360,6 +362,8 @@ ACCESS_CHANGE_IDS, ) job = /datum/job/chief_engineer + big_pointer = TRUE + pointer_color = COLOR_ENGINEERING_ORANGE /datum/id_trim/job/chief_medical_officer assignment = JOB_CHIEF_MEDICAL_OFFICER @@ -399,6 +403,8 @@ ACCESS_CHANGE_IDS, ) job = /datum/job/chief_medical_officer + big_pointer = TRUE + pointer_color = COLOR_MEDICAL_BLUE /datum/id_trim/job/clown assignment = JOB_CLOWN @@ -612,6 +618,8 @@ ACCESS_CHANGE_IDS, ) job = /datum/job/head_of_personnel + big_pointer = TRUE + pointer_color = COLOR_SERVICE_LIME /datum/id_trim/job/head_of_security assignment = JOB_HEAD_OF_SECURITY @@ -661,6 +669,8 @@ ACCESS_CHANGE_IDS, ) job = /datum/job/head_of_security + big_pointer = TRUE + pointer_color = COLOR_SECURITY_RED /datum/id_trim/job/head_of_security/refresh_trim_access() . = ..() @@ -893,6 +903,8 @@ ACCESS_CHANGE_IDS, ) job = /datum/job/quartermaster + big_pointer = TRUE + pointer_color = COLOR_CARGO_BROWN /datum/id_trim/job/research_director assignment = JOB_RESEARCH_DIRECTOR @@ -941,6 +953,8 @@ ACCESS_CHANGE_IDS, ) job = /datum/job/research_director + big_pointer = TRUE + pointer_color = COLOR_SCIENCE_PINK /datum/id_trim/job/roboticist assignment = JOB_ROBOTICIST @@ -1206,6 +1220,7 @@ extra_access = list() template_access = list() job = /datum/job/veteran_advisor + big_pointer = TRUE /datum/id_trim/job/veteran_advisor/refresh_trim_access() . = ..() @@ -1275,3 +1290,5 @@ extra_access = list() template_access = list() job = /datum/job/human_ai + big_pointer = TRUE + pointer_color = COLOR_MODERATE_BLUE diff --git a/code/datums/id_trim/ruins.dm b/code/datums/id_trim/ruins.dm index e308287ec5c..0b0591e5429 100644 --- a/code/datums/id_trim/ruins.dm +++ b/code/datums/id_trim/ruins.dm @@ -72,6 +72,7 @@ /datum/id_trim/centcom/corpse/commander assignment = "Commander" access = list(ACCESS_CENT_CAPTAIN, ACCESS_CENT_GENERAL, ACCESS_CENT_SPECOPS, ACCESS_CENT_MEDICAL, ACCESS_CENT_STORAGE) + big_pointer = TRUE /// Trim for various Centcom corpses. /datum/id_trim/centcom/corpse/private_security @@ -115,12 +116,14 @@ /datum/id_trim/pirate/captain assignment = "Pirate Captain" trim_state = "trim_captain" + big_pointer = TRUE /datum/id_trim/pirate/silverscale assignment = "Silver Scale Member" /datum/id_trim/pirate/captain/silverscale assignment = "Silver Scale VIP" + big_pointer = TRUE //Trims for Dangerous Research, used in ``dangerous_research.dm`` /datum/id_trim/away/dangerous_research @@ -130,6 +133,7 @@ /datum/id_trim/away/dangerous_research/head_occultist assignment = "Head Occultist" access = list(ACCESS_AWAY_SCIENCE, ACCESS_AWAY_COMMAND) + big_pointer = TRUE //Trims for waystation.dmm space ruin /datum/id_trim/away/waystation/cargo_technician @@ -143,6 +147,7 @@ trim_state = "trim_quartermaster" department_color = COLOR_CARGO_BROWN access = list(ACCESS_AWAY_SUPPLY, ACCESS_AWAY_COMMAND) + big_pointer = TRUE /datum/id_trim/away/waystation/security assignment = "Waystation Security Officer" @@ -162,8 +167,9 @@ /datum/id_trim/away/the_outlet/mad_manager assignment = "The Mad Manager" access = list(ACCESS_AWAY_GENERAL, ACCESS_AWAY_MEDICAL, ACCESS_AWAY_SEC) + big_pointer = TRUE -//Haunted Trading Post IDs // +//Haunted Trading Post IDs /datum/id_trim/away/hauntedtradingpost assignment = "Donk Co. Employee" department_color = COLOR_ENGINEERING_ORANGE @@ -174,4 +180,4 @@ /datum/id_trim/away/hauntedtradingpost/boss assignment = "Donk Co. Executive" access = list(ACCESS_SYNDICATE, ACCESS_AWAY_COMMAND) -// // + big_pointer = TRUE diff --git a/code/datums/id_trim/syndicate.dm b/code/datums/id_trim/syndicate.dm index 9a3e0c5fc91..41c76aaf378 100644 --- a/code/datums/id_trim/syndicate.dm +++ b/code/datums/id_trim/syndicate.dm @@ -7,11 +7,14 @@ sechud_icon_state = SECHUD_SYNDICATE access = list(ACCESS_SYNDICATE) threat_modifier = 5 // Bad guy on deck + big_pointer = TRUE + pointer_color = COLOR_SYNDIE_RED /// Trim for Syndicate mobs, outfits and corpses. /datum/id_trim/syndicom/crew assignment = "Syndicate Operative" access = list(ACCESS_SYNDICATE, ACCESS_ROBOTICS) + big_pointer = FALSE /// Interdyne medical Staff /datum/id_trim/syndicom/Interdyne/pharmacist @@ -19,6 +22,8 @@ trim_state = "trim_medicaldoctor" sechud_icon_state = SECHUD_SYNDICATE_INTERDYNE access = list(ACCESS_SYNDICATE, ACCESS_ROBOTICS, ACCESS_SURGERY) + big_pointer = FALSE + pointer_color = null /// Interdyne head medical Staff /datum/id_trim/syndicom/Interdyne/pharmacist_director @@ -28,6 +33,8 @@ subdepartment_color = COLOR_SYNDIE_RED_HEAD sechud_icon_state = SECHUD_SYNDICATE_INTERDYNE_HEAD access = list(ACCESS_SYNDICATE, ACCESS_ROBOTICS, ACCESS_SURGERY) + big_pointer = TRUE + pointer_color = COLOR_SYNDIE_RED_HEAD /// Trim for the space IRS agents (why are they syndie access? I wouldn't worry about it.) /datum/id_trim/syndicom/irs @@ -37,11 +44,14 @@ subdepartment_color = COLOR_COMMAND_BLUE sechud_icon_state = SECHUD_DEATH_COMMANDO access = list(ACCESS_SYNDICATE, ACCESS_MAINT_TUNNELS) + big_pointer = FALSE + pointer_color = null /datum/id_trim/syndicom/irs/auditor assignment = "Internal Revenue Service Head Auditor" trim_state = "trim_quartermaster" sechud_icon_state = SECHUD_QUARTERMASTER + big_pointer = TRUE /// Trim for Syndicate mobs, outfits and corpses. /datum/id_trim/syndicom/captain @@ -60,6 +70,8 @@ /datum/id_trim/battlecruiser/captain assignment = "Syndicate Battlecruiser Captain" access = list(ACCESS_SYNDICATE, ACCESS_SYNDICATE_LEADER) + big_pointer = TRUE + pointer_color = COLOR_SYNDIE_RED /// Trim for Chameleon ID cards. Many outfits, nuke ops and some corpses hold Chameleon ID cards. /datum/id_trim/chameleon @@ -79,6 +91,8 @@ /datum/id_trim/chameleon/operative/nuke_leader assignment = "Syndicate Operative Leader" access = list(ACCESS_MAINT_TUNNELS, ACCESS_SYNDICATE, ACCESS_SYNDICATE_LEADER) + big_pointer = TRUE + pointer_color = COLOR_SYNDIE_RED /// Trim for Chameleon ID cards. Many outfits, nuke ops and some corpses hold Chameleon ID cards. /datum/id_trim/chameleon/operative/clown @@ -89,3 +103,5 @@ /datum/id_trim/chameleon/operative/clown_leader assignment = "Syndicate Entertainment Operative Leader" access = list(ACCESS_MAINT_TUNNELS, ACCESS_SYNDICATE, ACCESS_SYNDICATE_LEADER) + big_pointer = TRUE + pointer_color = COLOR_SYNDIE_RED diff --git a/code/game/objects/items/cards_ids.dm b/code/game/objects/items/cards_ids.dm index 7524152c65b..efc91f68e09 100644 --- a/code/game/objects/items/cards_ids.dm +++ b/code/game/objects/items/cards_ids.dm @@ -104,6 +104,11 @@ /// Boolean value. If TRUE, the [Intern] tag gets prepended to this ID card when the label is updated. var/is_intern = FALSE + ///If true, the wearer will have bigger arrow when pointing at things. Passed down by trims. + var/big_pointer = FALSE + ///If set, the arrow will have a different color. + var/pointer_color + /datum/armor/card_id fire = 100 acid = 100 @@ -144,6 +149,29 @@ QDEL_NULL(my_store) return ..() +/obj/item/card/id/equipped(mob/user, slot) + . = ..() + if(slot == ITEM_SLOT_ID) + RegisterSignal(user, COMSIG_MOVABLE_POINTED, PROC_REF(on_pointed)) + +/obj/item/card/id/proc/on_pointed(mob/living/user, atom/pointed, obj/effect/temp_visual/point/point) + SIGNAL_HANDLER + if((!big_pointer && !pointer_color) || HAS_TRAIT(user, TRAIT_UNKNOWN)) + return + if(point.icon_state != /obj/effect/temp_visual/point::icon_state) //it differs from the original icon_state already. + return + if(big_pointer) + point.icon_state = "arrow_large" + if(pointer_color) + point.icon_state = "[point.icon_state]_white" + point.color = pointer_color + var/mutable_appearance/highlight = mutable_appearance(point.icon, "[point.icon_state]_highlights", appearance_flags = RESET_COLOR) + point.add_overlay(highlight) + +/obj/item/card/id/dropped(mob/user) + UnregisterSignal(user, COMSIG_MOVABLE_POINTED) + return ..() + /obj/item/card/id/get_id_examine_strings(mob/user) . = ..() . += list("[icon2html(get_cached_flat_icon(), user, extra_classes = "bigicon")]") diff --git a/code/game/objects/items/storage/uplink_kits.dm b/code/game/objects/items/storage/uplink_kits.dm index 60e6d4113b5..ef22e5d0155 100644 --- a/code/game/objects/items/storage/uplink_kits.dm +++ b/code/game/objects/items/storage/uplink_kits.dm @@ -584,6 +584,7 @@ new /obj/item/storage/backpack/satchel(src) new /obj/item/modular_computer/pda/heads(src) new /obj/item/clipboard(src) + new /obj/item/skillchip/big_pointer(src) /obj/item/storage/box/syndie_kit/chameleon/broken/PopulateContents() new /obj/item/clothing/under/chameleon/broken(src) diff --git a/code/modules/antagonists/pirate/pirate_outfits.dm b/code/modules/antagonists/pirate/pirate_outfits.dm index 72318fe4987..14ba07cad27 100644 --- a/code/modules/antagonists/pirate/pirate_outfits.dm +++ b/code/modules/antagonists/pirate/pirate_outfits.dm @@ -42,6 +42,7 @@ belt = /obj/item/gun/magic/midas_hand l_pocket = /obj/item/coin/gold/doubloon + /datum/outfit/pirate/space name = "Space Pirate (EVA)" @@ -55,6 +56,8 @@ head = /obj/item/clothing/head/helmet/space/pirate + id_trim = /datum/id_trim/pirate/captain + /datum/outfit/pirate/silverscale name = "Silver Scale Member" @@ -151,6 +154,8 @@ suit = /obj/item/clothing/suit/jacket/oversized head = /obj/item/clothing/head/costume/crown + id_trim = /datum/id_trim/pirate/captain + /datum/outfit/pirate/medieval name = "Medieval Warmonger" @@ -181,3 +186,5 @@ belt = /obj/item/gun/magic/hook l_pocket = /obj/item/tank/internals/emergency_oxygen r_pocket = /obj/item/flashlight/lantern + + skillchips = list(/obj/item/skillchip/big_pointer) //they don't have an id, so this is needed diff --git a/code/modules/clothing/outfits/ert.dm b/code/modules/clothing/outfits/ert.dm index 2aa61b00460..263f831cff2 100644 --- a/code/modules/clothing/outfits/ert.dm +++ b/code/modules/clothing/outfits/ert.dm @@ -104,6 +104,8 @@ l_pocket = /obj/item/healthanalyzer/advanced additional_radio = /obj/item/encryptionkey/heads/cmo + skillchips = list(/obj/item/skillchip/entrails_reader) + /datum/outfit/centcom/ert/medic/alert name = "ERT Medic - High Alert" @@ -133,6 +135,8 @@ l_pocket = /obj/item/rcd_ammo/large additional_radio = /obj/item/encryptionkey/heads/ce + skillchips = list(/obj/item/skillchip/job/engineer) + /datum/outfit/centcom/ert/engineer/alert name = "ERT Engineer - High Alert" @@ -502,6 +506,8 @@ head = /obj/item/clothing/head/helmet/marine/security additional_radio = /obj/item/encryptionkey/heads/hos + skillchips = null + /datum/outfit/centcom/ert/marine/medic name = "Marine Medic" @@ -520,6 +526,8 @@ glasses = /obj/item/clothing/glasses/hud/health/sunglasses additional_radio = /obj/item/encryptionkey/heads/cmo + skillchips = list(/obj/item/skillchip/entrails_reader) + /datum/outfit/centcom/ert/marine/engineer name = "Marine Engineer" @@ -533,6 +541,8 @@ glasses = /obj/item/clothing/glasses/hud/diagnostic/sunglasses additional_radio = /obj/item/encryptionkey/heads/ce + skillchips = list(/obj/item/skillchip/job/engineer) + /datum/outfit/centcom/militia name = "Militia Man" diff --git a/code/modules/jobs/job_types/research_director.dm b/code/modules/jobs/job_types/research_director.dm index 5d3c6203227..8bfbe362327 100644 --- a/code/modules/jobs/job_types/research_director.dm +++ b/code/modules/jobs/job_types/research_director.dm @@ -76,7 +76,10 @@ messenger = /obj/item/storage/backpack/messenger/science chameleon_extras = /obj/item/stamp/head/rd - skillchips = list(/obj/item/skillchip/research_director, /obj/item/skillchip/job/roboticist) + skillchips = list( + /obj/item/skillchip/research_director, + /obj/item/skillchip/job/roboticist, + ) /datum/outfit/job/rd/mod name = "Research Director (MODsuit)" diff --git a/code/modules/library/skill_learning/generic_skillchips/point.dm b/code/modules/library/skill_learning/generic_skillchips/point.dm new file mode 100644 index 00000000000..761a4822689 --- /dev/null +++ b/code/modules/library/skill_learning/generic_skillchips/point.dm @@ -0,0 +1,99 @@ +/** + * A skillchip that gives the user bigger arrows when pointing at things (like some id trims do). + * As a bonus, they can costumize the color of the arrow/pointer too. + */ +/obj/item/skillchip/big_pointer + name = "Kommand skillchip" + desc = "A biochip detailing various techniques employed by historical leaders to points at things like a true boss." + skill_name = "Enhanced pointing" + skill_description = "Learn to point at things in a more noticeable way." + skill_icon = FA_ICON_ARROW_DOWN + activate_message = span_notice("From \"The Definitive Compendium of Body Language for the Aspiring Leader\", page 164, paragraph 3...") + deactivate_message = span_notice("So, uh, yeah, how do I point at things again?") + + ///The action for changing the pointer color + var/datum/action/change_pointer_color/action + +/obj/item/skillchip/big_pointer/Destroy() + action = null + return ..() + +/obj/item/skillchip/big_pointer/on_activate(mob/living/carbon/user, silent=FALSE) + . = ..() + RegisterSignal(user, COMSIG_MOVABLE_POINTED, PROC_REF(fancier_pointer)) + if(!action) + action = new(src) + action.Grant(user) + +/obj/item/skillchip/big_pointer/on_deactivate(mob/living/carbon/user, silent=FALSE) + UnregisterSignal(user, COMSIG_MOVABLE_POINTED) + action?.arrow_color = null + action?.arrow_overlay = null + action?.Remove(user) + return ..() + +/obj/item/skillchip/big_pointer/proc/fancier_pointer(mob/living/user, atom/pointed, obj/effect/temp_visual/point/point) + SIGNAL_HANDLER + if(HAS_TRAIT(user, TRAIT_UNKNOWN)) + return + point.cut_overlays() + if(!action.arrow_color) + point.icon_state = "arrow_large" + return + point.icon_state = "arrow_large_white" + point.color = action.arrow_color + var/mutable_appearance/highlight = mutable_appearance(point.icon, "arrow_large_white_highlights", appearance_flags = RESET_COLOR) + point.add_overlay(highlight) + +/datum/action/change_pointer_color + name = "Change Pointer Color" + desc = "Set your custom pointer color, or reset it to the default." + button_icon = /obj/effect/temp_visual/point::icon + button_icon_state = "arrow_large_still" + check_flags = AB_CHECK_CONSCIOUS + ///the color of our arrow + var/arrow_color + ///the arrow overlay shown on the button + var/mutable_appearance/arrow_overlay + +/datum/action/change_pointer_color/Destroy() + . = ..() + arrow_overlay = null + +/datum/action/change_pointer_color/Trigger(trigger_flags) + . = ..() + if(!.) + return + var/mob/user = owner + if(!arrow_color) + pick_color(user) + return + var/choice = tgui_alert(owner, "Reset or update pointer color?","Pointer Color", list("Reset","Update")) + if(user != owner || !choice || !IsAvailable(feedback = TRUE)) + return + if(choice == "Update") + pick_color(user) + else + arrow_color = null + owner.balloon_alert(owner, "pointer reset") + build_all_button_icons(update_flags = UPDATE_BUTTON_ICON, force = TRUE) + +/datum/action/change_pointer_color/proc/pick_color(mob/user) + var/ncolor = input(owner, "Pick new color", "Pointer Color", arrow_color) as color|null + if(user != owner || !IsAvailable(feedback = TRUE)) + return + arrow_color = ncolor + owner.balloon_alert(owner, "pointer updated") + build_all_button_icons(update_flags = UPDATE_BUTTON_ICON, force = TRUE) + +/datum/action/change_pointer_color/apply_button_icon(atom/movable/screen/movable/action_button/current_button, force = FALSE) + if(!arrow_color) + return ..() + + current_button.icon = current_button.icon_state = null + current_button.cut_overlay(arrow_overlay) + + arrow_overlay = mutable_appearance(icon = /obj/effect/temp_visual/point::icon, icon_state = "arrow_large_white_still") + arrow_overlay.color = arrow_color + arrow_overlay.overlays += mutable_appearance(icon = /obj/effect/temp_visual/point::icon, icon_state = "arrow_large_white_still_highlights", appearance_flags = RESET_COLOR) + current_button.add_overlay(arrow_overlay) diff --git a/code/modules/mob_spawn/ghost_roles/space_roles.dm b/code/modules/mob_spawn/ghost_roles/space_roles.dm index 79d028bdbcb..528aea46b86 100644 --- a/code/modules/mob_spawn/ghost_roles/space_roles.dm +++ b/code/modules/mob_spawn/ghost_roles/space_roles.dm @@ -160,6 +160,8 @@ l_pocket = /obj/item/uplink/nuclear r_pocket = /obj/item/modular_computer/pda/nukeops + skillchips = list(/obj/item/skillchip/disk_verifier) + /obj/effect/mob_spawn/ghost_role/human/syndicate/battlecruiser/captain name = "Syndicate Battlecruiser Captain" you_are_text = "You are the captain aboard the syndicate flagship: the SBC Starfury." @@ -184,3 +186,8 @@ mask = /obj/item/cigarette/cigar/havana l_pocket = /obj/item/melee/energy/sword/saber/red r_pocket = /obj/item/melee/baton/telescopic + + skillchips = list( + /obj/item/skillchip/disk_verifier, + /obj/item/skillchip/big_pointer, + ) diff --git a/code/modules/point/point.dm b/code/modules/point/point.dm index 6e61b1154d5..681fbce2c6b 100644 --- a/code/modules/point/point.dm +++ b/code/modules/point/point.dm @@ -7,22 +7,30 @@ * * Not intended as a replacement for the mob verb */ -/atom/movable/proc/point_at(atom/pointed_atom) +/atom/movable/proc/point_at(atom/pointed_atom, intentional = FALSE) if(!isturf(loc)) - return + return FALSE if (pointed_atom in src) create_point_bubble(pointed_atom) - return + return FALSE var/turf/tile = get_turf(pointed_atom) if (!tile) - return + return FALSE var/turf/our_tile = get_turf(src) var/obj/visual = new /obj/effect/temp_visual/point(our_tile, invisibility) + SEND_SIGNAL(src, COMSIG_MOVABLE_POINTED, pointed_atom, visual, intentional) + animate(visual, pixel_x = (tile.x - our_tile.x) * world.icon_size + pointed_atom.pixel_x, pixel_y = (tile.y - our_tile.y) * world.icon_size + pointed_atom.pixel_y, time = 1.7, easing = EASE_OUT) + return TRUE + +/mob/point_at(atom/pointed_atom, intentional = FALSE) + . = ..() + if(.) + face_atom(pointed_atom) /atom/movable/proc/create_point_bubble(atom/pointed_atom) var/mutable_appearance/thought_bubble = mutable_appearance( @@ -109,7 +117,6 @@ if(client && !(pointing_at in view(client.view, src))) return FALSE - point_at(pointing_at) + point_at(pointing_at, TRUE) - SEND_SIGNAL(src, COMSIG_MOB_POINTED, pointing_at) return TRUE diff --git a/code/modules/vending/games.dm b/code/modules/vending/games.dm index 33fefd08d2e..4053d5eb6cd 100644 --- a/code/modules/vending/games.dm +++ b/code/modules/vending/games.dm @@ -58,6 +58,7 @@ /obj/item/skillchip/sabrage = 2, /obj/item/skillchip/useless_adapter = 5, /obj/item/skillchip/wine_taster = 2, + /obj/item/skillchip/big_pointer = 2, ), ), list( diff --git a/icons/hud/screen_gen.dmi b/icons/hud/screen_gen.dmi index ae7499d8c6f..b7a293071b1 100644 Binary files a/icons/hud/screen_gen.dmi and b/icons/hud/screen_gen.dmi differ diff --git a/tgstation.dme b/tgstation.dme index fc5f0b97675..01f22824cdf 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -4563,6 +4563,7 @@ #include "code\modules\library\skill_learning\skill_station.dm" #include "code\modules\library\skill_learning\skillchip.dm" #include "code\modules\library\skill_learning\generic_skillchips\matrix_flip.dm" +#include "code\modules\library\skill_learning\generic_skillchips\point.dm" #include "code\modules\library\skill_learning\generic_skillchips\rod_suplex.dm" #include "code\modules\library\skill_learning\job_skillchips\_job.dm" #include "code\modules\library\skill_learning\job_skillchips\chef.dm"