diff --git a/code/_onclick/ai.dm b/code/_onclick/ai.dm index b44ba964628..db5a0bbcd0f 100644 --- a/code/_onclick/ai.dm +++ b/code/_onclick/ai.dm @@ -45,7 +45,7 @@ if(modifiers["middle"]) MiddleClickOn(A) if(controlled_mech) //Are we piloting a mech? Placed here so the modifiers are not overridden. - controlled_mech.click_action(A, src) //Override AI normal click behavior. + controlled_mech.click_action(A, src, params) //Override AI normal click behavior. return if(modifiers["shift"]) ShiftClickOn(A) diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm index 000618dd9c4..97af407622b 100644 --- a/code/_onclick/click.dm +++ b/code/_onclick/click.dm @@ -74,7 +74,7 @@ if(!locate(/turf) in list(A,A.loc)) // Prevents inventory from being drilled return var/obj/mecha/M = loc - return M.click_action(A, src) + return M.click_action(A, src, params) if(restrained()) changeNext_move(CLICK_CD_HANDCUFFED) //Doing shit in cuffs shall be vey slow diff --git a/code/datums/supplypacks.dm b/code/datums/supplypacks.dm index 247d481f1be..be25ea14f1f 100644 --- a/code/datums/supplypacks.dm +++ b/code/datums/supplypacks.dm @@ -234,9 +234,9 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine /datum/supply_packs/security/taser name = "Stun Guns Crate" - contains = list(/obj/item/weapon/gun/energy/advtaser, - /obj/item/weapon/gun/energy/advtaser, - /obj/item/weapon/gun/energy/advtaser) + contains = list(/obj/item/weapon/gun/energy/gun/advtaser, + /obj/item/weapon/gun/energy/gun/advtaser, + /obj/item/weapon/gun/energy/gun/advtaser) cost = 15 containername = "stun gun crate" diff --git a/code/game/gamemodes/wizard/rightandwrong.dm b/code/game/gamemodes/wizard/rightandwrong.dm index 626771d23d6..f2c10d7fc10 100644 --- a/code/game/gamemodes/wizard/rightandwrong.dm +++ b/code/game/gamemodes/wizard/rightandwrong.dm @@ -20,7 +20,7 @@ if(!summon_type) switch (randomizeguns) if("taser") - new /obj/item/weapon/gun/energy/advtaser(get_turf(H)) + new /obj/item/weapon/gun/energy/gun/advtaser(get_turf(H)) if("egun") new /obj/item/weapon/gun/energy/gun(get_turf(H)) if("laser") diff --git a/code/game/jobs/job/security.dm b/code/game/jobs/job/security.dm index 3b13ceb6b64..31c82b2a203 100644 --- a/code/game/jobs/job/security.dm +++ b/code/game/jobs/job/security.dm @@ -77,7 +77,7 @@ H.equip_or_collect(new /obj/item/clothing/glasses/hud/security/sunglasses(H), slot_glasses) // H.equip_or_collect(new /obj/item/clothing/mask/gas(H), slot_wear_mask) //Grab one from the armory you donk H.equip_or_collect(new /obj/item/device/flash(H), slot_l_store) - H.equip_or_collect(new /obj/item/weapon/gun/energy/advtaser(H), slot_s_store) + H.equip_or_collect(new /obj/item/weapon/gun/energy/gun/advtaser(H), slot_s_store) if(H.backbag == 1) H.equip_or_collect(new /obj/item/weapon/storage/box/survival(H), slot_r_hand) H.equip_or_collect(new /obj/item/weapon/restraints/handcuffs(H), slot_l_hand) @@ -175,7 +175,7 @@ H.equip_to_slot_or_del(new /obj/item/clothing/head/helmet(H), slot_head) H.equip_or_collect(new /obj/item/device/pda/security(H), slot_wear_pda) H.equip_or_collect(new /obj/item/clothing/gloves/color/black(H), slot_gloves) - H.equip_or_collect(new /obj/item/weapon/gun/energy/advtaser(H), slot_s_store) + H.equip_or_collect(new /obj/item/weapon/gun/energy/gun/advtaser(H), slot_s_store) H.equip_or_collect(new /obj/item/device/flash(H), slot_l_store) if(H.backbag == 1) H.equip_or_collect(new /obj/item/weapon/storage/box/survival(H), slot_r_hand) @@ -249,7 +249,7 @@ H.equip_or_collect(new /obj/item/clothing/shoes/jackboots(H), slot_shoes) H.equip_or_collect(new /obj/item/device/pda/security(H), slot_wear_pda) H.equip_or_collect(new /obj/item/clothing/gloves/color/black(H), slot_gloves) - H.equip_or_collect(new /obj/item/weapon/gun/energy/advtaser(H), slot_s_store) + H.equip_or_collect(new /obj/item/weapon/gun/energy/gun/advtaser(H), slot_s_store) H.equip_or_collect(new /obj/item/device/flash(H), slot_l_store) if(H.backbag == 1) H.equip_or_collect(new /obj/item/weapon/storage/box/survival(H), slot_r_hand) diff --git a/code/game/machinery/portable_turret.dm b/code/game/machinery/portable_turret.dm index e2d87ddf9c8..fb1ef8c8740 100644 --- a/code/game/machinery/portable_turret.dm +++ b/code/game/machinery/portable_turret.dm @@ -666,6 +666,8 @@ var/list/turret_icons return /obj/machinery/porta_turret/proc/shootAt(var/mob/living/target) + if(!raised) //the turret has to be raised in order to fire - makes sense, right? + return //any emagged turrets will shoot extremely fast! This not only is deadly, but drains a lot power! if(!emagged) //if it hasn't been emagged, it has to obey a cooldown rate if(last_fired || !raised) //prevents rapid-fire shooting, unless it's been emagged @@ -680,10 +682,6 @@ var/list/turret_icons if(!istype(T) || !istype(U)) return - if(!raised) //the turret has to be raised in order to fire - makes sense, right? - return - - update_icon() var/obj/item/projectile/A if(emagged || lethal) @@ -694,18 +692,17 @@ var/list/turret_icons if(projectile) A = new projectile(loc) playsound(loc, shot_sound, 75, 1) - A.original = target // Lethal/emagged turrets use twice the power due to higher energy beams // Emagged turrets again use twice as much power due to higher firing rates use_power(reqpower * (2 * (emagged || lethal)) * (2 * emagged)) - //Shooting Code: + A.original = target A.current = T A.yo = U.y - T.y A.xo = U.x - T.x - spawn(1) - A.process() + A.fire() + return A /datum/turret_checks var/enabled diff --git a/code/game/mecha/equipment/weapons/weapons.dm b/code/game/mecha/equipment/weapons/weapons.dm index a92e949bafc..fda074ec119 100644 --- a/code/game/mecha/equipment/weapons/weapons.dm +++ b/code/game/mecha/equipment/weapons/weapons.dm @@ -5,6 +5,10 @@ var/projectile var/fire_sound var/size=0 + var/projectiles_per_shot = 1 + var/variance = 0 + var/randomspread = 0 //use random spread for machineguns, instead of shotgun scatter + var/projectile_delay = 0 /obj/item/mecha_parts/mecha_equipment/weapon/can_attach(var/obj/mecha/combat/M as obj) if(..()) @@ -16,32 +20,51 @@ return 1 return 0 +/obj/item/mecha_parts/mecha_equipment/weapon/proc/get_shot_amount() + return projectiles_per_shot -/obj/item/mecha_parts/mecha_equipment/weapon/energy - name = "General Energy Weapon" - size = 2 - action(target) - if(!action_checks(target)) return - var/turf/curloc = chassis.loc - var/atom/targloc = get_turf(target) - if (!targloc || !istype(targloc, /turf) || !curloc) - return - if (targloc == curloc) - return - set_ready_state(0) - playsound(chassis, fire_sound, 50, 1) +/obj/item/mecha_parts/mecha_equipment/weapon/action(target, params) + if(!action_checks(target)) + return 0 + + var/turf/curloc = get_turf(chassis) + var/turf/targloc = get_turf(target) + if (!targloc || !istype(targloc) || !curloc) + return 0 + if (targloc == curloc) + return 0 + + set_ready_state(0) + for(var/i=1 to get_shot_amount()) var/obj/item/projectile/A = new projectile(curloc) A.firer = chassis.occupant A.original = target A.current = curloc - A.yo = targloc.y - curloc.y - A.xo = targloc.x - curloc.x - chassis.use_power(energy_drain) - A.process() - chassis.log_message("Fired from [src.name], targeting [target].") - do_after_cooldown() - return + var/spread = 0 + if(variance) + if(randomspread) + spread = round((rand() - 0.5) * variance) + else + spread = round((i / projectiles_per_shot - 0.5) * variance) + A.preparePixelProjectile(target, targloc, chassis.occupant, params, spread) + + chassis.use_power(energy_drain) + A.fire() + playsound(chassis, fire_sound, 50, 1) + + sleep(max(0, projectile_delay)) + set_ready_state(0) + log_message("Fired from [src.name], targeting [target].") + var/turf/T = get_turf(src) + msg_admin_attack("[key_name_admin(chassis.occupant)] fired a [src] in ([T.x], [T.y], [T.z] - JMP)") + log_game("[key_name(chassis.occupant)] fired a [src] in [T.x], [T.y], [T.z]") + do_after_cooldown() + return + +/obj/item/mecha_parts/mecha_equipment/weapon/energy + name = "General Energy Weapon" + size = 2 /obj/item/mecha_parts/mecha_equipment/weapon/energy/laser equip_cooldown = 8 @@ -82,25 +105,25 @@ icon_state = "pulse1_bl" var/life = 20 - Bump(atom/A) - A.bullet_act(src, def_zone) - src.life -= 10 - if(ismob(A)) - var/mob/M = A - if(istype(firer, /mob)) - M.attack_log += "\[[time_stamp()]\] [firer]/[firer.ckey] shot [M]/[M.ckey] with a [src]" - firer.attack_log += "\[[time_stamp()]\] [firer]/[firer.ckey] shot [M]/[M.ckey] with a [src]" - log_attack("[firer] ([firer.ckey]) shot [M] ([M.ckey]) with a [src]") - if(!iscarbon(firer)) - M.LAssailant = null - else - M.LAssailant = firer +/obj/item/projectile/beam/pulse/heavy/Bump(atom/A) + A.bullet_act(src, def_zone) + src.life -= 10 + if(ismob(A)) + var/mob/M = A + if(istype(firer, /mob)) + M.attack_log += "\[[time_stamp()]\] [firer]/[firer.ckey] shot [M]/[M.ckey] with a [src]" + firer.attack_log += "\[[time_stamp()]\] [firer]/[firer.ckey] shot [M]/[M.ckey] with a [src]" + log_attack("[firer] ([firer.ckey]) shot [M] ([M.ckey]) with a [src]") + if(!iscarbon(firer)) + M.LAssailant = null else - M.attack_log += "\[[time_stamp()]\] UNKNOWN SUBJECT (No longer exists) shot [M]/[M.ckey] with a [src]" - log_attack("UNKNOWN shot [M] ([M.ckey]) with a [src]") - if(life <= 0) - qdel(src) - return + M.LAssailant = firer + else + M.attack_log += "\[[time_stamp()]\] UNKNOWN SUBJECT (No longer exists) shot [M]/[M.ckey] with a [src]" + log_attack("UNKNOWN shot [M] ([M.ckey]) with a [src]") + if(life <= 0) + qdel(src) + return /obj/item/mecha_parts/mecha_equipment/weapon/energy/taser @@ -119,89 +142,89 @@ equip_cooldown = 150 range = MELEE|RANGED - can_attach(obj/mecha/combat/honker/M as obj) - if(..()) - if(istype(M)) - return 1 +/obj/item/mecha_parts/mecha_equipment/weapon/honker/can_attach(obj/mecha/combat/honker/M as obj) + if(..()) + if(istype(M)) + return 1 + return 0 + +/obj/item/mecha_parts/mecha_equipment/weapon/honker/action(target, params) + if(!chassis) + return 0 + if(energy_drain && chassis.get_charge() < energy_drain) + return 0 + if(!equip_ready) return 0 - action(target) - if(!chassis) - return 0 - if(energy_drain && chassis.get_charge() < energy_drain) - return 0 - if(!equip_ready) - return 0 + playsound(chassis, 'sound/items/AirHorn.ogg', 100, 1) + chassis.occupant_message("HONK") + for(var/mob/living/carbon/M in ohearers(6, chassis)) + if(istype(M, /mob/living/carbon/human)) + var/mob/living/carbon/human/H = M + if(istype(H.l_ear, /obj/item/clothing/ears/earmuffs) || istype(H.r_ear, /obj/item/clothing/ears/earmuffs)) + continue + to_chat(M, "HONK") + M.sleeping = 0 + M.stuttering = 20 + M.ear_deaf = 30 + M.Weaken(3) + if(prob(30)) + M.Stun(10) + M.Paralyse(4) + else + M.Jitter(500) + ///else the mousetraps are useless + if(istype(M, /mob/living/carbon/human)) + var/mob/living/carbon/human/H = M + if(isobj(H.shoes)) + var/thingy = H.shoes + H.unEquip(H.shoes) + walk_away(thingy,chassis,15,2) + spawn(20) + if(thingy) + walk(thingy,0) + for(var/obj/mecha/combat/recitence/R in oview(6, chassis)) + R.occupant_message("\The [R] has protected you from [chassis]'s HONK at the cost of some power.") + R.use_power(R.get_charge() / 4) - playsound(chassis, 'sound/items/AirHorn.ogg', 100, 1) - chassis.occupant_message("HONK") - for(var/mob/living/carbon/M in ohearers(6, chassis)) - if(istype(M, /mob/living/carbon/human)) - var/mob/living/carbon/human/H = M - if(istype(H.l_ear, /obj/item/clothing/ears/earmuffs) || istype(H.r_ear, /obj/item/clothing/ears/earmuffs)) - continue - to_chat(M, "HONK") - M.sleeping = 0 - M.stuttering = 20 - M.ear_deaf = 30 - M.Weaken(3) - if(prob(30)) - M.Stun(10) - M.Paralyse(4) - else - M.Jitter(500) - ///else the mousetraps are useless - if(istype(M, /mob/living/carbon/human)) - var/mob/living/carbon/human/H = M - if(isobj(H.shoes)) - var/thingy = H.shoes - H.unEquip(H.shoes) - walk_away(thingy,chassis,15,2) - spawn(20) - if(thingy) - walk(thingy,0) - for(var/obj/mecha/combat/recitence/R in oview(6, chassis)) - R.occupant_message("\The [R] has protected you from [chassis]'s HONK at the cost of some power.") - R.use_power(R.get_charge() / 4) - - chassis.use_power(energy_drain) - log_message("Honked from [src.name]. HONK!") - var/turf/T = get_turf(src) - msg_admin_attack("[key_name_admin(chassis.occupant)] used a Mecha Honker in ([T.x], [T.y], [T.z] - JMP)") - log_game("[key_name(chassis.occupant)] used a Mecha Honker in [T.x], [T.y], [T.z]") - do_after_cooldown() - return + chassis.use_power(energy_drain) + log_message("Honked from [src.name]. HONK!") + var/turf/T = get_turf(src) + msg_admin_attack("[key_name_admin(chassis.occupant)] used a Mecha Honker in ([T.x], [T.y], [T.z] - JMP)") + log_game("[key_name(chassis.occupant)] used a Mecha Honker in [T.x], [T.y], [T.z]") + do_after_cooldown() + return /obj/item/mecha_parts/mecha_equipment/weapon/ballistic name = "General Ballisic Weapon" var/projectiles var/projectile_energy_cost size = 2 - action_checks(atom/target) - if(..()) - if(projectiles > 0) - return 1 - return 0 +/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/action_checks(atom/target) + if(..()) + if(projectiles > 0) + return 1 + return 0 - get_equip_info() - return "[..()]\[[src.projectiles]\][(src.projectiles < initial(src.projectiles))?" - Rearm":null]" +/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/get_equip_info() + return "[..()]\[[src.projectiles]\][(src.projectiles < initial(src.projectiles))?" - Rearm":null]" - proc/rearm() - if(projectiles < initial(projectiles)) - var/projectiles_to_add = initial(projectiles) - projectiles - while(chassis.get_charge() >= projectile_energy_cost && projectiles_to_add) - projectiles++ - projectiles_to_add-- - chassis.use_power(projectile_energy_cost) - send_byjax(chassis.occupant,"exosuit.browser","\ref[src]",src.get_equip_info()) - log_message("Rearmed [src.name].") - return +/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/proc/rearm() + if(projectiles < initial(projectiles)) + var/projectiles_to_add = initial(projectiles) - projectiles + while(chassis.get_charge() >= projectile_energy_cost && projectiles_to_add) + projectiles++ + projectiles_to_add-- + chassis.use_power(projectile_energy_cost) + send_byjax(chassis.occupant,"exosuit.browser","\ref[src]",src.get_equip_info()) + log_message("Rearmed [src.name].") + return - Topic(href, href_list) - ..() - if (href_list["rearm"]) - src.rearm() - return +/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/Topic(href, href_list) + ..() + if (href_list["rearm"]) + src.rearm() + return /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/carbine name = "FNX-66 Carbine" @@ -211,41 +234,6 @@ fire_sound = 'sound/weapons/Gunshot.ogg' projectiles = 24 projectile_energy_cost = 15 - var/projectiles_per_shot = 1 - var/deviation = 0.0 - - action(atom/target) - if(!action_checks(target)) return - var/turf/targloc = get_turf(target) - var/target_x = targloc.x - var/target_y = targloc.y - var/target_z = targloc.z - targloc = null - spawn for(var/i=1 to min(projectiles, projectiles_per_shot)) - if(!chassis) break - var/turf/curloc = get_turf(chassis) - targloc = locate(target_x+GaussRandRound(deviation,1),target_y+GaussRandRound(deviation,1),target_z) - if (!targloc || !curloc) - continue - if (targloc == curloc) - continue - - playsound(chassis, fire_sound, 50, 1) - var/obj/item/projectile/A = new projectile(curloc) - src.projectiles-- - A.original = target - A.current = curloc - A.yo = targloc.y - curloc.y - A.xo = targloc.x - curloc.x - A.process() - sleep(2) - set_ready_state(0) - log_message("Fired from [src.name], targeting [target].") - var/turf/T = get_turf(src) - msg_admin_attack("[key_name_admin(chassis.occupant)] fired a [src] in ([T.x], [T.y], [T.z] - JMP)") - log_game("[key_name(chassis.occupant)] fired a [src] in [T.x], [T.y], [T.z]") - do_after_cooldown() - return /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/carbine/silenced name = "\improper S.H.H. \"Quietus\" Carbine" @@ -270,36 +258,8 @@ fire_sound = 'sound/weapons/Gunshot.ogg' projectiles = 40 projectile_energy_cost = 25 - var/projectiles_per_shot = 4 - var/deviation = 0.7 - - action(atom/target) - if(!action_checks(target)) return - var/turf/curloc = get_turf(chassis) - var/turf/targloc = get_turf(target) - if(!curloc || !targloc) return - var/target_x = targloc.x - var/target_y = targloc.y - var/target_z = targloc.z - targloc = null - for(var/i=1 to min(projectiles, projectiles_per_shot)) - targloc = locate(target_x+GaussRandRound(deviation,1),target_y+GaussRandRound(deviation,1),target_z) - if(!targloc || targloc == curloc) - break - playsound(chassis, fire_sound, 80, 1) - var/obj/item/projectile/A = new projectile(curloc) - src.projectiles-- - A.original = target - A.current = curloc - A.yo = targloc.y - curloc.y - A.xo = targloc.x - curloc.x - set_ready_state(0) - A.process() - log_message("Fired from [src.name], targeting [target].") - do_after_cooldown() - return - - + projectiles_per_shot = 4 + variance = 25 /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/lmg name = "Ultra AC 2" @@ -309,38 +269,9 @@ fire_sound = 'sound/weapons/Gunshot.ogg' projectiles = 300 projectile_energy_cost = 20 - var/projectiles_per_shot = 3 - var/deviation = 0.3 - - action(atom/target) - if(!action_checks(target)) return - var/turf/targloc = get_turf(target) - var/target_x = targloc.x - var/target_y = targloc.y - var/target_z = targloc.z - targloc = null - spawn for(var/i=1 to min(projectiles, projectiles_per_shot)) - if(!chassis) break - var/turf/curloc = get_turf(chassis) - targloc = locate(target_x+GaussRandRound(deviation,1),target_y+GaussRandRound(deviation,1),target_z) - if (!targloc || !curloc) - continue - if (targloc == curloc) - continue - - playsound(chassis, fire_sound, 50, 1) - var/obj/item/projectile/A = new projectile(curloc) - src.projectiles-- - A.original = target - A.current = curloc - A.yo = targloc.y - curloc.y - A.xo = targloc.x - curloc.x - A.process() - sleep(2) - set_ready_state(0) - log_message("Fired from [src.name], targeting [target].") - do_after_cooldown() - return + projectiles_per_shot = 3 + variance = 6 + projectile_delay = 2 /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack name = "SRM-8 Missile Rack" @@ -353,20 +284,21 @@ var/missile_speed = 2 var/missile_range = 30 - action(target) - if(!action_checks(target)) return - set_ready_state(0) - var/obj/item/missile/M = new projectile(chassis.loc) - M.primed = 1 - playsound(chassis, fire_sound, 50, 1) - M.throw_at(target, missile_range, missile_speed, chassis) - projectiles-- - log_message("Fired from [src.name], targeting [target].") - var/turf/T = get_turf(src) - msg_admin_attack("[key_name_admin(chassis.occupant)] fired a [src] in ([T.x], [T.y], [T.z] - JMP)") - log_game("[key_name(chassis.occupant)] fired a [src] in [T.x], [T.y], [T.z]") - do_after_cooldown() +/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/action(target, params) + if(!action_checks(target)) return + set_ready_state(0) + var/obj/item/missile/M = new projectile(chassis.loc) + M.primed = 1 + playsound(chassis, fire_sound, 50, 1) + M.throw_at(target, missile_range, missile_speed, chassis) + projectiles-- + log_message("Fired from [src.name], targeting [target].") + var/turf/T = get_turf(src) + msg_admin_attack("[key_name_admin(chassis.occupant)] fired a [src] in ([T.x], [T.y], [T.z] - JMP)") + log_game("[key_name(chassis.occupant)] fired a [src] in [T.x], [T.y], [T.z]") + do_after_cooldown() + return /obj/item/missile @@ -375,13 +307,13 @@ var/primed = null throwforce = 15 - throw_impact(atom/hit_atom) - if(primed) - explosion(hit_atom, 0, 0, 2, 4, 0) - qdel(src) - else - ..() - return +/obj/item/missile/throw_impact(atom/hit_atom) + if(primed) + explosion(hit_atom, 0, 0, 2, 4, 0) + qdel(src) + else + ..() + return /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/flashbang name = "SGL-6 Grenade Launcher" @@ -394,18 +326,19 @@ equip_cooldown = 60 var/det_time = 20 size=1 - action(target) - if(!action_checks(target)) return - set_ready_state(0) - var/obj/item/weapon/grenade/flashbang/F = new projectile(chassis.loc) - playsound(chassis, fire_sound, 50, 1) - F.throw_at(target, missile_range, missile_speed, chassis) - projectiles-- - log_message("Fired from [src.name], targeting [target].") - spawn(det_time) - F.prime() - do_after_cooldown() +/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/flashbang/action(target, params) + if(!action_checks(target)) return + set_ready_state(0) + var/obj/item/weapon/grenade/flashbang/F = new projectile(chassis.loc) + playsound(chassis, fire_sound, 50, 1) + F.throw_at(target, missile_range, missile_speed, chassis) + projectiles-- + log_message("Fired from [src.name], targeting [target].") + spawn(det_time) + F.prime() + do_after_cooldown() + return /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/flashbang/clusterbang//Because I am a heartless bastard -Sieve name = "SOB-3 Grenade Launcher" @@ -432,22 +365,23 @@ projectile_energy_cost = 100 equip_cooldown = 20 - can_attach(obj/mecha/combat/honker/M as obj) - if(..()) - if(istype(M)) - return 1 - return 0 +/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/banana_mortar/can_attach(obj/mecha/combat/honker/M as obj) + if(..()) + if(istype(M)) + return 1 + return 0 - action(target) - if(!action_checks(target)) return - set_ready_state(0) - var/obj/item/weapon/bananapeel/B = new projectile(chassis.loc) - playsound(chassis, fire_sound, 60, 1) - B.throw_at(target, missile_range, missile_speed, chassis) - projectiles-- - log_message("Bananed from [src.name], targeting [target]. HONK!") - do_after_cooldown() +/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/banana_mortar/action(target, params) + if(!action_checks(target)) return + set_ready_state(0) + var/obj/item/weapon/bananapeel/B = new projectile(chassis.loc) + playsound(chassis, fire_sound, 60, 1) + B.throw_at(target, missile_range, missile_speed, chassis) + projectiles-- + log_message("Bananed from [src.name], targeting [target]. HONK!") + do_after_cooldown() + return /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/mousetrap_mortar @@ -460,23 +394,24 @@ projectile_energy_cost = 100 equip_cooldown = 10 - can_attach(obj/mecha/combat/honker/M as obj) - if(..()) - if(istype(M)) - return 1 - return 0 +/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/mousetrap_mortar/can_attach(obj/mecha/combat/honker/M as obj) + if(..()) + if(istype(M)) + return 1 + return 0 - action(target) - if(!action_checks(target)) return - set_ready_state(0) - var/obj/item/device/assembly/mousetrap/M = new projectile(chassis.loc) - M.secured = 1 - playsound(chassis, fire_sound, 60, 1) - M.throw_at(target, missile_range, missile_speed, chassis) - projectiles-- - log_message("Launched a mouse-trap from [src.name], targeting [target]. HONK!") - do_after_cooldown() +/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/mousetrap_mortar/action(target, params) + if(!action_checks(target)) return + set_ready_state(0) + var/obj/item/device/assembly/mousetrap/M = new projectile(chassis.loc) + M.secured = 1 + playsound(chassis, fire_sound, 60, 1) + M.throw_at(target, missile_range, missile_speed, chassis) + projectiles-- + log_message("Launched a mouse-trap from [src.name], targeting [target]. HONK!") + do_after_cooldown() + return /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/bolas name = "PCMK-6 Bolas Launcher" @@ -489,23 +424,24 @@ projectile_energy_cost = 50 equip_cooldown = 10 - can_attach(obj/mecha/combat/gygax/M as obj) - if(..()) - if(istype(M)) - return 1 - return 0 +/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/bolas/can_attach(obj/mecha/combat/gygax/M as obj) + if(..()) + if(istype(M)) + return 1 + return 0 - action(target) - if(!action_checks(target)) return - set_ready_state(0) - var/obj/item/weapon/legcuffs/bolas/M = new projectile(chassis.loc) - playsound(chassis, fire_sound, 50, 1) - M.thrown_from = src - M.throw_at(target, missile_range, missile_speed) - projectiles-- - log_message("Fired from [src.name], targeting [target].") - do_after_cooldown() +/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/bolas/action(target, params) + if(!action_checks(target)) return + set_ready_state(0) + var/obj/item/weapon/legcuffs/bolas/M = new projectile(chassis.loc) + playsound(chassis, fire_sound, 50, 1) + M.thrown_from = src + M.throw_at(target, missile_range, missile_speed) + projectiles-- + log_message("Fired from [src.name], targeting [target].") + do_after_cooldown() + return /obj/item/mecha_parts/mecha_equipment/weapon/energy/plasma equip_cooldown = 20 diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index ceeca47f72e..fcfccd1f9b6 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -219,7 +219,7 @@ // return ..() */ -/obj/mecha/proc/click_action(atom/target,mob/user) +/obj/mecha/proc/click_action(atom/target, mob/user, params) if(!src.occupant || src.occupant != user ) return if(user.stat || !user.canmove) return @@ -239,9 +239,9 @@ return if(!target.Adjacent(src)) if(selected && selected.is_ranged()) - selected.action(target) + selected.action(target, params) else if(selected && selected.is_melee()) - selected.action(target) + selected.action(target, params) else if(internal_damage&MECHA_INT_CONTROL_LOST) target = safepick(oview(1,src)) @@ -1991,4 +1991,4 @@ /obj/mecha/speech_bubble(var/bubble_state = "",var/bubble_loc = src, var/list/bubble_recipients = list()) - flick_overlay(image('icons/mob/talk.dmi', bubble_loc, bubble_state,MOB_LAYER+1), bubble_recipients, 30) \ No newline at end of file + flick_overlay(image('icons/mob/talk.dmi', bubble_loc, bubble_state,MOB_LAYER+1), bubble_recipients, 30) diff --git a/code/game/objects/structures/crates_lockers/closets/secure/security.dm b/code/game/objects/structures/crates_lockers/closets/secure/security.dm index 1cadbfbd14a..1a24f932091 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/security.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/security.dm @@ -152,7 +152,7 @@ new /obj/item/weapon/storage/box/flashbangs(src) new /obj/item/weapon/reagent_containers/spray/pepper(src) new /obj/item/weapon/melee/baton/loaded(src) - new /obj/item/weapon/gun/energy/advtaser(src) + new /obj/item/weapon/gun/energy/gun/advtaser(src) new /obj/item/weapon/storage/belt/security/sec(src) new /obj/item/weapon/storage/box/holobadge(src) diff --git a/code/game/response_team.dm b/code/game/response_team.dm index bfed4a30f0b..d9b8cfcc375 100644 --- a/code/game/response_team.dm +++ b/code/game/response_team.dm @@ -382,7 +382,7 @@ var/send_emergency_team M.equip_to_slot_or_del(new /obj/item/clothing/shoes/combat(M), slot_shoes) M.equip_to_slot_or_del(new /obj/item/clothing/gloves/color/black(M), slot_gloves) M.equip_to_slot_or_del(new /obj/item/clothing/suit/armor/vest/ert/security(M), slot_wear_suit) - M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/advtaser(M), slot_s_store) + M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/gun/advtaser(M), slot_s_store) M.equip_to_slot_or_del(new /obj/item/clothing/glasses/hud/security/sunglasses(M), slot_glasses) M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/ert/security(M), slot_in_backpack) @@ -459,7 +459,7 @@ var/send_emergency_team M.equip_to_slot_or_del(new /obj/item/clothing/shoes/combat(M), slot_shoes) M.equip_to_slot_or_del(new /obj/item/clothing/gloves/color/black(M), slot_gloves) M.equip_to_slot_or_del(new /obj/item/clothing/suit/space/rig/ert/security(M), slot_wear_suit) - M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/advtaser(M), slot_s_store) + M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/gun/advtaser(M), slot_s_store) M.equip_to_slot_or_del(new /obj/item/clothing/glasses/hud/security/sunglasses(M), slot_glasses) M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/rig/ert/security(M), slot_in_backpack) diff --git a/code/modules/clothing/spacesuits/ert.dm b/code/modules/clothing/spacesuits/ert.dm index 9130871439c..91824a9856e 100644 --- a/code/modules/clothing/spacesuits/ert.dm +++ b/code/modules/clothing/spacesuits/ert.dm @@ -35,7 +35,7 @@ allowed = list(/obj/item/device/flashlight, /obj/item/weapon/tank, /obj/item/device/t_scanner, /obj/item/weapon/rcd, /obj/item/weapon/crowbar, \ /obj/item/weapon/screwdriver, /obj/item/weapon/weldingtool, /obj/item/weapon/wirecutters, /obj/item/weapon/wrench, /obj/item/device/multitool, \ /obj/item/device/radio, /obj/item/device/analyzer, /obj/item/weapon/gun/energy/laser, /obj/item/weapon/gun/energy/pulse, \ - /obj/item/weapon/gun/energy/advtaser, /obj/item/weapon/melee/baton, /obj/item/weapon/gun/energy/gun) + /obj/item/weapon/gun/energy/gun/advtaser, /obj/item/weapon/melee/baton, /obj/item/weapon/gun/energy/gun) strip_delay = 130 //Commander diff --git a/code/modules/crafting/recipes.dm b/code/modules/crafting/recipes.dm index c578c452bbc..f676ac14d44 100644 --- a/code/modules/crafting/recipes.dm +++ b/code/modules/crafting/recipes.dm @@ -44,7 +44,7 @@ /obj/item/robot_parts/r_leg = 1, /obj/item/stack/sheet/metal = 5, /obj/item/stack/cable_coil = 5, - /obj/item/weapon/gun/energy/advtaser = 1, + /obj/item/weapon/gun/energy/gun/advtaser = 1, /obj/item/weapon/stock_parts/cell = 1, /obj/item/device/assembly/prox_sensor = 1, /obj/item/robot_parts/r_arm = 1) diff --git a/code/modules/examine/descriptions/weapons.dm b/code/modules/examine/descriptions/weapons.dm index 90929d31e08..264e0e99dfe 100644 --- a/code/modules/examine/descriptions/weapons.dm +++ b/code/modules/examine/descriptions/weapons.dm @@ -26,7 +26,7 @@ then click where you want to fire. Most energy weapons can fire through windows harmlessly. To switch between stun and lethal, click the weapon \ in your hand. To recharge this weapon, use a weapon recharger." -/obj/item/weapon/gun/energy/advtaser +/obj/item/weapon/gun/energy/gun/advtaser description_info = "This is an energy weapon. To fire the weapon, have your gun mode set to 'fire', \ then click where you want to fire. To recharge this weapon, use a weapon recharger. \ To switch between insta-stun and disabler beams, click the weapon in your hand. This weapon can only fire through glass if it is set to disabler beams." @@ -55,11 +55,6 @@ then click where you want to fire. After firing, you will need to pump the gun, by clicking on the gun in your hand. To reload, load more shotgun \ shells into the gun." -/obj/item/weapon/gun/projectile/heavysniper - description_info = "This is a ballistic weapon. To fire the weapon, have your gun mode set to 'fire', \ - then click where you want to fire. The gun's chamber can be opened or closed by using it in your hand. To reload, open the chamber, add a new bullet \ - then close it. To use the scope, use the appropriate verb in the object tab." - //******* //*Melee* //******* diff --git a/code/modules/mining/security_recipes.dm b/code/modules/mining/security_recipes.dm index f08addbf4a0..9cbdeadc154 100644 --- a/code/modules/mining/security_recipes.dm +++ b/code/modules/mining/security_recipes.dm @@ -99,7 +99,7 @@ /datum/manufacture/taser name = "Advanced Taser" - item = /obj/item/weapon/gun/energy/advtaser + item = /obj/item/weapon/gun/energy/gun/advtaser cost1 = /obj/item/weapon/ore/iron cname1 = "Iron" amount1 = 15 diff --git a/code/modules/mob/living/carbon/human/species/plasmaman.dm b/code/modules/mob/living/carbon/human/species/plasmaman.dm index 26ee19b0788..003e1969d33 100644 --- a/code/modules/mob/living/carbon/human/species/plasmaman.dm +++ b/code/modules/mob/living/carbon/human/species/plasmaman.dm @@ -66,7 +66,7 @@ if("Warden","Security Officer","Security Pod Pilot") suit=/obj/item/clothing/suit/space/eva/plasmaman/security/ helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/security/ - H.equip_or_collect(new /obj/item/weapon/gun/energy/advtaser(H), slot_in_backpack) + H.equip_or_collect(new /obj/item/weapon/gun/energy/gun/advtaser(H), slot_in_backpack) if("Magistrate") suit=/obj/item/clothing/suit/space/eva/plasmaman/magistrate helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/magistrate diff --git a/code/modules/mob/living/simple_animal/bot/construction.dm b/code/modules/mob/living/simple_animal/bot/construction.dm index 2c2ca652d10..27bfe821502 100644 --- a/code/modules/mob/living/simple_animal/bot/construction.dm +++ b/code/modules/mob/living/simple_animal/bot/construction.dm @@ -158,7 +158,7 @@ return newname = "redtag ED-209 assembly" if("") - if(!istype(W, /obj/item/weapon/gun/energy/advtaser)) + if(!istype(W, /obj/item/weapon/gun/energy/gun/advtaser)) return newname = "taser ED-209 assembly" else diff --git a/code/modules/mob/living/simple_animal/bot/ed209bot.dm b/code/modules/mob/living/simple_animal/bot/ed209bot.dm index 23b87eb0c51..56f61622b17 100644 --- a/code/modules/mob/living/simple_animal/bot/ed209bot.dm +++ b/code/modules/mob/living/simple_animal/bot/ed209bot.dm @@ -365,7 +365,7 @@ Auto Patrol[]"}, new /obj/item/device/assembly/prox_sensor(Tsec) if(!lasercolor) - var/obj/item/weapon/gun/energy/advtaser/G = new /obj/item/weapon/gun/energy/advtaser(Tsec) + var/obj/item/weapon/gun/energy/gun/advtaser/G = new /obj/item/weapon/gun/energy/gun/advtaser(Tsec) G.power_supply.charge = 0 G.update_icon() else if(lasercolor == "b") diff --git a/code/modules/mob/living/simple_animal/hostile/hostile.dm b/code/modules/mob/living/simple_animal/hostile/hostile.dm index 418c30199d0..ef048b351fd 100644 --- a/code/modules/mob/living/simple_animal/hostile/hostile.dm +++ b/code/modules/mob/living/simple_animal/hostile/hostile.dm @@ -262,7 +262,8 @@ var/obj/item/projectile/A = new projectiletype(src.loc) playsound(user, projectilesound, 100, 1) - if(!A) return + if(!A) + return A.current = target A.firer = src @@ -272,7 +273,7 @@ newtonian_move(get_dir(target, user)) A.original = target spawn( 0 ) - A.process() + A.fire() return /mob/living/simple_animal/hostile/proc/DestroySurroundings() diff --git a/code/modules/projectiles/firing.dm b/code/modules/projectiles/firing.dm index 813edec4c30..2a75004f223 100644 --- a/code/modules/projectiles/firing.dm +++ b/code/modules/projectiles/firing.dm @@ -81,8 +81,8 @@ //Split Y+Pixel_Y up into list(Y, Pixel_Y) var/list/screen_loc_Y = splittext(screen_loc_params[2],":") - var/x = text2num(screen_loc_X[1]) * 32 + text2num(screen_loc_X[2]) - 32 - var/y = text2num(screen_loc_Y[1]) * 32 + text2num(screen_loc_Y[2]) - 32 + var/x = text2num(screen_loc_X[1]) * world.icon_size + text2num(screen_loc_X[2]) - world.icon_size + (user.client ? user.client.pixel_x : 0) + var/y = text2num(screen_loc_Y[1]) * world.icon_size + text2num(screen_loc_Y[2]) - world.icon_size + (user.client ? user.client.pixel_y : 0) //Calculate the "resolution" of screen based on client's view and world's icon size. This will work if the user can view more tiles than average. var/screenview = (user.client.view * 2 + 1) * world.icon_size //Refer to http://www.byond.com/docs/ref/info.html#/client/var/view for mad maths diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index eb135b6e0b9..458ab877c78 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -187,7 +187,7 @@ obj/item/weapon/gun/proc/newshot() sprd = round((rand() - 0.5) * spread) else sprd = round((i / burst_size - 0.5) * spread) - if(!chambered.fire(target, user, params, suppressed, zone_override, sprd)) + if(!chambered.fire(target, user, params, ,suppressed, zone_override, sprd)) shoot_with_empty_chamber(user) break else diff --git a/code/modules/projectiles/guns/energy/special.dm b/code/modules/projectiles/guns/energy/special.dm index 47adcd9a946..bee8ac46ed2 100644 --- a/code/modules/projectiles/guns/energy/special.dm +++ b/code/modules/projectiles/guns/energy/special.dm @@ -360,14 +360,6 @@ item_state = "instagibblue" ammo_type = list(/obj/item/ammo_casing/energy/instakill/blue) -obj/item/weapon/gun/energy/staff/focus - name = "mental focus" - desc = "An artefact that channels the will of the user into destructive bolts of force. If you aren't careful with it, you might poke someone's brain out." - icon = 'icons/obj/wizard.dmi' - icon_state = "focus" - item_state = "focus" - ammo_type = list(/obj/item/ammo_casing/forcebolt) - /obj/item/weapon/gun/energy/clown name = "HONK Rifle" desc = "Clown Planet's finest." diff --git a/code/modules/projectiles/guns/magic.dm b/code/modules/projectiles/guns/magic.dm index 3de33a805fe..870ae85bc63 100644 --- a/code/modules/projectiles/guns/magic.dm +++ b/code/modules/projectiles/guns/magic.dm @@ -4,6 +4,7 @@ icon = 'icons/obj/guns/magic.dmi' icon_state = "staffofnothing" item_state = "staff" + fire_sound = 'sound/weapons/emitter.ogg' fire_sound_text = "energy blast" flags = CONDUCT w_class = 5 diff --git a/code/modules/projectiles/guns/magic/staff.dm b/code/modules/projectiles/guns/magic/staff.dm index 0a52f5ba416..85b483b8363 100644 --- a/code/modules/projectiles/guns/magic/staff.dm +++ b/code/modules/projectiles/guns/magic/staff.dm @@ -54,3 +54,11 @@ obj/item/weapon/gun/magic/staff/door item_state = "honker" max_charges = 4 recharge_rate = 8 + +obj/item/weapon/gun/magic/staff/focus + name = "mental focus" + desc = "An artefact that channels the will of the user into destructive bolts of force. If you aren't careful with it, you might poke someone's brain out." + icon = 'icons/obj/wizard.dmi' + icon_state = "focus" + item_state = "focus" + ammo_type = list(/obj/item/ammo_casing/forcebolt) diff --git a/code/modules/projectiles/projectile/special.dm b/code/modules/projectiles/projectile/special.dm index e9414888a50..0d0eba709ff 100644 --- a/code/modules/projectiles/projectile/special.dm +++ b/code/modules/projectiles/projectile/special.dm @@ -239,7 +239,7 @@ obj/item/projectile/kinetic/New() if(istype(target_turf, /turf/simulated/mineral)) var/turf/simulated/mineral/M = target_turf M.gets_drilled(firer) - new /obj/item/effect/kinetic_blast(target_turf) + new /obj/effect/kinetic_blast(target_turf) if(splash) for(var/turf/T in range(splash, target_turf)) if(istype(T, /turf/simulated/mineral)) @@ -252,7 +252,7 @@ obj/item/projectile/kinetic/New() icon_state = "kinetic_blast" layer = 4.1 -/obj/item/effect/kinetic_blast/New() +/obj/effect/kinetic_blast/New() spawn(4) qdel(src)