Energy weapons can be reloaded

This commit is contained in:
Anewbe
2016-10-06 21:30:52 -05:00
parent 62b02e8e05
commit 0f51fda83a
22 changed files with 218 additions and 141 deletions
+6
View File
@@ -85,6 +85,8 @@
var/dna_lock = 0 //whether or not the gun is locked to dna
var/obj/item/dnalockingchip/attached_lock
var/last_shot = 0 //records the last shot fired
/obj/item/weapon/gun/New()
..()
for(var/i in 1 to firemodes.len)
@@ -274,6 +276,8 @@
target = targloc
pointblank = 0
last_shot = world.time
// We do this down here, so we don't get the message if we fire an empty gun.
if(requires_two_hands)
if(user.item_is_in_hands(src) && user.hands_are_full())
@@ -322,6 +326,8 @@
P.launch(target)
last_shot = world.time
if(silenced)
playsound(src, fire_sound, 10, 1)
else
+89 -21
View File
@@ -6,8 +6,7 @@
fire_sound_text = "laser blast"
var/obj/item/weapon/cell/power_supply //What type of power cell this uses
var/charge_cost = 200 //How much energy is needed to fire.
var/max_shots = 10 //Determines the capacity of the weapon's power cell. Specifying a cell_type overrides this value.
var/charge_cost = 240 //How much energy is needed to fire.
var/cell_type = null
var/projectile_type = /obj/item/projectile/beam/practice
var/modifystate
@@ -18,6 +17,9 @@
var/use_external_power = 0 //if set, the weapon will look for an external power source to draw from, otherwise it recharges magically
var/recharge_time = 4
var/charge_tick = 0
var/charge_delay = 75 //delay between firing and charging
var/battery_lock = 0 //If set, weapon cannot switch batteries
/obj/item/weapon/gun/energy/attackby(var/obj/item/A as obj, mob/user as mob)
..()
@@ -32,10 +34,7 @@
/obj/item/weapon/gun/energy/New()
..()
if(cell_type)
power_supply = new cell_type(src)
else
power_supply = new /obj/item/weapon/cell/device/variable(src, max_shots*charge_cost)
power_supply = new /obj/item/weapon/cell/device(src)
if(self_recharge)
processing_objects.Add(src)
update_icon()
@@ -46,21 +45,26 @@
..()
/obj/item/weapon/gun/energy/process()
if(self_recharge) //Every [recharge_time] ticks, recharge a shot for the cyborg
charge_tick++
if(charge_tick < recharge_time) return 0
charge_tick = 0
if(self_recharge) //Every [recharge_time] ticks, recharge a shot for the battery
if(world.time > last_shot + charge_delay) //Doesn't work if you've fired recently
if(!power_supply || power_supply.charge >= power_supply.maxcharge)
return 0 // check if we actually need to recharge
if(!power_supply || power_supply.charge >= power_supply.maxcharge)
return 0 // check if we actually need to recharge
charge_tick++
if(charge_tick < recharge_time) return 0
charge_tick = 0
if(use_external_power)
var/obj/item/weapon/cell/external = get_external_power_supply()
if(!external || !external.use(charge_cost)) //Take power from the borg...
return 0
var/rechargeamt = power_supply.maxcharge*0.2
power_supply.give(charge_cost) //... to recharge the shot
update_icon()
if(use_external_power)
var/obj/item/weapon/cell/external = get_external_power_supply()
if(!external || !external.use(rechargeamt)) //Take power from the borg...
return 0
power_supply.give(rechargeamt) //... to recharge 1/5th the battery
update_icon()
else
charge_tick = 0
return 1
/obj/item/weapon/gun/energy/consume_next_projectile()
@@ -69,6 +73,54 @@
if(!power_supply.checked_use(charge_cost)) return null
return new projectile_type(src)
/obj/item/weapon/gun/energy/proc/load_ammo(var/obj/item/C, mob/user)
if(istype(C, /obj/item/weapon/cell))
if(self_recharge || battery_lock)
user << "<span class='notice'>[src] does not have a battery port.</span>"
return
if(istype(C, /obj/item/weapon/cell/device))
var/obj/item/weapon/cell/device/P = C
if(power_supply)
user << "<span class='notice'>[src] already has a power cell.</span>"
else
user.visible_message("[user] is reloading [src].", "<span class='notice'>You start to insert [P] into [src].</span>")
if(do_after(user, 10))
user.remove_from_mob(P)
power_supply = P
P.loc = src
user.visible_message("[user] inserts [P] into [src].", "<span class='notice'>You insert [P] into [src].</span>")
playsound(src.loc, 'sound/weapons/flipblade.ogg', 50, 1)
update_icon()
update_held_icon()
else
user << "<span class='notice'>This cell is not fitted for [src].</span>"
return
/obj/item/weapon/gun/energy/proc/unload_ammo(mob/user)
if(self_recharge || battery_lock)
user << "<span class='notice'>[src] does not have a battery port.</span>"
return
if(power_supply)
user.put_in_hands(power_supply)
power_supply.update_icon()
power_supply = null
user.visible_message("[user] removes [power_supply] from [src].", "<span class='notice'>You remove [power_supply] from [src].</span>")
playsound(src.loc, 'sound/weapons/empty.ogg', 50, 1)
update_icon()
update_held_icon()
else
user << "<span class='notice'>[src] does not have a power cell.</span>"
/obj/item/weapon/gun/energy/attackby(var/obj/item/A as obj, mob/user as mob)
..()
load_ammo(A, user)
/obj/item/weapon/gun/energy/attack_hand(mob/user as mob)
if(user.get_inactive_hand() == src)
unload_ammo(user)
else
return ..()
/obj/item/weapon/gun/energy/proc/get_external_power_supply()
if(isrobot(src.loc))
var/mob/living/silicon/robot/R = src.loc
@@ -85,12 +137,21 @@
/obj/item/weapon/gun/energy/examine(mob/user)
..(user)
var/shots_remaining = round(power_supply.charge / charge_cost)
user << "Has [shots_remaining] shot\s remaining."
if(power_supply)
var/shots_remaining = round(power_supply.charge / charge_cost)
user << "Has [shots_remaining] shot\s remaining."
else
user << "Does not have a power cell."
return
/obj/item/weapon/gun/energy/update_icon(var/ignore_inhands)
if(charge_meter)
if(power_supply == null)
if(modifystate)
icon_state = "[modifystate]_open"
else
icon_state = "[initial(icon_state)]_open"
return
else if(charge_meter)
var/ratio = power_supply.charge / power_supply.maxcharge
//make sure that rounding down will not give us the empty state even if we have charge for a shot left.
@@ -104,3 +165,10 @@
else
icon_state = "[initial(icon_state)][ratio]"
if(!ignore_inhands) update_held_icon()
/obj/item/weapon/gun/energy/proc/start_recharge()
if(power_supply == null)
power_supply = new /obj/item/weapon/cell/device(src)
self_recharge = 1
processing_objects.Add(src)
update_icon()
+13 -12
View File
@@ -15,8 +15,8 @@
one_handed_penalty = 2
firemodes = list(
list(mode_name="normal", projectile_type=/obj/item/projectile/beam/midlaser, charge_cost = 200),
list(mode_name="suppressive", projectile_type=/obj/item/projectile/beam/weaklaser, charge_cost = 50),
list(mode_name="normal", projectile_type=/obj/item/projectile/beam/midlaser, charge_cost = 240),
list(mode_name="suppressive", projectile_type=/obj/item/projectile/beam/weaklaser, charge_cost = 60),
)
/obj/item/weapon/gun/energy/laser/mounted
@@ -30,8 +30,8 @@
projectile_type = /obj/item/projectile/beam/practice
firemodes = list(
list(mode_name="normal", projectile_type=/obj/item/projectile/beam/practice, charge_cost = 200),
list(mode_name="suppressive", projectile_type=/obj/item/projectile/beam/practice, charge_cost = 50),
list(mode_name="normal", projectile_type=/obj/item/projectile/beam/practice, charge_cost = 240),
list(mode_name="suppressive", projectile_type=/obj/item/projectile/beam/practice, charge_cost = 60),
)
obj/item/weapon/gun/energy/retro
@@ -56,8 +56,11 @@ obj/item/weapon/gun/energy/retro
w_class = ITEMSIZE_NORMAL
projectile_type = /obj/item/projectile/beam
origin_tech = null
max_shots = 5 //to compensate a bit for self-recharging
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
/obj/item/weapon/gun/energy/lasercannon
name = "laser cannon"
@@ -69,13 +72,13 @@ obj/item/weapon/gun/energy/retro
origin_tech = list(TECH_COMBAT = 4, TECH_MATERIAL = 3, TECH_POWER = 3)
slot_flags = SLOT_BELT|SLOT_BACK
projectile_type = /obj/item/projectile/beam/heavylaser/cannon
max_shots = 4
battery_lock = 1
fire_delay = 20
w_class = ITEMSIZE_LARGE
// requires_two_hands = 1
one_handed_penalty = 6 // The thing's heavy and huge.
accuracy = 3
charge_cost = 400
charge_cost = 600
/obj/item/weapon/gun/energy/lasercannon/mounted
@@ -87,7 +90,6 @@ obj/item/weapon/gun/energy/retro
requires_two_hands = 0 // Not sure if two-handing gets checked for mounted weapons, but better safe than sorry.
projectile_type = /obj/item/projectile/beam/heavylaser
charge_cost = 400
max_shots = 6
fire_delay = 20
/obj/item/weapon/gun/energy/xray
@@ -99,8 +101,7 @@ obj/item/weapon/gun/energy/retro
fire_sound = 'sound/weapons/eluger.ogg'
origin_tech = list(TECH_COMBAT = 5, TECH_MATERIAL = 3, TECH_MAGNET = 2)
projectile_type = /obj/item/projectile/beam/xray
charge_cost = 100
max_shots = 12
charge_cost = 200
/obj/item/weapon/gun/energy/sniperrifle
name = "marksman energy rifle"
@@ -112,8 +113,8 @@ obj/item/weapon/gun/energy/retro
origin_tech = list(TECH_COMBAT = 6, TECH_MATERIAL = 5, TECH_POWER = 4)
projectile_type = /obj/item/projectile/beam/sniper
slot_flags = SLOT_BACK
charge_cost = 400
max_shots = 4
battery_lock = 1
charge_cost = 600
fire_delay = 35
force = 10
w_class = ITEMSIZE_HUGE // So it can't fit in a backpack.
@@ -4,7 +4,6 @@
icon_state = "energystun100"
item_state = null //so the human update icon uses the icon_state instead.
fire_sound = 'sound/weapons/Taser.ogg'
max_shots = 10
fire_delay = 10 // Handguns should be inferior to two-handed weapons.
projectile_type = /obj/item/projectile/beam/stun
@@ -12,8 +11,8 @@
modifystate = "energystun"
firemodes = list(
list(mode_name="stun", projectile_type=/obj/item/projectile/beam/stun/weak, modifystate="energystun", fire_sound='sound/weapons/Taser.ogg'),
list(mode_name="lethal", projectile_type=/obj/item/projectile/beam, modifystate="energykill", fire_sound='sound/weapons/Laser.ogg'),
list(mode_name="stun", projectile_type=/obj/item/projectile/beam/stun/weak, modifystate="energystun", fire_sound='sound/weapons/Taser.ogg', charge_cost = 240),
list(mode_name="lethal", projectile_type=/obj/item/projectile/beam, modifystate="energykill", fire_sound='sound/weapons/Laser.ogg', charge_cost = 480),
)
/obj/item/weapon/gun/energy/gun/mounted
@@ -28,7 +27,7 @@
icon_state = "fm-2tstun100" //May resprite this to be more rifley
item_state = null //so the human update icon uses the icon_state instead.
fire_sound = 'sound/weapons/Taser.ogg'
max_shots = 18
charge_cost = 100
force = 8
w_class = ITEMSIZE_LARGE //Probably gonna make it a rifle sooner or later
fire_delay = 6
@@ -41,16 +40,16 @@
one_handed_penalty = 2
firemodes = list(
list(mode_name="stun", burst=1, projectile_type=/obj/item/projectile/beam/stun/weak, modifystate="fm-2tstun", fire_sound='sound/weapons/Taser.ogg'),
list(mode_name="stun", burst=1, projectile_type=/obj/item/projectile/beam/stun/weak, modifystate="fm-2tstun", fire_sound='sound/weapons/Taser.ogg', charge_cost = 100),
list(mode_name="stun burst", burst=3, fire_delay=null, move_delay=4, burst_accuracy=list(0,0,0), dispersion=list(0.0, 0.2, 0.5), projectile_type=/obj/item/projectile/beam/stun/weak, modifystate="fm-2tstun", fire_sound='sound/weapons/Taser.ogg'),
list(mode_name="lethal", burst=1, projectile_type=/obj/item/projectile/beam/burstlaser, modifystate="fm-2tkill", fire_sound='sound/weapons/Laser.ogg'),
list(mode_name="lethal", burst=1, projectile_type=/obj/item/projectile/beam/burstlaser, modifystate="fm-2tkill", fire_sound='sound/weapons/Laser.ogg', charge_cost = 200),
list(mode_name="lethal burst", burst=3, fire_delay=null, move_delay=4, burst_accuracy=list(0,0,0), dispersion=list(0.0, 0.2, 0.5), projectile_type=/obj/item/projectile/beam/burstlaser, modifystate="fm-2tkill", fire_sound='sound/weapons/Laser.ogg'),
)
/obj/item/weapon/gun/energy/gun/nuclear
name = "advanced energy gun"
desc = "An energy gun with an experimental miniaturized reactor."
icon_state = "nucgun"
icon_state = "nucgunstun"
origin_tech = list(TECH_COMBAT = 3, TECH_MATERIAL = 5, TECH_POWER = 3)
slot_flags = SLOT_BELT
force = 8 //looks heavier than a pistol
@@ -63,44 +62,6 @@
one_handed_penalty = 1 // It's rather bulky, so holding it in one hand is a little harder than with two, however it's not 'required'.
firemodes = list(
list(mode_name="stun", projectile_type=/obj/item/projectile/beam/stun, fire_sound='sound/weapons/Taser.ogg'),
list(mode_name="lethal", projectile_type=/obj/item/projectile/beam, fire_sound='sound/weapons/Laser.ogg'),
)
var/lightfail = 0
//override for failcheck behaviour
/obj/item/weapon/gun/energy/gun/nuclear/process()
charge_tick++
if(charge_tick < 4) return 0
charge_tick = 0
if(!power_supply) return 0
if((power_supply.charge / power_supply.maxcharge) != 1)
power_supply.give(charge_cost)
update_icon()
return 1
/obj/item/weapon/gun/energy/gun/nuclear/proc/update_charge()
var/ratio = power_supply.charge / power_supply.maxcharge
ratio = round(ratio, 0.25) * 100
overlays += "nucgun-[ratio]"
/obj/item/weapon/gun/energy/gun/nuclear/proc/update_reactor()
if(lightfail)
overlays += "nucgun-medium"
else if ((power_supply.charge/power_supply.maxcharge) <= 0.5)
overlays += "nucgun-light"
else
overlays += "nucgun-clean"
/obj/item/weapon/gun/energy/gun/nuclear/proc/update_mode()
var/datum/firemode/current_mode = firemodes[sel_mode]
switch(current_mode.name)
if("stun") overlays += "nucgun-stun"
if("lethal") overlays += "nucgun-kill"
/obj/item/weapon/gun/energy/gun/nuclear/update_icon()
overlays.Cut()
update_charge()
update_reactor()
update_mode()
list(mode_name="stun", projectile_type=/obj/item/projectile/beam/stun, modifystate="nucgunstun", fire_sound='sound/weapons/Taser.ogg', charge_cost = 240),
list(mode_name="lethal", projectile_type=/obj/item/projectile/beam, modifystate="nucgunkill", fire_sound='sound/weapons/Laser.ogg', charge_cost = 480),
)
+12 -9
View File
@@ -7,14 +7,13 @@
force = 10
fire_sound='sound/weapons/Laser.ogg'
projectile_type = /obj/item/projectile/beam
charge_cost=100
max_shots = 20 // This is cut in half by "DESTROY" mode.
charge_cost = 120
sel_mode = 2
firemodes = list(
list(mode_name="stun", projectile_type=/obj/item/projectile/beam/stun, fire_sound='sound/weapons/Taser.ogg', fire_delay=null, charge_cost=100),
list(mode_name="lethal", projectile_type=/obj/item/projectile/beam, fire_sound='sound/weapons/Laser.ogg', fire_delay=null, charge_cost=100),
list(mode_name="DESTROY", projectile_type=/obj/item/projectile/beam/pulse, fire_sound='sound/weapons/gauss_shoot.ogg', fire_delay=null, charge_cost=200),
list(mode_name="stun", projectile_type=/obj/item/projectile/beam/stun, fire_sound='sound/weapons/Taser.ogg', fire_delay=null, charge_cost = 120),
list(mode_name="lethal", projectile_type=/obj/item/projectile/beam, fire_sound='sound/weapons/Laser.ogg', fire_delay=null, charge_cost = 120),
list(mode_name="DESTROY", projectile_type=/obj/item/projectile/beam/pulse, fire_sound='sound/weapons/gauss_shoot.ogg', fire_delay=null, charge_cost = 240),
)
/obj/item/weapon/gun/energy/pulse_rifle/mounted
@@ -24,11 +23,9 @@
/obj/item/weapon/gun/energy/pulse_rifle/destroyer
name = "pulse destroyer"
desc = "A heavy-duty, pulse-based energy weapon. Because of its complexity and cost, it is rarely seen in use except by specialists."
cell_type = /obj/item/weapon/cell/super
fire_delay = 25
fire_sound='sound/weapons/gauss_shoot.ogg'
projectile_type=/obj/item/projectile/beam/pulse
charge_cost=400
charge_cost = 120
/obj/item/weapon/gun/energy/pulse_rifle/destroyer/attack_self(mob/living/user as mob)
user << "<span class='warning'>[src.name] has three settings, and they are all DESTROY.</span>"
@@ -39,4 +36,10 @@
desc = "It's not the size of the gun, it's the size of the hole it puts through people."
slot_flags = SLOT_BELT|SLOT_HOLSTER
icon_state = "m1911-p"
max_shots = 5
charge_cost = 240
firemodes = list(
list(mode_name="stun", projectile_type=/obj/item/projectile/beam/stun, fire_sound='sound/weapons/Taser.ogg', fire_delay=null, charge_cost = 240),
list(mode_name="lethal", projectile_type=/obj/item/projectile/beam, fire_sound='sound/weapons/Laser.ogg', fire_delay=null, charge_cost = 240),
list(mode_name="DESTROY", projectile_type=/obj/item/projectile/beam/pulse, fire_sound='sound/weapons/gauss_shoot.ogg', fire_delay=null, charge_cost = 480),
)
@@ -9,8 +9,6 @@
force = 10
flags = CONDUCT
slot_flags = SLOT_BACK
charge_cost = 300
max_shots = 10
projectile_type = /obj/item/projectile/ion
/obj/item/weapon/gun/energy/ionrifle/emp_act(severity)
@@ -30,7 +28,6 @@
item_state = "decloner"
fire_sound = 'sound/weapons/pulse3.ogg'
origin_tech = list(TECH_COMBAT = 5, TECH_MATERIAL = 4, TECH_POWER = 3)
max_shots = 10
projectile_type = /obj/item/projectile/energy/declone
/obj/item/weapon/gun/energy/floragun
@@ -39,8 +36,6 @@
icon_state = "floramut100"
item_state = "floramut"
fire_sound = 'sound/effects/stealthoff.ogg'
charge_cost = 100
max_shots = 10
projectile_type = /obj/item/projectile/energy/floramut
origin_tech = list(TECH_MATERIAL = 2, TECH_BIO = 3, TECH_POWER = 3)
modifystate = "floramut"
@@ -68,6 +63,7 @@
w_class = ITEMSIZE_LARGE
projectile_type = /obj/item/projectile/meteor
cell_type = /obj/item/weapon/cell/potato
charge_cost = 100
self_recharge = 1
recharge_time = 5 //Time it takes for shots to recharge (in ticks)
charge_meter = 0
@@ -110,7 +106,7 @@
flags = CONDUCT
slot_flags = SLOT_BACK
w_class = ITEMSIZE_LARGE
max_shots = 5
charge_cost = 480
projectile_type = /obj/item/projectile/change
origin_tech = null
self_recharge = 1
@@ -134,7 +130,7 @@
name = "staff of animation"
desc = "An artefact that spits bolts of life-force which causes objects which are hit by it to animate and come to life! This magic doesn't affect machines."
projectile_type = /obj/item/projectile/animate
max_shots = 10
charge_cost = 240
obj/item/weapon/gun/energy/staff/focus
name = "mental focus"
+3 -4
View File
@@ -4,7 +4,6 @@
icon_state = "taser"
item_state = null //so the human update icon uses the icon_state instead.
fire_sound = 'sound/weapons/Taser.ogg'
max_shots = 10
projectile_type = /obj/item/projectile/beam/stun
/obj/item/weapon/gun/energy/taser/mounted
@@ -14,7 +13,7 @@
/obj/item/weapon/gun/energy/taser/mounted/cyborg
name = "taser gun"
max_shots = 6
charge_cost = 400
recharge_time = 7 //Time it takes for shots to recharge (in ticks)
@@ -26,7 +25,7 @@
fire_sound = 'sound/weapons/Gunshot.ogg'
origin_tech = list(TECH_COMBAT = 3, TECH_MATERIAL = 3, TECH_POWER = 2)
projectile_type = /obj/item/projectile/energy/electrode/strong
max_shots = 8
charge_cost = 300
/obj/item/weapon/gun/energy/crossbow
@@ -41,7 +40,7 @@
silenced = 1
fire_sound = 'sound/weapons/Genhit.ogg'
projectile_type = /obj/item/projectile/energy/bolt
max_shots = 5
charge_cost = 480
self_recharge = 1
charge_meter = 0
@@ -5,7 +5,7 @@
desc = "A gun that changes temperatures. It has a small label on the side, 'More extreme temperatures will cost more charge!'"
var/temperature = T20C
var/current_temperature = T20C
charge_cost = 100
charge_cost = 24
origin_tech = list(TECH_COMBAT = 3, TECH_MATERIAL = 4, TECH_POWER = 3, TECH_MAGNET = 2)
slot_flags = SLOT_BELT|SLOT_BACK