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 e21789fccbf..53506e757b7 100644 --- a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_main.dm +++ b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_main.dm @@ -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" diff --git a/code/game/objects/items/devices/lighting/marshalling_wand.dm b/code/game/objects/items/devices/lighting/marshalling_wand.dm index b538b1ac48b..8d653edaf11 100644 --- a/code/game/objects/items/devices/lighting/marshalling_wand.dm +++ b/code/game/objects/items/devices/lighting/marshalling_wand.dm @@ -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() diff --git a/code/game/objects/structures/crates_lockers/closets/secure/operations.dm b/code/game/objects/structures/crates_lockers/closets/secure/operations.dm index c0b512c9f1e..eb2a4dd1edc 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/operations.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/operations.dm @@ -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 diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index a2b6b08770d..8c30c8ec9aa 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -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) diff --git a/html/changelogs/fabiank3-marshalling-wands-update.yml b/html/changelogs/fabiank3-marshalling-wands-update.yml new file mode 100644 index 00000000000..fe2d0728e5e --- /dev/null +++ b/html/changelogs/fabiank3-marshalling-wands-update.yml @@ -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." diff --git a/icons/obj/lighting.dmi b/icons/obj/lighting.dmi index 3c5b87a7219..084dbd70495 100644 Binary files a/icons/obj/lighting.dmi and b/icons/obj/lighting.dmi differ diff --git a/maps/sccv_horizon/sccv_horizon.dmm b/maps/sccv_horizon/sccv_horizon.dmm index 1c5e8520829..071832efa25 100644 --- a/maps/sccv_horizon/sccv_horizon.dmm +++ b/maps/sccv_horizon/sccv_horizon.dmm @@ -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