mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-08-30 15:37:36 +01:00
Blood now floats in zero G (#20993)
* Da Vlood
* removes_unused_icons
* Yep sprites
* fixes xeno blood and vomit
* Commit number x
* Steel Review Changes 1
* Henri Review Changes 1
* fixing vomit
🌋
* Haha haha ha ... ha
* fixing layering issueeee
* Sirryan2002 Review
THANKS
* implicit var/
* Sirryan Review 2
Electric Boogaloo
* Testmerge Update 1
gibs were still getting animated, blood drying while animated in space looked very jank.
all fixed
* unused variable
AHSDHASOIADGSOISA
* Testmerge Update 2
tracks floating annoyingly
* Improvements
-blood globules will now continue with the inertia of their emittor, instead of towards wherever they were facing
-drops will now have visible sprites after splatting
[running animate() still sometimes doesnt stop the animation annoyingly]
* errors
* Sirryan Review 3
This commit is contained in:
@@ -1,4 +1,5 @@
|
||||
#define DRYING_TIME 5 * 60 * 10 //for 1 unit of depth in puddle (amount var)
|
||||
#define ALWAYS_IN_GRAVITY 2
|
||||
|
||||
GLOBAL_LIST_EMPTY(splatter_cache)
|
||||
|
||||
@@ -21,9 +22,12 @@ GLOBAL_LIST_EMPTY(splatter_cache)
|
||||
var/amount = 5
|
||||
var/dry_timer = 0
|
||||
var/off_floor = FALSE
|
||||
|
||||
var/image/weightless_image
|
||||
inertia_move_delay = 1 // so they dont collide with who emitted them
|
||||
|
||||
/obj/effect/decal/cleanable/blood/replace_decal(obj/effect/decal/cleanable/blood/C)
|
||||
if(C == src)
|
||||
return FALSE
|
||||
if(C.blood_DNA)
|
||||
blood_DNA |= C.blood_DNA.Copy()
|
||||
if(bloodiness)
|
||||
@@ -31,12 +35,15 @@ GLOBAL_LIST_EMPTY(splatter_cache)
|
||||
C.bloodiness += bloodiness
|
||||
return ..()
|
||||
|
||||
|
||||
/obj/effect/decal/cleanable/blood/Initialize(mapload)
|
||||
. = ..()
|
||||
weightless_image = new()
|
||||
update_icon()
|
||||
if(type == /obj/effect/decal/cleanable/blood/gibs)
|
||||
|
||||
if(!gravity_check)
|
||||
//weightless blood cannot dry
|
||||
return
|
||||
|
||||
if(!.)
|
||||
dry_timer = addtimer(CALLBACK(src, PROC_REF(dry)), DRYING_TIME * (amount+1), TIMER_STOPPABLE)
|
||||
|
||||
@@ -46,9 +53,37 @@ GLOBAL_LIST_EMPTY(splatter_cache)
|
||||
return ..()
|
||||
|
||||
/obj/effect/decal/cleanable/blood/update_icon()
|
||||
var/turf/T = get_turf(src)
|
||||
check_gravity(T)
|
||||
|
||||
if((T && (T.density)) || !gravity_check || locate(/obj/structure/window/) in T || locate(/obj/structure/grille/) in T)
|
||||
off_floor = TRUE
|
||||
layer = ABOVE_MOB_LAYER
|
||||
plane = GAME_PLANE
|
||||
|
||||
if(basecolor == "rainbow")
|
||||
basecolor = "#[pick(list("FF0000","FF7F00","FFFF00","00FF00","0000FF","4B0082","8F00FF"))]"
|
||||
|
||||
color = basecolor
|
||||
|
||||
if(!gravity_check)
|
||||
if(prob(50))
|
||||
animate_float(src, -1, rand(30,120))
|
||||
else
|
||||
animate_levitate(src, -1, rand(30,120))
|
||||
|
||||
if(weightless_image.icon_state)
|
||||
icon_state = weightless_image.icon_state
|
||||
|
||||
overlays -= weightless_image
|
||||
color = "#FFFFFF"
|
||||
icon = 'icons/effects/blood_weightless.dmi'
|
||||
weightless_image = image(icon, icon_state)
|
||||
icon_state = "empty"
|
||||
weightless_image.icon += basecolor
|
||||
overlays += weightless_image
|
||||
else
|
||||
overlays.Cut()
|
||||
..()
|
||||
|
||||
/obj/effect/decal/cleanable/blood/proc/dry()
|
||||
@@ -56,6 +91,88 @@ GLOBAL_LIST_EMPTY(splatter_cache)
|
||||
desc = drydesc
|
||||
color = adjust_brightness(color, -50)
|
||||
amount = 0
|
||||
gravity_check = ALWAYS_IN_GRAVITY
|
||||
animate(src)
|
||||
|
||||
if(isspaceturf(loc))
|
||||
var/turf/T = get_turf(src)
|
||||
if(!locate(/obj/structure/grille/) in T && !locate(/obj/structure/window/) in T)
|
||||
qdel(src) //no free floating dried blood in space, thatd look weird
|
||||
|
||||
/obj/effect/decal/cleanable/blood/ex_act()
|
||||
. = ..()
|
||||
update_icon()
|
||||
|
||||
/obj/effect/decal/cleanable/blood/proc/splat(atom/AT)
|
||||
if(gravity_check) //only floating blood can splat :C
|
||||
return
|
||||
var/turf/T = get_turf(AT)
|
||||
if(try_merging_decal(T))
|
||||
return
|
||||
if(loc != T)
|
||||
forceMove(T) //move to the turf to splatter on
|
||||
animate(src) //stop floating
|
||||
gravity_check = ALWAYS_IN_GRAVITY
|
||||
icon = initial(icon)
|
||||
icon_state = weightless_image.icon_state
|
||||
layer = initial(layer)
|
||||
plane = initial(plane)
|
||||
update_icon()
|
||||
|
||||
/obj/effect/decal/cleanable/blood/try_merging_decal(turf/T)
|
||||
..()
|
||||
|
||||
/obj/effect/decal/cleanable/blood/Process_Spacemove(movement_dir)
|
||||
if(gravity_check)
|
||||
return TRUE
|
||||
|
||||
if(has_gravity(src))
|
||||
if(!gravity_check)
|
||||
splat(get_step(src, movement_dir))
|
||||
return TRUE
|
||||
|
||||
if(pulledby && !pulledby.pulling)
|
||||
return TRUE
|
||||
|
||||
if(throwing)
|
||||
return TRUE
|
||||
|
||||
return FALSE
|
||||
|
||||
|
||||
/obj/effect/decal/cleanable/blood/Bump(atom/A, yes)
|
||||
if(gravity_check)
|
||||
return ..()
|
||||
if(iswallturf(A) || istype(A, /obj/structure/window))
|
||||
splat(A)
|
||||
return
|
||||
else if(A.density)
|
||||
splat(get_turf(A))
|
||||
return
|
||||
|
||||
if(ishuman(A))
|
||||
bloodyify_human(A)
|
||||
return
|
||||
|
||||
..()
|
||||
|
||||
/obj/effect/decal/cleanable/blood/proc/bloodyify_human(mob/living/carbon/human/H)
|
||||
if(inertia_dir && H.inertia_dir == inertia_dir) //if they are moving the same direction we are, no collison
|
||||
return
|
||||
|
||||
var/list/obj/item/things_to_potentially_bloody = list()
|
||||
var/count = amount + 1
|
||||
|
||||
for(var/obj/item/i in H.contents)
|
||||
things_to_potentially_bloody += i
|
||||
|
||||
if(length(things_to_potentially_bloody))
|
||||
for(var/i in 1 to count)
|
||||
things_to_potentially_bloody[rand(1, length(things_to_potentially_bloody))].add_blood(blood_DNA, basecolor)
|
||||
count--
|
||||
qdel(src)
|
||||
else
|
||||
splat(get_turf(H))
|
||||
|
||||
/obj/effect/decal/cleanable/blood/attack_hand(mob/living/carbon/human/user)
|
||||
..()
|
||||
@@ -144,6 +261,7 @@ GLOBAL_LIST_EMPTY(splatter_cache)
|
||||
mergeable_decal = FALSE
|
||||
var/image/giblets
|
||||
var/fleshcolor = "#FFFFFF"
|
||||
gravity_check = ALWAYS_IN_GRAVITY
|
||||
|
||||
/obj/effect/decal/cleanable/blood/gibs/Destroy()
|
||||
giblets = null
|
||||
@@ -218,3 +336,4 @@ GLOBAL_LIST_EMPTY(splatter_cache)
|
||||
return FALSE
|
||||
|
||||
#undef DRYING_TIME
|
||||
#undef ALWAYS_IN_GRAVITY
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
#define ALWAYS_IN_GRAVITY 3
|
||||
|
||||
/obj/effect/decal/cleanable/generic
|
||||
name = "clutter"
|
||||
desc = "Someone should clean that up."
|
||||
@@ -141,12 +143,74 @@
|
||||
gender = PLURAL
|
||||
density = FALSE
|
||||
layer = TURF_LAYER
|
||||
plane = FLOOR_PLANE
|
||||
icon = 'icons/effects/blood.dmi'
|
||||
icon_state = "vomit_1"
|
||||
random_icon_states = list("vomit_1", "vomit_2", "vomit_3", "vomit_4")
|
||||
no_clear = TRUE
|
||||
scoop_reagents = list("vomit" = 5)
|
||||
|
||||
|
||||
/obj/effect/decal/cleanable/vomit/Initialize(mapload)
|
||||
. = ..()
|
||||
var/turf/T = get_turf(src)
|
||||
gravity_check = has_gravity(src, T)
|
||||
if(loc != T)
|
||||
forceMove(T)
|
||||
if(!gravity_check)
|
||||
layer = MOB_LAYER
|
||||
plane = GAME_PLANE
|
||||
if(prob(50))
|
||||
animate_float(src, -1, rand(30, 120))
|
||||
else
|
||||
animate_levitate(src, -1, rand(30, 120))
|
||||
icon = 'icons/effects/blood_weightless.dmi'
|
||||
|
||||
/obj/effect/decal/cleanable/vomit/Bump(atom/A, yes)
|
||||
. = ..()
|
||||
if(A.density)
|
||||
splat(A)
|
||||
|
||||
/obj/effect/decal/cleanable/vomit/Crossed(atom/movable/AM, oldloc)
|
||||
if(!gravity_check)
|
||||
splat(AM)
|
||||
..()
|
||||
|
||||
/obj/effect/decal/cleanable/vomit/proc/splat(atom/A)
|
||||
if(gravity_check)
|
||||
return
|
||||
var/turf/T = get_turf(A)
|
||||
if(try_merging_decal(T))
|
||||
return
|
||||
if(loc != T)
|
||||
forceMove(T)
|
||||
icon = initial(icon)
|
||||
gravity_check = ALWAYS_IN_GRAVITY
|
||||
if(T.density || locate(/obj/structure/window) in T)
|
||||
layer = ABOVE_WINDOW_LAYER
|
||||
plane = GAME_PLANE
|
||||
else
|
||||
layer = initial(layer)
|
||||
plane = initial(plane)
|
||||
animate(src)
|
||||
|
||||
/obj/effect/decal/cleanable/vomit/Process_Spacemove(movement_dir)
|
||||
if(gravity_check)
|
||||
return 1
|
||||
|
||||
if(has_gravity(src))
|
||||
if(!gravity_check)
|
||||
splat(get_step(src, movement_dir))
|
||||
return 1
|
||||
|
||||
if(pulledby && !pulledby.pulling)
|
||||
return 1
|
||||
|
||||
if(throwing)
|
||||
return 1
|
||||
|
||||
return 0
|
||||
|
||||
/obj/effect/decal/cleanable/vomit/green
|
||||
name = "green vomit"
|
||||
desc = "It's all gummy. Ew."
|
||||
@@ -229,3 +293,5 @@
|
||||
icon = 'icons/effects/blood.dmi'
|
||||
icon_state = "xfloor1"
|
||||
random_icon_states = list("xfloor1", "xfloor2", "xfloor3", "xfloor4", "xfloor5", "xfloor6", "xfloor7")
|
||||
|
||||
#undef ALWAYS_IN_GRAVITY
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
// 5 seconds
|
||||
#define TRACKS_CRUSTIFY_TIME 50
|
||||
#define ALWAYS_IN_GRAVITY 2
|
||||
|
||||
// color-dir-dry
|
||||
GLOBAL_LIST_EMPTY(fluidtrack_cache)
|
||||
@@ -15,6 +16,7 @@ GLOBAL_LIST_EMPTY(fluidtrack_cache)
|
||||
gender = PLURAL
|
||||
random_icon_states = null
|
||||
amount = 0
|
||||
gravity_check = ALWAYS_IN_GRAVITY
|
||||
|
||||
//BLOODY FOOTPRINTS
|
||||
/obj/effect/decal/cleanable/blood/footprints
|
||||
@@ -28,7 +30,7 @@ GLOBAL_LIST_EMPTY(fluidtrack_cache)
|
||||
var/exited_dirs = 0
|
||||
var/base_alpha = BLOODY_FOOTPRINT_BASE_ALPHA
|
||||
blood_state = BLOOD_STATE_HUMAN //the icon state to load images from
|
||||
|
||||
gravity_check = ALWAYS_IN_GRAVITY
|
||||
|
||||
/obj/effect/decal/cleanable/blood/footprints/Crossed(atom/movable/O, oldloc)
|
||||
..()
|
||||
@@ -146,3 +148,5 @@ GLOBAL_LIST_EMPTY(fluidtrack_cache)
|
||||
if(basecolor == COLOR_BLOOD_MACHINE)
|
||||
return FALSE
|
||||
return TRUE
|
||||
|
||||
#undef ALWAYS_IN_GRAVITY
|
||||
|
||||
Reference in New Issue
Block a user