diff --git a/code/game/objects/effects/overlays.dm b/code/game/objects/effects/overlays.dm index 87d07232160..fce6426863c 100644 --- a/code/game/objects/effects/overlays.dm +++ b/code/game/objects/effects/overlays.dm @@ -55,12 +55,13 @@ duration = 5 randomdir = FALSE layer = BELOW_MOB_LAYER + var/splatter_type = "splatter" /obj/effect/overlay/temp/dir_setting/bloodsplatter/New(loc, set_dir) if(set_dir in diagonals) - icon_state = "splatter[pick(1, 2, 6)]" + icon_state = "[splatter_type][pick(1, 2, 6)]" else - icon_state = "splatter[pick(3, 4, 5)]" + icon_state = "[splatter_type][pick(3, 4, 5)]" ..() var/target_pixel_x = 0 var/target_pixel_y = 0 @@ -90,44 +91,35 @@ layer = ABOVE_MOB_LAYER animate(src, pixel_x = target_pixel_x, pixel_y = target_pixel_y, alpha = 0, time = duration) +/obj/effect/overlay/temp/dir_setting/bloodsplatter/xenosplatter + splatter_type = "xsplatter" -/obj/effect/overlay/temp/heal //color is white by default, set to whatever is needed - name = "healing glow" - icon_state = "heal" - duration = 15 +/obj/effect/overlay/temp/dir_setting/firing_effect + icon = 'icons/effects/effects.dmi' + icon_state = "firing_effect" + duration = 2 -/obj/effect/overlay/temp/heal/New(loc, colour) +/obj/effect/overlay/temp/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) ..() - pixel_x = rand(-12, 12) - pixel_y = rand(-9, 0) - if(colour) - color = colour -/obj/effect/overlay/temp/kinetic_blast - name = "kinetic explosion" - icon = 'icons/obj/projectiles.dmi' - icon_state = "kinetic_blast" - layer = ABOVE_ALL_MOB_LAYER - duration = 4 +/obj/effect/overlay/temp/dir_setting/firing_effect/energy + icon_state = "firing_effect_energy" + duration = 3 -/obj/effect/overlay/temp/explosion - name = "explosion" - icon = 'icons/effects/96x96.dmi' - icon_state = "explosion" - pixel_x = -32 - pixel_y = -32 - duration = 8 - -/obj/effect/overlay/temp/explosion/fast - icon_state = "explosionfast" - duration = 4 - -/obj/effect/overlay/temp/blob - name = "blob" - icon_state = "blob_attack" - alpha = 140 - randomdir = 0 - duration = 6 +/obj/effect/overlay/temp/dir_setting/firing_effect/magic + icon_state = "shieldsparkles" + duration = 3 /obj/effect/overlay/temp/dir_setting/ninja name = "ninja shadow" @@ -393,6 +385,80 @@ /obj/effect/overlay/temp/sparkle/tailsweep icon_state = "tailsweep" + +/obj/effect/overlay/temp/heal //color is white by default, set to whatever is needed + name = "healing glow" + icon_state = "heal" + duration = 15 + +/obj/effect/overlay/temp/heal/New(loc, colour) + ..() + pixel_x = rand(-12, 12) + pixel_y = rand(-9, 0) + if(colour) + color = colour + +/obj/effect/overlay/temp/kinetic_blast + name = "kinetic explosion" + icon = 'icons/obj/projectiles.dmi' + icon_state = "kinetic_blast" + layer = ABOVE_ALL_MOB_LAYER + duration = 4 + +/obj/effect/overlay/temp/explosion + name = "explosion" + icon = 'icons/effects/96x96.dmi' + icon_state = "explosion" + pixel_x = -32 + pixel_y = -32 + duration = 8 + +/obj/effect/overlay/temp/explosion/fast + icon_state = "explosionfast" + duration = 4 + +/obj/effect/overlay/temp/blob + name = "blob" + icon_state = "blob_attack" + alpha = 140 + randomdir = 0 + duration = 6 + +/obj/effect/overlay/temp/impact_effect + icon = 'icons/effects/effects.dmi' + icon_state = "impact_bullet" + duration = 5 + +/obj/effect/overlay/temp/impact_effect/New(loc, atom/target, obj/item/projectile/P) + if(target == P.original) //the projectile hit the target originally clicked + pixel_x = P.p_x + target.pixel_x - 16 + rand(-4,4) + pixel_y = P.p_y + target.pixel_y - 16 + rand(-4,4) + else + pixel_x = target.pixel_x + rand(-4,4) + pixel_y = target.pixel_y + rand(-4,4) + ..() + +/obj/effect/overlay/temp/impact_effect/red_laser + icon_state = "impact_laser" + duration = 4 + +/obj/effect/overlay/temp/impact_effect/blue_laser + icon_state = "impact_laser_blue" + duration = 4 + +/obj/effect/overlay/temp/impact_effect/green_laser + icon_state = "impact_laser_green" + duration = 4 + +/obj/effect/overlay/temp/impact_effect/purple_laser + icon_state = "impact_laser_purple" + duration = 4 + +/obj/effect/overlay/temp/impact_effect/ion + icon_state = "shieldsparkles" + duration = 6 + + /obj/effect/overlay/palmtree_r name = "Palm tree" icon = 'icons/misc/beach2.dmi' diff --git a/code/modules/projectiles/ammunition.dm b/code/modules/projectiles/ammunition.dm index 40fe0f36a46..e401a5dae8b 100644 --- a/code/modules/projectiles/ammunition.dm +++ b/code/modules/projectiles/ammunition.dm @@ -16,6 +16,8 @@ var/randomspread = 0 //Randomspread for automatics var/delay = 0 //Delay for energy weapons var/click_cooldown_override = 0 //Override this to make your gun have a faster fire rate, in tenths of a second. 4 is the default gun cooldown. + var/firing_effect_type = /obj/effect/overlay/temp/dir_setting/firing_effect //the visual effect appearing when the ammo is fired. + /obj/item/ammo_casing/New() ..() diff --git a/code/modules/projectiles/ammunition/ammo_casings.dm b/code/modules/projectiles/ammunition/ammo_casings.dm index 20f59b6404f..a3653f0717c 100644 --- a/code/modules/projectiles/ammunition/ammo_casings.dm +++ b/code/modules/projectiles/ammunition/ammo_casings.dm @@ -309,6 +309,7 @@ /obj/item/ammo_casing/caseless desc = "A caseless bullet casing." + firing_effect_type = null /obj/item/ammo_casing/caseless/fire(atom/target as mob|obj|turf, mob/living/user as mob|obj, params, distro, quiet) @@ -345,6 +346,7 @@ icon_state = "s-casing-live" projectile_type = /obj/item/projectile/beam fire_sound = 'sound/weapons/Laser.ogg' + firing_effect_type = /obj/effect/overlay/temp/dir_setting/firing_effect/energy /obj/item/ammo_casing/caseless/laser/gatling projectile_type = /obj/item/projectile/beam/weak diff --git a/code/modules/projectiles/ammunition/energy.dm b/code/modules/projectiles/ammunition/energy.dm index abe46e6732d..d2c414b131c 100644 --- a/code/modules/projectiles/ammunition/energy.dm +++ b/code/modules/projectiles/ammunition/energy.dm @@ -6,6 +6,7 @@ var/e_cost = 100 //The amount of energy a cell needs to expend to create this shot. var/select_name = "energy" fire_sound = 'sound/weapons/Laser.ogg' + firing_effect_type = /obj/effect/overlay/temp/dir_setting/firing_effect/energy /obj/item/ammo_casing/energy/laser projectile_type = /obj/item/projectile/beam/laser @@ -209,4 +210,12 @@ obj/item/ammo_casing/energy/net var/obj/item/weapon/gun/energy/gravity_gun/gun = null /obj/item/ammo_casing/energy/gravitychaos/New(var/obj/item/weapon/gun/energy/gravity_gun/G) - gun = G \ No newline at end of file + gun = G + +/obj/item/ammo_casing/energy/plasma + projectile_type = /obj/item/projectile/plasma + select_name = "plasma burst" + fire_sound = 'sound/weapons/pulse.ogg' + +/obj/item/ammo_casing/energy/plasma/adv + projectile_type = /obj/item/projectile/plasma/adv diff --git a/code/modules/projectiles/ammunition/special.dm b/code/modules/projectiles/ammunition/special.dm index 9a720b84138..181333af1a1 100644 --- a/code/modules/projectiles/ammunition/special.dm +++ b/code/modules/projectiles/ammunition/special.dm @@ -2,6 +2,7 @@ name = "magic casing" desc = "I didn't even know magic needed ammo..." projectile_type = /obj/item/projectile/magic + firing_effect_type = /obj/effect/overlay/temp/dir_setting/firing_effect/magic /obj/item/ammo_casing/magic/change projectile_type = /obj/item/projectile/magic/change @@ -41,9 +42,11 @@ name = "syringe gun spring" desc = "A high-power spring that throws syringes." projectile_type = null + firing_effect_type = null /obj/item/ammo_casing/energy/c3dbullet projectile_type = /obj/item/projectile/bullet/midbullet3 select_name = "spraydown" fire_sound = 'sound/weapons/gunshot_smg.ogg' e_cost = 20 + firing_effect_type = /obj/effect/overlay/temp/dir_setting/firing_effect diff --git a/code/modules/projectiles/firing.dm b/code/modules/projectiles/firing.dm index d25e65891cf..d293520cb89 100644 --- a/code/modules/projectiles/firing.dm +++ b/code/modules/projectiles/firing.dm @@ -40,6 +40,13 @@ if (!istype(targloc) || !istype(curloc) || !BB) return 0 BB.ammo_casing = src + + var/firing_dir + if(BB.firer) + firing_dir = BB.firer.dir + if(!BB.suppressed && firing_effect_type) + PoolOrNew(firing_effect_type, list(get_turf(src), firing_dir)) + if(targloc == curloc) if(target) //if the target is right on our location we go straight to bullet_act() target.bullet_act(BB, BB.def_zone) diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index 910fe2cc89a..74320f6c062 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -50,6 +50,7 @@ var/jitter = 0 var/forcedodge = 0 //to pass through everything var/dismemberment = 0 //The higher the number, the greater the bonus to dismembering. 0 will not dismember at all. + var/impact_effect_type //what type of impact effect to show when hitting something /obj/item/projectile/New() permutated = list() @@ -75,10 +76,23 @@ return "chest" /obj/item/projectile/proc/on_hit(atom/target, blocked = 0) + var/turf/target_loca = get_turf(target) if(!isliving(target)) + if(impact_effect_type) + PoolOrNew(impact_effect_type, list(target_loca, target, src)) return 0 var/mob/living/L = target if(blocked != 100) // not completely blocked + if(damage && L.blood_volume && damage_type == BRUTE) + if(isalien(L)) + PoolOrNew(/obj/effect/overlay/temp/dir_setting/bloodsplatter/xenosplatter, list(target_loca, dir)) + else + PoolOrNew(/obj/effect/overlay/temp/dir_setting/bloodsplatter, list(target_loca, dir)) + if(prob(33)) + L.add_splatter_floor(target_loca) + else if(impact_effect_type) + PoolOrNew(impact_effect_type, list(target_loca, target, src)) + var/organ_hit_text = "" var/limb_hit = L.check_limb_hit(def_zone)//to get the correct message info. if(limb_hit) diff --git a/code/modules/projectiles/projectile/beams.dm b/code/modules/projectiles/projectile/beams.dm index 0dc198bc33a..28902c019dc 100644 --- a/code/modules/projectiles/projectile/beams.dm +++ b/code/modules/projectiles/projectile/beams.dm @@ -9,6 +9,7 @@ hitsound_wall = 'sound/weapons/effects/searwall.ogg' flag = "laser" eyeblur = 2 + impact_effect_type = /obj/effect/overlay/temp/impact_effect/red_laser /obj/item/projectile/beam/laser @@ -44,6 +45,7 @@ irradiate = 30 range = 15 forcedodge = 1 + impact_effect_type = /obj/effect/overlay/temp/impact_effect/green_laser /obj/item/projectile/beam/disabler name = "disabler beam" @@ -53,12 +55,14 @@ flag = "energy" hitsound = 'sound/weapons/tap.ogg' eyeblur = 0 + impact_effect_type = /obj/effect/overlay/temp/impact_effect/blue_laser /obj/item/projectile/beam/pulse name = "pulse" icon_state = "u_laser" damage = 50 luminosity = 2 + impact_effect_type = /obj/effect/overlay/temp/impact_effect/blue_laser /obj/item/projectile/beam/pulse/on_hit(atom/target, blocked = 0) . = ..() @@ -86,6 +90,7 @@ legacy = 1 luminosity = 2 animate_movement = SLIDE_STEPS + impact_effect_type = /obj/effect/overlay/temp/impact_effect/green_laser /obj/item/projectile/beam/emitter/singularity_pull() return //don't want the emitters to miss @@ -102,6 +107,7 @@ damage_type = STAMINA flag = "laser" var/suit_types = list(/obj/item/clothing/suit/redtag, /obj/item/clothing/suit/bluetag) + impact_effect_type = /obj/effect/overlay/temp/impact_effect/blue_laser /obj/item/projectile/beam/lasertag/on_hit(atom/target, blocked = 0) . = ..() @@ -114,6 +120,7 @@ /obj/item/projectile/beam/lasertag/redtag icon_state = "laser" suit_types = list(/obj/item/clothing/suit/bluetag) + impact_effect_type = /obj/effect/overlay/temp/impact_effect/red_laser /obj/item/projectile/beam/lasertag/bluetag icon_state = "bluelaser" @@ -124,12 +131,15 @@ icon_state = "purple_laser" damage = 200 damage_type = BURN + impact_effect_type = /obj/effect/overlay/temp/impact_effect/purple_laser /obj/item/projectile/beam/instakill/blue icon_state = "blue_laser" + impact_effect_type = /obj/effect/overlay/temp/impact_effect/blue_laser /obj/item/projectile/beam/instakill/red icon_state = "red_laser" + impact_effect_type = /obj/effect/overlay/temp/impact_effect/red_laser /obj/item/projectile/beam/instakill/on_hit(atom/target) . = ..() diff --git a/code/modules/projectiles/projectile/bullets.dm b/code/modules/projectiles/projectile/bullets.dm index 4a3b66ba108..ab287338cc9 100644 --- a/code/modules/projectiles/projectile/bullets.dm +++ b/code/modules/projectiles/projectile/bullets.dm @@ -6,6 +6,7 @@ nodamage = 0 flag = "bullet" hitsound_wall = "ricochet" + impact_effect_type = /obj/effect/overlay/temp/impact_effect /obj/item/projectile/bullet/weakbullet //beanbag, heavy stamina damage damage = 5 diff --git a/code/modules/projectiles/projectile/energy.dm b/code/modules/projectiles/projectile/energy.dm index b8524c36035..a4830b7c28d 100644 --- a/code/modules/projectiles/projectile/energy.dm +++ b/code/modules/projectiles/projectile/energy.dm @@ -143,6 +143,7 @@ damage = 20 damage_type = CLONE irradiate = 10 + impact_effect_type = /obj/effect/overlay/temp/impact_effect/green_laser /obj/item/projectile/energy/dart //ninja throwing dart name = "dart" @@ -164,17 +165,10 @@ /obj/item/projectile/energy/bolt/large damage = 20 -/obj/item/ammo_casing/energy/plasma - projectile_type = /obj/item/projectile/plasma - select_name = "plasma burst" - fire_sound = 'sound/weapons/pulse.ogg' - -/obj/item/ammo_casing/energy/plasma/adv - projectile_type = /obj/item/projectile/plasma/adv - /obj/item/projectile/energy/shock_revolver name = "shock bolt" icon_state = "purple_laser" + impact_effect_type = /obj/effect/overlay/temp/impact_effect/purple_laser var/chain /obj/item/projectile/energy/shock_revolver/fire(setAngle) diff --git a/code/modules/projectiles/projectile/reusable.dm b/code/modules/projectiles/projectile/reusable.dm index f253655e3f6..6d6b086f63b 100644 --- a/code/modules/projectiles/projectile/reusable.dm +++ b/code/modules/projectiles/projectile/reusable.dm @@ -3,6 +3,7 @@ desc = "How do you even reuse a bullet?" var/ammo_type = /obj/item/ammo_casing/caseless/ var/dropped = 0 + impact_effect_type = null /obj/item/projectile/bullet/reusable/on_hit(atom/target, blocked = 0) . = ..() diff --git a/code/modules/projectiles/projectile/special.dm b/code/modules/projectiles/projectile/special.dm index d0f9d4bc511..6a991950ff0 100644 --- a/code/modules/projectiles/projectile/special.dm +++ b/code/modules/projectiles/projectile/special.dm @@ -5,6 +5,7 @@ damage_type = BURN nodamage = 1 flag = "energy" + impact_effect_type = /obj/effect/overlay/temp/impact_effect/ion /obj/item/projectile/ion/on_hit(atom/target, blocked = 0) @@ -166,6 +167,7 @@ damage = 5 range = 3.5 //works as 4, but doubles to 7 dismemberment = 20 + impact_effect_type = /obj/effect/overlay/temp/impact_effect/purple_laser /obj/item/projectile/plasma/New() var/turf/proj_turf = get_turf(src) diff --git a/icons/effects/blood.dmi b/icons/effects/blood.dmi index e915cb49e37..5e71e45d4bf 100644 Binary files a/icons/effects/blood.dmi and b/icons/effects/blood.dmi differ diff --git a/icons/effects/effects.dmi b/icons/effects/effects.dmi index f92197520c3..adef4345cc9 100644 Binary files a/icons/effects/effects.dmi and b/icons/effects/effects.dmi differ