From cb8529cdb85b9e83f1f4581601e243d8475a97f4 Mon Sep 17 00:00:00 2001 From: Fox McCloud Date: Tue, 24 Sep 2019 19:17:33 -0400 Subject: [PATCH] Makes Xenobiology Simpler. Removes Slimes (#12398) --- _maps/map_files/Delta/delta.dmm | 2 +- .../MetaStation/MetaStation.v41A.II.dmm | 2 +- _maps/map_files/cyberiad/cyberiad.dmm | 8 +- christmas.dm | 0 code/__DEFINES/is_helpers.dm | 2 +- code/__DEFINES/mobs.dm | 17 +- code/__HELPERS/unsorted.dm | 19 +- code/_onclick/hud/slime.dm | 18 +- code/_onclick/other_mobs.dm | 8 +- code/datums/diseases/transformation.dm | 2 +- code/datums/helper_datums/teleport.dm | 2 + code/datums/mind.dm | 2 +- code/datums/spells/area_teleport.dm | 3 + code/game/dna/dna_modifier.dm | 13 +- code/game/dna/genes/goon_powers.dm | 2 +- .../gamemodes/miniantags/abduction/gland.dm | 2 +- .../abduction/machinery/experiment.dm | 14 +- .../gamemodes/miniantags/bot_swarm/swarmer.dm | 2 +- code/game/machinery/Sleeper.dm | 21 +- code/game/machinery/adv_med.dm | 14 +- code/game/machinery/cryo.dm | 21 +- code/game/machinery/cryopod.dm | 14 +- code/game/mecha/mecha.dm | 4 - code/game/objects/items.dm | 2 +- code/game/objects/items/devices/scanners.dm | 53 +- .../items/weapons/implants/implantchair.dm | 2 +- code/game/objects/items/weapons/scrolls.dm | 3 + code/game/objects/obj_defense.dm | 4 +- .../structures/crates_lockers/closets.dm | 2 +- code/game/objects/structures/inflatable.dm | 2 +- code/game/objects/structures/mirror.dm | 6 +- code/game/verbs/suicide.dm | 2 +- code/modules/admin/topic.dm | 2 +- code/modules/admin/verbs/debug.dm | 10 + code/modules/admin/verbs/freeze.dm | 8 +- code/modules/events/anomaly_pyro.dm | 9 +- .../kitchen_machinery/processor.dm | 17 +- .../mob/living/carbon/alien/alien_defense.dm | 9 + .../living/carbon/alien/humanoid/humanoid.dm | 9 - .../mob/living/carbon/alien/larva/larva.dm | 10 - code/modules/mob/living/carbon/brain/brain.dm | 2 +- .../mob/living/carbon/carbon_defense.dm | 29 +- .../mob/living/carbon/human/human_defense.dm | 26 +- code/modules/mob/living/carbon/slime/death.dm | 21 - .../mob/living/carbon/slime/examine.dm | 45 -- code/modules/mob/living/carbon/slime/life.dm | 570 ---------------- .../modules/mob/living/carbon/slime/powers.dm | 233 ------- code/modules/mob/living/carbon/slime/say.dm | 29 - code/modules/mob/living/carbon/slime/slime.dm | 546 ---------------- .../mob/living/carbon/slime/update_icons.dm | 1 - code/modules/mob/living/living.dm | 4 - code/modules/mob/living/living_defense.dm | 26 +- code/modules/mob/living/living_defines.dm | 1 - .../mob/living/silicon/ai/ai_defense.dm | 2 +- .../mob/living/silicon/robot/robot_defense.dm | 2 +- .../living/simple_animal/animal_defense.dm | 12 +- .../living/simple_animal/friendly/slime.dm | 60 -- .../mob/living/simple_animal/simple_animal.dm | 2 +- .../mob/living/simple_animal/slime/death.dm | 32 + .../{carbon => simple_animal}/slime/emote.dm | 9 +- .../mob/living/simple_animal/slime/life.dm | 617 ++++++++++++++++++ .../mob/living/simple_animal/slime/powers.dm | 215 ++++++ .../mob/living/simple_animal/slime/say.dm | 18 + .../mob/living/simple_animal/slime/slime.dm | 505 ++++++++++++++ .../slime/subtypes.dm | 4 +- code/modules/mob/transform_procs.dm | 27 +- code/modules/projectiles/projectile/magic.dm | 2 +- code/modules/reagents/chemistry/holder.dm | 14 +- .../reagents/chemistry/reagents/food.dm | 4 +- .../chemistry/reagents/pyrotechnic.dm | 2 +- .../reagents/chemistry/reagents/water.dm | 4 +- .../chemistry/recipes/slime_extracts.dm | 17 +- code/modules/recycling/disposal.dm | 2 +- .../research/xenobiology/xenobio_camera.dm | 47 +- .../research/xenobiology/xenobiology.dm | 15 +- code/modules/spacepods/spacepod.dm | 7 +- code/modules/surgery/core_removal.dm | 61 ++ code/modules/surgery/slime.dm | 103 --- icons/mob/actions/actions_slime.dmi | Bin 0 -> 4717 bytes icons/mob/slimes.dmi | Bin 85977 -> 86112 bytes paradise.dme | 19 +- 81 files changed, 1774 insertions(+), 1903 deletions(-) create mode 100644 christmas.dm delete mode 100644 code/modules/mob/living/carbon/slime/death.dm delete mode 100644 code/modules/mob/living/carbon/slime/examine.dm delete mode 100644 code/modules/mob/living/carbon/slime/life.dm delete mode 100644 code/modules/mob/living/carbon/slime/powers.dm delete mode 100644 code/modules/mob/living/carbon/slime/say.dm delete mode 100644 code/modules/mob/living/carbon/slime/slime.dm delete mode 100644 code/modules/mob/living/carbon/slime/update_icons.dm delete mode 100644 code/modules/mob/living/simple_animal/friendly/slime.dm create mode 100644 code/modules/mob/living/simple_animal/slime/death.dm rename code/modules/mob/living/{carbon => simple_animal}/slime/emote.dm (95%) create mode 100644 code/modules/mob/living/simple_animal/slime/life.dm create mode 100644 code/modules/mob/living/simple_animal/slime/powers.dm create mode 100644 code/modules/mob/living/simple_animal/slime/say.dm create mode 100644 code/modules/mob/living/simple_animal/slime/slime.dm rename code/modules/mob/living/{carbon => simple_animal}/slime/subtypes.dm (96%) create mode 100644 code/modules/surgery/core_removal.dm delete mode 100644 code/modules/surgery/slime.dm create mode 100644 icons/mob/actions/actions_slime.dmi 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 c9c348db8d1..02acdb8fe7e 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/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/christmas.dm b/christmas.dm new file mode 100644 index 00000000000..e69de29bb2d diff --git a/code/__DEFINES/is_helpers.dm b/code/__DEFINES/is_helpers.dm index 0e5c5316254..5f9e2b463ff 100644 --- a/code/__DEFINES/is_helpers.dm +++ b/code/__DEFINES/is_helpers.dm @@ -84,7 +84,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/mobs.dm b/code/__DEFINES/mobs.dm index 0a551570472..1db82f879fe 100644 --- a/code/__DEFINES/mobs.dm +++ b/code/__DEFINES/mobs.dm @@ -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/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm index 3aaf3164428..82295bc9d80 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -421,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) @@ -1530,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 53f2a89f9c1..d4ef3799610 100644 --- a/code/_onclick/other_mobs.dm +++ b/code/_onclick/other_mobs.dm @@ -84,11 +84,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/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/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..84d5ab32b8a 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -1729,7 +1729,7 @@ mind.active = 1 //indicates that the mind is currently synced with a client //slime -/mob/living/carbon/slime/mind_initialize() +/mob/living/simple_animal/slime/mind_initialize() ..() mind.assigned_role = "slime" diff --git a/code/datums/spells/area_teleport.dm b/code/datums/spells/area_teleport.dm index 023939c2747..2f07f106d2a 100644 --- a/code/datums/spells/area_teleport.dm +++ b/code/datums/spells/area_teleport.dm @@ -58,6 +58,9 @@ if(target && target.buckled) target.buckled.unbuckle_mob(target, force = TRUE) + if(target && target.has_buckled_mobs()) + target.unbuckle_all_mobs(force = TRUE) + var/list/tempL = L var/attempt = null var/success = 0 diff --git a/code/game/dna/dna_modifier.dm b/code/game/dna/dna_modifier.dm index e4b1f1e8a49..b95d3afc3f7 100644 --- a/code/game/dna/dna_modifier.dm +++ b/code/game/dna/dna_modifier.dm @@ -155,6 +155,9 @@ if(usr.abiotic()) to_chat(usr, "Subject cannot have abiotic items on.") return + if(usr.has_buckled_mobs()) //mob attached to us + to_chat(usr, "[usr] will not fit into the [src] because [usr.p_they()] [usr.p_have()] a slime latched onto [usr.p_their()] head.") + return usr.stop_pulling() usr.forceMove(src) src.occupant = usr @@ -190,10 +193,9 @@ if(L.abiotic()) to_chat(user, "Subject cannot have abiotic items on.") return - for(var/mob/living/carbon/slime/M in range(1,L)) - if(M.Victim == L) - to_chat(usr, "[L.name] will not fit into the [src] because [L.p_they()] [L.p_have()] a slime latched onto [L.p_their()] head.") - return + if(L.has_buckled_mobs()) //mob attached to us + to_chat(user, "[L] will not fit into [src] because [L.p_they()] [L.p_have()] a slime latched onto [L.p_their()] head.") + return if(L == user) visible_message("[user] climbs into the [src].") else @@ -242,6 +244,9 @@ if(G.affecting.abiotic()) to_chat(user, "Subject cannot have abiotic items on.") return + if(G.affecting.has_buckled_mobs()) //mob attached to us + to_chat(user, "will not fit into the [src] because [G.affecting.p_they()] [G.affecting.p_have()] a slime latched onto [G.affecting.p_their()] head.") + return if(panel_open) to_chat(usr, "Close the maintenance panel first.") return diff --git a/code/game/dna/genes/goon_powers.dm b/code/game/dna/genes/goon_powers.dm index 85e7126ae73..fa9f2a323e8 100644 --- a/code/game/dna/genes/goon_powers.dm +++ b/code/game/dna/genes/goon_powers.dm @@ -241,7 +241,7 @@ /mob/living/simple_animal/crab, /mob/living/simple_animal/mouse, /mob/living/carbon/human, - /mob/living/carbon/slime, + /mob/living/simple_animal/slime, /mob/living/carbon/alien/larva, /mob/living/simple_animal/slime, /mob/living/simple_animal/chick, diff --git a/code/game/gamemodes/miniantags/abduction/gland.dm b/code/game/gamemodes/miniantags/abduction/gland.dm index 2b0162829e1..2378ab1f789 100644 --- a/code/game/gamemodes/miniantags/abduction/gland.dm +++ b/code/game/gamemodes/miniantags/abduction/gland.dm @@ -129,7 +129,7 @@ to_chat(owner, "You feel nauseous!") owner.vomit(20) - var/mob/living/carbon/slime/Slime = new/mob/living/carbon/slime(get_turf(owner)) + var/mob/living/simple_animal/slime/Slime = new(get_turf(owner), "grey") Slime.Friends = list(owner) Slime.Leader = owner diff --git a/code/game/gamemodes/miniantags/abduction/machinery/experiment.dm b/code/game/gamemodes/miniantags/abduction/machinery/experiment.dm index db6f07c1d24..fd7e7892cd4 100644 --- a/code/game/gamemodes/miniantags/abduction/machinery/experiment.dm +++ b/code/game/gamemodes/miniantags/abduction/machinery/experiment.dm @@ -27,10 +27,9 @@ return //occupied if(target.buckled) return - for(var/mob/living/carbon/slime/M in range(1, target)) - if(M.Victim == target) - to_chat(user, "[target] has a slime attached to [target.p_them()], deal with that first.") - return + if(target.has_buckled_mobs()) //mob attached to us + to_chat(user, "[target] will not fit into [src] because [target.p_they()] [target.p_have()] a slime latched onto [target.p_their()] head.") + return visible_message("[user] puts [target] into the [src].") target.forceMove(src) @@ -191,10 +190,9 @@ if(occupant) to_chat(user, "The [src] is already occupied!") return - for(var/mob/living/carbon/slime/S in range(1, grabbed.affecting)) - if(S.Victim == grabbed.affecting) - to_chat(user, "[grabbed.affecting] has a slime attached to them, deal with that first.") - return + if(grabbed.affecting.has_buckled_mobs()) //mob attached to us + to_chat(user, "[grabbed.affecting] will not fit into [src] because [grabbed.affecting.p_they()] [grabbed.affecting.p_have()] a slime latched onto [grabbed.affecting.p_their()] head.") + return visible_message("[user] puts [grabbed.affecting] into the [src].") var/mob/living/carbon/human/H = grabbed.affecting H.forceMove(src) diff --git a/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm b/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm index 3c0ca1955fb..6ea14557e06 100644 --- a/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm +++ b/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm @@ -346,7 +346,7 @@ S.DisperseTarget(src) return TRUE -/mob/living/carbon/slime/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) +/mob/living/simple_animal/slime/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) to_chat(S, "This biological resource is somehow resisting our bluespace transceiver. Aborting.") return FALSE diff --git a/code/game/machinery/Sleeper.dm b/code/game/machinery/Sleeper.dm index c447ff26e72..aefe99213e1 100644 --- a/code/game/machinery/Sleeper.dm +++ b/code/game/machinery/Sleeper.dm @@ -328,10 +328,9 @@ if(occupant) to_chat(user, "The sleeper is already occupied!") return - for(var/mob/living/carbon/slime/M in range(1, G.affecting)) - if(M.Victim == G.affecting) - to_chat(user, "[G.affecting.name] will not fit into the sleeper because [G.affecting.p_they()] [G.affecting.p_have()] a slime latched onto [G.affecting.p_their()] head.") - return + if(G.affecting.has_buckled_mobs()) //mob attached to us + to_chat(user, "[G.affecting] will not fit into [src] because [G.affecting.p_they()] [G.affecting.p_have()] a slime latched onto [G.affecting.p_their()] head.") + return visible_message("[user] starts putting [G.affecting.name] into the sleeper.") @@ -488,10 +487,9 @@ if(L.abiotic()) to_chat(user, "Subject cannot have abiotic items on.") return - for(var/mob/living/carbon/slime/M in range(1,L)) - if(M.Victim == L) - to_chat(usr, "[L.name] will not fit into the sleeper because [L.p_they()] [L.p_have()] a slime latched onto their head.") - return + if(L.has_buckled_mobs()) //mob attached to us + to_chat(user, "[L] will not fit into [src] because [L.p_they()] [L.p_have()] a slime latched onto [L.p_their()] head.") + return if(L == user) visible_message("[user] starts climbing into the sleeper.") else @@ -529,10 +527,9 @@ return if(usr.incapacitated()) //are you cuffed, dying, lying, stunned or other return - for(var/mob/living/carbon/slime/M in range(1,usr)) - if(M.Victim == usr) - to_chat(usr, "You're too busy getting your life sucked out of you.") - return + if(usr.has_buckled_mobs()) //mob attached to us + to_chat(usr, "[usr] will not fit into [src] because [usr.p_they()] [usr.p_have()] a slime latched onto [usr.p_their()] head.") + return visible_message("[usr] starts climbing into the sleeper.") if(do_after(usr, 20, target = usr)) if(occupant) diff --git a/code/game/machinery/adv_med.dm b/code/game/machinery/adv_med.dm index adb08949732..1fb4c505170 100644 --- a/code/game/machinery/adv_med.dm +++ b/code/game/machinery/adv_med.dm @@ -77,10 +77,9 @@ if(occupant) to_chat(user, "The scanner is already occupied!") return - for(var/mob/living/carbon/slime/M in range(1, TYPECAST_YOUR_SHIT.affecting)) - if(M.Victim == TYPECAST_YOUR_SHIT.affecting) - to_chat(user, "[TYPECAST_YOUR_SHIT.affecting.name] has a fucking slime attached to [TYPECAST_YOUR_SHIT.affecting.p_them()], deal with that first.") - return + if(TYPECAST_YOUR_SHIT.affecting.has_buckled_mobs()) //mob attached to us + to_chat(user, "[TYPECAST_YOUR_SHIT.affecting] will not fit into [src] because [TYPECAST_YOUR_SHIT.affecting.p_they()] [TYPECAST_YOUR_SHIT.affecting.p_have()] a fucking slime latched onto [TYPECAST_YOUR_SHIT.affecting.p_their()] head.") + return var/mob/living/carbon/human/M = TYPECAST_YOUR_SHIT.affecting if(M.abiotic()) to_chat(user, "Subject cannot have abiotic items on.") @@ -117,10 +116,9 @@ if(H.abiotic()) to_chat(user, "Subject cannot have abiotic items on.") return FALSE - for(var/mob/living/carbon/slime/M in range(1, H)) - if(M.Victim == H) - to_chat(user, "[H] has a fucking slime attached to [H.p_them()], deal with that first.") - return FALSE + if(H.has_buckled_mobs()) //mob attached to us + to_chat(user, "[H] will not fit into [src] because [H.p_they()] [H.p_have()] a slime latched onto [H.p_their()] head.") + return if(H == user) visible_message("[user] climbs into [src].") diff --git a/code/game/machinery/cryo.dm b/code/game/machinery/cryo.dm index b45a8331188..0546b0e9462 100644 --- a/code/game/machinery/cryo.dm +++ b/code/game/machinery/cryo.dm @@ -108,10 +108,9 @@ if(L.abiotic()) to_chat(user, "Subject cannot have abiotic items on.") return - for(var/mob/living/carbon/slime/M in range(1,L)) - if(M.Victim == L) - to_chat(usr, "[L.name] will not fit into the cryo cell because [L.p_they()] [L.p_have()] a slime latched onto [L.p_their()] head.") - return + if(L.has_buckled_mobs()) //mob attached to us + to_chat(user, "[L] will not fit into [src] because [L.p_they()] [L.p_have()] a slime latched onto [L.p_their()] head.") + return if(put_mob(L)) if(L == user) visible_message("[user] climbs into the cryo cell.") @@ -305,10 +304,9 @@ return if(!ismob(GG.affecting)) return - for(var/mob/living/carbon/slime/M in range(1,GG.affecting)) - if(M.Victim == GG.affecting) - to_chat(usr, "[GG.affecting.name] will not fit into the cryo because [GG.affecting.p_they()] [GG.affecting.p_have()] a slime latched onto [GG.affecting.p_their()] head.") - return + if(GG.affecting.has_buckled_mobs()) //mob attached to us + to_chat(user, "[GG.affecting] will not fit into [src] because [GG.affecting.p_they()] [GG.affecting.p_have()] a slime latched onto [GG.affecting.p_their()] head.") + return var/mob/M = GG.affecting if(put_mob(M)) qdel(GG) @@ -468,10 +466,9 @@ set category = "Object" set src in oview(1) - for(var/mob/living/carbon/slime/M in range(1,usr)) - if(M.Victim == usr) - to_chat(usr, "You're too busy getting your life sucked out of you.") - return + if(usr.has_buckled_mobs()) //mob attached to us + to_chat(usr, "[usr] will not fit into [src] because [usr.p_they()] [usr.p_have()] a slime latched onto [usr.p_their()] head.") + return if(stat & (NOPOWER|BROKEN)) return diff --git a/code/game/machinery/cryopod.dm b/code/game/machinery/cryopod.dm index f9d708a6200..9d6be29c84f 100644 --- a/code/game/machinery/cryopod.dm +++ b/code/game/machinery/cryopod.dm @@ -554,10 +554,9 @@ to_chat(user, "Dead people can not be put into cryo.") return - for(var/mob/living/carbon/slime/M in range(1,L)) - if(M.Victim == L) - to_chat(usr, "[L.name] will not fit into the cryo pod because [L.p_they()] [L.p_have()] a slime latched onto [L.p_their()] head.") - return + if(L.has_buckled_mobs()) //mob attached to us + to_chat(user, "[L] will not fit into [src] because [L.p_they()] [L.p_have()] a slime latched onto [L.p_their()] head.") + return var/willing = null //We don't want to allow people to be forced into despawning. @@ -658,10 +657,9 @@ to_chat(usr, "\The [src] is in use.") return - for(var/mob/living/carbon/slime/M in range(1,usr)) - if(M.Victim == usr) - to_chat(usr, "You're too busy getting your life sucked out of you.") - return + if(usr.has_buckled_mobs()) //mob attached to us + to_chat(usr, "[usr] will not fit into [src] because [usr.p_they()] [usr.p_have()] a slime latched onto [usr.p_their()] head.") + return visible_message("[usr] starts climbing into [src].") diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index e1c5a03b3a6..517d6dd4019 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -1144,10 +1144,6 @@ if(user.has_buckled_mobs()) //mob attached to us to_chat(user, "You can't enter the exosuit with other creatures attached to you!") return - for(var/mob/living/carbon/slime/S in range(1,user)) - if(S.Victim == user) - to_chat(user, "You're too busy getting your life sucked out of you.") - return visible_message("[user] starts to climb into [src]") diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 2116114a305..7acaf887828 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -471,7 +471,7 @@ var/global/image/fire_overlay = image("icon" = 'icons/goonstation/effects/fire.d to_chat(user, "You're going to need to remove that mask/helmet/glasses first!") return - if(istype(M, /mob/living/carbon/alien) || istype(M, /mob/living/carbon/slime))//Aliens don't have eyes./N slimes also don't have eyes! + if(istype(M, /mob/living/carbon/alien) || istype(M, /mob/living/simple_animal/slime))//Aliens don't have eyes./N slimes also don't have eyes! to_chat(user, "You cannot locate any eyes on this creature!") return diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm index 841850ee418..6c5b9cae2d6 100644 --- a/code/game/objects/items/devices/scanners.dm +++ b/code/game/objects/items/devices/scanners.dm @@ -547,39 +547,46 @@ proc/healthscan(mob/user, mob/living/M, mode = 1, upgraded = FALSE) throw_range = 7 materials = list(MAT_METAL=30, MAT_GLASS=20) -/obj/item/slime_scanner/attack(mob/living/M as mob, mob/living/user as mob) - slime_scan(M, user) - -/proc/slime_scan(mob/living/carbon/slime/M, mob/living/user) - if(!isslime(M)) - user.show_message("This device can only scan slimes!", 1) +/obj/item/slime_scanner/attack(mob/living/M, mob/living/user) + if(user.incapacitated() || user.eye_blind) return - var/mob/living/carbon/slime/T = M - user.show_message("Slime scan results:", 1) - user.show_message(text("[T.colour] [] slime", T.is_adult ? "adult" : "baby"), 1) - user.show_message(text("Nutrition: [T.nutrition]/[]", T.get_max_nutrition()), 1) + if(!isslime(M)) + to_chat(user, "This device can only scan slimes!") + return + var/mob/living/simple_animal/slime/T = M + slime_scan(T, user) + +/proc/slime_scan(mob/living/simple_animal/slime/T, mob/living/user) + to_chat(user, "========================") + to_chat(user, "Slime scan results:") + to_chat(user, "[T.colour] [T.is_adult ? "adult" : "baby"] slime") + to_chat(user, "Nutrition: [T.nutrition]/[T.get_max_nutrition()]") if(T.nutrition < T.get_starve_nutrition()) - user.show_message("Warning: slime is starving!", 1) + to_chat(user, "Warning: slime is starving!") else if(T.nutrition < T.get_hunger_nutrition()) - user.show_message("Warning: slime is hungry", 1) - user.show_message("Electric change strength: [T.powerlevel]", 1) - user.show_message("Health: [T.health]", 1) + to_chat(user, "Warning: slime is hungry") + to_chat(user, "Electric change strength: [T.powerlevel]") + to_chat(user, "Health: [round(T.health/T.maxHealth,0.01)*100]%") if(T.slime_mutation[4] == T.colour) - user.show_message("This slime does not evolve any further.", 1) + to_chat(user, "This slime does not evolve any further.") else if(T.slime_mutation[3] == T.slime_mutation[4]) if(T.slime_mutation[2] == T.slime_mutation[1]) - user.show_message("Possible mutation: [T.slime_mutation[3]]", 1) - user.show_message("Genetic destability: [T.mutation_chance/2]% chance of mutation on splitting", 1) + to_chat(user, "Possible mutation: [T.slime_mutation[3]]") + to_chat(user, "Genetic destability: [T.mutation_chance/2] % chance of mutation on splitting") else - user.show_message("Possible mutations: [T.slime_mutation[1]], [T.slime_mutation[2]], [T.slime_mutation[3]] (x2)", 1) - user.show_message("Genetic destability: [T.mutation_chance]% chance of mutation on splitting", 1) + to_chat(user, "Possible mutations: [T.slime_mutation[1]], [T.slime_mutation[2]], [T.slime_mutation[3]] (x2)") + to_chat(user, "Genetic destability: [T.mutation_chance] % chance of mutation on splitting") else - user.show_message("Possible mutations: [T.slime_mutation[1]], [T.slime_mutation[2]], [T.slime_mutation[3]], [T.slime_mutation[4]]", 1) - user.show_message("Genetic destability: [T.mutation_chance]% chance of mutation on splitting", 1) + to_chat(user, "Possible mutations: [T.slime_mutation[1]], [T.slime_mutation[2]], [T.slime_mutation[3]], [T.slime_mutation[4]]") + to_chat(user, "Genetic destability: [T.mutation_chance] % chance of mutation on splitting") if(T.cores > 1) - user.show_message("Anomalous slime core amount detected", 1) - user.show_message("Growth progress: [T.amount_grown]/10", 1) + to_chat(user, "Multiple cores detected") + to_chat(user, "Growth progress: [T.amount_grown]/[SLIME_EVOLUTION_THRESHOLD]") + if(T.effectmod) + to_chat(user, "Core mutation in progress: [T.effectmod]") + to_chat(user, "Progress in core mutation: [T.applied] / [SLIME_EXTRACT_CROSSING_REQUIRED]") + to_chat(user, "========================") /obj/item/bodyanalyzer name = "handheld body analyzer" diff --git a/code/game/objects/items/weapons/implants/implantchair.dm b/code/game/objects/items/weapons/implants/implantchair.dm index cef14d28796..5727fe08cd0 100644 --- a/code/game/objects/items/weapons/implants/implantchair.dm +++ b/code/game/objects/items/weapons/implants/implantchair.dm @@ -79,7 +79,7 @@ return var/mob/M = G.affecting if(M.has_buckled_mobs()) - to_chat(usr, "[M] will not fit into [src] because [M.p_they()] [M.p_have()] a slime latched onto [M.p_their()] head.") + to_chat(user, "[M] will not fit into [src] because [M.p_they()] [M.p_have()] a slime latched onto [M.p_their()] head.") return if(put_mob(M)) qdel(G) diff --git a/code/game/objects/items/weapons/scrolls.dm b/code/game/objects/items/weapons/scrolls.dm index 696d54cc3bf..79d33de586f 100644 --- a/code/game/objects/items/weapons/scrolls.dm +++ b/code/game/objects/items/weapons/scrolls.dm @@ -85,6 +85,9 @@ if(user && user.buckled) user.buckled.unbuckle_mob(user, force = TRUE) + if(user && user.has_buckled_mobs()) + user.unbuckle_all_mobs(force = TRUE) + var/list/tempL = L var/attempt = null var/success = 0 diff --git a/code/game/objects/obj_defense.dm b/code/game/objects/obj_defense.dm index 572495b503f..6f007a6bdbc 100644 --- a/code/game/objects/obj_defense.dm +++ b/code/game/objects/obj_defense.dm @@ -126,10 +126,10 @@ if(. && !play_soundeffect) playsound(src, 'sound/effects/meteorimpact.ogg', 100, 1) -/obj/attack_slime(mob/living/carbon/slime/user) +/obj/attack_slime(mob/living/simple_animal/slime/user) if(!user.is_adult) return - attack_generic(user, rand(10, 15), "melee", 1) + attack_generic(user, rand(10, 15), BRUTE, "melee", 1) /obj/mech_melee_attack(obj/mecha/M) M.do_attack_animation(src) diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm index dba81195e6e..efca449bbf3 100644 --- a/code/game/objects/structures/crates_lockers/closets.dm +++ b/code/game/objects/structures/crates_lockers/closets.dm @@ -105,7 +105,7 @@ continue if(istype(M, /mob/living/simple_animal/bot/mulebot)) continue - if(M.buckled || M.anchored) + if(M.buckled || M.anchored || M.has_buckled_mobs()) continue M.forceMove(src) diff --git a/code/game/objects/structures/inflatable.dm b/code/game/objects/structures/inflatable.dm index f4efa5452b0..03e80563224 100644 --- a/code/game/objects/structures/inflatable.dm +++ b/code/game/objects/structures/inflatable.dm @@ -90,7 +90,7 @@ attack_generic(M, M.melee_damage_upper) /obj/structure/inflatable/attack_slime(mob/user as mob) - var/mob/living/carbon/slime/S = user + var/mob/living/simple_animal/slime/S = user if(!S.is_adult) return attack_generic(user, rand(10, 15)) diff --git a/code/game/objects/structures/mirror.dm b/code/game/objects/structures/mirror.dm index 923fab9e885..f40d7f7f2de 100644 --- a/code/game/objects/structures/mirror.dm +++ b/code/game/objects/structures/mirror.dm @@ -108,7 +108,7 @@ /obj/structure/mirror/attack_slime(mob/living/user) user.changeNext_move(CLICK_CD_MELEE) - var/mob/living/carbon/slime/S = user + var/mob/living/simple_animal/slime/S = user if(!S.is_adult) return user.do_attack_animation(src) @@ -153,7 +153,7 @@ H.dna.real_name = newname if(H.mind) H.mind.name = newname - + if(newname) curse(user) @@ -197,7 +197,7 @@ if(voice_choice) curse(user) - + /obj/structure/mirror/magic/on_ui_close(mob/user) curse(user) diff --git a/code/game/verbs/suicide.dm b/code/game/verbs/suicide.dm index 0b171dac199..50b53cc7dd9 100644 --- a/code/game/verbs/suicide.dm +++ b/code/game/verbs/suicide.dm @@ -209,7 +209,7 @@ adjustOxyLoss(max(175 - getFireLoss() - getBruteLoss() - getOxyLoss(), 0)) -/mob/living/carbon/slime/verb/suicide() +/mob/living/simple_animal/slime/verb/suicide() set hidden = 1 if(stat == 2) to_chat(src, "You're already dead!") diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index 754091a30db..a6926fe3414 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -345,7 +345,7 @@ var/mob/living/carbon/human/newmob = M.change_mob_type(/mob/living/carbon/human, null, null, delmob, 1) if(posttransformoutfit && istype(newmob)) newmob.equipOutfit(posttransformoutfit) - if("slime") M.change_mob_type( /mob/living/carbon/slime , null, null, delmob, 1 ) + if("slime") M.change_mob_type( /mob/living/simple_animal/slime , null, null, delmob, 1 ) if("monkey") M.change_mob_type( /mob/living/carbon/human/monkey , null, null, delmob, 1 ) if("robot") M.change_mob_type( /mob/living/silicon/robot , null, null, delmob, 1 ) if("cat") M.change_mob_type( /mob/living/simple_animal/pet/cat , null, null, delmob, 1 ) diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm index 11664349274..57f88d20351 100644 --- a/code/modules/admin/verbs/debug.dm +++ b/code/modules/admin/verbs/debug.dm @@ -95,6 +95,16 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that to_chat(usr, "[procname] returned: [!isnull(returnval) ? returnval : "null"]") feedback_add_details("admin_verb","APC") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! +GLOBAL_VAR(AdminProcCaller) +GLOBAL_PROTECT(AdminProcCaller) + +/proc/IsAdminAdvancedProcCall() +#ifdef TESTING + return FALSE +#else + return usr && usr.client && GLOB.AdminProcCaller == usr.client.ckey +#endif + /client/proc/callproc_datum(var/A as null|area|mob|obj|turf) set category = "Debug" set name = "Atom ProcCall" diff --git a/code/modules/admin/verbs/freeze.dm b/code/modules/admin/verbs/freeze.dm index bdef649468d..4d60fb72bee 100644 --- a/code/modules/admin/verbs/freeze.dm +++ b/code/modules/admin/verbs/freeze.dm @@ -61,14 +61,12 @@ var/global/list/frozen_mob_list = list() update_icons() -/mob/living/carbon/slime/admin_Freeze(admin) +/mob/living/simple_animal/slime/admin_Freeze(admin) ..(admin) - adjustToxLoss(1010101010) //arbitrary large value + adjustHealth(1000) //arbitrary large value -/mob/living/carbon/slime/admin_unFreeze(admin) +/mob/living/simple_animal/slime/admin_unFreeze(admin) ..(admin) - adjustToxLoss(-1010101010) - stat = 0 revive() diff --git a/code/modules/events/anomaly_pyro.dm b/code/modules/events/anomaly_pyro.dm index 3c2e6025952..f281c549c97 100644 --- a/code/modules/events/anomaly_pyro.dm +++ b/code/modules/events/anomaly_pyro.dm @@ -22,7 +22,10 @@ if(newAnomaly.loc) explosion(get_turf(newAnomaly), -1,0,3, flame_range = 4) - var/mob/living/carbon/slime/S = new/mob/living/carbon/slime(get_turf(newAnomaly)) - S.colour = pick("red", "orange") - + var/turf/T = get_turf(src) + var/new_colour = pick("red", "orange") + var/mob/living/simple_animal/slime/S = new(T, new_colour) + S.rabid = TRUE + S.amount_grown = SLIME_EVOLUTION_THRESHOLD + S.Evolve() qdel(newAnomaly) \ No newline at end of file diff --git a/code/modules/food_and_drinks/kitchen_machinery/processor.dm b/code/modules/food_and_drinks/kitchen_machinery/processor.dm index 19c866fae43..394ee10384b 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/processor.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/processor.dm @@ -30,13 +30,10 @@ rating_speed = M.rating /obj/machinery/processor/process() - ..() - // The irony - // To be clear, if it's grinding, then it can't suck them up if(processing) return - var/mob/living/carbon/slime/picked_slime - for(var/mob/living/carbon/slime/slime in range(1, src)) + var/mob/living/simple_animal/slime/picked_slime + for(var/mob/living/simple_animal/slime/slime in range(1, src)) if(slime.loc == src) continue if(slime.stat) @@ -48,7 +45,7 @@ if(!P) return - visible_message("[picked_slime] is sucked into \the [src].") + visible_message("[picked_slime] is sucked into [src].") picked_slime.forceMove(src) //RECIPE DATUMS @@ -110,18 +107,18 @@ /////MOB RECIPIES///// ////////////////////// /datum/food_processor_process/mob/slime - input = /mob/living/carbon/slime + input = /mob/living/simple_animal/slime output = null /datum/food_processor_process/mob/slime/process_food(loc, what, obj/machinery/processor/processor) - var/mob/living/carbon/slime/S = what + var/mob/living/simple_animal/slime/S = what var/C = S.cores if(S.stat != DEAD) - S.loc = loc + S.forceMove(processor.drop_location()) S.visible_message("[S] crawls free of the processor!") return for(var/i in 1 to (C+processor.rating_amount-1)) - new S.coretype(loc) + new S.coretype(processor.drop_location()) feedback_add_details("slime_core_harvested","[replacetext(S.colour," ","_")]") ..() diff --git a/code/modules/mob/living/carbon/alien/alien_defense.dm b/code/modules/mob/living/carbon/alien/alien_defense.dm index d7881367d13..0f57ac11757 100644 --- a/code/modules/mob/living/carbon/alien/alien_defense.dm +++ b/code/modules/mob/living/carbon/alien/alien_defense.dm @@ -75,3 +75,12 @@ In all, this is a lot like the monkey code. /N adjustCloneLoss(damage) if(STAMINA) adjustStaminaLoss(damage) + +/mob/living/carbon/alien/attack_slime(mob/living/simple_animal/slime/M) + if(..()) //successful slime attack + var/damage = rand(5, 35) + if(M.is_adult) + damage = rand(10, 40) + adjustBruteLoss(damage) + add_attack_logs(src, M, "Slime'd for [damage] damage") + updatehealth("slime attack") \ No newline at end of file diff --git a/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm b/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm index 788b8aa936d..d6bb6c6c1ac 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm @@ -65,15 +65,6 @@ take_overall_damage(b_loss, f_loss) -/mob/living/carbon/alien/humanoid/attack_slime(mob/living/carbon/slime/M) - ..() - var/damage = rand(5, 35) - if(M.is_adult) - damage = rand(10, 40) - adjustBruteLoss(damage) - add_attack_logs(src, M, "Slime'd for [damage] damage") - return - /mob/living/carbon/alien/humanoid/restrained() if(handcuffed) return 1 diff --git a/code/modules/mob/living/carbon/alien/larva/larva.dm b/code/modules/mob/living/carbon/alien/larva/larva.dm index 5ebaaffac0c..1ba5e4530ff 100644 --- a/code/modules/mob/living/carbon/alien/larva/larva.dm +++ b/code/modules/mob/living/carbon/alien/larva/larva.dm @@ -71,16 +71,6 @@ /mob/living/carbon/alien/larva/attack_ui(slot_id) return -/mob/living/carbon/alien/larva/attack_slime(mob/living/carbon/slime/M) - ..() - var/damage = rand(5, 35) - if(M.is_adult) - damage = rand(20, 40) - adjustBruteLoss(damage) - add_attack_logs(src, M, "Slime'd for [damage] damage") - updatehealth() - return - /mob/living/carbon/alien/larva/restrained() return 0 diff --git a/code/modules/mob/living/carbon/brain/brain.dm b/code/modules/mob/living/carbon/brain/brain.dm index 8d17b84c724..34b5adf8dbf 100644 --- a/code/modules/mob/living/carbon/brain/brain.dm +++ b/code/modules/mob/living/carbon/brain/brain.dm @@ -41,7 +41,7 @@ return 1 if(istype(other, /mob/living/carbon/human)) return 1 - if(istype(other, /mob/living/carbon/slime)) + if(istype(other, /mob/living/simple_animal/slime)) return 1 return ..() diff --git a/code/modules/mob/living/carbon/carbon_defense.dm b/code/modules/mob/living/carbon/carbon_defense.dm index c583d9873b6..a89c73b6db2 100644 --- a/code/modules/mob/living/carbon/carbon_defense.dm +++ b/code/modules/mob/living/carbon/carbon_defense.dm @@ -48,16 +48,25 @@ return 1 return 0 -/mob/living/carbon/attack_slime(mob/living/carbon/slime/M) - if(..()) - var/power = M.powerlevel + rand(0,3) - Weaken(power) - Stuttering(power) - Stun(power) - var/stunprob = M.powerlevel * 7 + 10 - if(prob(stunprob) && M.powerlevel >= 8) - adjustFireLoss(M.powerlevel * rand(6,10)) - updatehealth("slime attack") +/mob/living/carbon/attack_slime(mob/living/simple_animal/slime/M) + if(..()) //successful slime attack + if(M.powerlevel > 0) + var/stunprob = M.powerlevel * 7 + 10 // 17 at level 1, 80 at level 10 + if(prob(stunprob)) + M.powerlevel -= 3 + if(M.powerlevel < 0) + M.powerlevel = 0 + + visible_message("The [M.name] has shocked [src]!", "The [M.name] has shocked you!") + + do_sparks(5, TRUE, src) + var/power = M.powerlevel + rand(0,3) + Stun(power) + if(stuttering < power) + stuttering = power + if (prob(stunprob) && M.powerlevel >= 8) + adjustFireLoss(M.powerlevel * rand(6,10)) + updatehealth("slime attack") return 1 /mob/living/carbon/is_mouth_covered(head_only = FALSE, mask_only = FALSE) diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index 87bc491f4ab..e2472513250 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -451,22 +451,22 @@ emp_act apply_damage(damage, M.melee_damage_type, affecting, armor) updatehealth("animal attack") -/mob/living/carbon/human/attack_slime(mob/living/carbon/slime/M) - ..() - var/damage = rand(1, 3) +/mob/living/carbon/human/attack_slime(mob/living/simple_animal/slime/M) + if(..()) //successful slime attack + var/damage = rand(5, 25) + if(M.is_adult) + damage = rand(10, 35) - if(M.is_adult) - damage = rand(10, 35) - else - damage = rand(5, 25) + if(check_shields(M, damage, "the [M.name]")) + return FALSE - var/dam_zone = pick("head", "chest", "groin", "l_arm", "l_hand", "r_arm", "r_hand", "l_leg", "l_foot", "r_leg", "r_foot") + var/dam_zone = pick("head", "chest", "groin", "l_arm", "l_hand", "r_arm", "r_hand", "l_leg", "l_foot", "r_leg", "r_foot") - var/obj/item/organ/external/affecting = get_organ(ran_zone(dam_zone)) - var/armor_block = run_armor_check(affecting, "melee") - apply_damage(damage, BRUTE, affecting, armor_block) - - return + var/obj/item/organ/external/affecting = get_organ(ran_zone(dam_zone)) + if(!affecting) + affecting = get_organ("chest") + var/armor_block = run_armor_check(affecting, "melee") + apply_damage(damage, BRUTE, affecting, armor_block) /mob/living/carbon/human/mech_melee_attack(obj/mecha/M) if(M.occupant.a_intent == INTENT_HARM) diff --git a/code/modules/mob/living/carbon/slime/death.dm b/code/modules/mob/living/carbon/slime/death.dm deleted file mode 100644 index 055f972df07..00000000000 --- a/code/modules/mob/living/carbon/slime/death.dm +++ /dev/null @@ -1,21 +0,0 @@ -/mob/living/carbon/slime/death(gibbed) - // Only execute the below if we successfully died - . = ..() - if(!.) - return FALSE - if(!gibbed) - if(is_adult) - var/mob/living/carbon/slime/M = new /mob/living/carbon/slime(loc) - M.colour = colour - M.rabid = 1 - is_adult = 0 - maxHealth = 150 - revive() - regenerate_icons() - number = rand(1, 1000) - name = "[colour] [is_adult ? "adult" : "baby"] slime ([number])" - return - else - visible_message("The [name] seizes up and falls limp...") - icon_state = "[colour] baby slime dead" - overlays.Cut() diff --git a/code/modules/mob/living/carbon/slime/examine.dm b/code/modules/mob/living/carbon/slime/examine.dm deleted file mode 100644 index 4dd67695e2a..00000000000 --- a/code/modules/mob/living/carbon/slime/examine.dm +++ /dev/null @@ -1,45 +0,0 @@ -/mob/living/carbon/slime/examine(mob/user) - to_chat(user, "*---------*") - ..(user) - var/msg = "" - if(src.stat == DEAD) - msg += "It is limp and unresponsive.\n" - else - if(src.getBruteLoss()) - msg += "" - if(src.getBruteLoss() < 40) - msg += "It has some punctures in its flesh!" - else - msg += "It has severe punctures and tears in its flesh!" - msg += "\n" - - switch(powerlevel) - - if(2 to 3) - msg += "It is flickering gently with a little electrical activity.\n" - - if(4 to 5) - msg += "It is glowing gently with moderate levels of electrical activity.\n" - - if(6 to 9) - msg += "It is glowing brightly with high levels of electrical activity.\n" - - if(10) - msg += "It is radiating with massive levels of electrical activity!\n" - - msg += "" - switch(wetlevel) - if(1) - msg += "It looks a bit damp.\n" - if(2) - msg += "It looks a little bit wet.\n" - if(3) - msg += "It looks wet.\n" - if(4) - msg += "It looks very wet.\n" - if(5) - msg += "It looks absolutely soaked.\n" - msg += "" - - msg += "*---------*" - to_chat(user, msg) diff --git a/code/modules/mob/living/carbon/slime/life.dm b/code/modules/mob/living/carbon/slime/life.dm deleted file mode 100644 index e3bfcb74431..00000000000 --- a/code/modules/mob/living/carbon/slime/life.dm +++ /dev/null @@ -1,570 +0,0 @@ -/mob/living/carbon/slime - var/AIproc = 0 // determines if the AI loop is activated - var/Atkcool = 0 // attack cooldown - var/Tempstun = 0 // temporary temperature stuns - var/Discipline = 0 // if a slime has been hit with a freeze gun, or wrestled/attacked off a human, they become disciplined and don't attack anymore for a while - var/SStun = 0 // stun variable - -/mob/living/carbon/slime/Life(seconds, times_fired) - if(..()) - handle_nutrition() - handle_targets() - if(!ckey) - handle_speech_and_mood() - -/mob/living/carbon/slime/breathe() - return - -/mob/living/carbon/slime/proc/AIprocess() // the master AI process - - if(AIproc || stat == DEAD || client) return - - var/hungry = 0 - if(nutrition < get_starve_nutrition()) - hungry = 2 - else if(nutrition < get_grow_nutrition() && prob(25) || nutrition < get_hunger_nutrition()) - hungry = 1 - - AIproc = 1 - - while(AIproc && stat != 2 && (attacked || hungry || rabid || Victim)) - if(Victim) // can't eat AND have this little process at the same time - break - - if(!Target || client) - break - - if(Target.health <= -70 || Target.stat == 2) - Target = null - AIproc = 0 - break - - if(Target) - for(var/mob/living/carbon/slime/M in view(1,Target)) - if(M.Victim == Target) - Target = null - AIproc = 0 - break - if(!AIproc) - break - - if(Target in view(1,src)) - if(istype(Target, /mob/living/silicon)) - if(!Atkcool) - Atkcool = 1 - spawn(45) - Atkcool = 0 - - if(Target.Adjacent(src)) - Target.attack_slime(src) - return - if(!Target.lying && prob(80)) - - if(Target.client && Target.health >= 20) - if(!Atkcool) - Atkcool = 1 - spawn(45) - Atkcool = 0 - - if(Target.Adjacent(src)) - Target.attack_slime(src) - - else - if(!Atkcool && Target.Adjacent(src)) - Feedon(Target) - - else - if(!Atkcool && Target.Adjacent(src)) - Feedon(Target) - - else - if(Target in view(7, src)) - if(!Target.Adjacent(src)) // Bug of the month candidate: slimes were attempting to move to target only if it was directly next to them, which caused them to target things, but not approach them - step_to(src, Target) - sleep(5) - - else - Target = null - AIproc = 0 - break - - var/sleeptime = movement_delay() - if(sleeptime <= 0) sleeptime = 1 - - sleep(sleeptime + 2) // this is about as fast as a player slime can go - - AIproc = 0 - -/mob/living/carbon/slime/handle_environment(datum/gas_mixture/environment) - if(!environment) - adjustToxLoss(rand(10,20)) - return - - //var/environment_heat_capacity = environment.heat_capacity() - var/loc_temp = T0C - if(istype(get_turf(src), /turf/space)) - //environment_heat_capacity = loc:heat_capacity - var/turf/heat_turf = get_turf(src) - loc_temp = heat_turf.temperature - else if(istype(loc, /obj/machinery/atmospherics/unary/cryo_cell)) - loc_temp = loc:air_contents.temperature - else - loc_temp = environment.temperature - - //Account for massive pressure differences - if(bodytemperature < (T0C + 5)) // start calculating temperature damage etc - if(bodytemperature <= (T0C - 40)) // stun temperature - Tempstun = 1 - - if(bodytemperature <= (T0C - 50)) // hurt temperature - if(bodytemperature <= 50) // sqrting negative numbers is bad - adjustToxLoss(301) //The config.health_threshold_dead is -100 by default, and slimes have 150hp (200hp for adults), - else //so the ToxLoss needs to be 300 or above to guarrantee an instant death - adjustToxLoss(round(sqrt(bodytemperature)) * 2) - else - Tempstun = 0 - - - /*moved after the temperature damage code so freeze beams can instantly kill slimes -Deity Link*/ - if(loc_temp < 310.15) // a cold place - bodytemperature += adjust_body_temperature(bodytemperature, loc_temp, 1) - else // a hot place - bodytemperature += adjust_body_temperature(bodytemperature, loc_temp, 1) - - updatehealth("handle environment") - - return //TODO: DEFERRED - -/mob/living/carbon/slime/proc/adjust_body_temperature(current, loc_temp, boost) - var/temperature = current - var/difference = abs(current-loc_temp) //get difference - var/increments// = difference/10 //find how many increments apart they are - if(difference > 50) - increments = difference/5 - else - increments = difference/10 - var/change = increments*boost // Get the amount to change by (x per increment) - var/temp_change - if(current < loc_temp) - temperature = min(loc_temp, temperature+change) - else if(current > loc_temp) - temperature = max(loc_temp, temperature-change) - temp_change = (temperature - current) - return temp_change - -/mob/living/carbon/slime/handle_chemicals_in_body() - - if(reagents) - reagents.metabolize(src) - - if(reagents.get_reagent_amount("plasma")>=5) - mutation_chance = min(mutation_chance + 5,50) //Prevents mutation chance going >50% - reagents.remove_reagent("plasma", 5) - if(reagents.get_reagent_amount("epinephrine")>=5) - mutation_chance = max(mutation_chance - 5,0) //Prevents mutation chance going <0% - reagents.remove_reagent("epinephrine", 5) - updatehealth("handle chemicals in body") - - return //TODO: DEFERRED - -/mob/living/carbon/slime/handle_regular_status_updates() - - if(is_adult) - health = 200 - (getOxyLoss() + getToxLoss() + getFireLoss() + getBruteLoss() + getCloneLoss()) - else - health = 150 - (getOxyLoss() + getToxLoss() + getFireLoss() + getBruteLoss() + getCloneLoss()) - - if(health < HEALTH_THRESHOLD_DEAD && check_death_method() && stat != DEAD) - death() - return - - else if(src.health <= HEALTH_THRESHOLD_CRIT && check_death_method()) - - if(!src.reagents.has_reagent("epinephrine")) - src.adjustOxyLoss(10) - - if(src.stat != DEAD) - src.stat = UNCONSCIOUS - - if(prob(30)) //I think this is meant to allow slimes to starve to death - adjustOxyLoss(-1) - adjustToxLoss(-1) - adjustFireLoss(-1) - adjustCloneLoss(-1) - adjustBruteLoss(-1) - - if(src.stat == DEAD) - src.lying = 1 - else - if(src.paralysis || src.stunned || src.weakened || (status_flags && FAKEDEATH)) //Stunned etc. - if(src.stunned > 0) - AdjustStunned(-1) - src.stat = 0 - if(src.weakened > 0) - AdjustWeakened(-1) - src.lying = 0 - src.stat = 0 - if(src.paralysis > 0) - AdjustParalysis(-1) - src.lying = 0 - src.stat = 0 - - else - src.lying = 0 - src.stat = 0 - - if(src.stuttering) src.stuttering = 0 - - if(src.eye_blind) - src.SetEyeBlind(0) - - src.density = !( src.lying ) - - if(src.eye_blurry > 0) - SetEyeBlurry(0) - - if(src.druggy > 0) - SetDruggy(0) - - return 1 - -/mob/living/carbon/slime/proc/handle_nutrition() - - if(docile) //God as my witness, I will never go hungry again - nutrition = 700 - return - - if(prob(15)) - nutrition -= 1 + is_adult - - if(nutrition <= 0) - nutrition = 0 - if(prob(75)) - adjustToxLoss(rand(0,5)) - - else if(nutrition >= get_grow_nutrition() && amount_grown < 10) - nutrition -= 20 - amount_grown++ - update_action_buttons_icon() - - if(amount_grown >= 10 && !Victim && !Target && !ckey) - if(is_adult) - Reproduce() - else - Evolve() - -/mob/living/carbon/slime/proc/add_nutrition(nutrition_to_add = 0, lastnut = 0) - nutrition = min((nutrition + nutrition_to_add), get_max_nutrition()) - if(nutrition >= (lastnut + 50)) - if(prob(80)) - lastnut = nutrition - powerlevel++ - if(powerlevel > 10) - powerlevel = 10 - adjustToxLoss(-10) - -/mob/living/carbon/slime/proc/handle_targets() - if(Tempstun) - if(!Victim) // not while they're eating! - canmove = 0 - else - canmove = 1 - - if(attacked > 50) attacked = 50 - - if(attacked > 0) - attacked-- - - if(Discipline > 0) - - if(Discipline >= 5 && rabid) - if(prob(60)) rabid = 0 - - if(prob(10)) - Discipline-- - - if(!client) - if(!canmove) return - - if(Victim) return // if it's eating someone already, continue eating! - - if(Target) - --target_patience - if(target_patience <= 0 || SStun || Discipline || attacked || docile) // Tired of chasing or something draws out attention - target_patience = 0 - Target = null - - if(AIproc && SStun) return - - var/hungry = 0 // determines if the slime is hungry - - if(nutrition < get_starve_nutrition()) - hungry = 2 - else if(nutrition < get_grow_nutrition() && prob(25) || nutrition < get_hunger_nutrition()) - hungry = 1 - - if(hungry == 2 && !client) // if a slime is starving, it starts losing its friends - if(Friends.len > 0 && prob(1)) - var/mob/nofriend = pick(Friends) - --Friends[nofriend] - - if(!Target) - if(will_hunt() && hungry || attacked || rabid) // Only add to the list if we need to - var/list/targets = list() - - for(var/mob/living/L in view(7,src)) - - if(isslime(L) || L.stat == DEAD) // Ignore other slimes and dead mobs - continue - - if(L in Friends) // No eating friends! - continue - - if(issilicon(L) && (rabid || attacked)) // They can't eat silicons, but they can glomp them in defence - targets += L // Possible target found! - - if(istype(L, /mob/living/carbon/human)) //Ignore slime(wo)men - var/mob/living/carbon/human/H = L - if(isslimeperson(H)) - continue - - if(!L.canmove) // Only one slime can latch on at a time. - var/notarget = 0 - for(var/mob/living/carbon/slime/M in view(1,L)) - if(M.Victim == L) - notarget = 1 - if(notarget) - continue - - targets += L // Possible target found! - - if(targets.len > 0) - if(attacked || rabid || hungry == 2) - Target = targets[1] // I am attacked and am fighting back or so hungry I don't even care - else - for(var/mob/living/carbon/C in targets) - if(!Discipline && prob(5)) - if(ishuman(C) || isalienadult(C)) - Target = C - break - - if(islarva(C) || issmall(C)) - Target = C - break - - if(Target) - target_patience = rand(5,7) - if(is_adult) - target_patience += 3 - - if(!Target) // If we have no target, we are wandering or following orders - if(Leader) - if(holding_still) - holding_still = max(holding_still - 1, 0) - else if(canmove && isturf(loc)) - step_to(src, Leader) - - else if(hungry) - if(holding_still) - holding_still = max(holding_still - hungry, 0) - else if(canmove && isturf(loc) && prob(50)) - step(src, pick(cardinal)) - - else - if(holding_still) - holding_still = max(holding_still - 1, 0) - else if(docile && pulledby) - holding_still = 10 - else if(canmove && isturf(loc) && prob(33)) - step(src, pick(cardinal)) - else if(!AIproc) - spawn() - AIprocess() - -/mob/living/carbon/slime/proc/handle_speech_and_mood() - //Mood starts here - var/newmood = "" - if(rabid || attacked) - newmood = "angry" - else if(docile) - newmood = ":3" - else if(Target) - newmood = "mischevous" - - if(!newmood) - if(Discipline && prob(25)) - newmood = "pout" - else if(prob(1)) - newmood = pick("sad", ":3", "pout") - - if((mood == "sad" || mood == ":3" || mood == "pout") && !newmood) - if(prob(75)) newmood = mood - - if(newmood != mood) // This is so we don't redraw them every time - mood = newmood - regenerate_icons() - - //Speech understanding starts here - var/to_say - if(speech_buffer.len > 0) - var/who = speech_buffer[1] // Who said it? - var/phrase = speech_buffer[2] // What did they say? - if((findtext(phrase, num2text(number)) || findtext(phrase, "slimes"))) // Talking to us - if(findtext(phrase, "hello") || findtext(phrase, "hi")) - to_say = pick("Hello...", "Hi...") - else if(findtext(phrase, "follow")) - if(Leader) - if(Leader == who) // Already following him - to_say = pick("Yes...", "Lead...", "Following...") - else if(Friends[who] > Friends[Leader]) // VIVA - Leader = who - to_say = "Yes... I follow [who]..." - else - to_say = "No... I follow [Leader]..." - else - if(Friends[who] > 2) - Leader = who - to_say = "I follow..." - else // Not friendly enough - to_say = pick("No...", "I won't follow...") - else if(findtext(phrase, "stop")) - if(Victim) // We are asked to stop feeding - if(Friends[who] > 4) - Victim = null - Target = null - if(Friends[who] < 7) - --Friends[who] - to_say = "Grrr..." // I'm angry but I do it - else - to_say = "Fine..." - else if(Target) // We are asked to stop chasing - if(Friends[who] > 3) - Target = null - if(Friends[who] < 6) - --Friends[who] - to_say = "Grrr..." // I'm angry but I do it - else - to_say = "Fine..." - else if(Leader) // We are asked to stop following - if(Leader == who) - to_say = "Yes... I'll stay..." - Leader = null - else - if(Friends[who] > Friends[Leader]) - Leader = null - to_say = "Yes... I'll stop..." - else - to_say = "No... I'll keep following..." - else if(findtext(phrase, "stay")) - if(Leader) - if(Leader == who) - holding_still = Friends[who] * 10 - to_say = "Yes... Staying..." - else if(Friends[who] > Friends[Leader]) - holding_still = (Friends[who] - Friends[Leader]) * 10 - to_say = "Yes... Staying..." - else - to_say = "No... I'll keep following..." - else - if(Friends[who] > 2) - holding_still = Friends[who] * 10 - to_say = "Yes... Staying..." - else - to_say = "No... I won't stay..." - speech_buffer = list() - - //Speech starts here - if(to_say) - say (to_say) - else if(prob(1)) - emote(pick("bounce","sway","light","vibrate","jiggle")) - else - var/t = 10 - var/slimes_near = -1 // Don't count myself - var/dead_slimes = 0 - var/friends_near = list() - for(var/mob/living/carbon/M in view(7,src)) - if(isslime(M)) - ++slimes_near - if(M.stat == DEAD) - ++dead_slimes - if(M in Friends) - t += 20 - friends_near += M - if(nutrition < get_hunger_nutrition()) t += 10 - if(nutrition < get_starve_nutrition()) t += 10 - if(prob(2) && prob(t)) - var/phrases = list() - if(Target) phrases += "[Target]... looks tasty..." - if(nutrition < get_starve_nutrition()) - phrases += "So... hungry..." - phrases += "Very... hungry..." - phrases += "Need... food..." - phrases += "Must... eat..." - else if(nutrition < get_hunger_nutrition()) - phrases += "Hungry..." - phrases += "Where is the food?" - phrases += "I want to eat..." - phrases += "Rawr..." - phrases += "Blop..." - phrases += "Blorble..." - if(rabid || attacked) - phrases += "Hrr..." - phrases += "Nhuu..." - phrases += "Unn..." - if(mood == ":3") - phrases += "Purr..." - if(attacked) - phrases += "Grrr..." - if(getToxLoss() > 30) - phrases += "Cold..." - if(getToxLoss() > 60) - phrases += "So... cold..." - phrases += "Very... cold..." - if(getToxLoss() > 90) - phrases += "..." - phrases += "C... c..." - if(Victim) - phrases += "Nom..." - phrases += "Tasty..." - if(powerlevel > 3) phrases += "Bzzz..." - if(powerlevel > 5) phrases += "Zap..." - if(powerlevel > 8) phrases += "Zap... Bzz..." - if(mood == "sad") phrases += "Bored..." - if(slimes_near) phrases += "Brother..." - if(slimes_near > 1) phrases += "Brothers..." - if(dead_slimes) phrases += "What happened?" - if(!slimes_near) - phrases += "Lonely..." - for(var/M in friends_near) - phrases += "[M]... friend..." - if(nutrition < get_hunger_nutrition()) - phrases += "[M]... feed me..." - say (pick(phrases)) - -/mob/living/carbon/slime/proc/get_max_nutrition() // Can't go above it - if(is_adult) return 1200 - else return 1000 - -/mob/living/carbon/slime/proc/get_grow_nutrition() // Above it we grow, below it we can eat - if(is_adult) return 1000 - else return 800 - -/mob/living/carbon/slime/proc/get_hunger_nutrition() // Below it we will always eat - if(is_adult) return 600 - else return 500 - -/mob/living/carbon/slime/proc/get_starve_nutrition() // Below it we will eat before everything else - if(is_adult) return 300 - else return 200 - -/mob/living/carbon/slime/proc/will_hunt(hunger = -1) // Check for being stopped from feeding and chasing - if(docile) - return 0 - if(hunger == 2 || rabid || attacked) - return 1 - if(Leader) - return 0 - if(holding_still) - return 0 - return 1 diff --git a/code/modules/mob/living/carbon/slime/powers.dm b/code/modules/mob/living/carbon/slime/powers.dm deleted file mode 100644 index 40f9060ee63..00000000000 --- a/code/modules/mob/living/carbon/slime/powers.dm +++ /dev/null @@ -1,233 +0,0 @@ -/mob/living/carbon/slime/verb/Feed() - set category = "Slime" - set desc = "This will let you feed on any valid creature in the surrounding area. This should also be used to halt the feeding process." - if(Victim) - Feedstop() - return 0 - - if(docile) - to_chat(src, "I'm not hungry anymore...") - return 0 - - if(stat) - to_chat(src, "I must be conscious to do this...") - return 0 - - var/list/choices = list() - for(var/mob/living/C in view(1,src)) - if(C!=src && !istype(C,/mob/living/carbon/slime) && Adjacent(C)) - choices += C - - var/mob/living/M = input(src,"Who do you wish to feed on?") in null|choices - if(!M) - return 0 - if(Adjacent(M)) - if(isbrain(M)) - to_chat(src, "This subject does not have an edible life energy...") - return 0 - - if(iscarbon(M) && (M.health < -70)) - to_chat(src, "This subject does not have a strong enough life energy...") - return 0 - - if(isanimal(M) && (M.health < 1))//animals don't go into crit, stupid; fixes infinite energy exploit - to_chat(src, "This subject does not have a strong enough life energy...") - return 0 - - for(var/mob/living/carbon/slime/met in view()) - if(met.Victim == M && met != src) - to_chat(src, "The [met.name] is already feeding on this subject...") - return 0 - - to_chat(src, "I have latched onto the subject and begun feeding...") - to_chat(M, "The [name] has latched onto your head!") - - Feedon(M) - return 1 - -/mob/living/carbon/slime/proc/Feedon(var/mob/living/M) - Victim = M - forceMove(M.loc) - canmove = 0 - anchored = 1 - var/lastnut = nutrition - var/fed_succesfully = 0 - var/health_minimum = -70 - if(is_adult) - icon_state = "[colour] adult slime eat" - else - icon_state = "[colour] baby slime eat" - - if(isanimal(Victim)) - health_minimum = 0 - while(Victim && Victim.health > health_minimum && stat != DEAD) - canmove = 0 - - if(Adjacent(Victim)) - forceMove(M.loc) - - if(iscarbon(Victim)) - Victim.adjustCloneLoss(rand(5,6)) - Victim.adjustToxLoss(rand(1,2)) - if(Victim.health <= 0) - Victim.adjustToxLoss(rand(2,4)) - - if(prob(15) && Victim.client) - to_chat(Victim, "[pick("You can feel your body becoming weak!", \ - "You feel like you're about to die!", \ - "You feel every part of your body screaming in agony!", \ - "A low, rolling pain passes through your body!", \ - "Your body feels as if it's falling apart!", \ - "You feel extremely weak!", \ - "A sharp, deep pain bathes every inch of your body!")]") - - fed_succesfully = 1 - - else if(health_minimum == 0) //we already know it's a simple_animal from above - Victim.adjustBruteLoss(is_adult ? rand(7, 15) : rand(4, 12)) - fed_succesfully = 1 - - else - to_chat(src, "[pick("This subject is incompatable", \ - "This subject does not have a life energy", "This subject is empty", \ - "I am not satisified", "I can not feed from this subject", \ - "I do not feel nourished", "This subject is not food")]...") - - if(fed_succesfully) - add_nutrition(rand(15,30), lastnut) - - //Heal yourself. - adjustOxyLoss(-10) - adjustBruteLoss(-10) - adjustFireLoss(-10) - adjustCloneLoss(-10) - - updatehealth("slime feeding") - if(Victim) - Victim.updatehealth("slime feeding") - - sleep(rand(15,45)) - - else - break - - if(stat == 2) - if(!is_adult) - icon_state = "[colour] baby slime dead" - - else - if(is_adult) - icon_state = "[colour] adult slime" - else - icon_state = "[colour] baby slime" - - canmove = 1 - anchored = 0 - - if(M) - if(M.health <= health_minimum) - M.canmove = 0 - if(!client) - if(Victim && !rabid && !attacked) - if(Victim.LAssailant && Victim.LAssailant != Victim) - if(prob(50)) - if(!(Victim.LAssailant in Friends)) - Friends[Victim.LAssailant] = 1 - //Friends.Add(Victim.LAssailant) // no idea why i was using the |= operator - else - ++Friends[Victim.LAssailant] - - - if(M.client && istype(src, /mob/living/carbon/human)) - if(prob(85)) - rabid = 1 // UUUNNBGHHHH GONNA EAT JUUUUUU - - if(client) - to_chat(src, "This subject does not have a strong enough life energy anymore...") - else - M.canmove = 1 - if(client) - to_chat(src, "I have stopped feeding...") - else - if(client) - to_chat(src, "I have stopped feeding...") - - Victim = null - -/mob/living/carbon/slime/proc/Feedstop() - if(Victim) - if(Victim.client) - to_chat(Victim, "[src] has let go of your head!") - Victim = null - -/mob/living/carbon/slime/proc/UpdateFeed(var/mob/M) - if(Victim) - if(Victim == M) - forceMove(M.loc) // simple "attach to head" effect! - - -/mob/living/carbon/slime/verb/Evolve() - set category = "Slime" - set desc = "This will let you evolve from baby to adult slime." - - if(stat) - to_chat(src, "I must be conscious to do this...") - return - if(!is_adult) - if(amount_grown >= 10) - is_adult = 1 - maxHealth = 200 - amount_grown = 0 - regenerate_icons() - name = text("[colour] [is_adult ? "adult" : "baby"] slime ([number])") - else - to_chat(src, "I am not ready to evolve yet...") - else - to_chat(src, "I have already evolved...") - -/mob/living/carbon/slime/verb/Reproduce() - set category = "Slime" - set desc = "This will make you split into four Slimes." - - if(stat) - to_chat(src, "I must be conscious to do this...") - return - - if(is_adult) - if(amount_grown >= 10) - if(stat) - to_chat(src, "I must be conscious to do this...") - return - - var/list/babies = list() - var/new_nutrition = round(nutrition * 0.9) - var/new_powerlevel = round(powerlevel / 4) - for(var/i=1,i<=4,i++) - var/mob/living/carbon/slime/M = new /mob/living/carbon/slime/(loc) - if(mutation_chance >= 100) - M.colour = "rainbow" - else if(prob(mutation_chance)) - M.colour = slime_mutation[rand(1,4)] - else - M.colour = colour - if(ckey) - M.nutrition = new_nutrition //Player slimes are more robust at spliting. Once an oversight of poor copypasta, now a feature! - M.powerlevel = new_powerlevel - if(i != 1) - step_away(M,src) - M.Friends = Friends.Copy() - babies += M - M.mutation_chance = Clamp(mutation_chance+(rand(5,-5)),0,100) - feedback_add_details("slime_babies_born","slimebirth_[replacetext(M.colour," ","_")]") - - var/mob/living/carbon/slime/new_slime = pick(babies) - new_slime.universal_speak = universal_speak - if(src.mind) - src.mind.transfer_to(new_slime) - else - new_slime.key = src.key - qdel(src) - else - to_chat(src, "I am not ready to reproduce yet...") - else - to_chat(src, "I am not old enough to reproduce yet...") diff --git a/code/modules/mob/living/carbon/slime/say.dm b/code/modules/mob/living/carbon/slime/say.dm deleted file mode 100644 index 2096da01360..00000000000 --- a/code/modules/mob/living/carbon/slime/say.dm +++ /dev/null @@ -1,29 +0,0 @@ -/mob/living/carbon/slime/say_quote(var/text, var/datum/language/speaking) - var/verb = "telepathically chirps" - var/ending = copytext(text, length(text)) - - if(ending == "?") - verb = "telepathically asks" - else if(ending == "!") - verb = "telepathically cries" - - return verb - -/mob/living/carbon/slime/say_understands(var/other) - if(istype(other, /mob/living/carbon/slime)) - return 1 - return ..() - -/mob/living/carbon/slime/hear_say(list/message_pieces, var/verb = "says", var/italics = 0, var/mob/speaker = null, var/sound/speech_sound, var/sound_vol) - if(speaker in Friends) - speech_buffer = list() - speech_buffer.Add(speaker) - speech_buffer.Add(lowertext(html_decode(multilingual_to_message(message_pieces)))) - ..() - -/mob/living/carbon/slime/hear_radio(list/message_pieces, var/verb="says", var/part_a, var/part_b, var/mob/speaker = null, var/hard_to_hear = 0, var/vname ="", var/atom/follow_target) - if(speaker in Friends) - speech_buffer = list() - speech_buffer.Add(speaker) - speech_buffer.Add(lowertext(html_decode(multilingual_to_message(message_pieces)))) - ..() diff --git a/code/modules/mob/living/carbon/slime/slime.dm b/code/modules/mob/living/carbon/slime/slime.dm deleted file mode 100644 index afd358ab99f..00000000000 --- a/code/modules/mob/living/carbon/slime/slime.dm +++ /dev/null @@ -1,546 +0,0 @@ -/mob/living/carbon/slime - name = "baby slime" - icon = 'icons/mob/slimes.dmi' - icon_state = "grey baby slime" - pass_flags = PASSTABLE - ventcrawler = 2 - speak_emote = list("telepathically chirps") - layer = 5 - maxHealth = 150 - health = 150 - gender = NEUTER - nutrition = 700 - see_in_dark = 8 - update_slimes = 0 - faction = list("slime","neutral") - // canstun and canweaken don't affect slimes because they ignore stun and weakened variables - // for the sake of cleanliness, though, here they are. - status_flags = CANPARALYSE|CANPUSH - - var/cores = 1 // the number of /obj/item/slime_extract's the slime has left inside - var/mutation_chance = 30 // Chance of mutating, should be between 25 and 35 - - var/powerlevel = 0 // 1-10 controls how much electricity they are generating - var/amount_grown = 0 // controls how long the slime has been overfed, if 10, grows or reproduces - - var/number = 0 // Used to understand when someone is talking to it - - var/mob/living/Victim = null // the person the slime is currently feeding on - var/mob/living/Target = null // AI variable - tells the slime to hunt this down - var/mob/living/Leader = null // AI variable - tells the slime to follow this person - - var/attacked = 0 // Determines if it's been attacked recently. Can be any number, is a cooloff-ish variable - var/rabid = 0 // If set to 1, the slime will attack and eat anything it comes in contact with - var/holding_still = 0 // AI variable, cooloff-ish for how long it's going to stay in one place - var/target_patience = 0 // AI variable, cooloff-ish for how long it's going to follow its target - - var/list/Friends = list() // A list of friends; they are not considered targets for feeding; passed down after splitting - - var/list/speech_buffer = list() // Last phrase said near it and person who said it - - var/mood = "" // To show its face - var/is_adult = 0 - var/docile = 0 - var/core_removal_stage = 0 //For removing cores. - var/mutator_used = FALSE //So you can't shove a dozen mutators into a single slime - - ///////////TIME FOR SUBSPECIES - - var/colour = "grey" - var/coretype = /obj/item/slime_extract/grey - var/list/slime_mutation[4] - -/mob/living/carbon/slime/New() - create_reagents(100) - spawn (0) - number = rand(1, 1000) - name = "[colour] [is_adult ? "adult" : "baby"] slime ([number])" - icon_state = "[colour] [is_adult ? "adult" : "baby"] slime" - real_name = name - slime_mutation = mutation_table(colour) - var/sanitizedcolour = replacetext(colour, " ", "") - coretype = text2path("/obj/item/slime_extract/[sanitizedcolour]") - ..() - -/mob/living/carbon/slime/random/New() - colour = pick("grey","orange", "metal", "blue", "purple", "dark purple", "dark blue", "green", "silver", "yellow", "gold", "yellow", "red", "silver", "pink", "cerulean", "sepia", "bluespace", "pyrite", "light pink", "oil", "adamantine", "black") - ..() - -/mob/living/carbon/slime/Destroy() - for(var/obj/machinery/computer/camera_advanced/xenobio/X in GLOB.machines) - if(src in X.stored_slimes) - X.stored_slimes -= src - return ..() - -/mob/living/carbon/slime/can_unbuckle() - return FALSE - -/mob/living/carbon/slime/can_buckle() - return FALSE - -/mob/living/carbon/slime/get_mob_buckling_height(mob/seat) - if(..()) - return 3 - -/mob/living/carbon/slime/regenerate_icons() - icon_state = "[colour] [is_adult ? "adult" : "baby"] slime" - overlays.len = 0 - if(mood) - overlays += image('icons/mob/slimes.dmi', icon_state = "aslime-[mood]") - ..() - -/mob/living/carbon/slime/movement_delay() - if(bodytemperature >= 330.23) // 135 F - return -1 // slimes become supercharged at high temperatures - - . = ..() - - var/health_deficiency = (100 - health) - if(health_deficiency >= 45) - . += (health_deficiency / 25) - - if(bodytemperature < 183.222) - . += (283.222 - bodytemperature) / 10 * 1.75 - - if(reagents) - if(reagents.has_reagent("methamphetamine")) // Meth slows slimes down - . *= 2 - - if(reagents.has_reagent("frostoil")) // Frostoil also makes them move VEEERRYYYYY slow - . *= 5 - - if(health <= 0) // if damaged, the slime moves twice as slow - . *= 2 - - . += config.slime_delay - -/mob/living/carbon/slime/ObjBump(obj/O) - if(!client && powerlevel > 0) - var/chance = 10 - switch(powerlevel) - if(1 to 2) chance = 20 - if(3 to 4) chance = 30 - if(5 to 6) chance = 40 - if(7 to 8) chance = 60 - if(9) chance = 70 - if(10) chance = 95 - if(prob(chance)) - if(istype(O, /obj/structure/window) || istype(O, /obj/structure/grille)) - if(nutrition <= get_hunger_nutrition() && !Atkcool) - if(is_adult || prob(5)) - O.attack_slime(src) - Atkcool = 1 - spawn(45) - Atkcool = 0 - -/mob/living/carbon/slime/Process_Spacemove(var/movement_dir = 0) - return 2 - -/mob/living/carbon/slime/Stat() - ..() - - statpanel("Status") - if(is_adult) - stat(null, "Health: [round((health / 200) * 100)]%") - else - stat(null, "Health: [round((health / 150) * 100)]%") - - if(client.statpanel == "Status") - if(!docile) - stat(null, "Nutrition: [nutrition]/[get_max_nutrition()]") - if(amount_grown >= 10) - if(is_adult) - stat(null, "You can reproduce!") - else - stat(null, "You can evolve!") - - stat(null,"Power Level: [powerlevel]") - -/mob/living/carbon/slime/updatehealth(reason) - . = ..() - update_health_hud() - -/mob/living/carbon/slime/proc/update_health_hud() - if(hud_used) - var/severity = 0 - var/healthpercent = (health/maxHealth) * 100 - if(stat != DEAD) - switch(healthpercent) - if(100 to INFINITY) - healths.icon_state = "slime_health0" - if(80 to 100) - healths.icon_state = "slime_health1" - severity = 1 - if(60 to 80) - healths.icon_state = "slime_health2" - severity = 2 - if(40 to 60) - healths.icon_state = "slime_health3" - severity = 3 - if(20 to 40) - healths.icon_state = "slime_health4" - severity = 4 - if(0 to 20) - healths.icon_state = "slime_health5" - severity = 5 - if(-199 to 0) - healths.icon_state = "slime_health6" - severity = 6 - else - healths.icon_state = "slime_health7" - severity = 6 - if(severity > 0) - overlay_fullscreen("brute", /obj/screen/fullscreen/brute, severity) - else - clear_fullscreen("brute") - -/mob/living/carbon/slime/adjustFireLoss(amount) - ..(-abs(amount)) // Heals them - return - -/mob/living/carbon/slime/bullet_act(var/obj/item/projectile/Proj) - attacked += 10 - ..(Proj) - return 0 - -/mob/living/carbon/slime/emp_act(severity) - powerlevel = 0 // oh no, the power! - ..() - -/mob/living/carbon/slime/ex_act(severity) - ..() - - var/b_loss = null - var/f_loss = null - switch(severity) - if(1.0) - qdel(src) - return - - if(2.0) - - b_loss += 60 - f_loss += 60 - - - if(3.0) - b_loss += 30 - - adjustBruteLoss(b_loss) - adjustFireLoss(f_loss) - - updatehealth() - - -/mob/living/carbon/slime/blob_act() - show_message(" The blob attacks you!") - adjustBruteLoss(20) - updatehealth() - return - -/mob/living/carbon/slime/MouseDrop(atom/movable/A) - if(isliving(A) && A != src && usr == src) - var/mob/living/Food = A - if(Food.Adjacent(src) && !stat && Food.stat != DEAD) //messy - Feedon(Food) - ..() - -/mob/living/carbon/slime/unEquip(obj/item/W as obj, force) - return - -/mob/living/carbon/slime/attack_ui(slot) - return - -/mob/living/carbon/slime/attack_slime(mob/living/carbon/slime/M) - ..() - if(Victim) - Victim = null - visible_message("[M] pulls [src] off!") - return - attacked += 5 - if(nutrition >= 100) //steal some nutrition. negval handled in life() - nutrition -= (50 + (5 * M.amount_grown)) - M.add_nutrition(50 + (5 * M.amount_grown)) - if(health > 0) - adjustBruteLoss(4 + (2 * M.amount_grown)) //amt_grown isn't very linear but it works - updatehealth() - M.adjustBruteLoss(-4 + (-2 * M.amount_grown)) - M.updatehealth() - -/mob/living/carbon/slime/attack_animal(mob/living/simple_animal/M) - . = ..() - if(.) - var/damage = rand(M.melee_damage_lower, M.melee_damage_upper) - attacked += 10 - adjustBruteLoss(damage) - updatehealth() - -/mob/living/carbon/slime/attack_larva(mob/living/carbon/alien/larva/L) - if(..()) //successful larva bite. - var/damage = rand(1, 3) - if(stat != DEAD) - L.amount_grown = min(L.amount_grown + damage, L.max_grown) - adjustBruteLoss(damage) - updatehealth() - -/mob/living/carbon/slime/attack_hulk(mob/living/carbon/human/user, does_attack_animation = FALSE) - if(user.a_intent == INTENT_HARM) - if(Victim || Target) - Victim = null - Target = null - anchored = 0 - if(prob(80) && !client) - Discipline++ - spawn(0) - step_away(src, user, 15) - sleep(3) - step_away(src, user, 15) - ..(user, TRUE) - playsound(loc, "punch", 25, 1, -1) - visible_message("[user] has punched [src]!", "[user] has punched [src]!") - adjustBruteLoss(15) - return TRUE - -/mob/living/carbon/slime/attack_hand(mob/living/carbon/human/M) - if(Victim) - M.do_attack_animation(src, ATTACK_EFFECT_DISARM) - if(Victim == M) - if(prob(60)) - visible_message("[M] attempts to wrestle \the [name] off!") - playsound(loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1) - - else - visible_message(" [M] manages to wrestle \the [name] off!") - playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) - - if(prob(90) && !client) - Discipline++ - - SStun = 1 - spawn(rand(45,60)) - SStun = 0 - - Victim = null - anchored = 0 - step_away(src,M) - - return - - else - if(prob(30)) - visible_message("[M] attempts to wrestle \the [name] off of [Victim]!") - playsound(loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1) - - else - visible_message(" [M] manages to wrestle \the [name] off of [Victim]!") - playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) - - if(prob(80) && !client) - Discipline++ - - if(!is_adult) - if(Discipline == 1) - attacked = 0 - - SStun = 1 - spawn(rand(55,65)) - SStun = 0 - - Victim = null - anchored = 0 - step_away(src,M) - - return - - if(..()) //To allow surgery to return properly. - return - - switch(M.a_intent) - - if(INTENT_HELP) - help_shake_act(M) - - if(INTENT_GRAB) - grabbedby(M) - - else - M.do_attack_animation(src, ATTACK_EFFECT_PUNCH) - var/damage = rand(1, 9) - attacked += 10 - if(prob(90)) - playsound(loc, "punch", 25, 1, -1) - add_attack_logs(M, src, "Melee attacked with fists") - visible_message("[M] has punched [src]!", \ - "[M] has punched [src]!") - if(stat != DEAD) - adjustBruteLoss(damage) - updatehealth() - else - playsound(loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1) - visible_message("[M] has attempted to punch [src]!") - return - -/mob/living/carbon/slime/attack_alien(mob/living/carbon/alien/humanoid/M) - if(..()) //if harm or disarm intent. - if(M.a_intent == INTENT_HARM) - if(prob(95)) - attacked += 10 - playsound(loc, 'sound/weapons/slice.ogg', 25, 1, -1) - var/damage = rand(15, 30) - if(damage >= 25) - damage = rand(20, 40) - visible_message("[M] has slashed [name]!", \ - "[M] has slashed [name]!") - else - visible_message("[M] has wounded [name]!", \ - ")[M] has wounded [name]!") - add_attack_logs(M, src, "Alien attacked") - if(stat != DEAD) - adjustBruteLoss(damage) - updatehealth() - else - playsound(loc, 'sound/weapons/slashmiss.ogg', 25, 1, -1) - visible_message("[M] has attempted to lunge at [name]!", \ - "[M] has attempted to lunge at [name]!") - - if(M.a_intent == INTENT_DISARM) - playsound(loc, 'sound/weapons/pierce.ogg', 25, 1, -1) - var/damage = 5 - attacked += 10 - - if(prob(95)) - visible_message("[M] has tackled [name]!", \ - "[M] has tackled [name]!") - - if(Victim || Target) - Victim = null - Target = null - anchored = 0 - if(prob(80) && !client) - Discipline++ - if(!isslime(src)) - if(Discipline == 1) - attacked = 0 - - SStun = 1 - spawn(rand(5,20)) - SStun = 0 - - spawn(0) - - step_away(src,M,15) - sleep(3) - step_away(src,M,15) - - else - drop_item() - visible_message("[M] has disarmed [name]!", - "[M] has disarmed [name]!") - add_attack_logs(M, src, "Alien disarmed") - adjustBruteLoss(damage) - updatehealth() - return - -/mob/living/carbon/slime/attackby(obj/item/W, mob/living/user, params) - if(istype(W,/obj/item/stack/sheet/mineral/plasma)) //Lets you feed slimes plasma. - if(user in Friends) - ++Friends[user] - else - Friends[user] = 1 - to_chat(user, "You feed the slime the plasma. It chirps happily.") - var/obj/item/stack/sheet/mineral/plasma/S = W - S.use(1) - return - else if(W.force > 0) - attacked += 10 - if(prob(25)) - user.do_attack_animation(src) - to_chat(user, "[W] passes right through [src]!") - return - if(Discipline && prob(50)) // wow, buddy, why am I getting attacked?? - Discipline = 0 - else if(W.force >= 3) - if(is_adult) - if(prob(5 + round(W.force/2))) - if(Victim || Target) - if(prob(80) && !client) - Discipline++ - - Victim = null - Target = null - anchored = 0 - - SStun = 1 - spawn(rand(5,20)) - SStun = 0 - - spawn(0) - if(user) - canmove = 0 - step_away(src, user) - if(prob(25 + W.force)) - sleep(2) - if(user) - step_away(src, user) - canmove = 1 - - else - if(prob(10 + W.force*2)) - if(Victim || Target) - if(prob(80) && !client) - Discipline++ - if(Discipline == 1) - attacked = 0 - SStun = 1 - spawn(rand(5,20)) - SStun = 0 - - Victim = null - Target = null - anchored = 0 - - spawn(0) - if(user) - canmove = 0 - step_away(src, user) - if(prob(25 + W.force*4)) - sleep(2) - if(user) - step_away(src, user) - canmove = 1 - ..() - -/mob/living/carbon/slime/restrained() - return 0 - -mob/living/carbon/slime/var/temperature_resistance = T0C+75 - -/mob/living/carbon/slime/show_inv(mob/user) - return - -/mob/living/carbon/slime/toggle_throw_mode() - return - -/mob/living/carbon/slime/water_act(volume, temperature, source, method = TOUCH) - . = ..() - - var/water_damage = rand(10, 15) * volume - adjustToxLoss(water_damage) - - if(!client && Target && volume >= 3) - Target = null - ++Discipline - -/mob/living/carbon/slime/can_use_vents() - if(Victim) - return "You cannot ventcrawl while feeding." - ..() - -/mob/living/carbon/slime/forceFed(var/obj/item/reagent_containers/food/toEat, mob/user, fullness) - if(istype(toEat, /obj/item/reagent_containers/food/drinks)) - return 1 - to_chat(user, "This creature does not seem to have a mouth!") - return 0 - -/mob/living/carbon/slime/can_hear() - . = TRUE //honestly fuck slimes and organ bullshit \ No newline at end of file diff --git a/code/modules/mob/living/carbon/slime/update_icons.dm b/code/modules/mob/living/carbon/slime/update_icons.dm deleted file mode 100644 index 2310f32a76e..00000000000 --- a/code/modules/mob/living/carbon/slime/update_icons.dm +++ /dev/null @@ -1 +0,0 @@ -//no special icon processing diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index ea3db60383d..3d3fb2b3d49 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -541,10 +541,6 @@ if(s_active && !(s_active in contents) && get_turf(s_active) != get_turf(src)) //check !( s_active in contents ) first so we hopefully don't have to call get_turf() so much. s_active.close(src) - if(update_slimes) - for(var/mob/living/carbon/slime/M in view(1,src)) - M.UpdateFeed(src) - /mob/living/proc/handle_footstep(turf/T) if(istype(T)) diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm index e9cfac7ae0a..ce758f0e856 100644 --- a/code/modules/mob/living/living_defense.dm +++ b/code/modules/mob/living/living_defense.dm @@ -277,33 +277,21 @@ return G -/mob/living/attack_slime(mob/living/carbon/slime/M) +/mob/living/attack_slime(mob/living/simple_animal/slime/M) if(!SSticker) to_chat(M, "You cannot attack people before the game has started.") return - if(M.Victim) + if(M.buckled) + if(M in buckled_mobs) + M.Feedstop() return // can't attack while eating! if(stat != DEAD) + add_attack_logs(src, M, "Slime'd") M.do_attack_animation(src) - visible_message("The [M.name] glomps [src]!", \ - "The [M.name] glomps [src]!") - - if(M.powerlevel > 0) - var/stunprob = M.powerlevel * 7 + 10 // 17 at level 1, 80 at level 10 - if(prob(stunprob)) - M.powerlevel -= 3 - if(M.powerlevel < 0) - M.powerlevel = 0 - - visible_message("The [M.name] has shocked [src]!", \ - "The [M.name] has shocked [src]!") - - do_sparks(5, 1, src) - return 1 - add_attack_logs(src, M, "Slime'd") - return + visible_message("\The [M.name] glomps [src]!", "\The [M.name] glomps you!") + return TRUE /mob/living/attack_animal(mob/living/simple_animal/M) M.face_atom(src) diff --git a/code/modules/mob/living/living_defines.dm b/code/modules/mob/living/living_defines.dm index 1e3343f90f7..5bc42caab14 100644 --- a/code/modules/mob/living/living_defines.dm +++ b/code/modules/mob/living/living_defines.dm @@ -28,7 +28,6 @@ var/on_fire = 0 //The "Are we on fire?" var var/fire_stacks = 0 //Tracks how many stacks of fire we have on, max is usually 20 - var/update_slimes = 1 var/implanting = 0 //Used for the mind-slave implant var/floating = 0 var/mob_size = MOB_SIZE_HUMAN diff --git a/code/modules/mob/living/silicon/ai/ai_defense.dm b/code/modules/mob/living/silicon/ai/ai_defense.dm index c8ffebc6647..702b745e4fc 100644 --- a/code/modules/mob/living/silicon/ai/ai_defense.dm +++ b/code/modules/mob/living/silicon/ai/ai_defense.dm @@ -4,5 +4,5 @@ return ..() -/mob/living/silicon/ai/attack_slime(mob/living/carbon/slime/user) +/mob/living/silicon/ai/attack_slime(mob/living/simple_animal/slime/user) return //immune to slimes diff --git a/code/modules/mob/living/silicon/robot/robot_defense.dm b/code/modules/mob/living/silicon/robot/robot_defense.dm index 85cc2ad5786..9b4f1089f46 100644 --- a/code/modules/mob/living/silicon/robot/robot_defense.dm +++ b/code/modules/mob/living/silicon/robot/robot_defense.dm @@ -19,7 +19,7 @@ ..() return -/mob/living/silicon/robot/attack_slime(mob/living/carbon/slime/M) +/mob/living/silicon/robot/attack_slime(mob/living/simple_animal/slime/M) if(..()) //successful slime shock flash_eyes(affect_silicon = 1) var/stunprob = M.powerlevel * 7 + 10 diff --git a/code/modules/mob/living/simple_animal/animal_defense.dm b/code/modules/mob/living/simple_animal/animal_defense.dm index 119eb1b29c0..d827bf03692 100644 --- a/code/modules/mob/living/simple_animal/animal_defense.dm +++ b/code/modules/mob/living/simple_animal/animal_defense.dm @@ -58,12 +58,12 @@ var/damage = rand(M.melee_damage_lower, M.melee_damage_upper) return attack_threshold_check(damage, M.melee_damage_type) -/mob/living/simple_animal/attack_slime(mob/living/carbon/slime/M) - ..() - var/damage = rand(15, 25) - if(M.is_adult) - damage = rand(20, 35) - attack_threshold_check(damage) +/mob/living/simple_animal/attack_slime(mob/living/simple_animal/slime/M) + if(..()) //successful slime attack + var/damage = rand(15, 25) + if(M.is_adult) + damage = rand(20, 35) + return attack_threshold_check(damage) /mob/living/simple_animal/proc/attack_threshold_check(damage, damagetype = BRUTE, armorcheck = "melee") var/temp_damage = damage diff --git a/code/modules/mob/living/simple_animal/friendly/slime.dm b/code/modules/mob/living/simple_animal/friendly/slime.dm deleted file mode 100644 index ac913170c86..00000000000 --- a/code/modules/mob/living/simple_animal/friendly/slime.dm +++ /dev/null @@ -1,60 +0,0 @@ -/mob/living/simple_animal/slime - name = "pet slime" - desc = "A lovable, domesticated slime." - icon = 'icons/mob/slimes.dmi' - icon_state = "grey baby slime" - icon_living = "grey baby slime" - icon_dead = "grey baby slime dead" - speak_emote = list("chirps") - health = 100 - maxHealth = 100 - response_help = "pets" - response_disarm = "shoos" - response_harm = "stomps on" - emote_see = list("jiggles", "bounces in place") - pass_flags = PASSTABLE - var/colour = "grey" - -/mob/living/simple_animal/slime/adult - health = 200 - maxHealth = 200 - icon_state = "grey adult slime" - icon_living = "grey adult slime" - -/mob/living/simple_animal/slime/New() - ..() - overlays += "aslime-:33" - -/mob/living/simple_animal/slime/updatehealth(reason) - . = ..() - update_health_hud() - -/mob/living/simple_animal/slime/proc/update_health_hud() - if(hud_used) - var/severity = 0 - var/healthpercent = (health/maxHealth) * 100 - switch(healthpercent) - if(100 to INFINITY) - healths.icon_state = "slime_health0" - if(80 to 100) - healths.icon_state = "slime_health1" - severity = 1 - if(60 to 80) - healths.icon_state = "slime_health2" - severity = 2 - if(40 to 60) - healths.icon_state = "slime_health3" - severity = 3 - if(20 to 40) - healths.icon_state = "slime_health4" - severity = 4 - if(1 to 20) - healths.icon_state = "slime_health5" - severity = 5 - else - healths.icon_state = "slime_health7" - severity = 6 - if(severity > 0) - overlay_fullscreen("brute", /obj/screen/fullscreen/brute, severity) - else - clear_fullscreen("brute") diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index 2e126412580..502adb937e3 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -605,7 +605,7 @@ real_name = P.tagname /mob/living/simple_animal/regenerate_icons() - cut_overlays() if(pcollar && collar_type) + cut_overlays() add_overlay("[collar_type]collar") add_overlay("[collar_type]tag") \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/slime/death.dm b/code/modules/mob/living/simple_animal/slime/death.dm new file mode 100644 index 00000000000..29a1adbd347 --- /dev/null +++ b/code/modules/mob/living/simple_animal/slime/death.dm @@ -0,0 +1,32 @@ +/mob/living/simple_animal/slime/death(gibbed) + if(stat == DEAD) + return + if(!gibbed) + if(is_adult) + var/mob/living/simple_animal/slime/M = new(loc, colour) + M.rabid = TRUE + M.regenerate_icons() + + is_adult = FALSE + maxHealth = 150 + for(var/datum/action/innate/slime/reproduce/R in actions) + R.Remove(src) + var/datum/action/innate/slime/evolve/E = new + E.Grant(src) + revive() + regenerate_icons() + update_name() + return + + if(buckled) + Feedstop(silent = TRUE) //releases ourselves from the mob we fed on. + + stat = DEAD //Temporarily set to dead for icon updates + regenerate_icons() + stat = CONSCIOUS + + return ..(gibbed) + +/mob/living/simple_animal/slime/gib() + death(TRUE) + qdel(src) \ No newline at end of file diff --git a/code/modules/mob/living/carbon/slime/emote.dm b/code/modules/mob/living/simple_animal/slime/emote.dm similarity index 95% rename from code/modules/mob/living/carbon/slime/emote.dm rename to code/modules/mob/living/simple_animal/slime/emote.dm index c938ac17214..7fc7f4c5f87 100644 --- a/code/modules/mob/living/carbon/slime/emote.dm +++ b/code/modules/mob/living/simple_animal/slime/emote.dm @@ -1,4 +1,7 @@ -/mob/living/carbon/slime/emote(act, m_type = 1, message = null, force) +/mob/living/simple_animal/slime/emote(act, m_type = 1, message = null, force) + if(stat) + return + if(findtext(act, "-", 1, null)) var/t1 = findtext(act, "-", 1, null) //param = copytext(act, t1 + 1, length(act) + 1) @@ -99,6 +102,4 @@ loc.audible_message(message) if(regenerate_icons) - regenerate_icons() - - return \ No newline at end of file + regenerate_icons() \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/slime/life.dm b/code/modules/mob/living/simple_animal/slime/life.dm new file mode 100644 index 00000000000..efd4c19d55c --- /dev/null +++ b/code/modules/mob/living/simple_animal/slime/life.dm @@ -0,0 +1,617 @@ + +/mob/living/simple_animal/slime + var/AIproc = 0 // determines if the AI loop is activated + var/Atkcool = 0 // attack cooldown + var/Tempstun = 0 // temporary temperature stuns + var/Discipline = 0 // if a slime has been hit with a freeze gun, or wrestled/attacked off a human, they become disciplined and don't attack anymore for a while + var/SStun = 0 // stun variable + + +/mob/living/simple_animal/slime/Life() + set invisibility = 0 + if(notransform) + return + if(..()) + if(buckled) + handle_feeding() + if(!stat) // Slimes in stasis don't lose nutrition, don't change mood and don't respond to speech + handle_nutrition() + if(QDELETED(src)) // Stop if the slime split during handle_nutrition() + return + reagents.remove_all(0.5 * REAGENTS_METABOLISM * reagents.reagent_list.len) //Slimes are such snowflakes + handle_targets() + if(!ckey) + handle_mood() + handle_speech() + +// Unlike most of the simple animals, slimes support UNCONSCIOUS +/mob/living/simple_animal/slime/update_stat() + if(stat == UNCONSCIOUS && health > 0) + return + ..() + +/mob/living/simple_animal/slime/proc/AIprocess() // the master AI process + + if(AIproc || stat || client) + return + + var/hungry = 0 + if (nutrition < get_starve_nutrition()) + hungry = 2 + else if (nutrition < get_grow_nutrition() && prob(25) || nutrition < get_hunger_nutrition()) + hungry = 1 + + AIproc = 1 + + while(AIproc && stat != DEAD && (attacked || hungry || rabid || buckled)) + if(!canmove) //also covers buckling. Not sure why buckled is in the while condition if we're going to immediately break, honestly + break + + if(!Target || client) + break + + if(Target.health <= -70 || Target.stat == DEAD) + Target = null + AIproc = 0 + break + + if(Target) + if(locate(/mob/living/simple_animal/slime) in Target.buckled_mobs) + Target = null + AIproc = 0 + break + if(!AIproc) + break + + if(Target in view(1,src)) + if(!CanFeedon(Target)) //If they're not able to be fed upon, ignore them. + if(!Atkcool) + Atkcool = TRUE + addtimer(VARSET_CALLBACK(src, Atkcool, FALSE), 4.5 SECONDS) + + if(Target.Adjacent(src)) + Target.attack_slime(src) + break + if(!Target.lying && prob(80)) + + if(Target.client && Target.health >= 20) + if(!Atkcool) + Atkcool = TRUE + addtimer(VARSET_CALLBACK(src, Atkcool, FALSE), 4.5 SECONDS) + + if(Target.Adjacent(src)) + Target.attack_slime(src) + + else + if(!Atkcool && Target.Adjacent(src)) + Feedon(Target) + + else + if(!Atkcool && Target.Adjacent(src)) + Feedon(Target) + + else if(Target in view(7, src)) + if(!Target.Adjacent(src)) + // Bug of the month candidate: slimes were attempting to move to target only if it was directly next to them, which caused them to target things, but not approach them + step_to(src, Target) + else + Target = null + AIproc = 0 + break + + var/sleeptime = movement_delay() + if(sleeptime <= 0) + sleeptime = 1 + + sleep(sleeptime + 2) // this is about as fast as a player slime can go + + AIproc = 0 + +/mob/living/simple_animal/slime/handle_environment(datum/gas_mixture/environment) + if(!environment) + return + + var/loc_temp = get_temperature(environment) + + adjust_bodytemperature(adjust_body_temperature(bodytemperature, loc_temp, 1)) + + //Account for massive pressure differences + + if(bodytemperature < (T0C + 5)) // start calculating temperature damage etc + if(bodytemperature <= (T0C - 40)) // stun temperature + Tempstun = 1 + + if(bodytemperature <= (T0C - 50)) // hurt temperature + if(bodytemperature <= 50) // sqrting negative numbers is bad + adjustBruteLoss(200) + else + adjustBruteLoss(round(sqrt(bodytemperature)) * 2) + + else + Tempstun = 0 + + updatehealth("handle environment") + + + return //TODO: DEFERRED + +/mob/living/simple_animal/slime/proc/adjust_body_temperature(current, loc_temp, boost) + var/temperature = current + var/difference = abs(current - loc_temp) //get difference + var/increments// = difference/10 //find how many increments apart they are + if(difference > 50) + increments = difference / 5 + else + increments = difference / 10 + var/change = increments * boost // Get the amount to change by (x per increment) + var/temp_change + if(current < loc_temp) + temperature = min(loc_temp, temperature+change) + else if(current > loc_temp) + temperature = max(loc_temp, temperature-change) + temp_change = (temperature - current) + return temp_change + +/mob/living/simple_animal/slime/handle_status_effects() + ..() + if(prob(30) && !stat) + adjustBruteLoss(-1) + +/mob/living/simple_animal/slime/proc/handle_feeding() + if(!ismob(buckled)) + return + var/mob/M = buckled + + if(stat) + Feedstop(silent = TRUE) + + if(M.stat == DEAD) // our victim died + if(!client) + if(!rabid && !attacked) + if(M.LAssailant && M.LAssailant != M) + if(prob(50)) + if(!(M.LAssailant in Friends)) + Friends[M.LAssailant] = 1 + else + ++Friends[M.LAssailant] + else + to_chat(src, "This subject does not have a strong enough life energy anymore...") + + if(M.client && ishuman(M)) + if(prob(85)) + rabid = 1 //we go rabid after finishing to feed on a human with a client. + + Feedstop() + return + + if(iscarbon(M)) + var/mob/living/carbon/C = M + C.adjustCloneLoss(rand(2, 4)) + C.adjustToxLoss(rand(1, 2)) + + if(prob(10) && C.client) + to_chat(C, "[pick("You can feel your body becoming weak!", \ + "You feel like you're about to die!", \ + "You feel every part of your body screaming in agony!", \ + "A low, rolling pain passes through your body!", \ + "Your body feels as if it's falling apart!", \ + "You feel extremely weak!", \ + "A sharp, deep pain bathes every inch of your body!")]") + + else if(isanimal(M)) + var/mob/living/simple_animal/SA = M + + var/totaldamage = 0 //total damage done to this unfortunate animal + totaldamage += SA.adjustCloneLoss(rand(2, 4)) + totaldamage += SA.adjustToxLoss(rand(1, 2)) + + if(totaldamage <= 0) //if we did no(or negative!) damage to it, stop + Feedstop(0, 0) + return + + else + Feedstop(0, 0) + return + + add_nutrition(rand(7, 15)) + + //Heal yourself. + adjustBruteLoss(-3) + +/mob/living/simple_animal/slime/proc/handle_nutrition() + + if(docile) //God as my witness, I will never go hungry again + set_nutrition(700) //fuck you for using the base nutrition var + return + + if(prob(15)) + adjust_nutrition(-(1 + is_adult)) + + if(nutrition <= 0) + set_nutrition(0) + if(prob(75)) + adjustBruteLoss(rand(0, 5)) + + else if(nutrition >= get_grow_nutrition() && amount_grown < SLIME_EVOLUTION_THRESHOLD) + adjust_nutrition(-20) + amount_grown++ + update_action_buttons_icon() + + if(amount_grown >= SLIME_EVOLUTION_THRESHOLD && !buckled && !Target && !ckey) + if(is_adult) + Reproduce() + else + Evolve() + +/mob/living/simple_animal/slime/proc/add_nutrition(nutrition_to_add = 0) + set_nutrition(min((nutrition + nutrition_to_add), get_max_nutrition())) + if(nutrition >= get_grow_nutrition()) + if(powerlevel<10) + if(prob(30-powerlevel*2)) + powerlevel++ + else if(nutrition >= get_hunger_nutrition() + 100) //can't get power levels unless you're a bit above hunger level. + if(powerlevel<5) + if(prob(25-powerlevel*5)) + powerlevel++ + + + + +/mob/living/simple_animal/slime/proc/handle_targets() + update_canmove() + if(Tempstun) + if(!buckled) // not while they're eating! + canmove = 0 + else + canmove = 1 + + if(attacked > 50) + attacked = 50 + + if(attacked > 0) + attacked-- + + if(Discipline > 0) + + if(Discipline >= 5 && rabid) + if(prob(60)) + rabid = 0 + + if(prob(10)) + Discipline-- + + if(!client) + if(!canmove) + return + + if(buckled) + return // if it's eating someone already, continue eating! + + if(Target) + --target_patience + if (target_patience <= 0 || SStun > world.time || Discipline || attacked || docile) // Tired of chasing or something draws out attention + target_patience = 0 + Target = null + + if(AIproc && SStun > world.time) + return + + var/hungry = 0 // determines if the slime is hungry + + if (nutrition < get_starve_nutrition()) + hungry = 2 + else if (nutrition < get_grow_nutrition() && prob(25) || nutrition < get_hunger_nutrition()) + hungry = 1 + + if(hungry == 2 && !client) // if a slime is starving, it starts losing its friends + if(Friends.len > 0 && prob(1)) + var/mob/nofriend = pick(Friends) + --Friends[nofriend] + + if(!Target) + if(will_hunt() && hungry || attacked || rabid) // Only add to the list if we need to + var/list/targets = list() + + for(var/mob/living/L in view(7,src)) + + if(isslime(L) || L.stat == DEAD) // Ignore other slimes and dead mobs + continue + + if(L in Friends) // No eating friends! + continue + + var/ally = FALSE + for(var/F in faction) + if(F == "neutral") //slimes are neutral so other mobs not target them, but they can target neutral mobs + continue + if(F in L.faction) + ally = TRUE + break + if(ally) + continue + + if(issilicon(L) && (rabid || attacked)) // They can't eat silicons, but they can glomp them in defence + targets += L // Possible target found! + + if(locate(/mob/living/simple_animal/slime) in L.buckled_mobs) // Only one slime can latch on at a time. + continue + + targets += L // Possible target found! + + if(targets.len > 0) + if(attacked || rabid || hungry == 2) + Target = targets[1] // I am attacked and am fighting back or so hungry I don't even care + else + for(var/mob/living/carbon/C in targets) + if(!Discipline && prob(5)) + if(ishuman(C) || isalienadult(C)) + Target = C + break + + if(islarva(C) || issmall(C)) + Target = C + break + + if (Target) + target_patience = rand(5, 7) + if(is_adult) + target_patience += 3 + + if(!Target) // If we have no target, we are wandering or following orders + if (Leader) + if(holding_still) + holding_still = max(holding_still - 1, 0) + else if(canmove && isturf(loc)) + step_to(src, Leader) + + else if(hungry) + if (holding_still) + holding_still = max(holding_still - hungry, 0) + else if(canmove && isturf(loc) && prob(50)) + step(src, pick(cardinal)) + + else + if(holding_still) + holding_still = max(holding_still - 1, 0) + else if (docile && pulledby) + holding_still = 10 + else if(canmove && isturf(loc) && prob(33)) + step(src, pick(cardinal)) + else if(!AIproc) + INVOKE_ASYNC(src, .proc/AIprocess) + +/mob/living/simple_animal/slime/handle_automated_movement() + return //slime random movement is currently handled in handle_targets() + +/mob/living/simple_animal/slime/handle_automated_speech() + return //slime random speech is currently handled in handle_speech() + +/mob/living/simple_animal/slime/proc/handle_mood() + var/newmood = "" + if (rabid || attacked) + newmood = "angry" + else if (docile) + newmood = ":3" + else if (Target) + newmood = "mischievous" + + if (!newmood) + if (Discipline && prob(25)) + newmood = "pout" + else if (prob(1)) + newmood = pick("sad", ":3", "pout") + + if ((mood == "sad" || mood == ":3" || mood == "pout") && !newmood) + if(prob(75)) + newmood = mood + + if(newmood != mood) // This is so we don't redraw them every time + mood = newmood + regenerate_icons() + +/mob/living/simple_animal/slime/proc/handle_speech() + //Speech understanding starts here + var/to_say + if(speech_buffer.len > 0) + var/who = speech_buffer[1] // Who said it? + var/phrase = speech_buffer[2] // What did they say? + if((findtext(phrase, num2text(number)) || findtext(phrase, "slimes"))) // Talking to us + if(findtext(phrase, "hello") || findtext(phrase, "hi")) + to_say = pick("Hello...", "Hi...") + else if(findtext(phrase, "follow")) + if(Leader) + if(Leader == who) // Already following him + to_say = pick("Yes...", "Lead...", "Follow...") + else if(Friends[who] > Friends[Leader]) // VIVA + Leader = who + to_say = "Yes... I follow [who]..." + else + to_say = "No... I follow [Leader]..." + else + if(Friends[who] >= SLIME_FRIENDSHIP_FOLLOW) + Leader = who + to_say = "I follow..." + else // Not friendly enough + to_say = pick("No...", "I no follow...") + else if(findtext(phrase, "stop")) + if(buckled) // We are asked to stop feeding + if (Friends[who] >= SLIME_FRIENDSHIP_STOPEAT) + Feedstop() + Target = null + if (Friends[who] < SLIME_FRIENDSHIP_STOPEAT_NOANGRY) + --Friends[who] + to_say = "Grrr..." // I'm angry but I do it + else + to_say = "Fine..." + else if(Target) // We are asked to stop chasing + if(Friends[who] >= SLIME_FRIENDSHIP_STOPCHASE) + Target = null + if(Friends[who] < SLIME_FRIENDSHIP_STOPCHASE_NOANGRY) + --Friends[who] + to_say = "Grrr..." // I'm angry but I do it + else + to_say = "Fine..." + else if(Leader) // We are asked to stop following + if(Leader == who) + to_say = "Yes... I stay..." + Leader = null + else + if(Friends[who] > Friends[Leader]) + Leader = null + to_say = "Yes... I stop..." + else + to_say = "No... keep follow..." + else if(findtext(phrase, "stay")) + if(Leader) + if (Leader == who) + holding_still = Friends[who] * 10 + to_say = "Yes... stay..." + else if(Friends[who] > Friends[Leader]) + holding_still = (Friends[who] - Friends[Leader]) * 10 + to_say = "Yes... stay..." + else + to_say = "No... keep follow..." + else + if(Friends[who] >= SLIME_FRIENDSHIP_STAY) + holding_still = Friends[who] * 10 + to_say = "Yes... stay..." + else + to_say = "No... won't stay..." + else if(findtext(phrase, "attack")) + if(rabid && prob(20)) + Target = who + AIprocess() //Wake up the slime's Target AI, needed otherwise this doesn't work + to_say = "ATTACK!?!?" + else if(Friends[who] >= SLIME_FRIENDSHIP_ATTACK) + for(var/mob/living/L in view(7,src)-list(src,who)) + if(findtext(phrase, lowertext(L.name))) + if(isslime(L)) + to_say = "NO... [L] slime friend" + --Friends[who] //Don't ask a slime to attack its friend + else if(!Friends[L] || Friends[L] < 1) + Target = L + AIprocess()//Wake up the slime's Target AI, needed otherwise this doesn't work + to_say = "Ok... I attack [Target]" + else + to_say = "No... like [L] ..." + --Friends[who] //Don't ask a slime to attack its friend + break + else + to_say = "No... no listen" + + speech_buffer = list() + + //Speech starts here + if(to_say) + say (to_say) + else if(prob(1)) + emote(pick("bounce", "sway", "light", "vibrate", "jiggle")) + else + var/t = 10 + var/slimes_near = 0 + var/dead_slimes = 0 + var/friends_near = list() + for(var/mob/living/L in view(7,src)) + if(isslime(L) && L != src) + ++slimes_near + if (L.stat == DEAD) + ++dead_slimes + if(L in Friends) + t += 20 + friends_near += L + if(nutrition < get_hunger_nutrition()) + t += 10 + if(nutrition < get_starve_nutrition()) + t += 10 + if(prob(2) && prob(t)) + var/phrases = list() + if(Target) + phrases += "[Target]... look yummy..." + if(nutrition < get_starve_nutrition()) + phrases += "So... hungry..." + phrases += "Very... hungry..." + phrases += "Need... food..." + phrases += "Must... eat..." + else if(nutrition < get_hunger_nutrition()) + phrases += "Hungry..." + phrases += "Where food?" + phrases += "I want to eat..." + phrases += "Rawr..." + phrases += "Blop..." + phrases += "Blorble..." + if(rabid || attacked) + phrases += "Hrr..." + phrases += "Nhuu..." + phrases += "Unn..." + if(mood == ":3") + phrases += "Purr..." + if(attacked) + phrases += "Grrr..." + if(bodytemperature < T0C) + phrases += "Cold..." + if(bodytemperature < T0C - 30) + phrases += "So... cold..." + phrases += "Very... cold..." + if(bodytemperature < T0C - 50) + phrases += "..." + phrases += "C... c..." + if(buckled) + phrases += "Nom..." + phrases += "Yummy..." + if(powerlevel > 3) + phrases += "Bzzz..." + if(powerlevel > 5) + phrases += "Zap..." + if(powerlevel > 8) + phrases += "Zap... Bzz..." + if(mood == "sad") + phrases += "Bored..." + if(slimes_near) + phrases += "Slime friend..." + if(slimes_near > 1) + phrases += "Slime friends..." + if(dead_slimes) + phrases += "What happened?" + if(!slimes_near) + phrases += "Lonely..." + for(var/M in friends_near) + phrases += "[M]... friend..." + if(nutrition < get_hunger_nutrition()) + phrases += "[M]... feed me..." + if(!stat) + say (pick(phrases)) + +/mob/living/simple_animal/slime/proc/get_max_nutrition() // Can't go above it + if(is_adult) + return 1200 + else + return 1000 + +/mob/living/simple_animal/slime/proc/get_grow_nutrition() // Above it we grow, below it we can eat + if(is_adult) + return 1000 + else + return 800 + +/mob/living/simple_animal/slime/proc/get_hunger_nutrition() // Below it we will always eat + if(is_adult) + return 600 + else + return 500 + +/mob/living/simple_animal/slime/proc/get_starve_nutrition() // Below it we will eat before everything else + if(is_adult) + return 300 + else + return 200 + +/mob/living/simple_animal/slime/proc/will_hunt(hunger = -1) // Check for being stopped from feeding and chasing + if(docile) + return 0 + if(hunger == 2 || rabid || attacked) + return 1 + if(Leader) + return 0 + if(holding_still) + return 0 + return 1 \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/slime/powers.dm b/code/modules/mob/living/simple_animal/slime/powers.dm new file mode 100644 index 00000000000..bd9d001f12f --- /dev/null +++ b/code/modules/mob/living/simple_animal/slime/powers.dm @@ -0,0 +1,215 @@ +#define SIZE_DOESNT_MATTER -1 +#define BABIES_ONLY 0 +#define ADULTS_ONLY 1 + +#define NO_GROWTH_NEEDED 0 +#define GROWTH_NEEDED 1 + +/datum/action/innate/slime + check_flags = AB_CHECK_CONSCIOUS + icon_icon = 'icons/mob/actions/actions_slime.dmi' + background_icon_state = "bg_alien" + var/needs_growth = NO_GROWTH_NEEDED + +/datum/action/innate/slime/IsAvailable() + if(..()) + var/mob/living/simple_animal/slime/S = owner + if(needs_growth == GROWTH_NEEDED) + if(S.amount_grown >= SLIME_EVOLUTION_THRESHOLD) + return 1 + return 0 + return 1 + +/mob/living/simple_animal/slime/verb/Feed() + set category = "Slime" + set desc = "This will let you feed on any valid creature in the surrounding area. This should also be used to halt the feeding process." + + if(stat) + return 0 + + var/list/choices = list() + for(var/mob/living/C in view(1,src)) + if(C!=src && Adjacent(C)) + choices += C + + var/mob/living/M = input(src,"Who do you wish to feed on?") in null|choices + if(!M) + return 0 + if(CanFeedon(M)) + Feedon(M) + return 1 + +/datum/action/innate/slime/feed + name = "Feed" + button_icon_state = "slimeeat" + + +/datum/action/innate/slime/feed/Activate() + var/mob/living/simple_animal/slime/S = owner + S.Feed() + +/mob/living/simple_animal/slime/proc/CanFeedon(mob/living/M, silent = FALSE) + if(!Adjacent(M)) + return FALSE + + if(buckled) + Feedstop() + return FALSE + + if(issilicon(M)) + return FALSE + + if(isanimal(M)) + var/mob/living/simple_animal/S = M + if(S.damage_coeff[TOX] <= 0 && S.damage_coeff[CLONE] <= 0) //The creature wouldn't take any damage, it must be too weird even for us. + if(silent) + return FALSE + to_chat(src, "[pick("This subject is incompatible", \ + "This subject does not have life energy", "This subject is empty", \ + "I am not satisified", "I can not feed from this subject", \ + "I do not feel nourished", "This subject is not food")]!") + return FALSE + + if(isslime(M)) + if(silent) + return FALSE + to_chat(src, "I can't latch onto another slime...") + return FALSE + + if(docile) + if(silent) + return FALSE + to_chat(src, "I'm not hungry anymore...") + return FALSE + + if(stat) + if(silent) + return FALSE + to_chat(src, "I must be conscious to do this...") + return FALSE + + if(M.stat == DEAD) + if(silent) + return FALSE + to_chat(src, "This subject does not have a strong enough life energy...") + return FALSE + + if(locate(/mob/living/simple_animal/slime) in M.buckled_mobs) + if(silent) + return FALSE + to_chat(src, "Another slime is already feeding on this subject...") + return FALSE + return TRUE + +/mob/living/simple_animal/slime/proc/Feedon(mob/living/M) + M.unbuckle_all_mobs(force = TRUE) //Slimes rip other mobs (eg: shoulder parrots) off (Slimes Vs Slimes is already handled in CanFeedon()) + if(M.buckle_mob(src, force = TRUE)) + layer = M.layer + 0.01 //appear above the target mob + M.visible_message("[name] has latched onto [M]!", \ + "[name] has latched onto [M]!") + else + to_chat(src, "I have failed to latch onto the subject!") + +/mob/living/simple_animal/slime/proc/Feedstop(silent = FALSE, living = 1) + if(buckled) + if(!living) + to_chat(src, "[pick("This subject is incompatible", \ + "This subject does not have life energy", "This subject is empty", \ + "I am not satisified", "I can not feed from this subject", \ + "I do not feel nourished", "This subject is not food")]!") + if(!silent) + visible_message("[src] has let go of [buckled]!", \ + "I stopped feeding.") + layer = initial(layer) + buckled.unbuckle_mob(src,force=TRUE) + +/mob/living/simple_animal/slime/verb/Evolve() + set category = "Slime" + set desc = "This will let you evolve from baby to adult slime." + + if(stat) + to_chat(src, "I must be conscious to do this...") + return + if(!is_adult) + if(amount_grown >= SLIME_EVOLUTION_THRESHOLD) + is_adult = 1 + maxHealth = 200 + amount_grown = 0 + for(var/datum/action/innate/slime/evolve/E in actions) + E.Remove(src) + regenerate_icons() + update_name() + else + to_chat(src, "I am not ready to evolve yet...") + else + to_chat(src, "I have already evolved...") + +/datum/action/innate/slime/evolve + name = "Evolve" + button_icon_state = "slimegrow" + needs_growth = GROWTH_NEEDED + +/datum/action/innate/slime/evolve/Activate() + var/mob/living/simple_animal/slime/S = owner + S.Evolve() + if(S.is_adult) + var/datum/action/innate/slime/reproduce/A = new + A.Grant(S) + +/mob/living/simple_animal/slime/verb/Reproduce() + set category = "Slime" + set desc = "This will make you split into four Slimes." + + if(stat) + to_chat(src, "I must be conscious to do this...") + return + + if(is_adult) + if(amount_grown >= SLIME_EVOLUTION_THRESHOLD) + if(stat) + to_chat(src, "I must be conscious to do this...") + return + + var/list/babies = list() + var/new_nutrition = round(nutrition * 0.9) + var/new_powerlevel = round(powerlevel / 4) + for(var/i=1,i<=4,i++) + var/child_colour + if(mutation_chance >= 100) + child_colour = "rainbow" + else if(prob(mutation_chance)) + child_colour = slime_mutation[rand(1,4)] + else + child_colour = colour + var/mob/living/simple_animal/slime/M + M = new(loc, child_colour) + if(ckey) + M.set_nutrition(new_nutrition) //Player slimes are more robust at spliting. Once an oversight of poor copypasta, now a feature! + M.powerlevel = new_powerlevel + if(i != 1) + step_away(M,src) + M.Friends = Friends.Copy() + babies += M + M.mutation_chance = Clamp(mutation_chance+(rand(5,-5)),0,100) + feedback_add_details("slime_babies_born", "slimebirth_[replacetext(M.colour," ","_")]") + + var/mob/living/simple_animal/slime/new_slime = pick(babies) + new_slime.a_intent = INTENT_HARM + if(src.mind) + src.mind.transfer_to(new_slime) + else + new_slime.key = src.key + qdel(src) + else + to_chat(src, "I am not ready to reproduce yet...") + else + to_chat(src, "I am not old enough to reproduce yet...") + +/datum/action/innate/slime/reproduce + name = "Reproduce" + button_icon_state = "slimesplit" + needs_growth = GROWTH_NEEDED + +/datum/action/innate/slime/reproduce/Activate() + var/mob/living/simple_animal/slime/S = owner + S.Reproduce() diff --git a/code/modules/mob/living/simple_animal/slime/say.dm b/code/modules/mob/living/simple_animal/slime/say.dm new file mode 100644 index 00000000000..01269aab8aa --- /dev/null +++ b/code/modules/mob/living/simple_animal/slime/say.dm @@ -0,0 +1,18 @@ +/mob/living/simple_animal/slime/say_quote(text, datum/language/speaking) + var/verb = "blorbles" + var/ending = copytext(text, length(text)) + + if(ending == "?") + verb = "inquisitively blorbles" + else if(ending == "!") + verb = "loudly blorbles" + + return verb + +/mob/living/simple_animal/slime/hear_say(list/message_pieces, verb = "says", italics = 0, mob/speaker = null, sound/speech_sound, sound_vol) + if(speaker != src && !stat) + if(speaker in Friends) + speech_buffer = list() + speech_buffer.Add(speaker) + speech_buffer.Add(lowertext(html_decode(multilingual_to_message(message_pieces)))) + ..() diff --git a/code/modules/mob/living/simple_animal/slime/slime.dm b/code/modules/mob/living/simple_animal/slime/slime.dm new file mode 100644 index 00000000000..a325ecfdefe --- /dev/null +++ b/code/modules/mob/living/simple_animal/slime/slime.dm @@ -0,0 +1,505 @@ +/mob/living/simple_animal/slime + name = "grey baby slime (123)" + icon = 'icons/mob/slimes.dmi' + icon_state = "grey baby slime" + pass_flags = PASSTABLE | PASSGRILLE + ventcrawler = VENTCRAWLER_ALWAYS + gender = NEUTER + var/is_adult = 0 + var/docile = 0 + faction = list("slime", "neutral") + + harm_intent_damage = 5 + icon_living = "grey baby slime" + icon_dead = "grey baby slime dead" + response_help = "pets" + response_disarm = "shoos" + response_harm = "stomps on" + emote_see = list("jiggles", "bounces in place") + speak_emote = list("blorbles") + + atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) + + maxHealth = 150 + health = 150 + healable = 0 + gender = NEUTER + + see_in_dark = 8 + + // canstun and canknockdown don't affect slimes because they ignore stun and knockdown variables + // for the sake of cleanliness, though, here they are. + status_flags = CANPARALYSE | CANPUSH + + var/cores = 1 // the number of /obj/item/slime_extract's the slime has left inside + var/mutation_chance = 30 // Chance of mutating, should be between 25 and 35 + + var/powerlevel = 0 // 1-10 controls how much electricity they are generating + var/amount_grown = 0 // controls how long the slime has been overfed, if 10, grows or reproduces + + var/number = 0 // Used to understand when someone is talking to it + + var/mob/living/Target = null // AI variable - tells the slime to hunt this down + var/mob/living/Leader = null // AI variable - tells the slime to follow this person + + var/attacked = 0 // Determines if it's been attacked recently. Can be any number, is a cooloff-ish variable + var/rabid = 0 // If set to 1, the slime will attack and eat anything it comes in contact with + var/holding_still = 0 // AI variable, cooloff-ish for how long it's going to stay in one place + var/target_patience = 0 // AI variable, cooloff-ish for how long it's going to follow its target + + var/list/Friends = list() // A list of friends; they are not considered targets for feeding; passed down after splitting + + var/list/speech_buffer = list() // Last phrase said near it and person who said it + + var/mood = "" // To show its face + var/mutator_used = FALSE //So you can't shove a dozen mutators into a single slime + var/force_stasis = FALSE + + var/static/regex/slime_name_regex = new("\\w+ (baby|adult) slime \\(\\d+\\)") + ///////////TIME FOR SUBSPECIES + + var/colour = "grey" + var/coretype = /obj/item/slime_extract/grey + var/list/slime_mutation[4] + + var/static/list/slime_colours = list("rainbow", "grey", "purple", "metal", "orange", + "blue", "dark blue", "dark purple", "yellow", "silver", "pink", "red", + "gold", "green", "adamantine", "oil", "light pink", "bluespace", + "cerulean", "sepia", "black", "pyrite") + + ///////////CORE-CROSSING CODE + + var/effectmod //What core modification is being used. + var/applied = 0 //How many extracts of the modtype have been applied. + + +/mob/living/simple_animal/slime/Initialize(mapload, new_colour = "grey", new_is_adult = FALSE) + var/datum/action/innate/slime/feed/F = new + F.Grant(src) + + is_adult = new_is_adult + + if(is_adult) + var/datum/action/innate/slime/reproduce/R = new + R.Grant(src) + health = 200 + maxHealth = 200 + else + var/datum/action/innate/slime/evolve/E = new + E.Grant(src) + create_reagents(100) + set_colour(new_colour) + . = ..() + set_nutrition(700) + add_language("Bubblish") + +/mob/living/simple_animal/slime/Destroy() + for(var/A in actions) + var/datum/action/AC = A + AC.Remove(src) + for(var/obj/machinery/computer/camera_advanced/xenobio/X in GLOB.machines) + if(src in X.stored_slimes) + X.stored_slimes -= src + return ..() + +/mob/living/simple_animal/slime/proc/set_colour(new_colour) + colour = new_colour + update_name() + slime_mutation = mutation_table(colour) + var/sanitizedcolour = replacetext(colour, " ", "") + coretype = text2path("/obj/item/slime_extract/[sanitizedcolour]") + regenerate_icons() + +/mob/living/simple_animal/slime/proc/update_name() + if(slime_name_regex.Find(name)) + number = rand(1, 1000) + name = "[colour] [is_adult ? "adult" : "baby"] slime ([number])" + real_name = name + +/mob/living/simple_animal/slime/proc/random_colour() + set_colour(pick(slime_colours)) + +/mob/living/simple_animal/slime/regenerate_icons() + cut_overlays() + var/icon_text = "[colour] [is_adult ? "adult" : "baby"] slime" + icon_dead = "[icon_text] dead" + if(stat != DEAD) + icon_state = icon_text + if(mood && !stat) + add_overlay("aslime-[mood]") + else + icon_state = icon_dead + ..() + +/mob/living/simple_animal/slime/movement_delay() + if(bodytemperature >= 330.23) // 135 F or 57.08 C + return -1 // slimes become supercharged at high temperatures + + . = ..() + + var/health_deficiency = (maxHealth - health) + if(health_deficiency >= 45) + . += (health_deficiency / 25) + + if(bodytemperature < 183.222) + . += (283.222 - bodytemperature) / 10 * 1.75 + + if(reagents) + if(reagents.has_reagent("morphine")) // morphine slows slimes down + . *= 2 + + if(reagents.has_reagent("frostoil")) // Frostoil also makes them move VEEERRYYYYY slow + . *= 5 + + if(health <= 0) // if damaged, the slime moves twice as slow + . *= 2 + + . += config.slime_delay + +/mob/living/simple_animal/slime/handle_hud_icons_health() + if(hud_used) + if(!client) + return + + if(healths) + var/severity = 0 + var/healthpercent = (health / maxHealth) * 100 + switch(healthpercent) + if(100 to INFINITY) + healths.icon_state = "slime_health0" + if(80 to 100) + healths.icon_state = "slime_health1" + severity = 1 + if(60 to 80) + healths.icon_state = "slime_health2" + severity = 2 + if(40 to 60) + healths.icon_state = "slime_health3" + severity = 3 + if(20 to 40) + healths.icon_state = "slime_health4" + severity = 4 + if(1 to 20) + healths.icon_state = "slime_health5" + severity = 5 + else + healths.icon_state = "slime_health7" + severity = 6 + if(severity > 0) + overlay_fullscreen("brute", /obj/screen/fullscreen/brute, severity) + else + clear_fullscreen("brute") + +/mob/living/simple_animal/slime/ObjBump(obj/O) + if(!client && powerlevel > 0) + var/probab = 10 + switch(powerlevel) + if(1 to 2) + probab = 20 + if(3 to 4) + probab = 30 + if(5 to 6) + probab = 40 + if(7 to 8) + probab = 60 + if(9) + probab = 70 + if(10) + probab = 95 + if(prob(probab)) + if(istype(O, /obj/structure/window) || istype(O, /obj/structure/grille)) + if(nutrition <= get_hunger_nutrition() && !Atkcool) + if (is_adult || prob(5)) + O.attack_slime(src) + Atkcool = TRUE + addtimer(VARSET_CALLBACK(src, Atkcool, FALSE), 4.5 SECONDS) + +/mob/living/simple_animal/slime/Process_Spacemove(movement_dir = 0) + return 2 + +/mob/living/simple_animal/slime/Stat() + if(..()) + + if(!docile) + stat(null, "Nutrition: [nutrition]/[get_max_nutrition()]") + if(amount_grown >= SLIME_EVOLUTION_THRESHOLD) + if(is_adult) + stat(null, "You can reproduce!") + else + stat(null, "You can evolve!") + + if(stat == UNCONSCIOUS) + stat(null,"You are knocked out by high levels of BZ!") + else + stat(null,"Power Level: [powerlevel]") + + +/mob/living/simple_animal/slime/adjustFireLoss(amount, updating_health = TRUE, forced = FALSE) + if(!forced) + amount = -abs(amount) + return ..() //Heals them + +/mob/living/simple_animal/slime/bullet_act(obj/item/projectile/Proj) + if(!Proj) + return + attacked += 10 + if((Proj.damage_type == BURN)) + adjustBruteLoss(-abs(Proj.damage)) //fire projectiles heals slimes. + Proj.on_hit(src) + else + ..(Proj) + return FALSE + +/mob/living/simple_animal/slime/emp_act(severity) + ..() + powerlevel = 0 // oh no, the power! + +/mob/living/simple_animal/slime/MouseDrop(atom/movable/A) + if(isliving(A) && A != src && usr == src) + var/mob/living/Food = A + if(CanFeedon(Food)) + Feedon(Food) + return ..() + +/mob/living/simple_animal/slime/unEquip(obj/item/I) + return + +/mob/living/simple_animal/slime/start_pulling(atom/movable/AM, state, force = move_force, supress_message = FALSE) + return + +/mob/living/simple_animal/slime/attack_ui(slot) + return + +/mob/living/simple_animal/slime/attack_slime(mob/living/simple_animal/slime/M) + if(..()) //successful slime attack + if(M == src) + return + if(buckled) + Feedstop(silent = TRUE) + visible_message("[M] pulls [src] off!", \ + "You pull [src] off!") + return + attacked += 5 + if(nutrition >= 100) //steal some nutrition. negval handled in life() + adjust_nutrition(-(50 + (40 * M.is_adult))) + M.add_nutrition(50 + (40 * M.is_adult)) + if(health > 0) + M.adjustBruteLoss(-10 + (-10 * M.is_adult)) + M.updatehealth() + +/mob/living/simple_animal/slime/attack_animal(mob/living/simple_animal/M) + . = ..() + if(.) + attacked += 10 + +/mob/living/simple_animal/slime/attack_larva(mob/living/carbon/alien/larva/L) + if(..()) //successful larva bite. + attacked += 10 + +/mob/living/simple_animal/slime/attack_hulk(mob/living/carbon/human/user) + if(user.a_intent == INTENT_HARM) + discipline_slime(user) + return ..() + +/mob/living/simple_animal/slime/attack_hand(mob/living/carbon/human/M) + if(buckled) + M.do_attack_animation(src, ATTACK_EFFECT_DISARM) + if(buckled == M) + if(prob(60)) + M.visible_message("[M] attempts to wrestle \the [name] off!", \ + "You attempt to wrestle \the [name] off!") + playsound(loc, 'sound/weapons/punchmiss.ogg', 25, TRUE, -1) + + else + M.visible_message("[M] manages to wrestle \the [name] off!", \ + "You manage to wrestle \the [name] off!") + playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, TRUE, -1) + + discipline_slime(M) + + else + if(prob(30)) + buckled.visible_message("[M] attempts to wrestle \the [name] off of [buckled]!", \ + "[M] attempts to wrestle \the [name] off of you!") + playsound(loc, 'sound/weapons/punchmiss.ogg', 25, TRUE, -1) + + else + buckled.visible_message("[M] manages to wrestle \the [name] off of [buckled]!", \ + "[M] manage to wrestle \the [name] off of you!") + playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, TRUE, -1) + + discipline_slime(M) + else + if(stat == DEAD && surgeries.len) + if(M.a_intent == INTENT_HELP || M.a_intent == INTENT_DISARM) + for(var/datum/surgery/S in surgeries) + if(S.next_step(M, src)) + return 1 + if(..()) //successful attack + attacked += 10 + +/mob/living/simple_animal/slime/attack_alien(mob/living/carbon/alien/humanoid/M) + if(..()) //if harm or disarm intent. + attacked += 10 + discipline_slime(M) + + +/mob/living/simple_animal/slime/attackby(obj/item/I, mob/living/user, params) + if(stat == DEAD && surgeries.len) + if(user.a_intent == INTENT_HELP || user.a_intent == INTENT_DISARM) + for(var/datum/surgery/S in surgeries) + if(S.next_step(user, src)) + return 1 + if(istype(I, /obj/item/stack/sheet/mineral/plasma) && !stat) //Let's you feed slimes plasma. + if(user in Friends) + ++Friends[user] + else + Friends[user] = 1 + to_chat(user, "You feed the slime the plasma. It chirps happily.") + var/obj/item/stack/sheet/mineral/plasma/S = I + S.use(1) + return + if(I.force > 0) + attacked += 10 + if(prob(25)) + user.do_attack_animation(src) + user.changeNext_move(CLICK_CD_MELEE) + to_chat(user, "[I] passes right through [src]!") + return + if(Discipline && prob(50)) // wow, buddy, why am I getting attacked?? + Discipline = 0 + if(I.force >= 3) + var/force_effect = 2 * I.force + if(is_adult) + force_effect = round(I.force / 2) + if(prob(10 + force_effect)) + discipline_slime(user) +/* if(istype(I, /obj/item/storage/bag/bio)) + var/obj/item/storage/P = I + if(!effectmod) + to_chat(user, "The slime is not currently being mutated.") + return + var/hasOutput = FALSE //Have we outputted text? + var/hasFound = FALSE //Have we found an extract to be added? + for(var/obj/item/slime_extract/S in P.contents) + if(S.effectmod == effectmod) + SEND_SIGNAL(P, COMSIG_TRY_STORAGE_TAKE, S, get_turf(src), TRUE) + qdel(S) + applied++ + hasFound = TRUE + if(applied >= SLIME_EXTRACT_CROSSING_REQUIRED) + to_chat(user, "You feed the slime as many of the extracts from the bag as you can, and it mutates!") + playsound(src, 'sound/effects/attackblob.ogg', 50, TRUE) + spawn_corecross() + hasOutput = TRUE + break + if(!hasOutput) + if(!hasFound) + to_chat(user, "There are no extracts in the bag that this slime will accept!") + else + to_chat(user, "You feed the slime some extracts from the bag.") + playsound(src, 'sound/effects/attackblob.ogg', 50, TRUE) + return */ + ..() +/* +/mob/living/simple_animal/slime/proc/spawn_corecross() + var/static/list/crossbreeds = subtypesof(/obj/item/slimecross) + visible_message("[src] shudders, its mutated core consuming the rest of its body!") + playsound(src, 'sound/magic/smoke.ogg', 50, TRUE) + var/crosspath + for(var/X in crossbreeds) + var/obj/item/slimecross/S = X + if(initial(S.colour) == colour && initial(S.effect) == effectmod) + crosspath = S + break + if(crosspath) + new crosspath(loc) + else + visible_message("The mutated core shudders, and collapses into a puddle, unable to maintain its form.") + qdel(src) +*/ +/mob/living/simple_animal/slime/water_act(volume, temperature, source, method = TOUCH) + . = ..() + var/water_damage = rand(10, 15) * volume + adjustBruteLoss(water_damage) + if(!client && Target && volume >= 3) // Like cats + Target = null + ++Discipline + +/mob/living/simple_animal/slime/examine(mob/user) + to_chat(user, "*---------*\nThis is [bicon(src)] \a [src]!") + if(stat == DEAD) + to_chat(user, "It is limp and unresponsive.") + else + if(stat == UNCONSCIOUS) // Slime stasis + to_chat(user, "It appears to be alive but unresponsive.") + if(getBruteLoss()) + to_chat(user, "") + if (getBruteLoss() < 40) + to_chat(user, "It has some punctures in its flesh!") + else + to_chat(user, "It has severe punctures and tears in its flesh!") + to_chat(user, "\n") + + switch(powerlevel) + if(2 to 3) + to_chat(user, "It is flickering gently with a little electrical activity.") + + if(4 to 5) + to_chat(user, "It is glowing gently with moderate levels of electrical activity.") + + if(6 to 9) + to_chat(user, "It is glowing brightly with high levels of electrical activity.") + + if(10) + to_chat(user, "It is radiating with massive levels of electrical activity!") + + to_chat(user, "*---------*") + +/mob/living/simple_animal/slime/proc/discipline_slime(mob/user) + if(stat) + return + + if(prob(80) && !client) + Discipline++ + + if(!is_adult) + if(Discipline == 1) + attacked = 0 + + if(Target) + Target = null + if(buckled) + Feedstop(silent = TRUE) //we unbuckle the slime from the mob it latched onto. + + SStun = world.time + rand(20,60) + spawn(0) + canmove = FALSE + if(user) + step_away(src,user,15) + sleep(3) + if(user) + step_away(src,user,15) + update_canmove() + +/mob/living/simple_animal/slime/pet + docile = TRUE + +/mob/living/simple_animal/slime/can_unbuckle() + return FALSE + +/mob/living/simple_animal/slime/can_buckle() + return FALSE + +/mob/living/simple_animal/slime/get_mob_buckling_height(mob/seat) + if(..()) + return 3 + +/mob/living/simple_animal/slime/random/Initialize(mapload, new_colour, new_is_adult) + . = ..(mapload, pick(slime_colours), prob(50)) + +/mob/living/simple_animal/slime/handle_ventcrawl(atom/A) + if(buckled) + to_chat(src, "I can't vent crawl while feeding...") + return + ..() \ No newline at end of file diff --git a/code/modules/mob/living/carbon/slime/subtypes.dm b/code/modules/mob/living/simple_animal/slime/subtypes.dm similarity index 96% rename from code/modules/mob/living/carbon/slime/subtypes.dm rename to code/modules/mob/living/simple_animal/slime/subtypes.dm index 35d38e31a48..b5720c62250 100644 --- a/code/modules/mob/living/carbon/slime/subtypes.dm +++ b/code/modules/mob/living/simple_animal/slime/subtypes.dm @@ -1,4 +1,4 @@ -proc/mutation_table(var/colour) +/mob/living/simple_animal/slime/proc/mutation_table(colour) var/list/slime_mutation[4] switch(colour) //Tier 1 @@ -76,4 +76,4 @@ proc/mutation_table(var/colour) slime_mutation[2] = colour slime_mutation[3] = colour slime_mutation[4] = colour - return(slime_mutation) \ No newline at end of file + return(slime_mutation) diff --git a/code/modules/mob/transform_procs.dm b/code/modules/mob/transform_procs.dm index 5154f19fda7..a03b7745d0a 100644 --- a/code/modules/mob/transform_procs.dm +++ b/code/modules/mob/transform_procs.dm @@ -135,41 +135,38 @@ qdel(src) return -/mob/living/carbon/human/proc/slimeize(adult as num, reproduce as num) +/mob/living/carbon/human/proc/slimeize(reproduce as num) if(notransform) return - for(var/obj/item/W in src) - unEquip(W) + notransform = TRUE + canmove = FALSE + for(var/obj/item/I in src) + unEquip(I) regenerate_icons() - notransform = 1 - canmove = 0 icon = null - invisibility = 101 + invisibility = INVISIBILITY_MAXIMUM for(var/t in bodyparts) qdel(t) - var/mob/living/carbon/slime/new_slime + var/mob/living/simple_animal/slime/new_slime if(reproduce) var/number = pick(14;2,3,4) //reproduce (has a small chance of producing 3 or 4 offspring) var/list/babies = list() for(var/i=1,i<=number,i++) - var/mob/living/carbon/slime/M = new/mob/living/carbon/slime(loc) + var/mob/living/simple_animal/slime/M = new/mob/living/simple_animal/slime(loc) M.set_nutrition(round(nutrition / number)) step_away(M,src) babies += M new_slime = pick(babies) else - new_slime = new /mob/living/carbon/slime(loc) - if(adult) - new_slime.is_adult = 1 - else + new_slime = new /mob/living/simple_animal/slime(loc) + new_slime.a_intent = INTENT_HARM new_slime.key = key to_chat(new_slime, "You are now a slime. Skreee!") new_slime.update_pipe_vision() - spawn(0)//To prevent the proc from returning null. - qdel(src) - return + . = new_slime + qdel(src) /mob/living/carbon/human/proc/corgize() if(notransform) diff --git a/code/modules/projectiles/projectile/magic.dm b/code/modules/projectiles/projectile/magic.dm index 4bf6c98fc50..76d7c513bcc 100644 --- a/code/modules/projectiles/projectile/magic.dm +++ b/code/modules/projectiles/projectile/magic.dm @@ -202,7 +202,7 @@ if(ishuman(M)) Robot.mmi.transfer_identity(M) //Does not transfer key/client. if("slime") - new_mob = new /mob/living/carbon/slime/random(M.loc) + new_mob = new /mob/living/simple_animal/slime/random(M.loc) new_mob.universal_speak = TRUE if("xeno") if(prob(50)) diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index 331e5d9ca8f..b594743baef 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -74,6 +74,18 @@ var/const/INGEST = 2 handle_reactions() return total_transfered +/datum/reagents/proc/remove_all(amount = 1) + var/list/cached_reagents = reagent_list + if(total_volume > 0) + var/part = amount / total_volume + for(var/reagent in cached_reagents) + var/datum/reagent/R = reagent + remove_reagent(R.id, R.volume * part) + + update_total() + handle_reactions() + return amount + /datum/reagents/proc/get_master_reagent() var/the_reagent = null var/the_volume = 0 @@ -803,7 +815,7 @@ var/const/INGEST = 2 if(!R.taste_mult) continue //nutriment carries a list of tastes that originates from the snack food that the nutriment came from - if(istype(R, /datum/reagent/consumable/nutriment)) + if(istype(R, /datum/reagent/consumable/nutriment)) var/list/nutriment_taste_data = R.data for(var/nutriment_taste in nutriment_taste_data) var/ratio = nutriment_taste_data[nutriment_taste] diff --git a/code/modules/reagents/chemistry/reagents/food.dm b/code/modules/reagents/chemistry/reagents/food.dm index afc4c4f2f8f..5353dc54b88 100644 --- a/code/modules/reagents/chemistry/reagents/food.dm +++ b/code/modules/reagents/chemistry/reagents/food.dm @@ -279,8 +279,8 @@ /datum/reagent/consumable/frostoil/reaction_turf(turf/T, volume) if(volume >= 5) - for(var/mob/living/carbon/slime/M in T) - M.adjustToxLoss(rand(15,30)) + for(var/mob/living/simple_animal/slime/M in T) + M.adjustToxLoss(rand(15, 30)) /datum/reagent/consumable/sodiumchloride name = "Salt" diff --git a/code/modules/reagents/chemistry/reagents/pyrotechnic.dm b/code/modules/reagents/chemistry/reagents/pyrotechnic.dm index a01c034a4ae..17eee91080e 100644 --- a/code/modules/reagents/chemistry/reagents/pyrotechnic.dm +++ b/code/modules/reagents/chemistry/reagents/pyrotechnic.dm @@ -356,7 +356,7 @@ if(volume >= 3) T.MakeSlippery(TURF_WET_ICE) if(volume >= 5) - for(var/mob/living/carbon/slime/M in T) + for(var/mob/living/simple_animal/slime/M in T) M.adjustToxLoss(rand(15,30)) /datum/reagent/pyrosium diff --git a/code/modules/reagents/chemistry/reagents/water.dm b/code/modules/reagents/chemistry/reagents/water.dm index 5a831aa91de..ef836462543 100644 --- a/code/modules/reagents/chemistry/reagents/water.dm +++ b/code/modules/reagents/chemistry/reagents/water.dm @@ -76,8 +76,8 @@ if(floor_only) T.clean_blood() - for(var/mob/living/carbon/slime/M in T) - M.adjustToxLoss(rand(5,10)) + for(var/mob/living/simple_animal/slime/M in T) + M.adjustToxLoss(rand(5, 10)) if(istype(T, /turf/simulated)) var/turf/simulated/S = T S.dirt = 0 diff --git a/code/modules/reagents/chemistry/recipes/slime_extracts.dm b/code/modules/reagents/chemistry/recipes/slime_extracts.dm index a1e96ea35f5..1767d3964a1 100644 --- a/code/modules/reagents/chemistry/recipes/slime_extracts.dm +++ b/code/modules/reagents/chemistry/recipes/slime_extracts.dm @@ -11,9 +11,8 @@ /datum/chemical_reaction/slimespawn/on_reaction(datum/reagents/holder) feedback_add_details("slime_cores_used","[type]") - var/mob/living/carbon/slime/S = new /mob/living/carbon/slime - S.forceMove(get_turf(holder.my_atom)) - S.visible_message("Infused with plasma, the core begins to quiver and grow, and soon a new baby slime emerges from it!") + var/mob/living/simple_animal/slime/S = new(get_turf(holder.my_atom), "grey") + S.visible_message("Infused with plasma, the core begins to quiver and grow, and a new baby slime emerges from it!") /datum/chemical_reaction/slimeinaprov name = "Slime epinephrine" @@ -425,7 +424,12 @@ /datum/chemical_reaction/slimebloodlust/on_reaction(datum/reagents/holder) feedback_add_details("slime_cores_used","[type]") - for(var/mob/living/carbon/slime/slime in viewers(get_turf(holder.my_atom), null)) + for(var/mob/living/simple_animal/slime/slime in viewers(get_turf(holder.my_atom), null)) + if(slime.docile) //Undoes docility, but doesn't make rabid. + slime.visible_message("[slime] forgets its training, becoming wild once again!") + slime.docile = FALSE + slime.update_name() + continue slime.rabid = 1 slime.visible_message("The [slime] is driven into a frenzy!") @@ -667,9 +671,8 @@ /datum/chemical_reaction/slimeRNG/on_reaction(datum/reagents/holder) feedback_add_details("slime_cores_used","[type]") - var/mob/living/carbon/slime/random/S = new /mob/living/carbon/slime/random - S.forceMove(get_turf(holder.my_atom)) - S.visible_message("Infused with plasma, the core begins to quiver and grow, and soon a new baby slime emerges from it!") + var/mob/living/simple_animal/slime/random/S = new (get_turf(holder.my_atom)) + S.visible_message("Infused with plasma, the core begins to quiver and grow, and a new baby slime emerges from it!") /datum/chemical_reaction/slime_transfer name = "Transfer Potion" diff --git a/code/modules/recycling/disposal.dm b/code/modules/recycling/disposal.dm index 6a5d85e0631..2182df4c9a8 100644 --- a/code/modules/recycling/disposal.dm +++ b/code/modules/recycling/disposal.dm @@ -175,7 +175,7 @@ // mouse drop another mob or self // /obj/machinery/disposal/MouseDrop_T(mob/target, mob/user) - if(!istype(target) || target.buckled || get_dist(user, src) > 1 || get_dist(user, target) > 1 || user.stat || istype(user, /mob/living/silicon/ai)) + if(!istype(target) || target.buckled || target.has_buckled_mobs() || get_dist(user, src) > 1 || get_dist(user, target) > 1 || user.stat || istype(user, /mob/living/silicon/ai)) return if(isanimal(user) && target != user) return //animals cannot put mobs other than themselves into disposal src.add_fingerprint(user) diff --git a/code/modules/research/xenobiology/xenobio_camera.dm b/code/modules/research/xenobiology/xenobio_camera.dm index 785c03b13a1..f6df6ece19b 100644 --- a/code/modules/research/xenobiology/xenobio_camera.dm +++ b/code/modules/research/xenobiology/xenobio_camera.dm @@ -48,7 +48,7 @@ /obj/machinery/computer/camera_advanced/xenobio/Destroy() QDEL_NULL(current_potion) - for(var/mob/living/carbon/slime/S in stored_slimes) + for(var/mob/living/simple_animal/slime/S in stored_slimes) S.forceMove(drop_location()) stored_slimes.Cut() return ..() @@ -173,7 +173,7 @@ var/obj/machinery/computer/camera_advanced/xenobio/X = target if(cameranet.checkTurfVis(remote_eye.loc)) - for(var/mob/living/carbon/slime/S in X.stored_slimes) + for(var/mob/living/simple_animal/slime/S in X.stored_slimes) S.forceMove(remote_eye.loc) S.visible_message("[S] warps in!") X.stored_slimes -= S @@ -192,14 +192,13 @@ var/obj/machinery/computer/camera_advanced/xenobio/X = target if(cameranet.checkTurfVis(remote_eye.loc)) - for(var/mob/living/carbon/slime/S in remote_eye.loc) + for(var/mob/living/simple_animal/slime/S in remote_eye.loc) if(X.stored_slimes.len >= X.max_slimes) break if(!S.ckey) if(S.buckled) - S.buckled.unbuckle_mob(S, force = TRUE) - S.Feedstop() - S.visible_message("[S] vanishes in a flash of light!") + S.Feedstop(silent = TRUE) + S.visible_message("[S] vanishes in a flash of light!") S.forceMove(X) X.stored_slimes += S else @@ -265,7 +264,7 @@ var/mob/camera/aiEye/remote/xenobio/remote_eye = C.remote_control if(cameranet.checkTurfVis(remote_eye.loc)) - for(var/mob/living/carbon/slime/S in remote_eye.loc) + for(var/mob/living/simple_animal/slime/S in remote_eye.loc) slime_scan(S, C) else to_chat(owner, "Target is not near a camera. Cannot proceed.") @@ -287,7 +286,7 @@ return if(cameranet.checkTurfVis(remote_eye.loc)) - for(var/mob/living/carbon/slime/S in remote_eye.loc) + for(var/mob/living/simple_animal/slime/S in remote_eye.loc) X.current_potion.attack(S, C) break else @@ -310,17 +309,17 @@ // Alternate clicks for slime, monkey and open turf if using a xenobio console // Scans slime -/mob/living/carbon/slime/CtrlClick(mob/user) +/mob/living/simple_animal/slime/CtrlClick(mob/user) SEND_SIGNAL(user, COMSIG_XENO_SLIME_CLICK_CTRL, src) ..() //Feeds a potion to slime -/mob/living/carbon/slime/AltClick(mob/user) +/mob/living/simple_animal/slime/AltClick(mob/user) SEND_SIGNAL(user, COMSIG_XENO_SLIME_CLICK_ALT, src) ..() //Picks up slime -/mob/living/carbon/slime/ShiftClick(mob/user) +/mob/living/simple_animal/slime/ShiftClick(mob/user) SEND_SIGNAL(user, COMSIG_XENO_SLIME_CLICK_SHIFT, src) ..() @@ -341,7 +340,7 @@ ..() // Scans slime -/obj/machinery/computer/camera_advanced/xenobio/proc/XenoSlimeClickCtrl(mob/living/user, mob/living/carbon/slime/S) +/obj/machinery/computer/camera_advanced/xenobio/proc/XenoSlimeClickCtrl(mob/living/user, mob/living/simple_animal/slime/S) if(!cameranet.checkTurfVis(S.loc)) to_chat(user, "Target is not near a camera. Cannot proceed.") return @@ -352,7 +351,7 @@ slime_scan(S, C) //Feeds a potion to slime -/obj/machinery/computer/camera_advanced/xenobio/proc/XenoSlimeClickAlt(mob/living/user, mob/living/carbon/slime/S) +/obj/machinery/computer/camera_advanced/xenobio/proc/XenoSlimeClickAlt(mob/living/user, mob/living/simple_animal/slime/S) if(!cameranet.checkTurfVis(S.loc)) to_chat(user, "Target is not near a camera. Cannot proceed.") return @@ -367,7 +366,7 @@ X.current_potion.attack(S, C) //Picks up slime -/obj/machinery/computer/camera_advanced/xenobio/proc/XenoSlimeClickShift(mob/living/user, mob/living/carbon/slime/S) +/obj/machinery/computer/camera_advanced/xenobio/proc/XenoSlimeClickShift(mob/living/user, mob/living/simple_animal/slime/S) if(!cameranet.checkTurfVis(S.loc)) to_chat(user, "Target is not near a camera. Cannot proceed.") return @@ -377,14 +376,16 @@ var/area/mobarea = get_area(S.loc) if(mobarea.name == E.allowed_area || mobarea.xenobiology_compatible) if(X.stored_slimes.len >= X.max_slimes) + to_chat(C, "Slime storage is full.") return - if(!S.ckey) - if(S.buckled) - S.buckled.unbuckle_mob(S, force = TRUE) - S.Feedstop() - S.visible_message("[S] vanishes in a flash of light!") - S.forceMove(X) - X.stored_slimes += S + if(S.ckey) + to_chat(C, "The slime wiggled free!") + return + if(S.buckled) + S.Feedstop(silent = TRUE) + S.visible_message("[S] vanishes in a flash of light!") + S.forceMove(X) + X.stored_slimes += S //Place slimes /obj/machinery/computer/camera_advanced/xenobio/proc/XenoTurfClickShift(mob/living/user, turf/T) @@ -396,9 +397,9 @@ var/obj/machinery/computer/camera_advanced/xenobio/X = E.origin var/area/turfarea = get_area(T) if(turfarea.name == E.allowed_area || turfarea.xenobiology_compatible) - for(var/mob/living/carbon/slime/S in X.stored_slimes) + for(var/mob/living/simple_animal/slime/S in X.stored_slimes) S.forceMove(T) - S.visible_message("[S] warps in!") + S.visible_message("[S] warps in!") X.stored_slimes -= S //Place monkey diff --git a/code/modules/research/xenobiology/xenobiology.dm b/code/modules/research/xenobiology/xenobiology.dm index 1dd4f05eb97..f7798df7892 100644 --- a/code/modules/research/xenobiology/xenobiology.dm +++ b/code/modules/research/xenobiology/xenobiology.dm @@ -139,7 +139,7 @@ icon_state = "bottle19" var/being_used = 0 -/obj/item/slimepotion/slime/docility/attack(mob/living/carbon/slime/M, mob/user) +/obj/item/slimepotion/slime/docility/attack(mob/living/simple_animal/slime/M, mob/user) if(!isslime(M)) to_chat(user, "The potion only works on slimes!") return @@ -149,7 +149,12 @@ if(being_used) to_chat(user, "You're already using this on another slime!") return - + if(M.rabid) //Stops being rabid, but doesn't become truly docile. + to_chat(M, "You absorb the potion, and your rabid hunger finally settles to a normal desire to feed.") + to_chat(user, "You feed the slime the potion, calming its rabid rage.") + M.rabid = FALSE + qdel(src) + return M.docile = 1 M.set_nutrition(700) to_chat(M, "You absorb the potion and feel your intense desire to feed melt away.") @@ -272,7 +277,7 @@ icon = 'icons/obj/chemical.dmi' icon_state = "bottle16" -/obj/item/slimepotion/slime/steroid/attack(mob/living/carbon/slime/M, mob/user) +/obj/item/slimepotion/slime/steroid/attack(mob/living/simple_animal/slime/M, mob/user) if(!isslime(M))//If target is not a slime. to_chat(user, "The steroid only works on baby slimes!") return ..() @@ -302,7 +307,7 @@ icon = 'icons/obj/chemical.dmi' icon_state = "bottle15" -/obj/item/slimepotion/slime/stabilizer/attack(mob/living/carbon/slime/M, mob/user) +/obj/item/slimepotion/slime/stabilizer/attack(mob/living/simple_animal/slime/M, mob/user) if(!isslime(M)) to_chat(user, "The stabilizer only works on slimes!") return ..() @@ -323,7 +328,7 @@ icon = 'icons/obj/chemical.dmi' icon_state = "bottle3" -/obj/item/slimepotion/slime/mutator/attack(mob/living/carbon/slime/M, mob/user) +/obj/item/slimepotion/slime/mutator/attack(mob/living/simple_animal/slime/M, mob/user) if(!isslime(M)) to_chat(user, "The mutator only works on slimes!") return ..() diff --git a/code/modules/spacepods/spacepod.dm b/code/modules/spacepods/spacepod.dm index 0bc9a074179..be21fe0ef9a 100644 --- a/code/modules/spacepods/spacepod.dm +++ b/code/modules/spacepods/spacepod.dm @@ -765,10 +765,9 @@ obj/spacepod/proc/add_equipment(mob/user, var/obj/item/spacepod_equipment/SPE, v to_chat(user, "The nuke-disk is locking the door every time you try to open it. You get the feeling that it doesn't want to go into the spacepod.") return 0 - for(var/mob/living/carbon/slime/S in range(1,usr)) - if(S.Victim == user) - to_chat(user, "You're too busy getting your life sucked out of you.") - return 0 + if(user.has_buckled_mobs()) //mob attached to us + to_chat(user, "[user] will not fit into [src] because [user.p_they()] [user.p_have()] creatures attached to [user.p_them()]!") + return move_inside(user) diff --git a/code/modules/surgery/core_removal.dm b/code/modules/surgery/core_removal.dm new file mode 100644 index 00000000000..21458720978 --- /dev/null +++ b/code/modules/surgery/core_removal.dm @@ -0,0 +1,61 @@ +/datum/surgery/core_removal + name = "core removal" + steps = list(/datum/surgery_step/slime/cut_flesh, /datum/surgery_step/slime/extract_core) + allowed_mob = list(/mob/living/simple_animal/slime) + possible_locs = list("chest", "head", "l_arm", "l_hand", "r_arm", "r_hand", "r_leg", "r_foot", "l_leg", "l_foot", "groin") + +/datum/surgery_step/slime + +/datum/surgery_step/slime/is_valid_target(mob/living/simple_animal/slime/target) + return istype(target, /mob/living/simple_animal/slime) + +/datum/surgery_step/slime/can_use(mob/living/user, mob/living/simple_animal/slime/target, target_zone, obj/item/tool) + return istype(target) && target.stat == DEAD + +/datum/surgery_step/slime/cut_flesh + allowed_tools = list(/obj/item/scalpel = 100, /obj/item/melee/energy/sword = 75, /obj/item/kitchen/knife = 65, /obj/item/shard = 45) + time = 16 + +/datum/surgery_step/slime/cut_flesh/begin_step(mob/user, mob/living/simple_animal/slime/target, target_zone, obj/item/tool) + user.visible_message("[user] starts cutting through [target]'s flesh with \the [tool].", "You start cutting through [target]'s flesh with \the [tool].") + +/datum/surgery_step/slime/cut_flesh/end_step(mob/living/user, mob/living/simple_animal/slime/target, target_zone, obj/item/tool) + user.visible_message(" [user] cuts through [target]'s flesh with \the [tool].", + " You cut through [target]'s flesh with \the [tool], revealing its silky innards.") + return TRUE + +/datum/surgery_step/slime/cut_flesh/fail_step(mob/living/user, mob/living/simple_animal/slime/target, target_zone, obj/item/tool) + user.visible_message(" [user]'s hand slips, tearing [target]'s flesh with \the [tool]!", \ + " Your hand slips, tearing [target]'s flesh with \the [tool]!") + return FALSE + +/datum/surgery_step/slime/extract_core + name = "extract core" + allowed_tools = list(/obj/item/hemostat = 100, /obj/item/crowbar = 100) + time = 16 + +/datum/surgery_step/slime/extract_core/begin_step(mob/user, mob/living/simple_animal/slime/target, target_zone, obj/item/tool) + user.visible_message("[user] begins to extract a core from [target].", + "You begin to extract a core from [target]...") + +/datum/surgery_step/slime/extract_core/end_step(mob/user, mob/living/simple_animal/slime/slime, target_zone, obj/item/tool) + if(slime.cores > 0) + slime.cores-- + user.visible_message("[user] successfully extracts a core from [slime]!", + "You successfully extract a core from [slime]. [slime.cores] core\s remaining.") + + new slime.coretype(slime.loc) + + if(slime.cores <= 0) + slime.icon_state = "[slime.colour] baby slime dead-nocore" + return TRUE + else + return FALSE + else + to_chat(user, "There aren't any cores left in [slime]!") + return TRUE + +/datum/surgery_step/slime/extract_core/fail_step(mob/living/user, mob/living/simple_animal/slime/target, target_zone, obj/item/tool) + user.visible_message(" [user]'s hand slips, tearing [target]'s flesh with \the [tool]!", \ + " Your hand slips, tearing [target]'s flesh with \the [tool]!") + return FALSE \ No newline at end of file diff --git a/code/modules/surgery/slime.dm b/code/modules/surgery/slime.dm deleted file mode 100644 index 77614d41430..00000000000 --- a/code/modules/surgery/slime.dm +++ /dev/null @@ -1,103 +0,0 @@ -////////////////////////////////////////////////////////////////// -// SLIME CORE EXTRACTION // -////////////////////////////////////////////////////////////////// -/datum/surgery/core_removal - name = "core removal" - steps = list(/datum/surgery_step/slime/cut_flesh, /datum/surgery_step/slime/cut_innards, /datum/surgery_step/slime/saw_core) - allowed_mob = list(/mob/living/carbon/slime) - possible_locs = list("chest")//urgghhhhhhhhhhhh - - -/datum/surgery_step/slime - is_valid_target(mob/living/carbon/slime/target) - return istype(target, /mob/living/carbon/slime/) - - can_use(mob/living/user, mob/living/carbon/slime/target, target_zone, obj/item/tool) - return target.stat == DEAD - -/datum/surgery_step/slime/cut_flesh - allowed_tools = list( - /obj/item/scalpel = 100, \ - /obj/item/kitchen/knife = 90, \ - /obj/item/shard = 60, \ - ) - - time = 16 - -/datum/surgery_step/slime/cut_flesh/can_use(mob/living/user, mob/living/carbon/slime/target, target_zone, obj/item/tool) - return ..() && istype(target) && target.core_removal_stage == 0 - -/datum/surgery_step/slime/cut_flesh/begin_step(mob/user, mob/living/carbon/slime/target, target_zone, obj/item/tool) - user.visible_message("[user] starts cutting through [target]'s flesh with \the [tool].", \ - "You start cutting through [target]'s flesh with \the [tool].") - -/datum/surgery_step/slime/cut_flesh/end_step(mob/living/user, mob/living/carbon/slime/target, target_zone, obj/item/tool) - user.visible_message(" [user] cuts through [target]'s flesh with \the [tool].", \ - " You cut through [target]'s flesh with \the [tool], revealing its silky innards.") - target.core_removal_stage = 1 - - return 1 - -/datum/surgery_step/slime/cut_flesh/fail_step(mob/living/user, mob/living/carbon/slime/target, target_zone, obj/item/tool) - user.visible_message(" [user]'s hand slips, tearing [target]'s flesh with \the [tool]!", \ - " Your hand slips, tearing [target]'s flesh with \the [tool]!") - return 0 - -/datum/surgery_step/slime/cut_innards - allowed_tools = list( - /obj/item/scalpel = 100, \ - /obj/item/kitchen/knife = 90, \ - /obj/item/shard = 60, \ - ) - - time = 16 - -/datum/surgery_step/slime/cut_innards/can_use(mob/living/user, mob/living/carbon/slime/target, target_zone, obj/item/tool) - return ..() && istype(target) && target.core_removal_stage == 1 - -/datum/surgery_step/slime/cut_innards/begin_step(mob/user, mob/living/carbon/slime/target, target_zone, obj/item/tool) - user.visible_message("[user] starts cutting [target]'s silky innards apart with \the [tool].", \ - "You start cutting [target]'s silky innards apart with \the [tool].") - -/datum/surgery_step/slime/cut_innards/end_step(mob/living/user, mob/living/carbon/slime/target, target_zone, obj/item/tool) - user.visible_message(" [user] cuts [target]'s innards apart with \the [tool], exposing the cores.", \ - " You cut [target]'s innards apart with \the [tool], exposing the cores.") - target.core_removal_stage = 2 - return 1 - -/datum/surgery_step/slime/cut_innards/fail_step(mob/living/user, mob/living/carbon/slime/target, target_zone, obj/item/tool) - user.visible_message(" [user]'s hand slips, tearing [target]'s innards with \the [tool]!", \ - " Your hand slips, tearing [target]'s innards with \the [tool]!") - return 0 - -/datum/surgery_step/slime/saw_core - allowed_tools = list( - /obj/item/circular_saw = 100, \ - /obj/item/hatchet = 90 - ) - - time = 16 - -/datum/surgery_step/slime/saw_core/can_use(mob/living/user, mob/living/carbon/slime/target, target_zone, obj/item/tool) - return ..() && (istype(target) && target.core_removal_stage == 2 && target.cores > 0) //This is being passed a human as target, unsure why. - -/datum/surgery_step/slime/saw_core/begin_step(mob/user, mob/living/carbon/slime/target, target_zone, obj/item/tool) - user.visible_message("[user] starts cutting out one of [target]'s cores with \the [tool].", \ - "You start cutting out one of [target]'s cores with \the [tool].") - -/datum/surgery_step/slime/saw_core/end_step(mob/living/user, mob/living/carbon/slime/target, target_zone, obj/item/tool) - target.cores-- - user.visible_message(" [user] cuts out one of [target]'s cores with \the [tool].", \ - " You cut out one of [target]'s cores with \the [tool]. [target.cores] cores left.") - - if(target.cores >= 0) - new target.coretype(target.loc) - if(target.cores <= 0) - target.icon_state = "[target.colour] baby slime dead-nocore" - - return 1 - -/datum/surgery_step/slime/saw_core/fail_step(mob/living/user, mob/living/carbon/slime/target, target_zone, obj/item/tool) - user.visible_message(" [user]'s hand slips, causing [user.p_them()] to miss the core!", \ - " Your hand slips, causing you to miss the core!") - return 0 diff --git a/icons/mob/actions/actions_slime.dmi b/icons/mob/actions/actions_slime.dmi new file mode 100644 index 0000000000000000000000000000000000000000..acf7a31c6ed9f353ddd8c63149619c3c4d8ff8b6 GIT binary patch literal 4717 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 literal 0 HcmV?d00001 diff --git a/icons/mob/slimes.dmi b/icons/mob/slimes.dmi index 0ef5ac0bee4c0c3cfd1d6279d67b7688e53da218..f9998d6f1061312c3bbbc7b469f419df86ba9d9d 100644 GIT binary patch literal 86112 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

S03E3hZS$f<(d) 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 literal 85977 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