diff --git a/code/modules/power/cell.dm b/code/modules/power/cell.dm
index 2c1699c5f6..7a8c7c541f 100644
--- a/code/modules/power/cell.dm
+++ b/code/modules/power/cell.dm
@@ -2,6 +2,28 @@
// charge from 0 to 100%
// fits in APC to provide backup power
+/obj/item/weapon/cell
+ name = "power cell"
+ desc = "A rechargable electrochemical power cell."
+ icon = 'icons/obj/power.dmi'
+ icon_state = "cell"
+ item_state = "cell"
+ origin_tech = list(TECH_POWER = 1)
+ force = 5.0
+ throwforce = 5.0
+ throw_speed = 3
+ throw_range = 5
+ w_class = ITEMSIZE_NORMAL
+ var/charge = 0 // note %age conveted to actual charge in New
+ var/maxcharge = 1000
+ var/rigged = 0 // true if rigged to explode
+ var/minor_fault = 0 //If not 100% reliable, it will build up faults.
+ var/self_recharge = FALSE // If true, the cell will recharge itself.
+ var/charge_amount = 25 // How much power to give, if self_recharge is true. The number is in absolute cell charge, as it gets divided by CELLRATE later.
+ var/last_use = 0 // A tracker for use in self-charging
+ var/charge_delay = 0 // How long it takes for the cell to start recharging after last use
+ matter = list(DEFAULT_WALL_MATERIAL = 700, "glass" = 50)
+
/obj/item/weapon/cell/New()
..()
charge = maxcharge
@@ -16,7 +38,8 @@
/obj/item/weapon/cell/process()
if(self_recharge)
- give(charge_amount)
+ if(world.time >= last_use + charge_delay)
+ give(charge_amount)
else
return PROCESS_KILL
@@ -59,6 +82,7 @@
return 0
var/used = min(charge, amount)
charge -= used
+ last_use = world.time
update_icon()
return used
@@ -80,6 +104,8 @@
var/amount_used = min(maxcharge-charge,amount)
charge += amount_used
update_icon()
+ if(loc)
+ loc.update_icon()
return amount_used
@@ -112,7 +138,6 @@
S.reagents.clear_reagents()
-
/obj/item/weapon/cell/proc/explode()
var/turf/T = get_turf(src.loc)
/*
@@ -207,3 +232,7 @@
return min(rand(10,20),rand(10,20))
else
return 0
+
+/obj/item/weapon/cell/suicide_act(mob/user)
+ viewers(user) << "\The [user] is licking the electrodes of \the [src]! It looks like \he's trying to commit suicide."
+ return (FIRELOSS)
\ No newline at end of file
diff --git a/code/modules/power/cells/device_cells.dm b/code/modules/power/cells/device_cells.dm
new file mode 100644
index 0000000000..b6b185519e
--- /dev/null
+++ b/code/modules/power/cells/device_cells.dm
@@ -0,0 +1,33 @@
+//currently only used by energy-type guns, that may change in the future.
+/obj/item/weapon/cell/device
+ name = "device power cell"
+ desc = "A small power cell designed to power handheld devices."
+ icon_state = "dcell"
+ item_state = "egg6"
+ w_class = ITEMSIZE_SMALL
+ force = 0
+ throw_speed = 5
+ throw_range = 7
+ maxcharge = 480
+ charge_amount = 5
+ matter = list("metal" = 350, "glass" = 50)
+ preserve_item = 1
+
+/obj/item/weapon/cell/device/weapon
+ name = "weapon power cell"
+ desc = "A small power cell designed to power handheld weaponry."
+ icon_state = "wcell"
+ maxcharge = 2400
+ charge_amount = 20
+
+/obj/item/weapon/cell/device/weapon/recharge
+ name = "self-charging weapon power cell"
+ desc = "A small power cell designed to power handheld weaponry. This one recharges itself."
+// icon_state = "wcell" //TODO: Different sprite
+ self_recharge = TRUE
+ charge_amount = 120
+ charge_delay = 75
+
+/obj/item/weapon/cell/device/weapon/recharge/captain
+ charge_amount = 160 //Recharges a lot more quickly...
+ charge_delay = 100 //... but it takes a while to get started
\ No newline at end of file
diff --git a/code/game/objects/items/weapons/power_cells.dm b/code/modules/power/cells/power_cells.dm
similarity index 59%
rename from code/game/objects/items/weapons/power_cells.dm
rename to code/modules/power/cells/power_cells.dm
index 2b63fb79bd..a9b92a9bb3 100644
--- a/code/game/objects/items/weapons/power_cells.dm
+++ b/code/modules/power/cells/power_cells.dm
@@ -1,137 +1,93 @@
-/obj/item/weapon/cell
- name = "power cell"
- desc = "A rechargable electrochemical power cell."
- icon = 'icons/obj/power.dmi'
- icon_state = "cell"
- item_state = "cell"
- origin_tech = list(TECH_POWER = 1)
- force = 5.0
- throwforce = 5.0
- throw_speed = 3
- throw_range = 5
- w_class = ITEMSIZE_NORMAL
- var/charge = 0 // note %age conveted to actual charge in New
- var/maxcharge = 1000
- var/rigged = 0 // true if rigged to explode
- var/minor_fault = 0 //If not 100% reliable, it will build up faults.
- var/self_recharge = FALSE // If true, the cell will recharge itself.
- var/charge_amount = 25 // How much power to give, if self_recharge is true. The number is in absolute cell charge, as it gets divided by CELLRATE later.
- matter = list(DEFAULT_WALL_MATERIAL = 700, "glass" = 50)
-
- suicide_act(mob/user)
- viewers(user) << "\The [user] is licking the electrodes of \the [src]! It looks like \he's trying to commit suicide."
- return (FIRELOSS)
-
-//currently only used by energy-type guns, that may change in the future.
-/obj/item/weapon/cell/device
- name = "device power cell"
- desc = "A small power cell designed to power handheld devices."
- icon_state = "dcell"
- item_state = "egg6"
- w_class = ITEMSIZE_SMALL
- force = 0
- throw_speed = 5
- throw_range = 7
- maxcharge = 480
- matter = list("metal" = 350, "glass" = 50)
- preserve_item = 1
-
-/obj/item/weapon/cell/device/weapon
- name = "weapon power cell"
- desc = "A small power cell designed to power handheld weaponry."
- icon_state = "wcell"
- maxcharge = 2400
-
-/obj/item/weapon/cell/crap
- name = "\improper rechargable AA battery"
- desc = "You can't top the plasma top." //TOTALLY TRADEMARK INFRINGEMENT
- origin_tech = list(TECH_POWER = 0)
- maxcharge = 500
- matter = list(DEFAULT_WALL_MATERIAL = 700, "glass" = 40)
-
-/obj/item/weapon/cell/crap/empty/New()
- ..()
- charge = 0
-
-/obj/item/weapon/cell/secborg
- name = "security borg rechargable D battery"
- origin_tech = list(TECH_POWER = 0)
- maxcharge = 600 //600 max charge / 100 charge per shot = six shots
- matter = list(DEFAULT_WALL_MATERIAL = 700, "glass" = 40)
-
-/obj/item/weapon/cell/secborg/empty/New()
- ..()
- charge = 0
-
-/obj/item/weapon/cell/apc
- name = "heavy-duty power cell"
- origin_tech = list(TECH_POWER = 1)
- maxcharge = 5000
- matter = list(DEFAULT_WALL_MATERIAL = 700, "glass" = 50)
-
-/obj/item/weapon/cell/high
- name = "high-capacity power cell"
- origin_tech = list(TECH_POWER = 2)
- icon_state = "hcell"
- maxcharge = 10000
- matter = list(DEFAULT_WALL_MATERIAL = 700, "glass" = 60)
-
-/obj/item/weapon/cell/high/empty/New()
- ..()
- charge = 0
-
-/obj/item/weapon/cell/super
- name = "super-capacity power cell"
- origin_tech = list(TECH_POWER = 5)
- icon_state = "scell"
- maxcharge = 20000
- matter = list(DEFAULT_WALL_MATERIAL = 700, "glass" = 70)
-
-/obj/item/weapon/cell/super/empty/New()
- ..()
- charge = 0
-
-/obj/item/weapon/cell/hyper
- name = "hyper-capacity power cell"
- origin_tech = list(TECH_POWER = 6)
- icon_state = "hpcell"
- maxcharge = 30000
- matter = list(DEFAULT_WALL_MATERIAL = 700, "glass" = 80)
-
-/obj/item/weapon/cell/hyper/empty/New()
- ..()
- charge = 0
-
-/obj/item/weapon/cell/infinite
- name = "infinite-capacity power cell!"
- icon_state = "icell"
- origin_tech = null
- maxcharge = 30000 //determines how badly mobs get shocked
- matter = list(DEFAULT_WALL_MATERIAL = 700, "glass" = 80)
-
- check_charge()
- return 1
- use()
- return 1
-
-/obj/item/weapon/cell/potato
- name = "potato battery"
- desc = "A rechargable starch based power cell."
- origin_tech = list(TECH_POWER = 1)
- icon = 'icons/obj/power.dmi' //'icons/obj/harvest.dmi'
- icon_state = "potato_cell" //"potato_battery"
- charge = 100
- maxcharge = 300
- minor_fault = 1
-
-
-/obj/item/weapon/cell/slime
- name = "charged slime core"
- desc = "A yellow slime core infused with phoron, it crackles with power."
- origin_tech = list(TECH_POWER = 4, TECH_BIO = 5)
- icon = 'icons/mob/slimes.dmi' //'icons/obj/harvest.dmi'
- icon_state = "yellow slime extract" //"potato_battery"
- description_info = "This 'cell' holds a max charge of 10k and self recharges over time."
- maxcharge = 10000
- matter = null
- self_recharge = TRUE
+/obj/item/weapon/cell/crap
+ name = "\improper rechargable AA battery"
+ desc = "You can't top the plasma top." //TOTALLY TRADEMARK INFRINGEMENT
+ origin_tech = list(TECH_POWER = 0)
+ maxcharge = 500
+ matter = list(DEFAULT_WALL_MATERIAL = 700, "glass" = 40)
+
+/obj/item/weapon/cell/crap/empty/New()
+ ..()
+ charge = 0
+
+/obj/item/weapon/cell/secborg
+ name = "security borg rechargable D battery"
+ origin_tech = list(TECH_POWER = 0)
+ maxcharge = 600 //600 max charge / 100 charge per shot = six shots
+ matter = list(DEFAULT_WALL_MATERIAL = 700, "glass" = 40)
+
+/obj/item/weapon/cell/secborg/empty/New()
+ ..()
+ charge = 0
+
+/obj/item/weapon/cell/apc
+ name = "heavy-duty power cell"
+ origin_tech = list(TECH_POWER = 1)
+ maxcharge = 5000
+ matter = list(DEFAULT_WALL_MATERIAL = 700, "glass" = 50)
+
+/obj/item/weapon/cell/high
+ name = "high-capacity power cell"
+ origin_tech = list(TECH_POWER = 2)
+ icon_state = "hcell"
+ maxcharge = 10000
+ matter = list(DEFAULT_WALL_MATERIAL = 700, "glass" = 60)
+
+/obj/item/weapon/cell/high/empty/New()
+ ..()
+ charge = 0
+
+/obj/item/weapon/cell/super
+ name = "super-capacity power cell"
+ origin_tech = list(TECH_POWER = 5)
+ icon_state = "scell"
+ maxcharge = 20000
+ matter = list(DEFAULT_WALL_MATERIAL = 700, "glass" = 70)
+
+/obj/item/weapon/cell/super/empty/New()
+ ..()
+ charge = 0
+
+/obj/item/weapon/cell/hyper
+ name = "hyper-capacity power cell"
+ origin_tech = list(TECH_POWER = 6)
+ icon_state = "hpcell"
+ maxcharge = 30000
+ matter = list(DEFAULT_WALL_MATERIAL = 700, "glass" = 80)
+
+/obj/item/weapon/cell/hyper/empty/New()
+ ..()
+ charge = 0
+
+/obj/item/weapon/cell/infinite
+ name = "infinite-capacity power cell!"
+ icon_state = "icell"
+ origin_tech = null
+ maxcharge = 30000 //determines how badly mobs get shocked
+ matter = list(DEFAULT_WALL_MATERIAL = 700, "glass" = 80)
+
+/obj/item/weapon/cell/infinite/check_charge()
+ return 1
+
+/obj/item/weapon/cell/infinite/use()
+ return 1
+
+/obj/item/weapon/cell/potato
+ name = "potato battery"
+ desc = "A rechargable starch based power cell."
+ origin_tech = list(TECH_POWER = 1)
+ icon = 'icons/obj/power.dmi' //'icons/obj/harvest.dmi'
+ icon_state = "potato_cell" //"potato_battery"
+ charge = 100
+ maxcharge = 300
+ minor_fault = 1
+
+/obj/item/weapon/cell/slime
+ name = "charged slime core"
+ desc = "A yellow slime core infused with phoron, it crackles with power."
+ origin_tech = list(TECH_POWER = 4, TECH_BIO = 5)
+ icon = 'icons/mob/slimes.dmi' //'icons/obj/harvest.dmi'
+ icon_state = "yellow slime extract" //"potato_battery"
+ description_info = "This 'cell' holds a max charge of 10k and self recharges over time."
+ maxcharge = 10000
+ matter = null
+ self_recharge = TRUE
diff --git a/code/modules/projectiles/guns/energy.dm b/code/modules/projectiles/guns/energy.dm
index 0bdf518a2c..6a3eeaa853 100644
--- a/code/modules/projectiles/guns/energy.dm
+++ b/code/modules/projectiles/guns/energy.dm
@@ -34,12 +34,15 @@
/obj/item/weapon/gun/energy/New()
..()
- if(cell_type)
- power_supply = new cell_type(src)
- else
- power_supply = new /obj/item/weapon/cell/device/weapon(src)
if(self_recharge)
+ power_supply = new /obj/item/weapon/cell/device/weapon(src)
processing_objects.Add(src)
+ else
+ if(cell_type)
+ power_supply = new cell_type(src)
+ else
+ power_supply = new /obj/item/weapon/cell/device/weapon(src)
+
update_icon()
/obj/item/weapon/gun/energy/Destroy()
diff --git a/code/modules/projectiles/guns/energy/laser.dm b/code/modules/projectiles/guns/energy/laser.dm
index cb93992acc..2276d7e10c 100644
--- a/code/modules/projectiles/guns/energy/laser.dm
+++ b/code/modules/projectiles/guns/energy/laser.dm
@@ -65,9 +65,8 @@
origin_tech = null
fire_delay = 10 //Old pistol
charge_cost = 480 //to compensate a bit for self-recharging
- self_recharge = 1
- recharge_time = 3 //Recharges a bit more quickly...
- charge_delay = 100 //... but it takes a while to get started
+ cell_type = /obj/item/weapon/cell/device/weapon/recharge/captain
+ battery_lock = 1
/obj/item/weapon/gun/energy/lasercannon
name = "laser cannon"
@@ -87,7 +86,6 @@
accuracy = 3
charge_cost = 600
-
/obj/item/weapon/gun/energy/lasercannon/mounted
name = "mounted laser cannon"
self_recharge = 1
@@ -145,10 +143,11 @@
item_state = "laser"
desc = "Standard issue weapon of the Imperial Guard"
origin_tech = list(TECH_COMBAT = 1, TECH_MAGNET = 2)
- self_recharge = 1
matter = list(DEFAULT_WALL_MATERIAL = 2000)
fire_sound = 'sound/weapons/Laser.ogg'
projectile_type = /obj/item/projectile/beam/lastertag/blue
+ cell_type = /obj/item/weapon/cell/device/weapon/recharge
+ battery_lock = 1
var/required_vest
/obj/item/weapon/gun/energy/lasertag/special_check(var/mob/living/carbon/human/M)
diff --git a/code/modules/projectiles/guns/energy/nuclear.dm b/code/modules/projectiles/guns/energy/nuclear.dm
index e7dd400f59..048dddfe3f 100644
--- a/code/modules/projectiles/guns/energy/nuclear.dm
+++ b/code/modules/projectiles/guns/energy/nuclear.dm
@@ -56,7 +56,8 @@
force = 8 //looks heavier than a pistol
w_class = ITEMSIZE_LARGE //Looks bigger than a pistol, too.
fire_delay = 6 //This one's not a handgun, it should have the same fire delay as everything else
- self_recharge = 1
+ cell_type = /obj/item/weapon/cell/device/weapon/recharge
+ battery_lock = 1
modifystate = null
// requires_two_hands = 1
diff --git a/code/modules/projectiles/guns/energy/special.dm b/code/modules/projectiles/guns/energy/special.dm
index d613f1f206..18a25e5daf 100644
--- a/code/modules/projectiles/guns/energy/special.dm
+++ b/code/modules/projectiles/guns/energy/special.dm
@@ -43,7 +43,8 @@
projectile_type = /obj/item/projectile/energy/floramut
origin_tech = list(TECH_MATERIAL = 2, TECH_BIO = 3, TECH_POWER = 3)
modifystate = "floramut"
- self_recharge = 1
+ cell_type = /obj/item/weapon/cell/device/weapon/recharge
+ battery_lock = 1
var/decl/plantgene/gene = null
firemodes = list(
@@ -137,7 +138,8 @@
charge_cost = 480
projectile_type = /obj/item/projectile/change
origin_tech = null
- self_recharge = 1
+ cell_type = /obj/item/weapon/cell/device/weapon/recharge
+ battery_lock = 1
charge_meter = 0
/obj/item/weapon/gun/energy/staff/special_check(var/mob/user)
@@ -188,7 +190,8 @@ obj/item/weapon/gun/energy/staff/focus
w_class = ITEMSIZE_HUGE
charge_cost = 24 // 100 shots, it's a spray and pray (to RNGesus) weapon.
projectile_type = /obj/item/projectile/energy/blue_pellet
- self_recharge = 1
+ cell_type = /obj/item/weapon/cell/device/weapon/recharge
+ battery_lock = 1
accuracy = 5 // Suppressive weapons don't work too well if there's no risk of being hit.
burst_delay = 1 // Burst faster than average.
origin_tech = list(TECH_COMBAT = 6, TECH_MAGNET = 6, TECH_ILLEGAL = 6)
diff --git a/code/modules/projectiles/guns/energy/stun.dm b/code/modules/projectiles/guns/energy/stun.dm
index c8bba19087..43bb9e1637 100644
--- a/code/modules/projectiles/guns/energy/stun.dm
+++ b/code/modules/projectiles/guns/energy/stun.dm
@@ -41,7 +41,8 @@
fire_sound = 'sound/weapons/Genhit.ogg'
projectile_type = /obj/item/projectile/energy/bolt
charge_cost = 480
- self_recharge = 1
+ cell_type = /obj/item/weapon/cell/device/weapon/recharge
+ battery_lock = 1
charge_meter = 0
/obj/item/weapon/gun/energy/crossbow/ninja
diff --git a/code/modules/projectiles/guns/vox.dm b/code/modules/projectiles/guns/vox.dm
index c0d3956b7d..ecc8a1a904 100644
--- a/code/modules/projectiles/guns/vox.dm
+++ b/code/modules/projectiles/guns/vox.dm
@@ -60,7 +60,8 @@
w_class = ITEMSIZE_HUGE
charge_cost = 300
projectile_type = /obj/item/projectile/beam/stun/darkmatter
- self_recharge = 1
+ cell_type = /obj/item/weapon/cell/device/weapon/recharge
+ battery_lock = 1
accuracy = 2
firemodes = list(
@@ -118,7 +119,8 @@
item_state = "noise"
fire_sound = 'sound/effects/basscannon.ogg'
w_class = ITEMSIZE_HUGE
- self_recharge = 1
+ cell_type = /obj/item/weapon/cell/device/weapon/recharge
+ battery_lock = 1
charge_cost = 600
projectile_type=/obj/item/projectile/sonic/weak
diff --git a/polaris.dme b/polaris.dme
index e50395a1e4..2b05f089ec 100644
--- a/polaris.dme
+++ b/polaris.dme
@@ -889,7 +889,6 @@
#include "code\game\objects\items\weapons\paint.dm"
#include "code\game\objects\items\weapons\paiwire.dm"
#include "code\game\objects\items\weapons\policetape.dm"
-#include "code\game\objects\items\weapons\power_cells.dm"
#include "code\game\objects\items\weapons\RCD.dm"
#include "code\game\objects\items\weapons\RSF.dm"
#include "code\game\objects\items\weapons\scrolls.dm"
@@ -1965,6 +1964,8 @@
#include "code\modules\power\antimatter\containment_jar.dm"
#include "code\modules\power\antimatter\control.dm"
#include "code\modules\power\antimatter\shielding.dm"
+#include "code\modules\power\cells\device_cells.dm"
+#include "code\modules\power\cells\power_cells.dm"
#include "code\modules\power\fusion\_setup.dm"
#include "code\modules\power\fusion\fusion_circuits.dm"
#include "code\modules\power\fusion\fusion_particle_catcher.dm"