mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-01-29 02:21:44 +00:00
## About The Pull Request In my effort to make the /icons/ folder cleaner and more intuitive instead of having to rely on recalling names of stuff and looking them up in code to find them for poor sods such as myself, plus in spurt of complusion to organize stuff, here goes. I've tracked all changes in commit descriptions. A lot still to be done, but I know these waves go over dozens of files making things slow, so went lighter on it. Destroyed useless impostor files taking up space and cleaned a stray pixel on my way. ## Why It's Good For The Game Cleaner /icons/ file means saner spriters, less time spent. Stray pixels and impostor files (ones which are copies of actually used ones elsewhere) are not good. ## Changelog 🆑 image: Cleaned a single stray pixel in a single frame of a bite telegraphing accidentaly found while re-organizing the files. /🆑
712 lines
18 KiB
Plaintext
712 lines
18 KiB
Plaintext
//unsorted miscellaneous temporary visuals
|
|
/obj/effect/temp_visual/dir_setting/bloodsplatter
|
|
icon = 'icons/effects/blood.dmi'
|
|
duration = 5
|
|
randomdir = FALSE
|
|
layer = BELOW_MOB_LAYER
|
|
plane = GAME_PLANE
|
|
var/splatter_type = "splatter"
|
|
|
|
/obj/effect/temp_visual/dir_setting/bloodsplatter/Initialize(mapload, set_dir)
|
|
if(ISDIAGONALDIR(set_dir))
|
|
icon_state = "[splatter_type][pick(1, 2, 6)]"
|
|
else
|
|
icon_state = "[splatter_type][pick(3, 4, 5)]"
|
|
. = ..()
|
|
var/target_pixel_x = 0
|
|
var/target_pixel_y = 0
|
|
switch(set_dir)
|
|
if(NORTH)
|
|
target_pixel_y = 16
|
|
if(SOUTH)
|
|
target_pixel_y = -16
|
|
layer = ABOVE_MOB_LAYER
|
|
if(EAST)
|
|
target_pixel_x = 16
|
|
if(WEST)
|
|
target_pixel_x = -16
|
|
if(NORTHEAST)
|
|
target_pixel_x = 16
|
|
target_pixel_y = 16
|
|
if(NORTHWEST)
|
|
target_pixel_x = -16
|
|
target_pixel_y = 16
|
|
if(SOUTHEAST)
|
|
target_pixel_x = 16
|
|
target_pixel_y = -16
|
|
layer = ABOVE_MOB_LAYER
|
|
if(SOUTHWEST)
|
|
target_pixel_x = -16
|
|
target_pixel_y = -16
|
|
layer = ABOVE_MOB_LAYER
|
|
animate(src, pixel_x = target_pixel_x, pixel_y = target_pixel_y, alpha = 0, time = duration)
|
|
|
|
/obj/effect/temp_visual/dir_setting/bloodsplatter/xenosplatter
|
|
splatter_type = "xsplatter"
|
|
|
|
/obj/effect/temp_visual/dir_setting/speedbike_trail
|
|
name = "speedbike trails"
|
|
icon_state = "ion_fade"
|
|
layer = BELOW_MOB_LAYER
|
|
plane = GAME_PLANE
|
|
duration = 10
|
|
randomdir = 0
|
|
|
|
/obj/effect/temp_visual/dir_setting/firing_effect
|
|
icon = 'icons/effects/effects.dmi'
|
|
icon_state = "firing_effect"
|
|
duration = 3
|
|
|
|
/obj/effect/temp_visual/dir_setting/firing_effect/setDir(newdir)
|
|
switch(newdir)
|
|
if(NORTH)
|
|
layer = BELOW_MOB_LAYER
|
|
pixel_x = rand(-3,3)
|
|
pixel_y = rand(4,6)
|
|
if(SOUTH)
|
|
pixel_x = rand(-3,3)
|
|
pixel_y = rand(-1,1)
|
|
else
|
|
pixel_x = rand(-1,1)
|
|
pixel_y = rand(-1,1)
|
|
..()
|
|
|
|
/obj/effect/temp_visual/dir_setting/firing_effect/blue
|
|
icon = 'icons/effects/effects.dmi'
|
|
icon_state = "firing_effect_blue"
|
|
duration = 3
|
|
|
|
/obj/effect/temp_visual/dir_setting/firing_effect/red
|
|
icon = 'icons/effects/effects.dmi'
|
|
icon_state = "firing_effect_red"
|
|
duration = 3
|
|
|
|
/obj/effect/temp_visual/dir_setting/firing_effect/magic
|
|
icon_state = "shieldsparkles"
|
|
duration = 3
|
|
|
|
/obj/effect/temp_visual/dir_setting/ninja
|
|
name = "ninja shadow"
|
|
icon = 'icons/mob/simple/mob.dmi'
|
|
icon_state = "uncloak"
|
|
duration = 9
|
|
|
|
/obj/effect/temp_visual/dir_setting/ninja/cloak
|
|
icon_state = "cloak"
|
|
|
|
/obj/effect/temp_visual/dir_setting/ninja/shadow
|
|
icon_state = "shadow"
|
|
|
|
/obj/effect/temp_visual/dir_setting/ninja/phase
|
|
name = "ninja energy"
|
|
icon_state = "phasein"
|
|
|
|
/obj/effect/temp_visual/dir_setting/ninja/phase/out
|
|
icon_state = "phaseout"
|
|
|
|
/obj/effect/temp_visual/dir_setting/wraith
|
|
name = "shadow"
|
|
icon = 'icons/mob/nonhuman-player/cult.dmi'
|
|
icon_state = "phase_shift2_cult"
|
|
duration = 0.6 SECONDS
|
|
|
|
/obj/effect/temp_visual/dir_setting/wraith/angelic
|
|
icon_state = "phase_shift2_holy"
|
|
|
|
/obj/effect/temp_visual/dir_setting/wraith/mystic
|
|
icon_state = "phase_shift2_wizard"
|
|
|
|
/obj/effect/temp_visual/dir_setting/wraith/out
|
|
icon_state = "phase_shift_cult"
|
|
|
|
/obj/effect/temp_visual/dir_setting/wraith/out/angelic
|
|
icon_state = "phase_shift_holy"
|
|
|
|
/obj/effect/temp_visual/dir_setting/wraith/out/mystic
|
|
icon_state = "phase_shift_wizard"
|
|
|
|
/obj/effect/temp_visual/dir_setting/tailsweep
|
|
icon_state = "tailsweep"
|
|
duration = 4
|
|
|
|
/obj/effect/temp_visual/dir_setting/curse
|
|
icon_state = "curse"
|
|
duration = 32
|
|
var/fades = TRUE
|
|
|
|
/obj/effect/temp_visual/dir_setting/curse/Initialize(mapload, set_dir)
|
|
. = ..()
|
|
if(fades)
|
|
animate(src, alpha = 0, time = 32)
|
|
|
|
/obj/effect/temp_visual/dir_setting/curse/blob
|
|
icon_state = "curseblob"
|
|
|
|
/obj/effect/temp_visual/dir_setting/curse/grasp_portal
|
|
icon = 'icons/effects/64x64.dmi'
|
|
layer = ABOVE_ALL_MOB_LAYER
|
|
plane = ABOVE_GAME_PLANE
|
|
pixel_y = -16
|
|
pixel_x = -16
|
|
duration = 32
|
|
fades = FALSE
|
|
|
|
/obj/effect/temp_visual/dir_setting/curse/grasp_portal/fading
|
|
duration = 32
|
|
fades = TRUE
|
|
|
|
/obj/effect/temp_visual/dir_setting/curse/hand
|
|
icon_state = "cursehand1"
|
|
|
|
|
|
/obj/effect/temp_visual/bsa_splash
|
|
name = "\improper Bluespace energy wave"
|
|
desc = "A massive, rippling wave of bluepace energy, all rapidly exhausting itself the moment it leaves the concentrated beam of light."
|
|
icon = 'icons/effects/beam_splash.dmi'
|
|
icon_state = "beam_splash_e"
|
|
layer = ABOVE_ALL_MOB_LAYER
|
|
plane = ABOVE_GAME_PLANE
|
|
pixel_y = -16
|
|
duration = 50
|
|
|
|
/obj/effect/temp_visual/bsa_splash/Initialize(mapload, dir)
|
|
. = ..()
|
|
switch(dir)
|
|
if(WEST)
|
|
icon_state = "beam_splash_w"
|
|
if(EAST)
|
|
icon_state = "beam_splash_e"
|
|
|
|
/obj/effect/temp_visual/wizard
|
|
name = "water"
|
|
icon = 'icons/mob/simple/mob.dmi'
|
|
icon_state = "reappear"
|
|
duration = 5
|
|
|
|
/obj/effect/temp_visual/wizard/out
|
|
icon_state = "liquify"
|
|
duration = 12
|
|
|
|
/obj/effect/temp_visual/monkeyify
|
|
icon = 'icons/mob/simple/mob.dmi'
|
|
icon_state = "h2monkey"
|
|
duration = 22
|
|
|
|
/obj/effect/temp_visual/monkeyify/humanify
|
|
icon_state = "monkey2h"
|
|
|
|
/obj/effect/temp_visual/borgflash
|
|
icon = 'icons/mob/simple/mob.dmi'
|
|
icon_state = "blspell"
|
|
duration = 5
|
|
|
|
/obj/effect/temp_visual/guardian
|
|
randomdir = 0
|
|
|
|
/obj/effect/temp_visual/guardian/phase
|
|
duration = 5
|
|
icon_state = "phasein"
|
|
|
|
/obj/effect/temp_visual/guardian/phase/out
|
|
icon_state = "phaseout"
|
|
|
|
/obj/effect/temp_visual/decoy
|
|
desc = "It's a decoy!"
|
|
duration = 15
|
|
|
|
/obj/effect/temp_visual/decoy/Initialize(mapload, atom/mimiced_atom)
|
|
. = ..()
|
|
alpha = initial(alpha)
|
|
if(mimiced_atom)
|
|
name = mimiced_atom.name
|
|
appearance = mimiced_atom.appearance
|
|
setDir(mimiced_atom.dir)
|
|
mouse_opacity = MOUSE_OPACITY_TRANSPARENT
|
|
|
|
/obj/effect/temp_visual/decoy/fading/Initialize(mapload, atom/mimiced_atom)
|
|
. = ..()
|
|
animate(src, alpha = 0, time = duration)
|
|
|
|
/obj/effect/temp_visual/decoy/fading/threesecond
|
|
duration = 40
|
|
|
|
/obj/effect/temp_visual/decoy/fading/fivesecond
|
|
duration = 50
|
|
|
|
/obj/effect/temp_visual/decoy/fading/halfsecond
|
|
duration = 5
|
|
|
|
/obj/effect/temp_visual/small_smoke
|
|
icon_state = "smoke"
|
|
duration = 50
|
|
|
|
/obj/effect/temp_visual/small_smoke/halfsecond
|
|
duration = 5
|
|
|
|
/obj/effect/temp_visual/fire
|
|
icon = 'icons/effects/fire.dmi'
|
|
icon_state = "3"
|
|
light_range = LIGHT_RANGE_FIRE
|
|
light_color = LIGHT_COLOR_FIRE
|
|
duration = 10
|
|
|
|
/obj/effect/temp_visual/revenant
|
|
name = "spooky lights"
|
|
icon_state = "purplesparkles"
|
|
|
|
/obj/effect/temp_visual/revenant/cracks
|
|
name = "glowing cracks"
|
|
icon_state = "purplecrack"
|
|
duration = 6
|
|
|
|
/obj/effect/temp_visual/gravpush
|
|
name = "gravity wave"
|
|
icon_state = "shieldsparkles"
|
|
duration = 5
|
|
|
|
/obj/effect/temp_visual/telekinesis
|
|
name = "telekinetic force"
|
|
icon_state = "empdisable"
|
|
duration = 5
|
|
|
|
/obj/effect/temp_visual/emp
|
|
name = "emp sparks"
|
|
icon_state = "empdisable"
|
|
|
|
/obj/effect/temp_visual/emp/pulse
|
|
name = "emp pulse"
|
|
icon_state = "emppulse"
|
|
duration = 8
|
|
randomdir = 0
|
|
|
|
/obj/effect/temp_visual/bluespace_fissure
|
|
name = "bluespace fissure"
|
|
icon_state = "bluestream_fade"
|
|
duration = 9
|
|
|
|
/obj/effect/temp_visual/bluespace_fissure/Initialize(mapload)
|
|
. = ..()
|
|
apply_wibbly_filters(src)
|
|
|
|
/obj/effect/temp_visual/gib_animation
|
|
icon = 'icons/mob/simple/mob.dmi'
|
|
duration = 15
|
|
|
|
/obj/effect/temp_visual/gib_animation/Initialize(mapload, gib_icon)
|
|
icon_state = gib_icon // Needs to be before ..() so icon is correct
|
|
. = ..()
|
|
|
|
/obj/effect/temp_visual/gib_animation/animal
|
|
icon = 'icons/mob/simple/animal.dmi'
|
|
|
|
/obj/effect/temp_visual/dust_animation
|
|
icon = 'icons/mob/simple/mob.dmi'
|
|
duration = 15
|
|
|
|
/obj/effect/temp_visual/dust_animation/Initialize(mapload, dust_icon)
|
|
icon_state = dust_icon // Before ..() so the correct icon is flick()'d
|
|
. = ..()
|
|
|
|
/obj/effect/temp_visual/mummy_animation
|
|
icon = 'icons/mob/simple/mob.dmi'
|
|
icon_state = "mummy_revive"
|
|
duration = 20
|
|
|
|
/obj/effect/temp_visual/heal //color is white by default, set to whatever is needed
|
|
name = "healing glow"
|
|
icon_state = "heal"
|
|
duration = 15
|
|
|
|
/obj/effect/temp_visual/heal/Initialize(mapload, set_color)
|
|
if(set_color)
|
|
add_atom_colour(set_color, FIXED_COLOUR_PRIORITY)
|
|
. = ..()
|
|
pixel_x = rand(-12, 12)
|
|
pixel_y = rand(-9, 0)
|
|
|
|
/obj/effect/temp_visual/kinetic_blast
|
|
name = "kinetic explosion"
|
|
icon = 'icons/obj/weapons/guns/projectiles.dmi'
|
|
icon_state = "kinetic_blast"
|
|
layer = ABOVE_ALL_MOB_LAYER
|
|
plane = ABOVE_GAME_PLANE
|
|
duration = 4
|
|
|
|
/obj/effect/temp_visual/explosion
|
|
name = "explosion"
|
|
icon = 'icons/effects/96x96.dmi'
|
|
icon_state = "explosion"
|
|
pixel_x = -32
|
|
pixel_y = -32
|
|
duration = 8
|
|
|
|
/obj/effect/temp_visual/explosion/fast
|
|
icon_state = "explosionfast"
|
|
duration = 4
|
|
|
|
/obj/effect/temp_visual/blob
|
|
name = "blob"
|
|
icon_state = "blob_attack"
|
|
alpha = 140
|
|
randomdir = 0
|
|
duration = 6
|
|
|
|
/obj/effect/temp_visual/desynchronizer
|
|
name = "desynchronizer field"
|
|
icon_state = "chronofield"
|
|
duration = 3
|
|
|
|
/obj/effect/temp_visual/impact_effect
|
|
icon_state = "impact_bullet"
|
|
duration = 5
|
|
|
|
/obj/effect/temp_visual/impact_effect/Initialize(mapload, x, y)
|
|
pixel_x = x
|
|
pixel_y = y
|
|
return ..()
|
|
|
|
/obj/effect/temp_visual/impact_effect/red_laser
|
|
icon_state = "impact_laser"
|
|
duration = 4
|
|
|
|
/obj/effect/temp_visual/impact_effect/red_laser/wall
|
|
icon_state = "impact_laser_wall"
|
|
duration = 10
|
|
|
|
/obj/effect/temp_visual/impact_effect/blue_laser
|
|
icon_state = "impact_laser_blue"
|
|
duration = 4
|
|
|
|
/obj/effect/temp_visual/impact_effect/green_laser
|
|
icon_state = "impact_laser_green"
|
|
duration = 4
|
|
|
|
/obj/effect/temp_visual/impact_effect/yellow_laser
|
|
icon_state = "impact_laser_yellow"
|
|
duration = 4
|
|
|
|
/obj/effect/temp_visual/impact_effect/purple_laser
|
|
icon_state = "impact_laser_purple"
|
|
duration = 4
|
|
|
|
/obj/effect/temp_visual/impact_effect/shrink
|
|
icon_state = "m_shield"
|
|
duration = 10
|
|
|
|
/obj/effect/temp_visual/impact_effect/ion
|
|
icon_state = "shieldsparkles"
|
|
duration = 6
|
|
|
|
/obj/effect/temp_visual/impact_effect/energy
|
|
icon_state = "impact_energy"
|
|
duration = 6
|
|
|
|
/obj/effect/temp_visual/impact_effect/neurotoxin
|
|
icon_state = "impact_neurotoxin"
|
|
|
|
/obj/effect/temp_visual/heart
|
|
name = "heart"
|
|
icon = 'icons/mob/simple/animal.dmi'
|
|
icon_state = "heart"
|
|
duration = 25
|
|
|
|
/obj/effect/temp_visual/heart/Initialize(mapload)
|
|
. = ..()
|
|
pixel_x = rand(-4,4)
|
|
pixel_y = rand(-4,4)
|
|
animate(src, pixel_y = pixel_y + 32, alpha = 0, time = 25)
|
|
|
|
/obj/effect/temp_visual/annoyed
|
|
name = "annoyed"
|
|
icon = 'icons/effects/effects.dmi'
|
|
icon_state = "annoyed"
|
|
duration = 25
|
|
|
|
/obj/effect/temp_visual/annoyed/Initialize(mapload)
|
|
. = ..()
|
|
pixel_x = rand(-4,0)
|
|
pixel_y = rand(8,12)
|
|
animate(src, pixel_y = pixel_y + 16, alpha = 0, time = duration)
|
|
|
|
/obj/effect/temp_visual/bleed
|
|
name = "bleed"
|
|
icon = 'icons/effects/bleed.dmi'
|
|
icon_state = "bleed0"
|
|
duration = 10
|
|
var/shrink = TRUE
|
|
|
|
/obj/effect/temp_visual/bleed/Initialize(mapload, atom/size_calc_target)
|
|
. = ..()
|
|
var/size_matrix = matrix()
|
|
if(size_calc_target)
|
|
layer = size_calc_target.layer + 0.01
|
|
var/icon/I = icon(size_calc_target.icon, size_calc_target.icon_state, size_calc_target.dir)
|
|
size_matrix = matrix() * (I.Height()/world.icon_size)
|
|
transform = size_matrix //scale the bleed overlay's size based on the target's icon size
|
|
var/matrix/M = transform
|
|
if(shrink)
|
|
M = size_matrix*0.1
|
|
else
|
|
M = size_matrix*2
|
|
animate(src, alpha = 20, transform = M, time = duration, flags = ANIMATION_PARALLEL)
|
|
|
|
/obj/effect/temp_visual/bleed/explode
|
|
icon_state = "bleed10"
|
|
duration = 12
|
|
shrink = FALSE
|
|
|
|
/obj/effect/temp_visual/warp_cube
|
|
duration = 5
|
|
var/outgoing = TRUE
|
|
|
|
/obj/effect/temp_visual/warp_cube/Initialize(mapload, atom/teleporting_atom, warp_color, new_outgoing)
|
|
. = ..()
|
|
if(teleporting_atom)
|
|
outgoing = new_outgoing
|
|
appearance = teleporting_atom.appearance
|
|
setDir(teleporting_atom.dir)
|
|
if(warp_color)
|
|
color = list(warp_color, warp_color, warp_color, list(0,0,0))
|
|
set_light(1.4, 1, warp_color)
|
|
mouse_opacity = MOUSE_OPACITY_TRANSPARENT
|
|
var/matrix/skew = transform
|
|
skew = skew.Turn(180)
|
|
skew = skew.Interpolate(transform, 0.5)
|
|
if(!outgoing)
|
|
transform = skew * 2
|
|
skew = teleporting_atom.transform
|
|
alpha = 0
|
|
animate(src, alpha = teleporting_atom.alpha, transform = skew, time = duration)
|
|
else
|
|
skew *= 2
|
|
animate(src, alpha = 0, transform = skew, time = duration)
|
|
else
|
|
return INITIALIZE_HINT_QDEL
|
|
|
|
/obj/effect/temp_visual/cart_space
|
|
icon_state = "launchpad_launch"
|
|
duration = 2 SECONDS
|
|
|
|
/obj/effect/temp_visual/cart_space/bad
|
|
icon_state = "launchpad_pull"
|
|
duration = 2 SECONDS
|
|
|
|
/obj/effect/constructing_effect
|
|
icon = 'icons/effects/rcd.dmi'
|
|
icon_state = ""
|
|
layer = ABOVE_ALL_MOB_LAYER
|
|
plane = ABOVE_GAME_PLANE
|
|
anchored = TRUE
|
|
obj_flags = CAN_BE_HIT
|
|
mouse_opacity = MOUSE_OPACITY_OPAQUE
|
|
var/status = 0
|
|
var/delay = 0
|
|
|
|
/obj/effect/constructing_effect/Initialize(mapload, rcd_delay, rcd_status, rcd_upgrades)
|
|
. = ..()
|
|
status = rcd_status
|
|
delay = rcd_delay
|
|
if (status == RCD_DECONSTRUCT)
|
|
addtimer(CALLBACK(src, TYPE_PROC_REF(/atom/, update_appearance)), 1.1 SECONDS)
|
|
delay -= 11
|
|
icon_state = "rcd_end_reverse"
|
|
else
|
|
update_appearance()
|
|
|
|
if (rcd_upgrades & RCD_UPGRADE_ANTI_INTERRUPT)
|
|
color = list(
|
|
1.0, 0.5, 0.5, 0.0,
|
|
0.1, 0.0, 0.0, 0.0,
|
|
0.1, 0.0, 0.0, 0.0,
|
|
0.0, 0.0, 0.0, 1.0,
|
|
0.0, 0.0, 0.0, 0.0,
|
|
)
|
|
|
|
mouse_opacity = MOUSE_OPACITY_TRANSPARENT
|
|
obj_flags &= ~CAN_BE_HIT
|
|
|
|
/obj/effect/constructing_effect/update_name(updates)
|
|
. = ..()
|
|
|
|
if (status == RCD_DECONSTRUCT)
|
|
name = "deconstruction effect"
|
|
else
|
|
name = "construction effect"
|
|
|
|
/obj/effect/constructing_effect/update_icon_state()
|
|
icon_state = "rcd"
|
|
if(delay < 10)
|
|
icon_state += "_shortest"
|
|
return ..()
|
|
if (delay < 20)
|
|
icon_state += "_shorter"
|
|
return ..()
|
|
if (delay < 37)
|
|
icon_state += "_short"
|
|
return ..()
|
|
if(status == RCD_DECONSTRUCT)
|
|
icon_state += "_reverse"
|
|
return ..()
|
|
|
|
/obj/effect/constructing_effect/proc/end_animation()
|
|
if (status == RCD_DECONSTRUCT)
|
|
qdel(src)
|
|
else
|
|
mouse_opacity = MOUSE_OPACITY_TRANSPARENT
|
|
obj_flags &= ~CAN_BE_HIT
|
|
icon_state = "rcd_end"
|
|
addtimer(CALLBACK(src, PROC_REF(end)), 1.5 SECONDS)
|
|
|
|
/obj/effect/constructing_effect/proc/end()
|
|
qdel(src)
|
|
|
|
/obj/effect/constructing_effect/proc/attacked(mob/user)
|
|
user.do_attack_animation(src, ATTACK_EFFECT_PUNCH)
|
|
user.changeNext_move(CLICK_CD_MELEE)
|
|
playsound(loc, 'sound/weapons/egloves.ogg', vol = 80, vary = TRUE)
|
|
end()
|
|
|
|
/obj/effect/constructing_effect/attackby(obj/item/weapon, mob/user, params)
|
|
attacked(user)
|
|
|
|
/obj/effect/constructing_effect/attack_hand(mob/living/user, list/modifiers)
|
|
attacked(user)
|
|
|
|
/obj/effect/temp_visual/electricity
|
|
icon_state = "electricity3"
|
|
duration = 0.5 SECONDS
|
|
|
|
/obj/effect/temp_visual/thunderbolt
|
|
icon_state = "thunderbolt"
|
|
icon = 'icons/effects/32x96.dmi'
|
|
duration = 0.6 SECONDS
|
|
|
|
/obj/effect/temp_visual/light_ash
|
|
icon_state = "light_ash"
|
|
icon = 'icons/effects/weather_effects.dmi'
|
|
duration = 3.2 SECONDS
|
|
|
|
/obj/effect/temp_visual/sonar_ping
|
|
duration = 3 SECONDS
|
|
resistance_flags = FIRE_PROOF | UNACIDABLE | ACID_PROOF
|
|
anchored = TRUE
|
|
randomdir = FALSE
|
|
/// The image shown to modsuit users
|
|
var/image/modsuit_image
|
|
/// The person in the modsuit at the moment, really just used to remove this from their screen
|
|
var/datum/weakref/mod_man
|
|
/// The creature we're placing this on
|
|
var/datum/weakref/pinged_person
|
|
/// The icon state applied to the image created for this ping.
|
|
var/real_icon_state = "sonar_ping"
|
|
/// Does the visual follow the creature?
|
|
var/follow_creature = TRUE
|
|
/// Creature's X & Y coords, which can either be overridden or kept the same depending on follow_creature.
|
|
var/creature_x
|
|
var/creature_y
|
|
|
|
/obj/effect/temp_visual/sonar_ping/Initialize(mapload, mob/living/looker, mob/living/creature, ping_state, follow_creatures = TRUE)
|
|
. = ..()
|
|
if(!looker || !creature)
|
|
return INITIALIZE_HINT_QDEL
|
|
if(ping_state)
|
|
real_icon_state = ping_state
|
|
follow_creature = follow_creatures
|
|
creature_x = creature.x
|
|
creature_y = creature.y
|
|
|
|
modsuit_image = image(icon = icon, loc = looker.loc, icon_state = real_icon_state, layer = ABOVE_ALL_MOB_LAYER, pixel_x = ((creature.x - looker.x) * 32), pixel_y = ((creature.y - looker.y) * 32))
|
|
modsuit_image.plane = ABOVE_LIGHTING_PLANE
|
|
SET_PLANE_EXPLICIT(modsuit_image, ABOVE_LIGHTING_PLANE, creature)
|
|
mod_man = WEAKREF(looker)
|
|
pinged_person = WEAKREF(creature)
|
|
add_mind(looker)
|
|
START_PROCESSING(SSfastprocess, src)
|
|
|
|
/obj/effect/temp_visual/sonar_ping/Destroy()
|
|
var/mob/living/previous_user = mod_man?.resolve()
|
|
if(previous_user)
|
|
remove_mind(previous_user)
|
|
STOP_PROCESSING(SSfastprocess, src)
|
|
// Null so we don't shit the bed when we delete
|
|
modsuit_image = null
|
|
return ..()
|
|
|
|
/// Add the image to the modsuit wearer's screen
|
|
/obj/effect/temp_visual/sonar_ping/proc/add_mind(mob/living/looker)
|
|
looker?.client?.images |= modsuit_image
|
|
|
|
/// Remove the image from the modsuit wearer's screen
|
|
/obj/effect/temp_visual/sonar_ping/proc/remove_mind(mob/living/looker)
|
|
looker?.client?.images -= modsuit_image
|
|
|
|
/// Update the position of the ping while it's still up. Not sure if i need to use the full proc but just being safe
|
|
/obj/effect/temp_visual/sonar_ping/process(seconds_per_tick)
|
|
var/mob/living/looker = mod_man?.resolve()
|
|
var/mob/living/creature = pinged_person?.resolve()
|
|
if(isnull(looker) || isnull(creature))
|
|
return PROCESS_KILL
|
|
modsuit_image.loc = looker.loc
|
|
// Long pings follow, short pings stay put. We still need to update for looker.x&y though
|
|
if(follow_creature)
|
|
creature_y = creature.y
|
|
creature_x = creature.x
|
|
modsuit_image.pixel_x = ((creature_x - looker.x) * 32)
|
|
modsuit_image.pixel_y = ((creature_y - looker.y) * 32)
|
|
|
|
/obj/effect/temp_visual/block //color is white by default, set to whatever is needed
|
|
name = "blocking glow"
|
|
icon_state = "block"
|
|
duration = 6.7
|
|
|
|
/obj/effect/temp_visual/block/Initialize(mapload, set_color)
|
|
if(set_color)
|
|
add_atom_colour(set_color, FIXED_COLOUR_PRIORITY)
|
|
. = ..()
|
|
pixel_x = rand(-12, 12)
|
|
pixel_y = rand(-9, 0)
|
|
|
|
/obj/effect/temp_visual/crit
|
|
name = "critical hit"
|
|
icon_state = "crit"
|
|
duration = 15
|
|
|
|
/obj/effect/temp_visual/crit/Initialize(mapload)
|
|
. = ..()
|
|
animate(src, pixel_y = pixel_y + 16, alpha = 0, time = duration)
|
|
|
|
/obj/effect/temp_visual/jet_plume
|
|
name = "jet plume"
|
|
icon_state = "jet_plume"
|
|
layer = BELOW_MOB_LAYER
|
|
plane = GAME_PLANE
|
|
duration = 0.4 SECONDS
|
|
|
|
/// Plays a dispersing animation on hivelord and legion minions so they don't just vanish
|
|
/obj/effect/temp_visual/despawn_effect
|
|
name = "withering spawn"
|
|
duration = 1 SECONDS
|
|
|
|
/obj/effect/temp_visual/despawn_effect/Initialize(mapload, atom/copy_from)
|
|
if (isnull(copy_from))
|
|
. = ..()
|
|
return INITIALIZE_HINT_QDEL
|
|
icon = copy_from.icon
|
|
icon_state = copy_from.icon_state
|
|
pixel_x = copy_from.pixel_x
|
|
pixel_y = copy_from.pixel_y
|
|
duration = rand(0.5 SECONDS, 1 SECONDS)
|
|
var/matrix/transformation = matrix(transform)
|
|
transformation.Turn(rand(-70, 70))
|
|
transformation.Scale(0.7, 0.7)
|
|
animate(
|
|
src,
|
|
pixel_x = rand(-5, 5),
|
|
pixel_y = -5,
|
|
transform = transformation,
|
|
color = "#44444400",
|
|
time = duration,
|
|
flags = ANIMATION_RELATIVE,
|
|
)
|
|
return ..()
|