mirror of
https://github.com/CHOMPStation2/CHOMPStation2.git
synced 2026-06-06 06:43:54 +01:00
ebbb9b36b5
Generalized all ninja power and gear code to work with new rig system. Added shurikens, weapon mount, more work on deployable items. Readded energy nets and energy blades. Grenade launcher/charge stuff, interface stuff. Renamed previously existing rigs to voidsuits, restructured rig and voidsuit files. Refactored the energy net and teleportation proc. Totally rewrote AI core/intellicard transfer procs. Added rig sprites by Mordeth221, added step by steap suit sealing/inability to interfere with suit sealing process. Updated map paths to use voidsuits. Added chemical dispenser functionality, added power sink, added atom/drain_power() proc for later use. Added rigsuit verbs, added voice changer. Renamed MASKINTERNALS to AIRTIGHT, added internals checks for airtight helmets. Added drain_power() procs to vulnerable machinery. Reimplemented data theft. Added suit maluses for losing your cell while wearing one. Transitioned the rig suits to a back-mounted item that also controls a chestpiece. Converted rig module to a storage item, convert ERT voidsuits to hardsuits.
189 lines
4.8 KiB
Plaintext
189 lines
4.8 KiB
Plaintext
// the power cell
|
|
// charge from 0 to 100%
|
|
// fits in APC to provide backup power
|
|
|
|
/obj/item/weapon/cell/New()
|
|
..()
|
|
charge = maxcharge
|
|
|
|
spawn(5)
|
|
updateicon()
|
|
|
|
/obj/item/weapon/cell/drain_power(var/drain_check)
|
|
|
|
if(drain_check)
|
|
return 1
|
|
|
|
var/drained_power = rand(200,400)
|
|
if(charge < drained_power)
|
|
drained_power = charge
|
|
use(drained_power)
|
|
return drained_power
|
|
|
|
/obj/item/weapon/cell/proc/updateicon()
|
|
overlays.Cut()
|
|
|
|
if(charge < 0.01)
|
|
return
|
|
else if(charge/maxcharge >=0.995)
|
|
overlays += image('icons/obj/power.dmi', "cell-o2")
|
|
else
|
|
overlays += image('icons/obj/power.dmi', "cell-o1")
|
|
|
|
/obj/item/weapon/cell/proc/percent() // return % charge of cell
|
|
return 100.0*charge/maxcharge
|
|
|
|
/obj/item/weapon/cell/proc/fully_charged()
|
|
return (charge == maxcharge)
|
|
|
|
// use power from a cell
|
|
/obj/item/weapon/cell/proc/use(var/amount)
|
|
if(rigged && amount > 0)
|
|
explode()
|
|
return 0
|
|
|
|
if(charge < amount) return 0
|
|
charge = (charge - amount)
|
|
return 1
|
|
|
|
// recharge the cell
|
|
/obj/item/weapon/cell/proc/give(var/amount)
|
|
if(rigged && amount > 0)
|
|
explode()
|
|
return 0
|
|
|
|
if(maxcharge < amount) return 0
|
|
var/amount_used = min(maxcharge-charge,amount)
|
|
if(crit_fail) return 0
|
|
if(!prob(reliability))
|
|
minor_fault++
|
|
if(prob(minor_fault))
|
|
crit_fail = 1
|
|
return 0
|
|
charge += amount_used
|
|
return amount_used
|
|
|
|
|
|
/obj/item/weapon/cell/examine(mob/user)
|
|
if(get_dist(src, user) > 1)
|
|
return
|
|
|
|
if(maxcharge <= 2500)
|
|
user << "[desc]\nThe manufacturer's label states this cell has a power rating of [maxcharge], and that you should not swallow it.\nThe charge meter reads [round(src.percent() )]%."
|
|
else
|
|
user << "This power cell has an exciting chrome finish, as it is an uber-capacity cell type! It has a power rating of [maxcharge]!\nThe charge meter reads [round(src.percent() )]%."
|
|
if(crit_fail)
|
|
user << "\red This power cell seems to be faulty."
|
|
|
|
/obj/item/weapon/cell/attackby(obj/item/W, mob/user)
|
|
..()
|
|
if(istype(W, /obj/item/weapon/reagent_containers/syringe))
|
|
var/obj/item/weapon/reagent_containers/syringe/S = W
|
|
|
|
user << "You inject the solution into the power cell."
|
|
|
|
if(S.reagents.has_reagent("phoron", 5))
|
|
|
|
rigged = 1
|
|
|
|
log_admin("LOG: [user.name] ([user.ckey]) injected a power cell with phoron, rigging it to explode.")
|
|
message_admins("LOG: [user.name] ([user.ckey]) injected a power cell with phoron, rigging it to explode.")
|
|
|
|
S.reagents.clear_reagents()
|
|
|
|
|
|
/obj/item/weapon/cell/proc/explode()
|
|
var/turf/T = get_turf(src.loc)
|
|
/*
|
|
* 1000-cell explosion(T, -1, 0, 1, 1)
|
|
* 2500-cell explosion(T, -1, 0, 1, 1)
|
|
* 10000-cell explosion(T, -1, 1, 3, 3)
|
|
* 15000-cell explosion(T, -1, 2, 4, 4)
|
|
* */
|
|
if (charge==0)
|
|
return
|
|
var/devastation_range = -1 //round(charge/11000)
|
|
var/heavy_impact_range = round(sqrt(charge)/60)
|
|
var/light_impact_range = round(sqrt(charge)/30)
|
|
var/flash_range = light_impact_range
|
|
if (light_impact_range==0)
|
|
rigged = 0
|
|
corrupt()
|
|
return
|
|
//explosion(T, 0, 1, 2, 2)
|
|
|
|
log_admin("LOG: Rigged power cell explosion, last touched by [fingerprintslast]")
|
|
message_admins("LOG: Rigged power cell explosion, last touched by [fingerprintslast]")
|
|
|
|
explosion(T, devastation_range, heavy_impact_range, light_impact_range, flash_range)
|
|
|
|
spawn(1)
|
|
del(src)
|
|
|
|
/obj/item/weapon/cell/proc/corrupt()
|
|
charge /= 2
|
|
maxcharge /= 2
|
|
if (prob(10))
|
|
rigged = 1 //broken batterys are dangerous
|
|
|
|
/obj/item/weapon/cell/emp_act(severity)
|
|
charge -= 1000 / severity
|
|
if (charge < 0)
|
|
charge = 0
|
|
if(reliability != 100 && prob(50/severity))
|
|
reliability -= 10 / severity
|
|
..()
|
|
|
|
/obj/item/weapon/cell/ex_act(severity)
|
|
|
|
switch(severity)
|
|
if(1.0)
|
|
del(src)
|
|
return
|
|
if(2.0)
|
|
if (prob(50))
|
|
del(src)
|
|
return
|
|
if (prob(50))
|
|
corrupt()
|
|
if(3.0)
|
|
if (prob(25))
|
|
del(src)
|
|
return
|
|
if (prob(25))
|
|
corrupt()
|
|
return
|
|
|
|
/obj/item/weapon/cell/blob_act()
|
|
if(prob(75))
|
|
explode()
|
|
|
|
/obj/item/weapon/cell/proc/get_electrocute_damage()
|
|
switch (charge)
|
|
/* if (9000 to INFINITY)
|
|
return min(rand(90,150),rand(90,150))
|
|
if (2500 to 9000-1)
|
|
return min(rand(70,145),rand(70,145))
|
|
if (1750 to 2500-1)
|
|
return min(rand(35,110),rand(35,110))
|
|
if (1500 to 1750-1)
|
|
return min(rand(30,100),rand(30,100))
|
|
if (750 to 1500-1)
|
|
return min(rand(25,90),rand(25,90))
|
|
if (250 to 750-1)
|
|
return min(rand(20,80),rand(20,80))
|
|
if (100 to 250-1)
|
|
return min(rand(20,65),rand(20,65))*/
|
|
if (1000000 to INFINITY)
|
|
return min(rand(50,160),rand(50,160))
|
|
if (200000 to 1000000-1)
|
|
return min(rand(25,80),rand(25,80))
|
|
if (100000 to 200000-1)//Ave powernet
|
|
return min(rand(20,60),rand(20,60))
|
|
if (50000 to 100000-1)
|
|
return min(rand(15,40),rand(15,40))
|
|
if (1000 to 50000-1)
|
|
return min(rand(10,20),rand(10,20))
|
|
else
|
|
return 0
|