From a0a73d1ab57a3a10729e6c862c17e2aab56ecf5f Mon Sep 17 00:00:00 2001 From: sirbayer Date: Mon, 30 Dec 2013 16:30:36 -0800 Subject: [PATCH 1/8] Jesus Christ it compiles --- code/game/machinery/portable_turret.dm | 3 +- code/modules/projectiles/ammunition.dm | 59 +++++++++- code/modules/projectiles/ammunition/energy.dm | 100 +++++++++++++++++ .../projectiles/ammunition/magazines.dm | 5 +- .../modules/projectiles/ammunition/special.dm | 25 +++++ code/modules/projectiles/gun.dm | 57 +++++----- code/modules/projectiles/guns/energy.dm | 103 ++++++++++++------ code/modules/projectiles/guns/energy/laser.dm | 28 ++--- .../projectiles/guns/energy/nuclear.dm | 33 ++---- code/modules/projectiles/guns/energy/pulse.dm | 34 +----- .../projectiles/guns/energy/special.dm | 36 ++---- code/modules/projectiles/guns/energy/stun.dm | 23 ++-- .../projectiles/guns/energy/temperature.dm | 81 +------------- code/modules/projectiles/guns/magic.dm | 18 +-- code/modules/projectiles/guns/magic/staff.dm | 6 +- code/modules/projectiles/guns/magic/wand.dm | 16 +-- code/modules/projectiles/guns/projectile.dm | 27 ++--- .../projectiles/guns/projectile/revolver.dm | 44 +++----- .../projectiles/guns/projectile/shotgun.dm | 20 +--- code/modules/projectiles/projectile.dm | 1 - .../modules/projectiles/projectile/special.dm | 6 +- code/modules/reagents/syringe_gun.dm | 24 ++-- maps/RandomZLevels/stationCollision.dm | 2 +- tgstation.dme | 2 + 24 files changed, 391 insertions(+), 362 deletions(-) create mode 100644 code/modules/projectiles/ammunition/energy.dm create mode 100644 code/modules/projectiles/ammunition/special.dm diff --git a/code/game/machinery/portable_turret.dm b/code/game/machinery/portable_turret.dm index 806335e0e15..cdb2e607b63 100644 --- a/code/game/machinery/portable_turret.dm +++ b/code/game/machinery/portable_turret.dm @@ -67,7 +67,8 @@ sound = 1 else var/obj/item/weapon/gun/energy/E=new installation //All energy-based weapons are applicable - projectile = E.projectile_type + var/obj/item/ammo_casing/shottype = E.ammo_type[1] + projectile = shottype.projectile_type eprojectile = projectile switch(E.type) diff --git a/code/modules/projectiles/ammunition.dm b/code/modules/projectiles/ammunition.dm index 3108698b378..50677fd6e5b 100644 --- a/code/modules/projectiles/ammunition.dm +++ b/code/modules/projectiles/ammunition.dm @@ -26,6 +26,52 @@ icon_state = "[initial(icon_state)][BB ? "-live" : ""]" desc = "[initial(desc)][BB ? "" : " This one is spent"]" +/obj/item/ammo_casing/proc/ready_proj(mob/living/user, var/quiet) + if (!BB) + return + BB.firer = user + BB.def_zone = user.zone_sel.selecting + BB.silenced = quiet + return + +/obj/item/ammo_casing/proc/fire(atom/target as mob|obj|turf, mob/living/user as mob|obj, params) + var/turf/curloc = user.loc + var/turf/targloc = get_turf(target) + if (!istype(targloc) || !istype(curloc) || !BB) + return 0 + if(targloc == curloc) //Fire the projectile + user.bullet_act(BB) + del(BB) + update_icon() + return 1 + BB.original = target + BB.loc = get_turf(user) + BB.starting = get_turf(user) + BB.current = curloc + BB.yo = targloc.y - curloc.y + BB.xo = targloc.x - curloc.x + user.next_move = world.time + 4 + + if(params) + var/list/mouse_control = params2list(params) + if(mouse_control["icon-x"]) + BB.p_x = text2num(mouse_control["icon-x"]) + if(mouse_control["icon-y"]) + BB.p_y = text2num(mouse_control["icon-y"]) + + spawn() + if(BB) + BB.process() + sleep(1) + BB = null + update_icon() + return 1 + +/obj/item/ammo_casing/proc/newshot() //Mostly for energy weapons and shotgun shells. + if (!BB) + BB = new projectile_type(src) + return + //Boxes of ammo @@ -47,6 +93,7 @@ var/max_ammo = 7 var/multiple_sprites = 0 var/caliber + var/multiload = 1 /obj/item/ammo_box/New() @@ -73,15 +120,16 @@ return 1 return 0 -/obj/item/ammo_box/attackby(var/obj/item/A as obj, mob/user as mob) +/obj/item/ammo_box/attackby(var/obj/item/A as obj, mob/user as mob, var/silent = 0) var/num_loaded = 0 if(istype(A, /obj/item/ammo_box)) var/obj/item/ammo_box/AM = A for(var/obj/item/ammo_casing/AC in AM.stored_ammo) - if(give_round(AC)) + var/did_load = give_round(AC) + if(did_load) AM.stored_ammo -= AC num_loaded++ - else + if(!did_load || !multiload) break if(istype(A, /obj/item/ammo_casing)) var/obj/item/ammo_casing/AC = A @@ -90,9 +138,12 @@ AC.loc = src num_loaded++ if(num_loaded) - user << "You load [num_loaded] shell\s into \the [src]!" + if (!silent) + user << "You load [num_loaded] shell\s into \the [src]!" A.update_icon() update_icon() + return num_loaded + return 0 /obj/item/ammo_box/update_icon() switch(multiple_sprites) diff --git a/code/modules/projectiles/ammunition/energy.dm b/code/modules/projectiles/ammunition/energy.dm new file mode 100644 index 00000000000..15955719e33 --- /dev/null +++ b/code/modules/projectiles/ammunition/energy.dm @@ -0,0 +1,100 @@ +/obj/item/ammo_casing/energy + name = "energy weapon lens" + desc = "The part of the gun that makes the laser go pew" + caliber = "energy" + projectile_type = /obj/item/projectile/energy + var/e_cost = 100 //The amount of energy a cell needs to expend to create this shot. + var/select_name = "energy" + var/mod_name = null + var/fire_sound = 'sound/weapons/Laser.ogg' + +/obj/item/ammo_casing/energy/laser + projectile_type = /obj/item/projectile/beam + select_name = "kill" + +/obj/item/ammo_casing/energy/laser/practice + projectile_type = /obj/item/projectile/practice + select_name = "practice" + +/obj/item/ammo_casing/energy/laser/heavy + projectile_type = /obj/item/projectile/beam/heavylaser + select_name = "anti-vehicle" + fire_sound = 'sound/weapons/lasercannonfire.ogg' + +/obj/item/ammo_casing/energy/laser/pulse + projectile_type = /obj/item/projectile/beam/pulse + e_cost = 200 + select_name = "DESTROY" + fire_sound = 'sound/weapons/pulse.ogg' + +/obj/item/ammo_casing/energy/laser/bluetag + projectile_type = /obj/item/projectile/bluetag + select_name = "bluetag" + +/obj/item/ammo_casing/energy/laser/redtag + projectile_type = /obj/item/projectile/redtag + select_name = "redtag" + +/obj/item/ammo_casing/energy/bolt + projectile_type = /obj/item/projectile/energy/bolt + select_name = "bolt" + fire_sound = 'sound/weapons/Genhit.ogg' + +/obj/item/ammo_casing/energy/bolt/large + projectile_type = /obj/item/projectile/energy/bolt/large + select_name = "heavy bolt" + +/obj/item/ammo_casing/energy/xray + projectile_type = /obj/item/projectile/beam/xray + e_cost = 50 + fire_sound = 'sound/weapons/laser3.ogg' + +/obj/item/ammo_casing/energy/electrode + projectile_type = /obj/item/projectile/energy/electrode + select_name = "stun" + fire_sound = 'sound/weapons/taser.ogg' + +/obj/item/ammo_casing/energy/electrode/gun + fire_sound = 'sound/weapons/gunshot.ogg' + +/obj/item/ammo_casing/energy/ion + projectile_type = /obj/item/projectile/ion + select_name = "ion" + fire_sound = 'sound/weapons/Laser.ogg' + +/obj/item/ammo_casing/energy/declone + projectile_type = /obj/item/projectile/energy/declone + select_name = "declone" + fire_sound = 'sound/weapons/pulse3.ogg' + +/obj/item/ammo_casing/energy/mindflayer + projectile_type = /obj/item/projectile/beam/mindflayer + select_name = "MINDFUCK" + fire_sound = 'sound/weapons/Laser.ogg' + +/obj/item/ammo_casing/energy/flora + fire_sound = 'sound/effects/stealthoff.ogg' + +/obj/item/ammo_casing/energy/flora/yield + projectile_type = /obj/item/projectile/energy/florayield + select_name = "increase yield" + mod_name = "yield" + +/obj/item/ammo_casing/energy/flora/mut + projectile_type = /obj/item/projectile/energy/floramut + select_name = "induce mutations" + mod_name = "mut" + +/obj/item/ammo_casing/energy/temp + projectile_type = /obj/item/projectile/temp + select_name = "freeze" + e_cost = 250 + fire_sound = 'sound/weapons/pulse3.ogg' + +/obj/item/ammo_casing/energy/temp/hot + projectile_type = /obj/item/projectile/temp/hot + select_name = "bake" + +/obj/item/ammo_casing/energy/meteor + projectile_type = /obj/item/projectile/meteor + select_name = "goddamn meteor" \ No newline at end of file diff --git a/code/modules/projectiles/ammunition/magazines.dm b/code/modules/projectiles/ammunition/magazines.dm index 950fbd050e3..c3aff3a3946 100644 --- a/code/modules/projectiles/ammunition/magazines.dm +++ b/code/modules/projectiles/ammunition/magazines.dm @@ -15,7 +15,7 @@ boolets++ return boolets else - return stored_ammo.len + ..() /obj/item/ammo_box/magazine/internal/cylinder/rus357 name = "russian revolver cylinder" @@ -23,6 +23,7 @@ ammo_type = /obj/item/ammo_casing/a357 caliber = "357" max_ammo = 6 + multiload = 0 /obj/item/ammo_box/magazine/internal/cylinder/rus357/New() stored_ammo += new ammo_type(src) @@ -40,6 +41,7 @@ ammo_type = /obj/item/ammo_casing/shotgun/beanbag caliber = "shotgun" max_ammo = 4 + multiload = 0 /obj/item/ammo_box/magazine/internal/shotcom name = "combat shotgun internal magazine" @@ -54,6 +56,7 @@ ammo_type = /obj/item/ammo_casing/shotgun/beanbag caliber = "shotgun" max_ammo = 2 + multiload = 0 ///////////EXTERNAL MAGAZINES//////////////// /obj/item/ammo_box/magazine/m9mm diff --git a/code/modules/projectiles/ammunition/special.dm b/code/modules/projectiles/ammunition/special.dm new file mode 100644 index 00000000000..5bc4ba72fa9 --- /dev/null +++ b/code/modules/projectiles/ammunition/special.dm @@ -0,0 +1,25 @@ +/obj/item/ammo_casing/magic + name = "magic casing" + desc = "I didn't even know magic needed ammo..." + projectile_type = "/obj/item/projectile/magic" + +/obj/item/ammo_casing/magic/change + projectile_type = "/obj/item/projectile/magic/change" + +/obj/item/ammo_casing/magic/animate + projectile_type = "/obj/item/projectile/magic/animate" + +/obj/item/ammo_casing/magic/heal + projectile_type = "/obj/item/projectile/magic/resurrection" + +/obj/item/ammo_casing/magic/death + projectile_type = "/obj/item/projectile/magic/death" + +/obj/item/ammo_casing/magic/teleport + projectile_type = "/obj/item/projectile/magic/teleport" + +/obj/item/ammo_casing/magic/door + projectile_type = "/obj/item/projectile/magic/door" + +/obj/item/ammo_casing/magic/fireball + projectile_type = "/obj/item/projectile/magic/fireball" \ No newline at end of file diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index 77059f87eb8..f2d0dfa0cd4 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -16,26 +16,36 @@ attack_verb = list("struck", "hit", "bashed") var/fire_sound = "gunshot" - var/obj/item/projectile/in_chamber = null var/silenced = 0 var/recoil = 0 var/clumsy_check = 1 + var/obj/item/ammo_casing/chambered = null - proc/process_chambered() + proc/process_chamber() return 0 proc/special_check(var/mob/M) //Placeholder for any special checks, like detective's revolver. return 1 - proc/prepare_shot(var/obj/item/projectile/proj) //Transfer properties from the gun to the bullet - proj.shot_from = src +/* proc/prepare_shot(var/obj/item/projectile/proj) //Transfer properties from the gun to the bullet proj.silenced = silenced - return + return*/ proc/shoot_with_empty_chamber(mob/living/user as mob|obj) user << "*click*" return + proc/shoot_live_shot(mob/living/user as mob|obj) + if(recoil) + spawn() + shake_camera(user, recoil + 1, recoil) + + if(silenced) + playsound(user, fire_sound, 10, 1) + else + playsound(user, fire_sound, 50, 1) + user.visible_message("[user] fires [src]!", "You fire [src]!", "You hear a [istype(src, /obj/item/weapon/gun/energy) ? "laser blast" : "gunshot"]!") + emp_act(severity) for(var/obj/O in contents) O.emp_act(severity) @@ -71,38 +81,23 @@ add_fingerprint(user) - var/turf/curloc = user.loc - var/turf/targloc = get_turf(target) - if (!istype(targloc) || !istype(curloc)) - return - if(!special_check(user)) return - if(!process_chambered()) - shoot_with_empty_chamber(user) - - if(!in_chamber) - return - - in_chamber.firer = user - in_chamber.def_zone = user.zone_sel.selecting - - - if(recoil) - spawn() - shake_camera(user, recoil + 1, recoil) - - if(silenced) - playsound(user, fire_sound, 10, 1) + if(chambered) + chambered.ready_proj(user, silenced) + if(!chambered.fire(target, user, params)) + shoot_with_empty_chamber(user) + else + shoot_live_shot(user) else - playsound(user, fire_sound, 50, 1) - user.visible_message("[user] fires [src]!", "You fire [src]!", "You hear a [istype(in_chamber, /obj/item/projectile/beam) ? "laser blast" : "gunshot"]!") + shoot_with_empty_chamber(user) + process_chamber() - prepare_shot(in_chamber) //Set the projectile's properties +// prepare_shot(in_chamber) //Set the projectile's properties - if(targloc == curloc) //Fire the projectile +/* if(targloc == curloc) //Fire the projectile user.bullet_act(in_chamber) del(in_chamber) update_icon() @@ -127,7 +122,7 @@ in_chamber.process() sleep(1) in_chamber = null - +*/ update_icon() if(user.hand) diff --git a/code/modules/projectiles/guns/energy.dm b/code/modules/projectiles/guns/energy.dm index 76aa1482568..26ae717f723 100644 --- a/code/modules/projectiles/guns/energy.dm +++ b/code/modules/projectiles/guns/energy.dm @@ -2,43 +2,74 @@ icon_state = "energy" name = "energy gun" desc = "A basic energy-based gun." - fire_sound = 'sound/weapons/Taser.ogg' var/obj/item/weapon/cell/power_supply //What type of power cell this uses - var/charge_cost = 100 //How much energy is needed to fire. - var/cell_type = "/obj/item/weapon/cell" - var/projectile_type = "/obj/item/projectile/energy" - var/modifystate - - emp_act(severity) - power_supply.use(round(power_supply.maxcharge / severity)) - update_icon() - ..() - - - New() - ..() - if(cell_type) - power_supply = new cell_type(src) - else - power_supply = new(src) - power_supply.give(power_supply.maxcharge) - return - - - process_chambered() - if(in_chamber) return 1 - if(!power_supply) return 0 - if(!power_supply.use(charge_cost)) return 0 - if(!projectile_type) return 0 - in_chamber = new projectile_type(src) - return 1 - + var/cell_type = /obj/item/weapon/cell + var/modifystate = 0 + var/list/ammo_type = list(/obj/item/ammo_casing/energy) + var/select = 1 //The state of the select fire switch. Determines from the ammo_type list what kind of shot is fired next. +/obj/item/weapon/gun/energy/emp_act(severity) + power_supply.use(round(power_supply.maxcharge / severity)) update_icon() - var/ratio = power_supply.charge / power_supply.maxcharge - ratio = round(ratio, 0.25) * 100 - if(modifystate) - icon_state = "[modifystate][ratio]" - else - icon_state = "[initial(icon_state)][ratio]" \ No newline at end of file + ..() + + +/obj/item/weapon/gun/energy/New() + ..() + if(cell_type) + power_supply = new cell_type(src) + else + power_supply = new(src) + power_supply.give(power_supply.maxcharge) + var/obj/item/ammo_casing/energy/shot + for (var/i = 1, i <= ammo_type.len, i++) + var/shottype = ammo_type[i] + shot = new shottype(src) + ammo_type[i] = shot + shot = ammo_type[select] + fire_sound = shot.fire_sound + update_icon() + return + + +/obj/item/weapon/gun/energy/afterattack(atom/target as mob|obj|turf, mob/living/user as mob|obj, params) + newshot() + ..() + + +/obj/item/weapon/gun/energy/proc/newshot() + if (!ammo_type || !power_supply) return + var/obj/item/ammo_casing/energy/shot = ammo_type[select] + if (!power_supply.use(shot.e_cost)) return + chambered = shot + chambered.newshot() + return + +/obj/item/weapon/gun/energy/process_chamber() + chambered = null + return + +/obj/item/weapon/gun/energy/proc/select_fire(mob/living/user as mob) + select++ + if (select > ammo_type.len) + select = 1 + var/obj/item/ammo_casing/energy/shot = ammo_type[select] + fire_sound = shot.fire_sound + if (shot.select_name) + user << "\red [src] is now set to [shot.select_name]." + update_icon() + return + +/obj/item/weapon/gun/energy/update_icon() + var/ratio = power_supply.charge / power_supply.maxcharge + ratio = round(ratio, 0.25) * 100 + var/obj/item/ammo_casing/energy/shot = ammo_type[select] + switch(modifystate) + if (0) + icon_state = "[initial(icon_state)][ratio]" + if (1) + icon_state = "[initial(icon_state)][shot.mod_name][ratio]" + if (2) + icon_state = "[initial(icon_state)][shot.select_name][ratio]" + return \ No newline at end of file diff --git a/code/modules/projectiles/guns/energy/laser.dm b/code/modules/projectiles/guns/energy/laser.dm index 9f7c3b8f26b..e6610e9d9af 100644 --- a/code/modules/projectiles/guns/energy/laser.dm +++ b/code/modules/projectiles/guns/energy/laser.dm @@ -3,16 +3,15 @@ desc = "a basic weapon designed kill with concentrated energy bolts" icon_state = "laser" item_state = "laser" - fire_sound = 'sound/weapons/Laser.ogg' w_class = 3.0 m_amt = 2000 origin_tech = "combat=3;magnets=2" - projectile_type = "/obj/item/projectile/beam" + ammo_type = list(/obj/item/ammo_casing/energy/laser) /obj/item/weapon/gun/energy/laser/practice name = "practice laser gun" desc = "A modified version of the basic laser gun, this one fires less concentrated energy bolts designed for target practice." - projectile_type = "/obj/item/projectile/practice" + ammo_type = list(/obj/item/ammo_casing/energy/laser/practice) clumsy_check = 0 obj/item/weapon/gun/energy/laser/retro @@ -50,16 +49,14 @@ obj/item/weapon/gun/energy/laser/retro -/obj/item/weapon/gun/energy/laser/cyborg/process_chambered() - if(in_chamber) - return 1 +/obj/item/weapon/gun/energy/laser/cyborg/newshot() if(isrobot(src.loc)) var/mob/living/silicon/robot/R = src.loc if(R && R.cell) - R.cell.use(100) - in_chamber = new/obj/item/projectile/beam(src) - return 1 - return 0 + if(R.cell.use(100)) + chambered = ammo_type[select] + chambered.newshot() + return @@ -67,19 +64,16 @@ obj/item/weapon/gun/energy/laser/retro name = "laser cannon" desc = "With the L.A.S.E.R. cannon, the lasing medium is enclosed in a tube lined with uranium-235 and subjected to high neutron flux in a nuclear reactor core. This incredible technology may help YOU achieve high excitation rates with small laser volumes!" icon_state = "lasercannon" - fire_sound = 'sound/weapons/lasercannonfire.ogg' origin_tech = "combat=4;materials=3;powerstorage=3" - projectile_type = "/obj/item/projectile/beam/heavylaser" + ammo_type = list(/obj/item/ammo_casing/energy/laser/heavy) /obj/item/weapon/gun/energy/xray name = "xray laser gun" desc = "A high-power laser gun capable of expelling concentrated xray blasts." icon_state = "xray" - fire_sound = 'sound/weapons/laser3.ogg' origin_tech = "combat=5;materials=3;magnets=2;syndicate=2" - projectile_type = "/obj/item/projectile/beam/xray" - charge_cost = 50 + ammo_type = list(/obj/item/ammo_casing/energy/xray) ////////Laser Tag//////////////////// @@ -88,7 +82,7 @@ obj/item/weapon/gun/energy/laser/retro name = "laser tag gun" icon_state = "bluetag" desc = "Standard issue weapon of the Imperial Guard" - projectile_type = "/obj/item/projectile/bluetag" + ammo_type = list(/obj/item/ammo_casing/energy/laser/bluetag) origin_tech = "combat=1;magnets=2" clumsy_check = 0 var/charge_tick = 0 @@ -125,7 +119,7 @@ obj/item/weapon/gun/energy/laser/retro name = "laser tag gun" icon_state = "redtag" desc = "Standard issue weapon of the Imperial Guard" - projectile_type = "/obj/item/projectile/redtag" + ammo_type = list(/obj/item/ammo_casing/energy/laser/redtag) origin_tech = "combat=1;magnets=2" clumsy_check = 0 var/charge_tick = 0 diff --git a/code/modules/projectiles/guns/energy/nuclear.dm b/code/modules/projectiles/guns/energy/nuclear.dm index 488376b88f2..ba9aee37eb2 100644 --- a/code/modules/projectiles/guns/energy/nuclear.dm +++ b/code/modules/projectiles/guns/energy/nuclear.dm @@ -1,38 +1,18 @@ /obj/item/weapon/gun/energy/gun name = "energy gun" desc = "A basic energy-based gun with two settings: Stun and kill." - icon_state = "energystun100" + icon_state = "energy" item_state = null //so the human update icon uses the icon_state instead. - fire_sound = 'sound/weapons/Taser.ogg' - - charge_cost = 100 //How much energy is needed to fire. - projectile_type = "/obj/item/projectile/energy/electrode" + ammo_type = list(/obj/item/ammo_casing/energy/electrode, /obj/item/ammo_casing/energy/laser) origin_tech = "combat=3;magnets=2" - modifystate = "energystun" - - var/mode = 0 //0 = stun, 1 = kill + modifystate = 2 attack_self(mob/living/user as mob) - switch(mode) - if(0) - mode = 1 - charge_cost = 100 - fire_sound = 'sound/weapons/Laser.ogg' - user << "\red [src.name] is now set to kill." - projectile_type = "/obj/item/projectile/beam" - modifystate = "energykill" - if(1) - mode = 0 - charge_cost = 100 - fire_sound = 'sound/weapons/Taser.ogg' - user << "\red [src.name] is now set to stun." - projectile_type = "/obj/item/projectile/energy/electrode" - modifystate = "energystun" + select_fire(user) update_icon() - /obj/item/weapon/gun/energy/gun/nuclear name = "Advanced Energy Gun" desc = "An energy gun with an experimental miniaturized reactor." @@ -40,6 +20,7 @@ origin_tech = "combat=3;materials=5;powerstorage=3" var/lightfail = 0 var/charge_tick = 0 + modifystate = 0 New() ..() @@ -109,9 +90,9 @@ update_mode() - if (mode == 0) + if (select == 1) overlays += "nucgun-stun" - else if (mode == 1) + else if (select == 2) overlays += "nucgun-kill" diff --git a/code/modules/projectiles/guns/energy/pulse.dm b/code/modules/projectiles/guns/energy/pulse.dm index 74f5a7fb42f..c57d098f37b 100644 --- a/code/modules/projectiles/guns/energy/pulse.dm +++ b/code/modules/projectiles/guns/energy/pulse.dm @@ -4,43 +4,21 @@ icon_state = "pulse" item_state = null //so the human update icon uses the icon_state instead. force = 10 - fire_sound = 'sound/weapons/pulse.ogg' - charge_cost = 200 - projectile_type = "/obj/item/projectile/beam/pulse" + ammo_type = list(/obj/item/ammo_casing/energy/laser/pulse, /obj/item/ammo_casing/energy/electrode, /obj/item/ammo_casing/energy/laser) cell_type = "/obj/item/weapon/cell/super" - var/mode = 2 - attack_self(mob/living/user as mob) - switch(mode) - if(2) - mode = 0 - charge_cost = 100 - fire_sound = 'sound/weapons/Taser.ogg' - user << "\red [src.name] is now set to stun." - projectile_type = "/obj/item/projectile/energy/electrode" - if(0) - mode = 1 - charge_cost = 100 - fire_sound = 'sound/weapons/Laser.ogg' - user << "\red [src.name] is now set to kill." - projectile_type = "/obj/item/projectile/beam" - if(1) - mode = 2 - charge_cost = 200 - fire_sound = 'sound/weapons/pulse.ogg' - user << "\red [src.name] is now set to DESTROY." - projectile_type = "/obj/item/projectile/beam/pulse" - return - +/obj/item/weapon/gun/energy/pulse_rifle/attack_self(mob/living/user as mob) + select_fire(user) /obj/item/weapon/gun/energy/pulse_rifle/destroyer name = "pulse destroyer" desc = "A heavy-duty, pulse-based energy weapon." cell_type = "/obj/item/weapon/cell/infinite" + ammo_type = list(/obj/item/ammo_casing/energy/laser/pulse) - attack_self(mob/living/user as mob) - user << "\red [src.name] has three settings, and they are all DESTROY." +/obj/item/weapon/gun/energy/pulse_rifle/destroyer/attack_self(mob/living/user as mob) + user << "\red [src.name] has three settings, and they are all DESTROY." diff --git a/code/modules/projectiles/guns/energy/special.dm b/code/modules/projectiles/guns/energy/special.dm index c1ed4531c26..33c4df0b312 100644 --- a/code/modules/projectiles/guns/energy/special.dm +++ b/code/modules/projectiles/guns/energy/special.dm @@ -2,13 +2,11 @@ name = "ion rifle" desc = "A man portable anti-armor weapon designed to disable mechanical threats" icon_state = "ionrifle" - fire_sound = 'sound/weapons/Laser.ogg' origin_tech = "combat=2;magnets=4" w_class = 5 flags = FPRINT | TABLEPASS | CONDUCT slot_flags = SLOT_BACK - charge_cost = 100 - projectile_type = "/obj/item/projectile/ion" + ammo_type = list(/obj/item/ammo_casing/energy/ion) /obj/item/weapon/gun/energy/ionrifle/emp_act(severity) if(severity <= 2) @@ -21,21 +19,17 @@ name = "biological demolecularisor" desc = "A gun that discharges high amounts of controlled radiation to slowly break a target into component elements." icon_state = "decloner" - fire_sound = 'sound/weapons/pulse3.ogg' origin_tech = "combat=5;materials=4;powerstorage=3" - charge_cost = 100 - projectile_type = "/obj/item/projectile/energy/declone" + ammo_type = list(/obj/item/ammo_casing/energy/declone) /obj/item/weapon/gun/energy/floragun name = "floral somatoray" desc = "A tool that discharges controlled radiation which induces mutation in plant cells." - icon_state = "floramut100" + icon_state = "flora" item_state = "obj/item/gun.dmi" - fire_sound = 'sound/effects/stealthoff.ogg' - charge_cost = 100 - projectile_type = "/obj/item/projectile/energy/floramut" + ammo_type = list(/obj/item/ammo_casing/energy/flora/yield, /obj/item/ammo_casing/energy/flora/mut) origin_tech = "materials=2;biotech=3;powerstorage=3" - modifystate = "floramut" + modifystate = 1 var/charge_tick = 0 var/mode = 0 //0 = mutate, 1 = yield boost @@ -59,19 +53,7 @@ return 1 attack_self(mob/living/user as mob) - switch(mode) - if(0) - mode = 1 - charge_cost = 100 - user << "\red The [src.name] is now set to increase yield." - projectile_type = "/obj/item/projectile/energy/florayield" - modifystate = "florayield" - if(1) - mode = 0 - charge_cost = 100 - user << "\red The [src.name] is now set to induce mutations." - projectile_type = "/obj/item/projectile/energy/floramut" - modifystate = "floramut" + select_fire(user) update_icon() return @@ -81,8 +63,7 @@ icon_state = "riotgun" item_state = "c20r" w_class = 4 - projectile_type = "/obj/item/projectile/meteor" - charge_cost = 100 + ammo_type = list(/obj/item/ammo_casing/energy/meteor) cell_type = "/obj/item/weapon/cell/potato" clumsy_check = 0 //Admin spawn only, might as well let clowns use it. var/charge_tick = 0 @@ -121,5 +102,4 @@ name = "mind flayer" desc = "A prototype weapon recovered from the ruins of Research-Station Epsilon." icon_state = "xray" - projectile_type = "/obj/item/projectile/beam/mindflayer" - fire_sound = 'sound/weapons/Laser.ogg' \ No newline at end of file + ammo_type = list(/obj/item/ammo_casing/energy/mindflayer) \ No newline at end of file diff --git a/code/modules/projectiles/guns/energy/stun.dm b/code/modules/projectiles/guns/energy/stun.dm index 3efe6ee88b4..697c3985812 100644 --- a/code/modules/projectiles/guns/energy/stun.dm +++ b/code/modules/projectiles/guns/energy/stun.dm @@ -4,9 +4,7 @@ desc = "A small, low capacity gun used for non-lethal takedowns." icon_state = "taser" item_state = null //so the human update icon uses the icon_state instead. - fire_sound = 'sound/weapons/Taser.ogg' - charge_cost = 100 - projectile_type = "/obj/item/projectile/energy/electrode" + ammo_type = list(/obj/item/ammo_casing/energy/electrode) cell_type = "/obj/item/weapon/cell/crap" /obj/item/weapon/gun/energy/taser/cyborg @@ -14,8 +12,6 @@ desc = "A small, low capacity gun used for non-lethal takedowns." icon_state = "taser" fire_sound = 'sound/weapons/Taser.ogg' - charge_cost = 100 - projectile_type = "/obj/item/projectile/energy/electrode" cell_type = "/obj/item/weapon/cell/secborg" var/charge_tick = 0 var/recharge_time = 10 //Time it takes for shots to recharge (in ticks) @@ -38,8 +34,9 @@ if(isrobot(src.loc)) var/mob/living/silicon/robot/R = src.loc if(R && R.cell) - R.cell.use(charge_cost) //Take power from the borg... - power_supply.give(charge_cost) //... to recharge the shot + var/obj/item/ammo_casing/energy/shot = ammo_type[select] //Necessary to find cost of shot + if(R.cell.use(shot.e_cost)) //Take power from the borg... + power_supply.give(shot.e_cost) //... to recharge the shot update_icon() return 1 @@ -49,10 +46,8 @@ name = "stun revolver" desc = "A high-tech revolver that fires stun cartridges. The stun cartridges can be recharged using a conventional energy weapon recharger." icon_state = "stunrevolver" - fire_sound = 'sound/weapons/Gunshot.ogg' origin_tech = "combat=3;materials=3;powerstorage=2" - charge_cost = 125 - projectile_type = "/obj/item/projectile/energy/electrode" + ammo_type = list(/obj/item/ammo_casing/energy/electrode/gun) cell_type = "/obj/item/weapon/cell" @@ -66,8 +61,7 @@ m_amt = 2000 origin_tech = "combat=2;magnets=2;syndicate=5" silenced = 1 - fire_sound = 'sound/weapons/Genhit.ogg' - projectile_type = "/obj/item/projectile/energy/bolt" + ammo_type = list(/obj/item/ammo_casing/energy/bolt) cell_type = "/obj/item/weapon/cell/crap" var/charge_tick = 0 @@ -101,7 +95,4 @@ desc = "A weapon favored by syndicate infiltration teams." w_class = 4.0 force = 10 - m_amt = 200000 - projectile_type = "/obj/item/projectile/energy/bolt/large" - - + m_amt = 200000 \ No newline at end of file diff --git a/code/modules/projectiles/guns/energy/temperature.dm b/code/modules/projectiles/guns/energy/temperature.dm index d28ae8b8d8f..33023dab775 100644 --- a/code/modules/projectiles/guns/energy/temperature.dm +++ b/code/modules/projectiles/guns/energy/temperature.dm @@ -1,86 +1,13 @@ /obj/item/weapon/gun/energy/temperature name = "temperature gun" icon_state = "freezegun" - fire_sound = 'sound/weapons/pulse3.ogg' desc = "A gun that changes temperatures." - var/temperature = T20C - var/current_temperature = T20C - charge_cost = 100 origin_tech = "combat=3;materials=4;powerstorage=3;magnets=2" - - projectile_type = "/obj/item/projectile/temp" + ammo_type = list(/obj/item/ammo_casing/energy/temp, /obj/item/ammo_casing/energy/temp/hot) cell_type = "/obj/item/weapon/cell/high" - New() - ..() - processing_objects.Add(src) - - - Del() - processing_objects.Remove(src) - ..() - - attack_self(mob/living/user as mob) - user.set_machine(src) - var/temp_text = "" - if(temperature > (T0C - 50)) - temp_text = "[temperature] ([round(temperature-T0C)]°C) ([round(temperature*1.8-459.67)]°F)" - else - temp_text = "[temperature] ([round(temperature-T0C)]°C) ([round(temperature*1.8-459.67)]°F)" - - var/dat = {"Freeze Gun Configuration:
- Current output temperature: [temp_text]
- Target output temperature: - - - [current_temperature] + + +
- "} - - - user << browse(dat, "window=freezegun;size=450x300;can_resize=1;can_close=1;can_minimize=1") - onclose(user, "window=freezegun", src) - - prepare_shot(var/obj/item/projectile/temp/proj) - proj.temperature = temperature //Set the temperature of the beam - if(proj.temperature > 300) //If it's not a freeze beam, don't call it one - proj.name = "heat beam" - ..() - - - Topic(href, href_list) - if (..()) - return - usr.set_machine(src) - src.add_fingerprint(usr) - - - - if(href_list["temp"]) - var/amount = text2num(href_list["temp"]) - if(amount > 0) - src.current_temperature = min(500, src.current_temperature+amount) - else - src.current_temperature = max(0, src.current_temperature+amount) - if (istype(src.loc, /mob)) - attack_self(src.loc) - src.add_fingerprint(usr) - return - - - process() - switch(temperature) - if(0 to 100) charge_cost = 1000 - if(100 to 250) charge_cost = 500 - if(251 to 300) charge_cost = 100 - if(301 to 400) charge_cost = 500 - if(401 to 500) charge_cost = 1000 - - if(current_temperature != temperature) - var/difference = abs(current_temperature - temperature) - if(difference >= 10) - if(current_temperature < temperature) - temperature -= 10 - else - temperature += 10 - else - temperature = current_temperature - return + select_fire(user) + update_icon() + return \ No newline at end of file diff --git a/code/modules/projectiles/guns/magic.dm b/code/modules/projectiles/guns/magic.dm index b5146ca47ed..765bccd1022 100644 --- a/code/modules/projectiles/guns/magic.dm +++ b/code/modules/projectiles/guns/magic.dm @@ -5,9 +5,9 @@ icon_state = "staffofnothing" item_state = "staff" fire_sound = 'sound/weapons/emitter.ogg' + var/ammo_type = /obj/item/ammo_casing/magic flags = FPRINT | TABLEPASS | CONDUCT w_class = 5 - var/projectile_type = "/obj/item/projectile/magic" var/max_charges = 6 var/charges = 0 var/recharge_rate = 4 @@ -16,20 +16,20 @@ origin_tech = null clumsy_check = 0 -/obj/item/weapon/gun/magic/process_chambered() - if(in_chamber) return 1 - if(!charges) return 0 - if(!projectile_type) return 0 - in_chamber = new projectile_type(src) - return 1 - /obj/item/weapon/gun/magic/afterattack(atom/target as mob, mob/living/user as mob, flag) + newshot() ..() - if(charges && !in_chamber && !flag) charges-- + +/obj/item/weapon/gun/magic/proc/newshot() + if (charges && chambered) + chambered.newshot() + charges-- + return /obj/item/weapon/gun/magic/New() ..() charges = max_charges + chambered = new ammo_type(src) if(can_charge) processing_objects.Add(src) diff --git a/code/modules/projectiles/guns/magic/staff.dm b/code/modules/projectiles/guns/magic/staff.dm index dd38641e184..a07ea02d7c9 100644 --- a/code/modules/projectiles/guns/magic/staff.dm +++ b/code/modules/projectiles/guns/magic/staff.dm @@ -4,20 +4,20 @@ obj/item/weapon/gun/magic/staff/ obj/item/weapon/gun/magic/staff/change name = "staff of change" desc = "An artefact that spits bolts of coruscating energy which cause the target's very form to reshape itself" - projectile_type = "/obj/item/projectile/magic/change" + ammo_type = /obj/item/ammo_casing/magic/change icon_state = "staffofchange" item_state = "staffofchange" obj/item/weapon/gun/magic/staff/animate 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/magic/animate" + ammo_type = /obj/item/ammo_casing/magic/animate icon_state = "staffofanimation" item_state = "staffofanimation" obj/item/weapon/gun/magic/staff/healing name = "staff of healing" desc = "An artefact that spits bolts of restoring magic which can remove ailments of all kinds and even raise the dead." - projectile_type = "/obj/item/projectile/magic/resurrection" + ammo_type = /obj/item/ammo_casing/magic/heal icon_state = "staffofhealing" item_state = "staffofhealing" diff --git a/code/modules/projectiles/guns/magic/wand.dm b/code/modules/projectiles/guns/magic/wand.dm index 1bfc24b7ba2..f4bc0ba4cba 100644 --- a/code/modules/projectiles/guns/magic/wand.dm +++ b/code/modules/projectiles/guns/magic/wand.dm @@ -1,7 +1,7 @@ /obj/item/weapon/gun/magic/wand/ name = "wand of nothing" desc = "It's not just a stick, it's a MAGIC stick!" - projectile_type = "/obj/item/projectile/magic" + ammo_type = /obj/item/ammo_casing/magic icon_state = "wand6" item_state = "wand" w_class = 2 @@ -32,7 +32,7 @@ if(charges) zap_self(user) else - user << "The [name] whizzles quietly." + shoot_with_empty_chamber(user) else ..() @@ -44,7 +44,7 @@ /obj/item/weapon/gun/magic/wand/death name = "wand of death" desc = "This deadly wand overwhelms the victim's body with pure energy, slaying them without fail." - projectile_type = "/obj/item/projectile/magic/death" + ammo_type = /obj/item/ammo_casing/magic/death icon_state = "wand4" max_charges = 3 //3, 2, 2, 1 @@ -59,7 +59,7 @@ /obj/item/weapon/gun/magic/wand/resurrection name = "wand of resurrection" desc = "This wand uses healing magics to heal and revive. They are rarely utilized within the Wizard Federation for some reason." - projectile_type = "/obj/item/projectile/magic/resurrection" + ammo_type = /obj/item/ammo_casing/magic/heal icon_state = "wand1" max_charges = 3 //3, 2, 2, 1 @@ -72,7 +72,7 @@ /obj/item/weapon/gun/magic/wand/polymorph name = "wand of polymorph" desc = "This wand is attuned to chaos and will radically alter the victim's form." - projectile_type = "/obj/item/projectile/magic/change" + ammo_type = /obj/item/ammo_casing/magic/change icon_state = "wand5" max_charges = 10 //10, 5, 5, 4 @@ -84,7 +84,7 @@ /obj/item/weapon/gun/magic/wand/teleport name = "wand of teleportation" desc = "This wand will wrench targets through space and time to move them somewhere else." - projectile_type = "/obj/item/projectile/magic/teleport" + ammo_type = /obj/item/ammo_casing/magic/teleport icon_state = "wand3" max_charges = 10 //10, 5, 5, 4 @@ -99,7 +99,7 @@ /obj/item/weapon/gun/magic/wand/door name = "wand of door creation" desc = "This particular wand can create doors in any wall for the unscrupulous wizard who shuns teleportation magics." - projectile_type = "/obj/item/projectile/magic/door" + ammo_type = /obj/item/ammo_casing/magic/door icon_state = "wand0" max_charges = 20 //20, 10, 10, 7 @@ -109,7 +109,7 @@ /obj/item/weapon/gun/magic/wand/fireball name = "wand of fireball" desc = "This wand shoots scorching balls of fire that explode into destructive flames." - projectile_type = "/obj/item/projectile/magic/fireball" + ammo_type = /obj/item/ammo_casing/magic/fireball icon_state = "wand2" max_charges = 8 //8, 4, 4, 3 diff --git a/code/modules/projectiles/guns/projectile.dm b/code/modules/projectiles/guns/projectile.dm index cfe74037548..4a71d0d6497 100644 --- a/code/modules/projectiles/guns/projectile.dm +++ b/code/modules/projectiles/guns/projectile.dm @@ -9,7 +9,6 @@ var/ammo_type = /obj/item/ammo_casing/c10mm var/mag_type = /obj/item/ammo_box/magazine/m10mm //Removes the need for max_ammo and caliber info var/obj/item/ammo_box/magazine/magazine - var/obj/item/ammo_casing/chambered = null // The round (not bullet) that is in the chamber. /obj/item/weapon/gun/projectile/New() ..() @@ -18,28 +17,19 @@ update_icon() return -/obj/item/weapon/gun/projectile/process_chambered(var/eject_casing = 1, var/empty_chamber = 1) +/obj/item/weapon/gun/projectile/process_chamber(var/eject_casing = 1, var/empty_chamber = 1) // if(in_chamber) // return 1 var/obj/item/ammo_casing/AC = chambered //Find chambered round if(isnull(AC) || !istype(AC)) - return 0 + chamber_round() + return if(eject_casing) AC.loc = get_turf(src) //Eject casing onto ground. if(empty_chamber) chambered = null chamber_round() - if(AC.BB) - if(AC.reagents && AC.BB.reagents) - var/datum/reagents/casting_reagents = AC.reagents - casting_reagents.trans_to(AC.BB, casting_reagents.total_volume) //For chemical darts/bullets - casting_reagents.delete() - in_chamber = AC.BB //Load projectile into chamber. - AC.BB.loc = src //Set projectile loc to gun. - AC.BB = null - AC.update_icon() - return 1 - return 0 + return /obj/item/weapon/gun/projectile/proc/chamber_round() if (chambered || !magazine) @@ -47,6 +37,11 @@ else if (magazine.ammo_count()) chambered = magazine.get_round() chambered.loc = src + if(chambered.BB) + if(chambered.reagents && chambered.BB.reagents) + var/datum/reagents/casting_reagents = chambered.reagents + casting_reagents.trans_to(chambered.BB, casting_reagents.total_volume) //For chemical darts/bullets + casting_reagents.delete() return /obj/item/weapon/gun/projectile/attackby(var/obj/item/A as obj, mob/user as mob) @@ -56,7 +51,7 @@ user.remove_from_mob(AM) magazine = AM magazine.loc = src - user << "You load a new magazine into \the [src]!" + user << "You load a new magazine into \the [src]." chamber_round() A.update_icon() update_icon() @@ -71,7 +66,7 @@ user.put_in_hands(magazine) magazine.update_icon() magazine = null - user << "You pull the magazine out of \the [src]!" + user << "You pull the magazine out of \the [src]." else user << "There's no magazine in \the [src]." update_icon() diff --git a/code/modules/projectiles/guns/projectile/revolver.dm b/code/modules/projectiles/guns/projectile/revolver.dm index 7cd352a177e..92ef1dd6528 100644 --- a/code/modules/projectiles/guns/projectile/revolver.dm +++ b/code/modules/projectiles/guns/projectile/revolver.dm @@ -12,25 +12,11 @@ chambered = magazine.get_round(1) return -/obj/item/weapon/gun/projectile/revolver/process_chambered() +/obj/item/weapon/gun/projectile/revolver/process_chamber() return ..(0, 1) /obj/item/weapon/gun/projectile/revolver/attackby(var/obj/item/A as obj, mob/user as mob) - var/num_loaded = 0 - if(istype(A, /obj/item/ammo_box)) - var/obj/item/ammo_box/AM = A - for(var/obj/item/ammo_casing/AC in AM.stored_ammo) - if(magazine.give_round(AC)) - AM.stored_ammo -= AC - num_loaded++ - else - break - if(istype(A, /obj/item/ammo_casing)) - var/obj/item/ammo_casing/AC = A - if(magazine.give_round(AC)) - user.drop_item() - AC.loc = src - num_loaded++ + var/num_loaded = magazine.attackby(A, user) if(num_loaded) user << "You load [num_loaded] shell\s into \the [src]!" A.update_icon() @@ -222,12 +208,19 @@ user << "[src] is empty." /obj/item/weapon/gun/projectile/revolver/russian/afterattack(atom/target as mob|obj|turf, mob/living/user as mob|obj, flag, params) + if(!spun && get_ammo(0,0)) + user.visible_message("[user] spins the chamber of the revolver.", "You spin the revolver's chamber.") + Spin() ..() spun = 0 /obj/item/weapon/gun/projectile/revolver/russian/attack(atom/target as mob|obj|turf|area, mob/living/user as mob|obj) + if(!spun && get_ammo(0,0)) + user.visible_message("[user] spins the chamber of the revolver.", "You spin the revolver's chamber.") + Spin() + return - if(!chambered) + if(!chambered && target == user) user.visible_message("\red *click*", "\red *click*") return @@ -236,18 +229,13 @@ var/obj/item/organ/limb/affecting = user.zone_sel.selecting if(affecting == "head") var/obj/item/ammo_casing/AC = chambered - if(!process_chambered()) + if(AC.fire(user, user)) + user.apply_damage(300, BRUTE, affecting) + playsound(user, fire_sound, 50, 1) + user.visible_message("[user.name] fires [src] at \his head!", "You fire [src] at your head!", "You hear a [istype(AC.BB, /obj/item/projectile/beam) ? "laser blast" : "gunshot"]!") + return + else user.visible_message("\red *click*", "\red *click*") return - if(!in_chamber) - return - var/obj/item/projectile/P = new AC.projectile_type - playsound(user, fire_sound, 50, 1) - user.visible_message("[user.name] fires [src] at \his head!", "You fire [src] at your head!", "You hear a [istype(in_chamber, /obj/item/projectile/beam) ? "laser blast" : "gunshot"]!") - if(!P.nodamage) - user.apply_damage(300, BRUTE, affecting) // You are dead, dead, dead. - return - - spun = 0 ..() diff --git a/code/modules/projectiles/guns/projectile/shotgun.dm b/code/modules/projectiles/guns/projectile/shotgun.dm index 497367c1c06..a7393eca0e0 100644 --- a/code/modules/projectiles/guns/projectile/shotgun.dm +++ b/code/modules/projectiles/guns/projectile/shotgun.dm @@ -14,27 +14,13 @@ var/pumped = 0 /obj/item/weapon/gun/projectile/shotgun/attackby(var/obj/item/A as obj, mob/user as mob) - var/num_loaded = 0 - if(istype(A, /obj/item/ammo_box)) - var/obj/item/ammo_box/AM = A - for(var/obj/item/ammo_casing/AC in AM.stored_ammo) - if(magazine.give_round(AC)) - AM.stored_ammo -= AC - num_loaded++ - else - break - if(istype(A, /obj/item/ammo_casing)) - var/obj/item/ammo_casing/AC = A - if(magazine.give_round(AC)) - user.drop_item() - AC.loc = src - num_loaded++ + var/num_loaded = magazine.attackby(A, user) if(num_loaded) user << "You load [num_loaded] shell\s into \the [src]!" A.update_icon() update_icon() -/obj/item/weapon/gun/projectile/shotgun/process_chambered() +/obj/item/weapon/gun/projectile/shotgun/process_chamber() return ..(0, 0) /obj/item/weapon/gun/projectile/shotgun/chamber_round() @@ -55,8 +41,6 @@ if(chambered)//We have a shell in the chamber chambered.loc = get_turf(src)//Eject casing chambered = null - if(in_chamber) - in_chamber = null if(!magazine.ammo_count()) return 0 var/obj/item/ammo_casing/AC = magazine.get_round() //load next casing. chambered = AC diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index f3914a580e8..b7861df4402 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -26,7 +26,6 @@ var/yo = null var/xo = null var/current = null - var/obj/shot_from = null // the object which shot us var/atom/original = null // the original target clicked var/turf/starting = null // the projectile's starting turf var/list/permutated = list() // we've passed through these atoms, don't try to hit them again diff --git a/code/modules/projectiles/projectile/special.dm b/code/modules/projectiles/projectile/special.dm index c824945bf26..d3b734d6d2d 100644 --- a/code/modules/projectiles/projectile/special.dm +++ b/code/modules/projectiles/projectile/special.dm @@ -30,7 +30,7 @@ damage_type = BURN nodamage = 1 flag = "energy" - var/temperature = 300 + var/temperature = 100 on_hit(var/atom/target, var/blocked = 0)//These two could likely check temp protection on the mob @@ -39,6 +39,10 @@ M.bodytemperature = temperature return 1 +/obj/item/projectile/temp/hot + name = "heat beam" + temperature = 400 + /obj/item/projectile/meteor name = "meteor" icon = 'icons/obj/meteor.dmi' diff --git a/code/modules/reagents/syringe_gun.dm b/code/modules/reagents/syringe_gun.dm index f6f9c673abb..7e7078f3e23 100644 --- a/code/modules/reagents/syringe_gun.dm +++ b/code/modules/reagents/syringe_gun.dm @@ -13,18 +13,18 @@ var/list/syringes = list() var/max_syringes = 1 -/obj/item/weapon/gun/syringe/process_chambered() +/obj/item/weapon/gun/syringe/process_chamber() if(!syringes.len) return 0 - + var/obj/item/weapon/reagent_containers/syringe/S = syringes[1] - + if(!S) return 0 - - in_chamber = new /obj/item/projectile/bullet/dart/syringe(src) - S.reagents.trans_to(in_chamber, S.reagents.total_volume) - in_chamber.name = S.name + + chambered.BB = new /obj/item/projectile/bullet/dart/syringe(src) + S.reagents.trans_to(chambered.BB, S.reagents.total_volume) + chambered.BB.name = S.name syringes.Remove(S) - + del(S) return 1 @@ -37,15 +37,15 @@ if(!syringes.len) user << "[src] is empty." return 0 - + var/obj/item/weapon/reagent_containers/syringe/S = syringes[syringes.len] - + if(!S) return 0 S.loc = user.loc - + syringes.Remove(S) user << "You unload [S] from \the [src]!" - + return 1 /obj/item/weapon/gun/syringe/attackby(var/obj/item/A as obj, mob/user as mob, var/show_msg = 1) diff --git a/maps/RandomZLevels/stationCollision.dm b/maps/RandomZLevels/stationCollision.dm index 46b67a369b9..938b73a1d06 100644 --- a/maps/RandomZLevels/stationCollision.dm +++ b/maps/RandomZLevels/stationCollision.dm @@ -64,7 +64,7 @@ obj/item/weapon/gun/energy/laser/retro/sc_retro name ="retro laser" icon_state = "retro" desc = "An older model of the basic lasergun, no longer used by Nanotrasen's security or military forces." - projectile_type = "/obj/item/projectile/practice" +// projectile_type = "/obj/item/projectile/practice" clumsy_check = 0 //No sense in having a harmless gun blow up in the clowns face //Syndicate silenced pistol. This definition is not necessary, it's just habit. diff --git a/tgstation.dme b/tgstation.dme index cfc1a9b2115..0eaac25e21d 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -1080,7 +1080,9 @@ #include "code\modules\projectiles\projectile.dm" #include "code\modules\projectiles\ammunition\boxes.dm" #include "code\modules\projectiles\ammunition\bullets.dm" +#include "code\modules\projectiles\ammunition\energy.dm" #include "code\modules\projectiles\ammunition\magazines.dm" +#include "code\modules\projectiles\ammunition\special.dm" #include "code\modules\projectiles\guns\energy.dm" #include "code\modules\projectiles\guns\magic.dm" #include "code\modules\projectiles\guns\projectile.dm" From f4542ee258d7a5a8595163ad5e6cfa8eada9c82d Mon Sep 17 00:00:00 2001 From: sirbayer Date: Mon, 30 Dec 2013 20:43:10 -0800 Subject: [PATCH 2/8] Scattershot ho! --- code/game/machinery/autolathe.dm | 2 +- .../objects/items/weapons/storage/boxes.dm | 4 +- code/modules/projectiles/ammunition.dm | 51 ++-------------- .../modules/projectiles/ammunition/bullets.dm | 17 +++--- code/modules/projectiles/ammunition/energy.dm | 6 ++ .../projectiles/ammunition/magazines.dm | 3 +- code/modules/projectiles/firing.dm | 57 ++++++++++++++++++ code/modules/projectiles/gun.dm | 36 ----------- code/modules/projectiles/guns/energy/laser.dm | 10 +++ code/modules/projectiles/guns/magic/wand.dm | 13 ++-- code/modules/projectiles/projectile/beams.dm | 5 ++ .../modules/projectiles/projectile/bullets.dm | 5 ++ icons/obj/projectiles.dmi | Bin 29113 -> 29206 bytes tgstation.dme | 1 + 14 files changed, 110 insertions(+), 100 deletions(-) create mode 100644 code/modules/projectiles/firing.dm diff --git a/code/game/machinery/autolathe.dm b/code/game/machinery/autolathe.dm index 6a31eb60051..513d81b5649 100644 --- a/code/game/machinery/autolathe.dm +++ b/code/game/machinery/autolathe.dm @@ -32,7 +32,6 @@ var/global/list/autolathe_recipes = list( \ new /obj/item/weapon/hemostat(),\ new /obj/item/weapon/reagent_containers/glass/beaker(), \ new /obj/item/weapon/reagent_containers/glass/beaker/large(), \ - new /obj/item/ammo_casing/shotgun/blank(), \ new /obj/item/ammo_casing/shotgun/beanbag(), \ new /obj/item/ammo_box/c38(), \ new /obj/item/device/taperecorder/empty(), \ @@ -57,6 +56,7 @@ var/global/list/autolathe_recipes_hidden = list( \ new /obj/item/weapon/handcuffs(), \ new /obj/item/ammo_box/a357(), \ new /obj/item/ammo_casing/shotgun(), \ + new /obj/item/ammo_casing/shotgun/buckshot(), \ new /obj/item/ammo_casing/shotgun/dart(), \ /* new /obj/item/weapon/shield/riot(), */ \ ) diff --git a/code/game/objects/items/weapons/storage/boxes.dm b/code/game/objects/items/weapons/storage/boxes.dm index 02602b61cd0..b1afcdcd219 100644 --- a/code/game/objects/items/weapons/storage/boxes.dm +++ b/code/game/objects/items/weapons/storage/boxes.dm @@ -145,7 +145,7 @@ new /obj/item/weapon/dnainjector/m2h(src) new /obj/item/weapon/dnainjector/m2h(src) -/obj/item/weapon/storage/box/blanks +/*/obj/item/weapon/storage/box/blanks //Blanks removed, go home name = "box of blank shells" desc = "It has a picture of a gun and several warning symbols on the front." @@ -157,7 +157,7 @@ new /obj/item/ammo_casing/shotgun/blank(src) new /obj/item/ammo_casing/shotgun/blank(src) new /obj/item/ammo_casing/shotgun/blank(src) - new /obj/item/ammo_casing/shotgun/blank(src) + new /obj/item/ammo_casing/shotgun/blank(src)*/ /obj/item/weapon/storage/box/flashbangs name = "box of flashbangs (WARNING)" diff --git a/code/modules/projectiles/ammunition.dm b/code/modules/projectiles/ammunition.dm index 50677fd6e5b..49f577ed037 100644 --- a/code/modules/projectiles/ammunition.dm +++ b/code/modules/projectiles/ammunition.dm @@ -10,6 +10,8 @@ var/caliber = null //Which kind of guns it can be loaded into var/projectile_type = null //The bullet type to create when New() is called var/obj/item/projectile/BB = null //The loaded bullet + var/pellets = 0 //Pellets for spreadshot + var/variance = 0 //Variance for inaccuracy fundamental to the casing /obj/item/ammo_casing/New() @@ -26,48 +28,7 @@ icon_state = "[initial(icon_state)][BB ? "-live" : ""]" desc = "[initial(desc)][BB ? "" : " This one is spent"]" -/obj/item/ammo_casing/proc/ready_proj(mob/living/user, var/quiet) - if (!BB) - return - BB.firer = user - BB.def_zone = user.zone_sel.selecting - BB.silenced = quiet - return - -/obj/item/ammo_casing/proc/fire(atom/target as mob|obj|turf, mob/living/user as mob|obj, params) - var/turf/curloc = user.loc - var/turf/targloc = get_turf(target) - if (!istype(targloc) || !istype(curloc) || !BB) - return 0 - if(targloc == curloc) //Fire the projectile - user.bullet_act(BB) - del(BB) - update_icon() - return 1 - BB.original = target - BB.loc = get_turf(user) - BB.starting = get_turf(user) - BB.current = curloc - BB.yo = targloc.y - curloc.y - BB.xo = targloc.x - curloc.x - user.next_move = world.time + 4 - - if(params) - var/list/mouse_control = params2list(params) - if(mouse_control["icon-x"]) - BB.p_x = text2num(mouse_control["icon-x"]) - if(mouse_control["icon-y"]) - BB.p_y = text2num(mouse_control["icon-y"]) - - spawn() - if(BB) - BB.process() - sleep(1) - BB = null - update_icon() - return 1 - -/obj/item/ammo_casing/proc/newshot() //Mostly for energy weapons and shotgun shells. +/obj/item/ammo_casing/proc/newshot() //For energy weapons and shotgun shells. if (!BB) BB = new projectile_type(src) return @@ -76,8 +37,8 @@ //Boxes of ammo /obj/item/ammo_box - name = "ammo box (.357)" - desc = "A box of ammo" + name = "ammo box (null_reference_exception)" + desc = "A box of ammo." icon_state = "357" icon = 'icons/obj/ammo.dmi' flags = FPRINT | TABLEPASS | CONDUCT @@ -151,7 +112,7 @@ icon_state = "[initial(icon_state)]-[stored_ammo.len]" if(2) icon_state = "[initial(icon_state)]-[stored_ammo.len ? "[max_ammo]" : "0"]" - desc = "There are [stored_ammo.len] shell\s left!" + desc = "[initial(desc)] There are [stored_ammo.len] shell\s left!" //Behavior for magazines /obj/item/ammo_box/magazine/proc/ammo_count() diff --git a/code/modules/projectiles/ammunition/bullets.dm b/code/modules/projectiles/ammunition/bullets.dm index 70e70c31b1f..33db4720b63 100644 --- a/code/modules/projectiles/ammunition/bullets.dm +++ b/code/modules/projectiles/ammunition/bullets.dm @@ -57,20 +57,21 @@ /obj/item/ammo_casing/shotgun - name = "shotgun shell" - desc = "A 12 gauge shell." - icon_state = "gshell" + name = "shotgun slug" + desc = "A 12 gauge slug." + icon_state = "blshell" caliber = "shotgun" projectile_type = /obj/item/projectile/bullet m_amt = 12500 -/obj/item/ammo_casing/shotgun/blank +/obj/item/ammo_casing/shotgun/buckshot name = "shotgun shell" - desc = "A blank shell." - icon_state = "blshell" - projectile_type = null - m_amt = 250 + desc = "A 12 gauge shell." + icon_state = "gshell" + projectile_type = /obj/item/projectile/bullet/pellet + pellets = 5 + variance = 0.8 /obj/item/ammo_casing/shotgun/beanbag diff --git a/code/modules/projectiles/ammunition/energy.dm b/code/modules/projectiles/ammunition/energy.dm index 15955719e33..b6557e600d0 100644 --- a/code/modules/projectiles/ammunition/energy.dm +++ b/code/modules/projectiles/ammunition/energy.dm @@ -16,6 +16,12 @@ projectile_type = /obj/item/projectile/practice select_name = "practice" +/obj/item/ammo_casing/energy/laser/scatter + projectile_type = /obj/item/projectile/beam/scatter + pellets = 5 + variance = 0.8 + select_name = "scatter" + /obj/item/ammo_casing/energy/laser/heavy projectile_type = /obj/item/projectile/beam/heavylaser select_name = "anti-vehicle" diff --git a/code/modules/projectiles/ammunition/magazines.dm b/code/modules/projectiles/ammunition/magazines.dm index c3aff3a3946..3113e322c24 100644 --- a/code/modules/projectiles/ammunition/magazines.dm +++ b/code/modules/projectiles/ammunition/magazines.dm @@ -46,9 +46,10 @@ /obj/item/ammo_box/magazine/internal/shotcom name = "combat shotgun internal magazine" desc = "Oh god, this shouldn't be here" - ammo_type = /obj/item/ammo_casing/shotgun + ammo_type = /obj/item/ammo_casing/shotgun/buckshot caliber = "shotgun" max_ammo = 8 + multiload = 0 /obj/item/ammo_box/magazine/internal/cylinder/dualshot name = "double-barrel shotgun internal magazine" diff --git a/code/modules/projectiles/firing.dm b/code/modules/projectiles/firing.dm new file mode 100644 index 00000000000..590e9c5177e --- /dev/null +++ b/code/modules/projectiles/firing.dm @@ -0,0 +1,57 @@ +/obj/item/ammo_casing/proc/fire(atom/target as mob|obj|turf, mob/living/user as mob|obj, params, var/distro, var/quiet) + distro += variance + for (var/i = max(1, pellets), i > 0, i--) + var/curloc = user.loc + var/targloc = get_turf(target) + ready_proj(target, user, quiet) + if(distro) + targloc = spread(targloc, curloc, distro) + if(!throw_proj(targloc, user, params)) + return 0 + if(i > 1) + newshot() + user.next_move = world.time + 4 + update_icon() + return 1 + +/obj/item/ammo_casing/proc/ready_proj(atom/target as mob|obj|turf, mob/living/user, var/quiet) + if (!BB) + return + BB.original = target + BB.firer = user + BB.def_zone = user.zone_sel.selecting + BB.silenced = quiet + return + +/obj/item/ammo_casing/proc/throw_proj(var/turf/targloc, mob/living/user as mob|obj, params) + var/turf/curloc = user.loc + if (!istype(targloc) || !istype(curloc) || !BB) + return 0 + if(targloc == curloc) //Fire the projectile + user.bullet_act(BB) + del(BB) + return 1 + BB.loc = get_turf(user) + BB.starting = get_turf(user) + BB.current = curloc + BB.yo = targloc.y - curloc.y + BB.xo = targloc.x - curloc.x + + if(params) + var/list/mouse_control = params2list(params) + if(mouse_control["icon-x"]) + BB.p_x = text2num(mouse_control["icon-x"]) + if(mouse_control["icon-y"]) + BB.p_y = text2num(mouse_control["icon-y"]) + + if(BB) + BB.process() + BB = null + return 1 + +/obj/item/ammo_casing/proc/spread(var/turf/target, var/turf/current, var/distro) + var/dx = abs(target.x - current.x) + var/dy = abs(target.y - current.y) + return locate(target.x + round(gaussian(0, distro) * (dy+2)/8, 1), target.y + round(gaussian(0, distro) * (dx+2)/8, 1), target.z) + +// gaussian(0, distro) \ No newline at end of file diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index f2d0dfa0cd4..10c3861c68b 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -27,10 +27,6 @@ proc/special_check(var/mob/M) //Placeholder for any special checks, like detective's revolver. return 1 -/* proc/prepare_shot(var/obj/item/projectile/proj) //Transfer properties from the gun to the bullet - proj.silenced = silenced - return*/ - proc/shoot_with_empty_chamber(mob/living/user as mob|obj) user << "*click*" return @@ -84,7 +80,6 @@ if(!special_check(user)) return if(chambered) - chambered.ready_proj(user, silenced) if(!chambered.fire(target, user, params)) shoot_with_empty_chamber(user) else @@ -92,37 +87,6 @@ else shoot_with_empty_chamber(user) process_chamber() - -// prepare_shot(in_chamber) //Set the projectile's properties - - - -/* if(targloc == curloc) //Fire the projectile - user.bullet_act(in_chamber) - del(in_chamber) - update_icon() - return - in_chamber.original = target - in_chamber.loc = get_turf(user) - in_chamber.starting = get_turf(user) - in_chamber.current = curloc - in_chamber.yo = targloc.y - curloc.y - in_chamber.xo = targloc.x - curloc.x - user.next_move = world.time + 4 - - if(params) - var/list/mouse_control = params2list(params) - if(mouse_control["icon-x"]) - in_chamber.p_x = text2num(mouse_control["icon-x"]) - if(mouse_control["icon-y"]) - in_chamber.p_y = text2num(mouse_control["icon-y"]) - - spawn() - if(in_chamber) - in_chamber.process() - sleep(1) - in_chamber = null -*/ update_icon() if(user.hand) diff --git a/code/modules/projectiles/guns/energy/laser.dm b/code/modules/projectiles/guns/energy/laser.dm index e6610e9d9af..fca677771d3 100644 --- a/code/modules/projectiles/guns/energy/laser.dm +++ b/code/modules/projectiles/guns/energy/laser.dm @@ -8,6 +8,7 @@ origin_tech = "combat=3;magnets=2" ammo_type = list(/obj/item/ammo_casing/energy/laser) + /obj/item/weapon/gun/energy/laser/practice name = "practice laser gun" desc = "A modified version of the basic laser gun, this one fires less concentrated energy bolts designed for target practice." @@ -59,6 +60,15 @@ obj/item/weapon/gun/energy/laser/retro return +/obj/item/weapon/gun/energy/laser/scatter + name = "scatter laser gun" + desc = "A laser gun equipped with a refraction kit that spreads bolts." + ammo_type = list(/obj/item/ammo_casing/energy/laser, /obj/item/ammo_casing/energy/laser/scatter) + + attack_self(mob/living/user as mob) + select_fire(user) + update_icon() + /obj/item/weapon/gun/energy/lasercannon name = "laser cannon" diff --git a/code/modules/projectiles/guns/magic/wand.dm b/code/modules/projectiles/guns/magic/wand.dm index 8520b55bd82..b25e68c4aa6 100644 --- a/code/modules/projectiles/guns/magic/wand.dm +++ b/code/modules/projectiles/guns/magic/wand.dm @@ -22,6 +22,9 @@ usr << "Has [charges] charge\s remaining." return +/obj/item/weapon/gun/magic/wand/update_icon() + icon_state = "[initial(icon_state)][charges ? "" : "-drained"]" + /obj/item/weapon/gun/magic/wand/attack(atom/target as mob, mob/living/user as mob) if(target == user) return @@ -29,17 +32,13 @@ /obj/item/weapon/gun/magic/wand/afterattack(atom/target as mob, mob/living/user as mob) if(!charges) - user << "The [name] whizzles quietly." + shoot_with_empty_chamber(user) return if(target == user) - if(charges) - zap_self(user) - else - shoot_with_empty_chamber(user) + zap_self(user) else ..() - if(!charges) - icon_state = "[icon_state]-drained" + update_icon() /obj/item/weapon/gun/magic/wand/proc/zap_self(mob/living/user as mob) diff --git a/code/modules/projectiles/projectile/beams.dm b/code/modules/projectiles/projectile/beams.dm index e753c085559..061660d27cd 100644 --- a/code/modules/projectiles/projectile/beams.dm +++ b/code/modules/projectiles/projectile/beams.dm @@ -16,6 +16,11 @@ flag = "laser" eyeblur = 2 +/obj/item/projectile/beam/scatter + name = "laser pellet" + icon_state = "scatterlaser" + damage = 5 + /obj/item/projectile/beam/heavylaser name = "heavy laser" diff --git a/code/modules/projectiles/projectile/bullets.dm b/code/modules/projectiles/projectile/bullets.dm index d2e0a4063f3..e961d277443 100644 --- a/code/modules/projectiles/projectile/bullets.dm +++ b/code/modules/projectiles/projectile/bullets.dm @@ -13,6 +13,11 @@ weaken = 5 +/obj/item/projectile/bullet/pellet + name = "pellet" + damage = 15 + + /obj/item/projectile/bullet/midbullet damage = 20 stun = 5 diff --git a/icons/obj/projectiles.dmi b/icons/obj/projectiles.dmi index 2844889a4da44423d6ec321a1fe2b5567bd8397e..a2edc4cc05471ea37cee5561c23a471113f9acf8 100644 GIT binary patch literal 29206 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%0D&o+1LZh~@O%aP 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 d Date: Thu, 2 Jan 2014 16:18:48 -0800 Subject: [PATCH 3/8] Syringe guns can suck it. --- .../modules/projectiles/ammunition/bullets.dm | 28 ++++++++++----- .../projectiles/ammunition/magazines.dm | 2 +- .../modules/projectiles/ammunition/special.dm | 21 ++++++----- code/modules/projectiles/gun.dm | 2 +- code/modules/projectiles/guns/projectile.dm | 1 - .../projectiles/guns/projectile/automatic.dm | 4 --- .../projectiles/guns/projectile/pistol.dm | 18 +--------- .../projectiles/guns/projectile/revolver.dm | 36 ++++++------------- .../projectiles/guns/projectile/shotgun.dm | 3 -- code/modules/reagents/syringe_gun.dm | 21 ++++++++--- 10 files changed, 62 insertions(+), 74 deletions(-) diff --git a/code/modules/projectiles/ammunition/bullets.dm b/code/modules/projectiles/ammunition/bullets.dm index 33db4720b63..9f4bbe8bbfd 100644 --- a/code/modules/projectiles/ammunition/bullets.dm +++ b/code/modules/projectiles/ammunition/bullets.dm @@ -14,12 +14,6 @@ projectile_type = /obj/item/projectile/bullet/suffocationbullet -/obj/item/ammo_casing/a75 - desc = "A .75 bullet casing." - caliber = "75" - projectile_type = /obj/item/projectile/bullet/gyro - - /obj/item/ammo_casing/a666 desc = "A .666 bullet casing." caliber = "357" @@ -107,6 +101,24 @@ return /obj/item/ammo_casing/a762 - desc = "A 7.62 bullet casing." + desc = "A 7.62mm bullet casing." caliber = "a762" - projectile_type = /obj/item/projectile/bullet \ No newline at end of file + projectile_type = /obj/item/projectile/bullet + + +/obj/item/ammo_casing/caseless + desc = "A caseless bullet casing." + + +/obj/item/ammo_casing/caseless/fire(atom/target as mob|obj|turf, mob/living/user as mob|obj, params, var/distro, var/quiet) + if (..()) + loc = null + return 1 + else + return 0 + + +/obj/item/ammo_casing/caseless/a75 + desc = "A .75 bullet casing." + caliber = "75" + projectile_type = /obj/item/projectile/bullet/gyro \ No newline at end of file diff --git a/code/modules/projectiles/ammunition/magazines.dm b/code/modules/projectiles/ammunition/magazines.dm index 3113e322c24..4551b5040dd 100644 --- a/code/modules/projectiles/ammunition/magazines.dm +++ b/code/modules/projectiles/ammunition/magazines.dm @@ -135,7 +135,7 @@ /obj/item/ammo_box/magazine/m75 name = "magazine (.75)" icon_state = "75" - ammo_type = /obj/item/ammo_casing/a75 + ammo_type = /obj/item/ammo_casing/caseless/a75 caliber = "75" multiple_sprites = 2 max_ammo = 8 diff --git a/code/modules/projectiles/ammunition/special.dm b/code/modules/projectiles/ammunition/special.dm index 5bc4ba72fa9..e530d7c2fca 100644 --- a/code/modules/projectiles/ammunition/special.dm +++ b/code/modules/projectiles/ammunition/special.dm @@ -1,25 +1,30 @@ /obj/item/ammo_casing/magic name = "magic casing" desc = "I didn't even know magic needed ammo..." - projectile_type = "/obj/item/projectile/magic" + projectile_type = /obj/item/projectile/magic /obj/item/ammo_casing/magic/change - projectile_type = "/obj/item/projectile/magic/change" + projectile_type = /obj/item/projectile/magic/change /obj/item/ammo_casing/magic/animate - projectile_type = "/obj/item/projectile/magic/animate" + projectile_type = /obj/item/projectile/magic/animate /obj/item/ammo_casing/magic/heal - projectile_type = "/obj/item/projectile/magic/resurrection" + projectile_type = /obj/item/projectile/magic/resurrection /obj/item/ammo_casing/magic/death - projectile_type = "/obj/item/projectile/magic/death" + projectile_type = /obj/item/projectile/magic/death /obj/item/ammo_casing/magic/teleport - projectile_type = "/obj/item/projectile/magic/teleport" + projectile_type = /obj/item/projectile/magic/teleport /obj/item/ammo_casing/magic/door - projectile_type = "/obj/item/projectile/magic/door" + projectile_type = /obj/item/projectile/magic/door /obj/item/ammo_casing/magic/fireball - projectile_type = "/obj/item/projectile/magic/fireball" \ No newline at end of file + projectile_type = /obj/item/projectile/magic/fireball + +/obj/item/ammo_casing/syringegun + name = "syringe gun spring" + desc = "A high-power spring that throws syringes." + projectile_type = null \ No newline at end of file diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index 10c3861c68b..91a853c1c56 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -80,7 +80,7 @@ if(!special_check(user)) return if(chambered) - if(!chambered.fire(target, user, params)) + if(!chambered.fire(target, user, params, , silenced)) shoot_with_empty_chamber(user) else shoot_live_shot(user) diff --git a/code/modules/projectiles/guns/projectile.dm b/code/modules/projectiles/guns/projectile.dm index 4a71d0d6497..875bd2622f3 100644 --- a/code/modules/projectiles/guns/projectile.dm +++ b/code/modules/projectiles/guns/projectile.dm @@ -6,7 +6,6 @@ w_class = 3.0 m_amt = 1000 - var/ammo_type = /obj/item/ammo_casing/c10mm var/mag_type = /obj/item/ammo_box/magazine/m10mm //Removes the need for max_ammo and caliber info var/obj/item/ammo_box/magazine/magazine diff --git a/code/modules/projectiles/guns/projectile/automatic.dm b/code/modules/projectiles/guns/projectile/automatic.dm index 29a23cbfb23..dca5273d730 100644 --- a/code/modules/projectiles/guns/projectile/automatic.dm +++ b/code/modules/projectiles/guns/projectile/automatic.dm @@ -4,7 +4,6 @@ icon_state = "saber" //ugly w_class = 3.0 origin_tech = "combat=4;materials=2" - ammo_type = /obj/item/ammo_casing/c9mm mag_type = /obj/item/ammo_box/magazine/msmg9mm var/alarmed = 0 @@ -24,7 +23,6 @@ icon_state = "mini-uzi" w_class = 3.0 origin_tech = "combat=5;materials=2;syndicate=8" - ammo_type = /obj/item/ammo_casing/c45 mag_type = /obj/item/ammo_box/magazine/uzim45 @@ -36,7 +34,6 @@ item_state = "c20r" w_class = 3.0 origin_tech = "combat=5;materials=2;syndicate=8" - ammo_type = /obj/item/ammo_casing/a12mm mag_type = /obj/item/ammo_box/magazine/m12mm fire_sound = 'sound/weapons/Gunshot_smg.ogg' @@ -71,7 +68,6 @@ w_class = 5 slot_flags = 0 origin_tech = "combat=5;materials=1;syndicate=2" - ammo_type = /obj/item/ammo_casing/a762 mag_type = /obj/item/ammo_box/magazine/m762 fire_sound = 'sound/weapons/Gunshot_smg.ogg' var/cover_open = 0 diff --git a/code/modules/projectiles/guns/projectile/pistol.dm b/code/modules/projectiles/guns/projectile/pistol.dm index 91908817c54..f75bf8fcc8a 100644 --- a/code/modules/projectiles/guns/projectile/pistol.dm +++ b/code/modules/projectiles/guns/projectile/pistol.dm @@ -5,7 +5,6 @@ w_class = 3.0 silenced = 1 origin_tech = "combat=2;materials=2;syndicate=8" - ammo_type = /obj/item/ammo_casing/c45 mag_type = /obj/item/ammo_box/magazine/sm45 fire_sound = 'sound/weapons/Gunshot_silenced.ogg' @@ -20,7 +19,6 @@ desc = "A robust handgun that uses .50 AE ammo" icon_state = "deagle" force = 14.0 - ammo_type = /obj/item/ammo_casing/a50 mag_type = /obj/item/ammo_box/magazine/m50 @@ -56,14 +54,10 @@ icon_state = "gyropistol" fire_sound = 'sound/effects/Explosion1.ogg' origin_tech = "combat=3" - ammo_type = /obj/item/ammo_casing/a75 mag_type = /obj/item/ammo_box/magazine/m75 -/obj/item/weapon/gun/projectile/automatic/gyropistol/New() +/obj/item/weapon/gun/projectile/automatic/gyropistol/process_chamber(var/eject_casing = 0, var/empty_chamber = 1) ..() - update_icon() - return - /obj/item/weapon/gun/projectile/automatic/gyropistol/afterattack(atom/target as mob|obj|turf|area, mob/living/user as mob|obj, flag) ..() @@ -85,18 +79,8 @@ w_class = 2 silenced = 0 origin_tech = "combat=2;materials=2;syndicate=2" - ammo_type = /obj/item/ammo_casing/c10mm mag_type = /obj/item/ammo_box/magazine/m10mm -/obj/item/weapon/gun/projectile/automatic/pistol/afterattack(atom/target as mob|obj|turf|area, mob/living/user as mob|obj, flag) - ..() - if(magazine) - if(!chambered && !magazine.ammo_count()) - magazine.update_icon() - magazine.loc = get_turf(src.loc) - magazine = null - return - /obj/item/weapon/gun/projectile/automatic/pistol/attack_hand(mob/user as mob) if(loc == user) if(silenced) diff --git a/code/modules/projectiles/guns/projectile/revolver.dm b/code/modules/projectiles/guns/projectile/revolver.dm index 92ef1dd6528..d8f6d1dbff0 100644 --- a/code/modules/projectiles/guns/projectile/revolver.dm +++ b/code/modules/projectiles/guns/projectile/revolver.dm @@ -2,7 +2,6 @@ desc = "A classic revolver. Uses 357 ammo" name = "revolver" icon_state = "revolver" - ammo_type = /obj/item/ammo_casing/a357 mag_type = /obj/item/ammo_box/magazine/internal/cylinder /obj/item/weapon/gun/projectile/revolver/chamber_round() @@ -18,7 +17,7 @@ /obj/item/weapon/gun/projectile/revolver/attackby(var/obj/item/A as obj, mob/user as mob) var/num_loaded = magazine.attackby(A, user) if(num_loaded) - user << "You load [num_loaded] shell\s into \the [src]!" + user << "You load [num_loaded] shell\s into \the [src]." A.update_icon() update_icon() chamber_round() @@ -33,7 +32,7 @@ CB.update_icon() num_unloaded++ if (num_unloaded) - user << "You unload [num_unloaded] shell\s from [src]!" + user << "You unload [num_unloaded] shell\s from [src]." else user << "[src] is empty." @@ -54,7 +53,6 @@ name = "revolver" icon_state = "detective" origin_tech = "combat=2;materials=2" - ammo_type = /obj/item/ammo_casing/c38 mag_type = /obj/item/ammo_box/magazine/internal/cylinder/rev38 @@ -62,7 +60,7 @@ if(magazine.caliber == initial(magazine.caliber)) return 1 if(prob(70 - (magazine.ammo_count() * 10))) //minimum probability of 10, maximum of 60 - M << "[src] blows up in your face." + M << "[src] blows up in your face!" M.take_organ_damage(0,20) M.drop_item() del(src) @@ -163,22 +161,7 @@ spun = 1 /obj/item/weapon/gun/projectile/revolver/russian/attackby(var/obj/item/A as obj, mob/user as mob) - var/num_loaded = 0 - if(istype(A, /obj/item/ammo_box)) - var/obj/item/ammo_box/AM = A - for(var/obj/item/ammo_casing/AC in AM.stored_ammo) - if(get_ammo() <= 1) - if(magazine.give_round(AC)) - AM.stored_ammo -= AC - num_loaded++ - break - if(istype(A, /obj/item/ammo_casing)) - var/obj/item/ammo_casing/AC = A - if(get_ammo() <= 1) - magazine.give_round(AC) - user.drop_item() - AC.loc = src - num_loaded++ + var/num_loaded = magazine.attackby(A, user) if(num_loaded) user.visible_message("[user] loads a single bullet into the revolver and spins the chamber.", "You load a single bullet into the chamber and spin it.") else @@ -220,12 +203,13 @@ Spin() return - if(!chambered && target == user) - user.visible_message("\red *click*", "\red *click*") - return - if(isliving(target) && isliving(user)) - if(target == user) + if(target == user) + if(!chambered) + user.visible_message("\red *click*", "\red *click*") + return + + if(isliving(target) && isliving(user)) var/obj/item/organ/limb/affecting = user.zone_sel.selecting if(affecting == "head") var/obj/item/ammo_casing/AC = chambered diff --git a/code/modules/projectiles/guns/projectile/shotgun.dm b/code/modules/projectiles/guns/projectile/shotgun.dm index a7393eca0e0..33325e45f38 100644 --- a/code/modules/projectiles/guns/projectile/shotgun.dm +++ b/code/modules/projectiles/guns/projectile/shotgun.dm @@ -8,7 +8,6 @@ flags = FPRINT | TABLEPASS | CONDUCT slot_flags = SLOT_BACK origin_tech = "combat=4;materials=2" - ammo_type = /obj/item/ammo_casing/shotgun/beanbag mag_type = /obj/item/ammo_box/magazine/internal/shot var/recentpump = 0 // to prevent spammage var/pumped = 0 @@ -56,7 +55,6 @@ name = "combat shotgun" icon_state = "cshotgun" origin_tech = "combat=5;materials=2" - ammo_type = /obj/item/ammo_casing/shotgun mag_type = /obj/item/ammo_box/magazine/internal/shotcom w_class = 5 @@ -70,7 +68,6 @@ flags = FPRINT | TABLEPASS | CONDUCT slot_flags = SLOT_BACK origin_tech = "combat=3;materials=1" - ammo_type = /obj/item/ammo_casing/shotgun/beanbag mag_type = /obj/item/ammo_box/magazine/internal/cylinder/dualshot /obj/item/weapon/gun/projectile/revolver/doublebarrel/attackby(var/obj/item/A as obj, mob/user as mob) diff --git a/code/modules/reagents/syringe_gun.dm b/code/modules/reagents/syringe_gun.dm index 7e7078f3e23..a2fb2d14c72 100644 --- a/code/modules/reagents/syringe_gun.dm +++ b/code/modules/reagents/syringe_gun.dm @@ -13,12 +13,16 @@ var/list/syringes = list() var/max_syringes = 1 -/obj/item/weapon/gun/syringe/process_chamber() - if(!syringes.len) return 0 +/obj/item/weapon/gun/syringe/New() + ..() + chambered = new /obj/item/ammo_casing/syringegun(src) + +/obj/item/weapon/gun/syringe/proc/newshot() + if(!syringes.len) return var/obj/item/weapon/reagent_containers/syringe/S = syringes[1] - if(!S) return 0 + if(!S) return chambered.BB = new /obj/item/projectile/bullet/dart/syringe(src) S.reagents.trans_to(chambered.BB, S.reagents.total_volume) @@ -26,7 +30,14 @@ syringes.Remove(S) del(S) - return 1 + return + +/obj/item/weapon/gun/syringe/process_chamber() + return + +/obj/item/weapon/gun/syringe/afterattack(atom/target as mob|obj|turf, mob/living/user as mob|obj, params) + newshot() + ..() /obj/item/weapon/gun/syringe/examine() ..() @@ -52,7 +63,7 @@ if(istype(A, /obj/item/weapon/reagent_containers/syringe)) if(syringes.len < max_syringes) user.drop_item() - user << "You load [A] into \the [src]!" + user << "You load [A] into \the [src]." syringes.Add(A) A.loc = src return 1 From d1a06a21dc67d48c660de57439e5601addd89e69 Mon Sep 17 00:00:00 2001 From: sirbayer Date: Mon, 6 Jan 2014 18:49:55 -0800 Subject: [PATCH 4/8] Mysterious compile errors gone. --- code/modules/projectiles/guns/magic.dm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/code/modules/projectiles/guns/magic.dm b/code/modules/projectiles/guns/magic.dm index 735d0256e2f..a4b7da17b15 100644 --- a/code/modules/projectiles/guns/magic.dm +++ b/code/modules/projectiles/guns/magic.dm @@ -12,8 +12,10 @@ var/recharge_rate = 4 var/charge_tick = 0 var/can_charge = 1 + var/ammo_type origin_tech = null clumsy_check = 0 + /obj/item/weapon/gun/magic/afterattack(atom/target as mob, mob/living/user as mob, flag) newshot() ..() From e09660906aca0eb5e0926381286ecb37fc1b4e10 Mon Sep 17 00:00:00 2001 From: sirbayer Date: Tue, 7 Jan 2014 14:32:28 -0800 Subject: [PATCH 5/8] Unless it's spontaneously generated more problems, we done here. --- code/modules/projectiles/ammunition/magazines.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/projectiles/ammunition/magazines.dm b/code/modules/projectiles/ammunition/magazines.dm index 4551b5040dd..f2605d939e2 100644 --- a/code/modules/projectiles/ammunition/magazines.dm +++ b/code/modules/projectiles/ammunition/magazines.dm @@ -15,7 +15,7 @@ boolets++ return boolets else - ..() + return ..() /obj/item/ammo_box/magazine/internal/cylinder/rus357 name = "russian revolver cylinder" From 7a9c8e27251496dc96459ef0b5d72852a666cb34 Mon Sep 17 00:00:00 2001 From: sirbayer Date: Thu, 9 Jan 2014 15:16:47 -0800 Subject: [PATCH 6/8] Fixed revolver/shotgun dual loading messages, fixed e-gun and automatic display issues. --- code/modules/projectiles/guns/energy.dm | 2 +- code/modules/projectiles/guns/energy/nuclear.dm | 2 +- code/modules/projectiles/guns/projectile/automatic.dm | 4 ++-- code/modules/projectiles/guns/projectile/revolver.dm | 4 ++-- code/modules/projectiles/guns/projectile/shotgun.dm | 2 +- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/code/modules/projectiles/guns/energy.dm b/code/modules/projectiles/guns/energy.dm index 26ae717f723..bc3f4208b9f 100644 --- a/code/modules/projectiles/guns/energy.dm +++ b/code/modules/projectiles/guns/energy.dm @@ -63,7 +63,7 @@ /obj/item/weapon/gun/energy/update_icon() var/ratio = power_supply.charge / power_supply.maxcharge - ratio = round(ratio, 0.25) * 100 + ratio = Ceiling(ratio*4) * 25 var/obj/item/ammo_casing/energy/shot = ammo_type[select] switch(modifystate) if (0) diff --git a/code/modules/projectiles/guns/energy/nuclear.dm b/code/modules/projectiles/guns/energy/nuclear.dm index ba9aee37eb2..9bc774e8095 100644 --- a/code/modules/projectiles/guns/energy/nuclear.dm +++ b/code/modules/projectiles/guns/energy/nuclear.dm @@ -73,7 +73,7 @@ overlays += "nucgun-whee" return var/ratio = power_supply.charge / power_supply.maxcharge - ratio = round(ratio, 0.25) * 100 + ratio = Ceiling(ratio*4) * 25 overlays += "nucgun-[ratio]" diff --git a/code/modules/projectiles/guns/projectile/automatic.dm b/code/modules/projectiles/guns/projectile/automatic.dm index dca5273d730..93eba8d5eff 100644 --- a/code/modules/projectiles/guns/projectile/automatic.dm +++ b/code/modules/projectiles/guns/projectile/automatic.dm @@ -55,7 +55,7 @@ /obj/item/weapon/gun/projectile/automatic/c20r/update_icon() ..() - icon_state = "c20r[magazine ? "-[round(get_ammo(0),4)]" : ""][chambered ? "" : "-e"]" + icon_state = "c20r[magazine ? "-[Ceiling(get_ammo(0)/4)*4]" : ""][chambered ? "" : "-e"]" return @@ -80,7 +80,7 @@ /obj/item/weapon/gun/projectile/automatic/l6_saw/update_icon() - icon_state = "l6[cover_open ? "open" : "closed"][magazine ? round(magazine.ammo_count() * 2, 25) : "-empty"]" + icon_state = "l6[cover_open ? "open" : "closed"][magazine ? Ceiling(get_ammo(0)/12.5)*25 : "-empty"]" /obj/item/weapon/gun/projectile/automatic/l6_saw/afterattack(atom/target as mob|obj|turf, mob/living/user as mob|obj, flag, params) //what I tried to do here is just add a check to see if the cover is open or not and add an icon_state change because I can't figure out how c-20rs do it with overlays diff --git a/code/modules/projectiles/guns/projectile/revolver.dm b/code/modules/projectiles/guns/projectile/revolver.dm index d8f6d1dbff0..a76b6e19cd9 100644 --- a/code/modules/projectiles/guns/projectile/revolver.dm +++ b/code/modules/projectiles/guns/projectile/revolver.dm @@ -15,7 +15,7 @@ return ..(0, 1) /obj/item/weapon/gun/projectile/revolver/attackby(var/obj/item/A as obj, mob/user as mob) - var/num_loaded = magazine.attackby(A, user) + var/num_loaded = magazine.attackby(A, user, 1) if(num_loaded) user << "You load [num_loaded] shell\s into \the [src]." A.update_icon() @@ -161,7 +161,7 @@ spun = 1 /obj/item/weapon/gun/projectile/revolver/russian/attackby(var/obj/item/A as obj, mob/user as mob) - var/num_loaded = magazine.attackby(A, user) + var/num_loaded = ..() if(num_loaded) user.visible_message("[user] loads a single bullet into the revolver and spins the chamber.", "You load a single bullet into the chamber and spin it.") else diff --git a/code/modules/projectiles/guns/projectile/shotgun.dm b/code/modules/projectiles/guns/projectile/shotgun.dm index 1f898300704..60f94f2fe63 100644 --- a/code/modules/projectiles/guns/projectile/shotgun.dm +++ b/code/modules/projectiles/guns/projectile/shotgun.dm @@ -13,7 +13,7 @@ var/pumped = 0 /obj/item/weapon/gun/projectile/shotgun/attackby(var/obj/item/A as obj, mob/user as mob) - var/num_loaded = magazine.attackby(A, user) + var/num_loaded = magazine.attackby(A, user, 1) if(num_loaded) user << "You load [num_loaded] shell\s into \the [src]!" A.update_icon() From 05f0b898b777f2bc68516d8ab41078661b0b084f Mon Sep 17 00:00:00 2001 From: sirbayer Date: Mon, 13 Jan 2014 14:08:38 -0800 Subject: [PATCH 7/8] rechargestation.dm has some real colon cancer, man. --- code/game/machinery/rechargestation.dm | 4 +++- code/modules/projectiles/guns/energy/laser.dm | 5 +++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/code/game/machinery/rechargestation.dm b/code/game/machinery/rechargestation.dm index 401acff9da5..a17948ecdff 100644 --- a/code/game/machinery/rechargestation.dm +++ b/code/game/machinery/rechargestation.dm @@ -277,7 +277,9 @@ O:icon_state = "flash" if(istype(O,/obj/item/weapon/gun/energy/taser/cyborg)) if(O:power_supply.charge < O:power_supply.maxcharge) - O:power_supply.give(O:charge_cost * coeff) + var/obj/item/weapon/gun/energy/G = O + var/obj/item/ammo_casing/energy/S = G.ammo_type[G.select] + O:power_supply.give(S.e_cost * coeff) O:update_icon() else O:charge_tick = 0 diff --git a/code/modules/projectiles/guns/energy/laser.dm b/code/modules/projectiles/guns/energy/laser.dm index fca677771d3..cfb0e93b773 100644 --- a/code/modules/projectiles/guns/energy/laser.dm +++ b/code/modules/projectiles/guns/energy/laser.dm @@ -54,8 +54,9 @@ obj/item/weapon/gun/energy/laser/retro if(isrobot(src.loc)) var/mob/living/silicon/robot/R = src.loc if(R && R.cell) - if(R.cell.use(100)) - chambered = ammo_type[select] + var/obj/item/ammo_casing/energy/shot = ammo_type[select] //Necessary to find cost of shot + if(R.cell.use(shot.e_cost)) + chambered = shot chambered.newshot() return From 0829de6ffcf42e984334a3df76e73180fc3fd719 Mon Sep 17 00:00:00 2001 From: sirbayer Date: Mon, 13 Jan 2014 14:53:50 -0800 Subject: [PATCH 8/8] who added a damn cyborg crossbow jesus --- code/modules/projectiles/guns/energy/stun.dm | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/code/modules/projectiles/guns/energy/stun.dm b/code/modules/projectiles/guns/energy/stun.dm index e172f715e54..4fc9a2a7375 100644 --- a/code/modules/projectiles/guns/energy/stun.dm +++ b/code/modules/projectiles/guns/energy/stun.dm @@ -88,20 +88,19 @@ update_icon() return -/obj/item/weapon/gun/energy/crossbow/cyborg/process_chambered() - if(in_chamber) - return 1 +/obj/item/weapon/gun/energy/crossbow/cyborg/newshot() if(isrobot(src.loc)) var/mob/living/silicon/robot/R = src.loc if(R && R.cell) - R.cell.use(100) - in_chamber = new /obj/item/projectile/energy/bolt(src) - return 1 - return 0 + var/obj/item/ammo_casing/energy/shot = ammo_type[select] //Necessary to find cost of shot + if(R.cell.use(shot.e_cost)) + chambered = shot + chambered.newshot() + return /obj/item/weapon/gun/energy/crossbow/largecrossbow name = "Energy Crossbow" desc = "A weapon favored by syndicate infiltration teams." w_class = 4.0 force = 10 - m_amt = 200000 + m_amt = 200000