diff --git a/_maps/map_files/Delta/delta.dmm b/_maps/map_files/Delta/delta.dmm index 3e6c7e5c478..a89ac854596 100644 --- a/_maps/map_files/Delta/delta.dmm +++ b/_maps/map_files/Delta/delta.dmm @@ -78837,7 +78837,7 @@ /turf/simulated/floor/plasteel, /area/toxins/xenobiology) "cKn" = ( -/mob/living/carbon/slime, +/mob/living/simple_animal/slime, /turf/simulated/floor/greengrid, /area/toxins/xenobiology) "cKo" = ( diff --git a/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm b/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm index 41beb0d3a35..4396c52587d 100644 --- a/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm +++ b/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm @@ -23103,7 +23103,7 @@ /turf/simulated/floor/plasteel, /area/storage/tools) "aOE" = ( -/mob/living/carbon/slime, +/mob/living/simple_animal/slime, /turf/simulated/floor/plasteel, /area/toxins/xenobiology{ name = "\improper Secure Lab" diff --git a/_maps/map_files/MetaStation/z2.dmm b/_maps/map_files/MetaStation/z2.dmm index 4dcf9a2797b..446079ebd0c 100644 --- a/_maps/map_files/MetaStation/z2.dmm +++ b/_maps/map_files/MetaStation/z2.dmm @@ -4443,7 +4443,7 @@ "mp" = ( /obj/effect/decal/cleanable/blood/splatter, /obj/structure/rack, -/obj/item/clothing/suit/space/hardsuit/wizard, +/obj/item/clothing/suit/space/hardsuit/shielded/wizard, /turf/unsimulated/floor{ tag = "icon-cultdamage"; icon_state = "cultdamage" diff --git a/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_seed_vault.dmm b/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_seed_vault.dmm index b097156d39a..1bba42283c2 100644 --- a/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_seed_vault.dmm +++ b/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_seed_vault.dmm @@ -30,7 +30,7 @@ /turf/simulated/floor/plasteel/freezer, /area/ruin/powered/seedvault) "f" = ( -/obj/machinery/plantgenes/upgraded{ +/obj/machinery/plantgenes/seedvault{ pixel_y = 6 }, /obj/structure/table/wood, diff --git a/_maps/map_files/RandomZLevels/academy.dmm b/_maps/map_files/RandomZLevels/academy.dmm index 87f3573eb00..03c8b8919e4 100644 --- a/_maps/map_files/RandomZLevels/academy.dmm +++ b/_maps/map_files/RandomZLevels/academy.dmm @@ -238,7 +238,7 @@ /turf/simulated/floor/wood, /area/awaymission/academy/headmaster) "aL" = ( -/obj/item/clothing/suit/space/hardsuit/wizard, +/obj/item/clothing/suit/space/hardsuit/shielded/wizard, /obj/structure/table/wood, /obj/item/stack/sheet/mineral/silver{ amount = 20 diff --git a/_maps/map_files/cyberiad/cyberiad.dmm b/_maps/map_files/cyberiad/cyberiad.dmm index 2162c77926e..02bd3ad1e7c 100644 --- a/_maps/map_files/cyberiad/cyberiad.dmm +++ b/_maps/map_files/cyberiad/cyberiad.dmm @@ -79739,7 +79739,7 @@ /obj/effect/landmark{ name = "revenantspawn" }, -/mob/living/carbon/slime, +/mob/living/simple_animal/slime, /turf/simulated/floor/engine, /area/toxins/xenobiology) "cMh" = ( @@ -81166,7 +81166,7 @@ }, /area/toxins/xenobiology) "cOS" = ( -/obj/machinery/optable, +/obj/structure/table, /turf/simulated/floor/plasteel{ icon_state = "white" }, @@ -81933,10 +81933,8 @@ /area/toxins/xenobiology) "cQt" = ( /obj/structure/table/reinforced, -/obj/item/circular_saw{ - pixel_y = 0 - }, /obj/item/scalpel, +/obj/item/hemostat, /turf/simulated/floor/plasteel{ icon_state = "white" }, diff --git a/_maps/map_files/cyberiad/z2.dmm b/_maps/map_files/cyberiad/z2.dmm index c7620721a8c..ffb4f0fbc7f 100644 --- a/_maps/map_files/cyberiad/z2.dmm +++ b/_maps/map_files/cyberiad/z2.dmm @@ -4300,6 +4300,9 @@ /obj/structure/table/abductor, /obj/item/surgicaldrill/alien, /obj/item/circular_saw/alien, +/obj/item/FixOVein/alien, +/obj/item/bonesetter/alien, +/obj/item/bonegel/alien, /turf/unsimulated/floor/abductor, /area/abductor_ship) "ll" = ( @@ -9053,7 +9056,7 @@ pixel_x = -3; pixel_y = 3 }, -/obj/item/clothing/suit/space/hardsuit/wizard, +/obj/item/clothing/suit/space/hardsuit/shielded/wizard, /obj/item/clothing/suit/space/santa{ pixel_x = 3; pixel_y = -3 diff --git a/code/ATMOSPHERICS/components/unary_devices/vent_pump.dm b/code/ATMOSPHERICS/components/unary_devices/vent_pump.dm index bec3a6075dc..8c63ed7dad6 100644 --- a/code/ATMOSPHERICS/components/unary_devices/vent_pump.dm +++ b/code/ATMOSPHERICS/components/unary_devices/vent_pump.dm @@ -403,9 +403,9 @@ /obj/machinery/atmospherics/unary/vent_pump/examine(mob/user) - ..(user) + . = ..() if(welded) - to_chat(user, "It seems welded shut.") + . += "It seems welded shut." /obj/machinery/atmospherics/unary/vent_pump/power_change() var/old_stat = stat diff --git a/code/ATMOSPHERICS/components/unary_devices/vent_scrubber.dm b/code/ATMOSPHERICS/components/unary_devices/vent_scrubber.dm index 99ee514a1cc..5fcf7817a30 100644 --- a/code/ATMOSPHERICS/components/unary_devices/vent_scrubber.dm +++ b/code/ATMOSPHERICS/components/unary_devices/vent_scrubber.dm @@ -65,9 +65,9 @@ return ..() /obj/machinery/atmospherics/unary/vent_pump/examine(mob/user) - ..(user) + . = ..() if(welded) - to_chat(user, "It seems welded shut.") + . += "It seems welded shut." /obj/machinery/atmospherics/unary/vent_scrubber/auto_use_power() if(!powered(power_channel)) diff --git a/code/__DEFINES/components.dm b/code/__DEFINES/components.dm index b3b86ac13e1..df957eaa11e 100644 --- a/code/__DEFINES/components.dm +++ b/code/__DEFINES/components.dm @@ -40,7 +40,7 @@ #define COMSIG_PARENT_ATTACKBY "atom_attackby" //from base of atom/attackby(): (/obj/item, /mob/living, params) #define COMPONENT_NO_AFTERATTACK 1 //Return this in response if you don't want afterattack to be called #define COMSIG_ATOM_HULK_ATTACK "hulk_attack" //from base of atom/attack_hulk(): (/mob/living/carbon/human) -#define COMSIG_PARENT_EXAMINE "atom_examine" //from base of atom/examine(): (/mob) +#define COMSIG_PARENT_EXAMINE "atom_examine" //from base of atom/examine(): (/mob, result) #define COMSIG_ATOM_GET_EXAMINE_NAME "atom_examine_name" //from base of atom/get_examine_name(): (/mob, list/overrides) //Positions for overrides list #define EXAMINE_POSITION_ARTICLE 1 diff --git a/code/__DEFINES/genetics.dm b/code/__DEFINES/genetics.dm index 6afa76a02b0..c8916e31f40 100644 --- a/code/__DEFINES/genetics.dm +++ b/code/__DEFINES/genetics.dm @@ -165,4 +165,5 @@ #define NOZOMBIE 20 #define NO_GERMS 21 #define NO_DECAY 22 -#define PIERCEIMMUNE 23 \ No newline at end of file +#define PIERCEIMMUNE 23 +#define NO_HUNGER 24 \ No newline at end of file diff --git a/code/__DEFINES/is_helpers.dm b/code/__DEFINES/is_helpers.dm index d0ba27fb3d8..33ce299c540 100644 --- a/code/__DEFINES/is_helpers.dm +++ b/code/__DEFINES/is_helpers.dm @@ -86,7 +86,7 @@ GLOBAL_LIST_INIT(glass_sheet_types, typecacheof(list( #define isaliensentinel(A) (istype(A, /mob/living/carbon/alien/humanoid/sentinel)) -#define isslime(A) (istype((A), /mob/living/carbon/slime)) +#define isslime(A) (istype((A), /mob/living/simple_animal/slime)) //Structures #define isstructure(A) (istype((A), /obj/structure)) diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm index a9e43b7c3a0..7dd5fc5a609 100644 --- a/code/__DEFINES/misc.dm +++ b/code/__DEFINES/misc.dm @@ -417,3 +417,6 @@ #define ENGTYPE_SING "Singularity" #define ENGTYPE_SM "Supermatter" #define ENGTYPE_TESLA "Tesla" + +#define SUMMON_GUNS "guns" +#define SUMMON_MAGIC "magic" \ No newline at end of file diff --git a/code/__DEFINES/mobs.dm b/code/__DEFINES/mobs.dm index 25540dd4965..1db82f879fe 100644 --- a/code/__DEFINES/mobs.dm +++ b/code/__DEFINES/mobs.dm @@ -67,8 +67,8 @@ // Taste sensitivity - lower is more sensitive // Represents the minimum portion of total taste the mob can sense #define TASTE_SENSITIVITY_NORMAL 15 -#define TASTE_SENSITIVITY_SHARP 7.5 -#define TASTE_SENSITIVITY_DULL 20 +#define TASTE_SENSITIVITY_SHARP 10 +#define TASTE_SENSITIVITY_DULL 25 #define TASTE_SENSITIVITY_NO_TASTE 101 // Reagent type flags, defines the types of mobs this reagent will affect @@ -95,6 +95,21 @@ #define APPEARANCE_ALL_BODY APPEARANCE_ALL_HAIR|APPEARANCE_HEAD_ACCESSORY|APPEARANCE_MARKINGS|APPEARANCE_BODY_ACCESSORY|APPEARANCE_ALT_HEAD #define APPEARANCE_ALL 32767 +//Slime evolution threshold. Controls how fast slimes can split/grow +#define SLIME_EVOLUTION_THRESHOLD 10 + +//Slime extract crossing. Controls how many extracts is required to feed to a slime to core-cross. +#define SLIME_EXTRACT_CROSSING_REQUIRED 10 + +//Slime commands defines +#define SLIME_FRIENDSHIP_FOLLOW 3 //Min friendship to order it to follow +#define SLIME_FRIENDSHIP_STOPEAT 5 //Min friendship to order it to stop eating someone +#define SLIME_FRIENDSHIP_STOPEAT_NOANGRY 7 //Min friendship to order it to stop eating someone without it losing friendship +#define SLIME_FRIENDSHIP_STOPCHASE 4 //Min friendship to order it to stop chasing someone (their target) +#define SLIME_FRIENDSHIP_STOPCHASE_NOANGRY 6 //Min friendship to order it to stop chasing someone (their target) without it losing friendship +#define SLIME_FRIENDSHIP_STAY 3 //Min friendship to order it to stay +#define SLIME_FRIENDSHIP_ATTACK 8 //Min friendship to order it to attack + //If you add a new status, be sure to add a list for it to the simple_animals global in _globalvars/lists/mobs.dm //Hostile Mob AI Status #define AI_ON 1 @@ -200,7 +215,7 @@ // For the tcomms monitor #define ispathhuman(A) (ispath(A, /mob/living/carbon/human)) #define ispathbrain(A) (ispath(A, /mob/living/carbon/brain)) -#define ispathslime(A) (ispath(A, /mob/living/carbon/slime)) +#define ispathslime(A) (ispath(A, /mob/living/simple_animal/slime)) #define ispathbot(A) (ispath(A, /mob/living/simple_animal/bot)) #define ispathsilicon(A) (ispath(A, /mob/living/silicon)) #define ispathanimal(A) (ispath(A, /mob/living/simple_animal)) diff --git a/code/__DEFINES/role_preferences.dm b/code/__DEFINES/role_preferences.dm index 34ad4d69e54..5b93e570222 100644 --- a/code/__DEFINES/role_preferences.dm +++ b/code/__DEFINES/role_preferences.dm @@ -10,6 +10,7 @@ // justice if someone's abusing your role #define ROLE_SYNDICATE "Syndicate" #define ROLE_TRAITOR "traitor" +#define ROLE_MINDSLAVE "mindslave" #define ROLE_OPERATIVE "operative" #define ROLE_CHANGELING "changeling" #define ROLE_WIZARD "wizard" diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm index 10759fe336a..82295bc9d80 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -166,6 +166,18 @@ Turf and target are seperate in case you want to teleport some distance from a t return destination + +/proc/is_in_teleport_proof_area(atom/O) + if(!O) + return FALSE + var/area/A = get_area(O) + if(!A) + return FALSE + if(A.tele_proof) + return TRUE + else + return FALSE + // Returns true if direction is blocked from loc // Checks if doors are open /proc/DirBlocked(turf/loc,var/dir) @@ -409,7 +421,7 @@ Turf and target are seperate in case you want to teleport some distance from a t moblist.Add(M) for(var/mob/new_player/M in sortmob) moblist.Add(M) - for(var/mob/living/carbon/slime/M in sortmob) + for(var/mob/living/simple_animal/slime/M in sortmob) moblist.Add(M) for(var/mob/living/simple_animal/M in sortmob) moblist.Add(M) @@ -1518,6 +1530,23 @@ var/mob/dview/dview_mob = new return FALSE return TRUE +//datum may be null, but it does need to be a typed var +#define NAMEOF(datum, X) (#X || ##datum.##X) + +#define VARSET_LIST_CALLBACK(target, var_name, var_value) CALLBACK(GLOBAL_PROC, /proc/___callbackvarset, ##target, ##var_name, ##var_value) +//dupe code because dm can't handle 3 level deep macros +#define VARSET_CALLBACK(datum, var, var_value) CALLBACK(GLOBAL_PROC, /proc/___callbackvarset, ##datum, NAMEOF(##datum, ##var), ##var_value) + +/proc/___callbackvarset(list_or_datum, var_name, var_value) + if(length(list_or_datum)) + list_or_datum[var_name] = var_value + return + var/datum/D = list_or_datum + if(IsAdminAdvancedProcCall()) + D.vv_edit_var(var_name, var_value) //same result generally, unless badmemes + else + D.vars[var_name] = var_value + //Get the dir to the RIGHT of dir if they were on a clock //NORTH --> NORTHEAST /proc/get_clockwise_dir(dir) diff --git a/code/_onclick/hud/slime.dm b/code/_onclick/hud/slime.dm index 9f5621b75ee..f49228ddf66 100644 --- a/code/_onclick/hud/slime.dm +++ b/code/_onclick/hud/slime.dm @@ -1,18 +1,8 @@ -/mob/living/carbon/slime/create_mob_hud() - if(client && !hud_used) - hud_used = new /datum/hud/slime(src) - -/mob/living/simple_animal/slime/create_mob_hud() - if(client && !hud_used) - hud_used = new /datum/hud/slime(src) - -/datum/hud/slime/New(mob/owner) +/datum/hud/slime/New(mob/living/simple_animal/slime/owner, ui_style = 'icons/mob/screen_slime.dmi') ..() mymob.healths = new /obj/screen/healths/slime() infodisplay += mymob.healths - mymob.pullin = new /obj/screen/pull() - mymob.pullin.icon = 'icons/mob/screen_slime.dmi' - mymob.pullin.update_icon(mymob) - mymob.pullin.screen_loc = ui_construct_pull - hotkeybuttons += mymob.pullin +/mob/living/simple_animal/slime/create_mob_hud() + if(client && !hud_used) + hud_used = new /datum/hud/slime(src) \ No newline at end of file diff --git a/code/_onclick/other_mobs.dm b/code/_onclick/other_mobs.dm index c9c304729d8..47857ee4fa1 100644 --- a/code/_onclick/other_mobs.dm +++ b/code/_onclick/other_mobs.dm @@ -87,11 +87,13 @@ Slimes Nothing happening here */ -/mob/living/carbon/slime/UnarmedAttack(var/atom/A) +/mob/living/simple_animal/slime/UnarmedAttack(atom/A) A.attack_slime(src) -/atom/proc/attack_slime(mob/user as mob) + +/atom/proc/attack_slime(mob/user) return -/mob/living/carbon/slime/RestrainedClickOn(var/atom/A) + +/mob/living/simple_animal/slime/RestrainedClickOn(atom/A) return /* diff --git a/code/datums/components/decal.dm b/code/datums/components/decal.dm index bdc1d3a2f6f..26d4653b25a 100644 --- a/code/datums/components/decal.dm +++ b/code/datums/components/decal.dm @@ -71,5 +71,5 @@ if(strength >= cleanable) qdel(src) -/datum/component/decal/proc/examine(datum/source, mob/user) - to_chat(user, description) \ No newline at end of file +/datum/component/decal/proc/examine(datum/source, mob/user, var/list/examine_list) + examine_list += description \ No newline at end of file diff --git a/code/datums/components/ducttape.dm b/code/datums/components/ducttape.dm index 5bbf99198fd..85568f7a09c 100644 --- a/code/datums/components/ducttape.dm +++ b/code/datums/components/ducttape.dm @@ -17,8 +17,8 @@ if(I.loc == user) RT.Grant(user) -/datum/component/proc/add_tape_text(datum/source, mob/user) - to_chat(user, "There's some sticky tape attached to [source].") +/datum/component/proc/add_tape_text(datum/source, mob/user, list/examine_list) + examine_list += "There's some sticky tape attached to [source]." /datum/component/ducttape/proc/add_tape_overlay(obj/item/O) tape_overlay = new('icons/obj/bureaucracy.dmi', "tape") diff --git a/code/datums/components/material_container.dm b/code/datums/components/material_container.dm index 92c8c6b108d..8d44679fa4a 100644 --- a/code/datums/components/material_container.dm +++ b/code/datums/components/material_container.dm @@ -49,13 +49,13 @@ var/mat_path = possible_mats[id] materials[id] = new mat_path() -/datum/component/material_container/proc/OnExamine(datum/source, mob/user) +/datum/component/material_container/proc/OnExamine(datum/source, mob/user, list/examine_list) if(show_on_examine) for(var/I in materials) var/datum/material/M = materials[I] var/amt = amount(M.id) if(amt) - to_chat(user, "It has [amt] units of [lowertext(M.name)] stored.") + examine_list += "It has [amt] units of [lowertext(M.name)] stored." /datum/component/material_container/proc/OnAttackBy(datum/source, obj/item/I, mob/living/user) var/list/tc = allowed_typecache diff --git a/code/datums/diseases/advance/symptoms/damage_converter.dm b/code/datums/diseases/advance/symptoms/damage_converter.dm index cba4d4a4cd0..8ee98df67ef 100644 --- a/code/datums/diseases/advance/symptoms/damage_converter.dm +++ b/code/datums/diseases/advance/symptoms/damage_converter.dm @@ -44,10 +44,11 @@ Bonus if(!parts.len) return - + var/healed = 0 for(var/obj/item/organ/external/E in parts) + healed = min(E.brute_dam, get_damage) + min(E.burn_dam, get_damage) E.heal_damage(get_damage, get_damage, 0, 0) - M.adjustToxLoss(get_damage*parts.len) + M.adjustToxLoss(healed) else diff --git a/code/datums/diseases/advance/symptoms/weight.dm b/code/datums/diseases/advance/symptoms/weight.dm index 1378df4d05e..98b940f2b83 100644 --- a/code/datums/diseases/advance/symptoms/weight.dm +++ b/code/datums/diseases/advance/symptoms/weight.dm @@ -36,4 +36,4 @@ Bonus else to_chat(M, "[pick("So hungry...", "You'd kill someone for a bite of food...", "Hunger cramps seize you...")]") M.overeatduration = max(M.overeatduration - 100, 0) - M.nutrition = max(M.nutrition - 100, 0) \ No newline at end of file + M.adjust_nutrition(-100) \ No newline at end of file diff --git a/code/datums/diseases/food_poisoning.dm b/code/datums/diseases/food_poisoning.dm index 2e7d083455b..4df31ec57d9 100644 --- a/code/datums/diseases/food_poisoning.dm +++ b/code/datums/diseases/food_poisoning.dm @@ -63,7 +63,7 @@ if(affected_mob.nutrition > 10) affected_mob.visible_message("[affected_mob] vomits on the floor profusely!") affected_mob.fakevomit(no_text = 1) - affected_mob.nutrition -= rand(3,5) + affected_mob.adjust_nutrition(-rand(3,5)) else to_chat(affected_mob, "Your stomach lurches painfully!") affected_mob.visible_message("[affected_mob] gags and retches!") diff --git a/code/datums/diseases/transformation.dm b/code/datums/diseases/transformation.dm index 766c52c7b65..f619e9aa9bd 100644 --- a/code/datums/diseases/transformation.dm +++ b/code/datums/diseases/transformation.dm @@ -186,7 +186,7 @@ stage3 = list("Your appendages are melting away.", "Your limbs begin to lose their shape.") stage4 = list("You are turning into a slime.") stage5 = list("You have become a slime.") - new_form = /mob/living/carbon/slime/random + new_form = /mob/living/simple_animal/slime/random /datum/disease/transformation/slime/stage_act() ..() diff --git a/code/datums/diseases/tuberculosis.dm b/code/datums/diseases/tuberculosis.dm index 9aad7ff6d17..9a305c758e3 100644 --- a/code/datums/diseases/tuberculosis.dm +++ b/code/datums/diseases/tuberculosis.dm @@ -52,7 +52,7 @@ if(prob(3)) to_chat(affected_mob, "[pick("Your stomach silently rumbles...", "Your stomach seizes up and falls limp, muscles dead and lifeless.", "You could eat a crayon")]") affected_mob.overeatduration = max(affected_mob.overeatduration - 100, 0) - affected_mob.nutrition = max(affected_mob.nutrition - 100, 0) + affected_mob.adjust_nutrition(-100) if(prob(15)) to_chat(affected_mob, "[pick("You feel uncomfortably hot...", "You feel like unzipping your jumpsuit", "You feel like taking off some clothes...")]") affected_mob.bodytemperature += 40 diff --git a/code/datums/helper_datums/teleport.dm b/code/datums/helper_datums/teleport.dm index 65e188512d5..bb424a9afdf 100644 --- a/code/datums/helper_datums/teleport.dm +++ b/code/datums/helper_datums/teleport.dm @@ -140,6 +140,8 @@ var/mob/living/L = teleatom if(L.buckled) L.buckled.unbuckle_mob(L, force = TRUE) + if(L.has_buckled_mobs()) + L.unbuckle_all_mobs(force = TRUE) destarea.Entered(teleatom) diff --git a/code/datums/mind.dm b/code/datums/mind.dm index d03207ef41a..1a6bc4eb1c7 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -132,11 +132,17 @@ var/output = "[current.real_name]'s Memories:
" output += memory - if(objectives.len) + var/antag_datum_objectives = FALSE + for(var/datum/antagonist/A in antag_datums) + output += A.antag_memory + if(!antag_datum_objectives && LAZYLEN(A.objectives)) + antag_datum_objectives = TRUE + + if(LAZYLEN(objectives) || antag_datum_objectives) output += "
Objectives:
" output += gen_objective_text() - if(job_objectives.len) + if(LAZYLEN(job_objectives)) output += "
Job Objectives: