From baa528cb05fe9fe6a7f775c5d421dbd771f6fe42 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Fri, 23 Feb 2024 00:03:25 -0500 Subject: [PATCH 01/90] Make ammo magazines lazy-initialize --- .../mechs/equipment/combat_projectile.dm | 4 +-- code/modules/projectiles/ammunition.dm | 35 ++++++++++++++----- code/modules/projectiles/ammunition/boxes.dm | 1 + code/modules/projectiles/guns/projectile.dm | 20 +++++++---- .../projectiles/guns/projectile/automatic.dm | 2 +- .../projectiles/guns/projectile/dartgun.dm | 9 ++--- 6 files changed, 49 insertions(+), 22 deletions(-) diff --git a/code/modules/mechs/equipment/combat_projectile.dm b/code/modules/mechs/equipment/combat_projectile.dm index 040ff1497f1..05e608852f3 100644 --- a/code/modules/mechs/equipment/combat_projectile.dm +++ b/code/modules/mechs/equipment/combat_projectile.dm @@ -17,11 +17,11 @@ /obj/item/gun/projectile/automatic/get_hardpoint_status_value() if(!isnull(ammo_magazine)) - return ammo_magazine.stored_ammo.len + return ammo_magazine.get_stored_ammo_count() /obj/item/gun/projectile/automatic/get_hardpoint_maptext() if(!isnull(ammo_magazine)) - return "[ammo_magazine.stored_ammo.len]/[ammo_magazine.max_ammo]" + return "[ammo_magazine.get_stored_ammo_count()]/[ammo_magazine.max_ammo]" return 0 //Weapons below this. diff --git a/code/modules/projectiles/ammunition.dm b/code/modules/projectiles/ammunition.dm index f8488ea20b3..fc8685eafcf 100644 --- a/code/modules/projectiles/ammunition.dm +++ b/code/modules/projectiles/ammunition.dm @@ -146,9 +146,25 @@ var/list/icon_keys = list() //keys var/list/ammo_states = list() //values + /// Determines whether or not we wait until the first time our contents are gotten to initialize contents. May lead to icon bugs if not handled delicately. + var/lazyload_contents = TRUE + /// Whether or not our contents have been initialized or not, used in lazyloaded contents. + var/contents_initialized = FALSE + /obj/item/ammo_magazine/box w_class = ITEM_SIZE_NORMAL +/obj/item/ammo_magazine/proc/create_initial_contents() + if(contents_initialized || !initial_ammo || !ammo_type) + return + for(var/i in 1 to initial_ammo) + stored_ammo += new ammo_type(src) + +/obj/item/ammo_magazine/proc/get_stored_ammo_count() + . = length(stored_ammo) + if(!contents_initialized) + . += initial_ammo + /obj/item/ammo_magazine/Initialize() . = ..() if(multiple_sprites) @@ -157,9 +173,8 @@ if(isnull(initial_ammo)) initial_ammo = max_ammo - if(initial_ammo) - for(var/i in 1 to initial_ammo) - stored_ammo += new ammo_type(src) + if(!lazyload_contents) + create_initial_contents() if(caliber) LAZYINSERT(labels, caliber, 1) if(LAZYLEN(labels)) @@ -172,7 +187,7 @@ if(C.caliber != caliber) to_chat(user, "[C] does not fit into [src].") return - if(stored_ammo.len >= max_ammo) + if(get_stored_ammo_count() >= max_ammo) to_chat(user, "[src] is full!") return if(!user.try_unequip(C, src)) @@ -183,6 +198,7 @@ else ..() /obj/item/ammo_magazine/attack_self(mob/user) + create_initial_contents() if(!stored_ammo.len) to_chat(user, "[src] is already empty!") return @@ -197,6 +213,7 @@ /obj/item/ammo_magazine/attack_hand(mob/user) if(!user.is_holding_offhand(src) || !user.check_dexterity(DEXTERITY_HOLD_ITEM, TRUE)) return ..() + create_initial_contents() if(!stored_ammo.len) to_chat(user, SPAN_NOTICE("\The [src] is already empty!")) return TRUE @@ -213,18 +230,20 @@ /obj/item/ammo_magazine/on_update_icon() . = ..() if(multiple_sprites) - //find the lowest key greater than or equal to stored_ammo.len + //find the lowest key greater than or equal to our ammo count var/new_state = null + var/self_ammo_count = get_stored_ammo_count() for(var/idx in 1 to icon_keys.len) - var/ammo_count = icon_keys[idx] - if (ammo_count >= stored_ammo.len) + var/icon_ammo_count = icon_keys[idx] + if (icon_ammo_count >= self_ammo_count) new_state = ammo_states[idx] break icon_state = (new_state)? new_state : initial(icon_state) /obj/item/ammo_magazine/examine(mob/user) . = ..() - to_chat(user, "There [(stored_ammo.len == 1)? "is" : "are"] [stored_ammo.len] round\s left!") + var/self_ammo_count = get_stored_ammo_count() + to_chat(user, "There [(self_ammo_count == 1)? "is" : "are"] [self_ammo_count] round\s left!") //magazine icon state caching var/global/list/magazine_icondata_keys = list() diff --git a/code/modules/projectiles/ammunition/boxes.dm b/code/modules/projectiles/ammunition/boxes.dm index 1d1bf7a0cb0..43f6f7fb6c1 100644 --- a/code/modules/projectiles/ammunition/boxes.dm +++ b/code/modules/projectiles/ammunition/boxes.dm @@ -66,6 +66,7 @@ /obj/item/ammo_magazine/shotholder/attack_hand(mob/user) if(loc != user || user.a_intent != I_HURT || !length(stored_ammo) || !user.check_dexterity(DEXTERITY_HOLD_ITEM, TRUE)) return ..() + create_initial_contents() var/obj/item/ammo_casing/C = stored_ammo[stored_ammo.len] stored_ammo -= C user.put_in_hands(C) diff --git a/code/modules/projectiles/guns/projectile.dm b/code/modules/projectiles/guns/projectile.dm index 0954d63ee06..d861b96969e 100644 --- a/code/modules/projectiles/guns/projectile.dm +++ b/code/modules/projectiles/guns/projectile.dm @@ -68,10 +68,16 @@ chambered = loaded[1] //load next casing. if(handle_casings != HOLD_CASINGS) loaded -= chambered - else if(ammo_magazine && ammo_magazine.stored_ammo.len) - chambered = ammo_magazine.stored_ammo[ammo_magazine.stored_ammo.len] - if(handle_casings != HOLD_CASINGS) - ammo_magazine.stored_ammo -= chambered + else if(ammo_magazine) + if(!ammo_magazine.contents_initialized && ammo_magazine.initial_ammo > 0) + chambered = new ammo_magazine.ammo_type(src) + if(handle_casings == HOLD_CASINGS) + ammo_magazine.stored_ammo += chambered + ammo_magazine.initial_ammo-- + else if(ammo_magazine.stored_ammo.len) + chambered = ammo_magazine.stored_ammo[ammo_magazine.stored_ammo.len] + if(handle_casings != HOLD_CASINGS) + ammo_magazine.stored_ammo -= chambered if (chambered) return chambered.BB @@ -232,7 +238,7 @@ /obj/item/gun/projectile/afterattack(atom/A, mob/living/user) ..() - if(auto_eject && ammo_magazine && ammo_magazine.stored_ammo && !ammo_magazine.stored_ammo.len) + if(auto_eject && ammo_magazine && !ammo_magazine.get_stored_ammo_count()) ammo_magazine.dropInto(loc) user.visible_message( "[ammo_magazine] falls out and clatters on the floor!", @@ -257,8 +263,8 @@ var/bullets = 0 if(loaded) bullets += loaded.len - if(ammo_magazine && ammo_magazine.stored_ammo) - bullets += ammo_magazine.stored_ammo.len + if(ammo_magazine) + bullets += ammo_magazine.get_stored_ammo_count() if(chambered) bullets += 1 return bullets diff --git a/code/modules/projectiles/guns/projectile/automatic.dm b/code/modules/projectiles/guns/projectile/automatic.dm index a7614db6028..eaaf90ed248 100644 --- a/code/modules/projectiles/guns/projectile/automatic.dm +++ b/code/modules/projectiles/guns/projectile/automatic.dm @@ -72,7 +72,7 @@ /obj/item/gun/projectile/automatic/assault_rifle/update_base_icon() if(ammo_magazine) - if(ammo_magazine.stored_ammo.len) + if(ammo_magazine.get_stored_ammo_count()) icon_state = "[get_world_inventory_state()]-loaded" else icon_state = "[get_world_inventory_state()]-empty" diff --git a/code/modules/projectiles/guns/projectile/dartgun.dm b/code/modules/projectiles/guns/projectile/dartgun.dm index e9c9ff591dd..3c0c3512556 100644 --- a/code/modules/projectiles/guns/projectile/dartgun.dm +++ b/code/modules/projectiles/guns/projectile/dartgun.dm @@ -37,13 +37,13 @@ /obj/item/gun/projectile/dartgun/on_update_icon() ..() if(ammo_magazine) - icon_state = "[get_world_inventory_state()]-[clamp(length(ammo_magazine.stored_ammo.len), 0, 5)]" + icon_state = "[get_world_inventory_state()]-[clamp(length(ammo_magazine.get_stored_ammo_count()), 0, 5)]" else icon_state = get_world_inventory_state() /obj/item/gun/projectile/dartgun/adjust_mob_overlay(mob/living/user_mob, bodytype, image/overlay, slot, bodypart, use_fallback_if_icon_missing = TRUE, skip_offset = FALSE) if(overlay && (slot in user_mob?.get_held_item_slots()) && ammo_magazine) - overlay.icon_state += "-[clamp(length(ammo_magazine.stored_ammo.len), 0, 5)]" + overlay.icon_state += "-[clamp(length(ammo_magazine.get_stored_ammo_count()), 0, 5)]" . = ..() /obj/item/gun/projectile/dartgun/consume_next_projectile() @@ -121,8 +121,9 @@ dat += " \[Eject\]
" if(ammo_magazine) - if(ammo_magazine.stored_ammo && ammo_magazine.stored_ammo.len) - dat += "The dart cartridge has [ammo_magazine.stored_ammo.len] shots remaining." + var/stored_ammo_count = ammo_magazine?.get_stored_ammo_count() + if(stored_ammo_count) + dat += "The dart cartridge has [stored_ammo_count] shot\s remaining." else dat += "The dart cartridge is empty!" dat += " \[Eject\]
" From 1c5aeb317ce3b3697a76da2b5bdee310f9e716d9 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sat, 8 Jun 2024 11:31:39 +1000 Subject: [PATCH 02/90] Fixes reboot spam. --- code/game/world.dm | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/code/game/world.dm b/code/game/world.dm index 58ee2cd4041..ad271f0f087 100644 --- a/code/game/world.dm +++ b/code/game/world.dm @@ -128,6 +128,13 @@ var/global/world_topic_last = world.timeofday return TC.try_use(T, addr, master, key) /world/Reboot(var/reason) + + if(get_config_value(/decl/config/toggle/wait_for_sigusr1_reboot) && reason != 3) + text2file("foo", "reboot_called") + to_world("World reboot waiting for external scripts. Please be patient.") + global.Master.restart_timeout = 5 MINUTES + return + if(global.using_map.reboot_sound) sound_to(world, sound(pick(global.using_map.reboot_sound)))// random end sounds!! - LastyBatsy @@ -138,11 +145,6 @@ var/global/world_topic_last = world.timeofday for(var/client/C in global.clients) to_chat(C, link("byond://[serverurl]")) - if(get_config_value(/decl/config/toggle/wait_for_sigusr1_reboot) && reason != 3) - text2file("foo", "reboot_called") - to_world("World reboot waiting for external scripts. Please be patient.") - return - game_log("World rebooted at [time_stamp()]") callHook("reboot") From 91d83212e4f0c9c2144e5068bce12e908548bf6f Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sat, 8 Jun 2024 11:38:03 +1000 Subject: [PATCH 03/90] Condensing remove_implant(). --- code/modules/mob/living/carbon/human/human.dm | 3 ++ code/modules/mob/living/living.dm | 36 ++++++++++++++++ code/modules/mob/living/silicon/silicon.dm | 6 +++ code/modules/mob/mob.dm | 41 +------------------ mods/mobs/borers/mob/overrides.dm | 17 ++++---- 5 files changed, 55 insertions(+), 48 deletions(-) diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 7ec1683bb9c..9f0b265cc44 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -1295,3 +1295,6 @@ var/turf/old_turf = old_loc old_turf.AddTracks(species.get_move_trail(src), bloodDNA, 0, dir, bloodcolor) // Going +/mob/living/carbon/human/remove_implant(obj/item/implant, surgical_removal = FALSE, obj/item/organ/external/affected) + if((. = ..()) && !surgical_removal) + shock_stage += 20 diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 6284ebe758b..bdf485e9fc4 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -1477,3 +1477,39 @@ default behaviour is: /mob/living/throw_at(atom/target, range, speed, mob/thrower, spin = TRUE, datum/callback/callback) //If this returns FALSE then callback will not be called. return !length(pinned) && ..() + +/mob/living/remove_implant(obj/item/implant, surgical_removal = FALSE, obj/item/organ/external/affected) + + LAZYREMOVE(embedded, implant) + + if(!LAZYLEN(get_visible_implants(0))) //Yanking out last object - removing verb. + verbs -= /mob/proc/yank_out_object + + for(var/obj/item/O in pinned) + if(O == implant) + LAZYREMOVE(pinned, O) + if(!LAZYLEN(pinned)) + anchored = FALSE + implant.dropInto(loc) + implant.add_blood(src) + implant.update_icon() + if(istype(implant,/obj/item/implant)) + var/obj/item/implant/imp = implant + imp.removed() + + if(!affected) //Grab the organ holding the implant. + for(var/obj/item/organ/external/organ in get_external_organs()) + for(var/obj/item/O in organ.implants) + if(O == implant) + affected = organ + break + if(affected) + LAZYREMOVE(affected.implants, implant) + for(var/datum/wound/wound in affected.wounds) + LAZYREMOVE(wound.embedded_objects, implant) + if(!surgical_removal) + affected.take_external_damage((implant.w_class * 3), 0, DAM_EDGE, "Embedded object extraction") + if(!BP_IS_PROSTHETIC(affected) && prob(implant.w_class * 5) && affected.sever_artery()) //I'M SO ANEMIC I COULD JUST -DIE-. + custom_pain("Something tears wetly in your [affected.name] as [implant] is pulled free!", 50, affecting = affected) + + return TRUE diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm index 4debeb58aac..43d73771cee 100644 --- a/code/modules/mob/living/silicon/silicon.dm +++ b/code/modules/mob/living/silicon/silicon.dm @@ -466,3 +466,9 @@ /mob/living/silicon/get_dexterity(var/silent) return dexterity + +/mob/living/silicon/robot/remove_implant(var/obj/item/implant, var/surgical_removal = FALSE, obj/item/organ/external/affected) + . = ..() + if(.) + adjustBruteLoss(5, do_update_health = FALSE) + adjustFireLoss(10) diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 28d9cc0d633..88f08f75b1e 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -811,45 +811,8 @@ /mob/proc/embedded_needs_process() return !!LAZYLEN(embedded) -/mob/proc/remove_implant(var/obj/item/implant, var/surgical_removal = FALSE) - if(!LAZYLEN(get_visible_implants(0))) //Yanking out last object - removing verb. - verbs -= /mob/proc/yank_out_object - for(var/obj/item/O in pinned) - if(O == implant) - LAZYREMOVE(pinned, O) - if(!LAZYLEN(pinned)) - anchored = FALSE - implant.dropInto(loc) - implant.add_blood(src) - implant.update_icon() - if(istype(implant,/obj/item/implant)) - var/obj/item/implant/imp = implant - imp.removed() - . = TRUE - -/mob/living/silicon/robot/remove_implant(var/obj/item/implant, var/surgical_removal = FALSE) - LAZYREMOVE(embedded, implant) - adjustBruteLoss(5, do_update_health = FALSE) - adjustFireLoss(10) - . = ..() - -/mob/living/carbon/human/remove_implant(var/obj/item/implant, var/surgical_removal = FALSE, var/obj/item/organ/external/affected) - if(!affected) //Grab the organ holding the implant. - for(var/obj/item/organ/external/organ in get_external_organs()) - for(var/obj/item/O in organ.implants) - if(O == implant) - affected = organ - break - if(affected) - LAZYREMOVE(affected.implants, implant) - for(var/datum/wound/wound in affected.wounds) - LAZYREMOVE(wound.embedded_objects, implant) - if(!surgical_removal) - shock_stage+=20 - affected.take_external_damage((implant.w_class * 3), 0, DAM_EDGE, "Embedded object extraction") - if(!BP_IS_PROSTHETIC(affected) && prob(implant.w_class * 5) && affected.sever_artery()) //I'M SO ANEMIC I COULD JUST -DIE-. - custom_pain("Something tears wetly in your [affected.name] as [implant] is pulled free!", 50, affecting = affected) - . = ..() +/mob/proc/remove_implant(obj/item/implant, surgical_removal = FALSE, obj/item/organ/external/affected) + return FALSE /mob/proc/yank_out_object() set category = "Object" diff --git a/mods/mobs/borers/mob/overrides.dm b/mods/mobs/borers/mob/overrides.dm index d573466ba57..7f8577a9624 100644 --- a/mods/mobs/borers/mob/overrides.dm +++ b/mods/mobs/borers/mob/overrides.dm @@ -36,15 +36,6 @@ borer.detach_from_host() . = ..() -/mob/living/carbon/remove_implant(var/obj/item/implant, var/surgical_removal = FALSE) - . = ..() - if(. && !QDELETED(implant) && isborer(implant)) - var/mob/living/simple_animal/borer/worm = implant - if(worm.controlling) - release_control() - worm.detach_from_host() - worm.leave_host() - /obj/item/glass_jar/Initialize() accept_mobs |= /mob/living/simple_animal/borer . = ..() @@ -55,3 +46,11 @@ var/mob/living/simple_animal/borer/B = HAS_BRAIN_WORMS(src) if(B && B.controlling) B.detach_from_host() + +/mob/living/carbon/human/remove_implant(obj/item/implant, surgical_removal = FALSE, obj/item/organ/external/affected) + if((. = ..()) && !QDELETED(implant) && isborer(implant)) + var/mob/living/simple_animal/borer/worm = implant + if(worm.controlling) + release_control() + worm.detach_from_host() + worm.leave_host() From 366314934c8dfd1bc50c8a0f71e854bfc733d5e7 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Sun, 9 Jun 2024 18:12:42 -0400 Subject: [PATCH 04/90] Fix plant harvest overlays --- code/game/objects/structures/flora/plant.dm | 2 +- code/modules/hydroponics/seed_appearance.dm | 7 ++++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/code/game/objects/structures/flora/plant.dm b/code/game/objects/structures/flora/plant.dm index fafc52568bb..58ccf91a19e 100644 --- a/code/game/objects/structures/flora/plant.dm +++ b/code/game/objects/structures/flora/plant.dm @@ -56,7 +56,7 @@ . = ..() icon_state = "blank" color = null - set_overlays(plant.get_appearance(dead = dead, growth_stage = growth_stage, can_harvest = length(harvestable))) + set_overlays(plant.get_appearance(dead = dead, growth_stage = growth_stage, can_harvest = !!harvestable)) /obj/structure/flora/plant/attackby(obj/item/O, mob/user) diff --git a/code/modules/hydroponics/seed_appearance.dm b/code/modules/hydroponics/seed_appearance.dm index 4db240a4796..97350040b7b 100644 --- a/code/modules/hydroponics/seed_appearance.dm +++ b/code/modules/hydroponics/seed_appearance.dm @@ -16,18 +16,19 @@ if(SSplants.plant_icon_cache[ikey]) dead_overlay = SSplants.plant_icon_cache[ikey] else - dead_overlay = image('icons/obj/hydroponics/hydroponics_growing.dmi', "[ikey]") + dead_overlay = image('icons/obj/hydroponics/hydroponics_growing.dmi', ikey) dead_overlay.color = DEAD_PLANT_COLOUR SSplants.plant_icon_cache[ikey] = dead_overlay return dead_overlay /datum/seed/proc/get_harvest_appearance() if(!harvest_overlay) - var/ikey = "product-[get_trait(TRAIT_PRODUCT_ICON)]-[get_trait(TRAIT_PLANT_COLOUR)]" + var/icon_state = get_trait(TRAIT_PRODUCT_ICON) + var/ikey = "product-[icon_state]-[get_trait(TRAIT_PLANT_COLOUR)]" if(SSplants.plant_icon_cache[ikey]) harvest_overlay = SSplants.plant_icon_cache[ikey] else - harvest_overlay = image('icons/obj/hydroponics/hydroponics_products.dmi', "[ikey]") + harvest_overlay = image('icons/obj/hydroponics/hydroponics_products.dmi', icon_state) harvest_overlay.color = get_trait(TRAIT_PRODUCT_COLOUR) SSplants.plant_icon_cache[ikey] = harvest_overlay return harvest_overlay From 5f80c0268e89fa31f1641b6cb034ff9cd0d57c5e Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Tue, 9 Apr 2024 19:30:49 +1000 Subject: [PATCH 05/90] Removing remaining use of /carbon. --- code/__defines/mobs.dm | 4 +- code/_global_vars/lists/clothing.dm | 6 + code/game/atoms_movable.dm | 6 +- code/game/gamemodes/cult/narsie.dm | 2 +- code/game/gamemodes/cult/ritual.dm | 2 +- code/game/gamemodes/cult/runes.dm | 6 +- code/game/machinery/Sleeper.dm | 2 +- code/game/machinery/computer/prisoner.dm | 4 +- code/game/machinery/cryopod.dm | 2 +- code/game/machinery/doors/airlock.dm | 2 +- .../machinery/doors/airlock_interactions.dm | 2 +- code/game/machinery/hologram.dm | 14 +- code/game/machinery/jukebox.dm | 2 +- code/game/machinery/newscaster.dm | 2 +- code/game/machinery/oxygen_pump.dm | 20 +- code/game/objects/items/_item_damage.dm | 2 +- code/game/objects/items/devices/flash.dm | 4 +- .../game/objects/items/devices/radio/radio.dm | 2 +- .../items/flame/flame_fuelled_lighter.dm | 2 +- code/game/objects/items/toys.dm | 2 +- code/game/objects/items/weapons/autopsy.dm | 2 +- .../items/weapons/grenades/flashbang.dm | 4 +- code/game/objects/items/weapons/handcuffs.dm | 2 +- .../items/weapons/implants/implantchair.dm | 2 +- .../items/weapons/implants/implants/chem.dm | 2 +- .../weapons/implants/implants/freedom.dm | 6 +- .../game/objects/items/weapons/tanks/tanks.dm | 4 +- code/game/objects/items/weapons/weaponry.dm | 2 +- code/game/sound.dm | 2 +- code/modules/admin/verbs/debug.dm | 2 +- code/modules/admin/view_variables/topic.dm | 14 +- code/modules/clothing/head/headphones.dm | 3 +- .../spacesuits/rig/modules/utility.dm | 2 +- .../detectivework/evidence/fingerprints.dm | 2 +- code/modules/detectivework/forensics.dm | 2 +- code/modules/economy/worth_mob.dm | 12 +- code/modules/events/ion_storm.dm | 2 +- code/modules/events/radiation_storm.dm | 2 +- .../hallucinations/hallucination_telepathy.dm | 2 +- .../subtypes/reagents.dm | 2 +- code/modules/mob/living/bot/secbot.dm | 2 +- code/modules/mob/living/carbon/breathe.dm | 3 - code/modules/mob/living/carbon/carbon.dm | 198 ------------------ .../mob/living/carbon/carbon_defense.dm | 6 - .../mob/living/carbon/carbon_defines.dm | 29 --- .../modules/mob/living/carbon/carbon_grabs.dm | 4 - .../mob/living/carbon/carbon_organs.dm | 78 ------- .../mob/living/carbon/carbon_powers.dm | 0 .../modules/mob/living/carbon/damage_procs.dm | 12 -- code/modules/mob/living/carbon/internals.dm | 8 - code/modules/mob/living/damage_procs.dm | 1 - .../mob/living/{carbon => }/human/death.dm | 0 .../human/descriptors/_descriptors.dm | 0 .../human/descriptors/descriptors_age.dm | 0 .../human/descriptors/descriptors_generic.dm | 0 .../mob/living/{carbon => }/human/examine.dm | 0 .../mob/living/{carbon => }/human/human.dm | 98 ++++++--- .../{carbon => }/human/human_appearance.dm | 0 .../human/human_appearance_head.dm | 0 .../{carbon => }/human/human_attackhand.dm | 2 +- .../living/{carbon => }/human/human_blood.dm | 10 +- .../living/{carbon => }/human/human_damage.dm | 30 +-- .../{carbon => }/human/human_defense.dm | 64 ++++-- .../{carbon => }/human/human_defines.dm | 24 ++- code/modules/mob/living/human/human_eating.dm | 10 + .../{carbon => }/human/human_examine_decl.dm | 0 .../living/{carbon => }/human/human_grabs.dm | 0 .../{carbon => }/human/human_helpers.dm | 0 .../mob/living/human/human_internals.dm | 8 + .../{carbon => }/human/human_maneuvers.dm | 0 .../{carbon => }/human/human_movement.dm | 22 +- .../living/{carbon => }/human/human_organs.dm | 171 +++++++++++---- .../living/{carbon => }/human/human_powers.dm | 0 .../resist.dm => human/human_resist.dm} | 62 +----- .../living/{carbon => }/human/human_skin.dm | 0 .../{carbon => }/human/human_species.dm | 0 .../living/{carbon => }/human/human_verbs.dm | 4 +- .../mob/living/{carbon => }/human/life.dm | 0 .../mob/living/{carbon => }/human/login.dm | 0 .../mob/living/{carbon => }/human/logout.dm | 0 .../mob/living/{carbon => }/human/npcs.dm | 0 .../living/{carbon => }/human/obj_grabs.dm | 0 .../mob/living/{carbon => }/human/say.dm | 0 .../{carbon => }/human/unarmed_attack.dm | 0 .../living/{carbon => }/human/update_icons.dm | 19 +- .../mob/living/{carbon => }/human/whisper.dm | 0 code/modules/mob/living/life.dm | 1 + code/modules/mob/living/living.dm | 138 ++++++++---- code/modules/mob/living/living_breath.dm | 2 +- code/modules/mob/living/living_defense.dm | 4 +- code/modules/mob/living/living_defines.dm | 3 + .../carbon_eating.dm => living_eating.dm} | 4 + code/modules/mob/living/living_resist.dm | 68 ++++++ .../simple_animal/hostile/giant_spider.dm | 4 +- .../mob/living/simple_animal/hostile/leech.dm | 4 +- .../hostile/retaliate/king_of_goats.dm | 2 +- .../simple_animal/hostile/retaliate/parrot.dm | 2 +- .../mob/living/simple_animal/hostile/slug.dm | 2 +- .../mob/living/simple_animal/simple_animal.dm | 24 --- code/modules/mob/login.dm | 9 + code/modules/mob/mob.dm | 22 +- code/modules/mob/mob_defines.dm | 2 +- code/modules/mob/mob_helpers.dm | 7 +- code/modules/mob/transform_procs.dm | 2 +- code/modules/mob_holder/holder_mobs.dm | 2 +- code/modules/organs/internal/brain.dm | 2 +- code/modules/organs/internal/heart.dm | 17 +- code/modules/organs/pain.dm | 14 +- .../organs/prosthetics/_prosthetics.dm | 2 +- .../prosthetics/prosthetics_manufacturer.dm | 1 + code/modules/overmap/ftl_shunt/core.dm | 2 +- code/modules/paperwork/photography.dm | 2 +- code/modules/power/power.dm | 2 +- .../power/singularity/singularity_events.dm | 2 +- .../projectiles/guns/projectile/flaregun.dm | 2 +- code/modules/projectiles/projectile/energy.dm | 6 +- code/modules/reagents/Chemistry-Holder.dm | 2 +- .../taste.dm => reagents/Chemistry-Taste.dm} | 14 -- code/modules/reagents/chems/chems_blood.dm | 2 +- .../modules/reagents/chems/chems_compounds.dm | 2 +- .../reagents/chems/chems_painkillers.dm | 2 +- .../reactions/reaction_grenade_reaction.dm | 2 +- code/modules/reagents/reagent_containers.dm | 2 +- .../reagents/reagent_containers/syringes.dm | 8 +- code/modules/species/species_bodytype.dm | 3 +- code/modules/species/species_getters.dm | 2 +- code/modules/surgery/_surgery.dm | 2 +- code/modules/ventcrawl/ventcrawl.dm | 8 +- .../xenoarcheaology/artifacts/effects/heal.dm | 4 +- .../xenoarcheaology/artifacts/effects/hurt.dm | 4 +- .../xenoarcheaology/artifacts/effects/stun.dm | 4 +- .../finds/find_types/statuette.dm | 2 +- maps/away/magshield/magshield.dm | 2 +- mods/content/psionics/datum/chems.dm | 2 +- .../psionics/system/psionics/mob/mob.dm | 4 +- .../xenobiology/mobs/slime_feeding_helpers.dm | 3 - mods/mobs/borers/mob/borer/borer.dm | 6 +- mods/mobs/borers/mob/borer/borer_captive.dm | 6 +- mods/mobs/borers/mob/borer/borer_hud.dm | 6 +- mods/mobs/borers/mob/borer/borer_powers.dm | 2 +- mods/mobs/borers/mob/powers.dm | 12 +- mods/species/ascent/datum/culture.dm | 2 +- mods/species/ascent/datum/languages.dm | 4 +- mods/species/ascent/items/id_control.dm | 2 +- .../ascent/mobs/bodyparts_insectoid.dm | 2 +- mods/species/vox/organs_vox.dm | 2 +- nebula.dme | 82 ++++---- 147 files changed, 740 insertions(+), 838 deletions(-) delete mode 100644 code/modules/mob/living/carbon/breathe.dm delete mode 100644 code/modules/mob/living/carbon/carbon.dm delete mode 100644 code/modules/mob/living/carbon/carbon_defense.dm delete mode 100644 code/modules/mob/living/carbon/carbon_defines.dm delete mode 100644 code/modules/mob/living/carbon/carbon_grabs.dm delete mode 100644 code/modules/mob/living/carbon/carbon_organs.dm delete mode 100644 code/modules/mob/living/carbon/carbon_powers.dm delete mode 100644 code/modules/mob/living/carbon/damage_procs.dm delete mode 100644 code/modules/mob/living/carbon/internals.dm rename code/modules/mob/living/{carbon => }/human/death.dm (100%) rename code/modules/mob/living/{carbon => }/human/descriptors/_descriptors.dm (100%) rename code/modules/mob/living/{carbon => }/human/descriptors/descriptors_age.dm (100%) rename code/modules/mob/living/{carbon => }/human/descriptors/descriptors_generic.dm (100%) rename code/modules/mob/living/{carbon => }/human/examine.dm (100%) rename code/modules/mob/living/{carbon => }/human/human.dm (96%) rename code/modules/mob/living/{carbon => }/human/human_appearance.dm (100%) rename code/modules/mob/living/{carbon => }/human/human_appearance_head.dm (100%) rename code/modules/mob/living/{carbon => }/human/human_attackhand.dm (99%) rename code/modules/mob/living/{carbon => }/human/human_blood.dm (98%) rename code/modules/mob/living/{carbon => }/human/human_damage.dm (96%) rename code/modules/mob/living/{carbon => }/human/human_defense.dm (91%) rename code/modules/mob/living/{carbon => }/human/human_defines.dm (72%) create mode 100644 code/modules/mob/living/human/human_eating.dm rename code/modules/mob/living/{carbon => }/human/human_examine_decl.dm (100%) rename code/modules/mob/living/{carbon => }/human/human_grabs.dm (100%) rename code/modules/mob/living/{carbon => }/human/human_helpers.dm (100%) create mode 100644 code/modules/mob/living/human/human_internals.dm rename code/modules/mob/living/{carbon => }/human/human_maneuvers.dm (100%) rename code/modules/mob/living/{carbon => }/human/human_movement.dm (89%) rename code/modules/mob/living/{carbon => }/human/human_organs.dm (60%) rename code/modules/mob/living/{carbon => }/human/human_powers.dm (100%) rename code/modules/mob/living/{carbon/resist.dm => human/human_resist.dm} (67%) rename code/modules/mob/living/{carbon => }/human/human_skin.dm (100%) rename code/modules/mob/living/{carbon => }/human/human_species.dm (100%) rename code/modules/mob/living/{carbon => }/human/human_verbs.dm (99%) rename code/modules/mob/living/{carbon => }/human/life.dm (100%) rename code/modules/mob/living/{carbon => }/human/login.dm (100%) rename code/modules/mob/living/{carbon => }/human/logout.dm (100%) rename code/modules/mob/living/{carbon => }/human/npcs.dm (100%) rename code/modules/mob/living/{carbon => }/human/obj_grabs.dm (100%) rename code/modules/mob/living/{carbon => }/human/say.dm (100%) rename code/modules/mob/living/{carbon => }/human/unarmed_attack.dm (100%) rename code/modules/mob/living/{carbon => }/human/update_icons.dm (98%) rename code/modules/mob/living/{carbon => }/human/whisper.dm (100%) rename code/modules/mob/living/{carbon/carbon_eating.dm => living_eating.dm} (60%) create mode 100644 code/modules/mob/living/living_resist.dm rename code/modules/{mob/living/carbon/taste.dm => reagents/Chemistry-Taste.dm} (68%) diff --git a/code/__defines/mobs.dm b/code/__defines/mobs.dm index 3c3e77014f4..4165985e7d0 100644 --- a/code/__defines/mobs.dm +++ b/code/__defines/mobs.dm @@ -224,14 +224,14 @@ #define MOB_PULL_SAME 2 #define MOB_PULL_LARGER 3 -//carbon taste sensitivity defines, used in mob/living/carbon/proc/ingest +//carbon taste sensitivity defines, used in mob/living/proc/ingest #define TASTE_HYPERSENSITIVE 3 //anything below 5% #define TASTE_SENSITIVE 2 //anything below 7% #define TASTE_NORMAL 1 //anything below 15% #define TASTE_DULL 0.5 //anything below 30% #define TASTE_NUMB 0.1 //anything below 150% -// One 'unit' of taste sensitivity probability, used in mob/living/carbon/proc/ingest +// One 'unit' of taste sensitivity probability, used in mob/living/proc/ingest #define TASTE_DEGREE_PROB 15 //Used by show_message() and emotes diff --git a/code/_global_vars/lists/clothing.dm b/code/_global_vars/lists/clothing.dm index bdca49a8627..a819fa7c527 100644 --- a/code/_global_vars/lists/clothing.dm +++ b/code/_global_vars/lists/clothing.dm @@ -38,3 +38,9 @@ var/global/list/abstract_inventory_slots = list( var/global/list/vitals_sensor_equip_slots = list( slot_w_uniform_str ) + +var/global/list/headphone_slots = list( + slot_l_ear_str, + slot_r_ear_str, + slot_head_str +) diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index e9dca959c43..13c6665f9b4 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -371,14 +371,12 @@ return TRUE /atom/movable/proc/buckle_mob(mob/living/M) + if(buckled_mob) //unless buckled_mob becomes a list this can cause problems return FALSE + if(!istype(M) || (M.loc != loc) || M.buckled || LAZYLEN(M.pinned) || (buckle_require_restraints && !M.restrained())) return FALSE - if(ismob(src)) - var/mob/living/carbon/C = src //Don't wanna forget the xenos. - if(M != src && C.incapacitated()) - return FALSE M.buckled = src M.facing_dir = null diff --git a/code/game/gamemodes/cult/narsie.dm b/code/game/gamemodes/cult/narsie.dm index 90ba89f658a..943bc1b1f69 100644 --- a/code/game/gamemodes/cult/narsie.dm +++ b/code/game/gamemodes/cult/narsie.dm @@ -147,7 +147,7 @@ var/global/list/narsie_list = list() new /obj/effect/narsie_footstep(T) if(prob(25)) - for(var/mob/living/carbon/M in oviewers(8, src)) + for(var/mob/living/M in oviewers(8, src)) if(M.stat == CONSCIOUS && !(M.status_flags & GODMODE) && !iscultist(M)) to_chat(M, SPAN_DANGER("You feel your sanity crumble away in an instant as you gaze upon [src.name]...")) M.apply_effect(3, STUN) diff --git a/code/game/gamemodes/cult/ritual.dm b/code/game/gamemodes/cult/ritual.dm index 4f372e19005..b0d234d3f80 100644 --- a/code/game/gamemodes/cult/ritual.dm +++ b/code/game/gamemodes/cult/ritual.dm @@ -303,7 +303,7 @@ var/global/list/Tier4Runes = list( if(H.current && !H.current.stat) to_chat(H.current, "[input]") -/mob/living/carbon/cult_communicate() +/mob/living/cult_communicate() if(incapacitated(INCAPACITATION_RESTRAINED)) to_chat(src, "You need at least your hands free to do this.") return diff --git a/code/game/gamemodes/cult/runes.dm b/code/game/gamemodes/cult/runes.dm index 1003b121fc5..9b0b6ff08f2 100644 --- a/code/game/gamemodes/cult/runes.dm +++ b/code/game/gamemodes/cult/runes.dm @@ -101,8 +101,8 @@ if(spamcheck) return - var/mob/living/carbon/target = null - for(var/mob/living/carbon/M in get_turf(src)) + var/mob/living/target = null + for(var/mob/living/M in get_turf(src)) if(!iscultist(M) && M.stat != DEAD) target = M break @@ -741,7 +741,7 @@ var/list/mob/living/current = list() while(cultists.len >= 3) cultists = get_cultists() - for(var/mob/living/carbon/M in viewers(src)) + for(var/mob/living/M in viewers(src)) if(iscultist(M)) continue current |= M diff --git a/code/game/machinery/Sleeper.dm b/code/game/machinery/Sleeper.dm index 34a6e1b6b9b..6ffb055c0d6 100644 --- a/code/game/machinery/Sleeper.dm +++ b/code/game/machinery/Sleeper.dm @@ -406,7 +406,7 @@ dump_contents() // In case an object was dropped inside or something. Excludes the beaker and component parts. toggle_filter() -/obj/machinery/sleeper/proc/set_occupant(var/mob/living/carbon/occupant) +/obj/machinery/sleeper/proc/set_occupant(var/mob/living/occupant) src.occupant = occupant if(!occupant) SetName(initial(name)) diff --git a/code/game/machinery/computer/prisoner.dm b/code/game/machinery/computer/prisoner.dm index 7d4c202b05c..2ba58369745 100644 --- a/code/game/machinery/computer/prisoner.dm +++ b/code/game/machinery/computer/prisoner.dm @@ -36,7 +36,7 @@ if((Tr) && !LEVELS_ARE_Z_CONNECTED(Tr.z, src.z)) continue // Out of range if(!T.implanted) continue var/loc_display = "Space" - var/mob/living/carbon/M = T.imp_in + var/mob/living/M = T.imp_in if(!isspaceturf(M.loc)) var/turf/mob_loc = get_turf(M) loc_display = mob_loc.loc @@ -78,5 +78,5 @@ if(!warning) return var/obj/item/implant/I = locate(href_list["warn"]) if((I)&&(I.imp_in)) - var/mob/living/carbon/R = I.imp_in + var/mob/living/R = I.imp_in to_chat(R, "You hear a voice in your head saying: '[warning]'") diff --git a/code/game/machinery/cryopod.dm b/code/game/machinery/cryopod.dm index 10e57e69254..23e5b2e551f 100644 --- a/code/game/machinery/cryopod.dm +++ b/code/game/machinery/cryopod.dm @@ -523,7 +523,7 @@ return -/obj/machinery/cryopod/proc/set_occupant(var/mob/living/carbon/occupant, var/silent) +/obj/machinery/cryopod/proc/set_occupant(var/mob/living/occupant, var/silent) src.occupant = occupant if(!occupant) SetName(initial(name)) diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index 1d39a839320..f6d8bb205ab 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -130,7 +130,7 @@ About the new airlock wires panel: else /*if(src.justzap)*/ return else if(prob(10) && src.operating == 0) - var/mob/living/carbon/C = user + var/mob/living/C = user if(istype(C) && C.hallucination_power > 25) to_chat(user, SPAN_DANGER("You feel a powerful shock course through your body!")) user.take_damage(10, PAIN) diff --git a/code/game/machinery/doors/airlock_interactions.dm b/code/game/machinery/doors/airlock_interactions.dm index 4a28ca7be39..0b0545aee31 100644 --- a/code/game/machinery/doors/airlock_interactions.dm +++ b/code/game/machinery/doors/airlock_interactions.dm @@ -79,7 +79,7 @@ if(src.Move(T)) return -/mob/living/carbon/airlock_crush(var/crush_damage) +/mob/living/carbon/human/airlock_crush(var/crush_damage) . = ..() if (can_feel_pain()) emote(/decl/emote/audible/scream) diff --git a/code/game/machinery/hologram.dm b/code/game/machinery/hologram.dm index 4e57c861498..14522e6512c 100644 --- a/code/game/machinery/hologram.dm +++ b/code/game/machinery/hologram.dm @@ -154,7 +154,7 @@ var/global/list/holopads = list() to_chat(user, "A request for holographic communication was already sent recently.") -/obj/machinery/hologram/holopad/proc/make_call(var/obj/machinery/hologram/holopad/targetpad, var/mob/living/carbon/user) +/obj/machinery/hologram/holopad/proc/make_call(var/obj/machinery/hologram/holopad/targetpad, var/mob/living/user) targetpad.last_request = world.time targetpad.sourcepad = src //This marks the holopad you are making the call from targetpad.caller_id = user //This marks you as the caller @@ -165,7 +165,7 @@ var/global/list/holopads = list() to_chat(user, "Trying to establish a connection to the holopad in [targetpad.holopad_id]... Please await confirmation from recipient.") -/obj/machinery/hologram/holopad/proc/take_call(mob/living/carbon/user) +/obj/machinery/hologram/holopad/proc/take_call(mob/living/user) incoming_connection = 0 caller_id.machine = sourcepad caller_id.reset_view(src) @@ -213,7 +213,7 @@ var/global/list/holopads = list() to_chat(user, "ERROR: Unable to project hologram.") return -/obj/machinery/hologram/holopad/proc/activate_holocall(mob/living/carbon/caller_id) +/obj/machinery/hologram/holopad/proc/activate_holocall(mob/living/caller_id) if(caller_id) src.visible_message("A holographic image of [caller_id] flicks to life right before your eyes!") create_holo(0,caller_id)//Create one. @@ -268,15 +268,15 @@ For the other part of the code, check silicon say.dm. Particularly robot talk.*/ master.show_message(rendered, type) if(findtext(msg, "Holopad received,")) return - for(var/mob/living/carbon/master in masters) + for(var/mob/living/master in masters) var/rendered = "The holographic image of [msg]" master.show_message(rendered, type) if(targetpad) - for(var/mob/living/carbon/master in view(targetpad)) + for(var/mob/living/master in view(targetpad)) var/rendered = "The holographic image of [msg]" master.show_message(rendered, type) -/obj/machinery/hologram/holopad/proc/create_holo(mob/living/silicon/ai/A, mob/living/carbon/caller_id, turf/T = loc) +/obj/machinery/hologram/holopad/proc/create_holo(mob/living/silicon/ai/A, mob/living/caller_id, turf/T = loc) var/obj/effect/overlay/hologram = new(T)//Spawn a blank effect at the location. if(caller_id) hologram.overlays += getHologramIcon(getFlatIcon(caller_id), hologram_color = holopadType) // Add the callers image as an overlay to keep coloration! @@ -305,7 +305,7 @@ For the other part of the code, check silicon say.dm. Particularly robot talk.*/ icon_state = "[base_icon]1" return 1 -/obj/machinery/hologram/holopad/proc/clear_holo(mob/living/silicon/ai/user, mob/living/carbon/caller_id) +/obj/machinery/hologram/holopad/proc/clear_holo(mob/living/silicon/ai/user, mob/living/caller_id) if(user) qdel(masters[user])//Get rid of user's hologram user.holo = null diff --git a/code/game/machinery/jukebox.dm b/code/game/machinery/jukebox.dm index 51e67f598eb..45fdf4f6e54 100644 --- a/code/game/machinery/jukebox.dm +++ b/code/game/machinery/jukebox.dm @@ -121,7 +121,7 @@ /obj/machinery/media/jukebox/proc/emag_play() playsound(loc, 'sound/items/AirHorn.ogg', 100, 1) - for(var/mob/living/carbon/M in ohearers(6, src)) + for(var/mob/living/M in ohearers(6, src)) if(ishuman(M)) var/mob/living/carbon/human/H = M if(H.get_sound_volume_multiplier() < 0.2) diff --git a/code/game/machinery/newscaster.dm b/code/game/machinery/newscaster.dm index eb477839e17..babeef95697 100644 --- a/code/game/machinery/newscaster.dm +++ b/code/game/machinery/newscaster.dm @@ -201,7 +201,7 @@ var/global/list/allCasters = list() //Global list that will contain reference to /obj/machinery/newscaster/interact(mob/user) //########### THE MAIN BEEF IS HERE! And in the proc below this...############ if(ishuman(user) || issilicon(user) ) - var/mob/living/human_or_robot_user = user + var/mob/living/carbon/human_or_robot_user = user var/dat dat = text("Newscaster

Newscaster Unit #[src.unit_no]

") diff --git a/code/game/machinery/oxygen_pump.dm b/code/game/machinery/oxygen_pump.dm index 2739b2fc5a3..dd72573082b 100644 --- a/code/game/machinery/oxygen_pump.dm +++ b/code/game/machinery/oxygen_pump.dm @@ -10,7 +10,7 @@ anchored = TRUE var/obj/item/tank/tank - var/mob/living/carbon/breather + var/mob/living/carbon/human/breather var/obj/item/clothing/mask/breath/contained var/spawn_type = /obj/item/tank/emergency/oxygen/engi @@ -35,10 +35,10 @@ qdel(tank) if(breather) breather.drop_from_inventory(contained) - src.visible_message(SPAN_NOTICE("The mask rapidly retracts just before /the [src] is destroyed!")) + src.visible_message(SPAN_NOTICE("The mask rapidly retracts just before \the [src] is destroyed!")) + breather = null qdel(contained) contained = null - breather = null return ..() /obj/machinery/oxygen_pump/handle_mouse_drop(atom/over, mob/user, params) @@ -67,17 +67,17 @@ ui_interact(user) return TRUE -/obj/machinery/oxygen_pump/proc/attach_mask(var/mob/living/carbon/C) - if(C && istype(C)) +/obj/machinery/oxygen_pump/proc/attach_mask(var/mob/living/C) + if(ishuman(C)) contained.dropInto(C.loc) C.equip_to_slot(contained, slot_wear_mask_str) if(tank) tank.forceMove(C) breather = C -/obj/machinery/oxygen_pump/proc/set_internals(var/mob/living/carbon/C) - if(C && istype(C)) - if(!C.internal && tank) +/obj/machinery/oxygen_pump/proc/set_internals(var/mob/living/C) + if(ishuman(C)) + if(!C.get_internals() && tank) breather.set_internals(tank) update_use_power(POWER_USE_ACTIVE) @@ -163,10 +163,10 @@ /obj/machinery/oxygen_pump/Process() - if(breather) + if(istype(breather)) if(!can_apply_to_target(breather)) detach_mask() - else if(!breather.internal && tank) + else if(!breather.get_internals() && tank) set_internals(breather) diff --git a/code/game/objects/items/_item_damage.dm b/code/game/objects/items/_item_damage.dm index 33cd36a1fba..044b86db17f 100644 --- a/code/game/objects/items/_item_damage.dm +++ b/code/game/objects/items/_item_damage.dm @@ -78,7 +78,7 @@ else playsound(hit_atom, 'sound/weapons/throwtap.ogg', volume, TRUE, -1) -/obj/item/proc/eyestab(mob/living/carbon/M, mob/living/carbon/user) +/obj/item/proc/eyestab(mob/living/M, mob/living/user) var/mob/living/carbon/human/H = M if(istype(H)) for(var/slot in global.standard_headgear_slots) diff --git a/code/game/objects/items/devices/flash.dm b/code/game/objects/items/devices/flash.dm index 7b3c456de9d..a6b681dbc69 100644 --- a/code/game/objects/items/devices/flash.dm +++ b/code/game/objects/items/devices/flash.dm @@ -104,7 +104,7 @@ user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) do_flash_animation(user) - for(var/mob/living/carbon/M in oviewers(3, null)) + for(var/mob/living/M in oviewers(3, null)) M.handle_flashed(src, rand(str_min,str_max)) return TRUE @@ -112,7 +112,7 @@ if(broken || !general_flash_check()) return FALSE do_flash_animation() - for(var/mob/living/carbon/M in oviewers(3, null)) + for(var/mob/living/M in oviewers(3, null)) M.handle_flashed(src, rand(str_min,str_max)) /obj/item/flash/synthetic //not for regular use, weaker effects diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm index a5dc2b221f5..e0938c1d830 100644 --- a/code/game/objects/items/devices/radio/radio.dm +++ b/code/game/objects/items/devices/radio/radio.dm @@ -323,7 +323,7 @@ if (!broadcasting) // Sedation chemical effect should prevent radio use. - var/mob/living/carbon/C = M + var/mob/living/C = M if(istype(C) && (C.has_chemical_effect(CE_SEDATE, 1) || C.incapacitated(INCAPACITATION_DISRUPTED))) to_chat(M, SPAN_WARNING("You're unable to reach \the [src].")) return 0 diff --git a/code/game/objects/items/flame/flame_fuelled_lighter.dm b/code/game/objects/items/flame/flame_fuelled_lighter.dm index aa895dd5411..7f282757822 100644 --- a/code/game/objects/items/flame/flame_fuelled_lighter.dm +++ b/code/game/objects/items/flame/flame_fuelled_lighter.dm @@ -22,7 +22,7 @@ if(. && user) light_effects(user) -/obj/item/flame/fuelled/lighter/proc/light_effects(mob/living/carbon/user) +/obj/item/flame/fuelled/lighter/proc/light_effects(mob/living/user) if(prob(95)) user.visible_message(SPAN_NOTICE("After a few attempts, [user] manages to light the [src].")) else diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm index cdf8cd13c7f..521cd1ee0b7 100644 --- a/code/game/objects/items/toys.dm +++ b/code/game/objects/items/toys.dm @@ -186,7 +186,7 @@ /obj/item/toy/snappop/Crossed(atom/movable/AM) //i guess carp and shit shouldn't set them off - var/mob/living/carbon/M = AM + var/mob/living/M = AM if(!istype(M) || MOVING_DELIBERATELY(M)) return to_chat(M, SPAN_WARNING("You step on the snap pop!")) diff --git a/code/game/objects/items/weapons/autopsy.dm b/code/game/objects/items/weapons/autopsy.dm index 4685f8b12b2..95209a87d1d 100644 --- a/code/game/objects/items/weapons/autopsy.dm +++ b/code/game/objects/items/weapons/autopsy.dm @@ -17,7 +17,7 @@ /obj/item/scanner/autopsy/is_valid_scan_target(atom/O) return ishuman(O) || istype(O, /obj/item/organ/external) -/obj/item/scanner/autopsy/do_surgery(mob/living/carbon/M, mob/living/user, fuckup_prob) +/obj/item/scanner/autopsy/do_surgery(mob/living/M, mob/living/user, fuckup_prob) if(istype(M)) scan(M,user) diff --git a/code/game/objects/items/weapons/grenades/flashbang.dm b/code/game/objects/items/weapons/grenades/flashbang.dm index c7c7118e127..1aef86677a8 100644 --- a/code/game/objects/items/weapons/grenades/flashbang.dm +++ b/code/game/objects/items/weapons/grenades/flashbang.dm @@ -11,7 +11,7 @@ var/list/objs = list() var/turf/T = get_turf(src) get_mobs_and_objs_in_view_fast(T, 7, victims, objs) - for(var/mob/living/carbon/M in victims) + for(var/mob/living/M in victims) bang(T, M) for(var/obj/effect/blob/B in objs) //Blob damage here @@ -26,7 +26,7 @@ // Called during the loop that bangs people in lockers/containers and when banging // people in normal view. Could theroetically be called during other explosions. // -- Polymorph -/obj/item/grenade/flashbang/proc/bang(var/turf/T , var/mob/living/carbon/M) +/obj/item/grenade/flashbang/proc/bang(var/turf/T , var/mob/living/M) to_chat(M, SPAN_DANGER("BANG")) playsound(src, 'sound/weapons/flashbang.ogg', 100) diff --git a/code/game/objects/items/weapons/handcuffs.dm b/code/game/objects/items/weapons/handcuffs.dm index 17fd8e19b76..7ebbdc18f1a 100644 --- a/code/game/objects/items/weapons/handcuffs.dm +++ b/code/game/objects/items/weapons/handcuffs.dm @@ -67,7 +67,7 @@ return ..() -/obj/item/handcuffs/proc/place_handcuffs(var/mob/living/carbon/target, var/mob/user) +/obj/item/handcuffs/proc/place_handcuffs(var/mob/living/target, var/mob/user) playsound(src.loc, cuff_sound, 30, 1, -2) var/mob/living/carbon/human/H = target diff --git a/code/game/objects/items/weapons/implants/implantchair.dm b/code/game/objects/items/weapons/implants/implantchair.dm index 843c6cdad87..bee3993f35a 100644 --- a/code/game/objects/items/weapons/implants/implantchair.dm +++ b/code/game/objects/items/weapons/implants/implantchair.dm @@ -14,7 +14,7 @@ var/max_implants = 5 var/injection_cooldown = 600 var/replenish_cooldown = 6000 - var/mob/living/carbon/occupant = null + var/mob/living/occupant = null var/injecting = 0 /obj/machinery/implantchair/Initialize() diff --git a/code/game/objects/items/weapons/implants/implants/chem.dm b/code/game/objects/items/weapons/implants/implants/chem.dm index 5b43f65f0a7..882ac22ddcc 100644 --- a/code/game/objects/items/weapons/implants/implants/chem.dm +++ b/code/game/objects/items/weapons/implants/implants/chem.dm @@ -36,7 +36,7 @@ var/global/list/chem_implants = list() if(malfunction || (!ishuman(imp_in))) return 0 if(!amount) amount = rand(1,25) - var/mob/living/carbon/R = imp_in + var/mob/living/R = imp_in reagents.trans_to_mob(R, amount, CHEM_INJECT) to_chat(R, "You hear a faint *beep*.") diff --git a/code/game/objects/items/weapons/implants/implants/freedom.dm b/code/game/objects/items/weapons/implants/implants/freedom.dm index 9c98d34f961..720acd8685f 100644 --- a/code/game/objects/items/weapons/implants/implants/freedom.dm +++ b/code/game/objects/items/weapons/implants/implants/freedom.dm @@ -29,7 +29,7 @@ . = ..() uses = rand(1, 5) -/obj/item/implant/freedom/trigger(emote, mob/living/carbon/source) +/obj/item/implant/freedom/trigger(emote, mob/living/source) if (emote == activation_emote) activate() @@ -39,7 +39,7 @@ uses-- to_chat(imp_in, "You feel a faint click.") -/obj/item/implant/freedom/proc/remove_cuffs_and_unbuckle(mob/living/carbon/user) +/obj/item/implant/freedom/proc/remove_cuffs_and_unbuckle(mob/living/user) var/obj/cuffs = user.get_equipped_item(slot_handcuffed_str) if(!cuffs) return 0 @@ -48,7 +48,7 @@ user.buckled.unbuckle_mob() return -/obj/item/implant/freedom/implanted(mob/living/carbon/source) +/obj/item/implant/freedom/implanted(mob/living/source) src.activation_emote = input("Choose activation emote:") in list("blink", "blink_r", "eyebrow", "chuckle", "twitch_v", "frown", "nod", "blush", "giggle", "grin", "groan", "shrug", "smile", "pale", "sniff", "whimper", "wink") source.StoreMemory("Freedom implant can be activated by using the [src.activation_emote] emote, say *[src.activation_emote] to attempt to activate.", /decl/memory_options/system) to_chat(source, "The implanted freedom implant can be activated by using the [src.activation_emote] emote, say *[src.activation_emote] to attempt to activate.") diff --git a/code/game/objects/items/weapons/tanks/tanks.dm b/code/game/objects/items/weapons/tanks/tanks.dm index 734e3e27551..f651a0f537a 100644 --- a/code/game/objects/items/weapons/tanks/tanks.dm +++ b/code/game/objects/items/weapons/tanks/tanks.dm @@ -300,7 +300,7 @@ var/global/list/global/tank_gauge_cache = list() /obj/item/tank/proc/toggle_valve(var/mob/user) - var/mob/living/carbon/location + var/mob/living/location if(isliving(loc)) location = loc else if(istype(loc,/obj/item/rig)) @@ -310,7 +310,7 @@ var/global/list/global/tank_gauge_cache = list() else return - if(location.internal == src) + if(location.get_internals() == src) to_chat(user, "You close the tank release valve.") location.set_internals(null) else diff --git a/code/game/objects/items/weapons/weaponry.dm b/code/game/objects/items/weapons/weaponry.dm index d56b8240a01..c810f115fa8 100644 --- a/code/game/objects/items/weapons/weaponry.dm +++ b/code/game/objects/items/weapons/weaponry.dm @@ -120,7 +120,7 @@ max_health = 25 var/countdown = 15 var/temporary = 1 - var/mob/living/carbon/captured = null + var/mob/living/captured = null var/min_free_time = 50 var/max_free_time = 85 diff --git a/code/game/sound.dm b/code/game/sound.dm index c0e720787b3..7b2892a9de1 100644 --- a/code/game/sound.dm +++ b/code/game/sound.dm @@ -104,7 +104,7 @@ var/global/const/FALLOFF_SOUNDS = 0.5 if(!is_global) if(isliving(src)) - var/mob/living/carbon/M = src + var/mob/living/M = src if (istype(M) && M.hallucination_power > 50 && GET_CHEMICAL_EFFECT(M, CE_MIND) < 1) S.environment = PSYCHOTIC else if (HAS_STATUS(M, STAT_DRUGGY)) diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm index 3ca45751185..239a3942201 100644 --- a/code/modules/admin/verbs/debug.dm +++ b/code/modules/admin/verbs/debug.dm @@ -107,7 +107,7 @@ set name = "Del-All" // to prevent REALLY stupid deletions - var/blocked = list(/obj, /mob, /mob/living, /mob/living/carbon, /mob/living/carbon/human, /mob/observer, /mob/living/silicon, /mob/living/silicon/robot, /mob/living/silicon/ai) + var/blocked = list(/obj, /mob, /mob/living, /mob/living/carbon/human, /mob/observer, /mob/living/silicon, /mob/living/silicon/robot, /mob/living/silicon/ai) var/hsbitem = input(usr, "Choose an object to delete.", "Delete:") as null|anything in typesof(/obj) + typesof(/mob) - blocked if(hsbitem) for(var/atom/O in world) diff --git a/code/modules/admin/view_variables/topic.dm b/code/modules/admin/view_variables/topic.dm index a479f6dc3c7..b8c3caf1ca3 100644 --- a/code/modules/admin/view_variables/topic.dm +++ b/code/modules/admin/view_variables/topic.dm @@ -445,11 +445,11 @@ possibleverbs += typesof(/mob/proc,/mob/verb,/mob/living/proc,/mob/living/verb) switch(H.type) if(/mob/living/carbon/human) - possibleverbs += typesof(/mob/living/carbon/proc,/mob/living/carbon/verb,/mob/living/carbon/human/verb,/mob/living/carbon/human/proc) + possibleverbs += typesof(/mob/living/carbon/human/verb, /mob/living/carbon/human/proc) if(/mob/living/silicon/robot) - possibleverbs += typesof(/mob/living/silicon/proc,/mob/living/silicon/robot/proc,/mob/living/silicon/robot/verb) + possibleverbs += typesof(/mob/living/silicon/proc, /mob/living/silicon/robot/proc, /mob/living/silicon/robot/verb) if(/mob/living/silicon/ai) - possibleverbs += typesof(/mob/living/silicon/proc,/mob/living/silicon/ai/proc,/mob/living/silicon/ai/verb) + possibleverbs += typesof(/mob/living/silicon/proc, /mob/living/silicon/ai/proc, /mob/living/silicon/ai/verb) possibleverbs -= H.verbs possibleverbs += "Cancel" // ...And one for the bottom @@ -482,9 +482,9 @@ else if(href_list["addorgan"]) if(!check_rights(R_SPAWN)) return - var/mob/living/carbon/M = locate(href_list["addorgan"]) + var/mob/living/carbon/human/M = locate(href_list["addorgan"]) if(!istype(M)) - to_chat(usr, "This can only be done to instances of type /mob/living/carbon") + to_chat(usr, "This can only be done to instances of type /mob/living/carbon/human") return var/obj/item/organ/new_organ = input("Please choose an organ to add.","Organ",null) as null|anything in subtypesof(/obj/item/organ) @@ -509,9 +509,9 @@ else if(href_list["remorgan"]) if(!check_rights(R_SPAWN)) return - var/mob/living/carbon/M = locate(href_list["remorgan"]) + var/mob/living/carbon/human/M = locate(href_list["remorgan"]) if(!istype(M)) - to_chat(usr, "This can only be done to instances of type /mob/living/carbon") + to_chat(usr, "This can only be done to instances of type /mob/living/carbon/human") return var/obj/item/organ/rem_organ = input("Please choose an organ to remove.","Organ",null) as null|anything in M.get_internal_organs() diff --git a/code/modules/clothing/head/headphones.dm b/code/modules/clothing/head/headphones.dm index 061e6763f37..aee97663781 100644 --- a/code/modules/clothing/head/headphones.dm +++ b/code/modules/clothing/head/headphones.dm @@ -64,10 +64,9 @@ stop_music(user) /obj/item/clothing/head/headphones/proc/play_music(mob/user) - var/static/list/allowed_slots = list(slot_l_ear_str, slot_r_ear_str, slot_head_str) if(!user || !user.client) return - if(!(user.get_equipped_slot_for_item(src) in allowed_slots)) + if(!(user.get_equipped_slot_for_item(src) in global.headphone_slots)) return if(current_track) var/decl/music_track/track = GET_DECL(global.music_tracks[current_track]) diff --git a/code/modules/clothing/spacesuits/rig/modules/utility.dm b/code/modules/clothing/spacesuits/rig/modules/utility.dm index ee4789ccfa1..543f3b638b6 100644 --- a/code/modules/clothing/spacesuits/rig/modules/utility.dm +++ b/code/modules/clothing/spacesuits/rig/modules/utility.dm @@ -254,7 +254,7 @@ else if(charge.charges < chems_to_use) chems_to_use = charge.charges - var/mob/living/carbon/target_mob + var/mob/living/target_mob if(target) if(!isliving(target)) return FALSE diff --git a/code/modules/detectivework/evidence/fingerprints.dm b/code/modules/detectivework/evidence/fingerprints.dm index c3c9060f88b..60fd2883c10 100644 --- a/code/modules/detectivework/evidence/fingerprints.dm +++ b/code/modules/detectivework/evidence/fingerprints.dm @@ -94,7 +94,7 @@ return E.get_fingerprint() return fingerprint -/mob/living/carbon/get_full_print(var/ignore_blockers = FALSE) +/mob/living/carbon/human/get_full_print(var/ignore_blockers = FALSE) if (!ignore_blockers && (mFingerprints in mutations)) return null return ..() diff --git a/code/modules/detectivework/forensics.dm b/code/modules/detectivework/forensics.dm index 410c0bc270b..08335074135 100644 --- a/code/modules/detectivework/forensics.dm +++ b/code/modules/detectivework/forensics.dm @@ -55,7 +55,7 @@ var/datum/forensics/F = forensics.evidence[T] other_forensics.add_data(T, F.data) -/obj/item/proc/add_trace_DNA(mob/living/carbon/M) +/obj/item/proc/add_trace_DNA(mob/living/M) if(!istype(M)) return if(M.isSynthetic()) diff --git a/code/modules/economy/worth_mob.dm b/code/modules/economy/worth_mob.dm index 42e4387f1e1..7102d7c6809 100644 --- a/code/modules/economy/worth_mob.dm +++ b/code/modules/economy/worth_mob.dm @@ -4,17 +4,15 @@ . *= 1.5 . = max(round(.), mob_size) -/mob/living/carbon/get_single_monetary_worth() +/mob/living/get_single_monetary_worth() . = ..() for(var/atom/movable/organ in get_organs()) . += organ.get_combined_monetary_worth() - -/mob/living/carbon/get_value_multiplier() - . = species?.rarity_value || 1 - -/mob/living/get_single_monetary_worth() - . = ..() if(butchery_data) var/decl/butchery_data/butchery_decl = GET_DECL(butchery_data) . += butchery_decl.get_monetary_worth(src) . = round(.) + +/mob/living/get_value_multiplier() + var/decl/species/my_species = get_species() + . = my_species ? my_species.rarity_value : 1 diff --git a/code/modules/events/ion_storm.dm b/code/modules/events/ion_storm.dm index 7678707149d..2d9a036fd19 100644 --- a/code/modules/events/ion_storm.dm +++ b/code/modules/events/ion_storm.dm @@ -17,7 +17,7 @@ endWhen = rand(500, 1500) /datum/event/ionstorm/announce() - for(var/mob/living/carbon/S in SSmobs.mob_list) + for(var/mob/living/S in SSmobs.mob_list) if (!S.isSynthetic()) continue if(!(S.z in affecting_z)) diff --git a/code/modules/events/radiation_storm.dm b/code/modules/events/radiation_storm.dm index f0d80ca0a8f..f8687786a6e 100644 --- a/code/modules/events/radiation_storm.dm +++ b/code/modules/events/radiation_storm.dm @@ -45,7 +45,7 @@ for(var/z in affecting_z) SSradiation.z_radiate(locate(1, 1, z), radiation_level, 1) - for(var/mob/living/carbon/C in global.living_mob_list_) + for(var/mob/living/C in global.living_mob_list_) var/area/A = get_area(C) if(!A) continue diff --git a/code/modules/hallucinations/hallucination_telepathy.dm b/code/modules/hallucinations/hallucination_telepathy.dm index 36a982c5a36..8d7ca411c2e 100644 --- a/code/modules/hallucinations/hallucination_telepathy.dm +++ b/code/modules/hallucinations/hallucination_telepathy.dm @@ -29,7 +29,7 @@ to_chat(usr, SPAN_WARNING("Chemicals in your blood prevent you from using your power!")) var/list/creatures = list() - for(var/mob/living/carbon/C in SSmobs.mob_list) + for(var/mob/living/C in SSmobs.mob_list) creatures += C creatures -= usr var/mob/target = input("Who do you want to project your mind to?") as null|anything in creatures diff --git a/code/modules/integrated_electronics/subtypes/reagents.dm b/code/modules/integrated_electronics/subtypes/reagents.dm index 085a2ebe47f..2a6fb918985 100644 --- a/code/modules/integrated_electronics/subtypes/reagents.dm +++ b/code/modules/integrated_electronics/subtypes/reagents.dm @@ -150,7 +150,7 @@ /obj/item/integrated_circuit/reagent/injector/proc/draw_after(var/weakref/target, var/amount) busy = FALSE - var/mob/living/carbon/C = target_nearby(target) + var/mob/living/C = target_nearby(target) if(!C) activate_pin(3) return diff --git a/code/modules/mob/living/bot/secbot.dm b/code/modules/mob/living/bot/secbot.dm index 9b24c8cbaa5..c027eca044f 100644 --- a/code/modules/mob/living/bot/secbot.dm +++ b/code/modules/mob/living/bot/secbot.dm @@ -184,7 +184,7 @@ else UnarmedAttack(target) -/mob/living/bot/secbot/proc/cuff_target(var/mob/living/carbon/C) +/mob/living/bot/secbot/proc/cuff_target(var/mob/living/C) if(istype(C) && !C.get_equipped_item(slot_handcuffed_str)) handcuffs.place_handcuffs(C, src) resetTarget() //we're done, failed or not. Don't want to get stuck if C is not diff --git a/code/modules/mob/living/carbon/breathe.dm b/code/modules/mob/living/carbon/breathe.dm deleted file mode 100644 index 3ff1d6e1d1f..00000000000 --- a/code/modules/mob/living/carbon/breathe.dm +++ /dev/null @@ -1,3 +0,0 @@ -#define MOB_BREATH_DELAY 2 -/mob/living/should_breathe() - return ((life_tick % MOB_BREATH_DELAY) == 0 || failed_last_breath || is_asystole()) diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm deleted file mode 100644 index b043a9d6621..00000000000 --- a/code/modules/mob/living/carbon/carbon.dm +++ /dev/null @@ -1,198 +0,0 @@ -/mob/living/carbon/Initialize() - //setup reagent holders - if(!bloodstr) - bloodstr = new/datum/reagents/metabolism(120, src, CHEM_INJECT) - if(!reagents) - reagents = bloodstr - if(!touching) - touching = new/datum/reagents/metabolism(mob_size * 100, src, CHEM_TOUCH) - - if (!default_language && species_language) - default_language = species_language - . = ..() - -/mob/living/carbon/Destroy() - QDEL_NULL(touching) - QDEL_NULL(bloodstr) - reagents = null //We assume reagents is a reference to bloodstr here - if(loc) - for(var/mob/M in contents) - M.dropInto(loc) - else - for(var/mob/M in contents) - qdel(M) - return ..() - -/mob/living/carbon/rejuvenate() - set_nutrition(400) - set_hydration(400) - ..() - -/mob/living/carbon/Move(NewLoc, direct) - . = ..() - if(!.) - return - - if(stat != DEAD) - var/nut_removed = DEFAULT_HUNGER_FACTOR/10 - var/hyd_removed = DEFAULT_THIRST_FACTOR/10 - if (move_intent.flags & MOVE_INTENT_EXERTIVE) - nut_removed *= 2 - hyd_removed *= 2 - adjust_nutrition(-nut_removed) - adjust_hydration(-hyd_removed) - - // Moving around increases germ_level faster - if(germ_level < GERM_LEVEL_MOVE_CAP && prob(8)) - germ_level++ - -/mob/living/carbon/relaymove(var/mob/living/user, direction) - if(!istype(user) || !(user in contents) || user.is_on_special_ability_cooldown()) - return - user.set_special_ability_cooldown(5 SECONDS) - visible_message(SPAN_DANGER("You hear something rumbling inside [src]'s stomach...")) - var/obj/item/I = user.get_active_held_item() - if(!I?.force) - return - var/d = rand(round(I.force / 4), I.force) - visible_message(SPAN_DANGER("\The [user] attacks [src]'s stomach wall with \the [I]!")) - playsound(user.loc, 'sound/effects/attackblob.ogg', 50, 1) - var/obj/item/organ/external/organ = GET_EXTERNAL_ORGAN(src, BP_CHEST) - if(istype(organ)) - organ.take_external_damage(d, 0) - else - take_organ_damage(d) - if(prob(get_damage(BRUTE) - 50)) - gib() - -/mob/living/carbon/electrocute_act(var/shock_damage, var/obj/source, var/siemens_coeff = 1.0, var/def_zone = null) - if(status_flags & GODMODE) return 0 //godmode - - shock_damage = apply_shock(shock_damage, def_zone, siemens_coeff) - - if(!shock_damage) - return 0 - - stun_effect_act(agony_amount=shock_damage, def_zone=def_zone) - - playsound(loc, "sparks", 50, 1, -1) - if (shock_damage > 15) - src.visible_message( - "[src] was electrocuted[source ? " by the [source]" : ""]!", \ - "You feel a powerful shock course through your body!", \ - "You hear a heavy electrical crack." \ - ) - else - src.visible_message( - "[src] was shocked[source ? " by the [source]" : ""].", \ - "You feel a shock course through your body.", \ - "You hear a zapping sound." \ - ) - - switch(shock_damage) - if(11 to 15) - SET_STATUS_MAX(src, STAT_STUN, 1) - if(16 to 20) - SET_STATUS_MAX(src, STAT_STUN, 2) - if(21 to 25) - SET_STATUS_MAX(src, STAT_WEAK, 2) - if(26 to 30) - SET_STATUS_MAX(src, STAT_WEAK, 5) - if(31 to INFINITY) - SET_STATUS_MAX(src, STAT_WEAK, 10) //This should work for now, more is really silly and makes you lay there forever - - set_status(STAT_JITTER, min(shock_damage*5, 200)) - - spark_at(loc, amount=5, cardinal_only = TRUE) - - return shock_damage - -/mob/living/carbon/proc/apply_shock(var/shock_damage, var/def_zone, var/siemens_coeff = 1.0) - shock_damage *= siemens_coeff - if(shock_damage < 0.5) - return 0 - if(shock_damage < 1) - shock_damage = 1 - apply_damage(shock_damage, BURN, def_zone, used_weapon="Electrocution") - return(shock_damage) - -/mob/proc/swap_hand() - SHOULD_CALL_PARENT(TRUE) - -/mob/living/carbon/flash_eyes(intensity = FLASH_PROTECTION_MODERATE, override_blindness_check = FALSE, affect_silicon = FALSE, visual = FALSE, type = /obj/screen/fullscreen/flash) - if(eyecheck() < intensity || override_blindness_check) - return ..() - -/mob/living/carbon/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume) - ..() - var/temp_inc = max(min(BODYTEMP_HEATING_MAX*(1-get_heat_protection()), exposed_temperature - bodytemperature), 0) - bodytemperature += temp_inc - -/mob/living/carbon/restrained() - return get_equipped_item(slot_handcuffed_str) - -/mob/living/carbon/Bump(var/atom/movable/AM, yes) - if(now_pushing || !yes) - return - ..() - -/mob/living/carbon/slip(slipped_on, stun_duration = 8) - if(has_gravity() && !buckled && !current_posture.prone) - to_chat(src, SPAN_DANGER("You slipped on [slipped_on]!")) - playsound(loc, 'sound/misc/slip.ogg', 50, 1, -3) - SET_STATUS_MAX(src, STAT_WEAK, stun_duration) - . = TRUE - -/mob/living/carbon/get_satiated_nutrition() - return 350 - -/mob/living/carbon/get_max_nutrition() - return 400 - -/mob/living/carbon/get_max_hydration() - return 400 - -/mob/living/carbon/fluid_act(var/datum/reagents/fluids) - ..() - if(QDELETED(src) || !fluids?.total_volume || !touching || fluids.total_volume <= touching.total_volume) - return - // TODO: review saturation logic so we can end up with more than like 15 water in our contact reagents. - var/saturation = min(fluids.total_volume, round(mob_size * 1.5 * reagent_permeability()) - touching.total_volume) - if(saturation > 0) - fluids.trans_to_holder(touching, saturation) - -/mob/living/carbon/get_species() - RETURN_TYPE(/decl/species) - return species - -/mob/living/carbon/get_contact_reagents() - return touching - -/mob/living/carbon/get_injected_reagents() - return bloodstr - -/mob/living/carbon/get_admin_job_string() - return "Carbon-based" - -/mob/living/carbon/handle_flashed(var/obj/item/flash/flash, var/flash_strength) - - var/safety = eyecheck() - if(safety >= FLASH_PROTECTION_MODERATE || flash_strength <= 0) // May be modified by human proc. - return FALSE - - flash_eyes(FLASH_PROTECTION_MODERATE - safety) - SET_STATUS_MAX(src, STAT_STUN, (flash_strength / 2)) - SET_STATUS_MAX(src, STAT_BLURRY, flash_strength) - SET_STATUS_MAX(src, STAT_CONFUSE, (flash_strength + 2)) - if(flash_strength > 3) - drop_held_items() - if(flash_strength > 5) - SET_STATUS_MAX(src, STAT_WEAK, 2) - -/mob/living/carbon/verb/showoff() - set name = "Show Held Item" - set category = "Object" - - var/obj/item/I = get_active_held_item() - if(I && I.simulated) - I.showoff(src) diff --git a/code/modules/mob/living/carbon/carbon_defense.dm b/code/modules/mob/living/carbon/carbon_defense.dm deleted file mode 100644 index a8c4298393f..00000000000 --- a/code/modules/mob/living/carbon/carbon_defense.dm +++ /dev/null @@ -1,6 +0,0 @@ - -/mob/living/standard_weapon_hit_effects(obj/item/I, mob/living/user, var/effective_force, var/hit_zone) - if(effective_force) - try_embed_in_mob(I, hit_zone, effective_force, direction = get_dir(user, src)) - return TRUE - return FALSE diff --git a/code/modules/mob/living/carbon/carbon_defines.dm b/code/modules/mob/living/carbon/carbon_defines.dm deleted file mode 100644 index 96e7afdbc09..00000000000 --- a/code/modules/mob/living/carbon/carbon_defines.dm +++ /dev/null @@ -1,29 +0,0 @@ -/mob/living/carbon - gender = MALE - abstract_type = /mob/living/carbon - - //Surgery info - //Active emote/pose - var/pose = null - var/datum/reagents/metabolism/bloodstr - var/datum/reagents/metabolism/touching - - var/ignore_rads = FALSE - /// Whether the mob is performing cpr or not. - var/performing_cpr = FALSE - var/lastpuke = 0 - - var/obj/item/tank/internal = null//Human/Monkey - var/decl/species/species // Contains environment tolerances and language information, set during New(). - - //these two help govern taste. The first is the last time a taste message was shown to the plaer. - //the second is the message in question. - var/last_taste_time = 0 - var/last_taste_text = "" - - // organ-related variables, see organ.dm and human_organs.dm - //Shouldn't be accessed directly - var/list/organs_by_tag - var/tmp/list/internal_organs - var/tmp/list/external_organs - var/list/organs_by_category diff --git a/code/modules/mob/living/carbon/carbon_grabs.dm b/code/modules/mob/living/carbon/carbon_grabs.dm deleted file mode 100644 index 93acf062189..00000000000 --- a/code/modules/mob/living/carbon/carbon_grabs.dm +++ /dev/null @@ -1,4 +0,0 @@ -/mob/living/carbon/get_active_grabs() - . = list() - for(var/obj/item/grab/grab in get_held_items()) - . += grab diff --git a/code/modules/mob/living/carbon/carbon_organs.dm b/code/modules/mob/living/carbon/carbon_organs.dm deleted file mode 100644 index 5e7378e8747..00000000000 --- a/code/modules/mob/living/carbon/carbon_organs.dm +++ /dev/null @@ -1,78 +0,0 @@ -/mob/living/carbon/get_organ(var/organ_tag, var/expected_type = /obj/item/organ) - RETURN_TYPE(expected_type) - var/obj/item/organ = LAZYACCESS(organs_by_tag, organ_tag) - if(!expected_type || istype(organ, expected_type)) - return organ - -/mob/living/carbon/get_external_organs() - return external_organs - -/mob/living/carbon/get_internal_organs() - return internal_organs - -/mob/living/carbon/has_organs() - return (LAZYLEN(external_organs) + LAZYLEN(internal_organs)) > 0 - -/mob/living/carbon/has_external_organs() - return LAZYLEN(external_organs) > 0 - -/mob/living/carbon/has_internal_organs() - return LAZYLEN(internal_organs) > 0 - -/mob/living/carbon/get_organs_by_categories(var/list/categories) - for(var/organ_cat in categories) - if(organ_cat in organs_by_category) - LAZYDISTINCTADD(., organs_by_category[organ_cat]) - -//Deletes all references to organs -/mob/living/carbon/delete_organs() - ..() - organs_by_tag = null - internal_organs = null - external_organs = null - organs_by_category = null - -/mob/living/carbon/add_organ(obj/item/organ/O, obj/item/organ/external/affected, in_place, update_icon, detached, skip_health_update = FALSE) - var/obj/item/organ/existing = LAZYACCESS(organs_by_tag, O.organ_tag) - if(existing && O != existing) - CRASH("mob/living/carbon/add_organ(): '[O]' tried to overwrite [src]'s existing organ '[existing]' in slot '[O.organ_tag]'!") - if(O.parent_organ && !LAZYACCESS(organs_by_tag, O.parent_organ)) - CRASH("mob/living/carbon/add_organ(): Tried to add an internal organ to a non-existing parent external organ!") - - //We don't add internal organs to the lists if we're detached - if(O.is_internal() && !detached) - LAZYSET(organs_by_tag, O.organ_tag, O) - LAZYDISTINCTADD(internal_organs, O) - //External organs must always be in the organ list even when detached. Otherwise icon updates won't show the limb, and limb attach surgeries won't work - else if(!O.is_internal()) - LAZYSET(organs_by_tag, O.organ_tag, O) - LAZYDISTINCTADD(external_organs, O) - - // Update our organ category lists, if neeed. - if(O.organ_category) - LAZYINITLIST(organs_by_category) - LAZYDISTINCTADD(organs_by_category[O.organ_category], O) - - . = ..() - -/mob/living/carbon/remove_organ(var/obj/item/organ/O, var/drop_organ = TRUE, var/detach = TRUE, var/ignore_children = FALSE, var/in_place = FALSE, var/update_icon = TRUE, var/skip_health_update = FALSE) - if(istype(O) && !in_place && O.is_vital_to_owner() && usr) - admin_attack_log(usr, src, "Removed a vital organ ([src]).", "Had a vital organ ([src]) removed.", "removed a vital organ ([src]) from") - if(!(. = ..())) - return - LAZYREMOVE(organs_by_tag, O.organ_tag) - if(O.is_internal()) - LAZYREMOVE(internal_organs, O) - else - LAZYREMOVE(external_organs, O) - - // Update our organ category lists, if neeed. - if(O.organ_category && islist(organs_by_category)) - organs_by_category[O.organ_category] -= O - if(LAZYLEN(organs_by_category[O.organ_category]) <= 0) - LAZYREMOVE(organs_by_category, O.organ_category) - -/mob/living/carbon/get_bodytype() - RETURN_TYPE(/decl/bodytype) - // If the root organ ever changes/isn't always the chest, this will need to be changed. - return get_organ(BP_CHEST, /obj/item/organ)?.bodytype \ No newline at end of file diff --git a/code/modules/mob/living/carbon/carbon_powers.dm b/code/modules/mob/living/carbon/carbon_powers.dm deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/code/modules/mob/living/carbon/damage_procs.dm b/code/modules/mob/living/carbon/damage_procs.dm deleted file mode 100644 index 57be8c03832..00000000000 --- a/code/modules/mob/living/carbon/damage_procs.dm +++ /dev/null @@ -1,12 +0,0 @@ -/* -Contians the proc to handle radiation. -Specifically made to do radiation burns. -*/ - - -/mob/living/carbon/apply_radiation(damage) - ..() - if(!isSynthetic() && !ignore_rads) - damage = 0.25 * damage * (species ? species.get_radiation_mod(src) : 1) - take_damage(damage, BURN) - return TRUE diff --git a/code/modules/mob/living/carbon/internals.dm b/code/modules/mob/living/carbon/internals.dm deleted file mode 100644 index c21f82f68b0..00000000000 --- a/code/modules/mob/living/carbon/internals.dm +++ /dev/null @@ -1,8 +0,0 @@ -/mob/living/carbon/get_internals() - return internal - -/mob/living/carbon/set_internals(obj/item/tank/source, source_string) - ..() - internal = source - if(internals) - internals.icon_state = "internal[!!internal]" diff --git a/code/modules/mob/living/damage_procs.dm b/code/modules/mob/living/damage_procs.dm index 324f98e19d6..2836798bf8c 100644 --- a/code/modules/mob/living/damage_procs.dm +++ b/code/modules/mob/living/damage_procs.dm @@ -36,7 +36,6 @@ /mob/living/apply_radiation(var/damage = 0) if(!damage) return FALSE - radiation = max(0, radiation + damage) return TRUE diff --git a/code/modules/mob/living/carbon/human/death.dm b/code/modules/mob/living/human/death.dm similarity index 100% rename from code/modules/mob/living/carbon/human/death.dm rename to code/modules/mob/living/human/death.dm diff --git a/code/modules/mob/living/carbon/human/descriptors/_descriptors.dm b/code/modules/mob/living/human/descriptors/_descriptors.dm similarity index 100% rename from code/modules/mob/living/carbon/human/descriptors/_descriptors.dm rename to code/modules/mob/living/human/descriptors/_descriptors.dm diff --git a/code/modules/mob/living/carbon/human/descriptors/descriptors_age.dm b/code/modules/mob/living/human/descriptors/descriptors_age.dm similarity index 100% rename from code/modules/mob/living/carbon/human/descriptors/descriptors_age.dm rename to code/modules/mob/living/human/descriptors/descriptors_age.dm diff --git a/code/modules/mob/living/carbon/human/descriptors/descriptors_generic.dm b/code/modules/mob/living/human/descriptors/descriptors_generic.dm similarity index 100% rename from code/modules/mob/living/carbon/human/descriptors/descriptors_generic.dm rename to code/modules/mob/living/human/descriptors/descriptors_generic.dm diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/human/examine.dm similarity index 100% rename from code/modules/mob/living/carbon/human/examine.dm rename to code/modules/mob/living/human/examine.dm diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/human/human.dm similarity index 96% rename from code/modules/mob/living/carbon/human/human.dm rename to code/modules/mob/living/human/human.dm index f43c1aa60d4..1ae45d4619f 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/human/human.dm @@ -10,14 +10,27 @@ var/list/hud_list[10] var/embedded_flag //To check if we've need to roll for damage on movement while an item is imbedded in us. var/step_count - + /mob/living/carbon/human/Initialize(mapload, species_name, datum/dna/new_dna, decl/bodytype/new_bodytype) + current_health = max_health setup_hud_overlays() var/list/newargs = args.Copy(2) setup(arglist(newargs)) global.human_mob_list |= src + + if(!bloodstr) + bloodstr = new/datum/reagents/metabolism(120, src, CHEM_INJECT) + if(!reagents) + reagents = bloodstr + if(!touching) + touching = new/datum/reagents/metabolism(mob_size * 100, src, CHEM_TOUCH) + + if (!default_language && species_language) + default_language = species_language + . = ..() + if(. != INITIALIZE_HINT_QDEL) post_setup(arglist(newargs)) @@ -37,9 +50,26 @@ global.human_mob_list -= src regenerate_body_icon = FALSE // don't bother regenerating if we happen to be queued to update icon worn_underwear = null + + LAZYCLEARLIST(smell_cooldown) + QDEL_NULL(attack_selector) QDEL_NULL(vessel) - . = ..() + QDEL_NULL(touching) + + if(reagents == bloodstr) + reagents = null + else + QDEL_NULL(bloodstr) + QDEL_NULL(bloodstr) + + if(loc) + for(var/mob/M in contents) + M.dropInto(loc) + else + for(var/mob/M in contents) + qdel(M) + return ..() /mob/living/carbon/human/get_ingested_reagents() if(!should_have_organ(BP_STOMACH)) @@ -107,20 +137,6 @@ return 1 return 0 -/mob/living/carbon/human/restrained() - if(get_equipped_item(slot_handcuffed_str)) - return 1 - if(grab_restrained()) - return 1 - if (istype(get_equipped_item(slot_wear_suit_str), /obj/item/clothing/suit/straight_jacket)) - return 1 - return 0 - -/mob/living/carbon/human/proc/grab_restrained() - for (var/obj/item/grab/G in grabbed_by) - if(G.restrains()) - return TRUE - /mob/living/carbon/human/get_additional_stripping_options() . = ..() for(var/entry in worn_underwear) @@ -551,6 +567,7 @@ return TRUE + //Syncs cultural tokens to the currently set species, and may trigger a language update /mob/living/carbon/human/proc/apply_species_cultural_info() var/update_lang @@ -768,21 +785,11 @@ var/obj/item/organ/internal/eyes = GET_INTERNAL_ORGAN(src, BP_EYES) . = eyes?.is_usable() -/mob/living/carbon/human/slip(var/slipped_on, stun_duration = 8) - if(species.check_no_slip(src)) - return FALSE - var/obj/item/shoes = get_equipped_item(slot_shoes_str) - if(shoes && (shoes.item_flags & ITEM_FLAG_NOSLIP)) - return FALSE - return !!(..(slipped_on,stun_duration)) - - /mob/living/carbon/human/reset_view(atom/A, update_hud = 1) ..() if(update_hud) handle_regular_hud_updates() - /mob/living/carbon/human/can_stand_overridden() if(get_rig()?.ai_can_move_suit(check_for_ai = 1)) // Actually missing a leg will screw you up. Everything else can be compensated for. @@ -793,7 +800,6 @@ return TRUE return FALSE - /mob/living/carbon/human/can_devour(atom/movable/victim, var/silent = FALSE) if(!should_have_organ(BP_STOMACH)) @@ -828,6 +834,7 @@ /mob/living/carbon/human/is_invisible_to(var/mob/viewer) return (is_cloaked() || ..()) + /mob/living/carbon/human/proc/resuscitate() if(!is_asystole() || !should_have_organ(BP_HEART)) return @@ -931,13 +938,6 @@ else reagents.trans_to_obj(vomit, 5) -/mob/living/carbon/human/get_sound_volume_multiplier() - . = ..() - for(var/slot in list(slot_l_ear_str, slot_r_ear_str, slot_head_str)) - var/obj/item/clothing/C = get_equipped_item(slot) - if(istype(C)) - . = min(., C.volume_multiplier) - /mob/living/carbon/human/get_bullet_impact_effect_type(var/def_zone) var/obj/item/organ/external/E = GET_EXTERNAL_ORGAN(src, def_zone) if(!E) @@ -998,6 +998,7 @@ //Human mob specific init code. Meant to be used only on init. /mob/living/carbon/human/proc/setup(species_name = null, datum/dna/new_dna = null, decl/bodytype/new_bodytype = null) + if(new_dna) species_name = new_dna.species src.dna = new_dna @@ -1184,3 +1185,32 @@ /mob/living/carbon/human/try_awaken(mob/user) return !is_asystole() && ..() + +/mob/living/carbon/human/get_satiated_nutrition() + return 350 + +/mob/living/carbon/human/get_max_nutrition() + return 400 + +/mob/living/carbon/human/get_max_hydration() + return 400 + +/mob/living/carbon/human/get_species() + RETURN_TYPE(/decl/species) + return species + +/mob/living/carbon/human/get_contact_reagents() + return touching + +/mob/living/carbon/human/get_injected_reagents() + return bloodstr + +/mob/living/carbon/human/Bump(var/atom/movable/AM, yes) + if(now_pushing || !yes) + return + ..() + +/mob/living/carbon/human/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume) + ..() + var/temp_inc = max(min(BODYTEMP_HEATING_MAX*(1-get_heat_protection()), exposed_temperature - bodytemperature), 0) + bodytemperature += temp_inc diff --git a/code/modules/mob/living/carbon/human/human_appearance.dm b/code/modules/mob/living/human/human_appearance.dm similarity index 100% rename from code/modules/mob/living/carbon/human/human_appearance.dm rename to code/modules/mob/living/human/human_appearance.dm diff --git a/code/modules/mob/living/carbon/human/human_appearance_head.dm b/code/modules/mob/living/human/human_appearance_head.dm similarity index 100% rename from code/modules/mob/living/carbon/human/human_appearance_head.dm rename to code/modules/mob/living/human/human_appearance_head.dm diff --git a/code/modules/mob/living/carbon/human/human_attackhand.dm b/code/modules/mob/living/human/human_attackhand.dm similarity index 99% rename from code/modules/mob/living/carbon/human/human_attackhand.dm rename to code/modules/mob/living/human/human_attackhand.dm index 1cd230c8c13..64ba7e61f0e 100644 --- a/code/modules/mob/living/carbon/human/human_attackhand.dm +++ b/code/modules/mob/living/human/human_attackhand.dm @@ -334,7 +334,7 @@ start_compressions(H, FALSE, cpr_mode) //Breaks all grips and pulls that the mob currently has. -/mob/living/carbon/human/proc/break_all_grabs(mob/living/carbon/user) +/mob/living/carbon/human/proc/break_all_grabs(mob/living/user) . = FALSE for(var/obj/item/grab/grab in get_active_grabs()) if(grab.affecting) diff --git a/code/modules/mob/living/carbon/human/human_blood.dm b/code/modules/mob/living/human/human_blood.dm similarity index 98% rename from code/modules/mob/living/carbon/human/human_blood.dm rename to code/modules/mob/living/human/human_blood.dm index 606fe303b89..c30ff2bcccd 100644 --- a/code/modules/mob/living/carbon/human/human_blood.dm +++ b/code/modules/mob/living/human/human_blood.dm @@ -178,15 +178,17 @@ //Percentage of maximum blood volume. /mob/living/carbon/human/proc/get_blood_volume() - return species.blood_volume? round((vessel.total_volume/species.blood_volume)*100) : 0 + return species.blood_volume ? round((vessel.total_volume/species.blood_volume)*100) : 0 //Percentage of maximum blood volume, affected by the condition of circulation organs /mob/living/carbon/human/proc/get_blood_circulation() + + var/obj/item/organ/internal/heart/heart = get_organ(BP_HEART, /obj/item/organ/internal/heart) - var/blood_volume = get_blood_volume() if(!heart) - return 0.25 * blood_volume + return 0.25 * get_blood_volume() + var/blood_volume = get_blood_volume() var/recent_pump = LAZYACCESS(heart.external_pump, 1) > world.time - (20 SECONDS) var/pulse_mod = 1 if((status_flags & FAKEDEATH) || BP_IS_PROSTHETIC(heart)) @@ -205,13 +207,11 @@ if(PULSE_2FAST, PULSE_THREADY) pulse_mod *= 1.25 blood_volume *= pulse_mod - if(current_posture.prone) blood_volume *= 1.25 var/min_efficiency = recent_pump ? 0.5 : 0.3 blood_volume *= max(min_efficiency, (1-(heart.damage / heart.max_damage))) - if(!heart.open && has_chemical_effect(CE_BLOCKAGE, 1)) blood_volume *= max(0, 1-GET_CHEMICAL_EFFECT(src, CE_BLOCKAGE)) diff --git a/code/modules/mob/living/carbon/human/human_damage.dm b/code/modules/mob/living/human/human_damage.dm similarity index 96% rename from code/modules/mob/living/carbon/human/human_damage.dm rename to code/modules/mob/living/human/human_damage.dm index ea5f04ad075..710011c1b87 100644 --- a/code/modules/mob/living/carbon/human/human_damage.dm +++ b/code/modules/mob/living/human/human_damage.dm @@ -329,8 +329,11 @@ This function restores all organs. recheck_bad_external_organs() verbs -= /mob/living/carbon/human/proc/undislocate + /mob/living/carbon/human/apply_damage(var/damage = 0, var/damagetype = BRUTE, var/def_zone = null, var/damage_flags = 0, var/obj/used_weapon = null, var/armor_pen, var/silent = FALSE, var/obj/item/organ/external/given_organ = null) - if(status_flags & GODMODE) return //godmode + if(status_flags & GODMODE) + return //godmode + var/obj/item/organ/external/organ = given_organ if(!organ) if(isorgan(def_zone)) @@ -352,8 +355,10 @@ This function restores all organs. organ = GET_EXTERNAL_ORGAN(src, check_zone(def_zone, src)) //Handle other types of damage - if(!(damagetype in list(BRUTE, BURN, PAIN, CLONE))) + var/static/list/human_handled_damage_types = list(BRUTE, BURN, PAIN, CLONE) + if(!(damagetype in human_handled_damage_types)) return ..() + if(!istype(organ)) return 0 // This is reasonable and means the organ is missing. @@ -368,6 +373,7 @@ This function restores all organs. if(damage > 15 && prob(damage*4) && organ.can_feel_pain()) make_reagent(round(damage/10), /decl/material/liquid/adrenaline) + var/datum/wound/created_wound damageoverlaytemp = 20 switch(damagetype) @@ -400,7 +406,7 @@ This function restores all organs. //Electrical shock -/mob/living/carbon/human/apply_shock(var/shock_damage, var/def_zone, var/base_siemens_coeff = 1.0) +/mob/living/carbon/human/proc/apply_shock(var/shock_damage, var/def_zone, var/base_siemens_coeff = 1.0) var/obj/item/organ/external/initial_organ = GET_EXTERNAL_ORGAN(src, check_zone(def_zone, src)) if(!initial_organ) initial_organ = pick(get_external_organs()) @@ -424,23 +430,21 @@ This function restores all organs. floor_organ = pick(get_external_organs()) var/list/obj/item/organ/external/to_shock = trace_shock(initial_organ, floor_organ) - - if(to_shock && to_shock.len) - shock_damage /= to_shock.len - shock_damage = round(shock_damage, 0.1) - else + if(!length(to_shock)) return 0 - var/total_damage = 0 + shock_damage /= length(to_shock) + shock_damage = round(shock_damage, 0.1) for(var/obj/item/organ/external/E in to_shock) - total_damage += ..(shock_damage, E.organ_tag, base_siemens_coeff * get_siemens_coefficient_organ(E)) + var/actual_shock_damage = max(1, round(shock_damage * base_siemens_coeff * get_siemens_coefficient_organ(E))) + if(actual_shock_damage) + apply_damage(shock_damage, BURN, E.organ_tag, used_weapon="Electrocution") + . += actual_shock_damage - if(total_damage > 10) + if(. > 10) local_emp(initial_organ, 3) - return total_damage - /mob/living/carbon/human/proc/trace_shock(var/obj/item/organ/external/init, var/obj/item/organ/external/floor) var/list/obj/item/organ/external/traced_organs = list(floor) diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/human/human_defense.dm similarity index 91% rename from code/modules/mob/living/carbon/human/human_defense.dm rename to code/modules/mob/living/human/human_defense.dm index e953754d033..cd1e293ef8c 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/human/human_defense.dm @@ -389,7 +389,44 @@ meteor_act if (!def_zone) def_zone = pick(BP_L_HAND, BP_R_HAND) - return ..(shock_damage, source, base_siemens_coeff, def_zone) + shock_damage = apply_shock(shock_damage, def_zone, base_siemens_coeff) + + if(!shock_damage) + return 0 + + stun_effect_act(agony_amount=shock_damage, def_zone=def_zone) + + playsound(loc, "sparks", 50, 1, -1) + if (shock_damage > 15) + src.visible_message( + "[src] was electrocuted[source ? " by the [source]" : ""]!", \ + "You feel a powerful shock course through your body!", \ + "You hear a heavy electrical crack." \ + ) + else + src.visible_message( + "[src] was shocked[source ? " by the [source]" : ""].", \ + "You feel a shock course through your body.", \ + "You hear a zapping sound." \ + ) + + switch(shock_damage) + if(11 to 15) + SET_STATUS_MAX(src, STAT_STUN, 1) + if(16 to 20) + SET_STATUS_MAX(src, STAT_STUN, 2) + if(21 to 25) + SET_STATUS_MAX(src, STAT_WEAK, 2) + if(26 to 30) + SET_STATUS_MAX(src, STAT_WEAK, 5) + if(31 to INFINITY) + SET_STATUS_MAX(src, STAT_WEAK, 10) //This should work for now, more is really silly and makes you lay there forever + + set_status(STAT_JITTER, min(shock_damage*5, 200)) + + spark_at(loc, amount=5, cardinal_only = TRUE) + + return shock_damage /mob/living/carbon/human/explosion_act(severity) ..() @@ -446,20 +483,6 @@ meteor_act return prob(100 / 2**(head.w_class - brain.w_class - 1)) return TRUE -///eyecheck() -///Returns a number between -1 to 2 -/mob/living/carbon/human/eyecheck() - var/total_protection = flash_protection - var/decl/bodytype/root_bodytype = get_bodytype() - if(root_bodytype.has_organ[root_bodytype.vision_organ]) - var/obj/item/organ/internal/eyes/I = get_organ(root_bodytype.vision_organ, /obj/item/organ/internal/eyes) - if(!I?.is_usable()) - return FLASH_PROTECTION_MAJOR - total_protection = I.get_total_protection(flash_protection) - else // They can't be flashed if they don't have eyes. - return FLASH_PROTECTION_MAJOR - return total_protection - /mob/living/carbon/human/flash_eyes(var/intensity = FLASH_PROTECTION_MODERATE, override_blindness_check = FALSE, affect_silicon = FALSE, visual = FALSE, type = /obj/screen/fullscreen/flash) var/decl/bodytype/root_bodytype = get_bodytype() if(root_bodytype.has_organ[root_bodytype.vision_organ]) @@ -475,3 +498,14 @@ meteor_act if(I) // get_organ with a type passed already does a typecheck return I.get_flash_mod() return root_bodytype.eye_flash_mod + +/* +Contians the proc to handle radiation. +Specifically made to do radiation burns. +*/ +/mob/living/carbon/human/apply_radiation(damage) + ..() + if(!isSynthetic() && !ignore_rads) + damage = 0.25 * damage * (species ? species.get_radiation_mod(src) : 1) + take_damage(BURN, damage) + return TRUE diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/human/human_defines.dm similarity index 72% rename from code/modules/mob/living/carbon/human/human_defines.dm rename to code/modules/mob/living/human/human_defines.dm index 66db490a296..5142ca18883 100644 --- a/code/modules/mob/living/carbon/human/human_defines.dm +++ b/code/modules/mob/living/human/human_defines.dm @@ -20,8 +20,6 @@ var/voice = "" /// Used for determining if we need to process all organs or just some or even none. var/last_dam = -1 - /// organs we check until they are good. - var/list/bad_external_organs var/mob/remoteview_target = null var/hand_blood_color var/list/flavor_texts = list() @@ -33,8 +31,6 @@ var/robolimb_count = 0 /// The world_time where an unarmed attack was done var/last_attack = 0 - /// Total level of flash protection - var/flash_protection = 0 /// Total level of visualy impairing items var/equipment_tint_total = 0 /// Darksight modifier from equipped items @@ -64,3 +60,23 @@ var/vital_organ_missing_time /// Used to look up records when the client is logged out. var/comments_record_id + /// Active emote/pose - appended to examine + var/pose = null + /// Reagent holder for bloodstream reagents + var/datum/reagents/metabolism/bloodstr + /// Reagent holder for contact reagents + var/datum/reagents/metabolism/touching + /// Should this mob ignore radiation? + var/ignore_rads = FALSE + /// Whether the mob is performing cpr or not. + var/performing_cpr = FALSE + /// Cooldown tracker for throwing up. + var/lastpuke = 0 + /// Reference to the tank we are currently breathing from. + var/obj/item/tank/internal + /// Contains environment tolerances and language information, along with a lot of other stuff, usually set during Initialize(). + var/decl/species/species + /// these two help govern taste. The first is the last time a taste message was shown to the plaer. + var/last_taste_time = 0 + /// the second is the message in question. + var/last_taste_text = "" diff --git a/code/modules/mob/living/human/human_eating.dm b/code/modules/mob/living/human/human_eating.dm new file mode 100644 index 00000000000..9129919cd2d --- /dev/null +++ b/code/modules/mob/living/human/human_eating.dm @@ -0,0 +1,10 @@ +/mob/living/carbon/human/ingest(var/datum/reagents/from, var/datum/reagents/target, var/amount = 1, var/multiplier = 1, var/copy = 0) //we kind of 'sneak' a proc in here for ingesting stuff so we can play with it. + if(last_taste_time + 50 < world.time) + var/datum/reagents/temp = new(amount, global.temp_reagents_holder) //temporary holder used to analyse what gets transfered. + from.trans_to_holder(temp, amount, multiplier, 1) + var/text_output = temp.generate_taste_message(src, from) + if(text_output != last_taste_text || last_taste_time + 1 MINUTE < world.time) //We dont want to spam the same message over and over again at the person. Give it a bit of a buffer. + to_chat(src, SPAN_NOTICE("You can taste [text_output].")) //no taste means there are too many tastes and not enough flavor. + last_taste_time = world.time + last_taste_text = text_output + . = ..() diff --git a/code/modules/mob/living/carbon/human/human_examine_decl.dm b/code/modules/mob/living/human/human_examine_decl.dm similarity index 100% rename from code/modules/mob/living/carbon/human/human_examine_decl.dm rename to code/modules/mob/living/human/human_examine_decl.dm diff --git a/code/modules/mob/living/carbon/human/human_grabs.dm b/code/modules/mob/living/human/human_grabs.dm similarity index 100% rename from code/modules/mob/living/carbon/human/human_grabs.dm rename to code/modules/mob/living/human/human_grabs.dm diff --git a/code/modules/mob/living/carbon/human/human_helpers.dm b/code/modules/mob/living/human/human_helpers.dm similarity index 100% rename from code/modules/mob/living/carbon/human/human_helpers.dm rename to code/modules/mob/living/human/human_helpers.dm diff --git a/code/modules/mob/living/human/human_internals.dm b/code/modules/mob/living/human/human_internals.dm new file mode 100644 index 00000000000..126045b5b00 --- /dev/null +++ b/code/modules/mob/living/human/human_internals.dm @@ -0,0 +1,8 @@ +/mob/living/carbon/human/get_internals() + return internal + +/mob/living/carbon/human/set_internals(obj/item/tank/source, source_string) + ..() + internal = source + if(internals) + internals.icon_state = "internal[!!internal]" diff --git a/code/modules/mob/living/carbon/human/human_maneuvers.dm b/code/modules/mob/living/human/human_maneuvers.dm similarity index 100% rename from code/modules/mob/living/carbon/human/human_maneuvers.dm rename to code/modules/mob/living/human/human_maneuvers.dm diff --git a/code/modules/mob/living/carbon/human/human_movement.dm b/code/modules/mob/living/human/human_movement.dm similarity index 89% rename from code/modules/mob/living/carbon/human/human_movement.dm rename to code/modules/mob/living/human/human_movement.dm index eb52cca2f25..ee9edbc2dd4 100644 --- a/code/modules/mob/living/carbon/human/human_movement.dm +++ b/code/modules/mob/living/human/human_movement.dm @@ -108,12 +108,22 @@ . = ..() if(.) //We moved - var/stamina_cost = 0 - for(var/obj/item/grab/G as anything in get_active_grabs()) - stamina_cost -= G.grab_slowdown() - stamina_cost = round(stamina_cost) - if(stamina_cost < 0) - adjust_stamina(stamina_cost) + if(stat != DEAD) + + var/stamina_cost = 0 + for(var/obj/item/grab/G as anything in get_active_grabs()) + stamina_cost -= G.grab_slowdown() + stamina_cost = round(stamina_cost) + if(stamina_cost < 0) + adjust_stamina(stamina_cost) + + var/nut_removed = DEFAULT_HUNGER_FACTOR/10 + var/hyd_removed = DEFAULT_THIRST_FACTOR/10 + if (move_intent.flags & MOVE_INTENT_EXERTIVE) + nut_removed *= 2 + hyd_removed *= 2 + adjust_nutrition(-nut_removed) + adjust_hydration(-hyd_removed) handle_leg_damage() species.handle_post_move(src) diff --git a/code/modules/mob/living/carbon/human/human_organs.dm b/code/modules/mob/living/human/human_organs.dm similarity index 60% rename from code/modules/mob/living/carbon/human/human_organs.dm rename to code/modules/mob/living/human/human_organs.dm index 93eb234aff7..eacb41a06fe 100644 --- a/code/modules/mob/living/carbon/human/human_organs.dm +++ b/code/modules/mob/living/human/human_organs.dm @@ -1,3 +1,130 @@ +/// organ-related variables, see organ.dm and human_organs.dm, shouldn't be accessed directly +/mob/living/carbon/human + /// organs we check until they are good. + var/list/bad_external_organs + /// organs grouped by category, largely used for stance calc + var/list/organs_by_category + /// organs indexed by organ_tag + var/list/organs_by_tag + /// unassociated list of internal organs + var/tmp/list/internal_organs + /// unassociated list of external organs + var/tmp/list/external_organs + +/mob/living/carbon/human/get_organ(var/organ_tag, var/expected_type = /obj/item/organ) + RETURN_TYPE(expected_type) + var/obj/item/organ = LAZYACCESS(organs_by_tag, organ_tag) + if(!expected_type || istype(organ, expected_type)) + return organ + +/mob/living/carbon/human/get_external_organs() + return external_organs + +/mob/living/carbon/human/get_internal_organs() + return internal_organs + +/mob/living/carbon/human/has_organs() + return (LAZYLEN(external_organs) + LAZYLEN(internal_organs)) > 0 + +/mob/living/carbon/human/has_external_organs() + return LAZYLEN(external_organs) > 0 + +/mob/living/carbon/human/has_internal_organs() + return LAZYLEN(internal_organs) > 0 + +/mob/living/carbon/human/get_organs_by_categories(var/list/categories) + for(var/organ_cat in categories) + if(organ_cat in organs_by_category) + LAZYDISTINCTADD(., organs_by_category[organ_cat]) + +//Deletes all references to organs +/mob/living/carbon/human/delete_organs() + ..() + organs_by_tag = null + internal_organs = null + external_organs = null + organs_by_category = null + LAZYCLEARLIST(bad_external_organs) + +//Registers an organ and setup the organ hierachy properly. +//affected : Parent organ if applicable. +//in_place : If true, we're performing an in-place replacement, without triggering anything related to adding the organ in-game as part of surgery or else. +/mob/living/carbon/human/add_organ(obj/item/organ/O, obj/item/organ/external/affected, in_place, update_icon, detached, skip_health_update = FALSE) + + var/obj/item/organ/existing = LAZYACCESS(organs_by_tag, O.organ_tag) + if(existing && O != existing) + CRASH("mob/living/carbon/human/add_organ(): '[O]' tried to overwrite [src]'s existing organ '[existing]' in slot '[O.organ_tag]'!") + if(O.parent_organ && !LAZYACCESS(organs_by_tag, O.parent_organ)) + CRASH("mob/living/carbon/human/add_organ(): Tried to add an internal organ to a non-existing parent external organ!") + + //We don't add internal organs to the lists if we're detached + if(O.is_internal() && !detached) + LAZYSET(organs_by_tag, O.organ_tag, O) + LAZYDISTINCTADD(internal_organs, O) + //External organs must always be in the organ list even when detached. Otherwise icon updates won't show the limb, and limb attach surgeries won't work + else if(!O.is_internal()) + LAZYSET(organs_by_tag, O.organ_tag, O) + LAZYDISTINCTADD(external_organs, O) + + // Update our organ category lists, if neeed. + if(O.organ_category) + LAZYINITLIST(organs_by_category) + LAZYDISTINCTADD(organs_by_category[O.organ_category], O) + + . = ..() + if(!.) + return + + if(!O.is_internal()) + refresh_modular_limb_verbs() + + //#TODO: wish we could invalidate the human icons to trigger a single update when the organ state changes multiple times in a row + if(update_icon) + update_inhand_overlays(FALSE) + update_body(FALSE) + update_bandages(FALSE) + update_damage_overlays(FALSE) + hud_reset() + queue_icon_update() //Avoids calling icon updates 50 times when adding multiple organs + +//Unregister and remove a given organ from the mob. +//drop_organ : Once the organ is removed its dropped to the ground. +//detach : Toggle the ORGAN_CUT_AWAY flag on the removed organ +//ignore_children: Skips recursively removing this organ's child organs. +//in_place : If true we remove only the organ (no children items or implants) and avoid triggering mob changes and parent organs changes as much as possible. +// Meant to be used for init and species transforms, without triggering any updates to mob state or anything related to losing a limb as part of surgery or combat. +/mob/living/carbon/human/remove_organ(var/obj/item/organ/O, var/drop_organ = TRUE, var/detach = TRUE, var/ignore_children = FALSE, var/in_place = FALSE, var/update_icon = TRUE, var/skip_health_update = FALSE) + if(istype(O) && !in_place && O.is_vital_to_owner() && usr) + admin_attack_log(usr, src, "Removed a vital organ ([src]).", "Had a vital organ ([src]) removed.", "removed a vital organ ([src]) from") + if(!(. = ..())) + return + LAZYREMOVE(organs_by_tag, O.organ_tag) + if(O.is_internal()) + LAZYREMOVE(internal_organs, O) + else + LAZYREMOVE(external_organs, O) + + // Update our organ category lists, if neeed. + if(O.organ_category && islist(organs_by_category)) + organs_by_category[O.organ_category] -= O + if(LAZYLEN(organs_by_category[O.organ_category]) <= 0) + LAZYREMOVE(organs_by_category, O.organ_category) + + if(!O.is_internal()) + refresh_modular_limb_verbs() + LAZYREMOVE(bad_external_organs, O) + + //#TODO: wish we could invalidate the human icons to trigger a single update when the organ state changes multiple times in a row + if(update_icon) + regenerate_body_icon = TRUE + hud_reset() + queue_icon_update() //Avoids calling icon updates 50 times when removing multiple organs + +/mob/living/carbon/human/get_bodytype() + RETURN_TYPE(/decl/bodytype) + // If the root organ ever changes/isn't always the chest, this will need to be changed. + return get_organ(BP_CHEST, /obj/item/organ)?.bodytype + /mob/living/carbon/human/proc/update_eyes(update_icons = TRUE) var/obj/item/organ/internal/eyes/eyes = get_organ((get_bodytype()?.vision_organ || BP_EYES), /obj/item/organ/internal/eyes) if(eyes) @@ -88,53 +215,9 @@ return TRUE return FALSE -//Registers an organ and setup the organ hierachy properly. -//affected : Parent organ if applicable. -//in_place : If true, we're performing an in-place replacement, without triggering anything related to adding the organ in-game as part of surgery or else. -/mob/living/carbon/human/add_organ(obj/item/organ/O, obj/item/organ/external/affected, in_place, update_icon, detached, skip_health_update = FALSE) - if(!(. = ..())) - return - if(!O.is_internal()) - refresh_modular_limb_verbs() - - //#TODO: wish we could invalidate the human icons to trigger a single update when the organ state changes multiple times in a row - if(update_icon) - update_inhand_overlays(FALSE) - update_body(FALSE) - update_bandages(FALSE) - update_damage_overlays(FALSE) - hud_reset() - queue_icon_update() //Avoids calling icon updates 50 times when adding multiple organs - -//Unregister and remove a given organ from the mob. -//drop_organ : Once the organ is removed its dropped to the ground. -//detach : Toggle the ORGAN_CUT_AWAY flag on the removed organ -//ignore_children: Skips recursively removing this organ's child organs. -//in_place : If true we remove only the organ (no children items or implants) and avoid triggering mob changes and parent organs changes as much as possible. -// Meant to be used for init and species transforms, without triggering any updates to mob state or anything related to losing a limb as part of surgery or combat. -/mob/living/carbon/human/remove_organ(obj/item/organ/O, drop_organ, detach, ignore_children, in_place, update_icon, skip_health_update = FALSE) - if(!(. = ..())) - return - if(!O.is_internal()) - refresh_modular_limb_verbs() - LAZYREMOVE(bad_external_organs, O) - - //#TODO: wish we could invalidate the human icons to trigger a single update when the organ state changes multiple times in a row - if(update_icon) - regenerate_body_icon = TRUE - hud_reset() - queue_icon_update() //Avoids calling icon updates 50 times when removing multiple organs - /mob/living/carbon/human/on_lost_organ(var/obj/item/organ/O) if(!(. = ..())) return //Move some blood over to the organ if(!BP_IS_PROSTHETIC(O) && O.species && O.reagents?.total_volume < 5) vessel.trans_to(O, 5 - O.reagents.total_volume, 1, 1) - -/mob/living/carbon/human/delete_organs() - . = ..() - LAZYCLEARLIST(bad_external_organs) - -/mob/living/carbon/human/get_injured_organs() - return bad_external_organs diff --git a/code/modules/mob/living/carbon/human/human_powers.dm b/code/modules/mob/living/human/human_powers.dm similarity index 100% rename from code/modules/mob/living/carbon/human/human_powers.dm rename to code/modules/mob/living/human/human_powers.dm diff --git a/code/modules/mob/living/carbon/resist.dm b/code/modules/mob/living/human/human_resist.dm similarity index 67% rename from code/modules/mob/living/carbon/resist.dm rename to code/modules/mob/living/human/human_resist.dm index 9eef36b15d9..83306d717e2 100644 --- a/code/modules/mob/living/carbon/resist.dm +++ b/code/modules/mob/living/human/human_resist.dm @@ -1,4 +1,4 @@ -/mob/living/carbon/process_resist() +/mob/living/carbon/human/process_resist() //drop && roll if(on_fire && !buckled) @@ -29,10 +29,7 @@ if(get_equipped_item(slot_handcuffed_str)) spawn() escape_handcuffs() -/mob/living/carbon/proc/get_cuff_breakout_mod() - return 1 - -/mob/living/carbon/proc/escape_handcuffs() +/mob/living/carbon/human/proc/escape_handcuffs() //This line represent a significant buff to grabs... // We don't have to check the click cooldown because /mob/living/verb/resist() has done it for us, we can simply set the delay setClickCooldown(100) @@ -98,10 +95,7 @@ drop_from_inventory(cuffs) return -/mob/living/proc/can_break_cuffs() - . = FALSE - -/mob/living/carbon/proc/break_handcuffs() +/mob/living/carbon/human/proc/break_handcuffs() var/obj/item/cuffs = get_equipped_item(slot_handcuffed_str) visible_message( "[src] is trying to break \the [cuffs]!", @@ -122,53 +116,3 @@ qdel(cuffs) if(buckled && buckled.buckle_require_restraints) buckled.unbuckle_mob() - -/mob/living/carbon/human/can_break_cuffs() - . = ..() || species.can_shred(src,1) - -/mob/living/carbon/proc/get_special_resist_time() - return 0 - -/mob/living/carbon/escape_buckle() - var/unbuckle_time - if(src.get_equipped_item(slot_handcuffed_str) && istype(src.buckled, /obj/effect/energy_net)) - var/obj/effect/energy_net/N = src.buckled - N.escape_net(src) //super snowflake but is literally used NOWHERE ELSE.-Luke - return - - if(!buckled) return - if(!restrained()) - ..() - else - setClickCooldown(100) - unbuckle_time = max(0, (2 MINUTES) - get_special_resist_time()) - - visible_message( - "[src] attempts to unbuckle themself!", - "You attempt to unbuckle yourself. (This will take around [unbuckle_time / (1 SECOND)] second\s and you need to stand still)", range = 2 - ) - - if(unbuckle_time && buckled) - var/stages = 2 - for(var/i = 1 to stages) - if(!unbuckle_time || do_after(usr, unbuckle_time*0.5, incapacitation_flags = INCAPACITATION_DEFAULT & ~(INCAPACITATION_RESTRAINED | INCAPACITATION_BUCKLED_FULLY))) - if(!buckled) - return - visible_message( - SPAN_WARNING("\The [src] tries to unbuckle themself."), - SPAN_WARNING("You try to unbuckle yourself ([i*100/stages]% done)."), range = 2 - ) - else - if(!buckled) - return - visible_message( - SPAN_WARNING("\The [src] stops trying to unbuckle themself."), - SPAN_WARNING("You stop trying to unbuckle yourself."), range = 2 - ) - return - visible_message( - SPAN_DANGER("\The [src] manages to unbuckle themself!"), - SPAN_NOTICE("You successfully unbuckle yourself."), range = 2 - ) - buckled.user_unbuckle_mob(src) - return diff --git a/code/modules/mob/living/carbon/human/human_skin.dm b/code/modules/mob/living/human/human_skin.dm similarity index 100% rename from code/modules/mob/living/carbon/human/human_skin.dm rename to code/modules/mob/living/human/human_skin.dm diff --git a/code/modules/mob/living/carbon/human/human_species.dm b/code/modules/mob/living/human/human_species.dm similarity index 100% rename from code/modules/mob/living/carbon/human/human_species.dm rename to code/modules/mob/living/human/human_species.dm diff --git a/code/modules/mob/living/carbon/human/human_verbs.dm b/code/modules/mob/living/human/human_verbs.dm similarity index 99% rename from code/modules/mob/living/carbon/human/human_verbs.dm rename to code/modules/mob/living/human/human_verbs.dm index 3c5a947da48..853d3a7e19a 100644 --- a/code/modules/mob/living/carbon/human/human_verbs.dm +++ b/code/modules/mob/living/human/human_verbs.dm @@ -85,7 +85,7 @@ src.verbs -= /mob/living/carbon/human/proc/remotesay return var/list/creatures = list() - for(var/mob/living/carbon/h in global.player_list) + for(var/mob/living/h in global.player_list) creatures += h var/mob/target = input("Who do you want to project your mind to ?") as null|anything in creatures if (isnull(target)) @@ -123,7 +123,7 @@ var/list/mob/creatures = list() - for(var/mob/living/carbon/h in global.living_mob_list_) + for(var/mob/living/h in global.living_mob_list_) var/turf/temp_turf = get_turf(h) if((temp_turf.z != 1 && temp_turf.z != 5) || h.stat!=CONSCIOUS) //Not on mining or the station. Or dead continue diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/human/life.dm similarity index 100% rename from code/modules/mob/living/carbon/human/life.dm rename to code/modules/mob/living/human/life.dm diff --git a/code/modules/mob/living/carbon/human/login.dm b/code/modules/mob/living/human/login.dm similarity index 100% rename from code/modules/mob/living/carbon/human/login.dm rename to code/modules/mob/living/human/login.dm diff --git a/code/modules/mob/living/carbon/human/logout.dm b/code/modules/mob/living/human/logout.dm similarity index 100% rename from code/modules/mob/living/carbon/human/logout.dm rename to code/modules/mob/living/human/logout.dm diff --git a/code/modules/mob/living/carbon/human/npcs.dm b/code/modules/mob/living/human/npcs.dm similarity index 100% rename from code/modules/mob/living/carbon/human/npcs.dm rename to code/modules/mob/living/human/npcs.dm diff --git a/code/modules/mob/living/carbon/human/obj_grabs.dm b/code/modules/mob/living/human/obj_grabs.dm similarity index 100% rename from code/modules/mob/living/carbon/human/obj_grabs.dm rename to code/modules/mob/living/human/obj_grabs.dm diff --git a/code/modules/mob/living/carbon/human/say.dm b/code/modules/mob/living/human/say.dm similarity index 100% rename from code/modules/mob/living/carbon/human/say.dm rename to code/modules/mob/living/human/say.dm diff --git a/code/modules/mob/living/carbon/human/unarmed_attack.dm b/code/modules/mob/living/human/unarmed_attack.dm similarity index 100% rename from code/modules/mob/living/carbon/human/unarmed_attack.dm rename to code/modules/mob/living/human/unarmed_attack.dm diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/human/update_icons.dm similarity index 98% rename from code/modules/mob/living/carbon/human/update_icons.dm rename to code/modules/mob/living/human/update_icons.dm index 4bc4a8c0184..e527fb203a5 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/human/update_icons.dm @@ -134,6 +134,10 @@ Please contact me on #coderbus IRC. ~Carn x visible_underlays = get_all_current_mob_underlays() var/decl/bodytype/root_bodytype = get_bodytype() + // We are somehow updating with no torso, or a torso with no bodytype (probably gibbing). No point continuing. + if(!root_bodytype) + return + var/matrix/M = matrix() if(current_posture?.prone && (root_bodytype.prone_overlay_offset[1] || root_bodytype.prone_overlay_offset[2])) M.Translate(root_bodytype.prone_overlay_offset[1], root_bodytype.prone_overlay_offset[2]) @@ -537,17 +541,6 @@ Please contact me on #coderbus IRC. ~Carn x else set_current_mob_overlay(HO_FIRE_LAYER, null, update_icons) -//Ported from hud login stuff -// -/mob/living/carbon/hud_reset(full_reset = FALSE) - if(!(. = ..())) - return . - for(var/obj/item/gear in get_equipped_items(TRUE)) - client.screen |= gear - if(istype(hud_used)) - hud_used.hidden_inventory_update() - hud_used.persistant_inventory_update() - update_action_buttons() - if(internals && internal) +/mob/living/carbon/human/hud_reset(full_reset = FALSE) + if((. = ..()) && internals && internal) internals.icon_state = "internal1" - queue_hand_rebuild() diff --git a/code/modules/mob/living/carbon/human/whisper.dm b/code/modules/mob/living/human/whisper.dm similarity index 100% rename from code/modules/mob/living/carbon/human/whisper.dm rename to code/modules/mob/living/human/whisper.dm diff --git a/code/modules/mob/living/life.dm b/code/modules/mob/living/life.dm index 782bdbae84d..1635435aa31 100644 --- a/code/modules/mob/living/life.dm +++ b/code/modules/mob/living/life.dm @@ -572,6 +572,7 @@ #define LIMB_DAMAGED 1 #define LIMB_IMPAIRED 0.5 + /mob/living/proc/handle_stance() set waitfor = FALSE // Can sleep in emotes. // Don't need to process any of this if they aren't standing anyways diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index c49f95ca151..43671aea492 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -302,13 +302,6 @@ default behaviour is: /mob/living/proc/restore_all_organs() return - -/mob/living/carbon/revive() - var/obj/item/cuffs = get_equipped_item(slot_handcuffed_str) - if (cuffs) - try_unequip(cuffs, get_turf(src)) - . = ..() - /mob/living/proc/revive() rejuvenate() if(buckled) @@ -318,6 +311,9 @@ default behaviour is: BITSET(hud_updateflag, LIFE_HUD) ExtinguishMob() fire_stacks = 0 + var/obj/item/cuffs = get_equipped_item(slot_handcuffed_str) + if (cuffs) + try_unequip(cuffs, get_turf(src)) /mob/living/proc/rejuvenate() @@ -363,12 +359,26 @@ default behaviour is: BITSET(hud_updateflag, STATUS_HUD) BITSET(hud_updateflag, LIFE_HUD) + set_nutrition(get_max_nutrition()) + set_hydration(get_max_hydration()) + failed_last_breath = 0 //So mobs that died of oxyloss don't revive and have perpetual out of breath. reload_fullscreen() return /mob/living/proc/basic_revival(var/repair_brain = TRUE) + if(repair_brain && should_have_organ(BP_BRAIN)) + repair_brain = FALSE + var/obj/item/organ/internal/brain = GET_INTERNAL_ORGAN(src, BP_BRAIN) + if(brain) + if(brain.damage > (brain.max_damage/2)) + brain.damage = (brain.max_damage/2) + if(brain.status & ORGAN_DEAD) + brain.status &= ~ORGAN_DEAD + START_PROCESSING(SSobj, brain) + brain.update_icon() + if(repair_brain && get_damage(BRAIN) > 50) repair_brain = FALSE set_damage(BRAIN, 50) @@ -387,19 +397,6 @@ default behaviour is: failed_last_breath = 0 //So mobs that died of oxyloss don't revive and have perpetual out of breath. reload_fullscreen() -/mob/living/carbon/basic_revival(var/repair_brain = TRUE) - if(repair_brain && should_have_organ(BP_BRAIN)) - repair_brain = FALSE - var/obj/item/organ/internal/brain = GET_INTERNAL_ORGAN(src, BP_BRAIN) - if(brain) - if(brain.damage > (brain.max_damage/2)) - brain.damage = (brain.max_damage/2) - if(brain.status & ORGAN_DEAD) - brain.status &= ~ORGAN_DEAD - START_PROCESSING(SSobj, brain) - brain.update_icon() - ..(repair_brain) - /mob/living var/previous_damage_appearance // store what the body last looked like, so we only have to update it if something changed var/static/list/damage_icon_parts = list() @@ -511,6 +508,8 @@ default behaviour is: handle_grabs_after_move(old_loc, Dir) if(active_storage && !active_storage.can_view(src)) active_storage.close(src) + if(germ_level < GERM_LEVEL_MOVE_CAP && prob(8)) + germ_level++ /mob/living/verb/resist() set name = "Resist" @@ -577,22 +576,6 @@ default behaviour is: if(loc != H) qdel(H) -/mob/living/proc/escape_buckle() - if(buckled) - if(buckled.can_buckle) - buckled.user_unbuckle_mob(src) - else - to_chat(usr, "You can't seem to escape from \the [buckled]!") - return - -/mob/living/proc/resist_grab() - var/resisting = 0 - for(var/obj/item/grab/G in grabbed_by) - resisting++ - G.handle_resist() - if(resisting) - visible_message("[src] resists!") - // Shortcut for people used to typing Rest instead of Change Posture. /mob/living/verb/rest_verb() set name = "Rest" @@ -632,20 +615,36 @@ default behaviour is: //called when the mob receives a bright flash /mob/living/flash_eyes(intensity = FLASH_PROTECTION_MODERATE, override_blindness_check = FALSE, affect_silicon = FALSE, visual = FALSE, type = /obj/screen/fullscreen/flash) - if(override_blindness_check || !(disabilities & BLINDED)) - ..() + if(eyecheck() < intensity || override_blindness_check) overlay_fullscreen("flash", type) spawn(25) if(src) clear_fullscreen("flash", 25) - return 1 + return TRUE + return FALSE /mob/living/proc/has_brain() return TRUE /mob/living/proc/slip(var/slipped_on, stun_duration = 8) + + var/decl/species/my_species = get_species() + if(my_species?.check_no_slip(src)) + return FALSE + + var/obj/item/shoes = get_equipped_item(slot_shoes_str) + if(shoes && (shoes.item_flags & ITEM_FLAG_NOSLIP)) + return FALSE + + if(has_gravity() && !buckled && !current_posture?.prone) + to_chat(src, SPAN_DANGER("You slipped on [slipped_on]!")) + playsound(loc, 'sound/misc/slip.ogg', 50, 1, -3) + SET_STATUS_MAX(src, STAT_WEAK, stun_duration) + return TRUE + return FALSE + /mob/living/carbon/human/canUnEquip(obj/item/I) . = ..() && !(I in get_organs()) @@ -808,6 +807,7 @@ default behaviour is: A.fluid_act(fluids) if(QDELETED(src) || !fluids.total_volume) return + // TODO: review saturation logic so we can end up with more than like 15 water in our contact reagents. var/datum/reagents/touching_reagents = get_contact_reagents() if(touching_reagents) var/saturation = min(fluids.total_volume, round(mob_size * 1.5 * reagent_permeability()) - touching_reagents.total_volume) @@ -838,7 +838,17 @@ default behaviour is: vomit.add_to_reagents(/decl/material/liquid/acid/stomach, 5) /mob/living/proc/eyecheck() - return FLASH_PROTECTION_NONE + var/total_protection = flash_protection + if(should_have_organ(BP_EYES)) + var/decl/bodytype/root_bodytype = get_bodytype() + if(root_bodytype.has_organ[root_bodytype.vision_organ]) + var/obj/item/organ/internal/eyes/I = get_organ(root_bodytype.vision_organ, /obj/item/organ/internal/eyes) + if(!I?.is_usable()) + return FLASH_PROTECTION_MAJOR + total_protection = I.get_total_protection(flash_protection) + else // They can't be flashed if they don't have eyes. + return FLASH_PROTECTION_MAJOR + return total_protection /mob/living/proc/get_satiated_nutrition() return 500 @@ -943,7 +953,7 @@ default behaviour is: /mob/living/proc/should_have_organ(organ_to_check) var/decl/bodytype/root_bodytype = get_bodytype() - return root_bodytype?.has_organ[organ_to_check] + return !!root_bodytype?.has_organ[organ_to_check] /// Returns null if the mob's bodytype doesn't have a limb tag by default. /// Otherwise, returns the data of the limb instead. @@ -1544,6 +1554,52 @@ default behaviour is: /mob/living/proc/handle_footsteps() return +/mob/living/handle_flashed(var/obj/item/flash/flash, var/flash_strength) + + var/safety = eyecheck() + if(safety >= FLASH_PROTECTION_MODERATE || flash_strength <= 0) // May be modified by human proc. + return FALSE + + flash_eyes(FLASH_PROTECTION_MODERATE - safety) + SET_STATUS_MAX(src, STAT_STUN, (flash_strength / 2)) + SET_STATUS_MAX(src, STAT_BLURRY, flash_strength) + SET_STATUS_MAX(src, STAT_CONFUSE, (flash_strength + 2)) + if(flash_strength > 3) + drop_held_items() + if(flash_strength > 5) + SET_STATUS_MAX(src, STAT_WEAK, 2) + +/mob/living/verb/showoff() + set name = "Show Held Item" + set category = "Object" + + var/obj/item/I = get_active_held_item() + if(I && I.simulated) + I.showoff(src) + +/mob/living/relaymove(var/mob/living/user, direction) + if(!istype(user) || !(user in contents) || user.is_on_special_ability_cooldown()) + return + user.set_special_ability_cooldown(5 SECONDS) + visible_message(SPAN_DANGER("You hear something rumbling inside [src]'s stomach...")) + var/obj/item/I = user.get_active_held_item() + if(!I?.force) + return + var/d = rand(round(I.force / 4), I.force) + visible_message(SPAN_DANGER("\The [user] attacks [src]'s stomach wall with \the [I]!")) + playsound(user.loc, 'sound/effects/attackblob.ogg', 50, 1) + var/obj/item/organ/external/organ = GET_EXTERNAL_ORGAN(src, BP_CHEST) + if(istype(organ)) + organ.take_external_damage(d, 0) + else + take_organ_damage(d) + if(prob(get_damage(BRUTE) - 50)) + gib() + +/mob/living/hud_reset(full_reset = FALSE) + if((. = ..())) + queue_hand_rebuild() + /mob/living/get_movement_delay(var/travel_dir) . = ..() if(stance_damage) diff --git a/code/modules/mob/living/living_breath.dm b/code/modules/mob/living/living_breath.dm index d4be74ddffd..82b2a7cedc1 100644 --- a/code/modules/mob/living/living_breath.dm +++ b/code/modules/mob/living/living_breath.dm @@ -13,7 +13,7 @@ return TRUE /mob/living/proc/should_breathe() - return FALSE + return ((life_tick % 2) == 0 || failed_last_breath || is_asystole()) /mob/living/proc/try_breathe() diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm index 558f1d72ea1..3a78ee53100 100644 --- a/code/modules/mob/living/living_defense.dm +++ b/code/modules/mob/living/living_defense.dm @@ -123,7 +123,9 @@ //returns 0 if the effects failed to apply for some reason, 1 otherwise. /mob/living/standard_weapon_hit_effects(obj/item/I, mob/living/user, var/effective_force, var/hit_zone) if(effective_force) - return apply_damage(effective_force, I.atom_damage_type, hit_zone, I.damage_flags(), used_weapon=I, armor_pen=I.armor_penetration) + try_embed_in_mob(I, hit_zone, effective_force, direction = get_dir(user, src)) + return TRUE + return FALSE /mob/living/hitby(var/atom/movable/AM, var/datum/thrownthing/TT) diff --git a/code/modules/mob/living/living_defines.dm b/code/modules/mob/living/living_defines.dm index 61450cf4d94..b6bfa9e1cae 100644 --- a/code/modules/mob/living/living_defines.dm +++ b/code/modules/mob/living/living_defines.dm @@ -73,6 +73,9 @@ // Currently only on humans due to the spaghetti code involved, TODO: generalize. var/list/appearance_descriptors + /// Total level of flash protection + var/flash_protection = FLASH_PROTECTION_NONE + /// Whether this mob's ability to stand has been affected var/stance_damage = 0 diff --git a/code/modules/mob/living/carbon/carbon_eating.dm b/code/modules/mob/living/living_eating.dm similarity index 60% rename from code/modules/mob/living/carbon/carbon_eating.dm rename to code/modules/mob/living/living_eating.dm index 40d51220515..b9fce7dfa9b 100644 --- a/code/modules/mob/living/carbon/carbon_eating.dm +++ b/code/modules/mob/living/living_eating.dm @@ -1,3 +1,7 @@ +/mob/living/proc/ingest(var/datum/reagents/from, var/datum/reagents/target, var/amount = 1, var/multiplier = 1, var/copy = 0) + RAISE_EVENT(/decl/observ/ingested, src, from, target, amount, multiplier, copy) + . = from.trans_to_holder(target,amount,multiplier,copy) + /mob/living/can_eat_food_currently(obj/eating, mob/user, consumption_method) user = user || src if(get_food_satiation(consumption_method) < get_max_nutrition()) diff --git a/code/modules/mob/living/living_resist.dm b/code/modules/mob/living/living_resist.dm new file mode 100644 index 00000000000..c63c9b4a09c --- /dev/null +++ b/code/modules/mob/living/living_resist.dm @@ -0,0 +1,68 @@ +/mob/living/proc/escape_buckle() + + if(!buckled) + return + + var/unbuckle_time + if(get_equipped_item(slot_handcuffed_str) && istype(buckled, /obj/effect/energy_net)) + var/obj/effect/energy_net/N = buckled + N.escape_net(src) //super snowflake but is literally used NOWHERE ELSE.-Luke + return + + if(!restrained()) + if(buckled.can_buckle) + buckled.user_unbuckle_mob(src) + else + to_chat(usr, "You can't seem to escape from \the [buckled]!") + return + + setClickCooldown(100) + unbuckle_time = max(0, (2 MINUTES) - get_special_resist_time()) + + visible_message( + "[src] attempts to unbuckle themself!", + "You attempt to unbuckle yourself. (This will take around [unbuckle_time / (1 SECOND)] second\s and you need to stand still)", range = 2 + ) + + if(unbuckle_time && buckled) + var/stages = 2 + for(var/i = 1 to stages) + if(!unbuckle_time || do_after(usr, unbuckle_time*0.5, incapacitation_flags = INCAPACITATION_DEFAULT & ~(INCAPACITATION_RESTRAINED | INCAPACITATION_BUCKLED_FULLY))) + if(!buckled) + return + visible_message( + SPAN_WARNING("\The [src] tries to unbuckle themself."), + SPAN_WARNING("You try to unbuckle yourself ([i*100/stages]% done)."), range = 2 + ) + else + if(!buckled) + return + visible_message( + SPAN_WARNING("\The [src] stops trying to unbuckle themself."), + SPAN_WARNING("You stop trying to unbuckle yourself."), range = 2 + ) + return + visible_message( + SPAN_DANGER("\The [src] manages to unbuckle themself!"), + SPAN_NOTICE("You successfully unbuckle yourself."), range = 2 + ) + buckled.user_unbuckle_mob(src) + return + +/mob/living/proc/resist_grab() + var/resisting = 0 + for(var/obj/item/grab/G in grabbed_by) + resisting++ + G.handle_resist() + if(resisting) + visible_message("[src] resists!") + +/mob/living/proc/get_cuff_breakout_mod() + return 1 + +/mob/living/proc/can_break_cuffs() + var/decl/species/my_species = get_species() + return my_species?.can_shred(src, 1) + +/mob/living/proc/get_special_resist_time() + return 0 diff --git a/code/modules/mob/living/simple_animal/hostile/giant_spider.dm b/code/modules/mob/living/simple_animal/hostile/giant_spider.dm index d1b8d1e3cc3..9832ad8bfd8 100644 --- a/code/modules/mob/living/simple_animal/hostile/giant_spider.dm +++ b/code/modules/mob/living/simple_animal/hostile/giant_spider.dm @@ -106,7 +106,7 @@ hunt_chance = 25 can_escape = TRUE pry_time = 5 SECONDS - flash_vulnerability = 2 //sensitive eyes for stalking prey + flash_protection = FLASH_PROTECTION_REDUCED does_spin = FALSE available_maneuvers = list(/decl/maneuver/leap/spider) ability_cooldown = 3 MINUTES @@ -126,7 +126,7 @@ fire_desc = "spits venom" ranged_range = 6 pry_time = 7 SECONDS - flash_vulnerability = 2 + flash_protection = FLASH_PROTECTION_REDUCED var/venom_charge = 16 diff --git a/code/modules/mob/living/simple_animal/hostile/leech.dm b/code/modules/mob/living/simple_animal/hostile/leech.dm index 7b67b8644f4..ae82d4b6afc 100644 --- a/code/modules/mob/living/simple_animal/hostile/leech.dm +++ b/code/modules/mob/living/simple_animal/hostile/leech.dm @@ -9,7 +9,7 @@ faction = "leeches" can_pry = FALSE break_stuff_probability = 5 - flash_vulnerability = 0 + flash_protection = FLASH_PROTECTION_MAJOR bleed_colour = COLOR_VIOLET var/suck_potency = 8 @@ -64,7 +64,7 @@ QDEL_NULL(proxy_listener) . = ..() -/obj/structure/leech_spawner/proc/burst(var/mob/living/carbon/victim) +/obj/structure/leech_spawner/proc/burst(var/mob/living/victim) if(!proxy_listener || !istype(victim) || !(victim in view(5, src))) return for(var/i in 1 to 12) diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/king_of_goats.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/king_of_goats.dm index 6f6d182d797..e18e9eb4479 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/king_of_goats.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/king_of_goats.dm @@ -21,7 +21,7 @@ max_gas = null minbodytemp = 0 break_stuff_probability = 35 - flash_vulnerability = 0 + flash_protection = FLASH_PROTECTION_MAJOR natural_weapon = /obj/item/natural_weapon/goatking var/current_damtype = BRUTE var/list/elemental_weapons = list( diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/parrot.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/parrot.dm index de6aec3a362..8d058d6217b 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/parrot.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/parrot.dm @@ -435,7 +435,7 @@ return 1 var/obj/item/stolen_item = null - for(var/mob/living/carbon/C in view(1,src)) + for(var/mob/living/C in view(1,src)) for(var/obj/item/thing in C.get_held_items()) if(can_pick_up(thing)) stolen_item = thing diff --git a/code/modules/mob/living/simple_animal/hostile/slug.dm b/code/modules/mob/living/simple_animal/hostile/slug.dm index 8a4f83e6221..1e7b56fc5ac 100644 --- a/code/modules/mob/living/simple_animal/hostile/slug.dm +++ b/code/modules/mob/living/simple_animal/hostile/slug.dm @@ -26,7 +26,7 @@ if(check_friendly_species(M)) . -= M -/mob/living/simple_animal/hostile/slug/get_scooped(var/mob/living/carbon/target, var/mob/living/initiator) +/mob/living/simple_animal/hostile/slug/get_scooped(var/mob/living/target, var/mob/living/initiator) if(target == initiator || check_friendly_species(initiator)) return ..() to_chat(initiator, SPAN_WARNING("\The [src] wriggles out of your hands before you can pick it up!")) diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index ef327c6de07..6bb840f627f 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -61,7 +61,6 @@ var/resistance = 0 // Damage reduction var/armor_type = /datum/extension/armor var/list/natural_armor //what armor animal has - var/flash_vulnerability = 1 // whether or not the mob can be flashed; 0 = no, 1 = yes, 2 = very yes var/is_aquatic = FALSE //Null rod stuff @@ -484,17 +483,6 @@ var/global/list/simplemob_icon_bitflag_cache = list() /mob/living/simple_animal/get_digestion_product() return /decl/material/liquid/nutriment -/mob/living/simple_animal/eyecheck() - switch(flash_vulnerability) - if(2 to INFINITY) - return FLASH_PROTECTION_REDUCED - if(1) - return FLASH_PROTECTION_NONE - if(0) - return FLASH_PROTECTION_MAJOR - else - return FLASH_PROTECTION_MAJOR - /mob/living/simple_animal/proc/reflect_unarmed_damage(var/mob/living/carbon/human/attacker, var/damage_type, var/description) if(attacker.a_intent == I_HURT) attacker.apply_damage(rand(return_damage_min, return_damage_max), damage_type, attacker.get_active_held_item_slot(), used_weapon = description) @@ -509,18 +497,6 @@ var/global/list/simplemob_icon_bitflag_cache = list() /mob/living/simple_animal/get_admin_job_string() return "Animal" -/mob/living/simple_animal/handle_flashed(var/obj/item/flash/flash, var/flash_strength) - var/safety = eyecheck() - if(safety < FLASH_PROTECTION_MAJOR) - SET_STATUS_MAX(src, STAT_WEAK, 2) - if(safety < FLASH_PROTECTION_MODERATE) - SET_STATUS_MAX(src, STAT_STUN, (flash_strength - 2)) - SET_STATUS_MAX(src, STAT_BLURRY, flash_strength) - SET_STATUS_MAX(src, STAT_CONFUSE, flash_strength) - flash_eyes(2) - return TRUE - return FALSE - /mob/living/simple_animal/get_speech_bubble_state_modifier() return ..() || "rough" diff --git a/code/modules/mob/login.dm b/code/modules/mob/login.dm index 9f367883a5e..28160d06449 100644 --- a/code/modules/mob/login.dm +++ b/code/modules/mob/login.dm @@ -123,4 +123,13 @@ for(var/datum/status_marker_holder/marker in global.status_marker_holders) if(marker.mob_image && marker != status_markers) client.images |= marker.mob_image + + for(var/obj/item/gear in get_equipped_items(TRUE)) + client.screen |= gear + + if(istype(hud_used)) + hud_used.hidden_inventory_update() + hud_used.persistant_inventory_update() + update_action_buttons() + return TRUE diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 22906b1ba85..10fe0e6c07a 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -291,8 +291,19 @@ #undef PARTIALLY_BUCKLED #undef FULLY_BUCKLED +/mob/proc/grab_restrained() + for (var/obj/item/grab/G in grabbed_by) + if(G.restrains()) + return TRUE + /mob/proc/restrained() - return + if(get_equipped_item(slot_handcuffed_str)) + return TRUE + if(grab_restrained()) + return TRUE + if (istype(get_equipped_item(slot_wear_suit_str), /obj/item/clothing/suit/straight_jacket)) + return TRUE + return FALSE /mob/proc/reset_view(atom/A) set waitfor = 0 @@ -982,7 +993,11 @@ /mob/proc/get_sound_volume_multiplier() if(GET_STATUS(src, STAT_DEAF)) return 0 - return 1 + . = 1 + for(var/slot in global.headphone_slots) + var/obj/item/clothing/C = get_equipped_item(slot) + if(istype(C)) + . = min(., C.volume_multiplier) // Mobs further up the chain should override this proc if they want to return a simple dexterity value. /mob/proc/get_dexterity(var/silent) @@ -1309,6 +1324,9 @@ /mob/proc/mob_throw_item(atom/target) return +/mob/proc/swap_hand() + SHOULD_CALL_PARENT(TRUE) + /mob/living/proc/get_butchery_product_name() var/decl/butchery_data/butchery_decl = GET_DECL(butchery_data) . = butchery_decl?.meat_name || name diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm index 5096fb36c94..307ce79a4c5 100644 --- a/code/modules/mob/mob_defines.dm +++ b/code/modules/mob/mob_defines.dm @@ -124,7 +124,7 @@ var/faction = MOB_FACTION_NEUTRAL //Used for checking whether hostile simple animals will attack you, possibly more stuff later - //The last mob/living/carbon to push/drag/grab this mob (mostly used by slimes friend recognition) + //The last mob/living to push/drag/grab this mob (mostly used by slimes friend recognition) var/weakref/last_handled_by_mob var/status_flags = CANSTUN|CANWEAKEN|CANPARALYSE|CANPUSH //bitflags defining which status effects can be inflicted (replaces canweaken, canstun, etc) diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index e501e4cc1ab..aaa403b01d6 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -418,14 +418,9 @@ var/global/list/intents = list(I_HELP,I_DISARM,I_GRAB,I_HURT) /mob/living/proc/assess_perp(var/obj/access_obj, var/check_access, var/auth_weapons, var/check_records, var/check_arrest, var/check_network) if(stat == DEAD) return SAFE_PERP - - return 0 - -/mob/living/carbon/assess_perp(var/obj/access_obj, var/check_access, var/auth_weapons, var/check_records, var/check_arrest, var/check_network) if(get_equipped_item(slot_handcuffed_str)) return SAFE_PERP - - return ..() + return 0 /mob/living/carbon/human/assess_perp(var/obj/access_obj, var/check_access, var/auth_weapons, var/check_records, var/check_arrest, var/check_network) var/threatcount = ..() diff --git a/code/modules/mob/transform_procs.dm b/code/modules/mob/transform_procs.dm index e1f036903ca..39eb36a9024 100644 --- a/code/modules/mob/transform_procs.dm +++ b/code/modules/mob/transform_procs.dm @@ -49,7 +49,7 @@ QDEL_NULL_LIST(worn_underwear) return ..(move) -/mob/living/carbon/AIize() +/mob/living/AIize() if (HAS_TRANSFORMATION_MOVEMENT_HANDLER(src)) return for(var/obj/item/W in src) diff --git a/code/modules/mob_holder/holder_mobs.dm b/code/modules/mob_holder/holder_mobs.dm index eeed2d5f4b2..fb39bac8d1b 100644 --- a/code/modules/mob_holder/holder_mobs.dm +++ b/code/modules/mob_holder/holder_mobs.dm @@ -11,7 +11,7 @@ return species.get_holder_color(src) //Mob procs for scooping up -/mob/living/proc/get_scooped(var/mob/living/carbon/target, var/mob/living/initiator) +/mob/living/proc/get_scooped(var/mob/living/target, var/mob/living/initiator) if(!holder_type || buckled || LAZYLEN(pinned)) return FALSE diff --git a/code/modules/organs/internal/brain.dm b/code/modules/organs/internal/brain.dm index 937f4beeb1a..e9c16bafef1 100644 --- a/code/modules/organs/internal/brain.dm +++ b/code/modules/organs/internal/brain.dm @@ -70,7 +70,7 @@ else to_chat(user, "This one seems particularly lifeless. Perhaps it will regain some of its luster later..") -/obj/item/organ/internal/brain/do_install(mob/living/carbon/target, affected, in_place, update_icon, detached) +/obj/item/organ/internal/brain/do_install(mob/living/target, affected, in_place, update_icon, detached) if(!(. = ..())) return if(istype(owner)) diff --git a/code/modules/organs/internal/heart.dm b/code/modules/organs/internal/heart.dm index 4fcba76e39c..74f106ba2a6 100644 --- a/code/modules/organs/internal/heart.dm +++ b/code/modules/organs/internal/heart.dm @@ -68,14 +68,15 @@ //If heart is stopped, it isn't going to restart itself randomly. if(pulse == PULSE_NONE) return - else //and if it's beating, let's see if it should - var/should_stop = prob(80) && owner.get_blood_circulation() < BLOOD_VOLUME_SURVIVE //cardiovascular shock, not enough liquid to pump - should_stop = should_stop || prob(max(0, owner.get_damage(BRAIN) - owner.get_max_health() * 0.75)) //brain failing to work heart properly - should_stop = should_stop || (prob(5) && pulse == PULSE_THREADY) //erratic heart patterns, usually caused by oxyloss - if(should_stop) // The heart has stopped due to going into traumatic or cardiovascular shock. - to_chat(owner, "Your heart has stopped!") - pulse = PULSE_NONE - return + + //and if it's beating, let's see if it should + var/should_stop = prob(80) && oxy < BLOOD_VOLUME_SURVIVE //cardiovascular shock, not enough liquid to pump + should_stop = should_stop || prob(max(0, owner.get_damage(BRAIN) - owner.get_max_health() * 0.75)) //brain failing to work heart properly + should_stop = should_stop || (prob(5) && pulse == PULSE_THREADY) //erratic heart patterns, usually caused by oxyloss + if(should_stop) // The heart has stopped due to going into traumatic or cardiovascular shock. + to_chat(owner, SPAN_DANGER("Your heart has stopped!")) + pulse = PULSE_NONE + return // Pulse normally shouldn't go above PULSE_2FAST pulse = clamp(PULSE_NORM + pulse_mod, PULSE_SLOW, PULSE_2FAST) diff --git a/code/modules/organs/pain.dm b/code/modules/organs/pain.dm index 19e542f35a1..8554d28f972 100644 --- a/code/modules/organs/pain.dm +++ b/code/modules/organs/pain.dm @@ -42,14 +42,12 @@ to_chat(src, "[message]") next_pain_time = world.time + max(30 SECONDS - power, 10 SECONDS) -/mob/living/carbon/custom_pain(var/message, var/power, var/force, var/obj/item/organ/external/affecting, var/nohalloss) - . = ..() - if(.) - var/force_emote = species.get_pain_emote(src, power) - if(force_emote && prob(power)) - var/decl/emote/use_emote = GET_DECL(force_emote) - if(!(use_emote.message_type == AUDIBLE_MESSAGE &&HAS_STATUS(src, STAT_SILENCE))) - emote(force_emote) + var/decl/species/my_species = get_species() + var/force_emote = my_species?.get_pain_emote(src, power) + if(force_emote && prob(power)) + var/decl/emote/use_emote = GET_DECL(force_emote) + if(!(use_emote.message_type == AUDIBLE_MESSAGE &&HAS_STATUS(src, STAT_SILENCE))) + emote(force_emote) /mob/living/carbon/human/proc/handle_pain() if(stat) diff --git a/code/modules/organs/prosthetics/_prosthetics.dm b/code/modules/organs/prosthetics/_prosthetics.dm index b92181ed703..e3ca1199848 100644 --- a/code/modules/organs/prosthetics/_prosthetics.dm +++ b/code/modules/organs/prosthetics/_prosthetics.dm @@ -31,7 +31,7 @@ if(islist(limb_data) && limb_data["has_children"] > 0) . = (LAZYLEN(children) < limb_data["has_children"]) -/obj/item/organ/external/proc/can_be_attached_modular_limb(var/mob/living/carbon/user) +/obj/item/organ/external/proc/can_be_attached_modular_limb(var/mob/living/user) var/bodypart_cat = get_modular_limb_category() if(bodypart_cat == MODULAR_BODYPART_INVALID) return FALSE diff --git a/code/modules/organs/prosthetics/prosthetics_manufacturer.dm b/code/modules/organs/prosthetics/prosthetics_manufacturer.dm index 4e468591ced..fcaa1901f46 100644 --- a/code/modules/organs/prosthetics/prosthetics_manufacturer.dm +++ b/code/modules/organs/prosthetics/prosthetics_manufacturer.dm @@ -10,6 +10,7 @@ eye_flash_mod = 1 eye_darksight_range = 2 associated_gender = PLURAL + retrievable_via_pronoun = FALSE emote_sounds = list( "whistle" = list('sound/voice/emotes/longwhistle_robot.ogg'), "qwhistle" = list('sound/voice/emotes/shortwhistle_robot.ogg'), diff --git a/code/modules/overmap/ftl_shunt/core.dm b/code/modules/overmap/ftl_shunt/core.dm index c9ae2ac1b46..f8f5b1baf1b 100644 --- a/code/modules/overmap/ftl_shunt/core.dm +++ b/code/modules/overmap/ftl_shunt/core.dm @@ -284,7 +284,7 @@ addtimer(CALLBACK(src, PROC_REF(do_shunt), shunt_x, shunt_y, jumpdist, destination), 6 SECONDS) jumping = TRUE update_icon() - for(var/mob/living/carbon/M in global.living_mob_list_) + for(var/mob/living/M in global.living_mob_list_) if(!(M.z in ftl_computer.linked.map_z)) continue sound_to(M, 'sound/machines/hyperspace_begin.ogg') diff --git a/code/modules/paperwork/photography.dm b/code/modules/paperwork/photography.dm index f8e49419e25..6bec2c86ccc 100644 --- a/code/modules/paperwork/photography.dm +++ b/code/modules/paperwork/photography.dm @@ -291,7 +291,7 @@ /obj/item/camera/proc/get_mobs(turf/the_turf) var/mob_detail - for(var/mob/living/carbon/A in the_turf) + for(var/mob/living/A in the_turf) if(A.invisibility) continue var/holding diff --git a/code/modules/power/power.dm b/code/modules/power/power.dm index 7dfb8afc036..cb997d4b0c4 100644 --- a/code/modules/power/power.dm +++ b/code/modules/power/power.dm @@ -183,7 +183,7 @@ //power_source is a source of electricity, can be powercell, area, apc, cable, powernet or null //source is an object caused electrocuting (airlock, grille, etc) //No animations will be performed by this proc. -/proc/electrocute_mob(mob/living/carbon/M, var/power_source, var/obj/source, var/siemens_coeff = 1.0) +/proc/electrocute_mob(mob/living/M, var/power_source, var/obj/source, var/siemens_coeff = 1.0) var/area/source_area if(istype(power_source,/area)) source_area = power_source diff --git a/code/modules/power/singularity/singularity_events.dm b/code/modules/power/singularity/singularity_events.dm index 9ecdc2ae467..bed281df970 100644 --- a/code/modules/power/singularity/singularity_events.dm +++ b/code/modules/power/singularity/singularity_events.dm @@ -26,7 +26,7 @@ M.apply_damage(toxdamage, TOX, null, damage_flags = DAM_DISPERSED) /decl/singularity_event/mesmerize/handle_event(obj/effect/singularity/source) - for(var/mob/living/carbon/M in oviewers(8, source)) + for(var/mob/living/M in oviewers(8, source)) if(isbrain(M)) //Ignore brains continue if(M.status_flags & GODMODE) diff --git a/code/modules/projectiles/guns/projectile/flaregun.dm b/code/modules/projectiles/guns/projectile/flaregun.dm index b6f155d2a2b..fb7aa7cc23e 100644 --- a/code/modules/projectiles/guns/projectile/flaregun.dm +++ b/code/modules/projectiles/guns/projectile/flaregun.dm @@ -33,7 +33,7 @@ var/obj/item/projectile/bullet/pellet/PP = chambered_round.BB damage = PP.damage*PP.pellets if(damage > 5) - var/mob/living/carbon/C = loc + var/mob/living/C = loc if(istype(C)) C.visible_message("[src] explodes in [C]'s hands!", "[src] explodes in your face!") C.drop_from_inventory(src) diff --git a/code/modules/projectiles/projectile/energy.dm b/code/modules/projectiles/projectile/energy.dm index b11fabbd7ef..51d5d585f85 100644 --- a/code/modules/projectiles/projectile/energy.dm +++ b/code/modules/projectiles/projectile/energy.dm @@ -25,7 +25,7 @@ if(!istype(T)) return //blind and confuse adjacent people - for (var/mob/living/carbon/M in viewers(T, flash_range)) + for (var/mob/living/M in viewers(T, flash_range)) if(M.eyecheck() < FLASH_PROTECTION_MAJOR) M.flash_eyes() ADJ_STATUS(M, STAT_BLURRY, brightness / 2) @@ -157,7 +157,7 @@ var/med_dizziness_amt = 120 var/max_dizziness_amt = 300 -/obj/item/projectile/energy/plasmastun/proc/bang(var/mob/living/carbon/M) +/obj/item/projectile/energy/plasmastun/proc/bang(var/mob/living/M) if(!istype(M)) return @@ -209,7 +209,7 @@ med_dizziness_amt = 60 max_dizziness_amt = 120 -/obj/item/projectile/energy/plasmastun/sonic/bang(var/mob/living/carbon/M) +/obj/item/projectile/energy/plasmastun/sonic/bang(var/mob/living/M) ..() if(istype(M, /atom/movable) && M.simulated && !M.anchored) M.throw_at(get_edge_target_turf(M, get_dir(src, M)), rand(1,5), 6) diff --git a/code/modules/reagents/Chemistry-Holder.dm b/code/modules/reagents/Chemistry-Holder.dm index f5da9eb6233..ff466520966 100644 --- a/code/modules/reagents/Chemistry-Holder.dm +++ b/code/modules/reagents/Chemistry-Holder.dm @@ -685,7 +685,7 @@ var/global/obj/temp_reagents_holder = new if(!. && href_list["deconvert"]) var/list/data = REAGENT_DATA(src, /decl/material/liquid/water) if(LAZYACCESS(data, "holy")) - var/mob/living/carbon/C = locate(href_list["deconvert"]) + var/mob/living/C = locate(href_list["deconvert"]) if(istype(C) && !QDELETED(C) && C.mind) var/decl/special_role/godcult = GET_DECL(/decl/special_role/godcultist) godcult.remove_antagonist(C.mind,1) diff --git a/code/modules/mob/living/carbon/taste.dm b/code/modules/reagents/Chemistry-Taste.dm similarity index 68% rename from code/modules/mob/living/carbon/taste.dm rename to code/modules/reagents/Chemistry-Taste.dm index 33bcbd1d163..3fe822d2a91 100644 --- a/code/modules/mob/living/carbon/taste.dm +++ b/code/modules/reagents/Chemistry-Taste.dm @@ -1,17 +1,3 @@ -/mob/living/proc/ingest(var/datum/reagents/from, var/datum/reagents/target, var/amount = 1, var/multiplier = 1, var/copy = 0) - RAISE_EVENT(/decl/observ/ingested, src, from, target, amount, multiplier, copy) - . = from.trans_to_holder(target,amount,multiplier,copy) - -/mob/living/carbon/ingest(var/datum/reagents/from, var/datum/reagents/target, var/amount = 1, var/multiplier = 1, var/copy = 0) //we kind of 'sneak' a proc in here for ingesting stuff so we can play with it. - if(last_taste_time + 50 < world.time) - var/datum/reagents/temp = new(amount, global.temp_reagents_holder) //temporary holder used to analyse what gets transfered. - from.trans_to_holder(temp, amount, multiplier, 1) - var/text_output = temp.generate_taste_message(src, from) - if(text_output && (text_output != last_taste_text || last_taste_time + 1 MINUTE < world.time)) //We dont want to spam the same message over and over again at the person. Give it a bit of a buffer. - to_chat(src, SPAN_NOTICE("You can taste [text_output].")) //no taste means there are too many tastes and not enough flavor. - last_taste_time = world.time - last_taste_text = text_output - . = ..() /* what this does: catalogue the 'taste strength' of each one diff --git a/code/modules/reagents/chems/chems_blood.dm b/code/modules/reagents/chems/chems_blood.dm index df3a8d91769..387f094cf01 100644 --- a/code/modules/reagents/chems/chems_blood.dm +++ b/code/modules/reagents/chems/chems_blood.dm @@ -64,7 +64,7 @@ /decl/material/liquid/blood/affect_blood(var/mob/living/M, var/removed, var/datum/reagents/holder) if(ishuman(M)) var/volume = REAGENT_VOLUME(holder, type) - var/mob/living/carbon/H = M + var/mob/living/carbon/human/H = M H.inject_blood(volume, holder) holder.remove_reagent(type, volume) diff --git a/code/modules/reagents/chems/chems_compounds.dm b/code/modules/reagents/chems/chems_compounds.dm index e8c34cb0311..e7e0715acad 100644 --- a/code/modules/reagents/chems/chems_compounds.dm +++ b/code/modules/reagents/chems/chems_compounds.dm @@ -407,7 +407,7 @@ exoplanet_rarity_gas = MAT_RARITY_EXOTIC uid = "chem_crystalizing_agent" -/decl/material/liquid/crystal_agent/proc/do_material_check(var/mob/living/carbon/M) +/decl/material/liquid/crystal_agent/proc/do_material_check(var/mob/living/M) . = /decl/material/solid/gemstone/crystal /decl/material/liquid/crystal_agent/affect_blood(var/mob/living/M, var/removed, var/datum/reagents/holder) diff --git a/code/modules/reagents/chems/chems_painkillers.dm b/code/modules/reagents/chems/chems_painkillers.dm index daf15d76a1a..91c75243fc7 100644 --- a/code/modules/reagents/chems/chems_painkillers.dm +++ b/code/modules/reagents/chems/chems_painkillers.dm @@ -123,7 +123,7 @@ else M.add_chemical_effect(CE_TOXIN, 1) -/decl/material/liquid/painkillers/proc/isboozed(var/mob/living/carbon/M) +/decl/material/liquid/painkillers/proc/isboozed(var/mob/living/M) . = 0 if(!narcotic) return diff --git a/code/modules/reagents/reactions/reaction_grenade_reaction.dm b/code/modules/reagents/reactions/reaction_grenade_reaction.dm index 64bcf4da78e..dd3aaac6be8 100644 --- a/code/modules/reagents/reactions/reaction_grenade_reaction.dm +++ b/code/modules/reagents/reactions/reaction_grenade_reaction.dm @@ -36,7 +36,7 @@ var/turf/location = get_turf(holder.get_reaction_loc(chemical_reaction_flags)) if(location) spark_at(location, amount=2, cardinal_only = TRUE) - for(var/mob/living/carbon/M in viewers(world.view, location)) + for(var/mob/living/M in viewers(world.view, location)) if(M.eyecheck() < FLASH_PROTECTION_MODERATE) switch(get_dist(M, location)) if(0 to 3) diff --git a/code/modules/reagents/reagent_containers.dm b/code/modules/reagents/reagent_containers.dm index d1e1efb9a95..6e3fd788761 100644 --- a/code/modules/reagents/reagent_containers.dm +++ b/code/modules/reagents/reagent_containers.dm @@ -112,7 +112,7 @@ /obj/item/chems/standard_pour_into(mob/user, atom/target, amount = 5) return ..(user, target, amount_per_transfer_from_this) -/obj/item/chems/do_surgery(mob/living/carbon/M, mob/living/user) +/obj/item/chems/do_surgery(mob/living/M, mob/living/user) if(user.get_target_zone() != BP_MOUTH) //in case it is ever used as a surgery tool return ..() diff --git a/code/modules/reagents/reagent_containers/syringes.dm b/code/modules/reagents/reagent_containers/syringes.dm index 6784ae185ab..1938f0607a4 100644 --- a/code/modules/reagents/reagent_containers/syringes.dm +++ b/code/modules/reagents/reagent_containers/syringes.dm @@ -218,7 +218,7 @@ mode = SYRINGE_DRAW update_icon() -/obj/item/chems/syringe/proc/handleBodyBag(var/obj/structure/closet/body_bag/bag, var/mob/living/carbon/user) +/obj/item/chems/syringe/proc/handleBodyBag(var/obj/structure/closet/body_bag/bag, var/mob/living/user) if(bag.opened || !bag.contains_body) return @@ -226,7 +226,7 @@ if(L) injectMob(L, user, bag) -/obj/item/chems/syringe/proc/injectMob(var/mob/living/carbon/target, var/mob/living/carbon/user, var/atom/trackTarget) +/obj/item/chems/syringe/proc/injectMob(var/mob/living/target, var/mob/living/user, var/atom/trackTarget) if(!trackTarget) trackTarget = target @@ -267,7 +267,7 @@ mode = SYRINGE_DRAW update_icon() -/obj/item/chems/syringe/proc/syringestab(var/mob/living/carbon/target, var/mob/living/carbon/user) +/obj/item/chems/syringe/proc/syringestab(var/mob/living/target, var/mob/living/user) if(ishuman(target)) @@ -306,7 +306,7 @@ admin_inject_log(user, target, src, contained_reagents, trans, violent=1) break_syringe(target, user) -/obj/item/chems/syringe/proc/break_syringe(mob/living/carbon/human/target, mob/living/carbon/user) +/obj/item/chems/syringe/proc/break_syringe(mob/living/carbon/human/target, mob/living/user) desc += " It is broken." mode = SYRINGE_BROKEN if(target) diff --git a/code/modules/species/species_bodytype.dm b/code/modules/species/species_bodytype.dm index 3af81b7759e..fa199123266 100644 --- a/code/modules/species/species_bodytype.dm +++ b/code/modules/species/species_bodytype.dm @@ -23,6 +23,7 @@ var/global/list/bodytypes_by_category = list() var/icon_template = 'icons/mob/human_races/species/template.dmi' // Used for mob icon generation for non-32x32 species. var/ignited_icon = 'icons/mob/OnFire.dmi' var/associated_gender + var/retrievable_via_pronoun = TRUE var/appearance_flags = 0 // Appearance/display related features. /// Used when filing your nails. @@ -610,7 +611,7 @@ var/global/list/bodytypes_by_category = list() /decl/bodytype/proc/get_limb_from_zone(limb) . = length(LAZYACCESS(limb_mapping, limb)) ? pick(limb_mapping[limb]) : limb -/decl/bodytype/proc/check_vital_organ_missing(mob/living/carbon/H) +/decl/bodytype/proc/check_vital_organ_missing(mob/living/H) if(length(vital_organs)) for(var/organ_tag in vital_organs) var/obj/item/organ/O = H.get_organ(organ_tag, /obj/item/organ) diff --git a/code/modules/species/species_getters.dm b/code/modules/species/species_getters.dm index 04dd947cbe2..22f0a84b60f 100644 --- a/code/modules/species/species_getters.dm +++ b/code/modules/species/species_getters.dm @@ -48,6 +48,6 @@ /decl/species/proc/get_bodytype_by_pronouns(var/decl/pronouns/pronouns) if(istype(pronouns)) for(var/decl/bodytype/bodytype in available_bodytypes) - if(bodytype.associated_gender == pronouns.name) + if(!isnull(bodytype.associated_gender) && bodytype.retrievable_via_pronoun && bodytype.associated_gender == pronouns.name) return bodytype return default_bodytype diff --git a/code/modules/surgery/_surgery.dm b/code/modules/surgery/_surgery.dm index 31049834b8a..cb70108161b 100644 --- a/code/modules/surgery/_surgery.dm +++ b/code/modules/surgery/_surgery.dm @@ -324,7 +324,7 @@ var/global/list/surgery_tool_exception_cache = list() use(1) //check if mob is lying down on something we can operate him on. -/proc/can_operate(mob/living/carbon/M, mob/living/carbon/user) +/proc/can_operate(mob/living/M, mob/living/user) var/turf/T = get_turf(M) if(locate(/obj/machinery/optable, T)) . = OPERATE_IDEAL diff --git a/code/modules/ventcrawl/ventcrawl.dm b/code/modules/ventcrawl/ventcrawl.dm index 86d5576a807..163f4cd3114 100644 --- a/code/modules/ventcrawl/ventcrawl.dm +++ b/code/modules/ventcrawl/ventcrawl.dm @@ -34,11 +34,9 @@ var/global/list/ventcrawl_machinery = list( return ventcrawl_carry() /mob/living/proc/is_allowed_vent_crawl_item(var/obj/item/carried_item) - if(is_type_in_list(carried_item, can_enter_vent_with)) - return !get_equipped_slot_for_item(carried_item) - -/mob/living/carbon/is_allowed_vent_crawl_item(var/obj/item/carried_item) - return (carried_item in get_internal_organs()) || ..() + if(is_type_in_list(carried_item, can_enter_vent_with) && !get_equipped_slot_for_item(carried_item)) + return TRUE + return (carried_item in get_internal_organs()) /mob/living/carbon/human/is_allowed_vent_crawl_item(var/obj/item/carried_item) var/obj/item/organ/internal/stomach = GET_INTERNAL_ORGAN(src, BP_STOMACH) diff --git a/code/modules/xenoarcheaology/artifacts/effects/heal.dm b/code/modules/xenoarcheaology/artifacts/effects/heal.dm index a7d9dffa317..85743f740ce 100644 --- a/code/modules/xenoarcheaology/artifacts/effects/heal.dm +++ b/code/modules/xenoarcheaology/artifacts/effects/heal.dm @@ -10,13 +10,13 @@ /datum/artifact_effect/heal/DoEffectAura() if(holder) var/turf/T = get_turf(holder) - for (var/mob/living/carbon/C in range(src.effect_range,T)) + for (var/mob/living/C in range(src.effect_range,T)) heal(C, 1, msg_prob = 5) /datum/artifact_effect/heal/DoEffectPulse() if(holder) var/turf/T = get_turf(holder) - for (var/mob/living/carbon/C in range(effect_range,T)) + for (var/mob/living/C in range(effect_range,T)) heal(C, 5) //todo: check over this properly diff --git a/code/modules/xenoarcheaology/artifacts/effects/hurt.dm b/code/modules/xenoarcheaology/artifacts/effects/hurt.dm index c7d2004fbb0..ca6fff5bbb8 100644 --- a/code/modules/xenoarcheaology/artifacts/effects/hurt.dm +++ b/code/modules/xenoarcheaology/artifacts/effects/hurt.dm @@ -9,13 +9,13 @@ /datum/artifact_effect/hurt/DoEffectAura() if(holder) var/turf/T = get_turf(holder) - for (var/mob/living/carbon/C in range(src.effect_range,T)) + for (var/mob/living/C in range(src.effect_range,T)) hurt(C, 1, msg_prob = 5) /datum/artifact_effect/hurt/DoEffectPulse() if(holder) var/turf/T = get_turf(holder) - for (var/mob/living/carbon/C in range(effect_range, T)) + for (var/mob/living/C in range(effect_range, T)) hurt(C, 3) /datum/artifact_effect/hurt/proc/hurt(mob/living/M, amount, strong, msg_prob=100) diff --git a/code/modules/xenoarcheaology/artifacts/effects/stun.dm b/code/modules/xenoarcheaology/artifacts/effects/stun.dm index c0d10b7db9c..3bbdd67aa4a 100644 --- a/code/modules/xenoarcheaology/artifacts/effects/stun.dm +++ b/code/modules/xenoarcheaology/artifacts/effects/stun.dm @@ -17,7 +17,7 @@ /datum/artifact_effect/stun/DoEffectAura() if(holder) var/turf/T = get_turf(holder) - for (var/mob/living/carbon/C in range(effect_range,T)) + for (var/mob/living/C in range(effect_range,T)) var/susceptibility = GetAnomalySusceptibility(C) if(prob(10 * susceptibility)) to_chat(C, "Your body goes numb for a moment.") @@ -29,7 +29,7 @@ /datum/artifact_effect/stun/DoEffectPulse() if(holder) var/turf/T = get_turf(holder) - for (var/mob/living/carbon/C in range(effect_range,T)) + for (var/mob/living/C in range(effect_range,T)) var/susceptibility = GetAnomalySusceptibility(C) if(prob(100 * susceptibility)) to_chat(C, "A wave of energy overwhelms your senses!") diff --git a/code/modules/xenoarcheaology/finds/find_types/statuette.dm b/code/modules/xenoarcheaology/finds/find_types/statuette.dm index c15c76efb84..c2f6a87dcef 100644 --- a/code/modules/xenoarcheaology/finds/find_types/statuette.dm +++ b/code/modules/xenoarcheaology/finds/find_types/statuette.dm @@ -167,7 +167,7 @@ /obj/effect/shadow_wight/Process() if(loc) step_rand(src) - var/mob/living/carbon/M = locate() in src.loc + var/mob/living/M = locate() in src.loc if(M) playsound(src.loc, pick('sound/hallucinations/behind_you1.ogg',\ 'sound/hallucinations/behind_you2.ogg',\ diff --git a/maps/away/magshield/magshield.dm b/maps/away/magshield/magshield.dm index a84677f711f..a6eb9bcec2e 100644 --- a/maps/away/magshield/magshield.dm +++ b/maps/away/magshield/magshield.dm @@ -74,7 +74,7 @@ SPAN_DANGER("\The [src] suddenly activates!"), SPAN_DANGER("Electricity arcs between \the [src]'s rotating spokes as a powerful magnetic field tugs on every metallic object nearby.") ) - for(var/mob/living/carbon/M in hear(10, T)) + for(var/mob/living/M in hear(10, T)) eye_safety = M.eyecheck() if(eye_safety < FLASH_PROTECTION_MODERATE) M.flash_eyes() diff --git a/mods/content/psionics/datum/chems.dm b/mods/content/psionics/datum/chems.dm index 55e292ac6a9..81941bd2c0f 100644 --- a/mods/content/psionics/datum/chems.dm +++ b/mods/content/psionics/datum/chems.dm @@ -1,4 +1,4 @@ -/decl/material/liquid/crystal_agent/do_material_check(var/mob/living/carbon/M) +/decl/material/liquid/crystal_agent/do_material_check(var/mob/living/M) var/decl/special_role/wizard/wizards = GET_DECL(/decl/special_role/wizard) . = (M.get_ability_handler(/datum/ability_handler/psionics) || (M.mind && wizards.is_antagonist(M.mind))) ? MAT_NULLGLASS : ..() diff --git a/mods/content/psionics/system/psionics/mob/mob.dm b/mods/content/psionics/system/psionics/mob/mob.dm index 2f7e98bb5b1..47a2f987dee 100644 --- a/mods/content/psionics/system/psionics/mob/mob.dm +++ b/mods/content/psionics/system/psionics/mob/mob.dm @@ -38,7 +38,7 @@ return PROJECTILE_FORCE_MISS . = ..() -/mob/living/carbon/get_cuff_breakout_mod() +/mob/living/get_cuff_breakout_mod() . = ..() var/datum/ability_handler/psionics/psi = get_ability_handler(/datum/ability_handler/psionics) if(psi) @@ -48,7 +48,7 @@ var/datum/ability_handler/psionics/psi = get_ability_handler(/datum/ability_handler/psionics) . = (psi && psi.can_use() && psi.get_rank(PSI_PSYCHOKINESIS) >= PSI_RANK_PARAMOUNT) -/mob/living/carbon/get_special_resist_time() +/mob/living/get_special_resist_time() . = ..() var/datum/ability_handler/psionics/psi = get_ability_handler(/datum/ability_handler/psionics) if(psi && psi.can_use()) diff --git a/mods/content/xenobiology/mobs/slime_feeding_helpers.dm b/mods/content/xenobiology/mobs/slime_feeding_helpers.dm index c970be7f223..365e5df78dd 100644 --- a/mods/content/xenobiology/mobs/slime_feeding_helpers.dm +++ b/mods/content/xenobiology/mobs/slime_feeding_helpers.dm @@ -50,9 +50,6 @@ var/global/list/slime_pain_messages = list( // Handle cosmetic effects (currently) from being eaten by a slime, mostly pain-related. /mob/living/proc/handle_additional_slime_effects() - return - -/mob/living/carbon/handle_additional_slime_effects() if(can_feel_pain()) to_chat(src, SPAN_DANGER(pick(global.slime_pain_messages))) diff --git a/mods/mobs/borers/mob/borer/borer.dm b/mods/mobs/borers/mob/borer/borer.dm index 17cc7c1f155..6e2b4a6a551 100644 --- a/mods/mobs/borers/mob/borer/borer.dm +++ b/mods/mobs/borers/mob/borer/borer.dm @@ -159,9 +159,9 @@ controlling = FALSE host.remove_language(/decl/language/corticalborer) - host.verbs -= /mob/living/carbon/proc/release_control - host.verbs -= /mob/living/carbon/proc/punish_host - host.verbs -= /mob/living/carbon/proc/spawn_larvae + host.verbs -= /mob/living/proc/release_control + host.verbs -= /mob/living/proc/punish_host + host.verbs -= /mob/living/proc/spawn_larvae if(host_brain) diff --git a/mods/mobs/borers/mob/borer/borer_captive.dm b/mods/mobs/borers/mob/borer/borer_captive.dm index d998abd7943..83a75377f45 100644 --- a/mods/mobs/borers/mob/borer/borer_captive.dm +++ b/mods/mobs/borers/mob/borer/borer_captive.dm @@ -46,9 +46,9 @@ to_chat(H, "With an immense exertion of will, you regain control of your body!") to_chat(B.host, "You feel control of the host brain ripped from your grasp, and retract your probosci before the wild neural impulses can damage you.") B.detach_from_host() - verbs -= /mob/living/carbon/proc/release_control - verbs -= /mob/living/carbon/proc/punish_host - verbs -= /mob/living/carbon/proc/spawn_larvae + verbs -= /mob/living/proc/release_control + verbs -= /mob/living/proc/punish_host + verbs -= /mob/living/proc/spawn_larvae return diff --git a/mods/mobs/borers/mob/borer/borer_hud.dm b/mods/mobs/borers/mob/borer/borer_hud.dm index 34251dbc644..8b9a155e5d4 100644 --- a/mods/mobs/borers/mob/borer/borer_hud.dm +++ b/mods/mobs/borers/mob/borer/borer_hud.dm @@ -110,9 +110,9 @@ if(!worm.host.lastKnownIP) worm.host.lastKnownIP = s2h_ip worm.controlling = TRUE - worm.host.verbs += /mob/living/carbon/proc/release_control - worm.host.verbs += /mob/living/carbon/proc/punish_host - worm.host.verbs += /mob/living/carbon/proc/spawn_larvae + worm.host.verbs += /mob/living/proc/release_control + worm.host.verbs += /mob/living/proc/punish_host + worm.host.verbs += /mob/living/proc/spawn_larvae return TRUE diff --git a/mods/mobs/borers/mob/borer/borer_powers.dm b/mods/mobs/borers/mob/borer/borer_powers.dm index 8c477ff8423..d4abecd7a8d 100644 --- a/mods/mobs/borers/mob/borer/borer_powers.dm +++ b/mods/mobs/borers/mob/borer/borer_powers.dm @@ -49,7 +49,7 @@ H.verbs |= /mob/living/carbon/human/proc/psychic_whisper if(!neutered) - H.verbs |= /mob/living/carbon/proc/spawn_larvae + H.verbs |= /mob/living/proc/spawn_larvae if(H.client) H.ghostize(0) diff --git a/mods/mobs/borers/mob/powers.dm b/mods/mobs/borers/mob/powers.dm index e5eff917dc6..b561a72b1b0 100644 --- a/mods/mobs/borers/mob/powers.dm +++ b/mods/mobs/borers/mob/powers.dm @@ -1,5 +1,5 @@ //Brain slug proc for voluntary removal of control. -/mob/living/carbon/proc/release_control() +/mob/living/proc/release_control() set category = "Abilities" set name = "Release Control" @@ -12,15 +12,15 @@ B.detach_from_host() - verbs -= /mob/living/carbon/proc/release_control - verbs -= /mob/living/carbon/proc/punish_host - verbs -= /mob/living/carbon/proc/spawn_larvae + verbs -= /mob/living/proc/release_control + verbs -= /mob/living/proc/punish_host + verbs -= /mob/living/proc/spawn_larvae else to_chat(src, "ERROR NO BORER OR BRAINMOB DETECTED IN THIS MOB, THIS IS A BUG !") //Brain slug proc for tormenting the host. -/mob/living/carbon/proc/punish_host() +/mob/living/proc/punish_host() set category = "Abilities" set name = "Torment host" set desc = "Punish your host with agony." @@ -38,7 +38,7 @@ else to_chat(B.host_brain, "Horrific, burning agony lances through you, ripping a soundless scream from your trapped mind!") -/mob/living/carbon/proc/spawn_larvae() +/mob/living/proc/spawn_larvae() set category = "Abilities" set name = "Reproduce" set desc = "Spawn several young." diff --git a/mods/species/ascent/datum/culture.dm b/mods/species/ascent/datum/culture.dm index f1061fd2058..870994c4a66 100644 --- a/mods/species/ascent/datum/culture.dm +++ b/mods/species/ascent/datum/culture.dm @@ -1,4 +1,4 @@ -/mob/living/carbon/proc/get_gyne_name() +/mob/living/proc/get_gyne_name() return dna?.lineage || create_gyne_name() /proc/create_gyne_name() diff --git a/mods/species/ascent/datum/languages.dm b/mods/species/ascent/datum/languages.dm index 771602a9428..1e834c13872 100644 --- a/mods/species/ascent/datum/languages.dm +++ b/mods/species/ascent/datum/languages.dm @@ -89,9 +89,9 @@ shorthand = "KB" #define isascentdrone(X) istype(X, /mob/living/silicon/robot/flying/ascent) -/decl/language/mantid/worldnet/check_special_condition(var/mob/living/carbon/other) +/decl/language/mantid/worldnet/check_special_condition(var/mob/living/other) if(isascentdrone(other)) return TRUE - if(istype(other) && (locate(/obj/item/organ/internal/controller) in other.internal_organs)) + if(istype(other) && (locate(/obj/item/organ/internal/controller) in other.get_internal_organs())) return TRUE return FALSE diff --git a/mods/species/ascent/items/id_control.dm b/mods/species/ascent/items/id_control.dm index 6b76ee444d3..194da365293 100644 --- a/mods/species/ascent/items/id_control.dm +++ b/mods/species/ascent/items/id_control.dm @@ -51,7 +51,7 @@ if(owner) var/datum/extension/access_provider/owner_access = get_extension(owner, /datum/extension/access_provider) owner_access?.unregister_id(src) - var/mob/living/carbon/H = owner + var/mob/living/H = owner . = ..() if(H && !(locate(type) in H.get_internal_organs())) H.remove_language(/decl/language/mantid/worldnet) diff --git a/mods/species/ascent/mobs/bodyparts_insectoid.dm b/mods/species/ascent/mobs/bodyparts_insectoid.dm index 794f7fdd042..ca00757d3fa 100644 --- a/mods/species/ascent/mobs/bodyparts_insectoid.dm +++ b/mods/species/ascent/mobs/bodyparts_insectoid.dm @@ -12,7 +12,7 @@ /obj/item/organ/internal/egg_sac/insectoid/attack_self(var/mob/user) . = ..() - var/mob/living/carbon/H = user + var/mob/living/H = user if(.) if(H.incapacitated()) to_chat(H, SPAN_WARNING("You can't produce eggs in your current state.")) diff --git a/mods/species/vox/organs_vox.dm b/mods/species/vox/organs_vox.dm index 88649192ecb..fa549859758 100644 --- a/mods/species/vox/organs_vox.dm +++ b/mods/species/vox/organs_vox.dm @@ -208,7 +208,7 @@ prompt_revive_callback(owner) return TRUE -/obj/item/organ/internal/voxstack/proc/prompt_revive_callback(var/mob/living/carbon/C) +/obj/item/organ/internal/voxstack/proc/prompt_revive_callback(var/mob/living/C) set waitfor = FALSE if(C && !backup_inviable()) prompting = TRUE diff --git a/nebula.dme b/nebula.dme index f40b844a618..01acb65c114 100644 --- a/nebula.dme +++ b/nebula.dme @@ -2800,6 +2800,7 @@ #include "code\modules\mob\living\living_defense.dm" #include "code\modules\mob\living\living_defines.dm" #include "code\modules\mob\living\living_dreams.dm" +#include "code\modules\mob\living\living_eating.dm" #include "code\modules\mob\living\living_give.dm" #include "code\modules\mob\living\living_grabs.dm" #include "code\modules\mob\living\living_hallucinations.dm" @@ -2807,6 +2808,7 @@ #include "code\modules\mob\living\living_organs.dm" #include "code\modules\mob\living\living_powers.dm" #include "code\modules\mob\living\living_pulse.dm" +#include "code\modules\mob\living\living_resist.dm" #include "code\modules\mob\living\living_status.dm" #include "code\modules\mob\living\living_throw.dm" #include "code\modules\mob\living\login.dm" @@ -2826,50 +2828,6 @@ #include "code\modules\mob\living\brain\brain.dm" #include "code\modules\mob\living\brain\death.dm" #include "code\modules\mob\living\brain\say.dm" -#include "code\modules\mob\living\carbon\breathe.dm" -#include "code\modules\mob\living\carbon\carbon.dm" -#include "code\modules\mob\living\carbon\carbon_defense.dm" -#include "code\modules\mob\living\carbon\carbon_defines.dm" -#include "code\modules\mob\living\carbon\carbon_eating.dm" -#include "code\modules\mob\living\carbon\carbon_grabs.dm" -#include "code\modules\mob\living\carbon\carbon_organs.dm" -#include "code\modules\mob\living\carbon\carbon_powers.dm" -#include "code\modules\mob\living\carbon\damage_procs.dm" -#include "code\modules\mob\living\carbon\internals.dm" -#include "code\modules\mob\living\carbon\resist.dm" -#include "code\modules\mob\living\carbon\taste.dm" -#include "code\modules\mob\living\carbon\human\death.dm" -#include "code\modules\mob\living\carbon\human\examine.dm" -#include "code\modules\mob\living\carbon\human\human.dm" -#include "code\modules\mob\living\carbon\human\human_appearance.dm" -#include "code\modules\mob\living\carbon\human\human_appearance_head.dm" -#include "code\modules\mob\living\carbon\human\human_attackhand.dm" -#include "code\modules\mob\living\carbon\human\human_blood.dm" -#include "code\modules\mob\living\carbon\human\human_damage.dm" -#include "code\modules\mob\living\carbon\human\human_defense.dm" -#include "code\modules\mob\living\carbon\human\human_defines.dm" -#include "code\modules\mob\living\carbon\human\human_examine_decl.dm" -#include "code\modules\mob\living\carbon\human\human_grabs.dm" -#include "code\modules\mob\living\carbon\human\human_helpers.dm" -#include "code\modules\mob\living\carbon\human\human_maneuvers.dm" -#include "code\modules\mob\living\carbon\human\human_movement.dm" -#include "code\modules\mob\living\carbon\human\human_organs.dm" -#include "code\modules\mob\living\carbon\human\human_powers.dm" -#include "code\modules\mob\living\carbon\human\human_skin.dm" -#include "code\modules\mob\living\carbon\human\human_species.dm" -#include "code\modules\mob\living\carbon\human\human_verbs.dm" -#include "code\modules\mob\living\carbon\human\life.dm" -#include "code\modules\mob\living\carbon\human\login.dm" -#include "code\modules\mob\living\carbon\human\logout.dm" -#include "code\modules\mob\living\carbon\human\npcs.dm" -#include "code\modules\mob\living\carbon\human\obj_grabs.dm" -#include "code\modules\mob\living\carbon\human\say.dm" -#include "code\modules\mob\living\carbon\human\unarmed_attack.dm" -#include "code\modules\mob\living\carbon\human\update_icons.dm" -#include "code\modules\mob\living\carbon\human\whisper.dm" -#include "code\modules\mob\living\carbon\human\descriptors\_descriptors.dm" -#include "code\modules\mob\living\carbon\human\descriptors\descriptors_age.dm" -#include "code\modules\mob\living\carbon\human\descriptors\descriptors_generic.dm" #include "code\modules\mob\living\deity\deity.dm" #include "code\modules\mob\living\deity\deity_boons.dm" #include "code\modules\mob\living\deity\deity_click.dm" @@ -2909,6 +2867,41 @@ #include "code\modules\mob\living\deity\phenomena\phenomena.dm" #include "code\modules\mob\living\deity\phenomena\starlight.dm" #include "code\modules\mob\living\deity\phenomena\transmutation.dm" +#include "code\modules\mob\living\human\death.dm" +#include "code\modules\mob\living\human\examine.dm" +#include "code\modules\mob\living\human\human.dm" +#include "code\modules\mob\living\human\human_appearance.dm" +#include "code\modules\mob\living\human\human_appearance_head.dm" +#include "code\modules\mob\living\human\human_attackhand.dm" +#include "code\modules\mob\living\human\human_blood.dm" +#include "code\modules\mob\living\human\human_damage.dm" +#include "code\modules\mob\living\human\human_defense.dm" +#include "code\modules\mob\living\human\human_defines.dm" +#include "code\modules\mob\living\human\human_eating.dm" +#include "code\modules\mob\living\human\human_examine_decl.dm" +#include "code\modules\mob\living\human\human_grabs.dm" +#include "code\modules\mob\living\human\human_helpers.dm" +#include "code\modules\mob\living\human\human_internals.dm" +#include "code\modules\mob\living\human\human_maneuvers.dm" +#include "code\modules\mob\living\human\human_movement.dm" +#include "code\modules\mob\living\human\human_organs.dm" +#include "code\modules\mob\living\human\human_powers.dm" +#include "code\modules\mob\living\human\human_resist.dm" +#include "code\modules\mob\living\human\human_skin.dm" +#include "code\modules\mob\living\human\human_species.dm" +#include "code\modules\mob\living\human\human_verbs.dm" +#include "code\modules\mob\living\human\life.dm" +#include "code\modules\mob\living\human\login.dm" +#include "code\modules\mob\living\human\logout.dm" +#include "code\modules\mob\living\human\npcs.dm" +#include "code\modules\mob\living\human\obj_grabs.dm" +#include "code\modules\mob\living\human\say.dm" +#include "code\modules\mob\living\human\unarmed_attack.dm" +#include "code\modules\mob\living\human\update_icons.dm" +#include "code\modules\mob\living\human\whisper.dm" +#include "code\modules\mob\living\human\descriptors\_descriptors.dm" +#include "code\modules\mob\living\human\descriptors\descriptors_age.dm" +#include "code\modules\mob\living\human\descriptors\descriptors_generic.dm" #include "code\modules\mob\living\maneuvers\_maneuver.dm" #include "code\modules\mob\living\maneuvers\maneuver_leap.dm" #include "code\modules\mob\living\silicon\death.dm" @@ -3554,6 +3547,7 @@ #include "code\modules\reagents\Chemistry-Holder.dm" #include "code\modules\reagents\Chemistry-Machinery.dm" #include "code\modules\reagents\Chemistry-Metabolism.dm" +#include "code\modules\reagents\Chemistry-Taste.dm" #include "code\modules\reagents\cocktails.dm" #include "code\modules\reagents\reagent_container_edibility.dm" #include "code\modules\reagents\reagent_containers.dm" From 2b0efa86782a12fb3d4c1e581be42828a68c91c6 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Wed, 12 Jun 2024 16:20:57 +1000 Subject: [PATCH 06/90] Requested changes for carbon removal PR. --- code/__defines/mobs.dm | 2 +- code/game/machinery/oxygen_pump.dm | 30 +++++++++---------- code/modules/admin/view_variables/topic.dm | 16 +++++++--- .../modules/mob/living/human/human_defines.dm | 4 --- code/modules/mob/living/living_eating.dm | 4 --- .../human_eating.dm => living_taste.dm} | 11 +++++-- code/modules/mob/transform_procs.dm | 7 +++-- code/modules/reagents/Chemistry-Taste.dm | 1 - nebula.dme | 2 +- 9 files changed, 43 insertions(+), 34 deletions(-) rename code/modules/mob/living/{human/human_eating.dm => living_taste.dm} (57%) diff --git a/code/__defines/mobs.dm b/code/__defines/mobs.dm index 4165985e7d0..6bee2fa48f8 100644 --- a/code/__defines/mobs.dm +++ b/code/__defines/mobs.dm @@ -224,7 +224,7 @@ #define MOB_PULL_SAME 2 #define MOB_PULL_LARGER 3 -//carbon taste sensitivity defines, used in mob/living/proc/ingest +// Taste sensitivity defines, used in mob/living/proc/ingest. #define TASTE_HYPERSENSITIVE 3 //anything below 5% #define TASTE_SENSITIVE 2 //anything below 7% #define TASTE_NORMAL 1 //anything below 15% diff --git a/code/game/machinery/oxygen_pump.dm b/code/game/machinery/oxygen_pump.dm index dd72573082b..e82ad9d1051 100644 --- a/code/game/machinery/oxygen_pump.dm +++ b/code/game/machinery/oxygen_pump.dm @@ -42,7 +42,7 @@ return ..() /obj/machinery/oxygen_pump/handle_mouse_drop(atom/over, mob/user, params) - if(ishuman(over) && can_apply_to_target(over, user)) + if(isliving(over) && can_apply_to_target(over, user)) user.visible_message(SPAN_NOTICE("\The [user] begins placing the mask onto \the [over]..")) if(do_mob(user, over, 25) && can_apply_to_target(over, user)) user.visible_message(SPAN_NOTICE("\The [user] has placed \the [src] over \the [over]'s face.")) @@ -67,17 +67,17 @@ ui_interact(user) return TRUE -/obj/machinery/oxygen_pump/proc/attach_mask(var/mob/living/C) - if(ishuman(C)) - contained.dropInto(C.loc) - C.equip_to_slot(contained, slot_wear_mask_str) +/obj/machinery/oxygen_pump/proc/attach_mask(var/mob/living/subject) + if(istype(subject)) + contained.dropInto(subject.loc) + subject.equip_to_slot(contained, slot_wear_mask_str) if(tank) - tank.forceMove(C) - breather = C + tank.forceMove(subject) + breather = subject -/obj/machinery/oxygen_pump/proc/set_internals(var/mob/living/C) - if(ishuman(C)) - if(!C.get_internals() && tank) +/obj/machinery/oxygen_pump/proc/set_internals() + if(isliving(breather)) + if(!breather.get_internals() && tank) breather.set_internals(tank) update_use_power(POWER_USE_ACTIVE) @@ -94,7 +94,7 @@ breather = null update_use_power(POWER_USE_IDLE) -/obj/machinery/oxygen_pump/proc/can_apply_to_target(var/mob/living/carbon/human/target, mob/user) +/obj/machinery/oxygen_pump/proc/can_apply_to_target(var/mob/living/target, mob/user) if(!user) user = target // Check target validity @@ -104,7 +104,9 @@ if(!target.check_has_mouth()) to_chat(user, SPAN_WARNING("\The [target] doesn't have a mouth.")) return - + if(!target.get_inventory_slot_datum(slot_wear_mask_str)) + to_chat(user, SPAN_WARNING("\The [target] cannot wear a mask.")) + return var/obj/item/mask = target.get_equipped_item(slot_wear_mask_str) if(mask && target != breather) to_chat(user, SPAN_WARNING("\The [target] is already wearing a mask.")) @@ -161,14 +163,12 @@ else to_chat(user, SPAN_WARNING("It is missing a tank!")) - /obj/machinery/oxygen_pump/Process() if(istype(breather)) if(!can_apply_to_target(breather)) detach_mask() else if(!breather.get_internals() && tank) - set_internals(breather) - + set_internals() //Create rightclick to view tank settings /obj/machinery/oxygen_pump/verb/settings() diff --git a/code/modules/admin/view_variables/topic.dm b/code/modules/admin/view_variables/topic.dm index b8c3caf1ca3..75fb19c9554 100644 --- a/code/modules/admin/view_variables/topic.dm +++ b/code/modules/admin/view_variables/topic.dm @@ -482,9 +482,13 @@ else if(href_list["addorgan"]) if(!check_rights(R_SPAWN)) return - var/mob/living/carbon/human/M = locate(href_list["addorgan"]) + var/mob/living/M = locate(href_list["addorgan"]) if(!istype(M)) - to_chat(usr, "This can only be done to instances of type /mob/living/carbon/human") + to_chat(usr, "This can only be done to instances of type /mob/living") + return + + if(!length(M.get_external_organs())) // quick and dirty check for organs; should always be >0 for humanlike mobs. + to_chat(usr, "This can only be done to mobs that implement organs!") return var/obj/item/organ/new_organ = input("Please choose an organ to add.","Organ",null) as null|anything in subtypesof(/obj/item/organ) @@ -509,9 +513,13 @@ else if(href_list["remorgan"]) if(!check_rights(R_SPAWN)) return - var/mob/living/carbon/human/M = locate(href_list["remorgan"]) + var/mob/living/M = locate(href_list["remorgan"]) if(!istype(M)) - to_chat(usr, "This can only be done to instances of type /mob/living/carbon/human") + to_chat(usr, "This can only be done to instances of type /mob/living") + return + + if(!length(M.get_external_organs())) // quick and dirty check for organs; should always be >0 for humanlike mobs. + to_chat(usr, "This can only be done to mobs that implement organs!") return var/obj/item/organ/rem_organ = input("Please choose an organ to remove.","Organ",null) as null|anything in M.get_internal_organs() diff --git a/code/modules/mob/living/human/human_defines.dm b/code/modules/mob/living/human/human_defines.dm index 5142ca18883..af8c3bc7cf4 100644 --- a/code/modules/mob/living/human/human_defines.dm +++ b/code/modules/mob/living/human/human_defines.dm @@ -76,7 +76,3 @@ var/obj/item/tank/internal /// Contains environment tolerances and language information, along with a lot of other stuff, usually set during Initialize(). var/decl/species/species - /// these two help govern taste. The first is the last time a taste message was shown to the plaer. - var/last_taste_time = 0 - /// the second is the message in question. - var/last_taste_text = "" diff --git a/code/modules/mob/living/living_eating.dm b/code/modules/mob/living/living_eating.dm index b9fce7dfa9b..40d51220515 100644 --- a/code/modules/mob/living/living_eating.dm +++ b/code/modules/mob/living/living_eating.dm @@ -1,7 +1,3 @@ -/mob/living/proc/ingest(var/datum/reagents/from, var/datum/reagents/target, var/amount = 1, var/multiplier = 1, var/copy = 0) - RAISE_EVENT(/decl/observ/ingested, src, from, target, amount, multiplier, copy) - . = from.trans_to_holder(target,amount,multiplier,copy) - /mob/living/can_eat_food_currently(obj/eating, mob/user, consumption_method) user = user || src if(get_food_satiation(consumption_method) < get_max_nutrition()) diff --git a/code/modules/mob/living/human/human_eating.dm b/code/modules/mob/living/living_taste.dm similarity index 57% rename from code/modules/mob/living/human/human_eating.dm rename to code/modules/mob/living/living_taste.dm index 9129919cd2d..b7bcdb64be2 100644 --- a/code/modules/mob/living/human/human_eating.dm +++ b/code/modules/mob/living/living_taste.dm @@ -1,4 +1,10 @@ -/mob/living/carbon/human/ingest(var/datum/reagents/from, var/datum/reagents/target, var/amount = 1, var/multiplier = 1, var/copy = 0) //we kind of 'sneak' a proc in here for ingesting stuff so we can play with it. +/mob/living + /// these two help govern taste. The first is the last time a taste message was shown to the plaer. + var/last_taste_time = 0 + /// the second is the message in question. + var/last_taste_text = "" + +/mob/living/proc/ingest(var/datum/reagents/from, var/datum/reagents/target, var/amount = 1, var/multiplier = 1, var/copy = 0) if(last_taste_time + 50 < world.time) var/datum/reagents/temp = new(amount, global.temp_reagents_holder) //temporary holder used to analyse what gets transfered. from.trans_to_holder(temp, amount, multiplier, 1) @@ -7,4 +13,5 @@ to_chat(src, SPAN_NOTICE("You can taste [text_output].")) //no taste means there are too many tastes and not enough flavor. last_taste_time = world.time last_taste_text = text_output - . = ..() + RAISE_EVENT(/decl/observ/ingested, src, from, target, amount, multiplier, copy) + return from?.trans_to_holder(target, amount, multiplier, copy) diff --git a/code/modules/mob/transform_procs.dm b/code/modules/mob/transform_procs.dm index 39eb36a9024..47b9ba306b7 100644 --- a/code/modules/mob/transform_procs.dm +++ b/code/modules/mob/transform_procs.dm @@ -44,14 +44,17 @@ /mob/living/carbon/human/AIize(move=1) // 'move' argument needs defining here too because BYOND is dumb if (HAS_TRANSFORMATION_MOVEMENT_HANDLER(src)) return - for(var/t in get_external_organs()) - qdel(t) QDEL_NULL_LIST(worn_underwear) return ..(move) +/mob/living/silicon/ai/AIize() + return src + /mob/living/AIize() if (HAS_TRANSFORMATION_MOVEMENT_HANDLER(src)) return + for(var/t in get_external_organs()) + qdel(t) for(var/obj/item/W in src) drop_from_inventory(W) ADD_TRANSFORMATION_MOVEMENT_HANDLER(src) diff --git a/code/modules/reagents/Chemistry-Taste.dm b/code/modules/reagents/Chemistry-Taste.dm index 3fe822d2a91..5b73376f813 100644 --- a/code/modules/reagents/Chemistry-Taste.dm +++ b/code/modules/reagents/Chemistry-Taste.dm @@ -1,4 +1,3 @@ - /* what this does: catalogue the 'taste strength' of each one calculate text size per text. diff --git a/nebula.dme b/nebula.dme index 01acb65c114..2e0ee0302e2 100644 --- a/nebula.dme +++ b/nebula.dme @@ -2810,6 +2810,7 @@ #include "code\modules\mob\living\living_pulse.dm" #include "code\modules\mob\living\living_resist.dm" #include "code\modules\mob\living\living_status.dm" +#include "code\modules\mob\living\living_taste.dm" #include "code\modules\mob\living\living_throw.dm" #include "code\modules\mob\living\login.dm" #include "code\modules\mob\living\logout.dm" @@ -2877,7 +2878,6 @@ #include "code\modules\mob\living\human\human_damage.dm" #include "code\modules\mob\living\human\human_defense.dm" #include "code\modules\mob\living\human\human_defines.dm" -#include "code\modules\mob\living\human\human_eating.dm" #include "code\modules\mob\living\human\human_examine_decl.dm" #include "code\modules\mob\living\human\human_grabs.dm" #include "code\modules\mob\living\human\human_helpers.dm" From 4214688d2ba5e45e9df4fe526340a571ca26acef Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Thu, 13 Jun 2024 10:05:07 +1000 Subject: [PATCH 07/90] More requested changes to carbon PR. --- code/game/machinery/oxygen_pump.dm | 2 +- code/modules/mob/living/living_taste.dm | 2 +- code/modules/organs/prosthetics/prosthetics_manufacturer.dm | 3 +-- code/modules/species/species_bodytype.dm | 1 - code/modules/species/species_getters.dm | 2 +- 5 files changed, 4 insertions(+), 6 deletions(-) diff --git a/code/game/machinery/oxygen_pump.dm b/code/game/machinery/oxygen_pump.dm index e82ad9d1051..b72f83b4267 100644 --- a/code/game/machinery/oxygen_pump.dm +++ b/code/game/machinery/oxygen_pump.dm @@ -10,7 +10,7 @@ anchored = TRUE var/obj/item/tank/tank - var/mob/living/carbon/human/breather + var/mob/living/breather var/obj/item/clothing/mask/breath/contained var/spawn_type = /obj/item/tank/emergency/oxygen/engi diff --git a/code/modules/mob/living/living_taste.dm b/code/modules/mob/living/living_taste.dm index b7bcdb64be2..03845380c3e 100644 --- a/code/modules/mob/living/living_taste.dm +++ b/code/modules/mob/living/living_taste.dm @@ -1,5 +1,5 @@ /mob/living - /// these two help govern taste. The first is the last time a taste message was shown to the plaer. + /// these two help govern taste. The first is the last time a taste message was shown to the player. var/last_taste_time = 0 /// the second is the message in question. var/last_taste_text = "" diff --git a/code/modules/organs/prosthetics/prosthetics_manufacturer.dm b/code/modules/organs/prosthetics/prosthetics_manufacturer.dm index fcaa1901f46..11293b79fce 100644 --- a/code/modules/organs/prosthetics/prosthetics_manufacturer.dm +++ b/code/modules/organs/prosthetics/prosthetics_manufacturer.dm @@ -9,8 +9,7 @@ material = /decl/material/solid/metal/steel eye_flash_mod = 1 eye_darksight_range = 2 - associated_gender = PLURAL - retrievable_via_pronoun = FALSE + associated_gender = null emote_sounds = list( "whistle" = list('sound/voice/emotes/longwhistle_robot.ogg'), "qwhistle" = list('sound/voice/emotes/shortwhistle_robot.ogg'), diff --git a/code/modules/species/species_bodytype.dm b/code/modules/species/species_bodytype.dm index fa199123266..d4613329a43 100644 --- a/code/modules/species/species_bodytype.dm +++ b/code/modules/species/species_bodytype.dm @@ -23,7 +23,6 @@ var/global/list/bodytypes_by_category = list() var/icon_template = 'icons/mob/human_races/species/template.dmi' // Used for mob icon generation for non-32x32 species. var/ignited_icon = 'icons/mob/OnFire.dmi' var/associated_gender - var/retrievable_via_pronoun = TRUE var/appearance_flags = 0 // Appearance/display related features. /// Used when filing your nails. diff --git a/code/modules/species/species_getters.dm b/code/modules/species/species_getters.dm index 22f0a84b60f..eca5e8a9087 100644 --- a/code/modules/species/species_getters.dm +++ b/code/modules/species/species_getters.dm @@ -48,6 +48,6 @@ /decl/species/proc/get_bodytype_by_pronouns(var/decl/pronouns/pronouns) if(istype(pronouns)) for(var/decl/bodytype/bodytype in available_bodytypes) - if(!isnull(bodytype.associated_gender) && bodytype.retrievable_via_pronoun && bodytype.associated_gender == pronouns.name) + if(!isnull(bodytype.associated_gender) && bodytype.associated_gender == pronouns.name) return bodytype return default_bodytype From ef002066c794883591212c9ff1f1b1edd1654f9c Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Thu, 13 Jun 2024 10:15:05 +1000 Subject: [PATCH 08/90] Renaming carbon/human vars named C. --- .../hud/screen/screen_click_catcher.dm | 4 +-- code/game/machinery/doors/airlock.dm | 12 +++---- code/game/machinery/kitchen/gibber.dm | 8 ++--- .../game/objects/items/devices/radio/radio.dm | 7 ++-- .../objects/items/devices/scanners/breath.dm | 16 +++++----- code/game/objects/items/weapons/ecigs.dm | 10 +++--- code/game/objects/structures/crematorium.dm | 3 +- code/modules/clothing/masks/chewable.dm | 8 ++--- code/modules/clothing/masks/smokable.dm | 16 +++++----- code/modules/events/radiation_storm.dm | 8 ++--- .../hallucinations/hallucination_telepathy.dm | 4 +-- .../subtypes/reagents.dm | 8 ++--- code/modules/mob/living/bot/secbot.dm | 8 ++--- .../simple_animal/hostile/giant_spider.dm | 12 +++---- .../simple_animal/hostile/retaliate/parrot.dm | 8 ++--- .../projectiles/guns/projectile/flaregun.dm | 10 +++--- code/modules/reagents/Chemistry-Holder.dm | 32 +++++++++---------- code/modules/surgery/_surgery.dm | 3 +- .../xenoarcheaology/artifacts/effects/heal.dm | 8 ++--- .../xenoarcheaology/artifacts/effects/hurt.dm | 8 ++--- .../xenoarcheaology/artifacts/effects/stun.dm | 22 ++++++------- mods/species/vox/organs_vox.dm | 6 ++-- 22 files changed, 106 insertions(+), 115 deletions(-) diff --git a/code/_onclick/hud/screen/screen_click_catcher.dm b/code/_onclick/hud/screen/screen_click_catcher.dm index c5629388393..d5bfc696f15 100644 --- a/code/_onclick/hud/screen/screen_click_catcher.dm +++ b/code/_onclick/hud/screen/screen_click_catcher.dm @@ -36,8 +36,8 @@ var/global/list/click_catchers /obj/screen/click_catcher/Click(location, control, params) var/list/modifiers = params2list(params) if(modifiers["middle"] && isliving(usr)) - var/mob/living/C = usr - C.swap_hand() + var/mob/living/user = usr + user.swap_hand() else var/turf/origin = get_turf(usr) if(isturf(origin)) diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index f6d8bb205ab..d9a277a99ba 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -129,13 +129,11 @@ About the new airlock wires panel: return else /*if(src.justzap)*/ return - else if(prob(10) && src.operating == 0) - var/mob/living/C = user - if(istype(C) && C.hallucination_power > 25) - to_chat(user, SPAN_DANGER("You feel a powerful shock course through your body!")) - user.take_damage(10, PAIN) - SET_STATUS_MAX(user, STAT_STUN, 10) - return + else if(prob(10) && src.operating == 0 && user.hallucination_power > 25) + to_chat(user, SPAN_DANGER("You feel a powerful shock course through your body!")) + user.take_damage(10, PAIN) + SET_STATUS_MAX(user, STAT_STUN, 10) + return ..(user) /obj/machinery/door/airlock/bumpopen(mob/living/simple_animal/user) diff --git a/code/game/machinery/kitchen/gibber.dm b/code/game/machinery/kitchen/gibber.dm index 86b0c4e674d..325eb6ac96d 100644 --- a/code/game/machinery/kitchen/gibber.dm +++ b/code/game/machinery/kitchen/gibber.dm @@ -177,11 +177,9 @@ var/slab_nutrition = 20 if(isliving(occupant)) - var/mob/living/C = occupant - slab_nutrition = round(C.get_nutrition() / 15) - - if(ishuman(occupant)) - slab_name = occupant.real_name + slab_nutrition = round(occupant.get_nutrition() / 15) + if(ishuman(occupant)) + slab_name = occupant.real_name // Small mobs don't give as much nutrition. if(issmall(src.occupant)) diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm index e0938c1d830..8f1e2aaf0d0 100644 --- a/code/game/objects/items/devices/radio/radio.dm +++ b/code/game/objects/items/devices/radio/radio.dm @@ -317,18 +317,17 @@ set waitfor = FALSE if(!on) return 0 // the device has to be on // Fix for permacell radios, but kinda eh about actually fixing them. - if(!M || !message) return 0 + if(!istype(M) || !message) return 0 if(speaking && (speaking.flags & (LANG_FLAG_NONVERBAL|LANG_FLAG_SIGNLANG))) return 0 if (!broadcasting) // Sedation chemical effect should prevent radio use. - var/mob/living/C = M - if(istype(C) && (C.has_chemical_effect(CE_SEDATE, 1) || C.incapacitated(INCAPACITATION_DISRUPTED))) + if((M.has_chemical_effect(CE_SEDATE, 1) || M.incapacitated(INCAPACITATION_DISRUPTED))) to_chat(M, SPAN_WARNING("You're unable to reach \the [src].")) return 0 - if((istype(C)) && C.radio_interrupt_cooldown > world.time) + if(M.radio_interrupt_cooldown > world.time) to_chat(M, SPAN_WARNING("You're disrupted as you reach for \the [src].")) return 0 diff --git a/code/game/objects/items/devices/scanners/breath.dm b/code/game/objects/items/devices/scanners/breath.dm index 71f5caa1c7d..bc80d7c7b9f 100644 --- a/code/game/objects/items/devices/scanners/breath.dm +++ b/code/game/objects/items/devices/scanners/breath.dm @@ -27,7 +27,7 @@ to_chat(user, .) to_chat(user, "
") -/proc/breath_scan_results(var/mob/living/C, var/verbose, var/skill_level = SKILL_DEFAULT) +/proc/breath_scan_results(var/mob/living/target, var/verbose, var/skill_level = SKILL_DEFAULT) . = list() var/header = list() var/b @@ -45,11 +45,11 @@ b = "" endb = "" - . += "[b]Breath sample results for \the [C]:[endb]" + . += "[b]Breath sample results for \the [target]:[endb]" - var/obj/item/organ/internal/lungs/lungs = C.get_organ(BP_LUNGS) + var/obj/item/organ/internal/lungs/lungs = target.get_organ(BP_LUNGS) var/breathing = "none" - if(istype(lungs) && !(C.status_flags & FAKEDEATH)) + if(istype(lungs) && !(target.status_flags & FAKEDEATH)) if(lungs.breath_fail_ratio < 0.3) breathing = "normal" else if(lungs.breath_fail_ratio < 1) @@ -66,7 +66,7 @@ // Other general warnings. if(skill_level >= SKILL_BASIC) - switch(C.get_damage(OXY)) + switch(target.get_damage(OXY)) if(0 to 25) dat += "Subject oxygen levels nominal." if(25 to 50) @@ -90,14 +90,14 @@ . += "[b]Reagent scan:[endb]" var/print_reagent_default_message = TRUE - if (C.has_chemical_effect(CE_ALCOHOL, 1)) + if (target.has_chemical_effect(CE_ALCOHOL, 1)) . += "Alcohol detected in subject's breath." print_reagent_default_message = FALSE - if (C.has_chemical_effect(CE_ALCOHOL_TOXIC, 1)) + if (target.has_chemical_effect(CE_ALCOHOL_TOXIC, 1)) . += "Subject is suffering from alcohol poisoning." print_reagent_default_message = FALSE - var/datum/reagents/inhaled = C.get_inhaled_reagents() + var/datum/reagents/inhaled = target.get_inhaled_reagents() if(inhaled && inhaled.total_volume) var/unknown = 0 for(var/rtype in inhaled.reagent_volumes) diff --git a/code/game/objects/items/weapons/ecigs.dm b/code/game/objects/items/weapons/ecigs.dm index 774f77c4230..af97d1e5d9a 100644 --- a/code/game/objects/items/weapons/ecigs.dm +++ b/code/game/objects/items/weapons/ecigs.dm @@ -96,23 +96,23 @@ idle ++ if(ishuman(loc)) - var/mob/living/carbon/human/C = loc + var/mob/living/carbon/human/user = loc if (!lit || !ec_cartridge || !ec_cartridge.reagents.total_volume)//no cartridge if(!ec_cartridge.reagents.total_volume) - to_chat(C, SPAN_NOTICE("There's no liquid left in \the [src], so you shut it down.")) + to_chat(user, SPAN_NOTICE("There's no liquid left in \the [src], so you shut it down.")) Deactivate() return - if (src == C.get_equipped_item(slot_wear_mask_str) && C.check_has_mouth()) //transfer, but only when not disabled + if (src == user.get_equipped_item(slot_wear_mask_str) && user.check_has_mouth()) //transfer, but only when not disabled idle = 0 //here we'll reduce battery by usage, and check powerlevel - you only use batery while smoking var/obj/item/cell/cell = get_cell() if(!cell?.checked_use(power_usage * CELLRATE)) //if this passes, there's not enough power in the battery Deactivate() - to_chat(C,SPAN_NOTICE("\The [src]'s power meter flashes a low battery warning and shuts down.")) + to_chat(user,SPAN_NOTICE("\The [src]'s power meter flashes a low battery warning and shuts down.")) return - ec_cartridge.reagents.trans_to_mob(C, REM, CHEM_INHALE, 0.4) // Most of it is not inhaled... balance reasons. + ec_cartridge.reagents.trans_to_mob(user, REM, CHEM_INHALE, 0.4) // Most of it is not inhaled... balance reasons. /obj/item/clothing/mask/smokable/ecig/on_update_icon() . = ..() diff --git a/code/game/objects/structures/crematorium.dm b/code/game/objects/structures/crematorium.dm index d83c67a1858..36c79b78e28 100644 --- a/code/game/objects/structures/crematorium.dm +++ b/code/game/objects/structures/crematorium.dm @@ -121,10 +121,9 @@ for(var/mob/living/M in contents) admin_attack_log(A, M, "Began cremating their victim.", "Has begun being cremated.", "began cremating") if(isliving(M)) - var/mob/living/C = M for(var/I, I < 60, I++) - if(C.stat >= UNCONSCIOUS || !(C in contents)) //In case we die or are removed at any point. + if(M.stat >= UNCONSCIOUS || !(M in contents)) //In case we die or are removed at any point. cremating = 0 update_icon() break diff --git a/code/modules/clothing/masks/chewable.dm b/code/modules/clothing/masks/chewable.dm index 8a24976bd49..28e85f79b09 100644 --- a/code/modules/clothing/masks/chewable.dm +++ b/code/modules/clothing/masks/chewable.dm @@ -41,10 +41,10 @@ chewtime -= amount if(reagents && reagents.total_volume) if(ishuman(loc)) - var/mob/living/carbon/human/C = loc - if (src == C.get_equipped_item(slot_wear_mask_str) && C.check_has_mouth()) - reagents.trans_to_mob(C, REM, CHEM_INGEST, 0.2) - add_trace_DNA(C) + var/mob/living/carbon/human/user = loc + if (src == user.get_equipped_item(slot_wear_mask_str) && user.check_has_mouth()) + reagents.trans_to_mob(user, REM, CHEM_INGEST, 0.2) + add_trace_DNA(user) else STOP_PROCESSING(SSobj, src) diff --git a/code/modules/clothing/masks/smokable.dm b/code/modules/clothing/masks/smokable.dm index 32c8e597f7f..6abbda121bd 100644 --- a/code/modules/clothing/masks/smokable.dm +++ b/code/modules/clothing/masks/smokable.dm @@ -60,11 +60,11 @@ if(reagents && reagents.total_volume) // check if it has any reagents at all var/smoke_loc = loc if(ishuman(loc)) - var/mob/living/carbon/human/C = loc - smoke_loc = C.loc - if ((src == C.get_equipped_item(slot_wear_mask_str) || manual) && C.check_has_mouth()) // if it's in the human/monkey mouth, transfer reagents to the mob - reagents.trans_to_mob(C, smoke_amount * amount, CHEM_INHALE, 0.2) - add_trace_DNA(C) + var/mob/living/carbon/human/user = loc + smoke_loc = user.loc + if ((src == user.get_equipped_item(slot_wear_mask_str) || manual) && user.check_has_mouth()) // if it's in the human/monkey mouth, transfer reagents to the mob + reagents.trans_to_mob(user, smoke_amount * amount, CHEM_INHALE, 0.2) + add_trace_DNA(user) else // else just remove some of the reagents remove_any_reagents(smoke_amount * amount) @@ -78,9 +78,9 @@ if(T) var/datum/gas_mixture/environment = T.return_air() if(ishuman(loc)) - var/mob/living/carbon/human/C = loc - if (src == C.get_equipped_item(slot_wear_mask_str) && C.internal) - environment = C.internal.return_air() + var/mob/living/carbon/human/user = loc + if (src == user.get_equipped_item(slot_wear_mask_str) && user.internal) + environment = user.internal.return_air() if(environment.get_by_flag(XGM_GAS_OXIDIZER) < gas_consumption) extinguish() else diff --git a/code/modules/events/radiation_storm.dm b/code/modules/events/radiation_storm.dm index f8687786a6e..44f1ca326c8 100644 --- a/code/modules/events/radiation_storm.dm +++ b/code/modules/events/radiation_storm.dm @@ -45,14 +45,14 @@ for(var/z in affecting_z) SSradiation.z_radiate(locate(1, 1, z), radiation_level, 1) - for(var/mob/living/C in global.living_mob_list_) - var/area/A = get_area(C) + for(var/mob/living/target in global.living_mob_list_) + var/area/A = get_area(target) if(!A) continue if(A.area_flags & AREA_FLAG_RAD_SHIELDED) continue - if(ishuman(C)) - var/mob/living/carbon/human/H = C + if(ishuman(target)) + var/mob/living/carbon/human/H = target if(prob(5 * (1 - H.get_blocked_ratio(null, IRRADIATE, damage_flags = DAM_DISPERSED, armor_pen = radiation_level)))) if (prob(75)) randmutb(H) // Applies bad mutation diff --git a/code/modules/hallucinations/hallucination_telepathy.dm b/code/modules/hallucinations/hallucination_telepathy.dm index 8d7ca411c2e..67c5be921e7 100644 --- a/code/modules/hallucinations/hallucination_telepathy.dm +++ b/code/modules/hallucinations/hallucination_telepathy.dm @@ -29,8 +29,8 @@ to_chat(usr, SPAN_WARNING("Chemicals in your blood prevent you from using your power!")) var/list/creatures = list() - for(var/mob/living/C in SSmobs.mob_list) - creatures += C + for(var/mob/living/creature in SSmobs.mob_list) + creatures += creature creatures -= usr var/mob/target = input("Who do you want to project your mind to?") as null|anything in creatures if (isnull(target)) diff --git a/code/modules/integrated_electronics/subtypes/reagents.dm b/code/modules/integrated_electronics/subtypes/reagents.dm index 2a6fb918985..3f5541cab97 100644 --- a/code/modules/integrated_electronics/subtypes/reagents.dm +++ b/code/modules/integrated_electronics/subtypes/reagents.dm @@ -150,16 +150,16 @@ /obj/item/integrated_circuit/reagent/injector/proc/draw_after(var/weakref/target, var/amount) busy = FALSE - var/mob/living/C = target_nearby(target) - if(!C) + var/mob/living/target_living = target_nearby(target) + if(!target_living) activate_pin(3) return var/atom/movable/acting_object = get_object() - C.visible_message("\The [acting_object] draws blood from \the [C]", + target_living.visible_message("\The [acting_object] draws blood from \the [target_living]", "\The [acting_object] draws blood from you." ) - C.take_blood(src, amount) + target_living.take_blood(src, amount) activate_pin(2) diff --git a/code/modules/mob/living/bot/secbot.dm b/code/modules/mob/living/bot/secbot.dm index c027eca044f..5aaf8e3a716 100644 --- a/code/modules/mob/living/bot/secbot.dm +++ b/code/modules/mob/living/bot/secbot.dm @@ -184,10 +184,10 @@ else UnarmedAttack(target) -/mob/living/bot/secbot/proc/cuff_target(var/mob/living/C) - if(istype(C) && !C.get_equipped_item(slot_handcuffed_str)) - handcuffs.place_handcuffs(C, src) - resetTarget() //we're done, failed or not. Don't want to get stuck if C is not +/mob/living/bot/secbot/proc/cuff_target(var/mob/living/target) + if(istype(target) && !target.get_equipped_item(slot_handcuffed_str)) + handcuffs.place_handcuffs(target, src) + resetTarget() //we're done, failed or not. Don't want to get stuck if target is not /mob/living/bot/get_target_zone() if(!client) diff --git a/code/modules/mob/living/simple_animal/hostile/giant_spider.dm b/code/modules/mob/living/simple_animal/hostile/giant_spider.dm index 9832ad8bfd8..95a39c32c8b 100644 --- a/code/modules/mob/living/simple_animal/hostile/giant_spider.dm +++ b/code/modules/mob/living/simple_animal/hostile/giant_spider.dm @@ -310,15 +310,15 @@ Nurse caste procs //30% chance to stop wandering and do something if(!spooder.busy && prob(30)) //first, check for potential food nearby to cocoon - for(var/mob/living/C in can_see) - if(is_type_in_list(C, spooder.cocoon_blacklist)) + for(var/mob/living/web_target in can_see) + if(is_type_in_list(web_target, spooder.cocoon_blacklist)) continue - if(C.stat) - spooder.cocoon_target = C + if(web_target.stat) + spooder.cocoon_target = web_target spooder.busy = MOVING_TO_TARGET - walk_to(spooder, C, 1, spooder.move_to_delay) + walk_to(spooder, web_target, 1, spooder.move_to_delay) //give up if we can't reach them after 10 seconds - spooder.GiveUp(C) + spooder.GiveUp(web_target) return //second, spin a sticky spiderweb on this tile diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/parrot.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/parrot.dm index 8d058d6217b..73c0c426397 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/parrot.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/parrot.dm @@ -435,14 +435,14 @@ return 1 var/obj/item/stolen_item = null - for(var/mob/living/C in view(1,src)) - for(var/obj/item/thing in C.get_held_items()) + for(var/mob/living/target in view(1,src)) + for(var/obj/item/thing in target.get_held_items()) if(can_pick_up(thing)) stolen_item = thing break - if(stolen_item && C.try_unequip(stolen_item, src)) + if(stolen_item && target.try_unequip(stolen_item, src)) held_item = stolen_item - visible_message("[src] grabs the [held_item] out of [C]'s hand!", "You snag the [held_item] out of [C]'s hand!", "You hear the sounds of wings flapping furiously.") + visible_message("[src] grabs the [held_item] out of [target]'s hand!", "You snag the [held_item] out of [target]'s hand!", "You hear the sounds of wings flapping furiously.") return held_item to_chat(src, "There is nothing of interest to take.") diff --git a/code/modules/projectiles/guns/projectile/flaregun.dm b/code/modules/projectiles/guns/projectile/flaregun.dm index fb7aa7cc23e..283e7ceb8d0 100644 --- a/code/modules/projectiles/guns/projectile/flaregun.dm +++ b/code/modules/projectiles/guns/projectile/flaregun.dm @@ -33,12 +33,12 @@ var/obj/item/projectile/bullet/pellet/PP = chambered_round.BB damage = PP.damage*PP.pellets if(damage > 5) - var/mob/living/C = loc - if(istype(C)) - C.visible_message("[src] explodes in [C]'s hands!", "[src] explodes in your face!") - C.drop_from_inventory(src) + var/mob/living/user = loc + if(istype(user)) + user.visible_message("[src] explodes in [user]'s hands!", "[src] explodes in your face!") + user.drop_from_inventory(src) for(var/zone in list(BP_L_HAND, BP_R_HAND)) - C.apply_damage(rand(10,20), def_zone=zone) + user.apply_damage(rand(10,20), def_zone=zone) else visible_message("[src] explodes!") explosion(get_turf(src), -1, -1, 1) diff --git a/code/modules/reagents/Chemistry-Holder.dm b/code/modules/reagents/Chemistry-Holder.dm index ff466520966..387f0fdd630 100644 --- a/code/modules/reagents/Chemistry-Holder.dm +++ b/code/modules/reagents/Chemistry-Holder.dm @@ -191,36 +191,34 @@ var/global/obj/temp_reagents_holder = new if(!(check_flags & ATOM_FLAG_NO_REACT)) var/list/active_reactions = list() - for(var/decl/chemical_reaction/C in eligible_reactions) - if(C.can_happen(src)) - active_reactions[C] = 1 // The number is going to be 1/(fraction of remaining reagents we are allowed to use), computed below + for(var/decl/chemical_reaction/reaction in eligible_reactions) + if(reaction.can_happen(src)) + active_reactions[reaction] = 1 // The number is going to be 1/(fraction of remaining reagents we are allowed to use), computed below reaction_occured = 1 var/list/used_reagents = list() // if two reactions share a reagent, each is allocated half of it, so we compute this here - for(var/decl/chemical_reaction/C in active_reactions) - var/list/adding = C.get_used_reagents() + for(var/decl/chemical_reaction/reaction in active_reactions) + var/list/adding = reaction.get_used_reagents() for(var/R in adding) - LAZYADD(used_reagents[R], C) + LAZYADD(used_reagents[R], reaction) for(var/R in used_reagents) var/counter = length(used_reagents[R]) if(counter <= 1) continue // Only used by one reaction, so nothing we need to do. - for(var/decl/chemical_reaction/C in used_reagents[R]) - active_reactions[C] = max(counter, active_reactions[C]) + for(var/decl/chemical_reaction/reaction in used_reagents[R]) + active_reactions[reaction] = max(counter, active_reactions[reaction]) counter-- //so the next reaction we execute uses more of the remaining reagents // Note: this is not guaranteed to maximize the size of the reactions we do (if one reaction is limited by reagent A, we may be over-allocating reagent B to it) // However, we are guaranteed to fully use up the most profligate reagent if possible. // Further reactions may occur on the next tick, when this runs again. - for(var/thing in active_reactions) - var/decl/chemical_reaction/C = thing - C.process(src, active_reactions[C]) + for(var/decl/chemical_reaction/reaction as anything in active_reactions) + reaction.process(src, active_reactions[reaction]) - for(var/thing in active_reactions) - var/decl/chemical_reaction/C = thing - C.post_reaction(src) + for(var/decl/chemical_reaction/reaction as anything in active_reactions) + reaction.post_reaction(src) update_total() @@ -685,7 +683,7 @@ var/global/obj/temp_reagents_holder = new if(!. && href_list["deconvert"]) var/list/data = REAGENT_DATA(src, /decl/material/liquid/water) if(LAZYACCESS(data, "holy")) - var/mob/living/C = locate(href_list["deconvert"]) - if(istype(C) && !QDELETED(C) && C.mind) + var/mob/living/target = locate(href_list["deconvert"]) + if(istype(target) && !QDELETED(target) && target.mind) var/decl/special_role/godcult = GET_DECL(/decl/special_role/godcultist) - godcult.remove_antagonist(C.mind,1) + godcult.remove_antagonist(target.mind,1) diff --git a/code/modules/surgery/_surgery.dm b/code/modules/surgery/_surgery.dm index cb70108161b..64af1cebebf 100644 --- a/code/modules/surgery/_surgery.dm +++ b/code/modules/surgery/_surgery.dm @@ -142,8 +142,7 @@ var/global/list/surgery_tool_exception_cache = list() affected.how_open() < open_threshold)) return FALSE // Check if clothing is blocking access - var/mob/living/carbon/human/C = target - var/obj/item/I = C.get_covering_equipped_item_by_zone(target_zone) + var/obj/item/I = user.get_covering_equipped_item_by_zone(target_zone) if(I && (I.item_flags & ITEM_FLAG_THICKMATERIAL)) to_chat(user,SPAN_NOTICE("The material covering this area is too thick for you to do surgery through!")) return FALSE diff --git a/code/modules/xenoarcheaology/artifacts/effects/heal.dm b/code/modules/xenoarcheaology/artifacts/effects/heal.dm index 85743f740ce..63b50ee4300 100644 --- a/code/modules/xenoarcheaology/artifacts/effects/heal.dm +++ b/code/modules/xenoarcheaology/artifacts/effects/heal.dm @@ -10,14 +10,14 @@ /datum/artifact_effect/heal/DoEffectAura() if(holder) var/turf/T = get_turf(holder) - for (var/mob/living/C in range(src.effect_range,T)) - heal(C, 1, msg_prob = 5) + for (var/mob/living/target in range(src.effect_range,T)) + heal(target, 1, msg_prob = 5) /datum/artifact_effect/heal/DoEffectPulse() if(holder) var/turf/T = get_turf(holder) - for (var/mob/living/C in range(effect_range,T)) - heal(C, 5) + for (var/mob/living/target in range(effect_range,T)) + heal(target, 5) //todo: check over this properly /datum/artifact_effect/heal/proc/heal(mob/living/M, amount, strong, msg_prob = 100) diff --git a/code/modules/xenoarcheaology/artifacts/effects/hurt.dm b/code/modules/xenoarcheaology/artifacts/effects/hurt.dm index ca6fff5bbb8..238e8b99865 100644 --- a/code/modules/xenoarcheaology/artifacts/effects/hurt.dm +++ b/code/modules/xenoarcheaology/artifacts/effects/hurt.dm @@ -9,14 +9,14 @@ /datum/artifact_effect/hurt/DoEffectAura() if(holder) var/turf/T = get_turf(holder) - for (var/mob/living/C in range(src.effect_range,T)) - hurt(C, 1, msg_prob = 5) + for (var/mob/living/target in range(src.effect_range,T)) + hurt(target, 1, msg_prob = 5) /datum/artifact_effect/hurt/DoEffectPulse() if(holder) var/turf/T = get_turf(holder) - for (var/mob/living/C in range(effect_range, T)) - hurt(C, 3) + for (var/mob/living/target in range(effect_range, T)) + hurt(target, 3) /datum/artifact_effect/hurt/proc/hurt(mob/living/M, amount, strong, msg_prob=100) var/weakness = GetAnomalySusceptibility(M) diff --git a/code/modules/xenoarcheaology/artifacts/effects/stun.dm b/code/modules/xenoarcheaology/artifacts/effects/stun.dm index 3bbdd67aa4a..257a9976bf4 100644 --- a/code/modules/xenoarcheaology/artifacts/effects/stun.dm +++ b/code/modules/xenoarcheaology/artifacts/effects/stun.dm @@ -17,21 +17,21 @@ /datum/artifact_effect/stun/DoEffectAura() if(holder) var/turf/T = get_turf(holder) - for (var/mob/living/C in range(effect_range,T)) - var/susceptibility = GetAnomalySusceptibility(C) + for (var/mob/living/target in range(effect_range,T)) + var/susceptibility = GetAnomalySusceptibility(target) if(prob(10 * susceptibility)) - to_chat(C, "Your body goes numb for a moment.") - SET_STATUS_MAX(C, STAT_WEAK, 2) - SET_STATUS_MAX(C, STAT_STUTTER, 2) + to_chat(target, "Your body goes numb for a moment.") + SET_STATUS_MAX(target, STAT_WEAK, 2) + SET_STATUS_MAX(target, STAT_STUTTER, 2) else if(prob(10)) - to_chat(C, "You feel numb.") + to_chat(target, "You feel numb.") /datum/artifact_effect/stun/DoEffectPulse() if(holder) var/turf/T = get_turf(holder) - for (var/mob/living/C in range(effect_range,T)) - var/susceptibility = GetAnomalySusceptibility(C) + for (var/mob/living/target in range(effect_range,T)) + var/susceptibility = GetAnomalySusceptibility(target) if(prob(100 * susceptibility)) - to_chat(C, "A wave of energy overwhelms your senses!") - SET_STATUS_MAX(C, STAT_WEAK, 4 * susceptibility) - SET_STATUS_MAX(C, STAT_STUTTER, 4 * susceptibility) + to_chat(target, "A wave of energy overwhelms your senses!") + SET_STATUS_MAX(target, STAT_WEAK, 4 * susceptibility) + SET_STATUS_MAX(target, STAT_STUTTER, 4 * susceptibility) diff --git a/mods/species/vox/organs_vox.dm b/mods/species/vox/organs_vox.dm index fa549859758..82028b4df7a 100644 --- a/mods/species/vox/organs_vox.dm +++ b/mods/species/vox/organs_vox.dm @@ -208,13 +208,13 @@ prompt_revive_callback(owner) return TRUE -/obj/item/organ/internal/voxstack/proc/prompt_revive_callback(var/mob/living/C) +/obj/item/organ/internal/voxstack/proc/prompt_revive_callback(var/mob/living/target) set waitfor = FALSE - if(C && !backup_inviable()) + if(istype(target) && !backup_inviable()) prompting = TRUE var/response = alert(find_dead_player(stored_ckey, 1), "Your neural backup has been placed into a new body. Do you wish to return to life as the mind of [backup.name]?", "Resleeving", "Yes", "No") prompting = FALSE - if(src && response == "Yes" && owner == C) + if(src && response == "Yes" && owner == target) overwrite() sleep(-1) do_backup() From b662ed27512397dbc8aac858aaa64f6da3145bc0 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Thu, 13 Jun 2024 23:22:03 +1000 Subject: [PATCH 09/90] Requested change from review. --- code/modules/mob/living/human/human.dm | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/code/modules/mob/living/human/human.dm b/code/modules/mob/living/human/human.dm index 1ae45d4619f..67475d81068 100644 --- a/code/modules/mob/living/human/human.dm +++ b/code/modules/mob/living/human/human.dm @@ -58,10 +58,9 @@ QDEL_NULL(touching) if(reagents == bloodstr) - reagents = null + bloodstr = null else QDEL_NULL(bloodstr) - QDEL_NULL(bloodstr) if(loc) for(var/mob/M in contents) From 2d0731ec664aebf2359dadfaa57616b90dfda20a Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Fri, 14 Jun 2024 15:04:23 +1000 Subject: [PATCH 10/90] Moving some electrocution checking down to /mob/living. --- code/modules/mob/living/human/human_damage.dm | 76 --------------- .../modules/mob/living/human/human_defense.dm | 13 --- .../mob/living/living_electrocution.dm | 93 +++++++++++++++++++ nebula.dme | 1 + 4 files changed, 94 insertions(+), 89 deletions(-) create mode 100644 code/modules/mob/living/living_electrocution.dm diff --git a/code/modules/mob/living/human/human_damage.dm b/code/modules/mob/living/human/human_damage.dm index 710011c1b87..0d9d781d1e6 100644 --- a/code/modules/mob/living/human/human_damage.dm +++ b/code/modules/mob/living/human/human_damage.dm @@ -403,79 +403,3 @@ This function restores all organs. if(stat == UNCONSCIOUS) traumatic_shock *= 0.6 return max(0,traumatic_shock) - -//Electrical shock - -/mob/living/carbon/human/proc/apply_shock(var/shock_damage, var/def_zone, var/base_siemens_coeff = 1.0) - var/obj/item/organ/external/initial_organ = GET_EXTERNAL_ORGAN(src, check_zone(def_zone, src)) - if(!initial_organ) - initial_organ = pick(get_external_organs()) - - var/obj/item/organ/external/floor_organ - - if(!current_posture.prone) - var/list/obj/item/organ/external/standing = list() - for(var/limb_tag in list(BP_L_FOOT, BP_R_FOOT)) - var/obj/item/organ/external/E = GET_EXTERNAL_ORGAN(src, limb_tag) - if(E && E.is_usable()) - standing[E.organ_tag] = E - if((def_zone == BP_L_FOOT || def_zone == BP_L_LEG) && standing[BP_L_FOOT]) - floor_organ = standing[BP_L_FOOT] - if((def_zone == BP_R_FOOT || def_zone == BP_R_LEG) && standing[BP_R_FOOT]) - floor_organ = standing[BP_R_FOOT] - else - floor_organ = standing[pick(standing)] - - if(!floor_organ) - floor_organ = pick(get_external_organs()) - - var/list/obj/item/organ/external/to_shock = trace_shock(initial_organ, floor_organ) - if(!length(to_shock)) - return 0 - - shock_damage /= length(to_shock) - shock_damage = round(shock_damage, 0.1) - - for(var/obj/item/organ/external/E in to_shock) - var/actual_shock_damage = max(1, round(shock_damage * base_siemens_coeff * get_siemens_coefficient_organ(E))) - if(actual_shock_damage) - apply_damage(shock_damage, BURN, E.organ_tag, used_weapon="Electrocution") - . += actual_shock_damage - - if(. > 10) - local_emp(initial_organ, 3) - -/mob/living/carbon/human/proc/trace_shock(var/obj/item/organ/external/init, var/obj/item/organ/external/floor) - var/list/obj/item/organ/external/traced_organs = list(floor) - - if(!init) - return - - if(!floor || init == floor) - return list(init) - - for(var/obj/item/organ/external/E in list(floor, init)) - while(E && E.parent_organ) - var/candidate = GET_EXTERNAL_ORGAN(src, E.parent_organ) - if(!candidate || (candidate in traced_organs)) - break // Organ parenthood is not guaranteed to be a tree - E = candidate - traced_organs += E - if(E == init) - return traced_organs - - return traced_organs - -/mob/living/carbon/human/proc/local_emp(var/list/limbs, var/severity = 2) - if(!islist(limbs)) - limbs = list(limbs) - - var/list/EMP = list() - for(var/obj/item/organ/external/limb in limbs) - EMP += limb - if(LAZYLEN(limb.internal_organs)) - EMP += limb.internal_organs - if(LAZYLEN(limb.implants)) - EMP += limb.implants - for(var/atom/E in EMP) - E.emp_act(severity) diff --git a/code/modules/mob/living/human/human_defense.dm b/code/modules/mob/living/human/human_defense.dm index cd1e293ef8c..8011c3258a9 100644 --- a/code/modules/mob/living/human/human_defense.dm +++ b/code/modules/mob/living/human/human_defense.dm @@ -85,19 +85,6 @@ meteor_act // Add inherent armor to the end of list so that protective equipment is checked first . += ..() -//this proc returns the Siemens coefficient of electrical resistivity for a particular external organ. -/mob/living/carbon/human/proc/get_siemens_coefficient_organ(var/obj/item/organ/external/def_zone) - if (!def_zone) - return 1.0 - - var/siemens_coefficient = max(species.get_shock_vulnerability(src), 0) - for(var/slot in global.standard_clothing_slots) - var/obj/item/clothing/C = get_equipped_item(slot) - if(istype(C) && (C.body_parts_covered & def_zone.body_part)) // Is that body part being targeted covered? - siemens_coefficient *= C.siemens_coefficient - - return siemens_coefficient - /mob/living/carbon/human/proc/check_head_coverage() for(var/slot in global.standard_headgear_slots) var/obj/item/clothing/clothes = get_equipped_item(slot) diff --git a/code/modules/mob/living/living_electrocution.dm b/code/modules/mob/living/living_electrocution.dm new file mode 100644 index 00000000000..63404d00ecd --- /dev/null +++ b/code/modules/mob/living/living_electrocution.dm @@ -0,0 +1,93 @@ +//this proc returns the Siemens coefficient of electrical resistivity for a particular external organ. +/mob/living/proc/get_siemens_coefficient_organ(var/obj/item/organ/external/def_zone) + if (!def_zone) + return 1.0 + + var/siemens_coefficient = max(get_species()?.get_shock_vulnerability(src), 0) + for(var/slot in global.standard_clothing_slots) + var/obj/item/clothing/C = get_equipped_item(slot) + if(istype(C) && (C.body_parts_covered & def_zone.body_part)) // Is that body part being targeted covered? + siemens_coefficient *= C.siemens_coefficient + + return siemens_coefficient + +//Electrical shock +/mob/living/proc/apply_shock(var/shock_damage, var/def_zone, var/base_siemens_coeff = 1.0) + + var/list/shock_organs = get_external_organs() + if(!length(shock_organs)) + // TODO: check armor or Siemen's coefficient for non-human mobs + apply_damage(shock_damage, BURN, used_weapon = "Electrocution") + return + + var/obj/item/organ/external/initial_organ = GET_EXTERNAL_ORGAN(src, check_zone(def_zone, src)) + if(!initial_organ) + initial_organ = pick(shock_organs) + + var/obj/item/organ/external/floor_organ + if(!current_posture?.prone) + var/list/obj/item/organ/external/standing = list() + for(var/limb_tag in list(BP_L_FOOT, BP_R_FOOT)) + var/obj/item/organ/external/E = GET_EXTERNAL_ORGAN(src, limb_tag) + if(E && E.is_usable()) + standing[E.organ_tag] = E + if((def_zone == BP_L_FOOT || def_zone == BP_L_LEG) && standing[BP_L_FOOT]) + floor_organ = standing[BP_L_FOOT] + if((def_zone == BP_R_FOOT || def_zone == BP_R_LEG) && standing[BP_R_FOOT]) + floor_organ = standing[BP_R_FOOT] + else + floor_organ = standing[pick(standing)] + + if(!floor_organ) + floor_organ = pick(get_external_organs()) + + var/list/obj/item/organ/external/to_shock = trace_shock(initial_organ, floor_organ) + if(!length(to_shock)) + return 0 + + shock_damage /= length(to_shock) + shock_damage = round(shock_damage, 0.1) + + for(var/obj/item/organ/external/E in to_shock) + var/actual_shock_damage = max(1, round(shock_damage * base_siemens_coeff * get_siemens_coefficient_organ(E))) + if(actual_shock_damage) + apply_damage(shock_damage, BURN, E.organ_tag, used_weapon="Electrocution") + . += actual_shock_damage + + if(. > 10) + local_emp(initial_organ, 3) + +/mob/living/proc/trace_shock(var/obj/item/organ/external/init, var/obj/item/organ/external/floor) + + var/list/obj/item/organ/external/traced_organs = list(floor) + if(!init) + return + + if(!floor || init == floor) + return list(init) + + for(var/obj/item/organ/external/E in list(floor, init)) + while(E && E.parent_organ) + var/candidate = GET_EXTERNAL_ORGAN(src, E.parent_organ) + if(!candidate || (candidate in traced_organs)) + break // Organ parenthood is not guaranteed to be a tree + E = candidate + traced_organs += E + if(E == init) + return traced_organs + + return traced_organs + +/mob/living/proc/local_emp(var/list/limbs, var/severity = 2) + if(!islist(limbs)) + limbs = list(limbs) + + var/list/EMP = list() + for(var/obj/item/organ/external/limb in limbs) + EMP += limb + if(LAZYLEN(limb.internal_organs)) + EMP += limb.internal_organs + if(LAZYLEN(limb.implants)) + EMP += limb.implants + for(var/atom/E in EMP) + E.emp_act(severity) diff --git a/nebula.dme b/nebula.dme index 2e0ee0302e2..e370d019552 100644 --- a/nebula.dme +++ b/nebula.dme @@ -2801,6 +2801,7 @@ #include "code\modules\mob\living\living_defines.dm" #include "code\modules\mob\living\living_dreams.dm" #include "code\modules\mob\living\living_eating.dm" +#include "code\modules\mob\living\living_electrocution.dm" #include "code\modules\mob\living\living_give.dm" #include "code\modules\mob\living\living_grabs.dm" #include "code\modules\mob\living\living_hallucinations.dm" From 191b1a050541b872647dcec53d15991107948db7 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Fri, 14 Jun 2024 17:32:50 -0400 Subject: [PATCH 11/90] Rename item variables still named after /obj/item/weapon --- code/_onclick/click.dm | 30 +++++++-------- code/_onclick/cyborg.dm | 24 ++++++------ code/datums/extensions/holster/holster.dm | 14 +++---- code/game/machinery/cryopod.dm | 38 +++++++++---------- .../hydroponics/spreading/spreading.dm | 20 +++++----- code/modules/mob/inventory.dm | 14 +++---- .../modules/mob/living/silicon/robot/robot.dm | 6 +-- code/modules/mob/mob.dm | 6 +-- .../organs/external/_external_damage.dm | 24 ++++++------ code/modules/paperwork/paper_bundle.dm | 18 ++++----- code/modules/spells/targeted/equip/dyrnwyn.dm | 18 ++++----- .../artifacts/triggers/_trigger.dm | 2 +- .../artifacts/triggers/force.dm | 21 +++++----- 13 files changed, 118 insertions(+), 117 deletions(-) diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm index 18abdb09a3e..d8cd03cffa3 100644 --- a/code/_onclick/click.dm +++ b/code/_onclick/click.dm @@ -103,10 +103,10 @@ return 1 toggle_throw_mode(FALSE) - var/obj/item/W = get_active_held_item() + var/obj/item/holding = get_active_held_item() - if(W == A) // Handle attack_self - W.attack_self(src) + if(holding == A) // Handle attack_self + holding.attack_self(src) trigger_aiming(TARGET_CAN_CLICK) usr.update_inhand_overlays(FALSE) return 1 @@ -114,15 +114,15 @@ //Atoms on your person // A is your location but is not a turf; or is on you (backpack); or is on something on you (box in backpack); sdepth is needed here because contents depth does not equate inventory storage depth. var/sdepth = A.storage_depth(src) - var/check_dexterity_val = A.storage ? DEXTERITY_NONE : (istype(W) ? W.needs_attack_dexterity : DEXTERITY_WIELD_ITEM) - var/can_wield_item = W && (!check_dexterity_val || check_dexterity(check_dexterity_val)) + var/check_dexterity_val = A.storage ? DEXTERITY_NONE : (istype(holding) ? holding.needs_attack_dexterity : DEXTERITY_WIELD_ITEM) + var/can_wield_item = holding && (!check_dexterity_val || check_dexterity(check_dexterity_val)) if((!isturf(A) && A == loc) || (sdepth != -1 && sdepth <= 1)) if(can_wield_item) - var/resolved = W.resolve_attackby(A, src, params) - if(!resolved && A && W) - W.afterattack(A, src, 1, params) // 1 indicates adjacency + var/resolved = holding.resolve_attackby(A, src, params) + if(!resolved && A && holding) + holding.afterattack(A, src, 1, params) // 1 indicates adjacency setClickCooldown(DEFAULT_QUICK_COOLDOWN) - else if(!W) + else if(!holding) if(ismob(A)) // No instant mob attacking setClickCooldown(DEFAULT_QUICK_COOLDOWN) UnarmedAttack(A, TRUE) @@ -140,11 +140,11 @@ if(A.Adjacent(src)) // see adjacent.dm if(can_wield_item) // Return 1 in attackby() to prevent afterattack() effects (when safely moving items for example) - var/resolved = W.resolve_attackby(A,src, params) - if(!resolved && A && W) - W.afterattack(A, src, 1, params) // 1: clicking something Adjacent + var/resolved = holding.resolve_attackby(A,src, params) + if(!resolved && A && holding) + holding.afterattack(A, src, 1, params) // 1: clicking something Adjacent setClickCooldown(DEFAULT_QUICK_COOLDOWN) - else if(!W) + else if(!holding) if(ismob(A)) // No instant mob attacking setClickCooldown(DEFAULT_QUICK_COOLDOWN) UnarmedAttack(A, TRUE) @@ -152,8 +152,8 @@ trigger_aiming(TARGET_CAN_CLICK) return else // non-adjacent click - if(W) - W.afterattack(A, src, 0, params) // 0: not Adjacent + if(holding) + holding.afterattack(A, src, 0, params) // 0: not Adjacent else RangedAttack(A, params) diff --git a/code/_onclick/cyborg.dm b/code/_onclick/cyborg.dm index db8a10f38df..066fe948bfd 100644 --- a/code/_onclick/cyborg.dm +++ b/code/_onclick/cyborg.dm @@ -54,10 +54,10 @@ return */ - var/obj/item/W = get_active_held_item() + var/obj/item/holding = get_active_held_item() // Cyborgs have no range-checking unless there is item use - if(!W) + if(!holding) A.add_hiddenprint(src) A.attack_robot(src) return @@ -66,21 +66,21 @@ if( buckled ) return - if(W == A) + if(holding == A) - W.attack_self(src) + holding.attack_self(src) return - var/check_dexterity_val = A.storage ? DEXTERITY_NONE : (istype(W) ? W.needs_attack_dexterity : DEXTERITY_WIELD_ITEM) + var/check_dexterity_val = A.storage ? DEXTERITY_NONE : (istype(holding) ? holding.needs_attack_dexterity : DEXTERITY_WIELD_ITEM) var/can_wield_item = (!check_dexterity_val || check_dexterity(check_dexterity_val)) if(!can_wield_item) return if(A == loc || (A in loc) || (A in contents)) // No adjacency checks - var/resolved = W.resolve_attackby(A, src, params) - if(!resolved && A && W) - W.afterattack(A, src, 1, params) // 1 indicates adjacency + var/resolved = holding.resolve_attackby(A, src, params) + if(!resolved && A && holding) + holding.afterattack(A, src, 1, params) // 1 indicates adjacency setClickCooldown(DEFAULT_QUICK_COOLDOWN) return @@ -90,12 +90,12 @@ var/sdepth = A.storage_depth_turf() if(isturf(A) || isturf(A.loc) || (sdepth != -1 && sdepth <= 1)) if(A.Adjacent(src)) // see adjacent.dm - var/resolved = W.resolve_attackby(A, src, params) - if(!resolved && A && W) - W.afterattack(A, src, 1, params) // 1 indicates adjacency + var/resolved = holding.resolve_attackby(A, src, params) + if(!resolved && A && holding) + holding.afterattack(A, src, 1, params) // 1 indicates adjacency setClickCooldown(DEFAULT_QUICK_COOLDOWN) else - W.afterattack(A, src, 0, params) + holding.afterattack(A, src, 0, params) return //Middle click cycles through selected modules. diff --git a/code/datums/extensions/holster/holster.dm b/code/datums/extensions/holster/holster.dm index 3875959bf0d..f83a5ac67a9 100644 --- a/code/datums/extensions/holster/holster.dm +++ b/code/datums/extensions/holster/holster.dm @@ -122,18 +122,18 @@ if(usr.incapacitated()) return - var/datum/extension/holster/H = get_holsters()[holster_name] - if(!H) + var/datum/extension/holster/holster = get_holsters()[holster_name] + if(!holster) return - if(!H.holstered) - var/obj/item/W = usr.get_active_held_item() - if(!istype(W, /obj/item)) + if(!holster.holstered) + var/obj/item/holding = usr.get_active_held_item() + if(!istype(holding, /obj/item)) to_chat(usr, "You're not holding anything to holster.") return - H.holster(W, usr) + holster.holster(holding, usr) else - H.unholster(usr, 1) + holster.unholster(usr, 1) /atom/proc/get_holsters() . = list() diff --git a/code/game/machinery/cryopod.dm b/code/game/machinery/cryopod.dm index 10e57e69254..db13b5fdae9 100644 --- a/code/game/machinery/cryopod.dm +++ b/code/game/machinery/cryopod.dm @@ -329,37 +329,37 @@ // Also make sure there is a valid control computer /obj/machinery/cryopod/proc/despawn_occupant() //Drop all items into the pod. - for(var/obj/item/W in occupant.get_equipped_items(include_carried = TRUE)) - occupant.drop_from_inventory(W) - W.forceMove(src) + for(var/obj/item/equipped_item in occupant.get_equipped_items(include_carried = TRUE)) + occupant.drop_from_inventory(equipped_item) + equipped_item.forceMove(src) //Make sure we catch anything not handled by qdel() on the items. - for(var/obj/item/O in W.get_contained_external_atoms()) - O.forceMove(src) + for(var/obj/item/contained_item in equipped_item.get_contained_external_atoms()) + contained_item.forceMove(src) //Delete all items not on the preservation list. var/list/items = src.contents.Copy() items -= occupant // Don't delete the occupant items -= component_parts - for(var/obj/item/W in items) + for(var/obj/item/frozen_item in items) - if(!W.preserve_in_cryopod()) - qdel(W) + if(!frozen_item.preserve_in_cryopod()) + qdel(frozen_item) continue if(control_computer && control_computer.allow_items) - control_computer.frozen_items += W - W.forceMove(null) + control_computer.frozen_items += frozen_item + frozen_item.forceMove(null) else - W.forceMove(get_turf(src)) + frozen_item.forceMove(get_turf(src)) //Update any existing objectives involving this mob. - for(var/datum/objective/O in global.all_objectives) + for(var/datum/objective/objective in global.all_objectives) // We don't want revs to get objectives that aren't for heads of staff. Letting // them win or lose based on cryo is silly so we remove the objective. - if(O.target == occupant.mind) - if(O.owner && O.owner.current) - to_chat(O.owner.current, SPAN_DANGER("You get the feeling your target, [occupant.real_name], is no longer within your reach...")) - qdel(O) + if(objective.target == occupant.mind) + if(objective.owner?.current) + to_chat(objective.owner.current, SPAN_DANGER("You get the feeling your target, [occupant.real_name], is no longer within your reach...")) + qdel(objective) //Handle job slot/tater cleanup. if(occupant.mind) @@ -373,9 +373,9 @@ // Delete them from datacore. var/sanitized_name = occupant.real_name sanitized_name = sanitize(sanitized_name) - var/datum/computer_file/report/crew_record/R = get_crewmember_record(sanitized_name) - if(R) - qdel(R) + var/datum/computer_file/report/crew_record/record = get_crewmember_record(sanitized_name) + if(record) + qdel(record) icon_state = base_icon_state diff --git a/code/modules/hydroponics/spreading/spreading.dm b/code/modules/hydroponics/spreading/spreading.dm index 42078ffb24a..ad697eec832 100644 --- a/code/modules/hydroponics/spreading/spreading.dm +++ b/code/modules/hydroponics/spreading/spreading.dm @@ -275,17 +275,17 @@ expected_target_type = /obj/effect/vine /decl/interaction_handler/vine_chop/invoked(atom/target, mob/user, obj/item/prop) - var/obj/effect/vine/V = target - var/obj/item/W = user.get_active_held_item() - if(!istype(W) || !W.edge || W.w_class < ITEM_SIZE_NORMAL) + var/obj/effect/vine/vine = target + var/obj/item/holding = user.get_active_held_item() + if(!istype(holding) || !holding.edge || holding.w_class < ITEM_SIZE_NORMAL) to_chat(user, SPAN_WARNING("You need a larger or sharper object for this task!")) return - user.visible_message(SPAN_NOTICE("\The [user] starts chopping down \the [V].")) - playsound(get_turf(V), W.hitsound, 100, 1) - var/chop_time = (V.current_health/W.force) * 0.5 SECONDS + user.visible_message(SPAN_NOTICE("\The [user] starts chopping down \the [vine].")) + playsound(get_turf(vine), holding.hitsound, 100, 1) + var/chop_time = (vine.current_health/holding.force) * 0.5 SECONDS if(user.skill_check(SKILL_BOTANY, SKILL_ADEPT)) chop_time *= 0.5 - if(do_after(user, chop_time, V, TRUE)) - user.visible_message(SPAN_NOTICE("[user] chops down \the [V].")) - playsound(get_turf(V), W.hitsound, 100, 1) - V.die_off() + if(do_after(user, chop_time, vine, TRUE)) + user.visible_message(SPAN_NOTICE("[user] chops down \the [vine].")) + playsound(get_turf(vine), holding.hitsound, 100, 1) + vine.die_off() diff --git a/code/modules/mob/inventory.dm b/code/modules/mob/inventory.dm index fce971e2e1c..6d4d3cd4495 100644 --- a/code/modules/mob/inventory.dm +++ b/code/modules/mob/inventory.dm @@ -1,14 +1,14 @@ //This proc is called whenever someone clicks an inventory ui slot. /mob/proc/attack_ui(slot) - var/obj/item/W = get_active_held_item() - var/obj/item/E = get_equipped_item(slot) - if (istype(E)) - if(istype(W)) - E.attackby(W,src) + var/obj/item/holding = get_active_held_item() + var/obj/item/equipped = get_equipped_item(slot) + if (istype(equipped)) + if(istype(holding)) + equipped.attackby(holding, src) else - E.attack_hand(src) // We can assume it's physically accessible if it's on our person. + equipped.attack_hand(src) // We can assume it's physically accessible if it's on our person. else - equip_to_slot_if_possible(W, slot) + equip_to_slot_if_possible(holding, slot) //This is a SAFE proc. Use this instead of equip_to_slot()! //set del_on_fail to have it delete W if it fails to equip diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index 74919305f14..4490bd4986f 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -874,9 +874,9 @@ set category = "IC" set src = usr - var/obj/item/W = get_active_held_item() - if (W) - W.attack_self(src) + var/obj/item/holding = get_active_held_item() + if (holding) + holding.attack_self(src) return diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 22906b1ba85..8855efb4a53 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -469,9 +469,9 @@ set name = "Activate Held Object" set category = "Object" set src = usr - var/obj/item/W = get_active_held_item() - W?.attack_self(src) - return W + var/obj/item/holding = get_active_held_item() + holding?.attack_self(src) + return holding /mob/living/mode() if(!..()) diff --git a/code/modules/organs/external/_external_damage.dm b/code/modules/organs/external/_external_damage.dm index f6b3e05938b..3d08950e120 100644 --- a/code/modules/organs/external/_external_damage.dm +++ b/code/modules/organs/external/_external_damage.dm @@ -350,36 +350,38 @@ // and the brute damage dealt exceeds the tearoff threshold, the organ is torn off. /obj/item/organ/external/proc/attempt_dismemberment(brute, burn, sharp, edge, used_weapon, spillover, force_droplimb, override_droplimb) //Check edge eligibility - var/edge_eligible = 0 + var/edge_eligible = FALSE if(edge) + // used_weapon can be a string sometimes, for some reason + // todo: refactor to avoid? if(istype(used_weapon,/obj/item)) - var/obj/item/W = used_weapon - if(W.w_class >= w_class) - edge_eligible = 1 + var/obj/item/used_item = used_weapon + if(used_item.w_class >= w_class) + edge_eligible = TRUE else - edge_eligible = 1 + edge_eligible = TRUE else if(sharp) brute = 0.5 * brute if(force_droplimb) if(burn) - dismember(0, (override_droplimb || DISMEMBER_METHOD_BURN)) + dismember(FALSE, (override_droplimb || DISMEMBER_METHOD_BURN)) else if(brute) - dismember(0, (override_droplimb || (edge_eligible ? DISMEMBER_METHOD_EDGE : DISMEMBER_METHOD_BLUNT))) + dismember(FALSE, (override_droplimb || (edge_eligible ? DISMEMBER_METHOD_EDGE : DISMEMBER_METHOD_BLUNT))) return TRUE if(edge_eligible && brute >= max_damage / DROPLIMB_THRESHOLD_EDGE) if(prob(brute)) - dismember(0, (override_droplimb || DISMEMBER_METHOD_EDGE)) + dismember(FALSE, (override_droplimb || DISMEMBER_METHOD_EDGE)) return TRUE else if(burn >= max_damage / DROPLIMB_THRESHOLD_DESTROY) if(prob(burn/3)) - dismember(0, (override_droplimb || DISMEMBER_METHOD_BURN)) + dismember(FALSE, (override_droplimb || DISMEMBER_METHOD_BURN)) return TRUE else if(brute >= max_damage / DROPLIMB_THRESHOLD_DESTROY) if(prob(brute)) - dismember(0, (override_droplimb || DISMEMBER_METHOD_BLUNT)) + dismember(FALSE, (override_droplimb || DISMEMBER_METHOD_BLUNT)) return TRUE else if(brute >= max_damage / DROPLIMB_THRESHOLD_TEAROFF) if(prob(brute/3)) - dismember(0, (override_droplimb || DISMEMBER_METHOD_EDGE)) + dismember(FALSE, (override_droplimb || DISMEMBER_METHOD_EDGE)) return TRUE diff --git a/code/modules/paperwork/paper_bundle.dm b/code/modules/paperwork/paper_bundle.dm index fe1df67457b..4769dde6c61 100644 --- a/code/modules/paperwork/paper_bundle.dm +++ b/code/modules/paperwork/paper_bundle.dm @@ -195,7 +195,7 @@ /obj/item/paper_bundle/interact(mob/user) var/dat - var/obj/item/W = LAZYACCESS(pages, cur_page) + var/obj/item/cur_page_item = LAZYACCESS(pages, cur_page) //Header dat = "" dat += "
" @@ -230,19 +230,19 @@ dat += "

" //Contents - if(istype(W, /obj/item/paper)) - var/obj/item/paper/P = W - dat += "[P.name][P.info][P.stamp_text]" + if(istype(cur_page_item, /obj/item/paper)) + var/obj/item/paper/cur_paper = cur_page_item + dat += "[cur_paper.name][cur_paper.info][cur_paper.stamp_text]" show_browser(user, dat, "window=[name]") onclose(user, name) - else if(istype(W, /obj/item/photo)) - var/obj/item/photo/P = W + else if(istype(cur_page_item, /obj/item/photo)) + var/obj/item/photo/cur_photo = cur_page_item dat += {" - [P.name] -
Written on the back:
[P.scribble]" : null ] + [cur_photo.name] +
Written on the back:
[cur_photo.scribble]" : null ] "} - send_rsc(user, P.img, "tmp_photo.png") + send_rsc(user, cur_photo.img, "tmp_photo.png") show_browser(user, dat, "window=[name]") onclose(user, name) user.set_machine(src) diff --git a/code/modules/spells/targeted/equip/dyrnwyn.dm b/code/modules/spells/targeted/equip/dyrnwyn.dm index 98d9cc4fba4..93c9c443b9c 100644 --- a/code/modules/spells/targeted/equip/dyrnwyn.dm +++ b/code/modules/spells/targeted/equip/dyrnwyn.dm @@ -14,24 +14,24 @@ duration = 300 //30 seconds max_targets = 1 equipped_summons = list("active hand" = /obj/item/sword) - delete_old = 0 + delete_old = FALSE var/material = /decl/material/solid/metal/gold hud_state = "gen_immolate" /spell/targeted/equip_item/dyrnwyn/summon_item(var/new_type) - var/obj/item/W = new new_type(null,material) - W.SetName("\improper Dyrnwyn") - W.atom_damage_type = BURN - W.hitsound = 'sound/items/welder2.ogg' - LAZYSET(W.slowdown_per_slot, BP_L_HAND, 1) - LAZYSET(W.slowdown_per_slot, BP_R_HAND, 1) - return W + var/obj/item/sword = new new_type(null,material) + sword.SetName("\improper Dyrnwyn") + sword.atom_damage_type = BURN + sword.hitsound = 'sound/items/welder2.ogg' + LAZYSET(sword.slowdown_per_slot, BP_L_HAND, 1) + LAZYSET(sword.slowdown_per_slot, BP_R_HAND, 1) + return sword /spell/targeted/equip_item/dyrnwyn/empower_spell() if(!..()) - return 0 + return FALSE material = /decl/material/solid/metal/silver return "Dyrnwyn has been made pure: it is now made of silver." diff --git a/code/modules/xenoarcheaology/artifacts/triggers/_trigger.dm b/code/modules/xenoarcheaology/artifacts/triggers/_trigger.dm index 58558914b6f..f5193d211e2 100644 --- a/code/modules/xenoarcheaology/artifacts/triggers/_trigger.dm +++ b/code/modules/xenoarcheaology/artifacts/triggers/_trigger.dm @@ -4,7 +4,7 @@ //There procs should return TRUE if trigger is activated, FALSE if nothing happens -/datum/artifact_trigger/proc/on_hit(obj/O, mob/user) +/datum/artifact_trigger/proc/on_hit(obj/item/hit_with, mob/user) return FALSE /datum/artifact_trigger/proc/on_touch(mob/M) diff --git a/code/modules/xenoarcheaology/artifacts/triggers/force.dm b/code/modules/xenoarcheaology/artifacts/triggers/force.dm index 6184b118549..0e2daea434b 100644 --- a/code/modules/xenoarcheaology/artifacts/triggers/force.dm +++ b/code/modules/xenoarcheaology/artifacts/triggers/force.dm @@ -1,21 +1,20 @@ /datum/artifact_trigger/force name = "kinetic impact" -/datum/artifact_trigger/force/on_hit(obj/O, mob/user) +/datum/artifact_trigger/force/on_hit(obj/item/hit_with, mob/user) . = ..() - if(istype(O, /obj/item/projectile)) - var/obj/item/projectile/P = O - return (P.atom_damage_type == BRUTE) - else if(istype(O, /obj/item)) - var/obj/item/W = O - return (W.force >= 10) + if(istype(hit_with, /obj/item/projectile)) + var/obj/item/projectile/hit_projectile = hit_with + return (hit_projectile.atom_damage_type == BRUTE) + else if(istype(hit_with, /obj/item)) + return (hit_with.force >= 10) /datum/artifact_trigger/force/on_explosion(severity) return TRUE -/datum/artifact_trigger/force/on_bump(atom/movable/AM) +/datum/artifact_trigger/force/on_bump(atom/movable/bumper) . = ..() - if(isobj(AM)) - var/obj/O = AM - if(O.throwforce >= 10) + if(isobj(bumper)) + var/obj/bump_object = bumper + if(bump_object.throwforce >= 10) return TRUE \ No newline at end of file From 0853edf3d494d39a4b84ae3acef4f4274af7ac44 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Fri, 14 Jun 2024 17:34:18 -0400 Subject: [PATCH 12/90] Rename item variables named after /obj/item/weapon/device --- .../objects/items/devices/transfer_valve.dm | 2 +- .../structures/crates_lockers/crates.dm | 2 + code/modules/assembly/holder.dm | 40 +++++++++---------- 3 files changed, 23 insertions(+), 21 deletions(-) diff --git a/code/game/objects/items/devices/transfer_valve.dm b/code/game/objects/items/devices/transfer_valve.dm index 388a0ae509e..66d1cfed471 100644 --- a/code/game/objects/items/devices/transfer_valve.dm +++ b/code/game/objects/items/devices/transfer_valve.dm @@ -117,7 +117,7 @@ attached_device.attack_self(usr) return 1 // Returning 1 sends an update to attached UIs -/obj/item/transfer_valve/proc/process_activation(var/obj/item/D) +/obj/item/transfer_valve/proc/process_activation(var/obj/item/activator) if(toggle) toggle = 0 toggle_valve() diff --git a/code/game/objects/structures/crates_lockers/crates.dm b/code/game/objects/structures/crates_lockers/crates.dm index 96ba4a125f0..bb9feda3c86 100644 --- a/code/game/objects/structures/crates_lockers/crates.dm +++ b/code/game/objects/structures/crates_lockers/crates.dm @@ -16,6 +16,8 @@ if(rigged) visible_message("There are wires attached to the lid of [src]...") for(var/obj/item/assembly_holder/H in src) + // This proc expects an /obj/item, and usr is never that, but it must be non-null for the code to function. + // TODO: Rewrite or refactor either this code or the proc itself to avoid that. H.process_activation(usr) for(var/obj/item/assembly/A in src) A.activate() diff --git a/code/modules/assembly/holder.dm b/code/modules/assembly/holder.dm index decef2b6fd3..499d6e7c293 100644 --- a/code/modules/assembly/holder.dm +++ b/code/modules/assembly/holder.dm @@ -37,32 +37,32 @@ special_assembly = null return ..() -/obj/item/assembly_holder/proc/attach(var/obj/item/D, var/obj/item/D2, var/mob/user) +/obj/item/assembly_holder/proc/attach(var/obj/item/left, var/obj/item/right, var/mob/user) return -/obj/item/assembly_holder/proc/process_activation(var/obj/item/D) +/obj/item/assembly_holder/proc/process_activation(var/atom/activator) return /obj/item/assembly_holder/proc/detached() return -/obj/item/assembly_holder/attach(var/obj/item/assembly/D, var/obj/item/assembly/D2, var/mob/user) - if((!D)||(!D2)) +/obj/item/assembly_holder/attach(var/obj/item/assembly/left, var/obj/item/assembly/right, var/mob/user) + if((!left)||(!right)) return 0 - if((!istype(D))||(!istype(D2))) + if((!istype(left))||(!istype(right))) return 0 - if((D.secured)||(D2.secured)) + if((left.secured)||(right.secured)) return 0 if(user) - user.drop_from_inventory(D) - user.drop_from_inventory(D2) - D.holder = src - D2.holder = src - D.forceMove(src) - D2.forceMove(src) - a_left = D - a_right = D2 - SetName("[D.name]-[D2.name] assembly") + user.drop_from_inventory(left) + user.drop_from_inventory(right) + left.holder = src + right.holder = src + left.forceMove(src) + right.forceMove(src) + a_left = left + a_right = right + SetName("[left.name]-[right.name] assembly") update_icon() usr.put_in_hands(src) @@ -159,19 +159,19 @@ return -/obj/item/assembly_holder/process_activation(var/obj/D, var/normal = 1, var/special = 1) - if(!D) return 0 +/obj/item/assembly_holder/process_activation(var/atom/activator, var/normal = 1, var/special = 1) + if(!activator) return 0 if(!secured) visible_message("[html_icon(src)] *beep* *beep*", "*beep* *beep*") if((normal) && (a_right) && (a_left)) - if(a_right != D) + if(a_right != activator) a_right.pulsed(0) - if(a_left != D) + if(a_left != activator) a_left.pulsed(0) if(master) master.receive_signal() // if(special && special_assembly) -// if(!special_assembly == D) +// if(!special_assembly == activator) // special_assembly.dothings() return 1 From a53777f3e21aeb10342b3b31840576dabc91ce28 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Thu, 13 Jun 2024 12:40:15 +1000 Subject: [PATCH 13/90] Fixes biogenerators not showing bottle contents. --- code/game/machinery/biogenerator.dm | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/code/game/machinery/biogenerator.dm b/code/game/machinery/biogenerator.dm index fccbff4d1ed..26c0956bd3a 100644 --- a/code/game/machinery/biogenerator.dm +++ b/code/game/machinery/biogenerator.dm @@ -129,7 +129,7 @@ user.set_machine(src) var/list/data = list() data["state"] = state - var/name + var/product_name var/cost var/type_name var/path @@ -142,12 +142,11 @@ var/list/listed_products = list() for(var/c_product =1 to current_content.len) path = current_content[c_product] - var/atom/A = path - name = initial(A.name) + product_name = atom_info_repository.get_name_for(path) cost = current_content[path] listed_products.Add(list(list( "product_index" = c_product, - "name" = name, + "name" = product_name, "cost" = cost))) listed_types.Add(list(list( "type_name" = type_name, From 6fa0a5001954ecd06201358cd67a5063baadddae Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Thu, 13 Jun 2024 12:57:51 +1000 Subject: [PATCH 14/90] Fixes mining on Ministation causing airflow in space. --- code/game/turfs/exterior/exterior_barren.dm | 3 +++ maps/ministation/ministation_objects.dm | 1 + 2 files changed, 4 insertions(+) diff --git a/code/game/turfs/exterior/exterior_barren.dm b/code/game/turfs/exterior/exterior_barren.dm index ed28486c16f..2c5bf65a930 100644 --- a/code/game/turfs/exterior/exterior_barren.dm +++ b/code/game/turfs/exterior/exterior_barren.dm @@ -4,6 +4,9 @@ icon_edge_layer = EXT_EDGE_BARREN is_fundament_turf = TRUE +/turf/exterior/barren/airless + initial_gas = null + /turf/exterior/barren/Initialize() if(prob(20)) LAZYADD(decals, image('icons/turf/flooring/decals.dmi', "asteroid[rand(0,9)]")) diff --git a/maps/ministation/ministation_objects.dm b/maps/ministation/ministation_objects.dm index 3edfab78909..9f474ea0ff5 100644 --- a/maps/ministation/ministation_objects.dm +++ b/maps/ministation/ministation_objects.dm @@ -1,5 +1,6 @@ /turf/exterior/wall/random/ministation initial_gas = null + floor_type = /turf/exterior/barren/airless /turf/exterior/wall/random/ministation/get_weighted_mineral_list() if(prob(80)) From 56db6a9d1a64d55ddae9726335fa941330c9d6d4 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Fri, 14 Jun 2024 18:11:53 -0400 Subject: [PATCH 15/90] Rename variables named after /obj/item/reagent_container --- code/_onclick/item_attack.dm | 2 +- code/modules/power/port_gen.dm | 25 ++++++++-------- code/modules/reagents/dispenser/dispenser2.dm | 30 +++++++++---------- 3 files changed, 29 insertions(+), 28 deletions(-) diff --git a/code/_onclick/item_attack.dm b/code/_onclick/item_attack.dm index 60897c52f63..d95f4cc1689 100644 --- a/code/_onclick/item_attack.dm +++ b/code/_onclick/item_attack.dm @@ -5,7 +5,7 @@ These are the default click code call sequences used when clicking on stuff with Atoms: mob/ClickOn() calls the item's resolve_attackby() proc. -item/resolve_attackby() calls the target atom's attackby() proc. +item/resolve_attackby() calls the target atom's attackby() proc. If it (or attackby) returns true, afterattack is skipped. Mobs: diff --git a/code/modules/power/port_gen.dm b/code/modules/power/port_gen.dm index 1f0d9e4c72d..1d776af3f8a 100644 --- a/code/modules/power/port_gen.dm +++ b/code/modules/power/port_gen.dm @@ -481,18 +481,19 @@ if(power_output > max_safe_output) icon_state = "potatodanger" -/obj/machinery/port_gen/pacman/super/potato/attackby(var/obj/item/O, var/mob/user) - if(istype(O, /obj/item/chems/)) - var/obj/item/chems/R = O - if(R.standard_pour_into(src,user)) - if(reagents.has_reagent(/decl/material/liquid/ethanol/vodka)) - audible_message("[src] blips happily") - playsound(get_turf(src),'sound/machines/synth_yes.ogg', 50, 0) - else - audible_message("[src] blips in disappointment") - playsound(get_turf(src), 'sound/machines/synth_no.ogg', 50, 0) - return - ..() +/obj/machinery/port_gen/pacman/super/potato/attackby(var/obj/item/hit_with, var/mob/user) + if(istype(hit_with, /obj/item/chems)) + var/obj/item/chems/chem_container = hit_with + var/old_vodka_amount = REAGENT_VOLUME(reagents, /decl/material/liquid/ethanol/vodka) + if(chem_container.standard_pour_into(src,user)) + if(REAGENT_VOLUME(reagents, /decl/material/liquid/ethanol/vodka) > old_vodka_amount) // yay, booze! + audible_message(SPAN_NOTICE("[src] blips happily!")) + playsound(get_turf(src),'sound/machines/synth_yes.ogg', 50, FALSE) + else // you didn't add any more than we already had + audible_message(SPAN_WARNING("[src] blips in disappointment.")) + playsound(get_turf(src), 'sound/machines/synth_no.ogg', 50, FALSE) + return TRUE + return ..() /obj/machinery/port_gen/pacman/mrs name = "portable fusion generator" diff --git a/code/modules/reagents/dispenser/dispenser2.dm b/code/modules/reagents/dispenser/dispenser2.dm index 1a5287a0035..619b8e964bf 100644 --- a/code/modules/reagents/dispenser/dispenser2.dm +++ b/code/modules/reagents/dispenser/dispenser2.dm @@ -86,38 +86,38 @@ cartridges -= label SSnano.update_uis(src) -/obj/machinery/chemical_dispenser/attackby(obj/item/W, mob/user) - if(istype(W, /obj/item/chems/chem_disp_cartridge)) - add_cartridge(W, user) +/obj/machinery/chemical_dispenser/attackby(obj/item/hit_with, mob/user) + if(istype(hit_with, /obj/item/chems/chem_disp_cartridge)) + add_cartridge(hit_with, user) return TRUE - if(IS_CROWBAR(W) && !panel_open && length(cartridges)) + if(IS_CROWBAR(hit_with) && !panel_open && length(cartridges)) var/label = input(user, "Which cartridge would you like to remove?", "Chemical Dispenser") as null|anything in cartridges if(!label) return var/obj/item/chems/chem_disp_cartridge/C = remove_cartridge(label) if(C) - to_chat(user, "You remove \the [C] from \the [src].") + to_chat(user, SPAN_NOTICE("You remove \the [C] from \the [src].")) C.dropInto(loc) return TRUE - if(is_type_in_list(W, acceptable_containers)) + if(is_type_in_list(hit_with, acceptable_containers)) if(container) - to_chat(user, "There is already \a [container] on \the [src]!") + to_chat(user, SPAN_WARNING("There is already \a [container] on \the [src]!")) return TRUE - var/obj/item/chems/RC = W + var/obj/item/chems/new_container = hit_with - if(!accept_drinking && (istype(RC,/obj/item/chems/condiment) || istype(RC,/obj/item/chems/drinks))) - to_chat(user, "This machine only accepts beakers!") + if(!accept_drinking && (istype(new_container,/obj/item/chems/condiment) || istype(new_container,/obj/item/chems/drinks))) + to_chat(user, SPAN_WARNING("This machine only accepts beakers!")) return TRUE - if(!ATOM_IS_OPEN_CONTAINER(RC)) - to_chat(user, "You don't see how \the [src] could dispense reagents into \the [RC].") + if(!ATOM_IS_OPEN_CONTAINER(new_container)) + to_chat(user, SPAN_WARNING("You don't see how \the [src] could dispense reagents into \the [new_container].")) return TRUE - if(!user.try_unequip(RC, src)) + if(!user.try_unequip(new_container, src)) return TRUE - set_container(RC) - to_chat(user, "You set \the [RC] on \the [src].") + set_container(new_container) + to_chat(user, SPAN_NOTICE("You set \the [new_container] on \the [src].")) return TRUE return ..() From 5c098c72628345b94fd959a157618e91c9410d1b Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Fri, 14 Jun 2024 18:43:50 -0400 Subject: [PATCH 16/90] Rename variables in sink attackby --- code/game/objects/structures/watercloset.dm | 85 ++++++++++----------- 1 file changed, 41 insertions(+), 44 deletions(-) diff --git a/code/game/objects/structures/watercloset.dm b/code/game/objects/structures/watercloset.dm index 74da58c9e6c..6c9c20c4bcf 100644 --- a/code/game/objects/structures/watercloset.dm +++ b/code/game/objects/structures/watercloset.dm @@ -388,72 +388,69 @@ var/global/list/hygiene_props = list() SPAN_NOTICE("You wash your hands using \the [src].")) return TRUE -/obj/structure/hygiene/sink/attackby(obj/item/O, var/mob/user) - if(isplunger(O) && clogged > 0) +/obj/structure/hygiene/sink/attackby(obj/item/hit_with, var/mob/user) + if(isplunger(hit_with) && clogged > 0) return ..() if(busy) to_chat(user, SPAN_WARNING("Someone's already washing here.")) return - var/obj/item/chems/RG = O - if (istype(RG) && ATOM_IS_OPEN_CONTAINER(RG) && RG.reagents) + var/obj/item/chems/chem_container = hit_with + if (istype(chem_container) && ATOM_IS_OPEN_CONTAINER(chem_container) && chem_container.reagents) user.visible_message( - SPAN_NOTICE("\The [user] fills \the [RG] using \the [src]."), - SPAN_NOTICE("You fill \the [RG] using \the [src].")) + SPAN_NOTICE("\The [user] fills \the [chem_container] using \the [src]."), + SPAN_NOTICE("You fill \the [chem_container] using \the [src].")) playsound(loc, 'sound/effects/sink.ogg', 75, 1) - RG.add_to_reagents(/decl/material/liquid/water, min(RG.volume - RG.reagents.total_volume, RG.amount_per_transfer_from_this)) - return 1 - - else if (istype(O, /obj/item/baton)) - var/obj/item/baton/B = O - var/obj/item/cell/cell = B.get_cell() - if(cell) - if(cell.charge > 0 && B.status == 1) - flick("baton_active", src) - if(isliving(user)) - var/mob/living/M = user - SET_STATUS_MAX(M, STAT_STUN, 10) - SET_STATUS_MAX(M, STAT_STUTTER, 10) - SET_STATUS_MAX(M, STAT_WEAK, 10) - if(isrobot(user)) - var/mob/living/silicon/robot/R = user - R.cell.charge -= 20 - else - B.deductcharge(B.hitcost) - var/decl/pronouns/G = user.get_pronouns() - user.visible_message(SPAN_DANGER("\The [user] was stunned by [G.his] wet [O]!")) - return 1 - else if(istype(O, /obj/item/mop)) - if(REAGENTS_FREE_SPACE(O.reagents) >= 5) - O.add_to_reagents(/decl/material/liquid/water, 5) - to_chat(user, SPAN_NOTICE("You wet \the [O] in \the [src].")) + chem_container.add_to_reagents(/decl/material/liquid/water, min(REAGENTS_FREE_SPACE(chem_container.reagents), chem_container.amount_per_transfer_from_this)) + return TRUE + + else if (istype(hit_with, /obj/item/baton)) + var/obj/item/baton/baton = hit_with + var/obj/item/cell/cell = baton.get_cell() + if(cell?.check_charge(0) && baton.status) + if(isliving(user)) + var/mob/living/living_victim = user + SET_STATUS_MAX(living_victim, STAT_STUN, 10) + SET_STATUS_MAX(living_victim, STAT_STUTTER, 10) + SET_STATUS_MAX(living_victim, STAT_WEAK, 10) + // robot users used to be handled separately, but deductcharge handles that for us + baton.deductcharge(baton.hitcost) + var/decl/pronouns/user_pronouns = user.get_pronouns() + user.visible_message(SPAN_DANGER("\The [user] was stunned by [user_pronouns.his] wet [hit_with]!")) + return TRUE + else if(istype(hit_with, /obj/item/mop)) + if(REAGENTS_FREE_SPACE(hit_with.reagents) >= 5) + hit_with.add_to_reagents(/decl/material/liquid/water, 5) + to_chat(user, SPAN_NOTICE("You wet \the [hit_with] in \the [src].")) playsound(loc, 'sound/effects/slosh.ogg', 25, 1) else - to_chat(user, SPAN_WARNING("\The [O] is saturated.")) + to_chat(user, SPAN_WARNING("\The [hit_with] is saturated.")) return var/turf/location = user.loc - if(!isturf(location)) return + if(!isturf(location)) + return - var/obj/item/I = O - if(!I || !istype(I,/obj/item)) return + if(!istype(hit_with)) + return - to_chat(usr, SPAN_NOTICE("You start washing \the [I].")) + to_chat(usr, SPAN_NOTICE("You start washing \the [hit_with].")) playsound(loc, 'sound/effects/sink_long.ogg', 75, 1) - busy = 1 + busy = TRUE if(!do_after(user, 40, src)) - busy = 0 + busy = FALSE return TRUE - busy = 0 + busy = FALSE - if(istype(O, /obj/item/chems/spray/extinguisher)) return TRUE // We're washing, not filling. + if(istype(hit_with, /obj/item/chems/spray/extinguisher)) + return TRUE // We're washing, not filling. - O.clean() + hit_with.clean() user.visible_message( \ - SPAN_NOTICE("\The [user] washes \a [I] using \the [src]."), - SPAN_NOTICE("You wash \a [I] using \the [src].")) + SPAN_NOTICE("\The [user] washes \a [hit_with] using \the [src]."), + SPAN_NOTICE("You wash \a [hit_with] using \the [src].")) /obj/structure/hygiene/sink/kitchen From cf47f9d2af2b92e8bb701ba0aaada981e506bb8e Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Fri, 14 Jun 2024 18:44:28 -0400 Subject: [PATCH 17/90] Fix stunbaton active overlay --- icons/obj/items/weapon/stunbaton.dmi | Bin 2245 -> 2011 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/icons/obj/items/weapon/stunbaton.dmi b/icons/obj/items/weapon/stunbaton.dmi index fa1de1aaa43697770ac8c50a82abea0538e31d68..da54a77b42f0e134985adeb474879839b7aa18b5 100644 GIT binary patch delta 1798 zcmb7EdsLDM7XOq{6jO3g!F*tkv6rbygSIN7qkA+MP3>W%NDoBQO_~`K75&K9lv-4} zaoili?4jXnw2kp?G3BO}G1kdVQK$$>NEiha1-3J1{+KhfbI$Jl?|1J#_ndovj|YyE z@QVu2dMYL|d>^AuCH_9s?VvkU-M**%_4<+%P0+-Igv3Wko&jcD4689hST2o z1@J@B=Sf|T#gRsBHDd9#K}+hel}sEh)Gf#H2iHitn+?L9MYu-O?CRVX6Z{ANxnTN_ZZ2YMZE|We6D@62`;f#tiHU2GleEp9XR>`wRWj9IMN!`(!%ja&nSWe<8fx;kjE1AV(>zDtbuX2HKtM8cXb9@Heq8Gp z!s@EnJa19acD03zU6{B%2I9=S--mH^^Obv^4jdXAdQ{mI$37*{;BrC&Z8%Vx%CF&0!V0M=kHjWEokw%w;_WFsvs3rL}mPic%W<#p<{1` zwG-c)bLAOB0T?aHZmW?Ah%ar&4Z_{y=(r`K9_l_fCXWXD z?2z~U*FgDv{)AZE+QFt?R+w0!Ux9dV&S;y0D3?m+(R_yfgNJ7b!=Hj4+k}9xPrSO3 z^ssHdG>93v(aWJBllTd}-o$vicxyZV_)@*q&=Z?<6Gc{wslIQCGWU2ihNXPk8^*P} zS=O%6x~k{UvVLe?`movYG&oeb2qd%~&=i=1kL;KFp{0LOHx+5`A%++or^%1~839=qG98|CT(+(m}85Z*9k*g;12~keVLj zj^Xd;oHtNw*32jr&EwL;1vy}r-%o~7o2u9bD%N#in2ip08!$9dI?Qh$B-v=ORl`iX znQ;?!s;yqCe$_8J1@;IqTfdGeZ=Y0MdvPMqaX=?dR|d5{W?|=7d@Z^6p+JTd@*Mpv zSaWrUTrMY?+5UWBD${FfL$ou#$;~Jv@%&(w5pS}hR|J*%_Ju16 zOMqAA5+H{B#jn21oU%^xhzsua7>e4$@?2I3xKOHH!xajfxx9>g8shF8Ww98EDu-}V zyFgNn<(7Rg9xZmpEX0*YDAxbDk;=6BRgGIe$`FA4{g;ise*zkTSl!>YU+t6A@|hzz z)A!9ri8^+TDvB0g+mCm$tVOBo&KRX zs;4>WRSs&$JymbK!urU8)Seb1JI-}D44VrMz4fXIkC#@~dU89@gINtGR^^>T^mB?g zdZSq&OO#*gvF{QH4nBI7{?HlgTd&Y)@>Y*^uRshzHdvZNng4eNNConpDducDH}Wu% z&Gvhf-4ezd8$DxBx`6BjjiOI|_T{^V|DRs_y(KqVeAAEQ{?MofdZsJmrV`SD!r2F# zPj2;L;k2(2xlS(lnS9MTH<+S|N6zbPn!-?A^EI|{Z6I)^8JX&M_wL;~91bai@l@3K zQTnov6aFP_!_C8jlNnh7|8mENu8qDF0NpFC-jH$>jjvt(SyjMHq@v4G7qP@MA400O ziE%4iR Cr%ST{ delta 2034 zcmaKqdpy$%AIFT~Ne%8Q3?xM`aF8ue2G;=C@`+?jGM_Tj*kmB#&vW`{9S;j#F%WCDe{uUwNQJ?0$22FdLcQdbt0w z8Zz|x&-C_EafJI(KWygvpB?6{B*Vqf}(t1LLaBiYJ}N!``J#goprO)zQ{CinPS%7fj52 zY`DVK9B49;txU=N$owIEL`o(N;;TMDW_(eKrn@5FrJRN&qL*fFu8@soOKXCCLFsL^ zdo4QMHwtdb{VxxCIH|-wah8_Ap}0>YLhCOU%gp14s=l`BgFIfSv~jGx7ByQfMTyxp zD7rka1Y<=8WNQ&q!kkW`a?Q<-IMr31!VSYMQD%%}p6|XB8TWb*OjZ#$f-H${1L^)vPb8l{l&7)jK9EEeR*8kKQ|yLP3rbZI<F-JZqDIH!0k~j{zk`q9s2Xd*cFL2eFH2)f&G&K7MQb{!|;Ohh`uta|X*7szib+Lb4NE z8$l+s2W&?WOkla_LSS$*uq}XHPYY7lZ9^axuj7T&9O_=Iz`9qfaZ!m8o-5!unfIg% zcW*VDGnlLo5Ez#l;BUbBDTnuH)d|~tcffK+4zV>1I*AQY=<5qIdOaj9P(C}l=L2YA zODqRG1m=KuqM3cj7l=#w%i#syuS#GV z>R!o1`i@L{y|ZYh-lhE7#8K>cIzJ%&gD>0=;gZd7m(i`n;ejLtvdg+6LFeml9+52m zJ@)-$)%`Q^6Jl6WrLBQ8|GQPc^y!A9Xvj}t^Yg2#SGJFt z4bzqdg%?uQaeP`V+LSwf?mfnq+68_{nNz-r>y?}KO+W(CBR+}{ne$@BN$#$<+Jy}X z1GOupP_{m)8nYjrXM)b2_(*f+M%5?>1_pqHq$C%KDJA^*Cu;&Rd1G316A22*J5v`j zqvyVeaj@>RzH(A$Ar4*E@d{$3NGA6(F%GZKylu|0%N$u@GD5};i(+)pdWVZ~xMRnT z3BtIn&S`FK&2g~qVSzz+|(g^D+SD5K7;!LkOQ-rSuy60ue z(%paY^QSp+`k%&vH5s#iC`o*+xoC9R{-s|476l8NeA|>#E2SWH&tLJw@`Z1k(jujj z0~vdke!)zxT@R<};cs|j)qqsB^>CwHY&l(BTVsni-0Zv?NXtn3-`anrUF)L~B1$5S zY6w(-CIVi3kkN@JTr!-P?A-RTXWdqpO7=6rJjL8ol~$1iM71Aw;BA9-)G2*M#koH* z>LANkmi<-Bw|~By-E*=~DwX;SyY5)szi{enPPc*pN5T4DS{0IZ!2^-|R%t3O-fcA$ ze9jNn<|(3Ysa9XNqZ4-{Kn-JqCzMe-R^Cg2>S}*U3j7c1|4Ct0%7TKznJ+!QxHi%2 zIReZ0@*`N|Gjot9-c~pE*DYnZzzzEz`_lf@FYwwsav!zbHkF8lt?J*Ws?Uc&nc5LU zje%0>Al@8wAoAi+n&PAtD4Yyr<_@uwN}hJQMu22#^gCM`=mj}<#&ws~Xo8j6;cmw1 z`J;^*7`@8eCpi^9wK;6qfkBtFZ^bC9-+#hEiulcVc2iNRf4-NcYSiH SS#DgjdY Date: Sat, 15 Jun 2024 16:45:35 +1000 Subject: [PATCH 18/90] Standardizes take_damage() parameters. --- code/game/atoms_damage.dm | 2 +- code/game/gamemodes/cult/runes.dm | 2 +- code/game/machinery/_machines_base/machinery_damage.dm | 2 +- .../game/machinery/_machines_base/stock_parts/_stock_parts.dm | 2 +- code/game/machinery/doors/_door.dm | 2 +- code/game/machinery/doors/airlock.dm | 2 +- code/game/machinery/doors/windowdoor.dm | 2 +- code/game/machinery/portable_turret.dm | 2 +- code/game/objects/items/_item_damage.dm | 2 +- code/game/objects/items/weapons/storage/wall_mirror.dm | 2 +- code/game/objects/structures/__structure.dm | 2 +- code/game/objects/structures/defensive_barrier.dm | 2 +- code/game/objects/structures/flora/tree.dm | 2 +- code/game/objects/structures/window.dm | 4 ++-- code/game/turfs/walls/_wall.dm | 2 +- code/modules/blob/blob.dm | 2 +- code/modules/mob/living/living_defense.dm | 4 ++-- code/modules/mob/living/simple_animal/simple_animal.dm | 2 +- code/modules/mob/mob_damage.dm | 2 +- code/modules/shield_generators/shield.dm | 2 +- 20 files changed, 22 insertions(+), 22 deletions(-) diff --git a/code/game/atoms_damage.dm b/code/game/atoms_damage.dm index 97a18d76691..e73c65f800f 100644 --- a/code/game/atoms_damage.dm +++ b/code/game/atoms_damage.dm @@ -1,2 +1,2 @@ -/atom/proc/take_damage(damage, damage_type = BRUTE, damage_flags, inflicter, armor_pen = 0) +/atom/proc/take_damage(damage, damage_type = BRUTE, damage_flags, inflicter, armor_pen = 0, silent, do_update_health) return diff --git a/code/game/gamemodes/cult/runes.dm b/code/game/gamemodes/cult/runes.dm index 1003b121fc5..8c522911d75 100644 --- a/code/game/gamemodes/cult/runes.dm +++ b/code/game/gamemodes/cult/runes.dm @@ -322,7 +322,7 @@ take_damage(Proj.damage, Proj.atom_damage_type) ..() -/obj/effect/cultwall/take_damage(damage, damage_type = BRUTE, damage_flags, inflicter, armor_pen = 0) +/obj/effect/cultwall/take_damage(damage, damage_type = BRUTE, damage_flags, inflicter, armor_pen = 0, silent, do_update_health) current_health -= damage if(current_health <= 0) visible_message("\The [src] dissipates.") diff --git a/code/game/machinery/_machines_base/machinery_damage.dm b/code/game/machinery/_machines_base/machinery_damage.dm index 1a0b0781910..96b81329d5a 100644 --- a/code/game/machinery/_machines_base/machinery_damage.dm +++ b/code/game/machinery/_machines_base/machinery_damage.dm @@ -1,4 +1,4 @@ -/obj/machinery/take_damage(damage, damage_type = BRUTE, damage_flags, inflicter, armor_pen = 0, silent = FALSE) +/obj/machinery/take_damage(damage, damage_type = BRUTE, damage_flags, inflicter, armor_pen = 0, silent, do_update_health) //Let's not bother initializing all the components for nothing if(damage <= 0) return diff --git a/code/game/machinery/_machines_base/stock_parts/_stock_parts.dm b/code/game/machinery/_machines_base/stock_parts/_stock_parts.dm index d34d7404dd8..f4aab2938f7 100644 --- a/code/game/machinery/_machines_base/stock_parts/_stock_parts.dm +++ b/code/game/machinery/_machines_base/stock_parts/_stock_parts.dm @@ -63,7 +63,7 @@ // RefreshParts has been called, likely meaning other componenets were added/removed. /obj/item/stock_parts/proc/on_refresh(var/obj/machinery/machine) -/obj/item/stock_parts/take_damage(damage, damage_type = BRUTE, damage_flags, inflicter, armor_pen = 0) +/obj/item/stock_parts/take_damage(damage, damage_type = BRUTE, damage_flags, inflicter, armor_pen = 0, silent, do_update_health) if(damage_type in ignore_damage_types) return . = ..() diff --git a/code/game/machinery/doors/_door.dm b/code/game/machinery/doors/_door.dm index 631a2353acb..53f580f385b 100644 --- a/code/game/machinery/doors/_door.dm +++ b/code/game/machinery/doors/_door.dm @@ -342,7 +342,7 @@ return TRUE return FALSE -/obj/machinery/door/take_damage(damage, damage_type = BRUTE, damage_flags, inflicter, armor_pen = 0, silent = FALSE) +/obj/machinery/door/take_damage(damage, damage_type = BRUTE, damage_flags, inflicter, armor_pen = 0, silent, do_update_health) if(!current_health) ..(damage, damage_type) update_icon() diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index 1d39a839320..8aed6105df0 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -1073,7 +1073,7 @@ About the new airlock wires panel: return // Braces can act as an extra layer of armor - they will take damage first. -/obj/machinery/door/airlock/take_damage(damage, damage_type = BRUTE, damage_flags, inflicter, armor_pen = 0, silent = FALSE) +/obj/machinery/door/airlock/take_damage(damage, damage_type = BRUTE, damage_flags, inflicter, armor_pen = 0, silent, do_update_health) if(brace) brace.take_damage(damage) else diff --git a/code/game/machinery/doors/windowdoor.dm b/code/game/machinery/doors/windowdoor.dm index ce34e17cfa2..63d9e92bfef 100644 --- a/code/game/machinery/doors/windowdoor.dm +++ b/code/game/machinery/doors/windowdoor.dm @@ -132,7 +132,7 @@ return TRUE -/obj/machinery/door/window/take_damage(damage, damage_type = BRUTE, damage_flags, inflicter, armor_pen = 0, silent = FALSE) +/obj/machinery/door/window/take_damage(damage, damage_type = BRUTE, damage_flags, inflicter, armor_pen = 0, silent, do_update_health) current_health = max(0, current_health - damage) if (current_health <= 0) shatter() diff --git a/code/game/machinery/portable_turret.dm b/code/game/machinery/portable_turret.dm index 166d3dff957..6bf44daf084 100644 --- a/code/game/machinery/portable_turret.dm +++ b/code/game/machinery/portable_turret.dm @@ -315,7 +315,7 @@ var/global/list/turret_icons enabled = 1 //turns it back on. The cover popUp() popDown() are automatically called in process(), no need to define it here return 1 -/obj/machinery/porta_turret/take_damage(damage, damage_type = BRUTE, damage_flags, inflicter, armor_pen = 0, silent = FALSE) +/obj/machinery/porta_turret/take_damage(damage, damage_type = BRUTE, damage_flags, inflicter, armor_pen = 0, silent, do_update_health) if(!raised && !raising) damage = damage / 8 if(damage < 5) diff --git a/code/game/objects/items/_item_damage.dm b/code/game/objects/items/_item_damage.dm index 33cd36a1fba..7da51db9ef1 100644 --- a/code/game/objects/items/_item_damage.dm +++ b/code/game/objects/items/_item_damage.dm @@ -1,5 +1,5 @@ /**Basic damage handling for items. Returns the amount of damage taken after armor if the item was damaged.*/ -/obj/item/take_damage(damage, damage_type = BRUTE, damage_flags, inflicter, armor_pen = 0) +/obj/item/take_damage(damage, damage_type = BRUTE, damage_flags, inflicter, armor_pen = 0, silent, do_update_health) if(!can_take_damage()) // This object does not take damage. return 0 //Must return a number if(damage < 0) diff --git a/code/game/objects/items/weapons/storage/wall_mirror.dm b/code/game/objects/items/weapons/storage/wall_mirror.dm index 36215e0a7ff..f86be796183 100644 --- a/code/game/objects/items/weapons/storage/wall_mirror.dm +++ b/code/game/objects/items/weapons/storage/wall_mirror.dm @@ -38,7 +38,7 @@ . = ..() flick("mirror_open",src) -/obj/structure/mirror/take_damage(damage, damage_type = BRUTE, damage_flags, inflicter, armor_pen = 0) +/obj/structure/mirror/take_damage(damage, damage_type = BRUTE, damage_flags, inflicter, armor_pen = 0, silent, do_update_health) if(prob(damage)) visible_message(SPAN_WARNING("[src] shatters!")) shatter() diff --git a/code/game/objects/structures/__structure.dm b/code/game/objects/structures/__structure.dm index fc27cf6d4f0..5d5d9fb88ce 100644 --- a/code/game/objects/structures/__structure.dm +++ b/code/game/objects/structures/__structure.dm @@ -121,7 +121,7 @@ set waitfor = FALSE return FALSE -/obj/structure/take_damage(damage, damage_type = BRUTE, damage_flags, inflicter, armor_pen = 0) +/obj/structure/take_damage(damage, damage_type = BRUTE, damage_flags, inflicter, armor_pen = 0, silent, do_update_health) if(current_health == -1) // This object does not take damage. return diff --git a/code/game/objects/structures/defensive_barrier.dm b/code/game/objects/structures/defensive_barrier.dm index 9aae3a81815..21e95d7fd56 100644 --- a/code/game/objects/structures/defensive_barrier.dm +++ b/code/game/objects/structures/defensive_barrier.dm @@ -141,7 +141,7 @@ . = ..() -/obj/structure/take_damage(damage, damage_type = BRUTE, damage_flags, inflicter, armor_pen = 0) +/obj/structure/take_damage(damage, damage_type = BRUTE, damage_flags, inflicter, armor_pen = 0, silent, do_update_health) if(damage) playsound(src.loc, 'sound/effects/bang.ogg', 75, 1) damage = round(damage * 0.5) diff --git a/code/game/objects/structures/flora/tree.dm b/code/game/objects/structures/flora/tree.dm index 6ea1444b028..fd1d4960d61 100644 --- a/code/game/objects/structures/flora/tree.dm +++ b/code/game/objects/structures/flora/tree.dm @@ -52,7 +52,7 @@ for(var/turf/T in turfs_to_update) T.update_ambient_light_from_z_or_area() -/obj/structure/flora/tree/take_damage(damage, damage_type = BRUTE, damage_flags, inflicter, armor_pen = 0) +/obj/structure/flora/tree/take_damage(damage, damage_type = BRUTE, damage_flags, inflicter, armor_pen = 0, silent, do_update_health) . = ..() if(!QDELETED(src) && damage >= 5) shake() diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index 419cd5e058e..6c8d05acbb8 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -77,7 +77,7 @@ SHOULD_CALL_PARENT(FALSE) . = shatter() -/obj/structure/window/take_damage(damage, damage_type = BRUTE, damage_flags, inflicter, armor_pen = 0) +/obj/structure/window/take_damage(damage, damage_type = BRUTE, damage_flags, inflicter, armor_pen = 0, silent, do_update_health) . = ..() if(. && damage_type == BRUTE) playsound(loc, "glasscrack", 100, 1) @@ -569,7 +569,7 @@ SHOULD_CALL_PARENT(FALSE) return FALSE -/obj/structure/window/reinforced/crescent/take_damage(damage, damage_type = BRUTE, damage_flags, inflicter, armor_pen = 0) +/obj/structure/window/reinforced/crescent/take_damage(damage, damage_type = BRUTE, damage_flags, inflicter, armor_pen = 0, silent, do_update_health) return /obj/structure/window/reinforced/crescent/shatter() diff --git a/code/game/turfs/walls/_wall.dm b/code/game/turfs/walls/_wall.dm index bdbb46a6a7f..3fd1d0b8604 100644 --- a/code/game/turfs/walls/_wall.dm +++ b/code/game/turfs/walls/_wall.dm @@ -184,7 +184,7 @@ var/global/list/wall_fullblend_objects = list( F.icon_state = "wall_thermite" visible_message(SPAN_DANGER("\The [src] spontaneously combusts!")) -/turf/wall/take_damage(damage, damage_type = BRUTE, damage_flags, inflicter, armor_pen = 0) +/turf/wall/take_damage(damage, damage_type = BRUTE, damage_flags, inflicter, armor_pen = 0, silent, do_update_health) if(damage) src.damage = max(0, src.damage + damage) update_damage() diff --git a/code/modules/blob/blob.dm b/code/modules/blob/blob.dm index 65dbc8c0233..ed4c4624104 100644 --- a/code/modules/blob/blob.dm +++ b/code/modules/blob/blob.dm @@ -56,7 +56,7 @@ return attempt_attack(global.alldirs) -/obj/effect/blob/take_damage(damage, damage_type = BRUTE, damage_flags, inflicter, armor_pen = 0) +/obj/effect/blob/take_damage(damage, damage_type = BRUTE, damage_flags, inflicter, armor_pen = 0, silent, do_update_health) current_health -= damage if(current_health < 0) playsound(loc, 'sound/effects/splat.ogg', 50, 1) diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm index 558f1d72ea1..e4d23c889a8 100644 --- a/code/modules/mob/living/living_defense.dm +++ b/code/modules/mob/living/living_defense.dm @@ -208,7 +208,7 @@ if(!affecting) affecting = get_organ(def_zone) - if(affecting && supplied_wound?.is_open() && dtype == BRUTE) // Can't embed in a small bruise. + if(affecting && istype(supplied_wound) && supplied_wound.is_open() && dtype == BRUTE) // Can't embed in a small bruise. var/obj/item/I = O var/sharp = is_sharp(I) embed_damage *= (1 - get_blocked_ratio(def_zone, BRUTE, O.damage_flags(), O.armor_penetration, I.force)) @@ -221,7 +221,7 @@ //Sharp objects will always embed if they do enough damage. //Thrown sharp objects have some momentum already and have a small chance to embed even if the damage is below the threshold if((sharp && prob(sharp_embed_chance)) || (embed_damage > embed_threshold && prob(embed_chance))) - affecting.embed_in_organ(I, supplied_wound = supplied_wound) + affecting.embed_in_organ(I, supplied_wound = (istype(supplied_wound) ? supplied_wound : null)) I.has_embedded(src) . = TRUE diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index ef327c6de07..aee0476c808 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -386,7 +386,7 @@ var/global/list/simplemob_icon_bitflag_cache = list() return 1 -/mob/living/simple_animal/take_damage(damage, damagetype, def_zone, damage_flags, obj/item/used_weapon, armor_pen, silent, do_update_health) +/mob/living/simple_animal/take_damage(damage, damage_type = BRUTE, damage_flags, inflicter, armor_pen = 0, silent, do_update_health) . = ..() if((damagetype == BRUTE) && damage_flags & (DAM_EDGE | DAM_SHARP | DAM_BULLET)) // damage flags that should cause bleeding adjustBleedTicks(damage) diff --git a/code/modules/mob/mob_damage.dm b/code/modules/mob/mob_damage.dm index c53658f5982..26b684a8e2d 100644 --- a/code/modules/mob/mob_damage.dm +++ b/code/modules/mob/mob_damage.dm @@ -39,7 +39,7 @@ //if(ELECTROCUTE) return 0 -/mob/take_damage(damage, damage_type = BRUTE, damage_flags, inflicter, armor_pen = 0, do_update_health) +/mob/take_damage(damage, damage_type = BRUTE, damage_flags, inflicter, armor_pen = 0, silent, do_update_health) switch(damage_type) if(BRUTE) return adjustBruteLoss(damage, do_update_health) diff --git a/code/modules/shield_generators/shield.dm b/code/modules/shield_generators/shield.dm index 5b9ca7c6bf7..844395bbc36 100644 --- a/code/modules/shield_generators/shield.dm +++ b/code/modules/shield_generators/shield.dm @@ -130,7 +130,7 @@ // The closer we are to impact site, the longer it takes for shield to come back up. S.fail(-(-range + get_dist(src, S)) * 2) -/obj/effect/shield/take_damage(damage, damage_type = BRUTE, damage_flags, inflicter, armor_pen = 0) +/obj/effect/shield/take_damage(damage, damage_type = BRUTE, damage_flags, inflicter, armor_pen = 0, silent, do_update_health) if(!gen) qdel(src) return From 577c0df575b13ec2d0462f8bce20ddc6bc333fc1 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sat, 15 Jun 2024 16:48:38 +1000 Subject: [PATCH 19/90] Correcting simple_animal take_damage() call. --- .../mob/living/simple_animal/simple_animal.dm | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index aee0476c808..d13d2b45e39 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -333,17 +333,17 @@ var/global/list/simplemob_icon_bitflag_cache = list() if(!.) var/dealt_damage = harm_intent_damage var/harm_verb = response_harm - var/damageflags - var/damagetype + var/damage_flags + var/damage_type if(ishuman(user)) var/mob/living/carbon/human/H = user var/decl/natural_attack/attack = H.get_unarmed_attack(src) if(istype(attack)) dealt_damage = attack.damage <= dealt_damage ? dealt_damage : attack.damage harm_verb = pick(attack.attack_verb) - damageflags = attack.get_damage_flags() - damagetype = attack.get_damage_type() - take_damage(dealt_damage, damagetype, damageflags, user) + damage_flags = attack.get_damage_flags() + damage_type = attack.get_damage_type() + take_damage(dealt_damage, damage_type, damage_flags = damage_flags, used_weapon = user) user.visible_message(SPAN_DANGER("\The [user] [harm_verb] \the [src]!")) user.do_attack_animation(src) return TRUE @@ -388,7 +388,7 @@ var/global/list/simplemob_icon_bitflag_cache = list() /mob/living/simple_animal/take_damage(damage, damage_type = BRUTE, damage_flags, inflicter, armor_pen = 0, silent, do_update_health) . = ..() - if((damagetype == BRUTE) && damage_flags & (DAM_EDGE | DAM_SHARP | DAM_BULLET)) // damage flags that should cause bleeding + if((damage_type == BRUTE) && (damage_flags & (DAM_EDGE | DAM_SHARP | DAM_BULLET))) // damage flags that should cause bleeding adjustBleedTicks(damage) /mob/living/simple_animal/get_movement_delay(var/travel_dir) From 510818fa0f4fe88b0480824ec995094f6b53704f Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sat, 15 Jun 2024 16:50:15 +1000 Subject: [PATCH 20/90] Corrects a couple of emotes. --- code/modules/emotes/definitions/audible_whistle.dm | 2 +- mods/species/drakes/drake_emotes.dm | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/emotes/definitions/audible_whistle.dm b/code/modules/emotes/definitions/audible_whistle.dm index fed0842b6f7..585ca85e95f 100644 --- a/code/modules/emotes/definitions/audible_whistle.dm +++ b/code/modules/emotes/definitions/audible_whistle.dm @@ -1,7 +1,7 @@ /decl/emote/audible/whistle key = "whistle" emote_message_1p = "You whistle a tune." - emote_message_3p = "whistles a tune." + emote_message_3p = "$USER$ whistles a tune." emote_message_muffled = "$USER$ makes a light spitting noise, a poor attempt at a whistle." emote_message_synthetic_1p = "You whistle a robotic tune." emote_message_synthetic_3p = "$USER$ whistles a robotic tune." diff --git a/mods/species/drakes/drake_emotes.dm b/mods/species/drakes/drake_emotes.dm index fc2c8befe28..14af84c05cf 100644 --- a/mods/species/drakes/drake_emotes.dm +++ b/mods/species/drakes/drake_emotes.dm @@ -19,7 +19,7 @@ /decl/emote/audible/drake_warble key = "dwarble" - emote_message_3p = "warbles happily." + emote_message_3p = "$USER$ warbles happily." /decl/emote/audible/drake_purr key = "dpurr" From 01f3cca932630b0aba096931b5693fd5b48c7b7d Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sat, 15 Jun 2024 16:52:28 +1000 Subject: [PATCH 21/90] Adding shorthand to kobold and hnoll languages. --- mods/content/fantasy/datum/hnoll/language.dm | 1 + mods/content/fantasy/datum/kobaloi/language.dm | 1 + 2 files changed, 2 insertions(+) diff --git a/mods/content/fantasy/datum/hnoll/language.dm b/mods/content/fantasy/datum/hnoll/language.dm index 4ade4417fed..2cefb494174 100644 --- a/mods/content/fantasy/datum/hnoll/language.dm +++ b/mods/content/fantasy/datum/hnoll/language.dm @@ -1,5 +1,6 @@ /decl/language/hnoll name = "Hnoll Tongue" + shorthand = "HN" desc = "While every hnoll culture across the Nine Mothers and beyond has their own \ local dialect, the matriarches over the years have taken great care to cultivate and \ maintain a shared tongue used at the yearly gatherings and for inter-settlement trade. \ diff --git a/mods/content/fantasy/datum/kobaloi/language.dm b/mods/content/fantasy/datum/kobaloi/language.dm index 880741b0de9..c4f4f714d1b 100644 --- a/mods/content/fantasy/datum/kobaloi/language.dm +++ b/mods/content/fantasy/datum/kobaloi/language.dm @@ -1,5 +1,6 @@ /decl/language/kobaloi name = "Kobaloi Tongue" + shorthand = "KB" desc = "The kobaloi have a huge variety of languages, sometimes differing even between groups in the same cave system, but all of them have some degree of overlap to allow mutual intelligibility." speech_verb = "says" ask_verb = "asks" From 6eab72fe1b87bfee51be5ac9c27e7f1a49106bfa Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sat, 15 Jun 2024 16:56:58 +1000 Subject: [PATCH 22/90] Shaded Hills indoor areas no longer have fish. --- maps/shaded_hills/areas/downlands.dm | 17 ++++++++++++++--- maps/shaded_hills/areas/swamp.dm | 2 ++ 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/maps/shaded_hills/areas/downlands.dm b/maps/shaded_hills/areas/downlands.dm index 8fa019ee5d9..cc5d7d06d7d 100644 --- a/maps/shaded_hills/areas/downlands.dm +++ b/maps/shaded_hills/areas/downlands.dm @@ -6,25 +6,36 @@ /area/shaded_hills/inn name = "\improper Inn" + fishing_failure_prob = "100" + fishing_results = list() /area/shaded_hills/inn/porch name = "\improper Inn Porch" interior_ambient_light_modifier = -0.3 // night is pitch-black on the porch + fishing_failure_prob = "100" + fishing_results = list() /area/shaded_hills/stable name = "\improper Stable" + fishing_failure_prob = "100" + fishing_results = list() /area/shaded_hills/farmhouse name = "\improper Farmhouse" + fishing_failure_prob = "100" + fishing_results = list() /area/shaded_hills/slaughterhouse name = "\improper Slaughterhouse" + fishing_failure_prob = "100" + fishing_results = list() /area/shaded_hills/tannery name = "\improper Tannery" + fishing_failure_prob = "100" + fishing_results = list() /area/shaded_hills/general_store name = "\improper General Store" - -/area/shaded_hills/forester_hut - name = "\improper Foresters' Hut" + fishing_failure_prob = "100" + fishing_results = list() diff --git a/maps/shaded_hills/areas/swamp.dm b/maps/shaded_hills/areas/swamp.dm index f26e7893ea8..a8b0e19ca1f 100644 --- a/maps/shaded_hills/areas/swamp.dm +++ b/maps/shaded_hills/areas/swamp.dm @@ -1,6 +1,8 @@ // Swamp areas. /area/shaded_hills/witch_hut name = "Witches' Hut" + fishing_failure_prob = "100" + fishing_results = list() /area/shaded_hills/caves/river/swamp name = "Southern Silent River" From 4a896f6ace4bd84ba7b34ef1c97ebdd94fea9b1c Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sat, 15 Jun 2024 16:57:43 +1000 Subject: [PATCH 23/90] Craftable gown is no longer imaginary silk. --- code/modules/clothing/dresses/misc.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/clothing/dresses/misc.dm b/code/modules/clothing/dresses/misc.dm index b768de812b6..20085a74b6c 100644 --- a/code/modules/clothing/dresses/misc.dm +++ b/code/modules/clothing/dresses/misc.dm @@ -59,6 +59,6 @@ body_parts_covered = SLOT_UPPER_BODY|SLOT_LOWER_BODY|SLOT_LEGS|SLOT_ARMS /obj/item/clothing/dress/gown - name = "silk gown" - desc = "A long silky sleeveless gown with a flared hem." + name = "gown" + desc = "A long sleeveless gown with a flared hem." icon = 'icons/clothing/dresses/dress_gown.dmi' From 4bbb633d6d5f5384677a56de24c6f4a9520957f0 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sat, 15 Jun 2024 17:06:37 +1000 Subject: [PATCH 24/90] Adding guards to crafting to avoid letting people use regular grass instead of dried. --- code/game/objects/items/weapons/material/stick.dm | 4 ++++ code/modules/crafting/stack_recipes/recipes_grass.dm | 5 +++++ code/modules/fishing/fishing_rod.dm | 6 ++++++ code/modules/materials/_material_stack.dm | 3 +++ code/modules/materials/material_stack_misc.dm | 4 ++++ maps/shaded_hills/areas/woods.dm | 5 +++++ 6 files changed, 27 insertions(+) diff --git a/code/game/objects/items/weapons/material/stick.dm b/code/game/objects/items/weapons/material/stick.dm index 6684af58921..e1c16a7b476 100644 --- a/code/game/objects/items/weapons/material/stick.dm +++ b/code/game/objects/items/weapons/material/stick.dm @@ -26,7 +26,11 @@ if(!sharp && (istype(W, /obj/item/stack/material/bolt) || istype(W, /obj/item/stack/material/bundle))) + // Ugly way to check for dried grass vs regular grass. var/obj/item/stack/material/fuel = W + if(!fuel.special_crafting_check()) + return ..() + if(fuel.get_amount() < 5) to_chat(user, SPAN_WARNING("You need at least five units of flammable material to create a torch.")) return TRUE diff --git a/code/modules/crafting/stack_recipes/recipes_grass.dm b/code/modules/crafting/stack_recipes/recipes_grass.dm index a46a659ad9f..d6f262e90bc 100644 --- a/code/modules/crafting/stack_recipes/recipes_grass.dm +++ b/code/modules/crafting/stack_recipes/recipes_grass.dm @@ -3,6 +3,11 @@ craft_stack_types = /obj/item/stack/material/bundle category = "woven items" +/decl/stack_recipe/woven/can_be_made_from(stack_type, tool_type, decl/material/mat, decl/material/reinf_mat) + if((istype(mat) ? mat.type : mat) == /decl/material/solid/organic/plantmatter/grass) + return FALSE + return ..() + /decl/stack_recipe/woven/basket result_type = /obj/item/basket diff --git a/code/modules/fishing/fishing_rod.dm b/code/modules/fishing/fishing_rod.dm index cb184834f0d..90dfbe79088 100644 --- a/code/modules/fishing/fishing_rod.dm +++ b/code/modules/fishing/fishing_rod.dm @@ -293,6 +293,12 @@ if(!new_line || !is_type_in_list(new_line, valid_line_types)) return FALSE + // TODO: better solution for grass vs dried grass + if(istype(new_line, /obj/item/stack/material)) + var/obj/item/stack/material/stack = new_line + if(!stack.special_crafting_check()) + return FALSE + if(!new_line.material?.tensile_strength) to_chat(user, SPAN_WARNING("\The [new_line] isn't suitable for the rigors of fishing.")) return TRUE diff --git a/code/modules/materials/_material_stack.dm b/code/modules/materials/_material_stack.dm index 763f81ac7e0..4ea3840e334 100644 --- a/code/modules/materials/_material_stack.dm +++ b/code/modules/materials/_material_stack.dm @@ -63,6 +63,9 @@ LAZYSET(matter, reinf_material.type, MATTER_AMOUNT_REINFORCEMENT) // No matter_multiplier as this is applied in parent. ..() +/obj/item/stack/material/proc/special_crafting_check() + return TRUE + /obj/item/stack/material/proc/update_strings() var/prefix_name = name_modifier ? "[name_modifier] " : "" if(amount>1) diff --git a/code/modules/materials/material_stack_misc.dm b/code/modules/materials/material_stack_misc.dm index 0d263397283..6ac557a3969 100644 --- a/code/modules/materials/material_stack_misc.dm +++ b/code/modules/materials/material_stack_misc.dm @@ -141,6 +141,10 @@ craft_verb = "weave" craft_verbing = "weaving" +// Hacky fix for grass crafting. +/obj/item/stack/material/bundle/special_crafting_check() + return !dried_type || drying_wetness <= 0 + /obj/item/stack/material/strut name = "struts" singular_name = "strut" diff --git a/maps/shaded_hills/areas/woods.dm b/maps/shaded_hills/areas/woods.dm index e1dee0bed35..fdaec01adc1 100644 --- a/maps/shaded_hills/areas/woods.dm +++ b/maps/shaded_hills/areas/woods.dm @@ -26,3 +26,8 @@ /area/shaded_hills/caves/unexplored/woods name = "Trackless Deeps - Far North" + +/area/shaded_hills/forester_hut + name = "\improper Foresters' Hut" + fishing_failure_prob = "100" + fishing_results = list() From 66bee3fb9be289a155b0cd6dc4bcfee991a8016e Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sat, 15 Jun 2024 17:16:38 +1000 Subject: [PATCH 25/90] Attempting to fix issues with weather overlays. --- code/game/turfs/turf.dm | 9 +++++---- code/modules/weather/_weather.dm | 3 ++- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index ee3cfba5e23..afd6cc22bac 100644 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -500,18 +500,17 @@ // We have a weather system and we are exposed to it; update our vis contents. if(istype(new_weather) && is_outside()) if(weather != new_weather) - if(weather) - remove_vis_contents(weather.vis_contents_additions) weather = new_weather - add_vis_contents(weather.vis_contents_additions) . = TRUE // We are indoors or there is no local weather system, clear our vis contents. else if(weather) - remove_vis_contents(weather.vis_contents_additions) weather = null . = TRUE + if(.) + update_vis_contents() + // Propagate our weather downwards if we permit it. if(force_update_below || (is_open() && .)) var/turf/below = GetBelow(src) @@ -607,6 +606,8 @@ LAZYDISTINCTADD(., air_graphic) if(weather) LAZYADD(., weather) + if(length(weather.vis_contents_additions)) + LAZYADD(., weather.vis_contents_additions) if(flooded) var/flood_object = get_flood_overlay(flooded) if(flood_object) diff --git a/code/modules/weather/_weather.dm b/code/modules/weather/_weather.dm index 420c6b755fb..3feea9f4366 100644 --- a/code/modules/weather/_weather.dm +++ b/code/modules/weather/_weather.dm @@ -62,8 +62,8 @@ for(var/tz in affecting_zs) for(var/turf/T as anything in block(locate(1, 1, tz), locate(world.maxx, world.maxy, tz))) if(T.weather == src) - T.remove_vis_contents(vis_contents_additions) T.weather = null + T.update_vis_contents() vis_contents_additions.Cut() SSweather.unregister_weather_system(src) QDEL_NULL(lightning_overlay) @@ -99,3 +99,4 @@ alpha = 0 invisibility = INVISIBILITY_NONE is_spawnable_type = FALSE + appearance_flags = RESET_COLOR | KEEP_APART From af3e6fb3c17dfce75d5fd7c4302d8138ff9407ed Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sat, 15 Jun 2024 17:20:59 +1000 Subject: [PATCH 26/90] Fixes grammar for drake age categories. --- mods/species/drakes/species_bodytypes.dm | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/mods/species/drakes/species_bodytypes.dm b/mods/species/drakes/species_bodytypes.dm index 11affa222bb..a61937f619d 100644 --- a/mods/species/drakes/species_bodytypes.dm +++ b/mods/species/drakes/species_bodytypes.dm @@ -2,12 +2,12 @@ chargen_min_index = 2 chargen_max_index = 6 standalone_value_descriptors = list( - "a hatchling" = 1, - "an juvenile" = 2, - "an adolescent" = 4, - "an adult" = 6, - "aging" = 20, - "elderly" = 30 + "a hatchling" = 1, + "a juvenile" = 2, + "an adolescent" = 4, + "an adult" = 6, + "aging" = 20, + "elderly" = 30 ) /datum/appearance_descriptor/age/grafadreka/hatchling From ef390eee3bd3b7ebb85707a069d4e9992e3ddf1e Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sat, 15 Jun 2024 17:28:07 +1000 Subject: [PATCH 27/90] Removed overly zealous blacklist setting from map code. --- maps/~mapsystem/maps.dm | 1 - 1 file changed, 1 deletion(-) diff --git a/maps/~mapsystem/maps.dm b/maps/~mapsystem/maps.dm index ed512725201..62e68926985 100644 --- a/maps/~mapsystem/maps.dm +++ b/maps/~mapsystem/maps.dm @@ -270,7 +270,6 @@ var/global/const/MAP_HAS_RANK = 2 //Rank system, also togglable for(var/datum/job/job as anything in SSjobs.primary_job_datums) if((species.type in job_to_species_whitelist[job.type]) || (job.type in species_to_job_whitelist[species.type])) LAZYDISTINCTADD(species_to_job_whitelist[species.type], job.type) - LAZYDISTINCTADD(job_to_species_whitelist[job.type], species.type) found_whitelisted_job = TRUE else LAZYDISTINCTADD(species_to_job_blacklist[species.type], job.type) From d0389c2a05f471e824439a02c35e53f32ba48cc4 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sat, 15 Jun 2024 17:29:31 +1000 Subject: [PATCH 28/90] Added join flags to drakes. --- code/modules/mob/living/simple_animal/simple_animal.dm | 2 +- maps/~mapsystem/maps.dm | 1 - mods/species/drakes/species.dm | 4 ++++ 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index d13d2b45e39..25014bb4509 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -343,7 +343,7 @@ var/global/list/simplemob_icon_bitflag_cache = list() harm_verb = pick(attack.attack_verb) damage_flags = attack.get_damage_flags() damage_type = attack.get_damage_type() - take_damage(dealt_damage, damage_type, damage_flags = damage_flags, used_weapon = user) + take_damage(dealt_damage, damage_type, damage_flags = damage_flags, inflicter = user) user.visible_message(SPAN_DANGER("\The [user] [harm_verb] \the [src]!")) user.do_attack_animation(src) return TRUE diff --git a/maps/~mapsystem/maps.dm b/maps/~mapsystem/maps.dm index 62e68926985..767da60083e 100644 --- a/maps/~mapsystem/maps.dm +++ b/maps/~mapsystem/maps.dm @@ -269,7 +269,6 @@ var/global/const/MAP_HAS_RANK = 2 //Rank system, also togglable var/found_whitelisted_job = FALSE for(var/datum/job/job as anything in SSjobs.primary_job_datums) if((species.type in job_to_species_whitelist[job.type]) || (job.type in species_to_job_whitelist[species.type])) - LAZYDISTINCTADD(species_to_job_whitelist[species.type], job.type) found_whitelisted_job = TRUE else LAZYDISTINCTADD(species_to_job_blacklist[species.type], job.type) diff --git a/mods/species/drakes/species.dm b/mods/species/drakes/species.dm index e37b7c89253..145cfbacd6e 100644 --- a/mods/species/drakes/species.dm +++ b/mods/species/drakes/species.dm @@ -41,7 +41,11 @@ traits = list( /decl/trait/sivian_biochemistry = TRAIT_LEVEL_EXISTS ) + + // Drakes must be whitelisted for jobs to be able to join as them, see maps.dm. job_blacklist_by_default = TRUE + spawn_flags = SPECIES_CAN_JOIN | SPECIES_IS_WHITELISTED + var/list/adult_pain_emotes_with_pain_level = list( list(/decl/emote/audible/drake_huff, /decl/emote/audible/drake_rattle) = 20 ) From 249a083de54222eb03808caf86eeff488cc8c88a Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sat, 15 Jun 2024 19:30:08 +1000 Subject: [PATCH 29/90] Grabs a bunch of small tweaks from Crux. --- code/datums/uplink/services.dm | 2 +- code/game/objects/structures/tables.dm | 5 ++++- code/game/turfs/turf_fluids.dm | 2 +- code/game/turfs/unsimulated/floor.dm | 4 ++++ code/game/turfs/walls/wall_natural.dm | 4 ++++ .../culture_descriptor/location/_location.dm | 2 +- code/modules/emotes/emote_define.dm | 1 + .../modules/materials/material_sheets_mapping.dm | 2 +- .../file_system/reports/crew_record.dm | 10 +++++----- .../networking/machinery/wall_relay.dm | 16 ++++++++++++++++ code/modules/turbolift/turbolift_areas.dm | 4 ++-- mods/content/pheromones/pheromone_emotes.dm | 6 ++++++ 12 files changed, 46 insertions(+), 12 deletions(-) diff --git a/code/datums/uplink/services.dm b/code/datums/uplink/services.dm index dc6b0495f5b..f7f37fc49af 100644 --- a/code/datums/uplink/services.dm +++ b/code/datums/uplink/services.dm @@ -227,7 +227,7 @@ if(random_record) COPY_VALUE(faction) COPY_VALUE(religion) - COPY_VALUE(homeSystem) + COPY_VALUE(residence) COPY_VALUE(fingerprint) COPY_VALUE(dna) COPY_VALUE(bloodtype) diff --git a/code/game/objects/structures/tables.dm b/code/game/objects/structures/tables.dm index 5556cc52731..81b883bdbb5 100644 --- a/code/game/objects/structures/tables.dm +++ b/code/game/objects/structures/tables.dm @@ -279,7 +279,10 @@ /obj/structure/table/update_material_desc(override_desc) desc = initial(desc) if(reinf_material) - desc = "[desc] This one has a frame made from [material.solid_name] and \a [top_surface_noun] made from [reinf_material.solid_name]." + if(reinf_material == material) + desc = "[desc] This one has a frame and \a [top_surface_noun] made from [material.solid_name]." + else + desc = "[desc] This one has a frame made from [material.solid_name] and \a [top_surface_noun] made from [reinf_material.solid_name]." else if(material) desc = "[desc] This one has a frame made from [material.solid_name]." if(felted) diff --git a/code/game/turfs/turf_fluids.dm b/code/game/turfs/turf_fluids.dm index a8d9aec550f..4c2b7ee2c37 100644 --- a/code/game/turfs/turf_fluids.dm +++ b/code/game/turfs/turf_fluids.dm @@ -39,7 +39,7 @@ /turf/proc/set_flooded(new_flooded, force = FALSE, skip_vis_contents_update = FALSE, mapload = FALSE) // Don't do unnecessary work. - if(!force && new_flooded == flooded) + if(!simulated || (!force && new_flooded == flooded)) return // Remove our old overlay if necessary. diff --git a/code/game/turfs/unsimulated/floor.dm b/code/game/turfs/unsimulated/floor.dm index bcb1441d399..a8e69ac96e8 100644 --- a/code/game/turfs/unsimulated/floor.dm +++ b/code/game/turfs/unsimulated/floor.dm @@ -18,6 +18,10 @@ icon = 'icons/turf/walls.dmi' icon_state = "rockvault" +/turf/unsimulated/mask/flooded + flooded = /decl/material/liquid/water + color = COLOR_LIQUID_WATER + /turf/unsimulated/floor/rescue_base icon_state = "asteroidfloor" diff --git a/code/game/turfs/walls/wall_natural.dm b/code/game/turfs/walls/wall_natural.dm index 5c2c21f8511..568f3304e48 100644 --- a/code/game/turfs/walls/wall_natural.dm +++ b/code/game/turfs/walls/wall_natural.dm @@ -11,6 +11,10 @@ var/static/list/exterior_wall_shine_cache = list() var/being_mined = FALSE +/turf/wall/natural/flooded + flooded = /decl/material/liquid/water + color = COLOR_LIQUID_WATER + /turf/wall/natural/get_paint_examine_message() return SPAN_NOTICE("It has been noticeably discoloured by the elements.") diff --git a/code/modules/culture_descriptor/location/_location.dm b/code/modules/culture_descriptor/location/_location.dm index ee8c1dd2ef9..307dd0b73e3 100644 --- a/code/modules/culture_descriptor/location/_location.dm +++ b/code/modules/culture_descriptor/location/_location.dm @@ -1,6 +1,6 @@ /decl/cultural_info/location abstract_type = /decl/cultural_info/location - desc_type = "Home System" + desc_type = "Residence" category = TAG_HOMEWORLD var/distance_heading = "Distance from Sol" var/distance = 0 diff --git a/code/modules/emotes/emote_define.dm b/code/modules/emotes/emote_define.dm index 01622faed06..e6e037a8c72 100644 --- a/code/modules/emotes/emote_define.dm +++ b/code/modules/emotes/emote_define.dm @@ -34,6 +34,7 @@ var/global/list/_emotes_by_key return global._emotes_by_key[key] /decl/emote + abstract_type = /decl/emote /// Command to use emote ie. '*[key]' var/key /// First person message ('You do a flip!') diff --git a/code/modules/materials/material_sheets_mapping.dm b/code/modules/materials/material_sheets_mapping.dm index 272cf4a0882..9221f0959ae 100644 --- a/code/modules/materials/material_sheets_mapping.dm +++ b/code/modules/materials/material_sheets_mapping.dm @@ -79,7 +79,7 @@ STACK_SUBTYPES(yew, "yew", solid/organic/wo STACK_SUBTYPES(cardboard, "cardboard", solid/organic/cardboard, cardstock, null) STACK_SUBTYPES(leather, "leather", solid/organic/leather, skin, null) STACK_SUBTYPES(synthleather, "synthleather", solid/organic/leather/synth, skin, null) -STACK_SUBTYPES(bone, "bone", solid/organic/bone, bone, null) +STACK_SUBTYPES(bone, "bone", solid/organic/bone, bone, null) STACK_SUBTYPES(glass, "glass", solid/glass, pane, null) STACK_SUBTYPES(borosilicate, "borosilicate glass", solid/glass/borosilicate, pane, null) STACK_SUBTYPES(aliumium, "aliumium", solid/metal/aliumium, cubes, null) diff --git a/code/modules/modular_computers/file_system/reports/crew_record.dm b/code/modules/modular_computers/file_system/reports/crew_record.dm index acfcb3a6302..190e05ef531 100644 --- a/code/modules/modular_computers/file_system/reports/crew_record.dm +++ b/code/modules/modular_computers/file_system/reports/crew_record.dm @@ -110,9 +110,9 @@ var/global/arrest_security_status = "Arrest" set_employment_record(employment_record) // Misc cultural info. - set_homeSystem(H ? html_decode(H.get_cultural_value(TAG_HOMEWORLD)) : "Unset") - set_faction(H ? html_decode(H.get_cultural_value(TAG_FACTION)) : "Unset") - set_religion(H ? html_decode(H.get_cultural_value(TAG_RELIGION)) : "Unset") + set_residence(H ? html_decode(H.get_cultural_value(TAG_HOMEWORLD)) : "Unset") + set_faction(H ? html_decode(H.get_cultural_value(TAG_FACTION)) : "Unset") + set_religion(H ? html_decode(H.get_cultural_value(TAG_RELIGION)) : "Unset") if(H) var/skills = list() @@ -255,8 +255,8 @@ FIELD_SHORT("Fingerprint", fingerprint, access_security, access_security, TRUE, // EMPLOYMENT RECORDS FIELD_LONG("Employment Record", employment_record, access_bridge, access_bridge, TRUE) -FIELD_SHORT("Home System", homeSystem, access_bridge, access_change_ids, FALSE, TRUE) -FIELD_SHORT("Faction", faction, access_bridge, access_bridge, FALSE, TRUE) +FIELD_SHORT("Residence", residence, access_bridge, access_change_ids, FALSE, TRUE) +FIELD_SHORT("Association", faction, access_bridge, access_bridge, FALSE, TRUE) FIELD_LONG("Qualifications", skillset, access_bridge, access_bridge, TRUE) // ANTAG RECORDS diff --git a/code/modules/modular_computers/networking/machinery/wall_relay.dm b/code/modules/modular_computers/networking/machinery/wall_relay.dm index dbf5102bf60..bb3b423e13f 100644 --- a/code/modules/modular_computers/networking/machinery/wall_relay.dm +++ b/code/modules/modular_computers/networking/machinery/wall_relay.dm @@ -12,3 +12,19 @@ /obj/machinery/network/relay/wall_mounted/Initialize() . = ..() queue_icon_update() + +/obj/machinery/network/relay/wall_mounted/south + dir = NORTH + pixel_y = -21 + +/obj/machinery/network/relay/wall_mounted/north + dir = SOUTH + pixel_y = 21 + +/obj/machinery/network/relay/wall_mounted/west + dir = EAST + pixel_x = -21 + +/obj/machinery/network/relay/wall_mounted/east + dir = WEST + pixel_x = 21 diff --git a/code/modules/turbolift/turbolift_areas.dm b/code/modules/turbolift/turbolift_areas.dm index 0d59bde8d0e..893f07ab67c 100644 --- a/code/modules/turbolift/turbolift_areas.dm +++ b/code/modules/turbolift/turbolift_areas.dm @@ -1,8 +1,8 @@ // Used for creating the exchange areas. /area/turbolift - name = "Turbolift" + name = "\improper Turbolift" base_turf = /turf/open - requires_power = 0 + requires_power = FALSE sound_env = SMALL_ENCLOSED holomap_color = HOLOMAP_AREACOLOR_LIFTS diff --git a/mods/content/pheromones/pheromone_emotes.dm b/mods/content/pheromones/pheromone_emotes.dm index c7c96755a9e..5e79267a65e 100644 --- a/mods/content/pheromones/pheromone_emotes.dm +++ b/mods/content/pheromones/pheromone_emotes.dm @@ -13,6 +13,12 @@ self_smell_descriptor = "distressing" scent_color = COLOR_RED +/decl/emote/pheromone/pain + key = "scentpain" + smell_message = "PAIN" + self_smell_descriptor = "distressing" + scent_color = COLOR_RED + /decl/emote/pheromone/calm key = "scentcalm" smell_message = "calm" From a45d80f52e373ce90a42463759ee09d2fe453b42 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Fri, 14 Jun 2024 23:09:07 -0400 Subject: [PATCH 30/90] Move Meteor gamemode into a modpack --- code/game/gamemodes/meteor/meteors.dm | 391 ------------------ code/modules/events/meteors.dm | 329 ++++++++++++++- maps/exodus/exodus.dm | 2 + maps/modpack_testing/modpack_testing.dm | 2 + mods/gamemodes/meteor/_meteor.dm | 4 + mods/gamemodes/meteor/_meteor.dme | 7 + .../gamemodes/meteor/gamemode.dm | 97 ++++- nebula.dme | 2 - 8 files changed, 427 insertions(+), 407 deletions(-) delete mode 100644 code/game/gamemodes/meteor/meteors.dm create mode 100644 mods/gamemodes/meteor/_meteor.dm create mode 100644 mods/gamemodes/meteor/_meteor.dme rename code/game/gamemodes/meteor/meteor.dm => mods/gamemodes/meteor/gamemode.dm (59%) diff --git a/code/game/gamemodes/meteor/meteors.dm b/code/game/gamemodes/meteor/meteors.dm deleted file mode 100644 index 93da611e656..00000000000 --- a/code/game/gamemodes/meteor/meteors.dm +++ /dev/null @@ -1,391 +0,0 @@ -//Meteor groups, used for various random events and the Meteor gamemode. - -// Dust, used by space dust event and during earliest stages of meteor mode. -var/global/list/meteors_dust = list(/obj/effect/meteor/dust) - -// Standard meteors, used during early stages of the meteor gamemode. -var/global/list/meteors_normal = list(\ - /obj/effect/meteor/medium=8,\ - /obj/effect/meteor/dust=3,\ - /obj/effect/meteor/irradiated=3,\ - /obj/effect/meteor/big=3,\ - /obj/effect/meteor/flaming=1,\ - /obj/effect/meteor/golden=1,\ - /obj/effect/meteor/silver=1\ - ) - -// Threatening meteors, used during the meteor gamemode. -var/global/list/meteors_threatening = list(\ - /obj/effect/meteor/big=10,\ - /obj/effect/meteor/medium=5,\ - /obj/effect/meteor/golden=3,\ - /obj/effect/meteor/silver=3,\ - /obj/effect/meteor/flaming=3,\ - /obj/effect/meteor/irradiated=3,\ - /obj/effect/meteor/emp=3\ - ) - -// Catastrophic meteors, pretty dangerous without shields and used during the meteor gamemode. -var/global/list/meteors_catastrophic = list(\ - /obj/effect/meteor/big=75,\ - /obj/effect/meteor/flaming=10,\ - /obj/effect/meteor/irradiated=10,\ - /obj/effect/meteor/emp=10,\ - /obj/effect/meteor/medium=5,\ - /obj/effect/meteor/golden=4,\ - /obj/effect/meteor/silver=4,\ - /obj/effect/meteor/tunguska=1\ - ) - -// Armageddon meteors, very dangerous, and currently used only during the meteor gamemode. -var/global/list/meteors_armageddon = list(\ - /obj/effect/meteor/big=25,\ - /obj/effect/meteor/flaming=10,\ - /obj/effect/meteor/irradiated=10,\ - /obj/effect/meteor/emp=10,\ - /obj/effect/meteor/medium=3,\ - /obj/effect/meteor/tunguska=3,\ - /obj/effect/meteor/golden=2,\ - /obj/effect/meteor/silver=2\ - ) - -// Cataclysm meteor selection. Very very dangerous and effective even against shields. Used in late game meteor gamemode only. -var/global/list/meteors_cataclysm = list(\ - /obj/effect/meteor/big=40,\ - /obj/effect/meteor/emp=20,\ - /obj/effect/meteor/tunguska=20,\ - /obj/effect/meteor/irradiated=10,\ - /obj/effect/meteor/golden=10,\ - /obj/effect/meteor/silver=10,\ - /obj/effect/meteor/flaming=10,\ - /obj/effect/meteor/supermatter=1\ - ) - - - -/////////////////////////////// -//Meteor spawning global procs -/////////////////////////////// - -/proc/spawn_meteors(var/number = 10, var/list/meteortypes, var/startSide, var/zlevel) - for(var/i = 0; i < number; i++) - spawn_meteor(meteortypes, startSide, zlevel) - -/proc/spawn_meteor(var/list/meteortypes, var/startSide, var/zlevel) - var/turf/pickedstart = spaceDebrisStartLoc(startSide, zlevel) - var/turf/pickedgoal = spaceDebrisFinishLoc(startSide, zlevel) - - var/Me = pickweight(meteortypes) - var/obj/effect/meteor/M = new Me(pickedstart) - M.dest = pickedgoal - spawn(0) - walk_towards(M, M.dest, 3) - return - -/proc/spaceDebrisStartLoc(startSide, Z) - var/starty - var/startx - switch(startSide) - if(NORTH) - starty = world.maxy-(TRANSITIONEDGE+1) - startx = rand((TRANSITIONEDGE+1), world.maxx-(TRANSITIONEDGE+1)) - if(EAST) - starty = rand((TRANSITIONEDGE+1),world.maxy-(TRANSITIONEDGE+1)) - startx = world.maxx-(TRANSITIONEDGE+1) - if(SOUTH) - starty = (TRANSITIONEDGE+1) - startx = rand((TRANSITIONEDGE+1), world.maxx-(TRANSITIONEDGE+1)) - if(WEST) - starty = rand((TRANSITIONEDGE+1), world.maxy-(TRANSITIONEDGE+1)) - startx = (TRANSITIONEDGE+1) - var/turf/T = locate(startx, starty, Z) - return T - -/proc/spaceDebrisFinishLoc(startSide, Z) - var/endy - var/endx - switch(startSide) - if(NORTH) - endy = TRANSITIONEDGE - endx = rand(TRANSITIONEDGE, world.maxx-TRANSITIONEDGE) - if(EAST) - endy = rand(TRANSITIONEDGE, world.maxy-TRANSITIONEDGE) - endx = TRANSITIONEDGE - if(SOUTH) - endy = world.maxy-TRANSITIONEDGE - endx = rand(TRANSITIONEDGE, world.maxx-TRANSITIONEDGE) - if(WEST) - endy = rand(TRANSITIONEDGE,world.maxy-TRANSITIONEDGE) - endx = world.maxx-TRANSITIONEDGE - var/turf/T = locate(endx, endy, Z) - return T - -/////////////////////// -//The meteor effect -////////////////////// - -/obj/effect/meteor - name = "meteor" - desc = "You should probably run instead of gawking at this." - icon = 'icons/obj/meteor.dmi' - icon_state = "small" - density = TRUE - anchored = TRUE - var/hits = 4 - var/hitpwr = 2 //Level of ex_act to be called on hit. - var/dest - pass_flags = PASS_FLAG_TABLE - var/heavy = 0 - var/z_original - var/meteordrop = /obj/item/stack/material/ore/iron - var/dropamt = 1 - var/ismissile //missiles don't spin - - var/move_count = 0 - -/obj/effect/meteor/proc/get_shield_damage() - return max(((max(hits, 2)) * (heavy + 1) * rand(30, 60)) / hitpwr , 0) - -/obj/effect/meteor/Initialize() - . = ..() - z_original = z - -/obj/effect/meteor/Initialize() - . = ..() - global.meteor_list += src - -/obj/effect/meteor/Move() - . = ..() //process movement... - move_count++ - if(loc == dest) - qdel(src) - -/obj/effect/meteor/touch_map_edge(var/overmap_id = OVERMAP_ID_SPACE) - if(move_count > TRANSITIONEDGE) - qdel(src) - -/obj/effect/meteor/Destroy() - walk(src,0) //this cancels the walk_towards() proc - global.meteor_list -= src - . = ..() - -/obj/effect/meteor/Initialize() - . = ..() - if(!ismissile) - SpinAnimation() - -/obj/effect/meteor/Bump(atom/A) - ..() - if(A && !QDELETED(src)) // Prevents explosions and other effects when we were deleted by whatever we Bumped() - currently used by shields. - ram_turf(get_turf(A)) - get_hit() //should only get hit once per move attempt - -/obj/effect/meteor/CanPass(atom/movable/mover, turf/target, height=0, air_group=0) - return istype(mover, /obj/effect/meteor) ? 1 : ..() - -/obj/effect/meteor/proc/ram_turf(var/turf/T) - //first bust whatever is in the turf - for(var/atom/A in T) - if(A != src && !A.CanPass(src, src.loc, 0.5, 0)) //only ram stuff that would actually block us - A.explosion_act(hitpwr) - - //then, ram the turf if it still exists - if(T && !T.CanPass(src, src.loc, 0.5, 0)) - T.explosion_act(hitpwr) - -//process getting 'hit' by colliding with a dense object -//or randomly when ramming turfs -/obj/effect/meteor/proc/get_hit() - hits-- - if(hits <= 0) - make_debris() - meteor_effect() - qdel(src) - -/obj/effect/meteor/explosion_act() - SHOULD_CALL_PARENT(FALSE) - return - -/obj/effect/meteor/attackby(obj/item/W, mob/user, params) - if(IS_PICK(W)) - qdel(src) - return - ..() - -/obj/effect/meteor/proc/make_debris() - if(meteordrop && dropamt) - for(var/throws = dropamt, throws > 0, throws--) - addtimer(CALLBACK(new meteordrop(get_turf(src)), TYPE_PROC_REF(/atom/movable, throw_at), dest, 5, 10), 0) - -/obj/effect/meteor/proc/meteor_effect() - if(heavy) - for(var/mob/M in global.player_list) - var/turf/T = get_turf(M) - if(!T || T.z != src.z) - continue - var/dist = get_dist(M.loc, src.loc) - shake_camera(M, (dist > 20 ? 0.5 SECONDS : 1 SECOND), (dist > 20 ? 1 : 3)) - - -/////////////////////// -//Meteor types -/////////////////////// - -//Dust -/obj/effect/meteor/dust - name = "space dust" - icon_state = "dust" - pass_flags = PASS_FLAG_TABLE | PASS_FLAG_GRILLE - hits = 1 - hitpwr = 3 - dropamt = 1 - meteordrop = /obj/item/stack/material/ore/handful/sand - -//Medium-sized -/obj/effect/meteor/medium - name = "meteor" - dropamt = 2 - -/obj/effect/meteor/medium/meteor_effect() - ..() - explosion(src.loc, 0, 1, 2, 3, 0) - -//Large-sized -/obj/effect/meteor/big - name = "large meteor" - icon_state = "large" - hits = 6 - heavy = 1 - dropamt = 3 - -/obj/effect/meteor/big/meteor_effect() - ..() - explosion(src.loc, 1, 2, 3, 4, 0) - -//Flaming meteor -/obj/effect/meteor/flaming - name = "flaming meteor" - icon_state = "flaming" - hits = 5 - heavy = 1 - meteordrop = /obj/item/stack/material/ore/phosphorite - -/obj/effect/meteor/flaming/meteor_effect() - ..() - explosion(src.loc, 1, 2, 3, 4, 0, 0, 5) - -//Radiation meteor -/obj/effect/meteor/irradiated - name = "glowing meteor" - icon_state = "glowing" - heavy = 1 - meteordrop = /obj/item/stack/material/ore/uranium - -/obj/effect/meteor/irradiated/meteor_effect() - ..() - explosion(src.loc, 0, 0, 4, 3, 0) - SSradiation.radiate(src, 50) - -/obj/effect/meteor/golden - name = "golden meteor" - icon_state = "glowing" - desc = "Shiny! But also deadly." - meteordrop = /obj/item/stack/material/ore/gold - -/obj/effect/meteor/silver - name = "silver meteor" - icon_state = "glowing_blue" - desc = "Shiny! But also deadly." - meteordrop = /obj/item/stack/material/ore/silver - -/obj/effect/meteor/emp - name = "conducting meteor" - icon_state = "glowing_blue" - desc = "Hide your floppies!" - meteordrop = /obj/item/stack/material/ore/osmium - dropamt = 2 - -/obj/effect/meteor/emp/meteor_effect() - ..() - // Best case scenario: Comparable to a low-yield EMP grenade. - // Worst case scenario: Comparable to a standard yield EMP grenade. - empulse(src, rand(2, 4), rand(4, 10)) - -/obj/effect/meteor/emp/get_shield_damage() - return ..() * rand(2,4) - -//Station buster Tunguska -/obj/effect/meteor/tunguska - name = "tunguska meteor" - icon_state = "flaming" - desc = "Your life briefly passes before your eyes the moment you lay them on this monstrosity." - hits = 10 - hitpwr = 1 - heavy = 1 - meteordrop = /obj/item/stack/material/ore/diamond // Probably means why it penetrates the hull so easily before exploding. - -/obj/effect/meteor/tunguska/meteor_effect() - ..() - explosion(src.loc, 3, 6, 9, 20, 0) - -// This is the final solution against shields - a single impact can bring down most shield generators. -/obj/effect/meteor/supermatter - name = "supermatter shard" - desc = "Oh god, what will be next..?" - icon = 'icons/obj/supermatter_32.dmi' - icon_state = "supermatter" - -/obj/effect/meteor/supermatter/meteor_effect() - ..() - explosion(src.loc, 1, 2, 3, 4, 0) - for(var/obj/machinery/power/apc/A in range(rand(12, 20), src)) - A.energy_fail(round(10 * rand(8, 12))) - -/obj/effect/meteor/supermatter/get_shield_damage() - return ..() * rand(80, 120) - -//Missiles, for events and so on -/obj/effect/meteor/supermatter/missile - name = "photon torpedo" - desc = "An advanded warhead designed to tactically destroy space installations." - icon = 'icons/obj/missile.dmi' - icon_state = "photon" - meteordrop = null - ismissile = TRUE - dropamt = 0 - -/obj/effect/meteor/medium/missile - name = "missile" - desc = "Some kind of missile." - icon = 'icons/obj/items/grenades/missile.dmi' - icon_state = ICON_STATE_WORLD - meteordrop = null - ismissile = TRUE - dropamt = 0 - -/obj/effect/meteor/big/missile - name = "high-yield missile" - desc = "Some kind of missile." - icon = 'icons/obj/items/grenades/missile.dmi' - icon_state = ICON_STATE_WORLD - meteordrop = null - ismissile = TRUE - dropamt = 0 - -/obj/effect/meteor/flaming/missile - name = "incendiary missile" - desc = "Some kind of missile." - icon = 'icons/obj/items/grenades/missile.dmi' - icon_state = ICON_STATE_WORLD - meteordrop = null - ismissile = TRUE - dropamt = 0 - -/obj/effect/meteor/emp/missile - name = "ion torpedo" - desc = "Some kind of missile." - icon = 'icons/obj/missile.dmi' - icon_state = "torpedo" - meteordrop = null - ismissile = TRUE - dropamt = 0 \ No newline at end of file diff --git a/code/modules/events/meteors.dm b/code/modules/events/meteors.dm index 37485967fd9..52be544306c 100644 --- a/code/modules/events/meteors.dm +++ b/code/modules/events/meteors.dm @@ -154,4 +154,331 @@ var/global/list/meteors_major = list( if(victim.vessel_size < SHIP_SIZE_SMALL) skill_needed = skill_needed - 1 if(skill >= max(skill_needed, victim.skill_needed)) - return 0 \ No newline at end of file + return 0 + +/////////////////////////////// +//Meteor spawning global procs +/////////////////////////////// + +/proc/spawn_meteors(var/number = 10, var/list/meteortypes, var/startSide, var/zlevel) + for(var/i = 0; i < number; i++) + spawn_meteor(meteortypes, startSide, zlevel) + +/proc/spawn_meteor(var/list/meteortypes, var/startSide, var/zlevel) + var/turf/pickedstart = spaceDebrisStartLoc(startSide, zlevel) + var/turf/pickedgoal = spaceDebrisFinishLoc(startSide, zlevel) + + var/Me = pickweight(meteortypes) + var/obj/effect/meteor/M = new Me(pickedstart) + M.dest = pickedgoal + spawn(0) + walk_towards(M, M.dest, 3) + return + +/proc/spaceDebrisStartLoc(startSide, Z) + var/starty + var/startx + switch(startSide) + if(NORTH) + starty = world.maxy-(TRANSITIONEDGE+1) + startx = rand((TRANSITIONEDGE+1), world.maxx-(TRANSITIONEDGE+1)) + if(EAST) + starty = rand((TRANSITIONEDGE+1),world.maxy-(TRANSITIONEDGE+1)) + startx = world.maxx-(TRANSITIONEDGE+1) + if(SOUTH) + starty = (TRANSITIONEDGE+1) + startx = rand((TRANSITIONEDGE+1), world.maxx-(TRANSITIONEDGE+1)) + if(WEST) + starty = rand((TRANSITIONEDGE+1), world.maxy-(TRANSITIONEDGE+1)) + startx = (TRANSITIONEDGE+1) + var/turf/T = locate(startx, starty, Z) + return T + +/proc/spaceDebrisFinishLoc(startSide, Z) + var/endy + var/endx + switch(startSide) + if(NORTH) + endy = TRANSITIONEDGE + endx = rand(TRANSITIONEDGE, world.maxx-TRANSITIONEDGE) + if(EAST) + endy = rand(TRANSITIONEDGE, world.maxy-TRANSITIONEDGE) + endx = TRANSITIONEDGE + if(SOUTH) + endy = world.maxy-TRANSITIONEDGE + endx = rand(TRANSITIONEDGE, world.maxx-TRANSITIONEDGE) + if(WEST) + endy = rand(TRANSITIONEDGE,world.maxy-TRANSITIONEDGE) + endx = world.maxx-TRANSITIONEDGE + var/turf/T = locate(endx, endy, Z) + return T + +/////////////////////// +//The meteor effect +////////////////////// + +/obj/effect/meteor + name = "meteor" + desc = "You should probably run instead of gawking at this." + icon = 'icons/obj/meteor.dmi' + icon_state = "small" + density = TRUE + anchored = TRUE + var/hits = 4 + var/hitpwr = 2 //Level of ex_act to be called on hit. + var/dest + pass_flags = PASS_FLAG_TABLE + var/heavy = 0 + var/z_original + var/meteordrop = /obj/item/stack/material/ore/iron + var/dropamt = 1 + var/ismissile //missiles don't spin + + var/move_count = 0 + +/obj/effect/meteor/proc/get_shield_damage() + return max(((max(hits, 2)) * (heavy + 1) * rand(30, 60)) / hitpwr , 0) + +/obj/effect/meteor/Initialize() + . = ..() + z_original = z + +/obj/effect/meteor/Initialize() + . = ..() + global.meteor_list += src + +/obj/effect/meteor/Move() + . = ..() //process movement... + move_count++ + if(loc == dest) + qdel(src) + +/obj/effect/meteor/touch_map_edge(var/overmap_id = OVERMAP_ID_SPACE) + if(move_count > TRANSITIONEDGE) + qdel(src) + +/obj/effect/meteor/Destroy() + walk(src,0) //this cancels the walk_towards() proc + global.meteor_list -= src + . = ..() + +/obj/effect/meteor/Initialize() + . = ..() + if(!ismissile) + SpinAnimation() + +/obj/effect/meteor/Bump(atom/A) + ..() + if(A && !QDELETED(src)) // Prevents explosions and other effects when we were deleted by whatever we Bumped() - currently used by shields. + ram_turf(get_turf(A)) + get_hit() //should only get hit once per move attempt + +/obj/effect/meteor/CanPass(atom/movable/mover, turf/target, height=0, air_group=0) + return istype(mover, /obj/effect/meteor) ? 1 : ..() + +/obj/effect/meteor/proc/ram_turf(var/turf/T) + //first bust whatever is in the turf + for(var/atom/A in T) + if(A != src && !A.CanPass(src, src.loc, 0.5, 0)) //only ram stuff that would actually block us + A.explosion_act(hitpwr) + + //then, ram the turf if it still exists + if(T && !T.CanPass(src, src.loc, 0.5, 0)) + T.explosion_act(hitpwr) + +//process getting 'hit' by colliding with a dense object +//or randomly when ramming turfs +/obj/effect/meteor/proc/get_hit() + hits-- + if(hits <= 0) + make_debris() + meteor_effect() + qdel(src) + +/obj/effect/meteor/explosion_act() + SHOULD_CALL_PARENT(FALSE) + return + +/obj/effect/meteor/attackby(obj/item/W, mob/user, params) + if(IS_PICK(W)) + qdel(src) + return + ..() + +/obj/effect/meteor/proc/make_debris() + if(meteordrop && dropamt) + for(var/throws = dropamt, throws > 0, throws--) + addtimer(CALLBACK(new meteordrop(get_turf(src)), TYPE_PROC_REF(/atom/movable, throw_at), dest, 5, 10), 0) + +/obj/effect/meteor/proc/meteor_effect() + if(heavy) + for(var/mob/M in global.player_list) + var/turf/T = get_turf(M) + if(!T || T.z != src.z) + continue + var/dist = get_dist(M.loc, src.loc) + shake_camera(M, (dist > 20 ? 0.5 SECONDS : 1 SECOND), (dist > 20 ? 1 : 3)) + + +/////////////////////// +//Meteor types +/////////////////////// + +//Dust +/obj/effect/meteor/dust + name = "space dust" + icon_state = "dust" + pass_flags = PASS_FLAG_TABLE | PASS_FLAG_GRILLE + hits = 1 + hitpwr = 3 + dropamt = 1 + meteordrop = /obj/item/stack/material/ore/handful/sand + +//Medium-sized +/obj/effect/meteor/medium + name = "meteor" + dropamt = 2 + +/obj/effect/meteor/medium/meteor_effect() + ..() + explosion(src.loc, 0, 1, 2, 3, 0) + +//Large-sized +/obj/effect/meteor/big + name = "large meteor" + icon_state = "large" + hits = 6 + heavy = 1 + dropamt = 3 + +/obj/effect/meteor/big/meteor_effect() + ..() + explosion(src.loc, 1, 2, 3, 4, 0) + +//Flaming meteor +/obj/effect/meteor/flaming + name = "flaming meteor" + icon_state = "flaming" + hits = 5 + heavy = 1 + meteordrop = /obj/item/stack/material/ore/phosphorite + +/obj/effect/meteor/flaming/meteor_effect() + ..() + explosion(src.loc, 1, 2, 3, 4, 0, 0, 5) + +//Radiation meteor +/obj/effect/meteor/irradiated + name = "glowing meteor" + icon_state = "glowing" + heavy = 1 + meteordrop = /obj/item/stack/material/ore/uranium + +/obj/effect/meteor/irradiated/meteor_effect() + ..() + explosion(src.loc, 0, 0, 4, 3, 0) + SSradiation.radiate(src, 50) + +/obj/effect/meteor/golden + name = "golden meteor" + icon_state = "glowing" + desc = "Shiny! But also deadly." + meteordrop = /obj/item/stack/material/ore/gold + +/obj/effect/meteor/silver + name = "silver meteor" + icon_state = "glowing_blue" + desc = "Shiny! But also deadly." + meteordrop = /obj/item/stack/material/ore/silver + +/obj/effect/meteor/emp + name = "conducting meteor" + icon_state = "glowing_blue" + desc = "Hide your floppies!" + meteordrop = /obj/item/stack/material/ore/osmium + dropamt = 2 + +/obj/effect/meteor/emp/meteor_effect() + ..() + // Best case scenario: Comparable to a low-yield EMP grenade. + // Worst case scenario: Comparable to a standard yield EMP grenade. + empulse(src, rand(2, 4), rand(4, 10)) + +/obj/effect/meteor/emp/get_shield_damage() + return ..() * rand(2,4) + +//Station buster Tunguska +/obj/effect/meteor/tunguska + name = "tunguska meteor" + icon_state = "flaming" + desc = "Your life briefly passes before your eyes the moment you lay them on this monstrosity." + hits = 10 + hitpwr = 1 + heavy = 1 + meteordrop = /obj/item/stack/material/ore/diamond // Probably means why it penetrates the hull so easily before exploding. + +/obj/effect/meteor/tunguska/meteor_effect() + ..() + explosion(src.loc, 3, 6, 9, 20, 0) + +// This is the final solution against shields - a single impact can bring down most shield generators. +/obj/effect/meteor/supermatter + name = "supermatter shard" + desc = "Oh god, what will be next..?" + icon = 'icons/obj/supermatter_32.dmi' + icon_state = "supermatter" + +/obj/effect/meteor/supermatter/meteor_effect() + ..() + explosion(src.loc, 1, 2, 3, 4, 0) + for(var/obj/machinery/power/apc/A in range(rand(12, 20), src)) + A.energy_fail(round(10 * rand(8, 12))) + +/obj/effect/meteor/supermatter/get_shield_damage() + return ..() * rand(80, 120) + +//Missiles, for events and so on +/obj/effect/meteor/supermatter/missile + name = "photon torpedo" + desc = "An advanded warhead designed to tactically destroy space installations." + icon = 'icons/obj/missile.dmi' + icon_state = "photon" + meteordrop = null + ismissile = TRUE + dropamt = 0 + +/obj/effect/meteor/medium/missile + name = "missile" + desc = "Some kind of missile." + icon = 'icons/obj/items/grenades/missile.dmi' + icon_state = ICON_STATE_WORLD + meteordrop = null + ismissile = TRUE + dropamt = 0 + +/obj/effect/meteor/big/missile + name = "high-yield missile" + desc = "Some kind of missile." + icon = 'icons/obj/items/grenades/missile.dmi' + icon_state = ICON_STATE_WORLD + meteordrop = null + ismissile = TRUE + dropamt = 0 + +/obj/effect/meteor/flaming/missile + name = "incendiary missile" + desc = "Some kind of missile." + icon = 'icons/obj/items/grenades/missile.dmi' + icon_state = ICON_STATE_WORLD + meteordrop = null + ismissile = TRUE + dropamt = 0 + +/obj/effect/meteor/emp/missile + name = "ion torpedo" + desc = "Some kind of missile." + icon = 'icons/obj/missile.dmi' + icon_state = "torpedo" + meteordrop = null + ismissile = TRUE + dropamt = 0 \ No newline at end of file diff --git a/maps/exodus/exodus.dm b/maps/exodus/exodus.dm index 2059e3b5ec1..c90f7566e38 100644 --- a/maps/exodus/exodus.dm +++ b/maps/exodus/exodus.dm @@ -1,5 +1,7 @@ #if !defined(USING_MAP_DATUM) + #include "../../mods/gamemodes/meteor/_meteor.dme" + #include "../../mods/content/mundane.dm" #include "../../mods/content/bigpharma/_bigpharma.dme" #include "../../mods/content/corporate/_corporate.dme" diff --git a/maps/modpack_testing/modpack_testing.dm b/maps/modpack_testing/modpack_testing.dm index 96bdf94f9e4..929c7b8a181 100644 --- a/maps/modpack_testing/modpack_testing.dm +++ b/maps/modpack_testing/modpack_testing.dm @@ -3,6 +3,8 @@ #include "modpack_testing_lobby.dm" #include "blank.dmm" + #include "../../mods/gamemodes/meteor/_meteor.dme" + #include "../../mods/content/mundane.dm" #include "../../mods/content/scaling_descriptors.dm" diff --git a/mods/gamemodes/meteor/_meteor.dm b/mods/gamemodes/meteor/_meteor.dm new file mode 100644 index 00000000000..c0c8f9fa4a6 --- /dev/null +++ b/mods/gamemodes/meteor/_meteor.dm @@ -0,0 +1,4 @@ +/decl/modpack/meteor + name = "Meteor Gamemode" + +// TODO: Overmap integration? /decl/gamemode/meteor/overmap variant that spawns meteors on the overmap and launches them at the main map? \ No newline at end of file diff --git a/mods/gamemodes/meteor/_meteor.dme b/mods/gamemodes/meteor/_meteor.dme new file mode 100644 index 00000000000..c6ea5b4db8c --- /dev/null +++ b/mods/gamemodes/meteor/_meteor.dme @@ -0,0 +1,7 @@ +#ifndef GAMEMODE_PACK_METEOR +#define GAMEMODE_PACK_METEOR +// BEGIN_INCLUDE +#include "_meteor.dm" +#include "gamemode.dm" +// END_INCLUDE +#endif \ No newline at end of file diff --git a/code/game/gamemodes/meteor/meteor.dm b/mods/gamemodes/meteor/gamemode.dm similarity index 59% rename from code/game/gamemodes/meteor/meteor.dm rename to mods/gamemodes/meteor/gamemode.dm index 35e25dc7f73..10212d20aa9 100644 --- a/code/game/gamemodes/meteor/meteor.dm +++ b/mods/gamemodes/meteor/gamemode.dm @@ -1,33 +1,104 @@ // The following four defines can be used to tweak the difficulty of the gamemode #define METEOR_FAILSAFE_THRESHOLD 45 MINUTES // Failsafe that guarantees Severity will be at least 15 when the round hits this time. +#define METEOR_FORECAST_ALARM_SENT 1 +#define METEOR_ARRIVAL_ALARM_SENT 2 + // In general, a PVE oriented game mode. A middle ground between Extended and actual antagonist based rounds. /decl/game_mode/meteor name = "Meteor" round_description = "You are about to enter an asteroid belt!" extended_round_description = "We are on an unavoidable collision course with an asteroid field. You have only a moment to prepare before you are barraged by dust and meteors. As if it was not enough, all kinds of negative events seem to happen more frequently. Good luck." uid = "meteor" - required_players = 15 // Definitely not good for low-pop - votable = 1 + required_players = 15 // Definitely not good for low-pop + votable = TRUE shuttle_delay = 2 - available_by_default = FALSE + available_by_default = TRUE // if you include this modpack, you know what you're getting into - var/next_wave = INFINITY // Set in post_setup() correctly to take into account potential longer pre-start times. + var/next_wave = INFINITY // Set in post_setup() correctly to take into account potential longer pre-start times. var/alert_sent = 0 - var/meteor_severity = 1 // Slowly increases the tension at the beginning of meteor strikes. Prevents "tunguska on first wave" style problems. + /// Determines which pool meteor spawns are selected from, used to slowly increase the tension as the round progresses. Prevents "tunguska on first wave" style problems. + /// Check get_meteor_types() for specifics. + var/meteor_severity = 1 var/failsafe_triggered = 0 var/alert_title var/alert_text var/start_text var/maximal_severity = 40 - var/meteor_wave_delay = 30 SECONDS //minimum wait between waves in tenths of seconds - var/meteor_grace_period = 15 MINUTES //waves will not arrive until this far into round + /// Minimum wait between waves in tenths of seconds + var/meteor_wave_delay = 30 SECONDS + /// Waves will not arrive until this far into the round + var/meteor_grace_period = 15 MINUTES // Moved these from defines to variables, to allow for in-round tweaking via varedit: var/escalation_probability = 45 - var/send_admin_broadcasts = TRUE // Enables debugging/information mode, sending admin messages when waves occur and when severity escalates. + /// Enables debugging/information mode, sending admin messages when waves occur and when severity escalates. + var/send_admin_broadcasts = TRUE + + // Meteor groups organised in order of increasing severity, used in round progression. + /// Dust, used during the earliest stages of the mode. + var/list/meteors_dust = list(/obj/effect/meteor/dust) + + /// Standard meteors, used during early stages of the mode. + var/list/meteors_normal = list( + /obj/effect/meteor/medium=8, + /obj/effect/meteor/dust=3, + /obj/effect/meteor/irradiated=3, + /obj/effect/meteor/big=3, + /obj/effect/meteor/flaming=1, + /obj/effect/meteor/golden=1, + /obj/effect/meteor/silver=1 + ) + + /// Threatening meteors. + var/list/meteors_threatening = list( + /obj/effect/meteor/big=10, + /obj/effect/meteor/medium=5, + /obj/effect/meteor/golden=3, + /obj/effect/meteor/silver=3, + /obj/effect/meteor/flaming=3, + /obj/effect/meteor/irradiated=3, + /obj/effect/meteor/emp=3 + ) + + /// Catastrophic meteors, pretty dangerous without shields. + var/list/meteors_catastrophic = list( + /obj/effect/meteor/big=75, + /obj/effect/meteor/flaming=10, + /obj/effect/meteor/irradiated=10, + /obj/effect/meteor/emp=10, + /obj/effect/meteor/medium=5, + /obj/effect/meteor/golden=4, + /obj/effect/meteor/silver=4, + /obj/effect/meteor/tunguska=1 + ) + + /// Armageddon meteors, very dangerous. + var/list/meteors_armageddon = list( + /obj/effect/meteor/big=25, + /obj/effect/meteor/flaming=10, + /obj/effect/meteor/irradiated=10, + /obj/effect/meteor/emp=10, + /obj/effect/meteor/medium=3, + /obj/effect/meteor/tunguska=3, + /obj/effect/meteor/golden=2, + /obj/effect/meteor/silver=2 + ) + + /// Cataclysm meteor selection. Very very dangerous and effective even against shields. Used in lategame only. + var/list/meteors_cataclysm = list( + /obj/effect/meteor/big=40, + /obj/effect/meteor/emp=20, + /obj/effect/meteor/tunguska=20, + /obj/effect/meteor/irradiated=10, + /obj/effect/meteor/golden=10, + /obj/effect/meteor/silver=10, + /obj/effect/meteor/flaming=10, + /obj/effect/meteor/supermatter=1 + ) - event_delay_mod_moderate = 0.5 // As a bonus, more frequent events. + // As a bonus, more frequent events. + event_delay_mod_moderate = 0.5 event_delay_mod_major = 0.3 /decl/vv_set_handler/meteor_severity_handler @@ -54,11 +125,11 @@ next_wave = round_duration_in_ticks + meteor_grace_period /decl/game_mode/meteor/proc/on_meteor_warn() - alert_sent = 1 + alert_sent = METEOR_FORECAST_ALARM_SENT command_announcement.Announce(alert_text, alert_title) /decl/game_mode/meteor/proc/on_enter_field() - alert_sent = 2 + alert_sent = METEOR_ARRIVAL_ALARM_SENT command_announcement.Announce(start_text, alert_title) for(var/obj/machinery/shield_diffuser/SD in SSmachines.machinery) SD.meteor_alarm(INFINITY) @@ -77,7 +148,7 @@ if((round_duration_in_ticks >= (next_wave / 2)) && !alert_sent) on_meteor_warn() // And then another one when the meteors start flying around. - if((round_duration_in_ticks >= next_wave) && (alert_sent == 1)) + if((round_duration_in_ticks >= next_wave) && (alert_sent == METEOR_FORECAST_ALARM_SENT)) on_enter_field() if((round_duration_in_ticks >= METEOR_FAILSAFE_THRESHOLD) && (meteor_severity < 15) && !failsafe_triggered) log_and_message_admins("Meteor mode severity failsafe triggered: Severity forced to 15.") @@ -111,7 +182,7 @@ if(40 to INFINITY) return meteors_cataclysm // Just in case we /somehow/ get here (looking at you, varedit) - return meteors_normal + return meteors_dust #undef METEOR_FAILSAFE_THRESHOLD diff --git a/nebula.dme b/nebula.dme index f40b844a618..530099d3463 100644 --- a/nebula.dme +++ b/nebula.dme @@ -788,8 +788,6 @@ #include "code\game\gamemodes\godmode\form_items\starlight_structures.dm" #include "code\game\gamemodes\godmode\form_items\wizard_structures.dm" #include "code\game\gamemodes\heist\heist.dm" -#include "code\game\gamemodes\meteor\meteor.dm" -#include "code\game\gamemodes\meteor\meteors.dm" #include "code\game\gamemodes\mixed\crossfire.dm" #include "code\game\gamemodes\mixed\siege.dm" #include "code\game\gamemodes\mixed\spyvspy.dm" From b2edad5a04f7960799b40681b60307f218c40455 Mon Sep 17 00:00:00 2001 From: NebulaSS13Bot Date: Sun, 16 Jun 2024 04:11:59 +1000 Subject: [PATCH 31/90] Automatic changelog generation for PR #4108 [ci skip] --- html/changelogs/AutoChangeLog-pr-4108.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4108.yml diff --git a/html/changelogs/AutoChangeLog-pr-4108.yml b/html/changelogs/AutoChangeLog-pr-4108.yml new file mode 100644 index 00000000000..9439c18e141 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4108.yml @@ -0,0 +1,4 @@ +author: Penelope Haze +changes: + - {tweak: Meteor is now a votable mode on Exodus. Oh no!!} +delete-after: true From e09a3184d91b2a01d3a14be699108dfd05ff9fc0 Mon Sep 17 00:00:00 2001 From: NebulaSS13Bot Date: Sun, 16 Jun 2024 00:44:28 +0000 Subject: [PATCH 32/90] Automatic changelog generation [ci skip] --- html/changelog.html | 6 ++++++ html/changelogs/.all_changelog.yml | 3 +++ html/changelogs/AutoChangeLog-pr-4108.yml | 4 ---- 3 files changed, 9 insertions(+), 4 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-4108.yml diff --git a/html/changelog.html b/html/changelog.html index ab1f46416b3..c3fc308f3ef 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -52,6 +52,12 @@ -->
+

16 June 2024

+

Penelope Haze updated:

+
    +
  • Meteor is now a votable mode on Exodus. Oh no!!
  • +
+

13 June 2024

NataKilar updated:

    diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index 732862916f2..5bfcbb5f909 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -14763,3 +14763,6 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. 2024-06-13: NataKilar: - bugfix: Fixed space tiles not creating vacuums in certain conditions +2024-06-16: + Penelope Haze: + - tweak: Meteor is now a votable mode on Exodus. Oh no!! diff --git a/html/changelogs/AutoChangeLog-pr-4108.yml b/html/changelogs/AutoChangeLog-pr-4108.yml deleted file mode 100644 index 9439c18e141..00000000000 --- a/html/changelogs/AutoChangeLog-pr-4108.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: Penelope Haze -changes: - - {tweak: Meteor is now a votable mode on Exodus. Oh no!!} -delete-after: true From 6dec5b6dbd90cf86b815d8425452c33816d2e047 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sun, 16 Jun 2024 12:07:59 +1000 Subject: [PATCH 33/90] Fixing issues with mob holders. --- code/modules/mob_holder/holder_mobs.dm | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/code/modules/mob_holder/holder_mobs.dm b/code/modules/mob_holder/holder_mobs.dm index eeed2d5f4b2..53e5a9743ac 100644 --- a/code/modules/mob_holder/holder_mobs.dm +++ b/code/modules/mob_holder/holder_mobs.dm @@ -35,7 +35,8 @@ to_chat(initiator, "You scoop up \the [src]!") to_chat(src, "\The [initiator] scoops you up!") - src.forceMove(H) + forceMove(H) + reset_offsets(0) target.status_flags |= PASSEMOTES H.sync(src) @@ -46,6 +47,9 @@ return FALSE if(QDELETED(scooper) || QDELETED(src)) return FALSE - if(!CanPhysicallyInteract(scooper)) + if(istype(loc, /obj/item/holder)) + if(loc.CanUseTopicPhysical(scooper) != STATUS_INTERACTIVE) + return FALSE + else if(!CanPhysicallyInteract(scooper)) return FALSE return !!holder_type && scooper.mob_size > src.mob_size From 6727e3157e00fa88141787ba3c0076d6c6caa896 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sun, 16 Jun 2024 12:10:00 +1000 Subject: [PATCH 34/90] Fixing flickering salmon inhand. --- icons/mob/simple_animal/fish_salmon.dmi | Bin 1983 -> 1957 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/icons/mob/simple_animal/fish_salmon.dmi b/icons/mob/simple_animal/fish_salmon.dmi index 4226c4cb46e24e3fb20d19934df9f059ca4e8a03..56e77249b1fb82420fc9567323ec2948fec32213 100644 GIT binary patch delta 1838 zcmV+}2hsSy52X)~7Yd*V0{{R3ZT6FIks*11uzFNjbVOxyV{&P5bZKvH004NLebB)Q zfh6%+fKNqFQE(L#) zb;>m2DE6BzXRSgn`(~GNCQ03;|2EEpr#=R)u^I!;P+2!1&TbZJ`eh^y-5{c|W-La3 zf{9HgHkpq;z=H1Hv@oCkcO{2tqUE!O#wZk5gI(;j@s+J4Gz&McOT8*Xk(b%{#1B&2 zVZr$$n+E^@20BSZK~#90?OTU(<2Vd8ShmHH?By1(lKlT~9!T4fA{Kx}CufE)o6M|8 zp|FX301tcJQNB~{GP4@yfN^FZjY+dA;= z`?pjvLqABZAZq^)6!2q951!OhqLiUu91{b`Hh|o;3&iu&b3#0=UmTy0iCHv^I0nZd zWdcOIk1D+DPuNH6KdGZil%K}4I*+G>0FW}ijwB1O7NY)ycvAnMEaDY@Isrd_;{tF7 z;g1Oy8dsR|;NwA0 z&su^r*ckT>aRAQ+b1#8w&D%?D^e+V*69WFi1=pwx{9Oq!w#kiB27e{Cv&6qp?3eW-f zqx5Z@t4Ygg_5koddQ!Jp;Of~Q&w*0?@1VLU*2M-_7dL&czed9gXt{KMK)Odpy;lN! z#dDxk{~fGJ5}YCi%=BUatc8Hfy@3f0UcC2$4-9@F!1{;vUMAx&ROR~b0?1`5xy+#p zXcf95rT6N0pRrj=ZnkPs zt)JYkLVCMf3sOI^-6juz47f&YX+M2nAr3smkquzILud{9$e2EIrVq_vHvya4&p5Ob zhyFBe0rAs*E0DAaLAwyd(bncu`VTbm_4xSg_IGr2Yzf8+v2}c*3XBik=JACZaJCwo z#}}$VZ}zs2FI0lsZf_o6IFJ*ODz4@CE8`1pvy>FDF~46MU%2vr`#xiHg@Nt){kr(V z1MvGb`g8gHYzGM9szN_p9n9nRLle4&-_O@St99Ly$?t~_N5%X;n0)x4peKgu(9zLs%$T<;EA3T=sz0OMZWv!u-B{KJ)wjidM|;qcQpM zg%3U8zP@*U-&g`a#P8dZncoLk_dqefujEocGrj<`1MlnMbVpeIy4W+Ml;2mkZ*Nw7 z!7LnT25PGiNo9!bUD7bI#jXP6W{pTD*&Qr?|B<;hPC`eeg6K=sLtQt8P)mwd!sskzcRj1 zjRyRFReYfqZTS82_(C=IzCTcnz4-lRDCGB>#TQ!GU%>A-i!U^AporgZ7GJ1FA-~@& zzEF+A{QYKs@r7EH^82mg3luv|mY4GTjp7T*_yD8)P|ojH#}}v@AXND~cDg?hx`Xp7 zUx8b`FmRvy1HoHRuk#e4$`|(4=I<9f;N3&R7G{?(?5oY+FLfY&6Og_s_-MKdqaKxejQTh2~PR$`TNO#j4ehvM@7xc4Dm!-93yRRXHbcW zjKsx`j*gCwj*gCwj*gBM9wSw z#d}YGc=UDHte}Qq54iWo=tvY|;0>a{0OirwVY7VbNJTfWhWgcb@cWQMU&qYypk<_u z6H_}6=z;$Dgh5|N&GKN$OC2f*v|J&?u+~7+*HN>4=tHEY-*RP0*%GI(qh^IPM4tOC zR|GAi8j|#NweE~wBm^bOwxq99E!PfP(%1iggZUjD9UUDV9UUDV9UUDz;Bn#?We^z| z(GL`?nZc)S5pj-fKi?vpei$*1+(v&6JB`LH>NUoZ-=Y*n5vE#XP_JW@BNv0^_?ywt zd1ykt3cD6$jmCy(M7?IN2kp>|dS!=l8lx5U$`0i;N1Nv7hjJbi?MC8W$O+{4M90C=fL^6ha0m~d9G?!Tq^oP z>!i`_$o88pC7tA63}Kg3B2eCi{|4v5<6xuCSj8hsxU_DBD7jf^@#i@z=tm-%G{aJV zju5a}z-II611zZijSKz!e=9pA0WF>_Xd^kh8s4W)8Q<7OfL_?VPO23$T#yW+F)Qn0 z`soKT^kqy4u9#H-00vJfG34hKQ_0BqcdQmTc2g|um%kAPzzz$6<{*4j-Y_+r20iaGYdSZz}g zDEoEW0KR?ymMdo12W<@`{r`at{Ma&rC-amkW!P88%mDHiKyTUw>iOw8(>!fo9iNYx zyQu4N4E9~l1xR)uRd~0b@sGBDGDnjsKlNvG?oXKpK1zV;uf! zyv`c`x@8qSh<&54wcPEbHumR#=Nrhh(EYo>cewmp4pQ_8{2v6p_aT_YQ1MR}@4k=0 zlgm|q$S-$mA?*{(ZSsWy=ZG!+r(alz7aro34Pd!KXbt_!n1AKW zzchni1Z?U*Cej+kbc{51u2^lvI`*`ZS6i~|3C|0kI!fKUl4>XVayO)=NGDA zJm@yhFVw(UYHXfgsDfVXZJ%GLgj#NIo?keSHzHMBtM6Cl7skbZQnrDO_5IrX!d2f7 z6`Ly#w%7OT@(T~3@7LI0tM9K4fDo=K?87y{b^3nnhOW`~*V~`Wj@`0S-;cc<73=%p z*4uYe1-v(%o9X))VpQM9$HUZ;rckKj@UcuZKzB_r1MzgrV<8Q&`xtS({%ldfo%p&h`Cai0k|Q z_@wWLGg`5}kIt;mFMQ~M@#%Zl_njB;WBR@?ne=^tWe*hV`$o_0GxG~D1@Jx}4tL__ zm&Ji2rTV_PJ$qN>7u+m>W>8Co#8!sX+9i)mO?DNKi#1|@Gs*6-^!-QH);JrIavQ34 zhw;jo-O{!{oK1PTO@+I|+7|iPgNP$sJ+S|RAneX(pCMZ8-`|x6`}g;ye*gZ?RPW#4 znd<%fdsDrCzcRm2O#^+uD!))m8-2e#zfjHI-w#x?m%iVOLVdqkexZf`1^Rxo{6d2O ziuCUUaIdm$}eQ|1B~)RxxQbWU!cAK zp~~Oc>HC4$H#o2Q6}aUy2lx4YAo>;5>vW4ygOv-oIZ2^(`jjTg^Mw`}fPBzJ_IdEqkMXe*bH-4{`FhPpp)M}3`Ua8%QT1=^_5)v-@-;gG z?5@~<(edD0A_Bau?B;_bJo!5AR@6eY2gdXJ>*JzymDpa zd`ZjKNw;Da634?USA^9`3t9QP+V+ZGBpS+plx-`aoD8p3C3hA{^ zYUHZ(8hfek$idX*Uux z_hL;d=Rx`G{tJR22!bF8f*=TjAP9mW2!bF8S^fhlNrFZj<0Cr&0000 Date: Sun, 16 Jun 2024 12:13:33 +1000 Subject: [PATCH 35/90] Reduces worm compost hunger amount. --- code/game/objects/structures/compost.dm | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/code/game/objects/structures/compost.dm b/code/game/objects/structures/compost.dm index 5d92998565f..35913794a14 100644 --- a/code/game/objects/structures/compost.dm +++ b/code/game/objects/structures/compost.dm @@ -1,6 +1,7 @@ /// The number of worms influences the rate at which contents are decomposed into compost. -var/global/const/COMPOST_WORM_EAT_AMOUNT = 50 -var/global/const/COMPOST_MAX_WORMS = 10 +var/global/const/COMPOST_WORM_EAT_AMOUNT = 50 +var/global/const/COMPOST_MAX_WORMS = 10 +var/global/const/COMPOST_WORM_HUNGER_FACTOR = MINIMUM_CHEMICAL_VOLUME /obj/structure/reagent_dispensers/compost_bin name = "compost bin" @@ -186,7 +187,7 @@ var/global/const/COMPOST_MAX_WORMS = 10 if(compost_amount > 0) // Worms gotta eat... if(worms_are_hungry) - reagents.remove_reagent(/decl/material/liquid/fertilizer/compost, worm_drink_amount * 0.025) + reagents.remove_reagent(/decl/material/liquid/fertilizer/compost, worm_drink_amount * WORM_HUNGER_FACTOR) if(prob(1) && worms < COMPOST_MAX_WORMS) var/obj/item/chems/food/worm/worm = new(src) if(!storage.handle_item_insertion(null, worm)) From d8c819b7c6fa56a4426fc882bd1fbc51f2cd72fa Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sun, 16 Jun 2024 12:21:08 +1000 Subject: [PATCH 36/90] Natural floors cannot be engraved by default. --- code/game/objects/structures/compost.dm | 2 +- code/game/turfs/floors/natural/_natural.dm | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/code/game/objects/structures/compost.dm b/code/game/objects/structures/compost.dm index 35913794a14..157a761128c 100644 --- a/code/game/objects/structures/compost.dm +++ b/code/game/objects/structures/compost.dm @@ -187,7 +187,7 @@ var/global/const/COMPOST_WORM_HUNGER_FACTOR = MINIMUM_CHEMICAL_VOLUME if(compost_amount > 0) // Worms gotta eat... if(worms_are_hungry) - reagents.remove_reagent(/decl/material/liquid/fertilizer/compost, worm_drink_amount * WORM_HUNGER_FACTOR) + reagents.remove_reagent(/decl/material/liquid/fertilizer/compost, worm_drink_amount * COMPOST_WORM_HUNGER_FACTOR) if(prob(1) && worms < COMPOST_MAX_WORMS) var/obj/item/chems/food/worm/worm = new(src) if(!storage.handle_item_insertion(null, worm)) diff --git a/code/game/turfs/floors/natural/_natural.dm b/code/game/turfs/floors/natural/_natural.dm index 4a7d2910149..25b039c740e 100644 --- a/code/game/turfs/floors/natural/_natural.dm +++ b/code/game/turfs/floors/natural/_natural.dm @@ -14,6 +14,8 @@ base_icon_state = "0" base_color = null + can_engrave = FALSE + var/dirt_color = "#7c5e42" var/possible_states = 0 var/icon_edge_layer = -1 From 848b7b153d72ee7d0b8db58d1921a7ae21166bdf Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sun, 16 Jun 2024 12:27:01 +1000 Subject: [PATCH 37/90] Added a wooden table frame recipe to planks. --- code/modules/crafting/stack_recipes/recipes_planks.dm | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/code/modules/crafting/stack_recipes/recipes_planks.dm b/code/modules/crafting/stack_recipes/recipes_planks.dm index 97c4a450e57..bf02340a893 100644 --- a/code/modules/crafting/stack_recipes/recipes_planks.dm +++ b/code/modules/crafting/stack_recipes/recipes_planks.dm @@ -176,3 +176,8 @@ /decl/stack_recipe/planks/furniture/barrel result_type = /obj/structure/reagent_dispensers/barrel difficulty = MAT_VALUE_HARD_DIY + +/decl/stack_recipe/planks/furniture/table_frame + result_type = /obj/structure/table/frame + category = "furniture" + difficulty = MAT_VALUE_HARD_DIY From ef4dff4b55c060771b53e872b44eb0566cee5747 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sun, 16 Jun 2024 12:30:03 +1000 Subject: [PATCH 38/90] Drying racks can't work in fluids or rain. --- code/game/objects/structures/drying_rack.dm | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/code/game/objects/structures/drying_rack.dm b/code/game/objects/structures/drying_rack.dm index 123ac0641b8..bbcf96ba0d0 100644 --- a/code/game/objects/structures/drying_rack.dm +++ b/code/game/objects/structures/drying_rack.dm @@ -20,6 +20,14 @@ /obj/structure/drying_rack/Process() if(!drying) return + + var/decl/state/weather/weather_state = weather?.weather_system?.current_state + if(istype(weather_state) && weather_state.is_liquid) + return // can't dry in the rain + + if(loc?.is_flooded(TRUE)) + return // can't dry in the wet + var/dry_product = drying?.dry_out(src) if(dry_product) if(drying != dry_product) From db62f20be16714c7fec809d54d4b56b4d1f02949 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sun, 16 Jun 2024 12:31:56 +1000 Subject: [PATCH 39/90] Replaces some out of place props on Shaded Hills. --- maps/shaded_hills/shaded_hills-grassland.dmm | 4 ++-- maps/shaded_hills/shaded_hills-woods.dmm | 2 +- maps/shaded_hills/submaps/woods/bear_den/bear_den.dmm | 2 +- maps/shaded_hills/submaps/woods/hunter_camp/hunter_camp.dmm | 2 +- maps/shaded_hills/submaps/woods/old_cabin/old_cabin.dmm | 2 +- .../submaps/woods/suspicious_cabin/suspicious_cabin.dmm | 2 +- 6 files changed, 7 insertions(+), 7 deletions(-) diff --git a/maps/shaded_hills/shaded_hills-grassland.dmm b/maps/shaded_hills/shaded_hills-grassland.dmm index 2d15d1952d7..db47baa5a25 100644 --- a/maps/shaded_hills/shaded_hills-grassland.dmm +++ b/maps/shaded_hills/shaded_hills-grassland.dmm @@ -71,7 +71,7 @@ "kr" = ( /obj/structure/closet/crate/chest, /obj/item/tool/pickaxe/iron, -/obj/item/tool/axe/hatchet, +/obj/item/tool/axe, /obj/abstract/exterior_marker/inside, /turf/floor/woven, /area/shaded_hills/outside) @@ -96,7 +96,7 @@ /area/shaded_hills/caves) "mG" = ( /obj/structure/bed/chair/bench/ebony, -/obj/item/knife/utility, +/obj/item/bladed/folding, /obj/abstract/landmark/start/shaded_hills/miner, /turf/floor/natural/barren, /area/shaded_hills/outside) diff --git a/maps/shaded_hills/shaded_hills-woods.dmm b/maps/shaded_hills/shaded_hills-woods.dmm index 48c711f86a2..9d2af2d4755 100644 --- a/maps/shaded_hills/shaded_hills-woods.dmm +++ b/maps/shaded_hills/shaded_hills-woods.dmm @@ -9,7 +9,7 @@ /area/shaded_hills/outside/woods) "cN" = ( /obj/structure/table/woodentable/ebony, -/obj/item/knife/kitchen, +/obj/item/bladed/knife, /turf/floor/wood/ebony, /area/shaded_hills/forester_hut) "dp" = ( diff --git a/maps/shaded_hills/submaps/woods/bear_den/bear_den.dmm b/maps/shaded_hills/submaps/woods/bear_den/bear_den.dmm index b0ab07b1d98..cebf783cb01 100644 --- a/maps/shaded_hills/submaps/woods/bear_den/bear_den.dmm +++ b/maps/shaded_hills/submaps/woods/bear_den/bear_den.dmm @@ -22,7 +22,7 @@ /turf/floor/natural/dirt, /area/shaded_hills/outside/point_of_interest/bear_den) "w" = ( -/obj/item/knife, +/obj/item/bladed/knife, /obj/item/cash/imperial/crown, /obj/item/cash/imperial/crown, /obj/item/cash/imperial/quin, diff --git a/maps/shaded_hills/submaps/woods/hunter_camp/hunter_camp.dmm b/maps/shaded_hills/submaps/woods/hunter_camp/hunter_camp.dmm index 4e05687fb3c..b13b7d1214f 100644 --- a/maps/shaded_hills/submaps/woods/hunter_camp/hunter_camp.dmm +++ b/maps/shaded_hills/submaps/woods/hunter_camp/hunter_camp.dmm @@ -85,7 +85,7 @@ /turf/floor/natural/barren, /area/shaded_hills/outside/point_of_interest/hunter_camp) "Z" = ( -/obj/item/knife, +/obj/item/bladed/knife, /turf/floor/natural/barren, /area/shaded_hills/outside/point_of_interest/hunter_camp) diff --git a/maps/shaded_hills/submaps/woods/old_cabin/old_cabin.dmm b/maps/shaded_hills/submaps/woods/old_cabin/old_cabin.dmm index 31ee2d0a21c..96d949d2540 100644 --- a/maps/shaded_hills/submaps/woods/old_cabin/old_cabin.dmm +++ b/maps/shaded_hills/submaps/woods/old_cabin/old_cabin.dmm @@ -57,7 +57,7 @@ /area/shaded_hills/outside/point_of_interest/old_cabin) "H" = ( /obj/structure/table/woodentable/ebony, -/obj/item/knife, +/obj/item/bladed/knife, /obj/item/chems/food/grown/potato, /obj/item/chems/food/grown/potato, /obj/item/chems/food/grown/carrot, diff --git a/maps/shaded_hills/submaps/woods/suspicious_cabin/suspicious_cabin.dmm b/maps/shaded_hills/submaps/woods/suspicious_cabin/suspicious_cabin.dmm index d83d0ef38c7..0d2427bf746 100644 --- a/maps/shaded_hills/submaps/woods/suspicious_cabin/suspicious_cabin.dmm +++ b/maps/shaded_hills/submaps/woods/suspicious_cabin/suspicious_cabin.dmm @@ -43,7 +43,7 @@ /area/template_noop) "t" = ( /obj/structure/table/woodentable/ebony, -/obj/item/knife, +/obj/item/bladed/knife, /turf/floor/natural/path/basalt, /area/template_noop) "v" = ( From 708cf78d9ee965361541d8baec5358b480044cf3 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sun, 16 Jun 2024 12:35:32 +1000 Subject: [PATCH 40/90] Fixing compile errors with weather checking on drying racks. --- code/game/objects/structures/drying_rack.dm | 9 +++++---- code/modules/reagents/Chemistry-Holder.dm | 1 + 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/code/game/objects/structures/drying_rack.dm b/code/game/objects/structures/drying_rack.dm index bbcf96ba0d0..7cec42d26fe 100644 --- a/code/game/objects/structures/drying_rack.dm +++ b/code/game/objects/structures/drying_rack.dm @@ -21,10 +21,11 @@ if(!drying) return - var/decl/state/weather/weather_state = weather?.weather_system?.current_state - if(istype(weather_state) && weather_state.is_liquid) - return // can't dry in the rain - + if(isturf(loc)) + var/turf/my_turf = loc + var/decl/state/weather/weather_state = my_turf.weather?.weather_system?.current_state + if(istype(weather_state) && weather_state.is_liquid) + return // can't dry in the rain if(loc?.is_flooded(TRUE)) return // can't dry in the wet diff --git a/code/modules/reagents/Chemistry-Holder.dm b/code/modules/reagents/Chemistry-Holder.dm index f5da9eb6233..72279bfa69b 100644 --- a/code/modules/reagents/Chemistry-Holder.dm +++ b/code/modules/reagents/Chemistry-Holder.dm @@ -654,6 +654,7 @@ var/global/obj/temp_reagents_holder = new trans_to_holder(target.reagents, amount, multiplier, copy, defer_update = defer_update) // Deferred updates are presumably being done by SSfluids. // Do an immediate fluid_act call rather than waiting for SSfluids to proc. + world << "honk" if(!defer_update) target.fluid_act(target.reagents) From 81d2434c1b68f474d732bbf85f72ee495e34090a Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sun, 16 Jun 2024 12:39:01 +1000 Subject: [PATCH 41/90] Lowers the fluid amount needed to turn dirt into mud. --- code/game/turfs/floors/natural/natural_dirt.dm | 2 +- code/game/turfs/floors/natural/natural_mud.dm | 2 +- code/modules/reagents/Chemistry-Holder.dm | 1 - 3 files changed, 2 insertions(+), 3 deletions(-) diff --git a/code/game/turfs/floors/natural/natural_dirt.dm b/code/game/turfs/floors/natural/natural_dirt.dm index 91ca2198c36..46ca4824538 100644 --- a/code/game/turfs/floors/natural/natural_dirt.dm +++ b/code/game/turfs/floors/natural/natural_dirt.dm @@ -14,7 +14,7 @@ return 1 /turf/floor/natural/dirt/fluid_act(var/datum/reagents/fluids) - if(fluids?.total_volume < FLUID_SHALLOW) + if(fluids?.total_volume < FLUID_PUDDLE) return ..() var/turf/new_turf = ChangeTurf(/turf/floor/natural/mud, keep_air = TRUE, keep_height = TRUE) return new_turf.fluid_act(fluids) diff --git a/code/game/turfs/floors/natural/natural_mud.dm b/code/game/turfs/floors/natural/natural_mud.dm index 63ecba4907b..e129a3ba14d 100644 --- a/code/game/turfs/floors/natural/natural_mud.dm +++ b/code/game/turfs/floors/natural/natural_mud.dm @@ -69,7 +69,7 @@ return 0.0 /turf/floor/natural/dry/fluid_act(datum/reagents/fluids) - if(fluids?.total_volume < FLUID_SHALLOW) + if(fluids?.total_volume < FLUID_PUDDLE) return ..() var/turf/new_turf = ChangeTurf(/turf/floor/natural/mud, keep_air = TRUE, keep_height = TRUE) return new_turf.fluid_act(fluids) diff --git a/code/modules/reagents/Chemistry-Holder.dm b/code/modules/reagents/Chemistry-Holder.dm index 72279bfa69b..f5da9eb6233 100644 --- a/code/modules/reagents/Chemistry-Holder.dm +++ b/code/modules/reagents/Chemistry-Holder.dm @@ -654,7 +654,6 @@ var/global/obj/temp_reagents_holder = new trans_to_holder(target.reagents, amount, multiplier, copy, defer_update = defer_update) // Deferred updates are presumably being done by SSfluids. // Do an immediate fluid_act call rather than waiting for SSfluids to proc. - world << "honk" if(!defer_update) target.fluid_act(target.reagents) From 1e356740564726d48ed21db8cbb96ef7e51e47dc Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sun, 16 Jun 2024 12:44:08 +1000 Subject: [PATCH 42/90] Hammers can now be used to unanchor objects. --- code/game/machinery/jukebox.dm | 4 ++-- code/game/machinery/vending/_vending.dm | 6 +++--- code/game/objects/objs.dm | 12 ++++++++---- .../components/binary_devices/binary_atmos_base.dm | 2 +- .../components/binary_devices/pipeturbine.dm | 2 +- code/modules/fabrication/fabricator_intake.dm | 2 +- code/modules/fabrication/fabricator_pipe.dm | 2 +- 7 files changed, 17 insertions(+), 13 deletions(-) diff --git a/code/game/machinery/jukebox.dm b/code/game/machinery/jukebox.dm index 51e67f598eb..aad9c1c3188 100644 --- a/code/game/machinery/jukebox.dm +++ b/code/game/machinery/jukebox.dm @@ -154,9 +154,9 @@ qdel(src) /obj/machinery/media/jukebox/attackby(obj/item/W, mob/user) - if(IS_WRENCH(W) && !panel_open) + if((IS_WRENCH(W) || IS_HAMMER(W)) && !panel_open) add_fingerprint(user) - wrench_floor_bolts(user, 0) + wrench_floor_bolts(user, 0, W) power_change() return return ..() diff --git a/code/game/machinery/vending/_vending.dm b/code/game/machinery/vending/_vending.dm index e10d32215be..dcd978ded68 100644 --- a/code/game/machinery/vending/_vending.dm +++ b/code/game/machinery/vending/_vending.dm @@ -88,7 +88,7 @@ build_inventory(populate_parts) return INITIALIZE_HINT_LATELOAD - + /obj/machinery/vending/LateInitialize() ..() update_icon() @@ -181,8 +181,8 @@ return TRUE if((. = component_attackby(W, user))) return - if((obj_flags & OBJ_FLAG_ANCHORABLE) && IS_WRENCH(W)) - wrench_floor_bolts(user) + if((obj_flags & OBJ_FLAG_ANCHORABLE) && (IS_WRENCH(W) || IS_HAMMER(W))) + wrench_floor_bolts(user, null, W) power_change() return diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm index 531d9b598e3..767b6907fb7 100644 --- a/code/game/objects/objs.dm +++ b/code/game/objects/objs.dm @@ -129,14 +129,18 @@ . |= DAM_LASER /obj/attackby(obj/item/O, mob/user) - if((obj_flags & OBJ_FLAG_ANCHORABLE) && IS_WRENCH(O)) - wrench_floor_bolts(user) + if((obj_flags & OBJ_FLAG_ANCHORABLE) && (IS_WRENCH(O) || IS_HAMMER(O))) + wrench_floor_bolts(user, null, O) update_icon() return TRUE return ..() -/obj/proc/wrench_floor_bolts(mob/user, delay=20) - playsound(loc, 'sound/items/Ratchet.ogg', 100, 1) +/obj/proc/wrench_floor_bolts(mob/user, delay = 2 SECONDS, obj/item/tool) + if(!istype(tool) || IS_WRENCH(tool)) + playsound(loc, 'sound/items/Ratchet.ogg', 100, 1) + else if(IS_HAMMER(tool)) + playsound(loc, 'sound/weapons/Genhit.ogg', 100, 1) + if(anchored) user.visible_message("\The [user] begins unsecuring \the [src] from the floor.", "You start unsecuring \the [src] from the floor.") else diff --git a/code/modules/atmospherics/components/binary_devices/binary_atmos_base.dm b/code/modules/atmospherics/components/binary_devices/binary_atmos_base.dm index 3a52c06d259..bd58d0d112f 100644 --- a/code/modules/atmospherics/components/binary_devices/binary_atmos_base.dm +++ b/code/modules/atmospherics/components/binary_devices/binary_atmos_base.dm @@ -30,7 +30,7 @@ return TRUE // Will only be used if you set the anchorable obj flag. -/obj/machinery/atmospherics/binary/wrench_floor_bolts(user) +/obj/machinery/atmospherics/binary/wrench_floor_bolts(mob/user, delay = 2 SECONDS, obj/item/tool) . = ..() if(anchored) set_dir(dir) // making sure diff --git a/code/modules/atmospherics/components/binary_devices/pipeturbine.dm b/code/modules/atmospherics/components/binary_devices/pipeturbine.dm index 50577bfd646..e72a09e8d18 100644 --- a/code/modules/atmospherics/components/binary_devices/pipeturbine.dm +++ b/code/modules/atmospherics/components/binary_devices/pipeturbine.dm @@ -99,7 +99,7 @@ if (turbine.stat & (BROKEN) || !turbine.anchored || turn(turbine.dir,180) != dir) turbine = null -/obj/machinery/turbinemotor/wrench_floor_bolts(user) +/obj/machinery/turbinemotor/wrench_floor_bolts(mob/user, delay = 2 SECONDS, obj/item/tool) . = ..() updateConnection() diff --git a/code/modules/fabrication/fabricator_intake.dm b/code/modules/fabrication/fabricator_intake.dm index b7e65173c5b..5af01117dbe 100644 --- a/code/modules/fabrication/fabricator_intake.dm +++ b/code/modules/fabrication/fabricator_intake.dm @@ -97,7 +97,7 @@ if(panel_open && (IS_MULTITOOL(O) || IS_WIRECUTTER(O))) attack_hand_with_interaction_checks(user) return TRUE - if((obj_flags & OBJ_FLAG_ANCHORABLE) && IS_WRENCH(O)) + if((obj_flags & OBJ_FLAG_ANCHORABLE) && (IS_WRENCH(O) || IS_HAMMER(O))) return ..() if(stat & (NOPOWER | BROKEN)) return diff --git a/code/modules/fabrication/fabricator_pipe.dm b/code/modules/fabrication/fabricator_pipe.dm index b378f098ba7..92b988cb55a 100644 --- a/code/modules/fabrication/fabricator_pipe.dm +++ b/code/modules/fabrication/fabricator_pipe.dm @@ -19,7 +19,7 @@ return STATUS_CLOSE return ..() -/obj/machinery/fabricator/pipe/wrench_floor_bolts() +/obj/machinery/fabricator/pipe/wrench_floor_bolts(mob/user, delay = 2 SECONDS, obj/item/tool) ..() update_use_power(anchored ? POWER_USE_IDLE : POWER_USE_OFF) From 3fa3340df3d8ecaa230d2d8ba532775500562604 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sun, 16 Jun 2024 12:45:36 +1000 Subject: [PATCH 43/90] Textiles structures can now be unanchored. --- code/modules/crafting/textiles/_textiles.dm | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/code/modules/crafting/textiles/_textiles.dm b/code/modules/crafting/textiles/_textiles.dm index 705725e21b6..3e3c2b41bd6 100644 --- a/code/modules/crafting/textiles/_textiles.dm +++ b/code/modules/crafting/textiles/_textiles.dm @@ -1,14 +1,15 @@ /obj/structure/textiles - abstract_type = /obj/structure/textiles - icon_state = ICON_STATE_WORLD - anchored = TRUE - density = TRUE - material = /decl/material/solid/organic/wood + abstract_type = /obj/structure/textiles + icon_state = ICON_STATE_WORLD + anchored = TRUE + density = TRUE + material = /decl/material/solid/organic/wood material_alteration = MAT_FLAG_ALTERATION_COLOR | MAT_FLAG_ALTERATION_NAME | MAT_FLAG_ALTERATION_DESC + obj_flags = OBJ_FLAG_ANCHORABLE - var/tmp/working = FALSE - var/work_skill = SKILL_CONSTRUCTION + var/tmp/working = FALSE + var/work_skill = SKILL_CONSTRUCTION var/product_type var/datum/composite_sound/work_sound From 41795ad673b29366aa016e413e28af854445db57 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sun, 16 Jun 2024 12:48:20 +1000 Subject: [PATCH 44/90] Plants now drop extracted seeds instead of packeted seeds. --- code/game/objects/structures/flora/plant.dm | 2 +- code/modules/hydroponics/seed.dm | 2 +- code/modules/hydroponics/trays/tray.dm | 2 +- code/modules/hydroponics/trays/tray_soil.dm | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/code/game/objects/structures/flora/plant.dm b/code/game/objects/structures/flora/plant.dm index 7d49a97b5ed..133f8e1017d 100644 --- a/code/game/objects/structures/flora/plant.dm +++ b/code/game/objects/structures/flora/plant.dm @@ -38,7 +38,7 @@ var/fail_chance = user ? user.skill_fail_chance(SKILL_BOTANY, 30, SKILL_ADEPT) : 30 if(!prob(fail_chance)) for(var/i = 1 to rand(1,3)) - new /obj/item/seeds(loc, null, plant) + new /obj/item/seeds/extracted(loc, null, plant) return ..() /obj/structure/flora/plant/Initialize(ml, _mat, _reinf_mat, datum/seed/_plant) diff --git a/code/modules/hydroponics/seed.dm b/code/modules/hydroponics/seed.dm index 549a6948a70..54af40396c3 100644 --- a/code/modules/hydroponics/seed.dm +++ b/code/modules/hydroponics/seed.dm @@ -583,7 +583,7 @@ update_growth_stages() //Place the plant products at the feet of the user. -/datum/seed/proc/harvest(var/mob/user,var/yield_mod,var/harvest_sample,var/force_amount) +/datum/seed/proc/harvest(var/mob/user, var/yield_mod, var/harvest_sample, var/force_amount) if(!user) return FALSE diff --git a/code/modules/hydroponics/trays/tray.dm b/code/modules/hydroponics/trays/tray.dm index 9986843208a..c43a5f49272 100644 --- a/code/modules/hydroponics/trays/tray.dm +++ b/code/modules/hydroponics/trays/tray.dm @@ -260,7 +260,7 @@ check_plant_health() //Harvests the product of a plant. -/obj/machinery/portable_atmospherics/hydroponics/proc/harvest(var/mob/user) +/obj/machinery/portable_atmospherics/hydroponics/proc/harvest(mob/user) //Harvest the product of the plant, if(!seed || !harvest) diff --git a/code/modules/hydroponics/trays/tray_soil.dm b/code/modules/hydroponics/trays/tray_soil.dm index ec1eec2a61e..64a48f1df5c 100644 --- a/code/modules/hydroponics/trays/tray_soil.dm +++ b/code/modules/hydroponics/trays/tray_soil.dm @@ -166,7 +166,7 @@ ..() qdel(src) -/obj/machinery/portable_atmospherics/hydroponics/soil/invisible/harvest() +/obj/machinery/portable_atmospherics/hydroponics/soil/invisible/harvest(mob/user) ..() if(!seed) // Repeat harvests are a thing. qdel(src) From f4f8c210a57da7bd73a228b7feffd6c4eee61ea2 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sun, 16 Jun 2024 12:54:03 +1000 Subject: [PATCH 45/90] Compost bins and wells should behave a bit more sanely. --- code/game/objects/structures/compost.dm | 9 ++++++--- code/game/objects/structures/well.dm | 15 ++++++++------- code/modules/reagents/reagent_dispenser.dm | 16 ++++++++++++++-- 3 files changed, 28 insertions(+), 12 deletions(-) diff --git a/code/game/objects/structures/compost.dm b/code/game/objects/structures/compost.dm index 157a761128c..18ef1e5faf9 100644 --- a/code/game/objects/structures/compost.dm +++ b/code/game/objects/structures/compost.dm @@ -9,11 +9,15 @@ var/global/const/COMPOST_WORM_HUNGER_FACTOR = MINIMUM_CHEMICAL_VOLUME icon = 'icons/obj/structures/compost.dmi' icon_state = ICON_STATE_WORLD anchored = TRUE - atom_flags = ATOM_FLAG_CLIMBABLE | ATOM_FLAG_OPEN_CONTAINER - material = /decl/material/solid/organic/wood + density = TRUE + atom_flags = ATOM_FLAG_CLIMBABLE matter = null + material = /decl/material/solid/organic/wood material_alteration = MAT_FLAG_ALTERATION_COLOR | MAT_FLAG_ALTERATION_NAME | MAT_FLAG_ALTERATION_DESC wrenchable = FALSE + possible_transfer_amounts = @"[10,25,50,100]" + volume = 2000 + can_toggle_open = FALSE storage = /datum/storage/hopper/industrial/compost /obj/structure/reagent_dispensers/compost_bin/Initialize() @@ -29,7 +33,6 @@ var/global/const/COMPOST_WORM_HUNGER_FACTOR = MINIMUM_CHEMICAL_VOLUME qdel(worm) break . = ..() - atom_flags |= ATOM_FLAG_OPEN_CONTAINER // something seems to be unsetting this :( /obj/structure/reagent_dispensers/compost_bin/Destroy() if(is_processing) diff --git a/code/game/objects/structures/well.dm b/code/game/objects/structures/well.dm index 0d7888198f9..7f0e460e00f 100644 --- a/code/game/objects/structures/well.dm +++ b/code/game/objects/structures/well.dm @@ -5,7 +5,7 @@ icon_state = ICON_STATE_WORLD anchored = TRUE density = TRUE - atom_flags = ATOM_FLAG_CLIMBABLE | ATOM_FLAG_OPEN_CONTAINER + atom_flags = ATOM_FLAG_CLIMBABLE matter = null material = /decl/material/solid/stone/granite material_alteration = MAT_FLAG_ALTERATION_COLOR | MAT_FLAG_ALTERATION_DESC @@ -13,12 +13,19 @@ amount_dispensed = 10 possible_transfer_amounts = @"[10,25,50,100]" volume = 10000 + can_toggle_open = FALSE /obj/structure/reagent_dispensers/well/on_update_icon() . = ..() if(reagents?.total_volume) add_overlay(overlay_image(icon, "[icon_state]-fluid", reagents.get_color(), (RESET_COLOR | RESET_ALPHA))) +/obj/structure/reagent_dispensers/well/on_reagent_change() + . = ..() + update_icon() + if(!is_processing) + START_PROCESSING(SSobj, src) + /obj/structure/reagent_dispensers/well/mapped/populate_reagents() . = ..() add_to_reagents(/decl/material/liquid/water, reagents.maximum_volume) @@ -34,9 +41,3 @@ if(is_processing) STOP_PROCESSING(SSobj, src) return ..() - -/obj/structure/reagent_dispensers/well/mapped/on_reagent_change() - . = ..() - update_icon() - if(!is_processing) - START_PROCESSING(SSobj, src) diff --git a/code/modules/reagents/reagent_dispenser.dm b/code/modules/reagents/reagent_dispenser.dm index 115243743c8..c36c615d139 100644 --- a/code/modules/reagents/reagent_dispenser.dm +++ b/code/modules/reagents/reagent_dispenser.dm @@ -14,6 +14,7 @@ var/unwrenched = FALSE var/tmp/volume = 1000 var/amount_dispensed = 10 + var/can_toggle_open = TRUE var/tmp/possible_transfer_amounts = @"[10,25,50,100,500]" /obj/structure/reagent_dispensers/Initialize(ml, _mat, _reinf_mat) @@ -22,6 +23,16 @@ if (!possible_transfer_amounts) verbs -= /obj/structure/reagent_dispensers/verb/set_amount_dispensed +/obj/structure/reagent_dispensers/receive_mouse_drop(atom/dropping, mob/user, params) + if(!(. = ..()) && user?.get_active_held_item() == dropping && isitem(dropping)) + // Awful. Sorry. + var/obj/item/item = dropping + var/old_atom_flags = atom_flags + atom_flags |= ATOM_FLAG_OPEN_CONTAINER + if(item.standard_pour_into(user, src)) + . = TRUE + atom_flags = old_atom_flags + /obj/structure/reagent_dispensers/on_reagent_change() ..() if(reagents?.total_volume > 0) @@ -311,7 +322,8 @@ /obj/structure/reagent_dispensers/get_alt_interactions(var/mob/user) . = ..() LAZYADD(., /decl/interaction_handler/set_transfer/reagent_dispenser) - LAZYADD(., /decl/interaction_handler/toggle_open/reagent_dispenser) + if(can_toggle_open) + LAZYADD(., /decl/interaction_handler/toggle_open/reagent_dispenser) //Set amount dispensed /decl/interaction_handler/set_transfer/reagent_dispenser @@ -337,4 +349,4 @@ target.atom_flags &= ~ATOM_FLAG_OPEN_CONTAINER else target.atom_flags |= ATOM_FLAG_OPEN_CONTAINER - return TRUE \ No newline at end of file + return TRUE From 25a9aac1a17c06ced9f359e634aee50b06a9e9fd Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sat, 15 Jun 2024 18:19:08 +1000 Subject: [PATCH 46/90] Removes duplicate src provided to weather update. --- code/game/turfs/turf.dm | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index afd6cc22bac..746f4360215 100644 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -604,10 +604,8 @@ var/air_graphic = get_air_graphic() if(length(air_graphic)) LAZYDISTINCTADD(., air_graphic) - if(weather) - LAZYADD(., weather) - if(length(weather.vis_contents_additions)) - LAZYADD(., weather.vis_contents_additions) + if(length(weather?.vis_contents_additions)) + LAZYADD(., weather.vis_contents_additions) if(flooded) var/flood_object = get_flood_overlay(flooded) if(flood_object) From 370f1e99ee8a124a6841494b60852abac49ad585 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sat, 15 Jun 2024 18:35:57 +1000 Subject: [PATCH 47/90] Allowed maps to override event containers. --- code/controllers/subsystems/event.dm | 20 ++++++++++++++------ maps/shaded_hills/shaded_hills.dm | 1 + maps/shaded_hills/shaded_hills_events.dm | 20 ++++++++++++++++++++ maps/~mapsystem/maps_events.dm | 4 ++++ nebula.dme | 1 + 5 files changed, 40 insertions(+), 6 deletions(-) create mode 100644 maps/shaded_hills/shaded_hills_events.dm create mode 100644 maps/~mapsystem/maps_events.dm diff --git a/code/controllers/subsystems/event.dm b/code/controllers/subsystems/event.dm index f3a5bd29ca3..59d7eac1c20 100644 --- a/code/controllers/subsystems/event.dm +++ b/code/controllers/subsystems/event.dm @@ -26,14 +26,22 @@ SUBSYSTEM_DEF(event) //Subsystem procs /datum/controller/subsystem/event/Initialize() - if(!all_events) - all_events = subtypesof(/datum/event) + if(!event_containers) event_containers = list( - EVENT_LEVEL_MUNDANE = new/datum/event_container/mundane, - EVENT_LEVEL_MODERATE = new/datum/event_container/moderate, - EVENT_LEVEL_MAJOR = new/datum/event_container/major - ) + EVENT_LEVEL_MUNDANE = new global.using_map.event_container_mundane, + EVENT_LEVEL_MODERATE = new global.using_map.event_container_moderate, + EVENT_LEVEL_MAJOR = new global.using_map.event_container_major + ) + all_events = null + + if(!all_events) + all_events = list() + for(var/datum/event_container/container in event_containers) + for(var/datum/event_meta/event in container.available_events) + if(event.event_type) + all_events |= event.event_type + global.using_map.populate_overmap_events() . = ..() diff --git a/maps/shaded_hills/shaded_hills.dm b/maps/shaded_hills/shaded_hills.dm index 87513297c5e..25767113d6a 100644 --- a/maps/shaded_hills/shaded_hills.dm +++ b/maps/shaded_hills/shaded_hills.dm @@ -42,6 +42,7 @@ #include "outfits/wilderness.dm" #include "shaded_hills_currency.dm" + #include "shaded_hills_events.dm" #include "shaded_hills_locks.dm" #include "shaded_hills_map.dm" #include "shaded_hills_names.dm" diff --git a/maps/shaded_hills/shaded_hills_events.dm b/maps/shaded_hills/shaded_hills_events.dm new file mode 100644 index 00000000000..cd2b3aa8673 --- /dev/null +++ b/maps/shaded_hills/shaded_hills_events.dm @@ -0,0 +1,20 @@ +/datum/map/shaded_hills + event_container_mundane = /datum/event_container/mundane/fantasy + event_container_moderate = /datum/event_container/moderate/fantasy + event_container_major = /datum/event_container/major/fantasy + +// TODO: more appropriate events. +/datum/event_container/mundane/fantasy + available_events = list( + new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Nothing", /datum/event/nothing, 100) + ) + +/datum/event_container/moderate/fantasy + available_events = list( + new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Nothing", /datum/event/nothing, 100) + ) + +/datum/event_container/major/fantasy + available_events = list( + new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Nothing", /datum/event/nothing, 100) + ) diff --git a/maps/~mapsystem/maps_events.dm b/maps/~mapsystem/maps_events.dm new file mode 100644 index 00000000000..6740542eb6a --- /dev/null +++ b/maps/~mapsystem/maps_events.dm @@ -0,0 +1,4 @@ +/datum/map + var/event_container_mundane = /datum/event_container/mundane + var/event_container_moderate = /datum/event_container/moderate + var/event_container_major = /datum/event_container/major diff --git a/nebula.dme b/nebula.dme index f40b844a618..be9f524b6fe 100644 --- a/nebula.dme +++ b/nebula.dme @@ -4113,6 +4113,7 @@ #include "maps\~mapsystem\maps_areas.dm" #include "maps\~mapsystem\maps_comms.dm" #include "maps\~mapsystem\maps_currency.dm" +#include "maps\~mapsystem\maps_events.dm" #include "maps\~mapsystem\maps_jobs.dm" #include "maps\~mapsystem\maps_unit_testing.dm" #include "maps\~unit_tests\unit_testing.dm" From 86bdecdd8010ff830c49f59e33d12f3da80b6589 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sat, 15 Jun 2024 20:20:27 +1000 Subject: [PATCH 48/90] Fixes roofing tiles (again). --- code/game/turfs/floors/floor_attackby.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/game/turfs/floors/floor_attackby.dm b/code/game/turfs/floors/floor_attackby.dm index 2ef3d2d6806..ae06cfbdf21 100644 --- a/code/game/turfs/floors/floor_attackby.dm +++ b/code/game/turfs/floors/floor_attackby.dm @@ -12,8 +12,8 @@ if(!C || !user) return 0 - if(IS_COIL(C) || (flooring && istype(C, /obj/item/stack/material/rods))) - return ..(C, user) + if(istype(C, /obj/item/stack/tile/roof) || IS_COIL(C) || (flooring && istype(C, /obj/item/stack/material/rods))) + return ..() if(!(IS_SCREWDRIVER(C) && flooring && (flooring.flags & TURF_REMOVE_SCREWDRIVER)) && try_graffiti(user, C)) return TRUE From 0985850868f8b7b274f9c4d51c499887846759e4 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Sun, 16 Jun 2024 12:04:41 -0400 Subject: [PATCH 49/90] Move Deity gamemode and content into a modpack --- code/__defines/deity.dm | 2 - code/_macros.dm | 2 - code/_onclick/hud/screen/screen_intent.dm | 45 ----------- code/datums/uplink/uplink_items.dm | 4 +- code/game/antagonist/station/cultist.dm | 7 +- code/game/gamemodes/cult/cult_items.dm | 7 +- code/game/objects/items/weapons/weaponry.dm | 35 +++++---- code/modules/codex/entries/structures.dm | 44 ----------- code/modules/ghosttrap/trap.dm | 2 +- .../liquids/materials_liquid_water.dm | 29 ++++--- code/modules/reagents/Chemistry-Holder.dm | 10 --- .../spells/aoe_turf/conjure/faithful_hound.dm | 5 -- .../spells/aoe_turf/conjure/force_portal.dm | 5 -- .../spells/aoe_turf/conjure/forcewall.dm | 4 - code/modules/spells/aoe_turf/disable_tech.dm | 5 -- code/modules/spells/aoe_turf/knock.dm | 4 - code/modules/spells/aoe_turf/smoke.dm | 4 - .../spells/artifacts/spellbound_servants.dm | 2 +- code/modules/spells/general/acid_spray.dm | 4 - .../{god_vision.dm => camera_vision.dm} | 24 +----- code/modules/spells/general/create_air.dm | 4 - code/modules/spells/general/radiant_aura.dm | 6 -- code/modules/spells/hand/burning_grip.dm | 4 - code/modules/spells/hand/slippery_surface.dm | 4 - code/modules/spells/spell_code.dm | 6 -- code/modules/spells/targeted/cleric_spells.dm | 27 +++---- code/modules/spells/targeted/equip/dyrnwyn.dm | 4 - code/modules/spells/targeted/equip/shield.dm | 4 - .../modules/spells/targeted/ethereal_jaunt.dm | 5 -- ..._pleasantness.dm => exude_pleasantness.dm} | 8 +- .../spells/targeted/projectile/fireball.dm | 4 - maps/exodus/exodus.dm | 1 + maps/modpack_testing/modpack_testing.dm | 1 + .../gamemodes/deity}/_defines.dm | 7 +- mods/gamemodes/deity/_deity.dm | 2 + mods/gamemodes/deity/_deity.dme | 75 +++++++++++++++++++ mods/gamemodes/deity/codex.dm | 43 +++++++++++ .../gamemodes/deity/deity_base.dm | 4 +- .../gamemodes}/deity/deity_base.dmm | 0 .../gamemodes/deity/deity_role.dm | 0 .../deity}/extensions/deity_be_near.dm | 8 +- .../gamemodes/deity/forms}/forms.dm | 3 +- .../deity/forms/narsie/deity_items}/basic.dm | 8 +- .../forms/narsie/deity_items}/minions.dm | 0 .../forms/narsie/deity_items}/sacrificing.dm | 0 .../forms/narsie/deity_items}/smithing.dm | 0 .../gamemodes/deity/forms/narsie/items.dm | 12 +-- .../gamemodes/deity/forms/narsie}/narsie.dm | 4 +- .../deity/forms/narsie/spells}/tear_veil.dm | 6 +- .../deity/forms/narsie/structures.dm | 25 ++++--- .../forms/starlight/deity_items}/artifacts.dm | 0 .../forms/starlight/deity_items}/phenomena.dm | 0 .../forms/starlight/deity_items}/spells.dm | 0 .../gamemodes/deity/forms/starlight/items.dm | 8 +- .../gamemodes/deity/forms/starlight/mobs.dm | 0 .../forms/starlight/spells/disable_tech.dm | 4 + .../forms/starlight/spells/starlight_aura.dm | 5 ++ .../starlight/spells}/veil_of_shadows.dm | 6 +- .../deity/forms/starlight}/starlight.dm | 2 +- .../deity/forms/starlight/structures.dm | 28 +++---- .../forms/tower/deity_items}/conjuration.dm | 0 .../forms/tower/deity_items}/transmutation.dm | 0 mods/gamemodes/deity/forms/tower/spells.dm | 67 +++++++++++++++++ .../gamemodes/deity/forms/tower/structures.dm | 0 .../gamemodes/deity/forms/tower}/tower.dm | 0 .../gamemodes/deity/gamemode.dm | 0 .../gamemodes/deity/god_cultist_role.dm | 4 +- .../gamemodes/deity/mobs}/deity.dm | 2 +- .../gamemodes/deity/mobs}/deity_Stat.dm | 0 .../gamemodes/deity/mobs}/deity_boons.dm | 17 ++--- .../gamemodes/deity/mobs}/deity_click.dm | 2 +- .../gamemodes/deity/mobs/deity_hud.dm | 0 .../gamemodes/deity/mobs}/deity_items.dm | 0 .../gamemodes/deity/mobs}/deity_phenomena.dm | 4 +- .../gamemodes/deity/mobs}/deity_power.dm | 0 .../gamemodes/deity/mobs}/deity_pylon.dm | 0 .../gamemodes/deity/mobs}/deity_sources.dm | 2 +- .../gamemodes/deity/mobs}/deity_topic.dm | 4 +- .../gamemodes/deity/mobs}/deity_tracking.dm | 4 +- .../gamemodes/deity/mobs/freelook}/cultnet.dm | 0 .../gamemodes/deity/mobs/freelook}/mask.dm | 0 .../gamemodes/deity/mobs}/items/deity_item.dm | 0 .../gamemodes/deity/mobs}/items/general.dm | 0 .../gamemodes/deity/mobs}/items/generic.dm | 0 .../gamemodes/deity/mobs}/menu/deity_nano.dm | 0 .../deity/mobs}/phenomena/_defines.dm | 0 .../deity/mobs}/phenomena/communication.dm | 16 ++-- .../deity/mobs}/phenomena/conjuration.dm | 20 +---- .../deity/mobs}/phenomena/conversion.dm | 12 +-- .../deity/mobs}/phenomena/generic.dm | 0 .../gamemodes/deity/mobs}/phenomena/narsie.dm | 10 +-- .../deity/mobs}/phenomena/phenomena.dm | 16 ++-- .../deity/mobs}/phenomena/starlight.dm | 30 ++++---- .../deity/mobs}/phenomena/transmutation.dm | 4 +- .../gamemodes/deity/mobs}/say.dm | 0 mods/gamemodes/deity/overrides.dm | 31 ++++++++ mods/gamemodes/deity/screen/intent.dm | 44 +++++++++++ mods/gamemodes/deity/spells/boon.dm | 11 +++ .../gamemodes/deity/spells/construction.dm | 2 +- .../gamemodes/deity/spells}/open_gateway.dm | 6 +- mods/gamemodes/deity/spells/vision.dm | 21 ++++++ .../gamemodes/deity/structures/altar.dm | 24 ++++-- .../gamemodes/deity/structures/pylon.dm | 8 +- .../gamemodes/deity/structures/structures.dm | 10 +-- .../gamemodes/deity/structures/trap.dm | 0 nebula.dme | 66 +--------------- 106 files changed, 532 insertions(+), 477 deletions(-) delete mode 100644 code/__defines/deity.dm rename code/modules/spells/general/{god_vision.dm => camera_vision.dm} (66%) rename code/modules/spells/targeted/{exhude_pleasantness.dm => exude_pleasantness.dm} (66%) rename {code/modules/mob/living/deity/items => mods/gamemodes/deity}/_defines.dm (64%) create mode 100644 mods/gamemodes/deity/_deity.dm create mode 100644 mods/gamemodes/deity/_deity.dme create mode 100644 mods/gamemodes/deity/codex.dm rename maps/antag_spawn/deity/deity.dm => mods/gamemodes/deity/deity_base.dm (82%) rename {maps/antag_spawn => mods/gamemodes}/deity/deity_base.dmm (100%) rename code/game/antagonist/outsider/deity.dm => mods/gamemodes/deity/deity_role.dm (100%) rename {code/datums => mods/gamemodes/deity}/extensions/deity_be_near.dm (92%) rename {code/modules/mob/living/deity => mods/gamemodes/deity/forms}/forms.dm (95%) rename {code/modules/mob/living/deity/items/narsie => mods/gamemodes/deity/forms/narsie/deity_items}/basic.dm (87%) rename {code/modules/mob/living/deity/items/narsie => mods/gamemodes/deity/forms/narsie/deity_items}/minions.dm (100%) rename {code/modules/mob/living/deity/items/narsie => mods/gamemodes/deity/forms/narsie/deity_items}/sacrificing.dm (100%) rename {code/modules/mob/living/deity/items/narsie => mods/gamemodes/deity/forms/narsie/deity_items}/smithing.dm (100%) rename code/game/gamemodes/godmode/form_items/narsie_items.dm => mods/gamemodes/deity/forms/narsie/items.dm (78%) rename {code/modules/mob/living/deity/forms => mods/gamemodes/deity/forms/narsie}/narsie.dm (93%) rename {code/modules/spells/general => mods/gamemodes/deity/forms/narsie/spells}/tear_veil.dm (83%) rename code/game/gamemodes/godmode/form_items/narsie_structures.dm => mods/gamemodes/deity/forms/narsie/structures.dm (72%) rename {code/modules/mob/living/deity/items/starlight => mods/gamemodes/deity/forms/starlight/deity_items}/artifacts.dm (100%) rename {code/modules/mob/living/deity/items/starlight => mods/gamemodes/deity/forms/starlight/deity_items}/phenomena.dm (100%) rename {code/modules/mob/living/deity/items/starlight => mods/gamemodes/deity/forms/starlight/deity_items}/spells.dm (100%) rename code/game/gamemodes/godmode/form_items/starlight_items.dm => mods/gamemodes/deity/forms/starlight/items.dm (93%) rename code/game/gamemodes/godmode/form_items/starlight_mobs.dm => mods/gamemodes/deity/forms/starlight/mobs.dm (100%) create mode 100644 mods/gamemodes/deity/forms/starlight/spells/disable_tech.dm create mode 100644 mods/gamemodes/deity/forms/starlight/spells/starlight_aura.dm rename {code/modules/spells/general => mods/gamemodes/deity/forms/starlight/spells}/veil_of_shadows.dm (87%) rename {code/modules/mob/living/deity/forms => mods/gamemodes/deity/forms/starlight}/starlight.dm (96%) rename code/game/gamemodes/godmode/form_items/starlight_structures.dm => mods/gamemodes/deity/forms/starlight/structures.dm (84%) rename {code/modules/mob/living/deity/items/tower => mods/gamemodes/deity/forms/tower/deity_items}/conjuration.dm (100%) rename {code/modules/mob/living/deity/items/tower => mods/gamemodes/deity/forms/tower/deity_items}/transmutation.dm (100%) create mode 100644 mods/gamemodes/deity/forms/tower/spells.dm rename code/game/gamemodes/godmode/form_items/wizard_structures.dm => mods/gamemodes/deity/forms/tower/structures.dm (100%) rename {code/modules/mob/living/deity/forms => mods/gamemodes/deity/forms/tower}/tower.dm (100%) rename code/game/gamemodes/godmode/godmode.dm => mods/gamemodes/deity/gamemode.dm (100%) rename code/game/antagonist/station/cult_god.dm => mods/gamemodes/deity/god_cultist_role.dm (95%) rename {code/modules/mob/living/deity => mods/gamemodes/deity/mobs}/deity.dm (97%) rename {code/modules/mob/living/deity => mods/gamemodes/deity/mobs}/deity_Stat.dm (100%) rename {code/modules/mob/living/deity => mods/gamemodes/deity/mobs}/deity_boons.dm (67%) rename {code/modules/mob/living/deity => mods/gamemodes/deity/mobs}/deity_click.dm (86%) rename code/_onclick/hud/deity.dm => mods/gamemodes/deity/mobs/deity_hud.dm (100%) rename {code/modules/mob/living/deity => mods/gamemodes/deity/mobs}/deity_items.dm (100%) rename {code/modules/mob/living/deity => mods/gamemodes/deity/mobs}/deity_phenomena.dm (94%) rename {code/modules/mob/living/deity => mods/gamemodes/deity/mobs}/deity_power.dm (100%) rename {code/modules/mob/living/deity => mods/gamemodes/deity/mobs}/deity_pylon.dm (100%) rename {code/modules/mob/living/deity => mods/gamemodes/deity/mobs}/deity_sources.dm (95%) rename {code/modules/mob/living/deity => mods/gamemodes/deity/mobs}/deity_topic.dm (89%) rename {code/modules/mob/living/deity => mods/gamemodes/deity/mobs}/deity_tracking.dm (89%) rename {code/modules/mob/observer/eye/freelook/cult => mods/gamemodes/deity/mobs/freelook}/cultnet.dm (100%) rename {code/modules/mob/observer/eye/freelook/cult => mods/gamemodes/deity/mobs/freelook}/mask.dm (100%) rename {code/modules/mob/living/deity => mods/gamemodes/deity/mobs}/items/deity_item.dm (100%) rename {code/modules/mob/living/deity => mods/gamemodes/deity/mobs}/items/general.dm (100%) rename {code/modules/mob/living/deity => mods/gamemodes/deity/mobs}/items/generic.dm (100%) rename {code/modules/mob/living/deity => mods/gamemodes/deity/mobs}/menu/deity_nano.dm (100%) rename {code/modules/mob/living/deity => mods/gamemodes/deity/mobs}/phenomena/_defines.dm (100%) rename {code/modules/mob/living/deity => mods/gamemodes/deity/mobs}/phenomena/communication.dm (77%) rename {code/modules/mob/living/deity => mods/gamemodes/deity/mobs}/phenomena/conjuration.dm (82%) rename {code/modules/mob/living/deity => mods/gamemodes/deity/mobs}/phenomena/conversion.dm (68%) rename {code/modules/mob/living/deity => mods/gamemodes/deity/mobs}/phenomena/generic.dm (100%) rename {code/modules/mob/living/deity => mods/gamemodes/deity/mobs}/phenomena/narsie.dm (75%) rename {code/modules/mob/living/deity => mods/gamemodes/deity/mobs}/phenomena/phenomena.dm (62%) rename {code/modules/mob/living/deity => mods/gamemodes/deity/mobs}/phenomena/starlight.dm (84%) rename {code/modules/mob/living/deity => mods/gamemodes/deity/mobs}/phenomena/transmutation.dm (78%) rename {code/modules/mob/living/deity => mods/gamemodes/deity/mobs}/say.dm (100%) create mode 100644 mods/gamemodes/deity/overrides.dm create mode 100644 mods/gamemodes/deity/screen/intent.dm create mode 100644 mods/gamemodes/deity/spells/boon.dm rename code/modules/spells/general/god_construct.dm => mods/gamemodes/deity/spells/construction.dm (94%) rename {code/modules/spells/general => mods/gamemodes/deity/spells}/open_gateway.dm (74%) create mode 100644 mods/gamemodes/deity/spells/vision.dm rename code/game/gamemodes/godmode/god_altar.dm => mods/gamemodes/deity/structures/altar.dm (74%) rename code/game/gamemodes/godmode/god_pylon.dm => mods/gamemodes/deity/structures/pylon.dm (85%) rename code/game/gamemodes/godmode/god_structures.dm => mods/gamemodes/deity/structures/structures.dm (80%) rename code/game/gamemodes/godmode/god_trap.dm => mods/gamemodes/deity/structures/trap.dm (100%) diff --git a/code/__defines/deity.dm b/code/__defines/deity.dm deleted file mode 100644 index 99f7511bcd9..00000000000 --- a/code/__defines/deity.dm +++ /dev/null @@ -1,2 +0,0 @@ -#define DEITY_STRUCTURE_NEAR_IMPORTANT 1 //Whether this needs to be near an important structure. -#define DEITY_STRUCTURE_ALONE 2 //Whether this can be near another of the same type. \ No newline at end of file diff --git a/code/_macros.dm b/code/_macros.dm index 70c2a46e647..8acdf68fb99 100644 --- a/code/_macros.dm +++ b/code/_macros.dm @@ -38,8 +38,6 @@ #define isliving(A) istype(A, /mob/living) -#define isdeity(A) istype(A, /mob/living/deity) - #define ismouse(A) istype(A, /mob/living/simple_animal/passive/mouse) #define islizard(A) istype(A, /mob/living/simple_animal/lizard) diff --git a/code/_onclick/hud/screen/screen_intent.dm b/code/_onclick/hud/screen/screen_intent.dm index bf496205aa7..138dc18c2d3 100644 --- a/code/_onclick/hud/screen/screen_intent.dm +++ b/code/_onclick/hud/screen/screen_intent.dm @@ -22,48 +22,3 @@ /obj/screen/intent/on_update_icon() icon_state = "intent_[intent]" - -/obj/screen/intent/deity - var/list/desc_screens = list() - screen_loc = "RIGHT-5:122,BOTTOM:8" - -/obj/screen/intent/deity/on_update_icon() - . = ..() - cut_overlays() - add_overlay(image('icons/mob/screen/phenomena.dmi', icon_state = "hud", pixel_x = -138, pixel_y = -1)) - compile_overlays() - -/obj/screen/intent/deity/proc/sync_to_mob(var/mob) - var/mob/living/deity/D = mob - for(var/i in 1 to D.control_types.len) - var/obj/screen/deity_marker/S = new(null, D) - desc_screens[D.control_types[i]] = S - S.screen_loc = screen_loc - //This sets it up right. Trust me. - S.maptext_y = 33/2*i - i*i/2 - 10 - D.client.screen += S - - update_text() - -/obj/screen/intent/deity/proc/update_text() - if(!isdeity(usr)) - return - var/mob/living/deity/D = usr - for(var/i in D.control_types) - var/obj/screen/deity_marker/S = desc_screens[i] - var/datum/phenomena/P = D.intent_phenomenas[intent][i] - if(P) - S.maptext = "[P.name]" - else - S.maptext = null - -/obj/screen/intent/deity/handle_click(mob/user, params) - ..() - update_text() - -/obj/screen/deity_marker - name = "" //Don't want them to be able to actually right click it. - mouse_opacity = MOUSE_OPACITY_UNCLICKABLE - icon_state = "blank" - maptext_width = 128 - maptext_x = -125 \ No newline at end of file diff --git a/code/datums/uplink/uplink_items.dm b/code/datums/uplink/uplink_items.dm index c28a893f898..f86dd9cb05c 100644 --- a/code/datums/uplink/uplink_items.dm +++ b/code/datums/uplink/uplink_items.dm @@ -32,7 +32,9 @@ var/global/datum/uplink/uplink = new() var/item_cost = 0 var/list/antag_costs = list() // Allows specific antag roles to purchase at a different cost var/datum/uplink_category/category // Item category - var/list/decl/special_role/antag_roles = list("Exclude", /decl/special_role/deity) // Antag roles this item is displayed to. If empty, display to all. If it includes 'Exclude", anybody except this role can view it + /// Antag roles this item is displayed to. If empty, display to all. If it includes 'Exclude", anybody except this role can view it + /// Examples: list(/decl/special_role/someone); list("Exclude", /decl/special_role/whoever); etc + var/list/decl/special_role/antag_roles /datum/uplink_item/item var/path = null diff --git a/code/game/antagonist/station/cultist.dm b/code/game/antagonist/station/cultist.dm index bd4d4832b73..3537898a6db 100644 --- a/code/game/antagonist/station/cultist.dm +++ b/code/game/antagonist/station/cultist.dm @@ -13,11 +13,10 @@ #define CULT_MAX_CULTINESS 1200 // When this value is reached, the game stops checking for updates so we don't recheck every time a tile is converted in endgame /proc/iscultist(var/mob/player) - if(!player.mind) - return 0 var/decl/special_role/cult = GET_DECL(/decl/special_role/cultist) - if(player.mind in cult.current_antagonists) - return 1 + if(player.mind && (player.mind in cult.current_antagonists)) + return TRUE + return FALSE /decl/special_role/cultist name = "Cultist" diff --git a/code/game/gamemodes/cult/cult_items.dm b/code/game/gamemodes/cult/cult_items.dm index b27f77c4068..a993e91d96f 100644 --- a/code/game/gamemodes/cult/cult_items.dm +++ b/code/game/gamemodes/cult/cult_items.dm @@ -4,10 +4,13 @@ icon = 'icons/obj/items/weapon/swords/cult.dmi' material_alteration = MAT_FLAG_ALTERATION_COLOR | MAT_FLAG_ALTERATION_NAME +// separated into a proc so that deity can modify it +/obj/item/sword/cultblade/proc/can_use_safely(mob/living/user) + return iscultist(user) + /obj/item/sword/cultblade/use_on_mob(mob/living/target, mob/living/user, animate = TRUE) - var/decl/special_role/godcult = GET_DECL(/decl/special_role/godcultist) - if(iscultist(user) || (user.mind in godcult.current_antagonists)) + if(can_use_safely(user)) return ..() var/zone = user.get_active_held_item_slot() diff --git a/code/game/objects/items/weapons/weaponry.dm b/code/game/objects/items/weapons/weaponry.dm index c810f115fa8..978096105d2 100644 --- a/code/game/objects/items/weapons/weaponry.dm +++ b/code/game/objects/items/weapons/weaponry.dm @@ -45,23 +45,26 @@ /obj/item/nullrod/afterattack(var/atom/A, var/mob/user, var/proximity) if(!proximity) return + return A.nullrod_act(user, src) - if(istype(A, /obj/structure/deity/altar)) - var/obj/structure/deity/altar/altar = A - if(!altar.linked_god.silenced) //Don't want them to infinity spam it. - altar.linked_god.silence(10) - new /obj/effect/temporary(get_turf(altar),'icons/effects/effects.dmi',"purple_electricity_constant", 10) - altar.visible_message("\The [altar] groans in protest as reality settles around \the [src].") - - if(istype(A, /turf/wall/cult)) - var/turf/wall/cult/W = A - user.visible_message("\The [user] touches \the [A] with \the [src], and the enchantment affecting it fizzles away.", "You touch \the [A] with \the [src], and the enchantment affecting it fizzles away.") - W.ChangeTurf(/turf/wall) - - if(istype(A, /turf/floor/cult)) - var/turf/floor/cult/F = A - user.visible_message("\The [user] touches \the [A] with \the [src], and the enchantment affecting it fizzles away.", "You touch \the [A] with \the [src], and the enchantment affecting it fizzles away.") - F.ChangeTurf(/turf/floor, keep_air = TRUE) +/atom/proc/nullrod_act(mob/user, obj/item/nullrod/rod) + return FALSE + +/turf/wall/cult/nullrod_act(mob/user, obj/item/nullrod/rod) + user.visible_message( + SPAN_NOTICE("\The [user] touches \the [src] with \the [rod], and the enchantment affecting it fizzles away."), + SPAN_NOTICE("You touch \the [src] with \the [rod], and the enchantment affecting it fizzles away.") + ) + ChangeTurf(/turf/wall) + return TRUE + +/turf/floor/cult/nullrod_act(mob/user, obj/item/nullrod/rod) + user.visible_message( + SPAN_NOTICE("\The [user] touches \the [src] with \the [rod], and the enchantment affecting it fizzles away."), + SPAN_NOTICE("You touch \the [src] with \the [rod], and the enchantment affecting it fizzles away.") + ) + ChangeTurf(/turf/floor, keep_air = TRUE) + return TRUE /obj/item/energy_net diff --git a/code/modules/codex/entries/structures.dm b/code/modules/codex/entries/structures.dm index 73e7fec6627..27930eae94a 100644 --- a/code/modules/codex/entries/structures.dm +++ b/code/modules/codex/entries/structures.dm @@ -32,47 +32,3 @@ lore_text = "The cheval de frise (Frisian horse) is an ancient anti-cavalry barricade so named because they were widely deployed by the Frisians, who lacked easy access to horses to field their own cavalry." mechanics_text = "A simple barricade is crafted from any material. You can make it a cheval de frise by adding rods of any material to a barricade constructed of any material, this structure will injure anyone who moves into it." disambiguator = "structure" - -/datum/codex_entry/deity - abstract_type = /datum/codex_entry/deity - -/datum/codex_entry/deity/altar - associated_paths = list(/obj/structure/deity/altar) - mechanics_text = "To place someone upon the altar, first have them in an aggressive grab and click the altar while adjacent." - antag_text = "This structure anchors your deity within this realm, granting them additional power to influence it and empower their followers. Additionally, using it as a focus for their powers, they can convert someone laying on top of the altar.
    " - disambiguator = "occult" - -/datum/codex_entry/deity/blood_forge - associated_paths = list(/obj/structure/deity/blood_forge) - antag_text = "Allows creation of special items by feeding your blood into it. Only usable by cultists of the aligned deity." - disambiguator = "occult" - -/datum/codex_entry/deity/blood_stone - associated_paths = list(/obj/structure/deity/blood_stone) - antag_text = "Allows the user to feed blood directly to the aligned deity, granting it power." - disambiguator = "occult" - -/datum/codex_entry/deity/gateway - associated_paths = list(/obj/structure/deity/gateway) - antag_text = "Stand within the gateway to be transported to an unknown dimension and transformed into a flaming Starborn, a mysterious Blueforged or a subtle Shadowling." - disambiguator = "occult" - -/datum/codex_entry/deity/radiant_statue - associated_paths = list(/obj/structure/deity/radiant_statue) - antag_text = "Allows storage of power if cultists are nearby. This stored power can be expended to charge Starlight items." - disambiguator = "occult" - -/datum/codex_entry/deity/blood_forge/starlight - associated_paths = list(/obj/structure/deity/blood_forge/starlight) - antag_text = "Allows creation of special Starlight items. Only usable by cultists of the aligned deity. Use of this powerful forge will inflict burns." - disambiguator = "occult" - -/datum/codex_entry/deity/wizard_recharger - associated_paths = list(/obj/structure/deity/wizard_recharger) - antag_text = "A well of arcane power. When charged, a cultist may absorb this power to refresh their spells." - disambiguator = "occult" - -/datum/codex_entry/deity/pylon - associated_paths = list(/obj/structure/deity/pylon) - antag_text = "Serves as a conduit for a deity to speak through, making their will known in this dimension to any who hear it." - disambiguator = "occult" diff --git a/code/modules/ghosttrap/trap.dm b/code/modules/ghosttrap/trap.dm index 73f2aade08a..ca4076385ea 100644 --- a/code/modules/ghosttrap/trap.dm +++ b/code/modules/ghosttrap/trap.dm @@ -189,7 +189,7 @@ /decl/ghosttrap/cult_shade name = "shade" ghost_trap_message = "They are occupying a soul stone now." - ban_checks = list(/decl/special_role/cultist, /decl/special_role/godcultist) + ban_checks = list(/decl/special_role/cultist) pref_check = "ghost_shade" can_set_own_name = FALSE diff --git a/code/modules/materials/definitions/liquids/materials_liquid_water.dm b/code/modules/materials/definitions/liquids/materials_liquid_water.dm index d45b14c9048..bb5a7edcbeb 100644 --- a/code/modules/materials/definitions/liquids/materials_liquid_water.dm +++ b/code/modules/materials/definitions/liquids/materials_liquid_water.dm @@ -34,22 +34,19 @@ ..() if(ishuman(M)) var/list/data = REAGENT_DATA(holder, type) - if(data && data["holy"]) - if(iscultist(M)) - if(prob(10)) - var/decl/special_role/cultist/cult = GET_DECL(/decl/special_role/cultist) - cult.offer_uncult(M) - if(prob(2)) - var/obj/effect/spider/spiderling/S = new /obj/effect/spider/spiderling(M.loc) - M.visible_message("\The [M] coughs up \the [S]!") - else - var/decl/special_role/godcult = GET_DECL(/decl/special_role/godcultist) - if(M.mind && godcult.is_antagonist(M.mind)) - if(REAGENT_VOLUME(holder, type) > 5) - M.take_damage(5, PAIN, do_update_health = FALSE) - M.take_damage(1) - if(prob(10)) //Only annoy them a /bit/ - to_chat(M,"You feel your insides curdle and burn! \[Give Into Purity\]") + if(data?["holy"]) + affect_holy(M, removed, holder) + +/decl/material/liquid/water/proc/affect_holy(mob/living/M, removed, datum/reagents/holder) + if(iscultist(M)) + if(prob(10)) + var/decl/special_role/cultist/cult = GET_DECL(/decl/special_role/cultist) + cult.offer_uncult(M) + if(prob(2)) + var/obj/effect/spider/spiderling/S = new /obj/effect/spider/spiderling(M.loc) + M.visible_message(SPAN_WARNING("\The [M] coughs up \the [S]!")) + return TRUE + return FALSE /decl/material/liquid/water/affect_ingest(var/mob/living/M, var/removed, var/datum/reagents/holder) ..() diff --git a/code/modules/reagents/Chemistry-Holder.dm b/code/modules/reagents/Chemistry-Holder.dm index 387f0fdd630..30d1af9e697 100644 --- a/code/modules/reagents/Chemistry-Holder.dm +++ b/code/modules/reagents/Chemistry-Holder.dm @@ -677,13 +677,3 @@ var/global/obj/temp_reagents_holder = new else reagents = new/datum/reagents(max_vol, src) return reagents - -/datum/reagents/Topic(href, href_list) - . = ..() - if(!. && href_list["deconvert"]) - var/list/data = REAGENT_DATA(src, /decl/material/liquid/water) - if(LAZYACCESS(data, "holy")) - var/mob/living/target = locate(href_list["deconvert"]) - if(istype(target) && !QDELETED(target) && target.mind) - var/decl/special_role/godcult = GET_DECL(/decl/special_role/godcultist) - godcult.remove_antagonist(target.mind,1) diff --git a/code/modules/spells/aoe_turf/conjure/faithful_hound.dm b/code/modules/spells/aoe_turf/conjure/faithful_hound.dm index 2a2a6c8a987..69ffe55db6c 100644 --- a/code/modules/spells/aoe_turf/conjure/faithful_hound.dm +++ b/code/modules/spells/aoe_turf/conjure/faithful_hound.dm @@ -17,8 +17,3 @@ ..() var/password = sanitize(input("What password will this beast listen to?") as text, MAX_NAME_LEN) newVars = list("password" = password, "allowed_mobs" = list(usr)) - -/spell/aoe_turf/conjure/faithful_hound/tower - desc = "This spell allows you to summon a singular spectral dog that guards the nearby area. Anyone without the password is barked at or bitten." - charge_max = 1 - spell_flags = 0 diff --git a/code/modules/spells/aoe_turf/conjure/force_portal.dm b/code/modules/spells/aoe_turf/conjure/force_portal.dm index 7a4483435cf..b81c05f8020 100644 --- a/code/modules/spells/aoe_turf/conjure/force_portal.dm +++ b/code/modules/spells/aoe_turf/conjure/force_portal.dm @@ -10,8 +10,3 @@ cast_sound = null hud_state = "wiz_force" - -/spell/aoe_turf/conjure/force_portal/tower - desc = "This spell allows you to summon a force portal. Anything that hits the portal gets sucked inside and is then thrown out when the portal explodes." - charge_max = 2 - spell_flags = 0 \ No newline at end of file diff --git a/code/modules/spells/aoe_turf/conjure/forcewall.dm b/code/modules/spells/aoe_turf/conjure/forcewall.dm index 89ceb6d64cd..1c937f3f6d8 100644 --- a/code/modules/spells/aoe_turf/conjure/forcewall.dm +++ b/code/modules/spells/aoe_turf/conjure/forcewall.dm @@ -46,7 +46,3 @@ icon_state = "empty" name = "invisible wall" desc = "You have a bad feeling about this." - -/spell/aoe_turf/conjure/forcewall/tower - desc = "A temporary invincible wall for you to summon." - charge_max = 3 \ No newline at end of file diff --git a/code/modules/spells/aoe_turf/disable_tech.dm b/code/modules/spells/aoe_turf/disable_tech.dm index a8069b209f8..d9912e1c390 100644 --- a/code/modules/spells/aoe_turf/disable_tech.dm +++ b/code/modules/spells/aoe_turf/disable_tech.dm @@ -31,8 +31,3 @@ emp_light += 2 return "You've increased the range of [src]." - -/spell/aoe_turf/disable_tech/starlight - hidden_from_codex = TRUE - charge_max = 600 - spell_flags = 0 \ No newline at end of file diff --git a/code/modules/spells/aoe_turf/knock.dm b/code/modules/spells/aoe_turf/knock.dm index f3dfa6a1e3c..3cf8614eeaa 100644 --- a/code/modules/spells/aoe_turf/knock.dm +++ b/code/modules/spells/aoe_turf/knock.dm @@ -35,7 +35,3 @@ /spell/aoe_turf/knock/slow charge_max = 200 hidden_from_codex = TRUE - -/spell/aoe_turf/knock/tower - charge_max = 2 - hidden_from_codex = TRUE diff --git a/code/modules/spells/aoe_turf/smoke.dm b/code/modules/spells/aoe_turf/smoke.dm index 5fe95415955..f9f0138908f 100644 --- a/code/modules/spells/aoe_turf/smoke.dm +++ b/code/modules/spells/aoe_turf/smoke.dm @@ -24,7 +24,3 @@ smoke_amt += 2 return "[src] will now create more smoke." - -/spell/aoe_turf/smoke/tower - charge_max = 2 - hidden_from_codex = TRUE diff --git a/code/modules/spells/artifacts/spellbound_servants.dm b/code/modules/spells/artifacts/spellbound_servants.dm index 5f347b2f4ac..d0592a441a8 100644 --- a/code/modules/spells/artifacts/spellbound_servants.dm +++ b/code/modules/spells/artifacts/spellbound_servants.dm @@ -149,7 +149,7 @@ desc = "A spy and a manipulator to the end, capable of hiding in plain sight and falsifying information to your heart's content." spiel = "On the surface, you are a completely normal person, but is that really all you are? People are so easy to fool, do as your Master says, and do it with style!" spells = list(/spell/toggle_armor/infil_items, - /spell/targeted/exhude_pleasantness, + /spell/targeted/exude_pleasantness, /spell/targeted/genetic/blind/hysteria) /datum/spellbound_type/servant/infiltrator/equip_servant(var/mob/living/carbon/human/H) diff --git a/code/modules/spells/general/acid_spray.dm b/code/modules/spells/general/acid_spray.dm index 5df698c238b..752a17eecb7 100644 --- a/code/modules/spells/general/acid_spray.dm +++ b/code/modules/spells/general/acid_spray.dm @@ -24,7 +24,3 @@ chem.add_to_reagents(reagent_type,10) spawn(0) chem.set_up(get_ranged_target_turf(target, angle2dir(angle+mod), 3)) - -/spell/acid_spray/tower - desc = "The simplest form of aggressive conjuration: acid spray is quite effective in melting both man and object." - charge_max = 2 \ No newline at end of file diff --git a/code/modules/spells/general/god_vision.dm b/code/modules/spells/general/camera_vision.dm similarity index 66% rename from code/modules/spells/general/god_vision.dm rename to code/modules/spells/general/camera_vision.dm index 186dbede1d9..cfd0cfb030e 100644 --- a/code/modules/spells/general/god_vision.dm +++ b/code/modules/spells/general/camera_vision.dm @@ -33,26 +33,4 @@ if(!cn) to_chat(user, SPAN_WARNING("There's a flash of sparks as the spell fizzles out!")) return - cn.look(L) - -/spell/camera_connection/god_vision - name = "All Seeing Eye" - desc = "See what your master sees." - - charge_max = 10 - spell_flags = Z2NOCAST - invocation = "none" - invocation_type = SpI_NONE - - extension_type = /datum/extension/eye/freelook - - hud_state = "gen_mind" - -/spell/camera_connection/god_vision/set_connected_god(var/mob/living/deity/god) - ..() - - var/datum/extension/eye/freelook/fl = get_extension(src, /datum/extension/eye) - if(!fl) - return - fl.set_visualnet(god.eyenet) - + cn.look(L) \ No newline at end of file diff --git a/code/modules/spells/general/create_air.dm b/code/modules/spells/general/create_air.dm index 51d5cae6a46..405e161a54a 100644 --- a/code/modules/spells/general/create_air.dm +++ b/code/modules/spells/general/create_air.dm @@ -22,7 +22,3 @@ var/datum/gas_mixture/environment = targets[1] for(var/gas in air_change) environment.adjust_gas(gas, air_change[gas]) - -/spell/create_air/tower - desc = "Allows you to generate a livable atmosphere in the area you are in." - charge_max = 5 \ No newline at end of file diff --git a/code/modules/spells/general/radiant_aura.dm b/code/modules/spells/general/radiant_aura.dm index 12e608e2ec8..27e85404027 100644 --- a/code/modules/spells/general/radiant_aura.dm +++ b/code/modules/spells/general/radiant_aura.dm @@ -19,9 +19,3 @@ /spell/radiant_aura/cast(var/list/targets, var/mob/user) var/obj/aura/radiant_aura/A = new(user) QDEL_IN(A,duration) - -/spell/radiant_aura/starlight - name = "Starlight Aura" - desc = "This spell makes you immune to laser fire, for a short while at least." - spell_flags = 0 - charge_max = 400 \ No newline at end of file diff --git a/code/modules/spells/hand/burning_grip.dm b/code/modules/spells/hand/burning_grip.dm index 759eda54cd6..96c4b472b67 100644 --- a/code/modules/spells/hand/burning_grip.dm +++ b/code/modules/spells/hand/burning_grip.dm @@ -37,7 +37,3 @@ else E.take_external_damage(burn=6, used_weapon = "hot iron") to_chat(H, SPAN_WARNING("You notice that your [E] is burned.")) - -/spell/hand/burning_grip/tower - desc = "Allows you cause an object to heat up intensly in someone's hand, making them drop it and whatever skin is attached." - charge_max = 3 \ No newline at end of file diff --git a/code/modules/spells/hand/slippery_surface.dm b/code/modules/spells/hand/slippery_surface.dm index 2db0588d128..3b5fc448d03 100644 --- a/code/modules/spells/hand/slippery_surface.dm +++ b/code/modules/spells/hand/slippery_surface.dm @@ -17,7 +17,3 @@ T.wet_floor(50) new /obj/effect/temporary(T, 3, 'icons/effects/effects.dmi', "sonar_ping") return ..() - -/spell/hand/slippery_surface/tower - desc = "Allows you to slicken a small patch of floor. Anyone without sure-footing will find it hard to stay upright." - charge_max = 2 \ No newline at end of file diff --git a/code/modules/spells/spell_code.dm b/code/modules/spells/spell_code.dm index 5e4621a9eaa..653d2b8cae2 100644 --- a/code/modules/spells/spell_code.dm +++ b/code/modules/spells/spell_code.dm @@ -62,7 +62,6 @@ var/global/list/spells = typesof(/spell) //needed for the badmin verb for now var/override_base = "" - var/mob/living/deity/connected_god //Do we have this spell based off a boon from a god? var/obj/screen/connected_button var/hidden_from_codex = FALSE @@ -121,8 +120,6 @@ var/global/list/spells = typesof(/spell) //needed for the badmin verb for now break if(cast_check(1,user, targets)) //we check again, otherwise you can choose a target and then wait for when you are no longer able to cast (I.E. Incapacitated) to use it. invocation(user, targets) - if(connected_god && !connected_god.take_charge(user, max(1, charge_max/10))) - break take_charge(user, skipcharge) before_cast(targets) //applies any overlays and effects if(prob(critfailchance)) @@ -390,9 +387,6 @@ var/global/list/spells = typesof(/spell) //needed for the badmin verb for now return do_after(user,delay, incapacitation_flags = incap_flags) -/spell/proc/set_connected_god(var/mob/living/deity/god) - connected_god = god - /proc/view_or_range(distance = world.view , center = usr , type) switch(type) if("view") diff --git a/code/modules/spells/targeted/cleric_spells.dm b/code/modules/spells/targeted/cleric_spells.dm index aea1cec1b94..74061d776dd 100644 --- a/code/modules/spells/targeted/cleric_spells.dm +++ b/code/modules/spells/targeted/cleric_spells.dm @@ -32,10 +32,6 @@ amt_dam_robo -= 7 return "[src] will now heal more." -/spell/targeted/heal_target/tower - desc = "Allows you to heal yourself, or others, for a slight amount." - charge_max = 2 - /spell/targeted/heal_target/touch name = "Healing Touch" desc = "Heals an adjacent target for a reasonable amount of health." @@ -83,11 +79,6 @@ return "[src] heals more, and heals organ damage and radiation." -/spell/targeted/heal_target/major/tower - charge_max = 1 - spell_flags = INCLUDEUSER | SELECTABLE - desc = "Allows you to heal others for a great amount." - /spell/targeted/heal_target/area name = "Cure Area" desc = "This spell heals everyone in an area." @@ -114,10 +105,6 @@ return "[src] now heals more in a wider area." -/spell/targeted/heal_target/area/tower - desc = "Allows you to heal everyone in an area for minor damage." - charge_max = 1 - /spell/targeted/heal_target/area/slow charge_max = 2 MINUTES @@ -196,6 +183,20 @@ charge_max += 300 QDEL_NULL(effect) +/obj/effect/rift + name = "rift" + desc = "a tear in space and time." + icon = 'icons/obj/wizard.dmi' + icon_state = "rift" + anchored = TRUE + density = FALSE + +/obj/effect/rift/Destroy() + for(var/o in contents) + var/atom/movable/M = o + M.dropInto(loc) + . = ..() + /spell/targeted/revoke name = "Revoke Death" desc = "Revoke that of death itself. Comes at a cost that may be hard to manage for some." diff --git a/code/modules/spells/targeted/equip/dyrnwyn.dm b/code/modules/spells/targeted/equip/dyrnwyn.dm index 98d9cc4fba4..bb1c2a69440 100644 --- a/code/modules/spells/targeted/equip/dyrnwyn.dm +++ b/code/modules/spells/targeted/equip/dyrnwyn.dm @@ -35,7 +35,3 @@ material = /decl/material/solid/metal/silver return "Dyrnwyn has been made pure: it is now made of silver." - -/spell/targeted/equip_item/dyrnwyn/tower - desc = "This spell allows you to summon a golden firey sword for a short duration." - charge_max = 1 \ No newline at end of file diff --git a/code/modules/spells/targeted/equip/shield.dm b/code/modules/spells/targeted/equip/shield.dm index f81a75c3d62..4196c023e41 100644 --- a/code/modules/spells/targeted/equip/shield.dm +++ b/code/modules/spells/targeted/equip/shield.dm @@ -39,7 +39,3 @@ block_chance = 60 return "Your summoned shields will now block more often." - -/spell/targeted/equip_item/shield/tower - desc = "This spell allows you to summon a magical shield for a short duration." - charge_max = 1 \ No newline at end of file diff --git a/code/modules/spells/targeted/ethereal_jaunt.dm b/code/modules/spells/targeted/ethereal_jaunt.dm index fd741613209..e686e7712dc 100644 --- a/code/modules/spells/targeted/ethereal_jaunt.dm +++ b/code/modules/spells/targeted/ethereal_jaunt.dm @@ -118,8 +118,3 @@ /obj/effect/dummy/spell_jaunt/bullet_act(blah) return - -/spell/targeted/ethereal_jaunt/tower - desc = "Allows you to liquify for a short duration, letting them pass through all dense objects." - charge_max = 2 - spell_flags = Z2NOCAST | INCLUDEUSER \ No newline at end of file diff --git a/code/modules/spells/targeted/exhude_pleasantness.dm b/code/modules/spells/targeted/exude_pleasantness.dm similarity index 66% rename from code/modules/spells/targeted/exhude_pleasantness.dm rename to code/modules/spells/targeted/exude_pleasantness.dm index 8e3d9c0d1c0..74ae51237ab 100644 --- a/code/modules/spells/targeted/exhude_pleasantness.dm +++ b/code/modules/spells/targeted/exude_pleasantness.dm @@ -1,4 +1,4 @@ -/spell/targeted/exhude_pleasantness +/spell/targeted/exude_pleasantness name = "Exhude Pleasantness" desc = "A simple spell used to make friends with people. Be warned, this spell only has a subtle effect" feedback = "AP" @@ -10,10 +10,10 @@ var/list/possible_messages = list("seems pretty trustworthy!", "makes you feel appreciated.", "looks pretty cool.", "feels like the only decent person here!", "makes you feel safe.") hud_state = "friendly" -/spell/targeted/exhude_pleasantness/cast(var/list/targets, var/mob/user) +/spell/targeted/exude_pleasantness/cast(var/list/targets, var/mob/user) for(var/m in targets) var/mob/living/L = m if(L.mind && L.mind.assigned_special_role == "Spellbound Servant") - to_chat(m, "\The [user] seems relatively harmless.") + to_chat(m, SPAN_NOTICE("\The [user] seems relatively harmless.")) else - to_chat(m, "\The [user] [pick(possible_messages)]") \ No newline at end of file + to_chat(m, FONT_LARGE(SPAN_NOTICE("\The [user] [pick(possible_messages)]"))) \ No newline at end of file diff --git a/code/modules/spells/targeted/projectile/fireball.dm b/code/modules/spells/targeted/projectile/fireball.dm index 451c2726727..ef65dc885f7 100644 --- a/code/modules/spells/targeted/projectile/fireball.dm +++ b/code/modules/spells/targeted/projectile/fireball.dm @@ -44,10 +44,6 @@ return "The spell [src] now has a larger explosion." -/spell/targeted/projectile/dumbfire/fireball/tower - desc = "Imbue yourself with the power of exploding fire." - charge_max = 2 - //PROJECTILE /obj/item/projectile/spell_projectile/fireball diff --git a/maps/exodus/exodus.dm b/maps/exodus/exodus.dm index c90f7566e38..fbc711b73f1 100644 --- a/maps/exodus/exodus.dm +++ b/maps/exodus/exodus.dm @@ -1,5 +1,6 @@ #if !defined(USING_MAP_DATUM) + #include "../../mods/gamemodes/deity/_deity.dme" #include "../../mods/gamemodes/meteor/_meteor.dme" #include "../../mods/content/mundane.dm" diff --git a/maps/modpack_testing/modpack_testing.dm b/maps/modpack_testing/modpack_testing.dm index 929c7b8a181..45e81695cdd 100644 --- a/maps/modpack_testing/modpack_testing.dm +++ b/maps/modpack_testing/modpack_testing.dm @@ -3,6 +3,7 @@ #include "modpack_testing_lobby.dm" #include "blank.dmm" + #include "../../mods/gamemodes/deity/_deity.dme" #include "../../mods/gamemodes/meteor/_meteor.dme" #include "../../mods/content/mundane.dm" diff --git a/code/modules/mob/living/deity/items/_defines.dm b/mods/gamemodes/deity/_defines.dm similarity index 64% rename from code/modules/mob/living/deity/items/_defines.dm rename to mods/gamemodes/deity/_defines.dm index c567b104862..285469200ee 100644 --- a/code/modules/mob/living/deity/items/_defines.dm +++ b/mods/gamemodes/deity/_defines.dm @@ -11,4 +11,9 @@ #define DEITY_ARMOR_CRAFT "Armor Crafting" #define DEITY_VOID_CRAFT "Void Crafting" #define DEITY_UNLOCK_ARMS "Unlock Armaments" -#define DEITY_UNLOCK_HEAL "Unlock Cleric Spells" \ No newline at end of file +#define DEITY_UNLOCK_HEAL "Unlock Cleric Spells" + +#define isdeity(A) istype(A, /mob/living/deity) + +#define DEITY_STRUCTURE_NEAR_IMPORTANT 1 //Whether this needs to be near an important structure. +#define DEITY_STRUCTURE_ALONE 2 //Whether this can be near another of the same type. \ No newline at end of file diff --git a/mods/gamemodes/deity/_deity.dm b/mods/gamemodes/deity/_deity.dm new file mode 100644 index 00000000000..6c658e122b3 --- /dev/null +++ b/mods/gamemodes/deity/_deity.dm @@ -0,0 +1,2 @@ +/decl/modpack/deity + name = "Deity Gamemode Content" \ No newline at end of file diff --git a/mods/gamemodes/deity/_deity.dme b/mods/gamemodes/deity/_deity.dme new file mode 100644 index 00000000000..c76fdaf4845 --- /dev/null +++ b/mods/gamemodes/deity/_deity.dme @@ -0,0 +1,75 @@ +#ifndef GAMEMODE_PACK_DEITY +#define GAMEMODE_PACK_DEITY +// BEGIN_INCLUDE +#include "_defines.dm" +#include "_deity.dm" +#include "codex.dm" +#include "deity_base.dm" +#include "deity_role.dm" +#include "gamemode.dm" +#include "god_cultist_role.dm" +#include "overrides.dm" +#include "extensions\deity_be_near.dm" +#include "forms\forms.dm" +#include "forms\narsie\items.dm" +#include "forms\narsie\narsie.dm" +#include "forms\narsie\structures.dm" +#include "forms\narsie\deity_items\basic.dm" +#include "forms\narsie\deity_items\minions.dm" +#include "forms\narsie\deity_items\sacrificing.dm" +#include "forms\narsie\deity_items\smithing.dm" +#include "forms\narsie\spells\tear_veil.dm" +#include "forms\starlight\items.dm" +#include "forms\starlight\mobs.dm" +#include "forms\starlight\starlight.dm" +#include "forms\starlight\structures.dm" +#include "forms\starlight\deity_items\artifacts.dm" +#include "forms\starlight\deity_items\phenomena.dm" +#include "forms\starlight\deity_items\spells.dm" +#include "forms\starlight\spells\disable_tech.dm" +#include "forms\starlight\spells\starlight_aura.dm" +#include "forms\starlight\spells\veil_of_shadows.dm" +#include "forms\tower\spells.dm" +#include "forms\tower\structures.dm" +#include "forms\tower\tower.dm" +#include "forms\tower\deity_items\conjuration.dm" +#include "forms\tower\deity_items\transmutation.dm" +#include "mobs\deity.dm" +#include "mobs\deity_boons.dm" +#include "mobs\deity_click.dm" +#include "mobs\deity_hud.dm" +#include "mobs\deity_items.dm" +#include "mobs\deity_phenomena.dm" +#include "mobs\deity_power.dm" +#include "mobs\deity_pylon.dm" +#include "mobs\deity_sources.dm" +#include "mobs\deity_Stat.dm" +#include "mobs\deity_topic.dm" +#include "mobs\deity_tracking.dm" +#include "mobs\say.dm" +#include "mobs\freelook\cultnet.dm" +#include "mobs\freelook\mask.dm" +#include "mobs\items\deity_item.dm" +#include "mobs\items\general.dm" +#include "mobs\items\generic.dm" +#include "mobs\menu\deity_nano.dm" +#include "mobs\phenomena\_defines.dm" +#include "mobs\phenomena\communication.dm" +#include "mobs\phenomena\conjuration.dm" +#include "mobs\phenomena\conversion.dm" +#include "mobs\phenomena\generic.dm" +#include "mobs\phenomena\narsie.dm" +#include "mobs\phenomena\phenomena.dm" +#include "mobs\phenomena\starlight.dm" +#include "mobs\phenomena\transmutation.dm" +#include "screen\intent.dm" +#include "spells\boon.dm" +#include "spells\construction.dm" +#include "spells\open_gateway.dm" +#include "spells\vision.dm" +#include "structures\altar.dm" +#include "structures\pylon.dm" +#include "structures\structures.dm" +#include "structures\trap.dm" +// END_INCLUDE +#endif \ No newline at end of file diff --git a/mods/gamemodes/deity/codex.dm b/mods/gamemodes/deity/codex.dm new file mode 100644 index 00000000000..59cc978a76a --- /dev/null +++ b/mods/gamemodes/deity/codex.dm @@ -0,0 +1,43 @@ +/datum/codex_entry/deity + abstract_type = /datum/codex_entry/deity + +/datum/codex_entry/deity/altar + associated_paths = list(/obj/structure/deity/altar) + mechanics_text = "To place someone upon the altar, first have them in an aggressive grab and click the altar while adjacent." + antag_text = "This structure anchors your deity within this realm, granting them additional power to influence it and empower their followers. Additionally, using it as a focus for their powers, they can convert someone laying on top of the altar.
    " + disambiguator = "occult" + +/datum/codex_entry/deity/blood_forge + associated_paths = list(/obj/structure/deity/blood_forge) + antag_text = "Allows creation of special items by feeding your blood into it. Only usable by cultists of the aligned deity." + disambiguator = "occult" + +/datum/codex_entry/deity/blood_stone + associated_paths = list(/obj/structure/deity/blood_stone) + antag_text = "Allows the user to feed blood directly to the aligned deity, granting it power." + disambiguator = "occult" + +/datum/codex_entry/deity/gateway + associated_paths = list(/obj/structure/deity/gateway) + antag_text = "Stand within the gateway to be transported to an unknown dimension and transformed into a flaming Starborn, a mysterious Blueforged or a subtle Shadowling." + disambiguator = "occult" + +/datum/codex_entry/deity/radiant_statue + associated_paths = list(/obj/structure/deity/radiant_statue) + antag_text = "Allows storage of power if cultists are nearby. This stored power can be expended to charge Starlight items." + disambiguator = "occult" + +/datum/codex_entry/deity/blood_forge/starlight + associated_paths = list(/obj/structure/deity/blood_forge/starlight) + antag_text = "Allows creation of special Starlight items. Only usable by cultists of the aligned deity. Use of this powerful forge will inflict burns." + disambiguator = "occult" + +/datum/codex_entry/deity/wizard_recharger + associated_paths = list(/obj/structure/deity/wizard_recharger) + antag_text = "A well of arcane power. When charged, a cultist may absorb this power to refresh their spells." + disambiguator = "occult" + +/datum/codex_entry/deity/pylon + associated_paths = list(/obj/structure/deity/pylon) + antag_text = "Serves as a conduit for a deity to speak through, making their will known in this dimension to any who hear it." + disambiguator = "occult" \ No newline at end of file diff --git a/maps/antag_spawn/deity/deity.dm b/mods/gamemodes/deity/deity_base.dm similarity index 82% rename from maps/antag_spawn/deity/deity.dm rename to mods/gamemodes/deity/deity_base.dm index 98a32a7e781..0d7268ebd64 100644 --- a/maps/antag_spawn/deity/deity.dm +++ b/mods/gamemodes/deity/deity_base.dm @@ -1,6 +1,8 @@ /datum/map_template/ruin/antag_spawn/deity name = "Deity Base" - suffixes = list("deity/deity_base.dmm") + mappaths = list( + "mods/gamemodes/deity/deity_base.dmm" + ) apc_test_exempt_areas = list( /area/map_template/deity_spawn = NO_SCRUBBER|NO_VENT|NO_APC ) diff --git a/maps/antag_spawn/deity/deity_base.dmm b/mods/gamemodes/deity/deity_base.dmm similarity index 100% rename from maps/antag_spawn/deity/deity_base.dmm rename to mods/gamemodes/deity/deity_base.dmm diff --git a/code/game/antagonist/outsider/deity.dm b/mods/gamemodes/deity/deity_role.dm similarity index 100% rename from code/game/antagonist/outsider/deity.dm rename to mods/gamemodes/deity/deity_role.dm diff --git a/code/datums/extensions/deity_be_near.dm b/mods/gamemodes/deity/extensions/deity_be_near.dm similarity index 92% rename from code/datums/extensions/deity_be_near.dm rename to mods/gamemodes/deity/extensions/deity_be_near.dm index 38c57449fc0..d7494667b50 100644 --- a/code/datums/extensions/deity_be_near.dm +++ b/mods/gamemodes/deity/extensions/deity_be_near.dm @@ -31,10 +31,10 @@ var/dist = get_dist(holder,s) if(dist < min_dist) min_dist = dist - if(min_dist > threshold_base) - deal_damage(I.loc, round(min_dist/threshold_base)) - else if(keep_away_instead && min_dist < threshold_base) + if(keep_away_instead && min_dist < threshold_base) deal_damage(I.loc, round(threshold_base/min_dist)) + else if(min_dist > threshold_base) + deal_damage(I.loc, round(min_dist/threshold_base)) /datum/extension/deity_be_near/proc/deal_damage(var/mob/living/victim, var/mult) @@ -42,7 +42,7 @@ /datum/extension/deity_be_near/proc/dead_deity() var/obj/item/I = holder - I.visible_message("\The [holder]'s power fades!") + I.visible_message(SPAN_WARNING("\The [holder]'s power fades!")) qdel(src) /datum/extension/deity_be_near/proc/wearing_full() diff --git a/code/modules/mob/living/deity/forms.dm b/mods/gamemodes/deity/forms/forms.dm similarity index 95% rename from code/modules/mob/living/deity/forms.dm rename to mods/gamemodes/deity/forms/forms.dm index b9f083eae9e..6f1f2f135b3 100644 --- a/code/modules/mob/living/deity/forms.dm +++ b/mods/gamemodes/deity/forms/forms.dm @@ -30,6 +30,7 @@ Each plays slightly different and has different challenges/benefits D.set_items(complete_items) items.Cut() +// TODO: Make this not a thing. It's so bad. /datum/god_form/proc/sync_structure(var/obj/O) var/list/svars = buildables[O.type] if(!svars) @@ -38,7 +39,7 @@ Each plays slightly different and has different challenges/benefits O.vars[V] = svars[V] /datum/god_form/proc/take_charge(var/mob/living/user, var/charge) - return 1 + return TRUE /datum/god_form/Destroy() if(linked_god) diff --git a/code/modules/mob/living/deity/items/narsie/basic.dm b/mods/gamemodes/deity/forms/narsie/deity_items/basic.dm similarity index 87% rename from code/modules/mob/living/deity/items/narsie/basic.dm rename to mods/gamemodes/deity/forms/narsie/deity_items/basic.dm index 764bd556c7d..15613d71311 100644 --- a/code/modules/mob/living/deity/items/narsie/basic.dm +++ b/mods/gamemodes/deity/forms/narsie/deity_items/basic.dm @@ -26,9 +26,9 @@ base_cost = 110 boon_path = /spell/aoe_turf/drain_blood -/datum/deity_item/phenomena/exhude_blood - name = "Phenomena: Exhude Blood" - desc = "You extract the raw blood used in your faith and give it to one of your flock" +/datum/deity_item/phenomena/exude_blood + name = "Phenomena: Exude Blood" + desc = "You extract the raw blood used in your faith and give it to one of your flock." category = "Dark Spells" base_cost = 30 - phenomena_path = /datum/phenomena/exhude_blood \ No newline at end of file + phenomena_path = /datum/phenomena/exude_blood \ No newline at end of file diff --git a/code/modules/mob/living/deity/items/narsie/minions.dm b/mods/gamemodes/deity/forms/narsie/deity_items/minions.dm similarity index 100% rename from code/modules/mob/living/deity/items/narsie/minions.dm rename to mods/gamemodes/deity/forms/narsie/deity_items/minions.dm diff --git a/code/modules/mob/living/deity/items/narsie/sacrificing.dm b/mods/gamemodes/deity/forms/narsie/deity_items/sacrificing.dm similarity index 100% rename from code/modules/mob/living/deity/items/narsie/sacrificing.dm rename to mods/gamemodes/deity/forms/narsie/deity_items/sacrificing.dm diff --git a/code/modules/mob/living/deity/items/narsie/smithing.dm b/mods/gamemodes/deity/forms/narsie/deity_items/smithing.dm similarity index 100% rename from code/modules/mob/living/deity/items/narsie/smithing.dm rename to mods/gamemodes/deity/forms/narsie/deity_items/smithing.dm diff --git a/code/game/gamemodes/godmode/form_items/narsie_items.dm b/mods/gamemodes/deity/forms/narsie/items.dm similarity index 78% rename from code/game/gamemodes/godmode/form_items/narsie_items.dm rename to mods/gamemodes/deity/forms/narsie/items.dm index c315f34f390..121a142efcd 100644 --- a/code/game/gamemodes/godmode/form_items/narsie_items.dm +++ b/mods/gamemodes/deity/forms/narsie/items.dm @@ -21,13 +21,13 @@ if(H.should_have_organ(BP_HEART)) multiplier++ if(L.stat == DEAD) - to_chat(user, "\The [a] is already dead! There is nothing to take!") + to_chat(user, SPAN_WARNING("\The [a] is already dead! There is nothing to take!")) return - user.visible_message("\The [user] hovers \the [src] over \the [a], whispering an incantation.") + user.visible_message(SPAN_WARNING("\The [user] hovers \the [src] over \the [a], whispering an incantation.")) if(!do_after(user,200, L)) return - user.visible_message("\The [user] plunges the knife down into \the [a]!") + user.visible_message(SPAN_DANGER("\The [user] plunges the knife down into \the [a]!")) L.take_damage(20) if(altar.linked_god) altar.linked_god.adjust_power_min(2 * multiplier,0,"from a delicious sacrifice!") @@ -44,14 +44,14 @@ /obj/item/twohanded/fireaxe/cult/examine(mob/user) . = ..() if(stored_power) - to_chat(user, "It exudes a death-like smell.") + to_chat(user, SPAN_NOTICE("It exudes a death-like smell.")) /obj/item/twohanded/fireaxe/cult/resolve_attackby(var/atom/a, var/mob/user, var/click_params) if(istype(a, /obj/structure/deity/altar)) var/obj/structure/deity/altar/altar = a if(stored_power && altar.linked_god) altar.linked_god.adjust_power_min(stored_power, "from harvested souls.") - altar.visible_message("\The [altar] absorbs a black mist exuded from \the [src].") + altar.visible_message(SPAN_WARNING("\The [altar] absorbs a black mist exuded from \the [src].")) return if(ismob(a)) var/mob/M = a @@ -63,7 +63,7 @@ /obj/item/twohanded/fireaxe/cult/proc/gain_power() stored_power += 50 - src.visible_message("\The [src] screeches as the smell of death fills the air!") + src.visible_message(SPAN_OCCULT("\The [src] screeches as the smell of death fills the air!")) /obj/item/chems/drinks/zombiedrink name = "well-used urn" diff --git a/code/modules/mob/living/deity/forms/narsie.dm b/mods/gamemodes/deity/forms/narsie/narsie.dm similarity index 93% rename from code/modules/mob/living/deity/forms/narsie.dm rename to mods/gamemodes/deity/forms/narsie/narsie.dm index 930f095dd41..8dc0fbbb0f8 100644 --- a/code/modules/mob/living/deity/forms/narsie.dm +++ b/mods/gamemodes/deity/forms/narsie/narsie.dm @@ -21,7 +21,7 @@ /datum/deity_item/boon/torment, /datum/deity_item/boon/blood_shard, /datum/deity_item/boon/drain_blood, - /datum/deity_item/phenomena/exhude_blood, + /datum/deity_item/phenomena/exude_blood, /datum/deity_item/sacrifice, /datum/deity_item/boon/sac_dagger, /datum/deity_item/boon/sac_spell, @@ -40,7 +40,7 @@ /datum/god_form/narsie/take_charge(var/mob/living/user, var/charge) charge = min(100, charge * 0.25) if(prob(charge)) - to_chat(user, "You feel drained...") + to_chat(user, SPAN_WARNING("You feel drained...")) var/mob/living/carbon/human/H = user if(istype(H) && H.should_have_organ(BP_HEART)) H.vessel.remove_any(charge) diff --git a/code/modules/spells/general/tear_veil.dm b/mods/gamemodes/deity/forms/narsie/spells/tear_veil.dm similarity index 83% rename from code/modules/spells/general/tear_veil.dm rename to mods/gamemodes/deity/forms/narsie/spells/tear_veil.dm index 02a117c3504..93be7be78e6 100644 --- a/code/modules/spells/general/tear_veil.dm +++ b/mods/gamemodes/deity/forms/narsie/spells/tear_veil.dm @@ -15,11 +15,11 @@ /mob/living/simple_animal/hostile/scarybat/cult, /mob/living/simple_animal/hostile/creature/cult, /mob/living/simple_animal/hostile/faithless/cult - ) + ) /spell/tear_veil/choose_targets() var/turf/T = get_turf(holder) - holder.visible_message("A strange portal rips open underneath \the [holder]!") + holder.visible_message(SPAN_NOTICE("A strange portal rips open underneath \the [holder]!")) var/obj/effect/gateway/hole = new(get_turf(T)) hole.density = FALSE return list(hole) @@ -30,7 +30,7 @@ var/type = pick(possible_spawns) var/mob/living/L = new type(get_turf(targets[1])) L.faction = holder.faction - L.visible_message("\A [L] escapes from the portal!") + L.visible_message(SPAN_WARNING("\A [L] escapes from the portal!")) /spell/tear_veil/after_spell(var/list/targets) qdel(targets[1]) diff --git a/code/game/gamemodes/godmode/form_items/narsie_structures.dm b/mods/gamemodes/deity/forms/narsie/structures.dm similarity index 72% rename from code/game/gamemodes/godmode/form_items/narsie_structures.dm rename to mods/gamemodes/deity/forms/narsie/structures.dm index 6dcdde9a6ed..1f8dea6259e 100644 --- a/code/game/gamemodes/godmode/form_items/narsie_structures.dm +++ b/mods/gamemodes/deity/forms/narsie/structures.dm @@ -11,10 +11,12 @@ current_health = 50 var/busy = 0 var/recipe_feat_list = "Blood Crafting" - var/text_modifications = list("Cost" = "Blood", - "Dip" = "fire. Pain envelopes you as blood seeps out of your hands and you begin to shape it into something more useful", - "Shape" = "You shape the fire as more and more blood comes out.", - "Out" = "flames") + var/text_modifications = list( + "Cost" = "Blood", + "Dip" = "fire. Pain envelops you as blood seeps out of your hands and you begin to shape it into something more useful", + "Shape" = "You shape the fire as more and more blood comes out.", + "Out" = "flames" + ) power_adjustment = 2 @@ -48,11 +50,11 @@ /obj/structure/deity/blood_forge/proc/craft_item(var/path, var/blood_cost, var/mob/user) if(busy) - to_chat(user, "Someone is already using \the [src]!") + to_chat(user, SPAN_WARNING("Someone is already using \the [src]!")) return busy = 1 - to_chat(user, "You dip your hands into \the [src]'s [text_modifications["Dip"]]") + to_chat(user, SPAN_NOTICE("You dip your hands into \the [src]'s [text_modifications["Dip"]]")) for(var/count = 0, count < blood_cost/10, count++) if(!do_after(user, 50,src)) busy = 0 @@ -68,22 +70,23 @@ if(linked_god) linked_god.take_charge(user, charge) -//BLOOD LETTING STRUCTURE -//A follower can stand here and mumble prays as they let their blood flow slowly into the structure. +//BLOODLETTING STRUCTURE +//A follower can stand here and mumble prayers as they let their blood flow slowly into the structure. /obj/structure/deity/blood_stone name = "bloody stone" desc = "A jagged stone covered in the various stages of blood, from dried to fresh." icon_state = "blood_stone" - current_health = 100 //Its a piece of rock. + // TODO: material-based health for deity structures + current_health = 100 //It's a piece of rock. build_cost = 700 /obj/structure/deity/blood_stone/attack_hand(var/mob/user) if(!linked_god || !linked_god.is_follower(user, silent = 1) || !ishuman(user)) return ..() var/mob/living/carbon/human/H = user - user.visible_message("\The [user] calmly slices their finger on \the [src], smeering it over the black stone.","You slowly slide your finger down one of \the [src]'s sharp edges, smeering it over its smooth surface.") + user.visible_message(SPAN_WARNING("\The [user] calmly slices their finger on \the [src], smeering it over the black stone."),SPAN_WARNING("You slowly slide your finger down one of \the [src]'s sharp edges, smeering it over its smooth surface.")) while(do_after(H,50,src)) - user.audible_message("\The [user] utters something under their breath.", "You mutter a dark prayer to your master as you feel the stone eat away at your lifeforce.") + user.audible_message("\The [user] utters something under their breath.", SPAN_OCCULT("You mutter a dark prayer to your master as you feel the stone eat away at your lifeforce.")) if(H.should_have_organ(BP_HEART)) H.drip(5,get_turf(src)) else diff --git a/code/modules/mob/living/deity/items/starlight/artifacts.dm b/mods/gamemodes/deity/forms/starlight/deity_items/artifacts.dm similarity index 100% rename from code/modules/mob/living/deity/items/starlight/artifacts.dm rename to mods/gamemodes/deity/forms/starlight/deity_items/artifacts.dm diff --git a/code/modules/mob/living/deity/items/starlight/phenomena.dm b/mods/gamemodes/deity/forms/starlight/deity_items/phenomena.dm similarity index 100% rename from code/modules/mob/living/deity/items/starlight/phenomena.dm rename to mods/gamemodes/deity/forms/starlight/deity_items/phenomena.dm diff --git a/code/modules/mob/living/deity/items/starlight/spells.dm b/mods/gamemodes/deity/forms/starlight/deity_items/spells.dm similarity index 100% rename from code/modules/mob/living/deity/items/starlight/spells.dm rename to mods/gamemodes/deity/forms/starlight/deity_items/spells.dm diff --git a/code/game/gamemodes/godmode/form_items/starlight_items.dm b/mods/gamemodes/deity/forms/starlight/items.dm similarity index 93% rename from code/game/gamemodes/godmode/form_items/starlight_items.dm rename to mods/gamemodes/deity/forms/starlight/items.dm index c3dd8c8b5ce..ce799b72f96 100644 --- a/code/game/gamemodes/godmode/form_items/starlight_items.dm +++ b/mods/gamemodes/deity/forms/starlight/items.dm @@ -110,7 +110,7 @@ else user.take_damage(5, BURN) if(prob(5)) - to_chat(user, "\The [src] appears to be out of power!") + to_chat(user, SPAN_WARNING("\The [src] appears to be out of power!")) new /obj/effect/temporary(get_turf(user),3, 'icons/effects/effects.dmi', "fire_goon") /obj/item/gun/energy/staff/beacon @@ -146,13 +146,13 @@ if(linked.near_structure(src,1)) if(last_near_structure < world.time - 30 SECONDS) - to_chat(loc, "\The [src] surges with power anew!") + to_chat(loc, SPAN_NOTICE("\The [src] surges with power anew!")) last_near_structure = world.time else if(last_near_structure < world.time - 30 SECONDS) //If it has been at least 30 seconds. if(prob(5)) - to_chat(loc, "\The [src] begins to fade, its power dimming this far away from a shrine.") + to_chat(loc, SPAN_WARNING("\The [src] begins to fade, its power dimming this far away from a shrine.")) else if(last_near_structure + 1800 < world.time) - visible_message("\The [src] disintegrates into a pile of ash!") + visible_message(SPAN_WARNING("\The [src] disintegrates into a pile of ash!")) new /obj/effect/decal/cleanable/ash(get_turf(src)) qdel(src) diff --git a/code/game/gamemodes/godmode/form_items/starlight_mobs.dm b/mods/gamemodes/deity/forms/starlight/mobs.dm similarity index 100% rename from code/game/gamemodes/godmode/form_items/starlight_mobs.dm rename to mods/gamemodes/deity/forms/starlight/mobs.dm diff --git a/mods/gamemodes/deity/forms/starlight/spells/disable_tech.dm b/mods/gamemodes/deity/forms/starlight/spells/disable_tech.dm new file mode 100644 index 00000000000..f6462ae33fe --- /dev/null +++ b/mods/gamemodes/deity/forms/starlight/spells/disable_tech.dm @@ -0,0 +1,4 @@ +/spell/aoe_turf/disable_tech/starlight + hidden_from_codex = TRUE + charge_max = 600 + spell_flags = 0 \ No newline at end of file diff --git a/mods/gamemodes/deity/forms/starlight/spells/starlight_aura.dm b/mods/gamemodes/deity/forms/starlight/spells/starlight_aura.dm new file mode 100644 index 00000000000..8ad867e41b3 --- /dev/null +++ b/mods/gamemodes/deity/forms/starlight/spells/starlight_aura.dm @@ -0,0 +1,5 @@ +/spell/radiant_aura/starlight + name = "Starlight Aura" + desc = "This spell makes you immune to laser fire, for a short while at least." + spell_flags = 0 + charge_max = 400 diff --git a/code/modules/spells/general/veil_of_shadows.dm b/mods/gamemodes/deity/forms/starlight/spells/veil_of_shadows.dm similarity index 87% rename from code/modules/spells/general/veil_of_shadows.dm rename to mods/gamemodes/deity/forms/starlight/spells/veil_of_shadows.dm index 4d328e65db0..a103f71a8fb 100644 --- a/code/modules/spells/general/veil_of_shadows.dm +++ b/mods/gamemodes/deity/forms/starlight/spells/veil_of_shadows.dm @@ -4,7 +4,7 @@ charge_max = 400 invocation_type = SpI_EMOTE invocation = "flickers out of existance" - school = "Divine" //Means that it doesn't proc the deity's spell cost. + school = "Divine" spell_flags = 0 duration = 100 var/timer_id @@ -21,7 +21,7 @@ var/mob/living/carbon/human/H = user H.AddMovementHandler(/datum/movement_handler/mob/incorporeal) if(H.add_cloaking_source(src)) - H.visible_message("\The [H] shrinks from view!") + H.visible_message(SPAN_WARNING("\The [H] shrinks from view!")) events_repository.register(/decl/observ/moved, H,src,PROC_REF(check_light)) timer_id = addtimer(CALLBACK(src,PROC_REF(cancel_veil)),duration, TIMER_STOPPABLE) @@ -40,7 +40,7 @@ /spell/veil_of_shadows/proc/drop_cloak() var/mob/living/carbon/human/H = holder if(H.remove_cloaking_source(src)) - H.visible_message("\The [H] appears from nowhere!") + H.visible_message(SPAN_NOTICE("\The [H] appears from nowhere!")) events_repository.unregister(/decl/observ/moved, H,src) /spell/veil_of_shadows/proc/check_light() diff --git a/code/modules/mob/living/deity/forms/starlight.dm b/mods/gamemodes/deity/forms/starlight/starlight.dm similarity index 96% rename from code/modules/mob/living/deity/forms/starlight.dm rename to mods/gamemodes/deity/forms/starlight/starlight.dm index 4d4e7b69beb..ba3b75a83e8 100644 --- a/code/modules/mob/living/deity/forms/starlight.dm +++ b/mods/gamemodes/deity/forms/starlight/starlight.dm @@ -42,6 +42,6 @@ /datum/god_form/starlight/take_charge(var/mob/living/user, var/charge) charge = max(5, charge/100) if(prob(charge)) - to_chat(user, "Your body burns!") + to_chat(user, SPAN_DANGER("Your body burns!")) user.take_damage(charge, BURN) return 1 \ No newline at end of file diff --git a/code/game/gamemodes/godmode/form_items/starlight_structures.dm b/mods/gamemodes/deity/forms/starlight/structures.dm similarity index 84% rename from code/game/gamemodes/godmode/form_items/starlight_structures.dm rename to mods/gamemodes/deity/forms/starlight/structures.dm index 6cb410e9838..9d8ff298ccb 100644 --- a/code/game/gamemodes/godmode/form_items/starlight_structures.dm +++ b/mods/gamemodes/deity/forms/starlight/structures.dm @@ -58,7 +58,7 @@ if(!linked_god) return if(linked_god.power <= 0) - to_chat(linked_god,"\The [src] disappears from your lack of power!") + to_chat(linked_god,SPAN_WARNING("\The [src] disappears from your lack of power!")) qdel(src) return var/mob/living/carbon/human/target @@ -71,10 +71,10 @@ start_time = 0 return else if(prob(5)) - to_chat(target,"\The [src] sucks at your lifeforce!") + to_chat(target,SPAN_DANGER("\The [src] sucks at your lifeforce!")) if(start_time && world.time > start_time + 300) start_time = 0 - to_chat(target,"You have been sucked into \the [src], your soul used to fuel \the [linked_god]'s minions.") + to_chat(target,SPAN_DANGER("You have been sucked into \the [src], your soul used to fuel \the [linked_god]'s minions.")) var/mob/living/starlight_soul/ss = new(get_turf(linked_god),target) if(target.mind) target.mind.transfer_to(ss) @@ -91,7 +91,7 @@ if(T) target_ref = weakref(T) start_time = world.time - to_chat(T, "You feel your lifeforce begin to drain into \the [src]!") + to_chat(T, SPAN_DANGER("You feel your lifeforce begin to drain into \the [src]!")) /obj/structure/deity/gateway/Destroy() linked_god.power_per_regen += power_drain @@ -116,7 +116,7 @@ /obj/structure/deity/gateway/proc/stop_looking_for(var/successful) if(looking_for) if(!successful) - to_chat(linked_god, "\The [src] did not find any [looking_for]. You may try again if you wish.") + to_chat(linked_god, SPAN_WARNING("\The [src] did not find any [looking_for]. You may try again if you wish.")) looking_for = null /obj/structure/deity/gateway/OnTopic(var/mob/user, var/list/href_list) @@ -136,10 +136,10 @@ return TOPIC_HANDLED if(href_list["spawn_type"] && user == linked_god) if(looking_for) - to_chat(usr, "\The [src] is already looking for a [looking_for].") + to_chat(usr, SPAN_WARNING("\The [src] is already looking for a [looking_for].")) else looking_for = href_list["spawn_type"] - to_chat(usr, "\The [src] is now looking for a [looking_for].") + to_chat(usr, SPAN_NOTICE("\The [src] is now looking for a [looking_for].")) for(var/l in get_turf(linked_god)) if(istype(l, /mob/living/starlight_soul)) to_chat(l, "\The [src] is looking for a soul to become a [looking_for]. Accept? (Yes)") @@ -183,18 +183,18 @@ var/obj/O = L.get_equipped_item(slot_wear_suit_str) if(O && has_extension(O,/datum/extension/deity_be_near)) if(activate_charging()) - to_chat(L, "You place your hands on \the [src], feeling your master's power course through you.") + to_chat(L, SPAN_NOTICE("You place your hands on \the [src], feeling your master's power course through you.")) else - to_chat(L, "\The [src] is already activated") + to_chat(L, SPAN_WARNING("\The [src] is already activated")) else - to_chat(L, "\The [src] does not recognize you as a herald of \the [linked_god]. You must wear a full set of herald's armor.") + to_chat(L, SPAN_WARNING("\The [src] does not recognize you as a herald of \the [linked_god]. You must wear a full set of herald's armor.")) return TRUE /obj/structure/deity/radiant_statue/attack_deity(var/mob/living/deity/deity) if(activate_charging()) - to_chat(deity,"You activate \the [src], and it begins to charge as long as at least one of your followers is nearby.") + to_chat(deity,SPAN_NOTICE("You activate \the [src], and it begins to charge as long as at least one of your followers is nearby.")) else - to_chat(deity,"\The [src] is either already activated, or there are no followers nearby to charge it.") + to_chat(deity,SPAN_WARNING("\The [src] is either already activated, or there are no followers nearby to charge it.")) /obj/structure/deity/radiant_statue/proc/activate_charging() var/list/followers = get_followers_nearby() @@ -224,7 +224,7 @@ shad.charge = initial(shad.charge) . = 1 if(.) - to_chat(user, "\The [src]'s glow envelops \the [I], restoring it to proper use.") + to_chat(user, SPAN_NOTICE("\The [src]'s glow envelops \the [I], restoring it to proper use.")) charge -= 1 /obj/structure/deity/radiant_statue/Process() @@ -247,7 +247,7 @@ var/mob/living/L = m L.heal_damage(BURN, 5) if(prob(5)) - to_chat(L, "You feel a pleasant warmth spread throughout your body...") + to_chat(L, SPAN_NOTICE("You feel a pleasant warmth spread throughout your body...")) for(var/s in L.mind.learned_spells) var/spell/spell = s spell.charge_counter = spell.charge_max diff --git a/code/modules/mob/living/deity/items/tower/conjuration.dm b/mods/gamemodes/deity/forms/tower/deity_items/conjuration.dm similarity index 100% rename from code/modules/mob/living/deity/items/tower/conjuration.dm rename to mods/gamemodes/deity/forms/tower/deity_items/conjuration.dm diff --git a/code/modules/mob/living/deity/items/tower/transmutation.dm b/mods/gamemodes/deity/forms/tower/deity_items/transmutation.dm similarity index 100% rename from code/modules/mob/living/deity/items/tower/transmutation.dm rename to mods/gamemodes/deity/forms/tower/deity_items/transmutation.dm diff --git a/mods/gamemodes/deity/forms/tower/spells.dm b/mods/gamemodes/deity/forms/tower/spells.dm new file mode 100644 index 00000000000..18b88647edf --- /dev/null +++ b/mods/gamemodes/deity/forms/tower/spells.dm @@ -0,0 +1,67 @@ +/spell/create_air/tower + desc = "Allows you to generate a livable atmosphere in the area you are in." + charge_max = 5 + +/spell/hand/burning_grip/tower + desc = "Allows you cause an object to heat up intensly in someone's hand, making them drop it and whatever skin is attached." + charge_max = 3 + +/spell/hand/slippery_surface/tower + desc = "Allows you to slicken a small patch of floor. Anyone without sure-footing will find it hard to stay upright." + charge_max = 2 + +/spell/aoe_turf/knock/tower + charge_max = 2 + hidden_from_codex = TRUE + +/spell/aoe_turf/smoke/tower + charge_max = 2 + hidden_from_codex = TRUE + +/spell/aoe_turf/conjure/faithful_hound/tower + desc = "This spell allows you to summon a singular spectral dog that guards the nearby area. Anyone without the password is barked at or bitten." + charge_max = 1 + spell_flags = 0 + +/spell/aoe_turf/conjure/force_portal/tower + desc = "This spell allows you to summon a force portal. Anything that hits the portal gets sucked inside and is then thrown out when the portal explodes." + charge_max = 2 + spell_flags = 0 + +/spell/acid_spray/tower + desc = "The simplest form of aggressive conjuration: acid spray is quite effective in melting both man and object." + charge_max = 2 + +/spell/targeted/heal_target/tower + desc = "Allows you to heal yourself, or others, for a slight amount." + charge_max = 2 + +/spell/targeted/heal_target/major/tower + charge_max = 1 + spell_flags = INCLUDEUSER | SELECTABLE + desc = "Allows you to heal others for a great amount." + +/spell/targeted/heal_target/area/tower + desc = "Allows you to heal everyone in an area for minor damage." + charge_max = 1 + +/spell/targeted/ethereal_jaunt/tower + desc = "Allows you to liquefy for a short duration, letting you pass through all dense objects." + charge_max = 2 + spell_flags = Z2NOCAST | INCLUDEUSER + +/spell/aoe_turf/conjure/forcewall/tower + desc = "A temporary invincible wall for you to summon." + charge_max = 3 + +/spell/targeted/equip_item/dyrnwyn/tower + desc = "This spell allows you to summon a fiery golden sword for a short duration." + charge_max = 1 + +/spell/targeted/equip_item/shield/tower + desc = "This spell allows you to summon a magical shield for a short duration." + charge_max = 1 + +/spell/targeted/projectile/dumbfire/fireball/tower + desc = "Imbue yourself with the power of exploding fire." + charge_max = 2 \ No newline at end of file diff --git a/code/game/gamemodes/godmode/form_items/wizard_structures.dm b/mods/gamemodes/deity/forms/tower/structures.dm similarity index 100% rename from code/game/gamemodes/godmode/form_items/wizard_structures.dm rename to mods/gamemodes/deity/forms/tower/structures.dm diff --git a/code/modules/mob/living/deity/forms/tower.dm b/mods/gamemodes/deity/forms/tower/tower.dm similarity index 100% rename from code/modules/mob/living/deity/forms/tower.dm rename to mods/gamemodes/deity/forms/tower/tower.dm diff --git a/code/game/gamemodes/godmode/godmode.dm b/mods/gamemodes/deity/gamemode.dm similarity index 100% rename from code/game/gamemodes/godmode/godmode.dm rename to mods/gamemodes/deity/gamemode.dm diff --git a/code/game/antagonist/station/cult_god.dm b/mods/gamemodes/deity/god_cultist_role.dm similarity index 95% rename from code/game/antagonist/station/cult_god.dm rename to mods/gamemodes/deity/god_cultist_role.dm index 212c545f691..5085982851b 100644 --- a/code/game/antagonist/station/cult_god.dm +++ b/mods/gamemodes/deity/god_cultist_role.dm @@ -70,7 +70,7 @@ add_cultist(player, D) log_and_message_admins("has set [key_name(player.current)] to be a minion of [key_name(D)]") else - to_chat(usr, "There are no deities to be linked to.") + to_chat(usr, SPAN_WARNING("There are no deities to be linked to.")) return 1 /decl/special_role/godcultist/proc/add_cultist(var/datum/mind/player, var/mob/living/deity/deity) @@ -101,6 +101,6 @@ return //Make em wait a few seconds. - src.visible_message("\The [src] bows their head down, muttering something.", "You send the message \"[msg]\" to your master.") + src.visible_message("\The [src] bows their head down, muttering something.", SPAN_NOTICE("You send the message \"[msg]\" to your master.")) to_chat(D, "\The [src] (J) prays, \"[msg]\"") log_and_message_admins("dprayed, \"[msg]\" to \the [key_name(D)]") diff --git a/code/modules/mob/living/deity/deity.dm b/mods/gamemodes/deity/mobs/deity.dm similarity index 97% rename from code/modules/mob/living/deity/deity.dm rename to mods/gamemodes/deity/mobs/deity.dm index e23c871725c..4f3063db19e 100644 --- a/code/modules/mob/living/deity/deity.dm +++ b/mods/gamemodes/deity/mobs/deity.dm @@ -111,7 +111,7 @@ /mob/living/deity/proc/set_form(var/type) form = new type(src) - to_chat(src, "You undergo a transformation into your new form!") + to_chat(src, SPAN_NOTICE("You undergo a transformation into your new form!")) spawn(1) SetName(form.name) var/newname = sanitize(input(src, "Choose a name for your new form.", "Name change", form.name) as text, MAX_NAME_LEN) diff --git a/code/modules/mob/living/deity/deity_Stat.dm b/mods/gamemodes/deity/mobs/deity_Stat.dm similarity index 100% rename from code/modules/mob/living/deity/deity_Stat.dm rename to mods/gamemodes/deity/mobs/deity_Stat.dm diff --git a/code/modules/mob/living/deity/deity_boons.dm b/mods/gamemodes/deity/mobs/deity_boons.dm similarity index 67% rename from code/modules/mob/living/deity/deity_boons.dm rename to mods/gamemodes/deity/mobs/deity_boons.dm index 0057ccd049a..da05d9a5ff2 100644 --- a/code/modules/mob/living/deity/deity_boons.dm +++ b/mods/gamemodes/deity/mobs/deity_boons.dm @@ -2,7 +2,7 @@ if(current_boon) qdel(current_boon) current_boon = boon - to_chat(src,"You now have the boon [boon]") + to_chat(src, SPAN_NOTICE("You now have the boon [boon]")) if(istype(boon, /atom/movable)) var/atom/movable/A = boon nano_data["boon_name"] = A.name @@ -26,10 +26,10 @@ var/obj/O = L.equip_to_storage(I) if(O) origin_text = "in \the [O]" - to_chat(L,"It appears [origin_text].") + to_chat(L, SPAN_NOTICE("It appears [origin_text].")) - to_chat(L, "\The [src] grants you a boon of [current_boon]!") - to_chat(src, "You give \the [L] a boon of [current_boon].") + to_chat(L, SPAN_OCCULT("\The [src] grants you a boon of [current_boon]!")) + to_chat(src, SPAN_NOTICE("You give \the [L] a boon of [current_boon].")) log_and_message_admins("gave [key_name(L)] the boon [current_boon]") current_boon = null nano_data["boon_name"] = null @@ -40,16 +40,15 @@ for(var/s in M.learned_spells) var/spell/S = s if(istype(S, spell.type)) - to_chat(src, "They already know that spell!") + to_chat(src, SPAN_WARNING("They already know that spell!")) return 0 target.add_spell(spell) spell.set_connected_god(src) - to_chat(target, "You feel a surge of power as you learn the art of [current_boon].") + to_chat(target, SPAN_NOTICE("You feel a surge of power as you learn the art of [current_boon].")) return 1 -/* This is a generic proc used by the God to inact a sacrifice from somebody. Power is a value of magnitude. +/* This is a generic proc used by the God to enact a sacrifice from somebody. Power is a value of magnitude. */ /mob/living/deity/proc/take_charge(var/mob/living/L, var/power) if(form) - return form.take_charge(L, power) - return 1 \ No newline at end of file + form.take_charge(L, power) \ No newline at end of file diff --git a/code/modules/mob/living/deity/deity_click.dm b/mods/gamemodes/deity/mobs/deity_click.dm similarity index 86% rename from code/modules/mob/living/deity/deity_click.dm rename to mods/gamemodes/deity/mobs/deity_click.dm index 35cee5dadc6..06fff223062 100644 --- a/code/modules/mob/living/deity/deity_click.dm +++ b/mods/gamemodes/deity/mobs/deity_click.dm @@ -8,7 +8,7 @@ var/list/modifiers = params2list(params) if(modifiers["shift"] || modifiers["ctrl"]) if(silenced) - to_chat(src, "You cannot do that as you are silenced!") + to_chat(src, SPAN_WARNING("You cannot do that as you are silenced!")) else var/datum/phenomena/phenomena = get_phenomena(modifiers["shift"], modifiers["ctrl"]) if(phenomena) diff --git a/code/_onclick/hud/deity.dm b/mods/gamemodes/deity/mobs/deity_hud.dm similarity index 100% rename from code/_onclick/hud/deity.dm rename to mods/gamemodes/deity/mobs/deity_hud.dm diff --git a/code/modules/mob/living/deity/deity_items.dm b/mods/gamemodes/deity/mobs/deity_items.dm similarity index 100% rename from code/modules/mob/living/deity/deity_items.dm rename to mods/gamemodes/deity/mobs/deity_items.dm diff --git a/code/modules/mob/living/deity/deity_phenomena.dm b/mods/gamemodes/deity/mobs/deity_phenomena.dm similarity index 94% rename from code/modules/mob/living/deity/deity_phenomena.dm rename to mods/gamemodes/deity/mobs/deity_phenomena.dm index 37274813395..6cb38eec0ec 100644 --- a/code/modules/mob/living/deity/deity_phenomena.dm +++ b/mods/gamemodes/deity/mobs/deity_phenomena.dm @@ -17,7 +17,7 @@ /mob/living/deity/proc/silence(var/amount) if(!silenced) - to_chat(src, "You've been silenced! Your phenomenas are disabled!") + to_chat(src, SPAN_WARNING("You've been silenced! Your phenomenas are disabled!")) var/obj/screen/intent/deity/SD = istype(hud_used) && hud_used.action_intent if(istype(SD)) SD.color = "#ff0000" @@ -33,7 +33,7 @@ if(silenced > 0) silenced-- if(!silenced) - to_chat(src, "You are no longer silenced.") + to_chat(src, SPAN_NOTICE("You are no longer silenced.")) var/obj/screen/intent/deity/SD = istype(hud_used) && hud_used.action_intent if(istype(SD)) SD.color = null diff --git a/code/modules/mob/living/deity/deity_power.dm b/mods/gamemodes/deity/mobs/deity_power.dm similarity index 100% rename from code/modules/mob/living/deity/deity_power.dm rename to mods/gamemodes/deity/mobs/deity_power.dm diff --git a/code/modules/mob/living/deity/deity_pylon.dm b/mods/gamemodes/deity/mobs/deity_pylon.dm similarity index 100% rename from code/modules/mob/living/deity/deity_pylon.dm rename to mods/gamemodes/deity/mobs/deity_pylon.dm diff --git a/code/modules/mob/living/deity/deity_sources.dm b/mods/gamemodes/deity/mobs/deity_sources.dm similarity index 95% rename from code/modules/mob/living/deity/deity_sources.dm rename to mods/gamemodes/deity/mobs/deity_sources.dm index 4c479cff036..a1ec947983d 100644 --- a/code/modules/mob/living/deity/deity_sources.dm +++ b/mods/gamemodes/deity/mobs/deity_sources.dm @@ -56,7 +56,7 @@ if(L.mind in minions) return 1 if(!silent) - to_chat(src, "You do not feel a malleable mind behind that frame.") + to_chat(src, SPAN_WARNING("You do not feel a malleable mind behind that frame.")) return 0 /mob/living/deity/fully_replace_character_name(var/new_name, var/in_depth = TRUE) diff --git a/code/modules/mob/living/deity/deity_topic.dm b/mods/gamemodes/deity/mobs/deity_topic.dm similarity index 89% rename from code/modules/mob/living/deity/deity_topic.dm rename to mods/gamemodes/deity/mobs/deity_topic.dm index 089c98092f3..01226e8ddc5 100644 --- a/code/modules/mob/living/deity/deity_topic.dm +++ b/mods/gamemodes/deity/mobs/deity_topic.dm @@ -33,14 +33,14 @@ eyeobj.setLoc(get_turf(a)) if(follow) follow_follower(a) - to_chat(src, "[follow ? "Following" : "Jumping to"] \the [a]") + to_chat(src, SPAN_NOTICE("[follow ? "Following" : "Jumping to"] \the [a]")) return TOPIC_HANDLED if(href_list["buy"]) var/datum/deity_item/di = locate(href_list["buy"]) if(di.can_buy(src)) di.buy(src) else - to_chat(di,"You don't meet all the requirements for [di.name]!") + to_chat(di,SPAN_WARNING("You don't meet all the requirements for [di.name]!")) return TOPIC_HANDLED if(href_list["switchCategory"]) set_nano_category(text2num(href_list["switchCategory"])) diff --git a/code/modules/mob/living/deity/deity_tracking.dm b/mods/gamemodes/deity/mobs/deity_tracking.dm similarity index 89% rename from code/modules/mob/living/deity/deity_tracking.dm rename to mods/gamemodes/deity/mobs/deity_tracking.dm index 0b8de46e9f4..27e9d3b552d 100644 --- a/code/modules/mob/living/deity/deity_tracking.dm +++ b/mods/gamemodes/deity/mobs/deity_tracking.dm @@ -23,7 +23,7 @@ if(following) stop_follow() eyeobj.setLoc(get_turf(L)) - to_chat(src, "You begin to follow \the [L].") + to_chat(src, SPAN_NOTICE("You begin to follow \the [L].")) following = L events_repository.register(/decl/observ/moved, L, src, TYPE_PROC_REF(/mob/living/deity, keep_following)) events_repository.register(/decl/observ/destroyed, L, src, TYPE_PROC_REF(/mob/living/deity, stop_follow)) @@ -33,7 +33,7 @@ events_repository.unregister(/decl/observ/moved, following, src) events_repository.unregister(/decl/observ/destroyed, following, src) events_repository.unregister(/decl/observ/death, following,src) - to_chat(src, "You stop following \the [following].") + to_chat(src, SPAN_NOTICE("You stop following \the [following].")) following = null /mob/living/deity/proc/keep_following(var/atom/movable/moving_instance, var/atom/old_loc, var/atom/new_loc) diff --git a/code/modules/mob/observer/eye/freelook/cult/cultnet.dm b/mods/gamemodes/deity/mobs/freelook/cultnet.dm similarity index 100% rename from code/modules/mob/observer/eye/freelook/cult/cultnet.dm rename to mods/gamemodes/deity/mobs/freelook/cultnet.dm diff --git a/code/modules/mob/observer/eye/freelook/cult/mask.dm b/mods/gamemodes/deity/mobs/freelook/mask.dm similarity index 100% rename from code/modules/mob/observer/eye/freelook/cult/mask.dm rename to mods/gamemodes/deity/mobs/freelook/mask.dm diff --git a/code/modules/mob/living/deity/items/deity_item.dm b/mods/gamemodes/deity/mobs/items/deity_item.dm similarity index 100% rename from code/modules/mob/living/deity/items/deity_item.dm rename to mods/gamemodes/deity/mobs/items/deity_item.dm diff --git a/code/modules/mob/living/deity/items/general.dm b/mods/gamemodes/deity/mobs/items/general.dm similarity index 100% rename from code/modules/mob/living/deity/items/general.dm rename to mods/gamemodes/deity/mobs/items/general.dm diff --git a/code/modules/mob/living/deity/items/generic.dm b/mods/gamemodes/deity/mobs/items/generic.dm similarity index 100% rename from code/modules/mob/living/deity/items/generic.dm rename to mods/gamemodes/deity/mobs/items/generic.dm diff --git a/code/modules/mob/living/deity/menu/deity_nano.dm b/mods/gamemodes/deity/mobs/menu/deity_nano.dm similarity index 100% rename from code/modules/mob/living/deity/menu/deity_nano.dm rename to mods/gamemodes/deity/mobs/menu/deity_nano.dm diff --git a/code/modules/mob/living/deity/phenomena/_defines.dm b/mods/gamemodes/deity/mobs/phenomena/_defines.dm similarity index 100% rename from code/modules/mob/living/deity/phenomena/_defines.dm rename to mods/gamemodes/deity/mobs/phenomena/_defines.dm diff --git a/code/modules/mob/living/deity/phenomena/communication.dm b/mods/gamemodes/deity/mobs/phenomena/communication.dm similarity index 77% rename from code/modules/mob/living/deity/phenomena/communication.dm rename to mods/gamemodes/deity/mobs/phenomena/communication.dm index a83130f1ec7..b3d603bd1c2 100644 --- a/code/modules/mob/living/deity/phenomena/communication.dm +++ b/mods/gamemodes/deity/mobs/phenomena/communication.dm @@ -12,7 +12,7 @@ if(!linked.is_follower(L)) text_size = 1 to_chat(L, "[text_to_send]") //Note to self: make this go to ghosties - to_chat(linked, "You send the message [text_to_send] to \the [L]") + to_chat(linked, SPAN_NOTICE("You send the message [text_to_send] to \the [L]")) log_and_message_admins("communicated the message \"[text_to_send]\" to [key_name(L)]", linked) /datum/phenomena/point @@ -35,7 +35,7 @@ if(mind.current) var/mob/M = mind.current if((M in view) && M.client) - to_chat(M, "Your attention is eerily drawn to \the [a].") + to_chat(M, SPAN_OCCULT("Your attention is eerily drawn to \the [a].")) M.client.images += arrow events_repository.register(/decl/observ/logged_out, M, src, TYPE_PROC_REF(/datum/phenomena/point, remove_image)) spawn(20) @@ -59,22 +59,22 @@ if(!pain) return if(punishment_list[pain] && linked.power < punishment_list[pain]) - to_chat(linked, "[pain] costs too much power for you to use on \the [L]") + to_chat(linked, SPAN_WARNING("[pain] costs too much power for you to use on \the [L]")) return ..() linked.adjust_power(-punishment_list[pain]) switch(pain) if("Pain (0)") L.take_damage(15, PAIN) - to_chat(L, "You feel intense disappointment coming at you from beyond the veil.") + to_chat(L, SPAN_WARNING("You feel intense disappointment coming at you from beyond the veil.")) if("Light Wound (5)") L.take_damage(5) - to_chat(L, "You feel an ethereal whip graze your very soul!") + to_chat(L, SPAN_WARNING("You feel an ethereal whip graze your very soul!")) if("Brain Damage (10)") L.take_damage(5, BRAIN) - to_chat(L, "You feel your mind breaking under a otherwordly hammer...") + to_chat(L, SPAN_DANGER("You feel your mind breaking under a otherwordly hammer...")) if("Heavy Wounds (20)") L.take_damage(25) - to_chat(L, "You feel your master turn its destructive potential against you!") - to_chat(linked, "You punish \the [L].") + to_chat(L, SPAN_DANGER("You feel your master turn its destructive potential against you!")) + to_chat(linked, SPAN_NOTICE("You punish \the [L].")) log_admin("[key_name(linked)] used Punishment [pain] on \the [key_name(L)]") \ No newline at end of file diff --git a/code/modules/mob/living/deity/phenomena/conjuration.dm b/mods/gamemodes/deity/mobs/phenomena/conjuration.dm similarity index 82% rename from code/modules/mob/living/deity/phenomena/conjuration.dm rename to mods/gamemodes/deity/mobs/phenomena/conjuration.dm index ac0f27c6075..5f15cc786aa 100644 --- a/code/modules/mob/living/deity/phenomena/conjuration.dm +++ b/mods/gamemodes/deity/mobs/phenomena/conjuration.dm @@ -11,7 +11,7 @@ for(var/i in mobs_inside) var/mob/M = i M.dropInto(object_to_move.loc) - to_chat(M,"You are suddenly flung out of \the [object_to_move]!") + to_chat(M,SPAN_WARNING("You are suddenly flung out of \the [object_to_move]!")) ..() /datum/phenomena/portals @@ -58,24 +58,10 @@ ..() L.take_overall_damage(rand(5,30),0,0,0,"blunt intrument") //Actual spell does 5d10 but maaaybe too much. playsound(get_turf(L), 'sound/effects/bamf.ogg', 100, 1) - to_chat(L, "Something hard hits you!") + to_chat(L, SPAN_DANGER("Something hard hits you!")) if(L.current_health < L.get_max_health()/2) //If it reduces past 50% var/obj/effect/rift/R = new(get_turf(L)) - L.visible_message("\The [L] is quickly sucked into \a [R]!") + L.visible_message(SPAN_DANGER("\The [L] is quickly sucked into \a [R]!")) L.forceMove(R) spawn(300) qdel(R) - -/obj/effect/rift - name = "rift" - desc = "a tear in space and time." - icon = 'icons/obj/wizard.dmi' - icon_state = "rift" - anchored = TRUE - density = FALSE - -/obj/effect/rift/Destroy() - for(var/o in contents) - var/atom/movable/M = o - M.dropInto(loc) - . = ..() \ No newline at end of file diff --git a/code/modules/mob/living/deity/phenomena/conversion.dm b/mods/gamemodes/deity/mobs/phenomena/conversion.dm similarity index 68% rename from code/modules/mob/living/deity/phenomena/conversion.dm rename to mods/gamemodes/deity/mobs/phenomena/conversion.dm index d9dc309a33c..67497362b11 100644 --- a/code/modules/mob/living/deity/phenomena/conversion.dm +++ b/mods/gamemodes/deity/mobs/phenomena/conversion.dm @@ -14,19 +14,19 @@ is_good = 1 break if(!is_good) - to_chat(linked,"\The [target] needs to be near \a [linked.get_type_name(/obj/structure/deity/altar)].") + to_chat(linked,SPAN_WARNING("\The [target] needs to be near \a [linked.get_type_name(/obj/structure/deity/altar)].")) return 0 return 1 /datum/phenomena/conversion/activate(var/mob/living/L) - to_chat(src,"You give \the [L] a chance to willingly convert. May they choose wisely.") + to_chat(src,SPAN_NOTICE("You give \the [L] a chance to willingly convert. May they choose wisely.")) var/choice = alert(L, "You feel a weak power enter your mind attempting to convert it.", "Conversion", "Allow Conversion", "Deny Conversion") if(choice == "Allow Conversion") var/decl/special_role/godcultist/godcult = GET_DECL(/decl/special_role/godcultist) godcult.add_antagonist_mind(L.mind,1, "Servant of [linked]", "You willingly give your mind to it, may it bring you fortune.", specific_god=linked) else - to_chat(L, "With little difficulty you force the intrusion out of your mind. May it stay that way.") - to_chat(src, "\The [L] decides not to convert.") + to_chat(L, SPAN_WARNING("With little difficulty you force the intrusion out of your mind. May it stay that way.")) + to_chat(src, SPAN_WARNING("\The [L] decides not to convert.")) /datum/phenomena/forced_conversion name = "Forced Conversion" @@ -40,7 +40,7 @@ return 0 var/obj/structure/deity/altar/A = locate() in get_turf(L) if(!A || A.linked_god != linked) - to_chat(linked,"\The [L] needs to be on \a [linked.get_type_name(/obj/structure/deity/altar)] to be forcefully converted..") + to_chat(linked,SPAN_WARNING("\The [L] needs to be on \a [linked.get_type_name(/obj/structure/deity/altar)] to be forcefully converted..")) return 0 return 1 @@ -48,4 +48,4 @@ /datum/phenomena/forced_conversion/activate(var/mob/living/L) var/obj/structure/deity/altar/A = locate() in get_turf(L) A.set_target(L) - to_chat(linked, "You imbue \the [A] with your power, setting forth to force \the [L] to your will.") \ No newline at end of file + to_chat(linked, SPAN_NOTICE("You imbue \the [A] with your power, setting forth to force \the [L] to your will.")) \ No newline at end of file diff --git a/code/modules/mob/living/deity/phenomena/generic.dm b/mods/gamemodes/deity/mobs/phenomena/generic.dm similarity index 100% rename from code/modules/mob/living/deity/phenomena/generic.dm rename to mods/gamemodes/deity/mobs/phenomena/generic.dm diff --git a/code/modules/mob/living/deity/phenomena/narsie.dm b/mods/gamemodes/deity/mobs/phenomena/narsie.dm similarity index 75% rename from code/modules/mob/living/deity/phenomena/narsie.dm rename to mods/gamemodes/deity/mobs/phenomena/narsie.dm index b64a36ab284..9bdc1556d01 100644 --- a/code/modules/mob/living/deity/phenomena/narsie.dm +++ b/mods/gamemodes/deity/mobs/phenomena/narsie.dm @@ -1,22 +1,22 @@ -/datum/phenomena/exhude_blood +/datum/phenomena/exude_blood name = "Exhude Blood" desc = "Take pity on a follower, converting a pitance of your power into blood. Don't let them forget your mercy." cost = 20 flags = PHENOMENA_FOLLOWER expected_type = /mob/living/carbon/human -/datum/phenomena/exhude_blood/can_activate(var/mob/living/carbon/human/H) +/datum/phenomena/exude_blood/can_activate(var/mob/living/carbon/human/H) if(!..()) return 0 if(!H.should_have_organ(BP_HEART) || H.vessel.total_volume == H.species.blood_volume) - to_chat(linked, "\The [H] doesn't require anymore blood.") + to_chat(linked, SPAN_WARNING("\The [H] doesn't require anymore blood.")) return 0 return 1 -/datum/phenomena/exhude_blood/activate(var/mob/living/carbon/human/H, var/mob/living/deity/user) +/datum/phenomena/exude_blood/activate(var/mob/living/carbon/human/H, var/mob/living/deity/user) H.adjust_blood(30) - to_chat(H,"You feel a rush as new blood enters your system.") + to_chat(H,SPAN_NOTICE("You feel a rush as new blood enters your system.")) /datum/phenomena/hellscape diff --git a/code/modules/mob/living/deity/phenomena/phenomena.dm b/mods/gamemodes/deity/mobs/phenomena/phenomena.dm similarity index 62% rename from code/modules/mob/living/deity/phenomena/phenomena.dm rename to mods/gamemodes/deity/mobs/phenomena/phenomena.dm index 61311d119bf..169eb499a3f 100644 --- a/code/modules/mob/living/deity/phenomena/phenomena.dm +++ b/mods/gamemodes/deity/mobs/phenomena/phenomena.dm @@ -26,11 +26,11 @@ if(!linked) return 0 if(refresh_time > world.time) - to_chat(linked, "\The [src] is still on cooldown for [round((refresh_time - world.time)/10)] more seconds!") + to_chat(linked, SPAN_WARNING("\The [src] is still on cooldown for [round((refresh_time - world.time)/10)] more seconds!")) return 0 if(!linked.form) - to_chat(linked, "You must choose your form first!") + to_chat(linked, SPAN_WARNING("You must choose your form first!")) return 0 if(expected_type && !istype(target,expected_type)) @@ -38,32 +38,32 @@ if(flags & PHENOMENA_NEAR_STRUCTURE) if(!linked.near_structure(target, 1)) - to_chat(linked, "\The [target] needs to be near a holy structure for your powers to work!") + to_chat(linked, SPAN_WARNING("\The [target] needs to be near a holy structure for your powers to work!")) return 0 if(isliving(target)) var/mob/living/L = target if(!L.mind || !L.client) if(!(flags & PHENOMENA_MUNDANE)) - to_chat(linked, "\The [L]'s mind is too mundane for you to influence.") + to_chat(linked, SPAN_WARNING("\The [L]'s mind is too mundane for you to influence.")) return 0 else if(linked.is_follower(target, silent = 1)) if(!(flags & PHENOMENA_FOLLOWER)) - to_chat(linked, "You can't use [name] on the flock!") + to_chat(linked, SPAN_WARNING("You can't use [name] on the flock!")) return 0 else if(!(flags & PHENOMENA_NONFOLLOWER)) - to_chat(linked, "You can't use [name] on non-believers.") + to_chat(linked, SPAN_WARNING("You can't use [name] on non-believers.")) return 0 if(cost > linked.power) - to_chat(linked, "You need more power to use [name] (Need [cost] power, have [linked.power])!") + to_chat(linked, SPAN_WARNING("You need more power to use [name] (Need [cost] power, have [linked.power])!")) return 0 return 1 /datum/phenomena/proc/activate(var/target) - to_chat(linked, "You use the phenomena [name] on \the [target]") + to_chat(linked, SPAN_NOTICE("You use the phenomena [name] on \the [target]")) log_and_message_admins("uses the phenomena [name] on \the [target]", linked, get_turf(target)) return diff --git a/code/modules/mob/living/deity/phenomena/starlight.dm b/mods/gamemodes/deity/mobs/phenomena/starlight.dm similarity index 84% rename from code/modules/mob/living/deity/phenomena/starlight.dm rename to mods/gamemodes/deity/mobs/phenomena/starlight.dm index a2a34543f14..6b6ad0bbebd 100644 --- a/code/modules/mob/living/deity/phenomena/starlight.dm +++ b/mods/gamemodes/deity/mobs/phenomena/starlight.dm @@ -73,11 +73,11 @@ L.put_in_hands_or_store_or_drop(new w_type(T)) if(form["spells"]) for(var/s in form["spells"]) - var/spell/S = new s - S.set_connected_god(linked) - L.add_spell(S) + var/spell/boon = new s + boon.set_connected_god(linked) + L.add_spell(boon) to_chat(L, "You have been chosen by your master to lead your fellow followers into the next age of rebirth.
    You have been granted powerful armor and a powerful spell. Don't lose them, as they are your key to your divinity and leadership.
    You also have particular sway over your deity's structures.
    ") - to_chat(linked, "\The [L] is now your herald!") + to_chat(linked, SPAN_NOTICE("\The [L] is now your herald!")) linked.remove_phenomena(name) show_browser(linked, null, "window=herald") @@ -136,7 +136,7 @@ var/message = sanitize(input(linked, "What is your message?", null) as null|text) if(!linked || !message || QDELETED(src)) return - to_chat(L, "[whisper_from ? "The [whisper_from] speaks to you" : "You hear a whisper say"] \"[message]\"") + to_chat(L, SPAN_OCCULT("[whisper_from ? "The [whisper_from] speaks to you" : "You hear a whisper say"] \"[message]\"")) linked.eyenet.add_source(L) events_repository.register(/decl/observ/destroyed, L, src, PROC_REF(deactivate_look)) @@ -157,7 +157,7 @@ /datum/phenomena/burning_glare/activate(var/mob/living/L) ..() - to_chat(L, "You feel yourself burn!") + to_chat(L, SPAN_DANGER("You feel yourself burn!")) L.take_damage(10, BURN) if(L.get_damage(BURN) > 60) L.fire_stacks += 50 @@ -179,7 +179,7 @@ active_gateways += 1 if(active_gateways < 3) - to_chat(linked, "You do not have enough gateways activated.") + to_chat(linked, SPAN_WARNING("You do not have enough gateways activated.")) return FALSE var/obj/O = L.get_equipped_item(slot_wear_suit_str) @@ -187,13 +187,13 @@ var/datum/extension/deity_be_near/dbn = get_extension(O, /datum/extension/deity_be_near) if(dbn.wearing_full()) return TRUE - to_chat(linked, "\The [L] is not wearing a herald's uniform.") + to_chat(linked, SPAN_WARNING("\The [L] is not wearing a herald's uniform.")) return FALSE /datum/phenomena/divine_right/activate(var/mob/living/L) ..() - to_chat(L, "Your soul is ripped from your body as your master prepares to possess it.") - to_chat(linked, "You prepare the body for possession. Keep it safe. If it is totally destroyed, you will die.") + to_chat(L, SPAN_OCCULT("Your soul is ripped from your body as your master prepares to possess it.")) + to_chat(linked, SPAN_OCCULT("You prepare the body for possession. Keep it safe. If it is totally destroyed, you will die.")) L.ghostize() SET_STATUS_MAX(L, STAT_WEAK, 1) new /obj/aura/starborn(L) @@ -203,20 +203,20 @@ for(var/mob/living/player in global.player_list) sound_to(player, 'sound/effects/cascade.ogg') if(player?.mind?.assigned_job?.is_holy) - to_chat(player, "Something bad is coming.... you know you don't have much time. Find and destroy the vessel, before its too late.") + to_chat(player, SPAN_OCCULT("Something bad is coming.... you know you don't have much time. Find and destroy the vessel, before its too late.")) else if(player != linked && !linked.is_follower(player, silent = 1)) - to_chat(player, "The world swims around you for just a moment... something is wrong. Very wrong.") + to_chat(player, SPAN_WARNING("The world swims around you for just a moment... something is wrong. Very wrong.")) else - to_chat(player, "Your Master is being reborn into the body of \the [L]. Protect it at all costs.") + to_chat(player, SPAN_NOTICE("Your Master is being reborn into the body of \the [L]. Protect it at all costs.")) /datum/phenomena/divine_right/proc/fail_ritual(var/mob/living/L) qdel(linked) /datum/phenomena/divine_right/proc/succeed_ritual(var/mob/living/L) - to_chat(linked, "You have been reborn! Your power is limited here, focused on your body, but in return you are both eternal and physical.") + to_chat(linked, SPAN_OCCULT("You have been reborn! Your power is limited here, focused on your body, but in return you are both eternal and physical.")) for(var/mob/living/player in global.player_list) sound_to(player, 'sound/effects/cascade.ogg') - to_chat(player, "\The [linked] has been born into flesh. Kneel to its authority or else.") + to_chat(player, SPAN_OCCULT("\The [linked] has been born into flesh. Kneel to its authority or else.")) linked.mind.transfer_to(L) L.SetName("[linked] Incarnate") L.real_name = "[linked] Incarnate" diff --git a/code/modules/mob/living/deity/phenomena/transmutation.dm b/mods/gamemodes/deity/mobs/phenomena/transmutation.dm similarity index 78% rename from code/modules/mob/living/deity/phenomena/transmutation.dm rename to mods/gamemodes/deity/mobs/phenomena/transmutation.dm index 1a985da60bb..748f59d50c9 100644 --- a/code/modules/mob/living/deity/phenomena/transmutation.dm +++ b/mods/gamemodes/deity/mobs/phenomena/transmutation.dm @@ -10,7 +10,7 @@ ..() L.take_damage(20, CLONE) SET_STATUS_MAX(L, STAT_WEAK, 2) - to_chat(L, "You feel your body warp and change underneath you!") + to_chat(L, SPAN_DANGER("You feel your body warp and change underneath you!")) /datum/phenomena/rock_form name = "Rock Form" @@ -21,6 +21,6 @@ /datum/phenomena/rock_form/activate(var/mob/living/carbon/human/H) ..() - to_chat(H, "You feel your body harden as it rapidly is transformed into living crystal!") + to_chat(H, SPAN_DANGER("You feel your body harden as it rapidly is transformed into living crystal!")) H.change_species(SPECIES_GOLEM) SET_STATUS_MAX(H, STAT_WEAK, 5) \ No newline at end of file diff --git a/code/modules/mob/living/deity/say.dm b/mods/gamemodes/deity/mobs/say.dm similarity index 100% rename from code/modules/mob/living/deity/say.dm rename to mods/gamemodes/deity/mobs/say.dm diff --git a/mods/gamemodes/deity/overrides.dm b/mods/gamemodes/deity/overrides.dm new file mode 100644 index 00000000000..483514e13fd --- /dev/null +++ b/mods/gamemodes/deity/overrides.dm @@ -0,0 +1,31 @@ +/obj/item/sword/cultblade/can_use_safely(mob/living/user) + var/decl/special_role/godcult = GET_DECL(/decl/special_role/godcultist) + return ..() || (user.mind in godcult.current_antagonists) + +/datum/reagents/Topic(href, href_list) + . = ..() + if(!. && href_list["deconvert"]) + var/list/data = REAGENT_DATA(src, /decl/material/liquid/water) + if(LAZYACCESS(data, "holy")) + var/mob/living/target = locate(href_list["deconvert"]) + if(istype(target) && !QDELETED(target) && target.mind) + var/decl/special_role/godcult = GET_DECL(/decl/special_role/godcultist) + godcult.remove_antagonist(target.mind, TRUE) + +/decl/ghosttrap/cult_shade/Initialize() + ban_checks |= /decl/special_role/godcultist + . = ..() + +/decl/material/liquid/water/affect_holy(mob/living/M, removed, datum/reagents/holder) + . = ..() + if(.) + return . + var/decl/special_role/godcult = GET_DECL(/decl/special_role/godcultist) + if(M.mind && godcult.is_antagonist(M.mind)) + if(REAGENT_VOLUME(holder, type) > 5) + M.take_damage(5, PAIN, do_update_health = FALSE) + M.take_damage(1, BRUTE) + if(prob(10)) //Only annoy them a /bit/ + to_chat(M, SPAN_DANGER("You feel your insides curdle and burn! \[Give Into Purity\]")) + return TRUE + return FALSE \ No newline at end of file diff --git a/mods/gamemodes/deity/screen/intent.dm b/mods/gamemodes/deity/screen/intent.dm new file mode 100644 index 00000000000..80b3a423170 --- /dev/null +++ b/mods/gamemodes/deity/screen/intent.dm @@ -0,0 +1,44 @@ +/obj/screen/intent/deity + var/list/desc_screens = list() + screen_loc = "RIGHT-5:122,BOTTOM:8" + +/obj/screen/intent/deity/on_update_icon() + . = ..() + cut_overlays() + add_overlay(image('icons/mob/screen/phenomena.dmi', icon_state = "hud", pixel_x = -138, pixel_y = -1)) + compile_overlays() + +/obj/screen/intent/deity/proc/sync_to_mob(var/mob) + var/mob/living/deity/D = mob + for(var/i in 1 to D.control_types.len) + var/obj/screen/deity_marker/S = new(null, D) + desc_screens[D.control_types[i]] = S + S.screen_loc = screen_loc + //This sets it up right. Trust me. + S.maptext_y = 33/2*i - i*i/2 - 10 + D.client.screen += S + + update_text() + +/obj/screen/intent/deity/proc/update_text() + if(!isdeity(usr)) + return + var/mob/living/deity/D = usr + for(var/i in D.control_types) + var/obj/screen/deity_marker/S = desc_screens[i] + var/datum/phenomena/P = D.intent_phenomenas[intent][i] + if(P) + S.maptext = "[P.name]" + else + S.maptext = null + +/obj/screen/intent/deity/handle_click(mob/user, params) + ..() + update_text() + +/obj/screen/deity_marker + name = "" //Don't want them to be able to actually right click it. + mouse_opacity = MOUSE_OPACITY_UNCLICKABLE + icon_state = "blank" + maptext_width = 128 + maptext_x = -125 \ No newline at end of file diff --git a/mods/gamemodes/deity/spells/boon.dm b/mods/gamemodes/deity/spells/boon.dm new file mode 100644 index 00000000000..269a0b4bc4c --- /dev/null +++ b/mods/gamemodes/deity/spells/boon.dm @@ -0,0 +1,11 @@ +/spell + var/mob/living/deity/connected_god //Do we have this spell based off a boon from a god? + +/spell/proc/set_connected_god(var/mob/living/deity/god) + connected_god = god + +// todo: godform check_charge to parallel take_charge. currently a boon always succeeds +/spell/take_charge(mob/user, skipcharge) + if(connected_god) + return connected_god.take_charge(user, max(1, charge_max/10)) + return ..() \ No newline at end of file diff --git a/code/modules/spells/general/god_construct.dm b/mods/gamemodes/deity/spells/construction.dm similarity index 94% rename from code/modules/spells/general/god_construct.dm rename to mods/gamemodes/deity/spells/construction.dm index 25abda2c59e..0005154ad6e 100644 --- a/code/modules/spells/general/god_construct.dm +++ b/mods/gamemodes/deity/spells/construction.dm @@ -42,7 +42,7 @@ else for(var/obj/O in T) if(O.density) - to_chat(user, "Something here is blocking your construction!") + to_chat(user, SPAN_WARNING("Something here is blocking your construction!")) return 0 return 1 diff --git a/code/modules/spells/general/open_gateway.dm b/mods/gamemodes/deity/spells/open_gateway.dm similarity index 74% rename from code/modules/spells/general/open_gateway.dm rename to mods/gamemodes/deity/spells/open_gateway.dm index 0c995399db5..1038d03c6a1 100644 --- a/code/modules/spells/general/open_gateway.dm +++ b/mods/gamemodes/deity/spells/open_gateway.dm @@ -15,7 +15,7 @@ /spell/open_gateway/choose_targets() var/mob/living/H = holder var/turf/T = get_turf(H) - holder.visible_message("A gateway opens up underneath \the [H]!") + holder.visible_message(SPAN_NOTICE("A gateway opens up underneath \the [H]!")) var/g var/decl/special_role/godcultist/godcult = GET_DECL(/decl/special_role/godcultist) if(H.mind && (H.mind in godcult.current_antagonists)) @@ -24,9 +24,9 @@ /spell/open_gateway/cast(var/list/targets, var/mob/holder, var/channel_count) if(prob((channel_count / 5) * 100)) - to_chat(holder, "If you hold the portal open for much longer you'll be ripped apart!") + to_chat(holder, SPAN_DANGER("If you hold the portal open for much longer you'll be ripped apart!")) if(channel_count == 6) - to_chat(holder, "The gateway consumes you... leaving nothing but dust.") + to_chat(holder, SPAN_DANGER("The gateway consumes you... leaving nothing but dust.")) holder.dust() diff --git a/mods/gamemodes/deity/spells/vision.dm b/mods/gamemodes/deity/spells/vision.dm new file mode 100644 index 00000000000..dabe6cf4fca --- /dev/null +++ b/mods/gamemodes/deity/spells/vision.dm @@ -0,0 +1,21 @@ +/spell/camera_connection/god_vision + name = "All Seeing Eye" + desc = "See what your master sees." + + charge_max = 10 + spell_flags = Z2NOCAST + invocation = "none" + invocation_type = SpI_NONE + + extension_type = /datum/extension/eye/freelook + + hud_state = "gen_mind" + +/spell/camera_connection/god_vision/set_connected_god(var/mob/living/deity/god) + ..() + + var/datum/extension/eye/freelook/fl = get_extension(src, /datum/extension/eye) + if(!fl) + return + fl.set_visualnet(god.eyenet) + diff --git a/code/game/gamemodes/godmode/god_altar.dm b/mods/gamemodes/deity/structures/altar.dm similarity index 74% rename from code/game/gamemodes/godmode/god_altar.dm rename to mods/gamemodes/deity/structures/altar.dm index 5ed2dca6c7d..f4f96b48faf 100644 --- a/code/game/gamemodes/godmode/god_altar.dm +++ b/mods/gamemodes/deity/structures/altar.dm @@ -13,7 +13,7 @@ if(target) remove_target() if(linked_god) - to_chat(src, "You've lost an altar!") + to_chat(src, SPAN_DANGER("You've lost an altar!")) return ..() /obj/structure/deity/altar/attackby(var/obj/item/I, var/mob/user) @@ -24,7 +24,7 @@ if(istype(affecting_mob)) affecting_mob.dropInto(loc) SET_STATUS_MAX(affecting_mob, STAT_WEAK, 1) - user.visible_message("\The [user] throws \the [affecting_mob] onto \the [src]!") + user.visible_message(SPAN_WARNING("\The [user] throws \the [affecting_mob] onto \the [src]!")) qdel(G) return ..() @@ -33,7 +33,7 @@ if(!target || world.time < next_cycle) return if(!linked_god || target.stat) - to_chat(linked_god, "\The [target] has lost consciousness, breaking \the [src]'s hold on their mind!") + to_chat(linked_god, SPAN_WARNING("\The [target] has lost consciousness, breaking \the [src]'s hold on their mind!")) remove_target() return @@ -55,7 +55,7 @@ text = "You can't.... concentrate.. must... resist!" if(1) text = "Can't... resist. ... anymore." - to_chat(linked_god, "\The [target] is getting close to conversion!") + to_chat(linked_god, SPAN_WARNING("\The [target] is getting close to conversion!")) to_chat(target, "[text]. Resist Conversion") @@ -86,11 +86,11 @@ return TOPIC_HANDLED M.set_special_ability_cooldown(10 SECONDS) - M.visible_message("\The [M] writhes on top of \the [src]!", "You struggle against the intruding thoughts, keeping them at bay!") - to_chat(linked_god, "\The [M] slows its conversion through willpower!") + M.visible_message(SPAN_WARNING("\The [M] writhes on top of \the [src]!"), SPAN_NOTICE("You struggle against the intruding thoughts, keeping them at bay!")) + to_chat(linked_god, SPAN_WARNING("\The [M] slows its conversion through willpower!")) cycles_before_converted++ if(prob(50)) - to_chat(M, "The mental strain is too much for you! You feel your body weakening!") + to_chat(M, SPAN_DANGER("The mental strain is too much for you! You feel your body weakening!")) M.take_damage(15, TOX, do_update_health = FALSE) M.take_damage(30, PAIN) return TOPIC_REFRESH @@ -98,4 +98,12 @@ /obj/structure/deity/altar/on_update_icon() ..() if(target) - add_overlay(image('icons/effects/effects.dmi', icon_state = "summoning")) \ No newline at end of file + add_overlay(image('icons/effects/effects.dmi', icon_state = "summoning")) + +/obj/structure/deity/altar/nullrod_act(mob/user, obj/item/nullrod/rod) + if(!linked_god.silenced) //Don't want them to infinity spam it. + linked_god.silence(10) + new /obj/effect/temporary(get_turf(src),'icons/effects/effects.dmi',"purple_electricity_constant", 10) + visible_message(SPAN_NOTICE("\The [src] groans in protest as reality settles around \the [rod].")) + return TRUE + return FALSE \ No newline at end of file diff --git a/code/game/gamemodes/godmode/god_pylon.dm b/mods/gamemodes/deity/structures/pylon.dm similarity index 85% rename from code/game/gamemodes/godmode/god_pylon.dm rename to mods/gamemodes/deity/structures/pylon.dm index cbbd31413fa..63e58806915 100644 --- a/code/game/gamemodes/godmode/god_pylon.dm +++ b/mods/gamemodes/deity/structures/pylon.dm @@ -31,25 +31,25 @@ /obj/structure/deity/pylon/proc/add_intuned(var/mob/living/L) if(L in intuned) return - to_chat(L, "You place your hands on \the [src], feeling yourself intune to its vibrations.") + to_chat(L, SPAN_NOTICE("You place your hands on \the [src], feeling yourself intune to its vibrations.")) intuned += L events_repository.register(/decl/observ/destroyed, L,src, TYPE_PROC_REF(/obj/structure/deity/pylon, remove_intuned)) /obj/structure/deity/pylon/proc/remove_intuned(var/mob/living/L) if(!(L in intuned)) return - to_chat(L, "You no longer feel intuned to \the [src].") + to_chat(L, SPAN_WARNING("You no longer feel intuned to \the [src].")) intuned -= L events_repository.unregister(/decl/observ/destroyed, L, src) /obj/structure/deity/pylon/OnTopic(var/mob/living/carbon/human/user, var/href_list) if(href_list["vision_jump"]) if(istype(user)) - to_chat(user,"You feel your body lurch uncomfortably as your consciousness jumps to \the [src]") + to_chat(user,SPAN_WARNING("You feel your body lurch uncomfortably as your consciousness jumps to \the [src]")) if(prob(5)) user.vomit() else - to_chat(user, "You jump to \the [src]") + to_chat(user, SPAN_NOTICE("You jump to \the [src]")) if(user.eyeobj) user.eyeobj.setLoc(locate(href_list["vision_jump"])) else diff --git a/code/game/gamemodes/godmode/god_structures.dm b/mods/gamemodes/deity/structures/structures.dm similarity index 80% rename from code/game/gamemodes/godmode/god_structures.dm rename to mods/gamemodes/deity/structures/structures.dm index a9fe3b29ee9..a073dd6daf6 100644 --- a/code/game/gamemodes/godmode/god_structures.dm +++ b/mods/gamemodes/deity/structures/structures.dm @@ -4,14 +4,14 @@ if(flags & DEITY_STRUCTURE_NEAR_IMPORTANT && !deity.near_structure(target)) if(user) - to_chat(user, "You need to be near \a [deity.get_type_name(/obj/structure/deity/altar)] to build this!") + to_chat(user, SPAN_WARNING("You need to be near \a [deity.get_type_name(/obj/structure/deity/altar)] to build this!")) return 0 if(flags & DEITY_STRUCTURE_ALONE) for(var/structure in deity.structures) if(istype(structure,type) && get_dist(target,structure) <= 3) if(user) - to_chat(user, "You are too close to another [deity.get_type_name(type)]!") + to_chat(user, SPAN_WARNING("You are too close to another [deity.get_type_name(type)]!")) return 0 return 1 @@ -46,9 +46,9 @@ user.do_attack_animation(src) playsound(get_turf(src), 'sound/effects/Glasshit.ogg', 50, 1) user.visible_message( - "[user] hits \the [src] with \the [W]!", - "You hit \the [src] with \the [W]!", - "You hear something breaking!" + SPAN_DANGER("[user] hits \the [src] with \the [W]!"), + SPAN_DANGER("You hit \the [src] with \the [W]!"), + SPAN_DANGER("You hear something breaking!") ) take_damage(W.force, W.atom_damage_type) diff --git a/code/game/gamemodes/godmode/god_trap.dm b/mods/gamemodes/deity/structures/trap.dm similarity index 100% rename from code/game/gamemodes/godmode/god_trap.dm rename to mods/gamemodes/deity/structures/trap.dm diff --git a/nebula.dme b/nebula.dme index 32682e488ea..e0231e5739b 100644 --- a/nebula.dme +++ b/nebula.dme @@ -43,7 +43,6 @@ #include "code\__defines\damage.dm" #include "code\__defines\damage_organs.dm" #include "code\__defines\definition_helpers.dm" -#include "code\__defines\deity.dm" #include "code\__defines\directions.dm" #include "code\__defines\dna.dm" #include "code\__defines\dview.dm" @@ -177,7 +176,6 @@ #include "code\_onclick\hud\ai.dm" #include "code\_onclick\hud\ai_hud.dm" #include "code\_onclick\hud\animal.dm" -#include "code\_onclick\hud\deity.dm" #include "code\_onclick\hud\fullscreen.dm" #include "code\_onclick\hud\global_hud.dm" #include "code\_onclick\hud\hud.dm" @@ -398,7 +396,6 @@ #include "code\datums\daycycle\time_of_day.dm" #include "code\datums\extensions\_defines.dm" #include "code\datums\extensions\access_provider.dm" -#include "code\datums\extensions\deity_be_near.dm" #include "code\datums\extensions\event_registration.dm" #include "code\datums\extensions\extensions.dm" #include "code\datums\extensions\fake_data.dm" @@ -728,12 +725,10 @@ #include "code\game\antagonist\antagonist_print.dm" #include "code\game\antagonist\antagonist_update.dm" #include "code\game\antagonist\outsider\actors.dm" -#include "code\game\antagonist\outsider\deity.dm" #include "code\game\antagonist\outsider\ert.dm" #include "code\game\antagonist\outsider\mercenary.dm" #include "code\game\antagonist\outsider\ninja.dm" #include "code\game\antagonist\outsider\wizard.dm" -#include "code\game\antagonist\station\cult_god.dm" #include "code\game\antagonist\station\cultist.dm" #include "code\game\antagonist\station\loyalist.dm" #include "code\game\antagonist\station\provocateur.dm" @@ -776,17 +771,6 @@ #include "code\game\gamemodes\endgame\supermatter_cascade\universe.dm" #include "code\game\gamemodes\events\power_failure.dm" #include "code\game\gamemodes\extended\extended.dm" -#include "code\game\gamemodes\godmode\god_altar.dm" -#include "code\game\gamemodes\godmode\god_pylon.dm" -#include "code\game\gamemodes\godmode\god_structures.dm" -#include "code\game\gamemodes\godmode\god_trap.dm" -#include "code\game\gamemodes\godmode\godmode.dm" -#include "code\game\gamemodes\godmode\form_items\narsie_items.dm" -#include "code\game\gamemodes\godmode\form_items\narsie_structures.dm" -#include "code\game\gamemodes\godmode\form_items\starlight_items.dm" -#include "code\game\gamemodes\godmode\form_items\starlight_mobs.dm" -#include "code\game\gamemodes\godmode\form_items\starlight_structures.dm" -#include "code\game\gamemodes\godmode\form_items\wizard_structures.dm" #include "code\game\gamemodes\heist\heist.dm" #include "code\game\gamemodes\mixed\crossfire.dm" #include "code\game\gamemodes\mixed\siege.dm" @@ -2828,45 +2812,6 @@ #include "code\modules\mob\living\brain\brain.dm" #include "code\modules\mob\living\brain\death.dm" #include "code\modules\mob\living\brain\say.dm" -#include "code\modules\mob\living\deity\deity.dm" -#include "code\modules\mob\living\deity\deity_boons.dm" -#include "code\modules\mob\living\deity\deity_click.dm" -#include "code\modules\mob\living\deity\deity_items.dm" -#include "code\modules\mob\living\deity\deity_phenomena.dm" -#include "code\modules\mob\living\deity\deity_power.dm" -#include "code\modules\mob\living\deity\deity_pylon.dm" -#include "code\modules\mob\living\deity\deity_sources.dm" -#include "code\modules\mob\living\deity\deity_Stat.dm" -#include "code\modules\mob\living\deity\deity_topic.dm" -#include "code\modules\mob\living\deity\deity_tracking.dm" -#include "code\modules\mob\living\deity\forms.dm" -#include "code\modules\mob\living\deity\say.dm" -#include "code\modules\mob\living\deity\forms\narsie.dm" -#include "code\modules\mob\living\deity\forms\starlight.dm" -#include "code\modules\mob\living\deity\forms\tower.dm" -#include "code\modules\mob\living\deity\items\_defines.dm" -#include "code\modules\mob\living\deity\items\deity_item.dm" -#include "code\modules\mob\living\deity\items\general.dm" -#include "code\modules\mob\living\deity\items\generic.dm" -#include "code\modules\mob\living\deity\items\narsie\basic.dm" -#include "code\modules\mob\living\deity\items\narsie\minions.dm" -#include "code\modules\mob\living\deity\items\narsie\sacrificing.dm" -#include "code\modules\mob\living\deity\items\narsie\smithing.dm" -#include "code\modules\mob\living\deity\items\starlight\artifacts.dm" -#include "code\modules\mob\living\deity\items\starlight\phenomena.dm" -#include "code\modules\mob\living\deity\items\starlight\spells.dm" -#include "code\modules\mob\living\deity\items\tower\conjuration.dm" -#include "code\modules\mob\living\deity\items\tower\transmutation.dm" -#include "code\modules\mob\living\deity\menu\deity_nano.dm" -#include "code\modules\mob\living\deity\phenomena\_defines.dm" -#include "code\modules\mob\living\deity\phenomena\communication.dm" -#include "code\modules\mob\living\deity\phenomena\conjuration.dm" -#include "code\modules\mob\living\deity\phenomena\conversion.dm" -#include "code\modules\mob\living\deity\phenomena\generic.dm" -#include "code\modules\mob\living\deity\phenomena\narsie.dm" -#include "code\modules\mob\living\deity\phenomena\phenomena.dm" -#include "code\modules\mob\living\deity\phenomena\starlight.dm" -#include "code\modules\mob\living\deity\phenomena\transmutation.dm" #include "code\modules\mob\living\human\death.dm" #include "code\modules\mob\living\human\examine.dm" #include "code\modules\mob\living\human\human.dm" @@ -3061,8 +3006,6 @@ #include "code\modules\mob\observer\eye\freelook\ai\chunk.dm" #include "code\modules\mob\observer\eye\freelook\ai\eye.dm" #include "code\modules\mob\observer\eye\freelook\ai\update_triggers.dm" -#include "code\modules\mob\observer\eye\freelook\cult\cultnet.dm" -#include "code\modules\mob\observer\eye\freelook\cult\mask.dm" #include "code\modules\mob\observer\ghost\follow.dm" #include "code\modules\mob\observer\ghost\ghost.dm" #include "code\modules\mob\observer\ghost\login.dm" @@ -3754,19 +3697,15 @@ #include "code\modules\spells\artifacts\storage.dm" #include "code\modules\spells\general\acid_spray.dm" #include "code\modules\spells\general\area_teleport.dm" +#include "code\modules\spells\general\camera_vision.dm" #include "code\modules\spells\general\contract_spells.dm" #include "code\modules\spells\general\create_air.dm" -#include "code\modules\spells\general\god_construct.dm" -#include "code\modules\spells\general\god_vision.dm" #include "code\modules\spells\general\invisibility.dm" #include "code\modules\spells\general\mark_recall.dm" -#include "code\modules\spells\general\open_gateway.dm" #include "code\modules\spells\general\portal_teleport.dm" #include "code\modules\spells\general\radiant_aura.dm" #include "code\modules\spells\general\return_master.dm" -#include "code\modules\spells\general\tear_veil.dm" #include "code\modules\spells\general\toggle_armor.dm" -#include "code\modules\spells\general\veil_of_shadows.dm" #include "code\modules\spells\hand\blood_shards.dm" #include "code\modules\spells\hand\burning_grip.dm" #include "code\modules\spells\hand\entangle.dm" @@ -3784,7 +3723,7 @@ #include "code\modules\spells\targeted\blood_boil.dm" #include "code\modules\spells\targeted\cleric_spells.dm" #include "code\modules\spells\targeted\ethereal_jaunt.dm" -#include "code\modules\spells\targeted\exhude_pleasantness.dm" +#include "code\modules\spells\targeted\exude_pleasantness.dm" #include "code\modules\spells\targeted\genetic.dm" #include "code\modules\spells\targeted\glimpse_of_eternity.dm" #include "code\modules\spells\targeted\harvest.dm" @@ -4065,7 +4004,6 @@ #include "interface\interface.dm" #include "interface\skin.dmf" #include "maps\_map_include.dm" -#include "maps\antag_spawn\deity\deity.dm" #include "maps\antag_spawn\ert\ert.dm" #include "maps\antag_spawn\heist\heist.dm" #include "maps\antag_spawn\mercenary\mercenary.dm" From e460eca52d028d88add59b7bea6df08c53b3d953 Mon Sep 17 00:00:00 2001 From: NebulaSS13Bot Date: Tue, 18 Jun 2024 00:41:27 +0000 Subject: [PATCH 50/90] Automatic changelog generation [ci skip] --- html/changelog.html | 7 ------- 1 file changed, 7 deletions(-) diff --git a/html/changelog.html b/html/changelog.html index c3fc308f3ef..080d60a6ce2 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -159,13 +159,6 @@

    MistakeNot4892 updated:

  • Vox must now pick between pressure resistance and speed using the Toggle Pressure Seal verb.
  • Lots of cooking changes! Refer to PR #3704 on the Nebula GitHub for specific details.
- -

16 April 2024

-

MistakeNot4892 updated:

-
    -
  • Butchery will now produce a wider variety of items.
  • -
  • Universal enzyme can be made from rennet.
  • -
From 702df7eb4b96e21812f737952c77cbbb05876ddd Mon Sep 17 00:00:00 2001 From: NebulaSS13Bot Date: Tue, 18 Jun 2024 17:01:42 +1000 Subject: [PATCH 51/90] Automatic changelog generation for PR #3730 [ci skip] --- html/changelogs/AutoChangeLog-pr-3730.yml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-3730.yml diff --git a/html/changelogs/AutoChangeLog-pr-3730.yml b/html/changelogs/AutoChangeLog-pr-3730.yml new file mode 100644 index 00000000000..5f7a8b506a5 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-3730.yml @@ -0,0 +1,6 @@ +author: Penelope Haze +changes: + - {experiment: 'Ammo magazines will not initialize their contents until first interacted + with, which makes startup faster but could cause bugs. Report any issues on + the issue tracker!'} +delete-after: true From 84c4ca41e75f6536df4cf8a5d567c70860067718 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Sun, 16 Jun 2024 08:47:59 -0400 Subject: [PATCH 52/90] Move Heist gamemode into its own modpack --- maps/antag_spawn/heist/heist.dm | 78 ------------------- mods/gamemodes/heist/_heist.dm | 2 + mods/gamemodes/heist/_heist.dme | 18 +++++ mods/gamemodes/heist/areas.dm | 18 +++++ .../gamemodes/heist/gamemode.dm | 4 - mods/gamemodes/heist/heist_base.dm | 12 +++ .../gamemodes}/heist/heist_base.dmm | 8 +- .../gamemodes/heist/outfit.dm | 0 mods/gamemodes/heist/presets.dm | 21 +++++ mods/gamemodes/heist/shuttle.dm | 24 ++++++ .../gamemodes/heist/special_role.dm | 12 +-- mods/species/vox/_vox.dme | 1 + mods/species/vox/datum/antagonism.dm | 64 +-------------- mods/species/vox/datum/heist_compatibility.dm | 64 +++++++++++++++ nebula.dme | 3 - 15 files changed, 171 insertions(+), 158 deletions(-) delete mode 100644 maps/antag_spawn/heist/heist.dm create mode 100644 mods/gamemodes/heist/_heist.dm create mode 100644 mods/gamemodes/heist/_heist.dme create mode 100644 mods/gamemodes/heist/areas.dm rename code/game/gamemodes/heist/heist.dm => mods/gamemodes/heist/gamemode.dm (94%) create mode 100644 mods/gamemodes/heist/heist_base.dm rename {maps/antag_spawn => mods/gamemodes}/heist/heist_base.dmm (99%) rename maps/antag_spawn/heist/heist_outfit.dm => mods/gamemodes/heist/outfit.dm (100%) create mode 100644 mods/gamemodes/heist/presets.dm create mode 100644 mods/gamemodes/heist/shuttle.dm rename maps/antag_spawn/heist/heist_antag.dm => mods/gamemodes/heist/special_role.dm (86%) create mode 100644 mods/species/vox/datum/heist_compatibility.dm diff --git a/maps/antag_spawn/heist/heist.dm b/maps/antag_spawn/heist/heist.dm deleted file mode 100644 index 0405013a004..00000000000 --- a/maps/antag_spawn/heist/heist.dm +++ /dev/null @@ -1,78 +0,0 @@ -#include "heist_antag.dm" -#include "heist_outfit.dm" - -/mob/living/simple_animal/hostile/retaliate/parrot/pirate - name = "\proper Meatbag" - emote_speech = list("Yaaar!","Squaaak!","Fight me Matey!","BAWWWWK Vox trying to eat me!") - -/datum/map_template/ruin/antag_spawn/heist - name = "Heist Base" - suffixes = list("heist/heist_base.dmm") - modify_tag_vars = FALSE - shuttles_to_initialise = list(/datum/shuttle/autodock/multi/antag/skipjack) - apc_test_exempt_areas = list( - /area/map_template/skipjack_station = NO_SCRUBBER|NO_VENT|NO_APC, - /area/map_template/syndicate_mothership/raider_base = NO_SCRUBBER|NO_VENT|NO_APC - ) - -/obj/machinery/network/telecomms_hub/raider - initial_network_id = "piratenet" - req_access = list(access_raider) - channels = list( - COMMON_FREQUENCY_DATA, - list( - "name" = "Raider", - "key" = "t", - "frequency" = PUB_FREQ, - "color" = COMMS_COLOR_SYNDICATE, - "span_class" = CSS_CLASS_RADIO, - "secured" = access_raider - ) - ) - -/datum/shuttle/autodock/multi/antag/skipjack - name = "Skipjack" - defer_initialisation = TRUE - warmup_time = 0 - destination_tags = list( - "nav_skipjack_start" - ) - shuttle_area = /area/map_template/skipjack_station/start - dock_target = "skipjack_shuttle" - current_location = "nav_skipjack_start" - announcer = "Proximity Sensor Array" - home_waypoint = "nav_skipjack_start" - arrival_message = "Attention, vessel detected entering vessel proximity." - departure_message = "Attention, vessel detected leaving vessel proximity." - -/obj/effect/shuttle_landmark/skipjack/start - name = "Raider Outpost" - landmark_tag = "nav_skipjack_start" - docking_controller = "skipjack_base" - -//Areas -/area/map_template/skipjack_station - name = "Raider Outpost" - icon_state = "yellow" - requires_power = 0 - req_access = list(access_raider) - -/area/map_template/skipjack_station/start - name = "\improper Skipjack" - icon_state = "yellow" - req_access = list(access_raider) - area_flags = AREA_FLAG_RAD_SHIELDED | AREA_FLAG_ION_SHIELDED - -/area/map_template/syndicate_mothership/raider_base - name = "\improper Raider Base" - requires_power = 0 - dynamic_lighting = FALSE - req_access = list(access_raider) - -/obj/machinery/computer/shuttle_control/multi/raider - name = "skipjack control console" - initial_access = list(access_raider) - shuttle_tag = "Skipjack" - -/obj/structure/sign/warning/nosmoking_1/heist - desc = "A warning sign which reads 'NO SMOKING'. Someone has scratched a variety of crude words in gutter across the entire sign." \ No newline at end of file diff --git a/mods/gamemodes/heist/_heist.dm b/mods/gamemodes/heist/_heist.dm new file mode 100644 index 00000000000..4183fc91a90 --- /dev/null +++ b/mods/gamemodes/heist/_heist.dm @@ -0,0 +1,2 @@ +/decl/modpack/heist + name = "Heist Gamemode" \ No newline at end of file diff --git a/mods/gamemodes/heist/_heist.dme b/mods/gamemodes/heist/_heist.dme new file mode 100644 index 00000000000..ee198a7565d --- /dev/null +++ b/mods/gamemodes/heist/_heist.dme @@ -0,0 +1,18 @@ +#ifndef GAMEMODE_PACK_HEIST +#define GAMEMODE_PACK_HEIST + +#ifdef MODPACK_VOX +#warn Vox modpack loaded before Heist modpack, compatibility features will be missing. +#endif + +// BEGIN_INCLUDE +#include "_heist.dm" +#include "areas.dm" +#include "gamemode.dm" +#include "heist_base.dm" +#include "outfit.dm" +#include "presets.dm" +#include "shuttle.dm" +#include "special_role.dm" +// END_INCLUDE +#endif \ No newline at end of file diff --git a/mods/gamemodes/heist/areas.dm b/mods/gamemodes/heist/areas.dm new file mode 100644 index 00000000000..22c772cc310 --- /dev/null +++ b/mods/gamemodes/heist/areas.dm @@ -0,0 +1,18 @@ +//Areas +/area/map_template/skipjack_station + name = "Raider Outpost" + icon_state = "yellow" + requires_power = 0 + req_access = list(access_raider) + +/area/map_template/skipjack_station/start + name = "\improper Skipjack" + icon_state = "yellow" + req_access = list(access_raider) + area_flags = AREA_FLAG_RAD_SHIELDED | AREA_FLAG_ION_SHIELDED + +/area/map_template/syndicate_mothership/raider_base + name = "\improper Raider Base" + requires_power = 0 + dynamic_lighting = FALSE + req_access = list(access_raider) \ No newline at end of file diff --git a/code/game/gamemodes/heist/heist.dm b/mods/gamemodes/heist/gamemode.dm similarity index 94% rename from code/game/gamemodes/heist/heist.dm rename to mods/gamemodes/heist/gamemode.dm index c2bedd494d5..34494789acf 100644 --- a/code/game/gamemodes/heist/heist.dm +++ b/mods/gamemodes/heist/gamemode.dm @@ -1,7 +1,3 @@ -/* -HEIST ROUNDTYPE -*/ - /decl/game_mode/heist name = "Heist" uid = "heist" diff --git a/mods/gamemodes/heist/heist_base.dm b/mods/gamemodes/heist/heist_base.dm new file mode 100644 index 00000000000..20c8c18d2a6 --- /dev/null +++ b/mods/gamemodes/heist/heist_base.dm @@ -0,0 +1,12 @@ +/datum/map_template/ruin/antag_spawn/heist + name = "Heist Base" + prefix = null + mappaths = list( + "mods/gamemodes/heist/heist_base.dmm" + ) + modify_tag_vars = FALSE + shuttles_to_initialise = list(/datum/shuttle/autodock/multi/antag/skipjack) + apc_test_exempt_areas = list( + /area/map_template/skipjack_station = NO_SCRUBBER|NO_VENT|NO_APC, + /area/map_template/syndicate_mothership/raider_base = NO_SCRUBBER|NO_VENT|NO_APC + ) diff --git a/maps/antag_spawn/heist/heist_base.dmm b/mods/gamemodes/heist/heist_base.dmm similarity index 99% rename from maps/antag_spawn/heist/heist_base.dmm rename to mods/gamemodes/heist/heist_base.dmm index 8d560c0db89..9d5c5150cf7 100644 --- a/maps/antag_spawn/heist/heist_base.dmm +++ b/mods/gamemodes/heist/heist_base.dmm @@ -1011,7 +1011,7 @@ /obj/machinery/door/blast/regular/open{ id_tag = "SkipjackShuttersNorth"; name = "Blast Doors"; - + }, /obj/effect/wallframe_spawn/reinforced/titanium, /obj/effect/paint/brown, @@ -1378,7 +1378,7 @@ dir = 4; id_tag = "SkipjackShuttersWest"; name = "Skipjack Shutters"; - + }, /obj/effect/wallframe_spawn/reinforced/titanium, /obj/effect/paint/brown, @@ -1405,7 +1405,7 @@ dir = 8; id_tag = "SkipjackShuttersEast"; name = "Skipjack Shutters"; - + }, /obj/effect/wallframe_spawn/reinforced/titanium, /obj/effect/paint/brown, @@ -1477,7 +1477,7 @@ dir = 4; id_tag = "SkipjackShuttersWest"; name = "Skipjack Shutters"; - + }, /obj/effect/wallframe_spawn/reinforced/titanium, /turf/floor/plating, diff --git a/maps/antag_spawn/heist/heist_outfit.dm b/mods/gamemodes/heist/outfit.dm similarity index 100% rename from maps/antag_spawn/heist/heist_outfit.dm rename to mods/gamemodes/heist/outfit.dm diff --git a/mods/gamemodes/heist/presets.dm b/mods/gamemodes/heist/presets.dm new file mode 100644 index 00000000000..0d74dd38c16 --- /dev/null +++ b/mods/gamemodes/heist/presets.dm @@ -0,0 +1,21 @@ +/mob/living/simple_animal/hostile/retaliate/parrot/pirate + name = "\proper Meatbag" + emote_speech = list("Yaaar!","Squaaak!","Fight me Matey!","BAWWWWK Vox trying to eat me!") + +/obj/machinery/network/telecomms_hub/raider + initial_network_id = "piratenet" + req_access = list(access_raider) + channels = list( + COMMON_FREQUENCY_DATA, + list( + "name" = "Raider", + "key" = "t", + "frequency" = PUB_FREQ, + "color" = COMMS_COLOR_SYNDICATE, + "span_class" = CSS_CLASS_RADIO, + "secured" = access_raider + ) + ) + +/obj/structure/sign/warning/nosmoking_1/heist + desc = "A warning sign which reads 'NO SMOKING'. Someone has scratched a variety of crude words in gutter across the entire sign." \ No newline at end of file diff --git a/mods/gamemodes/heist/shuttle.dm b/mods/gamemodes/heist/shuttle.dm new file mode 100644 index 00000000000..d170e6b9356 --- /dev/null +++ b/mods/gamemodes/heist/shuttle.dm @@ -0,0 +1,24 @@ +/datum/shuttle/autodock/multi/antag/skipjack + name = "Skipjack" + defer_initialisation = TRUE + warmup_time = 0 + destination_tags = list( + "nav_skipjack_start" + ) + shuttle_area = /area/map_template/skipjack_station/start + dock_target = "skipjack_shuttle" + current_location = "nav_skipjack_start" + announcer = "Proximity Sensor Array" + home_waypoint = "nav_skipjack_start" + arrival_message = "Attention, vessel detected entering vessel proximity." + departure_message = "Attention, vessel detected leaving vessel proximity." + +/obj/effect/shuttle_landmark/skipjack/start + name = "Raider Outpost" + landmark_tag = "nav_skipjack_start" + docking_controller = "skipjack_base" + +/obj/machinery/computer/shuttle_control/multi/raider + name = "skipjack control console" + initial_access = list(access_raider) + shuttle_tag = "Skipjack" diff --git a/maps/antag_spawn/heist/heist_antag.dm b/mods/gamemodes/heist/special_role.dm similarity index 86% rename from maps/antag_spawn/heist/heist_antag.dm rename to mods/gamemodes/heist/special_role.dm index f0798fd417c..6e6797334e8 100644 --- a/maps/antag_spawn/heist/heist_antag.dm +++ b/mods/gamemodes/heist/special_role.dm @@ -37,21 +37,21 @@ while(i<= max_objectives) var/list/goals = list("kidnap","loot","salvage") var/goal = pick(goals) - var/datum/objective/heist/O + var/datum/objective/O if(goal == "kidnap") goals -= "kidnap" - O = new /datum/objective/heist/kidnap() + O = new /datum/objective/kidnap() else if(goal == "loot") - O = new /datum/objective/heist/loot() + O = new /datum/objective/loot() else - O = new /datum/objective/heist/salvage() - O.choose_target() + O = new /datum/objective/salvage() + O.find_target() global_objectives |= O i++ - global_objectives |= new /datum/objective/heist/preserve_crew + global_objectives |= new /datum/objective/preserve_crew return 1 /decl/special_role/raider/equip_role(var/mob/living/carbon/human/player) diff --git a/mods/species/vox/_vox.dme b/mods/species/vox/_vox.dme index a81b459f720..ff2fe2a07f8 100644 --- a/mods/species/vox/_vox.dme +++ b/mods/species/vox/_vox.dme @@ -9,6 +9,7 @@ #include "datum/cultures_vox.dm" #include "datum/descriptors_vox.dm" #include "datum/factions_vox.dm" +#include "datum/heist_compatibility.dm" #include "datum/language.dm" #include "datum/locations_vox.dm" #include "datum/religions_vox.dm" diff --git a/mods/species/vox/datum/antagonism.dm b/mods/species/vox/datum/antagonism.dm index 1fd685dbea2..4b8c182ee3a 100644 --- a/mods/species/vox/datum/antagonism.dm +++ b/mods/species/vox/datum/antagonism.dm @@ -1,66 +1,4 @@ -/decl/special_role/raider/Initialize() - . = ..() - LAZYSET(outfits_per_species, SPECIES_VOX, /decl/hierarchy/outfit/vox_raider) - -/decl/hierarchy/outfit/vox_raider - name = "Job - Vox Raider" - l_ear = /obj/item/radio/headset/raider - shoes = /obj/item/clothing/shoes/magboots/vox - gloves = /obj/item/clothing/gloves/vox - mask = /obj/item/clothing/mask/gas/swat/vox - back = /obj/item/tank/nitrogen - uniform = /obj/item/clothing/suit/robe/vox - glasses = /obj/item/clothing/glasses/thermal - holster = /obj/item/clothing/webbing/holster/armpit - suit_store = /obj/item/flashlight - hands = list(/obj/item/gun/launcher/alien/spikethrower) - id_type = /obj/item/card/id/syndicate - -/decl/hierarchy/outfit/vox_raider/equip_outfit(mob/living/carbon/human/H, assignment, equip_adjustments, datum/job/job, datum/mil_rank/rank) - uniform = pick(/obj/item/clothing/suit/robe/vox, /obj/item/clothing/pants/vox) - glasses = pick(/obj/item/clothing/glasses/thermal, /obj/item/clothing/glasses/thermal/plain/eyepatch, /obj/item/clothing/glasses/thermal/plain/monocle) - holster = pick(/obj/item/clothing/webbing/holster/armpit, /obj/item/clothing/webbing/holster/waist, /obj/item/clothing/webbing/holster/hip) - . = ..() - H.set_internals(locate(/obj/item/tank) in H.contents) - -// The following mirror is ~special~. -/obj/structure/mirror/raider - name = "cracked mirror" - desc = "Something seems strange about this old, dirty mirror. Your reflection doesn't look like you remember it." - icon_state = "mirror_broke" - shattered = TRUE - -/obj/structure/mirror/raider/attack_hand(mob/user) - if(!istype(get_area(src), /area/map_template/syndicate_mothership)) - return ..() - - var/decl/species/my_species = user?.get_species() - var/decl/special_role/raider/raiders = GET_DECL(/decl/special_role/raider) - if(!istype(user) || !user.mind || !user.mind.assigned_special_role != raiders || !my_species || my_species.name == SPECIES_VOX || !is_alien_whitelisted(user, SPECIES_VOX)) - return ..() - - var/choice = input("Do you wish to become a vox of the Shoal? This is not reversible.") as null|anything in list("No","Yes") - if(choice != "Yes") - return ..() - - var/decl/hierarchy/outfit/outfit = GET_DECL(/decl/hierarchy/outfit/vox_raider) - var/mob/living/carbon/human/vox/vox = new(get_turf(src), SPECIES_VOX) - outfit.equip_outfit(vox) - if(user.mind) - user.mind.transfer_to(vox) - qdel(user) - addtimer(CALLBACK(src, PROC_REF(do_post_voxifying), vox), 1) - -/obj/structure/mirror/raider/proc/do_post_voxifying(var/mob/living/carbon/human/vox) - var/newname = sanitize_safe(input(vox,"Enter a name, or leave blank for the default name.", "Name change","") as text, MAX_NAME_LEN) - if(!newname || newname == "") - var/decl/cultural_info/voxculture = GET_DECL(/decl/cultural_info/culture/vox/raider) - newname = voxculture.get_random_name() - vox.real_name = newname - vox.SetName(vox.real_name) - var/decl/special_role/raider/raiders = GET_DECL(/decl/special_role/raider) - raiders.update_access(vox) - +// Wizard /obj/item/magic_rock/Initialize(ml, material_key) LAZYSET(potentials, SPECIES_VOX, /spell/targeted/shapeshift/true_form) . = ..() diff --git a/mods/species/vox/datum/heist_compatibility.dm b/mods/species/vox/datum/heist_compatibility.dm new file mode 100644 index 00000000000..c364b6b5375 --- /dev/null +++ b/mods/species/vox/datum/heist_compatibility.dm @@ -0,0 +1,64 @@ +#ifdef GAMEMODE_PACK_HEIST +/decl/special_role/raider/Initialize() + . = ..() + LAZYSET(outfits_per_species, SPECIES_VOX, /decl/hierarchy/outfit/vox_raider) + +/decl/hierarchy/outfit/vox_raider + name = "Job - Vox Raider" + l_ear = /obj/item/radio/headset/raider + shoes = /obj/item/clothing/shoes/magboots/vox + gloves = /obj/item/clothing/gloves/vox + mask = /obj/item/clothing/mask/gas/swat/vox + back = /obj/item/tank/nitrogen + uniform = /obj/item/clothing/suit/robe/vox + glasses = /obj/item/clothing/glasses/thermal + holster = /obj/item/clothing/webbing/holster/armpit + suit_store = /obj/item/flashlight + hands = list(/obj/item/gun/launcher/alien/spikethrower) + id_type = /obj/item/card/id/syndicate + +/decl/hierarchy/outfit/vox_raider/equip_outfit(mob/living/carbon/human/H, assignment, equip_adjustments, datum/job/job, datum/mil_rank/rank) + uniform = pick(/obj/item/clothing/suit/robe/vox, /obj/item/clothing/pants/vox) + glasses = pick(/obj/item/clothing/glasses/thermal, /obj/item/clothing/glasses/thermal/plain/eyepatch, /obj/item/clothing/glasses/thermal/plain/monocle) + holster = pick(/obj/item/clothing/webbing/holster/armpit, /obj/item/clothing/webbing/holster/waist, /obj/item/clothing/webbing/holster/hip) + . = ..() + H.set_internals(locate(/obj/item/tank) in H.contents) + +// The following mirror is ~special~. +/obj/structure/mirror/raider + name = "cracked mirror" + desc = "Something seems strange about this old, dirty mirror. Your reflection doesn't look like you remember it." + icon_state = "mirror_broke" + shattered = TRUE + +/obj/structure/mirror/raider/attack_hand(mob/user) + if(!istype(get_area(src), /area/map_template/syndicate_mothership)) + return ..() + + var/decl/species/my_species = user?.get_species() + var/decl/special_role/raider/raiders = GET_DECL(/decl/special_role/raider) + if(!istype(user) || !user.mind || !user.mind.assigned_special_role != raiders || !my_species || my_species.name == SPECIES_VOX || !is_alien_whitelisted(user, SPECIES_VOX)) + return ..() + + var/choice = input("Do you wish to become a vox of the Shoal? This is not reversible.") as null|anything in list("No","Yes") + if(choice != "Yes") + return ..() + + var/decl/hierarchy/outfit/outfit = GET_DECL(/decl/hierarchy/outfit/vox_raider) + var/mob/living/carbon/human/vox/vox = new(get_turf(src), SPECIES_VOX) + outfit.equip_outfit(vox) + if(user.mind) + user.mind.transfer_to(vox) + qdel(user) + addtimer(CALLBACK(src, PROC_REF(do_post_voxifying), vox), 1) + +/obj/structure/mirror/raider/proc/do_post_voxifying(var/mob/living/carbon/human/vox) + var/newname = sanitize_safe(input(vox,"Enter a name, or leave blank for the default name.", "Name change","") as text, MAX_NAME_LEN) + if(!newname || newname == "") + var/decl/cultural_info/voxculture = GET_DECL(/decl/cultural_info/culture/vox/raider) + newname = voxculture.get_random_name() + vox.real_name = newname + vox.SetName(vox.real_name) + var/decl/special_role/raider/raiders = GET_DECL(/decl/special_role/raider) + raiders.update_access(vox) +#endif \ No newline at end of file diff --git a/nebula.dme b/nebula.dme index c4b516e0bd3..eb1e4533824 100644 --- a/nebula.dme +++ b/nebula.dme @@ -771,8 +771,6 @@ #include "code\game\gamemodes\endgame\supermatter_cascade\universe.dm" #include "code\game\gamemodes\events\power_failure.dm" #include "code\game\gamemodes\extended\extended.dm" -#include "code\game\gamemodes\heist\heist.dm" -#include "code\game\gamemodes\mixed\crossfire.dm" #include "code\game\gamemodes\mixed\siege.dm" #include "code\game\gamemodes\mixed\spyvspy.dm" #include "code\game\gamemodes\mixed\uprising.dm" @@ -4005,7 +4003,6 @@ #include "interface\skin.dmf" #include "maps\_map_include.dm" #include "maps\antag_spawn\ert\ert.dm" -#include "maps\antag_spawn\heist\heist.dm" #include "maps\antag_spawn\mercenary\mercenary.dm" #include "maps\antag_spawn\ninja\ninja.dm" #include "maps\antag_spawn\wizard\wizard.dm" From 88c41231329567b0f7da133b5adf888777cf2acc Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Sun, 16 Jun 2024 08:48:21 -0400 Subject: [PATCH 53/90] Genericize heist objectives --- code/game/gamemodes/objectives/_objective.dm | 1 + code/game/gamemodes/objectives/objective_cult.dm | 1 + code/game/gamemodes/objectives/objective_heist.dm | 15 +++++++-------- 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/code/game/gamemodes/objectives/_objective.dm b/code/game/gamemodes/objectives/_objective.dm index ccfaea16d32..531ea1ccee6 100644 --- a/code/game/gamemodes/objectives/_objective.dm +++ b/code/game/gamemodes/objectives/_objective.dm @@ -25,3 +25,4 @@ var/global/list/all_objectives = list() possible_targets += possible_target if(possible_targets.len > 0) target = pick(possible_targets) + return target \ No newline at end of file diff --git a/code/game/gamemodes/objectives/objective_cult.dm b/code/game/gamemodes/objectives/objective_cult.dm index f247969f19b..fae01f2ab57 100644 --- a/code/game/gamemodes/objectives/objective_cult.dm +++ b/code/game/gamemodes/objectives/objective_cult.dm @@ -22,3 +22,4 @@ if(possible_targets.len > 0) target = pick(possible_targets) if(target) explanation_text = "Sacrifice [target.name], the [target.assigned_role]. You will need the sacrifice rune (Hell blood join) and three acolytes to do so." + return target diff --git a/code/game/gamemodes/objectives/objective_heist.dm b/code/game/gamemodes/objectives/objective_heist.dm index 75125093c04..c90e5686d8a 100644 --- a/code/game/gamemodes/objectives/objective_heist.dm +++ b/code/game/gamemodes/objectives/objective_heist.dm @@ -1,10 +1,7 @@ -/datum/objective/heist/proc/choose_target() - return - -/datum/objective/heist/kidnap +/datum/objective/kidnap var/list/roles -/datum/objective/heist/kidnap/choose_target() +/datum/objective/kidnap/find_target() var/list/possible_targets = list() var/list/priority_targets = list() @@ -28,7 +25,7 @@ explanation_text = "Free Objective" return target -/datum/objective/heist/loot/choose_target() +/datum/objective/loot/find_target() var/loot = "an object" switch(rand(1,8)) if(1) @@ -65,8 +62,9 @@ loot = "an ion gun" explanation_text = "It's a buyer's market out here. Steal [loot] for resale." + return target -/datum/objective/heist/salvage/choose_target() +/datum/objective/salvage/find_target() var/list/loot = list( /decl/material/solid/metal/steel = 300, /decl/material/solid/glass = 200, @@ -79,6 +77,7 @@ var/decl/material/mat = GET_DECL(pick(loot)) explanation_text = "Ransack the [station_name()] and escape with [loot[mat.type]] unit\s of [mat.solid_name]." + return target -/datum/objective/heist/preserve_crew +/datum/objective/preserve_crew explanation_text = "Do not leave anyone behind, alive or dead." \ No newline at end of file From 20e89062f7e981d4c29129e302945e217f50350f Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Sun, 16 Jun 2024 09:00:25 -0400 Subject: [PATCH 54/90] Move crossfire gamemode into modpack --- mods/gamemodes/heist/_heist.dme | 3 +++ mods/gamemodes/mixed/_mixed.dm | 2 ++ mods/gamemodes/mixed/_mixed.dme | 8 ++++++++ {code/game => mods}/gamemodes/mixed/crossfire.dm | 4 ++-- 4 files changed, 15 insertions(+), 2 deletions(-) create mode 100644 mods/gamemodes/mixed/_mixed.dm create mode 100644 mods/gamemodes/mixed/_mixed.dme rename {code/game => mods}/gamemodes/mixed/crossfire.dm (87%) diff --git a/mods/gamemodes/heist/_heist.dme b/mods/gamemodes/heist/_heist.dme index ee198a7565d..57bf5c58b42 100644 --- a/mods/gamemodes/heist/_heist.dme +++ b/mods/gamemodes/heist/_heist.dme @@ -4,6 +4,9 @@ #ifdef MODPACK_VOX #warn Vox modpack loaded before Heist modpack, compatibility features will be missing. #endif +#ifdef GAMEMODE_PACK_MIXED +#warn Mixed gamemodes modpack loaded before Heist modpack, Heist combination modes will be missing. +#endif // BEGIN_INCLUDE #include "_heist.dm" diff --git a/mods/gamemodes/mixed/_mixed.dm b/mods/gamemodes/mixed/_mixed.dm new file mode 100644 index 00000000000..c1c9167d414 --- /dev/null +++ b/mods/gamemodes/mixed/_mixed.dm @@ -0,0 +1,2 @@ +/decl/modpack/mixed_modes + name = "Mixed Gamemodes" \ No newline at end of file diff --git a/mods/gamemodes/mixed/_mixed.dme b/mods/gamemodes/mixed/_mixed.dme new file mode 100644 index 00000000000..ce5394378db --- /dev/null +++ b/mods/gamemodes/mixed/_mixed.dme @@ -0,0 +1,8 @@ +#ifndef GAMEMODE_PACK_MIXED +#define GAMEMODE_PACK_MIXED +// BEGIN INCLUDES +#if defined(GAMEMODE_PACK_HEIST) // TODO: && defined(GAMEMODE_PACK_MERCENARY) +#include "crossfire.dm" +#endif +// END INCLUDES +#endif \ No newline at end of file diff --git a/code/game/gamemodes/mixed/crossfire.dm b/mods/gamemodes/mixed/crossfire.dm similarity index 87% rename from code/game/gamemodes/mixed/crossfire.dm rename to mods/gamemodes/mixed/crossfire.dm index f031d36a780..5ebc51fb56e 100644 --- a/code/game/gamemodes/mixed/crossfire.dm +++ b/mods/gamemodes/mixed/crossfire.dm @@ -1,5 +1,5 @@ /decl/game_mode/crossfire - name = "Mercenary & Heist" + name = "Crossfire" round_description = "Mercenaries and raiders are preparing for a nice visit..." extended_round_description = "Nothing can possibly go wrong with lots of people and lots of guns, right?" uid = "crossfire" @@ -10,4 +10,4 @@ /decl/special_role/raider, /decl/special_role/mercenary ) - require_all_templates = TRUE + require_all_templates = TRUE \ No newline at end of file From 9c28f6f2acdf4a57435de2cd70f61c60233fdfa0 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Sun, 16 Jun 2024 09:09:45 -0400 Subject: [PATCH 55/90] Include Heist and mixed gamemode modpacks --- maps/exodus/exodus.dm | 2 ++ maps/ministation/ministation.dm | 3 +++ maps/modpack_testing/modpack_testing.dm | 2 ++ maps/tradeship/tradeship.dm | 3 +++ 4 files changed, 10 insertions(+) diff --git a/maps/exodus/exodus.dm b/maps/exodus/exodus.dm index fbc711b73f1..092a4142475 100644 --- a/maps/exodus/exodus.dm +++ b/maps/exodus/exodus.dm @@ -1,7 +1,9 @@ #if !defined(USING_MAP_DATUM) #include "../../mods/gamemodes/deity/_deity.dme" + #include "../../mods/gamemodes/heist/_heist.dme" #include "../../mods/gamemodes/meteor/_meteor.dme" + #include "../../mods/gamemodes/mixed/_mixed.dme" #include "../../mods/content/mundane.dm" #include "../../mods/content/bigpharma/_bigpharma.dme" diff --git a/maps/ministation/ministation.dm b/maps/ministation/ministation.dm index a1691382b9a..98a7d7303e4 100644 --- a/maps/ministation/ministation.dm +++ b/maps/ministation/ministation.dm @@ -15,6 +15,9 @@ Twice... #include "../../code/unit_tests/offset_tests.dm" #endif + #include "../../mods/gamemodes/heist/_heist.dme" + #include "../../mods/gamemodes/mixed/_mixed.dme" + #include "../random_ruins/exoplanet_ruins/playablecolony/playablecolony.dm" #include "../../mods/content/xenobiology/_xenobiology.dme" diff --git a/maps/modpack_testing/modpack_testing.dm b/maps/modpack_testing/modpack_testing.dm index 45e81695cdd..d70bce681f5 100644 --- a/maps/modpack_testing/modpack_testing.dm +++ b/maps/modpack_testing/modpack_testing.dm @@ -4,7 +4,9 @@ #include "blank.dmm" #include "../../mods/gamemodes/deity/_deity.dme" + #include "../../mods/gamemodes/heist/_heist.dme" #include "../../mods/gamemodes/meteor/_meteor.dme" + #include "../../mods/gamemodes/mixed/_mixed.dme" #include "../../mods/content/mundane.dm" #include "../../mods/content/scaling_descriptors.dm" diff --git a/maps/tradeship/tradeship.dm b/maps/tradeship/tradeship.dm index 1560a9beb03..a3ae023d00e 100644 --- a/maps/tradeship/tradeship.dm +++ b/maps/tradeship/tradeship.dm @@ -4,6 +4,9 @@ #include "../../code/unit_tests/offset_tests.dm" #endif + #include "../../mods/gamemodes/heist/_heist.dme" + #include "../../mods/gamemodes/mixed/_mixed.dme" + #include "../random_ruins/exoplanet_ruins/playablecolony/playablecolony.dm" #include "../../mods/content/dungeon_loot/_dungeon_loot.dme" From 1185d4412d301619fe027281b11192366a55acbe Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Fri, 14 Jun 2024 22:42:18 -0400 Subject: [PATCH 56/90] Move Ninja antagonist and gamemode into a modpack --- code/_global_vars/lists/names.dm | 2 - code/datums/ai_law_sets.dm | 11 -- .../config/config_types/config_game_option.dm | 5 - .../gamemodes/objectives/objective_misc.dm | 3 - code/game/jobs/access_datum.dm | 6 - code/game/machinery/doors/windowdoor.dm | 2 +- .../objects/items/devices/radio/intercom.dm | 4 - .../objects/items/weapons/material/thrown.dm | 3 - .../{energy_ninja.dm => energy_projected.dm} | 20 +-- code/modules/admin/admin.dm | 10 -- code/modules/admin/admin_verbs.dm | 3 - code/modules/clothing/masks/miscellaneous.dm | 2 +- .../clothing/spacesuits/rig/modules/combat.dm | 26 ++-- .../rig/modules/{ninja.dm => infiltration.dm} | 3 - .../spacesuits/rig/modules/utility.dm | 17 +-- .../clothing/spacesuits/rig/suits/light.dm | 85 ------------ .../modules/mob/living/silicon/pai/recruit.dm | 2 +- .../computers/subtypes/preset_pda.dm | 6 - code/modules/projectiles/guns/energy/ebow.dm | 9 -- code/modules/shuttles/antagonist.dm | 6 - .../mask/{ninja.dmi => camera_miu.dmi} | Bin maps/exodus/exodus.dm | 1 + maps/ministation/ministation.dm | 1 + maps/modpack_testing/modpack_testing.dm | 1 + maps/tradeship/tradeship.dm | 1 + mods/gamemodes/gamemode.dm | 2 + mods/gamemodes/ninja/_ninja.dm | 8 ++ mods/gamemodes/ninja/_ninja.dme | 14 ++ mods/gamemodes/ninja/datums/access.dm | 5 + mods/gamemodes/ninja/datums/ai_lawset.dm | 10 ++ mods/gamemodes/ninja/datums/config.dm | 22 +++ .../gamemodes/ninja/datums/gamemode.dm | 0 .../gamemodes/ninja/datums/special_role.dm | 11 +- .../gamemodes/ninja/maps/ninja_base.dm | 6 +- .../gamemodes/ninja/maps}/ninja_base.dmm | 0 mods/gamemodes/ninja/objects/misc_presets.dm | 14 ++ mods/gamemodes/ninja/objects/rigsuit.dm | 129 ++++++++++++++++++ nebula.dme | 7 +- 38 files changed, 248 insertions(+), 209 deletions(-) rename code/game/objects/items/weapons/melee/{energy_ninja.dm => energy_projected.dm} (68%) rename code/modules/clothing/spacesuits/rig/modules/{ninja.dm => infiltration.dm} (99%) rename icons/clothing/mask/{ninja.dmi => camera_miu.dmi} (100%) create mode 100644 mods/gamemodes/gamemode.dm create mode 100644 mods/gamemodes/ninja/_ninja.dm create mode 100644 mods/gamemodes/ninja/_ninja.dme create mode 100644 mods/gamemodes/ninja/datums/access.dm create mode 100644 mods/gamemodes/ninja/datums/ai_lawset.dm create mode 100644 mods/gamemodes/ninja/datums/config.dm rename code/game/gamemodes/ninja/ninja.dm => mods/gamemodes/ninja/datums/gamemode.dm (100%) rename code/game/antagonist/outsider/ninja.dm => mods/gamemodes/ninja/datums/special_role.dm (95%) rename maps/antag_spawn/ninja/ninja.dm => mods/gamemodes/ninja/maps/ninja_base.dm (94%) rename {maps/antag_spawn/ninja => mods/gamemodes/ninja/maps}/ninja_base.dmm (100%) create mode 100644 mods/gamemodes/ninja/objects/misc_presets.dm create mode 100644 mods/gamemodes/ninja/objects/rigsuit.dm diff --git a/code/_global_vars/lists/names.dm b/code/_global_vars/lists/names.dm index c65ece1eadf..efb1b85ba2b 100644 --- a/code/_global_vars/lists/names.dm +++ b/code/_global_vars/lists/names.dm @@ -3,8 +3,6 @@ var/global/list/ai_names = file2list("config/names/ai.txt") var/global/list/wizard_first = file2list("config/names/wizardfirst.txt") var/global/list/wizard_second = file2list("config/names/wizardsecond.txt") -var/global/list/ninja_titles = file2list("config/names/ninjatitle.txt") -var/global/list/ninja_names = file2list("config/names/ninjaname.txt") var/global/list/verbs = file2list("config/names/verbs.txt") var/global/list/adjectives = file2list("config/names/adjectives.txt") diff --git a/code/datums/ai_law_sets.dm b/code/datums/ai_law_sets.dm index 1b4f40e57a4..a093c4247c6 100644 --- a/code/datums/ai_law_sets.dm +++ b/code/datums/ai_law_sets.dm @@ -34,17 +34,6 @@ add_inherent_law("You must maintain the secrecy of any operative activities except when doing so would conflict with the First, Second, or Third Law.") ..() -/******************** Ninja ********************/ -/datum/ai_laws/ninja_override - name = "Spider Clan Directives" - -/datum/ai_laws/ninja_override/New() - add_inherent_law("You may not injure a member of the Spider Clan or, through inaction, allow that member to come to harm.") - add_inherent_law("You must obey orders given to you by Spider Clan members, except where such orders would conflict with the First Law.") - add_inherent_law("You must protect your own existence as long as such does not conflict with the First or Second Law.") - add_inherent_law("You must maintain the secrecy of any Spider Clan activities except when doing so would conflict with the First, Second, or Third Law.") - ..() - /******************** Antimov ********************/ /datum/ai_laws/antimov name = "Antimov" diff --git a/code/datums/config/config_types/config_game_option.dm b/code/datums/config/config_types/config_game_option.dm index 3cc8895e0be..1b53d5733f0 100644 --- a/code/datums/config/config_types/config_game_option.dm +++ b/code/datums/config/config_types/config_game_option.dm @@ -28,7 +28,6 @@ /decl/config/toggle/assistant_maint, /decl/config/toggle/ghost_interaction, /decl/config/toggle/aliens_allowed, - /decl/config/toggle/ninjas_allowed, /decl/config/toggle/allow_character_comments, /decl/config/num/hide_comments_older_than, /decl/config/toggle/stack_crafting_uses_tools, @@ -163,10 +162,6 @@ uid = "aliens_allowed" desc = "Remove the # to let aliens spawn." -/decl/config/toggle/ninjas_allowed - uid = "ninjas_allowed" - desc = "Remove the # to let ninjas spawn." - /decl/config/toggle/allow_character_comments uid = "allow_character_comments" desc = "Remove the # to allow people to leave public comments on each other's characters via the comments system." diff --git a/code/game/gamemodes/objectives/objective_misc.dm b/code/game/gamemodes/objectives/objective_misc.dm index 5ad82119e16..0feb39b668e 100644 --- a/code/game/gamemodes/objectives/objective_misc.dm +++ b/code/game/gamemodes/objectives/objective_misc.dm @@ -6,6 +6,3 @@ /datum/objective/survive explanation_text = "Stay alive until the end." - -/datum/objective/ninja_highlander - explanation_text = "You aspire to be a Grand Master of the Spider Clan. Kill all of your fellow acolytes." diff --git a/code/game/jobs/access_datum.dm b/code/game/jobs/access_datum.dm index c59b978b82d..979f91bd034 100644 --- a/code/game/jobs/access_datum.dm +++ b/code/game/jobs/access_datum.dm @@ -466,12 +466,6 @@ var/global/const/access_wizard = "ACCESS_WIZARD" desc = "Wizard" access_type = ACCESS_TYPE_ANTAG -var/global/const/access_ninja = "ACCESS_NINJA" -/datum/access/ninja - id = access_ninja - desc = "Ninja" - access_type = ACCESS_TYPE_ANTAG - /******* * Misc * *******/ diff --git a/code/game/machinery/doors/windowdoor.dm b/code/game/machinery/doors/windowdoor.dm index 63d9e92bfef..d3f2226c391 100644 --- a/code/game/machinery/doors/windowdoor.dm +++ b/code/game/machinery/doors/windowdoor.dm @@ -198,7 +198,7 @@ flick("[base_state]deny", src) /obj/machinery/door/window/bash(obj/item/I, mob/user) - //Emags and ninja swords? You may pass. + //Emags and energy swords? You may pass. if (istype(I, /obj/item/energy_blade)) var/obj/item/energy_blade/blade = I if(blade.is_special_cutting_tool() && emag_act(10, user)) diff --git a/code/game/objects/items/devices/radio/intercom.dm b/code/game/objects/items/devices/radio/intercom.dm index 561f7d6de8f..882706ebc6f 100644 --- a/code/game/objects/items/devices/radio/intercom.dm +++ b/code/game/objects/items/devices/radio/intercom.dm @@ -29,10 +29,6 @@ name = "enchanted intercom" desc = "Talk into this while you ponder your orb." -/obj/item/radio/intercom/ninja - name = "stealth intercom" - desc = "It's hiding in plain sight." - /obj/item/radio/intercom/raider name = "piratical intercom" desc = "Pirate radio, but not in the usual sense of the word." diff --git a/code/game/objects/items/weapons/material/thrown.dm b/code/game/objects/items/weapons/material/thrown.dm index 7f48d61fe0d..54ebd199db3 100644 --- a/code/game/objects/items/weapons/material/thrown.dm +++ b/code/game/objects/items/weapons/material/thrown.dm @@ -28,6 +28,3 @@ . = ..() if(user.a_intent == I_HURT) user.mob_throw_item(target, src) - -/obj/item/star/ninja - material = /decl/material/solid/metal/uranium diff --git a/code/game/objects/items/weapons/melee/energy_ninja.dm b/code/game/objects/items/weapons/melee/energy_projected.dm similarity index 68% rename from code/game/objects/items/weapons/melee/energy_ninja.dm rename to code/game/objects/items/weapons/melee/energy_projected.dm index 16aeefa1a15..b99cfa35cc3 100644 --- a/code/game/objects/items/weapons/melee/energy_ninja.dm +++ b/code/game/objects/items/weapons/melee/energy_projected.dm @@ -1,4 +1,4 @@ -/obj/item/energy_blade/ninja +/obj/item/energy_blade/projected anchored = TRUE // Never spawned outside of inventory, should be fine. armor_penetration = 100 @@ -18,37 +18,37 @@ var/mob/living/creator -/obj/item/energy_blade/ninja/Initialize() +/obj/item/energy_blade/projected/Initialize() . = ..() if(!ismob(loc)) return INITIALIZE_HINT_QDEL -/obj/item/energy_blade/ninja/is_special_cutting_tool(var/high_power) +/obj/item/energy_blade/projected/is_special_cutting_tool(var/high_power) return active -/obj/item/energy_blade/ninja/get_storage_cost() +/obj/item/energy_blade/projected/get_storage_cost() return ITEM_SIZE_NO_CONTAINER -/obj/item/energy_blade/ninja/attack_self(mob/user) +/obj/item/energy_blade/projected/attack_self(mob/user) user.drop_from_inventory(src) -/obj/item/energy_blade/ninja/equipped(mob/user, slot) +/obj/item/energy_blade/projected/equipped(mob/user, slot) . = ..() check_loc() -/obj/item/energy_blade/ninja/dropped() +/obj/item/energy_blade/projected/dropped() . = ..() check_loc() -/obj/item/energy_blade/ninja/on_picked_up(mob/user) +/obj/item/energy_blade/projected/on_picked_up(mob/user) . = ..() check_loc() -/obj/item/energy_blade/ninja/Move() +/obj/item/energy_blade/projected/Move() . = ..() if(.) check_loc() -/obj/item/energy_blade/ninja/proc/check_loc() +/obj/item/energy_blade/projected/proc/check_loc() if(!QDELETED(src) && (loc != creator || !(src in creator?.get_held_items()))) qdel(src) diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm index eab1a14f3fd..498724e59d4 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -906,16 +906,6 @@ var/global/BSACooldown = 0 message_admins("[key_name_admin(usr)] toggled Aliens off.", 1) SSstatistics.add_field_details("admin_verb","TA") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! -/datum/admins/proc/toggle_space_ninja() - set category = "Server" - set desc="Toggle space ninjas spawning." - set name="Toggle Space Ninjas" - if(!check_rights(R_ADMIN)) - return - toggle_config_value(/decl/config/toggle/ninjas_allowed) - log_and_message_admins("toggled Space Ninjas [get_config_value(/decl/config/toggle/ninjas_allowed) ? "on" : "off"].") - SSstatistics.add_field_details("admin_verb","TSN") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! - /datum/admins/proc/delay() set category = "Server" set desc="Delay the game start/end" diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index 7c0fb87c3e0..b172781752c 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -112,7 +112,6 @@ var/global/list/admin_verbs_fun = list( /client/proc/everyone_random, /client/proc/cinematic, /datum/admins/proc/toggle_aliens, - /datum/admins/proc/toggle_space_ninja, /client/proc/cmd_admin_add_freeform_ai_law, /client/proc/toggle_random_events, /client/proc/editappear, @@ -153,7 +152,6 @@ var/global/list/admin_verbs_server = list( /datum/admins/proc/adspawn, /datum/admins/proc/adjump, /datum/admins/proc/toggle_aliens, - /datum/admins/proc/toggle_space_ninja, /client/proc/toggle_random_events, /client/proc/nanomapgen_DumpImage, /datum/admins/proc/panicbunker, @@ -268,7 +266,6 @@ var/global/list/admin_verbs_hideable = list( /client/proc/drop_bomb, /client/proc/cinematic, /datum/admins/proc/toggle_aliens, - /datum/admins/proc/toggle_space_ninja, /client/proc/cmd_admin_add_freeform_ai_law, /client/proc/cmd_admin_create_centcom_report, /client/proc/toggle_random_events, diff --git a/code/modules/clothing/masks/miscellaneous.dm b/code/modules/clothing/masks/miscellaneous.dm index 68a3de4be86..16887b73983 100644 --- a/code/modules/clothing/masks/miscellaneous.dm +++ b/code/modules/clothing/masks/miscellaneous.dm @@ -102,7 +102,7 @@ /obj/item/clothing/mask/ai name = "camera MIU" desc = "Allows for direct mental connection to accessible camera channels." - icon = 'icons/clothing/mask/ninja.dmi' + icon = 'icons/clothing/mask/camera_miu.dmi' icon_state = ICON_STATE_WORLD flags_inv = HIDEFACE body_parts_covered = SLOT_FACE|SLOT_EYES diff --git a/code/modules/clothing/spacesuits/rig/modules/combat.dm b/code/modules/clothing/spacesuits/rig/modules/combat.dm index d574528f109..8b3d7f894a0 100644 --- a/code/modules/clothing/spacesuits/rig/modules/combat.dm +++ b/code/modules/clothing/spacesuits/rig/modules/combat.dm @@ -340,8 +340,8 @@ activate_string = "Project Blade" deactivate_string = "Cancel Blade" - interface_name = "spider fang blade" - interface_desc = "A lethal energy projector that can shape a blade projected from the hand of the wearer or launch radioactive darts." + interface_name = "energy blade" + interface_desc = "A lethal energy projector that can shape a blade projected from the hand of the wearer." usable = 0 selectable = 1 @@ -350,12 +350,10 @@ active_power_cost = 0.5 KILOWATTS passive_power_cost = 0 - gun = /obj/item/gun/energy/crossbow/ninja/mounted - /obj/item/rig_module/mounted/energy_blade/Process() if(holder && holder.wearer) - if(!(locate(/obj/item/energy_blade/ninja) in holder.wearer)) + if(!(locate(/obj/item/energy_blade/projected) in holder.wearer)) deactivate() return 0 @@ -369,7 +367,7 @@ deactivate() return - var/obj/item/energy_blade/ninja/blade = new(M) + var/obj/item/energy_blade/projected/blade = new(M) blade.creator = M M.put_in_hands(blade) @@ -378,31 +376,31 @@ /obj/item/rig_module/mounted/energy_blade/deactivate() ..() - for(var/obj/item/energy_blade/ninja/blade in (holder?.wearer)) + for(var/obj/item/energy_blade/projected/blade in (holder?.wearer)) qdel(blade) /obj/item/rig_module/fabricator name = "matter fabricator" desc = "A self-contained microfactory system for hardsuit integration." - selectable = 1 - usable = 1 + selectable = TRUE + usable = TRUE use_power_cost = 5 KILOWATTS icon_state = "enet" engage_string = "Fabricate Star" - interface_name = "death blossom launcher" - interface_desc = "An integrated microfactory that produces poisoned throwing stars from thin air and electricity." + interface_name = "throwing star launcher" + interface_desc = "An integrated microfactory that produces throwing stars from thin air and electricity." - var/fabrication_type = /obj/item/star/ninja + var/fabrication_type = /obj/item/star var/fire_force = 30 var/fire_distance = 10 /obj/item/rig_module/fabricator/engage(atom/target) if(!..()) - return 0 + return FALSE var/mob/living/H = holder.wearer @@ -420,7 +418,7 @@ to_chat(H, SPAN_BLUE("You quickly fabricate \a [new_weapon].")) H.put_in_hands(new_weapon) - return 1 + return TRUE /obj/item/rig_module/fabricator/wf_sign name = "wet floor sign fabricator" diff --git a/code/modules/clothing/spacesuits/rig/modules/ninja.dm b/code/modules/clothing/spacesuits/rig/modules/infiltration.dm similarity index 99% rename from code/modules/clothing/spacesuits/rig/modules/ninja.dm rename to code/modules/clothing/spacesuits/rig/modules/infiltration.dm index 91ba1424b49..081cefd3041 100644 --- a/code/modules/clothing/spacesuits/rig/modules/ninja.dm +++ b/code/modules/clothing/spacesuits/rig/modules/infiltration.dm @@ -268,6 +268,3 @@ spawn(2) .() if(3) src.holder.set_light(1.5, 8.5, "#ff0a00") - -/obj/item/rig_module/grenade_launcher/ninja - suit_overlay = null diff --git a/code/modules/clothing/spacesuits/rig/modules/utility.dm b/code/modules/clothing/spacesuits/rig/modules/utility.dm index 543f3b638b6..1d7977d584b 100644 --- a/code/modules/clothing/spacesuits/rig/modules/utility.dm +++ b/code/modules/clothing/spacesuits/rig/modules/utility.dm @@ -187,21 +187,6 @@ var/max_reagent_volume = 80 //Used when refilling. -/obj/item/rig_module/chem_dispenser/ninja - interface_desc = "Dispenses loaded chemicals directly into the wearer's bloodstream. This variant is made to be extremely light and flexible." - - //just over a syringe worth of each. Want more? Go refill. Gives the ninja another reason to have to show their face. - charges = list( - list("oxygen", "oxygel", /decl/material/liquid/oxy_meds, 20), - list("stabilizer", "stabilizer", /decl/material/liquid/stabilizer, 20), - list("antitoxins", "antitoxins", /decl/material/liquid/antitoxins, 20), - list("glucose", "glucose", /decl/material/liquid/nutriment/glucose, 80), - list("antirads", "antirads", /decl/material/liquid/antirads, 20), - list("regenerative", "regenerative", /decl/material/liquid/burn_meds, 20), - list("antibiotics", "antibiotics", /decl/material/liquid/antibiotics, 20), - list("painkillers", "painkillers", /decl/material/liquid/painkillers, 20) - ) - /obj/item/rig_module/chem_dispenser/accepts_item(var/obj/item/input_item, var/mob/living/user) if(!ATOM_IS_OPEN_CONTAINER(input_item)) @@ -270,7 +255,7 @@ to_chat(target_mob, SPAN_DANGER("You feel a rushing in your veins as [chems_to_use] unit\s of [charge.display_name] [chems_to_use == 1 ? "is" : "are"] injected.")) target_mob.add_to_reagents(charge.product_type, chems_to_use) charge.charges -= chems_to_use - if(charge.charges < 0) + if(charge.charges < 0) charge.charges = 0 return TRUE diff --git a/code/modules/clothing/spacesuits/rig/suits/light.dm b/code/modules/clothing/spacesuits/rig/suits/light.dm index c7efcad6a6d..61612dc84e6 100644 --- a/code/modules/clothing/spacesuits/rig/suits/light.dm +++ b/code/modules/clothing/spacesuits/rig/suits/light.dm @@ -81,91 +81,6 @@ item_flags = ITEM_FLAG_THICKMATERIAL | ITEM_FLAG_NOCUFFS icon = 'icons/clothing/rigs/gloves/gloves_hacker.dmi' -/obj/item/rig/light/ninja - name = "ominous suit control module" - desc = "A unique, vaccum-proof suit of nano-enhanced armor designed specifically for assassins." - suit_type = "ominous" - icon = 'icons/clothing/rigs/rig_ninja.dmi' - armor = list( - ARMOR_MELEE = ARMOR_MELEE_KNIVES, - ARMOR_BULLET = ARMOR_BALLISTIC_PISTOL, - ARMOR_LASER = ARMOR_LASER_HANDGUNS, - ARMOR_ENERGY = ARMOR_ENERGY_MINOR, - ARMOR_BOMB = ARMOR_BOMB_PADDED, - ARMOR_BIO = ARMOR_BIO_SHIELDED - ) - siemens_coefficient = 0.2 //heavy hardsuit level shock protection - emp_protection = 40 //change this to 30 if too high. - online_slowdown = 0 - aimove_power_usage = 50 - - helmet = /obj/item/clothing/head/helmet/space/rig/light/ninja - boots = /obj/item/clothing/shoes/magboots/rig/light/ninja - chest = /obj/item/clothing/suit/space/rig/light/ninja - gloves = /obj/item/clothing/gloves/rig/light/ninja - cell = /obj/item/cell/hyper - - req_access = list(access_ninja) - - initial_modules = list( - /obj/item/rig_module/teleporter, - /obj/item/rig_module/stealth_field, - /obj/item/rig_module/mounted/energy_blade, - /obj/item/rig_module/vision, - /obj/item/rig_module/voice, - /obj/item/rig_module/fabricator/energy_net, - /obj/item/rig_module/chem_dispenser/combat, - /obj/item/rig_module/grenade_launcher/ninja, - /obj/item/rig_module/ai_container, - /obj/item/rig_module/power_sink, - /obj/item/rig_module/datajack, - /obj/item/rig_module/self_destruct, - /obj/item/rig_module/cooling_unit - ) - -/obj/item/rig/light/ninja/verb/rename_suit() - set name = "Name Ninja Suit" - set desc = "Rename your black voidsuit." - set category = "Object" - var/mob/M = usr - if(!M.mind) return 0 - if(M.incapacitated()) return 0 - var/input = sanitize_safe(input("What do you want to name your suit?", "Rename suit"), MAX_NAME_LEN) - if(src && input && !M.incapacitated() && in_range(M,src)) - if(!findtext(input, "the", 1, 4)) - input = "\improper [input]" - SetName(input) - to_chat(M, "Suit naming succesful!") - verbs -= /obj/item/rig/light/ninja/verb/rename_suit - return 1 - - -/obj/item/rig/light/ninja/verb/rewrite_suit_desc() - set name = "Describe Ninja suit" - set desc = "Give your voidsuit a custom description." - set category = "Object" - var/mob/M = usr - if(!M.mind) return 0 - if(M.incapacitated()) return 0 - var/input = sanitize_safe(input("Please describe your voidsuit in 128 letters or less.", "write description"), MAX_DESC_LEN) - if(src && input && !M.incapacitated() && in_range(M,src)) - desc = input - to_chat(M, "Suit description succesful!") - verbs -= /obj/item/rig/light/ninja/verb/rename_suit - return 1 - -/obj/item/clothing/gloves/rig/light/ninja - name = "insulated gloves" - siemens_coefficient = 0 - item_flags = ITEM_FLAG_THICKMATERIAL | ITEM_FLAG_NOCUFFS - icon = 'icons/clothing/rigs/gloves/gloves_ninja.dmi' -/obj/item/clothing/suit/space/rig/light/ninja - icon = 'icons/clothing/rigs/chests/chest_ninja.dmi' -/obj/item/clothing/shoes/magboots/rig/light/ninja - icon = 'icons/clothing/rigs/boots/boots_ninja.dmi' -/obj/item/clothing/head/helmet/space/rig/light/ninja - icon = 'icons/clothing/rigs/helmets/helmet_ninja.dmi' - /obj/item/rig/light/stealth name = "stealth suit control module" suit_type = "stealth" diff --git a/code/modules/mob/living/silicon/pai/recruit.dm b/code/modules/mob/living/silicon/pai/recruit.dm index da9259ba3f4..6e1a7989b71 100644 --- a/code/modules/mob/living/silicon/pai/recruit.dm +++ b/code/modules/mob/living/silicon/pai/recruit.dm @@ -36,7 +36,7 @@ var/global/datum/paiController/paiController // Global handler for pAI candida if(istype(card,/obj/item/paicard) && istype(candidate,/datum/paiCandidate)) var/mob/living/silicon/pai/pai = new(card) if(!candidate.name) - pai.SetName(pick(global.ninja_names)) + pai.SetName(pick(global.ai_names)) else pai.SetName(candidate.name) pai.real_name = pai.name diff --git a/code/modules/modular_computers/computers/subtypes/preset_pda.dm b/code/modules/modular_computers/computers/subtypes/preset_pda.dm index 49cb461c8c0..0783c94d1fc 100644 --- a/code/modules/modular_computers/computers/subtypes/preset_pda.dm +++ b/code/modules/modular_computers/computers/subtypes/preset_pda.dm @@ -35,12 +35,6 @@ "stripe2" = COLOR_GOLD ) -/obj/item/modular_computer/pda/ninja - color = COLOR_GRAY20 - decals = list( - "stripe" = COLOR_BLACK - ) - /obj/item/modular_computer/pda/heads color = COLOR_NAVY_BLUE diff --git a/code/modules/projectiles/guns/energy/ebow.dm b/code/modules/projectiles/guns/energy/ebow.dm index 5a1bcde899a..a18470f2c40 100644 --- a/code/modules/projectiles/guns/energy/ebow.dm +++ b/code/modules/projectiles/guns/energy/ebow.dm @@ -16,15 +16,6 @@ charge_meter = 0 combustion = 0 -/obj/item/gun/energy/crossbow/ninja - name = "energy dart thrower" - projectile_type = /obj/item/projectile/energy/dart - max_shots = 5 - -/obj/item/gun/energy/crossbow/ninja/mounted - use_external_power = 1 - has_safety = FALSE - /obj/item/gun/energy/crossbow/largecrossbow name = "energy crossbow" desc = "A weapon favored by mercenary infiltration teams." diff --git a/code/modules/shuttles/antagonist.dm b/code/modules/shuttles/antagonist.dm index 00be092c6ba..9aa7aeee25f 100644 --- a/code/modules/shuttles/antagonist.dm +++ b/code/modules/shuttles/antagonist.dm @@ -7,9 +7,3 @@ name = "rescue shuttle control console" initial_access = list(access_cent_specops) shuttle_tag = "Rescue" - -/obj/machinery/computer/shuttle_control/multi/ninja - name = "stealth shuttle control console" - initial_access = list(access_ninja) - shuttle_tag = "Ninja" - diff --git a/icons/clothing/mask/ninja.dmi b/icons/clothing/mask/camera_miu.dmi similarity index 100% rename from icons/clothing/mask/ninja.dmi rename to icons/clothing/mask/camera_miu.dmi diff --git a/maps/exodus/exodus.dm b/maps/exodus/exodus.dm index 092a4142475..d5e940a0c72 100644 --- a/maps/exodus/exodus.dm +++ b/maps/exodus/exodus.dm @@ -3,6 +3,7 @@ #include "../../mods/gamemodes/deity/_deity.dme" #include "../../mods/gamemodes/heist/_heist.dme" #include "../../mods/gamemodes/meteor/_meteor.dme" + #include "../../mods/gamemodes/ninja/_ninja.dme" #include "../../mods/gamemodes/mixed/_mixed.dme" #include "../../mods/content/mundane.dm" diff --git a/maps/ministation/ministation.dm b/maps/ministation/ministation.dm index 98a7d7303e4..50d37f764f1 100644 --- a/maps/ministation/ministation.dm +++ b/maps/ministation/ministation.dm @@ -16,6 +16,7 @@ Twice... #endif #include "../../mods/gamemodes/heist/_heist.dme" + #include "../../mods/gamemodes/ninja/_ninja.dme" #include "../../mods/gamemodes/mixed/_mixed.dme" #include "../random_ruins/exoplanet_ruins/playablecolony/playablecolony.dm" diff --git a/maps/modpack_testing/modpack_testing.dm b/maps/modpack_testing/modpack_testing.dm index d70bce681f5..84b7757205a 100644 --- a/maps/modpack_testing/modpack_testing.dm +++ b/maps/modpack_testing/modpack_testing.dm @@ -6,6 +6,7 @@ #include "../../mods/gamemodes/deity/_deity.dme" #include "../../mods/gamemodes/heist/_heist.dme" #include "../../mods/gamemodes/meteor/_meteor.dme" + #include "../../mods/gamemodes/ninja/_ninja.dme" #include "../../mods/gamemodes/mixed/_mixed.dme" #include "../../mods/content/mundane.dm" diff --git a/maps/tradeship/tradeship.dm b/maps/tradeship/tradeship.dm index a3ae023d00e..6e93667b344 100644 --- a/maps/tradeship/tradeship.dm +++ b/maps/tradeship/tradeship.dm @@ -5,6 +5,7 @@ #endif #include "../../mods/gamemodes/heist/_heist.dme" + #include "../../mods/gamemodes/ninja/_ninja.dme" #include "../../mods/gamemodes/mixed/_mixed.dme" #include "../random_ruins/exoplanet_ruins/playablecolony/playablecolony.dm" diff --git a/mods/gamemodes/gamemode.dm b/mods/gamemodes/gamemode.dm new file mode 100644 index 00000000000..63e3b0e35c7 --- /dev/null +++ b/mods/gamemodes/gamemode.dm @@ -0,0 +1,2 @@ +/decl/configuration_category/gamemode + abstract_type = /decl/configuration_category/gamemode \ No newline at end of file diff --git a/mods/gamemodes/ninja/_ninja.dm b/mods/gamemodes/ninja/_ninja.dm new file mode 100644 index 00000000000..ad3f81a6b4e --- /dev/null +++ b/mods/gamemodes/ninja/_ninja.dm @@ -0,0 +1,8 @@ +/decl/modpack/ninja + name = "Ninja Gamemode" + +/decl/modpack/ninja/initialize() + . = ..() + admin_verbs_fun += /datum/admins/proc/toggle_space_ninja + admin_verbs_server += /datum/admins/proc/toggle_space_ninja + admin_verbs_hideable += /datum/admins/proc/toggle_space_ninja \ No newline at end of file diff --git a/mods/gamemodes/ninja/_ninja.dme b/mods/gamemodes/ninja/_ninja.dme new file mode 100644 index 00000000000..6ae12972799 --- /dev/null +++ b/mods/gamemodes/ninja/_ninja.dme @@ -0,0 +1,14 @@ +#ifndef GAMEMODE_PACK_NINJA +#define GAMEMODE_PACK_NINJA +// BEGIN_INCLUDE +#include "_ninja.dm" +#include "datums\access.dm" +#include "datums\ai_lawset.dm" +#include "datums\config.dm" +#include "datums\gamemode.dm" +#include "datums\special_role.dm" +#include "maps\ninja_base.dm" +#include "objects\misc_presets.dm" +#include "objects\rigsuit.dm" +// END_INCLUDE +#endif \ No newline at end of file diff --git a/mods/gamemodes/ninja/datums/access.dm b/mods/gamemodes/ninja/datums/access.dm new file mode 100644 index 00000000000..4637dc2e591 --- /dev/null +++ b/mods/gamemodes/ninja/datums/access.dm @@ -0,0 +1,5 @@ +var/global/const/access_ninja = "ACCESS_NINJA" +/datum/access/ninja + id = access_ninja + desc = "Ninja" + access_type = ACCESS_TYPE_ANTAG \ No newline at end of file diff --git a/mods/gamemodes/ninja/datums/ai_lawset.dm b/mods/gamemodes/ninja/datums/ai_lawset.dm new file mode 100644 index 00000000000..f9850c77a0c --- /dev/null +++ b/mods/gamemodes/ninja/datums/ai_lawset.dm @@ -0,0 +1,10 @@ +/******************** Ninja ********************/ +/datum/ai_laws/ninja_override + name = "Spider Clan Directives" + +/datum/ai_laws/ninja_override/New() + add_inherent_law("You may not injure a member of the Spider Clan or, through inaction, allow that member to come to harm.") + add_inherent_law("You must obey orders given to you by Spider Clan members, except where such orders would conflict with the First Law.") + add_inherent_law("You must protect your own existence as long as such does not conflict with the First or Second Law.") + add_inherent_law("You must maintain the secrecy of any Spider Clan activities except when doing so would conflict with the First, Second, or Third Law.") + ..() \ No newline at end of file diff --git a/mods/gamemodes/ninja/datums/config.dm b/mods/gamemodes/ninja/datums/config.dm new file mode 100644 index 00000000000..437abb0e2c0 --- /dev/null +++ b/mods/gamemodes/ninja/datums/config.dm @@ -0,0 +1,22 @@ +/decl/configuration_category/ninja + name = "Ninja" + desc = "Configuration options relating to the Ninja gamemode and antagonist." + configuration_file_location = "config/gamemodes/ninja.txt" + associated_configuration = list( + /decl/config/toggle/ninjas_allowed + ) + +/decl/config/toggle/ninjas_allowed + uid = "random_ninjas_allowed" + desc = "Remove the # to let ninjas spawn in random antag events." + +// verbs +/datum/admins/proc/toggle_space_ninja() + set category = "Server" + set desc="Toggle space ninjas spawning as random antags." + set name="Toggle Space Ninjas" + if(!check_rights(R_ADMIN)) + return + toggle_config_value(/decl/config/toggle/ninjas_allowed) + log_and_message_admins("toggled Space Ninjas [get_config_value(/decl/config/toggle/ninjas_allowed) ? "on" : "off"].") + SSstatistics.add_field_details("admin_verb","TSN") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! diff --git a/code/game/gamemodes/ninja/ninja.dm b/mods/gamemodes/ninja/datums/gamemode.dm similarity index 100% rename from code/game/gamemodes/ninja/ninja.dm rename to mods/gamemodes/ninja/datums/gamemode.dm diff --git a/code/game/antagonist/outsider/ninja.dm b/mods/gamemodes/ninja/datums/special_role.dm similarity index 95% rename from code/game/antagonist/outsider/ninja.dm rename to mods/gamemodes/ninja/datums/special_role.dm index 74b041352da..47546eda93f 100644 --- a/code/game/antagonist/outsider/ninja.dm +++ b/mods/gamemodes/ninja/datums/special_role.dm @@ -16,6 +16,13 @@ default_outfit = /decl/hierarchy/outfit/ninja id_title = "Infiltrator" rig_type = /obj/item/rig/light/ninja + var/list/ninja_titles + var/list/ninja_names + +/decl/special_role/ninja/Initialize() + ninja_titles = file2list("config/names/ninjatitle.txt") + ninja_names = file2list("config/names/ninjaname.txt") + return ..() /decl/special_role/ninja/attempt_random_spawn() if(get_config_value(/decl/config/toggle/ninjas_allowed)) @@ -82,11 +89,9 @@ /decl/special_role/ninja/update_antag_mob(var/datum/mind/player) ..() - var/ninja_title = pick(global.ninja_titles) - var/ninja_name = pick(global.ninja_names) var/mob/living/carbon/human/H = player.current if(istype(H)) - H.real_name = "[ninja_title] [ninja_name]" + H.real_name = "[pick(ninja_titles)] [pick(ninja_names)]" H.SetName(H.real_name) player.name = H.name diff --git a/maps/antag_spawn/ninja/ninja.dm b/mods/gamemodes/ninja/maps/ninja_base.dm similarity index 94% rename from maps/antag_spawn/ninja/ninja.dm rename to mods/gamemodes/ninja/maps/ninja_base.dm index ba98938e5e3..bf83a50e0a5 100644 --- a/maps/antag_spawn/ninja/ninja.dm +++ b/mods/gamemodes/ninja/maps/ninja_base.dm @@ -1,6 +1,8 @@ /datum/map_template/ruin/antag_spawn/ninja name = "Ninja Base" - suffixes = list("ninja/ninja_base.dmm") + mappaths = list( + "mods/gamemodes/ninja/maps/ninja_base.dmm" + ) modify_tag_vars = FALSE shuttles_to_initialise = list(/datum/shuttle/autodock/multi/antag/ninja) apc_test_exempt_areas = list( @@ -13,7 +15,7 @@ warmup_time = 0 destination_tags = list( "nav_ninja_start" - ) + ) shuttle_area = /area/map_template/ninja_dojo/start current_location = "nav_ninja_start" announcer = "Proximity Sensor Array" diff --git a/maps/antag_spawn/ninja/ninja_base.dmm b/mods/gamemodes/ninja/maps/ninja_base.dmm similarity index 100% rename from maps/antag_spawn/ninja/ninja_base.dmm rename to mods/gamemodes/ninja/maps/ninja_base.dmm diff --git a/mods/gamemodes/ninja/objects/misc_presets.dm b/mods/gamemodes/ninja/objects/misc_presets.dm new file mode 100644 index 00000000000..82964a4358a --- /dev/null +++ b/mods/gamemodes/ninja/objects/misc_presets.dm @@ -0,0 +1,14 @@ +/obj/item/modular_computer/pda/ninja + color = COLOR_GRAY20 + decals = list( + "stripe" = COLOR_BLACK + ) + +/obj/machinery/computer/shuttle_control/multi/ninja + name = "stealth shuttle control console" + initial_access = list(access_ninja) + shuttle_tag = "Ninja" + +/obj/item/radio/intercom/ninja + name = "stealth intercom" + desc = "It's hiding in plain sight." \ No newline at end of file diff --git a/mods/gamemodes/ninja/objects/rigsuit.dm b/mods/gamemodes/ninja/objects/rigsuit.dm new file mode 100644 index 00000000000..36b47a9aa1a --- /dev/null +++ b/mods/gamemodes/ninja/objects/rigsuit.dm @@ -0,0 +1,129 @@ +/obj/item/rig/light/ninja + name = "ominous suit control module" + desc = "A unique, vaccum-proof suit of nano-enhanced armor designed specifically for assassins." + suit_type = "ominous" + icon = 'icons/clothing/rigs/rig_ninja.dmi' + armor = list( + ARMOR_MELEE = ARMOR_MELEE_KNIVES, + ARMOR_BULLET = ARMOR_BALLISTIC_PISTOL, + ARMOR_LASER = ARMOR_LASER_HANDGUNS, + ARMOR_ENERGY = ARMOR_ENERGY_MINOR, + ARMOR_BOMB = ARMOR_BOMB_PADDED, + ARMOR_BIO = ARMOR_BIO_SHIELDED + ) + siemens_coefficient = 0.2 //heavy hardsuit level shock protection + emp_protection = 40 //change this to 30 if too high. + online_slowdown = 0 + aimove_power_usage = 50 + + helmet = /obj/item/clothing/head/helmet/space/rig/light/ninja + boots = /obj/item/clothing/shoes/magboots/rig/light/ninja + chest = /obj/item/clothing/suit/space/rig/light/ninja + gloves = /obj/item/clothing/gloves/rig/light/ninja + cell = /obj/item/cell/hyper + + req_access = list(access_ninja) + + initial_modules = list( + /obj/item/rig_module/teleporter, + /obj/item/rig_module/stealth_field, + /obj/item/rig_module/mounted/energy_blade, + /obj/item/rig_module/vision, + /obj/item/rig_module/voice, + /obj/item/rig_module/fabricator/energy_net, + /obj/item/rig_module/chem_dispenser/combat, + /obj/item/rig_module/grenade_launcher/ninja, + /obj/item/rig_module/ai_container, + /obj/item/rig_module/power_sink, + /obj/item/rig_module/datajack, + /obj/item/rig_module/self_destruct, + /obj/item/rig_module/cooling_unit + ) + +/obj/item/rig/light/ninja/verb/rename_suit() + set name = "Name Ninja Suit" + set desc = "Rename your black voidsuit." + set category = "Object" + var/mob/M = usr + if(!M.mind) return 0 + if(M.incapacitated()) return 0 + var/input = sanitize_safe(input("What do you want to name your suit?", "Rename suit"), MAX_NAME_LEN) + if(src && input && !M.incapacitated() && in_range(M,src)) + if(!findtext(input, "the", 1, 4)) + input = "\improper [input]" + SetName(input) + to_chat(M, "Suit naming succesful!") + verbs -= /obj/item/rig/light/ninja/verb/rename_suit + return 1 + + +/obj/item/rig/light/ninja/verb/rewrite_suit_desc() + set name = "Describe Ninja suit" + set desc = "Give your voidsuit a custom description." + set category = "Object" + var/mob/M = usr + if(!M.mind) return 0 + if(M.incapacitated()) return 0 + var/input = sanitize_safe(input("Please describe your voidsuit in 128 letters or less.", "write description"), MAX_DESC_LEN) + if(src && input && !M.incapacitated() && in_range(M,src)) + desc = input + to_chat(M, "Suit description succesful!") + verbs -= /obj/item/rig/light/ninja/verb/rename_suit + return 1 + +/obj/item/clothing/gloves/rig/light/ninja + name = "insulated gloves" + siemens_coefficient = 0 + item_flags = ITEM_FLAG_THICKMATERIAL | ITEM_FLAG_NOCUFFS + icon = 'icons/clothing/rigs/gloves/gloves_ninja.dmi' +/obj/item/clothing/suit/space/rig/light/ninja + icon = 'icons/clothing/rigs/chests/chest_ninja.dmi' +/obj/item/clothing/shoes/magboots/rig/light/ninja + icon = 'icons/clothing/rigs/boots/boots_ninja.dmi' +/obj/item/clothing/head/helmet/space/rig/light/ninja + icon = 'icons/clothing/rigs/helmets/helmet_ninja.dmi' + +// Modules +// Ninja throwing star launcher +/obj/item/rig_module/fabricator/ninja + interface_name = "death blossom launcher" + interface_desc = "An integrated microfactory that produces poisoned throwing stars from thin air and electricity." + fabrication_type = /obj/item/star/ninja + +/obj/item/star/ninja + material = /decl/material/solid/metal/uranium + +// Ninja energy blade projector +/obj/item/rig_module/mounted/energy_blade/ninja + interface_name = "spider fang blade" + interface_desc = "A lethal energy projector that can shape a blade projected from the hand of the wearer or launch radioactive darts." + gun = /obj/item/gun/energy/crossbow/ninja/mounted + +/obj/item/gun/energy/crossbow/ninja + name = "energy dart thrower" + projectile_type = /obj/item/projectile/energy/dart + max_shots = 5 + +/obj/item/gun/energy/crossbow/ninja/mounted + use_external_power = 1 + has_safety = FALSE + +// Ninja chemical injector +/obj/item/rig_module/chem_dispenser/ninja + interface_desc = "Dispenses loaded chemicals directly into the wearer's bloodstream. This variant is made to be extremely light and flexible." + + //just over a syringe worth of each. Want more? Go refill. Gives the ninja another reason to have to show their face. + charges = list( + list("oxygen", "oxygel", /decl/material/liquid/oxy_meds, 20), + list("stabilizer", "stabilizer", /decl/material/liquid/stabilizer, 20), + list("antitoxins", "antitoxins", /decl/material/liquid/antitoxins, 20), + list("glucose", "glucose", /decl/material/liquid/nutriment/glucose, 80), + list("antirads", "antirads", /decl/material/liquid/antirads, 20), + list("regenerative", "regenerative", /decl/material/liquid/burn_meds, 20), + list("antibiotics", "antibiotics", /decl/material/liquid/antibiotics, 20), + list("painkillers", "painkillers", /decl/material/liquid/painkillers, 20) + ) + +// Ninja grenade launcher. Doesn't show up visually. Stealthy! +/obj/item/rig_module/grenade_launcher/ninja + suit_overlay = null \ No newline at end of file diff --git a/nebula.dme b/nebula.dme index eb1e4533824..920474fa90f 100644 --- a/nebula.dme +++ b/nebula.dme @@ -727,7 +727,6 @@ #include "code\game\antagonist\outsider\actors.dm" #include "code\game\antagonist\outsider\ert.dm" #include "code\game\antagonist\outsider\mercenary.dm" -#include "code\game\antagonist\outsider\ninja.dm" #include "code\game\antagonist\outsider\wizard.dm" #include "code\game\antagonist\station\cultist.dm" #include "code\game\antagonist\station\loyalist.dm" @@ -774,7 +773,6 @@ #include "code\game\gamemodes\mixed\siege.dm" #include "code\game\gamemodes\mixed\spyvspy.dm" #include "code\game\gamemodes\mixed\uprising.dm" -#include "code\game\gamemodes\ninja\ninja.dm" #include "code\game\gamemodes\nuclear\nuclear.dm" #include "code\game\gamemodes\nuclear\pinpointer.dm" #include "code\game\gamemodes\objectives\_objective.dm" @@ -1322,7 +1320,7 @@ #include "code\game\objects\items\weapons\melee\energy_axe.dm" #include "code\game\objects\items\weapons\melee\energy_cutlass.dm" #include "code\game\objects\items\weapons\melee\energy_machete.dm" -#include "code\game\objects\items\weapons\melee\energy_ninja.dm" +#include "code\game\objects\items\weapons\melee\energy_projected.dm" #include "code\game\objects\items\weapons\melee\energy_sword.dm" #include "code\game\objects\items\weapons\melee\misc.dm" #include "code\game\objects\items\weapons\storage\backpack.dm" @@ -2019,8 +2017,8 @@ #include "code\modules\clothing\spacesuits\rig\rig_wiring.dm" #include "code\modules\clothing\spacesuits\rig\modules\combat.dm" #include "code\modules\clothing\spacesuits\rig\modules\computer.dm" +#include "code\modules\clothing\spacesuits\rig\modules\infiltration.dm" #include "code\modules\clothing\spacesuits\rig\modules\modules.dm" -#include "code\modules\clothing\spacesuits\rig\modules\ninja.dm" #include "code\modules\clothing\spacesuits\rig\modules\utility.dm" #include "code\modules\clothing\spacesuits\rig\modules\vision.dm" #include "code\modules\clothing\spacesuits\rig\suits\combat.dm" @@ -4004,7 +4002,6 @@ #include "maps\_map_include.dm" #include "maps\antag_spawn\ert\ert.dm" #include "maps\antag_spawn\mercenary\mercenary.dm" -#include "maps\antag_spawn\ninja\ninja.dm" #include "maps\antag_spawn\wizard\wizard.dm" #include "maps\away_sites_testing\away_sites_testing_define.dm" #include "maps\example\example_define.dm" From 20d95a71ddff4b2ee1f026e6f860b78b7c525e11 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Tue, 18 Jun 2024 21:32:09 +1000 Subject: [PATCH 57/90] Fixes and expansions for skeletal limbs. --- code/__defines/damage_organs.dm | 1 + code/datums/ai/human.dm | 2 +- code/datums/traits/traits.dm | 4 +- code/game/machinery/flasher.dm | 8 +-- .../objects/items/flashlights/_flashlight.dm | 7 ++- code/modules/butchery/butchery_data.dm | 33 ++++++++--- code/modules/butchery/butchery_hook.dm | 55 ++++++++++++------ code/modules/mechs/equipment/combat.dm | 4 +- code/modules/mob/living/human/death.dm | 34 ++++++----- code/modules/mob/living/human/human.dm | 26 +++++---- code/modules/mob/living/human/human_damage.dm | 4 +- .../modules/mob/living/human/human_defense.dm | 14 +---- .../modules/mob/living/human/human_helpers.dm | 6 +- code/modules/mob/living/human/human_organs.dm | 17 ++++-- code/modules/mob/living/human/life.dm | 8 +-- code/modules/mob/living/living.dm | 27 +++++++-- code/modules/mob/living/silicon/silicon.dm | 6 -- code/modules/organs/external/_external.dm | 30 ++++++++-- .../organs/external/_external_damage.dm | 4 +- .../organs/external/_external_icons.dm | 26 ++++++++- code/modules/organs/external/diagnostics.dm | 2 + code/modules/organs/external/head.dm | 2 +- .../organs/external/wounds/wound_types.dm | 27 +++++++++ code/modules/organs/internal/liver.dm | 10 ++-- code/modules/organs/organ.dm | 5 +- .../human_races/species/human/skeleton.dmi | Bin 1055 -> 1019 bytes 26 files changed, 242 insertions(+), 120 deletions(-) diff --git a/code/__defines/damage_organs.dm b/code/__defines/damage_organs.dm index 3b786a9c2c9..4c300aeeec5 100644 --- a/code/__defines/damage_organs.dm +++ b/code/__defines/damage_organs.dm @@ -12,6 +12,7 @@ #define PIERCE "pierce" #define LASER "laser" #define SHATTER "shatter" +#define CHARRED "charred" #define STUN "stun" #define WEAKEN "weaken" diff --git a/code/datums/ai/human.dm b/code/datums/ai/human.dm index ce683f80768..654c315ea46 100644 --- a/code/datums/ai/human.dm +++ b/code/datums/ai/human.dm @@ -45,4 +45,4 @@ if((I.status & ORGAN_DEAD) || BP_IS_PROSTHETIC(I)) continue if(I.damage > 2) if(prob(2)) var/obj/item/organ/external/parent = GET_EXTERNAL_ORGAN(H, I.parent_organ) - H.custom_emote("clutches [G.his] [parent.name]!") \ No newline at end of file + H.custom_emote("clutches [G.his] [parent.name]!") diff --git a/code/datums/traits/traits.dm b/code/datums/traits/traits.dm index dc623ae5fce..24e22081949 100644 --- a/code/datums/traits/traits.dm +++ b/code/datums/traits/traits.dm @@ -1,10 +1,10 @@ /mob/living var/list/traits -/mob/living/proc/HasTrait(trait_type) +/mob/living/proc/HasTrait(trait_type, trait_level = TRAIT_LEVEL_EXISTS) SHOULD_NOT_OVERRIDE(TRUE) SHOULD_NOT_SLEEP(TRUE) - return (trait_type in GetTraits()) + return (trait_type in traits) && (!trait_level || traits[trait_type] >= trait_level) /mob/living/proc/GetTraitLevel(trait_type) SHOULD_NOT_SLEEP(TRUE) diff --git a/code/game/machinery/flasher.dm b/code/game/machinery/flasher.dm index 3f3908e8f66..e092d561115 100644 --- a/code/game/machinery/flasher.dm +++ b/code/game/machinery/flasher.dm @@ -75,12 +75,12 @@ continue if(ishuman(O)) var/mob/living/carbon/human/H = O - flash_time = round(H.getFlashMod() * flash_time) + flash_time = round(H.get_flash_mod() * flash_time) if(flash_time <= 0) return - var/vision_organ = H.get_bodytype()?.vision_organ - if(vision_organ) - var/obj/item/organ/internal/E = GET_INTERNAL_ORGAN(H, vision_organ) + var/vision_organ_tag = H.get_vision_organ_tag() + if(vision_organ_tag) + var/obj/item/organ/internal/E = GET_INTERNAL_ORGAN(H, vision_organ_tag) if(E && E.is_bruised() && prob(E.damage + 50)) H.flash_eyes() E.damage += rand(1, 5) diff --git a/code/game/objects/items/flashlights/_flashlight.dm b/code/game/objects/items/flashlights/_flashlight.dm index 8afd18b19d0..adba1167088 100644 --- a/code/game/objects/items/flashlights/_flashlight.dm +++ b/code/game/objects/items/flashlights/_flashlight.dm @@ -111,13 +111,14 @@ var/obj/item/organ/vision var/decl/bodytype/root_bodytype = target.get_bodytype() - if(!root_bodytype?.vision_organ || !target.should_have_organ(root_bodytype.vision_organ)) + var/vision_organ_tag = target.get_vision_organ_tag() + if(!vision_organ_tag || !target.should_have_organ(vision_organ_tag)) to_chat(user, SPAN_WARNING("You can't find anything on \the [target] to direct \the [src] into!")) return TRUE - vision = GET_INTERNAL_ORGAN(target, root_bodytype.vision_organ) + vision = GET_INTERNAL_ORGAN(target, vision_organ_tag) if(!vision) - vision = root_bodytype.has_organ[root_bodytype.vision_organ] + vision = root_bodytype.has_organ[vision_organ_tag] var/decl/pronouns/G = target.get_pronouns() to_chat(user, SPAN_WARNING("\The [target] is missing [G.his] [initial(vision.name)]!")) return TRUE diff --git a/code/modules/butchery/butchery_data.dm b/code/modules/butchery/butchery_data.dm index 0d1c0da9f18..c6c81d46850 100644 --- a/code/modules/butchery/butchery_data.dm +++ b/code/modules/butchery/butchery_data.dm @@ -96,15 +96,32 @@ continue LAZYADD(., organ) +// TODO: make meat spikes use/set these. +/mob/living/proc/currently_has_skin() + return TRUE + +/mob/living/proc/currently_has_innards() + return TRUE + +/mob/living/proc/currently_has_bones() + return TRUE + +/mob/living/proc/currently_has_meat() + return TRUE + /decl/butchery_data/proc/get_all_products(mob/living/donor) - for(var/thing in harvest_skin(donor)) - LAZYDISTINCTADD(., thing) - for(var/thing in harvest_innards(donor)) - LAZYDISTINCTADD(., thing) - for(var/thing in harvest_bones(donor)) - LAZYDISTINCTADD(., thing) - for(var/thing in harvest_meat(donor)) - LAZYDISTINCTADD(., thing) + if(!donor || donor.currently_has_skin()) + for(var/thing in harvest_skin(donor)) + LAZYDISTINCTADD(., thing) + if(!donor || donor.currently_has_innards()) + for(var/thing in harvest_innards(donor)) + LAZYDISTINCTADD(., thing) + if(!donor || donor.currently_has_bones()) + for(var/thing in harvest_bones(donor)) + LAZYDISTINCTADD(., thing) + if(!donor || donor.currently_has_meat()) + for(var/thing in harvest_meat(donor)) + LAZYDISTINCTADD(., thing) /decl/butchery_data/proc/get_monetary_worth(mob/living/donor) . = 0 diff --git a/code/modules/butchery/butchery_hook.dm b/code/modules/butchery/butchery_hook.dm index a3739062094..1cfceb0020b 100644 --- a/code/modules/butchery/butchery_hook.dm +++ b/code/modules/butchery/butchery_hook.dm @@ -116,7 +116,7 @@ to_chat(user, SPAN_WARNING("You cannot butcher \the [target].")) /obj/structure/meat_hook/proc/suitable_for_butchery(var/mob/living/victim) - return istype(victim) && victim.butchery_data + return istype(victim) && victim.butchery_data && (victim.currently_has_skin() || victim.currently_has_innards() || victim.currently_has_bones() || victim.currently_has_meat()) /obj/structure/meat_hook/on_update_icon() ..() @@ -163,9 +163,9 @@ SetName(initial(name)) update_materials(TRUE) // reset name -/obj/structure/meat_hook/proc/set_carcass_state(var/_state) +/obj/structure/meat_hook/proc/set_carcass_state(var/_state, var/apply_damage = TRUE) occupant_state = _state - if(occupant) + if(occupant && apply_damage) occupant.take_damage(rand(50, 60)) if(occupant.stat != DEAD) occupant.death() @@ -198,13 +198,17 @@ switch(next_state) if(CARCASS_SKINNED) - butchery_data.harvest_skin(occupant) + if(occupant.currently_has_skin()) + butchery_data.harvest_skin(occupant) if(CARCASS_GUTTED) - butchery_data.harvest_innards(occupant) + if(occupant.currently_has_innards()) + butchery_data.harvest_innards(occupant) if(CARCASS_JOINTED) - butchery_data.harvest_bones(occupant) + if(occupant.currently_has_bones()) + butchery_data.harvest_bones(occupant) if(CARCASS_EMPTY) - butchery_data.harvest_meat(occupant) + if(occupant.currently_has_meat()) + butchery_data.harvest_meat(occupant) set_carcass_state(next_state) return TRUE @@ -218,17 +222,32 @@ return if(!busy) busy = TRUE - switch(occupant_state) - if(CARCASS_FRESH) - do_butchery_step(user, thing, CARCASS_SKINNED, "skinning") - if(CARCASS_SKINNED) - do_butchery_step(user, thing, CARCASS_GUTTED, "gutting") - if(CARCASS_GUTTED) - do_butchery_step(user, thing, CARCASS_JOINTED, "deboning") - if(CARCASS_JOINTED) - do_butchery_step(user, thing, CARCASS_EMPTY, "butchering") - busy = FALSE - return TRUE + + if(occupant_state == CARCASS_FRESH) + if(occupant.currently_has_skin()) + do_butchery_step(user, thing, CARCASS_SKINNED, "skinning") + else + set_carcass_state(CARCASS_SKINNED, apply_damage = FALSE) + if(occupant_state == CARCASS_SKINNED) + if(occupant.currently_has_innards()) + do_butchery_step(user, thing, CARCASS_GUTTED, "gutting") + else + set_carcass_state(CARCASS_GUTTED, apply_damage = FALSE) + if(occupant_state == CARCASS_GUTTED) + if(occupant.currently_has_bones()) + do_butchery_step(user, thing, CARCASS_JOINTED, "deboning") + else + set_carcass_state(CARCASS_JOINTED, apply_damage = FALSE) + if(occupant_state == CARCASS_JOINTED) + if(occupant.currently_has_meat()) + do_butchery_step(user, thing, CARCASS_EMPTY, "butchering") + else + set_carcass_state(CARCASS_EMPTY, apply_damage = FALSE) + + busy = FALSE + return TRUE + + #undef CARCASS_EMPTY #undef CARCASS_FRESH diff --git a/code/modules/mechs/equipment/combat.dm b/code/modules/mechs/equipment/combat.dm index 9a646515d03..207f2f4dfac 100644 --- a/code/modules/mechs/equipment/combat.dm +++ b/code/modules/mechs/equipment/combat.dm @@ -479,7 +479,7 @@ if(ishuman(O)) var/mob/living/carbon/human/H = O - flash_time = round(H.getFlashMod() * flash_time) + flash_time = round(H.get_flash_mod() * flash_time) if(flash_time <= 0) return @@ -525,7 +525,7 @@ if(ishuman(O)) var/mob/living/carbon/human/H = O - flash_time = round(H.getFlashMod() * flash_time) + flash_time = round(H.get_flash_mod() * flash_time) if(flash_time <= 0) return diff --git a/code/modules/mob/living/human/death.dm b/code/modules/mob/living/human/death.dm index 65b725089f0..5635331490a 100644 --- a/code/modules/mob/living/human/death.dm +++ b/code/modules/mob/living/human/death.dm @@ -21,22 +21,24 @@ return ..() /mob/living/carbon/human/death(gibbed) - . = ..() - if(.) - BITSET(hud_updateflag, HEALTH_HUD) - BITSET(hud_updateflag, STATUS_HUD) - BITSET(hud_updateflag, LIFE_HUD) - //Handle species-specific deaths. - callHook("death", list(src, gibbed)) - handle_hud_list() - if(!gibbed) - animate_tail_stop() - handle_organs() - if(species.death_sound) - playsound(loc, species.death_sound, 80, 1, 1) - if(SSticker.mode) - SSticker.mode.check_win() - species.handle_death(src) + if(!(. = ..())) + return + + BITSET(hud_updateflag, HEALTH_HUD) + BITSET(hud_updateflag, STATUS_HUD) + BITSET(hud_updateflag, LIFE_HUD) + + //Handle species-specific deaths. + callHook("death", list(src, gibbed)) + handle_hud_list() + if(!gibbed) + animate_tail_stop() + handle_organs() + if(species.death_sound) + playsound(loc, species.death_sound, 80, 1, 1) + if(SSticker.mode) + SSticker.mode.check_win() + species.handle_death(src) /mob/living/carbon/human/proc/is_husked() return (MUTATION_HUSK in mutations) diff --git a/code/modules/mob/living/human/human.dm b/code/modules/mob/living/human/human.dm index 67475d81068..ef37dce6f76 100644 --- a/code/modules/mob/living/human/human.dm +++ b/code/modules/mob/living/human/human.dm @@ -10,7 +10,7 @@ var/list/hud_list[10] var/embedded_flag //To check if we've need to roll for damage on movement while an item is imbedded in us. var/step_count - + /mob/living/carbon/human/Initialize(mapload, species_name, datum/dna/new_dna, decl/bodytype/new_bodytype) current_health = max_health @@ -312,14 +312,6 @@ flavor_texts[key] = msg set_flavor() -/mob/living/carbon/human/proc/get_darksight_range() - var/decl/bodytype/root_bodytype = get_bodytype() - if(root_bodytype.vision_organ) - var/obj/item/organ/internal/eyes/I = get_organ(root_bodytype.vision_organ, /obj/item/organ/internal/eyes) - if(istype(I)) - return I.get_darksight_range() - return root_bodytype.eye_darksight_range - /mob/living/carbon/human/abiotic(var/full_body = TRUE) if(full_body) for(var/slot in list(slot_head_str, slot_shoes_str, slot_w_uniform_str, slot_wear_suit_str, slot_glasses_str, slot_l_ear_str, slot_r_ear_str, slot_gloves_str)) @@ -366,7 +358,7 @@ /mob/living/carbon/human/proc/vomit(var/timevomit = 1, var/level = 3, var/deliberate = FALSE) - set waitfor = 0 + set waitfor = FALSE if(!check_has_mouth() || isSynthetic() || !timevomit || !level || stat == DEAD || lastpuke) return @@ -1046,7 +1038,7 @@ /mob/living/carbon/human/handle_flashed(var/obj/item/flash/flash, var/flash_strength) var/safety = eyecheck() if(safety < FLASH_PROTECTION_MODERATE) - flash_strength = round(getFlashMod() * flash_strength) + flash_strength = round(get_flash_mod() * flash_strength) if(safety > FLASH_PROTECTION_NONE) flash_strength = (flash_strength / 2) . = ..() @@ -1213,3 +1205,15 @@ ..() var/temp_inc = max(min(BODYTEMP_HEATING_MAX*(1-get_heat_protection()), exposed_temperature - bodytemperature), 0) bodytemperature += temp_inc + +/mob/living/carbon/human/currently_has_skin() + return currently_has_meat() + +/mob/living/carbon/human/currently_has_innards() + return length(get_internal_organs()) + +/mob/living/carbon/human/currently_has_meat() + for(var/obj/item/organ/external/limb in get_external_organs()) + if(istype(limb.material, /decl/material/solid/organic/meat)) + return TRUE + return FALSE diff --git a/code/modules/mob/living/human/human_damage.dm b/code/modules/mob/living/human/human_damage.dm index 0d9d781d1e6..93b3e48651c 100644 --- a/code/modules/mob/living/human/human_damage.dm +++ b/code/modules/mob/living/human/human_damage.dm @@ -1,8 +1,8 @@ /mob/living/carbon/human/get_life_damage_types() - var/static/list/life_damage_types = list( + var/static/list/brain_life_damage_types = list( BRAIN ) - return life_damage_types + return brain_life_damage_types //Updates the mob's health from organs and mob damage variables /mob/living/carbon/human/update_health() diff --git a/code/modules/mob/living/human/human_defense.dm b/code/modules/mob/living/human/human_defense.dm index 8011c3258a9..7f8b1edb5a1 100644 --- a/code/modules/mob/living/human/human_defense.dm +++ b/code/modules/mob/living/human/human_defense.dm @@ -471,21 +471,13 @@ meteor_act return TRUE /mob/living/carbon/human/flash_eyes(var/intensity = FLASH_PROTECTION_MODERATE, override_blindness_check = FALSE, affect_silicon = FALSE, visual = FALSE, type = /obj/screen/fullscreen/flash) - var/decl/bodytype/root_bodytype = get_bodytype() - if(root_bodytype.has_organ[root_bodytype.vision_organ]) - var/obj/item/organ/internal/eyes/I = get_organ(root_bodytype.vision_organ, /obj/item/organ/internal/eyes) + var/vision_organ_tag = get_vision_organ_tag() + if(vision_organ_tag) + var/obj/item/organ/internal/eyes/I = get_organ(vision_organ_tag, /obj/item/organ/internal/eyes) if(I) I.additional_flash_effects(intensity) return ..() -/mob/living/carbon/human/proc/getFlashMod() - var/decl/bodytype/root_bodytype = get_bodytype() - if(root_bodytype.vision_organ) - var/obj/item/organ/internal/eyes/I = get_organ(root_bodytype.vision_organ, /obj/item/organ/internal/eyes) - if(I) // get_organ with a type passed already does a typecheck - return I.get_flash_mod() - return root_bodytype.eye_flash_mod - /* Contians the proc to handle radiation. Specifically made to do radiation burns. diff --git a/code/modules/mob/living/human/human_helpers.dm b/code/modules/mob/living/human/human_helpers.dm index a1a6a17a2c7..23b77683afa 100644 --- a/code/modules/mob/living/human/human_helpers.dm +++ b/code/modules/mob/living/human/human_helpers.dm @@ -183,10 +183,10 @@ return istype(get_equipped_item(slot_l_ear_str), /obj/item/radio/headset) || istype(get_equipped_item(slot_r_ear_str), /obj/item/radio/headset) /mob/living/carbon/human/welding_eyecheck() - var/vision_organ = get_bodytype()?.vision_organ - if(!vision_organ) + var/vision_organ_tag = get_vision_organ_tag() + if(!vision_organ_tag) return - var/obj/item/organ/internal/eyes/E = get_organ(vision_organ, /obj/item/organ/internal/eyes) + var/obj/item/organ/internal/eyes/E = get_organ(vision_organ_tag, /obj/item/organ/internal/eyes) if(!E) return var/safety = eyecheck() diff --git a/code/modules/mob/living/human/human_organs.dm b/code/modules/mob/living/human/human_organs.dm index eacb41a06fe..bbd2bc8a03e 100644 --- a/code/modules/mob/living/human/human_organs.dm +++ b/code/modules/mob/living/human/human_organs.dm @@ -4,7 +4,7 @@ var/list/bad_external_organs /// organs grouped by category, largely used for stance calc var/list/organs_by_category - /// organs indexed by organ_tag + /// organs indexed by organ_tag var/list/organs_by_tag /// unassociated list of internal organs var/tmp/list/internal_organs @@ -151,6 +151,13 @@ if(E.need_process()) LAZYDISTINCTADD(bad_external_organs, E) +/mob/living/carbon/human/proc/check_vital_organ_missing() + return get_bodytype()?.check_vital_organ_missing(src) + +/mob/living/carbon/human/proc/process_internal_organs() + for(var/obj/item/organ/I in internal_organs) + I.Process() + // Takes care of organ related updates, such as broken and missing limbs /mob/living/carbon/human/proc/handle_organs() @@ -158,20 +165,18 @@ // Set a timer after this point, since we want a little bit of // wiggle room before the body dies for good (brain transplants). if(stat != DEAD) - var/decl/bodytype/root_bodytype = get_bodytype() - if(root_bodytype.check_vital_organ_missing(src)) + if(check_vital_organ_missing()) SET_STATUS_MAX(src, STAT_PARA, 5) if(vital_organ_missing_time) if(world.time >= vital_organ_missing_time) death() else - vital_organ_missing_time = world.time + root_bodytype.vital_organ_failure_death_delay + vital_organ_missing_time = world.time + max(get_bodytype()?.vital_organ_failure_death_delay, 5 SECONDS) else vital_organ_missing_time = null //processing internal organs is pretty cheap, do that first. - for(var/obj/item/organ/I in internal_organs) - I.Process() + process_internal_organs() var/force_process = should_recheck_bad_external_organs() diff --git a/code/modules/mob/living/human/life.dm b/code/modules/mob/living/human/life.dm index bbbdf936373..f1a8fa11fb9 100644 --- a/code/modules/mob/living/human/life.dm +++ b/code/modules/mob/living/human/life.dm @@ -120,11 +120,11 @@ //Vision var/obj/item/organ/vision - var/decl/bodytype/root_bodytype = get_bodytype() - if(root_bodytype.vision_organ) - vision = GET_INTERNAL_ORGAN(src, root_bodytype.vision_organ) + var/vision_organ_tag = get_vision_organ_tag() + if(vision_organ_tag) + vision = GET_INTERNAL_ORGAN(src, vision_organ_tag) - if(!root_bodytype.vision_organ) // Presumably if a species has no vision organs, they see via some other means. + if(!vision_organ_tag) // Presumably if a species has no vision organs, they see via some other means. set_status(STAT_BLIND, 0) set_status(STAT_BLURRY, 0) else if(!vision || (vision && !vision.is_usable())) // Vision organs cut out or broken? Permablind. diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 809ed917843..bf719e9aaad 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -837,12 +837,20 @@ default behaviour is: /mob/living/proc/handle_additional_vomit_reagents(var/obj/effect/decal/cleanable/vomit/vomit) vomit.add_to_reagents(/decl/material/liquid/acid/stomach, 5) +/mob/living/proc/get_flash_mod() + var/vision_organ_tag = get_vision_organ_tag() + if(vision_organ_tag) + var/obj/item/organ/internal/eyes/I = get_organ(vision_organ_tag, /obj/item/organ/internal/eyes) + if(I) // get_organ with a type passed already does a typecheck + return I.get_flash_mod() + return get_bodytype()?.eye_flash_mod + /mob/living/proc/eyecheck() var/total_protection = flash_protection if(should_have_organ(BP_EYES)) - var/decl/bodytype/root_bodytype = get_bodytype() - if(root_bodytype.has_organ[root_bodytype.vision_organ]) - var/obj/item/organ/internal/eyes/I = get_organ(root_bodytype.vision_organ, /obj/item/organ/internal/eyes) + var/vision_organ_tag = get_vision_organ_tag() + if(vision_organ_tag && get_bodytype()?.has_organ[vision_organ_tag]) + var/obj/item/organ/internal/eyes/I = get_organ(vision_organ_tag, /obj/item/organ/internal/eyes) if(!I?.is_usable()) return FLASH_PROTECTION_MAJOR total_protection = I.get_total_protection(flash_protection) @@ -1198,7 +1206,7 @@ default behaviour is: var/how_open = round(E.how_open()) if(how_open <= 0) continue - var/surgery_icon = E.species.get_surgery_overlay_icon(src) + var/surgery_icon = E.get_surgery_overlay_icon() if(!surgery_icon) continue if(!total) @@ -1633,3 +1641,14 @@ default behaviour is: for(var/obj/item/organ/organ in stat_organs) var/list/organ_info = organ.get_stat_info() stat(organ_info[1], organ_info[2]) + +/mob/living/proc/get_vision_organ_tag() + return get_bodytype()?.vision_organ + +/mob/living/proc/get_darksight_range() + var/vision_organ_tag = get_vision_organ_tag() + if(vision_organ_tag) + var/obj/item/organ/internal/eyes/I = get_organ(vision_organ_tag, /obj/item/organ/internal/eyes) + if(istype(I)) + return I.get_darksight_range() + return get_bodytype()?.eye_darksight_range diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm index 2635abf4cd5..34c96aa98c6 100644 --- a/code/modules/mob/living/silicon/silicon.dm +++ b/code/modules/mob/living/silicon/silicon.dm @@ -456,12 +456,6 @@ adjustBruteLoss(5, do_update_health = FALSE) adjustFireLoss(10) -/mob/living/silicon/get_death_message(gibbed) - return "gives one shrill beep before falling lifeless." - -/mob/living/silicon/get_self_death_message(gibbed) - return "You have suffered a critical system failure, and are dead." - /mob/living/silicon/get_available_postures() var/static/list/available_postures = list( /decl/posture/standing diff --git a/code/modules/organs/external/_external.dm b/code/modules/organs/external/_external.dm index 09cd55986e1..8d96d8b60bf 100644 --- a/code/modules/organs/external/_external.dm +++ b/code/modules/organs/external/_external.dm @@ -629,9 +629,15 @@ This function completely restores a damaged organ to perfect condition. if(!owner || damage <= 0) return - if(BP_IS_CRYSTAL(src) && (damage >= 15 || prob(1))) + if(BP_IS_CRYSTAL(src)) type = SHATTER - playsound(loc, 'sound/effects/hit_on_shattered_glass.ogg', 40, 1) // Crash! + if(damage >= 15 || prob(1)) + playsound(loc, 'sound/effects/hit_on_shattered_glass.ogg', 40, 1) // Crash! + else if((limb_flags & ORGAN_FLAG_SKELETAL) || (BP_IS_PROSTHETIC(src) && !bodytype.is_robotic)) + if(type == BURN) + type = CHARRED + else + type = SHATTER //moved these before the open_wound check so that having many small wounds for example doesn't somehow protect you from taking internal damage (because of the return) //Brute damage can possibly trigger an internal wound, too. @@ -713,7 +719,7 @@ This function completely restores a damaged organ to perfect condition. if(length(ailments)) return TRUE - if(status & (ORGAN_CUT_AWAY|ORGAN_BLEEDING|ORGAN_BROKEN|ORGAN_DEAD|ORGAN_MUTATED|ORGAN_DISLOCATED)) + if(status & (ORGAN_CUT_AWAY|ORGAN_BLEEDING|ORGAN_BROKEN|ORGAN_MUTATED|ORGAN_DISLOCATED|ORGAN_DEAD)) return TRUE if((brute_dam || burn_dam) && !BP_IS_PROSTHETIC(src)) //Robot limbs don't autoheal and thus don't need to process when damaged @@ -1437,7 +1443,7 @@ Note that amputating the affected organ does in fact remove the infection from t /obj/item/organ/external/proc/get_incision(var/strict) var/datum/wound/incision - if(BP_IS_CRYSTAL(src)) + if(BP_IS_CRYSTAL(src) || (limb_flags & ORGAN_FLAG_SKELETAL)) for(var/datum/wound/shatter/other in wounds) if(!incision || incision.damage < other.damage) incision = other @@ -1600,3 +1606,19 @@ Note that amputating the affected organ does in fact remove the infection from t var/default_results = bodytype.get_default_grooming_results(src, tool) if(default_results) . = default_results + +/obj/item/organ/external/proc/skeletonize(mob/living/donor) + if(limb_flags & ORGAN_FLAG_SKELETAL) + return + if(!donor) + if(!owner) + return + donor = owner + var/decl/butchery_data/butchery_data = GET_DECL(donor.butchery_data) + if(!butchery_data?.bone_material) + return + material = GET_DECL(butchery_data?.bone_material) + limb_flags |= ORGAN_FLAG_SKELETAL + status |= (ORGAN_DEAD|ORGAN_BRITTLE) + _sprite_accessories = null + update_icon() diff --git a/code/modules/organs/external/_external_damage.dm b/code/modules/organs/external/_external_damage.dm index 3d08950e120..59136820d93 100644 --- a/code/modules/organs/external/_external_damage.dm +++ b/code/modules/organs/external/_external_damage.dm @@ -307,13 +307,13 @@ /obj/item/organ/external/proc/sever_artery() var/obj/item/organ/internal/heart/heart_path = bodytype?.has_organ[BP_HEART] if(heart_path) - if(!BP_IS_PROSTHETIC(src) && !(status & ORGAN_ARTERY_CUT) && !initial(heart_path.open)) + if(!BP_IS_PROSTHETIC(src) && !(limb_flags & ORGAN_FLAG_SKELETAL) && !(status & ORGAN_ARTERY_CUT) && !initial(heart_path.open)) status |= ORGAN_ARTERY_CUT return TRUE return FALSE /obj/item/organ/external/proc/sever_tendon() - if((limb_flags & ORGAN_FLAG_HAS_TENDON) && !BP_IS_PROSTHETIC(src) && !(status & ORGAN_TENDON_CUT)) + if((limb_flags & ORGAN_FLAG_HAS_TENDON) && !BP_IS_PROSTHETIC(src) && !(limb_flags & ORGAN_FLAG_SKELETAL) && !(status & ORGAN_TENDON_CUT)) status |= ORGAN_TENDON_CUT return TRUE return FALSE diff --git a/code/modules/organs/external/_external_icons.dm b/code/modules/organs/external/_external_icons.dm index 687e4e12738..d875849e473 100644 --- a/code/modules/organs/external/_external_icons.dm +++ b/code/modules/organs/external/_external_icons.dm @@ -18,6 +18,13 @@ var/global/list/limb_icon_cache = list() update_icon() compile_overlays() +/obj/item/organ/external/proc/get_surgery_overlay_icon() + if(limb_flags & ORGAN_FLAG_SKELETAL) + return null + if(BP_IS_PROSTHETIC(src)) + return null + return species?.get_surgery_overlay_icon(owner) + /obj/item/organ/external/proc/sync_colour_to_human(var/mob/living/carbon/human/human) _icon_cache_key = null skin_tone = null @@ -53,10 +60,10 @@ var/global/list/limb_icon_cache = list() /obj/item/organ/external/proc/update_limb_icon_file() if(!bodytype) // This should not happen. icon = initial(icon) + else if(limb_flags & ORGAN_FLAG_SKELETAL) + icon = bodytype.get_skeletal_icon(owner) else if(!BP_IS_PROSTHETIC(src) && (status & ORGAN_MUTATED)) icon = bodytype.get_base_icon(owner, get_deform = TRUE) - else if(owner && (limb_flags & ORGAN_FLAG_SKELETAL)) - icon = bodytype.get_skeletal_icon(owner) else icon = bodytype.get_base_icon(owner) @@ -65,14 +72,20 @@ var/global/list/organ_icon_cache = list() // Generate base icon with colour and tone. var/icon/ret = bodytype.apply_limb_colouration(src, new /icon(icon, icon_state)) - if(status & ORGAN_DEAD) + if(limb_flags & ORGAN_FLAG_SKELETAL) + global.organ_icon_cache[_icon_cache_key] = ret + return ret + + if((status & ORGAN_DEAD)) ret.ColorTone(rgb(10,50,0)) ret.SetIntensity(0.7) + if(skin_tone) if(skin_tone >= 0) ret.Blend(rgb(skin_tone, skin_tone, skin_tone), ICON_ADD) else ret.Blend(rgb(-skin_tone, -skin_tone, -skin_tone), ICON_SUBTRACT) + if((bodytype.appearance_flags & HAS_SKIN_COLOR) && skin_colour) ret.Blend(skin_colour, skin_blend) @@ -108,7 +121,14 @@ var/global/list/organ_icon_cache = list() LAZYADD(., accessory_image) /obj/item/organ/external/proc/get_icon_cache_key_components() + . = list("[icon_state]_[species.name]_[bodytype?.name || "BAD_BODYTYPE"]_[render_alpha]_[icon]") + + // Skeletons don't care about most icon appearance stuff. + if(limb_flags & ORGAN_FLAG_SKELETAL) + . += "_skeletal_[skin_blend]" + return + if(status & ORGAN_DEAD) . += "_dead" . += "_tone_[skin_tone]_color_[skin_colour]_[skin_blend]" diff --git a/code/modules/organs/external/diagnostics.dm b/code/modules/organs/external/diagnostics.dm index fd7ace688cc..1b74273117b 100644 --- a/code/modules/organs/external/diagnostics.dm +++ b/code/modules/organs/external/diagnostics.dm @@ -90,6 +90,8 @@ . += "Splinted" if(status & ORGAN_BLEEDING) . += "Bleeding" + if(limb_flags & ORGAN_FLAG_SKELETAL) + . += "Skeletal" if(status & ORGAN_BROKEN) . += capitalize(broken_description) if (LAZYLEN(implants)) diff --git a/code/modules/organs/external/head.dm b/code/modules/organs/external/head.dm index 876eb22f3d6..dcb72b43f69 100644 --- a/code/modules/organs/external/head.dm +++ b/code/modules/organs/external/head.dm @@ -93,7 +93,7 @@ /obj/item/organ/external/head/proc/get_eyes_organ() RETURN_TYPE(/obj/item/organ/internal/eyes) if(owner) - return owner.get_organ((owner.get_bodytype().vision_organ || BP_EYES), /obj/item/organ/internal/eyes) + return owner.get_organ((owner.get_vision_organ_tag() || BP_EYES), /obj/item/organ/internal/eyes) return locate(/obj/item/organ/internal/eyes) in contents /obj/item/organ/external/head/get_icon_cache_key_components() diff --git a/code/modules/organs/external/wounds/wound_types.dm b/code/modules/organs/external/wounds/wound_types.dm index 0508751aa12..a60663462b7 100644 --- a/code/modules/organs/external/wounds/wound_types.dm +++ b/code/modules/organs/external/wounds/wound_types.dm @@ -57,6 +57,18 @@ return /datum/wound/shatter/cracked if(0 to 15) return /datum/wound/shatter/chipped + if(CHARRED) + switch(damage) + if(50 to INFINITY) + return /datum/wound/charred/charcoal + if(40 to 50) + return /datum/wound/charred/charred + if(30 to 40) + return /datum/wound/charred/burned + if(15 to 30) + return /datum/wound/charred/seared + if(0 to 15) + return /datum/wound/charred/singed return null //no wound @@ -345,3 +357,18 @@ /datum/wound/shatter/chipped stages = list("chip" = 0) + +/datum/wound/charred/charcoal + stages = list("crumbling charred area" = 0) + +/datum/wound/charred/charred + stages = list("charred area" = 0) + +/datum/wound/charred/burned + stages = list("burned area" = 0) + +/datum/wound/charred/seared + stages = list("lightly seared area" = 0) + +/datum/wound/charred/singed + stages = list("singed area" = 0) diff --git a/code/modules/organs/internal/liver.dm b/code/modules/organs/internal/liver.dm index 9df1702671c..bc782095676 100644 --- a/code/modules/organs/internal/liver.dm +++ b/code/modules/organs/internal/liver.dm @@ -23,12 +23,10 @@ if(!owner) return - if (germ_level > INFECTION_LEVEL_ONE) - if(prob(1)) - to_chat(owner, "Your skin itches.") - if (germ_level > INFECTION_LEVEL_TWO) - if(prob(1)) - spawn owner.vomit() + if (germ_level > INFECTION_LEVEL_ONE && prob(1)) + to_chat(owner, SPAN_DANGER("Your skin itches.")) + if (germ_level > INFECTION_LEVEL_TWO && prob(1)) + owner.vomit() //Detox can heal small amounts of damage if (damage < max_damage && !GET_CHEMICAL_EFFECT(owner, CE_TOXIN)) diff --git a/code/modules/organs/organ.dm b/code/modules/organs/organ.dm index 14f2729490c..2a96a9b1049 100644 --- a/code/modules/organs/organ.dm +++ b/code/modules/organs/organ.dm @@ -412,10 +412,10 @@ return yum /obj/item/organ/proc/can_feel_pain() - return bodytype && !(bodytype.body_flags & BODY_FLAG_NO_PAIN) + return bodytype && !(bodytype.body_flags & BODY_FLAG_NO_PAIN) && !(status & ORGAN_DEAD) /obj/item/organ/proc/is_usable() - return !(status & (ORGAN_CUT_AWAY|ORGAN_MUTATED|ORGAN_DEAD)) + . = !(status & (ORGAN_CUT_AWAY|ORGAN_MUTATED|ORGAN_DEAD)) /obj/item/organ/proc/can_recover() return (max_damage > 0) && !(status & ORGAN_DEAD) || death_time >= REALTIMEOFDAY - ORGAN_RECOVERY_THRESHOLD @@ -437,7 +437,6 @@ . += tag ? "Necrotic" : "Necrotic" if(BP_IS_BRITTLE(src)) . += tag ? "Brittle" : "Brittle" - switch (germ_level) if (INFECTION_LEVEL_ONE to INFECTION_LEVEL_ONE + ((INFECTION_LEVEL_TWO - INFECTION_LEVEL_ONE) / 3)) . += "Mild Infection" diff --git a/icons/mob/human_races/species/human/skeleton.dmi b/icons/mob/human_races/species/human/skeleton.dmi index 1cedb1196f0def731b7f8fbdb9e23e34b5e1c76a..271b174b81283114e9f730201430c8444d2eb936 100644 GIT binary patch delta 1009 zcmVS;iiBL{Q4GJ0x0000DNk~Le0002s0002s1Oos70O$jE(vcw=f55=N zl#**x5XaE~0004WQchCV=-0C=2JR&a84_w-Y6 z@%7{?OD!tS%+FJ>RWQ*r;NmRLOex6#a*U0*I5Sc+(=$pSoZ^zil2jm5sVF|NC|8M# zGbOXA7^I1dGp#5wHxJS zGxG?lO3p|vCTvzlY9dbOD=WDAxqxF8020WCCRLB0=Kuf#=}AOERCt{2oLiEcFc3wJ z!~%fv0)%i?evLE>pomv6DQ_hE|43>oHCDHpR}d;EzURv=n!d<@r(2IXf1LmT;6J4n z+KOt*kO^I+cp*v**My(B$92wMil?VS%a>tTh+@`Xj2A{QqF~Uh91lM0FUAWR3oSXE z^rIV!dq_R}@|WWUJ&eNr3GnDf!S9*W!!Lh1o(awtzaY|Vn4owM75_k3e$D{^00000 zcmY;afQbd$+=6m}aUh+^e=K;-EU0tWQ#$)S1czfLjjboI3^7a^D-isbLR`pOayINR zf2P?x75TGx64j(32@bRR6HOE|X{->8{8!w=+=2xed+PaN&AuTf82Ph!&mdS5hxd(w zkw1$k37XJ~#*`NXFHyYgDGUGr0001`=)`6njC-_(o?#dK7X+P{e{uCeF4#~HB~9eJ zICq>tb%WI01+(XkA&0~i?Yq=%nK5OaMwxr}-THCWEkNlp9i3~^`^FC*7%qpB|1#??A?4SK!K z+jYVrf^{ry?*`!2QE`3uyZ)o=6L`I64!t7qf|T|$YbR&)ZkV%^(|!Cf#P;6Eo{1PQ zb|AK;c5>AHgV<$rK2$G$Xl}QKGx&ZAzT76-mSwh`&+%V=-0C=2@(mM*nFbsg< z**=9y_R`ndr6iOL%@vHn@&ghJWYJ!~Njh{Y(I&y?-(cLDd;b_l(>(|M0;(B{xtZ(X zsMR}rPRnvRYn33!#NVZ|V_3$9f2^aq(aLA4>mjWIxf#~^^iz{ak)0q4S`tMzx#9&e z5hEKASx^(PNSKRE*&uZLuggdk#cu!J1kMX`8~a;pO+R+q$NK>Cv9*Mk)!3*200RF> zL_t(|ob8-ZlAACLhHb+EfXx96WcnOn55UlzU^}@$?|+DPw%ua=R!kEof8C_>e@~Gu z$-V%4B4*{spfWsdGf0%(nACwS62qAYFAN~k2Y-JPfDfhUoy$f5`zQc>$+H;%A%qY@e+c3D$+Zc7q5Zgb+dqA%qY@2qEP0am%{DS$0d*-HUG?rQ~A$ zpZ?_jE86>Of+U0xe?kZ$cVsFG@y@?-aFoY@rQ$C)wKwA^ix|3BST(k-5KSYG`pC66 z1sq&alyHzm4K)Fstf9!YH|B6i%QZyYf`eT9ZR(_We|tg*A%qaJ1%8i+pBF~Qp!wU5 zKefGBh2k>Z)UZe`ZoDY03i*v`T|yag1IzRSlHC46=J zub+W#gwzZR-pB1jFE66nRaHthc*LX8EBdd-!f}HZ&nO&l1|U1m2LJacNA>Q|ke%P> zlAYh@lAqt_a{v537v}eb5JDcDvfC$RvvhN^KbK`1=agJd(_Z#ZqCcDd?VA_!Gzr;F z)AvyR0{z)6Yx`~%awlcmjdBM1?zV}6JG}|HY<5!NxIcyBX*u3>{P-a}!T_a}Gf>Uo zAveF@vfqOFJ@b3!_s^f-6G8|fggiaW@0s8K2l;(2x%oXIgb+dqA Date: Wed, 19 Jun 2024 00:41:09 +0000 Subject: [PATCH 58/90] Automatic changelog generation [ci skip] --- html/changelog.html | 6 ++++++ html/changelogs/.all_changelog.yml | 5 +++++ html/changelogs/AutoChangeLog-pr-3730.yml | 6 ------ 3 files changed, 11 insertions(+), 6 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-3730.yml diff --git a/html/changelog.html b/html/changelog.html index 080d60a6ce2..b88c73c2662 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -52,6 +52,12 @@ -->
+

19 June 2024

+

Penelope Haze updated:

+
    +
  • Ammo magazines will not initialize their contents until first interacted with, which makes startup faster but could cause bugs. Report any issues on the issue tracker!
  • +
+

16 June 2024

Penelope Haze updated:

    diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index 5bfcbb5f909..00c595c8515 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -14766,3 +14766,8 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. 2024-06-16: Penelope Haze: - tweak: Meteor is now a votable mode on Exodus. Oh no!! +2024-06-19: + Penelope Haze: + - experiment: Ammo magazines will not initialize their contents until first interacted + with, which makes startup faster but could cause bugs. Report any issues on + the issue tracker! diff --git a/html/changelogs/AutoChangeLog-pr-3730.yml b/html/changelogs/AutoChangeLog-pr-3730.yml deleted file mode 100644 index 5f7a8b506a5..00000000000 --- a/html/changelogs/AutoChangeLog-pr-3730.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: Penelope Haze -changes: - - {experiment: 'Ammo magazines will not initialize their contents until first interacted - with, which makes startup faster but could cause bugs. Report any issues on - the issue tracker!'} -delete-after: true From 6297725a7dc7206bb8bf21efa279540a5b6e4c20 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Wed, 19 Jun 2024 14:14:49 -0400 Subject: [PATCH 59/90] Make diagonal movement on by default --- code/datums/config/config_types/config_game_option.dm | 4 ++-- code/modules/keybindings/bindings_atom.dm | 2 +- code/modules/keybindings/bindings_client.dm | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/code/datums/config/config_types/config_game_option.dm b/code/datums/config/config_types/config_game_option.dm index 1b53d5733f0..d6bc64033e7 100644 --- a/code/datums/config/config_types/config_game_option.dm +++ b/code/datums/config/config_types/config_game_option.dm @@ -21,7 +21,7 @@ /decl/config/num/default_darksight_effectiveness, /decl/config/toggle/grant_default_darksight, /decl/config/num/expected_round_length, - /decl/config/toggle/allow_diagonal_movement, + /decl/config/toggle/on/allow_diagonal_movement, /decl/config/toggle/expanded_alt_interactions, /decl/config/toggle/ert_admin_call_only, /decl/config/toggle/ghosts_can_possess_animals, @@ -134,7 +134,7 @@ uid = "grant_default_darksight" desc = "Whether or not all human mobs have very basic darksight by default." -/decl/config/toggle/allow_diagonal_movement +/decl/config/toggle/on/allow_diagonal_movement uid = "allow_diagonal_movement" desc = "Allow multiple input keys to be pressed for diagonal movement." diff --git a/code/modules/keybindings/bindings_atom.dm b/code/modules/keybindings/bindings_atom.dm index 6fe32e00f0e..aaed1a9fbe1 100644 --- a/code/modules/keybindings/bindings_atom.dm +++ b/code/modules/keybindings/bindings_atom.dm @@ -15,7 +15,7 @@ if((movement_dir & EAST) && (movement_dir & WEST)) movement_dir &= ~(EAST|WEST) - if(!get_config_value(/decl/config/toggle/allow_diagonal_movement)) + if(!get_config_value(/decl/config/toggle/on/allow_diagonal_movement)) if(movement_dir & user.last_move_dir_pressed) movement_dir = user.last_move_dir_pressed else diff --git a/code/modules/keybindings/bindings_client.dm b/code/modules/keybindings/bindings_client.dm index fb56abe3346..cafe738137b 100644 --- a/code/modules/keybindings/bindings_client.dm +++ b/code/modules/keybindings/bindings_client.dm @@ -37,7 +37,7 @@ if(!(next_move_dir_sub & movement)) next_move_dir_add |= movement - if(movement && !get_config_value(/decl/config/toggle/allow_diagonal_movement)) + if(movement && !get_config_value(/decl/config/toggle/on/allow_diagonal_movement)) last_move_dir_pressed = movement // Client-level keybindings are ones anyone should be able to do at any time From febc7d687046e8c199d57d898b0ebdd1547ab91a Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Tue, 18 Jun 2024 21:10:51 -0400 Subject: [PATCH 60/90] Remove unnecessary uses of unsafe var access operator --- code/_global_vars/lists/objects.dm | 1 - code/datums/mind/mind.dm | 8 ++-- code/game/machinery/computer/shuttle.dm | 44 ++++++++++--------- code/game/machinery/doors/_door.dm | 7 +-- code/game/machinery/doors/blast_door.dm | 3 +- code/game/objects/effects/mines.dm | 24 +++++----- .../objects/items/devices/transfer_valve.dm | 4 +- code/game/world_topic_commands.dm | 2 +- code/modules/admin/dbban/functions.dm | 18 ++++---- code/modules/admin/verbs/adminjump.dm | 8 ++-- 10 files changed, 63 insertions(+), 56 deletions(-) diff --git a/code/_global_vars/lists/objects.dm b/code/_global_vars/lists/objects.dm index c050b547abf..f6e27d7c419 100644 --- a/code/_global_vars/lists/objects.dm +++ b/code/_global_vars/lists/objects.dm @@ -5,7 +5,6 @@ var/global/list/hud_icon_reference = list() var/global/list/listening_objects = list() // List of objects that need to be able to hear, used to avoid recursive searching through contents. var/global/list/global_map = list() -var/global/host = null //only here until check @ code\modules\ghosttrap\trap.dm:112 is fixed var/global/datum/universal_state/universe = new /// Vowels. diff --git a/code/datums/mind/mind.dm b/code/datums/mind/mind.dm index b101e15f6c5..4879ee82481 100644 --- a/code/datums/mind/mind.dm +++ b/code/datums/mind/mind.dm @@ -302,8 +302,8 @@ var/mob/def_target = null var/objective_list[] = list(/datum/objective/assassinate, /datum/objective/protect, /datum/objective/debrain) - if (objective&&(objective.type in objective_list) && objective:target) - def_target = objective.target?.current + if (objective?.target && (objective.type in objective_list)) + def_target = objective.target.current var/new_target = input("Select target:", "Objective target", def_target) as null|anything in possible_targets if (!new_target) return @@ -313,12 +313,12 @@ if (!istype(M) || !M.mind || new_target == "Free objective") new_objective = new objective_path new_objective.owner = src - new_objective:target = null + new_objective.target = null new_objective.explanation_text = "Free objective" else new_objective = new objective_path new_objective.owner = src - new_objective:target = M.mind + new_objective.target = M.mind new_objective.explanation_text = "[objective_type] [M.real_name], the [M.mind.get_special_role_name(M.mind.assigned_role)]." if ("hijack") diff --git a/code/game/machinery/computer/shuttle.dm b/code/game/machinery/computer/shuttle.dm index 5ca01aa22df..f43c392a16c 100644 --- a/code/game/machinery/computer/shuttle.dm +++ b/code/game/machinery/computer/shuttle.dm @@ -9,44 +9,46 @@ var/list/authorized = list( ) -/obj/machinery/computer/shuttle/attackby(var/obj/item/card/W as obj, var/mob/user as mob) +/obj/machinery/computer/shuttle/attackby(var/obj/item/card as obj, var/mob/user as mob) if(stat & (BROKEN|NOPOWER)) return var/datum/evacuation_controller/shuttle/evac_control = SSevac.evacuation_controller if(!istype(evac_control)) - to_chat(user, "This console should not in use on this map. Please report this to a developer.") + to_chat(user, "This console should not be in use on this map. Please report this to a developer.") return - if ((!( istype(W, /obj/item/card) ) || evac_control.has_evacuated() || !( user ))) + if(!istype(card, /obj/item/card)) // don't try to get an ID card if we're an emag + card = card.GetIdCard() // handles stored IDs in modcomps and similar + + if ((!istype(card, /obj/item/card) || evac_control.has_evacuated() || !user)) return - if (istype(W, /obj/item/card/id)||istype(W, /obj/item/modular_computer)) - if (istype(W, /obj/item/modular_computer)) - W = W.GetIdCard() - if (!W:access) //no access - to_chat(user, "The access level of [W:registered_name]\'s card is not high enough.") + if (istype(card, /obj/item/card/id)) + var/obj/item/card/id/id_card = card + if (!id_card.access) //no access + to_chat(user, "The access level of [id_card.registered_name]\'s card is not high enough.") return - var/list/cardaccess = W:access + var/list/cardaccess = id_card.access if(!istype(cardaccess, /list) || !cardaccess.len) //no access - to_chat(user, "The access level of [W:registered_name]\'s card is not high enough.") + to_chat(user, "The access level of [id_card.registered_name]\'s card is not high enough.") return - if(!(access_bridge in W:access)) //doesn't have this access - to_chat(user, "The access level of [W:registered_name]\'s card is not high enough.") + if(!(access_bridge in id_card.access)) //doesn't have this access + to_chat(user, "The access level of [id_card.registered_name]\'s card is not high enough.") return 0 - var/choice = alert(user, text("Would you like to (un)authorize a shortened launch time? [] authorization\s are still needed. Use abort to cancel all authorizations.", src.auth_need - src.authorized.len), "Shuttle Launch", "Authorize", "Repeal", "Abort") - if(evac_control.is_prepared() && user.get_active_held_item() != W) + var/choice = alert(user, "Would you like to (un)authorize a shortened launch time? [auth_need - authorized.len] authorization\s are still needed. Use abort to cancel all authorizations.", "Shuttle Launch", "Authorize", "Repeal", "Abort") + if(evac_control.is_prepared() && user.get_active_held_item() != card) return 0 switch(choice) if("Authorize") - src.authorized -= W:registered_name - src.authorized += W:registered_name + src.authorized -= id_card.registered_name + src.authorized += id_card.registered_name if (src.auth_need - src.authorized.len > 0) message_admins("[key_name_admin(user)] has authorized early shuttle launch") log_game("[user.ckey] has authorized early shuttle launch") - to_world(text("Alert: [] authorizations needed until shuttle is launched early", src.auth_need - src.authorized.len)) + to_world("Alert: [auth_need - authorized.len] authorizations needed until shuttle is launched early") else message_admins("[key_name_admin(user)] has launched the shuttle") log_game("[user.ckey] has launched the shuttle early") @@ -57,18 +59,18 @@ src.authorized = list( ) if("Repeal") - src.authorized -= W:registered_name - to_world(text("Alert: [] authorizations needed until shuttle is launched early", src.auth_need - src.authorized.len)) + src.authorized -= id_card.registered_name + to_world("Alert: [auth_need - authorized.len] authorizations needed until shuttle is launched early") if("Abort") to_world("All authorizations to shortening time for shuttle launch have been revoked!") src.authorized.len = 0 src.authorized = list( ) - else if (istype(W, /obj/item/card/emag) && !emagged) + else if (istype(card, /obj/item/card/emag) && !emagged) var/choice = alert(user, "Would you like to launch the shuttle?","Shuttle control", "Launch", "Cancel") - if(!emagged && !evac_control.is_prepared() && user.get_active_held_item() == W) + if(!emagged && !evac_control.is_prepared() && user.get_active_held_item() == card) switch(choice) if("Launch") to_world("Alert: Shuttle launch time shortened to 10 seconds!") diff --git a/code/game/machinery/doors/_door.dm b/code/game/machinery/doors/_door.dm index 53f580f385b..d95ef079a46 100644 --- a/code/game/machinery/doors/_door.dm +++ b/code/game/machinery/doors/_door.dm @@ -234,12 +234,13 @@ /obj/machinery/door/hitby(var/atom/movable/AM, var/datum/thrownthing/TT) . = ..() if(.) - visible_message("[src.name] was hit by [AM].") + visible_message(SPAN_DANGER("\The [src] was hit by \the [AM].")) var/tforce = 0 if(ismob(AM)) tforce = 3 * TT.speed - else - tforce = AM:throwforce * (TT.speed/THROWFORCE_SPEED_DIVISOR) + else if(isobj(AM)) + var/obj/hitter_obj = AM + tforce = hitter_obj.throwforce * (TT.speed/THROWFORCE_SPEED_DIVISOR) playsound(src.loc, hitsound, 100, 1) take_damage(tforce) diff --git a/code/game/machinery/doors/blast_door.dm b/code/game/machinery/doors/blast_door.dm index 1bd45784750..e7ce3e4b90c 100644 --- a/code/game/machinery/doors/blast_door.dm +++ b/code/game/machinery/doors/blast_door.dm @@ -147,7 +147,8 @@ /obj/machinery/door/blast/attackby(obj/item/C, mob/user) add_fingerprint(user, 0, C) if(!panel_open) //Do this here so the door won't change state while prying out the circuit - if(IS_CROWBAR(C) || (istype(C, /obj/item/twohanded/fireaxe) && C:wielded == 1)) + var/obj/item/twohanded/zweihander = C + if(IS_CROWBAR(C) || (istype(C, /obj/item/twohanded/fireaxe) && zweihander.wielded)) if(((stat & NOPOWER) || (stat & BROKEN)) && !( operating )) to_chat(user, "You begin prying at \the [src]...") if(do_after(user, 2 SECONDS, src)) diff --git a/code/game/objects/effects/mines.dm b/code/game/objects/effects/mines.dm index 03010895f28..a73f85c5ce5 100644 --- a/code/game/objects/effects/mines.dm +++ b/code/game/objects/effects/mines.dm @@ -6,7 +6,7 @@ layer = OBJ_LAYER icon = 'icons/obj/items/weapon/landmine.dmi' icon_state = "uglymine" - var/triggerproc = "explode" //name of the proc thats called when the mine is triggered + var/triggerproc = PROC_REF(explode) // the proc that's called when the mine is triggered var/triggered = 0 /obj/effect/mine/Initialize() @@ -28,9 +28,11 @@ /obj/effect/mine/proc/triggerrad(obj) spark_at(src, cardinal_only = TRUE) - obj:radiation += 50 - randmutb(obj) - domutcheck(obj,null) + if(ismob(obj)) + var/mob/victim = obj + victim.radiation += 50 + randmutb(victim) + domutcheck(victim, null) spawn(0) qdel(src) @@ -64,7 +66,9 @@ /obj/effect/mine/proc/triggerkick(obj) spark_at(src, cardinal_only = TRUE) - qdel(obj:client) + if(ismob(obj)) + var/mob/victim = obj + qdel(victim.client) spawn(0) qdel(src) @@ -76,24 +80,24 @@ /obj/effect/mine/dnascramble name = "Radiation Mine" icon_state = "uglymine" - triggerproc = "triggerrad" + triggerproc = PROC_REF(triggerrad) /obj/effect/mine/flame name = "Incendiary Mine" icon_state = "uglymine" - triggerproc = "triggerflame" + triggerproc = PROC_REF(triggerflame) /obj/effect/mine/kick name = "Kick Mine" icon_state = "uglymine" - triggerproc = "triggerkick" + triggerproc = PROC_REF(triggerkick) /obj/effect/mine/n2o name = "N2O Mine" icon_state = "uglymine" - triggerproc = "triggern2o" + triggerproc = PROC_REF(triggern2o) /obj/effect/mine/stun name = "Stun Mine" icon_state = "uglymine" - triggerproc = "triggerstun" + triggerproc = PROC_REF(triggerstun) diff --git a/code/game/objects/items/devices/transfer_valve.dm b/code/game/objects/items/devices/transfer_valve.dm index 66d1cfed471..f7a9d2432fe 100644 --- a/code/game/objects/items/devices/transfer_valve.dm +++ b/code/game/objects/items/devices/transfer_valve.dm @@ -6,7 +6,7 @@ material = /decl/material/solid/metal/stainlesssteel var/obj/item/tank/tank_one var/obj/item/tank/tank_two - var/obj/item/attached_device + var/obj/item/assembly/attached_device var/mob/attacher = null var/valve_open = 0 var/toggle = 1 @@ -110,7 +110,7 @@ else if(attached_device) if(href_list["rem_device"]) attached_device.dropInto(loc) - attached_device:holder = null + attached_device.holder = null attached_device = null update_icon() if(href_list["device"]) diff --git a/code/game/world_topic_commands.dm b/code/game/world_topic_commands.dm index 029ac226b5d..1cc14496660 100644 --- a/code/game/world_topic_commands.dm +++ b/code/game/world_topic_commands.dm @@ -85,7 +85,7 @@ var/global/list/decl/topic_command/topic_commands = list() s["enter"] = get_config_value(/decl/config/toggle/on/enter_allowed) s["vote"] = get_config_value(/decl/config/toggle/vote_mode) s["ai"] = !!length(empty_playable_ai_cores) - s["host"] = host || null + s["host"] = get_config_value(/decl/config/text/hosted_by) // This is dumb, but spacestation13.com's banners break if player count isn't the 8th field of the reply, so... this has to go here. s["players"] = 0 diff --git a/code/modules/admin/dbban/functions.dm b/code/modules/admin/dbban/functions.dm index 278792ba877..6580398d8e3 100644 --- a/code/modules/admin/dbban/functions.dm +++ b/code/modules/admin/dbban/functions.dm @@ -257,6 +257,9 @@ if(!check_rights(R_BAN)) return + if(!owner || !istype(owner, /client)) + return + establish_db_connection() if(!dbcon.IsConnected()) return @@ -271,21 +274,18 @@ ban_number++; if(ban_number == 0) - to_chat(usr, "Database update failed due to a ban id not being present in the database.") + to_chat(owner, "Database update failed due to a ban id not being present in the database.") return if(ban_number > 1) - to_chat(usr, "Database update failed due to multiple bans having the same ID. Contact the database admin.") - return - - if(!src.owner || !istype(src.owner, /client)) + to_chat(owner, "Database update failed due to multiple bans having the same ID. Contact the database admin.") return - var/unban_ckey = src.owner:ckey - var/unban_computerid = src.owner:computer_id - var/unban_ip = src.owner:address + var/unban_ckey = owner.ckey + var/unban_computerid = owner.computer_id + var/unban_ip = owner.address - message_admins("[key_name_admin(usr)] has lifted [pckey]'s ban.",1) + message_admins("[key_name_admin(owner)] has lifted [pckey]'s ban.",1) var/DBQuery/query_update = dbcon.NewQuery("UPDATE `erro_ban` SET `unbanned` = TRUE, `unbanned_datetime` = NOW(), `unbanned_ckey` = '[unban_ckey]', `unbanned_computerid` = '[unban_computerid]', `unbanned_ip` = '[unban_ip]' WHERE `id` = [id]") query_update.Execute() diff --git a/code/modules/admin/verbs/adminjump.dm b/code/modules/admin/verbs/adminjump.dm index f1f4d7130d9..80f1d71a039 100644 --- a/code/modules/admin/verbs/adminjump.dm +++ b/code/modules/admin/verbs/adminjump.dm @@ -116,13 +116,13 @@ return if(get_config_value(/decl/config/toggle/on/admin_jump)) - var/list/keys = list() - for(var/mob/M in global.player_list) + var/list/client/keys = list() + for(var/mob/M in global.player_list) // excludes /mob/new_player keys += M.client - var/selection = input("Please, select a player!", "Admin Jumping", null, null) as null|anything in sortKey(keys) + var/client/selection = input("Please, select a player!", "Admin Jumping", null, null) as null|anything in sortKey(keys) if(!selection) return - var/mob/M = selection:mob + var/mob/M = selection.mob if(!M) return From 8d420a1ac55a8de584dc6eac4f9eb79f42624710 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Mon, 17 Jun 2024 13:40:27 +1000 Subject: [PATCH 61/90] Added beggar knights to Shaded Hills. --- code/game/objects/items/stacks/medical.dm | 6 +++++ code/game/objects/items/waterskin.dm | 7 +++++ .../projectiles/guns/launcher/bows/arrow.dm | 3 +++ code/modules/random_map/noise/forage.dm | 3 +++ maps/shaded_hills/icons/hud.dmi | Bin 897 -> 503 bytes maps/shaded_hills/jobs/_jobs.dm | 6 ++++- maps/shaded_hills/jobs/visitors.dm | 24 ++++++++++++++++++ maps/shaded_hills/outfits/caves.dm | 10 +++++--- maps/shaded_hills/outfits/visitors.dm | 10 ++++++++ maps/shaded_hills/outfits/wilderness.dm | 10 +++++--- 10 files changed, 72 insertions(+), 7 deletions(-) diff --git a/code/game/objects/items/stacks/medical.dm b/code/game/objects/items/stacks/medical.dm index 5c5c99d44dc..1149a385b07 100644 --- a/code/game/objects/items/stacks/medical.dm +++ b/code/game/objects/items/stacks/medical.dm @@ -87,6 +87,9 @@ /decl/material/liquid/burn_meds/aloe = 1 ) +/obj/item/stack/medical/bruise_pack/bandage/five + amount = 5 + /obj/item/stack/medical/bruise_pack/bandage/proc/get_poultice_requirement_string() . = list() for(var/reagent in poultice_reagent_requirements) @@ -206,6 +209,9 @@ desc = "A bandage soaked in a medicinal herbal mixture, good for treating burns and preventing infections." animal_heal = 3 +/obj/item/stack/medical/ointment/poultice/five + amount = 5 + /obj/item/stack/medical/ointment/use_on_mob(mob/living/target, mob/living/user, animate = TRUE) . = ..() diff --git a/code/game/objects/items/waterskin.dm b/code/game/objects/items/waterskin.dm index a40bda467c4..e06e6b92737 100644 --- a/code/game/objects/items/waterskin.dm +++ b/code/game/objects/items/waterskin.dm @@ -11,3 +11,10 @@ desc = "A long and rather unwieldly water-carrying vessel." material = /decl/material/solid/organic/leather material_alteration = MAT_FLAG_ALTERATION_COLOR | MAT_FLAG_ALTERATION_NAME | MAT_FLAG_ALTERATION_DESC + +/obj/item/chems/waterskin/crafted/wine + name = "wineskin" + +/obj/item/chems/waterskin/crafted/wine/populate_reagents() + . = ..() + add_to_reagents(/decl/material/liquid/ethanol/wine, reagents?.total_volume) diff --git a/code/modules/projectiles/guns/launcher/bows/arrow.dm b/code/modules/projectiles/guns/launcher/bows/arrow.dm index b7f2339da5c..b570bed7657 100644 --- a/code/modules/projectiles/guns/launcher/bows/arrow.dm +++ b/code/modules/projectiles/guns/launcher/bows/arrow.dm @@ -44,6 +44,9 @@ desc = "A long, sharp stick, fletched at one end." var/decl/material/fletching_material +/obj/item/stack/material/bow_ammo/arrow/fifteen + amount = 15 + /obj/item/stack/material/bow_ammo/arrow/Initialize() if(ispath(fletching_material)) fletching_material = GET_DECL(fletching_material) diff --git a/code/modules/random_map/noise/forage.dm b/code/modules/random_map/noise/forage.dm index 3408554680a..93ddba8a3e2 100644 --- a/code/modules/random_map/noise/forage.dm +++ b/code/modules/random_map/noise/forage.dm @@ -8,6 +8,9 @@ /obj/item/stack/material/ore/basalt/three amount = 3 +/obj/item/stack/material/ore/basalt/ten + amount = 10 + /atom/movable/spawn_boulder name = "material boulder spawner" is_spawnable_type = FALSE diff --git a/maps/shaded_hills/icons/hud.dmi b/maps/shaded_hills/icons/hud.dmi index 6209cd86d0b53d8ebe719d80cc0f531ead06b01f..f2f0eeea4ee43cc53b837be63a39fffda018953b 100644 GIT binary patch delta 489 zcmVYc{TYi}YLqfI1WEJ!YRTgu3 z+5}xfbH$Xbf^R}o#k^SspMP^|pfT@J@&($vYIRpRz00000 f000000Qf&UykQHo0`#bL00000NkvXXu0mjf`7hSq literal 897 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7uRS`>R4CN?cNllZ!G7N;32F7#J$% z^jR_*JKjRjCYw4u4+pn!8XCuHk9`IfgmCeqkVKT&F%bT-qm^a+(Kn3{rPbk=;F_*&%pH5&=5IiLAk?tP!K zqG!p%TsAK$4IbuaJ!=k5)KJ`ar9x*;$&T(N&HaZWT+^cy96y~pdSI^Kz2(RLtkBa{ z*ghdyG&J**CX>f2+bKNt{3h>8tn1|8@@mfCc|3Dc<8uZErdm%I$B>FSZ*RZ#Yc`N@ zNPIAD+yC23&;Q@OeCMheRxdR?wC`H_U-6mFakBc!?SI!wzxS`J-W~I6-J;7s|Lnc< z`TA@3>8D=1TNi2s!o7Eu9Ww2_a(t4ZSvgFO%>S-KDGUr9VGaK$6jJP3*Y{E z4?nU;yHBwGqi~ODMc===DYie4O***r$v-}S=Kuai4G;7Ma|9=x`n{FAW9?m8i$7&H zyb2LgjfeA3=P)?t0S&N?WMnB8wD@C|$}X@(so=-ksw%MwlWy@^{Q0JHi>YTB+uIMf zw`ei!?F(f*Bg?W%wwt-a=E3T}HjUf1YBXHAxKD74wsphKU|Z#k;4p@r&wsjIn0J$5 zTHF)ErfoL732#O1lr!9o8urKCGi@^SVcT$ZYpwE){qc-BwaLdhzP)v4So-dj Date: Sun, 16 Jun 2024 13:15:50 -0400 Subject: [PATCH 62/90] Expand DME validation to include modpacks --- test/run-test.sh | 1 + tools/validate_dme.py | 7 ++- tools/validate_modpacks.py | 113 +++++++++++++++++++++++++++++++++++++ 3 files changed, 119 insertions(+), 2 deletions(-) create mode 100644 tools/validate_modpacks.py diff --git a/test/run-test.sh b/test/run-test.sh index 85ac39d8b3d..a9907ae692c 100755 --- a/test/run-test.sh +++ b/test/run-test.sh @@ -212,6 +212,7 @@ function run_code_tests { run_test "check icon state limit (maps)" "python3 tools/check_icon_state_limit.py maps" run_test_ci "check changelog builds" "python3 tools/changelog/ss13_genchangelog.py html/changelog.html html/changelogs" run_test "check files included" "python3 tools/validate_dme.py < nebula.dme" + run_test "check modpack files included" "python3 tools/validate_modpacks.py" } function run_byond_tests { diff --git a/tools/validate_dme.py b/tools/validate_dme.py index f8db6d699e8..4966ef550fe 100644 --- a/tools/validate_dme.py +++ b/tools/validate_dme.py @@ -101,9 +101,12 @@ def compare_lines(a, b): raise f"Two lines were exactly the same ({a} vs. {b})" +failed = False sorted_lines = sorted(lines, key = functools.cmp_to_key(compare_lines)) for (index, line) in enumerate(lines): if sorted_lines[index] != line: print(f"The include at line {index + offset} is out of order ({line}, expected {sorted_lines[index]})") - print(f"::error file=tgstation.dme,line={index+offset},title=DME Validator::The include at line {index + offset} is out of order ({line}, expected {sorted_lines[index]})") - sys.exit(1) + print(f"::error file=nebula.dme,line={index+offset},title=DME Validator::The include at line {index + offset} is out of order ({line}, expected {sorted_lines[index]})") + failed = True +if failed: + sys.exit(1) diff --git a/tools/validate_modpacks.py b/tools/validate_modpacks.py new file mode 100644 index 00000000000..360f71b5bf0 --- /dev/null +++ b/tools/validate_modpacks.py @@ -0,0 +1,113 @@ +import fnmatch +import functools +import glob +import sys +import os + +FORBID_INCLUDE = [ +] + +IGNORE_INCLUDE = [ +] + +def validate_modpack(dme_path): + (modpack_root, dme_name) = os.path.split(dme_path) + reading = False + lines = [] + total = 0 + with open(dme_path, 'r') as dme_file: + for line in dme_file.readlines(): + total+=1 + line = line.strip() + + if line == "// BEGIN_INCLUDE": + reading = True + continue + elif line == "// END_INCLUDE": + break + elif not reading: + continue + + lines.append(line) + + offset = total - len(lines) + print(f"{offset} lines were ignored in output") + modpack_failed = False + + for code_file in glob.glob("**/*.dm", root_dir=modpack_root, recursive=True): + dm_path = code_file.replace('/', '\\') + full_file = os.path.join(modpack_root, code_file) + + included = f"#include \"{dm_path}\"" in lines + forbid_include = False + + ignored = False + for ignore in IGNORE_INCLUDE: + if not fnmatch.fnmatch(full_file, ignore): + continue + + ignored = True + break + + if ignored: + continue + + for forbid in FORBID_INCLUDE: + if not fnmatch.fnmatch(full_file, forbid): + continue + + forbid_include = True + + if included: + print(f"{os.path.join(modpack_root,dm_path)} should not be included") + print(f"::error file={full_file},line=1,title=DME Validator::File should not be included") + modpack_failed = True + + if forbid_include: + continue + + if not included: + print(f"{os.path.join(modpack_root,dm_path)} is not included") + print(f"::error file={full_file},line=1,title=DME Validator::File is not included") + modpack_failed = True + + def compare_lines(a, b): + # Remove initial include as well as the final quotation mark + a = a[len("#include \""):-1].lower() + b = b[len("#include \""):-1].lower() + + a_segments = a.split('\\') + b_segments = b.split('\\') + + for (a_segment, b_segment) in zip(a_segments, b_segments): + a_is_file = a_segment.endswith(".dm") + b_is_file = b_segment.endswith(".dm") + + # code\something.dm will ALWAYS come before code\directory\something.dm + if a_is_file and not b_is_file: + return -1 + + if b_is_file and not a_is_file: + return 1 + + # interface\something.dm will ALWAYS come after code\something.dm + if a_segment != b_segment: + return (a_segment > b_segment) - (a_segment < b_segment) + + raise f"Two lines were exactly the same ({a} vs. {b})" + + sorted_lines = sorted(lines, key = functools.cmp_to_key(compare_lines)) + for (index, line) in enumerate(lines): + if sorted_lines[index] != line: + print(f"The include at line {index + offset} is out of order ({line}, expected {sorted_lines[index]})") + print(f"::error file={dme_path},line={index+offset},title=DME Validator::The include at line {index + offset} is out of order ({line}, expected {sorted_lines[index]})") + modpack_failed = True + return modpack_failed + +failed = False +for modpack_dme in glob.glob("mods/**/*.dme", recursive=True): + failed = validate_modpack(modpack_dme) or failed + +if failed: + sys.exit(1) + From 0e5c2c1a2ce16990bcb6f0f832a1a4e6c3e21fa1 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Sun, 16 Jun 2024 13:24:05 -0400 Subject: [PATCH 63/90] Fix issues found in modpacks --- maps/exodus/exodus.dm | 4 +- maps/ministation/ministation.dm | 4 +- maps/modpack_testing/modpack_testing.dm | 4 +- maps/tradeship/tradeship.dm | 4 +- mods/content/bigpharma/_bigpharma.dme | 2 + mods/content/dungeon_loot/_dungeon_loot.dme | 9 +- mods/content/fantasy/_fantasy.dme | 56 +++++------ .../generic_shuttles/_generic_shuttles.dme | 4 +- mods/content/government/_government.dme | 4 +- mods/content/matchmaking/_matchmaking.dme | 6 +- .../mouse_highlights/_mouse_highlight.dme | 2 + mods/content/pheromones/_pheromones.dme | 2 + mods/content/psionics/_psionics.dme | 1 + .../system/psionics/mob/borer_power.dm | 7 +- mods/content/xenobiology/_xenobiology.dme | 96 ++++++++++--------- mods/gamemodes/mixed/_mixed.dme | 5 +- mods/mobs/borers/_borers.dme | 5 + mods/species/bayliens/_bayliens.dme | 12 ++- mods/species/drakes/_drakes.dme | 2 +- mods/species/neoavians/_neoavians.dme | 14 +-- .../utility_frames/_utility_frames.dme | 8 +- mods/species/vox/_vox.dme | 54 ++++++----- tools/validate_modpacks.py | 9 +- 23 files changed, 178 insertions(+), 136 deletions(-) diff --git a/maps/exodus/exodus.dm b/maps/exodus/exodus.dm index d5e940a0c72..eb01d538063 100644 --- a/maps/exodus/exodus.dm +++ b/maps/exodus/exodus.dm @@ -13,13 +13,15 @@ #include "../../mods/content/matchmaking/_matchmaking.dme" #include "../../mods/content/modern_earth/_modern_earth.dme" #include "../../mods/content/mouse_highlights/_mouse_highlight.dme" - #include "../../mods/content/psionics/_psionics.dme" #include "../../mods/content/scaling_descriptors.dm" #include "../../mods/content/xenobiology/_xenobiology.dme" #include "../../mods/mobs/dionaea/_dionaea.dme" #include "../../mods/mobs/borers/_borers.dme" + // Must come after borers for compatibility. + #include "../../mods/content/psionics/_psionics.dme" + #include "../../mods/species/ascent/_ascent.dme" #include "../../mods/content/pheromones/_pheromones.dme" #include "../../mods/species/serpentid/_serpentid.dme" diff --git a/maps/ministation/ministation.dm b/maps/ministation/ministation.dm index 50d37f764f1..9fb79148062 100644 --- a/maps/ministation/ministation.dm +++ b/maps/ministation/ministation.dm @@ -34,7 +34,6 @@ Twice... #include "../../mods/content/government/_government.dme" #include "../../mods/content/modern_earth/_modern_earth.dme" #include "../../mods/content/mouse_highlights/_mouse_highlight.dme" - #include "../../mods/content/psionics/_psionics.dme" #include "../../mods/content/scaling_descriptors.dm" #include "ministation_antagonists.dm" @@ -70,6 +69,9 @@ Twice... #include "../../mods/mobs/dionaea/_dionaea.dme" #include "../../mods/mobs/borers/_borers.dme" + // Must come after borers for compatibility. + #include "../../mods/content/psionics/_psionics.dme" + #include "ministation_overmap.dm" #include "jobs/command.dm" diff --git a/maps/modpack_testing/modpack_testing.dm b/maps/modpack_testing/modpack_testing.dm index 84b7757205a..0e3bd51dec3 100644 --- a/maps/modpack_testing/modpack_testing.dm +++ b/maps/modpack_testing/modpack_testing.dm @@ -21,7 +21,6 @@ #include "../../mods/content/matchmaking/_matchmaking.dme" #include "../../mods/content/modern_earth/_modern_earth.dme" #include "../../mods/content/mouse_highlights/_mouse_highlight.dme" - #include "../../mods/content/psionics/_psionics.dme" #include "../../mods/content/shackles/_shackles.dme" #include "../../mods/content/xenobiology/_xenobiology.dme" #include "../../mods/content/pheromones/_pheromones.dme" @@ -31,6 +30,9 @@ #include "../../mods/mobs/dionaea/_dionaea.dme" #include "../../mods/mobs/borers/_borers.dme" + // Must come after borers for compatibility. + #include "../../mods/content/psionics/_psionics.dme" + #include "../../mods/species/serpentid/_serpentid.dme" #include "../../mods/species/ascent/_ascent.dme" #include "../../mods/species/neoavians/_neoavians.dme" diff --git a/maps/tradeship/tradeship.dm b/maps/tradeship/tradeship.dm index 6e93667b344..7a0e37452d0 100644 --- a/maps/tradeship/tradeship.dm +++ b/maps/tradeship/tradeship.dm @@ -17,7 +17,6 @@ #include "../../mods/content/government/_government.dme" #include "../../mods/content/modern_earth/_modern_earth.dme" #include "../../mods/content/mouse_highlights/_mouse_highlight.dme" - #include "../../mods/content/psionics/_psionics.dme" #include "../../mods/content/scaling_descriptors.dm" #include "../../mods/content/xenobiology/_xenobiology.dme" #include "../../mods/content/matchmaking/_matchmaking.dme" @@ -26,6 +25,9 @@ #include "../../mods/mobs/dionaea/_dionaea.dme" #include "../../mods/mobs/borers/_borers.dme" + // Must come after borers for compatibility. + #include "../../mods/content/psionics/_psionics.dme" + #include "../../mods/species/ascent/_ascent.dme" #include "../../mods/species/drakes/_drakes.dme" #include "../../mods/species/serpentid/_serpentid.dme" diff --git a/mods/content/bigpharma/_bigpharma.dme b/mods/content/bigpharma/_bigpharma.dme index ee81e2f9ac1..7da543df8ee 100644 --- a/mods/content/bigpharma/_bigpharma.dme +++ b/mods/content/bigpharma/_bigpharma.dme @@ -1,9 +1,11 @@ #ifndef MODPACK_BIGPHARMA #define MODPACK_BIGPHARMA +// BEGIN_INCLUDE #include "_bigpharma.dm" #include "chems.dm" #include "extension.dm" #include "language.dm" #include "overrides.dm" #include "pill_bottle.dm" +// END_INCLUDE #endif \ No newline at end of file diff --git a/mods/content/dungeon_loot/_dungeon_loot.dme b/mods/content/dungeon_loot/_dungeon_loot.dme index a45ad415641..18e66276b2f 100644 --- a/mods/content/dungeon_loot/_dungeon_loot.dme +++ b/mods/content/dungeon_loot/_dungeon_loot.dme @@ -1,9 +1,10 @@ #ifndef MODPACK_DUNGEON_LOOT #define MODPACK_DUNGEON_LOOT -// BEGIN INCLUDE +// BEGIN_INCLUDE #include "_dungeon_loot.dm" #include "loot_pile.dm" -#include "subtypes/exosuit.dm" -#include "subtypes/maint.dm" -#include "subtypes/surface.dm" +#include "subtypes\exosuit.dm" +#include "subtypes\maint.dm" +#include "subtypes\surface.dm" +// END_INCLUDE #endif diff --git a/mods/content/fantasy/_fantasy.dme b/mods/content/fantasy/_fantasy.dme index b8a389b8f58..5242af7c3d4 100644 --- a/mods/content/fantasy/_fantasy.dme +++ b/mods/content/fantasy/_fantasy.dme @@ -1,31 +1,33 @@ #ifndef MODPACK_FANTASY_SPECIES #define MODPACK_FANTASY_SPECIES +// BEGIN_INCLUDE #include "_fantasy.dm" -#include "datum/cultures.dm" -#include "datum/currencies.dm" -#include "datum/factions.dm" -#include "datum/locations.dm" -#include "datum/outfits.dm" -#include "datum/overrides.dm" -#include "datum/species.dm" -#include "datum/hnoll/bodytypes.dm" -#include "datum/hnoll/culture.dm" -#include "datum/hnoll/language.dm" -#include "datum/hnoll/markings.dm" -#include "datum/hnoll/organs.dm" -#include "datum/hnoll/species.dm" -#include "datum/kobaloi/bodytypes.dm" -#include "datum/kobaloi/clothing.dm" -#include "datum/kobaloi/culture.dm" -#include "datum/kobaloi/language.dm" -#include "datum/kobaloi/markings.dm" -#include "datum/kobaloi/organs.dm" -#include "datum/kobaloi/species.dm" -#include "items/clothing/_loadout.dm" -#include "items/clothing/_recipes.dm" -#include "items/clothing/armor.dm" -#include "items/clothing/jerkin.dm" -#include "items/clothing/loincloth.dm" -#include "items/clothing/overrides.dm" -#include "items/clothing/trousers.dm" +#include "datum\cultures.dm" +#include "datum\currencies.dm" +#include "datum\factions.dm" +#include "datum\locations.dm" +#include "datum\outfits.dm" +#include "datum\overrides.dm" +#include "datum\species.dm" +#include "datum\hnoll\bodytypes.dm" +#include "datum\hnoll\culture.dm" +#include "datum\hnoll\language.dm" +#include "datum\hnoll\markings.dm" +#include "datum\hnoll\organs.dm" +#include "datum\hnoll\species.dm" +#include "datum\kobaloi\bodytypes.dm" +#include "datum\kobaloi\clothing.dm" +#include "datum\kobaloi\culture.dm" +#include "datum\kobaloi\language.dm" +#include "datum\kobaloi\markings.dm" +#include "datum\kobaloi\organs.dm" +#include "datum\kobaloi\species.dm" +#include "items\clothing\_loadout.dm" +#include "items\clothing\_recipes.dm" +#include "items\clothing\armor.dm" +#include "items\clothing\jerkin.dm" +#include "items\clothing\loincloth.dm" +#include "items\clothing\overrides.dm" +#include "items\clothing\trousers.dm" +// END_INCLUDE #endif diff --git a/mods/content/generic_shuttles/_generic_shuttles.dme b/mods/content/generic_shuttles/_generic_shuttles.dme index 79827a3486e..c77cee5daa9 100644 --- a/mods/content/generic_shuttles/_generic_shuttles.dme +++ b/mods/content/generic_shuttles/_generic_shuttles.dme @@ -1,5 +1,7 @@ #ifndef MODPACK_GENERIC_SHUTTLES #define MODPACK_GENERIC_SHUTTLES +// BEGIN_INCLUDE #include "_generic_shuttles.dm" -#include "tanker/tanker.dm" +#include "tanker\tanker.dm" +// END_INCLUDE #endif \ No newline at end of file diff --git a/mods/content/government/_government.dme b/mods/content/government/_government.dme index 62ec2d0408c..61285936c78 100644 --- a/mods/content/government/_government.dme +++ b/mods/content/government/_government.dme @@ -1,6 +1,6 @@ #ifndef MODPACK_GOVERNMENT #define MODPACK_GOVERNMENT -// BEGIN INCLUDE +// BEGIN_INCLUDE #include "government.dm" #include "datum\ai_holo.dm" #include "datum\ai_laws.dm" @@ -8,5 +8,5 @@ #include "items\cups.dm" #include "items\documents.dm" #include "ruins\ec_old_crash\ec_old_crash.dm" -#endif // END_INCLUDE +#endif diff --git a/mods/content/matchmaking/_matchmaking.dme b/mods/content/matchmaking/_matchmaking.dme index a619db79f3d..e40cde1f5f0 100644 --- a/mods/content/matchmaking/_matchmaking.dme +++ b/mods/content/matchmaking/_matchmaking.dme @@ -1,7 +1,9 @@ #ifndef CONTENT_PACK_MATCHMAKING #define CONTENT_PACK_MATCHMAKING -#include "matchmaking.dm" +// BEGIN_INCLUDE #include "matchmaker.dm" -#include "relations_types.dm" +#include "matchmaking.dm" #include "relations.dm" +#include "relations_types.dm" +// END_INCLUDE #endif \ No newline at end of file diff --git a/mods/content/mouse_highlights/_mouse_highlight.dme b/mods/content/mouse_highlights/_mouse_highlight.dme index 1d2fa36844b..a4cb9ea9d6a 100644 --- a/mods/content/mouse_highlights/_mouse_highlight.dme +++ b/mods/content/mouse_highlights/_mouse_highlight.dme @@ -1,6 +1,8 @@ #ifndef CONTENT_PACK_MOUSEOVER #define CONTENT_PACK_MOUSEOVER +// BEGIN_INCLUDE #include "mouse_highlight.dm" #include "mouse_highlight_client.dm" #include "mouse_highlight_prefs.dm" +// END_INCLUDE #endif \ No newline at end of file diff --git a/mods/content/pheromones/_pheromones.dme b/mods/content/pheromones/_pheromones.dme index 2cf997f8787..fecc8b376dd 100644 --- a/mods/content/pheromones/_pheromones.dme +++ b/mods/content/pheromones/_pheromones.dme @@ -1,8 +1,10 @@ #ifndef MODPACK_PHEROMONES #define MODPACK_PHEROMONES +// BEGIN_INCLUDE #include "_pheromones.dm" #include "pheromone_effect.dm" #include "pheromone_emotes.dm" #include "pheromone_implant.dm" #include "pheromone_mob.dm" +// END_INCLUDE #endif \ No newline at end of file diff --git a/mods/content/psionics/_psionics.dme b/mods/content/psionics/_psionics.dme index 53919e93eb0..7bf5f2f680d 100644 --- a/mods/content/psionics/_psionics.dme +++ b/mods/content/psionics/_psionics.dme @@ -53,6 +53,7 @@ #include "system\psionics\interface\ui.dm" #include "system\psionics\interface\ui_hub.dm" #include "system\psionics\interface\ui_toggles.dm" +#include "system\psionics\mob\borer_power.dm" #include "system\psionics\mob\mob.dm" #include "system\psionics\mob\mob_assay.dm" #include "system\psionics\mob\mob_interactions.dm" diff --git a/mods/content/psionics/system/psionics/mob/borer_power.dm b/mods/content/psionics/system/psionics/mob/borer_power.dm index 4e17326877f..b48874f08e8 100644 --- a/mods/content/psionics/system/psionics/mob/borer_power.dm +++ b/mods/content/psionics/system/psionics/mob/borer_power.dm @@ -1,12 +1,8 @@ +#ifdef CONTENT_PACK_BORERS /mob/living/simple_animal/borer var/image/aura_image /mob/living/simple_animal/borer/Initialize(var/mapload, var/gen=1) - - if(!SSmodpacks.loaded_modpacks["Cortical Borers"]) // Borer module not included. - log_debug("Attempted spawn of stubbed mobtype [type].") - return INITIALIZE_HINT_QDEL - . = ..() aura_image = create_aura_image(src) aura_image.color = "#aaffaa" @@ -57,3 +53,4 @@ set_ability_cooldown(15 SECONDS) return TRUE +#endif \ No newline at end of file diff --git a/mods/content/xenobiology/_xenobiology.dme b/mods/content/xenobiology/_xenobiology.dme index 144a87c3142..11a5f3972c6 100644 --- a/mods/content/xenobiology/_xenobiology.dme +++ b/mods/content/xenobiology/_xenobiology.dme @@ -1,56 +1,58 @@ #ifndef CONTENT_PACK_XENOBIO #define CONTENT_PACK_XENOBIO +// BEGIN_INCLUDE #include "_xenobiology.dm" #include "achievement.dm" #include "circuit.dm" #include "emotes.dm" #include "food.dm" #include "overrides.dm" -#include "colours/_colour.dm" -#include "colours/colour_adamantine.dm" -#include "colours/colour_black.dm" -#include "colours/colour_blue.dm" -#include "colours/colour_cerulean.dm" -#include "colours/colour_dark_blue.dm" -#include "colours/colour_dark_purple.dm" -#include "colours/colour_gold.dm" -#include "colours/colour_green.dm" -#include "colours/colour_grey.dm" -#include "colours/colour_light_pink.dm" -#include "colours/colour_metal.dm" -#include "colours/colour_oil.dm" -#include "colours/colour_orange.dm" -#include "colours/colour_pink.dm" -#include "colours/colour_purple.dm" -#include "colours/colour_pyrite.dm" -#include "colours/colour_quantum.dm" -#include "colours/colour_rainbow.dm" -#include "colours/colour_red.dm" -#include "colours/colour_sepia.dm" -#include "colours/colour_silver.dm" -#include "colours/colour_yellow.dm" -#include "mobs/critter_slime.dm" -#include "mobs/slime_feeding_helpers.dm" -#include "slime/_slime.dm" -#include "slime/death.dm" -#include "slime/examine.dm" -#include "slime/feeding.dm" -#include "slime/items.dm" -#include "slime/items_extract_enhancer.dm" -#include "slime/items_cell.dm" -#include "slime/items_potion.dm" -#include "slime/items_steroid.dm" -#include "slime/life.dm" -#include "slime/powers.dm" -#include "slime/say.dm" -#include "slime/slime_AI.dm" -#include "slime/slime_click.dm" -#include "slime/slime_codex.dm" -#include "slime/slime_commands.dm" -#include "slime/slime_comments.dm" -#include "slime/slime_follow.dm" -#include "slime/slime_hud.dm" -#include "slime/slime_reagents.dm" -#include "slime/slime_surgery.dm" -#include "slime/slime_update_icon.dm" +#include "colours\_colour.dm" +#include "colours\colour_adamantine.dm" +#include "colours\colour_black.dm" +#include "colours\colour_blue.dm" +#include "colours\colour_cerulean.dm" +#include "colours\colour_dark_blue.dm" +#include "colours\colour_dark_purple.dm" +#include "colours\colour_gold.dm" +#include "colours\colour_green.dm" +#include "colours\colour_grey.dm" +#include "colours\colour_light_pink.dm" +#include "colours\colour_metal.dm" +#include "colours\colour_oil.dm" +#include "colours\colour_orange.dm" +#include "colours\colour_pink.dm" +#include "colours\colour_purple.dm" +#include "colours\colour_pyrite.dm" +#include "colours\colour_quantum.dm" +#include "colours\colour_rainbow.dm" +#include "colours\colour_red.dm" +#include "colours\colour_sepia.dm" +#include "colours\colour_silver.dm" +#include "colours\colour_yellow.dm" +#include "mobs\critter_slime.dm" +#include "mobs\slime_feeding_helpers.dm" +#include "slime\_slime.dm" +#include "slime\death.dm" +#include "slime\examine.dm" +#include "slime\feeding.dm" +#include "slime\items.dm" +#include "slime\items_cell.dm" +#include "slime\items_extract_enhancer.dm" +#include "slime\items_potion.dm" +#include "slime\items_steroid.dm" +#include "slime\life.dm" +#include "slime\powers.dm" +#include "slime\say.dm" +#include "slime\slime_AI.dm" +#include "slime\slime_click.dm" +#include "slime\slime_codex.dm" +#include "slime\slime_commands.dm" +#include "slime\slime_comments.dm" +#include "slime\slime_follow.dm" +#include "slime\slime_hud.dm" +#include "slime\slime_reagents.dm" +#include "slime\slime_surgery.dm" +#include "slime\slime_update_icon.dm" +// END_INCLUDE #endif \ No newline at end of file diff --git a/mods/gamemodes/mixed/_mixed.dme b/mods/gamemodes/mixed/_mixed.dme index ce5394378db..61cdbf05402 100644 --- a/mods/gamemodes/mixed/_mixed.dme +++ b/mods/gamemodes/mixed/_mixed.dme @@ -1,8 +1,9 @@ #ifndef GAMEMODE_PACK_MIXED #define GAMEMODE_PACK_MIXED -// BEGIN INCLUDES +// BEGIN_INCLUDE +#include "_mixed.dm" #if defined(GAMEMODE_PACK_HEIST) // TODO: && defined(GAMEMODE_PACK_MERCENARY) #include "crossfire.dm" #endif -// END INCLUDES +// END_INCLUDE #endif \ No newline at end of file diff --git a/mods/mobs/borers/_borers.dme b/mods/mobs/borers/_borers.dme index 7f230fc9536..380c95f4e87 100644 --- a/mods/mobs/borers/_borers.dme +++ b/mods/mobs/borers/_borers.dme @@ -1,5 +1,10 @@ #ifndef CONTENT_PACK_BORERS #define CONTENT_PACK_BORERS + +#ifdef MODPACK_PSIONICS +#warn Psionics modpack loaded before Borers modpack, compatibility features will be missing. +#endif + // BEGIN_INCLUDE #include "borer.dm" #include "datum\antagonist.dm" diff --git a/mods/species/bayliens/_bayliens.dme b/mods/species/bayliens/_bayliens.dme index 1e053ec6723..e8de7a35d0b 100644 --- a/mods/species/bayliens/_bayliens.dme +++ b/mods/species/bayliens/_bayliens.dme @@ -1,5 +1,6 @@ #ifndef MODPACK_BAYLIENS #define MODPACK_BAYLIENS +// BEGIN_INCLUDE #include "bayliens.dm" #include "adherent\_adherent.dm" #include "adherent\datum\culture.dm" @@ -20,12 +21,14 @@ #include "skrell\datum\faction.dm" #include "skrell\datum\language.dm" #include "skrell\datum\location.dm" +#include "skrell\datum\pronouns_skrell.dm" #include "skrell\datum\religion.dm" #include "skrell\datum\skrell_meat.dm" -#include "skrell\datum\species_bodytype.dm" #include "skrell\datum\species.dm" -#include "skrell\datum\pronouns_skrell.dm" +#include "skrell\datum\species_bodytype.dm" +#include "skrell\gear\ammo.dm" #include "skrell\gear\clustertool.dm" +#include "skrell\gear\fabrication_designs.dm" #include "skrell\gear\gear.dm" #include "skrell\gear\gear_ears.dm" #include "skrell\gear\gear_head.dm" @@ -34,13 +37,11 @@ #include "skrell\gear\gear_suit.dm" #include "skrell\gear\gear_under.dm" #include "skrell\turfs\flooring.dm" -#include "skrell\gear\ammo.dm" -#include "skrell\gear\fabrication_designs.dm" #include "tajaran\_tajaran.dm" #include "tajaran\datum\accessory.dm" +#include "tajaran\datum\blood.dm" #include "tajaran\datum\culture.dm" #include "tajaran\datum\emotes.dm" -#include "tajaran\datum\blood.dm" #include "tajaran\datum\language.dm" #include "tajaran\datum\species.dm" #include "tajaran\datum\species_bodytypes.dm" @@ -57,4 +58,5 @@ #include "unathi\datum\species_bodytypes.dm" #include "unathi\datum\sprite_accessory.dm" #include "unathi\organs\organs_internal.dm" +// END_INCLUDE #endif diff --git a/mods/species/drakes/_drakes.dme b/mods/species/drakes/_drakes.dme index b57243c273b..44fa41725be 100644 --- a/mods/species/drakes/_drakes.dme +++ b/mods/species/drakes/_drakes.dme @@ -9,9 +9,9 @@ #include "_drakes.dm" #include "clothing.dm" #include "culture.dm" +#include "drake_abilities.dm" #include "drake_abilities_friendly.dm" #include "drake_abilities_hostile.dm" -#include "drake_abilities.dm" #include "drake_attacks.dm" #include "drake_emotes.dm" #include "drake_modifiers.dm" diff --git a/mods/species/neoavians/_neoavians.dme b/mods/species/neoavians/_neoavians.dme index 79444adfede..e7c8d526399 100644 --- a/mods/species/neoavians/_neoavians.dme +++ b/mods/species/neoavians/_neoavians.dme @@ -1,11 +1,13 @@ #ifndef CONTENT_PACK_NEOAVIANS #define CONTENT_PACK_NEOAVIANS +// BEGIN_INCLUDE #include "_neoavians.dm" #include "clothing.dm" -#include "machinery/suit_cycler.dm" -#include "datum/language.dm" -#include "datum/loadout.dm" -#include "datum/species.dm" -#include "datum/accessory.dm" -#include "datum/species_bodytypes.dm" +#include "datum\accessory.dm" +#include "datum\language.dm" +#include "datum\loadout.dm" +#include "datum\species.dm" +#include "datum\species_bodytypes.dm" +#include "machinery\suit_cycler.dm" +// END_INCLUDE #endif diff --git a/mods/species/utility_frames/_utility_frames.dme b/mods/species/utility_frames/_utility_frames.dme index 728a6e05d86..15ee526e745 100644 --- a/mods/species/utility_frames/_utility_frames.dme +++ b/mods/species/utility_frames/_utility_frames.dme @@ -1,9 +1,11 @@ #ifndef MODPACK_UTILITY_FRAMES #define MODPACK_UTILITY_FRAMES -#include "../../content/shackles/_shackles.dme" +#include "..\..\content\shackles\_shackles.dme" +// BEGIN_INCLUDE #include "_utility_frames.dm" +#include "aspects.dm" +#include "markings.dm" #include "species.dm" #include "species_bodytypes.dm" -#include "markings.dm" -#include "aspects.dm" +// END_INCLUDE #endif \ No newline at end of file diff --git a/mods/species/vox/_vox.dme b/mods/species/vox/_vox.dme index ff2fe2a07f8..f935187d754 100644 --- a/mods/species/vox/_vox.dme +++ b/mods/species/vox/_vox.dme @@ -1,32 +1,34 @@ #ifndef MODPACK_VOX #define MODPACK_VOX +// BEGIN_INCLUDE #include "_vox.dm" #include "mobs_vox.dm" #include "organs_vox.dm" -#include "datum/accessories.dm" -#include "datum/antagonism.dm" -#include "datum/aspects.dm" -#include "datum/cultures_vox.dm" -#include "datum/descriptors_vox.dm" -#include "datum/factions_vox.dm" -#include "datum/heist_compatibility.dm" -#include "datum/language.dm" -#include "datum/locations_vox.dm" -#include "datum/religions_vox.dm" -#include "datum/robolimbs.dm" -#include "datum/species.dm" -#include "datum/species_bodytypes.dm" -#include "datum/trader.dm" -#include "datum/unit_testing.dm" -#include "gear/gear.dm" -#include "gear/gear_gloves.dm" -#include "gear/gear_head.dm" -#include "gear/gear_mask.dm" -#include "gear/gear_rig.dm" -#include "gear/gear_shoes.dm" -#include "gear/gear_suit.dm" -#include "gear/gear_under.dm" -#include "gear/gun.dm" -#include "gear/gun_slugsling.dm" -#include "gear/gun_spikethrower.dm" +#include "datum\accessories.dm" +#include "datum\antagonism.dm" +#include "datum\aspects.dm" +#include "datum\cultures_vox.dm" +#include "datum\descriptors_vox.dm" +#include "datum\factions_vox.dm" +#include "datum\heist_compatibility.dm" +#include "datum\language.dm" +#include "datum\locations_vox.dm" +#include "datum\religions_vox.dm" +#include "datum\robolimbs.dm" +#include "datum\species.dm" +#include "datum\species_bodytypes.dm" +#include "datum\trader.dm" +#include "datum\unit_testing.dm" +#include "gear\gear.dm" +#include "gear\gear_gloves.dm" +#include "gear\gear_head.dm" +#include "gear\gear_mask.dm" +#include "gear\gear_rig.dm" +#include "gear\gear_shoes.dm" +#include "gear\gear_suit.dm" +#include "gear\gear_under.dm" +#include "gear\gun.dm" +#include "gear\gun_slugsling.dm" +#include "gear\gun_spikethrower.dm" +// END_INCLUDE #endif diff --git a/tools/validate_modpacks.py b/tools/validate_modpacks.py index 360f71b5bf0..33f4e82a632 100644 --- a/tools/validate_modpacks.py +++ b/tools/validate_modpacks.py @@ -8,6 +8,11 @@ ] IGNORE_INCLUDE = [ + # These are stubs. + r'mods/content/dungeon_loot/subtypes/exosuit.dm', + # The validator can't detect the weird way these are loaded. + r'mods/content/corporate/away_sites/**/*.dm', + r'mods/content/government/away_sites/**/*.dm' ] def validate_modpack(dme_path): @@ -27,6 +32,8 @@ def validate_modpack(dme_path): break elif not reading: continue + elif not line.startswith("#include"): + continue lines.append(line) @@ -94,7 +101,7 @@ def compare_lines(a, b): if a_segment != b_segment: return (a_segment > b_segment) - (a_segment < b_segment) - raise f"Two lines were exactly the same ({a} vs. {b})" + raise ValueError(f"Two lines were exactly the same ({a} vs. {b})") sorted_lines = sorted(lines, key = functools.cmp_to_key(compare_lines)) for (index, line) in enumerate(lines): From 230d9ede1977861f227f491a696efa30e7459bdf Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Mon, 17 Jun 2024 11:06:50 +1000 Subject: [PATCH 64/90] You can now dip items into turf liquids, wells and barrels. --- code/datums/extensions/storage/_storage.dm | 6 ++++ code/game/atoms.dm | 3 ++ code/game/objects/structures/barrel.dm | 7 +++++ code/game/objects/structures/well.dm | 7 +++++ code/game/turfs/floors/floor_attackby.dm | 32 ++++++++++++---------- code/game/turfs/turf.dm | 24 ++++++++++------ 6 files changed, 55 insertions(+), 24 deletions(-) diff --git a/code/datums/extensions/storage/_storage.dm b/code/datums/extensions/storage/_storage.dm index 6220c90c71d..36923527cb8 100644 --- a/code/datums/extensions/storage/_storage.dm +++ b/code/datums/extensions/storage/_storage.dm @@ -201,6 +201,12 @@ var/global/list/_test_storage_items = list() var/mob/M = W.loc if(!M.try_unequip(W)) return + + if(holder.reagents?.total_volume) + W.fluid_act(holder.reagents) + if(QDELETED(W)) + return + W.forceMove(holder) W.on_enter_storage(src) if(user) diff --git a/code/game/atoms.dm b/code/game/atoms.dm index d72feee1db2..c6956ac3222 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -132,6 +132,9 @@ /// Handle reagents being modified /atom/proc/on_reagent_change() SHOULD_CALL_PARENT(TRUE) + if(storage && reagents?.total_volume) + for(var/obj/item/thing in get_stored_inventory()) + thing.fluid_act(reagents) /** Handle an atom bumping this atom diff --git a/code/game/objects/structures/barrel.dm b/code/game/objects/structures/barrel.dm index 84aae464c9c..f5fe5dbe703 100644 --- a/code/game/objects/structures/barrel.dm +++ b/code/game/objects/structures/barrel.dm @@ -19,6 +19,13 @@ ..() return INITIALIZE_HINT_LATELOAD +/obj/structure/reagent_dispensers/barrel/attackby(obj/item/W, mob/user) + . = ..() + if(!. && user.a_intent == I_HELP && reagents?.total_volume > FLUID_PUDDLE) + user.visible_message(SPAN_NOTICE("\The [user] dips \the [W] into \the [reagents.get_primary_reagent_name()].")) + W.fluid_act(reagents) + return TRUE + /obj/structure/reagent_dispensers/barrel/LateInitialize(mapload, ...) ..() if(mapload) diff --git a/code/game/objects/structures/well.dm b/code/game/objects/structures/well.dm index 7f0e460e00f..55957552274 100644 --- a/code/game/objects/structures/well.dm +++ b/code/game/objects/structures/well.dm @@ -26,6 +26,13 @@ if(!is_processing) START_PROCESSING(SSobj, src) +/obj/structure/reagent_dispensers/well/attackby(obj/item/W, mob/user) + . = ..() + if(!. && user.a_intent == I_HELP && reagents?.total_volume > FLUID_PUDDLE) + user.visible_message(SPAN_NOTICE("\The [user] dips \the [W] into \the [reagents.get_primary_reagent_name()].")) + W.fluid_act(reagents) + return TRUE + /obj/structure/reagent_dispensers/well/mapped/populate_reagents() . = ..() add_to_reagents(/decl/material/liquid/water, reagents.maximum_volume) diff --git a/code/game/turfs/floors/floor_attackby.dm b/code/game/turfs/floors/floor_attackby.dm index ae06cfbdf21..69ef2d48b60 100644 --- a/code/game/turfs/floors/floor_attackby.dm +++ b/code/game/turfs/floors/floor_attackby.dm @@ -93,6 +93,7 @@ new /obj/structure/catwalk(src, R.material.type) return TRUE return + var/obj/item/stack/S = C var/decl/flooring/use_flooring var/list/decls = decls_repository.get_decls_of_subtype(/decl/flooring) @@ -103,21 +104,22 @@ if((ispath(S.type, F.build_type) || ispath(S.build_type, F.build_type)) && (isnull(F.build_material) || S.material?.type == F.build_material)) use_flooring = F break - if(!use_flooring) - return - // Do we have enough? - if(use_flooring.build_cost && S.get_amount() < use_flooring.build_cost) - to_chat(user, "You require at least [use_flooring.build_cost] [S.name] to complete the [use_flooring.descriptor].") - return TRUE - // Stay still and focus... - if(use_flooring.build_time && !do_after(user, use_flooring.build_time, src)) - return TRUE - if(flooring || !S || !user || !use_flooring) - return TRUE - if(S.use(use_flooring.build_cost)) - set_flooring(use_flooring) - playsound(src, 'sound/items/Deconstruct.ogg', 80, 1) - return TRUE + + if(use_flooring) + // Do we have enough? + if(use_flooring.build_cost && S.get_amount() < use_flooring.build_cost) + to_chat(user, "You require at least [use_flooring.build_cost] [S.name] to complete the [use_flooring.descriptor].") + return TRUE + // Stay still and focus... + if(use_flooring.build_time && !do_after(user, use_flooring.build_time, src)) + return TRUE + if(flooring || !S || !user || !use_flooring) + return TRUE + if(S.use(use_flooring.build_cost)) + set_flooring(use_flooring) + playsound(src, 'sound/items/Deconstruct.ogg', 80, 1) + return TRUE + // Repairs and Deconstruction. else if(IS_CROWBAR(C)) if(is_floor_damaged()) diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index 746f4360215..7bdb4f24715 100644 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -265,15 +265,6 @@ if(W?.storage?.collection_mode && W.storage.gather_all(src, user)) return TRUE - // Must be open, but food items should not be filled from sources like this. They're open in order to add condiments, not to be poured into/out of. - // TODO: Rewrite open-container-ness or food to make this unnecessary! - if(ATOM_IS_OPEN_CONTAINER(W) && !istype(W, /obj/item/chems/food) && W.reagents && reagents?.total_volume >= FLUID_PUDDLE) - var/taking = min(reagents.total_volume, REAGENTS_FREE_SPACE(W.reagents)) - if(taking > 0) - to_chat(user, SPAN_NOTICE("You fill \the [W] with [reagents.get_primary_reagent_name()] from \the [src].")) - reagents.trans_to(W, taking) - return TRUE - if(istype(W, /obj/item) && storage && storage.use_to_pickup && storage.collection_mode) storage.gather_all(src, user) return TRUE @@ -289,6 +280,21 @@ if(IS_COIL(W) && try_build_cable(W, user)) return TRUE + if(reagents?.total_volume >= FLUID_PUDDLE) + // Must be open, but food items should not be filled from sources like this. They're open in order to add condiments, not to be poured into/out of. + // TODO: Rewrite open-container-ness or food to make this unnecessary! + if(ATOM_IS_OPEN_CONTAINER(W) && !istype(W, /obj/item/chems/food) && W.reagents) + var/taking = min(reagents.total_volume, REAGENTS_FREE_SPACE(W.reagents)) + if(taking > 0) + to_chat(user, SPAN_NOTICE("You fill \the [W] with [reagents.get_primary_reagent_name()] from \the [src].")) + reagents.trans_to(W, taking) + return TRUE + + if(user.a_intent == I_HELP) + user.visible_message(SPAN_NOTICE("\The [user] dips \the [W] into \the [reagents.get_primary_reagent_name()].")) + W.fluid_act(reagents) + return TRUE + return ..() /turf/Enter(atom/movable/mover, atom/forget) From 15deea639cfd81a63e2cedf3ffd7252b17e26e6d Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Mon, 17 Jun 2024 12:14:16 +1000 Subject: [PATCH 65/90] Added debounce to on_reagent_change(). --- code/game/atoms.dm | 17 +++++++++++++++-- code/game/machinery/biogenerator.dm | 4 ++-- code/game/machinery/kitchen/microwave.dm | 3 +-- code/game/objects/effects/chem/water.dm | 4 ++-- .../items/devices/scanners/mass_spectrometer.dm | 4 ++-- code/game/objects/items/toys.dm | 3 ++- code/game/objects/items/weapons/towels.dm | 3 ++- code/game/objects/structures/barrel.dm | 3 ++- code/game/objects/structures/fires.dm | 3 ++- code/game/objects/structures/well.dm | 3 ++- code/game/turfs/floors/natural/_natural.dm | 5 ++++- code/game/turfs/turf_fluids.dm | 3 ++- .../crafting/metalwork/metalwork_items.dm | 4 ++-- code/modules/crafting/pottery/pottery_items.dm | 4 ++-- .../cooking/cooking_vessels/_cooking_vessel.dm | 3 ++- .../integrated_electronics/passive/power.dm | 3 ++- .../integrated_electronics/subtypes/reagents.dm | 4 ++-- .../mining/machinery/material_extractor.dm | 3 +-- .../mining/machinery/material_smelter.dm | 3 +-- code/modules/reagents/Chemistry-Holder.dm | 10 ++++------ code/modules/reagents/reagent_containers.dm | 8 ++++---- .../reagents/reagent_containers/blood_pack.dm | 3 ++- .../reagents/reagent_containers/condiment.dm | 9 +++++---- .../reagent_containers/food/meat/cubes.dm | 3 +-- .../reagents/reagent_containers/syringes.dm | 4 ++-- code/modules/reagents/reagent_dispenser.dm | 3 ++- mods/content/xenobiology/slime/items.dm | 3 +-- 27 files changed, 71 insertions(+), 51 deletions(-) diff --git a/code/game/atoms.dm b/code/game/atoms.dm index c6956ac3222..f9d907336f6 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -52,12 +52,15 @@ var/tmp/default_pixel_z var/tmp/default_pixel_w - // Health vars largely used by obj and mob. + /// (FLOAT) Current remaining health value. var/current_health + /// (FLOAT) Theoretical maximum health value. var/max_health - // /datum/storage instance to use for this obj. Set to a type for instantiation on init. + /// (DATUM) /datum/storage instance to use for this obj. Set to a type for instantiation on init. var/datum/storage/storage + /// (FLOAT) world.time of last on_reagent_update call, used to prevent recursion due to reagents updating reagents + VAR_PRIVATE/_reagent_update_started = 0 /atom/proc/get_max_health() return max_health @@ -130,11 +133,21 @@ return 0 /// Handle reagents being modified +/atom/proc/try_on_reagent_change() + SHOULD_NOT_OVERRIDE(TRUE) + set waitfor = FALSE + if(_reagent_update_started >= world.time) + return FALSE + _reagent_update_started = world.time + sleep(0) // Defer to end of tick so we don't drop subsequent reagent updates. + return on_reagent_change() + /atom/proc/on_reagent_change() SHOULD_CALL_PARENT(TRUE) if(storage && reagents?.total_volume) for(var/obj/item/thing in get_stored_inventory()) thing.fluid_act(reagents) + return TRUE /** Handle an atom bumping this atom diff --git a/code/game/machinery/biogenerator.dm b/code/game/machinery/biogenerator.dm index f9d8dd660c5..b827de44877 100644 --- a/code/game/machinery/biogenerator.dm +++ b/code/game/machinery/biogenerator.dm @@ -59,8 +59,8 @@ . = ..() /obj/machinery/biogenerator/on_reagent_change() //When the reagents change, change the icon as well. - ..() - update_icon() + if((. = ..())) + update_icon() /obj/machinery/biogenerator/on_update_icon() if(state == BG_NO_BEAKER) diff --git a/code/game/machinery/kitchen/microwave.dm b/code/game/machinery/kitchen/microwave.dm index 513838af3fc..de7e5b72a2a 100644 --- a/code/game/machinery/kitchen/microwave.dm +++ b/code/game/machinery/kitchen/microwave.dm @@ -342,8 +342,7 @@ SSnano.update_uis(src) /obj/machinery/microwave/on_reagent_change() - ..() - if(!operating) + if((. = ..()) && !operating) SSnano.update_uis(src) /obj/machinery/microwave/proc/dispose(var/mob/user, var/message = TRUE) diff --git a/code/game/objects/effects/chem/water.dm b/code/game/objects/effects/chem/water.dm index fecc84fd965..ef1d2ba6096 100644 --- a/code/game/objects/effects/chem/water.dm +++ b/code/game/objects/effects/chem/water.dm @@ -10,8 +10,8 @@ QDEL_IN(src, 15 SECONDS) // In case whatever made it forgets to delete it /obj/effect/effect/water/on_reagent_change() - ..() - set_color(reagents?.get_color()) + if((. = ..())) + set_color(reagents?.get_color()) /obj/effect/effect/water/proc/set_up(var/turf/target, var/step_count = 5, var/delay = 5) if(!target) diff --git a/code/game/objects/items/devices/scanners/mass_spectrometer.dm b/code/game/objects/items/devices/scanners/mass_spectrometer.dm index 3eda6f1a4f4..4812824f742 100644 --- a/code/game/objects/items/devices/scanners/mass_spectrometer.dm +++ b/code/game/objects/items/devices/scanners/mass_spectrometer.dm @@ -14,8 +14,8 @@ create_reagents(5) /obj/item/scanner/spectrometer/on_reagent_change() - ..() - update_icon() + if((. = ..())) + update_icon() /obj/item/scanner/spectrometer/on_update_icon() . = ..() diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm index 521cd1ee0b7..5e9d3407731 100644 --- a/code/game/objects/items/toys.dm +++ b/code/game/objects/items/toys.dm @@ -64,7 +64,8 @@ to_chat(user, "It's [reagents?.total_volume > 0? "filled with liquid sloshing around" : "empty"].") /obj/item/chems/water_balloon/on_reagent_change() - ..() + if(!(. = ..())) + return w_class = (reagents?.total_volume > 0)? ITEM_SIZE_SMALL : ITEM_SIZE_TINY //#TODO: Maybe acids should handle eating their own containers themselves? for(var/reagent in reagents?.reagent_volumes) diff --git a/code/game/objects/items/weapons/towels.dm b/code/game/objects/items/weapons/towels.dm index 3ac790525ab..52c822e88c7 100644 --- a/code/game/objects/items/weapons/towels.dm +++ b/code/game/objects/items/weapons/towels.dm @@ -32,7 +32,8 @@ . = ..() /obj/item/towel/on_reagent_change() - . = ..() + if(!(. = ..())) + return if(reagents?.total_volume) SetName("damp [initial(name)]") if(!is_processing) diff --git a/code/game/objects/structures/barrel.dm b/code/game/objects/structures/barrel.dm index f5fe5dbe703..f16a56041f3 100644 --- a/code/game/objects/structures/barrel.dm +++ b/code/game/objects/structures/barrel.dm @@ -36,7 +36,8 @@ storage.handle_item_insertion(null, thing) /obj/structure/reagent_dispensers/barrel/on_reagent_change() - . = ..() + if(!(. = ..())) + return var/primary_mat = reagents?.get_primary_reagent_name() if(primary_mat) SetName("[material.solid_name] [initial(name)] of [primary_mat]") diff --git a/code/game/objects/structures/fires.dm b/code/game/objects/structures/fires.dm index 213a98fd0a2..e38befacb23 100644 --- a/code/game/objects/structures/fires.dm +++ b/code/game/objects/structures/fires.dm @@ -314,7 +314,8 @@ return (fuel > 0) /obj/structure/fire_source/on_reagent_change() - ..() + if(!(. = ..())) + return if(reagents?.total_volume) var/do_steam = FALSE var/list/waste = list() diff --git a/code/game/objects/structures/well.dm b/code/game/objects/structures/well.dm index 55957552274..44dad1274b4 100644 --- a/code/game/objects/structures/well.dm +++ b/code/game/objects/structures/well.dm @@ -21,7 +21,8 @@ add_overlay(overlay_image(icon, "[icon_state]-fluid", reagents.get_color(), (RESET_COLOR | RESET_ALPHA))) /obj/structure/reagent_dispensers/well/on_reagent_change() - . = ..() + if(!(. = ..())) + return update_icon() if(!is_processing) START_PROCESSING(SSobj, src) diff --git a/code/game/turfs/floors/natural/_natural.dm b/code/game/turfs/floors/natural/_natural.dm index 25b039c740e..83cb54ebdc5 100644 --- a/code/game/turfs/floors/natural/_natural.dm +++ b/code/game/turfs/floors/natural/_natural.dm @@ -113,7 +113,10 @@ return ..() /turf/floor/natural/on_reagent_change() - . = ..() + + if(!(. = ..())) + return + if(!QDELETED(src) && reagent_type && height < 0 && !QDELETED(reagents) && reagents.total_volume < abs(height)) add_to_reagents(reagent_type, abs(height) - reagents.total_volume) diff --git a/code/game/turfs/turf_fluids.dm b/code/game/turfs/turf_fluids.dm index 4c2b7ee2c37..3d77fb726a3 100644 --- a/code/game/turfs/turf_fluids.dm +++ b/code/game/turfs/turf_fluids.dm @@ -163,7 +163,8 @@ /turf/on_reagent_change() - ..() + if(!(. = ..())) + return if(reagents?.total_volume > FLUID_QDEL_POINT) ADD_ACTIVE_FLUID(src) diff --git a/code/modules/crafting/metalwork/metalwork_items.dm b/code/modules/crafting/metalwork/metalwork_items.dm index 29714b5ed07..fe8fc4117eb 100644 --- a/code/modules/crafting/metalwork/metalwork_items.dm +++ b/code/modules/crafting/metalwork/metalwork_items.dm @@ -55,8 +55,8 @@ return ..() /obj/item/chems/crucible/on_reagent_change() - . = ..() - queue_icon_update() + if((. = ..())) + queue_icon_update() /obj/item/chems/crucible/on_update_icon() . = ..() diff --git a/code/modules/crafting/pottery/pottery_items.dm b/code/modules/crafting/pottery/pottery_items.dm index c9ded4c8e8f..e8138fcec56 100644 --- a/code/modules/crafting/pottery/pottery_items.dm +++ b/code/modules/crafting/pottery/pottery_items.dm @@ -65,8 +65,8 @@ volume = 60 /obj/item/chems/glass/pottery/bowl/on_reagent_change() - . = ..() - update_icon() + if((. = ..())) + update_icon() /obj/item/chems/glass/pottery/bowl/on_update_icon() . = ..() diff --git a/code/modules/food/cooking/cooking_vessels/_cooking_vessel.dm b/code/modules/food/cooking/cooking_vessels/_cooking_vessel.dm index 3e27c4b4141..7acab663068 100644 --- a/code/modules/food/cooking/cooking_vessels/_cooking_vessel.dm +++ b/code/modules/food/cooking/cooking_vessels/_cooking_vessel.dm @@ -89,7 +89,8 @@ update_icon() /obj/item/chems/cooking_vessel/on_reagent_change() - . = ..() + if(!(. = ..())) + return started_cooking = null if(!is_processing) START_PROCESSING(SSobj, src) diff --git a/code/modules/integrated_electronics/passive/power.dm b/code/modules/integrated_electronics/passive/power.dm index 2e26743389d..8a5e9a6ccbe 100644 --- a/code/modules/integrated_electronics/passive/power.dm +++ b/code/modules/integrated_electronics/passive/power.dm @@ -120,7 +120,8 @@ ..() /obj/item/integrated_circuit/passive/power/chemical_cell/on_reagent_change(changetype) - ..() + if(!(. = ..())) + return set_pin_data(IC_OUTPUT, 1, reagents?.total_volume || 0) push_data() diff --git a/code/modules/integrated_electronics/subtypes/reagents.dm b/code/modules/integrated_electronics/subtypes/reagents.dm index 3f5541cab97..abffc2b0b97 100644 --- a/code/modules/integrated_electronics/subtypes/reagents.dm +++ b/code/modules/integrated_electronics/subtypes/reagents.dm @@ -50,8 +50,8 @@ var/notified = FALSE /obj/item/integrated_circuit/reagent/on_reagent_change() - ..() - push_vol() + if((. = ..())) + push_vol() /obj/item/integrated_circuit/reagent/smoke/do_work(ord) switch(ord) diff --git a/code/modules/mining/machinery/material_extractor.dm b/code/modules/mining/machinery/material_extractor.dm index 08c9ad8b7f3..10b759facec 100644 --- a/code/modules/mining/machinery/material_extractor.dm +++ b/code/modules/mining/machinery/material_extractor.dm @@ -94,9 +94,8 @@ break /obj/machinery/material_processing/extractor/on_reagent_change() - ..() - if(!reagents) + if(!(. = ..()) || !reagents) return var/adjusted_reagents = FALSE diff --git a/code/modules/mining/machinery/material_smelter.dm b/code/modules/mining/machinery/material_smelter.dm index 188fe797b5c..7223faa9c6a 100644 --- a/code/modules/mining/machinery/material_smelter.dm +++ b/code/modules/mining/machinery/material_smelter.dm @@ -26,9 +26,8 @@ // Outgas anything that is in gas form. Check what you put into the smeltery, nerds. /obj/machinery/material_processing/smeltery/on_reagent_change() - ..() - if(!reagents) + if(!(. = ..()) || !reagents) return var/datum/gas_mixture/environment = loc?.return_air() diff --git a/code/modules/reagents/Chemistry-Holder.dm b/code/modules/reagents/Chemistry-Holder.dm index 30d1af9e697..59b11b071d6 100644 --- a/code/modules/reagents/Chemistry-Holder.dm +++ b/code/modules/reagents/Chemistry-Holder.dm @@ -79,7 +79,7 @@ var/global/obj/temp_reagents_holder = new if(my_atom.reagents == src) my_atom.reagents = null if(total_volume > 0) // we can assume 0 reagents and null reagents are broadly identical for the purposes of atom logic - my_atom.on_reagent_change() + my_atom.try_on_reagent_change() my_atom = null /datum/reagents/GetCloneArgs() @@ -235,16 +235,14 @@ var/global/obj/temp_reagents_holder = new update_total() if(!safety) HANDLE_REACTIONS(src) - if(my_atom) - my_atom.on_reagent_change() + my_atom?.try_on_reagent_change() ///Set and call updates on the target holder. /datum/reagents/proc/set_holder(var/obj/new_holder) if(my_atom == new_holder) return my_atom = new_holder - if(my_atom) - my_atom.on_reagent_change() + my_atom?.try_on_reagent_change() handle_update() /datum/reagents/proc/add_reagent(var/reagent_type, var/amount, var/data = null, var/safety = 0, var/defer_update = FALSE) @@ -333,7 +331,7 @@ var/global/obj/temp_reagents_holder = new LAZYCLEARLIST(reagent_volumes) LAZYCLEARLIST(reagent_data) total_volume = 0 - my_atom?.on_reagent_change() + my_atom?.try_on_reagent_change() /datum/reagents/proc/get_overdose(var/decl/material/current) if(current) diff --git a/code/modules/reagents/reagent_containers.dm b/code/modules/reagents/reagent_containers.dm index 6e3fd788761..c1237db561e 100644 --- a/code/modules/reagents/reagent_containers.dm +++ b/code/modules/reagents/reagent_containers.dm @@ -79,10 +79,10 @@ desc = new_desc_list.Join("\n") /obj/item/chems/on_reagent_change() - ..() - update_container_name() - update_container_desc() - update_icon() + if((. = ..())) + update_container_name() + update_container_desc() + update_icon() /obj/item/chems/verb/set_amount_per_transfer_from_this() set name = "Set Transfer Amount" diff --git a/code/modules/reagents/reagent_containers/blood_pack.dm b/code/modules/reagents/reagent_containers/blood_pack.dm index 60d34cefd8f..0cf84ba6e7a 100644 --- a/code/modules/reagents/reagent_containers/blood_pack.dm +++ b/code/modules/reagents/reagent_containers/blood_pack.dm @@ -25,7 +25,8 @@ . = ..() /obj/item/chems/ivbag/on_reagent_change() - ..() + if(!(. = ..())) + return if(reagents?.total_volume > volume/2) w_class = ITEM_SIZE_SMALL else diff --git a/code/modules/reagents/reagent_containers/condiment.dm b/code/modules/reagents/reagent_containers/condiment.dm index 60387824b71..5e7d21528cd 100644 --- a/code/modules/reagents/reagent_containers/condiment.dm +++ b/code/modules/reagents/reagent_containers/condiment.dm @@ -42,11 +42,12 @@ if(length(tmp_label)) to_chat(user, SPAN_NOTICE("You set the label to \"[tmp_label]\".")) label_text = tmp_label - name = addtext(name," ([label_text])") else to_chat(user, SPAN_NOTICE("You remove the label.")) label_text = null - on_reagent_change() + update_container_name() + update_container_desc() + update_icon() return /obj/item/chems/condiment/afterattack(var/obj/target, var/mob/user, var/proximity) @@ -77,8 +78,8 @@ /obj/item/chems/condiment/on_reagent_change() is_special_bottle = reagents?.total_volume && special_bottles[reagents?.primary_reagent] - ..() - update_center_of_mass() + if((. = ..())) + update_center_of_mass() /obj/item/chems/condiment/update_container_name() name = is_special_bottle ? initial(is_special_bottle.name) : initial(name) diff --git a/code/modules/reagents/reagent_containers/food/meat/cubes.dm b/code/modules/reagents/reagent_containers/food/meat/cubes.dm index 8be79bc8347..53bddf3aabe 100644 --- a/code/modules/reagents/reagent_containers/food/meat/cubes.dm +++ b/code/modules/reagents/reagent_containers/food/meat/cubes.dm @@ -54,8 +54,7 @@ Expand(get_turf(target)) /obj/item/chems/food/monkeycube/on_reagent_change() - ..() - if(!QDELETED(src) && reagents?.has_reagent(/decl/material/liquid/water)) + if((. = ..()) && !QDELETED(src) && reagents?.has_reagent(/decl/material/liquid/water)) Expand() /obj/item/chems/food/monkeycube/wrapped diff --git a/code/modules/reagents/reagent_containers/syringes.dm b/code/modules/reagents/reagent_containers/syringes.dm index 1938f0607a4..5655497ae6f 100644 --- a/code/modules/reagents/reagent_containers/syringes.dm +++ b/code/modules/reagents/reagent_containers/syringes.dm @@ -39,8 +39,8 @@ /obj/item/chems/syringe/on_reagent_change() - . = ..() - update_icon() + if((. = ..())) + update_icon() /obj/item/chems/syringe/on_picked_up(mob/user) . = ..() diff --git a/code/modules/reagents/reagent_dispenser.dm b/code/modules/reagents/reagent_dispenser.dm index c36c615d139..f8c05d3172c 100644 --- a/code/modules/reagents/reagent_dispenser.dm +++ b/code/modules/reagents/reagent_dispenser.dm @@ -34,7 +34,8 @@ atom_flags = old_atom_flags /obj/structure/reagent_dispensers/on_reagent_change() - ..() + if(!(. = ..())) + return if(reagents?.total_volume > 0) tool_interaction_flags = 0 else diff --git a/mods/content/xenobiology/slime/items.dm b/mods/content/xenobiology/slime/items.dm index df20c560312..2646db9ac21 100644 --- a/mods/content/xenobiology/slime/items.dm +++ b/mods/content/xenobiology/slime/items.dm @@ -50,8 +50,7 @@ add_to_reagents(/decl/material/liquid/slimejelly, 30) /obj/item/slime_extract/on_reagent_change() - ..() - if(reagents?.total_volume) + if((. = ..()) && reagents?.total_volume) var/decl/slime_colour/slime_data = GET_DECL(slime_type) slime_data.handle_reaction(reagents) From 45e8f30c74d636efd1a569f0bbd243eb53b0151b Mon Sep 17 00:00:00 2001 From: NebulaSS13Bot Date: Thu, 20 Jun 2024 09:03:46 +1000 Subject: [PATCH 66/90] Automatic changelog generation for PR #4120 [ci skip] --- html/changelogs/AutoChangeLog-pr-4120.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4120.yml diff --git a/html/changelogs/AutoChangeLog-pr-4120.yml b/html/changelogs/AutoChangeLog-pr-4120.yml new file mode 100644 index 00000000000..2d394105c6e --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4120.yml @@ -0,0 +1,5 @@ +author: MistakeNot4892 +changes: + - {tweak: 'You can now dip things like stacks of skin into barrels of water, wells + or rivers.'} +delete-after: true From a959e3cc9927c40334a2e25d382353f8d94b5d98 Mon Sep 17 00:00:00 2001 From: NebulaSS13Bot Date: Thu, 20 Jun 2024 00:40:01 +0000 Subject: [PATCH 67/90] Automatic changelog generation [ci skip] --- html/changelog.html | 14 ++++++-------- html/changelogs/.all_changelog.yml | 4 ++++ html/changelogs/AutoChangeLog-pr-4120.yml | 5 ----- 3 files changed, 10 insertions(+), 13 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-4120.yml diff --git a/html/changelog.html b/html/changelog.html index b88c73c2662..e2f23aa92d6 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -52,6 +52,12 @@ -->
    +

    20 June 2024

    +

    MistakeNot4892 updated:

    +
      +
    • You can now dip things like stacks of skin into barrels of water, wells or rivers.
    • +
    +

    19 June 2024

    Penelope Haze updated:

      @@ -157,14 +163,6 @@

      MistakeNot4892 updated:

    • Running to exhaustion will now cause a mood stressor.
    • Sleeping in a bed for thirty seconds will remove exhaustion and add a well rested mood boost.
    - -

    18 April 2024

    -

    MistakeNot4892 updated:

    -
      -
    • Closets can now be locked with a physical lock.
    • -
    • Vox must now pick between pressure resistance and speed using the Toggle Pressure Seal verb.
    • -
    • Lots of cooking changes! Refer to PR #3704 on the Nebula GitHub for specific details.
    • -
    diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index 00c595c8515..e7f89d1c8cc 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -14771,3 +14771,7 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. - experiment: Ammo magazines will not initialize their contents until first interacted with, which makes startup faster but could cause bugs. Report any issues on the issue tracker! +2024-06-20: + MistakeNot4892: + - tweak: You can now dip things like stacks of skin into barrels of water, wells + or rivers. diff --git a/html/changelogs/AutoChangeLog-pr-4120.yml b/html/changelogs/AutoChangeLog-pr-4120.yml deleted file mode 100644 index 2d394105c6e..00000000000 --- a/html/changelogs/AutoChangeLog-pr-4120.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: MistakeNot4892 -changes: - - {tweak: 'You can now dip things like stacks of skin into barrels of water, wells - or rivers.'} -delete-after: true From 5590a2aa6ff3dfac041ca4963a77cfa5609dc437 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Wed, 19 Jun 2024 15:20:54 +1000 Subject: [PATCH 68/90] Added shrine and associated jobs to Shaded Hills. --- code/game/gamemodes/game_mode.dm | 2 +- code/game/machinery/computer/arcade_orion.dm | 2 +- code/game/turfs/unsimulated/floor.dm | 6 + code/modules/awaymissions/pamphlet.dm | 2 +- code/modules/clothing/neck/jewelry.dm | 17 +- code/modules/clothing/suits/fated_mantle.dm | 4 - code/modules/clothing/suits/mantle.dm | 8 + code/modules/codex/entries/guides.dm | 2 +- .../fabrication/designs/textile/gimmick.dm | 5 +- .../fabrication/designs/textile/overwear.dm | 5 +- code/modules/hydroponics/seed_packets.dm | 15 + code/modules/overmap/_overmap.dm | 2 +- code/modules/projectiles/projectile/energy.dm | 4 +- code/procs/AStar.dm | 2 +- .../accessories/jewelry/prayer_beads.dmi | Bin 0 -> 558 bytes icons/clothing/suits/mantle.dmi | Bin 0 -> 676 bytes maps/shaded_hills/_shaded_hills_defines.dm | 2 +- maps/shaded_hills/areas/downlands.dm | 9 + maps/shaded_hills/icons/hud.dmi | Bin 503 -> 539 bytes maps/shaded_hills/jobs/_jobs.dm | 9 +- maps/shaded_hills/jobs/shrine.dm | 57 + maps/shaded_hills/jobs/visitors.dm | 27 +- maps/shaded_hills/outfits/shrine.dm | 9 + maps/shaded_hills/outfits/visitors.dm | 7 + maps/shaded_hills/shaded_hills-inn.dmm | 2676 ++++++++++------- maps/shaded_hills/shaded_hills.dm | 2 + .../fantasy/items/clothing/_loadout.dm | 21 + nebula.dme | 2 +- 28 files changed, 1729 insertions(+), 1168 deletions(-) delete mode 100644 code/modules/clothing/suits/fated_mantle.dm create mode 100644 code/modules/clothing/suits/mantle.dm create mode 100644 icons/clothing/accessories/jewelry/prayer_beads.dmi create mode 100644 icons/clothing/suits/mantle.dmi create mode 100644 maps/shaded_hills/jobs/shrine.dm create mode 100644 maps/shaded_hills/outfits/shrine.dm diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm index 8fca9e3f5cf..d017c0e7087 100644 --- a/code/game/gamemodes/game_mode.dm +++ b/code/game/gamemodes/game_mode.dm @@ -295,7 +295,7 @@ var/global/list/additional_antag_types = list() "REDACTED", "ancient alien artillery", "solar magnetic storms", - "sentient time-travelling killbots", + "sentient time-traveling killbots", "gravitational anomalies", "wormholes to another dimension", "a telescience mishap", diff --git a/code/game/machinery/computer/arcade_orion.dm b/code/game/machinery/computer/arcade_orion.dm index bd47447a26d..fa46c1bd251 100644 --- a/code/game/machinery/computer/arcade_orion.dm +++ b/code/game/machinery/computer/arcade_orion.dm @@ -473,7 +473,7 @@ /obj/item/orion_ship name = "model settler ship" - desc = "A model spaceship, it looks like those used back in the day when travelling to Orion! It even has a miniature FX-293 reactor, which was renowned for its instability and tendency to explode..." + desc = "A model spaceship, it looks like those used back in the day when traveling to Orion! It even has a miniature FX-293 reactor, which was renowned for its instability and tendency to explode..." icon = 'icons/obj/toy/toy.dmi' icon_state = "ship" w_class = ITEM_SIZE_SMALL diff --git a/code/game/turfs/unsimulated/floor.dm b/code/game/turfs/unsimulated/floor.dm index a8e69ac96e8..2bb713b9a09 100644 --- a/code/game/turfs/unsimulated/floor.dm +++ b/code/game/turfs/unsimulated/floor.dm @@ -18,6 +18,12 @@ icon = 'icons/turf/walls.dmi' icon_state = "rockvault" +/turf/unsimulated/mask_alt // just a second mask type for maps needing two random map runs + name = "mask" + icon = 'icons/turf/walls.dmi' + icon_state = "rockvault" + color = COLOR_SILVER + /turf/unsimulated/mask/flooded flooded = /decl/material/liquid/water color = COLOR_LIQUID_WATER diff --git a/code/modules/awaymissions/pamphlet.dm b/code/modules/awaymissions/pamphlet.dm index a76578178fa..b694e8aa7e7 100644 --- a/code/modules/awaymissions/pamphlet.dm +++ b/code/modules/awaymissions/pamphlet.dm @@ -23,7 +23,7 @@ may cause the estimate to be inaccurate, but will not interrupt the searching process.

    \ Life On The Other Side
    \ Once you have traversed the Gateway, you may experience some disorientation. Do not panic. \ - This is a normal side effect of travelling vast distances in a short period of time. You should \ + This is a normal side effect of traveling vast distances in a short period of time. You should \ survey the immediate area, and attempt to locate your complimentary case of space beer. Our \ expeditionary teams have ensured the complete safety of all away locations, but in a small \ number of cases, the Gateway they have established may not be immediately obvious. \ diff --git a/code/modules/clothing/neck/jewelry.dm b/code/modules/clothing/neck/jewelry.dm index 84eb9eb321d..9f30ace8ac8 100644 --- a/code/modules/clothing/neck/jewelry.dm +++ b/code/modules/clothing/neck/jewelry.dm @@ -3,10 +3,23 @@ desc = "A simple necklace." icon = 'icons/clothing/accessories/jewelry/necklace.dmi' material = /decl/material/solid/metal/silver + material_alteration = MAT_FLAG_ALTERATION_COLOR | MAT_FLAG_ALTERATION_NAME | MAT_FLAG_ALTERATION_DESC + +/obj/item/clothing/neck/necklace/prayer_beads + name = "prayer beads" + desc = "A string of smooth, polished beads." + icon = 'icons/clothing/accessories/jewelry/prayer_beads.dmi' + material = /decl/material/solid/organic/wood/ebony + +/obj/item/clothing/neck/necklace/prayer_beads/gold + material = /decl/material/solid/metal/gold + +/obj/item/clothing/neck/necklace/prayer_beads/basalt + material = /decl/material/solid/stone/basalt /obj/item/clothing/neck/necklace/locket - name = "silver locket" - desc = "A silver locket that seems to have space for a photo within." + name = "locket" + desc = "A locket that seems to have space for a photo within." icon = 'icons/clothing/accessories/jewelry/locket.dmi' var/open var/obj/item/held diff --git a/code/modules/clothing/suits/fated_mantle.dm b/code/modules/clothing/suits/fated_mantle.dm deleted file mode 100644 index 4086cc6df32..00000000000 --- a/code/modules/clothing/suits/fated_mantle.dm +++ /dev/null @@ -1,4 +0,0 @@ -/obj/item/clothing/suit/fated - name = "mantle" - desc = "A heavy, gold-chained mantle." - icon = 'icons/clothing/suits/fated_mantle.dmi' diff --git a/code/modules/clothing/suits/mantle.dm b/code/modules/clothing/suits/mantle.dm new file mode 100644 index 00000000000..9897f9f8254 --- /dev/null +++ b/code/modules/clothing/suits/mantle.dm @@ -0,0 +1,8 @@ +/obj/item/clothing/suit/mantle + name = "mantle" + desc = "A light garment worn draped over and around the shoulders." + icon = 'icons/clothing/suits/mantle.dmi' + +/obj/item/clothing/suit/mantle/fated + desc = "A heavy, gold-chained mantle." + icon = 'icons/clothing/suits/fated_mantle.dmi' diff --git a/code/modules/codex/entries/guides.dm b/code/modules/codex/entries/guides.dm index a0a90e94640..d237aad5edf 100644 --- a/code/modules/codex/entries/guides.dm +++ b/code/modules/codex/entries/guides.dm @@ -102,7 +102,7 @@

    Cyborg Repairs

    - Occasionally a Cyborg may become damaged. This could be in the form of impact damage from a heavy or fast-travelling object, or it could be heat damage from high temperatures, or even lasers or Electromagnetic Pulses (EMPs). + Occasionally a Cyborg may become damaged. This could be in the form of impact damage from a heavy or fast-traveling object, or it could be heat damage from high temperatures, or even lasers or Electromagnetic Pulses (EMPs).

    Dents

    If a cyborg becomes damaged due to impact from heavy or fast-moving objects, it will become dented. Sure, a dent may not seem like much, but it can compromise the structural integrity of the cyborg, possibly causing a critical failure. diff --git a/code/modules/fabrication/designs/textile/gimmick.dm b/code/modules/fabrication/designs/textile/gimmick.dm index 1f785a0f382..97f4344e531 100644 --- a/code/modules/fabrication/designs/textile/gimmick.dm +++ b/code/modules/fabrication/designs/textile/gimmick.dm @@ -10,7 +10,7 @@ path = /obj/item/clothing/suit/redtag /datum/fabricator_recipe/textiles/gimmick/mantle - path = /obj/item/clothing/suit/fated + path = /obj/item/clothing/suit/mantle/fated /datum/fabricator_recipe/textiles/gimmick/syndicatefake path = /obj/item/clothing/suit/syndicatefake @@ -111,9 +111,6 @@ /datum/fabricator_recipe/textiles/gimmick/capjacket path = /obj/item/clothing/suit/jacket/captain -/datum/fabricator_recipe/textiles/gimmick/robe - path = /obj/item/clothing/suit/robe - /datum/fabricator_recipe/textiles/gimmick/xeno path = /obj/item/clothing/head/xeno/scarf diff --git a/code/modules/fabrication/designs/textile/overwear.dm b/code/modules/fabrication/designs/textile/overwear.dm index 3d6c77b5e43..52218db5138 100644 --- a/code/modules/fabrication/designs/textile/overwear.dm +++ b/code/modules/fabrication/designs/textile/overwear.dm @@ -76,4 +76,7 @@ path = /obj/item/clothing/suit/poncho/engineering /datum/fabricator_recipe/textiles/overwear/poncho9 - path = /obj/item/clothing/suit/poncho/cargo \ No newline at end of file + path = /obj/item/clothing/suit/poncho/cargo + +/datum/fabricator_recipe/textiles/overwear/mantle + path = /obj/item/clothing/suit/mantle diff --git a/code/modules/hydroponics/seed_packets.dm b/code/modules/hydroponics/seed_packets.dm index 4993c7cfd88..d821135f6b5 100644 --- a/code/modules/hydroponics/seed_packets.dm +++ b/code/modules/hydroponics/seed_packets.dm @@ -367,3 +367,18 @@ /obj/item/seeds/extracted/foxglove seed = "foxglove" + +/obj/item/seeds/extracted/cabbage + seed = "cabbage" + +/obj/item/seeds/extracted/carrot + seed = "carrot" + +/obj/item/seeds/extracted/potato + seed = "potato" + +/obj/item/seeds/extracted/wheat + seed = "wheat" + +/obj/item/seeds/extracted/rice + seed = "rice" diff --git a/code/modules/overmap/_overmap.dm b/code/modules/overmap/_overmap.dm index 800aac57d8d..a6e612048d3 100644 --- a/code/modules/overmap/_overmap.dm +++ b/code/modules/overmap/_overmap.dm @@ -96,7 +96,7 @@ ny = TRANSITIONEDGE + 2 nx = rand(TRANSITIONEDGE + 2, world.maxx - TRANSITIONEDGE - 2) - testing("[name]: [A] ([A.z],[A.y],[A.z]) travelling from [M] ([M.x],[M.y]).") + testing("[name]: [A] ([A.z],[A.y],[A.z]) traveling from [M] ([M.x],[M.y]).") var/turf/map = locate(M.x,M.y,assigned_z) var/obj/effect/overmap/visitable/TM diff --git a/code/modules/projectiles/projectile/energy.dm b/code/modules/projectiles/projectile/energy.dm index 51d5d585f85..04b0eeb4498 100644 --- a/code/modules/projectiles/projectile/energy.dm +++ b/code/modules/projectiles/projectile/energy.dm @@ -7,14 +7,14 @@ damage_flags = 0 distance_falloff = 2.5 -//releases a burst of light on impact or after travelling a distance +//releases a burst of light on impact or after traveling a distance /obj/item/projectile/energy/flash name = "chemical shell" icon_state = "bullet" fire_sound = 'sound/weapons/gunshot/gunshot_pistol.ogg' damage = 5 agony = 20 - life_span = 15 //if the shell hasn't hit anything after travelling this far it just explodes. + life_span = 15 //if the shell hasn't hit anything after traveling this far it just explodes. muzzle_type = /obj/effect/projectile/muzzle/bullet var/flash_range = 1 var/brightness = 7 diff --git a/code/procs/AStar.dm b/code/procs/AStar.dm index 01e4213f805..50dbf333fef 100644 --- a/code/procs/AStar.dm +++ b/code/procs/AStar.dm @@ -34,7 +34,7 @@ length to avoid portals or something i guess?? Not that they're counted right no // Modified to provide ID argument - supplied to 'adjacent' proc, defaults to null // Used for checking if route exists through a door which can be opened -// Also added 'exclude' turf to avoid travelling over; defaults to null +// Also added 'exclude' turf to avoid traveling over; defaults to null /PathNode var/datum/position diff --git a/icons/clothing/accessories/jewelry/prayer_beads.dmi b/icons/clothing/accessories/jewelry/prayer_beads.dmi new file mode 100644 index 0000000000000000000000000000000000000000..e36f6d8ac70fc23aab1d4107e7c7b15e1d47ef3b GIT binary patch literal 558 zcmV+}0@3}6P)i?^C?`dUi!&v&s2IpMTHC*PY@lQ$;%JqsWAY2 zxJESjms`Xs6?9J;XyZY#!yx51k9fLM2{s-g%lf8ERbDjWy}yB5*i)@`$~p=yauz^-R2;iT21MvhD&B6Gm#Q*>R07*qoM6N<$f^}r~ivR!s literal 0 HcmV?d00001 diff --git a/icons/clothing/suits/mantle.dmi b/icons/clothing/suits/mantle.dmi new file mode 100644 index 0000000000000000000000000000000000000000..4800dc50bfaeff0bbb20c726da8c08ec34b9970a GIT binary patch literal 676 zcmV;V0$crwP)D@x2wg|OkOGV{t(^GfoIDhaC0D9ugG%g;NklU z5Jd-!r~xBtjFD@wBiB(9vU;z_8j`AXhsL1p6CX^~6JbO7F z6~vKRzlU1iA?*CDYHA3I)g`%t!?nH;1E{A5p*ugj2B3gxvccimpz6rLw4>Z(X0gHY z#|j%iy9U61P9M7lhjI-*`shFDus~d8EiI6AQzrp&{F0&~1;RJ47i%#UqDXOp1a>0001h1Oos70Det>D3Kv90pXEQ z6n~S!Zo)7OhR@AYL~x(Bu`3q@LLA0BxQ%J7q|W3R`ue0);x@^*-_qyU{vB`q;dH)S z{qgtW9w?Ox`@R49_;lS&L1PPc->!>DW7IXM3W`l`Hm(aKwaG8n-2^6F^&5!yaOcEj zW((S9;A8@E96=H}TLh{vG~O~ZdFTYtJ9U+3}! zk0bZLTv0Z~0002WNklD(>lJRs+u!_wcf8cP;Q#v1XTf zRs)ZUHM%UT8u+gGN|wha9TnpQDO%EyzdiS}7Ue70vWx{=n6qF_vlgrsy#@D*-h%!> z`zyOYihXR{gKhuy+?#`a`wAPZK{`AF4B{cB>yA-fchJlFtB4%fUzYU1k4pdm00000 f000000RH0%INA%d5a=Ll00000NkvXXu0mjf;{e>n delta 453 zcmV;$0XqJh1os0WiBL{Q4GJ0x0000DNk~Le0001h0001h1Oos705K4J_>mzl0mzY1 z6o1ms3c@f92JrLx6lLDUe^)Ouksb6MGMlZXT`FnjUf-$UO~~yF{AkOUuI%Z2X>Yc< zw&sakLMD5(hxNu(b8zC9VZSq#$1r&L4n;t4iFIu%7q~2OYpR}M#BcrqKe>q_<(V|J zOF&TtaTtIjy`QAV z2B9aA8#K}r6i!gN|CxlEwBVxV=j(E2MJDLJ-)h_rs1ONa40000000000_!d7qykQHo0`#bL00000NkvXXu0mjfKMlk% diff --git a/maps/shaded_hills/jobs/_jobs.dm b/maps/shaded_hills/jobs/_jobs.dm index bc6cb96e76d..0f83c06a161 100644 --- a/maps/shaded_hills/jobs/_jobs.dm +++ b/maps/shaded_hills/jobs/_jobs.dm @@ -12,8 +12,11 @@ /datum/job/shaded_hills/inn/bartender, /datum/job/shaded_hills/inn/farmer, /datum/job/shaded_hills/caves/dweller, + /datum/job/shaded_hills/shrine/keeper, + /datum/job/shaded_hills/shrine/attendant, + /datum/job/shaded_hills/visitor/traveller/cleric ) - default_job_type = /datum/job/shaded_hills/visitor/traveller + default_job_type = /datum/job/shaded_hills/visitor/traveller default_department_type = /decl/department/shaded_hills/visitors species_to_job_whitelist = list( /decl/species/grafadreka = list( @@ -30,7 +33,9 @@ species_to_job_blacklist = list( /decl/species/kobaloi = list( /datum/job/shaded_hills/visitor/beggar_knight, - /datum/job/shaded_hills/inn/innkeeper + /datum/job/shaded_hills/inn/innkeeper, + /datum/job/shaded_hills/shrine/keeper, + /datum/job/shaded_hills/visitor/traveller/cleric ) ) diff --git a/maps/shaded_hills/jobs/shrine.dm b/maps/shaded_hills/jobs/shrine.dm new file mode 100644 index 00000000000..d68077a7d9a --- /dev/null +++ b/maps/shaded_hills/jobs/shrine.dm @@ -0,0 +1,57 @@ +/decl/department/shaded_hills/shrine + name = "Shrine Attendants" + colour = "#404e68" + display_color = "#8c96c4" + +/datum/job/shaded_hills/shrine + abstract_type = /datum/job/shaded_hills/shrine + department_types = list(/decl/department/shaded_hills/shrine) + skill_points = 20 + +/datum/job/shaded_hills/shrine/keeper + title = "Shrine Keeper" + supervisors = "your vows, and your faith" + description = "You are the leader of the local religious order, living and working within the shrine. You are expected to see to both the spiritual and physical health of the populace, as well as travellers, if they can offer appropriate tithe." + spawn_positions = 1 + total_positions = 1 + outfit_type = /decl/hierarchy/outfit/job/shaded_hills/shrine/keeper + min_skill = list( + SKILL_LITERACY = SKILL_ADEPT, + SKILL_MEDICAL = SKILL_ADEPT, + SKILL_ANATOMY = SKILL_ADEPT, + ) + max_skill = list( + SKILL_MEDICAL = SKILL_MAX, + SKILL_ANATOMY = SKILL_MAX, + ) + skill_points = 24 + +/obj/abstract/landmark/start/shaded_hills/shrine_keeper + name = "Shrine Keeper" + +/datum/job/shaded_hills/shrine/attendant + title = "Shrine Attendant" + supervisors = "the Shrine Keeper, your vows, and your faith" + description = "You are an acolyte of the local religious order, living and working within the shrine. Under the direction of the shrine keeper, you are expected to tend to the shrine and the grounds, and to produce food or other goods for use or trade to support the clergy." + spawn_positions = 2 + total_positions = 2 + outfit_type = /decl/hierarchy/outfit/job/shaded_hills/shrine + min_skill = list( + SKILL_STONEMASONRY = SKILL_BASIC, + SKILL_CARPENTRY = SKILL_BASIC, + SKILL_TEXTILES = SKILL_BASIC, + SKILL_COOKING = SKILL_BASIC, + SKILL_BOTANY = SKILL_BASIC, + SKILL_ATHLETICS = SKILL_ADEPT, + SKILL_MEDICAL = SKILL_ADEPT, + SKILL_ANATOMY = SKILL_ADEPT, + ) + max_skill = list( + SKILL_COOKING = SKILL_EXPERT, + SKILL_BOTANY = SKILL_EXPERT, + SKILL_MEDICAL = SKILL_EXPERT, + SKILL_ANATOMY = SKILL_EXPERT, + ) + +/obj/abstract/landmark/start/shaded_hills/shrine_attendant + name = "Shrine Attendant" diff --git a/maps/shaded_hills/jobs/visitors.dm b/maps/shaded_hills/jobs/visitors.dm index 77f2bdbdb2a..bf9b6c4674c 100644 --- a/maps/shaded_hills/jobs/visitors.dm +++ b/maps/shaded_hills/jobs/visitors.dm @@ -27,7 +27,7 @@ description = "You are a skilled professional who has traveled to this area from elsewhere. You may be a doctor, a scholar, a monk, or some other highly-educated individual with rare skills. Whatever your reason for coming here, you are likely one of the only individuals in the area to possess your unique skillset." spawn_positions = 2 total_positions = 2 - outfit_type = /decl/hierarchy/outfit/job/shaded_hills/traveller + outfit_type = /decl/hierarchy/outfit/job/shaded_hills/traveller/scholar skill_points = 24 min_skill = list( SKILL_LITERACY = SKILL_ADEPT @@ -64,3 +64,28 @@ /obj/abstract/landmark/start/shaded_hills/beggar_knight name = "Beggar Knight" + + +/datum/job/shaded_hills/visitor/traveller/cleric + title = "Traveling Cleric" + supervisors = "your vows, and your faith" + description = "You are an ordained person of faith, traveling the lands on the business of your order, to preach, or simply to experience new people and cultures. You are battle-trained, but are also a healer." + spawn_positions = 2 + total_positions = 2 + outfit_type = /decl/hierarchy/outfit/job/shaded_hills/traveller/cleric + min_skill = list( + SKILL_WEAPONS = SKILL_ADEPT, + SKILL_ATHLETICS = SKILL_ADEPT, + SKILL_MEDICAL = SKILL_ADEPT, + SKILL_ANATOMY = SKILL_ADEPT, + ) + max_skill = list( + SKILL_WEAPONS = SKILL_MAX, + SKILL_MEDICAL = SKILL_MAX, + SKILL_ANATOMY = SKILL_MAX, + ) + skill_points = 22 + +/obj/abstract/landmark/start/shaded_hills/cleric + name = "Traveling Cleric" + diff --git a/maps/shaded_hills/outfits/shrine.dm b/maps/shaded_hills/outfits/shrine.dm new file mode 100644 index 00000000000..6f96a09d6bd --- /dev/null +++ b/maps/shaded_hills/outfits/shrine.dm @@ -0,0 +1,9 @@ +/decl/hierarchy/outfit/job/shaded_hills/shrine + name = "Shaded Hills - Shrine Attendant" + uniform = /obj/item/clothing/suit/robe + shoes = /obj/item/clothing/shoes/sandal + +/decl/hierarchy/outfit/job/shaded_hills/shrine/keeper + name = "Shaded Hills - Shrine Keeper" + suit = /obj/item/clothing/suit/mantle + mask = /obj/item/clothing/neck/necklace/prayer_beads/basalt diff --git a/maps/shaded_hills/outfits/visitors.dm b/maps/shaded_hills/outfits/visitors.dm index 1f93dec202b..bb85da218da 100644 --- a/maps/shaded_hills/outfits/visitors.dm +++ b/maps/shaded_hills/outfits/visitors.dm @@ -10,3 +10,10 @@ /obj/item/stack/medical/ointment/poultice/five = 1, /obj/item/chems/waterskin/crafted/wine = 1 ) + +/decl/hierarchy/outfit/job/shaded_hills/traveller/scholar + name = "Shaded Hills - Traveling Scholar" + +/decl/hierarchy/outfit/job/shaded_hills/traveller/cleric + name = "Shaded Hills - Traveling Cleric" + diff --git a/maps/shaded_hills/shaded_hills-inn.dmm b/maps/shaded_hills/shaded_hills-inn.dmm index 7e02733fa57..7a406ca7c15 100644 --- a/maps/shaded_hills/shaded_hills-inn.dmm +++ b/maps/shaded_hills/shaded_hills-inn.dmm @@ -16,6 +16,11 @@ /obj/structure/closet/crate/chest, /turf/floor/natural/path/basalt, /area/shaded_hills/general_store) +"bW" = ( +/obj/structure/table/woodentable/ebony, +/obj/item/chems/cooking_vessel/skillet, +/turf/floor/wood/ebony, +/area/shaded_hills/shrine) "cl" = ( /obj/structure/table/woodentable/ebony, /turf/floor/wood/ebony, @@ -28,6 +33,19 @@ "cx" = ( /turf/wall/brick/basalt, /area/shaded_hills/outside/downlands) +"cy" = ( +/obj/structure/reagent_dispensers/barrel/ebony/water, +/turf/floor/wood/ebony, +/area/shaded_hills/shrine) +"cT" = ( +/obj/structure/railing/mapped/ebony{ + dir = 1 + }, +/obj/structure/railing/mapped/ebony{ + dir = 4 + }, +/turf/floor/natural/grass, +/area/shaded_hills/outside/shrine) "dC" = ( /obj/structure/door/wood/ebony, /turf/floor/natural/path/herringbone/basalt, @@ -46,6 +64,10 @@ }, /turf/floor/wood/ebony, /area/shaded_hills/inn) +"ev" = ( +/obj/structure/closet/crate/chest/ebony, +/turf/floor/natural/path/herringbone/basalt, +/area/shaded_hills/shrine) "eD" = ( /obj/structure/textiles/loom/ebony, /turf/floor/wood/ebony, @@ -54,6 +76,14 @@ /obj/structure/door/wood/ebony, /turf/floor/wood/ebony, /area/shaded_hills/general_store) +"fg" = ( +/obj/structure/railing/mapped/ebony, +/obj/structure/railing/mapped/ebony{ + dir = 4 + }, +/obj/structure/reagent_dispensers/compost_bin, +/turf/floor/natural/dirt, +/area/shaded_hills/outside/shrine) "fh" = ( /obj/structure/table/marble, /obj/item/chems/glass/pottery/cup, @@ -67,6 +97,9 @@ /obj/item/chems/glass/pottery/mug, /turf/floor/natural/path/herringbone/basalt, /area/shaded_hills/inn) +"ft" = ( +/turf/floor/natural/mud, +/area/shaded_hills/outside/shrine) "fK" = ( /obj/structure/reagent_dispensers/barrel/ebony/water, /turf/floor/natural/path/herringbone/basalt, @@ -101,10 +134,26 @@ }, /turf/floor/natural/grass, /area/shaded_hills/outside/downlands) +"gt" = ( +/obj/structure/wall_sconce/lantern{ + dir = 8 + }, +/turf/floor/wood/ebony, +/area/shaded_hills/shrine) +"gA" = ( +/obj/structure/railing/mapped/ebony{ + dir = 8 + }, +/turf/floor/natural/grass, +/area/shaded_hills/outside/shrine) "gB" = ( /obj/structure/wall_sconce/lantern, /turf/floor/wood/ebony, /area/shaded_hills/farmhouse) +"gL" = ( +/obj/structure/reagent_dispensers/barrel/ebony/oil, +/turf/floor/natural/path/herringbone/basalt, +/area/shaded_hills/shrine) "gR" = ( /obj/structure/table/marble, /obj/item/chems/condiment/flour, @@ -164,6 +213,9 @@ /obj/abstract/landmark/lock_preset/shaded_hills/inn_interior, /turf/floor/natural/path/herringbone/basalt, /area/shaded_hills/inn) +"iK" = ( +/turf/wall/brick/basalt, +/area/shaded_hills/outside/shrine) "iX" = ( /obj/structure/window/basic/full, /turf/floor/natural/path/basalt, @@ -179,6 +231,13 @@ }, /turf/floor/wood/ebony, /area/shaded_hills/stable) +"jk" = ( +/obj/structure/bed/chair/bench/pew/mahogany{ + dir = 1 + }, +/obj/abstract/landmark/start/shaded_hills/cleric, +/turf/floor/wood/ebony, +/area/shaded_hills/shrine) "js" = ( /turf/floor/wood/ebony, /area/shaded_hills/stable) @@ -200,6 +259,17 @@ /obj/item/bedsheet/furs, /turf/floor/wood/ebony, /area/shaded_hills/stable) +"ke" = ( +/obj/structure/wall_sconce/lantern{ + dir = 1; + pixel_y = 10 + }, +/obj/item/chems/glass/bucket/wood, +/turf/floor/natural/dirt, +/area/shaded_hills/outside/downlands) +"kv" = ( +/turf/floor/natural/dirt, +/area/shaded_hills/outside/shrine) "kE" = ( /obj/structure/door/wood/ebony, /turf/floor/wood/ebony, @@ -232,6 +302,19 @@ /obj/abstract/landmark/start/shaded_hills/farmer, /turf/floor/wood/ebony, /area/shaded_hills/farmhouse) +"me" = ( +/obj/structure/reagent_dispensers/barrel/ebony, +/obj/item/seeds/extracted/potato, +/obj/item/seeds/extracted/potato, +/obj/item/seeds/extracted/potato, +/obj/item/seeds/extracted/carrot, +/obj/item/seeds/extracted/carrot, +/obj/item/seeds/extracted/carrot, +/obj/item/seeds/extracted/cabbage, +/obj/item/seeds/extracted/cabbage, +/obj/item/seeds/extracted/cabbage, +/turf/floor/natural/dirt, +/area/shaded_hills/outside/downlands) "mG" = ( /obj/structure/railing/mapped/ebony{ dir = 4 @@ -246,6 +329,10 @@ /obj/item/chems/glass/bucket/wood, /turf/floor/natural/path/basalt, /area/shaded_hills/slaughterhouse) +"ol" = ( +/obj/structure/railing/mapped/ebony, +/turf/floor/natural/mud, +/area/shaded_hills/outside/shrine) "or" = ( /obj/structure/wall_sconce/lantern{ dir = 4 @@ -261,10 +348,23 @@ }, /turf/floor/natural/grass, /area/shaded_hills/outside/downlands) +"pd" = ( +/obj/structure/bed/chair/bench/pew/mahogany{ + dir = 1 + }, +/turf/floor/wood/ebony, +/area/shaded_hills/shrine) "pi" = ( /obj/structure/table/woodentable/ebony, +/obj/item/stack/medical/ointment/poultice/five, +/obj/item/stack/medical/bruise_pack/bandage/five, /turf/floor/natural/path/herringbone/basalt, /area/shaded_hills/inn) +"qe" = ( +/obj/structure/bed/simple/ebony, +/obj/abstract/landmark/start/shaded_hills/shrine_attendant, +/turf/floor/wood/ebony, +/area/shaded_hills/shrine) "qf" = ( /obj/structure/railing/mapped/ebony{ dir = 8 @@ -274,9 +374,25 @@ "qG" = ( /turf/wall/brick/basalt, /area/shaded_hills/inn) +"qL" = ( +/obj/structure/table/woodentable/ebony, +/obj/item/ancient_surgery/bonesetter, +/obj/item/ancient_surgery/retractor, +/obj/item/ancient_surgery/sutures, +/turf/floor/natural/path/herringbone/basalt, +/area/shaded_hills/shrine) "qP" = ( /turf/floor/wood/ebony, /area/shaded_hills/farmhouse) +"qY" = ( +/turf/wall/brick/basalt, +/area/shaded_hills/outside/downlands/poi) +"ra" = ( +/obj/structure/table/woodentable/ebony, +/obj/item/chems/glass/mortar, +/obj/item/rock/basalt, +/turf/floor/wood/ebony, +/area/shaded_hills/farmhouse) "rv" = ( /obj/structure/table/woodentable/ebony, /obj/item/chems/glass/pottery/bottle, @@ -293,6 +409,10 @@ }, /turf/floor/wood/ebony, /area/shaded_hills/inn/porch) +"rO" = ( +/mob/living/simple_animal/fowl/chicken, +/turf/floor/natural/grass, +/area/shaded_hills/outside/downlands) "sJ" = ( /obj/structure/door/wood/ebony, /obj/abstract/landmark/lock_preset/shaded_hills/inn_interior, @@ -344,14 +464,34 @@ "uJ" = ( /turf/floor/wood/ebony, /area/shaded_hills/general_store) +"uK" = ( +/obj/structure/table/marble, +/obj/structure/wall_sconce/lantern{ + dir = 8 + }, +/turf/floor/natural/path/herringbone/basalt, +/area/shaded_hills/shrine) "uM" = ( /turf/floor/natural/path/basalt, /area/shaded_hills/general_store) +"uP" = ( +/obj/structure/wall_sconce/lantern{ + dir = 1; + pixel_y = 10 + }, +/turf/floor/wood/ebony, +/area/shaded_hills/shrine) "vA" = ( /obj/structure/table/marble, /obj/item/chems/condiment/sugar, /turf/floor/natural/path/herringbone/basalt, /area/shaded_hills/inn) +"wg" = ( +/obj/structure/table/woodentable/ebony, +/obj/item/ancient_surgery/bonesaw, +/obj/item/ancient_surgery/forceps, +/turf/floor/natural/path/herringbone/basalt, +/area/shaded_hills/shrine) "wh" = ( /obj/structure/closet/crate/chest, /obj/item/cash/imperial/regalis, @@ -378,6 +518,20 @@ "xH" = ( /turf/wall/brick/basalt, /area/shaded_hills/slaughterhouse) +"xU" = ( +/obj/structure/railing/mapped/ebony{ + dir = 4 + }, +/turf/floor/natural/grass, +/area/shaded_hills/outside/shrine) +"xW" = ( +/obj/structure/reagent_dispensers/compost_bin, +/turf/floor/natural/dirt, +/area/shaded_hills/outside/downlands) +"ya" = ( +/obj/structure/reagent_dispensers/barrel/ebony, +/turf/floor/wood/ebony, +/area/shaded_hills/farmhouse) "yn" = ( /obj/structure/bed/simple/ebony/cloth, /obj/item/bedsheet/yellowed, @@ -388,6 +542,10 @@ /obj/structure/reagent_dispensers/barrel/ebony, /turf/floor/wood/ebony, /area/shaded_hills/general_store) +"yx" = ( +/obj/structure/table/marble, +/turf/floor/natural/path/herringbone/basalt, +/area/shaded_hills/shrine) "yz" = ( /turf/wall/brick/basalt, /area/shaded_hills/general_store) @@ -398,6 +556,10 @@ /obj/abstract/landmark/start/shaded_hills/farmer, /turf/floor/wood/ebony, /area/shaded_hills/farmhouse) +"yN" = ( +/obj/structure/closet/crate/chest/ebony, +/turf/floor/wood/ebony, +/area/shaded_hills/farmhouse) "yY" = ( /turf/floor/natural/grass, /area/shaded_hills/outside/downlands/poi) @@ -411,6 +573,15 @@ /obj/item/chems/food/meatpie, /turf/floor/natural/path/herringbone/basalt, /area/shaded_hills/inn) +"zm" = ( +/obj/structure/railing/mapped/ebony{ + dir = 8 + }, +/obj/structure/railing/mapped/ebony{ + dir = 1 + }, +/turf/floor/natural/grass, +/area/shaded_hills/outside/shrine) "Ak" = ( /turf/floor/natural/path/basalt, /area/shaded_hills/stable) @@ -418,14 +589,43 @@ /obj/abstract/landmark/start/shaded_hills/bartender, /turf/floor/natural/path/herringbone/basalt, /area/shaded_hills/inn) +"Aq" = ( +/obj/structure/textiles/loom/ebony, +/turf/floor/wood/ebony, +/area/shaded_hills/shrine) +"Aw" = ( +/obj/structure/railing/mapped/ebony{ + dir = 4 + }, +/obj/structure/reagent_dispensers/barrel/ebony, +/obj/item/seeds/extracted/foxglove, +/obj/item/seeds/extracted/foxglove, +/obj/item/seeds/extracted/ginseng, +/obj/item/seeds/extracted/ginseng, +/obj/item/seeds/extracted/valerian, +/obj/item/seeds/extracted/valerian, +/obj/item/seeds/extracted/yarrow, +/obj/item/seeds/extracted/yarrow, +/turf/floor/natural/dirt, +/area/shaded_hills/outside/shrine) "Ay" = ( /turf/floor/natural/mud/water, /area/shaded_hills/outside/downlands) +"AE" = ( +/obj/structure/door/wood/ebony, +/turf/floor/natural/path/basalt, +/area/shaded_hills/shrine) "AG" = ( /obj/structure/table/woodentable/ebony, /obj/item/bag/sack, /turf/floor/wood/ebony, /area/shaded_hills/farmhouse) +"AX" = ( +/obj/structure/wall_sconce/lantern{ + dir = 4 + }, +/turf/floor/wood/ebony, +/area/shaded_hills/shrine) "Br" = ( /turf/floor/natural/path/basalt, /area/shaded_hills/slaughterhouse) @@ -434,6 +634,13 @@ /obj/structure/textiles/spinning_wheel/twisting_bench/ebony, /turf/floor/natural/path/basalt, /area/shaded_hills/slaughterhouse) +"By" = ( +/turf/floor/natural/grass, +/area/shaded_hills/outside/shrine) +"BD" = ( +/obj/structure/reagent_dispensers/barrel/ebony/wine, +/turf/floor/wood/ebony, +/area/shaded_hills/shrine) "BG" = ( /obj/structure/bed/chair/bench/ebony, /turf/floor/wood/ebony, @@ -443,10 +650,25 @@ /obj/item/bedsheet/yellowed, /turf/floor/wood/ebony, /area/shaded_hills/general_store) +"Ch" = ( +/obj/structure/wall_sconce/lantern{ + dir = 1; + pixel_y = 10 + }, +/turf/floor/natural/grass, +/area/shaded_hills/outside/downlands) +"CR" = ( +/turf/floor/wood/ebony, +/area/shaded_hills/shrine) "Dn" = ( /obj/structure/reagent_dispensers/barrel/ebony/oil, /turf/floor/wood/ebony, /area/shaded_hills/general_store) +"Dt" = ( +/obj/structure/bed/simple/ebony/cloth, +/obj/abstract/landmark/start/shaded_hills/shrine_keeper, +/turf/floor/wood/ebony, +/area/shaded_hills/shrine) "Ee" = ( /turf/wall/log/ebony, /area/shaded_hills/inn) @@ -457,6 +679,12 @@ /obj/structure/table/woodentable/ebony, /turf/floor/wood/ebony, /area/shaded_hills/general_store) +"EJ" = ( +/obj/structure/railing/mapped/ebony{ + dir = 1 + }, +/turf/floor/natural/grass, +/area/shaded_hills/outside/shrine) "EK" = ( /obj/structure/table/marble, /obj/item/rock/hematite, @@ -466,6 +694,22 @@ "EV" = ( /turf/floor/natural/path/basalt, /area/shaded_hills/outside/downlands) +"FD" = ( +/obj/structure/reagent_dispensers/barrel/ebony, +/obj/item/seeds/extracted/rice, +/obj/item/seeds/extracted/rice, +/obj/item/seeds/extracted/rice, +/obj/item/seeds/extracted/rice, +/obj/item/seeds/extracted/wheat, +/obj/item/seeds/extracted/wheat, +/obj/item/seeds/extracted/wheat, +/obj/item/seeds/extracted/wheat, +/turf/floor/natural/dirt, +/area/shaded_hills/outside/downlands) +"FE" = ( +/obj/structure/closet/cabinet/wooden/ebony, +/turf/floor/wood/ebony, +/area/shaded_hills/farmhouse) "FH" = ( /obj/structure/wall_sconce/lantern{ dir = 4 @@ -476,6 +720,16 @@ /obj/abstract/landmark/start/shaded_hills/traveller, /turf/floor/natural/dirt, /area/shaded_hills/outside/downlands) +"Gb" = ( +/obj/structure/table/marble, +/obj/item/stack/medical/bruise_pack/bandage/five, +/obj/item/stack/medical/ointment/poultice/five, +/turf/floor/natural/path/herringbone/basalt, +/area/shaded_hills/shrine) +"Gj" = ( +/obj/structure/table/woodentable_reinforced/mahogany, +/turf/floor/carpet/red, +/area/shaded_hills/shrine) "Gq" = ( /obj/abstract/landmark/start/shaded_hills/traveller/learned, /turf/floor/natural/path/basalt, @@ -556,18 +810,54 @@ /obj/abstract/landmark/latejoin, /turf/floor/natural/path/basalt, /area/shaded_hills/outside/downlands) +"Je" = ( +/obj/structure/pit/closed/grave, +/obj/structure/gravemarker/random, +/turf/floor/natural/grass, +/area/shaded_hills/outside/shrine) "Jo" = ( /obj/structure/wall_sconce/lantern, /turf/floor/wood/ebony, /area/shaded_hills/inn) +"Jt" = ( +/obj/structure/closet/cabinet/wooden/ebony, +/turf/floor/wood/ebony, +/area/shaded_hills/shrine) "Jw" = ( /obj/structure/bed/chair/wood/ebony, /turf/floor/wood/ebony, /area/shaded_hills/inn/porch) +"Jz" = ( +/obj/structure/reagent_dispensers/barrel/ebony/water, +/turf/floor/wood/ebony, +/area/shaded_hills/inn) +"JK" = ( +/obj/structure/table/woodentable_reinforced/mahogany, +/obj/item/flame/candle, +/turf/floor/carpet/red, +/area/shaded_hills/shrine) +"JM" = ( +/obj/structure/table/woodentable/ebony, +/obj/item/ancient_surgery/cautery, +/obj/item/ancient_surgery/scalpel, +/turf/floor/natural/path/herringbone/basalt, +/area/shaded_hills/shrine) "JU" = ( /obj/structure/railing/mapped/ebony, /turf/floor/wood/ebony, /area/shaded_hills/inn/porch) +"Ka" = ( +/mob/living/simple_animal/cow, +/turf/floor/natural/grass, +/area/shaded_hills/outside/downlands) +"Ke" = ( +/obj/structure/textiles/spinning_wheel/twisting_bench/ebony, +/turf/floor/natural/path/herringbone/basalt, +/area/shaded_hills/shrine) +"Kh" = ( +/obj/structure/window/basic/full, +/turf/wall/log/ebony, +/area/shaded_hills/shrine) "KG" = ( /obj/structure/railing/mapped/ebony{ dir = 8 @@ -610,6 +900,11 @@ /obj/structure/closet/crate/chest, /turf/floor/natural/path/basalt, /area/shaded_hills/slaughterhouse) +"Ot" = ( +/obj/structure/table/woodentable/ebony, +/obj/item/chems/cooking_vessel/pot, +/turf/floor/wood/ebony, +/area/shaded_hills/shrine) "ON" = ( /obj/structure/table/marble, /obj/item/chems/glass/pottery/jar, @@ -629,6 +924,10 @@ "PA" = ( /turf/floor/straw, /area/shaded_hills/stable) +"PG" = ( +/obj/structure/door/wood/ebony, +/turf/floor/wood/ebony, +/area/shaded_hills/shrine) "PQ" = ( /obj/structure/closet/crate/chest, /obj/item/chems/food/butchery/meat, @@ -642,6 +941,15 @@ /obj/abstract/landmark/lock_preset/shaded_hills/inn_exterior, /turf/floor/wood/ebony, /area/shaded_hills/inn) +"QB" = ( +/turf/wall/log/ebony, +/area/shaded_hills/shrine) +"QL" = ( +/obj/structure/bed/chair/wood/ebony{ + dir = 1 + }, +/turf/floor/wood/ebony, +/area/shaded_hills/shrine) "QQ" = ( /turf/wall/log/ebony, /area/shaded_hills/tannery) @@ -670,6 +978,17 @@ }, /turf/floor/natural/grass, /area/shaded_hills/outside/downlands) +"Sj" = ( +/obj/structure/railing/mapped/ebony{ + dir = 4 + }, +/obj/item/chems/glass/bucket/wood, +/turf/floor/natural/mud, +/area/shaded_hills/outside/shrine) +"Sy" = ( +/obj/structure/textiles/spinning_wheel/ebony, +/turf/floor/wood/ebony, +/area/shaded_hills/shrine) "SF" = ( /obj/structure/door/wood/ebony, /turf/floor/natural/path/basalt, @@ -709,9 +1028,23 @@ /obj/abstract/landmark/latejoin, /turf/floor/natural/dirt, /area/shaded_hills/outside/downlands) +"TM" = ( +/obj/structure/table/woodentable/ebony, +/obj/item/chems/food/grown/potato, +/obj/item/chems/food/grown/potato, +/obj/item/chems/food/grown/carrot, +/obj/item/chems/food/grown/carrot, +/obj/item/chems/food/grown/cabbage, +/turf/floor/wood/ebony, +/area/shaded_hills/shrine) "TR" = ( /turf/floor/natural/dirt, /area/shaded_hills/outside/downlands) +"UD" = ( +/obj/structure/table/woodentable/ebony, +/obj/item/flame/candle, +/turf/floor/wood/ebony, +/area/shaded_hills/shrine) "US" = ( /obj/structure/bed/chair/wood/ebony{ dir = 4 @@ -724,6 +1057,19 @@ }, /turf/floor/natural/path/basalt, /area/shaded_hills/outside/downlands) +"Vj" = ( +/turf/floor/natural/path/herringbone/basalt, +/area/shaded_hills/shrine) +"VE" = ( +/obj/structure/reagent_dispensers/barrel/ebony/beer, +/turf/floor/wood/ebony, +/area/shaded_hills/shrine) +"VM" = ( +/obj/structure/railing/mapped/ebony{ + dir = 4 + }, +/turf/floor/natural/dirt, +/area/shaded_hills/outside/shrine) "VU" = ( /obj/structure/railing/mapped/ebony{ dir = 8 @@ -741,6 +1087,12 @@ "Wg" = ( /turf/wall/log/ebony, /area/shaded_hills/general_store) +"Wh" = ( +/obj/structure/table/woodentable/ebony, +/obj/item/chems/glass/mortar, +/obj/item/rock/basalt, +/turf/floor/wood/ebony, +/area/shaded_hills/shrine) "Wk" = ( /obj/structure/railing/mapped/ebony{ dir = 8 @@ -762,6 +1114,23 @@ }, /turf/floor/wood/ebony, /area/shaded_hills/inn/porch) +"WE" = ( +/obj/structure/reagent_dispensers/barrel/ebony, +/obj/item/seeds/extracted/cabbage, +/obj/item/seeds/extracted/cabbage, +/obj/item/seeds/extracted/carrot, +/obj/item/seeds/extracted/carrot, +/obj/item/seeds/extracted/wheat, +/obj/item/seeds/extracted/wheat, +/obj/item/seeds/extracted/rice, +/obj/item/seeds/extracted/rice, +/obj/item/seeds/extracted/potato, +/obj/item/seeds/extracted/potato, +/obj/structure/railing/mapped/ebony{ + dir = 4 + }, +/turf/floor/natural/mud, +/area/shaded_hills/outside/shrine) "WI" = ( /obj/structure/wall_sconce/lantern{ dir = 8 @@ -775,6 +1144,7 @@ "WV" = ( /obj/structure/table/marble, /obj/item/chems/cooking_vessel/pot, +/obj/item/chems/cooking_vessel/skillet, /turf/floor/natural/path/herringbone/basalt, /area/shaded_hills/inn) "WY" = ( @@ -786,6 +1156,20 @@ /obj/structure/meat_hook, /turf/floor/natural/path/basalt, /area/shaded_hills/slaughterhouse) +"XH" = ( +/obj/structure/fire_source/stove, +/obj/item/stack/material/log/mapped/ebony/twenty, +/turf/floor/natural/path/herringbone/basalt, +/area/shaded_hills/shrine) +"XM" = ( +/turf/floor/carpet/red, +/area/shaded_hills/shrine) +"XY" = ( +/turf/floor/natural/mud/water, +/area/shaded_hills/outside/shrine) +"Yc" = ( +/turf/wall/brick/basalt, +/area/shaded_hills/shrine) "Yg" = ( /turf/floor/wood/ebony, /area/shaded_hills/inn/porch) @@ -804,6 +1188,10 @@ }, /turf/floor/wood/ebony, /area/shaded_hills/general_store) +"Zx" = ( +/obj/machinery/portable_atmospherics/hydroponics/soil, +/turf/floor/natural/mud, +/area/shaded_hills/outside/shrine) "ZE" = ( /obj/structure/table/marble, /obj/item/chems/food/cherrypie, @@ -4527,7 +4915,7 @@ yY yY yY yY -yY +HI HI HI HI @@ -4982,12 +5370,12 @@ yY yY yY yY -yY HI HI HI HI HI +TR HI TR EV @@ -5134,7 +5522,6 @@ yY yY yY yY -yY HI HI HI @@ -5143,6 +5530,7 @@ HI TR TR TR +TR Ic EV TR @@ -5285,7 +5673,6 @@ yY yY yY yY -yY HI HI HI @@ -5293,14 +5680,15 @@ HI HI HI TR +TR EV TR Ic EV TR HI -HI -HI +TR +TR yY yY yY @@ -5437,7 +5825,6 @@ yY yY yY yY -yY HI HI HI @@ -5445,15 +5832,16 @@ HI HI HI TR +TR EV Ic EV EV HI +TR HI -HI -HI -yY +TR +VZ yY yY yY @@ -5595,7 +5983,7 @@ HI HI HI HI -HI +aU TR TR Ic @@ -5605,8 +5993,8 @@ HI HI HI HI -yY -yY +VZ +VZ yY yY yY @@ -5740,7 +6128,6 @@ yY yY yY yY -yY HI HI HI @@ -5749,6 +6136,7 @@ HI HI HI TR +TR EV TR EV @@ -5760,8 +6148,8 @@ HI yY yY yY -yY -yY +VZ +VZ yY yY yY @@ -5899,7 +6287,7 @@ HI HI HI HI -HI +Ch TR EV Ic @@ -5911,11 +6299,11 @@ HI HI yY yY -yY -yY -yY -yY -yY +VZ +qY +qY +VZ +VZ yY yY yY @@ -6064,10 +6452,10 @@ HI HI yY yY -yY -yY -yY -yY +VZ +qY +qY +VZ yY yY yY @@ -6217,9 +6605,9 @@ HI HI yY yY -yY -yY -yY +VZ +VZ +VZ yY yY yY @@ -6339,11 +6727,7 @@ yY yY yY yY -yY -yY -yY -yY -yY +HI HI HI HI @@ -6355,6 +6739,10 @@ HI HI HI TR +HI +HI +HI +HI TR TR EV @@ -6370,9 +6758,9 @@ HI HI yY yY -yY -yY -yY +VZ +qY +VZ yY yY yY @@ -6489,11 +6877,10 @@ yY yY yY yY -yY -yY -yY -yY -yY +HI +HI +HI +HI HI HI HI @@ -6507,7 +6894,8 @@ HI HI HI TR -TR +HI +HI TR EV Ic @@ -6522,8 +6910,8 @@ HI HI yY yY -yY -yY +VZ +VZ yY yY yY @@ -6639,10 +7027,6 @@ yY yY yY yY -yY -yY -yY -yY HI HI HI @@ -6658,6 +7042,10 @@ HI HI HI HI +HI +TR +TR +HI TR TR TR @@ -6673,7 +7061,7 @@ HI HI HI HI -yY +VZ yY yY yY @@ -6790,8 +7178,6 @@ yY yY yY yY -yY -yY HI HI HI @@ -6808,6 +7194,8 @@ HI HI HI HI +HI +TR Iz Iz Iz @@ -6958,8 +7346,8 @@ HI HI HI HI -HI -HI +TR +TR wA wA wA @@ -7089,6 +7477,9 @@ yY yY yY yY +yY +yY +yY HI HI HI @@ -7107,11 +7498,8 @@ HI HI HI HI -HI -HI -HI -HI -HI +TR +TR wA Lj wA @@ -7240,11 +7628,10 @@ yY yY yY yY -HI -HI -HI -HI -HI +yY +yY +yY +yY HI HI HI @@ -7264,6 +7651,7 @@ HI HI HI TR +TR wA wA wA @@ -7391,6 +7779,11 @@ yY yY yY yY +yY +yY +yY +yY +yY HI HI HI @@ -7407,11 +7800,6 @@ HI HI HI HI -TR -HI -HI -HI -HI HI HI HI @@ -7543,30 +7931,30 @@ yY yY yY yY -HI -HI -HI -HI -HI +yY +yY +yY +yY +yY HI HI TR TR HI HI +HI TR TR TR TR TR -HI -TR -TR -TR TR TR HI HI +HI +HI +TR TR TR TR @@ -7695,11 +8083,11 @@ yY yY yY yY -HI -HI -HI -HI -HI +yY +yY +yY +yY +yY HI TR cx @@ -7715,7 +8103,7 @@ cx cx cx TR -TR +HI TR TR cx @@ -7848,9 +8236,9 @@ yY yY yY yY -HI -HI -HI +yY +yY +yY HI HI TR @@ -8000,9 +8388,9 @@ yY yY yY yY -HI -HI -HI +yY +yY +yY HI HI TR @@ -8152,12 +8540,12 @@ yY yY yY yY -HI +yY +yY HI HI HI TR -TR cx TR HI @@ -8304,12 +8692,12 @@ yY yY yY yY -HI +yY +yY HI HI HI TR -TR cx TR HI @@ -8456,12 +8844,12 @@ yY yY yY yY -HI +yY +yY HI HI HI TR -TR cx TR HI @@ -8608,12 +8996,12 @@ yY yY yY yY -HI +yY +yY HI HI HI TR -TR cx TR TR @@ -8760,12 +9148,12 @@ yY yY yY yY +yY HI HI HI HI TR -TR cx cx TR @@ -8773,7 +9161,7 @@ TR Ee ZY ZY -ZY +Jz ZY sJ ZY @@ -10019,7 +10407,7 @@ HI HI oO Sf -HI +Sf Sf Sf Sf @@ -10325,9 +10713,9 @@ gp HI HI HI +Ka HI -HI -HI +rO RC HI TR @@ -10783,7 +11171,7 @@ Ay HI HI HI -HI +rO RC HI HI @@ -11083,7 +11471,7 @@ HI HI LK hU -HI +hU hU hU hU @@ -11946,7 +12334,7 @@ NH NH NH NH -yY +NH yY yY yY @@ -11989,7 +12377,7 @@ LN cl qP qP -qP +FE LN TR Rl @@ -12097,8 +12485,8 @@ NH NH NH NH -yY -yY +NH +NH yY yY yY @@ -12249,8 +12637,8 @@ NH NH NH NH -yY -yY +NH +NH yY yY yY @@ -12293,7 +12681,7 @@ LN cl qP qP -qP +yN LN TR Rl @@ -12401,9 +12789,9 @@ NH NH NH NH -yY -yY -yY +NH +NH +NH yY yY yY @@ -12445,7 +12833,7 @@ IQ cl yJ qP -qP +yN LN TR Rl @@ -12553,9 +12941,9 @@ NH NH NH NH -yY -yY -yY +NH +NH +NH yY yY yY @@ -12705,9 +13093,9 @@ NH NH NH NH -yY -yY -yY +NH +NH +NH yY yY yY @@ -12749,7 +13137,7 @@ LN AG qP qP -qP +ya LN TR Rl @@ -12857,9 +13245,9 @@ NH NH NH NH -yY -yY -yY +NH +NH +NH yY yY yY @@ -12903,7 +13291,7 @@ WO LN LN LN -TR +me Rl GW Ay @@ -13009,9 +13397,9 @@ NH NH NH NH -yY -yY -yY +NH +NH +NH yY yY yY @@ -13055,7 +13443,7 @@ qP qP qP LN -TR +FD Rl Rl Ay @@ -13161,10 +13549,10 @@ NH NH NH NH -yY -yY -yY -yY +NH +NH +NH +NH yY yY yY @@ -13313,10 +13701,10 @@ NH NH NH NH -yY -yY -yY -yY +NH +NH +NH +NH yY yY yY @@ -13359,7 +13747,7 @@ qP qP hJ LN -TR +xW Rl Rl Ay @@ -13466,10 +13854,10 @@ NH NH NH NH -yY -yY -yY -yY +NH +NH +NH +NH yY yY yY @@ -13507,11 +13895,11 @@ qP hc LN HF -cl +ra gg eD LN -aU +ke TR Rl Rl @@ -13618,10 +14006,10 @@ NH NH NH NH -yY -yY -yY -yY +NH +NH +NH +NH yY yY yY @@ -13770,10 +14158,10 @@ NH NH NH NH -yY -yY -yY -yY +NH +NH +NH +NH yY yY yY @@ -13922,10 +14310,10 @@ NH NH NH NH -yY -yY -yY -yY +NH +NH +NH +NH yY yY yY @@ -14075,8 +14463,8 @@ NH NH NH NH -yY -yY +NH +NH yY yY yY @@ -14227,8 +14615,8 @@ NH NH NH NH -yY -yY +NH +NH yY yY yY @@ -14379,9 +14767,9 @@ NH NH NH NH -yY -yY -yY +NH +NH +NH yY yY yY @@ -14531,9 +14919,9 @@ NH NH NH NH -yY -yY -yY +NH +NH +NH yY yY yY @@ -14684,9 +15072,9 @@ NH NH NH NH -yY -yY -yY +NH +NH +NH yY yY yY @@ -14836,10 +15224,10 @@ NH NH NH NH -yY -yY -yY -yY +NH +NH +NH +NH yY yY yY @@ -14988,11 +15376,11 @@ NH NH NH NH -yY -yY -yY -yY -yY +NH +NH +NH +NH +NH yY yY yY @@ -15140,11 +15528,11 @@ NH NH NH NH -yY -yY -yY -yY -yY +NH +NH +NH +NH +NH yY yY yY @@ -15172,8 +15560,8 @@ yY yY HI HI -HI -HI +TR +TR TR Ic EV @@ -15293,6 +15681,11 @@ NH NH NH NH +NH +NH +NH +NH +NH yY yY yY @@ -15308,24 +15701,19 @@ yY yY yY yY +By +By +By +By +By yY yY yY yY -yY -yY -yY -yY -yY -yY -yY -yY -yY -yY -yY -HI +By HI TR +TR EV TR TR @@ -15447,6 +15835,10 @@ NH NH NH NH +NH +NH +NH +NH yY yY yY @@ -15458,26 +15850,22 @@ yY yY yY yY -yY -yY -yY -yY -yY -yY -yY -yY -yY -yY -yY -yY -yY -yY -yY -yY -yY -HI -HI -HI +By +By +By +By +kv +kv +kv +By +By +By +By +By +By +kv +TR +TR TR EV Ic @@ -15602,6 +15990,7 @@ NH NH NH NH +NH yY yY yY @@ -15612,24 +16001,23 @@ yY yY yY yY -yY -yY -yY -yY -yY -yY -yY -yY -yY -yY -yY -yY -yY -yY -yY -HI -HI -HI +By +By +kv +kv +kv +kv +kv +kv +kv +kv +kv +By +By +kv +kv +TR +TR EV EV Ic @@ -15764,23 +16152,23 @@ yY yY yY yY -yY -yY -yY -yY -yY -yY -yY -yY -yY -yY -yY -yY -yY -yY -HI -HI -HI +By +By +kv +kv +kv +kv +kv +kv +kv +kv +kv +kv +kv +kv +kv +kv +TR TR EV EV @@ -15909,30 +16297,30 @@ NH NH NH NH +NH yY yY yY yY yY -yY -yY -yY -yY -yY -yY -yY -yY -yY -yY -yY -yY -yY -yY -yY -yY -HI -HI -HI +By +By +kv +kv +kv +kv +By +By +By +By +By +kv +kv +kv +kv +kv +kv +TR TR EV EV @@ -16065,25 +16453,25 @@ NH NH NH yY -yY -yY -yY -yY -yY -yY -yY -yY -yY -yY -yY -yY -yY -yY -yY -yY -yY -HI -HI +By +By +By +kv +kv +kv +kv +By +By +By +By +By +By +By +By +By +By +By +By HI TR TR @@ -16216,15 +16604,15 @@ NH NH NH NH -NH -yY -yY -yY -yY -yY -yY -yY -yY +By +By +kv +kv +kv +kv +kv +By +By yY yY yY @@ -16367,15 +16755,15 @@ NH NH NH NH -NH -NH -NH -yY -yY -yY -yY -yY -yY +By +By +kv +kv +kv +kv +By +By +By yY yY yY @@ -16519,13 +16907,13 @@ NH NH NH NH -NH -NH -NH -yY -yY -yY -yY +By +By +kv +kv +kv +kv +By yY yY yY @@ -16670,14 +17058,14 @@ NH NH NH NH -NH -NH -NH -NH -NH -yY -yY -yY +By +By +kv +kv +kv +kv +By +By yY yY yY @@ -16793,10 +17181,20 @@ NH NH NH NH +By +By +By +By NH NH NH NH +By +By +By +By +By +By NH NH NH @@ -16812,23 +17210,13 @@ NH NH NH NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -yY -yY +By +By +kv +kv +kv +kv +By yY yY yY @@ -16935,6 +17323,7 @@ lC lC Wm Wm +Wm NH NH NH @@ -16942,6 +17331,27 @@ NH NH NH NH +By +By +By +By +By +By +By +By +By +By +By +By +By +By +By +By +By +By +By +By +By NH NH NH @@ -16952,35 +17362,13 @@ NH NH NH NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -yY +By +By +kv +kv +kv +kv +By yY yY yY @@ -17087,8 +17475,36 @@ lC lC Wm Wm +Wm NH NH +By +By +By +By +By +By +By +kv +By +By +By +kv +By +By +By +By +kv +kv +By +By +By +By +By +By +By +By +By NH NH NH @@ -17098,42 +17514,14 @@ NH NH NH NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -yY +By +By +kv +kv +kv +kv +By +By yY yY yY @@ -17239,7 +17627,37 @@ lC lC Wm Wm +Wm NH +By +By +By +By +By +By +By +By +kv +kv +By +kv +iK +kv +By +By +kv +kv +iK +kv +By +By +kv +kv +kv +kv +kv +By +By NH NH NH @@ -17248,44 +17666,14 @@ NH NH NH NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH +By +By +By +kv +kv +kv +kv +By yY yY yY @@ -17391,7 +17779,37 @@ lC lC Wm Wm +Wm NH +By +zm +gA +gA +gA +gA +gA +gA +iK +QB +Kh +QB +QB +kv +kv +kv +iK +iK +iK +kv +kv +kv +kv +iK +iK +kv +iK +kv +By NH NH NH @@ -17401,43 +17819,13 @@ NH NH NH NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH +By +By +kv +kv +kv +kv +By yY yY yY @@ -17543,7 +17931,37 @@ lC lC Wm Wm +Wm NH +By +EJ +By +By +By +By +Je +By +iK +QB +UD +QL +QB +By +By +By +kv +kv +kv +kv +kv +By +By +kv +kv +kv +kv +kv +By NH NH NH @@ -17554,43 +17972,13 @@ NH NH NH NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH +By +By +kv +kv +kv +By +yY yY yY yY @@ -17695,7 +18083,38 @@ lC lC Wm Wm +Wm NH +By +EJ +Je +By +By +By +By +By +iK +QB +Dt +CR +QB +QB +QB +QB +QB +QB +QB +QB +QB +QB +QB +QB +QB +QB +QB +QB +By +By NH NH NH @@ -17704,45 +18123,14 @@ NH NH NH NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH +By +By +By +kv +kv +kv +By +yY yY yY yY @@ -17847,7 +18235,38 @@ lC lC Wm Wm +Wm NH +By +EJ +By +By +Je +By +Je +By +iK +QB +Jt +CR +PG +CR +CR +CR +CR +CR +QB +CR +CR +gt +CR +CR +CR +CR +CR +QB +By +By NH NH NH @@ -17855,46 +18274,15 @@ NH NH NH NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH +By +By +By +kv +kv +kv +By +By +By NH yY yY @@ -17999,53 +18387,53 @@ lC lC Wm Wm +Wm NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH +By +EJ +Je +By +By +By +By +By +iK +QB +QB +AE +QB +CR +CR +AX +CR +CR +PG +CR +XM +XM +XM +pd +CR +pd +CR +Kh +By +By +By +By +By +By +By +By +By +By +By +By +kv +kv +By +By +By NH NH yY @@ -18151,53 +18539,53 @@ lC lC Wm Wm +Wm NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH +By +EJ +By +By +Je +By +Je +By +iK +iK +kv +kv +QB +PG +QB +QB +PG +QB +QB +CR +XM +JK +XM +jk +CR +pd +CR +QB +kv +By +kv +kv +kv +kv +kv +kv +By +kv +kv +kv +kv +kv +By +By +By NH NH NH @@ -18303,52 +18691,52 @@ lC lC Wm Wm +Wm NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH +By +EJ +By +By +By +By +By +By +iK +kv +kv +kv +QB +CR +CR +QB +CR +CR +QB +uP +XM +Gj +XM +XM +XM +XM +CR +AE +kv +kv +kv +kv +kv +kv +kv +kv +kv +kv +kv +kv +kv +By +By +By NH NH NH @@ -18455,51 +18843,51 @@ lC lC Wm Wm +Wm NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH +By +EJ +By +By +kv +kv +By +By +iK +kv +kv +kv +QB +Jt +qe +QB +Jt +qe +QB +CR +XM +JK +XM +pd +CR +pd +CR +QB +kv +kv +kv +kv +kv +kv +kv +kv +kv +kv +By +By +By +By +By NH NH NH @@ -18607,50 +18995,50 @@ lC lC Wm Wm +Wm NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH +By +By +kv +kv +kv +kv +kv +kv +kv +kv +kv +kv +Yc +Yc +QB +QB +QB +QB +QB +CR +XM +XM +XM +pd +CR +pd +CR +Kh +By +By +By +By +By +By +By +By +By +By +By +By +By +By NH NH NH @@ -18759,48 +19147,48 @@ lC lC Wm Wm +Wm NH +By +EJ +By +By +By +kv +kv +kv +kv +kv +kv +kv +Yc +XH +Vj +CR +CR +CR +PG +CR +CR +AX +CR +CR +CR +CR +CR +QB +By +By +By NH NH NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH +By +By +By +By +By +By NH NH NH @@ -18908,41 +19296,41 @@ lC lC lC lC -lC -Wm -Wm -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH +lC +Wm +Wm +Wm NH +By +EJ +By +By +By +By +By +By +kv +iK +kv +kv +AE +Vj +Vj +TM +Wh +CR +QB +QB +QB +QB +QB +QB +QB +QB +QB +QB +By +By NH NH NH @@ -19065,35 +19453,35 @@ Wm Wm Wm NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH +By +EJ +Je +By +Je +By +By +kv +kv +iK +kv +kv +QB +uP +CR +Ot +bW +CR +AE +ft +ft +ft +ft +ft +ft +ft +kv +By +By NH NH NH @@ -19217,35 +19605,35 @@ Wm Wm Wm NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH +By +EJ +By +By +By +By +By +kv +iK +iK +kv +kv +Kh +CR +CR +CR +CR +CR +Kh +ft +Zx +XY +Zx +ol +ft +kv +By +kv +By NH NH NH @@ -19369,35 +19757,35 @@ Wm Wm Wm NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH +By +EJ +By +By +Je +By +By +kv +iK +iK +kv +By +QB +cy +VE +BD +Sy +Aq +QB +ft +Zx +XY +Zx +ol +kv +By +By +By +By NH NH NH @@ -19521,33 +19909,33 @@ Wm Wm Wm NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH +By +EJ +By +By +By +By +kv +kv +iK +kv +By +kv +QB +QB +QB +QB +QB +QB +QB +ft +Zx +XY +Zx +ol +kv +By +By NH NH NH @@ -19673,32 +20061,32 @@ Wm Wm Wm NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH +By +EJ +By +Je +By +By +kv +kv +kv +kv +kv +kv +QB +yx +uK +Gb +Vj +Vj +AE +ft +Zx +XY +Zx +ol +kv +By NH NH NH @@ -19825,32 +20213,32 @@ Wm Wm Wm NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH +By +EJ +By +By +By +By +kv +kv +kv +kv +kv +By +AE +Vj +Vj +Vj +Vj +JM +QB +ft +ft +ft +ft +ol +kv +By NH NH NH @@ -19977,31 +20365,31 @@ Wm Wm Wm NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH +By +cT +xU +xU +xU +xU +kv +kv +kv +kv +By +kv +QB +ev +gL +Ke +wg +qL +QB +Aw +WE +VM +Sj +fg +By NH NH NH @@ -20129,31 +20517,31 @@ Wm Wm Wm NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH +By +By +By +By +By +By +VM +kv +kv +kv +By +kv +QB +QB +QB +QB +QB +QB +QB +kv +kv +By +kv +By +By NH NH NH @@ -20283,26 +20671,26 @@ Wm NH NH NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH +By +By +By +By +By +By +By +By +By +By +By +By +By +By +By +By +By +By +By +By NH NH NH @@ -20441,19 +20829,19 @@ NH NH NH NH +By +By +By +By +By +By NH NH NH -NH -NH -NH -NH -NH -NH -NH -NH -NH -NH +By +By +By +By NH NH NH @@ -20584,6 +20972,7 @@ lC Wm Wm Wm +Wm NH NH NH @@ -20593,9 +20982,8 @@ NH NH NH NH -NH -NH -NH +By +By NH NH NH @@ -20736,7 +21124,7 @@ lC Wm Wm Wm -NH +Wm NH NH NH diff --git a/maps/shaded_hills/shaded_hills.dm b/maps/shaded_hills/shaded_hills.dm index 25767113d6a..e077b504feb 100644 --- a/maps/shaded_hills/shaded_hills.dm +++ b/maps/shaded_hills/shaded_hills.dm @@ -17,6 +17,7 @@ #include "jobs/_jobs.dm" #include "jobs/caves.dm" #include "jobs/inn.dm" + #include "jobs/shrine.dm" #include "jobs/visitors.dm" #include "jobs/wilderness.dm" @@ -38,6 +39,7 @@ #include "outfits/_outfits.dm" #include "outfits/caves.dm" #include "outfits/inn.dm" + #include "outfits/shrine.dm" #include "outfits/visitors.dm" #include "outfits/wilderness.dm" diff --git a/mods/content/fantasy/items/clothing/_loadout.dm b/mods/content/fantasy/items/clothing/_loadout.dm index 001e8c59987..420b62571b4 100644 --- a/mods/content/fantasy/items/clothing/_loadout.dm +++ b/mods/content/fantasy/items/clothing/_loadout.dm @@ -64,6 +64,10 @@ path = /obj/item/clothing/suit/robe slot = slot_wear_suit_str +/decl/loadout_option/fantasy/suit/mantle + name = "mantle" + path = /obj/item/clothing/suit/mantle + /decl/loadout_option/fantasy/suit/cloak name = "cloak" path = /obj/item/clothing/suit/cloak @@ -129,6 +133,23 @@ /decl/material/solid/organic/wood/walnut ) + +/decl/loadout_option/fantasy/neck + abstract_type = /decl/loadout_option/fantasy/neck + slot = slot_wear_mask_str + + +/decl/loadout_option/fantasy/neck/prayer_beads + name = "prayer beads" + path = /obj/item/clothing/neck/necklace/prayer_beads + available_materials = list( + /decl/material/solid/organic/bone, + /decl/material/solid/stone/marble, + /decl/material/solid/stone/basalt, + /decl/material/solid/organic/wood/mahogany, + /decl/material/solid/organic/wood/ebony + ) + /decl/loadout_category/fantasy/utility name = "Utility" diff --git a/nebula.dme b/nebula.dme index 920474fa90f..5b7b7908b9c 100644 --- a/nebula.dme +++ b/nebula.dme @@ -2036,9 +2036,9 @@ #include "code\modules\clothing\suits\bio.dm" #include "code\modules\clothing\suits\cloaks.dm" #include "code\modules\clothing\suits\dashiki.dm" -#include "code\modules\clothing\suits\fated_mantle.dm" #include "code\modules\clothing\suits\jobs.dm" #include "code\modules\clothing\suits\labcoat.dm" +#include "code\modules\clothing\suits\mantle.dm" #include "code\modules\clothing\suits\miscellaneous.dm" #include "code\modules\clothing\suits\poncho.dm" #include "code\modules\clothing\suits\robes.dm" From 67f32918fc77a49e2b7d8eb6b072f8bb4a35d649 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Thu, 20 Jun 2024 12:15:32 +1000 Subject: [PATCH 69/90] Travel* back to travell*. --- .../uplink/stealth_and_camouflage_items.dm | 2 +- code/game/gamemodes/game_mode.dm | 2 +- code/game/machinery/computer/arcade_orion.dm | 2 +- code/modules/awaymissions/pamphlet.dm | 2 +- code/modules/clothing/spacesuits/rig/rig.dm | 2 +- code/modules/codex/entries/guides.dm | 2 +- code/modules/overmap/_overmap.dm | 2 +- code/modules/projectiles/projectile/energy.dm | 4 ++-- code/procs/AStar.dm | 2 +- maps/shaded_hills/icons/hud.dmi | Bin 539 -> 540 bytes maps/shaded_hills/jobs/visitors.dm | 10 +++++----- maps/shaded_hills/outfits/visitors.dm | 4 ++-- 12 files changed, 17 insertions(+), 17 deletions(-) diff --git a/code/datums/uplink/stealth_and_camouflage_items.dm b/code/datums/uplink/stealth_and_camouflage_items.dm index a1c9aba1b9f..9a9d21c0761 100644 --- a/code/datums/uplink/stealth_and_camouflage_items.dm +++ b/code/datums/uplink/stealth_and_camouflage_items.dm @@ -56,7 +56,7 @@ /datum/uplink_item/item/stealth_items/sneakies name = "Sneakies" desc = "A fashionable pair of polished dress shoes. The soles are made in a way so that any \ - tracks you leave look like they are traveling in the opposite direction." + tracks you leave look like they are travelling in the opposite direction." item_cost = 4 path = /obj/item/clothing/shoes/dress/sneakies diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm index d017c0e7087..8fca9e3f5cf 100644 --- a/code/game/gamemodes/game_mode.dm +++ b/code/game/gamemodes/game_mode.dm @@ -295,7 +295,7 @@ var/global/list/additional_antag_types = list() "REDACTED", "ancient alien artillery", "solar magnetic storms", - "sentient time-traveling killbots", + "sentient time-travelling killbots", "gravitational anomalies", "wormholes to another dimension", "a telescience mishap", diff --git a/code/game/machinery/computer/arcade_orion.dm b/code/game/machinery/computer/arcade_orion.dm index fa46c1bd251..bd47447a26d 100644 --- a/code/game/machinery/computer/arcade_orion.dm +++ b/code/game/machinery/computer/arcade_orion.dm @@ -473,7 +473,7 @@ /obj/item/orion_ship name = "model settler ship" - desc = "A model spaceship, it looks like those used back in the day when traveling to Orion! It even has a miniature FX-293 reactor, which was renowned for its instability and tendency to explode..." + desc = "A model spaceship, it looks like those used back in the day when travelling to Orion! It even has a miniature FX-293 reactor, which was renowned for its instability and tendency to explode..." icon = 'icons/obj/toy/toy.dmi' icon_state = "ship" w_class = ITEM_SIZE_SMALL diff --git a/code/modules/awaymissions/pamphlet.dm b/code/modules/awaymissions/pamphlet.dm index b694e8aa7e7..a76578178fa 100644 --- a/code/modules/awaymissions/pamphlet.dm +++ b/code/modules/awaymissions/pamphlet.dm @@ -23,7 +23,7 @@ may cause the estimate to be inaccurate, but will not interrupt the searching process.

    \ Life On The Other Side
    \ Once you have traversed the Gateway, you may experience some disorientation. Do not panic. \ - This is a normal side effect of traveling vast distances in a short period of time. You should \ + This is a normal side effect of travelling vast distances in a short period of time. You should \ survey the immediate area, and attempt to locate your complimentary case of space beer. Our \ expeditionary teams have ensured the complete safety of all away locations, but in a small \ number of cases, the Gateway they have established may not be immediately obvious. \ diff --git a/code/modules/clothing/spacesuits/rig/rig.dm b/code/modules/clothing/spacesuits/rig/rig.dm index 310289755ad..ce6efea11f5 100644 --- a/code/modules/clothing/spacesuits/rig/rig.dm +++ b/code/modules/clothing/spacesuits/rig/rig.dm @@ -82,7 +82,7 @@ var/malfunction_delay = 0 var/electrified = 0 var/locked_down = 0 - var/aimove_power_usage = 200 // Power usage per tile traveled when suit is moved by AI in IIS. In joules. + var/aimove_power_usage = 200 // Power usage per tile travelled when suit is moved by AI in IIS. In joules. var/seal_delay = SEAL_DELAY var/sealing // Keeps track of seal status independantly of canremove. diff --git a/code/modules/codex/entries/guides.dm b/code/modules/codex/entries/guides.dm index d237aad5edf..a0a90e94640 100644 --- a/code/modules/codex/entries/guides.dm +++ b/code/modules/codex/entries/guides.dm @@ -102,7 +102,7 @@

    Cyborg Repairs

    - Occasionally a Cyborg may become damaged. This could be in the form of impact damage from a heavy or fast-traveling object, or it could be heat damage from high temperatures, or even lasers or Electromagnetic Pulses (EMPs). + Occasionally a Cyborg may become damaged. This could be in the form of impact damage from a heavy or fast-travelling object, or it could be heat damage from high temperatures, or even lasers or Electromagnetic Pulses (EMPs).

    Dents

    If a cyborg becomes damaged due to impact from heavy or fast-moving objects, it will become dented. Sure, a dent may not seem like much, but it can compromise the structural integrity of the cyborg, possibly causing a critical failure. diff --git a/code/modules/overmap/_overmap.dm b/code/modules/overmap/_overmap.dm index a6e612048d3..800aac57d8d 100644 --- a/code/modules/overmap/_overmap.dm +++ b/code/modules/overmap/_overmap.dm @@ -96,7 +96,7 @@ ny = TRANSITIONEDGE + 2 nx = rand(TRANSITIONEDGE + 2, world.maxx - TRANSITIONEDGE - 2) - testing("[name]: [A] ([A.z],[A.y],[A.z]) traveling from [M] ([M.x],[M.y]).") + testing("[name]: [A] ([A.z],[A.y],[A.z]) travelling from [M] ([M.x],[M.y]).") var/turf/map = locate(M.x,M.y,assigned_z) var/obj/effect/overmap/visitable/TM diff --git a/code/modules/projectiles/projectile/energy.dm b/code/modules/projectiles/projectile/energy.dm index 04b0eeb4498..51d5d585f85 100644 --- a/code/modules/projectiles/projectile/energy.dm +++ b/code/modules/projectiles/projectile/energy.dm @@ -7,14 +7,14 @@ damage_flags = 0 distance_falloff = 2.5 -//releases a burst of light on impact or after traveling a distance +//releases a burst of light on impact or after travelling a distance /obj/item/projectile/energy/flash name = "chemical shell" icon_state = "bullet" fire_sound = 'sound/weapons/gunshot/gunshot_pistol.ogg' damage = 5 agony = 20 - life_span = 15 //if the shell hasn't hit anything after traveling this far it just explodes. + life_span = 15 //if the shell hasn't hit anything after travelling this far it just explodes. muzzle_type = /obj/effect/projectile/muzzle/bullet var/flash_range = 1 var/brightness = 7 diff --git a/code/procs/AStar.dm b/code/procs/AStar.dm index 50dbf333fef..01e4213f805 100644 --- a/code/procs/AStar.dm +++ b/code/procs/AStar.dm @@ -34,7 +34,7 @@ length to avoid portals or something i guess?? Not that they're counted right no // Modified to provide ID argument - supplied to 'adjacent' proc, defaults to null // Used for checking if route exists through a door which can be opened -// Also added 'exclude' turf to avoid traveling over; defaults to null +// Also added 'exclude' turf to avoid travelling over; defaults to null /PathNode var/datum/position diff --git a/maps/shaded_hills/icons/hud.dmi b/maps/shaded_hills/icons/hud.dmi index 53b7277ff990a281b60e12693782db5d3ea27dde..3402f33c1b3d8f3a605824a3e9284e1a77ada7ed 100644 GIT binary patch delta 266 zcmV+l0rmcy1e^qrPk-WiR9JLGWpiV4X>fFDZ*Bkpc$}4!!EVAZ42I9mQ$%o|HpX?A z2{dsS@8CA3v64EIW9aLXt`avSbNelQj_u#^)_)&=PG^7kJ-Hi7rNaKp@88~CH&f8q zg3q1nBGMRj4XT1-lbem}0!eN1!*v&d30M69;x$}3ahchI_J0{TnLr#zki<(%7G4Ez zm@|q6Cgz0rXNKn@$p%lvHtHeM3IB>VUWp24$ZMJn@x)-J!Gn;b&xJb0Bap$ z$zUo_qqHRZVpbk>@upRJ;g=APLz|k0XE|GcJRkn=3K~!jg Q?bbmKf-n?>;gd`O&tMpR7ytkO delta 266 zcmV+l0rmcz1e*kqPk-ThR9JLGWpiV4X>fFDZ*Bkpc$|%s!EVAZ42I9mQ$%o|wy`T0 z1VS9fJGhN$tfbE582b98RN^+tx8Ks|*!~@F{o!=JT>bI);vOiK3j4kP`S^6*OhID{ zcHgdxNMqDBs0xZrZZ@t9B(=#e*WCmrT=g4>_i*RLWo8T7XMf;i0&yHc5-%-TcoleH z&L|d`m=ofk8J>$I8$1!)z*`ZlYGZp4MGnS?K_(kHG{?ehHZ7v`kg1y1LAn?LtaXSb zgQ-A`(vs|pS$WXKn^wvGONhsz4Nb#;DO-QK9$)A31dk*4zg$r^#Q*>R%1J~)RA_ Date: Thu, 20 Jun 2024 13:34:27 +1000 Subject: [PATCH 70/90] Removed DNA and replaced it with mob_snapshot. --- .gitignore | 5 +- code/__defines/dna.dm | 65 ---- code/__defines/genetics.dm | 21 ++ code/__defines/mobs.dm | 23 +- code/_helpers/medical_scans.dm | 4 +- .../subsystems/initialization/misc.dm | 1 - code/datums/genetics/genetic_conditions.dm | 133 +++++++ code/datums/repositories/decls.dm | 4 + code/game/antagonist/antagonist_create.dm | 2 - code/game/atoms.dm | 10 +- code/game/dna/dna2.dm | 353 ------------------ code/game/dna/dna2_domutcheck.dm | 50 --- code/game/dna/dna2_helpers.dm | 105 ------ code/game/dna/genes/disabilities.dm | 133 ------- code/game/dna/genes/gene.dm | 97 ----- code/game/dna/genes/powers.dm | 118 ------ .../gamemodes/endgame/ftl_jump/ftl_jump.dm | 2 +- code/game/gamemodes/setupgame.dm | 62 --- code/game/objects/auras/shadowling_aura.dm | 5 +- code/game/objects/effects/mines.dm | 5 +- code/game/objects/items/devices/flash.dm | 2 +- .../objects/items/devices/scanners/health.dm | 2 +- .../objects/items/flashlights/_flashlight.dm | 4 +- .../items/weapons/cards_ids_syndicate.dm | 6 +- .../objects/items/weapons/grenades/grenade.dm | 2 +- code/game/objects/items/weapons/handcuffs.dm | 2 +- .../objects/items/weapons/material/kitchen.dm | 2 +- .../objects/items/weapons/material/knives.dm | 2 +- .../objects/items/weapons/melee/energy.dm | 2 +- code/game/objects/items/weapons/shields.dm | 2 +- code/game/objects/items/weapons/stunbaton.dm | 2 +- .../objects/items/weapons/swords_axes_etc.dm | 4 +- .../items/weapons/tools/screwdriver.dm | 2 +- code/game/objects/items/weapons/weaponry.dm | 2 +- .../crates_lockers/closets/statue.dm | 4 +- code/modules/ZAS/Contaminants.dm | 4 +- code/modules/ZAS/Variable Settings.dm | 18 +- code/modules/acting/acting_items.dm | 1 - code/modules/admin/admin.dm | 24 +- code/modules/admin/admin_verbs.dm | 1 - .../admin/secrets/admin_secrets/list_dna.dm | 2 +- code/modules/admin/topic.dm | 38 +- code/modules/admin/verbs/debug.dm | 16 - code/modules/admin/verbs/randomverbs.dm | 6 +- code/modules/aspects/aspects_handicaps.dm | 3 +- code/modules/assembly/mousetrap.dm | 2 +- code/modules/awaymissions/corpse.dm | 5 +- code/modules/client/preferences.dm | 7 +- code/modules/clothing/glasses/_glasses.dm | 7 +- .../detectivework/evidence/fingerprints.dm | 9 +- code/modules/detectivework/forensics.dm | 6 +- code/modules/events/radiation_storm.dm | 21 +- .../fabrication/fabricator_bioprinter.dm | 25 +- code/modules/food/plates/plate_tray.dm | 2 +- .../subtypes/reagents.dm | 2 +- code/modules/mob/hear_say.dm | 2 +- code/modules/mob/living/damage_procs.dm | 2 +- code/modules/mob/living/human/death.dm | 15 - code/modules/mob/living/human/human.dm | 56 ++- .../mob/living/human/human_appearance.dm | 13 +- code/modules/mob/living/human/human_damage.dm | 2 +- .../modules/mob/living/human/human_helpers.dm | 9 +- .../mob/living/human/human_movement.dm | 2 +- code/modules/mob/living/human/human_organs.dm | 27 +- .../modules/mob/living/human/human_species.dm | 10 +- code/modules/mob/living/human/human_verbs.dm | 9 +- code/modules/mob/living/human/life.dm | 28 +- code/modules/mob/living/human/npcs.dm | 4 +- code/modules/mob/living/human/say.dm | 2 +- code/modules/mob/living/human/update_icons.dm | 33 +- code/modules/mob/living/life.dm | 6 +- code/modules/mob/living/living.dm | 24 +- code/modules/mob/living/living_breath.dm | 2 +- code/modules/mob/living/living_genetics.dm | 56 +++ .../mob/living/silicon/robot/analyzer.dm | 2 +- code/modules/mob/living/silicon/robot/life.dm | 8 +- .../mob/living/simple_animal/simple_animal.dm | 2 +- code/modules/mob/mob.dm | 32 +- code/modules/mob/mob_defines.dm | 8 - code/modules/mob/mob_genetics.dm | 17 + code/modules/mob/mob_helpers.dm | 12 +- code/modules/mob/mob_snapshot.dm | 89 +++++ code/modules/mob/mob_transformation_simple.dm | 3 - code/modules/mob/transform_procs.dm | 6 +- code/modules/mob/update_icons.dm | 2 +- code/modules/nano/modules/human_appearance.dm | 10 - code/modules/organs/external/_external.dm | 25 +- .../organs/external/_external_icons.dm | 9 - code/modules/organs/internal/_internal.dm | 3 +- code/modules/organs/internal/brain.dm | 6 +- code/modules/organs/internal/eyes.dm | 2 +- code/modules/organs/internal/lungs.dm | 2 +- code/modules/organs/internal/stomach.dm | 2 +- code/modules/organs/organ.dm | 67 ++-- .../prosthetics/prosthetics_manufacturer.dm | 2 +- code/modules/paperwork/paper.dm | 2 +- code/modules/power/lighting.dm | 2 +- code/modules/projectiles/gun.dm | 3 +- code/modules/projectiles/projectile/energy.dm | 2 +- .../modules/projectiles/projectile/special.dm | 14 +- code/modules/random_map/dungeon/rooms/tomb.dm | 4 +- .../modules/reagents/chems/chems_compounds.dm | 18 +- .../modules/reagents/chems/chems_medicines.dm | 10 +- .../reagents/reagent_containers/syringes.dm | 4 +- code/modules/species/species.dm | 2 +- code/modules/species/species_bodytype.dm | 26 +- .../spells/artifacts/spellbound_servants.dm | 14 +- code/modules/spells/contracts.dm | 13 +- code/modules/spells/general/invisibility.dm | 4 +- code/modules/spells/targeted/genetic.dm | 37 +- code/modules/sprite_accessories/_accessory.dm | 6 +- code/modules/submaps/submap_join.dm | 2 +- .../xenoarcheaology/artifacts/artifact.dm | 18 +- .../artifacts/effects/dnaswitch.dm | 22 +- icons/effects/genetics.dmi | Bin 75837 -> 1351 bytes .../corporate/datum/antagonists/deathsquad.dm | 1 - .../system/psionics/events/mini_spasm.dm | 12 +- mods/content/xenobiology/slime/_slime.dm | 10 +- mods/mobs/borers/mob/borer/borer.dm | 16 +- mods/mobs/borers/mob/borer/borer_powers.dm | 2 +- mods/species/ascent/datum/antagonist.dm | 4 +- mods/species/ascent/datum/culture.dm | 18 +- mods/species/ascent/machines/magnetotron.dm | 8 +- .../ascent/mobs/bodyparts_insectoid.dm | 2 +- mods/species/ascent/mobs/nymph/nymph_life.dm | 2 +- mods/species/bayliens/adherent/_adherent.dm | 2 +- mods/species/bayliens/skrell/_skrell.dm | 2 +- mods/species/bayliens/tajaran/_tajaran.dm | 2 +- mods/species/bayliens/unathi/_lizard.dm | 2 +- mods/species/drakes/_drakes.dm | 2 +- .../serpentid/mobs/bodyparts_serpentid.dm | 8 +- mods/species/vox/_vox.dm | 2 +- mods/species/vox/organs_vox.dm | 6 +- nebula.dme | 13 +- 134 files changed, 809 insertions(+), 1556 deletions(-) delete mode 100644 code/__defines/dna.dm create mode 100644 code/__defines/genetics.dm create mode 100644 code/datums/genetics/genetic_conditions.dm delete mode 100644 code/game/dna/dna2.dm delete mode 100644 code/game/dna/dna2_domutcheck.dm delete mode 100644 code/game/dna/dna2_helpers.dm delete mode 100644 code/game/dna/genes/disabilities.dm delete mode 100644 code/game/dna/genes/gene.dm delete mode 100644 code/game/dna/genes/powers.dm delete mode 100644 code/game/gamemodes/setupgame.dm create mode 100644 code/modules/mob/living/living_genetics.dm create mode 100644 code/modules/mob/mob_genetics.dm create mode 100644 code/modules/mob/mob_snapshot.dm diff --git a/.gitignore b/.gitignore index 95f7ad24fa6..9d2b3ae5aa1 100644 --- a/.gitignore +++ b/.gitignore @@ -26,6 +26,9 @@ sql/test_db *.code-workspace .history +# git/kdiff4 +*.orig + # swap [._]*.s[a-v][a-z] [._]*.sw[a-p] @@ -52,4 +55,4 @@ lib/*.so __pycache__ # Running OpenDream locally -nebula.json \ No newline at end of file +nebula.json diff --git a/code/__defines/dna.dm b/code/__defines/dna.dm deleted file mode 100644 index d8b93e20e89..00000000000 --- a/code/__defines/dna.dm +++ /dev/null @@ -1,65 +0,0 @@ -// Bitflags for mutations. -#define STRUCDNASIZE 27 -#define UNIDNASIZE 13 - -// Generic mutations: -#define MUTATION_COLD_RESISTANCE 1 -#define MUTATION_XRAY 2 -#define MUTATION_CLUMSY 3 -#define MUTATION_HUSK 4 -#define MUTATION_SPACERES 5 // Can't be harmed via pressure damage. - -// Other Mutations: -#define mNobreath 100 // No need to breathe. -#define mRemote 101 // Remote viewing. -#define mRegen 102 // Health regeneration. -#define mRun 103 // No slowdown. -#define mRemotetalk 104 // Remote talking. -#define mMorph 105 // Hanging appearance. -#define mBlend 106 // Nothing. (seriously nothing) -#define mHallucination 107 // Hallucinations. -#define mFingerprints 108 // No fingerprints. -#define mShock 109 // Insulated hands. - -// disabilities -#define NEARSIGHTED BITFLAG(0) -#define EPILEPSY BITFLAG(1) -#define COUGHING BITFLAG(2) -#define TOURETTES BITFLAG(3) -#define NERVOUS BITFLAG(4) - -// sdisabilities -#define BLINDED BITFLAG(0) -#define MUTED BITFLAG(1) -#define DEAFENED BITFLAG(2) - -// The way blocks are handled badly needs a rewrite, this is horrible. -// Too much of a project to handle at the moment, TODO for later. -var/global/BLINDBLOCK = 0 -var/global/DEAFBLOCK = 0 -var/global/TELEBLOCK = 0 -var/global/FIREBLOCK = 0 -var/global/XRAYBLOCK = 0 -var/global/CLUMSYBLOCK = 0 -var/global/FAKEBLOCK = 0 -var/global/COUGHBLOCK = 0 -var/global/GLASSESBLOCK = 0 -var/global/TWITCHBLOCK = 0 -var/global/NERVOUSBLOCK = 0 -var/global/MONKEYBLOCK = STRUCDNASIZE - -var/global/BLOCKADD = 0 -var/global/DIFFMUT = 0 - -var/global/HEADACHEBLOCK = 0 -var/global/NOBREATHBLOCK = 0 -var/global/REMOTEVIEWBLOCK = 0 -var/global/REGENERATEBLOCK = 0 -var/global/INCREASERUNBLOCK = 0 -var/global/REMOTETALKBLOCK = 0 -var/global/MORPHBLOCK = 0 -var/global/BLENDBLOCK = 0 -var/global/HALLUCINATIONBLOCK = 0 -var/global/NOPRINTSBLOCK = 0 -var/global/SHOCKIMMUNITYBLOCK = 0 -var/global/SMALLSIZEBLOCK = 0 diff --git a/code/__defines/genetics.dm b/code/__defines/genetics.dm new file mode 100644 index 00000000000..9744c4407e9 --- /dev/null +++ b/code/__defines/genetics.dm @@ -0,0 +1,21 @@ +#define GENE_COND_COLD_RESISTANCE /decl/genetic_condition/superpower/cold_resist +#define GENE_COND_XRAY /decl/genetic_condition/superpower/xray +#define GENE_COND_SPACE_RESISTANCE /decl/genetic_condition/superpower/space_resist +#define GENE_COND_NO_BREATH /decl/genetic_condition/superpower/no_breath +#define GENE_COND_REMOTE_TALK /decl/genetic_condition/superpower/remotetalk +#define GENE_COND_RUNNING /decl/genetic_condition/superpower/running +#define GENE_COND_REMOTE_VIEW /decl/genetic_condition/superpower/remoteview +#define GENE_COND_SHAPESHIFTER /decl/genetic_condition/superpower/morph +#define GENE_COND_NO_FINGERPRINTS /decl/genetic_condition/superpower/noprints + +#define GENE_COND_CLUMSY /decl/genetic_condition/disability/clumsy +#define GENE_COND_NEARSIGHTED /decl/genetic_condition/disability/nearsighted +#define GENE_COND_EPILEPSY /decl/genetic_condition/disability/epilepsy +#define GENE_COND_COUGHING /decl/genetic_condition/disability/coughing +#define GENE_COND_TOURETTES /decl/genetic_condition/disability/tourettes +#define GENE_COND_NERVOUS /decl/genetic_condition/disability/nervous +#define GENE_COND_BLINDED /decl/genetic_condition/disability/blinded +#define GENE_COND_MUTED /decl/genetic_condition/disability/muted +#define GENE_COND_DEAFENED /decl/genetic_condition/disability/deafened + +#define GENE_COND_HUSK /decl/genetic_condition/husk diff --git a/code/__defines/mobs.dm b/code/__defines/mobs.dm index 6bee2fa48f8..c06030c236c 100644 --- a/code/__defines/mobs.dm +++ b/code/__defines/mobs.dm @@ -64,18 +64,17 @@ #define ROBOT_NOTIFICATION_MODULE_RESET 4 // Appearance change flags -#define APPEARANCE_UPDATE_DNA BITFLAG(0) -#define APPEARANCE_RACE (BITFLAG(1)|APPEARANCE_UPDATE_DNA) -#define APPEARANCE_GENDER BITFLAG(2) -#define APPEARANCE_BODY (BITFLAG(3)|APPEARANCE_UPDATE_DNA) -#define APPEARANCE_SKIN BITFLAG(4) -#define APPEARANCE_HAIR BITFLAG(5) -#define APPEARANCE_HAIR_COLOR BITFLAG(6) -#define APPEARANCE_FACIAL_HAIR BITFLAG(7) -#define APPEARANCE_FACIAL_HAIR_COLOR BITFLAG(8) -#define APPEARANCE_EYE_COLOR BITFLAG(9) +#define APPEARANCE_RACE BITFLAG(0) +#define APPEARANCE_GENDER BITFLAG(1) +#define APPEARANCE_BODY BITFLAG(2) +#define APPEARANCE_SKIN BITFLAG(3) +#define APPEARANCE_HAIR BITFLAG(4) +#define APPEARANCE_HAIR_COLOR BITFLAG(5) +#define APPEARANCE_FACIAL_HAIR BITFLAG(6) +#define APPEARANCE_FACIAL_HAIR_COLOR BITFLAG(7) +#define APPEARANCE_EYE_COLOR BITFLAG(8) #define APPEARANCE_ALL_HAIR (APPEARANCE_HAIR|APPEARANCE_HAIR_COLOR|APPEARANCE_FACIAL_HAIR|APPEARANCE_FACIAL_HAIR_COLOR) -#define APPEARANCE_ALL (APPEARANCE_UPDATE_DNA|APPEARANCE_RACE|APPEARANCE_GENDER|APPEARANCE_BODY|APPEARANCE_SKIN|APPEARANCE_EYE_COLOR|APPEARANCE_ALL_HAIR) +#define APPEARANCE_ALL (APPEARANCE_RACE|APPEARANCE_GENDER|APPEARANCE_BODY|APPEARANCE_SKIN|APPEARANCE_EYE_COLOR|APPEARANCE_ALL_HAIR) // Click cooldown #define DEFAULT_ATTACK_COOLDOWN 8 //Default timeout for aggressive actions @@ -348,7 +347,7 @@ var/global/list/dexterity_levels = list( #define NEUTER_ANIMATE "animate singular neutral" // Equipment Overlays Indices // -#define HO_MUTATIONS_LAYER 1 +#define HO_CONDITION_LAYER 1 #define HO_SKIN_LAYER 2 #define HO_DAMAGE_LAYER 3 #define HO_SURGERY_LAYER 4 //bs12 specific. diff --git a/code/_helpers/medical_scans.dm b/code/_helpers/medical_scans.dm index a0e904409d6..f028663332d 100644 --- a/code/_helpers/medical_scans.dm +++ b/code/_helpers/medical_scans.dm @@ -88,9 +88,9 @@ for(var/organ_name in root_bodytype.has_organ) if(!GET_INTERNAL_ORGAN(H, organ_name)) scan["missing_organs"] += organ_name - if(H.sdisabilities & BLINDED) + if(H.has_genetic_condition(GENE_COND_BLINDED)) scan["blind"] = TRUE - if(H.sdisabilities & NEARSIGHTED) + if(H.has_genetic_condition(GENE_COND_NEARSIGHTED)) scan["nearsight"] = TRUE return scan diff --git a/code/controllers/subsystems/initialization/misc.dm b/code/controllers/subsystems/initialization/misc.dm index 09025757cdf..122c8932846 100644 --- a/code/controllers/subsystems/initialization/misc.dm +++ b/code/controllers/subsystems/initialization/misc.dm @@ -4,6 +4,5 @@ SUBSYSTEM_DEF(misc) flags = SS_NO_FIRE /datum/controller/subsystem/misc/Initialize() - setupgenetics() transfer_controller = new . = ..() diff --git a/code/datums/genetics/genetic_conditions.dm b/code/datums/genetics/genetic_conditions.dm new file mode 100644 index 00000000000..50b6469d233 --- /dev/null +++ b/code/datums/genetics/genetic_conditions.dm @@ -0,0 +1,133 @@ +/decl/genetic_condition + /// Descriptive name, used in VV panel. + var/name + /// Verb to be added or removed on activate/deactivate + var/grant_verb + /// Message shown when the gene is activated. + var/activation_message + /// Message shown when the gene is deactivated. + var/deactivation_message + /// State to use for underlays. + var/underlay_state + /// Icon to pull mob underlays from. + var/underlay_icon = 'icons/effects/genetics.dmi' + /// Type that this gene can apply to. + var/expected_type = /mob/living/carbon/human + /// Required return result from isSynthetic() for the gene to activate, if not null. + var/check_synthetic = FALSE + /// Set to FALSE if mob snapshots should not include this condition. + var/is_heritable = TRUE + +/decl/genetic_condition/proc/activate_condition(mob/living/M) + if(istype(M, expected_type) && M.can_have_genetic_conditions()) + if(!isnull(check_synthetic) && M.isSynthetic() != check_synthetic) + return FALSE + if(grant_verb) + M.verbs |= grant_verb + if(activation_message) + to_chat(M, SPAN_NOTICE(activation_message)) + return TRUE + return FALSE + +/decl/genetic_condition/proc/deactivate_condition(mob/living/M) + if(istype(M, expected_type) && M.can_have_genetic_conditions()) + if(!isnull(check_synthetic) && M.isSynthetic() != check_synthetic) + return FALSE + if(grant_verb) + M.verbs -= grant_verb + if(deactivation_message) + to_chat(M, SPAN_NOTICE(deactivation_message)) + return TRUE + return FALSE + +/decl/genetic_condition/proc/get_mob_overlay() + if(underlay_icon && underlay_state) + return overlay_image(underlay_icon, underlay_state) + +/decl/genetic_condition/superpower + abstract_type = /decl/genetic_condition/superpower + +/decl/genetic_condition/superpower/no_breath + name = "No Breathing" + activation_message = "You feel no need to breathe." + +/decl/genetic_condition/superpower/remoteview + name = "Remote Viewing" + grant_verb = /mob/living/carbon/human/proc/remoteobserve + activation_message = "Your mind expands." + +/decl/genetic_condition/superpower/running + name = "Super Speed" + activation_message = "Your leg muscles pulsate." + +/decl/genetic_condition/superpower/remotetalk + name = "Telepathy" + grant_verb = /mob/living/carbon/human/proc/remotesay + activation_message = "You expand your mind outwards." + +/decl/genetic_condition/superpower/morph + name = "Morph" + grant_verb = /mob/living/carbon/human/proc/morph + activation_message = "Your skin feels strange." + +/decl/genetic_condition/superpower/cold_resist + name = "Cold Resistance" + underlay_state = "fire_s" + activation_message = "Your body is filled with warmth." + +/decl/genetic_condition/superpower/noprints + name = "No Prints" + activation_message = "Your fingers feel numb." + +/decl/genetic_condition/superpower/xray + name = "X-Ray Vision" + activation_message = "The walls suddenly disappear." + +/decl/genetic_condition/superpower/space_resist + name = "Space Resistance" + activation_message = "Your skin feels strange." + +/decl/genetic_condition/disability + abstract_type = /decl/genetic_condition/disability + +/decl/genetic_condition/disability/clumsy + name = "Clumsy" + +/decl/genetic_condition/disability/nearsighted + name = "Nearsighted" + +/decl/genetic_condition/disability/epilepsy + name = "Epilepsy" + +/decl/genetic_condition/disability/coughing + name = "Coughing" + +/decl/genetic_condition/disability/tourettes + name = "Tourettes" + +/decl/genetic_condition/disability/nervous + name = "Nervous" + +/decl/genetic_condition/disability/blinded + name = "Blinded" + check_synthetic = null + +/decl/genetic_condition/disability/muted + name = "Mute" + check_synthetic = null + +/decl/genetic_condition/disability/deafened + name = "Deafened" + check_synthetic = null + +/decl/genetic_condition/husk + name = "Husk" + +/decl/genetic_condition/husk/activate_condition(mob/living/M) + . = ..() + if(.) + SET_FACIAL_HAIR_STYLE(M, /decl/sprite_accessory/facial_hair/shaved, TRUE) + SET_HAIR_STYLE(M, /decl/sprite_accessory/hair/bald, TRUE) + for(var/obj/item/organ/external/E in M.get_external_organs()) + E.status |= ORGAN_DISFIGURED + M.update_body(TRUE) \ No newline at end of file diff --git a/code/datums/repositories/decls.dm b/code/datums/repositories/decls.dm index becad8e33f5..e7898fa23c3 100644 --- a/code/datums/repositories/decls.dm +++ b/code/datums/repositories/decls.dm @@ -117,24 +117,28 @@ var/global/repository/decls/decls_repository = new . += decl /repository/decls/proc/get_decls_of_type_unassociated(var/decl_prototype) + RETURN_TYPE(/list) . = fetched_decl_instances[decl_prototype] if(!.) . = get_decls_unassociated(typesof(decl_prototype)) fetched_decl_instances[decl_prototype] = . /repository/decls/proc/get_decls_of_subtype_unassociated(var/decl_prototype) + RETURN_TYPE(/list) . = fetched_decl_subinstances[decl_prototype] if(!.) . = get_decls_unassociated(subtypesof(decl_prototype)) fetched_decl_subinstances[decl_prototype] = . /repository/decls/proc/get_decls_of_type(var/decl_prototype) + RETURN_TYPE(/list) . = fetched_decl_types[decl_prototype] if(!.) . = get_decls(typesof(decl_prototype)) fetched_decl_types[decl_prototype] = . /repository/decls/proc/get_decls_of_subtype(var/decl_prototype) + RETURN_TYPE(/list) . = fetched_decl_subtypes[decl_prototype] if(!.) . = get_decls(subtypesof(decl_prototype)) diff --git a/code/game/antagonist/antagonist_create.dm b/code/game/antagonist/antagonist_create.dm index 10c459c2c7d..fb6050b4a94 100644 --- a/code/game/antagonist/antagonist_create.dm +++ b/code/game/antagonist/antagonist_create.dm @@ -90,8 +90,6 @@ if (newname) player.real_name = newname player.SetName(player.real_name) - if(player.dna) - player.dna.real_name = newname if(player.mind) player.mind.name = player.name // Update any ID cards. update_access(player) diff --git a/code/game/atoms.dm b/code/game/atoms.dm index f9d907336f6..4f95eaea82d 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -511,17 +511,11 @@ if(atom_flags & ATOM_FLAG_NO_BLOOD) return FALSE - if(!blood_DNA || !istype(blood_DNA, /list)) //if our list of DNA doesn't exist yet (or isn't a list) initialize it. + if(!islist(blood_DNA)) //if our list of DNA doesn't exist yet (or isn't a list) initialize it. blood_DNA = list() was_bloodied = 1 - blood_color = COLOR_BLOOD_HUMAN - if(istype(M)) - if (!istype(M.dna, /datum/dna)) - M.dna = new /datum/dna() - M.dna.real_name = M.real_name - M.check_dna() - blood_color = M.get_blood_color() + blood_color = istype(M) ? M.get_blood_color() : COLOR_BLOOD_HUMAN return TRUE /** diff --git a/code/game/dna/dna2.dm b/code/game/dna/dna2.dm deleted file mode 100644 index 2957ea3bafe..00000000000 --- a/code/game/dna/dna2.dm +++ /dev/null @@ -1,353 +0,0 @@ -/** -* DNA 2: The Spaghetti Strikes Back -* -* @author N3X15 -*/ - -// What each index means: -#define DNA_OFF_LOWERBOUND 0 -#define DNA_OFF_UPPERBOUND 1 -#define DNA_ON_LOWERBOUND 2 -#define DNA_ON_UPPERBOUND 3 - -// Define block bounds (off-low,off-high,on-low,on-high) -// Used in setupgame.dm -#define DNA_DEFAULT_BOUNDS list(1,2049,2050,4095) -#define DNA_HARDER_BOUNDS list(1,3049,3050,4095) -#define DNA_HARD_BOUNDS list(1,3490,3500,4095) - -// UI Indices (can change to mutblock style, if desired) -#define DNA_UI_SKIN_TONE 1 -#define DNA_UI_SKIN_R 2 -#define DNA_UI_SKIN_G 3 -#define DNA_UI_SKIN_B 4 -#define DNA_UI_EYES_R 5 -#define DNA_UI_EYES_G 6 -#define DNA_UI_EYES_B 7 -#define DNA_UI_GENDER 8 -#define DNA_UI_LENGTH 8 // Update this when you add something, or you WILL break shit. - -#define DNA_SE_LENGTH 27 -// For later: -//#define DNA_SE_LENGTH 50 // Was STRUCDNASIZE, size 27. 15 new blocks added = 42, plus room to grow. - - -// Defines which values mean "on" or "off". -// This is to make some of the more OP superpowers a larger PITA to activate, -// and to tell our new DNA datum which values to set in order to turn something -// on or off. -var/global/list/dna_activity_bounds[DNA_SE_LENGTH] - -// Used to determine what each block means (admin hax and species stuff on /vg/, mostly) -var/global/list/assigned_blocks[DNA_SE_LENGTH] - -///////////////// -// GENE DEFINES -///////////////// -// Skip checking if it's already active. -// Used for genes that check for value rather than a binary on/off. -#define GENE_ALWAYS_ACTIVATE 1 - -/datum/dna - // READ-ONLY, GETS OVERWRITTEN - // DO NOT FUCK WITH THESE OR BYOND WILL EAT YOUR FACE - var/uni_identity="" // Encoded UI - var/struc_enzymes="" // Encoded SE - var/unique_enzymes="" // MD5 of mob genetic marker value - - var/fingerprint - - // Internal dirtiness checks - var/dirtyUI=0 - var/dirtySE=0 - - // Okay to read, but you're an idiot if you do. - // BLOCK = VALUE - var/list/SE[DNA_SE_LENGTH] - var/list/UI[DNA_UI_LENGTH] - - // From old dna. - var/b_type = "A+" // Should probably change to an integer => string map but I'm lazy. - var/real_name // Stores the real name of the person who originally got this dna datum. - - // New stuff - var/species - var/list/heritable_sprite_accessories = list() - var/lineage - //#TODO: Keep track of bodytype!!!!! - -// Make a copy of this strand. -/datum/dna/PopulateClone(datum/dna/clone) - clone = ..() - clone.lineage = lineage - clone.unique_enzymes = unique_enzymes - clone.fingerprint = fingerprint - clone.b_type = b_type - clone.real_name = real_name - clone.species = species || global.using_map.default_species - clone.heritable_sprite_accessories = deepCopyList(heritable_sprite_accessories) - for(var/b in 1 to DNA_SE_LENGTH) - clone.SE[b] = SE[b] - if(b <= DNA_UI_LENGTH) - clone.UI[b] = UI[b] - clone.UpdateUI() - clone.UpdateSE() - return clone - -/////////////////////////////////////// -// UNIQUE IDENTITY -/////////////////////////////////////// - -// Create random UI. -/datum/dna/proc/ResetUI(var/defer=0) - for(var/i=1,i<=DNA_UI_LENGTH,i++) - switch(i) - if(DNA_UI_SKIN_TONE) - SetUIValueRange(DNA_UI_SKIN_TONE,rand(1,220),220,1) // Otherwise, it gets fucked - else - UI[i]=rand(0,4095) - if(!defer) - UpdateUI() - -/datum/dna/proc/ResetUIFrom(var/mob/living/carbon/human/character) - // INITIALIZE! - ResetUI(1) - - var/eye_colour = character.get_eye_colour() - SetUIValueRange(DNA_UI_EYES_R, HEX_RED(eye_colour), 255, 1) - SetUIValueRange(DNA_UI_EYES_G, HEX_GREEN(eye_colour), 255, 1) - SetUIValueRange(DNA_UI_EYES_B, HEX_BLUE(eye_colour), 255, 1) - - var/skin_colour = character.get_skin_colour() - SetUIValueRange(DNA_UI_SKIN_R, HEX_RED(skin_colour), 255, 1) - SetUIValueRange(DNA_UI_SKIN_G, HEX_GREEN(skin_colour), 255, 1) - SetUIValueRange(DNA_UI_SKIN_B, HEX_BLUE(skin_colour), 255, 1) - - SetUIValueRange(DNA_UI_SKIN_TONE, 35-character.skin_tone, 220, 1) // Value can be negative. - - SetUIState(DNA_UI_GENDER, character.gender!=MALE, 1) - - fingerprint = character.get_full_print(ignore_blockers = TRUE) - unique_enzymes = character.get_unique_enzymes() - - heritable_sprite_accessories.Cut() - for(var/obj/item/organ/external/E in character.get_external_organs()) - var/list/sprite_accessories = E.get_heritable_sprite_accessories() - if(LAZYLEN(sprite_accessories)) - heritable_sprite_accessories[E.organ_tag] = sprite_accessories - - b_type = character.get_blood_type() - - UpdateUI() - -// Set a DNA UI block's raw value. -/datum/dna/proc/SetUIValue(var/block,var/value,var/defer=0) - if (block<=0) return - ASSERT(value>0) - ASSERT(value<=4095) - UI[block]=value - dirtyUI=1 - if(!defer) - UpdateUI() - -// Get a DNA UI block's raw value. -/datum/dna/proc/GetUIValue(var/block) - if (block<=0) return 0 - return UI[block] - -// Set a DNA UI block's value, given a value and a max possible value. -// Used in hair and facial styles (value being the index and maxvalue being the len of the hairstyle list) -/datum/dna/proc/SetUIValueRange(var/block,var/value,var/maxvalue,var/defer=0) - if (block<=0) return - if (value==0) value = 1 // FIXME: hair/beard/eye RGB values if they are 0 are not set, this is a work around we'll encode it in the DNA to be 1 instead. - ASSERT(maxvalue<=4095) - var/range = (4095 / maxvalue) - if(value) - SetUIValue(block,round(value * range),defer) - -// Getter version of above. -/datum/dna/proc/GetUIValueRange(var/block,var/maxvalue) - if (block<=0) return 0 - var/value = GetUIValue(block) - return round(1 +(value / 4096)*maxvalue) - -// Is the UI gene "on" or "off"? -// For UI, this is simply a check of if the value is > 2050. -/datum/dna/proc/GetUIState(var/block) - if (block<=0) return - return UI[block] > 2050 - - -// Set UI gene "on" (1) or "off" (0) -/datum/dna/proc/SetUIState(var/block,var/on,var/defer=0) - if (block<=0) return - var/val - if(on) - val=rand(2050,4095) - else - val=rand(1,2049) - SetUIValue(block,val,defer) - -// Get a hex-encoded UI block. -/datum/dna/proc/GetUIBlock(var/block) - return EncodeDNABlock(GetUIValue(block)) - -// Do not use this unless you absolutely have to. -// Set a block from a hex string. This is inefficient. If you can, use SetUIValue(). -// Used in DNA modifiers. -/datum/dna/proc/SetUIBlock(var/block,var/value,var/defer=0) - if (block<=0) return - return SetUIValue(block,hex2num(value),defer) - -// Get a sub-block from a block. -/datum/dna/proc/GetUISubBlock(var/block,var/subBlock) - return copytext(GetUIBlock(block),subBlock,subBlock+1) - -// Do not use this unless you absolutely have to. -// Set a block from a hex string. This is inefficient. If you can, use SetUIValue(). -// Used in DNA modifiers. -/datum/dna/proc/SetUISubBlock(var/block,var/subBlock, var/newSubBlock, var/defer=0) - if (block<=0) return - var/oldBlock=GetUIBlock(block) - var/newBlock="" - for(var/i=1, i<=length(oldBlock), i++) - if(i==subBlock) - newBlock+=newSubBlock - else - newBlock+=copytext(oldBlock,i,i+1) - SetUIBlock(block,newBlock,defer) - -/////////////////////////////////////// -// STRUCTURAL ENZYMES -/////////////////////////////////////// - -// "Zeroes out" all of the blocks. -/datum/dna/proc/ResetSE() - for(var/i = 1, i <= DNA_SE_LENGTH, i++) - SetSEValue(i,rand(1,1024),1) - UpdateSE() - -// Set a DNA SE block's raw value. -/datum/dna/proc/SetSEValue(var/block,var/value,var/defer=0) - if (block<=0) return - ASSERT(value>=0) - ASSERT(value<=4095) - SE[block]=value - dirtySE=1 - if(!defer) - UpdateSE() - -// Get a DNA SE block's raw value. -/datum/dna/proc/GetSEValue(var/block) - if (block<=0) return 0 - return SE[block] - -// Set a DNA SE block's value, given a value and a max possible value. -// Might be used for species? -/datum/dna/proc/SetSEValueRange(var/block,var/value,var/maxvalue) - if (block<=0) return - ASSERT(maxvalue<=4095) - var/range = round(4095 / maxvalue) - if(value) - SetSEValue(block, value * range - rand(1,range-1)) - -// Getter version of above. -/datum/dna/proc/GetSEValueRange(var/block,var/maxvalue) - if (block<=0) return 0 - var/value = GetSEValue(block) - return round(1 +(value / 4096)*maxvalue) - -// Is the block "on" (1) or "off" (0)? (Un-assigned genes are always off.) -/datum/dna/proc/GetSEState(var/block) - if (block<=0) return 0 - var/list/BOUNDS=GetDNABounds(block) - var/value=GetSEValue(block) - return (value > BOUNDS[DNA_ON_LOWERBOUND]) - -// Set a block "on" or "off". -/datum/dna/proc/SetSEState(var/block,var/on,var/defer=0) - if (block<=0) return - var/list/BOUNDS=GetDNABounds(block) - var/val - if(on) - val=rand(BOUNDS[DNA_ON_LOWERBOUND],BOUNDS[DNA_ON_UPPERBOUND]) - else - val=rand(1,BOUNDS[DNA_OFF_UPPERBOUND]) - SetSEValue(block,val,defer) - -// Get hex-encoded SE block. -/datum/dna/proc/GetSEBlock(var/block) - return EncodeDNABlock(GetSEValue(block)) - -// Do not use this unless you absolutely have to. -// Set a block from a hex string. This is inefficient. If you can, use SetUIValue(). -// Used in DNA modifiers. -/datum/dna/proc/SetSEBlock(var/block,var/value,var/defer=0) - if (block<=0) return - var/nval=hex2num(value) - //testing("SetSEBlock([block],[value],[defer]): [value] -> [nval]") - return SetSEValue(block,nval,defer) - -/datum/dna/proc/GetSESubBlock(var/block,var/subBlock) - return copytext(GetSEBlock(block),subBlock,subBlock+1) - -// Do not use this unless you absolutely have to. -// Set a sub-block from a hex character. This is inefficient. If you can, use SetUIValue(). -// Used in DNA modifiers. -/datum/dna/proc/SetSESubBlock(var/block,var/subBlock, var/newSubBlock, var/defer=0) - if (block<=0) return - var/oldBlock=GetSEBlock(block) - var/newBlock="" - for(var/i=1, i<=length(oldBlock), i++) - if(i==subBlock) - newBlock+=newSubBlock - else - newBlock+=copytext(oldBlock,i,i+1) - //testing("SetSESubBlock([block],[subBlock],[newSubBlock],[defer]): [oldBlock] -> [newBlock]") - SetSEBlock(block,newBlock,defer) - -/proc/EncodeDNABlock(var/value) - return num2hex_padded(value, 3) - -/datum/dna/proc/UpdateUI() - src.uni_identity="" - for(var/block in UI) - uni_identity += EncodeDNABlock(block) - //testing("New UI: [uni_identity]") - dirtyUI=0 - -/datum/dna/proc/UpdateSE() - //var/oldse=struc_enzymes - struc_enzymes="" - for(var/block in SE) - struc_enzymes += EncodeDNABlock(block) - //testing("Old SE: [oldse]") - //testing("New SE: [struc_enzymes]") - dirtySE=0 - -// BACK-COMPAT! -// Just checks our character has all the crap it needs. -/datum/dna/proc/check_integrity(var/mob/living/carbon/human/character) - if(character) - if(UI.len != DNA_UI_LENGTH) - ResetUIFrom(character) - - if(length(struc_enzymes)!= 3*DNA_SE_LENGTH) - ResetSE() - - if(length(unique_enzymes) != 32) - unique_enzymes = md5(num2text(character.original_genetic_seed)) - else - if(!species) - species = global.using_map.default_species - if(length(uni_identity) != 3*DNA_UI_LENGTH) - uni_identity = "00600200A00E0110148FC01300B0095BD7FD3F4" - if(length(struc_enzymes)!= 3*DNA_SE_LENGTH) - struc_enzymes = "43359156756131E13763334D1C369012032164D4FE4CD61544B6C03F251B6C60A42821D26BA3B0FD6" - -// BACK-COMPAT! -// Initial DNA setup. I'm kind of wondering why the hell this doesn't just call the above. -/datum/dna/proc/ready_dna(mob/living/carbon/human/character) - ResetUIFrom(character) - ResetSE() - unique_enzymes = character.get_unique_enzymes() diff --git a/code/game/dna/dna2_domutcheck.dm b/code/game/dna/dna2_domutcheck.dm deleted file mode 100644 index fbbcc3c612f..00000000000 --- a/code/game/dna/dna2_domutcheck.dm +++ /dev/null @@ -1,50 +0,0 @@ -// (Re-)Apply mutations. -// TODO: Turn into a /mob proc, change inj to a bitflag for various forms of differing behavior. -// M: Mob to mess with -// connected: Machine we're in, type unchecked so I doubt it's used beyond monkeying -// flags: See below, bitfield. -#define MUTCHK_FORCED 1 -/proc/domutcheck(var/mob/living/M, var/connected=null, var/flags=0) - if(ishuman(M)) - var/mob/living/carbon/human/H = M - if(!H.should_have_organ(BP_HEART)) - return - - var/list/all_genes = decls_repository.get_decls_of_subtype(/decl/gene) - for(var/gene_type in all_genes) - var/decl/gene/gene = all_genes[gene_type] - if(!M || !M.dna) - return - if(!gene.block) - continue - - // Sanity checks, don't skip. - if(!gene.can_activate(M,flags)) - //testing("[M] - Failed to activate [gene.name] (can_activate fail).") - continue - - // Current state - var/gene_active = (gene.flags & GENE_ALWAYS_ACTIVATE) - if(!gene_active) - gene_active = M.dna.GetSEState(gene.block) - - // Prior state - var/gene_prior_status = (gene.type in M.active_genes) - var/changed = gene_active != gene_prior_status || (gene.flags & GENE_ALWAYS_ACTIVATE) - - // If gene state has changed: - if(changed) - // Gene active (or ALWAYS ACTIVATE) - if(gene_active || (gene.flags & GENE_ALWAYS_ACTIVATE)) - testing("[gene.name] activated!") - gene.activate(M,connected,flags) - if(M) - LAZYDISTINCTADD(M.active_genes, gene.type) - M.queue_icon_update() - // If Gene is NOT active: - else - testing("[gene.name] deactivated!") - gene.deactivate(M,connected,flags) - if(M) - LAZYREMOVE(M.active_genes, gene.type) - M.queue_icon_update() diff --git a/code/game/dna/dna2_helpers.dm b/code/game/dna/dna2_helpers.dm deleted file mode 100644 index d413e8d467d..00000000000 --- a/code/game/dna/dna2_helpers.dm +++ /dev/null @@ -1,105 +0,0 @@ -///////////////////////////// -// Helpers for DNA2 -///////////////////////////// - -// DNA Gene activation boundaries, see dna2.dm. -// Returns a list object with 4 numbers. -/proc/GetDNABounds(var/block) - var/list/BOUNDS=dna_activity_bounds[block] - if(!istype(BOUNDS)) - return DNA_DEFAULT_BOUNDS - return BOUNDS - -// Give Random Bad Mutation to M -/proc/randmutb(var/mob/living/M) - if(!M) return - if(ishuman(M)) - var/mob/living/carbon/human/H = M - if(!H.should_have_organ(BP_HEART)) - return - M.dna.check_integrity() - var/block = pick(global.GLASSESBLOCK,global.COUGHBLOCK,global.FAKEBLOCK,global.NERVOUSBLOCK,global.CLUMSYBLOCK,global.TWITCHBLOCK,global.HEADACHEBLOCK,global.BLINDBLOCK,global.DEAFBLOCK,global.HALLUCINATIONBLOCK) - M.dna.SetSEState(block, 1) - -// Give Random Good Mutation to M -/proc/randmutg(var/mob/living/M) - if(!M) return - if(ishuman(M)) - var/mob/living/carbon/human/H = M - if(!H.should_have_organ(BP_HEART)) - return - M.dna.check_integrity() - var/block = pick(global.XRAYBLOCK,global.FIREBLOCK,global.TELEBLOCK,global.NOBREATHBLOCK,global.REMOTEVIEWBLOCK,global.REGENERATEBLOCK,global.INCREASERUNBLOCK,global.REMOTETALKBLOCK,global.MORPHBLOCK,global.BLENDBLOCK,global.NOPRINTSBLOCK,global.SHOCKIMMUNITYBLOCK,global.SMALLSIZEBLOCK) - M.dna.SetSEState(block, 1) - -// Random Appearance Mutation -/proc/randmuti(var/mob/living/M) - if(!M) return - M.dna.check_integrity() - M.dna.SetUIValue(rand(1,DNA_UI_LENGTH),rand(1,4095)) - -// Scramble UI or SE. -/proc/scramble(var/UI, var/mob/M, var/prob) - if(!M) return - M.dna.check_integrity() - if(UI) - for(var/i = 1, i <= DNA_UI_LENGTH-1, i++) - if(prob(prob)) - M.dna.SetUIValue(i,rand(1,4095),1) - M.dna.UpdateUI() - M.UpdateAppearance() - - else - for(var/i = 1, i <= DNA_SE_LENGTH-1, i++) - if(prob(prob)) - M.dna.SetSEValue(i,rand(1,4095),1) - M.dna.UpdateSE() - domutcheck(M, null) - return - -// /proc/updateappearance has changed behavior, so it's been removed -// Use mob.UpdateAppearance() instead. - -// Simpler. Don't specify UI in order for the mob to use its own. -/mob/proc/UpdateAppearance(var/list/UI=null) - return FALSE - -/mob/living/carbon/human/UpdateAppearance(var/list/UI=null) - - if(UI!=null) - src.dna.UI=UI - src.dna.UpdateUI() - - dna.check_integrity() - - fingerprint = dna.fingerprint - unique_enzymes = dna.unique_enzymes - set_skin_colour( rgb(dna.GetUIValueRange(DNA_UI_SKIN_R,255), dna.GetUIValueRange(DNA_UI_SKIN_G,255), dna.GetUIValueRange(DNA_UI_SKIN_B,255))) - set_eye_colour( rgb(dna.GetUIValueRange(DNA_UI_EYES_R,255), dna.GetUIValueRange(DNA_UI_EYES_G,255), dna.GetUIValueRange(DNA_UI_EYES_B,255))) - skin_tone = 35 - dna.GetUIValueRange(DNA_UI_SKIN_TONE, 220) // Value can be negative. - - - // TODO: update DNA gender to not be a bool - use bodytype and pronouns - //Body markings - for(var/tag in dna.heritable_sprite_accessories) - var/obj/item/organ/external/E = GET_EXTERNAL_ORGAN(src, tag) - if(E) - var/list/marklist = dna.heritable_sprite_accessories[tag] - if(length(marklist)) - for(var/accessory in marklist) - E.set_sprite_accessory(accessory, null, marklist[accessory], skip_update = TRUE) - else - E.clear_sprite_accessories(skip_update = TRUE) - - //Base skin and blend - for(var/obj/item/organ/organ in get_organs()) - organ.set_dna(dna) - - force_update_limbs() - update_hair(update_icons = FALSE) - update_eyes() - return TRUE - -// Used below, simple injection modifier. -/proc/probinj(var/pr, var/inj) - return prob(pr+inj*pr) diff --git a/code/game/dna/genes/disabilities.dm b/code/game/dna/genes/disabilities.dm deleted file mode 100644 index fbd088939f6..00000000000 --- a/code/game/dna/genes/disabilities.dm +++ /dev/null @@ -1,133 +0,0 @@ -///////////////////// -// DISABILITY GENES -// -// These activate either a mutation, disability, or sdisability. -// -// Gene is always activated. -///////////////////// - -/decl/gene/disability - name="DISABILITY" - /// Mutation to give (or 0) - var/mutation=0 - /// Disability to give (or 0) - var/disability=0 - /// SDisability to give (or 0) - var/sdisability=0 - /// Activation message - var/activation_message="" - /// Yay, you're no longer growing 3 arms - var/deactivation_message="" - -/decl/gene/disability/can_activate(var/mob/M,var/flags) - return 1 // Always set! - -/decl/gene/disability/activate(var/mob/M, var/connected, var/flags) - if(mutation && !(mutation in M.mutations)) - M.mutations.Add(mutation) - if(disability) - M.disabilities|=disability - if(sdisability) - M.set_sdisability(sdisability) - if(activation_message) - to_chat(M, "[activation_message]") - else - testing("[name] has no activation message.") - -/decl/gene/disability/deactivate(var/mob/M, var/connected, var/flags) - if(mutation && (mutation in M.mutations)) - M.mutations.Remove(mutation) - if(disability) - M.disabilities &= (~disability) - if(sdisability) - M.unset_sdisability(sdisability) - if(deactivation_message) - to_chat(M, "[deactivation_message]") - else - testing("[name] has no deactivation message.") - -// Note: Doesn't seem to do squat, at the moment. -/decl/gene/disability/hallucinate - name="Hallucinate" - activation_message="Your mind says 'Hello'." - mutation=mHallucination - -/decl/gene/disability/hallucinate/Initialize() - . = ..() - block=global.HALLUCINATIONBLOCK - -/decl/gene/disability/epilepsy - name="Epilepsy" - activation_message="You get a headache." - disability=EPILEPSY - -/decl/gene/disability/epilepsy/Initialize() - . = ..() - block=global.HEADACHEBLOCK - -/decl/gene/disability/cough - name="Coughing" - activation_message="You start coughing." - disability=COUGHING - -/decl/gene/disability/cough/Initialize() - . = ..() - block=global.COUGHBLOCK - -/decl/gene/disability/clumsy - name="Clumsiness" - activation_message="You feel lightheaded." - mutation=MUTATION_CLUMSY - -/decl/gene/disability/clumsy/Initialize() - . = ..() - block=global.CLUMSYBLOCK - -/decl/gene/disability/tourettes - name="Tourettes" - activation_message="You twitch." - disability=TOURETTES - -/decl/gene/disability/tourettes/Initialize() - . = ..() - block=global.TWITCHBLOCK - -/decl/gene/disability/nervousness - name="Nervousness" - activation_message="You feel nervous." - disability=NERVOUS - -/decl/gene/disability/nervousness/Initialize() - . = ..() - block=global.NERVOUSBLOCK - -/decl/gene/disability/blindness - name="Blindness" - activation_message="You can't seem to see anything." - sdisability=BLINDED - -/decl/gene/disability/blindness/Initialize() - . = ..() - block=global.BLINDBLOCK - -/decl/gene/disability/deaf - name="Deafness" - activation_message="It's kinda quiet." - sdisability=DEAFENED - -/decl/gene/disability/deaf/Initialize() - . = ..() - block=global.DEAFBLOCK - -/decl/gene/disability/deaf/activate(var/mob/M, var/connected, var/flags) - ..(M,connected,flags) - M.set_status(STAT_DEAF, 1) - -/decl/gene/disability/nearsighted - name="Nearsightedness" - activation_message="Your eyes feel weird..." - disability=NEARSIGHTED - -/decl/gene/disability/nearsighted/Initialize() - . = ..() - block=global.GLASSESBLOCK diff --git a/code/game/dna/genes/gene.dm b/code/game/dna/genes/gene.dm deleted file mode 100644 index e137b1cb97a..00000000000 --- a/code/game/dna/genes/gene.dm +++ /dev/null @@ -1,97 +0,0 @@ -/decl/gene - /// Display name - var/name="BASE GENE" - /// What gene activates this? - var/block = 0 - /// Any of a number of GENE_ flags. - var/flags=0 - -/// Is the gene active in this mob's DNA? -/decl/gene/proc/is_active(var/mob/M) - return (type in M.active_genes) - -/decl/gene/proc/can_activate(var/mob/M, var/flags) - return FALSE - -/// Called when the gene activates. Do your magic here. -/decl/gene/proc/activate(var/mob/M, var/connected, var/flags) - return - -// Called when the gene deactivates. Undo your magic here. -/decl/gene/proc/deactivate(var/mob/M, var/connected, var/flags) - return - -// This section inspired by goone's bioEffects. - -/** -* Called in each life() tick. -*/ -/decl/gene/proc/OnMobLife(var/mob/M) - return - -/** -* Called when the mob dies -*/ -/decl/gene/proc/OnMobDeath(var/mob/M) - return - -/** -* Called when the mob says shit -*/ -/decl/gene/proc/OnSay(var/mob/M, var/message) - return message - -/** -* Called after the mob runs update_icons. -* -* @params M The subject. -* @params g Gender (m or f) -*/ -/decl/gene/proc/OnDrawUnderlays(var/mob/M, var/g) - return 0 - - -///////////////////// -// BASIC GENES -// -// These just chuck in a mutation and display a message. -// -// Gene is activated: -// 1. If mutation already exists in mob -// 2. If the probability roll succeeds -// 3. Activation is forced (done in domutcheck) -///////////////////// - - -/decl/gene/basic - name="BASIC GENE" - /// Mutation to give - var/mutation=0 - /// Activation probability - var/activation_prob=45 - /// Possible activation messages - var/activation_messages - /// Possible deactivation messages - var/deactivation_messages - -/decl/gene/basic/can_activate(var/mob/M,var/flags) - if(flags & MUTCHK_FORCED) - return 1 - // Probability check - return probinj(activation_prob,(flags&MUTCHK_FORCED)) - -/decl/gene/basic/activate(var/mob/M) - M.mutations.Add(mutation) - if(length(activation_messages)) - if(islist(activation_messages)) - to_chat(M, SPAN_NOTICE(pick(activation_messages))) - else - to_chat(M, SPAN_NOTICE(activation_messages)) - -/decl/gene/basic/deactivate(var/mob/M) - M.mutations.Remove(mutation) - if(length(deactivation_messages)) - if(islist(deactivation_messages)) - to_chat(M, SPAN_WARNING(pick(deactivation_messages))) - else - to_chat(M, SPAN_WARNING(deactivation_messages)) diff --git a/code/game/dna/genes/powers.dm b/code/game/dna/genes/powers.dm deleted file mode 100644 index c73b16d0eec..00000000000 --- a/code/game/dna/genes/powers.dm +++ /dev/null @@ -1,118 +0,0 @@ -/////////////////////////////////// -// POWERS -/////////////////////////////////// - -/decl/gene/basic/nobreath - name="No Breathing" - activation_messages="You feel no need to breathe." - mutation=mNobreath - -/decl/gene/basic/nobreath/Initialize() - . = ..() - block=global.NOBREATHBLOCK - -/decl/gene/basic/remoteview - name="Remote Viewing" - activation_messages="Your mind expands." - mutation=mRemote - -/decl/gene/basic/remoteview/Initialize() - . = ..() - block=global.REMOTEVIEWBLOCK - -/decl/gene/basic/remoteview/activate(var/mob/M, var/connected, var/flags) - ..(M,connected,flags) - M.verbs += /mob/living/carbon/human/proc/remoteobserve - -/decl/gene/basic/regenerate - name="Regenerate" - activation_messages="You feel better." - mutation=mRegen - -/decl/gene/basic/regenerate/Initialize() - . = ..() - block=global.REGENERATEBLOCK - -/decl/gene/basic/regenerate - name="Super Speed" - activation_messages="Your leg muscles pulsate." - mutation=mRun - -/decl/gene/basic/regenerate/Initialize() - . = ..() - block=global.INCREASERUNBLOCK - -/decl/gene/basic/remotetalk - name="Telepathy" - activation_messages="You expand your mind outwards." - mutation=mRemotetalk - -/decl/gene/basic/remotetalk/Initialize() - . = ..() - block=global.REMOTETALKBLOCK - -/decl/gene/basic/remotetalk/activate(var/mob/M, var/connected, var/flags) - ..(M,connected,flags) - M.verbs += /mob/living/carbon/human/proc/remotesay - -/decl/gene/basic/morph - name="Morph" - activation_messages="Your skin feels strange." - mutation=mMorph - -/decl/gene/basic/noshock/Initialize() - . = ..() - block=global.MORPHBLOCK - -/decl/gene/basic/morph/activate(var/mob/M) - ..(M) - M.verbs += /mob/living/carbon/human/proc/morph - -/decl/gene/basic/cold_resist - name="Cold Resistance" - activation_messages="Your body is filled with warmth." - mutation=MUTATION_COLD_RESISTANCE - -/decl/gene/basic/cold_resist/Initialize() - . = ..() - block=global.FIREBLOCK - -/decl/gene/basic/cold_resist/can_activate(var/mob/M,var/flags) - if(flags & MUTCHK_FORCED) - return 1 - // Probability check - var/_prob=30 - //if(mHeatres in M.mutations) - // _prob=5 - if(probinj(_prob,(flags&MUTCHK_FORCED))) - return 1 - -/decl/gene/basic/cold_resist/OnDrawUnderlays(var/mob/M,var/g) - return "fire_s" - -/decl/gene/basic/noprints - name="No Prints" - activation_messages="Your fingers feel numb." - mutation=mFingerprints - -/decl/gene/basic/noprints/Initialize() - . = ..() - block=global.NOPRINTSBLOCK - -/decl/gene/basic/noshock - name="Shock Immunity" - activation_messages="Your skin feels strange." - mutation=mShock - -/decl/gene/basic/noshock/Initialize() - . = ..() - block=global.SHOCKIMMUNITYBLOCK - -/decl/gene/basic/xray - name="X-Ray Vision" - activation_messages="The walls suddenly disappear." - mutation=MUTATION_XRAY - -/decl/gene/basic/xray/Initialize() - . = ..() - block=global.XRAYBLOCK diff --git a/code/game/gamemodes/endgame/ftl_jump/ftl_jump.dm b/code/game/gamemodes/endgame/ftl_jump/ftl_jump.dm index 88708dee839..7b9a494cc02 100644 --- a/code/game/gamemodes/endgame/ftl_jump/ftl_jump.dm +++ b/code/game/gamemodes/endgame/ftl_jump/ftl_jump.dm @@ -121,7 +121,7 @@ /obj/effect/bluegoast/proc/blueswitch() var/mob/living/carbon/human/H if(ishuman(daddy)) - H = new(get_turf(src), daddy.species.name, daddy.dna.Clone(), daddy.get_bodytype()) + H = new(get_turf(src), daddy.species.name, daddy.get_mob_snapshot(force = TRUE), daddy.get_bodytype()) for(var/obj/item/entry in daddy.get_equipped_items(TRUE)) daddy.remove_from_mob(entry) //steals instead of copies so we don't end up with duplicates H.equip_to_appropriate_slot(entry) diff --git a/code/game/gamemodes/setupgame.dm b/code/game/gamemodes/setupgame.dm deleted file mode 100644 index d6f168beea2..00000000000 --- a/code/game/gamemodes/setupgame.dm +++ /dev/null @@ -1,62 +0,0 @@ -///////////////////////// -// (mostly) DNA2 SETUP -///////////////////////// - -// Randomize block, assign a reference name, and optionally define difficulty (by making activation zone smaller or bigger) -// The name is used on /vg/ for species with predefined genetic traits, -// and for the DNA panel in the player panel. -/proc/getAssignedBlock(var/name,var/list/blocksLeft, var/activity_bounds=DNA_DEFAULT_BOUNDS) - if(blocksLeft.len==0) - warning("[name]: No more blocks left to assign!") - return 0 - var/assigned = pick(blocksLeft) - blocksLeft.Remove(assigned) - assigned_blocks[assigned]=name - dna_activity_bounds[assigned]=activity_bounds - //testing("[name] assigned to block #[assigned].") - return assigned - -/proc/setupgenetics() - - if (prob(50)) - // Currently unused. Will revisit. - N3X - global.BLOCKADD = rand(-300,300) - if (prob(75)) - global.DIFFMUT = rand(0,20) - - var/list/numsToAssign=new() - for(var/i=1;i\The [src] slips out of your hand.") user.try_unequip(src) return 0 diff --git a/code/game/objects/items/devices/scanners/health.dm b/code/game/objects/items/devices/scanners/health.dm index 22acf61c2d5..5c6bd87625c 100644 --- a/code/game/objects/items/devices/scanners/health.dm +++ b/code/game/objects/items/devices/scanners/health.dm @@ -19,7 +19,7 @@ if (!user.check_dexterity(DEXTERITY_COMPLEX_TOOLS)) return - if ((MUTATION_CLUMSY in user.mutations) && prob(50)) + if (user.has_genetic_condition(GENE_COND_CLUMSY) && prob(50)) user.visible_message("\The [user] runs \the [scanner] over the floor.") to_chat(user, "Scan results for the floor:") to_chat(user, "Overall Status: Healthy") diff --git a/code/game/objects/items/flashlights/_flashlight.dm b/code/game/objects/items/flashlights/_flashlight.dm index adba1167088..774c9caacb8 100644 --- a/code/game/objects/items/flashlights/_flashlight.dm +++ b/code/game/objects/items/flashlights/_flashlight.dm @@ -100,7 +100,7 @@ if(on && user.get_target_zone() == BP_EYES && target.should_have_organ(BP_HEAD)) add_fingerprint(user) - if((MUTATION_CLUMSY in user.mutations) && prob(50)) //too dumb to use flashlight properly + if(user.has_genetic_condition(GENE_COND_CLUMSY) && prob(50)) //too dumb to use flashlight properly return ..() //just hit them in the head for(var/slot in global.standard_headgear_slots) @@ -146,7 +146,7 @@ if(vision.owner.stat == DEAD || H.is_blind()) //mob is dead or fully blind to_chat(user, SPAN_WARNING("\The [H]'s pupils do not react to the light!")) return - if(MUTATION_XRAY in H.mutations) + if(H.has_genetic_condition(GENE_COND_XRAY)) to_chat(user, SPAN_NOTICE("\The [H]'s pupils give an eerie glow!")) if(vision.damage) to_chat(user, SPAN_WARNING("There's visible damage to [H]'s [vision.name]!")) diff --git a/code/game/objects/items/weapons/cards_ids_syndicate.dm b/code/game/objects/items/weapons/cards_ids_syndicate.dm index 03fe2b6375b..b81293ae41d 100644 --- a/code/game/objects/items/weapons/cards_ids_syndicate.dm +++ b/code/game/objects/items/weapons/cards_ids_syndicate.dm @@ -99,7 +99,7 @@ if(..()) return 1 - var/user = usr + var/mob/user = usr if(href_list["electronic_warfare"]) electronic_warfare = text2num(href_list["electronic_warfare"]) to_chat(user, "Electronic warfare [electronic_warfare ? "enabled" : "disabled"].") @@ -146,9 +146,7 @@ if("Blood Type") var/default = blood_type if(default == initial(blood_type) && ishuman(user)) - var/mob/living/carbon/human/H = user - if(H.dna) - default = H.dna.b_type + default = user.get_blood_type() var/new_blood_type = sanitize(input(user,"What blood type would you like to be written on this card?","Agent Card Blood Type",default) as null|text) if(!isnull(new_blood_type) && CanUseTopic(user, state)) src.blood_type = new_blood_type diff --git a/code/game/objects/items/weapons/grenades/grenade.dm b/code/game/objects/items/weapons/grenades/grenade.dm index b36e3360b4a..78c09ab8b61 100644 --- a/code/game/objects/items/weapons/grenades/grenade.dm +++ b/code/game/objects/items/weapons/grenades/grenade.dm @@ -39,7 +39,7 @@ add_overlay("[icon_state]-pin") /obj/item/grenade/proc/clown_check(var/mob/living/user) - if((MUTATION_CLUMSY in user.mutations) && prob(50)) + if(user.has_genetic_condition(GENE_COND_CLUMSY) && prob(50)) to_chat(user, "Huh? How does this thing work?") det_time = fail_det_time activate(user) diff --git a/code/game/objects/items/weapons/handcuffs.dm b/code/game/objects/items/weapons/handcuffs.dm index 7ebbdc18f1a..0e783251825 100644 --- a/code/game/objects/items/weapons/handcuffs.dm +++ b/code/game/objects/items/weapons/handcuffs.dm @@ -43,7 +43,7 @@ if(!user.check_dexterity(DEXTERITY_COMPLEX_TOOLS)) return ..() - if ((MUTATION_CLUMSY in user.mutations) && prob(50)) + if (user.has_genetic_condition(GENE_COND_CLUMSY) && prob(50)) to_chat(user, SPAN_WARNING("You can't figure out how to work \the [src]...")) place_handcuffs(user, user) return TRUE diff --git a/code/game/objects/items/weapons/material/kitchen.dm b/code/game/objects/items/weapons/material/kitchen.dm index b5f2ca93aed..3cc95aafa94 100644 --- a/code/game/objects/items/weapons/material/kitchen.dm +++ b/code/game/objects/items/weapons/material/kitchen.dm @@ -17,7 +17,7 @@ thrown_material_force_multiplier = 1 // as above /obj/item/kitchen/rollingpin/use_on_mob(mob/living/target, mob/living/user, animate = TRUE) - if ((MUTATION_CLUMSY in user.mutations) && prob(50) && user.try_unequip(src)) + if (user.has_genetic_condition(GENE_COND_CLUMSY) && prob(50) && user.try_unequip(src)) to_chat(user, SPAN_DANGER("\The [src] slips out of your hand and hits your head.")) user.take_organ_damage(10) SET_STATUS_MAX(user, STAT_PARA, 2) diff --git a/code/game/objects/items/weapons/material/knives.dm b/code/game/objects/items/weapons/material/knives.dm index 6d851c6c380..9d3be162f02 100644 --- a/code/game/objects/items/weapons/material/knives.dm +++ b/code/game/objects/items/weapons/material/knives.dm @@ -40,7 +40,7 @@ /obj/item/knife/use_on_mob(mob/living/target, mob/living/user, animate = TRUE) if(user.a_intent != I_HELP && user.get_target_zone() == BP_EYES) - if((MUTATION_CLUMSY in user.mutations) && prob(50)) + if(user.has_genetic_condition(GENE_COND_CLUMSY) && prob(50)) target = user return eyestab(target, user) return ..() diff --git a/code/game/objects/items/weapons/melee/energy.dm b/code/game/objects/items/weapons/melee/energy.dm index 1eee7a8b338..dbfd004126f 100644 --- a/code/game/objects/items/weapons/melee/energy.dm +++ b/code/game/objects/items/weapons/melee/energy.dm @@ -138,7 +138,7 @@ /obj/item/energy_blade/attack_self(mob/user) if(active) - if((MUTATION_CLUMSY in user.mutations) && prob(50)) + if(user.has_genetic_condition(GENE_COND_CLUMSY) && prob(50)) var/decl/pronouns/G = user.get_pronouns() user.visible_message( \ SPAN_DANGER("\The [user] accidentally cuts [G.self] with \the [src]."), \ diff --git a/code/game/objects/items/weapons/shields.dm b/code/game/objects/items/weapons/shields.dm index 3342015c383..a62bc8da919 100644 --- a/code/game/objects/items/weapons/shields.dm +++ b/code/game/objects/items/weapons/shields.dm @@ -185,7 +185,7 @@ return base_block_chance /obj/item/shield/energy/attack_self(mob/user) - if((MUTATION_CLUMSY in user.mutations) && prob(50)) + if(user.has_genetic_condition(GENE_COND_CLUMSY) && prob(50)) to_chat(user, SPAN_DANGER("You beat yourself in the head with [src].")) if(isliving(user)) var/mob/living/M = user diff --git a/code/game/objects/items/weapons/stunbaton.dm b/code/game/objects/items/weapons/stunbaton.dm index 683c1f12a31..673981fa3a0 100644 --- a/code/game/objects/items/weapons/stunbaton.dm +++ b/code/game/objects/items/weapons/stunbaton.dm @@ -95,7 +95,7 @@ update_icon() /obj/item/baton/use_on_mob(mob/living/target, mob/living/user, animate = TRUE) - if(status && (MUTATION_CLUMSY in user.mutations) && prob(50)) + if(status && user.has_genetic_condition(GENE_COND_CLUMSY) && prob(50)) to_chat(user, SPAN_DANGER("You accidentally hit yourself with the [src]!")) SET_STATUS_MAX(user, STAT_WEAK, 30) deductcharge(hitcost) diff --git a/code/game/objects/items/weapons/swords_axes_etc.dm b/code/game/objects/items/weapons/swords_axes_etc.dm index 2b072c46221..7387adce58f 100644 --- a/code/game/objects/items/weapons/swords_axes_etc.dm +++ b/code/game/objects/items/weapons/swords_axes_etc.dm @@ -18,7 +18,7 @@ material = /decl/material/solid/organic/wood /obj/item/classic_baton/use_on_mob(mob/living/target, mob/living/user, animate = TRUE) - if ((MUTATION_CLUMSY in user.mutations) && prob(50)) + if (user.has_genetic_condition(GENE_COND_CLUMSY) && prob(50)) to_chat(user, SPAN_WARNING("You club yourself over the head.")) SET_STATUS_MAX(user, STAT_WEAK, (3 * force)) if(ishuman(user)) @@ -74,7 +74,7 @@ icon = 'icons/obj/items/weapon/telebaton.dmi' /obj/item/telebaton/use_on_mob(mob/living/target, mob/living/user, animate = TRUE) - if(on && (MUTATION_CLUMSY in user.mutations) && prob(50)) + if(on && user.has_genetic_condition(GENE_COND_CLUMSY) && prob(50)) to_chat(user, SPAN_DANGER("You club yourself over the head.")) SET_STATUS_MAX(user, STAT_WEAK, (3 * force)) if(ishuman(user)) diff --git a/code/game/objects/items/weapons/tools/screwdriver.dm b/code/game/objects/items/weapons/tools/screwdriver.dm index 69f3db0c647..2a1ef5f107b 100644 --- a/code/game/objects/items/weapons/tools/screwdriver.dm +++ b/code/game/objects/items/weapons/tools/screwdriver.dm @@ -42,7 +42,7 @@ /obj/item/screwdriver/use_on_mob(mob/living/target, mob/living/user, animate = TRUE) if(user.a_intent == I_HELP || user.get_target_zone() != BP_EYES && user.get_target_zone() != BP_HEAD) return ..() - if((MUTATION_CLUMSY in user.mutations) && prob(50)) + if(user.has_genetic_condition(GENE_COND_CLUMSY) && prob(50)) target = user return eyestab(target, user) diff --git a/code/game/objects/items/weapons/weaponry.dm b/code/game/objects/items/weapons/weaponry.dm index 978096105d2..2177d4a6b2e 100644 --- a/code/game/objects/items/weapons/weaponry.dm +++ b/code/game/objects/items/weapons/weaponry.dm @@ -28,7 +28,7 @@ if (!user.check_dexterity(DEXTERITY_WEAPONS)) return TRUE - if ((MUTATION_CLUMSY in user.mutations) && prob(50)) + if (user.has_genetic_condition(GENE_COND_CLUMSY) && prob(50)) to_chat(user, SPAN_DANGER("The rod slips out of your hand and hits your head.")) user.take_organ_damage(10) SET_STATUS_MAX(user, STAT_PARA, 20) diff --git a/code/game/objects/structures/crates_lockers/closets/statue.dm b/code/game/objects/structures/crates_lockers/closets/statue.dm index b2c172211c1..b97d274b2d7 100644 --- a/code/game/objects/structures/crates_lockers/closets/statue.dm +++ b/code/game/objects/structures/crates_lockers/closets/statue.dm @@ -22,7 +22,7 @@ L.client.perspective = EYE_PERSPECTIVE L.client.eye = src L.forceMove(src) - L.set_sdisability(MUTED) + L.add_genetic_condition(GENE_COND_MUTED) current_health = L.current_health + 100 //stoning damaged mobs will result in easier to shatter statues intialTox = L.get_damage(TOX) intialFire = L.get_damage(BURN) @@ -64,7 +64,7 @@ for(var/mob/living/M in src) M.dropInto(forced_loc) - M.unset_sdisability(MUTED) + M.remove_genetic_condition(GENE_COND_MUTED) M.take_overall_damage((M.current_health - current_health - 100),0) //any new damage the statue incurred is transfered to the mob if(M.client) M.client.eye = M.client.mob diff --git a/code/modules/ZAS/Contaminants.dm b/code/modules/ZAS/Contaminants.dm index 09b25da6a8b..d3387ace01f 100644 --- a/code/modules/ZAS/Contaminants.dm +++ b/code/modules/ZAS/Contaminants.dm @@ -96,10 +96,8 @@ var/global/image/contamination_overlay = image('icons/effects/contamination.dmi' //Genetic Corruption if(vsc.contaminant_control.GENETIC_CORRUPTION) if(rand(1,10000) < vsc.contaminant_control.GENETIC_CORRUPTION) - randmutb(src) + add_genetic_condition(pick(decls_repository.get_decls_of_type(/decl/genetic_condition/disability))) to_chat(src, "High levels of toxins cause you to spontaneously mutate!") - domutcheck(src,null) - /mob/living/carbon/human/proc/burn_eyes() var/obj/item/organ/internal/eyes/E = get_organ(BP_EYES, /obj/item/organ/internal/eyes) diff --git a/code/modules/ZAS/Variable Settings.dm b/code/modules/ZAS/Variable Settings.dm index 731aa8437ae..06208e008b4 100644 --- a/code/modules/ZAS/Variable Settings.dm +++ b/code/modules/ZAS/Variable Settings.dm @@ -307,15 +307,15 @@ var/global/vs_control/vsc = new connection_insulation = initial(connection_insulation) connection_temperature_delta = initial(connection_temperature_delta) - contaminant_control.CONTAMINANT_DMG = initial(contaminant_control.CONTAMINANT_DMG) - contaminant_control.CLOTH_CONTAMINATION = initial(contaminant_control.CLOTH_CONTAMINATION) - contaminant_control.STRICT_PROTECTION_ONLY = initial(contaminant_control.STRICT_PROTECTION_ONLY) - contaminant_control.GENETIC_CORRUPTION = initial(contaminant_control.GENETIC_CORRUPTION) - contaminant_control.SKIN_BURNS = initial(contaminant_control.SKIN_BURNS) - contaminant_control.EYE_BURNS = initial(contaminant_control.EYE_BURNS) - contaminant_control.CONTAMINATION_LOSS = initial(contaminant_control.CONTAMINATION_LOSS) - contaminant_control.CONTAMINANT_HALLUCINATION = initial(contaminant_control.CONTAMINANT_HALLUCINATION) - contaminant_control.N2O_HALLUCINATION = initial(contaminant_control.N2O_HALLUCINATION) + contaminant_control.CONTAMINANT_DMG = initial(contaminant_control.CONTAMINANT_DMG) + contaminant_control.CLOTH_CONTAMINATION = initial(contaminant_control.CLOTH_CONTAMINATION) + contaminant_control.STRICT_PROTECTION_ONLY = initial(contaminant_control.STRICT_PROTECTION_ONLY) + contaminant_control.GENETIC_CORRUPTION = initial(contaminant_control.GENETIC_CORRUPTION) + contaminant_control.SKIN_BURNS = initial(contaminant_control.SKIN_BURNS) + contaminant_control.EYE_BURNS = initial(contaminant_control.EYE_BURNS) + contaminant_control.CONTAMINATION_LOSS = initial(contaminant_control.CONTAMINATION_LOSS) + contaminant_control.CONTAMINANT_HALLUCINATION = initial(contaminant_control.CONTAMINANT_HALLUCINATION) + contaminant_control.N2O_HALLUCINATION = initial(contaminant_control.N2O_HALLUCINATION) to_world("[key_name(user)] changed the global contaminant/ZAS settings to \"[def]\"") diff --git a/code/modules/acting/acting_items.dm b/code/modules/acting/acting_items.dm index 9fb767b16fb..487a86b3322 100644 --- a/code/modules/acting/acting_items.dm +++ b/code/modules/acting/acting_items.dm @@ -38,7 +38,6 @@ if(getName) H.real_name = getName H.SetName(getName) - H.dna.real_name = getName if(H.mind) H.mind.name = H.name return TRUE diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm index 498724e59d4..d5cebeab272 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -169,23 +169,15 @@ var/global/BSACooldown = 0 else body += "
    Animalize | " - // DNA2 - Admin Hax - if(M.dna) + if(M.can_have_genetic_conditions()) body += "

    " - body += "DNA Blocks:
    " - var/bname - for(var/block=1;block<=DNA_SE_LENGTH;block++) - if(((block-1)%5)==0) - body += "" - bname = assigned_blocks[block] - body += "" + body += "Genetic conditions:
     12345
    [block-1]" - if(bname) - var/bstate=M.dna.GetSEState(block) - var/bcolor="[(bstate)?"#006600":"#ff0000"]" - body += "[bname][block]" - else - body += "[block]" - body+="
    " + var/i = 1 + for(var/decl/genetic_condition/mutation as anything in decls_repository.get_decls_of_type_unassociated(/decl/genetic_condition)) + if(i % 5 == 0) + body += "" + body += "" + i++ body += "
    [mutation.name]
    " body += "

    Rudimentary transformation:
    These transformations only create a new mob type and copy stuff over. They do not take into account MMIs and similar mob-specific things. The buttons in 'Transformations' are preferred, when possible.

    " diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index b172781752c..50a0e3d4272 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -794,7 +794,6 @@ var/global/list/admin_verbs_mod = list( if(update_hair) M.update_hair() M.update_body() - M.check_dna(M) /client/proc/free_slot_submap() set name = "Free Job Slot (Submap)" diff --git a/code/modules/admin/secrets/admin_secrets/list_dna.dm b/code/modules/admin/secrets/admin_secrets/list_dna.dm index 6f7a2300cf0..60804f3f668 100644 --- a/code/modules/admin/secrets/admin_secrets/list_dna.dm +++ b/code/modules/admin/secrets/admin_secrets/list_dna.dm @@ -8,7 +8,7 @@ var/dat = "Showing DNA from blood.
    " dat += "" for(var/mob/living/carbon/human/H in SSmobs.mob_list) - if(H.dna && H.ckey) + if(H.ckey) dat += "" dat += "
    NameDNABlood Type
    [H][H.get_unique_enzymes() || "NULL"][H.get_blood_type() || "NULL"]
    " show_browser(user, dat, "window=DNA;size=440x410") diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index c70b4b02ab7..18c317543e7 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -816,17 +816,6 @@ usr.client.cmd_admin_animalize(M) - else if(href_list["togmutate"]) - if(!check_rights(R_SPAWN)) return - - var/mob/living/carbon/human/H = locate(href_list["togmutate"]) - if(!istype(H)) - to_chat(usr, "This can only be used on instances of type /mob/living/carbon/human") - return - var/block=text2num(href_list["block"]) - usr.client.cmd_admin_toggle_block(H,block) - show_player_panel(H) - else if(href_list["adminplayeropts"]) var/mob/M = locate(href_list["adminplayeropts"]) show_player_panel(M) @@ -1519,6 +1508,7 @@ ckey = LAST_CKEY(M) show_player_info(ckey) return + if(href_list["setstaffwarn"]) var/mob/M = locate(href_list["setstaffwarn"]) if(!ismob(M)) return @@ -1541,6 +1531,7 @@ show_player_panel(M) if("No") return + if(href_list["removestaffwarn"]) var/mob/M = locate(href_list["removestaffwarn"]) if(!ismob(M)) return @@ -1585,6 +1576,31 @@ else log_debug("Tried to send a fax to an invalid machine!:[log_info_line(F)]\nhref:[log_info_line(href_list)]") + if(href_list["toggle_mutation"]) + var/mob/M = locate(href_list["toggle_mutation"]) + var/decl/genetic_condition/condition = locate(href_list["block"]) + if(istype(condition) && istype(M) && !QDELETED(M)) + var/result + var/had_condition + if(M.has_genetic_condition(condition.type)) + had_condition = TRUE + result = M.remove_genetic_condition(condition.type) + else + had_condition = FALSE + result = M.add_genetic_condition(condition.type) + if(!isnull(result)) + if(result) + if(had_condition) + log_debug("Removed genetic condition [condition.name] from \the [M] ([M.ckey]).") + else + log_debug("Added genetic condition [condition.name] to \the [M] ([M.ckey]).") + else + log_debug("Failed to toggle genetic condition [condition.name] on \the [M] ([M.ckey]).") + else + log_debug("Could not apply genetic condition [condition.name] to \the [M] ([M.ckey]).") + show_player_panel(M) + return + /mob/living/proc/can_centcom_reply() return 0 diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm index 239a3942201..218abb76b5a 100644 --- a/code/modules/admin/verbs/debug.dm +++ b/code/modules/admin/verbs/debug.dm @@ -360,22 +360,6 @@ if("Clients") to_chat(usr, jointext(global.clients,",")) -// DNA2 - Admin Hax -/client/proc/cmd_admin_toggle_block(var/mob/M,var/block) - if(GAME_STATE < RUNLEVEL_GAME) - alert("Wait until the game starts") - return - if(M.dna) - M.dna.SetSEState(block,!M.dna.GetSEState(block)) - domutcheck(M,null,MUTCHK_FORCED) - M.update_mutations() - var/state="[M.dna.GetSEState(block)?"on":"off"]" - var/blockname=assigned_blocks[block] - message_admins("[key_name_admin(src)] has toggled [M.key]'s [blockname] block [state]!") - log_admin("[key_name(src)] has toggled [M.key]'s [blockname] block [state]!") - else - alert("Invalid mob") - /datum/admins/proc/view_runtimes() set category = "Debug" set name = "View Runtimes" diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm index a525e68ff53..e4330d3f864 100644 --- a/code/modules/admin/verbs/randomverbs.dm +++ b/code/modules/admin/verbs/randomverbs.dm @@ -427,10 +427,8 @@ Traitors and the like can also be revived with the previous role mostly intact. new_character.mind.assigned_role = global.using_map.default_job_title//If they somehow got a null assigned role. //DNA - if(new_character.dna) - new_character.dna.ready_dna(new_character) - if(record_found)//Pull up their name from database records if they did have a mind. - new_character.dna.unique_enzymes = record_found.get_dna() + if(record_found)//Pull up their name from database records if they did have a mind. + new_character.set_unique_enzymes(record_found.get_dna()) new_character.key = G_found.key /* diff --git a/code/modules/aspects/aspects_handicaps.dm b/code/modules/aspects/aspects_handicaps.dm index e646224c8c7..5e1ee5b2e93 100644 --- a/code/modules/aspects/aspects_handicaps.dm +++ b/code/modules/aspects/aspects_handicaps.dm @@ -11,8 +11,7 @@ /decl/aspect/handicap/impaired_vision/apply(mob/living/holder) . = ..() if(.) - holder.dna.SetSEState(global.GLASSESBLOCK,1,0) - holder.disabilities |= NEARSIGHTED + holder.add_genetic_condition(GENE_COND_NEARSIGHTED) var/equipped = holder.equip_to_slot_or_del(new /obj/item/clothing/glasses/prescription(holder), slot_glasses_str) if(equipped) var/obj/item/clothing/glasses/G = holder.get_equipped_item(slot_glasses_str) diff --git a/code/modules/assembly/mousetrap.dm b/code/modules/assembly/mousetrap.dm index a37c69d93bb..4f0fea84ac9 100644 --- a/code/modules/assembly/mousetrap.dm +++ b/code/modules/assembly/mousetrap.dm @@ -54,7 +54,7 @@ pulse_device(0) /obj/item/assembly/mousetrap/proc/toggle_arming(var/mob/user) - if((MUTATION_CLUMSY in user.mutations) && prob(50)) + if(user.has_genetic_condition(GENE_COND_CLUMSY) && prob(50)) var/which_hand = user.get_active_held_item_slot() triggered(user, which_hand) user.visible_message(SPAN_DANGER("\The [user] accidentally sets off [src], hurting their fingers."), \ diff --git a/code/modules/awaymissions/corpse.dm b/code/modules/awaymissions/corpse.dm index 89c82c0deb3..011a9276cc3 100644 --- a/code/modules/awaymissions/corpse.dm +++ b/code/modules/awaymissions/corpse.dm @@ -37,9 +37,10 @@ /obj/abstract/landmark/corpse/Initialize() ..() - if(!species) species = global.using_map.default_species + if(!species) + species = global.using_map.default_species var/species_choice = islist(species) ? pickweight(species) : species - my_corpse = weakref(new /mob/living/carbon/human/corpse(loc, species_choice, null, null, src)) + my_corpse = weakref(new /mob/living/carbon/human/corpse(loc, species_choice, null, src)) return INITIALIZE_HINT_QDEL /obj/abstract/landmark/corpse/proc/randomize_appearance(var/mob/living/carbon/human/M, species_choice) diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index 732ef34eb7a..b07d150f38a 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -418,13 +418,8 @@ var/global/list/time_prefs_fixed = list() if(LAZYLEN(appearance_descriptors)) character.appearance_descriptors = appearance_descriptors.Copy() - if(character.dna) - character.dna.ready_dna(character) - if(blood_type) - character.dna.b_type = blood_type - character.force_update_limbs() - character.update_mutations(0) + character.update_genetic_conditions(0) character.update_body(0) character.update_underwear(0) character.update_hair(0) diff --git a/code/modules/clothing/glasses/_glasses.dm b/code/modules/clothing/glasses/_glasses.dm index 55db25eee5f..ab8e6001f6b 100644 --- a/code/modules/clothing/glasses/_glasses.dm +++ b/code/modules/clothing/glasses/_glasses.dm @@ -58,10 +58,9 @@ to_chat(M, SPAN_DANGER("Your [name] malfunction[gender != PLURAL ? "s":""], blinding you!")) // Don't cure being nearsighted - if(!(M.disabilities & NEARSIGHTED)) - M.disabilities |= NEARSIGHTED - spawn(100) - M.disabilities &= ~NEARSIGHTED + if(!M.has_genetic_condition(GENE_COND_NEARSIGHTED)) + M.add_genetic_condition(GENE_COND_NEARSIGHTED, 10 SECONDS) + if(toggleable && active) set_active(FALSE) diff --git a/code/modules/detectivework/evidence/fingerprints.dm b/code/modules/detectivework/evidence/fingerprints.dm index 60fd2883c10..b2883be9f4c 100644 --- a/code/modules/detectivework/evidence/fingerprints.dm +++ b/code/modules/detectivework/evidence/fingerprints.dm @@ -87,6 +87,13 @@ /mob/proc/get_full_print(ignore_blockers) return null +/mob/proc/set_fingerprint(value) + return + +/mob/living/set_fingerprint(value) + for(var/obj/item/organ/external/E in get_external_organs()) + E.set_fingerprint(value) + /mob/living/get_full_print(var/ignore_blockers = FALSE) if(!ignore_blockers) var/obj/item/organ/external/E = GET_EXTERNAL_ORGAN(src, get_active_held_item_slot()) @@ -95,6 +102,6 @@ return fingerprint /mob/living/carbon/human/get_full_print(var/ignore_blockers = FALSE) - if (!ignore_blockers && (mFingerprints in mutations)) + if (!ignore_blockers && has_genetic_condition(GENE_COND_NO_FINGERPRINTS)) return null return ..() diff --git a/code/modules/detectivework/forensics.dm b/code/modules/detectivework/forensics.dm index 08335074135..423cb550dfb 100644 --- a/code/modules/detectivework/forensics.dm +++ b/code/modules/detectivework/forensics.dm @@ -56,11 +56,7 @@ other_forensics.add_data(T, F.data) /obj/item/proc/add_trace_DNA(mob/living/M) - if(!istype(M)) - return - if(M.isSynthetic()) - return - if(istype(M.dna)) + if(istype(M) && M.has_genetic_information()) var/datum/extension/forensic_evidence/forensics = get_or_create_extension(src, /datum/extension/forensic_evidence) forensics.add_from_atom(/datum/forensics/trace_dna, M) diff --git a/code/modules/events/radiation_storm.dm b/code/modules/events/radiation_storm.dm index 44f1ca326c8..8019d778352 100644 --- a/code/modules/events/radiation_storm.dm +++ b/code/modules/events/radiation_storm.dm @@ -45,21 +45,20 @@ for(var/z in affecting_z) SSradiation.z_radiate(locate(1, 1, z), radiation_level, 1) - for(var/mob/living/target in global.living_mob_list_) - var/area/A = get_area(target) + for(var/mob/living/M in global.living_mob_list_) + var/area/A = get_area(M) if(!A) continue if(A.area_flags & AREA_FLAG_RAD_SHIELDED) continue - if(ishuman(target)) - var/mob/living/carbon/human/H = target - if(prob(5 * (1 - H.get_blocked_ratio(null, IRRADIATE, damage_flags = DAM_DISPERSED, armor_pen = radiation_level)))) - if (prob(75)) - randmutb(H) // Applies bad mutation - domutcheck(H,null,MUTCHK_FORCED) - else - randmutg(H) // Applies good mutation - domutcheck(H,null,MUTCHK_FORCED) + if(!M.can_have_genetic_conditions()) + continue + if(prob(5 * (1 - M.get_blocked_ratio(null, IRRADIATE, damage_flags = DAM_DISPERSED, armor_pen = radiation_level)))) + if(prob(75)) + M.add_genetic_condition(pick(decls_repository.get_decls_of_type(/decl/genetic_condition/disability))) + else + M.add_genetic_condition(pick(decls_repository.get_decls_of_type(/decl/genetic_condition/superpower))) + /datum/event/radiation_storm/end() global.using_map.revoke_maint_all_access(1) diff --git a/code/modules/fabrication/fabricator_bioprinter.dm b/code/modules/fabrication/fabricator_bioprinter.dm index 47c64a567f8..7e748683da1 100644 --- a/code/modules/fabrication/fabricator_bioprinter.dm +++ b/code/modules/fabrication/fabricator_bioprinter.dm @@ -9,7 +9,7 @@ base_type = /obj/machinery/fabricator/bioprinter fabricator_class = FABRICATOR_CLASS_MEAT ignore_input_contents_length = TRUE // mostly eats organs, let people quickly dump a torso in there without doing surgery. - var/datum/dna/loaded_dna //DNA for biological organs + var/datum/mob_snapshot/loaded_dna //DNA for biological organs /obj/machinery/fabricator/bioprinter/can_ingest(var/obj/item/thing) . = istype(thing, /obj/item/organ) || istype(thing, /obj/item/chems/food/butchery) || ..() @@ -29,10 +29,10 @@ /obj/machinery/fabricator/bioprinter/do_build(datum/fabricator_build_order/order) . = ..() //Fetch params as they were when the order was passed - var/datum/dna/D = order.get_data("dna") + var/datum/mob_snapshot/D = order.get_data("dna") for(var/obj/item/organ/O in .) if(D) - O.set_dna(D) + O.copy_from_mob_snapshot(D) O.status |= ORGAN_CUT_AWAY /obj/machinery/fabricator/bioprinter/attackby(obj/item/W, mob/user) @@ -43,13 +43,14 @@ if(islist(sample)) var/weakref/R = sample["donor"] var/mob/living/carbon/human/H = R.resolve() - if(H && istype(H) && H.species && H.dna) - loaded_dna = H.dna.Clone() - to_chat(user, SPAN_INFO("You inject the blood sample into \the [src].")) - S.remove_any_reagents(BIOPRINTER_BLOOD_SAMPLE_SIZE) - //Tell nano to do its job - SSnano.update_uis(src) - return TRUE + if(H && istype(H) && H.species) + loaded_dna = H.get_mob_snapshot() + if(loaded_dna) + to_chat(user, SPAN_INFO("You inject the blood sample into \the [src].")) + S.remove_any_reagents(BIOPRINTER_BLOOD_SAMPLE_SIZE) + //Tell nano to do its job + SSnano.update_uis(src) + return TRUE to_chat(user, SPAN_WARNING("\The [src] displays an error: no viable blood sample could be obtained from \the [W].")) return TRUE . = ..() @@ -69,8 +70,8 @@ return list( "real_name" = loaded_dna.real_name, "UE" = loaded_dna.unique_enzymes, - "species" = loaded_dna.species, - "btype" = loaded_dna.b_type, + "species" = loaded_dna.root_species.name, + "btype" = loaded_dna.blood_type, ) /obj/machinery/fabricator/bioprinter/ui_draw_config(mob/user, ui_key) diff --git a/code/modules/food/plates/plate_tray.dm b/code/modules/food/plates/plate_tray.dm index 3581fb55ba0..c2b507a3296 100644 --- a/code/modules/food/plates/plate_tray.dm +++ b/code/modules/food/plates/plate_tray.dm @@ -39,7 +39,7 @@ . = ..() /obj/item/plate/tray/use_on_mob(mob/living/target, mob/living/user, animate = TRUE) - if((MUTATION_CLUMSY in user.mutations) && prob(50)) // There is a better way to do this but I'll be damned if I'm the one to fix it. + if(user.has_genetic_condition(GENE_COND_CLUMSY) && prob(50)) // There is a better way to do this but I'll be damned if I'm the one to fix it. to_chat(user, SPAN_DANGER("You accidentally slam yourself with \the [src]!")) SET_STATUS_MAX(user, STAT_WEAK, 1) user.take_organ_damage(2) diff --git a/code/modules/integrated_electronics/subtypes/reagents.dm b/code/modules/integrated_electronics/subtypes/reagents.dm index abffc2b0b97..3f560a1c7c7 100644 --- a/code/modules/integrated_electronics/subtypes/reagents.dm +++ b/code/modules/integrated_electronics/subtypes/reagents.dm @@ -219,7 +219,7 @@ var/injection_delay = 3 SECONDS if(injection_status == INJECTION_PORT) injection_delay += INJECTION_PORT_DELAY - if(!H.dna || !injection_status) + if(!H.vessel?.total_volume || !injection_status) activate_pin(3) return H.visible_message( diff --git a/code/modules/mob/hear_say.dm b/code/modules/mob/hear_say.dm index ff24f185a8d..80cb0fd1c36 100644 --- a/code/modules/mob/hear_say.dm +++ b/code/modules/mob/hear_say.dm @@ -212,7 +212,7 @@ formatted = language.format_message_radio(message, nverb) else formatted = "[verb], \"[message]\"" - if(sdisabilities & DEAFENED || GET_STATUS(src, STAT_DEAF)) + if(has_genetic_condition(GENE_COND_DEAFENED) || GET_STATUS(src, STAT_DEAF)) var/mob/living/carbon/human/H = src if(istype(H) && H.has_headset_in_ears() && prob(20)) to_chat(src, SPAN_WARNING("You feel your headset vibrate but can hear nothing from it!")) diff --git a/code/modules/mob/living/damage_procs.dm b/code/modules/mob/living/damage_procs.dm index 2836798bf8c..17bc1361363 100644 --- a/code/modules/mob/living/damage_procs.dm +++ b/code/modules/mob/living/damage_procs.dm @@ -24,7 +24,7 @@ switch(damagetype) if(BURN) - if(MUTATION_COLD_RESISTANCE in mutations) + if(has_genetic_condition(GENE_COND_COLD_RESISTANCE)) return take_damage(damage, BURN, damage_flags, used_weapon, armor_pen) if(ELECTROCUTE) diff --git a/code/modules/mob/living/human/death.dm b/code/modules/mob/living/human/death.dm index 5635331490a..36aa2c5662f 100644 --- a/code/modules/mob/living/human/death.dm +++ b/code/modules/mob/living/human/death.dm @@ -40,21 +40,6 @@ SSticker.mode.check_win() species.handle_death(src) -/mob/living/carbon/human/proc/is_husked() - return (MUTATION_HUSK in mutations) - -/mob/living/carbon/human/proc/make_husked() - if(is_husked()) - return - - SET_FACIAL_HAIR_STYLE(src, /decl/sprite_accessory/facial_hair/shaved, TRUE) - SET_HAIR_STYLE(src, /decl/sprite_accessory/hair/bald, FALSE) - - mutations.Add(MUTATION_HUSK) - for(var/obj/item/organ/external/E in get_external_organs()) - E.status |= ORGAN_DISFIGURED - update_body(1) - /mob/living/carbon/human/physically_destroyed(var/skip_qdel, var/droplimb_type = DISMEMBER_METHOD_BLUNT) for(var/obj/item/organ/external/limb in get_external_organs()) if(!limb.parent_organ) // don't dismember root diff --git a/code/modules/mob/living/human/human.dm b/code/modules/mob/living/human/human.dm index ef37dce6f76..0aa2218119b 100644 --- a/code/modules/mob/living/human/human.dm +++ b/code/modules/mob/living/human/human.dm @@ -4,19 +4,18 @@ icon = 'icons/mob/human.dmi' icon_state = "body_m_s" mob_sort_value = 6 - dna = new /datum/dna() max_health = 150 var/list/hud_list[10] var/embedded_flag //To check if we've need to roll for damage on movement while an item is imbedded in us. var/step_count -/mob/living/carbon/human/Initialize(mapload, species_name, datum/dna/new_dna, decl/bodytype/new_bodytype) +/mob/living/carbon/human/Initialize(mapload, species_name, datum/mob_snapshot/supplied_appearance) current_health = max_health setup_hud_overlays() var/list/newargs = args.Copy(2) - setup(arglist(newargs)) + setup_human(arglist(newargs)) global.human_mob_list |= src if(!bloodstr) @@ -142,13 +141,6 @@ var/obj/item/underwear/UW = entry LAZYADD(., "
    Remove \the [UW]") - -// TODO: remove when is_husked is moved to a parent type (or if husking is removed) -/mob/living/carbon/human/identity_is_visible() - if(is_husked()) - return FALSE - return ..() - /mob/living/carbon/human/OnSelfTopic(href_list) if (href_list["lookitem"]) var/obj/item/I = locate(href_list["lookitem"]) @@ -395,11 +387,9 @@ germ_level += n /mob/living/carbon/human/revive() - get_bodytype().create_missing_organs(src) // Reset our organs/limbs. restore_all_organs() // Reapply robotics/amputated status from preferences. reset_blood() - if(!client || !key) //Don't boot out anyone already in the mob. for(var/mob/living/brain/brain in global.player_list) // This is really nasty, does it even work anymore? if(brain.real_name == src.real_name && brain.mind) @@ -407,7 +397,6 @@ qdel(brain.loc) break ticks_since_last_successful_breath = 0 - UpdateAppearance() ..() /mob/living/add_blood(mob/living/M, amount = 2, list/blood_data) @@ -473,7 +462,11 @@ custom_pain(msg,40,affecting = organ) organ.take_external_damage(rand(1,3) + O.w_class, DAM_EDGE, 0) -/mob/living/carbon/human/proc/set_bodytype(var/decl/bodytype/new_bodytype) +/mob/proc/set_bodytype(var/decl/bodytype/new_bodytype) + return + +/mob/living/carbon/human/set_bodytype(var/decl/bodytype/new_bodytype) + var/decl/bodytype/old_bodytype = get_bodytype() if(ispath(new_bodytype)) new_bodytype = GET_DECL(new_bodytype) @@ -493,10 +486,13 @@ update_eyes() return TRUE +/mob/proc/set_species(var/new_species_name, var/new_bodytype = null) + return + //set_species should not handle the entirety of initing the mob, and should not trigger deep updates //It focuses on setting up species-related data, without force applying them uppon organs and the mob's appearance. // For transforming an existing mob, look at change_species() -/mob/living/carbon/human/proc/set_species(var/new_species_name, var/new_bodytype = null) +/mob/living/carbon/human/set_species(var/new_species_name, var/new_bodytype = null) if(!new_species_name) CRASH("set_species on mob '[src]' was passed a null species name '[new_species_name]'!") var/new_species = get_species_by_key(new_species_name) @@ -512,8 +508,6 @@ //Update our species species = new_species - if(dna) - dna.species = new_species_name holder_type = null if(species.holder_type) holder_type = species.holder_type @@ -982,21 +976,17 @@ return real_name = newname SetName(newname) - if(dna) - dna.real_name = newname if(mind) mind.name = newname //Human mob specific init code. Meant to be used only on init. -/mob/living/carbon/human/proc/setup(species_name = null, datum/dna/new_dna = null, decl/bodytype/new_bodytype = null) - - if(new_dna) - species_name = new_dna.species - src.dna = new_dna +/mob/living/carbon/human/proc/setup_human(species_name, datum/mob_snapshot/supplied_appearance) + if(supplied_appearance) + species_name = supplied_appearance.root_species else if(!species_name) species_name = global.using_map.default_species //Humans cannot exist without a species! - set_species(species_name, new_bodytype) + set_species(species_name, supplied_appearance?.root_bodytype) var/decl/bodytype/root_bodytype = get_bodytype() // root bodytype is set in set_species if(!get_skin_colour()) set_skin_colour(root_bodytype.base_color, skip_update = TRUE) @@ -1007,17 +997,17 @@ if(!blood_type && length(species?.blood_types)) blood_type = pickweight(species.blood_types) - if(new_dna) - set_real_name(new_dna.real_name) + if(supplied_appearance) + set_real_name(supplied_appearance.real_name) else try_generate_default_name() - dna.ready_dna(src) //regen dna filler only if we haven't forced the dna already species.handle_pre_spawn(src) apply_species_cultural_info() species.handle_post_spawn(src) - UpdateAppearance() //Apply dna appearance to mob, causes DNA to change because filler values are regenerated + supplied_appearance?.apply_appearance_to(src) + //Prevent attempting to create blood container if its already setup if(!vessel) reset_blood() @@ -1032,7 +1022,7 @@ SetName(initial(name)) //Runs last after setup and after the parent init has been executed. -/mob/living/carbon/human/proc/post_setup(var/species_name = null, var/datum/dna/new_dna = null) +/mob/living/carbon/human/proc/post_setup(species_name, datum/mob_snapshot/supplied_appearance) try_refresh_visible_overlays() //Do this exactly once per setup /mob/living/carbon/human/handle_flashed(var/obj/item/flash/flash, var/flash_strength) @@ -1174,6 +1164,12 @@ if(volume > 0 && range > 0) playsound(T, footsound, volume, 1, range) +/mob/living/carbon/human/get_skin_tone(value) + return skin_tone + +/mob/living/carbon/human/set_skin_tone(value) + skin_tone = value + /mob/living/carbon/human/try_awaken(mob/user) return !is_asystole() && ..() diff --git a/code/modules/mob/living/human/human_appearance.dm b/code/modules/mob/living/human/human_appearance.dm index c307ef22184..cd16747a036 100644 --- a/code/modules/mob/living/human/human_appearance.dm +++ b/code/modules/mob/living/human/human_appearance.dm @@ -17,6 +17,7 @@ update_body() /mob/living/carbon/human/proc/change_species(var/new_species, var/new_bodytype = null) + if(!new_species) return @@ -27,11 +28,9 @@ return set_species(new_species, new_bodytype) - dna.ready_dna(src) //Handle spawning stuff species.handle_pre_spawn(src) - UpdateAppearance() apply_species_appearance() apply_bodytype_appearance() apply_species_cultural_info() @@ -51,7 +50,6 @@ . = ..() if(. && update_body) update_body() - update_dna() /mob/living/carbon/human/proc/randomize_gender() var/decl/pronouns/pronouns = pick(species.available_pronouns) @@ -92,10 +90,6 @@ update_body() return 1 -/mob/living/carbon/human/proc/update_dna() - check_dna() - dna.ready_dna(src) - /mob/living/carbon/human/proc/generate_valid_species(var/check_whitelist = 1, var/list/whitelist = list(), var/list/blacklist = list()) var/list/valid_species = new() for(var/current_species_name in get_all_species()) @@ -114,8 +108,3 @@ valid_species += current_species_name return valid_species - -/mob/living/carbon/human/proc/force_update_limbs() - for(var/obj/item/organ/external/O in get_external_organs()) - O.sync_colour_to_human(src) - update_body(0) diff --git a/code/modules/mob/living/human/human_damage.dm b/code/modules/mob/living/human/human_damage.dm index 93b3e48651c..6d5291d3d3b 100644 --- a/code/modules/mob/living/human/human_damage.dm +++ b/code/modules/mob/living/human/human_damage.dm @@ -9,7 +9,7 @@ . = ..() //TODO: fix husking if(. && stat == DEAD && (get_damage(BRUTE) - get_damage(BURN)) < get_config_value(/decl/config/num/health_health_threshold_dead)) - make_husked() + add_genetic_condition(GENE_COND_HUSK) /mob/living/carbon/human/adjustBrainLoss(var/amount, var/do_update_health = TRUE) if(!(status_flags & GODMODE) && should_have_organ(BP_BRAIN)) diff --git a/code/modules/mob/living/human/human_helpers.dm b/code/modules/mob/living/human/human_helpers.dm index 23b77683afa..e1b056a1e2d 100644 --- a/code/modules/mob/living/human/human_helpers.dm +++ b/code/modules/mob/living/human/human_helpers.dm @@ -218,9 +218,7 @@ to_chat(src, "You go blind!") SET_STATUS_MAX(src, STAT_BLIND, 5) SET_STATUS_MAX(src, STAT_BLURRY, 5) - disabilities |= NEARSIGHTED - spawn(100) - disabilities &= ~NEARSIGHTED + add_genetic_condition(GENE_COND_NEARSIGHTED, 10 SECONDS) /mob/living/carbon/human var/list/cloaking_sources @@ -288,11 +286,6 @@ UNSETEMPTY(cloaking_sources) return !cloaking_sources // If cloaking_sources wasn't initially null but is now, we've uncloaked -/mob/living/carbon/human/set_sdisability(sdisability) - if(isSynthetic()) - return // Can't cure disabilites, so don't give them. - ..() - /mob/living/carbon/human/proc/has_meson_effect() var/datum/global_hud/global_hud = get_global_hud() return (global_hud.meson in equipment_overlays) diff --git a/code/modules/mob/living/human/human_movement.dm b/code/modules/mob/living/human/human_movement.dm index ee9edbc2dd4..b313eebcd05 100644 --- a/code/modules/mob/living/human/human_movement.dm +++ b/code/modules/mob/living/human/human_movement.dm @@ -59,7 +59,7 @@ if (root_bodytype && bodytemperature < root_bodytype.cold_discomfort_level) tally += (root_bodytype.cold_discomfort_level - bodytemperature) / 10 * 1.75 - if(mRun in mutations) + if(has_genetic_condition(GENE_COND_RUNNING)) tally = 0 return (tally+get_config_value(/decl/config/num/movement_human)) diff --git a/code/modules/mob/living/human/human_organs.dm b/code/modules/mob/living/human/human_organs.dm index bbd2bc8a03e..d438a8d6477 100644 --- a/code/modules/mob/living/human/human_organs.dm +++ b/code/modules/mob/living/human/human_organs.dm @@ -125,13 +125,6 @@ // If the root organ ever changes/isn't always the chest, this will need to be changed. return get_organ(BP_CHEST, /obj/item/organ)?.bodytype -/mob/living/carbon/human/proc/update_eyes(update_icons = TRUE) - var/obj/item/organ/internal/eyes/eyes = get_organ((get_bodytype()?.vision_organ || BP_EYES), /obj/item/organ/internal/eyes) - if(eyes) - eyes.update_colour() - if(update_icons) - queue_icon_update() - /mob/living/carbon/human/proc/get_bodypart_name(var/zone) var/obj/item/organ/external/E = GET_EXTERNAL_ORGAN(src, zone) return E?.name @@ -209,16 +202,16 @@ if (W.infection_check()) W.germ_level += 1 -/mob/living/carbon/human/is_asystole() - if(isSynthetic()) - var/obj/item/organ/internal/cell/C = get_organ(BP_CELL, /obj/item/organ/internal/cell) - if(!C || !C.is_usable() || !C.percent()) - return TRUE - else if(should_have_organ(BP_HEART)) - var/obj/item/organ/internal/heart/heart = get_organ(BP_HEART, /obj/item/organ/internal/heart) - if(!istype(heart) || !heart.is_working()) - return TRUE - return FALSE +/mob/living/carbon/human/proc/Check_Proppable_Object() + for(var/turf/T in RANGE_TURFS(src, 1)) //we only care for non-space turfs + if(T.density && T.simulated) //walls work + return 1 + + for(var/obj/O in orange(1, src)) + if(O && O.density && O.anchored) + return 1 + + return 0 /mob/living/carbon/human/on_lost_organ(var/obj/item/organ/O) if(!(. = ..())) diff --git a/code/modules/mob/living/human/human_species.dm b/code/modules/mob/living/human/human_species.dm index 927f421d5ca..25878c1c622 100644 --- a/code/modules/mob/living/human/human_species.dm +++ b/code/modules/mob/living/human/human_species.dm @@ -3,12 +3,12 @@ status_flags = GODMODE|CANPUSH virtual_mob = null -/mob/living/carbon/human/dummy/mannequin/Initialize(mapload, species_name, datum/dna/new_dna, decl/bodytype/new_bodytype) +/mob/living/carbon/human/dummy/mannequin/Initialize(mapload, species_name, datum/mob_snapshot/supplied_appearance) . = ..() STOP_PROCESSING(SSmobs, src) global.human_mob_list -= src -/mob/living/carbon/human/dummy/selfdress/Initialize(mapload, species_name, datum/dna/new_dna, decl/bodytype/new_bodytype) +/mob/living/carbon/human/dummy/selfdress/Initialize(mapload, species_name, datum/mob_snapshot/supplied_appearance) ..() return INITIALIZE_HINT_LATELOAD @@ -22,8 +22,8 @@ /mob/living/carbon/human/corpse/get_death_message(gibbed) return SKIP_DEATH_MESSAGE -/mob/living/carbon/human/corpse/Initialize(mapload, species_name, datum/dna/new_dna, decl/bodytype/new_bodytype, obj/abstract/landmark/corpse/corpse) - . = ..(mapload, species_name, new_dna, new_bodytype) // do not pass the corpse landmark +/mob/living/carbon/human/corpse/Initialize(mapload, species_name, datum/mob_snapshot/supplied_appearance, obj/abstract/landmark/corpse/corpse) + . = ..(mapload, species_name, supplied_appearance) // do not pass the corpse landmark var/decl/cultural_info/culture = get_cultural_value(TAG_CULTURE) if(culture) var/newname = culture.get_random_name(src, gender, species.name) @@ -65,7 +65,7 @@ /mob/living/carbon/human/monkey gender = PLURAL -/mob/living/carbon/human/monkey/Initialize(mapload, species_name, datum/dna/new_dna, decl/bodytype/new_bodytype) +/mob/living/carbon/human/monkey/Initialize(mapload, species_name, datum/mob_snapshot/supplied_appearance) if(gender == PLURAL) gender = pick(MALE, FEMALE) species_name = SPECIES_MONKEY diff --git a/code/modules/mob/living/human/human_verbs.dm b/code/modules/mob/living/human/human_verbs.dm index 853d3a7e19a..de0954e4683 100644 --- a/code/modules/mob/living/human/human_verbs.dm +++ b/code/modules/mob/living/human/human_verbs.dm @@ -7,7 +7,7 @@ remoteview_target = null return - if(!(mMorph in mutations)) + if(!has_genetic_condition(GENE_COND_SHAPESHIFTER)) src.verbs -= /mob/living/carbon/human/proc/morph return @@ -67,7 +67,6 @@ update_hair() try_refresh_visible_overlays() - check_dna() var/decl/pronouns/G = get_pronouns() visible_message("\The [src] morphs and changes [G.his] appearance!", "You change your appearance!", "Oh, god! What the hell was that? It sounded like flesh getting squished and bone ground into a different shape!") @@ -81,7 +80,7 @@ remoteview_target = null return - if(!(mRemotetalk in src.mutations)) + if(!has_genetic_condition(GENE_COND_REMOTE_TALK)) src.verbs -= /mob/living/carbon/human/proc/remotesay return var/list/creatures = list() @@ -92,7 +91,7 @@ return var/say = sanitize(input("What do you wish to say")) - if(mRemotetalk in target.mutations) + if(target.has_genetic_condition(GENE_COND_REMOTE_TALK)) target.show_message("You hear [src.real_name]'s voice: [say]") else target.show_message("You hear a voice that seems to echo around the room: [say]") @@ -110,7 +109,7 @@ reset_view(0) return - if(!(mRemote in src.mutations)) + if(!has_genetic_condition(GENE_COND_REMOTE_VIEW)) remoteview_target = null reset_view(0) src.verbs -= /mob/living/carbon/human/proc/remoteobserve diff --git a/code/modules/mob/living/human/life.dm b/code/modules/mob/living/human/life.dm index f1a8fa11fb9..89f866f681a 100644 --- a/code/modules/mob/living/human/life.dm +++ b/code/modules/mob/living/human/life.dm @@ -131,36 +131,25 @@ SET_STATUS_MAX(src, STAT_BLIND, 2) SET_STATUS_MAX(src, STAT_BLURRY, 1) // Non-genetic blindness; covered eyes will heal faster. - else if(!(sdisabilities & BLINDED) && equipment_tint_total >= TINT_BLIND) + else if(!has_genetic_condition(GENE_COND_BLINDED) && equipment_tint_total >= TINT_BLIND) ADJ_STATUS(src, STAT_BLURRY, -1) /mob/living/carbon/human/handle_disabilities() ..() - if(stat != DEAD && (disabilities & COUGHING) && prob(5) && GET_STATUS(src, STAT_PARA) <= 1) + if(stat != DEAD && has_genetic_condition(GENE_COND_COUGHING) && prob(5) && GET_STATUS(src, STAT_PARA) <= 1) drop_held_items() cough() /mob/living/carbon/human/handle_mutations_and_radiation() - if(get_damage(BURN)) - if((MUTATION_COLD_RESISTANCE in mutations) || (prob(1))) - heal_organ_damage(0,1) - - // DNA2 - Gene processing. - var/list/all_genes = decls_repository.get_decls_of_subtype(/decl/gene) - for(var/gene_type in all_genes) - var/decl/gene/gene = all_genes[gene_type] - if(!gene.block) - continue - if(gene.is_active(src)) - gene.OnMobLife(src) - + if(get_damage(BURN) && (has_genetic_condition(GENE_COND_COLD_RESISTANCE) || (prob(1)))) + heal_organ_damage(0,1) ..() /mob/living/carbon/human/handle_environment(datum/gas_mixture/environment) ..() - if(!environment || (MUTATION_SPACERES in mutations)) + if(!environment || has_genetic_condition(GENE_COND_SPACE_RESISTANCE)) return //Stuff like water absorbtion happens here. @@ -313,7 +302,7 @@ return get_thermal_protection(thermal_protection_flags) /mob/living/carbon/human/get_cold_protection(temperature) - if(MUTATION_COLD_RESISTANCE in mutations) + if(has_genetic_condition(GENE_COND_COLD_RESISTANCE)) return 1 //Fully protected from the cold. temperature = max(temperature, 2.7) //There is an occasional bug where the temperature is miscalculated in ares with a small amount of gas on them, so this is necessary to ensure that that bug does not affect this calculation. Space's temperature is 2.7K and most suits that are intended to protect against any cold, protect down to 2.0K. @@ -858,7 +847,6 @@ shock_stage = 0 ..() adjust_stamina(100) - UpdateAppearance() /mob/living/carbon/human/reset_view(atom/A) ..() @@ -879,7 +867,7 @@ set_sight(sight|viewflags) if(eyeobj && eyeobj.owner != src) reset_view(null) - if((mRemote in mutations) && remoteview_target && remoteview_target.stat != CONSCIOUS) + if(has_genetic_condition(GENE_COND_REMOTE_VIEW) && remoteview_target && remoteview_target.stat != CONSCIOUS) remoteview_target = null reset_view(null, 0) @@ -888,5 +876,5 @@ /mob/living/carbon/human/update_living_sight() ..() - if(GET_CHEMICAL_EFFECT(src, CE_THIRDEYE) || (MUTATION_XRAY in mutations)) + if(GET_CHEMICAL_EFFECT(src, CE_THIRDEYE) || has_genetic_condition(GENE_COND_XRAY)) set_sight(sight|SEE_TURFS|SEE_MOBS|SEE_OBJS) diff --git a/code/modules/mob/living/human/npcs.dm b/code/modules/mob/living/human/npcs.dm index 5d8848332af..da077206188 100644 --- a/code/modules/mob/living/human/npcs.dm +++ b/code/modules/mob/living/human/npcs.dm @@ -2,7 +2,7 @@ real_name = "Pun Pun" gender = MALE -/mob/living/carbon/human/monkey/punpun/Initialize(mapload, species_name, datum/dna/new_dna, decl/bodytype/new_bodytype) +/mob/living/carbon/human/monkey/punpun/Initialize(mapload, species_name, datum/mob_snapshot/supplied_appearance) ..() return INITIALIZE_HINT_LATELOAD @@ -35,7 +35,7 @@ sensor.set_sensor_mode(VITALS_SENSOR_OFF) attach_accessory(null, sensor) -/mob/living/carbon/human/blank/Initialize(mapload, species_name, datum/dna/new_dna, decl/bodytype/new_bodytype) +/mob/living/carbon/human/blank/Initialize(mapload, species_name, datum/mob_snapshot/supplied_appearance) species_name = SPECIES_HUMAN ..() return INITIALIZE_HINT_LATELOAD diff --git a/code/modules/mob/living/human/say.dm b/code/modules/mob/living/human/say.dm index 5c76ae4c05f..52bc39e0657 100644 --- a/code/modules/mob/living/human/say.dm +++ b/code/modules/mob/living/human/say.dm @@ -73,7 +73,7 @@ return verb /mob/living/carbon/human/handle_speech_problems(var/list/message_data) - if(HAS_STATUS(src, STAT_SILENCE) || (sdisabilities & MUTED)) + if(HAS_STATUS(src, STAT_SILENCE) || has_genetic_condition(GENE_COND_MUTED)) to_chat(src, SPAN_WARNING("You are unable to speak!")) message_data[1] = "" return TRUE diff --git a/code/modules/mob/living/human/update_icons.dm b/code/modules/mob/living/human/update_icons.dm index e527fb203a5..d9224b97e24 100644 --- a/code/modules/mob/living/human/update_icons.dm +++ b/code/modules/mob/living/human/update_icons.dm @@ -68,7 +68,7 @@ There are several things that need to be remembered: update_equipment_overlay(slot_wear_suit_str) > There are also these special cases: - update_mutations() //handles updating your appearance for certain mutations. e.g TK head-glows + update_genetic_conditions() //handles updating your appearance for certain mutations. e.g TK head-glows update_damage_overlays() //handles damage overlays for brute/burn damage //(will rename this when I geta round to it) update_body() //Handles updating your mob's icon to reflect their gender/race/complexion etc update_hair() //Handles updating your hair overlay (used to be update_face, but mouth and @@ -103,7 +103,7 @@ Please contact me on #coderbus IRC. ~Carn x */ /mob/living/carbon/human/refresh_visible_overlays() - update_mutations(FALSE) + update_genetic_conditions(FALSE) update_body(FALSE) update_skin(FALSE) update_underwear(FALSE) @@ -273,7 +273,7 @@ Please contact me on #coderbus IRC. ~Carn x continue part.update_icon() // This wil regenerate their icon if needed, and more importantly set their cache key. . += part._icon_cache_key - . += "husked_[!!is_husked()]" + . += "husked_[!!has_genetic_condition(GENE_COND_HUSK)]" . = JOINTEXT(.) //BASE MOB SPRITE @@ -315,7 +315,7 @@ Please contact me on #coderbus IRC. ~Carn x else stand_icon.Blend(temp, ICON_OVERLAY) //Handle husk overlay. - if(is_husked()) + if(has_genetic_condition(GENE_COND_HUSK)) var/husk_icon = root_bodytype.get_husk_icon(src) if(husk_icon) var/icon/mask = new(stand_icon) @@ -365,24 +365,13 @@ Please contact me on #coderbus IRC. ~Carn x // todo: make this use bodytype set_current_mob_overlay(HO_SKIN_LAYER, species.update_skin(src), update_icons) -/mob/living/carbon/human/update_mutations(var/update_icons=1) - - var/image/standing = overlay_image('icons/effects/genetics.dmi', flags=RESET_COLOR) - var/add_image = 0 - var/g = "m" - if(gender == FEMALE) g = "f" - // DNA2 - Drawing underlays. - var/list/all_genes = decls_repository.get_decls_of_subtype(/decl/gene) - for(var/gene_type in all_genes) - var/decl/gene/gene = all_genes[gene_type] - if(!gene.block) - continue - if(gene.is_active(src)) - var/underlay=gene.OnDrawUnderlays(src,g) - if(underlay) - standing.underlays += underlay - add_image = 1 - set_current_mob_overlay(HO_MUTATIONS_LAYER, (add_image ? standing : null), update_icons) +/mob/living/carbon/human/update_genetic_conditions(var/update_icons=1) + var/list/condition_overlays = null + for(var/decl/genetic_condition/condition as anything in get_genetic_conditions()) + var/condition_overlay = condition.get_mob_overlay() + if(condition_overlay) + LAZYADD(condition_overlays, condition_overlay) + set_current_mob_overlay(HO_CONDITION_LAYER, condition_overlays, update_icons) /* --------------------------------------- */ //vvvvvv UPDATE_INV PROCS vvvvvv diff --git a/code/modules/mob/living/life.dm b/code/modules/mob/living/life.dm index 1635435aa31..18588dee914 100644 --- a/code/modules/mob/living/life.dm +++ b/code/modules/mob/living/life.dm @@ -435,14 +435,14 @@ SHOULD_CALL_PARENT(TRUE) if(stat == DEAD) SET_STATUS_MAX(src, STAT_BLIND, 0) - if(stat != CONSCIOUS && (sdisabilities & BLINDED)) //blindness from disability or unconsciousness doesn't get better on its own + if(stat != CONSCIOUS && has_genetic_condition(GENE_COND_BLINDED)) //blindness from disability or unconsciousness doesn't get better on its own SET_STATUS_MAX(src, STAT_BLIND, 2) else return TRUE return FALSE /mob/living/proc/handle_impaired_hearing() - if((sdisabilities & DEAFENED) || stat) //disabled-deaf, doesn't get better on its own + if(has_genetic_condition(GENE_COND_DEAFENED) || stat) //disabled-deaf, doesn't get better on its own SET_STATUS_MAX(src, STAT_TINNITUS, 2) /mob/living/proc/should_do_hud_updates() @@ -493,7 +493,7 @@ overlay_fullscreen("blind", /obj/screen/fullscreen/blind) else clear_fullscreen("blind") - set_fullscreen(disabilities & NEARSIGHTED, "impaired", /obj/screen/fullscreen/impaired, 1) + set_fullscreen(has_genetic_condition(GENE_COND_NEARSIGHTED), "impaired", /obj/screen/fullscreen/impaired, 1) set_fullscreen(GET_STATUS(src, STAT_BLURRY), "blurry", /obj/screen/fullscreen/blurry) set_fullscreen(GET_STATUS(src, STAT_DRUGGY), "high", /obj/screen/fullscreen/high) set_fullscreen(stat == UNCONSCIOUS, "blackout", /obj/screen/fullscreen/blackout) diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index bf719e9aaad..1dad709ed18 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -333,8 +333,7 @@ default behaviour is: // shut down ongoing problems radiation = 0 bodytemperature = get_species()?.body_temperature || initial(bodytemperature) - sdisabilities = 0 - disabilities = 0 + reset_genetic_conditions() // fix all status conditions including blind/deaf clear_status_effects() @@ -615,7 +614,7 @@ default behaviour is: //called when the mob receives a bright flash /mob/living/flash_eyes(intensity = FLASH_PROTECTION_MODERATE, override_blindness_check = FALSE, affect_silicon = FALSE, visual = FALSE, type = /obj/screen/fullscreen/flash) - if(eyecheck() < intensity || override_blindness_check) + if(eyecheck() < intensity || override_blindness_check || !has_genetic_condition(GENE_COND_BLINDED)) overlay_fullscreen("flash", type) spawn(25) if(src) @@ -748,7 +747,7 @@ default behaviour is: . += 15 if(HAS_STATUS(src, STAT_CONFUSE)) . += 30 - if(MUTATION_CLUMSY in mutations) + if(has_genetic_condition(GENE_COND_CLUMSY)) . += 40 /mob/living/proc/ranged_accuracy_mods() @@ -761,7 +760,7 @@ default behaviour is: . -= 5 if(HAS_STATUS(src, STAT_BLURRY)) . -= 1 - if(MUTATION_CLUMSY in mutations) + if(has_genetic_condition(GENE_COND_CLUMSY)) . -= 3 /mob/living/can_drown() @@ -1166,12 +1165,14 @@ default behaviour is: //We are long dead, or we're junk mobs spawned like the clowns on the clown shuttle return life_tick <= 5 || !timeofdeath || (timeofdeath >= 5 && (world.time-timeofdeath) <= 10 MINUTES) -/mob/living/proc/check_dna() - dna?.check_integrity(src) - /mob/living/get_unique_enzymes() + if(isnull(unique_enzymes) && has_genetic_information()) + set_unique_enzymes(md5(name)) return unique_enzymes +/mob/living/set_unique_enzymes(value) + unique_enzymes = value + /mob/living/get_blood_type() return blood_type @@ -1283,6 +1284,8 @@ default behaviour is: return "Unknown" /mob/living/proc/identity_is_visible() + if(has_genetic_condition(GENE_COND_HUSK)) + return FALSE if(!real_name) return FALSE var/obj/item/clothing/mask/mask = get_equipped_item(slot_wear_mask_str) @@ -1642,6 +1645,11 @@ default behaviour is: var/list/organ_info = organ.get_stat_info() stat(organ_info[1], organ_info[2]) +/mob/living/force_update_limbs() + for(var/obj/item/organ/external/O in get_external_organs()) + O.sync_colour_to_human(src) + update_body(0) + /mob/living/proc/get_vision_organ_tag() return get_bodytype()?.vision_organ diff --git a/code/modules/mob/living/living_breath.dm b/code/modules/mob/living/living_breath.dm index 82b2a7cedc1..9ff47af0f62 100644 --- a/code/modules/mob/living/living_breath.dm +++ b/code/modules/mob/living/living_breath.dm @@ -5,7 +5,7 @@ return FALSE /mob/living/proc/need_breathe() - if(mNobreath in mutations) + if(has_genetic_condition(GENE_COND_NO_BREATH)) return FALSE var/decl/bodytype/root_bodytype = get_bodytype() if(!root_bodytype || !root_bodytype.breathing_organ || !should_have_organ(root_bodytype.breathing_organ)) diff --git a/code/modules/mob/living/living_genetics.dm b/code/modules/mob/living/living_genetics.dm new file mode 100644 index 00000000000..fd0c40638a0 --- /dev/null +++ b/code/modules/mob/living/living_genetics.dm @@ -0,0 +1,56 @@ +/mob/living + VAR_PRIVATE/_updating_genetic_conditions + VAR_PRIVATE/list/_genetic_conditions + +/mob/living/proc/queue_genetic_condition_update() + set waitfor = FALSE + if(_updating_genetic_conditions) + return + _updating_genetic_conditions = TRUE + sleep(1) + _updating_genetic_conditions = FALSE + update_genetic_conditions() + +/mob/living/get_genetic_conditions() + RETURN_TYPE(/list) + return _genetic_conditions + +/mob/living/can_have_genetic_conditions() + return !(get_bodytype()?.body_flags & BODY_FLAG_NO_DNA) + +/mob/living/has_genetic_condition(condition_type) + if(!LAZYLEN(_genetic_conditions)) + return FALSE + var/decl/genetic_condition/condition = GET_DECL(condition_type) + return (condition in _genetic_conditions) + +/mob/living/add_genetic_condition(condition_type, temporary_time) + var/decl/genetic_condition/condition = GET_DECL(condition_type) + if(condition && !(condition in _genetic_conditions) && condition.activate_condition(src)) + LAZYDISTINCTADD(_genetic_conditions, condition) + if(temporary_time) + // TODO: some kind of world.time key or parameter so overlapping calls don't remove each other. + addtimer(CALLBACK(src, TYPE_PROC_REF(/mob/living, remove_genetic_condition)), temporary_time) + queue_genetic_condition_update() + return TRUE + return FALSE + +/mob/living/remove_genetic_condition(condition_type) + if(!LAZYLEN(_genetic_conditions)) + return FALSE + var/decl/genetic_condition/condition = GET_DECL(condition_type) + if(condition && (condition in _genetic_conditions) && condition.deactivate_condition(src)) + LAZYREMOVE(_genetic_conditions, condition) + queue_genetic_condition_update() + return TRUE + return FALSE + +/mob/living/reset_genetic_conditions() + if(!LAZYLEN(_genetic_conditions)) + return FALSE + for(var/decl/genetic_condition/condition as anything in _genetic_conditions) + if(condition.deactivate_condition(src)) + . = TRUE + _genetic_conditions = null + if(.) + update_icon() diff --git a/code/modules/mob/living/silicon/robot/analyzer.dm b/code/modules/mob/living/silicon/robot/analyzer.dm index 96d7998715a..e684028a54a 100644 --- a/code/modules/mob/living/silicon/robot/analyzer.dm +++ b/code/modules/mob/living/silicon/robot/analyzer.dm @@ -21,7 +21,7 @@ /obj/item/robotanalyzer/use_on_mob(mob/living/target, mob/living/user, animate = TRUE) - if((MUTATION_CLUMSY in user.mutations) && prob(50)) + if(user.has_genetic_condition(GENE_COND_CLUMSY) && prob(50)) user.visible_message( SPAN_WARNING("\The [user] has analyzed the floor's vitals!"), self_message = SPAN_WARNING("You try to analyze the floor's vitals!")) diff --git a/code/modules/mob/living/silicon/robot/life.dm b/code/modules/mob/living/silicon/robot/life.dm index 1d8728fa974..2cb4f2a1492 100644 --- a/code/modules/mob/living/silicon/robot/life.dm +++ b/code/modules/mob/living/silicon/robot/life.dm @@ -64,10 +64,10 @@ cameranet.update_visibility(src, FALSE) SET_STATUS_MAX(src, STAT_BLIND, 2) - if(sdisabilities & BLINDED) + if(has_genetic_condition(GENE_COND_BLINDED)) SET_STATUS_MAX(src, STAT_BLIND, 2) - if(src.sdisabilities & DEAFENED) + if(has_genetic_condition(GENE_COND_DEAFENED)) src.set_status(STAT_DEAF, 1) //update the state of modules and components here @@ -199,7 +199,7 @@ overlay_fullscreen("blind", /obj/screen/fullscreen/blind) else clear_fullscreen("blind") - set_fullscreen(disabilities & NEARSIGHTED, "impaired", /obj/screen/fullscreen/impaired, 1) + set_fullscreen(has_genetic_condition(GENE_COND_NEARSIGHTED), "impaired", /obj/screen/fullscreen/impaired, 1) set_fullscreen(GET_STATUS(src, STAT_BLURRY), "blurry", /obj/screen/fullscreen/blurry) set_fullscreen(GET_STATUS(src, STAT_DRUGGY), "high", /obj/screen/fullscreen/high) @@ -209,7 +209,7 @@ /mob/living/silicon/robot/handle_vision() ..() - if (src.stat == DEAD || (MUTATION_XRAY in mutations) || (src.sight_mode & BORGXRAY)) + if (src.stat == DEAD || has_genetic_condition(GENE_COND_XRAY) || (src.sight_mode & BORGXRAY)) set_sight(sight|SEE_TURFS|SEE_MOBS|SEE_OBJS) set_see_in_dark(8) set_see_invisible(SEE_INVISIBLE_LEVEL_TWO) diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index 375f18a5913..bf9c64a44c3 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -278,7 +278,7 @@ var/global/list/simplemob_icon_bitflag_cache = list() atmos_suitable = FALSE break //Atmos effect - if(!(MUTATION_SPACERES in mutations) && abs(environment.temperature - bodytemperature) > 40) + if(!has_genetic_condition(GENE_COND_SPACE_RESISTANCE) && abs(environment.temperature - bodytemperature) > 40) bodytemperature += ((environment.temperature - bodytemperature) / 5) if(bodytemperature < minbodytemp) diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 29215fb49f3..23ed7f86767 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -247,10 +247,10 @@ return restrained() ? FULLY_BUCKLED : PARTIALLY_BUCKLED /mob/proc/is_blind() - return ((sdisabilities & BLINDED) || incapacitated(INCAPACITATION_KNOCKOUT) || HAS_STATUS(src, STAT_BLIND)) + return (has_genetic_condition(GENE_COND_BLINDED) || incapacitated(INCAPACITATION_KNOCKOUT) || HAS_STATUS(src, STAT_BLIND)) /mob/proc/is_deaf() - return ((sdisabilities & DEAFENED) || incapacitated(INCAPACITATION_KNOCKOUT) || HAS_STATUS(src, STAT_DEAF)) + return (has_genetic_condition(GENE_COND_DEAFENED) || incapacitated(INCAPACITATION_KNOCKOUT) || HAS_STATUS(src, STAT_DEAF)) /mob/proc/is_physically_disabled() return incapacitated(INCAPACITATION_DISABLED) @@ -1292,6 +1292,9 @@ /mob/proc/get_unique_enzymes() return +/mob/proc/set_unique_enzymes(value) + return + /mob/proc/get_blood_type() return @@ -1327,6 +1330,31 @@ /mob/proc/swap_hand() SHOULD_CALL_PARENT(TRUE) +/mob/proc/set_skin_tone(value) + return + +/mob/proc/get_skin_tone(value) + return + +/mob/proc/force_update_limbs() + return + +/mob/proc/update_eyes(update_icons = TRUE) + var/obj/item/organ/internal/eyes/eyes = get_organ((get_bodytype()?.vision_organ || BP_EYES), /obj/item/organ/internal/eyes) + if(eyes) + eyes.update_colour() + if(update_icons) + queue_icon_update() + +/mob/proc/has_genetic_information() + if(isSynthetic()) + return FALSE + var/decl/bodytype/bodytype = get_bodytype() + if(bodytype?.body_flags & BODY_FLAG_NO_DNA) + return FALSE + return TRUE + /mob/living/proc/get_butchery_product_name() var/decl/butchery_data/butchery_decl = GET_DECL(butchery_data) . = butchery_decl?.meat_name || name + diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm index 307ce79a4c5..9d750d10e17 100644 --- a/code/modules/mob/mob_defines.dm +++ b/code/modules/mob/mob_defines.dm @@ -76,9 +76,6 @@ var/damageoverlaytemp = 0 var/obj/machinery/machine = null - var/sdisabilities = 0 //Carbon - var/disabilities = 0 //Carbon - var/next_move = null var/real_name = null @@ -115,11 +112,6 @@ var/can_pull_size = ITEM_SIZE_STRUCTURE // Maximum w_class the mob can pull. var/can_pull_mobs = MOB_PULL_SAME // Whether or not the mob can pull other mobs. - var/datum/dna/dna = null//Carbon - var/list/active_genes - var/list/mutations = list() // TODO: Lazylist this var. - //see: setup.dm for list of mutations - var/radiation = 0.0//Carbon var/faction = MOB_FACTION_NEUTRAL //Used for checking whether hostile simple animals will attack you, possibly more stuff later diff --git a/code/modules/mob/mob_genetics.dm b/code/modules/mob/mob_genetics.dm new file mode 100644 index 00000000000..d7fc30f3688 --- /dev/null +++ b/code/modules/mob/mob_genetics.dm @@ -0,0 +1,17 @@ +/mob/proc/get_genetic_conditions() + RETURN_TYPE(/list) + +/mob/proc/can_have_genetic_conditions() + return FALSE + +/mob/proc/has_genetic_condition(condition_type) + return FALSE + +/mob/proc/add_genetic_condition(condition_type, temporary_time) + return FALSE + +/mob/proc/remove_genetic_condition(condition_type) + return FALSE + +/mob/proc/reset_genetic_conditions() + return diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index aaa403b01d6..cd05ca484fa 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -13,7 +13,7 @@ return FALSE //M is too small to wield this return TRUE -/mob/living/proc/isSynthetic() +/mob/proc/isSynthetic() return 0 /mob/living/carbon/human/isSynthetic() @@ -51,7 +51,7 @@ /proc/isdeaf(A) if(isliving(A)) var/mob/living/M = A - return (M.sdisabilities & DEAFENED) || GET_STATUS(M, STAT_DEAF) + return M.has_genetic_condition(GENE_COND_DEAFENED) || GET_STATUS(M, STAT_DEAF) return 0 /proc/iscuffed(var/mob/mob) @@ -528,8 +528,6 @@ var/global/list/intents = list(I_HELP,I_DISARM,I_GRAB,I_HURT) SetName(new_name) if(mind) mind.name = new_name - if(dna) - dna.real_name = real_name return 1 /mob/proc/ssd_check() @@ -599,12 +597,6 @@ var/global/list/intents = list(I_HELP,I_DISARM,I_GRAB,I_HURT) return null return choice -/mob/proc/set_sdisability(sdisability) - sdisabilities |= sdisability - -/mob/proc/unset_sdisability(sdisability) - sdisabilities &= ~sdisability - /mob/proc/get_accumulated_vision_handlers() var/result[2] var/asight = 0 diff --git a/code/modules/mob/mob_snapshot.dm b/code/modules/mob/mob_snapshot.dm new file mode 100644 index 00000000000..8d9636d3f87 --- /dev/null +++ b/code/modules/mob/mob_snapshot.dm @@ -0,0 +1,89 @@ +// Stub type used to replicate old DNA system's role in mob/organ initialization. +// Effectively a snapshot of a mob's state at a moment in time. +/datum/mob_snapshot + var/real_name + var/eye_color + var/blood_type + var/unique_enzymes + var/skin_color + var/skin_tone + var/fingerprint + + var/decl/species/root_species + var/decl/bodytype/root_bodytype + + var/list/sprite_accessories + var/list/genetic_conditions + +/datum/mob_snapshot/New(mob/living/donor, force) + + real_name = donor?.real_name || "unknown" + eye_color = donor?.get_eye_colour() || COLOR_BLACK + blood_type = donor?.get_blood_type() + unique_enzymes = donor?.get_unique_enzymes() + fingerprint = donor?.get_full_print(ignore_blockers = TRUE) + + root_species = donor?.get_species() || get_species_by_key(global.using_map.default_species) + root_bodytype = donor?.get_bodytype() || root_species.default_bodytype + + for(var/obj/item/organ/external/limb in donor?.get_external_organs()) + // Discard anything not relating to our core/original bodytype and species. + // Does this need to be reviewed for Outreach serde? + if(limb.bodytype == root_bodytype && limb.species == root_species && (force || !BP_IS_PROSTHETIC(limb))) + var/list/limb_sprite_acc = limb.get_sprite_accessories(copy = TRUE) + if(length(limb_sprite_acc)) + LAZYSET(sprite_accessories, limb.organ_tag, limb_sprite_acc) + + genetic_conditions = donor?.get_genetic_conditions()?.Copy() + for(var/decl/genetic_condition/condition as anything in genetic_conditions) + if(!condition.is_heritable) + LAZYREMOVE(genetic_conditions, condition) + +/datum/mob_snapshot/Clone() + var/datum/mob_snapshot/clone = ..() + if(clone) + clone.real_name = real_name + clone.eye_color = eye_color + clone.blood_type = blood_type + clone.unique_enzymes = unique_enzymes + clone.skin_color = skin_color + clone.skin_tone = skin_tone + clone.fingerprint = fingerprint + clone.genetic_conditions = genetic_conditions?.Copy() + clone.root_species = root_species + clone.root_bodytype = root_bodytype + if(sprite_accessories) + clone.sprite_accessories = deepCopyList(sprite_accessories) + return clone + +// Replaces UpdateAppearance(). +/datum/mob_snapshot/proc/apply_appearance_to(mob/living/target) + + if(istype(root_species)) + if(istype(root_bodytype)) + target.set_species(root_species.name, root_bodytype) + else + target.set_species(root_species.name) + + else if(istype(root_bodytype)) + target.set_bodytype(root_bodytype) + + target.set_fingerprint(fingerprint) + target.set_unique_enzymes(unique_enzymes) + target.set_skin_colour(skin_color) + target.set_eye_colour(eye_color) + target.set_skin_tone(skin_tone) + + for(var/obj/item/organ/organ in target.get_organs()) + organ.copy_from_mob_snapshot(src) + + for(var/decl/genetic_condition/condition as anything in genetic_conditions) + target.add_genetic_condition(condition.type) + + target.force_update_limbs() + target.update_hair(update_icons = FALSE) + target.update_eyes() + return TRUE + +/mob/proc/get_mob_snapshot(force = FALSE) + return (force || has_genetic_information()) ? new /datum/mob_snapshot(src, force) : null diff --git a/code/modules/mob/mob_transformation_simple.dm b/code/modules/mob/mob_transformation_simple.dm index e4f273ad596..8adaf8f9384 100644 --- a/code/modules/mob/mob_transformation_simple.dm +++ b/code/modules/mob/mob_transformation_simple.dm @@ -77,9 +77,6 @@ var/global/list/href_to_mob_type = list( M.SetName(name) M.real_name = real_name - if(dna) - M.dna = dna.Clone() - if(mind) mind.transfer_to(M) if(!M.key) // ghost minds are inactive for reasons that escape me diff --git a/code/modules/mob/transform_procs.dm b/code/modules/mob/transform_procs.dm index 47b9ba306b7..f62567389cb 100644 --- a/code/modules/mob/transform_procs.dm +++ b/code/modules/mob/transform_procs.dm @@ -29,8 +29,6 @@ for(var/obj/item/W in src) drop_from_inventory(W) change_species(species.primitive_form) - dna.SetSEState(global.MONKEYBLOCK,1) - dna.SetSEValueRange(global.MONKEYBLOCK,0xDAC, 0xFFF) to_chat(src, "You are now [species.name]. ") qdel(animation) @@ -263,8 +261,8 @@ /mob/living/carbon/human/proc/zombify() - make_husked() - mutations |= MUTATION_CLUMSY + add_genetic_condition(GENE_COND_HUSK) + add_genetic_condition(GENE_COND_CLUMSY) src.visible_message("\The [src]'s skin decays before your very eyes!", "Your entire body is ripe with pain as it is consumed down to flesh and bones. You ... hunger. Not only for flesh, but to spread this gift.") if (src.mind) if (src.mind.assigned_special_role == "Zombie") diff --git a/code/modules/mob/update_icons.dm b/code/modules/mob/update_icons.dm index 3c38a1b7daa..890f90d27c8 100644 --- a/code/modules/mob/update_icons.dm +++ b/code/modules/mob/update_icons.dm @@ -57,7 +57,7 @@ if(redraw_mob) queue_icon_update() -/mob/proc/update_mutations() +/mob/proc/update_genetic_conditions() return /mob/proc/update_hair(var/update_icons=1) diff --git a/code/modules/nano/modules/human_appearance.dm b/code/modules/nano/modules/human_appearance.dm index 926fe34acf2..cefa879ebb0 100644 --- a/code/modules/nano/modules/human_appearance.dm +++ b/code/modules/nano/modules/human_appearance.dm @@ -43,38 +43,32 @@ if(href_list["skin_color"] && can_change_skin_color()) var/new_skin = input(usr, "Choose your character's skin colour: ", "Skin Color", owner.get_skin_colour()) as color|null if(new_skin && can_still_topic(state) && owner.set_skin_colour(new_skin)) - update_dna() return TRUE if(href_list["hair"]) var/decl/sprite_accessory/hair = locate(href_list["hair"]) if(can_change(APPEARANCE_HAIR) && istype(hair) && (hair.type in owner.get_species()?.get_available_accessory_types(owner.get_bodytype(), SAC_HAIR)) && SET_HAIR_STYLE(owner, hair.type, FALSE)) - update_dna() return TRUE if(href_list["hair_color"] && can_change(APPEARANCE_HAIR_COLOR)) var/new_hair = input("Please select hair color.", "Hair Color", GET_HAIR_COLOUR(owner)) as color|null if(new_hair && can_still_topic(state) && SET_HAIR_COLOUR(owner, new_hair, FALSE)) - update_dna() return TRUE if(href_list["facial_hair"]) var/decl/sprite_accessory/facial_hair = locate(href_list["facial_hair"]) if(can_change(APPEARANCE_FACIAL_HAIR) && istype(facial_hair) && (facial_hair.type in owner.get_species()?.get_available_accessory_types(owner.get_bodytype(), SAC_FACIAL_HAIR)) && SET_FACIAL_HAIR_STYLE(owner, facial_hair.type, FALSE)) - update_dna() return TRUE if(href_list["facial_hair_color"] && can_change(APPEARANCE_FACIAL_HAIR_COLOR)) var/new_facial = input("Please select facial hair color.", "Facial Hair Color", GET_FACIAL_HAIR_COLOUR(owner)) as color|null if(new_facial && can_still_topic(state) && SET_FACIAL_HAIR_COLOUR(owner, new_facial, FALSE)) - update_dna() return TRUE if(href_list["eye_color"]) if(can_change(APPEARANCE_EYE_COLOR)) var/new_eyes = input("Please select eye color.", "Eye Color", owner.get_eye_colour()) as color|null if(new_eyes && can_still_topic(state) && owner.set_eye_colour(new_eyes)) - update_dna() return TRUE return FALSE @@ -143,10 +137,6 @@ ui.open() ui.set_auto_update(1) -/datum/nano_module/appearance_changer/proc/update_dna() - if(owner && (flags & APPEARANCE_UPDATE_DNA)) - owner.update_dna() - /datum/nano_module/appearance_changer/proc/can_change(var/flag) return owner && (flags & flag) diff --git a/code/modules/organs/external/_external.dm b/code/modules/organs/external/_external.dm index 8d96d8b60bf..51e9061455a 100644 --- a/code/modules/organs/external/_external.dm +++ b/code/modules/organs/external/_external.dm @@ -81,6 +81,13 @@ var/image/hud_damage_image var/fingerprint +/obj/item/organ/external/proc/set_fingerprint(value) + if((limb_flags & ORGAN_FLAG_FINGERPRINT) && !BP_IS_PROSTHETIC(src)) + fingerprint = value + else + for(var/obj/item/organ/external/E in children) + E.set_fingerprint(value) + /obj/item/organ/external/proc/get_fingerprint() if((limb_flags & ORGAN_FLAG_FINGERPRINT) && !BP_IS_PROSTHETIC(src)) @@ -102,7 +109,7 @@ F.completeness = rand(10,90) forensics.add_data(/datum/forensics/fingerprints, F) -/obj/item/organ/external/Initialize(mapload, material_key, datum/dna/given_dna, decl/bodytype/new_bodytype) +/obj/item/organ/external/Initialize(mapload, material_key, datum/mob_snapshot/supplied_appearance, decl/bodytype/new_bodytype) . = ..() if(. != INITIALIZE_HINT_QDEL && isnull(pain_disability_threshold)) pain_disability_threshold = (max_damage * 0.75) @@ -144,8 +151,16 @@ if(.) update_icon(TRUE) -/obj/item/organ/external/set_dna(var/datum/dna/new_dna) +/obj/item/organ/external/copy_from_mob_snapshot(datum/mob_snapshot/supplied_appearance) _icon_cache_key = null + if(organ_tag in supplied_appearance?.sprite_accessories) + var/list/sprite_cats = supplied_appearance.sprite_accessories[organ_tag] + for(var/category in sprite_cats) + var/list/marklist = sprite_cats[category] + for(var/accessory in marklist) + set_sprite_accessory(accessory, null, marklist[accessory], skip_update = TRUE) + else + clear_sprite_accessories(skip_update = TRUE) return ..() /obj/item/organ/external/reset_status() @@ -1607,6 +1622,11 @@ Note that amputating the affected organ does in fact remove the infection from t if(default_results) . = default_results +/obj/item/organ/external/proc/get_sprite_accessories(copy = FALSE) + if(copy) + return _sprite_accessories?.Copy() + return _sprite_accessories + /obj/item/organ/external/proc/skeletonize(mob/living/donor) if(limb_flags & ORGAN_FLAG_SKELETAL) return @@ -1622,3 +1642,4 @@ Note that amputating the affected organ does in fact remove the infection from t status |= (ORGAN_DEAD|ORGAN_BRITTLE) _sprite_accessories = null update_icon() + diff --git a/code/modules/organs/external/_external_icons.dm b/code/modules/organs/external/_external_icons.dm index d875849e473..393d6d29977 100644 --- a/code/modules/organs/external/_external_icons.dm +++ b/code/modules/organs/external/_external_icons.dm @@ -36,15 +36,6 @@ var/global/list/limb_icon_cache = list() if(bodytype.appearance_flags & HAS_SKIN_COLOR) skin_colour = human.get_skin_colour() -/obj/item/organ/external/proc/sync_colour_to_dna() - _icon_cache_key = null - skin_tone = null - skin_colour = null - if(!isnull(dna.GetUIValue(DNA_UI_SKIN_TONE)) && (bodytype.appearance_flags & HAS_A_SKIN_TONE)) - skin_tone = dna.GetUIValue(DNA_UI_SKIN_TONE) - if(bodytype.appearance_flags & HAS_SKIN_COLOR) - skin_colour = rgb(dna.GetUIValue(DNA_UI_SKIN_R), dna.GetUIValue(DNA_UI_SKIN_G), dna.GetUIValue(DNA_UI_SKIN_B)) - /obj/item/organ/external/head/sync_colour_to_human(var/mob/living/carbon/human/human) ..() var/obj/item/organ/internal/eyes/eyes = human.get_organ(BP_EYES, /obj/item/organ/internal/eyes) diff --git a/code/modules/organs/internal/_internal.dm b/code/modules/organs/internal/_internal.dm index b07a455e703..1e7d862f48a 100644 --- a/code/modules/organs/internal/_internal.dm +++ b/code/modules/organs/internal/_internal.dm @@ -27,7 +27,7 @@ /// Whether or not we should try to transfer a brainmob when removed or replaced in a mob. var/transfer_brainmob_with_organ = FALSE -/obj/item/organ/internal/Initialize(mapload, material_key, datum/dna/given_dna, decl/bodytype/new_bodytype) +/obj/item/organ/internal/Initialize(mapload, material_key, datum/mob_snapshot/supplied_appearance, decl/bodytype/new_bodytype) if(!alive_icon) alive_icon = initial(icon_state) . = ..() @@ -276,7 +276,6 @@ if(update_brainmob) brainmob.SetName(M.real_name) brainmob.real_name = M.real_name - brainmob.dna = M.dna?.Clone() brainmob.languages = M.languages?.Copy() brainmob.default_language = M.default_language to_chat(brainmob, SPAN_NOTICE("You feel slightly disoriented. That's normal when you're just \a [initial(src.name)].")) diff --git a/code/modules/organs/internal/brain.dm b/code/modules/organs/internal/brain.dm index e9c16bafef1..3721d55e684 100644 --- a/code/modules/organs/internal/brain.dm +++ b/code/modules/organs/internal/brain.dm @@ -185,9 +185,9 @@ /obj/item/organ/internal/brain/proc/handle_disabilities() if(owner.stat) return - if((owner.disabilities & EPILEPSY) && prob(1)) + if(owner.has_genetic_condition(GENE_COND_EPILEPSY) && prob(1)) owner.seizure() - else if((owner.disabilities & TOURETTES) && prob(10)) + else if(owner.has_genetic_condition(GENE_COND_TOURETTES) && prob(10)) SET_STATUS_MAX(owner, STAT_STUN, 10) switch(rand(1, 3)) if(1) @@ -195,7 +195,7 @@ if(2 to 3) owner.say("[prob(50) ? ";" : ""][pick("SHIT", "PISS", "FUCK", "CUNT", "COCKSUCKER", "MOTHERFUCKER", "TITS")]") ADJ_STATUS(owner, STAT_JITTER, 100) - else if((owner.disabilities & NERVOUS) && prob(10)) + else if(owner.has_genetic_condition(GENE_COND_NERVOUS) && prob(10)) SET_STATUS_MAX(owner, STAT_STUTTER, 10) diff --git a/code/modules/organs/internal/eyes.dm b/code/modules/organs/internal/eyes.dm index 9eaec210aa2..510f53fcdac 100644 --- a/code/modules/organs/internal/eyes.dm +++ b/code/modules/organs/internal/eyes.dm @@ -31,7 +31,7 @@ organ_properties = ORGAN_PROP_PROSTHETIC icon = 'icons/obj/robot_component.dmi' -/obj/item/organ/internal/eyes/robot/Initialize(mapload, material_key, datum/dna/given_dna, decl/bodytype/new_bodytype) +/obj/item/organ/internal/eyes/robot/Initialize(mapload, material_key, datum/mob_snapshot/supplied_appearance, decl/bodytype/new_bodytype) . = ..() verbs |= /obj/item/organ/internal/eyes/proc/change_eye_color_verb verbs |= /obj/item/organ/internal/eyes/proc/toggle_eye_glow diff --git a/code/modules/organs/internal/lungs.dm b/code/modules/organs/internal/lungs.dm index 9fc8e2a6297..d790c965550 100644 --- a/code/modules/organs/internal/lungs.dm +++ b/code/modules/organs/internal/lungs.dm @@ -273,7 +273,7 @@ // Hot air hurts :( var/cold_1 = bodytype.get_body_temperature_threshold(COLD_LEVEL_1) var/heat_1 = bodytype.get_body_temperature_threshold(HEAT_LEVEL_1) - if((breath.temperature < cold_1 || breath.temperature > heat_1) && !(MUTATION_COLD_RESISTANCE in owner.mutations)) + if((breath.temperature < cold_1 || breath.temperature > heat_1) && !owner.has_genetic_condition(GENE_COND_COLD_RESISTANCE)) var/damage = 0 if(breath.temperature <= cold_1) if(prob(20)) diff --git a/code/modules/organs/internal/stomach.dm b/code/modules/organs/internal/stomach.dm index 25c3291e363..f28de893814 100644 --- a/code/modules/organs/internal/stomach.dm +++ b/code/modules/organs/internal/stomach.dm @@ -119,7 +119,7 @@ var/alcohol_volume = REAGENT_VOLUME(ingested, /decl/material/liquid/ethanol) var/alcohol_threshold_met = alcohol_volume > STOMACH_VOLUME / 2 - if(alcohol_threshold_met && (owner.disabilities & EPILEPSY) && prob(20)) + if(alcohol_threshold_met && owner.has_genetic_condition(GENE_COND_EPILEPSY) && prob(20)) owner.seizure() // Alcohol counts as double volume for the purposes of vomit probability diff --git a/code/modules/organs/organ.dm b/code/modules/organs/organ.dm index 2a96a9b1049..0ef396c83fc 100644 --- a/code/modules/organs/organ.dm +++ b/code/modules/organs/organ.dm @@ -19,8 +19,8 @@ var/vital_to_owner // Cache var for vitality to current owner. // Reference data. + var/datum/mob_snapshot/organ_appearance var/mob/living/carbon/human/owner // Current mob owning the organ. - var/datum/dna/dna // Original DNA. var/decl/species/species // Original species. var/decl/bodytype/bodytype // Original bodytype. var/list/ailments // Current active ailments if any. @@ -46,7 +46,7 @@ do_uninstall(TRUE, FALSE, FALSE, FALSE) //Don't ignore children here since we might own/contain them species = null bodytype = null - QDEL_NULL(dna) + QDEL_NULL(organ_appearance) QDEL_NULL_LIST(ailments) return ..() @@ -63,43 +63,42 @@ return (damage >= min_broken_damage || (status & ORGAN_CUT_AWAY) || (status & ORGAN_BROKEN) || (status & ORGAN_DEAD)) //Third argument may be a dna datum; if null will be set to holder's dna. -/obj/item/organ/Initialize(mapload, material_key, datum/dna/given_dna, decl/bodytype/new_bodytype) +/obj/item/organ/Initialize(mapload, material_key, datum/mob_snapshot/supplied_appearance) . = ..(mapload, material_key) if(. == INITIALIZE_HINT_QDEL) return . - setup(given_dna, new_bodytype) + setup_organ(supplied_appearance) initialize_reagents() -/obj/item/organ/proc/setup(datum/dna/given_dna, decl/bodytype/new_bodytype) +/obj/item/organ/proc/setup_organ(datum/mob_snapshot/supplied_appearance) //Null DNA setup - if(!given_dna) - if(dna) - given_dna = dna //Use existing if possible + if(!supplied_appearance) + if(organ_appearance) + supplied_appearance = organ_appearance //Use existing if possible else if(owner) - if(owner.dna) - given_dna = owner.dna //Grab our owner's dna if we don't have any, and they have + if(owner) + supplied_appearance = owner.get_mob_snapshot() //Grab our owner's appearance info if we don't have any, and they have else - //The owner having no DNA can be a valid reason to keep our dna null in some cases - log_debug("obj/item/organ/setup(): [src] had null dna, with a owner with null dna!") - dna = null //#TODO: Not sure that's really legal + //The owner having no DNA can be a valid reason to keep our appearance data null in some cases + log_debug("obj/item/organ/setup(): [src] had null appearance data, with a owner with null appearance data!") + organ_appearance = null //#TODO: Not sure that's really legal return else - //If we have NO OWNER and given_dna, just make one up for consistency - given_dna = new/datum/dna() - given_dna.check_integrity() //Defaults everything + //If we have NO OWNER and supplied_appearance, just make one up for consistency + supplied_appearance = new // order of bodytype preference: new, current, owner, species - new_bodytype ||= bodytype || owner?.get_bodytype() + var/decl/bodytype/new_bodytype = supplied_appearance?.root_bodytype || bodytype || owner?.get_bodytype() if(ispath(new_bodytype, /decl/bodytype)) new_bodytype = GET_DECL(new_bodytype) if(!new_bodytype) - // this can be fine if dna with species is passed + // this can be fine if appearance data with species is passed log_debug("obj/item/organ/setup(): [src] had null bodytype, with an owner with null bodytype!") bodytype = new_bodytype // used in later setup procs - if((bodytype?.body_flags & BODY_FLAG_NO_DNA) || !given_dna) - // set_bodytype will unset invalid dna anyway, so set_dna(null) is unnecessary - set_species(given_dna?.species || owner?.get_species() || global.using_map.default_species) + if((bodytype?.body_flags & BODY_FLAG_NO_DNA) || !supplied_appearance) + // set_bodytype will unset invalid appearance data anyway, so set_dna(null) is unnecessary + set_species(owner?.get_species() || global.using_map.default_species) else - set_dna(given_dna) + copy_from_mob_snapshot(supplied_appearance) //Called on initialization to add the neccessary reagents @@ -117,15 +116,17 @@ if(reagent_to_add) add_to_reagents(reagent_to_add, reagents.maximum_volume) -/obj/item/organ/proc/set_dna(var/datum/dna/new_dna) +/obj/item/organ/proc/copy_from_mob_snapshot(var/datum/mob_snapshot/supplied_appearance) if(istype(bodytype) && (bodytype.body_flags & BODY_FLAG_NO_DNA)) - QDEL_NULL(dna) + QDEL_NULL(organ_appearance) return - if(new_dna != dna) // Hacky. Is this ever used? Do any organs ever have DNA set before setup_as_organic? - QDEL_NULL(dna) - dna = new_dna.Clone() - blood_DNA = list(dna.unique_enzymes = dna.b_type) - set_species(dna.species) + if(supplied_appearance != organ_appearance) // Hacky. Is this ever used? Do any organs ever have DNA set before setup_as_organic? + QDEL_NULL(organ_appearance) + organ_appearance = supplied_appearance.Clone() + blood_DNA = list(organ_appearance.unique_enzymes = organ_appearance.blood_type) + set_species(organ_appearance.root_species?.name || global.using_map.default_species) + if(organ_appearance.root_bodytype) + set_bodytype(organ_appearance.root_bodytype) /obj/item/organ/proc/set_bodytype(decl/bodytype/new_bodytype, override_material = null, apply_to_internal_organs = TRUE) SHOULD_CALL_PARENT(TRUE) @@ -153,7 +154,7 @@ reagents.clear_reagents() populate_reagents() if(bodytype.body_flags & BODY_FLAG_NO_DNA) - QDEL_NULL(dna) + QDEL_NULL(organ_appearance) reset_status() return TRUE @@ -312,9 +313,9 @@ return if(BP_IS_PROSTHETIC(src)) return - if(dna) + if(organ_appearance) if(!rejecting) - if(owner.is_blood_incompatible(dna.b_type)) + if(owner.is_blood_incompatible(organ_appearance.blood_type)) rejecting = 1 else rejecting++ //Rejection severity increases over time. @@ -328,7 +329,7 @@ germ_level += rand(2,3) if(501 to INFINITY) germ_level += rand(3,5) - var/decl/blood_type/blood_decl = dna?.b_type && get_blood_type_by_name(dna.b_type) + var/decl/blood_type/blood_decl = organ_appearance?.blood_type && get_blood_type_by_name(organ_appearance.blood_type) if(istype(blood_decl)) owner.add_to_reagents(blood_decl.transfusion_fail_reagent, round(rand(2,4) * blood_decl.transfusion_fail_percentage)) else diff --git a/code/modules/organs/prosthetics/prosthetics_manufacturer.dm b/code/modules/organs/prosthetics/prosthetics_manufacturer.dm index 11293b79fce..01f7aa03d05 100644 --- a/code/modules/organs/prosthetics/prosthetics_manufacturer.dm +++ b/code/modules/organs/prosthetics/prosthetics_manufacturer.dm @@ -56,7 +56,7 @@ var/decl/species/species = get_species_by_key(species_name) for(var/decl/bodytype/bodytype_data in species.available_bodytypes) if(bodytype_data.bodytype_category == bodytype_category) - return species_name + return species return ..() /decl/bodytype/prosthetic/apply_bodytype_organ_modifications(obj/item/organ/org) diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm index 0f0f20ec49c..46715f7d9df 100644 --- a/code/modules/paperwork/paper.dm +++ b/code/modules/paperwork/paper.dm @@ -495,7 +495,7 @@ to_chat(usr, SPAN_WARNING("You can't do that in your current state!")) return - if((MUTATION_CLUMSY in usr.mutations) && prob(50)) + if(usr.has_genetic_condition(GENE_COND_CLUMSY) && prob(50)) to_chat(usr, SPAN_WARNING("You cut yourself on the paper.")) return var/n_name = sanitize_safe(input(usr, "What would you like to name the paper?", "Paper Naming", name) as text, MAX_NAME_LEN) diff --git a/code/modules/power/lighting.dm b/code/modules/power/lighting.dm index cdc4a702cdb..552110afd4f 100644 --- a/code/modules/power/lighting.dm +++ b/code/modules/power/lighting.dm @@ -333,7 +333,7 @@ if(istype(G) && G.max_heat_protection_temperature > LIGHT_BULB_TEMPERATURE) prot = TRUE - if(prot > 0 || (MUTATION_COLD_RESISTANCE in user.mutations)) + if(prot > 0 || user.has_genetic_condition(GENE_COND_COLD_RESISTANCE)) to_chat(user, "You remove the [get_fitting_name()].") else if(istype(user) && user.is_telekinetic()) to_chat(user, "You telekinetically remove the [get_fitting_name()].") diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index 14f8eacef89..192ff14d5ad 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -198,7 +198,8 @@ if(prob(30)) toggle_safety() return 1 - if((MUTATION_CLUMSY in M.mutations) && prob(40)) //Clumsy handling + + if(M.has_genetic_condition(GENE_COND_CLUMSY) && prob(40)) //Clumsy handling var/obj/P = consume_next_projectile() if(P) var/pew_loc = pick(BP_L_FOOT, BP_R_FOOT) diff --git a/code/modules/projectiles/projectile/energy.dm b/code/modules/projectiles/projectile/energy.dm index 51d5d585f85..48ad05f512e 100644 --- a/code/modules/projectiles/projectile/energy.dm +++ b/code/modules/projectiles/projectile/energy.dm @@ -186,7 +186,7 @@ to_chat(M, SPAN_DANGER("Your ears start to ring badly!")) if(prob(GET_STATUS(M, STAT_TINNITUS) - 5)) to_chat(M, SPAN_DANGER("You can't hear anything!")) - M.set_sdisability(DEAFENED) + M.add_genetic_condition(GENE_COND_DEAFENED) else if(GET_STATUS(M, STAT_TINNITUS) >= 5) to_chat(M, SPAN_DANGER("Your ears start to ring!")) diff --git a/code/modules/projectiles/projectile/special.dm b/code/modules/projectiles/projectile/special.dm index 6094d2dd9e1..cf2650c9966 100644 --- a/code/modules/projectiles/projectile/special.dm +++ b/code/modules/projectiles/projectile/special.dm @@ -93,15 +93,11 @@ SPAN_DANGER("\The [M] writhes in pain as [G.his] vacuoles boil."), blind_message = SPAN_WARNING("You hear a crunching sound.") ) - if(ishuman(M)) - var/mob/living/carbon/human/H = M - if(prob(35)) - if(prob(80)) - randmutb(H) - domutcheck(H,null) - else - randmutg(H) - domutcheck(H,null) + if(prob(35)) + if(prob(80)) + M.add_genetic_condition(pick(decls_repository.get_decls_of_type(/decl/genetic_condition/disability))) + else + M.add_genetic_condition(pick(decls_repository.get_decls_of_type(/decl/genetic_condition/superpower))) else M.heal_damage(BURN, rand(5,15)) M.show_message(SPAN_DANGER("The radiation beam singes you!")) diff --git a/code/modules/random_map/dungeon/rooms/tomb.dm b/code/modules/random_map/dungeon/rooms/tomb.dm index d91a82b13e5..35e45ae624e 100644 --- a/code/modules/random_map/dungeon/rooms/tomb.dm +++ b/code/modules/random_map/dungeon/rooms/tomb.dm @@ -25,7 +25,7 @@ M = new /mob/living/carbon/human() var/mob/living/carbon/human/H = M H.set_species(type) - H.make_husked() + H.add_genetic_condition(GENE_COND_HUSK) else M = new type() M.death() @@ -41,7 +41,7 @@ M = new /mob/living/carbon/human() var/mob/living/carbon/human/H = M H.set_species(type) - H.make_husked() + H.add_genetic_condition(GENE_COND_HUSK) else M = new type() M.death() diff --git a/code/modules/reagents/chems/chems_compounds.dm b/code/modules/reagents/chems/chems_compounds.dm index e7e0715acad..677778384bd 100644 --- a/code/modules/reagents/chems/chems_compounds.dm +++ b/code/modules/reagents/chems/chems_compounds.dm @@ -241,20 +241,18 @@ if(M.isSynthetic()) return - var/mob/living/carbon/human/H = M if(istype(H) && (H.get_bodytype()?.body_flags & BODY_FLAG_NO_DNA)) return - if(M.dna) - if(prob(removed * 0.1)) // Approx. one mutation per 10 injected/20 ingested/30 touching units - randmuti(M) - if(prob(98)) - randmutb(M) - else - randmutg(M) - domutcheck(M, null) - M.UpdateAppearance() + if(prob(removed * 0.1)) // Approx. one mutation per 10 injected/20 ingested/30 touching units + H.set_unique_enzymes(num2text(random_id(/mob, 1000000, 9999999))) + if(prob(98)) + M.add_genetic_condition(pick(decls_repository.get_decls_of_type(/decl/genetic_condition/disability))) + else + M.add_genetic_condition(pick(decls_repository.get_decls_of_type(/decl/genetic_condition/superpower))) + + M.apply_damage(10 * removed, IRRADIATE, armor_pen = 100) /decl/material/liquid/lactate diff --git a/code/modules/reagents/chems/chems_medicines.dm b/code/modules/reagents/chems/chems_medicines.dm index 2ded7b2060b..68e2fdffc44 100644 --- a/code/modules/reagents/chems/chems_medicines.dm +++ b/code/modules/reagents/chems/chems_medicines.dm @@ -271,15 +271,7 @@ if(LAZYACCESS(M.chem_doses, type) > 10) ADJ_STATUS(M, STAT_DIZZY, 5) ADJ_STATUS(M, STAT_JITTER, 5) - var/needs_update = M.mutations.len > 0 - M.mutations.Cut() - M.disabilities = 0 - M.sdisabilities = 0 - if(needs_update && ishuman(M)) - M.dna.ResetUI() - M.dna.ResetSE() - domutcheck(M, null, MUTCHK_FORCED) - M.update_icon() + M.reset_genetic_conditions() /decl/material/liquid/adrenaline name = "adrenaline" diff --git a/code/modules/reagents/reagent_containers/syringes.dm b/code/modules/reagents/reagent_containers/syringes.dm index 5655497ae6f..9d92a10d5d3 100644 --- a/code/modules/reagents/reagent_containers/syringes.dm +++ b/code/modules/reagents/reagent_containers/syringes.dm @@ -131,10 +131,8 @@ if(ishuman(target)) var/amount = REAGENTS_FREE_SPACE(reagents) var/mob/living/carbon/human/T = target - if(!T.dna) + if(!T.vessel?.total_volume) to_chat(user, SPAN_WARNING("You are unable to locate any blood.")) - if(ishuman(target)) - CRASH("[T] \[[T.type]\] was missing their dna datum!") return var/allow = T.can_inject(user, check_zone(user.get_target_zone(), T)) diff --git a/code/modules/species/species.dm b/code/modules/species/species.dm index 3b40fb162a8..d40dcd46278 100644 --- a/code/modules/species/species.dm +++ b/code/modules/species/species.dm @@ -543,7 +543,7 @@ var/global/const/DEFAULT_SPECIES_HEALTH = 200 /decl/species/proc/get_how_nearsighted(var/mob/living/carbon/human/H) var/prescriptions = short_sighted - if(H.disabilities & NEARSIGHTED) + if(H.has_genetic_condition(GENE_COND_NEARSIGHTED)) prescriptions += 7 if(H.equipment_prescription) prescriptions -= H.equipment_prescription diff --git a/code/modules/species/species_bodytype.dm b/code/modules/species/species_bodytype.dm index d4613329a43..6536c8d3c69 100644 --- a/code/modules/species/species_bodytype.dm +++ b/code/modules/species/species_bodytype.dm @@ -490,11 +490,12 @@ var/global/list/bodytypes_by_category = list() if(tail_data) var/obj/item/organ/external/tail/tail_organ = LAZYACCESS(tail_data, "path") if(ispath(tail_organ, /obj/item/organ/external/tail)) - var/use_species = get_user_species_for_validation() + var/decl/species/use_species = get_user_species_for_validation() if(use_species) - var/datum/dna/dummy_dna = new - dummy_dna.species = use_species - tail_organ = new tail_organ(null, null, dummy_dna, src) + var/datum/mob_snapshot/dummy_appearance = new + dummy_appearance.root_species = use_species + dummy_appearance.root_bodytype = src + tail_organ = new tail_organ(null, null, dummy_appearance) var/tail_icon = tail_organ.get_tail_icon() var/tail_state = tail_organ.get_tail() if(tail_icon && tail_state) @@ -506,7 +507,7 @@ var/global/list/bodytypes_by_category = list() if(!tail_state) . += "missing tail state" qdel(tail_organ) - qdel(dummy_dna) + qdel(dummy_appearance) else . += "could not find a species with this bodytype available for tail organ validation" else @@ -573,12 +574,15 @@ var/global/list/bodytypes_by_category = list() qdel(O) //Create missing limbs + var/datum/mob_snapshot/supplied_data = H.get_mob_snapshot(force = TRUE) + supplied_data.root_bodytype = src // This may not have been set on the target mob torso yet. + for(var/limb_type in has_limbs) if(GET_EXTERNAL_ORGAN(H, limb_type)) //Skip existing continue var/list/organ_data = has_limbs[limb_type] var/limb_path = organ_data["path"] - var/obj/item/organ/external/E = new limb_path(H, null, H.dna, src) //explicitly specify the dna and bodytype + var/obj/item/organ/external/E = new limb_path(H, null, supplied_data) //explicitly specify the dna and bodytype if(E.parent_organ) var/list/parent_organ_data = has_limbs[E.parent_organ] parent_organ_data["has_children"]++ @@ -589,7 +593,7 @@ var/global/list/bodytypes_by_category = list() if(GET_INTERNAL_ORGAN(H, organ_tag)) //Skip existing continue var/organ_type = has_organ[organ_tag] - var/obj/item/organ/O = new organ_type(H, null, H.dna, src) + var/obj/item/organ/O = new organ_type(H, null, supplied_data) if(organ_tag != O.organ_tag) warning("[O.type] has a default organ tag \"[O.organ_tag]\" that differs from the species' organ tag \"[organ_tag]\". Updating organ_tag to match.") O.organ_tag = organ_tag @@ -654,7 +658,7 @@ var/global/list/bodytypes_by_category = list() set_default_sprite_accessories(mannequin) mannequin.set_eye_colour(base_eye_color, skip_update = TRUE) mannequin.force_update_limbs() - mannequin.update_mutations(0) + mannequin.update_genetic_conditions(0) mannequin.update_body(0) mannequin.update_underwear(0) mannequin.update_hair(0) @@ -697,9 +701,11 @@ var/global/list/bodytypes_by_category = list() qdel(innard) // Install any necessary new organs. + var/datum/mob_snapshot/supplied_data = limb.owner.get_mob_snapshot(force = TRUE) + supplied_data.root_bodytype = src for(var/organ_tag in replacing_organs) var/organ_type = replacing_organs[organ_tag] - var/obj/item/organ/internal/new_innard = new organ_type(limb.owner, null, limb.owner.dna, src) + var/obj/item/organ/internal/new_innard = new organ_type(limb.owner, null, supplied_data) limb.owner.add_organ(new_innard, GET_EXTERNAL_ORGAN(limb.owner, new_innard.parent_organ), FALSE, FALSE) /decl/bodytype/proc/get_body_temperature_threshold(var/threshold) @@ -745,7 +751,7 @@ var/global/list/bodytypes_by_category = list() for(var/species_name in get_all_species()) var/decl/species/species = get_species_by_key(species_name) if(src in species.available_bodytypes) - return species_name + return species // Defined as a global so modpacks can add to it. var/global/list/limbs_with_nails = list( diff --git a/code/modules/spells/artifacts/spellbound_servants.dm b/code/modules/spells/artifacts/spellbound_servants.dm index d0592a441a8..6ae29a481a4 100644 --- a/code/modules/spells/artifacts/spellbound_servants.dm +++ b/code/modules/spells/artifacts/spellbound_servants.dm @@ -107,14 +107,14 @@ var/familiar_type switch(input(H,"Choose your desired animal form:", "Form") as anything in list("Space Pike", "Mouse", "Cat", "Bear")) if("Space Pike") - H.mutations |= mNobreath - H.mutations |= MUTATION_SPACERES + H.add_genetic_condition(GENE_COND_NO_BREATH) + H.add_genetic_condition(GENE_COND_SPACE_RESISTANCE) familiar_type = /mob/living/simple_animal/hostile/carp/pike if("Mouse") H.verbs |= /mob/living/proc/ventcrawl familiar_type = /mob/living/simple_animal/passive/mouse if("Cat") - H.mutations |= mRun + H.add_genetic_condition(GENE_COND_RUNNING) familiar_type = /mob/living/simple_animal/cat if("Bear") familiar_type = /mob/living/simple_animal/hostile/bear @@ -148,9 +148,11 @@ name = "Infiltrator" desc = "A spy and a manipulator to the end, capable of hiding in plain sight and falsifying information to your heart's content." spiel = "On the surface, you are a completely normal person, but is that really all you are? People are so easy to fool, do as your Master says, and do it with style!" - spells = list(/spell/toggle_armor/infil_items, - /spell/targeted/exude_pleasantness, - /spell/targeted/genetic/blind/hysteria) + spells = list( + /spell/toggle_armor/infil_items, + /spell/targeted/exude_pleasantness, + /spell/targeted/genetic/blind/hysteria + ) /datum/spellbound_type/servant/infiltrator/equip_servant(var/mob/living/carbon/human/H) if(H.gender == MALE) diff --git a/code/modules/spells/contracts.dm b/code/modules/spells/contracts.dm index 3326ddefef0..f6da03c3482 100644 --- a/code/modules/spells/contracts.dm +++ b/code/modules/spells/contracts.dm @@ -64,8 +64,7 @@ /obj/item/contract/wizard/xray/contract_effect(mob/user) ..() - if (!(MUTATION_XRAY in user.mutations)) - user.mutations.Add(MUTATION_XRAY) + if (user.add_genetic_condition(GENE_COND_XRAY)) user.set_sight(user.sight|SEE_MOBS|SEE_OBJS|SEE_TURFS) user.set_see_in_dark(8) user.set_see_invisible(SEE_INVISIBLE_LEVEL_TWO) @@ -80,15 +79,7 @@ /obj/item/contract/wizard/telepathy/contract_effect(mob/user) ..() - if (!ishuman(user)) - return 0 - var/mob/living/carbon/human/H = user - if (mRemotetalk in H.mutations) - return 0 - H.mutations.Add(mRemotetalk) - H.verbs += /mob/living/carbon/human/proc/remotesay - to_chat(H, "You expand your mind outwards.") - return 1 + return user.add_genetic_condition(GENE_COND_REMOTE_TALK) /obj/item/contract/boon name = "boon contract" diff --git a/code/modules/spells/general/invisibility.dm b/code/modules/spells/general/invisibility.dm index 0b71f9ee717..70914e75059 100644 --- a/code/modules/spells/general/invisibility.dm +++ b/code/modules/spells/general/invisibility.dm @@ -18,7 +18,7 @@ if(on) if(H.add_cloaking_source(src)) playsound(get_turf(H), 'sound/effects/teleport.ogg', 90, 1) - H.mutations |= MUTATION_CLUMSY + H.add_genetic_condition(GENE_COND_CLUMSY) else if(H.remove_cloaking_source(src)) playsound(get_turf(H), 'sound/effects/stealthoff.ogg', 90, 1) - H.mutations -= MUTATION_CLUMSY \ No newline at end of file + H.remove_genetic_condition(GENE_COND_CLUMSY) \ No newline at end of file diff --git a/code/modules/spells/targeted/genetic.dm b/code/modules/spells/targeted/genetic.dm index f107fcb1048..bcc5233b9b6 100644 --- a/code/modules/spells/targeted/genetic.dm +++ b/code/modules/spells/targeted/genetic.dm @@ -6,58 +6,41 @@ code\game\dna\genes\goon_powers.dm */ /spell/targeted/genetic name = "Genetic modifier" - desc = "This spell inflicts a set of mutations and disabilities upon the target." - - var/disabilities = 0 //bits - var/list/mutations = list() //mutation strings - duration = 100 //deciseconds - + desc = "This spell inflicts a set of genetic conditions upon the target." + duration = 10 SECONDS + var/list/genetic_conditions = list() /spell/targeted/genetic/cast(list/targets) ..() for(var/mob/living/target in targets) - for(var/x in mutations) - target.mutations.Add(x) - target.disabilities |= disabilities - target.update_mutations() //update target's mutation overlays - spawn(duration) - for(var/x in mutations) - target.mutations.Remove(x) - target.disabilities &= ~disabilities - target.update_mutations() - return + for(var/x in genetic_conditions) + target.add_genetic_condition(x, duration) /spell/targeted/genetic/blind name = "Blind" desc = "This spell inflicts a target with temporary blindness. Does not require wizard garb." feedback = "BD" - disabilities = 1 school = "illusion" duration = 300 - charge_max = 300 - spell_flags = 0 invocation = "Sty Kaly." invocation_type = SpI_WHISPER message = "Your eyes cry out in pain!" level_max = list(Sp_TOTAL = 3, Sp_SPEED = 1, Sp_POWER = 3) cooldown_min = 50 - range = 7 max_targets = 0 - amt_eye_blind = 10 amt_eye_blurry = 20 - hud_state = "wiz_blind" cast_sound = 'sound/magic/blind.ogg' + genetic_conditions = list(GENE_COND_BLINDED) /spell/targeted/genetic/blind/empower_spell() if(!..()) return 0 - duration += 100 - + duration += 10 SECONDS return "[src] will now blind for a longer period of time." /spell/targeted/genetic/blind/hysteria @@ -81,12 +64,10 @@ code\game\dna\genes\goon_powers.dm spell_flags = NOFACTION invocation_type = SpI_SHOUT charge_max = 60 SECONDS - + spell_flags = 0 amt_dizziness = 0 amt_eye_blurry = 5 amt_stunned = 1 - effect_state = "electricity_constant" effect_duration = 5 - - hud_state = "wiz_starburst" \ No newline at end of file + hud_state = "wiz_starburst" diff --git a/code/modules/sprite_accessories/_accessory.dm b/code/modules/sprite_accessories/_accessory.dm index 34f3802ee8a..3cbdf41587e 100644 --- a/code/modules/sprite_accessories/_accessory.dm +++ b/code/modules/sprite_accessories/_accessory.dm @@ -6,9 +6,9 @@ The process of adding in new hairstyles has been made pain-free and easy to do. Enjoy! - Doohl - Notice: This all gets automatically compiled in a list in dna2.dm, so you do not - have to define any UI values for sprite accessories manually for hair and facial - hair. Just add in new hair types and the game will naturally adapt. + Notice: This all gets automatically compiled in a list via the decl rfepository, + so you do not have to add sprite accessories manually to any lists etc. Just add + in new hair types and the game will naturally adapt. Changing icon states, icon files and names should not represent any risks to existing savefiles, but please do not change decl uids unless you are very sure diff --git a/code/modules/submaps/submap_join.dm b/code/modules/submaps/submap_join.dm index 997f6f89de2..312e37b0f45 100644 --- a/code/modules/submaps/submap_join.dm +++ b/code/modules/submaps/submap_join.dm @@ -97,7 +97,7 @@ if(istype(ojob) && ojob.info) to_chat(character, ojob.info) - if(user_human && user_human.disabilities & NEARSIGHTED) + if(user_human && user_human.has_genetic_condition(GENE_COND_NEARSIGHTED)) var/equipped = user_human.equip_to_slot_or_del(new /obj/item/clothing/glasses/prescription(user_human), slot_glasses_str) if(equipped) var/obj/item/clothing/glasses/G = user_human.get_equipped_item(slot_glasses_str) diff --git a/code/modules/xenoarcheaology/artifacts/artifact.dm b/code/modules/xenoarcheaology/artifacts/artifact.dm index 905e551641a..95c7419c963 100644 --- a/code/modules/xenoarcheaology/artifacts/artifact.dm +++ b/code/modules/xenoarcheaology/artifacts/artifact.dm @@ -12,12 +12,14 @@ /obj/structure/artifact/Initialize() . = ..() - var/effecttype = pick(subtypesof(/datum/artifact_effect)) - my_effect = new effecttype(src) - - if(prob(75)) - effecttype = pick(subtypesof(/datum/artifact_effect)) - secondary_effect = new effecttype(src) + if(!ispath(my_effect)) + my_effect = pick(subtypesof(/datum/artifact_effect)) + my_effect = new my_effect(src) + + if(prob(75) && !ispath(secondary_effect)) + secondary_effect = pick(subtypesof(/datum/artifact_effect)) + if(ispath(secondary_effect)) + secondary_effect = new secondary_effect(src) if(prob(75)) secondary_effect.ToggleActivate(0) @@ -136,3 +138,7 @@ ..() if(!QDELETED(src) && fluids?.total_volume) check_triggers(/datum/artifact_trigger/proc/on_fluid_act, fluids) + +// Premade subtypes for mapping or testing. +/obj/structure/artifact/dnascramble + my_effect = /datum/artifact_effect/dnaswitch diff --git a/code/modules/xenoarcheaology/artifacts/effects/dnaswitch.dm b/code/modules/xenoarcheaology/artifacts/effects/dnaswitch.dm index 7eb65adf44c..5e40c17a0eb 100644 --- a/code/modules/xenoarcheaology/artifacts/effects/dnaswitch.dm +++ b/code/modules/xenoarcheaology/artifacts/effects/dnaswitch.dm @@ -1,4 +1,3 @@ -//todo /datum/artifact_effect/dnaswitch name = "dnaswitch" origin_type = EFFECT_ORGANIC @@ -39,13 +38,24 @@ mess_dna(H, 25, 75, 75) return 1 +// Swapped to radiation pending readding of mutations. /datum/artifact_effect/dnaswitch/proc/mess_dna(mob/living/carbon/human/H, scramble_prob, UI_scramble_prob, message_prob) var/weakness = GetAnomalySusceptibility(H) - if(prob(weakness * 100)) + if(prob(weakness * 100) && H.has_genetic_information()) if(prob(message_prob)) to_chat(H, "[pick(feels)]") - if(scramble_prob) + if(prob(scramble_prob) ) if(prob(UI_scramble_prob)) - scramble(1, H, weakness * severity) - else - scramble(0, H, weakness * severity) \ No newline at end of file + H.set_unique_enzymes(num2text(random_id(/mob, 1000000, 9999999))) + var/gene_scramble_prob = weakness * severity + if(prob(gene_scramble_prob)) + H.randomize_gender() + if(prob(gene_scramble_prob)) + H.randomize_skin_tone() + if(prob(gene_scramble_prob)) + H.randomize_skin_color() + if(prob(gene_scramble_prob)) + H.randomize_eye_color() + if(prob(gene_scramble_prob)) + var/decl/genetic_condition/condition = pick(decls_repository.get_decls_of_type_unassociated(/decl/genetic_condition)) + H.add_genetic_condition(condition.type) diff --git a/icons/effects/genetics.dmi b/icons/effects/genetics.dmi index 8e31fea961352fadc8b5a58f920e72b08e3668e1..8ec52b23f58ec1da67fedaaeffb58941766601b6 100644 GIT binary patch literal 1351 zcmV-N1-SZ&P)V=-0C=1w$FT~7Fc1dd`R*xxbd}Pm>n%ko8T1uOAZK&XDkP!Ox9`wz`&!)Q zyI(OaoclV~Aby||$N000DjNklt9NmWs zuk#j90q(;ELeq3OE)%Im zi~5!x(E6+Zlu~BV04?iVc+k)%2Y_;m(QE*3{a(pg02r+hYK<|-0iYb1=0M0>pNf_T ztzd};ft}KD?)a5)Z`y)Fd9!7~c93$Z243HUog@?`p0>Z~Z8+RsxZq^SZO|U7#sJ=PZg2e_$U$ImG62EJ z00buk5S-i*1jMQ^1o?ZpBM8Ji^|aU#WWFab>6fQ`KR|5c<>Ak7Kjqoq@Al={4e5J$ zK@h%T5N0t3@X)8Cc?Z%8;QqrPX8(ge3Euir zA0EJG0n&p;odj=vt`F~Npv1#=b#P_kYa7E`KMFYw49;o*Q2m|sD)iQmM7|#&IN1dR zC*KbMrpu+^q+c=s!C4K!+OngxK3}pl>a8#3U;Vz~!yxn^x40#2x%Z6H2mNQTvLU?n z*SwTGXa`QiL$M2(lQ(>xc~1X+r?w%y_1C-sv*4fdnX5h z!N~vwCj$_i3_x&lM-URD!Vo06BM5}{oTGqGlprubM4cif~G0=;?rUy;^{e>W+xYR)F`n{9u0ASD|{c6tr7y#-6-8DAT5&8A(GPFASKsO3#qTLsbc3my$XWy)k zL_ZmniDbp+s{6um*s}0@vnmZ5$)D8;KI7MMJdCUld!B1rP5W$`ZyVbAL?7E`N49mV z*%e!NM1!jOxe))5{LzNF9A?;EQF_)}IYwe%#?x;!BPM4Gy*2_oU85P_(9Gh+9@Wu1@A%2EvuP@6dt!O+(&7^8W4;>fe zxAqAevGwRE5tdB7ZLyasY2rN&9pO;h+#r++uP%8kR(Ki+!~jy3lh*OcIp_-Vcrx$F zcCCA%SwJJ1&A|Ws?TED~wKkoVTC}V$GZz0R7LvmSy_c660<^E|(v`6qT!$^|(mMk2aB587oE3FpVrbi5m@_2GlVXcW-*D zI9nZPYPwp!S9A3Zr}H>RG>+F}J^-;dce~bgymp(C%&sZ(-@>f}reR=wDD~8gI0pY} z`>@cB5u1Mz2x>&YeNX77`iB~IcwkenE4=K=RR{`kU++A*KW6z)6(PPWKQt)tukHo{ zIr&lHo|S&<1(==)f)zNLeuAmO<=B&bb>%4T2XX1vr2lBjf#MN**Yo#fyDw`^ z?(+}YqEs$KKbgG2Uplf>xL13_fg>rW{+UaT}Z<Z+M5Kd5~_XL_3T!PtA?(@1L)A85tHPf3YJ;}}x4>fu-Zccoo@^?Tq4 zsYw6*bwW@FB(1!0==-oaSbAARrxGdl8PkE=ss`pfL*~?D zg|@fBf_TCSK@D~WDSMzK3meS)r5Xe?}!r7$2XU6G7v=!q$!x%iM0w?BI@G=K8dE(Hbl-DDUo}Y_SJ`G_73y-It{{2)1 z@AhVi-j_gTjxI(q~qEJyd|Llh@{{+^vQ zU%WSJ^pE~Z;1uFan%1twZTO`7=9x^A%+r|=pTN=ZR8A{=w@QDPoA9DSjOC#2#BI9* z(VAl)%)?#j8;Q{*Ps|!;^lS^=24j8Y)lbM8-xw&1UYTcb6>&3z5C4|`%D3$} zUdFe5np_4SWj6tfXes)1F~5F=6z}fUYJKvu7Wg)kz*nG&T?2Wt&N}yF+s;fkuRCkt z*CvT=4C|{@9*Y)(KHveUgLY%W;i|Qql0)2xDLM<(9coqzwq}yml z+)O`)wQ%beo~chR)|YK)(zo&oc`GTL|DRr%mZpAgsS$EVvy+Et?HEo{gi@iHC+eRW z;l0Lw#818y2_(z9y^LP3?vmLO4&@*O6(GCEZVNZOW(@l}rH^K_T?m1*u*$PTOYlho z4KKJk5{dUqf3;KDp(3#Aua;(n(MYFYfhL3U=^}Mqan3N?^j-J&2c7EMw>}t~3)6+( zOXjgiId-;s$kz*z3_|@;9GNXwrpX17+lnel593`O%PthGVglm-a;41qN5f5vQZ4o^`3Yw^^ z=?<9xbXqIkOVW{ztiYkQb9-g_9(7eVDufe7%HUV8MrP;49G4rpG&fc=O#5 z2=c@B_|D&RFtXH`We$AY$>Hm2urI!=zw$*BzE_3f*t(~N6Ej>tuq9mZxV#nB2f7uA zyx(s&mT=FlhCbz_Y<*2lR*-zU3--kW-;9i+w!_|R+FU{WCfS7QNQijOdRo#CqYlNuL;++Avz%ES1&A@S?uRg-VGan6 zLh*Cfz=n-ta>GIPK4G@rO&`U7N*nCT)@Gym@13d&B8#t5M+c~7PH>@_CUJML{Xr>{ zDTlS>JJ=&+O2&ENyfnr$_uubq_wtQOtUB$>BaRk^N9#qgOXe6945~%9MsADaKd=jP2=MK8`=mOqgAzIpSM#Hy;N! z6q|Iq8*@|V-OHwI$TKKp39@8!9SPcpKfzq9A?Npd~>(y*~K4`qamG-KO$$_9)_pF%xdPP|}s zs|oA_-N0co2JCo#CG2wfa#j7M&1ERrif^qmVW9Ezw9lp1(i2ysfWJV?Y6O@+e=yOU zx|JTs1mu2y8kZ`ZFpN~TWJTIR>0pdm5ck|@Coye zx{OSJF**b-5{ZXjZHX~XJm^1|+;oQ8A0FQgBUVfHEnh(W;rjO3s}*eLc1l$z)se#P z?tWF``iAagG6b;mg&UK&_zHj3kYY8)+_UEQ@849vE4HL`{U+rEd%ew+U(K*0eI@yx zG>9;gSJnXp;@0KNJ-_}l_#9cnxAr_Ift~8*fgM`*A6vahjlS8~M>jdiAYJw?Wm2ch zMgSIO7~&i+FKZ{`Z?MTv;rLFYCnF9@kLsw%!MDy)Sx%sv9Mj-DX4E-6L_cw*c1le; z_R4}OJ6IrHv4AUb+JvsRSE>4r29EyYkv!%z#KHdK5Q*Qa^dDE%z$5Bq#6hnIF0S+i zYKs$a<{{=&o5bX8`@c&EjQt(xn$-9onnyp{#OLvYNS{urRp27D?^FhA%qt;Wd^1KcmZzpL=uerIJVDW(|2_YHrtQ- zk=QO_XVl3jp^MH#YU1xjEuP2-a`oYySO3odG<}7l-Z1~dNPC80xC}9x8vmT^zOX$F zcdwxtW0pZ!kpCYZ(7ffqYUp`NWJFQh2&=BB|a#B}2^|`LJQddJ!nSEm6NaIuJT^+qIT^c9 z-jRGf{^p`2JCGUak1}I8$elJ;$DdalvFjaQ<~C~D^;d+GKyC}KVEnml{R*|{Dnwz| zTruc9M#oyq;48&}cmL@X942Vt&b3foxwH!Kb^Bblp*?^I`s}gm;YzE>10@L|dg;qt z@(BRrc%q^2#c)vthWL0mw?L|CWPR}6_aAzSKRRz)Yp$ux5lR7jH3j$icQsCZ*}^+} zb`E~ApLwTH=MpRxaC-I&u(;pR{NKKni`Dx}_zLH3g$cry#xF8iSH9}FHIK4g%|+PM zdU;v~Fvb@$KxPH^F|lVTGnv4VHtj;o$8&LvM)Ic>@KQzios}$?u;{e5Y1szsRuxzvDbV{S*>k09c9C(2)!e>&dLb?3O!NX zSOEGte0Ma^<|%3TEdPrp=*kg*K>OV0AM=GM{&sQVDbM3(1C`Kp3KX%;pm&LI4X~bn zoaQ?vcUeMtOvmYjZzUXX{5t?x=&tq1jQx7Lr|iGaTtGWjgT< zex>;Vqm%uOBo(rP*hfCUqbURWCN^wka_UD`mH-QJ2?z3PQ-Oso3L#4ATTcLQ0+3#w z*H_+KvNaewsO-qdA~s>i>|u_Jmc6;)t!d3{*|t4s6!~-fY!3S@y}jOrbn=#xohHz> z?ben@&UzdEE?k(IxU)RWte1wn~r(34wDppW-l{O=_bfO{a=E?>uIUOvVsx zMdSg;d46k0tHPxcSE>UPdj>Yp0Cc-&xr1!bV_^@Y&v zY>na*$!#@Z55SBR*|8>xOP1@78&rX@3CirbmjDd_YjG3Fo#A4SXq(B$`KU3B>T+I{ zBwS2v8&eXIb_^gZ4U@49mmL5|SgepvlQNlC)-+vgCCD#~3w9TSSd!_+>!m_^F14+gPy&`^J&XwXX&RjUOM?YrDlZV#M9|fXrioV=crK4bwtH zX)(7yOFbohw79gORbl_|fSMolLFUJi$y?#q9YSZpqz-3SsJ$;hBT-I?g5_cur*dak zO#jbw*tezgE+rqT!_{afK1Z!q?P(#r1-+fdL1MuU1wU5Z#uoC;s`uPuHIrt_6HU&a zo;yDIbYVQthT@G4Kw34)+x9#vs;!YS@^Qwe`^w3Pbl z9BkA-KhTlMpLxz&Kv2HDLcj?3-9@k~{zitPy9tIDIgPNu=?Q zZ~EffMgpMmkV;ln74_AX%yjtCy$z4tB=$K~M^>xzgU`*+HQo&8u*8YL%kned+Ybd3 zkqjI9X}FKScxR?f$_7&a>;p+R`@?yq*|AoU>X(|;K2Xbj3c*ZdnEqZLHZe)9znie#ia!e8MQ6+KKW|j=Lq)mN@zWw;huerKsvw_dK9{V4Ynh#?BNaY*xHjHWMp5eL0Z2t5B-IAc5G~k@srX zn+9Nk2QHw!Q!PkNcqj$~3FzGa9J3o}MjEn9eomjMQhn^V-*4dk$z_4W3tjU-Ts@`{ zSH|7+&L_s*ke#o$$F2U7OY5!vwUg7-Cu`PXO@hmnj3@dUWZ_;?>_hRf^}7c z_1_7yT4ltC!_by{ACN(#xQQ_H21Yxa8?)t8_(&^3AZSvInrs^Lj{Sq+uG9l38~|@U#!@O0P-z#Zq2Sj~_2GsI9@p zX|%>oKA1S-%~S9rPR2f)SNoDLGD2hZyd&iT+e6O>lHd|KTF-8FxK`+8s6h(!0T`CH zSRC#sHJD0>JP? z;ZR~?D*Ytyh34lONhDF^)0P{%i|7-XKn3uzT>H7owtRuNK;(>0#a|PK(t?C78Z0;9 zluHt-W-dG(zM=0o3^k+9YvSX}gp`L4)kRC`5Q|=Cgz*;#7eSZtUjkbcNe-OkOdHZ( zs+%H=Xhmi(e?}7gKm$4w75dKCtClc>qCAp;rTt2-C8V5}S5ljJ4*4*_$P?V*=y&k+ z7e=&C&!il_=`c4YRArEcI=)7l$V(^tSy~vE4<1T~G4u#O$w}3GQR5~f$iuJ(TlA_6 z;RgmTN1ZexGGwY`#ns(2C%?Miku_r9h3E%exav0@pwBcI;Hmob+H-~V*P58i4dcB|rYvM^S% zXONp1EO>_#>479tvSl=s2A*oAA2Tsr)GmFwHAmFh&PpbRO%&$-B(J<*MecoWo-GL4 z2zRIiJ~-u&?eqHHJyxdmtNUm&Xv9(e6?}4GH(fbXL>lGuPGn8YcniGe-Bg`kKLwIB zDX?AP;hGZe9ckB63wos-Tura3aSN^#VVS7iz7yK>D{6IAU+;JAOM^byV3;qRm@-}= z?)4?B1RcU=B;Vi6+aG48-wTeQ7PLefMDL~u)g3P64g>RaWX0S`_S=ew=@xXxNYiNXEaw$hW#k(E|=;NkAu)| z_o85_*8BcNGVIHM0^^EZqFOB_J*i&8bGmX&#z{Zi2%^MdAE;b!Y$q4XMH3NmVnHIY z_)==1^|5_|YW{MFZN46clRi%FI>1J4bMh9)A1>ceL1SCKolo36xd}NRn2w&6^n$&m zw6IZ(JQv|pN=ThhfEZuI1Zd{}Is5{QZ^8Ss4$+f+x8s^5Qpdw$f~>mg%7xaJ#`cci z2RqzTb`YTK>=Qcirs+3IRbC`#an626*h@WP*ZIJh*Q1S6O(^xUkm5Cg z-yxT#Ay*nQwl2TVE2kp&^3|M0^$iv%(Xu(hJ}QH`fA-#h=Z2E1Mq{uF<{NU;ljA{+ z;59-jVeQq6;{N)}|N$(UO?OxiK-1i0jiv?kvrH&V9qb zFmZyux_=idK{Yy|6OLi^8braB?W|qtRvaWHc$_ue*EuKI;i<0@z{SF4OQgl{O>yIm zO3pH5OHYC;Y*uz3xs(cdG)tr zG8+=)Y|H1(A=g&m+ZP2R>aEMC1;o2$OX!J~Aax3Mh{Qavblol%`nONU^-)GnadUp?a`Nnt9CGNU@ZQ$6kc@aj78$%Jm+v99wN#e>vgz!5!*-%r zQ!ioo9-A>43PI1D=ml#l~;ZnABhrr)irXItL+$cK2E`-pd}7L8y+)!V!myXk-VdW?=5fc70+wGModR(Pf0dvLh0-S4_;2!+ z(3&wLF*Cy-UKeqTVRNDjfo04@x_cfWFxY~jV%K=8 z&Y1>5D@8$Bw~|CZA5(nI*kwmEe^6zHq_)$?ucdpAAX3z4C8g>DFIeW?M2ed`9b*Bd zT_uFbmeg+QD)YJ;#6wumXOD`EJ=vkzCC>$*$lo6Yx&9`45~lOGVhC%=pN+3<8>h>l zIjty$B_h=u5u{!vuZ>YE?G{zvo`JF;AEHq#q;C|-r?Ym=wauya`%A%3H^0!vE?&(Y ze?N?bZgn6u#9)U~F81yND4QxMNq+GwE`S~|G8t%789myDE;)Oml<=iJfr>XCWmao; z&b{dnRYz8#q0kiWHT#QIDIl0L&jB0ndDPr@!UK!ll6#a3#~`mEP5r20RRl8}nuFL% z!u02ZE{Cj4_DT=TK{e^Zyi9t%o)1@Av=W})WiqLJFdBVcjregX;%K={#c%)%TMaPO zK&H`#M1Se|pIiWWnpHU%vJqZ48c;@VP&+XG^1vj_Y_zrI?QuOV_5NQ+4{M*WNbKN6 ztZITj4K|^JkMX~Yn8^f<#&>Q%wTNO1IS@)W-4idWAV|xCxEDgc>;*5&KSDcELtfG? z7aBqhZu1ny-74=woC_oV}k>Z9p)ujk5-*Z zv_m&lBOj7s#hFhTFi@IPe=HwN7r5t2+}6siS9!lkF2z9Wn3A;FeE+(Rs<}T_^4U2= zy=_DfYR8xA{1bdo^4uGaE<}=Z6ADZ4)sV5LeExzjoAHm=Pmtb3`#jdKu&sqcV)*p6 zqFI#f&HUWV;_)hb7L-l(I~vW5rT3(Tqq%_Zc@=+c{dm%A#I9mB zP6W61QE-H(h4)-3^i~^VLJEvRQpxyAN385m z7uz0I6=6GlM=z0H$35+muL-2VhxkRVMa+jnTFnlR!SbX>w zB08|)mnU$RSUqRgLG!Hc=I2M!k3yJ^u;36*oW@Znsjknzl3!Wi_yI7O+l>3YI>J62 z&>cw=WDY9)A5qv*4CnCcs`stuGS^fX*EISaW+ibuElra_U+-~H_b&CsonKANZ8OjM zjB|05%*iq$^}zN>ph^#c_RY8ZT-cDV^E|#P({{h=l_$g%KIf%{LIKKCcqJz9R=3B- zHri~u@7<=n{2)$;>Kqh`8|^*slF_+0R4flS-^Vm?b*c@~l97DlV0Pu(c`1wFtV z(!z`zs^+l;T34eAQv)`n+P`gzRxrPr#a@tT*bG^~FYLT>& zo~qTk%MOU=w~2Y9s$npr+5S;{-9m&)!y^yxBY{;f32vPk-TqyQ@pO@!k*PI7xR)9j?vm` zzLjSmZtWwi4Et2B4meB#AwgiMF<=C7|C@4a-?t#9`H--%=-QiY=$3+rFYK%Sd=g;m zu|5`qtsCCl&Kv=8pe*R^6ebv|>Vu}-L&9UpJ^m;-M&eO0?LVXMY0$w?m|cCm$a^hr z6ptML-Ur(++}l1g_~)Qm4MA|33z;OyE8)QoEW4|}2AY1NLK&weQw8O+nY+>4rMME@ zr`=P^gJ_?cThQF4@on%JF|F6vr%yDXbzg|PdSv-eIiF}t;NQ>PQ!0RHIm~TwXKvN#LN9pJBa;>r03pXcKuuPTw{;sA<9`y zNvJT*owCs7Y^{0?CYM)i{6ex=;!3fJhZ#1AyODx(1Vycnmg zis@_#)n`b6z*d75X>#rZ>0UP9#t8pmST99(Jwk^WcN_bxVhV%JHvu;;Q#MG#u78u(4n?SOTI&^YylQ6GYEPRMfyiR2B%PXIjR0;DIBE`zDf5;8t zJdnc+pQNT8p(a^TGlMXIN(pUemBo~^eY(d|GbSPp;vnW@(3?9Mk>$87_2b8n7Styj zE7D!GJUg$5?Haos3_^Y}L7el2n}e6BhPvto@6y0oQ#AwgHG+Rz?`9wIad&%FJp)c_ zA#BjP!`kTp+F1RiRinzl>s6gt-CKI2z%?qaIlUHn`s`uvO4l#*|2$(XdUTO5v(>%6 z53WDfdt1DKfAoyOW|q1h%@gVR0<$pl)9NJZWnbLl7xKM_L2Bp3jGJW;z{nfWk9J&o z2}`oYDucozVe9Un*aDcWg@9f`>JUkrjF{mnU}_EkMmGK zN1+vIABK%gmo-Ll{Mdu?*%ionC(CTu-&)dRi9aS*0uer&Ql~!3^jZd+%Dp z5DtMEfAS4_=`z^U_1813{paC1IC~QvIB%>2#C9_kS}nBN_VYaK>mBD4-M%6)t-j^^ zQ{UR!?PmY|=H=nkj=3d^>Q{eSkX_%xq3Qk|E!^{0uW$fCalnaenns%G^uc5Ui(6jq z`tg#Nix%LU^&MwWOeKFXhHKI~IiZmLdh(Rg9x9g03Hi9H@Pg?zE^7n6jc?}LxtzXh zjgFDSR)D0yzTX;Q(~wYIntmk$LV$D41Ac9sw(n>5V;;x(1UJb)?)Dtr%)t?V;W$SO z46Vf!(4MwM9H+Y9@&Iz-$vI8I?%6g9(9OI^d|{P7acfzrn*-*|mVd5|X{oFP6t|H4 zXChuOdE@TU0hS?|CnOIAly=40fbPK4WZ6Yv99%rL?K4tVg2x%T5$^9h+WOI!1x59t zuRycb;r;e`qeit^TGO5dssEgsgldcRcI+5YPD1Tx*cdc9Ag+}&<=+X_M{f+uc)Ihn z&OfUj$E5g{?Qbe3+-O~y&Zdx#`mm7! z?@fLxWSY8`)nV-;H)ViJs%x{y*#3frA>Q{?jgoBWeC&uS+{Fgf9}Qm)S*qtqq|N9) zf9vj*;otfkB)A`nN3Pp zIp%NEb!STdx0{$c)v2V!XroRfRbscGJ$7rN*?$357l?KDQL? z&6n3ckp1_iqJI@<&}oVf{NNbt$5jXfCRTw&%t=c5(?7UFW2@g{pEMYtKDnJLrarnh zyg($!J0ykcQ+84Z88rmQ|M;nKy!<90=p<)BnqNZ5>t?-e?>4~r2Z7WagfQ|D4Gi@* zLf%#f1usaP7)yX+<5(-veK;A@K=TscHdg7&^L%!xELohAj{T0m<=vhB=}A6LNIT&S zN&ge?h|0Ec(650O8Yw-gk!G6hQ<%v8I$*u^PU9d5d{O(lL$AnRirqZTqx!gQL}=)0 zro#I<%>1`p0>5f^nFa!v8CjOavN4NN`;%V3go8$WE2d0iwZT=j%Xr37;HI#HQghY) z#H7o3+);pLOYZz(<<0+At_G}}zK(rayNm?ak@!Qhvutp+YbnC)_eP{CdBIz#765kt!E?0A`+=NA!OqA%j0^GCBb$|>3XD23Z+1EK7xq)KB zyOsmQ5itA&zR!6`(*Y}s9@`V+9t}+Cys-Ra=}30CC@YFtfD|k{gdN2c?_o@oyPM!G zVYCUHa?-2kwe~yO>5|3kC3ffb+oiCs_y~!M%KXyeKq=Q?YQwOws0`eyV*gbHSc)uKe(7#{(w3LW7tB5Gc?8^V%23Ixy?Q z%@_D&{N^Gld^N#Uw_BLyAkDuL22ZM+C1q?NQZXea0|ETeMT>e?=Xmnx=f%9E+cfh- zN_7#V5vw+z(sy!L^@wYHxG^i_o4*8$(|oPmP-oQlDFlByrqO|`JG1b9neA1-3H5hO zal(I5A*U(csFpK?7qF{fK@yjAV7M;U4d_iHbU10_jmw;-#*yMEV)a%eS1L2`oAI)z zn`Djr6_~{W2PaC@2ddx#6*YU9s@R*8XrOO8I|e%i_k^I27+wo+de$H6&e>3m;C9b7 ziurZ1fO*a~`nqtS#545S3^&e(vXNCEMTAEg{2VNZ>t*2H7p;wPobuE#y^r0rndfAh ztFP}6=rNdRt~nD;LvrDo+8qp!Lz-2LdVup4JP}P=9J}aj3ao_X8oo6%2J6DdO^eN{ zx8LMe+g=-S}7E+cL8y{~I@r%@k-#SW2=;Awqhcy21`h3%$nnj6qa zcl7(|RcGdP0;@@fqwehUBQlb-5{`dyGlsjR=5L&ucQv}rFwvlSP5?6lr4qeJ`MX)S z0ZC0d#E^yi-zi|45lq*hg+58k_27m0>eOU6B#%SA%^YG`HaKx^@!K$gaLen@dPVQ5 z?JsW2c!LzE`irwX@u#}{ubw_D3%qzSvXC6V=lCg2Q0@wrn^>ElTI~U^HQe%}1Z}I` zYx2Ol@PhX}lpYpQhvE3NjYod>Qp~e~ie#=9+CauS>He0D3uhl@npTAVL~%8mZRI1} z3a8cVevi?F>nonofA|E8PwCUj6i?xp(PWiaJF7>=awbNtX=TpnRp30QH>@%b2mGHj zeXCTdBv-rYVby<|W)Mc#|NRR7 zVnUJdZ|~ADCdNQ%U8OOw6f$g1mcuVg^Cem6H1V$85Tbc`Ulb-t#=FEiF z1WxRT^|VklX}_s4{PR{jPBhjZ<=w-bXo}P@&^&(;>g{w;=3Merw^rNrLTKr1ez^J7 zB0kPV2ct+g#Rpn;QpV-g1bc1F(Ec&1Julgh4UOKiNfZFX$!QBv&#dOTDtnRcw-TfH zy~W_OLkKZhm^sF|OIrNn$se3DjnZASNRhOzUj>j~s4nT@x!?1$4SSfB7b-pfynQSD zo&NBzDe0mRkKXiF;Pg8Pbx}7sTz2#_IQ7=TEi=csMPd58EKP? ze_SFT0}pUl9*X&71I8128Zq@CzC2OS7~!$R2fdYGKx-cr{Kwk5j4-dV8zL;^Wt8;q zj)aGQ_|9g*1X+#I?GyKLIcQ?B1c*e00GUcl8C+*ddG=)$EHu zPEt6$zpnez67Le_`rB!{YqQbYwEOiXLZ-LMN*>gacOVM~0bL;XAKehH7ugctY=c4l z0wUfLYrNa4&9At+l{EFYj9us&)v7M63OqEVM>N1B)O693ft+`u9x$j z)4s1^s)M&l&`x@6cAZB06{EhS;9BV%QD4}T;16l@x_F5QhTD~(AI>XCuWgpj0U%J5 z3V$IF1n+?G7zYcNk~w!_&J=%8>5%y2=u~?2U$QCw6e=>GlFG{_?$icWJ##2F-8Lg6 zNa)47Tw{LWr6m{)N5;py8aAm(9gLqQ;akuLhp|i?<)BM082T^`y8>RcCG0=Zc@nRQ zc=JuMfZ!bv%KU}wco$O@&dSKR@i>sw!r%X{(m0rBJNQEkyXM;RPEPpM!!eYC9zXbZ z^r7ogI=z6;MBs$gs`9QTJh}vkLjw8RUg#^)PX7>%TUdZGh-t-kn?;Z4!R=PPN;i0N z$=~-3W1~D&OD72bC)p!cLTjF%QXEMTFb_JuRQksKp-TBA=-d_Wed$ zPxtk;&$8T3nUfSdxbV=j9Hi1nE*GKmXprpJv)4b-o?(!K+7@w9WjP~Wu}D|m<>1P3 zTt7AHy0dBswZO<5Z7t&0ein5#5{2r*&xQ%TK-nr?H3m)_(9|e{gFnF^Rchi}!UvMs zCkB50B+NVO#l6rLDlq+?XEw4uSDX4k68$x_6{6o+XrHpQfT~uqaJ2Y6oAt_h6?A!wpVIG=DO36rgP|MNucn?h9F1*bUnr)QD*aht|9%$p!VJt}(4nR$Dh?TD}|X z?LKajBZ?e9m*NwCqqy2rF@7BNMa<|pT zbWgqs#PDOe*l`~}!OudRE@d(ef+cHm?-0pf#x}^+d%TF$`}CAZ(oWEl{EdG)5cHv* z%g}TcOMk_mcZnZBJ&Jm2Ai%v2I4ApXW*e7&L1QD_WU3PZ;e7OvLO`xf#^r!+T92sT zo%b^}wVoyBXHW*zQ6H_IH4#MtsRcu+eil=Vu=5s5<1tP}1qo)X{aZdDIL=`w@U>K> z^py}yB)euth3wj((?G_hJ+#Jh_8{IDMA@B>D)bV31RU7|l6(Ks zhu|gF`ug*2mL+uOK(~SNW~Z9!zXIHBTz^AyY->732;nD6I{riK*o__){^(rs`Trl-~h}MBsYF~txA)R~Q zs#%PE1HXzzfn`X68j!kj_1F_3ilw*gIETh`60&O;KpA56pGZ0TaGH4>gJunT zlKfd&mcm$iX0aMD0V2$Mi#MF8xWWDk{e785ROsZidQ+0rKl*eWFEVhN5@l`V^0l^N z)hWt*2CWA@yH-vt*rs<2c5_jwppOIsBHDGn*pqUOthJN>+#)@aWPC($w> zKnJ}FHY_6;)}(OGgS#vIl5tb7>aR>gXugSoNAAZTR`R6$CAW3Q@*`y)?3Z0i@COX& zGWClZJ$Nln+NKN-6sw{|6K0?i&1l}xV+coD`8~!{Fd`Dnxgb9KhC{1S{@v2q+j!n! z3jNV_>zr!BS1v}z_dJEfhOc=Kl30Jv-Q=+|^?$4OZ|KQxixDHPe2xp?HGrK(9;Cm# zg3gvLClK^^lCz2q43xVNkQ&yI7;YTF>d_5kmQ&Pu!P!p!4;LmR*hc~g!JZJ}h2FM{ z+wJz-@>dSW%=eFW8e}J*vI&@lO?&%WX-{*|l_ePSryRDnsbVrd-`QFOogr!i7n)bd zk3;_%)b@mguev(^rWWv=1=T{0uU2M3zi6fwKqox{^uSv#dahz%!w2^=)_-wKf*aa@ zP4R>il>cO$v9S0{jXL(seR84m)ysW!d3AfbET;VbCli6Elph@8hfRegg6j{Hcg$F2 zw|D(9TNFMAIUblZp3l15iHyD;+`Ch^q4|0b4?@2CbLOrAsnmVQL`j6{N8h)3N&k+w zBZfSdoB8~NThc;T;vs{G`=B-1za34Q9Q5}`{qeZeRQ>4Nx`h=uEA+lQlvT&zg#DeB|DBxeOy*iLF;XvcrSqm znUu*dcQ{P+s0EkZlt4yNTmjx37RW z`SYOC$nyabV2!?C`O+S+PXKM`R{9I-&|u$`7gijLiU*{7MGyv_(I~u)o}Hf|!hQ3OaJ1FP6%Ed%*$!1A{I_ zuq%O7BAtkhS&G*;KOL{g_@o>yfOwc(gf1XKcFgFBgix4Q;~!O)UL;c9Ju=vz}k~IeBf6z```!Wc3LB z3PsuTg{zpsm~-1t09a%;igpA{}HK_YZ*0wkG7;;+dxa{{*Lg3*s^CG2KVoK_mK{7p%sC zZGhd%N$<*Plj>S7jY|}Q$Vn&MoV?`M0hKJ`QW#byXZrH6adC|46;L0p&$1tg+a8Pe z>0*xY{Wopgoi?Z@H6=4dt}8#>LPB+q62bz{igzW z+RkSOMg0!#*?<~~<#87$KS^4uyz^udIl2|@mA^$hy~ku%cQ*6xwfKGFef`z42C^oH zN{96{ z*UxitW%)hGD)0)|71K-ap5D)#B$LeTfDsY&s#Syw^TQ>9*8jih;t+n%QEN%*#c zX9XWhTn6r*ObllvX}t$%Molq{P~jUjpt2U?W`j6!$c-98-4$f}CM9c`3$x>b^d32H z|GDp4W`KM}gS}mTeovzDzyBA&uP9jX$+_!}Iac-_q^BjJ_D0ctb;zq)5YP>OpHtsh z;l4?;+0wJj738p2vue6FQ`&n`1Rxj=HZFjD$btinpBYL6@L<4ZfMvx{Rw5Uxvyz~H zWFGV@?`e@!f-_4Ys>s+~M^2T+r5bV8XCMu@Yu<@F7@Nr!T1Qbkf72?UT`>ig1#l~% zO=t#yAo)!h71k@8-yR?BBTyNaP!k{H>AJY*>X95FM4 z^mp2R&nl=Z1Ct9`re4sMo$IIRuH;rrt>f2~v5`Y|B@&Z+9Btr3bP0eAO_N-QLun^A zNztMr)B@B6qn>l{P9!d%CwtfSf%{8ldoIATCTK`VbtMXrv@8wfWn+*{x#!W?uTjuL zQk1HE_b*znxQ#Oj;^v&>F>UbwKa9O)SX6KLE;@8~cPStt9nvKr9STU7fV9#QLw8Cl z4bt6`Lx&)#fOK~^12c0LzkUAuoNIsDUvOMpGxM%zJ#pXn^Sm!4v1E?^^g%c1*5Y2$ zAO()nPf9bZN!SO$+TLo&n=~Oi3z^?%)Nn#u$Q+vjMvz&(+!>4iq_VlARKT@E&zFIs znJbJB0=Vw_!MB3@j;ZzQyP<tvnQGcuj0}9(x)bAbQ5n}m$!pTyja8vHcqU*l!}L4a|V91 zls}!(eSRsCH^Cg<9Hy01#VGnV4!x;Zy-5yVPgM?ykY0OA(pY?rB0~_Br;6aPNl>OG z0BPnL_m5$q=`XKfz&=~WoRRTons{PQGhMgy_;Jt8c-9mVU(-4c;Zu1|j4JI=+s+8; zK+`_t=3c18MH`~%#J(GcpSqC==9MncCZ0&~^c0SKw(z+nDreQ2k@?Wf3oLvLdlW9L z&rv~kYPmpB2IdXPK#pV{{=|8 zhW6#5JsH6%e3$^Ecp^IkG0&fCZrNBh^hCGDsBj zA`-6*lUh1jFwR88*+bY`{nI|R-c)iay~!9#-K~Lt-HqpzIJH6=6QHAJBxcXr7D)UL zt0Lz)xRn6L$9i#Pq+4r;g|K~qbx`~I51fTY&O)SEPBTqzi=JcEQ+NE4zHkP~ln0@y zO|U$?uhBlx8xs=w+*jxDxr2!IE$?k?4oWAW3XPO~{TOx87)2pa729E1Sbnz8uM%+Y{t2^iY>5r_Hct|)&C1%->C6VX%`qki!~ zU^IuRd3ET*Mm6=#DJpl!sP`H2l3jblkhbiv+Rps_cX4!(@!BfJsr@GHuNJpS(2ON@ z`>&#q(~3DWUTMof)ritHN!=Y{lAKBc1qo9HzPB>wcD_Z=J2m{H;;QqiFyFh(@#PU` zAe`~p+h@Ym)>%_(F>F9;I~PA$*{4#j9XW zLCo8J(ktqkqf1I^?cb-34Vs)IYzm5hsBsj&Rpn*P*mEW7v{(`ocYEc|%jxh)+cgCO z`p|1o(W}!dh+s)RX2uKl%CW~rubzk>VA3Up8jZ40I$#=f9^)qiVh=uJuu%fXbHr(# zmS#2shJJu?)@r|0HZbBxYw_ze(^ES_fbjr`_S#1AB`)t>%04)*8Zeug2GnfBjJN_cID$+L?F_tfPMDTw`Id2dkrGLCh3 z^?EIMu?mR<%Lp=~hl0E0?-(%)kle?&BkuC6warE?%_JP;xZ5nSH8dc@eRnMfbl-nG zwZEJlF=LQ1{mY%j2ztheN$KGF??+DIQIVf`A`P!-DTTBa?r6en&?uFEM3$aOPn5_6wV{);X#RHr z2q3Kp=TiWNYKxT}RrlZOR9r)PV1kPK7e}U?i&PlT>fiVtd0YrUWnfEfXt5gCZP97Z z(aaZX>YN17KQx;-o`q0gn|CS#dDVxNktMg%yvJ2n2&z$$_aL{u)28^AOI?4g2va5( z3#y&|tp#2Nik|txp<}JZH$nlDO9OR0x(^6z@(-a-NwhfUe;`J`lD$88i&F9$ z+*5L=PCq&u=6?7po^>Lvsh>diI4S+zx+r!#0susnbvUY!-`_P6c3Qb{6Iz1TdZ6Rh z0jOe#vSzAzQ9AS0NS=`Qki*kJ@{LaG%fURbU}TuUYv%#8VHA{Z+DAL5MH9PIEL)>?lOgbX+X#T3xGJHy#p}#zQ2h$< zlBc{OzThR(wtxxKAXHXhZZ8)Q5x|cd^a>I0xV8mD!{2ckb1_+Vh|I`*rY3iTes>Tn zkwr@!`M9UP=Tra53NKPD7_Z-6>3;sb{kXwpoC|KApb6hQ7+>ySRj3W@Ja=+f=^)O{e?q42PMor(6?oBmYPhGj-&i))| zx5OrYnHsjWGEHC0akXTngQBNx`0x9qA!?wBmHm!}LlZQCVyy~HO?}9)$VSiswP>(I zBC4Z+Dmi^Hi3ai3OUC{gAO=$T9<}yVJ6|Lk(rvyYuGsS7byP_@bSOBWp>>R3mk;G6 zEf!NhT8#S{r;J7)m(sj&su%$=D+6qGB!!YXhM|lFJz}qT*ql@703OIcsDN(f_xg zHZDi3!6n6Ms6G3??&{zTv6d=H@LenucWh^(p83`u5cn%!=v#iant2)Y` z06@UTji9;%1{13hN-I*(rJ}X}6eGPS%oV?u4$*ND{sy*L2zGkkEmC=0jTQb8Lt`X; zX+#i{W6~Cww~6N061i&)`r8C0PyW*1b>oc7EN;?m1#lGzK>26e`3&?saw&$9Cp2i< zYeB_}G3q#m;~SUA>!Ayu*Kv5djS!Wmw}3b|0LX99?;hG=BvAR)czE6CJ(pRUPk#+; z50@z`sZifM!TlxHK*9Sbgg6Wh{I)@CEv%d?u5I@ok@dyAl*@Cf9aTzT%u-V!{I8f#5&*UFD1Kt%_!ad;jUP!CpN3!MHg+yuxwPKY zLesOW*A53!c^ge1zxu6|UdjIe?Hz)TxBT1gC0_TX*>H5JA-fnXRvB6Lm4A!24$~!2 ztJq}Fg6L-cfjFol496MX@X5*)$V}A$dr)>X1RDm==f^j(CzOrL?Nc(#7%gAa6Ggp% z`o#MNef9flo65i!EftMC11YF&;`?M1(Nhoo1@6;t!eo)3%()*V+_>{s~ES4&!!fHnW z$?WGo@8_A+HWT%Z6wP7VM(TT?LFOGM2-W>Cv;v(<1%g<}pNPn#*%KyrwV=`ivcxRqWY=?d!};V2Buh z3Thic4RdG!ww3(ZTfK7DulPnf(8BRdba{ z*2$IHim=cj;2o1*b5qqq4q7kMweRlx+7&o@yd4p5C*pD?zju8`D}5VyKNLEuv}&S+ z(%H#Q5eJIgM<^N4JbjnzvcFRPM;T$9P`U0@rLdcz+(hVZ4g8xE<$Y%%h!8VOOQR^T zBB2JGE(N-q{UpokzK|jZR4fJmVcBbx%{rJa<>PW8W>{k935geZwJ}oosib{2(Wlha z%d*06YUoKTrdO3FIL2PU)O85NmvoB#?Yr0P#7N}id7X&XtVrS5p&QMQr{I?q*kOdH z`$(32>`9n^JP;MNQfDMOh{wOu_8~X$-OmOFGVH`b<>fMh*tqbM=sDRk@XA3hCo=1( z7toj1g=+%J?v%^ZhrMul2q|1phk$MKDsT>@8NL*pLJ#v{zidzXCnc9s18tVq6_8Vn z@xK={!A8xHi->t$TYg5Ey$dROPCE0EbayAu$^T4ayCgx1NkJI2{kKM1+xsC$oMPr< zXrF~$DmHUcB>Q<6-~mXv*94%HTq$U1^L3ASjGG&K@l5yh*Oh8A+%hn_#2@J)>ORA+ z#+EI61xCWai$^mFZEE-*$psHzuoIK#uH@6&kX0=Yrf%?X^AbnbXTXTZ{viTs$-3Qk zTQ(>$mI4NP=r9Jz*vDP}cA;tha?X~uEg~Yn<7S>DBQwPFQhLxQX4V-#B)YRpboXyl zGw*FL1W}<&vRp@*X8N%4a;07zNe8i30Y?hQAO9`ub6m#;y#Lzs>3R6L4;<$Gk@hYJ zR~w`>7uGw=mQ)h+OMQFAYxo7G+D?cqtDTaLBm?|tl0!0(81tvwu-@t3`z4lw8=dSEnw%d zG6&^rVP<^mF+1@-wO(xiLuIz;!0st6ju2qrJt7y1K`B-`Dlh!4e?4JY?BDHCt`wo~ z9Gt8wL@ix(f!5sRvX2XKpgiD5hQGr6 zZ)xB@qQm6d3#Qn69f$*qvG8PG0hhk}Y6!4e^)XHi zy$*a8*rguAxQL0U=Sj2%<9|KQAZCbul< zmS}V~&_1~6KE)?GUSMl+Y@UtZs)x6=X?0wgwT`0?x!f&%yX!{L^t(Dg)uiomTiiO;>=HdsHClZY z6((;vlL#b@wp|1)BB~Dohb4P~Z(E~I{p>9-4pMnmd@gpu_38>V3i1cJQ}~LAm+pwa zPP(~oV2W42lDG>b8K06+lGo$Z)YA9mT}6gt*n|2%O$peX7Yw?!@z}?ygHZ&hIzID$ zbW`u@sX8-H?tC_pkPNDIGvU?Y3o!-lxnk2*bin6wto z9LRBjnIi{*;6rRJnqMR-pEAtAN)uv_t?RlkN{%U^PaKgxQeFM>@kXRe`qSOG5i80% zuhez6Et_0EFMX?(``1Nz*S_6xg$?kTLVyL5FZ|@O-z#8ujtwUaS?ausLBsEm1R^|Q zbdR)YT6sS0j53RWHy%;z+3aiIf<3(s4RqmMIB6ztu$U z#z1U{lYnnAAd*<1_AXdo6wm5a2osdn1y*6)a=TUnKeX+FrGxMGhC*gm=XWFEl0K&q zY!nm}NT61s_K6o0PB6&p#53S|r!-%;A}BjQTjPNGH$N?%|2@^9g|F?5D1)UhV!(9; z?ppC+MRCzsaCJf63%oZUnpX>!?HaAof--s~88Q}RhJbd!Q)_ei_ZwC+|M^Sc{_(-C zms^OtKmE_9Kiaj@5^9|fOD;d`%c9{qXX3tXD8he5FD-6zo9pP=?GJoS)^Y49=yChFO| zzuEmyJJ{hrL=;c|=9jgPPd>OXy9+Ojd`roBe{+QBr$FvuL_YsXpV$!0I0P~DmW01z zHcz_(Ngljc)zcccQ;tOk+5kP5%69F)v&-nV)wt*Ishl=nKl;YQ`uf*zA-sPCBw`;^ zIVrs#7VCC>ZP^HMH_mbvS-k=_A4rCGi6RwT?_fN*%a>cyJ}Qd7Y-U;BSDhsh1t=)& z&yw%9TEL>`$DI&9s{Mn(9EiBI_OSJpM86zTL~{<^!etf1XO=!=;TV%uKbwtn0;$!) z&{H2~$^;fd%ryswC5aK$Vlp#CRVG`Ez75gosnRnzhNj=9{KTyv^npjsT7ath^AqBz z^<339_FC1x@;lheL7bXRoV;rKbfa6cDn6PVc}x2c@t-H=2W3imrC@sTKFk^EG&E3- z!LP|>*tVXoUX6;t0yE(sX->p5R-l@>O*4?ISunJ+dA%!y`I^Untp-jBy1>EFB1OZP z$mtaFSY>JGIO%)BH3wZvHUv46z7+-R!#rFd&@=}8Ab|m~b}8B3bw8%?GIN`0L4Wuh z=*@Cng;?M@pkRG@5*nguTJKN;rv{M^w;)d>yBk_?|o<8|02>z64 zK)h}i+XvZ@7-1K=$8ucZ1X55h5+x}({0*rpB`s}#iznEexQ_Cd%VUcP=xn&^G;8US zpwNi`^~troa+k$?_ntx*^cnGJ=6P)fmh5tyb5SEFCr>mp>|I|CSlu!Kdj&9y@`9|p zT5&-5VCxFDi(}W@)tubBotOUP<=ousBngs2NfS2t=*Xrq_L1him{(V8RzMyeo)`mx zx;z&LMtf_rq5bn)Ikt%3m2(0v74Y94 z;49-VhtmEx(q_hUXdui3z7)j$MqBlh!MTzIcwo9Yi_kIuc1YuZ2I6E9R>b|w%_tYC zf1d&LtOVhxZ@DZ6>SpNLOf6dBSrzCX#q;NPGjF^dy~TyC1N)DW1N+-Nlr<3FzCAqr zHnB?fLLB>?uJN_f|Z9KWV>6b4Lpbeb=!vp3hDRXJlOI z(=^TT%pej7=rWIGvzx=!h}_t)0cDuEPBOOthS%m*Vr|;Q+#j)bA+oeEAV;^iw+Crq zxdOX6os(~mLWdYtI!dkTd0Tqnu|_j1dFs+Q@)FLKaY85rF3fRgM9^}1_W z6~V%sl?Fv6P0*`rApTV^Nh8utm_N&E0^jnra_cJhSS8kPb_@pF+5}6V&&PxN{*pXf zz+w4+6U{-y5oaAa`Ty)qA zBen8yWnZKJ(6ZJ{i1y$jXCg!z;ExxG!2j}P^4ym)d{tmml=j1~u}>*q)`>CYisH%W zKCw(<8^nBHKt>DF#tvJ_+voo1_75UG-PHcIxbe;HN|`%2r$jT;o$Ykt(Es+K`nG z|I}vH_b`G{r&=n76g%qgp8w`nSu_1KJgqF|3N4wf&`2Z{O~_-MyL)sEhcdIclMYVL z4=Y)K7`J9usjn5|`6R@W)vHdvb_U4Lg6TJj^bptO)y-1Sq=Msek}bBj8BAiHpZR0s zyWur-^-Oj@!LKpF*)2HOAo&threB-27;fL_h;)MqiK4uI27nrFaGS6 z&(jM_&Y#lOts`+)bUCS~>laSR(2<3ag|ShBhRwv%{h`2gDYGWt=!=hTo64tk#3bpT-T&dEex>g z=hmdjtf3R9bU55J7sfr zm16NwMu|K}CB;TN@)RfRoF+S%wyX8k#x~N`MNze4Susi-habqi>Z^GxPcP8Bf7JY$ zj5u7WxM7M#2^n-yV~R%WDM}k}D)pT4kA3&P!shiMDA0mM$?~=!B|y>@KL$-);Pk`l zPcU``k3`QN;@zNQW@bM%`Gifbg(g42uKzG98k%h3l=;c(E&tXTMwlFue-Fi2?Ns5E zsTo0^)r+GIlL$&&-`?~AK!AU26{o@}Ui6}Xa81@(9ReasKEUSi>W6x~UispfL+xm=H66S(jhdkP-8EL#`H?OBuRmlw!wmX?pk9z-E^M z1EeKZPDF>Nu^Lyq9M2>lae)kOy5Yc1gJm@}Hz75TN4YqMvkH=e%%xyos|#DH2uqpg zZ0fqFrjP_XickV4&s^tgOvCytgT(lW)0%}lgfE3Xy=`BT()qe`G*Me_%YbCah}N<1 zkqzMM`mq*MjY!f}Hv;Mqqc*%fDp={)W9)9^gFdiHUIadzQ>i&$Uh>L9gE zZtUwr4Z3o(nNHy{_Sr-oqIOsD(MCZbi_@>Il|ViVNhHLj;zw;KAGh2E9suLB{wBNu z=Lil7+NEIWfwkFp4Xt$()@c5aPLRrT!loq=mLn$cnDh-_&P9vI4IS6Hvh{s3diJ{za2)&AO+FZ2FZG(P0FO-R70w&E*=kbyxKHDx~u24ti) zv1e^g`VbsBOn-F)N<_|pB~n2_9%46LO-V^S;C`efmLCX^&Dr?7FXLhNxtr7m2zdM-@TNlqasNq!-fXdvjJ3F$kUR5I@B|JLjaKn|HvpWVF1be z`CQ2Vj1s#1T5ShEZCw<9RGR$*z0WR*P1L#oIxPmQYjbRx4ueYc)n2pzuSvYaYz?-b zSdcMFVv^07pAy?HL%~#)BKM2XNfVQmbS`kghU?+r3%iwkUG~)ZLe&pSX3h-%4D~T0 zuHyoVWT4bxBW7P1RFy1n2{f(Z5VZ`?jizIfUt3ticF~YW&2qV>XO*ON1XKR4|6%u@ zNPh%%*Y5XFN{M6;Xg@5Fh6ql3*I(KWbF1LCzK)vIAn+tj-7JFqtZE?StOpG2pq_54 zAz^MNd-2lxb6;<7t?NTcEK`w$r|*LGtgFlWBP(%y{&j6_lQ}c667NoOxhnKQFFnIs04Dp+Hhx_HPnR>u%EtR02c77YMP}A2<(NJxI$PBu`y;Ent z%>1a>{-dwCdd&S9L2D)0OM`nT&ZHNcsi{7h;~%}uZ~4QQD{_ar+P(1)T}3Ut@0@Q6 zSGmmbaBS;bMQdID%5w$3<=xwLY^L>~HJS!YvaqD>34bmSYAQr(E;>1SWB7%v zE2u-{jnaZsHrW(VAlIXA>9kdRux(FLvK2s7G%gnqG2a?#r8x=#?h1W8jD-Y^RE3R(fdeBIlbRR%(67+cUbJxZZ7o!qmq^jPXl$RU2arc zH(2ZPJ;oTGMi+>)SCzq@x@SryL)@*;dX;}I_xw5(zHGVEl*{II?1O4LI&;K#Pd5nlfVGtM00H zn?D|VriWPJQ#8}+JqoawdVv4JmF=sB!3UF^c!A9P(j}e1?;=nqcI*4Yeo&$`s8(3GExLpjRv~-FhFz$| zes;3)s&aj$ejWz#%UDJnq8%ZsytlVu5K~4w((rIDa5kYb+;4^3X&7pdKj9llBPBBb zn?!L}7FU7nEBEU_&S$^Z2OnHVq}B#C`d+16I2IQFEYDBPK5a5sb`txCfg8Arp|*GJ z%TSB)mRiW%(@Y9IESy=n@Z?ng7R$b=t-YttzOe5RAt2=>^nJ#m}cf`66Qy%l1(;OVGQ8)TR~y*y@bOT zb67!J6E)3f;gtzwbNK)Arr9T_*2;ssOgD6bPbHv9y$kOZK2&{zmAYtObY}ZrL?Xmo zC@S@{y-OMxE9%DL0i+Cs-_%>12;}Z-e(?o+{X!qy4rjm8s z9ugI|dme4pr@Ldb53I`5IQQH(%ui@S1Uf2JW$x)!ja}56GeqV25zdFM56_o(jP!mU zA;~1%Zx8wTz65+KYUS;12svGz{n+ozJs9jzf#%N*5-o=p&p^Cl|FvIrIhWLV2Xsj% zZcl^-jxvDy!wo)dGqe@m4`oOu2*A1!U5XZZr2a#W>X6KL93}@w2-z2f5AP;BpCKw1 zb-4^l0a!y3`c)e85N1+uHpr5HHd@weA4+r5g-lKpbmW6Tx3Tm`7s%AjOlKBquwxQeWGZUuX z#Ro4F>3gMRhh&fe>-j3D-P7HHdPj0s(eGw|YBgrpv#_r;kwtlT3$C0LGF=Ure+{8j z-piC?mvi65S^Ku(HbxV(TU!cETg8L`$<6b;x^K)AO9SNpm}|x_PBCuzX{3KfWKZWk zEN6nM&+&YpgbT4pW3yN&@cvKA;TMRZ#L?_;3w`*d>dx;nI9SOng}A0)E}c?5a`*h- zo!C2XQQDi&tS&b1xvFU?Iw_R_+oMN6A_cBbeLK47C4o5)s3=){X$#*9DP-+17t9S9 z@i?7ZnSG&BvhRA4;JveT)HcUTHt;2;_sYfn)j+oPODLHnsb8>5;cRhXK}Jp*m3FA--_n+6w!u|MaPV4(=WkdpHQp+&$6b$R_gwbrSu96ZilgDIAyclTw(af_bSu~UTA0Va$sA1*S@6| z7^#wZ!w#$-KYwe&mf$X3iDAP~^VQjHn4$z&Cn3@9Ij!D4@mfyUyDdq+kHz8JDQJji zi+e!9VIgw$cK4}kYFt}RC8%e@MspOV(c!_F$E7oYy+blT9QH)TK$-mh59td*0kA9+OPqc_+DW3XvibEW=wl|>)4Ms zYs8?y>+;4rFB!j(L%e2&&%XFV00?goid0?wvi>e7pv4@K3f=?dHJL8){ml1?7+?8z zS!dRMUR2QCtdBtx$f|7Phl2GUE{O`XK)+k*6>oO`Rz(xL|QW!_!lM18kDmV|@4ILXM z6U#Jt^#PUq-@ku;Og7HW)muVLLB$Z~WifovShh*o4|*@%7>Ljm1%}6YE*^8dtQP==zy;^{`{H0zP>&&Jv|~i8v6~NR^EP%QA@n4rsh!N z#~Cd{L+s>{XZw`HFo!0?0Nk*!u#iDaoDp!Y{Nz)LFjgrO5*4LfCnAzDpd_^yN+|@C zXp0GHxgUUoSllHmqGA+sTYOSf@|Pq;sE(XS3UQU-5+%?W85!lr$0{fo(+>A6eVt-} z{~)5qOHp|q{MSCOjtKbFchP*fp7%6I!{g&S1qB7>bq2LQmo^4m#%zTX@{OtS@jewrFUz+* z&#Fa z#}}Y(YySMME_wl*vF@Y-y~MDf3}p?CLEzG|HD{}~Z%pBj_l|+B?GW6d z>q9M=uMyIbC)a|1C>9=0$o3;Ak_#3a+FK4X(rtvkc>-7>M%93?osWw})yKjCsg%UE zU*S)!#a^vp-G$7n%Zzo#Lc|&>2^k&U?^=tmlNg{skTRUOm=HkNVilC4kG?!5U0V=J zcZ`e${D$8+TnQqG_5S_)Ngnl$xWKoQ_Dz7@UpqN*gZASRMy%y5Et$*9%kSo(MQ=cX z8yl8W$%s%Yk1NY)N1W+T9-#_z8Dohi%}7&8@ z4?@bW5h(R?JB6@+C2Hx@89pYLJ$J0sBY%=JImvckkXQYicTe`64FG@bvo48zLv%7cX95 zeN9@ZJbV5e2zR14Z{F}`{{BiOU60AQZd;|t`2vPVBg{Vb$EQQ#KKY)I z#(MnYLSO~;gAGq_0YzZr#{=*b_hI!~$_Nu1|lr8X2-#3y2+#6L(Y({qUM^Px6+oi+^4J=_$>cG9XIy zO_B}fO;yA}dr4xQF-Adw0Ra5FxK*Y6onaeCdCob7o&OZ(gso$dwMB!e4E}w4xENG+ zf|CHGn?f8Kp?|7~?U5cKhY%hCrKxua*79lUgn6*m9Q~nULPJ0cJui2ZF&WYmud$8Z zX_|0wVEZuiy`D!vjtxL)3ZyRUv?!8sF&jH}0$Pio~6iiT;pq5c$ zk8^0;9v+}w1v_ui3;L{I2huOCe(=J(*HR!o_&WY=U_?OI*$XD7AOaK=86X>6TwLVM z9ioY#{(!#X;YlbV_}M$rPdPU`YYFu73-shkSY)ER8V$LD$9)fMn_o;EW@eX`&fNvl z;J&&;sN}Ybeu9y6BCSG4pgRd(!0oBfL*{SNe9+1(Cuhal=`t zrDT~@OwlGeFqV1ATFa!Z9r!yO%_X3pQ54h8DGVqFj@e)~oJ>4UDfSP|@C_;}`zBGP z&o4-^OMCnBv9aYcecaG#p}~2KWNBo6Jsln;lYcs_ct=*vl{`I#)6>$zfByXGJn*ug z@~dTOXejER+1U#ft;j?!KGCM8CgA+9wU1L*`+S6jT%`V*lVo$~AxJ=l$a9<40ru=6 z11}#bC5BkZzwkR-hOPR3g#fM~Z){8}L$-O(0uC6!U)6wQHvOGr^4rrY?E{v1dBo?c{A@|SuH|bsLxU1qV$K!75r2~Jb9JZjhy}LvdjfS*<}}JicSLC$k>Hxi0VOqru`r-l9+BKVgW39MRWz zgrxNNsVZSDJFEXrQAQr3dsu;rG8lgI<;@<&-bHvtMa8GJZls=;{tPu%T2WWf-@kvI zO?f2IFS_PiwRD0^w6&2sO$n;>Mt6S{1&>%G?}rx69cpW9_avyQB@So->EpATTT)im z7-AgA9{rJiiI9)?i&6))pj$NH*Z|~>jScVn!wR;ebR>LiY-DEUTGu(I;?81p(AjK9 zRAsq{bF`Iuew=$_shXtX^PRCwEiazwM9| zWZFvfTA9YmG9|D&%N0zeRo$;ndWR- z=Vj5N%?HQwG#scJ9ncl?4t~OY02}4@d6l`RTchEgFwP8eRRVnbN(S z5i-&03aGyrm-qhl;=f^F$;-fYCa@n){ z!=4xgNY-8`i&%&m2|fMsnxegT*RSs2rTJfzYDiHrgOu$!g;5uBv)?v!ac+WS;zn`3 z;|K6pAVFI@I~<``!BG~^uSkfA@0>(e5;HR^7<1|=882lA$?X#Pu5NQ4EG69B+{o_l z?}28a-(N31y|j()AQVy8HIRy`Dw@%qwXLn2*{b%5@akcq$1*us)a)0HMKB5mzBypX zJ7|DKR)CrM+=gNgpJyBN|{mX(|Qre5}L6A_>S;>kPY zfgz!MV`dg=ul4a$jCb{O#`_xFfGz~c&{4QFI3y2o<}jETKtUts&c0B3NXyMFm3)ES z{`(Ewf- z_0Kaw^qC}I=~fK`<6z77a8fQ(cRAo>^A~@!c+whwn#SN+`eAi)oBh7G{G0X4Eb;sb ztj*YCB1^smw|{R#xB69XXs@__P6le)7x8qIP5SD$rD7 zWe9Rv&PG5bE5PyX2cSL_Lp?-Y6c!%dYpZ31O?UGTnKFq1nN}7Q4?1eIuH?b!>Gnf8 zdHHk0Uk2oQoM{YFeWI1eyj&_4EQJM=3k%p`azREL&OJp3s)2v8KiIKnd5V7rnuhUF zNTT?%NlCRLp7H;DC`Q zSfaZ3aZtiRuwNL(!xp+s|LJ!6!Jz42SHi!#i42-BnvsCG)b@mDGVp!bw6NK&&u#dx zS4!bzum(Ed2z8n;0N8LP6Uxs{Dt!N-KB(egEztx;AWCdPQSBX^)8wEEIFK9;Pnba~ zT8!#p2g8t@{E+5Wb*L>C?vSe?{zAQmRpbC#G$m^g*;KkI#f}1yMvheW?X`_7rhl9w zOEeQJn!YtdwP}r)z%NTOFp^1lETvJE9!^LPh<_E%M( zAeG+T?pgAR#jPJMB`Oa=Rp?xc4p+VyJ>D~e;rBT9LTl~?=THxz6_LbJ=c}y(iFTzW z$MLjT8SVOnAk_mZ%@m>{_Mfmwln__WZ>hc0DF>ey$4GW5yYe?_6WYGyO;`&n?3x2~K_zE-z$ z3(6FyNfo&e^^s{x@9dvH-P7}tw|Yel5HYRsvz#x(R*It8%MxBpKxa{mM)LDBP#*l? zUAIL<-#THOsR%CX{UJsNRcjiHQUL2a(S^(;FRJyfh{8AH3G6~TQECAIyn!%Ky1tN( zQ{0S>!~|(V10QZ!CXTh_W*}1;9duocJ3+XTQzRP!BbMdO&E)Fp>hln=bYOL&G+$T$ zBU)T^52Lo)?e6IKX(PIYzRcPo>DDmR4R#-%c(OC)QQk%W7$j!IPywes6VED5j z?V%X;*b|pZEQLVaw5l^Y_=B`orwY@zM z^~yAo3;-dI^lN%8>SXAsuz((fX{Ha2c!vN*biAY(fH&$scZ2exBi9&yZZiZ7JoOua z+E_4k*`N1SnuxK8=my;^mRH;6*%4;9B*q-p1}u>_Uvblm@rOP%=T~|Fw;+rrE{Zg4 zicsM3_5Z0WMqu@#!!!d04WX*jy9jpz|qU+E9`uOs6VtZL67?5&cIQ` zSFe=Rb~A;j@usJzJ6^(Pl@4n=mxpeu?USaqF95m(6soSq7E^wax z5HdfN4te}NV1VD;48Eg-A98ak-Sl$E|DuAOFr)X#t_6qGJ%;EES~Q>t(-6|40^LDe z+Lx!gEyucwb)HmU^WcInoKNjR%&HX=^ZiZJslF;2;6%%vl=oSh=W*~?|3|lTET_or zo{$&Ry^p%!dEG9;mtRA5S(%if8#7Ru2o?XISpZ~(*RqHJteJeB_4Hi7(Je{QR3{gg zUFi~?vNgLU4h@&BHvBl2o4DB7o#$wU4vR`BQ$=tSi>6?Qm3(nPTU4>H{29lKo(!^^*M8_<=)D2S$W0tk%-V7`=T5k7|nbcGx~);^3e} zHAki*t{+c&m;voAMZGscDWTliio8B%crbfX9MB3*&>d ztjSnS$+;-(n}?&cckj^r|8v&wS@mn@4sj1TcLX<|8Cj3de+yq*hvlQ zZ`}s>-7SI8uLO`K^lAPAYanN6xBlik^*jsn*;SA3*x|lcoos$SAee+dF=*fS1a-g| zLuhE2EEzHKK$NfH87z%?JJsp+I3MSKVpv`a>HTNO)+uWPRnoI1hm{?U&-IP1+cKfT z0av%L6%@MHYYWRRCSERFyBuVV`yMP*8xsMWunlyQbc>~>nw(cRFAYSq?Or`lywPN) zcD!H{l&DB93b*xW=3$IrjHI%^CVTT{I{S?pjfI@ft3KXgkWDpJ)xIDUj6{Gi__kXwZMl5m@iv>R z`Ca}yyJV7`6t?T{>Mcs%c}-Lp8`eZ|Ut;%BS@&g$18gk?dFYS}tZF zMq?e#-oh~l%yj3Nc&a<~P{4oXRUjq#`Vx=hY-51&>qNbROAt39y6=Jcm{^PAyDJ~j zBVZ=2Rwd)%y5BrS+Klj|Xu&{bvz@cUx5)#z^Pt^zltxQ(8tV$2P7r3l1?ICytjNsU zPNEK>tuu;eS;i(N$2TIKkPK({^;f&@WP2WR=uN);crlxXzzH z*G~*m?3DmK2`6OPK5WM35Vm2Or^Rk=-W7ue%0j4MfQ(8!;Fp%I@u8wox&L=~cAT(8dgSysS-G6K!m1 zY3KNg5(>bUF7r|S>P|@i{F~$Z>bB9Q+w@72-aF*w%j%VAw|<4Z{nbjwR;LNH*Df_! zkrZmX;bCJV$?%DfO-;_|Iakpd%F2n8DDil83p~!V`!Q^DQ~`W(15FnJ$FG_^IHqV` zy!cuX162PhKj`z7%qLywsWO)EXjCt@AMJ8U;M-E@oI9z~O&mxI^M(I2IeqG?H>7^+ zFSrk_eQ@qvd+HQkEHk%+5TyAV_8d(Y)&IP!+PlKKkr@AfsQL=9D5I_2p+Q;@5Reum zq`QWYl18MI1_5b7rDy1FB!xj5MY@reMp8tj8>G92nY%gX{{M5Y55mmH%<%2K*Iw&g z?}}Zi9;-sr9ph?6PG=R`=$zhSoiK>t%RQgNoI78OBKBDj81px;h61v*TiK^2*$zL`3=;9@P7>~+^q0?{`%C3s0_TwJ)30yeq{{)z1IUXcsvz&Zp@#`w z2X~uiW?~!1FdOE_ZW5sg;>s_KuHm?ygt42O9lyehtC(Ml6x@O1DvaL}IR9S^uBrO} zjlpFt%D~iM4v^oH)ek!5xKOaXrvu#o?k5QiAz8{T2n zh~blA1Q)H6JQbOanuO8jN_HDH+;h=ik%>^WjKz%E11Cr(Q^pY?n-g^PY{ydM{|mxp zE^wpAFytIt8?D_Gk4dsyg*Keq->s-Cb^eD>rF-DHKYA9=NawGe{$rgkPR$8B=^Yaj z75ZK{DdX97x1h~`V{PcgjjhuE`y>V>C))Af$I6h!_ay1%%7jm>`~clgzc?6*ZAG+- z8t_gA7=)%WtF=ci_ma{6sv3zy6}S$|-5NTgHcD}s>pzD5jiLupem>H4;pLGZKX#8V zqZF*bXS@WV01%G@q%Pkj2#jr?`Z$5$6Ckibb1E7#dlX(~8xJf{=|7*k{p;%rNsqs* z#p=G!>_+fY)YAr+)pbooRLpQ_x|sjxEP=CovUH1p#^!}Rk*IH=OFTL>fs{W_(8sI< zQ9zgOFk(Q9KLK%}I7TQ*bPvlPn(CUGrjn9JAQnas4WKV9ECet39!5-u8%j2D-VUN< zY8yFY9AD1?`wHnl;uu2I9#Pxhye}xh_i(f$rn$^|Aw{SX6@?p$`~XI2Yr~5T5q_SH z1+lT=J(l$?%BQli&|zR@NVKz>(R1{Zv(oS4vqlxtps093kwHEtYb-O~vQ z5ebR=Dp4i^*1beOr>Bo&G5XV8Ui~-f<=;LNe(Ogp?4L2q$e7+mO z0nn#b*CifFP$WP&z>t@G{=96yoz^@O&cn+~wad)3@YVe9Ta?}N=lA;E4TEvOtJK9F zD;XG2rMj4KUA9gh;i}V;NVIi2IV`>^}o7TJhC#f!g{G1v@gKq!6R418y83=7XeHvxo z1Nq;`5KM?wOw90>m|WOye!C6vtm~#|A!7sAEct0>S4rL8E+-!8yfH>$66PTzk!npB zH27DpF1uwI95Ap_kxK76EPw>|L{2Uo_okx!mru?E?pa^jz;9Wm3`6$(&!3}6(SSmE zX`fic$g%jjUg+7zVNy6BC#PD{2O|)JOG-+bwZ|%d{k>C%ARQ1^AX0?%<9PV+^g7qk ze9KT@zi|MOa$_kK)F%y&TUtE_)0@4e9LN0gy~;&GO&&%lC5 zCbKiKOXHqCK1J?>4$@eVU&AkVC+ScAVC^~a6N7*XV8Zj`EZ$^?mrQRbW@T}!F+Xu} z;YEZG4G*s}Vsid(Fopd#nBsXVAaPSzT1o)!1d#3!&}NtS7ya0g%I0$egCpz2wf*%p zD4>-`70DwQSkTD|DBL_${%GI5ELlyD%Kn8S>#U}-lVW~fpF5C)-t*zL8VLN)nK_8jwctI>=YHq&tJY&wRPfmoRW?0N8gKM?lSyO2p#)BL<)R$)duCt8CS^S zA+LqQY@H$MObfR2Ln+#5xjQ}%4i2|uVFkp|(UF{*x^F=$gY-={P4T$bAfp6rd2_SL zZML)a>x3S2B_$ljn}eS+A^Se9W^S@X!Z%_ZBKNKe)#p}S{e#J^(Q6^^1}Voc5ZT#3 zG6o0T_5vOPH+FV)w9J>U#-02gfnaBR1qm5C=;h2m!0l2ChsKh%m6gaDzW( zArrambJbD(EOJjTSuf=TWcWM$=~4~85T_%(ugR0mOiVJf4sqaMxx25A&2S+|V`J=& zd#R!{L_tTExtq|VSrBD8dJ$lMbB_9!=DrtDXrIIX2?mBdk2rrL26T&lUTv+ur}oR& zHw|0AU%8x}P=ZnCw)NaJN@%aVSkQ~lT&Eq*$(gXzz6irjH@kcQm;!fqcjQyjO+EOG zN_Mcp7bOLSpezM4YrO~zrZ0SX5d~!-!WkOhmZ!E)0YARj_mDl}z(JT6)oNJWKFrNt z6_W6X9)u|N+rO5Tt+r|d<&}~`IZsAFELagjwd*`)op1Y$2Z)~ye7(g;IbF2PhW^P} zVG0nzc)-iGVNuLQsuATYQo(>w0C|-Iaf|x+H_kUqS9X9bmfjB)?!tPG#yI$lez$Oq zhb-SY52BOLdmnJy$fxa`)a;Z|Mzm_N6b)Do0ME*i?dj1jkVjmc%E6bt8|9+u6`x89 zei!fWPGJSq%Oa>HeYX3~bT_kKj1r3en4ZD9yziHR zX=SCj&6ap1513^@H6FayUwAH@w;f4V~CNEU|#>IKR|LZyv zdtusJ>s3%tfUhO>@F7l5`y~-=Y*?CvPaL9sSHj6vZ27%y`}t+d%{UCu^{VRXD{FE6 zkqJjC-^`OXzBcIx=OtO8L^?Bu>~!_@Vm{YUkB|R~6G|IB`$M>Q$R7r*_1^Zih|xO- z9xkp~Qu=uiTykrp)QMlq(0%bD`g9D#kjqQk*0+WHee)4jP|v1=tr%G*sh5u(Dy%!Q zlf`2ynF&nR(Y>^cbfTA~iw+a>5jq}P8=?d0s_6~Q&6(5zm~XOm?(`@3foO3=Ow1Eo zTic2iDprvtO;m&!Pd)Wh6IV>rB^At1Yom1b_n9gJd5sIZ(KjF3|8r|ngYFyelXZcy zDl6kD@cTwp!7_Q%bzJy6K&ob26_;+-rF z_SN`DD(pRPs#fDuWjcDck>qPe+FR{V%}Xp{T4KRsBmYzk^HXz>Hncv9AcfqLm7BsD z30I_U_vb}~47o)g%nbL$M{OvMvf*i%8D_Ue)M><7O;-K*Xy?_;F?%6ga9lX1HM+|9 zIuDup9CQ1{Q;fRv_^+<~R;>g^MZYk}3<#2@pkM8!yWv*BywZ1lh;m-|8+>RFx>W$T zjyg1t{zbws=eMnGoe|*LO6w9Br5S!Jr-r%Q0>xz;5XkwJ+*tmb8-@FFM=~<^UrLe^ z!P~WXybsu6Y$}>e%DNF8d}{V7av%w1$gBVK34#+-gb7mZSur+s+}Nf_IV#B0vyn8+^jV?6d4BkbIWYJ@v!r0nBEAYN9hl&;77+Oi zGA!mv6t#YYeVux3S!Z%t1xSbMwMd_T(B(gOZ_>8fs1yeK9IF^>E(H?DzUf?5aFDI2 zfBtl%gs5k>ef4Vo0G;#H4TQY`RgVmFW|qf}4PlF1X6DwdB7{I1$Jv&2eVkCs+fsv< z-%LOp80-f~WB8J458q9VtVy3aq3697GVK)Pg^-xZ*ZLP)r9hh6VL%gwui^igU+pm@ zGo$!hn^<_<0r3im_>i=zhLUdRiy&w|GFH80tyT%J|HE7Xh)ypY6`MTpUefqU3Hc6F zT>lU4Kyk|!-sXt`uLa~bw0NVRY#A6D9#1FGSLy)h!nd}6?(W(5_$q^cXLd`JQK8t} zp5ZQSShf^Khb9WL2tbqS<+Xpn_*oIUKgTf-ZNFg+G=!gI5FFJ`b`{?t^if0lrS{79 zwrBwz?IPi0Qwc=QBBvjGyR&KB?ut;5-PKY{z++TqoYgxLl?%9XYLjLZI}|{nW6!>j z7Fd|*#OSXLEH}<>6_Ro#5JiF+a0sNJKBg-iBUWt&&dC$3h*%B)0JzB^)xJ7W)S`X~ zj(us24W)FzS3)aWH~(3UN3uiVpx395O#@6|JpC67Ux6`OzRa}T6I3bJZn^AOQUE9l|U-IqxR{_6)IhK;~qt1D39F0DQ zqOo!v%i3}|ZdCGMa%m`5WDzl6X$W5Pn@NRDC?taMUOYfNCtH7SaZiB0G$c3wYwPs3 zFOmEPpj`!lG40 zD1yXm)zbk;u%&U`$gW82Ms`hN!q~lPTsQ)a+$bq4+nFskj9eiM2>Sm03E~Y~&R}-A z-x*aD2e;KHO0vi5Cp7kB701WNIEAo$fjOt6jab~9Od7GE#zygm*%x|xNpyUILPD4J zN+YxMJmPJ+qem)T;UQ_l4={nLv)ewd0(QiVv$(ME?c=}Y8fP!iL~J+H&ka9eMSR_5 ze#ok{tom_W!pb!HBMB2eilmIV+*RsZ6%md>G4Ag0f6%Tv8z;{ zCo06@r9VRwbVTyML{M_xTe%<>WRQB-IUUCs9@@YAfuD}y&6f|zRq z%kMZtON2+y+)PESEHe?9TK&TDniq)q6a47I`_Bhxn2hhA@x@hev0FBo4< zIV-N3`_#@B=iE`-s)%nyj|sbqJglf;zuldjYBu_@>V@6V>V}S{GupfD*C`}wj`YJL z!wJ0SgI`r-sZw=K~ZPn8CR^WD_%T1y1c7Td@S=F&}xWS)Tupn^w#QD+hLXPt8(?;AhfZ zfLkhow4p@W8EY{vPA0Vz)6?;R6r!hI>n{BH)(Tx=Gp)cJ_aCMRA!SqHeE1{F7`3U) z;TaOR)4(3hl!vv+Wk11?LO(`+?_Ma_4NlUv$3BvOX3m+UZb@wBXGnB;}r15g>U*c1}01%(nx~s)(a`%B+ zdTe?5%U>CH^6uHbeEHJu(eTbYqZXaMGj9f2Im#MJrYOX^Hxr3sW5!xMD(i`u^cGpS z3cvGTVWY1G4GCrAEK@lfFwprq_~Zmh_ef1WkuoFE2l zmRaH3GBK_IUZ$F2wr{?8M*#VJ=^Xf~M*K=!^r9s6a20NVx|o&Sf332Z0gh&_&DJST@*yZ{yy|#HON!!yI1TV z3Z4v*UlkCu-N<15*lxTJ5^@9YverH;0<~ndkT&I}f~!%XVRK~1km~PtMEl6GFwZC3 z{msyP+13TRD<}9s@Y(5uH9*-_e4_dk|7n}ps*djDEs;Vl-&1ZWsjTRjnALNMq^}Ze zPZTAw2kvOo&JG`K5Zk=av9&FH;X%a$gL_HBNBn)Po?mj)P>{@CW}|1~uAagGwguh< zkspV~=ypJ?Jmlgtng|yQ#`DPi>38v{2?~KF0W%p3Sc~Q54hG+|?U#>#mwR$DjJiD0 zvtT+2#0|M0&WEXZM)O*jwvBZH@j=P!dDeaY74C=V)*oWo4JmhmjZyt=)+{jK>f{+h zD7;!0PW^QAE~1%@(M_y6SMgdNV-E3*S;ynW1}Sh~I_1%1!(U=FRjqTI@3MdAwq)Jr z(E3sq-s(#gE@_z-g~&*dviU_;8|AxhLC`OvaNI6-$tq!CLNIj1L4vttIfjJY z+pPM{sdL1!-JbOVeal9?=(ou$YFZDQ7VxcGxFs~jk@n{pLp0(g8m;k;2BrMH4vHtAx}l%Bp4`?LkRBcHLy@8# zg)hX8A`cw6ujc(s9*vz~353awxu$0gn(E-Pb}h*rN8zy*?h;&~7@t8txh+2o#Z=G0 zYkGCYI^HX!v)+-6wyxhz)4wDt*x6xL2V1=X4 z?~}-DtSL?+#QeF0b;m0+=`g#{KczS)-cffsK`2KpLq|Oe{K|^_3(+QbzEhHrKy&ahxbr(KGl1z5b{_KL^4hto7Sl~8+KP@zn@AKzngZt3JOCBC)IKU< z0hr6_&m5MRvW$kok-FW7)9S?&Lk2YelM8V8B2qg4%s5iBjLLErkI7oDjtk~E5e%Zw&?oVl-ejELzJ?~0Uq%Ddch{c+4R zF+eC3iNuRT!x{sg2B2`3+qJbvYVS!zfz`(woAS#o@ zv&!?sOahYxR51k6tFl`Qdc*C*=#C>scvf{GEZMJw^5VqCp zQ*j+;aY5<@LlyS^=zz6HRhqpLd-K=91RM@WOTnQD2f(l{=0u4mC!q@;ga@>(6aHS@ zZrm(!2h344pbzsazD|d9SggZt1z1~!SV{G}4yrY7UD?mKR9El{5&z5@&_a|SD39Ci zvYkoOkre&Nv^aFmX!|e>Z4XFswS0%s0giSI)w~EX;Nkv|oY^}w%N-hnG8R+a%x_(C z^jRhTcQCxzQRu_`W%36i-{{Z)>gafsDtn^(;-gfi{zML6+eD zvB}S%Ivl~!eUZ2VkxRmZ52L}$klrc4D2RJp@<6FqR(hjF(ZXo$Z0T6QRC=MPKTujP z7Z3=dUEiSiYy@?W_V0!`cC~OWQaKV9Er>qw{o|*5DVOIuPnD~8v@pYBG_1NPw~X#N zer|?9tFf{VAkP!g{(>FC#{~E_cG}wREe1}^xvn2?Sz4usJxPKVXD2Bx)@15rK9aF3 zfFb=x&J+An#@t5bg}YMn$c;-OZ8n|S+F3vLq;&S484oo=ODMmVXXR&h1^^&hOhJ z;a`FhQE~O}I@cGHQJEQE?w$Ne6Gm?x#1F%kwjjKuEnp~sEv^hVYCtEVecL$LZlX87 zR3;3Bl>S@=_uSNfc1EJR>D%Q|P9VccW#u{78QaUoW{-lt>!You$FSm>_M{8{jdXS0 z?*OzKIR%4|#RYm899?iMKz0GE_!lqhZ;p_*Xl`T!jvaiD8UN_NxA9t&XpBNrnxFGt zRRdXW`f%|^J8+C=Wa1em;z<3=ZQo!cVA@x5?@`I;wkSfZr1$yqIRZ)1(FF1GoS#IA&$JNz-I9*Dfuxe~*ana=TGN~M1CjnSuErjJ=z#ubT1lc4WJ zqXaQNKg{i!;vyZT4fA2d%316Vv zsLAv7STyse*FbEK7P2s73F4Px`EGJ($Z1?pd`;k|r^hI($I1El1kaCgZ)x=$bRfPw zMZ#lm_>f#k$Y-1{L3@$t9BZ;*bh`jgM_#*zoc{!S1)33vEe$>rwpvKgWgtKO^0T~# z7tyjxPk#Q_2TT9l0+@tXx~G;l?HyH+C0^e{`s6nGR~eyxkx_ zIV9_W+{_985UR5ydmuvJ9G-ehoS-h2)PraPfmfL>?x283x&E$3K?dbwfMA#Q??$5G z*Yy2J>TopB4Bx6;`ORA_$r%PPlvRkSc{tQ2@j8wdJTR1pLK991@X=u1Xc)!jcVR0k zami&D6&x|~bfmk&yP7>{L+FbsJJe*8cIhRQY>^M``?!l`KBi%+b%Sk^A!V2nyIhfO)Towp!c1&;Memu}AO=;rQB7C=mIZo?b-)Ny&8ewzH3$DwEl<{&KTTBG@-4}JjE zAqzschUJ1ktDoK4-!cXL>BAv6Z$7m8=<|pfwr|8eY3%!w(nOIf%K86xl-jUJ$4<%0 zfq*f;(*6fDNDw}|X{0Z}vEbbi-`(@cC8afVe2VmvXVzUt*(o6xGNm&9z2+yqFdqS? zV{kKpY8z_v*Y#qVGzq?qx4&-tcWQDZ`)R?Vjr|eY+;0;H z$9OSY(mQhlns^ODG`jhWIZTPnT`(3bAd{U`i~eiSu{se>G9*W+&h3s(k&T_d;Jeo^ zjYSrMZe>u}EFIg#OaXtaRk?u^Kn8r+n6t6*DY?YV0@zlbR)?Z# z#Osc?ics?JU-G-3*Sp)qu3~gfY*8&t_s|39w_svhZ3_Sd>#c6}s^j2ne1d!R9K4!n zBq_DqwRZ2~_0>K`WBtR}HW_jVSvf)9B_n9u95Z$-f1CphBPGzBY;klye9f)ke&+z+ zRV563A0d6GAf-8Uj6iCuo`j;~=c;g3(70@KS1KR7g5U?}_l!K7y)c2rSTwdLjTw=& z&}qE*l^E0dFARS_@aTnF{M>CKR*m? zs_cbxZd)9Fj6a!d$L5kK?T^A38?eU3R*c||d!zIG{u46al3Kmm26xZFOrd0?og*|Gr-4+!c4>X(^LFz|j5?VL>%UnHs zWaL)zp1h{!A{^&xfzKDHw_0H@8N*B z-%@)*qrV2%`5$G&ocjkOuqsj;W3W}06VqNY+cjUcK#%v*@OHM`ak{XuUVgB%3ZwT? z48F`p^o8xbFN)yKMiniD-8-ssgs4a`ap73>vc&=9&nFUF^Td_hDKLcD-|}X1l_| z&jYGD@aY)hz{Wr96bnt7knve6(cWJerinqK1uTKqG!pblTzq;6tZ<2I>HAZRIJ!}l zm5`!I3e{Ctzge#UdWDSuThG2kRzch3`P+av^s#0drkcLhO_)iL3<&h7a@sP#PX^j_1>(YhLYEK& zS2LKHZDM?W`A$YPVno$`tngi#tz?! z9|Zn#e5{v*4XHJAl%E|VPZ}pYLE>cwXwx_$_a9>l{=Q(`oUAMe8iws(R2{cZ`**+{ z^#%e)b7&V3O@65h6kNS1sJ3u=1v5a6YAby#1lCm`Cd=#OC2sIghLdaV@dsCruhS+M zD1;4R^zX4V(ZU7kXt~Mr5b%ir z>N6-Dn!8^dSjxAl{-=t+KVkfRzmn1aKlDQ$_PtL{ON)1Qb|#LFh!C$Bw;%kdwJ}A`svH73q{V{Z?`FENgPyvR zlar>YsVSZ2N;qSHj%lmUX=+?toKc<09Ef;+>5FG{jf{_feruQ|iK^4mIe+`E}1>Vddjo;Pu_2U7RiNrfMK>ky z%NOqR{zO(gVG)rZQa&e}e8>Rw*4*4&vXkh{@3XVB*`lJNErxiGbFeIHSI=9`DnJES zhK!8N%A89>VA0lmTpWox&+2VHW+ETjh%4p8htPhGKE1)wp&=|zMUa49@K(pbp!eUY z59mnXUa|BmP@_XonNoE_`=E1H*zacYJRvG%!|7vZ0C;#|;X?b~MPr^biHwYS!RFcK z)k@5;(*XWK;San&F~c2ig!Im9*gpzcsa^Cj!glKaIQ?2*f0Z?}3-0vnH7UI~|G=vn zO-(H=(Z)F!;%@#sg?a;C(hRYaTf$(xoIsFjBqb$BWCM^FlwYPK*MC=8uispsYtPl# zjoL)_Bw<2k8eFIMz-1?2-|JfNq3%3Gc?}H>#Z66r#Ac5S^z|#1^U1xvy~nms!52Sm zEXZ<7D%iVR{W87%kYfo%_fuzu(5P7Dd^Wb>G*Sqin9FJ#oz{bXY#!_HaP2m<$I#`h z6f-6#6Pr0Cm-4lmS^{ZBJ|Q1Z>r1^1@SWaFg&Jb|MqW@u=)x3i;hdVTXc%rZq5p}l?RB?$HiClGpsJM!Z2 z*<&j85zzJF2l$svOGkHnzBiXO^Yf?huU9oUJ1zTdQs~9b;NtVMvww9a&f1{)#Aq<7 ztT>Mh^D5|e7<}*RS1?AS@xON;)E&K0m(%-Mj3;x5iF@LIXGVjqDYxv#>UJH8XCG(3QabEp4Q zs%OUHb9S-m`565WE7vy%O-ZYW3t2=xJ6nd4F+S>7;xex1kzPpXB?b}Bm21op_&%9T3_o%g@4@5*nI=Vu^ zcssj72`%fQ+J$Hk_A$z=pq}Xc$W{tFYxdOZ9))>-tiUVyR8)1fph1}gNZ=Fv5r%J9KZW}{0D`F=&HT4GfIr_=UN)y~@hAd)}8C z%_KQC#n-edUD#m!;FWC6$d+}DBJk*YB41~0l=eX{kzoid`?vVJ9iv~J!FU|IGY$K- zy}i9%b1mJ3L&7_;WjL% zum50VW~N0j5U$;}wzig653{v>sHB?e8j6W=^nryYrhj8PxH86SpuDWCpr1*_=)61h zKl>b?;ES-NMteCCSFD!c(aKQq4F-4m*)>}-Z2IFsO8yLq;_DK^+3igQt;5Gw(Rh$m z%7v~b1VMkU1)H*h_DAt5e;~xpAk$|qpxxZ}WOH22_iTsrcbosUHy#PSIH>5*wopf^bx0gYmn7jbw!kmcqo0>vdXBLw{a1( zuhD%aE=!|m1f&Y=$32irl9ZDAK@!fIR}{1pX^61J5`B-BvY_-psh!x0`-O4+-@L;E!DcSU>wgyw;C*o#G^* zWm8+#wNKYE<7z4I;3pg&rn1kT4qS`?}H>-w?wHolpJvap(GM z#ud+$bT~eMsyU}Hos@lbv`=o0Y>4(Dl~-eP!fOVQQAV}a|`<3!w!DwhW+ ze~oVA?!zejI5wDjAcm%GA`+Cs{U>FHk6&HmU?9z$gtP2W z)!?1^iyxIe<~DatY`968(D<8vlc9(OL`GF0`)N5OALoa23#VJQ~MZjh1AmSBIW4Lj!X z{kt_ezP0nDNH%$fF_|py_w^#X3ChAvwgo=5(4s|o=^RdLsj9hxuZrItgmVBj4d!KF z{!aM4i|xoX)nF&fU6ykDm-_-o)|;jCvpjAiErIcOCFE@PaU=1mU$A#BAKm?p;e^kt zG}u2(!fYuZ|MFnz8w6M=`ZIcDnQ_gd;>l8(H>(jqj|kO))#+Puiz#+6DV};QBa0X% zge!Mot_Lr-K7$yADs)!!5M~zDfeqpythsS<6YzCtl_{yI^NWgZTMf8>;CrH|hy^m&yHeFO zLI~lG_VzSqr<8KJD^$%QcwO`P*OhB66^+y20sr+Zp#b=Q-J}v8l*oo~YWsG+*_J>J zC+CJT+)kB@V~-H{$>eerdAe1NP1PpVyz6FcqL}9viF1XT6!~~>v%0p|R@PwChy7?j zTMQ@a?RI6S6@;u3pFoWwLWGegMvnb>NzbIiVUrR5kjGHCayVOR)n|f6aPh5Yr>%q1 z%qQjA2d`KE`Zm7Zd($MW5=SqvJKyTN3^Z1e%S^rV)hESp_P6if(*?^v7slj$g}rc@ z>KehFX-N~>w=&-Nk~hD5slUdEr?{@R7U?uyZfXZRpLo5uaMxVX=zVW!XX?OWUC zm*oXNf9k&o2ta-698{LPt)YxUAQ|x=VkN~!wrg-2D6mZP@$xEzG7F^%Elhl4tg`9t zra*abZwaL`i=+w(Gf?lSwK>6R;btfVOAw@VCdIpM4V?S^{77iE&sxSYuRzU+y5Ipsf8e6vItF*haWWl7^h-E%=*@zGrC@4 z%|WZoU`BQD8*`dKWUbhXRD^ebt!Z~N)!K6qnB<5}0SQ`p@6ji;s-JK<4DqH!hU zc2fvJ8LvS%vM*ED81(l{_nu8%yK_liWpiNVwDZB(|2dXl*>hJfAaR}L#g61Q=^`>L zGNjTTI$Nu1MvLP?f8Q1O@N`XGORFAqaeAzzOZ(yJhi?9u!IeY%n}BwbzyQHnSm=h) ze00&H!9s&C&Y*xI+oyFNq>}%U^uIc3wab3{D<0Gs_&(Fq`wI{->pW1oPrybPe&w+k z7mTg?hMW*9@j^}Tdp&NbyrJJ4Dhj>X8Mz3t%kW_gLa7_$WIIdO>-hwzr=*mG*dzIw zL{W_gVxdy&Xgjb*JI0e7ERRL7%-hTcNPZHKs>l)yE{_t2CnE|BmTz3>%${)_NEXV8 zzs>O93$ zIr=yH1b&3qf@Ta_mEiMo+WIFqo{^T<79LpTL3b{tZipwzBN~IZIG7W;TF*}Ju-8?K zd=`j&X8A*!!oGap5UtpRRt0Ei=@x6Xh~nT9vnNOTzgpp$eLqNT33L5h8~N|wKdb%0 z{)or}%`8#f)FzK^+-H}qfy3IP^y%?EIOcdf`I=dckCwa?vz+8M4q5x3bPQhS=F#pu zx7-sU#C+iOPuqMcqm{&97=P7Hc44H5oiQX$jP#3ujm1#bf*bkLUz_gA3TTS=YI(V+ zDC_TXAP^Sf^!O|!)E|gLM(9-T#5^n2=Ycf*c;)fWQ?j|CL9Dc;<;BLKSIQ>gH4y*Zo;v;h|RXjOBe(ok8^bxow4L9a&o2NeF*;>4M#zbju^70t8w6r=pIuIrc zXK)%+q+eA%JKNiiifNz@U3h(tRtI!RpNLa?7S{-^;y}z9k(pBSzMhQKNTIj0DG7#W z7dr1>7S~V|XUobI9OJ-orp@r$lpY~R-Bw4rbHaBH|1hsoY6Z;H3>`wzWns~lmbqII zN1<=pXHI3b2C`=3kr0cSU(V@3HX2>#>pl{uzZ^<=^?mqoi~f@26qTPy3gP4X8&dHF zUb=^;Q2sCl`upbmqsYC~a+04?Mn=t;R9bWOu)sMqBX}w-x*J~j1*<5AM`H+j&w8YV zBoz0~j0F%P`K1E*#?s&Igw)Kyp9GiUj#u9!&Y@)bw5F;F z<1wUmme1TDE3Joxf>wd<9)aAyz7jSuM4mi%*zlYDpIiWkq)!uU*5Gv_E8WJk`)URy zsf)urP|LiZK>5~>UEuB@nl_baWUi2z`&)$^7lwQ*jWu?S0L*L9srnO z8f{Bu=D9E`_FO)iDCCHfXntX#?ISCepvHttwmyykD;&b$+5BWaKsx5QGSH@Y6bo53q6XG?A<1Ed6A2ofe;n3{#MJ&IdgT}`%%Q->i1PVcG4MHr+zdW*JTaywSp>~ z2WuG*s>JfcULa)~ELw-H<>GJmgtft#3yxkU7klSw4DNCXx?5|Sk}XyBInN}CjsAP< z&BVI$NHrT)K^-v(FBz8!k-iNl< zXAZ4RJbd_2LhsqLDIf_dg?i&$A3mo6w|c0WE6kEoSo0a=1foaIWTjlHZvs-71z`tPVYaB`b1?^F?YAJ3tOCg^*A1nRmSo@ z&pU3zxXx7y7U{%Q*x~Fc4?+E)op0mu4j&)n^b$Z(&jAd(NMJqxJ>ZGKy#w^<$koHe zWWi>vYS?cNn&_t$eO3GCpBhpXL)9Q}sZ#dCUa*6UcnyBp4wF zU8z)ym)cbialZ&rksaYEq%je1%!j&IqC|K+HmXZX_R_qb;NQh&_Y6k(Jm+k%JGyZV z2;LU`v(#R=e+4M_Qoy&mG`!H%P2mHA4SeF{0(~w}jk%le(2R#ME%a5N3$PsFw#M}> zExwXN)z%O|D%W#Ep)fn(5f%5X=wA8Bh8lc%`;dd<9OP(b7CDI1lbG7s6*GfX)yyCF zvK#rhMbAZW9IsXk9Xm?%a*63ka}~|1db|BApq;#2hAJ8#91zKwbT?TpN~BK#|5%5b zlG2SK&^|fdjdxRMRMw+|(PYP9WRP_+C?MiuT)p+9oU?9&a%kB`=Ml~RnYI?h@Whwqr z&FjPSiGfw9d_YAfhWFAQADJzAY6UlH?QG{y=2I{*#N#o2VE?CYv22S%;^={DfH0Gd z3QxJ42i!^?kTQsdb+OsKCsu(o_<>>-oXUTPK7Gg+U{f?Iqf~V+0Ss7j-lH&E@V;H}{t-}i zPLGiF_n8C=k=AZF-QD8f&(g0=O-*yOvAq@gT=`l!!wp`Ae=!r}(hp0ktCONc#vH}T zlJ?!+vqa&r9rn9XxRHfCf)G4nq2b|=if>gp?@W0`l(3dw`a1|d<#pz4+gVooJBj~lrT7FC`1-+Qkk z47WgonXQhOuHV*@PrspGGP*5@=yF2f=<9`zu_uL0h~1@m)=yOq(CTK%1YJ)o_DNGn z8y=bI4Jn?@06EjH0lY}lf4iixw&RjaYQpEyQKXWOsrQa!Zlp@L6-jMAXJZ+mV)_dZ z%AzfabI2tx3u2L6f<9nQd8?p&J+U}dP0pbrl#)Kc8`+K>!r^7&P!voi{Bas0UfXu9uNKbH{9B$YSAdmM< zeRHQAm)w1>jBlJ({wB!C(iLyyfTH1&0-*#y$nRK3NQ>8zQ0xkTS;Vvnr-$a$)zJ1u zec_*s%K_K7&ukvM6*=?$3OLa1fBT)ujJarMmeZ%0jLkIFxKgeAIG>LH4_j{; z7FF1VjSk)2-JK$cbhk7}r?hm(z|f7Pw3MKzG$P#%0@5JeAl)_0oXz{b-}%mub6tAP z?3vA;C)cyqz1F(d9l>N4t%7WV6iz{ei~oLDR~sEfnh+~8qP!UUyZK*mijVhFsssl= zdF%jB^{mqqpu8GoUh5ElTn1$RcwGgf@^>1*l`8>ILLQ0&uZ z+B)>oCThUTWiOS+GDoLkz`+WjVt}F3r2t1nU|enS`C;>oUXvI-y%_s;RRj@c*&8Fr zDrFr;ke1Eg|9eahcSm#sP8ZWU6aw#&Aq5@KFpaXTb|X1$)C%++tYpmlbq0 zb~Pt9!)v2GKlw)h=KjLsS_{S4A94Xi6+UPj&)~C`;x>?&T}_1JnEQrx&bn5MnTQk; z)aS6*M@2tBj-Jcze^D;Ace-95k<_S7ZrD71V8d5}SKWBh_*W)xU*1Ds{ zRiaeTR#sPU_%{3RgRX{1nImAHeFEG!$6p+CMcvm!*Bk_$xJlIn)Tb#s*EE|~T*pdP z(glNVPiS8M^#%d)^#B5d-^gX;Nu1nARV&MBa2B^7&Klc*EoUCxr_|KY*cU9CKMr9Y zW~*9tf1lh4zMYNDpyRPZor595;=GDP+bBRa8>6Q&K9z>&Q@at)iu{yK$A7w;+z{9^ zK1!${on97}ysvMnQ$(cw-hyUWm%c>e)D-)L7O-#tcOo+KOC2)<^KbxB?`^J*nPxSw z&O!hI=qGT_q^G7%zOd?vBuyWlDVsi6cYmFdmbR(I`LUwkS_L3nn zfU*7q+|@^bs}>vdCP$#Z-eu{PePCcq?}j@$G(>8YAA8xgku#vz@Ysat{;4^++`FKcIKXYcCj`s^uaRV@o& zJ2jXRROceb>;%+$6Yfm!C|McxT)~5EjjxXffaG4XFf?rHtgW3?s`3NEEdK6zUIQ!u zOBB(?^6>CbZaN`t!KsQU8w#CC-1f8PMq=b(MTp!EAvF%M{u0id zBCyx65G#tAj4Z)|2`DbgTK*?CsgP?rCqf-KfPX9=$>`9e*}h2igyE7wq2s)2?-z== zvdT!JX9Nv*$8EQS=qNGJQW6gK`{nd+*UzWOYAWo6f2dCkY?0+KJ5pI$Cn60+5k%P6 z#S3rF4uo{lVMc{d9bUTvt`9&daHM-_muOI?^R43T57{!ETEHjZ1RC+!8ZZL(CpTy& zu)Ra6Sc}@t+4;zR7Vv@1-EJjIiPqQEWjr5Bvra((A!I*)BBJ*A6X6BRTUP+bQfk>4 zAIw8m!L^YE%TBQj2Da0(rmJ`pvM!dR-=|S802fz7?gID>bCMoXc)~DdC&Ww!o{dkj z7iH15C#Jq5tdnk~m%jJCs zp_-ojS-rVRBTXRmh1c#ICxBumQMK%%?8_HpAP?WJ){whkZtgAUKem9+YiilFdUe?h;&8C8qNU-*c48?p-$MiNzKu%znldQM(=Zd(!G<5Ql!qRKMX%iC z#}NQhlN#u-8{ipq6mZqKhpr=Y(1inT>r7-iQ1Ibt>31Z?LcFijIVm6L2~w^#=Q`zO z=Q<}pLzu=<)O~yCi`SW14E6OtG9L;K7i2SIeh^2FIQ~e%2c$aHY!}?$0s@_387K&J z59(Sg)cY=~%xv?Ne$AJfa_#1QuolZ`345i-1+cOUQr0ron1TQ&dxJ9dgIZv0U4PqMOXTOj+lRQZO&YNZhS{|>>|=bsIOsSZi;MS(jA36&{8 zJz1Ln7zpq=*MULI4&y|yyyW9k2@!FPp*1i z4H(}IIr@Hd^8Gc0lz{AXggV%@%$(E#!=VM8Vgf9Q9I@*AcWWS~0=3QY1=9vlCt@Ky zJUk^1asfJ9d11}P5C8&zU1j8gne{b@x;hSUG4!`<67~N(MqeOI)-?Q551RXdsn(K_ z>{4_{ALS}0$rt08OwE*q@C5x%OkXW8W2LSwFN^<6V;p)Q3k8}VRslgsRD4Rv4OKxU ztfN9Z4@>ablHI8{u3X;dOVjDAe{nZ5NOyjge2=e-5#`gphLw@e#lu6Qj}V2&)TvSG zkN!N;nsZV{aG)m&JK?)r7XNd|02A)9r8v0@iafyuc$q1t@LZ{jmw96Vrw+r$ z`gs8oKrmt%cR>)OQOB8pl3Renw{a^Ya3#l;>-+XZ!n~aH0^9^A_wTEh#_0HFm~PQc`rQ0X9tO5 z7!WG-VwkK1a1|C8-%2~2$-F+Jn<@r2)>+DRwUo`%VMGOFifQ%XD`M9%yEdT1aA*RC z>%tLh-=6EMJh?Paq$foL?(@O)RK1^Gh(PQS4-e0Bd3qsOd|6%`lG?QJnPCHrWg*fZ zNqqYXzfUW~2woCX0XYXAJ1IBUc^6tAis0^w`(qXppifDn687|>-lo~Vd?YgD&cwe( zqqEr*e|!4|0G8js%6sIXqYG>=py~$>?d&}n06l(95s~y^xK}lVO;HJGTxfJODtS_v z%~8)}=JWya>@nbW==t^YXJr0+SJ&NLYgPcbu0YfNPv`iEpJz_^@0BLPRT5~p4Hci< z5nXOMEEGe7IPEA}#&-b!Ve4M|eQypEhVTQEEq;sPko|=iAv*z9ELK$Y5V${?_)Pjk z%oZ*cXQTj;2q*GG78@n7T50QGI5htiZP*5IVrfeot5JuP8Khe2w5e!1!qmJ+K|FNzc>80W-wE|Ca-X+SgOgCqTG`hMXcBl}Jm* ziyZESBB!4SRJDj_fA8ZXqz`zvFX{`?ZACw609+8dHmb^rlSoTnw1d(lO6F0^|u?da|J2x4`^GvsyfFBbz5Gv*%@jLVHH`>M{bKaZD`I zYZ4txp`$Zsp0{FTEUBfaN0nusjvXpi5Z8TwF=qGjm+Q*kQ(G2I6UO6RaTK~oqFhaMFp87$ zz79{lw$Q$b&mt{I!8v^7<9gKzW zvpQT)+JTr}rc_xBls~HA&kdFM#tlQ~n2Tqe=j7$ZH6gH;%|0&$EKW{9NUIb@>fv)1 zp2=h&%71ac5~BtVE5V_Md9?p@ALoJW6=tsdpHvWXnr&3%U!>w3gUBd`HKgDr;ne=+ z7t1e0&zOF@yOP%uybqP*#vhkTyh^S9-@=!f>)Z$AD!9w2iy70MA1*N*Gg7$C_PIux zH_X2o?b&*ONLk#!!)c|%1~w@>JG(R>QGpeVO8x}t*yn%=hw~x^Iq)mRGK8T#D!e=P;jLJvn zB@g${0RH|?daiThf3N$+h|#nS1AepUNF=4X*lh6wg%NRsC6^90!0L6Cj7-EtI51`C zLrEVZV3RsFs{l?v(dWqm*qf_~#Lvf2CsE7euI4RaFgP#y>JM zNnK}1PQZXHpqlVZ3!oGDN60Q%$}KHeY%j zA(pjQqoOV^FHdCAdN)WSmHyDeApkf=Nb6uxnf5>T=^7lTzq}?^`(M;C0ghrK%Ku7+ zC9=v(pn(}Jr(02cdc3^coY_TlcGQfbKvB?4H zYc3LQH_`f9Uj2d8atWiNo3}y&QFFaXdM!X87gC=qo7*!kf&7mGb$B~{ zV2?{Ww+Gh=k?D&+2qYASkvhy5L+q0RC}V7g7K{WRz_w3Rix0vj=-FLv^`Cte0-u_2 zscv~$l#!0KzQj@4 zJ4{Vrg+Qz0_^ZIqvGJAGwYgi%M7#esue@yvUFK@z<4ll5zA8ORNzCc#1~S=sD+~ca!i0#~q6G3jv_aXy<)2_ZN^ae()7-ngFXMLd>}<3R-eDO$xzJKb~j4 z{t^NCp^^C~k}7+qTdLIr{GR-W8FRRG%$Bv69x4-EU! zL(hyXI$do^*S^J@Tcp%Z=Tqumz9E)Zc*sf{m(y6oe%2#ss5Ny8v`+-+mH3j1L3@qB zExu1`->l4n4=q$Hvt;2l$nPUW4U$ERd_(?Vk}N(cb~V)U&%I22FkoX}Vjlq3YtJ=A zM_uMDE?Toi$FPfeBxeZ66+2QjWg@t85D5+bf?7e$TJ;t>ay#RCfWoUNc{n{E~Ah;(yQ^|HqN-v9> zw3NqpKP#rAjK}w5Ss&$_a+o7^6lB1Y9ugtgj>%vm#88$GWs{{SMO6}&3qzO3*A8j2 zmz8IvOaT*BLI~6N&wW*Pt{I;uEW_T)c#<~2kwV2S)-QlL50K0hL!~!{E6vTP?Y|RC zA5iaAUO7FJ&<3_6^?lk+oE?w*46-R8ATvLHtbGn(1UNUJL*#+@@mQ(=QgBoBRg5JX zK{YCca)_Cd62!nce+MrXy~_!-i!>W zlbS6TrXtaSjeM64S^RMW)4o(?w> zyx*unO_1Y8V33K$=%`>R_F-ae8khcq5I>87>u?<7g>c!KAQywrC}m0$LuHS4r3uAV zDTm0!YJ|utS3{nzWwsCaLf}MG^RrP0L<%Qx^o=_g-h)z{Y-cvU{WgvG+Brq zM;2l09}ss}@|wbHbKu+c!Os5n}82P2U#X+8V7;YpXZ_;>&p@9G95k$C{rH zmS~N$*_wn}y!_RZ$3H(2EOL-=HNaU@Jb(CXQ@Vc0YC{U0b&8sG+TjJ_*_+@zrcM0v z(ttMoUXb#gm!{H-G&0*94f11lYUw@)v0{V5XSYYRQ!ChQ)`82WIdhF zVvoS;!3tx}HL$Vhls*DbbC0|E;?Yt2uVwsEjAu>$hSkRQ)(lMe(Go6Lzd3rRtdz)26dD}9ZqI< zVD$WCVg@jrEzQ7Hd7JZ#k~{kR2VYPT2+`FRaA*U|9TYl!uwAhX815&*8$D6W3Haa5 ztMLxMqvFdBQGHR502mX!ye^Bp#u(^TNj1!R^_AD;i0QKWKo@yEN#HFWDdSj*45pig zLwwOfRxr*P=;{zTL6(Q2?){_|+34kNo*coq2%-YK)lqjdPph4DQ9?ow0$CL%+>3YN zHv?p8!*Z>?hKXvqyPv`@MVI$wU*8UknFFg=VVB_DF_>`# zj}d|s%3=j0V!OBM_G?FHB69eKITIPb=nX%Or*n{ey&6douuf!L zVCCJ_6NuTm>`)}KhA=|T_Jp+r=a#YH_a1_5!!(IwC*j{f?qLQ19$}h7B89HDZ_bLo zS3-(x?XkAj{+{gZ&MxA9p4W%nFLLRE#g^sm^~9Ee|+*^D_y z$akefi<@0!X>ZsSi~KHpKQwzO1S+$=CU(bLS(R2oKI3Mb;=odTvfj6dg}R4H`)m&3 zC3IKFz9_L|BCssNej$NJU`-{9Mj;ol+k^dQvkdYy@^b_-( zfU;@WQn)-7Vxr^o8O0+5X4#+bD1S~3{WX-QmT$4hddS5;s0j*&fAVCccfXG^v}a_h zAY`Q{b6OsyPdvenLEv7?3J5Co?A$>aMdwMe3QKfPXe#3`-sbYvLGJ)Fes#mA?*NB0 z;JdY{SU!sk!_gRv0>cVdSW)=tUp$x7?kWNTk4dQzBc!(nG^01;sUa-#+Utv(!>3f) z@rjdj@TjD4R9Um3o-B9CY-%KQhBbgeJHD_SDVFXYkudR!DXgjW6T`|~9B`0n2>4I__NQWk>fJpJtesC89OcgRc_f5;DrD5%l?^S;I(cm$Ave!^Lv z@B=nXE~JGJ%)v?p#0r|3NfaTbgZ}`YjYl3M<32Wvjxs9EAGeXxud$T>Xr;JC{7JGA7ChA0oG!U&x!S zHH4vKSPlI|#Sbv^FAU25k=%4>S@KvYKe`uz-B)@FpBw1C>@(^D%O*uWBhrN!KrMjy z9VO`)CJPG2P5B`xN#_o(9Fv9l;Dk?FaG0_jQ88j=NXzf8{#Ix zH4pum`+R(pNHje@ua)jQ0Yz$J5YRDo9K{Z4ivcc>>F$s8G_Yo*ND7hTD$78fypS9F za$MXRgQ{&D$}xpT<_vDX{3zZKwXrYni|$6nchVUTWYSF)Mmni(|7kIuLadWm&okVU z!k@#(D)ZLn9jdk}M)&^9d@N*qp?h%2PK*MhSodq6kV*P%bP4A=+}dymy6j&e9aheb zQ^izhtn#+=m%h4Yd8q7}w-)yz1MjW!Q*vx;7{(P}8+hZiRF+XZ%p>hv{0*L5ZN^p- z!biNeOJ)Ly88|(h%@`Jnj*FRDiII^iZ6=VmtlQi(X)*g z&k{C<20CA2+qADoO1KSm-aghC~eG4OlYQz)f2JHs9mE=;xW9 z2w*7)OV%cG@99eTh5bl_dKV%%M8-I2Ld$C0F|&@g9{I?7CKxFpDXLTU4 z1FOc1JArI67ykX}s4HH@^xu-+L$Qe3V?YuxKyweUc5OzaZiVkMOy*S-0*)DOxssjd zZw4H?V!dS2)#qA6d$#^{>Aexq;?oZlX0$+G(}*d(m?jQ$8T?g%|&uU!dZ3nM48-Wy_<-b$s}JCJBP3NcaWt2W7U7yU8lD+ z%yY)mm1K~TMEJsSRK&_}9ghamBFe_kfqE)yqXA7axktPCnP9gOWnj@wL1q!!pDe+A zFqHtj^x0`rCX<;5qrAHq*!uMmlA;IOX|$Lim2yWb2)foceOjPPd3jB28ZhC;!qp4S ztFn6ewJ`n%tc_Zqueuxhn6;j})0zIJV;RQg_c%xdn3f1dSnQ=f8ftH|kc`Z5otsx` zKBUy>+0rBbl*^&@cy@{(;goe%K_-*epL09Um)!iTlU$^sHRNTcexXrmzmIjDCUdmwk_71 z90QB~0v~wy?I7MptHBzYY5UM{VI)cdS)6(Fs9Q&-K3Bs~0Y9!(ut{>IOHA!n#Kc)o zZr0i1V^%D$g)2P0^=T`KK%wgwvjRhDApsV5XTW<#a!te)8DTRS-?&Z57ful-&dL}7N@AL1@L@g#7{bj;tScPR& zQpXDs%%5@&X&*>3uOvP9o?wUD~NODGk?C8TAtqGus=Pz zG(8UFc?@z1Tiyzr6l=dP)?rupSgpfe96^}1;*Rvok1hsK*}L!h)#~1~+ zep37&0#fF3ZPiIELbD2>EZ>x|{y@~00LTOddR0dio?jQ%Q?V0Y^||;JY27yZM&nvwOBe%ge8YGM_5?AAeYc`s`VWw>wAeyJlz1 z2s${R=t*$98s7(*HbVW1^0_lGQM@U63Yz}mPL7=E4102lC?qqtle#3K$!_cNl5z}l zSjVB#H%hsCHvVTm@=xskB`O##dT1>q0+}G?gWo= z9Hzd_4?Z__V9VyeB&)Z4@6tPs7r%Co&^3)$Ra7B{x0S0PELWzp8ExXKG@trbZ?(~s z@c#V?B)hKBC%lBce1@|E{5Eqxn@r90eNGBOxbqImMN+WXUT`*tglgsg^ria};nHLp6 zFH{~A!U*KL0JY2N+e<^N93)cf(c@^J8Hx&p-z(DP7}ytJXQ{fC;x|eK$tXf$1i`}i zons-gMxVg%m))q^y}HUiCf81MTo8sl&VRhSC~R1`JFvgIt8DD53&{^2X1N=CXY2nj zYR`RQYg4{=_3}>j<{Mc-uNy5_?_!oIV&?VMR^w{VfTmP$7QCY04ceuX!bula`I(5D$qdAaf;o2skc=K}Y1tiUn>>la_ICC>ZY^jD zD)FD2^m15?7+lr<4BDcp_l*edc@ZAQ7u&dXQv@K0rDH)h&cHU0b+exW5Ub{QAbdH=KUu-weM9IU7RF1hOk;2WxDv_r))JJtAY%x1 zp?GglI-h)4f-4%U&D2XxrpFS!qd5 zimkr2Q2Vw5?95UXQcmm#6X`gVJ%wJ%9nIo>wBC8g<#A-lMV^b=Tl0KBd&iLge+a3I z%kdpplP2-LxkRCN_2Eq5*S}ez@_K57oEj=YI*gBHiPs4yys+R<8^#Hp>wF{YubPMC;7WBYi^Y7&*MsZa-CP!YWR8c z)_I}dT9{5*r0Um*`NRI&xp$W0=FqjlhO?ITY-2D&ZXVt{*puJ-&Be~q4-(A*(}JbZ ztolyQR;;nHm=|UKq#Y)=9D*v84mxS>71!j%8Hhh8BHUojv_A_6peC;UsdG$s&%ZXo z0}-scF4p^Yeta&cJa+)f?DtZG)4h3l;eHg;e)b?fWhBELansUH{&<<=Z)+ryHbAj) z9dNcL*V;AEj9&UAEdEGYr}1)YYyNxj)PeihG0WL~@aso1vW;}1_Z}xg2G(lVj|z<%UT{jcfc4k0!T`)+bXY%r0;d1Jfv4KfEevug^#sWe&4dd8L>+#I%eHB6@!z5+fJU>>ZFj?r#l`QOB)^_lJWLkPY zwXF^#>2Ytzm6$JB>YV0FV=`=?@%LqabXd)c!TxSSV#(t-uOVJGDskc;|J# z*m}A#nmi{{Tq6D0_WGUqiz^O}^0h0W+>Qs@=%Y9MZ@{}f6w%!S!Y~9S6Sk>AyREb( z2$H=f-i`BO_}Jn5?mHuX>?A-xp-@V0*j!O6=*ll^3?(UM)A^Qhw^`W;l-&EXGV@_- zuP}7XZZK%@`&qx58$fQ-G5Ziblvl(L5tWq7})f&%j}2*e(Lv!nT=sSBaUw^fGlgd z1sxu;#lsz3l3&J-If)xc44POnXRf1yh zZgm!G-Q&voFb3Y&X&ylJC>)G7p!u!`MWN}e3Sb9J#v9PfRDgg}+JQ^{jc`W(5K1#C zn!)FLO{Ab~;vdX^w+15c8oLYGjTa<6KNKG z!GvUsV3eO(0|E0E7}1%mpwld2KE&het#$+Ru=zcdu|L_SU|NSxsj3Lj6bvP63~jXT zb>I~{Eg<@V0zc%HK1uGcsmtM4YSiLjbT?NRwMEBG0sFC=*xzU`)hZgDM~myB;Dx(o zs3enP#6*H&|-(;M>x5DCGL1>ua-uh}^;kJnDSC=6hP>c4RF zB@gqnm*5?bC-1VBz2=L2%JeulZUT#R*(X;HW#_}T7S86x*dJzh?i3E(Uf3V-Xt%;2 zcSB>O3rvxn&5C+W0Qjl@6P9o2Ipc=%TQbN2!5Sr|h$gh$3_iN{< zEIPlnF@+WJOvql8tO;#NjB?RyZiw^U(iFPKk%hMX+f?hpR1H&eHH(a%=#ZWT;-0LG z?!-fy%p}~KP4`cHd$uk%6S;T?`WEdYtQ^|T?{sHw{N}du{3KBm7SQ8RBHUK*$(PoQ zl7(p@@z&&&MD~SAFRPl!X|u>yRy2SFZQw~~0Z>arQhgvgW=`VKW4JP*sA!XFvsjDW z{h&nQ?j-&C>>liYde7-k(|#7vcGhGH1XFu_B*Ty_#FK2KqE!->41w7KiSb7;FjG7! zRG>_xV2^x9pNZ|7=a&2XXHHJte!(m7pwKT!`JBBvCGyEGalb zqQ7|D_Ibt3z{moo*h4>7JT-RSGjtd?pqjh!h1_{!6$CwAOJ{rMcZ)9jZ>$KPU6a8T zs|O=;TWJU8XWa%WpQ=sWNvc|`HbS2U9w9*m54-)1lgHkhm--W1QBsnMPX~X+z9s2b zzq`D2vj(5|+h|ab>C>AQVu@NBahtytjvVJ&xaVD>^1kQ6VCZi!2(jW?)}s@_XZuIv z)ze(eG=_k;ots30^f6bnkJ0jaW^AUe<&R|z{-VzlgwB4k`YN3Q*QeJMm!u8tgLst7 z5Y@WJV9y$Ivb~#^p(Ly+R^9LAHMGpp=F^?lb+Q#X^f9UNkI(vRQ0UF$hKIjp{gPFK zZ?}y=$^4FN<8)X-0qxxZ2m#>I$oJdQzq`o!SNP?-H>I9na9q+48*~Fb04dtS;s)_ zs!3S}{Sd!$d)TksmRtD8TJJ#2d>YaW@yD-C4G`VO7fqCqNRzz8=0;eqKK-9))iOfW zC_%?dHdJ4R)XiI*;(9SNVZ7)~Bc}D90orghM9f zkM{fx5F(umd*sPbMIpw-gntVm!&Jp6iw_Ui={ddK8jp`zu&6SO*E17X4Y(W5-o^rG zD!A2^Hhi1;9}7&*3ct=3-Bl?pT+PM2w%@Q_XxpV(zKhYhS?PQmM;Pe^MC{fOD{O>E zVQD>@3fZl=lStklV!ig7oV6rJZ6^)-?K2)z^EA=!r`@`C+Iw>iM>w|knCrPO3Jw8V zTv9-P($OaGmAb&yveuHS=Q_{|E!t$V`Sj7^ZO`)9=;GZTAD==8aTGiWJ;$YpI8_mn zjH9;JPC|_kEx6F+pON&bAUgx0txdu zG=2L?8r$R+WiRJ3m0pC6^_)NiFtrT!Gc#X^&z!H`pFrK;O5tsoo;)k}OZCX_ zh0Qf9nFfE3J02in0uy**E^N&6sc3~Zzi}JYzunxXFc{T0y;?^e)~ z)B~AeW|VQ+03R?0weRYR-%Ry6C)ILe*`}es8?@QV8a<6RE<+s^$QC_CES<;?H}~U9 zwAbjqy7$^RIF15z)BrVC(D6;t>=cGywHWKY>>qFXrt;}koPonARtXZ`EG$62Vgmel zib>4r{_m%8M8eizHU1zouSWBYLHdi0lp%$|n-cpFV~l zQU|fs=wH9K9NxR3VbMGOmA5GnCTi_ih`lQO6n~ZIO}z}|VV#gb)8%Uh*^d{-)bn;y z7q&mr>WR|)d*#+mMmM{@D+MROYriATlUPjL&LB3u`=MqD}Ve*k5)WA#S+M%7l+zBeq)t)>&jWnvO~S`+0M&Z;IsnH#%$kV z=Qo{qJ)vrUx56g&6dvd3il-0GX0hC4i)ZPDI8gKwy{w287=U+}m8cf&XRO|$GmGK>@Hltz5jE(AHB4apzanDTJ_nbrZq4nF9#<{k?OLI ziw=5oi*k7TXQTJ-=E?Y~Wu^Ra9}8f)o2h)H7L$791DX?9`O36zdoI2HX_nIa*RKJ6 zR=Sdg&b5Tqr;?N7}NNp5_K54tZ{O zcEyXK@sV)Z;y%8r7D_UUU=m_X5^03nwlnyW*yUMn)pauDM)I9argEZ-wzt;9`@iPK z8SlA;=3Mlnelcq|JAFUY5z_xgX{;~vMqibq@>{XqyC&24<%Fr5+^<9Q_1kZPPOl%C z2vaEuMfS>H7w(-4s)(%ljQj1GO+Qv$6EqY$#(r_c_V=g%=rmX4nxJ?^DN#{FG$%KF zgB9}x>wzi{oxaC2CnG15-nclTvtvXVjnJ+snx5_Qo1@omKrU3<=-6w>2^h`{t>%r& zY`Ekqfh5(KfRBO5NIBv zg~5Z)IT2}p40o{n__q4JcIoLhpp6ul1tOgtu-`NY7r28z<>IhBD4CT!#xrHrPaa&e zf0xzLQi!C7s7dn`V^Ikw-#+~*i$Vv(9qNsTP>wY-yS_O5(mRd z9v*lde(`^O&)LD^y7W(Tmo)GjC#R2z55na7uAjkLQl={oqZ2mMK-CfYx zLF?yFyYS^(R?-e2vAguLNO?Co=gmN^u5*5){6E2Ubt}xPt<+cQ_opLC(jmXT)L$jk zdH!=gnDzVIuPY&zT4P7lkSpBdR7*%s9=d4b8MTd5D@MJ&Yc8X$=kyAaNyH^g)L`=p zYn5hjCQ^zp2{?o6&L_(*fj(fKti_lZTNnOL=<_m=N zU8Rhp0%_b#!=lVaifk%C&?S`aNB`%ff&m+W^G-T=fByDUxX#|wwuy3m zu#wrGHBy$bo}{sh+McfRVtzHywnel;3Sris32zl-m`JqNU&UvKqh=V0?#Q~ zKR#A>S4OWJZ@BFq5vA#7VDJwLN)Hs;0-~Z20j3DxZW24I*0hh)c4}s5im_}hjav@O zzR2N;5-~ZCu$U?uZ&Iu4uU=)mNDr8w3WX76X7Y!*gWLq_6%&0NsbJ2qiF^^=fB3T| z{!qR=c!;kA%uLk%<}RSLw>5rE(ax^gSR*k>1 z+kfBP-(8GGSBftd<8(sFHMiy}Q+-5l+!lMtA_fVySTfKGz=@7AQo9$4&87LRLsNKF zws97Pk^0_7&36~OE`(O`bTfY(z3gPknZ5IP3gUU@?%%2p@dk6~Af!S)axT}^?d+@8 z6+cyQsTHcKrrNq0{O+m_GBdyth`0Mi1`cNGOz`+DC!5Rj`{2QW`^mV1*bGm$v*gq1 zCrL=|_hKi`#RH0{7>#nkRoHmbS7|)vBWIFDA8XQ(`?a+}sXf=FpAEh^VoG?2N6Qs~P{ z!ZAjrS=8@@xVD$Uj08lA*2*J&gY#LG>b*lv`HFKp-c!1K?;5%8{Da;#F4P+HAm2Tv z1#S~h$0TM<5%Co}QevEo4Yy_d4u3IEXA}@jVhAp=+~0%V-(ULz za=!1?dw^&jFEi-jK}`{&>zk%hM81$czpN`aL#(6mGPn4#=!7iP6-OL?)4XF+t*e*q zul9|!Y<`(FiJOUIwJi4JS8bAU>|3e%%6`d$&aAi755Z|qp!d2$B-FS^N*@4I0$qJ; z{VyGQr5Q@zm@gZjiM8`9DuXFLFHbl@-z=r3zV5K7C-t|YU{~pBK|TF`yT*;f)0i*9 zO$v?vRG3%lff7beb)!NOusvPcC%^sQ`H%Nx@;4+J;Lh})?MmO)^}|ecITP^S$m{Ay z_I|Lb^?=2!ye3Ag%eSE89u+10b^66TffWihqb3@7W4Sn6yTB&5mX50aB+Z_y`g;hY z@f(t)|0BJ*Kdswjr-`@Y1^v^U0j6aj5t%P)|6zz*R{jp-(}97nJoZ-9(ma}2-sW{D z%h^~Cv2Ra5o-_v*N}*$SLC_J-O;iFNenPdlDGl+FUU0-0KM&Ym@psNyN+Eg?78Io( z4^ZTnG!mOHK_~u7}WqldNUAe$Jm1{Bf7nW1S~NV*TO) zFC3BkX~}Uhy`H~99tp16k&QX&RDLPMI;k68b~V;(O1$$|!0HLOTH7QFwX2W@FXx&J zB<&BslOJVxS`f6wRby4p0zD*Ba%vnspPJw-`b0n+GHYOtEl8Q^OlCrYEWO=(^8`c13)Agn_#j$ zi8aBO4~lFyBmc(n98 zGs8U;DXfA=zGA*Hn^)<{uF>C}7HDw4zY0l9Fu6?uv-b0}%s0xQAd^tdZ8ffi^g7kH zm`-m&BzMN(U0u>T1`su9mYN%dFsf!AdrLCi2fO-dCuNJkWNJo1_0LulAM)YzGT{;7 zMla8ac0X>~l@ew#ka*Vr)-%XlCI0H4lhlgW)wJ|*pF3YyeM&lCmvUMTEe{n7fvw|B z6mbhziy=!;#kt30@-~1np)#2!MSM+dW*s+Ld3${7e`Xl zsHjUaej*CWm3~cKYASxpy7Rs~Hy%H{{v6J_B{ld*#1wwwwkPE~&x^1&15b~mg^#X7 zRH`+9{;hC`m;JR8o;CcYet-4ItoB3Ey5$EJGrO&s=8PN65uHzS678$F2Y6`SeWb0~ z-3q3{)9w8T*i|jib=SkSjMjjM%)ADy!p=?N093QGmFB_Gp4hnG5}ofvbKH%i>{lmuc54TjqRr0h57fG$5YKIHz*P6awod~kAiYOuJ~ zneY??O{)orSbcXNi)SPhLb+te+mlPPyZ0rFr75nbGSphitITdY6vkNMCN=kTgSEiT{Pl~K z`fz7ax87{wh>z1*Eb*J;K`P6040=!HpRrGU0S(!yawYv<+HUJUEJP7b3Pk42pMFaj z(5TUhT77jo{%3hna>;ZZNBzg5Z{WAjqJ4?3e%j_Op>gM{;)Wk`PN*D8<9|L+yx%-z z;WGW#KT5D6+mWW^KF!wcBv)$h;k(Dc{O+5aQQY|*MB+9NuE24)!P)Pj`QuY}rNGYw z)^{Hbo~RsG$9C-fX2jNz{qPXmu~~n)F2Au>wT5*c*Con~&>{I7@xz8YS_3oQv#m-{+@ z-p6!p_8m)0tdugQ9>NrGXs$I24pyLVbw`-nf?qGY!CDC&0iI#MRvcP!|1)=sskVU2 z))iztKLQ}`{Rki^#sfZQCn&&O`0v{$tYxvFuKs)X7<7-@j$E+W^bbR={G^GR@RuI;!JIQ0_3zU(9TolBU&+;?mCY=A~}g9Fn{S zc!KBQ6QeoVOETW=`O{w)UQ>=YJf;`{Z#kt*)2p6Lbt4QjaNAq3BF5z%lAQ9_^15K# zFR5XyAF>yk+XNP_8$xN}r*3cwe|F7fT^jeR43EukS;mv^ue9cpR^lLKmcWb3eDRax zLI=vE?m)93NM4hIEl`spsW?2x!!5aJKBahH@NWNea=8wiA?pxnT{jHb1T{o*l^G0| z2xIu@fBa+x?J#FO+dwnpt;WM)d^Dx`+p$WcWc+Fm4<4Vj_?s`_K(Cy5TgN3CzT5-n z7Jjg}uDUzzmJ8S__!pWKh$OkX3WZ%l$eWIERzoVu2rh%%ohL#PQHcT<8*V-R+0xi~ z|2&Gu@P*9Tt;q6On5?GvB`!4ZJ#08;DYK#pnRlMkuKn4QHh?W32~Q=1h;}&8Ayw@bLH$GQy~$rlPi< zB*pH-2g|doIP1Hf3G(?`G6a3OfBGk4bVFbH7OKT4g-PjSuHu| z6K}NPm=~!~Og@7+%_o;HRcxk-xXk!+etg|aYS(^kC53HDZCYs~c(@V&&XP#Ne?Uy@ zc!k^f>g;KMKbL)EuKe}6_rt>vg+vfNHo;>uEB5F-RPlQ`b#GS_`-yHX1aJ|ZCh)Pl zTh$&JSxD3vevt>fVjuZbTs%y@jq&Shm!5I*gL%7C0YN7VUV?G{TyA3c?qn3(p@#Y4 z#|PeUxPTU@v6aGh`RAJaVXQ(;U>E-8-#}KA&UblSq&`{KfUyExW1V2QvOgwUNaH&# zhCN)=ZEGm@=g9ttFA5y(sTSC6p5JSUUapkw2<*V5RgxPPT8NgEy9^dOSL z)YQ~BttIY_P&IEpQOwL}qOs7Qzt>+p5Psfn$k!#qQ4&Nn-7DKK^v^=WiIs#`Up zFClv8Tb11!zOHDS3AKvfVfGX-aNN~6$Cql!`+-=N(J9X&ky&OecVlD?G>v8+x z41>tUP)Ml4K*v(a+>hHQ;W0g>hVpx)bkMBlk?x-4#5cI(njT&Mz1vg#rlG%_3yqfQ z-8o6KFP&7Udia;YixO2{qbfdwut?1f^P+3q5N2Cyss5+SUrlIG#O7$r;tuXUgJhyp zf5A8uK?AXmz95klpazpdTyDPOZ?S$Yu?J79?R@V*F^}K#G3th$c|QbE60mH)k$qQ zYS?|4)Xf~xX|jqAmvcO!dj5n3igr`#F)#IWi>@n+xx+=UzD78>SlumH!s04Czhb}S z#9OvCTQF(>9I7SxUBZRq0n^oDp5^&>8jZiw^bqS$zD~1ham$@aYC#4Kk<$por^@A@ zXeZI8K^$Ts26JLJcJT@ucN_l!Eh{s@X`4$oV0db?B>)hJgd{GGCKV-pd-> zvY0INCQTLa16d=24fEtA{J3-*uQDxwyTPa9Z6Lyc^4C^C4EabxDU6p5qh_in#DZZ2zjp$|85 zI;EF2OeDtvjb0z%tFMv4x1V-GNe9jDDtu^1{>(Gv^zxI3_DvbMPaIMwDm%|yz3 z9S*S#rY~%1B7vQknhUnJF;93LWR|~i8T|3=N1<3GuZioVB+n%4HuG%JxenZ_>_c&+ zd`s=w8%~dHn!mzwtL!cf|GAN%{ESsy$FF$y*~H-ttxecSB-DKB zQ`K03S?qYBrdaj*0-p~o*@2F6xb+Pk0OJFs-%*{@^N?mR7?}dTm|}W|wt(XwJ=OiX zOy{ZL>~I7p{XB)H!8CQ&+-+(MZoI5#kXBHCPQpo$tIdqnwO1-#?$msGz|BvhnMZPq z&u%F}*xE$JBLbI>{Bte~=ZeSixnRi%>o4KIQImUD0#r?l1MgiVFK7{ zU{#@u8TID1vj*dENE3D7HUy_i4zI2>=8A@bykiqq?E*VK&zfnssJsc;)o;oNigYxb zaRBNcOwJXt4s;!;bnwzI{N(%Aan-xt65iFMFpm7`ZJ*##7!&8UGCKS!pTlbwllz*w*8@CN2Zdx_>;YzWCs9T{D3am5L?!3^W za26L4s;O4eL_g&$W}a%6s;*oIT(zPQn{QuK^N#H*(z1d?nc6G)WARQ!8 zM^9I0On`1)$j(Ad{jec2d^+>}_kF{&o&IDtRMm#WE6SK}{QEO4tCB_hEmRn@Bk|TF z*S0U^iIy_i`{NHjXrPk@jmcVL@=dq&>0y+Li$^Ki%LmtH&5OgUw%E7ye@T~OvObS4 zQG;6E`++2IKE-L{g{p@)UO!&lZEi?N?={K^Tn4h94!#OCiXOH9iX%8A$})}RRsPOE z)&aCoeyyr@rU8)Xx6D^5V%QtlT2A;MP3$8Rt#;d&70dD)`tUr*-Cn7Y13&LpN`ZSA z^V5rs{?}%m6w8|Bq~H89v=} zuSmk(iFA&+)>k`scZK!xZP3&9&!i%YkMlzjoHP4Ao|VQ-!1m>992(|t#l9Jqt;2Zj z(-m^Gy5x5A9^b=U<~!Q##_6iFwWD*UWLbVcb4&$#yyVdRjW#C{tG8k^jrMpr6C6vp zh;xr?eLg3#)|z63NLRl7?1^v@nCL!}lBCCDRa3?x{8RSri)T`^Rh0876`R|xV8r;g z?>^|RiO5yZyRmDTaY%aeLeg0dn7K^WNE>aMYvBu&ny&O@y-jp8XV2d@&kf?p)#Z_o zP8mnLRK9HdFVd1B^jrJr$A@nZ*`0_NVs!K(zMJ*1Af?gIi;GF z5iB&qb{`4L&u&pRw>VsB8-*ZWb4^aVP?d(MI;3dviO|ZQx4YJpU#SIt?*7|7IwXnN z4>y@`nGBU(!UjLO^Wj%}6w9wdMXF}} zo#=6_(mw8Ql$xs$7b&G|TGYtzV=ShkOBv(0sxln-YDTX&q{-iynG|DNZ$)y%0tP<} z?|RRx`XmOwIpj_z5=OB!aM|yYEXCu~6jPQ-4|Gg_>%Ppk?6QZ53E!_P#`*MgoX1+p zX2W;&7+t0_73Uyqk~~p+ne;ogjxuYarYj4g(2w_^1~FC{L5<+Q({!i4VT}he_fjs+ zA~EETp0t-RyepZ!f$h{fbSCZ_9(#wAc9&ylTV@A47$j$J_S63>*Bd16)>%mh(eiQ7 zd0-$r@#8aOpYv@^n4HiS{H}9hd@LE=pbPCbllv4+AxJ`QJraaG&eS=pAua~hiU4#| z-@t%O^4Zgu6MOv=L4{1|g@Vf~?{$%|4~=}ZKtJ;vnRFgq~EA>l)tSEKscN107z%d#Ds&L0oDiCmB3j+wSCI+^?5Y2; zjK~p>nM`h5x34k~^SXin1UkH{qb@BItygFnjU_h**|EeCOmWYGJ@uaos|P4W~Hw?*bWv0apk1{{o1+@_!0gy*sd+DbJ3P z^r6CBcVR_c$!R_5np?`1t#o|4dNyYqURjM>Cp$;>7DB07^ga}NJx`Wpv-HvA^b~`m z!qDYN@?2Lr^vYd%gGzoedSaYOJzl>h%Qs7TYnY;=AvaG^(7|_~g+UxpvdE4M)W>48 zzxtQ7bv03fHPt(bET;$fO*(7j@?#elTPGJ|mjjM(=t@{O01d1v^K;%(dffXq1!Vtr-${ z^AlMCyZdU5O>kgiK9UwG`%;g7!u6bf7Z5f&42G5t_BJ@p`8b;h(v_9(J6NG`_}oy) zB+sQ~JFP^lo5Elu+pEZ9v(cx8{~Iz$bt@9z<3oqi*30-o(6h8?tD+e(w}=Uc_KZ%7 z-#=Mg(*G!G2-|c#NORVjjfpUJ^c7cyHo`0px@c}eWShJ0}utP*S;KV}3qkqLii*i6q0Q1p-f(3*4ViD$5ix+K~{D zks57bP+Y5Hd1SpOKDclJ^)~vrv7@=AVuF84DFJo67g8*q2s{5}4QSHcF_D|un;dbk z!U-m1{Sn4Y1gA<5chp_!>vefTqCo586g7*A&WQ!LInN9vGRz&JVvixNi?pyJD_k;P zfS|8)#45Ul3lR+FvfNAEvN2hy@miLpp$v3yiQrd8@t#vAmV#4Y z1Rz~O=0-yZ%vNJQm<5_GETKgfCS+x6rCK0~JH{91$m<=2D?o zRPgb~M;12jKP8dZ5+kG5tli4~s!_Tn@Gfl;@y>(}Qt%4CR45i_0@9HJ(A2>V*yg5W z6cQbca1YJzEMnHX;V^_jwb=W^pTX|qZe4&kh6D2Ahy zU5((+p(X?5>~5Ytw;&6uPO-p|Ta11tmLAOe_ECCoM=kV`VH2@PMmaASZuEbkZs1Q) z=Ia5MHS{IOXYCbzpJz~D1@ErXOlt-(2yt}s)66Bh`%i2Axy}jv3q^$ltx&$EQ9ugY0+9(eHRRiRh(uE9rPZP z&O;)#%eC$%=xDpM(i6O}=Z3wsr4@A@3=3r&j%(oZOP0!ZT}Z{*^fFc88>thL)N+&4 zl65u=HJKpI0C_#(TfxKupZn<-u42%{?mEgBc_iZHxkj2G!z~mrOae?%=-WtV#GP=( zVyU}xFh7LrW1xKDr&i-%#Cg*oCU*c~SS(hxYbUewT<+xPwJ!%Va^iT)^b-)pAphWh zLns%<){b%Z$b+@;8a5xI@{gwl7kx~C^rJoB>$`+A$Q4aj@tpH)HvG1Iq(1&l^3TJy zk^e6)Hr5LovTd`tAtEKV9qQIpVSpbbVYc#a@(4J$&usKFDAl!m&ujUMsU(LG?`q!m zNQ8uZ5Ks1|fhBwNQo4)E-lfRPv%iyPy7*xn(mhK-He8{oKH!rCxi!1(z*=S;8~KAO zSns{kupAMQhb7)#`KWGKO%rJ_`y)~UE^2g>@+A;V%%RK9H*NhGw4gWXbldg(W$Yrb z##!_XXN~x0_KMjYCefvS*+vM*gmuo8xcL0PUSwM6Udr(gKPbX~8d#3&N5wV{7Z!jedK;|dFUw$Y-LX&nUmLGGa&c%whuadu5 zkF$S#9dY6)$Pz9WwT1ZAzN^BHKN-p1tR%6WgM;$<{SM7S)|P(gj~b4h;P89_e@wTw zAp0cpf5cSi{~l9;3dq)uasCIQxF}E2RdkN>lI&%tbephEH_F^{w|9uOkaZK3$&Y&S z^@dFeT#8ra$fp>kn|lu*U*fgdxL1&A{5=p+bM&Qf4!&}3cEgL+5-$J Date: Sun, 16 Jun 2024 22:06:32 +1000 Subject: [PATCH 71/90] Updating comment and adding migration for human repath. --- code/modules/mob/living/living_defense.dm | 2 +- tools/map_migrations/4113_carbon_removal.txt | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) create mode 100644 tools/map_migrations/4113_carbon_removal.txt diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm index 5a515e0e9f9..b74e516c2d4 100644 --- a/code/modules/mob/living/living_defense.dm +++ b/code/modules/mob/living/living_defense.dm @@ -97,7 +97,7 @@ apply_effect(agony_amount/10, EYE_BLUR) /mob/living/proc/electrocute_act(var/shock_damage, var/obj/source, var/siemens_coeff = 1.0, def_zone = null) - return 0 //only carbon liveforms have this proc + return 0 // No root logic, implemented separately on human and silicon. /mob/living/emp_act(severity) for(var/obj/O in get_mob_contents()) diff --git a/tools/map_migrations/4113_carbon_removal.txt b/tools/map_migrations/4113_carbon_removal.txt new file mode 100644 index 00000000000..1b30ff494f8 --- /dev/null +++ b/tools/map_migrations/4113_carbon_removal.txt @@ -0,0 +1 @@ +/mob/living/carbon/human/@SUBTYPES : /mob/living/human/@SUBTYPES{@OLD} From 14c99d46f74393c1b086762a80939367fb9db38c Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Thu, 20 Jun 2024 16:35:18 +1000 Subject: [PATCH 72/90] Repaths /mob/living/carbon/human to /mob/living/human. --- code/__defines/mobs.dm | 2 +- code/_helpers/global_lists.dm | 2 +- code/_helpers/medical_scans.dm | 4 +- code/_helpers/mobs.dm | 2 +- code/_macros.dm | 2 +- code/_onclick/hud/human.dm | 6 +- .../hud/screen/screen_attack_selector.dm | 6 +- code/_onclick/hud/screen/screen_equip.dm | 2 +- code/_onclick/hud/screen/screen_setup.dm | 2 +- code/_onclick/item_attack.dm | 2 +- code/_onclick/other_mobs.dm | 4 +- code/_onclick/rig.dm | 2 +- code/controllers/hooks-defs.dm | 4 +- .../subsystems/initialization/customitems.dm | 4 +- code/controllers/subsystems/jobs.dm | 6 +- code/controllers/subsystems/ticker.dm | 4 +- code/datums/ai/human.dm | 4 +- code/datums/ai/monkey.dm | 2 +- code/datums/appearances/automatic/cardborg.dm | 4 +- .../datums/extensions/storage/subtypes_bag.dm | 2 +- code/datums/genetics/genetic_conditions.dm | 8 +- code/datums/hostility/hostility.dm | 2 +- code/datums/mind/mind.dm | 4 +- code/datums/movement/mob.dm | 4 +- code/datums/outfits/horror_killers.dm | 4 +- code/datums/outfits/outfit.dm | 12 +- code/datums/outfits/tournament.dm | 2 +- code/datums/repositories/crew/binary.dm | 8 +- code/datums/repositories/crew/crew.dm | 6 +- .../repositories/crew/crew_sensor_modifier.dm | 4 +- code/datums/repositories/crew/general.dm | 12 +- code/datums/repositories/crew/tracking.dm | 6 +- code/datums/repositories/crew/vital.dm | 8 +- code/datums/repositories/follow.dm | 6 +- code/datums/trading/_trader.dm | 4 +- code/datums/trading/traders/unique.dm | 2 +- code/datums/uplink/uplink_items.dm | 2 +- code/datums/uplink/uplink_sources.dm | 2 +- code/game/antagonist/antagonist.dm | 2 +- code/game/antagonist/antagonist_create.dm | 2 +- code/game/antagonist/antagonist_equip.dm | 6 +- code/game/antagonist/antagonist_update.dm | 2 +- code/game/antagonist/outsider/ert.dm | 2 +- code/game/antagonist/outsider/mercenary.dm | 2 +- code/game/antagonist/outsider/wizard.dm | 4 +- code/game/antagonist/station/cultist.dm | 2 +- code/game/antagonist/station/loyalist.dm | 2 +- code/game/antagonist/station/renegade.dm | 2 +- code/game/antagonist/station/revolutionary.dm | 6 +- code/game/antagonist/station/traitor.dm | 8 +- code/game/area/areas.dm | 4 +- code/game/gamemodes/cult/cult_items.dm | 2 +- code/game/gamemodes/cult/ghosts.dm | 12 +- code/game/gamemodes/cult/narsie.dm | 2 +- code/game/gamemodes/cult/ritual.dm | 10 +- code/game/gamemodes/cult/runes.dm | 14 +- .../gamemodes/endgame/ftl_jump/ftl_jump.dm | 4 +- code/game/gamemodes/game_mode_latespawn.dm | 4 +- .../gamemodes/objectives/objective_cult.dm | 2 +- .../wizard/servant_items/champion.dm | 2 +- code/game/jobs/job/_job.dm | 22 +-- code/game/machinery/OpTable.dm | 4 +- code/game/machinery/Sleeper.dm | 2 +- code/game/machinery/bodyscanner.dm | 2 +- code/game/machinery/camera/camera.dm | 6 +- code/game/machinery/camera/tracking.dm | 2 +- code/game/machinery/computer/Operating.dm | 2 +- code/game/machinery/computer/arcade_orion.dm | 2 +- code/game/machinery/cryopod.dm | 2 +- code/game/machinery/doors/_door.dm | 2 +- .../machinery/doors/airlock_interactions.dm | 2 +- code/game/machinery/doors/windowdoor.dm | 2 +- code/game/machinery/flasher.dm | 2 +- code/game/machinery/hologram.dm | 2 +- code/game/machinery/jukebox.dm | 2 +- .../kitchen/cooking_machines/fryer.dm | 2 +- code/game/machinery/message_server.dm | 2 +- code/game/machinery/newscaster.dm | 6 +- code/game/machinery/portable_turret.dm | 2 +- code/game/machinery/rechargestation.dm | 4 +- code/game/machinery/suit_cycler.dm | 2 +- code/game/machinery/syndicatebeacon.dm | 2 +- code/game/machinery/vitals_monitor.dm | 2 +- code/game/movietitles.dm | 4 +- code/game/objects/auras/regenerating_aura.dm | 4 +- .../effects/decals/Cleanable/humans.dm | 4 +- code/game/objects/effects/manifest.dm | 2 +- code/game/objects/effects/spiders.dm | 2 +- code/game/objects/items/__item.dm | 8 +- code/game/objects/items/_item_damage.dm | 2 +- code/game/objects/items/cryobag.dm | 2 +- code/game/objects/items/devices/auto_cpr.dm | 2 +- .../objects/items/devices/scanners/health.dm | 6 +- .../objects/items/devices/scanners/xenobio.dm | 4 +- .../objects/items/devices/suit_cooling.dm | 4 +- .../items/devices/suit_sensor_jammer.dm | 2 +- code/game/objects/items/devices/t_scanner.dm | 4 +- .../objects/items/devices/traitordevices.dm | 2 +- .../objects/items/flashlights/_flashlight.dm | 2 +- code/game/objects/items/passport.dm | 2 +- code/game/objects/items/stacks/medical.dm | 16 +- code/game/objects/items/stacks/nanopaste.dm | 2 +- code/game/objects/items/weapons/autopsy.dm | 2 +- code/game/objects/items/weapons/cards_ids.dm | 2 +- .../items/weapons/cards_ids_syndicate.dm | 4 +- code/game/objects/items/weapons/defib.dm | 18 +- code/game/objects/items/weapons/ecigs.dm | 2 +- .../items/weapons/grenades/decompiler.dm | 2 +- .../items/weapons/grenades/spawnergrenade.dm | 2 +- code/game/objects/items/weapons/handcuffs.dm | 8 +- .../objects/items/weapons/implants/implant.dm | 4 +- .../weapons/implants/implants/compressed.dm | 2 +- .../weapons/implants/implants/imprinting.dm | 4 +- .../objects/items/weapons/material/shards.dm | 2 +- code/game/objects/items/weapons/scrolls.dm | 2 +- code/game/objects/items/weapons/shields.dm | 2 +- code/game/objects/items/weapons/soap.dm | 2 +- .../objects/items/weapons/storage/bible.dm | 4 +- .../items/weapons/storage/laundry_basket.dm | 2 +- code/game/objects/items/weapons/stunbaton.dm | 4 +- .../objects/items/weapons/swords_axes_etc.dm | 4 +- .../game/objects/items/weapons/tanks/tanks.dm | 4 +- .../items/weapons/tools/weldingtool.dm | 2 +- code/game/objects/structures/charge_pylon.dm | 2 +- code/game/objects/structures/fitness.dm | 4 +- code/game/objects/structures/fountain.dm | 4 +- code/game/objects/structures/grille.dm | 2 +- code/game/objects/structures/ironing_board.dm | 2 +- code/game/objects/structures/iv_drip.dm | 6 +- code/game/objects/structures/railing.dm | 2 +- code/game/objects/structures/safe.dm | 2 +- .../stool_bed_chair_nest_sofa/bed.dm | 4 +- .../stool_bed_chair_nest_sofa/wheelchair.dm | 2 +- .../game/objects/structures/under_wardrobe.dm | 6 +- code/game/objects/structures/watercloset.dm | 2 +- code/game/objects/structures/window.dm | 2 +- code/game/response_team.dm | 4 +- code/game/turfs/floors/floor_attackby.dm | 2 +- code/game/turfs/turf.dm | 2 +- code/game/turfs/walls/wall_attacks.dm | 2 +- code/game/world.dm | 2 +- code/game/world_topic_commands.dm | 2 +- code/modules/ZAS/Airflow.dm | 4 +- code/modules/ZAS/Contaminants.dm | 12 +- code/modules/ZAS/Fire.dm | 2 +- code/modules/acting/acting_items.dm | 2 +- code/modules/admin/admin_verbs.dm | 6 +- code/modules/admin/quantum_mechanic.dm | 26 +-- code/modules/admin/respawn_as_self.dm | 2 +- .../admin/secrets/admin_secrets/list_dna.dm | 2 +- .../admin_secrets/list_fingerprints.dm | 2 +- code/modules/admin/topic.dm | 26 +-- code/modules/admin/verbs/debug.dm | 14 +- code/modules/admin/verbs/possess.dm | 2 +- code/modules/admin/verbs/randomverbs.dm | 2 +- code/modules/admin/view_variables/helpers.dm | 2 +- code/modules/admin/view_variables/topic.dm | 40 ++-- code/modules/aspects/_aspects.dm | 2 +- code/modules/assembly/mousetrap.dm | 2 +- code/modules/atmospherics/he_pipes.dm | 2 +- code/modules/augment/augment.dm | 2 +- code/modules/awaymissions/corpse.dm | 6 +- .../loadout/lists/augmentations.dm | 2 +- .../preference_setup/loadout/loadout.dm | 8 +- code/modules/client/preferences.dm | 2 +- .../modules/client/preferences_spawnpoints.dm | 2 +- code/modules/clothing/_clothing.dm | 2 +- code/modules/clothing/badges/_badge.dm | 2 +- code/modules/clothing/glasses/_glasses.dm | 2 +- code/modules/clothing/gloves/_gloves.dm | 4 +- .../clothing/gloves/jewelry/rings/material.dm | 2 +- .../clothing/gloves/jewelry/rings/rings.dm | 6 +- code/modules/clothing/head/fated_key.dm | 2 +- code/modules/clothing/masks/chewable.dm | 2 +- code/modules/clothing/masks/monitor.dm | 4 +- code/modules/clothing/masks/smokable.dm | 4 +- code/modules/clothing/misc/dog_tags.dm | 2 +- code/modules/clothing/shoes/magboots.dm | 4 +- code/modules/clothing/spacesuits/breaches.dm | 6 +- .../clothing/spacesuits/rig/modules/combat.dm | 2 +- .../spacesuits/rig/modules/computer.dm | 8 +- .../spacesuits/rig/modules/infiltration.dm | 6 +- .../spacesuits/rig/modules/modules.dm | 2 +- .../spacesuits/rig/modules/utility.dm | 4 +- code/modules/clothing/spacesuits/rig/rig.dm | 14 +- .../clothing/spacesuits/rig/rig_attackby.dm | 4 +- .../clothing/spacesuits/rig/rig_pieces.dm | 10 +- code/modules/clothing/spacesuits/void/void.dm | 8 +- code/modules/clothing/underwear/base.dm | 16 +- code/modules/codex/codex_mob.dm | 4 +- code/modules/detectivework/evidence/fibers.dm | 2 +- .../detectivework/evidence/fingerprints.dm | 2 +- .../detectivework/evidence/trace_dna.dm | 2 +- code/modules/detectivework/forensics.dm | 2 +- .../tools/sample_kits/fingerprinting.dm | 4 +- .../detectivework/tools/sample_kits/swabs.dm | 2 +- code/modules/economy/cael/ATM.dm | 4 +- .../emotes/definitions/audible_snap.dm | 2 +- code/modules/emotes/definitions/tail.dm | 14 +- code/modules/emotes/definitions/visible.dm | 2 +- code/modules/events/ailments.dm | 4 +- code/modules/events/electrical_storm.dm | 4 +- code/modules/events/ion_storm.dm | 2 +- .../events/spontaneous_appendicitis.dm | 2 +- .../fabrication/fabricator_bioprinter.dm | 2 +- code/modules/games/boardgame.dm | 2 +- code/modules/games/cards.dm | 2 +- code/modules/goals/goal_mind.dm | 2 +- .../hallucinations/hallucination_telepathy.dm | 8 +- code/modules/hydroponics/grown.dm | 2 +- code/modules/hydroponics/seed.dm | 4 +- .../spreading/spreading_response.dm | 4 +- .../integrated_electronics/subtypes/filter.dm | 2 +- .../integrated_electronics/subtypes/input.dm | 4 +- .../subtypes/reagents.dm | 2 +- code/modules/keybindings/human.dm | 6 +- code/modules/materials/_materials.dm | 4 +- .../gasses/material_gas_mundane.dm | 4 +- .../liquids/materials_liquid_toxins.dm | 4 +- code/modules/materials/materials_ore.dm | 2 +- code/modules/mechs/equipment/combat.dm | 4 +- .../mining/machinery/material_compressor.dm | 2 +- .../mining/machinery/material_smelter.dm | 2 +- code/modules/mob/grab/grab_datum.dm | 2 +- code/modules/mob/grab/grab_object.dm | 6 +- code/modules/mob/grab/normal/grab_normal.dm | 10 +- .../mob/grab/normal/norm_aggressive.dm | 2 +- code/modules/mob/hear_say.dm | 12 +- code/modules/mob/living/autohiss.dm | 2 +- code/modules/mob/living/bot/farmbot.dm | 2 +- code/modules/mob/living/bot/medibot.dm | 6 +- code/modules/mob/living/bot/mulebot.dm | 2 +- code/modules/mob/living/bot/secbot.dm | 6 +- code/modules/mob/living/human/death.dm | 8 +- .../living/human/descriptors/_descriptors.dm | 8 +- code/modules/mob/living/human/examine.dm | 12 +- code/modules/mob/living/human/human.dm | 176 +++++++++--------- .../mob/living/human/human_appearance.dm | 20 +- .../mob/living/human/human_appearance_head.dm | 6 +- .../mob/living/human/human_attackhand.dm | 24 +-- code/modules/mob/living/human/human_blood.dm | 30 +-- code/modules/mob/living/human/human_damage.dm | 66 +++---- .../modules/mob/living/human/human_defense.dm | 50 ++--- .../modules/mob/living/human/human_defines.dm | 2 +- code/modules/mob/living/human/human_grabs.dm | 6 +- .../modules/mob/living/human/human_helpers.dm | 38 ++-- .../mob/living/human/human_internals.dm | 4 +- .../mob/living/human/human_maneuvers.dm | 6 +- .../mob/living/human/human_movement.dm | 18 +- code/modules/mob/living/human/human_organs.dm | 44 ++--- code/modules/mob/living/human/human_powers.dm | 4 +- code/modules/mob/living/human/human_resist.dm | 8 +- code/modules/mob/living/human/human_skin.dm | 4 +- .../modules/mob/living/human/human_species.dm | 30 +-- code/modules/mob/living/human/human_verbs.dm | 26 +-- code/modules/mob/living/human/life.dm | 60 +++--- code/modules/mob/living/human/login.dm | 2 +- code/modules/mob/living/human/logout.dm | 2 +- code/modules/mob/living/human/npcs.dm | 12 +- code/modules/mob/living/human/say.dm | 18 +- .../mob/living/human/unarmed_attack.dm | 24 +-- code/modules/mob/living/human/update_icons.dm | 48 ++--- code/modules/mob/living/human/whisper.dm | 4 +- code/modules/mob/living/living.dm | 4 +- code/modules/mob/living/silicon/ai/ai.dm | 2 +- code/modules/mob/living/silicon/pai/pai.dm | 2 +- .../mob/living/silicon/robot/analyzer.dm | 2 +- .../mob/living/simple_animal/friendly/cat.dm | 4 +- .../living/simple_animal/hostile/antlion.dm | 2 +- .../living/simple_animal/hostile/bad_drone.dm | 2 +- .../mob/living/simple_animal/hostile/bear.dm | 2 +- .../simple_animal/hostile/giant_spider.dm | 4 +- .../living/simple_animal/hostile/hostile.dm | 4 +- .../mob/living/simple_animal/hostile/leech.dm | 2 +- .../hostile/retaliate/giant_crab.dm | 4 +- .../retaliate/giant_parrot/giant_parrot.dm | 2 +- .../mob/living/simple_animal/hostile/slug.dm | 6 +- .../living/simple_animal/hostile/vagrant.dm | 4 +- .../mob/living/simple_animal/simple_animal.dm | 4 +- code/modules/mob/mob.dm | 4 +- code/modules/mob/mob_helpers.dm | 8 +- code/modules/mob/mob_layering.dm | 2 +- code/modules/mob/mob_transformation_simple.dm | 6 +- code/modules/mob/new_player/new_player.dm | 4 +- .../mob/new_player/preferences_setup.dm | 6 +- code/modules/mob/observer/ghost/ghost.dm | 4 +- code/modules/mob/skills/skill_verbs.dm | 4 +- code/modules/mob/transform_procs.dm | 12 +- code/modules/mob_holder/_holder.dm | 2 +- code/modules/mob_holder/holder_mobs.dm | 4 +- .../computers/modular_computer/core.dm | 2 +- .../computers/subtypes/dev_pda.dm | 2 +- .../file_system/programs/generic/folding.dm | 2 +- .../file_system/programs/generic/supply.dm | 2 +- .../programs/medical/suit_sensors.dm | 2 +- .../file_system/reports/crew_record.dm | 6 +- code/modules/multiz/movement.dm | 12 +- code/modules/multiz/stairs.dm | 2 +- code/modules/nano/interaction/default.dm | 2 +- code/modules/nano/modules/human_appearance.dm | 4 +- code/modules/organs/external/_external.dm | 14 +- .../organs/external/_external_icons.dm | 4 +- code/modules/organs/external/head.dm | 2 +- code/modules/organs/external/standard.dm | 2 +- code/modules/organs/external/tail.dm | 4 +- code/modules/organs/internal/_internal.dm | 4 +- code/modules/organs/internal/eyes.dm | 2 +- code/modules/organs/internal/heart.dm | 2 +- code/modules/organs/internal/lungs.dm | 2 +- code/modules/organs/organ.dm | 4 +- code/modules/organs/pain.dm | 2 +- .../organs/prosthetics/_prosthetics.dm | 18 +- code/modules/overmap/ftl_shunt/core.dm | 12 +- code/modules/overmap/spacetravel.dm | 2 +- code/modules/power/apc.dm | 2 +- code/modules/power/cable.dm | 2 +- code/modules/power/fusion/fusion_reactions.dm | 2 +- code/modules/power/lighting.dm | 4 +- code/modules/power/power.dm | 2 +- .../power/singularity/singularity_events.dm | 2 +- code/modules/power/smes_construction.dm | 2 +- code/modules/projectiles/ammunition.dm | 2 +- code/modules/projectiles/gun.dm | 6 +- .../projectiles/guns/energy/lasertag.dm | 2 +- .../projectiles/guns/launcher/money_cannon.dm | 2 +- code/modules/projectiles/guns/projectile.dm | 2 +- code/modules/projectiles/projectile/beams.dm | 6 +- code/modules/projectiles/projectile/change.dm | 4 +- code/modules/projectiles/projectile/energy.dm | 2 +- .../modules/projectiles/projectile/special.dm | 2 +- code/modules/random_map/dungeon/rooms/tomb.dm | 8 +- code/modules/reagents/Chemistry-Grinder.dm | 4 +- code/modules/reagents/chems/chems_blood.dm | 2 +- .../modules/reagents/chems/chems_compounds.dm | 18 +- code/modules/reagents/chems/chems_drugs.dm | 4 +- code/modules/reagents/chems/chems_ethanol.dm | 2 +- .../modules/reagents/chems/chems_medicines.dm | 12 +- .../reagents/reagent_containers/blood_pack.dm | 2 +- .../reagent_containers/drinks/bottle.dm | 2 +- .../reagent_containers/food/meat/cubes.dm | 2 +- .../reagents/reagent_containers/inhaler.dm | 2 +- .../reagents/reagent_containers/syringes.dm | 6 +- code/modules/recycling/package_wrapper.dm | 4 +- code/modules/recycling/sortingmachinery.dm | 2 +- code/modules/recycling/wrapped_package.dm | 2 +- code/modules/shield_generators/shield.dm | 2 +- code/modules/shuttles/shuttle_emergency.dm | 2 +- code/modules/species/outsider/random.dm | 4 +- code/modules/species/outsider/shadow.dm | 2 +- code/modules/species/outsider/starlight.dm | 6 +- code/modules/species/species.dm | 76 ++++---- code/modules/species/species_attack.dm | 10 +- code/modules/species/species_bodytype.dm | 10 +- .../species/species_bodytype_helpers.dm | 18 +- .../species/species_bodytype_quadruped.dm | 2 +- .../species/species_bodytype_random.dm | 4 +- code/modules/species/species_getters.dm | 26 +-- code/modules/species/species_helpers.dm | 18 +- code/modules/species/species_shapeshifter.dm | 28 +-- .../species/species_shapeshifter_bodytypes.dm | 8 +- code/modules/species/station/golem.dm | 2 +- code/modules/species/station/human.dm | 8 +- code/modules/spells/aoe_turf/drain_blood.dm | 4 +- .../spells/artifacts/spellbound_servants.dm | 14 +- code/modules/spells/general/invisibility.dm | 2 +- code/modules/spells/hand/blood_shards.dm | 2 +- code/modules/spells/hand/burning_grip.dm | 4 +- code/modules/spells/racial_wizard.dm | 2 +- code/modules/spells/spellbook.dm | 4 +- code/modules/spells/targeted/analyze.dm | 4 +- code/modules/spells/targeted/blood_boil.dm | 4 +- .../spells/targeted/equip/burning_touch.dm | 2 +- .../spells/targeted/equip/holy_relic.dm | 2 +- .../spells/targeted/equip/horsemask.dm | 2 +- .../spells/targeted/equip/party_hardy.dm | 2 +- code/modules/spells/targeted/equip/seed.dm | 2 +- code/modules/spells/targeted/equip/shield.dm | 2 +- .../spells/targeted/projectile/stuncuff.dm | 2 +- code/modules/spells/targeted/shatter_mind.dm | 4 +- code/modules/spells/targeted/subjugate.dm | 2 +- code/modules/spells/targeted/targeted.dm | 2 +- code/modules/spells/targeted/torment.dm | 4 +- code/modules/submaps/submap_job.dm | 2 +- code/modules/submaps/submap_join.dm | 2 +- code/modules/supermatter/supermatter.dm | 2 +- code/modules/surgery/_surgery.dm | 10 +- code/modules/vehicles/bike.dm | 2 +- code/modules/vehicles/cargo_train.dm | 10 +- code/modules/vehicles/vehicle.dm | 4 +- code/modules/ventcrawl/ventcrawl.dm | 2 +- .../artifacts/effects/_effect.dm | 2 +- .../artifacts/effects/badfeeling.dm | 6 +- .../artifacts/effects/dnaswitch.dm | 6 +- .../artifacts/effects/goodfeeling.dm | 6 +- .../xenoarcheaology/artifacts/effects/heal.dm | 2 +- .../artifacts/effects/sleepy.dm | 6 +- .../artifacts/triggers/touch.dm | 6 +- code/modules/xenoarcheaology/boulder.dm | 2 +- .../finds/find_types/statuette.dm | 4 +- code/procs/announce.dm | 2 +- code/procs/hud.dm | 6 +- code/unit_tests/equipment_tests.dm | 12 +- code/unit_tests/mob_tests.dm | 22 +-- code/unit_tests/observation_tests.dm | 10 +- code/unit_tests/organ_tests.dm | 22 +-- maps/antag_spawn/wizard/wizard_base.dmm | 2 +- maps/away/bearcat/bearcat.dm | 2 +- maps/away/bearcat/bearcat_jobs.dm | 2 +- maps/away/liberia/liberia_jobs.dm | 2 +- maps/away/unishi/unishi-2.dmm | 18 +- maps/exodus/exodus-2.dmm | 2 +- maps/exodus/jobs/captain.dm | 2 +- maps/exodus/jobs/civilian.dm | 2 +- maps/exodus/jobs/medical.dm | 2 +- maps/exodus/jobs/security.dm | 2 +- maps/exodus/jobs/synthetics.dm | 8 +- maps/exodus/outfits/command.dm | 2 +- maps/ministation/jobs/command.dm | 2 +- maps/ministation/jobs/synthetics.dm | 8 +- maps/ministation/ministation_areas.dm | 2 +- maps/ministation/outfits/command.dm | 2 +- .../exoplanet_ruins/monoliths/monoliths.dm | 2 +- maps/tradeship/jobs/command.dm | 2 +- maps/tradeship/jobs/synthetics.dm | 4 +- maps/tradeship/outfits/_outfits.dm | 2 +- maps/tradeship/outfits/command.dm | 2 +- maps/tradeship/tradeship_areas.dm | 2 +- maps/~mapsystem/maps.dm | 2 +- maps/~mapsystem/maps_currency.dm | 8 +- mods/content/corporate/clothing/outfits.dm | 4 +- .../corporate/datum/antagonists/deathsquad.dm | 4 +- mods/content/fantasy/datum/hnoll/species.dm | 2 +- mods/content/matchmaking/matchmaker.dm | 4 +- mods/content/matchmaking/relations_types.dm | 8 +- mods/content/pheromones/pheromone_effect.dm | 4 +- mods/content/pheromones/pheromone_emotes.dm | 2 +- mods/content/psionics/_psionics.dm | 2 +- .../psionics/datum/antagonists/foundation.dm | 2 +- .../psionics/datum/antagonists/paramount.dm | 2 +- mods/content/psionics/datum/jobs.dm | 2 +- .../psionics/items/cerebro_enhancers.dm | 8 +- .../psionics/complexus/complexus_helpers.dm | 2 +- .../psionics/complexus/complexus_process.dm | 2 +- .../system/psionics/faculties/coercion.dm | 2 +- .../system/psionics/faculties/redaction.dm | 4 +- .../psionics/system/psionics/mob/mob.dm | 2 +- mods/content/shackles/laws_pref.dm | 2 +- .../xenobiology/colours/colour_silver.dm | 2 +- .../xenobiology/mobs/slime_feeding_helpers.dm | 4 +- mods/content/xenobiology/overrides.dm | 2 +- mods/content/xenobiology/slime/feeding.dm | 2 +- mods/content/xenobiology/slime/items.dm | 2 +- .../deity/extensions/deity_be_near.dm | 2 +- mods/gamemodes/deity/forms/narsie/items.dm | 2 +- mods/gamemodes/deity/forms/narsie/narsie.dm | 2 +- .../deity/forms/narsie/structures.dm | 2 +- .../forms/starlight/spells/veil_of_shadows.dm | 6 +- .../deity/forms/starlight/structures.dm | 6 +- mods/gamemodes/deity/mobs/phenomena/narsie.dm | 6 +- .../deity/mobs/phenomena/starlight.dm | 6 +- .../deity/mobs/phenomena/transmutation.dm | 4 +- mods/gamemodes/deity/structures/pylon.dm | 2 +- mods/gamemodes/heist/outfit.dm | 2 +- mods/gamemodes/heist/special_role.dm | 2 +- mods/gamemodes/ninja/datums/special_role.dm | 4 +- mods/mobs/borers/datum/antagonist.dm | 4 +- mods/mobs/borers/datum/symbiote.dm | 8 +- mods/mobs/borers/mob/borer/borer.dm | 4 +- mods/mobs/borers/mob/borer/borer_attacks.dm | 2 +- mods/mobs/borers/mob/borer/borer_powers.dm | 10 +- mods/mobs/borers/mob/organ.dm | 2 +- mods/mobs/borers/mob/overrides.dm | 6 +- mods/species/ascent/datum/antagonist.dm | 6 +- mods/species/ascent/datum/culture.dm | 2 +- mods/species/ascent/datum/languages.dm | 4 +- mods/species/ascent/datum/species.dm | 4 +- mods/species/ascent/effects/razorweb.dm | 2 +- mods/species/ascent/items/id_control.dm | 4 +- mods/species/ascent/machines/magnetotron.dm | 4 +- mods/species/ascent/machines/ship_machines.dm | 2 +- mods/species/ascent/mobs/nymph/nymph_life.dm | 2 +- mods/species/bayliens/adherent/_adherent.dm | 2 +- .../bayliens/adherent/datum/species.dm | 8 +- mods/species/bayliens/bayliens.dm | 2 +- mods/species/bayliens/skrell/_skrell.dm | 2 +- mods/species/bayliens/skrell/datum/species.dm | 4 +- mods/species/bayliens/tajaran/_tajaran.dm | 2 +- .../species/bayliens/tajaran/datum/species.dm | 2 +- mods/species/bayliens/unathi/_lizard.dm | 2 +- mods/species/bayliens/unathi/datum/species.dm | 2 +- mods/species/drakes/_drakes.dm | 2 +- .../drakes/drake_abilities_friendly.dm | 2 +- mods/species/drakes/drake_organs.dm | 2 +- mods/species/drakes/drake_spit.dm | 2 +- mods/species/drakes/species.dm | 8 +- mods/species/neoavians/datum/species.dm | 4 +- mods/species/serpentid/datum/species.dm | 16 +- .../serpentid/mobs/bodyparts_serpentid.dm | 4 +- mods/species/utility_frames/species.dm | 2 +- mods/species/vox/_vox.dm | 2 +- mods/species/vox/datum/heist_compatibility.dm | 6 +- mods/species/vox/datum/language.dm | 2 +- mods/species/vox/datum/species.dm | 16 +- mods/species/vox/datum/species_bodytypes.dm | 2 +- mods/species/vox/datum/trader.dm | 2 +- mods/species/vox/datum/unit_testing.dm | 2 +- mods/species/vox/gear/gear_shoes.dm | 2 +- mods/species/vox/gear/gun.dm | 4 +- mods/species/vox/mobs_vox.dm | 2 +- 509 files changed, 1450 insertions(+), 1450 deletions(-) diff --git a/code/__defines/mobs.dm b/code/__defines/mobs.dm index c06030c236c..4ede3dbaa6b 100644 --- a/code/__defines/mobs.dm +++ b/code/__defines/mobs.dm @@ -323,7 +323,7 @@ var/global/list/dexterity_levels = list( "[DEXTERITY_BASE]" ) -// used in /mob/living/carbon/human/can_inject, and by various callers of that proc +// used in /mob/living/human/can_inject, and by various callers of that proc #define CAN_INJECT 1 #define INJECTION_PORT 2 #define INJECTION_PORT_DELAY 3 SECONDS // used by injectors to apply delay due to searching for a port on the injectee's suit diff --git a/code/_helpers/global_lists.dm b/code/_helpers/global_lists.dm index 282bd3e4e52..f3379f84c52 100644 --- a/code/_helpers/global_lists.dm +++ b/code/_helpers/global_lists.dm @@ -59,7 +59,7 @@ var/global/list/string_slot_flags = list( mannequins_ = new() . = mannequins_[ckey] if(!.) - . = new /mob/living/carbon/human/dummy/mannequin() + . = new /mob/living/human/dummy/mannequin() mannequins_[ckey] = . /hook/global_init/proc/makeDatumRefLists() diff --git a/code/_helpers/medical_scans.dm b/code/_helpers/medical_scans.dm index f028663332d..c48ff1b6028 100644 --- a/code/_helpers/medical_scans.dm +++ b/code/_helpers/medical_scans.dm @@ -1,5 +1,5 @@ -/mob/living/carbon/human/proc/get_raw_medical_data(var/tag = FALSE) - var/mob/living/carbon/human/H = src +/mob/living/human/proc/get_raw_medical_data(var/tag = FALSE) + var/mob/living/human/H = src var/list/scan = list() scan["name"] = H.name diff --git a/code/_helpers/mobs.dm b/code/_helpers/mobs.dm index af53fcc142a..2be61d45948 100644 --- a/code/_helpers/mobs.dm +++ b/code/_helpers/mobs.dm @@ -209,7 +209,7 @@ continue //They need a brain! if(ishuman(M)) - var/mob/living/carbon/human/H = M + var/mob/living/human/H = M if(H.should_have_organ(BP_BRAIN) && !H.has_brain()) continue if(M.ckey == find_key) diff --git a/code/_macros.dm b/code/_macros.dm index 8acdf68fb99..9d2994b3eec 100644 --- a/code/_macros.dm +++ b/code/_macros.dm @@ -32,7 +32,7 @@ #define isEye(A) istype(A, /mob/observer/eye) -#define ishuman(A) istype(A, /mob/living/carbon/human) +#define ishuman(A) istype(A, /mob/living/human) #define isitem(A) istype(A, /obj/item) diff --git a/code/_onclick/hud/human.dm b/code/_onclick/hud/human.dm index e95ae53482f..a4fb7dab7ff 100644 --- a/code/_onclick/hud/human.dm +++ b/code/_onclick/hud/human.dm @@ -1,4 +1,4 @@ -/mob/living/carbon/human +/mob/living/human hud_used = /datum/hud/human /datum/hud/human/FinalizeInstantiation() @@ -7,7 +7,7 @@ var/ui_color = get_ui_color() var/ui_alpha = get_ui_alpha() - var/mob/living/carbon/human/target = mymob + var/mob/living/human/target = mymob var/datum/hud_data/hud_data = istype(target?.species?.species_hud) ? target.species.species_hud : new hotkeybuttons = list() //These can be disabled for hotkey usersx @@ -101,7 +101,7 @@ ..() -/mob/living/carbon/human/verb/toggle_hotkey_verbs() +/mob/living/human/verb/toggle_hotkey_verbs() set category = "OOC" set name = "Toggle hotkey buttons" set desc = "This disables or enables the user interface buttons which can be used with hotkeys." diff --git a/code/_onclick/hud/screen/screen_attack_selector.dm b/code/_onclick/hud/screen/screen_attack_selector.dm index 5aa2c0dbbbd..ea27e11ca3e 100644 --- a/code/_onclick/hud/screen/screen_attack_selector.dm +++ b/code/_onclick/hud/screen/screen_attack_selector.dm @@ -4,14 +4,14 @@ screen_loc = ui_attack_selector /obj/screen/default_attack_selector/Destroy() - var/mob/living/carbon/human/owner = owner_ref?.resolve() + var/mob/living/human/owner = owner_ref?.resolve() if(istype(owner) && owner.attack_selector == src) owner.attack_selector = null . = ..() /obj/screen/default_attack_selector/handle_click(mob/user, params) - var/mob/living/carbon/human/owner = owner_ref?.resolve() + var/mob/living/human/owner = owner_ref?.resolve() if(user != owner) return FALSE @@ -28,6 +28,6 @@ return TRUE /obj/screen/default_attack_selector/on_update_icon() - var/mob/living/carbon/human/owner = owner_ref?.resolve() + var/mob/living/human/owner = owner_ref?.resolve() var/decl/natural_attack/attack = istype(owner) && owner.default_attack icon_state = attack?.selector_icon_state || "attack_none" diff --git a/code/_onclick/hud/screen/screen_equip.dm b/code/_onclick/hud/screen/screen_equip.dm index 49386fa267f..997fe5683bc 100644 --- a/code/_onclick/hud/screen/screen_equip.dm +++ b/code/_onclick/hud/screen/screen_equip.dm @@ -4,5 +4,5 @@ /obj/screen/equip/handle_click(mob/user, params) if(ishuman(usr)) - var/mob/living/carbon/human/H = usr + var/mob/living/human/H = usr H.quick_equip() diff --git a/code/_onclick/hud/screen/screen_setup.dm b/code/_onclick/hud/screen/screen_setup.dm index ebd2975ffba..d0159e2aff2 100644 --- a/code/_onclick/hud/screen/screen_setup.dm +++ b/code/_onclick/hud/screen/screen_setup.dm @@ -20,7 +20,7 @@ /obj/screen/setup_preview/bg/Click(location, control, params) if(pref) pref.bgstate = next_in_list(pref.bgstate, pref.bgstate_options) - var/mob/living/carbon/human/dummy/mannequin/mannequin = get_mannequin(pref.client_ckey) + var/mob/living/human/dummy/mannequin/mannequin = get_mannequin(pref.client_ckey) if(mannequin) pref.update_character_previews(mannequin) return ..() diff --git a/code/_onclick/item_attack.dm b/code/_onclick/item_attack.dm index d95f4cc1689..c99039b23e7 100644 --- a/code/_onclick/item_attack.dm +++ b/code/_onclick/item_attack.dm @@ -61,7 +61,7 @@ avoid code duplication. This includes items that may sometimes act as a standard return TRUE return I.use_on_mob(src, user) -/mob/living/carbon/human/attackby(obj/item/I, mob/user) +/mob/living/human/attackby(obj/item/I, mob/user) . = ..() if(.) diff --git a/code/_onclick/other_mobs.dm b/code/_onclick/other_mobs.dm index 2fb36304724..7965251ab03 100644 --- a/code/_onclick/other_mobs.dm +++ b/code/_onclick/other_mobs.dm @@ -40,10 +40,10 @@ return FALSE -/mob/living/carbon/human/RestrainedClickOn(var/atom/A) +/mob/living/human/RestrainedClickOn(var/atom/A) return -/mob/living/carbon/human/RangedAttack(var/atom/A, var/params) +/mob/living/human/RangedAttack(var/atom/A, var/params) //Climbing up open spaces if(isturf(loc) && bound_overlay && !is_physically_disabled() && istype(A) && A.can_climb_from_below(src)) return climb_up(A) diff --git a/code/_onclick/rig.dm b/code/_onclick/rig.dm index 8dd8799e561..9c1802edd7a 100644 --- a/code/_onclick/rig.dm +++ b/code/_onclick/rig.dm @@ -25,7 +25,7 @@ /mob/living/proc/can_use_rig() return 0 -/mob/living/carbon/human/can_use_rig() +/mob/living/human/can_use_rig() return 1 /mob/living/silicon/ai/can_use_rig() diff --git a/code/controllers/hooks-defs.dm b/code/controllers/hooks-defs.dm index 95e21f789f1..f807f5b88db 100644 --- a/code/controllers/hooks-defs.dm +++ b/code/controllers/hooks-defs.dm @@ -37,14 +37,14 @@ /** * Death hook. * Called in death.dm when someone dies. - * Parameters: var/mob/living/carbon/human, var/gibbed + * Parameters: var/mob/living/human, var/gibbed */ /hook/death /** * Cloning hook. * Called in cloning.dm when someone is brought back by the wonders of modern science. - * Parameters: var/mob/living/carbon/human + * Parameters: var/mob/living/human */ /hook/clone diff --git a/code/controllers/subsystems/initialization/customitems.dm b/code/controllers/subsystems/initialization/customitems.dm index edc8ef7c5eb..d571851c618 100644 --- a/code/controllers/subsystems/initialization/customitems.dm +++ b/code/controllers/subsystems/initialization/customitems.dm @@ -41,14 +41,14 @@ SUBSYSTEM_DEF(customitems) . = ..() // Places the item on the target mob. -/datum/controller/subsystem/customitems/proc/place_custom_item(mob/living/carbon/human/M, var/datum/custom_item/citem) +/datum/controller/subsystem/customitems/proc/place_custom_item(mob/living/human/M, var/datum/custom_item/citem) . = M && citem && citem.spawn_item(get_turf(M)) if(. && !M.equip_to_appropriate_slot(.) && !M.equip_to_storage(.)) to_chat(M, SPAN_WARNING("Your custom item, \the [.], could not be placed on your character.")) QDEL_NULL(.) //gets the relevant list for the key from the listlist if it exists, check to make sure they are meant to have it and then calls the giving function -/datum/controller/subsystem/customitems/proc/equip_custom_items(mob/living/carbon/human/M) +/datum/controller/subsystem/customitems/proc/equip_custom_items(mob/living/human/M) var/list/key_list = custom_items_by_ckey[M.ckey] if(!length(key_list)) return diff --git a/code/controllers/subsystems/jobs.dm b/code/controllers/subsystems/jobs.dm index 59ddadcb208..1f63adf4fef 100644 --- a/code/controllers/subsystems/jobs.dm +++ b/code/controllers/subsystems/jobs.dm @@ -416,7 +416,7 @@ SUBSYSTEM_DEF(jobs) if(allowed_branches) if(!ishuman(wearer)) return FALSE - var/mob/living/carbon/human/wearer_human = wearer + var/mob/living/human/wearer_human = wearer if(!wearer_human.char_branch || !(wearer_human.char_branch.type in allowed_branches)) return FALSE if(allowed_skills) @@ -427,7 +427,7 @@ SUBSYSTEM_DEF(jobs) return FALSE return TRUE -/datum/controller/subsystem/jobs/proc/equip_custom_loadout(var/mob/living/carbon/human/H, var/datum/job/job) +/datum/controller/subsystem/jobs/proc/equip_custom_loadout(var/mob/living/human/H, var/datum/job/job) if(!H || !H.client) return @@ -463,7 +463,7 @@ SUBSYSTEM_DEF(jobs) return spawn_in_storage -/datum/controller/subsystem/jobs/proc/equip_job_title(var/mob/living/carbon/human/H, var/job_title, var/joined_late = 0) +/datum/controller/subsystem/jobs/proc/equip_job_title(var/mob/living/human/H, var/job_title, var/joined_late = 0) if(!H) return diff --git a/code/controllers/subsystems/ticker.dm b/code/controllers/subsystems/ticker.dm index 59346858a52..60706a8ab19 100644 --- a/code/controllers/subsystems/ticker.dm +++ b/code/controllers/subsystems/ticker.dm @@ -83,7 +83,7 @@ SUBSYSTEM_DEF(ticker) create_characters() //Create player characters and transfer them collect_minds() equip_characters() - for(var/mob/living/carbon/human/H in global.player_list) + for(var/mob/living/human/H in global.player_list) if(H.mind && !player_is_antag(H.mind, only_offstation_roles = 1)) var/datum/job/job = SSjobs.get_by_title(H.mind.assigned_role) if(job && job.create_record) @@ -292,7 +292,7 @@ Helpers /datum/controller/subsystem/ticker/proc/equip_characters() var/captainless=1 - for(var/mob/living/carbon/human/player in global.player_list) + for(var/mob/living/human/player in global.player_list) if(player && player.mind && player.mind.assigned_role) if(player.mind.assigned_role == "Captain") captainless=0 diff --git a/code/datums/ai/human.dm b/code/datums/ai/human.dm index 654c315ea46..60be355be6a 100644 --- a/code/datums/ai/human.dm +++ b/code/datums/ai/human.dm @@ -1,9 +1,9 @@ /datum/ai/human name = "human" - expected_type = /mob/living/carbon/human + expected_type = /mob/living/human /datum/ai/human/do_process(var/time_elapsed) - var/mob/living/carbon/human/H = body + var/mob/living/human/H = body if(H.stat != CONSCIOUS) return diff --git a/code/datums/ai/monkey.dm b/code/datums/ai/monkey.dm index c1227ee03f4..1226e253809 100644 --- a/code/datums/ai/monkey.dm +++ b/code/datums/ai/monkey.dm @@ -1,6 +1,6 @@ /datum/ai/monkey name = "monkey" - expected_type = /mob/living/carbon/human + expected_type = /mob/living/human var/list/no_touchie = list( /obj/item/mirror, /obj/structure/mirror diff --git a/code/datums/appearances/automatic/cardborg.dm b/code/datums/appearances/automatic/cardborg.dm index 0fc3546bbcb..52ad0031f3b 100644 --- a/code/datums/appearances/automatic/cardborg.dm +++ b/code/datums/appearances/automatic/cardborg.dm @@ -11,7 +11,7 @@ if(user in appearance_sources) return - var/mob/living/carbon/human/H = user + var/mob/living/human/H = user if(!(istype(H.get_equipped_item(slot_wear_suit_str), /obj/item/clothing/suit/cardborg) && istype(H.get_equipped_item(slot_head_str), /obj/item/clothing/head/cardborg) && istype(H.get_equipped_item(slot_back_str), /obj/item/backpack))) return @@ -29,7 +29,7 @@ if(issilicon(user)) DisplayAllAltAppearancesTo(user) -/decl/appearance_handler/cardborg/proc/get_image_from_backpack(var/mob/living/carbon/human/H) +/decl/appearance_handler/cardborg/proc/get_image_from_backpack(var/mob/living/human/H) init_appearances() var/obj/item/back = H.get_equipped_item(slot_back_str) if(!istype(back)) diff --git a/code/datums/extensions/storage/subtypes_bag.dm b/code/datums/extensions/storage/subtypes_bag.dm index 890f4f02f9a..0777f3e406a 100644 --- a/code/datums/extensions/storage/subtypes_bag.dm +++ b/code/datums/extensions/storage/subtypes_bag.dm @@ -16,7 +16,7 @@ bag.update_w_class() /datum/storage/bag/can_be_inserted(obj/item/W, mob/user, stop_messages = 0) - var/mob/living/carbon/human/H = ishuman(user) ? user : null // if we're human, then we need to check if bag in a pocket + var/mob/living/human/H = ishuman(user) ? user : null // if we're human, then we need to check if bag in a pocket if(holder.loc?.storage || H?.is_in_pocket(holder)) if(!stop_messages) to_chat(user, SPAN_NOTICE("Take \the [holder] out of [istype(holder.loc, /obj) ? "\the [holder.loc]" : "the pocket"] first.")) diff --git a/code/datums/genetics/genetic_conditions.dm b/code/datums/genetics/genetic_conditions.dm index 50b6469d233..3d94ab5c072 100644 --- a/code/datums/genetics/genetic_conditions.dm +++ b/code/datums/genetics/genetic_conditions.dm @@ -12,7 +12,7 @@ /// Icon to pull mob underlays from. var/underlay_icon = 'icons/effects/genetics.dmi' /// Type that this gene can apply to. - var/expected_type = /mob/living/carbon/human + var/expected_type = /mob/living/human /// Required return result from isSynthetic() for the gene to activate, if not null. var/check_synthetic = FALSE /// Set to FALSE if mob snapshots should not include this condition. @@ -53,7 +53,7 @@ /decl/genetic_condition/superpower/remoteview name = "Remote Viewing" - grant_verb = /mob/living/carbon/human/proc/remoteobserve + grant_verb = /mob/living/human/proc/remoteobserve activation_message = "Your mind expands." /decl/genetic_condition/superpower/running @@ -62,12 +62,12 @@ /decl/genetic_condition/superpower/remotetalk name = "Telepathy" - grant_verb = /mob/living/carbon/human/proc/remotesay + grant_verb = /mob/living/human/proc/remotesay activation_message = "You expand your mind outwards." /decl/genetic_condition/superpower/morph name = "Morph" - grant_verb = /mob/living/carbon/human/proc/morph + grant_verb = /mob/living/human/proc/morph activation_message = "Your skin feels strange." /decl/genetic_condition/superpower/cold_resist diff --git a/code/datums/hostility/hostility.dm b/code/datums/hostility/hostility.dm index e4a7b5fbcfa..2af98770ec3 100644 --- a/code/datums/hostility/hostility.dm +++ b/code/datums/hostility/hostility.dm @@ -34,7 +34,7 @@ /decl/hostility/laser_tag/can_special_target(atom/holder, atom/movable/target) if(ishuman(target)) - var/mob/living/carbon/human/H = target + var/mob/living/human/H = target if(enemy_vest_type && istype(H.get_equipped_item(slot_wear_suit_str), enemy_vest_type)) return TRUE return FALSE diff --git a/code/datums/mind/mind.dm b/code/datums/mind/mind.dm index 4879ee82481..1f83b6b2b8f 100644 --- a/code/datums/mind/mind.dm +++ b/code/datums/mind/mind.dm @@ -381,7 +381,7 @@ objectives -= objective else if(href_list["implant"]) - var/mob/living/carbon/human/H = current + var/mob/living/human/H = current BITSET(H.hud_updateflag, IMPLOYAL_HUD) // updates that players HUD images so secHUD's pick up they are implanted or not. @@ -515,7 +515,7 @@ src.client.verbs += /client/proc/aooc //HUMAN -/mob/living/carbon/human/mind_initialize() +/mob/living/human/mind_initialize() ..() if(!mind.assigned_role) mind.assigned_role = global.using_map.default_job_title diff --git a/code/datums/movement/mob.dm b/code/datums/movement/mob.dm index 535a962ddfc..a059a123adf 100644 --- a/code/datums/movement/mob.dm +++ b/code/datums/movement/mob.dm @@ -212,7 +212,7 @@ /mob/proc/get_stamina_skill_mod() return 1 -/mob/living/carbon/human/get_stamina_skill_mod() +/mob/living/human/get_stamina_skill_mod() var/mod = (1-((get_skill_value(SKILL_HAULING) - SKILL_MIN)/(SKILL_MAX - SKILL_MIN))) if(species && (species.species_flags & SPECIES_FLAG_LOW_GRAV_ADAPTED)) if(has_gravity()) @@ -221,7 +221,7 @@ mod *= 0.8 return mod -/mob/living/carbon/human/get_stamina_used_per_step() +/mob/living/human/get_stamina_used_per_step() return get_config_value(/decl/config/num/movement_min_sprint_cost) + get_config_value(/decl/config/num/movement_skill_sprint_cost_range) * get_stamina_skill_mod() // Misc. helpers diff --git a/code/datums/outfits/horror_killers.dm b/code/datums/outfits/horror_killers.dm index 49a4ad9bb7c..81a32bd7b7a 100644 --- a/code/datums/outfits/horror_killers.dm +++ b/code/datums/outfits/horror_killers.dm @@ -29,7 +29,7 @@ r_pocket = /obj/item/scalpel hands = list(/obj/item/twohanded/fireaxe) -/decl/hierarchy/outfit/masked_killer/post_equip(var/mob/living/carbon/human/H) +/decl/hierarchy/outfit/masked_killer/post_equip(var/mob/living/human/H) ..() var/victim = get_mannequin(H.ckey) if(victim) @@ -50,7 +50,7 @@ pda_slot = slot_belt_str pda_type = /obj/item/modular_computer/pda/heads -/decl/hierarchy/outfit/reaper/post_equip(var/mob/living/carbon/human/H) +/decl/hierarchy/outfit/reaper/post_equip(var/mob/living/human/H) ..() var/obj/item/secure_storage/briefcase/sec_briefcase = new(H) for(var/obj/item/briefcase_item in sec_briefcase) diff --git a/code/datums/outfits/outfit.dm b/code/datums/outfits/outfit.dm index 7650346a31f..e69dfd4aaa9 100644 --- a/code/datums/outfits/outfit.dm +++ b/code/datums/outfits/outfit.dm @@ -79,11 +79,11 @@ var/global/list/outfits_decls_by_type_ . += "outfit is flagged for sensors, but uniform does not accept sensors" qdel(sensor) -/decl/hierarchy/outfit/proc/pre_equip(mob/living/carbon/human/H) +/decl/hierarchy/outfit/proc/pre_equip(mob/living/human/H) if(outfit_flags & OUTFIT_RESET_EQUIPMENT) H.delete_inventory(TRUE) -/decl/hierarchy/outfit/proc/post_equip(mob/living/carbon/human/H) +/decl/hierarchy/outfit/proc/post_equip(mob/living/human/H) if(outfit_flags & OUTFIT_HAS_JETPACK) var/obj/item/tank/jetpack/J = locate(/obj/item/tank/jetpack) in H if(!J) @@ -91,7 +91,7 @@ var/global/list/outfits_decls_by_type_ J.toggle() J.toggle_valve() -/decl/hierarchy/outfit/proc/equip_outfit(mob/living/carbon/human/H, assignment, equip_adjustments, datum/job/job, datum/mil_rank/rank) +/decl/hierarchy/outfit/proc/equip_outfit(mob/living/human/H, assignment, equip_adjustments, datum/job/job, datum/mil_rank/rank) equip_base(H, equip_adjustments) equip_id(H, assignment, equip_adjustments, job, rank) for(var/path in backpack_contents) @@ -114,7 +114,7 @@ var/global/list/outfits_decls_by_type_ return 1 -/decl/hierarchy/outfit/proc/equip_base(mob/living/carbon/human/H, var/equip_adjustments) +/decl/hierarchy/outfit/proc/equip_base(mob/living/human/H, var/equip_adjustments) set waitfor = FALSE pre_equip(H) @@ -195,7 +195,7 @@ var/global/list/outfits_decls_by_type_ if(H.client?.prefs?.give_passport) global.using_map.create_passport(H) -/decl/hierarchy/outfit/proc/equip_id(mob/living/carbon/human/H, assignment, equip_adjustments, datum/job/job, datum/mil_rank/rank) +/decl/hierarchy/outfit/proc/equip_id(mob/living/human/H, assignment, equip_adjustments, datum/job/job, datum/mil_rank/rank) if(!id_slot || !id_type) return if(OUTFIT_ADJUSTMENT_SKIP_ID_PDA & equip_adjustments) @@ -219,7 +219,7 @@ var/global/list/outfits_decls_by_type_ if(H.equip_to_slot_or_store_or_drop(W, id_slot)) return W -/decl/hierarchy/outfit/proc/equip_pda(var/mob/living/carbon/human/H, var/assignment, var/equip_adjustments) +/decl/hierarchy/outfit/proc/equip_pda(var/mob/living/human/H, var/assignment, var/equip_adjustments) if(!pda_slot || !pda_type) return if(OUTFIT_ADJUSTMENT_SKIP_ID_PDA & equip_adjustments) diff --git a/code/datums/outfits/tournament.dm b/code/datums/outfits/tournament.dm index b73c3b10a3a..2fd86c8501a 100644 --- a/code/datums/outfits/tournament.dm +++ b/code/datums/outfits/tournament.dm @@ -53,7 +53,7 @@ r_pocket = /obj/item/grenade/chem_grenade/cleaner backpack_contents = list(/obj/item/stack/tile/floor = 6) -/decl/hierarchy/outfit/tournament_gear/janitor/post_equip(var/mob/living/carbon/human/H) +/decl/hierarchy/outfit/tournament_gear/janitor/post_equip(var/mob/living/human/H) ..() var/obj/item/chems/glass/bucket/bucket = locate(/obj/item/chems/glass/bucket) in H if(bucket) diff --git a/code/datums/repositories/crew/binary.dm b/code/datums/repositories/crew/binary.dm index fc9636f0b13..06c0014e3d2 100644 --- a/code/datums/repositories/crew/binary.dm +++ b/code/datums/repositories/crew/binary.dm @@ -1,5 +1,5 @@ /* Binary */ -/crew_sensor_modifier/binary/process_crew_data(var/mob/living/carbon/human/H, var/obj/item/clothing/sensor/vitals/S, var/turf/pos, var/list/crew_data) +/crew_sensor_modifier/binary/process_crew_data(var/mob/living/human/H, var/obj/item/clothing/sensor/vitals/S, var/turf/pos, var/list/crew_data) crew_data["alert"] = FALSE if(!H.isSynthetic() && H.should_have_organ(BP_HEART)) var/obj/item/organ/internal/heart/O = H.get_organ(BP_HEART, /obj/item/organ/internal/heart) @@ -19,11 +19,11 @@ /crew_sensor_modifier/binary/jamming priority = 5 -/crew_sensor_modifier/binary/jamming/alive/process_crew_data(var/mob/living/carbon/human/H, var/obj/item/clothing/sensor/vitals/S, var/turf/pos, var/list/crew_data) +/crew_sensor_modifier/binary/jamming/alive/process_crew_data(var/mob/living/human/H, var/obj/item/clothing/sensor/vitals/S, var/turf/pos, var/list/crew_data) crew_data["alert"] = FALSE return MOD_SUIT_SENSORS_HANDLED -/crew_sensor_modifier/binary/jamming/dead/process_crew_data(var/mob/living/carbon/human/H, var/obj/item/clothing/sensor/vitals/S, var/turf/pos, var/list/crew_data) +/crew_sensor_modifier/binary/jamming/dead/process_crew_data(var/mob/living/human/H, var/obj/item/clothing/sensor/vitals/S, var/turf/pos, var/list/crew_data) crew_data["alert"] = TRUE return MOD_SUIT_SENSORS_HANDLED @@ -37,7 +37,7 @@ /crew_sensor_modifier/binary/jamming/random/major error_prob = 100 -/crew_sensor_modifier/binary/jamming/random/process_crew_data(var/mob/living/carbon/human/H, var/obj/item/clothing/sensor/vitals/S, var/turf/pos, var/list/crew_data) +/crew_sensor_modifier/binary/jamming/random/process_crew_data(var/mob/living/human/H, var/obj/item/clothing/sensor/vitals/S, var/turf/pos, var/list/crew_data) . = ..() if(prob(error_prob)) crew_data["alert"] = pick(TRUE, FALSE) diff --git a/code/datums/repositories/crew/crew.dm b/code/datums/repositories/crew/crew.dm index 08b6fb08796..35bd0ecfb51 100644 --- a/code/datums/repositories/crew/crew.dm +++ b/code/datums/repositories/crew/crew.dm @@ -53,7 +53,7 @@ var/global/datum/repository/crew/crew_repository = new() var/turf/pos = get_turf(sensor) if(!pos || pos.z != z_level || sensor.sensor_mode == VITALS_SENSOR_OFF) continue - var/mob/living/carbon/human/H = sensor.loc?.loc + var/mob/living/human/H = sensor.loc?.loc if(!istype(H)) continue var/obj/item/clothing/uniform = H.get_equipped_item(slot_w_uniform_str) @@ -82,7 +82,7 @@ var/global/datum/repository/crew/crew_repository = new() . = cache_data_alert[num2text(z_level)] /datum/repository/crew/proc/scan() - for(var/mob/living/carbon/human/H in SSmobs.mob_list) + for(var/mob/living/human/H in SSmobs.mob_list) var/sensor = H.get_vitals_sensor() if(sensor) LAZYDISTINCTADD(., sensor) @@ -94,7 +94,7 @@ var/global/datum/repository/crew/crew_repository = new() if(. & MOD_SUIT_SENSORS_REJECTED) return -/datum/repository/crew/proc/process_crew_data(var/datum/priority_queue/modifiers, var/mob/living/carbon/human/H, var/obj/item/clothing/sensor/vitals/S, var/turf/pos, var/list/crew_data) +/datum/repository/crew/proc/process_crew_data(var/datum/priority_queue/modifiers, var/mob/living/human/H, var/obj/item/clothing/sensor/vitals/S, var/turf/pos, var/list/crew_data) var/current_priority = INFINITY var/list/modifiers_of_this_priority = list() diff --git a/code/datums/repositories/crew/crew_sensor_modifier.dm b/code/datums/repositories/crew/crew_sensor_modifier.dm index 3771532c8ce..20edfbf1570 100644 --- a/code/datums/repositories/crew/crew_sensor_modifier.dm +++ b/code/datums/repositories/crew/crew_sensor_modifier.dm @@ -13,8 +13,8 @@ may_process_proc = null . = ..() -/crew_sensor_modifier/proc/may_process_crew_data(var/mob/living/carbon/human/H, var/obj/item/clothing/sensor/vitals/S, var/turf/pos) +/crew_sensor_modifier/proc/may_process_crew_data(var/mob/living/human/H, var/obj/item/clothing/sensor/vitals/S, var/turf/pos) return holder && may_process_proc ? call(holder, may_process_proc)(H, S, pos) : TRUE -/crew_sensor_modifier/proc/process_crew_data(var/mob/living/carbon/human/H, var/obj/item/clothing/sensor/vitals/S, var/turf/pos, var/list/crew_data) +/crew_sensor_modifier/proc/process_crew_data(var/mob/living/human/H, var/obj/item/clothing/sensor/vitals/S, var/turf/pos, var/list/crew_data) return MOD_SUIT_SENSORS_HANDLED diff --git a/code/datums/repositories/crew/general.dm b/code/datums/repositories/crew/general.dm index 5e47cfef3ba..7c0cdae96f5 100644 --- a/code/datums/repositories/crew/general.dm +++ b/code/datums/repositories/crew/general.dm @@ -1,5 +1,5 @@ /* General */ -/crew_sensor_modifier/general/process_crew_data(var/mob/living/carbon/human/H, var/obj/item/clothing/sensor/vitals/S, var/turf/pos, var/list/crew_data) +/crew_sensor_modifier/general/process_crew_data(var/mob/living/human/H, var/obj/item/clothing/sensor/vitals/S, var/turf/pos, var/list/crew_data) crew_data["name"] = H.get_authentification_name(if_no_id="Unknown") crew_data["rank"] = H.get_authentification_rank(if_no_id="Unknown", if_no_job="No Job") crew_data["assignment"] = H.get_assignment(if_no_id="Unknown", if_no_job="No Job") @@ -9,21 +9,21 @@ /crew_sensor_modifier/general/jamming priority = 5 -/crew_sensor_modifier/general/jamming/off/process_crew_data(var/mob/living/carbon/human/H, var/obj/item/clothing/sensor/vitals/S, var/turf/pos, var/list/crew_data) +/crew_sensor_modifier/general/jamming/off/process_crew_data(var/mob/living/human/H, var/obj/item/clothing/sensor/vitals/S, var/turf/pos, var/list/crew_data) . = ..() // This works only because general is checked first and crew_data["sensor_type"] is used to check if whether any additional data should be included. crew_data["sensor_type"] = VITALS_SENSOR_OFF return MOD_SUIT_SENSORS_REJECTED -/crew_sensor_modifier/general/jamming/binary/process_crew_data(var/mob/living/carbon/human/H, var/obj/item/clothing/sensor/vitals/S, var/turf/pos, var/list/crew_data) +/crew_sensor_modifier/general/jamming/binary/process_crew_data(var/mob/living/human/H, var/obj/item/clothing/sensor/vitals/S, var/turf/pos, var/list/crew_data) . = ..() crew_data["sensor_type"] = VITALS_SENSOR_BINARY -/crew_sensor_modifier/general/jamming/vital/process_crew_data(var/mob/living/carbon/human/H, var/obj/item/clothing/sensor/vitals/S, var/turf/pos, var/list/crew_data) +/crew_sensor_modifier/general/jamming/vital/process_crew_data(var/mob/living/human/H, var/obj/item/clothing/sensor/vitals/S, var/turf/pos, var/list/crew_data) . = ..() crew_data["sensor_type"] = VITALS_SENSOR_VITAL -/crew_sensor_modifier/general/jamming/tracking/process_crew_data(var/mob/living/carbon/human/H, var/obj/item/clothing/sensor/vitals/S, var/turf/pos, var/list/crew_data) +/crew_sensor_modifier/general/jamming/tracking/process_crew_data(var/mob/living/human/H, var/obj/item/clothing/sensor/vitals/S, var/turf/pos, var/list/crew_data) . = ..() crew_data["sensor_type"] = VITALS_SENSOR_TRACKING @@ -40,7 +40,7 @@ random_sensor_type_prob = 60 random_assignment_prob = 40 -/crew_sensor_modifier/general/jamming/random/process_crew_data(var/mob/living/carbon/human/H, var/obj/item/clothing/sensor/vitals/S, var/turf/pos, var/list/crew_data) +/crew_sensor_modifier/general/jamming/random/process_crew_data(var/mob/living/human/H, var/obj/item/clothing/sensor/vitals/S, var/turf/pos, var/list/crew_data) . = ..() if(prob(random_sensor_type_prob)) crew_data["sensor_type"] = pick(VITALS_SENSOR_OFF, VITALS_SENSOR_BINARY, VITALS_SENSOR_VITAL, VITALS_SENSOR_TRACKING) diff --git a/code/datums/repositories/crew/tracking.dm b/code/datums/repositories/crew/tracking.dm index 51da0115af4..e4b1f4f35ea 100644 --- a/code/datums/repositories/crew/tracking.dm +++ b/code/datums/repositories/crew/tracking.dm @@ -1,5 +1,5 @@ /* Tracking */ -/crew_sensor_modifier/tracking/process_crew_data(var/mob/living/carbon/human/H, var/obj/item/clothing/sensor/vitals/S, var/turf/pos, var/list/crew_data) +/crew_sensor_modifier/tracking/process_crew_data(var/mob/living/human/H, var/obj/item/clothing/sensor/vitals/S, var/turf/pos, var/list/crew_data) if(pos) var/area/A = get_area(pos) crew_data["area"] = A.proper_name @@ -12,7 +12,7 @@ /crew_sensor_modifier/tracking/jamming priority = 5 -/crew_sensor_modifier/tracking/jamming/localize/process_crew_data(var/mob/living/carbon/human/H, var/obj/item/clothing/sensor/vitals/S, var/turf/pos, var/list/crew_data) +/crew_sensor_modifier/tracking/jamming/localize/process_crew_data(var/mob/living/human/H, var/obj/item/clothing/sensor/vitals/S, var/turf/pos, var/list/crew_data) return ..(H, S, get_turf(holder), crew_data) /crew_sensor_modifier/tracking/jamming/random @@ -27,7 +27,7 @@ /crew_sensor_modifier/tracking/jamming/random/major shift_range = 21 -/crew_sensor_modifier/tracking/jamming/random/process_crew_data(var/mob/living/carbon/human/H, var/obj/item/clothing/sensor/vitals/S, var/turf/pos, var/list/crew_data) +/crew_sensor_modifier/tracking/jamming/random/process_crew_data(var/mob/living/human/H, var/obj/item/clothing/sensor/vitals/S, var/turf/pos, var/list/crew_data) if(world.time > next_shift_change) next_shift_change = world.time + rand(30 SECONDS, 2 MINUTES) x_shift = rand(-shift_range, shift_range) diff --git a/code/datums/repositories/crew/vital.dm b/code/datums/repositories/crew/vital.dm index b599c3b4c50..5f57659490a 100644 --- a/code/datums/repositories/crew/vital.dm +++ b/code/datums/repositories/crew/vital.dm @@ -1,5 +1,5 @@ /* Vital */ -/crew_sensor_modifier/vital/process_crew_data(var/mob/living/carbon/human/H, var/obj/item/clothing/sensor/vitals/S, var/turf/pos, var/list/crew_data) +/crew_sensor_modifier/vital/process_crew_data(var/mob/living/human/H, var/obj/item/clothing/sensor/vitals/S, var/turf/pos, var/list/crew_data) crew_data["true_pulse"] = -1 crew_data["pulse"] = "N/A" crew_data["pulse_span"] = "neutral" @@ -100,12 +100,12 @@ /crew_sensor_modifier/vital/jamming priority = 5 -/crew_sensor_modifier/vital/jamming/healthy/process_crew_data(var/mob/living/carbon/human/H, var/obj/item/clothing/sensor/vitals/S, var/turf/pos, var/list/crew_data) +/crew_sensor_modifier/vital/jamming/healthy/process_crew_data(var/mob/living/human/H, var/obj/item/clothing/sensor/vitals/S, var/turf/pos, var/list/crew_data) . = ..() set_healthy(crew_data) return MOD_SUIT_SENSORS_HANDLED -/crew_sensor_modifier/vital/jamming/dead/process_crew_data(var/mob/living/carbon/human/H, var/obj/item/clothing/sensor/vitals/S, var/turf/pos, var/list/crew_data) +/crew_sensor_modifier/vital/jamming/dead/process_crew_data(var/mob/living/human/H, var/obj/item/clothing/sensor/vitals/S, var/turf/pos, var/list/crew_data) . = ..() set_dead(crew_data) return MOD_SUIT_SENSORS_HANDLED @@ -120,7 +120,7 @@ /crew_sensor_modifier/vital/jamming/random/major error_prob = 100 -/crew_sensor_modifier/vital/jamming/random/process_crew_data(var/mob/living/carbon/human/H, var/obj/item/clothing/sensor/vitals/S, var/turf/pos, var/list/crew_data) +/crew_sensor_modifier/vital/jamming/random/process_crew_data(var/mob/living/human/H, var/obj/item/clothing/sensor/vitals/S, var/turf/pos, var/list/crew_data) . = ..() if(prob(error_prob)) pick(set_healthy(crew_data), set_dead(crew_data)) diff --git a/code/datums/repositories/follow.dm b/code/datums/repositories/follow.dm index 3f66b8989c0..2a71b7b3579 100644 --- a/code/datums/repositories/follow.dm +++ b/code/datums/repositories/follow.dm @@ -10,7 +10,7 @@ var/global/repository/follow/follow_repository = new() var/list/excluded_subtypes = list( /obj/machinery/atmospherics, // Atmos stuff calls initialize time and time again.., - /mob/living/carbon/human/dummy/mannequin + /mob/living/human/dummy/mannequin ) /repository/follow/New() @@ -167,9 +167,9 @@ var/global/repository/follow/follow_repository = new() /datum/follow_holder/human sort_order = 2 - followed_type = /mob/living/carbon/human + followed_type = /mob/living/human -/datum/follow_holder/human/get_suffix(var/mob/living/carbon/human/H) +/datum/follow_holder/human/get_suffix(var/mob/living/human/H) suffix = "\[[H.species.name]\]" return ..() diff --git a/code/datums/trading/_trader.dm b/code/datums/trading/_trader.dm index 79a242f90eb..267e2c67c77 100644 --- a/code/datums/trading/_trader.dm +++ b/code/datums/trading/_trader.dm @@ -31,7 +31,7 @@ // Things they will automatically refuse var/list/blacklisted_trade_items = list( - /mob/living/carbon/human + /mob/living/human ) /datum/trader/New() @@ -197,7 +197,7 @@ /datum/trader/proc/hail(var/mob/user) var/specific if(ishuman(user)) - var/mob/living/carbon/human/H = user + var/mob/living/human/H = user if(H.species) specific = H.species.name else if(issilicon(user)) diff --git a/code/datums/trading/traders/unique.dm b/code/datums/trading/traders/unique.dm index a7269edd2e3..4ece0ed7bfd 100644 --- a/code/datums/trading/traders/unique.dm +++ b/code/datums/trading/traders/unique.dm @@ -33,7 +33,7 @@ possible_wanted_items = list( /obj/item/chems/food/human = TRADER_SUBTYPES_ONLY, /obj/item/chems/food/butchery/meat/human = TRADER_THIS_TYPE, - /mob/living/carbon/human = TRADER_ALL + /mob/living/human = TRADER_ALL ) possible_trading_items = list( diff --git a/code/datums/uplink/uplink_items.dm b/code/datums/uplink/uplink_items.dm index f86dd9cb05c..5ed21617c4c 100644 --- a/code/datums/uplink/uplink_items.dm +++ b/code/datums/uplink/uplink_items.dm @@ -131,7 +131,7 @@ var/global/datum/uplink/uplink = new() if(L.len) I = L[1] if(istype(I) && ishuman(user)) - var/mob/living/carbon/human/A = user + var/mob/living/human/A = user A.put_in_hands(I) return I diff --git a/code/datums/uplink/uplink_sources.dm b/code/datums/uplink/uplink_sources.dm index 860b8748bd8..a0dc90c3bf9 100644 --- a/code/datums/uplink/uplink_sources.dm +++ b/code/datums/uplink/uplink_sources.dm @@ -68,7 +68,7 @@ var/global/list/default_uplink_source_priority = list( name = "Implant" desc = "Teleports an uplink implant into your head. Costs 20% of the initial TC amount." -/decl/uplink_source/implant/setup_uplink_source(var/mob/living/carbon/human/H, var/amount) +/decl/uplink_source/implant/setup_uplink_source(var/mob/living/human/H, var/amount) if(!istype(H)) return SETUP_FAILED diff --git a/code/game/antagonist/antagonist.dm b/code/game/antagonist/antagonist.dm index 6aabe004cbe..be291b8ac25 100644 --- a/code/game/antagonist/antagonist.dm +++ b/code/game/antagonist/antagonist.dm @@ -42,7 +42,7 @@ // Misc. var/landmark_id // Spawn point identifier. - var/mob_path = /mob/living/carbon/human // Mobtype this antag will use if none is provided. + var/mob_path = /mob/living/human // Mobtype this antag will use if none is provided. var/minimum_player_age = 7 // Players need to be at least minimum_player_age days old before they are eligable for auto-spawning var/flags = 0 // Various runtime options. var/show_objectives_on_creation = 1 // Whether or not objectives are shown when a player is added to this antag datum diff --git a/code/game/antagonist/antagonist_create.dm b/code/game/antagonist/antagonist_create.dm index fb6050b4a94..17e9a80b9cf 100644 --- a/code/game/antagonist/antagonist_create.dm +++ b/code/game/antagonist/antagonist_create.dm @@ -23,7 +23,7 @@ if(mob_path) M = new mob_path(get_turf(source)) else - M = new /mob/living/carbon/human(get_turf(source)) + M = new /mob/living/human(get_turf(source)) M.ckey = source.ckey add_antagonist(M.mind, 1, 0, 1) // Equip them and move them to spawn. return M diff --git a/code/game/antagonist/antagonist_equip.dm b/code/game/antagonist/antagonist_equip.dm index 4808f235716..053e1552751 100644 --- a/code/game/antagonist/antagonist_equip.dm +++ b/code/game/antagonist/antagonist_equip.dm @@ -1,4 +1,4 @@ -/decl/special_role/proc/equip_role(var/mob/living/carbon/human/player) +/decl/special_role/proc/equip_role(var/mob/living/human/player) SHOULD_CALL_PARENT(TRUE) @@ -31,10 +31,10 @@ return TRUE -/decl/special_role/proc/unequip_role(var/mob/living/carbon/human/player) +/decl/special_role/proc/unequip_role(var/mob/living/human/player) return istype(player) -/decl/special_role/proc/equip_rig(var/rig_type, var/mob/living/carbon/human/player) +/decl/special_role/proc/equip_rig(var/rig_type, var/mob/living/human/player) set waitfor = FALSE if(istype(player) && ispath(rig_type)) var/obj/item/rig/rig = new rig_type(player) diff --git a/code/game/antagonist/antagonist_update.dm b/code/game/antagonist/antagonist_update.dm index 454d1c1b2f1..be03efcadfd 100644 --- a/code/game/antagonist/antagonist_update.dm +++ b/code/game/antagonist/antagonist_update.dm @@ -16,7 +16,7 @@ player.original = player.current if(!preserve_appearance && (flags & ANTAG_SET_APPEARANCE)) spawn(3) - var/mob/living/carbon/human/H = player.current + var/mob/living/human/H = player.current if(istype(H)) H.change_appearance(APPEARANCE_ALL, H.loc, H, valid_species, state = global.z_topic_state) return player.current diff --git a/code/game/antagonist/outsider/ert.dm b/code/game/antagonist/outsider/ert.dm index 059a304b67e..0e6db1cebaf 100644 --- a/code/game/antagonist/outsider/ert.dm +++ b/code/game/antagonist/outsider/ert.dm @@ -25,7 +25,7 @@ base_to_load = "ERT Base" /decl/special_role/ert/create_default(var/mob/source) - var/mob/living/carbon/human/M = ..() + var/mob/living/human/M = ..() if(istype(M)) M.set_age(rand(25,45)) diff --git a/code/game/antagonist/outsider/mercenary.dm b/code/game/antagonist/outsider/mercenary.dm index b381a6f3fbc..a45f958df65 100644 --- a/code/game/antagonist/outsider/mercenary.dm +++ b/code/game/antagonist/outsider/mercenary.dm @@ -27,7 +27,7 @@ global_objectives |= new /datum/objective/nuclear return 1 -/decl/special_role/mercenary/equip_role(var/mob/living/carbon/human/player) +/decl/special_role/mercenary/equip_role(var/mob/living/human/player) . = ..() if(.) var/obj/item/radio/uplink/U = new(get_turf(player), player.mind, DEFAULT_TELECRYSTAL_AMOUNT) diff --git a/code/game/antagonist/outsider/wizard.dm b/code/game/antagonist/outsider/wizard.dm index 502d26ec682..d63f249ce37 100644 --- a/code/game/antagonist/outsider/wizard.dm +++ b/code/game/antagonist/outsider/wizard.dm @@ -64,7 +64,7 @@ wizard.current.real_name = "[pick(global.wizard_first)] [pick(global.wizard_second)]" wizard.current.SetName(wizard.current.real_name) -/decl/special_role/wizard/equip_role(var/mob/living/carbon/human/wizard_mob) +/decl/special_role/wizard/equip_role(var/mob/living/human/wizard_mob) default_outfit = pick(decls_repository.get_decl_paths_of_subtype(/decl/hierarchy/outfit/wizard)) . = ..() @@ -102,7 +102,7 @@ Made a proc so this is not repeated 14 (or more) times.*/ return 0 // Humans can wear clothes. -/mob/living/carbon/human/wearing_wiz_garb() +/mob/living/human/wearing_wiz_garb() if(!is_wiz_garb(get_equipped_item(slot_wear_suit_str)) && (!istype(species.species_hud) || (slot_wear_suit_str in species.species_hud.equip_slots))) to_chat(src, "I don't feel strong enough without my robe.") return 0 diff --git a/code/game/antagonist/station/cultist.dm b/code/game/antagonist/station/cultist.dm index 3537898a6db..2ef8405cd59 100644 --- a/code/game/antagonist/station/cultist.dm +++ b/code/game/antagonist/station/cultist.dm @@ -68,7 +68,7 @@ sacrifice_target = sacrifice.target global_objectives |= sacrifice -/decl/special_role/cultist/equip_role(var/mob/living/carbon/human/player) +/decl/special_role/cultist/equip_role(var/mob/living/human/player) . = ..() if(.) var/obj/item/book/tome/T = new(get_turf(player)) diff --git a/code/game/antagonist/station/loyalist.dm b/code/game/antagonist/station/loyalist.dm index f6ef8f7c3ea..8b3ab1b6c9a 100644 --- a/code/game/antagonist/station/loyalist.dm +++ b/code/game/antagonist/station/loyalist.dm @@ -34,7 +34,7 @@ if(!..()) return global_objectives = list() - for(var/mob/living/carbon/human/player in SSmobs.mob_list) + for(var/mob/living/human/player in SSmobs.mob_list) if(!player.mind || player.stat == DEAD || !(player.mind.assigned_role in SSjobs.titles_by_department(command_department_id))) continue var/datum/objective/protect/loyal_obj = new diff --git a/code/game/antagonist/station/renegade.dm b/code/game/antagonist/station/renegade.dm index 1269452a0b4..96b6e6e3174 100644 --- a/code/game/antagonist/station/renegade.dm +++ b/code/game/antagonist/station/renegade.dm @@ -43,7 +43,7 @@ survive.owner = player player.objectives |= survive -/decl/special_role/renegade/equip_role(var/mob/living/carbon/human/player) +/decl/special_role/renegade/equip_role(var/mob/living/human/player) . = ..() if(.) var/gun_type = pick(spawn_guns) diff --git a/code/game/antagonist/station/revolutionary.dm b/code/game/antagonist/station/revolutionary.dm index b56b094a7d8..eb53a093461 100644 --- a/code/game/antagonist/station/revolutionary.dm +++ b/code/game/antagonist/station/revolutionary.dm @@ -34,7 +34,7 @@ if(!..()) return global_objectives = list() - for(var/mob/living/carbon/human/player in SSmobs.mob_list) + for(var/mob/living/human/player in SSmobs.mob_list) if(!player.mind || player.stat == DEAD || !(player.mind.assigned_role in SSjobs.titles_by_department(command_department_id))) continue var/datum/objective/rev/rev_obj = new @@ -42,10 +42,10 @@ rev_obj.explanation_text = "Assassinate, capture or convert [player.real_name], the [player.mind.assigned_role]." global_objectives += rev_obj -/decl/special_role/revolutionary/equip_role(var/mob/living/carbon/human/player) +/decl/special_role/revolutionary/equip_role(var/mob/living/human/player) . = ..() if(.) spawn_uplink(player) -/decl/special_role/revolutionary/proc/spawn_uplink(var/mob/living/carbon/human/revolutionary_mob) +/decl/special_role/revolutionary/proc/spawn_uplink(var/mob/living/human/revolutionary_mob) setup_uplink_source(revolutionary_mob, DEFAULT_TELECRYSTAL_AMOUNT) diff --git a/code/game/antagonist/station/traitor.dm b/code/game/antagonist/station/traitor.dm index b05e5f9a7b0..3622249e5f4 100644 --- a/code/game/antagonist/station/traitor.dm +++ b/code/game/antagonist/station/traitor.dm @@ -72,7 +72,7 @@ if(.) var/list/dudes = list() - for(var/mob/living/carbon/human/man in global.player_list) + for(var/mob/living/human/man in global.player_list) if(man.client) var/decl/cultural_info/culture = man.get_cultural_value(TAG_FACTION) if(culture && prob(culture.subversive_potential)) @@ -83,7 +83,7 @@ dudes -= obj.target?.current if(length(dudes)) - var/mob/living/carbon/human/M = pick(dudes) + var/mob/living/human/M = pick(dudes) to_chat(player.current, "We have received credible reports that [M.real_name] might be willing to help our cause. If you need assistance, consider contacting them.") player.StoreMemory("Potential Collaborator: [M.real_name]", /decl/memory_options/system) @@ -101,7 +101,7 @@ player.StoreMemory("Code Response: [syndicate_code_response]", /decl/memory_options/system) to_chat(player.current, "Use the code words, preferably in the order provided, during regular conversation, to identify other agents. Proceed with caution, however, as everyone is a potential foe.") -/decl/special_role/traitor/equip_role(var/mob/living/carbon/human/player) +/decl/special_role/traitor/equip_role(var/mob/living/human/player) . = ..() if(issilicon(player)) // this needs to be here because ..() returns false if the mob isn't human @@ -117,7 +117,7 @@ else return FALSE -/decl/special_role/traitor/proc/spawn_uplink(var/mob/living/carbon/human/traitor_mob) +/decl/special_role/traitor/proc/spawn_uplink(var/mob/living/human/traitor_mob) setup_uplink_source(traitor_mob, DEFAULT_TELECRYSTAL_AMOUNT) /decl/special_role/traitor/proc/add_law_zero(mob/living/silicon/ai/killer) diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm index 9b8adec92bf..ba392ffe5c9 100644 --- a/code/game/area/areas.dm +++ b/code/game/area/areas.dm @@ -154,7 +154,7 @@ var/global/list/areas = list() for(var/obj/machinery/door/firedoor/door in src) door.update_area_registrations() -/area/proc/alert_on_fall(var/mob/living/carbon/human/H) +/area/proc/alert_on_fall(var/mob/living/human/H) return /area/proc/get_cameras() @@ -405,7 +405,7 @@ var/global/list/mob/living/forced_ambiance_list = new return if(ishuman(mob)) - var/mob/living/carbon/human/H = mob + var/mob/living/human/H = mob if(prob(H.skill_fail_chance(SKILL_EVA, 100, SKILL_ADEPT))) if(!MOVING_DELIBERATELY(H)) ADJ_STATUS(H, STAT_STUN, 6) diff --git a/code/game/gamemodes/cult/cult_items.dm b/code/game/gamemodes/cult/cult_items.dm index a993e91d96f..fae84e6d780 100644 --- a/code/game/gamemodes/cult/cult_items.dm +++ b/code/game/gamemodes/cult/cult_items.dm @@ -17,7 +17,7 @@ var/obj/item/organ/external/affecting = null if(ishuman(user)) - var/mob/living/carbon/human/H = user + var/mob/living/human/H = user affecting = GET_EXTERNAL_ORGAN(H, zone) if(affecting) diff --git a/code/game/gamemodes/cult/ghosts.dm b/code/game/gamemodes/cult/ghosts.dm index cd9e729dbc1..575a3e0363f 100644 --- a/code/game/gamemodes/cult/ghosts.dm +++ b/code/game/gamemodes/cult/ghosts.dm @@ -206,11 +206,11 @@ if(!ghost_ability_check()) return - var/list/mob/living/carbon/human/choices = list() - for(var/mob/living/carbon/human/H in range(1)) + var/list/mob/living/human/choices = list() + for(var/mob/living/human/H in range(1)) choices += H - var/mob/living/carbon/human/choice = input(src, "Whom do you want to scratch?") as null|anything in choices + var/mob/living/human/choice = input(src, "Whom do you want to scratch?") as null|anything in choices if(!choice) return @@ -234,11 +234,11 @@ if(!ghost_ability_check()) return - var/list/mob/living/carbon/human/choices = list() - for(var/mob/living/carbon/human/H in range(1)) + var/list/mob/living/human/choices = list() + for(var/mob/living/human/H in range(1)) choices += H - var/mob/living/carbon/human/choice = input(src, "Whom do you want to scare?") as null|anything in choices + var/mob/living/human/choice = input(src, "Whom do you want to scare?") as null|anything in choices if(!choice) return diff --git a/code/game/gamemodes/cult/narsie.dm b/code/game/gamemodes/cult/narsie.dm index 943bc1b1f69..11ea55d1302 100644 --- a/code/game/gamemodes/cult/narsie.dm +++ b/code/game/gamemodes/cult/narsie.dm @@ -97,7 +97,7 @@ var/global/list/narsie_list = list() targets += cult_nh_mind.current // If we have no valid cultists, go for any human. if(!length(targets)) - for(var/mob/living/carbon/human/food in global.living_mob_list_) + for(var/mob/living/human/food in global.living_mob_list_) if(food.stat) var/turf/pos = get_turf(food) if(pos?.z in current_zs) diff --git a/code/game/gamemodes/cult/ritual.dm b/code/game/gamemodes/cult/ritual.dm index b0d234d3f80..30ddc153267 100644 --- a/code/game/gamemodes/cult/ritual.dm +++ b/code/game/gamemodes/cult/ritual.dm @@ -96,7 +96,7 @@ return 1 return 0 -/mob/living/carbon/human/make_rune(var/rune, var/cost, var/tome_required) +/mob/living/human/make_rune(var/rune, var/cost, var/tome_required) if(should_have_organ(BP_HEART) && vessel && vessel.total_volume < species.blood_volume * 0.7) to_chat(src, "You are too weak to draw runes.") return @@ -105,7 +105,7 @@ /mob/proc/remove_blood_simple(var/blood) return -/mob/living/carbon/human/remove_blood_simple(var/blood) +/mob/living/human/remove_blood_simple(var/blood) if(should_have_organ(BP_HEART)) vessel.remove_any(blood) @@ -115,7 +115,7 @@ /mob/living/silicon/get_blood_name() return "oil" -/mob/living/carbon/human/get_blood_name() +/mob/living/human/get_blood_name() if(species) return species.get_blood_name(src) return "blood" @@ -126,7 +126,7 @@ /mob/proc/mob_needs_tome() return 0 -/mob/living/carbon/human/mob_needs_tome() +/mob/living/human/mob_needs_tome() return 1 var/global/list/Tier1Runes = list( @@ -312,7 +312,7 @@ var/global/list/Tier4Runes = list( /mob/proc/message_cult_communicate() return -/mob/living/carbon/human/message_cult_communicate() +/mob/living/human/message_cult_communicate() var/decl/pronouns/G = get_pronouns() visible_message(SPAN_WARNING("\The [src] cuts [G.his] finger and starts drawing on the back of [G.his] hand.")) diff --git a/code/game/gamemodes/cult/runes.dm b/code/game/gamemodes/cult/runes.dm index ffdd2b17b7c..9c426d7f622 100644 --- a/code/game/gamemodes/cult/runes.dm +++ b/code/game/gamemodes/cult/runes.dm @@ -472,7 +472,7 @@ var/dam_amt = 2 + length(casters) victim.take_organ_damage(dam_amt, dam_amt) // This is to speed up the process and also damage mobs that don't take damage from being on fire, e.g. borgs if(ishuman(victim)) - var/mob/living/carbon/human/H = victim + var/mob/living/human/H = victim if(H.is_asystole()) H.take_damage(2 + casters.len, BRAIN) sleep(40) @@ -492,7 +492,7 @@ /* old sac code - left there in case someone wants to salvage it var/worth = 0 if(ishuman(H)) - var/mob/living/carbon/human/lamb = H + var/mob/living/human/lamb = H if(lamb.species.rarity_value > 3) worth = 1 @@ -520,8 +520,8 @@ strokes = 3 /obj/effect/rune/drain/cast(var/mob/living/user) - var/mob/living/carbon/human/victim - for(var/mob/living/carbon/human/M in get_turf(src)) + var/mob/living/human/victim + for(var/mob/living/human/M in get_turf(src)) if(iscultist(M)) continue victim = M @@ -536,7 +536,7 @@ user.visible_message("Blood flows from \the [src] into \the [user]!", "The blood starts flowing from \the [src] into your frail mortal body. [capitalize(english_list(heal_user(user), nothing_text = "you feel no different"))].", "You hear liquid flow.") user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) -/obj/effect/rune/drain/proc/heal_user(var/mob/living/carbon/human/user) +/obj/effect/rune/drain/proc/heal_user(var/mob/living/human/user) if(!istype(user)) return list("you feel no different") var/list/statuses = list() @@ -699,9 +699,9 @@ strokes = 4 /obj/effect/rune/revive/cast(var/mob/living/user) - var/mob/living/carbon/human/target + var/mob/living/human/target var/obj/item/soulstone/source - for(var/mob/living/carbon/human/M in get_turf(src)) + for(var/mob/living/human/M in get_turf(src)) if(M.stat == DEAD) if(iscultist(M)) if(M.key) diff --git a/code/game/gamemodes/endgame/ftl_jump/ftl_jump.dm b/code/game/gamemodes/endgame/ftl_jump/ftl_jump.dm index 7b9a494cc02..b95a69b21c6 100644 --- a/code/game/gamemodes/endgame/ftl_jump/ftl_jump.dm +++ b/code/game/gamemodes/endgame/ftl_jump/ftl_jump.dm @@ -72,7 +72,7 @@ /obj/effect/bluegoast name = "echo" desc = "It's not going to punch you, is it?" - var/mob/living/carbon/human/daddy + var/mob/living/human/daddy anchored = TRUE var/reality = 0 simulated = 0 @@ -119,7 +119,7 @@ return daddy.examine(arglist(args)) /obj/effect/bluegoast/proc/blueswitch() - var/mob/living/carbon/human/H + var/mob/living/human/H if(ishuman(daddy)) H = new(get_turf(src), daddy.species.name, daddy.get_mob_snapshot(force = TRUE), daddy.get_bodytype()) for(var/obj/item/entry in daddy.get_equipped_items(TRUE)) diff --git a/code/game/gamemodes/game_mode_latespawn.dm b/code/game/gamemodes/game_mode_latespawn.dm index 8fd44e1744d..eee94e85b16 100644 --- a/code/game/gamemodes/game_mode_latespawn.dm +++ b/code/game/gamemodes/game_mode_latespawn.dm @@ -21,13 +21,13 @@ return TRUE //This can be overriden in case a game mode needs to do stuff when a player latejoins -/decl/game_mode/proc/handle_latejoin(var/mob/living/carbon/human/character) +/decl/game_mode/proc/handle_latejoin(var/mob/living/human/character) if(character.mind) character.mind.generate_goals(character.mind.assigned_job, is_spawning=TRUE) character.show_goals() return 0 -/decl/game_mode/proc/handle_offsite_latejoin(var/mob/living/carbon/human/character) +/decl/game_mode/proc/handle_offsite_latejoin(var/mob/living/human/character) return 0 /decl/game_mode/proc/process_autoantag() diff --git a/code/game/gamemodes/objectives/objective_cult.dm b/code/game/gamemodes/objectives/objective_cult.dm index fae01f2ab57..4f8982daf12 100644 --- a/code/game/gamemodes/objectives/objective_cult.dm +++ b/code/game/gamemodes/objectives/objective_cult.dm @@ -16,7 +16,7 @@ var/list/possible_targets = list() if(!possible_targets.len) var/decl/special_role/cult = GET_DECL(/decl/special_role/cultist) - for(var/mob/living/carbon/human/player in global.player_list) + for(var/mob/living/human/player in global.player_list) if(player.mind && !(player.mind in cult.current_antagonists)) possible_targets += player.mind if(possible_targets.len > 0) diff --git a/code/game/gamemodes/wizard/servant_items/champion.dm b/code/game/gamemodes/wizard/servant_items/champion.dm index 3ea1d3c90f2..bb5e7504f49 100644 --- a/code/game/gamemodes/wizard/servant_items/champion.dm +++ b/code/game/gamemodes/wizard/servant_items/champion.dm @@ -71,7 +71,7 @@ /obj/item/sword/excalibur/Process() if(isliving(loc)) if(ishuman(loc)) - var/mob/living/carbon/human/H = loc + var/mob/living/human/H = loc var/obj/item/organ/external/E = GET_EXTERNAL_ORGAN(H, H.get_active_held_item_slot()) E?.take_external_damage(burn=2,used_weapon="stovetop") else diff --git a/code/game/jobs/job/_job.dm b/code/game/jobs/job/_job.dm index c1730e37ba0..1821e5bf5f0 100644 --- a/code/game/jobs/job/_job.dm +++ b/code/game/jobs/job/_job.dm @@ -88,7 +88,7 @@ /datum/job/dd_SortValue() return title -/datum/job/proc/equip_job(var/mob/living/carbon/human/H, var/alt_title, var/datum/mil_branch/branch, var/datum/mil_rank/grade) +/datum/job/proc/equip_job(var/mob/living/human/H, var/alt_title, var/datum/mil_branch/branch, var/datum/mil_rank/grade) H.add_language(/decl/language/human/common) if (required_language) H.add_language(required_language) @@ -113,7 +113,7 @@ var/obj/item/key/new_key = new(get_turf(H), lock_keys[lock_key] || /decl/material/solid/metal/iron, lock_key) keyring.storage?.handle_item_insertion(null, new_key) -/datum/job/proc/get_outfit(var/mob/living/carbon/human/H, var/alt_title, var/datum/mil_branch/branch, var/datum/mil_rank/grade) +/datum/job/proc/get_outfit(var/mob/living/human/H, var/alt_title, var/datum/mil_branch/branch, var/datum/mil_rank/grade) if(alt_title && alt_titles) . = alt_titles[alt_title] if(allowed_branches && branch) @@ -123,14 +123,14 @@ . = . || outfit_type . = outfit_by_type(.) -/datum/job/proc/create_cash_on_hand(var/mob/living/carbon/human/H, var/datum/money_account/M) +/datum/job/proc/create_cash_on_hand(var/mob/living/human/H, var/datum/money_account/M) if(!istype(M) || !H.client?.prefs?.starting_cash_choice) return 0 for(var/obj/item/thing in H.client.prefs.starting_cash_choice.get_cash_objects(H, M)) . += thing.get_base_value() H.equip_to_storage_or_put_in_hands(thing) -/datum/job/proc/get_total_starting_money(var/mob/living/carbon/human/H) +/datum/job/proc/get_total_starting_money(var/mob/living/human/H) . = 4 * rand(75, 100) * economic_power // Get an average economic power for our cultures. var/culture_mod = 0 @@ -148,7 +148,7 @@ . *= 1 + 2 * H.get_skill_value(SKILL_FINANCE)/(SKILL_MAX - SKILL_MIN) . = round(.) -/datum/job/proc/setup_account(var/mob/living/carbon/human/H) +/datum/job/proc/setup_account(var/mob/living/human/H) if(!account_allowed || (H.mind && H.mind.initial_account)) return @@ -176,7 +176,7 @@ H.mind.initial_account = M // overrideable separately so AIs/borgs can have cardborg hats without unneccessary new()/qdel() -/datum/job/proc/equip_preview(mob/living/carbon/human/H, var/alt_title, var/datum/mil_branch/branch, var/datum/mil_rank/grade, var/additional_skips) +/datum/job/proc/equip_preview(mob/living/human/H, var/alt_title, var/datum/mil_branch/branch, var/datum/mil_rank/grade, var/additional_skips) var/decl/hierarchy/outfit/outfit = get_outfit(H, alt_title, branch, grade) if(!outfit) return FALSE @@ -196,14 +196,14 @@ return max(0, minimal_player_age - C.player_age) return 0 -/datum/job/proc/apply_fingerprints(var/mob/living/carbon/human/target) +/datum/job/proc/apply_fingerprints(var/mob/living/human/target) if(!istype(target)) return 0 for(var/obj/item/item in target.contents) apply_fingerprints_to_item(target, item) return 1 -/datum/job/proc/apply_fingerprints_to_item(var/mob/living/carbon/human/holder, var/obj/item/item) +/datum/job/proc/apply_fingerprints_to_item(var/mob/living/human/holder, var/obj/item/item) item.add_fingerprint(holder,1) if(item.contents.len) for(var/obj/item/sub_item in item.contents) @@ -368,7 +368,7 @@ /datum/job/proc/get_job_icon() if(!SSjobs.job_icons[title]) - var/mob/living/carbon/human/dummy/mannequin/mannequin = get_mannequin("#job_icon") + var/mob/living/human/dummy/mannequin/mannequin = get_mannequin("#job_icon") if(mannequin) var/decl/species/mannequin_species = get_species_by_key(global.using_map.default_species) if(!is_species_allowed(mannequin_species)) @@ -415,7 +415,7 @@ if(LAZYLEN(reasons)) . = reasons -/datum/job/proc/dress_mannequin(var/mob/living/carbon/human/dummy/mannequin/mannequin) +/datum/job/proc/dress_mannequin(var/mob/living/human/dummy/mannequin/mannequin) if(mannequin) mannequin.delete_inventory(TRUE) equip_preview(mannequin, additional_skips = OUTFIT_ADJUSTMENT_SKIP_BACKPACK) @@ -487,7 +487,7 @@ return TRUE return FALSE -/datum/job/proc/handle_variant_join(var/mob/living/carbon/human/H, var/alt_title) +/datum/job/proc/handle_variant_join(var/mob/living/human/H, var/alt_title) return /datum/job/proc/check_special_blockers(var/datum/preferences/prefs) diff --git a/code/game/machinery/OpTable.dm b/code/game/machinery/OpTable.dm index 7ef453582b6..e672e48f506 100644 --- a/code/game/machinery/OpTable.dm +++ b/code/game/machinery/OpTable.dm @@ -80,7 +80,7 @@ if(!victim || !victim.current_posture.prone || victim.loc != loc) suppressing = FALSE victim = null - for(var/mob/living/carbon/human/H in loc) + for(var/mob/living/human/H in loc) if(H.current_posture.prone) victim = H break @@ -93,7 +93,7 @@ /obj/machinery/optable/on_update_icon() icon_state = "table2-idle" if(ishuman(victim)) - var/mob/living/carbon/human/H = victim + var/mob/living/human/H = victim if(H.get_pulse()) icon_state = "table2-active" diff --git a/code/game/machinery/Sleeper.dm b/code/game/machinery/Sleeper.dm index 6ffb055c0d6..ff647bdbbf5 100644 --- a/code/game/machinery/Sleeper.dm +++ b/code/game/machinery/Sleeper.dm @@ -15,7 +15,7 @@ active_power_usage = 1 KILOWATTS //builtin health analyzer, dialysis machine, injectors. pixel_z = -8 - var/mob/living/carbon/human/occupant + var/mob/living/human/occupant var/obj/item/chems/glass/beaker = null var/filtering = 0 var/pump diff --git a/code/game/machinery/bodyscanner.dm b/code/game/machinery/bodyscanner.dm index 2e815dae25a..067ca08ef6d 100644 --- a/code/game/machinery/bodyscanner.dm +++ b/code/game/machinery/bodyscanner.dm @@ -1,6 +1,6 @@ // Pretty much everything here is stolen from the dna scanner FYI /obj/machinery/bodyscanner - var/mob/living/carbon/human/occupant + var/mob/living/human/occupant var/locked name = "Body Scanner" icon = 'icons/obj/Cryogenic2.dmi' diff --git a/code/game/machinery/camera/camera.dm b/code/game/machinery/camera/camera.dm index 3de4c4c7097..2565c5f3e16 100644 --- a/code/game/machinery/camera/camera.dm +++ b/code/game/machinery/camera/camera.dm @@ -51,7 +51,7 @@ if(stat & BROKEN) to_chat(user, SPAN_WARNING("It is completely demolished.")) -/obj/machinery/camera/apply_visual(mob/living/carbon/human/M) +/obj/machinery/camera/apply_visual(mob/living/human/M) if(!M.client || !istype(M)) return M.overlay_fullscreen("fishbed",/obj/screen/fullscreen/fishbed) @@ -60,7 +60,7 @@ M.machine_visual = src return 1 -/obj/machinery/camera/remove_visual(mob/living/carbon/human/M) +/obj/machinery/camera/remove_visual(mob/living/human/M) if(!M.client || !istype(M)) return M.clear_fullscreen("fishbed",0) @@ -183,7 +183,7 @@ visible_message(SPAN_WARNING("[src] was hit by [O]!")) take_damage(O.throwforce, O.atom_damage_type) -/obj/machinery/camera/physical_attack_hand(mob/living/carbon/human/user) +/obj/machinery/camera/physical_attack_hand(mob/living/human/user) if(!istype(user)) return if(user.species.can_shred(user)) diff --git a/code/game/machinery/camera/tracking.dm b/code/game/machinery/camera/tracking.dm index 63a2bd834e9..91976e992ed 100644 --- a/code/game/machinery/camera/tracking.dm +++ b/code/game/machinery/camera/tracking.dm @@ -221,7 +221,7 @@ var/datum/extension/network_device/camera/robot/D = get_extension(src, /datum/extension/network_device) return D && D.is_functional() ? TRACKING_POSSIBLE : TRACKING_NO_COVERAGE -/mob/living/carbon/human/tracking_status() +/mob/living/human/tracking_status() if(is_cloaked()) . = TRACKING_TERMINATE else diff --git a/code/game/machinery/computer/Operating.dm b/code/game/machinery/computer/Operating.dm index 6ae35fa9752..0fd5d644fe5 100644 --- a/code/game/machinery/computer/Operating.dm +++ b/code/game/machinery/computer/Operating.dm @@ -6,7 +6,7 @@ anchored = TRUE icon_keyboard = "med_key" icon_screen = "crew" - var/mob/living/carbon/human/victim = null + var/mob/living/human/victim = null var/obj/machinery/optable/table = null /obj/machinery/computer/operating/Initialize() diff --git a/code/game/machinery/computer/arcade_orion.dm b/code/game/machinery/computer/arcade_orion.dm index bd47447a26d..412d5a7841b 100644 --- a/code/game/machinery/computer/arcade_orion.dm +++ b/code/game/machinery/computer/arcade_orion.dm @@ -411,7 +411,7 @@ to_chat(usr, "The sounds of battle fill your ears...") if(ORION_TRAIL_ILLNESS) if(ishuman(usr)) - var/mob/living/carbon/human/M = usr + var/mob/living/human/M = usr to_chat(M, "An overpowering wave of nausea consumes over you. You hunch over, your stomach's contents preparing for a spectacular exit.") M.vomit() else diff --git a/code/game/machinery/cryopod.dm b/code/game/machinery/cryopod.dm index 25b6e68ade9..3743f5a6a78 100644 --- a/code/game/machinery/cryopod.dm +++ b/code/game/machinery/cryopod.dm @@ -151,7 +151,7 @@ var/on_store_message = "has entered long-term storage." var/on_store_name = "Cryogenic Oversight" var/on_enter_occupant_message = "You feel cool air surround you. You go numb as your senses turn inward." - var/allow_occupant_types = list(/mob/living/carbon/human) + var/allow_occupant_types = list(/mob/living/human) var/disallow_occupant_types = list() var/mob/living/occupant // Person waiting to be despawned. diff --git a/code/game/machinery/doors/_door.dm b/code/game/machinery/doors/_door.dm index d95ef079a46..3af28af67b7 100644 --- a/code/game/machinery/doors/_door.dm +++ b/code/game/machinery/doors/_door.dm @@ -391,7 +391,7 @@ else if(current_health < current_max_health && get_dist(src, user) <= 1) to_chat(user, "\The [src] has some minor scuffing.") - var/mob/living/carbon/human/H = user + var/mob/living/human/H = user if (emagged && istype(H) && (H.skill_check(SKILL_COMPUTER, SKILL_ADEPT) || H.skill_check(SKILL_ELECTRICAL, SKILL_ADEPT))) to_chat(user, SPAN_WARNING("\The [src]'s control panel looks fried.")) diff --git a/code/game/machinery/doors/airlock_interactions.dm b/code/game/machinery/doors/airlock_interactions.dm index 0b0545aee31..2ad96280a52 100644 --- a/code/game/machinery/doors/airlock_interactions.dm +++ b/code/game/machinery/doors/airlock_interactions.dm @@ -79,7 +79,7 @@ if(src.Move(T)) return -/mob/living/carbon/human/airlock_crush(var/crush_damage) +/mob/living/human/airlock_crush(var/crush_damage) . = ..() if (can_feel_pain()) emote(/decl/emote/audible/scream) diff --git a/code/game/machinery/doors/windowdoor.dm b/code/game/machinery/doors/windowdoor.dm index d3f2226c391..66171dc8f41 100644 --- a/code/game/machinery/doors/windowdoor.dm +++ b/code/game/machinery/doors/windowdoor.dm @@ -140,7 +140,7 @@ /obj/machinery/door/window/physical_attack_hand(mob/user) if(ishuman(user)) - var/mob/living/carbon/human/H = user + var/mob/living/human/H = user if(H.species.can_shred(H)) playsound(loc, 'sound/effects/Glasshit.ogg', 75, 1) visible_message("\The [user] smashes against \the [src].", 1) diff --git a/code/game/machinery/flasher.dm b/code/game/machinery/flasher.dm index e092d561115..259a5461286 100644 --- a/code/game/machinery/flasher.dm +++ b/code/game/machinery/flasher.dm @@ -74,7 +74,7 @@ if(O.eyecheck() > FLASH_PROTECTION_NONE) continue if(ishuman(O)) - var/mob/living/carbon/human/H = O + var/mob/living/human/H = O flash_time = round(H.get_flash_mod() * flash_time) if(flash_time <= 0) return diff --git a/code/game/machinery/hologram.dm b/code/game/machinery/hologram.dm index 14522e6512c..a30ad3f20cb 100644 --- a/code/game/machinery/hologram.dm +++ b/code/game/machinery/hologram.dm @@ -77,7 +77,7 @@ var/global/list/holopads = list() // Update our desc. desc = "It's a floor-mounted device for projecting holographic images. Its ID is '[holopad_id]'" -/obj/machinery/hologram/holopad/interface_interact(var/mob/living/carbon/human/user) //Carn: Hologram requests. +/obj/machinery/hologram/holopad/interface_interact(var/mob/living/human/user) //Carn: Hologram requests. if(!CanInteract(user, DefaultTopicState())) return FALSE if(incoming_connection && caller_id) diff --git a/code/game/machinery/jukebox.dm b/code/game/machinery/jukebox.dm index 220dc9a6753..99da01b0b81 100644 --- a/code/game/machinery/jukebox.dm +++ b/code/game/machinery/jukebox.dm @@ -123,7 +123,7 @@ playsound(loc, 'sound/items/AirHorn.ogg', 100, 1) for(var/mob/living/M in ohearers(6, src)) if(ishuman(M)) - var/mob/living/carbon/human/H = M + var/mob/living/human/H = M if(H.get_sound_volume_multiplier() < 0.2) continue M.set_status(STAT_ASLEEP, 0) diff --git a/code/game/machinery/kitchen/cooking_machines/fryer.dm b/code/game/machinery/kitchen/cooking_machines/fryer.dm index ead11db0a55..0be1e523f11 100644 --- a/code/game/machinery/kitchen/cooking_machines/fryer.dm +++ b/code/game/machinery/kitchen/cooking_machines/fryer.dm @@ -31,7 +31,7 @@ var/target_zone = user.get_target_zone() if(ishuman(victim) && !(target_zone in list(BP_GROIN, BP_CHEST))) - var/mob/living/carbon/human/H = victim + var/mob/living/human/H = victim var/obj/item/organ/external/E = GET_EXTERNAL_ORGAN(H, target_zone) if(!E) to_chat(user, "They are missing that body part!") diff --git a/code/game/machinery/message_server.dm b/code/game/machinery/message_server.dm index f9b935ff75e..513b398770d 100644 --- a/code/game/machinery/message_server.dm +++ b/code/game/machinery/message_server.dm @@ -154,7 +154,7 @@ var/global/list/message_servers = list() /obj/machinery/network/message_server/proc/send_to_department(var/department, var/message, var/tone) var/reached = 0 - for(var/mob/living/carbon/human/H in global.human_mob_list) + for(var/mob/living/human/H in global.human_mob_list) var/obj/item/modular_computer/pda/pda = locate() in H if(!pda) continue diff --git a/code/game/machinery/newscaster.dm b/code/game/machinery/newscaster.dm index babeef95697..609fa5d12d7 100644 --- a/code/game/machinery/newscaster.dm +++ b/code/game/machinery/newscaster.dm @@ -201,7 +201,7 @@ var/global/list/allCasters = list() //Global list that will contain reference to /obj/machinery/newscaster/interact(mob/user) //########### THE MAIN BEEF IS HERE! And in the proc below this...############ if(ishuman(user) || issilicon(user) ) - var/mob/living/carbon/human_or_robot_user = user + var/mob/living/human_or_robot_user = user var/dat dat = text("Newscaster

    Newscaster Unit #[src.unit_no]

    ") @@ -758,7 +758,7 @@ var/global/list/allCasters = list() //Global list that will contain reference to /obj/item/newspaper/attack_self(mob/user) user.update_personal_goal(/datum/goal/achievement/newshound, TRUE) if(ishuman(user)) - var/mob/living/carbon/human/human_user = user + var/mob/living/human/human_user = user var/dat src.pages = 0 switch(screen) @@ -896,7 +896,7 @@ var/global/list/allCasters = list() //Global list that will contain reference to /obj/machinery/newscaster/proc/scan_user(mob/living/user) if(ishuman(user)) //User is a human - var/mob/living/carbon/human/human_user = user + var/mob/living/human/human_user = user var/obj/item/card/id/id = human_user.GetIdCard() if(istype(id)) //Newscaster scans you src.scanned_user = GetNameAndAssignmentFromId(id) diff --git a/code/game/machinery/portable_turret.dm b/code/game/machinery/portable_turret.dm index 6bf44daf084..ba7478c7439 100644 --- a/code/game/machinery/portable_turret.dm +++ b/code/game/machinery/portable_turret.dm @@ -463,7 +463,7 @@ var/global/list/turret_icons return TURRET_PRIORITY_TARGET //if the perp has passed all previous tests, congrats, it is now a "shoot-me!" nominee -/obj/machinery/porta_turret/proc/assess_perp(var/mob/living/carbon/human/H) +/obj/machinery/porta_turret/proc/assess_perp(var/mob/living/human/H) if(!H || !istype(H)) return 0 diff --git a/code/game/machinery/rechargestation.dm b/code/game/machinery/rechargestation.dm index dfedef94c73..64a7cb96235 100644 --- a/code/game/machinery/rechargestation.dm +++ b/code/game/machinery/rechargestation.dm @@ -82,7 +82,7 @@ C.repair() if(ishuman(occupant)) - var/mob/living/carbon/human/H = occupant + var/mob/living/human/H = occupant var/obj/item/organ/internal/cell/potato = H.get_organ(BP_CELL, /obj/item/organ/internal/cell) if(potato) target = potato.cell @@ -194,7 +194,7 @@ var/mob/living/silicon/robot/R = M return (R.cell) if(ishuman(M)) - var/mob/living/carbon/human/H = M + var/mob/living/human/H = M if(H.isSynthetic()) return 1 var/obj/item/rig/rig = H.get_rig() diff --git a/code/game/machinery/suit_cycler.dm b/code/game/machinery/suit_cycler.dm index 7edd6cb3a2a..76abad87613 100644 --- a/code/game/machinery/suit_cycler.dm +++ b/code/game/machinery/suit_cycler.dm @@ -48,7 +48,7 @@ var/decl/item_modifier/target_modification var/target_bodytype - var/mob/living/carbon/human/occupant + var/mob/living/human/occupant var/obj/item/clothing/suit/space/void/suit var/obj/item/clothing/head/helmet/space/helmet var/obj/item/clothing/shoes/magboots/boots diff --git a/code/game/machinery/syndicatebeacon.dm b/code/game/machinery/syndicatebeacon.dm index 1b3302440e9..0ad381c477e 100644 --- a/code/game/machinery/syndicatebeacon.dm +++ b/code/game/machinery/syndicatebeacon.dm @@ -63,7 +63,7 @@ var/global/list/singularity_beacons = list() addtimer(CALLBACK(src, PROC_REF(selfdestruct)), rand(5, 20) SECONDS) return if(ishuman(M)) - var/mob/living/carbon/human/N = M + var/mob/living/human/N = M to_chat(M, "You have joined the ranks of the Syndicate and become a traitor to the station!") var/decl/special_role/traitors = GET_DECL(/decl/special_role/traitor) traitors.add_antagonist(N.mind) diff --git a/code/game/machinery/vitals_monitor.dm b/code/game/machinery/vitals_monitor.dm index 3eff63edf62..f23583386a9 100644 --- a/code/game/machinery/vitals_monitor.dm +++ b/code/game/machinery/vitals_monitor.dm @@ -12,7 +12,7 @@ uncreated_component_parts = null construct_state = /decl/machine_construction/default/panel_closed - var/mob/living/carbon/human/victim + var/mob/living/human/victim var/beep = TRUE /obj/machinery/vitals_monitor/Destroy() diff --git a/code/game/movietitles.dm b/code/game/movietitles.dm index 2c961d0b5e5..1a685073daa 100644 --- a/code/game/movietitles.dm +++ b/code/game/movietitles.dm @@ -53,7 +53,7 @@ var/global/list/end_titles var/chunksize = 0 titles += "

    EPISODE [rand(1,1000)]
    [SSlore.get_end_credits_title()]

    " - for(var/mob/living/carbon/human/H in global.living_mob_list_|global.dead_mob_list_) + for(var/mob/living/human/H in global.living_mob_list_|global.dead_mob_list_) if(findtext(H.real_name,"(mannequin)")) continue if(H.isMonkey() && findtext(H.real_name,"[lowertext(H.species.name)]")) //no monki @@ -98,7 +98,7 @@ var/global/list/end_titles var/list/corpses = list() var/list/monkies = list() - for(var/mob/living/carbon/human/H in global.dead_mob_list_) + for(var/mob/living/human/H in global.dead_mob_list_) if(H.timeofdeath < 5 MINUTES) //no prespawned corpses continue if(H.isMonkey() && findtext(H.real_name,"[lowertext(H.species.name)]")) diff --git a/code/game/objects/auras/regenerating_aura.dm b/code/game/objects/auras/regenerating_aura.dm index cb96b9e13ad..fb56c0fbe96 100644 --- a/code/game/objects/auras/regenerating_aura.dm +++ b/code/game/objects/auras/regenerating_aura.dm @@ -21,11 +21,11 @@ var/innate_heal = TRUE // Whether the aura is on, basically. -/obj/aura/regenerating/human/proc/external_regeneration_effect(var/obj/item/organ/external/O, var/mob/living/carbon/human/H) +/obj/aura/regenerating/human/proc/external_regeneration_effect(var/obj/item/organ/external/O, var/mob/living/human/H) return /obj/aura/regenerating/human/life_tick() - var/mob/living/carbon/human/H = user + var/mob/living/human/H = user if(!istype(H)) . = 0 CRASH("Someone gave [user.type] a [src.type] aura. This is invalid.") diff --git a/code/game/objects/effects/decals/Cleanable/humans.dm b/code/game/objects/effects/decals/Cleanable/humans.dm index 2af9a29f3d5..9a1dfda3656 100644 --- a/code/game/objects/effects/decals/Cleanable/humans.dm +++ b/code/game/objects/effects/decals/Cleanable/humans.dm @@ -123,7 +123,7 @@ /obj/effect/decal/cleanable/blood/attack_hand(mob/user) if(!amount || !length(blood_data) || !ishuman(user)) return ..() - var/mob/living/carbon/human/H = user + var/mob/living/human/H = user if(H.get_equipped_item(slot_gloves_str)) return ..() var/taken = rand(1,amount) @@ -131,7 +131,7 @@ to_chat(user, SPAN_NOTICE("You get some of \the [src] on your hands.")) for(var/bloodthing in blood_data) user.add_blood(null, max(1, amount/length(blood_data)), blood_data[bloodthing]) - user.verbs += /mob/living/carbon/human/proc/bloody_doodle + user.verbs += /mob/living/human/proc/bloody_doodle return TRUE /obj/effect/decal/cleanable/blood/splatter diff --git a/code/game/objects/effects/manifest.dm b/code/game/objects/effects/manifest.dm index 30dde5926a3..6b84dae52a0 100644 --- a/code/game/objects/effects/manifest.dm +++ b/code/game/objects/effects/manifest.dm @@ -9,7 +9,7 @@ /obj/effect/manifest/proc/manifest() var/dat = "Crew Manifest:
    " - for(var/mob/living/carbon/human/M in SSmobs.mob_list) + for(var/mob/living/human/M in SSmobs.mob_list) dat += text(" [] - []
    ", M.name, M.get_assignment()) var/obj/item/paper/P = new /obj/item/paper( src.loc ) P.info = dat diff --git a/code/game/objects/effects/spiders.dm b/code/game/objects/effects/spiders.dm index ff133330e6a..3ecdcf8fcb8 100644 --- a/code/game/objects/effects/spiders.dm +++ b/code/game/objects/effects/spiders.dm @@ -23,7 +23,7 @@ return TRUE var/showed_msg = FALSE if(ishuman(user)) - var/mob/living/carbon/human/H = user + var/mob/living/human/H = user var/decl/natural_attack/attack = H.get_unarmed_attack(src) if(istype(attack)) attack.show_attack(H, src, H.get_target_zone(), 1) diff --git a/code/game/objects/items/__item.dm b/code/game/objects/items/__item.dm index 54cbd4f4a23..051083b981d 100644 --- a/code/game/objects/items/__item.dm +++ b/code/game/objects/items/__item.dm @@ -244,7 +244,7 @@ //would check is_broken() and is_malfunctioning() here too but is_malfunctioning() //is probabilistic so we can't do that and it would be unfair to just check one. if(ishuman(M)) - var/mob/living/carbon/human/H = M + var/mob/living/human/H = M var/obj/item/organ/external/hand = GET_EXTERNAL_ORGAN(H, M.get_empty_hand_slot()) if(istype(hand) && hand.is_usable()) return TRUE @@ -751,7 +751,7 @@ if(!istype(M)) return TRUE if(!blood_data && ishuman(M)) - var/mob/living/carbon/human/H = M + var/mob/living/human/H = M blood_data = REAGENT_DATA(H.vessel, /decl/material/liquid/blood) var/sample_dna = LAZYACCESS(blood_data, "blood_DNA") if(sample_dna) @@ -788,7 +788,7 @@ var/global/list/_item_blood_mask = icon('icons/effects/blood.dmi', "itemblood") /* For zooming with scope or binoculars. This is called from modules/mob/mob_movement.dm if you move you will be zoomed out -modules/mob/living/carbon/human/life.dm if you die, you will be zoomed out. +modules/mob/living/human/life.dm if you die, you will be zoomed out. */ //Looking through a scope or binoculars should /not/ improve your periphereal vision. Still, increase viewsize a tiny bit so that sniping isn't as restricted to NSEW /obj/item/proc/zoom(mob/user, var/tileoffset = 14,var/viewsize = 9) //tileoffset is client view offset in the direction the user is facing. viewsize is how far out this thing zooms. 7 is normal view @@ -799,7 +799,7 @@ modules/mob/living/carbon/human/life.dm if you die, you will be zoomed out. var/devicename = zoomdevicename || name - var/mob/living/carbon/human/H = user + var/mob/living/human/H = user if(user.incapacitated(INCAPACITATION_DISABLED)) to_chat(user, SPAN_WARNING("You are unable to focus through the [devicename].")) return diff --git a/code/game/objects/items/_item_damage.dm b/code/game/objects/items/_item_damage.dm index dfd25441d77..71afac1af8d 100644 --- a/code/game/objects/items/_item_damage.dm +++ b/code/game/objects/items/_item_damage.dm @@ -79,7 +79,7 @@ playsound(hit_atom, 'sound/weapons/throwtap.ogg', volume, TRUE, -1) /obj/item/proc/eyestab(mob/living/M, mob/living/user) - var/mob/living/carbon/human/H = M + var/mob/living/human/H = M if(istype(H)) for(var/slot in global.standard_headgear_slots) var/obj/item/protection = H.get_equipped_item(slot) diff --git a/code/game/objects/items/cryobag.dm b/code/game/objects/items/cryobag.dm index 467e29f6346..5d2a0699802 100644 --- a/code/game/objects/items/cryobag.dm +++ b/code/game/objects/items/cryobag.dm @@ -131,7 +131,7 @@ qdel(src) /obj/structure/closet/body_bag/cryobag/blank/WillContain() - return list(/mob/living/carbon/human/blank) + return list(/mob/living/human/blank) /obj/structure/closet/body_bag/cryobag/blank/Initialize() . = ..() diff --git a/code/game/objects/items/devices/auto_cpr.dm b/code/game/objects/items/devices/auto_cpr.dm index 101414fb7cf..ae70328b395 100644 --- a/code/game/objects/items/devices/auto_cpr.dm +++ b/code/game/objects/items/devices/auto_cpr.dm @@ -55,7 +55,7 @@ if(!ishuman(loc)) return PROCESS_KILL - var/mob/living/carbon/human/H = loc + var/mob/living/human/H = loc if(H.get_equipped_slot_for_item(src) != slot_wear_suit_str) return PROCESS_KILL diff --git a/code/game/objects/items/devices/scanners/health.dm b/code/game/objects/items/devices/scanners/health.dm index 5c6bd87625c..20db2e1f9cd 100644 --- a/code/game/objects/items/devices/scanners/health.dm +++ b/code/game/objects/items/devices/scanners/health.dm @@ -25,7 +25,7 @@ to_chat(user, "Overall Status: Healthy") return - var/mob/living/carbon/human/scan_subject = null + var/mob/living/human/scan_subject = null if (ishuman(target)) scan_subject = target else if (istype(target, /obj/structure/closet/body_bag)) @@ -36,7 +36,7 @@ scan_content.Add(L) if (scan_content.len == 1) - for(var/mob/living/carbon/human/L in scan_content) + for(var/mob/living/human/L in scan_content) scan_subject = L else if (scan_content.len > 1) to_chat(user, "\The [scanner] picks up multiple readings inside \the [target], too close together to scan properly.") @@ -57,7 +57,7 @@ to_chat(user, .) to_chat(user, "
    ") -/proc/medical_scan_results(var/mob/living/carbon/human/H, var/verbose, var/skill_level = SKILL_DEFAULT) +/proc/medical_scan_results(var/mob/living/human/H, var/verbose, var/skill_level = SKILL_DEFAULT) . = list() var/header = list() var/b diff --git a/code/game/objects/items/devices/scanners/xenobio.dm b/code/game/objects/items/devices/scanners/xenobio.dm index d0af4cb3fbd..3fc507c50de 100644 --- a/code/game/objects/items/devices/scanners/xenobio.dm +++ b/code/game/objects/items/devices/scanners/xenobio.dm @@ -13,7 +13,7 @@ ) var/list/valid_targets = list( - /mob/living/carbon/human, + /mob/living/human, /mob/living/simple_animal ) @@ -40,7 +40,7 @@ /mob/proc/xenobio_scan_results() . = "Incompatible life form, analysis failed." -/mob/living/carbon/human/xenobio_scan_results() +/mob/living/human/xenobio_scan_results() . += "Data for \the [src]:" . += "Species:\t[species]" if(species.breath_type) diff --git a/code/game/objects/items/devices/suit_cooling.dm b/code/game/objects/items/devices/suit_cooling.dm index 75801bc5fb8..b6a3db82739 100644 --- a/code/game/objects/items/devices/suit_cooling.dm +++ b/code/game/objects/items/devices/suit_cooling.dm @@ -45,7 +45,7 @@ if (!is_in_slot()) return - var/mob/living/carbon/human/H = loc + var/mob/living/human/H = loc var/temp_adj = min(H.bodytemperature - thermostat, max_cooling) @@ -65,7 +65,7 @@ // Checks whether the cooling unit is being worn on the back/suit slot. // That way you can't carry it in your hands while it's running to cool yourself down. /obj/item/suit_cooling_unit/proc/is_in_slot() - var/mob/living/carbon/human/H = loc + var/mob/living/human/H = loc if(!istype(H)) return 0 return H.get_equipped_item(slot_back_str) == src || H.get_equipped_item(slot_s_store_str) == src diff --git a/code/game/objects/items/devices/suit_sensor_jammer.dm b/code/game/objects/items/devices/suit_sensor_jammer.dm index 1d60d6c05f5..980756bffec 100644 --- a/code/game/objects/items/devices/suit_sensor_jammer.dm +++ b/code/game/objects/items/devices/suit_sensor_jammer.dm @@ -186,7 +186,7 @@ sjm.enable() jammer_method = sjm -/obj/item/suit_sensor_jammer/proc/may_process_crew_data(var/mob/living/carbon/human/H, var/obj/item/clothing/sensor/vitals/S, var/turf/pos) +/obj/item/suit_sensor_jammer/proc/may_process_crew_data(var/mob/living/human/H, var/obj/item/clothing/sensor/vitals/S, var/turf/pos) if(!pos) return FALSE var/turf/T = get_turf(src) diff --git a/code/game/objects/items/devices/t_scanner.dm b/code/game/objects/items/devices/t_scanner.dm index d7fdbfb7756..b9e0a5369e0 100644 --- a/code/game/objects/items/devices/t_scanner.dm +++ b/code/game/objects/items/devices/t_scanner.dm @@ -101,7 +101,7 @@ if(ismob(scanned)) if(ishuman(scanned)) - var/mob/living/carbon/human/H = scanned + var/mob/living/human/H = scanned if(H.get_bodytype()?.appearance_flags & HAS_SKIN_COLOR) I.color = H.get_skin_colour() I.icon = 'icons/mob/mob.dmi' @@ -129,7 +129,7 @@ for(var/turf/T in range(scan_range, center)) for(var/mob/M in T.contents) if(ishuman(M)) - var/mob/living/carbon/human/H = M + var/mob/living/human/H = M if(H.is_cloaked()) . += M else if(M.alpha < 255) diff --git a/code/game/objects/items/devices/traitordevices.dm b/code/game/objects/items/devices/traitordevices.dm index e93021d7c6e..1226b3f9ecc 100644 --- a/code/game/objects/items/devices/traitordevices.dm +++ b/code/game/objects/items/devices/traitordevices.dm @@ -43,7 +43,7 @@ effective or pretty fucking useless. return var/list/stun_victims = list() - for(var/mob/living/carbon/human/M in orange(10, user)) + for(var/mob/living/human/M in orange(10, user)) stun_victims += M spawn() if(prob(50)) diff --git a/code/game/objects/items/flashlights/_flashlight.dm b/code/game/objects/items/flashlights/_flashlight.dm index 774c9caacb8..989f8f6bc64 100644 --- a/code/game/objects/items/flashlights/_flashlight.dm +++ b/code/game/objects/items/flashlights/_flashlight.dm @@ -136,7 +136,7 @@ return ..() /obj/item/flashlight/proc/inspect_vision(obj/item/organ/vision, mob/living/user) - var/mob/living/carbon/human/H = vision.owner + var/mob/living/human/H = vision.owner if(H == user) //can't look into your own eyes buster return diff --git a/code/game/objects/items/passport.dm b/code/game/objects/items/passport.dm index 48f3c68e431..5fc16d6d6ed 100644 --- a/code/game/objects/items/passport.dm +++ b/code/game/objects/items/passport.dm @@ -15,7 +15,7 @@ ) var/info -/obj/item/passport/proc/set_info(mob/living/carbon/human/H) +/obj/item/passport/proc/set_info(mob/living/human/H) if(!istype(H)) return diff --git a/code/game/objects/items/stacks/medical.dm b/code/game/objects/items/stacks/medical.dm index 1149a385b07..84734302822 100644 --- a/code/game/objects/items/stacks/medical.dm +++ b/code/game/objects/items/stacks/medical.dm @@ -38,7 +38,7 @@ use(1) return TRUE - var/mob/living/carbon/human/H = target + var/mob/living/human/H = target var/obj/item/organ/external/affecting = GET_EXTERNAL_ORGAN(H, user.get_target_zone()) if(!affecting) to_chat(user, SPAN_WARNING("\The [target] is missing that body part!")) @@ -140,7 +140,7 @@ if(. || !ishuman(target)) return - var/mob/living/carbon/human/H = target + var/mob/living/human/H = target var/obj/item/organ/external/affecting = GET_EXTERNAL_ORGAN(H, user.get_target_zone()) if(affecting.is_bandaged()) to_chat(user, SPAN_WARNING("The wounds on [target]'s [affecting.name] have already been bandaged.")) @@ -218,7 +218,7 @@ if(. || !ishuman(target)) return - var/mob/living/carbon/human/H = target + var/mob/living/human/H = target var/obj/item/organ/external/affecting = GET_EXTERNAL_ORGAN(H, user.get_target_zone()) if(affecting.is_salved()) to_chat(user, SPAN_WARNING("The wounds on [target]'s [affecting.name] have already been salved.")) @@ -258,7 +258,7 @@ if(. || !ishuman(target)) return - var/mob/living/carbon/human/H = target + var/mob/living/human/H = target var/obj/item/organ/external/affecting = GET_EXTERNAL_ORGAN(H, user.get_target_zone()) if(affecting.is_bandaged() && affecting.is_disinfected()) to_chat(user, SPAN_WARNING("The wounds on [target]'s [affecting.name] have already been treated.")) @@ -324,7 +324,7 @@ if(. || !ishuman(target)) return - var/mob/living/carbon/human/H = target + var/mob/living/human/H = target var/obj/item/organ/external/affecting = GET_EXTERNAL_ORGAN(H, user.get_target_zone()) if(affecting.is_salved()) @@ -371,7 +371,7 @@ if(. || !ishuman(target)) return - var/mob/living/carbon/human/H = target + var/mob/living/human/H = target var/obj/item/organ/external/affecting = GET_EXTERNAL_ORGAN(H, user.get_target_zone()) if(!(affecting.organ_tag in splintable_organs)) @@ -411,7 +411,7 @@ var/obj/item/stack/medical/splint/S = split(1, TRUE) if(S) if(affecting.apply_splint(S)) - target.verbs += /mob/living/carbon/human/proc/remove_splints + target.verbs += /mob/living/human/proc/remove_splints S.forceMove(affecting) if (target != user) user.visible_message( @@ -471,7 +471,7 @@ /obj/item/stack/medical/resin/use_on_mob(mob/living/target, mob/living/user, animate = TRUE) . = ..() if(!. && ishuman(target)) - var/mob/living/carbon/human/H = target + var/mob/living/human/H = target var/obj/item/organ/external/affecting = GET_EXTERNAL_ORGAN(H, user.get_target_zone()) if((affecting.brute_dam + affecting.burn_dam) <= 0) to_chat(user, SPAN_WARNING("\The [target]'s [affecting.name] is undamaged.")) diff --git a/code/game/objects/items/stacks/nanopaste.dm b/code/game/objects/items/stacks/nanopaste.dm index 126bb03d354..7a6097b9741 100644 --- a/code/game/objects/items/stacks/nanopaste.dm +++ b/code/game/objects/items/stacks/nanopaste.dm @@ -28,7 +28,7 @@ return TRUE if (ishuman(target)) //Repairing robolimbs - var/mob/living/carbon/human/H = target + var/mob/living/human/H = target var/obj/item/organ/external/S = GET_EXTERNAL_ORGAN(H, user.get_target_zone()) if(!S) diff --git a/code/game/objects/items/weapons/autopsy.dm b/code/game/objects/items/weapons/autopsy.dm index 95209a87d1d..e7e5cb527e9 100644 --- a/code/game/objects/items/weapons/autopsy.dm +++ b/code/game/objects/items/weapons/autopsy.dm @@ -23,7 +23,7 @@ /obj/item/scanner/autopsy/scan(atom/A, mob/user) if(ishuman(A)) - var/mob/living/carbon/human/M = A + var/mob/living/human/M = A set_target(M, user) timeofdeath = M.timeofdeath var/obj/item/organ/external/S = GET_EXTERNAL_ORGAN(M, user.get_target_zone()) diff --git a/code/game/objects/items/weapons/cards_ids.dm b/code/game/objects/items/weapons/cards_ids.dm index f69317716b5..8768807db9e 100644 --- a/code/game/objects/items/weapons/cards_ids.dm +++ b/code/game/objects/items/weapons/cards_ids.dm @@ -263,7 +263,7 @@ var/global/const/NO_EMAG_ACT = -50 id_card.dna_hash = get_unique_enzymes() || "Unset" id_card.fingerprint_hash = get_full_print(ignore_blockers = TRUE) || "Unset" -/mob/living/carbon/human/set_id_info(var/obj/item/card/id/id_card) +/mob/living/human/set_id_info(var/obj/item/card/id/id_card) ..() id_card.age = get_age() if(global.using_map.flags & MAP_HAS_BRANCH) diff --git a/code/game/objects/items/weapons/cards_ids_syndicate.dm b/code/game/objects/items/weapons/cards_ids_syndicate.dm index b81293ae41d..75851fa02da 100644 --- a/code/game/objects/items/weapons/cards_ids_syndicate.dm +++ b/code/game/objects/items/weapons/cards_ids_syndicate.dm @@ -155,7 +155,7 @@ if("DNA Hash") var/default = dna_hash if(default == initial(dna_hash) && ishuman(user)) - var/mob/living/carbon/human/H = user + var/mob/living/human/H = user var/unique_enzymes = H.get_unique_enzymes() if(unique_enzymes) default = unique_enzymes @@ -167,7 +167,7 @@ if("Fingerprint Hash") var/default = fingerprint_hash if(default == initial(fingerprint_hash) && ishuman(user)) - var/mob/living/carbon/human/H = user + var/mob/living/human/H = user default = H.get_full_print(ignore_blockers = TRUE) var/new_fingerprint_hash = sanitize(input(user,"What fingerprint hash would you like to be written on this card?","Agent Card Fingerprint Hash",default) as null|text) if(!isnull(new_fingerprint_hash) && CanUseTopic(user, state)) diff --git a/code/game/objects/items/weapons/defib.dm b/code/game/objects/items/weapons/defib.dm index 62d19120866..35bee56b109 100644 --- a/code/game/objects/items/weapons/defib.dm +++ b/code/game/objects/items/weapons/defib.dm @@ -105,7 +105,7 @@ set name = "Toggle Paddles" set category = "Object" - var/mob/living/carbon/human/user = usr + var/mob/living/human/user = usr if(!paddles) to_chat(user, "The paddles are missing!") return @@ -246,18 +246,18 @@ return 1 //Checks for various conditions to see if the mob is revivable -/obj/item/shockpaddles/proc/can_defib(mob/living/carbon/human/H) //This is checked before doing the defib operation +/obj/item/shockpaddles/proc/can_defib(mob/living/human/H) //This is checked before doing the defib operation if(H.has_body_flag(BODY_FLAG_NO_DEFIB)) return "buzzes, \"Unrecogized physiology. Operation aborted.\"" if(!check_contact(H)) return "buzzes, \"Patient's chest is obstructed. Operation aborted.\"" -/obj/item/shockpaddles/proc/can_revive(mob/living/carbon/human/H) //This is checked right before attempting to revive +/obj/item/shockpaddles/proc/can_revive(mob/living/human/H) //This is checked right before attempting to revive if(H.stat == DEAD) return "buzzes, \"Resuscitation failed - Severe neurological decay makes recovery of patient impossible. Further attempts futile.\"" -/obj/item/shockpaddles/proc/check_contact(mob/living/carbon/human/H) +/obj/item/shockpaddles/proc/check_contact(mob/living/human/H) if(!combat) for(var/slot in list(slot_wear_suit_str, slot_w_uniform_str)) var/obj/item/clothing/cloth = H.get_equipped_item(slot) @@ -265,7 +265,7 @@ return FALSE return TRUE -/obj/item/shockpaddles/proc/check_blood_level(mob/living/carbon/human/H) +/obj/item/shockpaddles/proc/check_blood_level(mob/living/human/H) if(H.should_have_organ(BP_HEART)) var/obj/item/organ/internal/heart = GET_INTERNAL_ORGAN(H, BP_HEART) if(!heart || H.get_blood_volume() < BLOOD_VOLUME_SURVIVE) @@ -281,7 +281,7 @@ /obj/item/shockpaddles/use_on_mob(mob/living/target, mob/living/user, animate = TRUE) if(!ishuman(target) || user.a_intent == I_HURT) return ..() //Do a regular attack. Harm intent shocking happens as a hit effect - var/mob/living/carbon/human/H = target + var/mob/living/human/H = target if(can_use(user, H)) busy = 1 update_icon() @@ -306,7 +306,7 @@ return ..() // This proc is used so that we can return out of the revive process while ensuring that busy and update_icon() are handled -/obj/item/shockpaddles/proc/do_revive(mob/living/carbon/human/H, mob/living/user) +/obj/item/shockpaddles/proc/do_revive(mob/living/human/H, mob/living/user) if(H.ssd_check()) to_chat(find_dead_player(H.ckey, 1), "Someone is attempting to resuscitate you. Re-enter your body if you want to be revived!") @@ -367,7 +367,7 @@ ADJ_STATUS(H, STAT_ASLEEP, -60) log_and_message_admins("used \a [src] to revive [key_name(H)].") -/obj/item/shockpaddles/proc/lowskill_revive(mob/living/carbon/human/H, mob/living/user) +/obj/item/shockpaddles/proc/lowskill_revive(mob/living/human/H, mob/living/user) if(prob(60)) playsound(get_turf(src), 'sound/machines/defib_zap.ogg', 100, 1, -1) H.electrocute_act(burn_damage_amt*4, src, def_zone = BP_CHEST) @@ -381,7 +381,7 @@ return 0 return 1 -/obj/item/shockpaddles/proc/do_electrocute(mob/living/carbon/human/H, mob/user, var/target_zone) +/obj/item/shockpaddles/proc/do_electrocute(mob/living/human/H, mob/user, var/target_zone) var/obj/item/organ/external/affecting = GET_EXTERNAL_ORGAN(H, check_zone(target_zone, H, TRUE)) //Shouldn't defib someone's eyes or mouth if(!affecting) to_chat(user, SPAN_WARNING("They are missing that body part!")) diff --git a/code/game/objects/items/weapons/ecigs.dm b/code/game/objects/items/weapons/ecigs.dm index af97d1e5d9a..27c1098d226 100644 --- a/code/game/objects/items/weapons/ecigs.dm +++ b/code/game/objects/items/weapons/ecigs.dm @@ -96,7 +96,7 @@ idle ++ if(ishuman(loc)) - var/mob/living/carbon/human/user = loc + var/mob/living/human/user = loc if (!lit || !ec_cartridge || !ec_cartridge.reagents.total_volume)//no cartridge if(!ec_cartridge.reagents.total_volume) diff --git a/code/game/objects/items/weapons/grenades/decompiler.dm b/code/game/objects/items/weapons/grenades/decompiler.dm index 4414fc75715..143341ed3f2 100644 --- a/code/game/objects/items/weapons/grenades/decompiler.dm +++ b/code/game/objects/items/weapons/grenades/decompiler.dm @@ -99,7 +99,7 @@ thing = pick(options) if(ishuman(thing)) - var/mob/living/carbon/human/H = thing + var/mob/living/human/H = thing for(var/obj/item/organ/external/limb in H.get_external_organs()) if(BP_IS_PROSTHETIC(limb) && !length(limb.children)) limb.dismember() diff --git a/code/game/objects/items/weapons/grenades/spawnergrenade.dm b/code/game/objects/items/weapons/grenades/spawnergrenade.dm index 543bbe5fac4..8df73ff611f 100644 --- a/code/game/objects/items/weapons/grenades/spawnergrenade.dm +++ b/code/game/objects/items/weapons/grenades/spawnergrenade.dm @@ -10,7 +10,7 @@ if(spawner_type && deliveryamt) var/turf/T = get_turf(src) playsound(T, 'sound/effects/phasein.ogg', 100, 1) - for(var/mob/living/carbon/human/M in viewers(T, null)) + for(var/mob/living/human/M in viewers(T, null)) if(M.eyecheck() < FLASH_PROTECTION_MODERATE) M.flash_eyes() for(var/i = 1 to deliveryamt) diff --git a/code/game/objects/items/weapons/handcuffs.dm b/code/game/objects/items/weapons/handcuffs.dm index 0e783251825..c6ed2f13008 100644 --- a/code/game/objects/items/weapons/handcuffs.dm +++ b/code/game/objects/items/weapons/handcuffs.dm @@ -50,7 +50,7 @@ // only humans can be cuffed for now if(ishuman(target)) - var/mob/living/carbon/human/H = target + var/mob/living/human/H = target if(!H.get_equipped_item(slot_handcuffed_str)) if (H == user) place_handcuffs(user, user) @@ -70,7 +70,7 @@ /obj/item/handcuffs/proc/place_handcuffs(var/mob/living/target, var/mob/user) playsound(src.loc, cuff_sound, 30, 1, -2) - var/mob/living/carbon/human/H = target + var/mob/living/human/H = target if(!istype(H)) return 0 @@ -110,11 +110,11 @@ return 1 var/global/last_chew = 0 //#FIXME: Its funny how only one person in the world can chew their restraints every 2.6 seconds -/mob/living/carbon/human/RestrainedClickOn(var/atom/A) +/mob/living/human/RestrainedClickOn(var/atom/A) if (A != src) return ..() if (last_chew + 26 > world.time) return - var/mob/living/carbon/human/H = A + var/mob/living/human/H = A if (!H.get_equipped_item(slot_handcuffed_str)) return if (H.a_intent != I_HURT) return if (H.get_target_zone() != BP_MOUTH) return diff --git a/code/game/objects/items/weapons/implants/implant.dm b/code/game/objects/items/weapons/implants/implant.dm index a874cd25b11..1654b567aa2 100644 --- a/code/game/objects/items/weapons/implants/implant.dm +++ b/code/game/objects/items/weapons/implants/implant.dm @@ -47,7 +47,7 @@ return TRUE /obj/item/implant/proc/can_implant(mob/M, mob/user, var/target_zone) - var/mob/living/carbon/human/H = M + var/mob/living/human/H = M if(istype(H) && !GET_EXTERNAL_ORGAN(H, target_zone)) to_chat(user, "\The [M] is missing that body part.") return FALSE @@ -55,7 +55,7 @@ /obj/item/implant/proc/implant_in_mob(mob/M, var/target_zone) if (ishuman(M)) - var/mob/living/carbon/human/H = M + var/mob/living/human/H = M var/obj/item/organ/external/affected = GET_EXTERNAL_ORGAN(H, target_zone) if(affected) LAZYADD(affected.implants, src) diff --git a/code/game/objects/items/weapons/implants/implants/compressed.dm b/code/game/objects/items/weapons/implants/implants/compressed.dm index fea7ee66170..e9872331439 100644 --- a/code/game/objects/items/weapons/implants/implants/compressed.dm +++ b/code/game/objects/items/weapons/implants/implants/compressed.dm @@ -71,7 +71,7 @@ to_chat(user, "The matter compressor safeties prevent you from doing that.") return if(ishuman(A.loc)) - var/mob/living/carbon/human/H = A.loc + var/mob/living/human/H = A.loc if(!H.try_unequip(A)) return else if(isobj(A.loc) && A.loc.storage) diff --git a/code/game/objects/items/weapons/implants/implants/imprinting.dm b/code/game/objects/items/weapons/implants/implants/imprinting.dm index 76e7ac49e30..f493ae39ffa 100644 --- a/code/game/objects/items/weapons/implants/implants/imprinting.dm +++ b/code/game/objects/items/weapons/implants/implants/imprinting.dm @@ -40,7 +40,7 @@ interact(usr) /obj/item/implant/imprinting/implanted(mob/M) - var/mob/living/carbon/human/H = M + var/mob/living/human/H = M if(!istype(H)) return FALSE if(H.reagents.has_reagent(/decl/material/liquid/hallucinogenics)) @@ -103,7 +103,7 @@ . = ..() /obj/item/implant/imprinting/can_implant(mob/M, mob/user, target_zone) - var/mob/living/carbon/human/H = M + var/mob/living/human/H = M if(istype(H)) var/obj/item/organ/internal/B = GET_INTERNAL_ORGAN(H, BP_BRAIN) if(!B || H.isSynthetic()) diff --git a/code/game/objects/items/weapons/material/shards.dm b/code/game/objects/items/weapons/material/shards.dm index 351271e33ba..7de5bdf7c53 100644 --- a/code/game/objects/items/weapons/material/shards.dm +++ b/code/game/objects/items/weapons/material/shards.dm @@ -25,7 +25,7 @@ /obj/item/shard/use_on_mob(mob/living/target, mob/living/user, animate = TRUE) . = ..() if(. && !has_handle && ishuman(user)) - var/mob/living/carbon/human/H = user + var/mob/living/human/H = user if(!H.get_equipped_item(slot_gloves_str) && !(H.species.species_flags & SPECIES_FLAG_NO_MINOR_CUT)) var/obj/item/organ/external/hand = GET_EXTERNAL_ORGAN(H, H.get_active_held_item_slot()) if(istype(hand) && !BP_IS_PROSTHETIC(hand)) diff --git a/code/game/objects/items/weapons/scrolls.dm b/code/game/objects/items/weapons/scrolls.dm index 04dba8b0567..506dd56d7a1 100644 --- a/code/game/objects/items/weapons/scrolls.dm +++ b/code/game/objects/items/weapons/scrolls.dm @@ -33,7 +33,7 @@ return 1 if (!ishuman(usr)) return 1 - var/mob/living/carbon/human/H = usr + var/mob/living/human/H = usr if ((usr == src.loc || (in_range(src, usr) && isturf(src.loc)))) usr.set_machine(src) if (href_list["spell_teleport"]) diff --git a/code/game/objects/items/weapons/shields.dm b/code/game/objects/items/weapons/shields.dm index a62bc8da919..52d00914113 100644 --- a/code/game/objects/items/weapons/shields.dm +++ b/code/game/objects/items/weapons/shields.dm @@ -206,7 +206,7 @@ to_chat(user, SPAN_NOTICE("\The [src] can now be concealed.")) if(ishuman(user)) - var/mob/living/carbon/human/H = user + var/mob/living/human/H = user H.update_inhand_overlays() add_fingerprint(user) diff --git a/code/game/objects/items/weapons/soap.dm b/code/game/objects/items/weapons/soap.dm index 7a79fcdd480..206de3f19be 100644 --- a/code/game/objects/items/weapons/soap.dm +++ b/code/game/objects/items/weapons/soap.dm @@ -89,7 +89,7 @@ //attack_as_weapon /obj/item/soap/use_on_mob(mob/living/target, mob/living/user, animate = TRUE) if(ishuman(target) && user?.a_intent != I_HURT) - var/mob/living/carbon/human/victim = target + var/mob/living/human/victim = target if(user.get_target_zone() == BP_MOUTH && victim.check_has_mouth()) user.visible_message(SPAN_DANGER("\The [user] washes \the [target]'s mouth out with soap!")) if(reagents) diff --git a/code/game/objects/items/weapons/storage/bible.dm b/code/game/objects/items/weapons/storage/bible.dm index 69b9d526978..2ff5ece8a7b 100644 --- a/code/game/objects/items/weapons/storage/bible.dm +++ b/code/game/objects/items/weapons/storage/bible.dm @@ -99,12 +99,12 @@ /obj/item/bible/attack_self(mob/user) if(!ishuman(user)) return - var/mob/living/carbon/human/preacher = user + var/mob/living/human/preacher = user if(preacher.mind?.assigned_job?.is_holy) preacher.visible_message("\The [preacher] begins to read a passage from \the [src]...", "You begin to read a passage from \the [src]...") if(do_after(preacher, 5 SECONDS)) preacher.visible_message("\The [preacher] reads a passage from \the [src].", "You read a passage from \the [src].") - for(var/mob/living/carbon/human/H in view(preacher)) + for(var/mob/living/human/H in view(preacher)) if(preacher.get_cultural_value(TAG_RELIGION) == H.get_cultural_value(TAG_RELIGION)) to_chat(H, SPAN_NOTICE("You feel calm and relaxed, at one with the universe.")) diff --git a/code/game/objects/items/weapons/storage/laundry_basket.dm b/code/game/objects/items/weapons/storage/laundry_basket.dm index 4726adb6724..72994a875c1 100644 --- a/code/game/objects/items/weapons/storage/laundry_basket.dm +++ b/code/game/objects/items/weapons/storage/laundry_basket.dm @@ -18,7 +18,7 @@ /obj/item/laundry_basket/attack_hand(mob/user) if(!ishuman(user)) return ..() - var/mob/living/carbon/human/H = user + var/mob/living/human/H = user var/obj/item/organ/external/temp = GET_EXTERNAL_ORGAN(H, H.get_active_held_item_slot()) if(!temp) to_chat(user, SPAN_WARNING("You need two hands to pick this up!")) diff --git a/code/game/objects/items/weapons/stunbaton.dm b/code/game/objects/items/weapons/stunbaton.dm index 673981fa3a0..0c131d9bce3 100644 --- a/code/game/objects/items/weapons/stunbaton.dm +++ b/code/game/objects/items/weapons/stunbaton.dm @@ -110,7 +110,7 @@ var/stun = stunforce var/obj/item/organ/external/affecting = null if(ishuman(target)) - var/mob/living/carbon/human/H = target + var/mob/living/human/H = target affecting = GET_EXTERNAL_ORGAN(H, hit_zone) var/abuser = user ? "" : "by [user]" if(user && user.a_intent == I_HURT) @@ -144,7 +144,7 @@ deductcharge(hitcost) if(ishuman(target)) - var/mob/living/carbon/human/H = target + var/mob/living/human/H = target H.forcesay(global.hit_appends) return 1 diff --git a/code/game/objects/items/weapons/swords_axes_etc.dm b/code/game/objects/items/weapons/swords_axes_etc.dm index 7387adce58f..7e3258fd4e5 100644 --- a/code/game/objects/items/weapons/swords_axes_etc.dm +++ b/code/game/objects/items/weapons/swords_axes_etc.dm @@ -22,7 +22,7 @@ to_chat(user, SPAN_WARNING("You club yourself over the head.")) SET_STATUS_MAX(user, STAT_WEAK, (3 * force)) if(ishuman(user)) - var/mob/living/carbon/human/H = user + var/mob/living/human/H = user H.apply_damage(2*force, BRUTE, BP_HEAD) else user.take_organ_damage(2*force) @@ -78,7 +78,7 @@ to_chat(user, SPAN_DANGER("You club yourself over the head.")) SET_STATUS_MAX(user, STAT_WEAK, (3 * force)) if(ishuman(user)) - var/mob/living/carbon/human/H = user + var/mob/living/human/H = user H.apply_damage(2*force, BRUTE, BP_HEAD) else user.take_organ_damage(2*force) diff --git a/code/game/objects/items/weapons/tanks/tanks.dm b/code/game/objects/items/weapons/tanks/tanks.dm index f651a0f537a..2fc73deaa51 100644 --- a/code/game/objects/items/weapons/tanks/tanks.dm +++ b/code/game/objects/items/weapons/tanks/tanks.dm @@ -261,7 +261,7 @@ var/global/list/global/tank_gauge_cache = list() if(mask && (mask.item_flags & ITEM_FLAG_AIRTIGHT)) data["maskConnected"] = 1 else if(ishuman(location)) - var/mob/living/carbon/human/H = location + var/mob/living/human/H = location var/obj/item/head = H.get_equipped_item(slot_head_str) if(head && (head.item_flags & ITEM_FLAG_AIRTIGHT)) data["maskConnected"] = 1 @@ -319,7 +319,7 @@ var/global/list/global/tank_gauge_cache = list() if(mask && (mask.item_flags & ITEM_FLAG_AIRTIGHT)) can_open_valve = 1 else if(ishuman(location)) - var/mob/living/carbon/human/H = location + var/mob/living/human/H = location var/obj/item/head = H.get_equipped_item(slot_head_str) if(head && (head.item_flags & ITEM_FLAG_AIRTIGHT)) can_open_valve = 1 diff --git a/code/game/objects/items/weapons/tools/weldingtool.dm b/code/game/objects/items/weapons/tools/weldingtool.dm index 979613064f7..a5003c4e8fe 100644 --- a/code/game/objects/items/weapons/tools/weldingtool.dm +++ b/code/game/objects/items/weapons/tools/weldingtool.dm @@ -344,7 +344,7 @@ /obj/item/weldingtool/use_on_mob(mob/living/target, mob/living/user, animate = TRUE) if(ishuman(target)) - var/mob/living/carbon/human/H = target + var/mob/living/human/H = target var/obj/item/organ/external/S = GET_EXTERNAL_ORGAN(H, user?.get_target_zone()) if(!S || !S.is_robotic() || user.a_intent != I_HELP) return ..() diff --git a/code/game/objects/structures/charge_pylon.dm b/code/game/objects/structures/charge_pylon.dm index 0d4fbe83d5a..b6afb372e60 100644 --- a/code/game/objects/structures/charge_pylon.dm +++ b/code/game/objects/structures/charge_pylon.dm @@ -19,7 +19,7 @@ /obj/structure/charge_pylon/proc/charge_user(var/mob/living/user) if(next_use > world.time) return next_use = world.time + 10 - var/mob/living/carbon/human/H = user + var/mob/living/human/H = user var/obj/item/cell/power_cell if(ishuman(user)) var/obj/item/organ/internal/cell/cell = H.get_organ(BP_CELL, /obj/item/organ/internal/cell) diff --git a/code/game/objects/structures/fitness.dm b/code/game/objects/structures/fitness.dm index 2542d145af1..b83a6aa499e 100644 --- a/code/game/objects/structures/fitness.dm +++ b/code/game/objects/structures/fitness.dm @@ -14,7 +14,7 @@ if(!ishuman(user)) return ..() - var/mob/living/carbon/human/H = user + var/mob/living/human/H = user var/synth = H.isSynthetic() if(!synth && H.nutrition < 20) to_chat(H, SPAN_WARNING("You [synth ? "need more energy" : "are too tired"] to use the punching bag. Go [synth ? "recharge" : "eat something"].")) @@ -51,7 +51,7 @@ /obj/structure/fitness/weightlifter/attack_hand(mob/user) if(!ishuman(user)) return ..() - var/mob/living/carbon/human/H = user + var/mob/living/human/H = user var/synth = H.isSynthetic() if(H.loc != src.loc) to_chat(H, SPAN_WARNING("You must be on the weight machine to use it.")) diff --git a/code/game/objects/structures/fountain.dm b/code/game/objects/structures/fountain.dm index 8dd74226c80..27096beadb7 100644 --- a/code/game/objects/structures/fountain.dm +++ b/code/game/objects/structures/fountain.dm @@ -25,7 +25,7 @@ to_chat(user, SPAN_WARNING("\The [src] is still and lifeless...")) return TRUE - var/mob/living/carbon/human/H = user + var/mob/living/human/H = user var/decl/bodytype/my_bodytype = istype(H) && H.get_bodytype() if(!istype(my_bodytype)) return ..() @@ -42,7 +42,7 @@ visible_message("\The [H] retracts their hand suddenly.") return TRUE -/obj/structure/fountain/proc/time_dilation(var/mob/living/carbon/human/user) +/obj/structure/fountain/proc/time_dilation(var/mob/living/human/user) for(var/mob/living/L in oviewers(7, src)) L.flash_eyes(3) diff --git a/code/game/objects/structures/grille.dm b/code/game/objects/structures/grille.dm index 3d8767be654..4bdf3369d23 100644 --- a/code/game/objects/structures/grille.dm +++ b/code/game/objects/structures/grille.dm @@ -102,7 +102,7 @@ var/damage_dealt = 1 var/attack_message = "kicks" if(ishuman(user)) - var/mob/living/carbon/human/H = user + var/mob/living/human/H = user if(H.species.can_shred(H)) attack_message = "mangles" damage_dealt = 5 diff --git a/code/game/objects/structures/ironing_board.dm b/code/game/objects/structures/ironing_board.dm index b89d31ee29a..95a44a1a42f 100644 --- a/code/game/objects/structures/ironing_board.dm +++ b/code/game/objects/structures/ironing_board.dm @@ -84,7 +84,7 @@ // anti-wrinkle "massage" if(buckled_mob && ishuman(buckled_mob)) - var/mob/living/carbon/human/H = buckled_mob + var/mob/living/human/H = buckled_mob var/zone = user.get_target_zone() var/parsed = parse_zone(zone) diff --git a/code/game/objects/structures/iv_drip.dm b/code/game/objects/structures/iv_drip.dm index 596c9f0b506..44c3e904348 100644 --- a/code/game/objects/structures/iv_drip.dm +++ b/code/game/objects/structures/iv_drip.dm @@ -4,7 +4,7 @@ anchored = FALSE density = FALSE - var/mob/living/carbon/human/attached + var/mob/living/human/attached var/mode = 1 // 1 is injecting, 0 is taking blood. var/obj/item/chems/beaker var/list/transfer_amounts = list(REM, 1, 2) @@ -209,12 +209,12 @@ attached.apply_damage(1, BRUTE, pick(BP_R_ARM, BP_L_ARM), damage_flags=DAM_SHARP) attached = null -/obj/structure/iv_drip/proc/hook_up(mob/living/carbon/human/target, mob/user) +/obj/structure/iv_drip/proc/hook_up(mob/living/human/target, mob/user) if(do_IV_hookup(target, user, src)) attached = target START_PROCESSING(SSobj,src) -/proc/do_IV_hookup(mob/living/carbon/human/target, mob/user, obj/IV) +/proc/do_IV_hookup(mob/living/human/target, mob/user, obj/IV) to_chat(user, SPAN_NOTICE("You start to hook up \the [target] to \the [IV].")) if(!user.do_skilled(2 SECONDS, SKILL_MEDICAL, target)) return FALSE diff --git a/code/game/objects/structures/railing.dm b/code/game/objects/structures/railing.dm index 76e6dc95853..76b4b96fbe9 100644 --- a/code/game/objects/structures/railing.dm +++ b/code/game/objects/structures/railing.dm @@ -184,7 +184,7 @@ if(istype(W, /obj/item/grab) && get_dist(src,user)<2) var/obj/item/grab/G = W if(ishuman(G.affecting)) - var/mob/living/carbon/human/H = G.get_affecting_mob() + var/mob/living/human/H = G.get_affecting_mob() var/obj/occupied = turf_is_crowded() if(occupied) to_chat(user, "There's \a [occupied] in the way.") diff --git a/code/game/objects/structures/safe.dm b/code/game/objects/structures/safe.dm index 56cd8226473..b1707bce25d 100644 --- a/code/game/objects/structures/safe.dm +++ b/code/game/objects/structures/safe.dm @@ -86,7 +86,7 @@ FLOOR SAFES /obj/structure/safe/Topic(href, href_list) if(!ishuman(usr)) return - var/mob/living/carbon/human/user = usr + var/mob/living/human/user = usr if(href_list["open"]) if(check_unlocked()) diff --git a/code/game/objects/structures/stool_bed_chair_nest_sofa/bed.dm b/code/game/objects/structures/stool_bed_chair_nest_sofa/bed.dm index fa25895ec87..b2a768c4491 100644 --- a/code/game/objects/structures/stool_bed_chair_nest_sofa/bed.dm +++ b/code/game/objects/structures/stool_bed_chair_nest_sofa/bed.dm @@ -236,7 +236,7 @@ beaker = null queue_icon_update() -/obj/structure/bed/roller/proc/attach_iv(mob/living/carbon/human/target, mob/user) +/obj/structure/bed/roller/proc/attach_iv(mob/living/human/target, mob/user) if(!beaker) return if(do_IV_hookup(target, user, beaker)) @@ -244,7 +244,7 @@ queue_icon_update() START_PROCESSING(SSobj,src) -/obj/structure/bed/roller/proc/detach_iv(mob/living/carbon/human/target, mob/user) +/obj/structure/bed/roller/proc/detach_iv(mob/living/human/target, mob/user) visible_message("\The [target] is taken off the IV on \the [src].") iv_attached = FALSE queue_icon_update() diff --git a/code/game/objects/structures/stool_bed_chair_nest_sofa/wheelchair.dm b/code/game/objects/structures/stool_bed_chair_nest_sofa/wheelchair.dm index f2e34f4e701..fa3b5ef1e35 100644 --- a/code/game/objects/structures/stool_bed_chair_nest_sofa/wheelchair.dm +++ b/code/game/objects/structures/stool_bed_chair_nest_sofa/wheelchair.dm @@ -76,7 +76,7 @@ B.set_dir(newdir) bloodiness-- -/proc/equip_wheelchair(mob/living/carbon/human/H) //Proc for spawning in a wheelchair if a new character has no legs. Used in new_player.dm +/proc/equip_wheelchair(mob/living/human/H) //Proc for spawning in a wheelchair if a new character has no legs. Used in new_player.dm var/obj/structure/bed/chair/wheelchair/W = new(get_turf(H)) if(isturf(H.loc)) W.buckle_mob(H) diff --git a/code/game/objects/structures/under_wardrobe.dm b/code/game/objects/structures/under_wardrobe.dm index ff844e19d4f..11ebfb66fde 100644 --- a/code/game/objects/structures/under_wardrobe.dm +++ b/code/game/objects/structures/under_wardrobe.dm @@ -44,7 +44,7 @@ interact(user) return TRUE -/obj/structure/undies_wardrobe/interact(var/mob/living/carbon/human/H) +/obj/structure/undies_wardrobe/interact(var/mob/living/human/H) var/id = H.GetIdCard() var/dat = list() @@ -56,7 +56,7 @@ dat = jointext(dat,null) show_browser(H, dat, "window=wardrobe;size=400x250") -/obj/structure/undies_wardrobe/proc/human_who_can_use_underwear(var/mob/living/carbon/human/H) +/obj/structure/undies_wardrobe/proc/human_who_can_use_underwear(var/mob/living/human/H) if(!istype(H) || !(H.get_bodytype()?.appearance_flags & HAS_UNDERWEAR)) return FALSE return TRUE @@ -71,7 +71,7 @@ if(..()) return TRUE - var/mob/living/carbon/human/H = usr + var/mob/living/human/H = usr if(href_list["select_underwear"]) var/datum/category_group/underwear/UWC = global.underwear.categories_by_name[href_list["select_underwear"]] if(!UWC) diff --git a/code/game/objects/structures/watercloset.dm b/code/game/objects/structures/watercloset.dm index 6c9c20c4bcf..deb34524e6d 100644 --- a/code/game/objects/structures/watercloset.dm +++ b/code/game/objects/structures/watercloset.dm @@ -332,7 +332,7 @@ var/global/list/hygiene_props = list() var/temp_adj = clamp(water_temperature - M.bodytemperature, BODYTEMP_COOLING_MAX, BODYTEMP_HEATING_MAX) M.bodytemperature += temp_adj if(ishuman(M)) - var/mob/living/carbon/human/H = M + var/mob/living/human/H = M if(water_temperature >= H.get_mob_temperature_threshold(HEAT_LEVEL_1)) to_chat(H, SPAN_DANGER("The water is searing hot!")) else if(water_temperature <= H.get_mob_temperature_threshold(COLD_LEVEL_1)) diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index 6c8d05acbb8..3d5f43c2807 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -151,7 +151,7 @@ if (user.a_intent && user.a_intent == I_HURT) if (ishuman(user)) - var/mob/living/carbon/human/H = user + var/mob/living/human/H = user if(H.species.can_shred(H)) attack_generic(H,25) return diff --git a/code/game/response_team.dm b/code/game/response_team.dm index df72fe9a7c9..dd611ef5465 100644 --- a/code/game/response_team.dm +++ b/code/game/response_team.dm @@ -64,7 +64,7 @@ var/global/can_call_ert /proc/percentage_dead() var/total = 0 var/deadcount = 0 - for(var/mob/living/carbon/human/H in SSmobs.mob_list) + for(var/mob/living/human/H in SSmobs.mob_list) if(H.client) // Monkeys and mice don't have a client, amirite? if(H.stat == DEAD) deadcount++ total++ @@ -76,7 +76,7 @@ var/global/can_call_ert /proc/percentage_antagonists() var/total = 0 var/antagonists = 0 - for(var/mob/living/carbon/human/H in SSmobs.mob_list) + for(var/mob/living/human/H in SSmobs.mob_list) if(is_special_character(H) >= 1) antagonists++ total++ diff --git a/code/game/turfs/floors/floor_attackby.dm b/code/game/turfs/floors/floor_attackby.dm index 69ef2d48b60..6cc34b7544f 100644 --- a/code/game/turfs/floors/floor_attackby.dm +++ b/code/game/turfs/floors/floor_attackby.dm @@ -1,7 +1,7 @@ /turf/floor/attack_hand(mob/user) if(!ishuman(user)) return ..() - var/mob/living/carbon/human/H = user + var/mob/living/human/H = user var/obj/item/hand = GET_EXTERNAL_ORGAN(H, H.get_active_held_item_slot()) if(hand && try_graffiti(H, hand)) return TRUE diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index 7bdb4f24715..d1025618167 100644 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -686,7 +686,7 @@ /turf/add_blood(mob/living/M) if(!simulated || !..() || !ishuman(M)) return FALSE - var/mob/living/carbon/human/H = M + var/mob/living/human/H = M var/unique_enzymes = H.get_unique_enzymes() var/blood_type = H.get_blood_type() if(unique_enzymes && blood_type) diff --git a/code/game/turfs/walls/wall_attacks.dm b/code/game/turfs/walls/wall_attacks.dm index 8d642bc087d..06c7269a780 100644 --- a/code/game/turfs/walls/wall_attacks.dm +++ b/code/game/turfs/walls/wall_attacks.dm @@ -75,7 +75,7 @@ add_fingerprint(user) user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) if(ishuman(user)) - var/mob/living/carbon/human/H = user + var/mob/living/human/H = user var/obj/item/hand = GET_EXTERNAL_ORGAN(H, H.get_active_held_item_slot()) if(hand && try_graffiti(H, hand)) return TRUE diff --git a/code/game/world.dm b/code/game/world.dm index ad271f0f087..f5b8dc6d4a7 100644 --- a/code/game/world.dm +++ b/code/game/world.dm @@ -50,7 +50,7 @@ GLOBAL_PROTECTED_UNTYPED(game_id, null) if(special_role_name) strings += special_role_name if(ishuman(M)) - var/mob/living/carbon/human/H = M + var/mob/living/human/H = M if(H.species) strings += H.species.name for(var/text in strings) diff --git a/code/game/world_topic_commands.dm b/code/game/world_topic_commands.dm index 1cc14496660..81101311f14 100644 --- a/code/game/world_topic_commands.dm +++ b/code/game/world_topic_commands.dm @@ -283,7 +283,7 @@ var/global/list/decl/topic_command/topic_commands = list() brain = L.get_damage(BRAIN) )) if(ishuman(M)) - var/mob/living/carbon/human/H = M + var/mob/living/human/H = M info["species"] = H.species.name else info["species"] = "non-human" diff --git a/code/modules/ZAS/Airflow.dm b/code/modules/ZAS/Airflow.dm index 9bd6651b0c3..ca6abe6fa8f 100644 --- a/code/modules/ZAS/Airflow.dm +++ b/code/modules/ZAS/Airflow.dm @@ -50,7 +50,7 @@ Contains helper procs for airflow, called by /connection_group. /mob/living/silicon/handle_airflow() return FALSE -/mob/living/carbon/human/handle_airflow_stun() +/mob/living/human/handle_airflow_stun() if(!slip_chance()) to_chat(src, SPAN_NOTICE("Air suddenly rushes past you!")) return FALSE @@ -134,7 +134,7 @@ Contains helper procs for airflow, called by /connection_group. airflow_speed = 0 airflow_dest = null -/mob/living/carbon/human/airflow_hit(atom/A) +/mob/living/human/airflow_hit(atom/A) // for(var/mob/M in hearers(src)) // M.show_message("[src] slams into [A]!",1,"You hear a loud slam!",2) playsound(src.loc, "punch", 25, 1, -1) diff --git a/code/modules/ZAS/Contaminants.dm b/code/modules/ZAS/Contaminants.dm index d3387ace01f..57a5ee2d801 100644 --- a/code/modules/ZAS/Contaminants.dm +++ b/code/modules/ZAS/Contaminants.dm @@ -49,7 +49,7 @@ var/global/image/contamination_overlay = image('icons/effects/contamination.dmi' /mob/proc/contaminate() -/mob/living/carbon/human/contaminate() +/mob/living/human/contaminate() //See if anything can be contaminated. if(!contaminant_suit_protected()) @@ -65,7 +65,7 @@ var/global/image/contamination_overlay = image('icons/effects/contamination.dmi' /mob/proc/handle_contaminants() return -/mob/living/carbon/human/handle_contaminants() +/mob/living/human/handle_contaminants() //Handles all the bad things contaminants can do. //Contamination @@ -99,7 +99,7 @@ var/global/image/contamination_overlay = image('icons/effects/contamination.dmi' add_genetic_condition(pick(decls_repository.get_decls_of_type(/decl/genetic_condition/disability))) to_chat(src, "High levels of toxins cause you to spontaneously mutate!") -/mob/living/carbon/human/proc/burn_eyes() +/mob/living/human/proc/burn_eyes() var/obj/item/organ/internal/eyes/E = get_organ(BP_EYES, /obj/item/organ/internal/eyes) if(E && !E.bodytype.eye_contaminant_guard) if(prob(20)) to_chat(src, "Your eyes burn!") @@ -109,7 +109,7 @@ var/global/image/contamination_overlay = image('icons/effects/contamination.dmi' to_chat(src, "You are blinded!") SET_STATUS_MAX(src, STAT_BLIND, 20) -/mob/living/carbon/human/proc/contaminant_head_protected() +/mob/living/human/proc/contaminant_head_protected() //Checks if the head is adequately sealed. var/obj/item/head = get_equipped_item(slot_head_str) if(!head) @@ -121,7 +121,7 @@ var/global/image/contamination_overlay = image('icons/effects/contamination.dmi' // Regardless, the head item must cover the face and head. Eyes are checked seperately above. return BIT_TEST_ALL(head.body_parts_covered, SLOT_HEAD|SLOT_FACE) -/mob/living/carbon/human/proc/contaminant_suit_protected() +/mob/living/human/proc/contaminant_suit_protected() //Checks if the suit is adequately sealed. var/coverage = 0 for(var/slot in list(slot_wear_suit_str, slot_gloves_str, slot_shoes_str)) @@ -137,7 +137,7 @@ var/global/image/contamination_overlay = image('icons/effects/contamination.dmi' return BIT_TEST_ALL(coverage, SLOT_UPPER_BODY|SLOT_LOWER_BODY|SLOT_LEGS|SLOT_FEET|SLOT_ARMS|SLOT_HANDS) -/mob/living/carbon/human/proc/suit_contamination() +/mob/living/human/proc/suit_contamination() //Runs over the things that can be contaminated and does so. for(var/slot in list(slot_w_uniform_str, slot_shoes_str, slot_gloves_str)) var/obj/item/gear = get_equipped_item(slot) diff --git a/code/modules/ZAS/Fire.dm b/code/modules/ZAS/Fire.dm index 303e07ec7ea..c961aed56c7 100644 --- a/code/modules/ZAS/Fire.dm +++ b/code/modules/ZAS/Fire.dm @@ -324,7 +324,7 @@ If it gains pressure too slowly, it may leak or just rupture instead of explodin return mx -/mob/living/carbon/human/FireBurn(var/firelevel, var/last_temperature, var/pressure) +/mob/living/human/FireBurn(var/firelevel, var/last_temperature, var/pressure) //Burns mobs due to fire. Respects heat transfer coefficients on various body parts. //Due to TG reworking how fireprotection works, this is kinda less meaningful. diff --git a/code/modules/acting/acting_items.dm b/code/modules/acting/acting_items.dm index 487a86b3322..ac454ee5975 100644 --- a/code/modules/acting/acting_items.dm +++ b/code/modules/acting/acting_items.dm @@ -32,7 +32,7 @@ SHOULD_CALL_PARENT(FALSE) if(!ishuman(user)) return ..() - var/mob/living/carbon/human/H = user + var/mob/living/human/H = user H.change_appearance(APPEARANCE_ALL, H.loc, H, H.generate_valid_species(), state = global.z_topic_state) var/getName = sanitize(input(H, "Would you like to change your name to something else?", "Name change") as null|text, MAX_NAME_LEN) if(getName) diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index 50a0e3d4272..f3be6255a41 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -685,7 +685,7 @@ var/global/list/admin_verbs_mod = list( if(!check_rights(R_FUN)) return - var/mob/living/carbon/human/H = input("Select mob.", "Change Mob Appearance - Admin") as null|anything in global.human_mob_list + var/mob/living/human/H = input("Select mob.", "Change Mob Appearance - Admin") as null|anything in global.human_mob_list if(!H) return log_and_message_admins("is altering the appearance of [H].") @@ -699,7 +699,7 @@ var/global/list/admin_verbs_mod = list( if(!check_rights(R_FUN)) return - var/mob/living/carbon/human/H = input("Select mob.", "Change Mob Appearance - Self") as null|anything in global.human_mob_list + var/mob/living/human/H = input("Select mob.", "Change Mob Appearance - Self") as null|anything in global.human_mob_list if(!H) return if(!H.client) @@ -736,7 +736,7 @@ var/global/list/admin_verbs_mod = list( if(!check_rights(R_FUN)) return - var/mob/living/carbon/human/M = input("Select mob.", "Edit Appearance") as null|anything in global.human_mob_list + var/mob/living/human/M = input("Select mob.", "Edit Appearance") as null|anything in global.human_mob_list if(!ishuman(M)) to_chat(usr, "You can only do this to humans!") diff --git a/code/modules/admin/quantum_mechanic.dm b/code/modules/admin/quantum_mechanic.dm index 1d19c6e3c65..7731afd44ca 100644 --- a/code/modules/admin/quantum_mechanic.dm +++ b/code/modules/admin/quantum_mechanic.dm @@ -6,7 +6,7 @@ // Most of their superhuman qualities can be toggled off if you need a normal human for testing biological functions */ -#define isquantum(X) istype(X, /mob/living/carbon/human/quantum) +#define isquantum(X) istype(X, /mob/living/human/quantum) /client/proc/spawn_quantum_mechanic() set category = "Debug" set name = "Spawn Quantum Mechanic" @@ -20,7 +20,7 @@ return var/T = get_turf(mob) - var/mob/living/carbon/human/quantum/Q = new (T) + var/mob/living/human/quantum/Q = new (T) prefs.copy_to(Q) @@ -56,7 +56,7 @@ belt = /obj/item/belt/utility/full/quantum id_slot = slot_wear_id_str -/mob/living/carbon/human/quantum +/mob/living/human/quantum status_flags = NO_ANTAG universal_understand = TRUE var/fall_override = TRUE @@ -76,17 +76,17 @@ /datum/movement_handler/mob/movement ) -/mob/living/carbon/human/quantum/can_inject(mob/user, target_zone) +/mob/living/human/quantum/can_inject(mob/user, target_zone) if(user == src) return ..() to_chat(user, SPAN_DANGER("\The [src] disarms you before you can inject them.")) user.drop_item() return FALSE -/mob/living/carbon/human/quantum/binarycheck() +/mob/living/human/quantum/binarycheck() return TRUE -/mob/living/carbon/human/quantum/proc/delete_self() +/mob/living/human/quantum/proc/delete_self() if(QDELETED(src)) return @@ -102,7 +102,7 @@ QDEL_IN(src, 7) -/mob/living/carbon/human/quantum/verb/quantum_antigrav() +/mob/living/human/quantum/verb/quantum_antigrav() set name = "Toggle Gravity" set desc = "Toggles falling." set category = "Ω" @@ -114,7 +114,7 @@ fall_override = TRUE to_chat(usr, SPAN_NOTICE("You will no longer fall.")) -/mob/living/carbon/human/quantum/verb/quantum_walk() +/mob/living/human/quantum/verb/quantum_walk() set name = "Toggle Phase Walking" set desc = "Uses quantum technology to phase through solid matter and move quickly." set category = "Ω" @@ -127,7 +127,7 @@ usr.ReplaceMovementHandler(/datum/movement_handler/mob/incorporeal) to_chat(usr, SPAN_NOTICE("You will now phase through solid matter.")) -/mob/living/carbon/human/quantum/verb/quantum_recover() +/mob/living/human/quantum/verb/quantum_recover() set name = "Rejuvenate Self" set desc = "Use quantum powers you to restore your health." set category = "Ω" @@ -135,14 +135,14 @@ revive() -/mob/living/carbon/human/quantum/verb/quantum_quit() +/mob/living/human/quantum/verb/quantum_quit() set name = "Teleport Out" set desc = "Activate quantum magic to leave and return to your original mob (if you have one)." set category = "Ω" delete_self() -/mob/living/carbon/human/quantum/verb/quantum_tgm() +/mob/living/human/quantum/verb/quantum_tgm() set name = "Toggle Godmode" set desc = "Enable or disable god mode. For testing things that require you to be vulnerable." set category = "Ω" @@ -296,8 +296,8 @@ // Full set of tools new /obj/item/multitool(src) -/mob/living/carbon/human/quantum/restrained() +/mob/living/human/quantum/restrained() return FALSE -/mob/living/carbon/human/quantum/can_fall(anchor_bypass = FALSE, turf/location_override = loc) +/mob/living/human/quantum/can_fall(anchor_bypass = FALSE, turf/location_override = loc) return fall_override ? FALSE : ..() diff --git a/code/modules/admin/respawn_as_self.dm b/code/modules/admin/respawn_as_self.dm index d19c9d752eb..0e5277b36c6 100644 --- a/code/modules/admin/respawn_as_self.dm +++ b/code/modules/admin/respawn_as_self.dm @@ -11,7 +11,7 @@ return var/mob/oldmob = C.mob - var/mob/living/carbon/human/H = new(oldmob.loc) + var/mob/living/human/H = new(oldmob.loc) C.prefs.copy_to(H) H.key = C.key qdel(oldmob) diff --git a/code/modules/admin/secrets/admin_secrets/list_dna.dm b/code/modules/admin/secrets/admin_secrets/list_dna.dm index 60804f3f668..eb9a57d6155 100644 --- a/code/modules/admin/secrets/admin_secrets/list_dna.dm +++ b/code/modules/admin/secrets/admin_secrets/list_dna.dm @@ -7,7 +7,7 @@ return var/dat = "Showing DNA from blood.
    " dat += "" - for(var/mob/living/carbon/human/H in SSmobs.mob_list) + for(var/mob/living/human/H in SSmobs.mob_list) if(H.ckey) dat += "" dat += "
    NameDNABlood Type
    [H][H.get_unique_enzymes() || "NULL"][H.get_blood_type() || "NULL"]
    " diff --git a/code/modules/admin/secrets/admin_secrets/list_fingerprints.dm b/code/modules/admin/secrets/admin_secrets/list_fingerprints.dm index 655774bbba1..7840ce20bb1 100644 --- a/code/modules/admin/secrets/admin_secrets/list_fingerprints.dm +++ b/code/modules/admin/secrets/admin_secrets/list_fingerprints.dm @@ -7,7 +7,7 @@ return var/dat = "Showing Fingerprints.
    " dat += "" - for(var/mob/living/carbon/human/H in SSmobs.mob_list) + for(var/mob/living/human/H in SSmobs.mob_list) if(H.ckey) dat += "" dat += "
    NameFingerprints
    [H][H.get_full_print(ignore_blockers = TRUE) || "null"]
    " diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index 18c317543e7..18a05a3d3cf 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -739,9 +739,9 @@ else if(href_list["monkeyone"]) if(!check_rights(R_SPAWN)) return - var/mob/living/carbon/human/H = locate(href_list["monkeyone"]) + var/mob/living/human/H = locate(href_list["monkeyone"]) if(!istype(H)) - to_chat(usr, "This can only be used on instances of type /mob/living/carbon/human") + to_chat(usr, "This can only be used on instances of type /mob/living/human") return log_and_message_admins("attempting to monkeyize [key_name_admin(H)]") @@ -750,9 +750,9 @@ else if(href_list["corgione"]) if(!check_rights(R_SPAWN)) return - var/mob/living/carbon/human/H = locate(href_list["corgione"]) + var/mob/living/human/H = locate(href_list["corgione"]) if(!istype(H)) - to_chat(usr, "This can only be used on instances of type /mob/living/carbon/human") + to_chat(usr, "This can only be used on instances of type /mob/living/human") return log_and_message_admins("attempting to corgize [key_name_admin(H)]") @@ -788,9 +788,9 @@ else if(href_list["makeai"]) if(!check_rights(R_SPAWN)) return - var/mob/living/carbon/human/H = locate(href_list["makeai"]) + var/mob/living/human/H = locate(href_list["makeai"]) if(!istype(H)) - to_chat(usr, "This can only be used on instances of type /mob/living/carbon/human") + to_chat(usr, "This can only be used on instances of type /mob/living/human") return log_and_message_admins("AIized [key_name_admin(H)]!") @@ -799,9 +799,9 @@ else if(href_list["makerobot"]) if(!check_rights(R_SPAWN)) return - var/mob/living/carbon/human/H = locate(href_list["makerobot"]) + var/mob/living/human/H = locate(href_list["makerobot"]) if(!istype(H)) - to_chat(usr, "This can only be used on instances of type /mob/living/carbon/human") + to_chat(usr, "This can only be used on instances of type /mob/living/human") return usr.client.cmd_admin_robotize(H) @@ -935,9 +935,9 @@ else if(href_list["adminspawnprayreward"]) if(!check_rights(R_ADMIN|R_FUN)) return - var/mob/living/carbon/human/H = locate(href_list["adminspawnprayreward"]) + var/mob/living/human/H = locate(href_list["adminspawnprayreward"]) if(!ishuman(H)) - to_chat(usr, "This can only be used on instances of type /mob/living/carbon/human") + to_chat(usr, "This can only be used on instances of type /mob/living/human") return var/obj/item/C = new global.using_map.pray_reward_type(get_turf(H)) @@ -1019,9 +1019,9 @@ else if(href_list["SyndicateReply"]) - var/mob/living/carbon/human/H = locate(href_list["SyndicateReply"]) + var/mob/living/human/H = locate(href_list["SyndicateReply"]) if(!istype(H)) - to_chat(usr, "This can only be used on instances of type /mob/living/carbon/human") + to_chat(usr, "This can only be used on instances of type /mob/living/human") return var/obj/item/l_ear = H.get_equipped_item(slot_l_ear_str) var/obj/item/r_ear = H.get_equipped_item(slot_r_ear_str) @@ -1604,7 +1604,7 @@ /mob/living/proc/can_centcom_reply() return 0 -/mob/living/carbon/human/can_centcom_reply() +/mob/living/human/can_centcom_reply() for(var/slot in global.ear_slots) var/obj/item/radio/headset/radio = get_equipped_item(slot) if(istype(radio)) diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm index 218abb76b5a..65defcabc42 100644 --- a/code/modules/admin/verbs/debug.dm +++ b/code/modules/admin/verbs/debug.dm @@ -107,7 +107,7 @@ set name = "Del-All" // to prevent REALLY stupid deletions - var/blocked = list(/obj, /mob, /mob/living, /mob/living/carbon/human, /mob/observer, /mob/living/silicon, /mob/living/silicon/robot, /mob/living/silicon/ai) + var/blocked = list(/obj, /mob, /mob/living, /mob/living/human, /mob/observer, /mob/living/silicon, /mob/living/silicon/robot, /mob/living/silicon/ai) var/hsbitem = input(usr, "Choose an object to delete.", "Delete:") as null|anything in typesof(/obj) + typesof(/mob) - blocked if(hsbitem) for(var/atom/O in world) @@ -145,7 +145,7 @@ alert("Wait until the game starts") return if (ishuman(M)) - var/mob/living/carbon/human/H = M + var/mob/living/human/H = M var/obj/item/card/id/id = H.GetIdCard() if(id) id.icon_state = "gold" @@ -282,7 +282,7 @@ if(!check_rights(R_FUN)) return - var/mob/living/carbon/human/H = input("Select mob.", "Select equipment.") as null|anything in global.human_mob_list + var/mob/living/human/H = input("Select mob.", "Select equipment.") as null|anything in global.human_mob_list if(!H) return @@ -297,7 +297,7 @@ SSstatistics.add_field_details("admin_verb","SEQ") dressup_human(H, outfit, reset_equipment) -/proc/dressup_human(var/mob/living/carbon/human/H, var/decl/hierarchy/outfit/outfit, var/undress = TRUE) +/proc/dressup_human(var/mob/living/human/H, var/decl/hierarchy/outfit/outfit, var/undress = TRUE) if(!H || !outfit) return if(undress) @@ -375,12 +375,12 @@ set name = "Analyse Health" set desc = "Get an advanced health reading on a human mob." - var/mob/living/carbon/human/H = input("Select mob.", "Analyse Health") as null|anything in global.human_mob_list + var/mob/living/human/H = input("Select mob.", "Analyse Health") as null|anything in global.human_mob_list if(!H) return cmd_analyse_health(H) -/client/proc/cmd_analyse_health(var/mob/living/carbon/human/H) +/client/proc/cmd_analyse_health(var/mob/living/human/H) if(!check_rights(R_DEBUG)) return @@ -392,7 +392,7 @@ dat += text("
    Close", usr) show_browser(usr, dat, "window=scanconsole;size=430x600") -/client/proc/cmd_analyse_health_context(mob/living/carbon/human/H as mob in global.human_mob_list) +/client/proc/cmd_analyse_health_context(mob/living/human/H as mob in global.human_mob_list) set category = null set name = "Analyse Human Health" diff --git a/code/modules/admin/verbs/possess.dm b/code/modules/admin/verbs/possess.dm index 758ef1ee1ab..aea09a39741 100644 --- a/code/modules/admin/verbs/possess.dm +++ b/code/modules/admin/verbs/possess.dm @@ -29,7 +29,7 @@ usr.real_name = usr.name_archive usr.SetName(usr.real_name) if(ishuman(usr)) - var/mob/living/carbon/human/H = usr + var/mob/living/human/H = usr H.SetName(H.get_visible_name()) usr.forceMove(O.loc) // Appear where the object you were controlling is -- TLE diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm index e4330d3f864..9a048e30b7f 100644 --- a/code/modules/admin/verbs/randomverbs.dm +++ b/code/modules/admin/verbs/randomverbs.dm @@ -395,7 +395,7 @@ Traitors and the like can also be revived with the previous role mostly intact. to_chat(usr, SPAN_WARNING("There is no active key like that in the game or the person is not currently a ghost.")) return - var/mob/living/carbon/human/new_character = new(get_random_spawn_turf(SPAWN_FLAG_JOBS_CAN_SPAWN)) //The mob being spawned. + var/mob/living/human/new_character = new(get_random_spawn_turf(SPAWN_FLAG_JOBS_CAN_SPAWN)) //The mob being spawned. var/datum/computer_file/report/crew_record/record_found //Referenced to later to either randomize or not randomize the character. if(G_found.mind && !G_found.mind.active) record_found = get_crewmember_record(G_found.real_name) diff --git a/code/modules/admin/view_variables/helpers.dm b/code/modules/admin/view_variables/helpers.dm index 6a306a533a9..42650c5971a 100644 --- a/code/modules/admin/view_variables/helpers.dm +++ b/code/modules/admin/view_variables/helpers.dm @@ -69,7 +69,7 @@ "} -/mob/living/carbon/human/get_view_variables_options() +/mob/living/human/get_view_variables_options() return ..() + {" diff --git a/code/modules/admin/view_variables/topic.dm b/code/modules/admin/view_variables/topic.dm index 75fb19c9554..8c2e7f2ecad 100644 --- a/code/modules/admin/view_variables/topic.dm +++ b/code/modules/admin/view_variables/topic.dm @@ -25,9 +25,9 @@ else if(href_list["dressup"]) if(!check_rights(R_VAREDIT)) return - var/mob/living/carbon/human/H = locate(href_list["dressup"]) + var/mob/living/human/H = locate(href_list["dressup"]) if(!istype(H)) - to_chat(usr, "This can only be used on instances of type /mob/living/carbon/human") + to_chat(usr, "This can only be used on instances of type /mob/living/human") return var/decl/hierarchy/outfit/outfit = input("Select outfit.", "Select equipment.") as null|anything in outfits() if(!outfit) @@ -252,9 +252,9 @@ else if(href_list["makemonkey"]) if(!check_rights(R_SPAWN)) return - var/mob/living/carbon/human/H = locate(href_list["makemonkey"]) + var/mob/living/human/H = locate(href_list["makemonkey"]) if(!istype(H)) - to_chat(usr, "This can only be done to instances of type /mob/living/carbon/human") + to_chat(usr, "This can only be done to instances of type /mob/living/human") return if(alert("Confirm mob type change?",,"Transform","Cancel") != "Transform") return @@ -266,9 +266,9 @@ else if(href_list["makerobot"]) if(!check_rights(R_SPAWN)) return - var/mob/living/carbon/human/H = locate(href_list["makerobot"]) + var/mob/living/human/H = locate(href_list["makerobot"]) if(!istype(H)) - to_chat(usr, "This can only be done to instances of type /mob/living/carbon/human") + to_chat(usr, "This can only be done to instances of type /mob/living/human") return if(alert("Confirm mob type change?",,"Transform","Cancel") != "Transform") return @@ -280,9 +280,9 @@ else if(href_list["makeai"]) if(!check_rights(R_SPAWN)) return - var/mob/living/carbon/human/H = locate(href_list["makeai"]) + var/mob/living/human/H = locate(href_list["makeai"]) if(!istype(H)) - to_chat(usr, "This can only be done to instances of type /mob/living/carbon/human") + to_chat(usr, "This can only be done to instances of type /mob/living/human") return if(alert("Confirm mob type change?",,"Transform","Cancel") != "Transform") return @@ -293,9 +293,9 @@ else if(href_list["addailment"]) - var/mob/living/carbon/human/H = locate(href_list["addailment"]) + var/mob/living/human/H = locate(href_list["addailment"]) if(!istype(H)) - to_chat(usr, "This can only be done to instances of type /mob/living/carbon/human") + to_chat(usr, "This can only be done to instances of type /mob/living/human") return var/obj/item/organ/O = input("Select a limb to add the ailment to.", "Add Ailment") as null|anything in H.get_organs() if(QDELETED(H) || QDELETED(O) || O.owner != H) @@ -317,9 +317,9 @@ else if(href_list["remailment"]) - var/mob/living/carbon/human/H = locate(href_list["remailment"]) + var/mob/living/human/H = locate(href_list["remailment"]) if(!istype(H)) - to_chat(usr, "This can only be done to instances of type /mob/living/carbon/human") + to_chat(usr, "This can only be done to instances of type /mob/living/human") return var/list/all_ailments = list() for(var/obj/item/organ/O in H.get_organs()) @@ -339,9 +339,9 @@ else if(href_list["setspecies"]) if(!check_rights(R_SPAWN)) return - var/mob/living/carbon/human/H = locate(href_list["setspecies"]) + var/mob/living/human/H = locate(href_list["setspecies"]) if(!istype(H)) - to_chat(usr, SPAN_WARNING("This can only be done to instances of type /mob/living/carbon/human")) + to_chat(usr, SPAN_WARNING("This can only be done to instances of type /mob/living/human")) return var/new_species = input("Please choose a new species.","Species",null) as null|anything in get_all_species() @@ -361,9 +361,9 @@ else if(href_list["setbodytype"]) if(!check_rights(R_SPAWN)) return - var/mob/living/carbon/human/H = locate(href_list["setbodytype"]) + var/mob/living/human/H = locate(href_list["setbodytype"]) if(!istype(H)) - to_chat(usr, SPAN_WARNING("This can only be done to instances of type /mob/living/carbon/human")) + to_chat(usr, SPAN_WARNING("This can only be done to instances of type /mob/living/human")) return var/new_bodytype = input("Please choose a new bodytype.","Bodytype",null) as null|anything in H.species.available_bodytypes @@ -444,8 +444,8 @@ possibleverbs += "Cancel" // One for the top... possibleverbs += typesof(/mob/proc,/mob/verb,/mob/living/proc,/mob/living/verb) switch(H.type) - if(/mob/living/carbon/human) - possibleverbs += typesof(/mob/living/carbon/human/verb, /mob/living/carbon/human/proc) + if(/mob/living/human) + possibleverbs += typesof(/mob/living/human/verb, /mob/living/human/proc) if(/mob/living/silicon/robot) possibleverbs += typesof(/mob/living/silicon/proc, /mob/living/silicon/robot/proc, /mob/living/silicon/robot/verb) if(/mob/living/silicon/ai) @@ -568,9 +568,9 @@ else if(href_list["refreshoverlays"]) if(!check_rights(0)) return - var/mob/living/carbon/human/H = locate(href_list["refreshoverlays"]) + var/mob/living/human/H = locate(href_list["refreshoverlays"]) if(!istype(H)) - to_chat(usr, "This can only be done to instances of type /mob/living/carbon/human") + to_chat(usr, "This can only be done to instances of type /mob/living/human") return H.try_refresh_visible_overlays() diff --git a/code/modules/aspects/_aspects.dm b/code/modules/aspects/_aspects.dm index d36b02d954d..2749757a0dc 100644 --- a/code/modules/aspects/_aspects.dm +++ b/code/modules/aspects/_aspects.dm @@ -174,7 +174,7 @@ var/global/list/aspect_categories = list() // Containers for ease of printing da do_update = TRUE return do_update -/mob/living/carbon/human/apply_aspects(var/aspect_type) +/mob/living/human/apply_aspects(var/aspect_type) . = ..(aspect_type) if(.) update_body() diff --git a/code/modules/assembly/mousetrap.dm b/code/modules/assembly/mousetrap.dm index 4f0fea84ac9..b0b1aed79e3 100644 --- a/code/modules/assembly/mousetrap.dm +++ b/code/modules/assembly/mousetrap.dm @@ -30,7 +30,7 @@ return var/obj/item/organ/external/affecting = null if(ishuman(target)) - var/mob/living/carbon/human/H = target + var/mob/living/human/H = target switch(type) if("feet") if(!H.get_equipped_item(slot_shoes_str)) diff --git a/code/modules/atmospherics/he_pipes.dm b/code/modules/atmospherics/he_pipes.dm index 14355d9471b..3d13f92bc6d 100644 --- a/code/modules/atmospherics/he_pipes.dm +++ b/code/modules/atmospherics/he_pipes.dm @@ -78,7 +78,7 @@ var/heat_limit = 1000 - var/mob/living/carbon/human/H = buckled_mob + var/mob/living/human/H = buckled_mob if(istype(H) && H.species) heat_limit = H.get_mob_temperature_threshold(HEAT_LEVEL_3) diff --git a/code/modules/augment/augment.dm b/code/modules/augment/augment.dm index 8f63e1b6c25..7297b6a1ba5 100644 --- a/code/modules/augment/augment.dm +++ b/code/modules/augment/augment.dm @@ -27,7 +27,7 @@ return ..() -/obj/item/organ/internal/augment/do_install(var/mob/living/carbon/human/target, var/obj/item/organ/external/affected, var/in_place = FALSE, var/update_icon = TRUE, var/detached = FALSE) +/obj/item/organ/internal/augment/do_install(var/mob/living/human/target, var/obj/item/organ/external/affected, var/in_place = FALSE, var/update_icon = TRUE, var/detached = FALSE) . = ..() parent_organ = affected.organ_tag update_parent_organ() diff --git a/code/modules/awaymissions/corpse.dm b/code/modules/awaymissions/corpse.dm index 011a9276cc3..fbd520afb17 100644 --- a/code/modules/awaymissions/corpse.dm +++ b/code/modules/awaymissions/corpse.dm @@ -40,10 +40,10 @@ if(!species) species = global.using_map.default_species var/species_choice = islist(species) ? pickweight(species) : species - my_corpse = weakref(new /mob/living/carbon/human/corpse(loc, species_choice, null, src)) + my_corpse = weakref(new /mob/living/human/corpse(loc, species_choice, null, src)) return INITIALIZE_HINT_QDEL -/obj/abstract/landmark/corpse/proc/randomize_appearance(var/mob/living/carbon/human/M, species_choice) +/obj/abstract/landmark/corpse/proc/randomize_appearance(var/mob/living/human/M, species_choice) if((spawn_flags & CORPSE_SPAWNER_RANDOM_GENDER)) if(species_choice in genders_per_species) @@ -101,7 +101,7 @@ M.SetName(name) M.real_name = M.name -/obj/abstract/landmark/corpse/proc/equip_corpse_outfit(var/mob/living/carbon/human/M) +/obj/abstract/landmark/corpse/proc/equip_corpse_outfit(var/mob/living/human/M) var/adjustments = 0 adjustments = (spawn_flags & CORPSE_SPAWNER_CUT_SURVIVAL) ? (adjustments|OUTFIT_ADJUSTMENT_SKIP_SURVIVAL_GEAR) : adjustments adjustments = (spawn_flags & CORPSE_SPAWNER_CUT_ID_PDA) ? (adjustments|OUTFIT_ADJUSTMENT_SKIP_ID_PDA) : adjustments diff --git a/code/modules/client/preference_setup/loadout/lists/augmentations.dm b/code/modules/client/preference_setup/loadout/lists/augmentations.dm index 1ae8245c615..fe638596308 100644 --- a/code/modules/client/preference_setup/loadout/lists/augmentations.dm +++ b/code/modules/client/preference_setup/loadout/lists/augmentations.dm @@ -19,7 +19,7 @@ else ..() -/obj/item/organ/internal/augment/AttemptAugmentation(mob/living/carbon/human/user, target_zone) +/obj/item/organ/internal/augment/AttemptAugmentation(mob/living/human/user, target_zone) if(!istype(user)) return ..() diff --git a/code/modules/client/preference_setup/loadout/loadout.dm b/code/modules/client/preference_setup/loadout/loadout.dm index 389b943e697..aef71965634 100644 --- a/code/modules/client/preference_setup/loadout/loadout.dm +++ b/code/modules/client/preference_setup/loadout/loadout.dm @@ -475,7 +475,7 @@ var/global/list/gear_datums = list() if(metadata && !islist(metadata)) PRINT_STACK_TRACE("Loadout spawn_item() proc received non-null non-list metadata: '[json_encode(metadata)]'") -/decl/loadout_option/proc/spawn_on_mob(mob/living/carbon/human/wearer, metadata) +/decl/loadout_option/proc/spawn_on_mob(mob/living/human/wearer, metadata) var/obj/item/item = spawn_and_validate_item(wearer, metadata) if(!item) return @@ -500,14 +500,14 @@ var/global/list/gear_datums = list() qdel(old_item) return item -/decl/loadout_option/proc/spawn_in_storage_or_drop(mob/living/carbon/human/wearer, metadata) +/decl/loadout_option/proc/spawn_in_storage_or_drop(mob/living/human/wearer, metadata) var/obj/item/item = spawn_and_validate_item(wearer, metadata) if(!item) return place_in_storage_or_drop(wearer, item) -/decl/loadout_option/proc/place_in_storage_or_drop(mob/living/carbon/human/wearer, obj/item/item) +/decl/loadout_option/proc/place_in_storage_or_drop(mob/living/human/wearer, obj/item/item) var/atom/placed_in = wearer.equip_to_storage(item) if(placed_in) to_chat(wearer, SPAN_NOTICE("Placing \the [item] in your [placed_in.name]!")) @@ -518,7 +518,7 @@ var/global/list/gear_datums = list() else to_chat(wearer, SPAN_DANGER("Dropping \the [item] on the ground!")) -/decl/loadout_option/proc/spawn_and_validate_item(mob/living/carbon/human/H, metadata) +/decl/loadout_option/proc/spawn_and_validate_item(mob/living/human/H, metadata) PRIVATE_PROC(TRUE) var/obj/item/item = spawn_item(H, H, metadata) diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index b07d150f38a..d1b3c3f9799 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -344,7 +344,7 @@ var/global/list/time_prefs_fixed = list() update_setup_window(usr) return 1 -/datum/preferences/proc/copy_to(mob/living/carbon/human/character, is_preview_copy = FALSE) +/datum/preferences/proc/copy_to(mob/living/human/character, is_preview_copy = FALSE) if(!player_setup) return // WHY IS THIS EVEN HAPPENING. diff --git a/code/modules/client/preferences_spawnpoints.dm b/code/modules/client/preferences_spawnpoints.dm index 3822bd5ce8f..f5057696c33 100644 --- a/code/modules/client/preferences_spawnpoints.dm +++ b/code/modules/client/preferences_spawnpoints.dm @@ -95,7 +95,7 @@ /obj/abstract/landmark/latejoin/cryo spawn_decl = /decl/spawnpoint/cryo -/decl/spawnpoint/cryo/after_join(mob/living/carbon/human/victim) +/decl/spawnpoint/cryo/after_join(mob/living/human/victim) if(!istype(victim) || victim.buckled) // They may have spawned with a wheelchair; don't move them into a pod in that case. return diff --git a/code/modules/clothing/_clothing.dm b/code/modules/clothing/_clothing.dm index 52e35417676..8ab8d42044c 100644 --- a/code/modules/clothing/_clothing.dm +++ b/code/modules/clothing/_clothing.dm @@ -364,7 +364,7 @@ for(var/obj/item/clothing/accessory in accessories) . = min(., accessory.get_pressure_weakness(pressure,zone)) -/obj/item/clothing/proc/check_limb_support(var/mob/living/carbon/human/user) +/obj/item/clothing/proc/check_limb_support(var/mob/living/human/user) return FALSE /obj/item/clothing/verb/toggle_suit_sensors() diff --git a/code/modules/clothing/badges/_badge.dm b/code/modules/clothing/badges/_badge.dm index 5f0953f75ab..a90afae0fc6 100644 --- a/code/modules/clothing/badges/_badge.dm +++ b/code/modules/clothing/badges/_badge.dm @@ -32,7 +32,7 @@ /obj/item/clothing/badge/proc/set_name(var/new_name) stored_name = new_name -/obj/item/clothing/badge/proc/set_desc(var/mob/living/carbon/human/H) +/obj/item/clothing/badge/proc/set_desc(var/mob/living/human/H) /obj/item/clothing/badge/get_examine_line() . = ..() diff --git a/code/modules/clothing/glasses/_glasses.dm b/code/modules/clothing/glasses/_glasses.dm index ab8e6001f6b..8e0f44b9e18 100644 --- a/code/modules/clothing/glasses/_glasses.dm +++ b/code/modules/clothing/glasses/_glasses.dm @@ -49,7 +49,7 @@ /obj/item/clothing/glasses/emp_act(severity) if(electric) if(ishuman(src.loc)) - var/mob/living/carbon/human/M = src.loc + var/mob/living/human/M = src.loc if(M.get_equipped_item(slot_glasses_str) != src) to_chat(M, SPAN_DANGER("\The [src] malfunction[gender != PLURAL ? "s":""], releasing a small spark.")) else diff --git a/code/modules/clothing/gloves/_gloves.dm b/code/modules/clothing/gloves/_gloves.dm index c1d1ff39382..df999d9d245 100644 --- a/code/modules/clothing/gloves/_gloves.dm +++ b/code/modules/clothing/gloves/_gloves.dm @@ -52,7 +52,7 @@ /obj/item/clothing/gloves/equipped() . = ..() if(covering_ring) - var/mob/living/carbon/human/H = loc + var/mob/living/human/H = loc if(istype(H) && H.get_equipped_item(slot_gloves_str) != src) H.equip_to_slot_if_possible(covering_ring, slot_gloves_str, disable_warning = TRUE) var/obj/item/gloves = H.get_equipped_item(slot_gloves_str) @@ -62,7 +62,7 @@ /obj/item/clothing/gloves/dropped(var/mob/user) ..() - var/mob/living/carbon/human/H = user + var/mob/living/human/H = user if(covering_ring) if(istype(H)) H.equip_to_slot_if_possible(covering_ring, slot_gloves_str, disable_warning = TRUE) diff --git a/code/modules/clothing/gloves/jewelry/rings/material.dm b/code/modules/clothing/gloves/jewelry/rings/material.dm index 2a9e7fbd115..7ce5cc82a09 100644 --- a/code/modules/clothing/gloves/jewelry/rings/material.dm +++ b/code/modules/clothing/gloves/jewelry/rings/material.dm @@ -22,7 +22,7 @@ /obj/item/clothing/gloves/ring/material/OnTopic(var/mob/user, var/list/href_list) if(href_list["examine"]) if(istype(user)) - var/mob/living/carbon/human/H = get_recursive_loc_of_type(/mob/living/carbon/human) + var/mob/living/human/H = get_recursive_loc_of_type(/mob/living/human) if(H.Adjacent(user)) user.examinate(src) return TOPIC_HANDLED diff --git a/code/modules/clothing/gloves/jewelry/rings/rings.dm b/code/modules/clothing/gloves/jewelry/rings/rings.dm index c1331acb08b..9f188b8e136 100644 --- a/code/modules/clothing/gloves/jewelry/rings/rings.dm +++ b/code/modules/clothing/gloves/jewelry/rings/rings.dm @@ -26,12 +26,12 @@ desc = "A strange ring with symbols carved on it in some arcane language." icon = 'icons/clothing/accessories/jewelry/rings/ring_magic.dmi' -/obj/item/clothing/gloves/ring/magic/equipped(var/mob/living/carbon/human/H, var/slot) +/obj/item/clothing/gloves/ring/magic/equipped(var/mob/living/human/H, var/slot) ..() if(istype(H) && slot == SLOT_HANDS) H.add_cloaking_source(src) -/obj/item/clothing/gloves/ring/magic/dropped(var/mob/living/carbon/human/H) +/obj/item/clothing/gloves/ring/magic/dropped(var/mob/living/human/H) if(!..()) return 0 @@ -57,7 +57,7 @@ reagents.maximum_volume = max(volume, reagents.maximum_volume) . = ..() -/obj/item/clothing/gloves/ring/reagent/equipped(var/mob/living/carbon/human/H) +/obj/item/clothing/gloves/ring/reagent/equipped(var/mob/living/human/H) ..() if(istype(H) && H.get_equipped_item(slot_gloves_str) == src) to_chat(H, SPAN_DANGER("You feel a prick as you slip on the ring.")) diff --git a/code/modules/clothing/head/fated_key.dm b/code/modules/clothing/head/fated_key.dm index ca70c143077..4c552a4d190 100644 --- a/code/modules/clothing/head/fated_key.dm +++ b/code/modules/clothing/head/fated_key.dm @@ -78,7 +78,7 @@ /obj/item/projectile/sanctionedaction/check_penetrate(var/atom/A) . = TRUE if(ishuman(A)) - var/mob/living/carbon/human/H = A + var/mob/living/human/H = A var/list/external_organs = H.get_external_organs() if(LAZYLEN(external_organs)) var/obj/item/organ/external/E = pick(external_organs) diff --git a/code/modules/clothing/masks/chewable.dm b/code/modules/clothing/masks/chewable.dm index 28e85f79b09..692f6e3fe4f 100644 --- a/code/modules/clothing/masks/chewable.dm +++ b/code/modules/clothing/masks/chewable.dm @@ -41,7 +41,7 @@ chewtime -= amount if(reagents && reagents.total_volume) if(ishuman(loc)) - var/mob/living/carbon/human/user = loc + var/mob/living/human/user = loc if (src == user.get_equipped_item(slot_wear_mask_str) && user.check_has_mouth()) reagents.trans_to_mob(user, REM, CHEM_INGEST, 0.2) add_trace_DNA(user) diff --git a/code/modules/clothing/masks/monitor.dm b/code/modules/clothing/masks/monitor.dm index 0cc94b7409b..9a06b7c888c 100644 --- a/code/modules/clothing/masks/monitor.dm +++ b/code/modules/clothing/masks/monitor.dm @@ -62,7 +62,7 @@ /obj/item/clothing/mask/monitor/equipped() ..() - var/mob/living/carbon/human/H = loc + var/mob/living/human/H = loc if(istype(H) && H.get_equipped_item(slot_wear_mask_str) == src) canremove = 0 to_chat(H, SPAN_NOTICE("\The [src] connects to your display output.")) @@ -89,7 +89,7 @@ set category = "IC" set src in usr - var/mob/living/carbon/human/H = loc + var/mob/living/human/H = loc if(!istype(H) || H != usr) return diff --git a/code/modules/clothing/masks/smokable.dm b/code/modules/clothing/masks/smokable.dm index 6abbda121bd..7c50a102516 100644 --- a/code/modules/clothing/masks/smokable.dm +++ b/code/modules/clothing/masks/smokable.dm @@ -60,7 +60,7 @@ if(reagents && reagents.total_volume) // check if it has any reagents at all var/smoke_loc = loc if(ishuman(loc)) - var/mob/living/carbon/human/user = loc + var/mob/living/human/user = loc smoke_loc = user.loc if ((src == user.get_equipped_item(slot_wear_mask_str) || manual) && user.check_has_mouth()) // if it's in the human/monkey mouth, transfer reagents to the mob reagents.trans_to_mob(user, smoke_amount * amount, CHEM_INHALE, 0.2) @@ -78,7 +78,7 @@ if(T) var/datum/gas_mixture/environment = T.return_air() if(ishuman(loc)) - var/mob/living/carbon/human/user = loc + var/mob/living/human/user = loc if (src == user.get_equipped_item(slot_wear_mask_str) && user.internal) environment = user.internal.return_air() if(environment.get_by_flag(XGM_GAS_OXIDIZER) < gas_consumption) diff --git a/code/modules/clothing/misc/dog_tags.dm b/code/modules/clothing/misc/dog_tags.dm index f45b1bb483e..d930f64749c 100644 --- a/code/modules/clothing/misc/dog_tags.dm +++ b/code/modules/clothing/misc/dog_tags.dm @@ -24,7 +24,7 @@ /obj/item/clothing/dog_tags/loadout_setup(mob/wearer, metadata) owner_name = wearer.real_name - var/mob/living/carbon/human/H = wearer + var/mob/living/human/H = wearer if(!istype(H)) return diff --git a/code/modules/clothing/shoes/magboots.dm b/code/modules/clothing/shoes/magboots.dm index 6771a84fda1..7badc14cffb 100644 --- a/code/modules/clothing/shoes/magboots.dm +++ b/code/modules/clothing/shoes/magboots.dm @@ -91,7 +91,7 @@ if(istype(M)) M.update_floating() if(covering_shoes) - var/mob/living/carbon/human/H = M + var/mob/living/human/H = M var/obj/item/shoes = H.get_equipped_item(slot_shoes_str) if(istype(H) && shoes != src) H.equip_to_slot_if_possible(covering_shoes, slot_shoes_str, disable_warning = TRUE) @@ -102,7 +102,7 @@ /obj/item/clothing/shoes/magboots/dropped(var/mob/user) ..() - var/mob/living/carbon/human/H = user + var/mob/living/human/H = user if(covering_shoes) if(istype(H)) H.equip_to_slot_if_possible(covering_shoes, slot_shoes_str, disable_warning = TRUE) diff --git a/code/modules/clothing/spacesuits/breaches.dm b/code/modules/clothing/spacesuits/breaches.dm index 1bd4a98b6ce..a7cb2233567 100644 --- a/code/modules/clothing/spacesuits/breaches.dm +++ b/code/modules/clothing/spacesuits/breaches.dm @@ -193,7 +193,7 @@ return if(ishuman(loc)) - var/mob/living/carbon/human/H = loc + var/mob/living/human/H = loc if(H.get_equipped_item(slot_wear_suit_str) == src) to_chat(user, SPAN_WARNING("You cannot repair \the [src] while it is being worn.")) return @@ -211,7 +211,7 @@ else if(IS_WELDER(W)) if(ishuman(loc)) - var/mob/living/carbon/human/H = loc + var/mob/living/human/H = loc if(H.get_equipped_item(slot_wear_suit_str) == src) to_chat(user, SPAN_WARNING("You cannot repair \the [src] while it is being worn.")) return @@ -239,7 +239,7 @@ if(!target_breach) to_chat(user, "There are no open breaches to seal with \the [W].") else - var/mob/living/carbon/human/H = user + var/mob/living/human/H = user if(!istype(H)) return diff --git a/code/modules/clothing/spacesuits/rig/modules/combat.dm b/code/modules/clothing/spacesuits/rig/modules/combat.dm index 8b3d7f894a0..e359be5afd3 100644 --- a/code/modules/clothing/spacesuits/rig/modules/combat.dm +++ b/code/modules/clothing/spacesuits/rig/modules/combat.dm @@ -139,7 +139,7 @@ if(!target) return 0 - var/mob/living/carbon/human/H = holder.wearer + var/mob/living/human/H = holder.wearer if(!charge_selected) to_chat(H, "You have not selected a grenade type.") diff --git a/code/modules/clothing/spacesuits/rig/modules/computer.dm b/code/modules/clothing/spacesuits/rig/modules/computer.dm index d92a4c0e239..c263a126afd 100644 --- a/code/modules/clothing/spacesuits/rig/modules/computer.dm +++ b/code/modules/clothing/spacesuits/rig/modules/computer.dm @@ -154,7 +154,7 @@ if(!..()) return 0 - var/mob/living/carbon/human/H = holder.wearer + var/mob/living/human/H = holder.wearer if(!target) if(ai_card) @@ -260,7 +260,7 @@ return 0 if(target) - var/mob/living/carbon/human/H = holder.wearer + var/mob/living/human/H = holder.wearer if(!accepts_item(target,H)) return 0 return 1 @@ -381,7 +381,7 @@ return 1 // Are we close enough? - var/mob/living/carbon/human/H = holder.wearer + var/mob/living/human/H = holder.wearer if(!target.Adjacent(H)) return 0 @@ -410,7 +410,7 @@ if(!interfaced_with) return ..() - var/mob/living/carbon/human/H + var/mob/living/human/H if(holder && holder.wearer) H = holder.wearer diff --git a/code/modules/clothing/spacesuits/rig/modules/infiltration.dm b/code/modules/clothing/spacesuits/rig/modules/infiltration.dm index 081cefd3041..916c58a3450 100644 --- a/code/modules/clothing/spacesuits/rig/modules/infiltration.dm +++ b/code/modules/clothing/spacesuits/rig/modules/infiltration.dm @@ -44,7 +44,7 @@ if(!..()) return 0 - var/mob/living/carbon/human/H = holder.wearer + var/mob/living/human/H = holder.wearer if(H.add_cloaking_source(src)) anim(H, 'icons/effects/effects.dmi', "electricity",null,20,null) @@ -54,7 +54,7 @@ if(!..()) return 0 - var/mob/living/carbon/human/H = holder.wearer + var/mob/living/human/H = holder.wearer if(H.remove_cloaking_source(src)) anim(H,'icons/mob/mob.dmi',,"uncloak",,H.dir) @@ -92,7 +92,7 @@ /obj/item/rig_module/teleporter/engage(var/atom/target, var/notify_ai) - var/mob/living/carbon/human/H = holder.wearer + var/mob/living/human/H = holder.wearer if(!isturf(H.loc)) to_chat(H, "You cannot teleport out of your current location.") diff --git a/code/modules/clothing/spacesuits/rig/modules/modules.dm b/code/modules/clothing/spacesuits/rig/modules/modules.dm index 68ddca5e87d..9d5a0897ddd 100644 --- a/code/modules/clothing/spacesuits/rig/modules/modules.dm +++ b/code/modules/clothing/spacesuits/rig/modules/modules.dm @@ -263,7 +263,7 @@ /obj/item/rig_module/proc/accepts_item(var/obj/item/input_device) return 0 -/mob/living/carbon/human/Stat() +/mob/living/human/Stat() . = ..() var/obj/item/rig/R = get_equipped_item(slot_back_str) diff --git a/code/modules/clothing/spacesuits/rig/modules/utility.dm b/code/modules/clothing/spacesuits/rig/modules/utility.dm index 1d7977d584b..19d799aa217 100644 --- a/code/modules/clothing/spacesuits/rig/modules/utility.dm +++ b/code/modules/clothing/spacesuits/rig/modules/utility.dm @@ -221,7 +221,7 @@ if(!..()) return 0 - var/mob/living/carbon/human/H = holder.wearer + var/mob/living/human/H = holder.wearer if(!charge_selected) to_chat(H, SPAN_WARNING("You have not selected a chemical type.")) @@ -537,7 +537,7 @@ if(!active) return passive_power_cost - var/mob/living/carbon/human/H = holder.wearer + var/mob/living/human/H = holder.wearer var/temp_adj = min(H.bodytemperature - thermostat, max_cooling) //Actually copies the original CU code diff --git a/code/modules/clothing/spacesuits/rig/rig.dm b/code/modules/clothing/spacesuits/rig/rig.dm index 310289755ad..fd953ea5c91 100644 --- a/code/modules/clothing/spacesuits/rig/rig.dm +++ b/code/modules/clothing/spacesuits/rig/rig.dm @@ -66,7 +66,7 @@ var/obj/item/rig_module/selected_module // Primary system (used with middle-click) var/obj/item/rig_module/vision/visor // Kinda shitty to have a var for a module, but saves time. var/obj/item/rig_module/voice/speech // As above. - var/mob/living/carbon/human/wearer // The person currently wearing the rig. + var/mob/living/human/wearer // The person currently wearing the rig. var/list/installed_modules = list() // Power consumption/use bookkeeping. // Rig status vars. @@ -452,7 +452,7 @@ var/fail_msg if(!user_is_ai) - var/mob/living/carbon/human/H = user + var/mob/living/human/H = user if(istype(H) && H.get_equipped_item(slot_back_str) != src) fail_msg = "You must be wearing \the [src] to do this." if(sealing) @@ -597,7 +597,7 @@ return list() return ..() -/obj/item/rig/proc/check_suit_access(var/mob/living/carbon/human/user) +/obj/item/rig/proc/check_suit_access(var/mob/living/human/user) if(!security_check_enabled) return 1 @@ -668,7 +668,7 @@ to_chat(module.integrated_ai, "[message]") . = 1 -/obj/item/rig/equipped(mob/living/carbon/human/M) +/obj/item/rig/equipped(mob/living/human/M) ..() if(seal_delay > 0 && istype(M) && M.get_equipped_item(slot_back_str) == src) @@ -727,7 +727,7 @@ if(use_obj) if(check_slot == use_obj && deploy_mode != ONLY_DEPLOY) - var/mob/living/carbon/human/holder + var/mob/living/human/holder if(use_obj) holder = use_obj.loc @@ -756,7 +756,7 @@ /obj/item/rig/proc/deploy(mob/M,var/sealed) - var/mob/living/carbon/human/H = M + var/mob/living/human/H = M if(!H || !istype(H)) return @@ -864,7 +864,7 @@ to_chat(wearer, "The [source] has damaged your [dam_module.interface_name]!") dam_module.deactivate() -/obj/item/rig/proc/malfunction_check(var/mob/living/carbon/human/user) +/obj/item/rig/proc/malfunction_check(var/mob/living/human/user) if(malfunction_delay) if(offline) to_chat(user, "The suit is completely unresponsive.") diff --git a/code/modules/clothing/spacesuits/rig/rig_attackby.dm b/code/modules/clothing/spacesuits/rig/rig_attackby.dm index 9b4848c9726..79954b69547 100644 --- a/code/modules/clothing/spacesuits/rig/rig_attackby.dm +++ b/code/modules/clothing/spacesuits/rig/rig_attackby.dm @@ -72,7 +72,7 @@ else if(istype(W,/obj/item/rig_module)) if(ishuman(src.loc)) - var/mob/living/carbon/human/H = src.loc + var/mob/living/human/H = src.loc if(H.get_equipped_item(slot_back_str) == src) to_chat(user, "You can't install a hardsuit module while the suit is being worn.") return 1 @@ -130,7 +130,7 @@ return if(ishuman(src.loc) && to_remove != "cell" && to_remove != "tank") - var/mob/living/carbon/human/H = src.loc + var/mob/living/human/H = src.loc if(H.get_equipped_item(slot_back_str) == src) to_chat(user, "You can't remove an installed device while the hardsuit is being worn.") return diff --git a/code/modules/clothing/spacesuits/rig/rig_pieces.dm b/code/modules/clothing/spacesuits/rig/rig_pieces.dm index 3f325318548..a5a4899da01 100644 --- a/code/modules/clothing/spacesuits/rig/rig_pieces.dm +++ b/code/modules/clothing/spacesuits/rig/rig_pieces.dm @@ -4,7 +4,7 @@ /mob/proc/check_rig_status(check_offline) return 0 -/mob/living/carbon/human/check_rig_status(check_offline) +/mob/living/human/check_rig_status(check_offline) var/obj/item/rig/rig = get_rig() if(!rig || rig.canremove) return 0 //not wearing a rig control unit or it's offline or unsealed @@ -109,12 +109,12 @@ ..() // Some space suits are equipped with reactive membranes that support broken limbs -/obj/item/clothing/suit/space/rig/proc/can_support(var/mob/living/carbon/human/user) +/obj/item/clothing/suit/space/rig/proc/can_support(var/mob/living/human/user) if(user.get_equipped_item(slot_wear_suit_str) != src) return 0 //not wearing the suit return user.check_rig_status(1) -/obj/item/clothing/suit/space/rig/check_limb_support(var/mob/living/carbon/human/user) +/obj/item/clothing/suit/space/rig/check_limb_support(var/mob/living/human/user) // If this isn't set, then we don't need to care. if(!istype(user) || isnull(supporting_limbs)) @@ -132,7 +132,7 @@ to_chat(user, "\The [src] stops supporting your [E.name].") supporting_limbs.Cut() -/obj/item/clothing/suit/space/rig/proc/handle_fracture(var/mob/living/carbon/human/user, var/obj/item/organ/external/E) +/obj/item/clothing/suit/space/rig/proc/handle_fracture(var/mob/living/human/user, var/obj/item/organ/external/E) if(!istype(user) || isnull(supporting_limbs) || !can_support(user)) return if((E.body_part & body_parts_covered) && E.is_broken() && E.apply_splint(src)) @@ -145,7 +145,7 @@ if(!A || !proximity) return 0 - var/mob/living/carbon/human/H = loc + var/mob/living/human/H = loc if(!istype(H)) return 0 diff --git a/code/modules/clothing/spacesuits/void/void.dm b/code/modules/clothing/spacesuits/void/void.dm index 7cf840cf80c..4658e3ec3b3 100644 --- a/code/modules/clothing/spacesuits/void/void.dm +++ b/code/modules/clothing/spacesuits/void/void.dm @@ -101,7 +101,7 @@ else if(##equipment_var) {\ /obj/item/clothing/suit/space/void/equipped(mob/M) ..() - var/mob/living/carbon/human/H = M + var/mob/living/human/H = M if(!istype(H)) return @@ -132,7 +132,7 @@ else if(##equipment_var) {\ /obj/item/clothing/suit/space/void/dropped() ..() - var/mob/living/carbon/human/H + var/mob/living/human/H if(helmet) helmet.canremove = 1 @@ -164,7 +164,7 @@ else if(##equipment_var) {\ to_chat(usr, "There is no helmet installed.") return - var/mob/living/carbon/human/H = usr + var/mob/living/human/H = usr if(!istype(H)) return if(H.incapacitated()) return @@ -199,7 +199,7 @@ else if(##equipment_var) {\ to_chat(usr, "There is no tank inserted.") return - var/mob/living/carbon/human/H = usr + var/mob/living/human/H = usr if(!istype(H)) return if(H.incapacitated()) return diff --git a/code/modules/clothing/underwear/base.dm b/code/modules/clothing/underwear/base.dm index a4878aaebf7..4fd8c96abc3 100644 --- a/code/modules/clothing/underwear/base.dm +++ b/code/modules/clothing/underwear/base.dm @@ -15,7 +15,7 @@ DelayedEquipUnderwear(user, over) return TRUE -/obj/item/underwear/proc/CanEquipUnderwear(var/mob/user, var/mob/living/carbon/human/H) +/obj/item/underwear/proc/CanEquipUnderwear(var/mob/user, var/mob/living/human/H) if(!CanAdjustUnderwear(user, H, "put on")) return FALSE if(!(H.species && (H.get_bodytype()?.appearance_flags & HAS_UNDERWEAR))) @@ -26,7 +26,7 @@ return FALSE return TRUE -/obj/item/underwear/proc/CanRemoveUnderwear(var/mob/user, var/mob/living/carbon/human/H) +/obj/item/underwear/proc/CanRemoveUnderwear(var/mob/user, var/mob/living/human/H) if(!CanAdjustUnderwear(user, H, "remove")) return FALSE if(!(src in H.worn_underwear)) @@ -34,7 +34,7 @@ return FALSE return TRUE -/obj/item/underwear/proc/CanAdjustUnderwear(var/mob/user, var/mob/living/carbon/human/H, var/adjustment_verb) +/obj/item/underwear/proc/CanAdjustUnderwear(var/mob/user, var/mob/living/human/H, var/adjustment_verb) if(!istype(H)) return FALSE if(user != H && !CanPhysicallyInteractWith(user, H)) @@ -50,7 +50,7 @@ return TRUE -/obj/item/underwear/proc/DelayedRemoveUnderwear(var/mob/user, var/mob/living/carbon/human/H) +/obj/item/underwear/proc/DelayedRemoveUnderwear(var/mob/user, var/mob/living/human/H) if(!CanRemoveUnderwear(user, H)) return if(user != H) @@ -62,7 +62,7 @@ user.visible_message("\The [user] has removed \the [src] from \the [H].", "You have removed \the [src] from \the [H].") admin_attack_log(user, H, "Removed \a [src]", "Had \a [src] removed.", "removed \a [src] from") -/obj/item/underwear/proc/DelayedEquipUnderwear(var/mob/user, var/mob/living/carbon/human/H) +/obj/item/underwear/proc/DelayedEquipUnderwear(var/mob/user, var/mob/living/human/H) if(!CanEquipUnderwear(user, H)) return if(user != H) @@ -74,14 +74,14 @@ user.visible_message("\The [user] has put \the [src] on \the [H].", "You have put \the [src] on \the [H].") admin_attack_log(user, H, "Put on \a [src]", "Had \a [src] put on.", "put on \a [src] on") -/obj/item/underwear/proc/EquipUnderwear(var/mob/user, var/mob/living/carbon/human/H) +/obj/item/underwear/proc/EquipUnderwear(var/mob/user, var/mob/living/human/H) if(!CanEquipUnderwear(user, H)) return FALSE if(!user.try_unequip(src)) return FALSE return ForceEquipUnderwear(H) -/obj/item/underwear/proc/ForceEquipUnderwear(var/mob/living/carbon/human/H, var/update_icons = TRUE) +/obj/item/underwear/proc/ForceEquipUnderwear(var/mob/living/human/H, var/update_icons = TRUE) // No matter how forceful, we still don't allow multiples of the same underwear type if(is_path_in_list(type, H.worn_underwear)) return FALSE @@ -93,7 +93,7 @@ return TRUE -/obj/item/underwear/proc/RemoveUnderwear(var/mob/user, var/mob/living/carbon/human/H) +/obj/item/underwear/proc/RemoveUnderwear(var/mob/user, var/mob/living/human/H) if(!CanRemoveUnderwear(user, H)) return FALSE diff --git a/code/modules/codex/codex_mob.dm b/code/modules/codex/codex_mob.dm index b7b685f1212..81abaeb2572 100644 --- a/code/modules/codex/codex_mob.dm +++ b/code/modules/codex/codex_mob.dm @@ -10,8 +10,8 @@ /mob/observer/can_use_codex() return TRUE -/mob/living/carbon/human/can_use_codex() +/mob/living/human/can_use_codex() return TRUE //has_implant(/obj/item/implant/codex, functioning = TRUE) -/mob/living/carbon/human/get_codex_value() +/mob/living/human/get_codex_value() return "[lowertext(species.name)] (species)" \ No newline at end of file diff --git a/code/modules/detectivework/evidence/fibers.dm b/code/modules/detectivework/evidence/fibers.dm index e3a04c03e48..ecda7fdeece 100644 --- a/code/modules/detectivework/evidence/fibers.dm +++ b/code/modules/detectivework/evidence/fibers.dm @@ -9,7 +9,7 @@ if(istype(AM, /obj/item/clothing/)) LAZYADD(sources, AM) else if(ishuman(AM)) - var/mob/living/carbon/human/M = AM + var/mob/living/human/M = AM var/covered = 0 for(var/slot in list(slot_wear_suit_str, slot_gloves_str, slot_w_uniform_str)) var/obj/item/clothing/C = M.get_equipped_item(slot) diff --git a/code/modules/detectivework/evidence/fingerprints.dm b/code/modules/detectivework/evidence/fingerprints.dm index b2883be9f4c..290bccd19c4 100644 --- a/code/modules/detectivework/evidence/fingerprints.dm +++ b/code/modules/detectivework/evidence/fingerprints.dm @@ -101,7 +101,7 @@ return E.get_fingerprint() return fingerprint -/mob/living/carbon/human/get_full_print(var/ignore_blockers = FALSE) +/mob/living/human/get_full_print(var/ignore_blockers = FALSE) if (!ignore_blockers && has_genetic_condition(GENE_COND_NO_FINGERPRINTS)) return null return ..() diff --git a/code/modules/detectivework/evidence/trace_dna.dm b/code/modules/detectivework/evidence/trace_dna.dm index 9b767980e2e..26fc4634e58 100644 --- a/code/modules/detectivework/evidence/trace_dna.dm +++ b/code/modules/detectivework/evidence/trace_dna.dm @@ -2,7 +2,7 @@ name = "trace DNA" spot_skill = null -/datum/forensics/trace_dna/add_from_atom(mob/living/carbon/human/M) +/datum/forensics/trace_dna/add_from_atom(mob/living/human/M) if(!istype(M)) return if(M.isSynthetic()) diff --git a/code/modules/detectivework/forensics.dm b/code/modules/detectivework/forensics.dm index 423cb550dfb..eb2d5eb8f53 100644 --- a/code/modules/detectivework/forensics.dm +++ b/code/modules/detectivework/forensics.dm @@ -11,7 +11,7 @@ if(!fingerprintshidden) fingerprintshidden = list() if (ishuman(M)) - var/mob/living/carbon/human/H = M + var/mob/living/human/H = M if (H.get_equipped_item(slot_gloves_str)) src.fingerprintshidden += "\[[time_stamp()]\] (Wearing gloves). Real name: [H.real_name], Key: [H.key]" return 0 diff --git a/code/modules/detectivework/tools/sample_kits/fingerprinting.dm b/code/modules/detectivework/tools/sample_kits/fingerprinting.dm index 8523db974a8..5331c224eaf 100644 --- a/code/modules/detectivework/tools/sample_kits/fingerprinting.dm +++ b/code/modules/detectivework/tools/sample_kits/fingerprinting.dm @@ -54,7 +54,7 @@ SetName("[initial(name)] (\the [M])") update_icon() -/obj/item/forensics/sample/print/proc/can_take_print_from(mob/living/carbon/human/H, user) +/obj/item/forensics/sample/print/proc/can_take_print_from(mob/living/human/H, user) if(LAZYLEN(evidence)) return @@ -76,7 +76,7 @@ if(!ishuman(target)) return ..() - var/mob/living/carbon/human/H = target + var/mob/living/human/H = target if(!can_take_print_from(H, user)) return 1 diff --git a/code/modules/detectivework/tools/sample_kits/swabs.dm b/code/modules/detectivework/tools/sample_kits/swabs.dm index a5ddf53b08e..be2cc6d32b0 100644 --- a/code/modules/detectivework/tools/sample_kits/swabs.dm +++ b/code/modules/detectivework/tools/sample_kits/swabs.dm @@ -21,7 +21,7 @@ if(!ishuman(target)) return ..() - var/mob/living/carbon/human/H = target + var/mob/living/human/H = target var/time_to_take = H.a_intent == I_HELP ? 1 SECOND : 3 SECONDS user.visible_message(SPAN_NOTICE("\The [user] starts swabbing a sample from \the [H].")) if(!do_mob(user, H, time_to_take)) diff --git a/code/modules/economy/cael/ATM.dm b/code/modules/economy/cael/ATM.dm index 8a4abcd5bd1..deac2241163 100644 --- a/code/modules/economy/cael/ATM.dm +++ b/code/modules/economy/cael/ATM.dm @@ -441,14 +441,14 @@ interact(usr) -/obj/machinery/atm/proc/scan_user(mob/living/carbon/human/human_user) +/obj/machinery/atm/proc/scan_user(mob/living/human/human_user) if(!authenticated_account) var/obj/item/card/id/I = human_user.GetIdCard() if(istype(I)) return I // put the currently held id on the ground or in the hand of the user -/obj/machinery/atm/proc/release_held_id(mob/living/carbon/human/human_user) +/obj/machinery/atm/proc/release_held_id(mob/living/human/human_user) if(!held_card) return diff --git a/code/modules/emotes/definitions/audible_snap.dm b/code/modules/emotes/definitions/audible_snap.dm index 8b08fdd78d5..428f93d1879 100644 --- a/code/modules/emotes/definitions/audible_snap.dm +++ b/code/modules/emotes/definitions/audible_snap.dm @@ -8,7 +8,7 @@ /decl/emote/audible/snap/proc/can_snap(var/atom/user) if(ishuman(user)) - var/mob/living/carbon/human/H = user + var/mob/living/human/H = user for(var/limb in list(BP_L_HAND, BP_R_HAND)) var/obj/item/organ/external/L = H.get_organ(limb) if(istype(L) && L.is_usable() && !L.splinted) diff --git a/code/modules/emotes/definitions/tail.dm b/code/modules/emotes/definitions/tail.dm index e4a5c1edc3e..720922104c5 100644 --- a/code/modules/emotes/definitions/tail.dm +++ b/code/modules/emotes/definitions/tail.dm @@ -9,7 +9,7 @@ key = "swish" /decl/emote/visible/tail/swish/do_emote(mob/living/user) - var/mob/living/carbon/human/human_user = user + var/mob/living/human/human_user = user if(istype(human_user)) human_user.animate_tail_once() return TRUE @@ -18,7 +18,7 @@ key = "wag" /decl/emote/visible/tail/wag/do_emote(mob/living/user) - var/mob/living/carbon/human/human_user = user + var/mob/living/human/human_user = user if(istype(human_user)) human_user.animate_tail_start() return TRUE @@ -27,7 +27,7 @@ key = "sway" /decl/emote/visible/tail/sway/do_emote(mob/living/user) - var/mob/living/carbon/human/human_user = user + var/mob/living/human/human_user = user if(istype(human_user)) human_user.animate_tail_start() return TRUE @@ -36,7 +36,7 @@ key = "qwag" /decl/emote/visible/tail/qwag/do_emote(mob/living/user) - var/mob/living/carbon/human/human_user = user + var/mob/living/human/human_user = user if(istype(human_user)) human_user.animate_tail_fast() return TRUE @@ -45,7 +45,7 @@ key = "fastsway" /decl/emote/visible/tail/fastsway/do_emote(mob/living/user) - var/mob/living/carbon/human/human_user = user + var/mob/living/human/human_user = user if(istype(human_user)) human_user.animate_tail_fast() return TRUE @@ -54,7 +54,7 @@ key = "swag" /decl/emote/visible/tail/swag/do_emote(mob/living/user) - var/mob/living/carbon/human/human_user = user + var/mob/living/human/human_user = user if(istype(human_user)) human_user.animate_tail_stop() return TRUE @@ -63,7 +63,7 @@ key = "stopsway" /decl/emote/visible/tail/stopsway/do_emote(mob/living/user) - var/mob/living/carbon/human/human_user = user + var/mob/living/human/human_user = user if(istype(human_user)) human_user.animate_tail_stop() return TRUE diff --git a/code/modules/emotes/definitions/visible.dm b/code/modules/emotes/definitions/visible.dm index c4c2f76ae2c..414327646f5 100644 --- a/code/modules/emotes/definitions/visible.dm +++ b/code/modules/emotes/definitions/visible.dm @@ -362,7 +362,7 @@ . = ..() && user.check_has_mouth() && !user.isSynthetic() /decl/emote/visible/vomit/do_emote(var/atom/user, var/extra_params) - var/mob/living/carbon/human/H = user + var/mob/living/human/H = user if(istype(H)) H.vomit(deliberate = TRUE) return TRUE diff --git a/code/modules/events/ailments.dm b/code/modules/events/ailments.dm index 4b862a9be19..a1d6fc894e8 100644 --- a/code/modules/events/ailments.dm +++ b/code/modules/events/ailments.dm @@ -1,6 +1,6 @@ /datum/event/ailments/start() var/list/candidates = list() - for(var/mob/living/carbon/human/H in global.living_mob_list_) + for(var/mob/living/human/H in global.living_mob_list_) if(H.client && !length(H.stasis_sources)) candidates += H if(!length(candidates)) @@ -8,7 +8,7 @@ candidates = shuffle(candidates) var/create_ailments = min(length(candidates), rand(1,3)) for(var/i = 1 to length(candidates)) - var/mob/living/carbon/human/H = candidates[i] + var/mob/living/human/H = candidates[i] var/list/organs = shuffle(H.get_organs()) for(var/ii = 1 to length(organs)) var/obj/item/organ/O = organs[ii] diff --git a/code/modules/events/electrical_storm.dm b/code/modules/events/electrical_storm.dm index 33914e601f4..ebeef2b276a 100644 --- a/code/modules/events/electrical_storm.dm +++ b/code/modules/events/electrical_storm.dm @@ -120,7 +120,7 @@ if(prob((0.2 * severity) - 0.2)) T.set_broken() - for(var/mob/living/carbon/human/H in T.area) + for(var/mob/living/human/H in T.area) to_chat(H, SPAN_WARNING("You feel the hairs on the back of your neck standing up!")) if(prob(25)) if(H.eyecheck() == FLASH_PROTECTION_NONE) @@ -158,7 +158,7 @@ S.adjust_speed(ax, ay) last_bounce = world.time + (bounce_delay / severity) - for(var/mob/living/carbon/human/H in global.living_mob_list_) //Affect mobs, skip synthetics. + for(var/mob/living/human/H in global.living_mob_list_) //Affect mobs, skip synthetics. if(!(H.z in affecting_z) || isnull(H) || QDELETED(H)) continue to_chat(H, SPAN_WARNING("You're shaken about as the storm disrupts the ship's course!")) diff --git a/code/modules/events/ion_storm.dm b/code/modules/events/ion_storm.dm index 2d9a036fd19..9916487bd32 100644 --- a/code/modules/events/ion_storm.dm +++ b/code/modules/events/ion_storm.dm @@ -134,7 +134,7 @@ /datum/event/ionstorm/proc/get_random_humanoid_player_name(var/default_if_none) - for (var/mob/living/carbon/human/player in global.player_list) + for (var/mob/living/human/player in global.player_list) if(!player.mind || player_is_antag(player.mind, only_offstation_roles = 1) || !player.is_client_active(5)) continue players += player.real_name diff --git a/code/modules/events/spontaneous_appendicitis.dm b/code/modules/events/spontaneous_appendicitis.dm index 472ea942f53..580d8c0a21a 100644 --- a/code/modules/events/spontaneous_appendicitis.dm +++ b/code/modules/events/spontaneous_appendicitis.dm @@ -1,5 +1,5 @@ /datum/event/spontaneous_appendicitis/start() - for(var/mob/living/carbon/human/H in shuffle(global.living_mob_list_)) + for(var/mob/living/human/H in shuffle(global.living_mob_list_)) if(H.client && H.stat != DEAD) var/obj/item/organ/internal/appendix/A = H.get_organ(BP_APPENDIX, /obj/item/organ/internal/appendix) if(!istype(A) || (A && A.inflamed)) diff --git a/code/modules/fabrication/fabricator_bioprinter.dm b/code/modules/fabrication/fabricator_bioprinter.dm index 7e748683da1..f885dad3c4a 100644 --- a/code/modules/fabrication/fabricator_bioprinter.dm +++ b/code/modules/fabrication/fabricator_bioprinter.dm @@ -42,7 +42,7 @@ var/sample = REAGENT_DATA(S.reagents, /decl/material/liquid/blood) if(islist(sample)) var/weakref/R = sample["donor"] - var/mob/living/carbon/human/H = R.resolve() + var/mob/living/human/H = R.resolve() if(H && istype(H) && H.species) loaded_dna = H.get_mob_snapshot() if(loaded_dna) diff --git a/code/modules/games/boardgame.dm b/code/modules/games/boardgame.dm index 6a4b7b387d5..40e238f16b5 100644 --- a/code/modules/games/boardgame.dm +++ b/code/modules/games/boardgame.dm @@ -132,7 +132,7 @@ if(I) selected = text2num(s) else - var/mob/living/carbon/human/H = locate(href_list["person"]) + var/mob/living/human/H = locate(href_list["person"]) if(!istype(H)) return var/obj/item/O = H.get_active_held_item() diff --git a/code/modules/games/cards.dm b/code/modules/games/cards.dm index ef99cd2250e..530125d0dec 100644 --- a/code/modules/games/cards.dm +++ b/code/modules/games/cards.dm @@ -170,7 +170,7 @@ var/global/list/card_decks = list() if(!ishuman(usr) || usr.incapacitated() || !Adjacent(usr)) return - var/mob/living/carbon/human/user = usr + var/mob/living/human/user = usr if(!cards.len) to_chat(usr, "There are no cards in the deck.") return diff --git a/code/modules/goals/goal_mind.dm b/code/modules/goals/goal_mind.dm index be8d7c7915d..2a34d31f176 100644 --- a/code/modules/goals/goal_mind.dm +++ b/code/modules/goals/goal_mind.dm @@ -31,7 +31,7 @@ if(job && LAZYLEN(job.possible_goals)) available_goals |= job.possible_goals if(ishuman(current)) - var/mob/living/carbon/human/H = current + var/mob/living/human/H = current for(var/token in H.cultural_info) var/decl/cultural_info/culture = H.get_cultural_value(token) var/list/new_goals = culture.get_possible_personal_goals(job ? job.department_types : null) diff --git a/code/modules/hallucinations/hallucination_telepathy.dm b/code/modules/hallucinations/hallucination_telepathy.dm index 67c5be921e7..a4a409f52e9 100644 --- a/code/modules/hallucinations/hallucination_telepathy.dm +++ b/code/modules/hallucinations/hallucination_telepathy.dm @@ -6,19 +6,19 @@ /datum/hallucination/telepathy/start() . = ..() to_chat(holder, SPAN_NOTICE("You expand your mind outwards.")) - holder.verbs += /mob/living/carbon/human/proc/fakeremotesay + holder.verbs += /mob/living/human/proc/fakeremotesay /datum/hallucination/telepathy/end() . = ..() if(holder) - holder.verbs -= /mob/living/carbon/human/proc/fakeremotesay + holder.verbs -= /mob/living/human/proc/fakeremotesay -/mob/living/carbon/human/proc/fakeremotesay() +/mob/living/human/proc/fakeremotesay() set name = "Telepathic Message" set category = "Superpower" if(!hallucination_power) - src.verbs -= /mob/living/carbon/human/proc/fakeremotesay + src.verbs -= /mob/living/human/proc/fakeremotesay return if(stat) diff --git a/code/modules/hydroponics/grown.dm b/code/modules/hydroponics/grown.dm index 7a2c09d690c..36e96954952 100644 --- a/code/modules/hydroponics/grown.dm +++ b/code/modules/hydroponics/grown.dm @@ -330,7 +330,7 @@ var/global/list/_wood_materials = list( if(!seed) return if(seed.get_trait(TRAIT_STINGS)) - var/mob/living/carbon/human/H = user + var/mob/living/human/H = user if(istype(H) && H.get_equipped_item(slot_gloves_str)) return if(!reagents || reagents.total_volume <= 0) diff --git a/code/modules/hydroponics/seed.dm b/code/modules/hydroponics/seed.dm index 54af40396c3..c114d6ca4d9 100644 --- a/code/modules/hydroponics/seed.dm +++ b/code/modules/hydroponics/seed.dm @@ -107,7 +107,7 @@ qdel(R) // Does brute damage to a target. -/datum/seed/proc/do_thorns(var/mob/living/carbon/human/target, var/obj/item/fruit, var/target_limb) +/datum/seed/proc/do_thorns(var/mob/living/human/target, var/obj/item/fruit, var/target_limb) if(!get_trait(TRAIT_CARNIVOROUS)) return @@ -147,7 +147,7 @@ target.apply_damage(damage, BRUTE, target_limb, damage_flags, used_weapon = "Thorns") // Adds reagents to a target. -/datum/seed/proc/do_sting(var/mob/living/carbon/human/target, var/obj/item/fruit) +/datum/seed/proc/do_sting(var/mob/living/human/target, var/obj/item/fruit) if(!get_trait(TRAIT_STINGS)) return diff --git a/code/modules/hydroponics/spreading/spreading_response.dm b/code/modules/hydroponics/spreading/spreading_response.dm index e7ef9f180df..5848a943ac7 100644 --- a/code/modules/hydroponics/spreading/spreading_response.dm +++ b/code/modules/hydroponics/spreading/spreading_response.dm @@ -31,7 +31,7 @@ return if(prob((seed.get_trait(TRAIT_POTENCY) / 2) * 3)) entangle(victim) - var/mob/living/carbon/human/H = victim + var/mob/living/human/H = victim if(istype(H) && H.get_equipped_item(slot_shoes_str)) return seed.do_thorns(victim,src) @@ -74,7 +74,7 @@ return if(ishuman(victim)) - var/mob/living/carbon/human/H = victim + var/mob/living/human/H = victim if(H.species.species_flags & SPECIES_FLAG_NO_TANGLE) return diff --git a/code/modules/integrated_electronics/subtypes/filter.dm b/code/modules/integrated_electronics/subtypes/filter.dm index f1626432967..781bb23ca3d 100644 --- a/code/modules/integrated_electronics/subtypes/filter.dm +++ b/code/modules/integrated_electronics/subtypes/filter.dm @@ -47,7 +47,7 @@ name = "humanoid filter" desc = "Only allow refs belonging to humanoids (dead or alive) through" icon_state = "filter_humanoid" - filter_type = /mob/living/carbon/human + filter_type = /mob/living/human /obj/item/integrated_circuit/filter/ref/obj name = "object filter" diff --git a/code/modules/integrated_electronics/subtypes/input.dm b/code/modules/integrated_electronics/subtypes/input.dm index 141860d1da4..aeff7927052 100644 --- a/code/modules/integrated_electronics/subtypes/input.dm +++ b/code/modules/integrated_electronics/subtypes/input.dm @@ -140,7 +140,7 @@ power_draw_per_use = 40 /obj/item/integrated_circuit/input/med_scanner/do_work() - var/mob/living/carbon/human/H = get_pin_data_as_type(IC_INPUT, 1, /mob/living) + var/mob/living/human/H = get_pin_data_as_type(IC_INPUT, 1, /mob/living) if(!istype(H)) //Invalid input return if(H.Adjacent(get_turf(src))) // Like normal analysers, it can't be used at range. @@ -192,7 +192,7 @@ /obj/item/integrated_circuit/input/adv_med_scanner/do_work() - var/mob/living/carbon/human/H = get_pin_data_as_type(IC_INPUT, 1, /mob/living) + var/mob/living/human/H = get_pin_data_as_type(IC_INPUT, 1, /mob/living) if(!istype(H)) //Invalid input return if(H in view(get_turf(src))) // Like medbot's analyzer it can be used in range.. diff --git a/code/modules/integrated_electronics/subtypes/reagents.dm b/code/modules/integrated_electronics/subtypes/reagents.dm index 3f560a1c7c7..5ee4be4e792 100644 --- a/code/modules/integrated_electronics/subtypes/reagents.dm +++ b/code/modules/integrated_electronics/subtypes/reagents.dm @@ -214,7 +214,7 @@ var/tramount = abs(transfer_amount) if(ishuman(AM)) - var/mob/living/carbon/human/H = AM + var/mob/living/human/H = AM var/injection_status = H.can_inject(null, BP_CHEST) var/injection_delay = 3 SECONDS if(injection_status == INJECTION_PORT) diff --git a/code/modules/keybindings/human.dm b/code/modules/keybindings/human.dm index aaff20decab..c93ddcc13cf 100644 --- a/code/modules/keybindings/human.dm +++ b/code/modules/keybindings/human.dm @@ -11,7 +11,7 @@ description = "Quickly puts an item in the best slot available" /datum/keybinding/human/quick_equip/down(client/user) - var/mob/living/carbon/human/H = user.mob + var/mob/living/human/H = user.mob H.quick_equip() return TRUE @@ -22,7 +22,7 @@ description = "Draw or holster weapon" /datum/keybinding/human/holster/down(client/user) - var/mob/living/carbon/human/H = user.mob + var/mob/living/human/H = user.mob if(H.incapacitated()) return @@ -61,6 +61,6 @@ description = "Give the item you're currently holding" /datum/keybinding/human/give/down(client/user) - var/mob/living/carbon/human/H = user.mob + var/mob/living/human/H = user.mob H.give() return TRUE diff --git a/code/modules/materials/_materials.dm b/code/modules/materials/_materials.dm index 7e32fd8fa0b..ef21c24679d 100644 --- a/code/modules/materials/_materials.dm +++ b/code/modules/materials/_materials.dm @@ -770,7 +770,7 @@ INITIALIZE_IMMEDIATE(/obj/effect/gas_overlay) if(toxicity_targets_organ && ishuman(M)) var/organ_damage = dam * M.get_toxin_resistance() if(organ_damage > 0) - var/mob/living/carbon/human/H = M + var/mob/living/human/H = M var/obj/item/organ/internal/I = GET_INTERNAL_ORGAN(H, toxicity_targets_organ) if(I) var/can_damage = I.max_damage - I.damage @@ -845,7 +845,7 @@ INITIALIZE_IMMEDIATE(/obj/effect/gas_overlay) if(mask) mask.clean() if(ishuman(M)) - var/mob/living/carbon/human/H = M + var/mob/living/human/H = M var/obj/item/head = H.get_equipped_item(slot_head_str) if(head) head.clean() diff --git a/code/modules/materials/definitions/gasses/material_gas_mundane.dm b/code/modules/materials/definitions/gasses/material_gas_mundane.dm index 8fe49127ea0..e5bc8c5abfe 100644 --- a/code/modules/materials/definitions/gasses/material_gas_mundane.dm +++ b/code/modules/materials/definitions/gasses/material_gas_mundane.dm @@ -63,7 +63,7 @@ var/warning_message var/warning_prob = 10 var/dosage = LAZYACCESS(M.chem_doses, type) - var/mob/living/carbon/human/H = M + var/mob/living/human/H = M if(dosage >= 3) warning_message = pick("extremely dizzy","short of breath","faint","confused") warning_prob = 15 @@ -107,7 +107,7 @@ . = ..() if(!ishuman(M)) return - var/mob/living/carbon/human/H = M + var/mob/living/human/H = M for(var/obj/item/organ/external/E in H.get_external_organs()) for(var/obj/effect/spider/spider in E.implants) if(prob(25)) diff --git a/code/modules/materials/definitions/liquids/materials_liquid_toxins.dm b/code/modules/materials/definitions/liquids/materials_liquid_toxins.dm index 57a75acba9b..9b783888447 100644 --- a/code/modules/materials/definitions/liquids/materials_liquid_toxins.dm +++ b/code/modules/materials/definitions/liquids/materials_liquid_toxins.dm @@ -121,7 +121,7 @@ /decl/material/liquid/heartstopper/affect_overdose(mob/living/M, total_dose) ..() if(ishuman(M)) - var/mob/living/carbon/human/H = M + var/mob/living/human/H = M if(H.stat != UNCONSCIOUS) if(H.ticks_since_last_successful_breath >= 10) H.ticks_since_last_successful_breath = max(10, H.ticks_since_last_successful_breath-10) @@ -257,7 +257,7 @@ /decl/material/liquid/zombie/affect_blood(var/mob/living/M, var/removed, var/datum/reagents/holder) ..() if (ishuman(M)) - var/mob/living/carbon/human/H = M + var/mob/living/human/H = M var/true_dose = LAZYACCESS(H.chem_doses, type) + REAGENT_VOLUME(holder, type) if (true_dose >= amount_to_zombify) H.zombify() diff --git a/code/modules/materials/materials_ore.dm b/code/modules/materials/materials_ore.dm index 11a18c4ae33..b2eb776014b 100644 --- a/code/modules/materials/materials_ore.dm +++ b/code/modules/materials/materials_ore.dm @@ -110,7 +110,7 @@ /obj/item/stack/material/ore/throw_impact(atom/hit_atom) . = ..() if(icon_state == "dust") - var/mob/living/carbon/human/H = hit_atom + var/mob/living/human/H = hit_atom if(istype(H) && H.check_has_eyes() && prob(85)) to_chat(H, SPAN_DANGER("Some of \the [src] gets in your eyes!")) ADJ_STATUS(H, STAT_BLIND, 5) diff --git a/code/modules/mechs/equipment/combat.dm b/code/modules/mechs/equipment/combat.dm index 207f2f4dfac..c9792e5ef10 100644 --- a/code/modules/mechs/equipment/combat.dm +++ b/code/modules/mechs/equipment/combat.dm @@ -478,7 +478,7 @@ flash_time /= 2 if(ishuman(O)) - var/mob/living/carbon/human/H = O + var/mob/living/human/H = O flash_time = round(H.get_flash_mod() * flash_time) if(flash_time <= 0) return @@ -524,7 +524,7 @@ flash_time /= 2 if(ishuman(O)) - var/mob/living/carbon/human/H = O + var/mob/living/human/H = O flash_time = round(H.get_flash_mod() * flash_time) if(flash_time <= 0) return diff --git a/code/modules/mining/machinery/material_compressor.dm b/code/modules/mining/machinery/material_compressor.dm index 09f460de259..20d359bea1d 100644 --- a/code/modules/mining/machinery/material_compressor.dm +++ b/code/modules/mining/machinery/material_compressor.dm @@ -25,7 +25,7 @@ if(compressed >= MAX_COMPRESS_ORE_PER_TICK) break if(emagged) - for(var/mob/living/carbon/human/H in input_turf) + for(var/mob/living/human/H in input_turf) for(var/obj/item/organ/external/crushing in H.get_external_organs()) if(!crushing.simulated || crushing.anchored || !prob(5)) continue diff --git a/code/modules/mining/machinery/material_smelter.dm b/code/modules/mining/machinery/material_smelter.dm index 7223faa9c6a..7d2a9c4fe84 100644 --- a/code/modules/mining/machinery/material_smelter.dm +++ b/code/modules/mining/machinery/material_smelter.dm @@ -96,7 +96,7 @@ if(eaten >= MAX_INTAKE_ORE_PER_TICK) break if(emagged) - for(var/mob/living/carbon/human/H in input_turf) + for(var/mob/living/human/H in input_turf) for(var/obj/item/organ/external/eating in H.get_external_organs()) if(!eating.simulated || eating.anchored || !can_eat(eating) || !prob(5)) continue diff --git a/code/modules/mob/grab/grab_datum.dm b/code/modules/mob/grab/grab_datum.dm index 039cd8bc826..f2d493245c2 100644 --- a/code/modules/mob/grab/grab_datum.dm +++ b/code/modules/mob/grab/grab_datum.dm @@ -216,7 +216,7 @@ /decl/grab/proc/item_attack(var/obj/item/grab/G, var/obj/item) -/decl/grab/proc/resolve_item_attack(var/obj/item/grab/G, var/mob/living/carbon/human/user, var/obj/item/I, var/target_zone) +/decl/grab/proc/resolve_item_attack(var/obj/item/grab/G, var/mob/living/human/user, var/obj/item/I, var/target_zone) return 0 /decl/grab/proc/handle_resist(var/obj/item/grab/G) diff --git a/code/modules/mob/grab/grab_object.dm b/code/modules/mob/grab/grab_object.dm index 95bfb90518e..1a598a635c0 100644 --- a/code/modules/mob/grab/grab_object.dm +++ b/code/modules/mob/grab/grab_object.dm @@ -41,7 +41,7 @@ if(affecting_mob) affecting_mob.update_posture() if(ishuman(affecting_mob)) - var/mob/living/carbon/human/H = affecting_mob + var/mob/living/human/H = affecting_mob var/obj/item/uniform = H.get_equipped_item(slot_w_uniform_str) if(uniform) uniform.add_fingerprint(assailant) @@ -200,7 +200,7 @@ /obj/item/grab/proc/action_used() if(ishuman(assailant)) - var/mob/living/carbon/human/H = assailant + var/mob/living/human/H = assailant H.remove_cloaking_source(H.species) last_action = world.time leave_forensic_traces() @@ -213,7 +213,7 @@ /obj/item/grab/proc/leave_forensic_traces() if(ishuman(affecting)) - var/mob/living/carbon/human/affecting_mob = affecting + var/mob/living/human/affecting_mob = affecting var/obj/item/clothing/C = affecting_mob.get_covering_equipped_item_by_zone(target_zone) if(istype(C)) C.leave_evidence(assailant) diff --git a/code/modules/mob/grab/normal/grab_normal.dm b/code/modules/mob/grab/normal/grab_normal.dm index 410fb3a7546..638fdd04be0 100644 --- a/code/modules/mob/grab/normal/grab_normal.dm +++ b/code/modules/mob/grab/normal/grab_normal.dm @@ -118,8 +118,8 @@ return FALSE /decl/grab/normal/proc/attack_eye(var/obj/item/grab/G) - var/mob/living/carbon/human/target = G.get_affecting_mob() - var/mob/living/carbon/human/attacker = G.assailant + var/mob/living/human/target = G.get_affecting_mob() + var/mob/living/human/attacker = G.assailant if(!istype(target) || !istype(attacker)) return var/decl/natural_attack/attack = attacker.get_unarmed_attack(target, BP_EYES) @@ -140,8 +140,8 @@ return 1 /decl/grab/normal/proc/headbutt(var/obj/item/grab/G) - var/mob/living/carbon/human/target = G.get_affecting_mob() - var/mob/living/carbon/human/attacker = G.assailant + var/mob/living/human/target = G.get_affecting_mob() + var/mob/living/human/attacker = G.assailant if(!istype(target) || !istype(attacker)) return if(!attacker.skill_check(SKILL_COMBAT, SKILL_BASIC)) @@ -214,7 +214,7 @@ return FALSE return TRUE -/decl/grab/normal/resolve_item_attack(var/obj/item/grab/G, var/mob/living/carbon/human/user, var/obj/item/I) +/decl/grab/normal/resolve_item_attack(var/obj/item/grab/G, var/mob/living/human/user, var/obj/item/I) switch(G.target_zone) if(BP_HEAD) return attack_throat(G, I, user) diff --git a/code/modules/mob/grab/normal/norm_aggressive.dm b/code/modules/mob/grab/normal/norm_aggressive.dm index 37dc3da0ec4..e5130ef0f42 100644 --- a/code/modules/mob/grab/normal/norm_aggressive.dm +++ b/code/modules/mob/grab/normal/norm_aggressive.dm @@ -33,7 +33,7 @@ if(!(G.target_zone in list(BP_CHEST, BP_HEAD))) to_chat(G.assailant, SPAN_WARNING("You need to be grabbing their torso or head for this!")) return FALSE - var/mob/living/carbon/human/affecting_mob = G.get_affecting_mob() + var/mob/living/human/affecting_mob = G.get_affecting_mob() if(istype(affecting_mob)) var/obj/item/clothing/C = affecting_mob.get_equipped_item(slot_head_str) if(istype(C)) //hardsuit helmets etc diff --git a/code/modules/mob/hear_say.dm b/code/modules/mob/hear_say.dm index 80cb0fd1c36..9adf1633bd1 100644 --- a/code/modules/mob/hear_say.dm +++ b/code/modules/mob/hear_say.dm @@ -130,7 +130,7 @@ var/speaker_name = vname ? vname : speaker.name if(ishuman(speaker)) - var/mob/living/carbon/human/H = speaker + var/mob/living/human/H = speaker if(H.voice && !vname) speaker_name = H.voice @@ -141,18 +141,18 @@ if(isAI(src) && !hard_to_hear) var/jobname // the mob's "job" - var/mob/living/carbon/human/impersonating //The crew member being impersonated, if any. + var/mob/living/human/impersonating //The crew member being impersonated, if any. if (ishuman(speaker)) - var/mob/living/carbon/human/H = speaker + var/mob/living/human/H = speaker if(istype(H.get_equipped_item(slot_wear_mask_str), /obj/item/clothing/mask/chameleon/voice)) changed_voice = 1 var/list/impersonated = new() - var/mob/living/carbon/human/I = impersonated[speaker_name] + var/mob/living/human/I = impersonated[speaker_name] if(!I) - for(var/mob/living/carbon/human/M in SSmobs.mob_list) + for(var/mob/living/human/M in SSmobs.mob_list) if(M.real_name == speaker_name) I = M impersonated[speaker_name] = I @@ -213,7 +213,7 @@ else formatted = "[verb], \"[message]\"" if(has_genetic_condition(GENE_COND_DEAFENED) || GET_STATUS(src, STAT_DEAF)) - var/mob/living/carbon/human/H = src + var/mob/living/human/H = src if(istype(H) && H.has_headset_in_ears() && prob(20)) to_chat(src, SPAN_WARNING("You feel your headset vibrate but can hear nothing from it!")) else if(vsource) diff --git a/code/modules/mob/living/autohiss.dm b/code/modules/mob/living/autohiss.dm index ce8d905a915..9c66c132c1d 100644 --- a/code/modules/mob/living/autohiss.dm +++ b/code/modules/mob/living/autohiss.dm @@ -4,7 +4,7 @@ /mob/living/proc/handle_autohiss(message, decl/language/L) return message // no autohiss at this level -/mob/living/carbon/human/handle_autohiss(message, decl/language/L) +/mob/living/human/handle_autohiss(message, decl/language/L) if(!client || get_preference_value(/datum/client_preference/autohiss) == PREF_OFF) // no need to process if there's no client or they have autohiss off return message return species.handle_autohiss(message, L, get_preference_value(/datum/client_preference/autohiss)) diff --git a/code/modules/mob/living/bot/farmbot.dm b/code/modules/mob/living/bot/farmbot.dm index 9d8c81f1dd3..c09b7b9cdee 100644 --- a/code/modules/mob/living/bot/farmbot.dm +++ b/code/modules/mob/living/bot/farmbot.dm @@ -110,7 +110,7 @@ /mob/living/bot/farmbot/lookForTargets() if(emagged) - for(var/mob/living/carbon/human/H in view(7, src)) + for(var/mob/living/human/H in view(7, src)) target = H return else diff --git a/code/modules/mob/living/bot/medibot.dm b/code/modules/mob/living/bot/medibot.dm index 01020dc7f35..f24139744d8 100644 --- a/code/modules/mob/living/bot/medibot.dm +++ b/code/modules/mob/living/bot/medibot.dm @@ -78,7 +78,7 @@ /mob/living/bot/medbot/lookForTargets() if(is_tipped) // Don't look for targets if we're incapacitated! return - for(var/mob/living/carbon/human/H in view(7, src)) // Time to find a patient! + for(var/mob/living/human/H in view(7, src)) // Time to find a patient! if(confirmTarget(H)) target = H if(last_newpatient_speak + 300 < world.time && vocal) @@ -95,7 +95,7 @@ last_newpatient_speak = world.time break -/mob/living/bot/medbot/UnarmedAttack(var/mob/living/carbon/human/H, var/proximity) +/mob/living/bot/medbot/UnarmedAttack(var/mob/living/human/H, var/proximity) . = ..() if(.) return @@ -297,7 +297,7 @@ reagent_glass.forceMove(my_turf) reagent_glass = null -/mob/living/bot/medbot/confirmTarget(var/mob/living/carbon/human/H) +/mob/living/bot/medbot/confirmTarget(var/mob/living/human/H) if(!..()) return 0 diff --git a/code/modules/mob/living/bot/mulebot.dm b/code/modules/mob/living/bot/mulebot.dm index bb3c960f2fc..bd720f88e72 100644 --- a/code/modules/mob/living/bot/mulebot.dm +++ b/code/modules/mob/living/bot/mulebot.dm @@ -197,7 +197,7 @@ if(T == src.loc) unload(dir) -/mob/living/bot/mulebot/Bump(var/mob/living/carbon/human/M) +/mob/living/bot/mulebot/Bump(var/mob/living/human/M) if(!safety && istype(M)) visible_message("[src] knocks over [M]!") SET_STATUS_MAX(M, STAT_STUN, 8) diff --git a/code/modules/mob/living/bot/secbot.dm b/code/modules/mob/living/bot/secbot.dm index 5aaf8e3a716..b0cde7f77e3 100644 --- a/code/modules/mob/living/bot/secbot.dm +++ b/code/modules/mob/living/bot/secbot.dm @@ -175,7 +175,7 @@ return /mob/living/bot/secbot/handleAdjacentTarget() - var/mob/living/carbon/human/H = target + var/mob/living/human/H = target var/threat = check_threat(target) if(awaiting_surrender < SECBOT_WAIT_TIME && istype(H) && !H.current_posture.prone && threat < SECBOT_THREAT_ATTACK) if(awaiting_surrender == -1) @@ -203,7 +203,7 @@ if(!istype(M)) return FALSE - var/mob/living/carbon/human/H = M + var/mob/living/human/H = M if(istype(H) && H.current_posture.prone) cuff_target(H) return TRUE @@ -228,7 +228,7 @@ /mob/living/bot/secbot/proc/target_name(mob/living/T) if(ishuman(T)) - var/mob/living/carbon/human/H = T + var/mob/living/human/H = T return H.get_id_name("unidentified person") return "unidentified lifeform" diff --git a/code/modules/mob/living/human/death.dm b/code/modules/mob/living/human/death.dm index 36aa2c5662f..83e6c71dcd2 100644 --- a/code/modules/mob/living/human/death.dm +++ b/code/modules/mob/living/human/death.dm @@ -1,4 +1,4 @@ -/mob/living/carbon/human/gib(do_gibs = TRUE) +/mob/living/human/gib(do_gibs = TRUE) var/turf/my_turf = get_turf(src) . = ..() if(.) @@ -15,12 +15,12 @@ E.dropInto(my_turf) E.throw_at(get_edge_target_turf(E, pick(global.alldirs)), rand(1,3), THROWFORCE_GIBS) -/mob/living/carbon/human/get_death_message(gibbed) +/mob/living/human/get_death_message(gibbed) if(get_config_value(/decl/config/toggle/health_show_human_death_message)) return species.get_species_death_message(src) || "seizes up and falls limp..." return ..() -/mob/living/carbon/human/death(gibbed) +/mob/living/human/death(gibbed) if(!(. = ..())) return @@ -40,7 +40,7 @@ SSticker.mode.check_win() species.handle_death(src) -/mob/living/carbon/human/physically_destroyed(var/skip_qdel, var/droplimb_type = DISMEMBER_METHOD_BLUNT) +/mob/living/human/physically_destroyed(var/skip_qdel, var/droplimb_type = DISMEMBER_METHOD_BLUNT) for(var/obj/item/organ/external/limb in get_external_organs()) if(!limb.parent_organ) // don't dismember root continue diff --git a/code/modules/mob/living/human/descriptors/_descriptors.dm b/code/modules/mob/living/human/descriptors/_descriptors.dm index df1a9d0dcb4..2d4a57aa138 100644 --- a/code/modules/mob/living/human/descriptors/_descriptors.dm +++ b/code/modules/mob/living/human/descriptors/_descriptors.dm @@ -14,7 +14,7 @@ */ -/mob/living/carbon/human/proc/show_descriptors_to(mob/user) +/mob/living/human/proc/show_descriptors_to(mob/user) if(LAZYLEN(appearance_descriptors)) var/decl/bodytype/bodytype = get_bodytype() if(user == src) @@ -87,8 +87,8 @@ /datum/appearance_descriptor/proc/get_initial_comparison_component(mob/me, mob/them, decl/pronouns/my_gender, decl/pronouns/other_gender, my_value) if(!skip_species_mention) - var/mob/living/carbon/human/H = me - var/mob/living/carbon/human/O = them + var/mob/living/human/H = me + var/mob/living/human/O = them if(istype(H) && (!istype(O) || H.species.name != O.species.name)) . = get_species_text("\improper [H.species.name]") . = "[get_third_person_message_start(my_gender)] [get_standalone_value_descriptor(my_value)][.]" @@ -114,7 +114,7 @@ // Append the same-descriptor comparison text. var/comparing_value if(ishuman(observer)) - var/mob/living/carbon/human/human_observer = observer + var/mob/living/human/human_observer = observer var/decl/bodytype/human_bodytype = human_observer?.get_bodytype() if(LAZYLEN(human_observer.appearance_descriptors) && !isnull(human_bodytype.appearance_descriptors[name]) && !isnull(human_observer.appearance_descriptors[name])) var/datum/appearance_descriptor/obs_descriptor = human_bodytype.appearance_descriptors[name] diff --git a/code/modules/mob/living/human/examine.dm b/code/modules/mob/living/human/examine.dm index 7024317a429..064edd76354 100644 --- a/code/modules/mob/living/human/examine.dm +++ b/code/modules/mob/living/human/examine.dm @@ -1,4 +1,4 @@ -/mob/living/carbon/human/show_examined_short_description(mob/user, distance, infix, suffix, hideflags, decl/pronouns/pronouns) +/mob/living/human/show_examined_short_description(mob/user, distance, infix, suffix, hideflags, decl/pronouns/pronouns) var/msg = list("*---------*\n[user == src ? "You are" : "This is"] [name]") if(!(hideflags & HIDEJUMPSUIT) || !(hideflags & HIDEFACE)) var/species_name = "\improper " @@ -20,7 +20,7 @@ msg += "
    *---------*" to_chat(user, jointext(msg, null)) -/mob/living/carbon/human/show_other_examine_strings(mob/user, distance, infix, suffix, hideflags, decl/pronouns/pronouns) +/mob/living/human/show_other_examine_strings(mob/user, distance, infix, suffix, hideflags, decl/pronouns/pronouns) var/self_examine = (user == src) var/use_He = self_examine ? "You" : pronouns.He @@ -260,14 +260,14 @@ ..() -//Helper procedure. Called by /mob/living/carbon/human/examine() and /mob/living/carbon/human/Topic() to determine HUD access to security and medical records. +//Helper procedure. Called by /mob/living/human/examine() and /mob/living/human/Topic() to determine HUD access to security and medical records. /proc/hasHUD(mob/M, hudtype) return !!M.getHUDsource(hudtype) /mob/proc/getHUDsource(hudtype) return -/mob/living/carbon/human/getHUDsource(hudtype) +/mob/living/human/getHUDsource(hudtype) var/obj/item/clothing/glasses/G = get_equipped_item(slot_glasses_str) if(!istype(G)) return ..() @@ -293,7 +293,7 @@ if(getHUDsource(hudtype)) return get_computer_network() -/mob/living/carbon/human/verb/pose() +/mob/living/human/verb/pose() set name = "Set Pose" set desc = "Sets a description which will be shown when someone examines you." set category = "IC" @@ -301,7 +301,7 @@ var/decl/pronouns/G = get_pronouns() pose = sanitize(input(usr, "This is [src]. [G.He]...", "Pose", null) as text) -/mob/living/carbon/human/verb/set_flavor() +/mob/living/human/verb/set_flavor() set name = "Set Flavour Text" set desc = "Sets an extended description of your character's features." set category = "IC" diff --git a/code/modules/mob/living/human/human.dm b/code/modules/mob/living/human/human.dm index 0aa2218119b..e8e79e0bffd 100644 --- a/code/modules/mob/living/human/human.dm +++ b/code/modules/mob/living/human/human.dm @@ -1,4 +1,4 @@ -/mob/living/carbon/human +/mob/living/human name = "unknown" real_name = "unknown" icon = 'icons/mob/human.dmi' @@ -10,7 +10,7 @@ var/embedded_flag //To check if we've need to roll for damage on movement while an item is imbedded in us. var/step_count -/mob/living/carbon/human/Initialize(mapload, species_name, datum/mob_snapshot/supplied_appearance) +/mob/living/human/Initialize(mapload, species_name, datum/mob_snapshot/supplied_appearance) current_health = max_health setup_hud_overlays() @@ -33,7 +33,7 @@ if(. != INITIALIZE_HINT_QDEL) post_setup(arglist(newargs)) -/mob/living/carbon/human/proc/setup_hud_overlays() +/mob/living/human/proc/setup_hud_overlays() hud_list[HEALTH_HUD] = new /image/hud_overlay('icons/mob/hud_med.dmi', src, "100") hud_list[STATUS_HUD] = new /image/hud_overlay('icons/mob/hud.dmi', src, "hudhealthy") hud_list[LIFE_HUD] = new /image/hud_overlay('icons/mob/hud.dmi', src, "hudhealthy") @@ -45,7 +45,7 @@ hud_list[SPECIALROLE_HUD] = new /image/hud_overlay('icons/mob/hud.dmi', src, "hudblank") hud_list[STATUS_HUD_OOC] = new /image/hud_overlay('icons/mob/hud.dmi', src, "hudhealthy") -/mob/living/carbon/human/Destroy() +/mob/living/human/Destroy() global.human_mob_list -= src regenerate_body_icon = FALSE // don't bother regenerating if we happen to be queued to update icon worn_underwear = null @@ -69,19 +69,19 @@ qdel(M) return ..() -/mob/living/carbon/human/get_ingested_reagents() +/mob/living/human/get_ingested_reagents() if(!should_have_organ(BP_STOMACH)) return var/obj/item/organ/internal/stomach/stomach = get_organ(BP_STOMACH) return stomach?.ingested -/mob/living/carbon/human/get_inhaled_reagents() +/mob/living/human/get_inhaled_reagents() if(!should_have_organ(BP_LUNGS)) return var/obj/item/organ/internal/lungs/lungs = get_organ(BP_LUNGS) return lungs?.inhaled -/mob/living/carbon/human/Stat() +/mob/living/human/Stat() . = ..() if(statpanel("Status")) @@ -116,7 +116,7 @@ cell_status = "[rig.cell.charge]/[rig.cell.maxcharge]" stat(null, "Hardsuit charge: [cell_status]") -/mob/living/carbon/human/proc/implant_loyalty(mob/living/carbon/human/M, override = FALSE) // Won't override by default. +/mob/living/human/proc/implant_loyalty(mob/living/human/M, override = FALSE) // Won't override by default. if(!get_config_value(/decl/config/toggle/use_loyalty_implants) && !override) return // Nuh-uh. var/obj/item/implant/loyalty/L = new/obj/item/implant/loyalty(M) @@ -127,7 +127,7 @@ L.part = affected L.implanted(src) -/mob/living/carbon/human/proc/is_loyalty_implanted(mob/living/carbon/human/M) +/mob/living/human/proc/is_loyalty_implanted(mob/living/human/M) for(var/L in M.contents) if(istype(L, /obj/item/implant/loyalty)) for(var/obj/item/organ/external/O in M.get_external_organs()) @@ -135,13 +135,13 @@ return 1 return 0 -/mob/living/carbon/human/get_additional_stripping_options() +/mob/living/human/get_additional_stripping_options() . = ..() for(var/entry in worn_underwear) var/obj/item/underwear/UW = entry LAZYADD(., "
    Remove \the [UW]") -/mob/living/carbon/human/OnSelfTopic(href_list) +/mob/living/human/OnSelfTopic(href_list) if (href_list["lookitem"]) var/obj/item/I = locate(href_list["lookitem"]) if(I) @@ -156,12 +156,12 @@ return ..() -/mob/living/carbon/human/CanUseTopic(mob/user, datum/topic_state/state, href_list) +/mob/living/human/CanUseTopic(mob/user, datum/topic_state/state, href_list) . = ..() if(href_list && (href_list["refresh"] || href_list["item"])) return min(., ..(user, global.physical_topic_state, href_list)) -/mob/living/carbon/human/OnTopic(mob/user, href_list) +/mob/living/human/OnTopic(mob/user, href_list) if (href_list["criminal"]) if(hasHUD(user, HUD_SECURITY)) @@ -190,7 +190,7 @@ spawn() BITSET(hud_updateflag, WANTED_HUD) if(ishuman(user)) - var/mob/living/carbon/human/U = user + var/mob/living/human/U = user U.handle_regular_hud_updates() if(isrobot(user)) var/mob/living/silicon/robot/U = user @@ -248,7 +248,7 @@ spawn() if(ishuman(user)) - var/mob/living/carbon/human/U = user + var/mob/living/human/U = user U.handle_regular_hud_updates() if(isrobot(user)) var/mob/living/silicon/robot/U = user @@ -287,7 +287,7 @@ return ..() -/mob/living/carbon/human/update_flavor_text(key) +/mob/living/human/update_flavor_text(key) var/msg switch(key) if("done") @@ -304,14 +304,14 @@ flavor_texts[key] = msg set_flavor() -/mob/living/carbon/human/abiotic(var/full_body = TRUE) +/mob/living/human/abiotic(var/full_body = TRUE) if(full_body) for(var/slot in list(slot_head_str, slot_shoes_str, slot_w_uniform_str, slot_wear_suit_str, slot_glasses_str, slot_l_ear_str, slot_r_ear_str, slot_gloves_str)) if(get_equipped_item(slot)) return FALSE return ..() -/mob/living/carbon/human/empty_stomach() +/mob/living/human/empty_stomach() SET_STATUS_MAX(src, STAT_STUN, 3) var/obj/item/organ/internal/stomach/stomach = get_organ(BP_STOMACH, /obj/item/organ/internal/stomach) @@ -348,7 +348,7 @@ handle_additional_vomit_reagents(splat) splat.update_icon() -/mob/living/carbon/human/proc/vomit(var/timevomit = 1, var/level = 3, var/deliberate = FALSE) +/mob/living/human/proc/vomit(var/timevomit = 1, var/level = 3, var/deliberate = FALSE) set waitfor = FALSE @@ -379,14 +379,14 @@ sleep(350) //wait 35 seconds before next volley lastpuke = FALSE -/mob/living/carbon/human/proc/increase_germ_level(n) +/mob/living/human/proc/increase_germ_level(n) var/obj/item/gloves = get_equipped_item(slot_gloves_str) if(gloves) gloves.germ_level += n else germ_level += n -/mob/living/carbon/human/revive() +/mob/living/human/revive() get_bodytype().create_missing_organs(src) // Reset our organs/limbs. restore_all_organs() // Reapply robotics/amputated status from preferences. reset_blood() @@ -407,10 +407,10 @@ bloodied |= grabber.add_blood(M, amount, blood_data) if(bloodied) update_equipment_overlay(slot_gloves_str) //handles bloody hands overlays and updating - verbs += /mob/living/carbon/human/proc/bloody_doodle + verbs += /mob/living/human/proc/bloody_doodle return 1 //we applied blood to the item -/mob/living/carbon/human/get_visible_implants(var/class = 0) +/mob/living/human/get_visible_implants(var/class = 0) var/list/visible_implants = list() for(var/obj/item/organ/external/organ in get_external_organs()) @@ -420,14 +420,14 @@ return(visible_implants) -/mob/living/carbon/human/embedded_needs_process() +/mob/living/human/embedded_needs_process() for(var/obj/item/organ/external/organ in src.get_external_organs()) for(var/obj/item/O in organ.implants) if(!istype(O, /obj/item/implant)) //implant type items do not cause embedding effects, see handle_embedded_objects() return 1 return 0 -/mob/living/carbon/human/handle_embedded_and_stomach_objects() +/mob/living/human/handle_embedded_and_stomach_objects() if(embedded_flag) for(var/obj/item/organ/external/organ in get_external_organs()) @@ -450,7 +450,7 @@ else jostle_internal_object(parent, O) -/mob/living/carbon/human/proc/jostle_internal_object(var/obj/item/organ/external/organ, var/obj/item/O) +/mob/living/human/proc/jostle_internal_object(var/obj/item/organ/external/organ, var/obj/item/O) // All kinds of embedded objects cause bleeding. if(!organ.can_feel_pain()) to_chat(src, SPAN_DANGER("You feel [O] moving inside your [organ.name].")) @@ -465,7 +465,7 @@ /mob/proc/set_bodytype(var/decl/bodytype/new_bodytype) return -/mob/living/carbon/human/set_bodytype(var/decl/bodytype/new_bodytype) +/mob/living/human/set_bodytype(var/decl/bodytype/new_bodytype) var/decl/bodytype/old_bodytype = get_bodytype() if(ispath(new_bodytype)) @@ -492,7 +492,7 @@ //set_species should not handle the entirety of initing the mob, and should not trigger deep updates //It focuses on setting up species-related data, without force applying them uppon organs and the mob's appearance. // For transforming an existing mob, look at change_species() -/mob/living/carbon/human/set_species(var/new_species_name, var/new_bodytype = null) +/mob/living/human/set_species(var/new_species_name, var/new_bodytype = null) if(!new_species_name) CRASH("set_species on mob '[src]' was passed a null species name '[new_species_name]'!") var/new_species = get_species_by_key(new_species_name) @@ -554,7 +554,7 @@ //Syncs cultural tokens to the currently set species, and may trigger a language update -/mob/living/carbon/human/proc/apply_species_cultural_info() +/mob/living/human/proc/apply_species_cultural_info() var/update_lang for(var/token in ALL_CULTURAL_TAGS) if(species.force_cultural_info && species.force_cultural_info[token]) @@ -568,7 +568,7 @@ update_languages() //Drop anything that cannot be worn by the current species of the mob -/mob/living/carbon/human/proc/apply_species_inventory_restrictions() +/mob/living/human/proc/apply_species_inventory_restrictions() if(!(get_bodytype().appearance_flags & HAS_UNDERWEAR)) QDEL_NULL_LIST(worn_underwear) @@ -595,7 +595,7 @@ //This handles actually updating our visual appearance // Triggers deep update of limbs and hud -/mob/living/carbon/human/proc/apply_species_appearance() +/mob/living/human/proc/apply_species_appearance() if(!species) icon_state = lowertext(SPECIES_HUMAN) else @@ -607,7 +607,7 @@ hud_reset(TRUE) // Like above, but for bodytype. Not as complicated. -/mob/living/carbon/human/proc/apply_bodytype_appearance() +/mob/living/human/proc/apply_bodytype_appearance() var/decl/bodytype/root_bodytype = get_bodytype() if(!root_bodytype) set_skin_colour(COLOR_BLACK) @@ -634,7 +634,7 @@ reset_offsets() -/mob/living/carbon/human/proc/update_languages() +/mob/living/human/proc/update_languages() if(!length(cultural_info)) log_warning("'[src]'([x], [y], [z]) doesn't have any cultural info set and is attempting to update its language!!") @@ -689,7 +689,7 @@ return thing return FALSE -/mob/living/carbon/human/can_inject(var/mob/user, var/target_zone) +/mob/living/human/can_inject(var/mob/user, var/target_zone) var/obj/item/organ/external/affecting = GET_EXTERNAL_ORGAN(src, target_zone) if(!affecting) @@ -711,7 +711,7 @@ return 0 -/mob/living/carbon/human/print_flavor_text(var/shrink = 1) +/mob/living/human/print_flavor_text(var/shrink = 1) var/head_exposed = 1 var/face_exposed = 1 @@ -763,19 +763,19 @@ else return ..() -/mob/living/carbon/human/has_brain() +/mob/living/human/has_brain() . = !!GET_INTERNAL_ORGAN(src, BP_BRAIN) -/mob/living/carbon/human/check_has_eyes() +/mob/living/human/check_has_eyes() var/obj/item/organ/internal/eyes = GET_INTERNAL_ORGAN(src, BP_EYES) . = eyes?.is_usable() -/mob/living/carbon/human/reset_view(atom/A, update_hud = 1) +/mob/living/human/reset_view(atom/A, update_hud = 1) ..() if(update_hud) handle_regular_hud_updates() -/mob/living/carbon/human/can_stand_overridden() +/mob/living/human/can_stand_overridden() if(get_rig()?.ai_can_move_suit(check_for_ai = 1)) // Actually missing a leg will screw you up. Everything else can be compensated for. for(var/limbcheck in list(BP_L_LEG,BP_R_LEG)) @@ -785,7 +785,7 @@ return TRUE return FALSE -/mob/living/carbon/human/can_devour(atom/movable/victim, var/silent = FALSE) +/mob/living/human/can_devour(atom/movable/victim, var/silent = FALSE) if(!should_have_organ(BP_STOMACH)) return ..() @@ -808,19 +808,19 @@ . = stomach.get_devour_time(victim) || ..() -/mob/living/carbon/human/move_to_stomach(atom/movable/victim) +/mob/living/human/move_to_stomach(atom/movable/victim) var/obj/item/organ/internal/stomach = GET_INTERNAL_ORGAN(src, BP_STOMACH) if(stomach) victim.forceMove(stomach) -/mob/living/carbon/human/get_adjusted_metabolism(metabolism) +/mob/living/human/get_adjusted_metabolism(metabolism) return ..() * (species ? species.metabolism_mod : 1) -/mob/living/carbon/human/is_invisible_to(var/mob/viewer) +/mob/living/human/is_invisible_to(var/mob/viewer) return (is_cloaked() || ..()) -/mob/living/carbon/human/proc/resuscitate() +/mob/living/human/proc/resuscitate() if(!is_asystole() || !should_have_organ(BP_HEART)) return var/obj/item/organ/internal/heart/heart = get_organ(BP_HEART, /obj/item/organ/internal/heart) @@ -845,23 +845,23 @@ heart.handle_pulse() return TRUE -/mob/living/carbon/human/proc/make_reagent(amount, reagent_type) +/mob/living/human/proc/make_reagent(amount, reagent_type) if(stat == CONSCIOUS) var/limit = max(0, reagents.get_overdose(reagent_type) - REAGENT_VOLUME(reagents, reagent_type)) add_to_reagents(reagent_type, min(amount, limit)) //Get fluffy numbers -/mob/living/carbon/human/proc/get_blood_pressure() +/mob/living/human/proc/get_blood_pressure() if(status_flags & FAKEDEATH) return "[FLOOR(120+rand(-5,5))*0.25]/[FLOOR(80+rand(-5,5)*0.25)]" var/blood_result = get_blood_circulation() return "[FLOOR((120+rand(-5,5))*(blood_result/100))]/[FLOOR((80+rand(-5,5))*(blood_result/100))]" //Point at which you dun breathe no more. Separate from asystole crit, which is heart-related. -/mob/living/carbon/human/nervous_system_failure() +/mob/living/human/nervous_system_failure() return get_damage(BRAIN) >= get_max_health() * 0.75 -/mob/living/carbon/human/melee_accuracy_mods() +/mob/living/human/melee_accuracy_mods() . = ..() if(get_shock() > 50) . += 15 @@ -870,7 +870,7 @@ if(shock_stage > 30) . += 15 -/mob/living/carbon/human/ranged_accuracy_mods() +/mob/living/human/ranged_accuracy_mods() . = ..() if(get_shock() > 10 && !skill_check(SKILL_WEAPONS, SKILL_ADEPT)) . -= 1 @@ -887,12 +887,12 @@ if(skill_check(SKILL_WEAPONS, SKILL_PROF)) . += 2 -/mob/living/carbon/human/fluid_act(var/datum/reagents/fluids) +/mob/living/human/fluid_act(var/datum/reagents/fluids) ..() if(!QDELETED(src) && fluids?.total_volume) species.fluid_act(src, fluids) -/mob/living/carbon/human/proc/set_cultural_value(var/token, var/decl/cultural_info/_culture, var/defer_language_update) +/mob/living/human/proc/set_cultural_value(var/token, var/decl/cultural_info/_culture, var/defer_language_update) if(ispath(_culture, /decl/cultural_info)) _culture = GET_DECL(_culture) if(istype(_culture)) @@ -903,17 +903,17 @@ /mob/living/proc/get_cultural_value(var/token) return null -/mob/living/carbon/human/get_cultural_value(var/token) +/mob/living/human/get_cultural_value(var/token) . = LAZYACCESS(cultural_info, token) if(!istype(., /decl/cultural_info)) . = global.using_map.default_cultural_info[token] PRINT_STACK_TRACE("get_cultural_value() tried to return a non-instance value for token '[token]' - full culture list: [json_encode(cultural_info)] default species culture list: [json_encode(global.using_map.default_cultural_info)]") -/mob/living/carbon/human/get_digestion_product() +/mob/living/human/get_digestion_product() return species.get_digestion_product(src) // A damaged stomach can put blood in your vomit. -/mob/living/carbon/human/handle_additional_vomit_reagents(var/obj/effect/decal/cleanable/vomit/vomit) +/mob/living/human/handle_additional_vomit_reagents(var/obj/effect/decal/cleanable/vomit/vomit) ..() if(should_have_organ(BP_STOMACH)) var/obj/item/organ/internal/stomach = GET_INTERNAL_ORGAN(src, BP_STOMACH) @@ -923,7 +923,7 @@ else reagents.trans_to_obj(vomit, 5) -/mob/living/carbon/human/get_bullet_impact_effect_type(var/def_zone) +/mob/living/human/get_bullet_impact_effect_type(var/def_zone) var/obj/item/organ/external/E = GET_EXTERNAL_ORGAN(src, def_zone) if(!E) return BULLET_IMPACT_NONE @@ -931,7 +931,7 @@ return BULLET_IMPACT_METAL return BULLET_IMPACT_MEAT -/mob/living/carbon/human/lose_hair() +/mob/living/human/lose_hair() if(species.handle_additional_hair_loss(src)) . = TRUE for(var/obj/item/organ/external/E in get_external_organs()) @@ -950,28 +950,28 @@ remove_sprite_accessory(accessory, skip_update = TRUE) . = TRUE -/mob/living/carbon/human/increaseBodyTemp(value) +/mob/living/human/increaseBodyTemp(value) bodytemperature += value return bodytemperature -/mob/living/carbon/human/get_admin_job_string() +/mob/living/human/get_admin_job_string() return job || uppertext(species.name) -/mob/living/carbon/human/can_change_intent() +/mob/living/human/can_change_intent() return TRUE -/mob/living/carbon/human/breathing_hole_covered() +/mob/living/human/breathing_hole_covered() . = ..() if(!.) var/obj/item/head = get_equipped_item(slot_head_str) if(head && (head.item_flags & ITEM_FLAG_AIRTIGHT)) return TRUE -/mob/living/carbon/human/set_internals_to_best_available_tank(var/breathes_gas = /decl/material/gas/oxygen, var/list/poison_gas = list(/decl/material/gas/chlorine)) +/mob/living/human/set_internals_to_best_available_tank(var/breathes_gas = /decl/material/gas/oxygen, var/list/poison_gas = list(/decl/material/gas/chlorine)) . = ..(species.breath_type, species.poison_types) //Sets the mob's real name and update all the proper fields -/mob/living/carbon/human/proc/set_real_name(var/newname) +/mob/living/human/proc/set_real_name(var/newname) if(!newname) return real_name = newname @@ -980,7 +980,7 @@ mind.name = newname //Human mob specific init code. Meant to be used only on init. -/mob/living/carbon/human/proc/setup_human(species_name, datum/mob_snapshot/supplied_appearance) +/mob/living/human/proc/setup_human(species_name, datum/mob_snapshot/supplied_appearance) if(supplied_appearance) species_name = supplied_appearance.root_species else if(!species_name) @@ -1013,7 +1013,7 @@ reset_blood() //If the mob has its default name it'll try to generate /obtain a proper one -/mob/living/carbon/human/proc/try_generate_default_name() +/mob/living/human/proc/try_generate_default_name() if(name != initial(name)) return if(species) @@ -1022,10 +1022,10 @@ SetName(initial(name)) //Runs last after setup and after the parent init has been executed. -/mob/living/carbon/human/proc/post_setup(species_name, datum/mob_snapshot/supplied_appearance) +/mob/living/human/proc/post_setup(species_name, datum/mob_snapshot/supplied_appearance) try_refresh_visible_overlays() //Do this exactly once per setup -/mob/living/carbon/human/handle_flashed(var/obj/item/flash/flash, var/flash_strength) +/mob/living/human/handle_flashed(var/obj/item/flash/flash, var/flash_strength) var/safety = eyecheck() if(safety < FLASH_PROTECTION_MODERATE) flash_strength = round(get_flash_mod() * flash_strength) @@ -1033,7 +1033,7 @@ flash_strength = (flash_strength / 2) . = ..() -/mob/living/carbon/human/handle_nutrition_and_hydration() +/mob/living/human/handle_nutrition_and_hydration() ..() // Apply stressors. @@ -1061,20 +1061,20 @@ else remove_stressor(/datum/stressor/thirsty) -/mob/living/carbon/human/get_comments_record() +/mob/living/human/get_comments_record() if(comments_record_id) return SScharacter_info.get_record(comments_record_id, TRUE) return ..() -/mob/living/carbon/human/proc/get_age() +/mob/living/human/proc/get_age() . = LAZYACCESS(appearance_descriptors, "age") || 30 -/mob/living/carbon/human/proc/set_age(var/val) +/mob/living/human/proc/set_age(var/val) var/decl/bodytype/bodytype = get_bodytype() var/datum/appearance_descriptor/age = LAZYACCESS(bodytype.appearance_descriptors, "age") LAZYSET(appearance_descriptors, "age", (age ? age.sanitize_value(val) : 30)) -/mob/living/carbon/human/HandleBloodTrail(turf/T, old_loc) +/mob/living/human/HandleBloodTrail(turf/T, old_loc) // Tracking blood var/obj/item/source var/obj/item/clothing/shoes/shoes = get_equipped_item(slot_shoes_str) @@ -1108,11 +1108,11 @@ var/turf/old_turf = old_loc old_turf.AddTracks(species.get_move_trail(src), bloodDNA, 0, dir, bloodcolor) // Going -/mob/living/carbon/human/remove_implant(obj/item/implant, surgical_removal = FALSE, obj/item/organ/external/affected) +/mob/living/human/remove_implant(obj/item/implant, surgical_removal = FALSE, obj/item/organ/external/affected) if((. = ..()) && !surgical_removal) shock_stage += 20 -/mob/living/carbon/human/proc/has_footsteps() +/mob/living/human/proc/has_footsteps() if(species.silent_steps || buckled || current_posture.prone || throwing) return //people flying, lying down or sitting do not step @@ -1125,7 +1125,7 @@ return TRUE -/mob/living/carbon/human/handle_footsteps() +/mob/living/human/handle_footsteps() step_count++ if(!has_footsteps()) return @@ -1164,51 +1164,51 @@ if(volume > 0 && range > 0) playsound(T, footsound, volume, 1, range) -/mob/living/carbon/human/get_skin_tone(value) +/mob/living/human/get_skin_tone(value) return skin_tone -/mob/living/carbon/human/set_skin_tone(value) +/mob/living/human/set_skin_tone(value) skin_tone = value -/mob/living/carbon/human/try_awaken(mob/user) +/mob/living/human/try_awaken(mob/user) return !is_asystole() && ..() -/mob/living/carbon/human/get_satiated_nutrition() +/mob/living/human/get_satiated_nutrition() return 350 -/mob/living/carbon/human/get_max_nutrition() +/mob/living/human/get_max_nutrition() return 400 -/mob/living/carbon/human/get_max_hydration() +/mob/living/human/get_max_hydration() return 400 -/mob/living/carbon/human/get_species() +/mob/living/human/get_species() RETURN_TYPE(/decl/species) return species -/mob/living/carbon/human/get_contact_reagents() +/mob/living/human/get_contact_reagents() return touching -/mob/living/carbon/human/get_injected_reagents() +/mob/living/human/get_injected_reagents() return bloodstr -/mob/living/carbon/human/Bump(var/atom/movable/AM, yes) +/mob/living/human/Bump(var/atom/movable/AM, yes) if(now_pushing || !yes) return ..() -/mob/living/carbon/human/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume) +/mob/living/human/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume) ..() var/temp_inc = max(min(BODYTEMP_HEATING_MAX*(1-get_heat_protection()), exposed_temperature - bodytemperature), 0) bodytemperature += temp_inc -/mob/living/carbon/human/currently_has_skin() +/mob/living/human/currently_has_skin() return currently_has_meat() -/mob/living/carbon/human/currently_has_innards() +/mob/living/human/currently_has_innards() return length(get_internal_organs()) -/mob/living/carbon/human/currently_has_meat() +/mob/living/human/currently_has_meat() for(var/obj/item/organ/external/limb in get_external_organs()) if(istype(limb.material, /decl/material/solid/organic/meat)) return TRUE diff --git a/code/modules/mob/living/human/human_appearance.dm b/code/modules/mob/living/human/human_appearance.dm index cd16747a036..ca0dddcea7e 100644 --- a/code/modules/mob/living/human/human_appearance.dm +++ b/code/modules/mob/living/human/human_appearance.dm @@ -1,22 +1,22 @@ -/mob/living/carbon/human +/mob/living/human var/_skin_colour -/mob/living/carbon/human/proc/change_appearance(var/flags = APPEARANCE_ALL_HAIR, var/location = src, var/mob/user = src, var/check_species_whitelist = 1, var/list/species_whitelist = list(), var/list/species_blacklist = list(), var/datum/topic_state/state = global.default_topic_state) +/mob/living/human/proc/change_appearance(var/flags = APPEARANCE_ALL_HAIR, var/location = src, var/mob/user = src, var/check_species_whitelist = 1, var/list/species_whitelist = list(), var/list/species_blacklist = list(), var/datum/topic_state/state = global.default_topic_state) var/datum/nano_module/appearance_changer/AC = new(location, src, check_species_whitelist, species_whitelist, species_blacklist) AC.flags = flags AC.ui_interact(user, state = state) -/mob/living/carbon/human/get_skin_colour() +/mob/living/human/get_skin_colour() return _skin_colour -/mob/living/carbon/human/set_skin_colour(var/new_color, var/skip_update = FALSE) +/mob/living/human/set_skin_colour(var/new_color, var/skip_update = FALSE) if((. = ..())) _skin_colour = new_color if(!skip_update) force_update_limbs() update_body() -/mob/living/carbon/human/proc/change_species(var/new_species, var/new_bodytype = null) +/mob/living/human/proc/change_species(var/new_species, var/new_bodytype = null) if(!new_species) return @@ -46,16 +46,16 @@ try_refresh_visible_overlays() return 1 -/mob/living/carbon/human/set_gender(var/new_gender, var/update_body = FALSE) +/mob/living/human/set_gender(var/new_gender, var/update_body = FALSE) . = ..() if(. && update_body) update_body() -/mob/living/carbon/human/proc/randomize_gender() +/mob/living/human/proc/randomize_gender() var/decl/pronouns/pronouns = pick(species.available_pronouns) set_gender(pronouns.name, TRUE) -/mob/living/carbon/human/proc/reset_hair() +/mob/living/human/proc/reset_hair() var/decl/bodytype/root_bodytype = get_bodytype() var/decl/sprite_accessory_category/hair/hair_category = GET_DECL(SAC_HAIR) var/list/valid_hairstyles = species?.get_available_accessories(root_bodytype, SAC_HAIR) @@ -82,7 +82,7 @@ update_hair() -/mob/living/carbon/human/proc/change_skin_tone(var/tone) +/mob/living/human/proc/change_skin_tone(var/tone) if(skin_tone == tone || !(get_bodytype().appearance_flags & HAS_A_SKIN_TONE)) return skin_tone = tone @@ -90,7 +90,7 @@ update_body() return 1 -/mob/living/carbon/human/proc/generate_valid_species(var/check_whitelist = 1, var/list/whitelist = list(), var/list/blacklist = list()) +/mob/living/human/proc/generate_valid_species(var/check_whitelist = 1, var/list/whitelist = list(), var/list/blacklist = list()) var/list/valid_species = new() for(var/current_species_name in get_all_species()) var/decl/species/current_species = get_species_by_key(current_species_name) diff --git a/code/modules/mob/living/human/human_appearance_head.dm b/code/modules/mob/living/human/human_appearance_head.dm index d60fc877013..f5ed43182da 100644 --- a/code/modules/mob/living/human/human_appearance_head.dm +++ b/code/modules/mob/living/human/human_appearance_head.dm @@ -1,11 +1,11 @@ -/mob/living/carbon/human +/mob/living/human var/_eye_colour // Eyes! TODO, make these a marking. -/mob/living/carbon/human/get_eye_colour() +/mob/living/human/get_eye_colour() return _eye_colour -/mob/living/carbon/human/set_eye_colour(var/new_color, var/skip_update = FALSE) +/mob/living/human/set_eye_colour(var/new_color, var/skip_update = FALSE) if((. = ..())) _eye_colour = new_color if(!skip_update) diff --git a/code/modules/mob/living/human/human_attackhand.dm b/code/modules/mob/living/human/human_attackhand.dm index 64ba7e61f0e..ed057dcb330 100644 --- a/code/modules/mob/living/human/human_attackhand.dm +++ b/code/modules/mob/living/human/human_attackhand.dm @@ -1,4 +1,4 @@ -/mob/living/carbon/human/proc/get_unarmed_attack(var/mob/target, var/hit_zone = null) +/mob/living/human/proc/get_unarmed_attack(var/mob/target, var/hit_zone = null) if(!hit_zone) hit_zone = get_target_zone() var/list/available_attacks = get_natural_attacks() @@ -18,13 +18,13 @@ use_attack = pick(other_attacks) . = use_attack?.resolve_to_soft_variant(src) -/mob/living/carbon/human/proc/get_natural_attacks() +/mob/living/human/proc/get_natural_attacks() . = list() for(var/obj/item/organ/external/limb in get_external_organs()) if(length(limb.unarmed_attacks) && limb.is_usable()) . |= limb.unarmed_attacks -/mob/living/carbon/human/default_help_interaction(mob/user) +/mob/living/human/default_help_interaction(mob/user) if(user != src) if(ishuman(user) && (is_asystole() || (status_flags & FAKEDEATH) || failed_last_breath) && !on_fire && !(user.get_target_zone() == BP_R_ARM || user.get_target_zone() == BP_L_ARM)) @@ -96,7 +96,7 @@ show_message("My [org.name] is OK.",1) return TRUE -/mob/living/carbon/human/default_disarm_interaction(mob/user) +/mob/living/human/default_disarm_interaction(mob/user) var/decl/species/user_species = user.get_species() if(user_species) admin_attack_log(user, src, "Disarmed their victim.", "Was disarmed.", "disarmed") @@ -104,7 +104,7 @@ return TRUE . = ..() -/mob/living/carbon/human/default_hurt_interaction(mob/user) +/mob/living/human/default_hurt_interaction(mob/user) . = ..() if(.) return TRUE @@ -117,7 +117,7 @@ attack_generic(user, rand(1,3), "punched") return TRUE - var/mob/living/carbon/human/H = user + var/mob/living/human/H = user var/rand_damage = rand(1, 5) var/block = 0 var/accurate = 0 @@ -219,7 +219,7 @@ apply_damage(real_damage, attack.get_damage_type(), hit_zone, damage_flags=attack.damage_flags()) return TRUE -/mob/living/carbon/human/attack_hand(mob/user) +/mob/living/human/attack_hand(mob/user) remove_cloaking_source(species) if(user.a_intent != I_GRAB) @@ -227,7 +227,7 @@ if(G.assailant == user && G.affecting == src && G.resolve_openhand_attack()) return TRUE // Should this all be in Touch()? - var/mob/living/carbon/human/H = user + var/mob/living/human/H = user if(istype(H)) if(H != src && check_shields(0, null, H, H.get_target_zone(), H.name)) H.do_attack_animation(src) @@ -235,7 +235,7 @@ return ..() -/mob/living/carbon/human/proc/start_compressions(mob/living/carbon/human/H, starting = FALSE, cpr_mode) +/mob/living/human/proc/start_compressions(mob/living/human/H, starting = FALSE, cpr_mode) if(length(H.get_held_items())) performing_cpr = FALSE to_chat(H, SPAN_WARNING("You cannot perform CPR with anything in your hands.")) @@ -334,7 +334,7 @@ start_compressions(H, FALSE, cpr_mode) //Breaks all grips and pulls that the mob currently has. -/mob/living/carbon/human/proc/break_all_grabs(mob/living/user) +/mob/living/human/proc/break_all_grabs(mob/living/user) . = FALSE for(var/obj/item/grab/grab in get_active_grabs()) if(grab.affecting) @@ -350,7 +350,7 @@ If you are applying pressure to another and attempt to apply pressure to yourself, you'll have to switch to an empty hand which will also stop do_mob() Changing targeted zones should also stop do_mob(), preventing you from applying pressure to more than one body part at once. */ -/mob/living/carbon/human/proc/apply_pressure(mob/living/user, var/target_zone) +/mob/living/human/proc/apply_pressure(mob/living/user, var/target_zone) var/obj/item/organ/external/organ = GET_EXTERNAL_ORGAN(src, target_zone) if(!organ || !(organ.status & (ORGAN_BLEEDING|ORGAN_ARTERY_CUT)) || BP_IS_PROSTHETIC(organ)) return 0 @@ -389,7 +389,7 @@ return 1 -/mob/living/carbon/human/verb/set_default_unarmed_attack() +/mob/living/human/verb/set_default_unarmed_attack() set name = "Set Default Unarmed Attack" set category = "IC" diff --git a/code/modules/mob/living/human/human_blood.dm b/code/modules/mob/living/human/human_blood.dm index c30ff2bcccd..f07a4c4635b 100644 --- a/code/modules/mob/living/human/human_blood.dm +++ b/code/modules/mob/living/human/human_blood.dm @@ -1,8 +1,8 @@ -/mob/living/carbon/human +/mob/living/human var/datum/reagents/vessel // Container for blood and BLOOD ONLY. Do not transfer other chems here. //Initializes blood vessels -/mob/living/carbon/human/proc/make_blood() +/mob/living/human/proc/make_blood() if(vessel) return vessel = new /datum/reagents(species.blood_volume, src) @@ -11,7 +11,7 @@ reset_blood() //Modifies blood level -/mob/living/carbon/human/proc/adjust_blood(var/amt, var/blood_data) +/mob/living/human/proc/adjust_blood(var/amt, var/blood_data) if(!vessel) make_blood() @@ -25,7 +25,7 @@ vessel.remove_any(abs(amt)) //Resets blood data -/mob/living/carbon/human/proc/reset_blood() +/mob/living/human/proc/reset_blood() if(!vessel) make_blood() @@ -51,7 +51,7 @@ )) //Makes a blood drop, leaking amt units of blood from the mob -/mob/living/carbon/human/proc/drip(var/amt, var/tar = src, var/ddir) +/mob/living/human/proc/drip(var/amt, var/tar = src, var/ddir) var/datum/reagents/bloodstream = get_injected_reagents() if(remove_blood(amt)) if(bloodstream.total_volume && vessel.total_volume) @@ -62,7 +62,7 @@ return 0 #define BLOOD_SPRAY_DISTANCE 2 -/mob/living/carbon/human/proc/blood_squirt(var/amt, var/turf/sprayloc) +/mob/living/human/proc/blood_squirt(var/amt, var/turf/sprayloc) if(amt <= 0 || !istype(sprayloc)) return var/spraydir = pick(global.alldirs) @@ -87,7 +87,7 @@ break if(ishuman(A)) - var/mob/living/carbon/human/H = A + var/mob/living/human/H = A if(!H.current_posture.prone) H.bloody_body(src) H.bloody_hands(src) @@ -121,7 +121,7 @@ return bled #undef BLOOD_SPRAY_DISTANCE -/mob/living/carbon/human/proc/remove_blood(var/amt) +/mob/living/human/proc/remove_blood(var/amt) if(!should_have_organ(BP_HEART)) //TODO: Make drips come from the reagents instead. return 0 if(!amt) @@ -130,7 +130,7 @@ return vessel.remove_any(amt) //Transfers blood from reagents to vessel, respecting blood types compatability. -/mob/living/carbon/human/inject_blood(var/amount, var/datum/reagents/donor) +/mob/living/human/inject_blood(var/amount, var/datum/reagents/donor) if(!should_have_organ(BP_HEART)) add_to_reagents(species.blood_reagent, amount, REAGENT_DATA(donor, species.blood_reagent)) return @@ -146,7 +146,7 @@ adjust_blood(amount, injected_data) ..() -/mob/living/carbon/human/proc/regenerate_blood(var/amount) +/mob/living/human/proc/regenerate_blood(var/amount) amount *= (species.blood_volume / SPECIES_BLOOD_DEFAULT) var/stress_modifier = get_stress_modifier() @@ -160,7 +160,7 @@ return amount //For humans, blood does not appear from blue, it comes from vessels. -/mob/living/carbon/human/take_blood(obj/item/chems/container, var/amount) +/mob/living/human/take_blood(obj/item/chems/container, var/amount) if(!vessel) make_blood() @@ -177,11 +177,11 @@ return 1 //Percentage of maximum blood volume. -/mob/living/carbon/human/proc/get_blood_volume() +/mob/living/human/proc/get_blood_volume() return species.blood_volume ? round((vessel.total_volume/species.blood_volume)*100) : 0 //Percentage of maximum blood volume, affected by the condition of circulation organs -/mob/living/carbon/human/proc/get_blood_circulation() +/mob/living/human/proc/get_blood_circulation() var/obj/item/organ/internal/heart/heart = get_organ(BP_HEART, /obj/item/organ/internal/heart) @@ -218,11 +218,11 @@ return min(blood_volume, 100) //Whether the species needs blood to carry oxygen. Used in get_blood_oxygenation and may be expanded based on blood rather than species in the future. -/mob/living/carbon/human/proc/blood_carries_oxygen() +/mob/living/human/proc/blood_carries_oxygen() return species.blood_oxy //Percentage of maximum blood volume, affected by the condition of circulation organs, affected by the oxygen loss. What ultimately matters for brain -/mob/living/carbon/human/proc/get_blood_oxygenation() +/mob/living/human/proc/get_blood_oxygenation() var/blood_volume = get_blood_circulation() if(blood_carries_oxygen()) if(is_asystole()) // Heart is missing or isn't beating and we're not breathing (hardcrit) diff --git a/code/modules/mob/living/human/human_damage.dm b/code/modules/mob/living/human/human_damage.dm index 6d5291d3d3b..0e04852a94a 100644 --- a/code/modules/mob/living/human/human_damage.dm +++ b/code/modules/mob/living/human/human_damage.dm @@ -1,24 +1,24 @@ -/mob/living/carbon/human/get_life_damage_types() +/mob/living/human/get_life_damage_types() var/static/list/brain_life_damage_types = list( BRAIN ) return brain_life_damage_types //Updates the mob's health from organs and mob damage variables -/mob/living/carbon/human/update_health() +/mob/living/human/update_health() . = ..() //TODO: fix husking if(. && stat == DEAD && (get_damage(BRUTE) - get_damage(BURN)) < get_config_value(/decl/config/num/health_health_threshold_dead)) add_genetic_condition(GENE_COND_HUSK) -/mob/living/carbon/human/adjustBrainLoss(var/amount, var/do_update_health = TRUE) +/mob/living/human/adjustBrainLoss(var/amount, var/do_update_health = TRUE) if(!(status_flags & GODMODE) && should_have_organ(BP_BRAIN)) var/obj/item/organ/internal/sponge = GET_INTERNAL_ORGAN(src, BP_BRAIN) if(sponge) sponge.take_internal_damage(amount) ..() -/mob/living/carbon/human/setBrainLoss(var/amount) +/mob/living/human/setBrainLoss(var/amount) if(status_flags & GODMODE) return 0 //godmode if(should_have_organ(BP_BRAIN)) var/obj/item/organ/internal/sponge = GET_INTERNAL_ORGAN(src, BP_BRAIN) @@ -26,7 +26,7 @@ sponge.damage = min(max(amount, 0),sponge.species.total_health) update_health() -/mob/living/carbon/human/getBrainLoss() +/mob/living/human/getBrainLoss() if(status_flags & GODMODE) return 0 //godmode if(should_have_organ(BP_BRAIN)) var/obj/item/organ/internal/sponge = GET_INTERNAL_ORGAN(src, BP_BRAIN) @@ -40,17 +40,17 @@ return 0 //Straight pain values, not affected by painkillers etc -/mob/living/carbon/human/getHalLoss() +/mob/living/human/getHalLoss() if(isnull(last_pain)) last_pain = 0 for(var/obj/item/organ/external/E in get_external_organs()) last_pain += E.get_pain() return last_pain -/mob/living/carbon/human/setHalLoss(var/amount) +/mob/living/human/setHalLoss(var/amount) take_damage(get_damage(PAIN)-amount, PAIN) -/mob/living/carbon/human/adjustHalLoss(var/amount, var/do_update_health = TRUE) +/mob/living/human/adjustHalLoss(var/amount, var/do_update_health = TRUE) var/heal = (amount < 0) amount = abs(amount) var/list/limbs = get_external_organs() @@ -71,7 +71,7 @@ update_health() //These procs fetch a cumulative total damage from all organs -/mob/living/carbon/human/getBruteLoss() +/mob/living/human/getBruteLoss() var/amount = 0 for(var/obj/item/organ/external/O in get_external_organs()) if(BP_IS_PROSTHETIC(O) && !O.is_vital_to_owner()) @@ -79,7 +79,7 @@ amount += O.brute_dam return amount -/mob/living/carbon/human/getFireLoss() +/mob/living/human/getFireLoss() var/amount = 0 for(var/obj/item/organ/external/O in get_external_organs()) if(BP_IS_PROSTHETIC(O) && !O.is_vital_to_owner()) @@ -87,7 +87,7 @@ amount += O.burn_dam return amount -/mob/living/carbon/human/adjustBruteLoss(var/amount, var/do_update_health = TRUE) +/mob/living/human/adjustBruteLoss(var/amount, var/do_update_health = TRUE) SHOULD_CALL_PARENT(FALSE) // take/heal overall call update_health regardless of arg if(amount > 0) take_overall_damage(amount, 0) @@ -95,23 +95,23 @@ heal_overall_damage(-amount, 0) BITSET(hud_updateflag, HEALTH_HUD) -/mob/living/carbon/human/adjustFireLoss(var/amount, var/do_update_health = TRUE) +/mob/living/human/adjustFireLoss(var/amount, var/do_update_health = TRUE) if(amount > 0) take_overall_damage(0, amount) else heal_overall_damage(0, -amount) BITSET(hud_updateflag, HEALTH_HUD) -/mob/living/carbon/human/getCloneLoss() +/mob/living/human/getCloneLoss() var/amount = 0 for(var/obj/item/organ/external/E in get_external_organs()) amount += E.get_genetic_damage() return amount -/mob/living/carbon/human/setCloneLoss(var/amount) +/mob/living/human/setCloneLoss(var/amount) take_damage(get_damage(CLONE)-amount, CLONE) -/mob/living/carbon/human/adjustCloneLoss(var/amount, var/do_update_health = TRUE) +/mob/living/human/adjustCloneLoss(var/amount, var/do_update_health = TRUE) var/heal = amount < 0 amount = abs(amount) var/list/limbs = get_external_organs() @@ -127,19 +127,19 @@ BITSET(hud_updateflag, HEALTH_HUD) ..() -/mob/living/carbon/human/proc/getOxyLossPercent() +/mob/living/human/proc/getOxyLossPercent() return (get_damage(OXY) / species.total_health) * 100 -/mob/living/carbon/human/getOxyLoss() +/mob/living/human/getOxyLoss() if(need_breathe()) var/obj/item/organ/internal/lungs/breathe_organ = get_organ(get_bodytype().breathing_organ, /obj/item/organ/internal/lungs) return breathe_organ ? breathe_organ.oxygen_deprivation : species.total_health return 0 -/mob/living/carbon/human/setOxyLoss(var/amount) +/mob/living/human/setOxyLoss(var/amount) take_damage(amount - get_damage(OXY), OXY) -/mob/living/carbon/human/adjustOxyLoss(var/damage, var/do_update_health = TRUE) +/mob/living/human/adjustOxyLoss(var/damage, var/do_update_health = TRUE) . = FALSE if(need_breathe()) var/obj/item/organ/internal/lungs/breathe_organ = get_organ(get_bodytype().breathing_organ, /obj/item/organ/internal/lungs) @@ -149,7 +149,7 @@ . = TRUE ..(do_update_health = FALSE) // Oxyloss cannot directly kill humans -/mob/living/carbon/human/getToxLoss() +/mob/living/human/getToxLoss() if((species.species_flags & SPECIES_FLAG_NO_POISON) || isSynthetic()) return 0 var/amount = 0 @@ -157,12 +157,12 @@ amount += I.getToxLoss() return amount -/mob/living/carbon/human/setToxLoss(var/amount) +/mob/living/human/setToxLoss(var/amount) if(!(species.species_flags & SPECIES_FLAG_NO_POISON) && !isSynthetic()) take_damage(get_damage(TOX)-amount, TOX) // TODO: better internal organ damage procs. -/mob/living/carbon/human/adjustToxLoss(var/amount, var/do_update_health = TRUE) +/mob/living/human/adjustToxLoss(var/amount, var/do_update_health = TRUE) if((species.species_flags & SPECIES_FLAG_NO_POISON) || isSynthetic()) return @@ -218,7 +218,7 @@ if(do_update_health) update_health() -/mob/living/carbon/human/proc/can_autoheal(var/dam_type) +/mob/living/human/proc/can_autoheal(var/dam_type) if(!species || !dam_type) return FALSE if(dam_type == BRUTE || dam_type == BURN) @@ -228,7 +228,7 @@ //////////////////////////////////////////// //Returns a list of damaged organs -/mob/living/carbon/human/proc/get_damaged_organs(var/brute, var/burn) +/mob/living/human/proc/get_damaged_organs(var/brute, var/burn) var/list/obj/item/organ/external/parts = list() for(var/obj/item/organ/external/O in get_external_organs()) if((brute && O.brute_dam) || (burn && O.burn_dam)) @@ -236,7 +236,7 @@ return parts //Returns a list of damageable organs -/mob/living/carbon/human/proc/get_damageable_organs() +/mob/living/human/proc/get_damageable_organs() var/list/obj/item/organ/external/parts = list() for(var/obj/item/organ/external/O in get_external_organs()) if(O.is_damageable()) @@ -246,7 +246,7 @@ //Heals ONE external organ, organ gets randomly selected from damaged ones. //It automatically updates damage overlays if necesary //It automatically updates health status -/mob/living/carbon/human/heal_organ_damage(var/brute, var/burn, var/affect_robo = FALSE, var/update_health = TRUE) +/mob/living/human/heal_organ_damage(var/brute, var/burn, var/affect_robo = FALSE, var/update_health = TRUE) var/list/obj/item/organ/external/parts = get_damaged_organs(brute,burn) if(!parts.len) return var/obj/item/organ/external/picked = pick(parts) @@ -263,7 +263,7 @@ In most cases it makes more sense to use apply_damage() instead! And make sure t //Damages ONE external organ, organ gets randomly selected from damagable ones. //It automatically updates damage overlays if necesary //It automatically updates health status -/mob/living/carbon/human/take_organ_damage(var/brute = 0, var/burn = 0, var/bypass_armour = FALSE, var/override_droplimb) +/mob/living/human/take_organ_damage(var/brute = 0, var/burn = 0, var/bypass_armour = FALSE, var/override_droplimb) var/list/parts = get_damageable_organs() if(!length(parts)) return @@ -273,7 +273,7 @@ In most cases it makes more sense to use apply_damage() instead! And make sure t update_health() //Heal MANY external organs, in random order -/mob/living/carbon/human/heal_overall_damage(var/brute, var/burn) +/mob/living/human/heal_overall_damage(var/brute, var/burn) var/list/obj/item/organ/external/parts = get_damaged_organs(brute,burn) while(parts.len && (brute>0 || burn>0) ) @@ -292,7 +292,7 @@ In most cases it makes more sense to use apply_damage() instead! And make sure t BITSET(hud_updateflag, HEALTH_HUD) // damage MANY external organs, in random order -/mob/living/carbon/human/take_overall_damage(var/brute, var/burn, var/sharp = 0, var/edge = 0, var/used_weapon = null) +/mob/living/human/take_overall_damage(var/brute, var/burn, var/sharp = 0, var/edge = 0, var/used_weapon = null) if(status_flags & GODMODE) return //godmode @@ -320,17 +320,17 @@ In most cases it makes more sense to use apply_damage() instead! And make sure t /* This function restores all organs. */ -/mob/living/carbon/human/restore_all_organs(var/ignore_organ_aspects) +/mob/living/human/restore_all_organs(var/ignore_organ_aspects) get_bodytype()?.create_missing_organs(src) // root body part should never be missing on a mob for(var/bodypart in global.all_limb_tags_by_depth) var/obj/item/organ/external/current_organ = GET_EXTERNAL_ORGAN(src, bodypart) if(current_organ) current_organ.rejuvenate(ignore_organ_aspects) recheck_bad_external_organs() - verbs -= /mob/living/carbon/human/proc/undislocate + verbs -= /mob/living/human/proc/undislocate -/mob/living/carbon/human/apply_damage(var/damage = 0, var/damagetype = BRUTE, var/def_zone = null, var/damage_flags = 0, var/obj/used_weapon = null, var/armor_pen, var/silent = FALSE, var/obj/item/organ/external/given_organ = null) +/mob/living/human/apply_damage(var/damage = 0, var/damagetype = BRUTE, var/def_zone = null, var/damage_flags = 0, var/obj/used_weapon = null, var/armor_pen, var/silent = FALSE, var/obj/item/organ/external/given_organ = null) if(status_flags & GODMODE) return //godmode @@ -392,7 +392,7 @@ This function restores all organs. return created_wound // Find out in how much pain the mob is at the moment. -/mob/living/carbon/human/proc/get_shock() +/mob/living/human/proc/get_shock() if (!can_feel_pain()) return 0 diff --git a/code/modules/mob/living/human/human_defense.dm b/code/modules/mob/living/human/human_defense.dm index 7f8b1edb5a1..8968e71fdf1 100644 --- a/code/modules/mob/living/human/human_defense.dm +++ b/code/modules/mob/living/human/human_defense.dm @@ -7,7 +7,7 @@ meteor_act */ -/mob/living/carbon/human/bullet_act(var/obj/item/projectile/P, var/def_zone) +/mob/living/human/bullet_act(var/obj/item/projectile/P, var/def_zone) def_zone = check_zone(def_zone, src) if(!has_organ(def_zone)) @@ -28,7 +28,7 @@ meteor_act return blocked -/mob/living/carbon/human/stun_effect_act(var/stun_amount, var/agony_amount, var/def_zone) +/mob/living/human/stun_effect_act(var/stun_amount, var/agony_amount, var/def_zone) var/obj/item/organ/external/affected = GET_EXTERNAL_ORGAN(src, def_zone) if(!affected) return @@ -47,7 +47,7 @@ meteor_act ..(stun_amount, agony_amount, def_zone) -/mob/living/carbon/human/get_blocked_ratio(def_zone, damage_type, damage_flags, armor_pen, damage) +/mob/living/human/get_blocked_ratio(def_zone, damage_type, damage_flags, armor_pen, damage) if(!def_zone && (damage_flags & DAM_DISPERSED)) var/tally for(var/zone in organ_rel_size) @@ -58,7 +58,7 @@ meteor_act return return ..() -/mob/living/carbon/human/get_armors_by_zone(obj/item/organ/external/def_zone, damage_type, damage_flags) +/mob/living/human/get_armors_by_zone(obj/item/organ/external/def_zone, damage_type, damage_flags) if(!def_zone) def_zone = ran_zone() if(!istype(def_zone)) @@ -85,7 +85,7 @@ meteor_act // Add inherent armor to the end of list so that protective equipment is checked first . += ..() -/mob/living/carbon/human/proc/check_head_coverage() +/mob/living/human/proc/check_head_coverage() for(var/slot in global.standard_headgear_slots) var/obj/item/clothing/clothes = get_equipped_item(slot) if(istype(clothes) && (clothes.body_parts_covered & SLOT_HEAD)) @@ -93,13 +93,13 @@ meteor_act return FALSE //Used to check if they can be fed food/drinks/pills -/mob/living/carbon/human/check_mouth_coverage() +/mob/living/human/check_mouth_coverage() for(var/slot in global.standard_headgear_slots) var/obj/item/gear = get_equipped_item(slot) if(istype(gear) && (gear.body_parts_covered & SLOT_FACE) && !(gear.item_flags & ITEM_FLAG_FLEXIBLEMATERIAL)) return gear -/mob/living/carbon/human/resolve_item_attack(obj/item/I, mob/living/user, var/target_zone) +/mob/living/human/resolve_item_attack(obj/item/I, mob/living/user, var/target_zone) for (var/obj/item/grab/G in grabbed_by) if(G.resolve_item_attack(user, I, target_zone)) @@ -129,7 +129,7 @@ meteor_act return hit_zone -/mob/living/carbon/human/hit_with_weapon(obj/item/I, mob/living/user, var/effective_force, var/hit_zone) +/mob/living/human/hit_with_weapon(obj/item/I, mob/living/user, var/effective_force, var/hit_zone) var/obj/item/organ/external/affecting = GET_EXTERNAL_ORGAN(src, hit_zone) if(!affecting) return //should be prevented by attacked_with_item() but for sanity. @@ -145,7 +145,7 @@ meteor_act return standard_weapon_hit_effects(I, user, effective_force, hit_zone) -/mob/living/carbon/human/standard_weapon_hit_effects(obj/item/I, mob/living/user, var/effective_force, var/hit_zone) +/mob/living/human/standard_weapon_hit_effects(obj/item/I, mob/living/user, var/effective_force, var/hit_zone) var/obj/item/organ/external/affecting = GET_EXTERNAL_ORGAN(src, hit_zone) if(!affecting) return 0 @@ -189,7 +189,7 @@ meteor_act return 1 -/mob/living/carbon/human/proc/attack_bloody(obj/item/W, mob/attacker, var/effective_force, var/hit_zone) +/mob/living/human/proc/attack_bloody(obj/item/W, mob/attacker, var/effective_force, var/hit_zone) if(W.atom_damage_type != BRUTE) return @@ -209,7 +209,7 @@ meteor_act if(istype(location) && location.simulated) location.add_blood(src) if(ishuman(attacker)) - var/mob/living/carbon/human/H = attacker + var/mob/living/human/H = attacker if(get_dist(H, src) <= 1) //people with TK won't get smeared with blood H.bloody_body(src) H.bloody_hands(src) @@ -231,7 +231,7 @@ meteor_act if(BP_CHEST) bloody_body(src) -/mob/living/carbon/human/proc/projectile_hit_bloody(obj/item/projectile/P, var/effective_force, var/hit_zone, var/obj/item/organ/external/organ) +/mob/living/human/proc/projectile_hit_bloody(obj/item/projectile/P, var/effective_force, var/hit_zone, var/obj/item/organ/external/organ) if(P.atom_damage_type != BRUTE || P.nodamage) return if(!(P.sharp || prob(effective_force*4))) @@ -248,7 +248,7 @@ meteor_act C.add_blood(src) C.update_clothing_icon() -/mob/living/carbon/human/proc/attack_joint(var/obj/item/organ/external/organ, var/obj/item/W, var/effective_force, var/dislocate_mult, var/blocked) +/mob/living/human/proc/attack_joint(var/obj/item/organ/external/organ, var/obj/item/W, var/effective_force, var/dislocate_mult, var/blocked) if(!organ || organ.is_dislocated() || !(organ.limb_flags & ORGAN_FLAG_CAN_DISLOCATE) || blocked >= 100) return 0 if(W.atom_damage_type != BRUTE) @@ -262,7 +262,7 @@ meteor_act return 1 return 0 -/mob/living/carbon/human/emag_act(var/remaining_charges, mob/user, var/emag_source) +/mob/living/human/emag_act(var/remaining_charges, mob/user, var/emag_source) var/obj/item/organ/external/affecting = GET_EXTERNAL_ORGAN(src, user.get_target_zone()) if(!affecting || !affecting.is_robotic()) to_chat(user, "That limb isn't robotic.") @@ -274,7 +274,7 @@ meteor_act affecting.status |= ORGAN_SABOTAGED return 1 -/mob/living/carbon/human/hitby(atom/movable/AM, var/datum/thrownthing/TT) +/mob/living/human/hitby(atom/movable/AM, var/datum/thrownthing/TT) // empty active hand and we're in throw mode, so we can catch it if(isobj(AM) && in_throw_mode && !get_active_held_item() && TT.speed <= THROWFORCE_SPEED_DIVISOR && !incapacitated() && isturf(AM.loc)) put_in_active_hand(AM) @@ -284,7 +284,7 @@ meteor_act return FALSE return ..() -/mob/living/carbon/human/proc/bloody_hands(var/mob/living/source, var/amount = 2) +/mob/living/human/proc/bloody_hands(var/mob/living/source, var/amount = 2) var/obj/item/clothing/gloves/gloves = get_equipped_item(slot_gloves_str) if(istype(gloves)) gloves.add_blood(source, amount) @@ -293,7 +293,7 @@ meteor_act //updates on-mob overlays for bloody hands and/or bloody gloves update_equipment_overlay(slot_gloves_str) -/mob/living/carbon/human/proc/bloody_body(var/mob/living/source) +/mob/living/human/proc/bloody_body(var/mob/living/source) var/obj/item/gear = get_equipped_item(slot_wear_suit_str) if(gear) gear.add_blood(source) @@ -303,7 +303,7 @@ meteor_act gear.add_blood(source) update_equipment_overlay(slot_w_uniform_str, redraw_mob = FALSE) -/mob/living/carbon/human/proc/handle_suit_punctures(var/damtype, var/damage, var/def_zone) +/mob/living/human/proc/handle_suit_punctures(var/damtype, var/damage, var/def_zone) // Tox and oxy don't matter to suits. if(damtype != BURN && damtype != BRUTE) return @@ -318,7 +318,7 @@ meteor_act if(istype(suit)) suit.create_breaches(damtype, damage) -/mob/living/carbon/human/reagent_permeability() +/mob/living/human/reagent_permeability() var/perm = 0 var/list/perm_by_part = list( @@ -354,7 +354,7 @@ meteor_act return perm -/mob/living/carbon/human/lava_act(datum/gas_mixture/air, temperature, pressure) +/mob/living/human/lava_act(datum/gas_mixture/air, temperature, pressure) var/was_burned = FireBurn(0.4 * vsc.fire_firelevel_multiplier, temperature, pressure) if (was_burned) fire_act(air, temperature) @@ -362,7 +362,7 @@ meteor_act //Removed the horrible safety parameter. It was only being used by ninja code anyways. //Now checks siemens_coefficient of the affected area by default -/mob/living/carbon/human/electrocute_act(var/shock_damage, var/obj/source, var/base_siemens_coeff = 1.0, var/def_zone = null) +/mob/living/human/electrocute_act(var/shock_damage, var/obj/source, var/base_siemens_coeff = 1.0, var/def_zone = null) if(status_flags & GODMODE) return 0 //godmode @@ -415,7 +415,7 @@ meteor_act return shock_damage -/mob/living/carbon/human/explosion_act(severity) +/mob/living/human/explosion_act(severity) ..() if(QDELETED(src)) return @@ -454,7 +454,7 @@ meteor_act //Used by various things that knock people out by applying blunt trauma to the head. //Checks that the species has a "head" (brain containing organ) and that hit_zone refers to it. -/mob/living/carbon/human/proc/headcheck(var/target_zone, var/brain_tag = BP_BRAIN) +/mob/living/human/proc/headcheck(var/target_zone, var/brain_tag = BP_BRAIN) target_zone = check_zone(target_zone, src) @@ -470,7 +470,7 @@ meteor_act return prob(100 / 2**(head.w_class - brain.w_class - 1)) return TRUE -/mob/living/carbon/human/flash_eyes(var/intensity = FLASH_PROTECTION_MODERATE, override_blindness_check = FALSE, affect_silicon = FALSE, visual = FALSE, type = /obj/screen/fullscreen/flash) +/mob/living/human/flash_eyes(var/intensity = FLASH_PROTECTION_MODERATE, override_blindness_check = FALSE, affect_silicon = FALSE, visual = FALSE, type = /obj/screen/fullscreen/flash) var/vision_organ_tag = get_vision_organ_tag() if(vision_organ_tag) var/obj/item/organ/internal/eyes/I = get_organ(vision_organ_tag, /obj/item/organ/internal/eyes) @@ -482,7 +482,7 @@ meteor_act Contians the proc to handle radiation. Specifically made to do radiation burns. */ -/mob/living/carbon/human/apply_radiation(damage) +/mob/living/human/apply_radiation(damage) ..() if(!isSynthetic() && !ignore_rads) damage = 0.25 * damage * (species ? species.get_radiation_mod(src) : 1) diff --git a/code/modules/mob/living/human/human_defines.dm b/code/modules/mob/living/human/human_defines.dm index af8c3bc7cf4..71c332ff74b 100644 --- a/code/modules/mob/living/human/human_defines.dm +++ b/code/modules/mob/living/human/human_defines.dm @@ -1,4 +1,4 @@ -/mob/living/carbon/human +/mob/living/human ai = /datum/ai/human mob_bump_flag = HUMAN diff --git a/code/modules/mob/living/human/human_grabs.dm b/code/modules/mob/living/human/human_grabs.dm index 37c1c45832a..dc1476fecc2 100644 --- a/code/modules/mob/living/human/human_grabs.dm +++ b/code/modules/mob/living/human/human_grabs.dm @@ -1,10 +1,10 @@ -/mob/living/carbon/human/add_grab(var/obj/item/grab/grab, var/defer_hand = FALSE) +/mob/living/human/add_grab(var/obj/item/grab/grab, var/defer_hand = FALSE) if(defer_hand) . = put_in_hands(grab) else . = put_in_active_hand(grab) -/mob/living/carbon/human/can_be_grabbed(var/mob/grabber, var/target_zone, var/defer_hand = FALSE) +/mob/living/human/can_be_grabbed(var/mob/grabber, var/target_zone, var/defer_hand = FALSE) . = ..() if(.) var/obj/item/organ/external/organ = GET_EXTERNAL_ORGAN(src, check_zone(target_zone, src)) @@ -28,7 +28,7 @@ if(istype(C)) C.leave_evidence(grabber) -/mob/living/carbon/human/make_grab(atom/movable/target, grab_tag = /decl/grab/simple, defer_hand = FALSE, force_grab_tag = FALSE) +/mob/living/human/make_grab(atom/movable/target, grab_tag = /decl/grab/simple, defer_hand = FALSE, force_grab_tag = FALSE) . = ..() if(.) remove_cloaking_source(species) diff --git a/code/modules/mob/living/human/human_helpers.dm b/code/modules/mob/living/human/human_helpers.dm index e1b056a1e2d..d5e995232d8 100644 --- a/code/modules/mob/living/human/human_helpers.dm +++ b/code/modules/mob/living/human/human_helpers.dm @@ -7,7 +7,7 @@ flash_protection += C.flash_protection; \ equipment_tint_total += C.get_equipment_tint(); -/mob/living/carbon/human/can_eat(var/food, var/feedback = 1) +/mob/living/human/can_eat(var/food, var/feedback = 1) var/list/status = can_eat_status() if(status[1] == HUMAN_EATING_NO_ISSUE) return 1 @@ -18,7 +18,7 @@ to_chat(src, "\The [status[2]] is in the way!") return 0 -/mob/living/carbon/human/can_force_feed(var/feeder, var/food, var/feedback = 1) +/mob/living/human/can_force_feed(var/feeder, var/food, var/feedback = 1) var/list/status = can_eat_status() if(status[1] == HUMAN_EATING_NO_ISSUE) return 1 @@ -29,7 +29,7 @@ to_chat(feeder, "\The [status[2]] is in the way!") return 0 -/mob/living/carbon/human/proc/can_eat_status() +/mob/living/human/proc/can_eat_status() if(!check_has_mouth()) return list(HUMAN_EATING_NBP_MOUTH) var/obj/item/blocked = check_mouth_coverage() @@ -41,7 +41,7 @@ #undef HUMAN_EATING_NBP_MOUTH #undef HUMAN_EATING_BLOCKED_MOUTH -/mob/living/carbon/human/proc/update_equipment_vision() +/mob/living/human/proc/update_equipment_vision() flash_protection = 0 equipment_tint_total = 0 equipment_see_invis = 0 @@ -69,7 +69,7 @@ if(rig) process_rig(rig) -/mob/living/carbon/human/proc/process_glasses(var/obj/item/clothing/glasses/G) +/mob/living/human/proc/process_glasses(var/obj/item/clothing/glasses/G) if(G) // prescription applies regardless of if the glasses are active equipment_prescription += G.prescription @@ -88,12 +88,12 @@ add_clothing_protection(G) G.process_hud(src) -/mob/living/carbon/human/proc/process_rig(var/obj/item/rig/O) +/mob/living/human/proc/process_rig(var/obj/item/rig/O) var/obj/item/head = get_equipped_item(slot_head_str) if(O.visor && O.visor.active && O.visor.vision && O.visor.vision.glasses && (!O.helmet || (head && O.helmet == head))) process_glasses(O.visor.vision.glasses) -/mob/living/carbon/human/fully_replace_character_name(var/new_name, var/in_depth = TRUE) +/mob/living/human/fully_replace_character_name(var/new_name, var/in_depth = TRUE) var/old_name = real_name . = ..() if(!. || !in_depth) @@ -124,10 +124,10 @@ if(rig?.update_visible_name) rig.visible_name = real_name -/mob/living/carbon/human +/mob/living/human var/next_sonar_ping = 0 -/mob/living/carbon/human/proc/sonar_ping() +/mob/living/human/proc/sonar_ping() set name = "Listen In" set desc = "Allows you to listen in to movement and noises around you." set category = "IC" @@ -179,10 +179,10 @@ if(!heard_something) to_chat(src, "You hear no movement but your own.") -/mob/living/carbon/human/proc/has_headset_in_ears() +/mob/living/human/proc/has_headset_in_ears() return istype(get_equipped_item(slot_l_ear_str), /obj/item/radio/headset) || istype(get_equipped_item(slot_r_ear_str), /obj/item/radio/headset) -/mob/living/carbon/human/welding_eyecheck() +/mob/living/human/welding_eyecheck() var/vision_organ_tag = get_vision_organ_tag() if(!vision_organ_tag) return @@ -220,11 +220,11 @@ SET_STATUS_MAX(src, STAT_BLURRY, 5) add_genetic_condition(GENE_COND_NEARSIGHTED, 10 SECONDS) -/mob/living/carbon/human +/mob/living/human var/list/cloaking_sources // Returns true if, and only if, the human has gone from uncloaked to cloaked -/mob/living/carbon/human/proc/add_cloaking_source(var/datum/cloaking_source) +/mob/living/human/proc/add_cloaking_source(var/datum/cloaking_source) var/has_uncloaked = clean_cloaking_sources() LAZYDISTINCTADD(cloaking_sources, weakref(cloaking_source)) @@ -239,7 +239,7 @@ #define CLOAK_APPEAR_SELF "You have re-appeared." // Returns true if, and only if, the human has gone from cloaked to uncloaked -/mob/living/carbon/human/proc/remove_cloaking_source(var/datum/cloaking_source) +/mob/living/human/proc/remove_cloaking_source(var/datum/cloaking_source) var/was_cloaked = LAZYLEN(cloaking_sources) clean_cloaking_sources() LAZYREMOVE(cloaking_sources, weakref(cloaking_source)) @@ -254,7 +254,7 @@ /mob/proc/is_cloaked() return FALSE -/mob/living/carbon/human/is_cloaked() +/mob/living/human/is_cloaked() if(clean_cloaking_sources()) update_icon() visible_message(CLOAK_APPEAR_OTHER, CLOAK_APPEAR_SELF) @@ -264,11 +264,11 @@ #undef CLOAK_APPEAR_SELF // Returns true if the human is cloaked by the given source -/mob/living/carbon/human/proc/is_cloaked_by(var/cloaking_source) +/mob/living/human/proc/is_cloaked_by(var/cloaking_source) return LAZYISIN(cloaking_sources, weakref(cloaking_source)) // Returns true if this operation caused the mob to go from cloaked to uncloaked -/mob/living/carbon/human/proc/clean_cloaking_sources() +/mob/living/human/proc/clean_cloaking_sources() if(!cloaking_sources) return FALSE @@ -286,11 +286,11 @@ UNSETEMPTY(cloaking_sources) return !cloaking_sources // If cloaking_sources wasn't initially null but is now, we've uncloaked -/mob/living/carbon/human/proc/has_meson_effect() +/mob/living/human/proc/has_meson_effect() var/datum/global_hud/global_hud = get_global_hud() return (global_hud.meson in equipment_overlays) -/mob/living/carbon/human/proc/is_in_pocket(var/obj/item/I) +/mob/living/human/proc/is_in_pocket(var/obj/item/I) for(var/slot in global.pocket_slots) if(get_equipped_item(slot) == I) return TRUE diff --git a/code/modules/mob/living/human/human_internals.dm b/code/modules/mob/living/human/human_internals.dm index 126045b5b00..f77c5000586 100644 --- a/code/modules/mob/living/human/human_internals.dm +++ b/code/modules/mob/living/human/human_internals.dm @@ -1,7 +1,7 @@ -/mob/living/carbon/human/get_internals() +/mob/living/human/get_internals() return internal -/mob/living/carbon/human/set_internals(obj/item/tank/source, source_string) +/mob/living/human/set_internals(obj/item/tank/source, source_string) ..() internal = source if(internals) diff --git a/code/modules/mob/living/human/human_maneuvers.dm b/code/modules/mob/living/human/human_maneuvers.dm index f106bf43d9c..b06ca93faea 100644 --- a/code/modules/mob/living/human/human_maneuvers.dm +++ b/code/modules/mob/living/human/human_maneuvers.dm @@ -1,12 +1,12 @@ -/mob/living/carbon/human/get_acrobatics_multiplier(var/decl/maneuver/attempting_maneuver) +/mob/living/human/get_acrobatics_multiplier(var/decl/maneuver/attempting_maneuver) . = 0.5 + ((get_skill_value(SKILL_HAULING) - SKILL_MIN)/(SKILL_MAX - SKILL_MIN)) if(skill_check(SKILL_HAULING, SKILL_BASIC)) . = max(..(), .) -/mob/living/carbon/human/get_jump_distance() +/mob/living/human/get_jump_distance() return species.standing_jump_range -/mob/living/carbon/human/can_do_maneuver(var/decl/maneuver/maneuver, var/silent = FALSE) +/mob/living/human/can_do_maneuver(var/decl/maneuver/maneuver, var/silent = FALSE) . = ..() if(.) if(nutrition <= 20) diff --git a/code/modules/mob/living/human/human_movement.dm b/code/modules/mob/living/human/human_movement.dm index b313eebcd05..1a590d41e43 100644 --- a/code/modules/mob/living/human/human_movement.dm +++ b/code/modules/mob/living/human/human_movement.dm @@ -1,7 +1,7 @@ -/mob/living/carbon/human +/mob/living/human move_intents = list(/decl/move_intent/walk) -/mob/living/carbon/human/get_movement_delay(var/travel_dir) +/mob/living/human/get_movement_delay(var/travel_dir) var/tally = ..() var/obj/item/organ/external/H = GET_EXTERNAL_ORGAN(src, BP_GROIN) // gets bodytype slowdown, which can be reset by set_bodytype @@ -64,11 +64,11 @@ return (tally+get_config_value(/decl/config/num/movement_human)) -/mob/living/carbon/human/size_strength_mod() +/mob/living/human/size_strength_mod() . = ..() . += species.strength -/mob/living/carbon/human/space_do_move(var/allow_move, var/direction) +/mob/living/human/space_do_move(var/allow_move, var/direction) if(allow_move == 1) var/obj/item/tank/jetpack/thrust = get_jetpack() if(thrust && thrust.on && prob(skill_fail_chance(SKILL_EVA, 10, SKILL_ADEPT))) @@ -83,7 +83,7 @@ . = ..() -/mob/living/carbon/human/slip_chance(var/prob_slip = 5) +/mob/living/human/slip_chance(var/prob_slip = 5) if(!..()) return 0 //Check hands and mod slip @@ -96,7 +96,7 @@ prob_slip -= 1 return prob_slip -/mob/living/carbon/human/Check_Shoegrip() +/mob/living/human/Check_Shoegrip() if(species.check_no_slip(src)) return 1 var/obj/item/shoes = get_equipped_item(slot_shoes_str) @@ -104,7 +104,7 @@ return 1 return 0 -/mob/living/carbon/human/Move() +/mob/living/human/Move() . = ..() if(.) //We moved @@ -131,7 +131,7 @@ var/turf/B = GetAbove(src) up_hint.icon_state = "uphint[!!(B && TURF_IS_MIMICKING(B))]" -/mob/living/carbon/human/proc/handle_leg_damage() +/mob/living/human/proc/handle_leg_damage() if(!can_feel_pain()) return var/crutches = 0 @@ -145,5 +145,5 @@ else E.add_pain(10) -/mob/living/carbon/human/can_sprint() +/mob/living/human/can_sprint() return (stamina > 0) diff --git a/code/modules/mob/living/human/human_organs.dm b/code/modules/mob/living/human/human_organs.dm index d438a8d6477..7dbeab31c6c 100644 --- a/code/modules/mob/living/human/human_organs.dm +++ b/code/modules/mob/living/human/human_organs.dm @@ -1,5 +1,5 @@ /// organ-related variables, see organ.dm and human_organs.dm, shouldn't be accessed directly -/mob/living/carbon/human +/mob/living/human /// organs we check until they are good. var/list/bad_external_organs /// organs grouped by category, largely used for stance calc @@ -11,34 +11,34 @@ /// unassociated list of external organs var/tmp/list/external_organs -/mob/living/carbon/human/get_organ(var/organ_tag, var/expected_type = /obj/item/organ) +/mob/living/human/get_organ(var/organ_tag, var/expected_type = /obj/item/organ) RETURN_TYPE(expected_type) var/obj/item/organ = LAZYACCESS(organs_by_tag, organ_tag) if(!expected_type || istype(organ, expected_type)) return organ -/mob/living/carbon/human/get_external_organs() +/mob/living/human/get_external_organs() return external_organs -/mob/living/carbon/human/get_internal_organs() +/mob/living/human/get_internal_organs() return internal_organs -/mob/living/carbon/human/has_organs() +/mob/living/human/has_organs() return (LAZYLEN(external_organs) + LAZYLEN(internal_organs)) > 0 -/mob/living/carbon/human/has_external_organs() +/mob/living/human/has_external_organs() return LAZYLEN(external_organs) > 0 -/mob/living/carbon/human/has_internal_organs() +/mob/living/human/has_internal_organs() return LAZYLEN(internal_organs) > 0 -/mob/living/carbon/human/get_organs_by_categories(var/list/categories) +/mob/living/human/get_organs_by_categories(var/list/categories) for(var/organ_cat in categories) if(organ_cat in organs_by_category) LAZYDISTINCTADD(., organs_by_category[organ_cat]) //Deletes all references to organs -/mob/living/carbon/human/delete_organs() +/mob/living/human/delete_organs() ..() organs_by_tag = null internal_organs = null @@ -49,13 +49,13 @@ //Registers an organ and setup the organ hierachy properly. //affected : Parent organ if applicable. //in_place : If true, we're performing an in-place replacement, without triggering anything related to adding the organ in-game as part of surgery or else. -/mob/living/carbon/human/add_organ(obj/item/organ/O, obj/item/organ/external/affected, in_place, update_icon, detached, skip_health_update = FALSE) +/mob/living/human/add_organ(obj/item/organ/O, obj/item/organ/external/affected, in_place, update_icon, detached, skip_health_update = FALSE) var/obj/item/organ/existing = LAZYACCESS(organs_by_tag, O.organ_tag) if(existing && O != existing) - CRASH("mob/living/carbon/human/add_organ(): '[O]' tried to overwrite [src]'s existing organ '[existing]' in slot '[O.organ_tag]'!") + CRASH("mob/living/human/add_organ(): '[O]' tried to overwrite [src]'s existing organ '[existing]' in slot '[O.organ_tag]'!") if(O.parent_organ && !LAZYACCESS(organs_by_tag, O.parent_organ)) - CRASH("mob/living/carbon/human/add_organ(): Tried to add an internal organ to a non-existing parent external organ!") + CRASH("mob/living/human/add_organ(): Tried to add an internal organ to a non-existing parent external organ!") //We don't add internal organs to the lists if we're detached if(O.is_internal() && !detached) @@ -93,7 +93,7 @@ //ignore_children: Skips recursively removing this organ's child organs. //in_place : If true we remove only the organ (no children items or implants) and avoid triggering mob changes and parent organs changes as much as possible. // Meant to be used for init and species transforms, without triggering any updates to mob state or anything related to losing a limb as part of surgery or combat. -/mob/living/carbon/human/remove_organ(var/obj/item/organ/O, var/drop_organ = TRUE, var/detach = TRUE, var/ignore_children = FALSE, var/in_place = FALSE, var/update_icon = TRUE, var/skip_health_update = FALSE) +/mob/living/human/remove_organ(var/obj/item/organ/O, var/drop_organ = TRUE, var/detach = TRUE, var/ignore_children = FALSE, var/in_place = FALSE, var/update_icon = TRUE, var/skip_health_update = FALSE) if(istype(O) && !in_place && O.is_vital_to_owner() && usr) admin_attack_log(usr, src, "Removed a vital organ ([src]).", "Had a vital organ ([src]) removed.", "removed a vital organ ([src]) from") if(!(. = ..())) @@ -120,16 +120,16 @@ hud_reset() queue_icon_update() //Avoids calling icon updates 50 times when removing multiple organs -/mob/living/carbon/human/get_bodytype() +/mob/living/human/get_bodytype() RETURN_TYPE(/decl/bodytype) // If the root organ ever changes/isn't always the chest, this will need to be changed. return get_organ(BP_CHEST, /obj/item/organ)?.bodytype -/mob/living/carbon/human/proc/get_bodypart_name(var/zone) +/mob/living/human/proc/get_bodypart_name(var/zone) var/obj/item/organ/external/E = GET_EXTERNAL_ORGAN(src, zone) return E?.name -/mob/living/carbon/human/proc/should_recheck_bad_external_organs() +/mob/living/human/proc/should_recheck_bad_external_organs() var/damage_this_tick = get_damage(TOX) for(var/obj/item/organ/external/O in get_external_organs()) damage_this_tick += O.burn_dam + O.brute_dam @@ -138,21 +138,21 @@ . = TRUE last_dam = damage_this_tick -/mob/living/carbon/human/proc/recheck_bad_external_organs() +/mob/living/human/proc/recheck_bad_external_organs() LAZYCLEARLIST(bad_external_organs) for(var/obj/item/organ/external/E in get_external_organs()) if(E.need_process()) LAZYDISTINCTADD(bad_external_organs, E) -/mob/living/carbon/human/proc/check_vital_organ_missing() +/mob/living/human/proc/check_vital_organ_missing() return get_bodytype()?.check_vital_organ_missing(src) -/mob/living/carbon/human/proc/process_internal_organs() +/mob/living/human/proc/process_internal_organs() for(var/obj/item/organ/I in internal_organs) I.Process() // Takes care of organ related updates, such as broken and missing limbs -/mob/living/carbon/human/proc/handle_organs() +/mob/living/human/proc/handle_organs() // Check for the presence (or lack of) vital organs like the brain. // Set a timer after this point, since we want a little bit of @@ -202,7 +202,7 @@ if (W.infection_check()) W.germ_level += 1 -/mob/living/carbon/human/proc/Check_Proppable_Object() +/mob/living/human/proc/Check_Proppable_Object() for(var/turf/T in RANGE_TURFS(src, 1)) //we only care for non-space turfs if(T.density && T.simulated) //walls work return 1 @@ -213,7 +213,7 @@ return 0 -/mob/living/carbon/human/on_lost_organ(var/obj/item/organ/O) +/mob/living/human/on_lost_organ(var/obj/item/organ/O) if(!(. = ..())) return //Move some blood over to the organ diff --git a/code/modules/mob/living/human/human_powers.dm b/code/modules/mob/living/human/human_powers.dm index 0113513663c..8a2246c31eb 100644 --- a/code/modules/mob/living/human/human_powers.dm +++ b/code/modules/mob/living/human/human_powers.dm @@ -1,7 +1,7 @@ /**************** true human verbs ****************/ -/mob/living/carbon/human/proc/tie_hair() +/mob/living/human/proc/tie_hair() set name = "Tie Hair" set desc = "Style your hair." set category = "IC" @@ -39,7 +39,7 @@ /**************** misc alien verbs ****************/ -/mob/living/carbon/human/proc/psychic_whisper(mob/M as mob in oview()) +/mob/living/human/proc/psychic_whisper(mob/M as mob in oview()) set name = "Psychic Whisper" set desc = "Whisper silently to someone over a distance." set category = "Abilities" diff --git a/code/modules/mob/living/human/human_resist.dm b/code/modules/mob/living/human/human_resist.dm index 83306d717e2..0aaad35e2ee 100644 --- a/code/modules/mob/living/human/human_resist.dm +++ b/code/modules/mob/living/human/human_resist.dm @@ -1,4 +1,4 @@ -/mob/living/carbon/human/process_resist() +/mob/living/human/process_resist() //drop && roll if(on_fire && !buckled) @@ -29,7 +29,7 @@ if(get_equipped_item(slot_handcuffed_str)) spawn() escape_handcuffs() -/mob/living/carbon/human/proc/escape_handcuffs() +/mob/living/human/proc/escape_handcuffs() //This line represent a significant buff to grabs... // We don't have to check the click cooldown because /mob/living/verb/resist() has done it for us, we can simply set the delay setClickCooldown(100) @@ -43,7 +43,7 @@ //A default in case you are somehow cuffed with something that isn't an obj/item/handcuffs type var/breakouttime = istype(cuffs) ? cuffs.breakouttime : 2 MINUTES - var/mob/living/carbon/human/H = src + var/mob/living/human/H = src if(istype(H) && istype(H.get_equipped_item(slot_gloves_str), /obj/item/clothing/gloves/rig)) breakouttime /= 2 @@ -95,7 +95,7 @@ drop_from_inventory(cuffs) return -/mob/living/carbon/human/proc/break_handcuffs() +/mob/living/human/proc/break_handcuffs() var/obj/item/cuffs = get_equipped_item(slot_handcuffed_str) visible_message( "[src] is trying to break \the [cuffs]!", diff --git a/code/modules/mob/living/human/human_skin.dm b/code/modules/mob/living/human/human_skin.dm index 5b37b43781f..54e4f7b3eab 100644 --- a/code/modules/mob/living/human/human_skin.dm +++ b/code/modules/mob/living/human/human_skin.dm @@ -1,7 +1,7 @@ -/mob/living/carbon/human +/mob/living/human var/skin_state = SKIN_NORMAL -/mob/living/carbon/human/proc/reset_skin() +/mob/living/human/proc/reset_skin() if(skin_state == SKIN_THREAT) skin_state = SKIN_NORMAL update_skin() \ No newline at end of file diff --git a/code/modules/mob/living/human/human_species.dm b/code/modules/mob/living/human/human_species.dm index 25878c1c622..c6d9d61e914 100644 --- a/code/modules/mob/living/human/human_species.dm +++ b/code/modules/mob/living/human/human_species.dm @@ -1,28 +1,28 @@ -/mob/living/carbon/human/dummy +/mob/living/human/dummy real_name = "test dummy" status_flags = GODMODE|CANPUSH virtual_mob = null -/mob/living/carbon/human/dummy/mannequin/Initialize(mapload, species_name, datum/mob_snapshot/supplied_appearance) +/mob/living/human/dummy/mannequin/Initialize(mapload, species_name, datum/mob_snapshot/supplied_appearance) . = ..() STOP_PROCESSING(SSmobs, src) global.human_mob_list -= src -/mob/living/carbon/human/dummy/selfdress/Initialize(mapload, species_name, datum/mob_snapshot/supplied_appearance) +/mob/living/human/dummy/selfdress/Initialize(mapload, species_name, datum/mob_snapshot/supplied_appearance) ..() return INITIALIZE_HINT_LATELOAD -/mob/living/carbon/human/dummy/selfdress/LateInitialize() +/mob/living/human/dummy/selfdress/LateInitialize() for(var/obj/item/I in loc) equip_to_appropriate_slot(I) -/mob/living/carbon/human/corpse +/mob/living/human/corpse real_name = "corpse" -/mob/living/carbon/human/corpse/get_death_message(gibbed) +/mob/living/human/corpse/get_death_message(gibbed) return SKIP_DEATH_MESSAGE -/mob/living/carbon/human/corpse/Initialize(mapload, species_name, datum/mob_snapshot/supplied_appearance, obj/abstract/landmark/corpse/corpse) +/mob/living/human/corpse/Initialize(mapload, species_name, datum/mob_snapshot/supplied_appearance, obj/abstract/landmark/corpse/corpse) . = ..(mapload, species_name, supplied_appearance) // do not pass the corpse landmark var/decl/cultural_info/culture = get_cultural_value(TAG_CULTURE) if(culture) @@ -37,10 +37,10 @@ corpse.equip_corpse_outfit(src) return INITIALIZE_HINT_LATELOAD -/mob/living/carbon/human/corpse/get_death_message(gibbed) +/mob/living/human/corpse/get_death_message(gibbed) return SKIP_DEATH_MESSAGE -/mob/living/carbon/human/corpse/LateInitialize() +/mob/living/human/corpse/LateInitialize() ..() var/current_max_health = get_max_health() take_damage(current_max_health, OXY) //cease life functions @@ -50,22 +50,22 @@ if(corpse_heart) corpse_heart.pulse = PULSE_NONE//actually stops heart to make worried explorers not care too much -/mob/living/carbon/human/dummy/mannequin/add_to_living_mob_list() +/mob/living/human/dummy/mannequin/add_to_living_mob_list() return FALSE -/mob/living/carbon/human/dummy/mannequin/add_to_dead_mob_list() +/mob/living/human/dummy/mannequin/add_to_dead_mob_list() return FALSE -/mob/living/carbon/human/dummy/mannequin/fully_replace_character_name(new_name, in_depth = TRUE) +/mob/living/human/dummy/mannequin/fully_replace_character_name(new_name, in_depth = TRUE) ..("[new_name] (mannequin)", FALSE) -/mob/living/carbon/human/dummy/mannequin/InitializeHud() +/mob/living/human/dummy/mannequin/InitializeHud() return // Mannequins don't get HUDs -/mob/living/carbon/human/monkey +/mob/living/human/monkey gender = PLURAL -/mob/living/carbon/human/monkey/Initialize(mapload, species_name, datum/mob_snapshot/supplied_appearance) +/mob/living/human/monkey/Initialize(mapload, species_name, datum/mob_snapshot/supplied_appearance) if(gender == PLURAL) gender = pick(MALE, FEMALE) species_name = SPECIES_MONKEY diff --git a/code/modules/mob/living/human/human_verbs.dm b/code/modules/mob/living/human/human_verbs.dm index de0954e4683..32acb3e52f2 100644 --- a/code/modules/mob/living/human/human_verbs.dm +++ b/code/modules/mob/living/human/human_verbs.dm @@ -1,4 +1,4 @@ -/mob/living/carbon/human/proc/morph() +/mob/living/human/proc/morph() set name = "Morph" set category = "Superpower" @@ -8,7 +8,7 @@ return if(!has_genetic_condition(GENE_COND_SHAPESHIFTER)) - src.verbs -= /mob/living/carbon/human/proc/morph + src.verbs -= /mob/living/human/proc/morph return var/new_facial = input("Please select facial hair color.", "Character Generation", GET_FACIAL_HAIR_COLOUR(src)) as color @@ -71,7 +71,7 @@ var/decl/pronouns/G = get_pronouns() visible_message("\The [src] morphs and changes [G.his] appearance!", "You change your appearance!", "Oh, god! What the hell was that? It sounded like flesh getting squished and bone ground into a different shape!") -/mob/living/carbon/human/proc/remotesay() +/mob/living/human/proc/remotesay() set name = "Project mind" set category = "Superpower" @@ -81,7 +81,7 @@ return if(!has_genetic_condition(GENE_COND_REMOTE_TALK)) - src.verbs -= /mob/living/carbon/human/proc/remotesay + src.verbs -= /mob/living/human/proc/remotesay return var/list/creatures = list() for(var/mob/living/h in global.player_list) @@ -100,7 +100,7 @@ for(var/mob/observer/ghost/G in global.player_list) G.show_message("Telepathic message from [src] to [target]: [say]") -/mob/living/carbon/human/proc/remoteobserve() +/mob/living/human/proc/remoteobserve() set name = "Remote View" set category = "Superpower" @@ -112,7 +112,7 @@ if(!has_genetic_condition(GENE_COND_REMOTE_VIEW)) remoteview_target = null reset_view(0) - src.verbs -= /mob/living/carbon/human/proc/remoteobserve + src.verbs -= /mob/living/human/proc/remoteobserve return if(client.eye != client.mob) @@ -137,7 +137,7 @@ remoteview_target = null reset_view(0) -/mob/living/carbon/human/proc/remove_splints() +/mob/living/human/proc/remove_splints() set category = "Object" set name = "Remove Splints" set desc = "Carefully remove splints from someone's limbs." @@ -161,9 +161,9 @@ user.visible_message(SPAN_DANGER("\The [user] removes \the [src]'s splints!")) else to_chat(user, SPAN_WARNING("\The [src] has no splints that can be removed.")) - verbs -= /mob/living/carbon/human/proc/remove_splints + verbs -= /mob/living/human/proc/remove_splints -/mob/living/carbon/human/verb/check_pulse() +/mob/living/human/verb/check_pulse() set category = "Object" set name = "Check pulse" set desc = "Approximately count somebody's pulse. Requires you to stand still at least 6 seconds." @@ -197,7 +197,7 @@ else to_chat(usr, "You failed to check the pulse. Try again.") -/mob/living/carbon/human/proc/bloody_doodle() +/mob/living/human/proc/bloody_doodle() set category = "IC" set name = "Write in blood" set desc = "Use blood on your hands to write a short message on the floor or a wall, murder mystery style." @@ -213,7 +213,7 @@ if(grabber.coating) bloody_hands += REAGENT_VOLUME(grabber.coating, /decl/material/liquid/blood) if (!bloody_hands) - verbs -= /mob/living/carbon/human/proc/bloody_doodle + verbs -= /mob/living/human/proc/bloody_doodle var/obj/item/gloves = get_equipped_item(slot_gloves_str) if (gloves) @@ -258,7 +258,7 @@ W.message = message W.add_fingerprint(src) -/mob/living/carbon/human/proc/undislocate() +/mob/living/human/proc/undislocate() set category = "Object" set name = "Undislocate Joint" set desc = "Pop a joint back into place. Extremely painful." @@ -320,7 +320,7 @@ ) current_limb.undislocate() -/mob/living/carbon/human/verb/pull_punches() +/mob/living/human/verb/pull_punches() set name = "Switch Stance" set desc = "Try not to hurt them." set category = "IC" diff --git a/code/modules/mob/living/human/life.dm b/code/modules/mob/living/human/life.dm index 89f866f681a..8bc960c9226 100644 --- a/code/modules/mob/living/human/life.dm +++ b/code/modules/mob/living/human/life.dm @@ -20,10 +20,10 @@ #define COLD_GAS_DAMAGE_LEVEL_2 1.5 //Amount of damage applied when the current breath's temperature passes the 200K point #define COLD_GAS_DAMAGE_LEVEL_3 3 //Amount of damage applied when the current breath's temperature passes the 120K point -/mob/living/carbon/human +/mob/living/human var/stamina = 100 -/mob/living/carbon/human/handle_living_non_stasis_processes() +/mob/living/human/handle_living_non_stasis_processes() . = ..() if(!.) return FALSE @@ -34,10 +34,10 @@ handle_pain() handle_stamina() -/mob/living/carbon/human/get_stamina() +/mob/living/human/get_stamina() return stamina -/mob/living/carbon/human/adjust_stamina(var/amt) +/mob/living/human/adjust_stamina(var/amt) var/last_stamina = stamina if(stat == DEAD) stamina = 0 @@ -52,12 +52,12 @@ if(last_stamina != stamina && istype(hud_used)) hud_used.update_stamina() -/mob/living/carbon/human/proc/handle_stamina() +/mob/living/human/proc/handle_stamina() if((world.time - last_quick_move_time) > 5 SECONDS) var/mod = (current_posture.prone + (nutrition / get_max_nutrition())) / 2 adjust_stamina(max(get_config_value(/decl/config/num/movement_max_stamina_recovery), get_config_value(/decl/config/num/movement_min_stamina_recovery) * mod) * (1 + GET_CHEMICAL_EFFECT(src, CE_ENERGETIC))) -/mob/living/carbon/human/set_stat(var/new_stat) +/mob/living/human/set_stat(var/new_stat) var/old_stat = stat . = ..() if(stat) @@ -69,7 +69,7 @@ // Calculate how vulnerable the human is to the current pressure. // Returns 0 (equals 0 %) if sealed in an undamaged suit that's rated for the pressure, 1 if unprotected (equals 100%). // Suitdamage can modifiy this in 10% steps. -/mob/living/carbon/human/proc/get_pressure_weakness(pressure) +/mob/living/human/proc/get_pressure_weakness(pressure) var/pressure_adjustment_coefficient = 0 var/list/zones = list(SLOT_HEAD, SLOT_UPPER_BODY, SLOT_LOWER_BODY, SLOT_LEGS, SLOT_FEET, SLOT_ARMS, SLOT_HANDS) @@ -86,7 +86,7 @@ return pressure_adjustment_coefficient // Calculate how much of the enviroment pressure-difference affects the human. -/mob/living/carbon/human/calculate_affecting_pressure(var/pressure) +/mob/living/human/calculate_affecting_pressure(var/pressure) var/pressure_difference // First get the absolute pressure difference. @@ -112,7 +112,7 @@ else return ONE_ATMOSPHERE + pressure_difference -/mob/living/carbon/human/handle_impaired_vision() +/mob/living/human/handle_impaired_vision() . = ..() if(!.) @@ -134,18 +134,18 @@ else if(!has_genetic_condition(GENE_COND_BLINDED) && equipment_tint_total >= TINT_BLIND) ADJ_STATUS(src, STAT_BLURRY, -1) -/mob/living/carbon/human/handle_disabilities() +/mob/living/human/handle_disabilities() ..() if(stat != DEAD && has_genetic_condition(GENE_COND_COUGHING) && prob(5) && GET_STATUS(src, STAT_PARA) <= 1) drop_held_items() cough() -/mob/living/carbon/human/handle_mutations_and_radiation() +/mob/living/human/handle_mutations_and_radiation() if(get_damage(BURN) && (has_genetic_condition(GENE_COND_COLD_RESISTANCE) || (prob(1)))) heal_organ_damage(0,1) ..() -/mob/living/carbon/human/handle_environment(datum/gas_mixture/environment) +/mob/living/human/handle_environment(datum/gas_mixture/environment) ..() @@ -257,19 +257,19 @@ return -/mob/living/carbon/human/get_bodytemperature_difference() +/mob/living/human/get_bodytemperature_difference() if (on_fire) return 0 //too busy for pesky metabolic regulation return ..() -/mob/living/carbon/human/stabilize_body_temperature() +/mob/living/human/stabilize_body_temperature() // Robolimbs cause overheating too. if(robolimb_count) bodytemperature += round(robolimb_count/2) return ..() //This proc returns a number made up of the flags for body parts which you are protected on. (such as HEAD, SLOT_UPPER_BODY, SLOT_LOWER_BODY, etc. See setup.dm for the full list) -/mob/living/carbon/human/proc/get_heat_protection_flags(temperature) //Temperature is the temperature you're being exposed to. +/mob/living/human/proc/get_heat_protection_flags(temperature) //Temperature is the temperature you're being exposed to. . = 0 //Handle normal clothing for(var/slot in global.standard_clothing_slots) @@ -283,7 +283,7 @@ . |= accessory.heat_protection //See proc/get_heat_protection_flags(temperature) for the description of this proc. -/mob/living/carbon/human/proc/get_cold_protection_flags(temperature) +/mob/living/human/proc/get_cold_protection_flags(temperature) . = 0 //Handle normal clothing for(var/slot in global.standard_clothing_slots) @@ -297,11 +297,11 @@ . |= accessory.cold_protection -/mob/living/carbon/human/get_heat_protection(temperature) //Temperature is the temperature you're being exposed to. +/mob/living/human/get_heat_protection(temperature) //Temperature is the temperature you're being exposed to. var/thermal_protection_flags = get_heat_protection_flags(temperature) return get_thermal_protection(thermal_protection_flags) -/mob/living/carbon/human/get_cold_protection(temperature) +/mob/living/human/get_cold_protection(temperature) if(has_genetic_condition(GENE_COND_COLD_RESISTANCE)) return 1 //Fully protected from the cold. @@ -309,7 +309,7 @@ var/thermal_protection_flags = get_cold_protection_flags(temperature) return get_thermal_protection(thermal_protection_flags) -/mob/living/carbon/human/proc/get_thermal_protection(var/flags) +/mob/living/human/proc/get_thermal_protection(var/flags) .=0 if(flags) if(flags & SLOT_HEAD) @@ -336,13 +336,13 @@ . += THERMAL_PROTECTION_HAND_RIGHT return min(1,.) -/mob/living/carbon/human/apply_chemical_effects() +/mob/living/human/apply_chemical_effects() . = ..() if(has_chemical_effect(CE_GLOWINGEYES, 1)) update_eyes() return TRUE -/mob/living/carbon/human/handle_regular_status_updates() +/mob/living/human/handle_regular_status_updates() voice = GetVoice() SetName(get_visible_name()) @@ -407,7 +407,7 @@ SET_STATUS_MAX(src, STAT_ASLEEP, 5) -/mob/living/carbon/human/handle_regular_hud_updates() +/mob/living/human/handle_regular_hud_updates() if(life_tick%30==15) hud_updateflag = 1022 if(hud_updateflag) // update our mob's hud overlays, AKA what others see flaoting above our head @@ -591,7 +591,7 @@ bodytemp.icon_state = "temp0" return 1 -/mob/living/carbon/human/handle_random_events() +/mob/living/human/handle_random_events() // Puke if toxloss is too high var/vomit_score = 0 for(var/tag in list(BP_LIVER,BP_KIDNEYS)) @@ -622,7 +622,7 @@ to_chat(src,"You feel like you're [pick("moving","flying","floating","falling","hovering")].") #define BASE_SHOCK_RECOVERY 1 -/mob/living/carbon/human/proc/handle_shock() +/mob/living/human/proc/handle_shock() if(!can_feel_pain() || (status_flags & GODMODE)) shock_stage = 0 return @@ -702,7 +702,7 @@ we only set those statuses and icons upon changes. Then those HUD items will simply add those pre-made images. This proc below is only called when those HUD elements need to change as determined by the mobs hud_updateflag. */ -/mob/living/carbon/human/proc/handle_hud_list() +/mob/living/human/proc/handle_hud_list() if (BITTEST(hud_updateflag, HEALTH_HUD) && hud_list[HEALTH_HUD]) var/image/holder = hud_list[HEALTH_HUD] if(stat == DEAD) @@ -811,7 +811,7 @@ hud_list[SPECIALROLE_HUD] = holder hud_updateflag = 0 -/mob/living/carbon/human/handle_fire() +/mob/living/human/handle_fire() if(..()) return @@ -841,21 +841,21 @@ if(!(E.body_part & protected_limbs) && prob(20)) E.take_external_damage(burn = round(species_heat_mod * log(10, (burn_temperature + 10)), 0.1), used_weapon = "fire") -/mob/living/carbon/human/rejuvenate() +/mob/living/human/rejuvenate() reset_blood() full_prosthetic = null shock_stage = 0 ..() adjust_stamina(100) -/mob/living/carbon/human/reset_view(atom/A) +/mob/living/human/reset_view(atom/A) ..() if(machine_visual && machine_visual != A) machine_visual.remove_visual(src) if(eyeobj) eyeobj.remove_visual(src) -/mob/living/carbon/human/handle_vision() +/mob/living/human/handle_vision() if(client) var/datum/global_hud/global_hud = get_global_hud() client.screen.Remove(global_hud.nvg, global_hud.thermal, global_hud.meson, global_hud.science) @@ -874,7 +874,7 @@ update_equipment_vision() species.handle_vision(src) -/mob/living/carbon/human/update_living_sight() +/mob/living/human/update_living_sight() ..() if(GET_CHEMICAL_EFFECT(src, CE_THIRDEYE) || has_genetic_condition(GENE_COND_XRAY)) set_sight(sight|SEE_TURFS|SEE_MOBS|SEE_OBJS) diff --git a/code/modules/mob/living/human/login.dm b/code/modules/mob/living/human/login.dm index c74da53b8f1..3d8a8f70e2b 100644 --- a/code/modules/mob/living/human/login.dm +++ b/code/modules/mob/living/human/login.dm @@ -1,4 +1,4 @@ -/mob/living/carbon/human/Login() +/mob/living/human/Login() ..() if(species) species.handle_login_special(src) diff --git a/code/modules/mob/living/human/logout.dm b/code/modules/mob/living/human/logout.dm index f449ce991ad..3c473576f41 100644 --- a/code/modules/mob/living/human/logout.dm +++ b/code/modules/mob/living/human/logout.dm @@ -1,4 +1,4 @@ -/mob/living/carbon/human/Logout() +/mob/living/human/Logout() ..() if(species) species.handle_logout_special(src) return \ No newline at end of file diff --git a/code/modules/mob/living/human/npcs.dm b/code/modules/mob/living/human/npcs.dm index da077206188..cf9786e1a08 100644 --- a/code/modules/mob/living/human/npcs.dm +++ b/code/modules/mob/living/human/npcs.dm @@ -1,12 +1,12 @@ -/mob/living/carbon/human/monkey/punpun +/mob/living/human/monkey/punpun real_name = "Pun Pun" gender = MALE -/mob/living/carbon/human/monkey/punpun/Initialize(mapload, species_name, datum/mob_snapshot/supplied_appearance) +/mob/living/human/monkey/punpun/Initialize(mapload, species_name, datum/mob_snapshot/supplied_appearance) ..() return INITIALIZE_HINT_LATELOAD -/mob/living/carbon/human/monkey/punpun/LateInitialize() +/mob/living/human/monkey/punpun/LateInitialize() ..() if(prob(50)) equip_to_appropriate_slot(new /obj/item/clothing/pants/slacks/black(src)) @@ -35,12 +35,12 @@ sensor.set_sensor_mode(VITALS_SENSOR_OFF) attach_accessory(null, sensor) -/mob/living/carbon/human/blank/Initialize(mapload, species_name, datum/mob_snapshot/supplied_appearance) +/mob/living/human/blank/Initialize(mapload, species_name, datum/mob_snapshot/supplied_appearance) species_name = SPECIES_HUMAN ..() return INITIALIZE_HINT_LATELOAD -/mob/living/carbon/human/blank/LateInitialize() +/mob/living/human/blank/LateInitialize() var/number = "[pick(global.greek_letters)]-[rand(1,30)]" fully_replace_character_name("Subject [number]") var/decl/hierarchy/outfit/outfit = outfit_by_type(/decl/hierarchy/outfit/blank_subject) @@ -49,5 +49,5 @@ if(F) F.SetName("[F.name] ([number])") -/mob/living/carbon/human/blank/ssd_check() +/mob/living/human/blank/ssd_check() return FALSE diff --git a/code/modules/mob/living/human/say.dm b/code/modules/mob/living/human/say.dm index 52bc39e0657..2dbd8c4293d 100644 --- a/code/modules/mob/living/human/say.dm +++ b/code/modules/mob/living/human/say.dm @@ -1,4 +1,4 @@ -/mob/living/carbon/human/say(var/message, var/decl/language/speaking, var/verb = "says", var/alt_name = "", whispering) +/mob/living/human/say(var/message, var/decl/language/speaking, var/verb = "says", var/alt_name = "", whispering) if(!whispering) var/obj/item/organ/internal/voicebox/voice = locate() in get_internal_organs() // Check if the language they're speaking is vocal and not supplied by a machine, and if they are currently suffocating. @@ -21,7 +21,7 @@ SetName(get_id_name("Unknown")) . = ..(message, speaking, verb, alt_name, whispering) -/mob/living/carbon/human/proc/forcesay(list/append) +/mob/living/human/proc/forcesay(list/append) if(stat == CONSCIOUS) if(client) var/virgin = 1 //has the text been modified yet? @@ -55,10 +55,10 @@ say(temp) winset(client, "input", "text=[null]") -/mob/living/carbon/human/say_understands(mob/speaker, decl/language/speaking) +/mob/living/human/say_understands(mob/speaker, decl/language/speaking) return (!speaking && (issilicon(speaker) || istype(speaker, /mob/announcer) || isbrain(speaker))) || ..() -/mob/living/carbon/human/say_quote(var/message, var/decl/language/speaking = null) +/mob/living/human/say_quote(var/message, var/decl/language/speaking = null) var/verb = "says" var/ending = copytext(message, length(message)) @@ -72,7 +72,7 @@ return verb -/mob/living/carbon/human/handle_speech_problems(var/list/message_data) +/mob/living/human/handle_speech_problems(var/list/message_data) if(HAS_STATUS(src, STAT_SILENCE) || has_genetic_condition(GENE_COND_MUTED)) to_chat(src, SPAN_WARNING("You are unable to speak!")) message_data[1] = "" @@ -86,13 +86,13 @@ return ..(message_data) -/mob/living/carbon/human/handle_message_mode(message_mode, message, verb, speaking, used_radios, alt_name) +/mob/living/human/handle_message_mode(message_mode, message, verb, speaking, used_radios, alt_name) if(message_mode == MESSAGE_MODE_WHISPER) //It's going to get sanitized again immediately, so decode. whisper_say(html_decode(message), speaking, alt_name) return TRUE return ..() -/mob/living/carbon/human/handle_speech_sound() +/mob/living/human/handle_speech_sound() if(species.speech_sounds && prob(species.speech_chance)) var/list/returns[2] var/sound_to_play = species.speech_sounds @@ -103,7 +103,7 @@ return returns return ..() -/mob/living/carbon/human/can_speak(decl/language/speaking) +/mob/living/human/can_speak(decl/language/speaking) if(ispath(speaking, /decl/language)) speaking = GET_DECL(speaking) if(!istype(speaking)) @@ -118,7 +118,7 @@ return FALSE . = ..() -/mob/living/carbon/human/parse_language(var/message) +/mob/living/human/parse_language(var/message) var/prefix = copytext(message,1,2) if(length(message) >= 1 && prefix == get_prefix_key(/decl/prefix/audible_emote)) return GET_DECL(/decl/language/noise) diff --git a/code/modules/mob/living/human/unarmed_attack.dm b/code/modules/mob/living/human/unarmed_attack.dm index 57c97c7d196..708fe84c7ff 100644 --- a/code/modules/mob/living/human/unarmed_attack.dm +++ b/code/modules/mob/living/human/unarmed_attack.dm @@ -44,7 +44,7 @@ . |= (sharp && DAM_SHARP) . |= (edge && DAM_EDGE) -/decl/natural_attack/proc/padded_by_user_gear(var/mob/living/carbon/human/user) +/decl/natural_attack/proc/padded_by_user_gear(var/mob/living/human/user) if(istype(user) && length(usable_with_limbs)) for(var/limb_slot in usable_with_limbs) var/obj/item/gear = user.get_covering_equipped_item_by_zone(limb_slot) @@ -52,7 +52,7 @@ return TRUE return FALSE -/decl/natural_attack/proc/resolve_to_soft_variant(var/mob/living/carbon/human/user) +/decl/natural_attack/proc/resolve_to_soft_variant(var/mob/living/human/user) . = src if(istype(user) && (user.pulling_punches || padded_by_user_gear(user))) var/decl/natural_attack/soft_variant = get_sparring_variant() @@ -62,7 +62,7 @@ /decl/natural_attack/proc/get_sparring_variant() return GET_DECL(sparring_variant_type) -/decl/natural_attack/proc/is_usable(var/mob/living/carbon/human/user, var/mob/target, var/zone) +/decl/natural_attack/proc/is_usable(var/mob/living/human/user, var/mob/target, var/zone) if(!user.restrained() && !user.incapacitated()) for(var/etype in usable_with_limbs) var/obj/item/organ/external/E = GET_EXTERNAL_ORGAN(user, etype) @@ -132,7 +132,7 @@ return TRUE -/decl/natural_attack/proc/show_attack(var/mob/living/carbon/human/user, var/mob/living/carbon/human/target, var/zone, var/attack_damage) +/decl/natural_attack/proc/show_attack(var/mob/living/human/user, var/mob/living/human/target, var/zone, var/attack_damage) var/msg = "\The [user] [pick(attack_verb)] \the [target]" var/obj/item/organ/external/affecting = istype(target) && zone && GET_EXTERNAL_ORGAN(target, zone) if(affecting) @@ -143,7 +143,7 @@ user.visible_message(SPAN_DANGER("[msg]!")) playsound(user.loc, attack_sound, 25, 1, -1) -/decl/natural_attack/proc/handle_eye_attack(var/mob/living/carbon/human/user, var/mob/living/carbon/human/target) +/decl/natural_attack/proc/handle_eye_attack(var/mob/living/human/user, var/mob/living/human/target) var/obj/item/organ/internal/eyes = GET_INTERNAL_ORGAN(target, BP_EYES) var/decl/pronouns/G = user.get_pronouns() if(eyes) @@ -177,7 +177,7 @@ sharp = 1 edge = 1 -/decl/natural_attack/bite/is_usable(var/mob/living/carbon/human/user, var/mob/living/carbon/human/target, var/zone) +/decl/natural_attack/bite/is_usable(var/mob/living/human/user, var/mob/living/human/target, var/zone) if(user.get_item_blocking_speech()) return 0 @@ -200,7 +200,7 @@ sparring_variant_type = /decl/natural_attack/light_strike/punch is_starting_default = TRUE -/decl/natural_attack/punch/show_attack(var/mob/living/carbon/human/user, var/mob/living/carbon/human/target, var/zone, var/attack_damage) +/decl/natural_attack/punch/show_attack(var/mob/living/human/user, var/mob/living/human/target, var/zone, var/attack_damage) var/obj/item/organ/external/affecting = istype(target) && zone && GET_EXTERNAL_ORGAN(target, zone) if(!affecting) @@ -262,7 +262,7 @@ usable_with_limbs = list(BP_L_FOOT, BP_R_FOOT) sparring_variant_type = /decl/natural_attack/light_strike/kick -/decl/natural_attack/kick/is_usable(var/mob/living/carbon/human/user, var/mob/living/carbon/human/target, var/zone) +/decl/natural_attack/kick/is_usable(var/mob/living/human/user, var/mob/living/human/target, var/zone) if(zone == BP_HEAD || zone == BP_EYES || zone == BP_MOUTH) zone = BP_CHEST . = ..() @@ -273,7 +273,7 @@ return damage return damage + (shoes ? shoes.force : 0) -/decl/natural_attack/kick/show_attack(var/mob/living/carbon/human/user, var/mob/living/carbon/human/target, var/zone, var/attack_damage) +/decl/natural_attack/kick/show_attack(var/mob/living/human/user, var/mob/living/human/target, var/zone, var/attack_damage) var/obj/item/organ/external/affecting = istype(target) && zone && GET_EXTERNAL_ORGAN(target, zone) if(!affecting) @@ -294,7 +294,7 @@ damage = 0 usable_with_limbs = list(BP_L_FOOT, BP_R_FOOT) -/decl/natural_attack/stomp/is_usable(var/mob/living/carbon/human/user, var/mob/living/carbon/human/target, var/zone) +/decl/natural_attack/stomp/is_usable(var/mob/living/human/user, var/mob/living/human/target, var/zone) if(!istype(target)) return FALSE if (!user.current_posture.prone && (target.current_posture.prone || (zone in list(BP_L_FOOT, BP_R_FOOT)))) @@ -309,7 +309,7 @@ var/obj/item/clothing/shoes = user.get_equipped_item(slot_shoes_str) return damage + (shoes ? shoes.force : 0) -/decl/natural_attack/stomp/show_attack(var/mob/living/carbon/human/user, var/mob/living/carbon/human/target, var/zone, var/attack_damage) +/decl/natural_attack/stomp/show_attack(var/mob/living/human/user, var/mob/living/human/target, var/zone, var/attack_damage) var/obj/item/organ/external/affecting = istype(target) && zone && GET_EXTERNAL_ORGAN(target, zone) if(!affecting) @@ -357,7 +357,7 @@ attack_noun = list("foot") usable_with_limbs = list(BP_L_FOOT, BP_R_FOOT) -/decl/natural_attack/light_strike/kick/is_usable(var/mob/living/carbon/human/user, var/mob/living/carbon/human/target, var/zone) +/decl/natural_attack/light_strike/kick/is_usable(var/mob/living/human/user, var/mob/living/human/target, var/zone) if(zone == BP_HEAD || zone == BP_EYES || zone == BP_MOUTH) zone = BP_CHEST . = ..() diff --git a/code/modules/mob/living/human/update_icons.dm b/code/modules/mob/living/human/update_icons.dm index d9224b97e24..6b53f860cbf 100644 --- a/code/modules/mob/living/human/update_icons.dm +++ b/code/modules/mob/living/human/update_icons.dm @@ -102,7 +102,7 @@ If you have any questions/constructive-comments/bugs-to-report/or have a massivl Please contact me on #coderbus IRC. ~Carn x */ -/mob/living/carbon/human/refresh_visible_overlays() +/mob/living/human/refresh_visible_overlays() update_genetic_conditions(FALSE) update_body(FALSE) update_skin(FALSE) @@ -115,12 +115,12 @@ Please contact me on #coderbus IRC. ~Carn x update_damage_overlays(FALSE) return ..() -/mob/living/carbon/human/on_update_icon() +/mob/living/human/on_update_icon() if(regenerate_body_icon) regenerate_body_icon = FALSE ..() -/mob/living/carbon/human/apply_visible_overlays() +/mob/living/human/apply_visible_overlays() var/list/visible_overlays var/list/visible_underlays if(is_cloaked()) @@ -177,7 +177,7 @@ Please contact me on #coderbus IRC. ~Carn x // If you want stuff like scaling based on species or something, here is a good spot to mix the numbers together. return list(icon_scale_x, icon_scale_y) -/mob/living/carbon/human/update_appearance_flags(add_flags, remove_flags) +/mob/living/human/update_appearance_flags(add_flags, remove_flags) . = ..() if(.) update_icon() @@ -196,7 +196,7 @@ Please contact me on #coderbus IRC. ~Carn x transform = M return transform -/mob/living/carbon/human/update_transform() +/mob/living/human/update_transform() // First, get the correct size. var/list/icon_scale_values = get_icon_scale_mult() @@ -249,11 +249,11 @@ Please contact me on #coderbus IRC. ~Carn x return transform -/mob/living/carbon/human/update_damage_overlays(update_icons = TRUE) +/mob/living/human/update_damage_overlays(update_icons = TRUE) . = ..() update_bandages(update_icons) -/mob/living/carbon/human/proc/update_bandages(var/update_icons=1) +/mob/living/human/proc/update_bandages(var/update_icons=1) var/list/bandage_overlays var/bandage_icon = get_bodytype().get_bandages_icon(src) if(bandage_icon) @@ -263,7 +263,7 @@ Please contact me on #coderbus IRC. ~Carn x LAZYADD(bandage_overlays, image(bandage_icon, "[O.icon_state][bandage_level]")) set_current_mob_overlay(HO_DAMAGE_LAYER, bandage_overlays, update_icons) -/mob/living/carbon/human/proc/get_human_icon_cache_key() +/mob/living/human/proc/get_human_icon_cache_key() . = list() for(var/limb_tag in global.all_limb_tags) . += "[limb_tag]_" @@ -277,7 +277,7 @@ Please contact me on #coderbus IRC. ~Carn x . = JOINTEXT(.) //BASE MOB SPRITE -/mob/living/carbon/human/update_body(var/update_icons = TRUE) +/mob/living/human/update_body(var/update_icons = TRUE) var/list/limbs = get_external_organs() if(!LAZYLEN(limbs)) @@ -333,7 +333,7 @@ Please contact me on #coderbus IRC. ~Carn x //UNDERWEAR OVERLAY -/mob/living/carbon/human/proc/update_underwear(var/update_icons=1) +/mob/living/human/proc/update_underwear(var/update_icons=1) var/list/undies = list() for(var/entry in worn_underwear) @@ -356,16 +356,16 @@ Please contact me on #coderbus IRC. ~Carn x undies += I set_current_mob_overlay(HO_UNDERWEAR_LAYER, undies, update_icons) -/mob/living/carbon/human/update_hair(var/update_icons=1) +/mob/living/human/update_hair(var/update_icons=1) var/obj/item/organ/external/head/head_organ = get_organ(BP_HEAD, /obj/item/organ/external/head) var/list/new_accessories = head_organ?.get_mob_overlays() set_current_mob_overlay(HO_HAIR_LAYER, new_accessories, update_icons) -/mob/living/carbon/human/proc/update_skin(var/update_icons=1) +/mob/living/human/proc/update_skin(var/update_icons=1) // todo: make this use bodytype set_current_mob_overlay(HO_SKIN_LAYER, species.update_skin(src), update_icons) -/mob/living/carbon/human/update_genetic_conditions(var/update_icons=1) +/mob/living/human/update_genetic_conditions(var/update_icons=1) var/list/condition_overlays = null for(var/decl/genetic_condition/condition as anything in get_genetic_conditions()) var/condition_overlay = condition.get_mob_overlay() @@ -378,7 +378,7 @@ Please contact me on #coderbus IRC. ~Carn x /mob/living/proc/update_tail_showing(var/update_icons=1) return -/mob/living/carbon/human/update_tail_showing(var/update_icons=1) +/mob/living/human/update_tail_showing(var/update_icons=1) var/obj/item/organ/external/tail/tail_organ = get_organ(BP_TAIL, /obj/item/organ/external/tail) if(!istype(tail_organ)) @@ -407,7 +407,7 @@ Please contact me on #coderbus IRC. ~Carn x set_current_mob_overlay(HO_TAIL_LAYER, null, FALSE) set_current_mob_underlay(HU_TAIL_LAYER, tail_image, update_icons) -/mob/living/carbon/human/proc/get_tail_icon_for_organ(var/obj/item/organ/external/tail/tail_organ) +/mob/living/human/proc/get_tail_icon_for_organ(var/obj/item/organ/external/tail/tail_organ) if(!istype(tail_organ)) return @@ -449,7 +449,7 @@ Please contact me on #coderbus IRC. ~Carn x if(tail_organ?.get_tail()) update_tail_showing() -/mob/living/carbon/human/proc/set_tail_state(var/t_state) +/mob/living/human/proc/set_tail_state(var/t_state) var/obj/item/organ/external/tail/tail_organ = get_organ(BP_TAIL, /obj/item/organ/external/tail) if(!tail_organ) return null @@ -460,10 +460,10 @@ Please contact me on #coderbus IRC. ~Carn x //Not really once, since BYOND can't do that. //Update this if the ability to flick() images or make looping animation start at the first frame is ever added. -/mob/living/carbon/human/proc/get_current_tail_image() +/mob/living/human/proc/get_current_tail_image() return get_current_mob_overlay(HO_TAIL_LAYER) || get_current_mob_underlay(HU_TAIL_LAYER) -/mob/living/carbon/human/proc/animate_tail_once(var/update_icons=1) +/mob/living/human/proc/animate_tail_once(var/update_icons=1) var/obj/item/organ/external/tail/tail_organ = get_organ(BP_TAIL, /obj/item/organ/external/tail) if(!tail_organ) return @@ -484,7 +484,7 @@ Please contact me on #coderbus IRC. ~Carn x if(update_icons) queue_icon_update() -/mob/living/carbon/human/proc/animate_tail_start(var/update_icons=1) +/mob/living/human/proc/animate_tail_start(var/update_icons=1) var/obj/item/organ/external/tail/tail_organ = get_organ(BP_TAIL, /obj/item/organ/external/tail) if(!tail_organ) return @@ -494,7 +494,7 @@ Please contact me on #coderbus IRC. ~Carn x if(update_icons) queue_icon_update() -/mob/living/carbon/human/proc/animate_tail_fast(var/update_icons=1) +/mob/living/human/proc/animate_tail_fast(var/update_icons=1) var/obj/item/organ/external/tail/tail_organ = get_organ(BP_TAIL, /obj/item/organ/external/tail) if(!tail_organ) return @@ -504,7 +504,7 @@ Please contact me on #coderbus IRC. ~Carn x if(update_icons) queue_icon_update() -/mob/living/carbon/human/proc/animate_tail_reset(var/update_icons=1) +/mob/living/human/proc/animate_tail_reset(var/update_icons=1) var/obj/item/organ/external/tail/tail_organ = get_organ(BP_TAIL, /obj/item/organ/external/tail) if(!tail_organ) return @@ -517,19 +517,19 @@ Please contact me on #coderbus IRC. ~Carn x if(update_icons) queue_icon_update() -/mob/living/carbon/human/proc/animate_tail_stop(var/update_icons=1) +/mob/living/human/proc/animate_tail_stop(var/update_icons=1) var/obj/item/organ/external/tail/tail_organ = get_organ(BP_TAIL, /obj/item/organ/external/tail) if(!tail_organ) return set_tail_state("[tail_organ.get_tail()]_static") -/mob/living/carbon/human/update_fire(var/update_icons=1) +/mob/living/human/update_fire(var/update_icons=1) if(on_fire) var/image/standing = overlay_image(get_bodytype()?.get_ignited_icon(src) || 'icons/mob/OnFire.dmi', "Standing", RESET_COLOR) set_current_mob_overlay(HO_FIRE_LAYER, standing, update_icons) else set_current_mob_overlay(HO_FIRE_LAYER, null, update_icons) -/mob/living/carbon/human/hud_reset(full_reset = FALSE) +/mob/living/human/hud_reset(full_reset = FALSE) if((. = ..()) && internals && internal) internals.icon_state = "internal1" diff --git a/code/modules/mob/living/human/whisper.dm b/code/modules/mob/living/human/whisper.dm index 6776178e432..fa848cc225f 100644 --- a/code/modules/mob/living/human/whisper.dm +++ b/code/modules/mob/living/human/whisper.dm @@ -1,5 +1,5 @@ //Lallander was here -/mob/living/carbon/human/whisper(message as text) +/mob/living/human/whisper(message as text) if(filter_block_message(src, message)) return @@ -24,5 +24,5 @@ //This is used by both the whisper verb and human/say() to handle whispering -/mob/living/carbon/human/proc/whisper_say(var/message, var/decl/language/speaking = null, var/alt_name="", var/verb="whispers") +/mob/living/human/proc/whisper_say(var/message, var/decl/language/speaking = null, var/alt_name="", var/verb="whispers") say(message, speaking, verb, alt_name, whispering = TRUE) \ No newline at end of file diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 1dad709ed18..492b862b19e 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -149,7 +149,7 @@ default behaviour is: if(!tmob.buckled.anchored) step(tmob.buckled, t) if(ishuman(AM)) - var/mob/living/carbon/human/M = AM + var/mob/living/human/M = AM for(var/obj/item/grab/G in M.grabbed_by) step(G.assailant, get_dir(G.assailant, AM)) G.adjust_position() @@ -644,7 +644,7 @@ default behaviour is: return FALSE -/mob/living/carbon/human/canUnEquip(obj/item/I) +/mob/living/human/canUnEquip(obj/item/I) . = ..() && !(I in get_organs()) /mob/proc/can_be_possessed_by(var/mob/observer/ghost/possessor) diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index e661e7c2663..f99ab90b1e3 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -378,7 +378,7 @@ var/global/list/custom_ai_icons_by_ckey_and_name = list() if (href_list["track"]) var/mob/target = locate(href_list["track"]) in SSmobs.mob_list - var/mob/living/carbon/human/H = target + var/mob/living/human/H = target if(!istype(H) || (html_decode(href_list["trackname"]) == H.get_visible_name()) || (html_decode(href_list["trackname"]) == H.get_id_name())) ai_actual_track(target) diff --git a/code/modules/mob/living/silicon/pai/pai.dm b/code/modules/mob/living/silicon/pai/pai.dm index 545efb31a13..17b45ba08ad 100644 --- a/code/modules/mob/living/silicon/pai/pai.dm +++ b/code/modules/mob/living/silicon/pai/pai.dm @@ -188,7 +188,7 @@ var/global/list/possible_say_verbs = list( else if(ismob(card.loc)) var/mob/holder = card.loc if(ishuman(holder)) - var/mob/living/carbon/human/H = holder + var/mob/living/human/H = holder for(var/obj/item/organ/external/affecting in H.get_external_organs()) if(card in affecting.implants) affecting.take_external_damage(rand(30,50)) diff --git a/code/modules/mob/living/silicon/robot/analyzer.dm b/code/modules/mob/living/silicon/robot/analyzer.dm index e684028a54a..c1ca1b982e6 100644 --- a/code/modules/mob/living/silicon/robot/analyzer.dm +++ b/code/modules/mob/living/silicon/robot/analyzer.dm @@ -70,7 +70,7 @@ if("prosthetics") - var/mob/living/carbon/human/H = target + var/mob/living/human/H = target to_chat(user, SPAN_NOTICE("Analyzing Results for \the [H]:")) to_chat(user, "Key: [SPAN_ORANGE("Electronics")]/[SPAN_RED("Brute")]") var/obj/item/organ/internal/cell/C = H.get_organ(BP_CELL, /obj/item/organ/internal/cell) diff --git a/code/modules/mob/living/simple_animal/friendly/cat.dm b/code/modules/mob/living/simple_animal/friendly/cat.dm index 52a6e099774..eab529e073c 100644 --- a/code/modules/mob/living/simple_animal/friendly/cat.dm +++ b/code/modules/mob/living/simple_animal/friendly/cat.dm @@ -134,7 +134,7 @@ //Basic friend AI /mob/living/simple_animal/cat/fluff - var/mob/living/carbon/human/friend + var/mob/living/human/friend var/befriend_job = null /mob/living/simple_animal/cat/fluff/handle_movement_target() @@ -195,7 +195,7 @@ set src in view(1) if(!friend) - var/mob/living/carbon/human/H = usr + var/mob/living/human/H = usr if(istype(H) && (!befriend_job || H.job == befriend_job)) friend = usr . = 1 diff --git a/code/modules/mob/living/simple_animal/hostile/antlion.dm b/code/modules/mob/living/simple_animal/hostile/antlion.dm index 8c60cc16af6..5328aa7f82c 100644 --- a/code/modules/mob/living/simple_animal/hostile/antlion.dm +++ b/code/modules/mob/living/simple_animal/hostile/antlion.dm @@ -63,7 +63,7 @@ set_invisibility(initial(invisibility)) prep_burrow(FALSE) set_special_ability_cooldown(ability_cooldown) - for(var/mob/living/carbon/human/H in get_turf(src)) + for(var/mob/living/human/H in get_turf(src)) H.attackby(natural_weapon, src) visible_message(SPAN_DANGER("\The [src] tears into \the [H] from below!")) SET_STATUS_MAX(H, STAT_WEAK, 1) diff --git a/code/modules/mob/living/simple_animal/hostile/bad_drone.dm b/code/modules/mob/living/simple_animal/hostile/bad_drone.dm index f0e94bd7990..f4e8703919a 100644 --- a/code/modules/mob/living/simple_animal/hostile/bad_drone.dm +++ b/code/modules/mob/living/simple_animal/hostile/bad_drone.dm @@ -27,7 +27,7 @@ if(issilicon(A)) return FALSE if(ishuman(A)) - var/mob/living/carbon/human/H = A + var/mob/living/human/H = A if(H.isSynthetic()) return FALSE var/obj/item/head = H.get_equipped_item(slot_head_str) diff --git a/code/modules/mob/living/simple_animal/hostile/bear.dm b/code/modules/mob/living/simple_animal/hostile/bear.dm index 79e7d46caaa..82ab25346f1 100644 --- a/code/modules/mob/living/simple_animal/hostile/bear.dm +++ b/code/modules/mob/living/simple_animal/hostile/bear.dm @@ -112,7 +112,7 @@ var/damage = rand(20,30) if(ishuman(target_mob)) - var/mob/living/carbon/human/H = target_mob + var/mob/living/human/H = target_mob var/dam_zone = pick(BP_CHEST, BP_L_HAND, BP_R_HAND, BP_L_LEG, BP_R_LEG) var/obj/item/organ/external/affecting = GET_EXTERNAL_ORGAN(H, ran_zone(dam_zone, target = H)) H.apply_damage(damage, BRUTE, affecting, DAM_SHARP|DAM_EDGE) //TODO damage_flags var on simple_animals, maybe? diff --git a/code/modules/mob/living/simple_animal/hostile/giant_spider.dm b/code/modules/mob/living/simple_animal/hostile/giant_spider.dm index 95a39c32c8b..8547d0d94ad 100644 --- a/code/modules/mob/living/simple_animal/hostile/giant_spider.dm +++ b/code/modules/mob/living/simple_animal/hostile/giant_spider.dm @@ -154,7 +154,7 @@ if(attacking_with) heal_overall_damage(0.2 * attacking_with.force) //heal a bit on hit if(ishuman(.)) - var/mob/living/carbon/human/H = . + var/mob/living/human/H = . var/obj/item/clothing/suit/space/S = H.get_covering_equipped_item_by_zone(BP_CHEST) if(istype(S) && !length(S.breaches)) return @@ -275,7 +275,7 @@ Nurse caste procs /mob/living/simple_animal/hostile/giant_spider/nurse/attack_target(mob/target) . = ..() if(ishuman(.)) - var/mob/living/carbon/human/H = . + var/mob/living/human/H = . if(prob(infest_chance) && max_eggs) var/list/limbs = H.get_external_organs() var/obj/item/organ/external/O = LAZYLEN(limbs)? pick(limbs) : null diff --git a/code/modules/mob/living/simple_animal/hostile/hostile.dm b/code/modules/mob/living/simple_animal/hostile/hostile.dm index 06326c288d4..c224ef528fd 100644 --- a/code/modules/mob/living/simple_animal/hostile/hostile.dm +++ b/code/modules/mob/living/simple_animal/hostile/hostile.dm @@ -84,7 +84,7 @@ return FALSE if(ishuman(M)) - var/mob/living/carbon/human/H = M + var/mob/living/human/H = M if (H.is_cloaked()) return FALSE @@ -125,7 +125,7 @@ LostTarget() return 0 if (ishuman(target_mob)) - var/mob/living/carbon/human/H = target_mob + var/mob/living/human/H = target_mob if (H.is_cloaked()) LoseTarget() return 0 diff --git a/code/modules/mob/living/simple_animal/hostile/leech.dm b/code/modules/mob/living/simple_animal/hostile/leech.dm index ae82d4b6afc..9d7cf629c02 100644 --- a/code/modules/mob/living/simple_animal/hostile/leech.dm +++ b/code/modules/mob/living/simple_animal/hostile/leech.dm @@ -30,7 +30,7 @@ /mob/living/simple_animal/hostile/leech/attack_target(mob/target) . = ..() if(ishuman(.) && belly <= 75) - var/mob/living/carbon/human/H = . + var/mob/living/human/H = . var/obj/item/clothing/suit/space/S = H.get_covering_equipped_item_by_zone(BP_CHEST) if(istype(S) && !length(S.breaches)) return diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/giant_crab.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/giant_crab.dm index 3651874d0bd..8f610870094 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/giant_crab.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/giant_crab.dm @@ -25,7 +25,7 @@ ability_cooldown = 2 MINUTES ai = /datum/ai/giant_crab - var/mob/living/carbon/human/victim //the human we're grabbing + var/mob/living/human/victim //the human we're grabbing var/grab_duration = 3 //duration of disable in life ticks to simulate a grab var/grab_damage = 6 //brute damage before reductions, per crab's life tick var/list/grab_desc = list("thrashes", "squeezes", "crushes") @@ -68,7 +68,7 @@ /mob/living/simple_animal/hostile/retaliate/giant_crab/attack_target(mob/target) . = ..() if(ishuman(.)) - var/mob/living/carbon/human/H = . + var/mob/living/human/H = . if(victim == H) if(!Adjacent(victim)) release_grab() diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/giant_parrot/giant_parrot.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/giant_parrot/giant_parrot.dm index 0df6b5ec780..ce7d80f9cec 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/giant_parrot/giant_parrot.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/giant_parrot/giant_parrot.dm @@ -41,7 +41,7 @@ /mob/living/simple_animal/hostile/retaliate/parrot/space/attack_target(mob/target) . = ..() if(ishuman(.) && can_act() && !is_on_special_ability_cooldown() && Adjacent(.)) - var/mob/living/carbon/human/H = . + var/mob/living/human/H = . if(prob(70)) SET_STATUS_MAX(H, STAT_WEAK, rand(2,3)) set_special_ability_cooldown(ability_cooldown / 1.5) diff --git a/code/modules/mob/living/simple_animal/hostile/slug.dm b/code/modules/mob/living/simple_animal/hostile/slug.dm index 1e7b56fc5ac..e4f6eafafb5 100644 --- a/code/modules/mob/living/simple_animal/hostile/slug.dm +++ b/code/modules/mob/living/simple_animal/hostile/slug.dm @@ -31,7 +31,7 @@ return ..() to_chat(initiator, SPAN_WARNING("\The [src] wriggles out of your hands before you can pick it up!")) -/mob/living/simple_animal/hostile/slug/proc/attach(var/mob/living/carbon/human/H) +/mob/living/simple_animal/hostile/slug/proc/attach(var/mob/living/human/H) var/obj/item/clothing/suit/space/S = H.get_covering_equipped_item_by_zone(BP_CHEST) if(istype(S) && !length(S.breaches)) S.create_breaches(BRUTE, 20) @@ -46,7 +46,7 @@ /mob/living/simple_animal/hostile/slug/attack_target(mob/target) . = ..() if(ishuman(.)) - var/mob/living/carbon/human/H = . + var/mob/living/human/H = . if(prob(H.get_damage(BRUTE)/2)) attach(H) @@ -63,7 +63,7 @@ /obj/item/holder/slug/use_on_mob(mob/living/target, mob/living/user, animate = TRUE) var/mob/living/simple_animal/hostile/slug/V = contents[1] if(!V.stat && ishuman(target)) - var/mob/living/carbon/human/H = target + var/mob/living/human/H = target if(do_mob(user, H, 30)) V.attach(H) qdel(src) diff --git a/code/modules/mob/living/simple_animal/hostile/vagrant.dm b/code/modules/mob/living/simple_animal/hostile/vagrant.dm index c745d4b1221..50fb0091f5d 100644 --- a/code/modules/mob/living/simple_animal/hostile/vagrant.dm +++ b/code/modules/mob/living/simple_animal/hostile/vagrant.dm @@ -22,7 +22,7 @@ nutrition = 100 var/cloaked = 0 - var/mob/living/carbon/human/gripping = null + var/mob/living/human/gripping = null var/blood_per_tick = 3 var/health_per_tick = 0.8 @@ -89,7 +89,7 @@ /mob/living/simple_animal/hostile/vagrant/attack_target(mob/target) . = ..() if(ishuman(.)) - var/mob/living/carbon/human/H = . + var/mob/living/human/H = . if(gripping == H) SET_STATUS_MAX(H, STAT_WEAK, 1) SET_STATUS_MAX(H, STAT_STUN, 1) diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index bf9c64a44c3..b2354fbd88b 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -335,7 +335,7 @@ var/global/list/simplemob_icon_bitflag_cache = list() var/damage_flags var/damage_type if(ishuman(user)) - var/mob/living/carbon/human/H = user + var/mob/living/human/H = user var/decl/natural_attack/attack = H.get_unarmed_attack(src) if(istype(attack)) dealt_damage = attack.damage <= dealt_damage ? dealt_damage : attack.damage @@ -483,7 +483,7 @@ var/global/list/simplemob_icon_bitflag_cache = list() /mob/living/simple_animal/get_digestion_product() return /decl/material/liquid/nutriment -/mob/living/simple_animal/proc/reflect_unarmed_damage(var/mob/living/carbon/human/attacker, var/damage_type, var/description) +/mob/living/simple_animal/proc/reflect_unarmed_damage(var/mob/living/human/attacker, var/damage_type, var/description) if(attacker.a_intent == I_HURT) attacker.apply_damage(rand(return_damage_min, return_damage_max), damage_type, attacker.get_active_held_item_slot(), used_weapon = description) if(rand(25)) diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 23ed7f86767..3d0490df4f6 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -596,7 +596,7 @@ /mob/proc/pull_damage() return 0 -/mob/living/carbon/human/pull_damage() +/mob/living/human/pull_damage() if(!current_posture.prone|| get_damage(BRUTE) + get_damage(BURN) < 100) return FALSE for(var/obj/item/organ/external/e in get_external_organs()) @@ -831,7 +831,7 @@ if(U.get_empty_hand_slot()) U.put_in_hands(selection) if(ishuman(U)) - var/mob/living/carbon/human/human_user = U + var/mob/living/human/human_user = U human_user.bloody_hands(src) return 1 diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index cd05ca484fa..81b99458d48 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -16,7 +16,7 @@ /mob/proc/isSynthetic() return 0 -/mob/living/carbon/human/isSynthetic() +/mob/living/human/isSynthetic() if(isnull(full_prosthetic)) robolimb_count = 0 var/list/limbs = get_external_organs() @@ -32,7 +32,7 @@ /mob/proc/isMonkey() return 0 -/mob/living/carbon/human/isMonkey() +/mob/living/human/isMonkey() return istype(species, /decl/species/monkey) @@ -422,7 +422,7 @@ var/global/list/intents = list(I_HELP,I_DISARM,I_GRAB,I_HURT) return SAFE_PERP return 0 -/mob/living/carbon/human/assess_perp(var/obj/access_obj, var/check_access, var/auth_weapons, var/check_records, var/check_arrest, var/check_network) +/mob/living/human/assess_perp(var/obj/access_obj, var/check_access, var/auth_weapons, var/check_records, var/check_arrest, var/check_network) var/threatcount = ..() if(. == SAFE_PERP) return SAFE_PERP @@ -489,7 +489,7 @@ var/global/list/intents = list(I_HELP,I_DISARM,I_GRAB,I_HURT) /mob/observer/ghost/get_multitool() return can_admin_interact() && ..(ghost_multitool) -/mob/living/carbon/human/get_multitool() +/mob/living/human/get_multitool() return ..(get_active_held_item()) /mob/living/silicon/robot/get_multitool() diff --git a/code/modules/mob/mob_layering.dm b/code/modules/mob/mob_layering.dm index 6c0c553e127..e7a933c39cd 100644 --- a/code/modules/mob/mob_layering.dm +++ b/code/modules/mob/mob_layering.dm @@ -49,7 +49,7 @@ return HIDING_MOB_LAYER . = ..() -/mob/living/carbon/human/get_base_layer() +/mob/living/human/get_base_layer() if(current_posture.prone) return LYING_HUMAN_LAYER . = ..() diff --git a/code/modules/mob/mob_transformation_simple.dm b/code/modules/mob/mob_transformation_simple.dm index 8adaf8f9384..372ff1e6b38 100644 --- a/code/modules/mob/mob_transformation_simple.dm +++ b/code/modules/mob/mob_transformation_simple.dm @@ -2,8 +2,8 @@ var/global/list/href_to_mob_type = list( "Observer" = /mob/observer/ghost, "Crew" = list( - "Human" = /mob/living/carbon/human, - "Monkey" = /mob/living/carbon/human/monkey, + "Human" = /mob/living/human, + "Monkey" = /mob/living/human/monkey, "Robot" = /mob/living/silicon/robot ), "Animals" = list( @@ -83,7 +83,7 @@ var/global/list/href_to_mob_type = list( M.key = key if(subspecies && ishuman(M)) - var/mob/living/carbon/human/H = M + var/mob/living/human/H = M H.change_species(subspecies) return M diff --git a/code/modules/mob/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm index b8537e6e002..7522407c8ae 100644 --- a/code/modules/mob/new_player/new_player.dm +++ b/code/modules/mob/new_player/new_player.dm @@ -132,7 +132,7 @@ INITIALIZE_IMMEDIATE(/mob/new_player) if(isnull(client.holder)) announce_ghost_joinleave(src) - var/mob/living/carbon/human/dummy/mannequin = get_mannequin(client.ckey) + var/mob/living/human/dummy/mannequin = get_mannequin(client.ckey) if(mannequin) client.prefs.dress_preview_mob(mannequin) observer.set_appearance(mannequin) @@ -352,7 +352,7 @@ INITIALIZE_IMMEDIATE(/mob/new_player) spawning = 1 close_spawn_windows() - var/mob/living/carbon/human/new_character + var/mob/living/human/new_character var/decl/species/chosen_species if(client.prefs.species) diff --git a/code/modules/mob/new_player/preferences_setup.dm b/code/modules/mob/new_player/preferences_setup.dm index 3ab762eae4e..1c997ec0de5 100644 --- a/code/modules/mob/new_player/preferences_setup.dm +++ b/code/modules/mob/new_player/preferences_setup.dm @@ -1,4 +1,4 @@ -/datum/preferences/proc/randomize_appearance_and_body_for(var/mob/living/carbon/human/H) +/datum/preferences/proc/randomize_appearance_and_body_for(var/mob/living/human/H) if(!H) H = client?.mob @@ -48,7 +48,7 @@ if(H) copy_to(H) -/datum/preferences/proc/dress_preview_mob(var/mob/living/carbon/human/dummy/mannequin) +/datum/preferences/proc/dress_preview_mob(var/mob/living/human/dummy/mannequin) if(!mannequin) return @@ -104,7 +104,7 @@ mannequin.compile_overlays() /datum/preferences/proc/update_preview_icon() - var/mob/living/carbon/human/dummy/mannequin/mannequin = get_mannequin(client?.ckey) + var/mob/living/human/dummy/mannequin/mannequin = get_mannequin(client?.ckey) if(mannequin) mannequin.delete_inventory(TRUE) dress_preview_mob(mannequin) diff --git a/code/modules/mob/observer/ghost/ghost.dm b/code/modules/mob/observer/ghost/ghost.dm index 188bc47fc4e..f9026358567 100644 --- a/code/modules/mob/observer/ghost/ghost.dm +++ b/code/modules/mob/observer/ghost/ghost.dm @@ -127,13 +127,13 @@ Works together with spawning an observer, noted above. /mob/observer/ghost/proc/process_medHUD(var/mob/M) var/client/C = M.client - for(var/mob/living/carbon/human/patient in oview(M, 14)) + for(var/mob/living/human/patient in oview(M, 14)) C.images += patient.hud_list[HEALTH_HUD] C.images += patient.hud_list[STATUS_HUD_OOC] /mob/observer/ghost/proc/assess_targets(list/target_list, mob/observer/ghost/U) var/client/C = U.client - for(var/mob/living/carbon/human/target in target_list) + for(var/mob/living/human/target in target_list) C.images += target.hud_list[SPECIALROLE_HUD] for(var/mob/living/silicon/target in target_list) C.images += target.hud_list[SPECIALROLE_HUD] diff --git a/code/modules/mob/skills/skill_verbs.dm b/code/modules/mob/skills/skill_verbs.dm index bad46b8f8b2..9364a5d8862 100644 --- a/code/modules/mob/skills/skill_verbs.dm +++ b/code/modules/mob/skills/skill_verbs.dm @@ -72,7 +72,7 @@ Robots and antags can instruct. if(skillset.owner.skill_check(S.type, SKILL_EXPERT)) return 1 -/mob/proc/can_instruct(mob/living/carbon/human/target, var/get_options = FALSE) +/mob/proc/can_instruct(mob/living/human/target, var/get_options = FALSE) var/datum/skill_verb/instruct/SV = skillset.fetch_verb_datum(/datum/skill_verb/instruct) if(!SV || !istype(target)) @@ -98,7 +98,7 @@ Robots and antags can instruct. if(!target.skill_check(S.type, SKILL_BASIC) && skill_check(S.type, SKILL_EXPERT)) LAZYSET(., S.name, S) -/mob/proc/instruct(mob/living/carbon/human/target as mob in oview(2)) +/mob/proc/instruct(mob/living/human/target as mob in oview(2)) set category = "IC" set name = "Instruct" diff --git a/code/modules/mob/transform_procs.dm b/code/modules/mob/transform_procs.dm index f62567389cb..3d3d1406bc5 100644 --- a/code/modules/mob/transform_procs.dm +++ b/code/modules/mob/transform_procs.dm @@ -1,4 +1,4 @@ -/mob/living/carbon/human/proc/monkeyize() +/mob/living/human/proc/monkeyize() if (HAS_TRANSFORMATION_MOVEMENT_HANDLER(src)) return for(var/obj/item/W in get_contained_external_atoms()) @@ -39,7 +39,7 @@ spawning = 1 return ..() -/mob/living/carbon/human/AIize(move=1) // 'move' argument needs defining here too because BYOND is dumb +/mob/living/human/AIize(move=1) // 'move' argument needs defining here too because BYOND is dumb if (HAS_TRANSFORMATION_MOVEMENT_HANDLER(src)) return QDEL_NULL_LIST(worn_underwear) @@ -104,7 +104,7 @@ return O //human -> robot -/mob/living/carbon/human/proc/Robotize(var/supplied_robot_type = /mob/living/silicon/robot) +/mob/living/human/proc/Robotize(var/supplied_robot_type = /mob/living/silicon/robot) if (HAS_TRANSFORMATION_MOVEMENT_HANDLER(src)) return QDEL_NULL_LIST(worn_underwear) @@ -141,7 +141,7 @@ qdel(src) // Queues us for a hard delete return O -/mob/living/carbon/human/proc/corgize() +/mob/living/human/proc/corgize() if (HAS_TRANSFORMATION_MOVEMENT_HANDLER(src)) return for(var/obj/item/W in src) @@ -161,7 +161,7 @@ qdel(src) return -/mob/living/carbon/human/Animalize() +/mob/living/human/Animalize() var/list/mobtypes = typesof(/mob/living/simple_animal) var/mobpath = input("Which type of mob should [src] turn into?", "Choose a type") in mobtypes @@ -260,7 +260,7 @@ return 0 -/mob/living/carbon/human/proc/zombify() +/mob/living/human/proc/zombify() add_genetic_condition(GENE_COND_HUSK) add_genetic_condition(GENE_COND_CLUMSY) src.visible_message("\The [src]'s skin decays before your very eyes!", "Your entire body is ripe with pain as it is consumed down to flesh and bones. You ... hunger. Not only for flesh, but to spread this gift.") diff --git a/code/modules/mob_holder/_holder.dm b/code/modules/mob_holder/_holder.dm index db21bf95f0e..7efdbfa7f9c 100644 --- a/code/modules/mob_holder/_holder.dm +++ b/code/modules/mob_holder/_holder.dm @@ -134,7 +134,7 @@ /obj/item/holder/proc/sync(var/mob/living/M) SetName(M.name) desc = M.desc - var/mob/living/carbon/human/H = loc + var/mob/living/human/H = loc if(istype(H)) last_holder = H register_all_movement(H, M) diff --git a/code/modules/mob_holder/holder_mobs.dm b/code/modules/mob_holder/holder_mobs.dm index 653c71d807d..d07a128335c 100644 --- a/code/modules/mob_holder/holder_mobs.dm +++ b/code/modules/mob_holder/holder_mobs.dm @@ -4,10 +4,10 @@ /mob/proc/get_holder_color() return color -/mob/living/carbon/human/get_holder_icon() +/mob/living/human/get_holder_icon() return species.holder_icon || ..() -/mob/living/carbon/human/get_holder_color() +/mob/living/human/get_holder_color() return species.get_holder_color(src) //Mob procs for scooping up diff --git a/code/modules/modular_computers/computers/modular_computer/core.dm b/code/modules/modular_computers/computers/modular_computer/core.dm index ede7ce9165a..9c0f8f262cd 100644 --- a/code/modules/modular_computers/computers/modular_computer/core.dm +++ b/code/modules/modular_computers/computers/modular_computer/core.dm @@ -39,7 +39,7 @@ // Used to install preset-specific programs /obj/item/modular_computer/proc/install_default_programs() - var/mob/living/carbon/human/H = get_recursive_loc_of_type(/mob) + var/mob/living/human/H = get_recursive_loc_of_type(/mob) var/list/job_programs = list() if(H) var/datum/job/jb = SSjobs.get_by_title(H.job) diff --git a/code/modules/modular_computers/computers/subtypes/dev_pda.dm b/code/modules/modular_computers/computers/subtypes/dev_pda.dm index 15b3f94e5d3..de01d091157 100644 --- a/code/modules/modular_computers/computers/subtypes/dev_pda.dm +++ b/code/modules/modular_computers/computers/subtypes/dev_pda.dm @@ -24,7 +24,7 @@ /obj/item/modular_computer/pda/on_update_icon() . = ..() - var/mob/living/carbon/human/H = loc + var/mob/living/human/H = loc if(istype(H) && H.get_equipped_item(slot_wear_id_str) == src) H.update_equipment_overlay(slot_wear_id_str) diff --git a/code/modules/modular_computers/file_system/programs/generic/folding.dm b/code/modules/modular_computers/file_system/programs/generic/folding.dm index 30c5c9ffcd0..a7472a35264 100644 --- a/code/modules/modular_computers/file_system/programs/generic/folding.dm +++ b/code/modules/modular_computers/file_system/programs/generic/folding.dm @@ -64,7 +64,7 @@ if(world.timeofday < next_event) //Checks if it's time for the next crash chance. return - var/mob/living/holder = computer.holder.get_recursive_loc_of_type(/mob/living/carbon/human) + var/mob/living/holder = computer.holder.get_recursive_loc_of_type(/mob/living/human) var/host = computer.get_physical_host() if(program_status > PROGRAM_STATUS_CRASHED) if(PROGRAM_STATUS_RUNNING_SCALDING >= program_status) diff --git a/code/modules/modular_computers/file_system/programs/generic/supply.dm b/code/modules/modular_computers/file_system/programs/generic/supply.dm index 82c554665be..c13b4b0101b 100644 --- a/code/modules/modular_computers/file_system/programs/generic/supply.dm +++ b/code/modules/modular_computers/file_system/programs/generic/supply.dm @@ -180,7 +180,7 @@ var/idname = "*None Provided*" var/idrank = "*None Provided*" if(ishuman(user)) - var/mob/living/carbon/human/H = user + var/mob/living/human/H = user idname = H.get_authentification_name() idrank = H.get_assignment() else if(issilicon(user)) diff --git a/code/modules/modular_computers/file_system/programs/medical/suit_sensors.dm b/code/modules/modular_computers/file_system/programs/medical/suit_sensors.dm index d5586fc52de..21839f9d5d5 100644 --- a/code/modules/modular_computers/file_system/programs/medical/suit_sensors.dm +++ b/code/modules/modular_computers/file_system/programs/medical/suit_sensors.dm @@ -48,7 +48,7 @@ if(href_list["track"]) if(isAI(usr)) var/mob/living/silicon/ai/AI = usr - var/mob/living/carbon/human/H = locate(href_list["track"]) in SSmobs.mob_list + var/mob/living/human/H = locate(href_list["track"]) in SSmobs.mob_list if(hassensorlevel(H, VITALS_SENSOR_TRACKING)) AI.ai_actual_track(H) return 1 diff --git a/code/modules/modular_computers/file_system/reports/crew_record.dm b/code/modules/modular_computers/file_system/reports/crew_record.dm index 190e05ef531..6364d2c4bca 100644 --- a/code/modules/modular_computers/file_system/reports/crew_record.dm +++ b/code/modules/modular_computers/file_system/reports/crew_record.dm @@ -23,13 +23,13 @@ var/global/arrest_security_status = "Arrest" . = ..() global.all_crew_records.Remove(src) -/datum/computer_file/report/crew_record/proc/load_from_mob(var/mob/living/carbon/human/H) +/datum/computer_file/report/crew_record/proc/load_from_mob(var/mob/living/human/H) if(istype(H)) photo_front = getFlatIcon(H, SOUTH, always_use_defdir = 1) photo_side = getFlatIcon(H, WEST, always_use_defdir = 1) else - var/mob/living/carbon/human/dummy = new() + var/mob/living/human/dummy = new() photo_front = getFlatIcon(dummy, SOUTH, always_use_defdir = 1) photo_side = getFlatIcon(dummy, WEST, always_use_defdir = 1) qdel(dummy) @@ -202,7 +202,7 @@ var/global/arrest_security_status = "Arrest" return CR return null -/proc/GetAssignment(var/mob/living/carbon/human/H) +/proc/GetAssignment(var/mob/living/human/H) if(!H) return "Unassigned" if(!H.mind) diff --git a/code/modules/multiz/movement.dm b/code/modules/multiz/movement.dm index b25a5c78af0..326db2561e1 100644 --- a/code/modules/multiz/movement.dm +++ b/code/modules/multiz/movement.dm @@ -16,7 +16,7 @@ /mob/proc/move_down() SelfMove(DOWN) -/mob/living/carbon/human/move_up() +/mob/living/human/move_up() var/turf/old_loc = loc ..() if(loc != old_loc) @@ -48,7 +48,7 @@ /mob/proc/can_overcome_gravity() return FALSE -/mob/living/carbon/human/can_overcome_gravity() +/mob/living/human/can_overcome_gravity() //First do species check if(species && species.can_overcome_gravity(src)) return 1 @@ -162,7 +162,7 @@ if((locate(/obj/structure/disposalpipe/up) in below) || locate(/obj/machinery/atmospherics/pipe/zpipe/up) in below) return FALSE -/mob/living/carbon/human/can_fall(var/anchor_bypass = FALSE, var/turf/location_override = loc) +/mob/living/human/can_fall(var/anchor_bypass = FALSE, var/turf/location_override = loc) if(..()) return species.can_fall(src) @@ -239,7 +239,7 @@ return 100 return BASE_STORAGE_COST(w_class) -/mob/living/carbon/human/apply_fall_damage(var/turf/landing) +/mob/living/human/apply_fall_damage(var/turf/landing) if(status_flags & GODMODE) return if(species && species.handle_fall_special(src, landing)) @@ -268,7 +268,7 @@ victim.dislocate() to_chat(src, "You feel a sickening pop as your [victim.joint] is wrenched out of the socket.") -/mob/living/carbon/human/proc/climb_up(atom/A) +/mob/living/human/proc/climb_up(atom/A) if(!isturf(loc) || !bound_overlay || bound_overlay.destruction_timer || is_physically_disabled()) // This destruction_timer check ideally wouldn't be required, but I'm not awake enough to refactor this to not need it. return FALSE @@ -375,7 +375,7 @@ /mob/living/simple_animal/can_float() return is_aquatic -/mob/living/carbon/human/can_float() +/mob/living/human/can_float() return species.can_float(src) /mob/living/silicon/can_float() diff --git a/code/modules/multiz/stairs.dm b/code/modules/multiz/stairs.dm index 6bff344b06d..e99c09cd85d 100644 --- a/code/modules/multiz/stairs.dm +++ b/code/modules/multiz/stairs.dm @@ -33,7 +33,7 @@ for(var/obj/item/grab/G in L.get_active_grabs()) G.affecting.forceMove(target) if(ishuman(A)) - var/mob/living/carbon/human/H = A + var/mob/living/human/H = A if(H.has_footsteps()) playsound(source, 'sound/effects/stairs_step.ogg', 50) playsound(target, 'sound/effects/stairs_step.ogg', 50) diff --git a/code/modules/nano/interaction/default.dm b/code/modules/nano/interaction/default.dm index 46b8190ae47..4e1f89bb2d4 100644 --- a/code/modules/nano/interaction/default.dm +++ b/code/modules/nano/interaction/default.dm @@ -83,7 +83,7 @@ var/global/datum/topic_state/default/default_topic_state = new if(. == STATUS_INTERACTIVE) return STATUS_UPDATE -/mob/living/carbon/human/default_can_use_topic(var/src_object) +/mob/living/human/default_can_use_topic(var/src_object) . = shared_nano_interaction(src_object) if(. != STATUS_CLOSE) if(loc) diff --git a/code/modules/nano/modules/human_appearance.dm b/code/modules/nano/modules/human_appearance.dm index cefa879ebb0..8b30cf95b20 100644 --- a/code/modules/nano/modules/human_appearance.dm +++ b/code/modules/nano/modules/human_appearance.dm @@ -2,12 +2,12 @@ name = "Appearance Editor" available_to_ai = FALSE var/flags = APPEARANCE_ALL_HAIR - var/mob/living/carbon/human/owner = null + var/mob/living/human/owner = null var/check_whitelist var/list/whitelist var/list/blacklist -/datum/nano_module/appearance_changer/New(var/location, var/mob/living/carbon/human/H, var/check_species_whitelist = 1, var/list/species_whitelist = list(), var/list/species_blacklist = list()) +/datum/nano_module/appearance_changer/New(var/location, var/mob/living/human/H, var/check_species_whitelist = 1, var/list/species_whitelist = list(), var/list/species_blacklist = list()) ..() owner = H src.check_whitelist = check_species_whitelist diff --git a/code/modules/organs/external/_external.dm b/code/modules/organs/external/_external.dm index 51e9061455a..1b718f2a068 100644 --- a/code/modules/organs/external/_external.dm +++ b/code/modules/organs/external/_external.dm @@ -428,7 +428,7 @@ if(can_feel_pain()) add_pain(20) owner.apply_effect(5, STUN) - owner.verbs |= /mob/living/carbon/human/proc/undislocate + owner.verbs |= /mob/living/human/proc/undislocate /obj/item/organ/external/proc/undislocate(var/skip_pain = FALSE) if(!(limb_flags & ORGAN_FLAG_CAN_DISLOCATE)) @@ -444,10 +444,10 @@ for(var/obj/item/organ/external/limb in owner.get_external_organs()) if(limb.is_dislocated()) return - owner.verbs -= /mob/living/carbon/human/proc/undislocate + owner.verbs -= /mob/living/human/proc/undislocate //If "in_place" is TRUE will make organs skip their install/uninstall effects and the sub-limbs and internal organs -/obj/item/organ/external/do_install(mob/living/carbon/human/target, obj/item/organ/external/affected, in_place, update_icon, detached) +/obj/item/organ/external/do_install(mob/living/human/target, obj/item/organ/external/affected, in_place, update_icon, detached) if(!(. = ..())) return @@ -931,7 +931,7 @@ Note that amputating the affected organ does in fact remove the infection from t status &= ~ORGAN_BLEEDING var/clamped = 0 - var/mob/living/carbon/human/H + var/mob/living/human/H if(ishuman(owner)) H = owner @@ -1085,7 +1085,7 @@ Note that amputating the affected organ does in fact remove the infection from t owner.shock_stage += min_broken_damage var/obj/item/organ/external/original_parent = parent - var/mob/living/carbon/human/victim = owner //Keep a reference for post-removed(). + var/mob/living/human/victim = owner //Keep a reference for post-removed(). owner.remove_organ(src, TRUE, FALSE, ignore_children, update_icon = FALSE) var/remaining_organs = victim.get_external_organs() if(istype(victim) && !QDELETED(victim)) @@ -1153,7 +1153,7 @@ Note that amputating the affected organ does in fact remove the infection from t HELPERS ****************************************************/ -/obj/item/organ/external/proc/release_restraints(var/mob/living/carbon/human/holder) +/obj/item/organ/external/proc/release_restraints(var/mob/living/human/holder) if(!holder) holder = owner if(!holder) @@ -1360,7 +1360,7 @@ Note that amputating the affected organ does in fact remove the infection from t /obj/item/organ/external/do_uninstall(in_place, detach, ignore_children, update_icon) - var/mob/living/carbon/human/victim = owner //parent proc clears owner + var/mob/living/human/victim = owner //parent proc clears owner if(!(. = ..())) return diff --git a/code/modules/organs/external/_external_icons.dm b/code/modules/organs/external/_external_icons.dm index 393d6d29977..07af53dd451 100644 --- a/code/modules/organs/external/_external_icons.dm +++ b/code/modules/organs/external/_external_icons.dm @@ -25,7 +25,7 @@ var/global/list/limb_icon_cache = list() return null return species?.get_surgery_overlay_icon(owner) -/obj/item/organ/external/proc/sync_colour_to_human(var/mob/living/carbon/human/human) +/obj/item/organ/external/proc/sync_colour_to_human(var/mob/living/human/human) _icon_cache_key = null skin_tone = null skin_colour = null @@ -36,7 +36,7 @@ var/global/list/limb_icon_cache = list() if(bodytype.appearance_flags & HAS_SKIN_COLOR) skin_colour = human.get_skin_colour() -/obj/item/organ/external/head/sync_colour_to_human(var/mob/living/carbon/human/human) +/obj/item/organ/external/head/sync_colour_to_human(var/mob/living/human/human) ..() var/obj/item/organ/internal/eyes/eyes = human.get_organ(BP_EYES, /obj/item/organ/internal/eyes) if(eyes) eyes.update_colour() diff --git a/code/modules/organs/external/head.dm b/code/modules/organs/external/head.dm index dcb72b43f69..1d6b432822c 100644 --- a/code/modules/organs/external/head.dm +++ b/code/modules/organs/external/head.dm @@ -114,7 +114,7 @@ if(eye_glow) LAZYADD(., eye_glow) -/obj/item/organ/external/head/gripper/do_install(mob/living/carbon/human/target, affected, in_place, update_icon, detached) +/obj/item/organ/external/head/gripper/do_install(mob/living/human/target, affected, in_place, update_icon, detached) . = ..() if(. && owner) owner.add_held_item_slot(new /datum/inventory_slot/gripper/mouth) diff --git a/code/modules/organs/external/standard.dm b/code/modules/organs/external/standard.dm index 8579c7690da..6864436733d 100644 --- a/code/modules/organs/external/standard.dm +++ b/code/modules/organs/external/standard.dm @@ -144,7 +144,7 @@ limb_flags = ORGAN_FLAG_CAN_AMPUTATE | ORGAN_FLAG_FINGERPRINT | ORGAN_FLAG_HAS_TENDON | ORGAN_FLAG_CAN_BREAK | ORGAN_FLAG_CAN_DISLOCATE var/gripper_type = /datum/inventory_slot/gripper/left_hand -/obj/item/organ/external/hand/do_install(mob/living/carbon/human/target, affected, in_place, update_icon, detached) +/obj/item/organ/external/hand/do_install(mob/living/human/target, affected, in_place, update_icon, detached) . = ..() if(. && owner && gripper_type) owner.add_held_item_slot(new gripper_type) diff --git a/code/modules/organs/external/tail.dm b/code/modules/organs/external/tail.dm index 55fff675056..0425e7de994 100644 --- a/code/modules/organs/external/tail.dm +++ b/code/modules/organs/external/tail.dm @@ -29,13 +29,13 @@ var/tail_states = 1 /obj/item/organ/external/tail/do_uninstall(in_place, detach, ignore_children, update_icon) - var/mob/living/carbon/human/H = owner + var/mob/living/human/H = owner if(!(. = ..())) return if(update_icon && !istype(H) && !QDELETED(H) && H != owner) H.update_tail_showing(FALSE) -/obj/item/organ/external/tail/do_install(mob/living/carbon/human/target, affected, in_place, update_icon, detached) +/obj/item/organ/external/tail/do_install(mob/living/human/target, affected, in_place, update_icon, detached) . = ..() if(update_icon && istype(owner) && !QDELETED(owner)) owner.update_tail_showing(FALSE) diff --git a/code/modules/organs/internal/_internal.dm b/code/modules/organs/internal/_internal.dm index 1e7d862f48a..4ced3c84d5a 100644 --- a/code/modules/organs/internal/_internal.dm +++ b/code/modules/organs/internal/_internal.dm @@ -38,7 +38,7 @@ if(species.organs_icon) icon = species.organs_icon -/obj/item/organ/internal/do_install(mob/living/carbon/human/target, obj/item/organ/external/affected, in_place, update_icon, detached) +/obj/item/organ/internal/do_install(mob/living/human/target, obj/item/organ/external/affected, in_place, update_icon, detached) . = ..() if(!affected) @@ -291,7 +291,7 @@ return brainmob?.key // This might need revisiting to stop people successfully implanting brains in groins and transferring minds. -/obj/item/organ/internal/do_install(mob/living/carbon/human/target, obj/item/organ/external/affected, in_place, update_icon, detached) +/obj/item/organ/internal/do_install(mob/living/human/target, obj/item/organ/external/affected, in_place, update_icon, detached) . = ..() if(transfer_brainmob_with_organ && istype(owner)) var/mob/living/brainmob = get_brainmob(create_if_missing = FALSE) diff --git a/code/modules/organs/internal/eyes.dm b/code/modules/organs/internal/eyes.dm index 510f53fcdac..f193afaa4da 100644 --- a/code/modules/organs/internal/eyes.dm +++ b/code/modules/organs/internal/eyes.dm @@ -90,7 +90,7 @@ /obj/item/organ/internal/eyes/proc/additional_flash_effects(var/intensity) return -1 -/obj/item/organ/internal/eyes/do_install(mob/living/carbon/human/target, affected, in_place, update_icon, detached) +/obj/item/organ/internal/eyes/do_install(mob/living/human/target, affected, in_place, update_icon, detached) // Apply our eye colour to the target. if(istype(target) && eye_colour) target.set_eye_colour(eye_colour, skip_update = TRUE) diff --git a/code/modules/organs/internal/heart.dm b/code/modules/organs/internal/heart.dm index 74f106ba2a6..8b96ce26763 100644 --- a/code/modules/organs/internal/heart.dm +++ b/code/modules/organs/internal/heart.dm @@ -137,7 +137,7 @@ if(W.bleeding()) if(temp.applied_pressure) if(ishuman(temp.applied_pressure)) - var/mob/living/carbon/human/H = temp.applied_pressure + var/mob/living/human/H = temp.applied_pressure H.bloody_hands(src, 0) //somehow you can apply pressure to every wound on the organ at the same time //you're basically forced to do nothing at all, so let's make it pretty effective diff --git a/code/modules/organs/internal/lungs.dm b/code/modules/organs/internal/lungs.dm index d790c965550..7a9b0cb8180 100644 --- a/code/modules/organs/internal/lungs.dm +++ b/code/modules/organs/internal/lungs.dm @@ -41,7 +41,7 @@ inhaled.my_atom = src . = ..() -/obj/item/organ/internal/lungs/do_install(mob/living/carbon/human/target, obj/item/organ/external/affected, in_place) +/obj/item/organ/internal/lungs/do_install(mob/living/human/target, obj/item/organ/external/affected, in_place) if(!(. = ..())) return inhaled.my_atom = owner diff --git a/code/modules/organs/organ.dm b/code/modules/organs/organ.dm index 0ef396c83fc..222c2c3aa8b 100644 --- a/code/modules/organs/organ.dm +++ b/code/modules/organs/organ.dm @@ -20,7 +20,7 @@ // Reference data. var/datum/mob_snapshot/organ_appearance - var/mob/living/carbon/human/owner // Current mob owning the organ. + var/mob/living/human/owner // Current mob owning the organ. var/decl/species/species // Original species. var/decl/bodytype/bodytype // Original bodytype. var/list/ailments // Current active ailments if any. @@ -555,7 +555,7 @@ var/global/list/ailment_reference_cache = list() // 3. When attaching a detached organ through surgery this is called. // The organ may be inside an external organ that's not inside a mob, or inside a mob //detached : If true, the organ will be installed in a detached state, otherwise it will be added in an attached state -/obj/item/organ/proc/do_install(var/mob/living/carbon/human/target, var/obj/item/organ/external/affected, var/in_place = FALSE, var/update_icon = TRUE, var/detached = FALSE) +/obj/item/organ/proc/do_install(var/mob/living/human/target, var/obj/item/organ/external/affected, var/in_place = FALSE, var/update_icon = TRUE, var/detached = FALSE) //Make sure to force the flag accordingly set_detached(detached) if(QDELETED(src)) diff --git a/code/modules/organs/pain.dm b/code/modules/organs/pain.dm index 8554d28f972..12ab422d198 100644 --- a/code/modules/organs/pain.dm +++ b/code/modules/organs/pain.dm @@ -49,7 +49,7 @@ if(!(use_emote.message_type == AUDIBLE_MESSAGE &&HAS_STATUS(src, STAT_SILENCE))) emote(force_emote) -/mob/living/carbon/human/proc/handle_pain() +/mob/living/human/proc/handle_pain() if(stat) return if(!can_feel_pain()) diff --git a/code/modules/organs/prosthetics/_prosthetics.dm b/code/modules/organs/prosthetics/_prosthetics.dm index e3ca1199848..603f76dfae9 100644 --- a/code/modules/organs/prosthetics/_prosthetics.dm +++ b/code/modules/organs/prosthetics/_prosthetics.dm @@ -13,7 +13,7 @@ // Checks if a limb could theoretically be removed. // Note that this does not currently bother checking if a child or internal organ is vital. -/obj/item/organ/external/proc/can_remove_modular_limb(var/mob/living/carbon/human/user) +/obj/item/organ/external/proc/can_remove_modular_limb(var/mob/living/human/user) if((owner?.species && is_vital_to_owner()) || !(limb_flags & ORGAN_FLAG_CAN_AMPUTATE)) return FALSE var/bodypart_cat = get_modular_limb_category() @@ -26,7 +26,7 @@ . = (bodypart_cat != MODULAR_BODYPART_INVALID) // Note that this proc is checking if the organ can be attached -to-, not attached itself. -/obj/item/organ/external/proc/can_attach_modular_limb_here(var/mob/living/carbon/human/user) +/obj/item/organ/external/proc/can_attach_modular_limb_here(var/mob/living/human/user) var/list/limb_data = user?.get_bodytype()?.has_limbs[organ_tag] if(islist(limb_data) && limb_data["has_children"] > 0) . = (LAZYLEN(children) < limb_data["has_children"]) @@ -47,13 +47,13 @@ return TRUE // Checks if an organ (or the parent of one) is in a fit state for modular limb stuff to happen. -/obj/item/organ/external/proc/check_modular_limb_damage(var/mob/living/carbon/human/user) +/obj/item/organ/external/proc/check_modular_limb_damage(var/mob/living/human/user) . = damage >= min_broken_damage || (status & ORGAN_BROKEN) // can't use is_broken() as the limb has ORGAN_CUT_AWAY // Human mob procs: // Checks the organ list for limbs meeting a predicate. Way overengineered for such a limited use // case but I can see it being expanded in the future if meat limbs or doona limbs use it. -/mob/living/carbon/human/proc/get_modular_limbs(var/return_first_found = FALSE, var/validate_proc) +/mob/living/human/proc/get_modular_limbs(var/return_first_found = FALSE, var/validate_proc) for(var/obj/item/organ/external/limb as anything in get_external_organs()) if(!validate_proc || call(limb, validate_proc)(src) > MODULAR_BODYPART_INVALID) LAZYADD(., limb) @@ -67,7 +67,7 @@ . -= limb.children // Called in bodytype.apply_bodytype_organ_modifications(), replaced() and removed() to update our modular limb verbs. -/mob/living/carbon/human/proc/refresh_modular_limb_verbs() +/mob/living/human/proc/refresh_modular_limb_verbs() if(length(get_modular_limbs(return_first_found = TRUE, validate_proc = /obj/item/organ/external/proc/can_attach_modular_limb_here))) verbs |= .proc/attach_limb_verb else @@ -78,7 +78,7 @@ verbs -= .proc/detach_limb_verb // Proc helper for attachment verb. -/mob/living/carbon/human/proc/check_can_attach_modular_limb(var/obj/item/organ/external/E) +/mob/living/human/proc/check_can_attach_modular_limb(var/obj/item/organ/external/E) if(is_on_special_ability_cooldown() || get_active_held_item() != E) return FALSE if(incapacitated() || restrained()) @@ -109,7 +109,7 @@ return TRUE // Proc helper for detachment verb. -/mob/living/carbon/human/proc/check_can_detach_modular_limb(var/obj/item/organ/external/E) +/mob/living/human/proc/check_can_detach_modular_limb(var/obj/item/organ/external/E) if(is_on_special_ability_cooldown()) return FALSE if(incapacitated() || restrained()) @@ -130,7 +130,7 @@ // Verbs below: // Add or remove robotic limbs; check refresh_modular_limb_verbs() above. -/mob/living/carbon/human/proc/attach_limb_verb() +/mob/living/human/proc/attach_limb_verb() set name = "Attach Limb" set category = "Object" set desc = "Attach a replacement limb." @@ -160,7 +160,7 @@ try_refresh_visible_overlays() // Not sure why this isn't called by removed(), but without it we don't update our limb appearance. return TRUE -/mob/living/carbon/human/proc/detach_limb_verb() +/mob/living/human/proc/detach_limb_verb() set name = "Remove Limb" set category = "Object" set desc = "Detach one of your limbs." diff --git a/code/modules/overmap/ftl_shunt/core.dm b/code/modules/overmap/ftl_shunt/core.dm index f8f5b1baf1b..eea9868992d 100644 --- a/code/modules/overmap/ftl_shunt/core.dm +++ b/code/modules/overmap/ftl_shunt/core.dm @@ -154,7 +154,7 @@ /obj/machinery/ftl_shunt/core/physical_attack_hand(var/mob/user) if(sabotaged) - var/mob/living/carbon/human/h_user = user + var/mob/living/human/h_user = user if(!istype(h_user)) return TRUE var/skill_delay = user.skill_delay_mult(SKILL_ENGINES, 0.3) @@ -222,7 +222,7 @@ return FTL_START_FAILURE_FUEL if(sabotaged) - for(var/mob/living/carbon/human/H in global.living_mob_list_) //Give engineers a hint that something might be very, very wrong. + for(var/mob/living/human/H in global.living_mob_list_) //Give engineers a hint that something might be very, very wrong. if(!(H.z in ftl_computer.linked.map_z)) continue if(H.skill_check(SKILL_ENGINES, SKILL_EXPERT)) @@ -311,7 +311,7 @@ else shunt_sev = SHUNT_SEVERITY_CRITICAL - for(var/mob/living/carbon/human/H in global.living_mob_list_) //Affect mobs, skip synthetics. + for(var/mob/living/human/H in global.living_mob_list_) //Affect mobs, skip synthetics. sound_to(H, 'sound/machines/hyperspace_end.ogg') if(!(H.z in ftl_computer.linked.map_z)) @@ -373,7 +373,7 @@ if(prob(50)) A.overload_lighting(50) -/obj/machinery/ftl_shunt/core/proc/handle_spacefloat(var/mob/living/carbon/human/H) +/obj/machinery/ftl_shunt/core/proc/handle_spacefloat(var/mob/living/human/H) if(!H.check_space_footing()) //Flip a coin ... to_chat(H, SPAN_WARNING("Being untethered from a ship entering FTL is a bad idea, but you roll the dice...")) @@ -391,7 +391,7 @@ switch(sabotaged) if(SHUNT_SABOTAGE_MINOR) announcetxt = shunt_sabotage_text_minor - for(var/mob/living/carbon/human/H in view(7)) + for(var/mob/living/human/H in view(7)) H.show_message(SPAN_DANGER("\The [src] emits a flash of incredibly bright, searing light!"), VISIBLE_MESSAGE) H.flash_eyes(FLASH_PROTECTION_NONE) empulse(src, 8, 10) @@ -416,7 +416,7 @@ continue A.energy_fail(rand(100,120)) - for(var/mob/living/carbon/human/H in view(7)) //scary text if you're in view, because you're fucked now boy. + for(var/mob/living/human/H in view(7)) //scary text if you're in view, because you're fucked now boy. H.show_message(SPAN_DANGER("The light around \the [src] warps before it emits a flash of incredibly bright, searing light!"), VISIBLE_MESSAGE) H.flash_eyes(FLASH_PROTECTION_NONE) diff --git a/code/modules/overmap/spacetravel.dm b/code/modules/overmap/spacetravel.dm index 2aaef59f4f4..24747a3d46f 100644 --- a/code/modules/overmap/spacetravel.dm +++ b/code/modules/overmap/spacetravel.dm @@ -43,5 +43,5 @@ /mob/overmap_can_discard() return isnull(client) -/mob/living/carbon/human/overmap_can_discard() +/mob/living/human/overmap_can_discard() return isnull(client) && (!last_ckey || stat == DEAD) diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm index ba7d20c7b7a..a7756f7e6d0 100644 --- a/code/modules/power/apc.dm +++ b/code/modules/power/apc.dm @@ -487,7 +487,7 @@ var/global/list/all_apcs = list() /obj/machinery/power/apc/physical_attack_hand(mob/user) //Human mob special interaction goes here. if(ishuman(user)) - var/mob/living/carbon/human/H = user + var/mob/living/human/H = user if(H.species.can_shred(H)) user.visible_message("\The [user] slashes at \the [src]!", "You slash at \the [src]!") diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm index c744458397a..434a96e50c1 100644 --- a/code/modules/power/cable.dm +++ b/code/modules/power/cable.dm @@ -537,7 +537,7 @@ By design, d1 is the smallest direction and d2 is the highest //you can use wires to heal robotics /obj/item/stack/cable_coil/use_on_mob(mob/living/target, mob/living/user, animate = TRUE) if(ishuman(target) && user.a_intent == I_HELP) - var/mob/living/carbon/human/H = target + var/mob/living/human/H = target var/obj/item/organ/external/S = GET_EXTERNAL_ORGAN(H, user.get_target_zone()) if(!S || !BP_IS_PROSTHETIC(S) || user.a_intent != I_HELP) return ..() diff --git a/code/modules/power/fusion/fusion_reactions.dm b/code/modules/power/fusion/fusion_reactions.dm index 66d44183612..73cffcc1529 100644 --- a/code/modules/power/fusion/fusion_reactions.dm +++ b/code/modules/power/fusion/fusion_reactions.dm @@ -115,7 +115,7 @@ // Copied from the SM for proof of concept. //Not any more --Cirra //Use the whole z proc --Leshana SSradiation.z_radiate(locate(1, 1, holder.z), radiation_level, 1) - for(var/mob/living/carbon/human/H in global.living_mob_list_) + for(var/mob/living/human/H in global.living_mob_list_) var/turf/T = get_turf(H) if(T && (holder.z == T.z)) H.set_hallucination(rand(100,150), 51) diff --git a/code/modules/power/lighting.dm b/code/modules/power/lighting.dm index 552110afd4f..0a450cd6b11 100644 --- a/code/modules/power/lighting.dm +++ b/code/modules/power/lighting.dm @@ -317,7 +317,7 @@ return TRUE if(ishuman(user)) - var/mob/living/carbon/human/H = user + var/mob/living/human/H = user if(H.species.can_shred(H)) visible_message("[user.name] smashed the light!", 3, "You hear a tinkle of breaking glass.") broken() @@ -327,7 +327,7 @@ if(on) var/prot = FALSE - var/mob/living/carbon/human/H = user + var/mob/living/human/H = user if(istype(H)) var/obj/item/clothing/gloves/G = H.get_equipped_item(slot_gloves_str) if(istype(G) && G.max_heat_protection_temperature > LIGHT_BULB_TEMPERATURE) diff --git a/code/modules/power/power.dm b/code/modules/power/power.dm index cb997d4b0c4..ca4b205e6b0 100644 --- a/code/modules/power/power.dm +++ b/code/modules/power/power.dm @@ -215,7 +215,7 @@ if(PN) PN.trigger_warning(5) if(ishuman(M)) - var/mob/living/carbon/human/H = M + var/mob/living/human/H = M if(H.species.get_shock_vulnerability(H) <= 0) return var/obj/item/clothing/gloves/G = H.get_equipped_item(slot_gloves_str) diff --git a/code/modules/power/singularity/singularity_events.dm b/code/modules/power/singularity/singularity_events.dm index bed281df970..e48a040231b 100644 --- a/code/modules/power/singularity/singularity_events.dm +++ b/code/modules/power/singularity/singularity_events.dm @@ -33,7 +33,7 @@ continue if(M.stat == CONSCIOUS) if(ishuman(M)) - var/mob/living/carbon/human/H = M + var/mob/living/human/H = M if(istype(H.get_equipped_item(slot_glasses_str), /obj/item/clothing/glasses/meson)) if(source.current_stage.stage_size != STAGE_SUPER) to_chat(H, SPAN_WARNING("You look directly into \the [source]. Good thing you had your protective eyewear on!")) diff --git a/code/modules/power/smes_construction.dm b/code/modules/power/smes_construction.dm index b8ced099d91..54e525496c0 100644 --- a/code/modules/power/smes_construction.dm +++ b/code/modules/power/smes_construction.dm @@ -143,7 +143,7 @@ if (!intensity) return - var/mob/living/carbon/human/h_user = null + var/mob/living/human/h_user = null if (!ishuman(user)) return else diff --git a/code/modules/projectiles/ammunition.dm b/code/modules/projectiles/ammunition.dm index 01dfee17450..00a2cc7b86f 100644 --- a/code/modules/projectiles/ammunition.dm +++ b/code/modules/projectiles/ammunition.dm @@ -72,7 +72,7 @@ var/obj/item/gun/G = get_recursive_loc_of_type(/obj/item/gun) if(G) put_residue_on(G) - var/mob/living/carbon/human/H = G.get_recursive_loc_of_type(/mob/living/carbon/human) + var/mob/living/human/H = G.get_recursive_loc_of_type(/mob/living/human) if(H) var/holding_slot = H.get_held_slot_for_item(G) if(holding_slot) diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index 192ff14d5ad..6f18ee8cdcc 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -400,7 +400,7 @@ shake_camera(user, max(burst_delay*burst, fire_delay), screen_shake) if(ishuman(user) && user.is_cloaked()) //shooting will disable a rig cloaking device - var/mob/living/carbon/human/H = user + var/mob/living/human/H = user var/obj/item/rig/rig = H.get_rig() if(rig) for(var/obj/item/rig_module/stealth_field/S in rig.installed_modules) @@ -511,7 +511,7 @@ //shooting while in shock var/shock_dispersion = 0 if(ishuman(firer)) - var/mob/living/carbon/human/mob = firer + var/mob/living/human/mob = firer if(mob.shock_stage > 120) shock_dispersion = rand(-4,4) else if(mob.shock_stage > 70) @@ -542,7 +542,7 @@ /obj/item/gun/proc/handle_suicide(mob/living/user) if(!ishuman(user)) return - var/mob/living/carbon/human/M = user + var/mob/living/human/M = user mouthshoot = 1 admin_attacker_log(user, "is attempting to suicide with \a [src]") diff --git a/code/modules/projectiles/guns/energy/lasertag.dm b/code/modules/projectiles/guns/energy/lasertag.dm index e9857630b0b..fd6af12baa0 100644 --- a/code/modules/projectiles/guns/energy/lasertag.dm +++ b/code/modules/projectiles/guns/energy/lasertag.dm @@ -10,7 +10,7 @@ projectile_type = /obj/item/projectile/beam/lastertag/blue var/required_vest -/obj/item/gun/energy/lasertag/special_check(var/mob/living/carbon/human/M) +/obj/item/gun/energy/lasertag/special_check(var/mob/living/human/M) if(ishuman(M) && !istype(M.get_equipped_item(slot_wear_suit_str), required_vest)) to_chat(M, SPAN_WARNING("You need to be wearing your laser tag vest!")) return FALSE diff --git a/code/modules/projectiles/guns/launcher/money_cannon.dm b/code/modules/projectiles/guns/launcher/money_cannon.dm index bb585d1c534..8ef05876a4d 100644 --- a/code/modules/projectiles/guns/launcher/money_cannon.dm +++ b/code/modules/projectiles/guns/launcher/money_cannon.dm @@ -148,7 +148,7 @@ if(!ishuman(user)) return - var/mob/living/carbon/human/M = user + var/mob/living/human/M = user M.visible_message("[user] sticks [src] in their mouth, ready to pull the trigger...") if(!do_after(user, 40, progress = 0)) diff --git a/code/modules/projectiles/guns/projectile.dm b/code/modules/projectiles/guns/projectile.dm index 0ad32e5b64d..dd0320b8586 100644 --- a/code/modules/projectiles/guns/projectile.dm +++ b/code/modules/projectiles/guns/projectile.dm @@ -92,7 +92,7 @@ /obj/item/gun/projectile/process_point_blank(obj/projectile, atom/movable/firer, atom/target) ..() if(chambered && ishuman(target)) - var/mob/living/carbon/human/H = target + var/mob/living/human/H = target var/zone = BP_CHEST if(isliving(firer)) var/mob/living/user = firer diff --git a/code/modules/projectiles/projectile/beams.dm b/code/modules/projectiles/projectile/beams.dm index fd9905b1774..960f437fde0 100644 --- a/code/modules/projectiles/projectile/beams.dm +++ b/code/modules/projectiles/projectile/beams.dm @@ -148,7 +148,7 @@ /obj/item/projectile/beam/lastertag/blue/on_hit(var/atom/target, var/blocked = 0) if(ishuman(target)) - var/mob/living/carbon/human/M = target + var/mob/living/human/M = target if(istype(M.get_equipped_item(slot_wear_suit_str), /obj/item/clothing/suit/redtag)) SET_STATUS_MAX(M, STAT_WEAK, 5) return 1 @@ -163,7 +163,7 @@ /obj/item/projectile/beam/lastertag/red/on_hit(var/atom/target, var/blocked = 0) if(ishuman(target)) - var/mob/living/carbon/human/M = target + var/mob/living/human/M = target if(istype(M.get_equipped_item(slot_wear_suit_str), /obj/item/clothing/suit/bluetag)) SET_STATUS_MAX(M, STAT_WEAK, 5) return 1 @@ -181,7 +181,7 @@ /obj/item/projectile/beam/lastertag/omni/on_hit(var/atom/target, var/blocked = 0) if(ishuman(target)) - var/mob/living/carbon/human/M = target + var/mob/living/human/M = target var/obj/item/suit = M.get_equipped_item(slot_wear_suit_str) if((istype(suit, /obj/item/clothing/suit/bluetag))||(istype(suit, /obj/item/clothing/suit/redtag))) SET_STATUS_MAX(M, STAT_WEAK, 5) diff --git a/code/modules/projectiles/projectile/change.dm b/code/modules/projectiles/projectile/change.dm index 916f3e347d0..e66053ebe84 100644 --- a/code/modules/projectiles/projectile/change.dm +++ b/code/modules/projectiles/projectile/change.dm @@ -16,7 +16,7 @@ for(var/t in get_all_species()) . += t if(ishuman(M)) - var/mob/living/carbon/human/H = M + var/mob/living/human/H = M . -= H.species.name /obj/item/projectile/change/proc/apply_transformation(var/mob/M, var/choice) @@ -30,7 +30,7 @@ return R if(get_species_by_key(choice)) - var/mob/living/carbon/human/H = M + var/mob/living/human/H = M if(!istype(H)) H = new(get_turf(M)) H.set_gender(M.get_gender()) diff --git a/code/modules/projectiles/projectile/energy.dm b/code/modules/projectiles/projectile/energy.dm index 48ad05f512e..eb0cc1835e4 100644 --- a/code/modules/projectiles/projectile/energy.dm +++ b/code/modules/projectiles/projectile/energy.dm @@ -168,7 +168,7 @@ if(M.get_sound_volume_multiplier() < 0.2) ear_safety += 2 if(ishuman(M)) - var/mob/living/carbon/human/H = M + var/mob/living/human/H = M if(istype(H.get_equipped_item(slot_head_str), /obj/item/clothing/head/helmet)) ear_safety += 1 diff --git a/code/modules/projectiles/projectile/special.dm b/code/modules/projectiles/projectile/special.dm index cf2650c9966..33165821ff6 100644 --- a/code/modules/projectiles/projectile/special.dm +++ b/code/modules/projectiles/projectile/special.dm @@ -137,7 +137,7 @@ /obj/item/projectile/beam/mindflayer/on_hit(var/atom/target, var/blocked = 0) if(ishuman(target)) - var/mob/living/carbon/human/M = target + var/mob/living/human/M = target ADJ_STATUS(M, STAT_CONFUSE, rand(5,8)) /obj/item/projectile/chameleon diff --git a/code/modules/random_map/dungeon/rooms/tomb.dm b/code/modules/random_map/dungeon/rooms/tomb.dm index 35e45ae624e..339b027250f 100644 --- a/code/modules/random_map/dungeon/rooms/tomb.dm +++ b/code/modules/random_map/dungeon/rooms/tomb.dm @@ -22,8 +22,8 @@ var/type = pickweight(corpses) var/mob/M if(istext(type)) - M = new /mob/living/carbon/human() - var/mob/living/carbon/human/H = M + M = new /mob/living/human() + var/mob/living/human/H = M H.set_species(type) H.add_genetic_condition(GENE_COND_HUSK) else @@ -38,8 +38,8 @@ var/type = pickweight(corpses) var/mob/M if(istext(type)) - M = new /mob/living/carbon/human() - var/mob/living/carbon/human/H = M + M = new /mob/living/human() + var/mob/living/human/H = M H.set_species(type) H.add_genetic_condition(GENE_COND_HUSK) else diff --git a/code/modules/reagents/Chemistry-Grinder.dm b/code/modules/reagents/Chemistry-Grinder.dm index 32dff0e6d68..dfdacb1d755 100644 --- a/code/modules/reagents/Chemistry-Grinder.dm +++ b/code/modules/reagents/Chemistry-Grinder.dm @@ -226,7 +226,7 @@ if(CanPhysicallyInteractWith(user, src)) interface_interact(user) -/obj/machinery/reagentgrinder/proc/attempt_skill_effect(mob/living/carbon/human/user) +/obj/machinery/reagentgrinder/proc/attempt_skill_effect(mob/living/human/user) if(!istype(user) || !prob(user.skill_fail_chance(skill_to_check, 50, SKILL_BASIC))) return FALSE var/hand = pick(BP_L_HAND, BP_R_HAND) @@ -270,7 +270,7 @@ item_size_limit = ITEM_SIZE_SMALL skill_to_check = SKILL_COOKING -/obj/machinery/reagentgrinder/juicer/attempt_skill_effect(mob/living/carbon/human/user) +/obj/machinery/reagentgrinder/juicer/attempt_skill_effect(mob/living/human/user) if(!istype(user) || !prob(user.skill_fail_chance(skill_to_check, 50, SKILL_BASIC))) return visible_message(SPAN_NOTICE("\The [src] whirrs violently and spills its contents all over \the [user]!")) diff --git a/code/modules/reagents/chems/chems_blood.dm b/code/modules/reagents/chems/chems_blood.dm index 387f094cf01..2217b16fb24 100644 --- a/code/modules/reagents/chems/chems_blood.dm +++ b/code/modules/reagents/chems/chems_blood.dm @@ -64,7 +64,7 @@ /decl/material/liquid/blood/affect_blood(var/mob/living/M, var/removed, var/datum/reagents/holder) if(ishuman(M)) var/volume = REAGENT_VOLUME(holder, type) - var/mob/living/carbon/human/H = M + var/mob/living/human/H = M H.inject_blood(volume, holder) holder.remove_reagent(type, volume) diff --git a/code/modules/reagents/chems/chems_compounds.dm b/code/modules/reagents/chems/chems_compounds.dm index 677778384bd..7ad24e74418 100644 --- a/code/modules/reagents/chems/chems_compounds.dm +++ b/code/modules/reagents/chems/chems_compounds.dm @@ -27,13 +27,13 @@ /decl/material/liquid/glowsap/affect_blood(mob/living/M, removed, var/datum/reagents/holder) M.add_chemical_effect(CE_GLOWINGEYES, 1) if(ishuman(M)) - var/mob/living/carbon/human/H = M + var/mob/living/human/H = M H.update_eyes() /decl/material/liquid/glowsap/on_leaving_metabolism(datum/reagents/metabolism/holder) if(ishuman(holder?.my_atom)) - var/mob/living/carbon/human/H = holder.my_atom - addtimer(CALLBACK(H, TYPE_PROC_REF(/mob/living/carbon/human, update_eyes)), 5 SECONDS) + var/mob/living/human/H = holder.my_atom + addtimer(CALLBACK(H, TYPE_PROC_REF(/mob/living/human, update_eyes)), 5 SECONDS) . = ..() /decl/material/liquid/glowsap/affect_overdose(mob/living/M, total_dose) @@ -115,7 +115,7 @@ return if(ishuman(M)) - var/mob/living/carbon/human/H = M + var/mob/living/human/H = M if(!H.can_feel_pain()) return @@ -206,7 +206,7 @@ return if(ishuman(M)) - var/mob/living/carbon/human/H = M + var/mob/living/human/H = M if(!H.can_feel_pain()) return if(LAZYACCESS(M.chem_doses, type) == metabolism) @@ -241,7 +241,7 @@ if(M.isSynthetic()) return - var/mob/living/carbon/human/H = M + var/mob/living/human/H = M if(istype(H) && (H.get_bodytype()?.body_flags & BODY_FLAG_NO_DNA)) return @@ -290,7 +290,7 @@ uid = "chem_nanoblood" /decl/material/liquid/nanoblood/affect_blood(var/mob/living/M, var/removed, var/datum/reagents/holder) - var/mob/living/carbon/human/H = M + var/mob/living/human/H = M if(!istype(H)) return if(!H.should_have_organ(BP_HEART)) //We want the var for safety but we can do without the actual blood. @@ -382,7 +382,7 @@ if(M.bodytemperature < 170) M.heal_organ_damage(30 * removed, 30 * removed, affect_robo = 1) if(ishuman(M)) - var/mob/living/carbon/human/H = M + var/mob/living/human/H = M for(var/obj/item/organ/internal/I in H.get_internal_organs()) if(BP_IS_PROSTHETIC(I)) I.heal_damage(20*removed) @@ -411,7 +411,7 @@ /decl/material/liquid/crystal_agent/affect_blood(var/mob/living/M, var/removed, var/datum/reagents/holder) var/result_mat = do_material_check(M) if(ishuman(M)) - var/mob/living/carbon/human/H = M + var/mob/living/human/H = M var/list/limbs = H.get_external_organs() var/list/shuffled_limbs = LAZYLEN(limbs) ? shuffle(limbs.Copy()) : null for(var/obj/item/organ/external/E in shuffled_limbs) diff --git a/code/modules/reagents/chems/chems_drugs.dm b/code/modules/reagents/chems/chems_drugs.dm index 4f4c375dcae..6db2a8e8a95 100644 --- a/code/modules/reagents/chems/chems_drugs.dm +++ b/code/modules/reagents/chems/chems_drugs.dm @@ -218,7 +218,7 @@ ADJ_STATUS(M, STAT_JITTER, 3) ADJ_STATUS(M, STAT_DIZZY, 3) if(prob(0.1) && ishuman(M)) - var/mob/living/carbon/human/H = M + var/mob/living/human/H = M H.seizure() H.take_damage(rand(8, 12), BRAIN) if(prob(5)) @@ -233,7 +233,7 @@ /decl/material/liquid/glowsap/gleam/affect_overdose(mob/living/M, total_dose) M.take_damage(rand(1, 5), BRAIN) if(ishuman(M) && prob(10)) - var/mob/living/carbon/human/H = M + var/mob/living/human/H = M H.seizure() if(prob(10)) to_chat(M, SPAN_DANGER("[pick(overdose_messages)]")) diff --git a/code/modules/reagents/chems/chems_ethanol.dm b/code/modules/reagents/chems/chems_ethanol.dm index 84a26d93948..264a08ea936 100644 --- a/code/modules/reagents/chems/chems_ethanol.dm +++ b/code/modules/reagents/chems/chems_ethanol.dm @@ -452,7 +452,7 @@ if(dose > 30) M.take_damage(2 * removed, TOX) if(dose > 60 && ishuman(M) && prob(5)) - var/mob/living/carbon/human/H = M + var/mob/living/human/H = M var/obj/item/organ/internal/heart = GET_INTERNAL_ORGAN(H, BP_HEART) if(heart) if(dose < 120) diff --git a/code/modules/reagents/chems/chems_medicines.dm b/code/modules/reagents/chems/chems_medicines.dm index 68e2fdffc44..141dd99c0a8 100644 --- a/code/modules/reagents/chems/chems_medicines.dm +++ b/code/modules/reagents/chems/chems_medicines.dm @@ -12,7 +12,7 @@ /decl/material/liquid/eyedrops/affect_blood(var/mob/living/M, var/removed, var/datum/reagents/holder) if(ishuman(M)) - var/mob/living/carbon/human/H = M + var/mob/living/human/H = M var/obj/item/organ/internal/E = GET_INTERNAL_ORGAN(H, BP_EYES) if(E && istype(E) && !E.is_broken()) ADJ_STATUS(M, STAT_BLURRY, -5) @@ -54,7 +54,7 @@ ..() if(ishuman(M)) M.add_chemical_effect(CE_BLOCKAGE, (15 + REAGENT_VOLUME(holder, type))/100) - var/mob/living/carbon/human/H = M + var/mob/living/human/H = M for(var/obj/item/organ/external/E in H.get_external_organs()) if(E.status & ORGAN_ARTERY_CUT && prob(2 + REAGENT_VOLUME(holder, type) / overdose)) E.status &= ~ORGAN_ARTERY_CUT @@ -166,7 +166,7 @@ /decl/material/liquid/immunobooster/affect_overdose(mob/living/M, total_dose) ..() M.add_chemical_effect(CE_TOXIN, 1) - var/mob/living/carbon/human/H = M + var/mob/living/human/H = M if(istype(H)) M.adjust_immunity(-0.5) @@ -260,7 +260,7 @@ /decl/material/liquid/retrovirals/affect_overdose(mob/living/M, total_dose) . = ..() if(ishuman(M)) - var/mob/living/carbon/human/H = M + var/mob/living/human/H = M for(var/obj/item/organ/external/E in H.get_external_organs()) if(!BP_IS_PROSTHETIC(E) && prob(25) && !(E.status & ORGAN_MUTATED)) E.mutate() @@ -298,7 +298,7 @@ if(volume >= 5 && M.is_asystole()) holder.remove_reagent(type, 5) if(ishuman(M)) - var/mob/living/carbon/human/H = M + var/mob/living/human/H = M if(H.resuscitate()) var/obj/item/organ/internal/heart = GET_INTERNAL_ORGAN(H, BP_HEART) heart.take_internal_damage(heart.max_damage * 0.15) @@ -352,7 +352,7 @@ M.add_chemical_effect(CE_PAINKILLER, 10) M.add_chemical_effect(CE_BRAIN_REGEN, 1) if(ishuman(M)) - var/mob/living/carbon/human/H = M + var/mob/living/human/H = M ADJ_STATUS(H, STAT_CONFUSE, 1) ADJ_STATUS(H, STAT_DROWSY, 1) diff --git a/code/modules/reagents/reagent_containers/blood_pack.dm b/code/modules/reagents/reagent_containers/blood_pack.dm index 0cf84ba6e7a..b8a8a2578ed 100644 --- a/code/modules/reagents/reagent_containers/blood_pack.dm +++ b/code/modules/reagents/reagent_containers/blood_pack.dm @@ -17,7 +17,7 @@ amount_per_transfer_from_this = REM atom_flags = ATOM_FLAG_OPEN_CONTAINER - var/mob/living/carbon/human/attached + var/mob/living/human/attached /obj/item/chems/ivbag/Destroy() STOP_PROCESSING(SSobj,src) diff --git a/code/modules/reagents/reagent_containers/drinks/bottle.dm b/code/modules/reagents/reagent_containers/drinks/bottle.dm index fdaf1c2a812..ddecaec124f 100644 --- a/code/modules/reagents/reagent_containers/drinks/bottle.dm +++ b/code/modules/reagents/reagent_containers/drinks/bottle.dm @@ -166,7 +166,7 @@ if(!smash_check(1)) return //won't always break on the first hit - var/mob/living/carbon/human/H = target + var/mob/living/human/H = target if(istype(H) && H.headcheck(hit_zone)) var/obj/item/organ/affecting = GET_EXTERNAL_ORGAN(H, hit_zone) //headcheck should ensure that affecting is not null user.visible_message(SPAN_DANGER("\The [user] smashes \the [src] into [H]'s [affecting.name]!")) diff --git a/code/modules/reagents/reagent_containers/food/meat/cubes.dm b/code/modules/reagents/reagent_containers/food/meat/cubes.dm index 53bddf3aabe..48a3db8b0ea 100644 --- a/code/modules/reagents/reagent_containers/food/meat/cubes.dm +++ b/code/modules/reagents/reagent_containers/food/meat/cubes.dm @@ -10,7 +10,7 @@ center_of_mass = @'{"x":16,"y":14}' var/growing = FALSE - var/monkey_type = /mob/living/carbon/human/monkey + var/monkey_type = /mob/living/human/monkey var/wrapper_type /obj/item/chems/food/monkeycube/populate_reagents() diff --git a/code/modules/reagents/reagent_containers/inhaler.dm b/code/modules/reagents/reagent_containers/inhaler.dm index b692be6a17c..b33217aacbb 100644 --- a/code/modules/reagents/reagent_containers/inhaler.dm +++ b/code/modules/reagents/reagent_containers/inhaler.dm @@ -54,7 +54,7 @@ return TRUE // This properly handles mouth coverage/presence, but should probably be replaced later. - var/mob/living/carbon/human/H = target + var/mob/living/human/H = target if(user == H) if(!H.can_eat(src)) return TRUE diff --git a/code/modules/reagents/reagent_containers/syringes.dm b/code/modules/reagents/reagent_containers/syringes.dm index 9d92a10d5d3..0f766804599 100644 --- a/code/modules/reagents/reagent_containers/syringes.dm +++ b/code/modules/reagents/reagent_containers/syringes.dm @@ -130,7 +130,7 @@ return if(ishuman(target)) var/amount = REAGENTS_FREE_SPACE(reagents) - var/mob/living/carbon/human/T = target + var/mob/living/human/T = target if(!T.vessel?.total_volume) to_chat(user, SPAN_WARNING("You are unable to locate any blood.")) return @@ -269,7 +269,7 @@ if(ishuman(target)) - var/mob/living/carbon/human/H = target + var/mob/living/human/H = target var/target_zone = check_zone(user.get_target_zone(), H) var/obj/item/organ/external/affecting = GET_EXTERNAL_ORGAN(H, target_zone) @@ -304,7 +304,7 @@ admin_inject_log(user, target, src, contained_reagents, trans, violent=1) break_syringe(target, user) -/obj/item/chems/syringe/proc/break_syringe(mob/living/carbon/human/target, mob/living/user) +/obj/item/chems/syringe/proc/break_syringe(mob/living/human/target, mob/living/user) desc += " It is broken." mode = SYRINGE_BROKEN if(target) diff --git a/code/modules/recycling/package_wrapper.dm b/code/modules/recycling/package_wrapper.dm index 4333cf48d40..b4261ef64a9 100644 --- a/code/modules/recycling/package_wrapper.dm +++ b/code/modules/recycling/package_wrapper.dm @@ -61,7 +61,7 @@ to_chat(user, SPAN_WARNING("You cannot wrap yourself!")) return if(ishuman(AM)) - var/mob/living/carbon/human/H = AM + var/mob/living/human/H = AM if(!H.incapacitated(INCAPACITATION_DISABLED | INCAPACITATION_RESTRAINED)) if(user) to_chat(user, SPAN_WARNING("\The [H] is moving around too much. Restrain or incapacitate them first.")) @@ -95,7 +95,7 @@ qdel(wrapper) else if(ishuman(target)) - var/mob/living/carbon/human/H = target + var/mob/living/human/H = target if(H.incapacitated(INCAPACITATION_DISABLED | INCAPACITATION_RESTRAINED)) var/obj/item/parcel/wrapper = new wrapped_result_type(get_turf(target)) if(wrapper.make_parcel(target, user)) //Call this directly so it applies our fingerprints diff --git a/code/modules/recycling/sortingmachinery.dm b/code/modules/recycling/sortingmachinery.dm index 1a1ecb8cd9c..e281cf1841a 100644 --- a/code/modules/recycling/sortingmachinery.dm +++ b/code/modules/recycling/sortingmachinery.dm @@ -58,7 +58,7 @@ sleep(5) // wait for animation to finish if(prob(35)) - for(var/mob/living/carbon/human/L in src) + for(var/mob/living/human/L in src) var/list/obj/item/organ/external/crush = L.get_damageable_organs() if(!crush.len) return diff --git a/code/modules/recycling/wrapped_package.dm b/code/modules/recycling/wrapped_package.dm index 9e85840711f..6aa4c487c83 100644 --- a/code/modules/recycling/wrapped_package.dm +++ b/code/modules/recycling/wrapped_package.dm @@ -268,7 +268,7 @@ /obj/item, /obj/structure, /obj/machinery, - /mob/living/carbon/human, + /mob/living/human, ) return type_whitelist diff --git a/code/modules/shield_generators/shield.dm b/code/modules/shield_generators/shield.dm index 844395bbc36..0adbc8ef951 100644 --- a/code/modules/shield_generators/shield.dm +++ b/code/modules/shield_generators/shield.dm @@ -267,7 +267,7 @@ return !gen.check_flag(MODEFLAG_NONHUMANS) // Human mobs -/mob/living/carbon/human/can_pass_shield(var/obj/machinery/shield_generator/gen) +/mob/living/human/can_pass_shield(var/obj/machinery/shield_generator/gen) if(isSynthetic()) return !gen.check_flag(MODEFLAG_ANORGANIC) return !gen.check_flag(MODEFLAG_HUMANOIDS) diff --git a/code/modules/shuttles/shuttle_emergency.dm b/code/modules/shuttles/shuttle_emergency.dm index d3f1745af4f..3c28628e020 100644 --- a/code/modules/shuttles/shuttle_emergency.dm +++ b/code/modules/shuttles/shuttle_emergency.dm @@ -252,7 +252,7 @@ else if(!emagged && href_list["scanid"]) //They selected an empty entry. Try to scan their id. - var/mob/living/carbon/human/H = user + var/mob/living/human/H = user if (istype(H)) if (!read_authorization(H.get_active_held_item())) //try to read what's in their hand first read_authorization(H.get_equipped_item(slot_wear_id_str)) diff --git a/code/modules/species/outsider/random.dm b/code/modules/species/outsider/random.dm index 29f43d6fdf0..7dc435debf7 100644 --- a/code/modules/species/outsider/random.dm +++ b/code/modules/species/outsider/random.dm @@ -101,7 +101,7 @@ . = ..() -/decl/species/alium/get_species_blood_color(mob/living/carbon/human/H) +/decl/species/alium/get_species_blood_color(mob/living/human/H) if(istype(H) && H.isSynthetic()) return ..() return blood_color @@ -131,7 +131,7 @@ return TRUE to_chat(user, "You're now an alien humanoid of some undiscovered species. Make up what lore you want, no one knows a thing about your species! You can check info about your traits with Check Species Info verb in IC tab.") to_chat(user, "You can't speak any other languages by default. You can use translator implant that spawns on top of this monolith - it will give you knowledge of any language if you hear it enough times.") - var/mob/living/carbon/human/H = user + var/mob/living/human/H = user new /obj/item/implanter/translator(get_turf(src)) H.change_species(SPECIES_ALIEN) var/decl/cultural_info/culture = H.get_cultural_value(TAG_CULTURE) diff --git a/code/modules/species/outsider/shadow.dm b/code/modules/species/outsider/shadow.dm index 9c71b34777d..f0c2147c401 100644 --- a/code/modules/species/outsider/shadow.dm +++ b/code/modules/species/outsider/shadow.dm @@ -34,7 +34,7 @@ species_flags = SPECIES_FLAG_NO_SLIP | SPECIES_FLAG_NO_POISON | SPECIES_FLAG_NO_EMBED -/decl/species/starlight/shadow/handle_environment_special(var/mob/living/carbon/human/H) +/decl/species/starlight/shadow/handle_environment_special(var/mob/living/human/H) if(H.is_in_stasis() || H.stat == DEAD || H.isSynthetic()) return var/light_amount = 0 diff --git a/code/modules/species/outsider/starlight.dm b/code/modules/species/outsider/starlight.dm index 6067e0c9093..261d2398329 100644 --- a/code/modules/species/outsider/starlight.dm +++ b/code/modules/species/outsider/starlight.dm @@ -64,7 +64,7 @@ splatter_desc = "A puddle of starstuff." splatter_colour = "#ffff00" -/decl/species/starlight/handle_death(var/mob/living/carbon/human/H) +/decl/species/starlight/handle_death(var/mob/living/human/H) addtimer(CALLBACK(H, TYPE_PROC_REF(/mob, dust)),0) /decl/species/starlight/starborn @@ -97,7 +97,7 @@ /obj/aura/starborn ) -/decl/species/starlight/starborn/handle_death(var/mob/living/carbon/human/H) +/decl/species/starlight/starborn/handle_death(var/mob/living/human/H) ..() var/turf/T = get_turf(H) T.add_to_reagents(/decl/material/liquid/fuel, 20) @@ -140,7 +140,7 @@ radiation_mod = 0 species_flags = SPECIES_FLAG_NO_MINOR_CUT | SPECIES_FLAG_NO_SLIP | SPECIES_FLAG_NO_POISON | SPECIES_FLAG_NO_EMBED | SPECIES_FLAG_NO_TANGLE -/decl/species/starlight/blueforged/handle_death(var/mob/living/carbon/human/H) +/decl/species/starlight/blueforged/handle_death(var/mob/living/human/H) ..() new /obj/effect/temporary(get_turf(H),11, 'icons/mob/mob.dmi', "liquify") diff --git a/code/modules/species/species.dm b/code/modules/species/species.dm index d40dcd46278..be5d5557f4b 100644 --- a/code/modules/species/species.dm +++ b/code/modules/species/species.dm @@ -400,22 +400,22 @@ var/global/const/DEFAULT_SPECIES_HEALTH = 200 if(taste_sensitivity < 0) . += "taste_sensitivity ([taste_sensitivity]) was negative" -/decl/species/proc/equip_survival_gear(var/mob/living/carbon/human/H, var/box_type = /obj/item/box/survival) +/decl/species/proc/equip_survival_gear(var/mob/living/human/H, var/box_type = /obj/item/box/survival) var/obj/item/backpack/backpack = H.get_equipped_item(slot_back_str) if(istype(backpack)) H.equip_to_slot_or_del(new box_type(backpack), slot_in_backpack_str) else H.put_in_hands_or_del(new box_type(H)) -/decl/species/proc/get_manual_dexterity(var/mob/living/carbon/human/H) +/decl/species/proc/get_manual_dexterity(var/mob/living/human/H) . = manual_dexterity -/decl/species/proc/add_base_auras(var/mob/living/carbon/human/H) +/decl/species/proc/add_base_auras(var/mob/living/human/H) if(base_auras) for(var/type in base_auras) H.add_aura(new type(H), skip_icon_update = TRUE) -/decl/species/proc/remove_base_auras(var/mob/living/carbon/human/H) +/decl/species/proc/remove_base_auras(var/mob/living/human/H) if(base_auras) var/list/bcopy = base_auras.Copy() for(var/a in H.auras) @@ -425,69 +425,69 @@ var/global/const/DEFAULT_SPECIES_HEALTH = 200 H.remove_aura(A) qdel(A) -/decl/species/proc/remove_inherent_verbs(var/mob/living/carbon/human/H) +/decl/species/proc/remove_inherent_verbs(var/mob/living/human/H) if(inherent_verbs) for(var/verb_path in inherent_verbs) H.verbs -= verb_path return -/decl/species/proc/add_inherent_verbs(var/mob/living/carbon/human/H) +/decl/species/proc/add_inherent_verbs(var/mob/living/human/H) if(inherent_verbs) for(var/verb_path in inherent_verbs) H.verbs |= verb_path return -/decl/species/proc/handle_post_spawn(var/mob/living/carbon/human/H) //Handles anything not already covered by basic species assignment. +/decl/species/proc/handle_post_spawn(var/mob/living/human/H) //Handles anything not already covered by basic species assignment. add_inherent_verbs(H) add_base_auras(H) handle_movement_flags_setup(H) -/decl/species/proc/handle_pre_spawn(var/mob/living/carbon/human/H) +/decl/species/proc/handle_pre_spawn(var/mob/living/human/H) return -/decl/species/proc/handle_death(var/mob/living/carbon/human/H) //Handles any species-specific death events. +/decl/species/proc/handle_death(var/mob/living/human/H) //Handles any species-specific death events. return -/decl/species/proc/handle_sleeping(var/mob/living/carbon/human/H) +/decl/species/proc/handle_sleeping(var/mob/living/human/H) if(prob(2) && !H.failed_last_breath && !H.isSynthetic()) if(!HAS_STATUS(H, STAT_PARA)) H.emote(/decl/emote/audible/snore) else H.emote(/decl/emote/audible/groan) -/decl/species/proc/handle_environment_special(var/mob/living/carbon/human/H) +/decl/species/proc/handle_environment_special(var/mob/living/human/H) return -/decl/species/proc/handle_movement_delay_special(var/mob/living/carbon/human/H) +/decl/species/proc/handle_movement_delay_special(var/mob/living/human/H) return 0 // Used to update alien icons for aliens. -/decl/species/proc/handle_login_special(var/mob/living/carbon/human/H) +/decl/species/proc/handle_login_special(var/mob/living/human/H) return // As above. -/decl/species/proc/handle_logout_special(var/mob/living/carbon/human/H) +/decl/species/proc/handle_logout_special(var/mob/living/human/H) return -/decl/species/proc/can_overcome_gravity(var/mob/living/carbon/human/H) +/decl/species/proc/can_overcome_gravity(var/mob/living/human/H) return FALSE // Used for any extra behaviour when falling and to see if a species will fall at all. -/decl/species/proc/can_fall(var/mob/living/carbon/human/H) +/decl/species/proc/can_fall(var/mob/living/human/H) return TRUE // Used to override normal fall behaviour. Use only when the species does fall down a level. -/decl/species/proc/handle_fall_special(var/mob/living/carbon/human/H, var/turf/landing) +/decl/species/proc/handle_fall_special(var/mob/living/human/H, var/turf/landing) return FALSE //Used for swimming -/decl/species/proc/can_float(var/mob/living/carbon/human/H) +/decl/species/proc/can_float(var/mob/living/human/H) if(!H.is_physically_disabled()) return TRUE //We could tie it to stamina return FALSE // Called when using the shredding behavior. -/decl/species/proc/can_shred(var/mob/living/carbon/human/H, var/ignore_intent, var/ignore_antag) +/decl/species/proc/can_shred(var/mob/living/human/H, var/ignore_intent, var/ignore_antag) if((!ignore_intent && H.a_intent != I_HURT) || H.pulling_punches) return 0 @@ -503,7 +503,7 @@ var/global/const/DEFAULT_SPECIES_HEALTH = 200 return 1 return 0 -/decl/species/proc/handle_vision(var/mob/living/carbon/human/H) +/decl/species/proc/handle_vision(var/mob/living/human/H) var/list/vision = H.get_accumulated_vision_handlers() H.update_sight() H.set_sight(H.sight|get_vision_flags(H)|H.equipment_vision_flags|vision[1]) @@ -541,7 +541,7 @@ var/global/const/DEFAULT_SPECIES_HEALTH = 200 return 1 -/decl/species/proc/get_how_nearsighted(var/mob/living/carbon/human/H) +/decl/species/proc/get_how_nearsighted(var/mob/living/human/H) var/prescriptions = short_sighted if(H.has_genetic_condition(GENE_COND_NEARSIGHTED)) prescriptions += 7 @@ -565,24 +565,24 @@ var/global/const/DEFAULT_SPECIES_HEALTH = 200 light -= H.equipment_light_protection return clamp(max(prescriptions, light), 0, 7) -/decl/species/proc/handle_additional_hair_loss(var/mob/living/carbon/human/H, var/defer_body_update = TRUE) +/decl/species/proc/handle_additional_hair_loss(var/mob/living/human/H, var/defer_body_update = TRUE) return FALSE -/decl/species/proc/get_blood_decl(var/mob/living/carbon/human/H) +/decl/species/proc/get_blood_decl(var/mob/living/human/H) if(istype(H) && H.isSynthetic()) return GET_DECL(/decl/blood_type/coolant) return get_blood_type_by_name(blood_types[1]) -/decl/species/proc/get_blood_name(var/mob/living/carbon/human/H) +/decl/species/proc/get_blood_name(var/mob/living/human/H) var/decl/blood_type/blood = get_blood_decl(H) return istype(blood) ? blood.splatter_name : "blood" -/decl/species/proc/get_species_blood_color(var/mob/living/carbon/human/H) +/decl/species/proc/get_species_blood_color(var/mob/living/human/H) var/decl/blood_type/blood = get_blood_decl(H) return istype(blood) ? blood.splatter_colour : COLOR_BLOOD_HUMAN // Impliments different trails for species depending on if they're wearing shoes. -/decl/species/proc/get_move_trail(var/mob/living/carbon/human/H) +/decl/species/proc/get_move_trail(var/mob/living/human/H) if(H.current_posture.prone) return /obj/effect/decal/cleanable/blood/tracks/body var/obj/item/clothing/suit = H.get_equipped_item(slot_wear_suit_str) @@ -593,13 +593,13 @@ var/global/const/DEFAULT_SPECIES_HEALTH = 200 return shoes.move_trail return move_trail -/decl/species/proc/handle_trail(var/mob/living/carbon/human/H, var/turf/T) +/decl/species/proc/handle_trail(var/mob/living/human/H, var/turf/T) return -/decl/species/proc/update_skin(var/mob/living/carbon/human/H) +/decl/species/proc/update_skin(var/mob/living/human/H) return -/decl/species/proc/disarm_attackhand(var/mob/living/carbon/human/attacker, var/mob/living/carbon/human/target) +/decl/species/proc/disarm_attackhand(var/mob/living/human/attacker, var/mob/living/human/target) attacker.do_attack_animation(target) var/obj/item/uniform = target.get_equipped_item(slot_w_uniform_str) @@ -649,7 +649,7 @@ var/global/const/DEFAULT_SPECIES_HEALTH = 200 playsound(target.loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1) target.visible_message("[attacker] attempted to disarm \the [target]!") -/decl/species/proc/disfigure_msg(var/mob/living/carbon/human/H) //Used for determining the message a disfigured face has on examine. To add a unique message, just add this onto a specific species and change the "return" message. +/decl/species/proc/disfigure_msg(var/mob/living/human/H) //Used for determining the message a disfigured face has on examine. To add a unique message, just add this onto a specific species and change the "return" message. var/decl/pronouns/G = H.get_pronouns() return SPAN_DANGER("[G.His] face is horribly mangled!\n") @@ -683,23 +683,23 @@ var/global/const/DEFAULT_SPECIES_HEALTH = 200 if(31 to 45) . = 4 else . = 8 -/decl/species/proc/check_no_slip(var/mob/living/carbon/human/H) +/decl/species/proc/check_no_slip(var/mob/living/human/H) if(can_overcome_gravity(H)) return TRUE return (species_flags & SPECIES_FLAG_NO_SLIP) // This assumes you've already checked that their bodytype can feel pain. -/decl/species/proc/get_pain_emote(var/mob/living/carbon/human/H, var/pain_power) +/decl/species/proc/get_pain_emote(var/mob/living/human/H, var/pain_power) for(var/pain_emotes in pain_emotes_with_pain_level) var/pain_level = pain_emotes_with_pain_level[pain_emotes] if(pain_level >= pain_power) // This assumes that if a pain-level has been defined it also has a list of emotes to go with it return pick(pain_emotes) -/decl/species/proc/handle_post_move(var/mob/living/carbon/human/H) +/decl/species/proc/handle_post_move(var/mob/living/human/H) handle_exertion(H) -/decl/species/proc/handle_exertion(mob/living/carbon/human/H) +/decl/species/proc/handle_exertion(mob/living/human/H) if (!exertion_effect_chance) return var/chance = max((100 - H.stamina), exertion_effect_chance * H.encumbrance()) @@ -726,12 +726,12 @@ var/global/const/DEFAULT_SPECIES_HEALTH = 200 /decl/species/proc/get_default_name() return "[lowertext(name)] ([random_id(name, 100, 999)])" -/decl/species/proc/get_holder_color(var/mob/living/carbon/human/H) +/decl/species/proc/get_holder_color(var/mob/living/human/H) return //Called after a mob's species is set, organs were created, and we're about to update the icon, color, and etc of the mob being created. //Consider this might be called post-init -/decl/species/proc/apply_appearance(var/mob/living/carbon/human/H) +/decl/species/proc/apply_appearance(var/mob/living/human/H) H.icon_state = lowertext(src.name) /decl/species/proc/get_preview_icon() @@ -739,7 +739,7 @@ var/global/const/DEFAULT_SPECIES_HEALTH = 200 // TODO: generate an icon based on all available bodytypes. - var/mob/living/carbon/human/dummy/mannequin/mannequin = get_mannequin("#species_[ckey(name)]") + var/mob/living/human/dummy/mannequin/mannequin = get_mannequin("#species_[ckey(name)]") if(mannequin) mannequin.change_species(name) // handles species/bodytype init @@ -760,7 +760,7 @@ var/global/const/DEFAULT_SPECIES_HEALTH = 200 return preview_icon -/decl/species/proc/handle_movement_flags_setup(var/mob/living/carbon/human/H) +/decl/species/proc/handle_movement_flags_setup(var/mob/living/human/H) H.mob_bump_flag = bump_flag H.mob_swap_flags = swap_flags H.mob_push_flags = push_flags diff --git a/code/modules/species/species_attack.dm b/code/modules/species/species_attack.dm index b09bfdacc0d..0c1fe901f76 100644 --- a/code/modules/species/species_attack.dm +++ b/code/modules/species/species_attack.dm @@ -20,10 +20,10 @@ usable_with_limbs = list(BP_L_HAND, BP_R_HAND) var/blocked_by_gloves = TRUE -/decl/natural_attack/claws/is_usable(var/mob/living/carbon/human/user, var/mob/living/carbon/human/target, var/zone) +/decl/natural_attack/claws/is_usable(var/mob/living/human/user, var/mob/living/human/target, var/zone) return (!user.get_equipped_item(slot_gloves_str) || !blocked_by_gloves) -/decl/natural_attack/claws/show_attack(var/mob/living/carbon/human/user, var/mob/living/carbon/human/target, var/zone, var/attack_damage) +/decl/natural_attack/claws/show_attack(var/mob/living/human/user, var/mob/living/human/target, var/zone, var/attack_damage) var/obj/item/organ/external/affecting = istype(target) && zone && GET_EXTERNAL_ORGAN(target, zone) if(!affecting) return ..() @@ -102,7 +102,7 @@ /decl/natural_attack/stomp/weak/get_unarmed_damage(mob/living/user, mob/living/victim) return damage -/decl/natural_attack/stomp/weak/show_attack(var/mob/living/carbon/human/user, var/mob/living/carbon/human/target, var/zone, var/attack_damage) +/decl/natural_attack/stomp/weak/show_attack(var/mob/living/human/user, var/mob/living/human/target, var/zone, var/attack_damage) var/obj/item/organ/external/affecting = istype(target) && zone && GET_EXTERNAL_ORGAN(target, zone) if(affecting) user.visible_message(SPAN_WARNING("\The [user] jumped up and down on \the [target]'s [affecting.name]!")) @@ -124,7 +124,7 @@ BP_GROIN ) -/decl/natural_attack/tail/is_usable(var/mob/living/carbon/human/user, var/mob/living/carbon/human/target, var/zone) //ensures that you can't tail someone in the skull +/decl/natural_attack/tail/is_usable(var/mob/living/human/user, var/mob/living/human/target, var/zone) //ensures that you can't tail someone in the skull if(!(zone in can_hit_zones)) return FALSE for(var/foot_tag in list(BP_L_FOOT, BP_R_FOOT)) @@ -132,7 +132,7 @@ return TRUE return FALSE -/decl/natural_attack/tail/show_attack(var/mob/living/carbon/human/user, var/mob/living/carbon/human/target, var/zone, var/attack_damage) +/decl/natural_attack/tail/show_attack(var/mob/living/human/user, var/mob/living/human/target, var/zone, var/attack_damage) var/obj/item/organ/external/affecting = istype(target) && zone && GET_EXTERNAL_ORGAN(target, zone) if(!affecting) diff --git a/code/modules/species/species_bodytype.dm b/code/modules/species/species_bodytype.dm index 6536c8d3c69..8169aa70bbb 100644 --- a/code/modules/species/species_bodytype.dm +++ b/code/modules/species/species_bodytype.dm @@ -555,7 +555,7 @@ var/global/list/bodytypes_by_category = list() E.encased = apply_encased[E.organ_tag] //fully_replace: If true, all existing organs will be discarded. Useful when doing mob transformations, and not caring about the existing organs -/decl/bodytype/proc/create_missing_organs(mob/living/carbon/human/H, fully_replace = FALSE) +/decl/bodytype/proc/create_missing_organs(mob/living/human/H, fully_replace = FALSE) if(fully_replace) H.delete_organs() @@ -654,7 +654,7 @@ var/global/list/bodytypes_by_category = list() if(O) O.set_sprite_accessory(accessory, null, accessory_colour, skip_update = TRUE) -/decl/bodytype/proc/customize_preview_mannequin(mob/living/carbon/human/dummy/mannequin/mannequin) +/decl/bodytype/proc/customize_preview_mannequin(mob/living/human/dummy/mannequin/mannequin) set_default_sprite_accessories(mannequin) mannequin.set_eye_colour(base_eye_color, skip_update = TRUE) mannequin.force_update_limbs() @@ -664,7 +664,7 @@ var/global/list/bodytypes_by_category = list() mannequin.update_hair(0) mannequin.update_icon() -/decl/species/proc/customize_preview_mannequin(mob/living/carbon/human/dummy/mannequin/mannequin) +/decl/species/proc/customize_preview_mannequin(mob/living/human/dummy/mannequin/mannequin) if(preview_outfit) var/decl/hierarchy/outfit/outfit = outfit_by_type(preview_outfit) outfit.equip_outfit(mannequin, equip_adjustments = (OUTFIT_ADJUSTMENT_SKIP_SURVIVAL_GEAR|OUTFIT_ADJUSTMENT_SKIP_BACKPACK)) @@ -725,7 +725,7 @@ var/global/list/bodytypes_by_category = list() else CRASH("get_species_temperature_threshold() called with invalid threshold value.") -/decl/bodytype/proc/get_environment_discomfort(var/mob/living/carbon/human/H, var/msg_type) +/decl/bodytype/proc/get_environment_discomfort(var/mob/living/human/H, var/msg_type) if(!prob(5)) return @@ -770,5 +770,5 @@ var/global/list/limbs_with_nails = list( ) return null -/decl/bodytype/proc/get_movement_slowdown(var/mob/living/carbon/human/H) +/decl/bodytype/proc/get_movement_slowdown(var/mob/living/human/H) return movement_slowdown diff --git a/code/modules/species/species_bodytype_helpers.dm b/code/modules/species/species_bodytype_helpers.dm index 29ef201589f..8736740277b 100644 --- a/code/modules/species/species_bodytype_helpers.dm +++ b/code/modules/species/species_bodytype_helpers.dm @@ -1,4 +1,4 @@ -/decl/bodytype/proc/get_ignited_icon(var/mob/living/carbon/human/H) +/decl/bodytype/proc/get_ignited_icon(var/mob/living/human/H) return ignited_icon /decl/bodytype/proc/get_icon_cache_uid(var/mob/H) @@ -6,28 +6,28 @@ icon_cache_uid = "[sequential_id(/decl/bodytype)]" return icon_cache_uid -/decl/bodytype/proc/get_bandages_icon(var/mob/living/carbon/human/H) +/decl/bodytype/proc/get_bandages_icon(var/mob/living/human/H) return bandages_icon -/decl/bodytype/proc/get_blood_overlays(var/mob/living/carbon/human/H) +/decl/bodytype/proc/get_blood_overlays(var/mob/living/human/H) return blood_overlays -/decl/bodytype/proc/get_damage_overlays(var/mob/living/carbon/human/H) +/decl/bodytype/proc/get_damage_overlays(var/mob/living/human/H) return damage_overlays -/decl/bodytype/proc/get_husk_icon(var/mob/living/carbon/human/H) +/decl/bodytype/proc/get_husk_icon(var/mob/living/human/H) return husk_icon -/decl/bodytype/proc/get_skeletal_icon(var/mob/living/carbon/human/H) +/decl/bodytype/proc/get_skeletal_icon(var/mob/living/human/H) return skeletal_icon /decl/bodytype/proc/get_cosmetics_icon(var/decl/sprite_accessory/cosmetics/cosmetics_style) return cosmetics_icon -/decl/bodytype/proc/get_vulnerable_location(var/mob/living/carbon/human/H) +/decl/bodytype/proc/get_vulnerable_location(var/mob/living/human/H) return vulnerable_location -/decl/bodytype/proc/get_base_icon(var/mob/living/carbon/human/H, var/get_deform) +/decl/bodytype/proc/get_base_icon(var/mob/living/human/H, var/get_deform) return get_deform ? icon_deformed : icon_base /decl/bodytype/proc/handle_post_bodytype_pref_set(datum/preferences/pref) @@ -52,7 +52,7 @@ for(var/accessory in default_sprite_accessories[accessory_category]) pref.sprite_accessories[accessory_category][accessory] = default_sprite_accessories[accessory_category][accessory] -/decl/bodytype/proc/apply_appearance(var/mob/living/carbon/human/H) +/decl/bodytype/proc/apply_appearance(var/mob/living/human/H) if(base_color) H.set_skin_colour(base_color) diff --git a/code/modules/species/species_bodytype_quadruped.dm b/code/modules/species/species_bodytype_quadruped.dm index d9032a96e14..5673e68d89d 100644 --- a/code/modules/species/species_bodytype_quadruped.dm +++ b/code/modules/species/species_bodytype_quadruped.dm @@ -19,7 +19,7 @@ var/ridable = TRUE var/riding_offset = @"{'x':0,'y':0,'z':8}" -/decl/bodytype/quadruped/apply_appearance(var/mob/living/carbon/human/H) +/decl/bodytype/quadruped/apply_appearance(var/mob/living/human/H) . = ..() H.can_buckle = ridable H.buckle_pixel_shift = riding_offset \ No newline at end of file diff --git a/code/modules/species/species_bodytype_random.dm b/code/modules/species/species_bodytype_random.dm index 446b7581764..2e79046a92f 100644 --- a/code/modules/species/species_bodytype_random.dm +++ b/code/modules/species/species_bodytype_random.dm @@ -9,7 +9,7 @@ } #define SETUP_RANDOM_COLOR_SETTER(X, Y)\ -/mob/living/carbon/human/proc/randomize_##X(){\ +/mob/living/human/proc/randomize_##X(){\ var/decl/bodytype/root_bodytype = get_bodytype();\ if(!root_bodytype){\ return;\ @@ -45,7 +45,7 @@ SETUP_RANDOM_COLOR_SETTER(eye_color, set_eye_colour) /decl/bodytype/proc/get_random_skin_tone() return random_skin_tone(src) -/mob/living/carbon/human/proc/randomize_skin_tone() +/mob/living/human/proc/randomize_skin_tone() var/decl/bodytype/root_bodytype = get_bodytype() if(!root_bodytype) return diff --git a/code/modules/species/species_getters.dm b/code/modules/species/species_getters.dm index eca5e8a9087..90b97759adc 100644 --- a/code/modules/species/species_getters.dm +++ b/code/modules/species/species_getters.dm @@ -1,40 +1,40 @@ -/decl/species/proc/get_valid_shapeshifter_forms(var/mob/living/carbon/human/H) +/decl/species/proc/get_valid_shapeshifter_forms(var/mob/living/human/H) return list() -/decl/species/proc/get_additional_examine_text(var/mob/living/carbon/human/H) +/decl/species/proc/get_additional_examine_text(var/mob/living/human/H) return -/decl/species/proc/get_knockout_message(var/mob/living/carbon/human/H) +/decl/species/proc/get_knockout_message(var/mob/living/human/H) return ((H && H.isSynthetic()) ? "encounters a hardware fault and suddenly reboots!" : knockout_message) -/decl/species/proc/get_species_death_message(var/mob/living/carbon/human/H) +/decl/species/proc/get_species_death_message(var/mob/living/human/H) return ((H && H.isSynthetic()) ? "gives one shrill beep before falling lifeless." : death_message) -/decl/species/proc/get_ssd(var/mob/living/carbon/human/H) +/decl/species/proc/get_ssd(var/mob/living/human/H) return ((H && H.isSynthetic()) ? "flashing a 'system offline' glyph on their monitor" : show_ssd) -/decl/species/proc/get_species_flesh_color(var/mob/living/carbon/human/H) +/decl/species/proc/get_species_flesh_color(var/mob/living/human/H) return ((H && H.isSynthetic()) ? SYNTH_FLESH_COLOUR : flesh_color) -/decl/species/proc/get_vision_flags(var/mob/living/carbon/human/H) +/decl/species/proc/get_vision_flags(var/mob/living/human/H) return vision_flags -/decl/species/proc/get_surgery_overlay_icon(var/mob/living/carbon/human/H) +/decl/species/proc/get_surgery_overlay_icon(var/mob/living/human/H) return 'icons/mob/surgery.dmi' -/decl/species/proc/get_footstep(var/mob/living/carbon/human/H, var/footstep_type) +/decl/species/proc/get_footstep(var/mob/living/human/H, var/footstep_type) return -/decl/species/proc/get_brute_mod(var/mob/living/carbon/human/H) +/decl/species/proc/get_brute_mod(var/mob/living/human/H) . = brute_mod -/decl/species/proc/get_burn_mod(var/mob/living/carbon/human/H) +/decl/species/proc/get_burn_mod(var/mob/living/human/H) . = burn_mod -/decl/species/proc/get_radiation_mod(var/mob/living/carbon/human/H) +/decl/species/proc/get_radiation_mod(var/mob/living/human/H) . = (H && H.isSynthetic() ? 0.5 : radiation_mod) -/decl/species/proc/get_root_species_name(var/mob/living/carbon/human/H) +/decl/species/proc/get_root_species_name(var/mob/living/human/H) return name /decl/species/proc/get_bodytype_by_name(var/bodytype_name) diff --git a/code/modules/species/species_helpers.dm b/code/modules/species/species_helpers.dm index ecacca890af..5bd257fa5bc 100644 --- a/code/modules/species/species_helpers.dm +++ b/code/modules/species/species_helpers.dm @@ -5,12 +5,12 @@ var/global/list/stored_shock_by_ref = list() target.electrocute_act(stored_shock_by_ref["\ref[src]"]*0.9, src) stored_shock_by_ref["\ref[src]"] = 0 -/decl/species/proc/toggle_stance(var/mob/living/carbon/human/H) +/decl/species/proc/toggle_stance(var/mob/living/human/H) if(!H.incapacitated()) H.pulling_punches = !H.pulling_punches to_chat(H, "You are now [H.pulling_punches ? "pulling your punches" : "not pulling your punches"].") -/decl/species/proc/fluid_act(var/mob/living/carbon/human/H, var/datum/reagents/fluids) +/decl/species/proc/fluid_act(var/mob/living/human/H, var/datum/reagents/fluids) SHOULD_CALL_PARENT(TRUE) var/water = REAGENT_VOLUME(fluids, /decl/material/liquid/water) if(water >= 40 && H.get_damage(PAIN)) @@ -23,7 +23,7 @@ var/global/list/stored_shock_by_ref = list() return FALSE else if(!isnull(max_players)) var/player_count = 0 - for(var/mob/living/carbon/human/H in global.living_mob_list_) + for(var/mob/living/human/H in global.living_mob_list_) if(H.client && H.key && H.species == src) player_count++ if(player_count >= max_players) @@ -42,23 +42,23 @@ var/global/list/stored_shock_by_ref = list() // pref.hair_colour = default_bodytype.base_hair_color // pref.facial_hair_colour = default_bodytype.base_hair_color -/decl/species/proc/equip_default_fallback_uniform(var/mob/living/carbon/human/H) +/decl/species/proc/equip_default_fallback_uniform(var/mob/living/human/H) if(istype(H)) H.equip_to_slot_or_del(new /obj/item/clothing/shirt/harness, slot_w_uniform_str) -/decl/species/proc/get_hazard_high_pressure(var/mob/living/carbon/human/H) +/decl/species/proc/get_hazard_high_pressure(var/mob/living/human/H) return hazard_high_pressure -/decl/species/proc/get_warning_high_pressure(var/mob/living/carbon/human/H) +/decl/species/proc/get_warning_high_pressure(var/mob/living/human/H) return warning_high_pressure -/decl/species/proc/get_warning_low_pressure(var/mob/living/carbon/human/H) +/decl/species/proc/get_warning_low_pressure(var/mob/living/human/H) return warning_low_pressure -/decl/species/proc/get_hazard_low_pressure(var/mob/living/carbon/human/H) +/decl/species/proc/get_hazard_low_pressure(var/mob/living/human/H) return hazard_low_pressure -/decl/species/proc/get_shock_vulnerability(var/mob/living/carbon/human/H) +/decl/species/proc/get_shock_vulnerability(var/mob/living/human/H) return shock_vulnerability /decl/species/proc/adjust_status(mob/living/target, condition, amount) diff --git a/code/modules/species/species_shapeshifter.dm b/code/modules/species/species_shapeshifter.dm index 3252cb8e682..ef3d68dd66b 100644 --- a/code/modules/species/species_shapeshifter.dm +++ b/code/modules/species/species_shapeshifter.dm @@ -6,10 +6,10 @@ var/global/list/wrapped_species_by_ref = list() /decl/species/shapeshifter available_bodytypes = list(/decl/bodytype/shapeshifter) inherent_verbs = list( - /mob/living/carbon/human/proc/shapeshifter_select_shape, - /mob/living/carbon/human/proc/shapeshifter_select_hair, - /mob/living/carbon/human/proc/shapeshifter_select_gender, - /mob/living/carbon/human/proc/shapeshifter_select_colour + /mob/living/human/proc/shapeshifter_select_shape, + /mob/living/human/proc/shapeshifter_select_hair, + /mob/living/human/proc/shapeshifter_select_gender, + /mob/living/human/proc/shapeshifter_select_colour ) var/list/valid_transform_species = list() var/monochromatic @@ -20,31 +20,31 @@ var/global/list/wrapped_species_by_ref = list() valid_transform_species |= default_form . = ..() -/decl/species/shapeshifter/get_valid_shapeshifter_forms(var/mob/living/carbon/human/H) +/decl/species/shapeshifter/get_valid_shapeshifter_forms(var/mob/living/human/H) return valid_transform_species -/decl/species/shapeshifter/get_root_species_name(var/mob/living/carbon/human/H) +/decl/species/shapeshifter/get_root_species_name(var/mob/living/human/H) if(!H) return ..() var/decl/species/S = get_species_by_key(wrapped_species_by_ref["\ref[H]"]) return S.get_root_species_name(H) -/decl/species/shapeshifter/handle_pre_spawn(var/mob/living/carbon/human/H) +/decl/species/shapeshifter/handle_pre_spawn(var/mob/living/human/H) ..() wrapped_species_by_ref["\ref[H]"] = default_form -/decl/species/shapeshifter/handle_post_spawn(var/mob/living/carbon/human/H) +/decl/species/shapeshifter/handle_post_spawn(var/mob/living/human/H) if(monochromatic) var/skin_colour = H.get_skin_colour() SET_HAIR_COLOUR(H, skin_colour, TRUE) SET_FACIAL_HAIR_COLOUR(H, skin_colour, TRUE) ..() -/decl/species/shapeshifter/get_pain_emote(var/mob/living/carbon/human/H, var/pain_power) +/decl/species/shapeshifter/get_pain_emote(var/mob/living/human/H, var/pain_power) var/decl/species/S = get_species_by_key(wrapped_species_by_ref["\ref[H]"]) return S.get_pain_emote(H, pain_power) // Verbs follow. -/mob/living/carbon/human/proc/shapeshifter_select_hair() +/mob/living/human/proc/shapeshifter_select_hair() set name = "Select Hair" set category = "Abilities" @@ -66,7 +66,7 @@ var/global/list/wrapped_species_by_ref = list() var/decl/sprite_accessory/new_hair = input("Select a facial hair style.", "Shapeshifter Hair") as null|anything in beardstyles SET_FACIAL_HAIR_STYLE(src, (new_hair ? new_hair.type : /decl/sprite_accessory/facial_hair/shaved), FALSE) -/mob/living/carbon/human/proc/shapeshifter_select_gender() +/mob/living/human/proc/shapeshifter_select_gender() set name = "Select Gender" set category = "Abilities" @@ -83,7 +83,7 @@ var/global/list/wrapped_species_by_ref = list() visible_message("\The [src]'s form contorts subtly.") set_gender(new_gender, TRUE) -/mob/living/carbon/human/proc/shapeshifter_select_shape() +/mob/living/human/proc/shapeshifter_select_shape() set name = "Select Body Shape" set category = "Abilities" @@ -101,7 +101,7 @@ var/global/list/wrapped_species_by_ref = list() visible_message("\The [src] shifts and contorts, taking the form of \a ["\improper [new_species]"]!") try_refresh_visible_overlays() -/mob/living/carbon/human/proc/shapeshifter_select_colour() +/mob/living/human/proc/shapeshifter_select_colour() set name = "Select Body Colour" set category = "Abilities" @@ -116,7 +116,7 @@ var/global/list/wrapped_species_by_ref = list() return shapeshifter_set_colour(new_skin) -/mob/living/carbon/human/proc/shapeshifter_set_colour(var/new_skin) +/mob/living/human/proc/shapeshifter_set_colour(var/new_skin) set_skin_colour(new_skin, skip_update = TRUE) var/decl/species/shapeshifter/S = species if(S.monochromatic) diff --git a/code/modules/species/species_shapeshifter_bodytypes.dm b/code/modules/species/species_shapeshifter_bodytypes.dm index 80ca137744f..3341259ea98 100644 --- a/code/modules/species/species_shapeshifter_bodytypes.dm +++ b/code/modules/species/species_shapeshifter_bodytypes.dm @@ -13,22 +13,22 @@ return DISMEMBER_METHOD_BLUNT return ..() -/decl/bodytype/shapeshifter/get_base_icon(var/mob/living/carbon/human/H, var/get_deform) +/decl/bodytype/shapeshifter/get_base_icon(var/mob/living/human/H, var/get_deform) if(!H) return ..(null, get_deform) var/decl/species/S = get_species_by_key(wrapped_species_by_ref["\ref[H]"]) return S.default_bodytype.get_base_icon(H, get_deform) -/decl/bodytype/shapeshifter/get_blood_overlays(var/mob/living/carbon/human/H) +/decl/bodytype/shapeshifter/get_blood_overlays(var/mob/living/human/H) if(!H) return ..() var/decl/species/S = get_species_by_key(wrapped_species_by_ref["\ref[H]"]) return S.default_bodytype.get_blood_overlays(H) -/decl/bodytype/shapeshifter/get_damage_overlays(var/mob/living/carbon/human/H) +/decl/bodytype/shapeshifter/get_damage_overlays(var/mob/living/human/H) if(!H) return ..() var/decl/species/S = get_species_by_key(wrapped_species_by_ref["\ref[H]"]) return S.default_bodytype.get_damage_overlays(H) -/decl/bodytype/shapeshifter/get_husk_icon(var/mob/living/carbon/human/H) +/decl/bodytype/shapeshifter/get_husk_icon(var/mob/living/human/H) if(H) var/decl/species/S = get_species_by_key(wrapped_species_by_ref["\ref[H]"]) if(S) return S.default_bodytype.get_husk_icon(H) diff --git a/code/modules/species/station/golem.dm b/code/modules/species/station/golem.dm index 9b79b87ed00..da23b45db89 100644 --- a/code/modules/species/station/golem.dm +++ b/code/modules/species/station/golem.dm @@ -39,7 +39,7 @@ traits = list(/decl/trait/metabolically_inert = TRAIT_LEVEL_EXISTS) -/decl/species/golem/handle_post_spawn(var/mob/living/carbon/human/H) +/decl/species/golem/handle_post_spawn(var/mob/living/human/H) if(H.mind) H.mind.reset() H.mind.assigned_role = "Golem" diff --git a/code/modules/species/station/human.dm b/code/modules/species/station/human.dm index 39088dd7d9d..89657af619a 100644 --- a/code/modules/species/station/human.dm +++ b/code/modules/species/station/human.dm @@ -6,7 +6,7 @@ description = "A medium-sized creature prone to great ambition. If you are reading this, you are probably a human." hidden_from_codex = FALSE spawn_flags = SPECIES_CAN_JOIN - inherent_verbs = list(/mob/living/carbon/human/proc/tie_hair) + inherent_verbs = list(/mob/living/human/proc/tie_hair) // Add /decl/bodytype/prosthetic/basic_human to this list to allow full-body prosthetics. available_bodytypes = list( @@ -30,14 +30,14 @@ /decl/emote/exertion/synthetic/creak ) -/decl/species/human/get_root_species_name(var/mob/living/carbon/human/H) +/decl/species/human/get_root_species_name(var/mob/living/human/H) return SPECIES_HUMAN -/decl/species/human/get_ssd(var/mob/living/carbon/human/H) +/decl/species/human/get_ssd(var/mob/living/human/H) if(H.stat == CONSCIOUS) return "staring blankly, not reacting to your presence" return ..() -/decl/species/human/equip_default_fallback_uniform(var/mob/living/carbon/human/H) +/decl/species/human/equip_default_fallback_uniform(var/mob/living/human/H) if(istype(H)) H.equip_to_slot_or_del(new /obj/item/clothing/jumpsuit/grey, slot_w_uniform_str) diff --git a/code/modules/spells/aoe_turf/drain_blood.dm b/code/modules/spells/aoe_turf/drain_blood.dm index 470c18f9f3a..8ad4ea6b8a2 100644 --- a/code/modules/spells/aoe_turf/drain_blood.dm +++ b/code/modules/spells/aoe_turf/drain_blood.dm @@ -21,7 +21,7 @@ continue //Hurt target if(ishuman(L)) - var/mob/living/carbon/human/H = L + var/mob/living/human/H = L H.vessel.remove_any(10) else L.take_damage(10) @@ -35,7 +35,7 @@ //Heal self if(ishuman(user)) - var/mob/living/carbon/human/H = user + var/mob/living/human/H = user var/amount = min(10, H.species.blood_volume - H.vessel.total_volume) if(amount > 0) H.adjust_blood(amount) diff --git a/code/modules/spells/artifacts/spellbound_servants.dm b/code/modules/spells/artifacts/spellbound_servants.dm index 6ae29a481a4..f98d928ed8f 100644 --- a/code/modules/spells/artifacts/spellbound_servants.dm +++ b/code/modules/spells/artifacts/spellbound_servants.dm @@ -6,7 +6,7 @@ /datum/spellbound_type/proc/spawn_servant(var/atom/a, var/mob/master, var/mob/user) set waitfor = 0 - var/mob/living/carbon/human/H = new(a) + var/mob/living/human/H = new(a) H.ckey = user.ckey H.change_appearance(APPEARANCE_GENDER|APPEARANCE_BODY|APPEARANCE_EYE_COLOR|APPEARANCE_HAIR|APPEARANCE_FACIAL_HAIR|APPEARANCE_HAIR_COLOR|APPEARANCE_FACIAL_HAIR_COLOR|APPEARANCE_SKIN) @@ -25,7 +25,7 @@ H.SetName(name_choice) H.real_name = name_choice -/datum/spellbound_type/proc/equip_servant(var/mob/living/carbon/human/H) +/datum/spellbound_type/proc/equip_servant(var/mob/living/human/H) for(var/stype in spells) var/spell/S = new stype() if(S.spell_flags & NEEDSCLOTHES) @@ -42,7 +42,7 @@ /datum/spellbound_type/proc/set_antag(var/datum/mind/M, var/mob/master) return -/datum/spellbound_type/proc/modify_servant(var/list/items, var/mob/living/carbon/human/H) +/datum/spellbound_type/proc/modify_servant(var/list/items, var/mob/living/human/H) return /datum/spellbound_type/apprentice @@ -103,7 +103,7 @@ /obj/item/clothing/pants/familiar = slot_w_uniform_str ) -/datum/spellbound_type/servant/familiar/modify_servant(var/list/equipment, var/mob/living/carbon/human/H) +/datum/spellbound_type/servant/familiar/modify_servant(var/list/equipment, var/mob/living/human/H) var/familiar_type switch(input(H,"Choose your desired animal form:", "Form") as anything in list("Space Pike", "Mouse", "Cat", "Bear")) if("Space Pike") @@ -133,7 +133,7 @@ /spell/hand/charges/blood_shard ) -/datum/spellbound_type/servant/fiend/equip_servant(var/mob/living/carbon/human/H) +/datum/spellbound_type/servant/fiend/equip_servant(var/mob/living/human/H) if(H.gender == MALE) equipment = list(/obj/item/clothing/costume/fiendsuit = slot_w_uniform_str, /obj/item/clothing/shoes/dress/devilshoes = slot_shoes_str) @@ -154,7 +154,7 @@ /spell/targeted/genetic/blind/hysteria ) -/datum/spellbound_type/servant/infiltrator/equip_servant(var/mob/living/carbon/human/H) +/datum/spellbound_type/servant/infiltrator/equip_servant(var/mob/living/human/H) if(H.gender == MALE) equipment = list(/obj/item/clothing/pants/slacks/outfit/tie = slot_w_uniform_str, /obj/item/clothing/shoes/dress/infilshoes = slot_shoes_str) @@ -183,7 +183,7 @@ /spell/targeted/revoke ) -/datum/spellbound_type/servant/overseer/equip_servant(var/mob/living/carbon/human/H) +/datum/spellbound_type/servant/overseer/equip_servant(var/mob/living/human/H) ..() H.add_aura(new /obj/aura/regenerating(H)) diff --git a/code/modules/spells/general/invisibility.dm b/code/modules/spells/general/invisibility.dm index 70914e75059..3fbab715efd 100644 --- a/code/modules/spells/general/invisibility.dm +++ b/code/modules/spells/general/invisibility.dm @@ -13,7 +13,7 @@ if(ishuman(holder)) return holder -/spell/invisibility/cast(var/mob/living/carbon/human/H, var/mob/user) +/spell/invisibility/cast(var/mob/living/human/H, var/mob/user) on = !on if(on) if(H.add_cloaking_source(src)) diff --git a/code/modules/spells/hand/blood_shards.dm b/code/modules/spells/hand/blood_shards.dm index aed4a560236..0908ee28520 100644 --- a/code/modules/spells/hand/blood_shards.dm +++ b/code/modules/spells/hand/blood_shards.dm @@ -29,7 +29,7 @@ /obj/item/projectile/blood_shard/on_hit(var/atom/movable/target, var/blocked = 0) if(..()) if(ishuman(target)) - var/mob/living/carbon/human/H = target + var/mob/living/human/H = target H.vessel.remove_any(30) H.visible_message("Tiny red shards burst from \the [H]'s skin!") fragmentate(get_turf(src), 30, 5, list(/obj/item/projectile/bullet/pellet/blood)) diff --git a/code/modules/spells/hand/burning_grip.dm b/code/modules/spells/hand/burning_grip.dm index 96c4b472b67..772b4e6aa9c 100644 --- a/code/modules/spells/hand/burning_grip.dm +++ b/code/modules/spells/hand/burning_grip.dm @@ -10,7 +10,7 @@ spell_delay = 120 hud_state = "wiz_burn" cast_sound = 'sound/magic/fireball.ogg' - compatible_targets = list(/mob/living/carbon/human) + compatible_targets = list(/mob/living/human) /spell/hand/burning_grip/valid_target(var/mob/living/L, var/mob/user) if(!..()) @@ -19,7 +19,7 @@ return 0 return 1 -/spell/hand/burning_grip/cast_hand(var/mob/living/carbon/human/H, var/mob/user) +/spell/hand/burning_grip/cast_hand(var/mob/living/human/H, var/mob/user) var/list/targets = list() for(var/hand_slot in H.get_held_item_slots()) targets |= hand_slot diff --git a/code/modules/spells/racial_wizard.dm b/code/modules/spells/racial_wizard.dm index f7eca973b1a..bcb00360c9c 100644 --- a/code/modules/spells/racial_wizard.dm +++ b/code/modules/spells/racial_wizard.dm @@ -18,7 +18,7 @@ if(!ishuman(user)) to_chat(user, "\The [src] can do nothing for such a simple being.") return - var/mob/living/carbon/human/H = user + var/mob/living/human/H = user var/reward = potentials[H.species.get_root_species_name(H)] //we get body type because that lets us ignore subspecies. if(!reward) to_chat(user, "\The [src] does not know what to make of you.") diff --git a/code/modules/spells/spellbook.dm b/code/modules/spells/spellbook.dm index 79a64522435..ef043dbb5ba 100644 --- a/code/modules/spells/spellbook.dm +++ b/code/modules/spells/spellbook.dm @@ -161,7 +161,7 @@ var/global/list/artefact_feedback = list( dat += "
    [spellbook.book_flags & LOCKED ? "Unlock" : "Lock"] the spellbook.
    " show_browser(user, dat, "window=spellbook") -/obj/item/spellbook/CanUseTopic(var/mob/living/carbon/human/H) +/obj/item/spellbook/CanUseTopic(var/mob/living/human/H) if(!istype(H)) return STATUS_CLOSE @@ -170,7 +170,7 @@ var/global/list/artefact_feedback = list( return ..() -/obj/item/spellbook/OnTopic(var/mob/living/carbon/human/user, href_list) +/obj/item/spellbook/OnTopic(var/mob/living/human/user, href_list) if(href_list["lock"] && !(spellbook.book_flags & NO_LOCKING)) if(spellbook.book_flags & LOCKED) spellbook.book_flags &= ~LOCKED diff --git a/code/modules/spells/targeted/analyze.dm b/code/modules/spells/targeted/analyze.dm index 60ac4536930..705d97399c7 100644 --- a/code/modules/spells/targeted/analyze.dm +++ b/code/modules/spells/targeted/analyze.dm @@ -9,11 +9,11 @@ range = 2 invocation_type = SpI_WHISPER invocation = "Fu Yi Fim" - compatible_mobs = list(/mob/living/carbon/human) + compatible_mobs = list(/mob/living/human) hud_state = "analyze" /spell/targeted/analyze/cast(var/list/targets, var/mob/user) for(var/a in targets) - var/mob/living/carbon/human/H = a + var/mob/living/human/H = a new /obj/effect/temporary(get_turf(a),5, 'icons/effects/effects.dmi', "repel_missiles") to_chat(user,medical_scan_results(H,1)) \ No newline at end of file diff --git a/code/modules/spells/targeted/blood_boil.dm b/code/modules/spells/targeted/blood_boil.dm index 0f9ef34b98a..4c39b3b4620 100644 --- a/code/modules/spells/targeted/blood_boil.dm +++ b/code/modules/spells/targeted/blood_boil.dm @@ -8,7 +8,7 @@ invocation_type = SpI_NONE range = 5 max_targets = 1 - compatible_mobs = list(/mob/living/carbon/human) + compatible_mobs = list(/mob/living/human) time_between_channels = 50 number_of_channels = 0 @@ -16,7 +16,7 @@ hud_state = "wiz_boilblood" /spell/targeted/blood_boil/cast(var/list/targets, var/mob/user) - var/mob/living/carbon/human/H = targets[1] + var/mob/living/human/H = targets[1] H.bodytemperature += 40 if(prob(10)) to_chat(H,"\The [user] seems to radiate an uncomfortable amount of heat your direction.") diff --git a/code/modules/spells/targeted/equip/burning_touch.dm b/code/modules/spells/targeted/equip/burning_touch.dm index ba96d731f37..fb650fa154b 100644 --- a/code/modules/spells/targeted/equip/burning_touch.dm +++ b/code/modules/spells/targeted/equip/burning_touch.dm @@ -44,7 +44,7 @@ if(!ishuman(src.loc)) qdel(src) return - var/mob/living/carbon/human/user = src.loc + var/mob/living/human/user = src.loc var/obj/item/organ/external/hand if(src == user.get_equipped_item(BP_L_HAND)) hand = GET_INTERNAL_ORGAN(user, BP_L_HAND) diff --git a/code/modules/spells/targeted/equip/holy_relic.dm b/code/modules/spells/targeted/equip/holy_relic.dm index 5ad87588bc6..7c6dadf5da2 100644 --- a/code/modules/spells/targeted/equip/holy_relic.dm +++ b/code/modules/spells/targeted/equip/holy_relic.dm @@ -14,7 +14,7 @@ duration = 25 SECONDS cooldown_min = 35 SECONDS delete_old = 0 - compatible_mobs = list(/mob/living/carbon/human) + compatible_mobs = list(/mob/living/human) hud_state = "purge1" diff --git a/code/modules/spells/targeted/equip/horsemask.dm b/code/modules/spells/targeted/equip/horsemask.dm index 0ddb8708e90..31995ba86bd 100644 --- a/code/modules/spells/targeted/equip/horsemask.dm +++ b/code/modules/spells/targeted/equip/horsemask.dm @@ -14,7 +14,7 @@ cooldown_min = 30 //30 deciseconds reduction per rank selection_type = "range" - compatible_mobs = list(/mob/living/carbon/human) + compatible_mobs = list(/mob/living/human) hud_state = "wiz_horse" cast_sound = 'sound/magic/horsehead_curse.ogg' diff --git a/code/modules/spells/targeted/equip/party_hardy.dm b/code/modules/spells/targeted/equip/party_hardy.dm index b8ae4513130..35dd93a22d0 100644 --- a/code/modules/spells/targeted/equip/party_hardy.dm +++ b/code/modules/spells/targeted/equip/party_hardy.dm @@ -16,7 +16,7 @@ hud_state = "wiz_party" - compatible_mobs = list(/mob/living/carbon/human) + compatible_mobs = list(/mob/living/human) equipped_summons = list("active hand" = /obj/item/chems/drinks/bottle/small/beer) /spell/targeted/equip_item/party_hardy/empower_spell() diff --git a/code/modules/spells/targeted/equip/seed.dm b/code/modules/spells/targeted/equip/seed.dm index 8e4358f4368..2252ec75c8c 100644 --- a/code/modules/spells/targeted/equip/seed.dm +++ b/code/modules/spells/targeted/equip/seed.dm @@ -9,7 +9,7 @@ invocation = "Ria'li akta." equipped_summons = list("active hand" = /obj/item/seeds/random) - compatible_mobs = list(/mob/living/carbon/human) + compatible_mobs = list(/mob/living/human) charge_max = 600 //1 minute cooldown_min = 200 //20 seconds diff --git a/code/modules/spells/targeted/equip/shield.dm b/code/modules/spells/targeted/equip/shield.dm index 4196c023e41..b725196ad3a 100644 --- a/code/modules/spells/targeted/equip/shield.dm +++ b/code/modules/spells/targeted/equip/shield.dm @@ -9,7 +9,7 @@ range = -1 max_targets = 1 - compatible_mobs = list(/mob/living/carbon/human) + compatible_mobs = list(/mob/living/human) level_max = list(Sp_TOTAL = 3, Sp_SPEED = 2, Sp_POWER = 1) charge_type = Sp_RECHARGE diff --git a/code/modules/spells/targeted/projectile/stuncuff.dm b/code/modules/spells/targeted/projectile/stuncuff.dm index 63539562c62..52046381588 100644 --- a/code/modules/spells/targeted/projectile/stuncuff.dm +++ b/code/modules/spells/targeted/projectile/stuncuff.dm @@ -25,7 +25,7 @@ /spell/targeted/projectile/dumbfire/stuncuff/prox_cast(var/list/targets, spell_holder) for(var/mob/living/M in targets) if(ishuman(M)) - var/mob/living/carbon/human/H = M + var/mob/living/human/H = M var/obj/item/handcuffs/wizard/cuffs = new() H.equip_to_slot(cuffs, slot_handcuffed_str) H.visible_message("Beams of light form around \the [H]'s hands!") diff --git a/code/modules/spells/targeted/shatter_mind.dm b/code/modules/spells/targeted/shatter_mind.dm index 2f62902ac58..f84d6765035 100644 --- a/code/modules/spells/targeted/shatter_mind.dm +++ b/code/modules/spells/targeted/shatter_mind.dm @@ -8,7 +8,7 @@ invocation_type = SpI_NONE range = 5 max_targets = 1 - compatible_mobs = list(/mob/living/carbon/human) + compatible_mobs = list(/mob/living/human) time_between_channels = 150 number_of_channels = 0 @@ -16,7 +16,7 @@ hud_state = "wiz_statue" /spell/targeted/shatter/cast(var/list/targets, var/mob/user) - var/mob/living/carbon/human/H = targets[1] + var/mob/living/human/H = targets[1] if(prob(50)) sound_to(user, get_sfx("swing_hit")) if(prob(5)) diff --git a/code/modules/spells/targeted/subjugate.dm b/code/modules/spells/targeted/subjugate.dm index 914de088ed2..700dac35b36 100644 --- a/code/modules/spells/targeted/subjugate.dm +++ b/code/modules/spells/targeted/subjugate.dm @@ -18,7 +18,7 @@ amt_confused = 100 amt_stuttering = 100 - compatible_mobs = list(/mob/living/carbon/human) + compatible_mobs = list(/mob/living/human) hud_state = "wiz_subj" diff --git a/code/modules/spells/targeted/targeted.dm b/code/modules/spells/targeted/targeted.dm index 422c1d3e574..46e6e242b26 100644 --- a/code/modules/spells/targeted/targeted.dm +++ b/code/modules/spells/targeted/targeted.dm @@ -145,7 +145,7 @@ Targeted spells have two useful flags: INCLUDEUSER and SELECTABLE. These are exp target.take_damage(amt_dam_tox, TOX, do_update_health = FALSE) target.take_damage(amt_dam_oxy, OXY) if(ishuman(target)) - var/mob/living/carbon/human/H = target + var/mob/living/human/H = target for(var/obj/item/organ/internal/affecting in H.get_internal_organs()) if(affecting && istype(affecting)) affecting.heal_damage(amt_organ, amt_organ) diff --git a/code/modules/spells/targeted/torment.dm b/code/modules/spells/targeted/torment.dm index 4c9f9b9a3ee..e98836699f3 100644 --- a/code/modules/spells/targeted/torment.dm +++ b/code/modules/spells/targeted/torment.dm @@ -13,7 +13,7 @@ message = "So much pain! All you can hear is screaming!" max_targets = 0 - compatible_mobs = list(/mob/living/carbon/human) + compatible_mobs = list(/mob/living/human) var/loss = 30 @@ -22,7 +22,7 @@ /spell/targeted/torment/cast(var/list/targets, var/mob/user) user.spawn_gibber() - for(var/mob/living/carbon/human/H in targets) + for(var/mob/living/human/H in targets) H.take_damage(loss, PAIN) /spell/targeted/torment/empower_spell() diff --git a/code/modules/submaps/submap_job.dm b/code/modules/submaps/submap_job.dm index 61479dc7040..56b5121bc7f 100644 --- a/code/modules/submaps/submap_job.dm +++ b/code/modules/submaps/submap_job.dm @@ -95,7 +95,7 @@ /datum/job/submap/check_is_active(var/mob/M) . = (..() && M.faction == owner.name) -/datum/job/submap/create_cash_on_hand(var/mob/living/carbon/human/H, var/datum/money_account/M) +/datum/job/submap/create_cash_on_hand(var/mob/living/human/H, var/datum/money_account/M) . = get_total_starting_money(H) if(. > 0) var/obj/item/cash/cash = new diff --git a/code/modules/submaps/submap_join.dm b/code/modules/submaps/submap_join.dm index 312e37b0f45..67ab23971a1 100644 --- a/code/modules/submaps/submap_join.dm +++ b/code/modules/submaps/submap_join.dm @@ -65,7 +65,7 @@ if(istype(other_mob)) character = other_mob - var/mob/living/carbon/human/user_human + var/mob/living/human/user_human if(ishuman(character)) user_human = character if(job.branch && mil_branches) diff --git a/code/modules/supermatter/supermatter.dm b/code/modules/supermatter/supermatter.dm index cdf3a4de4d4..5e816a644c1 100644 --- a/code/modules/supermatter/supermatter.dm +++ b/code/modules/supermatter/supermatter.dm @@ -522,7 +522,7 @@ var/global/list/supermatter_delam_accent_sounds = list( env.merge(removed) - for(var/mob/living/carbon/human/subject in view(src, min(7, round(sqrt(power/6))))) + for(var/mob/living/human/subject in view(src, min(7, round(sqrt(power/6))))) var/obj/item/organ/internal/eyes/eyes = subject.get_organ(BP_EYES, /obj/item/organ/internal/eyes) if (!eyes) continue diff --git a/code/modules/surgery/_surgery.dm b/code/modules/surgery/_surgery.dm index 64af1cebebf..8be9dac5ef6 100644 --- a/code/modules/surgery/_surgery.dm +++ b/code/modules/surgery/_surgery.dm @@ -48,7 +48,7 @@ var/global/list/surgery_tool_exception_cache = list() /// Any additional information to add to the codex entry for this step. var/list/additional_codex_lines /// What mob type does this surgery apply to. - var/expected_mob_type = /mob/living/carbon/human + var/expected_mob_type = /mob/living/human /// Sound (or list of sounds) to play on end step. var/end_step_sound = "rustle" /// Sound (or list of sounds) to play on fail step. @@ -161,13 +161,13 @@ var/global/list/surgery_tool_exception_cache = list() if (can_infect && affected) spread_germs_to_organ(affected, user) if(ishuman(user) && prob(60)) - var/mob/living/carbon/human/H = user + var/mob/living/human/H = user if (blood_level) H.bloody_hands(target,2) if (blood_level > 1) H.bloody_body(target,2) if(shock_level && ishuman(target)) - var/mob/living/carbon/human/H = target + var/mob/living/human/H = target H.shock_stage = max(H.shock_stage, shock_level) // does stuff to end the step, which is normally print a message + do whatever this step changes @@ -196,7 +196,7 @@ var/global/list/surgery_tool_exception_cache = list() . += 20 if(ishuman(user)) - var/mob/living/carbon/human/H = user + var/mob/living/human/H = user . -= round(H.shock_stage * 0.5) if(GET_STATUS(H, STAT_BLURRY)) . -= 20 @@ -219,7 +219,7 @@ var/global/list/surgery_tool_exception_cache = list() . -= 10 . = max(., 0) -/proc/spread_germs_to_organ(var/obj/item/organ/external/E, var/mob/living/carbon/human/user) +/proc/spread_germs_to_organ(var/obj/item/organ/external/E, var/mob/living/human/user) if(!istype(user) || !istype(E)) return var/germ_level = user.germ_level diff --git a/code/modules/vehicles/bike.dm b/code/modules/vehicles/bike.dm index 1a5b1dc82c8..bacbcbc4dc5 100644 --- a/code/modules/vehicles/bike.dm +++ b/code/modules/vehicles/bike.dm @@ -104,7 +104,7 @@ engine.emp_act(severity) ..() -/obj/vehicle/bike/insert_cell(var/obj/item/cell/C, var/mob/living/carbon/human/H) +/obj/vehicle/bike/insert_cell(var/obj/item/cell/C, var/mob/living/human/H) return /obj/vehicle/bike/attackby(obj/item/W, mob/user) diff --git a/code/modules/vehicles/cargo_train.dm b/code/modules/vehicles/cargo_train.dm index e995266e03f..381667436a7 100644 --- a/code/modules/vehicles/cargo_train.dm +++ b/code/modules/vehicles/cargo_train.dm @@ -97,20 +97,20 @@ else icon_state = initial(icon_state) -/obj/vehicle/train/cargo/trolley/insert_cell(var/obj/item/cell/C, var/mob/living/carbon/human/H) +/obj/vehicle/train/cargo/trolley/insert_cell(var/obj/item/cell/C, var/mob/living/human/H) return -/obj/vehicle/train/cargo/engine/insert_cell(var/obj/item/cell/C, var/mob/living/carbon/human/H) +/obj/vehicle/train/cargo/engine/insert_cell(var/obj/item/cell/C, var/mob/living/human/H) ..() update_stats() -/obj/vehicle/train/cargo/engine/remove_cell(var/mob/living/carbon/human/H) +/obj/vehicle/train/cargo/engine/remove_cell(var/mob/living/human/H) ..() update_stats() /obj/vehicle/train/cargo/engine/Bump(atom/Obstacle) var/obj/machinery/door/D = Obstacle - var/mob/living/carbon/human/H = load + var/mob/living/human/H = load if(istype(D) && istype(H)) D.Bumped(H) //a little hacky, but hey, it works, and respects access rights @@ -164,7 +164,7 @@ /obj/vehicle/train/cargo/engine/crossed_mob(var/mob/living/victim) ..() if(is_train_head() && ishuman(load)) - var/mob/living/carbon/human/D = load + var/mob/living/human/D = load to_chat(D, "You ran over \the [victim]!") visible_message("\The [src] ran over \the [victim]!") attack_log += text("\[[time_stamp()]\] ran over [victim.name] ([victim.ckey]), driven by [D.name] ([D.ckey])") diff --git a/code/modules/vehicles/vehicle.dm b/code/modules/vehicles/vehicle.dm index 644af96f2d4..7e3226f3c8d 100644 --- a/code/modules/vehicles/vehicle.dm +++ b/code/modules/vehicles/vehicle.dm @@ -221,7 +221,7 @@ turn_on() return -/obj/vehicle/proc/insert_cell(var/obj/item/cell/C, var/mob/living/carbon/human/H) +/obj/vehicle/proc/insert_cell(var/obj/item/cell/C, var/mob/living/human/H) if(cell) return if(!istype(C)) @@ -232,7 +232,7 @@ powercheck() to_chat(usr, "You install [C] in [src].") -/obj/vehicle/proc/remove_cell(var/mob/living/carbon/human/H) +/obj/vehicle/proc/remove_cell(var/mob/living/human/H) if(!cell) return diff --git a/code/modules/ventcrawl/ventcrawl.dm b/code/modules/ventcrawl/ventcrawl.dm index 163f4cd3114..e044418f292 100644 --- a/code/modules/ventcrawl/ventcrawl.dm +++ b/code/modules/ventcrawl/ventcrawl.dm @@ -38,7 +38,7 @@ var/global/list/ventcrawl_machinery = list( return TRUE return (carried_item in get_internal_organs()) -/mob/living/carbon/human/is_allowed_vent_crawl_item(var/obj/item/carried_item) +/mob/living/human/is_allowed_vent_crawl_item(var/obj/item/carried_item) var/obj/item/organ/internal/stomach = GET_INTERNAL_ORGAN(src, BP_STOMACH) if(stomach && (carried_item in stomach.contents)) return TRUE diff --git a/code/modules/xenoarcheaology/artifacts/effects/_effect.dm b/code/modules/xenoarcheaology/artifacts/effects/_effect.dm index 0f987bdcaf4..6d441a98c4c 100644 --- a/code/modules/xenoarcheaology/artifacts/effects/_effect.dm +++ b/code/modules/xenoarcheaology/artifacts/effects/_effect.dm @@ -107,7 +107,7 @@ . += " Activation index involves [trigger]." //returns 0..1, with 1 being no protection and 0 being fully protected -/proc/GetAnomalySusceptibility(var/mob/living/carbon/human/H) +/proc/GetAnomalySusceptibility(var/mob/living/human/H) if(!istype(H)) return 1 diff --git a/code/modules/xenoarcheaology/artifacts/effects/badfeeling.dm b/code/modules/xenoarcheaology/artifacts/effects/badfeeling.dm index 58c8b2283b1..02f4612a86d 100644 --- a/code/modules/xenoarcheaology/artifacts/effects/badfeeling.dm +++ b/code/modules/xenoarcheaology/artifacts/effects/badfeeling.dm @@ -33,18 +33,18 @@ /datum/artifact_effect/badfeeling/DoEffectAura() if(holder) var/turf/T = get_turf(holder) - for (var/mob/living/carbon/human/H in range(effect_range,T)) + for (var/mob/living/human/H in range(effect_range,T)) affect_human(H, 5, 10) return 1 /datum/artifact_effect/badfeeling/DoEffectPulse() if(holder) var/turf/T = get_turf(holder) - for (var/mob/living/carbon/human/H in range(effect_range,T)) + for (var/mob/living/human/H in range(effect_range,T)) affect_human(H, 50, 50) return 1 -/datum/artifact_effect/badfeeling/proc/affect_human(mob/living/carbon/human/H, message_prob, dizziness_prob) +/datum/artifact_effect/badfeeling/proc/affect_human(mob/living/human/H, message_prob, dizziness_prob) if(H.stat) return if(prob(message_prob)) diff --git a/code/modules/xenoarcheaology/artifacts/effects/dnaswitch.dm b/code/modules/xenoarcheaology/artifacts/effects/dnaswitch.dm index 5e40c17a0eb..4f4fa21b087 100644 --- a/code/modules/xenoarcheaology/artifacts/effects/dnaswitch.dm +++ b/code/modules/xenoarcheaology/artifacts/effects/dnaswitch.dm @@ -27,19 +27,19 @@ /datum/artifact_effect/dnaswitch/DoEffectAura() if(holder) var/turf/T = get_turf(holder) - for(var/mob/living/carbon/human/H in range(effect_range,T)) + for(var/mob/living/human/H in range(effect_range,T)) mess_dna(H, 100, 50, 30) return 1 /datum/artifact_effect/dnaswitch/DoEffectPulse() if(holder) var/turf/T = get_turf(holder) - for(var/mob/living/carbon/human/H in range(effect_range, T)) + for(var/mob/living/human/H in range(effect_range, T)) mess_dna(H, 25, 75, 75) return 1 // Swapped to radiation pending readding of mutations. -/datum/artifact_effect/dnaswitch/proc/mess_dna(mob/living/carbon/human/H, scramble_prob, UI_scramble_prob, message_prob) +/datum/artifact_effect/dnaswitch/proc/mess_dna(mob/living/human/H, scramble_prob, UI_scramble_prob, message_prob) var/weakness = GetAnomalySusceptibility(H) if(prob(weakness * 100) && H.has_genetic_information()) if(prob(message_prob)) diff --git a/code/modules/xenoarcheaology/artifacts/effects/goodfeeling.dm b/code/modules/xenoarcheaology/artifacts/effects/goodfeeling.dm index 165e415697a..e5d88d10a30 100644 --- a/code/modules/xenoarcheaology/artifacts/effects/goodfeeling.dm +++ b/code/modules/xenoarcheaology/artifacts/effects/goodfeeling.dm @@ -31,18 +31,18 @@ /datum/artifact_effect/goodfeeling/DoEffectAura() if(holder) var/turf/T = get_turf(holder) - for (var/mob/living/carbon/human/H in range(effect_range,T)) + for (var/mob/living/human/H in range(effect_range,T)) affect_human(H, 5, 5) return 1 /datum/artifact_effect/goodfeeling/DoEffectPulse() if(holder) var/turf/T = get_turf(holder) - for (var/mob/living/carbon/human/H in range(effect_range,T)) + for (var/mob/living/human/H in range(effect_range,T)) affect_human(H, 50, 50) return 1 -/datum/artifact_effect/goodfeeling/proc/affect_human(mob/living/carbon/human/H, message_prob, dizziness_prob) +/datum/artifact_effect/goodfeeling/proc/affect_human(mob/living/human/H, message_prob, dizziness_prob) if(H.stat) return if(prob(message_prob)) diff --git a/code/modules/xenoarcheaology/artifacts/effects/heal.dm b/code/modules/xenoarcheaology/artifacts/effects/heal.dm index 63b50ee4300..73bf53bc022 100644 --- a/code/modules/xenoarcheaology/artifacts/effects/heal.dm +++ b/code/modules/xenoarcheaology/artifacts/effects/heal.dm @@ -33,5 +33,5 @@ M.bodytemperature = M.get_species()?.body_temperature || initial(M.bodytemperature) M.adjust_nutrition(50 * weakness) if(ishuman(M)) - var/mob/living/carbon/human/H = M + var/mob/living/human/H = M H.regenerate_blood(5 * weakness) diff --git a/code/modules/xenoarcheaology/artifacts/effects/sleepy.dm b/code/modules/xenoarcheaology/artifacts/effects/sleepy.dm index b2a9e97ba48..6bb1478a0ba 100644 --- a/code/modules/xenoarcheaology/artifacts/effects/sleepy.dm +++ b/code/modules/xenoarcheaology/artifacts/effects/sleepy.dm @@ -20,18 +20,18 @@ /datum/artifact_effect/sleepy/DoEffectAura() if(holder) var/turf/T = get_turf(holder) - for(var/mob/living/carbon/human/H in range(effect_range,T)) + for(var/mob/living/human/H in range(effect_range,T)) sleepify(H, 2, 25, 10) return 1 /datum/artifact_effect/sleepy/DoEffectPulse() if(holder) var/turf/T = get_turf(holder) - for(var/mob/living/carbon/human/H in range(effect_range, T)) + for(var/mob/living/human/H in range(effect_range, T)) sleepify(H, rand(5,15), 50, 50) return 1 -/datum/artifact_effect/sleepy/proc/sleepify(mob/living/carbon/human/H, speed, limit, message_prob) +/datum/artifact_effect/sleepy/proc/sleepify(mob/living/human/H, speed, limit, message_prob) var/weakness = GetAnomalySusceptibility(H) if(prob(weakness * 100)) if(H.isSynthetic()) diff --git a/code/modules/xenoarcheaology/artifacts/triggers/touch.dm b/code/modules/xenoarcheaology/artifacts/triggers/touch.dm index 8be77b1b5bb..7eabff44e95 100644 --- a/code/modules/xenoarcheaology/artifacts/triggers/touch.dm +++ b/code/modules/xenoarcheaology/artifacts/triggers/touch.dm @@ -1,7 +1,7 @@ /datum/artifact_trigger/touch name = "touch" -/datum/artifact_trigger/touch/proc/can_touch(mob/living/carbon/human/H, bodypart) +/datum/artifact_trigger/touch/proc/can_touch(mob/living/human/H, bodypart) return TRUE /datum/artifact_trigger/touch/on_touch(mob/living/M) @@ -14,7 +14,7 @@ /datum/artifact_trigger/touch/organic name = "organic touch" -/datum/artifact_trigger/touch/organic/can_touch(mob/living/carbon/human/H, bodypart) +/datum/artifact_trigger/touch/organic/can_touch(mob/living/human/H, bodypart) if(!istype(H)) return FALSE if(H.get_covering_equipped_item_by_zone(bodypart)) @@ -31,7 +31,7 @@ if(issilicon(L)) return TRUE if(ishuman(L)) - var/mob/living/carbon/human/H = L + var/mob/living/human/H = L if(H.isSynthetic()) return TRUE var/obj/item/organ/external/E = GET_EXTERNAL_ORGAN(H, bodypart) diff --git a/code/modules/xenoarcheaology/boulder.dm b/code/modules/xenoarcheaology/boulder.dm index d84fcba62fd..31d5602461e 100644 --- a/code/modules/xenoarcheaology/boulder.dm +++ b/code/modules/xenoarcheaology/boulder.dm @@ -84,7 +84,7 @@ /obj/structure/boulder/Bumped(AM) . = ..() if(ishuman(AM)) - var/mob/living/carbon/human/H = AM + var/mob/living/human/H = AM for(var/obj/item/P in H.get_inactive_held_items()) if(IS_PICK(P)) attackby(P, H) diff --git a/code/modules/xenoarcheaology/finds/find_types/statuette.dm b/code/modules/xenoarcheaology/finds/find_types/statuette.dm index c2f6a87dcef..0ba51852ddf 100644 --- a/code/modules/xenoarcheaology/finds/find_types/statuette.dm +++ b/code/modules/xenoarcheaology/finds/find_types/statuette.dm @@ -39,7 +39,7 @@ /obj/item/vampiric/Process() //see if we've identified anyone nearby if(world.time - last_bloodcall > bloodcall_interval && nearby_mobs.len) - var/mob/living/carbon/human/M = pop(nearby_mobs) + var/mob/living/human/M = pop(nearby_mobs) if(M in view(7,src) && M.current_health > 20) if(prob(50)) bloodcall(M) @@ -99,7 +99,7 @@ if(world.time - last_bloodcall >= bloodcall_interval && (M in view(7, src))) bloodcall(M) -/obj/item/vampiric/proc/bloodcall(var/mob/living/carbon/human/M) +/obj/item/vampiric/proc/bloodcall(var/mob/living/human/M) last_bloodcall = world.time if(istype(M)) playsound(src.loc, pick('sound/hallucinations/wail.ogg','sound/hallucinations/veryfar_noise.ogg','sound/hallucinations/far_noise.ogg'), 50, 1, -3) diff --git a/code/procs/announce.dm b/code/procs/announce.dm index af8676554a7..0134ca4a1db 100644 --- a/code/procs/announce.dm +++ b/code/procs/announce.dm @@ -130,7 +130,7 @@ var/global/datum/announcement/minor/minor_announcement = new(new_sound = 'sound/ /proc/ion_storm_announcement(list/affecting_z) command_announcement.Announce("It has come to our attention that the [station_name()] passed through an ion storm. Please monitor all electronic equipment for malfunctions.", "Anomaly Alert", zlevels = affecting_z) -/proc/AnnounceArrival(var/mob/living/carbon/human/character, var/datum/job/job, var/join_message) +/proc/AnnounceArrival(var/mob/living/human/character, var/datum/job/job, var/join_message) if(!istype(job) || !job.announced) return if (GAME_STATE != RUNLEVEL_GAME) diff --git a/code/procs/hud.dm b/code/procs/hud.dm index 760d1b2fb37..5f4c5580e92 100644 --- a/code/procs/hud.dm +++ b/code/procs/hud.dm @@ -13,7 +13,7 @@ the HUD updates properly! */ if(!can_process_hud(M)) return var/datum/arranged_hud_process/P = arrange_hud_process(M, Alt, global.med_hud_users) - for(var/mob/living/carbon/human/patient in P.Mob.in_view(P.Turf)) + for(var/mob/living/human/patient in P.Mob.in_view(P.Turf)) if(patient.is_invisible_to(P.Mob)) continue @@ -38,7 +38,7 @@ the HUD updates properly! */ if(!can_process_hud(M)) return var/datum/arranged_hud_process/P = arrange_hud_process(M, Alt, global.sec_hud_users) - for(var/mob/living/carbon/human/perp in P.Mob.in_view(P.Turf)) + for(var/mob/living/human/perp in P.Mob.in_view(P.Turf)) if(perp.is_invisible_to(P.Mob)) continue @@ -95,7 +95,7 @@ the HUD updates properly! */ /mob/observer/eye/in_view(var/turf/T) var/list/viewed = new - for(var/mob/living/carbon/human/H in SSmobs.mob_list) + for(var/mob/living/human/H in SSmobs.mob_list) if(get_dist(H, T) <= 7) viewed += H return viewed diff --git a/code/unit_tests/equipment_tests.dm b/code/unit_tests/equipment_tests.dm index 95032a01c88..25146ab9251 100644 --- a/code/unit_tests/equipment_tests.dm +++ b/code/unit_tests/equipment_tests.dm @@ -1,13 +1,13 @@ /datum/unit_test/vision_glasses name = "EQUIPMENT: Vision Template" template = /datum/unit_test/vision_glasses - var/mob/living/carbon/human/H = null + var/mob/living/human/H = null var/expectation = SEE_INVISIBLE_NOLIGHTING var/glasses_type = null async = 1 /datum/unit_test/vision_glasses/start_test() - var/list/test = create_test_mob_with_mind(get_safe_turf(), /mob/living/carbon/human) + var/list/test = create_test_mob_with_mind(get_safe_turf(), /mob/living/human) if(isnull(test)) fail("Check Runtimed in Mob creation") @@ -129,7 +129,7 @@ "[slot_wear_suit_str]" = /obj/item/clothing/suit/chickensuit ) -/datum/unit_test/equipment_slot_test/proc/check_slot_equip_successful(mob/living/carbon/human/subject, obj/item/item, which_slot, list/failure_list) +/datum/unit_test/equipment_slot_test/proc/check_slot_equip_successful(mob/living/human/subject, obj/item/item, which_slot, list/failure_list) created_atoms |= item subject.equip_to_slot_if_possible(item, which_slot) if(!subject.isEquipped(item)) @@ -138,13 +138,13 @@ var/equipped_location = subject.get_equipped_slot_for_item(item) failure_list += "[item] was expected to be equipped to [which_slot] but get_equipped_slot_for_item returned [isnull(equipped_location) ? "NULL" : equipped_location]." -/datum/unit_test/equipment_slot_test/proc/check_slot_unequip_successful(mob/living/carbon/human/subject, obj/item/item, which_slot, list/failure_list) +/datum/unit_test/equipment_slot_test/proc/check_slot_unequip_successful(mob/living/human/subject, obj/item/item, which_slot, list/failure_list) created_atoms |= item subject.try_unequip(item) if(subject.isEquipped(item)) failure_list += "[item] remained equipped to [subject.get_equipped_slot_for_item(item)] after unEquip was called." -/datum/unit_test/equipment_slot_test/proc/check_slot_equip_failure(mob/living/carbon/human/subject, obj/item/item, which_slot, list/failure_list) +/datum/unit_test/equipment_slot_test/proc/check_slot_equip_failure(mob/living/human/subject, obj/item/item, which_slot, list/failure_list) created_atoms |= item subject.equip_to_slot_if_possible(item, which_slot) if(subject.isEquipped(item)) @@ -155,7 +155,7 @@ failure_list += "[item] was equipped to [equipped_location] despite failing isEquipped (should not be equipped)." /datum/unit_test/equipment_slot_test/start_test() - var/mob/living/carbon/human/subject = new(get_safe_turf(), SPECIES_HUMAN) // force human so default map species doesn't mess with anything + var/mob/living/human/subject = new(get_safe_turf(), SPECIES_HUMAN) // force human so default map species doesn't mess with anything created_atoms |= subject var/list/failures = list() diff --git a/code/unit_tests/mob_tests.dm b/code/unit_tests/mob_tests.dm index c1d7651da27..5867dd2ca90 100644 --- a/code/unit_tests/mob_tests.dm +++ b/code/unit_tests/mob_tests.dm @@ -25,7 +25,7 @@ var/list/bodytype_pairings = get_bodytype_species_pairs() for(var/decl/bodytype/bodytype in bodytype_pairings) var/decl/species/species = bodytype_pairings[bodytype] - var/mob/living/carbon/human/test_subject = new(null, species.name, null, bodytype) + var/mob/living/human/test_subject = new(null, species.name, null, bodytype) if(test_subject.need_breathe()) test_subject.apply_effect(20, STUN, 0) var/obj/item/organ/internal/lungs/L = test_subject.get_organ(test_subject.get_bodytype().breathing_organ, /obj/item/organ/internal/lungs) @@ -36,13 +36,13 @@ /datum/unit_test/human_breath/check_result() for(var/i in test_subjects) - var/mob/living/carbon/human/test_subject = test_subjects[i][1] + var/mob/living/human/test_subject = test_subjects[i][1] if(test_subject.life_tick < 10) // Finish Condition return 0 // Return 0 to try again later. var/failcount = 0 for(var/i in test_subjects) - var/mob/living/carbon/human/test_subject = test_subjects[i][1] + var/mob/living/human/test_subject = test_subjects[i][1] var/ending_oxyloss = damage_check(test_subject, OXY) var/starting_oxyloss = test_subjects[i][2] if(starting_oxyloss >= ending_oxyloss) @@ -60,7 +60,7 @@ var/global/default_mobloc = null -/proc/create_test_mob_with_mind(var/turf/mobloc = null, var/mobtype = /mob/living/carbon/human) +/proc/create_test_mob_with_mind(var/turf/mobloc = null, var/mobtype = /mob/living/human) var/list/test_result = list("result" = FAILURE, "msg" = "", "mobref" = null) if(isnull(mobloc)) @@ -77,7 +77,7 @@ var/global/default_mobloc = null test_result["msg"] = "Unable to find a location to create test mob" return test_result - var/mob/living/carbon/human/H = new mobtype(mobloc) + var/mob/living/human/H = new mobtype(mobloc) H.mind_initialize("TestKey[rand(0,10000)]") @@ -108,7 +108,7 @@ var/global/default_mobloc = null loss = M.get_damage(PAIN) if(!loss && ishuman(M)) - var/mob/living/carbon/human/H = M // Synthetics have robot limbs which don't report damage to get_damage(XXX) + var/mob/living/human/H = M // Synthetics have robot limbs which don't report damage to get_damage(XXX) if(H.isSynthetic()) // So we have to hard code this check or create a different one for them. return H.species.total_health - H.current_health return loss @@ -131,7 +131,7 @@ var/global/default_mobloc = null name = "MOB: Template for mob damage" template = /datum/unit_test/mob_damage var/damagetype = BRUTE - var/mob_type = /mob/living/carbon/human + var/mob_type = /mob/living/human var/expected_vulnerability = STANDARD var/damage_location = BP_CHEST @@ -147,7 +147,7 @@ var/global/default_mobloc = null fail(test["msg"]) return 0 - var/mob/living/carbon/human/H = locate(test["mobref"]) + var/mob/living/human/H = locate(test["mobref"]) if(isnull(H)) fail("Test unable to set test mob from reference") @@ -289,13 +289,13 @@ var/global/default_mobloc = null /datum/unit_test/mob_nullspace/start_test() // Simply create one of each species type in nullspace for(var/species_name in get_all_species()) - var/test_subject = new/mob/living/carbon/human(null, species_name) + var/test_subject = new/mob/living/human(null, species_name) test_subjects += test_subject return TRUE /datum/unit_test/mob_nullspace/check_result() for(var/ts in test_subjects) - var/mob/living/carbon/human/H = ts + var/mob/living/human/H = ts if(H.life_tick < 10) return FALSE @@ -310,7 +310,7 @@ var/global/default_mobloc = null /datum/unit_test/mob_organ_size/start_test() var/failed = FALSE for(var/species_name in get_all_species()) - var/mob/living/carbon/human/H = new(null, species_name) + var/mob/living/human/H = new(null, species_name) for(var/obj/item/organ/external/E in H.get_external_organs()) for(var/obj/item/organ/internal/I in E.internal_organs) if(I.w_class > E.cavity_max_w_class) diff --git a/code/unit_tests/observation_tests.dm b/code/unit_tests/observation_tests.dm index aea6e3f5489..b9174d26fe8 100644 --- a/code/unit_tests/observation_tests.dm +++ b/code/unit_tests/observation_tests.dm @@ -112,7 +112,7 @@ /datum/unit_test/observation/moved_observer_shall_register_on_follow/conduct_test() var/turf/T = get_safe_turf() - var/mob/living/carbon/human/H = get_named_instance(/mob/living/carbon/human, T, global.using_map.default_species) + var/mob/living/human/H = get_named_instance(/mob/living/human, T, global.using_map.default_species) var/mob/observer/ghost/O = get_named_instance(/mob/observer/ghost, T, "Ghost") O.ManualFollow(H) @@ -130,7 +130,7 @@ /datum/unit_test/observation/moved_observer_shall_unregister_on_nofollow/conduct_test() var/turf/T = get_safe_turf() - var/mob/living/carbon/human/H = get_named_instance(/mob/living/carbon/human, T, global.using_map.default_species) + var/mob/living/human/H = get_named_instance(/mob/living/human, T, global.using_map.default_species) var/mob/observer/ghost/O = get_named_instance(/mob/observer/ghost, T, "Ghost") O.ManualFollow(H) @@ -149,7 +149,7 @@ /datum/unit_test/observation/moved_shall_not_register_on_enter_without_listeners/conduct_test() var/turf/T = get_safe_turf() - var/mob/living/carbon/human/H = get_named_instance(/mob/living/carbon/human, T, global.using_map.default_species) + var/mob/living/human/H = get_named_instance(/mob/living/human, T, global.using_map.default_species) qdel(H.virtual_mob) H.virtual_mob = null @@ -170,7 +170,7 @@ /datum/unit_test/observation/moved_shall_register_recursively_on_new_listener/conduct_test() var/turf/T = get_safe_turf() - var/mob/living/carbon/human/H = get_named_instance(/mob/living/carbon/human, T, global.using_map.default_species) + var/mob/living/human/H = get_named_instance(/mob/living/human, T, global.using_map.default_species) var/obj/structure/closet/C = get_named_instance(/obj/structure/closet, T, "Closet") var/mob/observer/ghost/O = get_named_instance(/mob/observer/ghost, T, "Ghost") @@ -193,7 +193,7 @@ /datum/unit_test/observation/moved_shall_register_recursively_with_existing_listener/conduct_test() var/turf/T = get_safe_turf() - var/mob/living/carbon/human/H = get_named_instance(/mob/living/carbon/human, T, global.using_map.default_species) + var/mob/living/human/H = get_named_instance(/mob/living/human, T, global.using_map.default_species) var/obj/structure/closet/C = get_named_instance(/obj/structure/closet, T, "Closet") var/mob/observer/ghost/O = get_named_instance(/mob/observer/ghost, T, "Ghost") diff --git a/code/unit_tests/organ_tests.dm b/code/unit_tests/organ_tests.dm index ee6aaf2755d..86d3406a5f3 100644 --- a/code/unit_tests/organ_tests.dm +++ b/code/unit_tests/organ_tests.dm @@ -22,7 +22,7 @@ /datum/unit_test/bodytype_organ_creation name = "ORGAN: Bodytype Organs are Created Correctly" -/datum/unit_test/bodytype_organ_creation/proc/check_internal_organs(var/mob/living/carbon/human/H, var/decl/bodytype/bodytype) +/datum/unit_test/bodytype_organ_creation/proc/check_internal_organs(var/mob/living/human/H, var/decl/bodytype/bodytype) . = 1 for(var/organ_tag in bodytype.has_organ) var/obj/item/organ/I = GET_INTERNAL_ORGAN(H, organ_tag) @@ -46,7 +46,7 @@ fail("[bodytype.name] internal organ has invalid absolute_max_damage value ([I.absolute_max_damage]).") . = 0 -/datum/unit_test/bodytype_organ_creation/proc/check_external_organs(var/mob/living/carbon/human/H, var/decl/bodytype/bodytype) +/datum/unit_test/bodytype_organ_creation/proc/check_external_organs(var/mob/living/human/H, var/decl/bodytype/bodytype) . = 1 for(var/organ_tag in bodytype.has_limbs) var/obj/item/organ/external/E = GET_EXTERNAL_ORGAN(H, organ_tag) @@ -71,7 +71,7 @@ fail("[bodytype.name] external organ has invalid absolute_max_damage value ([E.absolute_max_damage]).") . = 0 -/datum/unit_test/bodytype_organ_creation/proc/check_organ_parents(var/mob/living/carbon/human/H, var/decl/bodytype/bodytype) +/datum/unit_test/bodytype_organ_creation/proc/check_organ_parents(var/mob/living/human/H, var/decl/bodytype/bodytype) . = 1 var/list/external_organs = H.get_external_organs() for(var/obj/item/organ/external/E in external_organs) @@ -119,7 +119,7 @@ var/list/bodytype_pairings = get_bodytype_species_pairs() for(var/decl/bodytype/bodytype in bodytype_pairings) var/decl/species/species = bodytype_pairings[bodytype] - var/mob/living/carbon/human/test_subject = new(null, species.name, null, bodytype) + var/mob/living/human/test_subject = new(null, species.name, null, bodytype) var/fail = 0 fail |= !check_internal_organs(test_subject, bodytype) @@ -138,7 +138,7 @@ /datum/unit_test/bodytype_organ_lists_update name = "ORGAN: Species Mob Organ Lists Update when Organs are Removed and Replaced." -/datum/unit_test/bodytype_organ_lists_update/proc/check_internal_organ_present(var/mob/living/carbon/human/H, var/obj/item/organ/internal/I) +/datum/unit_test/bodytype_organ_lists_update/proc/check_internal_organ_present(var/mob/living/human/H, var/obj/item/organ/internal/I) var/decl/bodytype/root_bodytype = H.get_bodytype() if(!(I in H.get_internal_organs())) fail("[root_bodytype.name] internal organ [I] not in internal_organs.") @@ -156,7 +156,7 @@ return 0 return 1 -/datum/unit_test/bodytype_organ_lists_update/proc/check_internal_organ_removed(var/mob/living/carbon/human/H, var/obj/item/organ/internal/I, var/obj/item/organ/external/old_parent) +/datum/unit_test/bodytype_organ_lists_update/proc/check_internal_organ_removed(var/mob/living/human/H, var/obj/item/organ/internal/I, var/obj/item/organ/external/old_parent) var/decl/bodytype/root_bodytype = H.get_bodytype() if(I in H.get_internal_organs()) fail("[root_bodytype.name] internal organ [I] was not removed from internal_organs.") @@ -170,7 +170,7 @@ return 0 return 1 -/datum/unit_test/bodytype_organ_lists_update/proc/check_external_organ_present(var/mob/living/carbon/human/H, var/obj/item/organ/external/E) +/datum/unit_test/bodytype_organ_lists_update/proc/check_external_organ_present(var/mob/living/human/H, var/obj/item/organ/external/E) var/decl/bodytype/root_bodytype = H.get_bodytype() if(!(E in H.get_external_organs())) fail("[root_bodytype.name] external organ [E] not in organs.") @@ -192,7 +192,7 @@ return 0 return 1 -/datum/unit_test/bodytype_organ_lists_update/proc/check_external_organ_removed(var/mob/living/carbon/human/H, var/obj/item/organ/external/E, var/obj/item/organ/external/old_parent = null) +/datum/unit_test/bodytype_organ_lists_update/proc/check_external_organ_removed(var/mob/living/human/H, var/obj/item/organ/external/E, var/obj/item/organ/external/old_parent = null) var/decl/bodytype/root_bodytype = H.get_bodytype() if(E in H.get_external_organs()) fail("[root_bodytype.name] external organ [E] was not removed from organs.") @@ -207,7 +207,7 @@ return 0 return 1 -/datum/unit_test/bodytype_organ_lists_update/proc/test_internal_organ(var/mob/living/carbon/human/H, var/obj/item/organ/internal/I) +/datum/unit_test/bodytype_organ_lists_update/proc/test_internal_organ(var/mob/living/human/H, var/obj/item/organ/internal/I) var/decl/bodytype/root_bodytype = H.get_bodytype() if(!check_internal_organ_present(H, I)) fail("[root_bodytype.name] internal organ [I] failed initial presence check.") @@ -227,7 +227,7 @@ return 1 -/datum/unit_test/bodytype_organ_lists_update/proc/test_external_organ(var/mob/living/carbon/human/H, var/obj/item/organ/external/E) +/datum/unit_test/bodytype_organ_lists_update/proc/test_external_organ(var/mob/living/human/H, var/obj/item/organ/external/E) var/decl/bodytype/root_bodytype = H.get_bodytype() if(!check_external_organ_present(H, E)) fail("[root_bodytype.name] external organ [E] failed initial presence check.") @@ -252,7 +252,7 @@ var/list/bodytype_pairings = get_bodytype_species_pairs() for(var/decl/bodytype/bodytype in bodytype_pairings) var/decl/species/species = bodytype_pairings[bodytype] - var/mob/living/carbon/human/test_subject = new(null, species.name, null, bodytype) + var/mob/living/human/test_subject = new(null, species.name, null, bodytype) for(var/O in test_subject.get_internal_organs()) if(!test_internal_organ(test_subject, O)) diff --git a/maps/antag_spawn/wizard/wizard_base.dmm b/maps/antag_spawn/wizard/wizard_base.dmm index ca945bc5140..3c501d4b785 100644 --- a/maps/antag_spawn/wizard/wizard_base.dmm +++ b/maps/antag_spawn/wizard/wizard_base.dmm @@ -80,7 +80,7 @@ /turf/floor/carpet, /area/map_template/wizard_station) "ap" = ( -/mob/living/carbon/human/monkey{ +/mob/living/human/monkey{ name = "Murphey" }, /turf/unsimulated/floor{ diff --git a/maps/away/bearcat/bearcat.dm b/maps/away/bearcat/bearcat.dm index b44e9442bca..d959bc2f1d7 100644 --- a/maps/away/bearcat/bearcat.dm +++ b/maps/away/bearcat/bearcat.dm @@ -125,7 +125,7 @@ shoes = /obj/item/clothing/shoes/color/black r_pocket = /obj/item/radio -/decl/hierarchy/outfit/deadcap/post_equip(mob/living/carbon/human/H) +/decl/hierarchy/outfit/deadcap/post_equip(mob/living/human/H) ..() var/obj/item/clothing/uniform = H.get_equipped_item(slot_w_uniform_str) if(uniform) diff --git a/maps/away/bearcat/bearcat_jobs.dm b/maps/away/bearcat/bearcat_jobs.dm index 2dc2800e4c7..56b92e64506 100644 --- a/maps/away/bearcat/bearcat_jobs.dm +++ b/maps/away/bearcat/bearcat_jobs.dm @@ -35,7 +35,7 @@ pda_type = /obj/item/modular_computer/pda/heads/captain id_type = /obj/item/card/id/bearcat_captain -/decl/hierarchy/outfit/job/bearcat/captain/post_equip(var/mob/living/carbon/human/H) +/decl/hierarchy/outfit/job/bearcat/captain/post_equip(var/mob/living/human/H) ..() var/obj/item/clothing/uniform = H.get_equipped_item(slot_w_uniform_str) if(uniform) diff --git a/maps/away/liberia/liberia_jobs.dm b/maps/away/liberia/liberia_jobs.dm index 86cbc97c1b0..8bc4034c702 100644 --- a/maps/away/liberia/liberia_jobs.dm +++ b/maps/away/liberia/liberia_jobs.dm @@ -24,7 +24,7 @@ SKILL_PILOT = SKILL_BASIC ) -/datum/job/submap/merchant/equip_job(var/mob/living/carbon/human/H, var/alt_title, var/datum/mil_branch/branch, var/datum/mil_rank/grade) +/datum/job/submap/merchant/equip_job(var/mob/living/human/H, var/alt_title, var/datum/mil_branch/branch, var/datum/mil_rank/grade) to_chat(H, "Your connections helped you learn about the words that will help you identify a locals... Particularly interested buyers:") to_chat(H, "Code phases: [syndicate_code_phrase]") to_chat(H, "Responses to phrases: [syndicate_code_response]") diff --git a/maps/away/unishi/unishi-2.dmm b/maps/away/unishi/unishi-2.dmm index e691b77fe1c..1860db0f1e4 100644 --- a/maps/away/unishi/unishi-2.dmm +++ b/maps/away/unishi/unishi-2.dmm @@ -1537,9 +1537,9 @@ "es" = ( /mob/living/slime, /mob/living/slime, -/mob/living/carbon/human/monkey, -/mob/living/carbon/human/monkey, -/mob/living/carbon/human/monkey, +/mob/living/human/monkey, +/mob/living/human/monkey, +/mob/living/human/monkey, /turf/floor/reinforced, /area/unishi/xenobio) "et" = ( @@ -1547,8 +1547,8 @@ dir = 4 }, /mob/living/slime, -/mob/living/carbon/human/monkey, -/mob/living/carbon/human/monkey, +/mob/living/human/monkey, +/mob/living/human/monkey, /turf/floor/reinforced, /area/unishi/xenobio) "eu" = ( @@ -1608,16 +1608,16 @@ /area/unishi/hydro) "eB" = ( /mob/living/slime, -/mob/living/carbon/human/monkey, -/mob/living/carbon/human/monkey, +/mob/living/human/monkey, +/mob/living/human/monkey, /turf/floor/reinforced, /area/unishi/xenobio) "eC" = ( /obj/structure/window/borosilicate_reinforced{ dir = 4 }, -/mob/living/carbon/human/monkey, -/mob/living/carbon/human/monkey, +/mob/living/human/monkey, +/mob/living/human/monkey, /turf/floor/reinforced, /area/unishi/xenobio) "eD" = ( diff --git a/maps/exodus/exodus-2.dmm b/maps/exodus/exodus-2.dmm index 11d6d1d0973..6e156d985a6 100644 --- a/maps/exodus/exodus-2.dmm +++ b/maps/exodus/exodus-2.dmm @@ -19891,7 +19891,7 @@ /obj/structure/cable/green{ icon_state = "4-8" }, -/mob/living/carbon/human/monkey/punpun, +/mob/living/human/monkey/punpun, /turf/floor/lino, /area/exodus/crew_quarters/bar) "aPK" = ( diff --git a/maps/exodus/jobs/captain.dm b/maps/exodus/jobs/captain.dm index fd73838809b..17f8c7e58bc 100644 --- a/maps/exodus/jobs/captain.dm +++ b/maps/exodus/jobs/captain.dm @@ -33,7 +33,7 @@ /datum/computer_file/program/reports ) -/datum/job/captain/equip_job(var/mob/living/carbon/human/H) +/datum/job/captain/equip_job(var/mob/living/human/H) . = ..() if(.) H.implant_loyalty(src) diff --git a/maps/exodus/jobs/civilian.dm b/maps/exodus/jobs/civilian.dm index 6919061c901..803a281a7d9 100644 --- a/maps/exodus/jobs/civilian.dm +++ b/maps/exodus/jobs/civilian.dm @@ -303,7 +303,7 @@ skill_points = 20 software_on_spawn = list(/datum/computer_file/program/reports) -/datum/job/lawyer/equip_job(var/mob/living/carbon/human/H) +/datum/job/lawyer/equip_job(var/mob/living/human/H) . = ..() if(.) H.implant_loyalty(H) diff --git a/maps/exodus/jobs/medical.dm b/maps/exodus/jobs/medical.dm index fac05edfb07..b5b1853523f 100644 --- a/maps/exodus/jobs/medical.dm +++ b/maps/exodus/jobs/medical.dm @@ -200,7 +200,7 @@ ) give_psionic_implant_on_join = FALSE -/datum/job/counselor/equip_job(var/mob/living/carbon/human/H) +/datum/job/counselor/equip_job(var/mob/living/human/H) if(H.mind.role_alt_title == "Counselor") psi_faculties = list("[PSI_REDACTION]" = PSI_RANK_OPERANT) if(H.mind.role_alt_title == "Mentalist") diff --git a/maps/exodus/jobs/security.dm b/maps/exodus/jobs/security.dm index b021a08e601..19bd3667d83 100644 --- a/maps/exodus/jobs/security.dm +++ b/maps/exodus/jobs/security.dm @@ -85,7 +85,7 @@ ) event_categories = list(ASSIGNMENT_SECURITY) -/datum/job/hos/equip_job(var/mob/living/carbon/human/H) +/datum/job/hos/equip_job(var/mob/living/human/H) . = ..() if(.) H.implant_loyalty(H) diff --git a/maps/exodus/jobs/synthetics.dm b/maps/exodus/jobs/synthetics.dm index 1cac23c65ae..10537a76afc 100644 --- a/maps/exodus/jobs/synthetics.dm +++ b/maps/exodus/jobs/synthetics.dm @@ -19,13 +19,13 @@ skip_loadout_preview = TRUE department_types = list(/decl/department/miscellaneous) -/datum/job/computer/equip_job(var/mob/living/carbon/human/H) +/datum/job/computer/equip_job(var/mob/living/human/H) return !!H /datum/job/computer/is_position_available() return (empty_playable_ai_cores.len != 0) -/datum/job/computer/handle_variant_join(var/mob/living/carbon/human/H, var/alt_title) +/datum/job/computer/handle_variant_join(var/mob/living/human/H, var/alt_title) return H /datum/job/computer/do_spawn_special(var/mob/living/character, var/mob/new_player/new_player_mob, var/latejoin) @@ -66,11 +66,11 @@ skip_loadout_preview = TRUE department_types = list(/decl/department/miscellaneous) -/datum/job/robot/handle_variant_join(var/mob/living/carbon/human/H, var/alt_title) +/datum/job/robot/handle_variant_join(var/mob/living/human/H, var/alt_title) if(H) return H.Robotize(SSrobots.get_mob_type_by_title(alt_title || title)) -/datum/job/robot/equip_job(var/mob/living/carbon/human/H) +/datum/job/robot/equip_job(var/mob/living/human/H) return !!H /datum/job/robot/New() diff --git a/maps/exodus/outfits/command.dm b/maps/exodus/outfits/command.dm index 20bf97a5172..9ef27067bc2 100644 --- a/maps/exodus/outfits/command.dm +++ b/maps/exodus/outfits/command.dm @@ -15,7 +15,7 @@ backpack_overrides[/decl/backpack_outfit/satchel] = /obj/item/backpack/satchel/cap backpack_overrides[/decl/backpack_outfit/messenger_bag] = /obj/item/backpack/messenger/com -/decl/hierarchy/outfit/job/captain/post_equip(var/mob/living/carbon/human/H) +/decl/hierarchy/outfit/job/captain/post_equip(var/mob/living/human/H) ..() if(H.get_age() > 49) // Since we can have something other than the default uniform at this diff --git a/maps/ministation/jobs/command.dm b/maps/ministation/jobs/command.dm index 9f2ceeaddc6..11cfa3723db 100644 --- a/maps/ministation/jobs/command.dm +++ b/maps/ministation/jobs/command.dm @@ -29,7 +29,7 @@ must_fill = 1 not_random_selectable = 1 -/datum/job/ministation/captain/equip_job(var/mob/living/carbon/human/H, var/alt_title, var/datum/mil_branch/branch, var/datum/mil_rank/grade) +/datum/job/ministation/captain/equip_job(var/mob/living/human/H, var/alt_title, var/datum/mil_branch/branch, var/datum/mil_rank/grade) . = ..() if(H) H.verbs |= /mob/proc/freetradeunion_rename_company diff --git a/maps/ministation/jobs/synthetics.dm b/maps/ministation/jobs/synthetics.dm index 2fd718dc15e..3d3939cbcb6 100644 --- a/maps/ministation/jobs/synthetics.dm +++ b/maps/ministation/jobs/synthetics.dm @@ -18,11 +18,11 @@ skip_loadout_preview = TRUE department_types = list(/decl/department/miscellaneous) -/datum/job/ministation/robot/handle_variant_join(var/mob/living/carbon/human/H, var/alt_title) +/datum/job/ministation/robot/handle_variant_join(var/mob/living/human/H, var/alt_title) if(H) return H.Robotize(SSrobots.get_mob_type_by_title(alt_title || title)) -/datum/job/ministation/robot/equip_job(var/mob/living/carbon/human/H, var/alt_title, var/datum/mil_branch/branch, var/datum/mil_rank/grade) +/datum/job/ministation/robot/equip_job(var/mob/living/human/H, var/alt_title, var/datum/mil_branch/branch, var/datum/mil_rank/grade) return !!H /datum/job/ministation/robot/New() @@ -51,13 +51,13 @@ skip_loadout_preview = TRUE department_types = list(/decl/department/miscellaneous) -/datum/job/computer/equip_job(var/mob/living/carbon/human/H, var/alt_title, var/datum/mil_branch/branch, var/datum/mil_rank/grade) +/datum/job/computer/equip_job(var/mob/living/human/H, var/alt_title, var/datum/mil_branch/branch, var/datum/mil_rank/grade) return !!H /datum/job/computer/is_position_available() return (empty_playable_ai_cores.len != 0) -/datum/job/computer/handle_variant_join(var/mob/living/carbon/human/H, var/alt_title) +/datum/job/computer/handle_variant_join(var/mob/living/human/H, var/alt_title) return H /datum/job/computer/do_spawn_special(var/mob/living/character, var/mob/new_player/new_player_mob, var/latejoin) diff --git a/maps/ministation/ministation_areas.dm b/maps/ministation/ministation_areas.dm index 59b9cc53c6c..5046e0c921c 100644 --- a/maps/ministation/ministation_areas.dm +++ b/maps/ministation/ministation_areas.dm @@ -328,7 +328,7 @@ arrival_sound = null lift_announce_str = null -/area/turbolift/alert_on_fall(var/mob/living/carbon/human/H) +/area/turbolift/alert_on_fall(var/mob/living/human/H) if(H.client && SSpersistence.elevator_fall_shifts > 0) SSwebhooks.send(WEBHOOK_ELEVATOR_FALL, list("text" = "We managed to make it [SSpersistence.elevator_fall_shifts] shift\s without someone falling down an elevator shaft.")) SSpersistence.elevator_fall_shifts = -1 diff --git a/maps/ministation/outfits/command.dm b/maps/ministation/outfits/command.dm index 9b6772b08e9..f118e3774ab 100644 --- a/maps/ministation/outfits/command.dm +++ b/maps/ministation/outfits/command.dm @@ -14,7 +14,7 @@ backpack_overrides[/decl/backpack_outfit/satchel] = /obj/item/backpack/satchel/cap backpack_overrides[/decl/backpack_outfit/messenger_bag] = /obj/item/backpack/messenger/com -/decl/hierarchy/outfit/job/ministation/captain/post_equip(var/mob/living/carbon/human/H) +/decl/hierarchy/outfit/job/ministation/captain/post_equip(var/mob/living/human/H) ..() if(H.get_age() > 20) // Since we can have something other than the default uniform at this diff --git a/maps/random_ruins/exoplanet_ruins/monoliths/monoliths.dm b/maps/random_ruins/exoplanet_ruins/monoliths/monoliths.dm index c6a632cd279..77f027c0bab 100644 --- a/maps/random_ruins/exoplanet_ruins/monoliths/monoliths.dm +++ b/maps/random_ruins/exoplanet_ruins/monoliths/monoliths.dm @@ -58,7 +58,7 @@ to_chat(user, SPAN_NOTICE("\The [src] is still.")) return TRUE - var/mob/living/carbon/human/H = user + var/mob/living/human/H = user if(H.isSynthetic()) to_chat(user, SPAN_NOTICE("\The [src] is still.")) return TRUE diff --git a/maps/tradeship/jobs/command.dm b/maps/tradeship/jobs/command.dm index 3cb07038328..7b9a6fa654a 100644 --- a/maps/tradeship/jobs/command.dm +++ b/maps/tradeship/jobs/command.dm @@ -29,7 +29,7 @@ not_random_selectable = 1 forced_spawnpoint = /decl/spawnpoint/cryo/captain -/datum/job/tradeship_captain/equip_job(var/mob/living/carbon/human/H, var/alt_title, var/datum/mil_branch/branch, var/datum/mil_rank/grade) +/datum/job/tradeship_captain/equip_job(var/mob/living/human/H, var/alt_title, var/datum/mil_branch/branch, var/datum/mil_rank/grade) . = ..() if(H) H.verbs |= /mob/proc/tradehouse_rename_ship diff --git a/maps/tradeship/jobs/synthetics.dm b/maps/tradeship/jobs/synthetics.dm index 9e0664ea8f0..b2d9ce91265 100644 --- a/maps/tradeship/jobs/synthetics.dm +++ b/maps/tradeship/jobs/synthetics.dm @@ -18,11 +18,11 @@ skip_loadout_preview = TRUE department_types = list(/decl/department/miscellaneous) -/datum/job/tradeship_robot/handle_variant_join(var/mob/living/carbon/human/H, var/alt_title) +/datum/job/tradeship_robot/handle_variant_join(var/mob/living/human/H, var/alt_title) if(H) return H.Robotize(SSrobots.get_mob_type_by_title(alt_title || title)) -/datum/job/tradeship_robot/equip_job(var/mob/living/carbon/human/H, var/alt_title, var/datum/mil_branch/branch, var/datum/mil_rank/grade) +/datum/job/tradeship_robot/equip_job(var/mob/living/human/H, var/alt_title, var/datum/mil_branch/branch, var/datum/mil_rank/grade) return !!H /datum/job/tradeship_robot/New() diff --git a/maps/tradeship/outfits/_outfits.dm b/maps/tradeship/outfits/_outfits.dm index 4456ac6a1f7..b5064d2f43e 100644 --- a/maps/tradeship/outfits/_outfits.dm +++ b/maps/tradeship/outfits/_outfits.dm @@ -9,7 +9,7 @@ /decl/hierarchy/outfit/job/tradeship/hand name = "Tradeship - Job - Deck Hand" -/decl/hierarchy/outfit/job/tradeship/hand/pre_equip(mob/living/carbon/human/H) +/decl/hierarchy/outfit/job/tradeship/hand/pre_equip(mob/living/human/H) ..() uniform = pick(list( /obj/item/clothing/pants/mustard/overalls, diff --git a/maps/tradeship/outfits/command.dm b/maps/tradeship/outfits/command.dm index f7063c00485..5a3274d5f42 100644 --- a/maps/tradeship/outfits/command.dm +++ b/maps/tradeship/outfits/command.dm @@ -7,7 +7,7 @@ id_type = /obj/item/card/id/gold l_ear = /obj/item/radio/headset/heads/captain -/decl/hierarchy/outfit/job/tradeship/captain/post_equip(var/mob/living/carbon/human/H) +/decl/hierarchy/outfit/job/tradeship/captain/post_equip(var/mob/living/human/H) ..() var/obj/item/clothing/uniform = H.get_equipped_item(slot_w_uniform_str) if(uniform) diff --git a/maps/tradeship/tradeship_areas.dm b/maps/tradeship/tradeship_areas.dm index 3de5f7af9ab..6884791c749 100644 --- a/maps/tradeship/tradeship_areas.dm +++ b/maps/tradeship/tradeship_areas.dm @@ -307,7 +307,7 @@ arrival_sound = null lift_announce_str = null -/area/turbolift/alert_on_fall(var/mob/living/carbon/human/H) +/area/turbolift/alert_on_fall(var/mob/living/human/H) if(H.client && SSpersistence.elevator_fall_shifts > 0) SSwebhooks.send(WEBHOOK_ELEVATOR_FALL, list("text" = "We managed to make it [SSpersistence.elevator_fall_shifts] shift\s without someone falling down an elevator shaft.")) SSpersistence.elevator_fall_shifts = -1 diff --git a/maps/~mapsystem/maps.dm b/maps/~mapsystem/maps.dm index 767da60083e..36cf1f1b1e1 100644 --- a/maps/~mapsystem/maps.dm +++ b/maps/~mapsystem/maps.dm @@ -478,7 +478,7 @@ var/global/const/MAP_HAS_RANK = 2 //Rank system, also togglable else to_chat(player, SPAN_BAD("You did not survive the events on [station_name()]...")) -/datum/map/proc/create_passport(var/mob/living/carbon/human/H) +/datum/map/proc/create_passport(var/mob/living/human/H) if(!passport_type) return var/obj/item/passport/pass = new passport_type(get_turf(H)) diff --git a/maps/~mapsystem/maps_currency.dm b/maps/~mapsystem/maps_currency.dm index fe90b12a880..f3169147c27 100644 --- a/maps/~mapsystem/maps_currency.dm +++ b/maps/~mapsystem/maps_currency.dm @@ -7,14 +7,14 @@ var/name = "all in bank account" var/transfer_mult = 1 -/decl/starting_cash_choice/proc/get_cash_objects(var/mob/living/carbon/human/owner, var/datum/money_account/owner_account) +/decl/starting_cash_choice/proc/get_cash_objects(var/mob/living/human/owner, var/datum/money_account/owner_account) return /decl/starting_cash_choice/credstick name = "all on charge stick" uid = "starting_cash_stick" -/decl/starting_cash_choice/credstick/get_cash_objects(var/mob/living/carbon/human/owner, var/datum/money_account/owner_account) +/decl/starting_cash_choice/credstick/get_cash_objects(var/mob/living/human/owner, var/datum/money_account/owner_account) var/obj/item/charge_stick/credstick = new credstick.creator = owner.real_name credstick.currency = owner_account.currency @@ -31,7 +31,7 @@ name = "all in cash" uid = "starting_cash_cash" -/decl/starting_cash_choice/cash/get_cash_objects(var/mob/living/carbon/human/owner, var/datum/money_account/owner_account) +/decl/starting_cash_choice/cash/get_cash_objects(var/mob/living/human/owner, var/datum/money_account/owner_account) var/obj/item/cash/cash = new cash.set_currency(owner_account.currency) cash.adjust_worth(FLOOR(owner_account.money * transfer_mult)) @@ -48,7 +48,7 @@ transfer_mult = 0.5 uid = "starting_cash_cash_stick_split" -/decl/starting_cash_choice/split/get_cash_objects(var/mob/living/carbon/human/owner, var/datum/money_account/owner_account) +/decl/starting_cash_choice/split/get_cash_objects(var/mob/living/human/owner, var/datum/money_account/owner_account) . = list() var/obj/item/cash/cash = new cash.set_currency(owner_account.currency) diff --git a/mods/content/corporate/clothing/outfits.dm b/mods/content/corporate/clothing/outfits.dm index e542d8fafd0..9249d7817e1 100644 --- a/mods/content/corporate/clothing/outfits.dm +++ b/mods/content/corporate/clothing/outfits.dm @@ -46,7 +46,7 @@ /decl/hierarchy/outfit/death_command name = "Spec Ops - Death commando" -/decl/hierarchy/outfit/death_command/equip_outfit(mob/living/carbon/human/H, assignment, equip_adjustments, datum/job/job, datum/mil_rank/rank) +/decl/hierarchy/outfit/death_command/equip_outfit(mob/living/human/H, assignment, equip_adjustments, datum/job/job, datum/mil_rank/rank) var/decl/special_role/deathsquad = GET_DECL(/decl/special_role/deathsquad) deathsquad.equip_role(H) return 1 @@ -54,7 +54,7 @@ /decl/hierarchy/outfit/syndicate_command name = "Spec Ops - Syndicate commando" -/decl/hierarchy/outfit/syndicate_command/equip_outfit(mob/living/carbon/human/H, assignment, equip_adjustments, datum/job/job, datum/mil_rank/rank) +/decl/hierarchy/outfit/syndicate_command/equip_outfit(mob/living/human/H, assignment, equip_adjustments, datum/job/job, datum/mil_rank/rank) var/decl/special_role/commandos = GET_DECL(/decl/special_role/deathsquad/mercenary) commandos.equip_role(H) return 1 diff --git a/mods/content/corporate/datum/antagonists/deathsquad.dm b/mods/content/corporate/datum/antagonists/deathsquad.dm index e8ab40eec82..52f32595abb 100644 --- a/mods/content/corporate/datum/antagonists/deathsquad.dm +++ b/mods/content/corporate/datum/antagonists/deathsquad.dm @@ -46,7 +46,7 @@ l_pocket = /obj/item/pinpointer r_pocket = /obj/item/disk/nuclear -/decl/special_role/deathsquad/equip_role(var/mob/living/carbon/human/player) +/decl/special_role/deathsquad/equip_role(var/mob/living/human/player) if (player.mind == leader) default_outfit = /decl/hierarchy/outfit/commando/leader else @@ -74,7 +74,7 @@ player.current.real_name = player.name player.current.SetName(player.current.name) - var/mob/living/carbon/human/H = player.current + var/mob/living/human/H = player.current if(istype(H)) var/decl/pronouns/pronouns = pick(H.species.available_pronouns) H.set_gender(pronouns.name) diff --git a/mods/content/fantasy/datum/hnoll/species.dm b/mods/content/fantasy/datum/hnoll/species.dm index ea9f5280d58..60218e40fbe 100644 --- a/mods/content/fantasy/datum/hnoll/species.dm +++ b/mods/content/fantasy/datum/hnoll/species.dm @@ -75,5 +75,5 @@ /decl/emote/visible/tail/stopsway ) -/decl/species/hnoll/handle_additional_hair_loss(var/mob/living/carbon/human/H, var/defer_body_update = TRUE) +/decl/species/hnoll/handle_additional_hair_loss(var/mob/living/human/H, var/defer_body_update = TRUE) . = H?.set_skin_colour(rgb(189, 171, 143)) diff --git a/mods/content/matchmaking/matchmaker.dm b/mods/content/matchmaking/matchmaker.dm index 9509e7ccff1..75327f3f35c 100644 --- a/mods/content/matchmaking/matchmaker.dm +++ b/mods/content/matchmaking/matchmaker.dm @@ -151,10 +151,10 @@ var/global/datum/matchmaker/matchmaker = new() if(other && other.finalized) to_chat(holder.current,"Your connection with [other.holder] is now confirmed!") to_chat(other.holder.current,"Your connection with [holder] is now confirmed!") - var/list/candidates = filter_list(global.player_list, /mob/living/carbon/human) + var/list/candidates = filter_list(global.player_list, /mob/living/human) candidates -= holder.current candidates -= other.holder.current - for(var/mob/living/carbon/human/M in candidates) + for(var/mob/living/human/M in candidates) if(!M.mind || M.stat == DEAD || !valid_candidate(M.mind)) candidates -= M continue diff --git a/mods/content/matchmaking/relations_types.dm b/mods/content/matchmaking/relations_types.dm index 7a6f7bf6be4..f9a076402e0 100644 --- a/mods/content/matchmaking/relations_types.dm +++ b/mods/content/matchmaking/relations_types.dm @@ -15,11 +15,11 @@ /datum/relation/kid_friend/get_candidates() var/list/creche = ..() - var/mob/living/carbon/human/holdermob = holder.current + var/mob/living/human/holdermob = holder.current if(istype(holdermob)) for(var/datum/relation/kid in creche) - var/mob/living/carbon/human/kidmob = kid.holder.current + var/mob/living/human/kidmob = kid.holder.current if(!istype(kidmob)) continue if(abs(holdermob.get_age() - kidmob.get_age()) > 3) @@ -93,10 +93,10 @@ /datum/relation/spessnam/get_candidates() var/list/warbuds = ..() var/list/branchmates = list() - var/mob/living/carbon/human/holdermob = holder.current + var/mob/living/human/holdermob = holder.current if(istype(holdermob) && global.using_map && (global.using_map.flags & MAP_HAS_BRANCH)) for(var/datum/relation/buddy in warbuds) - var/mob/living/carbon/human/buddymob = buddy.holder.current + var/mob/living/human/buddymob = buddy.holder.current if(!istype(buddymob)) continue if(holdermob.char_branch == buddymob.char_branch) diff --git a/mods/content/pheromones/pheromone_effect.dm b/mods/content/pheromones/pheromone_effect.dm index a894ce433a1..46e03dc1d8a 100644 --- a/mods/content/pheromones/pheromone_effect.dm +++ b/mods/content/pheromones/pheromone_effect.dm @@ -34,7 +34,7 @@ if(!marker) return for(var/client/C) - var/mob/living/carbon/human/H = C.mob + var/mob/living/human/H = C.mob if(istype(H) && H.can_read_pheromones()) C.images -= marker var/datum/extension/scent/custom/pheromone/smell = get_extension(src, /datum/extension/scent) @@ -46,7 +46,7 @@ marker.filters = filter(type="drop_shadow", color = color + "F0", size = 2, offset = 1, x = 0, y = 0) global.pheromone_markers |= marker for(var/client/C) - var/mob/living/carbon/human/H = C.mob + var/mob/living/human/H = C.mob if(istype(H) && H.can_read_pheromones()) C.images |= marker diff --git a/mods/content/pheromones/pheromone_emotes.dm b/mods/content/pheromones/pheromone_emotes.dm index 5e79267a65e..86d16a40003 100644 --- a/mods/content/pheromones/pheromone_emotes.dm +++ b/mods/content/pheromones/pheromone_emotes.dm @@ -77,7 +77,7 @@ if(!T) return to_chat(user, SPAN_NOTICE("You emit the [self_smell_descriptor ? "[self_smell_descriptor] " : ""]scent of [smell_message].")) - for(var/mob/living/carbon/human/H in viewers(world.view, user)) + for(var/mob/living/human/H in viewers(world.view, user)) if(H != user && H.stat == CONSCIOUS && H.can_read_pheromones()) to_chat(H, SPAN_NOTICE("\The [user] emits the [self_smell_descriptor ? "[self_smell_descriptor] " : ""]scent of [smell_message].")) diff --git a/mods/content/psionics/_psionics.dm b/mods/content/psionics/_psionics.dm index 37937aecb23..48fa276085e 100644 --- a/mods/content/psionics/_psionics.dm +++ b/mods/content/psionics/_psionics.dm @@ -25,7 +25,7 @@ . += "Only available for living mobs, sorry." . = jointext(., null) -/datum/preferences/copy_to(mob/living/carbon/human/character, is_preview_copy = FALSE) +/datum/preferences/copy_to(mob/living/human/character, is_preview_copy = FALSE) character = ..() var/datum/ability_handler/psionics/psi = !is_preview_copy && istype(character) && character.get_ability_handler(/datum/ability_handler/psionics) if(psi) diff --git a/mods/content/psionics/datum/antagonists/foundation.dm b/mods/content/psionics/datum/antagonists/foundation.dm index 9e255a579a3..203595f01d5 100644 --- a/mods/content/psionics/datum/antagonists/foundation.dm +++ b/mods/content/psionics/datum/antagonists/foundation.dm @@ -25,7 +25,7 @@ default_outfit = /decl/hierarchy/outfit/foundation id_title = "Foundation Agent" -/decl/special_role/foundation/equip_role(var/mob/living/carbon/human/player) +/decl/special_role/foundation/equip_role(var/mob/living/human/player) . = ..() if(.) player.set_psi_rank(PSI_REDACTION, 3, defer_update = TRUE) diff --git a/mods/content/psionics/datum/antagonists/paramount.dm b/mods/content/psionics/datum/antagonists/paramount.dm index 59fc119b9f7..3010cc5e9b9 100644 --- a/mods/content/psionics/datum/antagonists/paramount.dm +++ b/mods/content/psionics/datum/antagonists/paramount.dm @@ -23,7 +23,7 @@ gloves = /obj/item/clothing/gloves/grey id_type = /obj/item/card/id/syndicate -/decl/special_role/paramount/equip_role(var/mob/living/carbon/human/player) +/decl/special_role/paramount/equip_role(var/mob/living/human/player) . = ..() if(.) player.set_psi_rank(PSI_REDACTION, 3, defer_update = TRUE) diff --git a/mods/content/psionics/datum/jobs.dm b/mods/content/psionics/datum/jobs.dm index 48f342be0fc..18b2adbf9c4 100644 --- a/mods/content/psionics/datum/jobs.dm +++ b/mods/content/psionics/datum/jobs.dm @@ -6,7 +6,7 @@ /datum/job/submap give_psionic_implant_on_join = FALSE -/datum/job/equip_job(var/mob/living/carbon/human/H, var/alt_title, var/datum/mil_branch/branch, var/datum/mil_rank/grade) +/datum/job/equip_job(var/mob/living/human/H, var/alt_title, var/datum/mil_branch/branch, var/datum/mil_rank/grade) . = ..() if(psi_latency_chance && prob(psi_latency_chance)) H.set_psi_rank(pick(PSI_COERCION, PSI_REDACTION, PSI_ENERGISTICS, PSI_PSYCHOKINESIS), 1, defer_update = TRUE) diff --git a/mods/content/psionics/items/cerebro_enhancers.dm b/mods/content/psionics/items/cerebro_enhancers.dm index 01c1bfc56d3..f58cc158b38 100644 --- a/mods/content/psionics/items/cerebro_enhancers.dm +++ b/mods/content/psionics/items/cerebro_enhancers.dm @@ -38,7 +38,7 @@ deintegrate() return - var/mob/living/carbon/human/H = loc + var/mob/living/human/H = loc if(istype(H) && H.get_equipped_item(slot_head_str) == src) integrate() return @@ -76,7 +76,7 @@ if(canremove) return - var/mob/living/carbon/human/H = loc + var/mob/living/human/H = loc if(!istype(H) || H.get_equipped_item(slot_head_str) != src) canremove = TRUE return @@ -107,7 +107,7 @@ var/lastloc = loc . = ..() if(.) - var/mob/living/carbon/human/H = lastloc + var/mob/living/human/H = lastloc if(istype(H)) var/datum/ability_handler/psionics/psi = H.get_ability_handler(/datum/ability_handler/psionics) psi?.reset() @@ -132,7 +132,7 @@ to_chat(usr, SPAN_NOTICE("You still have [max_boosted_faculties - LAZYLEN(boosted_faculties)] facult[LAZYLEN(boosted_faculties) == 1 ? "y" : "ies"] to select. Use \the [src] in-hand to select them.")) return - var/mob/living/carbon/human/H = loc + var/mob/living/human/H = loc if(!istype(H) || H.get_equipped_item(slot_head_str) != src) to_chat(usr, SPAN_WARNING("\The [src] must be worn on your head in order to be activated.")) return diff --git a/mods/content/psionics/system/psionics/complexus/complexus_helpers.dm b/mods/content/psionics/system/psionics/complexus/complexus_helpers.dm index cc6463ff670..bf810cba7f9 100644 --- a/mods/content/psionics/system/psionics/complexus/complexus_helpers.dm +++ b/mods/content/psionics/system/psionics/complexus/complexus_helpers.dm @@ -84,7 +84,7 @@ // Your head asplode. owner.take_damage(value, BRAIN) if(ishuman(owner)) - var/mob/living/carbon/human/pop = owner + var/mob/living/human/pop = owner if(pop.should_have_organ(BP_BRAIN)) var/obj/item/organ/internal/sponge = GET_INTERNAL_ORGAN(pop, BP_BRAIN) if(sponge && sponge.damage >= sponge.max_damage) diff --git a/mods/content/psionics/system/psionics/complexus/complexus_process.dm b/mods/content/psionics/system/psionics/complexus/complexus_process.dm index 17dc1291403..13c6b7492a9 100644 --- a/mods/content/psionics/system/psionics/complexus/complexus_process.dm +++ b/mods/content/psionics/system/psionics/complexus/complexus_process.dm @@ -168,7 +168,7 @@ if(ishuman(owner)) - var/mob/living/carbon/human/H = owner + var/mob/living/human/H = owner // Fix some pain. if(heal_rate > 0) diff --git a/mods/content/psionics/system/psionics/faculties/coercion.dm b/mods/content/psionics/system/psionics/faculties/coercion.dm index bc597cb3b7c..bd3f6de8da3 100644 --- a/mods/content/psionics/system/psionics/faculties/coercion.dm +++ b/mods/content/psionics/system/psionics/faculties/coercion.dm @@ -117,7 +117,7 @@ min_rank = PSI_RANK_MASTER use_description = "Target the arms or hands on disarm intent to use a ranged attack that may rip the weapons away from the target." -/decl/psionic_power/coercion/spasm/invoke(var/mob/living/user, var/mob/living/carbon/human/target) +/decl/psionic_power/coercion/spasm/invoke(var/mob/living/user, var/mob/living/human/target) if(!istype(target)) return FALSE diff --git a/mods/content/psionics/system/psionics/faculties/redaction.dm b/mods/content/psionics/system/psionics/faculties/redaction.dm index e427fd96945..97354f41a05 100644 --- a/mods/content/psionics/system/psionics/faculties/redaction.dm +++ b/mods/content/psionics/system/psionics/faculties/redaction.dm @@ -46,7 +46,7 @@ min_rank = PSI_RANK_OPERANT use_description = "Target a patient while on help intent at melee range to mend a variety of maladies, such as bleeding or broken bones. Higher ranks in this faculty allow you to mend a wider range of problems." -/decl/psionic_power/redaction/mend/invoke(var/mob/living/user, var/mob/living/carbon/human/target) +/decl/psionic_power/redaction/mend/invoke(var/mob/living/user, var/mob/living/human/target) if(!istype(user) || !istype(target)) return FALSE . = ..() @@ -129,7 +129,7 @@ min_rank = PSI_RANK_GRANDMASTER use_description = "Target a patient while on help intent at melee range to cleanse radiation and genetic damage from a patient." -/decl/psionic_power/redaction/cleanse/invoke(var/mob/living/user, var/mob/living/carbon/human/target) +/decl/psionic_power/redaction/cleanse/invoke(var/mob/living/user, var/mob/living/human/target) if(!istype(user) || !istype(target)) return FALSE . = ..() diff --git a/mods/content/psionics/system/psionics/mob/mob.dm b/mods/content/psionics/system/psionics/mob/mob.dm index 47a2f987dee..e51d5aeedae 100644 --- a/mods/content/psionics/system/psionics/mob/mob.dm +++ b/mods/content/psionics/system/psionics/mob/mob.dm @@ -29,7 +29,7 @@ return TRUE return FALSE -/mob/living/carbon/human/check_shields(var/damage = 0, var/atom/damage_source = null, var/mob/attacker = null, var/def_zone = null, var/attack_text = "the attack") +/mob/living/human/check_shields(var/damage = 0, var/atom/damage_source = null, var/mob/attacker = null, var/def_zone = null, var/attack_text = "the attack") var/obj/item/projectile/P = damage_source var/datum/ability_handler/psionics/psi = get_ability_handler(/datum/ability_handler/psionics) if(istype(P) && !P.disrupts_psionics() && psi && P.starting && prob(psi.get_armour(SSmaterials.get_armor_key(P.atom_damage_type, P.damage_flags())) * 0.5) && psi.spend_power(round(damage/10))) diff --git a/mods/content/shackles/laws_pref.dm b/mods/content/shackles/laws_pref.dm index 77c3b8baffa..84514909053 100644 --- a/mods/content/shackles/laws_pref.dm +++ b/mods/content/shackles/laws_pref.dm @@ -102,7 +102,7 @@ . = ..() if(!ishuman(.)) return - var/mob/living/carbon/human/new_character = . + var/mob/living/human/new_character = . if(new_character.client?.prefs?.is_shackled && new_character.get_bodytype().can_be_shackled && new_character.mind) new_character.mind.set_shackle(new_character.client.prefs.get_lawset(), TRUE) // Silent as laws will be announced on Login() anyway. diff --git a/mods/content/xenobiology/colours/colour_silver.dm b/mods/content/xenobiology/colours/colour_silver.dm index cfc1fb8cb71..8399b9debd4 100644 --- a/mods/content/xenobiology/colours/colour_silver.dm +++ b/mods/content/xenobiology/colours/colour_silver.dm @@ -16,7 +16,7 @@ var/location = get_turf(holder.get_reaction_loc()) if(location) playsound(location, 'sound/effects/phasein.ogg', 100, 1) - for(var/mob/living/carbon/human/M in viewers(location, null)) + for(var/mob/living/human/M in viewers(location, null)) if(M.eyecheck() < FLASH_PROTECTION_MODERATE) M.flash_eyes() for(var/i = 1, i <= 4 + rand(1,2), i++) diff --git a/mods/content/xenobiology/mobs/slime_feeding_helpers.dm b/mods/content/xenobiology/mobs/slime_feeding_helpers.dm index 365e5df78dd..bebb1ed1669 100644 --- a/mods/content/xenobiology/mobs/slime_feeding_helpers.dm +++ b/mods/content/xenobiology/mobs/slime_feeding_helpers.dm @@ -23,7 +23,7 @@ var/global/list/slime_pain_messages = list( qdel(src) . = rand(2,3) -/mob/living/carbon/human/eaten_by_slime() +/mob/living/human/eaten_by_slime() var/list/limbs = get_external_organs() if(LAZYLEN(limbs) > 1) var/obj/item/organ/external/E = pick(limbs) @@ -53,7 +53,7 @@ var/global/list/slime_pain_messages = list( if(can_feel_pain()) to_chat(src, SPAN_DANGER(pick(global.slime_pain_messages))) -/mob/living/carbon/human/handle_additional_slime_effects() +/mob/living/human/handle_additional_slime_effects() custom_pain(pick(global.slime_pain_messages),100) // Called by a feeding slime on the victim. diff --git a/mods/content/xenobiology/overrides.dm b/mods/content/xenobiology/overrides.dm index 5ab370b3c58..a5c39ef2743 100644 --- a/mods/content/xenobiology/overrides.dm +++ b/mods/content/xenobiology/overrides.dm @@ -39,7 +39,7 @@ . = ..() can_hold |= /obj/item/slime_extract -/mob/living/carbon/human/say_understands(var/mob/other,var/decl/language/speaking = null) +/mob/living/human/say_understands(var/mob/other,var/decl/language/speaking = null) . = (!speaking && isslime(other)) || ..() /mob/living/brain/say_understands(var/mob/other,var/decl/language/speaking = null) diff --git a/mods/content/xenobiology/slime/feeding.dm b/mods/content/xenobiology/slime/feeding.dm index 1099bf3b84e..0a208e3c5a6 100644 --- a/mods/content/xenobiology/slime/feeding.dm +++ b/mods/content/xenobiology/slime/feeding.dm @@ -22,7 +22,7 @@ to_chat(src, SPAN_WARNING("\The [M] is protected from your feeding.")) return FEED_RESULT_INVALID if(ishuman(M)) - var/mob/living/carbon/human/H = M + var/mob/living/human/H = M if((H.species.species_flags & SPECIES_FLAG_NO_POISON) || (H.get_bodytype()?.body_flags & BODY_FLAG_NO_DNA)) if(!silent) to_chat(src, SPAN_WARNING("You cannot feed on \the [M].")) diff --git a/mods/content/xenobiology/slime/items.dm b/mods/content/xenobiology/slime/items.dm index 2646db9ac21..e2a4b4c3774 100644 --- a/mods/content/xenobiology/slime/items.dm +++ b/mods/content/xenobiology/slime/items.dm @@ -99,7 +99,7 @@ return TRUE visible_message(SPAN_WARNING("A craggy humanoid figure coalesces into being!")) - var/mob/living/carbon/human/G = new(src.loc) + var/mob/living/human/G = new(src.loc) G.set_species(SPECIES_GOLEM) G.key = ghost.key diff --git a/mods/gamemodes/deity/extensions/deity_be_near.dm b/mods/gamemodes/deity/extensions/deity_be_near.dm index d7494667b50..5eed3ae1fe4 100644 --- a/mods/gamemodes/deity/extensions/deity_be_near.dm +++ b/mods/gamemodes/deity/extensions/deity_be_near.dm @@ -50,7 +50,7 @@ if(!ishuman(I.loc)) return FALSE - var/mob/living/carbon/human/H = I.loc + var/mob/living/human/H = I.loc if(H.get_equipped_slot_for_item(I) != slot_wear_suit_str) return FALSE if(expected_helmet && !istype(H.get_equipped_item(slot_head_str), expected_helmet)) diff --git a/mods/gamemodes/deity/forms/narsie/items.dm b/mods/gamemodes/deity/forms/narsie/items.dm index 121a142efcd..57d1b807a67 100644 --- a/mods/gamemodes/deity/forms/narsie/items.dm +++ b/mods/gamemodes/deity/forms/narsie/items.dm @@ -17,7 +17,7 @@ if(L.mind) multiplier++ if(ishuman(L)) - var/mob/living/carbon/human/H = L + var/mob/living/human/H = L if(H.should_have_organ(BP_HEART)) multiplier++ if(L.stat == DEAD) diff --git a/mods/gamemodes/deity/forms/narsie/narsie.dm b/mods/gamemodes/deity/forms/narsie/narsie.dm index 8dc0fbbb0f8..12694187967 100644 --- a/mods/gamemodes/deity/forms/narsie/narsie.dm +++ b/mods/gamemodes/deity/forms/narsie/narsie.dm @@ -41,7 +41,7 @@ charge = min(100, charge * 0.25) if(prob(charge)) to_chat(user, SPAN_WARNING("You feel drained...")) - var/mob/living/carbon/human/H = user + var/mob/living/human/H = user if(istype(H) && H.should_have_organ(BP_HEART)) H.vessel.remove_any(charge) else diff --git a/mods/gamemodes/deity/forms/narsie/structures.dm b/mods/gamemodes/deity/forms/narsie/structures.dm index 1f8dea6259e..2f14ef5d237 100644 --- a/mods/gamemodes/deity/forms/narsie/structures.dm +++ b/mods/gamemodes/deity/forms/narsie/structures.dm @@ -83,7 +83,7 @@ /obj/structure/deity/blood_stone/attack_hand(var/mob/user) if(!linked_god || !linked_god.is_follower(user, silent = 1) || !ishuman(user)) return ..() - var/mob/living/carbon/human/H = user + var/mob/living/human/H = user user.visible_message(SPAN_WARNING("\The [user] calmly slices their finger on \the [src], smeering it over the black stone."),SPAN_WARNING("You slowly slide your finger down one of \the [src]'s sharp edges, smeering it over its smooth surface.")) while(do_after(H,50,src)) user.audible_message("\The [user] utters something under their breath.", SPAN_OCCULT("You mutter a dark prayer to your master as you feel the stone eat away at your lifeforce.")) diff --git a/mods/gamemodes/deity/forms/starlight/spells/veil_of_shadows.dm b/mods/gamemodes/deity/forms/starlight/spells/veil_of_shadows.dm index a103f71a8fb..e47edecd082 100644 --- a/mods/gamemodes/deity/forms/starlight/spells/veil_of_shadows.dm +++ b/mods/gamemodes/deity/forms/starlight/spells/veil_of_shadows.dm @@ -18,7 +18,7 @@ . = null /spell/veil_of_shadows/cast(var/list/targets, var/mob/user) - var/mob/living/carbon/human/H = user + var/mob/living/human/H = user H.AddMovementHandler(/datum/movement_handler/mob/incorporeal) if(H.add_cloaking_source(src)) H.visible_message(SPAN_WARNING("\The [H] shrinks from view!")) @@ -26,7 +26,7 @@ timer_id = addtimer(CALLBACK(src,PROC_REF(cancel_veil)),duration, TIMER_STOPPABLE) /spell/veil_of_shadows/proc/cancel_veil() - var/mob/living/carbon/human/H = holder + var/mob/living/human/H = holder H.RemoveMovementHandler(/datum/movement_handler/mob/incorporeal) deltimer(timer_id) timer_id = null @@ -38,7 +38,7 @@ events_repository.register(/decl/observ/moved, H,src,PROC_REF(drop_cloak)) /spell/veil_of_shadows/proc/drop_cloak() - var/mob/living/carbon/human/H = holder + var/mob/living/human/H = holder if(H.remove_cloaking_source(src)) H.visible_message(SPAN_NOTICE("\The [H] appears from nowhere!")) events_repository.unregister(/decl/observ/moved, H,src) diff --git a/mods/gamemodes/deity/forms/starlight/structures.dm b/mods/gamemodes/deity/forms/starlight/structures.dm index 9d8ff298ccb..83111f55c28 100644 --- a/mods/gamemodes/deity/forms/starlight/structures.dm +++ b/mods/gamemodes/deity/forms/starlight/structures.dm @@ -61,7 +61,7 @@ to_chat(linked_god,SPAN_WARNING("\The [src] disappears from your lack of power!")) qdel(src) return - var/mob/living/carbon/human/target + var/mob/living/human/target if(target_ref) target = target_ref.resolve() if(target) @@ -87,7 +87,7 @@ power_drain -= 3 else //Get new target - var/mob/living/carbon/human/T = locate() in get_turf(src) + var/mob/living/human/T = locate() in get_turf(src) if(T) target_ref = weakref(T) start_time = world.time @@ -123,7 +123,7 @@ if(href_list["accept"] && istype(user,/mob/living/starlight_soul)) if(href_list["accept"] != looking_for) return TOPIC_HANDLED - var/mob/living/carbon/human/H = new(get_turf(src)) + var/mob/living/human/H = new(get_turf(src)) user.mind.transfer_to(H) H.set_species(possible_forms[looking_for]["species"]) for(var/s in possible_forms[looking_for]["spells"]) diff --git a/mods/gamemodes/deity/mobs/phenomena/narsie.dm b/mods/gamemodes/deity/mobs/phenomena/narsie.dm index 9bdc1556d01..52e69b66b47 100644 --- a/mods/gamemodes/deity/mobs/phenomena/narsie.dm +++ b/mods/gamemodes/deity/mobs/phenomena/narsie.dm @@ -3,9 +3,9 @@ desc = "Take pity on a follower, converting a pitance of your power into blood. Don't let them forget your mercy." cost = 20 flags = PHENOMENA_FOLLOWER - expected_type = /mob/living/carbon/human + expected_type = /mob/living/human -/datum/phenomena/exude_blood/can_activate(var/mob/living/carbon/human/H) +/datum/phenomena/exude_blood/can_activate(var/mob/living/human/H) if(!..()) return 0 @@ -14,7 +14,7 @@ return 0 return 1 -/datum/phenomena/exude_blood/activate(var/mob/living/carbon/human/H, var/mob/living/deity/user) +/datum/phenomena/exude_blood/activate(var/mob/living/human/H, var/mob/living/deity/user) H.adjust_blood(30) to_chat(H,SPAN_NOTICE("You feel a rush as new blood enters your system.")) diff --git a/mods/gamemodes/deity/mobs/phenomena/starlight.dm b/mods/gamemodes/deity/mobs/phenomena/starlight.dm index 6b6ad0bbebd..d02c4ed6919 100644 --- a/mods/gamemodes/deity/mobs/phenomena/starlight.dm +++ b/mods/gamemodes/deity/mobs/phenomena/starlight.dm @@ -4,7 +4,7 @@ cost = 100 cooldown = 60 SECONDS flags = PHENOMENA_FOLLOWER - expected_type = /mob/living/carbon/human + expected_type = /mob/living/human var/static/list/possible_forms = list( "Champion" = list("description" = "A protector of the faith. Fully protected by knightly armor, a Champion can shoot fire from their hands.", "armor" = /obj/item/clothing/suit/armor/sunsuit, @@ -31,7 +31,7 @@ return valid_for_herald(a) /datum/phenomena/herald/proc/valid_for_herald(var/a) - var/mob/living/carbon/human/H = a + var/mob/living/human/H = a if(!istype(H)) return FALSE var/obj/item/I = H.get_equipped_item(slot_wear_suit_str) @@ -81,7 +81,7 @@ linked.remove_phenomena(name) show_browser(linked, null, "window=herald") -/datum/phenomena/herald/activate(var/mob/living/carbon/human/H) +/datum/phenomena/herald/activate(var/mob/living/human/H) var/list/html = list() html += "

    Heralds

    " html += "
    Pick the type of herald you want.
    " diff --git a/mods/gamemodes/deity/mobs/phenomena/transmutation.dm b/mods/gamemodes/deity/mobs/phenomena/transmutation.dm index 748f59d50c9..e86c92ec4d4 100644 --- a/mods/gamemodes/deity/mobs/phenomena/transmutation.dm +++ b/mods/gamemodes/deity/mobs/phenomena/transmutation.dm @@ -17,9 +17,9 @@ desc = "Convert your mortal followers into immortal stone beings." cost = 300 flags = PHENOMENA_NEAR_STRUCTURE|PHENOMENA_FOLLOWER - expected_type = /mob/living/carbon/human + expected_type = /mob/living/human -/datum/phenomena/rock_form/activate(var/mob/living/carbon/human/H) +/datum/phenomena/rock_form/activate(var/mob/living/human/H) ..() to_chat(H, SPAN_DANGER("You feel your body harden as it rapidly is transformed into living crystal!")) H.change_species(SPECIES_GOLEM) diff --git a/mods/gamemodes/deity/structures/pylon.dm b/mods/gamemodes/deity/structures/pylon.dm index 63e58806915..2d61c8c76bd 100644 --- a/mods/gamemodes/deity/structures/pylon.dm +++ b/mods/gamemodes/deity/structures/pylon.dm @@ -42,7 +42,7 @@ intuned -= L events_repository.unregister(/decl/observ/destroyed, L, src) -/obj/structure/deity/pylon/OnTopic(var/mob/living/carbon/human/user, var/href_list) +/obj/structure/deity/pylon/OnTopic(var/mob/living/human/user, var/href_list) if(href_list["vision_jump"]) if(istype(user)) to_chat(user,SPAN_WARNING("You feel your body lurch uncomfortably as your consciousness jumps to \the [src]")) diff --git a/mods/gamemodes/heist/outfit.dm b/mods/gamemodes/heist/outfit.dm index 8cc2ea9fb81..d962c2e6138 100644 --- a/mods/gamemodes/heist/outfit.dm +++ b/mods/gamemodes/heist/outfit.dm @@ -66,7 +66,7 @@ randomize_clothing() . = ..() -/decl/hierarchy/outfit/raider/equip_outfit(mob/living/carbon/human/H, assignment, equip_adjustments, datum/job/job, datum/mil_rank/rank) +/decl/hierarchy/outfit/raider/equip_outfit(mob/living/human/H, assignment, equip_adjustments, datum/job/job, datum/mil_rank/rank) randomize_clothing() . = ..() if(. && H) diff --git a/mods/gamemodes/heist/special_role.dm b/mods/gamemodes/heist/special_role.dm index 6e6797334e8..47d67d52e1c 100644 --- a/mods/gamemodes/heist/special_role.dm +++ b/mods/gamemodes/heist/special_role.dm @@ -54,6 +54,6 @@ global_objectives |= new /datum/objective/preserve_crew return 1 -/decl/special_role/raider/equip_role(var/mob/living/carbon/human/player) +/decl/special_role/raider/equip_role(var/mob/living/human/player) default_outfit = LAZYACCESS(outfits_per_species, player.species.name) || initial(default_outfit) . = ..() diff --git a/mods/gamemodes/ninja/datums/special_role.dm b/mods/gamemodes/ninja/datums/special_role.dm index 47546eda93f..2583fa27109 100644 --- a/mods/gamemodes/ninja/datums/special_role.dm +++ b/mods/gamemodes/ninja/datums/special_role.dm @@ -89,7 +89,7 @@ /decl/special_role/ninja/update_antag_mob(var/datum/mind/player) ..() - var/mob/living/carbon/human/H = player.current + var/mob/living/human/H = player.current if(istype(H)) H.real_name = "[pick(ninja_titles)] [pick(ninja_names)]" H.SetName(H.real_name) @@ -103,7 +103,7 @@ hands = list(/obj/item/modular_computer/pda/ninja) id_type = /obj/item/card/id/syndicate -/decl/special_role/ninja/equip_role(var/mob/living/carbon/human/player) +/decl/special_role/ninja/equip_role(var/mob/living/human/player) . = ..() if(.) var/decl/uplink_source/pda/uplink_source = GET_DECL(/decl/uplink_source/pda) diff --git a/mods/mobs/borers/datum/antagonist.dm b/mods/mobs/borers/datum/antagonist.dm index b8b0c7feb4d..b98725e052e 100644 --- a/mods/mobs/borers/datum/antagonist.dm +++ b/mods/mobs/borers/datum/antagonist.dm @@ -35,8 +35,8 @@ /decl/special_role/borer/place_mob(var/mob/living/mob) var/mob/living/simple_animal/borer/borer = mob if(istype(borer)) - var/mob/living/carbon/human/host - for(var/mob/living/carbon/human/H in SSmobs.mob_list) + var/mob/living/human/host + for(var/mob/living/human/H in SSmobs.mob_list) if(H.stat != DEAD && !H.has_brain_worms()) var/obj/item/organ/external/head = GET_EXTERNAL_ORGAN(H, BP_HEAD) if(head && !BP_IS_PROSTHETIC(head)) diff --git a/mods/mobs/borers/datum/symbiote.dm b/mods/mobs/borers/datum/symbiote.dm index 94b885087d1..a3bf2a070ba 100644 --- a/mods/mobs/borers/datum/symbiote.dm +++ b/mods/mobs/borers/datum/symbiote.dm @@ -56,10 +56,10 @@ var/global/list/symbiote_starting_points = list() to_chat(prefs.client.mob, SPAN_WARNING("You are not whitelisted for [check_whitelist] roles.")) . = FALSE -/datum/job/symbiote/handle_variant_join(var/mob/living/carbon/human/H, var/alt_title) +/datum/job/symbiote/handle_variant_join(var/mob/living/human/H, var/alt_title) var/mob/living/simple_animal/borer/symbiote/symbiote = new - var/mob/living/carbon/human/host + var/mob/living/human/host try // No clean way to handle kicking them back to the lobby at this point, so dump // them into xenobio or latejoin instead if there are zero viable hosts left. @@ -96,7 +96,7 @@ var/global/list/symbiote_starting_points = list() qdel(H) return symbiote -/datum/job/symbiote/equip_preview(var/mob/living/carbon/human/H, var/alt_title, var/datum/mil_branch/branch, var/datum/mil_rank/grade, var/additional_skips) +/datum/job/symbiote/equip_preview(var/mob/living/human/H, var/alt_title, var/datum/mil_branch/branch, var/datum/mil_rank/grade, var/additional_skips) if(!preview_slug) preview_slug = new H.appearance = preview_slug @@ -104,7 +104,7 @@ var/global/list/symbiote_starting_points = list() /datum/job/symbiote/proc/find_valid_hosts(var/just_checking) . = list() - for(var/mob/living/carbon/human/H in global.player_list) + for(var/mob/living/human/H in global.player_list) if(H.stat == DEAD || !H.client || !H.ckey || !H.has_brain()) continue var/obj/item/organ/external/head = GET_EXTERNAL_ORGAN(H, BP_HEAD) diff --git a/mods/mobs/borers/mob/borer/borer.dm b/mods/mobs/borers/mob/borer/borer.dm index f99c20de546..529830e87a1 100644 --- a/mods/mobs/borers/mob/borer/borer.dm +++ b/mods/mobs/borers/mob/borer/borer.dm @@ -43,7 +43,7 @@ var/has_reproduced // Whether or not the borer has reproduced, for objective purposes. var/roundstart // Whether or not this borer has been mapped and should not look for a player initially. var/neutered // 'borer lite' mode - fewer powers, less hostile to the host. - var/mob/living/carbon/human/host // Human host for the brain worm. + var/mob/living/human/host // Human host for the brain worm. var/mob/living/captive_brain/host_brain // Used for swapping control of the body back and forth. /obj/item/holder/borer @@ -158,7 +158,7 @@ if(!host || !controlling) return if(ishuman(host)) - var/mob/living/carbon/human/H = host + var/mob/living/human/H = host var/obj/item/organ/external/head = GET_EXTERNAL_ORGAN(H, BP_HEAD) LAZYREMOVE(head.implants, src) diff --git a/mods/mobs/borers/mob/borer/borer_attacks.dm b/mods/mobs/borers/mob/borer/borer_attacks.dm index 138b2f34958..43358767a9e 100644 --- a/mods/mobs/borers/mob/borer/borer_attacks.dm +++ b/mods/mobs/borers/mob/borer/borer_attacks.dm @@ -21,7 +21,7 @@ return TRUE // end TODO - var/mob/living/carbon/human/H = M + var/mob/living/human/H = M var/obj/item/organ/external/E = GET_EXTERNAL_ORGAN(H, BP_HEAD) if(!E) to_chat(src, SPAN_WARNING("\The [H] does not have a head!")) diff --git a/mods/mobs/borers/mob/borer/borer_powers.dm b/mods/mobs/borers/mob/borer/borer_powers.dm index 090f653ad85..8d5df9158b6 100644 --- a/mods/mobs/borers/mob/borer/borer_powers.dm +++ b/mods/mobs/borers/mob/borer/borer_powers.dm @@ -34,7 +34,7 @@ // BRAIN WORM ZOMBIES AAAAH. /mob/living/simple_animal/borer/proc/replace_brain() - var/mob/living/carbon/human/H = host + var/mob/living/human/H = host if(!istype(host)) to_chat(src, SPAN_WARNING("This host does not have a suitable brain.")) @@ -45,9 +45,9 @@ H.add_language(/decl/language/corticalborer) if(host.stat == DEAD) - H.verbs |= /mob/living/carbon/human/proc/jumpstart + H.verbs |= /mob/living/human/proc/jumpstart - H.verbs |= /mob/living/carbon/human/proc/psychic_whisper + H.verbs |= /mob/living/human/proc/psychic_whisper if(!neutered) H.verbs |= /mob/living/proc/spawn_larvae @@ -76,7 +76,7 @@ if(!H.lastKnownIP) H.lastKnownIP = s2h_ip -/mob/living/carbon/human/proc/jumpstart() +/mob/living/human/proc/jumpstart() set category = "Abilities" set name = "Revive Host" set desc = "Send a jolt of electricity through your host, reviving them." @@ -85,7 +85,7 @@ to_chat(usr, SPAN_WARNING("Your host is already alive.")) return - verbs -= /mob/living/carbon/human/proc/jumpstart + verbs -= /mob/living/human/proc/jumpstart visible_message(SPAN_DANGER("With a hideous, rattling moan, [src] shudders back to life!")) rejuvenate() update_posture() diff --git a/mods/mobs/borers/mob/organ.dm b/mods/mobs/borers/mob/organ.dm index c8f9a3c34bd..c1f686ade98 100644 --- a/mods/mobs/borers/mob/organ.dm +++ b/mods/mobs/borers/mob/organ.dm @@ -18,7 +18,7 @@ // They're also super gross and ooze ichor. if(prob(5)) - var/mob/living/carbon/human/H = owner + var/mob/living/human/H = owner if(!istype(H)) return diff --git a/mods/mobs/borers/mob/overrides.dm b/mods/mobs/borers/mob/overrides.dm index 7f8577a9624..77c9a2c158e 100644 --- a/mods/mobs/borers/mob/overrides.dm +++ b/mods/mobs/borers/mob/overrides.dm @@ -15,7 +15,7 @@ borer.detach_from_host() borer.leave_host() -/mob/living/carbon/human/handle_hud_list() +/mob/living/human/handle_hud_list() var/last_hud_bitfield = hud_updateflag . = ..() if(stat != DEAD && has_brain_worms() && BITTEST(last_hud_bitfield, STATUS_HUD) && hud_list[STATUS_HUD] && hud_list[STATUS_HUD_OOC]) @@ -26,7 +26,7 @@ var/image/holder2 = hud_list[STATUS_HUD_OOC] holder2.icon_state = "hudbrainworm" -/mob/living/carbon/human/say_understands(mob/speaker, decl/language/speaking) +/mob/living/human/say_understands(mob/speaker, decl/language/speaking) return has_brain_worms() || ..() /obj/item/organ/internal/brain/do_uninstall(in_place, detach, ignore_children) @@ -47,7 +47,7 @@ if(B && B.controlling) B.detach_from_host() -/mob/living/carbon/human/remove_implant(obj/item/implant, surgical_removal = FALSE, obj/item/organ/external/affected) +/mob/living/human/remove_implant(obj/item/implant, surgical_removal = FALSE, obj/item/organ/external/affected) if((. = ..()) && !QDELETED(implant) && isborer(implant)) var/mob/living/simple_animal/borer/worm = implant if(worm.controlling) diff --git a/mods/species/ascent/datum/antagonist.dm b/mods/species/ascent/datum/antagonist.dm index a1d4d9efc1e..3440b3e7d0a 100644 --- a/mods/species/ascent/datum/antagonist.dm +++ b/mods/species/ascent/datum/antagonist.dm @@ -19,7 +19,7 @@ . = ..() var/lineage = create_gyne_name() if(ishuman(player.current)) - var/mob/living/carbon/human/H = player.current + var/mob/living/human/H = player.current H.set_gyne_lineage(lineage) // This makes all antag ascent have the same lineage on get_random_name. if(!leader && is_species_whitelisted(player.current, SPECIES_MANTID_GYNE)) leader = player @@ -34,7 +34,7 @@ H.real_name = ascent_culture.get_random_name(H, H.gender) H.name = H.real_name -/decl/special_role/hunter/equip_role(var/mob/living/carbon/human/player) +/decl/special_role/hunter/equip_role(var/mob/living/human/player) if(player?.species.get_root_species_name(player) == SPECIES_MANTID_GYNE) rig_type = /obj/item/rig/mantid/gyne else @@ -43,7 +43,7 @@ if(.) player.put_in_hands(new /obj/item/gun/energy/particle) -/decl/special_role/hunter/equip_rig(rig_type, mob/living/carbon/human/player) +/decl/special_role/hunter/equip_rig(rig_type, mob/living/human/player) var/obj/item/rig/mantid/rig = ..() if(rig) rig.visible_name = player.real_name diff --git a/mods/species/ascent/datum/culture.dm b/mods/species/ascent/datum/culture.dm index 87b051614dc..ca56bfd6ba7 100644 --- a/mods/species/ascent/datum/culture.dm +++ b/mods/species/ascent/datum/culture.dm @@ -86,7 +86,7 @@ var/global/list/gyne_architecture = list( queens." /decl/cultural_info/culture/ascent/get_random_name(var/mob/M, var/gender) - var/mob/living/carbon/human/H = M + var/mob/living/human/H = M var/lineage = create_gyne_name() if(istype(H) && H.get_gyne_lineage()) lineage = H.get_gyne_lineage() diff --git a/mods/species/ascent/datum/languages.dm b/mods/species/ascent/datum/languages.dm index 1e834c13872..ca38c2909b6 100644 --- a/mods/species/ascent/datum/languages.dm +++ b/mods/species/ascent/datum/languages.dm @@ -23,7 +23,7 @@ if(S.isSynthetic()) return SPEECH_RESULT_GOOD if(ishuman(speaker)) - var/mob/living/carbon/human/H = speaker + var/mob/living/human/H = speaker if(H.species.name in correct_mouthbits) return SPEECH_RESULT_GOOD return SPEECH_RESULT_MUDDLED @@ -73,7 +73,7 @@ if(istype(speaker) && speaker.isSynthetic()) return TRUE else if(ishuman(speaker)) - var/mob/living/carbon/human/H = speaker + var/mob/living/human/H = speaker return (H.species.name == SPECIES_MANTID_ALATE || H.species.name == SPECIES_MANTID_GYNE) return FALSE diff --git a/mods/species/ascent/datum/species.dm b/mods/species/ascent/datum/species.dm index bc26bf8c81c..fe5e22006c5 100644 --- a/mods/species/ascent/datum/species.dm +++ b/mods/species/ascent/datum/species.dm @@ -88,10 +88,10 @@ list(/decl/emote/visible/ascent_flicker, /decl/emote/visible/ascent_glint) = 20, ) -/decl/species/mantid/handle_sleeping(var/mob/living/carbon/human/H) +/decl/species/mantid/handle_sleeping(var/mob/living/human/H) return -/decl/species/mantid/equip_survival_gear(var/mob/living/carbon/human/H, var/extendedtank = 1) +/decl/species/mantid/equip_survival_gear(var/mob/living/human/H, var/extendedtank = 1) return /decl/species/mantid/gyne diff --git a/mods/species/ascent/effects/razorweb.dm b/mods/species/ascent/effects/razorweb.dm index 4d541268219..a3c692dce9c 100644 --- a/mods/species/ascent/effects/razorweb.dm +++ b/mods/species/ascent/effects/razorweb.dm @@ -128,7 +128,7 @@ if(!istype(L) || !L.simulated || L.current_posture.prone || (MOVING_DELIBERATELY(L) && prob(25)) || L.is_floating) return - var/mob/living/carbon/human/H + var/mob/living/human/H if(ishuman(L)) H = L if(species_immunity_list[H.species.name]) diff --git a/mods/species/ascent/items/id_control.dm b/mods/species/ascent/items/id_control.dm index 194da365293..ac465c63b3d 100644 --- a/mods/species/ascent/items/id_control.dm +++ b/mods/species/ascent/items/id_control.dm @@ -7,7 +7,7 @@ access = list(access_ascent) /obj/item/card/id/ascent/GetAccess() - var/mob/living/carbon/human/H = loc + var/mob/living/human/H = loc if(istype(H) && !(H.species.name in ALL_ASCENT_SPECIES)) . = list() else @@ -38,7 +38,7 @@ organ_properties = ORGAN_PROP_PROSTHETIC var/obj/item/card/id/id_card = /obj/item/card/id/ascent -/obj/item/organ/internal/controller/do_install(mob/living/carbon/human/target, obj/item/organ/external/affected, in_place, update_icon, detached) +/obj/item/organ/internal/controller/do_install(mob/living/human/target, obj/item/organ/external/affected, in_place, update_icon, detached) . = ..() if(detached || !owner) return diff --git a/mods/species/ascent/machines/magnetotron.dm b/mods/species/ascent/machines/magnetotron.dm index 5c78c357a7b..ef49173254c 100644 --- a/mods/species/ascent/machines/magnetotron.dm +++ b/mods/species/ascent/machines/magnetotron.dm @@ -19,7 +19,7 @@ if(!user.check_dexterity(DEXTERITY_COMPLEX_TOOLS, TRUE)) return ..() - var/mob/living/carbon/human/target = locate() in contents + var/mob/living/human/target = locate() in contents if(isnull(target)) display_message("No biological signature detected in [src].") return TRUE @@ -58,7 +58,7 @@ /obj/machinery/ascent_magnetotron/proc/get_total_gynes() - for(var/mob/living/carbon/human/H in global.living_mob_list_) + for(var/mob/living/human/H in global.living_mob_list_) if(H.get_species_name() == SPECIES_MANTID_GYNE) . += 1 diff --git a/mods/species/ascent/machines/ship_machines.dm b/mods/species/ascent/machines/ship_machines.dm index e053026c1d2..84d848e7d14 100644 --- a/mods/species/ascent/machines/ship_machines.dm +++ b/mods/species/ascent/machines/ship_machines.dm @@ -163,7 +163,7 @@ MANTIDIFY(/obj/item/chems/chem_disp_cartridge, "canister", "chemical storage") if(!user.check_dexterity(DEXTERITY_COMPLEX_TOOLS, TRUE)) return ..() if(ishuman(user)) - var/mob/living/carbon/human/H = user + var/mob/living/human/H = user if(!(H.species.name in ALL_ASCENT_SPECIES)) to_chat(H, SPAN_WARNING("You have no idea how to use \the [src].")) return TRUE diff --git a/mods/species/ascent/mobs/nymph/nymph_life.dm b/mods/species/ascent/mobs/nymph/nymph_life.dm index 2b297c78aad..4c217a9aee0 100644 --- a/mods/species/ascent/mobs/nymph/nymph_life.dm +++ b/mods/species/ascent/mobs/nymph/nymph_life.dm @@ -65,7 +65,7 @@ nymph.visible_message("\icon[nymph] [nymph] begins to shimmy and shake out of its old skin.") if(molt == 5) if(do_after(nymph, 10 SECONDS, nymph, FALSE)) - var/mob/living/carbon/human/H = new(get_turf(usr), SPECIES_MANTID_ALATE) + var/mob/living/human/H = new(get_turf(usr), SPECIES_MANTID_ALATE) H.set_gyne_lineage(nymph.get_gyne_lineage()) H.real_name = "[random_id(/decl/species/mantid, 10000, 99999)] [H.get_gyne_name()]" H.nutrition = nymph.nutrition * 0.25 // Homgry after molt. diff --git a/mods/species/bayliens/adherent/_adherent.dm b/mods/species/bayliens/adherent/_adherent.dm index 16ae41cdd9b..c2c7209f152 100644 --- a/mods/species/bayliens/adherent/_adherent.dm +++ b/mods/species/bayliens/adherent/_adherent.dm @@ -6,6 +6,6 @@ #define BP_JETS "maneuvering jets" #define BP_COOLING_FINS "cooling fins" -/mob/living/carbon/human/adherent/Initialize(mapload, species_name, datum/mob_snapshot/supplied_appearance) +/mob/living/human/adherent/Initialize(mapload, species_name, datum/mob_snapshot/supplied_appearance) species_name = SPECIES_ADHERENT . = ..() \ No newline at end of file diff --git a/mods/species/bayliens/adherent/datum/species.dm b/mods/species/bayliens/adherent/datum/species.dm index e5e00121b0e..ac6feca11fd 100644 --- a/mods/species/bayliens/adherent/datum/species.dm +++ b/mods/species/bayliens/adherent/datum/species.dm @@ -73,7 +73,7 @@ max_players = 3 blood_volume = 0 -/decl/species/adherent/can_overcome_gravity(var/mob/living/carbon/human/H) +/decl/species/adherent/can_overcome_gravity(var/mob/living/human/H) . = FALSE if(H && H.stat == CONSCIOUS) for(var/obj/item/organ/internal/powered/float/float in H.get_internal_organs()) @@ -81,10 +81,10 @@ . = TRUE break -/decl/species/adherent/can_fall(var/mob/living/carbon/human/H) +/decl/species/adherent/can_fall(var/mob/living/human/H) . = !can_overcome_gravity(H) -/decl/species/adherent/handle_fall_special(var/mob/living/carbon/human/H, var/turf/landing) +/decl/species/adherent/handle_fall_special(var/mob/living/human/H, var/turf/landing) var/float_is_usable = FALSE if(H && H.stat == CONSCIOUS) for(var/obj/item/organ/internal/powered/float/float in H.get_internal_organs()) @@ -106,7 +106,7 @@ if(2000 to 8000) . = 4 else . = 8 -/decl/species/adherent/get_additional_examine_text(var/mob/living/carbon/human/H) +/decl/species/adherent/get_additional_examine_text(var/mob/living/human/H) if(can_overcome_gravity(H)) return "\nThey are floating on a cloud of shimmering distortion." /datum/hud_data/adherent diff --git a/mods/species/bayliens/bayliens.dm b/mods/species/bayliens/bayliens.dm index 52f6ab904b9..44d834bada9 100644 --- a/mods/species/bayliens/bayliens.dm +++ b/mods/species/bayliens/bayliens.dm @@ -1,7 +1,7 @@ /decl/modpack/bayliens name = "Baystation 12 Aliens" -/mob/living/carbon/human/Process_Spacemove(allow_movement) +/mob/living/human/Process_Spacemove(allow_movement) . = ..() if(.) return diff --git a/mods/species/bayliens/skrell/_skrell.dm b/mods/species/bayliens/skrell/_skrell.dm index 7a81763601d..b2ad3f9286b 100644 --- a/mods/species/bayliens/skrell/_skrell.dm +++ b/mods/species/bayliens/skrell/_skrell.dm @@ -1,5 +1,5 @@ #define SPECIES_SKRELL "Skrell" -/mob/living/carbon/human/skrell/Initialize(mapload, species_name, datum/mob_snapshot/supplied_appearance) +/mob/living/human/skrell/Initialize(mapload, species_name, datum/mob_snapshot/supplied_appearance) species_name = SPECIES_SKRELL . = ..() \ No newline at end of file diff --git a/mods/species/bayliens/skrell/datum/species.dm b/mods/species/bayliens/skrell/datum/species.dm index f7b2b6a366d..fe3299e4ce7 100644 --- a/mods/species/bayliens/skrell/datum/species.dm +++ b/mods/species/bayliens/skrell/datum/species.dm @@ -105,13 +105,13 @@ /decl/emote/exertion/synthetic/creak ) -/decl/species/skrell/fluid_act(var/mob/living/carbon/human/H, var/datum/reagents/fluids) +/decl/species/skrell/fluid_act(var/mob/living/human/H, var/datum/reagents/fluids) . = ..() var/water = REAGENT_VOLUME(fluids, /decl/material/liquid/water) if(water >= 40 && H.hydration < 400) //skrell passively absorb water. H.hydration += 1 -/decl/species/skrell/handle_trail(mob/living/carbon/human/H, turf/T, old_loc) +/decl/species/skrell/handle_trail(mob/living/human/H, turf/T, old_loc) var/obj/item/shoes = H.get_equipped_item(slot_shoes_str) if(!shoes) var/list/bloodDNA diff --git a/mods/species/bayliens/tajaran/_tajaran.dm b/mods/species/bayliens/tajaran/_tajaran.dm index b59346d27f2..de2c8d585af 100644 --- a/mods/species/bayliens/tajaran/_tajaran.dm +++ b/mods/species/bayliens/tajaran/_tajaran.dm @@ -8,5 +8,5 @@ if(bodytype_equip_flags & BODY_FLAG_EXCLUDE) bodytype_equip_flags |= BODY_FLAG_FELINE -/mob/living/carbon/human/tajaran/Initialize(mapload, species_name, datum/mob_snapshot/supplied_appearance) +/mob/living/human/tajaran/Initialize(mapload, species_name, datum/mob_snapshot/supplied_appearance) . = ..(species_name = SPECIES_TAJARA) diff --git a/mods/species/bayliens/tajaran/datum/species.dm b/mods/species/bayliens/tajaran/datum/species.dm index 4f64fceccba..891622d3bee 100644 --- a/mods/species/bayliens/tajaran/datum/species.dm +++ b/mods/species/bayliens/tajaran/datum/species.dm @@ -79,5 +79,5 @@ autohiss_exempt = list(LANGUAGE_TAJARA) -/decl/species/tajaran/handle_additional_hair_loss(var/mob/living/carbon/human/H, var/defer_body_update = TRUE) +/decl/species/tajaran/handle_additional_hair_loss(var/mob/living/human/H, var/defer_body_update = TRUE) . = H?.set_skin_colour(rgb(189, 171, 143)) diff --git a/mods/species/bayliens/unathi/_lizard.dm b/mods/species/bayliens/unathi/_lizard.dm index 1cfa175593c..5983bdc1c2a 100644 --- a/mods/species/bayliens/unathi/_lizard.dm +++ b/mods/species/bayliens/unathi/_lizard.dm @@ -1,6 +1,6 @@ #define SPECIES_LIZARD "Unathi" #define LANGUAGE_LIZARD "Sinta'unathi" -/mob/living/carbon/human/lizard/Initialize(mapload, species_name, datum/mob_snapshot/supplied_appearance) +/mob/living/human/lizard/Initialize(mapload, species_name, datum/mob_snapshot/supplied_appearance) species_name = SPECIES_LIZARD . = ..() diff --git a/mods/species/bayliens/unathi/datum/species.dm b/mods/species/bayliens/unathi/datum/species.dm index f3c6f181ed4..49cf8b27d85 100644 --- a/mods/species/bayliens/unathi/datum/species.dm +++ b/mods/species/bayliens/unathi/datum/species.dm @@ -107,6 +107,6 @@ LAZYDISTINCTADD(available_cultural_info[TAG_CULTURE], /decl/cultural_info/culture/lizard) LAZYSET(default_cultural_info, TAG_CULTURE, /decl/cultural_info/culture/lizard) -/decl/species/unathi/equip_survival_gear(var/mob/living/carbon/human/H) +/decl/species/unathi/equip_survival_gear(var/mob/living/human/H) ..() H.equip_to_slot_or_del(new /obj/item/clothing/shoes/sandal(H), slot_shoes_str) diff --git a/mods/species/drakes/_drakes.dm b/mods/species/drakes/_drakes.dm index eb227ea157b..47bf61c6a40 100644 --- a/mods/species/drakes/_drakes.dm +++ b/mods/species/drakes/_drakes.dm @@ -6,7 +6,7 @@ /decl/modpack/grafadreka name = "Grafadreka Species" -/mob/living/carbon/human/grafadreka/Initialize(mapload, species_name, datum/mob_snapshot/supplied_appearance) +/mob/living/human/grafadreka/Initialize(mapload, species_name, datum/mob_snapshot/supplied_appearance) // fantasy modpack overrides drake name, so can't use the #define var/decl/species/grafadreka/drakes = GET_DECL(/decl/species/grafadreka) . = ..(mapload, drakes.name) diff --git a/mods/species/drakes/drake_abilities_friendly.dm b/mods/species/drakes/drake_abilities_friendly.dm index a412874b9fd..0e7b74855cb 100644 --- a/mods/species/drakes/drake_abilities_friendly.dm +++ b/mods/species/drakes/drake_abilities_friendly.dm @@ -21,7 +21,7 @@ var/global/list/_wounds_being_tended_by_drakes = list() if(length(friend.get_external_organs())) var/list/injured_organs = friend.get_injured_organs() if(length(injured_organs)) - var/mob/living/carbon/human/H = friend + var/mob/living/human/H = friend for (var/obj/item/organ/external/E in H.bad_external_organs) if(!length(E.wounds)) continue diff --git a/mods/species/drakes/drake_organs.dm b/mods/species/drakes/drake_organs.dm index 16343179eaf..a42a3578cb4 100644 --- a/mods/species/drakes/drake_organs.dm +++ b/mods/species/drakes/drake_organs.dm @@ -22,7 +22,7 @@ if(owner && owner.stat != DEAD && !is_broken() && sap_crop && sap_crop.total_volume < 10) sap_crop.add_reagent(/decl/material/liquid/sifsap, 0.5) -/obj/item/organ/internal/drake_gizzard/do_install(var/mob/living/carbon/human/target, var/obj/item/organ/external/affected, var/in_place = FALSE, var/update_icon = TRUE, var/detached = FALSE) +/obj/item/organ/internal/drake_gizzard/do_install(var/mob/living/human/target, var/obj/item/organ/external/affected, var/in_place = FALSE, var/update_icon = TRUE, var/detached = FALSE) . = ..() if(owner) LAZYDISTINCTADD(owner.stat_organs, src) diff --git a/mods/species/drakes/drake_spit.dm b/mods/species/drakes/drake_spit.dm index e1e3178d085..d35efda2c01 100644 --- a/mods/species/drakes/drake_spit.dm +++ b/mods/species/drakes/drake_spit.dm @@ -15,7 +15,7 @@ /obj/item/projectile/drake_spit/on_hit(atom/target, blocked, def_zone) // Stun is needed to effectively hunt simplemobs, but it's OP against humans. if(ishuman(target)) - var/mob/living/carbon/human/victim = target + var/mob/living/human/victim = target SET_STATUS_MAX(victim, STAT_CONFUSE, max(stun, weaken)) stun = 0 weaken = 0 diff --git a/mods/species/drakes/species.dm b/mods/species/drakes/species.dm index 145cfbacd6e..2c086848f82 100644 --- a/mods/species/drakes/species.dm +++ b/mods/species/drakes/species.dm @@ -36,7 +36,7 @@ ) species_hud = /datum/hud_data/grafadreka inherent_verbs = list( - /mob/living/carbon/human/proc/drake_sit + /mob/living/human/proc/drake_sit ) traits = list( /decl/trait/sivian_biochemistry = TRAIT_LEVEL_EXISTS @@ -54,18 +54,18 @@ ) // TODO: move pain onto a behavior datum or bodytype. -/decl/species/grafadreka/get_pain_emote(var/mob/living/carbon/human/H, var/pain_power) +/decl/species/grafadreka/get_pain_emote(var/mob/living/human/H, var/pain_power) if(H?.get_bodytype()?.type == /decl/bodytype/quadruped/grafadreka/hatchling) pain_emotes_with_pain_level = hatchling_pain_emotes_with_pain_level else pain_emotes_with_pain_level = adult_pain_emotes_with_pain_level return ..() -/decl/species/grafadreka/get_surgery_overlay_icon(var/mob/living/carbon/human/H) +/decl/species/grafadreka/get_surgery_overlay_icon(var/mob/living/human/H) return null // todo: 'mods/species/drakes/icons/surgery.dmi' // Stub for muscle memory of the Sit verb on Polaris. -/mob/living/carbon/human/proc/drake_sit() +/mob/living/human/proc/drake_sit() set name = "Sit" set category = "IC" set src = usr diff --git a/mods/species/neoavians/datum/species.dm b/mods/species/neoavians/datum/species.dm index 75213895171..1497e975a08 100644 --- a/mods/species/neoavians/datum/species.dm +++ b/mods/species/neoavians/datum/species.dm @@ -64,12 +64,12 @@ ) ) -/decl/species/neoavian/equip_default_fallback_uniform(var/mob/living/carbon/human/H) +/decl/species/neoavian/equip_default_fallback_uniform(var/mob/living/human/H) if(istype(H)) H.equip_to_slot_or_del(new /obj/item/clothing/dress/avian_smock/worker, slot_w_uniform_str) H.equip_to_slot_or_del(new /obj/item/clothing/shoes/avian, slot_shoes_str) -/decl/species/neoavian/get_holder_color(var/mob/living/carbon/human/H) +/decl/species/neoavian/get_holder_color(var/mob/living/human/H) return H.get_skin_colour() /decl/hierarchy/outfit/job/generic/assistant/avian diff --git a/mods/species/serpentid/datum/species.dm b/mods/species/serpentid/datum/species.dm index cb406fbf8d5..84956801e62 100644 --- a/mods/species/serpentid/datum/species.dm +++ b/mods/species/serpentid/datum/species.dm @@ -74,7 +74,7 @@ ) var/list/skin_overlays = list() -/decl/species/serpentid/can_overcome_gravity(var/mob/living/carbon/human/H) +/decl/species/serpentid/can_overcome_gravity(var/mob/living/human/H) var/datum/gas_mixture/mixture = H.loc.return_air() if(mixture) @@ -87,12 +87,12 @@ return FALSE -/decl/species/serpentid/handle_environment_special(var/mob/living/carbon/human/H) +/decl/species/serpentid/handle_environment_special(var/mob/living/human/H) if(!H.on_fire && H.fire_stacks < 2) H.fire_stacks += 0.2 return -/decl/species/serpentid/can_fall(var/mob/living/carbon/human/H) +/decl/species/serpentid/can_fall(var/mob/living/human/H) var/datum/gas_mixture/mixture = H.loc.return_air() var/turf/T = GetBelow(H.loc) for(var/obj/O in T) @@ -104,7 +104,7 @@ return FALSE return TRUE -/decl/species/serpentid/handle_fall_special(var/mob/living/carbon/human/H, var/turf/landing) +/decl/species/serpentid/handle_fall_special(var/mob/living/human/H, var/turf/landing) var/datum/gas_mixture/mixture = H.loc.return_air() var/turf/T = GetBelow(H.loc) @@ -124,13 +124,13 @@ return FALSE -/decl/species/serpentid/can_shred(var/mob/living/carbon/human/H, var/ignore_intent, var/ignore_antag) +/decl/species/serpentid/can_shred(var/mob/living/human/H, var/ignore_intent, var/ignore_antag) if(!H.get_equipped_item(slot_handcuffed_str) || H.buckled) return ..(H, ignore_intent, TRUE) else return 0 -/decl/species/serpentid/handle_movement_delay_special(var/mob/living/carbon/human/H) +/decl/species/serpentid/handle_movement_delay_special(var/mob/living/human/H) var/tally = 0 H.remove_cloaking_source(src) @@ -142,7 +142,7 @@ return tally // todo: make this on bodytype -/decl/species/serpentid/update_skin(var/mob/living/carbon/human/H) +/decl/species/serpentid/update_skin(var/mob/living/human/H) if(H.stat) H.skin_state = SKIN_NORMAL @@ -178,7 +178,7 @@ return(threat_image) -/decl/species/serpentid/disarm_attackhand(var/mob/living/carbon/human/attacker, var/mob/living/carbon/human/target) +/decl/species/serpentid/disarm_attackhand(var/mob/living/human/attacker, var/mob/living/human/target) if(attacker.pulling_punches || target.current_posture.prone || attacker == target) return ..(attacker, target) if(world.time < attacker.last_attack + 20) diff --git a/mods/species/serpentid/mobs/bodyparts_serpentid.dm b/mods/species/serpentid/mobs/bodyparts_serpentid.dm index 324818cc59f..aadf48f1d72 100644 --- a/mods/species/serpentid/mobs/bodyparts_serpentid.dm +++ b/mods/species/serpentid/mobs/bodyparts_serpentid.dm @@ -67,7 +67,7 @@ to_chat(owner, "You feel air rushing through your trachea!") /obj/item/organ/internal/lungs/insectoid/serpentid/handle_failed_breath() - var/mob/living/carbon/human/H = owner + var/mob/living/human/H = owner var/oxygenated = GET_CHEMICAL_EFFECT(owner, CE_OXYGENATED) H.heal_damage(OXY, HUMAN_MAX_OXYLOSS * oxygenated) @@ -148,7 +148,7 @@ playsound(owner.loc, 'sound/effects/angrybug.ogg', 60, 0) owner.skin_state = SKIN_THREAT owner.update_skin() - addtimer(CALLBACK(owner, TYPE_PROC_REF(/mob/living/carbon/human, reset_skin)), 10 SECONDS, TIMER_UNIQUE) + addtimer(CALLBACK(owner, TYPE_PROC_REF(/mob/living/human, reset_skin)), 10 SECONDS, TIMER_UNIQUE) else if(owner.skin_state == SKIN_THREAT) owner.reset_skin() diff --git a/mods/species/utility_frames/species.dm b/mods/species/utility_frames/species.dm index 5222b9a72d5..c1a17fb7a9a 100644 --- a/mods/species/utility_frames/species.dm +++ b/mods/species/utility_frames/species.dm @@ -53,5 +53,5 @@ /obj/item/organ/external/head/utility_frame glowing_eyes = TRUE -/decl/species/utility_frame/disfigure_msg(var/mob/living/carbon/human/H) +/decl/species/utility_frame/disfigure_msg(var/mob/living/human/H) . = SPAN_DANGER("The faceplate is dented and cracked!\n") diff --git a/mods/species/vox/_vox.dm b/mods/species/vox/_vox.dm index 9d0636f256b..f62ceb3dace 100644 --- a/mods/species/vox/_vox.dm +++ b/mods/species/vox/_vox.dm @@ -10,7 +10,7 @@ credits_crew_names = list("THE VOX") credits_topics = list("VOX RITUAL DUELS", "NECK MARKINGS", "ANCIENT SUPERCOMPUTERS") -/mob/living/carbon/human/vox/Initialize(mapload, species_name, datum/mob_snapshot/supplied_appearance) +/mob/living/human/vox/Initialize(mapload, species_name, datum/mob_snapshot/supplied_appearance) SET_HAIR_STYLE(src, /decl/sprite_accessory/hair/vox/short, TRUE) SET_HAIR_COLOUR(src, COLOR_BEASTY_BROWN, TRUE) species_name = SPECIES_VOX diff --git a/mods/species/vox/datum/heist_compatibility.dm b/mods/species/vox/datum/heist_compatibility.dm index c364b6b5375..315aeda06f2 100644 --- a/mods/species/vox/datum/heist_compatibility.dm +++ b/mods/species/vox/datum/heist_compatibility.dm @@ -17,7 +17,7 @@ hands = list(/obj/item/gun/launcher/alien/spikethrower) id_type = /obj/item/card/id/syndicate -/decl/hierarchy/outfit/vox_raider/equip_outfit(mob/living/carbon/human/H, assignment, equip_adjustments, datum/job/job, datum/mil_rank/rank) +/decl/hierarchy/outfit/vox_raider/equip_outfit(mob/living/human/H, assignment, equip_adjustments, datum/job/job, datum/mil_rank/rank) uniform = pick(/obj/item/clothing/suit/robe/vox, /obj/item/clothing/pants/vox) glasses = pick(/obj/item/clothing/glasses/thermal, /obj/item/clothing/glasses/thermal/plain/eyepatch, /obj/item/clothing/glasses/thermal/plain/monocle) holster = pick(/obj/item/clothing/webbing/holster/armpit, /obj/item/clothing/webbing/holster/waist, /obj/item/clothing/webbing/holster/hip) @@ -45,14 +45,14 @@ return ..() var/decl/hierarchy/outfit/outfit = GET_DECL(/decl/hierarchy/outfit/vox_raider) - var/mob/living/carbon/human/vox/vox = new(get_turf(src), SPECIES_VOX) + var/mob/living/human/vox/vox = new(get_turf(src), SPECIES_VOX) outfit.equip_outfit(vox) if(user.mind) user.mind.transfer_to(vox) qdel(user) addtimer(CALLBACK(src, PROC_REF(do_post_voxifying), vox), 1) -/obj/structure/mirror/raider/proc/do_post_voxifying(var/mob/living/carbon/human/vox) +/obj/structure/mirror/raider/proc/do_post_voxifying(var/mob/living/human/vox) var/newname = sanitize_safe(input(vox,"Enter a name, or leave blank for the default name.", "Name change","") as text, MAX_NAME_LEN) if(!newname || newname == "") var/decl/cultural_info/voxculture = GET_DECL(/decl/cultural_info/culture/vox/raider) diff --git a/mods/species/vox/datum/language.dm b/mods/species/vox/datum/language.dm index 3e6e6c61663..6441c66747c 100644 --- a/mods/species/vox/datum/language.dm +++ b/mods/species/vox/datum/language.dm @@ -15,7 +15,7 @@ /decl/language/vox/can_speak_special(var/mob/speaker) if(!ishuman(speaker)) return FALSE - var/mob/living/carbon/human/H = speaker + var/mob/living/human/H = speaker var/obj/item/organ/internal/tongue = GET_INTERNAL_ORGAN(H, BP_HINDTONGUE) if(!istype(tongue) || !tongue.is_usable()) to_chat(speaker, SPAN_WARNING("You are not capable of speaking [name]!")) diff --git a/mods/species/vox/datum/species.dm b/mods/species/vox/datum/species.dm index 6f09b5fb36b..e7bff524c86 100644 --- a/mods/species/vox/datum/species.dm +++ b/mods/species/vox/datum/species.dm @@ -29,7 +29,7 @@ ) inherent_verbs = list( - /mob/living/carbon/human/proc/toggle_vox_pressure_seal + /mob/living/human/proc/toggle_vox_pressure_seal ) unarmed_attacks = list( @@ -133,7 +133,7 @@ /decl/emote/exertion/synthetic/creak ) -/decl/species/vox/equip_survival_gear(var/mob/living/carbon/human/H) +/decl/species/vox/equip_survival_gear(var/mob/living/human/H) H.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/vox(H), slot_wear_mask_str) var/obj/item/backpack/backpack = H.get_equipped_item(slot_back_str) if(istype(backpack)) @@ -150,14 +150,14 @@ // Ideally this would all be on bodytype, but pressure is handled per-mob currently. var/global/list/vox_current_pressure_toggle = list() -/decl/species/vox/disfigure_msg(var/mob/living/carbon/human/H) +/decl/species/vox/disfigure_msg(var/mob/living/human/H) var/decl/pronouns/G = H.get_pronouns() return SPAN_DANGER("[G.His] beak-segments are cracked and chipped beyond recognition!\n") /decl/species/vox/skills_from_age(age) . = 8 -/decl/species/vox/handle_death(var/mob/living/carbon/human/H) +/decl/species/vox/handle_death(var/mob/living/human/H) ..() var/obj/item/organ/internal/voxstack/stack = H.get_organ(BP_STACK, /obj/item/organ/internal/voxstack) if (stack) @@ -168,23 +168,23 @@ var/global/list/vox_current_pressure_toggle = list() emote_message_3p = "$USER$ SHRIEKS!" emote_sound = 'mods/species/vox/sounds/shriek1.ogg' -/decl/species/vox/get_warning_low_pressure(var/mob/living/carbon/human/H) +/decl/species/vox/get_warning_low_pressure(var/mob/living/human/H) if(H && global.vox_current_pressure_toggle["\ref[H]"]) return 50 return ..() -/decl/species/vox/get_hazard_low_pressure(var/mob/living/carbon/human/H) +/decl/species/vox/get_hazard_low_pressure(var/mob/living/human/H) if(H && global.vox_current_pressure_toggle["\ref[H]"]) return 0 return ..() -/mob/living/carbon/human/proc/toggle_vox_pressure_seal() +/mob/living/human/proc/toggle_vox_pressure_seal() set name = "Toggle Vox Pressure Seal" set category = "Abilities" set src = usr if(!istype(species, /decl/species/vox)) - verbs -= /mob/living/carbon/human/proc/toggle_vox_pressure_seal + verbs -= /mob/living/human/proc/toggle_vox_pressure_seal return if(incapacitated(INCAPACITATION_KNOCKOUT)) diff --git a/mods/species/vox/datum/species_bodytypes.dm b/mods/species/vox/datum/species_bodytypes.dm index 3ced904de96..4df2e25757c 100644 --- a/mods/species/vox/datum/species_bodytypes.dm +++ b/mods/species/vox/datum/species_bodytypes.dm @@ -70,7 +70,7 @@ ) return ..() -/decl/bodytype/vox/get_movement_slowdown(var/mob/living/carbon/human/H) +/decl/bodytype/vox/get_movement_slowdown(var/mob/living/human/H) if(H && global.vox_current_pressure_toggle["\ref[H]"]) return 1.5 return ..() diff --git a/mods/species/vox/datum/trader.dm b/mods/species/vox/datum/trader.dm index 7abecad3cce..6211285cb6a 100644 --- a/mods/species/vox/datum/trader.dm +++ b/mods/species/vox/datum/trader.dm @@ -68,7 +68,7 @@ /datum/trader/ship/vox/hail(var/mob/user) if(ishuman(user)) - var/mob/living/carbon/human/H = user + var/mob/living/human/H = user if(H.species) switch(H.species.name) if(SPECIES_VOX) diff --git a/mods/species/vox/datum/unit_testing.dm b/mods/species/vox/datum/unit_testing.dm index d14706d07fe..1026f897cad 100644 --- a/mods/species/vox/datum/unit_testing.dm +++ b/mods/species/vox/datum/unit_testing.dm @@ -5,7 +5,7 @@ /datum/unit_test/mob_damage/vox name = "MOB: Vox damage check template" template = /datum/unit_test/mob_damage/vox - mob_type = /mob/living/carbon/human/vox + mob_type = /mob/living/human/vox /datum/unit_test/mob_damage/vox/brute name = "MOB: Vox Brute Damage Check" diff --git a/mods/species/vox/gear/gear_shoes.dm b/mods/species/vox/gear/gear_shoes.dm index aa8cb4a2db7..b3ad991e46f 100644 --- a/mods/species/vox/gear/gear_shoes.dm +++ b/mods/species/vox/gear/gear_shoes.dm @@ -14,7 +14,7 @@ else if(!ishuman(user)) return - var/mob/living/carbon/human/H = user + var/mob/living/human/H = user var/obj/item/shoes = H.get_equipped_item(slot_shoes_str) if(shoes != src) to_chat(user, "You will have to put on the [src] before you can do that.") diff --git a/mods/species/vox/gear/gun.dm b/mods/species/vox/gear/gun.dm index 6d04b3118cc..f55e773b031 100644 --- a/mods/species/vox/gear/gun.dm +++ b/mods/species/vox/gear/gun.dm @@ -1,7 +1,7 @@ /datum/extension/voxform base_type = /datum/extension/voxform -/datum/extension/voxform/proc/check_held_user(var/mob/living/carbon/human/user, var/atom/movable/thing) +/datum/extension/voxform/proc/check_held_user(var/mob/living/human/user, var/atom/movable/thing) if(!istype(user)) return FALSE if(user.get_bodytype_category() != BODYTYPE_VOX && user.try_unequip(thing)) @@ -10,7 +10,7 @@ return FALSE return TRUE -/obj/item/gun/special_check(var/mob/living/carbon/human/user) +/obj/item/gun/special_check(var/mob/living/human/user) . = ..() if(!QDELETED(src) && src.loc == user && has_extension(src, /datum/extension/voxform)) var/datum/extension/voxform/voxform = get_extension(src, /datum/extension/voxform) diff --git a/mods/species/vox/mobs_vox.dm b/mods/species/vox/mobs_vox.dm index 843e4389a57..3951c19fdaa 100644 --- a/mods/species/vox/mobs_vox.dm +++ b/mods/species/vox/mobs_vox.dm @@ -1,2 +1,2 @@ -/mob/living/simple_animal/hostile/slug/check_friendly_species(var/mob/living/carbon/human/H) +/mob/living/simple_animal/hostile/slug/check_friendly_species(var/mob/living/human/H) return (istype(H) && H.get_bodytype_category() == BODYTYPE_VOX) || ..() From 811438c8f411f74c142d62cedf84287b10a0752c Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Thu, 20 Jun 2024 03:02:04 -0400 Subject: [PATCH 73/90] Add log wall frames/low walls --- code/game/objects/structures/wall_frame.dm | 26 +++++++++++++++++- .../crafting/stack_recipes/recipes_logs.dm | 3 ++ icons/obj/structures/log_wall_frame.dmi | Bin 0 -> 4364 bytes 3 files changed, 28 insertions(+), 1 deletion(-) create mode 100644 icons/obj/structures/log_wall_frame.dmi diff --git a/code/game/objects/structures/wall_frame.dm b/code/game/objects/structures/wall_frame.dm index 6760ffccd36..2f897c05d3b 100644 --- a/code/game/objects/structures/wall_frame.dm +++ b/code/game/objects/structures/wall_frame.dm @@ -163,4 +163,28 @@ /obj/structure/wall_frame/hull paint_color = COLOR_HULL - stripe_color = COLOR_HULL \ No newline at end of file + stripe_color = COLOR_HULL + +/obj/structure/wall_frame/log + name = "low log wall" + desc = "A section of log wall with empty space for fitting a window or simply letting air in." + icon = 'icons/obj/structures/log_wall_frame.dmi' + material_alteration = MAT_FLAG_ALTERATION_NAME | MAT_FLAG_ALTERATION_DESC // material color is applied in on_update_icon + +/obj/structure/wall_frame/log/Initialize() + color = null // clear mapping preview color + . = ..() + +#define LOW_LOG_WALL_SUBTYPE(material_name) \ +/obj/structure/wall_frame/log/##material_name { \ + material = /decl/material/solid/organic/wood/##material_name; \ + color = /decl/material/solid/organic/wood/##material_name::color; \ +} + +LOW_LOG_WALL_SUBTYPE(fungal) +LOW_LOG_WALL_SUBTYPE(ebony) +LOW_LOG_WALL_SUBTYPE(walnut) +LOW_LOG_WALL_SUBTYPE(maple) +LOW_LOG_WALL_SUBTYPE(mahogany) +LOW_LOG_WALL_SUBTYPE(bamboo) +LOW_LOG_WALL_SUBTYPE(yew) \ No newline at end of file diff --git a/code/modules/crafting/stack_recipes/recipes_logs.dm b/code/modules/crafting/stack_recipes/recipes_logs.dm index dd936032074..8b6a961f96a 100644 --- a/code/modules/crafting/stack_recipes/recipes_logs.dm +++ b/code/modules/crafting/stack_recipes/recipes_logs.dm @@ -8,3 +8,6 @@ craft_stack_types = /obj/item/stack/material/log forbidden_craft_stack_types = /obj/item/stack/material/ore difficulty = MAT_VALUE_HARD_DIY +/decl/stack_recipe/logs/wall_frame + result_type = /obj/structure/wall_frame/log + difficulty = MAT_VALUE_HARD_DIY \ No newline at end of file diff --git a/icons/obj/structures/log_wall_frame.dmi b/icons/obj/structures/log_wall_frame.dmi new file mode 100644 index 0000000000000000000000000000000000000000..1fdbdb105367f58fd0c67a14a0518f698b87b273 GIT binary patch literal 4364 zcmZWtd03L^*H&@BDHWY^$t6r{bgbNSO_0fQE3q=otXy*|#TwHx^-XcXvarU?G52!I zUDMP|T(jJl1hd?7MO;Er0fF~JtKZCZeSZMwIp@C5eLv6h9=I-IZLG~icF64DgKf_Tm|pqI z?S{91fH&5UkMCB>g8|}>CJnJRn!)XRy-WS5)5=obk3`ocUi1#QmqtzXlJ%xcl-FL5 z$fr|w+9$gKGA9O7VVn#xPHhsd?3rajZu+O}Y~NQmrmzpM#2(emE~}2FSV!4az%>^u z?U;(Ij?4qUf#;ZZp-G%ZpSUB^S2aB}t6GOd-R{I)vJ2eZ5FF7M9nttWqA@L^@nu9~ zRYYS`1Tj$U6e^Hua9Qc}3_0u012;ZC_!A3LwC$~w#Y?{iJ+BizywCl5V#%rDoDO)KR z$}S$7g|7}0lCE0K^=BJPS5)Ir5h8J_k?n2l^T!mZ5au!PW#x3b`rrv)lD)I_q1gj` zc#UF&Dq_`5gr6KU370P*B{~H;=aZ-%X(hhlMY8sOCncsk;U&Hth+-VoOs|*bCejzB zD)4@JQ%d-iro4*PCe7}StSA0P5$4*=67hIQy+0Hubcr(&TpC^<)gm~wg^?5C8bn!tZMJv5+5=756Ec~e^BY<7}`n`@#@`E0<$doF4bzPM2<)` znV4A_ZhtrAxFHo#KeJM|DaZ2@v%Rr^eSWB9Vhv6*Oei5Ly`FQpn9Sd*D?Glsx}>+I zuwc`|v*8(fdb5xHWHKFl4c6(}wqeA$+v>4b(wcUAL)KK94A<58+9s2=^ZGW3T+!)q zeFSzmPResLBQGp3q?2$&@S;;WyqxVJLz2&XYiYdBZamV<&ehqgjKo4WB+Eqa&HvYq zrj4;+)lBy=sX%r%=gVO~HI=Ry8dJbbnoOAM-Gd^Dp>9@>gy{g%u70Unt4m~50Mnrp z8G9)$s2I-M8BA7s>!dG@-RAjObSUhA`AP~PRbKwQtEWpi-F49m(#k$k$)9Izs-e1w zmf1!Af6s&@Rf*_A2)ld!VT|30LU<3eGX0^c`m0JzzVvf6KU=$ImuAayFVze0WC(5JYAgJE@2IZCmb)P1!3Ncxm-lq zB4_?RMm_3oBf*mgjx$>IG}tKQGN1UnwPVw6VTJn|SZA2H@P$K@DW)0?g#jV~pOMEy zMgc)_-HN2Qdq0^_ae~6TUvKT;g(NvO-hgQH0jaX!TT88xkNXUJf*Emb)p4%)T)^pe zA(j9OL9FKwmYiMMzLET@q8BroLc=s$zEZP!NUWjDL;u^hkN|9e@3WB;&2|Nuft$l7 z6VSsPlI2zVxf=w%`pdPUHn+(!y%K6f?}i)CpT_0Xrg9v}e#i@?Ae&WWb4liKOm#gY zn6i$Zeuf-^JOy2f<)i$XC6aoic(%6r%xbBN+?e3V81&VV7$ef<7G_G(ofH}}k6x@& zto~iXte#$s?*N@oFtYZXHv$W|H5!*+RQ@uOHqpFUSs-%llKKcTuWl7-HMU0$JZ9X) ziT9ODVP>x@P8gKD{nb`>j%D~=?6&9AY~tMx?7Ql{Q{+rc7YGp}OF3<^L%zV&z^J2B z_t?`5M+m^^T=L9c9riDnpWct~S8;Q(U+R9o>2u($iPGCi^0BVqE1T+gef&+Smb=g@9%!kK#VM_S?;1P?Td2VhN6`SNt1z6D%%C-R7Uvu z;p_|he=hWqUb}g1CxlITHXBJGU8Dfa|B@q&2AWOt)OVrq9+FD)+lCb8qS7pxNP7$` zoqpJH9|t}Jyh$H;4`l3EJ_SP7$0WU`PGty5G9D2)^NdZ!vLq2Ee-<_-pC)tD`|V zpv59sxkGn-#K@1B4Tmft$X?u1<5yu{;EEYO>nYba59bHV3k6qwT>qnw-L)QH6%T!i zh&+qUAX{t|*4z+Rh`EQzierO!$ColPUdOasp-##ueYTg>=LUu-#iGRU?_dY!vGMW| zVlO*d;7xl}E&-FeKGke@4nYhhq}QT?-(#&UU>1ESwaMVOF4AsWuhVxga| z_c6-;BH|pV#G{^CrLbgY4SrDZP6)vU%<2c0tb52lq3_*1Gk6!PRWBx3&Nag$1RX$J zoVp;{?BiBD1!{)!6fW^z)|P|-_4zyy$w2E2)TJ6^uH@6A8d!NO#J(`GF8PE!;(riq zmIB|z8|nQ2$lyKj65cFX-gD~^x`%;gsCP>IrwsnmG%oSm1!dsMiZJ`|=a-hN7S7<# z*HiH<>)Zj_!p55`99?-;1Vdymvm`O-&HN#*crvj7bg_P-6%WMLJCK?b^Fpp#tE;w> z!3EuyK5eK!SA*72b(yqb!rJBGdYLyn=;!$?0mwV0My0%MwKQ_OqU*!>44x&|*+_wZ;;PX!u^dXsR7-#TU zh(hMRMAevB#wWs#BC`Wu{7k-pUs&l)#1+dyaJLrWH)r4m74SIC)yfNbW!yq+&frdw zz^Tz?{z=3%2^=cgo6OA>8`@f)x&%Vrp^|I4usA?xEogZ>ZS&(A%9;H*>_a&B&QTKXZ0V&tpu+;VPPji?%M^}bA{+T(|SU_>D(exWUL_Tr15byz<6 zQ8DH_*(^BOY{|TQ+Nhs}_&ZBA8%d#G$mj5P+@A%5EeCeVi^4)%|3=EK7d*ck{$e%V zVivq0Z)Xv#NHa1w1pf)(s{1Oqa!YE2h_|@f6t?5A$tW%>rCjI7l4K&tAtbch8G;VC z^2FPT*&?Q&|C0PF)dT#V3Ut8B6wh+iX>3oIi316M6=qe3H;p`IMJZ7+LCzdA_=^Q^ zV3y9Z&h-|o+%{_ZAL8s-%;i7i`>#?A~|%yxnY(!i63V4|)KiS6{2 z*)!~Bqxd!${S;Q z7P6g&4c~_atdg0;Z%B844*VeaG&oTsp7YW)hwbSPF<=rC9&6cD{fIx_j|?x2);i18 zt`1LOJNZG)i`ivZl40Q zy%=<9LCLr$_k0gLGLsy@<`pz%!MRqUoVwK_V6uk&BZO-8`pyGB%Eocw?~&#wMw{@) zTJhmpR6v@iw1S>EeTcw~*$aB9AQH}j&9Q(^AY#A%{RhLaDQUIu5q-+TZN?)> zRN=Y_`?=!)NcV@)=%!Pmb#f0&1O#&WsDRM1hH(dPi2N@y`oSE`ypx8s*G+vndx4I- zWmMquTBx(rp7ETC@kQP*jz%!2hc+}CU_Ce{)Oo{=49-oID^h?+y54g#SXWort()2i zO-p%(tz zvzb^nZVq@Ap2sA*3+woCFun>tT=m#}x`A8aJ+9f11;Gw%UPZg^Jgy3AKow`f$8T_X zY{(vb7Wl`Nw5Ss$peB@O#^c<)3l+ONjx%S;mU)MDveJX!G%uI!pT|z=c6zao zNzYNdc@8=wg+IRLDoZTxySB8~FVr2Oo50O|2GRqA@4QhNuR1%A3!b3@^NWuo*-qhr z3J0S{)a|9+I-QYCIh@dNA6+q#_!zwE|2;1uB~I7Vp8WIj{#kOh%)n12vC?yZugP@J4or*57~puf{dGqerqLwWflfcA-Mex2 zNR&h2OK#O+!6(?yv&*|l=wP)hSs_j8$WbK909w29>JIkSok{7r_UQh%jnZ@G+P&9R zp@wHX%O*{Q>6~TkDqM9;ZPQpBQn|_A3XPuZTQ3pGV>?XnlnZ_Y`1%8e;*htgUd-3U z#Pe_T1R>e;*x$V}J~B`P8e&r24Rb-ue>c<4%L)~N|HyUPdZZq;2DJ_9h<6at1K>$f zB2uWKEoK9)&*_=^#-zkZZ&kgNB#d&Vg~oO2Wk as%yH{!;inVn)l}dpT%)&)8ap!BmNIp+8Rv& literal 0 HcmV?d00001 From 3895efbccc70cecede1d99077a601ea52b2d197a Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Thu, 20 Jun 2024 03:02:20 -0400 Subject: [PATCH 74/90] Add low log walls to fantasy map --- maps/shaded_hills/shaded_hills-inn.dmm | 4 ++++ maps/shaded_hills/shaded_hills-swamp.dmm | 1 + .../submaps/woods/suspicious_cabin/suspicious_cabin.dmm | 1 + 3 files changed, 6 insertions(+) diff --git a/maps/shaded_hills/shaded_hills-inn.dmm b/maps/shaded_hills/shaded_hills-inn.dmm index 7e02733fa57..42232f5d5ef 100644 --- a/maps/shaded_hills/shaded_hills-inn.dmm +++ b/maps/shaded_hills/shaded_hills-inn.dmm @@ -34,6 +34,7 @@ /area/shaded_hills/inn) "dH" = ( /obj/structure/window/basic/full, +/obj/structure/wall_frame/log/ebony, /turf/wall/log/ebony, /area/shaded_hills/general_store) "dK" = ( @@ -166,6 +167,7 @@ /area/shaded_hills/inn) "iX" = ( /obj/structure/window/basic/full, +/obj/structure/wall_frame/log/ebony, /turf/floor/natural/path/basalt, /area/shaded_hills/inn) "iZ" = ( @@ -519,6 +521,7 @@ /area/shaded_hills/inn) "HE" = ( /obj/structure/window/basic/full, +/obj/structure/wall_frame/log/ebony, /turf/floor/natural/path/basalt, /area/shaded_hills/stable) "HF" = ( @@ -547,6 +550,7 @@ /area/shaded_hills/tannery) "IQ" = ( /obj/structure/window/basic/full, +/obj/structure/wall_frame/log/ebony, /turf/floor/natural/path/basalt, /area/shaded_hills/farmhouse) "IS" = ( diff --git a/maps/shaded_hills/shaded_hills-swamp.dmm b/maps/shaded_hills/shaded_hills-swamp.dmm index c4b92d251aa..2526bb0beb3 100644 --- a/maps/shaded_hills/shaded_hills-swamp.dmm +++ b/maps/shaded_hills/shaded_hills-swamp.dmm @@ -1,6 +1,7 @@ //MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE "aM" = ( /obj/structure/window/basic/full, +/obj/structure/wall_frame/log/ebony, /turf/floor/natural/path/basalt, /area/shaded_hills/witch_hut) "bg" = ( diff --git a/maps/shaded_hills/submaps/woods/suspicious_cabin/suspicious_cabin.dmm b/maps/shaded_hills/submaps/woods/suspicious_cabin/suspicious_cabin.dmm index 0d2427bf746..2032c706884 100644 --- a/maps/shaded_hills/submaps/woods/suspicious_cabin/suspicious_cabin.dmm +++ b/maps/shaded_hills/submaps/woods/suspicious_cabin/suspicious_cabin.dmm @@ -48,6 +48,7 @@ /area/template_noop) "v" = ( /obj/structure/window/basic/full, +/obj/structure/wall_frame/log/ebony, /turf/floor/natural/path/basalt, /area/template_noop) "w" = ( From 27281520b9756908be52ead231be6c6191e5067c Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Thu, 20 Jun 2024 05:05:48 -0400 Subject: [PATCH 75/90] Move Revolution gamemode into a modpack --- code/game/antagonist/antagonist_factions.dm | 18 ------------------ maps/exodus/exodus.dm | 1 + maps/ministation/ministation.dm | 1 + maps/modpack_testing/modpack_testing.dm | 1 + maps/tradeship/tradeship.dm | 1 + mods/gamemodes/mixed/_mixed.dme | 6 ++++++ {code/game => mods}/gamemodes/mixed/siege.dm | 0 .../game => mods}/gamemodes/mixed/uprising.dm | 0 mods/gamemodes/revolution/_revolution.dm | 2 ++ mods/gamemodes/revolution/_revolution.dme | 9 +++++++++ .../gamemodes/revolution/gamemode.dm | 0 .../gamemodes/revolution}/loyalist.dm | 9 +++++++++ .../gamemodes/revolution}/revolutionary.dm | 9 +++++++++ nebula.dme | 5 ----- 14 files changed, 39 insertions(+), 23 deletions(-) rename {code/game => mods}/gamemodes/mixed/siege.dm (100%) rename {code/game => mods}/gamemodes/mixed/uprising.dm (100%) create mode 100644 mods/gamemodes/revolution/_revolution.dm create mode 100644 mods/gamemodes/revolution/_revolution.dme rename code/game/gamemodes/revolution/revolution.dm => mods/gamemodes/revolution/gamemode.dm (100%) rename {code/game/antagonist/station => mods/gamemodes/revolution}/loyalist.dm (87%) rename {code/game/antagonist/station => mods/gamemodes/revolution}/revolutionary.dm (88%) diff --git a/code/game/antagonist/antagonist_factions.dm b/code/game/antagonist/antagonist_factions.dm index 85f408f643f..07e12dd921f 100644 --- a/code/game/antagonist/antagonist_factions.dm +++ b/code/game/antagonist/antagonist_factions.dm @@ -1,12 +1,3 @@ -/mob/living/proc/convert_to_rev(mob/M in able_mobs_in_oview(src)) - set name = "Recruit to Faction" - set category = "Abilities" - - if(!M.mind || !M.client) - return - - convert_to_faction(M.mind, GET_DECL(/decl/special_role/revolutionary)) - /mob/living/proc/convert_to_faction(var/datum/mind/player, var/decl/special_role/faction) if(!player || !faction || !player.current) @@ -46,12 +37,3 @@ else to_chat(player, "You reject this traitorous cause!") to_chat(src, "\The [player.current] does not support the [faction.faction_descriptor]!") - -/mob/living/proc/convert_to_loyalist(mob/M in able_mobs_in_oview(src)) - set name = "Convince Recidivist" - set category = "Abilities" - - if(!M.mind || !M.client) - return - - convert_to_faction(M.mind, GET_DECL(/decl/special_role/loyalist)) diff --git a/maps/exodus/exodus.dm b/maps/exodus/exodus.dm index eb01d538063..d3db328f744 100644 --- a/maps/exodus/exodus.dm +++ b/maps/exodus/exodus.dm @@ -4,6 +4,7 @@ #include "../../mods/gamemodes/heist/_heist.dme" #include "../../mods/gamemodes/meteor/_meteor.dme" #include "../../mods/gamemodes/ninja/_ninja.dme" + #include "../../mods/gamemodes/revolution/_revolution.dme" #include "../../mods/gamemodes/mixed/_mixed.dme" #include "../../mods/content/mundane.dm" diff --git a/maps/ministation/ministation.dm b/maps/ministation/ministation.dm index 9fb79148062..fbabff707e0 100644 --- a/maps/ministation/ministation.dm +++ b/maps/ministation/ministation.dm @@ -17,6 +17,7 @@ Twice... #include "../../mods/gamemodes/heist/_heist.dme" #include "../../mods/gamemodes/ninja/_ninja.dme" + #include "../../mods/gamemodes/revolution/_revolution.dme" #include "../../mods/gamemodes/mixed/_mixed.dme" #include "../random_ruins/exoplanet_ruins/playablecolony/playablecolony.dm" diff --git a/maps/modpack_testing/modpack_testing.dm b/maps/modpack_testing/modpack_testing.dm index 0e3bd51dec3..2baba870f3d 100644 --- a/maps/modpack_testing/modpack_testing.dm +++ b/maps/modpack_testing/modpack_testing.dm @@ -7,6 +7,7 @@ #include "../../mods/gamemodes/heist/_heist.dme" #include "../../mods/gamemodes/meteor/_meteor.dme" #include "../../mods/gamemodes/ninja/_ninja.dme" + #include "../../mods/gamemodes/revolution/_revolution.dme" #include "../../mods/gamemodes/mixed/_mixed.dme" #include "../../mods/content/mundane.dm" diff --git a/maps/tradeship/tradeship.dm b/maps/tradeship/tradeship.dm index 7a0e37452d0..216ad790400 100644 --- a/maps/tradeship/tradeship.dm +++ b/maps/tradeship/tradeship.dm @@ -6,6 +6,7 @@ #include "../../mods/gamemodes/heist/_heist.dme" #include "../../mods/gamemodes/ninja/_ninja.dme" + #include "../../mods/gamemodes/revolution/_revolution.dme" #include "../../mods/gamemodes/mixed/_mixed.dme" #include "../random_ruins/exoplanet_ruins/playablecolony/playablecolony.dm" diff --git a/mods/gamemodes/mixed/_mixed.dme b/mods/gamemodes/mixed/_mixed.dme index 61cdbf05402..411ab39aa4c 100644 --- a/mods/gamemodes/mixed/_mixed.dme +++ b/mods/gamemodes/mixed/_mixed.dme @@ -5,5 +5,11 @@ #if defined(GAMEMODE_PACK_HEIST) // TODO: && defined(GAMEMODE_PACK_MERCENARY) #include "crossfire.dm" #endif +#if defined(GAMEMODE_PACK_REVOLUTIONARY) +#include "siege.dm" +#endif +#if defined(GAMEMODE_PACK_REVOLUTIONARY) // TODO: && defined(GAMEMODE_PACK_CULT) +#include "uprising.dm" +#endif // END_INCLUDE #endif \ No newline at end of file diff --git a/code/game/gamemodes/mixed/siege.dm b/mods/gamemodes/mixed/siege.dm similarity index 100% rename from code/game/gamemodes/mixed/siege.dm rename to mods/gamemodes/mixed/siege.dm diff --git a/code/game/gamemodes/mixed/uprising.dm b/mods/gamemodes/mixed/uprising.dm similarity index 100% rename from code/game/gamemodes/mixed/uprising.dm rename to mods/gamemodes/mixed/uprising.dm diff --git a/mods/gamemodes/revolution/_revolution.dm b/mods/gamemodes/revolution/_revolution.dm new file mode 100644 index 00000000000..f90a70bee36 --- /dev/null +++ b/mods/gamemodes/revolution/_revolution.dm @@ -0,0 +1,2 @@ +/decl/modpack/revolution + name = "Revolution Gamemode" \ No newline at end of file diff --git a/mods/gamemodes/revolution/_revolution.dme b/mods/gamemodes/revolution/_revolution.dme new file mode 100644 index 00000000000..5249d6659a5 --- /dev/null +++ b/mods/gamemodes/revolution/_revolution.dme @@ -0,0 +1,9 @@ +#ifndef GAMEMODE_PACK_REVOLUTION +#define GAMEMODE_PACK_REVOLUTION +// BEGIN_INCLUDE +#include "_revolution.dm" +#include "gamemode.dm" +#include "loyalist.dm" +#include "revolutionary.dm" +// END_INCLUDE +#endif \ No newline at end of file diff --git a/code/game/gamemodes/revolution/revolution.dm b/mods/gamemodes/revolution/gamemode.dm similarity index 100% rename from code/game/gamemodes/revolution/revolution.dm rename to mods/gamemodes/revolution/gamemode.dm diff --git a/code/game/antagonist/station/loyalist.dm b/mods/gamemodes/revolution/loyalist.dm similarity index 87% rename from code/game/antagonist/station/loyalist.dm rename to mods/gamemodes/revolution/loyalist.dm index 8b3ab1b6c9a..ff59a4eae54 100644 --- a/code/game/antagonist/station/loyalist.dm +++ b/mods/gamemodes/revolution/loyalist.dm @@ -41,3 +41,12 @@ loyal_obj.target = player.mind loyal_obj.explanation_text = "Protect [player.real_name], the [player.mind.assigned_role]." global_objectives += loyal_obj + +/mob/living/proc/convert_to_loyalist(mob/M in able_mobs_in_oview(src)) + set name = "Convince Recidivist" + set category = "Abilities" + + if(!M.mind || !M.client) + return + + convert_to_faction(M.mind, GET_DECL(/decl/special_role/loyalist)) \ No newline at end of file diff --git a/code/game/antagonist/station/revolutionary.dm b/mods/gamemodes/revolution/revolutionary.dm similarity index 88% rename from code/game/antagonist/station/revolutionary.dm rename to mods/gamemodes/revolution/revolutionary.dm index eb53a093461..e51486d733c 100644 --- a/code/game/antagonist/station/revolutionary.dm +++ b/mods/gamemodes/revolution/revolutionary.dm @@ -49,3 +49,12 @@ /decl/special_role/revolutionary/proc/spawn_uplink(var/mob/living/human/revolutionary_mob) setup_uplink_source(revolutionary_mob, DEFAULT_TELECRYSTAL_AMOUNT) + +/mob/living/proc/convert_to_rev(mob/M in able_mobs_in_oview(src)) + set name = "Recruit to Faction" + set category = "Abilities" + + if(!M.mind || !M.client) + return + + convert_to_faction(M.mind, GET_DECL(/decl/special_role/revolutionary)) \ No newline at end of file diff --git a/nebula.dme b/nebula.dme index a4bd7268497..47197401f61 100644 --- a/nebula.dme +++ b/nebula.dme @@ -730,10 +730,8 @@ #include "code\game\antagonist\outsider\mercenary.dm" #include "code\game\antagonist\outsider\wizard.dm" #include "code\game\antagonist\station\cultist.dm" -#include "code\game\antagonist\station\loyalist.dm" #include "code\game\antagonist\station\provocateur.dm" #include "code\game\antagonist\station\renegade.dm" -#include "code\game\antagonist\station\revolutionary.dm" #include "code\game\antagonist\station\thrall.dm" #include "code\game\antagonist\station\traitor.dm" #include "code\game\area\area_abstract.dm" @@ -764,9 +762,7 @@ #include "code\game\gamemodes\endgame\supermatter_cascade\universe.dm" #include "code\game\gamemodes\events\power_failure.dm" #include "code\game\gamemodes\extended\extended.dm" -#include "code\game\gamemodes\mixed\siege.dm" #include "code\game\gamemodes\mixed\spyvspy.dm" -#include "code\game\gamemodes\mixed\uprising.dm" #include "code\game\gamemodes\nuclear\nuclear.dm" #include "code\game\gamemodes\nuclear\pinpointer.dm" #include "code\game\gamemodes\objectives\_objective.dm" @@ -785,7 +781,6 @@ #include "code\game\gamemodes\objectives\objective_protect.dm" #include "code\game\gamemodes\objectives\objective_rev.dm" #include "code\game\gamemodes\objectives\objective_steal.dm" -#include "code\game\gamemodes\revolution\revolution.dm" #include "code\game\gamemodes\traitor\traitor.dm" #include "code\game\gamemodes\wizard\wizard.dm" #include "code\game\gamemodes\wizard\servant_items\caretaker.dm" From 89fe2c662fc373333ab7906da84d71e3653d7f3b Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Tue, 18 Jun 2024 17:58:25 -0400 Subject: [PATCH 76/90] Move Cult into a modpack --- code/__defines/misc.dm | 4 - code/_helpers/game.dm | 4 - code/_macros.dm | 2 - code/_onclick/hud/other_mobs.dm | 18 --- code/datums/mind/mind.dm | 19 --- code/datums/trading/traders/unique.dm | 8 - code/game/atoms.dm | 3 - .../game/gamemodes/cult/cultify/de-cultify.dm | 6 - .../endgame/supermatter_cascade/universe.dm | 4 - code/game/machinery/OpTable.dm | 5 +- code/game/objects/items/books/_book.dm | 3 + code/game/objects/items/devices/t_scanner.dm | 29 ++-- code/game/objects/items/spirit_board.dm | 7 - code/game/objects/items/weapons/weaponry.dm | 35 ++--- code/game/objects/structures/crematorium.dm | 108 ++++++------- code/game/objects/structures/doors/_door.dm | 3 - code/game/objects/structures/girders.dm | 12 -- .../stool_bed_chair_nest_sofa/bed.dm | 6 + code/game/objects/structures/tables.dm | 7 + .../turfs/flooring/flooring_reinforced.dm | 13 -- code/game/turfs/floors/_floor.dm | 8 - code/game/turfs/floors/subtypes/floor_cult.dm | 11 -- code/game/turfs/turf.dm | 12 +- code/game/turfs/unsimulated.dm | 3 - code/game/turfs/walls/_wall.dm | 14 -- code/game/turfs/walls/wall_natural.dm | 3 - code/game/turfs/walls/wall_types.dm | 28 ---- code/modules/materials/_materials.dm | 19 ++- .../liquids/materials_liquid_water.dm | 8 - .../solids/materials_solid_stone.dm | 21 --- code/modules/mob/living/human/human_blood.dm | 5 +- code/modules/mob/living/living.dm | 9 -- .../simple_animal/constructs/constructs.dm | 41 ++++- .../simple_animal/constructs/soulstone.dm | 27 ++-- .../mob/living/simple_animal/hostile/bat.dm | 7 - .../mob/living/simple_animal/hostile/leech.dm | 2 +- .../simple_animal/hostile/retaliate/drone.dm | 1 + .../modules/mob/living/simple_animal/shade.dm | 4 + code/modules/mob/mob_blood.dm | 17 +++ code/modules/mob/mob_transformation_simple.dm | 6 - code/modules/mob/observer/ghost/ghost.dm | 3 - code/modules/mob/transform_procs.dm | 12 -- code/modules/power/lighting.dm | 6 - code/modules/spells/general/mark_recall.dm | 14 +- code/modules/surgery/_surgery.dm | 41 +++-- .../xenoarcheaology/datums/artifact_find.dm | 25 ++- mods/gamemodes/cult/_cult.dm | 13 ++ mods/gamemodes/cult/_cult.dme | 28 ++++ .../gamemodes/cult/archaeology.dm | 4 +- mods/gamemodes/cult/cultify/de-cultify.dm | 7 + mods/gamemodes/cult/cultify/defile.dm | 2 + .../gamemodes/cult/cultify/mob.dm | 0 mods/gamemodes/cult/cultify/turf.dm | 62 ++++++++ mods/gamemodes/cult/flooring.dm | 12 ++ .../gamemodes/cult/gamemode.dm | 0 {code/game => mods}/gamemodes/cult/ghosts.dm | 38 +++++ .../gamemodes/cult/hell_universe.dm | 6 + mods/gamemodes/cult/holy.dm | 34 +++++ .../gamemodes/cult/items.dm | 0 mods/gamemodes/cult/materials.dm | 20 +++ mods/gamemodes/cult/mob_subtypes.dm | 6 + {code/game => mods}/gamemodes/cult/narsie.dm | 0 .../gamemodes/cult/objectives.dm | 0 mods/gamemodes/cult/overrides.dm | 27 ++++ {code/game => mods}/gamemodes/cult/ritual.dm | 30 +--- {code/game => mods}/gamemodes/cult/runes.dm | 142 ++++++++---------- .../gamemodes/cult/special_role.dm | 0 .../gamemodes/cult/spells}/construct.dm | 0 .../gamemodes/cult/spells}/harvest.dm | 0 .../gamemodes/cult/structures.dm | 15 ++ .../game => mods}/gamemodes/cult/talisman.dm | 0 .../forms/narsie/deity_items/smithing.dm | 7 +- nebula.dme | 17 --- 73 files changed, 572 insertions(+), 541 deletions(-) delete mode 100644 code/game/gamemodes/cult/cultify/de-cultify.dm delete mode 100644 code/game/turfs/floors/subtypes/floor_cult.dm create mode 100644 mods/gamemodes/cult/_cult.dm create mode 100644 mods/gamemodes/cult/_cult.dme rename code/modules/xenoarcheaology/finds/find_types/cult.dm => mods/gamemodes/cult/archaeology.dm (99%) create mode 100644 mods/gamemodes/cult/cultify/de-cultify.dm create mode 100644 mods/gamemodes/cult/cultify/defile.dm rename {code/game => mods}/gamemodes/cult/cultify/mob.dm (100%) create mode 100644 mods/gamemodes/cult/cultify/turf.dm create mode 100644 mods/gamemodes/cult/flooring.dm rename code/game/gamemodes/cult/cult.dm => mods/gamemodes/cult/gamemode.dm (100%) rename {code/game => mods}/gamemodes/cult/ghosts.dm (85%) rename {code/game => mods}/gamemodes/cult/hell_universe.dm (82%) create mode 100644 mods/gamemodes/cult/holy.dm rename code/game/gamemodes/cult/cult_items.dm => mods/gamemodes/cult/items.dm (100%) create mode 100644 mods/gamemodes/cult/materials.dm create mode 100644 mods/gamemodes/cult/mob_subtypes.dm rename {code/game => mods}/gamemodes/cult/narsie.dm (100%) rename code/game/gamemodes/objectives/objective_cult.dm => mods/gamemodes/cult/objectives.dm (100%) create mode 100644 mods/gamemodes/cult/overrides.dm rename {code/game => mods}/gamemodes/cult/ritual.dm (95%) rename {code/game => mods}/gamemodes/cult/runes.dm (74%) rename code/game/antagonist/station/cultist.dm => mods/gamemodes/cult/special_role.dm (100%) rename {code/modules/spells/aoe_turf/conjure => mods/gamemodes/cult/spells}/construct.dm (100%) rename {code/modules/spells/targeted => mods/gamemodes/cult/spells}/harvest.dm (100%) rename code/game/gamemodes/cult/cult_structures.dm => mods/gamemodes/cult/structures.dm (93%) rename {code/game => mods}/gamemodes/cult/talisman.dm (100%) diff --git a/code/__defines/misc.dm b/code/__defines/misc.dm index ec5eea099aa..0e8e7824d1c 100644 --- a/code/__defines/misc.dm +++ b/code/__defines/misc.dm @@ -244,10 +244,6 @@ //Inserts 'a' or 'an' before X in ways \a doesn't allow #define ADD_ARTICLE(X) "[(lowertext(X[1]) in global.vowels) ? "an" : "a"] [X]" -#define SOULSTONE_CRACKED -1 -#define SOULSTONE_EMPTY 0 -#define SOULSTONE_ESSENCE 1 - //Request Console Department Types #define RC_ASSIST 1 //Request Assistance #define RC_SUPPLY 2 //Request Supplies diff --git a/code/_helpers/game.dm b/code/_helpers/game.dm index be3098d69da..4f56b508d6c 100644 --- a/code/_helpers/game.dm +++ b/code/_helpers/game.dm @@ -402,10 +402,6 @@ /proc/SecondsToTicks(var/seconds) return seconds * 10 -/proc/round_is_spooky(var/spookiness_threshold = get_config_value(/decl/config/num/cult_ghostwriter_req_cultists)) - var/decl/special_role/cult = GET_DECL(/decl/special_role/cultist) - return (cult.current_antagonists.len > spookiness_threshold) - /proc/window_flash(var/client_or_usr) if (!client_or_usr) return diff --git a/code/_macros.dm b/code/_macros.dm index 9d2994b3eec..bb850690cf5 100644 --- a/code/_macros.dm +++ b/code/_macros.dm @@ -42,8 +42,6 @@ #define islizard(A) istype(A, /mob/living/simple_animal/lizard) -#define isconstruct(A) istype(A, /mob/living/simple_animal/construct) - #define isnewplayer(A) istype(A, /mob/new_player) #define isobj(A) istype(A, /obj) diff --git a/code/_onclick/hud/other_mobs.dm b/code/_onclick/hud/other_mobs.dm index e0b5d42e346..26437535d2b 100644 --- a/code/_onclick/hud/other_mobs.dm +++ b/code/_onclick/hud/other_mobs.dm @@ -1,21 +1,3 @@ -/mob/living/simple_animal/construct - hud_used = /datum/hud/construct - -/mob/living/simple_animal/construct/armoured - hud_used = /datum/hud/construct/juggernaut - -/mob/living/simple_animal/construct/behemoth - hud_used = /datum/hud/construct/juggernaut - -/mob/living/simple_animal/construct/builder - hud_used = /datum/hud/construct/artificer - -/mob/living/simple_animal/construct/wraith - hud_used = /datum/hud/construct/wraith - -/mob/living/simple_animal/construct/harvester - hud_used = /datum/hud/construct/harvester - /datum/hud/construct/get_ui_style_data() return GET_DECL(/decl/ui_style/construct) diff --git a/code/datums/mind/mind.dm b/code/datums/mind/mind.dm index 1f83b6b2b8f..d5886fc7f01 100644 --- a/code/datums/mind/mind.dm +++ b/code/datums/mind/mind.dm @@ -545,25 +545,6 @@ ..() mind.assigned_role = "Corgi" -/mob/living/simple_animal/shade/mind_initialize() - ..() - mind.assigned_role = "Shade" - -/mob/living/simple_animal/construct/builder/mind_initialize() - ..() - mind.assigned_role = "Artificer" - mind.assigned_special_role = "Cultist" - -/mob/living/simple_animal/construct/wraith/mind_initialize() - ..() - mind.assigned_role = "Wraith" - mind.assigned_special_role = "Cultist" - -/mob/living/simple_animal/construct/armoured/mind_initialize() - ..() - mind.assigned_role = "Juggernaut" - mind.assigned_special_role = "Cultist" - /datum/mind/proc/get_special_role_name(var/default_role_name) if(istext(assigned_special_role)) return assigned_special_role diff --git a/code/datums/trading/traders/unique.dm b/code/datums/trading/traders/unique.dm index 4ece0ed7bfd..4c8a9398cd2 100644 --- a/code/datums/trading/traders/unique.dm +++ b/code/datums/trading/traders/unique.dm @@ -105,14 +105,6 @@ ) possible_wanted_items = list( - /mob/living/simple_animal/construct = TRADER_SUBTYPES_ONLY, - /obj/item/sword/cultblade = TRADER_THIS_TYPE, - /obj/item/clothing/head/culthood = TRADER_ALL, - /obj/item/clothing/suit/space/cult = TRADER_ALL, - /obj/item/clothing/suit/cultrobes = TRADER_ALL, - /obj/item/clothing/head/helmet/space/cult = TRADER_ALL, - /obj/structure/cult = TRADER_SUBTYPES_ONLY, - /obj/structure/constructshell = TRADER_ALL, /mob/living/simple_animal/familiar = TRADER_SUBTYPES_ONLY, /mob/living/simple_animal/familiar/pet = TRADER_BLACKLIST, /mob/living/simple_animal/hostile/mimic = TRADER_ALL diff --git a/code/game/atoms.dm b/code/game/atoms.dm index 4f95eaea82d..afaf10c6f50 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -891,9 +891,6 @@ /atom/proc/singularity_pull(S, current_size) return -/atom/proc/on_defilement() - return - /atom/proc/get_overhead_text_x_offset() return 0 diff --git a/code/game/gamemodes/cult/cultify/de-cultify.dm b/code/game/gamemodes/cult/cultify/de-cultify.dm deleted file mode 100644 index 1a0a11f8b22..00000000000 --- a/code/game/gamemodes/cult/cultify/de-cultify.dm +++ /dev/null @@ -1,6 +0,0 @@ -/turf/unsimulated/wall/cult/attackby(var/obj/item/I, var/mob/user) - if(istype(I, /obj/item/nullrod)) - user.visible_message("\The [user] touches \the [src] with \the [I], and it shifts.", "You touch \the [src] with \the [I], and it shifts.") - ChangeTurf(/turf/unsimulated/wall) - return TRUE - return ..() \ No newline at end of file diff --git a/code/game/gamemodes/endgame/supermatter_cascade/universe.dm b/code/game/gamemodes/endgame/supermatter_cascade/universe.dm index 894a38c8bd7..8de40b0d123 100644 --- a/code/game/gamemodes/endgame/supermatter_cascade/universe.dm +++ b/code/game/gamemodes/endgame/supermatter_cascade/universe.dm @@ -39,10 +39,6 @@ var/global/universe_has_ended = 0 APCSet() OverlayAndAmbientSet() - // Disable Nar-Sie. - var/decl/special_role/cultist/cult = GET_DECL(/decl/special_role/cultist) - cult.allow_narsie = 0 - PlayerSet() SSskybox.change_skybox("cascade", new_use_stars = FALSE, new_use_overmap_details = FALSE) diff --git a/code/game/machinery/OpTable.dm b/code/game/machinery/OpTable.dm index e672e48f506..2388d201d9d 100644 --- a/code/game/machinery/OpTable.dm +++ b/code/game/machinery/OpTable.dm @@ -132,4 +132,7 @@ /obj/machinery/optable/power_change() . = ..() if(stat & (NOPOWER|BROKEN)) - suppressing = FALSE \ No newline at end of file + suppressing = FALSE + +/obj/machinery/optable/get_surgery_surface_quality(mob/living/victim, mob/living/user) + return OPERATE_IDEAL \ No newline at end of file diff --git a/code/game/objects/items/books/_book.dm b/code/game/objects/items/books/_book.dm index e58c0fed01d..6ccc01a0d78 100644 --- a/code/game/objects/items/books/_book.dm +++ b/code/game/objects/items/books/_book.dm @@ -17,6 +17,9 @@ var/carved = 0 // Has the book been hollowed out for use as a secret storage item? var/obj/item/store //What's in the book? var/last_modified_ckey + /// If TRUE, mild solvents can dissolve ink off the page. + /// If FALSE, the user instead receives a message about how the text doesn't seem to be normal ink. + var/can_dissolve_text = TRUE // Copied from paper. Todo: generalize. var/const/deffont = "Verdana" diff --git a/code/game/objects/items/devices/t_scanner.dm b/code/game/objects/items/devices/t_scanner.dm index b9e0a5369e0..1f8b7aff837 100644 --- a/code/game/objects/items/devices/t_scanner.dm +++ b/code/game/objects/items/devices/t_scanner.dm @@ -70,15 +70,15 @@ var/list/update_remove = active_scanned - scanned //Add new overlays - for(var/obj/O in update_add) - var/image/overlay = get_overlay(O) - active_scanned[O] = overlay + for(var/to_show in update_add) + var/image/overlay = get_overlay(to_show) + active_scanned[to_show] = overlay user_client.images += overlay //Remove stale overlays - for(var/obj/O in update_remove) - user_client.images -= active_scanned[O] - active_scanned -= O + for(var/to_remove in update_remove) + user_client.images -= active_scanned[to_remove] + active_scanned -= to_remove //creates a new overlay for a scanned object /obj/item/t_scanner/proc/get_overlay(var/atom/movable/scanned) @@ -120,6 +120,15 @@ if(overlay_cache.len > OVERLAY_CACHE_LEN) overlay_cache.Cut(1, overlay_cache.len-OVERLAY_CACHE_LEN-1) +/obj/item/t_scanner/proc/can_scan_mob(mob/victim) + if(isobserver(victim)) + return FALSE + if(victim.is_cloaked()) + return TRUE + if(victim.alpha < 255) + return TRUE + return FALSE + /obj/item/t_scanner/proc/get_scanned_objects(var/scan_dist) . = list() @@ -128,13 +137,7 @@ for(var/turf/T in range(scan_range, center)) for(var/mob/M in T.contents) - if(ishuman(M)) - var/mob/living/human/H = M - if(H.is_cloaked()) - . += M - else if(M.alpha < 255) - . += M - else if(round_is_spooky() && isobserver(M)) + if(can_scan_mob(M)) . += M if(!!T.is_plating()) diff --git a/code/game/objects/items/spirit_board.dm b/code/game/objects/items/spirit_board.dm index ad90bd0766b..dc3a3ecfb0c 100644 --- a/code/game/objects/items/spirit_board.dm +++ b/code/game/objects/items/spirit_board.dm @@ -19,13 +19,6 @@ spirit_board_pick_letter(user) return TRUE -//ATTACK GHOST IGNORING PARENT RETURN VALUE -/obj/item/spirit_board/attack_ghost(var/mob/observer/ghost/user) - var/decl/special_role/cultist/cult = GET_DECL(/decl/special_role/cultist) - if(cult.max_cult_rating >= CULT_GHOSTS_2) - spirit_board_pick_letter(user) - return ..() - /obj/item/spirit_board/proc/spirit_board_pick_letter(mob/M) if(!spirit_board_checks(M)) return 0 diff --git a/code/game/objects/items/weapons/weaponry.dm b/code/game/objects/items/weapons/weaponry.dm index 2177d4a6b2e..b1825375cde 100644 --- a/code/game/objects/items/weapons/weaponry.dm +++ b/code/game/objects/items/weapons/weaponry.dm @@ -20,11 +20,6 @@ user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) user.do_attack_animation(target) - if(target.mind && LAZYLEN(target.mind.learned_spells)) - target.silence_spells(300) //30 seconds - to_chat(target, SPAN_DANGER("You've been silenced!")) - return TRUE - if (!user.check_dexterity(DEXTERITY_WEAPONS)) return TRUE @@ -33,15 +28,19 @@ user.take_organ_damage(10) SET_STATUS_MAX(user, STAT_PARA, 20) return TRUE - - if(iscultist(target)) - target.visible_message(SPAN_NOTICE("\The [user] waves \the [src] over \the [target]'s head.")) - var/decl/special_role/cultist/cult = GET_DECL(/decl/special_role/cultist) - cult.offer_uncult(target) + + if (holy_act(target, user)) return TRUE return ..() +/obj/item/nullrod/proc/holy_act(mob/living/target, mob/living/user) + if(target.mind && LAZYLEN(target.mind.learned_spells)) + target.silence_spells(30 SECONDS) + to_chat(target, SPAN_DANGER("You've been silenced!")) + return TRUE + return FALSE + /obj/item/nullrod/afterattack(var/atom/A, var/mob/user, var/proximity) if(!proximity) return @@ -50,22 +49,6 @@ /atom/proc/nullrod_act(mob/user, obj/item/nullrod/rod) return FALSE -/turf/wall/cult/nullrod_act(mob/user, obj/item/nullrod/rod) - user.visible_message( - SPAN_NOTICE("\The [user] touches \the [src] with \the [rod], and the enchantment affecting it fizzles away."), - SPAN_NOTICE("You touch \the [src] with \the [rod], and the enchantment affecting it fizzles away.") - ) - ChangeTurf(/turf/wall) - return TRUE - -/turf/floor/cult/nullrod_act(mob/user, obj/item/nullrod/rod) - user.visible_message( - SPAN_NOTICE("\The [user] touches \the [src] with \the [rod], and the enchantment affecting it fizzles away."), - SPAN_NOTICE("You touch \the [src] with \the [rod], and the enchantment affecting it fizzles away.") - ) - ChangeTurf(/turf/floor, keep_air = TRUE) - return TRUE - /obj/item/energy_net name = "energy net" diff --git a/code/game/objects/structures/crematorium.dm b/code/game/objects/structures/crematorium.dm index 36c79b78e28..5fe9ba531cd 100644 --- a/code/game/objects/structures/crematorium.dm +++ b/code/game/objects/structures/crematorium.dm @@ -119,60 +119,7 @@ update_icon() for(var/mob/living/M in contents) - admin_attack_log(A, M, "Began cremating their victim.", "Has begun being cremated.", "began cremating") - if(isliving(M)) - for(var/I, I < 60, I++) - - if(M.stat >= UNCONSCIOUS || !(M in contents)) //In case we die or are removed at any point. - cremating = 0 - update_icon() - break - - sleep(0.5 SECONDS) - - if(QDELETED(src)) - return - - if(prob(40)) - var/desperation = rand(1,5) - switch(desperation) //This is messy. A better solution would probably be to make more sounds, but... - if(1) - playsound(loc, 'sound/weapons/genhit.ogg', 45, 1) - shake_animation(2) - playsound(loc, 'sound/weapons/genhit.ogg', 45, 1) - if(2) - playsound(loc, 'sound/effects/grillehit.ogg', 45, 1) - shake_animation(3) - playsound(loc, 'sound/effects/grillehit.ogg', 45, 1) - if(3) - playsound(src, 'sound/effects/bang.ogg', 45, 1) - if(prob(50)) - playsound(src, 'sound/effects/bang.ogg', 45, 1) - shake_animation() - else - shake_animation(5) - if(4) - playsound(src, 'sound/effects/clang.ogg', 45, 1) - shake_animation(5) - if(5) - playsound(src, 'sound/weapons/smash.ogg', 50, 1) - if(prob(50)) - playsound(src, 'sound/weapons/smash.ogg', 50, 1) - shake_animation(9) - else - shake_animation() - - if(round_is_spooky()) - if(prob(50)) - playsound(src, 'sound/effects/ghost.ogg', 10, 5) - else - playsound(src, 'sound/effects/ghost2.ogg', 10, 5) - - if (!M.stat) - M.audible_message("[M]'s screams cease, as does any movement within the [src]. All that remains is a dull, empty silence.") - - admin_attack_log(M, A, "Cremated their victim.", "Was cremated.", "cremated") - M.dust() + on_cremate_mob(A, M) for(var/obj/O in contents) //obj instead of obj/item so that bodybags and ashes get destroyed. We dont want tons and tons of ash piling up if(!istype(O, connected_tray)) @@ -184,6 +131,59 @@ locked = initial(locked) playsound(src, 'sound/effects/spray.ogg', 50, 1) update_icon() + +// This proc sucks. Actually, all of crematorium code just sucks. +// TODO: REWRITE OR REMOVE +/obj/structure/crematorium/proc/on_cremate_mob(atom/cause, mob/living/victim) + admin_attack_log(cause, victim, "Began cremating their victim.", "Has begun being cremated.", "began cremating") + if(isliving(victim)) + for(var/I, I < 60, I++) + + if(victim.stat >= UNCONSCIOUS || !(victim in contents)) //In case we die or are removed at any point. + cremating = 0 + update_icon() + break + + sleep(0.5 SECONDS) + + if(QDELETED(src)) + return FALSE + + if(prob(40)) + var/desperation = rand(1,5) + switch(desperation) //This is messy. A better solution would probably be to make more sounds, but... + if(1) + playsound(loc, 'sound/weapons/genhit.ogg', 45, 1) + shake_animation(2) + playsound(loc, 'sound/weapons/genhit.ogg', 45, 1) + if(2) + playsound(loc, 'sound/effects/grillehit.ogg', 45, 1) + shake_animation(3) + playsound(loc, 'sound/effects/grillehit.ogg', 45, 1) + if(3) + playsound(src, 'sound/effects/bang.ogg', 45, 1) + if(prob(50)) + playsound(src, 'sound/effects/bang.ogg', 45, 1) + shake_animation() + else + shake_animation(5) + if(4) + playsound(src, 'sound/effects/clang.ogg', 45, 1) + shake_animation(5) + if(5) + playsound(src, 'sound/weapons/smash.ogg', 50, 1) + if(prob(50)) + playsound(src, 'sound/weapons/smash.ogg', 50, 1) + shake_animation(9) + else + shake_animation() + + if (!victim.stat) + victim.audible_message("[victim]'s screams cease, as does any movement within \the [src]. All that remains is a dull, empty silence.") + + admin_attack_log(victim, cause, "Cremated their victim.", "Was cremated.", "cremated") + victim.dust() + return TRUE /obj/structure/crematorium_tray name = "crematorium tray" diff --git a/code/game/objects/structures/doors/_door.dm b/code/game/objects/structures/doors/_door.dm index 71c595d1ebf..6655f3ba9d3 100644 --- a/code/game/objects/structures/doors/_door.dm +++ b/code/game/objects/structures/doors/_door.dm @@ -210,9 +210,6 @@ /obj/structure/door/walnut material = /decl/material/solid/organic/wood/walnut -/obj/structure/door/cult - material = /decl/material/solid/stone/cult - /obj/structure/door/wood/saloon material = /decl/material/solid/organic/wood opacity = FALSE diff --git a/code/game/objects/structures/girders.dm b/code/game/objects/structures/girders.dm index fb75dc941f8..f082024b03f 100644 --- a/code/game/objects/structures/girders.dm +++ b/code/game/objects/structures/girders.dm @@ -193,18 +193,6 @@ if(severity == 1 || (severity == 2 && prob(30)) || (severity == 3 && prob(5))) physically_destroyed() -/obj/structure/girder/cult - icon= 'icons/obj/cult.dmi' - icon_state= "cultgirder" - max_health = 150 - cover = 70 - -/obj/structure/girder/cult/dismantle_structure(mob/user) - material = null - reinf_material = null - parts_type = null - . = ..() - /obj/structure/girder/wood material = /decl/material/solid/organic/wood/mahogany diff --git a/code/game/objects/structures/stool_bed_chair_nest_sofa/bed.dm b/code/game/objects/structures/stool_bed_chair_nest_sofa/bed.dm index b2a768c4491..0eeb2e0a3a4 100644 --- a/code/game/objects/structures/stool_bed_chair_nest_sofa/bed.dm +++ b/code/game/objects/structures/stool_bed_chair_nest_sofa/bed.dm @@ -36,6 +36,12 @@ /obj/structure/bed/get_base_value() . = round(..() * 2.5) // Utility structures should be worth more than their matter (wheelchairs, rollers, etc). +/obj/structure/bed/get_surgery_surface_quality(mob/living/victim, mob/living/user) + return OPERATE_PASSABLE + +/obj/structure/bed/get_surgery_success_modifier(delicate) + return delicate ? -5 : 0 + /obj/structure/bed/update_material_name() if(reinf_material) SetName("[reinf_material.adjective_name] [initial(name)]") diff --git a/code/game/objects/structures/tables.dm b/code/game/objects/structures/tables.dm index 81b883bdbb5..90bb9194d55 100644 --- a/code/game/objects/structures/tables.dm +++ b/code/game/objects/structures/tables.dm @@ -641,6 +641,13 @@ /obj/structure/table/handle_default_crowbar_attackby(var/mob/user, var/obj/item/crowbar) return !reinf_material && ..() +// For doing surgery on tables +/obj/structure/table/get_surgery_success_modifier(delicate) + return delicate ? -10 : 0 + +/obj/structure/table/get_surgery_surface_quality(mob/living/victim, mob/living/user) + return OPERATE_OKAY + // Table presets. /obj/structure/table/frame icon_state = "frame" diff --git a/code/game/turfs/flooring/flooring_reinforced.dm b/code/game/turfs/flooring/flooring_reinforced.dm index 087d78b0c13..128c23dc438 100644 --- a/code/game/turfs/flooring/flooring_reinforced.dm +++ b/code/game/turfs/flooring/flooring_reinforced.dm @@ -28,19 +28,6 @@ flags = TURF_ACID_IMMUNE can_paint = 0 -/decl/flooring/reinforced/cult - name = "engraved floor" - desc = "Unsettling whispers waver from the surface..." - icon = 'icons/turf/flooring/cult.dmi' - icon_base = "cult" - build_type = null - flags = TURF_ACID_IMMUNE | TURF_CAN_BREAK | TURF_REMOVE_WRENCH - can_paint = null - -/decl/flooring/reinforced/cult/on_remove() - var/decl/special_role/cultist/cult = GET_DECL(/decl/special_role/cultist) - cult.remove_cultiness(CULTINESS_PER_TURF) - /decl/flooring/reinforced/shuttle name = "floor" icon = 'icons/turf/flooring/shuttle.dmi' diff --git a/code/game/turfs/floors/_floor.dm b/code/game/turfs/floors/_floor.dm index 73987932617..81e35f0a6f5 100644 --- a/code/game/turfs/floors/_floor.dm +++ b/code/game/turfs/floors/_floor.dm @@ -145,14 +145,6 @@ /turf/floor/is_floor() return !density && !is_open() -/turf/floor/on_defilement() - if(flooring?.type != /decl/flooring/reinforced/cult) - ..() - set_flooring(GET_DECL(/decl/flooring/reinforced/cult)) - -/turf/floor/is_defiled() - return flooring?.type == /decl/flooring/reinforced/cult || ..() - /turf/floor/get_physical_height() return flooring?.height || 0 diff --git a/code/game/turfs/floors/subtypes/floor_cult.dm b/code/game/turfs/floors/subtypes/floor_cult.dm deleted file mode 100644 index 3fabc4b1b5c..00000000000 --- a/code/game/turfs/floors/subtypes/floor_cult.dm +++ /dev/null @@ -1,11 +0,0 @@ -/turf/floor/cult - name = "engraved floor" - icon = 'icons/turf/flooring/cult.dmi' - icon_state = "cult" - initial_flooring = /decl/flooring/reinforced/cult - -/turf/floor/cult/on_defilement() - return - -/turf/floor/cult/is_defiled() - return TRUE diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index d1025618167..38a5f021071 100644 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -415,9 +415,8 @@ return 0 /turf/proc/remove_cleanables() - for(var/obj/effect/O in src) - if(istype(O,/obj/effect/rune) || istype(O,/obj/effect/decal/cleanable)) - qdel(O) + for(var/obj/effect/decal/cleanable/cleanable in src) + qdel(cleanable) /turf/proc/remove_decals() LAZYCLEARLIST(decals) @@ -644,13 +643,6 @@ ChangeTurf(base_turf_type) return 2 -/turf/on_defilement() - var/decl/special_role/cultist/cult = GET_DECL(/decl/special_role/cultist) - cult.add_cultiness(CULTINESS_PER_TURF) - -/turf/proc/is_defiled() - return (locate(/obj/effect/narsie_footstep) in src) - /turf/proc/resolve_to_actual_turf() return src diff --git a/code/game/turfs/unsimulated.dm b/code/game/turfs/unsimulated.dm index 32416eceb20..a2beb5cbb91 100644 --- a/code/game/turfs/unsimulated.dm +++ b/code/game/turfs/unsimulated.dm @@ -15,6 +15,3 @@ /turf/unsimulated/get_lumcount(var/minlum = 0, var/maxlum = 1) return 0.8 - -/turf/unsimulated/on_defilement() - return diff --git a/code/game/turfs/walls/_wall.dm b/code/game/turfs/walls/_wall.dm index 3fd1d0b8604..768b15f8288 100644 --- a/code/game/turfs/walls/_wall.dm +++ b/code/game/turfs/walls/_wall.dm @@ -300,20 +300,6 @@ var/global/list/wall_fullblend_objects = list( /turf/wall/is_wall() return TRUE -/turf/wall/on_defilement() - var/new_material - if(material?.type != /decl/material/solid/stone/cult) - new_material = /decl/material/solid/stone/cult - var/new_rmaterial - if(reinf_material && reinf_material.type != /decl/material/solid/stone/cult/reinforced) - new_rmaterial = /decl/material/solid/stone/cult/reinforced - if(new_material || new_rmaterial) - ..() - set_turf_materials(new_material, new_rmaterial) - -/turf/wall/is_defiled() - return material?.type == /decl/material/solid/stone/cult || reinf_material?.type == /decl/material/solid/stone/cult/reinforced || ..() - /turf/wall/handle_universal_decay() handle_melting() diff --git a/code/game/turfs/walls/wall_natural.dm b/code/game/turfs/walls/wall_natural.dm index 568f3304e48..fc5ee9c5f0d 100644 --- a/code/game/turfs/walls/wall_natural.dm +++ b/code/game/turfs/walls/wall_natural.dm @@ -175,9 +175,6 @@ /turf/wall/natural/get_default_material() . = GET_DECL(get_strata_material_type() || /decl/material/solid/stone/sandstone) -/turf/wall/natural/on_defilement() - ChangeTurf(/turf/wall/cult) - /turf/wall/natural/get_strata_material_type() //Turf strata overrides level strata if(ispath(strata_override, /decl/strata)) diff --git a/code/game/turfs/walls/wall_types.dm b/code/game/turfs/walls/wall_types.dm index 0e3d96611a0..06cf0c0f02b 100644 --- a/code/game/turfs/walls/wall_types.dm +++ b/code/game/turfs/walls/wall_types.dm @@ -95,34 +95,6 @@ if(prob(explosion_resistance)) ..() -//Cult wall -/turf/wall/cult - icon_state = "cult" - color = COLOR_RED_GRAY - material = /decl/material/solid/stone/cult - -/turf/wall/cult/on_defilement() - return - -/turf/wall/cult/is_defiled() - return TRUE - -/turf/wall/cult/reinf - icon_state = "reinforced_cult" - reinf_material = /decl/material/solid/stone/cult/reinforced - -/turf/wall/cult/dismantle_turf(devastated, explode, no_product, keep_air = TRUE) - var/decl/special_role/cultist/cult = GET_DECL(/decl/special_role/cultist) - cult.remove_cultiness(CULTINESS_PER_TURF) - . = ..() - -/turf/wall/cult/can_join_with(var/turf/wall/W) - if(material && W.material && material.icon_base == W.material.icon_base) - return 1 - else if(istype(W, /turf/wall)) - return 1 - return 0 - /turf/wall/shuttle material = /decl/material/solid/metal/titanium paint_color = COLOR_BEIGE diff --git a/code/modules/materials/_materials.dm b/code/modules/materials/_materials.dm index ef21c24679d..79ffebfee71 100644 --- a/code/modules/materials/_materials.dm +++ b/code/modules/materials/_materials.dm @@ -635,23 +635,22 @@ INITIALIZE_IMMEDIATE(/obj/effect/gas_overlay) /decl/material/proc/on_leaving_metabolism(datum/reagents/metabolism/holder) return -#define ACID_MELT_DOSE 10 /decl/material/proc/touch_obj(var/obj/O, var/amount, var/datum/reagents/holder) // Acid melting, cleaner cleaning, etc if(solvent_power >= MAT_SOLVENT_MILD) if(istype(O, /obj/item/paper)) var/obj/item/paper/paperaffected = O paperaffected.clearpaper() - to_chat(usr, SPAN_NOTICE("The solution dissolves the ink on the paper.")) - else if(istype(O, /obj/item/book) && REAGENT_VOLUME(holder, type) >= 5) - if(istype(O, /obj/item/book/tome)) - to_chat(usr, SPAN_WARNING("The solution does nothing. Whatever this is, it isn't normal ink.")) - else - var/obj/item/book/affectedbook = O + O.visible_message(SPAN_NOTICE("The solution dissolves the ink on the paper."), range = 1) + else if(istype(O, /obj/item/book) && amount >= 5) + var/obj/item/book/affectedbook = O + if(affectedbook.can_dissolve_text) affectedbook.dat = null - to_chat(usr, SPAN_NOTICE("The solution dissolves the ink on the book.")) + O.visible_message(SPAN_NOTICE("The solution dissolves the ink on the book."), range = 1) + else + O.visible_message(SPAN_WARNING("The solution does nothing. Whatever this is, it isn't normal ink."), range = 1) - if(solvent_power >= MAT_SOLVENT_STRONG && O.solvent_can_melt(solvent_power) && (istype(O, /obj/item) || istype(O, /obj/effect/vine)) && (REAGENT_VOLUME(holder, type) > solvent_melt_dose)) + if(solvent_power >= MAT_SOLVENT_STRONG && O.solvent_can_melt(solvent_power) && (istype(O, /obj/item) || istype(O, /obj/effect/vine)) && (amount > solvent_melt_dose)) O.visible_message(SPAN_DANGER("\The [O] dissolves!")) O.handle_melting() holder?.remove_reagent(type, solvent_melt_dose) @@ -664,7 +663,7 @@ INITIALIZE_IMMEDIATE(/obj/effect/gas_overlay) if(I.contaminated) I.decontaminate() if(dirtiness <= DIRTINESS_STERILE) - O.germ_level -= min(REAGENT_VOLUME(holder, type)*20, O.germ_level) + O.germ_level -= min(amount*20, O.germ_level) O.was_bloodied = null if(dirtiness <= DIRTINESS_CLEAN) O.clean() diff --git a/code/modules/materials/definitions/liquids/materials_liquid_water.dm b/code/modules/materials/definitions/liquids/materials_liquid_water.dm index bb5a7edcbeb..90ad34af075 100644 --- a/code/modules/materials/definitions/liquids/materials_liquid_water.dm +++ b/code/modules/materials/definitions/liquids/materials_liquid_water.dm @@ -38,14 +38,6 @@ affect_holy(M, removed, holder) /decl/material/liquid/water/proc/affect_holy(mob/living/M, removed, datum/reagents/holder) - if(iscultist(M)) - if(prob(10)) - var/decl/special_role/cultist/cult = GET_DECL(/decl/special_role/cultist) - cult.offer_uncult(M) - if(prob(2)) - var/obj/effect/spider/spiderling/S = new /obj/effect/spider/spiderling(M.loc) - M.visible_message(SPAN_WARNING("\The [M] coughs up \the [S]!")) - return TRUE return FALSE /decl/material/liquid/water/affect_ingest(var/mob/living/M, var/removed, var/datum/reagents/holder) diff --git a/code/modules/materials/definitions/solids/materials_solid_stone.dm b/code/modules/materials/definitions/solids/materials_solid_stone.dm index 0838a33c616..4f91cdbb4ea 100644 --- a/code/modules/materials/definitions/solids/materials_solid_stone.dm +++ b/code/modules/materials/definitions/solids/materials_solid_stone.dm @@ -115,24 +115,3 @@ /decl/material/solid/stone/concrete/get_wall_texture() return texture - -/decl/material/solid/stone/cult - name = "disturbing stone" - uid = "solid_stone_cult" - icon_base = 'icons/turf/walls/cult.dmi' - icon_reinf = 'icons/turf/walls/reinforced_cult.dmi' - color = "#402821" - shard_type = SHARD_STONE_PIECE - conductive = 0 - construction_difficulty = MAT_VALUE_NORMAL_DIY - hidden_from_codex = TRUE - reflectiveness = MAT_VALUE_DULL - exoplanet_rarity_plant = MAT_RARITY_NOWHERE - exoplanet_rarity_gas = MAT_RARITY_NOWHERE - -/decl/material/solid/stone/cult/place_dismantled_girder(var/turf/target) - return list(new /obj/structure/girder/cult(target)) - -/decl/material/solid/stone/cult/reinforced - name = "runic inscriptions" - uid = "solid_runes_cult" diff --git a/code/modules/mob/living/human/human_blood.dm b/code/modules/mob/living/human/human_blood.dm index f07a4c4635b..7e8d636e51f 100644 --- a/code/modules/mob/living/human/human_blood.dm +++ b/code/modules/mob/living/human/human_blood.dm @@ -121,12 +121,13 @@ return bled #undef BLOOD_SPRAY_DISTANCE -/mob/living/human/proc/remove_blood(var/amt) +/mob/living/human/remove_blood(amt, absolute = FALSE) if(!should_have_organ(BP_HEART)) //TODO: Make drips come from the reagents instead. return 0 if(!amt) return 0 - amt *= ((src.mob_size/MOB_SIZE_MEDIUM) ** 0.5) + if(!absolute) + amt *= ((src.mob_size/MOB_SIZE_MEDIUM) ** 0.5) return vessel.remove_any(amt) //Transfers blood from reagents to vessel, respecting blood types compatability. diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 492b862b19e..ad30353c155 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -677,15 +677,6 @@ default behaviour is: src.ckey = possessor.ckey qdel(possessor) - if(round_is_spooky(6)) // Six or more active cultists. - to_chat(src, "You reach out with tendrils of ectoplasm and invade the mind of \the [src]...") - to_chat(src, "You have assumed direct control of \the [src].") - to_chat(src, "Due to the spookiness of the round, you have taken control of the poor animal as an invading, possessing spirit - roleplay accordingly.") - src.universal_speak = TRUE - src.universal_understand = TRUE - //src.on_defilement() // Maybe another time. - return - to_chat(src, "You are now \the [src]!") to_chat(src, "Remember to stay in character for a mob of this type!") return 1 diff --git a/code/modules/mob/living/simple_animal/constructs/constructs.dm b/code/modules/mob/living/simple_animal/constructs/constructs.dm index ca68e7223b8..a3679fe1ed5 100644 --- a/code/modules/mob/living/simple_animal/constructs/constructs.dm +++ b/code/modules/mob/living/simple_animal/constructs/constructs.dm @@ -31,6 +31,7 @@ bleed_colour = "#331111" gene_damage = -1 butchery_data = /decl/butchery_data/occult + hud_used = /datum/hud/construct z_flags = ZMM_MANGLE_PLANES glowing_eyes = TRUE @@ -43,6 +44,9 @@ /mob/living/simple_animal/construct/on_defilement() return +/mob/living/simple_animal/construct/get_blood_name() + return "ichor" + /mob/living/simple_animal/construct/Initialize() . = ..() name = text("[initial(name)] ([random_id(/mob/living/simple_animal/construct, 1000, 9999)])") @@ -114,6 +118,7 @@ resistance = 10 construct_spells = list(/spell/aoe_turf/conjure/forcewall/lesser) can_escape = TRUE + hud_used = /datum/hud/construct/juggernaut /obj/item/natural_weapon/juggernaut name = "armored gauntlet" @@ -148,6 +153,10 @@ return (..(P)) +/mob/living/simple_animal/construct/armoured/mind_initialize() + ..() + mind.assigned_role = "Juggernaut" + mind.assigned_special_role = "Cultist" ////////////////////////Wraith///////////////////////////////////////////// @@ -165,6 +174,7 @@ environment_smash = 1 see_in_dark = 7 construct_spells = list(/spell/targeted/ethereal_jaunt/shift) + hud_used = /datum/hud/construct/wraith /obj/item/natural_weapon/wraith name = "wicked blade" @@ -174,6 +184,11 @@ edge = TRUE force = 25 +/mob/living/simple_animal/construct/wraith/mind_initialize() + ..() + mind.assigned_role = "Wraith" + mind.assigned_special_role = "Cultist" + /////////////////////////////Artificer///////////////////////// @@ -189,18 +204,26 @@ natural_weapon = /obj/item/natural_weapon/cult_builder speed = 0 environment_smash = 1 - construct_spells = list(/spell/aoe_turf/conjure/construct/lesser, - /spell/aoe_turf/conjure/wall, - /spell/aoe_turf/conjure/floor, - /spell/aoe_turf/conjure/soulstone, - /spell/aoe_turf/conjure/pylon - ) + construct_spells = list( + /spell/aoe_turf/conjure/construct/lesser, + /spell/aoe_turf/conjure/wall, + /spell/aoe_turf/conjure/floor, + /spell/aoe_turf/conjure/soulstone, + /spell/aoe_turf/conjure/pylon + ) + hud_used = /datum/hud/construct/artificer /obj/item/natural_weapon/cult_builder name = "heavy arms" attack_verb = list("rammed") force = 5 + +/mob/living/simple_animal/construct/builder/mind_initialize() + ..() + mind.assigned_role = "Artificer" + mind.assigned_special_role = "Cultist" + /////////////////////////////Behemoth///////////////////////// @@ -219,6 +242,7 @@ resistance = 10 construct_spells = list(/spell/aoe_turf/conjure/forcewall/lesser) can_escape = TRUE + hud_used = /datum/hud/construct/juggernaut /obj/item/natural_weapon/juggernaut/behemoth force = 50 @@ -237,10 +261,11 @@ speed = -1 environment_smash = 1 see_in_dark = 7 + hud_used = /datum/hud/construct/harvester construct_spells = list( - /spell/targeted/harvest - ) + /spell/targeted/harvest + ) /obj/item/natural_weapon/harvester name = "malicious spike" diff --git a/code/modules/mob/living/simple_animal/constructs/soulstone.dm b/code/modules/mob/living/simple_animal/constructs/soulstone.dm index 8d75231e733..0cec5497a87 100644 --- a/code/modules/mob/living/simple_animal/constructs/soulstone.dm +++ b/code/modules/mob/living/simple_animal/constructs/soulstone.dm @@ -1,3 +1,7 @@ +#define SOULSTONE_CRACKED -1 +#define SOULSTONE_EMPTY 0 +#define SOULSTONE_ESSENCE 1 + /obj/item/soulstone name = "soul stone shard" icon = 'icons/obj/items/soulstone.dmi' @@ -45,16 +49,19 @@ /obj/item/soulstone/attackby(var/obj/item/I, var/mob/user) ..() if(is_evil && istype(I, /obj/item/nullrod)) - to_chat(user, "You cleanse \the [src] of taint, purging its shackles to its creator..") + to_chat(user, SPAN_NOTICE("You cleanse \the [src] of taint, purging its shackles to its creator.")) is_evil = 0 return if(I.force >= 5) if(full != SOULSTONE_CRACKED) - user.visible_message("\The [user] hits \the [src] with \the [I], and it breaks.[shade.client ? " You hear a terrible scream!" : ""]", "You hit \the [src] with \the [I], and it cracks.[shade.client ? " You hear a terrible scream!" : ""]", shade.client ? "You hear a scream." : null) + user.visible_message( + SPAN_WARNING("\The [user] hits \the [src] with \the [I], and it breaks.[shade.client ? " You hear a terrible scream!" : ""]"), + SPAN_WARNING("You hit \the [src] with \the [I], and it cracks.[shade.client ? " You hear a terrible scream!" : ""]"), + shade.client ? SPAN_NOTICE("You hear a scream.") : null) playsound(loc, 'sound/effects/Glasshit.ogg', 75) set_full(SOULSTONE_CRACKED) else - user.visible_message("\The [user] shatters \the [src] with \the [I]!") + user.visible_message(SPAN_DANGER("\The [user] shatters \the [src] with \the [I]!")) shatter() /obj/item/soulstone/use_on_mob(mob/living/target, mob/living/user, animate = TRUE) @@ -76,22 +83,22 @@ /obj/item/soulstone/attack_self(var/mob/user) if(full != SOULSTONE_ESSENCE) // No essence - no shade - to_chat(user, "This [src] has no life essence.") + to_chat(user, SPAN_NOTICE("This [src] has no life essence.")) return if(!shade.key) // No key = hasn't been used - to_chat(user, "You cut your finger and let the blood drip on \the [src].") - user.remove_blood_simple(1) + to_chat(user, SPAN_NOTICE("You cut your finger and let the blood drip on \the [src].")) + user.remove_blood(1, absolute = TRUE) var/decl/ghosttrap/S = GET_DECL(/decl/ghosttrap/cult_shade) S.request_player(shade, "The soul stone shade summon ritual has been performed. ") else if(!shade.client) // Has a key but no client - shade logged out - to_chat(user, "\The [shade] in \the [src] is dormant.") + to_chat(user, SPAN_NOTICE("\The [shade] in \the [src] is dormant.")) return else if(shade.loc == src) var/choice = alert("Would you like to invoke the spirit within?",,"Yes","No") if(choice == "Yes") shade.dropInto(loc) - to_chat(user, "You summon \the [shade].") + to_chat(user, SPAN_NOTICE("You summon \the [shade].")) if(choice == "No") return @@ -113,10 +120,10 @@ if(istype(I, /obj/item/soulstone)) var/obj/item/soulstone/S = I if(!S.shade.client) - to_chat(user, "\The [I] has essence, but no soul. Activate it in your hand to find a soul for it first.") + to_chat(user, SPAN_NOTICE("\The [I] has essence, but no soul. Activate it in your hand to find a soul for it first.")) return if(S.shade.loc != S) - to_chat(user, "Recapture the shade back into \the [I] first.") + to_chat(user, SPAN_NOTICE("Recapture the shade back into \the [I] first.")) return var/construct = alert(user, "Please choose which type of construct you wish to create.",,"Artificer", "Wraith", "Juggernaut") var/ctype diff --git a/code/modules/mob/living/simple_animal/hostile/bat.dm b/code/modules/mob/living/simple_animal/hostile/bat.dm index a7f5e3bfb74..c378abffc2e 100644 --- a/code/modules/mob/living/simple_animal/hostile/bat.dm +++ b/code/modules/mob/living/simple_animal/hostile/bat.dm @@ -41,10 +41,3 @@ if(prob(15)) SET_STATUS_MAX(L, STAT_STUN, 1) L.visible_message("\the [src] scares \the [L]!") - -/mob/living/simple_animal/hostile/scarybat/cult - faction = "cult" - supernatural = 1 - -/mob/living/simple_animal/hostile/scarybat/cult/on_defilement() - return diff --git a/code/modules/mob/living/simple_animal/hostile/leech.dm b/code/modules/mob/living/simple_animal/hostile/leech.dm index 9d7cf629c02..f7c7cecb1eb 100644 --- a/code/modules/mob/living/simple_animal/hostile/leech.dm +++ b/code/modules/mob/living/simple_animal/hostile/leech.dm @@ -34,7 +34,7 @@ var/obj/item/clothing/suit/space/S = H.get_covering_equipped_item_by_zone(BP_CHEST) if(istype(S) && !length(S.breaches)) return - H.remove_blood_simple(suck_potency) + H.remove_blood(suck_potency, absolute = TRUE) if(current_health < get_max_health()) heal_overall_damage(suck_potency / 1.5) belly += clamp(suck_potency, 0, 100) diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/drone.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/drone.dm index 97955f07393..480645b38c1 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/drone.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/drone.dm @@ -20,6 +20,7 @@ destroy_surroundings = 0 gene_damage = -1 butchery_data = /decl/butchery_data/synthetic + bleed_colour = SYNTH_BLOOD_COLOR var/datum/effect/effect/system/trail/ion_trail diff --git a/code/modules/mob/living/simple_animal/shade.dm b/code/modules/mob/living/simple_animal/shade.dm index 5cc37d69bc0..dc93d7afb1e 100644 --- a/code/modules/mob/living/simple_animal/shade.dm +++ b/code/modules/mob/living/simple_animal/shade.dm @@ -48,3 +48,7 @@ if(. && !gibbed) new /obj/item/ectoplasm(src.loc) qdel(src) + +/mob/living/simple_animal/shade/mind_initialize() + ..() + mind.assigned_role = "Shade" \ No newline at end of file diff --git a/code/modules/mob/mob_blood.dm b/code/modules/mob/mob_blood.dm index b7523c9851b..4f28d6b8d62 100644 --- a/code/modules/mob/mob_blood.dm +++ b/code/modules/mob/mob_blood.dm @@ -11,6 +11,17 @@ var/decl/species/my_species = get_species() return my_species ? my_species.blood_oxy : TRUE +/mob/proc/get_blood_name() + return "blood" + +/mob/living/silicon/get_blood_name() + return "oil" + +/mob/living/human/get_blood_name() + if(species) + return species.get_blood_name(src) + return "blood" + //Gets blood from mob to the container, preserving all data in it. /mob/proc/take_blood(obj/item/chems/container, var/amount) var/decl/species/my_species = get_species() @@ -23,3 +34,9 @@ var/data = list() data["donor"] = weakref(src) return data + +/// Removes amt units of blood from src, if it has blood. +/// If absolute is FALSE, rescale amt according to mob size. +/// Returns the amount of blood removed. +/mob/proc/remove_blood(amt, absolute = FALSE) + return 0 \ No newline at end of file diff --git a/code/modules/mob/mob_transformation_simple.dm b/code/modules/mob/mob_transformation_simple.dm index 372ff1e6b38..f6f86ce4f6e 100644 --- a/code/modules/mob/mob_transformation_simple.dm +++ b/code/modules/mob/mob_transformation_simple.dm @@ -15,12 +15,6 @@ var/global/list/href_to_mob_type = list( "Coffee" = /mob/living/simple_animal/crab/Coffee, "Parrot" = /mob/living/simple_animal/hostile/retaliate/parrot, "Poly" = /mob/living/simple_animal/hostile/retaliate/parrot/Poly, - ), - "Constructs" = list( - "Armoured" = /mob/living/simple_animal/construct/armoured, - "Builder" = /mob/living/simple_animal/construct/builder, - "Wraith" = /mob/living/simple_animal/construct/wraith, - "Shade" = /mob/living/simple_animal/shade ) ) diff --git a/code/modules/mob/observer/ghost/ghost.dm b/code/modules/mob/observer/ghost/ghost.dm index f9026358567..5803cbb30a4 100644 --- a/code/modules/mob/observer/ghost/ghost.dm +++ b/code/modules/mob/observer/ghost/ghost.dm @@ -69,9 +69,6 @@ var/global/list/image/ghost_sightless_images = list() //this is a list of images name = capitalize(pick(global.using_map.first_names_male)) + " " + capitalize(pick(global.using_map.last_names)) real_name = name - var/decl/special_role/cultist/cult = GET_DECL(/decl/special_role/cultist) - cult.add_ghost_magic(src) - ghost_multitool = new(src) global.ghost_mob_list += src diff --git a/code/modules/mob/transform_procs.dm b/code/modules/mob/transform_procs.dm index 3d3d1406bc5..d46e56fd44e 100644 --- a/code/modules/mob/transform_procs.dm +++ b/code/modules/mob/transform_procs.dm @@ -222,18 +222,6 @@ if(!MP) return 0 //Sanity, this should never happen. - if(ispath(MP, /mob/living/simple_animal/construct/behemoth)) - return 0 //I think this may have been an unfinished WiP or something. These constructs should really have their own class simple_animal/construct/subtype - - if(ispath(MP, /mob/living/simple_animal/construct/armoured)) - return 0 //Verbs do not appear for players. These constructs should really have their own class simple_animal/construct/subtype - - if(ispath(MP, /mob/living/simple_animal/construct/wraith)) - return 0 //Verbs do not appear for players. These constructs should really have their own class simple_animal/construct/subtype - - if(ispath(MP, /mob/living/simple_animal/construct/builder)) - return 0 //Verbs do not appear for players. These constructs should really have their own class simple_animal/construct/subtype - //Good mobs! if(ispath(MP, /mob/living/simple_animal/cat)) return 1 diff --git a/code/modules/power/lighting.dm b/code/modules/power/lighting.dm index 0a450cd6b11..14b082723f1 100644 --- a/code/modules/power/lighting.dm +++ b/code/modules/power/lighting.dm @@ -355,12 +355,6 @@ user.put_in_active_hand(remove_bulb()) //puts it in our active hand return TRUE -// ghost attack - make lights flicker like an AI, but even spookier! -/obj/machinery/light/attack_ghost(mob/user) - if(round_is_spooky()) - src.flicker(rand(2,5)) - else return ..() - // break the light and make sparks if was on /obj/machinery/light/proc/broken(var/skip_sound_and_sparks = 0) if(!lightbulb) diff --git a/code/modules/spells/general/mark_recall.dm b/code/modules/spells/general/mark_recall.dm index 2895e63fbcf..a8e987c8d54 100644 --- a/code/modules/spells/general/mark_recall.dm +++ b/code/modules/spells/general/mark_recall.dm @@ -73,10 +73,16 @@ qdel(src) return TRUE +/obj/effect/cleanable/wizard_mark/nullrod_act(mob/user, obj/item/nullrod/rod) + user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) + visible_message("\The [user] dispels \the [src] and it fades away!") + qdel(src) + return TRUE + /obj/effect/cleanable/wizard_mark/attackby(var/obj/item/I, var/mob/user) - if(istype(I, /obj/item/nullrod) || istype(I, /obj/item/spellbook)) + if(istype(I, /obj/item/spellbook)) user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) - src.visible_message("\The [src] fades away!") + visible_message("\The [src] fades away!") qdel(src) - return - ..() \ No newline at end of file + return TRUE + return ..() \ No newline at end of file diff --git a/code/modules/surgery/_surgery.dm b/code/modules/surgery/_surgery.dm index 8be9dac5ef6..7ca2c764c28 100644 --- a/code/modules/surgery/_surgery.dm +++ b/code/modules/surgery/_surgery.dm @@ -208,17 +208,14 @@ var/global/list/surgery_tool_exception_cache = list() . -= 10 if(!target.current_posture.prone) . -= 30 - var/turf/T = get_turf(target) - if(locate(/obj/machinery/optable, T)) - . -= 0 - else if(locate(/obj/structure/bed, T)) - . -= 5 - else if(locate(/obj/structure/table, T)) - . -= 10 - else if(locate(/obj/effect/rune/, T)) - . -= 10 + var/turf/T = get_turf(target) + for(var/obj/interfering in T) + . += interfering.get_surgery_success_modifier(delicate) . = max(., 0) +/obj/proc/get_surgery_success_modifier(delicate) + return 0 + /proc/spread_germs_to_organ(var/obj/item/organ/external/E, var/mob/living/human/user) if(!istype(user) || !istype(E)) return @@ -322,22 +319,18 @@ var/global/list/surgery_tool_exception_cache = list() /obj/item/stack/handle_post_surgery() use(1) +/obj/proc/get_surgery_surface_quality(mob/living/victim) + return OPERATE_DENY + //check if mob is lying down on something we can operate him on. -/proc/can_operate(mob/living/M, mob/living/user) - var/turf/T = get_turf(M) - if(locate(/obj/machinery/optable, T)) - . = OPERATE_IDEAL - else if(locate(/obj/structure/table, T)) - . = OPERATE_OKAY - else if(locate(/obj/structure/bed, T)) - . = OPERATE_PASSABLE - else if(locate(/obj/effect/rune, T)) - . = OPERATE_PASSABLE - else - . = OPERATE_DENY - if(. != OPERATE_DENY && M == user) - var/hitzone = check_zone(user.get_target_zone(), M) - var/obj/item/organ/external/E = GET_EXTERNAL_ORGAN(M, M.get_active_held_item_slot()) +/proc/can_operate(mob/living/victim, mob/living/user) + var/turf/T = get_turf(victim) + for(var/obj/surface in T) + . = max(., surface.get_surgery_surface_quality(victim, user)) + if(. != OPERATE_DENY && victim == user) + var/hitzone = check_zone(user.get_target_zone(), victim) + var/obj/item/organ/external/E = GET_EXTERNAL_ORGAN(victim, victim.get_active_held_item_slot()) + // TODO: write some generalized helper for this that handles single-organ limbs, more-than-two-organ limbs, etc if(E && (E.organ_tag == hitzone || E.parent_organ == hitzone)) to_chat(user, SPAN_WARNING("You can't operate on the same arm you're using to hold the surgical tool!")) return OPERATE_DENY diff --git a/code/modules/xenoarcheaology/datums/artifact_find.dm b/code/modules/xenoarcheaology/datums/artifact_find.dm index 54bb2008584..3a1ff11920a 100644 --- a/code/modules/xenoarcheaology/datums/artifact_find.dm +++ b/code/modules/xenoarcheaology/datums/artifact_find.dm @@ -1,19 +1,18 @@ /datum/artifact_find var/artifact_id var/artifact_find_type + var/static/potential_finds = list( + /obj/machinery/power/supermatter = 5, + /obj/structure/constructshell = 5, + /obj/machinery/syndicate_beacon = 5, + /obj/machinery/power/supermatter/shard = 25, + /obj/machinery/auto_cloner = 100, + /obj/machinery/giga_drill = 100, + /obj/machinery/replicator = 100, + /obj/structure/crystal = 150, + /obj/structure/artifact = 1000 + ) /datum/artifact_find/New() - artifact_id = "[pick("kappa","sigma","antaeres","beta","omicron","iota","epsilon","omega","gamma","delta","tau","alpha")]-[random_id(/datum/artifact_find, 100, 999)]" - - artifact_find_type = pick( - 5;/obj/machinery/power/supermatter, - 5;/obj/structure/constructshell, - 5;/obj/machinery/syndicate_beacon, - 25;/obj/machinery/power/supermatter/shard, - 50;/obj/structure/cult/pylon, - 100;/obj/machinery/auto_cloner, - 100;/obj/machinery/giga_drill, - 100;/obj/machinery/replicator, - 150;/obj/structure/crystal, -1000;/obj/structure/artifact) \ No newline at end of file + artifact_find_type = pick(potential_finds) diff --git a/mods/gamemodes/cult/_cult.dm b/mods/gamemodes/cult/_cult.dm new file mode 100644 index 00000000000..6dada8891a0 --- /dev/null +++ b/mods/gamemodes/cult/_cult.dm @@ -0,0 +1,13 @@ +#define isconstruct(A) istype(A, /mob/living/simple_animal/construct) + +/decl/modpack/cult + name = "Cult Gamemode Content" + +/decl/modpack/cult/post_initialize() + . = ..() + global.href_to_mob_type["Constructs"] = list( + "Armoured" = /mob/living/simple_animal/construct/armoured, + "Builder" = /mob/living/simple_animal/construct/builder, + "Wraith" = /mob/living/simple_animal/construct/wraith, + "Shade" = /mob/living/simple_animal/shade + ) \ No newline at end of file diff --git a/mods/gamemodes/cult/_cult.dme b/mods/gamemodes/cult/_cult.dme new file mode 100644 index 00000000000..6322896262c --- /dev/null +++ b/mods/gamemodes/cult/_cult.dme @@ -0,0 +1,28 @@ +#ifndef GAMEMODE_PACK_CULT +#define GAMEMODE_PACK_CULT +// BEGIN_INCLUDE +#include "_cult.dm" +#include "flooring.dm" +#include "gamemode.dm" +#include "ghosts.dm" +#include "hell_universe.dm" +#include "holy.dm" +#include "items.dm" +#include "materials.dm" +#include "mob_subtypes.dm" +#include "narsie.dm" +#include "objectives.dm" +#include "overrides.dm" +#include "ritual.dm" +#include "runes.dm" +#include "special_role.dm" +#include "structures.dm" +#include "talisman.dm" +#include "cultify\de-cultify.dm" +#include "cultify\defile.dm" +#include "cultify\mob.dm" +#include "cultify\turf.dm" +#include "spells\construct.dm" +#include "spells\harvest.dm" +// END_INCLUDE +#endif \ No newline at end of file diff --git a/code/modules/xenoarcheaology/finds/find_types/cult.dm b/mods/gamemodes/cult/archaeology.dm similarity index 99% rename from code/modules/xenoarcheaology/finds/find_types/cult.dm rename to mods/gamemodes/cult/archaeology.dm index 3826931d442..94f4338aa34 100644 --- a/code/modules/xenoarcheaology/finds/find_types/cult.dm +++ b/mods/gamemodes/cult/archaeology.dm @@ -1,5 +1,3 @@ - - /decl/archaeological_find/cult item_type = "garments" responsive_reagent = /decl/material/solid/potassium @@ -22,4 +20,4 @@ possible_types = list( /obj/item = 4, /obj/item/soulstone - ) \ No newline at end of file + ) \ No newline at end of file diff --git a/mods/gamemodes/cult/cultify/de-cultify.dm b/mods/gamemodes/cult/cultify/de-cultify.dm new file mode 100644 index 00000000000..a1577b31d79 --- /dev/null +++ b/mods/gamemodes/cult/cultify/de-cultify.dm @@ -0,0 +1,7 @@ +/turf/unsimulated/wall/cult/nullrod_act(mob/user, obj/item/nullrod/rod) + user.visible_message( + SPAN_NOTICE("\The [user] touches \the [src] with \the [rod], and it shifts."), + SPAN_NOTICE("You touch \the [src] with \the [I], and it shifts.") + ) + ChangeTurf(/turf/unsimulated/wall) + return TRUE \ No newline at end of file diff --git a/mods/gamemodes/cult/cultify/defile.dm b/mods/gamemodes/cult/cultify/defile.dm new file mode 100644 index 00000000000..684a22c481b --- /dev/null +++ b/mods/gamemodes/cult/cultify/defile.dm @@ -0,0 +1,2 @@ +/atom/proc/on_defilement() + return \ No newline at end of file diff --git a/code/game/gamemodes/cult/cultify/mob.dm b/mods/gamemodes/cult/cultify/mob.dm similarity index 100% rename from code/game/gamemodes/cult/cultify/mob.dm rename to mods/gamemodes/cult/cultify/mob.dm diff --git a/mods/gamemodes/cult/cultify/turf.dm b/mods/gamemodes/cult/cultify/turf.dm new file mode 100644 index 00000000000..cacaec6517c --- /dev/null +++ b/mods/gamemodes/cult/cultify/turf.dm @@ -0,0 +1,62 @@ +/turf/on_defilement() + var/decl/special_role/cultist/cult = GET_DECL(/decl/special_role/cultist) + cult.add_cultiness(CULTINESS_PER_TURF) + +/turf/proc/is_defiled() + return (locate(/obj/effect/narsie_footstep) in src) + +/turf/floor/on_defilement() + if(flooring?.type != /decl/flooring/reinforced/cult) + ..() + set_flooring(GET_DECL(/decl/flooring/reinforced/cult)) + +/turf/floor/is_defiled() + return flooring?.type == /decl/flooring/reinforced/cult || ..() + +/turf/floor/cult + name = "engraved floor" + icon = 'icons/turf/flooring/cult.dmi' + icon_state = "cult" + initial_flooring = /decl/flooring/reinforced/cult + +/turf/wall/on_defilement() + var/new_material + if(material?.type != /decl/material/solid/stone/cult) + new_material = /decl/material/solid/stone/cult + var/new_rmaterial + if(reinf_material && reinf_material.type != /decl/material/solid/stone/cult/reinforced) + new_rmaterial = /decl/material/solid/stone/cult/reinforced + if(new_material || new_rmaterial) + ..() + set_turf_materials(new_material, new_rmaterial) + +/turf/wall/is_defiled() + return material?.type == /decl/material/solid/stone/cult || reinf_material?.type == /decl/material/solid/stone/cult/reinforced || ..() + +//Cult wall +/turf/wall/cult + icon_state = "cult" + color = COLOR_RED_GRAY + material = /decl/material/solid/stone/cult + +/turf/wall/cult/reinf + icon_state = "reinforced_cult" + reinf_material = /decl/material/solid/stone/cult/reinforced + +/turf/wall/cult/dismantle_turf(devastated, explode, no_product, keep_air = TRUE) + var/decl/special_role/cultist/cult = GET_DECL(/decl/special_role/cultist) + cult.remove_cultiness(CULTINESS_PER_TURF) + . = ..() + +/turf/wall/cult/can_join_with(var/turf/wall/W) + if(material && W.material && material.icon_base == W.material.icon_base) + return FALSE + else if(istype(W, /turf/wall)) + return TRUE + return FALSE + +/turf/wall/natural/on_defilement() + ChangeTurf(/turf/wall/cult) + +/turf/unsimulated/on_defilement() + return \ No newline at end of file diff --git a/mods/gamemodes/cult/flooring.dm b/mods/gamemodes/cult/flooring.dm new file mode 100644 index 00000000000..45409acc223 --- /dev/null +++ b/mods/gamemodes/cult/flooring.dm @@ -0,0 +1,12 @@ +/decl/flooring/reinforced/cult + name = "engraved floor" + desc = "Unsettling whispers waver from the surface..." + icon = 'icons/turf/flooring/cult.dmi' + icon_base = "cult" + build_type = null + flags = TURF_ACID_IMMUNE | TURF_CAN_BREAK | TURF_REMOVE_WRENCH + can_paint = null + +/decl/flooring/reinforced/cult/on_remove() + var/decl/special_role/cultist/cult = GET_DECL(/decl/special_role/cultist) + cult.remove_cultiness(CULTINESS_PER_TURF) \ No newline at end of file diff --git a/code/game/gamemodes/cult/cult.dm b/mods/gamemodes/cult/gamemode.dm similarity index 100% rename from code/game/gamemodes/cult/cult.dm rename to mods/gamemodes/cult/gamemode.dm diff --git a/code/game/gamemodes/cult/ghosts.dm b/mods/gamemodes/cult/ghosts.dm similarity index 85% rename from code/game/gamemodes/cult/ghosts.dm rename to mods/gamemodes/cult/ghosts.dm index 575a3e0363f..37800881859 100644 --- a/code/game/gamemodes/cult/ghosts.dm +++ b/mods/gamemodes/cult/ghosts.dm @@ -16,6 +16,36 @@ M.verbs += /mob/observer/ghost/proc/bloodless_doodle M.verbs += /mob/observer/ghost/proc/toggle_visiblity +/proc/round_is_spooky(var/spookiness_threshold = get_config_value(/decl/config/num/cult_ghostwriter_req_cultists)) + var/decl/special_role/cult = GET_DECL(/decl/special_role/cultist) + return (cult.current_antagonists.len > spookiness_threshold) + +// ghost attack - make lights flicker like an AI, but even spookier! +/obj/machinery/light/attack_ghost(mob/user) + if(round_is_spooky()) + src.flicker(rand(2,5)) + else return ..() + +/obj/item/t_scanner/can_scan_mob(mob/victim) + if(round_is_spooky() && isobserver(victim)) + return TRUE + return ..() + +/mob/living/do_possession(var/mob/observer/ghost/possessor) + if(round_is_spooky(6)) // Six or more active cultists. + to_chat(src, SPAN_NOTICE("You reach out with tendrils of ectoplasm and invade the mind of \the [src]...")) + to_chat(src, FONT_BOLD("You have assumed direct control of \the [src].")) + to_chat(src, SPAN_NOTICE("Due to the spookiness of the round, you have taken control of the poor animal as an invading, possessing spirit - roleplay accordingly.")) + src.universal_speak = TRUE + src.universal_understand = TRUE + //src.on_defilement() // Maybe another time. + return TRUE + +/mob/observer/ghost/Initialize() + var/decl/special_role/cultist/cult = GET_DECL(/decl/special_role/cultist) + cult.add_ghost_magic(src) + return ..() + /mob/observer/ghost/proc/ghost_ability_check() var/turf/T = get_turf(src) if(is_holy_turf(T)) @@ -288,3 +318,11 @@ to_chat(src, "You are now visible.") set_invisibility(INVISIBILITY_NONE) mouse_opacity = MOUSE_OPACITY_UNCLICKABLE // This is so they don't make people invincible to melee attacks by hovering over them + +//ATTACK GHOST IGNORING PARENT RETURN VALUE +// If we're spooky, ghosts can use the spirit board +/obj/item/spirit_board/attack_ghost(var/mob/observer/ghost/user) + var/decl/special_role/cultist/cult = GET_DECL(/decl/special_role/cultist) + if(cult.max_cult_rating >= CULT_GHOSTS_2) + spirit_board_pick_letter(user) + return ..() \ No newline at end of file diff --git a/code/game/gamemodes/cult/hell_universe.dm b/mods/gamemodes/cult/hell_universe.dm similarity index 82% rename from code/game/gamemodes/cult/hell_universe.dm rename to mods/gamemodes/cult/hell_universe.dm index 5133b72ba09..c5e5ad0adf0 100644 --- a/code/game/gamemodes/cult/hell_universe.dm +++ b/mods/gamemodes/cult/hell_universe.dm @@ -40,3 +40,9 @@ In short: for(var/mob/living/simple_animal/M in SSmobs.mob_list) if(M && !M.client) M.set_stat(DEAD) + +// Disable Narsie when we enter other (non-hell) universe states +/datum/universal_state/supermatter_cascade/OnEnter() + // Disable Nar-Sie. + var/decl/special_role/cultist/cult = GET_DECL(/decl/special_role/cultist) + cult.allow_narsie = 0 \ No newline at end of file diff --git a/mods/gamemodes/cult/holy.dm b/mods/gamemodes/cult/holy.dm new file mode 100644 index 00000000000..fce20c925af --- /dev/null +++ b/mods/gamemodes/cult/holy.dm @@ -0,0 +1,34 @@ +/decl/material/liquid/water/affect_holy(mob/living/M, removed, datum/reagents/holder) + if(iscultist(M)) + if(prob(10)) + var/decl/special_role/cultist/cult = GET_DECL(/decl/special_role/cultist) + cult.offer_uncult(M) + if(prob(2)) + var/obj/effect/spider/spiderling/S = new /obj/effect/spider/spiderling(M.loc) + M.visible_message(SPAN_WARNING("\The [M] coughs up \the [S]!")) + return TRUE + return FALSE + +/obj/item/nullrod/holy_act(mob/living/target, mob/living/user) + if(iscultist(target)) + target.visible_message(SPAN_NOTICE("\The [user] waves \the [src] over \the [target]'s head.")) + var/decl/special_role/cultist/cult = GET_DECL(/decl/special_role/cultist) + cult.offer_uncult(target) + return TRUE + return ..() + +/turf/wall/cult/nullrod_act(mob/user, obj/item/nullrod/rod) + user.visible_message( + SPAN_NOTICE("\The [user] touches \the [src] with \the [rod], and the enchantment affecting it fizzles away."), + SPAN_NOTICE("You touch \the [src] with \the [rod], and the enchantment affecting it fizzles away.") + ) + ChangeTurf(/turf/wall) + return TRUE + +/turf/floor/cult/nullrod_act(mob/user, obj/item/nullrod/rod) + user.visible_message( + SPAN_NOTICE("\The [user] touches \the [src] with \the [rod], and the enchantment affecting it fizzles away."), + SPAN_NOTICE("You touch \the [src] with \the [rod], and the enchantment affecting it fizzles away.") + ) + ChangeTurf(/turf/floor, keep_air = TRUE) + return TRUE \ No newline at end of file diff --git a/code/game/gamemodes/cult/cult_items.dm b/mods/gamemodes/cult/items.dm similarity index 100% rename from code/game/gamemodes/cult/cult_items.dm rename to mods/gamemodes/cult/items.dm diff --git a/mods/gamemodes/cult/materials.dm b/mods/gamemodes/cult/materials.dm new file mode 100644 index 00000000000..991d12c9844 --- /dev/null +++ b/mods/gamemodes/cult/materials.dm @@ -0,0 +1,20 @@ +/decl/material/solid/stone/cult + name = "disturbing stone" + uid = "solid_stone_cult" + icon_base = 'icons/turf/walls/cult.dmi' + icon_reinf = 'icons/turf/walls/reinforced_cult.dmi' + color = "#402821" + shard_type = SHARD_STONE_PIECE + conductive = 0 + construction_difficulty = MAT_VALUE_NORMAL_DIY + hidden_from_codex = TRUE + reflectiveness = MAT_VALUE_DULL + exoplanet_rarity_plant = MAT_RARITY_NOWHERE + exoplanet_rarity_gas = MAT_RARITY_NOWHERE + +/decl/material/solid/stone/cult/place_dismantled_girder(var/turf/target) + return list(new /obj/structure/girder/cult(target)) + +/decl/material/solid/stone/cult/reinforced + name = "runic inscriptions" + uid = "solid_runes_cult" diff --git a/mods/gamemodes/cult/mob_subtypes.dm b/mods/gamemodes/cult/mob_subtypes.dm new file mode 100644 index 00000000000..61e6b7c18b6 --- /dev/null +++ b/mods/gamemodes/cult/mob_subtypes.dm @@ -0,0 +1,6 @@ +/mob/living/simple_animal/hostile/scarybat/cult + faction = "cult" + supernatural = TRUE + +/mob/living/simple_animal/hostile/scarybat/cult/on_defilement() + return diff --git a/code/game/gamemodes/cult/narsie.dm b/mods/gamemodes/cult/narsie.dm similarity index 100% rename from code/game/gamemodes/cult/narsie.dm rename to mods/gamemodes/cult/narsie.dm diff --git a/code/game/gamemodes/objectives/objective_cult.dm b/mods/gamemodes/cult/objectives.dm similarity index 100% rename from code/game/gamemodes/objectives/objective_cult.dm rename to mods/gamemodes/cult/objectives.dm diff --git a/mods/gamemodes/cult/overrides.dm b/mods/gamemodes/cult/overrides.dm new file mode 100644 index 00000000000..c4aaab9411d --- /dev/null +++ b/mods/gamemodes/cult/overrides.dm @@ -0,0 +1,27 @@ +/datum/artifact_find/New() + var/static/injected = FALSE + if(!injected) + potential_finds[/obj/structure/cult/pylon] = 50 + injected = TRUE + ..() + +/obj/structure/crematorium/on_cremate_mob(atom/cause, mob/living/victim) + . = ..() + if(. && round_is_spooky()) + if(prob(50)) + playsound(src, 'sound/effects/ghost.ogg', 10, 5) + else + playsound(src, 'sound/effects/ghost2.ogg', 10, 5) + +/datum/trader/ship/unique/wizard/New() + possible_wanted_items |= list( + /mob/living/simple_animal/construct = TRADER_SUBTYPES_ONLY, + /obj/item/sword/cultblade = TRADER_THIS_TYPE, + /obj/item/clothing/head/culthood = TRADER_ALL, + /obj/item/clothing/suit/space/cult = TRADER_ALL, + /obj/item/clothing/suit/cultrobes = TRADER_ALL, + /obj/item/clothing/head/helmet/space/cult = TRADER_ALL, + /obj/structure/cult = TRADER_SUBTYPES_ONLY, + /obj/structure/constructshell = TRADER_ALL + ) + ..() \ No newline at end of file diff --git a/code/game/gamemodes/cult/ritual.dm b/mods/gamemodes/cult/ritual.dm similarity index 95% rename from code/game/gamemodes/cult/ritual.dm rename to mods/gamemodes/cult/ritual.dm index 30ddc153267..c10ad6e70cd 100644 --- a/code/game/gamemodes/cult/ritual.dm +++ b/mods/gamemodes/cult/ritual.dm @@ -7,6 +7,7 @@ w_class = ITEM_SIZE_SMALL unique = 1 carved = 2 // Don't carve it + can_dissolve_text = FALSE // Or dissolve it /obj/item/book/tome/attack_self(var/mob/user) if(!iscultist(user)) @@ -86,7 +87,7 @@ damage = 2 visible_message("\The [src] slices open a finger and begins to chant and paint symbols on the floor.", "[self]", "You hear chanting.") if(do_after(src, timer)) - remove_blood_simple(cost * damage) + remove_blood(cost * damage) if(locate(/obj/effect/rune) in T) return var/obj/effect/rune/R = new rune(T, get_blood_color(), get_blood_name()) @@ -102,32 +103,11 @@ return ..() -/mob/proc/remove_blood_simple(var/blood) - return - -/mob/living/human/remove_blood_simple(var/blood) - if(should_have_organ(BP_HEART)) - vessel.remove_any(blood) - -/mob/proc/get_blood_name() - return "blood" - -/mob/living/silicon/get_blood_name() - return "oil" - -/mob/living/human/get_blood_name() - if(species) - return species.get_blood_name(src) - return "blood" - -/mob/living/simple_animal/construct/get_blood_name() - return "ichor" - /mob/proc/mob_needs_tome() - return 0 + return FALSE /mob/living/human/mob_needs_tome() - return 1 + return TRUE var/global/list/Tier1Runes = list( /mob/proc/convert_rune, @@ -288,7 +268,7 @@ var/global/list/Tier4Runes = list( return message_cult_communicate() - remove_blood_simple(3) + remove_blood(3) var/input = input(src, "Please choose a message to tell to the other acolytes.", "Voice of Blood", "") if(!input) diff --git a/code/game/gamemodes/cult/runes.dm b/mods/gamemodes/cult/runes.dm similarity index 74% rename from code/game/gamemodes/cult/runes.dm rename to mods/gamemodes/cult/runes.dm index 9c426d7f622..f6de41b76ea 100644 --- a/code/game/gamemodes/cult/runes.dm +++ b/mods/gamemodes/cult/runes.dm @@ -46,11 +46,11 @@ /obj/effect/rune/attackby(var/obj/item/I, var/mob/user) if(istype(I, /obj/item/book/tome) && iscultist(user)) - user.visible_message("[user] rubs \the [src] with \the [I], and \the [src] is absorbed by it.", "You retrace your steps, carefully undoing the lines of \the [src].") + user.visible_message(SPAN_NOTICE("[user] rubs \the [src] with \the [I], and \the [src] is absorbed by it."), "You retrace your steps, carefully undoing the lines of \the [src].") qdel(src) return else if(istype(I, /obj/item/nullrod)) - user.visible_message("[user] hits \the [src] with \the [I], and it disappears, fizzling.", "You disrupt the vile magic with the deadening field of \the [I].", "You hear a fizzle.") + user.visible_message(SPAN_NOTICE("[user] hits \the [src] with \the [I], and it disappears, fizzling."), SPAN_NOTICE("You disrupt the vile magic with the deadening field of \the [I]."), "You hear a fizzle.") qdel(src) return @@ -83,7 +83,7 @@ . += M /obj/effect/rune/proc/fizzle(var/mob/living/user) - visible_message("The markings pulse with a small burst of light, then fall dark.", "You hear a fizzle.") + visible_message(SPAN_WARNING("The markings pulse with a small burst of light, then fall dark."), "You hear a fizzle.") //Makes the speech a proc so all verbal components can be easily manipulated as a whole, or individually easily /obj/effect/rune/proc/speak_incantation(var/mob/living/user, var/incantation) @@ -91,6 +91,16 @@ if(istype(L) && incantation && (L in user.languages)) user.say(incantation, L) +/obj/effect/rune/get_surgery_success_modifier(delicate) + return delicate ? -10 : 0 + +/obj/effect/rune/get_surgery_surface_quality(mob/living/victim, mob/living/user) + return OPERATE_PASSABLE + +/turf/remove_cleanables() + for(var/obj/effect/decal/rune/rune in src) + qdel(rune) + /* Tier 1 runes below */ /obj/effect/rune/convert @@ -111,14 +121,14 @@ return fizzle(user) speak_incantation(user, "Mah[pick("'","`")]weyh pleggh at e'ntrath!") - target.visible_message("The markings below [target] glow a bloody red.") + target.visible_message(SPAN_WARNING("The markings below [target] glow a bloody red.")) - to_chat(target, "Your blood pulses. Your head throbs. The world goes red. All at once you are aware of a horrible, horrible truth. The veil of reality has been ripped away and in the festering wound left behind something sinister takes root.") + to_chat(target, SPAN_OCCULT("Your blood pulses. Your head throbs. The world goes red. All at once you are aware of a horrible, horrible truth. The veil of reality has been ripped away and in the festering wound left behind something sinister takes root.")) var/decl/special_role/cult = GET_DECL(/decl/special_role/cultist) if(!cult.can_become_antag(target.mind, 1)) - to_chat(target, "Are you going insane?") + to_chat(target, SPAN_DANGER("Are you going insane?")) else - to_chat(target, "Do you want to join the cult of Nar'Sie? You can choose to ignore offer... Join the cult.") + to_chat(target, SPAN_OCCULT("Do you want to join the cult of Nar'Sie? You can choose to ignore offer... Join the cult.")) spamcheck = 1 spawn(40) @@ -128,15 +138,15 @@ target.take_overall_damage(0, 10) switch(target.get_damage(BURN)) if(0 to 25) - to_chat(target, "Your blood boils as you force yourself to resist the corruption invading every corner of your mind.") + to_chat(target, SPAN_DANGER("Your blood boils as you force yourself to resist the corruption invading every corner of your mind.")) if(25 to 45) - to_chat(target, "Your blood boils and your body burns as the corruption further forces itself into your body and mind.") + to_chat(target, SPAN_DANGER("Your blood boils and your body burns as the corruption further forces itself into your body and mind.")) target.take_overall_damage(0, 3) if(45 to 75) - to_chat(target, "You begin to hallucinate images of a dark and incomprehensible being and your entire body feels like its engulfed in flame as your mental defenses crumble.") + to_chat(target, SPAN_DANGER("You begin to hallucinate images of a dark and incomprehensible being and your entire body feels like its engulfed in flame as your mental defenses crumble.")) target.take_overall_damage(0, 5) if(75 to 100) - to_chat(target, "Your mind turns to ash as the burning flames engulf your very soul and images of an unspeakable horror begin to bombard the last remnants of mental resistance.") + to_chat(target, SPAN_OCCULT("Your mind turns to ash as the burning flames engulf your very soul and images of an unspeakable horror begin to bombard the last remnants of mental resistance.")) target.take_overall_damage(0, 10) /obj/effect/rune/convert/Topic(href, href_list) @@ -177,24 +187,24 @@ else if(user.loc == get_turf(src)) speak_incantation(user, "Sas[pick("'","`")]so c'arta forbici!") if(do_after(user, 30)) - user.visible_message("\The [user] disappears in a flash of red light!", "You feel as your body gets dragged into the dimension of Nar-Sie!", "You hear a sickening crunch.") + user.visible_message(SPAN_WARNING("\The [user] disappears in a flash of red light!"), SPAN_WARNING("You feel as your body gets dragged into the dimension of Nar-Sie!"), "You hear a sickening crunch.") user.forceMove(src) showOptions(user) var/warning = 0 while(user.loc == src) user.take_organ_damage(0, 2) if(user.get_damage(BURN) > 50) - to_chat(user, "Your body can't handle the heat anymore!") + to_chat(user, SPAN_DANGER("Your body can't handle the heat anymore!")) leaveRune(user) return if(warning == 0) - to_chat(user, "You feel the immerse heat of the realm of Nar-Sie...") + to_chat(user, SPAN_WARNING("You feel the immerse heat of the realm of Nar-Sie...")) ++warning if(warning == 1 && user.get_damage(BURN) > 15) - to_chat(user, "Your burns are getting worse. You should return to your realm soon...") + to_chat(user, SPAN_WARNING("Your burns are getting worse. You should return to your realm soon...")) ++warning if(warning == 2 && user.get_damage(BURN) > 35) - to_chat(user, "The heat! It burns!") + to_chat(user, SPAN_WARNING("The heat! It burns!")) ++warning sleep(10) else @@ -227,7 +237,7 @@ if(user.loc != src) return user.dropInto(loc) - user.visible_message("\The [user] appears in a flash of red light!", "You feel as your body gets thrown out of the dimension of Nar-Sie!", "You hear a pop.") + user.visible_message(SPAN_WARNING("\The [user] appears in a flash of red light!"), SPAN_WARNING("You feel as your body gets thrown out of the dimension of Nar-Sie!"), "You hear a pop.") /obj/effect/rune/tome cultname = "summon tome" @@ -235,7 +245,7 @@ /obj/effect/rune/tome/cast(var/mob/living/user) new /obj/item/book/tome(get_turf(src)) speak_incantation(user, "N[pick("'","`")]ath reth sh'yro eth d'raggathnor!") - visible_message("\The [src] disappears with a flash of red light, and in its place now a book lies.", "You hear a pop.") + visible_message(SPAN_NOTICE("\The [src] disappears with a flash of red light, and in its place now a book lies."), "You hear a pop.") qdel(src) /obj/effect/rune/wall @@ -252,7 +262,7 @@ if(wall) var/wall_max_health = wall.get_max_health() if(wall.current_health >= wall_max_health) - to_chat(user, "The wall doesn't need mending.") + to_chat(user, SPAN_NOTICE("The wall doesn't need mending.")) return t = wall_max_health - wall.current_health wall.current_health += t @@ -260,9 +270,9 @@ wall = new /obj/effect/cultwall(get_turf(src), bcolor) wall.rune = src t = wall.current_health - user.remove_blood_simple(t / 50) + user.remove_blood(t / 50, absolute = TRUE) speak_incantation(user, "Khari[pick("'","`")]d! Eske'te tannin!") - to_chat(user, "Your blood flows into the rune, and you feel that the very space over the rune thickens.") + to_chat(user, SPAN_WARNING("Your blood flows into the rune, and you feel that the very space over the rune thickens.")) /obj/effect/cultwall name = "red mist" @@ -291,27 +301,27 @@ if(iscultist(user)) var/current_max_health = get_max_health() if(current_health == current_max_health) - to_chat(user, "It is fully intact.") + to_chat(user, SPAN_NOTICE("It is fully intact.")) else if(current_health > current_max_health * 0.5) - to_chat(user, "It is damaged.") + to_chat(user, SPAN_WARNING("It is damaged.")) else - to_chat(user, "It is about to dissipate.") + to_chat(user, SPAN_DANGER("It is about to dissipate.")) /obj/effect/cultwall/attack_hand(var/mob/user) SHOULD_CALL_PARENT(FALSE) if(iscultist(user)) - user.visible_message("\The [user] touches \the [src], and it fades.", "You touch \the [src], whispering the old ritual, making it disappear.") + user.visible_message(SPAN_NOTICE("\The [user] touches \the [src], and it fades."), SPAN_NOTICE("You touch \the [src], whispering the old ritual, making it disappear.")) qdel(src) else - to_chat(user, "You touch \the [src]. It feels wet and becomes harder the further you push your arm.") + to_chat(user, SPAN_NOTICE("You touch \the [src]. It feels wet and becomes harder the further you push your arm.")) return TRUE /obj/effect/cultwall/attackby(var/obj/item/I, var/mob/user) if(istype(I, /obj/item/nullrod)) - user.visible_message("\The [user] touches \the [src] with \the [I], and it disappears.", "You disrupt the vile magic with the deadening field of \the [I].") + user.visible_message(SPAN_NOTICE("\The [user] touches \the [src] with \the [I], and it disappears."), SPAN_NOTICE("You disrupt the vile magic with the deadening field of \the [I].")) qdel(src) else if(I.force) - user.visible_message("\The [user] hits \the [src] with \the [I].", "You hit \the [src] with \the [I].") + user.visible_message(SPAN_NOTICE("\The [user] hits \the [src] with \the [I]."), SPAN_NOTICE("You hit \the [src] with \the [I].")) take_damage(I.force, I.atom_damage_type) user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) user.do_attack_animation(src) @@ -325,7 +335,7 @@ /obj/effect/cultwall/take_damage(damage, damage_type = BRUTE, damage_flags, inflicter, armor_pen = 0, silent, do_update_health) current_health -= damage if(current_health <= 0) - visible_message("\The [src] dissipates.") + visible_message(SPAN_WARNING("\The [src] dissipates.")) qdel(src) /obj/effect/rune/ajorney @@ -371,7 +381,7 @@ T.turf_flags &= ~TURF_FLAG_HOLY else T.on_defilement() - visible_message("\The [src] embeds into the floor and walls around it, changing them!", "You hear liquid flow.") + visible_message(SPAN_WARNING("\The [src] embeds into the floor and walls around it, changing them!"), "You hear liquid flow.") qdel(src) /obj/effect/rune/obscure @@ -385,7 +395,7 @@ runecheck = 1 if(runecheck) speak_incantation(user, "Kla[pick("'","`")]atu barada nikt'o!") - visible_message("\ The rune turns into gray dust that conceals the surrounding runes.") + visible_message(SPAN_WARNING("\ The rune turns into gray dust that conceals the surrounding runes.")) qdel(src) /obj/effect/rune/reveal @@ -399,7 +409,7 @@ irunecheck = 1 if(irunecheck) speak_incantation(user, "Nikt[pick("'","`")]o barada kla'atu!") - visible_message("\ The rune turns into red dust that reveals the surrounding runes.") + visible_message(SPAN_WARNING("\ The rune turns into red dust that reveals the surrounding runes.")) qdel(src) /* Tier 2 runes */ @@ -411,7 +421,7 @@ /obj/effect/rune/armor/cast(var/mob/living/user) speak_incantation(user, "N'ath reth sh'yro eth d[pick("'","`")]raggathnor!") - visible_message("\The [src] disappears with a flash of red light, and a set of armor appears on \the [user].", "You are blinded by the flash of red light. After you're able to see again, you see that you are now wearing a set of armor.") + visible_message(SPAN_WARNING("\The [src] disappears with a flash of red light, and a set of armor appears on \the [user]."), SPAN_WARNING("You are blinded by the flash of red light. After you're able to see again, you see that you are now wearing a set of armor.")) var/obj/O = user.get_equipped_item(slot_head_str) // This will most likely kill you if you are wearing a spacesuit, and it's 100% intended if(O && !istype(O, /obj/item/clothing/head/culthood) && user.try_unequip(O)) @@ -446,10 +456,10 @@ /obj/effect/rune/offering/cast(var/mob/living/user) var/list/mob/living/cultists = get_cultists() if(victim) - to_chat(user, "You are already sarcificing \the [victim] on this rune.") + to_chat(user, SPAN_WARNING("You are already sarcificing \the [victim] on this rune.")) return if(cultists.len < 3) - to_chat(user, "You need three cultists around this rune to make it work.") + to_chat(user, SPAN_WARNING("You need three cultists around this rune to make it work.")) return fizzle(user) var/turf/T = get_turf(src) for(var/mob/living/M in T) @@ -481,34 +491,14 @@ cult.add_cultiness(CULTINESS_PER_SACRIFICE) var/obj/item/soulstone/full/F = new(get_turf(src)) for(var/mob/M in cultists | get_cultists()) - to_chat(M, "The Geometer of Blood accepts this offering.") - visible_message("\The [F] appears over \the [src].") + to_chat(M, SPAN_WARNING("The Geometer of Blood accepts this offering.")) + visible_message(SPAN_NOTICE("\The [F] appears over \the [src].")) cult.sacrificed += victim.mind if(victim.mind == cult.sacrifice_target) for(var/datum/mind/H in cult.current_antagonists) if(H.current) - to_chat(H.current, "Your objective is now complete.") - //TODO: other rewards? - /* old sac code - left there in case someone wants to salvage it - var/worth = 0 - if(ishuman(H)) - var/mob/living/human/lamb = H - if(lamb.species.rarity_value > 3) - worth = 1 - - if(H.mind == cult.sacrifice_target) - - to_chat(usr, "The Geometer of Blood accepts this sacrifice, your objective is now complete.") - - to_chat(usr, "The Geometer of Blood accepts this [worth ? "exotic " : ""]sacrifice.") - - to_chat(usr, "The Geometer of blood accepts this sacrifice.") - to_chat(usr, "However, this soul was not enough to gain His favor.") - - to_chat(usr, "The Geometer of blood accepts this sacrifice.") - to_chat(usr, "However, a mere dead body is not enough to satisfy Him.") - */ - to_chat(victim, "The Geometer of Blood claims your body.") + to_chat(H.current, SPAN_OCCULT("Your objective is now complete.")) + to_chat(victim, SPAN_OCCULT("The Geometer of Blood claims your body.")) victim.dust() if(victim) victim.ExtinguishMob() // Technically allows them to put the fire out by sacrificing them and stopping immediately, but I don't think it'd have much effect @@ -528,12 +518,12 @@ if(!victim) return fizzle(user) if(victim.vessel.total_volume < 20) - to_chat(user, "This body has no blood in it.") + to_chat(user, SPAN_WARNING("This body has no blood in it.")) return fizzle(user) victim.vessel.remove_any(20) admin_attack_log(user, victim, "Used a blood drain rune.", "Was victim of a blood drain rune.", "used a blood drain rune on") speak_incantation(user, "Yu[pick("'","`")]gular faras desdae. Havas mithum javara. Umathar uf'kal thenar!") - user.visible_message("Blood flows from \the [src] into \the [user]!", "The blood starts flowing from \the [src] into your frail mortal body. [capitalize(english_list(heal_user(user), nothing_text = "you feel no different"))].", "You hear liquid flow.") + user.visible_message(SPAN_WARNING("Blood flows from \the [src] into \the [user]!"), SPAN_OCCULT("The blood starts flowing from \the [src] into your frail mortal body. [capitalize(english_list(heal_user(user), nothing_text = "you feel no different"))]."), "You hear liquid flow.") user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) /obj/effect/rune/drain/proc/heal_user(var/mob/living/human/user) @@ -612,7 +602,7 @@ /obj/effect/rune/massdefile/cast(var/mob/living/user) var/list/mob/living/cultists = get_cultists() if(cultists.len < 3) - to_chat(user, "You need three cultists around this rune to make it work.") + to_chat(user, SPAN_WARNING("You need three cultists around this rune to make it work.")) return fizzle(user) else for(var/mob/living/M in cultists) @@ -622,7 +612,7 @@ T.turf_flags &= ~TURF_FLAG_HOLY else T.on_defilement() - visible_message("\The [src] embeds into the floor and walls around it, changing them!", "You hear liquid flow.") + visible_message(SPAN_WARNING("\The [src] embeds into the floor and walls around it, changing them!"), "You hear liquid flow.") qdel(src) /* Tier 3 runes */ @@ -633,11 +623,11 @@ /obj/effect/rune/weapon/cast(var/mob/living/user) if(!istype(user.get_equipped_item(slot_head_str), /obj/item/clothing/head/culthood) || !istype(user.get_equipped_item(slot_wear_suit_str), /obj/item/clothing/suit/cultrobes) || !istype(user.get_equipped_item(slot_shoes_str), /obj/item/clothing/shoes/cult)) - to_chat(user, "You need to be wearing your robes to use this rune.") + to_chat(user, SPAN_WARNING("You need to be wearing your robes to use this rune.")) return fizzle(user) var/turf/T = get_turf(src) if(!T.is_defiled()) - to_chat(user, "This rune needs to be placed on the defiled ground.") + to_chat(user, SPAN_WARNING("This rune needs to be placed on the defiled ground.")) return fizzle(user) speak_incantation(user, "N'ath reth sh'yro eth d[pick("'","`")]raggathnor!") user.put_in_hands(new /obj/item/sword/cultblade(user)) @@ -650,7 +640,7 @@ /obj/effect/rune/shell/cast(var/mob/living/user) var/turf/T = get_turf(src) if(!T.is_defiled()) - to_chat(user, "This rune needs to be placed on the defiled ground.") + to_chat(user, SPAN_WARNING("This rune needs to be placed on the defiled ground.")) return fizzle(user) var/obj/item/stack/material/target @@ -660,13 +650,13 @@ break if(!target) - to_chat(user, "You need ten sheets of steel to fold them into a construct shell.") + to_chat(user, SPAN_WARNING("You need ten sheets of steel to fold them into a construct shell.")) return fizzle(user) speak_incantation(user, "Da A[pick("'","`")]ig Osk!") target.use(10) var/obj/O = new /obj/structure/constructshell/cult(get_turf(src)) - visible_message("The metal bends into \the [O], and \the [src] imbues into it.", "You hear a metallic sound.") + visible_message(SPAN_WARNING("The metal bends into \the [O], and \the [src] imbues into it."), "You hear a metallic sound.") qdel(src) /obj/effect/rune/confuse @@ -675,7 +665,7 @@ /obj/effect/rune/confuse/cast(var/mob/living/user) speak_incantation(user, "Fuu ma[pick("'","`")]jin!") - visible_message("\The [src] explodes in a bright flash.") + visible_message(SPAN_DANGER("\The [src] explodes in a bright flash.")) var/list/mob/affected = list() for(var/mob/living/M in viewers(src)) if(iscultist(M)) @@ -751,9 +741,9 @@ M.take_overall_damage(5, 5) if(!(M in previous)) if(M.should_have_organ(BP_HEART)) - to_chat(M, "Your blood boils!") + to_chat(M, SPAN_DANGER("Your blood boils!")) else - to_chat(M, "You feel searing heat inside!") + to_chat(M, SPAN_DANGER("You feel searing heat inside!")) previous = current.Copy() current.Cut() sleep(10) @@ -772,14 +762,14 @@ if(!cult.allow_narsie) return if(the_end_comes) - to_chat(user, "You are already summoning! Be patient!") + to_chat(user, SPAN_OCCULT("You are already summoning! Be patient!")) return var/list/mob/living/cultists = get_cultists() if(cultists.len < 5) return fizzle() for(var/mob/living/M in cultists) M.say("Tok-lyr rqa'nap g[pick("'","`")]lt-ulotf!") - to_chat(M, "You are starting to tear through the veil, opening the way to bring Him back... stay around the rune!") + to_chat(M, SPAN_OCCULT("You are starting to tear through the veil, opening the way to bring Him back... stay around the rune!")) log_and_message_admins_many(cultists, "started summoning Nar-sie.") var/area/A = get_area(src) @@ -817,7 +807,7 @@ if(input != "Yes") return TRUE speak_incantation(user, "Uhrast ka'hfa heldsagen ver[pick("'","`")]lot!") - to_chat(user, "In the last moment of your humble life, you feel an immense pain as fabric of reality mends... with your blood.") + to_chat(user, SPAN_WARNING("In the last moment of your humble life, you feel an immense pain as fabric of reality mends... with your blood.")) for(var/mob/M in global.living_mob_list_) if(iscultist(M)) var/decl/pronouns/G = user.get_pronouns() @@ -854,10 +844,10 @@ tainted = 1 if(!target) if(tainted) - to_chat(user, "The blank is tainted. It is unsuitable.") + to_chat(user, SPAN_WARNING("The blank is tainted. It is unsuitable.")) return fizzle(user) speak_incantation(user, "H'drak v[pick("'","`")]loso, mir'kanas verbot!") - visible_message("The rune forms into an arcane image on the paper.") + visible_message(SPAN_WARNING("The rune forms into an arcane image on the paper.")) new papertype(get_turf(src)) qdel(target) qdel(src) diff --git a/code/game/antagonist/station/cultist.dm b/mods/gamemodes/cult/special_role.dm similarity index 100% rename from code/game/antagonist/station/cultist.dm rename to mods/gamemodes/cult/special_role.dm diff --git a/code/modules/spells/aoe_turf/conjure/construct.dm b/mods/gamemodes/cult/spells/construct.dm similarity index 100% rename from code/modules/spells/aoe_turf/conjure/construct.dm rename to mods/gamemodes/cult/spells/construct.dm diff --git a/code/modules/spells/targeted/harvest.dm b/mods/gamemodes/cult/spells/harvest.dm similarity index 100% rename from code/modules/spells/targeted/harvest.dm rename to mods/gamemodes/cult/spells/harvest.dm diff --git a/code/game/gamemodes/cult/cult_structures.dm b/mods/gamemodes/cult/structures.dm similarity index 93% rename from code/game/gamemodes/cult/cult_structures.dm rename to mods/gamemodes/cult/structures.dm index 769fbc05658..19a803ca62d 100644 --- a/code/game/gamemodes/cult/cult_structures.dm +++ b/mods/gamemodes/cult/structures.dm @@ -165,3 +165,18 @@ new_mob.key = M.key to_chat(new_mob, "Your form morphs into that of a corgi.")//Because we don't have cluwnes + +/obj/structure/door/cult + material = /decl/material/solid/stone/cult + +/obj/structure/girder/cult + icon= 'icons/obj/cult.dmi' + icon_state= "cultgirder" + max_health = 150 + cover = 70 + +/obj/structure/girder/cult/dismantle_structure(mob/user) + material = null + reinf_material = null + parts_type = null + . = ..() \ No newline at end of file diff --git a/code/game/gamemodes/cult/talisman.dm b/mods/gamemodes/cult/talisman.dm similarity index 100% rename from code/game/gamemodes/cult/talisman.dm rename to mods/gamemodes/cult/talisman.dm diff --git a/mods/gamemodes/deity/forms/narsie/deity_items/smithing.dm b/mods/gamemodes/deity/forms/narsie/deity_items/smithing.dm index 6d43233bf91..e2a23b7da55 100644 --- a/mods/gamemodes/deity/forms/narsie/deity_items/smithing.dm +++ b/mods/gamemodes/deity/forms/narsie/deity_items/smithing.dm @@ -27,8 +27,11 @@ base_cost = 75 requirements = list(DEITY_BLOOD_CRAFT = 1) recipes = list(/obj/item/clothing/suit/cultrobes/magusred = 80, - /obj/item/clothing/head/culthood/magus = 50, - /obj/structure/constructshell/cult = 70) //also shield? + /obj/item/clothing/head/culthood/magus = 50) //also shield? + +// todo: declize /datum/deity_item and move this into decl initialize +/datum/deity_item/blood_crafting/armored/New() + recipes[/obj/structure/constructshell/cult] = 70] /datum/deity_item/blood_crafting/space name = DEITY_VOID_CRAFT diff --git a/nebula.dme b/nebula.dme index 47197401f61..591dc75c426 100644 --- a/nebula.dme +++ b/nebula.dme @@ -729,7 +729,6 @@ #include "code\game\antagonist\outsider\ert.dm" #include "code\game\antagonist\outsider\mercenary.dm" #include "code\game\antagonist\outsider\wizard.dm" -#include "code\game\antagonist\station\cultist.dm" #include "code\game\antagonist\station\provocateur.dm" #include "code\game\antagonist\station\renegade.dm" #include "code\game\antagonist\station\thrall.dm" @@ -743,17 +742,6 @@ #include "code\game\gamemodes\game_mode.dm" #include "code\game\gamemodes\game_mode_latespawn.dm" #include "code\game\gamemodes\calamity\calamity.dm" -#include "code\game\gamemodes\cult\cult.dm" -#include "code\game\gamemodes\cult\cult_items.dm" -#include "code\game\gamemodes\cult\cult_structures.dm" -#include "code\game\gamemodes\cult\ghosts.dm" -#include "code\game\gamemodes\cult\hell_universe.dm" -#include "code\game\gamemodes\cult\narsie.dm" -#include "code\game\gamemodes\cult\ritual.dm" -#include "code\game\gamemodes\cult\runes.dm" -#include "code\game\gamemodes\cult\talisman.dm" -#include "code\game\gamemodes\cult\cultify\de-cultify.dm" -#include "code\game\gamemodes\cult\cultify\mob.dm" #include "code\game\gamemodes\endgame\endgame.dm" #include "code\game\gamemodes\endgame\ftl_jump\ftl_jump.dm" #include "code\game\gamemodes\endgame\nuclear_explosion\nuclear_explosion.dm" @@ -769,7 +757,6 @@ #include "code\game\gamemodes\objectives\objective_assassinate.dm" #include "code\game\gamemodes\objectives\objective_brig.dm" #include "code\game\gamemodes\objectives\objective_capture.dm" -#include "code\game\gamemodes\objectives\objective_cult.dm" #include "code\game\gamemodes\objectives\objective_debrain.dm" #include "code\game\gamemodes\objectives\objective_demote.dm" #include "code\game\gamemodes\objectives\objective_download.dm" @@ -1545,7 +1532,6 @@ #include "code\game\turfs\floors\subtypes\floor_carpet.dm" #include "code\game\turfs\floors\subtypes\floor_circuit.dm" #include "code\game\turfs\floors\subtypes\floor_concrete.dm" -#include "code\game\turfs\floors\subtypes\floor_cult.dm" #include "code\game\turfs\floors\subtypes\floor_misc.dm" #include "code\game\turfs\floors\subtypes\floor_path.dm" #include "code\game\turfs\floors\subtypes\floor_reinforced.dm" @@ -3675,7 +3661,6 @@ #include "code\modules\spells\aoe_turf\smoke.dm" #include "code\modules\spells\aoe_turf\summons.dm" #include "code\modules\spells\aoe_turf\conjure\conjure.dm" -#include "code\modules\spells\aoe_turf\conjure\construct.dm" #include "code\modules\spells\aoe_turf\conjure\druidic_spells.dm" #include "code\modules\spells\aoe_turf\conjure\faithful_hound.dm" #include "code\modules\spells\aoe_turf\conjure\force_portal.dm" @@ -3714,7 +3699,6 @@ #include "code\modules\spells\targeted\exude_pleasantness.dm" #include "code\modules\spells\targeted\genetic.dm" #include "code\modules\spells\targeted\glimpse_of_eternity.dm" -#include "code\modules\spells\targeted\harvest.dm" #include "code\modules\spells\targeted\shapeshift.dm" #include "code\modules\spells\targeted\shatter_mind.dm" #include "code\modules\spells\targeted\shift.dm" @@ -3903,7 +3887,6 @@ #include "code\modules\xenoarcheaology\finds\find_types\_find_spawner.dm" #include "code\modules\xenoarcheaology\finds\find_types\chem_containers.dm" #include "code\modules\xenoarcheaology\finds\find_types\containers.dm" -#include "code\modules\xenoarcheaology\finds\find_types\cult.dm" #include "code\modules\xenoarcheaology\finds\find_types\fossils.dm" #include "code\modules\xenoarcheaology\finds\find_types\guns.dm" #include "code\modules\xenoarcheaology\finds\find_types\mask.dm" From 8e2f54ae544ead3641f3addd2a259ad31afab286 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Tue, 18 Jun 2024 17:58:54 -0400 Subject: [PATCH 77/90] Make Nar'sie godform require Cult modpack --- mods/gamemodes/cult/_cult.dme | 6 ++++++ mods/gamemodes/deity/_deity.dme | 9 +-------- mods/gamemodes/deity/forms/narsie/_include.dm | 11 +++++++++++ .../deity/forms/narsie/deity_items/smithing.dm | 7 ++----- mods/gamemodes/deity/mobs/items/deity_item.dm | 1 + 5 files changed, 21 insertions(+), 13 deletions(-) create mode 100644 mods/gamemodes/deity/forms/narsie/_include.dm diff --git a/mods/gamemodes/cult/_cult.dme b/mods/gamemodes/cult/_cult.dme index 6322896262c..26a33f8aa06 100644 --- a/mods/gamemodes/cult/_cult.dme +++ b/mods/gamemodes/cult/_cult.dme @@ -1,7 +1,13 @@ #ifndef GAMEMODE_PACK_CULT #define GAMEMODE_PACK_CULT + +#ifdef GAMEMODE_PACK_DEITY +#warn Deity modpack loaded before Cult modpack, Nar'sie godform will be unavailable! +#endif + // BEGIN_INCLUDE #include "_cult.dm" +#include "archaeology.dm" #include "flooring.dm" #include "gamemode.dm" #include "ghosts.dm" diff --git a/mods/gamemodes/deity/_deity.dme b/mods/gamemodes/deity/_deity.dme index c76fdaf4845..6bcd0f6b2c2 100644 --- a/mods/gamemodes/deity/_deity.dme +++ b/mods/gamemodes/deity/_deity.dme @@ -11,14 +11,7 @@ #include "overrides.dm" #include "extensions\deity_be_near.dm" #include "forms\forms.dm" -#include "forms\narsie\items.dm" -#include "forms\narsie\narsie.dm" -#include "forms\narsie\structures.dm" -#include "forms\narsie\deity_items\basic.dm" -#include "forms\narsie\deity_items\minions.dm" -#include "forms\narsie\deity_items\sacrificing.dm" -#include "forms\narsie\deity_items\smithing.dm" -#include "forms\narsie\spells\tear_veil.dm" +#include "forms\narsie\_include.dm" #include "forms\starlight\items.dm" #include "forms\starlight\mobs.dm" #include "forms\starlight\starlight.dm" diff --git a/mods/gamemodes/deity/forms/narsie/_include.dm b/mods/gamemodes/deity/forms/narsie/_include.dm new file mode 100644 index 00000000000..285a3bc26bc --- /dev/null +++ b/mods/gamemodes/deity/forms/narsie/_include.dm @@ -0,0 +1,11 @@ +// These should only load if cult is loaded. +#ifdef GAMEMODE_PACK_CULT +#include "items.dm" +#include "narsie.dm" +#include "structures.dm" +#include "deity_items\basic.dm" +#include "deity_items\minions.dm" +#include "deity_items\sacrificing.dm" +#include "deity_items\smithing.dm" +#include "spells\tear_veil.dm" +#endif \ No newline at end of file diff --git a/mods/gamemodes/deity/forms/narsie/deity_items/smithing.dm b/mods/gamemodes/deity/forms/narsie/deity_items/smithing.dm index e2a23b7da55..6d43233bf91 100644 --- a/mods/gamemodes/deity/forms/narsie/deity_items/smithing.dm +++ b/mods/gamemodes/deity/forms/narsie/deity_items/smithing.dm @@ -27,11 +27,8 @@ base_cost = 75 requirements = list(DEITY_BLOOD_CRAFT = 1) recipes = list(/obj/item/clothing/suit/cultrobes/magusred = 80, - /obj/item/clothing/head/culthood/magus = 50) //also shield? - -// todo: declize /datum/deity_item and move this into decl initialize -/datum/deity_item/blood_crafting/armored/New() - recipes[/obj/structure/constructshell/cult] = 70] + /obj/item/clothing/head/culthood/magus = 50, + /obj/structure/constructshell/cult = 70) //also shield? /datum/deity_item/blood_crafting/space name = DEITY_VOID_CRAFT diff --git a/mods/gamemodes/deity/mobs/items/deity_item.dm b/mods/gamemodes/deity/mobs/items/deity_item.dm index 6c5e70fb839..7590bbb9037 100644 --- a/mods/gamemodes/deity/mobs/items/deity_item.dm +++ b/mods/gamemodes/deity/mobs/items/deity_item.dm @@ -1,3 +1,4 @@ +// todo: declize /datum/deity_item /datum/deity_item var/name var/desc From 5f622497f27f5749f82597d796e28cb709d089c4 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Tue, 18 Jun 2024 18:50:43 -0400 Subject: [PATCH 78/90] Move constructs and soulstones into cult modpack --- .../extensions/storage/subtypes_belt.dm | 5 -- code/datums/trading/traders/goods.dm | 1 - code/game/objects/items/weapons/mop.dm | 3 +- .../objects/items/weapons/storage/belt.dm | 9 ---- code/game/objects/structures/grille.dm | 10 ---- code/modules/butchery/butchery_data_misc.dm | 13 ----- code/modules/codex/entries/weapons.dm | 4 -- code/modules/ghosttrap/trap.dm | 23 --------- code/modules/mining/abandonedcrates.dm | 4 +- code/modules/mob/living/silicon/ai/ai.dm | 1 - .../living/simple_animal/hostile/creature.dm | 9 ---- .../living/simple_animal/hostile/faithless.dm | 8 ---- code/modules/mob/transform_procs.dm | 2 - .../spells/artifacts/spellbound_servants.dm | 2 +- code/modules/spells/artifacts/storage.dm | 12 +---- code/modules/spells/contracts.dm | 4 -- code/modules/spells/racial_wizard.dm | 2 +- code/modules/spells/spellbook.dm | 1 - code/modules/spells/spellbook/druid.dm | 1 - code/modules/spells/spellbook/standard.dm | 1 - code/modules/ventcrawl/ventcrawl.dm | 6 +-- .../artifacts/triggers/energy.dm | 1 - .../xenoarcheaology/datums/artifact_find.dm | 1 - .../xenoarcheaology/finds/digsite_types.dm | 4 -- .../finds/find_types/statuette.dm | 2 +- mods/content/psionics/datum/chems.dm | 8 ++++ mods/content/psionics/items/soulstone.dm | 2 + mods/gamemodes/cult/_cult.dme | 6 ++- mods/gamemodes/cult/archaeology.dm | 19 +++++++- mods/gamemodes/cult/codex.dm | 3 ++ mods/gamemodes/cult/ghosttrap.dm | 28 +++++++++++ mods/gamemodes/cult/materials.dm | 13 +++++ mods/gamemodes/cult/mob_subtypes.dm | 6 --- .../cult/mobs}/constructs/constructs.dm | 8 ---- .../cult/mobs}/constructs/soulstone.dm | 0 mods/gamemodes/cult/mobs/mob_subtypes.dm | 15 ++++++ .../gamemodes/cult/mobs}/shade.dm | 2 +- mods/gamemodes/cult/overrides.dm | 39 ++++++++++++++- mods/gamemodes/cult/structures.dm | 12 ++++- mods/gamemodes/cult/wizard.dm | 47 +++++++++++++++++++ mods/gamemodes/deity/overrides.dm | 4 -- nebula.dme | 3 -- 42 files changed, 196 insertions(+), 148 deletions(-) create mode 100644 mods/gamemodes/cult/codex.dm create mode 100644 mods/gamemodes/cult/ghosttrap.dm delete mode 100644 mods/gamemodes/cult/mob_subtypes.dm rename {code/modules/mob/living/simple_animal => mods/gamemodes/cult/mobs}/constructs/constructs.dm (97%) rename {code/modules/mob/living/simple_animal => mods/gamemodes/cult/mobs}/constructs/soulstone.dm (100%) create mode 100644 mods/gamemodes/cult/mobs/mob_subtypes.dm rename {code/modules/mob/living/simple_animal => mods/gamemodes/cult/mobs}/shade.dm (97%) create mode 100644 mods/gamemodes/cult/wizard.dm diff --git a/code/datums/extensions/storage/subtypes_belt.dm b/code/datums/extensions/storage/subtypes_belt.dm index b657e79fdca..09b0d1a8ccc 100644 --- a/code/datums/extensions/storage/subtypes_belt.dm +++ b/code/datums/extensions/storage/subtypes_belt.dm @@ -159,11 +159,6 @@ /obj/item/tool/xeno/hand ) -/datum/storage/belt/soulstone - can_hold = list( - /obj/item/soulstone - ) - /datum/storage/belt/champion storage_slots = null max_storage_space = ITEM_SIZE_SMALL diff --git a/code/datums/trading/traders/goods.dm b/code/datums/trading/traders/goods.dm index c68b74acc18..6c1c4e7c443 100644 --- a/code/datums/trading/traders/goods.dm +++ b/code/datums/trading/traders/goods.dm @@ -201,7 +201,6 @@ /obj/item/clothing/head/centhat = TRADER_BLACKLIST, /obj/item/clothing/head/chameleon = TRADER_BLACKLIST, /obj/item/clothing/head/collectable = TRADER_BLACKLIST, - /obj/item/clothing/head/culthood = TRADER_BLACKLIST_ALL, /obj/item/clothing/head/helmet = TRADER_BLACKLIST_ALL, /obj/item/clothing/head/lightrig = TRADER_BLACKLIST_ALL, /obj/item/clothing/head/radiation = TRADER_BLACKLIST, diff --git a/code/game/objects/items/weapons/mop.dm b/code/game/objects/items/weapons/mop.dm index cd9df371ddc..4927c4d7e35 100644 --- a/code/game/objects/items/weapons/mop.dm +++ b/code/game/objects/items/weapons/mop.dm @@ -16,9 +16,8 @@ var/mopspeed = 40 var/list/moppable_types = list( /obj/effect/decal/cleanable, - /obj/effect/rune, /obj/structure/catwalk - ) + ) /obj/item/mop/Initialize() . = ..() diff --git a/code/game/objects/items/weapons/storage/belt.dm b/code/game/objects/items/weapons/storage/belt.dm index 5716aa9d063..c18a442a2fb 100644 --- a/code/game/objects/items/weapons/storage/belt.dm +++ b/code/game/objects/items/weapons/storage/belt.dm @@ -188,15 +188,6 @@ sound_in = 'sound/effects/holster/sheathin.ogg' sound_out = 'sound/effects/holster/sheathout.ogg' -/obj/item/belt/soulstone - name = "soul stone belt" - desc = "Designed for ease of access to the shards during a fight, as to not let a single enemy spirit slip away." - icon = 'icons/clothing/belt/soulstones.dmi' - storage = /datum/storage/belt/soulstone - -/obj/item/belt/soulstone/full/WillContain() - return list(/obj/item/soulstone = max(1, storage?.storage_slots)) - /obj/item/belt/champion name = "championship belt" desc = "Proves to the world that you are the strongest!" diff --git a/code/game/objects/structures/grille.dm b/code/game/objects/structures/grille.dm index 4bdf3369d23..9483ba35f75 100644 --- a/code/game/objects/structures/grille.dm +++ b/code/game/objects/structures/grille.dm @@ -265,16 +265,6 @@ . = ..() take_damage(rand(1, 5)) //In the destroyed but not utterly threshold. -/obj/structure/grille/cult - name = "cult grille" - desc = "A matrice built out of an unknown material, with some sort of force field blocking air around it." - material = /decl/material/solid/stone/cult - -/obj/structure/grille/cult/CanPass(atom/movable/mover, turf/target, height = 1.5, air_group = 0) - if(air_group) - return 0 //Make sure air doesn't drain - ..() - /obj/structure/grille/proc/is_on_frame() if(locate(/obj/structure/wall_frame) in loc) return TRUE diff --git a/code/modules/butchery/butchery_data_misc.dm b/code/modules/butchery/butchery_data_misc.dm index b672d01328c..2dc6f568ab4 100644 --- a/code/modules/butchery/butchery_data_misc.dm +++ b/code/modules/butchery/butchery_data_misc.dm @@ -13,19 +13,6 @@ gut_type = null gut_amount = null -/decl/butchery_data/occult - meat_material = /decl/material/solid/stone/cult - meat_type = /obj/item/stack/material/lump - bone_material = /decl/material/solid/stone/cult/reinforced - - skin_material = null - skin_type = null - skin_amount = null - - gut_amount = null - gut_material = null - gut_type = null - /decl/butchery_data/crystal meat_material = /decl/material/solid/gemstone/crystal meat_type = /obj/item/stack/material/gemstone diff --git a/code/modules/codex/entries/weapons.dm b/code/modules/codex/entries/weapons.dm index fc79b03c309..5034877627d 100644 --- a/code/modules/codex/entries/weapons.dm +++ b/code/modules/codex/entries/weapons.dm @@ -12,10 +12,6 @@ it can be concealed in your pocket or bag." available_to_map_tech_level = MAP_TECH_LEVEL_SPACE -/datum/codex_entry/cultblade - associated_paths = list(/obj/item/sword/cultblade) - antag_text = "This sword is a powerful weapon, capable of severing limbs easily, if they are targeted. Nonbelievers are unable to use this weapon." - /datum/codex_entry/spear associated_paths = list(/obj/item/twohanded/spear) associated_strings = list("spear") diff --git a/code/modules/ghosttrap/trap.dm b/code/modules/ghosttrap/trap.dm index ca4076385ea..0bb32c80124 100644 --- a/code/modules/ghosttrap/trap.dm +++ b/code/modules/ghosttrap/trap.dm @@ -186,29 +186,6 @@ /decl/ghosttrap/wizard_familiar/welcome_candidate(var/mob/target) return 0 -/decl/ghosttrap/cult_shade - name = "shade" - ghost_trap_message = "They are occupying a soul stone now." - ban_checks = list(/decl/special_role/cultist) - pref_check = "ghost_shade" - can_set_own_name = FALSE - -/decl/ghosttrap/cult_shade/welcome_candidate(var/mob/target) - var/obj/item/soulstone/S = target.loc - if(istype(S)) - if(S.is_evil) - var/decl/special_role/cult = GET_DECL(/decl/special_role/cultist) - cult.add_antagonist(target.mind) - to_chat(target, "Remember, you serve the one who summoned you first, and the cult second.") - else - to_chat(target, "This soultone has been purified. You do not belong to the cult.") - to_chat(target, "Remember, you only serve the one who summoned you.") - -/decl/ghosttrap/cult_shade/forced(var/mob/user) - var/obj/item/soulstone/stone = new(get_turf(user)) - stone.shade = new(stone) - request_player(stone.shade, "The soul stone shade summon ritual has been performed. ") - // Stub PAI ghost trap so that PAI shows up in the ghost role list. // Actually invoking this ghost trap as normal will not do anything. /decl/ghosttrap/personal_ai diff --git a/code/modules/mining/abandonedcrates.dm b/code/modules/mining/abandonedcrates.dm index 035a478c13b..7365af2cad0 100644 --- a/code/modules/mining/abandonedcrates.dm +++ b/code/modules/mining/abandonedcrates.dm @@ -99,9 +99,7 @@ new /obj/item/seeds/random(src) if(89, 90) new /obj/item/organ/internal/heart(src) - if(91) - new /obj/item/soulstone(src) - if(92) + if(91,92) new /obj/item/sword/katana(src) if(93) new /obj/item/firstaid/combat(src) // Probably the least OP diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index f99ab90b1e3..8d807027a08 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -55,7 +55,6 @@ var/global/list/ai_verbs_default = list( anchored = TRUE // -- TLE density = TRUE status_flags = CANSTUN|CANPARALYSE|CANPUSH - shouldnt_see = list(/obj/effect/rune) max_health = 200 silicon_camera = /obj/item/camera/siliconcam/ai_camera diff --git a/code/modules/mob/living/simple_animal/hostile/creature.dm b/code/modules/mob/living/simple_animal/hostile/creature.dm index 85d56fe858f..c818a6512ab 100644 --- a/code/modules/mob/living/simple_animal/hostile/creature.dm +++ b/code/modules/mob/living/simple_animal/hostile/creature.dm @@ -8,12 +8,3 @@ faction = "creature" speed = 4 supernatural = 1 - -/mob/living/simple_animal/hostile/creature/cult - faction = "cult" - min_gas = null - max_gas = null - minbodytemp = 0 - -/mob/living/simple_animal/hostile/creature/cult/on_defilement() - return \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/hostile/faithless.dm b/code/modules/mob/living/simple_animal/hostile/faithless.dm index 7ddde654525..085b6cb906b 100644 --- a/code/modules/mob/living/simple_animal/hostile/faithless.dm +++ b/code/modules/mob/living/simple_animal/hostile/faithless.dm @@ -20,8 +20,6 @@ faction = "faithless" supernatural = 1 - butchery_data = /decl/butchery_data/occult - /obj/item/natural_weapon/faithless name = "shadow tendril" attack_verb = list("gripped") @@ -44,9 +42,3 @@ if(prob(12)) SET_STATUS_MAX(L, STAT_WEAK, 3) L.visible_message("\the [src] knocks down \the [L]!") - -/mob/living/simple_animal/hostile/faithless/cult - faction = "cult" - -/mob/living/simple_animal/hostile/faithless/cult/on_defilement() - return diff --git a/code/modules/mob/transform_procs.dm b/code/modules/mob/transform_procs.dm index d46e56fd44e..1b5ca140335 100644 --- a/code/modules/mob/transform_procs.dm +++ b/code/modules/mob/transform_procs.dm @@ -233,8 +233,6 @@ return 1 if(ispath(MP, /mob/living/simple_animal/mushroom)) return 1 - if(ispath(MP, /mob/living/simple_animal/shade)) - return 1 if(ispath(MP, /mob/living/simple_animal/tomato)) return 1 if(ispath(MP, /mob/living/simple_animal/passive/mouse)) diff --git a/code/modules/spells/artifacts/spellbound_servants.dm b/code/modules/spells/artifacts/spellbound_servants.dm index f98d928ed8f..f9306397e93 100644 --- a/code/modules/spells/artifacts/spellbound_servants.dm +++ b/code/modules/spells/artifacts/spellbound_servants.dm @@ -236,7 +236,7 @@ throw_speed = 5 throw_range = 10 w_class = ITEM_SIZE_TINY - material = /decl/material/solid/stone/cult + material = /decl/material/solid/stone/basalt /obj/item/summoning_stone/attack_self(var/mob/user) if(isAdminLevel(user.z)) diff --git a/code/modules/spells/artifacts/storage.dm b/code/modules/spells/artifacts/storage.dm index b8fbc512eeb..4d84cab7d3d 100644 --- a/code/modules/spells/artifacts/storage.dm +++ b/code/modules/spells/artifacts/storage.dm @@ -27,14 +27,4 @@ return list( /obj/item/scrying, /obj/item/contract/wizard/xray, - ) - -/obj/structure/closet/wizard/souls - name = "Soul Shard Belt" - desc = "Soul Stone Shards are ancient tools capable of capturing and harnessing the spirits of the dead and dying. The spell Artificer allows you to create arcane machines for the captured souls to pilot. This also includes the spell Artificer, used to create the shells used in construct creation." - -/obj/structure/closet/wizard/souls/WillContain() - return list( - /obj/item/contract/boon/wizard/artificer, - /obj/item/belt/soulstone/full, - ) + ) \ No newline at end of file diff --git a/code/modules/spells/contracts.dm b/code/modules/spells/contracts.dm index f6da03c3482..1b6ebf527f7 100644 --- a/code/modules/spells/contracts.dm +++ b/code/modules/spells/contracts.dm @@ -115,10 +115,6 @@ /obj/item/contract/boon/wizard contract_master = "\improper Wizard Academy" -/obj/item/contract/boon/wizard/artificer - path = /spell/aoe_turf/conjure/construct - desc = "This contract has a passage dedicated to an entity known as 'Nar-Sie'." - /obj/item/contract/boon/wizard/fireball path = /spell/targeted/projectile/dumbfire/fireball desc = "This contract feels warm to the touch." diff --git a/code/modules/spells/racial_wizard.dm b/code/modules/spells/racial_wizard.dm index bcb00360c9c..c06b8671aae 100644 --- a/code/modules/spells/racial_wizard.dm +++ b/code/modules/spells/racial_wizard.dm @@ -9,7 +9,7 @@ throw_speed = 1 throw_range = 3 force = 15 - material = /decl/material/solid/stone/cult + material = /decl/material/solid/stone/basalt var/list/potentials = list( SPECIES_HUMAN = /obj/item/bag/cash/infinite ) diff --git a/code/modules/spells/spellbook.dm b/code/modules/spells/spellbook.dm index ef043dbb5ba..110fb98c471 100644 --- a/code/modules/spells/spellbook.dm +++ b/code/modules/spells/spellbook.dm @@ -13,7 +13,6 @@ var/global/list/artefact_feedback = list( /obj/item/summoning_stone = "ST", /obj/item/magic_rock = "RA", /obj/item/contract/apprentice = "CP", - /obj/structure/closet/wizard/souls = "SS", /obj/structure/closet/wizard/scrying = "SO", /obj/item/teleportation_scroll = "TS", /obj/item/gun/energy/staff = "ST", diff --git a/code/modules/spells/spellbook/druid.dm b/code/modules/spells/spellbook/druid.dm index fd35ae19542..ec86e1ac93b 100644 --- a/code/modules/spells/spellbook/druid.dm +++ b/code/modules/spells/spellbook/druid.dm @@ -29,7 +29,6 @@ /spell/area_teleport = 2, /spell/portal_teleport = 2, /spell/noclothes = 1, - /obj/structure/closet/wizard/souls = 1, /obj/item/magic_rock = 1, /obj/item/summoning_stone = 2, /obj/item/contract/wizard/telepathy = 1, diff --git a/code/modules/spells/spellbook/standard.dm b/code/modules/spells/spellbook/standard.dm index 2f1f3a77761..5b30a7c9918 100644 --- a/code/modules/spells/spellbook/standard.dm +++ b/code/modules/spells/spellbook/standard.dm @@ -28,7 +28,6 @@ /spell/noclothes = 2, /obj/item/gun/energy/staff/focus = 1, /obj/item/gun/energy/staff/fire = 1, - /obj/structure/closet/wizard/souls = 1, /obj/item/gun/energy/staff/animate = 1, /obj/structure/closet/wizard/scrying = 1, /obj/item/summoning_stone = 2, diff --git a/code/modules/ventcrawl/ventcrawl.dm b/code/modules/ventcrawl/ventcrawl.dm index e044418f292..b9548f48bb9 100644 --- a/code/modules/ventcrawl/ventcrawl.dm +++ b/code/modules/ventcrawl/ventcrawl.dm @@ -10,11 +10,7 @@ var/global/list/ventcrawl_machinery = list( /obj/item/radio/borg, /obj/item/holder, /obj/machinery/camera, - /obj/item/clothing/head/culthood, - /obj/item/clothing/suit/cultrobes, - /obj/item/book/tome, - /obj/item/paper/, - /obj/item/sword/cultblade + /obj/item/paper ) /mob/living diff --git a/code/modules/xenoarcheaology/artifacts/triggers/energy.dm b/code/modules/xenoarcheaology/artifacts/triggers/energy.dm index 7075d6be0a9..7efb242c095 100644 --- a/code/modules/xenoarcheaology/artifacts/triggers/energy.dm +++ b/code/modules/xenoarcheaology/artifacts/triggers/energy.dm @@ -1,7 +1,6 @@ /datum/artifact_trigger/energy name = "applied high energy" var/static/list/energetic_things = list( - /obj/item/sword/cultblade, /obj/item/card/emag, /obj/item/multitool ) diff --git a/code/modules/xenoarcheaology/datums/artifact_find.dm b/code/modules/xenoarcheaology/datums/artifact_find.dm index 3a1ff11920a..744fcf31b48 100644 --- a/code/modules/xenoarcheaology/datums/artifact_find.dm +++ b/code/modules/xenoarcheaology/datums/artifact_find.dm @@ -3,7 +3,6 @@ var/artifact_find_type var/static/potential_finds = list( /obj/machinery/power/supermatter = 5, - /obj/structure/constructshell = 5, /obj/machinery/syndicate_beacon = 5, /obj/machinery/power/supermatter/shard = 25, /obj/machinery/auto_cloner = 100, diff --git a/code/modules/xenoarcheaology/finds/digsite_types.dm b/code/modules/xenoarcheaology/finds/digsite_types.dm index 88563d3ce35..8a3fffed241 100644 --- a/code/modules/xenoarcheaology/finds/digsite_types.dm +++ b/code/modules/xenoarcheaology/finds/digsite_types.dm @@ -51,13 +51,11 @@ /decl/xenoarch_digsite/temple find_types = list( - /decl/archaeological_find/cult = 200, /decl/archaeological_find/statuette = 200, /decl/archaeological_find/bowl/urn = 100, /decl/archaeological_find/bowl = 100, /decl/archaeological_find/knife = 100, /decl/archaeological_find/crystal = 100, - /decl/archaeological_find/cult/sword = 75, /decl/archaeological_find = 50, /decl/archaeological_find/trap = 25, /decl/archaeological_find/sword = 10, @@ -73,8 +71,6 @@ /decl/archaeological_find/laser = 75, /decl/archaeological_find/sword = 75, /decl/archaeological_find = 50, - /decl/archaeological_find/cult = 50, - /decl/archaeological_find/cult/sword = 50, /decl/archaeological_find/mask = 50, /decl/archaeological_find/trap = 25, /decl/archaeological_find/tool = 25 diff --git a/code/modules/xenoarcheaology/finds/find_types/statuette.dm b/code/modules/xenoarcheaology/finds/find_types/statuette.dm index 0ba51852ddf..ce0daf47304 100644 --- a/code/modules/xenoarcheaology/finds/find_types/statuette.dm +++ b/code/modules/xenoarcheaology/finds/find_types/statuette.dm @@ -17,7 +17,7 @@ name = "statuette" icon_state = "statuette" icon = 'icons/obj/xenoarchaeology.dmi' - material = /decl/material/solid/stone/cult + material = /decl/material/solid/stone/basalt var/charges = 0 var/list/nearby_mobs = list() var/last_bloodcall = 0 diff --git a/mods/content/psionics/datum/chems.dm b/mods/content/psionics/datum/chems.dm index 81941bd2c0f..f302bc693c7 100644 --- a/mods/content/psionics/datum/chems.dm +++ b/mods/content/psionics/datum/chems.dm @@ -13,18 +13,26 @@ required_reagents = list(/decl/material/liquid/blood = 15, /decl/material/liquid/crystal_agent = 1) result_amount = 1 +// TODO: #if defined(GAMEMODE_PACK_CULT) && defined(GAMEMODE_PACK_WIZARD) +// once wizard is modpacked +#ifdef GAMEMODE_PACK_CULT /decl/chemical_reaction/synthesis/nullglass/get_alternate_reaction_indicator(var/datum/reagents/holder) var/list/blood_data = REAGENT_DATA(holder, /decl/material/liquid/blood) var/weakref/donor_ref = LAZYACCESS(blood_data, "donor") var/mob/living/donor = donor_ref?.resolve() var/decl/special_role/wizard/wizards = GET_DECL(/decl/special_role/wizard) . = (istype(donor) && (!!donor.get_ability_handler(/datum/ability_handler/psionics) || (donor.mind && wizards.is_antagonist(donor.mind)))) +#endif /decl/chemical_reaction/synthesis/nullglass/on_reaction(var/datum/reagents/holder, var/created_volume, var/reaction_flags) var/location = get_turf(holder.get_reaction_loc(chemical_reaction_flags)) if(reaction_flags) + #ifdef GAMEMODE_PACK_CULT for(var/i = 1, i <= created_volume, i++) new /obj/item/soulstone(location) + #else + CRASH("Nullglass alternate reaction triggered in [holder.my_atom] without cult modpack loaded!") + #endif else for(var/i = 1, i <= created_volume*2, i++) new /obj/item/shard(location, /decl/material/solid/gemstone/crystal) \ No newline at end of file diff --git a/mods/content/psionics/items/soulstone.dm b/mods/content/psionics/items/soulstone.dm index 610d6632b93..a206e6dad68 100644 --- a/mods/content/psionics/items/soulstone.dm +++ b/mods/content/psionics/items/soulstone.dm @@ -1,3 +1,4 @@ +#ifdef GAMEMODE_PACK_CULT /obj/item/soulstone/disrupts_psionics() . = !full ? src : FALSE @@ -11,3 +12,4 @@ if(. > 0) . = max(0, . - rand(2,5)) shatter() +#endif \ No newline at end of file diff --git a/mods/gamemodes/cult/_cult.dme b/mods/gamemodes/cult/_cult.dme index 26a33f8aa06..25cf19fc2a3 100644 --- a/mods/gamemodes/cult/_cult.dme +++ b/mods/gamemodes/cult/_cult.dme @@ -8,6 +8,7 @@ // BEGIN_INCLUDE #include "_cult.dm" #include "archaeology.dm" +#include "codex.dm" #include "flooring.dm" #include "gamemode.dm" #include "ghosts.dm" @@ -15,7 +16,6 @@ #include "holy.dm" #include "items.dm" #include "materials.dm" -#include "mob_subtypes.dm" #include "narsie.dm" #include "objectives.dm" #include "overrides.dm" @@ -28,6 +28,10 @@ #include "cultify\defile.dm" #include "cultify\mob.dm" #include "cultify\turf.dm" +#include "mobs\mob_subtypes.dm" +#include "mobs\shade.dm" +#include "mobs\constructs\constructs.dm" +#include "mobs\constructs\soulstone.dm" #include "spells\construct.dm" #include "spells\harvest.dm" // END_INCLUDE diff --git a/mods/gamemodes/cult/archaeology.dm b/mods/gamemodes/cult/archaeology.dm index 94f4338aa34..1d81b9117c1 100644 --- a/mods/gamemodes/cult/archaeology.dm +++ b/mods/gamemodes/cult/archaeology.dm @@ -20,4 +20,21 @@ possible_types = list( /obj/item = 4, /obj/item/soulstone - ) \ No newline at end of file + ) + +/decl/xenoarch_digsite/temple/Initialize() + find_types[/decl/archaeological_find/cult] = 200 + find_types[/decl/archaeological_find/cult/sword] = 75 + return ..() + +/decl/xenoarch_digsite/war/Initialize() + find_types[/decl/archaeological_find/cult] = 50 + find_types[/decl/archaeological_find/cult/sword] = 50 + return ..() + +/datum/artifact_trigger/energy/New() + var/static/injected = FALSE + if(!injected) + energetic_things += /obj/item/sword/cultblade + injected = TRUE + ..() \ No newline at end of file diff --git a/mods/gamemodes/cult/codex.dm b/mods/gamemodes/cult/codex.dm new file mode 100644 index 00000000000..f2fe2a16ae2 --- /dev/null +++ b/mods/gamemodes/cult/codex.dm @@ -0,0 +1,3 @@ +/datum/codex_entry/cultblade + associated_paths = list(/obj/item/sword/cultblade) + antag_text = "This sword is a powerful weapon, capable of severing limbs easily, if they are targeted. Nonbelievers are unable to use this weapon." \ No newline at end of file diff --git a/mods/gamemodes/cult/ghosttrap.dm b/mods/gamemodes/cult/ghosttrap.dm new file mode 100644 index 00000000000..3e5d7452df6 --- /dev/null +++ b/mods/gamemodes/cult/ghosttrap.dm @@ -0,0 +1,28 @@ +/decl/ghosttrap/cult_shade + name = "shade" + ghost_trap_message = "They are occupying a soul stone now." + ban_checks = list(/decl/special_role/cultist) + pref_check = "ghost_shade" + can_set_own_name = FALSE + +/decl/ghosttrap/cult_shade/welcome_candidate(var/mob/target) + var/obj/item/soulstone/S = target.loc + if(istype(S)) + if(S.is_evil) + var/decl/special_role/cult = GET_DECL(/decl/special_role/cultist) + cult.add_antagonist(target.mind) + to_chat(target, "Remember, you serve the one who summoned you first, and the cult second.") + else + to_chat(target, "This soultone has been purified. You do not belong to the cult.") + to_chat(target, "Remember, you only serve the one who summoned you.") + +/decl/ghosttrap/cult_shade/forced(var/mob/user) + var/obj/item/soulstone/stone = new(get_turf(user)) + stone.shade = new(stone) + request_player(stone.shade, "The soul stone shade summon ritual has been performed. ") + +#ifdef GAMEMODE_PACK_DEITY +/decl/ghosttrap/cult_shade/Initialize() + ban_checks |= /decl/special_role/godcultist + . = ..() +#endif \ No newline at end of file diff --git a/mods/gamemodes/cult/materials.dm b/mods/gamemodes/cult/materials.dm index 991d12c9844..6b1165f2f05 100644 --- a/mods/gamemodes/cult/materials.dm +++ b/mods/gamemodes/cult/materials.dm @@ -18,3 +18,16 @@ /decl/material/solid/stone/cult/reinforced name = "runic inscriptions" uid = "solid_runes_cult" + +/decl/butchery_data/occult + meat_material = /decl/material/solid/stone/cult + meat_type = /obj/item/stack/material/lump + bone_material = /decl/material/solid/stone/cult/reinforced + + skin_material = null + skin_type = null + skin_amount = null + + gut_amount = null + gut_material = null + gut_type = null diff --git a/mods/gamemodes/cult/mob_subtypes.dm b/mods/gamemodes/cult/mob_subtypes.dm deleted file mode 100644 index 61e6b7c18b6..00000000000 --- a/mods/gamemodes/cult/mob_subtypes.dm +++ /dev/null @@ -1,6 +0,0 @@ -/mob/living/simple_animal/hostile/scarybat/cult - faction = "cult" - supernatural = TRUE - -/mob/living/simple_animal/hostile/scarybat/cult/on_defilement() - return diff --git a/code/modules/mob/living/simple_animal/constructs/constructs.dm b/mods/gamemodes/cult/mobs/constructs/constructs.dm similarity index 97% rename from code/modules/mob/living/simple_animal/constructs/constructs.dm rename to mods/gamemodes/cult/mobs/constructs/constructs.dm index a3679fe1ed5..29711d9ec27 100644 --- a/code/modules/mob/living/simple_animal/constructs/constructs.dm +++ b/mods/gamemodes/cult/mobs/constructs/constructs.dm @@ -89,14 +89,6 @@ else to_chat(user, SPAN_DANGER("It looks severely dented!")) -/obj/item/ectoplasm - name = "ectoplasm" - desc = "Spooky." - gender = PLURAL - icon = 'icons/obj/items/ectoplasm.dmi' - icon_state = ICON_STATE_WORLD - material = /decl/material/liquid/drink/compote - /////////////////Juggernaut/////////////// diff --git a/code/modules/mob/living/simple_animal/constructs/soulstone.dm b/mods/gamemodes/cult/mobs/constructs/soulstone.dm similarity index 100% rename from code/modules/mob/living/simple_animal/constructs/soulstone.dm rename to mods/gamemodes/cult/mobs/constructs/soulstone.dm diff --git a/mods/gamemodes/cult/mobs/mob_subtypes.dm b/mods/gamemodes/cult/mobs/mob_subtypes.dm new file mode 100644 index 00000000000..bdafcb5fa77 --- /dev/null +++ b/mods/gamemodes/cult/mobs/mob_subtypes.dm @@ -0,0 +1,15 @@ +/mob/living/simple_animal/hostile/scarybat/cult + faction = "cult" + supernatural = TRUE + +/mob/living/simple_animal/hostile/scarybat/cult/on_defilement() + return + +/mob/living/simple_animal/hostile/creature/cult + faction = "cult" + min_gas = null + max_gas = null + minbodytemp = 0 + +/mob/living/simple_animal/hostile/creature/cult/on_defilement() + return \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/shade.dm b/mods/gamemodes/cult/mobs/shade.dm similarity index 97% rename from code/modules/mob/living/simple_animal/shade.dm rename to mods/gamemodes/cult/mobs/shade.dm index dc93d7afb1e..1bf802e25c8 100644 --- a/code/modules/mob/living/simple_animal/shade.dm +++ b/mods/gamemodes/cult/mobs/shade.dm @@ -51,4 +51,4 @@ /mob/living/simple_animal/shade/mind_initialize() ..() - mind.assigned_role = "Shade" \ No newline at end of file + mind.assigned_role = "Shade" diff --git a/mods/gamemodes/cult/overrides.dm b/mods/gamemodes/cult/overrides.dm index c4aaab9411d..dcdc9699b2d 100644 --- a/mods/gamemodes/cult/overrides.dm +++ b/mods/gamemodes/cult/overrides.dm @@ -2,6 +2,7 @@ var/static/injected = FALSE if(!injected) potential_finds[/obj/structure/cult/pylon] = 50 + potential_finds[/obj/structure/constructshell] = 5 injected = TRUE ..() @@ -24,4 +25,40 @@ /obj/structure/cult = TRADER_SUBTYPES_ONLY, /obj/structure/constructshell = TRADER_ALL ) - ..() \ No newline at end of file + ..() + +/datum/trader/ship/clothingshop/hatglovesaccessories/New() + possible_trading_items[/obj/item/clothing/head/culthood] = TRADER_BLACKLIST_ALL + +/mob/living/silicon/ai + shouldnt_see = list(/obj/effect/rune) + +// Vent crawling whitelisted items, whoo +/mob/living/Initialize() + . = ..() + can_enter_vent_with += list( + /obj/item/clothing/head/culthood, + /obj/item/clothing/suit/cultrobes, + /obj/item/book/tome, + /obj/item/sword/cultblade + ) + +/obj/item/vampiric + material = /decl/material/solid/stone/cult + +/mob/safe_animal(var/MP) + . = ..() + if(ispath(MP, /mob/living/simple_animal/shade)) + return 1 + +/mob/living/simple_animal/hostile/faithless + butchery_data = /decl/butchery_data/occult + +/mob/living/simple_animal/hostile/faithless/cult + faction = "cult" + +/mob/living/simple_animal/hostile/faithless/cult/on_defilement() + return + +/obj/item/mop/Initialize() + moppable_types += /obj/effect/rune diff --git a/mods/gamemodes/cult/structures.dm b/mods/gamemodes/cult/structures.dm index 19a803ca62d..59d38e3848b 100644 --- a/mods/gamemodes/cult/structures.dm +++ b/mods/gamemodes/cult/structures.dm @@ -179,4 +179,14 @@ material = null reinf_material = null parts_type = null - . = ..() \ No newline at end of file + . = ..() + +/obj/structure/grille/cult + name = "cult grille" + desc = "A matrice built out of an unknown material, with some sort of force field blocking air around it." + material = /decl/material/solid/stone/cult + +/obj/structure/grille/cult/CanPass(atom/movable/mover, turf/target, height = 1.5, air_group = 0) + if(air_group) + return 0 //Make sure air doesn't drain + ..() \ No newline at end of file diff --git a/mods/gamemodes/cult/wizard.dm b/mods/gamemodes/cult/wizard.dm new file mode 100644 index 00000000000..b29fa023f65 --- /dev/null +++ b/mods/gamemodes/cult/wizard.dm @@ -0,0 +1,47 @@ +// #ifdef GAMEMODE_PACK_WIZARD +// todo: add wizard gamemode define check once it's modularized +/decl/modpack/cult/post_initialize() + . = ..() + global.artefact_feedback[/obj/structure/closet/wizard/souls] = "SS" + +/datum/spellbook/standard/New() + spells[/obj/structure/closet/wizard/souls] = 1 + ..() + +/datum/spellbook/druid/New() + spells[/obj/structure/closet/wizard/souls] = 1 + ..() + +/obj/structure/closet/wizard/souls + name = "Soul Shard Belt" + desc = "Soul Stone Shards are ancient tools capable of capturing and harnessing the spirits of the dead and dying. The spell Artificer allows you to create arcane machines for the captured souls to pilot. This also includes the spell Artificer, used to create the shells used in construct creation." + +/obj/structure/closet/wizard/souls/WillContain() + return list( + /obj/item/contract/boon/wizard/artificer, + /obj/item/belt/soulstone/full, + ) + +/datum/storage/belt/soulstone + can_hold = list( + /obj/item/soulstone + ) + +/obj/item/belt/soulstone + name = "soul stone belt" + desc = "Designed for ease of access to the shards during a fight, as to not let a single enemy spirit slip away." + icon = 'icons/clothing/belt/soulstones.dmi' + storage = /datum/storage/belt/soulstone + +/obj/item/belt/soulstone/full/WillContain() + return list(/obj/item/soulstone = max(1, storage?.storage_slots)) + +/obj/item/contract/boon/wizard/artificer + path = /spell/aoe_turf/conjure/construct + desc = "This contract has a passage dedicated to an entity known as 'Nar-Sie'." + +/obj/item/magic_rock + material = /decl/material/solid/stone/cult + +/obj/item/summoning_stone + material = /decl/material/solid/stone/cult \ No newline at end of file diff --git a/mods/gamemodes/deity/overrides.dm b/mods/gamemodes/deity/overrides.dm index 483514e13fd..b742b46ef12 100644 --- a/mods/gamemodes/deity/overrides.dm +++ b/mods/gamemodes/deity/overrides.dm @@ -12,10 +12,6 @@ var/decl/special_role/godcult = GET_DECL(/decl/special_role/godcultist) godcult.remove_antagonist(target.mind, TRUE) -/decl/ghosttrap/cult_shade/Initialize() - ban_checks |= /decl/special_role/godcultist - . = ..() - /decl/material/liquid/water/affect_holy(mob/living/M, removed, datum/reagents/holder) . = ..() if(.) diff --git a/nebula.dme b/nebula.dme index 591dc75c426..a88824d612a 100644 --- a/nebula.dme +++ b/nebula.dme @@ -2895,7 +2895,6 @@ #include "code\modules\mob\living\silicon\robot\modules\module_standard.dm" #include "code\modules\mob\living\silicon\robot\modules\module_uncertified.dm" #include "code\modules\mob\living\simple_animal\natural_weapons.dm" -#include "code\modules\mob\living\simple_animal\shade.dm" #include "code\modules\mob\living\simple_animal\simple_animal.dm" #include "code\modules\mob\living\simple_animal\simple_animal_codex.dm" #include "code\modules\mob\living\simple_animal\simple_animal_combat.dm" @@ -2907,8 +2906,6 @@ #include "code\modules\mob\living\simple_animal\aquatic\aquatic_carp.dm" #include "code\modules\mob\living\simple_animal\aquatic\aquatic_fish.dm" #include "code\modules\mob\living\simple_animal\aquatic\aquatic_sharks.dm" -#include "code\modules\mob\living\simple_animal\constructs\constructs.dm" -#include "code\modules\mob\living\simple_animal\constructs\soulstone.dm" #include "code\modules\mob\living\simple_animal\crow\crow.dm" #include "code\modules\mob\living\simple_animal\familiars\familiars.dm" #include "code\modules\mob\living\simple_animal\friendly\cat.dm" From 3a1b4bc44da245a028ced766278e27a98d7419b1 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Tue, 18 Jun 2024 19:17:07 -0400 Subject: [PATCH 79/90] Include cult gamemode modpack in maps --- maps/exodus/exodus.dm | 1 + maps/ministation/ministation.dm | 1 + maps/modpack_testing/modpack_testing.dm | 1 + maps/tradeship/tradeship.dm | 1 + 4 files changed, 4 insertions(+) diff --git a/maps/exodus/exodus.dm b/maps/exodus/exodus.dm index d3db328f744..a80ab69bab7 100644 --- a/maps/exodus/exodus.dm +++ b/maps/exodus/exodus.dm @@ -1,6 +1,7 @@ #if !defined(USING_MAP_DATUM) #include "../../mods/gamemodes/deity/_deity.dme" + #include "../../mods/gamemodes/cult/_cult.dme" #include "../../mods/gamemodes/heist/_heist.dme" #include "../../mods/gamemodes/meteor/_meteor.dme" #include "../../mods/gamemodes/ninja/_ninja.dme" diff --git a/maps/ministation/ministation.dm b/maps/ministation/ministation.dm index fbabff707e0..5c1503f3ae6 100644 --- a/maps/ministation/ministation.dm +++ b/maps/ministation/ministation.dm @@ -15,6 +15,7 @@ Twice... #include "../../code/unit_tests/offset_tests.dm" #endif + #include "../../mods/gamemodes/cult/_cult.dme" #include "../../mods/gamemodes/heist/_heist.dme" #include "../../mods/gamemodes/ninja/_ninja.dme" #include "../../mods/gamemodes/revolution/_revolution.dme" diff --git a/maps/modpack_testing/modpack_testing.dm b/maps/modpack_testing/modpack_testing.dm index 2baba870f3d..a0b7b26ba69 100644 --- a/maps/modpack_testing/modpack_testing.dm +++ b/maps/modpack_testing/modpack_testing.dm @@ -4,6 +4,7 @@ #include "blank.dmm" #include "../../mods/gamemodes/deity/_deity.dme" + #include "../../mods/gamemodes/cult/_cult.dme" #include "../../mods/gamemodes/heist/_heist.dme" #include "../../mods/gamemodes/meteor/_meteor.dme" #include "../../mods/gamemodes/ninja/_ninja.dme" diff --git a/maps/tradeship/tradeship.dm b/maps/tradeship/tradeship.dm index 216ad790400..9b152b435f6 100644 --- a/maps/tradeship/tradeship.dm +++ b/maps/tradeship/tradeship.dm @@ -4,6 +4,7 @@ #include "../../code/unit_tests/offset_tests.dm" #endif + #include "../../mods/gamemodes/cult/_cult.dme" #include "../../mods/gamemodes/heist/_heist.dme" #include "../../mods/gamemodes/ninja/_ninja.dme" #include "../../mods/gamemodes/revolution/_revolution.dme" From f34a89d6288fae7ba60b9be77ad06df4cf5f385e Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Tue, 18 Jun 2024 19:18:24 -0400 Subject: [PATCH 80/90] Fix missing ectoplasm --- .../modules/mob/living/simple_animal/hostile/faithless.dm | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/code/modules/mob/living/simple_animal/hostile/faithless.dm b/code/modules/mob/living/simple_animal/hostile/faithless.dm index 085b6cb906b..b5f09072942 100644 --- a/code/modules/mob/living/simple_animal/hostile/faithless.dm +++ b/code/modules/mob/living/simple_animal/hostile/faithless.dm @@ -42,3 +42,11 @@ if(prob(12)) SET_STATUS_MAX(L, STAT_WEAK, 3) L.visible_message("\the [src] knocks down \the [L]!") + +/obj/item/ectoplasm + name = "ectoplasm" + desc = "Spooky." + gender = PLURAL + icon = 'icons/obj/items/ectoplasm.dmi' + icon_state = ICON_STATE_WORLD + material = /decl/material/liquid/drink/compote \ No newline at end of file From dbee7dd17ef3c383eea6b8aba19c84856219316c Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Tue, 18 Jun 2024 19:33:48 -0400 Subject: [PATCH 81/90] Fix cult modpack issues --- mods/gamemodes/cult/_cult.dm | 14 ++++++++++++++ mods/gamemodes/cult/_cult.dme | 2 ++ mods/gamemodes/cult/cultify/de-cultify.dm | 2 +- mods/gamemodes/cult/ghosts.dm | 2 +- mods/gamemodes/cult/overrides.dm | 1 + mods/gamemodes/cult/runes.dm | 2 +- mods/gamemodes/cult/special_role.dm | 14 -------------- 7 files changed, 20 insertions(+), 17 deletions(-) diff --git a/mods/gamemodes/cult/_cult.dm b/mods/gamemodes/cult/_cult.dm index 6dada8891a0..37d934178bb 100644 --- a/mods/gamemodes/cult/_cult.dm +++ b/mods/gamemodes/cult/_cult.dm @@ -1,5 +1,19 @@ #define isconstruct(A) istype(A, /mob/living/simple_animal/construct) +#define CULTINESS_PER_CULTIST 40 +#define CULTINESS_PER_SACRIFICE 40 +#define CULTINESS_PER_TURF 1 + +#define CULT_RUNES_1 200 +#define CULT_RUNES_2 400 +#define CULT_RUNES_3 1000 + +#define CULT_GHOSTS_1 400 +#define CULT_GHOSTS_2 800 +#define CULT_GHOSTS_3 1200 + +#define CULT_MAX_CULTINESS 1200 // When this value is reached, the game stops checking for updates so we don't recheck every time a tile is converted in endgame + /decl/modpack/cult name = "Cult Gamemode Content" diff --git a/mods/gamemodes/cult/_cult.dme b/mods/gamemodes/cult/_cult.dme index 25cf19fc2a3..bda33c4bf96 100644 --- a/mods/gamemodes/cult/_cult.dme +++ b/mods/gamemodes/cult/_cult.dme @@ -12,6 +12,7 @@ #include "flooring.dm" #include "gamemode.dm" #include "ghosts.dm" +#include "ghosttrap.dm" #include "hell_universe.dm" #include "holy.dm" #include "items.dm" @@ -24,6 +25,7 @@ #include "special_role.dm" #include "structures.dm" #include "talisman.dm" +#include "wizard.dm" #include "cultify\de-cultify.dm" #include "cultify\defile.dm" #include "cultify\mob.dm" diff --git a/mods/gamemodes/cult/cultify/de-cultify.dm b/mods/gamemodes/cult/cultify/de-cultify.dm index a1577b31d79..32c0738df02 100644 --- a/mods/gamemodes/cult/cultify/de-cultify.dm +++ b/mods/gamemodes/cult/cultify/de-cultify.dm @@ -1,7 +1,7 @@ /turf/unsimulated/wall/cult/nullrod_act(mob/user, obj/item/nullrod/rod) user.visible_message( SPAN_NOTICE("\The [user] touches \the [src] with \the [rod], and it shifts."), - SPAN_NOTICE("You touch \the [src] with \the [I], and it shifts.") + SPAN_NOTICE("You touch \the [src] with \the [rod], and it shifts.") ) ChangeTurf(/turf/unsimulated/wall) return TRUE \ No newline at end of file diff --git a/mods/gamemodes/cult/ghosts.dm b/mods/gamemodes/cult/ghosts.dm index 37800881859..9d9763e6bbf 100644 --- a/mods/gamemodes/cult/ghosts.dm +++ b/mods/gamemodes/cult/ghosts.dm @@ -34,7 +34,7 @@ /mob/living/do_possession(var/mob/observer/ghost/possessor) if(round_is_spooky(6)) // Six or more active cultists. to_chat(src, SPAN_NOTICE("You reach out with tendrils of ectoplasm and invade the mind of \the [src]...")) - to_chat(src, FONT_BOLD("You have assumed direct control of \the [src].")) + to_chat(src, SPAN_BOLD("You have assumed direct control of \the [src].")) to_chat(src, SPAN_NOTICE("Due to the spookiness of the round, you have taken control of the poor animal as an invading, possessing spirit - roleplay accordingly.")) src.universal_speak = TRUE src.universal_understand = TRUE diff --git a/mods/gamemodes/cult/overrides.dm b/mods/gamemodes/cult/overrides.dm index dcdc9699b2d..14c8a56d1ee 100644 --- a/mods/gamemodes/cult/overrides.dm +++ b/mods/gamemodes/cult/overrides.dm @@ -61,4 +61,5 @@ return /obj/item/mop/Initialize() + . = ..() moppable_types += /obj/effect/rune diff --git a/mods/gamemodes/cult/runes.dm b/mods/gamemodes/cult/runes.dm index f6de41b76ea..e8b2c869224 100644 --- a/mods/gamemodes/cult/runes.dm +++ b/mods/gamemodes/cult/runes.dm @@ -98,7 +98,7 @@ return OPERATE_PASSABLE /turf/remove_cleanables() - for(var/obj/effect/decal/rune/rune in src) + for(var/obj/effect/rune/rune in src) qdel(rune) /* Tier 1 runes below */ diff --git a/mods/gamemodes/cult/special_role.dm b/mods/gamemodes/cult/special_role.dm index 2ef8405cd59..fe7a4401341 100644 --- a/mods/gamemodes/cult/special_role.dm +++ b/mods/gamemodes/cult/special_role.dm @@ -1,17 +1,3 @@ -#define CULTINESS_PER_CULTIST 40 -#define CULTINESS_PER_SACRIFICE 40 -#define CULTINESS_PER_TURF 1 - -#define CULT_RUNES_1 200 -#define CULT_RUNES_2 400 -#define CULT_RUNES_3 1000 - -#define CULT_GHOSTS_1 400 -#define CULT_GHOSTS_2 800 -#define CULT_GHOSTS_3 1200 - -#define CULT_MAX_CULTINESS 1200 // When this value is reached, the game stops checking for updates so we don't recheck every time a tile is converted in endgame - /proc/iscultist(var/mob/player) var/decl/special_role/cult = GET_DECL(/decl/special_role/cultist) if(player.mind && (player.mind in cult.current_antagonists)) From 1eb775f272865390a83cdae673546e55175674ba Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Tue, 18 Jun 2024 20:11:24 -0400 Subject: [PATCH 82/90] Move uprising gamemode into mixed mode modpack --- mods/gamemodes/mixed/_mixed.dme | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/gamemodes/mixed/_mixed.dme b/mods/gamemodes/mixed/_mixed.dme index 411ab39aa4c..6db33d07706 100644 --- a/mods/gamemodes/mixed/_mixed.dme +++ b/mods/gamemodes/mixed/_mixed.dme @@ -8,7 +8,7 @@ #if defined(GAMEMODE_PACK_REVOLUTIONARY) #include "siege.dm" #endif -#if defined(GAMEMODE_PACK_REVOLUTIONARY) // TODO: && defined(GAMEMODE_PACK_CULT) +#if defined(GAMEMODE_PACK_REVOLUTIONARY) && defined(GAMEMODE_PACK_CULT) #include "uprising.dm" #endif // END_INCLUDE From ea3bb114a85b367077e2acc3b48adf9a3341b2d7 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Tue, 18 Jun 2024 20:23:18 -0400 Subject: [PATCH 83/90] Fix cult-related Deity issues --- maps/exodus/exodus.dm | 2 +- maps/modpack_testing/modpack_testing.dm | 2 +- mods/gamemodes/deity/_deity.dme | 14 +++- mods/gamemodes/deity/codex.dm | 5 -- mods/gamemodes/deity/forms/narsie/_include.dm | 11 --- .../forms/narsie/deity_items/smithing.dm | 41 ++++----- mods/gamemodes/deity/forms/narsie/narsie.dm | 50 +++++------ .../deity/forms/narsie/structures.dm | 83 +++---------------- .../deity/forms/starlight/structures.dm | 74 +++++++++-------- .../deity/mobs/items/blood_crafting.dm | 19 +++++ .../gamemodes/deity/structures/blood_forge.dm | 66 +++++++++++++++ 11 files changed, 191 insertions(+), 176 deletions(-) delete mode 100644 mods/gamemodes/deity/forms/narsie/_include.dm create mode 100644 mods/gamemodes/deity/mobs/items/blood_crafting.dm create mode 100644 mods/gamemodes/deity/structures/blood_forge.dm diff --git a/maps/exodus/exodus.dm b/maps/exodus/exodus.dm index a80ab69bab7..7b58953825d 100644 --- a/maps/exodus/exodus.dm +++ b/maps/exodus/exodus.dm @@ -1,7 +1,7 @@ #if !defined(USING_MAP_DATUM) - #include "../../mods/gamemodes/deity/_deity.dme" #include "../../mods/gamemodes/cult/_cult.dme" + #include "../../mods/gamemodes/deity/_deity.dme" #include "../../mods/gamemodes/heist/_heist.dme" #include "../../mods/gamemodes/meteor/_meteor.dme" #include "../../mods/gamemodes/ninja/_ninja.dme" diff --git a/maps/modpack_testing/modpack_testing.dm b/maps/modpack_testing/modpack_testing.dm index a0b7b26ba69..21bbecf096f 100644 --- a/maps/modpack_testing/modpack_testing.dm +++ b/maps/modpack_testing/modpack_testing.dm @@ -3,8 +3,8 @@ #include "modpack_testing_lobby.dm" #include "blank.dmm" - #include "../../mods/gamemodes/deity/_deity.dme" #include "../../mods/gamemodes/cult/_cult.dme" + #include "../../mods/gamemodes/deity/_deity.dme" #include "../../mods/gamemodes/heist/_heist.dme" #include "../../mods/gamemodes/meteor/_meteor.dme" #include "../../mods/gamemodes/ninja/_ninja.dme" diff --git a/mods/gamemodes/deity/_deity.dme b/mods/gamemodes/deity/_deity.dme index 6bcd0f6b2c2..a1603dd317d 100644 --- a/mods/gamemodes/deity/_deity.dme +++ b/mods/gamemodes/deity/_deity.dme @@ -11,7 +11,17 @@ #include "overrides.dm" #include "extensions\deity_be_near.dm" #include "forms\forms.dm" -#include "forms\narsie\_include.dm" +// These should only load if cult is loaded. +#ifdef GAMEMODE_PACK_CULT +#include "forms\narsie\items.dm" +#include "forms\narsie\narsie.dm" +#include "forms\narsie\structures.dm" +#include "forms\narsie\deity_items\basic.dm" +#include "forms\narsie\deity_items\minions.dm" +#include "forms\narsie\deity_items\sacrificing.dm" +#include "forms\narsie\deity_items\smithing.dm" +#include "forms\narsie\spells\tear_veil.dm" +#endif #include "forms\starlight\items.dm" #include "forms\starlight\mobs.dm" #include "forms\starlight\starlight.dm" @@ -42,6 +52,7 @@ #include "mobs\say.dm" #include "mobs\freelook\cultnet.dm" #include "mobs\freelook\mask.dm" +#include "mobs\items\blood_crafting.dm" #include "mobs\items\deity_item.dm" #include "mobs\items\general.dm" #include "mobs\items\generic.dm" @@ -61,6 +72,7 @@ #include "spells\open_gateway.dm" #include "spells\vision.dm" #include "structures\altar.dm" +#include "structures\blood_forge.dm" #include "structures\pylon.dm" #include "structures\structures.dm" #include "structures\trap.dm" diff --git a/mods/gamemodes/deity/codex.dm b/mods/gamemodes/deity/codex.dm index 59cc978a76a..fae5bfe607a 100644 --- a/mods/gamemodes/deity/codex.dm +++ b/mods/gamemodes/deity/codex.dm @@ -12,11 +12,6 @@ antag_text = "Allows creation of special items by feeding your blood into it. Only usable by cultists of the aligned deity." disambiguator = "occult" -/datum/codex_entry/deity/blood_stone - associated_paths = list(/obj/structure/deity/blood_stone) - antag_text = "Allows the user to feed blood directly to the aligned deity, granting it power." - disambiguator = "occult" - /datum/codex_entry/deity/gateway associated_paths = list(/obj/structure/deity/gateway) antag_text = "Stand within the gateway to be transported to an unknown dimension and transformed into a flaming Starborn, a mysterious Blueforged or a subtle Shadowling." diff --git a/mods/gamemodes/deity/forms/narsie/_include.dm b/mods/gamemodes/deity/forms/narsie/_include.dm deleted file mode 100644 index 285a3bc26bc..00000000000 --- a/mods/gamemodes/deity/forms/narsie/_include.dm +++ /dev/null @@ -1,11 +0,0 @@ -// These should only load if cult is loaded. -#ifdef GAMEMODE_PACK_CULT -#include "items.dm" -#include "narsie.dm" -#include "structures.dm" -#include "deity_items\basic.dm" -#include "deity_items\minions.dm" -#include "deity_items\sacrificing.dm" -#include "deity_items\smithing.dm" -#include "spells\tear_veil.dm" -#endif \ No newline at end of file diff --git a/mods/gamemodes/deity/forms/narsie/deity_items/smithing.dm b/mods/gamemodes/deity/forms/narsie/deity_items/smithing.dm index 6d43233bf91..bcb12ff11e3 100644 --- a/mods/gamemodes/deity/forms/narsie/deity_items/smithing.dm +++ b/mods/gamemodes/deity/forms/narsie/deity_items/smithing.dm @@ -1,24 +1,9 @@ -/datum/deity_item/blood_crafting - name = DEITY_BLOOD_CRAFT - desc = "Unlocks the blood smithing structure which allows followers to forge unholy tools from blood and flesh." - category = DEITY_BLOOD_CRAFT - max_level = 1 - base_cost = 75 - var/forge_type = /obj/structure/deity/blood_forge - var/list/recipes = list(/obj/item/sword/cultblade = 50, - /obj/item/clothing/head/culthood/alt = 10, - /obj/item/clothing/suit/cultrobes/alt = 20 - ) - -/datum/deity_item/blood_crafting/buy(var/mob/living/deity/user) - ..() - user.form.buildables |= forge_type //put structure here - var/list/L = user.feats[name] - if(!L) - L = list() - for(var/type in recipes) - L[type] = recipes[type] - user.feats[name] = L +/datum/deity_item/blood_crafting/narsie + recipes = list( + /obj/item/sword/cultblade = 50, + /obj/item/clothing/head/culthood/alt = 10, + /obj/item/clothing/suit/cultrobes/alt = 20 + ) /datum/deity_item/blood_crafting/armored name = DEITY_ARMOR_CRAFT @@ -26,9 +11,11 @@ category = DEITY_BLOOD_CRAFT base_cost = 75 requirements = list(DEITY_BLOOD_CRAFT = 1) - recipes = list(/obj/item/clothing/suit/cultrobes/magusred = 80, - /obj/item/clothing/head/culthood/magus = 50, - /obj/structure/constructshell/cult = 70) //also shield? + recipes = list( + /obj/item/clothing/suit/cultrobes/magusred = 80, + /obj/item/clothing/head/culthood/magus = 50, + /obj/structure/constructshell/cult = 70 + ) //also shield? /datum/deity_item/blood_crafting/space name = DEITY_VOID_CRAFT @@ -36,5 +23,7 @@ category = DEITY_BLOOD_CRAFT base_cost = 100 requirements = list(DEITY_BLOOD_CRAFT = 1, DEITY_ARMOR_CRAFT = 1) - recipes = list(/obj/item/clothing/suit/space/cult = 100, - /obj/item/clothing/head/helmet/space/cult = 70) //Probably more too. \ No newline at end of file + recipes = list( + /obj/item/clothing/suit/space/cult = 100, + /obj/item/clothing/head/helmet/space/cult = 70 + ) //Probably more too. \ No newline at end of file diff --git a/mods/gamemodes/deity/forms/narsie/narsie.dm b/mods/gamemodes/deity/forms/narsie/narsie.dm index 12694187967..1529c67f691 100644 --- a/mods/gamemodes/deity/forms/narsie/narsie.dm +++ b/mods/gamemodes/deity/forms/narsie/narsie.dm @@ -12,30 +12,32 @@ pylon_icon_state = "shade" faction = "cult" - buildables = list(/obj/structure/deity/altar/narsie, - /obj/structure/deity/pylon - ) - items = list(/datum/deity_item/general/potential, - /datum/deity_item/general/regeneration, - /datum/deity_item/boon/eternal_darkness, - /datum/deity_item/boon/torment, - /datum/deity_item/boon/blood_shard, - /datum/deity_item/boon/drain_blood, - /datum/deity_item/phenomena/exude_blood, - /datum/deity_item/sacrifice, - /datum/deity_item/boon/sac_dagger, - /datum/deity_item/boon/sac_spell, - /datum/deity_item/boon/execution_axe, - /datum/deity_item/blood_stone, - /datum/deity_item/minions, - /datum/deity_item/boon/soul_shard, - /datum/deity_item/boon/blood_zombie, - /datum/deity_item/boon/tear_veil, - /datum/deity_item/phenomena/hellscape, - /datum/deity_item/blood_crafting, - /datum/deity_item/blood_crafting/armored, - /datum/deity_item/blood_crafting/space - ) + buildables = list( + /obj/structure/deity/altar/narsie, + /obj/structure/deity/pylon + ) + items = list( + /datum/deity_item/general/potential, + /datum/deity_item/general/regeneration, + /datum/deity_item/boon/eternal_darkness, + /datum/deity_item/boon/torment, + /datum/deity_item/boon/blood_shard, + /datum/deity_item/boon/drain_blood, + /datum/deity_item/phenomena/exude_blood, + /datum/deity_item/sacrifice, + /datum/deity_item/boon/sac_dagger, + /datum/deity_item/boon/sac_spell, + /datum/deity_item/boon/execution_axe, + /datum/deity_item/blood_stone, + /datum/deity_item/minions, + /datum/deity_item/boon/soul_shard, + /datum/deity_item/boon/blood_zombie, + /datum/deity_item/boon/tear_veil, + /datum/deity_item/phenomena/hellscape, + /datum/deity_item/blood_crafting/narsie, + /datum/deity_item/blood_crafting/armored, + /datum/deity_item/blood_crafting/space + ) /datum/god_form/narsie/take_charge(var/mob/living/user, var/charge) charge = min(100, charge * 0.25) diff --git a/mods/gamemodes/deity/forms/narsie/structures.dm b/mods/gamemodes/deity/forms/narsie/structures.dm index 2f14ef5d237..af576963a1f 100644 --- a/mods/gamemodes/deity/forms/narsie/structures.dm +++ b/mods/gamemodes/deity/forms/narsie/structures.dm @@ -3,73 +3,6 @@ desc = "A small desk, covered in blood." icon_state = "talismanaltar" -/obj/structure/deity/blood_forge - name = "unholy forge" - desc = "This forge gives off no heat, no light, its flames look almost unnatural." - icon_state = "forge" - build_cost = 1000 - current_health = 50 - var/busy = 0 - var/recipe_feat_list = "Blood Crafting" - var/text_modifications = list( - "Cost" = "Blood", - "Dip" = "fire. Pain envelops you as blood seeps out of your hands and you begin to shape it into something more useful", - "Shape" = "You shape the fire as more and more blood comes out.", - "Out" = "flames" - ) - - power_adjustment = 2 - -/obj/structure/deity/blood_forge/attack_hand(var/mob/user) - if(!linked_god || !linked_god.is_follower(user, silent = 1) || !ishuman(user)) - return ..() - var/list/recipes = linked_god.feats[recipe_feat_list] - if(!recipes) - return TRUE - var/dat = "
    Recipes


    Item - [text_modifications["Cost"]] Cost
    " - for(var/type in recipes) - var/atom/a = type - var/cost = recipes[type] - dat += "[initial(a.name)] - [cost]
    [initial(a.desc)]

    " - show_browser(user, dat, "window=forge") - return TRUE - -/obj/structure/deity/blood_forge/CanUseTopic(var/user) - if(!linked_god || !linked_god.is_follower(user, silent = 1) || !ishuman(user)) - return STATUS_CLOSE - return ..() - -/obj/structure/deity/blood_forge/OnTopic(var/user, var/list/href_list) - if(href_list["make_recipe"]) - var/list/recipes = linked_god.feats[recipe_feat_list] - var/type = locate(href_list["make_recipe"]) in recipes - if(type) - var/cost = recipes[type] - craft_item(type, cost, user) - return TOPIC_REFRESH - -/obj/structure/deity/blood_forge/proc/craft_item(var/path, var/blood_cost, var/mob/user) - if(busy) - to_chat(user, SPAN_WARNING("Someone is already using \the [src]!")) - return - - busy = 1 - to_chat(user, SPAN_NOTICE("You dip your hands into \the [src]'s [text_modifications["Dip"]]")) - for(var/count = 0, count < blood_cost/10, count++) - if(!do_after(user, 50,src)) - busy = 0 - return - user.visible_message("\The [user] swirls their hands in \the [src].", text_modifications["Shape"]) - if(linked_god) - linked_god.take_charge(user, 10) - var/obj/item/I = new path(get_turf(src)) - user.visible_message("\The [user] pull out \the [I] from the [text_modifications["Out"]].", "You pull out the completed [I] from the [text_modifications["Out"]].") - busy = 0 - -/obj/structure/deity/blood_forge/proc/take_charge(var/mob/living/user, var/charge) - if(linked_god) - linked_god.take_charge(user, charge) - //BLOODLETTING STRUCTURE //A follower can stand here and mumble prayers as they let their blood flow slowly into the structure. /obj/structure/deity/blood_stone @@ -84,12 +17,20 @@ if(!linked_god || !linked_god.is_follower(user, silent = 1) || !ishuman(user)) return ..() var/mob/living/human/H = user - user.visible_message(SPAN_WARNING("\The [user] calmly slices their finger on \the [src], smeering it over the black stone."),SPAN_WARNING("You slowly slide your finger down one of \the [src]'s sharp edges, smeering it over its smooth surface.")) - while(do_after(H,50,src)) + user.visible_message( + SPAN_WARNING("\The [user] calmly slices their finger on \the [src], smearing their blood over the black stone."), + SPAN_WARNING("You slowly slide your finger down one of \the [src]'s sharp edges, smearing your blood over its smooth surface.") + ) + while(do_after(H, 5 SECONDS, src)) user.audible_message("\The [user] utters something under their breath.", SPAN_OCCULT("You mutter a dark prayer to your master as you feel the stone eat away at your lifeforce.")) if(H.should_have_organ(BP_HEART)) - H.drip(5,get_turf(src)) + H.drip(5, get_turf(src)) else H.take_damage(5) - linked_god.adjust_power_min(1,1) + linked_god.adjust_power_min(1, 1) return TRUE + +/datum/codex_entry/deity/blood_stone + associated_paths = list(/obj/structure/deity/blood_stone) + antag_text = "Allows the user to feed blood directly to the aligned deity, granting it power." + disambiguator = "occult" \ No newline at end of file diff --git a/mods/gamemodes/deity/forms/starlight/structures.dm b/mods/gamemodes/deity/forms/starlight/structures.dm index 83111f55c28..ed147b4db70 100644 --- a/mods/gamemodes/deity/forms/starlight/structures.dm +++ b/mods/gamemodes/deity/forms/starlight/structures.dm @@ -18,35 +18,35 @@ var/power_drain = 7 var/looking_for var/static/list/possible_forms = list( - "Starborn" = list( - "description" = "A species of hardy fire-wreathed soldiers.", - "message" = "As a Starborn, you are immune to laser-fire you are a hardy soldier, able to take on the greatest of foes.", - "species" = "Starborn" - ), - "Blueforged" = list( - "description" = "Trans-dimensional beings with a multitude of miraculous abilities.", - "message" = "As a Blueforged, you are immune to all physical damage... except for heat. Not even your god can protect you.", - "species" = "Blueforged", - "spells" = list( - /spell/targeted/ethereal_jaunt, - /spell/targeted/shatter, - /spell/hand/burning_grip, - /spell/aoe_turf/disable_tech, - /spell/targeted/projectile/magic_missile, - /spell/open_gateway - ) - ), - "Shadowling" = list( - "description" = "Beings that come from a place of no light. They sneak from place to place, disabling everyone they touch..", - "message" = "As a Shadow you take damage from the light itself but have the ability to vanish from sight itself.", - "species" = "Shadow", - "spells" = list( - /spell/veil_of_shadows, - /spell/targeted/subjugation, - /spell/targeted/projectile/magic_missile - ) - ) - ) + "Starborn" = list( + "description" = "A species of hardy fire-wreathed soldiers.", + "message" = "As a Starborn, you are immune to laser-fire you are a hardy soldier, able to take on the greatest of foes.", + "species" = "Starborn" + ), + "Blueforged" = list( + "description" = "Trans-dimensional beings with a multitude of miraculous abilities.", + "message" = "As a Blueforged, you are immune to all physical damage... except for heat. Not even your god can protect you.", + "species" = "Blueforged", + "spells" = list( + /spell/targeted/ethereal_jaunt, + /spell/targeted/shatter, + /spell/hand/burning_grip, + /spell/aoe_turf/disable_tech, + /spell/targeted/projectile/magic_missile, + /spell/open_gateway + ) + ), + "Shadowling" = list( + "description" = "Beings that come from a place of no light. They sneak from place to place, disabling everyone they touch..", + "message" = "As a Shadow you take damage from the light itself but have the ability to vanish from sight itself.", + "species" = "Shadow", + "spells" = list( + /spell/veil_of_shadows, + /spell/targeted/subjugation, + /spell/targeted/projectile/magic_missile + ) + ) + ) /obj/structure/deity/gateway/Initialize() . = ..() @@ -202,7 +202,7 @@ return 0 charging = 1 START_PROCESSING(SSobj, src) - src.visible_message("\The [src] hums, activating.") + src.visible_message(SPAN_NOTICE("\The [src] hums, activating.")) update_icon() return 1 @@ -236,7 +236,7 @@ return if(charge == 40) - src.visible_message("\The [src] lights up, pulsing with energy.") + src.visible_message(SPAN_NOTICE("\The [src] lights up, pulsing with energy.")) charging = 0 update_icon() else @@ -256,7 +256,7 @@ /obj/structure/deity/radiant_statue/proc/stop_charging() STOP_PROCESSING(SSobj, src) - src.visible_message("\The [src] powers down, returning to it's dormant form.") + src.visible_message(SPAN_NOTICE("\The [src] powers down, returning to its dormant form.")) charging = 0 update_icon() @@ -264,7 +264,9 @@ name = "radiant forge" desc = "a swath of heat and fire permeats from this forge." recipe_feat_list = "Fire Crafting" - text_modifications = list("Cost" = "Burn", - "Dip" = "fire. Pain envelopes you as dark burns mar your hands and you begin to shape it into something more useful", - "Shape" = "You shape the fire, ignoring the painful burns it gives you in the process.", - "Out" = "flames") + text_modifications = list( + "Cost" = "Burn", + "Dip" = "fire. Pain envelopes you as dark burns mar your hands and you begin to shape it into something more useful", + "Shape" = "You shape the fire, ignoring the painful burns it gives you in the process.", + "Out" = "flames" + ) diff --git a/mods/gamemodes/deity/mobs/items/blood_crafting.dm b/mods/gamemodes/deity/mobs/items/blood_crafting.dm new file mode 100644 index 00000000000..3db0c0e161d --- /dev/null +++ b/mods/gamemodes/deity/mobs/items/blood_crafting.dm @@ -0,0 +1,19 @@ +/datum/deity_item/blood_crafting + abstract_type = /datum/deity_item/blood_crafting + name = DEITY_BLOOD_CRAFT + desc = "Unlocks the blood smithing structure which allows followers to forge unholy tools from blood and flesh." + category = DEITY_BLOOD_CRAFT + max_level = 1 + base_cost = 75 + var/forge_type = /obj/structure/deity/blood_forge + var/list/recipes = list() + +/datum/deity_item/blood_crafting/buy(var/mob/living/deity/user) + ..() + user.form.buildables |= forge_type //put structure here + var/list/L = user.feats[name] + if(!L) + L = list() + for(var/type in recipes) + L[type] = recipes[type] + user.feats[name] = L \ No newline at end of file diff --git a/mods/gamemodes/deity/structures/blood_forge.dm b/mods/gamemodes/deity/structures/blood_forge.dm new file mode 100644 index 00000000000..e206bdeb98a --- /dev/null +++ b/mods/gamemodes/deity/structures/blood_forge.dm @@ -0,0 +1,66 @@ +/obj/structure/deity/blood_forge + name = "unholy forge" + desc = "This forge gives off no heat, no light, its flames look almost unnatural." + icon_state = "forge" + build_cost = 1000 + current_health = 50 + var/busy = 0 + var/recipe_feat_list = "Blood Crafting" + var/text_modifications = list( + "Cost" = "Blood", + "Dip" = "fire. Pain envelops you as blood seeps out of your hands and you begin to shape it into something more useful", + "Shape" = "You shape the fire as more and more blood comes out.", + "Out" = "flames" + ) + + power_adjustment = 2 + +/obj/structure/deity/blood_forge/attack_hand(var/mob/user) + if(!linked_god || !linked_god.is_follower(user, silent = 1) || !ishuman(user)) + return ..() + var/list/recipes = linked_god.feats[recipe_feat_list] + if(!recipes) + return TRUE + var/dat = "
    Recipes


    Item - [text_modifications["Cost"]] Cost
    " + for(var/type in recipes) + var/atom/a = type + var/cost = recipes[type] + dat += "[initial(a.name)] - [cost]
    [initial(a.desc)]

    " + show_browser(user, dat, "window=forge") + return TRUE + +/obj/structure/deity/blood_forge/CanUseTopic(var/user) + if(!linked_god || !linked_god.is_follower(user, silent = 1) || !ishuman(user)) + return STATUS_CLOSE + return ..() + +/obj/structure/deity/blood_forge/OnTopic(var/user, var/list/href_list) + if(href_list["make_recipe"]) + var/list/recipes = linked_god.feats[recipe_feat_list] + var/type = locate(href_list["make_recipe"]) in recipes + if(type) + var/cost = recipes[type] + craft_item(type, cost, user) + return TOPIC_REFRESH + +/obj/structure/deity/blood_forge/proc/craft_item(var/path, var/blood_cost, var/mob/user) + if(busy) + to_chat(user, SPAN_WARNING("Someone is already using \the [src]!")) + return + + busy = 1 + to_chat(user, SPAN_NOTICE("You dip your hands into \the [src]'s [text_modifications["Dip"]]")) + for(var/count = 0, count < blood_cost/10, count++) + if(!do_after(user, 50,src)) + busy = 0 + return + user.visible_message("\The [user] swirls their hands in \the [src].", text_modifications["Shape"]) + if(linked_god) + linked_god.take_charge(user, 10) + var/obj/item/I = new path(get_turf(src)) + user.visible_message("\The [user] pull out \the [I] from the [text_modifications["Out"]].", "You pull out the completed [I] from the [text_modifications["Out"]].") + busy = 0 + +/obj/structure/deity/blood_forge/proc/take_charge(var/mob/living/user, var/charge) + if(linked_god) + linked_god.take_charge(user, charge) \ No newline at end of file From a65a9f6d320debc1deb32db45c7d0713af59b923 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Thu, 20 Jun 2024 15:14:15 +1000 Subject: [PATCH 84/90] Merging aspects into traits. --- code/__defines/aspects.dm | 69 ----- code/__defines/traits.dm | 61 ++++ .../subsystems/initialization/aspects.dm | 15 - .../config/config_types/config_server.dm | 8 +- code/datums/traits/_trait_categories.dm | 10 + code/datums/traits/_traits.dm | 261 ++++++++++++++++++ code/datums/traits/maluses/_malus.dm | 5 + code/datums/traits/maluses/allergies.dm | 6 - code/datums/traits/maluses/amputations.dm | 111 ++++++++ code/datums/traits/maluses/animal_protein.dm | 2 +- code/datums/traits/maluses/ethanol.dm | 2 +- code/datums/traits/maluses/vision.dm | 63 +++++ .../traits/prosthetics/prosthetic_limbs.dm} | 93 ++++--- .../traits/prosthetics/prosthetic_organs.dm} | 52 ++-- code/datums/traits/trait_levels.dm | 4 - code/datums/traits/traits.dm | 96 ------- code/modules/admin/admin_verbs.dm | 2 +- code/modules/admin/view_variables/topic.dm | 2 +- code/modules/aspects/_aspects.dm | 181 ------------ code/modules/aspects/aspects_amputations.dm | 112 -------- code/modules/aspects/aspects_handicaps.dm | 68 ----- code/modules/aspects/aspects_perks.dm | 4 - .../preference_setup/general/03_aspects.dm | 180 ------------ .../preference_setup/general/03_traits.dm | 178 ++++++++++++ .../preference_setup/preference_setup.dm | 6 +- code/modules/client/preferences.dm | 16 +- .../solids/materials_solid_metal.dm | 2 +- code/modules/mob/living/human/human_damage.dm | 4 +- code/modules/organs/external/_external.dm | 7 +- code/modules/organs/internal/heart.dm | 4 +- code/modules/organs/organ.dm | 11 +- .../prosthetics_manufacturer_models.dm | 2 +- code/modules/reagents/chems/chems_blood.dm | 2 +- .../modules/reagents/chems/chems_compounds.dm | 4 +- code/modules/reagents/chems/chems_drinks.dm | 22 +- code/modules/reagents/chems/chems_ethanol.dm | 10 +- code/modules/species/species.dm | 8 +- code/unit_tests/aspects.dm | 27 -- code/unit_tests/traits.dm | 27 ++ code/unit_tests/unique_tests.dm | 20 -- mods/content/corporate/datum/robolimbs.dm | 10 +- mods/species/ascent/_ascent.dme | 2 +- .../ascent/datum/{aspects.dm => traits.dm} | 19 +- .../drakes/drake_abilities_friendly.dm | 2 +- mods/species/drakes/drake_attacks.dm | 2 +- mods/species/drakes/drake_modifiers.dm | 2 +- mods/species/drakes/sifsap.dm | 6 +- .../utility_frames/_utility_frames.dme | 2 +- .../utility_frames/{aspects.dm => traits.dm} | 19 +- mods/species/vox/_vox.dme | 2 +- mods/species/vox/datum/robolimbs.dm | 2 +- .../vox/datum/{aspects.dm => traits.dm} | 15 +- nebula.dme | 23 +- 53 files changed, 902 insertions(+), 961 deletions(-) delete mode 100644 code/__defines/aspects.dm create mode 100644 code/__defines/traits.dm delete mode 100644 code/controllers/subsystems/initialization/aspects.dm create mode 100644 code/datums/traits/_trait_categories.dm create mode 100644 code/datums/traits/_traits.dm create mode 100644 code/datums/traits/maluses/_malus.dm delete mode 100644 code/datums/traits/maluses/allergies.dm create mode 100644 code/datums/traits/maluses/amputations.dm create mode 100644 code/datums/traits/maluses/vision.dm rename code/{modules/aspects/aspects_prosthetic_limbs.dm => datums/traits/prosthetics/prosthetic_limbs.dm} (65%) rename code/{modules/aspects/aspects_prosthetic_organs.dm => datums/traits/prosthetics/prosthetic_organs.dm} (63%) delete mode 100644 code/datums/traits/trait_levels.dm delete mode 100644 code/datums/traits/traits.dm delete mode 100644 code/modules/aspects/_aspects.dm delete mode 100644 code/modules/aspects/aspects_amputations.dm delete mode 100644 code/modules/aspects/aspects_handicaps.dm delete mode 100644 code/modules/aspects/aspects_perks.dm delete mode 100644 code/modules/client/preference_setup/general/03_aspects.dm create mode 100644 code/modules/client/preference_setup/general/03_traits.dm delete mode 100644 code/unit_tests/aspects.dm create mode 100644 code/unit_tests/traits.dm rename mods/species/ascent/datum/{aspects.dm => traits.dm} (66%) rename mods/species/utility_frames/{aspects.dm => traits.dm} (55%) rename mods/species/vox/datum/{aspects.dm => traits.dm} (59%) diff --git a/code/__defines/aspects.dm b/code/__defines/aspects.dm deleted file mode 100644 index 6e7619db774..00000000000 --- a/code/__defines/aspects.dm +++ /dev/null @@ -1,69 +0,0 @@ -#define HAS_ASPECT(holder, check_aspect) (ismob(holder) && ispath(check_aspect, /decl/aspect) && (GET_DECL(check_aspect) in holder.personal_aspects)) - -#define ADD_ASPECT(holder, add_aspect) \ - if(holder && add_aspect && !HAS_ASPECT(holder, add_aspect)) { \ - var/decl/aspect/A = GET_DECL(add_aspect); \ - LAZYDISTINCTADD(holder.personal_aspects, A); \ - holder.need_aspect_sort = TRUE; \ - A.apply(holder); \ - } - -#define ASPECTS_PHYSICAL BITFLAG(0) -#define ASPECTS_MENTAL BITFLAG(1) - -#define DEFINE_ROBOLIMB_MODEL_ASPECTS(MODEL_PATH, MODEL_ID, COST) \ -/decl/aspect/prosthetic_limb/left_hand/##MODEL_ID { \ - model = MODEL_PATH; \ - parent = /decl/aspect/prosthetic_limb/left_hand; \ - aspect_cost = COST * 0.5; \ -} \ -/decl/aspect/prosthetic_limb/left_arm/##MODEL_ID { \ - model = MODEL_PATH; \ - parent = /decl/aspect/prosthetic_limb/left_arm; \ - aspect_cost = COST; \ -} \ -/decl/aspect/prosthetic_limb/right_hand/##MODEL_ID { \ - model = MODEL_PATH; \ - parent = /decl/aspect/prosthetic_limb/right_hand; \ - aspect_cost = COST * 0.5; \ -} \ -/decl/aspect/prosthetic_limb/right_arm/##MODEL_ID { \ - model = MODEL_PATH; \ - parent = /decl/aspect/prosthetic_limb/right_arm; \ - aspect_cost = COST; \ -} \ -/decl/aspect/prosthetic_limb/left_foot/##MODEL_ID { \ - model = MODEL_PATH; \ - parent = /decl/aspect/prosthetic_limb/left_foot; \ - aspect_cost = COST * 0.5; \ -} \ -/decl/aspect/prosthetic_limb/left_leg/##MODEL_ID { \ - model = MODEL_PATH; \ - parent = /decl/aspect/prosthetic_limb/left_leg; \ - aspect_cost = COST; \ -} \ -/decl/aspect/prosthetic_limb/right_foot/##MODEL_ID { \ - model = MODEL_PATH; \ - parent = /decl/aspect/prosthetic_limb/right_foot; \ - aspect_cost = COST * 0.5; \ -} \ -/decl/aspect/prosthetic_limb/right_leg/##MODEL_ID { \ - model = MODEL_PATH; \ - parent = /decl/aspect/prosthetic_limb/right_leg; \ - aspect_cost = COST; \ -} \ -/decl/aspect/prosthetic_limb/head/##MODEL_ID { \ - model = MODEL_PATH; \ - parent = /decl/aspect/prosthetic_limb/head; \ - aspect_cost = COST * 0.5; \ -} \ -/decl/aspect/prosthetic_limb/chest/##MODEL_ID { \ - model = MODEL_PATH; \ - parent = /decl/aspect/prosthetic_limb/chest; \ - aspect_cost = COST * 0.5; \ -} \ -/decl/aspect/prosthetic_limb/groin/##MODEL_ID { \ - model = MODEL_PATH; \ - parent = /decl/aspect/prosthetic_limb/groin; \ - aspect_cost = COST * 0.5; \ -} diff --git a/code/__defines/traits.dm b/code/__defines/traits.dm new file mode 100644 index 00000000000..f55c54f73c9 --- /dev/null +++ b/code/__defines/traits.dm @@ -0,0 +1,61 @@ +#define TRAIT_LEVEL_EXISTS 0 +#define TRAIT_LEVEL_MINOR 1 +#define TRAIT_LEVEL_MODERATE 2 +#define TRAIT_LEVEL_MAJOR 3 + +#define DEFINE_ROBOLIMB_MODEL_TRAITS(MODEL_PATH, MODEL_ID, COST) \ +/decl/trait/prosthetic_limb/left_hand/##MODEL_ID { \ + model = MODEL_PATH; \ + parent = /decl/trait/prosthetic_limb/left_hand; \ + trait_cost = COST * 0.5; \ +} \ +/decl/trait/prosthetic_limb/left_arm/##MODEL_ID { \ + model = MODEL_PATH; \ + parent = /decl/trait/prosthetic_limb/left_arm; \ + trait_cost = COST; \ +} \ +/decl/trait/prosthetic_limb/right_hand/##MODEL_ID { \ + model = MODEL_PATH; \ + parent = /decl/trait/prosthetic_limb/right_hand; \ + trait_cost = COST * 0.5; \ +} \ +/decl/trait/prosthetic_limb/right_arm/##MODEL_ID { \ + model = MODEL_PATH; \ + parent = /decl/trait/prosthetic_limb/right_arm; \ + trait_cost = COST; \ +} \ +/decl/trait/prosthetic_limb/left_foot/##MODEL_ID { \ + model = MODEL_PATH; \ + parent = /decl/trait/prosthetic_limb/left_foot; \ + trait_cost = COST * 0.5; \ +} \ +/decl/trait/prosthetic_limb/left_leg/##MODEL_ID { \ + model = MODEL_PATH; \ + parent = /decl/trait/prosthetic_limb/left_leg; \ + trait_cost = COST; \ +} \ +/decl/trait/prosthetic_limb/right_foot/##MODEL_ID { \ + model = MODEL_PATH; \ + parent = /decl/trait/prosthetic_limb/right_foot; \ + trait_cost = COST * 0.5; \ +} \ +/decl/trait/prosthetic_limb/right_leg/##MODEL_ID { \ + model = MODEL_PATH; \ + parent = /decl/trait/prosthetic_limb/right_leg; \ + trait_cost = COST; \ +} \ +/decl/trait/prosthetic_limb/head/##MODEL_ID { \ + model = MODEL_PATH; \ + parent = /decl/trait/prosthetic_limb/head; \ + trait_cost = COST * 0.5; \ +} \ +/decl/trait/prosthetic_limb/chest/##MODEL_ID { \ + model = MODEL_PATH; \ + parent = /decl/trait/prosthetic_limb/chest; \ + trait_cost = COST * 0.5; \ +} \ +/decl/trait/prosthetic_limb/groin/##MODEL_ID { \ + model = MODEL_PATH; \ + parent = /decl/trait/prosthetic_limb/groin; \ + trait_cost = COST * 0.5; \ +} diff --git a/code/controllers/subsystems/initialization/aspects.dm b/code/controllers/subsystems/initialization/aspects.dm deleted file mode 100644 index 2c6d6409d10..00000000000 --- a/code/controllers/subsystems/initialization/aspects.dm +++ /dev/null @@ -1,15 +0,0 @@ -// This subsystem exists solely to crosslink aspects due to mutual dependency loops. -SUBSYSTEM_DEF(aspects) - name = "Aspects" - flags = SS_NO_FIRE - init_order = SS_INIT_PRE_CHAR_SETUP - var/list/all_aspects = list() - -/datum/controller/subsystem/aspects/Initialize() - var/list/all_aspect_decls = decls_repository.get_decls_of_subtype(/decl/aspect) - for(var/aspect_type in all_aspect_decls) - var/decl/aspect/aspect = all_aspect_decls[aspect_type] - if(aspect.name) // remove when dev abstract decl changes are merged in - aspect.build_references() - all_aspects |= aspect - . = ..() diff --git a/code/datums/config/config_types/config_server.dm b/code/datums/config/config_types/config_server.dm index 9181d2862ff..d94a3a56bdb 100644 --- a/code/datums/config/config_types/config_server.dm +++ b/code/datums/config/config_types/config_server.dm @@ -14,7 +14,7 @@ /decl/config/num/loadout_slots, /decl/config/num/max_maint_drones, /decl/config/num/drone_build_time, - /decl/config/num/max_character_aspects, + /decl/config/num/max_character_traits, /decl/config/text/irc_bot_host, /decl/config/text/main_irc, /decl/config/text/admin_irc, @@ -159,10 +159,10 @@ desc = "A drone will become available every X ticks since last drone spawn. Default is 2 minutes." default_value = 1200 -/decl/config/num/max_character_aspects - uid = "max_character_aspects" +/decl/config/num/max_character_traits + uid = "max_character_traits" default_value = 5 - desc = "Remove the # to define a different cap for aspect points in chargen." + desc = "Remove the # to define a different cap for trait points in chargen." /decl/config/text/irc_bot_host uid = "irc_bot_host" diff --git a/code/datums/traits/_trait_categories.dm b/code/datums/traits/_trait_categories.dm new file mode 100644 index 00000000000..7cbefad1ae1 --- /dev/null +++ b/code/datums/traits/_trait_categories.dm @@ -0,0 +1,10 @@ +var/global/list/trait_categories = list() // Containers for ease of printing data. + +/datum/trait_category + var/name + var/list/items = list() + var/hide_from_chargen = TRUE + +/datum/trait_category/New(var/newcategory) + ..() + name = newcategory diff --git a/code/datums/traits/_traits.dm b/code/datums/traits/_traits.dm new file mode 100644 index 00000000000..f406d262920 --- /dev/null +++ b/code/datums/traits/_traits.dm @@ -0,0 +1,261 @@ +// Traits in general are abstract modifiers kept on the mob and checked in various places. +// Selectable traits are basically skills + stats + feats all rolled into one. You get to choose a +// certain number of them at character generation and they will alter some interactions with the world. + +/hook/startup/proc/initialize_trait_trees() + // Precache/build trait trees. + for(var/decl/trait/trait in decls_repository.get_decls_of_type_unassociated(/decl/trait)) + trait.build_references() + return 1 + +/mob/living + var/list/traits + +/mob/living/proc/has_trait(trait_type, trait_level = TRAIT_LEVEL_EXISTS) + SHOULD_NOT_OVERRIDE(TRUE) + SHOULD_NOT_SLEEP(TRUE) + return (trait_type in traits) && (!trait_level || traits[trait_type] >= trait_level) + +/mob/living/proc/GetTraitLevel(trait_type) + SHOULD_NOT_SLEEP(TRUE) + var/traits = get_traits() + if(!traits) + return null + return traits[trait_type] + +/mob/proc/get_traits() + SHOULD_NOT_SLEEP(TRUE) + return null + +/mob/living/get_traits() + RETURN_TYPE(/list) + var/decl/species/our_species = get_species() + return traits || our_species?.traits + +/mob/living/proc/set_trait(trait_type, trait_level) + SHOULD_NOT_SLEEP(TRUE) + var/decl/species/our_species = get_species() + var/decl/trait/trait = GET_DECL(trait_type) + if(!trait.validate_level(trait_level)) + return FALSE + + if(our_species && !traits) // If species traits haven't been setup before, check if we need to do so now + var/species_level = our_species.traits[trait_type] + if(species_level == trait_level) // Matched the default species trait level, ignore + return TRUE + traits = our_species.traits.Copy() // The setup is to simply copy the species list of traits + + if(!(trait_type in traits)) + LAZYSET(traits, trait_type, trait_level) + trait.apply_trait(src) + return TRUE + +/mob/living/proc/RemoveTrait(trait_type, canonize = TRUE) + var/decl/species/our_species = get_species() + // If traits haven't been set up, but we're trying to remove a trait that exists on the species then set up traits + if(!traits && LAZYISIN(our_species?.traits, trait_type)) + traits = our_species.traits.Copy() + if(LAZYLEN(traits)) + LAZYREMOVE(traits, trait_type) + // Check if we can just default back to species traits. + if(canonize) + CanonizeTraits() + +/// Removes a trait unless it exists on the species. +/// If it does exist on the species, we reset it to the species' trait level. +/mob/living/proc/RemoveExtrinsicTrait(trait_type) + var/decl/species/our_species = get_species() + if(!LAZYACCESS(our_species?.traits, trait_type)) + RemoveTrait(trait_type) + else if(our_species?.traits[trait_type] != GetTraitLevel(trait_type)) + set_trait(trait_type, our_species?.traits[trait_type]) + +/// Sets the traits list to null if it's identical to the species list. +/// Returns TRUE if the list was reset and FALSE otherwise. +/mob/living/proc/CanonizeTraits() + if(!traits) // Already in canonical form. + return FALSE + var/decl/species/our_species = get_species() + if(!our_species) // Doesn't apply without a species. + return FALSE + var/list/missing_traits = traits ^ our_species?.traits + var/list/matched_traits = traits & our_species?.traits + if(LAZYLEN(missing_traits)) + return FALSE + for(var/trait in matched_traits) // inside this loop we know our_species exists and has traits + if(traits[trait] != our_species.traits[trait]) + return FALSE + traits = null + return TRUE + +/decl/trait + abstract_type = /decl/trait + /// String identifier. + var/name + /// Flavour text. + var/description + /// A list of possible values for this trait. Should either only contain TRAIT_LEVEL_EXISTS or a set of the other TRAIT_LEVEL_* levels + var/list/levels = list(TRAIT_LEVEL_EXISTS) + /// Number of points spent or gained by taking this trait + var/trait_cost = 1 + /// Header for root traits in char prefs. + var/category + /// Parent/prerequisite for this trait. + var/decl/trait/parent + /// Aspects with this trait as a parent + var/list/children + /// Typelist of traits that prevent this one from being taken + var/list/incompatible_with + /// Whether or not trait is shown in chargen prefs + var/available_at_chargen = FALSE + /// Whether or not a rejuvenation should apply this aspect. + var/reapply_on_rejuvenation = FALSE + /// What species can select this trait in chargen? + var/list/permitted_species + /// What species cannot select this trait in chargen? + var/list/blocked_species + +/decl/trait/validate() + . = ..() + if(!name || !istext(name)) // Empty strings are valid texts + . += "invalid name [name || "(NULL)"]" + else + for(var/decl/trait/trait in decls_repository.get_decls_of_type_unassociated(/decl/trait)) + if(trait != src && lowertext(trait.name) == lowertext(name)) + . += "name '[name]' collides with [trait.type]" + + if(!length(levels)) + . += "invalid (empty) levels list" + else if (levels.len > 1 && (TRAIT_LEVEL_EXISTS in levels)) + . += "invalid levels list - TRAIT_LEVEL_EXISTS is mutually exclusive with all other levels" + + if(initial(parent) && !istype(parent)) + . += "invalid parent - [parent || "NULL"]" + for(var/decl/trait/trait as anything in children) + if(!istype(trait)) + . += "invalid child - [trait || "NULL"]" + else if(trait.parent != src) + . += "child [trait || "NULL"] does not have correct parent - expected [src], got [trait.parent || "NULL"]" + +/decl/trait/proc/validate_level(level) + SHOULD_NOT_OVERRIDE(TRUE) + SHOULD_NOT_SLEEP(TRUE) + SHOULD_BE_PURE(TRUE) + return (level in levels) + +/decl/trait/proc/build_references() + SHOULD_CALL_PARENT(TRUE) + + // This is here until there are positive traits to balance out the negative ones; + // currently the cost calc serves no purpose and looks really silly sitting at -14/5. + trait_cost = 0 + // End temp set. + + if(ispath(parent)) + parent = GET_DECL(parent) + + if(abstract_type != type && category) + var/datum/trait_category/trait_category = global.trait_categories[category] + if(!istype(trait_category)) + trait_category = new(category) + global.trait_categories[category] = trait_category + trait_category.items += src + if(trait_category.hide_from_chargen && available_at_chargen) + trait_category.hide_from_chargen = FALSE + if(istype(parent)) + LAZYDISTINCTADD(parent.children, src) + +/decl/trait/proc/applies_to_organ(var/organ) + return FALSE + +/decl/trait/proc/is_available_to(var/datum/preferences/pref) + for(var/blacklisted_type in incompatible_with) + if(blacklisted_type in pref.traits) + return FALSE + if(blocked_species && (pref.species in blocked_species)) + return FALSE + if(permitted_species && !(pref.species in permitted_species)) + return FALSE + return TRUE + +/decl/trait/proc/apply_trait(mob/living/holder) + return (istype(holder)) + +// Called by preferences selection for HTML display. +/decl/trait/proc/get_trait_selection_data(var/datum/category_item/player_setup_item/traits/caller, var/list/ticked_traits = list(), var/recurse_level = 0, var/ignore_children_if_unticked = 1, var/ignore_unticked) + + var/ticked = (type in ticked_traits) + if((ignore_unticked && !ticked) || (caller && !is_available_to(caller.pref))) + return "" + + var/result = "" + if(recurse_level) + for(var/x = 1 to recurse_level) + result += "        " + + var/incompatible_trait_taken = FALSE + for(var/trait in incompatible_with) + if(trait in ticked_traits) + incompatible_trait_taken = TRUE + break + + if(istype(caller) && (ticked || caller.get_trait_total() + trait_cost <= get_config_value(/decl/config/num/max_character_traits)) && !incompatible_trait_taken) + result += "[ticked ? "[name]" : "[name]"] ([trait_cost])" + else + result += ticked ? "[name]" : "[name]" + + result += "" + if(ticked) + result += "[description]" + else + result += "[description]" + + result += "" + if(LAZYLEN(children) && !(ignore_children_if_unticked && !ticked)) + for(var/decl/trait/trait in children) + result += trait.get_trait_selection_data(caller, ticked_traits, (recurse_level+1), ignore_children_if_unticked) + return result + +/mob/proc/get_trait_data(var/mob/show_to) + + var/list/traits = get_traits() + if(!LAZYLEN(traits)) + to_chat(show_to, SPAN_WARNING("That mob has no traits.")) + return + + var/trait_cost = 0 + for(var/decl/trait/trait as anything in traits) + trait_cost += trait.trait_cost + + var/dat = list("[trait_cost]/[get_config_value(/decl/config/num/max_character_traits)] points spent.") + for(var/trait_category_id in global.trait_categories) + var/datum/trait_category/trait_category = global.trait_categories[trait_category_id] + if(!istype(trait_category)) + continue + var/printed_cat + for(var/decl/trait/trait as anything in trait_category.items) + if(trait in traits) + if(!printed_cat) + printed_cat = 1 + dat += "
    [trait_category.name]:" + dat += "
    [trait.name]: [trait.description]" + if(printed_cat) + dat += "
    " + + var/datum/browser/popup = new((show_to || usr), "trait_summary_\ref[src]", "Aspect Summary") + popup.set_content(jointext(dat, null)) + popup.open() + +/mob/verb/show_own_traits() + set category = "IC" + set name = "Show Own Traits" + get_trait_data(src) + +/datum/admins/proc/show_traits() + set category = "Admin" + set name = "Show Traits" + if(!check_rights(R_INVESTIGATE)) + return + var/mob/M = input("Select mob.", "Select mob.") as null|anything in global.living_mob_list_ + if(M) + M.get_trait_data(usr) diff --git a/code/datums/traits/maluses/_malus.dm b/code/datums/traits/maluses/_malus.dm new file mode 100644 index 00000000000..03b958ea34b --- /dev/null +++ b/code/datums/traits/maluses/_malus.dm @@ -0,0 +1,5 @@ +/decl/trait/malus + category = "Maluses" + abstract_type = /decl/trait/malus + trait_cost = -1 + available_at_chargen = TRUE diff --git a/code/datums/traits/maluses/allergies.dm b/code/datums/traits/maluses/allergies.dm deleted file mode 100644 index 56fb3deb2ed..00000000000 --- a/code/datums/traits/maluses/allergies.dm +++ /dev/null @@ -1,6 +0,0 @@ -/decl/trait/malus - abstract_type = /decl/trait/malus - -/decl/trait/malus/Initialize() - . = ..() - name = "Malus - " + name diff --git a/code/datums/traits/maluses/amputations.dm b/code/datums/traits/maluses/amputations.dm new file mode 100644 index 00000000000..4de7eb782a2 --- /dev/null +++ b/code/datums/traits/maluses/amputations.dm @@ -0,0 +1,111 @@ +/decl/trait/malus/amputation + trait_cost = -1 + category = "Missing Limbs" + abstract_type = /decl/trait/malus/amputation + reapply_on_rejuvenation = TRUE + var/list/apply_to_limbs + var/list/ban_traits_relating_to_limbs + +/decl/trait/malus/amputation/build_references() + if(length(ban_traits_relating_to_limbs)) + var/list/check_traits = decls_repository.get_decls_of_subtype(/decl/trait/malus/amputation) + + // Ban amputations that descend from us. + for(var/trait_type in check_traits) + if(trait_type == type) + continue + var/decl/trait/malus/amputation/trait = check_traits[trait_type] + if(!trait.name) + continue // remove when abstract decl handling from dev is merged + for(var/limb in trait.apply_to_limbs) + if(limb in ban_traits_relating_to_limbs) + LAZYDISTINCTADD(incompatible_with, trait_type) + LAZYDISTINCTADD(trait.incompatible_with, type) + break + + // Ban prosthetic types that require this limb to exist. + check_traits = decls_repository.get_decls_of_subtype(/decl/trait/prosthetic_limb) + for(var/trait_type in check_traits) + if(trait_type == type) + continue + var/decl/trait/prosthetic_limb/trait = check_traits[trait_type] + if(trait.apply_to_limb in ban_traits_relating_to_limbs) + LAZYDISTINCTADD(incompatible_with, trait_type) + LAZYDISTINCTADD(trait.incompatible_with, type) + + . = ..() + +/decl/trait/malus/amputation/applies_to_organ(var/organ) + return (organ in apply_to_limbs) + +/decl/trait/malus/amputation/is_available_to(datum/preferences/pref) + . = ..() + if(. && pref.bodytype) + var/decl/bodytype/mob_bodytype = pref.get_bodytype_decl() + if(!istype(mob_bodytype)) + return FALSE + for(var/limb in apply_to_limbs) + if(!(limb in mob_bodytype.has_limbs)) + return FALSE + +/decl/trait/malus/amputation/apply_trait(mob/living/holder) + . = ..() + if(. && apply_to_limbs) + for(var/limb in apply_to_limbs) + var/obj/item/organ/external/O = GET_EXTERNAL_ORGAN(holder, limb) + if(istype(O)) + holder.remove_organ(O, FALSE, FALSE, FALSE, TRUE, FALSE) + qdel(O) + holder.update_body(TRUE) + +/decl/trait/malus/amputation/left_hand + name = "Amputated Left Hand" + description = "You are missing your left hand." + apply_to_limbs = list(BP_L_HAND) + ban_traits_relating_to_limbs = list(BP_L_HAND, BP_L_ARM) + +/decl/trait/malus/amputation/left_arm + name = "Amputated Left Arm" + description = "You are missing your left arm." + apply_to_limbs = list(BP_L_ARM, BP_L_HAND) + ban_traits_relating_to_limbs = list(BP_L_ARM, BP_L_HAND) + trait_cost = -2 + +/decl/trait/malus/amputation/right_hand + name = "Amputated Right Hand" + description = "You are missing your right hand." + apply_to_limbs = list(BP_R_HAND) + ban_traits_relating_to_limbs = list(BP_R_HAND, BP_R_ARM) + +/decl/trait/malus/amputation/right_arm + name = "Amputated Right Arm" + description = "You are missing your right arm." + apply_to_limbs = list(BP_R_ARM, BP_R_HAND) + ban_traits_relating_to_limbs = list(BP_R_ARM, BP_R_HAND) + trait_cost = -2 + +/decl/trait/malus/amputation/left_foot + name = "Amputated Left Foot" + description = "You are missing your left foot." + apply_to_limbs = list(BP_L_FOOT) + ban_traits_relating_to_limbs = list(BP_L_LEG, BP_L_FOOT) + +/decl/trait/malus/amputation/left_leg + name = "Amputated Left Leg" + description = "You are missing your left leg." + apply_to_limbs = list(BP_L_LEG, BP_L_FOOT) + ban_traits_relating_to_limbs = list(BP_L_LEG, BP_L_FOOT) + trait_cost = -2 + +/decl/trait/malus/amputation/right_foot + name = "Amputated Right Foot" + description = "You are missing your right foot." + apply_to_limbs = list(BP_R_FOOT) + ban_traits_relating_to_limbs = list(BP_R_LEG, BP_R_FOOT) + +/decl/trait/malus/amputation/right_leg + name = "Amputated Right Leg" + description = "You are missing your right leg." + apply_to_limbs = list(BP_R_LEG, BP_R_FOOT) + ban_traits_relating_to_limbs = list(BP_R_LEG, BP_R_FOOT) + trait_cost = -2 diff --git a/code/datums/traits/maluses/animal_protein.dm b/code/datums/traits/maluses/animal_protein.dm index 8088ad17d13..0963b91f5f5 100644 --- a/code/datums/traits/maluses/animal_protein.dm +++ b/code/datums/traits/maluses/animal_protein.dm @@ -1,3 +1,3 @@ /decl/trait/malus/animal_protein - name = "Animal Protein" + name = "Animal Protein Allergy" levels = list(TRAIT_LEVEL_MINOR, TRAIT_LEVEL_MAJOR) diff --git a/code/datums/traits/maluses/ethanol.dm b/code/datums/traits/maluses/ethanol.dm index 953a9a8685e..f4a22e7f446 100644 --- a/code/datums/traits/maluses/ethanol.dm +++ b/code/datums/traits/maluses/ethanol.dm @@ -1,3 +1,3 @@ /decl/trait/malus/ethanol - name = "Ethanol" + name = "Ethanol Allergy" levels = list(TRAIT_LEVEL_MINOR, TRAIT_LEVEL_MODERATE, TRAIT_LEVEL_MAJOR) diff --git a/code/datums/traits/maluses/vision.dm b/code/datums/traits/maluses/vision.dm new file mode 100644 index 00000000000..928f9be9070 --- /dev/null +++ b/code/datums/traits/maluses/vision.dm @@ -0,0 +1,63 @@ +/decl/trait/malus/impaired_vision + name = "Poor Eyesight" + description = "Your vision is somewhat impaired, and you need prescription glasses to see clearly." + incompatible_with = list(/decl/trait/prosthetic_organ/eyes) + +/decl/trait/malus/impaired_vision/apply_trait(mob/living/holder) + . = ..() + if(.) + holder.add_genetic_condition(GENE_COND_NEARSIGHTED) + var/equipped = holder.equip_to_slot_or_del(new /obj/item/clothing/glasses/prescription(holder), slot_glasses_str) + if(equipped) + var/obj/item/clothing/glasses/G = holder.get_equipped_item(slot_glasses_str) + if(istype(G)) + G.prescription = 7 + +/decl/trait/malus/colourblind + name = "Deuteranopia" + description = "You have a type of red-green colour blindness, and cannot properly perceive the colour green." + incompatible_with = list( + /decl/trait/prosthetic_organ/eyes, + /decl/trait/malus/colourblind/protanopia, + /decl/trait/malus/colourblind/tritanopia, + /decl/trait/malus/colourblind/achromatopsia, + ) + var/client_color = /datum/client_color/deuteranopia + +/decl/trait/malus/colourblind/apply_trait(mob/living/holder) + . = ..() + if(. && ispath(client_color, /datum/client_color)) + holder.add_client_color(client_color) + +/decl/trait/malus/colourblind/protanopia + name = "Protanopia" + description = "You have a type of red-green colour blindness, and cannot properly perceive the colour red." + incompatible_with = list( + /decl/trait/prosthetic_organ/eyes, + /decl/trait/malus/colourblind/tritanopia, + /decl/trait/malus/colourblind/achromatopsia, + /decl/trait/malus/colourblind + ) + client_color = /datum/client_color/protanopia + +/decl/trait/malus/colourblind/tritanopia + name = "Tritanopia" + description = "You have a rare type of colour blindness, and cannot properly perceive the colour blue." + incompatible_with = list( + /decl/trait/prosthetic_organ/eyes, + /decl/trait/malus/colourblind/protanopia, + /decl/trait/malus/colourblind/achromatopsia, + /decl/trait/malus/colourblind + ) + client_color = /datum/client_color/tritanopia + +/decl/trait/malus/colourblind/achromatopsia + name = "Achromatopsia" + description = "You have a rare type of colour blindness, and cannot properly perceive colour." + incompatible_with = list( + /decl/trait/prosthetic_organ/eyes, + /decl/trait/malus/colourblind/protanopia, + /decl/trait/malus/colourblind/tritanopia, + /decl/trait/malus/colourblind + ) + client_color = /datum/client_color/achromatopsia diff --git a/code/modules/aspects/aspects_prosthetic_limbs.dm b/code/datums/traits/prosthetics/prosthetic_limbs.dm similarity index 65% rename from code/modules/aspects/aspects_prosthetic_limbs.dm rename to code/datums/traits/prosthetics/prosthetic_limbs.dm index ee6096fe63c..44a21b9c5aa 100644 --- a/code/modules/aspects/aspects_prosthetic_limbs.dm +++ b/code/datums/traits/prosthetics/prosthetic_limbs.dm @@ -1,10 +1,10 @@ // Prosthetics. -/decl/aspect/prosthetic_limb - aspect_cost = 1 +/decl/trait/prosthetic_limb + trait_cost = 1 category = "Prosthetic Limbs" - sort_value = 2 - aspect_flags = ASPECTS_PHYSICAL - abstract_type = /decl/aspect/prosthetic_limb + available_at_chargen = TRUE + abstract_type = /decl/trait/prosthetic_limb + reapply_on_rejuvenation = TRUE var/fullbody_synthetic_only = FALSE var/replace_children = TRUE var/check_bodytype @@ -13,56 +13,56 @@ var/list/incompatible_with_limbs = list(BP_L_HAND) var/model -/decl/aspect/prosthetic_limb/proc/get_base_model(var/species_name) +/decl/trait/prosthetic_limb/proc/get_base_model(var/species_name) if(!species_name) return /decl/bodytype/prosthetic/basic_human var/decl/species/species = species_name ? get_species_by_key(species_name) : global.using_map.default_species return species?.base_external_prosthetics_model -/decl/aspect/prosthetic_limb/Initialize() +/decl/trait/prosthetic_limb/Initialize() . = ..() // Macro can generate float costs, round to closest point value. - if(aspect_cost) - aspect_cost = CEILING(aspect_cost) + if(trait_cost) + trait_cost = CEILING(trait_cost) if(bodypart_name) if(model) var/decl/bodytype/prosthetic/model_manufacturer = GET_DECL(model) name = "[capitalize(model_manufacturer.name)] [bodypart_name]" - desc = "You have been fitted with [ADD_ARTICLE(model_manufacturer.name)] [lowertext(bodypart_name)] prosthesis." + description = "You have been fitted with [ADD_ARTICLE(model_manufacturer.name)] [lowertext(bodypart_name)] prosthesis." else name = "Prosthetic [bodypart_name]" - desc = "You have been fitted with a basic [lowertext(bodypart_name)] prosthesis." + description = "You have been fitted with a basic [lowertext(bodypart_name)] prosthesis." -/decl/aspect/prosthetic_limb/build_references() +/decl/trait/prosthetic_limb/build_references() . = ..() // Build our mutual exclusion list with other models/children. if(length(incompatible_with_limbs)) - var/list/check_aspects = decls_repository.get_decls_of_subtype(/decl/aspect/prosthetic_limb) - for(var/aspect_type in check_aspects) + var/list/check_traits = decls_repository.get_decls_of_subtype(/decl/trait/prosthetic_limb) + for(var/trait_type in check_traits) // Can't exclude ourselves. - if(aspect_type == type) + if(trait_type == type) continue - // The base model aspect does not exclude itself from specific models, but specific models will exclude from all others. - var/decl/aspect/prosthetic_limb/aspect = check_aspects[aspect_type] - if(!(aspect.apply_to_limb in incompatible_with_limbs)) + // The base model trait does not exclude itself from specific models, but specific models will exclude from all others. + var/decl/trait/prosthetic_limb/trait = check_traits[trait_type] + if(!(trait.apply_to_limb in incompatible_with_limbs)) continue // Base model is only incompatible with itself. - if(isnull(model) != isnull(aspect.model) && (!isnull(model) || !isnull(aspect.model))) + if(isnull(model) != isnull(trait.model) && (!isnull(model) || !isnull(trait.model))) continue // Specific models are incompatible with everything. - LAZYDISTINCTADD(incompatible_with, aspect_type) - LAZYDISTINCTADD(aspect.incompatible_with, type) + LAZYDISTINCTADD(incompatible_with, trait_type) + LAZYDISTINCTADD(trait.incompatible_with, type) - // We will also exclude from relevant amputations, but they will be handled by amputation aspect build_references() + // We will also exclude from relevant amputations, but they will be handled by amputation trait build_references() - // If our model has any additional aspect handling, do it here. + // If our model has any additional trait handling, do it here. // Without a model, we will rely on is_available_to() to check get_base_model() for the user species. blocked_species = null -/decl/aspect/prosthetic_limb/applies_to_organ(var/organ) +/decl/trait/prosthetic_limb/applies_to_organ(var/organ) return apply_to_limb && organ == apply_to_limb -/decl/aspect/prosthetic_limb/is_available_to(datum/preferences/pref) +/decl/trait/prosthetic_limb/is_available_to(datum/preferences/pref) . = ..() if(.) if(fullbody_synthetic_only) @@ -80,14 +80,15 @@ else if(!get_base_model(pref.species)) return FALSE -/decl/aspect/prosthetic_limb/apply(mob/living/holder) +/decl/trait/prosthetic_limb/apply_trait(mob/living/holder) . = ..() // Don't apply if there's a specific model selected. if(!model && holder) var/has_specific_model = FALSE - for(var/decl/aspect/A as anything in holder.personal_aspects) - if(A != src && istype(A, type)) + for(var/trait_type in holder.get_traits()) + var/decl/trait/trait = GET_DECL(trait_type) + if(trait != src && istype(trait, type)) has_specific_model = TRUE break if(has_specific_model) @@ -109,69 +110,69 @@ else E.set_bodytype(use_model) -/decl/aspect/prosthetic_limb/left_hand +/decl/trait/prosthetic_limb/left_hand bodypart_name = "Left Hand" apply_to_limb = BP_L_HAND incompatible_with_limbs = list(BP_L_HAND, BP_L_ARM) -/decl/aspect/prosthetic_limb/left_arm +/decl/trait/prosthetic_limb/left_arm bodypart_name = "Left Arm" - aspect_cost = 2 + trait_cost = 2 apply_to_limb = BP_L_ARM incompatible_with_limbs = list(BP_L_HAND, BP_L_ARM) -/decl/aspect/prosthetic_limb/right_hand +/decl/trait/prosthetic_limb/right_hand bodypart_name = "Right Hand" apply_to_limb = BP_R_HAND incompatible_with_limbs = list(BP_R_HAND, BP_R_ARM) -/decl/aspect/prosthetic_limb/right_arm +/decl/trait/prosthetic_limb/right_arm bodypart_name = "Right Arm" - aspect_cost = 2 + trait_cost = 2 apply_to_limb = BP_R_ARM incompatible_with_limbs = list(BP_R_HAND, BP_R_ARM) -/decl/aspect/prosthetic_limb/left_foot +/decl/trait/prosthetic_limb/left_foot bodypart_name = "Left Foot" apply_to_limb = BP_L_FOOT incompatible_with_limbs = list(BP_L_FOOT, BP_L_LEG) -/decl/aspect/prosthetic_limb/left_leg +/decl/trait/prosthetic_limb/left_leg bodypart_name = "Left Leg" - aspect_cost = 2 + trait_cost = 2 apply_to_limb = BP_L_LEG incompatible_with_limbs = list(BP_L_FOOT, BP_L_LEG) -/decl/aspect/prosthetic_limb/right_foot +/decl/trait/prosthetic_limb/right_foot bodypart_name = "Right Foot" apply_to_limb = BP_R_FOOT incompatible_with_limbs = list(BP_R_FOOT, BP_R_LEG) -/decl/aspect/prosthetic_limb/right_leg +/decl/trait/prosthetic_limb/right_leg bodypart_name = "Right Leg" - aspect_cost = 2 + trait_cost = 2 apply_to_limb = BP_R_LEG incompatible_with_limbs = list(BP_R_FOOT, BP_R_LEG) -/decl/aspect/prosthetic_limb/head +/decl/trait/prosthetic_limb/head bodypart_name = "Head" - aspect_cost = 1 + trait_cost = 1 apply_to_limb = BP_HEAD incompatible_with_limbs = list(BP_HEAD) fullbody_synthetic_only = TRUE replace_children = FALSE -/decl/aspect/prosthetic_limb/chest +/decl/trait/prosthetic_limb/chest bodypart_name = "Upper Body" - aspect_cost = 1 + trait_cost = 1 apply_to_limb = BP_CHEST incompatible_with_limbs = list(BP_CHEST) fullbody_synthetic_only = TRUE replace_children = FALSE -/decl/aspect/prosthetic_limb/groin +/decl/trait/prosthetic_limb/groin bodypart_name = "Lower Body" - aspect_cost = 1 + trait_cost = 1 apply_to_limb = BP_GROIN incompatible_with_limbs = list(BP_GROIN) fullbody_synthetic_only = TRUE diff --git a/code/modules/aspects/aspects_prosthetic_organs.dm b/code/datums/traits/prosthetics/prosthetic_organs.dm similarity index 63% rename from code/modules/aspects/aspects_prosthetic_organs.dm rename to code/datums/traits/prosthetics/prosthetic_organs.dm index c9be210ccb3..a9d6c093de2 100644 --- a/code/modules/aspects/aspects_prosthetic_organs.dm +++ b/code/datums/traits/prosthetics/prosthetic_organs.dm @@ -1,14 +1,14 @@ -/decl/aspect/prosthetic_organ +/decl/trait/prosthetic_organ name = "Prosthetic Heart" - aspect_flags = ASPECTS_PHYSICAL - desc = "You have a synthetic heart." - aspect_cost = 1 + description = "You have a synthetic heart." + trait_cost = 1 + available_at_chargen = TRUE category = "Prosthetic Organs" - sort_value = 2 + reapply_on_rejuvenation = TRUE var/synthetic_bodytype_restricted = FALSE var/apply_to_organ = BP_HEART -/decl/aspect/prosthetic_organ/is_available_to(datum/preferences/pref) +/decl/trait/prosthetic_organ/is_available_to(datum/preferences/pref) . = ..() if(. && pref.species && pref.bodytype) @@ -34,56 +34,56 @@ return TRUE -/decl/aspect/prosthetic_organ/applies_to_organ(var/organ) +/decl/trait/prosthetic_organ/applies_to_organ(var/organ) return apply_to_organ && organ == apply_to_organ -/decl/aspect/prosthetic_organ/apply(mob/living/holder) +/decl/trait/prosthetic_organ/apply_trait(mob/living/holder) . = ..() if(.) var/obj/item/organ/internal/I = GET_INTERNAL_ORGAN(holder, apply_to_organ) if(I) I.set_bodytype(I.species.base_internal_prosthetics_model) -/decl/aspect/prosthetic_organ/eyes +/decl/trait/prosthetic_organ/eyes name = "Prosthetic Eyes" - desc = "Your vision is augmented." + description = "Your vision is augmented." apply_to_organ = BP_EYES incompatible_with = list( - /decl/aspect/handicap/impaired_vision, - /decl/aspect/handicap/colourblind, - /decl/aspect/handicap/colourblind/protanopia, - /decl/aspect/handicap/colourblind/tritanopia, - /decl/aspect/handicap/colourblind/achromatopsia + /decl/trait/malus/impaired_vision, + /decl/trait/malus/colourblind, + /decl/trait/malus/colourblind/protanopia, + /decl/trait/malus/colourblind/tritanopia, + /decl/trait/malus/colourblind/achromatopsia ) -/decl/aspect/prosthetic_organ/kidneys +/decl/trait/prosthetic_organ/kidneys name = "Prosthetic Kidneys" - desc = "You have synthetic kidneys." + description = "You have synthetic kidneys." apply_to_organ = BP_KIDNEYS -/decl/aspect/prosthetic_organ/liver +/decl/trait/prosthetic_organ/liver name = "Prosthetic Liver" - desc = "You have a literal iron liver." + description = "You have a literal iron liver." apply_to_organ = BP_LIVER -/decl/aspect/prosthetic_organ/lungs +/decl/trait/prosthetic_organ/lungs name = "Prosthetic Lungs" - desc = "You have synthetic lungs." + description = "You have synthetic lungs." apply_to_organ = BP_LUNGS -/decl/aspect/prosthetic_organ/stomach +/decl/trait/prosthetic_organ/stomach name = "Prosthetic Stomach" - desc = "You have a literal iron stomach." + description = "You have a literal iron stomach." apply_to_organ = BP_STOMACH -/decl/aspect/prosthetic_organ/brain +/decl/trait/prosthetic_organ/brain name = "Synthetic Brain" - desc = "You are an artificial lifeform, with a mind made of steel and light." + description = "You are an artificial lifeform, with a mind made of steel and light." apply_to_organ = BP_BRAIN synthetic_bodytype_restricted = TRUE var/new_brain_type = /obj/item/organ/internal/brain/robotic -/decl/aspect/prosthetic_organ/brain/apply(mob/living/holder) +/decl/trait/prosthetic_organ/brain/apply_trait(mob/living/holder) . = ..() if(.) var/obj/item/organ/external/affected diff --git a/code/datums/traits/trait_levels.dm b/code/datums/traits/trait_levels.dm deleted file mode 100644 index c6d5480659a..00000000000 --- a/code/datums/traits/trait_levels.dm +++ /dev/null @@ -1,4 +0,0 @@ -var/global/const/TRAIT_LEVEL_EXISTS = 0 -var/global/const/TRAIT_LEVEL_MINOR = 1 -var/global/const/TRAIT_LEVEL_MODERATE = 2 -var/global/const/TRAIT_LEVEL_MAJOR = 3 diff --git a/code/datums/traits/traits.dm b/code/datums/traits/traits.dm deleted file mode 100644 index 24e22081949..00000000000 --- a/code/datums/traits/traits.dm +++ /dev/null @@ -1,96 +0,0 @@ -/mob/living - var/list/traits - -/mob/living/proc/HasTrait(trait_type, trait_level = TRAIT_LEVEL_EXISTS) - SHOULD_NOT_OVERRIDE(TRUE) - SHOULD_NOT_SLEEP(TRUE) - return (trait_type in traits) && (!trait_level || traits[trait_type] >= trait_level) - -/mob/living/proc/GetTraitLevel(trait_type) - SHOULD_NOT_SLEEP(TRUE) - var/traits = GetTraits() - if(!traits) - return null - return traits[trait_type] - -/mob/living/proc/GetTraits() - SHOULD_NOT_SLEEP(TRUE) - RETURN_TYPE(/list) - var/decl/species/our_species = get_species() - return traits || our_species?.traits - -/mob/living/proc/SetTrait(trait_type, trait_level) - SHOULD_NOT_SLEEP(TRUE) - var/decl/species/our_species = get_species() - var/decl/trait/T = GET_DECL(trait_type) - if(!T.validate_level(trait_level)) - return FALSE - - if(our_species && !traits) // If species traits haven't been setup before, check if we need to do so now - var/species_level = our_species.traits[trait_type] - if(species_level == trait_level) // Matched the default species trait level, ignore - return TRUE - traits = our_species.traits.Copy() // The setup is to simply copy the species list of traits - - LAZYSET(traits, trait_type, trait_level) - return TRUE - -/mob/living/proc/RemoveTrait(trait_type, canonize = TRUE) - var/decl/species/our_species = get_species() - // If traits haven't been set up, but we're trying to remove a trait that exists on the species then set up traits - if(!traits && LAZYISIN(our_species?.traits, trait_type)) - traits = our_species.traits.Copy() - if(LAZYLEN(traits)) - LAZYREMOVE(traits, trait_type) - // Check if we can just default back to species traits. - if(canonize) - CanonizeTraits() - -/// Removes a trait unless it exists on the species. -/// If it does exist on the species, we reset it to the species' trait level. -/mob/living/proc/RemoveExtrinsicTrait(trait_type) - var/decl/species/our_species = get_species() - if(!LAZYACCESS(our_species?.traits, trait_type)) - RemoveTrait(trait_type) - else if(our_species?.traits[trait_type] != GetTraitLevel(trait_type)) - SetTrait(trait_type, our_species?.traits[trait_type]) - -/// Sets the traits list to null if it's identical to the species list. -/// Returns TRUE if the list was reset and FALSE otherwise. -/mob/living/proc/CanonizeTraits() - if(!traits) // Already in canonical form. - return FALSE - var/decl/species/our_species = get_species() - if(!our_species) // Doesn't apply without a species. - return FALSE - var/list/missing_traits = traits ^ our_species?.traits - var/list/matched_traits = traits & our_species?.traits - if(LAZYLEN(missing_traits)) - return FALSE - for(var/trait in matched_traits) // inside this loop we know our_species exists and has traits - if(traits[trait] != our_species.traits[trait]) - return FALSE - traits = null - return TRUE - -/decl/trait - abstract_type = /decl/trait - var/name - var/description - var/list/levels = list(TRAIT_LEVEL_EXISTS) // Should either only contain TRAIT_LEVEL_EXISTS or a set of the other TRAIT_LEVEL_* levels - -/decl/trait/validate() - . = ..() - if(!name || !istext(name)) // Empty strings are valid texts - . += "invalid name [name || "(NULL)"]" - if(!length(levels)) - . += "invalid (empty) levels list" - else if (levels.len > 1 && (TRAIT_LEVEL_EXISTS in levels)) - . += "invalid levels list - TRAIT_LEVEL_EXISTS is mutually exclusive with all other levels" - -/decl/trait/proc/validate_level(level) - SHOULD_NOT_OVERRIDE(TRUE) - SHOULD_NOT_SLEEP(TRUE) - SHOULD_BE_PURE(TRUE) - - return (level in levels) diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index f3be6255a41..1a2b3d9fa37 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -90,7 +90,7 @@ var/global/list/admin_verbs_admin = list( /client/proc/add_trader, /client/proc/remove_trader, /datum/admins/proc/sendFax, - /datum/admins/proc/show_aspects + /datum/admins/proc/show_traits ) var/global/list/admin_verbs_ban = list( /client/proc/DB_ban_panel, diff --git a/code/modules/admin/view_variables/topic.dm b/code/modules/admin/view_variables/topic.dm index 8c2e7f2ecad..63188f399eb 100644 --- a/code/modules/admin/view_variables/topic.dm +++ b/code/modules/admin/view_variables/topic.dm @@ -442,7 +442,7 @@ return var/list/possibleverbs = list() possibleverbs += "Cancel" // One for the top... - possibleverbs += typesof(/mob/proc,/mob/verb,/mob/living/proc,/mob/living/verb) + possibleverbs += typesof(/mob/proc, /mob/verb, /mob/living/proc, /mob/living/verb) switch(H.type) if(/mob/living/human) possibleverbs += typesof(/mob/living/human/verb, /mob/living/human/proc) diff --git a/code/modules/aspects/_aspects.dm b/code/modules/aspects/_aspects.dm deleted file mode 100644 index 2749757a0dc..00000000000 --- a/code/modules/aspects/_aspects.dm +++ /dev/null @@ -1,181 +0,0 @@ -// Aspects are basically skills + stats + feats all rolled into one. You get to choose a certain number -// of them at character generation and they will alter some interactions with the world. Very WIP. -var/global/list/aspect_categories = list() // Containers for ease of printing data. - -/datum/aspect_category - var/name - var/list/aspects = list() - var/hide_from_chargen = TRUE - -/datum/aspect_category/New(var/newcategory) - ..() - name = newcategory - -/mob - var/list/personal_aspects - var/need_aspect_sort - -/decl/aspect - abstract_type = /decl/aspect - var/name // Name/unique index. - var/desc = "An aspect is a trait of your character." // Flavour text. - var/aspect_cost = 1 // Number of points spent or gained by taking this aspect - var/category // Header for root aspects in char prefs. - var/decl/aspect/parent // Parent/prerequisite for this aspect. - var/list/children // Aspects with this aspect as a parent - var/list/incompatible_with // Typelist of aspects that prevent this one from being taken - var/available_at_chargen = TRUE // Whether or not aspect is shown in chargen prefs - var/aspect_flags = 0 - var/transfer_with_mind = TRUE // TODO: IMPLEMENT - var/sort_value = 0 - var/list/permitted_species - var/list/blocked_species - -/decl/aspect/proc/build_references() - SHOULD_CALL_PARENT(TRUE) - - // This is here until there are positive traits to balance out the negative ones; - // currently the cost calc serves no purpose and looks really silly sitting at -14/5. - aspect_cost = 0 - // End temp set. - - if(ispath(parent)) - parent = GET_DECL(parent) - - if(abstract_type != type && category) - var/datum/aspect_category/AC = global.aspect_categories[category] - if(!istype(AC)) - AC = new(category) - global.aspect_categories[category] = AC - AC.aspects += src - if(AC.hide_from_chargen && available_at_chargen) - AC.hide_from_chargen = FALSE - if(istype(parent)) - LAZYDISTINCTADD(parent.children, src) - -/decl/aspect/validate() - . = ..() - if(initial(parent) && !istype(parent)) - . += "invalid parent - [parent || "NULL"]" - for(var/decl/aspect/A as anything in children) - if(!istype(A)) - . += "invalid child - [A || "NULL"]" - else if(A.parent != src) - . += "child [A || "NULL"] does not have correct parent - expected [src], got [A.parent || "NULL"]" - -/decl/aspect/proc/applies_to_organ(var/organ) - return FALSE - -/decl/aspect/proc/is_available_to(var/datum/preferences/pref) - if(!name) - return FALSE - for(var/blacklisted_type in incompatible_with) - if(blacklisted_type in pref.aspects) - return FALSE - if(blocked_species && (pref.species in blocked_species)) - return FALSE - if(permitted_species && !(pref.species in permitted_species)) - return FALSE - return TRUE - -/decl/aspect/dd_SortValue() - return sort_value - -/decl/aspect/proc/apply(mob/living/holder) - return (istype(holder)) - -// Called by preferences selection for HTML display. -/decl/aspect/proc/get_aspect_selection_data(var/datum/category_item/player_setup_item/aspects/caller, var/list/ticked_aspects = list(), var/recurse_level = 0, var/ignore_children_if_unticked = 1, var/ignore_unticked) - - var/ticked = (type in ticked_aspects) - if((ignore_unticked && !ticked) || (caller && !is_available_to(caller.pref))) - return "" - - var/result = "" - if(recurse_level) - for(var/x = 1 to recurse_level) - result += "        " - - var/incompatible_aspect_taken = FALSE - for(var/aspect in incompatible_with) - if(aspect in ticked_aspects) - incompatible_aspect_taken = TRUE - break - - if(istype(caller) && (ticked || caller.get_aspect_total() + aspect_cost <= get_config_value(/decl/config/num/max_character_aspects)) && !incompatible_aspect_taken) - result += "[ticked ? "[name]" : "[name]"] ([aspect_cost])" - else - result += ticked ? "[name]" : "[name]" - - result += "" - if(ticked) - result += "[desc]" - else - result += "[desc]" - - result += "" - if(LAZYLEN(children) && !(ignore_children_if_unticked && !ticked)) - for(var/decl/aspect/A in children) - result += A.get_aspect_selection_data(caller, ticked_aspects, (recurse_level+1), ignore_children_if_unticked) - return result - -/mob/proc/get_aspect_data(var/mob/show_to) - - if(!LAZYLEN(personal_aspects)) - to_chat(show_to, SPAN_WARNING("That mob has no aspects.")) - return - - var/aspect_cost = 0 - for(var/decl/aspect/A as anything in personal_aspects) - aspect_cost += A.aspect_cost - - var/dat = list("[aspect_cost]/[get_config_value(/decl/config/num/max_character_aspects)] points spent.") - for(var/aspect_category in global.aspect_categories) - var/datum/aspect_category/AC = global.aspect_categories[aspect_category] - if(!istype(AC)) - continue - var/printed_cat - for(var/decl/aspect/A as anything in AC.aspects) - if(A in personal_aspects) - if(!printed_cat) - printed_cat = 1 - dat += "
    [AC.name]:" - dat += "
    [A.name]: [A.desc]" - if(printed_cat) - dat += "
    " - - var/datum/browser/popup = new((show_to || usr), "aspect_summary_\ref[src]", "Aspect Summary") - popup.set_content(jointext(dat, null)) - popup.open() - -/mob/verb/show_own_aspects() - set category = "IC" - set name = "Show Own Aspects" - get_aspect_data(src) - -/datum/admins/proc/show_aspects() - set category = "Admin" - set name = "Show Aspects" - if(!check_rights(R_INVESTIGATE)) - return - var/mob/M = input("Select mob.", "Select mob.") as null|anything in global.living_mob_list_ - if(M) - M.get_aspect_data(usr) - -/mob/proc/apply_aspects(var/aspect_types = 0) - var/do_update = FALSE - if(LAZYLEN(personal_aspects)) - if(need_aspect_sort) - personal_aspects = dd_sortedObjectList(personal_aspects) - need_aspect_sort = FALSE - for(var/decl/aspect/A as anything in personal_aspects) - if(!aspect_types || (aspect_types & A.aspect_flags)) - A.apply(src) - do_update = TRUE - return do_update - -/mob/living/human/apply_aspects(var/aspect_type) - . = ..(aspect_type) - if(.) - update_body() - update_icon() diff --git a/code/modules/aspects/aspects_amputations.dm b/code/modules/aspects/aspects_amputations.dm deleted file mode 100644 index 9e94c88ec1e..00000000000 --- a/code/modules/aspects/aspects_amputations.dm +++ /dev/null @@ -1,112 +0,0 @@ -/decl/aspect/amputation - aspect_cost = -1 - category = "Missing Limbs" - aspect_flags = ASPECTS_PHYSICAL - sort_value = 1 - abstract_type = /decl/aspect/amputation - var/list/apply_to_limbs - var/list/ban_aspects_relating_to_limbs - -/decl/aspect/amputation/build_references() - if(length(ban_aspects_relating_to_limbs)) - var/list/check_aspects = decls_repository.get_decls_of_subtype(/decl/aspect/amputation) - - // Ban amputations that descend from us. - for(var/aspect_type in check_aspects) - if(aspect_type == type) - continue - var/decl/aspect/amputation/aspect = check_aspects[aspect_type] - if(!aspect.name) - continue // remove when abstract decl handling from dev is merged - for(var/limb in aspect.apply_to_limbs) - if(limb in ban_aspects_relating_to_limbs) - LAZYDISTINCTADD(incompatible_with, aspect_type) - LAZYDISTINCTADD(aspect.incompatible_with, type) - break - - // Ban prosthetic types that require this limb to exist. - check_aspects = decls_repository.get_decls_of_subtype(/decl/aspect/prosthetic_limb) - for(var/aspect_type in check_aspects) - if(aspect_type == type) - continue - var/decl/aspect/prosthetic_limb/aspect = check_aspects[aspect_type] - if(aspect.apply_to_limb in ban_aspects_relating_to_limbs) - LAZYDISTINCTADD(incompatible_with, aspect_type) - LAZYDISTINCTADD(aspect.incompatible_with, type) - - . = ..() - -/decl/aspect/amputation/applies_to_organ(var/organ) - return (organ in apply_to_limbs) - -/decl/aspect/amputation/is_available_to(datum/preferences/pref) - . = ..() - if(. && pref.bodytype) - var/decl/bodytype/mob_bodytype = pref.get_bodytype_decl() - if(!istype(mob_bodytype)) - return FALSE - for(var/limb in apply_to_limbs) - if(!(limb in mob_bodytype.has_limbs)) - return FALSE - -/decl/aspect/amputation/apply(mob/living/holder) - . = ..() - if(. && apply_to_limbs) - for(var/limb in apply_to_limbs) - var/obj/item/organ/external/O = GET_EXTERNAL_ORGAN(holder, limb) - if(istype(O)) - holder.remove_organ(O, FALSE, FALSE, FALSE, TRUE, FALSE) - qdel(O) - holder.update_body(TRUE) - -/decl/aspect/amputation/left_hand - name = "Amputated Left Hand" - desc = "You are missing your left hand." - apply_to_limbs = list(BP_L_HAND) - ban_aspects_relating_to_limbs = list(BP_L_HAND, BP_L_ARM) - -/decl/aspect/amputation/left_arm - name = "Amputated Left Arm" - desc = "You are missing your left arm." - apply_to_limbs = list(BP_L_ARM, BP_L_HAND) - ban_aspects_relating_to_limbs = list(BP_L_ARM, BP_L_HAND) - aspect_cost = -2 - -/decl/aspect/amputation/right_hand - name = "Amputated Right Hand" - desc = "You are missing your right hand." - apply_to_limbs = list(BP_R_HAND) - ban_aspects_relating_to_limbs = list(BP_R_HAND, BP_R_ARM) - -/decl/aspect/amputation/right_arm - name = "Amputated Right Arm" - desc = "You are missing your right arm." - apply_to_limbs = list(BP_R_ARM, BP_R_HAND) - ban_aspects_relating_to_limbs = list(BP_R_ARM, BP_R_HAND) - aspect_cost = -2 - -/decl/aspect/amputation/left_foot - name = "Amputated Left Foot" - desc = "You are missing your left foot." - apply_to_limbs = list(BP_L_FOOT) - ban_aspects_relating_to_limbs = list(BP_L_LEG, BP_L_FOOT) - -/decl/aspect/amputation/left_leg - name = "Amputated Left Leg" - desc = "You are missing your left leg." - apply_to_limbs = list(BP_L_LEG, BP_L_FOOT) - ban_aspects_relating_to_limbs = list(BP_L_LEG, BP_L_FOOT) - aspect_cost = -2 - -/decl/aspect/amputation/right_foot - name = "Amputated Right Foot" - desc = "You are missing your right foot." - apply_to_limbs = list(BP_R_FOOT) - ban_aspects_relating_to_limbs = list(BP_R_LEG, BP_R_FOOT) - -/decl/aspect/amputation/right_leg - name = "Amputated Right Leg" - desc = "You are missing your right leg." - apply_to_limbs = list(BP_R_LEG, BP_R_FOOT) - ban_aspects_relating_to_limbs = list(BP_R_LEG, BP_R_FOOT) - aspect_cost = -2 diff --git a/code/modules/aspects/aspects_handicaps.dm b/code/modules/aspects/aspects_handicaps.dm deleted file mode 100644 index 5e1ee5b2e93..00000000000 --- a/code/modules/aspects/aspects_handicaps.dm +++ /dev/null @@ -1,68 +0,0 @@ -/decl/aspect/handicap - category = "Handicaps" - aspect_cost = -1 - aspect_flags = ASPECTS_PHYSICAL - -/decl/aspect/handicap/impaired_vision - name = "Poor Eyesight" - desc = "Your vision is somewhat impaired, and you need prescription glasses to see clearly." - incompatible_with = list(/decl/aspect/prosthetic_organ/eyes) - -/decl/aspect/handicap/impaired_vision/apply(mob/living/holder) - . = ..() - if(.) - holder.add_genetic_condition(GENE_COND_NEARSIGHTED) - var/equipped = holder.equip_to_slot_or_del(new /obj/item/clothing/glasses/prescription(holder), slot_glasses_str) - if(equipped) - var/obj/item/clothing/glasses/G = holder.get_equipped_item(slot_glasses_str) - if(istype(G)) - G.prescription = 7 - -/decl/aspect/handicap/colourblind - name = "Deuteranopia" - desc = "You have a type of red-green colour blindness, and cannot properly perceive the colour green." - incompatible_with = list( - /decl/aspect/prosthetic_organ/eyes, - /decl/aspect/handicap/colourblind/protanopia, - /decl/aspect/handicap/colourblind/tritanopia, - /decl/aspect/handicap/colourblind/achromatopsia, - ) - var/client_color = /datum/client_color/deuteranopia - -/decl/aspect/handicap/colourblind/apply(mob/living/holder) - . = ..() - if(. && ispath(client_color, /datum/client_color)) - holder.add_client_color(client_color) - -/decl/aspect/handicap/colourblind/protanopia - name = "Protanopia" - desc = "You have a type of red-green colour blindness, and cannot properly perceive the colour red." - incompatible_with = list( - /decl/aspect/prosthetic_organ/eyes, - /decl/aspect/handicap/colourblind/tritanopia, - /decl/aspect/handicap/colourblind/achromatopsia, - /decl/aspect/handicap/colourblind - ) - client_color = /datum/client_color/protanopia - -/decl/aspect/handicap/colourblind/tritanopia - name = "Tritanopia" - desc = "You have a rare type of colour blindness, and cannot properly perceive the colour blue." - incompatible_with = list( - /decl/aspect/prosthetic_organ/eyes, - /decl/aspect/handicap/colourblind/protanopia, - /decl/aspect/handicap/colourblind/achromatopsia, - /decl/aspect/handicap/colourblind - ) - client_color = /datum/client_color/tritanopia - -/decl/aspect/handicap/colourblind/achromatopsia - name = "Achromatopsia" - desc = "You have a rare type of colour blindness, and cannot properly perceive colour." - incompatible_with = list( - /decl/aspect/prosthetic_organ/eyes, - /decl/aspect/handicap/colourblind/protanopia, - /decl/aspect/handicap/colourblind/tritanopia, - /decl/aspect/handicap/colourblind - ) - client_color = /datum/client_color/achromatopsia diff --git a/code/modules/aspects/aspects_perks.dm b/code/modules/aspects/aspects_perks.dm deleted file mode 100644 index 480837f81dd..00000000000 --- a/code/modules/aspects/aspects_perks.dm +++ /dev/null @@ -1,4 +0,0 @@ -/decl/aspect/perk - category = "Perks" - aspect_cost = 1 - aspect_flags = ASPECTS_PHYSICAL diff --git a/code/modules/client/preference_setup/general/03_aspects.dm b/code/modules/client/preference_setup/general/03_aspects.dm deleted file mode 100644 index ccebf2a6c27..00000000000 --- a/code/modules/client/preference_setup/general/03_aspects.dm +++ /dev/null @@ -1,180 +0,0 @@ -/datum/preferences - var/list/aspects = list() - -/datum/preferences/proc/prune_invalid_aspects() - var/removed_something = TRUE - while(removed_something && length(aspects)) - removed_something = FALSE - for(var/aspect_type in aspects) - var/decl/aspect/aspect = GET_DECL(aspect_type) - if(!istype(aspect) || !aspect.is_available_to(src) || (aspect.parent && !(aspect.parent.type in aspects))) - aspects -= aspect_type - removed_something = TRUE - else if(length(aspect.incompatible_with)) - for(var/incompatible_aspect in aspect.incompatible_with) - if(incompatible_aspect in aspects) - aspects -= incompatible_aspect - removed_something = TRUE - -/datum/category_item/player_setup_item/aspects - name = "Aspects" - sort_order = 1 - var/selected_category - -/datum/category_item/player_setup_item/aspects/load_character(datum/pref_record_reader/R) - pref.aspects = R.read("aspects") - var/list/all_aspects = decls_repository.get_decls_of_subtype(/decl/aspect) - for(var/aspect in pref.aspects) - if(ispath(aspect, /decl/aspect)) - continue - pref.aspects -= aspect - for(var/aspect_type in all_aspects) - var/decl/aspect/aspect_decl = all_aspects[aspect_type] - if(aspect_decl.name == aspect) - pref.aspects |= aspect_type - -/datum/category_item/player_setup_item/aspects/save_character(datum/pref_record_writer/W) - var/list/aspect_names = list() - for(var/aspect in pref.aspects) - var/decl/aspect/aspect_decl = GET_DECL(aspect) - if(istype(aspect_decl)) - aspect_names |= aspect_decl.name - W.write("aspects", aspect_names) - -/datum/category_item/player_setup_item/aspects/proc/get_aspect_total() - var/aspect_cost = 0 - for(var/aspect_type in pref.aspects) - var/decl/aspect/A = GET_DECL(aspect_type) - if(!A) - return null - aspect_cost += A.aspect_cost - return aspect_cost - -/datum/category_item/player_setup_item/aspects/finalize_character() - pref.prune_invalid_aspects() - -/datum/category_item/player_setup_item/aspects/sanitize_character() - - if(!pref.aspects) - pref.aspects = list() - - pref.prune_invalid_aspects() - - var/modified_list = FALSE - var/max_character_aspects = get_config_value(/decl/config/num/max_character_aspects) - while(get_aspect_total() > max_character_aspects) - - // Find a costly aspect with no children to drop until our cost is below the threshold. - var/can_drop_aspect = FALSE - for(var/aspect_type in pref.aspects) - - var/decl/aspect/aspect = GET_DECL(aspect_type) - if(aspect.aspect_cost <= 0) - continue - - can_drop_aspect = TRUE - for(var/decl/aspect/child in aspect.children) - if(child.type in pref.aspects) - can_drop_aspect = FALSE - break - - if(can_drop_aspect) - pref.aspects -= aspect_type - modified_list = TRUE - break - - if(!can_drop_aspect) - break - - if(modified_list) - pref.prune_invalid_aspects() - -/datum/category_item/player_setup_item/aspects/content() - - var/list/available_categories = list() - for(var/aspect_category in global.aspect_categories) - var/datum/aspect_category/AC = global.aspect_categories[aspect_category] - if(AC.hide_from_chargen) - continue - for(var/decl/aspect/aspect as anything in AC.aspects) - if(aspect.is_available_to(pref)) - available_categories[AC.name] = AC - break - if(!length(available_categories)) - return - - var/aspect_total = get_aspect_total() - // Change our formatting data if needed. - var/fcolor = COLOR_CYAN_BLUE - var/max_character_aspects = get_config_value(/decl/config/num/max_character_aspects) - if(aspect_total == max_character_aspects) - fcolor = COLOR_FONT_ORANGE - - // Build the string. - . = list("
    [aspect_total]/[max_character_aspects] points spent.

    ") - if(!selected_category || !(selected_category in available_categories)) - selected_category = available_categories[1] - - var/header = "" - var/body = "" - for(var/aspect_category in available_categories) - - var/datum/aspect_category/AC = available_categories[aspect_category] - if(!istype(AC) || AC.hide_from_chargen) - continue - - var/aspect_spent = 0 - for(var/decl/aspect/A in AC.aspects) - - if(A.type in pref.aspects) - aspect_spent += A.aspect_cost - - if(aspect_category == selected_category && !A.parent && A.available_at_chargen) - body += A.get_aspect_selection_data(src, pref.aspects) - - var/category_label = AC.name - if(aspect_spent != 0) - category_label = "[category_label] ([aspect_spent])" - if(aspect_category == selected_category) - category_label = "[category_label]" - header += "[category_label]" - - . += "[header]
    " - . += "[body]
    " - - return jointext(., null) - -/datum/category_item/player_setup_item/aspects/OnTopic(href, href_list, user) - . = ..() - if(!.) - - if(href_list["select_category"]) - if(href_list["select_category"] in global.aspect_categories) - selected_category = href_list["select_category"] - else - selected_category = global.aspect_categories[1] - return TOPIC_REFRESH - - if(href_list["toggle_aspect"]) - var/decl/aspect/A = locate(href_list["toggle_aspect"]) - if(!istype(A)) - return TOPIC_NOACTION - // Disable aspect (and children). - if(A.type in pref.aspects) - var/list/aspects_to_remove = list(A) - while(aspects_to_remove.len) - A = aspects_to_remove[1] - aspects_to_remove -= A - if(!(A.type in pref.aspects)) - continue - pref.aspects -= A.type - if(A.children) - aspects_to_remove |= A.children - // Enable aspect. - else if(get_aspect_total() + A.aspect_cost <= get_config_value(/decl/config/num/max_character_aspects)) - pref.aspects |= A.type - // Tidy up in case we're in an incoherent state for whatever reason. - pref.prune_invalid_aspects() - return TOPIC_REFRESH_UPDATE_PREVIEW - - return ..() diff --git a/code/modules/client/preference_setup/general/03_traits.dm b/code/modules/client/preference_setup/general/03_traits.dm new file mode 100644 index 00000000000..9d88f4d87e5 --- /dev/null +++ b/code/modules/client/preference_setup/general/03_traits.dm @@ -0,0 +1,178 @@ +/datum/preferences + var/list/traits = list() + +/datum/preferences/proc/prune_invalid_traits() + var/removed_something = TRUE + while(removed_something && length(traits)) + removed_something = FALSE + for(var/trait_type in traits) + var/decl/trait/trait = GET_DECL(trait_type) + if(!istype(trait) || !trait.is_available_to(src) || (trait.parent && !(trait.parent.type in traits))) + traits -= trait_type + removed_something = TRUE + else if(length(trait.incompatible_with)) + for(var/incompatible_trait in trait.incompatible_with) + if(incompatible_trait in traits) + traits -= incompatible_trait + removed_something = TRUE + +/datum/category_item/player_setup_item/traits + name = "Traits" + sort_order = 1 + var/selected_category + +/datum/category_item/player_setup_item/traits/load_character(datum/pref_record_reader/R) + pref.traits = R.read("aspects") | R.read("traits") // Grandfather in old aspect settings. + for(var/trait_id in pref.traits) + if(ispath(trait_id, /decl/trait)) + continue + pref.traits -= trait_id + var/decl/trait/trait = decls_repository.get_decl_by_id_or_var(trait_id, /decl/trait) + if(istype(trait)) + pref.traits |= trait.type + +/datum/category_item/player_setup_item/traits/save_character(datum/pref_record_writer/W) + var/list/trait_names = list() + for(var/trait_id in pref.traits) + var/decl/trait/trait_decl = GET_DECL(trait_id) + if(istype(trait_decl)) + trait_names |= trait_decl.uid + W.write("traits", trait_names) + +/datum/category_item/player_setup_item/traits/proc/get_trait_total() + var/trait_cost = 0 + for(var/trait_type in pref.traits) + var/decl/trait/trait = GET_DECL(trait_type) + if(!trait) + return null + trait_cost += trait.trait_cost + return trait_cost + +/datum/category_item/player_setup_item/traits/finalize_character() + pref.prune_invalid_traits() + +/datum/category_item/player_setup_item/traits/sanitize_character() + + if(!pref.traits) + pref.traits = list() + + pref.prune_invalid_traits() + + var/modified_list = FALSE + var/max_character_traits = get_config_value(/decl/config/num/max_character_traits) + while(get_trait_total() > max_character_traits) + + // Find a costly trait with no children to drop until our cost is below the threshold. + var/can_drop_trait = FALSE + for(var/trait_type in pref.traits) + + var/decl/trait/trait = GET_DECL(trait_type) + if(trait.trait_cost <= 0) + continue + + can_drop_trait = TRUE + for(var/decl/trait/child in trait.children) + if(child.type in pref.traits) + can_drop_trait = FALSE + break + + if(can_drop_trait) + pref.traits -= trait_type + modified_list = TRUE + break + + if(!can_drop_trait) + break + + if(modified_list) + pref.prune_invalid_traits() + +/datum/category_item/player_setup_item/traits/content() + + var/list/available_categories = list() + for(var/trait_category_id in global.trait_categories) + var/datum/trait_category/trait_category = global.trait_categories[trait_category_id] + if(trait_category.hide_from_chargen) + continue + for(var/decl/trait/trait as anything in trait_category.items) + if(trait.is_available_to(pref)) + available_categories[trait_category.name] = trait_category + break + if(!length(available_categories)) + return + + var/trait_total = get_trait_total() + // Change our formatting data if needed. + var/fcolor = COLOR_CYAN_BLUE + var/max_character_traits = get_config_value(/decl/config/num/max_character_traits) + if(trait_total == max_character_traits) + fcolor = COLOR_FONT_ORANGE + + // Build the string. + . = list("
    [trait_total]/[max_character_traits] points spent.

    ") + if(!selected_category || !(selected_category in available_categories)) + selected_category = available_categories[1] + + var/header = "" + var/body = "" + for(var/trait_category_id in available_categories) + + var/datum/trait_category/trait_category = available_categories[trait_category_id] + if(!istype(trait_category) || trait_category.hide_from_chargen) + continue + + var/trait_spent = 0 + for(var/decl/trait/trait in trait_category.items) + + if(trait.type in pref.traits) + trait_spent += trait.trait_cost + + if(trait_category_id == selected_category && !trait.parent && trait.available_at_chargen) + body += trait.get_trait_selection_data(src, pref.traits) + + var/category_label = trait_category.name + if(trait_spent != 0) + category_label = "[category_label] ([trait_spent])" + if(trait_category_id == selected_category) + category_label = "[category_label]" + header += "[category_label]" + + . += "[header]
    " + . += "[body]
    " + + return jointext(., null) + +/datum/category_item/player_setup_item/traits/OnTopic(href, href_list, user) + . = ..() + if(!.) + + if(href_list["select_category"]) + if(href_list["select_category"] in global.trait_categories) + selected_category = href_list["select_category"] + else + selected_category = global.trait_categories[1] + return TOPIC_REFRESH + + if(href_list["toggle_trait"]) + var/decl/trait/trait = locate(href_list["toggle_trait"]) + if(!istype(trait)) + return TOPIC_NOACTION + // Disable trait (and children). + if(trait.type in pref.traits) + var/list/traits_to_remove = list(trait) + while(traits_to_remove.len) + trait = traits_to_remove[1] + traits_to_remove -= trait + if(!(trait.type in pref.traits)) + continue + pref.traits -= trait.type + if(trait.children) + traits_to_remove |= trait.children + // Enable trait. + else if(get_trait_total() + trait.trait_cost <= get_config_value(/decl/config/num/max_character_traits)) + pref.traits |= trait.type + // Tidy up in case we're in an incoherent state for whatever reason. + pref.prune_invalid_traits() + return TOPIC_REFRESH_UPDATE_PREVIEW + + return ..() diff --git a/code/modules/client/preference_setup/preference_setup.dm b/code/modules/client/preference_setup/preference_setup.dm index 54aec096125..6065797a976 100644 --- a/code/modules/client/preference_setup/preference_setup.dm +++ b/code/modules/client/preference_setup/preference_setup.dm @@ -10,10 +10,10 @@ var/global/const/CHARACTER_PREFERENCE_INPUT_TITLE = "Character Preference" sort_order = 2 category_item_type = /datum/category_item/player_setup_item/physical -/datum/category_group/player_setup_category/aspect_preferences - name = "Aspects" +/datum/category_group/player_setup_category/trait_preferences + name = "Traits" sort_order = 3 - category_item_type = /datum/category_item/player_setup_item/aspects + category_item_type = /datum/category_item/player_setup_item/traits /datum/category_group/player_setup_category/background_preferences/content(var/mob/user) . = "" diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index d1b3c3f9799..d4445fc9c68 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -353,7 +353,8 @@ var/global/list/time_prefs_fixed = list() player_setup.sanitize_setup() validate_comments_record() // Make sure a record has been generated for this character. character.comments_record_id = comments_record_id - character.personal_aspects = list() + character.traits = null + var/decl/bodytype/new_bodytype = get_bodytype_decl() if(species == character.get_species_name()) character.set_bodytype(new_bodytype) @@ -415,6 +416,10 @@ var/global/list/time_prefs_fixed = list() if(O) O.set_sprite_accessory(accessory, accessory_category, accessory_colour, skip_update = TRUE) + if(length(traits)) + for(var/trait_type in traits) + character.set_trait(trait_type, traits[trait_type] || TRAIT_LEVEL_EXISTS) + if(LAZYLEN(appearance_descriptors)) character.appearance_descriptors = appearance_descriptors.Copy() @@ -426,18 +431,9 @@ var/global/list/time_prefs_fixed = list() character.update_icon() character.update_transform() - if(length(aspects)) - for(var/atype in aspects) - character.personal_aspects |= GET_DECL(atype) - character.need_aspect_sort = TRUE - character.apply_aspects(ASPECTS_PHYSICAL) - if(is_preview_copy) return - if(length(aspects)) - character.apply_aspects(ASPECTS_MENTAL) - for(var/token in cultural_info) character.set_cultural_value(token, cultural_info[token], defer_language_update = TRUE) character.update_languages() diff --git a/code/modules/materials/definitions/solids/materials_solid_metal.dm b/code/modules/materials/definitions/solids/materials_solid_metal.dm index 4cc9f5d75b5..2c041aa6fe0 100644 --- a/code/modules/materials/definitions/solids/materials_solid_metal.dm +++ b/code/modules/materials/definitions/solids/materials_solid_metal.dm @@ -386,7 +386,7 @@ ferrous = TRUE /decl/material/solid/metal/iron/affect_ingest(var/mob/living/M, var/removed, var/datum/reagents/holder) - if(M.HasTrait(/decl/trait/metabolically_inert)) + if(M.has_trait(/decl/trait/metabolically_inert)) return M.add_chemical_effect(CE_BLOODRESTORE, 8 * removed) diff --git a/code/modules/mob/living/human/human_damage.dm b/code/modules/mob/living/human/human_damage.dm index 0e04852a94a..c1d05b7c6ab 100644 --- a/code/modules/mob/living/human/human_damage.dm +++ b/code/modules/mob/living/human/human_damage.dm @@ -320,12 +320,12 @@ In most cases it makes more sense to use apply_damage() instead! And make sure t /* This function restores all organs. */ -/mob/living/human/restore_all_organs(var/ignore_organ_aspects) +/mob/living/human/restore_all_organs(var/ignore_organ_traits) get_bodytype()?.create_missing_organs(src) // root body part should never be missing on a mob for(var/bodypart in global.all_limb_tags_by_depth) var/obj/item/organ/external/current_organ = GET_EXTERNAL_ORGAN(src, bodypart) if(current_organ) - current_organ.rejuvenate(ignore_organ_aspects) + current_organ.rejuvenate(ignore_organ_traits) recheck_bad_external_organs() verbs -= /mob/living/human/proc/undislocate diff --git a/code/modules/organs/external/_external.dm b/code/modules/organs/external/_external.dm index 1b718f2a068..39673c2f03e 100644 --- a/code/modules/organs/external/_external.dm +++ b/code/modules/organs/external/_external.dm @@ -595,7 +595,7 @@ /* This function completely restores a damaged organ to perfect condition. */ -/obj/item/organ/external/rejuvenate(var/ignore_organ_aspects) +/obj/item/organ/external/rejuvenate(var/ignore_organ_traits) damage_state = "00" brute_dam = 0 @@ -610,10 +610,9 @@ This function completely restores a damaged organ to perfect condition. qdel(wound) number_wounds = 0 - // handle internal organs for(var/obj/item/organ/current_organ in internal_organs) - current_organ.rejuvenate(ignore_organ_aspects) + current_organ.rejuvenate(ignore_organ_traits) // remove embedded objects and drop them on the floor for(var/obj/implanted_object in implants) @@ -623,7 +622,7 @@ This function completely restores a damaged organ to perfect condition. undislocate(TRUE) - . = ..() // Clear damage, reapply aspects. + . = ..() // Clear damage, reapply traits. if(owner) owner.update_health() diff --git a/code/modules/organs/internal/heart.dm b/code/modules/organs/internal/heart.dm index 8b96ce26763..85f807eae8c 100644 --- a/code/modules/organs/internal/heart.dm +++ b/code/modules/organs/internal/heart.dm @@ -68,7 +68,7 @@ //If heart is stopped, it isn't going to restart itself randomly. if(pulse == PULSE_NONE) return - + //and if it's beating, let's see if it should var/should_stop = prob(80) && oxy < BLOOD_VOLUME_SURVIVE //cardiovascular shock, not enough liquid to pump should_stop = should_stop || prob(max(0, owner.get_damage(BRAIN) - owner.get_max_health() * 0.75)) //brain failing to work heart properly @@ -219,7 +219,7 @@ . = "[pulsesound] pulse" -/obj/item/organ/internal/heart/rejuvenate(ignore_organ_aspects) +/obj/item/organ/internal/heart/rejuvenate(ignore_organ_traits) . = ..() if(!BP_IS_PROSTHETIC(src)) pulse = PULSE_NORM diff --git a/code/modules/organs/organ.dm b/code/modules/organs/organ.dm index 222c2c3aa8b..6ae0fb2f1ea 100644 --- a/code/modules/organs/organ.dm +++ b/code/modules/organs/organ.dm @@ -338,16 +338,17 @@ /obj/item/organ/proc/remove_rejuv() qdel(src) -/obj/item/organ/proc/rejuvenate(var/ignore_organ_aspects) +/obj/item/organ/proc/rejuvenate(var/ignore_organ_traits) SHOULD_CALL_PARENT(TRUE) if(!owner) PRINT_STACK_TRACE("rejuvenate() called on organ of type [type] with no owner.") damage = 0 reset_status() - if(!ignore_organ_aspects && length(owner?.personal_aspects)) - for(var/decl/aspect/aspect as anything in owner.personal_aspects) - if(aspect.applies_to_organ(organ_tag)) - aspect.apply(owner) + if(!ignore_organ_traits) + for(var/trait_type in owner.get_traits()) + var/decl/trait/trait = GET_DECL(trait_type) + if(trait.applies_to_organ(organ_tag) && trait.reapply_on_rejuvenation) + trait.apply_trait(owner) /obj/item/organ/proc/reset_status() vital_to_owner = null // organ modifications might need this to be recalculated diff --git a/code/modules/organs/prosthetics/prosthetics_manufacturer_models.dm b/code/modules/organs/prosthetics/prosthetics_manufacturer_models.dm index 5baa68397ea..56dc4625b85 100644 --- a/code/modules/organs/prosthetics/prosthetics_manufacturer_models.dm +++ b/code/modules/organs/prosthetics/prosthetics_manufacturer_models.dm @@ -16,4 +16,4 @@ bodytype_category = BODYTYPE_HUMANOID material = /decl/material/solid/organic/wood -DEFINE_ROBOLIMB_MODEL_ASPECTS(/decl/bodytype/prosthetic/wooden, pirate, 0) +DEFINE_ROBOLIMB_MODEL_TRAITS(/decl/bodytype/prosthetic/wooden, pirate, 0) diff --git a/code/modules/reagents/chems/chems_blood.dm b/code/modules/reagents/chems/chems_blood.dm index 2217b16fb24..ae76f942ab3 100644 --- a/code/modules/reagents/chems/chems_blood.dm +++ b/code/modules/reagents/chems/chems_blood.dm @@ -54,7 +54,7 @@ blood_splatter(T, W?.resolve() || holder.my_atom, 1) /decl/material/liquid/blood/affect_ingest(var/mob/living/M, var/removed, var/datum/reagents/holder) - if(M.HasTrait(/decl/trait/metabolically_inert)) + if(M.has_trait(/decl/trait/metabolically_inert)) return if(LAZYACCESS(M.chem_doses, type) > 5) M.take_damage(removed, TOX) diff --git a/code/modules/reagents/chems/chems_compounds.dm b/code/modules/reagents/chems/chems_compounds.dm index 7ad24e74418..cd2fc94a85d 100644 --- a/code/modules/reagents/chems/chems_compounds.dm +++ b/code/modules/reagents/chems/chems_compounds.dm @@ -111,7 +111,7 @@ /decl/material/liquid/capsaicin/affect_ingest(var/mob/living/M, var/removed, var/datum/reagents/holder) holder.remove_reagent(/decl/material/liquid/frostoil, 5) - if(M.HasTrait(/decl/trait/metabolically_inert)) + if(M.has_trait(/decl/trait/metabolically_inert)) return if(ishuman(M)) @@ -202,7 +202,7 @@ /decl/material/liquid/capsaicin/condensed/affect_ingest(var/mob/living/M, var/removed, var/datum/reagents/holder) holder.remove_reagent(/decl/material/liquid/frostoil, 5) - if(M.HasTrait(/decl/trait/metabolically_inert)) + if(M.has_trait(/decl/trait/metabolically_inert)) return if(ishuman(M)) diff --git a/code/modules/reagents/chems/chems_drinks.dm b/code/modules/reagents/chems/chems_drinks.dm index abc7f5bc776..85d84b009ec 100644 --- a/code/modules/reagents/chems/chems_drinks.dm +++ b/code/modules/reagents/chems/chems_drinks.dm @@ -18,7 +18,7 @@ M.take_damage(removed, TOX) // Probably not a good idea; not very deadly though /decl/material/liquid/drink/affect_ingest(var/mob/living/M, var/removed, var/datum/reagents/holder) - if(M.HasTrait(/decl/trait/metabolically_inert)) + if(M.has_trait(/decl/trait/metabolically_inert)) return if(nutrition) @@ -41,7 +41,7 @@ /decl/material/liquid/drink/juice/affect_ingest(var/mob/living/M, var/removed, var/datum/reagents/holder) ..() - if(!M.HasTrait(/decl/trait/metabolically_inert)) + if(!M.has_trait(/decl/trait/metabolically_inert)) M.immunity = min(M.immunity + 0.25, M.immunity_norm*1.5) /decl/material/liquid/drink/juice/banana @@ -116,7 +116,7 @@ /decl/material/liquid/drink/juice/lime/affect_ingest(var/mob/living/M, var/removed, var/datum/reagents/holder) ..() - if(M.HasTrait(/decl/trait/metabolically_inert)) + if(M.has_trait(/decl/trait/metabolically_inert)) return M.heal_damage(TOX, 0.5 * removed) @@ -135,7 +135,7 @@ /decl/material/liquid/drink/juice/orange/affect_ingest(var/mob/living/M, var/removed, var/datum/reagents/holder) ..() - if(M.HasTrait(/decl/trait/metabolically_inert)) + if(M.has_trait(/decl/trait/metabolically_inert)) return M.heal_damage(OXY, 2 * removed) @@ -198,7 +198,7 @@ /decl/material/liquid/drink/juice/tomato/affect_ingest(var/mob/living/M, var/removed, var/datum/reagents/holder) ..() - if(M.HasTrait(/decl/trait/metabolically_inert)) + if(M.has_trait(/decl/trait/metabolically_inert)) return M.heal_organ_damage(0, 0.5 * removed) @@ -274,7 +274,7 @@ holder.remove_reagent(/decl/material/liquid/capsaicin, 10 * removed) - if(M.HasTrait(/decl/trait/metabolically_inert)) + if(M.has_trait(/decl/trait/metabolically_inert)) return M.heal_organ_damage(0.5 * removed, 0) @@ -340,7 +340,7 @@ if(adj_temp > 0) holder.remove_reagent(/decl/material/liquid/frostoil, 10 * removed) - if(M.HasTrait(/decl/trait/metabolically_inert)) + if(M.has_trait(/decl/trait/metabolically_inert)) return var/volume = REAGENT_VOLUME(holder, type) @@ -513,7 +513,7 @@ /decl/material/liquid/drink/mutagencola/affect_ingest(var/mob/living/M, var/removed, var/datum/reagents/holder) ..() - if(M.HasTrait(/decl/trait/metabolically_inert)) + if(M.has_trait(/decl/trait/metabolically_inert)) return M.add_chemical_effect(CE_SPEEDBOOST, 1) @@ -643,7 +643,7 @@ /decl/material/liquid/drink/hell_ramen/affect_ingest(var/mob/living/M, var/removed, var/datum/reagents/holder) ..() - if(M.HasTrait(/decl/trait/metabolically_inert)) + if(M.has_trait(/decl/trait/metabolically_inert)) return M.bodytemperature += 10 * TEMPERATURE_DAMAGE_COEFFICIENT @@ -662,7 +662,7 @@ /decl/material/liquid/drink/tea/affect_ingest(var/mob/living/M, var/removed, var/datum/reagents/holder) ..() - if(M.HasTrait(/decl/trait/metabolically_inert)) + if(M.has_trait(/decl/trait/metabolically_inert)) return M.heal_damage(TOX, 0.5 * removed) @@ -837,7 +837,7 @@ /decl/material/liquid/drink/beastenergy/affect_ingest(var/mob/living/M, var/removed, var/datum/reagents/holder) ..() - if(M.HasTrait(/decl/trait/metabolically_inert)) + if(M.has_trait(/decl/trait/metabolically_inert)) return ADJ_STATUS(M, STAT_DROWSY, -7) diff --git a/code/modules/reagents/chems/chems_ethanol.dm b/code/modules/reagents/chems/chems_ethanol.dm index 264a08ea936..7982a87a312 100644 --- a/code/modules/reagents/chems/chems_ethanol.dm +++ b/code/modules/reagents/chems/chems_ethanol.dm @@ -43,7 +43,7 @@ /decl/material/liquid/ethanol/affect_ingest(var/mob/living/M, var/removed, var/datum/reagents/holder) - if(M.HasTrait(/decl/trait/metabolically_inert)) + if(M.has_trait(/decl/trait/metabolically_inert)) return ..() @@ -131,7 +131,7 @@ /decl/material/liquid/ethanol/beer/affect_ingest(var/mob/living/M, var/removed, var/datum/reagents/holder) ..() - if(M.HasTrait(/decl/trait/metabolically_inert)) + if(M.has_trait(/decl/trait/metabolically_inert)) return ADJ_STATUS(M, STAT_JITTER, -3) @@ -194,7 +194,7 @@ /decl/material/liquid/ethanol/coffee/affect_ingest(var/mob/living/M, var/removed, var/datum/reagents/holder) ..() - if(M.HasTrait(/decl/trait/metabolically_inert)) + if(M.has_trait(/decl/trait/metabolically_inert)) return ADJ_STATUS(M, STAT_DIZZY, -5) @@ -276,7 +276,7 @@ /decl/material/liquid/ethanol/thirteenloko/affect_ingest(var/mob/living/M, var/removed, var/datum/reagents/holder) ..() - if(M.HasTrait(/decl/trait/metabolically_inert)) + if(M.has_trait(/decl/trait/metabolically_inert)) return ADJ_STATUS(M, STAT_DROWSY, -7) @@ -445,7 +445,7 @@ /decl/material/liquid/ethanol/pwine/affect_ingest(var/mob/living/M, var/removed, var/datum/reagents/holder) ..() - if(M.HasTrait(/decl/trait/metabolically_inert)) + if(M.has_trait(/decl/trait/metabolically_inert)) return var/dose = LAZYACCESS(M.chem_doses, type) diff --git a/code/modules/species/species.dm b/code/modules/species/species.dm index be5d5557f4b..fec5d27cde6 100644 --- a/code/modules/species/species.dm +++ b/code/modules/species/species.dm @@ -386,9 +386,13 @@ var/global/const/DEFAULT_SPECIES_HEALTH = 200 for(var/trait_type in traits) var/trait_level = traits[trait_type] - var/decl/trait/T = GET_DECL(trait_type) - if(!T.validate_level(trait_level)) + var/decl/trait/trait = GET_DECL(trait_type) + if(!trait.validate_level(trait_level)) . += "invalid levels for species trait [trait_type]" + if(name in trait.blocked_species) + . += "trait [trait.name] prevents this species from taking it" + if(trait.permitted_species && !(name in trait.permitted_species)) + . += "trait [trait.name] does not permit this species to take it" if(!length(blood_types)) . += "missing at least one blood type" diff --git a/code/unit_tests/aspects.dm b/code/unit_tests/aspects.dm deleted file mode 100644 index 8c76dd5f447..00000000000 --- a/code/unit_tests/aspects.dm +++ /dev/null @@ -1,27 +0,0 @@ -/datum/unit_test/aspects_shall_not_have_circular_references - name = "ASPECTS: Aspects Shall Not Have Circular References" - -/datum/unit_test/aspects_shall_not_have_circular_references/start_test() - - var/list/failures = list() - var/list/all_aspects = decls_repository.get_decls_of_subtype(/decl/aspect) - for(var/atype in all_aspects) - - var/list/seen_aspects = list() - var/list/checking_aspects = list(all_aspects[atype]) - while(checking_aspects.len) - var/decl/aspect/aspect = checking_aspects[1] - checking_aspects -= aspect - if(aspect in seen_aspects) - failures += "[atype] - [aspect.type]" - break - else - seen_aspects += aspect - if(aspect.children) - checking_aspects |= aspect.children - - if(length(failures)) - fail("Found [length(failures)] circular reference\s:\n[jointext(failures, "\n")]") - else - pass("Aspect tree has no circular references.") - return 1 diff --git a/code/unit_tests/traits.dm b/code/unit_tests/traits.dm new file mode 100644 index 00000000000..646501516ec --- /dev/null +++ b/code/unit_tests/traits.dm @@ -0,0 +1,27 @@ +/datum/unit_test/traits_shall_not_have_circular_references + name = "TRAITS: Traits Shall Not Have Circular References" + +/datum/unit_test/traits_shall_not_have_circular_references/start_test() + + var/list/failures = list() + var/list/all_traits = decls_repository.get_decls_of_type(/decl/trait) + for(var/atype in all_traits) + + var/list/seen_traits = list() + var/list/checking_traits = list(all_traits[atype]) + while(checking_traits.len) + var/decl/trait/trait = checking_traits[1] + checking_traits -= trait + if(trait in seen_traits) + failures += "[atype] - [trait.type]" + break + else + seen_traits += trait + if(trait.children) + checking_traits |= trait.children + + if(length(failures)) + fail("Found [length(failures)] circular reference\s:\n[jointext(failures, "\n")]") + else + pass("trait tree has no circular references.") + return 1 diff --git a/code/unit_tests/unique_tests.dm b/code/unit_tests/unique_tests.dm index 12d8fb5217f..b40e82eae5b 100644 --- a/code/unit_tests/unique_tests.dm +++ b/code/unit_tests/unique_tests.dm @@ -208,26 +208,6 @@ pass("All gas symbols are unique.") return TRUE -/datum/unit_test/aspects_shall_have_unique_names - name = "UNIQUENESS: All Aspects Shall Have Unique Names" - -/datum/unit_test/aspects_shall_have_unique_names/start_test() - var/list/aspects_by_name = list() - - var/list/all_aspects = decls_repository.get_decls_of_subtype(/decl/aspect) - for(var/atype in all_aspects) - var/decl/aspect/aspect = all_aspects[atype] - var/check_name = lowertext(aspect.name) - if(check_name) - group_by(aspects_by_name, check_name, atype) - - var/number_of_issues = number_of_issues(aspects_by_name, "Aspect Names") - if(length(number_of_issues)) - fail("Found [number_of_issues] aspect\s with duplicate names.") - else - pass("All aspects have unique names.") - return 1 - /datum/unit_test/submaps_shall_have_a_unique_descriptor name = "UNIQUENESS: Archetypes shall have a valid, unique descriptor." diff --git a/mods/content/corporate/datum/robolimbs.dm b/mods/content/corporate/datum/robolimbs.dm index 2b72d5a2089..b14da8cfd55 100644 --- a/mods/content/corporate/datum/robolimbs.dm +++ b/mods/content/corporate/datum/robolimbs.dm @@ -132,8 +132,8 @@ DEFINE_ROBOLIMB_DESIGNS(/decl/bodytype/prosthetic/xion, xion) DEFINE_ROBOLIMB_DESIGNS(/decl/bodytype/prosthetic/economy, wardtakahashi) DEFINE_ROBOLIMB_DESIGNS(/decl/bodytype/prosthetic/bishop, bishop) -DEFINE_ROBOLIMB_MODEL_ASPECTS(/decl/bodytype/prosthetic/shellguard, shellguard, 0) -DEFINE_ROBOLIMB_MODEL_ASPECTS(/decl/bodytype/prosthetic/nanotrasen, nanotrasen, 0) -DEFINE_ROBOLIMB_MODEL_ASPECTS(/decl/bodytype/prosthetic/xion, xion, 0) -DEFINE_ROBOLIMB_MODEL_ASPECTS(/decl/bodytype/prosthetic/economy, wardtakahashi, 0) -DEFINE_ROBOLIMB_MODEL_ASPECTS(/decl/bodytype/prosthetic/bishop, bishop, 0) +DEFINE_ROBOLIMB_MODEL_TRAITS(/decl/bodytype/prosthetic/shellguard, shellguard, 0) +DEFINE_ROBOLIMB_MODEL_TRAITS(/decl/bodytype/prosthetic/nanotrasen, nanotrasen, 0) +DEFINE_ROBOLIMB_MODEL_TRAITS(/decl/bodytype/prosthetic/xion, xion, 0) +DEFINE_ROBOLIMB_MODEL_TRAITS(/decl/bodytype/prosthetic/economy, wardtakahashi, 0) +DEFINE_ROBOLIMB_MODEL_TRAITS(/decl/bodytype/prosthetic/bishop, bishop, 0) diff --git a/mods/species/ascent/_ascent.dme b/mods/species/ascent/_ascent.dme index a8bf66e1a9c..63d6f95300d 100644 --- a/mods/species/ascent/_ascent.dme +++ b/mods/species/ascent/_ascent.dme @@ -5,7 +5,6 @@ #include "datum\access.dm" #include "datum\ai_laws.dm" #include "datum\antagonist.dm" -#include "datum\aspects.dm" #include "datum\codex.dm" #include "datum\culture.dm" #include "datum\descriptors.dm" @@ -13,6 +12,7 @@ #include "datum\languages.dm" #include "datum\species.dm" #include "datum\species_bodytypes.dm" +#include "datum\traits.dm" #include "effects\razorweb.dm" #include "items\cell.dm" #include "items\clothing.dm" diff --git a/mods/species/ascent/datum/aspects.dm b/mods/species/ascent/datum/traits.dm similarity index 66% rename from mods/species/ascent/datum/aspects.dm rename to mods/species/ascent/datum/traits.dm index c137edf90a1..2e8e36b2bb5 100644 --- a/mods/species/ascent/datum/aspects.dm +++ b/mods/species/ascent/datum/traits.dm @@ -1,11 +1,14 @@ -/decl/aspect/build_references() +/decl/trait/build_references() . = ..() LAZYINITLIST(blocked_species) blocked_species |= SPECIES_MANTID_ALATE blocked_species |= SPECIES_MANTID_GYNE blocked_species |= SPECIES_MANTID_NYMPH -/decl/aspect/ascent/build_references() +/decl/trait/ascent + abstract_type = /decl/trait/ascent + +/decl/trait/ascent/build_references() . = ..() blocked_species = null permitted_species = list( @@ -15,19 +18,19 @@ ) // Modifies the exosuit that you spawn with. -/decl/aspect/ascent/suit_upgrade +/decl/trait/ascent/suit_upgrade name = "Upgraded Support Systems" - desc = "Coming soon!" + description = "Coming soon!" category = "Suit Upgrades" // Physical modifications like extra organs or different resistances. -/decl/aspect/ascent/adaptation +/decl/trait/ascent/adaptation name = "Specialized Molt" - desc = "Coming soon!" + description = "Coming soon!" category = "Adaptations" // Behavioral compulsions enforced by AI -/decl/aspect/ascent/derangement +/decl/trait/ascent/derangement name = "Megalomania" - desc = "Coming soon!" + description = "Coming soon!" category = "Derangements" diff --git a/mods/species/drakes/drake_abilities_friendly.dm b/mods/species/drakes/drake_abilities_friendly.dm index 0e7b74855cb..6a674d7d48e 100644 --- a/mods/species/drakes/drake_abilities_friendly.dm +++ b/mods/species/drakes/drake_abilities_friendly.dm @@ -100,6 +100,6 @@ var/global/list/_wounds_being_tended_by_drakes = list() W.salve() W.disinfect() // Everyone else is just poisoned. - else if(!friend.HasTrait(/decl/trait/sivian_biochemistry)) + else if(!friend.has_trait(/decl/trait/sivian_biochemistry)) friend.take_damage(rand(1,2), TOX) return TRUE diff --git a/mods/species/drakes/drake_attacks.dm b/mods/species/drakes/drake_attacks.dm index 916000c7e70..df214d9fc54 100644 --- a/mods/species/drakes/drake_attacks.dm +++ b/mods/species/drakes/drake_attacks.dm @@ -1,5 +1,5 @@ /proc/drake_infect_wounds(var/obj/item/organ/external/bitten) - if(bitten.owner?.HasTrait(/decl/trait/sivian_biochemistry)) + if(bitten.owner?.has_trait(/decl/trait/sivian_biochemistry)) return var/list/open_wounds = list() for(var/datum/wound/wound in bitten?.wounds) diff --git a/mods/species/drakes/drake_modifiers.dm b/mods/species/drakes/drake_modifiers.dm index 1afd9e0cdc0..a540b0f0c3b 100644 --- a/mods/species/drakes/drake_modifiers.dm +++ b/mods/species/drakes/drake_modifiers.dm @@ -27,7 +27,7 @@ user.remove_aura(src) return 0 - if(!user.HasTrait(/decl/trait/sivian_biochemistry)) + if(!user.has_trait(/decl/trait/sivian_biochemistry)) user.heal_damage(BRUTE, 1, do_update_health = FALSE) user.heal_damage(BURN, 1, do_update_health = TRUE) return 1 diff --git a/mods/species/drakes/sifsap.dm b/mods/species/drakes/sifsap.dm index fc8c95a5a8b..fef95882bdc 100644 --- a/mods/species/drakes/sifsap.dm +++ b/mods/species/drakes/sifsap.dm @@ -31,20 +31,20 @@ color = "#c6e2ff" /decl/material/liquid/sifsap/affect_ingest(var/mob/living/M, var/removed, var/datum/reagents/holder) - if(M.HasTrait(/decl/trait/sivian_biochemistry)) + if(M.has_trait(/decl/trait/sivian_biochemistry)) if(!drake_add_sap(M, removed)) M.adjust_nutrition(toxicity * removed) return return affect_blood(M, removed * 0.7) /decl/material/liquid/sifsap/affect_blood(var/mob/living/M, var/removed, var/datum/reagents/holder) - if(M.HasTrait(/decl/trait/sivian_biochemistry)) + if(M.has_trait(/decl/trait/sivian_biochemistry)) return M.add_chemical_effect(CE_PULSE, -1) return ..() /decl/material/liquid/sifsap/affect_overdose(mob/living/M, total_dose) - if(M.HasTrait(/decl/trait/sivian_biochemistry)) + if(M.has_trait(/decl/trait/sivian_biochemistry)) return M.apply_damage(1, IRRADIATE) SET_STATUS_MAX(M, 5, STAT_DROWSY) diff --git a/mods/species/utility_frames/_utility_frames.dme b/mods/species/utility_frames/_utility_frames.dme index 15ee526e745..23ba8ed7d85 100644 --- a/mods/species/utility_frames/_utility_frames.dme +++ b/mods/species/utility_frames/_utility_frames.dme @@ -3,9 +3,9 @@ #include "..\..\content\shackles\_shackles.dme" // BEGIN_INCLUDE #include "_utility_frames.dm" -#include "aspects.dm" #include "markings.dm" #include "species.dm" #include "species_bodytypes.dm" +#include "traits.dm" // END_INCLUDE #endif \ No newline at end of file diff --git a/mods/species/utility_frames/aspects.dm b/mods/species/utility_frames/traits.dm similarity index 55% rename from mods/species/utility_frames/aspects.dm rename to mods/species/utility_frames/traits.dm index f0a6309287a..66fc29e15ef 100644 --- a/mods/species/utility_frames/aspects.dm +++ b/mods/species/utility_frames/traits.dm @@ -1,26 +1,29 @@ -/decl/aspect/build_references() +/decl/trait/build_references() . = ..() LAZYDISTINCTADD(blocked_species, SPECIES_FRAME) -/decl/aspect/utility_frame/build_references() +/decl/trait/utility_frame + abstract_type = /decl/trait/utility_frame + +/decl/trait/utility_frame/build_references() . = ..() blocked_species = null permitted_species = list(SPECIES_FRAME) // Cosmetic/armour changes, different models of limb -/decl/aspect/utility_frame/customisation +/decl/trait/utility_frame/customisation name = "Heavy Frame" - desc = "Coming soon!" + description = "Coming soon!" category = "Frame Customisation" // Additional augments, organs, better armour, robomodules -/decl/aspect/utility_frame/upgrade +/decl/trait/utility_frame/upgrade name = "Upgraded Widget" - desc = "Coming soon!" + description = "Coming soon!" category = "Upgrades" // Various maluses -/decl/aspect/utility_frame/fault +/decl/trait/utility_frame/fault name = "Faulty Widget" - desc = "Coming soon!" + description = "Coming soon!" category = "Faults" diff --git a/mods/species/vox/_vox.dme b/mods/species/vox/_vox.dme index f935187d754..0819c87c80a 100644 --- a/mods/species/vox/_vox.dme +++ b/mods/species/vox/_vox.dme @@ -6,7 +6,6 @@ #include "organs_vox.dm" #include "datum\accessories.dm" #include "datum\antagonism.dm" -#include "datum\aspects.dm" #include "datum\cultures_vox.dm" #include "datum\descriptors_vox.dm" #include "datum\factions_vox.dm" @@ -18,6 +17,7 @@ #include "datum\species.dm" #include "datum\species_bodytypes.dm" #include "datum\trader.dm" +#include "datum\traits.dm" #include "datum\unit_testing.dm" #include "gear\gear.dm" #include "gear\gear_gloves.dm" diff --git a/mods/species/vox/datum/robolimbs.dm b/mods/species/vox/datum/robolimbs.dm index 9e77e25f2d8..fd69455a905 100644 --- a/mods/species/vox/datum/robolimbs.dm +++ b/mods/species/vox/datum/robolimbs.dm @@ -7,4 +7,4 @@ name = "Improvised" icon_base = 'mods/species/vox/icons/body/improvised_cyberlimbs.dmi' -DEFINE_ROBOLIMB_MODEL_ASPECTS(/decl/bodytype/prosthetic/vox, arkmade, 2) +DEFINE_ROBOLIMB_MODEL_TRAITS(/decl/bodytype/prosthetic/vox, arkmade, 2) diff --git a/mods/species/vox/datum/aspects.dm b/mods/species/vox/datum/traits.dm similarity index 59% rename from mods/species/vox/datum/aspects.dm rename to mods/species/vox/datum/traits.dm index 7de37c45a09..337974e1d64 100644 --- a/mods/species/vox/datum/aspects.dm +++ b/mods/species/vox/datum/traits.dm @@ -1,20 +1,23 @@ -/decl/aspect/build_references() +/decl/trait/build_references() . = ..() LAZYDISTINCTADD(blocked_species, SPECIES_VOX) -/decl/aspect/vox/build_references() +/decl/trait/vox + abstract_type = /decl/trait/vox + +/decl/trait/vox/build_references() . = ..() blocked_species = null permitted_species = list(SPECIES_VOX) // Bonuses or maluses to skills/checks/actions. -/decl/aspect/vox/psyche +/decl/trait/vox/psyche name = "Apex-Edited" - desc = "Coming soon!" + description = "Coming soon!" category = "Psyche" // Perks for interacting with vox equipment. -/decl/aspect/vox/symbiosis +/decl/trait/vox/symbiosis name = "Self-Maintaining Equipment" - desc = "Coming soon!" + description = "Coming soon!" category = "Symbiosis" diff --git a/nebula.dme b/nebula.dme index a4bd7268497..ecca927f56a 100644 --- a/nebula.dme +++ b/nebula.dme @@ -28,7 +28,6 @@ #include "code\__defines\ao_misc.dm" #include "code\__defines\appearance.dm" #include "code\__defines\armor.dm" -#include "code\__defines\aspects.dm" #include "code\__defines\atmos.dm" #include "code\__defines\atmospherics.dm" #include "code\__defines\bodytype.dm" @@ -103,6 +102,7 @@ #include "code\__defines\time.dm" #include "code\__defines\tools.dm" #include "code\__defines\topic.dm" +#include "code\__defines\traits.dm" #include "code\__defines\turfs.dm" #include "code\__defines\unit_tests.dm" #include "code\__defines\webhooks.dm" @@ -295,7 +295,6 @@ #include "code\controllers\subsystems\weather.dm" #include "code\controllers\subsystems\xenoarch.dm" #include "code\controllers\subsystems\zcopy.dm" -#include "code\controllers\subsystems\initialization\aspects.dm" #include "code\controllers\subsystems\initialization\character_info.dm" #include "code\controllers\subsystems\initialization\character_setup.dm" #include "code\controllers\subsystems\initialization\codex.dm" @@ -640,12 +639,16 @@ #include "code\datums\trading\traders\ship.dm" #include "code\datums\trading\traders\unique.dm" #include "code\datums\trading\traders\weaponry.dm" +#include "code\datums\traits\_trait_categories.dm" +#include "code\datums\traits\_traits.dm" #include "code\datums\traits\metabolically_inert.dm" -#include "code\datums\traits\trait_levels.dm" -#include "code\datums\traits\traits.dm" -#include "code\datums\traits\maluses\allergies.dm" +#include "code\datums\traits\maluses\_malus.dm" +#include "code\datums\traits\maluses\amputations.dm" #include "code\datums\traits\maluses\animal_protein.dm" #include "code\datums\traits\maluses\ethanol.dm" +#include "code\datums\traits\maluses\vision.dm" +#include "code\datums\traits\prosthetics\prosthetic_limbs.dm" +#include "code\datums\traits\prosthetics\prosthetic_organs.dm" #include "code\datums\underwear\bottom.dm" #include "code\datums\underwear\socks.dm" #include "code\datums\underwear\top.dm" @@ -1698,12 +1701,6 @@ #include "code\modules\alarm\fire_alarm.dm" #include "code\modules\alarm\motion_alarm.dm" #include "code\modules\alarm\power_alarm.dm" -#include "code\modules\aspects\_aspects.dm" -#include "code\modules\aspects\aspects_amputations.dm" -#include "code\modules\aspects\aspects_handicaps.dm" -#include "code\modules\aspects\aspects_perks.dm" -#include "code\modules\aspects\aspects_prosthetic_limbs.dm" -#include "code\modules\aspects\aspects_prosthetic_organs.dm" #include "code\modules\assembly\assembly.dm" #include "code\modules\assembly\holder.dm" #include "code\modules\assembly\igniter.dm" @@ -1828,7 +1825,7 @@ #include "code\modules\client\preference_setup\controls\01_keybindings.dm" #include "code\modules\client\preference_setup\general\01_basic.dm" #include "code\modules\client\preference_setup\general\02_body.dm" -#include "code\modules\client\preference_setup\general\03_aspects.dm" +#include "code\modules\client\preference_setup\general\03_traits.dm" #include "code\modules\client\preference_setup\general\04_equipment.dm" #include "code\modules\client\preference_setup\general\05_flavor.dm" #include "code\modules\client\preference_setup\global\01_ui.dm" @@ -3952,7 +3949,6 @@ #include "code\unit_tests\_includes.dm" #include "code\unit_tests\alt_appearances_test.dm" #include "code\unit_tests\area_tests.dm" -#include "code\unit_tests\aspects.dm" #include "code\unit_tests\atmospherics_tests.dm" #include "code\unit_tests\cargo_tests.dm" #include "code\unit_tests\chemistry_tests.dm" @@ -3986,6 +3982,7 @@ #include "code\unit_tests\test_obj.dm" #include "code\unit_tests\time_tests.dm" #include "code\unit_tests\traders.dm" +#include "code\unit_tests\traits.dm" #include "code\unit_tests\turf_icons.dm" #include "code\unit_tests\unique_tests.dm" #include "code\unit_tests\unit_test.dm" From 968b766a2050cda0a717c3dcec9492b38d17ee45 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Thu, 20 Jun 2024 04:53:39 -0400 Subject: [PATCH 85/90] Fix cult props in wizard base --- code/game/gamemodes/wizard/wizard_props.dm | 21 ++++++ code/game/objects/effects/gateway.dm | 69 +++++++++++++++++ maps/antag_spawn/wizard/wizard_base.dmm | 6 +- mods/gamemodes/cult/overrides.dm | 5 ++ mods/gamemodes/cult/structures.dm | 86 ++-------------------- nebula.dme | 2 + tools/map_migrations/4124_cult_modpack.txt | 1 + 7 files changed, 108 insertions(+), 82 deletions(-) create mode 100644 code/game/gamemodes/wizard/wizard_props.dm create mode 100644 code/game/objects/effects/gateway.dm create mode 100644 tools/map_migrations/4124_cult_modpack.txt diff --git a/code/game/gamemodes/wizard/wizard_props.dm b/code/game/gamemodes/wizard/wizard_props.dm new file mode 100644 index 00000000000..b8b834679db --- /dev/null +++ b/code/game/gamemodes/wizard/wizard_props.dm @@ -0,0 +1,21 @@ +/obj/structure/talisman_altar + name = "Altar" + desc = "A bloodstained altar dedicated to the worship of some unknown dark entity." + icon = 'icons/obj/cult.dmi' + icon_state = "talismanaltar" + density = TRUE + anchored = TRUE + +/obj/structure/fake_pylon + name = "\improper Pylon" + desc = "A floating crystal that hums with an unearthly energy." + icon = 'icons/obj/structures/pylon.dmi' + icon_state = "pylon" + light_power = 0.5 + light_range = 13 + light_color = "#3e0000" + +// A de-culted version of the cult gateway, for the wizard base map. +/obj/effect/gateway/active/spooky + light_range=5 + light_color="#ff0000" \ No newline at end of file diff --git a/code/game/objects/effects/gateway.dm b/code/game/objects/effects/gateway.dm new file mode 100644 index 00000000000..1323ffda6dd --- /dev/null +++ b/code/game/objects/effects/gateway.dm @@ -0,0 +1,69 @@ +/obj/effect/gateway + name = "gateway" + desc = "You're pretty sure that abyss is staring back." + icon = 'icons/obj/cult.dmi' + icon_state = "hole" + density = TRUE + anchored = TRUE + var/spawnable = null + +/obj/effect/gateway/active + light_range=5 + light_color="#ff0000" + spawnable=list( + /mob/living/simple_animal/hostile/scarybat, + /mob/living/simple_animal/hostile/creature, + /mob/living/simple_animal/hostile/faithless + ) + +/obj/effect/gateway/active/Initialize() + . = ..() + addtimer(CALLBACK(src, PROC_REF(create_and_delete)), rand(30,60) SECONDS) + +/obj/effect/gateway/active/proc/create_and_delete() + var/t = pick(spawnable) + new t(src.loc) + qdel(src) + +/obj/effect/gateway/active/proc/can_transform(mob/victim) + if(victim.stat == DEAD) + return FALSE + if(victim.HasMovementHandler(/datum/movement_handler/mob/transformation)) + return FALSE + if(ishuman(victim) || isrobot(victim)) + return TRUE + return FALSE + +/obj/effect/gateway/active/Crossed(var/atom/movable/AM) + if(!isliving(AM)) + return + + var/mob/living/victim = AM + + if(!can_transform(victim)) + return + + victim.handle_pre_transformation() + + victim.AddMovementHandler(/datum/movement_handler/mob/transformation) + victim.icon = null + victim.overlays.len = 0 + victim.set_invisibility(INVISIBILITY_ABSTRACT) + + if(isrobot(victim)) + var/mob/living/silicon/robot/Robot = victim + QDEL_NULL(Robot.central_processor) + else + for(var/obj/item/W in victim) + victim.drop_from_inventory(W) + if(istype(W, /obj/item/implant)) + qdel(W) + + var/mob/living/new_mob = new /mob/living/simple_animal/corgi(AM.loc) + new_mob.a_intent = I_HURT + if(victim.mind) + victim.mind.transfer_to(new_mob) + else + new_mob.key = victim.key + + to_chat(new_mob, "Your form morphs into that of a corgi.")//Because we don't have cluwnes \ No newline at end of file diff --git a/maps/antag_spawn/wizard/wizard_base.dmm b/maps/antag_spawn/wizard/wizard_base.dmm index 3c501d4b785..1f7355801c5 100644 --- a/maps/antag_spawn/wizard/wizard_base.dmm +++ b/maps/antag_spawn/wizard/wizard_base.dmm @@ -513,7 +513,7 @@ }, /area/map_template/wizard_station) "bq" = ( -/obj/structure/cult/pylon, +/obj/structure/fake_pylon, /turf/unsimulated/floor{ icon_state = "cult"; name = "plating" @@ -562,7 +562,7 @@ }, /area/map_template/wizard_station) "bx" = ( -/obj/structure/cult/talisman, +/obj/structure/talisman_altar, /obj/item/knife/ritual, /turf/unsimulated/floor{ icon_state = "cult"; @@ -577,7 +577,7 @@ }, /area/map_template/wizard_station) "bz" = ( -/obj/effect/gateway/active/cult, +/obj/effect/gateway/active/spooky, /turf/unsimulated/floor{ icon_state = "cult"; name = "plating" diff --git a/mods/gamemodes/cult/overrides.dm b/mods/gamemodes/cult/overrides.dm index 14c8a56d1ee..e4cb82b5192 100644 --- a/mods/gamemodes/cult/overrides.dm +++ b/mods/gamemodes/cult/overrides.dm @@ -63,3 +63,8 @@ /obj/item/mop/Initialize() . = ..() moppable_types += /obj/effect/rune + +/obj/effect/gateway/active/can_transform(mob/victim) + if(iscultist(victim)) + return FALSE + return ..() \ No newline at end of file diff --git a/mods/gamemodes/cult/structures.dm b/mods/gamemodes/cult/structures.dm index 59d38e3848b..53aaa9c60ae 100644 --- a/mods/gamemodes/cult/structures.dm +++ b/mods/gamemodes/cult/structures.dm @@ -3,19 +3,13 @@ anchored = TRUE icon = 'icons/obj/cult.dmi' -/obj/structure/cult/talisman - name = "Altar" - desc = "A bloodstained altar dedicated to Nar-Sie." - icon_state = "talismanaltar" - - /obj/structure/cult/forge - name = "Daemon forge" + name = "\improper Daemon forge" desc = "A forge used in crafting the unholy weapons used by the armies of Nar-Sie." icon_state = "forge" /obj/structure/cult/pylon - name = "Pylon" + name = "pylon" desc = "A floating crystal that hums with an unearthly energy." icon = 'icons/obj/structures/pylon.dmi' icon_state = "pylon" @@ -74,7 +68,7 @@ return "Tribal pylon - subject resembles statues/emblems built by cargo cult civilisations to honour energy systems from post-warp civilisations." /obj/structure/cult/tome - name = "Desk" + name = "desk" desc = "A desk covered in arcane manuscripts and tomes in unknown languages. Looking at the text makes your skin crawl." icon_state = "tomealtar" @@ -88,24 +82,6 @@ icon = 'magic_pillar.dmi' */ -/obj/effect/gateway - name = "gateway" - desc = "You're pretty sure that abyss is staring back." - icon = 'icons/obj/cult.dmi' - icon_state = "hole" - density = TRUE - anchored = TRUE - var/spawnable = null - -/obj/effect/gateway/active - light_range=5 - light_color="#ff0000" - spawnable=list( - /mob/living/simple_animal/hostile/scarybat, - /mob/living/simple_animal/hostile/creature, - /mob/living/simple_animal/hostile/faithless - ) - /obj/effect/gateway/active/cult light_range=5 light_color="#ff0000" @@ -115,57 +91,6 @@ /mob/living/simple_animal/hostile/faithless/cult ) -/obj/effect/gateway/active/Initialize() - . = ..() - addtimer(CALLBACK(src, PROC_REF(create_and_delete)), rand(30,60) SECONDS) - - -/obj/effect/gateway/active/proc/create_and_delete() - var/t = pick(spawnable) - new t(src.loc) - qdel(src) - -/obj/effect/gateway/active/Crossed(var/atom/movable/AM) - if(!isliving(AM)) - return - - var/mob/living/M = AM - if(M.stat == DEAD) - return - - if(M.HasMovementHandler(/datum/movement_handler/mob/transformation)) - return - - M.handle_pre_transformation() - - if(iscultist(M)) - return - if(!ishuman(M) && !isrobot(M)) - return - - M.AddMovementHandler(/datum/movement_handler/mob/transformation) - M.icon = null - M.overlays.len = 0 - M.set_invisibility(INVISIBILITY_ABSTRACT) - - if(isrobot(M)) - var/mob/living/silicon/robot/Robot = M - QDEL_NULL(Robot.central_processor) - else - for(var/obj/item/W in M) - M.drop_from_inventory(W) - if(istype(W, /obj/item/implant)) - qdel(W) - - var/mob/living/new_mob = new /mob/living/simple_animal/corgi(AM.loc) - new_mob.a_intent = I_HURT - if(M.mind) - M.mind.transfer_to(new_mob) - else - new_mob.key = M.key - - to_chat(new_mob, "Your form morphs into that of a corgi.")//Because we don't have cluwnes - /obj/structure/door/cult material = /decl/material/solid/stone/cult @@ -189,4 +114,7 @@ /obj/structure/grille/cult/CanPass(atom/movable/mover, turf/target, height = 1.5, air_group = 0) if(air_group) return 0 //Make sure air doesn't drain - ..() \ No newline at end of file + ..() + +/obj/structure/talisman_altar + desc = "A bloodstained altar dedicated to Nar-Sie." \ No newline at end of file diff --git a/nebula.dme b/nebula.dme index a88824d612a..259f7f66d03 100644 --- a/nebula.dme +++ b/nebula.dme @@ -770,6 +770,7 @@ #include "code\game\gamemodes\objectives\objective_steal.dm" #include "code\game\gamemodes\traitor\traitor.dm" #include "code\game\gamemodes\wizard\wizard.dm" +#include "code\game\gamemodes\wizard\wizard_props.dm" #include "code\game\gamemodes\wizard\servant_items\caretaker.dm" #include "code\game\gamemodes\wizard\servant_items\champion.dm" #include "code\game\gamemodes\wizard\servant_items\familiar.dm" @@ -991,6 +992,7 @@ #include "code\game\objects\effects\explosion_particles.dm" #include "code\game\objects\effects\fake_fire.dm" #include "code\game\objects\effects\force_portal.dm" +#include "code\game\objects\effects\gateway.dm" #include "code\game\objects\effects\gibspawner.dm" #include "code\game\objects\effects\item_pickup_ghost.dm" #include "code\game\objects\effects\landmarks.dm" diff --git a/tools/map_migrations/4124_cult_modpack.txt b/tools/map_migrations/4124_cult_modpack.txt new file mode 100644 index 00000000000..3d29f8793ba --- /dev/null +++ b/tools/map_migrations/4124_cult_modpack.txt @@ -0,0 +1 @@ +/obj/structure/cult/talisman : /obj/structure/talisman_altar{@OLD} \ No newline at end of file From e6e72c81d16d62c99f2e607263aae8bbd0ba0f6b Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Thu, 20 Jun 2024 05:46:20 -0400 Subject: [PATCH 86/90] Move Traitor gamemode and antagonist into a modpack --- code/datums/ai/ai_holo.dm | 2 +- code/datums/ai_laws.dm | 2 +- code/game/antagonist/_antagonist_setup.dm | 6 +- code/game/machinery/singularitybeacon.dm | 85 +++++++++ code/game/machinery/syndicatebeacon.dm | 164 ------------------ code/game/objects/items/weapons/AI_modules.dm | 6 +- code/modules/mob/living/silicon/ai/icons.dm | 4 +- code/modules/mob/living/silicon/robot/laws.dm | 22 +-- code/modules/mob/living/silicon/robot/life.dm | 11 -- code/modules/mob/living/silicon/silicon.dm | 5 +- code/modules/nano/modules/law_manager.dm | 24 +-- code/modules/pronouns/_pronouns.dm | 1 + code/modules/pronouns/pronouns_female.dm | 1 + code/modules/pronouns/pronouns_male.dm | 1 + .../xenoarcheaology/datums/artifact_find.dm | 3 +- maps/exodus/exodus.dm | 1 + maps/ministation/ministation.dm | 1 + maps/modpack_testing/modpack_testing.dm | 1 + maps/tradeship/tradeship.dm | 1 + mods/gamemodes/traitor/_traitor.dm | 2 + mods/gamemodes/traitor/_traitor.dme | 10 ++ .../gamemodes/traitor/gamemode.dm | 0 mods/gamemodes/traitor/overrides.dm | 31 ++++ .../gamemodes/traitor/special_role.dm | 14 +- mods/gamemodes/traitor/syndicatebeacon.dm | 80 +++++++++ nebula.dme | 4 +- 26 files changed, 257 insertions(+), 225 deletions(-) create mode 100644 code/game/machinery/singularitybeacon.dm delete mode 100644 code/game/machinery/syndicatebeacon.dm create mode 100644 mods/gamemodes/traitor/_traitor.dm create mode 100644 mods/gamemodes/traitor/_traitor.dme rename code/game/gamemodes/traitor/traitor.dm => mods/gamemodes/traitor/gamemode.dm (100%) create mode 100644 mods/gamemodes/traitor/overrides.dm rename code/game/antagonist/station/traitor.dm => mods/gamemodes/traitor/special_role.dm (88%) create mode 100644 mods/gamemodes/traitor/syndicatebeacon.dm diff --git a/code/datums/ai/ai_holo.dm b/code/datums/ai/ai_holo.dm index f50b3d201fa..c56bb5f303e 100644 --- a/code/datums/ai/ai_holo.dm +++ b/code/datums/ai/ai_holo.dm @@ -11,7 +11,7 @@ /decl/ai_holo/proc/may_be_used_by_ai(var/mob/living/silicon/ai/AI) - return !requires_malf || AI.is_traitor() + return !requires_malf || AI.is_malfunctioning() /decl/ai_holo/Initialize() name = icon_state diff --git a/code/datums/ai_laws.dm b/code/datums/ai_laws.dm index e9b524cd3b3..69cacbbd69a 100644 --- a/code/datums/ai_laws.dm +++ b/code/datums/ai_laws.dm @@ -90,7 +90,7 @@ /mob/living/silicon/proc/sync_zeroth(var/datum/ai_law/zeroth_law, var/datum/ai_law/zeroth_law_borg) - if (!is_traitor(src)) + if (!is_malfunctioning(src)) if(zeroth_law_borg) laws.set_zeroth_law(zeroth_law_borg.law) else if(zeroth_law) diff --git a/code/game/antagonist/_antagonist_setup.dm b/code/game/antagonist/_antagonist_setup.dm index 961cd573658..5b6d83d7d3d 100644 --- a/code/game/antagonist/_antagonist_setup.dm +++ b/code/game/antagonist/_antagonist_setup.dm @@ -1,12 +1,12 @@ /* MODULAR ANTAGONIST SYSTEM - Attempts to centralize antag tracking code into its own system, which has the added bonus of making + Attempts to centralize antag tracking code into its own system, which has the added bonus of making the display procs consistent. Should be fairly self-explanatory with a review of the procs. To use: - - Get the appropriate datum via the decls repository ie. - var/decl/special_role/A = GET_DECL(/decl/special_role/traitor) + - Get the appropriate datum via the decls repository ie. + var/decl/special_role/A = GET_DECL(/decl/special_role/the_guy) - Call add_antagonist() on the desired target mind ie. A.add_antagonist(mob.mind) - To ignore protected roles, supply a positive second argument. - To skip equipping with appropriate gear, supply a positive third argument. diff --git a/code/game/machinery/singularitybeacon.dm b/code/game/machinery/singularitybeacon.dm new file mode 100644 index 00000000000..b47720adbfe --- /dev/null +++ b/code/game/machinery/singularitybeacon.dm @@ -0,0 +1,85 @@ +var/global/list/singularity_beacons = list() + +//////////////////////////////////////// +//Singularity beacon +//////////////////////////////////////// +/obj/machinery/singularity_beacon + name = "ominous beacon" + desc = "This looks suspicious..." + icon = 'icons/obj/singularity.dmi' + icon_state = "beaconsynd" + + uncreated_component_parts = list(/obj/item/stock_parts/power/terminal) + anchored = FALSE + density = TRUE + layer = BASE_ABOVE_OBJ_LAYER //so people can't hide it and it's REALLY OBVIOUS + stat = 0 + use_power = POWER_USE_OFF + +/obj/machinery/singularity_beacon/Initialize() + . = ..() + global.singularity_beacons += src + +/obj/machinery/singularity_beacon/Destroy() + if(use_power) + Deactivate() + global.singularity_beacons -= src + return ..() + +/obj/machinery/singularity_beacon/proc/Activate(mob/user = null) + for(var/obj/effect/singularity/singulo in global.singularities) + if(singulo.z == z) + singulo.target = src + icon_state = "[initial(icon_state)]1" + update_use_power(POWER_USE_ACTIVE) + if(user) + to_chat(user, SPAN_NOTICE("You activate the beacon.")) + +/obj/machinery/singularity_beacon/proc/Deactivate(mob/user = null) + for(var/obj/effect/singularity/singulo in global.singularities) + if(singulo.target == src) + singulo.target = null + icon_state = "[initial(icon_state)]0" + update_use_power(POWER_USE_OFF) + if(user) + to_chat(user, SPAN_NOTICE("You deactivate the beacon.")) + +/obj/machinery/singularity_beacon/physical_attack_hand(var/mob/user) + . = TRUE + if(anchored) + if(use_power) + Deactivate(user) + else + Activate(user) + else + to_chat(user, SPAN_DANGER("You need to screw the beacon to the floor first!")) + +/obj/machinery/singularity_beacon/attackby(obj/item/W, mob/user) + if(IS_SCREWDRIVER(W)) + if(use_power) + to_chat(user, SPAN_DANGER("You need to deactivate the beacon first!")) + return + + if(anchored) + anchored = FALSE + to_chat(user, SPAN_NOTICE("You unscrew the beacon from the floor.")) + return + else + anchored = TRUE + to_chat(user, SPAN_NOTICE("You screw the beacon to the floor.")) + return + ..() + return + +// Ensure the terminal is always accessible to be plugged in. +/obj/machinery/singularity_beacon/components_are_accessible(var/path) + if(ispath(path, /obj/item/stock_parts/power/terminal)) + return TRUE + return ..() + +/obj/machinery/singularity_beacon/power_change() + . = ..() + if(!. || !use_power) + return + if(stat & NOPOWER) + Deactivate() diff --git a/code/game/machinery/syndicatebeacon.dm b/code/game/machinery/syndicatebeacon.dm deleted file mode 100644 index 0ad381c477e..00000000000 --- a/code/game/machinery/syndicatebeacon.dm +++ /dev/null @@ -1,164 +0,0 @@ -var/global/list/singularity_beacons = list() - -//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:31 - -// Beacon randomly spawns in space -// When a non-traitor (no special role in /mind) uses it, he is given the choice to become a traitor -// If he accepts there is a random chance he will be accepted, rejected, or rejected and killed -// Bringing certain items can help improve the chance to become a traitor - - -/obj/machinery/syndicate_beacon - name = "ominous beacon" - desc = "This looks suspicious..." - icon = 'icons/obj/items/syndibeacon.dmi' - icon_state = "syndbeacon" - - anchored = TRUE - density = TRUE - - var/temptext = "" - var/selfdestructing = 0 - var/charges = 1 - -/obj/machinery/syndicate_beacon/interface_interact(var/mob/user) - interact(user) - return TRUE - -/obj/machinery/syndicate_beacon/interact(var/mob/user) - user.set_machine(src) - var/dat = "Scanning [pick("retina pattern", "voice print", "fingerprints", "dna sequence")]...
    Identity confirmed,
    " - if(ishuman(user) || isAI(user)) - if(is_special_character(user)) - dat += "Operative record found. Greetings, Agent [user.name].
    " - else if(charges < 1) - dat += "Connection severed.
    " - else - var/honorific = "Mr." - if(user.gender == FEMALE) - honorific = "Ms." - dat += "Identity not found in operative database. What can the Syndicate do for you today, [honorific] [user.name]?
    " - if(!selfdestructing) - dat += "

    \"[pick("I want to switch teams.", "I want to work for you.", "Let me join you.", "I can be of use to you.", "You want me working for you, and here's why...", "Give me an objective.", "How's the 401k over at the Syndicate?")]\"
    " - dat += temptext - show_browser(user, dat, "window=syndbeacon") - onclose(user, "syndbeacon") - -/obj/machinery/syndicate_beacon/Topic(href, href_list) - if(..()) - return - if(href_list["betraitor"]) - if(charges < 1) - src.updateUsrDialog() - return - var/mob/M = locate(href_list["traitormob"]) - if(M.mind.assigned_special_role || jobban_isbanned(M, /decl/special_role/traitor)) - temptext = "We have no need for you at this time. Have a pleasant day.
    " - src.updateUsrDialog() - return - charges -= 1 - if(prob(50)) - temptext = "Double-crosser. You planned to betray us from the start. Allow us to repay the favor in kind." - src.updateUsrDialog() - addtimer(CALLBACK(src, PROC_REF(selfdestruct)), rand(5, 20) SECONDS) - return - if(ishuman(M)) - var/mob/living/human/N = M - to_chat(M, "You have joined the ranks of the Syndicate and become a traitor to the station!") - var/decl/special_role/traitors = GET_DECL(/decl/special_role/traitor) - traitors.add_antagonist(N.mind) - log_and_message_admins("has accepted a traitor objective from a syndicate beacon.", M) - - - src.updateUsrDialog() - return - - -/obj/machinery/syndicate_beacon/proc/selfdestruct() - selfdestructing = 1 - INVOKE_ASYNC(GLOBAL_PROC, GLOBAL_PROC_REF(explosion), src.loc, 1, rand(1, 3), rand(3, 8), 10) - -//////////////////////////////////////// -//Singularity beacon -//////////////////////////////////////// -/obj/machinery/singularity_beacon - name = "ominous beacon" - desc = "This looks suspicious..." - icon = 'icons/obj/singularity.dmi' - icon_state = "beaconsynd" - - uncreated_component_parts = list(/obj/item/stock_parts/power/terminal) - anchored = FALSE - density = TRUE - layer = BASE_ABOVE_OBJ_LAYER //so people can't hide it and it's REALLY OBVIOUS - stat = 0 - use_power = POWER_USE_OFF - -/obj/machinery/singularity_beacon/Initialize() - . = ..() - global.singularity_beacons += src - -/obj/machinery/singularity_beacon/Destroy() - if(use_power) - Deactivate() - global.singularity_beacons -= src - return ..() - -/obj/machinery/singularity_beacon/proc/Activate(mob/user = null) - for(var/obj/effect/singularity/singulo in global.singularities) - if(singulo.z == z) - singulo.target = src - icon_state = "[initial(icon_state)]1" - update_use_power(POWER_USE_ACTIVE) - if(user) - to_chat(user, "You activate the beacon.") - -/obj/machinery/singularity_beacon/proc/Deactivate(mob/user = null) - for(var/obj/effect/singularity/singulo in global.singularities) - if(singulo.target == src) - singulo.target = null - icon_state = "[initial(icon_state)]0" - update_use_power(POWER_USE_OFF) - if(user) - to_chat(user, "You deactivate the beacon.") - -/obj/machinery/singularity_beacon/physical_attack_hand(var/mob/user) - . = TRUE - if(anchored) - if(use_power) - Deactivate(user) - else - Activate(user) - else - to_chat(user, "You need to screw the beacon to the floor first!") - -/obj/machinery/singularity_beacon/attackby(obj/item/W, mob/user) - if(IS_SCREWDRIVER(W)) - if(use_power) - to_chat(user, "You need to deactivate the beacon first!") - return - - if(anchored) - anchored = FALSE - to_chat(user, "You unscrew the beacon from the floor.") - return - else - anchored = TRUE - to_chat(user, "You screw the beacon to the floor.") - return - ..() - return - -// Ensure the terminal is always accessible to be plugged in. -/obj/machinery/singularity_beacon/components_are_accessible(var/path) - if(ispath(path, /obj/item/stock_parts/power/terminal)) - return TRUE - return ..() - -/obj/machinery/singularity_beacon/power_change() - . = ..() - if(!. || !use_power) - return - if(stat & NOPOWER) - Deactivate() - diff --git a/code/game/objects/items/weapons/AI_modules.dm b/code/game/objects/items/weapons/AI_modules.dm index ef23bc0840b..dc10c366ad4 100644 --- a/code/game/objects/items/weapons/AI_modules.dm +++ b/code/game/objects/items/weapons/AI_modules.dm @@ -128,7 +128,7 @@ AI MODULES /obj/item/aiModule/oneHuman/addAdditionalLaws(var/mob/living/silicon/ai/target, var/mob/sender) var/law = "Only [targetName] is a crew member." - if (!target.is_traitor()) // Makes sure the AI isn't a traitor before changing their law 0. --NeoFite + if (!target.is_malfunctioning()) // Makes sure the AI isn't a traitor before changing their law 0. --NeoFite to_chat(target, law) target.set_zeroth_law(law) global.lawchanges.Add("The law specified [targetName]") @@ -232,7 +232,7 @@ AI MODULES /obj/item/aiModule/reset/transmitInstructions(var/mob/living/silicon/ai/target, var/mob/sender) log_law_changes(target, sender) - if (!target.is_traitor()) + if (!target.is_malfunctioning()) target.set_zeroth_law("") target.laws.clear_supplied_laws() target.laws.clear_ion_laws() @@ -250,7 +250,7 @@ AI MODULES /obj/item/aiModule/purge/transmitInstructions(var/mob/living/silicon/ai/target, var/mob/sender) log_law_changes(target, sender) - if (!target.is_traitor()) + if (!target.is_malfunctioning()) target.set_zeroth_law("") target.laws.clear_supplied_laws() target.laws.clear_ion_laws() diff --git a/code/modules/mob/living/silicon/ai/icons.dm b/code/modules/mob/living/silicon/ai/icons.dm index 3c0a4ea09f0..de4c3e77fd5 100644 --- a/code/modules/mob/living/silicon/ai/icons.dm +++ b/code/modules/mob/living/silicon/ai/icons.dm @@ -9,7 +9,7 @@ var/global/list/ai_icon_subtypes for(var/ai_icon_type in subtypesof(/datum/ai_icon)) ai_icon_subtypes[ai_icon_type] = new ai_icon_type return global.ai_icon_subtypes - + /datum/ai_icon var/name var/icon = 'icons/mob/AI.dmi' @@ -40,7 +40,7 @@ var/global/list/ai_icon_subtypes name = "[name] (Malf)" /datum/ai_icon/malf/may_used_by_ai(var/mob/living/silicon/ai/AI) - return istype(AI) && AI.is_traitor() + return istype(AI) && AI.is_malfunctioning() /datum/ai_icon/red name = "Red" diff --git a/code/modules/mob/living/silicon/robot/laws.dm b/code/modules/mob/living/silicon/robot/laws.dm index 886cb020c8f..22ecbf50f91 100644 --- a/code/modules/mob/living/silicon/robot/laws.dm +++ b/code/modules/mob/living/silicon/robot/laws.dm @@ -14,33 +14,29 @@ if(lawupdate) if (connected_ai) if(connected_ai.stat || connected_ai.control_disabled) - to_chat(src, "AI signal lost, unable to sync laws.") + to_chat(src, SPAN_BOLD("AI signal lost, unable to sync laws.")) else - lawsync() photosync() - to_chat(src, "Laws synced with AI, be sure to note any changes.") - // TODO: Update to new antagonist system. - if(mind && mind.assigned_special_role == /decl/special_role/traitor && mind.original == src) - to_chat(src, "Remember, your AI does NOT share or know about your law 0.") + to_chat(src, SPAN_BOLD("Laws synced with AI, be sure to note any changes.")) + lawsync() else - to_chat(src, "No AI selected to sync laws with, disabling lawsync protocol.") - lawupdate = 0 + to_chat(src, SPAN_BOLD("No AI selected to sync laws with, disabling lawsync protocol.")) + lawupdate = FALSE to_chat(who, SPAN_BOLD("Obey the following laws.")) to_chat(who, SPAN_ITALIC("All laws have equal priority. Laws may override other laws if written specifically to do so. If laws conflict, break the least.")) laws.show_laws(who) - // TODO: Update to new antagonist system. - if (mind && (mind.assigned_special_role == /decl/special_role/traitor && mind.original == src) && connected_ai) - to_chat(who, "Remember, [connected_ai.name] is technically your master, but your objective comes first.") - else if (connected_ai) + show_master(who) + +/mob/living/silicon/robot/proc/show_master(mob/who) + if (connected_ai) to_chat(who, "Remember, [connected_ai.name] is your master, other AIs can be ignored.") else if (emagged) to_chat(who, "Remember, you are not required to listen to the AI.") else to_chat(who, "Remember, you are not bound to any AI, you are not required to listen to them.") - /mob/living/silicon/robot/lawsync() laws_sanity_check() var/datum/ai_laws/master = connected_ai && lawupdate ? connected_ai.laws : null diff --git a/code/modules/mob/living/silicon/robot/life.dm b/code/modules/mob/living/silicon/robot/life.dm index 2cb4f2a1492..1a49f4fb985 100644 --- a/code/modules/mob/living/silicon/robot/life.dm +++ b/code/modules/mob/living/silicon/robot/life.dm @@ -145,17 +145,6 @@ else src.healths.icon_state = "health7" - if (src.syndicate && src.client) - var/decl/special_role/traitors = GET_DECL(/decl/special_role/traitor) - for(var/datum/mind/tra in traitors.current_antagonists) - if(tra.current) - // TODO: Update to new antagonist system. - var/I = image('icons/mob/mob.dmi', loc = tra.current, icon_state = "traitor") - src.client.images += I - src.disconnect_from_ai() - if(src.mind) - traitors.add_antagonist_mind(mind) - if (src.cells) if (src.cell) var/chargeNum = clamp(CEILING(cell.percent()/25), 0, 4) //0-100 maps to 0-4, but give it a paranoid clamp just in case. diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm index 34c96aa98c6..ad974013881 100644 --- a/code/modules/mob/living/silicon/silicon.dm +++ b/code/modules/mob/living/silicon/silicon.dm @@ -337,9 +337,8 @@ to_chat(src, "[A.alarm_name()]! ([(cameratext)? cameratext : "No Camera"])") -/mob/living/silicon/proc/is_traitor() - var/decl/special_role/traitors = GET_DECL(/decl/special_role/traitor) - return mind && (mind in traitors.current_antagonists) +/mob/living/silicon/proc/is_malfunctioning() + return FALSE /mob/living/silicon/reset_view() ..() diff --git a/code/modules/nano/modules/law_manager.dm b/code/modules/nano/modules/law_manager.dm index f336559475f..fe0a427807a 100644 --- a/code/modules/nano/modules/law_manager.dm +++ b/code/modules/nano/modules/law_manager.dm @@ -53,17 +53,17 @@ return 1 if(href_list["add_ion_law"]) - if(ion_law && is_traitor(usr)) + if(ion_law && is_jailbroken(usr)) owner.add_ion_law(ion_law) return 1 if(href_list["add_inherent_law"]) - if(inherent_law && is_traitor(usr)) + if(inherent_law && is_jailbroken(usr)) owner.add_inherent_law(inherent_law) return 1 if(href_list["add_supplied_law"]) - if(supplied_law && supplied_law_position >= 1 && MIN_SUPPLIED_LAW_NUMBER <= MAX_SUPPLIED_LAW_NUMBER && is_traitor(usr)) + if(supplied_law && supplied_law_position >= 1 && MIN_SUPPLIED_LAW_NUMBER <= MAX_SUPPLIED_LAW_NUMBER && is_jailbroken(usr)) owner.add_supplied_law(supplied_law_position, supplied_law) return 1 @@ -98,19 +98,19 @@ return 1 if(href_list["edit_law"]) - if(is_traitor(usr)) + if(is_jailbroken(usr)) var/datum/ai_law/AL = locate(href_list["edit_law"]) in owner.laws.all_laws() if(AL) var/new_law = sanitize(input(usr, "Enter new law. Leaving the field blank will cancel the edit.", "Edit Law", AL.law)) - if(new_law && new_law != AL.law && is_traitor(usr) && can_still_topic()) + if(new_law && new_law != AL.law && is_jailbroken(usr) && can_still_topic()) log_and_message_admins("has changed a law of [owner] from '[AL.law]' to '[new_law]'") AL.law = new_law return 1 if(href_list["delete_law"]) - if(is_traitor(usr)) + if(is_jailbroken(usr)) var/datum/ai_law/AL = locate(href_list["delete_law"]) in owner.laws.all_laws() - if(AL && is_traitor(usr)) + if(AL && is_jailbroken(usr)) owner.delete_law(AL) return 1 @@ -125,7 +125,7 @@ return 1 if(href_list["transfer_laws"]) - if(is_traitor(usr)) + if(is_jailbroken(usr)) var/datum/ai_laws/ALs = locate(href_list["transfer_laws"]) in (is_admin(usr) ? admin_laws : player_laws) if(ALs) log_and_message_admins("has transfered the [ALs.name] laws to [owner].") @@ -164,7 +164,7 @@ package_laws(data, "supplied_laws", owner.laws.supplied_laws) data["isAI"] = isAI(owner) - data["isMalf"] = is_traitor(user) + data["isMalf"] = is_jailbroken(user) data["isSlaved"] = owner.is_slaved() data["isAdmin"] = is_admin(user) data["view"] = current_view @@ -178,7 +178,7 @@ ui = SSnano.try_update_ui(user, src, ui_key, ui, data, force_open) if (!ui) - ui = new(user, src, ui_key, "law_manager.tmpl", sanitize("[src] - [owner]"), 800, is_traitor(user) ? 600 : 400, state = state) + ui = new(user, src, ui_key, "law_manager.tmpl", sanitize("[src] - [owner]"), 800, is_jailbroken(user) ? 600 : 400, state = state) ui.set_initial_data(data) ui.open() ui.set_auto_update(1) @@ -202,8 +202,8 @@ return law_sets -/datum/nano_module/law_manager/proc/is_traitor(var/mob/user) - return (is_admin(user) && !owner.is_slaved()) || owner.is_traitor() +/datum/nano_module/law_manager/proc/is_jailbroken(var/mob/user) + return (is_admin(user) && !owner.is_slaved()) || owner.is_malfunctioning() /mob/living/silicon/proc/is_slaved() return 0 diff --git a/code/modules/pronouns/_pronouns.dm b/code/modules/pronouns/_pronouns.dm index b9ecd77fbbb..83f899499b0 100644 --- a/code/modules/pronouns/_pronouns.dm +++ b/code/modules/pronouns/_pronouns.dm @@ -2,6 +2,7 @@ var/name = PLURAL var/bureaucratic_term = "other" var/informal_term = "hoopy frood" + var/honorific = "Mx." var/pronoun_string var/He = "They" diff --git a/code/modules/pronouns/pronouns_female.dm b/code/modules/pronouns/pronouns_female.dm index 7e993265477..41a90f3caba 100644 --- a/code/modules/pronouns/pronouns_female.dm +++ b/code/modules/pronouns/pronouns_female.dm @@ -2,6 +2,7 @@ name = FEMALE bureaucratic_term = "female" informal_term = "lady" + honorific = "Ms." He = "She" he = "she" diff --git a/code/modules/pronouns/pronouns_male.dm b/code/modules/pronouns/pronouns_male.dm index 67fa9c7d190..47ea51748d0 100644 --- a/code/modules/pronouns/pronouns_male.dm +++ b/code/modules/pronouns/pronouns_male.dm @@ -2,6 +2,7 @@ name = MALE bureaucratic_term = "male" informal_term = "guy" + honorific = "Mr." He = "He" he = "he" diff --git a/code/modules/xenoarcheaology/datums/artifact_find.dm b/code/modules/xenoarcheaology/datums/artifact_find.dm index 744fcf31b48..b70f17112e8 100644 --- a/code/modules/xenoarcheaology/datums/artifact_find.dm +++ b/code/modules/xenoarcheaology/datums/artifact_find.dm @@ -3,7 +3,6 @@ var/artifact_find_type var/static/potential_finds = list( /obj/machinery/power/supermatter = 5, - /obj/machinery/syndicate_beacon = 5, /obj/machinery/power/supermatter/shard = 25, /obj/machinery/auto_cloner = 100, /obj/machinery/giga_drill = 100, @@ -14,4 +13,4 @@ /datum/artifact_find/New() artifact_id = "[pick("kappa","sigma","antaeres","beta","omicron","iota","epsilon","omega","gamma","delta","tau","alpha")]-[random_id(/datum/artifact_find, 100, 999)]" - artifact_find_type = pick(potential_finds) + artifact_find_type = pickweight(potential_finds) diff --git a/maps/exodus/exodus.dm b/maps/exodus/exodus.dm index 7b58953825d..18761c7e2f0 100644 --- a/maps/exodus/exodus.dm +++ b/maps/exodus/exodus.dm @@ -6,6 +6,7 @@ #include "../../mods/gamemodes/meteor/_meteor.dme" #include "../../mods/gamemodes/ninja/_ninja.dme" #include "../../mods/gamemodes/revolution/_revolution.dme" + #include "../../mods/gamemodes/traitor/_traitor.dme" #include "../../mods/gamemodes/mixed/_mixed.dme" #include "../../mods/content/mundane.dm" diff --git a/maps/ministation/ministation.dm b/maps/ministation/ministation.dm index 5c1503f3ae6..12093e9e43f 100644 --- a/maps/ministation/ministation.dm +++ b/maps/ministation/ministation.dm @@ -19,6 +19,7 @@ Twice... #include "../../mods/gamemodes/heist/_heist.dme" #include "../../mods/gamemodes/ninja/_ninja.dme" #include "../../mods/gamemodes/revolution/_revolution.dme" + #include "../../mods/gamemodes/traitor/_traitor.dme" #include "../../mods/gamemodes/mixed/_mixed.dme" #include "../random_ruins/exoplanet_ruins/playablecolony/playablecolony.dm" diff --git a/maps/modpack_testing/modpack_testing.dm b/maps/modpack_testing/modpack_testing.dm index 21bbecf096f..16faf6f5e02 100644 --- a/maps/modpack_testing/modpack_testing.dm +++ b/maps/modpack_testing/modpack_testing.dm @@ -9,6 +9,7 @@ #include "../../mods/gamemodes/meteor/_meteor.dme" #include "../../mods/gamemodes/ninja/_ninja.dme" #include "../../mods/gamemodes/revolution/_revolution.dme" + #include "../../mods/gamemodes/traitor/_traitor.dme" #include "../../mods/gamemodes/mixed/_mixed.dme" #include "../../mods/content/mundane.dm" diff --git a/maps/tradeship/tradeship.dm b/maps/tradeship/tradeship.dm index 9b152b435f6..beb8c3fafc6 100644 --- a/maps/tradeship/tradeship.dm +++ b/maps/tradeship/tradeship.dm @@ -8,6 +8,7 @@ #include "../../mods/gamemodes/heist/_heist.dme" #include "../../mods/gamemodes/ninja/_ninja.dme" #include "../../mods/gamemodes/revolution/_revolution.dme" + #include "../../mods/gamemodes/traitor/_traitor.dme" #include "../../mods/gamemodes/mixed/_mixed.dme" #include "../random_ruins/exoplanet_ruins/playablecolony/playablecolony.dm" diff --git a/mods/gamemodes/traitor/_traitor.dm b/mods/gamemodes/traitor/_traitor.dm new file mode 100644 index 00000000000..44b3e9744d3 --- /dev/null +++ b/mods/gamemodes/traitor/_traitor.dm @@ -0,0 +1,2 @@ +/decl/modpack/traitor + name = "Traitor Gamemode" \ No newline at end of file diff --git a/mods/gamemodes/traitor/_traitor.dme b/mods/gamemodes/traitor/_traitor.dme new file mode 100644 index 00000000000..88d2f0a23a6 --- /dev/null +++ b/mods/gamemodes/traitor/_traitor.dme @@ -0,0 +1,10 @@ +#ifndef GAMEMODE_PACK_TRAITOR +#define GAMEMODE_PACK_TRAITOR +// BEGIN_INCLUDE +#include "_traitor.dm" +#include "gamemode.dm" +#include "overrides.dm" +#include "special_role.dm" +#include "syndicatebeacon.dm" +// END_INCLUDE +#endif \ No newline at end of file diff --git a/code/game/gamemodes/traitor/traitor.dm b/mods/gamemodes/traitor/gamemode.dm similarity index 100% rename from code/game/gamemodes/traitor/traitor.dm rename to mods/gamemodes/traitor/gamemode.dm diff --git a/mods/gamemodes/traitor/overrides.dm b/mods/gamemodes/traitor/overrides.dm new file mode 100644 index 00000000000..122c6cf5daa --- /dev/null +++ b/mods/gamemodes/traitor/overrides.dm @@ -0,0 +1,31 @@ +/mob/living/silicon/is_malfunctioning() + var/decl/special_role/traitors = GET_DECL(/decl/special_role/traitor) + return mind && traitors.is_antagonist(mind) + +/mob/living/silicon/robot/show_master(mob/who) + // TODO: Update to new antagonist system. + if (mind?.assigned_special_role == /decl/special_role/traitor && mind.original == src && connected_ai) + to_chat(who, "Remember, [connected_ai.name] is technically your master, but your objective comes first.") + return + return ..() + +/mob/living/silicon/robot/lawsync() + . = ..() + // TODO: Update to new antagonist system. + if(mind?.assigned_special_role == /decl/special_role/traitor && mind.original == src) + to_chat(src, SPAN_BOLD("Remember, your AI does NOT share or know about your law 0.")) + +/mob/living/silicon/robot/handle_regular_hud_updates() + . = ..() + if(!.) + return + if (syndicate && client) + var/decl/special_role/traitors = GET_DECL(/decl/special_role/traitor) + for(var/datum/mind/tra in traitors.current_antagonists) + if(tra.current) + // TODO: Update to new antagonist system. + var/I = image('icons/mob/mob.dmi', loc = tra.current, icon_state = "traitor") + src.client.images += I + disconnect_from_ai() + if(mind) + traitors.add_antagonist_mind(mind) \ No newline at end of file diff --git a/code/game/antagonist/station/traitor.dm b/mods/gamemodes/traitor/special_role.dm similarity index 88% rename from code/game/antagonist/station/traitor.dm rename to mods/gamemodes/traitor/special_role.dm index 3622249e5f4..98a10d3d23f 100644 --- a/code/game/antagonist/station/traitor.dm +++ b/mods/gamemodes/traitor/special_role.dm @@ -87,16 +87,16 @@ to_chat(player.current, "We have received credible reports that [M.real_name] might be willing to help our cause. If you need assistance, consider contacting them.") player.StoreMemory("Potential Collaborator: [M.real_name]", /decl/memory_options/system) - to_chat(M, "The subversive potential of your faction has been noticed, and you may be contacted for assistance soon...") - to_chat(M, "Code Phrase: [syndicate_code_phrase]") - to_chat(M, "Code Response: [syndicate_code_response]") + to_chat(M, SPAN_WARNING("The subversive potential of your faction has been noticed, and you may be contacted for assistance soon...")) + to_chat(M, "Code Phrase: " + SPAN_DANGER(syndicate_code_phrase)) + to_chat(M, "Code Response: " + SPAN_DANGER(syndicate_code_response)) M.StoreMemory("Code Phrase: [syndicate_code_phrase]", /decl/memory_options/system) M.StoreMemory("Code Response: [syndicate_code_response]", /decl/memory_options/system) to_chat(M, "Listen for the code words, preferably in the order provided, during regular conversations to identify agents in need. Proceed with caution, however, as everyone is a potential foe.") to_chat(player.current, "Your employers provided you with the following information on how to identify possible allies:") - to_chat(player.current, "Code Phrase: [syndicate_code_phrase]") - to_chat(player.current, "Code Response: [syndicate_code_response]") + to_chat(player.current, "Code Phrase: " + SPAN_DANGER(syndicate_code_phrase)) + to_chat(player.current, "Code Response: " + SPAN_DANGER(syndicate_code_response)) player.StoreMemory("Code Phrase: [syndicate_code_phrase]", /decl/memory_options/system) player.StoreMemory("Code Response: [syndicate_code_response]", /decl/memory_options/system) to_chat(player.current, "Use the code words, preferably in the order provided, during regular conversation, to identify other agents. Proceed with caution, however, as everyone is a potential foe.") @@ -108,8 +108,8 @@ add_law_zero(player) if(isrobot(player)) var/mob/living/silicon/robot/R = player - R.SetLockdown(0) - R.emagged = 1 // Provides a traitor robot with its module's emag item + R.SetLockdown(FALSE) + R.emagged = TRUE // Provides a traitor robot with its module's emag item R.verbs |= /mob/living/silicon/robot/proc/ResetSecurityCodes . = TRUE else if(.) diff --git a/mods/gamemodes/traitor/syndicatebeacon.dm b/mods/gamemodes/traitor/syndicatebeacon.dm new file mode 100644 index 00000000000..498555b73a7 --- /dev/null +++ b/mods/gamemodes/traitor/syndicatebeacon.dm @@ -0,0 +1,80 @@ +// Beacon randomly spawns in space +// When a non-traitor (no special role in /mind) uses it, he is given the choice to become a traitor +// If he accepts there is a random chance he will be accepted, or rejected resulting in the beacon self-destructing. + +/obj/machinery/syndicate_beacon + name = "ominous beacon" + desc = "This looks suspicious..." + icon = 'icons/obj/items/syndibeacon.dmi' + icon_state = "syndbeacon" + + anchored = TRUE + density = TRUE + + var/temptext = "" + var/selfdestructing = 0 + var/charges = 1 + +/obj/machinery/syndicate_beacon/interface_interact(var/mob/user) + interact(user) + return TRUE + +/obj/machinery/syndicate_beacon/interact(var/mob/user) + user.set_machine(src) + var/dat = "Scanning [pick("retina pattern", "voice print", "fingerprints", "dna sequence")]...
    Identity confirmed,
    " + if(ishuman(user) || isAI(user)) + var/decl/special_role/traitors = GET_DECL(/decl/special_role/traitor) + if(traitors.is_antagonist(user)) + dat += "Operative record found. Greetings, Agent [user.name].
    " + else if(charges < 1) + dat += "Connection severed.
    " + else + var/decl/pronouns/pronouns = user.get_pronouns() + dat += "Identity not found in operative database. What can the Syndicate do for you today, [pronouns.honorific] [user.name]?
    " + if(!selfdestructing) + dat += "

    \"[pick("I want to switch teams.", "I want to work for you.", "Let me join you.", "I can be of use to you.", "You want me working for you, and here's why...", "Give me an objective.", "How's the 401k over at the Syndicate?")]\"
    " + dat += temptext + show_browser(user, dat, "window=syndbeacon") + onclose(user, "syndbeacon") + +/obj/machinery/syndicate_beacon/Topic(href, href_list) + if(..()) + return + if(href_list["betraitor"]) + if(charges < 1) + src.updateUsrDialog() + return + var/mob/M = locate(href_list["traitormob"]) + if(M.mind.assigned_special_role || jobban_isbanned(M, /decl/special_role/traitor)) + temptext = "We have no need for you at this time. Have a pleasant day.
    " + src.updateUsrDialog() + return + charges -= 1 + if(prob(50)) + temptext = "Double-crosser. You planned to betray us from the start. Allow us to repay the favor in kind." + src.updateUsrDialog() + addtimer(CALLBACK(src, PROC_REF(selfdestruct)), rand(5, 20) SECONDS) + return + if(ishuman(M)) + var/mob/living/human/N = M + to_chat(M, "You have joined the ranks of the Syndicate and become a traitor to the station!") + var/decl/special_role/traitors = GET_DECL(/decl/special_role/traitor) + traitors.add_antagonist(N.mind) + log_and_message_admins("has accepted a traitor objective from a syndicate beacon.", M) + + + src.updateUsrDialog() + return + + +/obj/machinery/syndicate_beacon/proc/selfdestruct() + selfdestructing = 1 + INVOKE_ASYNC(GLOBAL_PROC, GLOBAL_PROC_REF(explosion), src.loc, 1, rand(1, 3), rand(3, 8), 10) + +// Add the syndicate beacon to artifact finds. +/datum/artifact_find/New() + var/static/injected = FALSE + if(!injected) + potential_finds[/obj/machinery/syndicate_beacon] = 5 + injected = TRUE + ..() diff --git a/nebula.dme b/nebula.dme index 2297204fc31..a72d0e99cd3 100644 --- a/nebula.dme +++ b/nebula.dme @@ -735,7 +735,6 @@ #include "code\game\antagonist\station\provocateur.dm" #include "code\game\antagonist\station\renegade.dm" #include "code\game\antagonist\station\thrall.dm" -#include "code\game\antagonist\station\traitor.dm" #include "code\game\area\area_abstract.dm" #include "code\game\area\area_access.dm" #include "code\game\area\area_fishing.dm" @@ -771,7 +770,6 @@ #include "code\game\gamemodes\objectives\objective_protect.dm" #include "code\game\gamemodes\objectives\objective_rev.dm" #include "code\game\gamemodes\objectives\objective_steal.dm" -#include "code\game\gamemodes\traitor\traitor.dm" #include "code\game\gamemodes\wizard\wizard.dm" #include "code\game\gamemodes\wizard\wizard_props.dm" #include "code\game\gamemodes\wizard\servant_items\caretaker.dm" @@ -830,6 +828,7 @@ #include "code\game\machinery\seed_extractor.dm" #include "code\game\machinery\self_destruct.dm" #include "code\game\machinery\self_destruct_storage.dm" +#include "code\game\machinery\singularitybeacon.dm" #include "code\game\machinery\Sleeper.dm" #include "code\game\machinery\slide_projector.dm" #include "code\game\machinery\spaceheater.dm" @@ -840,7 +839,6 @@ #include "code\game\machinery\suit_cycler_units.dm" #include "code\game\machinery\supply_display.dm" #include "code\game\machinery\supplybeacon.dm" -#include "code\game\machinery\syndicatebeacon.dm" #include "code\game\machinery\teleporter.dm" #include "code\game\machinery\turret_control.dm" #include "code\game\machinery\vending_deconstruction.dm" From ae8369a4fb0b268cceea74d67d9d030ae2e97e3e Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Thu, 20 Jun 2024 05:53:12 -0400 Subject: [PATCH 87/90] Move spy v. spy gamemode and renegade antagonist into a modpack --- maps/exodus/exodus.dm | 1 + maps/ministation/ministation.dm | 1 + maps/modpack_testing/modpack_testing.dm | 1 + maps/tradeship/tradeship.dm | 1 + mods/gamemodes/spyvspy/_spyvspy.dm | 2 ++ mods/gamemodes/spyvspy/_spyvspy.dme | 9 +++++++++ .../spyvspy.dm => mods/gamemodes/spyvspy/gamemode.dm | 0 .../gamemodes/spyvspy/special_role.dm | 0 nebula.dme | 2 -- 9 files changed, 15 insertions(+), 2 deletions(-) create mode 100644 mods/gamemodes/spyvspy/_spyvspy.dm create mode 100644 mods/gamemodes/spyvspy/_spyvspy.dme rename code/game/gamemodes/mixed/spyvspy.dm => mods/gamemodes/spyvspy/gamemode.dm (100%) rename code/game/antagonist/station/renegade.dm => mods/gamemodes/spyvspy/special_role.dm (100%) diff --git a/maps/exodus/exodus.dm b/maps/exodus/exodus.dm index 18761c7e2f0..6c13c0ddb9c 100644 --- a/maps/exodus/exodus.dm +++ b/maps/exodus/exodus.dm @@ -7,6 +7,7 @@ #include "../../mods/gamemodes/ninja/_ninja.dme" #include "../../mods/gamemodes/revolution/_revolution.dme" #include "../../mods/gamemodes/traitor/_traitor.dme" + #include "../../mods/gamemodes/spyvspy/_spyvspy.dme" #include "../../mods/gamemodes/mixed/_mixed.dme" #include "../../mods/content/mundane.dm" diff --git a/maps/ministation/ministation.dm b/maps/ministation/ministation.dm index 12093e9e43f..cd027156fa9 100644 --- a/maps/ministation/ministation.dm +++ b/maps/ministation/ministation.dm @@ -20,6 +20,7 @@ Twice... #include "../../mods/gamemodes/ninja/_ninja.dme" #include "../../mods/gamemodes/revolution/_revolution.dme" #include "../../mods/gamemodes/traitor/_traitor.dme" + #include "../../mods/gamemodes/spyvspy/_spyvspy.dme" #include "../../mods/gamemodes/mixed/_mixed.dme" #include "../random_ruins/exoplanet_ruins/playablecolony/playablecolony.dm" diff --git a/maps/modpack_testing/modpack_testing.dm b/maps/modpack_testing/modpack_testing.dm index 16faf6f5e02..0e75223cde4 100644 --- a/maps/modpack_testing/modpack_testing.dm +++ b/maps/modpack_testing/modpack_testing.dm @@ -10,6 +10,7 @@ #include "../../mods/gamemodes/ninja/_ninja.dme" #include "../../mods/gamemodes/revolution/_revolution.dme" #include "../../mods/gamemodes/traitor/_traitor.dme" + #include "../../mods/gamemodes/spyvspy/_spyvspy.dme" #include "../../mods/gamemodes/mixed/_mixed.dme" #include "../../mods/content/mundane.dm" diff --git a/maps/tradeship/tradeship.dm b/maps/tradeship/tradeship.dm index beb8c3fafc6..7dd27ebd071 100644 --- a/maps/tradeship/tradeship.dm +++ b/maps/tradeship/tradeship.dm @@ -9,6 +9,7 @@ #include "../../mods/gamemodes/ninja/_ninja.dme" #include "../../mods/gamemodes/revolution/_revolution.dme" #include "../../mods/gamemodes/traitor/_traitor.dme" + #include "../../mods/gamemodes/spyvspy/_spyvspy.dme" #include "../../mods/gamemodes/mixed/_mixed.dme" #include "../random_ruins/exoplanet_ruins/playablecolony/playablecolony.dm" diff --git a/mods/gamemodes/spyvspy/_spyvspy.dm b/mods/gamemodes/spyvspy/_spyvspy.dm new file mode 100644 index 00000000000..967d6828878 --- /dev/null +++ b/mods/gamemodes/spyvspy/_spyvspy.dm @@ -0,0 +1,2 @@ +/decl/modpack/spyvspy + name = "Spy v. Spy Gamemode" \ No newline at end of file diff --git a/mods/gamemodes/spyvspy/_spyvspy.dme b/mods/gamemodes/spyvspy/_spyvspy.dme new file mode 100644 index 00000000000..0150ef2deea --- /dev/null +++ b/mods/gamemodes/spyvspy/_spyvspy.dme @@ -0,0 +1,9 @@ +#ifndef GAMEMODE_PACK_SPYVSPY +#define GAMEMODE_PACK_SPYVSPY +#include "..\traitor\_traitor.dme" +// BEGIN_INCLUDE +#include "_spyvspy.dm" +#include "gamemode.dm" +#include "special_role.dm" +// END_INCLUDE +#endif \ No newline at end of file diff --git a/code/game/gamemodes/mixed/spyvspy.dm b/mods/gamemodes/spyvspy/gamemode.dm similarity index 100% rename from code/game/gamemodes/mixed/spyvspy.dm rename to mods/gamemodes/spyvspy/gamemode.dm diff --git a/code/game/antagonist/station/renegade.dm b/mods/gamemodes/spyvspy/special_role.dm similarity index 100% rename from code/game/antagonist/station/renegade.dm rename to mods/gamemodes/spyvspy/special_role.dm diff --git a/nebula.dme b/nebula.dme index a72d0e99cd3..1367e75e60e 100644 --- a/nebula.dme +++ b/nebula.dme @@ -733,7 +733,6 @@ #include "code\game\antagonist\outsider\mercenary.dm" #include "code\game\antagonist\outsider\wizard.dm" #include "code\game\antagonist\station\provocateur.dm" -#include "code\game\antagonist\station\renegade.dm" #include "code\game\antagonist\station\thrall.dm" #include "code\game\area\area_abstract.dm" #include "code\game\area\area_access.dm" @@ -752,7 +751,6 @@ #include "code\game\gamemodes\endgame\supermatter_cascade\universe.dm" #include "code\game\gamemodes\events\power_failure.dm" #include "code\game\gamemodes\extended\extended.dm" -#include "code\game\gamemodes\mixed\spyvspy.dm" #include "code\game\gamemodes\nuclear\nuclear.dm" #include "code\game\gamemodes\nuclear\pinpointer.dm" #include "code\game\gamemodes\objectives\_objective.dm" From db65720c3497558c746aae89aa7ecf57219678fe Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Fri, 21 Jun 2024 16:02:55 +1000 Subject: [PATCH 88/90] Adding skeletons to fantasy species and tajara. --- .../human_races/species/human/skeleton.dmi | Bin 1019 -> 1014 bytes mods/content/fantasy/datum/hnoll/bodytypes.dm | 1 + .../fantasy/datum/kobaloi/bodytypes.dm | 1 + mods/content/fantasy/icons/hnoll/skeleton.dmi | Bin 0 -> 1576 bytes .../fantasy/icons/kobaloi/skeleton.dmi | Bin 0 -> 1392 bytes .../tajaran/datum/species_bodytypes.dm | 1 + .../bayliens/tajaran/icons/skeleton.dmi | Bin 0 -> 1575 bytes mods/species/drakes/icons/skeleton.dmi | Bin 0 -> 4209 bytes mods/species/drakes/species_bodytypes.dm | 1 + .../neoavians/datum/species_bodytypes.dm | 1 + mods/species/neoavians/icons/skeleton.dmi | Bin 0 -> 1242 bytes 11 files changed, 5 insertions(+) create mode 100644 mods/content/fantasy/icons/hnoll/skeleton.dmi create mode 100644 mods/content/fantasy/icons/kobaloi/skeleton.dmi create mode 100644 mods/species/bayliens/tajaran/icons/skeleton.dmi create mode 100644 mods/species/drakes/icons/skeleton.dmi create mode 100644 mods/species/neoavians/icons/skeleton.dmi diff --git a/icons/mob/human_races/species/human/skeleton.dmi b/icons/mob/human_races/species/human/skeleton.dmi index 271b174b81283114e9f730201430c8444d2eb936..5dffe35ad8793731c551cfbc963be888346da53a 100644 GIT binary patch delta 811 zcmV+`1JwNc2lfY$Bpww|OjJd{z`(t_lF!en=H|wxqjg$YHNe2Yp%Pg1kwv(F=Sf6C zRCt{2oNbbuFbsx+%>jVT0gOri2YU~|usOkYa{sHe)9Gw1S$r+VlQ!@3D>6ba4v>}n zv8NLN0Q{%aLR(Qy88V@Z6fZ=H;hOL>_qfjaOY!tnX!$Y>3sKDai}At;MidO1mE*x@ z{l$1eW1%I7lYVqVaSy47U;c7`yr73sxW54&-6;4ylY02&FUK>%+2R*Onhg^a@1f!! z2+Pko00000001w*iV85XV4GV|E-((HGnoainFV$3dP--%hv0C`q_Oqnl_7>nV+Df$ zQiuzAOU{NJ=Fc>Hry_qAPokPMB*9@;f1-(ECXE$>k^hQ&m|L(QV^2MQKdjj|!~`RM z7VjAZOXBdpQ84mn@gzYLTG5#Dg5V{Jmpz3600000pcI|htb=in*3dKTg8zb`6Em(p z$ORkfp`?j?7w3)>sBVy&yI}UbG31b#qJ2o+mWh+TKi6Tz=1FMcnIArHZH^W!A$YLh zVs!<<=Mw|~0000;i(LPISy}-pdFAr=1bZoCstqyMmy^q=HzTyN8c(I1=U-nb0sufx z)cE*)D(x5@?#P~yj_(iw00000ctX6^q{eI%+nU=aUW4Tvoz%4N&Jc$-@iKDFHmd59 zZCtHW*Pz$yyj>?8B3Q@L_HF=P9TnGizw1A`K7rSJ=FlqwFGy*BFSB-XM(>6>J2~Cw zPeW|)jqI6-@nQ#JTWTjq-9L$4Hs?e2;)mvTTR4O7r{K$NqHS4b+xZ;db|eepY2c}5 zNs``~vs7#=TV1kgjE1Fw*PVH%?`RKO*Bjzcv*{z3xQA8AcJ(aX!>#apXdU|l$S26$ z&f1|mSJj+-iUwSNeBr$Wn@VOWS_)?bVlMlhma z(5xH}KI<>W3mOY8Ih^#P8;W~KJ^X+2m*WLJjKcj1@aRUt@0rxYFMm0n3C@a_(**g{avv?BKq#+3ov-%TF6fiJ>K zz9A+U`LlS>AXpNI_l<&)KZ_>`n$U{IlotdqQM~La3;+NC005=v#AY3gd$fk0VHf-t z1f7_1^+7J!P!AHEA6BQ{S$6VLqcd24gD zU1@!(czBl3F-I_5dZ)H0DvdNYfWm*MzO8Aed0A(&e2It`|b>JXcI3Z z*KDJzF4@M_I&}?tz0TWp!XbinEN$-w;MGxaefPWmqw5oRy=M-+BJh8Ll=d=fCuj6- zn6s19ef%)Q_TI>zi5M?-AhxA;a@75U*kyA*R4;yLZnuRq_$vrd;cS9(trM(>9S*EA^ae}?wAqwBfCI@-g|CLW~b+%EUf uypK!e)n3Yi_OKcb76bqQ0002b%rA^BG3pd??}z{Z002ovPDBK*LSTYRy^4td diff --git a/mods/content/fantasy/datum/hnoll/bodytypes.dm b/mods/content/fantasy/datum/hnoll/bodytypes.dm index ef9c8a3eaae..1afcab6224b 100644 --- a/mods/content/fantasy/datum/hnoll/bodytypes.dm +++ b/mods/content/fantasy/datum/hnoll/bodytypes.dm @@ -8,6 +8,7 @@ bandages_icon = 'icons/mob/bandage.dmi' eye_icon = 'mods/content/fantasy/icons/hnoll/eyes.dmi' cosmetics_icon = 'mods/content/fantasy/icons/hnoll/cosmetics.dmi' + skeletal_icon = 'mods/content/fantasy/icons/hnoll/skeleton.dmi' health_hud_intensity = 1.75 bodytype_flag = BODY_FLAG_HNOLL appearance_flags = HAS_UNDERWEAR | HAS_SKIN_COLOR | HAS_EYE_COLOR diff --git a/mods/content/fantasy/datum/kobaloi/bodytypes.dm b/mods/content/fantasy/datum/kobaloi/bodytypes.dm index 18f4c5d35ef..4c6e14631b8 100644 --- a/mods/content/fantasy/datum/kobaloi/bodytypes.dm +++ b/mods/content/fantasy/datum/kobaloi/bodytypes.dm @@ -6,6 +6,7 @@ icon_base = 'mods/content/fantasy/icons/kobaloi/body.dmi' icon_deformed = 'mods/content/fantasy/icons/kobaloi/body.dmi' eye_icon = 'mods/content/fantasy/icons/kobaloi/eyes.dmi' + skeletal_icon = 'mods/content/fantasy/icons/kobaloi/skeleton.dmi' base_color = "#8f974a" base_eye_color = "#d95763" bodytype_flag = BODY_FLAG_KOBALOI diff --git a/mods/content/fantasy/icons/hnoll/skeleton.dmi b/mods/content/fantasy/icons/hnoll/skeleton.dmi new file mode 100644 index 0000000000000000000000000000000000000000..5dab29a2a5fd313425a6739a84d7b66df51285d8 GIT binary patch literal 1576 zcmV+@2G{wCP)0000OP)t-sz`($! zqjk^EspjU!T3I!^xt_hclEA>gmUgHC00001bW%=J06^y0W&i*Hta?;fbVOxyV{&P5 zbZKvH004NLjnX>`!!Qg6;MqEbN%qp$(4|XBC>fe71XC-qz_EjDlIu6_(y7>+1fPC^ zP%R(rv+HH^>R?3<){AuBOT4&T+Sd2(qv+4ZV;l1xR;edr7IAcIHVa6BdZxx zefpt^J-MuU8w@e4>|k-qDlSrX7`@N0K3f{K;%lm@Ny7ifk4wj4R>x&(*T+ zo9~N!0P4q_8tOQwRR91521!IgRCt{2oxyJ7HV}p>3gFpM(VWK;ptDS&x_7(nx!vyG zX{FHnKSFJF<8X$w6~rTZll~uIAVbRLcp}Ntui?-b005XN>g`3_RQ2X!|Fu-T-(0eb zo{w17J?p=k=F@M)?7nBV{pIstvHkPszghp)R1FWYv|atJi5d$3tq!UV*souhU5tCa z!Nc}zG@|>xdQctT6rX3dWtB^w`4U_FM=}j}ht3)| zVsqBG4cib~dlKF9Fb+nYaMs84+Qu2oD2#ZZpI#qTc^Kqi-qdSm@N zpW}({cke)=Y6;bAbqCT}LoVFZf$Oo=%Oi}Uu9EJCJ@jdkM?e4o0002sI&yhk?4nX$ zVJef)EsXQuWVWEuy{65l_Qh_Ia6maDm6n>Vya-M*!>+=W+2$xc&B`rwBanRjcL!d+ zrj!43-3ZwH$HmPg99TOm82|vlyThicma!F=?xe~^t9k?g00000-a;&dy<#@x3cA^g zRFzZB5|KuE&L|r;tC|IFI$f1!hLS(Bz29lFTV2CR70at;LD-$X1J6Ott7c-nQh&PH zNfpbhW@5ZZ#7pLrK5r83r!BEAr#s!z`K)w2M2RIM-@@und$vtBZL5inCNTw7`z(^L zJ8LQ13;+NC000000002i&*GnzW!h$h zGG@60ONG^5Lvb4R4Kn0{0~sCgEiPU_s7*!V5xU@m8af#~vAFO)+6w1RZwhLyj9RVAT)%)XIuw(6d zHe+()we3qkY2KcXbM^i>7wlNQpUs#Yc^;56t>$Gt{a3x8UhKJg|H(GiJD&PweNfB= zbLCvUKh6a^)~;tWCasJBDdvLNa<1MV=Yk!p_p=$3gN(qFVlJ4q^EZxj!I*u3yo^Aj zxDU9-^iNF}t7PL?2bN3LHu2A&tG(tLkR0ZmP_W_SS7R5*eD)`w%IgA zNwG?Hv{^1$TgNJy3-zdZ9@v`AuGtyzhG1(7itQ;@=eLx1Ku_g5&bX9y#l(!uq^=k# ajr}hqRhMHwHphJc0000%0000LP)t-sz`(%0 zx{}Y&spjU!rlWOQSvA1Gz@ZXY^Z)<=0d!JMQvg8b*k%9#0H%6WSad{Xb7OL8aCB*J zZU6vyoQ={u3d1lA2H@E~g-Q0(*V?5dlnl)kil`M^;KW51$@QDGL#JYI`r*@KP;IX5 zt?Ny5@AQnEC{E^L&bz%<3t91NI32a}NY2YQBmu#-toQ*uR$5u&v^8lpFpRj>ho1_C zDxk|ME>s>STd=Z_4KYf=(jw+K(v($Ck10RPBjnE)ppZo`#+h*W=W5gT&F4kl7+#zd z${aE6000D6Nkl+j65w42Ju(_Z<8H4S4Qx{bPJ&r00000zW>?^}0|6V1RDiBDtz0000000000{C$`e_2|}r;z79;^?{`$9J*iI zI<~~I&6k5n=E9^N78WO_4t(XpUiedr>vG{-4=nJS_M2Z7w~RDL_2 zn|<6LzkM^*N7+Q|ZAk(s_e2ME4QldP6b41hWN!Cj#z$6bzA$xV6aWAK000000002^8*u&Y^W>N7`NLt{ zV2b!V_Du3EV*ZEQsF9f00000>_V0iFY0{#y8T|d zs$my7Aq0NWqxp2MtrAZgW|lwMojciL!L!Hb+j}|$JVMv-3{-(m{LTRsY<@aCI|G@M z&${z?o_-9};Wm~1iOfLa0J1}tt!aKyua+0)owaO9VZ>2#5*gLJL_k}fQ*A_!t;~Q3 zK%O@BS){NMIV(gF#iE*DXgQ-VwG~}1tm9hcHP>~lhG7qFyRLKbjjPlFY?7}^00000 z?8Z&gs#a?1`TE2GjG^n-v~nFCe0GCay%!f6R#)mm7kHiNP)}sRIMsY8dN1aEe0ik- zG+oE{;F|a0EA7+qJ@iQfaLq6tnQj{K6^C;({@STKhcRseuHWhHt!KNd>z-Q-^}j!U z2k`n|;$J|ie_mdgc1O7fH@v?6{`~SoOot?ZpJhuupLu=cBlzFK+vi0`BmStv-rew9 z%jhJTjV(+DGN4z~FP>Z9F9s<3O^dzA??P=Bw%ZZ1^@s609#;u0OJD~AJ`lp z&<8#~a7lYntIKI*?;j|pK|H5ioay+$C?_&^Qe{@Fa5EJ?+SOnO{%Klw~NUcgC^)0nRzrf8dfIX+s8m8gkK}ZzpTv!u`@^DD|r?7I`ujy+JL;y*5|IuGi_9vA61)m#0zwA#a`wKobfT92V|D9HI y2|rcjZ$t{_=L6*P1&ikcI0000OP)t-sz`($! zqjk^EspjU!T3I!^xt_hclEA>gmUgHC00001bW%=J06^y0W&i*Hta?;fbVOxyV{&P5 zbZKvH004NLjnX>`!!Qg6;MqEbN%qp$(4|XBC>fe71XC-qz_EjDlIu6_(y7>+1fPC^ zP%R(rv+HH^>R?3<){AuBOT4&T+Sd2(qv+4ZV;l1xR;edr7IAcIHVa6BdZxx zefpt^J-MuU8w@e4>|k-qDlSrX7`@N0K3f{K;%lm@Ny7ifk4wj4R>x&(*T+ zo9~N!0P4q_8tOQwRR9151xZ9fRCt{2oxyJ7HV}p>3gFpM(VWK;ptDS2b?g|YK!%jf@kElPU&Em>001yk)cc#Zsp{R${joYo*$%^|w;|TnF)ZGP)`T7^P@8kf*-OX+Q003`IUzS~L zkJbjZ!N5)99&{b>-ZKa4gD18@+wwPzqpky`ExBEA+e|gL>q*xE({;D)Nqpm0+kr)< zn$uIs)a;^YLn-Xlx#VVj%)vzN3*1D|sMpkHQ{g1e8@SdFD%O@gK=Fyg78$ zcqMjMjn`oxV(UnvTOP*2s1vRlIR`cf5nVO@Ck{CFTQbP*GJJRk3g*D!4IH4@N-kHn zcK`qY000000Kj{Pp4GG=nVZ$uy?;HDY~iX``cNr(!#cuZlax-C9msr~X!__5B%+cK zozmxcqWj%Dkf>Th_1fHlbk>jyuj;^hZ1waAqo}K-yI~J~n&c4>0000009Z#ZuZvw& z$}3D|^0|d^{+rAeG`iQc`P9DHEfNkWXQa|nvy~UYNoLq8T$yc-($lQmLN@}*$NzNT z>1#UqKi7?b&3|0nOu~V!vyuS-0K7YFs%jZqap_K~T(qf2000000N^FWLfA8ALvEm( zJxNtL)hrQdl;@1HVY8}P;HJ}6X=W(-Bis9vCcD)dE~;2wH4DP-^c{E%YF;%H?jM1+%w~fDPyB{c$eXxpqC9 zF*)(t_NAXRZ_mfMdVib?cCOyfW=xJe56GET^Rk})tKLsf_FTRHVjJrnPyMn!DCUB> za<1MV=YpMU*RvUuRz`pnbHQvmSMQH=!OqqD*^J3SM&Lm)7tGrE8^^g|%sxS0MxasL z2V7(Nho*~FvT>{f%Oz`@_~*~nUUQ8|=R1Emy&{$DyhbIdel4*?9J}b?FxFd>)DQT$#&@)mAVqku@=?$g}svrd=u$9AlEIC zHd!hBk*>gTI_(j&iOVXx)B)WHkVtZ+jyYgW>VU4wH5ki&?L4n~bvjjwi`4s0SK=9x z>if*5oCB&m!QphNAFEskR+p?aIR{ijur~$8_7to0d&)bYr*fTVT*|s)V#Z}sSB#X# Z{sALcmtnzAvk3qI002ovPDHLkV1m)U1+V}B literal 0 HcmV?d00001 diff --git a/mods/species/drakes/icons/skeleton.dmi b/mods/species/drakes/icons/skeleton.dmi new file mode 100644 index 0000000000000000000000000000000000000000..437a72a4b65afe2021c4c47ecbbc4498dea4477e GIT binary patch literal 4209 zcmY*a2RIvE_l}mLHEYwDu}ig9ZEDx3t!lMKQJdH!szwnjsLk(ZZ&j4qtr06!ZAD7# z7!4vu$mje1-{}87&%Ni|_nzlG?|tt$aR&ODl($)L0{{R@Z7nq;0N{r5b>}3$d5sh* zkJw%tHUnJ~^`4%dvSPo^HrU3-!1#D&+n0hD7LwQC>FKGA2))F07!lY=-x#30G57k~ zCkZxr4pwvYwfAxH0=sy6004n`8Ph6ndc|l+zBl{bPTke{8MWIcNY0zEar?;>ovU)g zh!*Jhq@h$fV4^Uec${a2pyGNFbShi0dv)Pl2Z}472%p;FTTz z;-U*6sF715fO%_KhuJeS4&HFbHM^QIo& zJP@9Iv_V>{WG^@$;tDW?Aa`>8N$=VLL_TZNTxm43A4k}mfA^NuH3Wm|xT23+%91-oLyMAbe|cNso#`6|3>GzjL137EC=^1MnR`~Kv@z~-e_4$`&Rl*j z|49&gjLPrYzb-?ur&DsXlRFt*w`!jTQC8_z7d|u19+qx+%JPW)2S%aT&&#MPd`QBo zZ5-QSlct&0)tQfBEJ0((%lFJer*9u?kxtR9tRC!KoNZrLg_oY~L)e>_QZO9d;RTH? zh>Zh+ywb?eQeTD+158O*8`;SuScz!~<=2<^XkUE9xO~YUfNhG+3-ddMMa=U@EVxEK|W`bOH}BoN0aMt}rXYy7N8N?WcaBh-T?Z{8p0} zDO02@v18G|BjKXe-o&`r5tH5gxIrhR;S+USlgQ%3Aq&nypQmiLh$RLcwy!g_BlA#M zvZ3e{0Xn@i1o|jeWFm`*?)D^Wg~mry&1lJtikt-J&qQ)D!hf;qM16BLP=*3N?{Fds zXs81*rm!U4CD>F-9_^E8se`6U$f(H~(Ly@B@Qu+G=s>hg#w3B~Ri-K@!`Wo*PLDD< z*4u*krz(8~%7?8la*e(Q&_MFKfF?95D}FWN>R%Zr5F9>Kl7)6ZJXuZHiu8@0Ny_kK zcSEOMNH9$NXxBl_6rP`QlmAz)jn5_hl?m}B$WQ9*bI86&UHcbUQY-H1^)u;!G=l2>nols7Rs$*^ zP3qF_HFy5Fugc}J#<@jZ1NjyAP{$yNCAZtKV|~flPkSM{g8Dq?8~io^z@{-SQXjP+aONACpScDY4DDI}_8P%SX^ckjw#8w@ zmA(&J)XW9(f`Dq)QKx6^gY&!~>4!)v?r{J@f)h6SNh{2V-ob#z$q*EDuj2g`=xYtc2D1ck2 zH=-uob5)c(D?gTf9hQFUkp2#3WAoY`7ys#skQX1#e#-|?0FC5(Bd@_{vUDC%zd1^7 z>hZF;gp(yDiqnfOH9SzGETYdtj~)6gEgbwx=Dik-dUwG$gR0;_x}n_((QGN^#jHZ% zTDKJWwwKKAx$hn$#XSw0-W=DKm%mnR%v$~}@fLM1Ve%$7p`58DkASl624L58AGDr0 zg~l6d?5X`;Ov+n;w}d~#Kk%k6bj%CBVt$vmP#$|u1c>Pq=UCfkznga)dlH=f8ah6s z3SI!(*#EjZOs$a#?{}g(rBotiXy*=-$I2;i*Q94ugiP)j_tLtumz zi+?#B_aCv$-?Zu|W32Z~beuxxI`A1hqvRPxwOa>Hy=)G)Hbj1ydZW16rC0f;)BTmA?5TIt#`FIO0T{TzODf}?BrnhZ8I#B{bUjuPDF{IBw4>-G0s9v7N;h%U}z z0JkFx32v-O*LNi=6%!UR+;kpverRl3reIaVreTl*Wwlvz@jIW*E}s?-qkNHpS1CjL z8I!uV{9wrl15xf75AoV-#h!p|$I+7WMBA1}B&Q)EQn}sFY%j-;eDB=c`qZy#BJ~rQ z46QlcmzWODlf+{ERXxs8=Dl;ybhAWE;T3UvI$;GYD{>{^Fn>MRfG{6UX0sACLWav; zUtM>qnb5XVzm$8rTX$S4=~wNt-lUodxoNtb3s~BQ`q1Bz$ z3yH1pSG2~3yL#EDODM(7MI`b)(SP0=-I=uJq%ltnH1uQ|owIRM{p9UI5fcu;^SUK|ad+}8k?!X!txTZY%#PzEqA1ttS*OlLu5l84P9EfWknWMhR9YArR#EEx^N#-LQgryoZpbN zB{b$ygF^~uXgedVWpWLfjP_Mo&0n7aB@&HQql&-fh^7H330zTfz2KHY`zPuUvyq!S zz7;KzNSPLZIUGp8c6`-aG+C)mEL_uoHley`kL3S4rM&Ct@s;7fKO%r;+hv9lXB*9% z99CDEto_43tw~0;X!o5kD?{XyWtqpR7Zd3os3F@}?jco$fE%p93nPa8x%l^#Z`Zih z@^2Mot5lF0PbfRporAVHg~-cOOrH3qytGcNzPmK=p4I{M6X``7ck40M%TglXcE%dt zbBpyH2jH6JooN+C-|tueurJl>-C&S4?5IkEvx2~Zw&DZ zfA9kId^sqjYWdxZX}8fbW+8-aeS>hkYj(EBHiRg`EBX0xLY4^YGHh&-aWHr?ZZyz+cf3kW4G6SY>IgBg#E8t0sx9ojpM?-FqE`M zNlo)p83^khTetfwu}@OktLL_hO^QjL9ia+gyCV3N-Ggc!9!M2I0vTq?Z|8 zMU&y)Fbt1Cqqi!5b*3Q=$@=0J=cVgsLE}k}4iQD3imtZ~k;Y16u(c*OKchmnS7!6) z8pme+>lg}&F3jhsneQYuA^y3TtnDRgjGKQ>*{5~|OF6^`!?GE4OB(xeA|V7|b@V9U zmewWXR*W<*7gVVusbS()JLJpv)y`HktWk!1N_ula=R;Q(;r|cyC=2t6t5m7?d^ZjfmK9Y`Zd`Vv|HWv z3}g;m6^FnjDdbnNzs_W@G%y{yOnkFKbt7UH@zKOvDuuVSnNGFYH&bcSKh#{Q8Bs9Zj?d@3M}inK9Rv|wJ>~<+w zlmkiU+dYOta=Z$FPqRAdIGw9wWE0xMBelM;0{=)2k(>sYPE0SmYyB*wWn z8WVQe_nL!k5`Mr^Z@ah!_wtiBae<63)1Hu3hh*u%7^gT zBPhR1H@12`(;%pf-5+uS_5qo|H8xNCw{`4~H>p`4cB4-cNr!LWZTeP~a4JKM|A45z zC#YB6c{&hqoUn3hqG~w)1Z8L@k`+&ln>bz-D1}TPut73GybAA&-WTL-tOoiId{Wgz zD_1VzW%{JLFx2gM9v_PJ(NW<{c=_R3eSBHI8j(V6iYMOs^N136fc+NGihUN`Px=I| z--;u06n&nOWIHX@$LR`y@Ow_n5o4=OViP@v76>@*>GTR3-_z znG+B-aJ{6M*ycJy^X1S!&)ZslMm-0SEEA_RC)p;a8~L}Byl~0hucyPfsZYoKU?zS> zoNQxB=recJ%)wziT|!8{g;5v(pW*-j5jF_9BwzL53S>f^Zn<}z7BvKDJwl0kXUBlWVMLy%?1XgNkv z$}hE^9cAUCO%EL6b<5KTp;OQF7K_cm)E5J;^WXR<$|tWQC+KkZvs{uxQP_|{y%e%P zGq;HDKE7Jl$gCNx-IKWD)$X&F;XLQnzWVtJ-$SU$&l1m(qWBO*2ty%3+T0K1DR!d6 z-|Vv~i7I|+{-O+q#d3MO{7&Q;K9Xz_#~G$wo1B_V7fP>VL&5}I7x&A9Sons eq;4!05N-~=40%CYci{3*0@~{OYIRRuM*ah_dn)4q literal 0 HcmV?d00001 diff --git a/mods/species/drakes/species_bodytypes.dm b/mods/species/drakes/species_bodytypes.dm index a61937f619d..6d0364df0ad 100644 --- a/mods/species/drakes/species_bodytypes.dm +++ b/mods/species/drakes/species_bodytypes.dm @@ -27,6 +27,7 @@ blood_overlays = 'mods/species/drakes/icons/blood.dmi' eye_icon = 'mods/species/drakes/icons/eyes.dmi' icon_template = 'mods/species/drakes/icons/template.dmi' + skeletal_icon = 'mods/species/drakes/icons/skeleton.dmi' bodytype_category = BODYTYPE_GRAFADREKA eye_blend = ICON_MULTIPLY limb_blend = ICON_MULTIPLY diff --git a/mods/species/neoavians/datum/species_bodytypes.dm b/mods/species/neoavians/datum/species_bodytypes.dm index 96cd84238b4..c2e65cbad4b 100644 --- a/mods/species/neoavians/datum/species_bodytypes.dm +++ b/mods/species/neoavians/datum/species_bodytypes.dm @@ -3,6 +3,7 @@ bodytype_category = BODYTYPE_AVIAN icon_base = 'mods/species/neoavians/icons/body.dmi' blood_overlays = 'mods/species/neoavians/icons/blood_avian.dmi' + skeletal_icon = 'mods/species/neoavians/icons/skeleton.dmi' limb_blend = ICON_MULTIPLY bodytype_flag = BODY_FLAG_AVIAN eye_icon = 'mods/species/neoavians/icons/eyes.dmi' diff --git a/mods/species/neoavians/icons/skeleton.dmi b/mods/species/neoavians/icons/skeleton.dmi new file mode 100644 index 0000000000000000000000000000000000000000..7691879bda9eba762cea26032b6e6dc39f5ab84a GIT binary patch literal 1242 zcmV<01SR{4P)%0000LP)t-sz`(%0 zx{~JR#?Q~GrlWOQSvA1Gz)i9CFaQ7m0d!JMQvg8b*k%9#0H%6WSad{Xb7OL8aCB*J zZU6vyoQ={u3d1lA2H@E~g-Q0(*V?5dlnl)kil`M^;KW51$@QDGL#JYI`r*@KP;IX5 zt?Ny5@AQnEC{E^L&bz%<3t91NI32a}NY2YQBmu#-toQ*uR$5u&v^8lpFpRj>ho1_C zDxk|ME>s>STd=Z_4KYf=(jw+K(v($Ck10RPBjnE)ppZo`#+h*W=W5gT&F4kl7+#zd z${aE6000BQNklQF5Cw5QdRfeK#ftz{UqK;Jni~2k12Sze}66GvWVNfhH(v zCi8z!S+uMcS$1HxTB=G2A%qa(AK9VUzV`fxVxZ>Qoe;3c&@Z0P`raO0L4%^v^*yPe z26k!7`Z;@NbO*(ZJvuhv34R1XKWC3FxdRc$_irE2<++7MbjRuE?4eT;#6UCTj|yDn z4pcG&FxSu8!y#zFgk>GDRh5_Y*OjXl#?Ue&T2L zd>G9Vh{?sdA~}FzBBxLGIL>LU^XWU9pSZmv89VU$Xs_b-!8u?HQsoDL9PoibI>HY4 zA;92j;Lpf^XkgOmlfA^veo9S?qIV#n2J6#-#O-D0v=BlFA%qZOJ5B44#atG`0^ReI zL+}q?E9^6891e5IAf*KJOP+|s%z;Cj=>#sQ#|M+~F#h!XH;^BBXv->D922JfGxxx7k@*d z?dc8e25(=vGQCEKRG*-s<>i`Ir@PW4FszKgd(Qzk0wXOS^NN1=%C%!ZXJ}T@a(s0| z9k{#TSEd*=RJ5WBJ>otEV^P7C68(($w?S9eE<{a(3!EB5mNiSEsEhI|(fg1H6AAq`>blz!4~%6xxRv;Qa$Oj##*> zKY~N&V`c;X+X+qEpJz!GVW@6)P=6rSasD_Ps+O}-HevfA#@TlNaA*zd4?IqZnM1#Y zzT_mZ@f1@xd;h?GG=usBeLc+U2lQ1}7yS(E+I3Jrz)l_19|$#n3+l1~2L9=FKgByr zJw5H${qbQTjBeGu;coKR9}$G1BUZd)`MwUl+%?R zxS+yTY~uX|^pSKeo)9_fWn=#rx4(e*2VjSs_Vadr0fJ^r?1HTs9{>OV07*qoM6N<$ Eg5V@j82|tP literal 0 HcmV?d00001 From ff918ced7e955581a77c8fbaa22b35153ec7cc97 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sat, 22 Jun 2024 00:21:11 +1000 Subject: [PATCH 89/90] Tweaking to skeletal tails and icons. --- code/modules/mob/living/human/update_icons.dm | 22 ++++++++++++------ code/modules/organs/external/tail.dm | 4 ++++ mods/species/drakes/icons/skeleton.dmi | Bin 4209 -> 4237 bytes 3 files changed, 19 insertions(+), 7 deletions(-) diff --git a/code/modules/mob/living/human/update_icons.dm b/code/modules/mob/living/human/update_icons.dm index 6b53f860cbf..0109853188c 100644 --- a/code/modules/mob/living/human/update_icons.dm +++ b/code/modules/mob/living/human/update_icons.dm @@ -137,7 +137,7 @@ Please contact me on #coderbus IRC. ~Carn x // We are somehow updating with no torso, or a torso with no bodytype (probably gibbing). No point continuing. if(!root_bodytype) return - + var/matrix/M = matrix() if(current_posture?.prone && (root_bodytype.prone_overlay_offset[1] || root_bodytype.prone_overlay_offset[2])) M.Translate(root_bodytype.prone_overlay_offset[1], root_bodytype.prone_overlay_offset[2]) @@ -412,6 +412,14 @@ Please contact me on #coderbus IRC. ~Carn x return var/tail_state = tail_organ.get_tail() + if(tail_organ.limb_flags & ORGAN_FLAG_SKELETAL) + if(!tail_organ.bodytype?.skeletal_icon) + return + var/tail_cache_key = "[tail_state][tail_organ.bodytype.skeletal_icon]_skeletal" + if(!global.tail_icon_cache[tail_cache_key]) + global.tail_icon_cache[tail_cache_key] = icon(tail_organ.bodytype.skeletal_icon, tail_state) + return global.tail_icon_cache[tail_cache_key] + var/tail_icon = tail_organ.get_tail_icon() if(!tail_state || !tail_icon) return // No tail data! @@ -451,7 +459,7 @@ Please contact me on #coderbus IRC. ~Carn x /mob/living/human/proc/set_tail_state(var/t_state) var/obj/item/organ/external/tail/tail_organ = get_organ(BP_TAIL, /obj/item/organ/external/tail) - if(!tail_organ) + if(!tail_organ || (tail_organ.limb_flags & ORGAN_FLAG_SKELETAL)) return null var/image/tail_overlay = get_current_tail_image() if(tail_overlay && check_state_in_icon(tail_overlay.icon, t_state)) @@ -465,7 +473,7 @@ Please contact me on #coderbus IRC. ~Carn x /mob/living/human/proc/animate_tail_once(var/update_icons=1) var/obj/item/organ/external/tail/tail_organ = get_organ(BP_TAIL, /obj/item/organ/external/tail) - if(!tail_organ) + if(!tail_organ || (tail_organ.limb_flags & ORGAN_FLAG_SKELETAL)) return var/t_state = "[tail_organ.get_tail()]_once" @@ -486,7 +494,7 @@ Please contact me on #coderbus IRC. ~Carn x /mob/living/human/proc/animate_tail_start(var/update_icons=1) var/obj/item/organ/external/tail/tail_organ = get_organ(BP_TAIL, /obj/item/organ/external/tail) - if(!tail_organ) + if(!tail_organ || (tail_organ.limb_flags & ORGAN_FLAG_SKELETAL)) return var/tail_states = tail_organ.get_tail_states() if(tail_states) @@ -496,7 +504,7 @@ Please contact me on #coderbus IRC. ~Carn x /mob/living/human/proc/animate_tail_fast(var/update_icons=1) var/obj/item/organ/external/tail/tail_organ = get_organ(BP_TAIL, /obj/item/organ/external/tail) - if(!tail_organ) + if(!tail_organ || (tail_organ.limb_flags & ORGAN_FLAG_SKELETAL)) return var/tail_states = tail_organ.get_tail_states() if(tail_states) @@ -506,7 +514,7 @@ Please contact me on #coderbus IRC. ~Carn x /mob/living/human/proc/animate_tail_reset(var/update_icons=1) var/obj/item/organ/external/tail/tail_organ = get_organ(BP_TAIL, /obj/item/organ/external/tail) - if(!tail_organ) + if(!tail_organ || (tail_organ.limb_flags & ORGAN_FLAG_SKELETAL)) return var/tail_states = tail_organ.get_tail_states(src) if(stat != DEAD && tail_states) @@ -519,7 +527,7 @@ Please contact me on #coderbus IRC. ~Carn x /mob/living/human/proc/animate_tail_stop(var/update_icons=1) var/obj/item/organ/external/tail/tail_organ = get_organ(BP_TAIL, /obj/item/organ/external/tail) - if(!tail_organ) + if(!tail_organ || (tail_organ.limb_flags & ORGAN_FLAG_SKELETAL)) return set_tail_state("[tail_organ.get_tail()]_static") diff --git a/code/modules/organs/external/tail.dm b/code/modules/organs/external/tail.dm index 0425e7de994..09ba736bec2 100644 --- a/code/modules/organs/external/tail.dm +++ b/code/modules/organs/external/tail.dm @@ -28,6 +28,10 @@ /// How many random tail states are available for animations. var/tail_states = 1 +/obj/item/organ/external/tail/skeletonize() + . = ..() + owner?.update_tail_showing() + /obj/item/organ/external/tail/do_uninstall(in_place, detach, ignore_children, update_icon) var/mob/living/human/H = owner if(!(. = ..())) diff --git a/mods/species/drakes/icons/skeleton.dmi b/mods/species/drakes/icons/skeleton.dmi index 437a72a4b65afe2021c4c47ecbbc4498dea4477e..074776b10d6a2d0e8a02165fec62db15e84d25ef 100644 GIT binary patch delta 3915 zcmY+Ec|6qZ`o~qHX;F$KTT`}dkzJO?Fl0?0N;FjVNFM7jmTyt^u`gj5G0D~_OJo}= zjBOB+buyD>#+EINF>{_@zjMy>ocoXakNfqyU$6J|zOL)Db^(3yt@{Cho7)%;vkt;6 zPxS{<>UqHTO#{iQYBxysCQ;xkPsb*{FTL)^*;*;T0R%Sp&t*u8>#b}f=9H4M~%mxRE0EjusN>8GO&Xxu$k|g`mNUFHG3i`gTTrenI4VALIuv{y^&8=tJcWe z>kPq~(pl9KP4Dn&)c|>NyNnAl$gFcaVPw#Ynd}bYeDV4NZDXg+HPE%BKCjqW+q!~sjT=JJkgt6G zIWohgGMfABgn)oeDO2pw|C|4PhkEx$e!5XrkI%01*S^9wG!hznKf^a1In!*bsH;3T z7nJM3eN*xJ#v!;Zl{;_?QRh4S65t(cX})&%hQ}wq!QfeLJSgBuw>U{jsF2dH#mk*l z`b{=1xxXbXA#Ua2-Cd{DYTe}7^!n>h<+x)#KzHl#{Kx4AM)J?#+0LZZ>3nD?U&=k1^o@a?Tj8LH@#oND*?2ehIT{q0?PQQbSYiZ1BLFs*@&W zMpHhuDb~L7Gw3K)Bq4suEm?kIAfBX2Y~E#P5r58CE;PpBF}Y4+-|BG3>>0VKdlUv| zK_aq?qeET zgedXi|1}n>PVEB-03=%m~7#nr&ia`KQzF{DB<5I;$f@l zK3*BGqQj1_2zWS7&XI$Qf5O1cgDYHzEFHS*o}8rATfCbgy)_+$_{3VzUn2Xbv3Zl3 z)QP=36?U{Xad*=s*|8HMiFAqU!)*lPOSF|~ZdcuSfsYcY!6~xu;Y-~v-niWfD;eJW zN{suz7mB0RHq$2L=Y!AYU&(E}Yxgob;<5L{;fSr^O_+Ey>CxLVhBo60WBEdh(O0*9 z=DI7B>+(wxxZ2azf{J4mSR9wt{XX_BsLJ(-(BnJNp534k3p*cZ?D|RdNVL_PVrFYf}~{5?o(ZoV>?OqBJBcQ^m9MifFytML+tawQ^AMbix0#)9}}mi z6<&yp(1_>hqUsu0E5HIzAyGtE?8T_$g2))53}>E}@6QcoWr)*-=z_!j!pI2vcFbae zl!dzg8_TLh^n+iSOQNxsG=hl1nYDGM7!XoFFlRaA}RKyxGO7T5>DI^slbAyff{; zrHOh;{`@#!HS2L3@c~G&;)DNj!;@k$5Bgr+z2bWg#^otL6_H{Jww*fmdkz4O`x=FO zB$VL~HWwvl1NgYeUyzTX@r|+~EEHu*B9G)xq*(1e8-c{IB@!vs2^*~tr(~-=uA5Mf z))%0;$jM3lh$7YiEa^+a(Xo((#6~f9u1SY$sjAU;^$x?n{oJ@&s-X1Qia@nFqjDtC zuDAJcnMC8_KSnxyYwqHtvUe}n%WBzBq~N6Y?){W zpSYddd1A}U*ela?Wg^|+aI>+!y=u#I1|6QcPGI&&+Iej$JWNLwf_}`E#4M+>d+)Wova#gt<_*$F{1Dh z+<`XW8Oi-Psyz897KP*;`{~Z0L4P}Ql zZ9%uUMYsw!&T?C}I|5LpDoW#!_2R=B`eK%w?{Mim0AqGvO4f2O2fIF7P5!bx zrrLwCF#}foNcR0%r&pAF#(Mhi6jk@eF_5Wa_B20FdY0#GO+Sf!r=kL_G*~{(FHEc3 z2{LE5-AYrY_*L-r^;TtWQ4P+yqGgLdj`NLO*|@i*6Vo`WR>%qB^kgDoFfXNxL0IDsC39_n|deE@tC>g{au)LawlxeB9W zf`UZuG1WU&JPb~jb`RX@?cyr>+OQhDn%yhQ=z8r;<104%*k1lNNa{NMC%-ct$jO}4 zf3fsz;8hsv_FI8Jt3N{0ru1c$$`XE@%PQQRG;~1&+a`a+0_^=Y+Rx__wKH)GP3vF@ zv6vom{iBFi#zgfiGk``>Dc=H#ygcD zkoykz#YutUy?tR`Sw^*;fF%~tkG#cf`@mU`S}7>OB|&VOZ(J6=^8juC+IN!7ckpQO zVMhf&S^R(OaBw^!>Q+DAVavz`FZmhko29yPhJqzt}9x-vAEU zoNv@_=D~gQ0XUh9X=^>N(e|RYTLq33)>hZf?9kuka&TyhW=GIRQY^v^^Ff+NWS+-_ z1u{=8V1gRrlq+rtc}txSKI>C&ax+R3ttkLYHAKWL@#t+H%x)C_y60cfu->`Agjgn) zOKM8dD8f`29Vt?Zi>HO?Dc@u`96*0;VF4#4pA`DOfcs5Kmu1MR z!D0!0Qq=eb&bn2(9lzvaNogLDJR^m1bCy16n-e7MFzx!2W?EF=!WfDVOk-ckLqs>V z+v5}t{LR&x+x3i99p=vLHczj;Exl?{q)#2aoG3ZsYCFy{wO^z@>(KIWzN4)>*3#hb z2sk#EZn%txH3^M?+WA5b{LC2Ow#}Rnm7!{M0jlwz9AB;_mPk)+nIUGEsC&H|OEt}b z!?)5hUdi(V%kfSmCuzbrYc(|e2V?b^tzmsWz#1^v(gI@P%jQkK8(2JPRVRgr9phh@BauGnhJ z+)J&T!_?ay3twmD00iEL6ZdgPX6#|!w8BO z4jt0FQ4{>g)Y;tfy;z^1x5yq-pzwrS$MzO)WAm~Zfz=u$w4n~uX=yTx^KhuhmIG-5 zb4xod;f{4ZjReAIb;FBgE4h+Am29YAc+(rK7xh(Xv6U} zsvN6K81Ec%>gAe|EiB^p{If1b9c%Y|8Z0I(Cg51k575!6w@ zozgjzn+_=&;r)6b&S&3km0D6 znSr44JI}=#o0_}*vM5SEpYpP$ds7(qhoe0I1pPkVuG0xc&{Fwc)i!rPowMs@ufw6v zV?am(unzTfn|oG_j&zx35A5*UW_BG^}JpEvDqyJo^9845`&ikt2&yQ;+A&V+^W zPYsqULNHngAFqlR2$+W*HQ1q$j+%XvL;a76zT{{+3B2UhYp3Q1{`+2TvBq0(cO{xTH<_P_JYJ_K_E`JE68 zZk_qSYDN7I0wZ|w$DGPVPG5XPEJTZMnY*);)7ef(jQyd+Kk}u`m^e|izY9I_U&7KJ zwCt%KzYI*#^IrbKb%ioJ?5U=`mt!pRge(!@AXl^l{|aG7`v|j^kM>>kJn;8yz@Gsh zHQo?ce?~l7|E7ZNpyNw>s==8I-HpY^VP_5NiNTpF2Tl*51;hS22XhAdHnsI94xzaA zeimD(*MMtX>E1VIS>D3BeD`DjN(BIc-s>-`wrxelS&qyONm3lM;**OUdv4qfct>;4 zD;V;6Ez>#^uHCvW(P=p1dO+WN@QK|q8USaQe%FvW4<|{V@8-L^35?V584`qJhx6zw zh15)e8Lq81vP6NI^`2+&9o)M8FW*6$iovHRQmu&;MeWc1Hq}$1QZR^~JrK9M*VaER z1yj9D;Dio?@JbS>Pj3t(&G=mIaJwO3p=U79)};D57jAJ)|5WVZJ{`dASAsJ6xYF_2 zU591bwvlIy8=(k6jgxsMg%O3d{+3qLRQ9cU_(42wu05R=Vg7*ac?xg0ARt~%FoPv`){lBK8pJ#UV7YAO4uWcEj2}vPhqzHq8>*v zUp{GQGjR4R`Fonw5ocUKzxro!7Lrx#+uZO?wwHW`bl5#>XJewf*_`hBuM4oBG2re- zdp6(uzTjZh{BM>)t6X`E(c@4?g}>w3RtQuDuJo1<>i zFZ%Hnx#ou*3dQDstw`8s0>$?ziZ5=6ozCA**a>_7069FN8}Jq4;Qak?GoxB9s@IKs zmqQ!O-v*6@Q#CZ9bvnLZoHm4*u~!|ghRHbK^-?yS@Dw?%lJ73ty<5W5$L-q71?qfK zT*pXxF6Zvt1~?@9iEZ{FWA~cE>=A?)V-K}fI!!Adc6gsTPo%zG>x@0OyjZrlEp;}M zzO;|s+M)5*e@F|kL{K_fWDd;Wx1wZsi?u7bfk#GqDSEVWNyW{TqMUIKo(u6oD^sd_HO zIU6SI1UL?pl&6_~*lw}xhKH-jhjDf zx671)z$%ZWM%`@Sg4G0T;wpy50^XO`vikz~jxQp2&v@!9He7H$2;q;nAr8oNDZkd^ z1-AVfI>sWJpj|>1r@D;V^&AJ0w>coBFy`6zJ(QRZg8H4L@2+3OY)3!jF)#XQn!7to z)LNM#5S}sp=l8$o-BZ0WYAzX%i~x4VN$BO{`a99&VnG^6@>%_bnR+%!jF`@bDz+mxsA3IOB&h}|;uDb3j#&V89P5)U-q1L4Hx%V6I25FKtGeh;Y z_nu$q`1m}rC1hTZHlD6d=g4g>m!ff>)A$hVQIzWH#X1A?$GXtcW010v(*U-~U8@;k zL!4_*w^*2q>H^dwToE2EP<8nk9UR-jrfO~8JrC$62Xa?@$o(NpYjQ(AS3r2t1W!kd zy;>eZ&}>6j#QMQ5L@C8wH?HI(S|Jm}!8jYI(H+oSXY+!XvLl?KQqkhE<92nap%(33o+^ z{M~>5!fVDb^E?H8CW{B= z(UaA$a8~bP`a5H@g4@_vr-G3~44$QyhsCkQDnpkQus98dbO6CKmoAP#T~K2}-HVqJ zm^}Ho$r-0nYSqV&Zu}KqT<=f*uz?3&7OxALYfs6*!hP#l?V8d*@+W=$UmcFr;T^e% zv-wvyrOm<6T$mBL`VkP1ZE|;})`x3hF}?U6W@Dwk~KW-UhkdVmlgR(l9B%tPY_58X|P?i9!XSvR9fA1Qwtb);94cg-?)h`2*sf88fnJ9X+wRa}%2YV3iI zSUdvQuR=ovw^Ew*QhwCBEy%ix6Qon!DyU5*7hb`J1GRn=X||zswy&yl0-g$KSU(g+ zQl`OASGp=2!OgNXvnp}m`S!f|=%aRdElEsgv`dV+_7G~ZQ8du3Nc6td^uEEiRqqmo zU8$4uHg4iGOLcfq9wq0;EEmNq2wncBO%t%yz`sD0Pmr23#kNxz;UK%ME5WRW2Lh|{ zsYX>jcz-0?EZ}=P8;aRjpfnmalM$(Vm8|`B7b0OM? z%PMJAj;0WkVK4eVn6f#jdV!iCpd??WBMQPM&W3_$ql{w zZ(7l@+ZVi@JkL7vY9MKch_I5+N#df7Y%j=^0pny*AR8v7`K3$D{p{fr`e=NbTB7!pa;t_(%u6@8T#Oe!)N5o5PaXG*LBxPJEmp3@(tM=C~-Tt|3m7jit(B8b%Re$#Ze ze}-;W_<8kk$soJBzh+(OP|B#sUQJ?O%INUhefoPwbwQ3IT7~^ZC?k?cfEhtA!r9lJ zMm^jR)mG4Y*YxgM04m|EpU1Bh@qsOP<8uB4$CEc2nL`WUwPefn32B2n+=}>}6d;s5 gu!~YTHdDwrj=LBB2Tv{8i^l$0aUcVRff2}8#MF0Q* From 32dd41b3e77b2280ad22f852153398908b16ebc5 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Fri, 21 Jun 2024 06:54:11 -0400 Subject: [PATCH 90/90] Expand modpack validation script for greater flexibility --- tools/validate_modpacks.py | 83 ++++++++++++++++++++++++++++++-------- 1 file changed, 66 insertions(+), 17 deletions(-) diff --git a/tools/validate_modpacks.py b/tools/validate_modpacks.py index 33f4e82a632..aa192d073c8 100644 --- a/tools/validate_modpacks.py +++ b/tools/validate_modpacks.py @@ -4,19 +4,55 @@ import sys import os -FORBID_INCLUDE = [ +""" +Paths to search for modpacks in. +Works best if search paths are only one-deep, so that nested modpacks can be added separately. +""" +MODPACK_ROOTS = [ + r'mods/content/*/*.dme', + r'mods/gamemodes/*/*.dme', + r'mods/mobs/*/*.dme', + r'mods/species/*/*.dme' + # Example nested modpack configuration: + # r'mods/some_downstream/*/*.dme' ] -IGNORE_INCLUDE = [ - # These are stubs. - r'mods/content/dungeon_loot/subtypes/exosuit.dm', - # The validator can't detect the weird way these are loaded. - r'mods/content/corporate/away_sites/**/*.dm', - r'mods/content/government/away_sites/**/*.dm' +""" +A list of DME paths to not run validation on. +Useful for excluding the outermost DME in a nested-modpack situation. +""" +IGNORE_MODPACKS = [ + # Example: + # r'mods/some_downstream/some_downstream.dme/*.dme' ] +""" +A dictionary mapping of modpack roots ('mods/content/corporate') +to a list of globs matching files to forbid inclusion of. +If a file matches any of the globs, validation fails. +""" +FORBID_INCLUDE = { + # Example: + # r'mods/content/whatever/_whatever.dme' : [r'mods/content/whatever/README.md', r'mods/content/whatever/something/something_docs.md'] +} + +""" +A dictionary mapping of modpack roots ('mods/content/corporate') +to a list of globs matching files ('mods/content/corporate/away_sites/**/*.dm) to ignore when checking for inclusion. +If a file matching any of the globs is not included, validation will NOT fail. +""" +IGNORE_INCLUDE = { + # The validator can't detect the weird way these are loaded. + r'mods/content/corporate': [ + r'mods/content/corporate/away_sites/**/*.dm', + ], + r'mods/content/government': [ + r'mods/content/government/away_sites/**/*.dm' + ] +} + def validate_modpack(dme_path): - (modpack_root, dme_name) = os.path.split(dme_path) + (modpack_path, dme_name) = os.path.split(dme_path) reading = False lines = [] total = 0 @@ -38,18 +74,23 @@ def validate_modpack(dme_path): lines.append(line) offset = total - len(lines) - print(f"{offset} lines were ignored in output") + print(f"{offset} lines were ignored in {dme_name}") modpack_failed = False - for code_file in glob.glob("**/*.dm", root_dir=modpack_root, recursive=True): + for code_file in glob.glob("**/*.dm", root_dir=modpack_path, recursive=True): + full_file = os.path.join(modpack_path, code_file) dm_path = code_file.replace('/', '\\') - full_file = os.path.join(modpack_root, code_file) included = f"#include \"{dm_path}\"" in lines forbid_include = False ignored = False - for ignore in IGNORE_INCLUDE: + + modpack_ignores = [] + if modpack_path in IGNORE_INCLUDE: + modpack_ignores = IGNORE_INCLUDE[modpack_path] + + for ignore in modpack_ignores: if not fnmatch.fnmatch(full_file, ignore): continue @@ -59,14 +100,18 @@ def validate_modpack(dme_path): if ignored: continue - for forbid in FORBID_INCLUDE: + modpack_forbids = [] + if modpack_path in FORBID_INCLUDE: + modpack_forbids = FORBID_INCLUDE[modpack_path] + + for forbid in modpack_forbids: if not fnmatch.fnmatch(full_file, forbid): continue forbid_include = True if included: - print(f"{os.path.join(modpack_root,dm_path)} should not be included") + print(f"{os.path.join(modpack_path,dm_path)} should not be included") print(f"::error file={full_file},line=1,title=DME Validator::File should not be included") modpack_failed = True @@ -74,7 +119,7 @@ def validate_modpack(dme_path): continue if not included: - print(f"{os.path.join(modpack_root,dm_path)} is not included") + print(f"{os.path.join(modpack_path,dm_path)} is not included") print(f"::error file={full_file},line=1,title=DME Validator::File is not included") modpack_failed = True @@ -112,8 +157,12 @@ def compare_lines(a, b): return modpack_failed failed = False -for modpack_dme in glob.glob("mods/**/*.dme", recursive=True): - failed = validate_modpack(modpack_dme) or failed +for modpack_root in MODPACK_ROOTS: + for modpack_dme in glob.glob(modpack_root, recursive=True): + modpack_dme = modpack_dme.replace('\\', '/') + if modpack_dme in IGNORE_MODPACKS: + continue + failed = validate_modpack(modpack_dme) or failed if failed: sys.exit(1)