mirror of
https://github.com/PolarisSS13/Polaris.git
synced 2025-12-25 01:22:24 +00:00
Changes layout of the AI core, see picture in PR. Moves APCs for core and upload to the backs of the rooms. Critical APCs can somewhat resist EMP now. Gives turrets a ten second timeout until they go underneath the turret covers, unless turned off manually or if they lose power. Adds a new type of turret specifically for the AI upload/core. This type has more health, has a 1/3 chance to ignore EMP, and fires xray lasers, to counter ablative armor. A new material called Durasteel has been added. It is made from Plasteel and diamonds, and boasts more toughness than Plasteel alone, as well as reflectivity. The inner walls of the AI core are made out of this new material, which makes emitters less helpful. Emitters can be damaged by projectiles, and will explode if too much damage is sustained. Shooting a Durasteel wall will likely cause you to lose the emitter. New AI core turrets turn green when on lethal, to show that xray is coming.
235 lines
7.9 KiB
Plaintext
235 lines
7.9 KiB
Plaintext
#define EMITTER_DAMAGE_POWER_TRANSFER 450 //used to transfer power to containment field generators
|
|
|
|
/obj/machinery/power/emitter
|
|
name = "emitter"
|
|
desc = "It is a heavy duty industrial laser."
|
|
icon = 'icons/obj/singularity.dmi'
|
|
icon_state = "emitter"
|
|
anchored = 0
|
|
density = 1
|
|
req_access = list(access_engine_equip)
|
|
var/id = null
|
|
|
|
use_power = 0 //uses powernet power, not APC power
|
|
active_power_usage = 30000 //30 kW laser. I guess that means 30 kJ per shot.
|
|
|
|
var/active = 0
|
|
var/powered = 0
|
|
var/fire_delay = 100
|
|
var/max_burst_delay = 100
|
|
var/min_burst_delay = 20
|
|
var/burst_shots = 3
|
|
var/last_shot = 0
|
|
var/shot_number = 0
|
|
var/state = 0
|
|
var/locked = 0
|
|
|
|
var/integrity = 80
|
|
|
|
|
|
/obj/machinery/power/emitter/verb/rotate()
|
|
set name = "Rotate"
|
|
set category = "Object"
|
|
set src in oview(1)
|
|
|
|
if (src.anchored || usr:stat)
|
|
usr << "It is fastened to the floor!"
|
|
return 0
|
|
src.set_dir(turn(src.dir, 90))
|
|
return 1
|
|
|
|
/obj/machinery/power/emitter/initialize()
|
|
..()
|
|
if(state == 2 && anchored)
|
|
connect_to_network()
|
|
|
|
/obj/machinery/power/emitter/Destroy()
|
|
message_admins("Emitter deleted at ([x],[y],[z] - <A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[x];Y=[y];Z=[z]'>JMP</a>)",0,1)
|
|
log_game("Emitter deleted at ([x],[y],[z])")
|
|
investigate_log("<font color='red'>deleted</font> at ([x],[y],[z])","singulo")
|
|
..()
|
|
|
|
/obj/machinery/power/emitter/update_icon()
|
|
if (active && powernet && avail(active_power_usage))
|
|
icon_state = "emitter_+a"
|
|
else
|
|
icon_state = "emitter"
|
|
|
|
/obj/machinery/power/emitter/attack_hand(mob/user as mob)
|
|
src.add_fingerprint(user)
|
|
activate(user)
|
|
|
|
/obj/machinery/power/emitter/proc/activate(mob/user as mob)
|
|
if(state == 2)
|
|
if(!powernet)
|
|
user << "\The [src] isn't connected to a wire."
|
|
return 1
|
|
if(!src.locked)
|
|
if(src.active==1)
|
|
src.active = 0
|
|
user << "You turn off [src]."
|
|
message_admins("Emitter turned off by [key_name(user, user.client)](<A HREF='?_src_=holder;adminmoreinfo=\ref[user]'>?</A>) in ([x],[y],[z] - <A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[x];Y=[y];Z=[z]'>JMP</a>)",0,1)
|
|
log_game("Emitter turned off by [user.ckey]([user]) in ([x],[y],[z])")
|
|
investigate_log("turned <font color='red'>off</font> by [user.key]","singulo")
|
|
else
|
|
src.active = 1
|
|
user << "You turn on [src]."
|
|
src.shot_number = 0
|
|
src.fire_delay = 100
|
|
message_admins("Emitter turned on by [key_name(user, user.client)](<A HREF='?_src_=holder;adminmoreinfo=\ref[user]'>?</A>) in ([x],[y],[z] - <A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[x];Y=[y];Z=[z]'>JMP</a>)",0,1)
|
|
log_game("Emitter turned on by [user.ckey]([user]) in ([x],[y],[z])")
|
|
investigate_log("turned <font color='green'>on</font> by [user.key]","singulo")
|
|
update_icon()
|
|
else
|
|
user << "<span class='warning'>The controls are locked!</span>"
|
|
else
|
|
user << "<span class='warning'>\The [src] needs to be firmly secured to the floor first.</span>"
|
|
return 1
|
|
|
|
|
|
/obj/machinery/power/emitter/emp_act(var/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 = 1 */
|
|
return 1
|
|
|
|
/obj/machinery/power/emitter/process()
|
|
if(stat & (BROKEN))
|
|
return
|
|
if(src.state != 2 || (!powernet && active_power_usage))
|
|
src.active = 0
|
|
update_icon()
|
|
return
|
|
if(((src.last_shot + src.fire_delay) <= world.time) && (src.active == 1))
|
|
|
|
var/actual_load = draw_power(active_power_usage)
|
|
if(actual_load >= active_power_usage) //does the laser have enough power to shoot?
|
|
if(!powered)
|
|
powered = 1
|
|
update_icon()
|
|
investigate_log("regained power and turned <font color='green'>on</font>","singulo")
|
|
else
|
|
if(powered)
|
|
powered = 0
|
|
update_icon()
|
|
investigate_log("lost power and turned <font color='red'>off</font>","singulo")
|
|
return
|
|
|
|
src.last_shot = world.time
|
|
if(src.shot_number < burst_shots)
|
|
src.fire_delay = 2
|
|
src.shot_number ++
|
|
else
|
|
src.fire_delay = rand(min_burst_delay, max_burst_delay)
|
|
src.shot_number = 0
|
|
|
|
//need to calculate the power per shot as the emitter doesn't fire continuously.
|
|
var/burst_time = (min_burst_delay + max_burst_delay)/2 + 2*(burst_shots-1)
|
|
var/power_per_shot = active_power_usage * (burst_time/10) / burst_shots
|
|
|
|
playsound(src.loc, 'sound/weapons/emitter.ogg', 25, 1)
|
|
if(prob(35))
|
|
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
|
|
s.set_up(5, 1, src)
|
|
s.start()
|
|
|
|
var/obj/item/projectile/beam/emitter/A = new /obj/item/projectile/beam/emitter( src.loc )
|
|
A.damage = round(power_per_shot/EMITTER_DAMAGE_POWER_TRANSFER)
|
|
A.launch( get_step(src.loc, src.dir) )
|
|
|
|
/obj/machinery/power/emitter/attackby(obj/item/W, mob/user)
|
|
|
|
if(istype(W, /obj/item/weapon/wrench))
|
|
if(active)
|
|
user << "Turn off [src] first."
|
|
return
|
|
switch(state)
|
|
if(0)
|
|
state = 1
|
|
playsound(src.loc, 'sound/items/Ratchet.ogg', 75, 1)
|
|
user.visible_message("[user.name] secures [src] 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, 'sound/items/Ratchet.ogg', 75, 1)
|
|
user.visible_message("[user.name] unsecures [src] reinforcing bolts from the floor.", \
|
|
"You undo the external reinforcing bolts.", \
|
|
"You hear a ratchet")
|
|
src.anchored = 0
|
|
if(2)
|
|
user << "<span class='warning'>\The [src] needs to be unwelded from the floor.</span>"
|
|
return
|
|
|
|
if(istype(W, /obj/item/weapon/weldingtool))
|
|
var/obj/item/weapon/weldingtool/WT = W
|
|
if(active)
|
|
user << "Turn off [src] first."
|
|
return
|
|
switch(state)
|
|
if(0)
|
|
user << "<span class='warning'>\The [src] needs to be wrenched to the floor.</span>"
|
|
if(1)
|
|
if (WT.remove_fuel(0,user))
|
|
playsound(src.loc, 'sound/items/Welder2.ogg', 50, 1)
|
|
user.visible_message("[user.name] starts to weld [src] to the floor.", \
|
|
"You start to weld [src] to the floor.", \
|
|
"You hear welding")
|
|
if (do_after(user,20))
|
|
if(!src || !WT.isOn()) return
|
|
state = 2
|
|
user << "You weld [src] to the floor."
|
|
connect_to_network()
|
|
else
|
|
user << "<span class='warning'>You need more welding fuel to complete this task.</span>"
|
|
if(2)
|
|
if (WT.remove_fuel(0,user))
|
|
playsound(src.loc, 'sound/items/Welder2.ogg', 50, 1)
|
|
user.visible_message("[user.name] starts to cut [src] free from the floor.", \
|
|
"You start to cut [src] free from the floor.", \
|
|
"You hear welding")
|
|
if (do_after(user,20))
|
|
if(!src || !WT.isOn()) return
|
|
state = 1
|
|
user << "You cut [src] free from the floor."
|
|
disconnect_from_network()
|
|
else
|
|
user << "<span class='warning'>You need more welding fuel to complete this task.</span>"
|
|
return
|
|
|
|
if(istype(W, /obj/item/weapon/card/id) || istype(W, /obj/item/device/pda))
|
|
if(emagged)
|
|
user << "<span class='warning'>The lock seems to be broken.</span>"
|
|
return
|
|
if(src.allowed(user))
|
|
if(active)
|
|
src.locked = !src.locked
|
|
user << "The controls are now [src.locked ? "locked." : "unlocked."]"
|
|
else
|
|
src.locked = 0 //just in case it somehow gets locked
|
|
user << "<span class='warning'>The controls can only be locked when [src] is online.</span>"
|
|
else
|
|
user << "<span class='warning'>Access denied.</span>"
|
|
return
|
|
..()
|
|
return
|
|
|
|
/obj/machinery/power/emitter/emag_act(var/remaining_charges, var/mob/user)
|
|
if(!emagged)
|
|
locked = 0
|
|
emagged = 1
|
|
user.visible_message("[user.name] emags [src].","<span class='warning'>You short out the lock.</span>")
|
|
return 1
|
|
|
|
/obj/machinery/power/emitter/bullet_act(var/obj/item/projectile/P)
|
|
if(!P || !P.damage || (!P.damage_type == BRUTE || !P.damage_type == BURN) )
|
|
return
|
|
|
|
integrity = integrity - P.damage
|
|
if(integrity >= 0)
|
|
explosion(get_turf(src), 1, 2, 4)
|
|
qdel(src)
|