diff --git a/code/game/machinery/autolathe/autolathe_datums.dm b/code/game/machinery/autolathe/autolathe_datums.dm index 5a4c96c48fe..d9b85e79aa5 100644 --- a/code/game/machinery/autolathe/autolathe_datums.dm +++ b/code/game/machinery/autolathe/autolathe_datums.dm @@ -14,7 +14,7 @@ /datum/autolathe/recipe/flashlight name = "flashlight" - path = /obj/item/device/flashlight + path = /obj/item/device/flashlight/empty category = "General" /datum/autolathe/recipe/floor_light diff --git a/code/game/machinery/recharger.dm b/code/game/machinery/recharger.dm index c85cf155f51..1d5758e50ce 100644 --- a/code/game/machinery/recharger.dm +++ b/code/game/machinery/recharger.dm @@ -20,7 +20,7 @@ /obj/item/cell, /obj/item/modular_computer, /obj/item/computer_hardware/battery_module, - /obj/item/device/flashlight/survival, + /obj/item/device/flashlight, /obj/item/clothing/mask/smokable/ecig, /obj/item/inductive_charger/handheld, /obj/item/auto_cpr, diff --git a/code/game/objects/items/devices/lighting/flare.dm b/code/game/objects/items/devices/lighting/flare.dm index ac17bfdaf0c..95be65af841 100644 --- a/code/game/objects/items/devices/lighting/flare.dm +++ b/code/game/objects/items/devices/lighting/flare.dm @@ -1,6 +1,7 @@ /obj/item/device/flashlight/flare name = "flare" - desc = "A red standard-issue flare. There are instructions on the side reading 'pull cap, make light'." + desc = "A red standard-issue flare. There are instructions on the side reading 'twist cap off, make light'." + desc_info = "Use this item in your hand, to turn on the light." w_class = ITEMSIZE_SMALL brightness_on = 3 // Pretty bright. light_power = 4 @@ -13,32 +14,28 @@ var/on_damage = 7 var/produce_heat = 1500 light_wedge = LIGHT_OMNI + power_use = FALSE activation_sound = 'sound/items/flare.ogg' + toggle_sound = null drop_sound = 'sound/items/drop/gloves.ogg' pickup_sound = 'sound/items/pickup/gloves.ogg' - var/overrides_activation_message = FALSE - /obj/item/device/flashlight/flare/Initialize() . = ..() - fuel = rand(400, 600) + fuel = rand(4 MINUTES, 6 MINUTES) /obj/item/device/flashlight/flare/process() - var/turf/pos = get_turf(src) - if(pos) - pos.hotspot_expose(produce_heat, 5) + if(produce_heat) + var/turf/pos = get_turf(src) + if(pos) + pos.hotspot_expose(produce_heat, 5) fuel = max(fuel - 1, 0) if(!fuel || !on) + STOP_PROCESSING(SSprocessing, src) turn_off() + update_damage() if(!fuel) src.icon_state = "[initial(icon_state)]-empty" - STOP_PROCESSING(SSprocessing, src) - -/obj/item/device/flashlight/flare/proc/turn_off() - on = 0 - src.force = initial(src.force) - src.damtype = initial(src.damtype) - update_icon() /obj/item/device/flashlight/flare/update_icon() ..() @@ -51,24 +48,45 @@ /obj/item/device/flashlight/flare/attack_self(mob/user) // Usual checks if(!fuel) - to_chat(user, SPAN_WARNING("It's out of fuel.")) + to_chat(user, SPAN_WARNING("\The [src] is spent.")) return if(on) return - . = ..() // All good, turn it on. if(.) - if(!overrides_activation_message) - user.visible_message(SPAN_NOTICE("\The [user] activates the flare."), SPAN_NOTICE("You pull the cap off the flare, activating it!")) - src.force = on_damage - src.damtype = "fire" + activate(user) + update_damage() START_PROCESSING(SSprocessing, src) update_icon() +/obj/item/device/flashlight/flare/proc/activate(mob/user) + if(istype(user)) + user.visible_message( + SPAN_NOTICE("\The [user] activates the flare."), + SPAN_NOTICE("You twist the cap off the flare, activating it!"), + SPAN_NOTICE("You hear a flare sparking to life.") + ) + +/obj/item/device/flashlight/flare/proc/turn_off() + on = FALSE + visible_message( + SPAN_NOTICE("\The [src] sputters out.") + ) + update_icon() + +/obj/item/device/flashlight/flare/proc/update_damage() + if(on) + force = on_damage + damtype = "fire" + else + force = initial(force) + damtype = initial(damtype) + /obj/item/device/flashlight/flare/torch name = "torch" desc = "A rustic source of light." + desc_info = "Click on a source of flame, to light the torch." w_class = ITEMSIZE_LARGE brightness_on = 2 light_power = 3 @@ -85,6 +103,7 @@ /obj/item/device/flashlight/flare/torch/attack_self(mob/user) if (on) turn_off() + update_damage() user.visible_message("[user] extinguishes \the [src].", SPAN_NOTICE("You extinguish \the [src].")) return @@ -120,8 +139,9 @@ pos.hotspot_expose(produce_heat, 5) fuel = max(fuel - 1, 0) if(!fuel || !on) - turn_off() STOP_PROCESSING(SSprocessing, src) + turn_off() + update_damage() if(!fuel) var/obj/item/torch/T = new(pos) if(ismob(src.loc)) @@ -169,4 +189,4 @@ /obj/item/device/flashlight/flare/torch/stick/turn_off() visible_message("\The [src] burns out.") new /obj/effect/decal/cleanable/ash(get_turf(src)) - qdel(src) \ No newline at end of file + qdel(src) diff --git a/code/game/objects/items/devices/lighting/flashlight.dm b/code/game/objects/items/devices/lighting/flashlight.dm index b1794006321..4ebf911aecd 100644 --- a/code/game/objects/items/devices/lighting/flashlight.dm +++ b/code/game/objects/items/devices/lighting/flashlight.dm @@ -1,6 +1,7 @@ /obj/item/device/flashlight name = "flashlight" desc = "A hand-held emergency light." + desc_info = "Use this item in your hand, to turn on the light. Click this light with the opposite hand, to remove the cell contained inside." icon = 'icons/obj/lighting.dmi' item_icons = list( slot_l_hand_str = 'icons/mob/items/lefthand_lighting.dmi', @@ -15,29 +16,105 @@ uv_intensity = 50 light_wedge = LIGHT_WIDE - matter = list(DEFAULT_WALL_MATERIAL = 50, MATERIAL_GLASS = 20) + matter = list(MATERIAL_PLASTIC = 50, MATERIAL_GLASS = 20) action_button_name = "Toggle Flashlight" - var/on = 0 - var/brightness_on = 3 //luminosity when on + /// Is the light currently on or off? + var/on = FALSE + /// Luminosity when on + var/brightness_on = 4 + // Lighting power when on + var/flashlight_power = 0.8 + /// Sound the light makes when it's switched + var/toggle_sound = 'sound/machines/switch_flashlight.ogg' + /// Sound the light makes when it's turned on var/activation_sound = 'sound/items/flashlight.ogg' - var/spawn_dir // a way for mappers to force which way a flashlight faces upon spawning + var/obj/item/cell/cell + var/cell_type = /obj/item/cell/device + var/list/brightness_levels + var/brightness_level = "medium" + var/power_usage + /// Does the light use power? + var/power_use = TRUE + /// Should the item start with a cell? + var/starts_with_cell = TRUE + /// Does the item accept large cells? + var/accepts_large_cells = FALSE + /// Is the light always on? + var/always_on = FALSE + /// How efficient the flashlight is at producing light compared to baseline + var/efficiency_modifier = 1.0 + /// A way for mappers to force which way a flashlight faces upon spawning + var/spawn_dir /obj/item/device/flashlight/Initialize() + + if(power_use && cell_type) + if(starts_with_cell) + cell = new cell_type(src) + brightness_levels = list("low" = 0.25, "medium" = 0.5, "high" = 1) + power_usage = (brightness_levels[brightness_level] / efficiency_modifier) + else + verbs -= /obj/item/device/flashlight/verb/toggle_brightness + if (on) - light_range = brightness_on + if(brightness_level == "low") + light_range = brightness_on * 0.5 + else if(brightness_level == "high") + light_range = brightness_on * 1.5 + else + light_range = brightness_on update_icon() + . = ..() + if(light_wedge) set_dir(pick(NORTH, SOUTH, EAST, WEST)) if(spawn_dir) set_dir(spawn_dir) update_light() +/obj/item/device/flashlight/Destroy() + STOP_PROCESSING(SSprocessing, src) + QDEL_NULL(cell) + return ..() + +/obj/item/device/flashlight/get_cell() + return cell + +/obj/item/device/flashlight/proc/set_brightness(mob/user) + var/choice = input("Choose a brightness level.") as null|anything in brightness_levels + if(choice) + brightness_level = choice + power_usage = brightness_levels[choice] + to_chat(user, SPAN_NOTICE("You set the brightness level on \the [src] to [brightness_level].")) + update_icon() + +/obj/item/device/flashlight/process() + if(!on || !cell) + return PROCESS_KILL + + if(brightness_level && power_usage) + if(cell.use(power_usage) != power_usage) + visible_message( + SPAN_WARNING("\The [src] flickers before shutting out!") + ) + playsound(src.loc, 'sound/effects/sparks3.ogg', 10, 1, -3) + toggle() + return PROCESS_KILL + /obj/item/device/flashlight/update_icon() + if(always_on) + return + if(on) icon_state = "[initial(icon_state)]-on" - set_light(brightness_on) + if(brightness_level == "low") + set_light(brightness_on * 0.5, flashlight_power * 0.75, light_color) + else if(brightness_level == "high") + set_light(brightness_on * 1.5, flashlight_power * 1.1, light_color) + else + set_light(brightness_on, flashlight_power, light_color) else icon_state = "[initial(icon_state)]" set_light(0) @@ -47,18 +124,76 @@ M.update_inv_r_ear() M.update_inv_head() +/obj/item/device/flashlight/examine(mob/user) + . = ..() + if(power_use && brightness_level) + to_chat(user, SPAN_NOTICE("\The [src] is set to [brightness_level].")) + if(cell) + to_chat(user, SPAN_NOTICE("\The [src] has a \the [cell] attached.")) + /obj/item/device/flashlight/attack_self(mob/user) - if(!isturf(user.loc)) - to_chat(user, "You cannot turn the light on while in this [user.loc].") //To prevent some lighting anomalities.) + if(always_on) + to_chat(user, SPAN_NOTICE("You cannot toggle \the [name].")) return 0 + + if(power_use) + if(!cell || !cell.check_charge(1)) + playsound(src.loc, toggle_sound, 60, 1) + to_chat(user, SPAN_WARNING("You flip the switch on \the [name], but nothing happens!")) + return 0 + + if(!isturf(user.loc)) + to_chat(user, SPAN_NOTICE("You cannot turn the light on while in this [user.loc].")) //To prevent some lighting anomalities. + return 0 + + playsound(src.loc, toggle_sound, 60, 1) toggle() user.update_action_buttons() return 1 +/obj/item/device/flashlight/attack_hand(mob/user) + if(user.get_inactive_hand() == src) + if(cell) + STOP_PROCESSING(SSprocessing, src) + cell.update_icon() + user.put_in_hands(cell) + cell = null + to_chat(user, SPAN_NOTICE("You remove the cell from \the [src].")) + playsound(src, 'sound/machines/click.ogg', 30, 1, 0) + on = FALSE + update_icon() + return + ..() + else + return ..() + +/obj/item/device/flashlight/attackby(obj/item/W, mob/user) + if(power_use) + if(istype(W, /obj/item/cell)) + if(istype(W, /obj/item/cell/device) || accepts_large_cells) + if(!cell) + user.drop_item() + W.loc = src + cell = W + to_chat(user, SPAN_NOTICE("You install a cell in \the [src].")) + playsound(src, 'sound/machines/click.ogg', 30, 1, 0) + update_icon() + else + to_chat(user, SPAN_WARNING("\The [src] already has a cell!")) + else + to_chat(user, SPAN_WARNING("\The [src] cannot accept that type of cell.")) + + else + ..() + /obj/item/device/flashlight/proc/toggle() on = !on if(on && activation_sound) playsound(src.loc, activation_sound, 75, 1) + if(on && power_use) + START_PROCESSING(SSprocessing, src) + else if (power_use) + STOP_PROCESSING(SSprocessing, src) update_icon() /obj/item/device/flashlight/vendor_action(var/obj/machinery/vending/V) @@ -82,6 +217,11 @@ set_dir(new_dir) update_light() +/obj/item/device/flashlight/emp_act(severity) + for(var/obj/O in contents) + O.emp_act(severity) + ..() + /obj/item/device/flashlight/attack(mob/living/M as mob, mob/living/user as mob) add_fingerprint(user) if(on && user.zone_sel.selecting == BP_EYES) @@ -89,6 +229,10 @@ if(((user.is_clumsy()) || HAS_FLAG(user.mutations, DUMB)) && prob(50)) //too dumb to use flashlight properly return ..() //just hit them in the head + if(brightness_on < 2) + to_chat(user, SPAN_WARNING("This light is too dim to see anything with!")) + return + var/mob/living/carbon/human/H = M //mob has protective eyewear if(istype(H)) if(H.get_flash_protection()) @@ -101,36 +245,58 @@ if(!vision) to_chat(user, SPAN_WARNING("You can't find any [H.species.vision_organ ? H.species.vision_organ : "eyes"] on [H]!")) - user.visible_message(SPAN_NOTICE("\The [user] directs [src] to [M]'s eyes."), SPAN_NOTICE("You direct [src] to [M]'s eyes.")) + user.visible_message( + SPAN_NOTICE("\The [user] directs [src] to [M]'s eyes."), + SPAN_NOTICE("You direct [src] to [M]'s eyes.") + ) - if (H != user) //can't look into your own eyes buster - if(M.stat == DEAD || M.blinded || M.status_flags & FAKEDEATH) //mob is dead or fully blind - to_chat(user, SPAN_WARNING("\The [M]'s pupils do not react to the light!")) - return - if(HAS_FLAG(M.mutations, XRAY)) - to_chat(user, SPAN_NOTICE("\The [M]'s pupils give an eerie glow!")) - if(vision.damage) - to_chat(user, SPAN_WARNING("There's visible damage to [M]'s [vision.name]!")) - else if(M.eye_blurry) - to_chat(user, SPAN_NOTICE("\The [M]'s pupils react slower than normally.")) - if(M.getBrainLoss() > 15) - to_chat(user, SPAN_NOTICE("There's visible lag between left and right pupils' reactions.")) - - var/list/pinpoint = list(/singleton/reagent/oxycomorphine=1,/singleton/reagent/mortaphenyl=5) - var/list/dilating = list(/singleton/reagent/space_drugs=5,/singleton/reagent/mindbreaker=1) - var/datum/reagents/ingested = H.get_ingested_reagents() - if(H.reagents.has_any_reagent(pinpoint) || ingested.has_any_reagent(pinpoint)) - to_chat(user, SPAN_NOTICE("\The [M]'s pupils are already pinpoint and cannot narrow any more.")) - else if(H.shock_stage >= 30 || H.reagents.has_any_reagent(dilating) || ingested.has_any_reagent(dilating) || H.breathing.has_any_reagent(dilating)) - to_chat(user, SPAN_NOTICE("\The [M]'s pupils narrow slightly, but are still very dilated.")) - else - to_chat(user, SPAN_NOTICE("\The [M]'s pupils narrow.")) + inspect_vision(vision, user) user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) //can be used offensively - H.flash_act(length = 1 SECOND) + if (!(brightness_on < 2)) + H.flash_act(length = 1 SECOND) else return ..() +/obj/item/device/flashlight/proc/inspect_vision(obj/item/organ/vision, mob/living/user) + var/mob/living/carbon/human/H = vision.owner + + if (H == user) //can't look into your own eyes buster + return + + if (!BP_IS_ROBOTIC(vision)) + + if(H.stat == DEAD || H.blinded || H.status_flags & FAKEDEATH) //mob is dead or fully blind + to_chat(user, SPAN_WARNING("\The [H]'s pupils do not react to the light!")) + return + if(HAS_FLAG(H.mutations, XRAY)) + to_chat(user, SPAN_NOTICE("\The [H]'s pupils give an eerie glow!")) + if(vision.damage) + to_chat(user, SPAN_WARNING("There's visible damage to [H]'s [vision.name]!")) + else if(H.eye_blurry) + to_chat(user, SPAN_NOTICE("\The [H]'s pupils react slower than normally.")) + if(H.getBrainLoss() > 15) + to_chat(user, SPAN_NOTICE("There's visible lag between the left and right pupils' reactions.")) + + var/list/pinpoint = list(/singleton/reagent/oxycomorphine=1,/singleton/reagent/mortaphenyl=5) + var/list/dilating = list(/singleton/reagent/space_drugs=5,/singleton/reagent/mindbreaker=1) + var/datum/reagents/ingested = H.get_ingested_reagents() + if(H.reagents.has_any_reagent(pinpoint) || ingested.has_any_reagent(pinpoint)) + to_chat(user, SPAN_NOTICE("\The [H]'s pupils are already pinpoint and cannot narrow any more.")) + else if(H.shock_stage >= 30 || H.reagents.has_any_reagent(dilating) || ingested.has_any_reagent(dilating) || H.breathing.has_any_reagent(dilating)) + to_chat(user, SPAN_NOTICE("\The [H]'s pupils narrow slightly, but are still very dilated.")) + else + to_chat(user, SPAN_NOTICE("\The [H]'s pupils narrow.")) + +/obj/item/device/flashlight/verb/toggle_brightness() + set name = "Toggle Flashlight Brightness" + set category = "Object" + set src in usr + set_brightness(usr) + +/obj/item/device/flashlight/empty + starts_with_cell = FALSE + /obj/item/device/flashlight/pen name = "penlight" desc = "A pen-sized light, used by medical staff." @@ -155,18 +321,18 @@ /obj/item/device/flashlight/heavy name = "heavy duty flashlight" - desc = "A high-luminosity flashlight for specialist duties." + desc = "A high-luminosity flashlight, for specialist duties." icon_state = "heavyflashlight" item_state = "heavyflashlight" brightness_on = 4 w_class = ITEMSIZE_NORMAL uv_intensity = 60 - matter = list(DEFAULT_WALL_MATERIAL = 100, MATERIAL_GLASS = 70) + matter = list(MATERIAL_PLASTIC = 100, MATERIAL_GLASS = 70) light_wedge = LIGHT_SEMI /obj/item/device/flashlight/maglight name = "maglight" - desc = "A heavy flashlight designed for security personnel." + desc = "A heavy flashlight, designed for security personnel." icon_state = "maglight" item_state = "maglight" force = 10 @@ -178,26 +344,30 @@ hitsound = 'sound/weapons/smash.ogg' light_wedge = LIGHT_NARROW +/obj/item/device/flashlight/maglight/update_icon() + ..() + if(on) + item_state = "maglight-on" + else + item_state = "maglight" + /obj/item/device/flashlight/slime gender = PLURAL name = "glowing slime extract" desc = "A glowing ball of what appears to be amber." + desc_info = null icon = 'icons/obj/lighting.dmi' icon_state = "floor1" //not a slime extract sprite but... something close enough! item_state = "slime" w_class = ITEMSIZE_TINY brightness_on = 6 uv_intensity = 200 - on = 1 //Bio-luminesence has one setting, on. + on = TRUE //Bio-luminesence has one setting, on. + always_on = TRUE + power_usage = FALSE light_color = LIGHT_COLOR_SLIME_LAMP light_wedge = LIGHT_OMNI -/obj/item/device/flashlight/slime/update_icon() - return - -/obj/item/device/flashlight/slime/attack_self(mob/user) - return //Bio-luminescence does not toggle. - /obj/item/device/flashlight/headlights name = "headlights" desc = "Some nifty lamps drawing from internal battery sources to produce a light, though a dim one." @@ -209,3 +379,32 @@ w_class = ITEMSIZE_TINY light_wedge = LIGHT_WIDE body_parts_covered = 0 + +/******************************Lantern*******************************/ + +/obj/item/device/flashlight/lantern + name = "lantern" + desc = "A mining lantern. Accepts larger cells than normal flashlights." + icon_state = "lantern" + item_state = "lantern" + item_icons = list( + slot_l_hand_str = 'icons/mob/items/lefthand_mining.dmi', + slot_r_hand_str = 'icons/mob/items/righthand_mining.dmi', + ) + force = 10 + attack_verb = list("bludgeoned, bashed, whacked") + w_class = ITEMSIZE_NORMAL + matter = list(MATERIAL_STEEL = 200,MATERIAL_GLASS = 100) + flashlight_power = 1 + brightness_on = 4 + cell_type = /obj/item/cell + accepts_large_cells = TRUE + light_wedge = LIGHT_OMNI + light_color = LIGHT_COLOR_FIRE + +/obj/item/device/flashlight/lantern/update_icon() + ..() + if(on) + item_state = "lantern-on" + else + item_state = "lantern" diff --git a/code/game/objects/items/devices/lighting/glowstick.dm b/code/game/objects/items/devices/lighting/glowstick.dm index e653238bf77..79684fce17d 100644 --- a/code/game/objects/items/devices/lighting/glowstick.dm +++ b/code/game/objects/items/devices/lighting/glowstick.dm @@ -3,18 +3,19 @@ desc = "A green military-grade glowstick." w_class = ITEMSIZE_SMALL brightness_on = 1.2 - light_power = 2 - color = "#49F37C" + flashlight_power = 2 + light_color = "#49F37C" icon_state = "glowstick" item_state = "glowstick" + produce_heat = 0 uv_intensity = 255 light_wedge = LIGHT_OMNI activation_sound = 'sound/items/glowstick.ogg' - overrides_activation_message = TRUE + toggle_sound = null /obj/item/device/flashlight/flare/glowstick/Initialize() . = ..() - fuel = rand(900, 1200) + fuel = rand(9 MINUTES, 12 MINUTES) light_color = color /obj/item/device/flashlight/flare/glowstick/process() @@ -31,33 +32,23 @@ icon_state = "[initial(icon_state)]-empty" set_light(0) else if(on) + var/image/I = overlay_image(icon, "glowstick-overlay", color) + I.blend_mode = BLEND_ADD + add_overlay(I) icon_state = "[initial(icon_state)]-on" item_state = "[initial(icon_state)]-on" - set_light(brightness_on) + set_light(brightness_on, flashlight_power, light_color) else icon_state = initial(icon_state) update_held_icon() -/obj/item/device/flashlight/flare/glowstick/attack_self(var/mob/living/user) - if(((user.is_clumsy())) && prob(50)) - to_chat(user, SPAN_WARNING("You break \the [src] apart, spilling its contents everywhere!")) - fuel = 0 - new /obj/effect/decal/cleanable/greenglow(get_turf(user)) - user.apply_damage(rand(15,30), DAMAGE_RADIATION, damage_flags = DAMAGE_FLAG_DISPERSED) - qdel(src) - return - - if(!fuel) - to_chat(user, SPAN_WARNING("\The [src] has already been used.")) - return - if(on) - to_chat(user, SPAN_WARNING("\The [src] has already been turned on.")) - return - - . = ..() - - if(.) - user.visible_message(SPAN_NOTICE("\The [user] cracks and shakes \the [src]."), SPAN_NOTICE("You crack and shake \the [src], turning it on!")) +/obj/item/device/flashlight/flare/glowstick/activate(mob/user) + if(istype(user)) + user.visible_message( + SPAN_NOTICE("\The [user] cracks and shakes \the [src]."), + SPAN_NOTICE("You crack and shake \the [src], turning it on!"), + SPAN_NOTICE("You hear someone crack and shake a glowstick.") + ) /obj/item/device/flashlight/flare/glowstick/red name = "red glowstick" @@ -86,4 +77,4 @@ /obj/item/device/flashlight/flare/glowstick/random/Initialize() color = rgb(rand(50, 255), rand(50, 255), rand(50, 255)) - . = ..() \ No newline at end of file + . = ..() diff --git a/code/game/objects/items/devices/lighting/lamp.dm b/code/game/objects/items/devices/lighting/lamp.dm index c4585e80ac5..cd44ccc4a09 100644 --- a/code/game/objects/items/devices/lighting/lamp.dm +++ b/code/game/objects/items/devices/lighting/lamp.dm @@ -1,26 +1,40 @@ /obj/item/device/flashlight/lamp name = "desk lamp" desc = "A desk lamp with an adjustable mount." + desc_info = "Use this item in your hand to toggle the light, or right click this object and use the 'Toggle Light' verb." desc_antag = "As a Cultist, this item can be reforged to become a pylon." icon_state = "lamp" item_state = "lamp" center_of_mass = list("x" = 13,"y" = 11) brightness_on = 4 + flashlight_power = 1.0 w_class = ITEMSIZE_HUGE flags = CONDUCT uv_intensity = 100 + power_use = FALSE on = TRUE slot_flags = 0 //No wearing desklamps light_wedge = LIGHT_OMNI + toggle_sound = /singleton/sound_category/switch_sound + activation_sound = 'sound/effects/lighton.ogg' + // green-shaded desk lamp /obj/item/device/flashlight/lamp/green desc = "A classic green-shaded desk lamp." icon_state = "lampgreen" item_state = "lampgreen" - center_of_mass = list("x" = 15,"y" = 11) brightness_on = 5 light_color = "#FFC58F" + toggle_sound = 'sound/machines/switch_chain.ogg' + +/obj/item/device/flashlight/lamp/verb/toggle_light() + set name = "Toggle Light" + set category = "Object" + set src in oview(1) + + if(!usr.stat) + attack_self(usr) //Lava Lamps: Because we're already stuck in the 70ies with those fax machines. /obj/item/device/flashlight/lamp/lava @@ -28,11 +42,12 @@ desc = "Random oil globules within were parsed in photos for your protection. Enjoy this kitschy memorabilia by sticking it on your desk." icon_state = "lavalamp" brightness_on = 3 + flashlight_power = 0.5 matter = list(DEFAULT_WALL_MATERIAL = 250, MATERIAL_GLASS = 200) /obj/item/device/flashlight/lamp/lava/update_icon() if(on) - set_light(brightness_on) + set_light(brightness_on, flashlight_power, light_color) else set_light(0) cut_overlays() @@ -69,4 +84,4 @@ desc = "A portable, beautiful and flashy stage light!" light_color = COLOR_ORANGE icon_state = "stage" - item_state = "stage" \ No newline at end of file + item_state = "stage" diff --git a/code/game/objects/items/devices/lighting/survival.dm b/code/game/objects/items/devices/lighting/survival.dm index a887f7e281a..355effc8089 100644 --- a/code/game/objects/items/devices/lighting/survival.dm +++ b/code/game/objects/items/devices/lighting/survival.dm @@ -1,6 +1,6 @@ /obj/item/device/flashlight/survival name = "survival flashlight" - desc = "A hand-held emergency light. This one has been modified with a larger bulb pointing inwards." + desc = "A hand-held emergency light. This one has been modified with a larger, more efficient bulb pointing inwards." icon_state = "survival_flashlight" item_state = "survival_flashlight" light_wedge = null @@ -9,44 +9,4 @@ light_power = 2 brightness_on = 2 light_color = LIGHT_COLOR_GREEN - - var/obj/item/cell/cell - var/last_drain = 0 - var/drain_per_second = 4 // should last about four minutes - -/obj/item/device/flashlight/survival/Initialize() - . = ..() - cell = new /obj/item/cell/device(src) - -/obj/item/device/flashlight/survival/Destroy() - QDEL_NULL(cell) - return ..() - -/obj/item/device/flashlight/survival/examine(mob/user, distance) - . = ..() - to_chat(user, SPAN_NOTICE("\The [src]'s power cell is at [round(cell.percent())]%.")) - -/obj/item/device/flashlight/survival/attack_self(mob/user) - if(!on && !cell.check_charge(1)) - to_chat(user, SPAN_WARNING("\The [src] doesn't have any charge!")) - return - return ..() - -/obj/item/device/flashlight/survival/toggle() - if(!on && !cell.check_charge(1)) - return - ..() - if(on) - last_drain = world.time - START_PROCESSING(SSprocessing, src) - else - STOP_PROCESSING(SSprocessing, src) - -/obj/item/device/flashlight/survival/process() - var/cell_drain = ((world.time - last_drain) / 10) * drain_per_second - if(!cell.use(cell_drain) && on) - toggle() - last_drain = world.time - -/obj/item/device/flashlight/survival/get_cell() - return cell \ No newline at end of file + efficiency_modifier = 1.2 // 120% more efficient compared to other flashlights diff --git a/code/game/objects/items/weapons/ecigs.dm b/code/game/objects/items/weapons/ecigs.dm index 61c93d88da8..3abdc58db3d 100644 --- a/code/game/objects/items/weapons/ecigs.dm +++ b/code/game/objects/items/weapons/ecigs.dm @@ -9,7 +9,7 @@ icon_supported_species_tags = list("una", "taj") var/active = FALSE var/obj/item/cell/cig_cell - var/cell_type = /obj/item/cell/crap/cig + var/cell_type = /obj/item/cell/device var/obj/item/reagent_containers/ecig_cartridge/ec_cartridge var/cartridge_type = /obj/item/reagent_containers/ecig_cartridge/med_nicotine w_class = ITEMSIZE_TINY @@ -20,7 +20,7 @@ chem_volume = 0 //ecig has no storage on its own but has reagent container created by parent obj item_state = "ecigoff" var/icon_empty - var/power_usage = 500 //value for simple ecig, divide by 5 to get the charge needed for 1 cartridge + var/power_usage = 250 //value for simple ecig, divide by 5 to get the charge needed for 1 cartridge var/ecig_colors = list(null, COLOR_DARK_GRAY, COLOR_RED_GRAY, COLOR_BLUE_GRAY, COLOR_GREEN_GRAY, COLOR_PURPLE_GRAY) var/idle = 0 var/idle_treshold = 30 @@ -56,7 +56,6 @@ icon_off = "ecigoff1" icon_empty = "ecigoff1" icon_on = "ecigon" - cell_type = /obj/item/cell/crap/cig //enough for two cartridges /obj/item/clothing/mask/smokable/ecig/util/Initialize() . = ..() @@ -71,7 +70,7 @@ obj/item/clothing/mask/smokable/ecig/util/examine(mob/user) if(cig_cell) to_chat(user, SPAN_NOTICE("The power meter shows that there's about [round(cig_cell.percent(), 5)]% power remaining.")) else - to_chat(user, SPAN_NOTICE("There's no cartridge connected.")) + to_chat(user, SPAN_NOTICE("There's no power cell connected.")) if(active) to_chat(user, SPAN_NOTICE("It is currently turned on.")) else @@ -84,7 +83,7 @@ obj/item/clothing/mask/smokable/ecig/util/examine(mob/user) icon_off = "pcigoff1" icon_empty = "pcigoff2" icon_on = "pcigon" - cell_type = /obj/item/cell/crap //enough for five catridges + cell_type = /obj/item/cell/device/high /obj/item/clothing/mask/smokable/ecig/deluxe/examine(mob/user) . = ..() @@ -95,7 +94,7 @@ obj/item/clothing/mask/smokable/ecig/util/examine(mob/user) if(cig_cell) to_chat(user, SPAN_NOTICE("The power meter shows that there's about [round(cig_cell.percent(), 1)]% power remaining.")) else - to_chat(user, SPAN_NOTICE("There's no cartridge connected.")) + to_chat(user, SPAN_NOTICE("There's no power cell connected.")) /obj/item/clothing/mask/smokable/ecig/proc/deactivate() active = FALSE @@ -169,8 +168,8 @@ obj/item/clothing/mask/smokable/ecig/util/examine(mob/user) if(cig_cell) //if contains powercell cig_cell.update_icon() user.put_in_hands(cig_cell) - cig_cell = null to_chat(user, SPAN_NOTICE("You remove \the [cig_cell] from \the [src].")) + cig_cell = null else //does not contains cell to_chat(user, SPAN_WARNING("There's no battery in \the [src].")) @@ -178,10 +177,8 @@ obj/item/clothing/mask/smokable/ecig/util/examine(mob/user) if(cig_cell) to_chat(user, SPAN_WARNING("\The [src] already has a battery installed.")) return - var/obj/item/cell/C = I - var/obj/item/cell/max_cap = cell_type - if (C.maxcharge > initial(max_cap.maxcharge)) // using initial means you don't have to instantiate the object - to_chat(user, SPAN_WARNING("\The [cig_cell] is too powerful to be inserted into \the [src].")) + if (!istype(I, /obj/item/cell/device)) + to_chat(user, SPAN_WARNING("\The [I] is too large to be inserted into \the [src].")) return if(user.unEquip(I)) I.forceMove(src) diff --git a/code/game/objects/items/weapons/power_cells.dm b/code/game/objects/items/weapons/power_cells.dm index f66a3f4a000..44b9c267cb5 100644 --- a/code/game/objects/items/weapons/power_cells.dm +++ b/code/game/objects/items/weapons/power_cells.dm @@ -17,17 +17,24 @@ matter = list(DEFAULT_WALL_MATERIAL = 700, MATERIAL_GLASS = 50) recyclable = TRUE -//currently only used by energy-type guns, that may change in the future. +/// Smaller variant, used by energy guns and similar small devices /obj/item/cell/device name = "device power cell" desc = "A small power cell designed to power handheld devices." - icon_state = "cell" //placeholder + icon_state = "device" w_class = ITEMSIZE_SMALL force = 0 throw_speed = 5 throw_range = 7 - maxcharge = 1000 - matter = list(MATERIAL_STEEL = 350, MATERIAL_GLASS = 50) + maxcharge = 100 + matter = list(MATERIAL_STEEL = 70, MATERIAL_GLASS = 5) + +/obj/item/cell/device/high + name = "advanced power cell" + desc = "A small, advanced power cell designed to power more energy demanding handheld devices." + icon_state = "hdevice" + maxcharge = 250 + matter = list(MATERIAL_STEEL = 150, MATERIAL_GLASS = 10) /obj/item/cell/device/variable/New(newloc, charge_amount) ..(newloc) @@ -35,8 +42,8 @@ charge = maxcharge /obj/item/cell/crap - name = "\improper rechargable AA battery" - desc = "You can't top the plasma top." //TOTALLY TRADEMARK INFRINGEMENT + name = "old power cell" + desc = "A cheap, old power cell. It's probably been in use for quite some time now." origin_tech = list(TECH_POWER = 0) maxcharge = 500 matter = list(DEFAULT_WALL_MATERIAL = 700, MATERIAL_GLASS = 40) diff --git a/code/modules/mining/mine_items.dm b/code/modules/mining/mine_items.dm index 109281bbab3..7aada4f4b24 100644 --- a/code/modules/mining/mine_items.dm +++ b/code/modules/mining/mine_items.dm @@ -1,19 +1,3 @@ -/******************************Lantern*******************************/ - -/obj/item/device/flashlight/lantern - name = "lantern" - desc = "A mining lantern." - icon_state = "lantern" - item_state = "lantern" - item_icons = list( - slot_l_hand_str = 'icons/mob/items/lefthand_mining.dmi', - slot_r_hand_str = 'icons/mob/items/righthand_mining.dmi', - ) - light_power = 1 - brightness_on = 4 - light_wedge = LIGHT_OMNI - light_color = LIGHT_COLOR_FIRE - /*****************************Pickaxe********************************/ /obj/item/pickaxe diff --git a/code/modules/power/cell.dm b/code/modules/power/cell.dm index 4370761a660..9155ff3ac87 100644 --- a/code/modules/power/cell.dm +++ b/code/modules/power/cell.dm @@ -29,16 +29,18 @@ /obj/item/cell/update_icon() cut_overlays() - - if(charge < 0.01) - return - else if(charge/maxcharge >=0.995) - add_overlay("cell-o2") - else - add_overlay("cell-o1") + switch(percent()) + if(95 to 100) + add_overlay("cell-o2") + if(25 to 94) + add_overlay("cell-o1") + if(0.05 to 25) + add_overlay("cell-o0") + if(0 to 0.05) + return /obj/item/cell/proc/percent() // return % charge of cell - return 100.0*charge/maxcharge + return maxcharge && (100.0*charge/maxcharge) /obj/item/cell/proc/fully_charged() return (charge == maxcharge) diff --git a/code/modules/research/designs/protolathe/power_designs.dm b/code/modules/research/designs/protolathe/power_designs.dm index a70551f8001..52369d8854e 100644 --- a/code/modules/research/designs/protolathe/power_designs.dm +++ b/code/modules/research/designs/protolathe/power_designs.dm @@ -40,5 +40,11 @@ /datum/design/item/powercell/device name = "Device" req_tech = list(TECH_POWER = 1) - materials = list(DEFAULT_WALL_MATERIAL = 700, MATERIAL_GLASS = 50) - build_path = /obj/item/cell/device \ No newline at end of file + materials = list(DEFAULT_WALL_MATERIAL = 70, MATERIAL_GLASS = 5) + build_path = /obj/item/cell/device + +/datum/design/item/powercell/device/high + name = "Advanced Device" + req_tech = list(TECH_POWER = 2) + materials = list(DEFAULT_WALL_MATERIAL = 150, MATERIAL_GLASS = 10) + build_path = /obj/item/cell/device/high \ No newline at end of file diff --git a/html/changelogs/generalcamo - flashlights.yml b/html/changelogs/generalcamo - flashlights.yml new file mode 100644 index 00000000000..8cdb5fae666 --- /dev/null +++ b/html/changelogs/generalcamo - flashlights.yml @@ -0,0 +1,53 @@ +################################ +# Example Changelog File +# +# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. +# +# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) +# When it is, any changes listed below will disappear. +# +# Valid Prefixes: +# bugfix +# wip (For works in progress) +# tweak +# soundadd +# sounddel +# rscadd (general adding of nice things) +# rscdel (general deleting of nice things) +# imageadd +# imagedel +# maptweak +# spellcheck (typo fixes) +# experiment +# balance +# admin +# backend +# security +# refactor +################################# + +# Your name. +author: GeneralCamo + +# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again. +delete-after: True + +# Any changes you've made. See valid prefix list above. +# INDENT WITH TWO SPACES. NOT TABS. SPACES. +# SCREW THIS UP AND IT WON'T WORK. +# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries. +# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog. +changes: + - rscadd: "Flashlights now consume power. They accept device power cells, with the exception of the lantern which uses standard cells." + - rscadd: "Flashlights have various brightness modes. The higher the brightness, the more light produced but also the more power consumed." + - bugfix: "The lantern and maglight's on states are actually used." + - bugfix: "Added more sanity checking to catch illegal calls in flashlights." + - refactor: "Cleaned up flashlight code to make it more flexible." + - imageadd: "Added a sprite for device power cells. (Credit to Pebbles, Baystation12.)" + - imageadd: "Power cells now have a distinct sprite for low power, and no power." + - rscadd: "Added advanced device power cells. (Sprite credit to Pebbles, Baystation12.)" + - soundadd: "Added sounds for toggling flashlights, and the green desk lamp." + - tweak: "Flashlights are now fabricated from plastic, instead of steel." + - tweak: "Electronic cigarettes now use device power cells. Power consumption has been reduced in half to compensate." + - tweak: "Dim lights can no longer be used to inspect eyes, and robotic eyes can no longer be inspected with flashlights." + - tweak: "Lanterns are now considered large items. Their attack force was increased to 10 to compensate." diff --git a/icons/obj/power.dmi b/icons/obj/power.dmi index 8fa27d5e5a2..60f407e33d9 100644 Binary files a/icons/obj/power.dmi and b/icons/obj/power.dmi differ diff --git a/sound/attributions.txt b/sound/attributions.txt index 04c5dcb38d7..511afb91075 100644 --- a/sound/attributions.txt +++ b/sound/attributions.txt @@ -57,4 +57,9 @@ ATTRIBUTIONS SECTION START sound/items/shield/energy/shield-loop.ogg - By spookerton for Baystation12 - Licensed under GNU Affero General Public License v3 sound/items/shield/energy/shield-start.ogg - By spookerton for Baystation12 - Licensed under GNU Affero General Public License v3 sound/items/shield/energy/shield-stop.ogg - By spookerton for Baystation12 - Licensed under GNU Affero General Public License v3 +ATTRIBUTIONS SECTION END + +ATTRIBUTIONS SECTION START +sound/machines/switch_chain.ogg - "Chain_switch_2.wav", licensed under CC-BY 3.0. Obtained and edited from https://freesound.org/people/DCElliott/sounds/386422/ +sound/machines/switch_flashlight.ogg - "Flashlight Switch", licensed under CC0. Obtained and edited from https://freesound.org/people/Kinoton/sounds/352092/ ATTRIBUTIONS SECTION END \ No newline at end of file diff --git a/sound/machines/switch_chain.ogg b/sound/machines/switch_chain.ogg new file mode 100644 index 00000000000..a078b37387e Binary files /dev/null and b/sound/machines/switch_chain.ogg differ diff --git a/sound/machines/switch_flashlight.ogg b/sound/machines/switch_flashlight.ogg new file mode 100644 index 00000000000..0f04ecfd10a Binary files /dev/null and b/sound/machines/switch_flashlight.ogg differ