diff --git a/ModularTegustation/Teguicons/status_sprites.dmi b/ModularTegustation/Teguicons/status_sprites.dmi index 9bfd855812af..9176097a48a2 100644 Binary files a/ModularTegustation/Teguicons/status_sprites.dmi and b/ModularTegustation/Teguicons/status_sprites.dmi differ diff --git a/ModularTegustation/Teguicons/tegu_effects.dmi b/ModularTegustation/Teguicons/tegu_effects.dmi index fac66aed1c56..1f0bf50f145c 100644 Binary files a/ModularTegustation/Teguicons/tegu_effects.dmi and b/ModularTegustation/Teguicons/tegu_effects.dmi differ diff --git a/code/modules/mob/living/simple_animal/abnormality/aleph/melting_love.dm b/code/modules/mob/living/simple_animal/abnormality/aleph/melting_love.dm index 12f170f0f0ec..27bb25984bb6 100644 --- a/code/modules/mob/living/simple_animal/abnormality/aleph/melting_love.dm +++ b/code/modules/mob/living/simple_animal/abnormality/aleph/melting_love.dm @@ -1,3 +1,4 @@ +#define STATUS_EFFECT_SLIMED /datum/status_effect/melty_slimed /mob/living/simple_animal/hostile/abnormality/melting_love name = "Melting Love" desc = "A pink slime creature, resembling a female humanoid." @@ -24,7 +25,7 @@ stat_attack = DEAD minimum_distance = 0 ranged_cooldown_time = 5 SECONDS - move_to_delay = 3.5 + move_to_delay = 4 /* Works */ start_qliphoth = 3 can_breach = TRUE @@ -48,11 +49,8 @@ abnormality_origin = ABNORMALITY_ORIGIN_LOBOTOMY var/mob/living/carbon/human/gifted_human = null - /// When FALSE - cannot attack or move - var/can_act = TRUE /// Amount of BLACK damage done to all enemies around main target on melee attack. Also includes original target var/radius_damage = 30 - var/sanityheal_cooldown = 15 SECONDS var/sanityheal_cooldown_base = 15 SECONDS @@ -83,9 +81,6 @@ return ..() /mob/living/simple_animal/hostile/abnormality/melting_love/AttackingTarget() - if(!can_act) - return FALSE - // Convert if(ishuman(target)) var/mob/living/carbon/human/H = target @@ -103,6 +98,7 @@ // AOE attack if(isliving(target)) + new /obj/effect/gibspawner/generic/silent/melty_slime(get_turf(target)) for(var/turf/open/T in view(1, target)) var/obj/effect/temp_visual/small_smoke/halfsecond/S = new(T) S.color = "#FF0081" @@ -110,9 +106,21 @@ if(faction_check_mob(L)) continue L.apply_damage(radius_damage, BLACK_DAMAGE, null, L.run_armor_check(null, BLACK_DAMAGE), spread_damage = TRUE) + L.apply_status_effect(STATUS_EFFECT_SLIMED) return ..() +/mob/living/simple_animal/hostile/abnormality/melting_love/Move() + . = ..() + var/turf/T = get_turf(src) + if(!isturf(T) || isspaceturf(T)) + return + if(locate(/obj/effect/decal/cleanable/melty_slime) in T) + for(var/obj/effect/decal/cleanable/melty_slime/slime in T) + slime.Refresh() + return + new /obj/effect/decal/cleanable/melty_slime(T) + /* Slime Conversion */ /mob/living/simple_animal/hostile/abnormality/melting_love/proc/SlimeConvert(mob/living/carbon/human/H) if(!istype(H)) @@ -125,7 +133,7 @@ /* Qliphoth things */ /mob/living/simple_animal/hostile/abnormality/melting_love/SuccessEffect(mob/living/carbon/human/user, work_type, pe) . = ..() - if(prob(33) && user == gifted_human && pe >= datum_reference?.max_boxes) + if(prob(33) && user == gifted_human) datum_reference.qliphoth_change(1) return @@ -152,17 +160,28 @@ if(istype(gifted_human)) to_chat(gifted_human, span_userdanger("You feel like you are about to burst !")) gifted_human.emote("scream") - gifted_human.gib() + if(KillGifted()) + UnregisterSignal(gifted_human, COMSIG_LIVING_DEATH) + UnregisterSignal(gifted_human, COMSIG_WORK_COMPLETED) else Empower() - UnregisterSignal(gifted_human, COMSIG_LIVING_DEATH) - UnregisterSignal(gifted_human, COMSIG_WORK_COMPLETED) + +/mob/living/simple_animal/hostile/abnormality/melting_love/proc/KillGifted() + var/mob/living/carbon/human/H = gifted_human + H.apply_damage(800, BLACK_DAMAGE, null, H.run_armor_check(null, BLACK_DAMAGE), spread_damage = TRUE) + if(!H || QDELETED(H)) + return TRUE + if(H.stat == DEAD) + H.gib() + return TRUE + H.adjust_attribute_buff(TEMPERANCE_ATTRIBUTE, -30) + H.cut_overlay(mutable_appearance('icons/effects/32x64.dmi', "gift", -HALO_LAYER)) /* Gift */ /mob/living/simple_animal/hostile/abnormality/melting_love/PostWorkEffect(mob/living/carbon/human/user, work_type, pe) if(GODMODE in user.status_flags) return - if(!gifted_human && istype(user) && work_type != ABNORMALITY_WORK_REPRESSION && user.stat != DEAD) + if(!gifted_human && istype(user) && work_type != ABNORMALITY_WORK_REPRESSION && user.stat != DEAD && (status_flags & GODMODE)) gifted_human = user RegisterSignal(user, COMSIG_LIVING_DEATH, PROC_REF(GiftedDeath)) RegisterSignal(user, COMSIG_WORK_COMPLETED, PROC_REF(GiftedAnger)) @@ -245,7 +264,7 @@ melee_damage_upper = 25 rapid_melee = 2 speed = 2 - move_to_delay = 2.5 + move_to_delay = 3 /* Sounds */ death_sound = 'sound/abnormalities/meltinglove/pawn_death.ogg' attack_sound = 'sound/abnormalities/meltinglove/pawn_attack.ogg' @@ -254,6 +273,7 @@ stat_attack = DEAD del_on_death = TRUE var/spawn_sound = 'sound/abnormalities/meltinglove/pawn_convert.ogg' + var/statuschance = 25 /mob/living/simple_animal/hostile/slime/Initialize() . = ..() @@ -276,6 +296,8 @@ var/mob/living/carbon/human/H = target if(H.stat == DEAD || H.health <= HEALTH_THRESHOLD_DEAD) return SlimeConvert(H) + if(prob(statuschance)) + H.apply_status_effect(STATUS_EFFECT_SLIMED) return ..() /mob/living/simple_animal/hostile/slime/proc/SlimeConvert(mob/living/carbon/human/H) @@ -301,3 +323,126 @@ melee_damage_lower = 35 melee_damage_upper = 40 spawn_sound = 'sound/abnormalities/meltinglove/pawn_big_convert.ogg' + statuschance = 75 + +//Slime trails +/obj/effect/decal/cleanable/melty_slime + name = "Slime" + desc = "It looks corrosive." + icon = 'ModularTegustation/Teguicons/tegu_effects.dmi' + icon_state = "melty_slime3" + random_icon_states = list("melty_slime3") + mergeable_decal = TRUE + var/duration = 30 SECONDS + var/state = 3 + var/timer1 + var/timer2 + var/list/slime_types = list( + /mob/living/simple_animal/hostile/abnormality/melting_love, + /mob/living/simple_animal/hostile/slime/big, + /mob/living/simple_animal/hostile/slime + ) + +/obj/effect/decal/cleanable/melty_slime/Initialize(mapload, list/datum/disease/diseases) + . = ..() + START_PROCESSING(SSobj, src) + duration += world.time + timer1 = addtimer(CALLBACK(src, PROC_REF(Reduce)), 10 SECONDS, TIMER_STOPPABLE) + timer2 = addtimer(CALLBACK(src, PROC_REF(Reduce)), 20 SECONDS, TIMER_STOPPABLE) + +/obj/effect/decal/cleanable/melty_slime/proc/Refresh() + icon_state = "melty_slime3" + duration = 30 SECONDS + if(timer1) + deltimer(timer1) + timer1 = null + if(timer2) + deltimer(timer2) + timer2 = null + timer1 = addtimer(CALLBACK(src, PROC_REF(Reduce)), 10 SECONDS, TIMER_STOPPABLE) + timer2 = addtimer(CALLBACK(src, PROC_REF(Reduce)), 20 SECONDS, TIMER_STOPPABLE) + + +/obj/effect/decal/cleanable/melty_slime/proc/Reduce() + state -= 1 + icon_state = "melty_slime[state]" + update_icon() + +/obj/effect/decal/cleanable/melty_slime/process(delta_time) + if(world.time > duration) + Remove() + +/obj/effect/decal/cleanable/melty_slime/proc/Remove() + STOP_PROCESSING(SSobj, src) + animate(src, time = (5 SECONDS), alpha = 0) + QDEL_IN(src, 5 SECONDS) + +/obj/effect/decal/cleanable/melty_slime/proc/streak(list/directions, mapload=FALSE) + set waitfor = FALSE + var/direction = pick(directions) + for(var/i in 0 to pick(0, 200; 1, 150; 2, 50; 3, 17; 50)) //the 3% chance of 50 steps is intentional and played for laughs. + if (!mapload) + sleep(2) + if(!step_to(src, get_step(src, direction), 0)) + break + +/obj/effect/decal/cleanable/melty_slime/Crossed(atom/movable/AM) + . = ..() + if(!isliving(AM)) + return FALSE + if(is_type_in_list(AM, slime_types, FALSE)) + return + var/mob/living/L = AM + L.apply_status_effect(STATUS_EFFECT_SLIMED) + +/obj/effect/gibspawner/generic/silent/melty_slime + gibtypes = list(/obj/effect/decal/cleanable/melty_slime) + gibamounts = list(3) + +/obj/effect/gibspawner/generic/silent/melty_slime/Initialize() + if(!gibdirections.len) + gibdirections = list(list(WEST, NORTHWEST, SOUTHWEST, NORTH)) + . = ..() + return + +/datum/status_effect/melty_slimed + id = "melty_slimed" + status_type = STATUS_EFFECT_REFRESH + alert_type = /atom/movable/screen/alert/status_effect/melty_slimed + duration = 10 SECONDS // Hits 5 times + tick_interval = 2 SECONDS + +/atom/movable/screen/alert/status_effect/melty_slimed + name = "Acidic Goo" + desc = "Slime is stuck to your skin, slowing you down and dealing BLACK damage!" + icon = 'ModularTegustation/Teguicons/status_sprites.dmi' + icon_state = "slimed" + +/datum/status_effect/melty_slimed/tick() + . = ..() + if(!isliving(owner)) + return + var/mob/living/L = owner + L.apply_damage(10, BLACK_DAMAGE, null, L.run_armor_check(null, BLACK_DAMAGE), spread_damage = TRUE) + owner.playsound_local(owner, 'sound/effects/wounds/sizzle2.ogg', 25, TRUE) + if(!ishuman(L)) + return + if((L.sanityhealth <= 0) || (L.health <= 0)) + var/turf/T = get_turf(L) + new /mob/living/simple_animal/hostile/slime(T) + L.gib(TRUE, TRUE, TRUE) + +/datum/status_effect/melty_slimed/on_apply() + owner.add_movespeed_modifier(/datum/movespeed_modifier/slimed) + owner.playsound_local(owner, 'sound/abnormalities/meltinglove/ranged_hit.ogg', 50, TRUE) + return ..() + +/datum/status_effect/melty_slimed/on_remove() + owner.remove_movespeed_modifier(/datum/movespeed_modifier/slimed) + return ..() + +/datum/movespeed_modifier/slimed + multiplicative_slowdown = 1 + variable = FALSE + +#undef STATUS_EFFECT_SLIMED diff --git a/code/modules/paperwork/records/info/aleph.dm b/code/modules/paperwork/records/info/aleph.dm index 265cdc32c3d9..2b5a1c353101 100644 --- a/code/modules/paperwork/records/info/aleph.dm +++ b/code/modules/paperwork/records/info/aleph.dm @@ -88,6 +88,7 @@ "When the work result was Normal, the Qliphoth Counter lowered with a normal probability.", "Melting Love gave a lump of slime to the first employee (D-03-109-1) who performed any work other \than Repression with it. The lump healed D-03-109-1’s SP and improved their Temperance. However, further observation is needed to determine how the lump’s effects change according to the state of Melting Love.", "When D-03-109-1 completed Repression Work, the Qliphoth Counter lowered.", + "When D-03-109-1 completed work on Melting Love, and the work result was Good, the Qliphoth Counter increased by 1 with a low probability.", "The Qliphoth Counter dropped to 0 when D-03-109-1 died.", "NOTICE: D-03-109-1 does not appear to carry any infectious agents.") diff --git a/code/modules/projectiles/projectile/magic/abnormality.dm b/code/modules/projectiles/projectile/magic/abnormality.dm index 518a52638006..d41c9652cf71 100644 --- a/code/modules/projectiles/projectile/magic/abnormality.dm +++ b/code/modules/projectiles/projectile/magic/abnormality.dm @@ -65,6 +65,7 @@ /obj/projectile/melting_blob/on_hit(target) if(isliving(target)) + new /obj/effect/gibspawner/generic/silent/melty_slime(get_turf(target)) var/mob/living/L = target if(L.stat == DEAD && ishuman(L)) var/turf/T = get_turf(L) @@ -74,8 +75,7 @@ return BULLET_ACT_HIT if(!isbot(L)) L.visible_message("[L] is hit by [src], they seem to wither away!") - for(var/i = 1 to 10) - addtimer(CALLBACK(L, TYPE_PROC_REF(/mob/living, apply_damage), rand(4,6), BLACK_DAMAGE, null, L.run_armor_check(null, BLACK_DAMAGE)), 2 SECONDS * i) + L.apply_status_effect(/datum/status_effect/melty_slimed) return BULLET_ACT_HIT return ..()