From 3715fa1f126d88d8522a678ff8e13229c3fa13d2 Mon Sep 17 00:00:00 2001 From: Neerti Date: Sun, 14 Jan 2018 15:48:39 -0500 Subject: [PATCH] Ports /TG/'s Marker Beacons (#4529) Ports an item stack that can be used to mark trails, useful for explorers, miners, and anyone else who doesn't want to get lost or wants to make the room more colorful. --- code/__defines/lighting.dm | 25 ++++ code/game/objects/items/devices/flashlight.dm | 2 +- .../objects/items/stacks/marker_beacons.dm | 138 ++++++++++++++++++ icons/obj/lighting.dmi | Bin 42859 -> 45584 bytes .../southern_cross/structures/closets/misc.dm | 1 + polaris.dme | 1 + 6 files changed, 166 insertions(+), 1 deletion(-) create mode 100644 code/game/objects/items/stacks/marker_beacons.dm diff --git a/code/__defines/lighting.dm b/code/__defines/lighting.dm index f311ea4aa2..30f2dac84d 100644 --- a/code/__defines/lighting.dm +++ b/code/__defines/lighting.dm @@ -49,3 +49,28 @@ #define CL_MATRIX_CG 18 #define CL_MATRIX_CB 19 #define CL_MATRIX_CA 20 + +//Some defines to generalise colours used in lighting. +//Important note on colors. Colors can end up significantly different from the basic html picture, especially when saturated +#define LIGHT_COLOR_RED "#FA8282" //Warm but extremely diluted red. rgb(250, 130, 130) +#define LIGHT_COLOR_GREEN "#64C864" //Bright but quickly dissipating neon green. rgb(100, 200, 100) +#define LIGHT_COLOR_BLUE "#6496FA" //Cold, diluted blue. rgb(100, 150, 250) + +#define LIGHT_COLOR_BLUEGREEN "#7DE1AF" //Light blueish green. rgb(125, 225, 175) +#define LIGHT_COLOR_CYAN "#7DE1E1" //Diluted cyan. rgb(125, 225, 225) +#define LIGHT_COLOR_LIGHT_CYAN "#40CEFF" //More-saturated cyan. rgb(64, 206, 255) +#define LIGHT_COLOR_DARK_BLUE "#6496FA" //Saturated blue. rgb(51, 117, 248) +#define LIGHT_COLOR_PINK "#E17DE1" //Diluted, mid-warmth pink. rgb(225, 125, 225) +#define LIGHT_COLOR_YELLOW "#E1E17D" //Dimmed yellow, leaning kaki. rgb(225, 225, 125) +#define LIGHT_COLOR_BROWN "#966432" //Clear brown, mostly dim. rgb(150, 100, 50) +#define LIGHT_COLOR_ORANGE "#FA9632" //Mostly pure orange. rgb(250, 150, 50) +#define LIGHT_COLOR_PURPLE "#952CF4" //Light Purple. rgb(149, 44, 244) +#define LIGHT_COLOR_LAVENDER "#9B51FF" //Less-saturated light purple. rgb(155, 81, 255) + +//These ones aren't a direct colour like the ones above, because nothing would fit +#define LIGHT_COLOR_FIRE "#FAA019" //Warm orange color, leaning strongly towards yellow. rgb(250, 160, 25) +#define LIGHT_COLOR_LAVA "#C48A18" //Very warm yellow, leaning slightly towards orange. rgb(196, 138, 24) +#define LIGHT_COLOR_FLARE "#FA644B" //Bright, non-saturated red. Leaning slightly towards pink for visibility. rgb(250, 100, 75) +#define LIGHT_COLOR_SLIME_LAMP "#AFC84B" //Weird color, between yellow and green, very slimy. rgb(175, 200, 75) +#define LIGHT_COLOR_TUNGSTEN "#FAE1AF" //Extremely diluted yellow, close to skin color (for some reason). rgb(250, 225, 175) +#define LIGHT_COLOR_HALOGEN "#F0FAFA" //Barely visible cyan-ish hue, as the doctor prescribed. rgb(240, 250, 250) \ No newline at end of file diff --git a/code/game/objects/items/devices/flashlight.dm b/code/game/objects/items/devices/flashlight.dm index fd997a03c5..151b762d7c 100644 --- a/code/game/objects/items/devices/flashlight.dm +++ b/code/game/objects/items/devices/flashlight.dm @@ -321,7 +321,7 @@ w_class = ITEMSIZE_SMALL brightness_on = 8 // Pretty bright. light_power = 3 - light_color = "#e58775" + light_color = LIGHT_COLOR_FLARE icon_state = "flare" item_state = "flare" action_button_name = null //just pull it manually, neckbeard. diff --git a/code/game/objects/items/stacks/marker_beacons.dm b/code/game/objects/items/stacks/marker_beacons.dm new file mode 100644 index 0000000000..9978ef6b0d --- /dev/null +++ b/code/game/objects/items/stacks/marker_beacons.dm @@ -0,0 +1,138 @@ +/*****************Marker Beacons**************************/ +var/list/marker_beacon_colors = list( +"Random" = FALSE, //not a true color, will pick a random color +"Burgundy" = LIGHT_COLOR_FLARE, +"Bronze" = LIGHT_COLOR_ORANGE, +"Yellow" = LIGHT_COLOR_YELLOW, +"Lime" = LIGHT_COLOR_SLIME_LAMP, +"Olive" = LIGHT_COLOR_GREEN, +"Jade" = LIGHT_COLOR_BLUEGREEN, +"Teal" = LIGHT_COLOR_LIGHT_CYAN, +"Cerulean" = LIGHT_COLOR_BLUE, +"Indigo" = LIGHT_COLOR_DARK_BLUE, +"Purple" = LIGHT_COLOR_PURPLE, +"Violet" = LIGHT_COLOR_LAVENDER, +"Fuchsia" = LIGHT_COLOR_PINK +) + +/obj/item/stack/marker_beacon + name = "marker beacons" + singular_name = "marker beacon" + desc = "Prismatic path illumination devices. Used by explorers and miners to mark paths and warn of danger." + description_info = "Use inhand to drop one marker beacon. You can pick them up again with an empty hand or \ + hitting them with this marker stack. Alt-click to select a specific color." + icon = 'icons/obj/lighting.dmi' + icon_state = "marker" + max_amount = 100 + no_variants = TRUE + var/picked_color = "random" + +/obj/item/stack/marker_beacon/ten + amount = 10 + +/obj/item/stack/marker_beacon/thirty + amount = 30 + +/obj/item/stack/marker_beacon/hundred + amount = 100 + +/obj/item/stack/marker_beacon/initialize() + . = ..() + update_icon() + +/obj/item/stack/marker_beacon/examine(mob/user) + ..() + to_chat(user, "Use in-hand to place a [singular_name].") + to_chat(user, "Alt-click to select a color. Current color is [picked_color].") + +/obj/item/stack/marker_beacon/update_icon() + icon_state = "[initial(icon_state)][lowertext(picked_color)]" + +/obj/item/stack/marker_beacon/attack_self(mob/user) + if(!isturf(user.loc)) + to_chat(user, "You need more space to place a [singular_name] here.") + return + if(locate(/obj/structure/marker_beacon) in user.loc) + to_chat(user, "There is already a [singular_name] here.") + return + if(use(1)) + to_chat(user, "You activate and anchor [amount ? "a":"the"] [singular_name] in place.") + playsound(user, 'sound/machines/click.ogg', 50, 1) + var/obj/structure/marker_beacon/M = new(user.loc, picked_color) + transfer_fingerprints_to(M) + +/obj/item/stack/marker_beacon/AltClick(mob/living/user) + if(user.incapacitated() || !istype(user)) + to_chat(user, "You can't do that right now!") + return + if(!in_range(src, user)) + return + var/input_color = input(user, "Choose a color.", "Beacon Color") as null|anything in marker_beacon_colors + if(user.incapacitated() || !istype(user) || !in_range(src, user)) + return + if(input_color) + picked_color = input_color + update_icon() + +/obj/structure/marker_beacon + name = "marker beacon" + desc = "A prismatic path illumination device. It is anchored in place and glowing steadily." + icon = 'icons/obj/lighting.dmi' + icon_state = "marker" +// layer = BELOW_OPEN_DOOR_LAYER + anchored = TRUE + light_range = 2 + light_power = 3 + var/remove_speed = 15 + var/picked_color + +/obj/structure/marker_beacon/New(newloc, set_color) + . = ..() + picked_color = set_color + update_icon() + +/obj/structure/marker_beacon/examine(mob/user) + ..() + to_chat(user, "Alt-click to select a color. Current color is [picked_color].") + +/obj/structure/marker_beacon/update_icon() + while(!picked_color || !marker_beacon_colors[picked_color]) + picked_color = pick(marker_beacon_colors) + icon_state = "[initial(icon_state)][lowertext(picked_color)]-on" + set_light(light_range, light_power, marker_beacon_colors[picked_color]) + +/obj/structure/marker_beacon/attack_hand(mob/living/user) + to_chat(user, "You start picking [src] up...") + if(do_after(user, remove_speed, target = src)) + var/obj/item/stack/marker_beacon/M = new(loc) + M.picked_color = picked_color + M.update_icon() + transfer_fingerprints_to(M) + if(user.put_in_hands(M, TRUE)) //delete the beacon if it fails + playsound(src, 'sound/items/deconstruct.ogg', 50, 1) + qdel(src) //otherwise delete us + +/obj/structure/marker_beacon/attackby(obj/item/I, mob/user, params) + if(istype(I, /obj/item/stack/marker_beacon)) + var/obj/item/stack/marker_beacon/M = I + to_chat(user, "You start picking [src] up...") + if(do_after(user, remove_speed, target = src) && M.amount + 1 <= M.max_amount) + M.add(1) + playsound(src, 'sound/items/deconstruct.ogg', 50, 1) + qdel(src) + else + return ..() + +/obj/structure/marker_beacon/AltClick(mob/living/user) + ..() + if(user.incapacitated() || !istype(user)) + to_chat(user, "You can't do that right now!") + return + if(!in_range(src, user)) + return + var/input_color = input(user, "Choose a color.", "Beacon Color") as null|anything in marker_beacon_colors + if(user.incapacitated() || !istype(user) || !in_range(src, user)) + return + if(input_color) + picked_color = input_color + update_icon() diff --git a/icons/obj/lighting.dmi b/icons/obj/lighting.dmi index cb4d4042c60c088428b2df0559a075e38f2a7689..c761dacf1e8bbf69cc3d8c5a6780388239c1cd8e 100644 GIT binary patch delta 9389 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 delta 6643 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