diff --git a/code/__DEFINES/footsteps.dm b/code/__DEFINES/footsteps.dm index e66d518644..56dfbe155d 100644 --- a/code/__DEFINES/footsteps.dm +++ b/code/__DEFINES/footsteps.dm @@ -7,6 +7,14 @@ #define FOOTSTEP_WATER "water" #define FOOTSTEP_LAVA "lava" +#define FOOTPRINT_SHOE "shoe" +#define FOOTPRINT_PAW "paw" +#define FOOTPRINT_CLAW "claw" +#define FOOTPRINT_WHEEL "wheels" +#define FOOTPRINT_TRAIL "trails_" +#define FOOTPRINT_SNAKE "snake" +#define FOOTPRINT_DRAG "drag" + /* id = list( diff --git a/code/__HELPERS/_cit_helpers.dm b/code/__HELPERS/_cit_helpers.dm index c9e2f465cf..f6d82ed93a 100644 --- a/code/__HELPERS/_cit_helpers.dm +++ b/code/__HELPERS/_cit_helpers.dm @@ -92,6 +92,26 @@ GLOBAL_LIST_INIT(dildo_colors, list(//mostly neon colors "Purple" = "#e300ff"//purple )) +GLOBAL_LIST_INIT(noodle_taurs, list( + "Naga", + "Tentacle" + )) + +GLOBAL_LIST_INIT(paw_taurs, list( + "Fox", + "Wolf", + "Otie", + "Drake", + "Lab", + "Shepherd", + "Husky", + "Eevee", + "Panther", + "Horse", + "Cow", + "Tiger" + )) + //Crew objective and miscreants stuff GLOBAL_VAR_INIT(miscreants_allowed, FALSE) diff --git a/code/game/objects/effects/decals/cleanable/humans.dm b/code/game/objects/effects/decals/cleanable/humans.dm index e19e25293f..46928078e3 100644 --- a/code/game/objects/effects/decals/cleanable/humans.dm +++ b/code/game/objects/effects/decals/cleanable/humans.dm @@ -39,11 +39,6 @@ /obj/effect/decal/cleanable/blood/splatter random_icon_states = list("gibbl1", "gibbl2", "gibbl3", "gibbl4", "gibbl5") -/obj/effect/decal/cleanable/blood/tracks - icon_state = "tracks" - desc = "They look like tracks left by wheels." - random_icon_states = null - /obj/effect/decal/cleanable/trail_holder //not a child of blood on purpose so that it shows up even on regular splatters name = "blood" icon_state = "ltrails_1" @@ -150,19 +145,18 @@ //BLOODY FOOTPRINTS -/obj/effect/decal/cleanable/blood/footprints - name = "footprints" - icon = 'icons/effects/footprints.dmi' +/obj/effect/decal/cleanable/blood/tracks + name = "tracks" + icon = 'icons/effects/fluidtracks.dmi' icon_state = "nothingwhatsoever" desc = "WHOSE FOOTPRINTS ARE THESE?" random_icon_states = null var/entered_dirs = 0 var/exited_dirs = 0 - var/foot_state - blood_state = BLOOD_STATE_BLOOD //the icon state to load images from + var/print_state = FOOTPRINT_SHOE //the icon state to load images from var/list/shoe_types = list() -/obj/effect/decal/cleanable/blood/footprints/Crossed(atom/movable/O) +/obj/effect/decal/cleanable/blood/tracks/Crossed(atom/movable/O) ..() if(ishuman(O)) var/mob/living/carbon/human/H = O @@ -174,7 +168,7 @@ entered_dirs |= H.dir update_icon() -/obj/effect/decal/cleanable/blood/footprints/Uncrossed(atom/movable/O) +/obj/effect/decal/cleanable/blood/tracks/Uncrossed(atom/movable/O) ..() if(ishuman(O)) var/mob/living/carbon/human/H = O @@ -187,24 +181,24 @@ update_icon() -/obj/effect/decal/cleanable/blood/footprints/update_icon() +/obj/effect/decal/cleanable/blood/tracks/update_icon() cut_overlays() for(var/Ddir in GLOB.cardinals) if(entered_dirs & Ddir) - var/image/bloodstep_overlay = GLOB.bloody_footprints_cache["entered-[blood_state]-[Ddir]"] + var/image/bloodstep_overlay = GLOB.bloody_footprints_cache["entered-[print_state]-[Ddir]"] if(!bloodstep_overlay) - GLOB.bloody_footprints_cache["entered-[blood_state]-[Ddir]"] = bloodstep_overlay = image(icon, "[blood_state]1", dir = Ddir) + GLOB.bloody_footprints_cache["entered-[print_state]-[Ddir]"] = bloodstep_overlay = image(icon, "[print_state]1", dir = Ddir) add_overlay(bloodstep_overlay) if(exited_dirs & Ddir) - var/image/bloodstep_overlay = GLOB.bloody_footprints_cache["exited-[blood_state]-[Ddir]"] + var/image/bloodstep_overlay = GLOB.bloody_footprints_cache["exited-[print_state]-[Ddir]"] if(!bloodstep_overlay) - GLOB.bloody_footprints_cache["exited-[blood_state]-[Ddir]"] = bloodstep_overlay = image(icon, "[blood_state]2", dir = Ddir) + GLOB.bloody_footprints_cache["exited-[print_state]-[Ddir]"] = bloodstep_overlay = image(icon, "[print_state]2", dir = Ddir) add_overlay(bloodstep_overlay) alpha = BLOODY_FOOTPRINT_BASE_ALPHA+bloodiness -/obj/effect/decal/cleanable/blood/footprints/examine(mob/user) +/obj/effect/decal/cleanable/blood/tracks/examine(mob/user) . = ..() if(shoe_types.len) . += "You recognise the footprints as belonging to:\n" @@ -214,14 +208,51 @@ to_chat(user, .) -/obj/effect/decal/cleanable/blood/footprints/replace_decal(obj/effect/decal/cleanable/C) +/obj/effect/decal/cleanable/blood/tracks/replace_decal(obj/effect/decal/cleanable/C) if(blood_state != C.blood_state) //We only replace footprints of the same type as us return if(color != C.color) return ..() -/obj/effect/decal/cleanable/blood/footprints/can_bloodcrawl_in() +/obj/effect/decal/cleanable/blood/tracks/can_bloodcrawl_in() if((blood_state != BLOOD_STATE_OIL) && (blood_state != BLOOD_STATE_NOT_BLOODY)) - return 1 - return 0 + return TRUE + return FALSE + +/obj/effect/decal/cleanable/blood/tracks/footprints + name = "footprints" + desc = "They look like tracks left by footwear." + icon_state = FOOTPRINT_SHOE + print_state = FOOTPRINT_SHOE + +/obj/effect/decal/cleanable/blood/tracks/snake + name = "tracks" + desc = "They look like tracks left by a giant snake." + icon_state = FOOTPRINT_SNAKE + print_state = FOOTPRINT_SNAKE + +/obj/effect/decal/cleanable/blood/tracks/paw + name = "tracks" + desc = "They look like tracks left by mammalian paws." + icon_state = FOOTPRINT_PAW + print_state = FOOTPRINT_PAW + +/obj/effect/decal/cleanable/blood/tracks/claw + name = "tracks" + desc = "They look like tracks left by reptilian claws." + icon_state = FOOTPRINT_CLAW + print_state = FOOTPRINT_CLAW + +/obj/effect/decal/cleanable/blood/tracks/wheels + name = "tracks" + desc = "They look like tracks left by wheels." + gender = PLURAL + icon_state = FOOTPRINT_WHEEL + print_state = FOOTPRINT_WHEEL + +/obj/effect/decal/cleanable/blood/tracks/body + name = "trails" + desc = "A trail left by something being dragged." + icon_state = FOOTPRINT_DRAG + print_state = FOOTPRINT_DRAG diff --git a/code/game/objects/effects/decals/cleanable/tracks.dm b/code/game/objects/effects/decals/cleanable/tracks.dm index e69de29bb2..215ad98bfb 100644 --- a/code/game/objects/effects/decals/cleanable/tracks.dm +++ b/code/game/objects/effects/decals/cleanable/tracks.dm @@ -0,0 +1,136 @@ +// Stolen en masse from N3X15 of /vg/station with much gratitude. + +// The idea is to have 4 bits for coming and 4 for going. +#define TRACKS_COMING_NORTH 1 +#define TRACKS_COMING_SOUTH 2 +#define TRACKS_COMING_EAST 4 +#define TRACKS_COMING_WEST 8 +#define TRACKS_GOING_NORTH 16 +#define TRACKS_GOING_SOUTH 32 +#define TRACKS_GOING_EAST 64 +#define TRACKS_GOING_WEST 128 + +// color-dir-dry +var/global/list/image/fluidtrack_cache=list() + +/datum/fluidtrack + var/direction=0 + var/basecolor=COLOR_BLOOD_HUMAN + var/image/overlay + +/datum/fluidtrack/New(_direction,_color,_wet) + src.direction=_direction + src.basecolor=_color + +// Footprints, tire trails... +/obj/effect/decal/cleanable/blood/tracks + amount = 0 + random_icon_states = null + var/dirs=0 + icon = 'icons/effects/fluidtracks.dmi' + icon_state = "" + var/coming_state="blood1" + var/going_state="blood2" + var/updatedtracks=0 + + // dir = id in stack + var/list/setdirs=list( + "1"=0, + "2"=0, + "4"=0, + "8"=0, + "16"=0, + "32"=0, + "64"=0, + "128"=0 + ) + + // List of laid tracks and their colors. + var/list/datum/fluidtrack/stack=list() + + /** + * Add tracks to an existing trail. + * + * @param DNA bloodDNA to add to collection. + * @param comingdir Direction tracks come from, or 0. + * @param goingdir Direction tracks are going to (or 0). + * @param bloodcolor Color of the blood when wet. + */ +/obj/effect/decal/cleanable/blood/tracks/proc/AddTracks(var/list/DNA, var/comingdir, var/goingdir, var/bloodcolor=BLOOD_COLOR_HUMAN) + var/updated=0 + // Shift our goingdir 4 spaces to the left so it's in the GOING bitblock. + var/realgoing=goingdir<<4 + + // Current bit + var/b=0 + + var/datum/fluidtrack/track + + // Process 4 bits + for(var/bi=0;bi<4;bi++) + b=1<>4 + + if(track.overlay) + track.overlay=null + var/image/I = image(icon, icon_state=state, dir=num2dir(truedir)) + I.color = track.basecolor + + track.fresh=0 + track.overlay=I + stack[stack_idx]=track + overlays += I + updatedtracks=0 // Clear our memory of updated tracks. + diff --git a/code/modules/clothing/suits/_suits.dm b/code/modules/clothing/suits/_suits.dm index 0a44b57c6a..f4fe92e86b 100644 --- a/code/modules/clothing/suits/_suits.dm +++ b/code/modules/clothing/suits/_suits.dm @@ -31,12 +31,12 @@ H.update_inv_wear_suit() if(("taur" in H.dna.species.mutant_bodyparts) && (H.dna.features["taur"] != "None")) - if(H.dna.features["taur"] in list("Naga", "Tentacle")) + if(H.dna.features["taur"] in GLOB.noodle_taurs) taurmode = SNEK_TAURIC if(tauric == TRUE) center = TRUE dimension_x = 64 - else if(H.dna.features["taur"] in list("Fox","Wolf","Otie","Drake","Lab","Shepherd","Husky","Eevee","Panther","Horse","Cow","Tiger")) + else if(H.dna.features["taur"] in GLOB.paw_taurs) taurmode = PAW_TAURIC if(tauric == TRUE) center = TRUE diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm index 4f168d97fc..ed632c24d5 100644 --- a/code/modules/mob/living/carbon/human/human_defines.dm +++ b/code/modules/mob/living/carbon/human/human_defines.dm @@ -43,6 +43,9 @@ var/bleed_rate = 0 //how much are we bleeding var/bleedsuppress = 0 //for stopping bloodloss, eventually this will be limb-based like bleeding + var/blood_state = BLOOD_STATE_NOT_BLOODY + var/list/blood_smear = list(BLOOD_STATE_BLOOD = 0, BLOOD_STATE_OIL = 0, BLOOD_STATE_NOT_BLOODY = 0) + var/name_override //For temporary visible name changes var/nameless = FALSE //For drones of both the insectoid and robotic kind. And other types of nameless critters. diff --git a/code/modules/mob/living/carbon/human/human_movement.dm b/code/modules/mob/living/carbon/human/human_movement.dm index a753df95bf..5ef1223abe 100644 --- a/code/modules/mob/living/carbon/human/human_movement.dm +++ b/code/modules/mob/living/carbon/human/human_movement.dm @@ -62,7 +62,7 @@ //No oldFP or they're all a different kind of blood S.bloody_shoes[S.blood_state] = max(0, S.bloody_shoes[S.blood_state] - BLOOD_LOSS_PER_STEP) if (S.bloody_shoes[S.blood_state] > BLOOD_LOSS_IN_SPREAD) - var/obj/effect/decal/cleanable/blood/tracks/FP = new /obj/effect/decal/cleanable/blood/tracks(T) + var/obj/effect/decal/cleanable/blood/tracks/FP = new /obj/effect/decal/cleanable/blood/tracks/footprints(T) FP.blood_state = S.blood_state FP.entered_dirs |= dir FP.bloodiness = S.bloody_shoes[S.blood_state] - BLOOD_LOSS_IN_SPREAD @@ -72,6 +72,69 @@ update_inv_shoes() //End bloody footprints S.step_action() + else + if(!buckled) + + if(!lying) + if(loc == NewLoc) + if(!has_gravity(loc)) + return + var/turf/T = get_turf(src) + if(blood_smear && blood_smear[blood_state]) + for(var/obj/effect/decal/cleanable/blood/tracks/oldFP in T) + if (oldFP.blood_state == blood_state) + return + blood_smear[blood_state] = max(0, blood_smear[blood_state] - BLOOD_LOSS_PER_STEP) + if(blood_smear[blood_state] > BLOOD_LOSS_IN_SPREAD) + var/obj/effect/decal/cleanable/blood/tracks/FP = new /obj/effect/decal/cleanable/blood/tracks/footprints(T) + if(DIGITIGRADE in dna.species.species_traits) + if(dna.species.id == ("lizard" || "ashwalker" || "xeno")) + FP.icon_state = FOOTPRINT_CLAW + FP.print_state = FOOTPRINT_CLAW + else if(dna.species.id == "Mammal") + FP.icon_state = FOOTPRINT_PAW + FP.print_state = FOOTPRINT_PAW + else + FP.icon_state = FOOTPRINT_SHOE + FP.print_state = FOOTPRINT_SHOE + else if(("taur" in dna.species.mutant_bodyparts) && (dna.features["taur"] != "None")) + if(dna.features["taur"] in GLOB.noodle_taurs) + FP.icon_state = FOOTPRINT_SNAKE + FP.print_state = FOOTPRINT_SNAKE + else if(dna.features["taur"] in GLOB.paw_taurs) + FP.icon_state = FOOTPRINT_PAW + FP.print_state = FOOTPRINT_PAW + else + FP.icon_state = FOOTPRINT_SHOE + FP.print_state = FOOTPRINT_SHOE + FP.blood_state = blood_state + FP.entered_dirs |= dir + FP.bloodiness = blood_smear - BLOOD_LOSS_IN_SPREAD + FP.transfer_blood_dna(blood_DNA) + FP.color = blood_DNA_to_color() //Color the blood with our dna stuff + FP.update_icon() + + else //we're on the floor, smear some stuff around + if(loc == NewLoc) + if(!has_gravity(loc)) + return + var/turf/T = get_turf(src) + if(blood_smear && blood_smear[blood_state]) + for(var/obj/effect/decal/cleanable/blood/tracks/oldFP in T) + if (oldFP.blood_state == blood_state) + return + blood_smear[blood_state] = max(0, blood_smear[blood_state] - BLOOD_LOSS_PER_STEP) + if(blood_smear[blood_state] > BLOOD_LOSS_IN_SPREAD) + var/obj/effect/decal/cleanable/blood/tracks/FP = new /obj/effect/decal/cleanable/blood/tracks/footprints(T) + FP.icon_state = FOOTPRINT_DRAG + FP.print_state = FOOTPRINT_DRAG + FP.blood_state = blood_state + FP.entered_dirs |= dir + FP.bloodiness = blood_smear - BLOOD_LOSS_IN_SPREAD + FP.transfer_blood_dna(blood_DNA) + FP.color = blood_DNA_to_color() //Color the blood with our dna stuff + FP.update_icon() + /mob/living/carbon/human/Process_Spacemove(movement_dir = 0) //Temporary laziness thing. Will change to handles by species reee. if(dna.species.space_move(src)) diff --git a/code/modules/surgery/bodyparts/bodyparts.dm b/code/modules/surgery/bodyparts/bodyparts.dm index f394351285..7cdc5fb88f 100644 --- a/code/modules/surgery/bodyparts/bodyparts.dm +++ b/code/modules/surgery/bodyparts/bodyparts.dm @@ -680,6 +680,8 @@ px_y = 12 stam_heal_tick = 2 max_stamina_damage = 50 + var/blood_state = BLOOD_STATE_NOT_BLOODY + var/list/bloody_legs = list(BLOOD_STATE_BLOOD = 0, BLOOD_STATE_OIL = 0, BLOOD_STATE_NOT_BLOODY = 0) /obj/item/bodypart/l_leg/set_disabled(new_disabled = TRUE) ..() @@ -727,6 +729,8 @@ px_y = 12 max_stamina_damage = 50 stam_heal_tick = 2 + var/blood_state = BLOOD_STATE_NOT_BLOODY + var/list/bloody_legs = list(BLOOD_STATE_BLOOD = 0, BLOOD_STATE_OIL = 0, BLOOD_STATE_NOT_BLOODY = 0) /obj/item/bodypart/r_leg/set_disabled(new_disabled = TRUE) ..() diff --git a/icons/effects/fluidtracks.dmi b/icons/effects/fluidtracks.dmi index 54f08c705a..01335f3daf 100644 Binary files a/icons/effects/fluidtracks.dmi and b/icons/effects/fluidtracks.dmi differ