diff --git a/code/__DEFINES/combat.dm b/code/__DEFINES/combat.dm index c137c320390..ca293307099 100644 --- a/code/__DEFINES/combat.dm +++ b/code/__DEFINES/combat.dm @@ -57,7 +57,6 @@ //Gun Stuff #define SAWN_INTACT 0 #define SAWN_OFF 1 - #define SAWN_SAWING -1 #define WEAPON_LIGHT 0 #define WEAPON_MEDIUM 1 diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm index 97af407622b..bddb01b42e1 100644 --- a/code/_onclick/click.dm +++ b/code/_onclick/click.dm @@ -317,8 +317,7 @@ LE.current = T LE.yo = U.y - T.y LE.xo = U.x - T.x - spawn(1) - LE.process() + LE.fire() // Simple helper to face what you clicked on, in case it should be needed in more than one place /mob/proc/face_atom(var/atom/A) diff --git a/code/_onclick/oldcode.dm b/code/_onclick/oldcode.dm index b3f2c1dde05..89b1131a6f0 100644 --- a/code/_onclick/oldcode.dm +++ b/code/_onclick/oldcode.dm @@ -369,8 +369,7 @@ A.current = T A.yo = U.y - T.y A.xo = U.x - T.x - spawn( 1 ) - A.process() + A.fire() usr.next_move = world.time + 6 return diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index 92c894cba10..b169deeee10 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -331,4 +331,4 @@ /atom/movable/CanPass(atom/movable/mover, turf/target, height=1.5) if(buckled_mob == mover) return 1 - return ..() \ No newline at end of file + return ..() diff --git a/code/game/gamemodes/miniantags/abduction/abduction_gear.dm b/code/game/gamemodes/miniantags/abduction/abduction_gear.dm index d1c5428d093..b98f2512f65 100644 --- a/code/game/gamemodes/miniantags/abduction/abduction_gear.dm +++ b/code/game/gamemodes/miniantags/abduction/abduction_gear.dm @@ -308,16 +308,7 @@ icon_state = "alienpistol" item_state = "alienpistol" origin_tech = "combat=5;materials=4;powerstorage=3;abductor=3" - -/obj/item/weapon/gun/energy/decloner/alien/can_trigger_gun(user) - if(!..()) - return 0 - if(istype(user, /mob/living/carbon/human)) - var/mob/living/carbon/human/H = user - if(H.get_species() != "Abductor") - to_chat(user, "UNAUTHORIZED -- UNAUTHORIZED") - return 0 - return 1 + restricted_species = list("Abductor") /obj/item/weapon/paper/abductor name = "Dissection Guide" diff --git a/code/game/machinery/turrets.dm b/code/game/machinery/turrets.dm index ff24aa01027..f0b6ce34ef7 100644 --- a/code/game/machinery/turrets.dm +++ b/code/game/machinery/turrets.dm @@ -248,8 +248,7 @@ A.current = T A.yo = U.y - T.y A.xo = U.x - T.x - spawn( 0 ) - A.process() + A.fire() return diff --git a/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm b/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm index afae056b99f..9311ab0592f 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm @@ -123,8 +123,8 @@ Doesn't work on other aliens/AI.*/ A.firer = src A.yo = U.y - T.y A.xo = U.x - T.x - spawn(1) - A.process() + A.fire() + A.newtonian_move(get_dir(U, T)) return /mob/living/carbon/alien/humanoid/proc/resin() // -- TLE @@ -185,4 +185,4 @@ Doesn't work on other aliens/AI.*/ adjustPlasma(-amount) return 1 - return 0 \ No newline at end of file + return 0 diff --git a/code/modules/mob/living/simple_animal/bot/ed209bot.dm b/code/modules/mob/living/simple_animal/bot/ed209bot.dm index 56f61622b17..34888dd3488 100644 --- a/code/modules/mob/living/simple_animal/bot/ed209bot.dm +++ b/code/modules/mob/living/simple_animal/bot/ed209bot.dm @@ -438,8 +438,7 @@ Auto Patrol[]"}, A.current = U A.yo = U.y - T.y A.xo = U.x - T.x - spawn(0) - A.process() + A.fire() /mob/living/simple_animal/bot/ed209/attack_alien(mob/living/carbon/alien/user) ..() diff --git a/code/modules/mob/living/simple_animal/friendly/corgi.dm b/code/modules/mob/living/simple_animal/friendly/corgi.dm index 4f8b7753caf..e8ba27fa07d 100644 --- a/code/modules/mob/living/simple_animal/friendly/corgi.dm +++ b/code/modules/mob/living/simple_animal/friendly/corgi.dm @@ -632,8 +632,7 @@ A.current = T A.yo = U.y - T.y A.xo = U.x - T.x - spawn( 0 ) - A.process() + A.fire() return /mob/living/simple_animal/pet/corgi/Ian/borgi/Life() @@ -657,4 +656,4 @@ s.start() respawnable_list += src qdel(src) - return \ No newline at end of file + return diff --git a/code/modules/mob/living/simple_animal/vox.dm b/code/modules/mob/living/simple_animal/vox.dm index 0ca934739d5..1a46e46e4e4 100644 --- a/code/modules/mob/living/simple_animal/vox.dm +++ b/code/modules/mob/living/simple_animal/vox.dm @@ -65,15 +65,26 @@ if ((O.client && !( O.blinded ))) to_chat(O, "\red [src] launches a razor-sharp quill at [target]!") - //var/obj/item/weapon/arrow/quill/Q = new(loc) - //Q.fingerprintslast = src.ckey - //Q.throw_at(target,10,30) + var/obj/item/weapon/quill/Q = new(loc) + Q.fingerprintslast = src.ckey + Q.throw_at(target,10,30) + quills-- spawn(100) to_chat(src, "\red You feel a fresh quill slide into place.") quills++ +/obj/item/weapon/quill + name = "vox quill" + desc = "A wickedly barbed quill from some bizarre animal." + icon_state = "quill" + item_state = "quill" + throwforce = 5 + w_class = 3.0 + sharp = 1 + edge = 0 + /mob/living/simple_animal/vox/armalis/verb/message_mob() set category = "Alien" set name = "Commune with creature" diff --git a/code/modules/power/singularity/emitter.dm b/code/modules/power/singularity/emitter.dm index 4f0d72e1511..06ba1a093f8 100644 --- a/code/modules/power/singularity/emitter.dm +++ b/code/modules/power/singularity/emitter.dm @@ -213,7 +213,7 @@ else // Any other A.yo = -20 A.xo = 0 - A.process() //TODO: Carn: check this out + A.fire() //TODO: Carn: check this out /obj/machinery/power/emitter/attackby(obj/item/W, mob/user, params) diff --git a/code/modules/projectiles/ammunition.dm b/code/modules/projectiles/ammunition.dm index ab3c224ac08..f47a4db719b 100644 --- a/code/modules/projectiles/ammunition.dm +++ b/code/modules/projectiles/ammunition.dm @@ -168,6 +168,8 @@ A.update_icon() update_icon() + return num_loaded + /obj/item/ammo_box/attack_self(mob/user as mob) var/obj/item/ammo_casing/A = get_round() if(A) diff --git a/code/modules/projectiles/ammunition/ammo_casings.dm b/code/modules/projectiles/ammunition/ammo_casings.dm index 205d9668188..a5af74e4d6c 100644 --- a/code/modules/projectiles/ammunition/ammo_casings.dm +++ b/code/modules/projectiles/ammunition/ammo_casings.dm @@ -82,6 +82,15 @@ caliber = "n762" projectile_type = /obj/item/projectile/bullet +/obj/item/ammo_casing/caseless/magspear + name = "magnetic spear" + desc = "A reusable spear that is typically loaded into kinetic spearguns." + projectile_type = /obj/item/projectile/bullet/reusable/magspear + caliber = "speargun" + icon_state = "magspear" + throwforce = 15 //still deadly when thrown + throw_speed = 3 + /obj/item/ammo_casing/shotgun name = "shotgun slug" desc = "A 12 gauge lead slug." @@ -278,15 +287,6 @@ icon_state = "40mmHE" projectile_type = /obj/item/projectile/bullet/a40mm -/obj/item/ammo_casing/caseless/magspear - name = "magnetic spear" - desc = "A reusable spear that is typically loaded into kinetic spearguns." - projectile_type = /obj/item/projectile/bullet/reusable/magspear - caliber = "speargun" - icon_state = "magspear" - throwforce = 15 //still deadly when thrown - throw_speed = 3 - /obj/item/ammo_casing/caseless/foam_dart name = "foam dart" desc = "It's nerf or nothing! Ages 8 and up." diff --git a/code/modules/projectiles/ammunition/energy.dm b/code/modules/projectiles/ammunition/energy.dm index 082feef351e..d7f26ff3919 100644 --- a/code/modules/projectiles/ammunition/energy.dm +++ b/code/modules/projectiles/ammunition/energy.dm @@ -226,5 +226,6 @@ var/teleport_target /obj/item/ammo_casing/energy/teleport/newshot() + ..() var/obj/item/projectile/energy/teleport/T = BB T.teleport_target = teleport_target diff --git a/code/modules/projectiles/ammunition/magazines.dm b/code/modules/projectiles/ammunition/magazines.dm index 367270d0cd1..cdb097fa55d 100644 --- a/code/modules/projectiles/ammunition/magazines.dm +++ b/code/modules/projectiles/ammunition/magazines.dm @@ -82,9 +82,6 @@ max_ammo = 4 multiload = 0 -/obj/item/ammo_box/magazine/internal/shot/lethal - ammo_type = /obj/item/ammo_casing/shotgun/buckshot - /obj/item/ammo_box/magazine/internal/shot/ammo_count(countempties = 1) if (!countempties) var/boolets = 0 @@ -95,6 +92,14 @@ else return ..() +/obj/item/ammo_box/magazine/internal/shot/tube + name = "dual feed shotgun internal tube" + ammo_type = /obj/item/ammo_casing/shotgun/rubbershot + max_ammo = 4 + +/obj/item/ammo_box/magazine/internal/shot/lethal + ammo_type = /obj/item/ammo_casing/shotgun/buckshot + /obj/item/ammo_box/magazine/internal/shot/com name = "combat shotgun internal magazine" ammo_type = /obj/item/ammo_casing/shotgun/buckshot @@ -148,6 +153,10 @@ max_ammo = 5 multiload = 1 +/obj/item/ammo_box/magazine/internal/boltaction/enchanted + max_ammo =1 + ammo_type = /obj/item/ammo_casing/a762/enchanted + /obj/item/ammo_box/magazine/internal/shot/toy ammo_type = /obj/item/ammo_casing/caseless/foam_dart caliber = "foam_force" diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index 458ab877c78..f86bfff5abb 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -32,14 +32,14 @@ var/firing_burst = 0 //Prevent the weapon from firing again while already firing var/semicd = 0 //cooldown handler var/weapon_weight = WEAPON_LIGHT + var/list/restricted_species var/spread = 0 var/randomspread = 1 var/unique_rename = 0 //allows renaming with a pen var/unique_reskin = 0 //allows one-time reskinning - var/reskinned = 0 //whether or not the gun has been reskinned - var/current_skin = null + var/current_skin = null //the skin choice if we had a reskin var/list/options = list() lefthand_file = 'icons/mob/inhands/guns_lefthand.dmi' @@ -69,7 +69,7 @@ /obj/item/weapon/gun/examine(mob/user) ..() - if(unique_reskin && !reskinned) + if(unique_reskin && !current_skin) to_chat(user, "Alt-click it to reskin it.") if(unique_rename) to_chat(user, "Use a pen on it to rename it.") @@ -156,6 +156,9 @@ /obj/item/weapon/gun/proc/can_trigger_gun(var/mob/living/user) if(!user.can_use_guns(src)) return 0 + if(restricted_species && restricted_species.len && !(user.get_species() in restricted_species)) + to_chat(user, "[src] is incompatible with your biology!") + return 0 return 1 obj/item/weapon/gun/proc/newshot() @@ -309,22 +312,18 @@ obj/item/weapon/gun/proc/newshot() if(user.incapacitated()) to_chat(user, "You can't do that right now!") return - if(unique_reskin && !reskinned && loc == user) + if(unique_reskin && !current_skin && loc == user) reskin_gun(user) /obj/item/weapon/gun/proc/reskin_gun(mob/M) var/choice = input(M,"Warning, you can only reskin your weapon once!","Reskin Gun") in options - if(src && choice && !M.stat && in_range(M,src) && !M.restrained() && M.canmove) + if(src && choice && !current_skin && !M.incapacitated() && in_range(M,src)) if(options[choice] == null) return - if(sawn_state == SAWN_OFF) - icon_state = options[choice] + "-sawn" - else - icon_state = options[choice] - current_skin = icon_state + current_skin = options[choice] to_chat(M, "Your gun is now skinned as [choice]. Say hello to your new friend.") - reskinned = 1 + update_icon() /obj/item/weapon/gun/proc/rename_gun(mob/M) var/input = stripped_input(M,"What do you want to name the gun?", ,"", MAX_NAME_LEN) diff --git a/code/modules/projectiles/guns/alien.dm b/code/modules/projectiles/guns/alien.dm index 0cb6e4034d2..45d8d13c94d 100644 --- a/code/modules/projectiles/guns/alien.dm +++ b/code/modules/projectiles/guns/alien.dm @@ -1,14 +1,89 @@ +/obj/item/weapon/gun/projectile/automatic/spikethrower + name = "\improper Vox spike thrower" + desc = "A vicious alien projectile weapon. Parts of it quiver gelatinously, as though the thing is insectile and alive." + icon_state = "spikethrower" + item_state = "spikethrower" + w_class = 2 + fire_sound_text = "a strange noise" + mag_type = /obj/item/ammo_box/magazine/internal/spikethrower + burst_size = 2 + fire_delay = 3 + can_suppress = 0 + var/charge_tick = 0 + var/charge_delay = 15 + restricted_species = list("Vox", "Vox Armalis") + +/obj/item/weapon/gun/projectile/automatic/spikethrower/New() + ..() + processing_objects.Add(src) + +/obj/item/weapon/gun/projectile/automatic/spikethrower/Destroy() + processing_objects.Remove(src) + return ..() + +/obj/item/weapon/gun/projectile/automatic/spikethrower/update_icon() + ..() + overlays.Cut() + icon_state = "spikethrower-[Ceiling(get_ammo(0)/5)]" + +/obj/item/weapon/gun/projectile/automatic/spikethrower/process() + charge_tick++ + if(charge_tick < charge_delay || !magazine) + return + charge_tick = 0 + var/obj/item/ammo_casing/caseless/spike/S = new(get_turf(src)) + magazine.give_round(S) + return 1 + +/obj/item/weapon/gun/projectile/automatic/spikethrower/attack_self() + return + +/obj/item/weapon/gun/projectile/automatic/spikethrower/process_chamber(eject_casing = 0, empty_chamber = 1) + ..() + +/obj/item/ammo_box/magazine/internal/spikethrower + name = "\improper Vox spikethrower internal magazine" + ammo_type = /obj/item/ammo_casing/caseless/spike + caliber = "spike" + max_ammo = 10 + +/obj/item/ammo_casing/caseless/spike + name = "alloy spike" + desc = "A broadhead spike made out of a weird silvery metal." + projectile_type = /obj/item/projectile/bullet/spike + sharp = 1 + edge = 0 + throwforce = 5 + w_class = 3 + caliber = "spike" + icon_state = "bolt" + fire_sound = 'sound/weapons/bladeslice.ogg' + +/obj/item/projectile/bullet/spike + name = "alloy spike" + desc = "It's about a foot of weird silvery metal with a wicked point." + damage = 25 + stun = 1 + armour_penetration = 30 + icon_state = "magspear" + +/obj/item/projectile/bullet/spike/on_hit(atom/target, blocked = 0) + if((blocked != 100) && istype(target, /mob/living/carbon/human)) + var/mob/living/carbon/human/H = target + H.drip(500) + ..() + //This gun only functions for armalis. The on-sprite is too huge to render properly on other sprites. /obj/item/weapon/gun/energy/noisecannon name = "alien heavy cannon" desc = "It's some kind of enormous alien weapon, as long as a man is tall." - icon_state = "noisecannon" item_state = "noisecannon" recoil = 1 force = 10 ammo_type = list(/obj/item/ammo_casing/energy/sonic) cell_type = "/obj/item/weapon/stock_parts/cell/super" + restricted_species = list("Vox Armalis") /obj/item/weapon/gun/energy/noisecannon/attack_hand(mob/user as mob) if(loc != user) @@ -32,7 +107,6 @@ //Projectile. /obj/item/projectile/energy/sonic name = "distortion" - icon = 'icons/obj/machines/particle_accelerator.dmi' icon_state = "particle" damage = 60 damage_type = BRUTE @@ -42,7 +116,3 @@ embed = 0 weaken = 5 stun = 5 - -/obj/item/projectile/energy/sonic/proc/split() - //TODO: create two more projectiles to either side of this one, fire at targets to the side of target turf. - return diff --git a/code/modules/projectiles/guns/energy.dm b/code/modules/projectiles/guns/energy.dm index b699cfe104c..eb9beda2d2d 100644 --- a/code/modules/projectiles/guns/energy.dm +++ b/code/modules/projectiles/guns/energy.dm @@ -122,9 +122,12 @@ else if(!shaded_charge) for(var/i = ratio, i >= 1, i--) - overlays += image(icon = icon, icon_state = iconState, pixel_x = ammo_x_offset * (i -1)) - else - overlays += image(icon = icon, icon_state = "[icon_state]_charge[ratio]") + overlays += image(icon = icon, icon_state = icon_state, pixel_x = ammo_x_offset * (i -1)) + else + if(modifystate) + overlays += image(icon = icon, icon_state = "[icon_state]_[shot.select_name]_charge[ratio]") + else + overlays += image(icon = icon, icon_state = "[icon_state]_charge[ratio]") if(F && can_flashlight) var/iconF = "flight" if(F.on) diff --git a/code/modules/projectiles/guns/energy/laser.dm b/code/modules/projectiles/guns/energy/laser.dm index 952c61aaf00..2db25832721 100644 --- a/code/modules/projectiles/guns/energy/laser.dm +++ b/code/modules/projectiles/guns/energy/laser.dm @@ -119,6 +119,7 @@ item_state = "laser" ammo_type = list(/obj/item/ammo_casing/energy/immolator) origin_tech = "combat=4;materials=4;magnets=3;plasmatech=2" + shaded_charge = 1 ////////Laser Tag//////////////////// diff --git a/code/modules/projectiles/guns/energy/nuclear.dm b/code/modules/projectiles/guns/energy/nuclear.dm index 511fc3eee59..2ef193a6c37 100644 --- a/code/modules/projectiles/guns/energy/nuclear.dm +++ b/code/modules/projectiles/guns/energy/nuclear.dm @@ -61,7 +61,8 @@ icon_state = "bsgun" force = 7 ammo_type = list(/obj/item/ammo_casing/energy/electrode/hos, /obj/item/ammo_casing/energy/laser/hos) - ammo_x_offset = 4 + ammo_x_offset = 1 + shaded_charge = 1 /obj/item/weapon/gun/energy/gun/turret name = "hybrid turret gun" diff --git a/code/modules/projectiles/guns/energy/pulse.dm b/code/modules/projectiles/guns/energy/pulse.dm index 6b398426e4e..3ffa3b59bbb 100644 --- a/code/modules/projectiles/guns/energy/pulse.dm +++ b/code/modules/projectiles/guns/energy/pulse.dm @@ -64,7 +64,7 @@ /obj/item/weapon/gun/energy/pulse/pistol/m1911 name = "\improper M1911-P" desc = "A compact pulse core in a classic handgun frame for Nanotrasen officers. It's not the size of the gun, it's the size of the hole it puts through people." - icon_state = "m1911-p" + icon_state = "m1911" item_state = "gun" cell_type = "/obj/item/weapon/stock_parts/cell/infinite" diff --git a/code/modules/projectiles/guns/energy/special.dm b/code/modules/projectiles/guns/energy/special.dm index bee8ac46ed2..931647d0daa 100644 --- a/code/modules/projectiles/guns/energy/special.dm +++ b/code/modules/projectiles/guns/energy/special.dm @@ -375,6 +375,7 @@ w_class = 3 origin_tech = "combat=4;plasmatech=3" ammo_type = list(/obj/item/ammo_casing/energy/toxplasma) + shaded_charge = 1 /obj/item/weapon/gun/energy/sniperrifle name = "L.W.A.P. Sniper Rifle" @@ -386,6 +387,7 @@ w_class = 4 zoomable = TRUE zoom_amt = 7 //Long range, enough to see in front of you, but no tiles behind you. + shaded_charge = 1 /obj/item/weapon/gun/energy/temperature name = "temperature gun" @@ -423,8 +425,9 @@ /obj/item/weapon/gun/energy/temperature/newshot() ..() var/obj/item/ammo_casing/energy/temp/T = chambered - T.temperature = temperature - T.e_cost = e_cost + if(T) + T.temperature = temperature + T.e_cost = e_cost /obj/item/weapon/gun/energy/temperature/attack_self(mob/living/user as mob) user.set_machine(src) @@ -544,8 +547,16 @@ /obj/item/weapon/gun/energy/temperature/update_icon() overlays = 0 update_temperature() + update_user() update_charge() +/obj/item/weapon/gun/energy/temperature/proc/update_user() + if (istype(loc,/mob/living/carbon)) + var/mob/living/carbon/M = loc + M.update_inv_back() + M.update_inv_l_hand() + M.update_inv_r_hand() + /obj/item/weapon/gun/energy/temperature/proc/update_charge() var/charge = power_supply.charge switch(charge) diff --git a/code/modules/projectiles/guns/energy/telegun.dm b/code/modules/projectiles/guns/energy/telegun.dm index 0113f11068c..23dd6455a3e 100644 --- a/code/modules/projectiles/guns/energy/telegun.dm +++ b/code/modules/projectiles/guns/energy/telegun.dm @@ -8,6 +8,7 @@ origin_tech = "combat=6;materials=7;powerstorage=5;bluespace=5;syndicate=4" cell_type = "/obj/item/weapon/stock_parts/cell/crap" ammo_type = list(/obj/item/ammo_casing/energy/teleport) + shaded_charge = 1 var/teleport_target = null /obj/item/weapon/gun/energy/telegun/Destroy() @@ -37,5 +38,6 @@ teleport_target = L[desc] /obj/item/weapon/gun/energy/telegun/newshot() + ..() var/obj/item/ammo_casing/energy/teleport/T = chambered T.teleport_target = teleport_target diff --git a/code/modules/projectiles/guns/projectile.dm b/code/modules/projectiles/guns/projectile.dm index a46bc9a276c..ba752754b42 100644 --- a/code/modules/projectiles/guns/projectile.dm +++ b/code/modules/projectiles/guns/projectile.dm @@ -19,10 +19,10 @@ /obj/item/weapon/gun/projectile/update_icon() ..() - if(reskinned && current_skin) - icon_state = "[current_skin][suppressed ? "-suppressed" : ""]" + if(current_skin) + icon_state = "[current_skin][suppressed ? "-suppressed" : ""][sawn_state ? "-sawn" : ""]" else - icon_state = "[initial(icon_state)][suppressed ? "-suppressed" : ""]" + icon_state = "[initial(icon_state)][suppressed ? "-suppressed" : ""][sawn_state ? "-sawn" : ""]" /obj/item/weapon/gun/projectile/process_chamber(eject_casing = 1, empty_chamber = 1) var/obj/item/ammo_casing/AC = chambered //Find chambered round @@ -151,6 +151,40 @@ playsound(loc, 'sound/weapons/empty.ogg', 50, 1, -1) return (OXYLOSS) +/obj/item/weapon/gun/projectile/proc/sawoff(mob/user) + if(sawn_state == SAWN_OFF) + to_chat(user, "\The [src] is already shortened!") + return + user.changeNext_move(CLICK_CD_MELEE) + user.visible_message("[user] begins to shorten \the [src].", "You begin to shorten \the [src]...") + + //if there's any live ammo inside the gun, makes it go off + if(blow_up(user)) + user.visible_message("\The [src] goes off!", "\The [src] goes off in your face!") + return + + if(do_after(user, 30, target = src)) + if(sawn_state == SAWN_OFF) + return + user.visible_message("[user] shortens \the [src]!", "You shorten \the [src].") + name = "sawn-off [src.name]" + desc = sawn_desc + w_class = 3 + item_state = "gun"//phil235 is it different with different skin? + slot_flags &= ~SLOT_BACK //you can't sling it on your back + slot_flags |= SLOT_BELT //but you can wear it on your belt (poorly concealed under a trenchcoat, ideally) + sawn_state = SAWN_OFF + update_icon() + return 1 + +// Sawing guns related proc +/obj/item/weapon/gun/projectile/proc/blow_up(mob/user) + . = 0 + for(var/obj/item/ammo_casing/AC in magazine.stored_ammo) + if(AC.BB) + process_fire(user, user,0) + . = 1 + /obj/item/weapon/suppressor name = "suppressor" desc = "A universal syndicate small-arms suppressor for maximum espionage." diff --git a/code/modules/projectiles/guns/projectile/automatic.dm b/code/modules/projectiles/guns/projectile/automatic.dm index b3d09e049cd..ebd106d69b4 100644 --- a/code/modules/projectiles/guns/projectile/automatic.dm +++ b/code/modules/projectiles/guns/projectile/automatic.dm @@ -10,13 +10,6 @@ /obj/item/weapon/gun/projectile/automatic/isHandgun() return 0 -/obj/item/weapon/gun/projectile/automatic/proto - name = "\improper Nanotrasen Saber SMG" - desc = "A prototype three-round burst 9mm submachine gun, designated 'SABR'. Has a threaded barrel for suppressors." - icon_state = "saber" - mag_type = /obj/item/ammo_box/magazine/smgm9mm - origin_tech = "combat=4;materials=2" - /obj/item/weapon/gun/projectile/automatic/update_icon() ..() overlays.Cut() @@ -25,7 +18,6 @@ if(select == 1) overlays += "[initial(icon_state)]burst" icon_state = "[initial(icon_state)][magazine ? "-[magazine.max_ammo]" : ""][chambered ? "" : "-e"][suppressed ? "-suppressed" : ""]" - return /obj/item/weapon/gun/projectile/automatic/attackby(var/obj/item/A as obj, mob/user as mob, params) . = ..() @@ -66,7 +58,6 @@ playsound(user, 'sound/weapons/empty.ogg', 100, 1) update_icon() - return /obj/item/weapon/gun/projectile/automatic/can_shoot() return get_ammo() @@ -76,7 +67,13 @@ playsound(loc, 'sound/weapons/smg_empty_alarm.ogg', 40, 1) update_icon() alarmed = 1 - return + +/obj/item/weapon/gun/projectile/automatic/proto + name = "\improper Nanotrasen Saber SMG" + desc = "A prototype three-round burst 9mm submachine gun, designated 'SABR'. Has a threaded barrel for suppressors." + icon_state = "saber" + mag_type = /obj/item/ammo_box/magazine/smgm9mm + origin_tech = "combat=4;materials=2" /obj/item/weapon/gun/projectile/automatic/c20r name = "\improper C-20r SMG" @@ -92,17 +89,14 @@ /obj/item/weapon/gun/projectile/automatic/c20r/New() ..() update_icon() - return /obj/item/weapon/gun/projectile/automatic/c20r/afterattack(atom/target as mob|obj|turf|area, mob/living/user as mob|obj, flag) ..() empty_alarm() - return /obj/item/weapon/gun/projectile/automatic/c20r/update_icon() ..() icon_state = "c20r[magazine ? "-[Ceiling(get_ammo(0)/4)*4]" : ""][chambered ? "" : "-e"][suppressed ? "-suppressed" : ""]" - return /obj/item/weapon/gun/projectile/automatic/wt550 name = "security auto rifle" @@ -118,7 +112,6 @@ /obj/item/weapon/gun/projectile/automatic/wt550/update_icon() ..() icon_state = "wt550[magazine ? "-[Ceiling(get_ammo(0)/4)*4]" : ""]" - return /obj/item/weapon/gun/projectile/automatic/mini_uzi name = "\improper 'Type U3' Uzi" @@ -146,7 +139,6 @@ ..() underbarrel = new /obj/item/weapon/gun/projectile/revolver/grenadelauncher(src) update_icon() - return /obj/item/weapon/gun/projectile/automatic/m90/afterattack(var/atom/target, var/mob/living/user, flag, params) if(select == 2) @@ -194,7 +186,6 @@ to_chat(user, "You switch to semi-auto.") playsound(user, 'sound/weapons/empty.ogg', 100, 1) update_icon() - return /obj/item/weapon/gun/projectile/automatic/tommygun name = "\improper Thompson SMG" @@ -241,7 +232,6 @@ /obj/item/weapon/gun/projectile/automatic/shotgun/bulldog/New() ..() update_icon() - return /obj/item/weapon/gun/projectile/automatic/shotgun/bulldog/proc/update_magazine() if(magazine) @@ -253,9 +243,7 @@ overlays.Cut() update_magazine() icon_state = "bulldog[chambered ? "" : "-e"]" - return /obj/item/weapon/gun/projectile/automatic/shotgun/bulldog/afterattack(atom/target as mob|obj|turf|area, mob/living/user as mob|obj, flag) ..() empty_alarm() - return diff --git a/code/modules/projectiles/guns/projectile/revolver.dm b/code/modules/projectiles/guns/projectile/revolver.dm index 1a9da6fcf22..902b8daf591 100644 --- a/code/modules/projectiles/guns/projectile/revolver.dm +++ b/code/modules/projectiles/guns/projectile/revolver.dm @@ -263,3 +263,144 @@ desc = "Looks almost like the real thing! Ages 8 and up." origin_tech = "combat=1;materials=1" mag_type = /obj/item/ammo_box/magazine/internal/cylinder/cap + +///////////////////////////// +// DOUBLE BARRELED SHOTGUN // +///////////////////////////// + +/obj/item/weapon/gun/projectile/revolver/doublebarrel + name = "double-barreled shotgun" + desc = "A true classic." + icon_state = "dshotgun" + item_state = "shotgun" + w_class = 4 + force = 10 + flags = CONDUCT + slot_flags = SLOT_BACK + origin_tech = "combat=3;materials=1" + mag_type = /obj/item/ammo_box/magazine/internal/shot/dual + sawn_desc = "Omar's coming!" + unique_rename = 1 + unique_reskin = 1 + +/obj/item/weapon/gun/projectile/revolver/doublebarrel/New() + ..() + options["Default"] = "dshotgun" + options["Dark Red Finish"] = "dshotgun-d" + options["Ash"] = "dshotgun-f" + options["Faded Grey"] = "dshotgun-g" + options["Maple"] = "dshotgun-l" + options["Rosewood"] = "dshotgun-p" + options["Cancel"] = null + +/obj/item/weapon/gun/projectile/revolver/doublebarrel/attackby(obj/item/A, mob/user, params) + ..() + if(istype(A, /obj/item/ammo_box) || istype(A, /obj/item/ammo_casing)) + chamber_round() + if(istype(A, /obj/item/weapon/melee/energy)) + var/obj/item/weapon/melee/energy/W = A + if(W.active) + sawoff(user) + if(istype(A, /obj/item/weapon/circular_saw) || istype(A, /obj/item/weapon/gun/energy/plasmacutter)) + sawoff(user) + +/obj/item/weapon/gun/projectile/revolver/doublebarrel/attack_self(mob/living/user) + var/num_unloaded = 0 + while (get_ammo() > 0) + var/obj/item/ammo_casing/CB + CB = magazine.get_round(0) + chambered = null + CB.loc = get_turf(loc) + CB.update_icon() + num_unloaded++ + if (num_unloaded) + to_chat(user, "You break open \the [src] and unload [num_unloaded] shell\s.") + else + to_chat(user, "[src] is empty.") + +/obj/item/weapon/gun/projectile/revolver/doublebarrel/isHandgun() //contrary to popular opinion, double barrels are not, shockingly, handguns + return 0 + +// IMPROVISED SHOTGUN // + +/obj/item/weapon/gun/projectile/revolver/doublebarrel/improvised + name = "improvised shotgun" + desc = "Essentially a tube that aims shotgun shells." + icon_state = "ishotgun" + item_state = "shotgun" + w_class = 4 + force = 10 + slot_flags = null + origin_tech = "combat=2;materials=2" + mag_type = /obj/item/ammo_box/magazine/internal/shot/improvised + sawn_desc = "I'm just here for the gasoline." + unique_rename = 0 + unique_reskin = 0 + var/slung = 0 + +/obj/item/weapon/gun/projectile/revolver/doublebarrel/improvised/attackby(obj/item/A, mob/user, params) + ..() + if(istype(A, /obj/item/stack/cable_coil) && !sawn_state) + var/obj/item/stack/cable_coil/C = A + if(C.use(10)) + slot_flags = SLOT_BACK + icon_state = "ishotgunsling" + to_chat(user, "You tie the lengths of cable to the shotgun, making a sling.") + slung = 1 + update_icon() + else + to_chat(user, "You need at least ten lengths of cable if you want to make a sling.") + return + +/obj/item/weapon/gun/projectile/revolver/doublebarrel/improvised/update_icon() + ..() + if (slung && (slot_flags & SLOT_BELT) ) + slung = 0 + icon_state = "ishotgun-sawn" + +/obj/item/weapon/gun/projectile/revolver/doublebarrel/improvised/sawoff(mob/user) + . = ..() + if(. && slung) //sawing off the gun removes the sling + new /obj/item/stack/cable_coil(get_turf(src), 10) + slung = 0 + update_icon() + +//caneshotgun + +/obj/item/weapon/gun/projectile/revolver/doublebarrel/improvised/cane + name = "cane" + desc = "A cane used by a true gentleman. Or a clown." + icon = 'icons/obj/weapons.dmi' + icon_state = "cane" + item_state = "stick" + sawn_state = SAWN_OFF + w_class = 2 + force = 10 + can_unsuppress = 0 + slot_flags = null + origin_tech = "" // NO GIVAWAYS + mag_type = /obj/item/ammo_box/magazine/internal/shot/improvised + sawn_desc = "I'm sorry, but why did you saw your cane in the first place?" + attack_verb = list("bludgeoned", "whacked", "disciplined", "thrashed") + fire_sound = 'sound/weapons/Gunshot_silenced.ogg' + suppressed = 1 + needs_permit = 0 //its just a cane beepsky..... + +/obj/item/weapon/gun/projectile/revolver/doublebarrel/improvised/cane/attackby(obj/item/A, mob/user, params) + ..() + if(istype(A, /obj/item/stack/cable_coil)) + return + +/obj/item/weapon/gun/projectile/revolver/doublebarrel/improvised/cane/examine(mob/user) // HAD TO REPEAT EXAMINE CODE BECAUSE GUN CODE DOESNT STEALTH + var/f_name = "\a [src]." + if(blood_DNA && !istype(src, /obj/effect/decal)) + if(gender == PLURAL) + f_name = "some " + else + f_name = "a " + f_name += "blood-stained [name]!" + + to_chat(user, "\icon[src] That's [f_name]") + + if(desc) + to_chat(user, desc) diff --git a/code/modules/projectiles/guns/projectile/rocket.dm b/code/modules/projectiles/guns/projectile/rocket.dm index 36608844b94..6f0b217de47 100644 --- a/code/modules/projectiles/guns/projectile/rocket.dm +++ b/code/modules/projectiles/guns/projectile/rocket.dm @@ -15,10 +15,9 @@ var/max_rockets = 1 var/list/rockets = new/list() - /obj/item/weapon/gun/rocketlauncher/examine(mob/user) - if(..(user, 2)) - to_chat(user, "[rockets.len] / [max_rockets] rockets.") + ..() + to_chat(user, "[rockets.len] / [max_rockets] rockets.") /obj/item/weapon/gun/rocketlauncher/Destroy() for(var/datum/D in rockets) @@ -48,7 +47,7 @@ var/obj/item/missile/M = new /obj/item/missile(user.loc) playsound(user.loc, 'sound/effects/bang.ogg', 50, 1) M.primed = 1 - M.throw_at(target, missile_range, missile_speed,user) + M.throw_at(target, missile_range, missile_speed, user, 1) message_admins("[key_name_admin(user)] fired a rocket from a rocket launcher ([name]).") log_game("[key_name_admin(user)] used a rocket launcher ([name]).") rockets -= I diff --git a/code/modules/projectiles/guns/projectile/shotgun.dm b/code/modules/projectiles/guns/projectile/shotgun.dm index 47ffa8de488..ddec7543009 100644 --- a/code/modules/projectiles/guns/projectile/shotgun.dm +++ b/code/modules/projectiles/guns/projectile/shotgun.dm @@ -114,6 +114,12 @@ update_icon() //I.E. fix the desc return 1 +/obj/item/weapon/gun/projectile/shotgun/blow_up(mob/user) + . = 0 + if(chambered && chambered.BB) + process_fire(user, user,0) + . = 1 + /obj/item/weapon/gun/projectile/shotgun/boltaction/attackby(obj/item/A, mob/user, params) if(!bolt_open) to_chat(user, "The bolt is closed!") @@ -153,154 +159,10 @@ throw_at(pick(oview(7,get_turf(user))),1,1) user.visible_message("[user] tosses aside the spent rifle!") - -/obj/item/ammo_box/magazine/internal/boltaction/enchanted - max_ammo =1 - ammo_type = /obj/item/ammo_casing/a762/enchanted - -///////////////////////////// -// DOUBLE BARRELED SHOTGUN // -///////////////////////////// - -/obj/item/weapon/gun/projectile/revolver/doublebarrel - name = "double-barreled shotgun" - desc = "A true classic." - icon_state = "dshotgun" - item_state = "shotgun" - w_class = 4 - force = 10 - flags = CONDUCT - slot_flags = SLOT_BACK - origin_tech = "combat=3;materials=1" - mag_type = /obj/item/ammo_box/magazine/internal/shot/dual - sawn_desc = "Omar's coming!" - unique_rename = 1 - unique_reskin = 1 - -/obj/item/weapon/gun/projectile/revolver/doublebarrel/New() - ..() - options["Default"] = "dshotgun" - options["Dark Red Finish"] = "dshotgun-d" - options["Ash"] = "dshotgun-f" - options["Faded Grey"] = "dshotgun-g" - options["Maple"] = "dshotgun-l" - options["Rosewood"] = "dshotgun-p" - options["Cancel"] = null - -/obj/item/weapon/gun/projectile/revolver/doublebarrel/attackby(obj/item/A, mob/user, params) - ..() - if(istype(A, /obj/item/ammo_box) || istype(A, /obj/item/ammo_casing)) - chamber_round() - if(istype(A, /obj/item/weapon/melee/energy)) - var/obj/item/weapon/melee/energy/W = A - if(W.active) - sawoff(user) - if(istype(A, /obj/item/weapon/circular_saw) || istype(A, /obj/item/weapon/gun/energy/plasmacutter)) - sawoff(user) - -/obj/item/weapon/gun/projectile/revolver/doublebarrel/attack_self(mob/living/user) - var/num_unloaded = 0 - while (get_ammo() > 0) - var/obj/item/ammo_casing/CB - CB = magazine.get_round(0) - chambered = null - CB.loc = get_turf(loc) - CB.update_icon() - num_unloaded++ - if (num_unloaded) - to_chat(user, "You break open \the [src] and unload [num_unloaded] shell\s.") - else - to_chat(user, "[src] is empty.") - -/obj/item/weapon/gun/projectile/revolver/doublebarrel/isHandgun() //contrary to popular opinion, double barrels are not, shockingly, handguns - return 0 - -// IMPROVISED SHOTGUN // - -/obj/item/weapon/gun/projectile/revolver/doublebarrel/improvised - name = "improvised shotgun" - desc = "Essentially a tube that aims shotgun shells." - icon_state = "ishotgun" - item_state = "shotgun" - w_class = 4 - force = 10 - slot_flags = null - origin_tech = "combat=2;materials=2" - mag_type = /obj/item/ammo_box/magazine/internal/shot/improvised - sawn_desc = "I'm just here for the gasoline." - unique_rename = 0 - unique_reskin = 0 - var/slung = 0 - -/obj/item/weapon/gun/projectile/revolver/doublebarrel/improvised/attackby(obj/item/A, mob/user, params) - ..() - if(istype(A, /obj/item/stack/cable_coil) && !sawn_state) - var/obj/item/stack/cable_coil/C = A - if(C.use(10)) - slot_flags = SLOT_BACK - icon_state = "ishotgunsling" - to_chat(user, "You tie the lengths of cable to the shotgun, making a sling.") - slung = 1 - update_icon() - else - to_chat(user, "You need at least ten lengths of cable if you want to make a sling.") - return - -/obj/item/weapon/gun/projectile/revolver/doublebarrel/improvised/update_icon() - ..() - if (slung && (slot_flags & SLOT_BELT) ) - slung = 0 - icon_state = "ishotgun-sawn" - -// Sawing guns related procs // - -/obj/item/weapon/gun/projectile/proc/blow_up(mob/user) - . = 0 - for(var/obj/item/ammo_casing/AC in magazine.stored_ammo) - if(AC.BB) - process_fire(user, user,0) - . = 1 - -/obj/item/weapon/gun/projectile/shotgun/blow_up(mob/user) - . = 0 - if(chambered && chambered.BB) - process_fire(user, user,0) - . = 1 - -/obj/item/weapon/gun/projectile/proc/sawoff(mob/user) - if(sawn_state == SAWN_OFF) - to_chat(user, "\The [src] is already shortened.") - return - - if(sawn_state == SAWN_SAWING) - return - - user.visible_message("[user] begins to shorten \the [src].", "You begin to shorten \the [src].") - - //if there's any live ammo inside the gun, makes it go off - if(blow_up(user)) - user.visible_message("\The [src] goes off!", "\The [src] goes off in your face!") - return - - sawn_state = SAWN_SAWING - - if(do_after(user, 30, target = src)) - user.visible_message("[user] shortens \the [src]!", "You shorten \the [src]!") - name = "sawn-off [name]" - desc = sawn_desc - icon_state = "[icon_state]-sawn" - w_class = 3 - item_state = "gun" - slot_flags &= ~SLOT_BACK //you can't sling it on your back - slot_flags |= SLOT_BELT //but you can wear it on your belt (poorly concealed under a trenchcoat, ideally) - sawn_state = SAWN_OFF - update_icon() - return - else - sawn_state = SAWN_INTACT - // Automatic Shotguns// +/obj/item/weapon/gun/projectile/shotgun/automatic + /obj/item/weapon/gun/projectile/shotgun/automatic/shoot_live_shot(mob/living/user as mob|obj) ..() pump(user) @@ -352,47 +214,4 @@ return pump() -/obj/item/ammo_box/magazine/internal/shot/tube - name = "dual feed shotgun internal tube" - ammo_type = /obj/item/ammo_casing/shotgun/rubbershot - max_ammo = 4 - -//caneshotgun - -/obj/item/weapon/gun/projectile/revolver/doublebarrel/improvised/cane - name = "cane" - desc = "A cane used by a true gentlemen. Or a clown." - icon = 'icons/obj/weapons.dmi' - icon_state = "cane" - item_state = "stick" - sawn_state = SAWN_OFF - w_class = 2 - force = 10 - can_unsuppress = 0 - slot_flags = null - origin_tech = "" // NO GIVAWAYS - mag_type = /obj/item/ammo_box/magazine/internal/shot/improvised - sawn_desc = "I'm sorry, but why did you saw your cane in the first place?" - attack_verb = list("bludgeoned", "whacked", "disciplined", "thrashed") - fire_sound = 'sound/weapons/Gunshot_silenced.ogg' - suppressed = 1 - needs_permit = 0 //its just a cane beepsky..... - -/obj/item/weapon/gun/projectile/revolver/doublebarrel/improvised/cane/attackby(obj/item/A, mob/user, params) - ..() - if(istype(A, /obj/item/stack/cable_coil)) - return - -/obj/item/weapon/gun/projectile/revolver/doublebarrel/improvised/cane/examine(mob/user) // HAD TO REPEAT EXAMINE CODE BECAUSE GUN CODE DOESNT STEALTH - var/f_name = "\a [src]." - if(blood_DNA && !istype(src, /obj/effect/decal)) - if(gender == PLURAL) - f_name = "some " - else - f_name = "a " - f_name += "blood-stained [name]!" - - to_chat(user, "\icon[src] That's [f_name]") - - if(desc) - to_chat(user, desc) +// DOUBLE BARRELED SHOTGUN, IMPROVISED SHOTGUN, and CANE SHOTGUN are in revolver.dm diff --git a/code/modules/research/experimentor.dm b/code/modules/research/experimentor.dm index 38004bd49fa..bd8b419e0a3 100644 --- a/code/modules/research/experimentor.dm +++ b/code/modules/research/experimentor.dm @@ -373,8 +373,7 @@ FB.current = start FB.yo = MT.y - start.y FB.xo = MT.x - start.x - spawn(1) - FB.process() + FB.fire() if(prob(EFFECT_PROB_LOW-badThingCoeff)) visible_message("[src] malfunctions, melting [exp_on] and releasing a burst of flame!") explosion(src.loc, -1, 0, 0, 0, 0, flame_range = 2) diff --git a/icons/obj/ammo.dmi b/icons/obj/ammo.dmi index 70ac286722c..33caf3aff5d 100644 Binary files a/icons/obj/ammo.dmi and b/icons/obj/ammo.dmi differ diff --git a/icons/obj/guns/energy.dmi b/icons/obj/guns/energy.dmi index cc0f4c61255..39b73d8052b 100644 Binary files a/icons/obj/guns/energy.dmi and b/icons/obj/guns/energy.dmi differ diff --git a/icons/obj/guns/projectile.dmi b/icons/obj/guns/projectile.dmi index 3a026057f86..4d7e28b5626 100644 Binary files a/icons/obj/guns/projectile.dmi and b/icons/obj/guns/projectile.dmi differ diff --git a/icons/obj/projectiles.dmi b/icons/obj/projectiles.dmi index 04cffbdfb8e..5a780217109 100644 Binary files a/icons/obj/projectiles.dmi and b/icons/obj/projectiles.dmi differ diff --git a/icons/obj/weapons.dmi b/icons/obj/weapons.dmi index a10524fb9b9..dc40e02aa5b 100644 Binary files a/icons/obj/weapons.dmi and b/icons/obj/weapons.dmi differ