Event / Future PoI / Other weaponry & tools.
@@ -180,6 +180,25 @@ the artifact triggers the rage.
|
|||||||
accuracy = -75 // Aiming requires focus.
|
accuracy = -75 // Aiming requires focus.
|
||||||
accuracy_dispersion = 3 // Ditto.
|
accuracy_dispersion = 3 // Ditto.
|
||||||
evasion = -45 // Too angry to dodge.
|
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 = "<span class='critical'>Your wounds pain you greatly.</span>"
|
||||||
|
on_expired_text = "<span class='notice'>The pain lulls.</span>"
|
||||||
|
|
||||||
|
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
|
return FALSE
|
||||||
if(L.get_poison_protection() >= 1)
|
if(L.get_poison_protection() >= 1)
|
||||||
return FALSE
|
return FALSE
|
||||||
return TRUE
|
return TRUE
|
||||||
|
|||||||
@@ -288,4 +288,25 @@
|
|||||||
icon_state = "impact_invert"
|
icon_state = "impact_invert"
|
||||||
light_range = 2
|
light_range = 2
|
||||||
light_power = -2
|
light_power = -2
|
||||||
light_color = "#FFFFFF"
|
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"
|
||||||
@@ -8,6 +8,7 @@
|
|||||||
var/obj/item/weapon/cell/power_supply //What type of power cell this uses
|
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/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
|
var/cell_type = /obj/item/weapon/cell/device/weapon
|
||||||
projectile_type = /obj/item/projectile/beam/practice
|
projectile_type = /obj/item/projectile/beam/practice
|
||||||
|
|
||||||
@@ -89,13 +90,13 @@
|
|||||||
if(self_recharge || battery_lock)
|
if(self_recharge || battery_lock)
|
||||||
user << "<span class='notice'>[src] does not have a battery port.</span>"
|
user << "<span class='notice'>[src] does not have a battery port.</span>"
|
||||||
return
|
return
|
||||||
if(istype(C, /obj/item/weapon/cell/device))
|
if(istype(C, accept_cell_type))
|
||||||
var/obj/item/weapon/cell/device/P = C
|
var/obj/item/weapon/cell/P = C
|
||||||
if(power_supply)
|
if(power_supply)
|
||||||
user << "<span class='notice'>[src] already has a power cell.</span>"
|
user << "<span class='notice'>[src] already has a power cell.</span>"
|
||||||
else
|
else
|
||||||
user.visible_message("[user] is reloading [src].", "<span class='notice'>You start to insert [P] into [src].</span>")
|
user.visible_message("[user] is reloading [src].", "<span class='notice'>You start to insert [P] into [src].</span>")
|
||||||
if(do_after(user, 10))
|
if(do_after(user, 5 * P.w_class))
|
||||||
user.remove_from_mob(P)
|
user.remove_from_mob(P)
|
||||||
power_supply = P
|
power_supply = P
|
||||||
P.loc = src
|
P.loc = src
|
||||||
@@ -175,6 +176,13 @@
|
|||||||
icon_state = "[modifystate][ratio]"
|
icon_state = "[modifystate][ratio]"
|
||||||
else
|
else
|
||||||
icon_state = "[initial(icon_state)][ratio]"
|
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()
|
if(!ignore_inhands) update_held_icon()
|
||||||
|
|
||||||
/obj/item/weapon/gun/energy/proc/start_recharge()
|
/obj/item/weapon/gun/energy/proc/start_recharge()
|
||||||
|
|||||||
40
code/modules/projectiles/guns/energy/hooklauncher.dm
Normal file
@@ -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),
|
||||||
|
)
|
||||||
@@ -151,6 +151,42 @@
|
|||||||
|
|
||||||
toggle_scope(2.0)
|
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////////////////////
|
////////Laser Tag////////////////////
|
||||||
|
|
||||||
/obj/item/weapon/gun/energy/lasertag
|
/obj/item/weapon/gun/energy/lasertag
|
||||||
|
|||||||
@@ -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."
|
desc = "A massive weapon designed to pressure the opposition by raining down a torrent of energy pellets."
|
||||||
icon_state = "dakkalaser"
|
icon_state = "dakkalaser"
|
||||||
item_state = "dakkalaser"
|
item_state = "dakkalaser"
|
||||||
|
wielded_item_state = "dakkalaser-wielded"
|
||||||
fire_sound = 'sound/weapons/Laser.ogg'
|
fire_sound = 'sound/weapons/Laser.ogg'
|
||||||
w_class = ITEMSIZE_HUGE
|
w_class = ITEMSIZE_HUGE
|
||||||
charge_cost = 24 // 100 shots, it's a spray and pray (to RNGesus) weapon.
|
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="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="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)),
|
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)),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
/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, "<span class='notice'>\The [src] is already powering up!</span>")
|
||||||
|
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("<span class='cult'>[user] aims \the [src] at \the [A].</span>")
|
||||||
|
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, "<span class='notice'>\The [src] is already powering up!</span>")
|
||||||
|
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("<span class='cult'>[user] aims \the [src] at \the [A].</span>")
|
||||||
|
|
||||||
|
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, "<span class='notice'>\The [src] is already powering up!</span>")
|
||||||
|
|||||||
141
code/modules/projectiles/guns/magnetic/bore.dm
Normal file
@@ -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("<span class='notice'>\The [user] removes \the [removing] from \the [src].</span>")
|
||||||
|
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, "<span class='notice'>It has [mat_storage] out of [max_mat_storage] units of [ammo_material] loaded.</span>")
|
||||||
|
|
||||||
|
/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, "<span class='warning'>\The [src] already has \a [cell] installed.</span>")
|
||||||
|
return
|
||||||
|
cell = thing
|
||||||
|
user.drop_from_inventory(cell)
|
||||||
|
cell.forceMove(src)
|
||||||
|
playsound(loc, 'sound/machines/click.ogg', 10, 1)
|
||||||
|
user.visible_message("<span class='notice'>\The [user] slots \the [cell] into \the [src].</span>")
|
||||||
|
update_icon()
|
||||||
|
return
|
||||||
|
|
||||||
|
if(thing.is_screwdriver())
|
||||||
|
if(!capacitor)
|
||||||
|
to_chat(user, "<span class='warning'>\The [src] has no capacitor installed.</span>")
|
||||||
|
return
|
||||||
|
capacitor.forceMove(get_turf(src))
|
||||||
|
user.put_in_hands(capacitor)
|
||||||
|
user.visible_message("<span class='notice'>\The [user] unscrews \the [capacitor] from \the [src].</span>")
|
||||||
|
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, "<span class='warning'>\The [src] already has \a [capacitor] installed.</span>")
|
||||||
|
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("<span class='notice'>\The [user] slots \the [capacitor] into \the [src].</span>")
|
||||||
|
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, "<span class='warning'>\The [src] cannot hold more [ammo_material].</span>")
|
||||||
|
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("<span class='notice'>\The [user] loads \the [src] with \the [M].</span>")
|
||||||
|
playsound(loc, 'sound/weapons/flipblade.ogg', 50, 1)
|
||||||
|
update_icon()
|
||||||
|
return
|
||||||
|
. = ..()
|
||||||
192
code/modules/projectiles/projectile/hook.dm
Normal file
@@ -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("<span class='danger'>[H]'s [W] goes off due to \the [src]!</span>")
|
||||||
|
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("<span class='danger'>\The [src] has pushed [H]!</span>")
|
||||||
|
else
|
||||||
|
visible_message("<span class='warning'>\The [src] attempted to push [H]!</span>")
|
||||||
|
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("<span class='danger'>\The [src] has disarmed [H]!</span>")
|
||||||
|
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("<span class='notice'>\The [T] is snatched by \the [src]!</span>")
|
||||||
|
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("<span class='notice'>\The [src] [message] [target].</span>")
|
||||||
|
done_mob_unique = TRUE
|
||||||
|
success = TRUE
|
||||||
|
if(I_HURT)
|
||||||
|
if(prob(10) && istype(L, /mob/living/carbon/human))
|
||||||
|
to_chat(L, "<span class='warning'>\The [src] rips at your hands!</span>")
|
||||||
|
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("<span class='danger'>\The [src] sends \the [L] stumbling backwards.</span>")
|
||||||
|
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("<span class='critical'>\The [src] rips [L] towards \the [firer]!</span>")
|
||||||
|
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
|
||||||
@@ -116,4 +116,29 @@
|
|||||||
return ..(target, blocked, def_zone)
|
return ..(target, blocked, def_zone)
|
||||||
|
|
||||||
/obj/item/projectile/bullet/magnetic/fuelrod/supermatter/check_penetrate()
|
/obj/item/projectile/bullet/magnetic/fuelrod/supermatter/check_penetrate()
|
||||||
return 1
|
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
|
||||||
|
..()
|
||||||
|
|||||||
@@ -257,3 +257,82 @@
|
|||||||
visible_message("<span class='danger'>\The [src] splatters a layer of web on \the [target]!</span>")
|
visible_message("<span class='danger'>\The [src] splatters a layer of web on \the [target]!</span>")
|
||||||
new /obj/effect/spider/stickyweb(target.loc)
|
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("<span class='cult'>\The [src] slams into \the [target]'s [target_limb], reverberating loudly!</span>")
|
||||||
|
|
||||||
|
else if(armor_special)
|
||||||
|
target.visible_message("<span class='cult'>\The [src] slams into \the [target]'s [target_limb] with a low rumble!</span>")
|
||||||
|
|
||||||
|
..()
|
||||||
|
|
||||||
|
/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("<span class='danger'>\The [A] begins to glow!</span>")
|
||||||
|
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
|
||||||
|
..()
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 38 KiB After Width: | Height: | Size: 42 KiB |
|
Before Width: | Height: | Size: 61 KiB After Width: | Height: | Size: 66 KiB |
|
Before Width: | Height: | Size: 66 KiB After Width: | Height: | Size: 70 KiB |
|
Before Width: | Height: | Size: 3.7 KiB After Width: | Height: | Size: 5.0 KiB |
@@ -2588,7 +2588,11 @@
|
|||||||
#include "code\modules\projectiles\guns\modular_guns.dm"
|
#include "code\modules\projectiles\guns\modular_guns.dm"
|
||||||
#include "code\modules\projectiles\guns\projectile.dm"
|
#include "code\modules\projectiles\guns\projectile.dm"
|
||||||
#include "code\modules\projectiles\guns\vox.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\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\laser.dm"
|
||||||
#include "code\modules\projectiles\guns\energy\netgun_vr.dm"
|
#include "code\modules\projectiles\guns\energy\netgun_vr.dm"
|
||||||
#include "code\modules\projectiles\guns\energy\nuclear.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\pneumatic.dm"
|
||||||
#include "code\modules\projectiles\guns\launcher\rocket.dm"
|
#include "code\modules\projectiles\guns\launcher\rocket.dm"
|
||||||
#include "code\modules\projectiles\guns\launcher\syringe_gun.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.dm"
|
||||||
#include "code\modules\projectiles\guns\magnetic\magnetic_construction.dm"
|
#include "code\modules\projectiles\guns\magnetic\magnetic_construction.dm"
|
||||||
#include "code\modules\projectiles\guns\magnetic\magnetic_railgun.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.dm"
|
||||||
#include "code\modules\projectiles\projectile\energy_vr.dm"
|
#include "code\modules\projectiles\projectile\energy_vr.dm"
|
||||||
#include "code\modules\projectiles\projectile\force.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\magnetic.dm"
|
||||||
#include "code\modules\projectiles\projectile\pellets.dm"
|
#include "code\modules\projectiles\projectile\pellets.dm"
|
||||||
#include "code\modules\projectiles\projectile\special.dm"
|
#include "code\modules\projectiles\projectile\special.dm"
|
||||||
|
|||||||