Files
Bubberstation/code/modules/ninja/suit/ninjaDrainAct.dm
phil235 d3ee910211 Makes effect system code more OOP.
obj/effect/effect is now renamed obj/effect/particle_effect for better usability.
datum/effect/system and /datum/effect/effect/system are now both /datum/effect_system.
Fixes a bug where wall mounted igniters (and other spark producing objects) didn't produce sparks sometimes.
Moved explosion_particles.dm into the effect_system folder, because it has effect_systems code.
2015-10-21 23:28:29 +02:00

286 lines
8.6 KiB
Plaintext

/*
Contents:
- Assorted ninjadrain_act() procs
- What is Object Oriented Programming
They *could* go in their appropriate files, but this is supposed to be modular
*/
//Needs to return the amount drained from the atom, if no drain on a power object, return 0, otherwise, return a define.
/atom/proc/ninjadrain_act()
return INVALID_DRAIN
//APC//
/obj/machinery/power/apc/ninjadrain_act(obj/item/clothing/suit/space/space_ninja/S, mob/living/carbon/human/H, obj/item/clothing/gloves/space_ninja/G)
if(!S || !H || !G)
return INVALID_DRAIN
var/maxcapacity = 0 //Safety check for batteries
var/drain = 0 //Drain amount from batteries
. = 0
if(cell && cell.charge)
var/datum/effect_system/spark_spread/spark_system = new /datum/effect_system/spark_spread()
spark_system.set_up(5, 0, loc)
while(G.candrain && cell.charge> 0 && !maxcapacity)
drain = rand(G.mindrain, G.maxdrain)
if(cell.charge < drain)
drain = cell.charge
if(S.cell.charge + drain > S.cell.maxcharge)
drain = S.cell.maxcharge - S.cell.charge
maxcapacity = 1//Reached maximum battery capacity.
if (do_after(H,10, target = src))
spark_system.start()
playsound(loc, "sparks", 50, 1)
cell.charge -= drain
S.cell.charge += drain
. += drain
else
break
if(!emagged)
flick("apc-spark", G)
emagged = 1
locked = 0
update_icon()
//SMES//
/obj/machinery/power/smes/ninjadrain_act(obj/item/clothing/suit/space/space_ninja/S, mob/living/carbon/human/H, obj/item/clothing/gloves/space_ninja/G)
if(!S || !H || !G)
return INVALID_DRAIN
var/maxcapacity = 0 //Safety check for batteries
var/drain = 0 //Drain amount from batteries
. = 0
if(charge)
var/datum/effect_system/spark_spread/spark_system = new /datum/effect_system/spark_spread()
spark_system.set_up(5, 0, loc)
while(G.candrain && charge > 0 && !maxcapacity)
drain = rand(G.mindrain, G.maxdrain)
if(charge < drain)
drain = charge
if(S.cell.charge + drain > S.cell.maxcharge)
drain = S.cell.maxcharge - S.cell.charge
maxcapacity = 1
if (do_after(H,10, target = src))
spark_system.start()
playsound(loc, "sparks", 50, 1)
charge -= drain
S.cell.charge += drain
. += drain
else
break
//CELL//
/obj/item/weapon/stock_parts/cell/ninjadrain_act(obj/item/clothing/suit/space/space_ninja/S, mob/living/carbon/human/H, obj/item/clothing/gloves/space_ninja/G)
if(!S || !H || !G)
return INVALID_DRAIN
. = 0
if(charge)
if(G.candrain && do_after(H,30, target = src))
. = charge
if(S.cell.charge + charge > S.cell.maxcharge)
S.cell.charge = S.cell.maxcharge
else
S.cell.charge += charge
charge = 0
corrupt()
updateicon()
//RDCONSOLE//
/obj/machinery/computer/rdconsole/ninjadrain_act(obj/item/clothing/suit/space/space_ninja/S, mob/living/carbon/human/H, obj/item/clothing/gloves/space_ninja/G)
if(!S || !H || !G)
return INVALID_DRAIN
. = DRAIN_RD_HACK_FAILED
H << "<span class='notice'>Hacking \the [src]...</span>"
spawn(0)
var/turf/location = get_turf(H)
for(var/mob/living/silicon/ai/AI in player_list)
AI << "<span class='userdanger'>Network Alert: Hacking attempt detected[location?" in [location]":". Unable to pinpoint location"]</span>."
if(files && files.known_tech.len)
for(var/datum/tech/current_data in S.stored_research)
H << "<span class='notice'>Checking \the [current_data.name] database.</span>"
if(do_after(H, S.s_delay, target = src) && G.candrain && src)
for(var/datum/tech/analyzing_data in files.known_tech)
if(current_data.id == analyzing_data.id)
if(analyzing_data.level > current_data.level)
H << "<span class='notice'>Database:</span> <b>UPDATED</b>."
current_data.level = analyzing_data.level
. = DRAIN_RD_HACKED
break//Move on to next.
else
break//Otherwise, quit processing.
H << "<span class='notice'>Data analyzed. Process finished.</span>"
//RD SERVER//
//Shamelessly copypasted from above, since these two used to be the same proc, but with MANY colon operators
/obj/machinery/r_n_d/server/ninjadrain_act(obj/item/clothing/suit/space/space_ninja/S, mob/living/carbon/human/H, obj/item/clothing/gloves/space_ninja/G)
if(!S || !H || !G)
return INVALID_DRAIN
. = DRAIN_RD_HACK_FAILED
H << "<span class='notice'>Hacking \the [src]...</span>"
spawn(0)
var/turf/location = get_turf(H)
for(var/mob/living/silicon/ai/AI in player_list)
AI << "<span class='userdanger'>Network Alert: Hacking attempt detected[location?" in [location]":". Unable to pinpoint location"]</span>."
if(files && files.known_tech.len)
for(var/datum/tech/current_data in S.stored_research)
H << "<span class='notice'>Checking \the [current_data.name] database.</span>"
if(do_after(H, S.s_delay, target = src) && G.candrain && src)
for(var/datum/tech/analyzing_data in files.known_tech)
if(current_data.id == analyzing_data.id)
if(analyzing_data.level > current_data.level)
H << "<span class='notice'>Database:</span> <b>UPDATED</b>."
current_data.level = analyzing_data.level
. = DRAIN_RD_HACKED
break//Move on to next.
else
break//Otherwise, quit processing.
H << "<span class='notice'>Data analyzed. Process finished.</span>"
//WIRE//
/obj/structure/cable/ninjadrain_act(obj/item/clothing/suit/space/space_ninja/S, mob/living/carbon/human/H, obj/item/clothing/gloves/space_ninja/G)
if(!S || !H || !G)
return INVALID_DRAIN
var/maxcapacity = 0 //Safety check
var/drain = 0 //Drain amount
. = 0
var/datum/powernet/PN = powernet
while(G.candrain && !maxcapacity && src)
drain = (round((rand(G.mindrain, G.maxdrain))/2))
var/drained = 0
if(PN && do_after(H,10, target = src))
drained = min(drain, PN.avail)
PN.load += drained
if(drained < drain)//if no power on net, drain apcs
for(var/obj/machinery/power/terminal/T in PN.nodes)
if(istype(T.master, /obj/machinery/power/apc))
var/obj/machinery/power/apc/AP = T.master
if(AP.operating && AP.cell && AP.cell.charge > 0)
AP.cell.charge = max(0, AP.cell.charge - 5)
drained += 5
else
break
S.cell.charge += drained
if(S.cell.charge > S.cell.maxcharge)
. += (drained-(S.cell.charge - S.cell.maxcharge))
S.cell.charge = S.cell.maxcharge
maxcapacity = 1
else
. += drained
S.spark_system.start()
//MECH//
/obj/mecha/ninjadrain_act(obj/item/clothing/suit/space/space_ninja/S, mob/living/carbon/human/H, obj/item/clothing/gloves/space_ninja/G)
if(!S || !H || !G)
return INVALID_DRAIN
var/maxcapacity = 0 //Safety check
var/drain = 0 //Drain amount
. = 0
occupant_message("<span class='danger'>Warning: Unauthorized access through sub-route 4, block H, detected.</span>")
if(get_charge())
while(G.candrain && cell.charge > 0 && !maxcapacity)
drain = rand(G.mindrain,G.maxdrain)
if(cell.charge < drain)
drain = cell.charge
if(S.cell.charge + drain > S.cell.maxcharge)
drain = S.cell.maxcharge - S.cell.charge
maxcapacity = 1
if (do_after(H,10, target = src))
spark_system.start()
playsound(loc, "sparks", 50, 1)
cell.use(drain)
S.cell.charge += drain
. += drain
else
break
//BORG//
/mob/living/silicon/robot/ninjadrain_act(obj/item/clothing/suit/space/space_ninja/S, mob/living/carbon/human/H, obj/item/clothing/gloves/space_ninja/G)
if(!S || !H || !G)
return INVALID_DRAIN
var/maxcapacity = 0 //Safety check
var/drain = 0 //Drain amount
. = 0
src << "<span class='danger'>Warning: Unauthorized access through sub-route 12, block C, detected.</span>"
if(cell && cell.charge)
while(G.candrain && cell.charge > 0 && !maxcapacity)
drain = rand(G.mindrain,G.maxdrain)
if(cell.charge < drain)
drain = cell.charge
if(S.cell.charge+drain > S.cell.maxcharge)
drain = S.cell.maxcharge - S.cell.charge
maxcapacity = 1
if (do_after(H,10))
spark_system.start()
playsound(loc, "sparks", 50, 1)
cell.charge -= drain
S.cell.charge += drain
. += drain
else
break
//CARBON MOBS//
/mob/living/carbon/ninjadrain_act(obj/item/clothing/suit/space/space_ninja/S, mob/living/carbon/human/H, obj/item/clothing/gloves/space_ninja/G)
if(!S || !H || !G)
return INVALID_DRAIN
. = DRAIN_MOB_SHOCK_FAILED
//Default cell = 10,000 charge, 10,000/1000 = 10 uses without charging/upgrading
if(S.cell && S.cell.charge && S.cell.use(1000))
. = DRAIN_MOB_SHOCK
//Got that electric touch
var/datum/effect_system/spark_spread/spark_system = new /datum/effect_system/spark_spread()
spark_system.set_up(5, 0, loc)
playsound(src, "sparks", 50, 1)
visible_message("<span class='danger'>[H] electrocutes [src] with their touch!</span>", "<span class='userdanger'>[H] electrocutes you with their touch!</span>")
electrocute_act(25, H)