From e46e0986def2657c9e6f6785393e3a4a900d5db3 Mon Sep 17 00:00:00 2001 From: EgorDinamit Date: Tue, 23 Jan 2024 13:30:30 +0300 Subject: [PATCH] More tweaks & updates --- code/game/machinery/mind_engraver.dm | 36 ++++++- .../items/devices/mind_engraver_chip.dm | 98 +++++++++++++++++++ 2 files changed, 132 insertions(+), 2 deletions(-) diff --git a/code/game/machinery/mind_engraver.dm b/code/game/machinery/mind_engraver.dm index 1486a46e896..5e3da6a3028 100644 --- a/code/game/machinery/mind_engraver.dm +++ b/code/game/machinery/mind_engraver.dm @@ -15,13 +15,15 @@ var/mob/living/carbon/human/occupant = null var/currently_imprinting = FALSE /// How much time it takes to finish a single process - var/imprint_time = 60 SECONDS + var/imprint_time = 80 SECONDS /// World time when imprint process is finished var/imprint_end = 0 /// If TRUE - prevents the user from leaving, unless resisted out of var/locked = FALSE /// When the next breakout attempt can be done var/breakout_cooldown = 0 + /// Base chance on every Process() tick to do random damage + var/mistake_chance = 4 /obj/machinery/mind_engraver/Destroy() GoOut() @@ -42,6 +44,18 @@ return if(world.time < imprint_end) + var/obj/item/organ/external/O_head = occupant.get_organ(BP_HEAD) + if(prob(mistake_chance) && istype(O_head)) + var/choice = pick(1, 2, 3) + switch(choice) + if(1) + O_head.take_external_damage(rand(5, 10), 0, DAM_SHARP|DAM_EDGE) + to_chat(occupant, SPAN_DANGER("\The [src] misplaces a surgical incision, damaging your skin!")) + if(2) + occupant.adjustBrainLoss(rand(5, 15)) + to_chat(occupant, SPAN_DANGER("\The [src]'s laser accidentaly passes over the exposed sections of your head, damaging your brain!")) + if(3) + occupant.custom_pain(SPAN_WARNING("You feel sudden sharp pain in your hea!"), 20, affecting = O_head) return FinishImprint() @@ -137,6 +151,9 @@ var/T = Clamp(total_component_rating_of_type(/obj/item/stock_parts/manipulator), 1, 12) imprint_time = initial(imprint_time) / (T * 0.5) + T = Clamp(total_component_rating_of_type(/obj/item/stock_parts/capacitor), 1, 12) + mistake_chance = max(0, 1 + initial(mistake_chance) - (T * 0.25)) + /obj/machinery/mind_engraver/on_update_icon() if(!occupant) icon_state = "engraver_0" @@ -190,6 +207,21 @@ if(!occupant) return + if(locked) + return + + if(currently_imprinting) + StopImprint() + var/obj/item/organ/external/O_head = occupant.get_organ(BP_HEAD) + if(O_head) + to_chat(occupant, SPAN_DANGER("\The [src]'s tools quickly disengage away from your brain, leaving a terrible tear!")) + occupant.adjustBrainLoss(100) + occupant.custom_pain(SPAN_WARNING("It feels as if your head burst open!"), 50, affecting = O_head) + O_head.take_external_damage(35, 0, DAM_SHARP|DAM_EDGE) + if(!(stat & (NOPOWER|BROKEN))) + visible_message(SPAN_DANGER("\The [src] blares an alarm as its occupant leaves mid-procedure!")) + playsound(src, 'sound/machines/warning-buzzer.ogg', 50, TRUE, 7) + if(occupant.client) occupant.client.eye = occupant.client.mob occupant.client.perspective = MOB_PERSPECTIVE @@ -200,7 +232,7 @@ if(!occupant) return - visible_message(SPAN_DANGER("\The [src] blares an alarm as it loses power and forcefuly ejects the occupant!")) + visible_message(SPAN_DANGER("\The [src] blares an alarm as it loses power[locked ? "" : " and forcefuly ejects the occupant"]!")) playsound(src, 'sound/machines/warning-buzzer.ogg', 50, TRUE, 7) return GoOut() diff --git a/code/game/objects/items/devices/mind_engraver_chip.dm b/code/game/objects/items/devices/mind_engraver_chip.dm index 51e95b05bf2..5a95902bb79 100644 --- a/code/game/objects/items/devices/mind_engraver_chip.dm +++ b/code/game/objects/items/devices/mind_engraver_chip.dm @@ -20,6 +20,30 @@ stored_data = null return ..() +/* Presets */ +/obj/item/mind_engraver_chip/human_languages + name = "mind engraver nanochip - \"Languages of the Humanity\"" + desc = "A relatively big chip with tiny label saying \"Languages of the Humanity\"." + icon_state = "romos2" + stored_data = /datum/engraver_data/language/diplomatic + +/obj/item/mind_engraver_chip/diplomatic_languages + name = "mind engraver nanochip - \"Dominion Diplomacy\"" + desc = "A bigger chip used by Terran Dominion to grant instant knowledge on all languages important to the Diplomatic \ + procedures in the universe." + icon_state = "romos2" + stored_data = /datum/engraver_data/language/diplomatic + +/* Randomized spawns */ +/obj/item/mind_engraver_chip/random_skills + stored_data = /datum/engraver_data/skill/random + +/obj/item/mind_engraver_chip/random_languages + stored_data = /datum/engraver_data/language/random + +/////////// +/* Datum */ +/////////// /datum/engraver_data var/chip_type = "UNKNOWN" @@ -65,6 +89,18 @@ target.skillset.on_levels_change() return TRUE +// Random +/datum/engraver_data/skill/random/New() + . = ..() + var/list/valid_skills = GLOB.skills.Copy() + for(var/i = 1 to rand(1, max_skills_count)) + if(!LAZYLEN(valid_skills)) + return + var/decl/hierarchy/skill/S = pick(valid_skills) + valid_skills -= S + skills |= S.type + +// Presets /datum/engraver_data/skill/max_combat skills = list( SKILL_COMBAT = SKILL_MAX, @@ -84,3 +120,65 @@ SKILL_ANATOMY = SKILL_TRAINED, SKILL_CHEMISTRY = SKILL_TRAINED, ) + +/* Languages */ +/datum/engraver_data/language + chip_type = "Language Imprint" + var/max_language_count = 3 + var/list/languages = list() + +/datum/engraver_data/language/PrintFunction() + if(!LAZYLEN(languages)) + return SPAN_DANGER("MISSING SKILL DATA") + var/func_text = "
" + for(var/lang in languages) + if(!all_languages[lang]) + continue + func_text += " - Imprints professional level knowledge on [lower(lang)] language
" + return func_text + +/datum/engraver_data/language/ApplyEffect(mob/living/carbon/human/target) + if(!..()) + return FALSE + + for(var/lang in languages) + if(!target.add_language(lang)) + continue + to_chat(target, SPAN_NOTICE("You gain professional understanding of [lower(language)] language!")) + + return TRUE + +// Random +/datum/engraver_data/language/random/New() + . = ..() + var/list/valid_languages = all_languages.Copy() + for(var/i = 1 to rand(1, max_language_count)) + if(!LAZYLEN(valid_languages)) + return + var/datum/language/L = pick(valid_languages) + valid_languages -= L + languages |= L.name + +// Presets +/datum/engraver_data/language/humanity/New() + . = ..() + for(var/lang in subtypesof(/datum/language/human)) + languages |= initial(L.name) + +/datum/engraver_data/language/diplomatic + languages = list( + LANGUAGE_COMMON, + LANGUAGE_SPACER, + LANGUAGE_HUMAN_ENGLISH, + LANGUAGE_SKRELLIAN, + LANGUAGE_UNATHI_SINTA, + ) + +/datum/engraver_data/language/english + languages = list(LANGUAGE_HUMAN_ENGLISH) + +/datum/engraver_data/language/skrell + languages = list(LANGUAGE_SKRELLIAN) + +/datum/engraver_data/language/adherent + languages = list(LANGUAGE_ADHERENT)