Marshalling wands update (#21921)

# Summary

This PR updates the marshalling wands and gives them intent based
coloring. In addition, hold a second wand in your hand, the settings
will be automatically synced.

## Changes

- Update marshalling wand sprite (more the structure then the actual
sprites).
- Added color modes, updated text, added mechanical hints and two hand
sync to marshall wands.
- Added signal for mob intent changes (unused at the moment).
- Adjusted Hangar Tech round start spawn points in the breakroom.
- Added second marshalling wand to each Hangar Tech locker.

## Preview

(Note this preview has been made prior further pixel adjustments,
consider it a demo.)


![dreamseeker_nYNBHIbQkl](https://github.com/user-attachments/assets/edc2d3f2-33ac-4adc-8c65-586360176e6a)
This commit is contained in:
FabianK3
2026-02-26 18:38:34 +00:00
committed by GitHub
parent 91b42cecfe
commit 3d0a989e97
7 changed files with 112 additions and 29 deletions
@@ -48,3 +48,6 @@
/// For when bone is fixed with surgery
#define COMSIG_BEGIN_SURGERY "begin_surgery"
/// For when the players intent changes
#define COMSIG_INTENT_CHANGE "intent_change"
@@ -3,18 +3,34 @@
desc = "A marshalling wand, used to direct air or space faring vessels during takeoff and landing."
icon_state = "marshallingwand"
item_state = "marshallingwand"
build_from_parts = TRUE
worn_overlay = "bulb"
worn_overlay_color = LIGHT_COLOR_WHITE
w_class = WEIGHT_CLASS_SMALL
light_system = MOVABLE_LIGHT
light_color = LIGHT_COLOR_RED
light_range = 2
action_button_name = "Toggle Marshalling Wands"
/obj/item/flashlight/marshallingwand/mechanics_hints(mob/user, distance, is_adjacent)
. += ..()
. += "ALT-click the marshalling wand to turn it on and off. Everytime you turn it on it will be blue, signaling and idle intent."
. += "Using the wand will change its color based of your intent. Each intent has a different output."
. += "Holding two marshalling wands in your hands will mirror the state of one to the other, so that they are always in sync."
// Override brights. The marshalling wands are meant to be always bright, this will toggle the on and off instead.
/obj/item/flashlight/marshallingwand/AltClick(mob/user)
if(!use_check_and_message(user))
if(!isturf(user.loc))
to_chat(user, SPAN_WARNING("You cannot turn the light on while in this [user.loc].")) //To prevent some lighting anomalities.)
to_chat(user, SPAN_WARNING("You cannot turn the light on while in this [user.loc].")) // To prevent some lighting anomalities.)
return FALSE
toggle()
if(on)
set_light_color(LIGHT_COLOR_BLUE) // Default to blue (stand-by) when turned on
worn_overlay_color = light_color
else
worn_overlay_color = LIGHT_COLOR_WHITE
update_icon()
mirror_held_wands(src)
user.update_action_buttons()
return TRUE
@@ -22,16 +38,73 @@
AltClick(usr)
/obj/item/flashlight/marshallingwand/attack_self(mob/user)
// Are we holding one or two wands?
var/wand_invariant = ""
if(ismob(loc))
var/mob/m = loc
var/item = m.get_inactive_hand()
if(item && istype(item, /obj/item/flashlight/marshallingwand))
wand_invariant = "wands"
else
wand_invariant = "wand"
if(!on)
to_chat(user, SPAN_WARNING("The wands need to be on before you can direct craft with them!"))
to_chat(user, SPAN_WARNING("The [wand_invariant] need to be turned on before you can direct crafts with them!"))
return
switch(user.a_intent)
if(I_HELP)
user.visible_message(SPAN_NOTICE("[user] points the marshalling wand forward, directing a pilot to take off."), SPAN_NOTICE("You point the marshalling wand forward, directing a pilot to take off."))
set_light_color(LIGHT_COLOR_GREEN) // Green for go!
if(I_DISARM)
user.visible_message(SPAN_NOTICE("[user] waves the marshalling wand toward themself, directing a pilot to approach."), SPAN_NOTICE("You wave the marshalling wand toward yourself, directing a pilot to approach."))
set_light_color(LIGHT_COLOR_BLUE) // Blue for stand-by - Idle while nothing is happening yet.
if(I_GRAB)
user.visible_message(SPAN_NOTICE("[user] holds the marshalling wand out, directing a pilot to cease movement."), SPAN_NOTICE("You hold the marshalling wand out, directing a pilot to cease movement."))
set_light_color(LIGHT_COLOR_YELLOW) // Yellow for hold - Last checks are in progress. Prepare for takeoff!
if(I_HURT)
user.visible_message(SPAN_WARNING("[user] frantically waves the marshalling wand!"), SPAN_WARNING("You wave the marshalling wand frantically!"))
set_light_color(LIGHT_COLOR_RED) // Stop! Craft is being serviced or shutting down.
worn_overlay_color = light_color
switch(light_color)
if(LIGHT_COLOR_GREEN)
user.visible_message(SPAN_NOTICE("[user] quickly waves the marshalling [wand_invariant] forward, giving the craft the lift-off signal!"), SPAN_NOTICE("You wave the marshalling [wand_invariant] forward quickly, directing the craft to take off."))
if(LIGHT_COLOR_BLUE)
user.visible_message(SPAN_NOTICE("[user] holds the marshalling [wand_invariant] close to themselves, deck is idle, don't do any unexpected things!"), SPAN_NOTICE("You hold the marshalling [wand_invariant] close to yourself, signaling an idle stance..."))
if(LIGHT_COLOR_YELLOW)
user.visible_message(SPAN_WARNING("[user] holds the marshalling [wand_invariant] out to the sides, indicating that the craft is being checked before lift off, prepare for lift off!"), SPAN_WARNING("You hold the marshalling [wand_invariant] out to your sides, indicating that the craft is being prepared for lift off."))
if(LIGHT_COLOR_RED)
user.visible_message(SPAN_WARNING("[user] steadily holds the marshalling [wand_invariant] above their head in a cross! Hold all movement!"), SPAN_WARNING("You hold the marshalling [wand_invariant] in a cross above your head, signaling full stop."))
update_icon()
mirror_held_wands(src)
/obj/item/flashlight/marshallingwand/update_icon()
overlays.Cut()
if(on)
var/image/I = overlay_image(icon, "marshallingwand-overlay", light_color)
I.blend_mode = BLEND_OVERLAY
AddOverlays(I)
icon_state = "[initial(icon_state)]-on"
item_state = "[initial(icon_state)]-on"
set_light_range_power_color(light_range, flashlight_power, light_color)
else
icon_state = initial(icon_state)
item_state = initial(item_state)
set_light_on(on)
update_held_icon()
/obj/item/flashlight/marshallingwand/proc/mirror_held_wands(var/obj/item/flashlight/marshallingwand/source_wand)
// If we are holding a wand in the other hand, make sure to mirror the state of this one to it, so that they are always in sync.
if(ismob(loc))
var/mob/m = loc
var/item_act = m.get_active_hand()
var/item_inact = m.get_inactive_hand()
if(!item_act || !item_inact || !istype(item_act, /obj/item/flashlight/marshallingwand) || !istype(item_inact, /obj/item/flashlight/marshallingwand))
return // Only one wand or different item, abort.
var/obj/item/flashlight/marshallingwand/target_wand
if(item_act == source_wand) // Check which one needs the update.
target_wand = item_inact
else
target_wand = item_act
target_wand.on = source_wand.on
target_wand.set_light_color(source_wand.light_color)
target_wand.worn_overlay_color = source_wand.worn_overlay_color
target_wand.update_icon()
@@ -52,6 +52,7 @@
new /obj/item/clipboard(src)
new /obj/item/storage/belt/utility(src)
new /obj/item/flashlight/marshallingwand(src)
new /obj/item/flashlight/marshallingwand(src)
// Machinist
/obj/structure/closet/secure_closet/machinist
+1
View File
@@ -1252,6 +1252,7 @@ GLOBAL_LIST_INIT(organ_rel_size, list(
/mob/proc/set_intent(var/set_intent)
a_intent = set_intent
SEND_SIGNAL(src, COMSIG_INTENT_CHANGE, set_intent)
/mob/proc/get_accent_icon(var/datum/language/speaking, var/mob/hearer, var/force_accent)
SHOULD_CALL_PARENT(TRUE)
@@ -0,0 +1,8 @@
author: FabianK3
delete-after: True
changes:
- rscadd: "Updated hangar tech marshalling wands. The marshalling wands now have color based of intent giving a clearer visual distinction on the action. In addition, holding two wands in your hands will automatically sync their settings."
- qol: "Add the second missing marshalling wand to the tech closets."
- qol: "Adjusted hangar tech round start spawn locations."
Binary file not shown.

Before

Width:  |  Height:  |  Size: 105 KiB

After

Width:  |  Height:  |  Size: 106 KiB

+19 -22
View File
@@ -7622,6 +7622,9 @@
/obj/effect/floor_decal/corner_wide/grey/diagonal,
/obj/machinery/atmospherics/unary/vent_scrubber/on,
/obj/effect/floor_decal/spline/plain/brown,
/obj/effect/landmark/start{
name = "Hangar Technician"
},
/turf/simulated/floor/tiled/white,
/area/horizon/operations/break_room)
"aWW" = (
@@ -31130,9 +31133,6 @@
/obj/machinery/atmospherics/pipe/simple/hidden/supply{
dir = 5
},
/obj/effect/landmark/start{
name = "Hangar Technician"
},
/obj/effect/floor_decal/corner/brown,
/turf/simulated/floor/tiled,
/area/horizon/operations/break_room)
@@ -70633,9 +70633,6 @@
/turf/simulated/floor/tiled/dark,
/area/horizon/security/checkpoint)
"jsO" = (
/obj/effect/landmark/start{
name = "Hangar Technician"
},
/obj/effect/floor_decal/corner/brown{
dir = 9
},
@@ -107217,12 +107214,6 @@
},
/turf/simulated/floor/reinforced,
/area/horizon/weapons/grauwolf)
"olw" = (
/obj/structure/bed/stool/chair{
dir = 4
},
/turf/simulated/floor/tiled,
/area/horizon/operations/break_room)
"oly" = (
/obj/structure/cable{
icon_state = "4-8"
@@ -114228,6 +114219,15 @@
},
/turf/simulated/floor/tiled,
/area/horizon/command/bridge/upperdeck)
"pgA" = (
/obj/structure/bed/stool/chair{
dir = 4
},
/obj/effect/landmark/start{
name = "Hangar Technician"
},
/turf/simulated/floor/tiled,
/area/horizon/operations/break_room)
"pgB" = (
/obj/effect/floor_decal/corner/dark_green/full{
dir = 1
@@ -127324,6 +127324,9 @@
/obj/structure/bed/stool/chair{
dir = 8
},
/obj/effect/landmark/start{
name = "Hangar Technician"
},
/turf/simulated/floor/tiled,
/area/horizon/operations/break_room)
"qWr" = (
@@ -162212,12 +162215,6 @@
},
/turf/simulated/floor/tiled/full,
/area/horizon/storage/primary)
"vCr" = (
/obj/effect/landmark/start{
name = "Hangar Technician"
},
/turf/simulated/floor/tiled,
/area/horizon/operations/break_room)
"vCI" = (
/obj/structure/sign/poster{
pixel_y = 32
@@ -268141,7 +268138,7 @@ nwj
kiJ
nwj
rNQ
vCr
uGE
aOf
gAJ
uVm
@@ -268398,7 +268395,7 @@ djR
lNh
nwj
fSu
vCr
uGE
aOf
gAJ
uVm
@@ -269681,8 +269678,8 @@ jkr
pyM
nwj
lhf
olw
olw
pgA
pgA
mzm
cGa
mRn