diff --git a/ModularTegustation/Teguicons/32x48.dmi b/ModularTegustation/Teguicons/32x48.dmi index afbf107c1e3f..8232d380a906 100644 Binary files a/ModularTegustation/Teguicons/32x48.dmi and b/ModularTegustation/Teguicons/32x48.dmi differ diff --git a/ModularTegustation/Teguicons/tegu_effects10x10.dmi b/ModularTegustation/Teguicons/tegu_effects10x10.dmi index bd550c4e98a8..1a886ff3fa90 100644 Binary files a/ModularTegustation/Teguicons/tegu_effects10x10.dmi and b/ModularTegustation/Teguicons/tegu_effects10x10.dmi differ diff --git a/ModularTegustation/Teguicons/wall_markings.dmi b/ModularTegustation/Teguicons/wall_markings.dmi new file mode 100644 index 000000000000..3775fa58ca9e Binary files /dev/null and b/ModularTegustation/Teguicons/wall_markings.dmi differ diff --git a/ModularTegustation/lc13_effects.dm b/ModularTegustation/lc13_effects.dm index bec237115c5a..74e1ce012827 100644 --- a/ModularTegustation/lc13_effects.dm +++ b/ModularTegustation/lc13_effects.dm @@ -61,3 +61,16 @@ return animate(src, alpha = 100, time = 30) addtimer(CALLBACK(src, PROC_REF(StartAnimation)),30) + +//Kikimora Graffiti +/obj/effect/decal/cleanable/crayon/cognito + name = "graffiti" + desc = "strange graffiti. You can almost make out what it says." + icon = 'ModularTegustation/Teguicons/wall_markings.dmi' + icon_state = "gibberish" + anchored = TRUE + var/datum/status_effect/inflicted_effect = /datum/status_effect/display/dyscrasone_withdrawl + +/obj/effect/decal/cleanable/crayon/cognito/ComponentInitialize() + . = ..() + AddComponent(/datum/component/cognitohazard_visual, _cognitohazard_visual_effect=inflicted_effect, obvious=TRUE) diff --git a/code/datums/components/cognitohazard_visual.dm b/code/datums/components/cognitohazard_visual.dm new file mode 100644 index 000000000000..8778a4632638 --- /dev/null +++ b/code/datums/components/cognitohazard_visual.dm @@ -0,0 +1,46 @@ +/datum/component/cognitohazard_visual + dupe_mode = COMPONENT_DUPE_UNIQUE_PASSARGS + var/last_blink = 0 + var/check_every = 20 SECONDS + /// The name of the cognitohazard_visual the player is applying to the parent. + var/datum/status_effect/cognitohazard_visual_effect + +/datum/component/cognitohazard_visual/Initialize(_cognitohazard_visual_effect, obvious = FALSE) + if(!isatom(parent) || !_cognitohazard_visual_effect) + return COMPONENT_INCOMPATIBLE + + cognitohazard_visual_effect = _cognitohazard_visual_effect + + if(obvious) + START_PROCESSING(SSdcs, src) + +/datum/component/cognitohazard_visual/RegisterWithParent() + RegisterSignal(parent, COMSIG_PARENT_EXAMINE, PROC_REF(Examine)) + +/** + This proc will trigger when someone examines the parent. + It will attach the text found in the body of the proc to the `examine_list` and display it to the player examining the parent. + + Arguments: + * source: The parent. + * user: The mob exmaining the parent. + * examine_list: The current list of text getting passed from the parent's normal examine() proc. +*/ +/datum/component/cognitohazard_visual/proc/Examine(datum/source, mob/user, list/examine_list) + SIGNAL_HANDLER + + if(user) + var/mob/living/L = user + L.apply_status_effect(cognitohazard_visual_effect) + +/datum/component/cognitohazard_visual/process() + if(world.time > (last_blink + check_every)) + for(var/mob/living/L in oviewers(4, get_turf(parent))) + if(!L.client) + continue + if(L.stat != CONSCIOUS) + continue + if(L.has_status_effect(cognitohazard_visual_effect)) + continue + L.apply_status_effect(cognitohazard_visual_effect) + to_chat(L, span_smallnotice("Your eye catches some weird detail about [parent].")) diff --git a/code/modules/mob/living/simple_animal/abnormality/teth/kikimora.dm b/code/modules/mob/living/simple_animal/abnormality/teth/kikimora.dm new file mode 100644 index 000000000000..41c9716adc93 --- /dev/null +++ b/code/modules/mob/living/simple_animal/abnormality/teth/kikimora.dm @@ -0,0 +1,113 @@ +/mob/living/simple_animal/hostile/abnormality/kikimora + name = "Kikimora" + desc = "A beaked woman with one leg idly sweeping the floor with a broom." + icon = 'ModularTegustation/Teguicons/32x48.dmi' + icon_state = "kikimora" + icon_living = "kikimora" + icon_dead = "kikimora" + maxHealth = 1300 + health = 1300 + rapid_melee = 1 + melee_queue_distance = 2 + move_to_delay = 3 + damage_coeff = list(BRUTE = 1, RED_DAMAGE = 1, WHITE_DAMAGE = 1, BLACK_DAMAGE = 1.5, PALE_DAMAGE = 2) + threat_level = TETH_LEVEL + start_qliphoth = 2 + work_chances = list( + ABNORMALITY_WORK_INSTINCT = list(60, 60, 50, 50, 50), + ABNORMALITY_WORK_INSIGHT = 50, + ABNORMALITY_WORK_ATTACHMENT = list(50, 50, 40, 40, 40), + ABNORMALITY_WORK_REPRESSION = list(30, 20, 0, -80, -80), + ) + work_damage_amount = 6 + work_damage_type = WHITE_DAMAGE + death_message = "falls over." + ego_list = list( + ) + gift_type = null + +/mob/living/simple_animal/hostile/abnormality/kikimora/ZeroQliphoth(mob/living/carbon/human/user) + . = ..() + if(GLOB.department_centers.len) + var/turf/W = pick(GLOB.department_centers) + W = locate(W.x + rand(1,3), W.y + rand(1,3), W.z) + var/obj/effect/decal/cleanable/crayon/cognito/kikimora/K = new (get_turf(W)) + K.dir = pick(WEST, EAST) + datum_reference.qliphoth_change(2) + +/mob/living/simple_animal/hostile/abnormality/kikimora/examine(mob/user) + . = ..() + if(ishuman(user)) + var/mob/living/carbon/human/H = user + H.apply_status_effect(/datum/status_effect/kikimora) + to_chat(H, span_mind_control("Kikimora.")) + +//Graffiti +/obj/effect/decal/cleanable/crayon/cognito/kikimora + name = "graffiti" + desc = "Kikimora?" + icon_state = "kikimora" + mergeable_decal = TRUE + inflicted_effect = /datum/status_effect/kikimora + +//Status Effect +/datum/status_effect/kikimora + id = "kikimora" + status_type = STATUS_EFFECT_UNIQUE + duration = -1 + alert_type = null + on_remove_on_mob_delete = TRUE + var/words_per_say = 1 + var/static/spread_cooldown = 0 + var/spread_cooldown_delay = 5 SECONDS + var/static/words_taken = list() + +/datum/status_effect/kikimora/on_apply() + . = ..() + RegisterSignal(owner, COMSIG_MOB_SAY, PROC_REF(CorruptWords)) + RegisterSignal(owner, COMSIG_LIVING_STATUS_SLEEP, PROC_REF(Bedtime)) + +/datum/status_effect/kikimora/proc/Bedtime() + SIGNAL_HANDLER + var/turf/T = get_turf(owner) + var/obj/item/food/offering = locate(/obj/item/food) in T + if(offering) + if(!(offering.foodtypes & JUNKFOOD) && !(offering.foodtypes & RAW) && !(offering.foodtypes & GROSS) && !(offering.foodtypes & TOXIC)) + playsound(get_turf(owner),'sound/items/eatfood.ogg', 50, TRUE) + qdel(offering) + qdel(src) + else + to_chat(owner, span_notice("You sense something examined your offering of food.")) + +/datum/status_effect/kikimora/proc/CorruptWords(datum/source, list/speech_args) + SIGNAL_HANDLER + var/words_to_take = words_per_say + var/words_said = 0 + + var/message = speech_args[SPEECH_MESSAGE] + var/list/split_message = splittext(message, " ") //List each word in the message + for (var/i in 1 to length(split_message)) + if(findtext(split_message[i], "*") || findtext(split_message[i], ";") || findtext(split_message[i], ":") || findtext(split_message[i], "kiki") || findtext(split_message[i], "mora")) + continue + var/standardize_text = uppertext(split_message[i]) + if(standardize_text in words_taken) + split_message[i] = pick("kiki", "mora") + //Higher chance of spreading if the user said kiki or mora alot. + words_said++ + continue + //Unsure if this is processor intensive. + if(prob(25) && words_to_take > 0) + words_taken += standardize_text + words_to_take-- + + message = jointext(split_message, " ") + speech_args[SPEECH_MESSAGE] = message + + //Infection Mechanic + if(ishuman(owner)) + var/mob/living/carbon/human/L = owner + if(spread_cooldown <= world.time) + for(var/mob/living/carbon/human/H in hearers(7, L)) + if(prob(5 * words_said)) + H.apply_status_effect(/datum/status_effect/kikimora) + spread_cooldown = world.time + spread_cooldown_delay diff --git a/code/modules/paperwork/records/info/teth.dm b/code/modules/paperwork/records/info/teth.dm index e612fd09e9c4..4adef15f83d0 100644 --- a/code/modules/paperwork/records/info/teth.dm +++ b/code/modules/paperwork/records/info/teth.dm @@ -371,6 +371,20 @@ "When the Qliphoth Counter reached zero, the physical condition of the abnormality improved significantly.", "After its condition improves beyond a certain point, the abnormality will breach containment and travel through the facility on a horizontal path, dealing massive WHITE damage to everything it impacts.") +//Kikimora +/obj/item/paper/fluff/info/teth/kikimora + abno_type = /mob/living/simple_animal/hostile/abnormality/kikimora + abno_code = "F-02-" + abno_info = list( + "Do not closely examine the entity.", + "When F-02- breached, cognitohazardous F-02--02 graffiti appeared in a random appartment.", + "Graffiti can be removed with regular cleaning products or a mop.", + "F-02--02 is a phenomenon that replaces spoken word until the subject is unintelligible.", + "Each time a cursed employee speaks there is a chance a word will be taken by F-02--02.", + "Intances of F-02--02 will share taken words.", + "Curing the F-02--02 requires the host to fall asleep with a offering of food ontop of them.", + "It is considered bad luck if F-02- does not accept the offering.",) + //Dealer of the Damned /obj/item/paper/fluff/info/teth/dealerdamned abno_type = /mob/living/simple_animal/hostile/abnormality/dealerdamned diff --git a/lobotomy-corp13.dme b/lobotomy-corp13.dme index bdae474ab82b..c5c33bf64957 100644 --- a/lobotomy-corp13.dme +++ b/lobotomy-corp13.dme @@ -498,6 +498,7 @@ #include "code\datums\components\bloodysoles.dm" #include "code\datums\components\butchering.dm" #include "code\datums\components\chasm.dm" +#include "code\datums\components\cognitohazard_visual.dm" #include "code\datums\components\construction.dm" #include "code\datums\components\creamed.dm" #include "code\datums\components\customizable_reagent_holder.dm" @@ -2879,6 +2880,7 @@ #include "code\modules\mob\living\simple_animal\abnormality\teth\forsaken_employee.dm" #include "code\modules\mob\living\simple_animal\abnormality\teth\forsaken_murderer.dm" #include "code\modules\mob\living\simple_animal\abnormality\teth\fragment.dm" +#include "code\modules\mob\living\simple_animal\abnormality\teth\kikimora.dm" #include "code\modules\mob\living\simple_animal\abnormality\teth\lady_facing_the_wall.dm" #include "code\modules\mob\living\simple_animal\abnormality\teth\meat_lantern.dm" #include "code\modules\mob\living\simple_animal\abnormality\teth\MHz.dm"