From 77bcaab463743c75f55550a426e9f560d9d1cfac Mon Sep 17 00:00:00 2001 From: Geeves Date: Fri, 30 Oct 2020 13:19:42 +0200 Subject: [PATCH] Simple Mob Blood Overlays (#10237) * Simple Mob Blood Overlays * robot blood fixes * make this more uniform * support hivebot active icon states --- .../mob/living/simple_animal/friendly/carp.dm | 9 +++ .../mob/living/simple_animal/hostile/carp.dm | 9 +++ .../simple_animal/hostile/giant_spider.dm | 1 + .../living/simple_animal/hostile/hivebot.dm | 23 ++++++++ .../simple_animal/hostile/icarus_drone.dm | 1 + .../simple_animal/hostile/moghesfauna.dm | 1 + .../mob/living/simple_animal/hostile/morph.dm | 1 + .../mob/living/simple_animal/hostile/pra.dm | 1 + .../simple_animal/hostile/spider_queen.dm | 1 + .../mob/living/simple_animal/hostile/tree.dm | 1 + .../mob/living/simple_animal/simple_animal.dm | 54 +++++++++++++++++- html/changelogs/geeves-blood_overlay.yml | 6 ++ icons/mob/npc/blood_overlay.dmi | Bin 0 -> 1504 bytes icons/mob/npc/blood_overlay_carp.dmi | Bin 0 -> 2695 bytes icons/mob/npc/blood_overlay_hivebot.dmi | Bin 0 -> 1597 bytes 15 files changed, 105 insertions(+), 3 deletions(-) create mode 100644 html/changelogs/geeves-blood_overlay.yml create mode 100644 icons/mob/npc/blood_overlay.dmi create mode 100644 icons/mob/npc/blood_overlay_carp.dmi create mode 100644 icons/mob/npc/blood_overlay_hivebot.dmi diff --git a/code/modules/mob/living/simple_animal/friendly/carp.dm b/code/modules/mob/living/simple_animal/friendly/carp.dm index ea669271567..b0d5b723b40 100644 --- a/code/modules/mob/living/simple_animal/friendly/carp.dm +++ b/code/modules/mob/living/simple_animal/friendly/carp.dm @@ -21,6 +21,7 @@ response_help = "brushes" response_disarm = "attempts to push" response_harm = "injures" + blood_overlay_icon = 'icons/mob/npc/blood_overlay_carp.dmi' gender = NEUTER faction = "carp" flying = TRUE @@ -50,6 +51,14 @@ possession_candidate = TRUE +/mob/living/simple_animal/carp/update_icon() + ..() + if(resting || stat == DEAD) + blood_overlay_icon = 'icons/mob/npc/blood_overlay.dmi' + else + blood_overlay_icon = initial(blood_overlay_icon) + handle_blood_overlay(TRUE) + /mob/living/simple_animal/carp/fall_impact() src.visible_message(SPAN_NOTICE("\The [src] gently floats to a stop.")) return FALSE diff --git a/code/modules/mob/living/simple_animal/hostile/carp.dm b/code/modules/mob/living/simple_animal/hostile/carp.dm index 6c4358062c5..eae113d0fe7 100644 --- a/code/modules/mob/living/simple_animal/hostile/carp.dm +++ b/code/modules/mob/living/simple_animal/hostile/carp.dm @@ -20,6 +20,7 @@ health = 25 mob_size = 10 + blood_overlay_icon = 'icons/mob/npc/blood_overlay_carp.dmi' harm_intent_damage = 8 melee_damage_lower = 15 melee_damage_upper = 15 @@ -46,6 +47,14 @@ see_in_dark = 8 see_invisible = SEE_INVISIBLE_NOLIGHTING +/mob/living/simple_animal/hostile/carp/update_icon() + ..() + if(resting || stat == DEAD) + blood_overlay_icon = 'icons/mob/npc/blood_overlay.dmi' + else + blood_overlay_icon = initial(blood_overlay_icon) + handle_blood_overlay(TRUE) + /mob/living/simple_animal/hostile/carp/Allow_Spacemove(var/check_drift = 0) return 1 //No drifting in space for space carp! //original comments do not steal diff --git a/code/modules/mob/living/simple_animal/hostile/giant_spider.dm b/code/modules/mob/living/simple_animal/hostile/giant_spider.dm index 4ad5377b219..b6cb5506849 100644 --- a/code/modules/mob/living/simple_animal/hostile/giant_spider.dm +++ b/code/modules/mob/living/simple_animal/hostile/giant_spider.dm @@ -21,6 +21,7 @@ response_help = "pets" response_disarm = "gently pushes aside" response_harm = "pokes" + blood_overlay_icon = null stop_automated_movement_when_pulled = 0 maxHealth = 200 health = 200 diff --git a/code/modules/mob/living/simple_animal/hostile/hivebot.dm b/code/modules/mob/living/simple_animal/hostile/hivebot.dm index 8f5ac470cd5..50da1d7a402 100644 --- a/code/modules/mob/living/simple_animal/hostile/hivebot.dm +++ b/code/modules/mob/living/simple_animal/hostile/hivebot.dm @@ -14,6 +14,7 @@ icon = 'icons/mob/npc/hivebot.dmi' icon_state = "hivebot" blood_type = "#000000" + blood_overlay_icon = 'icons/mob/npc/blood_overlay_hivebot.dmi' health = 15 maxHealth = 15 harm_intent_damage = 3 @@ -48,6 +49,20 @@ /mob/living/simple_animal/hostile/hivebot/get_bullet_impact_effect_type(var/def_zone) return BULLET_IMPACT_METAL +/mob/living/simple_animal/hostile/hivebot/update_icon() + ..() + if(resting || stat == DEAD) + blood_overlay_icon = 'icons/mob/npc/blood_overlay.dmi' + else + blood_overlay_icon = initial(blood_overlay_icon) + handle_blood_overlay(TRUE) + +/mob/living/simple_animal/hostile/hivebot/get_blood_overlay_name() + if(stance == HOSTILE_STANCE_IDLE) + return "blood_overlay" + else + return "blood_overlay_armed" + /mob/living/simple_animal/hostile/hivebot/guardian health = 80 maxHealth = 45 @@ -227,6 +242,7 @@ icon_living = "hivebotbeacon_active" health = 300 maxHealth = 300 + blood_type = "#000000" projectilesound = 'sound/weapons/taser2.ogg' projectiletype = /obj/item/projectile/beam/hivebot wander = 0 @@ -505,6 +521,8 @@ icon_state = "hivebotharvester" health = 100 maxHealth = 100 + blood_type = "#000000" + blood_overlay_icon = 'icons/mob/npc/blood_overlay_hivebot.dmi' harm_intent_damage = 3 melee_damage_lower = 30 melee_damage_upper = 30 @@ -722,6 +740,11 @@ icon_state = "hivebotharvester_ripping" else icon_state = "hivebotharvester" + if(resting || stat == DEAD || busy) + blood_overlay_icon = 'icons/mob/npc/blood_overlay.dmi' + else + blood_overlay_icon = initial(blood_overlay_icon) + handle_blood_overlay(TRUE) /mob/living/simple_animal/hostile/retaliate/hivebotharvester/proc/prospect() diff --git a/code/modules/mob/living/simple_animal/hostile/icarus_drone.dm b/code/modules/mob/living/simple_animal/hostile/icarus_drone.dm index f06add5efab..3c3c95844ab 100644 --- a/code/modules/mob/living/simple_animal/hostile/icarus_drone.dm +++ b/code/modules/mob/living/simple_animal/hostile/icarus_drone.dm @@ -19,6 +19,7 @@ stop_automated_movement_when_pulled = FALSE health = 300 maxHealth = 300 + blood_type = "#000000" speed = 8 projectiletype = /obj/item/projectile/beam/drone projectilesound = 'sound/weapons/laser3.ogg' diff --git a/code/modules/mob/living/simple_animal/hostile/moghesfauna.dm b/code/modules/mob/living/simple_animal/hostile/moghesfauna.dm index 74d5cbe08a2..6bfc4f648cb 100644 --- a/code/modules/mob/living/simple_animal/hostile/moghesfauna.dm +++ b/code/modules/mob/living/simple_animal/hostile/moghesfauna.dm @@ -16,6 +16,7 @@ response_help = "pets" response_disarm = "shoves" response_harm = "harmlessly punches" + blood_overlay_icon = null maxHealth = 450 health = 450 harm_intent_damage = 0 diff --git a/code/modules/mob/living/simple_animal/hostile/morph.dm b/code/modules/mob/living/simple_animal/hostile/morph.dm index 928dd5bc8d7..dbf72fef369 100644 --- a/code/modules/mob/living/simple_animal/hostile/morph.dm +++ b/code/modules/mob/living/simple_animal/hostile/morph.dm @@ -48,6 +48,7 @@ attacktext = "glomped" attack_sound = 'sound/effects/blobattack.ogg' + blood_overlay_icon = null var/morphed = FALSE var/melee_damage_disguised = 0 diff --git a/code/modules/mob/living/simple_animal/hostile/pra.dm b/code/modules/mob/living/simple_animal/hostile/pra.dm index 3841f4fab30..9f6269b58e0 100644 --- a/code/modules/mob/living/simple_animal/hostile/pra.dm +++ b/code/modules/mob/living/simple_animal/hostile/pra.dm @@ -9,6 +9,7 @@ icon_state = "republicon" icon_living = "republicon" icon_dead = "republicon_dead" + blood_type = "#000000" speak_chance = 5 turns_per_move = 3 organ_names = list("chest", "lower body", "left arm", "right arm", "left leg", "right leg", "head") diff --git a/code/modules/mob/living/simple_animal/hostile/spider_queen.dm b/code/modules/mob/living/simple_animal/hostile/spider_queen.dm index 12c95b0ab39..26c7fa8cb6a 100644 --- a/code/modules/mob/living/simple_animal/hostile/spider_queen.dm +++ b/code/modules/mob/living/simple_animal/hostile/spider_queen.dm @@ -16,6 +16,7 @@ response_help = "pets" response_disarm = "gently pushes aside" response_harm = "pokes" + blood_overlay_icon = null stop_automated_movement_when_pulled = 0 maxHealth = 700 health = 700 diff --git a/code/modules/mob/living/simple_animal/hostile/tree.dm b/code/modules/mob/living/simple_animal/hostile/tree.dm index 583ec3029dd..91b9dbbe44e 100644 --- a/code/modules/mob/living/simple_animal/hostile/tree.dm +++ b/code/modules/mob/living/simple_animal/hostile/tree.dm @@ -13,6 +13,7 @@ response_help = "brushes" response_disarm = "pushes" response_harm = "hits" + blood_overlay_icon = null speed = -1 maxHealth = 250 health = 250 diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index d028cd278c5..cce6bb30fe3 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -1,3 +1,9 @@ +#define BLOOD_NONE "none" +#define BLOOD_LIGHT "light" +#define BLOOD_MEDIUM "medium" +#define BLOOD_HEAVY "heavy" + + /mob/living/simple_animal name = "animal" icon = 'icons/mob/npc/animal.dmi' @@ -13,7 +19,12 @@ var/icon_living = "" var/icon_dead = "" var/icon_gib = null //We only try to show a gibbing animation if this exists. + + appearance_flags = KEEP_TOGETHER var/blood_type = "#A10808" //Blood colour for impact visuals. + var/blood_overlay_icon = 'icons/mob/npc/blood_overlay.dmi' + var/blood_state = BLOOD_NONE + var/image/blood_overlay var/list/speak = list() var/speak_chance = 0 @@ -180,6 +191,7 @@ if(health > maxHealth) health = maxHealth + handle_blood_overlay() handle_stunned() handle_weakened() handle_paralysed() @@ -303,6 +315,34 @@ if(purge) purge -= 1 +/mob/living/simple_animal/proc/handle_blood_overlay(var/force_reset = FALSE) + if(!blood_overlay_icon) + return + + var/current_blood_state = blood_state + var/blood_mod = health / maxHealth + if(blood_mod > 0.9) + blood_state = BLOOD_NONE + else if(blood_mod >= 0.7) + blood_state = BLOOD_LIGHT + else if(blood_mod >= 0.4) + blood_state = BLOOD_MEDIUM + else + blood_state = BLOOD_HEAVY + + if(force_reset || (blood_state != BLOOD_NONE && current_blood_state != blood_state)) + if(blood_overlay) + cut_overlay(blood_overlay) + var/blood_overlay_name = get_blood_overlay_name() + var/image/I = image(blood_overlay_icon, src, "[blood_overlay_name]-[blood_state]") + I.color = blood_type + I.blend_mode = BLEND_INSET_OVERLAY + blood_overlay = I + add_overlay(blood_overlay) + +/mob/living/simple_animal/proc/get_blood_overlay_name() + return "blood_overlay" + /mob/living/simple_animal/proc/handle_eating() var/list/food_choices = list() for(var/obj/item/reagent_containers/food/snacks/S in get_turf(src)) @@ -488,6 +528,9 @@ mob/living/simple_animal/bullet_act(var/obj/item/projectile/Proj) visible_message(SPAN_DANGER("\The [src] has been attacked with \the [O] by \the [user].")) user.do_attack_animation(src) +/mob/living/simple_animal/apply_damage(damage, damagetype, def_zone, blocked, used_weapon, damage_flags) + . = ..() + handle_blood_overlay() /mob/living/simple_animal/movement_delay() var/tally = 0 //Incase I need to add stuff other than "speed" later @@ -532,11 +575,11 @@ mob/living/simple_animal/bullet_act(var/obj/item/projectile/Proj) /mob/living/simple_animal/death(gibbed, deathmessage = "dies!") walk_to(src,0) movement_target = null - icon_state = icon_dead - density = 0 + density = FALSE if (isopenturf(loc)) ADD_FALLING_ATOM(src) - return ..(gibbed,deathmessage) + . = ..(gibbed, deathmessage) + update_icon() /mob/living/simple_animal/ex_act(severity) if(!blinded) @@ -766,3 +809,8 @@ mob/living/simple_animal/bullet_act(var/obj/item/projectile/Proj) return /obj/effect/gibspawner/robot else return /obj/effect/gibspawner/generic + +#undef BLOOD_NONE +#undef BLOOD_LIGHT +#undef BLOOD_MEDIUM +#undef BLOOD_HEAVY \ No newline at end of file diff --git a/html/changelogs/geeves-blood_overlay.yml b/html/changelogs/geeves-blood_overlay.yml new file mode 100644 index 00000000000..b0b8dbe2e5a --- /dev/null +++ b/html/changelogs/geeves-blood_overlay.yml @@ -0,0 +1,6 @@ +author: Geeves + +delete-after: True + +changes: + - rscadd: "Added blood overlays to simple mobs." \ No newline at end of file diff --git a/icons/mob/npc/blood_overlay.dmi b/icons/mob/npc/blood_overlay.dmi new file mode 100644 index 0000000000000000000000000000000000000000..6c8cf088cc0cf99390be3fd01546e73338ba1400 GIT binary patch literal 1504 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 wKcO&0=mr=f>?909x6{WT7AfEh($ literal 0 HcmV?d00001 diff --git a/icons/mob/npc/blood_overlay_hivebot.dmi b/icons/mob/npc/blood_overlay_hivebot.dmi new file mode 100644 index 0000000000000000000000000000000000000000..f3f795dc56e40f0a54de1e161cf361748a3f7b93 GIT binary patch literal 1597 zcmYk6eK?bA9LFE0Tv+AhYGEzrC1G@iRXW1hVJK+~aV{0_o%W8%?p(Sw~^s=aFon|`s)<5Tu=lw6ySeykOk?H?Y>BhJ}zIpMOSI2PH9> z{O#B<>@aqx6>IWx_vLUalB1(N4rk|$s@rVe6y~mX1D{`rwYyhm?vT(ctc)zJxC%RX zRmY!{dBSJY+iKqpBB8zMG>1bRCGM-fR9V~d^vuSx-Oru`?smR&EDWtC|r(Uzd-cug^EMdj5P=}y7c3rZ(pjDi_-DYU(_D*4z z3)g^YQ-R_}Bk0cNlIDe`CO25bmlr|TY7~STebE%A*6+|N{HwAM~ zba79|52$QO)(;C7I9ljfDq6+JJx3w;ezWC~4R(lgzG zPYl0J!#vWiKVCOuj5~x2?m1d6(g%@r^hm~TYGNYT6PD*awD&9_5pIhAqoma{yJg$h z1U^tf+j&KlM7H)!ab`|WYz%Dv_|SD5V^wtVp3x^~`yVWn23LeAuL{1$45dWdq+09bt@FiW)-FH!%`F?X`1auZ|RC4pJH$>*HszE6mz)LX%j31>4sN2kuYAGX4X5=8J;5zsL zYH0G&u+d%Oo{kJ3LVN7v?2Io(N~7nZ<>l8NoKJf~6_L@122@mPnkiT8PdvvauAK6w z$9n!6ocL77CeZ#A-!+oJF&Mt%0jClyV)VHOjjzNY3I&C+QA5#yFS??$=zjP4BVE0R z1Y6|e)2PbvW7*MU%*{{r3PLTcTznjqS!Jo_(mc=NLH|3gKeRCq>alI1dU-U%uB2A1lkITMi+n?p@6o3MboEU|7duN*x8*g0>26mQs&~h# zQ3+x+O#KTuK)~~~p7xgI!R4BD%DXIM5g-Cr)@j>Lqky(|r*l!iYbGLXqnkA#YBcmz zaV<-H`-jHD^qYVm8>E1!$Ln408JQLkAN7$PDa+32_zpVryFdhrAq}8zZP`>tHIS<^ zJwzNSw`^foWZL}Tds<`PLY~X~Y;`U~FnO$qEyoG53AQD=3ojSm?^}kqYn+g}!)u?n z5S-Z|i-MAHM%?fkPSstQElVN&{k>bP)7Q^_IthAyvUA3@>VRns@)Qpi=7Gb^GIpB8 z2&sn1_`~o5D^Btwx6XctLjvRBpRTVvau|M_Tt40`m}Pc`nJR6ALJh%9o3SyQS_jqZn_J8JHay?^Z ul@?Uy80FP_y*K7p@$Jjg>YvZ=n76OZDf1rcZ(0PudML<0#IF$_oAn=s+ya&W literal 0 HcmV?d00001