diff --git a/code/modules/mob/living/simple_animal/hostile/pulse_demon/pulsedemon.dm b/code/modules/mob/living/simple_animal/hostile/pulse_demon/pulsedemon.dm
index b530dc1aebd0..7605492dcedc 100644
--- a/code/modules/mob/living/simple_animal/hostile/pulse_demon/pulsedemon.dm
+++ b/code/modules/mob/living/simple_animal/hostile/pulse_demon/pulsedemon.dm
@@ -47,7 +47,7 @@
var/show_desc = FALSE //For the ability menu
var/can_leave_cable = FALSE //For the ability that lets you
var/draining = TRUE //For draining power or not
- var/move_divide = 4 //For slowing down of above
+ var/move_divide = 16 //when unlocked, ability lets you move out of cables with a BIG slowdown
var/powerloss_alerted = FALSE //Prevent spam notifying
var/health_lock = 0 //Goes down every tick, while this is on it prevents the Pulse Demon from regenerating
@@ -430,10 +430,12 @@
// Called in Life() per tick
/mob/living/simple_animal/hostile/pulse_demon/proc/suckBattery(var/obj/machinery/power/battery/current_battery)
- var/amount_to_drain = charge_absorb_amount
- // Cap conditions
+ var/max_can_absorb = current_battery.outputlevel //only raise maxcharge up to the SMES' output level
+ var/amount_to_drain = charge_absorb_amount * 10 //so you don't need to idle for 10 minutes
if(current_battery.charge <= amount_to_drain)
amount_to_drain = current_battery.charge
+ if(maxcharge <= max_can_absorb && charge >= maxcharge)
+ maxcharge = min(maxcharge + amount_to_drain, max_can_absorb)
var/amount_added = min(maxcharge-charge,amount_to_drain)
charge += amount_added
current_battery.charge -= amount_added
@@ -450,8 +452,7 @@
// Cap conditions
if(current_apc.cell.charge <= amount_to_drain)
amount_to_drain = current_apc.cell.charge
- amount_to_drain = min(maxcharge-charge, amount_to_drain)
-// maxcharge += amount_to_drain * PULSEDEMON_APC_CHARGE_MULTIPLIER //multiplier to balance the pitiful powercells in APCs
+ maxcharge += amount_to_drain * PULSEDEMON_APC_CHARGE_MULTIPLIER //multiplier to balance the pitiful powercells in APCs
charge += amount_to_drain * PULSEDEMON_APC_CHARGE_MULTIPLIER
current_apc.cell.use(amount_to_drain)
@@ -477,4 +478,4 @@
// Easy visibility here
CI.plane = ABOVE_LIGHTING_PLANE
cables_shown += CI
- client.images += CI
+ client.images += CI
\ No newline at end of file
diff --git a/code/modules/mob/living/simple_animal/hostile/pulse_demon/pulsedemon_powers.dm b/code/modules/mob/living/simple_animal/hostile/pulse_demon/pulsedemon_powers.dm
index ea9d6d13610f..7b581160a665 100644
--- a/code/modules/mob/living/simple_animal/hostile/pulse_demon/pulsedemon_powers.dm
+++ b/code/modules/mob/living/simple_animal/hostile/pulse_demon/pulsedemon_powers.dm
@@ -27,20 +27,6 @@
host.update_glow()
return TRUE
-/datum/pulse_demon_upgrade/capacity
- ability_name = "Increase Maximum Capacity"
- ability_desc = "Increases the maximum amount of charge you can store. This is necessary for buying further upgrades."
-
-/datum/pulse_demon_upgrade/capacity/update_condition_and_cost()
- condition = host.maxcharge < 10000000
- upgrade_cost = host.maxcharge
-
-/datum/pulse_demon_upgrade/capacity/on_purchase()
- if(..())
- host.maxcharge = min(round(host.maxcharge * 2, 1), 10000000)
- to_chat(host,"You can now store [host.maxcharge]W.")
- update_condition_and_cost()
-
/datum/pulse_demon_upgrade/takeover
ability_name = "Faster takeover time"
ability_desc = "Allows hijacking of electronics in less time."
@@ -356,6 +342,40 @@
/spell/pulse_demon/toggle_drain/generate_tooltip()
var/dat = "
[desc]"
return dat
+
+/spell/pulse_demon/remote_drain
+ name = "Remote Drain"
+ abbreviation = "RD"
+ desc = "Remotely drains a power source"
+
+ range = 10
+ spell_flags = WAIT_FOR_CLICK
+ duration = 20
+ level_max = list(Sp_TOTAL = 2, Sp_POWER = 0, Sp_SPEED = 2)
+
+ hud_state = "pd_drain"
+ charge_cost = 100
+ purchase_cost = 5000
+ empower_cost = 10000
+ quicken_cost = 100000
+
+/spell/pulse_demon/remote_drain/is_valid_target(var/atom/target)
+ if(istype(target, /obj/machinery/power/apc) || istype(target, /obj/machinery/power/battery))
+ return 1
+ else
+ to_chat(holder, "That is not a valid drainable power source.")
+
+/spell/pulse_demon/remote_drain/cast(var/list/targets, mob/user)
+ if(istype(user,/mob/living/simple_animal/hostile/pulse_demon))
+ var/mob/living/simple_animal/hostile/pulse_demon/PD = user
+ var/obj/machinery/power/P = targets[1]
+ if(istype(P,/obj/machinery/power/apc))
+ var/obj/machinery/power/apc/A = P
+ PD.drainAPC(A)
+ else if(istype(P,/obj/machinery/power/battery))
+ var/obj/machinery/power/battery/B = P
+ PD.suckBattery(B)
+ to_chat(user, "You absorb \the [P] for [PD.charge_absorb_amount]W!")
/spell/pulse_demon/cable_zap
name = "Cable Hop"
@@ -365,12 +385,13 @@
range = 5
spell_flags = WAIT_FOR_CLICK
duration = 20
+ level_max = list(Sp_TOTAL = 3, Sp_POWER = 0, Sp_SPEED = 3)
hud_state = "pd_cablehop"
charge_cost = 5000
purchase_cost = 15000
empower_cost = 10000
- quicken_cost = 10000
+ quicken_cost = 75000
// Must be a cable or a clicked on turf with a cable
/spell/pulse_demon/cable_zap/is_valid_target(var/target, mob/user, options)
@@ -415,6 +436,39 @@
spawn L.process()
user.forceMove(target)
..()
+
+/spell/pulse_demon/remote_hijack
+ name = "Remote Hijack"
+ abbreviation = "RH"
+ desc = "Remotely hijacks an APC"
+
+ range = 10
+ spell_flags = WAIT_FOR_CLICK
+ duration = 0 //you need to wait through the APC hack timer so this doesn't need another cooldown
+ level_max = list(Sp_TOTAL = 0)
+
+ hud_state = "pd_hijack"
+ charge_cost = 10000
+ purchase_cost = 15000
+ empower_cost = 20000
+ quicken_cost = 20000
+
+/spell/pulse_demon/remote_hijack/is_valid_target(var/atom/target)
+ if(istype(target, /obj/machinery/power/apc))
+ var/obj/machinery/power/apc/A = target
+ if(!A.pulsecompromised)
+ return 1
+ else
+ to_chat(holder, "This APC is already hijacked.")
+ else
+ to_chat(holder, "That is not an APC.")
+
+/spell/pulse_demon/remote_hijack/cast(var/list/targets, mob/user)
+ if(istype(user,/mob/living/simple_animal/hostile/pulse_demon))
+ var/mob/living/simple_animal/hostile/pulse_demon/PD = user
+ var/obj/machinery/power/apc/A = targets[1]
+ PD.hijackAPC(A)
+
/spell/pulse_demon/emag
name = "Electromagnetic Tamper"
@@ -424,12 +478,13 @@
range = 10
spell_flags = WAIT_FOR_CLICK
duration = 20
+ level_max = list(Sp_TOTAL = 2, Sp_POWER = 0, Sp_SPEED = 2)
hud_state = "pd_emag"
charge_cost = 20000
- purchase_cost = 200000
+ purchase_cost = 50000
empower_cost = 50000
- quicken_cost = 50000
+ quicken_cost = 200000
/spell/pulse_demon/emag/is_valid_target(atom/target, mob/user)
@@ -454,17 +509,18 @@
/spell/pulse_demon/emp
name = "Electromagnetic Pulse"
abbreviation = "EP"
- desc = "EMPs a targeted machine. Must be inside a compromised APC to use."
+ desc = "EMPs a targeted tile. Must be inside a compromised APC to use."
range = 10
spell_flags = WAIT_FOR_CLICK
duration = 20
+ level_max = list(Sp_TOTAL = 2, Sp_POWER = 0, Sp_SPEED = 2)
hud_state = "wiz_tech"
charge_cost = 10000
- purchase_cost = 150000
+ purchase_cost = 50000
empower_cost = 50000
- quicken_cost = 50000
+ quicken_cost = 200000
/spell/pulse_demon/emp/is_valid_target(atom/target, mob/user)
if(istype(user,/mob/living/simple_animal/hostile/pulse_demon))
@@ -484,6 +540,54 @@
to_chat(user, "You EMP \the [target]!")
..()
+
+/spell/pulse_demon/sustaincharge
+ level_max = list(Sp_TOTAL = 2, Sp_SPEED = 0, Sp_POWER = 2) // Why would cooldown be here?
+ charge_max = 0 SECONDS // See?
+ hud_state = "pd_cableleave"
+ name = "Self-Sustaining Charge"
+ abbreviation = "SC"
+ desc = "Toggle that allows leaving cables for brief periods of time, while moving at a slower speed."
+ purchase_cost = 100000
+ empower_cost = 300000
+
+/spell/pulse_demon/sustaincharge/choose_targets(var/mob/user = usr)
+ return list(user) // Self-cast
+
+/spell/pulse_demon/sustaincharge/cast(var/list/targets, mob/user)
+ if(istype(user,/mob/living/simple_animal/hostile/pulse_demon))
+ var/mob/living/simple_animal/hostile/pulse_demon/PD = user
+ if(PD.can_leave_cable)
+ if(!(PD.current_power || PD.current_cable)) //prevent you from killing yourself instantly by turning the ability off
+ to_chat(user,"Find a cable or a piece of power machinery!")
+ return
+ PD.can_leave_cable = !PD.can_leave_cable
+ to_chat(user,"Leaving cables is [PD.can_leave_cable ? "on" : "off"].")
+
+// Custom proc that instead allows less slowdown when off cable, while less than current max speed
+/spell/pulse_demon/sustaincharge/empower_spell()
+ ..()
+ if(istype(usr,/mob/living/simple_animal/hostile/pulse_demon))
+ var/mob/living/simple_animal/hostile/pulse_demon/PD = usr
+
+ var/temp = ""
+ name = initial(name)
+ switch(level_max[Sp_POWER] - spell_levels[Sp_POWER])
+ if(2)
+ temp = "You have improved [name] into Ambulatory [name]."
+ name = "Ambulatory [name]"
+ if(1)
+ temp = "You have improved [name] into Walking [name]."
+ name = "Walking [name]"
+ if(0)
+ temp = "You have improved [name] into Running [name]."
+ name = "Running [name]"
+
+
+ if(PD.move_divide >= 2) //prevent going under 1 incase you upgrade it too much somehow
+ PD.move_divide *= 0.5
+ return temp
+
// Similar to malf one
/spell/pulse_demon/overload_machine
name = "Overload Machine"
@@ -493,12 +597,13 @@
range = 10
spell_flags = WAIT_FOR_CLICK
duration = 20
+ level_max = list(Sp_TOTAL = 1, Sp_POWER = 0, Sp_SPEED = 1)
hud_state = "overload"
charge_cost = 50000
purchase_cost = 300000
empower_cost = 100000
- quicken_cost = 100000
+ quicken_cost = 500000
/spell/pulse_demon/overload_machine/is_valid_target(var/atom/target, mob/user)
if(istype(user,/mob/living/simple_animal/hostile/pulse_demon))
@@ -524,113 +629,4 @@
spawn(50)
explosion(get_turf(M), -1, 1, 2, 3, whodunnit = user) //C4 Radius + 1 Dest for the machine
qdel(M)
- ..()
-
-/spell/pulse_demon/remote_hijack
- name = "Remote Hijack"
- abbreviation = "RH"
- desc = "Remotely hijacks an APC"
-
- range = 10
- spell_flags = WAIT_FOR_CLICK
- duration = 20
-
- hud_state = "pd_hijack"
- charge_cost = 10000
- purchase_cost = 100000
- empower_cost = 20000
- quicken_cost = 20000
-
-/spell/pulse_demon/remote_hijack/is_valid_target(var/atom/target)
- if(istype(target, /obj/machinery/power/apc))
- var/obj/machinery/power/apc/A = target
- if(!A.pulsecompromised)
- return 1
- else
- to_chat(holder, "This APC is already hijacked.")
- else
- to_chat(holder, "That is not an APC.")
-
-/spell/pulse_demon/remote_hijack/cast(var/list/targets, mob/user)
- if(istype(user,/mob/living/simple_animal/hostile/pulse_demon))
- var/mob/living/simple_animal/hostile/pulse_demon/PD = user
- var/obj/machinery/power/apc/A = targets[1]
- PD.hijackAPC(A)
-
-/spell/pulse_demon/remote_drain
- name = "Remote Drain"
- abbreviation = "RD"
- desc = "Remotely drains a power source"
-
- range = 10
- spell_flags = WAIT_FOR_CLICK
- duration = 20
-
- hud_state = "pd_drain"
- charge_cost = 10000
- purchase_cost = 50000
- empower_cost = 10000
- quicken_cost = 10000
-
-/spell/pulse_demon/remote_drain/is_valid_target(var/atom/target)
- if(istype(target, /obj/machinery/power/apc) || istype(target, /obj/machinery/power/battery))
- return 1
- else
- to_chat(holder, "That is not a valid drainable power source.")
-
-/spell/pulse_demon/remote_drain/cast(var/list/targets, mob/user)
- if(istype(user,/mob/living/simple_animal/hostile/pulse_demon))
- var/mob/living/simple_animal/hostile/pulse_demon/PD = user
- var/obj/machinery/power/P = targets[1]
- if(istype(P,/obj/machinery/power/apc))
- var/obj/machinery/power/apc/A = P
- PD.drainAPC(A)
- else if(istype(P,/obj/machinery/power/battery))
- var/obj/machinery/power/battery/B = P
- PD.suckBattery(B)
- to_chat(user, "You absorb \the [P] for [PD.charge_absorb_amount]W!")
-
-/spell/pulse_demon/sustaincharge
- level_max = list(Sp_TOTAL = 3, Sp_POWER = 3) // Why would cooldown be here?
- charge_max = 1 SECONDS // See?
- hud_state = "pd_cableleave"
- name = "Self-Sustaining Charge"
- abbreviation = "SC"
- desc = "Toggle that allows leaving cables for brief periods of time, while moving at a slower speed."
- purchase_cost = 500000
- empower_cost = 200000
-
-/spell/pulse_demon/sustaincharge/choose_targets(var/mob/user = usr)
- return list(user) // Self-cast
-
-/spell/pulse_demon/sustaincharge/cast(var/list/targets, mob/user)
- if(istype(user,/mob/living/simple_animal/hostile/pulse_demon))
- var/mob/living/simple_animal/hostile/pulse_demon/PD = user
- PD.can_leave_cable = !PD.can_leave_cable
- to_chat(user,"Leaving cables is [PD.can_leave_cable ? "on" : "off"].")
-
-// Custom proc that instead allows less slowdown when off cable, while less than current max speed
-/spell/pulse_demon/sustaincharge/empower_spell()
- if(!can_improve(Sp_POWER))
- return 0
- if(istype(usr,/mob/living/simple_animal/hostile/pulse_demon))
- var/mob/living/simple_animal/hostile/pulse_demon/PD = usr
- spell_levels[Sp_POWER]++
-
- var/temp = ""
- name = initial(name)
- switch(level_max[Sp_POWER] - spell_levels[Sp_POWER])
- if(2)
- temp = "You have improved [name] into Ambulatory [name]."
- name = "Ambulatory [name]"
- if(1)
- temp = "You have improved [name] into Walking [name]."
- name = "Walking [name]"
- if(0)
- temp = "You have improved [name] into Running [name]."
- name = "Running [name]"
-
-
- if(PD.move_divide > 1)
- PD.move_divide *= 0.75
- return temp
+ ..()
\ No newline at end of file