mirror of
https://github.com/vgstation-coders/vgstation13.git
synced 2025-12-10 10:21:11 +00:00
167 lines
4.2 KiB
Plaintext
167 lines
4.2 KiB
Plaintext
/obj/item/projectile/rocket
|
|
name = "rocket"
|
|
icon_state = "rpground"
|
|
damage = 50
|
|
stun = 5
|
|
weaken = 5
|
|
damage_type = BRUTE
|
|
nodamage = 0
|
|
flag = "bullet"
|
|
var/embed = 1
|
|
var/picked_up_speed = 5
|
|
|
|
/obj/item/projectile/rocket/process_step()
|
|
if(src.loc)
|
|
if(picked_up_speed > 1)
|
|
picked_up_speed--
|
|
if(dist_x > dist_y)
|
|
bresenham_step(dist_x,dist_y,dx,dy)
|
|
else
|
|
bresenham_step(dist_y,dist_x,dy,dx)
|
|
if(linear_movement)
|
|
update_pixel()
|
|
pixel_x = PixelX
|
|
pixel_y = PixelY
|
|
sleep(picked_up_speed)
|
|
|
|
/obj/item/projectile/rocket/Bump(var/atom/rocket)
|
|
explosion(rocket, -1, 1, 4, 8)
|
|
qdel(src)
|
|
|
|
/obj/item/projectile/nikita
|
|
name = "\improper Nikita missile"
|
|
desc = "One does not simply dodge a nikita missile."
|
|
icon = 'icons/obj/projectiles_experimental.dmi'
|
|
icon_state = "nikita"
|
|
damage = 50
|
|
stun = 5
|
|
weaken = 5
|
|
damage_type = BRUTE
|
|
nodamage = 0
|
|
flag = "bullet"
|
|
animate_movement = 2
|
|
linear_movement = 0
|
|
kill_count = 100
|
|
layer = 13
|
|
var/mob/living/carbon/mob = null
|
|
var/obj/item/weapon/gun/projectile/rocketlauncher/nikita/nikita = null
|
|
var/steps_since_last_turn = 0
|
|
var/last_dir = null
|
|
var/emagged = 0//the value is set by the Nikita when it fires it
|
|
|
|
/obj/item/projectile/nikita/OnFired()
|
|
nikita = shot_from
|
|
emagged = nikita.emagged
|
|
|
|
if(nikita && istype(nikita.loc,/mob/living/carbon))
|
|
var/mob/living/carbon/C = nikita.loc
|
|
if(C.get_active_hand() == nikita)
|
|
mob = C
|
|
mob.client.perspective = EYE_PERSPECTIVE
|
|
mob.client.eye = src
|
|
mob.orient_object = src
|
|
mob.canmove = 0
|
|
|
|
dir = get_dir_cardinal(starting,original)
|
|
last_dir = dir
|
|
|
|
if(mob && emagged)
|
|
for(var/obj/item/W in mob.get_all_slots())
|
|
mob.drop_from_inventory(W)//were you're going you won't need those!
|
|
|
|
/obj/item/projectile/nikita/emp_act(severity)
|
|
new/obj/item/ammo_casing/rocket_rpg/nikita(get_turf(src))
|
|
if(nikita)
|
|
nikita.fired = null
|
|
qdel(src)
|
|
|
|
/obj/item/projectile/nikita/bullet_act(var/obj/item/projectile/Proj)
|
|
if(istype(Proj ,/obj/item/projectile/beam)||istype(Proj,/obj/item/projectile/bullet)||istype(Proj,/obj/item/projectile/ricochet))
|
|
if(!istype(Proj ,/obj/item/projectile/beam/lastertag) && !istype(Proj ,/obj/item/projectile/beam/practice) )
|
|
detonate()
|
|
|
|
/obj/item/projectile/nikita/Destroy()
|
|
reset_view()
|
|
if(nikita)
|
|
nikita.fired = null
|
|
..()
|
|
|
|
/obj/item/projectile/nikita/Bump(var/atom/A)
|
|
if(bumped)
|
|
return
|
|
if(emagged && (A == mob))
|
|
return
|
|
bumped = 1
|
|
detonate(get_turf(A))
|
|
|
|
/obj/item/projectile/nikita/Bumped(var/atom/A)
|
|
if(emagged && (A == mob))
|
|
return
|
|
detonate()
|
|
|
|
/obj/item/projectile/nikita/process_step()
|
|
if(!emagged && !check_user())//if the original user dropped the Nikita and the missile is still in the air, we check if someone picked it up.
|
|
if(nikita && istype(nikita.loc,/mob/living/carbon))
|
|
var/mob/living/carbon/C = nikita.loc
|
|
if(C.get_active_hand() == nikita)
|
|
mob = C
|
|
mob.client.perspective = EYE_PERSPECTIVE
|
|
mob.client.eye = src
|
|
mob.orient_object = src
|
|
mob.canmove = 0
|
|
|
|
if(src.loc)
|
|
var/atom/step = get_step(src, dir)
|
|
if(!step)
|
|
qdel(src)
|
|
src.Move(step)
|
|
|
|
if(mob)
|
|
if(emagged)
|
|
mob.loc = loc
|
|
mob.dir = dir
|
|
else
|
|
mob.dir = get_dir(mob,src)
|
|
|
|
if(!emagged)
|
|
kill_count--
|
|
if(!kill_count)
|
|
detonate()
|
|
|
|
if(kill_count == (initial(kill_count)/5))
|
|
mob.playsound_local(mob, 'sound/machines/twobeep.ogg', 30, 1)
|
|
mob << "<span class='warning'>WARNING: 20% fuel left on missile before self-detonation.<span>"
|
|
if(dir != last_dir)
|
|
last_dir = dir
|
|
steps_since_last_turn = 0
|
|
|
|
var/sleeptime = max(1,(steps_since_last_turn * -1) + 5)//5, 4, 3, 2, 1, 1, 1, 1, 1,...
|
|
|
|
steps_since_last_turn++
|
|
|
|
sleep(sleeptime)
|
|
|
|
/obj/item/projectile/nikita/CanPass(atom/movable/mover, turf/target, height=1.5, air_group = 0)
|
|
return (!density || !height || air_group)
|
|
|
|
/obj/item/projectile/nikita/proc/check_user()
|
|
if(!mob || !mob.client)
|
|
return 0
|
|
if(mob.stat || (mob.get_active_hand() != src))
|
|
reset_view()
|
|
return 0
|
|
return 1
|
|
|
|
/obj/item/projectile/nikita/proc/detonate(var/explosion = loc)
|
|
explosion(explosion, -1, 1, 4, 8)
|
|
if(src)
|
|
qdel(src)
|
|
|
|
/obj/item/projectile/nikita/proc/reset_view()
|
|
if(mob && mob.client)
|
|
mob.client.eye = mob.client.mob
|
|
mob.client.perspective = MOB_PERSPECTIVE
|
|
mob.orient_object = null
|
|
mob.canmove = 1
|
|
mob = null
|