diff --git a/code/modules/power/singularity/emitter.dm b/code/modules/power/singularity/emitter.dm index e5aa9dea053..bd14f07c785 100644 --- a/code/modules/power/singularity/emitter.dm +++ b/code/modules/power/singularity/emitter.dm @@ -1,25 +1,38 @@ +#define EMITTER_NEEDS_WRENCH 0 +#define EMITTER_NEEDS_WELDER 1 +#define EMITTER_WELDED 2 + /obj/machinery/power/emitter - name = "Emitter" + name = "emitter" desc = "A heavy duty industrial laser" icon = 'icons/obj/singularity.dmi' icon_state = "emitter" - anchored = 0 - density = 1 + anchored = FALSE + density = TRUE req_access = list(ACCESS_ENGINE_EQUIP) use_power = NO_POWER_USE idle_power_usage = 10 active_power_usage = 300 - var/active = 0 - var/powered = 0 + /// Is the emitter turned on + var/active = FALSE + /// Is the emitter powered + var/powered = FALSE + /// Delay between each emitter shot (In deciseconds) var/fire_delay = 100 + /// Maximum delay between each emitter shot var/maximum_fire_delay = 100 + /// Minimum delay between each emitter shot var/minimum_fire_delay = 20 + /// When was the last emitter shot var/last_shot = 0 + /// How many shots have been fired var/shot_number = 0 - var/state = 0 - var/locked = 0 + /// Construction state + var/state = EMITTER_NEEDS_WRENCH + /// Locked by an ID card + var/locked = FALSE var/projectile_type = /obj/item/projectile/beam/emitter var/projectile_sound = 'sound/weapons/emitter.ogg' @@ -32,12 +45,17 @@ component_parts += new /obj/item/stock_parts/micro_laser(null) component_parts += new /obj/item/stock_parts/manipulator(null) RefreshParts() - if(state == 2 && anchored) + if(state == EMITTER_WELDED && anchored) connect_to_network() sparks = new sparks.attach(src) sparks.set_up(5, 1, src) +/obj/machinery/power/emitter/examine(mob/user) + . = ..() + if(panel_open) + . += "The maintenance panel is open." + /obj/machinery/power/emitter/RefreshParts() var/max_firedelay = 120 var/firedelay = 120 @@ -59,11 +77,10 @@ set category = "Object" set src in oview(1) - if(src.anchored || usr:stat) + if(anchored) to_chat(usr, "It is fastened to the floor!") - return 0 - src.dir = turn(src.dir, 90) - return 1 + return + dir = turn(dir, 90) /obj/machinery/power/emitter/AltClick(mob/user) if(user.incapacitated()) @@ -87,46 +104,49 @@ icon_state = "emitter" -/obj/machinery/power/emitter/attack_hand(mob/user as mob) - src.add_fingerprint(user) - if(state == 2) - if(!powernet) - to_chat(user, "The emitter isn't connected to a wire.") - return 1 - if(!src.locked) - if(src.active==1) - src.active = 0 - to_chat(user, "You turn off the [src].") - message_admins("Emitter turned off by [key_name_admin(user)] in ([x], [y], [z] - JMP)",0,1) - log_game("Emitter turned off by [key_name(user)] in [x], [y], [z]") - investigate_log("turned off by [key_name(usr)]","singulo") - else - src.active = 1 - to_chat(user, "You turn on the [src].") - src.shot_number = 0 - src.fire_delay = maximum_fire_delay - message_admins("Emitter turned on by [key_name_admin(user)] in ([x], [y], [z] - JMP)",0,1) - log_game("Emitter turned on by [key_name(user)] in [x], [y], [z]") - investigate_log("turned on by [key_name(usr)]","singulo") - update_icon() - else - to_chat(user, "The controls are locked!") +/obj/machinery/power/emitter/emag_act(mob/living/user) + if(!emagged) + locked = FALSE + emagged = TRUE + if(user) + user.visible_message("[user] shorts out the lock on [src].", + "You short out the lock on [src].") + +/obj/machinery/power/emitter/attack_hand(mob/user) + add_fingerprint(user) + if(state != EMITTER_WELDED) + to_chat(user, "[src] needs to be firmly secured to the floor first.") + return TRUE + if(!powernet) + to_chat(user, "The emitter isn't connected to a wire.") + return TRUE + if(panel_open) + to_chat(user, "The maintenance panel needs to be closed!") + return + if(locked) + to_chat(user, "The controls are locked!") + return + + var/toggle + if(active) + active = FALSE + toggle = "off" + shot_number = 0 + fire_delay = maximum_fire_delay + investigate_log("turned off by [key_name(user)]", "singulo") else - to_chat(user, "The [src] needs to be firmly secured to the floor first.") - return 1 + active = TRUE + toggle = "on" + investigate_log("turned on by [key_name(user)]", "singulo") - -/obj/machinery/power/emitter/emp_act(severity)//Emitters are hardened but still might have issues -// add_load(1000) -/* if((severity == 1)&&prob(1)&&prob(1)) - if(src.active) - src.active = 0 - src.use_power = IDLE_POWER_USE */ - return 1 + to_chat(user, "You turn [src] [toggle].") + message_admins("Emitter turned [toggle] by [key_name_admin(user)] in ([x], [y], [z] - JMP)") + log_game("Emitter turned [toggle] by [key_name(user)] in [x], [y], [z]") + update_icon() /obj/machinery/power/emitter/attack_animal(mob/living/simple_animal/M) if(ismegafauna(M) && anchored) - state = 0 + state = EMITTER_NEEDS_WRENCH anchored = FALSE M.visible_message("[M] rips [src] free from its moorings!") else @@ -134,30 +154,120 @@ if(!anchored) step(src, get_dir(M, src)) -/obj/machinery/power/emitter/process() - if(stat & (BROKEN)) +/obj/machinery/power/emitter/attackby(obj/item/I, mob/user, params) + if(istype(I, /obj/item/card/id) || istype(I, /obj/item/pda)) + if(emagged) + to_chat(user, "The lock seems to be broken.") + return + if(allowed(user)) + if(active) + locked = !locked + to_chat(user, "The controls are now [locked ? "locked" : "unlocked"].") + else + locked = FALSE //just in case it somehow gets locked + to_chat(user, "The controls can only be locked when [src] is online!") + else + to_chat(user, "Access denied.") return - if(src.state != 2 || (!powernet && active_power_usage)) - src.active = 0 + + if(exchange_parts(user, I)) + return + + return ..() + +/obj/machinery/power/emitter/wrench_act(mob/living/user, obj/item/I) + . = TRUE + if(active) + to_chat(user, "Turn off [src] first!") + return + if(state == EMITTER_WELDED) + to_chat(user, "[src] needs to be unwelded from the floor!") + return + + if(state == EMITTER_NEEDS_WRENCH) + for(var/obj/machinery/power/emitter/E in get_turf(src)) + if(E.anchored) + to_chat(user, "There is already an emitter here!") + return + state = EMITTER_NEEDS_WELDER + anchored = TRUE + user.visible_message("[user] secures [src] to the floor.", + "You secure the external reinforcing bolts to the floor.", + "You hear a ratchet.") + else + state = EMITTER_NEEDS_WRENCH + anchored = FALSE + user.visible_message("[user] unsecures [src] reinforcing bolts from the floor.", + "You undo the external reinforcing bolts.", + "You hear a ratchet.") + playsound(src, I.usesound, I.tool_volume, TRUE) + +/obj/machinery/power/emitter/screwdriver_act(mob/living/user, obj/item/I) + . = TRUE + if(active) + to_chat(user, "[src] needs to be disabled first!") + return + default_deconstruction_screwdriver(user, "emitter_open", "emitter", I) + +/obj/machinery/power/emitter/crowbar_act(mob/living/user, obj/item/I) + . = TRUE + default_deconstruction_crowbar(user, I) + +/obj/machinery/power/emitter/welder_act(mob/user, obj/item/I) + . = TRUE + if(active) + to_chat(user, "Turn off [src] first.") + return + if(state == EMITTER_NEEDS_WRENCH) + to_chat(user, "[src] needs to be wrenched to the floor.") + return + if(!I.tool_use_check(user, 0)) + return + + if(state == EMITTER_NEEDS_WELDER) + WELDER_ATTEMPT_FLOOR_WELD_MESSAGE + else if(state == EMITTER_WELDED) + WELDER_ATTEMPT_FLOOR_SLICE_MESSAGE + + if(!I.use_tool(src, user, 20, volume = I.tool_volume)) + return + + if(state == EMITTER_NEEDS_WELDER) + WELDER_FLOOR_WELD_SUCCESS_MESSAGE + connect_to_network() + state = EMITTER_WELDED + else if(state == EMITTER_WELDED) + WELDER_FLOOR_SLICE_SUCCESS_MESSAGE + disconnect_from_network() + state = EMITTER_NEEDS_WELDER + +/obj/machinery/power/emitter/emp_act(severity)//Emitters are hardened but still might have issues + return TRUE + +/obj/machinery/power/emitter/process() + if((stat & BROKEN) || !active) + return + if(state != EMITTER_WELDED || (!powernet && active_power_usage)) + active = FALSE update_icon() return - if(active == TRUE) - if(!active_power_usage || surplus() >= active_power_usage) - add_load(active_power_usage) - if(!powered) - powered = 1 - update_icon() - investigate_log("regained power and turned on","singulo") - else - if(powered) - powered = 0 - update_icon() - investigate_log("lost power and turned off","singulo") - return - if(!check_delay()) - return FALSE - fire_beam() + if(!active_power_usage || surplus() >= active_power_usage) + add_load(active_power_usage) + if(!powered) + powered = TRUE + update_icon() + investigate_log("regained power and turned on","singulo") + else + if(powered) + powered = FALSE + update_icon() + investigate_log("lost power and turned off","singulo") + return + + if(!check_delay()) + return FALSE + fire_beam() /obj/machinery/power/emitter/proc/check_delay() if((last_shot + fire_delay) <= world.time) @@ -198,7 +308,7 @@ last_shot = world.time if(shot_number < 3) fire_delay = 20 - shot_number ++ + shot_number++ else fire_delay = rand(minimum_fire_delay, maximum_fire_delay) shot_number = 0 @@ -208,89 +318,6 @@ P.fire() return P -/obj/machinery/power/emitter/attackby(obj/item/W, mob/user, params) - if(istype(W, /obj/item/multitool)) - update_multitool_menu(user) - return 1 - - if(istype(W, /obj/item/wrench)) - if(active) - to_chat(user, "Turn off the [src] first.") - return - switch(state) - if(0) - state = 1 - playsound(src.loc, W.usesound, 75, 1) - user.visible_message("[user.name] secures [src.name] to the floor.", \ - "You secure the external reinforcing bolts to the floor.", \ - "You hear a ratchet") - src.anchored = 1 - if(1) - state = 0 - playsound(src.loc,W.usesound, 75, 1) - user.visible_message("[user.name] unsecures [src.name] reinforcing bolts from the floor.", \ - "You undo the external reinforcing bolts.", \ - "You hear a ratchet") - src.anchored = 0 - if(2) - to_chat(user, "The [src.name] needs to be unwelded from the floor.") - return - - if(istype(W, /obj/item/card/id) || istype(W, /obj/item/pda)) - if(emagged) - to_chat(user, "The lock seems to be broken") - return - if(src.allowed(user)) - if(active) - src.locked = !src.locked - to_chat(user, "The controls are now [src.locked ? "locked." : "unlocked."]") - else - src.locked = 0 //just in case it somehow gets locked - to_chat(user, "The controls can only be locked when the [src] is online") - else - to_chat(user, "Access denied.") - return - - if(default_deconstruction_screwdriver(user, "emitter_open", "emitter", W)) - return - - if(exchange_parts(user, W)) - return - - if(default_deconstruction_crowbar(user, W)) - return - - return ..() - -/obj/machinery/power/emitter/emag_act(mob/living/user as mob) - if(!emagged) - locked = 0 - emagged = 1 - if(user) - user.visible_message("[user.name] emags the [src.name].","You short out the lock.") - - -/obj/machinery/power/emitter/welder_act(mob/user, obj/item/I) - if(active) - to_chat(user, "Turn off [src] first.") - return - if(state == 0) - to_chat(user, "[src] needs to be wrenched to the floor.") - return - . = TRUE - if(!I.tool_use_check(user, 0)) - return - if(state == 1) - WELDER_ATTEMPT_FLOOR_WELD_MESSAGE - else if(state == 2) - WELDER_ATTEMPT_FLOOR_SLICE_MESSAGE - if(!I.use_tool(src, user, 20, volume = I.tool_volume)) - return - if(state == 1) - WELDER_FLOOR_WELD_SUCCESS_MESSAGE - connect_to_network() - state = 2 - else if(state == 2) - WELDER_FLOOR_SLICE_SUCCESS_MESSAGE - disconnect_from_network() - state = 1 +#undef EMITTER_NEEDS_WRENCH +#undef EMITTER_NEEDS_WELDER +#undef EMITTER_WELDED diff --git a/icons/obj/singularity.dmi b/icons/obj/singularity.dmi index 118d0c21896..d56355516ce 100644 Binary files a/icons/obj/singularity.dmi and b/icons/obj/singularity.dmi differ