From bbcd6d30091d170098f12af6a416a5adf3421f0a Mon Sep 17 00:00:00 2001 From: LiquidPotroh <100733800+LiquidPotroh@users.noreply.github.com> Date: Tue, 7 Nov 2023 20:28:17 +0300 Subject: [PATCH] balance: Virology (#3703) --- code/__HELPERS/global_lists.dm | 38 +-- code/datums/diseases/_MobProcs.dm | 239 +++++++------ code/datums/diseases/_disease.dm | 315 ++++++++++-------- code/datums/diseases/anxiety.dm | 42 --- code/datums/diseases/appendicitis.dm | 159 +++++++-- code/datums/diseases/beesease.dm | 40 --- code/datums/diseases/berserker.dm | 19 +- code/datums/diseases/brainrot.dm | 58 ---- code/datums/diseases/cold.dm | 66 ---- code/datums/diseases/cold9.dm | 39 --- code/datums/diseases/critical.dm | 96 +++--- code/datums/diseases/fake_gbs.dm | 32 -- code/datums/diseases/flu.dm | 52 --- code/datums/diseases/food_poisoning.dm | 70 ++-- code/datums/diseases/gbs.dm | 51 --- code/datums/diseases/kingstons.dm | 100 ------ code/datums/diseases/kuru.dm | 32 +- code/datums/diseases/lycancoughy.dm | 54 --- code/datums/diseases/magnitis.dm | 63 ---- code/datums/diseases/pierrot_throat.dm | 66 ---- code/datums/diseases/retrovirus.dm | 83 ----- code/datums/diseases/rhumba_beat.dm | 40 --- code/datums/diseases/transformation.dm | 256 -------------- code/datums/diseases/tuberculosis.dm | 59 ---- code/datums/diseases/vampire.dm | 24 +- code/datums/diseases/viruses/_virus.dm | 89 +++++ .../diseases/{ => viruses}/advance/advance.dm | 241 +++++++------- .../diseases/{ => viruses}/advance/presets.dm | 54 +-- .../{ => viruses}/advance/symptoms/beard.dm | 8 +- .../{ => viruses}/advance/symptoms/blood.dm | 6 +- .../{ => viruses}/advance/symptoms/bones.dm | 4 +- .../{ => viruses}/advance/symptoms/booze.dm | 4 +- .../{ => viruses}/advance/symptoms/choking.dm | 12 +- .../advance/symptoms/confusion.dm | 6 +- .../{ => viruses}/advance/symptoms/cough.dm | 4 +- .../advance/symptoms/damage_converter.dm | 5 +- .../advance/symptoms/deafness.dm | 8 +- .../{ => viruses}/advance/symptoms/dizzy.dm | 10 +- .../advance/symptoms/epinephrine.dm | 4 +- .../{ => viruses}/advance/symptoms/fever.dm | 6 +- .../{ => viruses}/advance/symptoms/fire.dm | 12 +- .../advance/symptoms/flesh_eating.dm | 8 +- .../advance/symptoms/hallucigen.dm | 8 +- .../advance/symptoms/headache.dm | 4 +- .../{ => viruses}/advance/symptoms/heal.dm | 55 +-- .../{ => viruses}/advance/symptoms/itching.dm | 4 +- .../{ => viruses}/advance/symptoms/laugh.dm | 2 +- .../advance/symptoms/limb_throw.dm | 14 +- .../{ => viruses}/advance/symptoms/love.dm | 2 +- .../{ => viruses}/advance/symptoms/moan.dm | 9 +- .../{ => viruses}/advance/symptoms/oxygen.dm | 4 +- .../advance/symptoms/painkiller.dm | 6 +- .../{ => viruses}/advance/symptoms/sensory.dm | 6 +- .../advance/symptoms/shedding.dm | 8 +- .../advance/symptoms/shivering.dm | 6 +- .../{ => viruses}/advance/symptoms/skin.dm | 8 +- .../{ => viruses}/advance/symptoms/sneeze.dm | 2 +- .../advance/symptoms/symptoms.dm | 6 +- .../advance/symptoms/toxification.dm | 6 +- .../advance/symptoms/uncotrollable.dm | 4 +- .../{ => viruses}/advance/symptoms/viral.dm | 12 +- .../{ => viruses}/advance/symptoms/vision.dm | 10 +- .../advance/symptoms/voice_change.dm | 6 +- .../{ => viruses}/advance/symptoms/vomit.dm | 4 +- .../advance/symptoms/weakness.dm | 12 +- .../{ => viruses}/advance/symptoms/weight.dm | 6 +- .../{ => viruses}/advance/symptoms/youth.dm | 12 +- code/datums/diseases/viruses/anxiety.dm | 45 +++ code/datums/diseases/viruses/beesease.dm | 59 ++++ code/datums/diseases/viruses/brainrot.dm | 52 +++ code/datums/diseases/viruses/cold.dm | 49 +++ code/datums/diseases/viruses/flu.dm | 47 +++ .../diseases/{ => viruses}/fluspanish.dm | 34 +- code/datums/diseases/viruses/gbs.dm | 69 ++++ code/datums/diseases/viruses/kingstons.dm | 144 ++++++++ .../{ => viruses}/loyalty_syndrome.dm | 75 +++-- code/datums/diseases/viruses/lycancoughy.dm | 57 ++++ code/datums/diseases/viruses/magnitis.dm | 65 ++++ .../datums/diseases/viruses/pierrot_throat.dm | 60 ++++ code/datums/diseases/viruses/retrovirus.dm | 68 ++++ code/datums/diseases/viruses/rhumba_beat.dm | 41 +++ .../datums/diseases/viruses/transformation.dm | 268 +++++++++++++++ code/datums/diseases/viruses/tuberculosis.dm | 59 ++++ .../diseases/{ => viruses}/wizarditis.dm | 79 +++-- code/datums/supplypacks.dm | 4 +- code/datums/syndiesupplypacks.dm | 4 +- code/game/data_huds.dm | 10 +- code/game/gamemodes/clockwork/cogscarab.dm | 2 +- code/game/gamemodes/cult/runes.dm | 2 +- .../gamemodes/miniantags/abduction/gland.dm | 34 +- code/game/gamemodes/nuclear/nuclearbomb.dm | 2 + code/game/machinery/Freezer.dm | 3 + code/game/machinery/Sleeper.dm | 3 + code/game/machinery/adv_med.dm | 11 +- code/game/machinery/atmoalter/canister.dm | 3 + code/game/machinery/atmoalter/pump.dm | 3 + code/game/machinery/atmoalter/scrubber.dm | 3 + code/game/machinery/cloning.dm | 2 +- code/game/machinery/computer/aifixer.dm | 2 + code/game/machinery/computer/atmos_alert.dm | 3 + code/game/machinery/computer/brigcells.dm | 4 + code/game/machinery/computer/cloning.dm | 3 + code/game/machinery/computer/crew.dm | 4 + code/game/machinery/computer/law.dm | 3 + code/game/machinery/computer/medical.dm | 4 +- .../computer/pod_tracking_console.dm | 3 + code/game/machinery/computer/power.dm | 4 + code/game/machinery/computer/salvage_ship.dm | 3 + code/game/machinery/computer/sm_monitor.dm | 4 + code/game/machinery/computer/station_alert.dm | 4 + code/game/machinery/computer/store.dm | 3 + code/game/machinery/computer/syndie_cargo.dm | 3 + code/game/machinery/cryo.dm | 3 + code/game/machinery/machinery.dm | 6 +- code/game/machinery/syndicatebomb.dm | 3 + code/game/machinery/teleporter.dm | 2 + code/game/machinery/turret_control.dm | 2 + code/game/machinery/vending.dm | 3 + code/game/mecha/mecha_control_console.dm | 3 + code/game/objects/items/devices/scanners.dm | 8 +- code/game/objects/items/stacks/nanopaste.dm | 8 +- .../items/weapons/storage/artistic_toolbox.dm | 18 +- code/modules/admin/admin_verbs.dm | 7 +- .../antagonists/changeling/powers/panacea.dm | 2 +- .../goon_vampire/goon_vampire_powers.dm | 4 +- .../ninja_status_read.dm | 6 +- .../vampire/vampire_powers/bestia_powers.dm | 9 +- .../arcade/mob_hunt/battle_computer.dm | 3 + code/modules/awaymissions/corpse.dm | 9 +- .../awaymissions/mission_code/academy.dm | 4 +- code/modules/clothing/suits/labcoat.dm | 1 + code/modules/economy/Accounts_DB.dm | 3 + code/modules/events/disease_outbreak.dm | 52 +-- .../events/spontaneous_appendicitis.dm | 6 +- .../food_and_drinks/drinks/bottler/bottler.dm | 4 + .../kitchen_machinery/juicer.dm | 3 + .../kitchen_machinery/smartfridge.dm | 8 +- code/modules/hydroponics/seed_extractor.dm | 2 + code/modules/mining/laborcamp/laborstacker.dm | 3 + .../mining/lavaland/loot/ashdragon_loot.dm | 6 +- code/modules/mining/machine_stacking.dm | 3 + .../mob/living/carbon/carbon_defense.dm | 16 +- .../mob/living/carbon/human/human_damage.dm | 10 + code/modules/mob/living/carbon/human/life.dm | 27 +- .../living/carbon/human/species/_species.dm | 21 ++ code/modules/mob/living/carbon/life.dm | 9 - code/modules/mob/living/life.dm | 6 +- code/modules/mob/living/living.dm | 5 +- .../mob/living/simple_animal/bot/medbot.dm | 6 +- .../mob/living/simple_animal/friendly/dog.dm | 10 + .../mob/living/simple_animal/hostile/bees.dm | 2 +- code/modules/mob/living/status_procs.dm | 4 +- code/modules/mob/mob.dm | 2 +- code/modules/mob/mob_defines.dm | 2 +- code/modules/mob/mob_grab.dm | 10 + code/modules/paperwork/faxmachine.dm | 3 + code/modules/paperwork/paper.dm | 10 +- code/modules/power/apc.dm | 4 + code/modules/power/singularity/collector.dm | 3 + .../particle_accelerator/particle_control.dm | 3 + code/modules/power/smes.dm | 3 + .../chemistry/machinery/chem_dispenser.dm | 4 + .../chemistry/machinery/chem_heater.dm | 2 + .../reagents/chemistry/machinery/pandemic.dm | 45 ++- .../chemistry/machinery/reagentgrinder.dm | 8 +- .../reagents/chemistry/reagents/admin.dm | 4 +- .../reagents/chemistry/reagents/disease.dm | 27 +- .../reagents/chemistry/reagents/food.dm | 9 +- .../reagents/chemistry/reagents/medicine.dm | 2 +- .../reagents/chemistry/reagents/ninja.dm | 2 +- .../reagents/chemistry/reagents/toxins.dm | 61 +++- .../reagents/chemistry/reagents/water.dm | 30 +- .../reagents/chemistry/recipes/others.dm | 4 +- .../reagents/reagent_containers/bottle.dm | 90 ++--- .../reagents/reagent_containers/dropper.dm | 2 +- code/modules/research/experimentor.dm | 3 + code/modules/research/message_server.dm | 2 + code/modules/research/rdmachines.dm | 2 + code/modules/research/server.dm | 5 + code/modules/shuttle/shuttle_manipulator.dm | 2 + code/modules/shuttle/supply.dm | 3 + code/modules/station_goals/bfl.dm | 4 + code/modules/station_goals/bluespace_tap.dm | 3 + code/modules/surgery/organs/blood.dm | 8 +- code/modules/surgery/organs/heart.dm | 12 +- code/modules/surgery/organs/organ_icon.dm | 1 + code/modules/surgery/organs/organ_internal.dm | 8 +- paradise.dme | 119 ++++--- sound/creatures/bee2.ogg | Bin 0 -> 7065 bytes sound/creatures/bee3.ogg | Bin 0 -> 22850 bytes sound/creatures/bee4.ogg | Bin 0 -> 70668 bytes sound/effects/magnitis.ogg | Bin 0 -> 33748 bytes 192 files changed, 2744 insertions(+), 2259 deletions(-) delete mode 100644 code/datums/diseases/anxiety.dm delete mode 100644 code/datums/diseases/beesease.dm delete mode 100644 code/datums/diseases/brainrot.dm delete mode 100644 code/datums/diseases/cold.dm delete mode 100644 code/datums/diseases/cold9.dm delete mode 100644 code/datums/diseases/fake_gbs.dm delete mode 100644 code/datums/diseases/flu.dm delete mode 100644 code/datums/diseases/gbs.dm delete mode 100644 code/datums/diseases/kingstons.dm delete mode 100644 code/datums/diseases/lycancoughy.dm delete mode 100644 code/datums/diseases/magnitis.dm delete mode 100644 code/datums/diseases/pierrot_throat.dm delete mode 100644 code/datums/diseases/retrovirus.dm delete mode 100644 code/datums/diseases/rhumba_beat.dm delete mode 100644 code/datums/diseases/transformation.dm delete mode 100644 code/datums/diseases/tuberculosis.dm create mode 100644 code/datums/diseases/viruses/_virus.dm rename code/datums/diseases/{ => viruses}/advance/advance.dm (59%) rename code/datums/diseases/{ => viruses}/advance/presets.dm (63%) rename code/datums/diseases/{ => viruses}/advance/symptoms/beard.dm (83%) rename code/datums/diseases/{ => viruses}/advance/symptoms/blood.dm (79%) rename code/datums/diseases/{ => viruses}/advance/symptoms/bones.dm (94%) rename code/datums/diseases/{ => viruses}/advance/symptoms/booze.dm (74%) rename code/datums/diseases/{ => viruses}/advance/symptoms/choking.dm (64%) rename code/datums/diseases/{ => viruses}/advance/symptoms/confusion.dm (74%) rename code/datums/diseases/{ => viruses}/advance/symptoms/cough.dm (79%) rename code/datums/diseases/{ => viruses}/advance/symptoms/damage_converter.dm (90%) rename code/datums/diseases/{ => viruses}/advance/symptoms/deafness.dm (65%) rename code/datums/diseases/{ => viruses}/advance/symptoms/dizzy.dm (64%) rename code/datums/diseases/{ => viruses}/advance/symptoms/epinephrine.dm (83%) rename code/datums/diseases/{ => viruses}/advance/symptoms/fever.dm (76%) rename code/datums/diseases/{ => viruses}/advance/symptoms/fire.dm (75%) rename code/datums/diseases/{ => viruses}/advance/symptoms/flesh_eating.dm (66%) rename code/datums/diseases/{ => viruses}/advance/symptoms/hallucigen.dm (52%) rename code/datums/diseases/{ => viruses}/advance/symptoms/headache.dm (75%) rename code/datums/diseases/{ => viruses}/advance/symptoms/heal.dm (60%) rename code/datums/diseases/{ => viruses}/advance/symptoms/itching.dm (76%) rename code/datums/diseases/{ => viruses}/advance/symptoms/laugh.dm (92%) rename code/datums/diseases/{ => viruses}/advance/symptoms/limb_throw.dm (76%) rename code/datums/diseases/{ => viruses}/advance/symptoms/love.dm (93%) rename code/datums/diseases/{ => viruses}/advance/symptoms/moan.dm (78%) rename code/datums/diseases/{ => viruses}/advance/symptoms/oxygen.dm (76%) rename code/datums/diseases/{ => viruses}/advance/symptoms/painkiller.dm (67%) rename code/datums/diseases/{ => viruses}/advance/symptoms/sensory.dm (81%) rename code/datums/diseases/{ => viruses}/advance/symptoms/shedding.dm (75%) rename code/datums/diseases/{ => viruses}/advance/symptoms/shivering.dm (83%) rename code/datums/diseases/{ => viruses}/advance/symptoms/skin.dm (77%) rename code/datums/diseases/{ => viruses}/advance/symptoms/sneeze.dm (90%) rename code/datums/diseases/{ => viruses}/advance/symptoms/symptoms.dm (82%) rename code/datums/diseases/{ => viruses}/advance/symptoms/toxification.dm (86%) rename code/datums/diseases/{ => viruses}/advance/symptoms/uncotrollable.dm (97%) rename code/datums/diseases/{ => viruses}/advance/symptoms/viral.dm (68%) rename code/datums/diseases/{ => viruses}/advance/symptoms/vision.dm (75%) rename code/datums/diseases/{ => viruses}/advance/symptoms/voice_change.dm (80%) rename code/datums/diseases/{ => viruses}/advance/symptoms/vomit.dm (91%) rename code/datums/diseases/{ => viruses}/advance/symptoms/weakness.dm (54%) rename code/datums/diseases/{ => viruses}/advance/symptoms/weight.dm (67%) rename code/datums/diseases/{ => viruses}/advance/symptoms/youth.dm (65%) create mode 100644 code/datums/diseases/viruses/anxiety.dm create mode 100644 code/datums/diseases/viruses/beesease.dm create mode 100644 code/datums/diseases/viruses/brainrot.dm create mode 100644 code/datums/diseases/viruses/cold.dm create mode 100644 code/datums/diseases/viruses/flu.dm rename code/datums/diseases/{ => viruses}/fluspanish.dm (55%) create mode 100644 code/datums/diseases/viruses/gbs.dm create mode 100644 code/datums/diseases/viruses/kingstons.dm rename code/datums/diseases/{ => viruses}/loyalty_syndrome.dm (71%) create mode 100644 code/datums/diseases/viruses/lycancoughy.dm create mode 100644 code/datums/diseases/viruses/magnitis.dm create mode 100644 code/datums/diseases/viruses/pierrot_throat.dm create mode 100644 code/datums/diseases/viruses/retrovirus.dm create mode 100644 code/datums/diseases/viruses/rhumba_beat.dm create mode 100644 code/datums/diseases/viruses/transformation.dm create mode 100644 code/datums/diseases/viruses/tuberculosis.dm rename code/datums/diseases/{ => viruses}/wizarditis.dm (60%) create mode 100644 sound/creatures/bee2.ogg create mode 100644 sound/creatures/bee3.ogg create mode 100644 sound/creatures/bee4.ogg create mode 100644 sound/effects/magnitis.ogg diff --git a/code/__HELPERS/global_lists.dm b/code/__HELPERS/global_lists.dm index a09c218e9b9..410253a2749 100644 --- a/code/__HELPERS/global_lists.dm +++ b/code/__HELPERS/global_lists.dm @@ -158,25 +158,25 @@ // Init disease archive GLOB.archive_diseases += list( - "sneeze" = new /datum/disease/advance/preset/cold(), - "cough" = new /datum/disease/advance/preset/flu(), - "voice_change" = new /datum/disease/advance/preset/voice_change(), - "heal" = new /datum/disease/advance/preset/heal(), - "hallucigen" = new /datum/disease/advance/preset/hullucigen(), - "sensory_restoration" = new /datum/disease/advance/preset/sensory_restoration(), - "mind_restoration" = new /datum/disease/advance/preset/mind_restoration(), - "damage_converter:heal:viralevolution" = new /datum/disease/advance/preset/advanced_regeneration(), - "dizzy:flesh_eating:viraladaptation:youth" = new /datum/disease/advance/preset/stealth_necrosis(), - "beard:itching:voice_change" = new /datum/disease/advance/preset/pre_kingstons(), - "love" = new /datum/disease/advance/preset/love(), - "aggression" = new /datum/disease/advance/preset/aggression(), - "obsession" = new /datum/disease/advance/preset/obsession(), - "confusion" = new /datum/disease/advance/preset/confusion(), - "bones" = new /datum/disease/advance/preset/bones(), - "laugh" = new /datum/disease/advance/preset/laugh(), - "moan" = new /datum/disease/advance/preset/moan(), - "infection" = new /datum/disease/advance/preset/infection(), - "hallucigen:laugh:moan" = new /datum/disease/advance/preset/pre_loyalty() + "sneeze" = new /datum/disease/virus/advance/preset/sneezing(), + "cough" = new /datum/disease/virus/advance/preset/cough(), + "voice_change" = new /datum/disease/virus/advance/preset/voice_change(), + "heal" = new /datum/disease/virus/advance/preset/heal(), + "hallucigen" = new /datum/disease/virus/advance/preset/hullucigen(), + "sensory_restoration" = new /datum/disease/virus/advance/preset/sensory_restoration(), + "mind_restoration" = new /datum/disease/virus/advance/preset/mind_restoration(), + "damage_converter:heal:viralevolution" = new /datum/disease/virus/advance/preset/advanced_regeneration(), + "dizzy:flesh_eating:viraladaptation:youth" = new /datum/disease/virus/advance/preset/stealth_necrosis(), + "beard:itching:voice_change" = new /datum/disease/virus/advance/preset/pre_kingstons(), + "love" = new /datum/disease/virus/advance/preset/love(), + "aggression" = new /datum/disease/virus/advance/preset/aggression(), + "obsession" = new /datum/disease/virus/advance/preset/obsession(), + "confusion" = new /datum/disease/virus/advance/preset/confusion(), + "bones" = new /datum/disease/virus/advance/preset/bones(), + "laugh" = new /datum/disease/virus/advance/preset/laugh(), + "moan" = new /datum/disease/virus/advance/preset/moan(), + "infection" = new /datum/disease/virus/advance/preset/infection(), + "hallucigen:laugh:moan" = new /datum/disease/virus/advance/preset/pre_loyalty() ) //creates every subtype of prototype (excluding prototype) and adds it to list L. diff --git a/code/datums/diseases/_MobProcs.dm b/code/datums/diseases/_MobProcs.dm index d8c53f7b660..93e16bbccd3 100644 --- a/code/datums/diseases/_MobProcs.dm +++ b/code/datums/diseases/_MobProcs.dm @@ -1,135 +1,134 @@ - -/mob/proc/HasDisease(datum/disease/D) - for(var/thing in viruses) - var/datum/disease/DD = thing - if(D.IsSame(DD)) - return 1 - return 0 - - -/mob/proc/CanContractDisease(datum/disease/D) - if(stat == DEAD) +/mob/proc/HasDisease(disease_type_or_instance) + if(ispath(disease_type_or_instance)) + for(var/datum/disease/D2 in diseases) + if(D2.type == disease_type_or_instance) + return TRUE return FALSE - - if(D.GetDiseaseID() in resistances) - return FALSE - - if(HasDisease(D)) + else if(!istype(disease_type_or_instance, /datum/disease)) return FALSE - if(istype(D, /datum/disease/advance) && count_by_type(viruses, /datum/disease/advance) > 0) - return FALSE - - if(!(type in D.viable_mobtypes)) - return -1 //for stupid fucking monkies - - return TRUE - - -/mob/proc/ContractDisease(datum/disease/D) - if(!CanContractDisease(D)) - return 0 - D.Contract(src) - -/mob/living/carbon/ContractDisease(datum/disease/D) - if(!CanContractDisease(D)) - return 0 - - var/obj/item/clothing/Cl = null - var/passed = 1 - - var/head_ch = 100 - var/body_ch = 100 - var/hands_ch = 25 - var/feet_ch = 25 - - if(D.spread_flags & CONTACT_HANDS) - head_ch = 0 - body_ch = 0 - hands_ch = 100 - feet_ch = 0 - if(D.spread_flags & CONTACT_FEET) - head_ch = 0 - body_ch = 0 - hands_ch = 0 - feet_ch = 100 - - if(prob(15/D.permeability_mod)) - return - - if(satiety > 0 && prob(satiety/10)) // positive satiety makes it harder to contract the disease. - return - - var/target_zone = pick(head_ch;1,body_ch;2,hands_ch;3,feet_ch;4) - - if(istype(src, /mob/living/carbon/human)) - var/mob/living/carbon/human/H = src - - switch(target_zone) - if(1) - if(isobj(H.head) && !istype(H.head, /obj/item/paper)) - Cl = H.head - passed = prob((Cl.permeability_coefficient*100) - 1) - if(passed && isobj(H.wear_mask)) - Cl = H.wear_mask - passed = prob((Cl.permeability_coefficient*100) - 1) - if(2) - if(isobj(H.wear_suit)) - Cl = H.wear_suit - passed = prob((Cl.permeability_coefficient*100) - 1) - if(passed && isobj(slot_w_uniform)) - Cl = slot_w_uniform - passed = prob((Cl.permeability_coefficient*100) - 1) - if(3) - if(isobj(H.wear_suit) && H.wear_suit.body_parts_covered&HANDS) - Cl = H.wear_suit - passed = prob((Cl.permeability_coefficient*100) - 1) - - if(passed && isobj(H.gloves)) - Cl = H.gloves - passed = prob((Cl.permeability_coefficient*100) - 1) - if(4) - if(isobj(H.wear_suit) && H.wear_suit.body_parts_covered&FEET) - Cl = H.wear_suit - passed = prob((Cl.permeability_coefficient*100) - 1) - - if(passed && isobj(H.shoes)) - Cl = H.shoes - passed = prob((Cl.permeability_coefficient*100) - 1) - - - if(!passed && (D.spread_flags & AIRBORNE) && !internal) - passed = (prob((50*D.permeability_mod) - 1)) - - if(passed) - D.Contract(src) + for(var/datum/disease/D2 in diseases) + if(D2.IsSame(disease_type_or_instance)) + return TRUE + return FALSE +/mob/proc/CureAllDiseases(need_immunity = TRUE) + for(var/datum/disease/D in diseases) + D.cure(need_immunity = need_immunity) /** - * Forces the mob to contract a virus. If the mob can have viruses. Ignores clothing and other protection - * Returns TRUE if it succeeds. False if it doesn't + * A special checks for this type of mob * - * Arguments: - * * D - the disease the mob will try to contract + * Returns: + * * TRUE - if can contract disease + * * FALSE - otherwise */ -//Same as ContractDisease, except never overidden clothes checks -/mob/proc/ForceContractDisease(datum/disease/D) - if(!CanContractDisease(D)) - return FALSE - D.Contract(src) +/mob/proc/CanContractDisease(datum/disease/D) return TRUE - /mob/living/carbon/human/CanContractDisease(datum/disease/D) - if((VIRUSIMMUNE in dna.species.species_traits) && !D.bypasses_immunity) - return 0 + if((VIRUSIMMUNE in dna.species.species_traits) && !D.ignore_immunity) + return FALSE for(var/thing in D.required_organs) if(!((locate(thing) in bodyparts) || (locate(thing) in internal_organs))) - return 0 + return FALSE return ..() -/mob/living/carbon/human/lesser/monkey/CanContractDisease(datum/disease/D) - . = ..() - if(. == -1) - if(D.viable_mobtypes.Find(/mob/living/carbon/human)) - return 1 //this is stupid as fuck but because monkeys are only half the time actually subtypes of humans they need this +/** + * Checking mob's protection against disease D by the chosen method in chosen zone + * Returns: + * * TRUE - mob has protected from the virus + * * FALSE - otherwise + */ +/mob/proc/CheckVirusProtection(datum/disease/virus/V, act_type = BITES|CONTACT|AIRBORNE, zone) + if(prob(15/V.permeability_mod)) + return TRUE + + if(satiety > 0 && prob(satiety/10)) + return TRUE + + //virus must to pass all the checks stated in act_type + if((act_type & BITES) && !CheckBitesProtection(V, zone)) + return FALSE + + if((act_type & CONTACT) && !CheckContactProtection(V, zone)) + return FALSE + + if((act_type & AIRBORNE) && !CheckAirborneProtection(V, zone)) + return FALSE + + return TRUE + +//Returns TRUE, if mob protected +/mob/proc/CheckBitesProtection(datum/disease/virus/V, zone) + return FALSE + +/mob/proc/CheckContactProtection(datum/disease/virus/V, zone) + return FALSE + +/mob/proc/CheckAirborneProtection(datum/disease/virus/V, zone) + return FALSE + +/mob/living/CheckBitesProtection(datum/disease/virus/V, zone = BODY_ZONE_CHEST) + return ..() || prob(run_armor_check(zone, "melee") / V.permeability_mod) + +/mob/living/carbon/human/CheckContactProtection(datum/disease/virus/V, zone) + if(..()) + return TRUE + + var/zone_text + if(!zone) + zone_text = pick(40; "head", 40; "chest", 10; "l_arm", 10; "l_leg") + else + if(istype(zone, /obj/item/organ/external)) + var/obj/item/organ/external/E = zone + zone_text = E.limb_name + else + zone_text = zone + + switch(zone_text) + if("head", "eyes", "mouth") + if(ClothingVirusProtection(head) || ClothingVirusProtection(wear_mask)) + return TRUE + if("chest", "groin", "tail", "wing") + if(ClothingVirusProtection(wear_suit) || ClothingVirusProtection(w_uniform)) + return TRUE + if("l_arm", "r_arm", "l_hand", "r_hand") + if(istype(wear_suit) && (wear_suit.body_parts_covered & HANDS) && ClothingVirusProtection(wear_suit)) + return TRUE + if(ClothingVirusProtection(gloves)) + return TRUE + if("l_leg", "r_leg", "l_foot", "r_foot") + if(istype(wear_suit) && (wear_suit.body_parts_covered & FEET) && ClothingVirusProtection(wear_suit)) + return TRUE + if(ClothingVirusProtection(shoes)) + return TRUE + + return FALSE + +/mob/living/carbon/human/CheckAirborneProtection(datum/disease/virus/V, zone) + if(..()) + return TRUE + + var/internals_mod = internal ? 1 : 0.2 + var/permeability_mod = clamp((2 - V.permeability_mod), 0.1, 1) + var/mask_protection_mod = 1 + if(wear_mask && (wear_mask.flags_cover & MASKCOVERSMOUTH)) + mask_protection_mod = 0.3 + if(istype(wear_mask, /obj/item/clothing/mask/breath)) + mask_protection_mod = 0.4 + if(istype(wear_mask, /obj/item/clothing/mask/gas)) + mask_protection_mod = 0.6 + if(istype(wear_mask, /obj/item/clothing/mask/surgical) || istype(wear_mask, /obj/item/clothing/mask/breath/medical)) + mask_protection_mod = 0.9 + + if(prob(100 * permeability_mod * internals_mod * mask_protection_mod)) + return TRUE + + return FALSE + +/mob/living/carbon/human/proc/ClothingVirusProtection(obj/item/Clothing) + //permeability_coefficient == 0.01 => 99% defense; permeability_coefficient == 1 => 0% defense + if(istype(Clothing) && prob(100 * (1 - Clothing.permeability_coefficient))) + return TRUE + return FALSE diff --git a/code/datums/diseases/_disease.dm b/code/datums/diseases/_disease.dm index 3092d82f3e8..e5b2811a226 100644 --- a/code/datums/diseases/_disease.dm +++ b/code/datums/diseases/_disease.dm @@ -1,25 +1,8 @@ - -#define VIRUS_SYMPTOM_LIMIT 6 - //Visibility Flags -#define VISIBLE 0 -#define HIDDEN_SCANNER 1 -#define HIDDEN_PANDEMIC 2 - -//Disease Flags -#define CURABLE 1 -#define CAN_CARRY 2 -#define CAN_RESIST 4 - -//Spread Flags -#define SPECIAL 1 -#define NON_CONTAGIOUS 2 -#define BLOOD 4 -#define CONTACT_FEET 8 -#define CONTACT_HANDS 16 -#define CONTACT_GENERAL 32 -#define AIRBORNE 64 - +#define VISIBLE 0 +#define HIDDEN_HUD 1 //hidden from huds & medbots +#define HIDDEN_SCANNER 2 //hidden from health analyzers & stationary body analyzers +#define HIDDEN_PANDEMIC 4 //hidden from pandemic //Severity Defines #define NONTHREAT "No threat" @@ -29,193 +12,253 @@ #define DANGEROUS "Dangerous!" #define BIOHAZARD "BIOHAZARD THREAT!" - GLOBAL_LIST_INIT(diseases, subtypesof(/datum/disease)) - /datum/disease - //Flags - var/visibility_flags = VISIBLE - var/disease_flags = CURABLE|CAN_CARRY|CAN_RESIST - var/spread_flags = AIRBORNE - //Fluff - var/form = "Virus" - var/name = "No disease" + var/form = "Болезнь" + var/name = "Unknown" var/desc = "" var/agent = "some microbes" - var/spread_text = "" - var/cure_text = "" + var/cure_text = null + var/additional_info = "Болезнь" //Stages + + /// Current stage of disease var/stage = 1 - var/max_stages = 0 + /// Count of stages of disease + var/max_stages = 5 + /// Probability of moving to the next stage for a tick var/stage_prob = 4 - /// The fraction of stages the virus must at least be at to show up on medical HUDs. Rounded up. + + //Visibility + var/visibility_flags = VISIBLE + /// If NONTHREAT, not marked on HUD + var/severity = NONTHREAT + + /// The fraction of stages the disease must at least be at to show up on medical HUDs. Rounded up. var/discovery_threshold = 0.5 - /// If TRUE, this virus will show up on medical HUDs. Automatically set when it reaches mid-stage. + /// If TRUE, this disease will show up on medical HUDs. Automatically set when it reaches mid-stage. var/discovered = FALSE - //Other - var/list/viable_mobtypes = list() //typepaths of viable mobs - var/mob/living/carbon/affected_mob = null - var/list/cures = list() //list of cures if the disease has the CURABLE flag, these are reagent ids - var/infectivity = 65 - var/cure_chance = 8 - var/carrier = FALSE //If our host is only a carrier - var/bypasses_immunity = FALSE //Does it skip species virus immunity check? Some things may diseases and not viruses - var/virus_heal_resistant = FALSE // Some things aren't technically viruses/traditional diseases and should be immune to edge case cure methods, like healing viruses. - var/permeability_mod = 1 - var/severity = NONTHREAT - var/list/required_organs = list() + //Cure & immunity + + /// Сan the disease be cured + var/curable = TRUE + /// List of cures if the disease has curable = TRUE, these are reagent ids + var/list/cures = list() + /// If FASLSE, you need one of any cure from the cures list. Otherwise, you need all the cures from the cure list var/needs_all_cures = TRUE - var/list/strain_data = list() //dna_spread special bullshit + /// Probability of cure for a tick + var/cure_prob = 8 + /// Immunity can be developed from the disease + var/can_immunity = TRUE + /// Does it skip VIRUSIMMUNE trait check + var/ignore_immunity = FALSE + /// Immunity to Anti-Bodies Metabolism symptom + var/virus_heal_resistant = FALSE + /// Message when cured + var/cured_message = "You feel better." + + //Mutations + + /// Probability of mutation if the necessary reagents are in the body var/mutation_chance = 1 + /// Necessary reagents var/list/mutation_reagents = list("mutagen") + /// List of diseases in which it can mutate var/list/possible_mutations + //Other + + /// Mob that is suffering from this disease + var/mob/living/affected_mob + /// Types of infectable mobs + var/list/infectable_mobtypes = list(/mob/living/carbon/human) + /// Required organs + var/list/required_organs = list() + /// If TRUE, disease can progress in dead mobs + var/can_progress_in_dead = FALSE + /// If TRUE, disease can contract dead mobs + var/can_contract_dead = FALSE + /// If TRUE, host not affected by virus, but can spread it (mostly for viruses) + var/carrier = FALSE + /// Infectable mob types, that can only be carriers + var/list/carrier_mobtypes = list() + + +/datum/disease/New() + if(!cure_text) + var/reagents = list() + for(var/id in cures) + var/datum/reagent/R = GLOB.chemical_reagents_list[id] + if(istype(R)) + reagents += R.name + cure_text = english_list(reagents, "Неизлечимо", needs_all_cures ? " & " : " or ") + /datum/disease/Destroy() affected_mob = null GLOB.active_diseases.Remove(src) return ..() + +/** + * Main disease process, that executed every tick + * + * Returns: + * * TRUE - if process finished the work properlly + * * FALSE - if disease was deleted + */ /datum/disease/proc/stage_act() - var/cure = has_cure() + if(!affected_mob) + return FALSE - if(carrier && !cure) - return TRUE + if(affected_mob?.stat == DEAD && !can_progress_in_dead) + return FALSE + var/cure = has_cure() stage = min(stage, max_stages) - if(!cure) - if(prob(stage_prob)) - stage = min(stage + 1,max_stages) - if(!discovered && stage >= CEILING(max_stages * discovery_threshold, 1)) // Once we reach a late enough stage, medical HUDs can pick us up even if we regress - discovered = TRUE - affected_mob.med_hud_set_status() + if(cure) + try_reduce_stage() else - if(prob(cure_chance)) - stage = max(stage - 1, 1) + try_increase_stage() - if(disease_flags & CURABLE) - if(cure && prob(cure_chance)) - cure() - return FALSE + if(curable && cure && prob(cure_prob)) + cure() + return FALSE if(possible_mutations && prob(mutation_chance)) - mutate() - + if(mutate()) + return FALSE return TRUE -/datum/disease/proc/has_cure() - if(!(disease_flags & CURABLE)) - return 0 +/datum/disease/proc/try_increase_stage() + if(prob(stage_prob)) + stage = min(stage + 1, max_stages) + // Once we reach a late enough stage, medical HUDs can pick us up even if we regress + if(!discovered && stage >= CEILING(max_stages * discovery_threshold, 1)) + discovered = TRUE + affected_mob.med_hud_set_status() +/datum/disease/proc/try_reduce_stage() + if(prob(cure_prob)) + stage = max(stage - 1, 1) + +/** + * Returns the number of reagents from the cures list that are in the body + */ +/datum/disease/proc/has_cure() . = cures.len for(var/C_id in cures) - if(!affected_mob.reagents.has_reagent(C_id)) + if(!affected_mob.reagents?.has_reagent(C_id)) .-- - if(!. || (needs_all_cures && . < cures.len)) + if(. <= 0 || (needs_all_cures && . < cures.len)) return 0 -/datum/disease/proc/spread(force_spread = 0) - if(!affected_mob) - return - if((spread_flags & SPECIAL || spread_flags & NON_CONTAGIOUS || spread_flags & BLOOD) && !force_spread) - return +/datum/disease/proc/cure(id = type, need_immunity = TRUE) + if(affected_mob) + if(can_immunity && need_immunity && !(id in affected_mob.resistances)) + affected_mob.resistances += id + affected_mob.diseases -= src + affected_mob.med_hud_set_status() + if(cured_message) + to_chat(affected_mob, span_notice(cured_message)) + qdel(src) - if(affected_mob.reagents.has_reagent("spaceacillin") || (affected_mob.satiety > 0 && prob(affected_mob.satiety/10))) - return - var/spread_range = 1 +/datum/disease/proc/spread() + return - if(force_spread) - spread_range = force_spread +/** + * Basic checks of the possibility of infecting a mob + */ +/datum/disease/proc/CanContract(mob/living/M, act_type, need_protection_check, zone) + . = FALSE + if(!M.CanContractDisease(src)) + return FALSE - if(spread_flags & AIRBORNE) - spread_range++ + if(M.stat == DEAD && !can_contract_dead) + return FALSE - var/turf/T = affected_mob.loc - if(istype(T)) - for(var/mob/living/carbon/C in oview(spread_range, affected_mob)) - var/turf/V = get_turf(C) - if(V) - while(TRUE) - if(V == T) - C.ContractDisease(src) - break - var/turf/Temp = get_step_towards(V, T) - if(!V.CanAtmosPass(Temp)) - break - V = Temp + if(GetDiseaseID() in M.resistances) + return FALSE -/datum/disease/proc/Contract(mob/M) - var/datum/disease/D = new type() - M.viruses += D - D.affected_mob = M - GLOB.active_diseases += D //Add it to the active diseases list, now that it's actually in a mob and being processed. - - //Copy properties over. This is so edited diseases persist. - var/list/skipped = list("affected_mob","holder","carrier","stage","type","parent_type","vars","transformed") - for(var/V in D.vars) - if(V in skipped) - continue - if(istype(D.vars[V],/list)) - var/list/L = vars[V] - D.vars[V] = L.Copy() - else - D.vars[V] = vars[V] + if(M.HasDisease(src)) + return FALSE + + for(var/mobtype in infectable_mobtypes + carrier_mobtypes) + if(istype(M, mobtype)) + . = TRUE + + if(. && need_protection_check && M.CheckVirusProtection(src, act_type, zone)) + . = FALSE - D.affected_mob.med_hud_set_status() return -/datum/disease/proc/cure(resistance = TRUE) - if(affected_mob) - if(disease_flags & CAN_RESIST) - if(!(type in affected_mob.resistances)) - affected_mob.resistances += type - remove_virus() - qdel(src) +/** + * Attempt to infect a mob + * Arguments: + * * act_type - type of contract. Can be BITES, CONTACT, AIRBORNE or combination of them, for example CONTACT|AIRBORNE + * * is_carrier - make this mob a carrier of the virus + * * need_protection_check - check mob's clothing, internals, special masks etc + * * zone - zone of contact ("l_leg", "head", etc or /obj/item/organ/external) + * Returns: + * * /datum/disease/D - a new instance of the virus that contract the mob + * * FALSE - otherwise + */ +/datum/disease/proc/Contract(mob/living/M, act_type, is_carrier = FALSE, need_protection_check = FALSE, zone) + if(!CanContract(M, act_type, need_protection_check, zone)) + return FALSE + + var/datum/disease/D = Copy() + M.diseases += D + D.affected_mob = M + GLOB.active_diseases += D + D.carrier = is_carrier + D.affected_mob.med_hud_set_status() + return D + /datum/disease/proc/IsSame(datum/disease/D) if(src.type == D.type) - return 1 - return 0 + return TRUE + return FALSE /datum/disease/proc/Copy() var/datum/disease/D = new type() - D.strain_data = strain_data.Copy() return D /datum/disease/proc/GetDiseaseID() return type -/datum/disease/proc/IsSpreadByTouch() - if(spread_flags & CONTACT_FEET || spread_flags & CONTACT_HANDS || spread_flags & CONTACT_GENERAL) - return 1 - return 0 - -//don't use this proc directly. this should only ever be called by cure() //nope -/datum/disease/proc/remove_virus() - affected_mob.viruses -= src //remove the datum from the list - affected_mob.med_hud_set_status() - +/** + * Transform a disease into another, if the requirements are met + * + * Returns: + * * TRUE - if mutation was succesful + * * FALSE - otherwise + */ /datum/disease/proc/mutate() var/datum/reagents/reagents = affected_mob.reagents if(!reagents.reagent_list.len) - return + return FALSE for(var/R in mutation_reagents) if(!reagents.has_reagent(R)) - return + return FALSE //Here we have all the necessary reagents in affected_mob var/type = pick(possible_mutations) if(type) - remove_virus() - affected_mob.ForceContractDisease(new type) + affected_mob.diseases -= src + affected_mob.med_hud_set_status() + var/datum/disease/new_disease = new type + new_disease.Contract(affected_mob) qdel(src) + return TRUE diff --git a/code/datums/diseases/anxiety.dm b/code/datums/diseases/anxiety.dm deleted file mode 100644 index 0d84afeab57..00000000000 --- a/code/datums/diseases/anxiety.dm +++ /dev/null @@ -1,42 +0,0 @@ -/datum/disease/anxiety - name = "Severe Anxiety" - form = "Infection" - max_stages = 4 - spread_text = "On contact" - spread_flags = CONTACT_GENERAL - cure_text = "Ethanol" - cures = list("ethanol") - agent = "Excess Lepidopticides" - viable_mobtypes = list(/mob/living/carbon/human, /mob/living/carbon/human/lesser/monkey) - desc = "If left untreated subject will regurgitate butterflies." - severity = MEDIUM - possible_mutations = list(/datum/disease/beesease) - -/datum/disease/anxiety/stage_act() - ..() - switch(stage) - if(2) //also changes say, see say.dm - if(prob(5)) - to_chat(affected_mob, "You feel anxious.") - if(3) - if(prob(10)) - to_chat(affected_mob, "Your stomach flutters.") - if(prob(5)) - to_chat(affected_mob, "You feel panicky.") - if(prob(2)) - to_chat(affected_mob, "You're overtaken with panic!") - affected_mob.AdjustConfused(rand(4 SECONDS, 6 SECONDS)) - if(4) - if(prob(10)) - to_chat(affected_mob, "You feel butterflies in your stomach.") - if(prob(5)) - affected_mob.visible_message("[affected_mob] stumbles around in a panic.", \ - "You have a panic attack!") - affected_mob.AdjustConfused(rand(12 SECONDS, 16 SECONDS)) - affected_mob.AdjustJitter(rand(12 SECONDS, 16 SECONDS)) - if(prob(2)) - affected_mob.visible_message("[affected_mob] coughs up butterflies!", \ - "You cough up butterflies!") - new /mob/living/simple_animal/butterfly(affected_mob.loc) - new /mob/living/simple_animal/butterfly(affected_mob.loc) - return diff --git a/code/datums/diseases/appendicitis.dm b/code/datums/diseases/appendicitis.dm index bdbb0fe4455..4fa7169b8fd 100644 --- a/code/datums/diseases/appendicitis.dm +++ b/code/datums/diseases/appendicitis.dm @@ -1,35 +1,150 @@ /datum/disease/appendicitis form = "Condition" name = "Appendicitis" - max_stages = 3 - cure_text = "Surgery" agent = "Shitty Appendix" - viable_mobtypes = list(/mob/living/carbon/human) - permeability_mod = 1 desc = "If left untreated the subject will become very weak, and may vomit often." - severity = "Dangerous!" - disease_flags = CAN_CARRY|CAN_RESIST - spread_flags = NON_CONTAGIOUS + cure_text = "Surgery" + stage_prob = 2 + severity = DANGEROUS + curable = FALSE + can_immunity = FALSE visibility_flags = HIDDEN_PANDEMIC required_organs = list(/obj/item/organ/internal/appendix) - bypasses_immunity = TRUE + ignore_immunity = TRUE virus_heal_resistant = TRUE + var/ruptured = FALSE /datum/disease/appendicitis/stage_act() - ..() + if(!..()) + return FALSE + + var/mob/living/carbon/human/H = affected_mob + if(!istype(H)) + return + + var/obj/item/organ/internal/appendix/A = H.get_int_organ(/obj/item/organ/internal/appendix) + if(!istype(A)) + cure() + return + + if(!A.inflamed) + A.inflamed = TRUE + A.update_icon() + + if(!ruptured && (A.germ_level >= INFECTION_LEVEL_THREE || A.status & ORGAN_DEAD)) + rupture(H, A) + switch(stage) - if(1) - if(prob(5)) - affected_mob.emote("cough") if(2) - var/obj/item/organ/internal/appendix/A = affected_mob.get_int_organ(/obj/item/organ/internal/appendix) - if(A) - A.inflamed = 1 - A.update_icon() - if(prob(3)) - to_chat(affected_mob, "You feel a stabbing pain in your abdomen!") - affected_mob.Stun(rand(4 SECONDS, 6 SECONDS)) - affected_mob.adjustToxLoss(1) + if(A.germ_level < INFECTION_LEVEL_ONE) + A.germ_level = INFECTION_LEVEL_ONE + A.germ_level += rand(1, 4) * H.dna.species.germs_growth_rate + + if(prob(2)) + H.vomit() + + if(prob(5)) + A.receive_damage(1, silent = prob(65)) + if(3) - if(prob(1)) - affected_mob.vomit(95) + if(A.germ_level < INFECTION_LEVEL_ONE) + A.germ_level = INFECTION_LEVEL_ONE + A.germ_level += rand(2, 6) * H.dna.species.germs_growth_rate + + if(prob(10)) + A.receive_damage(1, silent = prob(45)) + + if(prob(3)) + H.vomit() + + if(prob(10)) + H.emote("moan") + + if(prob(5)) + to_chat(H, span_warning("You feel a stabbing pain in your abdomen!")) + H.Stun(rand(2 SECONDS, 4 SECONDS)) + H.Slowed(10 SECONDS, 5) + H.adjustToxLoss(1) + + if(4) + + if(A.germ_level < INFECTION_LEVEL_TWO) + A.germ_level = INFECTION_LEVEL_TWO + A.germ_level += rand(4, 10) * H.dna.species.germs_growth_rate + + if(prob(10)) + A.receive_damage(2, silent = 0) + + if(prob(3)) + H.vomit() + + if(prob(15)) + H.emote(pick("moan", "cry")) + + if(prob(7)) + to_chat(H, span_danger("You feel a stabbing pain in your abdomen!")) + H.Stun(rand(2 SECONDS, 4 SECONDS)) + H.Slowed(15 SECONDS, 5) + H.adjustToxLoss(3) + + if(5) + if(A.germ_level < INFECTION_LEVEL_TWO) + A.germ_level = INFECTION_LEVEL_TWO + A.germ_level += rand(6, 12) * H.dna.species.germs_growth_rate + + H.adjustToxLoss(0.5) + if(H.IsSlowed()) + H.AdjustSlowedDuration(30 SECONDS, bound_upper = 40 SECONDS) + else + H.Slowed(30 SECONDS, 5) + + H.damageoverlaytemp = 30 + + if(prob(20)) + A.receive_damage(3, silent = 0) + + if(prob(5)) + H.vomit() + + if(prob(10)) + H.emote(pick("moan", "cry")) + + if(prob(8)) + to_chat(H, span_danger("You feel a stabbing pain in your abdomen!")) + H.Stun(rand(2 SECONDS, 4 SECONDS)) + H.Jitter(10 SECONDS) + + +/datum/disease/appendicitis/proc/rupture(mob/living/carbon/human/H, obj/item/organ/internal/appendix/A) + ruptured = TRUE + A.necrotize() + stage = 5 + + var/obj/item/organ/external/parent = H.get_organ(check_zone(A.parent_organ)) + if(istype(parent)) + parent.receive_damage(25, used_weapon = "appendix rupture") + if(parent.germ_level < INFECTION_LEVEL_TWO) + parent.germ_level = INFECTION_LEVEL_TWO + for(var/obj/item/organ/internal/O in parent.internal_organs) + if(O.germ_level < INFECTION_LEVEL_TWO) + O.germ_level = INFECTION_LEVEL_TWO + O.receive_damage(10) + + to_chat(H, span_userdanger("You feel a hellish pain in your abdomen, as if something is torn!")) + H.Stun(20 SECONDS) + H.emote("scream") + addtimer(CALLBACK(src, PROC_REF(fall), H, A), 10 SECONDS) + +/datum/disease/appendicitis/proc/fall(mob/living/carbon/human/H, obj/item/organ/internal/appendix/A) + to_chat(H, span_danger("You feel weakening...")) + H.Weaken(10 SECONDS) + addtimer(CALLBACK(src, PROC_REF(exhausted), H, A), 10 SECONDS) + +/datum/disease/appendicitis/proc/exhausted(mob/living/carbon/human/H, obj/item/organ/internal/appendix/A) + to_chat(H, span_danger("You feel weakening... Need to sleep")) + H.SetSleeping(40 SECONDS) + H.Slowed(200 SECONDS, 10) + + + + diff --git a/code/datums/diseases/beesease.dm b/code/datums/diseases/beesease.dm deleted file mode 100644 index ff9a2408640..00000000000 --- a/code/datums/diseases/beesease.dm +++ /dev/null @@ -1,40 +0,0 @@ -/datum/disease/beesease - name = "Beesease" - form = "Infection" - max_stages = 4 - spread_text = "On contact" - spread_flags = CONTACT_GENERAL - cure_text = "Sugar" - cures = list("sugar") - agent = "Apidae Infection" - viable_mobtypes = list(/mob/living/carbon/human, /mob/living/carbon/human/lesser/monkey) - desc = "If left untreated subject will regurgitate bees." - severity = DANGEROUS - possible_mutations = list(/datum/disease/lycan) - -/datum/disease/beesease/stage_act() - ..() - switch(stage) - if(2) //also changes say, see say.dm // no it doesn't, that's horrifyingly snowflakey - if(prob(2)) - to_chat(affected_mob, "You taste honey in your mouth.") - if(3) - if(prob(10)) - to_chat(affected_mob, "Your stomach rumbles.") - if(prob(2)) - to_chat(affected_mob, "Your stomach stings painfully.") - if(prob(20)) - affected_mob.adjustToxLoss(2) - if(4) - if(prob(10)) - affected_mob.visible_message("[affected_mob] buzzes.", \ - "Your stomach buzzes violently!") - if(prob(5)) - to_chat(affected_mob, "You feel something moving in your throat.") - if(prob(1)) - affected_mob.visible_message("[affected_mob] coughs up a swarm of bees!", \ - "You cough up a swarm of bees!") - new /mob/living/simple_animal/hostile/poison/bees(affected_mob.loc) - //if(5) - //Plus if you die, you explode into bees - return diff --git a/code/datums/diseases/berserker.dm b/code/datums/diseases/berserker.dm index 81b3ca8cb72..ef2681690b7 100644 --- a/code/datums/diseases/berserker.dm +++ b/code/datums/diseases/berserker.dm @@ -1,21 +1,20 @@ /datum/disease/berserker name = "Berserker" + desc = "Swearing, shouting, attacking nearby crew members uncontrollably." + agent = "Jagged Crystals" + cure_text = "Anti-Psychotics" max_stages = 2 stage_prob = 5 - spread_text = "Non-Contagious" - spread_flags = SPECIAL - cure_text = "Anti-Psychotics" cures = list("haloperidol") - agent = "Jagged Crystals" - cure_chance = 10 - viable_mobtypes = list(/mob/living/carbon/human) - desc = "Swearing, shouting, attacking nearby crew members uncontrollably." + cure_prob = 10 severity = DANGEROUS - disease_flags = CURABLE - spread_flags = NON_CONTAGIOUS + can_immunity = FALSE + visibility_flags = HIDDEN_PANDEMIC /datum/disease/berserker/stage_act() - ..() + if(!..()) + return FALSE + if(affected_mob.reagents.has_reagent("thc")) to_chat(affected_mob, "You mellow out.") cure() diff --git a/code/datums/diseases/brainrot.dm b/code/datums/diseases/brainrot.dm deleted file mode 100644 index 167ab190a08..00000000000 --- a/code/datums/diseases/brainrot.dm +++ /dev/null @@ -1,58 +0,0 @@ -/datum/disease/brainrot - name = "Brainrot" - max_stages = 4 - spread_text = "On contact" - spread_flags = CONTACT_GENERAL - cure_text = "Mannitol" - cures = list("mannitol") - agent = "Cryptococcus Cosmosis" - viable_mobtypes = list(/mob/living/carbon/human) - cure_chance = 15//higher chance to cure, since two reagents are required - desc = "This disease destroys the braincells, causing brain fever, brain necrosis and general intoxication." - required_organs = list(/obj/item/organ/internal/brain) - severity = DANGEROUS - mutation_reagents = list("mutagen", "neurotoxin2") - possible_mutations = list(/datum/disease/kuru, /datum/disease/advance/preset/mind_restoration/, /datum/disease/transformation/jungle_fever) - -/datum/disease/brainrot/stage_act() //Removed toxloss because damaging diseases are pretty horrible. Last round it killed the entire station because the cure didn't work -- Urist -ACTUALLY Removed rather than commented out, I don't see it returning - RR - ..() - - switch(stage) - if(2) - if(prob(2)) - affected_mob.emote("blink") - if(prob(2)) - affected_mob.emote("yawn") - if(prob(2)) - to_chat(affected_mob, "You don't feel like yourself.") - if(prob(5)) - affected_mob.adjustBrainLoss(1) - if(3) - if(prob(2)) - affected_mob.emote("stare") - if(prob(2)) - affected_mob.emote("drool") - if(prob(10) && affected_mob.getBrainLoss()<=98)//shouldn't brainpain you to death now - affected_mob.adjustBrainLoss(2) - if(prob(2)) - to_chat(affected_mob, "Your try to remember something important...but can't.") - - if(4) - if(prob(2)) - affected_mob.emote("stare") - if(prob(2)) - affected_mob.emote("drool") - if(prob(15) && affected_mob.getBrainLoss()<=98) //shouldn't brainpain you to death now - affected_mob.adjustBrainLoss(3) - if(prob(2)) - to_chat(affected_mob, "Strange buzzing fills your head, removing all thoughts.") - if(prob(3)) - to_chat(affected_mob, "You lose consciousness...") - affected_mob.visible_message("[affected_mob] suddenly collapses") - affected_mob.Paralyse(rand(10 SECONDS, 20 SECONDS)) - if(prob(1)) - affected_mob.emote("snore") - if(prob(15)) - affected_mob.AdjustStuttering(6 SECONDS) - - return diff --git a/code/datums/diseases/cold.dm b/code/datums/diseases/cold.dm deleted file mode 100644 index 6b05014cc6e..00000000000 --- a/code/datums/diseases/cold.dm +++ /dev/null @@ -1,66 +0,0 @@ -/datum/disease/cold - name = "The Cold" - max_stages = 3 - spread_flags = AIRBORNE - cure_text = "Rest & Spaceacillin" - cures = list("spaceacillin") - agent = "XY-rhinovirus" - viable_mobtypes = list(/mob/living/carbon/human, /mob/living/carbon/human/lesser/monkey) - permeability_mod = 0.5 - desc = "If left untreated the subject will contract the flu." - severity = MINOR - -/datum/disease/cold/stage_act() - ..() - switch(stage) - if(2) -/* - if(affected_mob.sleeping && prob(40)) //removed until sleeping is fixed - to_chat(affected_mob, "You feel better.") - cure() - return -*/ - if(affected_mob.lying && prob(40)) //changed FROM prob(10) until sleeping is fixed - to_chat(affected_mob, "You feel better.") - cure() - return - if(prob(1) && prob(5)) - to_chat(affected_mob, "You feel better.") - cure() - return - if(prob(1)) - affected_mob.emote("sneeze") - if(prob(1)) - affected_mob.emote("cough") - if(prob(1)) - to_chat(affected_mob, "Your throat feels sore.") - if(prob(1)) - to_chat(affected_mob, "Mucous runs down the back of your throat.") - if(3) -/* - if(affected_mob.sleeping && prob(25)) //removed until sleeping is fixed - to_chat(affected_mob, "You feel better.") - cure() - return -*/ - if(affected_mob.lying && prob(25)) //changed FROM prob(5) until sleeping is fixed - to_chat(affected_mob, "You feel better.") - cure() - return - if(prob(1) && prob(1)) - to_chat(affected_mob, "You feel better.") - cure() - return - if(prob(1)) - affected_mob.emote("sneeze") - if(prob(1)) - affected_mob.emote("cough") - if(prob(1)) - to_chat(affected_mob, "Your throat feels sore.") - if(prob(1)) - to_chat(affected_mob, "Mucous runs down the back of your throat.") - if(prob(1) && prob(50)) - if(!affected_mob.resistances.Find(/datum/disease/flu)) - var/datum/disease/Flu = new /datum/disease/flu - affected_mob.ContractDisease(Flu) - cure() diff --git a/code/datums/diseases/cold9.dm b/code/datums/diseases/cold9.dm deleted file mode 100644 index 60af82e6939..00000000000 --- a/code/datums/diseases/cold9.dm +++ /dev/null @@ -1,39 +0,0 @@ -/datum/disease/cold9 - name = "The Cold" - max_stages = 3 - spread_text = "On contact" - spread_flags = CONTACT_GENERAL - cure_text = "Common Cold Anti-bodies & Spaceacillin" - cures = list("spaceacillin") - agent = "ICE9-rhinovirus" - viable_mobtypes = list(/mob/living/carbon/human) - desc = "If left untreated the subject will slow, as if partly frozen." - severity = MEDIUM - -/datum/disease/cold9/stage_act() - ..() - switch(stage) - if(2) - affected_mob.bodytemperature -= 10 - if(prob(1) && prob(10)) - to_chat(affected_mob, "You feel better.") - cure() - return - if(prob(1)) - affected_mob.emote("sneeze") - if(prob(1)) - affected_mob.emote("cough") - if(prob(1)) - to_chat(affected_mob, "Your throat feels sore.") - if(prob(5)) - to_chat(affected_mob, "You feel stiff.") - if(3) - affected_mob.bodytemperature -= 20 - if(prob(1)) - affected_mob.emote("sneeze") - if(prob(1)) - affected_mob.emote("cough") - if(prob(1)) - to_chat(affected_mob, "Your throat feels sore.") - if(prob(10)) - to_chat(affected_mob, "You feel stiff.") diff --git a/code/datums/diseases/critical.dm b/code/datums/diseases/critical.dm index b9503cbad77..74831e95cc8 100644 --- a/code/datums/diseases/critical.dm +++ b/code/datums/diseases/critical.dm @@ -1,6 +1,14 @@ /datum/disease/critical + visibility_flags = HIDDEN_PANDEMIC + can_immunity = FALSE + ignore_immunity = TRUE + virus_heal_resistant = TRUE + severity = DANGEROUS /datum/disease/critical/stage_act() //overriden to ensure unique behavior + if(affected_mob?.stat == DEAD) + return FALSE + stage = min(stage, max_stages) if(prob(stage_prob)) @@ -14,88 +22,74 @@ /datum/disease/critical/has_cure() for(var/C_id in cures) if(affected_mob.reagents.has_reagent(C_id)) - if(prob(cure_chance)) + if(prob(cure_prob)) return TRUE return FALSE /datum/disease/critical/shock name = "Shock" form = "Medical Emergency" - spread_text = "The patient is in shock" + additional_info = "The patient is in shock" max_stages = 3 - spread_flags = SPECIAL - cure_text = "Saline-Glucose Solution" - cures = list("salglu_solution") - cure_chance = 10 - viable_mobtypes = list(/mob/living/carbon/human) stage_prob = 6 - severity = DANGEROUS - disease_flags = CURABLE - bypasses_immunity = TRUE - virus_heal_resistant = TRUE + cures = list("salglu_solution") + cure_prob = 10 /datum/disease/critical/shock/stage_act() if(..()) if(affected_mob.health >= 25 && affected_mob.nutrition >= NUTRITION_LEVEL_HYPOGLYCEMIA) - to_chat(affected_mob, "You feel better.") + to_chat(affected_mob, span_notice("You feel better.")) cure() return switch(stage) if(1) if(prob(1) && prob(10)) - to_chat(affected_mob, "You feel better.") + to_chat(affected_mob, span_notice("You feel better.")) cure() return if(prob(8)) affected_mob.emote(pick("shiver", "pale", "moan")) if(prob(5)) - to_chat(affected_mob, "You feel weak!") + to_chat(affected_mob, span_danger("You feel weak!")) if(2) if(prob(1) && prob(10)) - to_chat(affected_mob, "You feel better.") + to_chat(affected_mob, span_notice("You feel better.")) cure() return if(prob(8)) affected_mob.emote(pick("shiver", "pale", "moan", "shudder", "tremble")) if(prob(5)) - to_chat(affected_mob, "You feel absolutely terrible!") + to_chat(affected_mob, span_danger("You feel absolutely terrible!")) if(prob(5)) affected_mob.emote("faint", "collapse", "groan") if(3) if(prob(1) && prob(10)) - to_chat(affected_mob, "You feel better.") + to_chat(affected_mob, span_notice("You feel better.")) cure() return if(prob(8)) affected_mob.emote(pick("shudder", "pale", "tremble", "groan", "bshake")) if(prob(5)) - to_chat(affected_mob, "You feel horrible!") + to_chat(affected_mob, span_danger("You feel horrible!")) if(prob(5)) affected_mob.emote(pick("faint", "collapse", "groan")) if(prob(7)) - to_chat(affected_mob, "You can't breathe!") + to_chat(affected_mob, span_danger("You can't breathe!")) affected_mob.AdjustLoseBreath(2 SECONDS) if(prob(5)) var/datum/disease/D = new /datum/disease/critical/heart_failure - affected_mob.ForceContractDisease(D) + D.Contract(affected_mob) /datum/disease/critical/heart_failure name = "Cardiac Failure" form = "Medical Emergency" - spread_text = "The patient is having a cardiac emergency" + additional_info = "The patient is having a cardiac emergency" max_stages = 3 - spread_flags = SPECIAL - cure_text = "Atropine, Epinephrine, or Heparin" + stage_prob = 5 cures = list("atropine", "epinephrine", "heparin") - cure_chance = 10 + cure_prob = 10 needs_all_cures = FALSE - viable_mobtypes = list(/mob/living/carbon/human) - stage_prob = 5 - severity = DANGEROUS - disease_flags = CURABLE required_organs = list(/obj/item/organ/internal/heart) - bypasses_immunity = TRUE - virus_heal_resistant = TRUE /datum/disease/critical/heart_failure/has_cure() if(affected_mob.has_status_effect(STATUS_EFFECT_EXERCISED)) @@ -108,27 +102,27 @@ switch(stage) if(1) if(prob(1) && prob(10)) - to_chat(affected_mob, "You feel better.") + to_chat(affected_mob, span_notice("You feel better.")) cure() return if(prob(8)) affected_mob.emote(pick("pale", "shudder")) if(prob(5)) - to_chat(affected_mob, "Your arm hurts!") + to_chat(affected_mob, span_danger("Your arm hurts!")) else if(prob(5)) - to_chat(affected_mob, "Your chest hurts!") + to_chat(affected_mob, span_danger("Your chest hurts!")) if(2) if(prob(1) && prob(10)) - to_chat(affected_mob, "You feel better.") + to_chat(affected_mob, span_notice("You feel better.")) cure() return if(prob(8)) affected_mob.emote(pick("pale", "groan")) if(prob(5)) - to_chat(affected_mob, "Your heart lurches in your chest!") + to_chat(affected_mob, span_danger("Your heart lurches in your chest!")) affected_mob.AdjustLoseBreath(2 SECONDS) if(prob(3)) - to_chat(affected_mob, "Your heart stops beating!") + to_chat(affected_mob, span_danger("Your heart stops beating!")) affected_mob.AdjustLoseBreath(6 SECONDS) if(prob(5)) affected_mob.emote(pick("faint", "collapse", "groan")) @@ -143,16 +137,10 @@ /datum/disease/critical/hypoglycemia name = "Hypoglycemia" form = "Medical Emergency" + additional_info = "The patient has low blood sugar." max_stages = 3 - spread_flags = SPECIAL - spread_text = "The patient has low blood sugar." - cure_text = "Eating or administration of vitamins or nutrients" - viable_mobtypes = list(/mob/living/carbon/human) stage_prob = 1 - severity = DANGEROUS - disease_flags = CURABLE - bypasses_immunity = TRUE - virus_heal_resistant = TRUE + cure_text = "Eating or administration of vitamins or nutrients" /datum/disease/critical/hypoglycemia/has_cure() if(ishuman(affected_mob)) @@ -168,37 +156,37 @@ if(isLivingSSD(affected_mob)) // We don't want AFK people dying from this. return if(affected_mob.nutrition > NUTRITION_LEVEL_HYPOGLYCEMIA) - to_chat(affected_mob, "You feel a lot better!") + to_chat(affected_mob, span_notice("You feel a lot better!")) cure() return switch(stage) if(1) if(prob(4)) - to_chat(affected_mob, "You feel hungry!") + to_chat(affected_mob, span_warning("You feel hungry!")) if(prob(2)) - to_chat(affected_mob, "You have a headache!") + to_chat(affected_mob, span_warning("You have a headache!")) if(prob(2)) - to_chat(affected_mob, "You feel [pick("anxious", "depressed")]!") + to_chat(affected_mob, span_warning("You feel [pick("anxious", "depressed")]!")) if(2) if(prob(4)) - to_chat(affected_mob, "You feel like everything is wrong with your life!") + to_chat(affected_mob, span_warning("You feel like everything is wrong with your life!")) if(prob(5)) affected_mob.Slowed(rand(8 SECONDS, 32 SECONDS)) - to_chat(affected_mob, "You feel [pick("tired", "exhausted", "sluggish")].") + to_chat(affected_mob, span_warning("You feel [pick("tired", "exhausted", "sluggish")].")) if(prob(5)) affected_mob.Weaken(12 SECONDS) affected_mob.Stuttering(20 SECONDS) - to_chat(affected_mob, "You feel [pick("numb", "confused", "dizzy", "lightheaded")].") + to_chat(affected_mob, span_warning("You feel [pick("numb", "confused", "dizzy", "lightheaded")].")) affected_mob.emote("collapse") if(3) if(prob(1)) var/datum/disease/D = new /datum/disease/critical/shock - affected_mob.ForceContractDisease(D) + D.Contract(affected_mob) if(prob(12)) affected_mob.Weaken(12 SECONDS) affected_mob.Stuttering(20 SECONDS) - to_chat(affected_mob, "You feel [pick("numb", "confused", "dizzy", "lightheaded")].") + to_chat(affected_mob, span_warning("You feel [pick("numb", "confused", "dizzy", "lightheaded")].")) affected_mob.emote("collapse") if(prob(12)) - to_chat(affected_mob, "You feel [pick("tired", "exhausted", "sluggish")].") + to_chat(affected_mob, span_warning("You feel [pick("tired", "exhausted", "sluggish")].")) affected_mob.Slowed(rand(8 SECONDS, 32 SECONDS)) diff --git a/code/datums/diseases/fake_gbs.dm b/code/datums/diseases/fake_gbs.dm deleted file mode 100644 index 699fc2d2567..00000000000 --- a/code/datums/diseases/fake_gbs.dm +++ /dev/null @@ -1,32 +0,0 @@ -/datum/disease/fake_gbs - name = "GBS" - max_stages = 5 - spread_text = "On contact" - spread_flags = CONTACT_GENERAL - cure_text = "Diphenhydramine & Sulfur" - cures = list("diphenhydramine","sulfur") - agent = "Gravitokinetic Bipotential SADS-" - viable_mobtypes = list(/mob/living/carbon/human, /mob/living/carbon/human/lesser/monkey) - desc = "If left untreated death will occur." - severity = BIOHAZARD - -/datum/disease/fake_gbs/stage_act() - ..() - switch(stage) - if(2) - if(prob(1)) - affected_mob.emote("sneeze") - if(3) - if(prob(5)) - affected_mob.emote("cough") - else if(prob(5)) - affected_mob.emote("gasp") - if(prob(10)) - to_chat(affected_mob, "You're starting to feel very weak...") - if(4) - if(prob(10)) - affected_mob.emote("cough") - - if(5) - if(prob(10)) - affected_mob.emote("cough") diff --git a/code/datums/diseases/flu.dm b/code/datums/diseases/flu.dm deleted file mode 100644 index e9feee5094c..00000000000 --- a/code/datums/diseases/flu.dm +++ /dev/null @@ -1,52 +0,0 @@ -/datum/disease/flu - name = "The Flu" - max_stages = 3 - spread_text = "Airborne" - cure_text = "Spaceacillin" - cures = list("spaceacillin") - cure_chance = 10 - agent = "H13N1 flu virion" - viable_mobtypes = list(/mob/living/carbon/human, /mob/living/carbon/human/lesser/monkey) - permeability_mod = 0.75 - desc = "If left untreated the subject will feel quite unwell." - severity = MEDIUM - -/datum/disease/flu/stage_act() - ..() - switch(stage) - if(2) - if(affected_mob.lying && prob(20)) - to_chat(affected_mob, "You feel better.") - stage-- - return - if(prob(1)) - affected_mob.emote("sneeze") - if(prob(1)) - affected_mob.emote("cough") - if(prob(1)) - to_chat(affected_mob, "Your muscles ache.") - if(prob(20)) - affected_mob.take_organ_damage(1) - if(prob(1)) - to_chat(affected_mob, "Your stomach hurts.") - if(prob(20)) - affected_mob.adjustToxLoss(1) - - if(3) - if(affected_mob.lying && prob(15)) - to_chat(affected_mob, "You feel better.") - stage-- - return - if(prob(1)) - affected_mob.emote("sneeze") - if(prob(1)) - affected_mob.emote("cough") - if(prob(1)) - to_chat(affected_mob, "Your muscles ache.") - if(prob(20)) - affected_mob.take_organ_damage(1) - if(prob(1)) - to_chat(affected_mob, "Your stomach hurts.") - if(prob(20)) - affected_mob.adjustToxLoss(1) - return diff --git a/code/datums/diseases/food_poisoning.dm b/code/datums/diseases/food_poisoning.dm index dfa58264b97..334279bb5e7 100644 --- a/code/datums/diseases/food_poisoning.dm +++ b/code/datums/diseases/food_poisoning.dm @@ -1,72 +1,62 @@ /datum/disease/food_poisoning name = "Food Poisoning" + agent = "Salmonella" + desc = "Nausea, sickness, and vomitting." max_stages = 3 stage_prob = 5 - spread_text = "Non-Contagious" - spread_flags = SPECIAL - cure_text = "Sleep" - agent = "Salmonella" + cure_text = "Proper diet & sleep" cures = list("chicken_soup") - cure_chance = 10 - viable_mobtypes = list(/mob/living/carbon/human) - desc = "Nausea, sickness, and vomitting." + cure_prob = 100 //override in has_cure() severity = MINOR - disease_flags = CURABLE - spread_flags = NON_CONTAGIOUS + can_immunity = FALSE + ignore_immunity = TRUE virus_heal_resistant = TRUE - possible_mutations = list(/datum/disease/tuberculosis) + visibility_flags = HIDDEN_PANDEMIC + possible_mutations = list(/datum/disease/virus/tuberculosis) /datum/disease/food_poisoning/stage_act() - ..() - if(affected_mob.IsSleeping() && prob(33)) - to_chat(affected_mob, "You feel better.") - cure() - return + if(!..()) + return FALSE + switch(stage) if(1) if(prob(5)) - to_chat(affected_mob, "Your stomach feels weird.") + to_chat(affected_mob, span_danger("Your stomach feels weird.")) if(prob(5)) - to_chat(affected_mob, "You feel queasy.") + to_chat(affected_mob, span_danger("You feel queasy.")) if(2) - if(affected_mob.IsSleeping() && prob(40)) - to_chat(affected_mob, "You feel better.") - cure() - return - if(prob(1) && prob(10)) - to_chat(affected_mob, "You feel better.") - cure() - return if(prob(10)) affected_mob.emote("groan") if(prob(5)) - to_chat(affected_mob, "Your stomach aches.") + to_chat(affected_mob, span_danger("Your stomach aches.")) if(prob(5)) - to_chat(affected_mob, "You feel nauseous.") + to_chat(affected_mob, span_danger("You feel nauseous.")) if(3) - if(affected_mob.IsSleeping() && prob(25)) - to_chat(affected_mob, "You feel better.") - cure() - return - if(prob(1) && prob(10)) - to_chat(affected_mob, "You feel better.") - cure() - return if(prob(10)) affected_mob.emote("moan") if(prob(10)) affected_mob.emote("groan") if(prob(1)) - to_chat(affected_mob, "Your stomach hurts.") + to_chat(affected_mob, span_danger("Your stomach hurts.")) if(prob(1)) - to_chat(affected_mob, "You feel sick.") + to_chat(affected_mob, span_danger("You feel sick.")) if(prob(5)) if(affected_mob.nutrition > 10) - affected_mob.visible_message("[affected_mob] vomits on the floor profusely!") + affected_mob.visible_message(span_danger("[affected_mob] vomits on the floor profusely!")) affected_mob.fakevomit(no_text = 1) affected_mob.adjust_nutrition(-rand(3,5)) else - to_chat(affected_mob, "Your stomach lurches painfully!") - affected_mob.visible_message("[affected_mob] gags and retches!") + to_chat(affected_mob, span_danger("Your stomach lurches painfully!")) + affected_mob.visible_message(span_danger("[affected_mob] gags and retches!")) affected_mob.Stun(rand(4 SECONDS, 8 SECONDS)) affected_mob.Weaken(rand(4 SECONDS, 8 SECONDS)) + +/datum/disease/food_poisoning/has_cure() + if(..()) + if(affected_mob.IsSleeping()) + return prob(80 - 15 * stage) + return prob(8) + else + if(affected_mob.IsSleeping()) + return prob(30 - 7.5 * stage) + return prob(1) && prob(50) diff --git a/code/datums/diseases/gbs.dm b/code/datums/diseases/gbs.dm deleted file mode 100644 index 19d4c287427..00000000000 --- a/code/datums/diseases/gbs.dm +++ /dev/null @@ -1,51 +0,0 @@ -/datum/disease/gbs - name = "GBS" - max_stages = 5 - spread_text = "On contact" - spread_flags = CONTACT_GENERAL - cure_text = "Diphenhydramine & Sulfur" - cures = list("diphenhydramine","sulfur") - cure_chance = 15//higher chance to cure, since two reagents are required - agent = "Gravitokinetic Bipotential SADS+" - viable_mobtypes = list(/mob/living/carbon/human) - disease_flags = CAN_CARRY|CAN_RESIST|CURABLE - permeability_mod = 1 - severity = BIOHAZARD - -/datum/disease/gbs/stage_act() - ..() - switch(stage) - if(2) - if(prob(45)) - affected_mob.adjustToxLoss(5) - if(prob(1)) - affected_mob.emote("sneeze") - if(3) - if(prob(5)) - affected_mob.emote("cough") - else if(prob(5)) - affected_mob.emote("gasp") - if(prob(10)) - to_chat(affected_mob, "You're starting to feel very weak...") - if(4) - if(prob(10)) - affected_mob.emote("cough") - affected_mob.adjustToxLoss(5) - if(5) - to_chat(affected_mob, "Your body feels as if it's trying to rip itself open...") - if(prob(50)) - affected_mob.delayed_gib() - else - return - -/datum/disease/gbs/curable - name = "Non-Contagious GBS" - stage_prob = 5 - spread_text = "Non-Contagious" - spread_flags = SPECIAL - cure_text = "Cryoxadone" - cures = list("cryoxadone") - cure_chance = 10 - agent = "gibbis" - spread_flags = NON_CONTAGIOUS - disease_flags = CURABLE diff --git a/code/datums/diseases/kingstons.dm b/code/datums/diseases/kingstons.dm deleted file mode 100644 index 34a2951a546..00000000000 --- a/code/datums/diseases/kingstons.dm +++ /dev/null @@ -1,100 +0,0 @@ -/datum/disease/kingstons - name = "Kingstons Syndrome" - max_stages = 4 - spread_text = "Airborne" - cure_text = "Milk" - cures = list("milk") - cure_chance = 50 - agent = "Nya Virus" - viable_mobtypes = list(/mob/living/carbon/human) - permeability_mod = 0.75 - desc = "If left untreated the subject will turn into a feline. In felines it has... OTHER... effects." - severity = DANGEROUS - mutation_reagents = list("mutagen", "radium") - possible_mutations = list(/datum/disease/kingstons_advanced) - -/datum/disease/kingstons/stage_act() - ..() - switch(stage) - if(1) - if(prob(10)) - if(istajaran(affected_mob)) - to_chat(affected_mob, "You feel good.") - else - to_chat(affected_mob, "You feel like playing with string.") - if(2) - if(prob(10)) - if(istajaran(affected_mob)) - to_chat(affected_mob, "Something in your throat itches.") - else - to_chat(affected_mob, "You NEED to find a mouse.") - if(3) - if(prob(10)) - if(istajaran(affected_mob)) - to_chat(affected_mob, "You feel something in your throat!") - affected_mob.emote("cough") - else - affected_mob.say(pick(list("Mew", "Meow!", "Nya!~"))) - if(4) - if(prob(5)) - if(istajaran(affected_mob)) - affected_mob.visible_message("[affected_mob] coughs up a hairball!", \ - "You cough up a hairball!") - affected_mob.Stun(10 SECONDS) - else - affected_mob.visible_message("[affected_mob]'s form contorts into something more feline!", \ - "YOU TURN INTO A TAJARAN!") - var/mob/living/carbon/human/catface = affected_mob - catface.set_species(/datum/species/tajaran, retain_damage = TRUE) - - -/datum/disease/kingstons_advanced //this used to be directly a subtype of kingstons, which sounds nice, but it ment that it would *turn you into a tarjaran always and have normal kingstons stage act* Don't make virusus subtypes unless the base virus does nothing. - name = "Advanced Kingstons Syndrome" - max_stages = 4 - spread_text = "Airborne" - cure_text = "Plasma" - cures = list("plasma") - cure_chance = 50 - agent = "AMB45DR Bacteria" - viable_mobtypes = list(/mob/living/carbon/human) - permeability_mod = 0.75 - desc = "If left untreated the subject will mutate to a different species." - severity = BIOHAZARD - var/list/virspecies = list(/datum/species/human, /datum/species/tajaran, /datum/species/unathi,/datum/species/skrell, /datum/species/vulpkanin, /datum/species/diona) //no karma races sorrys. - var/list/virsuffix = list("pox", "rot", "flu", "cough", "-gitis", "cold", "rash", "itch", "decay") - var/datum/species/chosentype - var/chosensuff - possible_mutations = null - -/datum/disease/kingstons_advanced/New() - chosentype = pick(virspecies) - chosensuff = pick(virsuffix) - - name = "[initial(chosentype.name)] [chosensuff]" - -/datum/disease/kingstons_advanced/stage_act() - ..() - if(ishuman(affected_mob)) - var/mob/living/carbon/human/twisted = affected_mob - switch(stage) - if(1) - if(prob(10)) - to_chat(twisted, "You feel awkward.") - if(2) - if(prob(10)) - to_chat(twisted, "You itch.") - if(3) - if(prob(10)) - to_chat(twisted, "Your skin starts to flake!") - - if(4) - if(prob(5)) - if(!istype(twisted.dna.species, chosentype)) - twisted.visible_message("[twisted]'s skin splits and form contorts!", \ - "Your body mutates into a [initial(chosentype.name)]!") - twisted.set_species(chosentype, retain_damage = TRUE) - else - twisted.visible_message("[twisted] scratches at thier skin!", \ - "You scratch your skin to try not to itch!") - twisted.adjustBruteLoss(-5) - twisted.adjustStaminaLoss(5) diff --git a/code/datums/diseases/kuru.dm b/code/datums/diseases/kuru.dm index 3091e2bc12e..ed4c4bce1ab 100644 --- a/code/datums/diseases/kuru.dm +++ b/code/datums/diseases/kuru.dm @@ -1,22 +1,20 @@ /datum/disease/kuru - form = "Disease" name = "Space Kuru" - max_stages = 4 - stage_prob = 5 - spread_text = "Non-Contagious" - spread_flags = SPECIAL - cure_text = "Incurable" agent = "Prions" - viable_mobtypes = list(/mob/living/carbon/human) desc = "Uncontrollable laughing." + max_stages = 4 + stage_prob = 5 severity = BIOHAZARD - spread_flags = NON_CONTAGIOUS - disease_flags = CAN_CARRY - bypasses_immunity = TRUE //Kuru is a prion disorder, not a virus + visibility_flags = HIDDEN_PANDEMIC + curable = FALSE + can_immunity = FALSE + ignore_immunity = TRUE //Kuru is a prion disorder, not a virus virus_heal_resistant = TRUE /datum/disease/kuru/stage_act() - ..() + if(!..()) + return FALSE + switch(stage) if(1) if(prob(50)) @@ -25,22 +23,22 @@ affected_mob.Jitter(50 SECONDS) if(2) if(prob(50)) - affected_mob.visible_message("[affected_mob] laughs uncontrollably!") + affected_mob.visible_message(span_danger("[affected_mob] laughs uncontrollably!")) affected_mob.Weaken(20 SECONDS) affected_mob.Jitter(500 SECONDS) if(3) if(prob(25)) - to_chat(affected_mob, "You feel like you are about to drop dead!") - to_chat(affected_mob, "Your body convulses painfully!") + to_chat(affected_mob, span_danger("You feel like you are about to drop dead!")) + to_chat(affected_mob, span_danger("Your body convulses painfully!")) affected_mob.adjustBruteLoss(5) affected_mob.adjustOxyLoss(5) affected_mob.Weaken(20 SECONDS) affected_mob.Jitter(500 SECONDS) - affected_mob.visible_message("[affected_mob] laughs uncontrollably!") + affected_mob.visible_message(span_danger("[affected_mob] laughs uncontrollably!")) if(4) if(prob(25)) - to_chat(affected_mob, "You feel like you are going to die!") + to_chat(affected_mob, span_danger("You feel like you are going to die!")) affected_mob.adjustOxyLoss(75) affected_mob.adjustBruteLoss(75) affected_mob.Weaken(20 SECONDS) - affected_mob.visible_message("[affected_mob] laughs uncontrollably!") + affected_mob.visible_message(span_danger("[affected_mob] laughs uncontrollably!")) diff --git a/code/datums/diseases/lycancoughy.dm b/code/datums/diseases/lycancoughy.dm deleted file mode 100644 index ebd649adc0d..00000000000 --- a/code/datums/diseases/lycancoughy.dm +++ /dev/null @@ -1,54 +0,0 @@ -/datum/disease/lycan - name = "Lycancoughy" - form = "Infection" - max_stages = 4 - spread_text = "On contact" - spread_flags = CONTACT_GENERAL - cure_text = "Ethanol" - cures = list("ethanol") - agent = "Excess Snuggles" - viable_mobtypes = list(/mob/living/carbon/human, /mob/living/carbon/human/lesser/monkey) - desc = "If left untreated subject will regurgitate... puppies." - severity = MEDIUM - var/barklimit = 0 - -/datum/disease/lycan/stage_act() - ..() - switch(stage) - if(2) //also changes say, see say.dm - if(prob(5)) - to_chat(affected_mob, "You itch.") - affected_mob.emote("cough") - if(3) - if(prob(10)) - to_chat(affected_mob, "You hear faint barking.") - if(prob(5)) - to_chat(affected_mob, "You crave meat.") - affected_mob.emote("cough") - if(prob(2)) - to_chat(affected_mob, "Your stomach growls!") - if(4) - if(prob(10)) - to_chat(affected_mob, "Your stomach barks?!") - if(prob(5)) - affected_mob.visible_message("[affected_mob] howls!", \ - "You howl!") - affected_mob.AdjustConfused(rand(12 SECONDS, 16 SECONDS)) - if(prob(3) && barklimit <= 10) - var/list/puppytype = list(/mob/living/simple_animal/pet/dog/corgi/puppy, /mob/living/simple_animal/pet/dog/pug, /mob/living/simple_animal/pet/dog/fox) - var/mob/living/puppypicked = pick(puppytype) - affected_mob.visible_message("[affected_mob] coughs up [initial(puppypicked.name)]!", \ - "You cough up [initial(puppypicked.name)]?!") - new puppypicked(affected_mob.loc) - new puppypicked(affected_mob.loc) - barklimit ++ - if(prob(1)) - var/list/plushtype = list(/obj/item/toy/plushie/orange_fox, /obj/item/toy/plushie/corgi, /obj/item/toy/plushie/robo_corgi, /obj/item/toy/plushie/pink_fox) - var/obj/item/toy/plushie/coughfox = pick(plushtype) - new coughfox(affected_mob.loc) - affected_mob.visible_message("[affected_mob] coughs up a [initial(coughfox.name)]!", \ - "You cough [initial(coughfox.name)] up ?!") - - affected_mob.emote("cough") - affected_mob.adjustBruteLoss(5) - return diff --git a/code/datums/diseases/magnitis.dm b/code/datums/diseases/magnitis.dm deleted file mode 100644 index dd1d062cbf7..00000000000 --- a/code/datums/diseases/magnitis.dm +++ /dev/null @@ -1,63 +0,0 @@ -/datum/disease/magnitis - name = "Magnitis" - max_stages = 4 - spread_text = "Airborne" - cure_text = "Iron" - cures = list("iron") - agent = "Fukkos Miracos" - viable_mobtypes = list(/mob/living/carbon/human) - disease_flags = CAN_CARRY|CAN_RESIST|CURABLE - permeability_mod = 0.75 - desc = "This disease disrupts the magnetic field of your body, making it act as if a powerful magnet. Injections of iron help stabilize the field." - severity = MEDIUM - -/datum/disease/magnitis/stage_act() - ..() - switch(stage) - if(2) - if(prob(2)) - to_chat(affected_mob, "You feel a slight shock course through your body.") - if(prob(2)) - for(var/obj/M in orange(2,affected_mob)) - if(!M.anchored && (M.flags & CONDUCT)) - step_towards(M,affected_mob) - for(var/mob/living/silicon/S in orange(2,affected_mob)) - if(istype(S, /mob/living/silicon/ai)) continue - step_towards(S,affected_mob) - if(3) - if(prob(2)) - to_chat(affected_mob, "You feel a strong shock course through your body.") - if(prob(2)) - to_chat(affected_mob, "You feel like clowning around.") - if(prob(4)) - for(var/obj/M in orange(4,affected_mob)) - if(!M.anchored && (M.flags & CONDUCT)) - var/i - var/iter = rand(1,2) - for(i=0,iYou feel a powerful shock course through your body.") - if(prob(2)) - to_chat(affected_mob, "You query upon the nature of miracles.") - if(prob(8)) - for(var/obj/M in orange(6,affected_mob)) - if(!M.anchored && (M.flags & CONDUCT)) - var/i - var/iter = rand(1,3) - for(i=0,iYou feel a little silly.") - if(2) - if(prob(10)) - to_chat(affected_mob, "You start seeing rainbows.") - if(3) - if(prob(10)) - to_chat(affected_mob, "Your thoughts are interrupted by a loud HONK!") - if(4) - if(prob(5)) - affected_mob.say( pick( list("HONK!", "Honk!", "Honk.", "Honk?", "Honk!!", "Honk?!", "Honk...") ) ) - - -/datum/disease/pierrot_throat/advanced - name = "Advanced Pierrot's Throat" - spread_text = "Airborne" - cure_text = "Banana products, especially banana bread." - cures = list("banana") - cure_chance = 75 - agent = "H0NI<42.B4n4 Virus" - viable_mobtypes = list(/mob/living/carbon/human) - permeability_mod = 0.75 - desc = "If left untreated the subject will probably drive others to insanity and go insane themselves." - severity = DANGEROUS - possible_mutations = null - -/datum/disease/pierrot_throat/advanced/stage_act() - ..() - switch(stage) - if(1) - if(prob(10)) - to_chat(affected_mob, "You feel very silly.") - if(prob(5)) - to_chat(affected_mob, "You feel like making a joke.") - if(2) - if(prob(10)) - to_chat(affected_mob, "You don't just start seeing rainbows... YOU ARE RAINBOWS!") - if(3) - if(prob(10)) - to_chat(affected_mob, "Your thoughts are interrupted by a loud HONK!") - affected_mob << 'sound/items/airhorn.ogg' - if(4) - if(prob(5)) - affected_mob.say( pick( list("HONK!", "Honk!", "Honk.", "Honk?", "Honk!!", "Honk?!", "Honk...") ) ) - - if(!istype(affected_mob.wear_mask, /obj/item/clothing/mask/gas/clown_hat/nodrop)) - affected_mob.drop_item_ground(affected_mob.wear_mask, force = TRUE) - affected_mob.equip_to_slot(new /obj/item/clothing/mask/gas/clown_hat/nodrop(src), slot_wear_mask) diff --git a/code/datums/diseases/retrovirus.dm b/code/datums/diseases/retrovirus.dm deleted file mode 100644 index 5873733902d..00000000000 --- a/code/datums/diseases/retrovirus.dm +++ /dev/null @@ -1,83 +0,0 @@ -/datum/disease/dna_retrovirus - name = "Retrovirus" - max_stages = 4 - spread_text = "Contact" - spread_flags = CONTACT_GENERAL - cure_text = "Rest or an injection of mutadone" - cure_chance = 6 - agent = "" - viable_mobtypes = list(/mob/living/carbon/human) - desc = "A DNA-altering retrovirus that scrambles the structural and unique enzymes of a host constantly." - severity = DANGEROUS - permeability_mod = 0.4 - stage_prob = 2 - var/SE - var/UI - var/restcure = 0 - - -/datum/disease/dna_retrovirus/New() - ..() - agent = "Virus class [pick("A","B","C","D","E","F")][pick("A","B","C","D","E","F")]-[rand(50,300)]" - if(prob(40)) - cures = list("mutadone") - else - restcure = 1 - - -/datum/disease/dna_retrovirus/stage_act() - ..() - switch(stage) - if(1) - if(restcure) - if(affected_mob.lying && prob(30)) - to_chat(affected_mob, "You feel better.") - cure() - return - if(prob(8)) - to_chat(affected_mob, "Your head hurts.") - if(prob(9)) - to_chat(affected_mob, "You feel a tingling sensation in your chest.") - if(prob(9)) - to_chat(affected_mob, "You feel angry.") - if(2) - if(restcure) - if(affected_mob.lying && prob(20)) - to_chat(affected_mob, "You feel better.") - cure() - return - if(prob(8)) - to_chat(affected_mob, "Your skin feels loose.") - if(prob(10)) - to_chat(affected_mob, "You feel very strange.") - if(prob(4)) - to_chat(affected_mob, "You feel a stabbing pain in your head!") - affected_mob.Paralyse(4 SECONDS) - if(prob(4)) - to_chat(affected_mob, "Your stomach churns.") - if(3) - if(restcure) - if(affected_mob.lying && prob(20)) - to_chat(affected_mob, "You feel better.") - cure() - return - if(prob(10)) - to_chat(affected_mob, "Your entire body vibrates.") - - if(prob(35)) - if(prob(50)) - scramble(1, affected_mob, rand(15, 45)) - else - scramble(0, affected_mob, rand(15, 45)) - - if(4) - if(restcure) - if(affected_mob.lying && prob(5)) - to_chat(affected_mob, "You feel better.") - cure() - return - if(prob(60)) - if(prob(50)) - scramble(1, affected_mob, rand(15, 45)) - else - scramble(0, affected_mob, rand(15, 45)) diff --git a/code/datums/diseases/rhumba_beat.dm b/code/datums/diseases/rhumba_beat.dm deleted file mode 100644 index 1ba2270008b..00000000000 --- a/code/datums/diseases/rhumba_beat.dm +++ /dev/null @@ -1,40 +0,0 @@ -/datum/disease/rhumba_beat - name = "The Rhumba Beat" - max_stages = 5 - spread_text = "On contact" - spread_flags = CONTACT_GENERAL - cure_text = "Chick Chicky Boom!" - cures = list("plasma") - agent = "Unknown" - viable_mobtypes = list(/mob/living/carbon/human) - permeability_mod = 1 - severity = BIOHAZARD - -/datum/disease/rhumba_beat/stage_act() - ..() - if(affected_mob.ckey == "rosham") - cure() - return - switch(stage) - if(2) - if(prob(45)) - affected_mob.adjustToxLoss(5) - if(prob(1)) - to_chat(affected_mob, "You feel strange...") - if(3) - if(prob(5)) - to_chat(affected_mob, "You feel the urge to dance...") - else if(prob(5)) - affected_mob.emote("gasp") - else if(prob(10)) - to_chat(affected_mob, "You feel the need to chick chicky boom...") - if(4) - if(prob(10)) - affected_mob.emote("gasp") - to_chat(affected_mob, "You feel a burning beat inside...") - if(prob(20)) - affected_mob.adjustToxLoss(5) - if(5) - to_chat(affected_mob, "Your body is unable to contain the Rhumba Beat...") - if(prob(50)) - affected_mob.gib() diff --git a/code/datums/diseases/transformation.dm b/code/datums/diseases/transformation.dm deleted file mode 100644 index 181ee3f2669..00000000000 --- a/code/datums/diseases/transformation.dm +++ /dev/null @@ -1,256 +0,0 @@ -/datum/disease/transformation - name = "Transformation" - max_stages = 5 - spread_text = "Acute" - spread_flags = SPECIAL - cure_text = "A coder's love (theoretical)." - agent = "Shenanigans" - viable_mobtypes = list(/mob/living/carbon/human, /mob/living/carbon/alien) - severity = HARMFUL - stage_prob = 10 - visibility_flags = HIDDEN_SCANNER|HIDDEN_PANDEMIC - disease_flags = CURABLE - var/list/stage1 = list("You feel unremarkable.") - var/list/stage2 = list("You feel boring.") - var/list/stage3 = list("You feel utterly plain.") - var/list/stage4 = list("You feel white bread.") - var/list/stage5 = list("Oh the humanity!") - var/new_form = /mob/living/carbon/human - var/is_new_mind = FALSE - -/datum/disease/transformation/stage_act() - ..() - switch(stage) - if(1) - if(prob(stage_prob) && stage1) - to_chat(affected_mob, pick(stage1)) - if(2) - if(prob(stage_prob) && stage2) - to_chat(affected_mob, pick(stage2)) - if(3) - if(prob(stage_prob*2) && stage3) - to_chat(affected_mob, pick(stage3)) - if(4) - if(prob(stage_prob*2) && stage4) - to_chat(affected_mob, pick(stage4)) - if(5) - do_disease_transformation(affected_mob) - -/datum/disease/transformation/proc/do_disease_transformation(mob/living/affected_mob) - if(istype(affected_mob, /mob/living/carbon) && affected_mob.stat != DEAD) - if(stage5) - to_chat(affected_mob, pick(stage5)) - if(jobban_isbanned(affected_mob, new_form)) - affected_mob.death(1) - return - if(affected_mob.notransform) - return - affected_mob.notransform = 1 - affected_mob.canmove = 0 - affected_mob.icon = null - affected_mob.overlays.Cut() - affected_mob.invisibility = INVISIBILITY_ABSTRACT - for(var/obj/item/W in affected_mob) - if(istype(W, /obj/item/implant)) - qdel(W) - continue - affected_mob.drop_item_ground(W) //Если вещь снимается - снимаем - if(isobj(affected_mob.loc)) - var/obj/O = affected_mob.loc - O.force_eject_occupant(affected_mob) - var/mob/living/new_mob = new new_form(affected_mob.loc) - if(istype(new_mob)) - new_mob.a_intent = "harm" - if(affected_mob.mind) - affected_mob.mind.transfer_to(new_mob) - if(is_new_mind) - new_mob.mind.wipe_memory() - else - new_mob.key = affected_mob.key - qdel(affected_mob) - - - -/datum/disease/transformation/jungle_fever - name = "Jungle Fever" - cure_text = "Bananas" - cures = list("banana") - spread_text = "Monkey Bites" - spread_flags = SPECIAL - viable_mobtypes = list(/mob/living/carbon/human) - permeability_mod = 1 - cure_chance = 1 - disease_flags = CAN_CARRY|CAN_RESIST - desc = "Monkeys with this disease will bite humans, causing humans to mutate into a monkey." - severity = BIOHAZARD - stage_prob = 4 - visibility_flags = 0 - agent = "Kongey Vibrion M-909" - new_form = /mob/living/carbon/human/lesser/monkey - is_new_mind = TRUE - - stage1 = null - stage2 = null - stage3 = null - stage4 = list("Your back hurts.", "You breathe through your mouth.", - "You have a craving for bananas.", "Your mind feels clouded.") - stage5 = list("You feel like monkeying around.") - -/datum/disease/transformation/jungle_fever/do_disease_transformation(mob/living/carbon/human/affected_mob) - if(!issmall(affected_mob)) - affected_mob.monkeyize() - -/datum/disease/transformation/jungle_fever/stage_act() - ..() - switch(stage) - if(2) - if(prob(2)) - to_chat(affected_mob, "Your [pick("back", "arm", "leg", "elbow", "head")] itches.") - if(3) - if(prob(4)) - to_chat(affected_mob, "You feel a stabbing pain in your head.") - affected_mob.AdjustConfused(20 SECONDS) - if(4) - if(prob(3)) - affected_mob.say(pick("Eeek, ook ook!", "Eee-eeek!", "Eeee!", "Ungh, ungh.")) - - -/datum/disease/transformation/robot - - name = "Robotic Transformation" - cure_text = "An injection of copper." - cures = list("copper") - cure_chance = 5 - agent = "R2D2 Nanomachines" - desc = "This disease, actually acute nanomachine infection, converts the victim into a cyborg." - severity = DANGEROUS - visibility_flags = 0 - new_form = /mob/living/silicon/robot - is_new_mind = TRUE - - stage1 = null - stage2 = list("Your joints feel stiff.", "Beep...boop..") - stage3 = list("Your joints feel very stiff.", "Your skin feels loose.", "You can feel something move...inside.") - stage4 = list("Your skin feels very loose.", "You can feel... something...inside you.") - stage5 = list("Your skin feels as if it's about to burst off!") - - -/datum/disease/transformation/robot/stage_act() - ..() - switch(stage) - if(3) - if(prob(8)) - affected_mob.say(pick("Beep, boop", "beep, beep!", "Boop...bop")) - if(prob(4)) - to_chat(affected_mob, "You feel a stabbing pain in your head.") - affected_mob.Paralyse(4 SECONDS) - if(4) - if(prob(20)) - affected_mob.say(pick("beep, beep!", "Boop bop boop beep.", "kkkiiiill mmme", "I wwwaaannntt tttoo dddiiieeee...")) - - -/datum/disease/transformation/xeno - - name = "Xenomorph Transformation" - cure_text = "Spaceacillin & Glycerol" - cures = list("spaceacillin", "glycerol") - cure_chance = 5 - agent = "Rip-LEY Alien Microbes" - desc = "This disease changes the victim into a xenomorph." - severity = BIOHAZARD - visibility_flags = 0 - stage1 = null - stage2 = list("Your throat feels scratchy.", "Kill...") - stage3 = list("Your throat feels very scratchy.", "Your skin feels tight.", "You can feel something move...inside.") - stage4 = list("Your skin feels very tight.", "Your blood boils!", "You can feel... something...inside you.") - stage5 = list("Теперь вы ксеноморф.\n\ - Вы чувствуете боль от превращения! Вы желаете укусить того, кто с вами это сделал, благо, память вас не покинула и вы всё помните.") - new_form = null - -/datum/disease/transformation/xeno/New() - new_form = pick(/mob/living/carbon/alien/humanoid/hunter, /mob/living/carbon/alien/humanoid/drone/no_queen, /mob/living/carbon/alien/humanoid/sentinel) - -/datum/disease/transformation/xeno/stage_act() - ..() - switch(stage) - if(3) - if(prob(4)) - to_chat(affected_mob, "You feel a stabbing pain in your head.") - affected_mob.Paralyse(4 SECONDS) - if(4) - if(prob(20)) - affected_mob.say(pick("You look delicious.", "Going to... devour you...", "Hsssshhhhh!")) - - -/datum/disease/transformation/slime - name = "Advanced Mutation Transformation" - cure_text = "frost oil" - cures = list("frostoil") - cure_chance = 80 - agent = "Advanced Mutation Toxin" - desc = "This highly concentrated extract converts anything into more of itself." - severity = BIOHAZARD - visibility_flags = 0 - stage1 = list("You don't feel very well.") - stage2 = list("Your skin feels a little slimy.") - stage3 = list("Your appendages are melting away.", "Your limbs begin to lose their shape.") - stage4 = list("You are turning into a slime.") - stage5 = list("You have become a slime.") - new_form = /mob/living/simple_animal/slime/random - -/datum/disease/transformation/slime/stage_act() - ..() - switch(stage) - if(1) - if(ishuman(affected_mob)) - var/mob/living/carbon/human/H = affected_mob - if(isslimeperson(H)) - stage = 5 - if(3) - if(ishuman(affected_mob)) - var/mob/living/carbon/human/human = affected_mob - if(!isslimeperson(human)) - human.set_species(/datum/species/slime) - -/datum/disease/transformation/corgi - name = "The Barkening" - cure_text = "Death" - cures = list("adminordrazine") - agent = "Fell Doge Majicks" - desc = "This disease transforms the victim into a corgi." - visibility_flags = 0 - stage1 = list("BARK.") - stage2 = list("You feel the need to wear silly hats.") - stage3 = list("Must... eat... chocolate....", "YAP") - stage4 = list("Visions of washing machines assail your mind!") - stage5 = list("AUUUUUU!!!") - new_form = /mob/living/simple_animal/pet/dog/corgi - is_new_mind = TRUE - -/datum/disease/transformation/corgi/stage_act() - ..() - switch(stage) - if(3) - if(prob(8)) - affected_mob.say(pick("YAP", "Woof!")) - if(4) - if(prob(20)) - affected_mob.say(pick("Bark!", "AUUUUUU")) - -/datum/disease/transformation/morph - name = "Gluttony's Blessing" - cure_text = "nothing" - cures = list("adminordrazine") - agent = "Gluttony's Blessing" - desc = "A 'gift' from somewhere terrible." - stage_prob = 20 - severity = BIOHAZARD - visibility_flags = 0 - stage1 = list("Your stomach rumbles.") - stage2 = list("Your skin feels saggy.") - stage3 = list("Your appendages are melting away.", "Your limbs begin to lose their shape.") - stage4 = list("You're ravenous.") - stage5 = list("ТЕПЕРЬ ВЫ МОРФ! \n \ - Хоть Вы и трансформировались в отвратительную зелёную жижу, но это не повлияло на Ваше сознание \ - и память. Вы не являетесь антагонистом.") - new_form = /mob/living/simple_animal/hostile/morph diff --git a/code/datums/diseases/tuberculosis.dm b/code/datums/diseases/tuberculosis.dm deleted file mode 100644 index 970cc22914e..00000000000 --- a/code/datums/diseases/tuberculosis.dm +++ /dev/null @@ -1,59 +0,0 @@ -/datum/disease/tuberculosis - form = "Disease" - name = "Fungal tuberculosis" - max_stages = 5 - spread_text = "Airborne" - cure_text = "Spaceacillin & salbutamol" - cures = list("spaceacillin", "salbutamol") - agent = "Fungal Tubercle bacillus Cosmosis" - viable_mobtypes = list(/mob/living/carbon/human) - cure_chance = 5//like hell are you getting out of hell - desc = "A rare highly transmittable virulent virus. Few samples exist, rumoured to be carefully grown and cultured by clandestine bio-weapon specialists. Causes fever, blood vomiting, lung damage, weight loss, and fatigue." - required_organs = list(/obj/item/organ/internal/lungs) - severity = DANGEROUS - bypasses_immunity = TRUE //Fungal and bacterial in nature; also infects the lungs - -/datum/disease/tuberculosis/stage_act() //it begins - ..() - switch(stage) - if(2) - if(prob(2)) - affected_mob.emote("cough") - to_chat(affected_mob, "Your chest hurts.") - if(prob(2)) - to_chat(affected_mob, "Your stomach violently rumbles!") - if(prob(5)) - to_chat(affected_mob, "You feel a cold sweat form.") - if(4) - if(prob(2)) - to_chat(affected_mob, "You see four of everything") - affected_mob.Dizzy(10 SECONDS) - if(prob(2)) - to_chat(affected_mob, "You feel a sharp pain from your lower chest!") - affected_mob.adjustOxyLoss(5) - affected_mob.emote("gasp") - if(prob(10)) - to_chat(affected_mob, "You feel air escape from your lungs painfully.") - affected_mob.adjustOxyLoss(25) - affected_mob.emote("gasp") - if(5) - if(prob(2)) - to_chat(affected_mob, "[pick("You feel your heart slowing...", "You relax and slow your heartbeat.")]") - affected_mob.adjustStaminaLoss(70) - if(prob(10)) - affected_mob.adjustStaminaLoss(100) - affected_mob.visible_message("[affected_mob] faints!", "You surrender yourself and feel at peace...") - affected_mob.AdjustSleeping(10 SECONDS) - if(prob(2)) - to_chat(affected_mob, "You feel your mind relax and your thoughts drift!") - affected_mob.AdjustConfused(16 SECONDS, bound_lower = 0, bound_upper = 200 SECONDS) - if(prob(10)) - affected_mob.vomit(20) - if(prob(3)) - to_chat(affected_mob, "[pick("Your stomach silently rumbles...", "Your stomach seizes up and falls limp, muscles dead and lifeless.", "You could eat a crayon")]") - affected_mob.overeatduration = max(affected_mob.overeatduration - 100, 0) - affected_mob.adjust_nutrition(-100) - if(prob(15)) - to_chat(affected_mob, "[pick("You feel uncomfortably hot...", "You feel like unzipping your jumpsuit", "You feel like taking off some clothes...")]") - affected_mob.bodytemperature += 40 - return diff --git a/code/datums/diseases/vampire.dm b/code/datums/diseases/vampire.dm index e51f34796ac..29b90816d3d 100644 --- a/code/datums/diseases/vampire.dm +++ b/code/datums/diseases/vampire.dm @@ -1,20 +1,18 @@ /datum/disease/vampire name = "Grave Fever" - max_stages = 3 - stage_prob = 5 - spread_text = "Non-Contagious" - spread_flags = SPECIAL - cure_text = "Antibiotics" - cures = list("spaceacillin") agent = "Grave Dust" - cure_chance = 20 - viable_mobtypes = list(/mob/living/carbon/human) + max_stages = 4 + stage_prob = 5 + //TODO: Something with chaplain & cure + cures = list("garlic") + cure_prob = 8 severity = DANGEROUS - disease_flags = CURABLE - spread_flags = NON_CONTAGIOUS + can_immunity = FALSE /datum/disease/vampire/stage_act() - ..() + if(!..()) + return FALSE + var/toxdamage = stage * 2 var/stuntime = stage * 2 @@ -24,10 +22,10 @@ if(prob(15)) if(prob(33)) - to_chat(affected_mob, "You feel sickly and weak.") + to_chat(affected_mob, span_danger("You feel sickly and weak.")) affected_mob.Slowed(6 SECONDS) affected_mob.adjustToxLoss(toxdamage) if(prob(5)) - to_chat(affected_mob, "Your joints ache horribly!") + to_chat(affected_mob, span_danger("Your joints ache horribly!")) affected_mob.Weaken(stuntime STATUS_EFFECT_CONSTANT) diff --git a/code/datums/diseases/viruses/_virus.dm b/code/datums/diseases/viruses/_virus.dm new file mode 100644 index 00000000000..1057fc7a33b --- /dev/null +++ b/code/datums/diseases/viruses/_virus.dm @@ -0,0 +1,89 @@ +//Spread Flags +#define NON_CONTAGIOUS 0 //virus can't spread +#define BITES 1 //virus can spread with bites +#define BLOOD 2 //virus can spread with infected blood +#define CONTACT 4 //virus can spread with any touch +#define AIRBORNE 8 //virus spreads through the air + +/datum/disease/virus + form = "Вирус" + carrier_mobtypes = list(/mob/living/simple_animal/mouse) + var/spread_flags = NON_CONTAGIOUS + + ///affects how often the virus will try to spread. The more the better. In range [0-100] + var/infectivity = 65 + ///affects how well the virus will pass through the protection. The more the better. In range (0-2] + var/permeability_mod = 1 + +/datum/disease/virus/New() + ..() + additional_info = spread_text() + +/** + * Main virus process, that executed every tick + * + * Returns: + * * TRUE - if process finished the work properlly + * * FALSE - if don't need to call a child proc + */ +/datum/disease/virus/stage_act() + if(prob(infectivity)) + spread() + + . = ..() + + if(!. || carrier || (affected_mob.type in carrier_mobtypes)) + return FALSE + + return TRUE + +/datum/disease/virus/try_increase_stage() + if(prob(affected_mob.reagents?.has_reagent("spaceacillin") ? stage_prob/2 : stage_prob)) + stage = min(stage + 1,max_stages) + if(!discovered && stage >= CEILING(max_stages * discovery_threshold, 1)) // Once we reach a late enough stage, medical HUDs can pick us up even if we regress + discovered = TRUE + affected_mob.med_hud_set_status() + +/datum/disease/virus/spread(force_spread = 0) + if(!affected_mob) + return + + if((spread_flags <= BLOOD) && !force_spread) + return + + if(affected_mob.reagents?.has_reagent("spaceacillin") || (affected_mob.satiety > 0 && prob(affected_mob.satiety/10))) + return + + var/spread_range = force_spread ? force_spread : 1 + + if(spread_flags & AIRBORNE) + spread_range++ + + var/turf/T = affected_mob.loc + if(istype(T)) + for(var/mob/living/C in oview(spread_range, affected_mob)) + var/turf/V = get_turf(C) + if(V) + while(TRUE) + if(V == T) + var/a_type = (spread_range == 1) ? CONTACT : CONTACT|AIRBORNE + Contract(C, act_type = a_type, need_protection_check = TRUE) + break + var/turf/Temp = get_step_towards(V, T) + if(!V.CanAtmosPass(Temp)) + break + V = Temp + +/datum/disease/virus/proc/spread_text() + var/list/spread = list() + if(!spread_flags) + spread += "Не заразный" + if(spread_flags & BITES) + spread += "Распространяемый через укусы" + if(spread_flags & BLOOD) + spread += "Распространяемый через кровь" + if(spread_flags & CONTACT) + spread += "Контактный" + if(spread_flags & AIRBORNE) + spread += "Воздушно-капельный" + return english_list(spread, "Неизвестен", " и ") diff --git a/code/datums/diseases/advance/advance.dm b/code/datums/diseases/viruses/advance/advance.dm similarity index 59% rename from code/datums/diseases/advance/advance.dm rename to code/datums/diseases/viruses/advance/advance.dm index de99208c2ca..2e85700833f 100644 --- a/code/datums/diseases/advance/advance.dm +++ b/code/datums/diseases/viruses/advance/advance.dm @@ -3,10 +3,11 @@ Advance Disease is a system for Virologist to Engineer their own disease with symptoms that have effects and properties which add onto the overall disease. - If you need help with creating new symptoms or expanding the advance disease, ask for Giacom on #coderbus. - */ +#define VIRUS_SYMPTOM_LIMIT 6 +#define VIRUS_MAX_SYMPTOM_LEVEL 6 + // The order goes from easy to cure to hard to cure. GLOBAL_LIST_INIT(advance_cures, list( "sodiumchloride", "sugar", "orangejuice", @@ -23,15 +24,13 @@ GLOBAL_LIST_EMPTY(archive_diseases) */ -/datum/disease/advance +/datum/disease/virus/advance name = "Unknown" // We will always let our Virologist name our disease. desc = "Спроектированная болезнь, может содержать сразу несколько симптомов." - form = "Улучшенная болезнь" // Will let med-scanners know that this disease was engineered. + form = "Продвинутая болезнь" // Will let med-scanners know that this disease was engineered. agent = "advance microbes" max_stages = 5 - spread_text = "Unknown" - viable_mobtypes = list(/mob/living/carbon/human) // NEW VARS @@ -39,21 +38,22 @@ GLOBAL_LIST_EMPTY(archive_diseases) var/id = "" var/processing = 0 -/datum/disease/advance/New() +/datum/disease/virus/advance/New() if(!symptoms || !symptoms.len) - symptoms = GenerateSymptoms(0, 2) + symptoms = GenerateSymptoms(1, 2) AssignProperties(GenerateProperties()) id = GetDiseaseID() + ..() -/datum/disease/advance/Destroy() +/datum/disease/virus/advance/Destroy() if(processing) for(var/datum/symptom/S in symptoms) S.End(src) return ..() // Randomly pick a symptom to activate. -/datum/disease/advance/stage_act() +/datum/disease/virus/advance/stage_act() if(!..()) return FALSE if(symptoms && symptoms.len) @@ -70,9 +70,8 @@ GLOBAL_LIST_EMPTY(archive_diseases) return TRUE // Compares type then ID. -/datum/disease/advance/IsSame(datum/disease/advance/D) - - if(!(istype(D, /datum/disease/advance))) +/datum/disease/virus/advance/IsSame(datum/disease/virus/advance/D) + if(!(istype(D, /datum/disease/virus/advance))) return FALSE if(GetDiseaseID() != D.GetDiseaseID()) @@ -80,19 +79,16 @@ GLOBAL_LIST_EMPTY(archive_diseases) return TRUE // To add special resistances. -/datum/disease/advance/cure(resistance = TRUE) - if(affected_mob) - var/id = "[GetDiseaseID()]" - if(resistance && !(id in affected_mob.resistances)) - affected_mob.resistances[id] = id - remove_virus() - qdel(src) //delete the datum to stop it processing +/datum/disease/virus/advance/cure(id, need_immunity) + ..(GetDiseaseID(), need_immunity) // Returns the advance disease with a different reference memory. -/datum/disease/advance/Copy() - var/datum/disease/advance/copy = new - var/list/skipped = list("symptoms","affected_mob","holder","carrier","stage","type","parent_type","vars","transformed") - for(var/V in vars - skipped) +/datum/disease/virus/advance/Copy() + var/datum/disease/virus/advance/copy = new + var/list/required_vars = list( + "name","severity","id","visibility_flags","spread_flags", "additional_info", + "stage_prob","cures","cure_prob","cure_text", "permeability_mod") + for(var/V in required_vars) if(istype(vars[V], /list)) var/list/L = vars[V] copy.vars[V] = L.Copy() @@ -104,20 +100,20 @@ GLOBAL_LIST_EMPTY(archive_diseases) return copy // Mix the symptoms of two diseases (the src and the argument) -/datum/disease/advance/proc/Mix(datum/disease/advance/D) +/datum/disease/virus/advance/proc/Mix(datum/disease/virus/advance/D) if(!(IsSame(D))) var/list/possible_symptoms = shuffle(D.symptoms) for(var/datum/symptom/S in possible_symptoms) AddSymptom(new S.type) -/datum/disease/advance/proc/HasSymptom(datum/symptom/S) +/datum/disease/virus/advance/proc/HasSymptom(datum/symptom/S) for(var/datum/symptom/symp in symptoms) if(symp.id == S.id) - return 1 - return 0 + return TRUE + return FALSE // Will generate new unique symptoms, use this if there are none. Returns a list of symptoms that were generated. -/datum/disease/advance/proc/GenerateSymptoms(level_min, level_max, amount_get = 0) +/datum/disease/virus/advance/proc/GenerateSymptoms(level_min = 1, level_max = VIRUS_MAX_SYMPTOM_LEVEL, count_of_symptoms = 0, override_symptoms = FALSE) var/list/generated = list() // Symptoms we generated. @@ -126,31 +122,31 @@ GLOBAL_LIST_EMPTY(archive_diseases) for(var/symp in GLOB.list_symptoms) var/datum/symptom/S = new symp if(S.level >= level_min && S.level <= level_max) - if(!HasSymptom(S)) + if(!HasSymptom(S) || override_symptoms) possible_symptoms += S if(!possible_symptoms.len) return generated - // Random chance to get more than one symptom - var/number_of = amount_get - if(!amount_get) - number_of = 1 - while(prob(20)) - number_of += 1 + var/N = 1 + if(count_of_symptoms) + N = count_of_symptoms + else + while(prob(20) && N < VIRUS_SYMPTOM_LIMIT) + N++ - for(var/i = 1; number_of >= i && possible_symptoms.len; i++) + for(var/i = 1; i <= N && possible_symptoms.len; i++) generated += pick_n_take(possible_symptoms) return generated -/datum/disease/advance/proc/Refresh(var/update_mutations = TRUE, var/reset_name = FALSE) - AssignProperties(GenerateProperties()) +/datum/disease/virus/advance/proc/Refresh(reset_name = FALSE, update_properties = TRUE) + if(update_properties) + AssignProperties(GenerateProperties()) id = GetDiseaseID() - var/datum/disease/advance/A = GLOB.archive_diseases[id] - if(update_mutations) - UpdateMutationsProps(A) + var/datum/disease/virus/advance/A = GLOB.archive_diseases[id] + UpdateMutationsProps(A) if(A) name = A.name @@ -159,17 +155,17 @@ GLOBAL_LIST_EMPTY(archive_diseases) name = "Unknown" AddToArchive() -/datum/disease/advance/proc/AddToArchive() +/datum/disease/virus/advance/proc/AddToArchive() GLOB.archive_diseases[id] = Copy() -/datum/disease/advance/proc/UpdateMutationsProps(var/datum/disease/advance/A) - var/datum/disease/advance/AA = A ? A : new +/datum/disease/virus/advance/proc/UpdateMutationsProps(datum/disease/virus/advance/A) + var/datum/disease/virus/advance/AA = A ? A : new mutation_reagents = AA.mutation_reagents.Copy() possible_mutations = AA.possible_mutations?.Copy() //Generate disease properties based on the effects. Returns an associated list. -/datum/disease/advance/proc/GenerateProperties() +/datum/disease/virus/advance/proc/GenerateProperties() if(!symptoms || !symptoms.len) CRASH("We did not have any symptoms before generating properties.") @@ -187,76 +183,66 @@ GLOBAL_LIST_EMPTY(archive_diseases) return properties // Assign the properties that are in the list. -/datum/disease/advance/proc/AssignProperties(list/properties = list()) - +/datum/disease/virus/advance/proc/AssignProperties(list/properties = list()) if(properties && properties.len) + // stealth switch(properties["stealth"]) + if(1) + visibility_flags = HIDDEN_HUD if(2) - visibility_flags = HIDDEN_SCANNER + visibility_flags = HIDDEN_HUD|HIDDEN_SCANNER if(3 to INFINITY) - visibility_flags = HIDDEN_SCANNER|HIDDEN_PANDEMIC + visibility_flags = HIDDEN_HUD|HIDDEN_SCANNER|HIDDEN_PANDEMIC else visibility_flags = VISIBLE - // The more symptoms we have, the less transmittable it is but some symptoms can make up for it. - SetSpread(clamp(2 ** (properties["transmittable"] - symptoms.len), BLOOD, AIRBORNE)) - permeability_mod = max(CEILING(0.4 * properties["transmittable"], 1), 1) - cure_chance = 15 - clamp(properties["resistance"], -5, 5) // can be between 10 and 20 - stage_prob = max(properties["stage_speed"], 2) - SetSeverity(properties["severity"]) - GenerateCure(properties) + // transmittable + switch(properties["transmittable"] - round(symptoms.len/2)) + if(-INFINITY to 1) + spread_flags = BLOOD + if(2 to 3) + spread_flags = CONTACT + if(4 to INFINITY) + spread_flags = AIRBORNE + additional_info = spread_text() + permeability_mod = clamp((0.25 * properties["transmittable"]), 0.2, 2) + + //stage speed + stage_prob = clamp(max(1.3 * sqrtor0(properties["stage_speed"] + 11), properties["stage_speed"]), 1, 40) + + //severity + switch(properties["severity"]) + if(-INFINITY to 0) + severity = NONTHREAT + if(1) + severity = MINOR + if(2) + severity = MEDIUM + if(3) + severity = HARMFUL + if(4) + severity = DANGEROUS + if(5 to INFINITY) + severity = BIOHAZARD + + //resistance + cure_prob = clamp(15 - properties["resistance"], 5, 40) + GenerateCure(properties["resistance"]) else CRASH("Our properties were empty or null!") - -// Assign the spread type and give it the correct description. -/datum/disease/advance/proc/SetSpread(spread_id) - switch(spread_id) - if(NON_CONTAGIOUS) - spread_text = "None" - if(SPECIAL) - spread_text = "None" - if(CONTACT_GENERAL, CONTACT_HANDS, CONTACT_FEET) - spread_text = "On contact" - if(AIRBORNE) - spread_text = "Airborne" - if(BLOOD) - spread_text = "Blood" - - spread_flags = spread_id - -/datum/disease/advance/proc/SetSeverity(level_sev) - - switch(level_sev) - - if(-INFINITY to 0) - severity = NONTHREAT - if(1) - severity = MINOR - if(2) - severity = MEDIUM - if(3) - severity = HARMFUL - if(4) - severity = DANGEROUS - if(5 to INFINITY) - severity = BIOHAZARD - else - severity = "Unknown" - - +//TODO: доделать эту хуйню // Will generate a random cure, the less resistance the symptoms have, the harder the cure. -/datum/disease/advance/proc/GenerateCure(list/properties = list()) - if(properties && properties.len) - var/res = round(clamp(properties["resistance"] - (symptoms.len / 2), 1, GLOB.advance_cures.len)) +/datum/disease/virus/advance/proc/GenerateCure(resistance) + var/res = round(clamp(resistance - (symptoms.len / 2), 1, GLOB.advance_cures.len)) - // Get the cure name from the cure_id - var/datum/reagent/D = GLOB.chemical_reagents_list[GLOB.advance_cures[res]] - cures = list(GLOB.advance_cures[res]) - cure_text = D.name + // Get the cure name from the cure_id + var/datum/reagent/D = GLOB.chemical_reagents_list[GLOB.advance_cures[res]] + cures = list(GLOB.advance_cures[res]) + cure_text = D.name // Randomly generate a symptom, has a chance to lose or gain a symptom. -/datum/disease/advance/proc/Evolve(min_level, max_level) +/datum/disease/virus/advance/proc/Evolve(min_level, max_level) var/s = safepick(GenerateSymptoms(min_level, max_level, 1)) if(s) AddSymptom(s) @@ -264,7 +250,7 @@ GLOBAL_LIST_EMPTY(archive_diseases) return // Randomly remove a symptom. -/datum/disease/advance/proc/Devolve() +/datum/disease/virus/advance/proc/Devolve() if(symptoms.len > 1) var/s = safepick(symptoms) if(s) @@ -273,12 +259,12 @@ GLOBAL_LIST_EMPTY(archive_diseases) return // Name the disease. -/datum/disease/advance/proc/AssignName(name = "Unknown") +/datum/disease/virus/advance/proc/AssignName(name = "Unknown") src.name = name return // Return a unique ID of the disease. -/datum/disease/advance/GetDiseaseID() +/datum/disease/virus/advance/GetDiseaseID() var/list/L = list() for(var/datum/symptom/S in symptoms) L += S.id @@ -287,7 +273,7 @@ GLOBAL_LIST_EMPTY(archive_diseases) // Add a symptom, if it is over the limit (with a small chance to be able to go over) // we take a random symptom away and add the new one. -/datum/disease/advance/proc/AddSymptom(datum/symptom/S) +/datum/disease/virus/advance/proc/AddSymptom(datum/symptom/S) if(HasSymptom(S)) return @@ -300,10 +286,15 @@ GLOBAL_LIST_EMPTY(archive_diseases) return // Simply removes the symptom. -/datum/disease/advance/proc/RemoveSymptom(datum/symptom/S) +/datum/disease/virus/advance/proc/RemoveSymptom(datum/symptom/S) symptoms -= S return +/datum/disease/virus/advance/CanContract(mob/living/M, act_type, need_protection_check, zone) + . = ..() + if(count_by_type(M.diseases, /datum/disease/virus/advance) > 0) + . = FALSE + /* Static Procs @@ -315,7 +306,7 @@ GLOBAL_LIST_EMPTY(archive_diseases) var/list/diseases = list() - for(var/datum/disease/advance/A in D_list) + for(var/datum/disease/virus/advance/A in D_list) diseases += A.Copy() if(!diseases.len) @@ -329,15 +320,15 @@ GLOBAL_LIST_EMPTY(archive_diseases) i++ - var/datum/disease/advance/D1 = pick(diseases) + var/datum/disease/virus/advance/D1 = pick(diseases) diseases -= D1 - var/datum/disease/advance/D2 = pick(diseases) + var/datum/disease/virus/advance/D2 = pick(diseases) D2.Mix(D1) // Should be only 1 entry left, but if not let's only return a single entry // to_chat(world, "END MIXING!!!!!") - var/datum/disease/advance/to_return = pick(diseases) + var/datum/disease/virus/advance/to_return = pick(diseases) to_return.Refresh(reset_name = TRUE) return to_return @@ -345,7 +336,7 @@ GLOBAL_LIST_EMPTY(archive_diseases) if(data) var/list/preserve = list() if(istype(data) && data["viruses"]) - for(var/datum/disease/A in data["viruses"]) + for(var/datum/disease/virus/A in data["viruses"]) preserve += A.Copy() R.data = data.Copy() if(preserve.len) @@ -358,7 +349,7 @@ GLOBAL_LIST_EMPTY(archive_diseases) var/i = VIRUS_SYMPTOM_LIMIT - var/datum/disease/advance/D = new + var/datum/disease/virus/advance/D = new D.Refresh() D.symptoms = list() @@ -387,7 +378,7 @@ GLOBAL_LIST_EMPTY(archive_diseases) D.AssignName(new_name) D.Refresh() - for(var/datum/disease/advance/AD in GLOB.active_diseases) + for(var/datum/disease/virus/advance/AD in GLOB.active_diseases) AD.Refresh() for(var/thing in shuffle(GLOB.human_list)) @@ -395,7 +386,7 @@ GLOBAL_LIST_EMPTY(archive_diseases) if(H.stat == DEAD || !is_station_level(H.z)) continue if(!H.HasDisease(D)) - H.ForceContractDisease(D) + D.Contract(H) break var/list/name_symptoms = list() @@ -403,30 +394,42 @@ GLOBAL_LIST_EMPTY(archive_diseases) name_symptoms += S.name message_admins("[key_name_admin(user)] has triggered a custom virus outbreak of [D.name]! It has these symptoms: [english_list(name_symptoms)]") +/** + * Creates and returns a random virus with properties independent of symptoms properties + */ +/proc/CreateRandomVirus(level_min = 1, level_max = VIRUS_MAX_SYMPTOM_LEVEL, count_of_symptoms = 6, + resistance, stealth, stage_rate, transmittable, severity) + + var/datum/disease/virus/advance/A = new + A.name = capitalize(pick(GLOB.adjectives)) + " " + capitalize(pick(GLOB.nouns + GLOB.verbs)) + A.symptoms = A.GenerateSymptoms(count_of_symptoms = rand(4, 6), override_symptoms = TRUE) + A.AssignProperties(list("resistance" = resistance, "stealth" = stealth, "stage_rate" = stage_rate, "transmittable" = transmittable, "severity" = severity)) + A.Refresh(update_properties = FALSE) + return A -/datum/disease/advance/proc/totalStageSpeed() +/datum/disease/virus/advance/proc/totalStageSpeed() var/total_stage_speed = 0 for(var/i in symptoms) var/datum/symptom/S = i total_stage_speed += S.stage_speed return total_stage_speed -/datum/disease/advance/proc/totalStealth() +/datum/disease/virus/advance/proc/totalStealth() var/total_stealth = 0 for(var/i in symptoms) var/datum/symptom/S = i total_stealth += S.stealth return total_stealth -/datum/disease/advance/proc/totalResistance() +/datum/disease/virus/advance/proc/totalResistance() var/total_resistance = 0 for(var/i in symptoms) var/datum/symptom/S = i total_resistance += S.resistance return total_resistance -/datum/disease/advance/proc/totalTransmittable() +/datum/disease/virus/advance/proc/totalTransmittable() var/total_transmittable = 0 for(var/i in symptoms) var/datum/symptom/S = i diff --git a/code/datums/diseases/advance/presets.dm b/code/datums/diseases/viruses/advance/presets.dm similarity index 63% rename from code/datums/diseases/advance/presets.dm rename to code/datums/diseases/viruses/advance/presets.dm index 872ce088871..42b0701f6e4 100644 --- a/code/datums/diseases/advance/presets.dm +++ b/code/datums/diseases/viruses/advance/presets.dm @@ -1,107 +1,107 @@ // Cold -/datum/disease/advance/preset/cold - name = "Cold" +/datum/disease/virus/advance/preset/sneezing + name = "Sneezing" symptoms = list(new/datum/symptom/sneeze) // Flu -/datum/disease/advance/preset/flu - name = "Flu" +/datum/disease/virus/advance/preset/cough + name = "Cough" symptoms = list(new/datum/symptom/cough) // Voice Changing -/datum/disease/advance/preset/voice_change +/datum/disease/virus/advance/preset/voice_change name = "Epiglottis Mutation" symptoms = list(new/datum/symptom/voice_change) // Toxin Filter -/datum/disease/advance/preset/heal +/datum/disease/virus/advance/preset/heal name = "Liver Enhancer" symptoms = list(new/datum/symptom/heal) - possible_mutations = list(/datum/disease/advance/preset/advanced_regeneration, /datum/disease/advance/preset/cold/) + possible_mutations = list(/datum/disease/virus/advance/preset/advanced_regeneration, /datum/disease/virus/advance/preset/sneezing) // Hullucigen -/datum/disease/advance/preset/hullucigen +/datum/disease/virus/advance/preset/hullucigen name = "Reality Impairment" symptoms = list(new/datum/symptom/hallucigen) - possible_mutations = list(/datum/disease/brainrot, /datum/disease/advance/preset/sensory_restoration) + possible_mutations = list(/datum/disease/virus/brainrot, /datum/disease/virus/advance/preset/sensory_restoration) // Sensory Restoration -/datum/disease/advance/preset/sensory_restoration +/datum/disease/virus/advance/preset/sensory_restoration name = "Reality Enhancer" symptoms = list(new/datum/symptom/sensory_restoration) // Mind Restoration -/datum/disease/advance/preset/mind_restoration +/datum/disease/virus/advance/preset/mind_restoration name = "Reality Purifier" symptoms = list(new/datum/symptom/mind_restoration) // Toxic Filter + Toxic Compensation + Viral Evolutionary Acceleration -/datum/disease/advance/preset/advanced_regeneration +/datum/disease/virus/advance/preset/advanced_regeneration name = "Advanced Neogenesis" symptoms = list(new/datum/symptom/heal, new/datum/symptom/damage_converter, new/datum/symptom/viralevolution) // Necrotizing Fasciitis + Viral Self-Adaptation + Eternal Youth + Dizziness -/datum/disease/advance/preset/stealth_necrosis +/datum/disease/virus/advance/preset/stealth_necrosis name = "Necroeyrosis" symptoms = list(new/datum/symptom/flesh_eating, new/datum/symptom/viraladaptation, new/datum/symptom/youth, new/datum/symptom/dizzy) mutation_reagents = list("mutagen", "histamine") - possible_mutations = list(/datum/disease/transformation/xeno) + possible_mutations = list(/datum/disease/virus/transformation/xeno) //Facial Hypertrichosis + Voice Change + Itching -/datum/disease/advance/preset/pre_kingstons +/datum/disease/virus/advance/preset/pre_kingstons name = "Neverlasting Stranger" symptoms = list(new/datum/symptom/beard, new/datum/symptom/voice_change, new/datum/symptom/itching) mutation_reagents = list("mutagen", "radium") - possible_mutations = list(/datum/disease/kingstons) + possible_mutations = list(/datum/disease/virus/kingstons) //Pacifist Syndrome -/datum/disease/advance/preset/love +/datum/disease/virus/advance/preset/love name = "Pacifist Syndrome" symptoms = list(new/datum/symptom/love) //Uncontrollable Aggression -/datum/disease/advance/preset/aggression +/datum/disease/virus/advance/preset/aggression name = "Uncontrollable Aggression" symptoms = list(new/datum/symptom/aggression) //Uncontrollable Actions -/datum/disease/advance/preset/obsession +/datum/disease/virus/advance/preset/obsession name = "Uncontrollable Actions" symptoms = list(new/datum/symptom/obsession) //Topographical Cretinism -/datum/disease/advance/preset/confusion +/datum/disease/virus/advance/preset/confusion name = "Topographical Cretinism" symptoms = list(new/datum/symptom/confusion) //Fragile Bones Syndrome -/datum/disease/advance/preset/bones +/datum/disease/virus/advance/preset/bones name = "Fragile Bones Syndrome" symptoms = list(new/datum/symptom/bones) //Limb Rejection -/datum/disease/advance/preset/limb_throw +/datum/disease/virus/advance/preset/limb_throw name = "Limb Rejection" symptoms = list(new/datum/symptom/limb_throw) //Uncontrolled Laughter Effect -/datum/disease/advance/preset/laugh +/datum/disease/virus/advance/preset/laugh name = "Uncontrolled Laughter Effect" symptoms = list(new/datum/symptom/laugh) //Groaning Syndrome -/datum/disease/advance/preset/moan +/datum/disease/virus/advance/preset/moan name = "Groaning Syndrome" symptoms = list(new/datum/symptom/moan) //Toxification syndrome -/datum/disease/advance/preset/infection +/datum/disease/virus/advance/preset/infection name = "Toxification syndrome" symptoms = list(new/datum/symptom/infection) // Uncontrolled Laughter Effect + Groaning Syndrome + Hullucigen -/datum/disease/advance/preset/pre_loyalty +/datum/disease/virus/advance/preset/pre_loyalty name = "Merry sufferer" symptoms = list(new/datum/symptom/laugh, new/datum/symptom/moan, new/datum/symptom/hallucigen) mutation_reagents = list("love") - possible_mutations = list(/datum/disease/loyalty) + possible_mutations = list(/datum/disease/virus/loyalty) diff --git a/code/datums/diseases/advance/symptoms/beard.dm b/code/datums/diseases/viruses/advance/symptoms/beard.dm similarity index 83% rename from code/datums/diseases/advance/symptoms/beard.dm rename to code/datums/diseases/viruses/advance/symptoms/beard.dm index 26b6e9e4096..16e0113bdfe 100644 --- a/code/datums/diseases/advance/symptoms/beard.dm +++ b/code/datums/diseases/viruses/advance/symptoms/beard.dm @@ -25,7 +25,7 @@ BONUS level = 4 severity = 1 -/datum/symptom/beard/Activate(datum/disease/advance/A) +/datum/symptom/beard/Activate(datum/disease/virus/advance/A) ..() if(prob(SYMPTOM_ACTIVATION_PROB)) var/mob/living/M = A.affected_mob @@ -34,17 +34,17 @@ BONUS var/obj/item/organ/external/head/head_organ = H.get_organ("head") switch(A.stage) if(1, 2) - to_chat(H, "Your chin itches.") + to_chat(H, span_warning("Your chin itches.")) if(head_organ.f_style == "Shaved") head_organ.f_style = "Jensen Beard" H.update_fhair() if(3, 4) - to_chat(H, "You feel tough.") + to_chat(H, span_warning("You feel tough.")) if(!(head_organ.f_style == "Dwarf Beard") && !(head_organ.f_style == "Very Long Beard") && !(head_organ.f_style == "Full Beard")) head_organ.f_style = "Full Beard" H.update_fhair() else - to_chat(H, "You feel manly!") + to_chat(H, span_warning("You feel manly!")) if(!(head_organ.f_style == "Dwarf Beard") && !(head_organ.f_style == "Very Long Beard")) head_organ.f_style = pick("Dwarf Beard", "Very Long Beard") H.update_fhair() diff --git a/code/datums/diseases/advance/symptoms/blood.dm b/code/datums/diseases/viruses/advance/symptoms/blood.dm similarity index 79% rename from code/datums/diseases/advance/symptoms/blood.dm rename to code/datums/diseases/viruses/advance/symptoms/blood.dm index 4ebb8b582df..87878e6f154 100644 --- a/code/datums/diseases/advance/symptoms/blood.dm +++ b/code/datums/diseases/viruses/advance/symptoms/blood.dm @@ -24,16 +24,16 @@ Bonus level = 5 var/check = FALSE -/datum/symptom/blood/Activate(datum/disease/advance/A) +/datum/symptom/blood/Activate(datum/disease/virus/advance/A) ..() var/mob/living/M = A.affected_mob if(prob(SYMPTOM_ACTIVATION_PROB)) switch(A.stage) if(3,4) - to_chat(M, "You feel hungry") + to_chat(M, span_notice("You feel hungry")) if(5) if(prob(10)) - to_chat(M, "You can hear own heartbeat") + to_chat(M, span_notice("You can hear own heartbeat")) check = TRUE if(check == TRUE && (M.blood_volume < BLOOD_VOLUME_NORMAL) && !(NO_BLOOD in M.dna.species.species_traits)) M.blood_volume += 0.4 diff --git a/code/datums/diseases/advance/symptoms/bones.dm b/code/datums/diseases/viruses/advance/symptoms/bones.dm similarity index 94% rename from code/datums/diseases/advance/symptoms/bones.dm rename to code/datums/diseases/viruses/advance/symptoms/bones.dm index 83de1b8c5ee..b5186c34a9f 100644 --- a/code/datums/diseases/advance/symptoms/bones.dm +++ b/code/datums/diseases/viruses/advance/symptoms/bones.dm @@ -20,7 +20,7 @@ Fragile Bones Syndrome var/fragile_bones_chance = 3 var/done = FALSE -/datum/symptom/bones/Activate(datum/disease/advance/A) +/datum/symptom/bones/Activate(datum/disease/virus/advance/A) ..() var/mob/living/carbon/human/M = A.affected_mob if(prob(SYMPTOM_ACTIVATION_PROB * 4)) @@ -62,7 +62,7 @@ Fragile Bones Syndrome return -/datum/symptom/bones/End(datum/disease/advance/A) +/datum/symptom/bones/End(datum/disease/virus/advance/A) var/mob/living/carbon/human/M = A.affected_mob M.dna.species.bonefragility /= bonefragility_multiplier M.dna.species.fragile_bones_chance -= fragile_bones_chance diff --git a/code/datums/diseases/advance/symptoms/booze.dm b/code/datums/diseases/viruses/advance/symptoms/booze.dm similarity index 74% rename from code/datums/diseases/advance/symptoms/booze.dm rename to code/datums/diseases/viruses/advance/symptoms/booze.dm index 93111d5e76a..d7542908eb4 100644 --- a/code/datums/diseases/advance/symptoms/booze.dm +++ b/code/datums/diseases/viruses/advance/symptoms/booze.dm @@ -24,7 +24,7 @@ Bonus transmittable = -2 level = 3 -/datum/symptom/booze/Activate(datum/disease/advance/A) +/datum/symptom/booze/Activate(datum/disease/virus/advance/A) ..() if(prob(SYMPTOM_ACTIVATION_PROB * 2)) var/mob/living/M = A.affected_mob @@ -33,5 +33,5 @@ Bonus M.reagents.add_reagent(pick("rum", "vodka", "whiskey", "ale", "cider", "mead", "tequila", "wine", "beer"), 5) //somewhat safe drinks else if(prob(SYMPTOM_ACTIVATION_PROB * 5)) - to_chat(M, "[pick("You feel warmth.", "You feel joyful.", "You relax for a moment")]") //span class notice because this is a drunkeness. Epic mind games ensues + to_chat(M, span_notice(pick("You feel warmth.", "You feel joyful.", "You relax for a moment"))) //span class notice because this is a drunkeness. Epic mind games ensues return diff --git a/code/datums/diseases/advance/symptoms/choking.dm b/code/datums/diseases/viruses/advance/symptoms/choking.dm similarity index 64% rename from code/datums/diseases/advance/symptoms/choking.dm rename to code/datums/diseases/viruses/advance/symptoms/choking.dm index ab5bfbb0358..2dcb01e9c0d 100644 --- a/code/datums/diseases/advance/symptoms/choking.dm +++ b/code/datums/diseases/viruses/advance/symptoms/choking.dm @@ -26,29 +26,29 @@ Bonus level = 3 severity = 3 -/datum/symptom/choking/Activate(datum/disease/advance/A) +/datum/symptom/choking/Activate(datum/disease/virus/advance/A) ..() if(prob(SYMPTOM_ACTIVATION_PROB)) var/mob/living/M = A.affected_mob switch(A.stage) if(1, 2) - to_chat(M, "[pick("You're having difficulty breathing.", "Your breathing becomes heavy.")]") + to_chat(M, span_warning(pick("You're having difficulty breathing.", "Your breathing becomes heavy."))) if(3, 4) - to_chat(M, "[pick("Your windpipe feels like a straw.", "Your breathing becomes tremendously difficult.")]") + to_chat(M, span_warning("[pick("Your windpipe feels like a straw.", "Your breathing becomes tremendously difficult.")]")) Choke_stage_3_4(M, A) M.emote("gasp") else - to_chat(M, "[pick("You're choking!", "You can't breathe!")]") + to_chat(M, span_userdanger(pick("You're choking!", "You can't breathe!"))) Choke(M, A) M.emote("gasp") return -/datum/symptom/choking/proc/Choke_stage_3_4(mob/living/M, datum/disease/advance/A) +/datum/symptom/choking/proc/Choke_stage_3_4(mob/living/M, datum/disease/virus/advance/A) var/get_damage = sqrtor0(21+A.totalStageSpeed()*0.5)+sqrtor0(16+A.totalStealth()) M.adjustOxyLoss(get_damage) return 1 -/datum/symptom/choking/proc/Choke(mob/living/M, datum/disease/advance/A) +/datum/symptom/choking/proc/Choke(mob/living/M, datum/disease/virus/advance/A) var/get_damage = sqrtor0(21+A.totalStageSpeed()*0.5)+sqrtor0(16+A.totalStealth()*5) M.adjustOxyLoss(get_damage) return 1 diff --git a/code/datums/diseases/advance/symptoms/confusion.dm b/code/datums/diseases/viruses/advance/symptoms/confusion.dm similarity index 74% rename from code/datums/diseases/advance/symptoms/confusion.dm rename to code/datums/diseases/viruses/advance/symptoms/confusion.dm index 3d7fd4dd5b6..d0f430f3cba 100644 --- a/code/datums/diseases/advance/symptoms/confusion.dm +++ b/code/datums/diseases/viruses/advance/symptoms/confusion.dm @@ -27,16 +27,16 @@ Bonus severity = 2 -/datum/symptom/confusion/Activate(datum/disease/advance/A) +/datum/symptom/confusion/Activate(datum/disease/virus/advance/A) ..() var/mob/living/carbon/M = A.affected_mob switch(A.stage) if(1, 2, 3, 4) if(prob(SYMPTOM_ACTIVATION_PROB)) - to_chat(M, "[pick("Your head hurts.", "Your mind blanks for a moment.")]") + to_chat(M, span_warning(pick("Your head hurts.", "Your mind blanks for a moment."))) else if(prob(SYMPTOM_ACTIVATION_PROB * 3)) - to_chat(M, "You can't think straight!") + to_chat(M, span_userdanger("You can't think straight!")) M.AdjustConfused(20 SECONDS, bound_lower = 0, bound_upper = 200 SECONDS) M.Disoriented(1) diff --git a/code/datums/diseases/advance/symptoms/cough.dm b/code/datums/diseases/viruses/advance/symptoms/cough.dm similarity index 79% rename from code/datums/diseases/advance/symptoms/cough.dm rename to code/datums/diseases/viruses/advance/symptoms/cough.dm index d9a0e3b008b..d6c24d72008 100644 --- a/code/datums/diseases/advance/symptoms/cough.dm +++ b/code/datums/diseases/viruses/advance/symptoms/cough.dm @@ -26,13 +26,13 @@ BONUS level = 1 severity = 1 -/datum/symptom/cough/Activate(datum/disease/advance/A) +/datum/symptom/cough/Activate(datum/disease/virus/advance/A) ..() if(prob(SYMPTOM_ACTIVATION_PROB)) var/mob/living/M = A.affected_mob switch(A.stage) if(1, 2, 3) - to_chat(M, "[pick("You swallow excess mucus.", "You lightly cough.")]") + to_chat(M, span_notice(pick("You swallow excess mucus.", "You lightly cough."))) else M.emote("cough") var/obj/item/I = M.get_active_hand() diff --git a/code/datums/diseases/advance/symptoms/damage_converter.dm b/code/datums/diseases/viruses/advance/symptoms/damage_converter.dm similarity index 90% rename from code/datums/diseases/advance/symptoms/damage_converter.dm rename to code/datums/diseases/viruses/advance/symptoms/damage_converter.dm index 94826f4cbde..cf713948ffe 100644 --- a/code/datums/diseases/advance/symptoms/damage_converter.dm +++ b/code/datums/diseases/viruses/advance/symptoms/damage_converter.dm @@ -25,7 +25,7 @@ Bonus transmittable = -2 level = 4 -/datum/symptom/damage_converter/Activate(datum/disease/advance/A) +/datum/symptom/damage_converter/Activate(datum/disease/virus/advance/A) ..() if(prob(SYMPTOM_ACTIVATION_PROB * 10)) var/mob/living/M = A.affected_mob @@ -48,10 +48,9 @@ Bonus var/healed = 0 for(var/obj/item/organ/external/E in parts) healed += min(E.brute_dam, get_damage) + min(E.burn_dam, get_damage) - E.heal_damage(get_damage, get_damage, 0, 0) + E.heal_damage(get_damage, get_damage, updating_health = TRUE) M.adjustToxLoss(healed) - else if(M.getFireLoss() > 0 || M.getBruteLoss() > 0) M.adjustFireLoss(-get_damage) diff --git a/code/datums/diseases/advance/symptoms/deafness.dm b/code/datums/diseases/viruses/advance/symptoms/deafness.dm similarity index 65% rename from code/datums/diseases/advance/symptoms/deafness.dm rename to code/datums/diseases/viruses/advance/symptoms/deafness.dm index 7d9184ec7b9..381fe5a9be3 100644 --- a/code/datums/diseases/advance/symptoms/deafness.dm +++ b/code/datums/diseases/viruses/advance/symptoms/deafness.dm @@ -26,19 +26,19 @@ Bonus level = 4 severity = 3 -/datum/symptom/deafness/Activate(datum/disease/advance/A) +/datum/symptom/deafness/Activate(datum/disease/virus/advance/A) ..() if(prob(SYMPTOM_ACTIVATION_PROB)) var/mob/living/M = A.affected_mob switch(A.stage) if(3, 4) - to_chat(M, "[pick("You hear a ringing in your ear.", "Your ears pop.")]") + to_chat(M, span_warning(pick("You hear a ringing in your ear.", "Your ears pop."))) if(5) if(!(DEAF in M.mutations)) - to_chat(M, "Your ears pop and begin ringing loudly!") + to_chat(M, span_userdanger("Your ears pop and begin ringing loudly!")) M.BecomeDeaf() spawn(200) if(M) - to_chat(M, "The ringing in your ears fades...") + to_chat(M, span_warning("The ringing in your ears fades...")) M.CureDeaf() return diff --git a/code/datums/diseases/advance/symptoms/dizzy.dm b/code/datums/diseases/viruses/advance/symptoms/dizzy.dm similarity index 64% rename from code/datums/diseases/advance/symptoms/dizzy.dm rename to code/datums/diseases/viruses/advance/symptoms/dizzy.dm index 730e2a8591a..70bcf6d340a 100644 --- a/code/datums/diseases/advance/symptoms/dizzy.dm +++ b/code/datums/diseases/viruses/advance/symptoms/dizzy.dm @@ -26,14 +26,14 @@ Bonus level = 4 severity = 2 -/datum/symptom/dizzy/Activate(datum/disease/advance/A) +/datum/symptom/dizzy/Activate(datum/disease/virus/advance/A) ..() - if(prob(SYMPTOM_ACTIVATION_PROB)) + if(prob(SYMPTOM_ACTIVATION_PROB*5)) var/mob/living/M = A.affected_mob switch(A.stage) if(1, 2, 3, 4) - to_chat(M, "[pick("You feel dizzy.", "Your head spins.")]") + to_chat(M, span_warning(pick("You feel dizzy.", "Your head spins."))) else - to_chat(M, "A wave of dizziness washes over you!") - M.Dizzy(10 SECONDS) + to_chat(M, span_userdanger("A wave of dizziness washes over you!")) + M.Dizzy(15 SECONDS) return diff --git a/code/datums/diseases/advance/symptoms/epinephrine.dm b/code/datums/diseases/viruses/advance/symptoms/epinephrine.dm similarity index 83% rename from code/datums/diseases/advance/symptoms/epinephrine.dm rename to code/datums/diseases/viruses/advance/symptoms/epinephrine.dm index e1dd2822f76..18389cc3407 100644 --- a/code/datums/diseases/advance/symptoms/epinephrine.dm +++ b/code/datums/diseases/viruses/advance/symptoms/epinephrine.dm @@ -24,14 +24,14 @@ Bonus transmittable = -2 level = 5 -/datum/symptom/epinephrine/Activate(datum/disease/advance/A) +/datum/symptom/epinephrine/Activate(datum/disease/virus/advance/A) ..() var/mob/living/M = A.affected_mob if(prob(SYMPTOM_ACTIVATION_PROB * 5)) switch(A.stage) if(5) if(prob(10)) - to_chat(M, "[pick("Your body feels tough.", "You are feeling on edge.")]") + to_chat(M, span_notice(pick("Your body feels tough.", "You are feeling on edge."))) if(A.stage > 4 && M.health <= HEALTH_THRESHOLD_CRIT) M.reagents.add_reagent("epinephrine", 0.5) if(M.reagents.get_reagent_amount("epinephrine") > 20) diff --git a/code/datums/diseases/advance/symptoms/fever.dm b/code/datums/diseases/viruses/advance/symptoms/fever.dm similarity index 76% rename from code/datums/diseases/advance/symptoms/fever.dm rename to code/datums/diseases/viruses/advance/symptoms/fever.dm index 9d29d237693..cd097eadb6c 100644 --- a/code/datums/diseases/advance/symptoms/fever.dm +++ b/code/datums/diseases/viruses/advance/symptoms/fever.dm @@ -26,17 +26,17 @@ Bonus level = 2 severity = 2 -/datum/symptom/fever/Activate(datum/disease/advance/A) +/datum/symptom/fever/Activate(datum/disease/virus/advance/A) ..() if(prob(SYMPTOM_ACTIVATION_PROB)) var/mob/living/carbon/M = A.affected_mob - to_chat(M, "[pick("You feel hot.", "You feel like you're burning.")]") + to_chat(M, span_warning(pick("You feel hot.", "You feel like you're burning."))) if(M.bodytemperature < BODYTEMP_HEAT_DAMAGE_LIMIT) Heat(M, A) return -/datum/symptom/fever/proc/Heat(mob/living/M, datum/disease/advance/A) +/datum/symptom/fever/proc/Heat(mob/living/M, datum/disease/virus/advance/A) var/get_heat = (sqrtor0(21+A.totalTransmittable()*2))+(sqrtor0(20+A.totalStageSpeed()*3)) M.bodytemperature = min(M.bodytemperature + (get_heat * A.stage), BODYTEMP_HEAT_DAMAGE_LIMIT - 1) return 1 diff --git a/code/datums/diseases/advance/symptoms/fire.dm b/code/datums/diseases/viruses/advance/symptoms/fire.dm similarity index 75% rename from code/datums/diseases/advance/symptoms/fire.dm rename to code/datums/diseases/viruses/advance/symptoms/fire.dm index 2f79cc55a46..9b443be6ae9 100644 --- a/code/datums/diseases/advance/symptoms/fire.dm +++ b/code/datums/diseases/viruses/advance/symptoms/fire.dm @@ -26,32 +26,32 @@ Bonus level = 6 severity = 5 -/datum/symptom/fire/Activate(datum/disease/advance/A) +/datum/symptom/fire/Activate(datum/disease/virus/advance/A) ..() if(prob(SYMPTOM_ACTIVATION_PROB)) var/mob/living/M = A.affected_mob switch(A.stage) if(3) - to_chat(M, "[pick("You feel hot.", "You hear a crackling noise.", "You smell smoke.")]") + to_chat(M, span_warning(pick("You feel hot.", "You hear a crackling noise.", "You smell smoke."))) if(4) Firestacks_stage_4(M, A) M.IgniteMob() - to_chat(M, "Your skin bursts into flames!") + to_chat(M, span_userdanger("Your skin bursts into flames!")) M.emote("scream") if(5) Firestacks_stage_5(M, A) M.IgniteMob() - to_chat(M, "Your skin erupts into an inferno!") + to_chat(M, span_userdanger("Your skin erupts into an inferno!")) M.emote("scream") return -/datum/symptom/fire/proc/Firestacks_stage_4(mob/living/M, datum/disease/advance/A) +/datum/symptom/fire/proc/Firestacks_stage_4(mob/living/M, datum/disease/virus/advance/A) var/get_stacks = max((sqrtor0(20 + A.totalStageSpeed() * 2)) - (sqrtor0(16 + A.totalStealth())), 1) M.adjust_fire_stacks(get_stacks) M.adjustFireLoss(get_stacks * 0.5) return 1 -/datum/symptom/fire/proc/Firestacks_stage_5(mob/living/M, datum/disease/advance/A) +/datum/symptom/fire/proc/Firestacks_stage_5(mob/living/M, datum/disease/virus/advance/A) var/get_stacks = max((sqrtor0(20 + A.totalStageSpeed() * 3))-(sqrtor0(16 + A.totalStealth())), 1) M.adjust_fire_stacks(get_stacks) M.adjustFireLoss(get_stacks) diff --git a/code/datums/diseases/advance/symptoms/flesh_eating.dm b/code/datums/diseases/viruses/advance/symptoms/flesh_eating.dm similarity index 66% rename from code/datums/diseases/advance/symptoms/flesh_eating.dm rename to code/datums/diseases/viruses/advance/symptoms/flesh_eating.dm index 1cef07340b9..e85aa1b8bc9 100644 --- a/code/datums/diseases/advance/symptoms/flesh_eating.dm +++ b/code/datums/diseases/viruses/advance/symptoms/flesh_eating.dm @@ -26,19 +26,19 @@ Bonus level = 6 severity = 5 -/datum/symptom/flesh_eating/Activate(datum/disease/advance/A) +/datum/symptom/flesh_eating/Activate(datum/disease/virus/advance/A) ..() if(prob(SYMPTOM_ACTIVATION_PROB)) var/mob/living/M = A.affected_mob switch(A.stage) if(2,3) - to_chat(M, "[pick("You feel a sudden pain across your body.", "Drops of blood appear suddenly on your skin.")]") + to_chat(M, span_warning(pick("You feel a sudden pain across your body.", "Drops of blood appear suddenly on your skin."))) if(4,5) - to_chat(M, "[pick("You cringe as a violent pain takes over your body.", "It feels like your body is eating itself inside out.", "IT HURTS.")]") + to_chat(M, span_userdanger(pick("You cringe as a violent pain takes over your body.", "It feels like your body is eating itself inside out.", "IT HURTS."))) Flesheat(M, A) return -/datum/symptom/flesh_eating/proc/Flesheat(mob/living/M, datum/disease/advance/A) +/datum/symptom/flesh_eating/proc/Flesheat(mob/living/M, datum/disease/virus/advance/A) var/get_damage = ((sqrtor0(16-A.totalStealth()))*5) M.adjustBruteLoss(get_damage) return 1 diff --git a/code/datums/diseases/advance/symptoms/hallucigen.dm b/code/datums/diseases/viruses/advance/symptoms/hallucigen.dm similarity index 52% rename from code/datums/diseases/advance/symptoms/hallucigen.dm rename to code/datums/diseases/viruses/advance/symptoms/hallucigen.dm index 4bd438a7258..c98767a4c7e 100644 --- a/code/datums/diseases/advance/symptoms/hallucigen.dm +++ b/code/datums/diseases/viruses/advance/symptoms/hallucigen.dm @@ -26,17 +26,17 @@ Bonus level = 5 severity = 3 -/datum/symptom/hallucigen/Activate(datum/disease/advance/A) +/datum/symptom/hallucigen/Activate(datum/disease/virus/advance/A) ..() if(prob(SYMPTOM_ACTIVATION_PROB)) var/mob/living/carbon/M = A.affected_mob switch(A.stage) if(1, 2) - to_chat(M, "[pick("Something appears in your peripheral vision, then winks out.", "You hear a faint whispher with no source.", "Your head aches.")]") + to_chat(M, span_warning(pick("Something appears in your peripheral vision, then winks out.", "You hear a faint whispher with no source.", "Your head aches."))) if(3, 4) - to_chat(M, "[pick("Something is following you.", "You are being watched.", "You hear a whisper in your ear.", "Thumping footsteps slam toward you from nowhere.")]") + to_chat(M, span_warning("[pick("Something is following you.", "You are being watched.", "You hear a whisper in your ear.", "Thumping footsteps slam toward you from nowhere.")]")) else - to_chat(M, "[pick("Oh, your head...", "Your head pounds.", "They're everywhere! Run!", "Something in the shadows...")]") + to_chat(M, span_userdanger(pick("Oh, your head...", "Your head pounds.", "They're everywhere! Run!", "Something in the shadows..."))) M.AdjustHallucinate(5 SECONDS) M.last_hallucinator_log = name diff --git a/code/datums/diseases/advance/symptoms/headache.dm b/code/datums/diseases/viruses/advance/symptoms/headache.dm similarity index 75% rename from code/datums/diseases/advance/symptoms/headache.dm rename to code/datums/diseases/viruses/advance/symptoms/headache.dm index 0cf33f93797..95e641686c1 100644 --- a/code/datums/diseases/advance/symptoms/headache.dm +++ b/code/datums/diseases/viruses/advance/symptoms/headache.dm @@ -27,9 +27,9 @@ BONUS level = 1 severity = 1 -/datum/symptom/headache/Activate(datum/disease/advance/A) +/datum/symptom/headache/Activate(datum/disease/virus/advance/A) ..() if(prob(SYMPTOM_ACTIVATION_PROB)) var/mob/living/M = A.affected_mob - to_chat(M, "[pick("Your head hurts.", "Your head starts pounding.")]") + to_chat(M, span_warning(pick("Your head hurts.", "Your head starts pounding."))) return diff --git a/code/datums/diseases/advance/symptoms/heal.dm b/code/datums/diseases/viruses/advance/symptoms/heal.dm similarity index 60% rename from code/datums/diseases/advance/symptoms/heal.dm rename to code/datums/diseases/viruses/advance/symptoms/heal.dm index 62df49f4f2c..b23f5df519d 100644 --- a/code/datums/diseases/advance/symptoms/heal.dm +++ b/code/datums/diseases/viruses/advance/symptoms/heal.dm @@ -25,7 +25,7 @@ Bonus transmittable = -4 level = 6 -/datum/symptom/heal/Activate(datum/disease/advance/A) +/datum/symptom/heal/Activate(datum/disease/virus/advance/A) ..() if(prob(SYMPTOM_ACTIVATION_PROB * 10)) var/mob/living/M = A.affected_mob @@ -34,7 +34,7 @@ Bonus Heal(M, A) return -/datum/symptom/heal/proc/Heal(mob/living/M, datum/disease/advance/A) +/datum/symptom/heal/proc/Heal(mob/living/M, datum/disease/virus/advance/A) var/get_damage = (sqrtor0(20+A.totalStageSpeed())*(1+rand())) M.adjustToxLoss(-get_damage) return 1 @@ -67,9 +67,9 @@ Bonus level = 3 var/list/cured_diseases = list() -/datum/symptom/heal/metabolism/Heal(mob/living/M, datum/disease/advance/A) +/datum/symptom/heal/metabolism/Heal(mob/living/M, datum/disease/virus/advance/A) var/cured = 0 - for(var/thing in M.viruses) + for(var/thing in M.diseases) var/datum/disease/D = thing if(D.virus_heal_resistant) continue @@ -78,9 +78,9 @@ Bonus cured_diseases += D.GetDiseaseID() D.cure() if(cured) - to_chat(M, "You feel much better.") + to_chat(M, span_notice("You feel much better.")) -/datum/symptom/heal/metabolism/End(datum/disease/advance/A) +/datum/symptom/heal/metabolism/End(datum/disease/virus/advance/A) // Remove all the diseases we cured. var/mob/living/M = A.affected_mob if(istype(M)) @@ -88,7 +88,7 @@ Bonus for(var/res in M.resistances) if(res in cured_diseases) M.resistances -= res - to_chat(M, "You feel weaker.") + to_chat(M, span_warning("You feel weaker.")) /* ////////////////////////////////////// @@ -118,47 +118,10 @@ Bonus level = 3 var/longevity = 30 -/datum/symptom/heal/longevity/Heal(mob/living/M, datum/disease/advance/A) +/datum/symptom/heal/longevity/Heal(mob/living/M, datum/disease/virus/advance/A) longevity -= 1 if(!longevity) A.cure() -/datum/symptom/heal/longevity/Start(datum/disease/advance/A) +/datum/symptom/heal/longevity/Start(datum/disease/virus/advance/A) longevity = rand(initial(longevity) - 5, initial(longevity) + 5) - -/* -/* -////////////////////////////////////// - - DNA Restoration - - Not well hidden. - Lowers resistance minorly. - Does not affect stage speed. - Decreases transmittablity greatly. - Very high level. - -Bonus - Heals brain damage, treats radiation, cleans SE of non-power mutations. - -////////////////////////////////////// -*/ - -/datum/symptom/heal/dna - - name = "Deoxyribonucleic Acid Restoration" - stealth = -1 - resistance = -1 - stage_speed = 0 - transmittable = -3 - level = 5 - -/datum/symptom/heal/dna/Heal(mob/living/carbon/M, datum/disease/advance/A) - var/amt_healed = (sqrtor0(20+A.totalStageSpeed()*(3+rand())))-(sqrtor0(16+A.totalStealth()*rand())) - M.adjustBrainLoss(-amt_healed) - //Non-power mutations, excluding race, so the virus does not force monkey -> human transformations. - var/list/unclean_mutations = (not_good_mutations|bad_mutations) - mutations_list[RACEMUT] - M.dna.remove_mutation_group(unclean_mutations) - M.radiation = max(M.radiation - 3, 0) - return 1 -*/ diff --git a/code/datums/diseases/advance/symptoms/itching.dm b/code/datums/diseases/viruses/advance/symptoms/itching.dm similarity index 76% rename from code/datums/diseases/advance/symptoms/itching.dm rename to code/datums/diseases/viruses/advance/symptoms/itching.dm index 74f95fa91f0..bc6cc11ffad 100644 --- a/code/datums/diseases/advance/symptoms/itching.dm +++ b/code/datums/diseases/viruses/advance/symptoms/itching.dm @@ -27,9 +27,9 @@ BONUS level = 1 severity = 1 -/datum/symptom/itching/Activate(datum/disease/advance/A) +/datum/symptom/itching/Activate(datum/disease/virus/advance/A) ..() if(prob(SYMPTOM_ACTIVATION_PROB)) var/mob/living/M = A.affected_mob - to_chat(M, "Your [pick("back", "arm", "leg", "elbow", "head")] itches.") + to_chat(M, span_warning("Your [pick("back", "arm", "leg", "elbow", "head")] itches.")) return diff --git a/code/datums/diseases/advance/symptoms/laugh.dm b/code/datums/diseases/viruses/advance/symptoms/laugh.dm similarity index 92% rename from code/datums/diseases/advance/symptoms/laugh.dm rename to code/datums/diseases/viruses/advance/symptoms/laugh.dm index 8da9ebc416d..c3a878ba7ac 100644 --- a/code/datums/diseases/advance/symptoms/laugh.dm +++ b/code/datums/diseases/viruses/advance/symptoms/laugh.dm @@ -17,7 +17,7 @@ Uncontrolled Laughter Effect level = 2 severity = 1 -/datum/symptom/laugh/Activate(datum/disease/advance/A) +/datum/symptom/laugh/Activate(datum/disease/virus/advance/A) ..() if(prob(SYMPTOM_ACTIVATION_PROB * 2)) var/mob/living/M = A.affected_mob diff --git a/code/datums/diseases/advance/symptoms/limb_throw.dm b/code/datums/diseases/viruses/advance/symptoms/limb_throw.dm similarity index 76% rename from code/datums/diseases/advance/symptoms/limb_throw.dm rename to code/datums/diseases/viruses/advance/symptoms/limb_throw.dm index 41723cb0785..5a56fd0dde3 100644 --- a/code/datums/diseases/advance/symptoms/limb_throw.dm +++ b/code/datums/diseases/viruses/advance/symptoms/limb_throw.dm @@ -18,13 +18,13 @@ Limb Rejection severity = 4 var/spell_learned = FALSE -/datum/symptom/limb_throw/Activate(datum/disease/advance/A) +/datum/symptom/limb_throw/Activate(datum/disease/virus/advance/A) if(!spell_learned && A.stage >= 4) A.affected_mob.mind?.AddSpell(new /obj/effect/proc_holder/spell/limb_throw) spell_learned = TRUE return -/datum/symptom/limb_throw/End(datum/disease/advance/A) +/datum/symptom/limb_throw/End(datum/disease/virus/advance/A) A.affected_mob.mind?.RemoveSpell(/obj/effect/proc_holder/spell/limb_throw) spell_learned = FALSE return @@ -38,8 +38,8 @@ Limb Rejection need_active_overlay = TRUE invocation = "" - selection_activated_message = "Your prepare to throw a limb!! Left-click to cast at a target!" - selection_deactivated_message = "You decided not to throw a limb...for now." + selection_activated_message = span_notice("Your prepare to throw a limb!! Left-click to cast at a target!") + selection_deactivated_message = span_notice("You decided not to throw a limb...for now.") action_icon_state = "limb_throw" action_background_icon_state = "bg_changeling" @@ -62,16 +62,16 @@ Limb Rejection var/obj/item/organ/external/limb = H.bodyparts_by_name[H.zone_selected] if(!istype(limb)) - to_chat(H, "You don't have the selected body part!") + to_chat(H, span_alert("You don't have the selected body part!")) return FALSE if(limb.vital) - to_chat(H, "You still need [limb]!") + to_chat(H, span_alert("You still need [limb]!")) return FALSE for(var/obj/item/organ/internal/organ in limb.internal_organs) if(organ.vital) - to_chat(H, "You still need [organ]!") + to_chat(H, span_alert("You still need [organ]!")) return FALSE var/obj/item/projectile/limb/limb_projectile = new(user.loc, limb) diff --git a/code/datums/diseases/advance/symptoms/love.dm b/code/datums/diseases/viruses/advance/symptoms/love.dm similarity index 93% rename from code/datums/diseases/advance/symptoms/love.dm rename to code/datums/diseases/viruses/advance/symptoms/love.dm index 1913cf8aa42..ff03537bf6c 100644 --- a/code/datums/diseases/advance/symptoms/love.dm +++ b/code/datums/diseases/viruses/advance/symptoms/love.dm @@ -17,7 +17,7 @@ Pacifist Syndrome level = 3 severity = 0 -/datum/symptom/love/Activate(datum/disease/advance/A) +/datum/symptom/love/Activate(datum/disease/virus/advance/A) ..() var/mob/living/M = A.affected_mob if(prob(SYMPTOM_ACTIVATION_PROB * 3)) diff --git a/code/datums/diseases/advance/symptoms/moan.dm b/code/datums/diseases/viruses/advance/symptoms/moan.dm similarity index 78% rename from code/datums/diseases/advance/symptoms/moan.dm rename to code/datums/diseases/viruses/advance/symptoms/moan.dm index c84a0413cae..f4439b4826b 100644 --- a/code/datums/diseases/advance/symptoms/moan.dm +++ b/code/datums/diseases/viruses/advance/symptoms/moan.dm @@ -17,7 +17,7 @@ Groaning Syndrome level = 2 severity = 1 -/datum/symptom/moan/Activate(datum/disease/advance/A) +/datum/symptom/moan/Activate(datum/disease/virus/advance/A) ..() if(prob(SYMPTOM_ACTIVATION_PROB * 2)) var/mob/living/M = A.affected_mob @@ -25,9 +25,14 @@ Groaning Syndrome if(1, 2, 3) to_chat(M, span_notice("Your muscles spasm, making you want to moan")) else - M.emote("moan") + if(prob(50)) + M.emote("moan") + else + M.say(pick("Ммм...", "Ах...", "Ох...")) + if(prob(1)) M.emote("blush") + var/obj/item/I = M.get_active_hand() if(I && I.w_class == 1) M.drop_from_active_hand() diff --git a/code/datums/diseases/advance/symptoms/oxygen.dm b/code/datums/diseases/viruses/advance/symptoms/oxygen.dm similarity index 76% rename from code/datums/diseases/advance/symptoms/oxygen.dm rename to code/datums/diseases/viruses/advance/symptoms/oxygen.dm index 371b55c7664..a8d26de3e53 100644 --- a/code/datums/diseases/advance/symptoms/oxygen.dm +++ b/code/datums/diseases/viruses/advance/symptoms/oxygen.dm @@ -25,7 +25,7 @@ Bonus transmittable = -4 level = 6 -/datum/symptom/oxygen/Activate(datum/disease/advance/A) +/datum/symptom/oxygen/Activate(datum/disease/virus/advance/A) ..() if(prob(SYMPTOM_ACTIVATION_PROB * 5)) var/mob/living/M = A.affected_mob @@ -35,5 +35,5 @@ Bonus M.reagents.add_reagent("salbutamol", 20) else if(prob(SYMPTOM_ACTIVATION_PROB * 5)) - to_chat(M, "[pick("Your lungs feel great.", "You realize you haven't been breathing.", "You don't feel the need to breathe.")]") + to_chat(M, span_notice(pick("Your lungs feel great.", "You realize you haven't been breathing.", "You don't feel the need to breathe."))) return diff --git a/code/datums/diseases/advance/symptoms/painkiller.dm b/code/datums/diseases/viruses/advance/symptoms/painkiller.dm similarity index 67% rename from code/datums/diseases/advance/symptoms/painkiller.dm rename to code/datums/diseases/viruses/advance/symptoms/painkiller.dm index 53c5f4934ed..5c152d1b6b9 100644 --- a/code/datums/diseases/advance/symptoms/painkiller.dm +++ b/code/datums/diseases/viruses/advance/symptoms/painkiller.dm @@ -24,7 +24,7 @@ Bonus transmittable = -2 level = 6 -/datum/symptom/painkiller/Activate(datum/disease/advance/A) +/datum/symptom/painkiller/Activate(datum/disease/virus/advance/A) ..() var/mob/living/M = A.affected_mob if(prob(SYMPTOM_ACTIVATION_PROB * 5)) @@ -34,10 +34,10 @@ Bonus if(2, 3) M.Slowed(40 SECONDS) M.Confused(80 SECONDS) - to_chat(M, "[pick("Something feels very wrong about your body.", "You have hard time controlling own body", "You can't feel your body.")]") + to_chat(M, span_danger(pick("Something feels very wrong about your body.", "You have hard time controlling own body", "You can't feel your body."))) if(4, 5) if(prob(10)) - to_chat(M, "[pick("Your body feels numb.", "You realize you feel nothing.", "You can't feel your body.")]") + to_chat(M, span_notice(pick("Your body feels numb.", "You realize you feel nothing.", "You can't feel your body."))) if(M.reagents.get_reagent_amount("hydrocodone") < 2 && M.getToxLoss() < 13 && A.stage > 4) M.reagents.add_reagent("hydrocodone", 0.5) return diff --git a/code/datums/diseases/advance/symptoms/sensory.dm b/code/datums/diseases/viruses/advance/symptoms/sensory.dm similarity index 81% rename from code/datums/diseases/advance/symptoms/sensory.dm rename to code/datums/diseases/viruses/advance/symptoms/sensory.dm index 34ea5dd59d1..699f91a85f8 100644 --- a/code/datums/diseases/advance/symptoms/sensory.dm +++ b/code/datums/diseases/viruses/advance/symptoms/sensory.dm @@ -25,7 +25,7 @@ Bonus level = 5 severity = 0 -/datum/symptom/mind_restoration/Activate(datum/disease/advance/A) +/datum/symptom/mind_restoration/Activate(datum/disease/virus/advance/A) ..() if(prob(SYMPTOM_ACTIVATION_PROB * 3)) var/mob/living/M = A.affected_mob @@ -54,7 +54,7 @@ Bonus transmittable = -4 level = 4 -/datum/symptom/sensory_restoration/Activate(datum/disease/advance/A) +/datum/symptom/sensory_restoration/Activate(datum/disease/virus/advance/A) ..() if(prob(SYMPTOM_ACTIVATION_PROB * 5)) var/mob/living/M = A.affected_mob @@ -64,4 +64,4 @@ Bonus M.reagents.add_reagent("oculine", 20) else if(prob(SYMPTOM_ACTIVATION_PROB * 5)) - to_chat(M, "[pick("Your eyes feel great.","You feel like your eyes can focus more clearly.", "You don't feel the need to blink.","Your ears feel great.","Your hearing feels more acute.")]") + to_chat(M, span_notice(pick("Your eyes feel great.","You feel like your eyes can focus more clearly.", "You don't feel the need to blink.","Your ears feel great.","Your hearing feels more acute."))) diff --git a/code/datums/diseases/advance/symptoms/shedding.dm b/code/datums/diseases/viruses/advance/symptoms/shedding.dm similarity index 75% rename from code/datums/diseases/advance/symptoms/shedding.dm rename to code/datums/diseases/viruses/advance/symptoms/shedding.dm index 6586b267355..eadaab577b8 100644 --- a/code/datums/diseases/advance/symptoms/shedding.dm +++ b/code/datums/diseases/viruses/advance/symptoms/shedding.dm @@ -25,24 +25,24 @@ BONUS level = 4 severity = 1 -/datum/symptom/shedding/Activate(datum/disease/advance/A) +/datum/symptom/shedding/Activate(datum/disease/virus/advance/A) ..() if(prob(SYMPTOM_ACTIVATION_PROB)) var/mob/living/M = A.affected_mob - to_chat(M, "[pick("Your scalp itches.", "Your skin feels flakey.")]") + to_chat(M, span_warning(pick("Your scalp itches.", "Your skin feels flakey."))) if(istype(M, /mob/living/carbon/human)) var/mob/living/carbon/human/H = M var/obj/item/organ/external/head/head_organ = H.get_organ("head") switch(A.stage) if(3, 4) if(!(head_organ.h_style == "Bald") && !(head_organ.h_style == "Balding Hair")) - to_chat(H, "Your hair starts to fall out in clumps...") + to_chat(H, span_warning("Your hair starts to fall out in clumps...")) spawn(50) head_organ.h_style = "Balding Hair" H.update_hair() if(5) if(!(head_organ.f_style == "Shaved") || !(head_organ.h_style == "Bald")) - to_chat(H, "Your hair starts to fall out in clumps...") + to_chat(H, span_warning("Your hair starts to fall out in clumps...")) spawn(50) head_organ.f_style = "Shaved" head_organ.h_style = "Bald" diff --git a/code/datums/diseases/advance/symptoms/shivering.dm b/code/datums/diseases/viruses/advance/symptoms/shivering.dm similarity index 83% rename from code/datums/diseases/advance/symptoms/shivering.dm rename to code/datums/diseases/viruses/advance/symptoms/shivering.dm index 1fcc586897b..1c2d8ace7af 100644 --- a/code/datums/diseases/advance/symptoms/shivering.dm +++ b/code/datums/diseases/viruses/advance/symptoms/shivering.dm @@ -26,16 +26,16 @@ Bonus level = 2 severity = 2 -/datum/symptom/shivering/Activate(datum/disease/advance/A) +/datum/symptom/shivering/Activate(datum/disease/virus/advance/A) ..() if(prob(SYMPTOM_ACTIVATION_PROB)) var/mob/living/carbon/M = A.affected_mob - to_chat(M, "[pick("You feel cold.", "You start shivering.")]") + to_chat(M, span_warning(pick("You feel cold.", "You start shivering."))) if(M.bodytemperature > BODYTEMP_COLD_DAMAGE_LIMIT) Chill(M, A) return -/datum/symptom/shivering/proc/Chill(mob/living/M, datum/disease/advance/A) +/datum/symptom/shivering/proc/Chill(mob/living/M, datum/disease/virus/advance/A) var/get_cold = (sqrtor0(16+A.totalStealth()*2))+(sqrtor0(21+A.totalResistance()*2)) M.bodytemperature = max(M.bodytemperature - (get_cold * A.stage), BODYTEMP_COLD_DAMAGE_LIMIT + 1) return 1 diff --git a/code/datums/diseases/advance/symptoms/skin.dm b/code/datums/diseases/viruses/advance/symptoms/skin.dm similarity index 77% rename from code/datums/diseases/advance/symptoms/skin.dm rename to code/datums/diseases/viruses/advance/symptoms/skin.dm index b24ce2cc5a1..da589365b70 100644 --- a/code/datums/diseases/advance/symptoms/skin.dm +++ b/code/datums/diseases/viruses/advance/symptoms/skin.dm @@ -25,7 +25,7 @@ BONUS level = 4 severity = 1 -/datum/symptom/vitiligo/Activate(datum/disease/advance/A) +/datum/symptom/vitiligo/Activate(datum/disease/virus/advance/A) ..() if(prob(SYMPTOM_ACTIVATION_PROB)) var/mob/living/M = A.affected_mob @@ -38,7 +38,7 @@ BONUS H.s_tone = -85 H.update_body() else - H.visible_message("[H] looks a bit pale...", "Your skin suddenly appears lighter...") + H.visible_message(span_warning("[H] looks a bit pale..."), span_notice("Your skin suddenly appears lighter...")) return @@ -70,7 +70,7 @@ BONUS level = 4 severity = 1 -/datum/symptom/revitiligo/Activate(datum/disease/advance/A) +/datum/symptom/revitiligo/Activate(datum/disease/virus/advance/A) ..() if(prob(SYMPTOM_ACTIVATION_PROB)) var/mob/living/M = A.affected_mob @@ -83,6 +83,6 @@ BONUS H.s_tone = 85 H.update_body() else - H.visible_message("[H] looks a bit dark...", "Your skin suddenly appears darker...") + H.visible_message(span_warning("[H] looks a bit dark..."), span_warning("Your skin suddenly appears darker...")) return diff --git a/code/datums/diseases/advance/symptoms/sneeze.dm b/code/datums/diseases/viruses/advance/symptoms/sneeze.dm similarity index 90% rename from code/datums/diseases/advance/symptoms/sneeze.dm rename to code/datums/diseases/viruses/advance/symptoms/sneeze.dm index 71acf2faab5..a7030ed9a3c 100644 --- a/code/datums/diseases/advance/symptoms/sneeze.dm +++ b/code/datums/diseases/viruses/advance/symptoms/sneeze.dm @@ -27,7 +27,7 @@ Bonus level = 1 severity = 1 -/datum/symptom/sneeze/Activate(datum/disease/advance/A) +/datum/symptom/sneeze/Activate(datum/disease/virus/advance/A) ..() if(prob(SYMPTOM_ACTIVATION_PROB)) var/mob/living/M = A.affected_mob diff --git a/code/datums/diseases/advance/symptoms/symptoms.dm b/code/datums/diseases/viruses/advance/symptoms/symptoms.dm similarity index 82% rename from code/datums/diseases/advance/symptoms/symptoms.dm rename to code/datums/diseases/viruses/advance/symptoms/symptoms.dm index dc8023310ad..253f2b8956a 100644 --- a/code/datums/diseases/advance/symptoms/symptoms.dm +++ b/code/datums/diseases/viruses/advance/symptoms/symptoms.dm @@ -18,13 +18,13 @@ GLOBAL_LIST_INIT(list_symptoms, subtypesof(/datum/symptom)) var/id = "" // Called when processing of the advance disease, which holds this symptom, starts. -/datum/symptom/proc/Start(datum/disease/advance/A) +/datum/symptom/proc/Start(datum/disease/virus/advance/A) return // Called when the advance disease is going to be deleted or when the advance disease stops processing. -/datum/symptom/proc/End(datum/disease/advance/A) +/datum/symptom/proc/End(datum/disease/virus/advance/A) return -/datum/symptom/proc/Activate(datum/disease/advance/A) +/datum/symptom/proc/Activate(datum/disease/virus/advance/A) return diff --git a/code/datums/diseases/advance/symptoms/toxification.dm b/code/datums/diseases/viruses/advance/symptoms/toxification.dm similarity index 86% rename from code/datums/diseases/advance/symptoms/toxification.dm rename to code/datums/diseases/viruses/advance/symptoms/toxification.dm index de92181056c..0c1d0116189 100644 --- a/code/datums/diseases/advance/symptoms/toxification.dm +++ b/code/datums/diseases/viruses/advance/symptoms/toxification.dm @@ -18,13 +18,13 @@ Toxification syndrome severity = 5 var/germs_multiplier = 1 -/datum/symptom/infection/Start(datum/disease/advance/A) +/datum/symptom/infection/Start(datum/disease/virus/advance/A) var/mob/living/carbon/human/H = A.affected_mob if(istype(H)) germs_multiplier = 6 + sqrtor0(25 + A.totalTransmittable()) //~~10 on average H.dna.species.germs_growth_rate *= germs_multiplier -/datum/symptom/infection/Activate(datum/disease/advance/A) +/datum/symptom/infection/Activate(datum/disease/virus/advance/A) ..() var/mob/living/carbon/human/M = A.affected_mob @@ -44,7 +44,7 @@ Toxification syndrome O.germ_level = INFECTION_LEVEL_ONE return -/datum/symptom/infection/End(datum/disease/advance/A) +/datum/symptom/infection/End(datum/disease/virus/advance/A) var/mob/living/carbon/human/H = A.affected_mob if(germs_multiplier) H.dna.species.germs_growth_rate /= germs_multiplier diff --git a/code/datums/diseases/advance/symptoms/uncotrollable.dm b/code/datums/diseases/viruses/advance/symptoms/uncotrollable.dm similarity index 97% rename from code/datums/diseases/advance/symptoms/uncotrollable.dm rename to code/datums/diseases/viruses/advance/symptoms/uncotrollable.dm index 8dc9e283d4e..68bb45c6501 100644 --- a/code/datums/diseases/advance/symptoms/uncotrollable.dm +++ b/code/datums/diseases/viruses/advance/symptoms/uncotrollable.dm @@ -17,7 +17,7 @@ Uncontrollable Aggression level = 6 severity = 4 -/datum/symptom/aggression/Activate(datum/disease/advance/A) +/datum/symptom/aggression/Activate(datum/disease/virus/advance/A) ..() var/mob/living/carbon/human/aggressor = A.affected_mob if(!istype(aggressor)) @@ -116,7 +116,7 @@ Uncontrollable Actions level = 6 severity = 4 -/datum/symptom/obsession/Activate(datum/disease/advance/A) +/datum/symptom/obsession/Activate(datum/disease/virus/advance/A) ..() var/mob/living/carbon/human/possesed = A.affected_mob if(!istype(possesed)) diff --git a/code/datums/diseases/advance/symptoms/viral.dm b/code/datums/diseases/viruses/advance/symptoms/viral.dm similarity index 68% rename from code/datums/diseases/advance/symptoms/viral.dm rename to code/datums/diseases/viruses/advance/symptoms/viral.dm index 082b726ea4f..d2e59e2c953 100644 --- a/code/datums/diseases/advance/symptoms/viral.dm +++ b/code/datums/diseases/viruses/advance/symptoms/viral.dm @@ -22,15 +22,15 @@ BONUS transmittable = 0 level = 3 -/datum/symptom/viraladaptation/Activate(datum/disease/advance/A) +/datum/symptom/viraladaptation/Activate(datum/disease/virus/advance/A) ..() if(prob(SYMPTOM_ACTIVATION_PROB)) var/mob/living/M = A.affected_mob switch(A.stage) if(1) - to_chat(M, "You feel off, but no different from before.") + to_chat(M, span_notice("You feel off, but no different from before.")) if(5) - to_chat(M, "You feel better, but nothing interesting happens.") + to_chat(M, span_notice("You feel better, but nothing interesting happens.")) /* ////////////////////////////////////// @@ -56,12 +56,12 @@ BONUS transmittable = 3 level = 3 -/datum/symptom/viraladaptation/Activate(datum/disease/advance/A) +/datum/symptom/viraladaptation/Activate(datum/disease/virus/advance/A) ..() if(prob(SYMPTOM_ACTIVATION_PROB)) var/mob/living/M = A.affected_mob switch(A.stage) if(1) - to_chat(M, "You feel better, but no different from before.") + to_chat(M, span_notice("You feel better, but no different from before.")) if(5) - to_chat(M, "You feel off, but nothing interesting happens.") + to_chat(M, span_notice("You feel off, but nothing interesting happens.")) diff --git a/code/datums/diseases/advance/symptoms/vision.dm b/code/datums/diseases/viruses/advance/symptoms/vision.dm similarity index 75% rename from code/datums/diseases/advance/symptoms/vision.dm rename to code/datums/diseases/viruses/advance/symptoms/vision.dm index 6e58faf5837..9f7f329d39d 100644 --- a/code/datums/diseases/advance/symptoms/vision.dm +++ b/code/datums/diseases/viruses/advance/symptoms/vision.dm @@ -26,7 +26,7 @@ Bonus level = 5 severity = 4 -/datum/symptom/visionloss/Activate(datum/disease/advance/A) +/datum/symptom/visionloss/Activate(datum/disease/virus/advance/A) ..() if(prob(SYMPTOM_ACTIVATION_PROB)) var/mob/living/carbon/M = A.affected_mob @@ -35,13 +35,13 @@ Bonus return switch(A.stage) if(1, 2) - to_chat(M, "Your eyes itch.") + to_chat(M, span_warning("Your eyes itch.")) if(3, 4) - to_chat(M, "Your eyes burn!") + to_chat(M, span_warning("Your eyes burn!")) M.EyeBlurry(40 SECONDS) eyes.receive_damage(1) else - to_chat(M, "Your eyes burn horrificly!") + to_chat(M, span_userdanger("Your eyes burn horrificly!")) M.EyeBlurry(60 SECONDS) eyes.receive_damage(5) if(eyes.damage >= 10) @@ -50,4 +50,4 @@ Bonus if(!(BLINDNESS in M.mutations)) M.mutations |= BLINDNESS M.update_blind_effects() - to_chat(M, "You go blind!") + to_chat(M, span_userdanger("You go blind!")) diff --git a/code/datums/diseases/advance/symptoms/voice_change.dm b/code/datums/diseases/viruses/advance/symptoms/voice_change.dm similarity index 80% rename from code/datums/diseases/advance/symptoms/voice_change.dm rename to code/datums/diseases/viruses/advance/symptoms/voice_change.dm index 202c00ef23f..54e0686956d 100644 --- a/code/datums/diseases/advance/symptoms/voice_change.dm +++ b/code/datums/diseases/viruses/advance/symptoms/voice_change.dm @@ -26,14 +26,14 @@ Bonus level = 6 severity = 2 -/datum/symptom/voice_change/Activate(datum/disease/advance/A) +/datum/symptom/voice_change/Activate(datum/disease/virus/advance/A) ..() if(prob(SYMPTOM_ACTIVATION_PROB)) var/mob/living/carbon/M = A.affected_mob switch(A.stage) if(1, 2, 3, 4) - to_chat(M, "[pick("Your throat hurts.", "You clear your throat.")]") + to_chat(M, span_warning(pick("Your throat hurts.", "You clear your throat."))) else if(ishuman(M)) var/mob/living/carbon/human/H = M @@ -42,7 +42,7 @@ Bonus return -/datum/symptom/voice_change/End(datum/disease/advance/A) +/datum/symptom/voice_change/End(datum/disease/virus/advance/A) ..() if(ishuman(A.affected_mob)) var/mob/living/carbon/human/H = A.affected_mob diff --git a/code/datums/diseases/advance/symptoms/vomit.dm b/code/datums/diseases/viruses/advance/symptoms/vomit.dm similarity index 91% rename from code/datums/diseases/advance/symptoms/vomit.dm rename to code/datums/diseases/viruses/advance/symptoms/vomit.dm index 571bcb66e53..1387543d0fd 100644 --- a/code/datums/diseases/advance/symptoms/vomit.dm +++ b/code/datums/diseases/viruses/advance/symptoms/vomit.dm @@ -30,13 +30,13 @@ Bonus level = 3 severity = 4 -/datum/symptom/vomit/Activate(datum/disease/advance/A) +/datum/symptom/vomit/Activate(datum/disease/virus/advance/A) ..() if(prob(SYMPTOM_ACTIVATION_PROB / 2)) var/mob/living/M = A.affected_mob switch(A.stage) if(1, 2, 3, 4) - to_chat(M, "[pick("You feel nauseous.", "You feel like you're going to throw up!")]") + to_chat(M, span_warning(pick("You feel nauseous.", "You feel like you're going to throw up!"))) else Vomit(M) diff --git a/code/datums/diseases/advance/symptoms/weakness.dm b/code/datums/diseases/viruses/advance/symptoms/weakness.dm similarity index 54% rename from code/datums/diseases/advance/symptoms/weakness.dm rename to code/datums/diseases/viruses/advance/symptoms/weakness.dm index 614aa38e0f9..9837694cdae 100644 --- a/code/datums/diseases/advance/symptoms/weakness.dm +++ b/code/datums/diseases/viruses/advance/symptoms/weakness.dm @@ -26,20 +26,20 @@ Bonus level = 3 severity = 3 -/datum/symptom/weakness/Activate(datum/disease/advance/A) +/datum/symptom/weakness/Activate(datum/disease/virus/advance/A) ..() - if(prob(SYMPTOM_ACTIVATION_PROB)) + if(prob(SYMPTOM_ACTIVATION_PROB*2)) var/mob/living/M = A.affected_mob switch(A.stage) if(1, 2) - to_chat(M, "[pick("You feel weak.", "You feel lazy.")]") + to_chat(M, span_warning(pick("You feel weak.", "You feel lazy."))) if(3, 4) - to_chat(M, "[pick("You feel very frail.", "You think you might faint.")]") + to_chat(M, span_warning("[pick("You feel very frail.", "You think you might faint.")]")) M.adjustStaminaLoss(15) else - to_chat(M, "[pick("You feel tremendously weak!", "Your body trembles as exhaustion creeps over you.")]") + to_chat(M, span_userdanger(pick("You feel tremendously weak!", "Your body trembles as exhaustion creeps over you."))) M.adjustStaminaLoss(30) if(M.getStaminaLoss() > 60 && !M.stat) - M.visible_message("[M] faints!", "You swoon and faint...") + M.visible_message(span_warning("[M] faints!"), span_userdanger("You swoon and faint...")) M.AdjustSleeping(10 SECONDS) return diff --git a/code/datums/diseases/advance/symptoms/weight.dm b/code/datums/diseases/viruses/advance/symptoms/weight.dm similarity index 67% rename from code/datums/diseases/advance/symptoms/weight.dm rename to code/datums/diseases/viruses/advance/symptoms/weight.dm index 46a6c8f2162..2532c47deb9 100644 --- a/code/datums/diseases/advance/symptoms/weight.dm +++ b/code/datums/diseases/viruses/advance/symptoms/weight.dm @@ -27,14 +27,14 @@ Bonus level = 3 severity = 1 -/datum/symptom/weight_loss/Activate(datum/disease/advance/A) +/datum/symptom/weight_loss/Activate(datum/disease/virus/advance/A) ..() if(prob(SYMPTOM_ACTIVATION_PROB)) var/mob/living/M = A.affected_mob switch(A.stage) if(1, 2, 3, 4) - to_chat(M, "[pick("You feel hungry.", "You crave for food.")]") + to_chat(M, span_warning(pick("You feel hungry.", "You crave for food."))) else - to_chat(M, "[pick("So hungry...", "You'd kill someone for a bite of food...", "Hunger cramps seize you...")]") + to_chat(M, span_warning("[pick("So hungry...", "You'd kill someone for a bite of food...", "Hunger cramps seize you...")]")) M.overeatduration = max(M.overeatduration - 100, 0) M.adjust_nutrition(-100) diff --git a/code/datums/diseases/advance/symptoms/youth.dm b/code/datums/diseases/viruses/advance/symptoms/youth.dm similarity index 65% rename from code/datums/diseases/advance/symptoms/youth.dm rename to code/datums/diseases/viruses/advance/symptoms/youth.dm index 81f88aa29cb..73b64657765 100644 --- a/code/datums/diseases/advance/symptoms/youth.dm +++ b/code/datums/diseases/viruses/advance/symptoms/youth.dm @@ -25,7 +25,7 @@ BONUS transmittable = -4 level = 5 -/datum/symptom/youth/Activate(datum/disease/advance/A) +/datum/symptom/youth/Activate(datum/disease/virus/advance/A) ..() if(prob(SYMPTOM_ACTIVATION_PROB * 2)) var/mob/living/M = A.affected_mob @@ -35,22 +35,22 @@ BONUS if(1) if(H.age > 41) H.age = 41 - to_chat(H, "You haven't had this much energy in years!") + to_chat(H, span_notice("You haven't had this much energy in years!")) if(2) if(H.age > 36) H.age = 36 - to_chat(H, "You're suddenly in a good mood.") + to_chat(H, span_notice("You're suddenly in a good mood.")) if(3) if(H.age > 31) H.age = 31 - to_chat(H, "You begin to feel more lithe.") + to_chat(H, span_notice("You begin to feel more lithe.")) if(4) if(H.age > 26) H.age = 26 - to_chat(H, "You feel reinvigorated.") + to_chat(H, span_notice("You feel reinvigorated.")) if(5) if(H.age > 21) H.age = 21 - to_chat(H, "You feel like you can take on the world!") + to_chat(H, span_notice("You feel like you can take on the world!")) return diff --git a/code/datums/diseases/viruses/anxiety.dm b/code/datums/diseases/viruses/anxiety.dm new file mode 100644 index 00000000000..a910f0cfc60 --- /dev/null +++ b/code/datums/diseases/viruses/anxiety.dm @@ -0,0 +1,45 @@ +/datum/disease/virus/anxiety + name = "Severe Anxiety" + form = "Infection" + agent = "Excess Lepidopticides" + desc = "If left untreated subject will regurgitate butterflies." + max_stages = 4 + spread_flags = CONTACT + cures = list("ethanol") + severity = MEDIUM + possible_mutations = list(/datum/disease/virus/beesease) + +/datum/disease/virus/anxiety/stage_act() + if(!..()) + return FALSE + switch(stage) + if(2) + if(prob(5)) + to_chat(affected_mob, span_notice("You feel anxious.")) + if(prob(5)) + affected_mob.AdjustJitter(5 SECONDS) + if(3) + if(prob(10)) + to_chat(affected_mob, span_notice("Your stomach flutters.")) + if(prob(5)) + to_chat(affected_mob, span_notice("You feel panicky.")) + if(prob(5)) + to_chat(affected_mob, span_danger("You're overtaken with panic!")) + affected_mob.AdjustJitter(10 SECONDS, bound_upper = 20 SECONDS) + affected_mob.AdjustStuttering(10 SECONDS, bound_upper = 20 SECONDS) + if(4) + if(prob(10)) + to_chat(affected_mob, span_danger("You feel butterflies in your stomach.")) + if(prob(5)) + affected_mob.visible_message(span_danger("[affected_mob] stumbles around in a panic."), \ + span_userdanger("You have a panic attack!")) + affected_mob.AdjustConfused(rand(6 SECONDS, 12 SECONDS), bound_upper = 20 SECONDS) + affected_mob.AdjustJitter(rand(20 SECONDS, 40 SECONDS), bound_upper = 50 SECONDS) + affected_mob.AdjustStuttering(rand(20 SECONDS, 40 SECONDS), bound_upper = 50 SECONDS) + if(prob(3)) + affected_mob.visible_message(span_danger("[affected_mob] coughs up butterflies!"), \ + span_userdanger("You cough up butterflies!")) + affected_mob.Stun(rand(5 SECONDS, 10 SECONDS)) + new /mob/living/simple_animal/butterfly(affected_mob.loc) + new /mob/living/simple_animal/butterfly(affected_mob.loc) + return diff --git a/code/datums/diseases/viruses/beesease.dm b/code/datums/diseases/viruses/beesease.dm new file mode 100644 index 00000000000..a71351ea199 --- /dev/null +++ b/code/datums/diseases/viruses/beesease.dm @@ -0,0 +1,59 @@ +/datum/disease/virus/beesease + name = "Beesease" + form = "Infection" + agent = "Apidae Infection" + desc = "If left untreated subject will turn into a beehive." + max_stages = 4 + stage_prob = 2 + can_progress_in_dead = TRUE + discovery_threshold = 0.9 + spread_flags = CONTACT + cures = list("sugar") + severity = DANGEROUS + possible_mutations = list(/datum/disease/virus/lycan) + var/bees_spawned = 0 + +/datum/disease/virus/beesease/stage_act() + if(!..()) + return FALSE + if(affected_mob.stat != DEAD) + switch(stage) + if(2) + if(prob(10)) + to_chat(affected_mob, span_notice("You taste honey in your mouth.")) + if(prob(1)) + bee_stinging() + if(3) + if(prob(10)) + to_chat(affected_mob, span_danger("Your stomach rumbles.")) + affected_mob.adjustBruteLoss(2) + if(prob(7)) + bee_stinging() + if(4) + if(prob(10)) + affected_mob.visible_message(span_danger("[affected_mob] buzzes."), \ + span_userdanger("Your stomach buzzes violently!")) + if(prob(5)) + to_chat(affected_mob, span_danger("You feel something moving in your throat.")) + if(prob(12)) + bee_stinging() + + if(prob(5 * stage)) + playsound(get_turf(affected_mob.loc), pick('sound/creatures/bee3.ogg', 'sound/creatures/bee4.ogg'), (stage*stage)*6.25, 1) + + if(stage == max_stages && prob(3) && bees_spawned < 10) + affected_mob.visible_message(span_danger("Swarm of bees flies out of a [affected_mob]'s mouth!"), + span_userdanger("Swarm of bees flies out of your mouth!")) + affected_mob.adjustBruteLoss(3) + for(var/i = 0, i < 3, i++) + var/mob/living/simple_animal/hostile/poison/bees/new_bee = new(affected_mob.loc) + new_bee.beegent = new /datum/reagent/bee_venom_beesease + + bees_spawned++ + +/datum/disease/virus/beesease/proc/bee_stinging() + to_chat(affected_mob, span_danger("Your stomach stings painfully.")) + affected_mob.Slowed(3 SECONDS, 10) + var/datum/reagent/bee_venom_beesease/R = new + R.volume = 5 + affected_mob.reagents.add_reagent(R.id, R.volume) diff --git a/code/datums/diseases/viruses/brainrot.dm b/code/datums/diseases/viruses/brainrot.dm new file mode 100644 index 00000000000..efd3f76e1d9 --- /dev/null +++ b/code/datums/diseases/viruses/brainrot.dm @@ -0,0 +1,52 @@ +/datum/disease/virus/brainrot + name = "Brainrot" + agent = "Cryptococcus Cosmosis" + desc = "This disease destroys the braincells, causing brain fever, brain necrosis and general intoxication." + max_stages = 4 + spread_flags = CONTACT + cures = list("mannitol") + cure_prob = 15 + required_organs = list(/obj/item/organ/internal/brain) + severity = DANGEROUS + mutation_reagents = list("mutagen", "neurotoxin2") + possible_mutations = list(/datum/disease/kuru, /datum/disease/virus/advance/preset/mind_restoration, /datum/disease/virus/transformation/jungle_fever) + +/datum/disease/virus/brainrot/stage_act() + if(!..()) + return FALSE + + switch(stage) + if(2) + if(prob(3)) + affected_mob.emote("blink") + if(prob(4)) + affected_mob.emote("yawn") + if(prob(7)) + to_chat(affected_mob, span_danger("You don't feel like yourself.")) + if(prob(15) && affected_mob.getBrainLoss()<=98) + affected_mob.adjustBrainLoss(1) + if(3) + if(prob(5)) + affected_mob.emote("stare") + if(prob(5)) + affected_mob.emote("drool") + if(prob(7)) + to_chat(affected_mob, span_danger("You don't feel like yourself.")) + if(prob(25) && affected_mob.getBrainLoss()<=97) + affected_mob.adjustBrainLoss(2) + to_chat(affected_mob, span_danger("Your try to remember something important...but can't.")) + + if(4) + if(prob(7)) + affected_mob.emote("stare") + if(prob(7)) + affected_mob.emote("drool") + if(prob(30) && affected_mob.getBrainLoss()<=97) + affected_mob.adjustBrainLoss(2) + if(prob(30)) + to_chat(affected_mob, span_danger("Strange buzzing fills your head, removing all thoughts.")) + if(prob(4)) + affected_mob.visible_message(span_warning("[affected_mob] suddenly collapses"), span_danger("You lose consciousness...")) + affected_mob.Paralyse(rand(10 SECONDS, 20 SECONDS)) + if(prob(10)) + affected_mob.AdjustStuttering(30 SECONDS, bound_upper = 30 SECONDS) diff --git a/code/datums/diseases/viruses/cold.dm b/code/datums/diseases/viruses/cold.dm new file mode 100644 index 00000000000..4501158108e --- /dev/null +++ b/code/datums/diseases/viruses/cold.dm @@ -0,0 +1,49 @@ +/datum/disease/virus/cold + name = "The Cold" + agent = "XY-rhinovirus" + desc = "If left untreated the subject will contract the flu." + max_stages = 3 + spread_flags = AIRBORNE + visibility_flags = HIDDEN_HUD + cure_text = "Rest & Spaceacillin" + cures = list("spaceacillin") + cure_prob = 30 + permeability_mod = 0.5 + severity = MINOR + +/datum/disease/virus/cold/stage_act() + if(!..()) + return FALSE + + switch(stage) + if(2, 3) + if(prob(stage)) + affected_mob.emote("sneeze") + if(prob(stage)) + affected_mob.emote("cough") + if(prob(stage)) + to_chat(affected_mob, span_danger("Your throat feels sore.")) + if(prob(stage)) + to_chat(affected_mob, span_danger("Mucous runs down the back of your throat.")) + if(3) + if(prob(1) && prob(50)) + if(!affected_mob.resistances.Find(/datum/disease/virus/flu)) + var/datum/disease/virus/flu/Flu = new + Flu.Contract(affected_mob) + cure() + +/datum/disease/virus/cold/has_cure() + //if has spaceacillin + if(..()) + if(affected_mob.IsSleeping()) + return TRUE + if(affected_mob.lying) + return prob(33) + return prob(1) + //if not + else + if(affected_mob.IsSleeping()) + return prob(20) + if(affected_mob.lying) + return prob(7) + return FALSE diff --git a/code/datums/diseases/viruses/flu.dm b/code/datums/diseases/viruses/flu.dm new file mode 100644 index 00000000000..3f1dc2f86e0 --- /dev/null +++ b/code/datums/diseases/viruses/flu.dm @@ -0,0 +1,47 @@ +/datum/disease/virus/flu + name = "The Flu" + agent = "H13N1 flu virion" + desc = "If left untreated the subject will feel quite unwell." + max_stages = 3 + spread_flags = AIRBORNE + visibility_flags = HIDDEN_HUD + cure_text = "Rest & Spaceacillin" + cures = list("spaceacillin") + cure_prob = 30 + permeability_mod = 0.75 + severity = MEDIUM + +/datum/disease/virus/flu/stage_act() + if(!..()) + return FALSE + + switch(stage) + if(2, 3) + if(prob(stage)) + affected_mob.emote("sneeze") + if(prob(stage)) + affected_mob.emote("cough") + if(prob(stage)) + to_chat(affected_mob, span_danger("Your muscles ache")) + affected_mob.take_organ_damage(1) + if(prob(stage)) + to_chat(affected_mob, span_danger("Your stomach hurts.")) + affected_mob.adjustToxLoss(1) + return + +/datum/disease/virus/flu/has_cure() + //if has spaceacillin + if(..()) + if(affected_mob.IsSleeping()) + return TRUE + if(affected_mob.lying) + return prob(33) + return prob(1) + //if not + else + if(affected_mob.IsSleeping()) + return prob(20) + if(affected_mob.lying) + return prob(7) + return FALSE + diff --git a/code/datums/diseases/fluspanish.dm b/code/datums/diseases/viruses/fluspanish.dm similarity index 55% rename from code/datums/diseases/fluspanish.dm rename to code/datums/diseases/viruses/fluspanish.dm index b348934c7aa..a9ece081675 100644 --- a/code/datums/diseases/fluspanish.dm +++ b/code/datums/diseases/viruses/fluspanish.dm @@ -1,18 +1,19 @@ -/datum/disease/fluspanish - name = "Spanish inquisition Flu" +/datum/disease/virus/fluspanish + name = "Spanish Inquisition Flu" + agent = "1nqu1s1t10n flu virion" + desc = "If left untreated the subject will burn to death for being a heretic." max_stages = 3 - spread_text = "Airborne" + spread_flags = AIRBORNE cure_text = "Spaceacillin & Anti-bodies to the common flu" cures = list("spaceacillin") - cure_chance = 10 - agent = "1nqu1s1t10n flu virion" - viable_mobtypes = list(/mob/living/carbon/human) + cure_prob = 10 permeability_mod = 0.75 - desc = "If left untreated the subject will burn to death for being a heretic." severity = DANGEROUS -/datum/disease/fluspanish/stage_act() - ..() +/datum/disease/virus/fluspanish/stage_act() + if(!..()) + return FALSE + switch(stage) if(2) affected_mob.bodytemperature += 10 @@ -21,7 +22,7 @@ if(prob(5)) affected_mob.emote("cough") if(prob(1)) - to_chat(affected_mob, "You're burning in your own skin!") + to_chat(affected_mob, span_danger("You're burning in your own skin!")) affected_mob.take_organ_damage(0,5) if(3) @@ -31,6 +32,17 @@ if(prob(5)) affected_mob.emote("cough") if(prob(5)) - to_chat(affected_mob, "You're burning in your own skin!") + to_chat(affected_mob, span_danger("You're burning in your own skin!")) affected_mob.take_organ_damage(0,5) return + +/datum/disease/virus/fluspanish/has_cure() + //if has spaceacillin + if(..()) + if(affected_mob.resistances.Find(/datum/disease/virus/flu)) + return TRUE + else + return prob(1) + //if not + else + return FALSE diff --git a/code/datums/diseases/viruses/gbs.dm b/code/datums/diseases/viruses/gbs.dm new file mode 100644 index 00000000000..6cd70b97350 --- /dev/null +++ b/code/datums/diseases/viruses/gbs.dm @@ -0,0 +1,69 @@ +/datum/disease/virus/gbs + name = "GBS" + agent = "Gravitokinetic Bipotential SADS+" + spread_flags = CONTACT + cures = list("diphenhydramine","sulfur") + cure_prob = 15 + severity = BIOHAZARD + +/datum/disease/virus/gbs/stage_act() + if(!..()) + return FALSE + + switch(stage) + if(2) + if(prob(45)) + affected_mob.adjustToxLoss(5) + if(prob(1)) + affected_mob.emote("sneeze") + if(3) + if(prob(5)) + affected_mob.emote("cough") + else if(prob(5)) + affected_mob.emote("gasp") + if(prob(10)) + to_chat(affected_mob, span_danger("You're starting to feel very weak...")) + if(4) + if(prob(10)) + affected_mob.emote("cough") + affected_mob.adjustToxLoss(5) + if(5) + to_chat(affected_mob, span_userdanger("Your body feels as if it's trying to rip itself open...")) + if(prob(50)) + affected_mob.delayed_gib() + +/datum/disease/virus/gbs/non_con + name = "Non-Contagious GBS" + agent = "gibbis" + spread_flags = NON_CONTAGIOUS + cures = list("cryoxadone") + cure_prob = 10 + can_immunity = FALSE + +/datum/disease/virus/fake_gbs + name = "GBS" + desc = "If left untreated death will occur." + agent = "Gravitokinetic Bipotential SADS-" + spread_flags = CONTACT + cures = list("diphenhydramine","sulfur") + cure_prob = 15 + severity = BIOHAZARD + +/datum/disease/virus/fake_gbs/stage_act() + if(!..()) + return FALSE + + switch(stage) + if(2) + if(prob(1)) + affected_mob.emote("sneeze") + if(3) + if(prob(5)) + affected_mob.emote("cough") + else if(prob(5)) + affected_mob.emote("gasp") + if(prob(10)) + to_chat(affected_mob, span_danger("You're starting to feel very weak...")) + if(4, 5) + if(prob(10)) + affected_mob.emote("cough") diff --git a/code/datums/diseases/viruses/kingstons.dm b/code/datums/diseases/viruses/kingstons.dm new file mode 100644 index 00000000000..c3f1dd722f3 --- /dev/null +++ b/code/datums/diseases/viruses/kingstons.dm @@ -0,0 +1,144 @@ +/datum/disease/virus/kingstons + name = "Kingstons Syndrome" + agent = "Nya Virus" + desc = "If left untreated the subject will turn into a feline. In felines it has... OTHER... effects." + max_stages = 4 + spread_flags = AIRBORNE + cures = list("milk") + cure_prob = 50 + permeability_mod = 0.75 + severity = DANGEROUS + mutation_reagents = list("mutagen", "radium") + possible_mutations = list(/datum/disease/virus/kingstons_advanced) + +/datum/disease/virus/kingstons/stage_act() + if(!..()) + return FALSE + + switch(stage) + if(1) + if(prob(10)) + if(istajaran(affected_mob)) + to_chat(affected_mob, span_notice("You feel good.")) + else + to_chat(affected_mob, span_notice("You feel like playing with string.")) + + if(2) + if(prob(10)) + if(istajaran(affected_mob)) + to_chat(affected_mob, span_danger("Something in your throat itches.")) + else + to_chat(affected_mob, span_danger("You NEED to find a mouse.")) + + if(3) + if(prob(10)) + if(istajaran(affected_mob)) + to_chat(affected_mob, span_danger("You feel something in your throat!")) + affected_mob.emote("cough") + else + if(prob(50)) + affected_mob.say(pick(list("Mew", "Meow!", "Nya!~"))) + else + affected_mob.emote("purrs") + + if(4) + if(istajaran(affected_mob)) + if(prob(5)) + affected_mob.visible_message(span_danger("[affected_mob] coughs up a hairball!"), \ + span_userdanger("You cough up a hairball!")) + affected_mob.Stun(10 SECONDS) + else + if(prob(30)) + affected_mob.emote("purrs") + if(prob(5)) + affected_mob.visible_message(span_danger("[affected_mob]'s form contorts into something more feline!"), \ + span_userdanger("YOU TURN INTO A TAJARAN!")) + var/mob/living/carbon/human/catface = affected_mob + catface?.set_species(/datum/species/tajaran, retain_damage = TRUE) + + +/datum/disease/virus/kingstons_advanced + name = "Advanced Kingstons Syndrome" + agent = "AMB45DR Bacteria" + desc = "If left untreated the subject will mutate to a different species." + max_stages = 4 + spread_flags = AIRBORNE + cures = list("plasma") + cure_prob = 50 + permeability_mod = 0.75 + severity = BIOHAZARD + var/list/virspecies = list(/datum/species/human, /datum/species/tajaran, /datum/species/unathi,/datum/species/skrell, /datum/species/vulpkanin, /datum/species/diona) + var/list/virsuffix = list("pox", "rot", "flu", "cough", "-gitis", "cold", "rash", "itch", "decay") + var/datum/species/chosentype + var/chosensuff + possible_mutations = null + +/datum/disease/virus/kingstons_advanced/New() + ..() + chosentype = pick(virspecies) + chosensuff = pick(virsuffix) + + name = "[initial(chosentype.name)] [chosensuff]" + +/datum/disease/virus/kingstons_advanced/Copy() + var/datum/disease/virus/kingstons_advanced/KA = ..() + KA.chosentype = chosentype + KA.chosensuff = chosensuff + KA.name = name + return KA + +/datum/disease/virus/kingstons_advanced/stage_act() + if(!..()) + return FALSE + + if(ishuman(affected_mob)) + var/mob/living/carbon/human/H = affected_mob + switch(stage) + if(1) + if(prob(10)) + to_chat(H, span_notice("You feel awkward.")) + if(2, 3) + if(prob(7) && !istype(H.dna.species, chosentype)) + make_sound(H) + if(2) + if(prob(10)) + to_chat(H, span_danger("You itch.")) + if(3) + if(prob(10)) + to_chat(H, span_danger("Your skin starts to flake!")) + if(4) + if(!istype(H.dna.species, chosentype)) + if(prob(30)) + make_sound(H) + if(prob(5)) + H.visible_message(span_danger("[H]'s skin splits and form contorts!"), \ + span_userdanger("Your body mutates into a [initial(chosentype.name)]!")) + H.set_species(chosentype, retain_damage = TRUE) + else + if(prob(5)) + H.visible_message(span_danger("[H] scratches at thier skin!"), \ + span_userdanger("You scratch your skin to try not to itch!")) + H.adjustBruteLoss(5) + affected_mob.Stun(rand(2 SECONDS, 4 SECONDS)) + +// Костыли, систему эмоутов переписывать лень. Она ужасна. У расовых эмоутов проверка на расу, поэтому так просто их не заюзать +/datum/disease/virus/kingstons_advanced/proc/make_sound(mob/living/carbon/human/H) + if(!istype(H)) + return + + switch(chosentype) + if(/datum/species/tajaran) + H.custom_emote(m_type = EMOTE_SOUND, message = "мурчит") + playsound(H.loc, 'sound/voice/cat_purr.ogg', 80, 1, frequency = H.get_age_pitch()) + if(/datum/species/unathi) + H.custom_emote(m_type = EMOTE_SOUND, message = "шипит") + playsound(H.loc, 'sound/effects/unathihiss.ogg', 50, 1, frequency = H.get_age_pitch()) + if(/datum/species/skrell) + H.custom_emote(m_type = EMOTE_SOUND, message = "издает трель") + playsound(H.loc, 'sound/effects/warble.ogg', 50, 1, frequency = H.get_age_pitch()) + if(/datum/species/vulpkanin) + H.custom_emote(m_type = EMOTE_SOUND, message = "воет") + playsound(H.loc, 'sound/goonstation/voice/howl.ogg', 100, 1, frequency = H.get_age_pitch()) + if(/datum/species/diona) + H.custom_emote(m_type = EMOTE_SOUND, message = "скрипит") + playsound(H.loc, 'sound/voice/dionatalk1.ogg', 50, 1, frequency = H.get_age_pitch()) diff --git a/code/datums/diseases/loyalty_syndrome.dm b/code/datums/diseases/viruses/loyalty_syndrome.dm similarity index 71% rename from code/datums/diseases/loyalty_syndrome.dm rename to code/datums/diseases/viruses/loyalty_syndrome.dm index e6f37c2ac9a..d7e0688edf9 100644 --- a/code/datums/diseases/loyalty_syndrome.dm +++ b/code/datums/diseases/viruses/loyalty_syndrome.dm @@ -1,17 +1,17 @@ #define STAGE_TIME 60 -/datum/disease/loyalty +/datum/disease/virus/loyalty name = "Loyalty Syndrome" + agent = "Halomonas minomae" + desc = "A disease that causes acute mass insanity for a certain person, as well as various obsessions" max_stages = 5 - spread_text = "On contact" - spread_flags = CONTACT_GENERAL - disease_flags = CAN_CARRY|CURABLE + spread_flags = CONTACT + permeability_mod = 0.8 + can_immunity = FALSE cure_text = "Anti-Psychotics" cures = list("haloperidol") - cure_chance = 5 - agent = "Halomonas minomae" - viable_mobtypes = list(/mob/living/carbon/human) - visibility_flags = HIDDEN_SCANNER + cure_prob = 8 + visibility_flags = HIDDEN_HUD severity = DANGEROUS var/is_master = FALSE var/mob/living/carbon/human/master @@ -23,37 +23,49 @@ var/need_meating_message = FALSE var/need_master_death_message = FALSE -/datum/disease/loyalty/New(var/mob/living/carbon/human/new_master) +/datum/disease/virus/loyalty/New(var/mob/living/carbon/human/new_master) + ..() if(new_master) master = new_master else is_master = TRUE -/datum/disease/loyalty/Contract(mob/M) +/datum/disease/virus/loyalty/Contract(mob/living/M, act_type, is_carrier = FALSE, need_protection_check = FALSE, zone) + if(!CanContract(M, act_type, need_protection_check, zone)) + return FALSE + var/mob/living/carbon/human/new_master = is_master ? affected_mob : master - var/datum/disease/loyalty/copy = new(new_master) + var/datum/disease/virus/loyalty/copy = new(new_master) + + //recontract cured master + if(new_master == M) + copy.is_master = TRUE - M.viruses += copy + M.diseases += copy copy.affected_mob = M GLOB.active_diseases += copy + copy.carrier = is_carrier copy.affected_mob.med_hud_set_status() + return copy -/datum/disease/loyalty/stage_act() - ..() +/datum/disease/virus/loyalty/stage_act() + if(!..()) + return FALSE if(affected_mob && !is_master && master && stage >= 4) var/message = "" var/health_change = 0 var/see_master = FALSE + if(QDELETED(master)) + if(need_master_death_message) + death_of_master(span_cultlarge("Внезапно всё ваше тело пронзает боль от осознания одной мысли. \n[span_reallybig("[master] больше нет с нами")]")) + return FALSE + if(master.stat == DEAD) if(need_master_death_message) - affected_mob.emote("scream") - to_chat(affected_mob, span_cultlarge("Внезапно всё ваше тело пронзает боль от осознания одной мысли. \n[span_reallybig("[master] мертв[genderize_ru(master.gender, "", "а", "о", "ы")]!")]")) - need_master_death_message = FALSE - affected_mob.adjustBrainLoss(50) - addtimer(CALLBACK(affected_mob, TYPE_PROC_REF(/mob/living/carbon/human, emote), "cry"), rand(3, 10) SECONDS) - return + death_of_master(span_cultlarge("Внезапно всё ваше тело пронзает боль от осознания одной мысли. \n[span_reallybig("[master] мертв[genderize_ru(master.gender, "", "а", "о", "ы")]!")]")) + return FALSE else need_master_death_message = TRUE @@ -121,17 +133,18 @@ span_userdanger("Странный голос [pick("ужасающе вопит", "жалобно стонет", "кричит")] [get_direction("где-то на ", "e")]!!")), rand(2, 20) SECONDS) health_change = round(timer/(4 * STAGE_TIME), 0.25) //1 - ∞ toxins - if(timer <= STAGE_TIME) - affected_mob.adjustOxyLoss(health_change) - affected_mob.adjustBruteLoss(health_change) - affected_mob.adjustFireLoss(health_change) - affected_mob.adjustToxLoss(health_change) + if(affected_mob.z == master.z) + if(timer <= STAGE_TIME) + affected_mob.adjustOxyLoss(health_change) + affected_mob.adjustBruteLoss(health_change) + affected_mob.adjustFireLoss(health_change) + affected_mob.adjustToxLoss(health_change) if(message != "") affected_mob.say(message) say_timer = 0 return -/datum/disease/loyalty/proc/get_direction(var/begin="", var/ending = "") +/datum/disease/virus/loyalty/proc/get_direction(var/begin="", var/ending = "") if(affected_mob.z == master.z) . = begin . += dir2rustext(get_dir(affected_mob.loc, master.loc)) @@ -139,9 +152,15 @@ else . = "где-то далеко отсюда" -/datum/disease/loyalty/Copy() +/datum/disease/virus/loyalty/Copy() var/mob/living/carbon/human/new_master = is_master ? affected_mob : master - var/datum/disease/loyalty/copy = new(new_master) + var/datum/disease/virus/loyalty/copy = new(new_master) return copy +/datum/disease/virus/loyalty/proc/death_of_master(message) + affected_mob.emote("scream") + to_chat(affected_mob, message) + need_master_death_message = FALSE + affected_mob.adjustBrainLoss(50) + addtimer(CALLBACK(affected_mob, TYPE_PROC_REF(/mob/living/carbon/human, emote), "cry"), rand(3, 10) SECONDS) #undef STAGE_TIME diff --git a/code/datums/diseases/viruses/lycancoughy.dm b/code/datums/diseases/viruses/lycancoughy.dm new file mode 100644 index 00000000000..81b5194ee4b --- /dev/null +++ b/code/datums/diseases/viruses/lycancoughy.dm @@ -0,0 +1,57 @@ +/datum/disease/virus/lycan + name = "Lycancoughy" + form = "Infection" + agent = "Excess Snuggles" + desc = "If left untreated subject will regurgitate... puppies." + max_stages = 4 + spread_flags = CONTACT + cures = list("ethanol") + severity = DANGEROUS + var/barklimit = 0 + +/datum/disease/virus/lycan/stage_act() + if(!..()) + return FALSE + + switch(stage) + if(2) + if(prob(5)) + to_chat(affected_mob, span_notice("You itch.")) + affected_mob.emote("cough") + if(3) + if(prob(10)) + to_chat(affected_mob, span_notice("You hear faint barking.")) + if(prob(5)) + to_chat(affected_mob, span_notice("You crave meat.")) + affected_mob.emote("cough") + if(prob(2)) + to_chat(affected_mob, span_danger("Your stomach growls!")) + if(4) + if(prob(10)) + to_chat(affected_mob, span_danger("Your stomach barks?!")) + if(prob(5)) + affected_mob.visible_message(span_danger("[affected_mob] howls!"), \ + span_userdanger("You howl!")) + affected_mob.AdjustConfused(rand(12 SECONDS, 16 SECONDS)) + if(prob(3) && barklimit <= 10) + var/list/puppytype = list( + /mob/living/simple_animal/pet/dog/corgi/puppy, + /mob/living/simple_animal/pet/dog/pug, + /mob/living/simple_animal/pet/dog/fox) + + var/mob/living/puppypicked = pick(puppytype) + affected_mob.visible_message(span_danger("[affected_mob] coughs up [initial(puppypicked.name)]!"), \ + span_userdanger("You cough up [initial(puppypicked.name)]?!")) + new puppypicked(affected_mob.loc) + new puppypicked(affected_mob.loc) + barklimit ++ + if(prob(1)) + var/list/plushtype = list(/obj/item/toy/plushie/orange_fox, /obj/item/toy/plushie/corgi, /obj/item/toy/plushie/robo_corgi, /obj/item/toy/plushie/pink_fox) + var/obj/item/toy/plushie/coughfox = pick(plushtype) + new coughfox(affected_mob.loc) + affected_mob.visible_message(span_danger("[affected_mob] coughs up a [initial(coughfox.name)]!"), \ + span_userdanger("You cough [initial(coughfox.name)] up ?!")) + if(prob(50)) + affected_mob.emote("cough") + affected_mob.adjustBruteLoss(5) + return diff --git a/code/datums/diseases/viruses/magnitis.dm b/code/datums/diseases/viruses/magnitis.dm new file mode 100644 index 00000000000..1dcbaa508f3 --- /dev/null +++ b/code/datums/diseases/viruses/magnitis.dm @@ -0,0 +1,65 @@ +/datum/disease/virus/magnitis + name = "Magnitis" + agent = "Nanobots Fukkos Miracos" + desc = "This disease disrupts the magnetic field of your body, making it act as if a powerful magnet. Injections of iron help stabilize the field." + max_stages = 4 + visibility_flags = HIDDEN_HUD + spread_flags = AIRBORNE + cure_text = "Iron for the living, nanopaste for robots" + cures = list("iron") + infectable_mobtypes = list(/mob/living/carbon/human, /mob/living/silicon/robot, /mob/living/simple_animal/pet/dog/corgi/borgi) + ignore_immunity = TRUE + permeability_mod = 0.75 + severity = MEDIUM + +/datum/disease/virus/magnitis/stage_act() + if(!..()) + return FALSE + + switch(stage) + if(2) + if(prob(2)) + to_chat(affected_mob, span_danger("You feel a slight shock course through your body.")) + if(prob(2)) + move_obj(2, 1) + move_mobs(2, 1) + if(3) + if(prob(3)) + to_chat(affected_mob, span_danger("You feel a strong shock course through your body.")) + if(prob(3)) + to_chat(affected_mob, span_danger("You feel like clowning around.")) + if(prob(4)) + move_obj(4, rand(1, 2)) + move_mobs(4, rand(1, 2)) + if(4) + if(prob(5)) + to_chat(affected_mob, span_danger("You feel a powerful shock course through your body.")) + if(prob(5)) + to_chat(affected_mob, span_danger("You query upon the nature of miracles.")) + if(prob(8)) + move_obj(6, rand(1, 3)) + move_mobs(6, rand(1, 3)) + +/datum/disease/virus/magnitis/proc/move_obj(range, iter) + playsound(get_turf(affected_mob.loc), 'sound/effects/magnitis.ogg', 100, 1) + for(var/obj/M in orange(range, affected_mob)) + if(!M.anchored && (M.flags & CONDUCT)) + var/i + for(i = 0, i < iter, i++) + step_towards(M, affected_mob) + +/datum/disease/virus/magnitis/proc/move_mobs(range, iter) + for(var/mob/living/L in orange(range, affected_mob)) + if(istype(L, /mob/living/silicon/robot) || \ + istype(L, /mob/living/simple_animal/pet/dog/corgi/borgi) || \ + ismachineperson(L)) + + var/i + for(i = 0, i < iter, i++) + step_towards(L, affected_mob) + +//machinepersons cures with nanopaste, applied at any bodypart +/datum/disease/virus/magnitis/has_cure() + return ismachineperson(affected_mob) ? FALSE : ..() + + diff --git a/code/datums/diseases/viruses/pierrot_throat.dm b/code/datums/diseases/viruses/pierrot_throat.dm new file mode 100644 index 00000000000..d580caca851 --- /dev/null +++ b/code/datums/diseases/viruses/pierrot_throat.dm @@ -0,0 +1,60 @@ +/datum/disease/virus/pierrot_throat + name = "Pierrot's Throat" + agent = "H0NI<42 Virus" + desc = "If left untreated the subject will probably drive others to insanity." + max_stages = 4 + spread_flags = AIRBORNE + cures = list("banana") + cure_prob = 75 + permeability_mod = 0.75 + severity = MEDIUM + possible_mutations = list(/datum/disease/virus/pierrot_throat/advanced, /datum/disease/virus/wizarditis) + +/datum/disease/virus/pierrot_throat/stage_act() + if(!..()) + return FALSE + + switch(stage) + if(1) + if(prob(10)) + to_chat(affected_mob, span_danger("You feel a little silly.")) + if(2) + if(prob(10)) + to_chat(affected_mob, span_danger("You start seeing rainbows.")) + if(3) + if(prob(10)) + to_chat(affected_mob, span_danger("Your thoughts are interrupted by a loud HONK!")) + if(4) + if(prob(5)) + affected_mob.say(pick(list("ХОНК!", "Хонк!", "Хонк.", "Хонк?", "Хонк!!", "Хонк?!", "Хонк..."))) + + +/datum/disease/virus/pierrot_throat/advanced + name = "Advanced Pierrot's Throat" + agent = "H0NI<42.B4n4 Virus" + desc = "If left untreated the subject will probably drive others to insanity and go insane themselves." + severity = DANGEROUS + possible_mutations = null + +/datum/disease/virus/pierrot_throat/advanced/stage_act() + if(!..()) + return FALSE + + switch(stage) + if(1) + if(prob(5)) + to_chat(affected_mob, span_danger("You feel like making a joke.")) + if(2) + if(prob(10)) + to_chat(affected_mob, span_danger("You don't just start seeing rainbows... YOU ARE RAINBOWS!")) + if(3) + if(prob(10)) + to_chat(affected_mob, span_danger("Your thoughts are interrupted by a loud HONK!")) + affected_mob << 'sound/items/airhorn.ogg' + if(4) + if(prob(5)) + affected_mob.say(pick(list("ХОНК!", "Хонк!", "Хонк.", "Хонк?", "Хонк!!", "Хонк?!", "Хонк..."))) + + if(!istype(affected_mob.wear_mask, /obj/item/clothing/mask/gas/clown_hat/nodrop)) + affected_mob.drop_item_ground(affected_mob.wear_mask, force = TRUE) + affected_mob.equip_to_slot(new /obj/item/clothing/mask/gas/clown_hat/nodrop(src), slot_wear_mask) diff --git a/code/datums/diseases/viruses/retrovirus.dm b/code/datums/diseases/viruses/retrovirus.dm new file mode 100644 index 00000000000..0a860e80fe9 --- /dev/null +++ b/code/datums/diseases/viruses/retrovirus.dm @@ -0,0 +1,68 @@ +/// Just dont use this virus :) +/datum/disease/virus/dna_retrovirus + name = "Retrovirus" + agent = "" + desc = "A DNA-altering retrovirus that scrambles the structural and unique enzymes of a host constantly." + stage_prob = 2 + max_stages = 4 + spread_flags = CONTACT + cure_text = "Rest or an injection of mutadone" + cure_prob = 6 + severity = DANGEROUS + permeability_mod = 0.4 + + +/datum/disease/virus/dna_retrovirus/New() + ..() + agent = "Virus class [pick("A","B","C","D","E","F")][pick("A","B","C","D","E","F")]-[rand(50,300)]" + //else cure is rest + if(prob(40)) + cures = list("mutadone") + + +/datum/disease/virus/dna_retrovirus/stage_act() + if(!..()) + return FALSE + + switch(stage) + if(1) + if(prob(8)) + to_chat(affected_mob, span_danger("Your head hurts.")) + if(prob(9)) + to_chat(affected_mob, span_notice("You feel a tingling sensation in your chest.")) + if(prob(9)) + to_chat(affected_mob, span_danger("You feel angry.")) + + if(2) + if(prob(8)) + to_chat(affected_mob, span_danger("Your skin feels loose.")) + if(prob(10)) + to_chat(affected_mob, span_danger("You feel very strange.")) + if(prob(4)) + to_chat(affected_mob, span_danger("You feel a stabbing pain in your head!")) + affected_mob.Paralyse(4 SECONDS) + if(prob(4)) + to_chat(affected_mob, span_danger("Your stomach churns.")) + + if(3) + if(prob(10)) + to_chat(affected_mob, span_danger("Your entire body vibrates.")) + + if(prob(35)) + scramble(pick(0,1), affected_mob, rand(15, 45)) + + if(4) + if(prob(60)) + scramble(pick(0,1), affected_mob, rand(15, 45)) + +/datum/disease/virus/dna_retrovirus/has_cure() + if(cures.len) + return ..() + else + if(affected_mob.IsSleeping()) + return TRUE + if(affected_mob.lying) + return prob(33) + return FALSE + + diff --git a/code/datums/diseases/viruses/rhumba_beat.dm b/code/datums/diseases/viruses/rhumba_beat.dm new file mode 100644 index 00000000000..26f50431488 --- /dev/null +++ b/code/datums/diseases/viruses/rhumba_beat.dm @@ -0,0 +1,41 @@ +//meme copy of GBS +/datum/disease/virus/rhumba_beat + name = "The Rhumba Beat" + agent = "Unknown" + max_stages = 5 + spread_flags = CONTACT + cure_text = "Chick Chicky Boom!" + cures = list("plasma") + severity = BIOHAZARD + +/datum/disease/virus/rhumba_beat/stage_act() + if(!..()) + return FALSE + + if(affected_mob.ckey == "rosham") + cure() + return + + switch(stage) + if(2) + if(prob(45)) + affected_mob.adjustToxLoss(5) + if(prob(1)) + to_chat(affected_mob, span_danger("You feel strange...")) + if(3) + if(prob(5)) + to_chat(affected_mob, span_danger("You feel the urge to dance...")) + else if(prob(5)) + affected_mob.emote("gasp") + else if(prob(10)) + to_chat(affected_mob, span_danger("You feel the need to chick chicky boom...")) + if(4) + if(prob(10)) + affected_mob.emote("gasp") + to_chat(affected_mob, span_danger("You feel a burning beat inside...")) + if(prob(20)) + affected_mob.adjustToxLoss(5) + if(5) + to_chat(affected_mob, span_userdanger("Your body is unable to contain the Rhumba Beat...")) + if(prob(50)) + affected_mob.gib() diff --git a/code/datums/diseases/viruses/transformation.dm b/code/datums/diseases/viruses/transformation.dm new file mode 100644 index 00000000000..4cce03f8116 --- /dev/null +++ b/code/datums/diseases/viruses/transformation.dm @@ -0,0 +1,268 @@ +/datum/disease/virus/transformation + name = "Transformation" + stage_prob = 10 + max_stages = 5 + spread_flags = NON_CONTAGIOUS + severity = DANGEROUS + can_immunity = FALSE + infectable_mobtypes = list(/mob/living/carbon/human, /mob/living/carbon/alien) + var/list/stage1 + var/list/stage2 + var/list/stage3 + var/list/stage4 + var/list/stage5 + var/list/transform_message + var/new_form + var/is_new_mind = FALSE + var/transformed = FALSE + var/cure_after_transform = TRUE + +/datum/disease/virus/transformation/stage_act() + if(!..() || !affected_mob) + return FALSE + + switch(stage) + if(1) + if(prob(stage_prob) && stage1) + to_chat(affected_mob, pick(stage1)) + if(2) + if(prob(stage_prob) && stage2) + to_chat(affected_mob, pick(stage2)) + if(3) + if(prob(stage_prob*2) && stage3) + to_chat(affected_mob, pick(stage3)) + if(4) + if(prob(stage_prob*2) && stage4) + to_chat(affected_mob, pick(stage4)) + if(5) + if(prob(stage_prob*2) && stage5) + to_chat(affected_mob, pick(stage5)) + if(!transformed) + if(transform_message) + to_chat(affected_mob, pick(transform_message)) + do_disease_transformation() + if(cure_after_transform) + cure() + +/datum/disease/virus/transformation/proc/do_disease_transformation() + if(istype(affected_mob) && new_form) + if(jobban_isbanned(affected_mob, new_form)) + affected_mob.death(1) + return + + if(affected_mob.notransform) + return + + affected_mob.notransform = 1 + affected_mob.canmove = 0 + affected_mob.icon = null + affected_mob.overlays.Cut() + affected_mob.invisibility = INVISIBILITY_ABSTRACT + + for(var/obj/item/W in affected_mob) + if(istype(W, /obj/item/implant)) + qdel(W) + continue + affected_mob.drop_item_ground(W) //Если вещь снимается - снимаем + + if(isobj(affected_mob.loc)) + var/obj/O = affected_mob.loc + O.force_eject_occupant(affected_mob) + + var/mob/living/new_mob = new new_form(affected_mob.loc) + if(istype(new_mob)) + new_mob.a_intent = "harm" + if(affected_mob.mind) + affected_mob.mind.transfer_to(new_mob) + if(is_new_mind) + new_mob.mind.wipe_memory() + else + new_mob.key = affected_mob.key + + qdel(affected_mob) + transformed = TRUE + return new_mob + +/datum/disease/virus/transformation/jungle_fever + name = "Jungle Fever" + agent = "Kongey Vibrion M-909" + desc = "Monkeys with this disease will bite humans, causing humans to mutate into a monkey." + stage_prob = 2 + cure_prob = 5 + cures = list("banana") + spread_flags = BITES + infectable_mobtypes = list(/mob/living/carbon/human) + severity = BIOHAZARD + cure_after_transform = FALSE + stage1 = null + stage2 = null + stage3 = null + stage4 = list(span_warning("Your back hurts."), span_warning("You breathe through your mouth."), + span_warning("You have a craving for bananas."), span_warning("Your mind feels clouded.")) + stage5 = list(span_warning("You feel like monkeying around.")) + new_form = /mob/living/carbon/human/lesser/monkey + +/datum/disease/virus/transformation/jungle_fever/do_disease_transformation() + var/mob/living/carbon/human/H = affected_mob + if(!istype(H)) + return + if(!issmall(H)) + if(istype(H.dna.species.primitive_form)) + H.monkeyize() + transformed = TRUE + else + var/mob/living/new_mob = ..() + var/datum/disease/virus/transformation/jungle_fever/D = Contract(new_mob) + D?.stage = 5 + D.transformed = TRUE + else + transformed = TRUE + +/datum/disease/virus/transformation/jungle_fever/stage_act() + if(!..() || !affected_mob) + return FALSE + + switch(stage) + if(2) + if(prob(2)) + to_chat(affected_mob, span_notice("Your [pick("back", "arm", "leg", "elbow", "head")] itches.")) + if(3) + if(prob(4)) + to_chat(affected_mob, span_danger("You feel a stabbing pain in your head.")) + affected_mob.AdjustConfused(20 SECONDS) + if(4, 5) + if(prob(4)) + affected_mob.say(pick("Иииик, уку уку!", "Иии-ииик!", "Ииии!", "Ун, ун.")) + +/datum/disease/virus/transformation/robot + name = "Robotic Transformation" + agent = "R2D2 Nanomachines" + desc = "This disease, actually acute nanomachine infection, converts the victim into a cyborg." + cures = list("copper") + cure_prob = 5 + is_new_mind = TRUE + stage1 = null + stage2 = list(span_notice("Your joints feel stiff."), span_danger("Beep...boop..")) + stage3 = list(span_danger("Your joints feel very stiff."), span_notice("Your skin feels loose."), span_danger("You can feel something move...inside.")) + stage4 = list(span_danger("Your skin feels very loose."), span_danger("You can feel... something...inside you.")) + transform_message = list(span_danger("Your skin feels as if it's about to burst off!")) + new_form = /mob/living/silicon/robot + +/datum/disease/virus/transformation/robot/stage_act() + if(!..() || !affected_mob) + return FALSE + + switch(stage) + if(3) + if(prob(8)) + affected_mob.say(pick("Beep, boop", "beep, beep!", "Boop...bop")) + if(prob(4)) + to_chat(affected_mob, span_danger("You feel a stabbing pain in your head.")) + affected_mob.Paralyse(4 SECONDS) + if(4) + if(prob(20)) + affected_mob.say(pick("beep, beep!", "Boop bop boop beep.", "kkkiiiill mmme", "I wwwaaannntt tttoo dddiiieeee...")) + + +/datum/disease/virus/transformation/xeno + name = "Xenomorph Transformation" + agent = "Rip-LEY Alien Microbes" + desc = "This disease changes the victim into a xenomorph." + cures = list("spaceacillin", "glycerol") + cure_prob = 5 + stage1 = null + stage2 = list("Your throat feels scratchy.", span_danger("Kill...")) + stage3 = list(span_danger("Your throat feels very scratchy."), "Your skin feels tight.", span_danger("You can feel something move...inside.")) + stage4 = list(span_danger("Your skin feels very tight."), span_danger("Your blood boils!"), span_danger("You can feel... something...inside you.")) + transform_message = list(span_danger("Теперь вы ксеноморф.\n\ + Вы чувствуете боль от превращения! Вы желаете укусить того, кто с вами это сделал, благо, память вас не покинула и вы всё помните.")) + new_form = null + +/datum/disease/virus/transformation/xeno/New() + ..() + new_form = pick(/mob/living/carbon/alien/humanoid/hunter, /mob/living/carbon/alien/humanoid/drone/no_queen, /mob/living/carbon/alien/humanoid/sentinel) + +/datum/disease/virus/transformation/xeno/stage_act() + if(!..() || !affected_mob) + return FALSE + + switch(stage) + if(3) + if(prob(4)) + to_chat(affected_mob, span_danger("You feel a stabbing pain in your head.")) + affected_mob.Paralyse(4 SECONDS) + if(4) + if(prob(20)) + affected_mob.say(pick("You look delicious.", "Going to... devour you...", "Hsssshhhhh!")) + + +/datum/disease/virus/transformation/slime + name = "Advanced Mutation Transformation" + agent = "Advanced Mutation Toxin" + desc = "This highly concentrated extract converts anything into more of itself." + cures = list("frostoil") + cure_prob = 80 + stage1 = list(span_notice("You don't feel very well.")) + stage2 = list(span_notice("Your skin feels a little slimy.")) + stage3 = list(span_danger("Your appendages are melting away."), span_danger("Your limbs begin to lose their shape.")) + stage4 = list(span_danger("You are turning into a slime.")) + transform_message = list(span_danger("You have become a slime.")) + new_form = /mob/living/simple_animal/slime/random + +/datum/disease/virus/transformation/slime/stage_act() + if(!..() || !affected_mob) + return FALSE + + switch(stage) + if(1) + if(ishuman(affected_mob)) + var/mob/living/carbon/human/H = affected_mob + if(isslimeperson(H)) + stage = 5 + if(3) + if(ishuman(affected_mob)) + var/mob/living/carbon/human/human = affected_mob + if(!isslimeperson(human)) + human.set_species(/datum/species/slime) + +/datum/disease/virus/transformation/corgi + name = "The Barkening" + agent = "Fell Doge Majicks" + desc = "This disease transforms the victim into a corgi." + cure_text = "Death" + cures = list("adminordrazine") + stage1 = list(span_notice("BARK.")) + stage2 = list(span_notice("You feel the need to wear silly hats.")) + stage3 = list(span_danger("Must... eat... chocolate...."), span_danger("YAP")) + stage4 = list(span_danger("Visions of washing machines assail your mind!")) + transform_message = list(span_danger("AUUUUUU!!!")) + new_form = /mob/living/simple_animal/pet/dog/corgi + is_new_mind = TRUE + +/datum/disease/virus/transformation/corgi/stage_act() + if(!..() || !affected_mob) + return FALSE + + switch(stage) + if(3) + if(prob(8)) + affected_mob.say(pick("YAP", "Woof!")) + if(4) + if(prob(20)) + affected_mob.say(pick("Bark!", "AUUUUUU")) + +/datum/disease/virus/transformation/morph + name = "Gluttony's Blessing" + agent = "Gluttony's Blessing" + desc = "A 'gift' from somewhere terrible." + cure_text = "Nothing" + cures = list("adminordrazine") + stage_prob = 20 + stage1 = list(span_notice("Your stomach rumbles.")) + stage2 = list(span_notice("Your skin feels saggy.")) + stage3 = list(span_danger("Your appendages are melting away."), span_danger("Your limbs begin to lose their shape.")) + stage4 = list(span_danger("You're ravenous.")) + transform_message = list(span_danger("ТЕПЕРЬ ВЫ МОРФ! \n \ + Хоть Вы и трансформировались в отвратительную зелёную жижу, но это не повлияло на Ваше сознание \ + и память. Вы не являетесь антагонистом.")) + new_form = /mob/living/simple_animal/hostile/morph diff --git a/code/datums/diseases/viruses/tuberculosis.dm b/code/datums/diseases/viruses/tuberculosis.dm new file mode 100644 index 00000000000..ee8cdaf6581 --- /dev/null +++ b/code/datums/diseases/viruses/tuberculosis.dm @@ -0,0 +1,59 @@ +/datum/disease/virus/tuberculosis + form = "Disease" + name = "Fungal Tuberculosis" + agent = "Fungal Tubercle bacillus Cosmosis" + desc = "A rare highly transmittable virulent virus. Few samples exist, rumoured to be carefully grown and cultured by clandestine bio-weapon specialists. Causes fever, blood vomiting, lung damage, weight loss, and fatigue." + spread_flags = AIRBORNE + cures = list("spaceacillin", "salbutamol") + cure_prob = 5 + required_organs = list(/obj/item/organ/internal/lungs) + severity = DANGEROUS + ignore_immunity = TRUE + +/datum/disease/virus/tuberculosis/stage_act() + if(!..()) + return FALSE + + var/mob/living/carbon/human/H = affected_mob + switch(stage) + if(2, 3) + if(prob(2)) + H.emote("cough") + to_chat(H, span_danger("Your chest hurts.")) + if(prob(2)) + to_chat(H, span_danger("Your stomach violently rumbles!")) + if(prob(5)) + to_chat(H, span_danger("You feel a cold sweat form.")) + if(4) + if(prob(2)) + to_chat(H, span_userdanger("You see four of everything")) + H.Dizzy(10 SECONDS) + if(prob(2)) + to_chat(H, span_danger("You feel a sharp pain from your lower chest!")) + H.adjustOxyLoss(5) + H.emote("gasp") + if(prob(10)) + to_chat(H, span_danger("You feel air escape from your lungs painfully.")) + H.adjustOxyLoss(25) + H.emote("gasp") + if(5) + if(prob(2)) + to_chat(H, span_userdanger("[pick("You feel your heart slowing...", "You relax and slow your heartbeat.")]")) + H.adjustStaminaLoss(70) + if(prob(10)) + H.adjustStaminaLoss(100) + H.visible_message(span_warning("[H] faints!"), span_userdanger("You surrender yourself and feel at peace...")) + H.AdjustSleeping(10 SECONDS) + if(prob(2)) + to_chat(H, span_userdanger("You feel your mind relax and your thoughts drift!")) + H.AdjustConfused(16 SECONDS, bound_lower = 0, bound_upper = 200 SECONDS) + if(prob(10)) + H.vomit(20) + if(prob(3)) + to_chat(H, span_warning("[pick("Your stomach silently rumbles...", "Your stomach seizes up and falls limp, muscles dead and lifeless.", "You could eat a crayon")]")) + H.overeatduration = max(H.overeatduration - 100, 0) + H.adjust_nutrition(-100) + if(prob(15)) + to_chat(H, span_danger("[pick("You feel uncomfortably hot...", "You feel like unzipping your jumpsuit", "You feel like taking off some clothes...")]")) + H.bodytemperature += 40 + return diff --git a/code/datums/diseases/wizarditis.dm b/code/datums/diseases/viruses/wizarditis.dm similarity index 60% rename from code/datums/diseases/wizarditis.dm rename to code/datums/diseases/viruses/wizarditis.dm index b270b01e07b..2e846ee7b0e 100644 --- a/code/datums/diseases/wizarditis.dm +++ b/code/datums/diseases/viruses/wizarditis.dm @@ -1,15 +1,13 @@ -/datum/disease/wizarditis +/datum/disease/virus/wizarditis name = "Wizarditis" + agent = "Rincewindus Vulgaris" + desc = "Some speculate, that this virus is the cause of Wizard Federation existance. Subjects affected show the signs of dementia, yelling obscure sentences or total gibberish. On late stages subjects sometime express the feelings of inner power, and, cite, 'the ability to control the forces of cosmos themselves!' A gulp of strong, manly spirits usually reverts them to normal, humanlike, condition." max_stages = 4 - spread_text = "Airborne" - cure_text = "The Manly Dorf" + visibility_flags = HIDDEN_HUD + spread_flags = AIRBORNE cures = list("manlydorf") - cure_chance = 100 - agent = "Rincewindus Vulgaris" - viable_mobtypes = list(/mob/living/carbon/human) - disease_flags = CAN_CARRY|CAN_RESIST|CURABLE + cure_prob = 100 permeability_mod = 0.75 - desc = "Some speculate, that this virus is the cause of Wizard Federation existance. Subjects affected show the signs of dementia, yelling obscure sentences or total gibberish. On late stages subjects sometime express the feelings of inner power, and, cite, 'the ability to control the forces of cosmos themselves!' A gulp of strong, manly spirits usually reverts them to normal, humanlike, condition." severity = HARMFUL required_organs = list(/obj/item/organ/external/head) @@ -23,70 +21,69 @@ TARCOL MINTI ZHERI - forcewall STI KALY - blind */ -/datum/disease/wizarditis/stage_act() - ..() +/datum/disease/virus/wizarditis/stage_act() + if(!..()) + return FALSE switch(stage) if(2) - if(prob(1)&&prob(50)) + if(prob(5)) affected_mob.say(pick("You shall not pass!", "Expeliarmus!", "By Merlins beard!", "Feel the power of the Dark Side!")) - if(prob(1)&&prob(50)) - to_chat(affected_mob, "You feel [pick("that you don't have enough mana", "that the winds of magic are gone", "an urge to summon familiar")].") + if(prob(3)) + to_chat(affected_mob, span_danger("You feel [pick("that you don't have enough mana", "that the winds of magic are gone", "an urge to summon familiar")].")) if(3) - if(prob(1)&&prob(50)) + if(prob(2)) affected_mob.say(pick("NEC CANTIO!","AULIE OXIN FIERA!", "STI KALY!", "TARCOL MINTI ZHERI!")) - if(prob(1)&&prob(50)) - to_chat(affected_mob, "You feel [pick("the magic bubbling in your veins","that this location gives you a +1 to INT","an urge to summon familiar")].") + if(prob(6)) + to_chat(affected_mob, span_danger("You feel [pick("the magic bubbling in your veins","that this location gives you a +1 to INT","an urge to summon familiar")].")) if(4) - - if(prob(1)) + if(prob(3)) affected_mob.say(pick("NEC CANTIO!","AULIE OXIN FIERA!","STI KALY!","EI NATH!")) - return - if(prob(1)&&prob(50)) - to_chat(affected_mob, "You feel [pick("the tidal wave of raw power building inside","that this location gives you a +2 to INT and +1 to WIS","an urge to teleport")].") - spawn_wizard_clothes(50) - if(prob(1)&&prob(1)) + if(prob(1)) + to_chat(affected_mob, span_danger("You feel [pick("the tidal wave of raw power building inside","that this location gives you a +2 to INT and +1 to WIS","an urge to teleport")].")) + spawn_wizard_clothes() + if(prob(1)) teleport() return -/datum/disease/wizarditis/proc/spawn_wizard_clothes(chance = 0) - if(istype(affected_mob, /mob/living/carbon/human)) - var/mob/living/carbon/human/H = affected_mob - if(prob(chance)) +/datum/disease/virus/wizarditis/proc/spawn_wizard_clothes() + var/mob/living/carbon/human/H = affected_mob + switch(pick("head", "robe", "sandal", "staff")) + + if("head") if(!istype(H.head, /obj/item/clothing/head/wizard)) if(!H.drop_item_ground(H.head)) qdel(H.head) H.equip_to_slot_or_del(new /obj/item/clothing/head/wizard(H), slot_head) - return - if(prob(chance)) + return + + if("robe") if(!istype(H.wear_suit, /obj/item/clothing/suit/wizrobe)) if(!H.drop_item_ground(H.wear_suit)) qdel(H.wear_suit) H.equip_to_slot_or_del(new /obj/item/clothing/suit/wizrobe(H), slot_wear_suit) - return - if(prob(chance)) + return + + if("sandal") if(!istype(H.shoes, /obj/item/clothing/shoes/sandal)) if(!H.drop_item_ground(H.shoes)) qdel(H.shoes) - H.equip_to_slot_or_del(new /obj/item/clothing/shoes/sandal(H), slot_shoes) - return - else - var/mob/living/carbon/H = affected_mob - if(prob(chance)) + H.equip_to_slot_or_del(new /obj/item/clothing/shoes/sandal(H), slot_shoes) + return + + if("staff") if(!istype(H.r_hand, /obj/item/twohanded/staff)) H.drop_r_hand() - H.put_in_r_hand( new /obj/item/twohanded/staff(H) ) - return - return - + H.put_in_r_hand(new /obj/item/twohanded/staff(H)) + return -/datum/disease/wizarditis/proc/teleport() +/datum/disease/virus/wizarditis/proc/teleport() var/list/theareas = get_areas_in_range(80, affected_mob) for(var/area/space/S in theareas) theareas -= S diff --git a/code/datums/supplypacks.dm b/code/datums/supplypacks.dm index 3252b358096..2095f7a07ff 100644 --- a/code/datums/supplypacks.dm +++ b/code/datums/supplypacks.dm @@ -975,8 +975,10 @@ GLOBAL_LIST_INIT(all_supply_groups, list(SUPPLY_EMERGENCY,SUPPLY_SECURITY,SUPPLY /datum/supply_packs/medical/virus name = "Virus Crate" - contains = list(/obj/item/reagent_containers/glass/bottle/flu_virion, + contains = list(/obj/item/reagent_containers/glass/bottle/flu, /obj/item/reagent_containers/glass/bottle/cold, + /obj/item/reagent_containers/glass/bottle/sneezing, + /obj/item/reagent_containers/glass/bottle/cough, /obj/item/reagent_containers/glass/bottle/epiglottis_virion, /obj/item/reagent_containers/glass/bottle/liver_enhance_virion, /obj/item/reagent_containers/glass/bottle/fake_gbs, diff --git a/code/datums/syndiesupplypacks.dm b/code/datums/syndiesupplypacks.dm index db352bb19a3..f3d3bea66a9 100644 --- a/code/datums/syndiesupplypacks.dm +++ b/code/datums/syndiesupplypacks.dm @@ -844,8 +844,10 @@ GLOBAL_LIST_INIT(all_syndie_supply_groups, list(SYNDIE_SUPPLY_EMERGENCY,SYNDIE_S /datum/syndie_supply_packs/medical/virus name = "Virus Crate" - contains = list(/obj/item/reagent_containers/glass/bottle/flu_virion, + contains = list(/obj/item/reagent_containers/glass/bottle/flu, /obj/item/reagent_containers/glass/bottle/cold, + /obj/item/reagent_containers/glass/bottle/sneezing, + /obj/item/reagent_containers/glass/bottle/cough, /obj/item/reagent_containers/glass/bottle/epiglottis_virion, /obj/item/reagent_containers/glass/bottle/liver_enhance_virion, /obj/item/reagent_containers/glass/bottle/fake_gbs, diff --git a/code/game/data_huds.dm b/code/game/data_huds.dm index 0615b88f803..5d6e174f176 100644 --- a/code/game/data_huds.dm +++ b/code/game/data_huds.dm @@ -76,7 +76,7 @@ /// Whether the carbon mob is currently in crit. // Even though "crit" does not realistically happen for non-humans.. /mob/living/carbon/proc/is_in_crit() - for(var/thing in viruses) + for(var/thing in diseases) var/datum/disease/D = thing if(istype(D, /datum/disease/critical)) return TRUE @@ -90,12 +90,12 @@ return FALSE /// Whether a virus worthy displaying on the HUD is present. -/mob/living/carbon/proc/has_virus() - for(var/thing in viruses) +/mob/living/proc/has_virus() + for(var/thing in diseases) var/datum/disease/D = thing if(!D.discovered) // Early-stage viruses should not show up on med HUD (though health analywers can still pick them up) continue - if((!(D.visibility_flags & HIDDEN_SCANNER)) && (D.severity != NONTHREAT)) + if((!(D.visibility_flags & HIDDEN_HUD)) && (D.severity != NONTHREAT)) return TRUE return FALSE @@ -176,6 +176,8 @@ var/image/holder = hud_list[STATUS_HUD] if(stat == DEAD) holder.icon_state = "huddead" + else if(has_virus()) + holder.icon_state = "hudill" else holder.icon_state = "hudhealthy" diff --git a/code/game/gamemodes/clockwork/cogscarab.dm b/code/game/gamemodes/clockwork/cogscarab.dm index e86a1903482..e63a0771375 100644 --- a/code/game/gamemodes/clockwork/cogscarab.dm +++ b/code/game/gamemodes/clockwork/cogscarab.dm @@ -119,7 +119,7 @@ adjustBruteLoss(2) else wind_up_timer -= seconds - hud_used.wind_up_timer?.icon_state = "windup_display-[6-(round(wind_up_timer, wind_up_icon_segment) / wind_up_icon_segment)]" + hud_used?.wind_up_timer?.icon_state = "windup_display-[6-(round(wind_up_timer, wind_up_icon_segment) / wind_up_icon_segment)]" //rounds to 30 and divides by 30. if timer full, 6 - 5, state 1. from 1 to 6. diff --git a/code/game/gamemodes/cult/runes.dm b/code/game/gamemodes/cult/runes.dm index 31ddd80a140..1d95b3a76c8 100644 --- a/code/game/gamemodes/cult/runes.dm +++ b/code/game/gamemodes/cult/runes.dm @@ -346,7 +346,7 @@ structure_check() searches for nearby cultist structures required for the invoca for(var/obj/item/organ/external/E in H.bodyparts) E.mend_fracture() E.internal_bleeding = FALSE - for(var/datum/disease/critical/crit in H.viruses) // cure all crit conditions + for(var/datum/disease/critical/crit in H.diseases) // cure all crit conditions crit.cure() H.uncuff() diff --git a/code/game/gamemodes/miniantags/abduction/gland.dm b/code/game/gamemodes/miniantags/abduction/gland.dm index d17447171cc..62b1ba62cb1 100644 --- a/code/game/gamemodes/miniantags/abduction/gland.dm +++ b/code/game/gamemodes/miniantags/abduction/gland.dm @@ -219,33 +219,13 @@ /obj/item/organ/internal/heart/gland/viral/activate() to_chat(owner, "You feel sick.") - var/datum/disease/advance/rand_virus = random_virus(rand(2, 6), 6) - rand_virus.carrier = TRUE - var/datum/disease/advance/check = locate() in owner.viruses - if(check) - check.cure(resistance = FALSE) - owner.ForceContractDisease(rand_virus) - -/obj/item/organ/internal/heart/gland/viral/proc/random_virus(max_symptoms, max_level) - if(max_symptoms > VIRUS_SYMPTOM_LIMIT) - max_symptoms = VIRUS_SYMPTOM_LIMIT - var/datum/disease/advance/A = new - var/list/datum/symptom/possible_symptoms = list() - for(var/symptom in subtypesof(/datum/symptom)) - var/datum/symptom/S = symptom - if(initial(S.level) > max_level) - continue - if(initial(S.level) <= 0) //unobtainable symptoms - continue - possible_symptoms += S - for(var/i in 1 to max_symptoms) - var/datum/symptom/chosen_symptom = pick_n_take(possible_symptoms) - if(chosen_symptom) - var/datum/symptom/S = new chosen_symptom - A.symptoms += S - A.Refresh() //just in case someone already made and named the same disease - return A - + var/datum/disease/virus/advance/new_virus + new_virus = CreateRandomVirus(count_of_symptoms = rand(4, 6), resistance = rand(0,11), stealth = pick(0,0,1,1,2), + stage_rate = rand(-11,5), transmittable = rand(2,9), severity = rand(0,5)) + var/datum/disease/virus/advance/old_virus = locate() in owner.diseases + if(old_virus) + old_virus.cure(need_immunity = FALSE) + new_virus.Contract(owner, is_carrier = TRUE) /obj/item/organ/internal/heart/gland/emp //TODO : Replace with something more interesting origin_tech = "materials=4;biotech=4;magnets=6;abductor=3" diff --git a/code/game/gamemodes/nuclear/nuclearbomb.dm b/code/game/gamemodes/nuclear/nuclearbomb.dm index abc84313786..41fbbd19447 100644 --- a/code/game/gamemodes/nuclear/nuclearbomb.dm +++ b/code/game/gamemodes/nuclear/nuclearbomb.dm @@ -283,6 +283,8 @@ GLOBAL_VAR(bomb_set) attack_hand(user) /obj/machinery/nuclearbomb/attack_hand(mob/user as mob) + if(..()) + return TRUE add_fingerprint(user) if(!panel_open) return ui_interact(user) diff --git a/code/game/machinery/Freezer.dm b/code/game/machinery/Freezer.dm index c14472cc8d4..f4c5e63fcac 100644 --- a/code/game/machinery/Freezer.dm +++ b/code/game/machinery/Freezer.dm @@ -107,6 +107,9 @@ attack_hand(user) /obj/machinery/atmospherics/unary/cold_sink/freezer/attack_hand(mob/user as mob) + if(..()) + return TRUE + if(panel_open) to_chat(user, span_notice("Сначала закройте панель техобслуживания.")) return diff --git a/code/game/machinery/Sleeper.dm b/code/game/machinery/Sleeper.dm index 148f49c5e9a..3e6bad4728b 100644 --- a/code/game/machinery/Sleeper.dm +++ b/code/game/machinery/Sleeper.dm @@ -133,6 +133,9 @@ if(stat & (NOPOWER|BROKEN)) return + if(..()) + return TRUE + if(panel_open) to_chat(user, span_notice("Close the maintenance panel first.")) return diff --git a/code/game/machinery/adv_med.dm b/code/game/machinery/adv_med.dm index cb86e413a0a..354de75e424 100644 --- a/code/game/machinery/adv_med.dm +++ b/code/game/machinery/adv_med.dm @@ -139,6 +139,9 @@ ui_interact(user) /obj/machinery/bodyscanner/attack_hand(user) + if(..()) + return TRUE + if(stat & (NOPOWER|BROKEN)) return @@ -222,9 +225,9 @@ occupantData["maxHealth"] = occupant.maxHealth var/found_disease = FALSE - for(var/thing in occupant.viruses) + for(var/thing in occupant.diseases) var/datum/disease/D = thing - if(D.visibility_flags & HIDDEN_SCANNER || D.visibility_flags & HIDDEN_PANDEMIC) + if(D.visibility_flags & HIDDEN_SCANNER) continue if(istype(D, /datum/disease/critical)) continue @@ -388,9 +391,9 @@ dat += "[occupant.health > 50 ? "" : ""]\tHealth %: [occupant.health], ([t1])
" var/found_disease = FALSE - for(var/thing in occupant.viruses) + for(var/thing in occupant.diseases) var/datum/disease/D = thing - if(D.visibility_flags & HIDDEN_SCANNER || D.visibility_flags & HIDDEN_PANDEMIC) + if(D.visibility_flags & HIDDEN_SCANNER) continue found_disease = TRUE break diff --git a/code/game/machinery/atmoalter/canister.dm b/code/game/machinery/atmoalter/canister.dm index f4fa9203463..22f655ddba0 100644 --- a/code/game/machinery/atmoalter/canister.dm +++ b/code/game/machinery/atmoalter/canister.dm @@ -281,6 +281,9 @@ update_flag return ui_interact(user) /obj/machinery/portable_atmospherics/canister/attack_hand(var/mob/user) + if(..()) + return TRUE + add_fingerprint(user) return ui_interact(user) diff --git a/code/game/machinery/atmoalter/pump.dm b/code/game/machinery/atmoalter/pump.dm index 1223fbdbae6..e5987d8076f 100644 --- a/code/game/machinery/atmoalter/pump.dm +++ b/code/game/machinery/atmoalter/pump.dm @@ -115,6 +115,9 @@ return attack_hand(user) /obj/machinery/portable_atmospherics/pump/attack_hand(mob/user) + if(..()) + return TRUE + add_fingerprint(user) ui_interact(user) diff --git a/code/game/machinery/atmoalter/scrubber.dm b/code/game/machinery/atmoalter/scrubber.dm index 09c5a6c88c6..5d1b6f5a3ee 100644 --- a/code/game/machinery/atmoalter/scrubber.dm +++ b/code/game/machinery/atmoalter/scrubber.dm @@ -109,6 +109,9 @@ return attack_hand(user) /obj/machinery/portable_atmospherics/scrubber/attack_hand(mob/user) + if(..()) + return TRUE + add_fingerprint(user) ui_interact(user) return diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm index 237621e32a6..ab1b604cd3f 100644 --- a/code/game/machinery/cloning.dm +++ b/code/game/machinery/cloning.dm @@ -550,7 +550,7 @@ GLOBAL_LIST_INIT(cloner_biomass_items, list(\ missing_organs.Cut() occupant.SetLoseBreath(0) // Stop friggin' dying, gosh damn occupant.setOxyLoss(0) - for(var/datum/disease/critical/crit in occupant.viruses) + for(var/datum/disease/critical/crit in occupant.diseases) crit.cure() occupant.forceMove(T) occupant.update_body() diff --git a/code/game/machinery/computer/aifixer.dm b/code/game/machinery/computer/aifixer.dm index 29f17890f68..28e44640f1e 100644 --- a/code/game/machinery/computer/aifixer.dm +++ b/code/game/machinery/computer/aifixer.dm @@ -26,6 +26,8 @@ ui_interact(user) /obj/machinery/computer/aifixer/attack_hand(var/mob/user as mob) + if(..()) + return TRUE ui_interact(user) /obj/machinery/computer/aifixer/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = TRUE, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state) diff --git a/code/game/machinery/computer/atmos_alert.dm b/code/game/machinery/computer/atmos_alert.dm index 3d2b1b3e0c7..52e81a8e665 100644 --- a/code/game/machinery/computer/atmos_alert.dm +++ b/code/game/machinery/computer/atmos_alert.dm @@ -20,6 +20,9 @@ return ..() /obj/machinery/computer/atmos_alert/attack_hand(mob/user) + if(..()) + return TRUE + add_fingerprint(user) ui_interact(user) diff --git a/code/game/machinery/computer/brigcells.dm b/code/game/machinery/computer/brigcells.dm index 5e0bca438a7..774e89761b6 100644 --- a/code/game/machinery/computer/brigcells.dm +++ b/code/game/machinery/computer/brigcells.dm @@ -17,6 +17,10 @@ /obj/machinery/computer/brigcells/attack_hand(mob/user) if(stat & (BROKEN|NOPOWER)) return + + if(..()) + return TRUE + if(!allowed(user)) to_chat(user, span_warning("Access denied.")) return diff --git a/code/game/machinery/computer/cloning.dm b/code/game/machinery/computer/cloning.dm index 96769c44a18..c54a11f2445 100644 --- a/code/game/machinery/computer/cloning.dm +++ b/code/game/machinery/computer/cloning.dm @@ -117,6 +117,9 @@ return attack_hand(user) /obj/machinery/computer/cloning/attack_hand(mob/user as mob) + if(..()) + return TRUE + user.set_machine(src) add_fingerprint(user) diff --git a/code/game/machinery/computer/crew.dm b/code/game/machinery/computer/crew.dm index ff61e860bea..220a32ed5fb 100644 --- a/code/game/machinery/computer/crew.dm +++ b/code/game/machinery/computer/crew.dm @@ -24,6 +24,10 @@ /obj/machinery/computer/crew/attack_hand(mob/user) if(stat & (BROKEN|NOPOWER)) return + + if(..()) + return TRUE + add_fingerprint(user) ui_interact(user) diff --git a/code/game/machinery/computer/law.dm b/code/game/machinery/computer/law.dm index f8ec9853b0f..f648b951825 100644 --- a/code/game/machinery/computer/law.dm +++ b/code/game/machinery/computer/law.dm @@ -54,6 +54,9 @@ to_chat(usr, "The upload computer is broken!") return + if(..()) + return TRUE + src.current = select_active_ai(user) if(!src.current) diff --git a/code/game/machinery/computer/medical.dm b/code/game/machinery/computer/medical.dm index 87973705e49..25f073ec8a2 100644 --- a/code/game/machinery/computer/medical.dm +++ b/code/game/machinery/computer/medical.dm @@ -146,7 +146,7 @@ data["virus"] = list() for(var/D in typesof(/datum/disease)) var/datum/disease/DS = new D(0) - if(istype(DS, /datum/disease/advance)) + if(istype(DS, /datum/disease/virus/advance)) continue if(!DS.desc) continue @@ -218,7 +218,7 @@ var/list/payload = list( name = D.name, max_stages = D.max_stages, - spread_text = D.spread_text, + spread_text = D.additional_info, cure = D.cure_text || "None", desc = D.desc, severity = D.severity diff --git a/code/game/machinery/computer/pod_tracking_console.dm b/code/game/machinery/computer/pod_tracking_console.dm index 647b15587d1..983e4b5e006 100644 --- a/code/game/machinery/computer/pod_tracking_console.dm +++ b/code/game/machinery/computer/pod_tracking_console.dm @@ -11,6 +11,9 @@ return attack_hand(user) /obj/machinery/computer/podtracker/attack_hand(mob/user) + if(..()) + return TRUE + add_fingerprint(user) ui_interact(user) diff --git a/code/game/machinery/computer/power.dm b/code/game/machinery/computer/power.dm index d71f4ea2c47..c8e7dae6b74 100644 --- a/code/game/machinery/computer/power.dm +++ b/code/game/machinery/computer/power.dm @@ -70,6 +70,10 @@ /obj/machinery/computer/monitor/attack_hand(mob/user) if(stat & (BROKEN|NOPOWER)) return + + if(..()) + return TRUE + add_fingerprint(user) // Update the powernet powernet = find_powernet() diff --git a/code/game/machinery/computer/salvage_ship.dm b/code/game/machinery/computer/salvage_ship.dm index 28623d27c6e..dff1a929f40 100644 --- a/code/game/machinery/computer/salvage_ship.dm +++ b/code/game/machinery/computer/salvage_ship.dm @@ -42,6 +42,9 @@ return attack_hand(user) /obj/machinery/computer/salvage_ship/attack_hand(mob/user as mob) + if(..()) + return TRUE + if(!allowed(user)) to_chat(user, span_warning("Access Denied")) playsound(src, pick('sound/machines/button.ogg', 'sound/machines/button_alternate.ogg', 'sound/machines/button_meloboom.ogg'), 20) diff --git a/code/game/machinery/computer/sm_monitor.dm b/code/game/machinery/computer/sm_monitor.dm index 1df2bfec2ab..966fe4b6b3f 100644 --- a/code/game/machinery/computer/sm_monitor.dm +++ b/code/game/machinery/computer/sm_monitor.dm @@ -22,6 +22,10 @@ /obj/machinery/computer/sm_monitor/attack_hand(mob/user) if(stat & (BROKEN|NOPOWER)) return + + if(..()) + return TRUE + add_fingerprint(user) ui_interact(user) diff --git a/code/game/machinery/computer/station_alert.dm b/code/game/machinery/computer/station_alert.dm index 886e3e02a9d..2037e71744c 100644 --- a/code/game/machinery/computer/station_alert.dm +++ b/code/game/machinery/computer/station_alert.dm @@ -29,6 +29,10 @@ /obj/machinery/computer/station_alert/attack_hand(mob/user) if(stat & (BROKEN|NOPOWER)) return + + if(..()) + return TRUE + add_fingerprint(user) ui_interact(user) diff --git a/code/game/machinery/computer/store.dm b/code/game/machinery/computer/store.dm index edb667f2287..aac67d05f97 100644 --- a/code/game/machinery/computer/store.dm +++ b/code/game/machinery/computer/store.dm @@ -23,6 +23,9 @@ if(stat & (BROKEN|NOPOWER)) return + if(..()) + return TRUE + var/balance=0 if(user.mind) if(user.mind.initial_account) diff --git a/code/game/machinery/computer/syndie_cargo.dm b/code/game/machinery/computer/syndie_cargo.dm index 28990d4c3a9..1c5f967f282 100644 --- a/code/game/machinery/computer/syndie_cargo.dm +++ b/code/game/machinery/computer/syndie_cargo.dm @@ -506,6 +506,9 @@ GLOBAL_LIST_INIT(data_storages, list()) //list of all cargo console data storage /obj/machinery/computer/syndie_supplycomp/attack_hand(var/mob/user as mob) + if(..()) + return TRUE + if(!allowed(user) && !isobserver(user)) to_chat(user, span_warning("Access denied.")) playsound(src, pick('sound/machines/button.ogg', 'sound/machines/button_alternate.ogg', 'sound/machines/button_meloboom.ogg'), 20) diff --git a/code/game/machinery/cryo.dm b/code/game/machinery/cryo.dm index 925a8ff89b5..f5c148e8dc0 100644 --- a/code/game/machinery/cryo.dm +++ b/code/game/machinery/cryo.dm @@ -196,6 +196,9 @@ ui_interact(user) /obj/machinery/atmospherics/unary/cryo_cell/attack_hand(mob/user) + if(..()) + return TRUE + if(user == occupant) return diff --git a/code/game/machinery/machinery.dm b/code/game/machinery/machinery.dm index 8910f71684c..a9fcf27dd2c 100644 --- a/code/game/machinery/machinery.dm +++ b/code/game/machinery/machinery.dm @@ -282,11 +282,9 @@ Class Procs: if(ishuman(user)) var/mob/living/carbon/human/H = user - if(H.getBrainLoss() >= 60) + if(!H.check_brain_for_complex_interactions()) visible_message(span_warning("[H] stares cluelessly at [src] and drools.")) - return TRUE - else if(prob(H.getBrainLoss())) - to_chat(user, span_warning("You momentarily forget how to use [src].")) + to_chat(H, span_warning("You momentarily forget how to use [src].")) return TRUE if(panel_open) diff --git a/code/game/machinery/syndicatebomb.dm b/code/game/machinery/syndicatebomb.dm index 75a2d867602..24a33fc43b0 100644 --- a/code/game/machinery/syndicatebomb.dm +++ b/code/game/machinery/syndicatebomb.dm @@ -204,6 +204,9 @@ interact(user) /obj/machinery/syndicatebomb/attack_hand(mob/user) + if(..()) + return TRUE + add_fingerprint(user) interact(user) diff --git a/code/game/machinery/teleporter.dm b/code/game/machinery/teleporter.dm index 58031f9fc9b..a9402b0cba8 100644 --- a/code/game/machinery/teleporter.dm +++ b/code/game/machinery/teleporter.dm @@ -71,6 +71,8 @@ attack_hand(user) /obj/machinery/computer/teleporter/attack_hand(mob/user) + if(..()) + return TRUE add_fingerprint(user) ui_interact(user) diff --git a/code/game/machinery/turret_control.dm b/code/game/machinery/turret_control.dm index 6b615922bff..929c4bc02bf 100644 --- a/code/game/machinery/turret_control.dm +++ b/code/game/machinery/turret_control.dm @@ -141,6 +141,8 @@ ui_interact(user) /obj/machinery/turretid/attack_hand(mob/user as mob) + if(..()) + return TRUE ui_interact(user) /obj/machinery/turretid/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = TRUE, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state) diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm index f7fa8938ecd..af4ec6e9e80 100644 --- a/code/game/machinery/vending.dm +++ b/code/game/machinery/vending.dm @@ -454,6 +454,9 @@ if(stat & (BROKEN|NOPOWER)) return + if(..()) + return TRUE + if(src.seconds_electrified != 0) if(src.shock(user, 100)) add_fingerprint(user) diff --git a/code/game/mecha/mecha_control_console.dm b/code/game/mecha/mecha_control_console.dm index 7a78c035c6d..ee3a3aa15ad 100644 --- a/code/game/mecha/mecha_control_console.dm +++ b/code/game/mecha/mecha_control_console.dm @@ -14,6 +14,9 @@ return attack_hand(user) /obj/machinery/computer/mecha/attack_hand(mob/user) + if(..()) + return TRUE + add_fingerprint(user) ui_interact(user) diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm index 009da06d235..ab8ab9a6ddc 100644 --- a/code/game/objects/items/devices/scanners.dm +++ b/code/game/objects/items/devices/scanners.dm @@ -477,12 +477,12 @@ REAGENT SCANNER . += " [R.name] Стадия: [R.addiction_stage]/5" else . += "Зависимости от реагентов не обнаружены." - for(var/thing in H.viruses) + for(var/thing in H.diseases) var/datum/disease/D = thing if(!(D.visibility_flags & HIDDEN_SCANNER)) . += "Внимание: обнаружен [D.form]" . += " Название: [D.name]" - . += " Тип: [D.spread_text]" + . += " Тип: [D.additional_info]" . += " Стадия: [D.stage]/[D.max_stages]" . += " Лечение: [D.cure_text]" if(H.undergoing_cardiac_arrest()) @@ -903,9 +903,9 @@ REAGENT SCANNER dat += "[target.health > 50 ? "" : ""]\tHealth %: [target.health], ([t1])
" var/found_disease = FALSE - for(var/thing in target.viruses) + for(var/thing in target.diseases) var/datum/disease/D = thing - if(D.visibility_flags) //If any visibility flags are on. + if(D.visibility_flags & HIDDEN_SCANNER) continue found_disease = TRUE break diff --git a/code/game/objects/items/stacks/nanopaste.dm b/code/game/objects/items/stacks/nanopaste.dm index 0ad9af40b5a..b270d14cd0b 100644 --- a/code/game/objects/items/stacks/nanopaste.dm +++ b/code/game/objects/items/stacks/nanopaste.dm @@ -26,8 +26,9 @@ return 0 if(istype(M,/mob/living/silicon/robot)) //Repairing cyborgs var/mob/living/silicon/robot/R = M - if(R.getBruteLoss() || R.getFireLoss() ) + if(R.getBruteLoss() || R.getFireLoss() || R.diseases?.len) R.heal_overall_damage(15, 15) + R.CureAllDiseases(FALSE) use(1) user.visible_message("\The [user] applied some [src] at [R]'s damaged areas.",\ "You apply some [src] at [R]'s damaged areas.") @@ -39,6 +40,11 @@ var/obj/item/organ/external/S = H.get_organ(user.zone_selected) if(S && S.is_robotic()) + if(ismachineperson(M) && M.diseases?.len) + use(1) + M.CureAllDiseases() + user.visible_message("\The [user] applies some nanite paste at \the [M] to fix problems.") + return if(S.get_damage()) use(1) var/remheal = 15 diff --git a/code/game/objects/items/weapons/storage/artistic_toolbox.dm b/code/game/objects/items/weapons/storage/artistic_toolbox.dm index c41a3839009..65883392d66 100644 --- a/code/game/objects/items/weapons/storage/artistic_toolbox.dm +++ b/code/game/objects/items/weapons/storage/artistic_toolbox.dm @@ -22,7 +22,7 @@ var/activated = FALSE /obj/item/storage/toolbox/green/memetic/ui_action_click(mob/user) - if(user.HasDisease(new /datum/disease/memetic_madness)) + if(user.HasDisease(/datum/disease/memetic_madness)) var/obj/item/storage/toolbox/green/memetic/M = user.get_active_hand() if(istype(M)) to_chat(user, "His Grace [flags & NODROP ? "releases from" : "binds to"] your hand!") @@ -41,10 +41,11 @@ ..() /obj/item/storage/toolbox/green/memetic/proc/link_user(mob/living/carbon/user) - if(ishuman(user) && !user.HasDisease(new /datum/disease/memetic_madness)) + if(ishuman(user) && !user.HasDisease(/datum/disease/memetic_madness)) activated = TRUE - user.ForceContractDisease(new /datum/disease/memetic_madness) - for(var/datum/disease/memetic_madness/DD in user.viruses) + var/datum/disease/memetic_madness/D = new + D.Contract(user) + for(var/datum/disease/memetic_madness/DD in user.diseases) DD.progenitor = src servantlinks.Add(DD) break @@ -74,7 +75,7 @@ if(istype(I, /obj/item/grab)) var/obj/item/grab/G = I var/mob/living/victim = G.affecting - if(!user.HasDisease(new /datum/disease/memetic_madness)) + if(!user.HasDisease(/datum/disease/memetic_madness)) to_chat(user, "You can't seem to find the latch to open this.") return if(!victim) @@ -147,13 +148,10 @@ name = "Memetic Kill Agent" max_stages = 4 stage_prob = 8 - spread_text = "Non-Contagious" - spread_flags = SPECIAL cure_text = "Unknown" - viable_mobtypes = list(/mob/living/carbon/human) severity = BIOHAZARD - disease_flags = CAN_CARRY - spread_flags = NON_CONTAGIOUS + curable = FALSE + can_immunity = FALSE virus_heal_resistant = TRUE var/obj/item/storage/toolbox/green/memetic/progenitor = null diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index 96125bcde78..bd8be189201 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -879,9 +879,10 @@ GLOBAL_LIST_INIT(admin_verbs_ticket, list( set category = "Event" set name = "Give Disease" set desc = "Gives a Disease to a mob." - var/datum/disease/D = input("Choose the disease to give to that guy", "ACHOO") as null|anything in GLOB.diseases - if(!D) return - T.ForceContractDisease(new D) + var/choosen_disease = input("Choose the disease to give to that guy", "ACHOO") as null|anything in GLOB.diseases + if(!choosen_disease) return + var/datum/disease/D = new choosen_disease() + D.Contract(T) SSblackbox.record_feedback("tally", "admin_verb", 1, "Give Disease") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! log_and_message_admins("gave [key_name_log(T)] the disease [D].") diff --git a/code/modules/antagonists/changeling/powers/panacea.dm b/code/modules/antagonists/changeling/powers/panacea.dm index 621cae81add..9bce2614773 100644 --- a/code/modules/antagonists/changeling/powers/panacea.dm +++ b/code/modules/antagonists/changeling/powers/panacea.dm @@ -34,7 +34,7 @@ user.reagents.add_reagent("mutadone", 2) user.apply_status_effect(STATUS_EFFECT_PANACEA) - for(var/datum/disease/virus in user.viruses) + for(var/datum/disease/virus in user.diseases) if(virus.severity == NONTHREAT) continue virus.cure() diff --git a/code/modules/antagonists/goon_vampire/goon_vampire_powers.dm b/code/modules/antagonists/goon_vampire/goon_vampire_powers.dm index 60f8ba25369..6a716392112 100644 --- a/code/modules/antagonists/goon_vampire/goon_vampire_powers.dm +++ b/code/modules/antagonists/goon_vampire/goon_vampire_powers.dm @@ -220,8 +220,8 @@ to_chat(user, span_warning("Вам кажется, что заражающее касание не подействовало на [target].")) return - var/datum/disease/virus = new /datum/disease/vampire - target.ForceContractDisease(virus) + var/datum/disease/vampire/virus = new + virus.Contract(target) /obj/effect/proc_holder/spell/goon_vampire/glare diff --git a/code/modules/antagonists/space_ninja/suit/ninja_equipment_actions/ninja_status_read.dm b/code/modules/antagonists/space_ninja/suit/ninja_equipment_actions/ninja_status_read.dm index 79af8d00499..d59d4978470 100644 --- a/code/modules/antagonists/space_ninja/suit/ninja_equipment_actions/ninja_status_read.dm +++ b/code/modules/antagonists/space_ninja/suit/ninja_equipment_actions/ninja_status_read.dm @@ -33,10 +33,10 @@ info_list += "[span_info("Температура тела: [ninja.bodytemperature-T0C] градусов C ([ninja.bodytemperature*1.8-459.67] градусов F)")]\n" //Diseases - if(length(ninja.viruses)) + if(length(ninja.diseases)) info_list += "[span_info("Вирусы:")]\n" - for(var/datum/disease/ninja_disease in ninja.viruses) - info_list += "[span_info("* [ninja_disease.name], Тип: [ninja_disease.spread_text], Стадия: [ninja_disease.stage]/[ninja_disease.max_stages], Возможное лекарство: [ninja_disease.cure_text]")]\n" + for(var/datum/disease/ninja_disease in ninja.diseases) + info_list += "[span_info("* [ninja_disease.name], Тип: [ninja_disease.additional_info], Стадия: [ninja_disease.stage]/[ninja_disease.max_stages], Возможное лекарство: [ninja_disease.cure_text]")]\n" //Реагенты if(ninja.reagents.reagent_list.len) info_list += "[span_info("Обнаружены реагенты:")]\n" diff --git a/code/modules/antagonists/vampire/vampire_powers/bestia_powers.dm b/code/modules/antagonists/vampire/vampire_powers/bestia_powers.dm index a9ec0f47748..1f7ff259c7c 100644 --- a/code/modules/antagonists/vampire/vampire_powers/bestia_powers.dm +++ b/code/modules/antagonists/vampire/vampire_powers/bestia_powers.dm @@ -684,7 +684,8 @@ GLOBAL_LIST_INIT(vampire_dissect_organs, list( if(prob(10 + vampire.get_trophies("livers") * 3)) new /obj/effect/temp_visual/cult/sparks(get_turf(victim)) - victim.ForceContractDisease(new /datum/disease/vampire) // grave fever + var/datum/disease/vampire/D = new + D.Contract(victim) // grave fever /*======================================================================================================================================*\ @@ -1575,7 +1576,7 @@ GLOBAL_LIST_INIT(vampire_dissect_organs, list( // cures heart attack, heart failure and shock human_vampire.set_heartattack(FALSE) - for(var/datum/disease/critical/crit_virus in human_vampire.viruses) + for(var/datum/disease/critical/crit_virus in human_vampire.diseases) crit_virus.cure() // a little bit of nutrition for mr. vampire @@ -1687,10 +1688,10 @@ GLOBAL_LIST_INIT(vampire_dissect_organs, list( else organ.status = NONE - for(var/datum/disease/virus in human_vampire.viruses) + for(var/datum/disease/virus in human_vampire.diseases) if(virus.severity == NONTHREAT) continue - virus.cure(resistance = FALSE) + virus.cure(need_immunity = FALSE) var/mob/living/simple_animal/borer/borer = human_vampire.has_brain_worms() if(borer) diff --git a/code/modules/arcade/mob_hunt/battle_computer.dm b/code/modules/arcade/mob_hunt/battle_computer.dm index ba4f5899493..32c0cb292af 100644 --- a/code/modules/arcade/mob_hunt/battle_computer.dm +++ b/code/modules/arcade/mob_hunt/battle_computer.dm @@ -107,6 +107,9 @@ avatar.update_self() /obj/machinery/computer/mob_battle_terminal/attack_hand(mob/user) + if(..()) + return TRUE + add_fingerprint(user) interact(user) diff --git a/code/modules/awaymissions/corpse.dm b/code/modules/awaymissions/corpse.dm index f0b2aaec750..a53d5a788c7 100644 --- a/code/modules/awaymissions/corpse.dm +++ b/code/modules/awaymissions/corpse.dm @@ -168,7 +168,8 @@ if(faction) M.faction = list(faction) if(disease) - M.ForceContractDisease(new disease) + var/datum/disease/D = new disease + D.Contract(M) M.adjustOxyLoss(oxy_damage) M.adjustBruteLoss(brute_damage) M.adjustFireLoss(burn_damage) @@ -450,13 +451,13 @@ outfit = /datum/outfit/job/assistant /obj/effect/mob_spawn/human/corpse/assistant/beesease_infection - disease = /datum/disease/beesease + disease = /datum/disease/virus/beesease /obj/effect/mob_spawn/human/corpse/assistant/brainrot_infection - disease = /datum/disease/brainrot + disease = /datum/disease/virus/brainrot /obj/effect/mob_spawn/human/corpse/assistant/spanishflu_infection - disease = /datum/disease/fluspanish + disease = /datum/disease/virus/fluspanish /obj/effect/mob_spawn/human/cook name = "Cook" diff --git a/code/modules/awaymissions/mission_code/academy.dm b/code/modules/awaymissions/mission_code/academy.dm index 18294bed86e..3d1e2c17e37 100644 --- a/code/modules/awaymissions/mission_code/academy.dm +++ b/code/modules/awaymissions/mission_code/academy.dm @@ -142,9 +142,9 @@ explosion(get_turf(user),-1,0,2, flame_range = 2, cause = src) if(9) //Cold - var/datum/disease/D = new /datum/disease/cold T.visible_message("[user] looks a little under the weather!") - user.ForceContractDisease(D) + var/datum/disease/virus/cold/D = new + D.Contract(user) if(10) //Nothing T.visible_message("Nothing seems to happen.") diff --git a/code/modules/clothing/suits/labcoat.dm b/code/modules/clothing/suits/labcoat.dm index ab1f4b348a8..c65289c4ac8 100644 --- a/code/modules/clothing/suits/labcoat.dm +++ b/code/modules/clothing/suits/labcoat.dm @@ -5,6 +5,7 @@ item_state = "labcoat_open" ignore_suitadjust = 0 suit_adjusted = 1 + permeability_coefficient = 0.5 blood_overlay_type = "coat" body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS allowed = list(/obj/item/analyzer,/obj/item/stack/medical,/obj/item/dnainjector,/obj/item/reagent_containers/dropper,/obj/item/reagent_containers/syringe,/obj/item/reagent_containers/hypospray,/obj/item/reagent_containers/applicator,/obj/item/healthanalyzer,/obj/item/flashlight/pen,/obj/item/reagent_containers/glass/bottle,/obj/item/reagent_containers/glass/beaker,/obj/item/reagent_containers/food/pill,/obj/item/storage/pill_bottle,/obj/item/paper,/obj/item/rad_laser) diff --git a/code/modules/economy/Accounts_DB.dm b/code/modules/economy/Accounts_DB.dm index ece4aadddb5..42a6694133c 100644 --- a/code/modules/economy/Accounts_DB.dm +++ b/code/modules/economy/Accounts_DB.dm @@ -57,6 +57,9 @@ GLOBAL_VAR(current_date_string) return ..() /obj/machinery/computer/account_database/attack_hand(mob/user) + if(..()) + return TRUE + add_fingerprint(user) ui_interact(user) diff --git a/code/modules/events/disease_outbreak.dm b/code/modules/events/disease_outbreak.dm index 880b832567b..ddfa7e05d31 100644 --- a/code/modules/events/disease_outbreak.dm +++ b/code/modules/events/disease_outbreak.dm @@ -1,27 +1,35 @@ /datum/event/disease_outbreak - announceWhen = 15 - /// The type of disease that patient zero will be infected with. - var/datum/disease/D + announceWhen = 150 + /// The type of virus that patient zero will be infected with. + var/datum/disease/virus/D /// The initial target of the disease. var/mob/living/carbon/human/patient_zero /datum/event/disease_outbreak/setup() - announceWhen = rand(15, 30) - if(prob(40)) - var/virus_type = pick(/datum/disease/advance/preset/flu, /datum/disease/advance/preset/cold, \ - /datum/disease/brainrot, /datum/disease/magnitis, /datum/disease/beesease, /datum/disease/anxiety, \ - /datum/disease/fake_gbs, /datum/disease/fluspanish, /datum/disease/pierrot_throat, /datum/disease/lycan, \ - /datum/disease/loyalty) - D = new virus_type() + announceWhen = rand(150, 300) + var/virus_type = pick( + 5; /datum/disease/virus/advance, + 1; /datum/disease/virus/anxiety, + 1; /datum/disease/virus/beesease, + 1; /datum/disease/virus/brainrot, + 1; /datum/disease/virus/cold, + 1; /datum/disease/virus/flu, + 1; /datum/disease/virus/fluspanish, + 1; /datum/disease/virus/fake_gbs, + 1; /datum/disease/virus/loyalty, + 1; /datum/disease/virus/lycan, + 1; /datum/disease/virus/magnitis, + 1; /datum/disease/virus/pierrot_throat, + 1; /datum/disease/virus/pierrot_throat/advanced, + 1; /datum/disease/virus/tuberculosis, + 1; /datum/disease/virus/wizarditis + ) + if(virus_type == /datum/disease/virus/advance) + //creates only contagious viruses, that are always visible in Pandemic + D = CreateRandomVirus(count_of_symptoms = rand(4, 6), resistance = rand(0,11), stealth = pick(0,0,1,1,2), + stage_rate = rand(-11,5), transmittable = rand(5,9), severity = rand(0,5)) else - var/datum/disease/advance/A = new /datum/disease/advance - A.name = capitalize(pick(GLOB.adjectives)) + " " + capitalize(pick(GLOB.nouns + GLOB.verbs)) // random silly name - A.symptoms = A.GenerateSymptoms(1,9,6) - A.Refresh() - A.AssignProperties(list("resistance" = rand(0,11), "stealth" = rand(0,2), "stage_rate" = rand(0,5), "transmittable" = rand(0,5), "severity" = rand(0,10))) - D = A - - D.carrier = TRUE + D = new virus_type() /datum/event/disease_outbreak/announce() GLOB.event_announcement.Announce("Вспышка вирусной угрозы 7-го уровня зафиксирована на борту станции [station_name()]. Всему персоналу надлежит сдержать ее распространение.", "ВНИМАНИЕ: БИОЛОГИЧЕСКАЯ УГРОЗА.", new_sound = 'sound/AI/outbreak7.ogg') @@ -33,15 +41,17 @@ for(var/mob/living/carbon/human/H in shuffle(GLOB.alive_mob_list)) if(!H.client) continue - if(issmall(H)) //don't infect monkies; that's a waste - continue var/turf/T = get_turf(H) if(!T) continue if(!is_station_level(T.z)) continue - if(!H.ForceContractDisease(D)) + if(istype(D, /datum/disease/virus/advance)) + var/datum/disease/virus/advance/old_virus = locate() in H.diseases + if(old_virus) + old_virus.cure(need_immunity = FALSE) + if(!D.Contract(H, is_carrier = TRUE)) continue patient_zero = H break diff --git a/code/modules/events/spontaneous_appendicitis.dm b/code/modules/events/spontaneous_appendicitis.dm index 53923f4d124..e7033c1fa7a 100644 --- a/code/modules/events/spontaneous_appendicitis.dm +++ b/code/modules/events/spontaneous_appendicitis.dm @@ -7,12 +7,12 @@ if(!H.get_int_organ(/obj/item/organ/internal/appendix)) continue var/foundAlready = FALSE //don't infect someone that already has appendicitis - for(var/datum/disease/appendicitis/A in H.viruses) + for(var/datum/disease/appendicitis/A in H.diseases) foundAlready = TRUE break if(H.stat == DEAD || foundAlready) continue - var/datum/disease/D = new /datum/disease/appendicitis - H.ForceContractDisease(D) + var/datum/disease/appendicitis/D = new + D.Contract(H) break diff --git a/code/modules/food_and_drinks/drinks/bottler/bottler.dm b/code/modules/food_and_drinks/drinks/bottler/bottler.dm index 6c1964b8994..ce40ea54e9d 100644 --- a/code/modules/food_and_drinks/drinks/bottler/bottler.dm +++ b/code/modules/food_and_drinks/drinks/bottler/bottler.dm @@ -306,6 +306,10 @@ /obj/machinery/bottler/attack_hand(mob/user) if(stat & BROKEN) return + + if(..()) + return TRUE + add_fingerprint(user) interact(user) diff --git a/code/modules/food_and_drinks/kitchen_machinery/juicer.dm b/code/modules/food_and_drinks/kitchen_machinery/juicer.dm index a698c6679b8..adfed758c15 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/juicer.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/juicer.dm @@ -69,6 +69,9 @@ return 0 /obj/machinery/juicer/attack_hand(mob/user) + if(..()) + return TRUE + add_fingerprint(user) user.set_machine(src) interact(user) diff --git a/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm b/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm index ab39dcb7f44..934bec6307f 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm @@ -597,7 +597,9 @@ spawn_meds = list( /obj/item/reagent_containers/syringe/antiviral = 4, /obj/item/reagent_containers/glass/bottle/cold = 1, - /obj/item/reagent_containers/glass/bottle/flu_virion = 1, + /obj/item/reagent_containers/glass/bottle/flu = 1, + /obj/item/reagent_containers/glass/bottle/sneezing = 1, + /obj/item/reagent_containers/glass/bottle/cough = 1, /obj/item/reagent_containers/glass/bottle/mutagen = 1, /obj/item/reagent_containers/glass/bottle/plasma = 1, /obj/item/reagent_containers/glass/bottle/diphenhydramine = 1 @@ -621,7 +623,9 @@ spawn_meds = list( /obj/item/reagent_containers/syringe/antiviral = 4, /obj/item/reagent_containers/glass/bottle/cold = 1, - /obj/item/reagent_containers/glass/bottle/flu_virion = 1, + /obj/item/reagent_containers/glass/bottle/flu = 1, + /obj/item/reagent_containers/glass/bottle/sneezing = 1, + /obj/item/reagent_containers/glass/bottle/cough = 1, /obj/item/reagent_containers/glass/bottle/mutagen = 1, /obj/item/reagent_containers/glass/bottle/plasma = 1, /obj/item/reagent_containers/glass/bottle/reagent/synaptizine = 1, diff --git a/code/modules/hydroponics/seed_extractor.dm b/code/modules/hydroponics/seed_extractor.dm index 3dcad99d53f..9f0c5a9cb35 100644 --- a/code/modules/hydroponics/seed_extractor.dm +++ b/code/modules/hydroponics/seed_extractor.dm @@ -137,6 +137,8 @@ src.amount = am /obj/machinery/seed_extractor/attack_hand(mob/user) + if(..()) + return TRUE interact(user) /obj/machinery/seed_extractor/attack_ghost(mob/user) diff --git a/code/modules/mining/laborcamp/laborstacker.dm b/code/modules/mining/laborcamp/laborstacker.dm index 09f09929944..a489c947a6d 100644 --- a/code/modules/mining/laborcamp/laborstacker.dm +++ b/code/modules/mining/laborcamp/laborstacker.dm @@ -51,6 +51,9 @@ return ..() /obj/machinery/mineral/labor_claim_console/attack_hand(mob/user) + if(..()) + return TRUE + add_fingerprint(user) ui_interact(user) diff --git a/code/modules/mining/lavaland/loot/ashdragon_loot.dm b/code/modules/mining/lavaland/loot/ashdragon_loot.dm index 415181d4222..7b0810c814e 100644 --- a/code/modules/mining/lavaland/loot/ashdragon_loot.dm +++ b/code/modules/mining/lavaland/loot/ashdragon_loot.dm @@ -161,15 +161,15 @@ playsound(user.loc,'sound/items/drink.ogg', rand(10,50), 1) qdel(src) -/datum/disease/transformation/dragon +/datum/disease/virus/transformation/dragon name = "dragon transformation" - cure_text = "nothing" + cure_text = "Nothing" cures = list("adminordrazine") agent = "dragon's blood" desc = "What do dragons have to do with Space Station 13?" stage_prob = 20 severity = BIOHAZARD - visibility_flags = 0 + visibility_flags = VISIBLE stage1 = list("Your bones ache.") stage2 = list("Your skin feels scaley.") stage3 = list("You have an overwhelming urge to terrorize some peasants.", "Your teeth feel sharper.") diff --git a/code/modules/mining/machine_stacking.dm b/code/modules/mining/machine_stacking.dm index f7e84abece4..6d3b6965764 100644 --- a/code/modules/mining/machine_stacking.dm +++ b/code/modules/mining/machine_stacking.dm @@ -19,6 +19,9 @@ qdel(src) /obj/machinery/mineral/stacking_unit_console/attack_hand(mob/user) + if(..()) + return TRUE + add_fingerprint(user) var/obj/item/stack/sheet/s diff --git a/code/modules/mob/living/carbon/carbon_defense.dm b/code/modules/mob/living/carbon/carbon_defense.dm index 341585cdadf..cfd3bc0b59f 100644 --- a/code/modules/mob/living/carbon/carbon_defense.dm +++ b/code/modules/mob/living/carbon/carbon_defense.dm @@ -48,15 +48,13 @@ if(!iscarbon(user)) return - for(var/thing in viruses) - var/datum/disease/D = thing - if(D.IsSpreadByTouch()) - user.ContractDisease(D) - - for(var/thing in user.viruses) - var/datum/disease/D = thing - if(D.IsSpreadByTouch()) - ContractDisease(D) + for(var/datum/disease/virus/V in diseases) + if(V.spread_flags & CONTACT) + V.Contract(user, act_type = CONTACT, need_protection_check = TRUE, zone = user.hand ? "l_hand" : "r_hand") + + for(var/datum/disease/virus/V in user.diseases) + if(V.spread_flags & CONTACT) + V.Contract(src, act_type = CONTACT, need_protection_check = TRUE, zone = user.zone_selected) if(lying && surgeries.len) if(user.a_intent == INTENT_HELP) diff --git a/code/modules/mob/living/carbon/human/human_damage.dm b/code/modules/mob/living/carbon/human/human_damage.dm index 7edf501a76e..6c5ee24dfae 100644 --- a/code/modules/mob/living/carbon/human/human_damage.dm +++ b/code/modules/mob/living/carbon/human/human_damage.dm @@ -108,6 +108,16 @@ else return 0 +/mob/living/carbon/human/proc/check_brain_for_complex_interactions() + if(getBrainLoss() >= 60 || prob(getBrainLoss())) + return FALSE + var/datum/disease/virus/advance/A = locate(/datum/disease/virus/advance) in diseases + if(istype(A)) + var/datum/symptom/headache/S = locate(/datum/symptom/headache) in A.symptoms + if(istype(S)) + return FALSE + return TRUE + //These procs fetch a cumulative total damage from all organs /mob/living/carbon/human/getBruteLoss() if(status_flags & GODMODE) diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 333a5d363bd..48e7fbbfd80 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -380,6 +380,9 @@ if(!istype(loc, /obj/machinery/atmospherics/unary/cryo_cell)) var/mult = dna.species.coldmod if(mult>0) + if(bodytemperature < dna.species.cold_level_2 && prob(1)) + var/datum/disease/virus/cold/D = new + D.Contract(src) if(bodytemperature >= dna.species.cold_level_2 && bodytemperature <= dna.species.cold_level_1) throw_alert("temp", /obj/screen/alert/cold, 1) take_overall_damage(burn=mult*COLD_DAMAGE_LEVEL_1, used_weapon = "Low Body Temperature") @@ -679,8 +682,8 @@ overeatduration -= 2 if(!ismachineperson(src) && !isLivingSSD(src) && nutrition < NUTRITION_LEVEL_HYPOGLYCEMIA) //Gosh damn snowflakey IPCs - var/datum/disease/D = new /datum/disease/critical/hypoglycemia - ForceContractDisease(D) + var/datum/disease/critical/hypoglycemia/D = new + D.Contract(src) //metabolism change if(nutrition > NUTRITION_LEVEL_FAT) @@ -748,24 +751,24 @@ var/mob/living/carbon/human/H = src H.set_heartattack(TRUE) if(prob(health * -0.2)) - var/datum/disease/D = new /datum/disease/critical/heart_failure - ForceContractDisease(D) + var/datum/disease/critical/heart_failure/D = new + D.Contract(src) Paralyse(10 SECONDS) if(-99 to -80) adjustOxyLoss(1) if(prob(4)) to_chat(src, "Your chest hurts...") Paralyse(4 SECONDS) - var/datum/disease/D = new /datum/disease/critical/heart_failure - ForceContractDisease(D) + var/datum/disease/critical/heart_failure/D = new + D.Contract(src) if(-79 to -50) adjustOxyLoss(1) if(prob(10)) - var/datum/disease/D = new /datum/disease/critical/shock - ForceContractDisease(D) + var/datum/disease/critical/shock/D = new + D.Contract(src) if(prob(health * -0.08)) - var/datum/disease/D = new /datum/disease/critical/heart_failure - ForceContractDisease(D) + var/datum/disease/critical/heart_failure/D = new + D.Contract(src) if(prob(6)) to_chat(src, "You feel [pick("horrible pain", "awful", "like shit", "absolutely awful", "like death", "like you are dying", "nothing", "warm", "sweaty", "tingly", "really, really bad", "horrible")]!") Weaken(6 SECONDS) @@ -774,8 +777,8 @@ if(-49 to 0) adjustOxyLoss(1) if(prob(3)) - var/datum/disease/D = new /datum/disease/critical/shock - ForceContractDisease(D) + var/datum/disease/critical/shock/D = new + D.Contract(src) if(prob(5)) to_chat(src, "You feel [pick("terrible", "awful", "like shit", "sick", "numb", "cold", "sweaty", "tingly", "horrible")]!") Weaken(6 SECONDS) diff --git a/code/modules/mob/living/carbon/human/species/_species.dm b/code/modules/mob/living/carbon/human/species/_species.dm index 6ed1986bea1..6e079b0c07a 100644 --- a/code/modules/mob/living/carbon/human/species/_species.dm +++ b/code/modules/mob/living/carbon/human/species/_species.dm @@ -540,6 +540,25 @@ var/obj/item/organ/external/affecting = target.get_organ(ran_zone(user.zone_selected)) var/armor_block = target.run_armor_check(affecting, "melee") + // Contract diseases + + //user beats target, check target's defense in selected zone + for(var/datum/disease/virus/V in user.diseases) + var/is_infected = FALSE + if(attack.is_bite && (V.spread_flags & BITES)) + is_infected = V.Contract(target, act_type = BITES|CONTACT, need_protection_check = TRUE, zone = affecting) + if(!is_infected && (V.spread_flags & CONTACT)) + V.Contract(target, act_type = CONTACT, need_protection_check = TRUE, zone = affecting) + + //check user's defense in attacking zone (hands or mouth) + for(var/datum/disease/virus/V in target.diseases) + var/is_infected = FALSE + if(attack.is_bite && (V.spread_flags > NON_CONTAGIOUS)) + //infected blood contacts with mouth, ignore protection & spread_flags + is_infected = V.Contract(user, need_protection_check = FALSE) + if(!is_infected && (V.spread_flags & CONTACT)) + V.Contract(user, act_type = CONTACT, need_protection_check = TRUE, zone = user.hand ? "l_hand" : "r_hand") + playsound(target.loc, attack.attack_sound, 25, 1, -1) target.visible_message("[user.declent_ru(NOMINATIVE)] [attack_species] [target.declent_ru(ACCUSATIVE)]!") @@ -684,6 +703,7 @@ var/sharp = FALSE var/animation_type = ATTACK_EFFECT_PUNCH var/harmless = FALSE //if set to true, attacks won't be admin logged and punches will "hit" for no damage + var/is_bite = FALSE /datum/unarmed_attack/diona attack_verb = list("охлестал", "тяжело стукнул", "лозой хлестанул", "ветвью щелкнул") @@ -701,6 +721,7 @@ attack_sound = 'sound/weapons/bite.ogg' sharp = TRUE animation_type = ATTACK_EFFECT_BITE + is_bite = TRUE /datum/unarmed_attack/claws/armalis attack_verb = list("хлестает", "хлестанул", "искромсал", "разорвал") //армалисами почти никто не пользуется. Зачем вносить пол вырезаной расе которой никогда не будет в игре? diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm index 7f38a0de6fb..752607c835a 100644 --- a/code/modules/mob/living/carbon/life.dm +++ b/code/modules/mob/living/carbon/life.dm @@ -207,15 +207,6 @@ var/obj/item/organ/internal/O = thing O.on_life() -/mob/living/carbon/handle_diseases() - for(var/thing in viruses) - var/datum/disease/D = thing - if(prob(D.infectivity)) - D.spread() - - if(stat != DEAD) - D.stage_act() - //remember to remove the "proc" of the child procs of these. /mob/living/carbon/proc/handle_blood() return diff --git a/code/modules/mob/living/life.dm b/code/modules/mob/living/life.dm index 9125fd67487..e5a658c4b04 100644 --- a/code/modules/mob/living/life.dm +++ b/code/modules/mob/living/life.dm @@ -42,7 +42,7 @@ //Random events (vomiting etc) handle_random_events() - if(LAZYLEN(viruses)) + if(LAZYLEN(diseases)) handle_diseases() if(QDELETED(src)) // diseases can qdel the mob via transformations @@ -111,7 +111,9 @@ return /mob/living/proc/handle_diseases() - return + for(var/thing in diseases) + var/datum/disease/D = thing + D.stage_act() /mob/living/proc/handle_random_events() return diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 8fc051771bd..1d3ada3cd20 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -543,6 +543,7 @@ SetDeaf(0) heal_overall_damage(1000, 1000) ExtinguishMob() + CureAllDiseases(FALSE) fire_stacks = 0 on_fire = 0 suiciding = 0 @@ -553,9 +554,9 @@ var/mob/living/carbon/C = src C.uncuff() - for(var/thing in C.viruses) + for(var/thing in C.diseases) var/datum/disease/D = thing - D.cure(0) + D.cure(need_immunity = FALSE) // restore all of the human's blood and reset their shock stage if(ishuman(src)) diff --git a/code/modules/mob/living/simple_animal/bot/medbot.dm b/code/modules/mob/living/simple_animal/bot/medbot.dm index 8f34b956cec..676fc3368c2 100644 --- a/code/modules/mob/living/simple_animal/bot/medbot.dm +++ b/code/modules/mob/living/simple_animal/bot/medbot.dm @@ -399,9 +399,9 @@ if(!treat_virus) return - for(var/datum/disease/D as anything in C.viruses) - if(!(D.visibility_flags & HIDDEN_SCANNER && D.visibility_flags & HIDDEN_PANDEMIC) && D.severity != NONTHREAT && (D.stage > 1 || D.spread_flags & AIRBORNE)) - return TRUE //Medbots see viruses that aren't fully hidden and have developed enough/are airborne, ignoring safe viruses + for(var/datum/disease/D as anything in C.diseases) + if(!(D.visibility_flags & HIDDEN_HUD) && D.discovered && D.severity != NONTHREAT) + return TRUE //Medbots see viruses if they displayed on HUD, ignoring safe viruses /mob/living/simple_animal/bot/medbot/proc/select_medication(mob/living/carbon/C, beaker_injection) diff --git a/code/modules/mob/living/simple_animal/friendly/dog.dm b/code/modules/mob/living/simple_animal/friendly/dog.dm index 94f48b21b61..9a70d2fca61 100644 --- a/code/modules/mob/living/simple_animal/friendly/dog.dm +++ b/code/modules/mob/living/simple_animal/friendly/dog.dm @@ -815,6 +815,16 @@ if(target) shootAt(target) +/mob/living/simple_animal/pet/dog/corgi/borgi/attackby(obj/item/I, mob/living/user) + if(istype(I, /obj/item/stack/nanopaste)) + var/obj/item/stack/nanopaste/N = I + N.use(1) + if(diseases?.len) + CureAllDiseases() + visible_message("[name] looks happy! ") + chasetail() + return ..() + /mob/living/simple_animal/pet/dog/corgi/borgi/death(gibbed) // Only execute the below if we successfully died . = ..(gibbed) diff --git a/code/modules/mob/living/simple_animal/hostile/bees.dm b/code/modules/mob/living/simple_animal/hostile/bees.dm index 934040052b3..1c275670e2f 100644 --- a/code/modules/mob/living/simple_animal/hostile/bees.dm +++ b/code/modules/mob/living/simple_animal/hostile/bees.dm @@ -170,7 +170,7 @@ beegent.reaction_mob(L, REAGENT_INGEST) L.reagents.add_reagent(beegent.id, rand(1, 5)) else - L.reagents.add_reagent("spidertoxin", 5) + L.reagents.add_reagent("beetoxin", 5) /mob/living/simple_animal/hostile/poison/bees/proc/assign_reagent(datum/reagent/R) if(istype(R)) diff --git a/code/modules/mob/living/status_procs.dm b/code/modules/mob/living/status_procs.dm index 78d4cd7e94e..fd5291d7991 100644 --- a/code/modules/mob/living/status_procs.dm +++ b/code/modules/mob/living/status_procs.dm @@ -486,10 +486,10 @@ return S -/mob/living/proc/AdjustSlowedDuration(amount) +/mob/living/proc/AdjustSlowedDuration(amount, bound_lower = 0, bound_upper = INFINITY) var/datum/status_effect/incapacitating/slowed/S = IsSlowed() if(S) - S.duration += amount + S.duration = directional_bounded_sum(S.duration, amount, bound_lower, bound_upper) /mob/living/proc/AdjustSlowedIntensity(intensity) var/datum/status_effect/incapacitating/slowed/S = IsSlowed() diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 8b9da7b61bc..9ea77a4d555 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -7,7 +7,7 @@ if(mind && mind.current == src) spellremove(src) mobspellremove(src) - QDEL_LIST(viruses) + QDEL_LIST(diseases) for(var/alert in alerts) clear_alert(alert) ghostize() diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm index e089a95324e..313eec102f8 100644 --- a/code/modules/mob/mob_defines.dm +++ b/code/modules/mob/mob_defines.dm @@ -151,7 +151,7 @@ //List of active diseases - var/list/viruses = list() // list of all diseases in a mob + var/list/diseases = list() // list of all diseases in a mob var/list/resistances = list() mouse_drag_pointer = MOUSE_ACTIVE_POINTER diff --git a/code/modules/mob/mob_grab.dm b/code/modules/mob/mob_grab.dm index 32d4ebba41e..d31682694ab 100644 --- a/code/modules/mob/mob_grab.dm +++ b/code/modules/mob/mob_grab.dm @@ -432,13 +432,23 @@ return FALSE user.visible_message("[user.name] поглоща[pluralize_ru(user.gender,"ет","ют")] [affecting.name]!") + if(affecting.mind) add_attack_logs(attacker, affecting, "Devoured") + if(isvampire(user)) user.adjust_nutrition(affecting.blood_nutrients) else user.adjust_nutrition(10 * affecting.health) + for(var/datum/disease/virus/V in affecting.diseases) + if(V.spread_flags > NON_CONTAGIOUS) + V.Contract(user) + + for(var/datum/disease/virus/V in user.diseases) + if(V.spread_flags > NON_CONTAGIOUS) + V.Contract(affecting) + affecting.forceMove(user) LAZYADD(attacker.stomach_contents, affecting) qdel(src) diff --git a/code/modules/paperwork/faxmachine.dm b/code/modules/paperwork/faxmachine.dm index e14de64d365..af1305c0ff4 100644 --- a/code/modules/paperwork/faxmachine.dm +++ b/code/modules/paperwork/faxmachine.dm @@ -81,6 +81,9 @@ GLOBAL_LIST_EMPTY(fax_blacklist) GLOB.hidden_ussp |= department /obj/machinery/photocopier/faxmachine/attack_hand(mob/user) + if(..()) + return TRUE + add_fingerprint(user) ui_interact(user) diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm index 6980ec7c064..7fefb4689b1 100644 --- a/code/modules/paperwork/paper.dm +++ b/code/modules/paperwork/paper.dm @@ -20,6 +20,7 @@ resistance_flags = FLAMMABLE max_integrity = 50 attack_verb = list("bapped") + permeability_coefficient = 0.01 dog_fashion = /datum/dog_fashion/head var/header //Above the main body, displayed at the top var/info //What's actually written on the paper. @@ -783,7 +784,8 @@ STOP_PROCESSING(SSobj, src) if(mytarget && !used) var/mob/living/carbon/target = mytarget - target.ForceContractDisease(new /datum/disease/transformation/corgi) + var/datum/disease/virus/transformation/corgi/D = new + D.Contract(target) return ..() @@ -807,10 +809,12 @@ var/obj/machinery/photocopier/faxmachine/fax = locateUID(faxmachineid) if(myeffect == "Borgification") to_chat(target,"You seem to comprehend the AI a little better. Why are your muscles so stiff?") - target.ForceContractDisease(new /datum/disease/transformation/robot) + var/datum/disease/virus/transformation/robot/D = new + D.Contract(target) else if(myeffect == "Corgification") to_chat(target,"You hear distant howling as the world seems to grow bigger around you. Boy, that itch sure is getting worse!") - target.ForceContractDisease(new /datum/disease/transformation/corgi) + var/datum/disease/virus/transformation/corgi/D = new + D.Contract(target) else if(myeffect == "Death By Fire") to_chat(target,"You feel hotter than usual. Maybe you should lowe-wait, is that your hand melting?") var/turf/simulated/T = get_turf(target) diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm index 985d4210e4c..714122fd12d 100644 --- a/code/modules/power/apc.dm +++ b/code/modules/power/apc.dm @@ -816,6 +816,10 @@ /obj/machinery/power/apc/attack_hand(mob/user) if(!user) return + + if(..()) + return TRUE + add_fingerprint(user) if(usr == user && opened && !issilicon(user)) diff --git a/code/modules/power/singularity/collector.dm b/code/modules/power/singularity/collector.dm index 38e6fa9924d..1ded07a2a83 100644 --- a/code/modules/power/singularity/collector.dm +++ b/code/modules/power/singularity/collector.dm @@ -37,6 +37,9 @@ GLOBAL_LIST_EMPTY(rad_collectors) /obj/machinery/power/rad_collector/attack_hand(mob/user as mob) + if(..()) + return TRUE + if(anchored) if(!src.locked) add_fingerprint(user) diff --git a/code/modules/power/singularity/particle_accelerator/particle_control.dm b/code/modules/power/singularity/particle_accelerator/particle_control.dm index 92cd9599ff3..8caccfba7cc 100644 --- a/code/modules/power/singularity/particle_accelerator/particle_control.dm +++ b/code/modules/power/singularity/particle_accelerator/particle_control.dm @@ -37,6 +37,9 @@ return attack_hand(user) /obj/machinery/particle_accelerator/control_box/attack_hand(mob/user as mob) + if(..()) + return TRUE + add_fingerprint(user) if(construction_state >= 3) interact(user) diff --git a/code/modules/power/smes.dm b/code/modules/power/smes.dm index 4d5aa5a4617..da3f01f882d 100644 --- a/code/modules/power/smes.dm +++ b/code/modules/power/smes.dm @@ -353,6 +353,9 @@ ui_interact(user) /obj/machinery/power/smes/attack_hand(mob/user) + if(..()) + return TRUE + add_fingerprint(user) ui_interact(user) diff --git a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm index 62226f7b301..177c0708765 100644 --- a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm +++ b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm @@ -336,6 +336,10 @@ /obj/machinery/chem_dispenser/attack_hand(mob/user) if(stat & BROKEN) return + + if(..()) + return TRUE + add_fingerprint(user) ui_interact(user) diff --git a/code/modules/reagents/chemistry/machinery/chem_heater.dm b/code/modules/reagents/chemistry/machinery/chem_heater.dm index 8aa1f4c2366..502eca34007 100644 --- a/code/modules/reagents/chemistry/machinery/chem_heater.dm +++ b/code/modules/reagents/chemistry/machinery/chem_heater.dm @@ -99,6 +99,8 @@ default_deconstruction_crowbar(user, I) /obj/machinery/chem_heater/attack_hand(mob/user) + if(..()) + return TRUE ui_interact(user) /obj/machinery/chem_heater/attack_ghost(mob/user) diff --git a/code/modules/reagents/chemistry/machinery/pandemic.dm b/code/modules/reagents/chemistry/machinery/pandemic.dm index 1d8f8eda582..799410ad9ec 100644 --- a/code/modules/reagents/chemistry/machinery/pandemic.dm +++ b/code/modules/reagents/chemistry/machinery/pandemic.dm @@ -105,19 +105,17 @@ return else if(href_list["create_virus_culture"]) if(!wait) - var/type = GetVirusTypeByIndex(text2num(href_list["create_virus_culture"]))//the path is received as string - converting - var/datum/disease/D = null - if(!ispath(type)) - D = GetVirusByIndex(text2num(href_list["create_virus_culture"])) - var/datum/disease/advance/A = GLOB.archive_diseases[D.GetDiseaseID()] + var/datum/disease/D = GetVirusByIndex(text2num(href_list["create_virus_culture"])) + var/datum/disease/copy = null + if(istype(D, /datum/disease/virus/advance)) + var/datum/disease/virus/advance/A = GLOB.archive_diseases[D.GetDiseaseID()] if(A) - D = A.Copy() - else if(type) - if(type in GLOB.diseases) // Make sure this is a disease - D = new type() - if(!D) + copy = A.Copy() + if(!copy) + copy = D.Copy() + if(!copy) return - var/name = stripped_input(usr,"Name:","Name the culture",D.name,MAX_NAME_LEN) + var/name = stripped_input(usr,"Name:","Name the culture",copy.name,MAX_NAME_LEN) if(name == null || wait) return var/obj/item/reagent_containers/glass/bottle/B = new/obj/item/reagent_containers/glass/bottle(loc) @@ -125,9 +123,9 @@ B.pixel_x = rand(-3, 3) B.pixel_y = rand(-3, 3) replicator_cooldown(50) - var/list/data = list("viruses"=list(D)) + var/list/data = list("viruses"=list(copy)) B.name = "[name] culture bottle" - B.desc = "A small bottle. Contains [D.agent] culture in synthblood medium." + B.desc = "A small bottle. Contains [copy.agent] culture in synthblood medium." B.reagents.add_reagent("blood",20,data) updateUsrDialog() else @@ -155,9 +153,9 @@ return var/id = GetVirusTypeByIndex(text2num(href_list["name_disease"])) if(GLOB.archive_diseases[id]) - var/datum/disease/advance/A = GLOB.archive_diseases[id] + var/datum/disease/virus/advance/A = GLOB.archive_diseases[id] A.AssignName(new_name) - for(var/datum/disease/advance/AD in GLOB.active_diseases) + for(var/datum/disease/virus/advance/AD in GLOB.active_diseases) AD.Refresh() updateUsrDialog() else if(href_list["print_form"]) @@ -179,7 +177,7 @@ icon_state = "mixer0" //Prints a nice virus release form. Props to Urbanliner for the layout -/obj/machinery/computer/pandemic/proc/print_form(var/datum/disease/advance/D, mob/living/user) +/obj/machinery/computer/pandemic/proc/print_form(var/datum/disease/virus/advance/D, mob/living/user) D = GLOB.archive_diseases[D.GetDiseaseID()] if(!(printing) && D) var/reason = input(user,"Укажите причину выпуска", "Указать", null) as message @@ -206,7 +204,7 @@ P.info += "
" P.info += "Название вируса: [D.name]
" P.info += "Симптомы: [symtoms]
" - P.info += "Путь передачи: [D.spread_text]
" + P.info += "Путь передачи: [D.additional_info]
" P.info += "Лекарство от вируса: [D.cure_text]
" P.info += "
" P.info += "Причина выпуска: [reason]" @@ -258,9 +256,9 @@ i++ if(!(D.visibility_flags & HIDDEN_PANDEMIC)) - if(istype(D, /datum/disease/advance)) + if(istype(D, /datum/disease/virus/advance)) - var/datum/disease/advance/A = D + var/datum/disease/virus/advance/A = D D = GLOB.archive_diseases[A.GetDiseaseID()] if(D) if(D.name == "Unknown") @@ -274,11 +272,12 @@ dat += "Болезнетворный агент: [D?"[D.agent] — Создать бутылёк с вирусной культурой":"нет"]
" dat += "Общепринятое название: [(D.name||"нет")]
" dat += "Описание: [(D.desc||"нет")]
" - dat += "Путь передачи: [(D.spread_text||"нет")]
" + dat += "Путь передачи: [(D.additional_info||"нет")]
" dat += "Возможное лекарство: [(D.cure_text||"нет")]

" + dat += "Возможность выработки антител: [(D.can_immunity ? "Присутствует" : "Отсутствует")]

" - if(istype(D, /datum/disease/advance)) - var/datum/disease/advance/A = D + if(istype(D, /datum/disease/virus/advance)) + var/datum/disease/virus/advance/A = D dat += "Симптомы: " var/english_symptoms = list() for(var/datum/symptom/S in A.symptoms) @@ -301,7 +300,7 @@ var/disease_name = "Unknown" if(!ispath(type)) - var/datum/disease/advance/A = GLOB.archive_diseases[type] + var/datum/disease/virus/advance/A = GLOB.archive_diseases[type] if(A) disease_name = A.name else diff --git a/code/modules/reagents/chemistry/machinery/reagentgrinder.dm b/code/modules/reagents/chemistry/machinery/reagentgrinder.dm index c08b5a4fafc..e8acaa151ca 100644 --- a/code/modules/reagents/chemistry/machinery/reagentgrinder.dm +++ b/code/modules/reagents/chemistry/machinery/reagentgrinder.dm @@ -238,11 +238,13 @@ /obj/machinery/reagentgrinder/attack_ai(mob/user) - return FALSE + return FALSE /obj/machinery/reagentgrinder/attack_hand(mob/user) - user.set_machine(src) - interact(user) + if(..()) + return TRUE + user.set_machine(src) + interact(user) /obj/machinery/reagentgrinder/interact(mob/user) // The microwave Menu var/is_chamber_empty = 0 diff --git a/code/modules/reagents/chemistry/reagents/admin.dm b/code/modules/reagents/chemistry/reagents/admin.dm index 97bfb6eba7a..aeaffa9dfcb 100644 --- a/code/modules/reagents/chemistry/reagents/admin.dm +++ b/code/modules/reagents/chemistry/reagents/admin.dm @@ -49,11 +49,11 @@ M.SetConfused(0) M.SetSleeping(0, FALSE) M.SetJitter(0) - for(var/thing in M.viruses) + for(var/thing in M.diseases) var/datum/disease/D = thing if(D.severity == NONTHREAT) continue - D.cure(0) + D.cure(need_immunity = FALSE) ..() return STATUS_UPDATE_ALL diff --git a/code/modules/reagents/chemistry/reagents/disease.dm b/code/modules/reagents/chemistry/reagents/disease.dm index 736e78a5c5e..dd14a22b989 100644 --- a/code/modules/reagents/chemistry/reagents/disease.dm +++ b/code/modules/reagents/chemistry/reagents/disease.dm @@ -25,7 +25,8 @@ /datum/reagent/nanomachines/on_mob_life(mob/living/carbon/M) if(volume > 1.5) - M.ForceContractDisease(new /datum/disease/transformation/robot) + var/datum/disease/virus/transformation/robot/D = new + D.Contract(M) return ..() @@ -39,7 +40,8 @@ /datum/reagent/xenomicrobes/on_mob_life(mob/living/carbon/M) if(volume > 1.5) - M.ContractDisease(new /datum/disease/transformation/xeno) + var/datum/disease/virus/transformation/xeno/D = new + D.Contract(M) return ..() /datum/reagent/fungalspores @@ -52,7 +54,8 @@ /datum/reagent/fungalspores/on_mob_life(mob/living/carbon/M) if(volume > 2.5) - M.ForceContractDisease(new /datum/disease/tuberculosis) + var/datum/disease/virus/tuberculosis/D = new + D.Contract(M) return ..() /datum/reagent/jagged_crystals @@ -65,7 +68,8 @@ taste_mult = 0 /datum/reagent/jagged_crystals/on_mob_life(mob/living/carbon/M) - M.ForceContractDisease(new /datum/disease/berserker) + var/datum/disease/berserker/D = new + D.Contract(M) return ..() /datum/reagent/salmonella @@ -78,7 +82,8 @@ taste_mult = 0 /datum/reagent/salmonella/on_mob_life(mob/living/carbon/M) - M.ForceContractDisease(new /datum/disease/food_poisoning) + var/datum/disease/food_poisoning/D = new + D.Contract(M) return ..() /datum/reagent/gibbis @@ -92,7 +97,8 @@ /datum/reagent/gibbis/on_mob_life(mob/living/carbon/M) if(volume > 2.5) - M.ForceContractDisease(new /datum/disease/gbs/curable) + var/datum/disease/virus/gbs/non_con/D = new + D.Contract(M) return ..() /datum/reagent/prions @@ -106,7 +112,8 @@ /datum/reagent/prions/on_mob_life(mob/living/carbon/M) if(volume > 4.5) - M.ForceContractDisease(new /datum/disease/kuru) + var/datum/disease/kuru/D = new + D.Contract(M) return ..() /datum/reagent/grave_dust @@ -120,7 +127,8 @@ /datum/reagent/grave_dust/on_mob_life(mob/living/carbon/M) if(volume > 4.5) - M.ForceContractDisease(new /datum/disease/vampire) + var/datum/disease/vampire/D = new + D.Contract(M) return ..() /datum/reagent/bacon_grease @@ -134,7 +142,8 @@ /datum/reagent/bacon_grease/on_mob_life(mob/living/carbon/M) if(volume > 4.5) - M.ForceContractDisease(new /datum/disease/critical/heart_failure) + var/datum/disease/critical/heart_failure/D = new + D.Contract(M) return ..() /datum/reagent/heartworms diff --git a/code/modules/reagents/chemistry/reagents/food.dm b/code/modules/reagents/chemistry/reagents/food.dm index 7fd74a4c863..b523dd0faf8 100644 --- a/code/modules/reagents/chemistry/reagents/food.dm +++ b/code/modules/reagents/chemistry/reagents/food.dm @@ -885,7 +885,8 @@ to_chat(H, "Ugh! Eating that was a terrible idea!") if(NO_HUNGER in H.dna.species.species_traits) //If you don't eat, then you can't get food poisoning return - H.ForceContractDisease(new /datum/disease/food_poisoning) + var/datum/disease/food_poisoning/D = new + D.Contract(H) /datum/reagent/msg name = "Monosodium glutamate" @@ -931,7 +932,8 @@ else if(volume >= 150 && prob(volume*0.01)) to_chat(M, "Your chest is burning with pain!") M.Weaken(2 SECONDS) - M.ForceContractDisease(new /datum/disease/critical/heart_failure) + var/datum/disease/critical/heart_failure/D = new + D.Contract(M) return ..() | update_flags /datum/reagent/fungus @@ -950,7 +952,8 @@ M.reagents.add_reagent("toxin", rand(1,5)) else if(ranchance <= 5) to_chat(M, "That tasted absolutely FOUL.") - M.ForceContractDisease(new /datum/disease/food_poisoning) + var/datum/disease/food_poisoning/D = new + D.Contract(M) else to_chat(M, "Yuck!") diff --git a/code/modules/reagents/chemistry/reagents/medicine.dm b/code/modules/reagents/chemistry/reagents/medicine.dm index 3dcd83a1bf9..a0a2d0450dd 100644 --- a/code/modules/reagents/chemistry/reagents/medicine.dm +++ b/code/modules/reagents/chemistry/reagents/medicine.dm @@ -1349,7 +1349,7 @@ I.heal_internal_damage(4) if(H.blood_volume < BLOOD_VOLUME_NORMAL * 0.9)// If below 90% blood, regenerate 225 units total H.blood_volume += 15 - for(var/datum/disease/critical/heart_failure/HF in H.viruses) + for(var/datum/disease/critical/heart_failure/HF in H.diseases) HF.cure() //Won't fix a stopped heart, but it will sure fix a critical one. Shock is not fixed as healing will fix it if(M.health < 40) update_flags |= M.adjustOxyLoss(-3, FALSE) diff --git a/code/modules/reagents/chemistry/reagents/ninja.dm b/code/modules/reagents/chemistry/reagents/ninja.dm index 62e716f108c..e2a9fabae5b 100644 --- a/code/modules/reagents/chemistry/reagents/ninja.dm +++ b/code/modules/reagents/chemistry/reagents/ninja.dm @@ -100,7 +100,7 @@ if(our_ears.damage < 25 && prob(30)) mob_human.SetDeaf(0) //ALL viruses - for(var/thing in mob_human.viruses) + for(var/thing in mob_human.diseases) var/datum/disease/our_disease = thing our_disease.cure(0) //Genes(resets them like mutadone) diff --git a/code/modules/reagents/chemistry/reagents/toxins.dm b/code/modules/reagents/chemistry/reagents/toxins.dm index c528033c9e8..7a95340c09e 100644 --- a/code/modules/reagents/chemistry/reagents/toxins.dm +++ b/code/modules/reagents/chemistry/reagents/toxins.dm @@ -25,6 +25,61 @@ update_flags |= M.adjustToxLoss(1.5, FALSE) return ..() | update_flags +/datum/reagent/bee_venom + name = "Bee venom" + id = "beetoxin" + description = "A toxic venom injected by space bees." + reagent_state = LIQUID + color = "#ff932f" + taste_description = "pain" + +/datum/reagent/bee_venom/on_mob_life(mob/living/M) + var/update_flags = STATUS_UPDATE_NONE + update_flags |= M.adjustToxLoss(1.5, FALSE) + return ..() | update_flags + +//bee venom specially for Beesease bees +/datum/reagent/bee_venom_beesease + name = "Bee venom" + id = "beetoxinbeesease" + description = "A toxic venom injected by space bees." + reagent_state = LIQUID + color = "#ff932f" + taste_description = "pain" + overdose_threshold = 30 + +/datum/reagent/bee_venom_beesease/on_mob_life(mob/living/M) + var/update_flags = STATUS_UPDATE_NONE + update_flags |= M.adjustToxLoss(0.1, FALSE) + return ..() | update_flags + +/datum/reagent/bee_venom_beesease/overdose_process(mob/living/M, severity) + var/list/overdose_info = ..() + var/effect = overdose_info[REAGENT_OVERDOSE_EFFECT] + var/update_flags = overdose_info[REAGENT_OVERDOSE_FLAGS] + switch(severity) + //30-60 units + if(1) + M.Slowed(3 SECONDS, 3) + M.damageoverlaytemp = 50 + update_flags |= M.adjustToxLoss(0.75, FALSE) + if(effect <= 5) + M.Jitter(8 SECONDS) + else if(effect <= 7) + M.Stuttering(8 SECONDS) + //60 - Infinity units + if(2) + M.Slowed(3 SECONDS, 6) + M.damageoverlaytemp = 90 + update_flags |= M.adjustToxLoss(1.5, FALSE) + if(effect <= 3) + M.Weaken(4 SECONDS) + M.Jitter(8 SECONDS) + M.Stuttering(8 SECONDS) + else if(effect <= 7) + M.Stuttering(8 SECONDS) + return list(effect, update_flags) + /datum/reagent/minttoxin name = "Mint Toxin" id = "minttoxin" @@ -99,7 +154,8 @@ /datum/reagent/aslimetoxin/reaction_mob(mob/living/M, method=REAGENT_TOUCH, volume) if(method != REAGENT_TOUCH) - M.ForceContractDisease(new /datum/disease/transformation/slime) + var/datum/disease/virus/transformation/slime/D = new + D.Contract(M) /datum/reagent/mercury @@ -1246,7 +1302,8 @@ taste_description = "decay" /datum/reagent/gluttonytoxin/reaction_mob(mob/living/L, method=REAGENT_TOUCH, reac_volume) - L.ForceContractDisease(new /datum/disease/transformation/morph) + var/datum/disease/virus/transformation/morph/D = new + D.Contract(L) /datum/reagent/bungotoxin name = "Bungotoxin" diff --git a/code/modules/reagents/chemistry/reagents/water.dm b/code/modules/reagents/chemistry/reagents/water.dm index 8e5617acceb..84b1bd05779 100644 --- a/code/modules/reagents/chemistry/reagents/water.dm +++ b/code/modules/reagents/chemistry/reagents/water.dm @@ -105,15 +105,15 @@ /datum/reagent/blood/reaction_mob(mob/living/M, method=REAGENT_TOUCH, volume) if(data && data["viruses"]) for(var/thing in data["viruses"]) - var/datum/disease/D = thing + var/datum/disease/virus/V = thing - if(D.spread_flags & SPECIAL || D.spread_flags & NON_CONTAGIOUS) + if(V.spread_flags < BLOOD) continue if(method == REAGENT_TOUCH) - M.ContractDisease(D) - else //ingest, patch or inject - M.ForceContractDisease(D) + V.Contract(M, need_protection_check = TRUE, act_type = CONTACT) + else + V.Contract(M, need_protection_check = FALSE) if(method == REAGENT_INGEST && iscarbon(M)) var/mob/living/carbon/C = M @@ -138,19 +138,19 @@ // Stop issues with the list changing during mixing. var/list/to_mix = list() - for(var/datum/disease/advance/AD in mix1) + for(var/datum/disease/virus/advance/AD in mix1) to_mix += AD - for(var/datum/disease/advance/AD in mix2) + for(var/datum/disease/virus/advance/AD in mix2) to_mix += AD - var/datum/disease/advance/AD = Advance_Mix(to_mix) + var/datum/disease/virus/advance/AD = Advance_Mix(to_mix) var/list/preserve = list() if(istype(AD)) preserve += AD for(var/datum/disease/D in data["viruses"] + mix_data["viruses"]) - if(!istype(D, /datum/disease/advance)) + if(!istype(D, /datum/disease/virus/advance)) preserve += D.Copy() data["viruses"] = preserve @@ -186,15 +186,15 @@ /datum/reagent/blood/synthetic/reaction_mob(mob/living/M, method=REAGENT_TOUCH, volume) if(data && data["viruses"]) for(var/thing in data["viruses"]) - var/datum/disease/D = thing + var/datum/disease/virus/V = thing - if(D.spread_flags & SPECIAL || D.spread_flags & NON_CONTAGIOUS) + if(V.spread_flags < BLOOD) continue if(method == REAGENT_TOUCH) - M.ContractDisease(D) - else //ingest, patch or inject - M.ForceContractDisease(D) + V.Contract(M, need_protection_check = TRUE, act_type = CONTACT) + else + V.Contract(M, need_protection_check = FALSE) /datum/reagent/blood/synthetic/vox name = "Synthetic Blood" @@ -243,7 +243,7 @@ /datum/reagent/vaccine/reaction_mob(mob/living/M, method=REAGENT_TOUCH, volume) if(islist(data) && (method == REAGENT_INGEST)) - for(var/thing in M.viruses) + for(var/thing in M.diseases) var/datum/disease/D = thing if(D.GetDiseaseID() in data) D.cure() diff --git a/code/modules/reagents/chemistry/recipes/others.dm b/code/modules/reagents/chemistry/recipes/others.dm index 487677c184c..ef5fe406b31 100644 --- a/code/modules/reagents/chemistry/recipes/others.dm +++ b/code/modules/reagents/chemistry/recipes/others.dm @@ -680,7 +680,7 @@ /datum/chemical_reaction/mix_virus/on_reaction(datum/reagents/holder, created_volume) var/datum/reagent/blood/B = locate(/datum/reagent/blood) in holder.reagent_list if(B && B.data) - var/datum/disease/advance/D = locate(/datum/disease/advance) in B.data["viruses"] + var/datum/disease/virus/advance/D = locate(/datum/disease/virus/advance) in B.data["viruses"] if(D) D.Evolve(level_min, level_max) @@ -750,6 +750,6 @@ /datum/chemical_reaction/mix_virus/rem_virus/on_reaction(datum/reagents/holder, created_volume) var/datum/reagent/blood/B = locate(/datum/reagent/blood) in holder.reagent_list if(B && B.data) - var/datum/disease/advance/D = locate(/datum/disease/advance) in B.data["viruses"] + var/datum/disease/virus/advance/D = locate(/datum/disease/virus/advance) in B.data["viruses"] if(D) D.Devolve() diff --git a/code/modules/reagents/reagent_containers/bottle.dm b/code/modules/reagents/reagent_containers/bottle.dm index 5b753e5f3c1..5dc907fbd58 100644 --- a/code/modules/reagents/reagent_containers/bottle.dm +++ b/code/modules/reagents/reagent_containers/bottle.dm @@ -281,204 +281,216 @@ icon_state = "wide_bottle" list_reagents = list("potass_iodide" = 30) -/obj/item/reagent_containers/glass/bottle/flu_virion +/obj/item/reagent_containers/glass/bottle/cold + name = "Rhinovirus culture bottle" + desc = "A small bottle. Contains XY-rhinovirus culture in synthblood medium." + icon_state = "round_bottle" + spawned_disease = /datum/disease/virus/cold + +/obj/item/reagent_containers/glass/bottle/flu name = "Flu virion culture bottle" desc = "A small bottle. Contains H13N1 flu virion culture in synthblood medium." icon_state = "round_bottle" - spawned_disease = /datum/disease/advance/preset/flu + spawned_disease = /datum/disease/virus/flu + +/obj/item/reagent_containers/glass/bottle/sneezing + name = "Sneezing symptom bottle" + desc = "A small bottle. Contains a simple advanced virus in synthblood medium that makes infected sneeze." + icon_state = "round_bottle" + spawned_disease = /datum/disease/virus/advance/preset/sneezing + +/obj/item/reagent_containers/glass/bottle/cough + name = "Cough symptom bottle" + desc = "A small bottle. Contains a simple advanced virus in synthblood medium that makes infected cough." + icon_state = "round_bottle" + spawned_disease = /datum/disease/virus/advance/preset/cough /obj/item/reagent_containers/glass/bottle/epiglottis_virion name = "Epiglottis virion culture bottle" desc = "A small bottle. Contains Epiglottis virion culture in synthblood medium." icon_state = "round_bottle" - spawned_disease = /datum/disease/advance/preset/voice_change + spawned_disease = /datum/disease/virus/advance/preset/voice_change /obj/item/reagent_containers/glass/bottle/liver_enhance_virion name = "Liver enhancement virion culture bottle" desc = "A small bottle. Contains liver enhancement virion culture in synthblood medium." icon_state = "round_bottle" - spawned_disease = /datum/disease/advance/preset/heal + spawned_disease = /datum/disease/virus/advance/preset/heal /obj/item/reagent_containers/glass/bottle/hullucigen_virion name = "Hullucigen virion culture bottle" desc = "A small bottle. Contains hullucigen virion culture in synthblood medium." icon_state = "round_bottle" - spawned_disease = /datum/disease/advance/preset/hullucigen + spawned_disease = /datum/disease/virus/advance/preset/hullucigen /obj/item/reagent_containers/glass/bottle/pierrot_throat name = "Pierrot's Throat culture bottle" desc = "A small bottle. Contains H0NI<42 virion culture in synthblood medium." icon_state = "round_bottle" - spawned_disease = /datum/disease/pierrot_throat - -/obj/item/reagent_containers/glass/bottle/cold - name = "Rhinovirus culture bottle" - desc = "A small bottle. Contains XY-rhinovirus culture in synthblood medium." - icon_state = "round_bottle" - spawned_disease = /datum/disease/advance/preset/cold + spawned_disease = /datum/disease/virus/pierrot_throat /obj/item/reagent_containers/glass/bottle/mind_restoration name = "Reality Purifier culture bottle" desc = "A small bottle. Contains Reality Purifier culture in synthblood medium." icon_state = "round_bottle" - spawned_disease = /datum/disease/advance/preset/mind_restoration + spawned_disease = /datum/disease/virus/advance/preset/mind_restoration /obj/item/reagent_containers/glass/bottle/advanced_regeneration name = "Advanced Neogenesis culture bottle" desc = "A small bottle. Contains Advanced Neogenesis culture in synthblood medium." icon_state = "round_bottle" - spawned_disease = /datum/disease/advance/preset/advanced_regeneration + spawned_disease = /datum/disease/virus/advance/preset/advanced_regeneration /obj/item/reagent_containers/glass/bottle/stealth_necrosis name = "Necroeyrosis culture bottle" desc = "A small bottle. Contains Necroeyrosis culture in synthblood medium." icon_state = "round_bottle" - spawned_disease = /datum/disease/advance/preset/stealth_necrosis + spawned_disease = /datum/disease/virus/advance/preset/stealth_necrosis /obj/item/reagent_containers/glass/bottle/pre_kingstons name = "Neverlasting Stranger culture bottle" desc = "A small bottle. Contains Neverlasting Stranger culture in synthblood medium." icon_state = "round_bottle" - spawned_disease = /datum/disease/advance/preset/pre_kingstons + spawned_disease = /datum/disease/virus/advance/preset/pre_kingstons /obj/item/reagent_containers/glass/bottle/love name = "love" desc = "love" icon_state = "round_bottle" - spawned_disease = /datum/disease/advance/preset/love + spawned_disease = /datum/disease/virus/advance/preset/love /obj/item/reagent_containers/glass/bottle/aggression name = "aggression" desc = "aggression" icon_state = "round_bottle" - spawned_disease = /datum/disease/advance/preset/aggression + spawned_disease = /datum/disease/virus/advance/preset/aggression /obj/item/reagent_containers/glass/bottle/obsession name = "obsession" desc = "obsession" icon_state = "round_bottle" - spawned_disease = /datum/disease/advance/preset/obsession + spawned_disease = /datum/disease/virus/advance/preset/obsession /obj/item/reagent_containers/glass/bottle/confusion name = "confusion" desc = "confusion" icon_state = "round_bottle" - spawned_disease = /datum/disease/advance/preset/confusion + spawned_disease = /datum/disease/virus/advance/preset/confusion /obj/item/reagent_containers/glass/bottle/bones name = "bones" desc = "bones" icon_state = "round_bottle" - spawned_disease = /datum/disease/advance/preset/bones + spawned_disease = /datum/disease/virus/advance/preset/bones /obj/item/reagent_containers/glass/bottle/limb_throw name = "limb_throw" desc = "limb_throw" icon_state = "round_bottle" - spawned_disease = /datum/disease/advance/preset/limb_throw + spawned_disease = /datum/disease/virus/advance/preset/limb_throw /obj/item/reagent_containers/glass/bottle/laugh name = "laugh" desc = "laugh" icon_state = "round_bottle" - spawned_disease = /datum/disease/advance/preset/laugh + spawned_disease = /datum/disease/virus/advance/preset/laugh /obj/item/reagent_containers/glass/bottle/moan name = "moan" desc = "moan" icon_state = "round_bottle" - spawned_disease = /datum/disease/advance/preset/moan + spawned_disease = /datum/disease/virus/advance/preset/moan /obj/item/reagent_containers/glass/bottle/infection name = "infection" desc = "infection" icon_state = "round_bottle" - spawned_disease = /datum/disease/advance/preset/infection + spawned_disease = /datum/disease/virus/advance/preset/infection /obj/item/reagent_containers/glass/bottle/loyalty name = "loyalty" desc = "loyalty" icon_state = "round_bottle" - spawned_disease = /datum/disease/loyalty + spawned_disease = /datum/disease/virus/loyalty /obj/item/reagent_containers/glass/bottle/pre_loyalty name = "pre_loyalty" desc = "pre_loyalty" icon_state = "round_bottle" - spawned_disease = /datum/disease/advance/preset/pre_loyalty + spawned_disease = /datum/disease/virus/advance/preset/pre_loyalty /obj/item/reagent_containers/glass/bottle/retrovirus name = "Retrovirus culture bottle" desc = "A small bottle. Contains a retrovirus culture in a synthblood medium." icon_state = "round_bottle" - spawned_disease = /datum/disease/dna_retrovirus + spawned_disease = /datum/disease/virus/dna_retrovirus /obj/item/reagent_containers/glass/bottle/gbs name = "GBS culture bottle" desc = "A small bottle. Contains Gravitokinetic Bipotential SADS+ culture in synthblood medium."//Or simply - General BullShit icon_state = "round_bottle" amount_per_transfer_from_this = 5 - spawned_disease = /datum/disease/gbs + spawned_disease = /datum/disease/virus/gbs /obj/item/reagent_containers/glass/bottle/fake_gbs name = "GBS culture bottle" desc = "A small bottle. Contains Gravitokinetic Bipotential SADS- culture in synthblood medium."//Or simply - General BullShit icon_state = "round_bottle" - spawned_disease = /datum/disease/fake_gbs + spawned_disease = /datum/disease/virus/fake_gbs /obj/item/reagent_containers/glass/bottle/brainrot name = "Brainrot culture bottle" desc = "A small bottle. Contains Cryptococcus Cosmosis culture in synthblood medium." icon_state = "round_bottle" - spawned_disease = /datum/disease/brainrot + spawned_disease = /datum/disease/virus/brainrot /obj/item/reagent_containers/glass/bottle/magnitis name = "Magnitis culture bottle" desc = "A small bottle. Contains a small dosage of Fukkos Miracos." icon_state = "round_bottle" - spawned_disease = /datum/disease/magnitis + spawned_disease = /datum/disease/virus/magnitis /obj/item/reagent_containers/glass/bottle/wizarditis name = "Wizarditis culture bottle" desc = "A small bottle. Contains a sample of Rincewindus Vulgaris." icon_state = "round_bottle" - spawned_disease = /datum/disease/wizarditis + spawned_disease = /datum/disease/virus/wizarditis /obj/item/reagent_containers/glass/bottle/anxiety name = "Severe Anxiety culture bottle" desc = "A small bottle. Contains a sample of Lepidopticides." icon_state = "round_bottle" - spawned_disease = /datum/disease/anxiety + spawned_disease = /datum/disease/virus/anxiety /obj/item/reagent_containers/glass/bottle/beesease name = "Beesease culture bottle" desc = "A small bottle. Contains a sample of invasive Apidae." icon_state = "round_bottle" - spawned_disease = /datum/disease/beesease + spawned_disease = /datum/disease/virus/beesease /obj/item/reagent_containers/glass/bottle/fluspanish name = "Spanish flu culture bottle" desc = "A small bottle. Contains a sample of Inquisitius." icon_state = "round_bottle" - spawned_disease = /datum/disease/fluspanish + spawned_disease = /datum/disease/virus/fluspanish /obj/item/reagent_containers/glass/bottle/tuberculosis name = "Fungal Tuberculosis culture bottle" desc = "A small bottle. Contains a sample of Fungal Tubercle bacillus." icon_state = "round_bottle" - spawned_disease = /datum/disease/tuberculosis + spawned_disease = /datum/disease/virus/tuberculosis /obj/item/reagent_containers/glass/bottle/regeneration name = "Regeneration culture bottle" desc = "A small bottle. Contains a sample of a virus that heals toxin damage." icon_state = "round_bottle" - spawned_disease = /datum/disease/advance/preset/heal + spawned_disease = /datum/disease/virus/advance/preset/heal /obj/item/reagent_containers/glass/bottle/sensory_restoration name = "Sensory Restoration culture bottle" desc = "A small bottle. Contains a sample of a virus that heals sensory damage." icon_state = "round_bottle" - spawned_disease = /datum/disease/advance/preset/sensory_restoration + spawned_disease = /datum/disease/virus/advance/preset/sensory_restoration /obj/item/reagent_containers/glass/bottle/tuberculosiscure name = "BVAK bottle" diff --git a/code/modules/reagents/reagent_containers/dropper.dm b/code/modules/reagents/reagent_containers/dropper.dm index 7e3d219ad52..85e9dc7eaa1 100644 --- a/code/modules/reagents/reagent_containers/dropper.dm +++ b/code/modules/reagents/reagent_containers/dropper.dm @@ -129,7 +129,7 @@ var/datum/disease/D = dis var/virusData = D.name var/english_symptoms = list() - var/datum/disease/advance/A = D + var/datum/disease/virus/advance/A = D if(istype(A)) for(var/datum/symptom/S in A.symptoms) english_symptoms += S.name diff --git a/code/modules/research/experimentor.dm b/code/modules/research/experimentor.dm index 9cd7fee382a..ef81f6ec415 100644 --- a/code/modules/research/experimentor.dm +++ b/code/modules/research/experimentor.dm @@ -164,6 +164,9 @@ ..(O) /obj/machinery/r_n_d/experimentor/attack_hand(mob/user) + if(..()) + return TRUE + add_fingerprint(user) user.set_machine(src) var/dat = {"
"} diff --git a/code/modules/research/message_server.dm b/code/modules/research/message_server.dm index 6e0cbdb0693..378c865cae1 100644 --- a/code/modules/research/message_server.dm +++ b/code/modules/research/message_server.dm @@ -115,6 +115,8 @@ GLOBAL_LIST_EMPTY(message_servers) /obj/machinery/message_server/attack_hand(user as mob) // to_chat(user, "There seem to be some parts missing from this server. They should arrive on the station in a few days, give or take a few CentComm delays.") + if(..()) + return TRUE add_fingerprint(user) to_chat(user, "You toggle PDA message passing from [active ? "On" : "Off"] to [active ? "Off" : "On"]") active = !active diff --git a/code/modules/research/rdmachines.dm b/code/modules/research/rdmachines.dm index 3133a407ac9..aa5491ed23c 100644 --- a/code/modules/research/rdmachines.dm +++ b/code/modules/research/rdmachines.dm @@ -42,6 +42,8 @@ w -= src.disable_wire /obj/machinery/r_n_d/attack_hand(mob/user as mob) + if(..()) + return TRUE add_fingerprint(user) if(shocked) shock(user,50) diff --git a/code/modules/research/server.dm b/code/modules/research/server.dm index 55c6ebb949c..3642427b1b8 100644 --- a/code/modules/research/server.dm +++ b/code/modules/research/server.dm @@ -169,6 +169,9 @@ return ..() /obj/machinery/r_n_d/server/attack_hand(mob/user as mob) + if(..()) + return TRUE + if(disabled) return @@ -342,6 +345,8 @@ /obj/machinery/computer/rdservercontrol/attack_hand(mob/user as mob) if(stat & (BROKEN|NOPOWER)) return + if(..()) + return TRUE add_fingerprint(user) user.set_machine(src) var/dat = "" diff --git a/code/modules/shuttle/shuttle_manipulator.dm b/code/modules/shuttle/shuttle_manipulator.dm index bc9458f3611..8ba798e3bf9 100644 --- a/code/modules/shuttle/shuttle_manipulator.dm +++ b/code/modules/shuttle/shuttle_manipulator.dm @@ -59,6 +59,8 @@ . = "ERROR" /obj/machinery/shuttle_manipulator/attack_hand(mob/user) + if(..()) + return TRUE add_fingerprint(user) ui_interact(user) diff --git a/code/modules/shuttle/supply.dm b/code/modules/shuttle/supply.dm index 5b8abdff9c4..c53a994afe8 100644 --- a/code/modules/shuttle/supply.dm +++ b/code/modules/shuttle/supply.dm @@ -419,6 +419,9 @@ playsound(src, pick('sound/machines/button.ogg', 'sound/machines/button_alternate.ogg', 'sound/machines/button_meloboom.ogg'), 20) return 1 + if(..()) + return TRUE + add_fingerprint(user) post_signal("supply") ui_interact(user) diff --git a/code/modules/station_goals/bfl.dm b/code/modules/station_goals/bfl.dm index 8cf1bdf3839..7e92559251f 100644 --- a/code/modules/station_goals/bfl.dm +++ b/code/modules/station_goals/bfl.dm @@ -81,6 +81,8 @@ var/lavaland_z_lvl // Определяется кодом по имени лаваленда /obj/machinery/power/bfl_emitter/attack_hand(mob/user as mob) + if(..()) + return TRUE var/response src.add_fingerprint(user) if(state) @@ -247,6 +249,8 @@ var/last_icon_change = 0 /obj/machinery/bfl_receiver/attack_hand(mob/user as mob) + if(..()) + return TRUE var/response src.add_fingerprint(user) if(state) diff --git a/code/modules/station_goals/bluespace_tap.dm b/code/modules/station_goals/bluespace_tap.dm index b690dfb39e8..5c855cc5dd0 100644 --- a/code/modules/station_goals/bluespace_tap.dm +++ b/code/modules/station_goals/bluespace_tap.dm @@ -375,6 +375,9 @@ /obj/machinery/power/bluespace_tap/attack_hand(mob/user) + if(..()) + return TRUE + add_fingerprint(user) ui_interact(user) diff --git a/code/modules/surgery/organs/blood.dm b/code/modules/surgery/organs/blood.dm index 32ad1fb564f..65b374eabe2 100644 --- a/code/modules/surgery/organs/blood.dm +++ b/code/modules/surgery/organs/blood.dm @@ -171,10 +171,10 @@ if(blood_id == "blood") //normal blood if(blood_data["viruses"]) for(var/thing in blood_data["viruses"]) - var/datum/disease/D = thing - if((D.spread_flags & SPECIAL) || (D.spread_flags & NON_CONTAGIOUS)) + var/datum/disease/virus/V = thing + if(V.spread_flags < BLOOD) continue - C.ForceContractDisease(D) + V.Contract(C) if(!(blood_data["blood_type"] in get_safe_blood(C.dna.blood_type)) || !(blood_data["blood_species"] == C.dna.species.blood_species)) C.reagents.add_reagent("toxin", amount * 0.5) return 1 @@ -196,7 +196,7 @@ blood_data["donor"] = src blood_data["viruses"] = list() - for(var/thing in viruses) + for(var/thing in diseases) var/datum/disease/D = thing blood_data["viruses"] += D.Copy() diff --git a/code/modules/surgery/organs/heart.dm b/code/modules/surgery/organs/heart.dm index 8ebefbad9f3..2e11d176c1b 100644 --- a/code/modules/surgery/organs/heart.dm +++ b/code/modules/surgery/organs/heart.dm @@ -180,17 +180,17 @@ addtimer(CALLBACK(src, PROC_REF(recharge)), 300) addtimer(CALLBACK(src, PROC_REF(message_to_owner), owner, "Your [name] fails to return to its normal rhythm!"), 30) - if(!(status & ORGAN_DEAD) && !attempted_restart && owner.HasDisease(new /datum/disease/critical/heart_failure)) + if(!(status & ORGAN_DEAD) && !attempted_restart && owner.HasDisease(/datum/disease/critical/heart_failure)) to_chat(owner, "Your [name] detects a cardiac event and attempts to return to its normal rhythm!") if(prob(40) && emagged) attempted_restart = TRUE - for(var/datum/disease/critical/heart_failure/HF in owner.viruses) + for(var/datum/disease/critical/heart_failure/HF in owner.diseases) HF.cure() addtimer(CALLBACK(src, PROC_REF(message_to_owner), owner, "Your [name] returns to its normal rhythm!"), 30) addtimer(CALLBACK(src, PROC_REF(recharge)), 200) else if(prob(25)) attempted_restart = TRUE - for(var/datum/disease/critical/heart_failure/HF in owner.viruses) + for(var/datum/disease/critical/heart_failure/HF in owner.diseases) HF.cure() addtimer(CALLBACK(src, PROC_REF(message_to_owner), owner, "Your [name] returns to its normal rhythm!"), 30) addtimer(CALLBACK(src, PROC_REF(recharge)), 200) @@ -256,7 +256,8 @@ owner.adjustFireLoss(numHigh) if(prob(numMid)) to_chat(owner, "Your [name] lurches awkwardly!") - owner.ForceContractDisease(new /datum/disease/critical/heart_failure) + var/datum/disease/critical/heart_failure/D = new + D.Contract(owner) if(prob(numMid)) to_chat(owner, "Your [name] stops beating!") Stop() @@ -272,4 +273,5 @@ owner.adjustFireLoss(numMid) if(prob(numLow)) to_chat(owner, "Your [name] lurches awkwardly!") - owner.ForceContractDisease(new /datum/disease/critical/heart_failure) + var/datum/disease/critical/heart_failure/D = new + D.Contract(owner) diff --git a/code/modules/surgery/organs/organ_icon.dm b/code/modules/surgery/organs/organ_icon.dm index 61b3b591ca8..fcce8c7e53b 100644 --- a/code/modules/surgery/organs/organ_icon.dm +++ b/code/modules/surgery/organs/organ_icon.dm @@ -193,5 +193,6 @@ GLOBAL_LIST_EMPTY(limb_icon_cache) var/n_is = damage_state_text() if(n_is != damage_state) damage_state = n_is + owner?.UpdateDamageIcon() return 1 return 0 diff --git a/code/modules/surgery/organs/organ_internal.dm b/code/modules/surgery/organs/organ_internal.dm index b7f0e66f9a2..9edc4a0cffa 100644 --- a/code/modules/surgery/organs/organ_internal.dm +++ b/code/modules/surgery/organs/organ_internal.dm @@ -181,12 +181,12 @@ organ_tag = "appendix" parent_organ = "groin" slot = "appendix" - var/inflamed = 0 + var/inflamed = FALSE /obj/item/organ/internal/appendix/remove(mob/living/carbon/M, special = 0) - for(var/datum/disease/appendicitis/A in M.viruses) + for(var/datum/disease/appendicitis/A in M.diseases) A.cure() - inflamed = 1 + inflamed = TRUE update_icon() . = ..() @@ -367,7 +367,7 @@ if(germ_level >= INFECTION_LEVEL_TWO) if(prob(3 * owner.dna.species.germs_growth_rate)) // big message from every 1 damage is not good. If germs growth rate is big, it will spam the chat. - receive_damage(1, silent = prob(30/owner.dna.species.germs_growth_rate)) + receive_damage(1, silent = prob(30*owner.dna.species.germs_growth_rate)) /mob/living/carbon/human/proc/check_infections() var/list/infections = list() diff --git a/paradise.dme b/paradise.dme index 121e78b65b3..216673c352b 100644 --- a/paradise.dme +++ b/paradise.dme @@ -400,73 +400,72 @@ #include "code\datums\components\swarming.dm" #include "code\datums\components\twohanded.dm" #include "code\datums\diseases\_disease.dm" +#include "code\datums\diseases\viruses\_virus.dm" #include "code\datums\diseases\_MobProcs.dm" -#include "code\datums\diseases\anxiety.dm" +#include "code\datums\diseases\viruses\anxiety.dm" #include "code\datums\diseases\appendicitis.dm" -#include "code\datums\diseases\beesease.dm" +#include "code\datums\diseases\viruses\beesease.dm" #include "code\datums\diseases\berserker.dm" -#include "code\datums\diseases\brainrot.dm" -#include "code\datums\diseases\cold.dm" -#include "code\datums\diseases\cold9.dm" +#include "code\datums\diseases\viruses\brainrot.dm" +#include "code\datums\diseases\viruses\cold.dm" #include "code\datums\diseases\critical.dm" -#include "code\datums\diseases\fake_gbs.dm" -#include "code\datums\diseases\flu.dm" -#include "code\datums\diseases\fluspanish.dm" +#include "code\datums\diseases\viruses\flu.dm" +#include "code\datums\diseases\viruses\fluspanish.dm" #include "code\datums\diseases\food_poisoning.dm" -#include "code\datums\diseases\gbs.dm" -#include "code\datums\diseases\kingstons.dm" +#include "code\datums\diseases\viruses\gbs.dm" +#include "code\datums\diseases\viruses\kingstons.dm" #include "code\datums\diseases\kuru.dm" -#include "code\datums\diseases\loyalty_syndrome.dm" -#include "code\datums\diseases\lycancoughy.dm" -#include "code\datums\diseases\magnitis.dm" -#include "code\datums\diseases\pierrot_throat.dm" -#include "code\datums\diseases\retrovirus.dm" -#include "code\datums\diseases\rhumba_beat.dm" -#include "code\datums\diseases\transformation.dm" -#include "code\datums\diseases\tuberculosis.dm" +#include "code\datums\diseases\viruses\loyalty_syndrome.dm" +#include "code\datums\diseases\viruses\lycancoughy.dm" +#include "code\datums\diseases\viruses\magnitis.dm" +#include "code\datums\diseases\viruses\pierrot_throat.dm" +#include "code\datums\diseases\viruses\retrovirus.dm" +#include "code\datums\diseases\viruses\rhumba_beat.dm" +#include "code\datums\diseases\viruses\transformation.dm" +#include "code\datums\diseases\viruses\tuberculosis.dm" #include "code\datums\diseases\vampire.dm" -#include "code\datums\diseases\wizarditis.dm" -#include "code\datums\diseases\advance\advance.dm" -#include "code\datums\diseases\advance\presets.dm" -#include "code\datums\diseases\advance\symptoms\beard.dm" -#include "code\datums\diseases\advance\symptoms\blood.dm" -#include "code\datums\diseases\advance\symptoms\bones.dm" -#include "code\datums\diseases\advance\symptoms\booze.dm" -#include "code\datums\diseases\advance\symptoms\choking.dm" -#include "code\datums\diseases\advance\symptoms\confusion.dm" -#include "code\datums\diseases\advance\symptoms\cough.dm" -#include "code\datums\diseases\advance\symptoms\damage_converter.dm" -#include "code\datums\diseases\advance\symptoms\deafness.dm" -#include "code\datums\diseases\advance\symptoms\dizzy.dm" -#include "code\datums\diseases\advance\symptoms\epinephrine.dm" -#include "code\datums\diseases\advance\symptoms\fever.dm" -#include "code\datums\diseases\advance\symptoms\fire.dm" -#include "code\datums\diseases\advance\symptoms\flesh_eating.dm" -#include "code\datums\diseases\advance\symptoms\hallucigen.dm" -#include "code\datums\diseases\advance\symptoms\headache.dm" -#include "code\datums\diseases\advance\symptoms\heal.dm" -#include "code\datums\diseases\advance\symptoms\itching.dm" -#include "code\datums\diseases\advance\symptoms\laugh.dm" -#include "code\datums\diseases\advance\symptoms\limb_throw.dm" -#include "code\datums\diseases\advance\symptoms\love.dm" -#include "code\datums\diseases\advance\symptoms\moan.dm" -#include "code\datums\diseases\advance\symptoms\oxygen.dm" -#include "code\datums\diseases\advance\symptoms\painkiller.dm" -#include "code\datums\diseases\advance\symptoms\sensory.dm" -#include "code\datums\diseases\advance\symptoms\shedding.dm" -#include "code\datums\diseases\advance\symptoms\shivering.dm" -#include "code\datums\diseases\advance\symptoms\skin.dm" -#include "code\datums\diseases\advance\symptoms\sneeze.dm" -#include "code\datums\diseases\advance\symptoms\symptoms.dm" -#include "code\datums\diseases\advance\symptoms\toxification.dm" -#include "code\datums\diseases\advance\symptoms\uncotrollable.dm" -#include "code\datums\diseases\advance\symptoms\viral.dm" -#include "code\datums\diseases\advance\symptoms\vision.dm" -#include "code\datums\diseases\advance\symptoms\voice_change.dm" -#include "code\datums\diseases\advance\symptoms\vomit.dm" -#include "code\datums\diseases\advance\symptoms\weakness.dm" -#include "code\datums\diseases\advance\symptoms\weight.dm" -#include "code\datums\diseases\advance\symptoms\youth.dm" +#include "code\datums\diseases\viruses\wizarditis.dm" +#include "code\datums\diseases\viruses\advance\advance.dm" +#include "code\datums\diseases\viruses\advance\presets.dm" +#include "code\datums\diseases\viruses\advance\symptoms\beard.dm" +#include "code\datums\diseases\viruses\advance\symptoms\blood.dm" +#include "code\datums\diseases\viruses\advance\symptoms\bones.dm" +#include "code\datums\diseases\viruses\advance\symptoms\booze.dm" +#include "code\datums\diseases\viruses\advance\symptoms\choking.dm" +#include "code\datums\diseases\viruses\advance\symptoms\confusion.dm" +#include "code\datums\diseases\viruses\advance\symptoms\cough.dm" +#include "code\datums\diseases\viruses\advance\symptoms\damage_converter.dm" +#include "code\datums\diseases\viruses\advance\symptoms\deafness.dm" +#include "code\datums\diseases\viruses\advance\symptoms\dizzy.dm" +#include "code\datums\diseases\viruses\advance\symptoms\epinephrine.dm" +#include "code\datums\diseases\viruses\advance\symptoms\fever.dm" +#include "code\datums\diseases\viruses\advance\symptoms\fire.dm" +#include "code\datums\diseases\viruses\advance\symptoms\flesh_eating.dm" +#include "code\datums\diseases\viruses\advance\symptoms\hallucigen.dm" +#include "code\datums\diseases\viruses\advance\symptoms\headache.dm" +#include "code\datums\diseases\viruses\advance\symptoms\heal.dm" +#include "code\datums\diseases\viruses\advance\symptoms\itching.dm" +#include "code\datums\diseases\viruses\advance\symptoms\laugh.dm" +#include "code\datums\diseases\viruses\advance\symptoms\limb_throw.dm" +#include "code\datums\diseases\viruses\advance\symptoms\love.dm" +#include "code\datums\diseases\viruses\advance\symptoms\moan.dm" +#include "code\datums\diseases\viruses\advance\symptoms\oxygen.dm" +#include "code\datums\diseases\viruses\advance\symptoms\painkiller.dm" +#include "code\datums\diseases\viruses\advance\symptoms\sensory.dm" +#include "code\datums\diseases\viruses\advance\symptoms\shedding.dm" +#include "code\datums\diseases\viruses\advance\symptoms\shivering.dm" +#include "code\datums\diseases\viruses\advance\symptoms\skin.dm" +#include "code\datums\diseases\viruses\advance\symptoms\sneeze.dm" +#include "code\datums\diseases\viruses\advance\symptoms\symptoms.dm" +#include "code\datums\diseases\viruses\advance\symptoms\toxification.dm" +#include "code\datums\diseases\viruses\advance\symptoms\uncotrollable.dm" +#include "code\datums\diseases\viruses\advance\symptoms\viral.dm" +#include "code\datums\diseases\viruses\advance\symptoms\vision.dm" +#include "code\datums\diseases\viruses\advance\symptoms\voice_change.dm" +#include "code\datums\diseases\viruses\advance\symptoms\vomit.dm" +#include "code\datums\diseases\viruses\advance\symptoms\weakness.dm" +#include "code\datums\diseases\viruses\advance\symptoms\weight.dm" +#include "code\datums\diseases\viruses\advance\symptoms\youth.dm" #include "code\datums\elements\_element.dm" #include "code\datums\elements\connect_loc.dm" #include "code\datums\elements\waddling.dm" diff --git a/sound/creatures/bee2.ogg b/sound/creatures/bee2.ogg new file mode 100644 index 0000000000000000000000000000000000000000..52315c2c95a67d2d9e905d0e6e0d9314d1f3f879 GIT binary patch literal 7065 zcmcIocT`hNu)m=ODN-WRq$miXha%EDLg=9v3r(a-S5!1o1pyI4Kza*3LBIe8MT!&= zk&XgNl@>q*6jaK)(eL}tdFQ-;-#usd&dhIjc6O&^Z_GVCtpFT|-FKun2=wZvBqPT(>aY_a57vD7n0sqPL~4+m^%IJW$GrOa=FG?}ozN@9tQ zt)>Bb0Dvo2DDJaSUy4bfh5|(Zz#5f;GK9azxSAp2FsNjB zcM7Ucxid2;5wR?2-G}Jmi#CLJas`_yFABOdi7)a+Gs#hW$O1M_okAfAD)e~>5GCxD zh4U)9=9MLOtF*kbNUXB*OL*zZlhVptMHQ8$l_Ww%CBZj5&x?ZQ!7D34)~B+PoKWfg zwzO)ZVWqNRt+&ph^UN$_i~^Cc4`CrJz8m8(xm$+t>ZNR{M?x>Zu$ zI>;teN=%lLd+W%(4fx(Vf)9umRZS4Ux$C`@xz)c*$*T>ky(B_!-Ns}C;ddRLv3Z%) zK*R z;=`~ajf5~mAm9#$AYU3Q@>&IE04avUSs;xIF=HrisnQWgrov}1q!%7D~NatSA{m8C4K1kUpR)B(fGa zg!IFA@*usWN`@RkU8Ysd%(NkG zF_EZ5q!Esoij?@PDhB1~gCEUA87pE^K~jzt&g`mg~=^Z`x-2$PZ^$s>Q@#O z31-oO!ae%6p+dNRWhn01h%$X42BQOq<6ur=BDgU}NdPElg#d!Bbf)p0kYmga41gZU zc8PUzMRy6}xS|HQieaF$aa^D(9L%j>yN4^dUmMO1QlcW!tU7QU*oomVU=2FP2Npix z0gOE#XwV7BUxQqk5V3+GC>1zcvau229tE`$PLP+;{I4*&q@Q%m>Y$j1d>xuycb!4O9v z!NbBCz`F!XU`~_`qrCC1Ogf;S?7`^9jk&G~mW((i62m}1s>@NA0{HY(fNI5Y3a~hJ zn*s#)KL>y*T6*9qHLw0TQ7#7Ye>VXtc1u)_!?-3QmU48Fh_1}wes~vnmdZ;M05qKf zfGh=|uwYjZl|rEgw3jI?R44?LfqVbIHZe=t1O|nKX(=!N)93IR{qor-G}4D>{*K*s%yGF2oFJB%+w8Erttb2j@o(IC_Iw zk3w=sV_X@9(lL(5z?$F#uOMPjV(?BLV`K$xOm0cIB-POv-;k+Hk1H8-^u~9x>L6>0 zVq5cL!4cxPp>5e`Wt9&!4mVPljRt6RUp)|JCxxd191s z{zEZ{{O47n|0o<70o0UAeP&s>xc9WL!fZP=D|q*!0;o)Y`;f>;ODI(|8x)j)@ek~Q zx6EVc2M?|-GO@6-!#KHk`1l1+3;#j?>1h7BeExGOrCdJ2BnN(c;Zu?{GBYzYGq!ee zu(7bQx3xvtTbfy+%*{>BEUi!|TRU@us7bF zffeNLrH?}yH?dB%KtY(l@T{wkk4eQz1Ga;#NT-*d8h*Rpx4LcBKEVQeF8ju|rHXVH zPw(WWe)egT;QjXypgsaGmTlDNSOYgs) z?~C4ZFzn^3(?|%{%gNlvS%@kkITM_vU%+K0_FgzJ>;iXALYyHV;&<0%c0FZ+0qkYy zj;vk06Kz&m+gxHzl=|lf9iJ;3-*N8L8_X5HEjqO69+k@7csxqA{nr2XEuHLTw>u#W zJn+3c_vj#dl2nq zaU=4&zl>CRE(ByjW1CEp2enj>UkH$eee}DL$Op_U9sL6C{#tSdur7~>JMxd4&Ivm)8o&y&y z4nV>7^GybkV|nhvO-w-RjzSV$Q8bztMs4~%(9T7n{={xTh_TO?{NCJnKzcrzrS@f& zlv3cihc&ym1r4+w-{F)M57g5~Yij1R?1%Gbm{aY4KkH}=15(}6OMS~V>T9&N@Sj`V z4eJ|yQ@6VFCrcHoOwO!3PrBF&44F^!zYNoFI+FD6G+0QTN0E0WUDb|n?wxNVluYnh zZ{ZdfQ1gBq`?pNMq`y!W!Gs0Mfn{t5g1_Sq4)1JT z2`bk#XVher%4b-i1)OQm-TN|3-dzkOhl|`8Yk&n?ZYwD1J8iYCJcy*L&+w^TVeIIr zF@+=-UlddQrfpBdP$!`#%`hTQdBfW6sKf%>K_%~@FHinJ+bx>9CR&AfOb_O)lrX9&}d$EDgP zrfo%`-Fj-QG;r-#NdEhGHn6&+>?)Zu)Ag%rVoP4bFz#Dk%G~UaIJo;PB_&|JK(ZU6 z*nFSKnl_ioFO{b?rZu?3+vn8q4BKjrg5Sc!meY@}zo|CCwXbVOu;QL+uKFc?6$Uoj z-%n>h`tHzGyO9y5T$CKN8_x4`*MeEb>XMnkz0dw=8X)0I7{8{aLcZo8^xb1%c^^{h z?pNJ?Dni4Ko!MFXa$e0$M{-PmxVUV|qp#F^4|BFTc*`3dSZStWL^V9MUcIKCbT}2% zNDuqzXBfS4$q=lUMLf%0sC}?{QYSe3fR`lh2Y}~A;aD0`YmL#lxBU=!9 z@Y-B`e%6-%6QbYhvZ_wl{h#tA83ElJo_2?dz@`HY`aO*>B(kVN=hf@oEoIS(3{fR*{i zLg2ocWyFDIo?)KB(fJkC!!;ioi2gRG^Diy>edrZ9EZR;e>=UIGv{eBKa@giD&y2%?LSvtRS3v??J#KX}j`5!Y|)hIh5Hs zTg6OGeudEQ8d7UFZ8O!JkF`!dM$_N#B-F0$h^Muul_iQQ%ERP$pqGc=sn+;IQ~6B9 zy{L6usBcp9nMQBqr^%BgvbE=~-V#`3TP!O(s}*sXoG!#U(!i}Y7IWrKI@{K~cyqWa zn`>syjV!X=#iaY>RvB%YgFdNIDj=1wRaB#}HAwiT3WKE!cJWsQrf$b^D|F;q3E`Yy z(uiA;i-xAv^@Te6;|m`K&DdSi9wd2LMkO@C&~Lku4~k4%m#=+qwi3>&jore$P@W{o^2fNuCGGhlUCQg!8ox7~%Y z)i~~GrAg~qRaBq%_MJJAA2(;2ny(52saXQQN~W8r7^tj$EjHRYQFyR9nh*vI{DJ%D^;?9Rgb9CJo!9OaQ=Ep?6~BS zvsTP5s(E91b64|_S*iy0Wz4Lm$-|93(&FIiOZknLgFG3m-&GArHw;zs#)x0Z5VXX` z`j$nDdF1rrN%4n3sw?cg>PPQ3J8$6xF#OKBEp7$+s0d%x{Jt+ClnGI7zx}X|9$;Bq z*%*!r5xxASMi{a4jAbZnDXlnZP_l(RE8^S4W8bNipp=QLGC-^7jliFzK>B1?>+LwP z58O#WB;BR~PDyTbV&{`W-Wbd7@tO%W4b1#`Rtx|b057B@sC(z?g)YsFS=T4o0H-# z1ZdIswkk}{S~U{RrD@pBZB62~6i$=pauQNJFK7>r(M~>@o-af-{D{hG2`&p&@82_M zubLi(h;Dq>1XAZu&xrnp>~P5ggE6vH+z!ephn|xM67rXt5Yk`24u`xt8T(8_`7 z?xPB!_1gE@#UDf2*|SYNmS`4*igIELeo-gZh&({Y-QL=k09wg5>Ydv=GLVEq8Zx_a zByeYmIY8#;Zg`H#j?%r?S-->>+#+rxM(iW%V$Uv(2`t`W5gnTi+ltu9X4vSu|1w04 zX#RwkCCh6s`ps@&&HAV{fbM>@wEcA!l2yd4Ag&p$4ors|CNU6s`*eq;#%?i@59@1g zst*hXlyjVjdU7OpjQ)Z`wb+U{J0H9aITzww3jRHKPb_JUZ6Y_p^GU16iMIVhJ|MyM z#G*NYUQ`lL^8>z8H=Q~1ZlB&ebkoY@%9!=4lv5*Htk61xpH>kkABO$Q;g1PQ#C>f9NTfXrw9YK&(eR6u^Tek)e`Xbd7BO}m$^7TnuZo1?G{E?{Y zOxyjr`|MOVH;)sqIn%BZ(?>Gzr)d&B7?e)woOceK%gMhg*YfC*vKIth&SuBEoxg?T zb2-Ut^1{XXzRa@@5p=lJ5!5x-5&)82gbvcUW*v(lo9fX4*Wz*CWq32b^7|xQdexPT zzZ`x3BUiUo+Jqr3V6dO}zBxN5S!_c8%WrD5$8-AhEPUx<;#Rd>*X=NN_BaFTR%1a( zq>IhM8vDFpRkFb#kxp8ac*%h~G@`t4zwzzXmTu9n?d0H}4`H*1O7fWT7zb=`f4@ld ziIJMJ^kDH29zvTEBXDVMcJ+Xe!W@|=*CVZyU zucvvEFjv?_UR(0rFk|++EfrjOm?;yeTt*h|T4685eu7r*aq$KwuJcI+AGer>Wwn%@ zn^%hRuC#(6(y&h}La zU2|#PcNZ!hv@1Qc=S1D)O;0B=%nj1M+>CuC-Z5&W3<^b)9K?9 z){u_dJ*ss$cYChREn+o1*W7xNIp6BR;Nhc`QeDn(mDOhspG`nD-zUY_T5@}3S)Tl) z1lC2ge)JAwpy$v%?u1h&nwA3qkg&mQ!Q{VA{`I}$GfJfh8(yW!(M&cp>T5KCbLBn_6>4W`3DvSn{_3~K?~waMtj^j4g+F>g7`Xz6;CoIyC2sYe|Ce^ z#;#D6nQ9~LY6rw-W_w?H@w!-%{y|xl3)ykg+NpWs?9XKVRP`OM<2(Ht%pV`TyP>v^ zxcWR;kKwqvJYi1Toipdk#6n*lhnG%gh3lVBBx{oCgExUNOmq1M zx)gUYV1Hxq%|d>#jUuzJH_3LySux)Ln-c1C{VPxySo>sSl@#0JLlf}>xH%V z&YC2XWHK|EnFM(=Gi4As=-&-oD3Z73`~rSkN|)P_?Xxl*%_NS z@B)QKKp_(g>uV{IwT0n74N-tP1`bXZj!wMFcFwlOM8ehtjW6Y$dn{MAf!OtehK5>5P=44r74XrGKEqMB%%=$!NeJ^?_kWuldu2oAttY~WI7Rz1|ik{8H@aRD%kR~WL;f4)Sy%z;utSp1-E zMoz@QUCw*FAW<$2WB_(R6!c!GB_r?~7f_juO+q0Mn(F{BsE3X!BA}PC1v3bejVdZ& zhjDNw5J4y`BT$m<9w*35&<*pSKF9j7B4$S- zflM=j{O#Eb|4KJp_x3QqHJ1Q^6ciCf?a^W0+8KjDuz8#j#TpUC<`Mg0F|a`)-@rkB zAP}(7$gIN3JmN_r<0`82O*YH_>(Ndz!G3EF&=7gb!n7PZj1dAG`fVM6Vfdj$F!uWW zhsb_dQb+}Gm0ast+j*Ku8B(=e_*oK-?g^O@tz7$Aj$=c6SxjRWdiy%+ zJH*REdwnhIXidqS=mT={{fBE=$p5YKR_~3-zFP(`zPL}m)gygEWa>p0rmgH%Qnq26)37?@+Rq4VP}8!iY*dn>E>2Q{f1@7}Kzku* zY~wh^SImZC)TLPt@HA!rkdx?jX+R+POT0-G{Qr3_@WxTd6;XkQewvwWT3J-p*#F#A6fq3*|W9N{`3OG5t7G=T*LeL)w0 z<2T7VGU+L@(J4ClD^__lUPW}#X;#%q3>`%d8%1`LX*L~Yb{$nU8}$?$?I!2tRFma9 z@Ad!n=)k;95fudDP9UXDAfZm!=8Pee6fhs80SQ3AN@TpydxMB@brs_yiU()f1)Kp@1S8uZ~wJXuuo zStWW^W%^kq(OG5H|6h`wW|c()2n*;jFwlgS<49#{jNrky)IqAEym>jUy`uRMs(`G0 zWG17u0VO73#Qqe)pd=`OXpkU9K(3eunR@XY#w3r(M8~*j@QeGo#LEk36s2lQv_44{ zH>p@{X92IjsEW0uEAWd|tiIL)jX*HK2O)nV4g*X89R%`6RD!1tPBI*$-j7rI#kGfL z7{OJVWi-Y`m7Vm9i!wVAmAV*srQXj<8k5}1N}Q6U0{Ei~4EP99u^NklkSReMU+`oT zS!L15Wzj_C(RJq0L}!y(M_JhvRa9lsWoK1XH8EvXQ^;jmWM$D+mC;01F;taPWK|nY z##wC^Ra93oRcD(_v~RuDQ=C^>WEWpwfl_DSRj0{jHTA!!ROeMxm)U_*Hbo~LMO70` z0JDpZ=De!ZKuaclG8G;1DX|4RFze4v{81p(MA)U$55S35mj~uuz2e^n=H*y?dCb=vY&+ZZkL z)m4)sig(t~=`6Fib;_nWuO8qEZ*qjNPB+*9_*R{C^irKy&5zp@R8)1;O&0G|)o;Cl zL2TZ7uVbms-vJ~KnN7(yxbrSPLr7L_3I;~7pJt<@;j?}4)XD7RtPQlS9qFv%X}5O@ z;R9qI8V>{lm!X0P4*3QP+JXdO1!W1#2!^2t0;+&IC{C#tD`kO$K`OGm7)RTRO)N@qFe@>E zi?TTBtzd+UCOZ&Np@5>(qNDE9;G!fCjFEyNE>4h=Auq-frm0O%G6V`1w5(hE(j2LZ z`x2zA$%{3#Ww@HK9AjQPr+n+YxKT;TD%nv9KxKj?MFXIcl41fz1)xF_k^)dEO97)Y zq@|wKkg}`=P)Re*DJVq(1=3PX04m$s-8n&X`XW>#D)N3zqpHeA9AWBzI-kWfs_b~} zoV-6lD*Cna=vF`-%GK^>Xnkw#Td=Zey~%K#C~wqKmT7$*RV$RH<5@@G1TgbH1*xdY zMlJ0quF!uwk7xu?S=HVG1pq2(DYhmos~EQ146O>Fz{;|AFT?SiX>UQd2 z5|mzZO7O)+2})M^NlHqVm4MuXzsfx>D>)_%AhzV7ICzl$7rfz19z|BwMHjlEE0IZ7 zK(g@PAb|AQ4F3ahc3yp}qw1`qb0?z61~4$d;JiR90HS&8J+1NvX$sb3RaFNdDJJV0 zIVIvs z|FP2kPYw!nFV6|O=U>R9uH_WSC#D7S1CVxM6{k5Ma>G%xMR7srCnW)tGKgY=EiRhT zl1_F+mXa)QTrm8W6{w&jRoRDQ1n|_H*03 z({eoTNS!nM#W1Usxd@?L*?`P0P=a~&aX|VY(0dSQ016pp5>G6oA6h(g07e3^hJn-q z>Vg4v5rd0}u!hFx*LF{CUVxzjM#{el5)$$)2k;>X67nAxs_Xkdg|9BuD?ES@ERzkF z03V;6EGr^1G%P4ODkMBSG&CY4GCDXcAT~7A9{>i0g~vq4#)iiNRs4a1@KA4mudxZz z=|pjeAm3;r3#xC?N^Mm(0fN6*_sKzCW31UW4>s>$ldh6nzVf9rUgRhX>BeTo>gT?d zV%e6sqB3sO1+hM9S-kUV{SdJ7{?YXm%-tQzYb+_p;L$l85=^#jTHiW8k-zBqqa{Lz zq7=a#_=p^C;?u*ti1NJPpXuC-9D-g?T;5sA95OY(-6;n9ncJmUeh}VlQ2O=VI(66g z9UnUNAM$1;Z2SFbH%0bl{fo0esxKu6wKbDnyOGoj$@Z9W^R&&sb4t6SfoUJdXWU#W4hUEddKE1ulL+|pcj%OfSvm%x| zhlMLvIop>dJieA2Iz;|b`VnqWd)x1p-0KcW%|D99ObCHw3HF119N&I2GgB8I7jgSZ zvD>5_yC$(XTK^XHUQkdZ%suLZ$-IZK3O1kR;pn2$bIAub3TCNo83U@m+hQY%@3 zg;+;@`mJIAizs#;PUCkRy*}r@bjR);bzyw1-Fwl#7WfD zg&Ls0lA~;K+@z{JQa-zbpZBjIY+f*gHO1F;Hq$-@*hjzF_xe?u@_|i)oQaxwU@Qb_ z%_GC7?V^<~h%&33XTdsYuJNrU9u4#p&0- zv_$g-8_ii-pbOB#&&&wv(pPEaUO0ky@UcGd(!>LNk{iEaY+^LdMQrm-*$- zmX%7!evUA%}Hl$fTH zI~I4@<0zMO_-?CC z`oHZs3*W|pt8d^?L{NKiPoB%AE}E=y6A;&r6izY8=AQ4+sfN4fI6=lY8j7lpFAwY% z@`Bc|g5BUSCKPQy&(vR>e4IL8CirWn0tvGZ5tIRo^V^+*M(uoFA~am~yND%< zp?at{!Y-w2#)9i(^Q|B=Nfx_Y5$TUK_WU zd9!2b@6BT<-?P)yF?J1P*<|nHFZ^=*OikiJsxw^h9`gp|bHB5JVk)%WnwfMuIj{{= z`!^?VFT;WXbUmT~{>md&bEfX(7Gzi#nfv#BeGX!lnczi^855d?mST>qEKM)^wK%M# z56J`f3Fi6T%(l#K;bk*D)T%m_v^mNJTwH!63(&a?pSh&zmXxDBG^)vprtSmZ{mER? zN|u2csFeICp?LBPDO>J(NA7>1WG_d3Zu z64LT^RI8(G)Ohz4ZOizLc42nSOz~mg*agO>!C@`ZU9?TEH!lX=L81!g_ej=sCsju& z#K2yJh8BNX^s4D02wDJYIHDF# z|4dvc?059u^D=iy&_@P&a9}gPGAZ)*LO%E__fP-o3d96O-=DL}B>v9U%e(v5zv#vN z|2Vb1;0Iw`nq`^PdapRs>!7WMpRaB(pgOD%OBf@j6Lb>5{jkpb8Ws%aUea6$r(HA? z0`AjHcF&R|7`m!9MZjj8l|5~JVsLv@!;bX2yUbkSPG2OOYkS!GT+RG=Uo|)H9i^#z zwk;&SHQL0?QcorFfst;Gd)|8ekGj%k?BL*|)n!>b-#u@@{kq~Qd1hLiP4=jn1_b9wa4*4hGT#0bu*>n(|G(?mhcV=588av2S_)A)l%cdvw@btF7md&hp$dDcs!B zOty(8w$SCzY05yt2Ksh)zrb- zugTfz^N!_Y%^f?#G2=^(TMCCnBe$>2J**gQ%F~MnTZgDJ_Xf<@2Z{y-bJHkj3=m(- zP9MEf=-L_ux#ytUX_MDS4IdbC{297yTXfP_Zf#lJZrfY*eISIpEWlOvHLgGvP(*d> zXY0e`AI>St&7UruU@E?bzLvb>wW1*ojz8I{*UB#$be8x9JJ9%)fPe3z$8kr96G|oq zUx_mN#I?8|OD9B;UfDqEbfhYmxJ5VMZFp zza%u_bzwHHh&rXDqouNoHM|3|XgGcbxr3Y9f)$HK%Rw#)Ohch%w@Q-3*3;IgCcO(Y zZ2TBC<87$VsjZzv{XlhRVr~+a_P15mzoxLpm7+m;#ES(%`UdIU7sK|mpx}rN#NkvU zcCfYPok{v8yz=ww8qVcU=<;iG{KW2D`N~FM9d1l-+wR1#?VR#xb*YjS{)^taZvg=a zUUuQ|l_NF>CNR+}heQ|t-y0h0##`T~7ItP=_D^J#!wDP4LFN}JzB4s-$$7};`SYc$ z@Liq9D2kc(C(+3|euL~F+9VnY*-c435uu3;Pp-_Fbh*b8LtHH=Kx!(bzXYCLfINdP z(#B+Mm_A-pfEJC~V4(p%jYiPsyTh~Ox^8!#`w-jp4lc-R0G;2-2N~(sk8#WA5=M^U z94h3JTz)A2aA~^2vVG-}l2}$hRE7DAmY_xD zH^8R0@(4HI+_r*_5r#yTOl!La2eV%H+^)w*I9eMQu}@(+;&m#gA*N|vNTRwUr2*D< z{fP$7eq6+xVM&DF`@U%`NDMpmtEY2G=fO3LXZTl#2Q2w6Mmz2}Z5}zlSiLZ``n3B( zum{n$2=T9#7B-CyHm=rLF2e@MbOGJ2Jt($-#=U%(AB6%!PieRLxpfr2vZ3w5& zi95LFWh>7Q`WXckYUsug&?R8Lw5<2U`ks(x1YbTy6AHG+^nDGT^Cht0Lsv52Mj819 z-oWF2tlq6{|6bmPZfh`1ZBVL!%&Bf&XYR5%b$qpt`k||PA*iiV$IC${bC6XJM9@OE zfsPWqH0^?Ld$8HaU+Do~DpS-4H4|siL-o2GGdgOyf6XL~|GbZOJ4!^=8IyQIz77wO ztICFLiy}D=^a*h@HVuW5EA2Zxo@3HarI0M1h>tW9`w}-g1R?$1_y}oimsn%2JyX^G z*|;DY5{beEI3b{K!;(6dBvZ$(zN8Olke~TSdV_%K2so+M)O!6HA@=gj{tlsj~#fxu20@svS0G z?HtbBN1)g5bEFElGdoYJev2XVFS4%{r=SuYBA3kA(k>#`;38UQi%A|My&3wz{M9*x z2QK;eheWkD=FAs@rMY(JKI4xU$P3U7ri-WT03Ag1;W8$aV-~Gq2?*{Uc(wfDZo@c1 zRFWM%g;RaRDN5nGuso7BIz?C0Y8t93a{ z!(v1+S?y}tXLLm))qQ6(M0$G`#PHsLN%&}5MI>mzP~>onN;0UP(;~FO5KZJ;g+qO~ zTIl{Q$)F*a?t)4e>esySFC)umRJO~6KW|KNK2Ay_lE3l<<2c)Nm5ua|jFS0%GF#DU zjH)1d4A2b$1`SCp?{KYwh10I24CwJ!Cf=w0fqQ>9vkyt`3n4i?*7|hgWqh=4blh7o zEr}{EnPTCdX{0&iZmWM0rq_FTsBQS3W{(QB+6+x%kq#@2?Prw1bnhEBGPHuHjP6)( ze}91jF&ZU^=3!6vz1d%MQhssgyt&NOD&v6>b8Lb4eP>EXV##{@T3{m`4xSk%yRi|C z0~F0NA#QqyxRW}bYj+1#LR6Gmm?)E}iqXM(J6X#KO_TPv;fH-bw7-4?*}iO0DLvg8 zwUM?j3A@ZNa*p@L89ANMYvNwm;my66bsmuQqM8cYO&e5L$MWRd=dH6hzSAj^TNYp( zZX0-0>Km!6oo1y9kwjuFQeh(u!(dLPxfYo=a^IuyK0M$t?(l55*w%e;JXGI6`%5HS zcG$j(p6-~>dR%++TcK19jvH+z4sif3vc5A30zqY}$FZ!}sHB#?nI^J=3+||^bFcHl zvGFtyz?iY3T&l09Y5+36R!msPJaZBi(UVdA|w}-Hq zEE4Vm|L$vAmb?*heI@o~E6&$UYy0)n2jbkQE
  • o(~42_^1j0=}$5ryR2S3?nkY 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 literal 0 HcmV?d00001 diff --git a/sound/effects/magnitis.ogg b/sound/effects/magnitis.ogg new file mode 100644 index 0000000000000000000000000000000000000000..407f986e01cd13dbcc99eec5477430bd8d12655b GIT binary patch literal 33748 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