diff --git a/code/game/machinery/autolathe.dm b/code/game/machinery/autolathe.dm index 16f4339e1fd..2d3185f1f62 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/machinery/portable_turret.dm b/code/game/machinery/portable_turret.dm index 95ddb69ab94..2c2549bf579 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/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/game/objects/items/weapons/storage/boxes.dm b/code/game/objects/items/weapons/storage/boxes.dm index b1673bd3286..879622ab01a 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 91c1706d7cf..b30fb220fb2 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,12 +28,17 @@ icon_state = "[initial(icon_state)][BB ? "-live" : ""]" desc = "[initial(desc)][BB ? "" : " This one is spent"]" +/obj/item/ammo_casing/proc/newshot() //For energy weapons and shotgun shells. + if (!BB) + BB = new projectile_type(src) + return + //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 = CONDUCT @@ -47,6 +54,7 @@ var/max_ammo = 7 var/multiple_sprites = 0 var/caliber + var/multiload = 1 /obj/item/ammo_box/New() @@ -73,15 +81,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 +99,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) @@ -100,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 facac4e2206..71f5319eb1a 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" @@ -57,20 +51,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 @@ -106,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 diff --git a/code/modules/projectiles/ammunition/energy.dm b/code/modules/projectiles/ammunition/energy.dm new file mode 100644 index 00000000000..b6557e600d0 --- /dev/null +++ b/code/modules/projectiles/ammunition/energy.dm @@ -0,0 +1,106 @@ +/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/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" + 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..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 stored_ammo.len + return ..() /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,13 +41,15 @@ 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" 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" @@ -54,6 +57,7 @@ ammo_type = /obj/item/ammo_casing/shotgun/beanbag caliber = "shotgun" max_ammo = 2 + multiload = 0 ///////////EXTERNAL MAGAZINES//////////////// /obj/item/ammo_box/magazine/m9mm @@ -131,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 new file mode 100644 index 00000000000..e530d7c2fca --- /dev/null +++ b/code/modules/projectiles/ammunition/special.dm @@ -0,0 +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 + +/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 + +/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/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 4afd2a7a420..d7309b080e3 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -16,26 +16,32 @@ 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 - proj.silenced = silenced - 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,63 +77,16 @@ 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) + if(!chambered.fire(target, user, params, , silenced)) + 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"]!") - - 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 - + shoot_with_empty_chamber(user) + process_chamber() update_icon() if(user.hand) diff --git a/code/modules/projectiles/guns/energy.dm b/code/modules/projectiles/guns/energy.dm index 76aa1482568..bc3f4208b9f 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 = Ceiling(ratio*4) * 25 + 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..cfb0e93b773 100644 --- a/code/modules/projectiles/guns/energy/laser.dm +++ b/code/modules/projectiles/guns/energy/laser.dm @@ -3,16 +3,16 @@ 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,36 +50,41 @@ 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 + 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/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" 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 +93,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 +130,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..9bc774e8095 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() ..() @@ -92,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]" @@ -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 1663bcc1071..241a7145478 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 = 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) diff --git a/code/modules/projectiles/guns/energy/stun.dm b/code/modules/projectiles/guns/energy/stun.dm index 3481d53c167..4fc9a2a7375 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 @@ -94,16 +88,15 @@ 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" @@ -111,6 +104,3 @@ w_class = 4.0 force = 10 m_amt = 200000 - projectile_type = "/obj/item/projectile/energy/bolt/large" - - 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 2786136427e..a4b7da17b15 100644 --- a/code/modules/projectiles/guns/magic.dm +++ b/code/modules/projectiles/guns/magic.dm @@ -7,29 +7,29 @@ fire_sound = 'sound/weapons/emitter.ogg' flags = CONDUCT w_class = 5 - var/projectile_type = "/obj/item/projectile/magic" var/max_charges = 6 var/charges = 0 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/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 bc9dd552202..b25e68c4aa6 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 = "nothingwand" item_state = "wand" w_class = 2 @@ -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,14 +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) 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) @@ -47,7 +49,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 = "deathwand" max_charges = 3 //3, 2, 2, 1 @@ -62,7 +64,7 @@ /obj/item/weapon/gun/magic/wand/resurrection name = "wand of healing" 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 = "revivewand" max_charges = 10 //10, 5, 5, 4 @@ -75,7 +77,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 = "polywand" max_charges = 10 //10, 5, 5, 4 @@ -87,7 +89,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 = "telewand" max_charges = 10 //10, 5, 5, 4 @@ -102,7 +104,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 = "doorwand" max_charges = 20 //20, 10, 10, 7 @@ -112,7 +114,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 = "firewand" 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..875bd2622f3 100644 --- a/code/modules/projectiles/guns/projectile.dm +++ b/code/modules/projectiles/guns/projectile.dm @@ -6,10 +6,8 @@ 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 - var/obj/item/ammo_casing/chambered = null // The round (not bullet) that is in the chamber. /obj/item/weapon/gun/projectile/New() ..() @@ -18,28 +16,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 +36,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 +50,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 +65,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/automatic.dm b/code/modules/projectiles/guns/projectile/automatic.dm index 29a23cbfb23..93eba8d5eff 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' @@ -58,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 @@ -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 @@ -84,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/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 7cd352a177e..a76b6e19cd9 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() @@ -12,27 +11,13 @@ 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, 1) 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() @@ -47,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." @@ -68,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 @@ -76,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) @@ -177,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 = ..() 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 @@ -222,32 +191,35 @@ 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(!chambered) - user.visible_message("\red *click*", "\red *click*") + 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(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 - 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 241ab5faceb..60f94f2fe63 100644 --- a/code/modules/projectiles/guns/projectile/shotgun.dm +++ b/code/modules/projectiles/guns/projectile/shotgun.dm @@ -8,33 +8,18 @@ flags = 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 /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, 1) 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 +40,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 @@ -72,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 @@ -86,7 +68,6 @@ flags = 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/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index 63152bc832a..3fed362bf38 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -25,7 +25,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/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 54e8814d22a..d98d1c03d3c 100644 --- a/code/modules/projectiles/projectile/bullets.dm +++ b/code/modules/projectiles/projectile/bullets.dm @@ -19,6 +19,11 @@ weaken = 5 +/obj/item/projectile/bullet/pellet + name = "pellet" + damage = 15 + + /obj/item/projectile/bullet/midbullet damage = 20 stun = 5 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..a2fb2d14c72 100644 --- a/code/modules/reagents/syringe_gun.dm +++ b/code/modules/reagents/syringe_gun.dm @@ -13,20 +13,31 @@ var/list/syringes = list() var/max_syringes = 1 -/obj/item/weapon/gun/syringe/process_chambered() - 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 - - 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 + + if(!S) return + + 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 + 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() ..() @@ -37,22 +48,22 @@ 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) 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 diff --git a/icons/obj/projectiles.dmi b/icons/obj/projectiles.dmi index 2844889a4da..a2edc4cc054 100644 Binary files a/icons/obj/projectiles.dmi and b/icons/obj/projectiles.dmi differ 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 4a1cd48528e..58437ae429a 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -1079,11 +1079,14 @@ #include "code\modules\power\singularity\particle_accelerator\particle_emitter.dm" #include "code\modules\power\singularity\particle_accelerator\particle_power.dm" #include "code\modules\projectiles\ammunition.dm" +#include "code\modules\projectiles\firing.dm" #include "code\modules\projectiles\gun.dm" #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"