From 31624540ea49326657395c81c85a8acae289f450 Mon Sep 17 00:00:00 2001 From: SuperSlayer <91609255+SuperSlayer0@users.noreply.github.com> Date: Thu, 18 Aug 2022 14:57:52 +0300 Subject: [PATCH 01/19] amogus --- code/__DEFINES/is_helpers.dm | 1 + code/__DEFINES/mobs.dm | 14 ++ code/datums/diseases/_MobProcs.dm | 4 + code/datums/diseases/advance/advance.dm | 7 + .../modules/mob/living/carbon/damage_procs.dm | 2 +- .../mob/living/carbon/human/species.dm | 23 ++- .../human/species_types/preternis/organs.dm | 63 ++++++ .../species_types/preternis/power_suck.dm | 184 ++++++++++++++++++ .../species_types/preternis/preternis.dm | 160 +++++++++++++++ .../species_types/preternis/screen_alerts.dm | 8 + code/modules/surgery/bodyparts/_bodyparts.dm | 5 +- code/modules/surgery/bodyparts/head.dm | 2 +- code/modules/surgery/organs/tongue.dm | 3 +- config/game_options.txt | 1 + tgstation.dme | 4 + 15 files changed, 475 insertions(+), 6 deletions(-) create mode 100644 code/modules/mob/living/carbon/human/species_types/preternis/organs.dm create mode 100644 code/modules/mob/living/carbon/human/species_types/preternis/power_suck.dm create mode 100644 code/modules/mob/living/carbon/human/species_types/preternis/preternis.dm create mode 100644 code/modules/mob/living/carbon/human/species_types/preternis/screen_alerts.dm diff --git a/code/__DEFINES/is_helpers.dm b/code/__DEFINES/is_helpers.dm index 1d133b1af99..ef5426e0115 100644 --- a/code/__DEFINES/is_helpers.dm +++ b/code/__DEFINES/is_helpers.dm @@ -76,6 +76,7 @@ GLOBAL_LIST_INIT(turfs_without_ground, typecacheof(list( #define isdullahan(A) (is_species(A, /datum/species/dullahan)) #define ismonkey(A) (is_species(A, /datum/species/monkey)) #define isandroid(A) (is_species(A, /datum/species/android)) +#define ispreternis(A) (is_species(A, /datum/species/preternis)) //more carbon mobs diff --git a/code/__DEFINES/mobs.dm b/code/__DEFINES/mobs.dm index 54eb27eb2c1..0a90b388aae 100644 --- a/code/__DEFINES/mobs.dm +++ b/code/__DEFINES/mobs.dm @@ -445,3 +445,17 @@ //Saves a proc call, life is suffering. If who has no targets_from var, we assume it's just who #define GET_TARGETS_FROM(who) (who.targets_from ? who.get_targets_from() : who) + +#define PRETERNIS_LEVEL_FULL 550 +#define PRETERNIS_LEVEL_WELL_FED 450 +#define PRETERNIS_LEVEL_FED 350 +#define PRETERNIS_LEVEL_HUNGRY 250 +#define PRETERNIS_LEVEL_STARVING 150 +#define PRETERNIS_LEVEL_NONE 0 + +#define ELECTRICITY_TO_NUTRIMENT_FACTOR 0.44 //1 power unit to 44 preternis charge they can uncharge an apc to 50% at most + +#define PRETERNIS_NV_OFF 2 //numbers of tile they can see +#define PRETERNIS_NV_ON 8 + +#define BODYPART_ANY -1 //use this when healing with something that needs a specefied bodypart type for all diff --git a/code/datums/diseases/_MobProcs.dm b/code/datums/diseases/_MobProcs.dm index e20fb3ba1c9..9da603b4246 100644 --- a/code/datums/diseases/_MobProcs.dm +++ b/code/datums/diseases/_MobProcs.dm @@ -137,6 +137,10 @@ if(HAS_TRAIT(src, TRAIT_VIRUSIMMUNE) && !D.bypasses_immunity) return FALSE + var/infectchance = dna.species ? dna.species.virus_infect_chance : 100 + if(!prob(infectchance)) + return FALSE + for(var/thing in D.required_organs) if(!((locate(thing) in bodyparts) || (locate(thing) in internal_organs))) return FALSE diff --git a/code/datums/diseases/advance/advance.dm b/code/datums/diseases/advance/advance.dm index a62917f82eb..bdac2bfa12a 100644 --- a/code/datums/diseases/advance/advance.dm +++ b/code/datums/diseases/advance/advance.dm @@ -222,6 +222,13 @@ SSdisease.archive_diseases[the_id] = Copy() if(new_name) AssignName() + if(affected_mob?.dna) + var/datum/species/S = affected_mob.dna.species + properties["resistance"] += S.virus_resistance_boost + properties["stealth"] += S.virus_stealth_boost + properties["stage_rate"] += S.virus_stage_rate_boost + properties["transmittable"] += S.virus_transmittable_boost + AssignProperties() //Generate disease properties based on the effects. Returns an associated list. /datum/disease/advance/proc/GenerateProperties() diff --git a/code/modules/mob/living/carbon/damage_procs.dm b/code/modules/mob/living/carbon/damage_procs.dm index 4a77ff1b8c6..c68a17ea955 100644 --- a/code/modules/mob/living/carbon/damage_procs.dm +++ b/code/modules/mob/living/carbon/damage_procs.dm @@ -159,7 +159,7 @@ var/list/obj/item/bodypart/parts = list() for(var/X in bodyparts) var/obj/item/bodypart/BP = X - if(status && (BP.status != status)) + if(!(status == BODYPART_ANY) && (status && (BP.status != status))) continue if((brute && BP.brute_dam) || (burn && BP.burn_dam) || (stamina && BP.stamina_dam)) parts += BP diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index 5f6f1867fd8..6d87f6c0889 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -207,6 +207,17 @@ GLOBAL_LIST_EMPTY(roundstart_races) ///List of visual overlays created by handle_body() var/list/body_vis_overlays = list() + var/draw_robot_hair = FALSE //DAMN ROBOTS STEALING OUR HAIR AND AIR + + ///Chance of a mob with this species to infect with a virus + var/virus_infect_chance = 100 + + ///How big boost to it's propetries gets a disease that infects a mob with this species + var/virus_resistance_boost = 0 + var/virus_stealth_boost = 0 + var/virus_stage_rate_boost = 0 + var/virus_transmittable_boost = 0 + /////////// // PROCS // /////////// @@ -440,6 +451,10 @@ GLOBAL_LIST_EMPTY(roundstart_races) C.add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/species, multiplicative_slowdown=speedmod) + if(draw_robot_hair) + for(var/obj/item/bodypart/BP in C.bodyparts) + BP.draw_robot_hair = TRUE + SEND_SIGNAL(C, COMSIG_SPECIES_GAIN, src, old_species) /** @@ -482,6 +497,9 @@ GLOBAL_LIST_EMPTY(roundstart_races) C.remove_movespeed_modifier(/datum/movespeed_modifier/species) + for(var/obj/item/bodypart/BP in C.bodyparts) + BP.draw_robot_hair = initial(BP.draw_robot_hair) + SEND_SIGNAL(C, COMSIG_SPECIES_LOSS, src) /** @@ -510,7 +528,7 @@ GLOBAL_LIST_EMPTY(roundstart_races) var/dynamic_fhair_suffix = "" //for augmented heads - if(noggin.status == BODYPART_ROBOTIC) + if(noggin.status == BODYPART_ROBOTIC && !draw_robot_hair) return //we check if our hat or helmet hides our facial hair. @@ -1561,6 +1579,9 @@ GLOBAL_LIST_EMPTY(roundstart_races) // called before a projectile hit return 0 +/datum/species/proc/spec_AltClickOn(atom/A,mob/living/carbon/human/H) + return FALSE + ////////////////////////// // ENVIRONMENT HANDLERS // ////////////////////////// diff --git a/code/modules/mob/living/carbon/human/species_types/preternis/organs.dm b/code/modules/mob/living/carbon/human/species_types/preternis/organs.dm new file mode 100644 index 00000000000..017ad3e7c3b --- /dev/null +++ b/code/modules/mob/living/carbon/human/species_types/preternis/organs.dm @@ -0,0 +1,63 @@ +/obj/item/organ/eyes/preternis + name = "preternis eyes" + desc = "An experimental upgraded version of eyes that can see in the dark.They are designed to fit preternis" + see_in_dark = PRETERNIS_NV_ON + lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE + actions_types = list(/datum/action/item_action/organ_action/use) + var/night_vision = TRUE + +/obj/item/organ/eyes/preternis/ui_action_click() + var/datum/species/preternis/S = owner.dna.species + if(S.charge < PRETERNIS_LEVEL_FED) + return + sight_flags = initial(sight_flags) + switch(lighting_alpha) + if (LIGHTING_PLANE_ALPHA_VISIBLE) + lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE + if (LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE) + lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE + if (LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE) + lighting_alpha = LIGHTING_PLANE_ALPHA_INVISIBLE + else + lighting_alpha = LIGHTING_PLANE_ALPHA_VISIBLE + sight_flags &= ~SEE_BLACKNESS + owner.update_sight() + +/obj/item/organ/eyes/preternis/on_life() + . = ..() + if(!ispreternis(owner)) + qdel(src) //these eyes depend on being inside a preternis + + return + var/datum/species/preternis/S = owner.dna.species + if(S.charge >= PRETERNIS_LEVEL_FED) + if(see_in_dark == PRETERNIS_NV_OFF) + see_in_dark = PRETERNIS_NV_ON + owner.update_sight() + else + if(see_in_dark == PRETERNIS_NV_ON) + see_in_dark = PRETERNIS_NV_OFF + owner.update_sight() + if(lighting_alpha < LIGHTING_PLANE_ALPHA_VISIBLE) + lighting_alpha = LIGHTING_PLANE_ALPHA_VISIBLE + sight_flags &= ~SEE_BLACKNESS + owner.update_sight() + +/obj/item/organ/lungs/preternis + name = "preternis lungs" + desc = "An experimental set of lungs. Due to the cybernetic nature of these lungs,they are less resistant to heat and cold but are more efficent at filtering oxygen." + icon_state = "lungs-c" + safe_oxygen_min = 12 + safe_toxins_max = 10 + gas_stimulation_min = 0.1 //fucking filters removing my stimulants + + cold_level_1_threshold = 280 + cold_level_1_damage = 1.5 + cold_level_2_threshold = 260 + cold_level_2_damage = 3 + cold_level_3_threshold = 200 + cold_level_3_damage = 4.5 + + heat_level_1_threshold = 320 + heat_level_2_threshold = 400 + heat_level_3_threshold = 600 //HALP MY LUNGS ARE ON FIRE diff --git a/code/modules/mob/living/carbon/human/species_types/preternis/power_suck.dm b/code/modules/mob/living/carbon/human/species_types/preternis/power_suck.dm new file mode 100644 index 00000000000..65ca0040169 --- /dev/null +++ b/code/modules/mob/living/carbon/human/species_types/preternis/power_suck.dm @@ -0,0 +1,184 @@ +/mob/living/carbon/AltClickOn(atom/A) + dna?.species.spec_AltClickOn(A,src) + return ..() + +/datum/species/preternis/spec_AltClickOn(atom/A,H) + return drain_power_from(H, A) + +/datum/species/preternis/proc/drain_power_from(mob/living/carbon/human/H, atom/A) + if(!istype(H) || !A) + return FALSE + + if(draining) + to_chat(H,"CONSUME protocols can only be used on one object at any single time.") + return FALSE + if(!A.can_consume_power_from()) + return FALSE //if it returns text, we want it to continue so we can get the error message later. + + draining = TRUE + + var/siemens_coefficient = 1 + + if(H.reagents.has_reagent("teslium")) + siemens_coefficient *= 1.5 + + if (charge >= PRETERNIS_LEVEL_FULL - 25) //just to prevent spam a bit + to_chat(H,"CONSUME protocol reports no need for additional power at this time.") + draining = FALSE + return TRUE + + if(H.gloves) + if(!H.gloves.siemens_coefficient) + to_chat(H,"NOTICE: [H.gloves] prevent electrical contact - CONSUME protocol aborted.") + draining = FALSE + return TRUE + else + if(H.gloves.siemens_coefficient < 1) + to_chat(H,"NOTICE: [H.gloves] are interfering with electrical contact - advise removal before activating CONSUME protocol.") + siemens_coefficient *= H.gloves.siemens_coefficient + + H.face_atom(A) + H.visible_message("[H] starts placing their hands on [A]...", "You start placing your hands on [A]...") + if(!do_after(H, 20, target = A)) + to_chat(H,"CONSUME protocol aborted.") + draining = FALSE + return TRUE + + to_chat(H,"Extracutaneous implants detect viable power source. Initiating CONSUME protocol.") + + var/done = FALSE + var/drain = 150 * siemens_coefficient + + var/cycle = 0 + var/datum/effect_system/spark_spread/spark_system = new /datum/effect_system/spark_spread() + spark_system.attach(A) + spark_system.set_up(5, 0, A) + + + + while(!done) + cycle++ + var/nutritionIncrease = drain * ELECTRICITY_TO_NUTRIMENT_FACTOR + + if(charge + nutritionIncrease > PRETERNIS_LEVEL_FULL) + nutritionIncrease = CLAMP(PRETERNIS_LEVEL_FULL - charge, PRETERNIS_LEVEL_NONE,PRETERNIS_LEVEL_FULL) //if their nutrition goes up from some other source, this could be negative, which would cause bad things to happen. + drain = nutritionIncrease/ELECTRICITY_TO_NUTRIMENT_FACTOR + + if (do_after(H,5, target = A)) + var/can_drain = A.can_consume_power_from() + if(!can_drain || istext(can_drain)) + if(istext(can_drain)) + to_chat(H,can_drain) + done = TRUE + else + playsound(A.loc, "sparks", 50, 1) + if(prob(75)) + spark_system.start() + var/drained = A.consume_power_from(drain) + if(drained < drain) + to_chat(H,"[A]'s power has been depleted, CONSUME protocol halted.") + done = TRUE + charge = CLAMP(charge + (drained * ELECTRICITY_TO_NUTRIMENT_FACTOR),PRETERNIS_LEVEL_NONE,PRETERNIS_LEVEL_FULL) + + if(!done) + if(charge > (PRETERNIS_LEVEL_FULL - 25)) + to_chat(H,"CONSUME protocol complete. Physical nourishment refreshed.") + done = TRUE + else if(!(cycle % 4)) + var/nutperc = round((charge / PRETERNIS_LEVEL_FULL) * 100) + to_chat(H,"CONSUME protocol continues. Current satiety level: [nutperc]%.") + else + done = TRUE + qdel(spark_system) + draining = FALSE + return TRUE + +/atom/proc/can_consume_power_from() + return FALSE //if a string is returned, it will evaluate as false and be output to the person draining. + +/atom/proc/consume_power_from(amount) + return FALSE //return the amount that was drained. + +#define MIN_DRAINABLE_POWER 10 + +//CELL// +/obj/item/stock_parts/cell/can_consume_power_from() + if(charge < MIN_DRAINABLE_POWER) + return "Power cell depleted, cannot consume power." + return TRUE + +/obj/item/stock_parts/cell/consume_power_from(amount) + if((charge - amount) < MIN_DRAINABLE_POWER) + amount = max(charge - MIN_DRAINABLE_POWER, 0) + use(amount) + return amount + +//APC// +/obj/machinery/power/apc/can_consume_power_from() + if(!cell) + return "APC cell absent, cannot consume power." + if(stat & BROKEN) + return "APC is damaged, cannot consume power." + if(!operating || shorted) + return "APC main breaker is off, cannot consume power." + if(cell.charge < MIN_DRAINABLE_POWER) + return "APC cell depleted, cannot consume power." + return TRUE + +/obj/machinery/power/apc/consume_power_from(amount) + if((cell.charge - amount) < MIN_DRAINABLE_POWER) + amount = max(cell.charge - MIN_DRAINABLE_POWER, 0) + cell.use(amount) + if(charging == 2) + charging = 0 //if we do not do this here, the APC can get stuck thinking it is fully charged. + update() + return amount + +//SMES// +/obj/machinery/power/smes/can_consume_power_from() + if(stat & BROKEN) + return "SMES is damaged, cannot consume power." + if(!output_attempt) + return "SMES is not outputting power, cannot consume power." + if(charge < MIN_DRAINABLE_POWER) + return "SMES cells depleted, cannot consume power." + return TRUE + +/obj/machinery/power/smes/consume_power_from(amount) + if((charge - amount) < MIN_DRAINABLE_POWER) + amount = max(charge - MIN_DRAINABLE_POWER, 0) + charge -= amount + return amount + +//MECH// +/obj/mecha/can_consume_power_from() + if(!cell) + return "Mech power cell absent, cannot consume power." + if(cell.charge < MIN_DRAINABLE_POWER) + return "Mech power cell depleted, cannot consume power." + return TRUE + +/obj/mecha/consume_power_from(amount) + occupant_message("Warning: Unauthorized access through sub-route 4, block H, detected.") + if((cell.charge - amount) < MIN_DRAINABLE_POWER) + amount = max(cell.charge - MIN_DRAINABLE_POWER, 0) + cell.use(amount) + return amount + +//BORG// +/mob/living/silicon/robot/can_consume_power_from() + if(!cell) + return "Cyborg power cell absent, cannot consume power." + if(cell.charge < MIN_DRAINABLE_POWER) + return "Cyborg power cell depleted, cannot consume power." + return TRUE + +/mob/living/silicon/robot/consume_power_from(amount) + src << "Warning: Unauthorized access through sub-route 12, block C, detected." + if((cell.charge - amount) < MIN_DRAINABLE_POWER) + amount = max(cell.charge - MIN_DRAINABLE_POWER, 0) + cell.use(amount) + return amount + +#undef MIN_DRAINABLE_POWER + diff --git a/code/modules/mob/living/carbon/human/species_types/preternis/preternis.dm b/code/modules/mob/living/carbon/human/species_types/preternis/preternis.dm new file mode 100644 index 00000000000..8cc848501d9 --- /dev/null +++ b/code/modules/mob/living/carbon/human/species_types/preternis/preternis.dm @@ -0,0 +1,160 @@ +/* +procs: +handle_charge - called in spec_life(),handles the alert indicators,the power loss death and decreasing the charge level +adjust_charge - take a positive or negative value to adjust the charge level +*/ + +/datum/species/preternis + name = "Preternis" + id = "preternis" + default_color = "FFFFFF" + changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_PRIDE | MIRROR_MAGIC | RACE_SWAP | ERT_SPAWN | SLIME_EXTRACT + inherent_traits = list(TRAIT_NOHUNGER,TRAIT_RADIMMUNE) + species_traits = list(EYECOLOR,HAIR,LIPS) + say_mod = "intones" + attack_verb = "assault" + meat = null + toxic_food = NONE + brutemod = 1.25 + burnmod = 1.5 + draw_robot_hair = TRUE + mutanteyes = /obj/item/organ/eyes/preternis + mutantlungs = /obj/item/organ/lungs/preternis + yogs_virus_infect_chance = 20 + virus_resistance_boost = 10 //YEOUTCH,good luck getting it out + + var/charge = PRETERNIS_LEVEL_FULL + var/eating_msg_cooldown = FALSE + var/emag_lvl = 0 + var/power_drain = 0.5 //probably going to have to tweak this shit + var/tesliumtrip = FALSE + var/draining = FALSE + + +/datum/species/preternis/on_species_gain(mob/living/carbon/C, datum/species/old_species, pref_load) + . = ..() + for (var/V in C.bodyparts) + var/obj/item/bodypart/BP = V + BP.change_bodypart_status(ORGAN_ROBOTIC,FALSE,TRUE) + BP.burn_reduction = 0 + BP.brute_reduction = 0 + if(istype(BP,/obj/item/bodypart/chest) || istype(BP,/obj/item/bodypart/head)) + continue + BP.max_damage = 35 + C.grant_language(/datum/language/machine) //learn it once,learn it forever i guess,this isnt removed on species loss to prevent curators from forgetting machine language + +/datum/species/preternis/on_species_loss(mob/living/carbon/human/C, datum/species/new_species, pref_load) + . = ..() + for (var/V in C.bodyparts) + var/obj/item/bodypart/BP = V + BP.change_bodypart_status(ORGAN_ORGANIC,FALSE,TRUE) + BP.burn_reduction = initial(BP.burn_reduction) + BP.brute_reduction = initial(BP.brute_reduction) + C.clear_alert("preternis_emag") //this means a changeling can transform from and back to a preternis to clear the emag status but w/e i cant find a solution to not do that + C.clear_fullscreen("preternis_emag") + C.remove_movespeed_modifier("preternis_teslium") + +/datum/species/preternis/spec_emp_act(mob/living/carbon/human/H, severity) + . = ..() + switch(severity) + if(EMP_HEAVY) + H.adjustBruteLoss(20) + H.adjustFireLoss(20) + H.Paralyze(50) + charge *= 0.4 + H.visible_message("Electricity ripples over [H]'s subdermal implants, smoking profusely.", \ + "A surge of searing pain erupts throughout your very being! As the pain subsides, a terrible sensation of emptiness is left in its wake.") + if(EMP_LIGHT) + H.adjustBruteLoss(10) + H.adjustFireLoss(10) + H.Paralyze(20) + charge *= 0.6 + H.visible_message("A faint fizzling emanates from [H].", \ + "A fit of twitching overtakes you as your subdermal implants convulse violently from the electromagnetic disruption. Your sustenance reserves have been partially depleted from the blast.") + +/datum/species/preternis/spec_emag_act(mob/living/carbon/human/H, mob/user) + . = ..() + if(emag_lvl == 2) + return + emag_lvl = min(emag_lvl + 1,2) + playsound(H.loc, 'sound/machines/warning-buzzer.ogg', 50, 1, 1) + H.Paralyze(60) + switch(emag_lvl) + if(1) + H.adjustBrainLoss(50) //HALP AM DUMB + to_chat(H,"ALERT! MEMORY UNIT [rand(1,5)] FAILURE.NERVEOUS SYSTEM DAMAGE.") + if(2) + H.overlay_fullscreen("preternis_emag", /obj/screen/fullscreen/high) + H.throw_alert("preternis_emag", /obj/screen/alert/high/preternis) + to_chat(H,"ALERT! OPTIC SENSORS FAILURE.VISION PROCESSOR COMPROMISED.") + +/datum/species/preternis/handle_chemicals(datum/reagent/chem, mob/living/carbon/human/H) + . = ..() + + if(H.reagents.has_reagent("oil")) + H.adjustFireLoss(-2*REAGENTS_EFFECT_MULTIPLIER,FALSE,FALSE, BODYPART_ANY) + + if(H.reagents.has_reagent("welding_fuel")) + H.adjustFireLoss(-1*REAGENTS_EFFECT_MULTIPLIER,FALSE,FALSE, BODYPART_ANY) + + if(H.reagents.has_reagent("teslium",10)) //10 u otherwise it wont update and they will remain quikk + H.add_movespeed_modifier("preternis_teslium", update=TRUE, priority=101, multiplicative_slowdown=-2, blacklisted_movetypes=(FLYING|FLOATING)) + if(H.health < 50 && H.health > 0) + H.adjustOxyLoss(-1*REAGENTS_EFFECT_MULTIPLIER) + H.adjustBruteLoss(-1*REAGENTS_EFFECT_MULTIPLIER,FALSE,FALSE, BODYPART_ANY) + H.adjustFireLoss(-1*REAGENTS_EFFECT_MULTIPLIER,FALSE,FALSE, BODYPART_ANY) + H.AdjustParalyzed(-3) + H.AdjustStun(-3) + H.AdjustKnockdown(-3) + H.adjustStaminaLoss(-5*REAGENTS_EFFECT_MULTIPLIER) + charge = CLAMP(charge - 10 * REAGENTS_METABOLISM,PRETERNIS_LEVEL_NONE,PRETERNIS_LEVEL_FULL) + burnmod = 200 + tesliumtrip = TRUE + else if(tesliumtrip) + burnmod = initial(burnmod) + tesliumtrip = FALSE + H.remove_movespeed_modifier("preternis_teslium") + + if (istype(chem,/datum/reagent/consumable)) + var/datum/reagent/consumable/food = chem + if (food.nutriment_factor) + var/nutrition = food.nutriment_factor * 0.2 + charge = CLAMP(charge + nutrition,PRETERNIS_LEVEL_NONE,PRETERNIS_LEVEL_FULL) + if (!eating_msg_cooldown) + eating_msg_cooldown = TRUE + addtimer(VARSET_CALLBACK(src, eating_msg_cooldown, FALSE), 2 MINUTES) + to_chat(H,"NOTICE: Digestive subroutines are inefficient. Seek sustenance via power-cell C.O.N.S.U.M.E. technology induction.") + + if(chem.current_cycle >= 20) + H.reagents.del_reagent(chem.id) + + + return FALSE + +/datum/species/preternis/spec_fully_heal(mob/living/carbon/human/H) + . = ..() + charge = PRETERNIS_LEVEL_FULL + emag_lvl = 0 + H.clear_alert("preternis_emag") + H.clear_fullscreen("preternis_emag") + burnmod = initial(burnmod) + tesliumtrip = FALSE + H.remove_movespeed_modifier("preternis_teslium") //full heal removes chems so it wont update the teslium speed up until they eat something + +/datum/species/preternis/spec_life(mob/living/carbon/human/H) + . = ..() + handle_charge(H) + +/datum/species/preternis/proc/handle_charge(mob/living/carbon/human/H) + charge = CLAMP(charge - power_drain,PRETERNIS_LEVEL_NONE,PRETERNIS_LEVEL_FULL) + if(charge == PRETERNIS_LEVEL_NONE) + to_chat(H,"Warning! System power criti-$#@$") + H.death() + else if(charge < PRETERNIS_LEVEL_STARVING) + H.throw_alert("preternis_charge", /obj/screen/alert/preternis_charge, 3) + else if(charge < PRETERNIS_LEVEL_HUNGRY) + H.throw_alert("preternis_charge", /obj/screen/alert/preternis_charge, 2) + else if(charge < PRETERNIS_LEVEL_FED) + H.throw_alert("preternis_charge", /obj/screen/alert/preternis_charge, 1) + else + H.clear_alert("preternis_charge") diff --git a/code/modules/mob/living/carbon/human/species_types/preternis/screen_alerts.dm b/code/modules/mob/living/carbon/human/species_types/preternis/screen_alerts.dm new file mode 100644 index 00000000000..596ecc68177 --- /dev/null +++ b/code/modules/mob/living/carbon/human/species_types/preternis/screen_alerts.dm @@ -0,0 +1,8 @@ +/obj/screen/alert/high/preternis + name = "Optic sensor failure" + desc = "Main unit optic sensors damage detected.Vision processor compromised" + +/obj/screen/alert/preternis_charge + name = "Low power" + desc = "Find a power cell to recharge from or you may lose power." + icon_state = "lowcell" diff --git a/code/modules/surgery/bodyparts/_bodyparts.dm b/code/modules/surgery/bodyparts/_bodyparts.dm index ef1f5b21a8d..cf435ad9242 100644 --- a/code/modules/surgery/bodyparts/_bodyparts.dm +++ b/code/modules/surgery/bodyparts/_bodyparts.dm @@ -100,6 +100,7 @@ var/last_maxed /// How much generic bleedstacks we have on this bodypart var/generic_bleedstacks + var/draw_robot_hair = FALSE /// If we have a gauze wrapping currently applied (not including splints) var/obj/item/stack/current_gauze /// If something is currently grasping this bodypart and trying to staunch bleeding (see [/obj/item/self_grasp]) @@ -228,7 +229,7 @@ if(owner && (owner.status_flags & GODMODE)) return FALSE //godmode - if(required_status && (status != required_status)) + if(!(required_status == -1) && (required_status && (status != required_status))) return FALSE var/dmg_multi = CONFIG_GET(number/damage_multiplier) * hit_percent @@ -505,7 +506,7 @@ //Cannot remove negative damage (i.e. apply damage) /obj/item/bodypart/proc/heal_damage(brute, burn, stamina, required_status, updating_health = TRUE) - if(required_status && status != required_status) //So we can only heal certain kinds of limbs, ie robotic vs organic. + if(!(required_status == BODYPART_ANY) && (required_status && (status != required_status)) ) //So we can only heal certain kinds of limbs, ie robotic vs organic. return if(brute) diff --git a/code/modules/surgery/bodyparts/head.dm b/code/modules/surgery/bodyparts/head.dm index 71d1ed59783..c839c540a3a 100644 --- a/code/modules/surgery/bodyparts/head.dm +++ b/code/modules/surgery/bodyparts/head.dm @@ -103,7 +103,7 @@ /obj/item/bodypart/head/drop_organs(mob/user, violent_removal) var/turf/head_turf = get_turf(src) - if(status != BODYPART_ROBOTIC) + if(status != BODYPART_ROBOTIC || draw_robot_hair) playsound(head_turf, 'sound/misc/splort.ogg', 50, TRUE, -1) for(var/obj/item/head_item in src) if(head_item == brain) diff --git a/code/modules/surgery/organs/tongue.dm b/code/modules/surgery/organs/tongue.dm index 46d857dc550..52c9c0398d6 100644 --- a/code/modules/surgery/organs/tongue.dm +++ b/code/modules/surgery/organs/tongue.dm @@ -28,7 +28,8 @@ /datum/language/sylvan, /datum/language/shadowtongue, /datum/language/terrum, - /datum/language/nekomimetic + /datum/language/nekomimetic, + /datum/language/machine )) /obj/item/organ/tongue/Initialize(mapload) diff --git a/config/game_options.txt b/config/game_options.txt index 5c6cdc06628..8e3b34f4833 100644 --- a/config/game_options.txt +++ b/config/game_options.txt @@ -420,6 +420,7 @@ ROUNDSTART_RACES lizard ROUNDSTART_RACES moth ROUNDSTART_RACES plasmaman #ROUNDSTART_RACES shadow +ROUNDSTART_RACES preternis ## Races that are better than humans in some ways, but worse in others ROUNDSTART_RACES ethereal diff --git a/tgstation.dme b/tgstation.dme index c49cee2d826..c111a0cff2b 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -2759,6 +2759,10 @@ #include "code\modules\mob\living\carbon\human\species_types\humans.dm" #include "code\modules\mob\living\carbon\human\species_types\jellypeople.dm" #include "code\modules\mob\living\carbon\human\species_types\lizardpeople.dm" +#include "code\modules\mob\living\carbon\human\species_types\preternis\organs.dm" +#include "code\modules\mob\living\carbon\human\species_types\preternis\power_suck.dm" +#include "code\modules\mob\living\carbon\human\species_types\preternis\preternis.dm" +#include "code\modules\mob\living\carbon\human\species_types\preternis\screen_alerts.dm" #include "code\modules\mob\living\carbon\human\species_types\monkeys.dm" #include "code\modules\mob\living\carbon\human\species_types\mothmen.dm" #include "code\modules\mob\living\carbon\human\species_types\mushpeople.dm" From 28f75655d4025b355535019ff10feff96713e87b Mon Sep 17 00:00:00 2001 From: SuperSlayer <91609255+SuperSlayer0@users.noreply.github.com> Date: Thu, 18 Aug 2022 15:13:27 +0300 Subject: [PATCH 02/19] --- code/modules/language/language_holder.dm | 6 ++++++ code/modules/mob/living/carbon/damage_procs.dm | 4 ++-- code/modules/mob/living/carbon/human/emote.dm | 2 ++ .../human/species_types/preternis/power_suck.dm | 2 +- .../human/species_types/preternis/preternis.dm | 13 ++++++++----- goon/sound/robot_scream.ogg | Bin 0 -> 34240 bytes 6 files changed, 19 insertions(+), 8 deletions(-) create mode 100644 goon/sound/robot_scream.ogg diff --git a/code/modules/language/language_holder.dm b/code/modules/language/language_holder.dm index 4a524998622..a96991e7082 100644 --- a/code/modules/language/language_holder.dm +++ b/code/modules/language/language_holder.dm @@ -265,6 +265,12 @@ Key procs spoken_languages = list(/datum/language/slime = list(LANGUAGE_ATOM)) blocked_languages = list(/datum/language/common = list(LANGUAGE_ATOM)) +/datum/language_holder/preternis + understood_languages = list(/datum/language/common = list(LANGUAGE_ATOM), + /datum/language/machine = list(LANGUAGE_ATOM),) + spoken_languages = list(/datum/language/common = list(LANGUAGE_ATOM), + /datum/language/machine = list(LANGUAGE_ATOM),) + /datum/language_holder/lizard understood_languages = list(/datum/language/common = list(LANGUAGE_ATOM), /datum/language/draconic = list(LANGUAGE_ATOM)) diff --git a/code/modules/mob/living/carbon/damage_procs.dm b/code/modules/mob/living/carbon/damage_procs.dm index c68a17ea955..e7de845fef1 100644 --- a/code/modules/mob/living/carbon/damage_procs.dm +++ b/code/modules/mob/living/carbon/damage_procs.dm @@ -194,12 +194,12 @@ * It automatically updates health status */ /mob/living/carbon/heal_bodypart_damage(brute = 0, burn = 0, stamina = 0, updating_health = TRUE, required_status) - var/list/obj/item/bodypart/parts = get_damaged_bodyparts(brute,burn,stamina,required_status) + var/list/obj/item/bodypart/parts = get_damaged_bodyparts(brute,burn,stamina,required_status ? required_status : BODYPART_ORGANIC) if(!parts.len) return var/obj/item/bodypart/picked = pick(parts) var/damage_calculator = picked.get_damage(TRUE) //heal_damage returns update status T/F instead of amount healed so we dance gracefully around this - if(picked.heal_damage(brute, burn, stamina, required_status)) + if(picked.heal_damage(brute, burn, stamina, required_status ? required_status : BODYPART_ORGANIC)) update_damage_overlays() return max(damage_calculator - picked.get_damage(TRUE), 0) diff --git a/code/modules/mob/living/carbon/human/emote.dm b/code/modules/mob/living/carbon/human/emote.dm index 8d05212f104..cf96cc4b592 100644 --- a/code/modules/mob/living/carbon/human/emote.dm +++ b/code/modules/mob/living/carbon/human/emote.dm @@ -79,6 +79,8 @@ 'sound/creatures/monkey/monkey_screech_5.ogg', 'sound/creatures/monkey/monkey_screech_6.ogg', 'sound/creatures/monkey/monkey_screech_7.ogg') + else if (ispreternis(H)) + return 'goon/sound/robot_scream.ogg' /datum/emote/living/carbon/human/scream/screech //If a human tries to screech it'll just scream. key = "screech" diff --git a/code/modules/mob/living/carbon/human/species_types/preternis/power_suck.dm b/code/modules/mob/living/carbon/human/species_types/preternis/power_suck.dm index 65ca0040169..50161947921 100644 --- a/code/modules/mob/living/carbon/human/species_types/preternis/power_suck.dm +++ b/code/modules/mob/living/carbon/human/species_types/preternis/power_suck.dm @@ -1,5 +1,5 @@ /mob/living/carbon/AltClickOn(atom/A) - dna?.species.spec_AltClickOn(A,src) + dna?.species.spec_AltClickOn(A,src) return ..() /datum/species/preternis/spec_AltClickOn(atom/A,H) diff --git a/code/modules/mob/living/carbon/human/species_types/preternis/preternis.dm b/code/modules/mob/living/carbon/human/species_types/preternis/preternis.dm index 8cc848501d9..78c9456318e 100644 --- a/code/modules/mob/living/carbon/human/species_types/preternis/preternis.dm +++ b/code/modules/mob/living/carbon/human/species_types/preternis/preternis.dm @@ -13,15 +13,16 @@ adjust_charge - take a positive or negative value to adjust the charge level species_traits = list(EYECOLOR,HAIR,LIPS) say_mod = "intones" attack_verb = "assault" - meat = null + meat = /obj/item/reagent_containers/food/snacks/meat/slab/synthmeat toxic_food = NONE brutemod = 1.25 burnmod = 1.5 draw_robot_hair = TRUE mutanteyes = /obj/item/organ/eyes/preternis mutantlungs = /obj/item/organ/lungs/preternis - yogs_virus_infect_chance = 20 + virus_infect_chance = 20 virus_resistance_boost = 10 //YEOUTCH,good luck getting it out + species_language_holder = /datum/language_holder/preternis var/charge = PRETERNIS_LEVEL_FULL var/eating_msg_cooldown = FALSE @@ -91,13 +92,13 @@ adjust_charge - take a positive or negative value to adjust the charge level /datum/species/preternis/handle_chemicals(datum/reagent/chem, mob/living/carbon/human/H) . = ..() - if(H.reagents.has_reagent("oil")) + if(H.reagents.has_reagent(/datum/reagent/oil)) H.adjustFireLoss(-2*REAGENTS_EFFECT_MULTIPLIER,FALSE,FALSE, BODYPART_ANY) - if(H.reagents.has_reagent("welding_fuel")) + if(H.reagents.has_reagent(/datum/reagent/fuel)) H.adjustFireLoss(-1*REAGENTS_EFFECT_MULTIPLIER,FALSE,FALSE, BODYPART_ANY) - if(H.reagents.has_reagent("teslium",10)) //10 u otherwise it wont update and they will remain quikk + if(H.reagents.has_reagent(/datum/reagent/teslium,10)) //10 u otherwise it wont update and they will remain quikk H.add_movespeed_modifier("preternis_teslium", update=TRUE, priority=101, multiplicative_slowdown=-2, blacklisted_movetypes=(FLYING|FLOATING)) if(H.health < 50 && H.health > 0) H.adjustOxyLoss(-1*REAGENTS_EFFECT_MULTIPLIER) @@ -143,6 +144,8 @@ adjust_charge - take a positive or negative value to adjust the charge level /datum/species/preternis/spec_life(mob/living/carbon/human/H) . = ..() + if(H.stat == DEAD) + return handle_charge(H) /datum/species/preternis/proc/handle_charge(mob/living/carbon/human/H) diff --git a/goon/sound/robot_scream.ogg b/goon/sound/robot_scream.ogg new file mode 100644 index 0000000000000000000000000000000000000000..5db056a7713582dcbf68127b6c955ff4e60d1052 GIT binary patch literal 34240 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 Date: Thu, 18 Aug 2022 15:14:38 +0300 Subject: [PATCH 03/19] aaaaa --- .../living/carbon/human/species_types/preternis/preternis.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/living/carbon/human/species_types/preternis/preternis.dm b/code/modules/mob/living/carbon/human/species_types/preternis/preternis.dm index 78c9456318e..f52d0e3705c 100644 --- a/code/modules/mob/living/carbon/human/species_types/preternis/preternis.dm +++ b/code/modules/mob/living/carbon/human/species_types/preternis/preternis.dm @@ -22,7 +22,7 @@ adjust_charge - take a positive or negative value to adjust the charge level mutantlungs = /obj/item/organ/lungs/preternis virus_infect_chance = 20 virus_resistance_boost = 10 //YEOUTCH,good luck getting it out - species_language_holder = /datum/language_holder/preternis + species_language_holder = /datum/language_holder/preternis var/charge = PRETERNIS_LEVEL_FULL var/eating_msg_cooldown = FALSE From 079236a15323ef428b9e02fa3d3b2c9ad14b4580 Mon Sep 17 00:00:00 2001 From: SuperSlayer <91609255+SuperSlayer0@users.noreply.github.com> Date: Thu, 18 Aug 2022 15:25:16 +0300 Subject: [PATCH 04/19] --- .../species_types/preternis/power_suck.dm | 4 ++-- .../species_types/preternis/preternis.dm | 24 +++++++++---------- .../species_types/preternis/screen_alerts.dm | 4 ++-- code/modules/movespeed/modifiers/reagent.dm | 4 ++++ 4 files changed, 20 insertions(+), 16 deletions(-) diff --git a/code/modules/mob/living/carbon/human/species_types/preternis/power_suck.dm b/code/modules/mob/living/carbon/human/species_types/preternis/power_suck.dm index 50161947921..fe297f47bf4 100644 --- a/code/modules/mob/living/carbon/human/species_types/preternis/power_suck.dm +++ b/code/modules/mob/living/carbon/human/species_types/preternis/power_suck.dm @@ -61,7 +61,7 @@ var/nutritionIncrease = drain * ELECTRICITY_TO_NUTRIMENT_FACTOR if(charge + nutritionIncrease > PRETERNIS_LEVEL_FULL) - nutritionIncrease = CLAMP(PRETERNIS_LEVEL_FULL - charge, PRETERNIS_LEVEL_NONE,PRETERNIS_LEVEL_FULL) //if their nutrition goes up from some other source, this could be negative, which would cause bad things to happen. + nutritionIncrease = clamp(PRETERNIS_LEVEL_FULL - charge, PRETERNIS_LEVEL_NONE,PRETERNIS_LEVEL_FULL) //if their nutrition goes up from some other source, this could be negative, which would cause bad things to happen. drain = nutritionIncrease/ELECTRICITY_TO_NUTRIMENT_FACTOR if (do_after(H,5, target = A)) @@ -78,7 +78,7 @@ if(drained < drain) to_chat(H,"[A]'s power has been depleted, CONSUME protocol halted.") done = TRUE - charge = CLAMP(charge + (drained * ELECTRICITY_TO_NUTRIMENT_FACTOR),PRETERNIS_LEVEL_NONE,PRETERNIS_LEVEL_FULL) + charge = clamp(charge + (drained * ELECTRICITY_TO_NUTRIMENT_FACTOR),PRETERNIS_LEVEL_NONE,PRETERNIS_LEVEL_FULL) if(!done) if(charge > (PRETERNIS_LEVEL_FULL - 25)) diff --git a/code/modules/mob/living/carbon/human/species_types/preternis/preternis.dm b/code/modules/mob/living/carbon/human/species_types/preternis/preternis.dm index f52d0e3705c..6db2f385942 100644 --- a/code/modules/mob/living/carbon/human/species_types/preternis/preternis.dm +++ b/code/modules/mob/living/carbon/human/species_types/preternis/preternis.dm @@ -13,7 +13,7 @@ adjust_charge - take a positive or negative value to adjust the charge level species_traits = list(EYECOLOR,HAIR,LIPS) say_mod = "intones" attack_verb = "assault" - meat = /obj/item/reagent_containers/food/snacks/meat/slab/synthmeat + meat = /obj/item/food/meat/slab/synthmeat toxic_food = NONE brutemod = 1.25 burnmod = 1.5 @@ -53,7 +53,7 @@ adjust_charge - take a positive or negative value to adjust the charge level BP.brute_reduction = initial(BP.brute_reduction) C.clear_alert("preternis_emag") //this means a changeling can transform from and back to a preternis to clear the emag status but w/e i cant find a solution to not do that C.clear_fullscreen("preternis_emag") - C.remove_movespeed_modifier("preternis_teslium") + C.remove_movespeed_modifier(/datum/movespeed_modifier/reagent/preternis_teslium, TRUE) /datum/species/preternis/spec_emp_act(mob/living/carbon/human/H, severity) . = ..() @@ -85,8 +85,8 @@ adjust_charge - take a positive or negative value to adjust the charge level H.adjustBrainLoss(50) //HALP AM DUMB to_chat(H,"ALERT! MEMORY UNIT [rand(1,5)] FAILURE.NERVEOUS SYSTEM DAMAGE.") if(2) - H.overlay_fullscreen("preternis_emag", /obj/screen/fullscreen/high) - H.throw_alert("preternis_emag", /obj/screen/alert/high/preternis) + H.overlay_fullscreen("preternis_emag", /atom/movable/screen/fullscreen/high) + H.throw_alert("preternis_emag", /atom/movable/screen/alert/high/preternis) to_chat(H,"ALERT! OPTIC SENSORS FAILURE.VISION PROCESSOR COMPROMISED.") /datum/species/preternis/handle_chemicals(datum/reagent/chem, mob/living/carbon/human/H) @@ -99,7 +99,7 @@ adjust_charge - take a positive or negative value to adjust the charge level H.adjustFireLoss(-1*REAGENTS_EFFECT_MULTIPLIER,FALSE,FALSE, BODYPART_ANY) if(H.reagents.has_reagent(/datum/reagent/teslium,10)) //10 u otherwise it wont update and they will remain quikk - H.add_movespeed_modifier("preternis_teslium", update=TRUE, priority=101, multiplicative_slowdown=-2, blacklisted_movetypes=(FLYING|FLOATING)) + H.add_movespeed_modifier(/datum/movespeed_modifier/reagent/preternis_teslium, TRUE) if(H.health < 50 && H.health > 0) H.adjustOxyLoss(-1*REAGENTS_EFFECT_MULTIPLIER) H.adjustBruteLoss(-1*REAGENTS_EFFECT_MULTIPLIER,FALSE,FALSE, BODYPART_ANY) @@ -108,19 +108,19 @@ adjust_charge - take a positive or negative value to adjust the charge level H.AdjustStun(-3) H.AdjustKnockdown(-3) H.adjustStaminaLoss(-5*REAGENTS_EFFECT_MULTIPLIER) - charge = CLAMP(charge - 10 * REAGENTS_METABOLISM,PRETERNIS_LEVEL_NONE,PRETERNIS_LEVEL_FULL) + charge = clamp(charge - 10 * REAGENTS_METABOLISM,PRETERNIS_LEVEL_NONE,PRETERNIS_LEVEL_FULL) burnmod = 200 tesliumtrip = TRUE else if(tesliumtrip) burnmod = initial(burnmod) tesliumtrip = FALSE - H.remove_movespeed_modifier("preternis_teslium") + H.remove_movespeed_modifier(/datum/movespeed_modifier/reagent/preternis_teslium, TRUE) if (istype(chem,/datum/reagent/consumable)) var/datum/reagent/consumable/food = chem if (food.nutriment_factor) var/nutrition = food.nutriment_factor * 0.2 - charge = CLAMP(charge + nutrition,PRETERNIS_LEVEL_NONE,PRETERNIS_LEVEL_FULL) + charge = clamp(charge + nutrition,PRETERNIS_LEVEL_NONE,PRETERNIS_LEVEL_FULL) if (!eating_msg_cooldown) eating_msg_cooldown = TRUE addtimer(VARSET_CALLBACK(src, eating_msg_cooldown, FALSE), 2 MINUTES) @@ -149,15 +149,15 @@ adjust_charge - take a positive or negative value to adjust the charge level handle_charge(H) /datum/species/preternis/proc/handle_charge(mob/living/carbon/human/H) - charge = CLAMP(charge - power_drain,PRETERNIS_LEVEL_NONE,PRETERNIS_LEVEL_FULL) + charge = clamp(charge - power_drain,PRETERNIS_LEVEL_NONE,PRETERNIS_LEVEL_FULL) if(charge == PRETERNIS_LEVEL_NONE) to_chat(H,"Warning! System power criti-$#@$") H.death() else if(charge < PRETERNIS_LEVEL_STARVING) - H.throw_alert("preternis_charge", /obj/screen/alert/preternis_charge, 3) + H.throw_alert("preternis_charge", /atom/movable/screen/alert/preternis_charge, 3) else if(charge < PRETERNIS_LEVEL_HUNGRY) - H.throw_alert("preternis_charge", /obj/screen/alert/preternis_charge, 2) + H.throw_alert("preternis_charge", /atom/movable/screen/alert/preternis_charge, 2) else if(charge < PRETERNIS_LEVEL_FED) - H.throw_alert("preternis_charge", /obj/screen/alert/preternis_charge, 1) + H.throw_alert("preternis_charge", /atom/movable/screen/alert/preternis_charge, 1) else H.clear_alert("preternis_charge") diff --git a/code/modules/mob/living/carbon/human/species_types/preternis/screen_alerts.dm b/code/modules/mob/living/carbon/human/species_types/preternis/screen_alerts.dm index 596ecc68177..73950fe0adc 100644 --- a/code/modules/mob/living/carbon/human/species_types/preternis/screen_alerts.dm +++ b/code/modules/mob/living/carbon/human/species_types/preternis/screen_alerts.dm @@ -1,8 +1,8 @@ -/obj/screen/alert/high/preternis +/atom/movable/screen/alert/high/preternis name = "Optic sensor failure" desc = "Main unit optic sensors damage detected.Vision processor compromised" -/obj/screen/alert/preternis_charge +/atom/movable/screen/alert/preternis_charge name = "Low power" desc = "Find a power cell to recharge from or you may lose power." icon_state = "lowcell" diff --git a/code/modules/movespeed/modifiers/reagent.dm b/code/modules/movespeed/modifiers/reagent.dm index ac2f3cdd4c9..b2a1f9d6016 100644 --- a/code/modules/movespeed/modifiers/reagent.dm +++ b/code/modules/movespeed/modifiers/reagent.dm @@ -39,3 +39,7 @@ /datum/movespeed_modifier/reagent/nooartrium multiplicative_slowdown = 2 + +/datum/movespeed_modifier/reagent/preternis_teslium + multiplicative_slowdown = -2 + priority = 101 From 1120e65e558bdcceed940cea82caea6454dc47df Mon Sep 17 00:00:00 2001 From: SuperSlayer <91609255+SuperSlayer0@users.noreply.github.com> Date: Thu, 18 Aug 2022 15:31:23 +0300 Subject: [PATCH 05/19] sex --- .../human/species_types/preternis/power_suck.dm | 8 ++++---- .../human/species_types/preternis/preternis.dm | 16 ++++++++++------ 2 files changed, 14 insertions(+), 10 deletions(-) diff --git a/code/modules/mob/living/carbon/human/species_types/preternis/power_suck.dm b/code/modules/mob/living/carbon/human/species_types/preternis/power_suck.dm index fe297f47bf4..120923f4bef 100644 --- a/code/modules/mob/living/carbon/human/species_types/preternis/power_suck.dm +++ b/code/modules/mob/living/carbon/human/species_types/preternis/power_suck.dm @@ -117,7 +117,7 @@ /obj/machinery/power/apc/can_consume_power_from() if(!cell) return "APC cell absent, cannot consume power." - if(stat & BROKEN) + if(machine_stat & BROKEN) return "APC is damaged, cannot consume power." if(!operating || shorted) return "APC main breaker is off, cannot consume power." @@ -136,7 +136,7 @@ //SMES// /obj/machinery/power/smes/can_consume_power_from() - if(stat & BROKEN) + if(machine_stat & BROKEN) return "SMES is damaged, cannot consume power." if(!output_attempt) return "SMES is not outputting power, cannot consume power." @@ -151,14 +151,14 @@ return amount //MECH// -/obj/mecha/can_consume_power_from() +/obj/vehicle/sealed/mecha/can_consume_power_from() if(!cell) return "Mech power cell absent, cannot consume power." if(cell.charge < MIN_DRAINABLE_POWER) return "Mech power cell depleted, cannot consume power." return TRUE -/obj/mecha/consume_power_from(amount) +/obj/vehicle/sealed/mecha/consume_power_from(amount) occupant_message("Warning: Unauthorized access through sub-route 4, block H, detected.") if((cell.charge - amount) < MIN_DRAINABLE_POWER) amount = max(cell.charge - MIN_DRAINABLE_POWER, 0) diff --git a/code/modules/mob/living/carbon/human/species_types/preternis/preternis.dm b/code/modules/mob/living/carbon/human/species_types/preternis/preternis.dm index 6db2f385942..f87fbcffbaf 100644 --- a/code/modules/mob/living/carbon/human/species_types/preternis/preternis.dm +++ b/code/modules/mob/living/carbon/human/species_types/preternis/preternis.dm @@ -34,6 +34,8 @@ adjust_charge - take a positive or negative value to adjust the charge level /datum/species/preternis/on_species_gain(mob/living/carbon/C, datum/species/old_species, pref_load) . = ..() + RegisterSignal(C, COMSIG_ATOM_EMAG_ACT, .proc/on_emag_act) + RegisterSignal(C, COMSIG_ATOM_EMP_ACT, .proc/on_emp_act) for (var/V in C.bodyparts) var/obj/item/bodypart/BP = V BP.change_bodypart_status(ORGAN_ROBOTIC,FALSE,TRUE) @@ -46,6 +48,8 @@ adjust_charge - take a positive or negative value to adjust the charge level /datum/species/preternis/on_species_loss(mob/living/carbon/human/C, datum/species/new_species, pref_load) . = ..() + UnregisterSignal(C, COMSIG_ATOM_EMAG_ACT) + UnregisterSignal(C, COMSIG_ATOM_EMP_ACT) for (var/V in C.bodyparts) var/obj/item/bodypart/BP = V BP.change_bodypart_status(ORGAN_ORGANIC,FALSE,TRUE) @@ -55,8 +59,8 @@ adjust_charge - take a positive or negative value to adjust the charge level C.clear_fullscreen("preternis_emag") C.remove_movespeed_modifier(/datum/movespeed_modifier/reagent/preternis_teslium, TRUE) -/datum/species/preternis/spec_emp_act(mob/living/carbon/human/H, severity) - . = ..() +/datum/species/preternis/proc/on_emp_act(mob/living/carbon/human/H, severity) + SIGNAL_HANDLER switch(severity) if(EMP_HEAVY) H.adjustBruteLoss(20) @@ -73,8 +77,8 @@ adjust_charge - take a positive or negative value to adjust the charge level H.visible_message("A faint fizzling emanates from [H].", \ "A fit of twitching overtakes you as your subdermal implants convulse violently from the electromagnetic disruption. Your sustenance reserves have been partially depleted from the blast.") -/datum/species/preternis/spec_emag_act(mob/living/carbon/human/H, mob/user) - . = ..() +/datum/species/preternis/proc/on_emag_act(mob/living/carbon/human/H, mob/user) + SIGNAL_HANDLER if(emag_lvl == 2) return emag_lvl = min(emag_lvl + 1,2) @@ -92,7 +96,7 @@ adjust_charge - take a positive or negative value to adjust the charge level /datum/species/preternis/handle_chemicals(datum/reagent/chem, mob/living/carbon/human/H) . = ..() - if(H.reagents.has_reagent(/datum/reagent/oil)) + if(H.reagents.has_reagent(/datum/reagent/fuel/oil)) H.adjustFireLoss(-2*REAGENTS_EFFECT_MULTIPLIER,FALSE,FALSE, BODYPART_ANY) if(H.reagents.has_reagent(/datum/reagent/fuel)) @@ -127,7 +131,7 @@ adjust_charge - take a positive or negative value to adjust the charge level to_chat(H,"NOTICE: Digestive subroutines are inefficient. Seek sustenance via power-cell C.O.N.S.U.M.E. technology induction.") if(chem.current_cycle >= 20) - H.reagents.del_reagent(chem.id) + H.reagents.del_reagent(chem.type) return FALSE From 61997250c7d3e373ce9c318956d1aa6795daf2f1 Mon Sep 17 00:00:00 2001 From: SuperSlayer <91609255+SuperSlayer0@users.noreply.github.com> Date: Thu, 18 Aug 2022 15:39:08 +0300 Subject: [PATCH 06/19] fix --- .../living/carbon/human/species_types/preternis/power_suck.dm | 2 +- .../living/carbon/human/species_types/preternis/preternis.dm | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/mob/living/carbon/human/species_types/preternis/power_suck.dm b/code/modules/mob/living/carbon/human/species_types/preternis/power_suck.dm index 120923f4bef..d96c6a1b354 100644 --- a/code/modules/mob/living/carbon/human/species_types/preternis/power_suck.dm +++ b/code/modules/mob/living/carbon/human/species_types/preternis/power_suck.dm @@ -159,7 +159,7 @@ return TRUE /obj/vehicle/sealed/mecha/consume_power_from(amount) - occupant_message("Warning: Unauthorized access through sub-route 4, block H, detected.") + to_chat(occupants,"Warning: Unauthorized access through sub-route 4, block H, detected.") if((cell.charge - amount) < MIN_DRAINABLE_POWER) amount = max(cell.charge - MIN_DRAINABLE_POWER, 0) cell.use(amount) diff --git a/code/modules/mob/living/carbon/human/species_types/preternis/preternis.dm b/code/modules/mob/living/carbon/human/species_types/preternis/preternis.dm index f87fbcffbaf..38338e01ba8 100644 --- a/code/modules/mob/living/carbon/human/species_types/preternis/preternis.dm +++ b/code/modules/mob/living/carbon/human/species_types/preternis/preternis.dm @@ -86,7 +86,7 @@ adjust_charge - take a positive or negative value to adjust the charge level H.Paralyze(60) switch(emag_lvl) if(1) - H.adjustBrainLoss(50) //HALP AM DUMB + H.adjustOrganLoss(ORGAN_SLOT_BRAIN, 50) //HALP AM DUMB to_chat(H,"ALERT! MEMORY UNIT [rand(1,5)] FAILURE.NERVEOUS SYSTEM DAMAGE.") if(2) H.overlay_fullscreen("preternis_emag", /atom/movable/screen/fullscreen/high) From 7d1e76744c61c7829d28eb9646cd8b0553ce896b Mon Sep 17 00:00:00 2001 From: SuperSlayer <91609255+SuperSlayer0@users.noreply.github.com> Date: Thu, 18 Aug 2022 15:47:44 +0300 Subject: [PATCH 07/19] span defines --- .../species_types/preternis/power_suck.dm | 48 +++++++++---------- .../species_types/preternis/preternis.dm | 16 +++---- 2 files changed, 32 insertions(+), 32 deletions(-) diff --git a/code/modules/mob/living/carbon/human/species_types/preternis/power_suck.dm b/code/modules/mob/living/carbon/human/species_types/preternis/power_suck.dm index d96c6a1b354..d044cfedc43 100644 --- a/code/modules/mob/living/carbon/human/species_types/preternis/power_suck.dm +++ b/code/modules/mob/living/carbon/human/species_types/preternis/power_suck.dm @@ -10,7 +10,7 @@ return FALSE if(draining) - to_chat(H,"CONSUME protocols can only be used on one object at any single time.") + to_chat(H,span_info("CONSUME protocols can only be used on one object at any single time.")) return FALSE if(!A.can_consume_power_from()) return FALSE //if it returns text, we want it to continue so we can get the error message later. @@ -23,28 +23,28 @@ siemens_coefficient *= 1.5 if (charge >= PRETERNIS_LEVEL_FULL - 25) //just to prevent spam a bit - to_chat(H,"CONSUME protocol reports no need for additional power at this time.") + to_chat(H,span_notice("CONSUME protocol reports no need for additional power at this time.")) draining = FALSE return TRUE if(H.gloves) if(!H.gloves.siemens_coefficient) - to_chat(H,"NOTICE: [H.gloves] prevent electrical contact - CONSUME protocol aborted.") + to_chat(H, span_info("NOTICE: [H.gloves] prevent electrical contact - CONSUME protocol aborted.")) draining = FALSE return TRUE else if(H.gloves.siemens_coefficient < 1) - to_chat(H,"NOTICE: [H.gloves] are interfering with electrical contact - advise removal before activating CONSUME protocol.") + to_chat(H, span_info("NOTICE: [H.gloves] are interfering with electrical contact - advise removal before activating CONSUME protocol.")) siemens_coefficient *= H.gloves.siemens_coefficient H.face_atom(A) - H.visible_message("[H] starts placing their hands on [A]...", "You start placing your hands on [A]...") + H.visible_message(span_warning("[H] starts placing their hands on [A]..."), span_warning("You start placing your hands on [A]...")) if(!do_after(H, 20, target = A)) - to_chat(H,"CONSUME protocol aborted.") + to_chat(H, span_info("CONSUME protocol aborted.")) draining = FALSE return TRUE - to_chat(H,"Extracutaneous implants detect viable power source. Initiating CONSUME protocol.") + to_chat(H, span_info("Extracutaneous implants detect viable power source. Initiating CONSUME protocol.")) var/done = FALSE var/drain = 150 * siemens_coefficient @@ -76,17 +76,17 @@ spark_system.start() var/drained = A.consume_power_from(drain) if(drained < drain) - to_chat(H,"[A]'s power has been depleted, CONSUME protocol halted.") + to_chat(H,span_info("[A]'s power has been depleted, CONSUME protocol halted.")) done = TRUE charge = clamp(charge + (drained * ELECTRICITY_TO_NUTRIMENT_FACTOR),PRETERNIS_LEVEL_NONE,PRETERNIS_LEVEL_FULL) if(!done) if(charge > (PRETERNIS_LEVEL_FULL - 25)) - to_chat(H,"CONSUME protocol complete. Physical nourishment refreshed.") + to_chat(H,span_info("CONSUME protocol complete. Physical nourishment refreshed.")) done = TRUE else if(!(cycle % 4)) var/nutperc = round((charge / PRETERNIS_LEVEL_FULL) * 100) - to_chat(H,"CONSUME protocol continues. Current satiety level: [nutperc]%.") + to_chat(H,span_info("CONSUME protocol continues. Current satiety level: [nutperc]%.")) else done = TRUE qdel(spark_system) @@ -104,7 +104,7 @@ //CELL// /obj/item/stock_parts/cell/can_consume_power_from() if(charge < MIN_DRAINABLE_POWER) - return "Power cell depleted, cannot consume power." + return span_info("Power cell depleted, cannot consume power.") return TRUE /obj/item/stock_parts/cell/consume_power_from(amount) @@ -116,13 +116,13 @@ //APC// /obj/machinery/power/apc/can_consume_power_from() if(!cell) - return "APC cell absent, cannot consume power." + return span_info("APC cell absent, cannot consume power.") if(machine_stat & BROKEN) - return "APC is damaged, cannot consume power." + return span_info("APC is damaged, cannot consume power.") if(!operating || shorted) - return "APC main breaker is off, cannot consume power." + return span_info("APC main breaker is off, cannot consume power.") if(cell.charge < MIN_DRAINABLE_POWER) - return "APC cell depleted, cannot consume power." + return span_info("APC cell depleted, cannot consume power.") return TRUE /obj/machinery/power/apc/consume_power_from(amount) @@ -137,11 +137,11 @@ //SMES// /obj/machinery/power/smes/can_consume_power_from() if(machine_stat & BROKEN) - return "SMES is damaged, cannot consume power." + return span_info("SMES is damaged, cannot consume power.") if(!output_attempt) - return "SMES is not outputting power, cannot consume power." + return span_info("SMES is not outputting power, cannot consume power.") if(charge < MIN_DRAINABLE_POWER) - return "SMES cells depleted, cannot consume power." + return span_info("SMES cells depleted, cannot consume power.") return TRUE /obj/machinery/power/smes/consume_power_from(amount) @@ -153,13 +153,13 @@ //MECH// /obj/vehicle/sealed/mecha/can_consume_power_from() if(!cell) - return "Mech power cell absent, cannot consume power." + return span_info("Mech power cell absent, cannot consume power.") if(cell.charge < MIN_DRAINABLE_POWER) - return "Mech power cell depleted, cannot consume power." + return span_info("Mech power cell depleted, cannot consume power.") return TRUE /obj/vehicle/sealed/mecha/consume_power_from(amount) - to_chat(occupants,"Warning: Unauthorized access through sub-route 4, block H, detected.") + to_chat(occupants,span_danger("Warning: Unauthorized access through sub-route 4, block H, detected.")) if((cell.charge - amount) < MIN_DRAINABLE_POWER) amount = max(cell.charge - MIN_DRAINABLE_POWER, 0) cell.use(amount) @@ -168,13 +168,13 @@ //BORG// /mob/living/silicon/robot/can_consume_power_from() if(!cell) - return "Cyborg power cell absent, cannot consume power." + return span_info("Cyborg power cell absent, cannot consume power.") if(cell.charge < MIN_DRAINABLE_POWER) - return "Cyborg power cell depleted, cannot consume power." + return span_info("Cyborg power cell depleted, cannot consume power.") return TRUE /mob/living/silicon/robot/consume_power_from(amount) - src << "Warning: Unauthorized access through sub-route 12, block C, detected." + to_chat(src,span_danger("Warning: Unauthorized access through sub-route 12, block C, detected.")) if((cell.charge - amount) < MIN_DRAINABLE_POWER) amount = max(cell.charge - MIN_DRAINABLE_POWER, 0) cell.use(amount) diff --git a/code/modules/mob/living/carbon/human/species_types/preternis/preternis.dm b/code/modules/mob/living/carbon/human/species_types/preternis/preternis.dm index 38338e01ba8..8c35d4a089a 100644 --- a/code/modules/mob/living/carbon/human/species_types/preternis/preternis.dm +++ b/code/modules/mob/living/carbon/human/species_types/preternis/preternis.dm @@ -67,15 +67,15 @@ adjust_charge - take a positive or negative value to adjust the charge level H.adjustFireLoss(20) H.Paralyze(50) charge *= 0.4 - H.visible_message("Electricity ripples over [H]'s subdermal implants, smoking profusely.", \ - "A surge of searing pain erupts throughout your very being! As the pain subsides, a terrible sensation of emptiness is left in its wake.") + H.visible_message(span_danger("Electricity ripples over [H]'s subdermal implants, smoking profusely."), \ + span_userdanger(">A surge of searing pain erupts throughout your very being! As the pain subsides, a terrible sensation of emptiness is left in its wake.")) if(EMP_LIGHT) H.adjustBruteLoss(10) H.adjustFireLoss(10) H.Paralyze(20) charge *= 0.6 - H.visible_message("A faint fizzling emanates from [H].", \ - "A fit of twitching overtakes you as your subdermal implants convulse violently from the electromagnetic disruption. Your sustenance reserves have been partially depleted from the blast.") + H.visible_message(span_danger("A faint fizzling emanates from [H]."), \ + span_userdanger("A fit of twitching overtakes you as your subdermal implants convulse violently from the electromagnetic disruption. Your sustenance reserves have been partially depleted from the blast.")) /datum/species/preternis/proc/on_emag_act(mob/living/carbon/human/H, mob/user) SIGNAL_HANDLER @@ -87,11 +87,11 @@ adjust_charge - take a positive or negative value to adjust the charge level switch(emag_lvl) if(1) H.adjustOrganLoss(ORGAN_SLOT_BRAIN, 50) //HALP AM DUMB - to_chat(H,"ALERT! MEMORY UNIT [rand(1,5)] FAILURE.NERVEOUS SYSTEM DAMAGE.") + to_chat(H,span_danger("ALERT! MEMORY UNIT [rand(1,5)] FAILURE.NERVEOUS SYSTEM DAMAGE.")) if(2) H.overlay_fullscreen("preternis_emag", /atom/movable/screen/fullscreen/high) H.throw_alert("preternis_emag", /atom/movable/screen/alert/high/preternis) - to_chat(H,"ALERT! OPTIC SENSORS FAILURE.VISION PROCESSOR COMPROMISED.") + to_chat(H,span_danger("ALERT! OPTIC SENSORS FAILURE.VISION PROCESSOR COMPROMISED.")) /datum/species/preternis/handle_chemicals(datum/reagent/chem, mob/living/carbon/human/H) . = ..() @@ -128,7 +128,7 @@ adjust_charge - take a positive or negative value to adjust the charge level if (!eating_msg_cooldown) eating_msg_cooldown = TRUE addtimer(VARSET_CALLBACK(src, eating_msg_cooldown, FALSE), 2 MINUTES) - to_chat(H,"NOTICE: Digestive subroutines are inefficient. Seek sustenance via power-cell C.O.N.S.U.M.E. technology induction.") + to_chat(H,span_info("NOTICE: Digestive subroutines are inefficient. Seek sustenance via power-cell C.O.N.S.U.M.E. technology induction.")) if(chem.current_cycle >= 20) H.reagents.del_reagent(chem.type) @@ -155,7 +155,7 @@ adjust_charge - take a positive or negative value to adjust the charge level /datum/species/preternis/proc/handle_charge(mob/living/carbon/human/H) charge = clamp(charge - power_drain,PRETERNIS_LEVEL_NONE,PRETERNIS_LEVEL_FULL) if(charge == PRETERNIS_LEVEL_NONE) - to_chat(H,"Warning! System power criti-$#@$") + to_chat(H,span_danger("Warning! System power criti-$#@$")) H.death() else if(charge < PRETERNIS_LEVEL_STARVING) H.throw_alert("preternis_charge", /atom/movable/screen/alert/preternis_charge, 3) From d4353c0bbb2660b764a9657fa0e7a57051ce90dc Mon Sep 17 00:00:00 2001 From: SuperSlayer <91609255+SuperSlayer0@users.noreply.github.com> Date: Thu, 18 Aug 2022 15:51:30 +0300 Subject: [PATCH 08/19] --- code/__DEFINES/traits.dm | 1 + .../living/carbon/human/species_types/preternis/preternis.dm | 2 +- code/modules/mob/living/simple_animal/bot/medbot.dm | 3 +++ 3 files changed, 5 insertions(+), 1 deletion(-) diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm index d83c5d41cce..433c353ca3f 100644 --- a/code/__DEFINES/traits.dm +++ b/code/__DEFINES/traits.dm @@ -226,6 +226,7 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_NOSOFTCRIT "nosoftcrit" #define TRAIT_MINDSHIELD "mindshield" #define TRAIT_DISSECTED "dissected" +#define TRAIT_MEDICALIGNORE "medical_ignore" /// Can hear observers #define TRAIT_SIXTHSENSE "sixth_sense" #define TRAIT_FEARLESS "fearless" diff --git a/code/modules/mob/living/carbon/human/species_types/preternis/preternis.dm b/code/modules/mob/living/carbon/human/species_types/preternis/preternis.dm index 8c35d4a089a..9f6a53030ed 100644 --- a/code/modules/mob/living/carbon/human/species_types/preternis/preternis.dm +++ b/code/modules/mob/living/carbon/human/species_types/preternis/preternis.dm @@ -9,7 +9,7 @@ adjust_charge - take a positive or negative value to adjust the charge level id = "preternis" default_color = "FFFFFF" changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_PRIDE | MIRROR_MAGIC | RACE_SWAP | ERT_SPAWN | SLIME_EXTRACT - inherent_traits = list(TRAIT_NOHUNGER,TRAIT_RADIMMUNE) + inherent_traits = list(TRAIT_NOHUNGER,TRAIT_RADIMMUNE,TRAIT_MEDICALIGNORE) species_traits = list(EYECOLOR,HAIR,LIPS) say_mod = "intones" attack_verb = "assault" diff --git a/code/modules/mob/living/simple_animal/bot/medbot.dm b/code/modules/mob/living/simple_animal/bot/medbot.dm index 83ef5d45be0..8a6831f8584 100644 --- a/code/modules/mob/living/simple_animal/bot/medbot.dm +++ b/code/modules/mob/living/simple_animal/bot/medbot.dm @@ -445,6 +445,9 @@ if(emagged == 2) //Everyone needs our medicine. (Our medicine is toxins) return TRUE + if(HAS_TRAIT(C,TRAIT_MEDICALIGNORE)) + return FALSE + if(HAS_TRAIT(C,TRAIT_MEDIBOTCOMINGTHROUGH) && !HAS_TRAIT_FROM(C,TRAIT_MEDIBOTCOMINGTHROUGH,tag)) //the early medbot gets the worm (or in this case the patient) return FALSE From 0c20915690bd0b2aa56059612474406cbe0a38be Mon Sep 17 00:00:00 2001 From: SuperSlayer <91609255+SuperSlayer0@users.noreply.github.com> Date: Thu, 18 Aug 2022 15:53:22 +0300 Subject: [PATCH 09/19] cryo --- .../machinery/components/unary_devices/cryo.dm | 9 +++++++++ sound/machines/cryo_warning_ignore.ogg | Bin 0 -> 41609 bytes 2 files changed, 9 insertions(+) create mode 100644 sound/machines/cryo_warning_ignore.ogg diff --git a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm index 7738ba4a36d..bcdbcecde9f 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm @@ -237,6 +237,15 @@ GLOBAL_VAR_INIT(cryo_overlay_cover_off, mutable_appearance('icons/obj/cryogenics return if(mob_occupant.stat == DEAD) // We don't bother with dead people. return + + if(HAS_TRAIT(mob_occupant,TRAIT_MEDICALIGNORE)) + src.visible_message("[src] is unable to treat [mob_occupant] as they cannot be treated with conventional medicine.") + playsound(src,'sound/machines/cryo_warning_ignore.ogg',60,1) + on = FALSE + sleep(2)// here for timing. Shuts off right at climax of the effect before falloff. + update_icon() + return + if(mob_occupant.get_organic_health() >= mob_occupant.getMaxHealth()) // Don't bother with fully healed people. if(iscarbon(mob_occupant)) var/mob/living/carbon/C = mob_occupant diff --git a/sound/machines/cryo_warning_ignore.ogg b/sound/machines/cryo_warning_ignore.ogg new file mode 100644 index 0000000000000000000000000000000000000000..6b95567cb54dc2a85034e7ee3ad29ad2050c2839 GIT binary patch literal 41609 zcmb@tby!wS_b9ySkW{2Z8tLv1r8^an?(S|WMM^29k&^CiY3c5gxasb?&jz38{k`A$ zzU!QSzPUD=nOQSyR5f2z*7*{(-Lkp*eE|@oke<3V+ zaF3N*7{!N~|0xeMVZfHuRniA+e(3+ROu+rcL=O&lXJK#7r08fyYHeYt@ra*Pnv{)& zm5qgsg`Jc}(Z<%o-qFO##MYVi0XYo9KU2kCYrp`=U=OPtX{Y~iv^oG_0f0UwEk=x~ zG;MZl293wJSgD6vC(EaAv7b8ejlx;G{=JcM7(WL9c)*_qB{FkE+H#QB44*pEF`d^! zfhU&~DNK2p7vR6pV-zSul>u!_Dv`SqMIO3ng;wAP35rI6UNF>89CMo4Wr^FL>+IZL0(AmKR1*| zK1e}Y#1ILLvBZ!c(0`=O`Q`|s`pXt6;19A1NPfYQF2m_7BN`Z?R6J%-e#SY%F0QI3 zuMQR$owu$gQ?4#ku0ERIg0*XXG;4#kr-OAaf(`IP{<$uFmM$KyN7hMUfOHDp_*L2; z|9**>_s{_%pe(x`h`Jpp#Z@S~9T|`wCENpmIu%i2=yc?ebmHiC5&$nr z=Qq8vas#JwnExu_LG1t_!b;TXK-3FLLxpk7k@KyS;FOd66ex-ZiTs~Sz@xo@jF6?6 z##{O$vqu{|ip3v9i=Tn~8tv~&;DC=AYov+8i6;ZR7>VoYc{oX9ZJ*SVsO$2+B|U1; zdXQih)Ftij@15!2hZCI!rO^_z|JFR7CLtB&je>mykYtQ50t0ZI#b_c@-po62uI6y! z#?Lw&u=Xi7iMpyz?JvH6%py-Wd9aOl1)T9|Hp!|EMF*^187J=#pgi>b@8%-{>djyp zzboYfsZS)LAr4s%Sq!mr6h=%sYY%M}aYUqqOkSXp3ITPt^M^;yNdX`T>(Pq;y*--p zUn|b~8bx?{i8N)SE<i;(k1u1bA{{~ymur-}T-6G3 zV;+|KEiCtA802Fl&8K*aPl@?;KdgTj@6`Waum5sRKx;Ib>|-2JR$-h_;ha!mR96%HKYI)ao#2ok;{XL42LJ>B zu-OSp9qVgmycSmT+uyu2oEN&RrZ^poUfJJ7BOMRF8_Mv~ROJq`W`F$hUYq_4d4~Z8 zpSl9=Pf^IEG%_O+81~=+WzgNkKC*V;8-|PakiH3LMJ5RP$cji7I4p`x6&%ZkOcocd z(t!^)dr5<0#iR*hqgAA`0l*(X0{@<53`akQ5lIGs57AB^S&^R`Veuj7Ib*5h;|E6b zQd2o$$k0$_W68*X05%Av@t`ycRThqnbY5Vz3Qcyll8hy7HomG1qbrsQYBmV4psm8u zmSOA)V@3Y%q{0Tt3R2Mm0r9-l+29PMjM%R#R@qsTAi#N8dW$qxMa3d7c3g{wstN>9 z#Z78ivF1z~qCKK2${IJcq^+LRDtuf#>tXQ+fHb3%f(#N_+@L5eI0K}`Wbgsis3=W# z)~J?rc9oKhELHZT7;RD2q@i416`_nYh)PR3uWDSYsHh5`ADK4zfvU=QtuWSXTqBz7 z$HlY3#jC0x7OzxOv3QtaS=0qCo(D2$#acaS8Nu2`WHi8=jbmg<+cmBg&R9)kRLJS} z$T==ZRTT(e>;gsdNEIVEL$0WkQ05U8xcH=2L{Sx?stm}WrCc7EO8cv-@SVUJ4{KE6 zgQ&Xktr)@d+X@4awg#~&nfJ&5q^MwWMkMP>W=E#HBs&BhPJqV4?Vghif>?}Q=N z1=eJGA8NEOgPuO<1xtpO7EH@Z%U~|o56tQK0|bW@!UJNk0De%cVLvZ~6x2abv`RQH zgeXWwB@9a?j1`g`s3ap3ry|F?@z7_Pry|4J_1KqZ68_MK1!ArOQ-5+GmKZH<)g(CA z8C)$pdzufN3oZ%DTMNVoj?2!TG~9U{N0mLU^_eV4MMjz`JKpd!D_8@^#cF+KjaO5V z$pgoIF6&Z}0ps2z*w>W^t_vzGysS%0RpvolV4s#1xc@=I0Jkg>!_pFQ;?w58f|1f6 zO%?}~6q+F#Ye=#a78~*xCp0l6GDpx5vW!*4EXcCuWTdFFaCt#HQ(>dc$W~H$MU|zd z1#W+KLGkXkiqUWwQvuOPVD`$w0XH=vv7i{bh+fNpQZ@<)Z5r%@#HxTSe{%wFL}0!E z_dTHWh>ZF{aXCeTvH<(K9{`YKqrce%1pw&m!Q@-2Z0z*mOFHPDus|M|C0J!1aSjB^-Jeb;p^8aaCfwVj{@%bO2R;(d^n?`64 zgj=yrYCS@&`m6qFTFHPOXH~=ri3MGIQp;%&0U+hz0sLQ1m-79R9(kvqK}HYbF92?G zX&*P1pm#k8{XrZ5?lW0){!{y(zQ@|eKY;!R<%IKY5IxLIc2WS%KL8F8@sA)+dKM1< z{DDVgP}SiEkLDjOlNtLc;5ZG!?Bu|w4;BpuD5`AG@)@i9d1-0mKvo!CpMp)$NDIrr z$YqsRg=-Y?5{zbHj9r9Id!T4Qen9&KgWxncWHRwJ?ZXg|(f8mq5HL^$c@PL#E2_(V zz%u#X=|J!SOVviQ7bu2r0z7~S)ih7L%&6vyx&5OY<^e#07UTfqA5F#mb<@9!qXRwu z(Ig(4#t;7M{1+hB^Iw3V;RnZl1SpBoW`i@39+gfOq$Kk%;HeBvcI>~XvLF2NpCL~l z3`>RYubKSall(>XXmKhsD1XO2ZdPKSJ`nkL255i}<1+pNRAe6Q_5sxcKG1l{{sn*w zJudzTP!U6>`VSx*L;zCt7XU8wZ|wmK01Q9s6FUyqFqhyhaR3D>!K=UiwF0KUf5%!< z{yU!nj5GgW`j?9T|C|4xO8`In(2!a;QC^t6ljfr*LT7sPL0r(|+P@h^ic*7atY!7> zgOb>0R@SJDbs49O=!39SKsT9W+x!{(RYs<$6W1vGd!UL69T-8ucsPk6Cc{{TtNpob zL(2*&BMXe64+d7;6c{aIRkV(8RLTpP6{VrAnl=pQoYL~b$g2bqRGq)K8sPm1MtIgq zLZ<=Fi+NcPbD~u-CsLXdR!;V`WdtWA*$a#Ba$GB-ZiCo)SQJ9+EK>w#!9hVJGVjB> zs&`fcoRGypOg`i#%L34_tque)QUh&SK}#NPdl({Gi*Gf=dqEV0!FNfF2J}SO10wHP zzDD!)m5zRVq1cKQ0LB+o;3JsO!odI(^j9Z_VSioyznmF-NO;8qZouEQ759(kNBqfA zIR1eNn>LJ{^o1-zg*E1xXwiDR_VOXco_(|e+NDQ030^k zGh`f*fB-arM?@+b7C?Q1_Oe}EM1+Yfvo+mbj)yvh3jjnv_G5ke*h$KoK}bWF1Lxm~ z5aJE=3{Oin)cP~Qy&vw>K@vk2!}{=!NCXCjhi4^(dhsymMRK~T+V;ab56{)hpcG~R z@*m&7uWlY*0w~x7WVEcjqSDG>I0g$Ta0v!M4gZhkrW-tb0zx8UZzQB-IOfp5xugk`%k8-h9}0@_4xf?YZ@ha_KsA(K=X2y}yR)v6VFWd8Hg}>?OGz z1nNNS9y)||AZ9j7^>?WzM>e6Ak*WEZa2F&Vn9=&R z7CZKblG`t04RNM4Ur1PPGXYKMwN)1rj;>4Qyy6b3iiI~5ESKw% zg`TXG>6KWLk$OIwWcNa+_RG@aDiF~LExTEXenMMX zTH%!@W$R$S%Mx77U*?OSe7U$u@)rYDy8eDKf)RJAv}u89#@bc0th&49#BM6@N75_~ zZ<4-p-Euqqzs<@4cDRI8dMV zk(~{@`AJGn7w3+u@oAxXF2#hNJ{aF0izcoE-eLJ#^$F7}z3#ePG7bP96+pPCO6)Ut z+bE8(TZCOTA$<)x1^_hU(|j4zcAv>S256$j)Fi-o@mO%SK1u*tIrlShMTH|u=V!j2 z#loxEi<_p0o`N}g4n*@vOUdNg&qD)>Uh8gT$eCz|PM%=#m{V5W|Ey|P`YG9w2R;db z#h=yoX}{fb2XLnemgJM#nyG&9`3wM@U#U_JcK%L9r3xD+YAp`m@~E=7HQitsG2Ir# zB;OgZB%bCrj+yy(D%(h?&FXpn1xq~Q%^@xq$pC#+kU+9Ah{|uWR@Z_*XeRs=G)z2@K_;)R{ z(}F|1qu$rE!gy-8?;}Cw&-ZP%hWsN?R_QKMdAZi`jvUvrrMUhaAf9n1Y&Bq8a=)Sy zT<(+B-TF>g(2z%0xtGQTW2|EEMp&#+c1RZv?oxCA zy4&imMcs>ID`}-BCV|1nT5z^K7UQLBfw_hQ@+-OuMpagY^S${sY-ux2g~KJ(On%)?#m9~(omaq;WRuFBN#6)wfSgb^rNP;Ez_Bdq8K}>;rw`sXZ$>BZ`Qf zw&!d!dHP>UFLG>nooWQ_s$hdZrjoywjv=h+!gh;fR75gOm!cFyX~_DXj9B(Tr>LkQ zLjqVbTH89dzuqq!0Z-!6KP0?mFVpjbT1uw_0FJq;)kP%?>yOE9Ng&IApFV;`H+d_Q;qw~x4s{aJQot}t_^IH z-CpHLRN1XhUdXtd9t`nnCQMJg?_QAIpS3+^uR+Mm0j+YWS!zqb*I z34HQi`MSasmKdV{&T5l3?KAodwGyVQq`XskSvvaeLoMi_KZ6C*8SZSEUGbifj92n8&7Jw~wSR2vyRYVb+ublwVaum$mo(;jGGmSC=$94= zX?J*M8`){pl7yaE&J=Y3*=;Dm>yxGRSRXHNirMkyF0SDD^!aI}dD5Lp`JI7f>X3z# z2d5YvM}5iHP5tPagk#p}@qzO%u6-+fAGlxab zq))0t;A86ab<}&TzAvMuWG!P3*#k-hSS%XTJUCPc#?;h)D4^bYJqYn&DgRh zo!1}gZJVb?u(uO%cvBb?9SXI5m*5UNu#Ff96QMJ$AVH9_jEyh&vRx1^F=COJ2qz_z zkbW;iZZk)Pn5Ji^b{}t~?uC$be;>ln_`JQFfu@5o{rW!G`?JMgcC7HpT zB*Yi-aTq@sudm2gPTQ(Lsdt0gUhuap-kk*;Znv3 zLf%a`G`85n2njEy6n^!vaROmahP;?Szx`iD^tq13A;4jv5l&XtKfj z!9=>sigcM@!p_*jSfATjDf4~$%asZ&z}pu55kbWxWp^74SQ>t+V~y&>UUm_YccnK4 zp+0Ljy{a|%x0n=Co>Ykke;H}$9 z%6{fzm=_&~h^TLUFJ~9-9#-xBsX(BFscX9AvmJKTJ9Lb9E5z}?HtX!Br-Ro5RQbZ} zs{*+1`I#{}&t?;DGJlF_ULYgF8gboTylQ z9`~0>#I9SNp=5W{{&-Eta>+?IAnITn2Cy`YC;H81aW8f}Utz0zHj zyx5V4q#9!AQ4@)2=)?Ml3mzOAv*@TZAe)p?jyk7Nn7l#iPal#fr z0MLjtk}swPlh@pjrV6*VHx{${BOO032_S_VYN~cB9&uNVR!p`6TY_xO+~P|ugo~Ir z(X)!G4KEb$R^5*+3Z=F)CIYRap5;m7Q~NNvZhjqBvN`wR@W|icGCc|+)>^%<`A(N| z>pQM^-MMIy#@%k%LHJ?w{$_><-SBcLp8nb(dHeQso+Q@;W*$7RjHTP7+xcQ6f3}5! zjuzd_(GbnVZ17!3U>k2WxQelxQ%{Q$|8pdY-g8Tbqo1WD_=18z_E!F^+hQv3?xql; z&$SE0%4!`YR%A67pw*`)<;45(pH6VPBc2AyE|TZKEjOl2xg51Fc9+*Vz^Eh^=D;|? z0+0D!x0`RnK|KUYU94p{6QLq>uuu4?;=OYj0KefPLhc$PEp5-?4lZF5y_ncAcdC2Jw1q;}`* zcwWCTYL*E@a@x-=I*YNdPvbHZ;2~a2`rMXI@0e_rp=4E^qa9GlVL+kKj`D=lnd`(e zf6JqLxV|k9MW`k|c0Xp-dH?>yDwm~FKu4;v-Q_pKnlIA<3HBo_l*!F4`0SJGNL8@fe%0>> zv%*WSKK^24qZVSCy(!U9Zp(masH$gSiau18PgW|bP9}$sQz`EmRp*Rsu^UiTy2o4T zjAQg18LT*fy2X1@$7PUL)0(rW@mvUIo>EycSe>vuEr7k7E?pUeGZp5ye4RzM>X^Iz zYTAqeJDh|mYiyol<+GU~k_pd%8IXl|QVwTBKAvD5563N-2=dEA|*qVt>~i zYl+%DG8d6)5sO}5=+=zR`iW>@}F_VJ1_r8G#+3s8Bc%hCCL>yRE3e=8Qe5Lqb zq+lxfY>XOcR=ynp92wq<&BNK{UBHZay47tA_o(N0!cy(g-=$-vJ!FE6O==o(UOswqAB66ZO^cwc8NntrHV zfqMHoCLlC&B^h;Wny-iNe>EGb;45byV7l5~b#64-vejm&8Ou9}<3s9tW~NT^O?xV9 z-BpQaeRjN+Xlvl6)hz?T|7kl z=Qk7hdE1iBjo%S@t6$<*>kf{YKI>(^v^MrONm-0Edr7^JQkO14Q)3Lxha`>6K~AcE za0y4a$fheVLKQh0nO?*FhW)%>8`_>^K;g?ft$1H){PL|LbCFKrg_+RpCTCwnPM?>l zB#HV$#EJb2;j-|m!UVxkCTr(Kv!jjrsKwH2=(I)ppl7cU!>wqEr?*(NDBjUmx5zXF ziR|$^@z--L*YTd+KnK^=4<~wfE@z{ChwRDLcZ@bjoY&dC-@=~E2 zVy^u%yK$h9mzWIZuQwZQeDxY(C0cZcd3BH?mmyW&Zpkd0n6W0?g+%*oqcl>-H*wat zey7Wb&y~5vI;25jwz^)3;G$yobNy*1iP2^=iagVrT3n#B!$qQ`NA7!kMES3SXSzKc z9U_7EKT{L6leVsJHVSTZ{m}i2Q!!hpb4n(GsS^Q7n2uN4@d1*-?mP60P%uExU7LD1 z!q+e^~BbMRwbbbxFTAvePc2vQHN}+iOt<-wRRlZuM(Ze~QOTh@sF)v%&b(DBSQu!26!Z*;*mS zM0zkaABhr0%Uih!V{+7cJVO9(@56$fPPsz)5DA%48TMBxM&TI+>5+JOf-QttrUW$L ziM5me$q9GjUEmcf$)ejy0Dpgpkh8~0fZ)IwM783q*#Z0?kuujcpg2Ux-_SqD%5SyC zu|-x>A-=SUPvK936B$x9b!7BXm{`=K{`30}ZtSZHuu%HiCd`c!*(R-t6QczN*AsT1 z-c9o()<*JN@TdCN`+*eZ>584L`kPswtu42TaC!ZO?%(@%HPD8uup+G#p|(c@}GpuufEpN9Tnyu0OsZ`wJ(|8OjOeuW34{7A(uzz!X*@{$iMzGezjN93bYg)#^0LI;~3QK^2wR1`lO z8_v+G=X=j?H*O3+zRp)wGuB-T=LLc{-b)I{@0P#^d*b+uyX~!xJIRodjzt0J@Cm%y zMvZ%4ue`38pFX;e>rKqml+HYMc3l=gwZv1iB*}|X8&E5> zG_&It!1Xf?Sz_yxPwtRh97Yx?o}I4O*J>x2m2X_(N!PSIOS^NLZ)r9q5;RpeT$*Se zskWqwT71WyMwHahcx6nXI$_NNk&l@dKJvc{ym@Ohb(i8ON<6JS_ETdR!@KT`248x4 zcJm5f+<^1j^b#L@EN%>3kFlINhCKx|FZV5^!D9U+(*~P+u+R5bL8cc!HG!9jyfu^( zWpbz4m|+SyYurg#q!dI-z0LHjj)%fCEuIt zYfn~gV&{?tpPi<8-<_`geUZfMF?MF%M)xwq`$)Gdg%5KV8Nm=AS4NlH8udlg7q0{0 zLx;(I(4Xrjl(6FHN35FW39i}O<(cf+@b5K__2^RqmAH6M0D@tt-+m>Mt-?*SyPuTL zd?tfVA!SjrqTkYG!hlb1_9u$(jf;(C3*iS|(-zlV=1NnRnO|g#e`-%Q&F{3#FSD8i zs~)xV9My)&>89LnBAn01?i{6s5T121q+a7VkP~dhe%neDZia27%S8pM+FYT80I zg7epVYi=tSqf4)j1pB5Y-M%*O*T$b_?P>jTn4NqUIXBrrT%tuHn7lJJ*ckeDJ5FPE z_|xxaetI@2jn(@L)%dD6nRh9*&-?vc&Zc+lCfKEoENROnyw(dQ+tDPcVAHY7i8xo z-@es2x`#sDk^&(t6<^S$X0_$_imXJiD!+B(K1<8<7VTtkMOD9P|874!?Ph`lguAJa`P^n z)sQ_MuO(MO59^;@j?oLB2EXw4>S6M-^{|qujb)66x}k@ioK2{@JgruBt@EB+vT{qa zi^^>$E}GlzzuZu5vMJ_<)W8(tCcz=or9J=xB;997qg&|9t-s*{&k@YmS-LA?g|YFa8>FJ||K$qsUtB9{E1`o9|nhYsqs)m`E5EE&&h z3H#c{;1f=KsLUn`2EA9y7qlT8m8Pq?Eae<^_rmv3Ols<0F3d(;JS4SY)^zCE!P={0 zq^pIyABUIjo0>iXf~Vtmr{|Zx+7)Fv>;mr+A#3{`SG=nSuMd)=6lp&d!crNa5|jq0P_WQf_M6-q=2r(b`| zjexPar*>uE**qR8!L1uFb`;TiJupKJVNrl{Tf zyZe?Y^_jgm`DgDZy9u`iW>RNRa0=OOVSv*pzcY&J+ghJ+YKJ zY8#T5yOBXrLbra`*OpPjBsVHawL*`>*>rKXCytEOtZ{rk(?nC@@YL#LHd7?F9z zsTG?ej;Z^Ks|~gddp<+He=a8@w(|8Fwta~k_CMxqbb~0s~5Bl1!bs10cyTLl#4#Z;o^1_ zk&l%ANTKgnp=G3GcuTSIq`uC5P?vvL55$&>vBgl5$l!&zra1SW(}LaGR(?J;GGCcH zjXCG#6Z^s6{e4Y0@VL3{_+wt!dOnwTy(EHft%roKl0&Zd2lhrd)^Z6oy<6U-mP%9GnwjY{?(YTg5V52%lw}aTo0!JjeG# zw)P}!Cw3oPy%G+Vy=!l>P40UAEfnhlXXo$}ZY7OV>*&9aw@mxS?_LfzAX>QCv9AYgyo za(&X%NP=3lnTUftsofZ5Wyn$si5AH@F<2HOCB-nu6L;DU|LN3&gi5xggbMT8!t(&n zg5w7%0t|dAgNn?V4I1F@Ndybj8iKDN0ze)HpcDeWs?qB0+xsy@lXKo;Pru8L*Y{o! zG0E%%!I}aNnSps%=O+=2XN2xoDOjZbxpXQRf+s|69Cn6=ZDIjHy8BCmWo!T~8%6Eu z-_sTmlgGoB$J3UFpR}i2!b}LEg>rI=N~+doP(>*IC1mms^z}@CZE-!6D}Ls7$ya@W zjGdtRQ@b$W&*#!$K6$>;uyZ>e+I)gkh%WNLNpM9PdWZIyPh^Vvno zy~UAtU#4x7waOS5g4^o8OJkjvVbgA!by5{x$xV#wS+@MK^Wjm|s^F|`0mgH&kvsK% z^`2JbHdmhH!Z3`3QVQ4?z!1WpUQ|-bUHA+&WB{wyxL5acU5MmvvhUKC@M>se66;}c z6!jR#yWDZdr%VPV%8tBH=HEirrOpp#{wG98=>eDK0&&zF87L3_-gQoe#rHi3sg8PyK z=!qYmU%PD$U*jUgN0Wya+WXNN_^4~p+kg=cXB5=a;rWX zfGh%Ji9rQ!Zu!JGyKLvZ@@fWq+NNr>q-A$N{<=-EPc8_xcD3_Uner_1dc`)7Cl>uL027~pxV zn4j=`hYw+wDX>#epBhVW_?BoXeh!6qc z64012@?x^tX`=MojR5W_9lkz=(e2MV)CGt|+;{csO|V7C`XI`s(7u;Pf$Hr3g9p2-C$ictUgb3> zb2BDo`$W2g&1P5it6KF!sWo*z$J#sm(ux{7`D_69vM!zx-^<0? z`UBqPDqrubvE8FPr@X~#cc#VrcY;z$9GTX-kxL2*CC4_%+B2UMQRBacBW6;U%~-Ax;igQ z_CE_QoE}48Dm9CwAiT1HXsrvwWrg4rqnwyku-0{VluMlDCQXIRl-Lj91Rh1PI%V1 zehl%UKkk7$$tS7&fgu_+D0?FL(}=XOUODS^W5?)l>T8`M~=~ z0BvKs9{~=AltPA-q`#j907~{ci)k;cS=9SDzL$F(UziJkXY#NVfPWP1G8Rv%A(Fo$ z{7*o4=C;5kQdjN=r(fS{{sF8d!gYrzWGe6*A_*A%_teAa?k~)}j=FkC!>hR# z&SHA|x(vU{XH_uS(dyLf-`-X6FkjWjD?ME-Sb;1Qr0|C9@HhyBY$xqs$ko@O&5vC` z4Qy3NiW)xVe{19)giN)!!UA8pBR$*bx95^dHf}r|Ejxr8WO><9eNwRax+S`XuP2|; zybRfwM+!&(h2#|j0A2p9fId&l3K49OQY(cj4X~q6yTFD+mVxC|wNawIxsR`WE4{;} z1k(th_P{U!_xN`$H~6mEP4e2Lm-ImEM_12g-gX|Yt6tfnSI;2(v3r#tM57hsdp}8k z=0OfI`m82#zF9^KgHXF|Z_ZcF!qT*i0CEoiELzyZQ-LCs<*9F`rN_vYji0W3x_xJ* zGUqhla*jKN$91a59&EPgl4_=rsI^(9qIheL?jO#tBK!oIeY5 z#a2959gf<)TQY&&2A3H++EY)1@V`^nlNh?CK3T$-`2fCO4>D$pl8*TrLdx#6|Mt_a z*DX{r)Gdbyf_#uMT+H2E8hC+gReDzZsR1(pr%ycY_JqW0#(rXZa;NMgS;x0r^S~D| zlHW^QZJvdbT@KH(sZ3Z^T3|KQ+;dd8yVylBSG~Dog}D`~GBo6)vUsD|{o$tuv0`U+ zOdnk@-K7$JZ2oU8?#?J-?Ap*WAAXigt8VUL+JcibR zZZN=gG>7@J!x07{fObz41aox>%0!5@=Ew&w+Tfz@74uo&0BSj0f zwvBJ_9yz=yS4bGHUmn+JZvcSmzIG3N!j0onZ1k??>4MH-r2*98MO61gD z$5i8_Br5JXuemZ>Dv1}0?P5RFHLSl4DpO4GNsx&HH^G@t=i1Nmrg@f0w$Evxs+#1E zh%rWnyJo6)npyYf>`xn{iIQ?J$j$2&yqnkq>fZ?_HD10GVMWG8H!Y?k;=HmvLnX(a z4CS$GNf7axew!E@`Rq^RBa2208m#%K!|Pa6LaFtH2;TQxNF3>XxQVw0oxVC(^S>;< z*kp`258L)iIMLIVajTE&8t2+@bHDEkyc(?#=UB(I`&@A{opJiz;7^U}l0rxKq}@)4 zb*>-n?>{$v^LIh$ZAdty+`I6pL}2tA;Q=+GCply- zWeoQpnS6IhKiE9MQ@-Ff^a)!jxPwg1pK79kiZ86c;=qp_)8|nL%qc4P(eI|qTP{#e zWE*5=pvV(H?(mU(RveFfIr{tauePsV8U9ZCQqRLTIf>vygXBpJVV%Hrk*7w^3nslC zm#R=PPhgZjBd62@-w6H+55Y%b_Hwce={9)vq>Lp_^vB|y`<#aH_6LdkXdCkj8nmUK zhT#{wpFW`)`JzgGCyDM^i(snzlzMgR$K)3`+<`~5{1OImPh#)IHv;?}o&wX%MroZ` zhW&k}rOB9~s~kk(s#D`G%CT32X5kE>+A9*ZWCFNPrfTkOp4=OF#L_4J7P!&OP&dT1 zjVTH1Po|U~e=n93-7bw;BYrP>76Ca@Ye4nrh{X&vO(nS!-`yJ%3i?AoheRGp4S&^Y zjsq_)u4o2*L8##lT~Z~hzG-jrQuos#-*ROC@+@9hOygBA*T9lU1@Xv;UNkR$=&Lt+ zGl9b+l2U;Bx=5*{%{5UGvhO1=GUnS)xJvtB0BdQ1$I#Oy3y?hM`ZkUWQLfYGS z&=FUsIbC#&J?=B1OD8KEYmP+cqT8FhDxMt57 zBA@vU2r!OschvM>8p2ghre?^go|BLDtFGVK^tZAUwNow-q_j^sdc6*FEs6PhbtU{mZ)~t589T9Fh1J6*NCWw0!p{~BD~q5s<>wa93kWHJzjViaWm;SY4nSYx z1wUs3zt9Bf*5~dN`b;+cEkT_-Eu`In2(8;{$ zU_T9Xr;Y8WFKC&few=?~ytW%G@0>Wr`BfyqM9bwDn}1$QFMf0UE86K3MdVZ6RSfFO zl>p8}0m{I9M+sJiALdOg12aAb)c0KCeiUJx9pq~s6;NL56N|cB9bVo0hWL;d$pZ|~9hp#@G zy=}n{1~(z2?&EaqbHk{!UkW^b0?OucNPanyh&7pnG_P$Htrm}?X9Ok;v$5my#37PX z?pPgt3;yYjJF?OeH76*Q8}P$;0EHUm$nn=Z8p@pRvF5{$du40%vrmYD$N(C}^AMG% z*iuZh@2J{k`5G7UN(x?iQSkU9>poI0WB%uf!c%u@pmiZSllQ)&fi_U`ZMR?Jx!3OX z$YqpU8sgaqQA^zmU+X@42dAlfRC8R0*B; z`8~C#=gZVSfLpp5s0@<*5tlKiUBZpmlosvmH&?Gon1BbJ%Vo4Nomo9Gz22=9UTSe6 zZi)ld+WEt}pxCZ~CsnkMa7f!FRpo-Z`?d^6dHjB(%}p(mPxLLhmyhp6qf* zrsJ66{iAw1+rq`ybLZ!0sWdzxEjzmY$pJ!cjbyYEhm)qv#Zao}%8gnpO()5T3Wt1b zJ3XB^j1h^UGcM4qx9V} z^{<%Yz7{X)!-3{3V%&)hZtYMXCD>+u!w`aHq^q&uEkyJX2M0oR<}}1L_q`<`>;2^O z$jsAWoj;BxBNqYIrMKbTWt_`cvpLXTw%a}B|@_gyU0$GLh%VXKGv>|844uqmh~)6_sK z4Fi0$yErJPqIMDBlH>yXQAK2yUpx~n0w|YLuMQTA$B-T#NBoMxC_aw&=#%)$ET-T| z!-GGb_f4Cz2H~HS6EHy9R~{lChxu$h&9OIxosZcpo;||8lW)cFVxeN`E~fYPXd$V0 zJ~~h0n-Z?K3QQJhc+sCW5k}~!qwSy$pCbp?ntFrbHpN9V`CUbkp}PHJ-mjbc@wML|b(N<1DSe0@0>%HQ4VFpB1&|5;XVscfJ1#`|!m#3>z&+|WsjD944Fzw0(@a!!mhs5l{Fp{(s?-0uVjHkCPx(yM zXokmS=O^p?rQ;-Cpbc|2Rsia5yt24l0c^K9H!SD3$){>OS-=O`)O$bFCk zKQvpV0!ot%!JG)bXPlp;2uc$pWQ=2Tww~_yt*O~=WwK__3j^l&!Gg+~%y#dzlYEvE zFV4N3QayTmkB-gQ?(%AzY|7D$D$-vDh=_AI_p*)?>CGy#?w8H@l;@rrRbwc$fbhLlsfU;TP;N3r=RZq({^6) zO@HFQ5|)0eSQ_943#ifE`_b{wX|4K5xCul32$!jndQeU-Fx{BH9H6#*DPj?rC8v)`Pm^)Y)lR;PJhWX&F`v6 zov=K#--t+NksXZ3E5hAa;g9*wt1F~SqCi;P_JXN?cz1x6&sp%O@(6NnH#C?ScXiid z$3=T(btQL{e0>2B!`X{B4b6c7YN zq`SLAQjiYmZY8C=ySux)MN0DdZSZ~1Io~JO^*rJqUVCQE%(~~Ed#w%SgmD~CfZRKf zv_Uz*xiDm5DqPDvk&7fV>Wj)_0|$`x-+NmNzvMiFBL>U82y=q0C^3malg~dlgs;9b zlKAt^*Jh;j3XKIyXvjmzhlAhnzrR4vy-RH6JSP94(C$F2% z4;ek^%~QS6{c?Bwr8y2|TREfDmBh!s_o&|NRIx()Omp*;olKbR7d&-2787Wbzz^cPps5&q;0R0RI?iet4eRa^e{QgUZK@UB6Nmy9kq8l|`M zi?zT$uS`GR8|!*e8g?s3bLQ`ho-CQBI>v7lK0sS~5?D`_o-2>uqBa-TDo0p!+qS|( z{U4JNT%`dZf(;&%^9`H+Vef)(j0i~13ka`lJgRt`1vuY2@POT=$}*Q_b;cRXDBv3 zoY$^<)Y#7JtfFQj$>`$F{+petQ>CXI&c*Ih_V7#hX{FSiOYcp><$<%&XM{VXU|9sXe^G?;K49C|67Wl5j-eU=- zTUZRx=A~8zo>n(d<6hxg0(rE`sKi0KMHovbOxR#XC)W9R&L z+LE!4+~kKxjFg$k$TKU;OzT}I&3oVz09~doWVMkqdmP}wl&3$eTX@=W=K}&SsGokr zBCEgmJ^`Ox*@iWyjU54?k9sE+{0+L`3rc{3+#jA+)QVFfHGv_`foTSzO&s7isioU!olkMJA#wtb*sgPa~ z8#`{8zL|QWY8G>Je4Oa(8)~y|Lspo*9t#gYU&TSU2E}#GN}WX~WTsj?1ocVoyT#qn zw7OL?D8T5*K|A3}`aBR5>?z#8T>rH8rjCYsto!eCgS844_@Ea-^I3$I4eA*pEWZFD zg04Y24+s$mt~PC1b0~pgGj$RqV$2{_l<=~!wTYHTDk0fW(?Q(VRY6D(@pGI)KPvc#l?w*`f;9_NcJS6 zgc9mNjj$z;HD^WXvj;<0UM@6R6baSzgdc#;)DH+TLsE6l%CII&P@mSCuj<<`-fV z?6ui7onH$gpe6$kg<^wrPuX7{;quhGxSD%8ukhW0783=P1H1Jvhs9B$wS#^iEC$a` zAVHYnB--%OQ>(+hhSu3fT|>@nR?{77bcAlGFJIYcWwA@D9W{V;`Yl_$o63|yP4Z47 zFC)zANa4?iWfq%D9BS{%OE;UPUdPo|-n-;mHiy#2pGB4})TMWOHL9bdDmq(@dB3wP z$4Lq`)*k~VwKV-6Rl*n=-dxZ{JdS;vH3<1*wkccw&gkVZx6`j5*6U3=R&a^4n>yOO zLW0Xxh<>AbHmmhkX|Z?2En)JlRf09bGmpV}@=Nh>@P_;{RMJRzNd$7OKbEwB$NYP5 zvgd#;i+Sp!Z6$(l6@Sg>%CQ-P{mwf;*Uai{{#NkDAU9Gmc$wqQXNY^pZ*v!PlxuA#LJLV@70FNaTBYm6M|z+Lh8RFCmTPH+X#+)d-|)IHMORoR~A>pDi6PFd>jOQ>$AG7;l{CXw!xLI{vr{i4(q!sec#u zHVj;BUZ3Rrx5PgAP~V>xS*>~)4>%0DZ_RdxPZ@te^vR3I8_lz{TNY0Io% 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�dl?nwq>sh|;{ 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 literal 0 HcmV?d00001 From b2551e14d9945eb1042b8b36f53b995ebd177f61 Mon Sep 17 00:00:00 2001 From: SuperSlayer <91609255+SuperSlayer0@users.noreply.github.com> Date: Thu, 18 Aug 2022 15:57:12 +0300 Subject: [PATCH 10/19] surgery --- code/modules/surgery/cavity_implant.dm | 8 ++++++++ code/modules/surgery/implant_removal.dm | 2 ++ 2 files changed, 10 insertions(+) diff --git a/code/modules/surgery/cavity_implant.dm b/code/modules/surgery/cavity_implant.dm index 14d1adb156e..0d1a02ef5e9 100644 --- a/code/modules/surgery/cavity_implant.dm +++ b/code/modules/surgery/cavity_implant.dm @@ -63,3 +63,11 @@ else to_chat(user, span_warning("You don't find anything in [target]'s [target_zone].")) return FALSE + +/datum/surgery/cavity_implant/mechanical + name = "Prosthesis cavity implant" + steps = list(/datum/surgery_step/mechanic_open, /datum/surgery_step/open_hatch, /datum/surgery_step/prepare_electronics, /datum/surgery_step/handle_cavity, /datum/surgery_step/mechanic_close) + possible_locs = list(BODY_ZONE_CHEST) + requires_bodypart_type = BODYPART_ROBOTIC + lying_required = FALSE + self_operable = TRUE diff --git a/code/modules/surgery/implant_removal.dm b/code/modules/surgery/implant_removal.dm index 1a29b1ce5d6..8498048d37b 100644 --- a/code/modules/surgery/implant_removal.dm +++ b/code/modules/surgery/implant_removal.dm @@ -64,6 +64,8 @@ /datum/surgery/implant_removal/mechanic name = "implant removal" requires_bodypart_type = BODYPART_ROBOTIC + lying_required = FALSE + self_operable = TRUE steps = list( /datum/surgery_step/mechanic_open, /datum/surgery_step/open_hatch, From da49ad7eb76fcdda1c2a46a973767be84ecdd639 Mon Sep 17 00:00:00 2001 From: SuperSlayer <91609255+SuperSlayer0@users.noreply.github.com> Date: Thu, 18 Aug 2022 16:00:23 +0300 Subject: [PATCH 11/19] surgerie2 --- code/modules/surgery/amputation.dm | 39 +++++++++++++++++++ .../modules/surgery/prosthetic_replacement.dm | 16 ++++++++ 2 files changed, 55 insertions(+) diff --git a/code/modules/surgery/amputation.dm b/code/modules/surgery/amputation.dm index 8c9ad4f9cd1..f71c975ef6c 100644 --- a/code/modules/surgery/amputation.dm +++ b/code/modules/surgery/amputation.dm @@ -40,3 +40,42 @@ var/obj/item/bodypart/target_limb = surgery.operated_bodypart target_limb.drop_limb() return ..() + +/datum/surgery/amputation/mechanic + name = "Detach mechanical limb" + self_operable = TRUE + requires_bodypart_type = BODYPART_ROBOTIC + possible_locs = list(BODY_ZONE_R_ARM, BODY_ZONE_L_ARM, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG) + target_mobtypes = list(/mob/living/carbon/human) + lying_required = FALSE + steps = list( + /datum/surgery_step/mechanic_open, + /datum/surgery_step/open_hatch, + /datum/surgery_step/mechanic_unwrench, + /datum/surgery_step/prepare_electronics, + /datum/surgery_step/sever_limb/mechanic + ) + +/datum/surgery/amputation/mechanic/can_start(mob/user, mob/living/carbon/target) + return ispreternis(target) + +/datum/surgery_step/sever_limb/mechanic + name = "uninstall limb" + preop_sound = 'sound/items/ratchet.ogg' + accept_hand = TRUE + +/datum/surgery_step/sever_limb/mechanic/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) + display_results(user, target, "You begin to detach [target]'s [parse_zone(target_zone)]...", + "[user] begins to detach [target]'s [parse_zone(target_zone)]!", + "[user] begins to detach [target]'s [parse_zone(target_zone)]!") + +/datum/surgery_step/sever_limb/mechanic/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) + var/mob/living/carbon/human/L = target + display_results(user, target, "You detached [L]'s [parse_zone(target_zone)].", + "[user] detached [L]'s [parse_zone(target_zone)]!", + "[user] detached [L]'s [parse_zone(target_zone)]!") + if(surgery.operated_bodypart) + var/obj/item/bodypart/target_limb = surgery.operated_bodypart + target_limb.drop_limb() + + return 1 diff --git a/code/modules/surgery/prosthetic_replacement.dm b/code/modules/surgery/prosthetic_replacement.dm index 8232e34ebe1..b5c6b66d6ba 100644 --- a/code/modules/surgery/prosthetic_replacement.dm +++ b/code/modules/surgery/prosthetic_replacement.dm @@ -18,7 +18,23 @@ return TRUE return FALSE +/datum/surgery/prosthetic_replacement/mechanic_limb + name = "Attach mechanical limb" + self_operable = TRUE + possible_locs = list(BODY_ZONE_R_ARM, BODY_ZONE_L_ARM, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG) + target_mobtypes = list(/mob/living/carbon/human) + lying_required = FALSE + steps = list( + /datum/surgery_step/prepare_electronics, + /datum/surgery_step/add_prosthetic + ) + +/datum/surgery/prosthetic_replacement/mechanic_limb/can_start(mob/user, mob/living/carbon/target) + if(!ispreternis(target)) + return FALSE + var/mob/living/carbon/C = target + return !C.get_bodypart(user.zone_selected) //can only start if limb is missing /datum/surgery_step/add_prosthetic name = "add prosthetic" From f203551f60c3b7dd42c9142a06e80af069cd0ccd Mon Sep 17 00:00:00 2001 From: SuperSlayer <91609255+SuperSlayer0@users.noreply.github.com> Date: Thu, 18 Aug 2022 16:00:51 +0300 Subject: [PATCH 12/19] SPAN DEFINES!!!!! --- code/modules/surgery/amputation.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/surgery/amputation.dm b/code/modules/surgery/amputation.dm index f71c975ef6c..bf05e72ff92 100644 --- a/code/modules/surgery/amputation.dm +++ b/code/modules/surgery/amputation.dm @@ -65,13 +65,13 @@ accept_hand = TRUE /datum/surgery_step/sever_limb/mechanic/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - display_results(user, target, "You begin to detach [target]'s [parse_zone(target_zone)]...", + display_results(user, target, span_notice("You begin to detach [target]'s [parse_zone(target_zone)]..."), "[user] begins to detach [target]'s [parse_zone(target_zone)]!", "[user] begins to detach [target]'s [parse_zone(target_zone)]!") /datum/surgery_step/sever_limb/mechanic/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) var/mob/living/carbon/human/L = target - display_results(user, target, "You detached [L]'s [parse_zone(target_zone)].", + display_results(user, target, span_notice("You detached [L]'s [parse_zone(target_zone)]."), "[user] detached [L]'s [parse_zone(target_zone)]!", "[user] detached [L]'s [parse_zone(target_zone)]!") if(surgery.operated_bodypart) From e62ca528517fccb799a7727079a18b10ef260de4 Mon Sep 17 00:00:00 2001 From: SuperSlayer <91609255+SuperSlayer0@users.noreply.github.com> Date: Thu, 18 Aug 2022 16:01:58 +0300 Subject: [PATCH 13/19] fix --- .../living/carbon/human/species_types/preternis/preternis.dm | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/code/modules/mob/living/carbon/human/species_types/preternis/preternis.dm b/code/modules/mob/living/carbon/human/species_types/preternis/preternis.dm index 9f6a53030ed..4d178c12e26 100644 --- a/code/modules/mob/living/carbon/human/species_types/preternis/preternis.dm +++ b/code/modules/mob/living/carbon/human/species_types/preternis/preternis.dm @@ -44,7 +44,7 @@ adjust_charge - take a positive or negative value to adjust the charge level if(istype(BP,/obj/item/bodypart/chest) || istype(BP,/obj/item/bodypart/head)) continue BP.max_damage = 35 - C.grant_language(/datum/language/machine) //learn it once,learn it forever i guess,this isnt removed on species loss to prevent curators from forgetting machine language + C.grant_language(/datum/language/machine) /datum/species/preternis/on_species_loss(mob/living/carbon/human/C, datum/species/new_species, pref_load) . = ..() @@ -58,6 +58,8 @@ adjust_charge - take a positive or negative value to adjust the charge level C.clear_alert("preternis_emag") //this means a changeling can transform from and back to a preternis to clear the emag status but w/e i cant find a solution to not do that C.clear_fullscreen("preternis_emag") C.remove_movespeed_modifier(/datum/movespeed_modifier/reagent/preternis_teslium, TRUE) + if(C.job != "Curator")// if not curator, removes the encoded audio language. + C.remove_language(/datum/language/machine) /datum/species/preternis/proc/on_emp_act(mob/living/carbon/human/H, severity) SIGNAL_HANDLER From 525ecf5ff308f377de5ff593ea38e33bb2ca4879 Mon Sep 17 00:00:00 2001 From: SuperSlayer <91609255+SuperSlayer0@users.noreply.github.com> Date: Thu, 18 Aug 2022 16:03:07 +0300 Subject: [PATCH 14/19] defib --- code/game/objects/items/defib.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/game/objects/items/defib.dm b/code/game/objects/items/defib.dm index fbfa8da26b9..4fbd9ddeab5 100644 --- a/code/game/objects/items/defib.dm +++ b/code/game/objects/items/defib.dm @@ -634,8 +634,8 @@ var/mobhealth = H.health H.adjustOxyLoss((mobhealth - HALFWAYCRITDEATH) * (H.getOxyLoss() / overall_damage), 0) H.adjustToxLoss((mobhealth - HALFWAYCRITDEATH) * (H.getToxLoss() / overall_damage), 0, TRUE) // force tox heal for toxin lovers too - H.adjustFireLoss((mobhealth - HALFWAYCRITDEATH) * (total_burn / overall_damage), 0) - H.adjustBruteLoss((mobhealth - HALFWAYCRITDEATH) * (total_brute / overall_damage), 0) + H.adjustFireLoss((mobhealth - HALFWAYCRITDEATH) * (total_burn / overall_damage), 0, required_status = BODYPART_ANY) + H.adjustBruteLoss((mobhealth - HALFWAYCRITDEATH) * (total_brute / overall_damage), 0, required_status = BODYPART_ANY) H.updatehealth() // Previous "adjust" procs don't update health, so we do it manually. user.visible_message(span_notice("[req_defib ? "[defib]" : "[src]"] pings: Resuscitation successful.")) playsound(src, 'sound/machines/defib_success.ogg', 50, FALSE) From 4b1ea581e00dbd7ac52cedfda71ecd064f7c2ef4 Mon Sep 17 00:00:00 2001 From: SuperSlayer <91609255+SuperSlayer0@users.noreply.github.com> Date: Thu, 18 Aug 2022 16:04:47 +0300 Subject: [PATCH 15/19] e --- .../carbon/human/species_types/preternis/power_suck.dm | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/code/modules/mob/living/carbon/human/species_types/preternis/power_suck.dm b/code/modules/mob/living/carbon/human/species_types/preternis/power_suck.dm index d044cfedc43..522090c5ada 100644 --- a/code/modules/mob/living/carbon/human/species_types/preternis/power_suck.dm +++ b/code/modules/mob/living/carbon/human/species_types/preternis/power_suck.dm @@ -6,6 +6,11 @@ return drain_power_from(H, A) /datum/species/preternis/proc/drain_power_from(mob/living/carbon/human/H, atom/A) + + if(get_dist(get_turf(H), get_turf(A)) > 1) + to_chat(H, span_warning("[A] is too far away!")) + return FALSE + if(!istype(H) || !A) return FALSE From 64d7b45cf1c9b67f249e95130051c4c1289c0eaa Mon Sep 17 00:00:00 2001 From: SuperSlayer <91609255+SuperSlayer0@users.noreply.github.com> Date: Thu, 18 Aug 2022 16:11:55 +0300 Subject: [PATCH 16/19] final maybe idk --- code/game/objects/items/inducer.dm | 32 ++++++++++++ .../changeling/powers/augmented_eyesight.dm | 5 ++ .../components/unary_devices/cryo.dm | 2 +- .../human/species_types/preternis/organs.dm | 52 +++++++++++++++---- .../species_types/preternis/preternis.dm | 4 +- 5 files changed, 84 insertions(+), 11 deletions(-) diff --git a/code/game/objects/items/inducer.dm b/code/game/objects/items/inducer.dm index 7d29a4ce4a7..619a08eefaf 100644 --- a/code/game/objects/items/inducer.dm +++ b/code/game/objects/items/inducer.dm @@ -107,6 +107,38 @@ if(istype(A, /obj/item/gun/energy)) to_chat(user, span_alert("Error unable to interface with device.")) return FALSE + if(ishuman(A)) + var/mob/living/carbon/human/H = A + if(ispreternis(H)) //let's charge some dumb robot players + if(user.zone_selected != BODY_ZONE_CHEST) + to_chat(user, span_warning("You need to target [A]'s chest with [src] to recharge [H.p_them()]!")) + recharging = FALSE + return TRUE + coefficient = 0.1 + var/totransfer = min(cell.charge,(powertransfer * coefficient)) + var/datum/species/preternis/preternis = H.dna.species + var/done_any = FALSE + if(preternis.charge >= PRETERNIS_LEVEL_FULL - 25) + to_chat(user, span_notice("[A] is fully charged!")) + recharging = FALSE + return TRUE + user.visible_message("[user] starts recharging [A] with [src].",span_notice("You start recharging [A] with [src].")) + while(preternis.charge < PRETERNIS_LEVEL_FULL - 25) + if(do_after(user, 1 SECONDS, target = user) && cell.charge) + done_any = TRUE + cell.use(totransfer*coefficient) + preternis.charge = clamp(preternis.charge + (powertransfer*coefficient), PRETERNIS_LEVEL_NONE, PRETERNIS_LEVEL_FULL) + H.apply_damage(totransfer*coefficient, BURN, BODY_ZONE_CHEST, wound_bonus = CANT_WOUND) + user.visible_message("Smoke rises off of [A]'s body!",span_notice("You smell something burning as [A] is charged by the [src]!")) + do_sparks(1, FALSE, A) + if(O) + O.update_icon() + else + break + if(done_any) // Only show a message if we succeeded at least once + user.visible_message("[user] recharged [A]!",span_notice("You recharged [A]!")) + recharging = FALSE + return TRUE if(istype(A, /obj)) O = A if(C) diff --git a/code/modules/antagonists/changeling/powers/augmented_eyesight.dm b/code/modules/antagonists/changeling/powers/augmented_eyesight.dm index 19f211014a8..d96afc95a41 100644 --- a/code/modules/antagonists/changeling/powers/augmented_eyesight.dm +++ b/code/modules/antagonists/changeling/powers/augmented_eyesight.dm @@ -25,6 +25,11 @@ ..() var/obj/item/organ/eyes/E = user.getorganslot(ORGAN_SLOT_EYES) if(E) + if(istype(E, /obj/item/organ/eyes/robotic/preternis)) + E.Remove(user, 1) + var/obj/item/organ/eyes/neweyes = new(user) + neweyes.Insert(user, 1) + neweyes.flash_protect = 2 if(!active) E.sight_flags |= SEE_MOBS | SEE_OBJS | SEE_TURFS //Add sight flags to the user's eyes E.flash_protect = FLASH_PROTECTION_SENSITIVE //Adjust the user's eyes' flash protection diff --git a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm index bcdbcecde9f..1a8e4549396 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm @@ -238,7 +238,7 @@ GLOBAL_VAR_INIT(cryo_overlay_cover_off, mutable_appearance('icons/obj/cryogenics if(mob_occupant.stat == DEAD) // We don't bother with dead people. return - if(HAS_TRAIT(mob_occupant,TRAIT_MEDICALIGNORE)) + if(HAS_TRAIT(mob_occupant,TRAIT_MEDICALIGNORE) && !(mob_occupant.getCloneLoss() + mob_occupant.getToxLoss() + mob_occupant.getOxyLoss())) src.visible_message("[src] is unable to treat [mob_occupant] as they cannot be treated with conventional medicine.") playsound(src,'sound/machines/cryo_warning_ignore.ogg',60,1) on = FALSE diff --git a/code/modules/mob/living/carbon/human/species_types/preternis/organs.dm b/code/modules/mob/living/carbon/human/species_types/preternis/organs.dm index 017ad3e7c3b..2de22f1616c 100644 --- a/code/modules/mob/living/carbon/human/species_types/preternis/organs.dm +++ b/code/modules/mob/living/carbon/human/species_types/preternis/organs.dm @@ -1,12 +1,25 @@ -/obj/item/organ/eyes/preternis +/obj/item/organ/eyes/robotic/preternis name = "preternis eyes" - desc = "An experimental upgraded version of eyes that can see in the dark.They are designed to fit preternis" + desc = "An experimental upgraded version of eyes that can see in the dark. They are designed to fit preternis" see_in_dark = PRETERNIS_NV_ON lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE + //preternis eyes need to be powered by a preternis to function, in a non preternis they slowly power down to blindness + organ_flags = ORGAN_SYNTHETIC + + low_threshold_passed = span_info("Your Preternis eyes switch to battery saver mode.") + high_threshold_passed = span_info("Your Preternis eyes only show a sliver of battery life left!") + now_failing = span_warning("An empty battery icon is all you can see as your eyes shut off!") + now_fixed = span_info("Lines of text scroll in your vision as your eyes begin rebooting.") + high_threshold_cleared = span_info("Your Preternis eyes have recharged enough to re-enable most functionality.") + low_threshold_cleared = span_info("Your Preternis eyes have almost fully recharged.") + var/powered = TRUE actions_types = list(/datum/action/item_action/organ_action/use) var/night_vision = TRUE -/obj/item/organ/eyes/preternis/ui_action_click() +/obj/item/organ/eyes/robotic/preternis/ui_action_click() + if(damage > low_threshold) + //no nightvision if your eyes are hurt + return var/datum/species/preternis/S = owner.dna.species if(S.charge < PRETERNIS_LEVEL_FED) return @@ -23,14 +36,24 @@ sight_flags &= ~SEE_BLACKNESS owner.update_sight() -/obj/item/organ/eyes/preternis/on_life() +/obj/item/organ/eyes/robotic/preternis/on_life() . = ..() - if(!ispreternis(owner)) - qdel(src) //these eyes depend on being inside a preternis - + if(!owner) return - var/datum/species/preternis/S = owner.dna.species - if(S.charge >= PRETERNIS_LEVEL_FED) + if(ispreternis(owner) && !powered) + powered = TRUE + to_chat(owner, span_notice("A battery icon disappears from your vision as your [src] switch to external power.")) + if(!ispreternis(owner) && powered) //these eyes depend on being inside a preternis for power + powered = FALSE + to_chat(owner, span_boldwarning("Your [src] flash warnings that they've lost their power source, and are running on emergency power!")) + if(powered) + //when powered, they recharge by healing + owner.adjustOrganLoss(ORGAN_SLOT_EYES,-0.5) + else + //to simulate running out of power, they take damage + owner.adjustOrganLoss(ORGAN_SLOT_EYES,0.5) + + if(damage < low_threshold) if(see_in_dark == PRETERNIS_NV_OFF) see_in_dark = PRETERNIS_NV_ON owner.update_sight() @@ -43,6 +66,17 @@ sight_flags &= ~SEE_BLACKNESS owner.update_sight() +/obj/item/organ/eyes/robotic/preternis/examine(mob/user) + . = ..() + if(status == ORGAN_ROBOTIC && (organ_flags & ORGAN_FAILING)) + . += span_warning("[src] appears to be completely out of charge. However, that's nothing popping them back in a Preternis wouldn't fix.") + + else if(organ_flags & ORGAN_FAILING) + . += span_warning("[src] appears to be completely out of charge. If they were put back in a Preternis they would surely recharge in time.") + + else if(damage > high_threshold) + . += span_warning("[src] seem to flicker on and off. They must be pretty low on charge without being in a Preternis") + /obj/item/organ/lungs/preternis name = "preternis lungs" desc = "An experimental set of lungs. Due to the cybernetic nature of these lungs,they are less resistant to heat and cold but are more efficent at filtering oxygen." diff --git a/code/modules/mob/living/carbon/human/species_types/preternis/preternis.dm b/code/modules/mob/living/carbon/human/species_types/preternis/preternis.dm index 4d178c12e26..ca7e6e4167c 100644 --- a/code/modules/mob/living/carbon/human/species_types/preternis/preternis.dm +++ b/code/modules/mob/living/carbon/human/species_types/preternis/preternis.dm @@ -15,10 +15,12 @@ adjust_charge - take a positive or negative value to adjust the charge level attack_verb = "assault" meat = /obj/item/food/meat/slab/synthmeat toxic_food = NONE + liked_food = FRIED | SUGAR | JUNKFOOD | FRUIT + disliked_food = GROSS | VEGETABLES brutemod = 1.25 burnmod = 1.5 draw_robot_hair = TRUE - mutanteyes = /obj/item/organ/eyes/preternis + mutanteyes = /obj/item/organ/eyes/robotic/preternis mutantlungs = /obj/item/organ/lungs/preternis virus_infect_chance = 20 virus_resistance_boost = 10 //YEOUTCH,good luck getting it out From 58f4ce2c3774843bda77b6a56046bc4f2890706c Mon Sep 17 00:00:00 2001 From: SuperSlayer <91609255+SuperSlayer0@users.noreply.github.com> Date: Fri, 19 Aug 2022 19:31:33 +0300 Subject: [PATCH 17/19] fix --- .../living/carbon/human/species_types/preternis/preternis.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/living/carbon/human/species_types/preternis/preternis.dm b/code/modules/mob/living/carbon/human/species_types/preternis/preternis.dm index ca7e6e4167c..7a5434a7198 100644 --- a/code/modules/mob/living/carbon/human/species_types/preternis/preternis.dm +++ b/code/modules/mob/living/carbon/human/species_types/preternis/preternis.dm @@ -9,7 +9,7 @@ adjust_charge - take a positive or negative value to adjust the charge level id = "preternis" default_color = "FFFFFF" changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_PRIDE | MIRROR_MAGIC | RACE_SWAP | ERT_SPAWN | SLIME_EXTRACT - inherent_traits = list(TRAIT_NOHUNGER,TRAIT_RADIMMUNE,TRAIT_MEDICALIGNORE) + inherent_traits = list(TRAIT_NOHUNGER,TRAIT_RADIMMUNE,TRAIT_MEDICALIGNORE, TRAIT_ADVANCEDTOOLUSER, TRAIT_CAN_STRIP) species_traits = list(EYECOLOR,HAIR,LIPS) say_mod = "intones" attack_verb = "assault" From 23094955c1b20d0a8974518da5b24402193645db Mon Sep 17 00:00:00 2001 From: SuperSlayer <91609255+SuperSlayer0@users.noreply.github.com> Date: Fri, 19 Aug 2022 19:46:18 +0300 Subject: [PATCH 18/19] another fix --- .../carbon/human/species_types/preternis/screen_alerts.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/living/carbon/human/species_types/preternis/screen_alerts.dm b/code/modules/mob/living/carbon/human/species_types/preternis/screen_alerts.dm index 73950fe0adc..5a4435fe5ff 100644 --- a/code/modules/mob/living/carbon/human/species_types/preternis/screen_alerts.dm +++ b/code/modules/mob/living/carbon/human/species_types/preternis/screen_alerts.dm @@ -5,4 +5,4 @@ /atom/movable/screen/alert/preternis_charge name = "Low power" desc = "Find a power cell to recharge from or you may lose power." - icon_state = "lowcell" + icon_state = "low_cell" From a22b0c375ffda58bc09d9531dea6540b4ed786fc Mon Sep 17 00:00:00 2001 From: SuperSlayer <91609255+SuperSlayer0@users.noreply.github.com> Date: Sat, 27 Aug 2022 09:13:43 +0300 Subject: [PATCH 19/19] Update organs.dm --- .../mob/living/carbon/human/species_types/preternis/organs.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/living/carbon/human/species_types/preternis/organs.dm b/code/modules/mob/living/carbon/human/species_types/preternis/organs.dm index 2de22f1616c..a7d98834918 100644 --- a/code/modules/mob/living/carbon/human/species_types/preternis/organs.dm +++ b/code/modules/mob/living/carbon/human/species_types/preternis/organs.dm @@ -1,4 +1,4 @@ -/obj/item/organ/eyes/robotic/preternis +/obj/item/organ/eyes/robotic/preternis name = "preternis eyes" desc = "An experimental upgraded version of eyes that can see in the dark. They are designed to fit preternis" see_in_dark = PRETERNIS_NV_ON