diff --git a/code/modules/mob/_modifiers/modifiers_misc.dm b/code/modules/mob/_modifiers/modifiers_misc.dm index af5be943d1a..17e68b86478 100644 --- a/code/modules/mob/_modifiers/modifiers_misc.dm +++ b/code/modules/mob/_modifiers/modifiers_misc.dm @@ -180,6 +180,25 @@ the artifact triggers the rage. accuracy = -75 // Aiming requires focus. accuracy_dispersion = 3 // Ditto. evasion = -45 // Too angry to dodge. +<<<<<<< HEAD +======= + +// Non-cult version of deep wounds. +// Surprisingly, more dangerous. +/datum/modifier/grievous_wounds + name = "grievous wounds" + desc = "Your wounds are not easily mended." + + on_created_text = "Your wounds pain you greatly." + on_expired_text = "The pain lulls." + + stacks = MODIFIER_STACK_EXTEND + + incoming_healing_percent = 0.50 // 50% less healing. + disable_duration_percent = 1.22 // 22% longer disables. + bleeding_rate_percent = 1.20 // 20% more bleeding. + + accuracy_dispersion = 2 // A combination of fear and immense pain or damage reults in a twitching firing arm. Flee. @@ -246,4 +265,4 @@ the artifact triggers the rage. return FALSE if(L.get_poison_protection() >= 1) return FALSE - return TRUE \ No newline at end of file + return TRUE diff --git a/code/modules/projectiles/effects.dm b/code/modules/projectiles/effects.dm index da21427effa..856633ccd3a 100644 --- a/code/modules/projectiles/effects.dm +++ b/code/modules/projectiles/effects.dm @@ -288,4 +288,25 @@ icon_state = "impact_invert" light_range = 2 light_power = -2 - light_color = "#FFFFFF" \ No newline at end of file + light_color = "#FFFFFF" + +//---------------------------- +// Magnetohydronamic Howitzer +//---------------------------- +/obj/effect/projectile/tungsten/tracer + icon_state = "mhd_laser" + light_range = 4 + light_power = 3 + light_color = "#3300ff" + +/obj/effect/projectile/tungsten/muzzle + icon_state = "muzzle_mhd_laser" + light_range = 4 + light_power = 3 + light_color = "#3300ff" + +/obj/effect/projectile/tungsten/impact + icon_state = "impact_mhd_laser" + light_range = 4 + light_power = 3 + light_color = "#3300ff" \ No newline at end of file diff --git a/code/modules/projectiles/guns/energy.dm b/code/modules/projectiles/guns/energy.dm index 4d0f014c932..011469ae4ed 100644 --- a/code/modules/projectiles/guns/energy.dm +++ b/code/modules/projectiles/guns/energy.dm @@ -8,6 +8,7 @@ var/obj/item/weapon/cell/power_supply //What type of power cell this uses var/charge_cost = 240 //How much energy is needed to fire. + var/accept_cell_type = /obj/item/weapon/cell/device var/cell_type = /obj/item/weapon/cell/device/weapon projectile_type = /obj/item/projectile/beam/practice @@ -89,13 +90,13 @@ if(self_recharge || battery_lock) user << "[src] does not have a battery port." return - if(istype(C, /obj/item/weapon/cell/device)) - var/obj/item/weapon/cell/device/P = C + if(istype(C, accept_cell_type)) + var/obj/item/weapon/cell/P = C if(power_supply) user << "[src] already has a power cell." else user.visible_message("[user] is reloading [src].", "You start to insert [P] into [src].") - if(do_after(user, 10)) + if(do_after(user, 5 * P.w_class)) user.remove_from_mob(P) power_supply = P P.loc = src @@ -175,6 +176,13 @@ icon_state = "[modifystate][ratio]" else icon_state = "[initial(icon_state)][ratio]" + + else if(power_supply) + if(modifystate) + icon_state = "[modifystate]" + else + icon_state = "[initial(icon_state)]" + if(!ignore_inhands) update_held_icon() /obj/item/weapon/gun/energy/proc/start_recharge() diff --git a/code/modules/projectiles/guns/energy/hooklauncher.dm b/code/modules/projectiles/guns/energy/hooklauncher.dm new file mode 100644 index 00000000000..dbb74c775a5 --- /dev/null +++ b/code/modules/projectiles/guns/energy/hooklauncher.dm @@ -0,0 +1,40 @@ +/* + * Contains weapons primarily using the 'grappling hook' projectiles. + */ + +/obj/item/weapon/gun/energy/hooklauncher + name = "gravity whip" + desc = "A large, strange gauntlet." + icon_state = "gravwhip" + item_state = "gravwhip" + fire_sound = 'sound/effects/zzzt.ogg' + fire_sound_text = "laser blast" + + fire_delay = 15 + charge_cost = 300 + + cell_type = /obj/item/weapon/cell/device/weapon + projectile_type = /obj/item/projectile/energy/hook + +// An easily concealable not-ripoff version. It would be silenced, if it didn't make it blatant you're the one using it. + +/obj/item/weapon/gun/energy/hooklauncher/ring + name = "ominous ring" + desc = "A small ring with strange symbols engraved upon it." + icon = 'icons/obj/clothing/rings.dmi' + icon_state = "seal-signet" + item_state = "concealed" + + w_class = ITEMSIZE_TINY + + cell_type = /obj/item/weapon/cell/device/weapon/recharge/alien + battery_lock = TRUE + charge_cost = 400 + charge_meter = FALSE + + projectile_type = /obj/item/projectile/energy/hook/ring + + firemodes = list( + list(mode_name="manipulate", fire_delay=15, projectile_type=/obj/item/projectile/energy/hook/ring, charge_cost = 400), + list(mode_name="battle", fire_delay=8, projectile_type=/obj/item/projectile/beam/xray, charge_cost = 260), + ) diff --git a/code/modules/projectiles/guns/energy/laser.dm b/code/modules/projectiles/guns/energy/laser.dm index 5cfefc1bf58..3c831341263 100644 --- a/code/modules/projectiles/guns/energy/laser.dm +++ b/code/modules/projectiles/guns/energy/laser.dm @@ -151,6 +151,42 @@ toggle_scope(2.0) +/obj/item/weapon/gun/energy/monorifle + name = "antique mono-rifle" + desc = "An old laser rifle. This one can only fire once before requiring recharging." + description_fluff = "Modeled after ancient hunting rifles, this rifle was dubbed the 'Rainy Day Special' by some, due to its use as some barmens' fight-stopper of choice. One shot is all it takes, or so they say." + icon_state = "eshotgun" + item_state = "shotgun" + fire_sound = 'sound/weapons/gauss_shoot.ogg' + origin_tech = list(TECH_COMBAT = 6, TECH_MATERIAL = 4, TECH_POWER = 3) + projectile_type = /obj/item/projectile/beam/sniper + slot_flags = SLOT_BACK + charge_cost = 1300 + fire_delay = 20 + force = 8 + w_class = ITEMSIZE_LARGE + accuracy = 10 + scoped_accuracy = 15 + var/scope_multiplier = 1.5 + +/obj/item/weapon/gun/energy/monorifle/verb/sights() + set category = "Object" + set name = "Aim Down Sights" + set popup_menu = 1 + + toggle_scope(scope_multiplier) + +/obj/item/weapon/gun/energy/monorifle/combat + name = "combat mono-rifle" + desc = "A modernized version of the mono-rifle. This one can fire twice before requiring recharging." + description_fluff = "A modern design produced by a company once working from Saint Columbia, based on the antique mono-rifle 'Rainy Day Special' design." + icon_state = "ecshotgun" + item_state = "cshotgun" + charge_cost = 1000 + force = 12 + accuracy = 0 + scoped_accuracy = 20 + ////////Laser Tag//////////////////// /obj/item/weapon/gun/energy/lasertag diff --git a/code/modules/projectiles/guns/energy/special.dm b/code/modules/projectiles/guns/energy/special.dm index 7bd20cdcef6..51d4d6c2a13 100644 --- a/code/modules/projectiles/guns/energy/special.dm +++ b/code/modules/projectiles/guns/energy/special.dm @@ -186,6 +186,7 @@ obj/item/weapon/gun/energy/staff/focus desc = "A massive weapon designed to pressure the opposition by raining down a torrent of energy pellets." icon_state = "dakkalaser" item_state = "dakkalaser" + wielded_item_state = "dakkalaser-wielded" fire_sound = 'sound/weapons/Laser.ogg' w_class = ITEMSIZE_HUGE charge_cost = 24 // 100 shots, it's a spray and pray (to RNGesus) weapon. @@ -200,4 +201,94 @@ obj/item/weapon/gun/energy/staff/focus list(mode_name="single shot", burst = 1, burst_accuracy = list(75), dispersion = list(0), charge_cost = 24), list(mode_name="five shot burst", burst = 5, burst_accuracy = list(75,75,75,75,75), dispersion = list(1,1,1,1,1)), list(mode_name="ten shot burst", burst = 10, burst_accuracy = list(75,75,75,75,75,75,75,75,75,75), dispersion = list(2,2,2,2,2,2,2,2,2,2)), - ) \ No newline at end of file + ) + +/obj/item/weapon/gun/energy/maghowitzer + name = "portable MHD howitzer" + desc = "A massive weapon designed to destroy fortifications with a stream of molten tungsten." + description_fluff = "A weapon designed by joint cooperation of NanoTrasen, Hephaestus, and SCG scientists. Everything else is red tape and black highlighters." + description_info = "This weapon requires a wind-up period before being able to fire. Clicking on a target will create a beam between you and its turf, starting the timer. Upon completion, it will fire at the designated location." + icon_state = "mhdhowitzer" + item_state = "mhdhowitzer" + wielded_item_state = "mhdhowitzer-wielded" + fire_sound = 'sound/weapons/emitter2.ogg' + w_class = ITEMSIZE_HUGE + + charge_cost = 10000 // Uses large cells, can at max have 3 shots. + projectile_type = /obj/item/projectile/beam/tungsten + cell_type = /obj/item/weapon/cell/high + accept_cell_type = /obj/item/weapon/cell + + accuracy = 75 + charge_meter = 0 + one_handed_penalty = 30 + + var/power_cycle = FALSE + +/obj/item/weapon/gun/energy/maghowitzer/proc/pick_random_target(var/turf/T) + var/foundmob = FALSE + var/foundmobs = list() + for(var/mob/living/L in T.contents) + foundmob = TRUE + foundmobs += L + if(foundmob) + var/return_target = pick(foundmobs) + return return_target + return FALSE + +/obj/item/weapon/gun/energy/maghowitzer/attack(atom/A, mob/living/user, def_zone) + if(power_cycle) + to_chat(user, "\The [src] is already powering up!") + return 0 + var/turf/target_turf = get_turf(A) + var/beameffect = user.Beam(target_turf,icon_state="sat_beam",icon='icons/effects/beam.dmi',time=31, maxdistance=10,beam_type=/obj/effect/ebeam,beam_sleep_time=3) + if(beameffect) + user.visible_message("[user] aims \the [src] at \the [A].") + if(power_supply && power_supply.charge >= charge_cost) //Do a delay for pointblanking too. + power_cycle = TRUE + if(do_after(user, 30)) + if(A.loc == target_turf) + ..(A, user, def_zone) + else + var/rand_target = pick_random_target(target_turf) + if(rand_target) + ..(rand_target, user, def_zone) + else + ..(target_turf, user, def_zone) + else + if(beameffect) + qdel(beameffect) + power_cycle = FALSE + else + ..(A, user, def_zone) //If it can't fire, just bash with no delay. + +/obj/item/weapon/gun/energy/maghowitzer/afterattack(atom/A, mob/living/user, adjacent, params) + if(power_cycle) + to_chat(user, "\The [src] is already powering up!") + return 0 + + var/turf/target_turf = get_turf(A) + + var/beameffect = user.Beam(target_turf,icon_state="sat_beam",icon='icons/effects/beam.dmi',time=31, maxdistance=10,beam_type=/obj/effect/ebeam,beam_sleep_time=3) + + if(beameffect) + user.visible_message("[user] aims \the [src] at \the [A].") + + if(!power_cycle) + power_cycle = TRUE + if(do_after(user, 30)) + if(A.loc == target_turf) + ..(A, user, adjacent, params) + else + var/rand_target = pick_random_target(target_turf) + if(rand_target) + ..(rand_target, user, adjacent, params) + else + ..(target_turf, user, adjacent, params) + else + if(beameffect) + qdel(beameffect) + handle_click_empty(user) + power_cycle = FALSE + else + to_chat(user, "\The [src] is already powering up!") diff --git a/code/modules/projectiles/guns/magnetic/bore.dm b/code/modules/projectiles/guns/magnetic/bore.dm new file mode 100644 index 00000000000..e27fdc38d64 --- /dev/null +++ b/code/modules/projectiles/guns/magnetic/bore.dm @@ -0,0 +1,141 @@ +/obj/item/weapon/gun/magnetic/matfed + name = "portable phoron bore" + desc = "A large man-portable tunnel bore, using phorogenic plasma blasts. Point away from user." + description_fluff = "An aging Grayson Manufactories mining tool used for rapidly digging through rock. Mass production was discontinued when many of the devices were stolen and used to break into a high security facility by Boiling Point drones." + description_antag = "This device is exceptional at breaking down walls, though it is incredibly loud when doing so." + description_info = "The projectile of this tool will travel six tiles before dissipating, excavating mineral walls as it does so. It can be reloaded with phoron sheets." + + icon_state = "bore" + item_state = "bore" + wielded_item_state = "bore-wielded" + one_handed_penalty = 5 + + projectile_type = /obj/item/projectile/bullet/magnetic/bore + + gun_unreliable = 0 + + power_cost = 750 + load_type = /obj/item/stack/material + var/mat_storage = 0 // How much material is stored inside? Input in multiples of 2000 as per auto/protolathe. + var/max_mat_storage = 8000 // How much material can be stored inside? + var/mat_cost = 500 // How much material is used per-shot? + var/ammo_material = MAT_PHORON + var/loading = FALSE + +/obj/item/weapon/gun/magnetic/matfed/examine(mob/user) + . = ..() + show_ammo(user) + +/obj/item/weapon/gun/magnetic/matfed/update_icon() + var/list/overlays_to_add = list() + if(removable_components) + if(cell) + overlays_to_add += image(icon, "[icon_state]_cell") + if(capacitor) + overlays_to_add += image(icon, "[icon_state]_capacitor") + if(!cell || !capacitor) + overlays_to_add += image(icon, "[icon_state]_red") + else if(capacitor.charge < power_cost) + overlays_to_add += image(icon, "[icon_state]_amber") + else + overlays_to_add += image(icon, "[icon_state]_green") + if(mat_storage) + overlays_to_add += image(icon, "[icon_state]_loaded") + + overlays = overlays_to_add + ..() +/obj/item/weapon/gun/magnetic/matfed/attack_hand(var/mob/user) // It doesn't keep a loaded item inside. + if(user.get_inactive_hand() == src) + var/obj/item/removing + + if(cell && removable_components) + removing = cell + cell = null + + if(removing) + removing.forceMove(get_turf(src)) + user.put_in_hands(removing) + user.visible_message("\The [user] removes \the [removing] from \the [src].") + playsound(loc, 'sound/machines/click.ogg', 10, 1) + update_icon() + return + . = ..() + +/obj/item/weapon/gun/magnetic/matfed/check_ammo() + if(mat_storage - mat_cost >= 0) + return TRUE + return FALSE + +/obj/item/weapon/gun/magnetic/matfed/use_ammo() + mat_storage -= mat_cost + +/obj/item/weapon/gun/magnetic/matfed/show_ammo(var/mob/user) + if(mat_storage) + to_chat(user, "It has [mat_storage] out of [max_mat_storage] units of [ammo_material] loaded.") + +/obj/item/weapon/gun/magnetic/matfed/attackby(var/obj/item/thing, var/mob/user) + if(removable_components) + if(istype(thing, /obj/item/weapon/cell)) + if(cell) + to_chat(user, "\The [src] already has \a [cell] installed.") + return + cell = thing + user.drop_from_inventory(cell) + cell.forceMove(src) + playsound(loc, 'sound/machines/click.ogg', 10, 1) + user.visible_message("\The [user] slots \the [cell] into \the [src].") + update_icon() + return + + if(thing.is_screwdriver()) + if(!capacitor) + to_chat(user, "\The [src] has no capacitor installed.") + return + capacitor.forceMove(get_turf(src)) + user.put_in_hands(capacitor) + user.visible_message("\The [user] unscrews \the [capacitor] from \the [src].") + playsound(loc, 'sound/items/Screwdriver.ogg', 50, 1) + capacitor = null + update_icon() + return + + if(istype(thing, /obj/item/weapon/stock_parts/capacitor)) + if(capacitor) + to_chat(user, "\The [src] already has \a [capacitor] installed.") + return + capacitor = thing + user.drop_from_inventory(capacitor) + capacitor.forceMove(src) + playsound(loc, 'sound/machines/click.ogg', 10, 1) + power_per_tick = (power_cost*0.15) * capacitor.rating + user.visible_message("\The [user] slots \the [capacitor] into \the [src].") + update_icon() + return + + if(istype(thing, load_type)) + loading = TRUE + var/obj/item/stack/material/M = thing + + if(!M.material || M.material.name != ammo_material) + return + + if(mat_storage + 2000 > max_mat_storage) + to_chat(user, "\The [src] cannot hold more [ammo_material].") + return + + var/can_hold_val = 0 + while(can_hold_val < round(max_mat_storage / 2000)) + if(mat_storage + 2000 <= max_mat_storage && do_after(user,1.5 SECONDS)) + can_hold_val ++ + mat_storage += 2000 + playsound(loc, 'sound/effects/phasein.ogg', 15, 1) + else + loading = FALSE + break + M.use(can_hold_val) + + user.visible_message("\The [user] loads \the [src] with \the [M].") + playsound(loc, 'sound/weapons/flipblade.ogg', 50, 1) + update_icon() + return + . = ..() diff --git a/code/modules/projectiles/projectile/hook.dm b/code/modules/projectiles/projectile/hook.dm new file mode 100644 index 00000000000..ef8e9bc7c69 --- /dev/null +++ b/code/modules/projectiles/projectile/hook.dm @@ -0,0 +1,192 @@ +/* + * File containing special 'hook' projectiles. Function is dictated by the launcher's intent. + */ + +/obj/item/projectile/energy/hook + name = "graviton sphere" + icon_state = "bluespace" + + var/beam_state = "b_beam" + + damage = 5 + step_delay = 2 + damage_type = BURN + check_armour = "energy" + armor_penetration = 15 + + var/impact_sound = 'sound/effects/uncloak.ogg' + var/crack_sound = 'sound/effects/teleport.ogg' + + var/target_distance = null // Shamelessly stolen from arcing projectiles. + var/my_tracking_beam = null // Beam made by the launcher. Tracked here to destroy it in time with the impact. + var/launcher_intent = null // Stores the launcher's intent. + + var/disarm_chance = 60 // Chance for a successful disarm hit. The inverse is a throw away from the firer. + + var/list/help_messages = list("slaps", "pokes", "nudges", "bumps", "pinches") + var/done_mob_unique = FALSE // Has the projectile already done something to a mob? + +/obj/item/projectile/energy/hook/launch(atom/target, target_zone, x_offset=0, y_offset=0, angle_offset=0) + var/expected_distance = get_dist(target, loc) + kill_count = expected_distance // So the hook hits the ground if no mob is hit. + target_distance = expected_distance + if(firer) // Needed to ensure later checks in impact and on hit function. + launcher_intent = firer.a_intent + firer.Beam(src,icon_state=beam_state,icon='icons/effects/beam.dmi',time=60, maxdistance=10,beam_type=/obj/effect/ebeam,beam_sleep_time=1) + + if(launcher_intent) + switch(launcher_intent) + if(I_HURT) + check_armour = "bullet" + damage *= 3 + sharp = 1 + agony = 20 + if(I_GRAB) + check_armour = "melee" + damage_type = HALLOSS + if(I_DISARM) + check_armour = "melee" + if(prob(30)) // A chance for a successful hit to either knock someone down, or cause minor disorientation. + weaken = 1 + else + stun = 2 + eyeblur = 3 + if(I_HELP) + silenced = 1 + damage_type = HALLOSS + + ..() // Does the regular launching stuff. + +/obj/item/projectile/energy/hook/on_hit(var/atom/target, var/blocked = 0, var/def_zone = null) + if(..()) + perform_intent_unique(target) + +/obj/item/projectile/energy/hook/on_impact(var/atom/A) + perform_intent_unique(get_turf(A)) + +/obj/item/projectile/energy/hook/proc/ranged_disarm(var/mob/living/carbon/human/H) + if(istype(H)) + var/list/holding = list(H.get_active_hand() = 60, H.get_inactive_hand() = 40) + + for(var/obj/item/weapon/gun/W in holding) // Guns are complex devices, both of a mechanical and electronic nature. A weird gravity ball or other type of object trying to pull or grab it is likely not safe. + if(W && prob(holding[W])) + var/list/turfs = list() + for(var/turf/T in view()) + turfs += T + if(turfs.len) + var/turf/target = pick(turfs) + visible_message("[H]'s [W] goes off due to \the [src]!") + return W.afterattack(target,H) + + if(!(H.species.flags & NO_SLIP) && prob(50)) + var/armor_check = H.run_armor_check(def_zone, "melee") + H.apply_effect(3, WEAKEN, armor_check) + playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) + if(armor_check < 60) + visible_message("\The [src] has pushed [H]!") + else + visible_message("\The [src] attempted to push [H]!") + return + + else + if(H.break_all_grabs(firer)) + playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) + return + + for(var/obj/item/I in holding) + if(I) + H.drop_from_inventory(I) + visible_message("\The [src] has disarmed [H]!") + playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) + return + + +/obj/item/projectile/energy/hook/proc/perform_intent_unique(atom/target) + playsound(src.loc, impact_sound, 40, 1) + var/success = FALSE + if(istype(target,/turf)) + if(launcher_intent) + if(launcher_intent != I_HELP && !done_mob_unique) + var/target_mob = pick(/mob/living in target.contents) + + if(!target_mob) + return + + if(Bump(target_mob, forced=1)) //If we hit a turf, try to force an interaction with a mob on the turf. + done_mob_unique = TRUE + success = TRUE + else if(firer) + var/obj/T + + if(original in target.contents && istype(original, /obj)) + T = original + + var/list/possible_targets = list() + for(var/obj/item/I in target.contents) + if(!I.anchored) + possible_targets += I + for(var/obj/structure/S in target.contents) + if(!S.anchored) + possible_targets += S + + if(!T) + if(!possible_targets || !possible_targets.len) + return + T = pick(possible_targets) + + spawn(2) + playsound(target, crack_sound, 40, 1) + visible_message("\The [T] is snatched by \the [src]!") + T.throw_at(get_turf(firer), 7, 1, src) + success = TRUE + else if(isliving(target) && !done_mob_unique) + var/mob/living/L = target + if(launcher_intent) + switch(launcher_intent) + if(I_HELP) + var/message = pick(help_messages) + if(message == "slaps") + spawn(1) + playsound(loc, 'sound/effects/snap.ogg', 50, 1) + visible_message("\The [src] [message] [target].") + done_mob_unique = TRUE + success = TRUE + if(I_HURT) + if(prob(10) && istype(L, /mob/living/carbon/human)) + to_chat(L, "\The [src] rips at your hands!") + ranged_disarm(L) + success = TRUE + done_mob_unique = TRUE + if(I_DISARM) + if(prob(disarm_chance) && istype(L, /mob/living/carbon/human)) + ranged_disarm(L) + else + L.visible_message("\The [src] sends \the [L] stumbling backwards.") + L.throw_at(get_turf(get_step(L,get_dir(firer,L))), 1, 1, src) + done_mob_unique = TRUE + success = TRUE + if(I_GRAB) + var/turf/STurf = get_turf(L) + spawn(2) + playsound(STurf, crack_sound, 60, 1) + L.visible_message("\The [src] rips [L] towards \the [firer]!") + L.throw_at(get_turf(get_step(firer,get_dir(firer,L))), 6, 1, src) + done_mob_unique = TRUE + success = TRUE + else if(istype(target, /obj/structure)) + var/obj/structure/S = target + if(!S.anchored) + S.throw_at(get_turf(get_step(firer,get_dir(firer,S))), 4, 1, src) + success = TRUE + qdel(my_tracking_beam) + return success + +/* + * Hook subtypes. + */ + +/obj/item/projectile/energy/hook/ring + name = "green orb" + icon_state = "green_laser" + beam_state = "n_beam" + damage = 3 diff --git a/code/modules/projectiles/projectile/magnetic.dm b/code/modules/projectiles/projectile/magnetic.dm index ed16ea208d0..1d8182aaea7 100644 --- a/code/modules/projectiles/projectile/magnetic.dm +++ b/code/modules/projectiles/projectile/magnetic.dm @@ -116,4 +116,29 @@ return ..(target, blocked, def_zone) /obj/item/projectile/bullet/magnetic/fuelrod/supermatter/check_penetrate() - return 1 \ No newline at end of file + return 1 + +/obj/item/projectile/bullet/magnetic/bore + name = "phorogenic blast" + icon_state = "purpleemitter" + damage = 20 + incendiary = 1 + armor_penetration = 20 + penetrating = 0 + check_armour = "melee" + irradiate = 20 + kill_count = 6 + +/obj/item/projectile/bullet/magnetic/bore/Bump(atom/A, forced=0) + if(istype(A, /turf/simulated/mineral)) + var/turf/simulated/mineral/MI = A + loc = get_turf(A) // Careful. + permutated.Add(A) + MI.GetDrilled(TRUE) + return 0 + else if(istype(A, /turf/simulated/wall) || istype(A, /turf/simulated/shuttle/wall)) // Cause a loud, but relatively minor explosion on the wall it hits. + explosion(A, -1, -1, 1, 3) + qdel(src) + return 1 + else + ..() diff --git a/code/modules/projectiles/projectile/special.dm b/code/modules/projectiles/projectile/special.dm index 2e27d125ef3..b60c82e11d9 100644 --- a/code/modules/projectiles/projectile/special.dm +++ b/code/modules/projectiles/projectile/special.dm @@ -257,3 +257,82 @@ visible_message("\The [src] splatters a layer of web on \the [target]!") new /obj/effect/spider/stickyweb(target.loc) ..() + +/obj/item/projectile/beam/tungsten + name = "core of molten tungsten" + icon_state = "energy" + fire_sound = 'sound/weapons/emitter2.ogg' + pass_flags = PASSTABLE | PASSGRILLE + damage = 70 + damage_type = BURN + check_armour = "laser" + light_range = 4 + light_power = 3 + light_color = "#3300ff" + + muzzle_type = /obj/effect/projectile/tungsten/muzzle + tracer_type = /obj/effect/projectile/tungsten/tracer + impact_type = /obj/effect/projectile/tungsten/impact + +/obj/item/projectile/beam/tungsten/on_hit(var/atom/target, var/blocked = 0) + if(isliving(target)) + var/mob/living/L = target + L.add_modifier(/datum/modifier/grievous_wounds, 30 SECONDS) + if(ishuman(L)) + var/mob/living/carbon/human/H = L + + var/target_armor = H.getarmor(def_zone, check_armour) + var/obj/item/organ/external/target_limb = H.get_organ(def_zone) + + var/armor_special = 0 + + if(target_armor >= 60) + var/turf/T = get_step(H, pick(alldirs - src.dir)) + H.throw_at(T, 1, 1, src) + H.apply_damage(20, BURN, def_zone) + if(target_limb) + armor_special = 2 + target_limb.fracture() + + else if(target_armor >= 45) + H.apply_damage(15, BURN, def_zone) + if(target_limb) + armor_special = 1 + target_limb.dislocate() + + else if(target_armor >= 30) + H.apply_damage(10, BURN, def_zone) + if(prob(30) && target_limb) + armor_special = 1 + target_limb.dislocate() + + else if(target_armor >= 15) + H.apply_damage(5, BURN, def_zone) + if(prob(15) && target_limb) + armor_special = 1 + target_limb.dislocate() + + if(armor_special > 1) + target.visible_message("\The [src] slams into \the [target]'s [target_limb], reverberating loudly!") + + else if(armor_special) + target.visible_message("\The [src] slams into \the [target]'s [target_limb] with a low rumble!") + + ..() + +/obj/item/projectile/beam/tungsten/on_impact(var/atom/A) + if(istype(A,/turf/simulated/shuttle/wall) || istype(A,/turf/simulated/wall) || (istype(A,/turf/simulated/mineral) && A.density) || istype(A,/obj/mecha) || istype(A,/obj/machinery/door)) + var/blast_dir = src.dir + A.visible_message("\The [A] begins to glow!") + spawn(2 SECONDS) + var/blastloc = get_step(A, blast_dir) + if(blastloc) + explosion(blastloc, -1, -1, 2, 3) + ..() + +/obj/item/projectile/beam/tungsten/Bump(atom/A, forced=0) + if(istype(A, /obj/structure/window)) //It does not pass through windows. It pulverizes them. + var/obj/structure/window/W = A + W.shatter() + return 0 + ..() diff --git a/icons/effects/projectiles.dmi b/icons/effects/projectiles.dmi index 2bf7813e05b..16683593795 100644 Binary files a/icons/effects/projectiles.dmi and b/icons/effects/projectiles.dmi differ diff --git a/icons/mob/items/lefthand_guns.dmi b/icons/mob/items/lefthand_guns.dmi index 72e9c00465a..c0431e2337f 100644 Binary files a/icons/mob/items/lefthand_guns.dmi and b/icons/mob/items/lefthand_guns.dmi differ diff --git a/icons/mob/items/righthand_guns.dmi b/icons/mob/items/righthand_guns.dmi index f3f75a86eaa..8047c95f71d 100644 Binary files a/icons/mob/items/righthand_guns.dmi and b/icons/mob/items/righthand_guns.dmi differ diff --git a/icons/obj/railgun.dmi b/icons/obj/railgun.dmi index 404aa1ea608..6f633db1e51 100644 Binary files a/icons/obj/railgun.dmi and b/icons/obj/railgun.dmi differ diff --git a/vorestation.dme b/vorestation.dme index 3806fae4887..be0b5c773e2 100644 --- a/vorestation.dme +++ b/vorestation.dme @@ -2588,7 +2588,11 @@ #include "code\modules\projectiles\guns\modular_guns.dm" #include "code\modules\projectiles\guns\projectile.dm" #include "code\modules\projectiles\guns\vox.dm" +<<<<<<< HEAD:vorestation.dme #include "code\modules\projectiles\guns\energy\kinetic_accelerator_vr.dm" +======= +#include "code\modules\projectiles\guns\energy\hooklauncher.dm" +>>>>>>> a428fad... Event / Future PoI / Other weaponry & tools. (#5764):polaris.dme #include "code\modules\projectiles\guns\energy\laser.dm" #include "code\modules\projectiles\guns\energy\netgun_vr.dm" #include "code\modules\projectiles\guns\energy\nuclear.dm" @@ -2606,6 +2610,7 @@ #include "code\modules\projectiles\guns\launcher\pneumatic.dm" #include "code\modules\projectiles\guns\launcher\rocket.dm" #include "code\modules\projectiles\guns\launcher\syringe_gun.dm" +#include "code\modules\projectiles\guns\magnetic\bore.dm" #include "code\modules\projectiles\guns\magnetic\magnetic.dm" #include "code\modules\projectiles\guns\magnetic\magnetic_construction.dm" #include "code\modules\projectiles\guns\magnetic\magnetic_railgun.dm" @@ -2631,6 +2636,7 @@ #include "code\modules\projectiles\projectile\energy.dm" #include "code\modules\projectiles\projectile\energy_vr.dm" #include "code\modules\projectiles\projectile\force.dm" +#include "code\modules\projectiles\projectile\hook.dm" #include "code\modules\projectiles\projectile\magnetic.dm" #include "code\modules\projectiles\projectile\pellets.dm" #include "code\modules\projectiles\projectile\special.dm"