/*//////////////////////////////////////////////// The Singularity Engine By Mport tbh this could likely be better and I did not use all that many comments on it. However people seem to like it for some reason. *///////////////////////////////////////////////// /////SINGULARITY SPAWNER /obj/machinery/the_singularitygen/ name = "Gravitational Singularity Generator" desc = "An Odd Device which produces a Gravitational Singularity when set up." icon = 'singularity.dmi' icon_state = "TheSingGen" anchored = 1 density = 1 //////////////////////Singularity gen START /obj/machinery/the_singularitygen/New() ..() /obj/machinery/the_singularitygen/process() var/checkpointC = 0 for (var/obj/X in orange(3,src)) if(istype(X, /obj/machinery/containment_field)) checkpointC ++ if(checkpointC >= 20) var/turf/T = src.loc new /obj/machinery/the_singularity/(T, 100) del(src) /obj/machinery/the_singularitygen/attackby(obj/item/W, mob/user) if(istype(W, /obj/item/weapon/wrench)) if(!anchored) anchored = 1 playsound(src.loc, 'Ratchet.ogg', 75, 1) user << "You secure the [src.name] to the floor." src.anchored = 1 return else if(anchored) anchored = 0 playsound(src.loc, 'Ratchet.ogg', 75, 1) user << "You unsecure the [src.name]." src.anchored = 0 return /////SINGULARITY /obj/machinery/the_singularity/ name = "Gravitational Singularity" desc = "A Gravitational Singularity." icon = '160x160.dmi' icon_state = "Singularity" anchored = 1 density = 1 var/active = 0 var/energy = 10 var/Dtime = null var/Wtime = 0 var/dieot = 0 var/selfmove = 1 var/grav_pull = 6 //////////////////////Singularity START /obj/machinery/the_singularity/New(loc, var/E = 100, var/Ti = null) src.energy = E pixel_x = -64 pixel_y = -64 event() if(Ti) src.Dtime = Ti ..() /obj/machinery/the_singularity/process() eat() if(src.Dtime)//If its a temp singularity IE: an event if(Wtime != 0) if((src.Wtime + src.Dtime) <= world.time) src.Wtime = 0 del(src) else src.Wtime = world.time if(dieot) if(energy <= 0)//slowly dies over time del(src) else energy -= 5 if(prob(15))//Chance for it to run a special event event() if(active == 1) move() spawn(5) move() else var/checkpointC = 0 for (var/obj/X in orange(3,src)) if(istype(X, /obj/machinery/containment_field)) checkpointC ++ if(checkpointC < 18) src.active = 1 src.dieot = 1 grav_pull = 8 /obj/machinery/the_singularity/proc/eat() for (var/atom/X in orange(grav_pull,src)) if(istype(X,/obj/machinery/the_singularity)) continue if(istype(X,/obj/machinery/containment_field)) continue if(istype(X,/obj/machinery/field_generator)) var/obj/machinery/field_generator/F = X if(F.active) continue if(istype(X,/turf/space)) continue if(!active) if(isturf(X,/turf/simulated/floor/engine)) continue if(!isarea(X)) switch(get_dist(src,X)) if(2) src.Bumped(X) if(1) src.Bumped(X) if(0) src.Bumped(X) else if(!isturf(X)) if(!X:anchored) step_towards(X,src) /obj/machinery/the_singularity/proc/move() var/direction_go = pick(1,2,4,8) if(locate(/obj/machinery/containment_field) in get_step(src,NORTH)) if(direction_go == 1) icon_state = "Singularity" return if(locate(/obj/machinery/containment_field) in get_step(src,SOUTH)) if(direction_go == 2) icon_state = "Singularity" return if(locate(/obj/machinery/containment_field) in get_step(src,EAST)) if(direction_go == 4) icon_state = "Singularity" return if(locate(/obj/machinery/containment_field) in get_step(src,WEST)) if(direction_go == 8) icon_state = "Singularity" return if(selfmove) spawn(0) icon_state = "Singularity2" step(src, direction_go) /obj/machinery/the_singularity/Bumped(atom/A) var/gain = 0 if(istype(A,/obj/machinery/the_singularity)) return if(istype(A,/obj/machinery/the_singularity))//Dont eat other sings return if (istype(A,/mob/living))//if its a mob gain = 20 if(istype(A,/mob/living/carbon/human)) if(A:mind) if(A:mind:assigned_role == "Station Engineer") gain = 100 A:gib() else if(istype(A,/obj/)) if(istype(A,/obj/machinery/containment_field)) return A:ex_act(1.0) if(A) del(A) gain = 2 else if(isturf(A)) if(isturf(/turf/space)) return if(!active) if(isturf(A,/turf/simulated/floor/engine)) return if(!istype(A,/turf/simulated/floor)&& (!isturf(/turf/space))) A:ReplaceWithFloor() if(istype(A,/turf/simulated/floor) && (!isturf(/turf/space))) A:ReplaceWithSpace() gain = 2 src.energy += gain /////////////////////////////////////////////Controls which "event" is called /obj/machinery/the_singularity/proc/event() var/numb = pick(1,2,3,4,5,6) switch(numb) if(1)//EMP Zzzzap() return if(2)//Eats the turfs around it if(prob(60)) BHolerip() else event() return if(3)//tox damage all carbon mobs in area Toxmob() return if(4)//Stun mobs who lack optic scanners Mezzer() return else return /obj/machinery/the_singularity/proc/Toxmob() for(var/mob/living/carbon/M in orange(7, src)) if(istype(M,/mob/living/carbon/human)) if(M:wear_suit) return M.toxloss += 3 M.radiation += 10 M.updatehealth() M << "\red You feel odd." /obj/machinery/the_singularity/proc/Mezzer() for(var/mob/living/carbon/M in oviewers(8, src)) if(istype(M,/mob/living/carbon/human)) if(istype(M:glasses,/obj/item/clothing/glasses/meson)) M << "\red You look directly into The [src.name], good thing you had your protective eyewear on!" return M << "\red You look directly into The [src.name] and feel weak." if (M:stunned < 3) M.stunned = 3 for(var/mob/O in viewers(M, null)) O.show_message(text("\red [] stares blankly at The []!", M, src), 1) /obj/machinery/the_singularity/proc/BHolerip() for (var/atom/X in orange(6,src)) if(isturf(X)) if(!istype(X,/turf/space)) switch(get_dist(src,X)) if(4 to 5) if(prob(30)) if(istype(X,/turf/simulated/floor) && !istype(X,/turf/simulated/floor/plating)) if(!X:broken) if(prob(80)) new/obj/item/weapon/tile (X) X:break_tile_to_plating() else X:break_tile() else if(istype(X,/turf/simulated/wall)) new /obj/structure/girder/reinforced( X ) new /obj/item/weapon/sheet/r_metal( X ) X:ReplaceWithFloor() else X:ReplaceWithFloor() return /obj/machinery/the_singularity/proc/Zzzzap()///Pulled from wizard spells might edit later var/turf/myturf = get_turf(src) var/obj/overlay/pulse = new/obj/overlay ( myturf ) pulse.icon = 'effects.dmi' pulse.icon_state = "emppulse" pulse.name = "emp pulse" pulse.anchored = 1 spawn(20) del(pulse) for(var/mob/M in viewers(world.view-1, myturf)) if(!istype(M, /mob/living)) continue if(M == usr) continue if (istype(M, /mob/living/silicon)) M.fireloss += 25 flick("noise", M:flash) M << "\red *BZZZT*" M << "\red Warning: Electromagnetic pulse detected." if(istype(M, /mob/living/silicon/ai)) if (prob(30)) switch(pick(1,2)) //Add Random laws. if(1) M:cancel_camera() if(2) M:ai_call_shuttle() //if(3) // M:lockdown() continue M << "\red Your equipment malfunctions." if (locate(/obj/item/weapon/cloaking_device, M)) for(var/obj/item/weapon/cloaking_device/S in M) S.active = 0 S.icon_state = "shield0" /* if (locate(/obj/item/device/disguiser, M)) for(var/obj/item/device/disguiser/S in M) S.disrupt(M) S.on = 0 */ if (locate(/obj/item/weapon/gun/energy, M)) for(var/obj/item/weapon/gun/energy/G in M) G.charges = 0 G.update_icon() if ((istype(M, /mob/living/carbon/human)) && (istype(M:glasses, /obj/item/clothing/glasses/thermal))) M << "\red Your thermals malfunction." M.eye_blind = 3 M.eye_blurry = 5 M.disabilities |= 1 spawn(100) if(M) M.disabilities &= ~1 if (locate(/obj/item/device/radio, M)) for(var/obj/item/device/radio/R in M) //Add something for the intercoms. R.broadcasting = 0 R.listening = 0 if (locate(/obj/item/device/flash, M)) for(var/obj/item/device/flash/F in M) //Add something for the intercoms. F.attack_self() if (locate(/obj/item/weapon/baton, M)) for(var/obj/item/weapon/baton/B in M) //Add something for the intercoms. B.charges = 0 if(locate(/obj/item/clothing/under/chameleon, M)) for(var/obj/item/clothing/under/chameleon/C in M) //Add something for the intercoms. M << "\red Your jumpsuit malfunctions" C.name = "psychedelic" C.desc = "Groovy!" C.icon_state = "psyche" C.color = "psyche" spawn(200) if(C) C.name = "Black Jumpsuit" C.icon_state = "bl_suit" C.color = "black" C.desc = null M << "\red BZZZT" for(var/obj/machinery/A in range(world.view-1, myturf)) A.use_power(7500) var/obj/overlay/pulse2 = new/obj/overlay ( A.loc ) pulse2.icon = 'effects.dmi' pulse2.icon_state = "empdisable" pulse2.name = "emp sparks" pulse2.anchored = 1 pulse2.dir = pick(cardinal) spawn(10) del(pulse2) if(istype(A, /obj/machinery/computer) && prob(20)) A:set_broken() if(istype(A, /obj/machinery/firealarm) && prob(50)) A:alarm() if(istype(A, /obj/machinery/power/smes)) A:online = 0 A:charging = 0 A:output = 0 A:charge -= 1e6 if (A:charge < 0) A:charge = 0 if(istype(A, /obj/machinery/power/apc)) if(A:cell) A:cell:charge -= 1000 if (A:cell:charge < 0) A:cell:charge = 0 A:lighting = 0 A:equipment = 0 A:environ = 0 if(istype(A, /obj/machinery/camera)) A.icon_state = "cameraemp" A:network = null for(var/mob/living/silicon/ai/O in world) if (O.current == A) O.cancel_camera() O << "Your connection to the camera has been lost." if(istype(A, /obj/machinery/clonepod)) A:malfunction() ////////CONTAINMENT FIELD /obj/machinery/containment_field name = "Containment Field" desc = "An energy field." icon = 'singularity.dmi' icon_state = "Contain_F" anchored = 1 density = 0 var/active = 1 var/power = 10 var/delay = 5 var/last_active var/mob/U var/obj/machinery/field_generator/gen_primary var/obj/machinery/field_generator/gen_secondary //////////////Contaiment Field START /obj/machinery/containment_field/New(var/obj/machinery/field_generator/A, var/obj/machinery/field_generator/B) ..() src.gen_primary = A src.gen_secondary = B spawn(1) src.sd_SetLuminosity(5) /obj/machinery/containment_field/attack_hand(mob/user as mob) return /obj/machinery/containment_field/process() if(isnull(gen_primary)||isnull(gen_secondary)) del(src) return if(!(gen_primary.active)||!(gen_secondary.active)) del(src) return if(prob(50)) gen_primary.power -= 1 else gen_secondary.power -= 1 /obj/machinery/containment_field/proc/shock(mob/user as mob) if(isnull(gen_primary)) del(src) return if(isnull(gen_secondary)) del(src) return var/datum/effects/system/spark_spread/s = new /datum/effects/system/spark_spread s.set_up(5, 1, user.loc) s.start() src.power = max(gen_primary.power,gen_secondary.power) var/prot = 1 var/shock_damage = 0 if(src.power > 200) shock_damage = min(rand(40,100),rand(40,100))*prot else if(src.power > 120) shock_damage = min(rand(30,90),rand(30,90))*prot else if(src.power > 80) shock_damage = min(rand(20,40),rand(20,40))*prot else if(src.power > 60) shock_damage = min(rand(20,30),rand(20,30))*prot else shock_damage = min(rand(10,20),rand(10,20))*prot user.burn_skin(shock_damage) user.fireloss += shock_damage user.updatehealth() user << "\red You feel a powerful shock course through your body sending you flying!" //user.unlock_medal("High Voltage", 1) if(user.stunned < shock_damage) user.stunned = shock_damage if(user.weakened < 10*prot) user.weakened = 10*prot var/atom/target = get_edge_target_turf(user, get_dir(src, get_step_away(user, src))) user.throw_at(target, 200, 4) for(var/mob/M in viewers(src)) if(M == user) continue M.show_message("\red [user.name] was shocked by the [src.name]!", 3, "\red You hear a heavy electrical crack", 2) src.gen_primary.power -= 3 src.gen_secondary.power -= 3 return /obj/machinery/containment_field/HasProximity(atom/movable/AM as mob|obj) if(istype(AM,/mob/living/carbon) && prob(50)) shock(AM) return /////EMITTER /obj/machinery/emitter name = "Emitter" desc = "Shoots a high power laser when active" icon = 'singularity.dmi' icon_state = "Emitter" anchored = 0 density = 1 req_access = list(access_engine) var/active = 0 var/power = 20 var/fire_delay = 100 var/HP = 20 var/last_shot = 0 var/shot_number = 0 var/state = 0 var/locked = 0 /obj/machinery/emitter/New() ..() return /obj/machinery/emitter/attack_hand(mob/user as mob) if(state == 3) if(!src.locked) if(src.active==1) src.active = 0 icon_state = "Emitter" user << "You turn off the emitter." else src.active = 1 icon_state = "Emitter +a" user << "You turn on the emitter." src.shot_number = 0 src.fire_delay = 100 else user << "The controls are locked!" else user << "The emitter needs to be firmly secured to the floor first." src.add_fingerprint(user) ..() /obj/machinery/emitter/attack_ai(mob/user as mob) if(state == 3) if(src.active==1) src.active = 0 icon_state = "Emitter" user << "You turn off the emitter." else src.active = 1 icon_state = "Emitter +a" user << "You turn on the emitter." src.shot_number = 0 src.fire_delay = 100 else user << "The emitter needs to be firmly secured to the floor first." src.add_fingerprint(user) /obj/machinery/emitter/process() if(stat & (NOPOWER|BROKEN)) return if(!src.state == 3) src.active = 0 return if(((src.last_shot + src.fire_delay) <= world.time) && (src.active == 1)) src.last_shot = world.time if(src.shot_number < 3) src.fire_delay = 2 src.shot_number ++ else src.fire_delay = rand(20,100) src.shot_number = 0 var/obj/beam/a_laser/A = new /obj/beam/a_laser( src.loc ) A.icon_state = "u_laser" playsound(src.loc, 'Laser.ogg', 75, 1) if(prob(35)) var/datum/effects/system/spark_spread/s = new /datum/effects/system/spark_spread s.set_up(5, 1, src) s.start() if(src.dir == 1)//Up A.yo = 20 A.xo = 0 else if(src.dir == 2)//Down A.yo = -20 A.xo = 0 else if(src.dir == 4)//Right A.yo = 0 A.xo = 20 else if(src.dir == 8)//Left A.yo = 0 A.xo = -20 else // Any other A.yo = -20 A.xo = 0 A.process() ..() /obj/machinery/emitter/attackby(obj/item/W, mob/user) if(istype(W, /obj/item/weapon/wrench)) if(active) user << "Turn off the emitter first." return else if(state == 0) state = 1 playsound(src.loc, 'Ratchet.ogg', 75, 1) user << "You secure the external reinforcing bolts to the floor." src.anchored = 1 return else if(state == 1) state = 0 playsound(src.loc, 'Ratchet.ogg', 75, 1) user << "You undo the external reinforcing bolts." src.anchored = 0 return if(istype(W, /obj/item/weapon/weldingtool) && W:welding) var/turf/T = user.loc if (W:get_fuel() < 1) user << "\blue You need more welding fuel to complete this task." return W:use_fuel(1) if(state == 1) W:eyecheck(user) user << "You start to weld the emitter to the floor." playsound(src.loc, 'Welder2.ogg', 50, 1) sleep(20) if ((user.loc == T && user.equipped() == W)) state = 3 user << "You weld the emitter to the floor." else if((istype(user, /mob/living/silicon/robot) && (user.loc == T))) state = 3 user << "You weld the emitter to the floor." return if(state == 3) user << "You start to cut the emitter free from the floor." playsound(src.loc, 'Welder2.ogg', 50, 1) sleep(20) if ((user.loc == T && user.equipped() == W)) state = 1 /* if(src.link) //Time to clear our link. src.link.master = null src.link = null*/ user << "You cut the emitter free from the floor." else if((istype(user, /mob/living/silicon/robot) && (user.loc == T))) state = 1 /* if(src.link) src.link.master = null src.link = null*/ user << "You cut the emitter free from the floor." return if(istype(W, /obj/item/weapon/card/id)||istype(W, /obj/item/device/pda)) if (src.allowed(user)) src.locked = !src.locked user << "Controls are now [src.locked ? "locked." : "unlocked."]" else user << "\red Access denied." else src.add_fingerprint(user) user << "\red You hit the [src.name] with your [W.name]!" for(var/mob/M in viewers(src)) if(M == user) continue M.show_message("\red The [src.name] has been hit with the [W.name] by [user.name]!") //////////////ARRAY /obj/machinery/power/collector_array name = "Radiation Collector Array" desc = "A device which uses Hawking Radiation and plasma to produce power." icon = 'singularity.dmi' icon_state = "ca" anchored = 1 density = 1 directwired = 1 var/active = 0 var/obj/item/weapon/tank/plasma/P = null var/obj/machinery/power/collector_control/CU = null /////////////ARRAY START /obj/machinery/power/collector_array/New() ..() spawn(5) updateicon() /obj/machinery/power/collector_array/proc/updateicon() if(stat & (NOPOWER|BROKEN)) overlays = null if(P) overlays += image('singularity.dmi', "ptank") else overlays = null overlays += image('singularity.dmi', "on") if(P) overlays += image('singularity.dmi', "ptank") /obj/machinery/power/collector_array/power_change() updateicon() ..() /obj/machinery/power/collector_array/process() if(P) if(P.air_contents.toxins <= 0) src.active = 0 icon_state = "ca_deactive" updateicon() else if(src.active == 1) src.active = 0 icon_state = "ca_deactive" updateicon() ..() /obj/machinery/power/collector_array/attack_hand(mob/user as mob) if(src.anchored == 1) if(src.active==1) src.active = 0 icon_state = "ca_deactive" CU.updatecons() user << "You turn off the collector array." return if(src.active==0) src.active = 1 icon_state = "ca_active" CU.updatecons() user << "You turn on the collector array." return else src.add_fingerprint(user) user << "\red The collector needs to be secured to the floor first." return /obj/machinery/power/collector_array/attackby(obj/item/W, mob/user) if(istype(W, /obj/item/weapon/tank/plasma)) if(src.anchored == 1) if(src.P) user << "\red There appears to already be a plasma tank loaded!" return src.P = W W.loc = src if (user.client) user.client.screen -= W user.u_equip(W) CU.updatecons() updateicon() return else user << "The collector needs to be secured to the floor first." return if(istype(W, /obj/item/weapon/crowbar)) if(!P) return var/obj/item/weapon/tank/plasma/Z = src.P Z.loc = get_turf(src) Z.layer = initial(Z.layer) src.P = null CU.updatecons() updateicon() return if(istype(W, /obj/item/weapon/wrench)) if(active) user << "\red Turn off the collector first." return else if(src.anchored == 0) playsound(src.loc, 'Ratchet.ogg', 75, 1) user << "You secure the collector reinforcing bolts to the floor." src.anchored = 1 return else if(src.anchored == 1) playsound(src.loc, 'Ratchet.ogg', 75, 1) user << "You undo the external reinforcing bolts." src.anchored = 0 return else src.add_fingerprint(user) user << "\red You hit the [src.name] with your [W.name]!" for(var/mob/M in viewers(src)) if(M == user) continue M.show_message("\red The [src.name] has been hit with the [W.name] by [user.name]!") ////////////CONTROL UNIT /obj/machinery/power/collector_control name = "Radiation Collector Control" desc = "A device which uses Hawking Radiation and Plasma to produce power." icon = 'singularity.dmi' icon_state = "cu" anchored = 1 density = 1 directwired = 1 var/active = 0 var/lastpower = 0 var/obj/item/weapon/tank/plasma/P1 = null var/obj/item/weapon/tank/plasma/P2 = null var/obj/item/weapon/tank/plasma/P3 = null var/obj/item/weapon/tank/plasma/P4 = null var/obj/machinery/power/collector_array/CA1 = null var/obj/machinery/power/collector_array/CA2 = null var/obj/machinery/power/collector_array/CA3 = null var/obj/machinery/power/collector_array/CA4 = null var/obj/machinery/power/collector_array/CAN = null var/obj/machinery/power/collector_array/CAS = null var/obj/machinery/power/collector_array/CAE = null var/obj/machinery/power/collector_array/CAW = null var/obj/machinery/the_singularity/S1 = null ////////////CONTROL UNIT START /obj/machinery/power/collector_control/New() ..() spawn(10) updatecons() /obj/machinery/power/collector_control/proc/updatecons() CAN = locate(/obj/machinery/power/collector_array) in get_step(src,NORTH) CAS = locate(/obj/machinery/power/collector_array) in get_step(src,SOUTH) CAE = locate(/obj/machinery/power/collector_array) in get_step(src,EAST) CAW = locate(/obj/machinery/power/collector_array) in get_step(src,WEST) for(var/obj/machinery/the_singularity/S in orange(12,src)) S1 = S if(!isnull(CAN)) CA1 = CAN CAN.CU = src if(CA1.P) P1 = CA1.P else CAN = null if(!isnull(CAS)) CA3 = CAS CAS.CU = src if(CA3.P) P3 = CA3.P else CAS = null if(!isnull(CAW)) CA4 = CAW CAW.CU = src if(CA4.P) P4 = CA4.P else CAW = null if(!isnull(CAE)) CA2 = CAE CAE.CU = src if(CA2.P) P2 = CA2.P else CAE = null if(isnull(S1)) S1 = null updateicon() spawn(600) updatecons() /obj/machinery/power/collector_control/proc/updateicon() if(stat & (NOPOWER|BROKEN)) overlays = null else overlays = null if(src.active == 0) return overlays += image('singularity.dmi', "cu on") if((P1)&&(CA1.active != 0)) overlays += image('singularity.dmi', "cu 1 on") if((P2)&&(CA2.active != 0)) overlays += image('singularity.dmi', "cu 2 on") if((P3)&&(CA3.active != 0)) overlays += image('singularity.dmi', "cu 3 on") if((!P1)||(!P2)||(!P3)) overlays += image('singularity.dmi', "cu n error") if(S1) overlays += image('singularity.dmi', "cu sing") if(!S1.active) overlays += image('singularity.dmi', "cu conterr") /obj/machinery/power/collector_control/power_change() updateicon() ..() /obj/machinery/power/collector_control/process() if(src.active == 1) var/power_a = 0 var/power_s = 0 var/power_p = 0 if(!isnull(S1)) power_s += S1.energy if(!isnull(P1)) if(CA1.active != 0) power_p += P1.air_contents.toxins P1.air_contents.toxins -= 0.001 if(!isnull(P2)) if(CA2.active != 0) power_p += P2.air_contents.toxins P2.air_contents.toxins -= 0.001 if(!isnull(P3)) if(CA3.active != 0) power_p += P3.air_contents.toxins P3.air_contents.toxins -= 0.001 if(!isnull(P4)) if(CA4.active != 0) power_p += P4.air_contents.toxins P4.air_contents.toxins -= 0.001 power_a = power_p*power_s*50 src.lastpower = power_a add_avail(power_a) ..() /obj/machinery/power/collector_control/attack_hand(mob/user as mob) if(src.anchored==1) if(src.active==1) src.active = 0 user << "You turn off the collector control." src.lastpower = 0 updateicon() return if(src.active==0) src.active = 1 user << "You turn on the collector control." updatecons() return else src.add_fingerprint(user) user << "\red The collector control needs to be secured to the floor first." return /obj/machinery/power/collector_control/attackby(obj/item/W, mob/user) if(istype(W, /obj/item/device/analyzer)) user << "\blue The analyzer detects that [lastpower]W are being produced." if(istype(W, /obj/item/weapon/wrench)) if(active) user << "\red Turn off the collector control first." return else if(src.anchored == 0) playsound(src.loc, 'Ratchet.ogg', 75, 1) user << "You secure the collector control to the floor." src.anchored = 1 return else if(src.anchored == 1) playsound(src.loc, 'Ratchet.ogg', 75, 1) user << "You undo the collector control securing bolts." src.anchored = 0 return else src.add_fingerprint(user) user << "\red You hit the [src.name] with your [W.name]!" for(var/mob/M in viewers(src)) if(M == user) continue M.show_message("\red The [src.name] has been hit with the [W.name] by [user.name]!") /////FIELD GEN /obj/machinery/field_generator name = "Field Generator" desc = "Projects an energy field when active" icon = 'singularity.dmi' icon_state = "Field_Gen" anchored = 0 density = 1 req_access = list(access_engine) var/Varedit_start = 0 var/Varpower = 0 var/active = 0 var/power = 20 var/max_power = 250 var/state = 0 var/steps = 0 var/last_check = 0 var/check_delay = 10 var/recalc = 0 var/locked = 0 ////FIELD GEN START /obj/machinery/field_generator/attack_hand(mob/user as mob) if(state == 3) if(!src.locked) if(src.active >= 1) // src.active = 0 // icon_state = "Field_Gen" user << "You are unable to turn off the field generator, wait till it powers down." // src.cleanup() else src.active = 1 icon_state = "Field_Gen +a" user << "You turn on the field generator." else user << "The controls are locked!" else user << "The field generator needs to be firmly secured to the floor first." src.add_fingerprint(user) /obj/machinery/field_generator/attack_ai(mob/user as mob) if(state == 3) if(src.active >= 1) user << "You are unable to turn off the field generator, wait till it powers down." else src.active = 1 icon_state = "Field_Gen +a" user << "You turn on the field generator." else user << "The field generator needs to be firmly secured to the floor first." src.add_fingerprint(user) /obj/machinery/field_generator/New() ..() return /obj/machinery/field_generator/process() if(src.Varedit_start == 1) if(src.active == 0) src.active = 1 src.state = 3 src.power = 250 src.anchored = 1 icon_state = "Field_Gen +a" Varedit_start = 0 if(src.active == 1) if(!src.state == 3) src.active = 0 return spawn(1) setup_field(1) spawn(2) setup_field(2) spawn(3) setup_field(4) spawn(4) setup_field(8) src.active = 2 if(src.power < 0) src.power = 0 if(src.power > src.max_power) src.power = src.max_power if(src.active >= 1) src.power -= 1 if(Varpower == 0) if(src.power <= 0) for(var/mob/M in viewers(src)) M.show_message("\red The [src.name] shuts down due to lack of power!") icon_state = "Field_Gen" src.active = 0 spawn(1) src.cleanup(1) spawn(1) src.cleanup(2) spawn(1) src.cleanup(4) spawn(1) src.cleanup(8) /obj/machinery/field_generator/proc/setup_field(var/NSEW = 0) var/turf/T = src.loc var/turf/T2 = src.loc var/obj/machinery/field_generator/G var/steps = 0 var/oNSEW = 0 if(!NSEW)//Make sure its ran right return if(NSEW == 1) oNSEW = 2 else if(NSEW == 2) oNSEW = 1 else if(NSEW == 4) oNSEW = 8 else if(NSEW == 8) oNSEW = 4 for(var/dist = 0, dist <= 9, dist += 1) // checks out to 8 tiles away for another generator T = get_step(T2, NSEW) T2 = T steps += 1 if(locate(/obj/machinery/field_generator) in T) G = (locate(/obj/machinery/field_generator) in T) steps -= 1 if(!G.active) return G.cleanup(oNSEW) break if(isnull(G)) return T2 = src.loc for(var/dist = 0, dist < steps, dist += 1) // creates each field tile var/field_dir = get_dir(T2,get_step(T2, NSEW)) T = get_step(T2, NSEW) T2 = T var/obj/machinery/containment_field/CF = new/obj/machinery/containment_field/(src, G) //(ref to this gen, ref to connected gen) CF.loc = T CF.dir = field_dir /obj/machinery/field_generator/attackby(obj/item/W, mob/user) if(istype(W, /obj/item/weapon/wrench)) if(active) user << "Turn off the field generator first." return else if(state == 0) state = 1 playsound(src.loc, 'Ratchet.ogg', 75, 1) user << "You secure the external reinforcing bolts to the floor." src.anchored = 1 return else if(state == 1) state = 0 playsound(src.loc, 'Ratchet.ogg', 75, 1) user << "You undo the external reinforcing bolts." src.anchored = 0 return if(istype(W, /obj/item/weapon/weldingtool) && W:welding) var/turf/T = user.loc if (W:get_fuel() < 1) user << "\blue You need more welding fuel to complete this task." return W:use_fuel(1) if(state == 1) user << "You start to weld the field generator to the floor." playsound(src.loc, 'Welder2.ogg', 50, 1) sleep(20) if ((user.loc == T && user.equipped() == W)) state = 3 W:eyecheck(user) user << "You weld the field generator to the floor." else if((istype(user, /mob/living/silicon/robot) && (user.loc == T))) state = 3 user << "You weld the field generator to the floor." return if(state == 3) user << "You start to cut the field generator free from the floor." playsound(src.loc, 'Welder2.ogg', 50, 1) sleep(20) if ((user.loc == T && user.equipped() == W)) state = 1 /* if(src.link) //Clear active link. src.link.master = null src.link = null*/ W:eyecheck(user) user << "You cut the field generator free from the floor." else if((istype(user, /mob/living/silicon/robot) && (user.loc == T))) state = 1 /* if(src.link) //Clear active link. src.link.master = null src.link = null*/ user << "You cut the field generator free from the floor." return if(istype(W, /obj/item/weapon/card/id)||istype(W, /obj/item/device/pda)) if (src.allowed(user)) src.locked = !src.locked user << "Controls are now [src.locked ? "locked." : "unlocked."]" else user << "\red Access denied." else src.add_fingerprint(user) user << "\red You hit the [src.name] with your [W.name]!" for(var/mob/M in viewers(src)) if(M == user) continue M.show_message("\red The [src.name] has been hit with the [W.name] by [user.name]!") /obj/machinery/field_generator/bullet_act(flag) if (flag == PROJECTILE_BULLET) src.power -= 10 /*else if (flag == PROJECTILE_MEDBULLET) src.power -= 5*/ else if (flag == PROJECTILE_WEAKBULLET) src.power -= 1 else if (flag == PROJECTILE_LASER) src.power += 20 else if (flag == PROJECTILE_TASER) src.power += 3 else src.power -= 2 return /obj/machinery/field_generator/proc/cleanup(var/NSEW) var/obj/machinery/containment_field/F var/obj/machinery/field_generator/G var/turf/T = src.loc var/turf/T2 = src.loc for(var/dist = 0, dist <= 9, dist += 1) // checks out to 8 tiles away for fields T = get_step(T2, NSEW) T2 = T if(locate(/obj/machinery/containment_field) in T) F = (locate(/obj/machinery/containment_field) in T) del(F) if(locate(/obj/machinery/field_generator) in T) G = (locate(/obj/machinery/field_generator) in T) if(!G.active) break /obj/machinery/field_generator/Del() src.cleanup(1) src.cleanup(2) src.cleanup(4) src.cleanup(8) ..()