Frankenstein Station 13: Introducing dissections and alien organs to xenobiology (#29093)

* ddsadsa

ddsadsa

* moderate again

* revert

* beginning with rebase

* organssssssssss

* organs now process!

* analyzer finished! + mapping

* tool bit implementation and quality

* organs and fixes and reworks

* more organ work

* more organs done

* more organ progress!

* more organ work

* MORE. ORGANS.

* temp

* more organsssss

* ITS DONE!!!!!!!!

* oops

* also oops

* linter stuff

* forgot this + oops

* linter

* i forgot to save!

* lots of improvements and tweaks

* move icon over

* icon tweaks

* icon mistake

* oops

* dumb

* more icon validations

* i think thisll fix it?

* Apply suggestions from code review

Co-authored-by: PollardTheDragon <144391971+PollardTheDragon@users.noreply.github.com>
Signed-off-by: Kyani <65205627+EmeraldCandy@users.noreply.github.com>

* fixes

* fixes+tweaks

* fix

* oops

* linter

* i didnt save....

* this should give -some- warning

* forgot a span

* Apply suggestions from code review

Co-authored-by: 1080pCat <96908085+1080pCat@users.noreply.github.com>
Signed-off-by: Kyani <65205627+EmeraldCandy@users.noreply.github.com>

* Apply suggestions from code review

Co-authored-by: 1080pCat <96908085+1080pCat@users.noreply.github.com>
Signed-off-by: Kyani <65205627+EmeraldCandy@users.noreply.github.com>

* beginning edits

* more fixed and tweaks with cooldowns

* Apply suggestions from code review

Co-authored-by: Luc <89928798+lewcc@users.noreply.github.com>
Signed-off-by: Kyani <65205627+EmeraldCandy@users.noreply.github.com>

* lots of tweaks

* more review changes

* comment change

* Apply suggestions from code review

Co-authored-by: Luc <89928798+lewcc@users.noreply.github.com>
Signed-off-by: Kyani <65205627+EmeraldCandy@users.noreply.github.com>

* returns start back to gland

* Apply suggestions from code review

Co-authored-by: 1080pCat <96908085+1080pCat@users.noreply.github.com>
Signed-off-by: Kyani <65205627+EmeraldCandy@users.noreply.github.com>

* code review fixes

* trying to make surgery work....

* might as well push this

* perfection. now i need text

* text + small tweaks and bugfixing

* linting

* forgot to implement this

* deconflicting maps

* modifying for xenos again

* i guess this wasnt needed???

* added surgical belts to xeno

* minor swap

* quick fix

* small tweaks

* small tweak

* tiny tweak

* some slime updates

* more tweaks

* more updates

* first batch of fixes

* hiero audio fix

* robotic fauna fixes

* more rounds of bugfixes

* prevents teleporting

* tiny fix

* makes sharp more common

* misc fixes

* surgery and revenant fixes + extractor

* adds cursed organ logging

* small bananium organ tweak

* actually gives teleporter access

* adds a message to the analyzer

* can now drag naughts

* slime behavior tweaks

* headslug tweak, cant eat organs

* Update code/datums/components/special_tastes.dm

Co-authored-by: warriorstar-orion <orion@snowfrost.garden>
Signed-off-by: Kyani <65205627+EmeraldCandy@users.noreply.github.com>

* Update code/datums/components/special_tastes.dm

Co-authored-by: warriorstar-orion <orion@snowfrost.garden>
Signed-off-by: Kyani <65205627+EmeraldCandy@users.noreply.github.com>

* Update code/datums/components/special_tastes.dm

Co-authored-by: warriorstar-orion <orion@snowfrost.garden>
Signed-off-by: Kyani <65205627+EmeraldCandy@users.noreply.github.com>

* Update code/modules/mob/living/simple_animal/slime/slime_mob.dm

Co-authored-by: warriorstar-orion <orion@snowfrost.garden>
Signed-off-by: Kyani <65205627+EmeraldCandy@users.noreply.github.com>

* Update code/modules/mob/living/simple_animal/slime/slime_mob.dm

Co-authored-by: warriorstar-orion <orion@snowfrost.garden>
Signed-off-by: Kyani <65205627+EmeraldCandy@users.noreply.github.com>

* Update code/game/gamemodes/miniantags/revenant/revenant.dm

Co-authored-by: warriorstar-orion <orion@snowfrost.garden>
Signed-off-by: Kyani <65205627+EmeraldCandy@users.noreply.github.com>

* Update code/datums/components/special_tastes.dm

Co-authored-by: warriorstar-orion <orion@snowfrost.garden>
Signed-off-by: Kyani <65205627+EmeraldCandy@users.noreply.github.com>

* Update code/game/gamemodes/miniantags/abduction/gland.dm

Co-authored-by: warriorstar-orion <orion@snowfrost.garden>
Signed-off-by: Kyani <65205627+EmeraldCandy@users.noreply.github.com>

* Update code/game/gamemodes/miniantags/abduction/gland.dm

Co-authored-by: warriorstar-orion <orion@snowfrost.garden>
Signed-off-by: Kyani <65205627+EmeraldCandy@users.noreply.github.com>

* moved this

* major rework prep

* didnt save

* rework done

* small fix

* makes aliens draggable by crew after death

* shouldnt have cut this

* xeno organ tweak + tips

* oops

* fixes and tweaks to slimes

* not used

* temp revert

* rebase map files to master

* re-applying changes

* access fix

* access tweak

* big fix for new refactor

* more refactoring

* forgot a span

* Update code/datums/components/surgery_initiator.dm

Co-authored-by: warriorstar-orion <orion@snowfrost.garden>
Signed-off-by: Kyani <65205627+EmeraldCandy@users.noreply.github.com>

* hiero only doesnt target dead megafauna

* various fixes

* fix requests

* fixed weird conflict markers

* deconflict

* deconflicting

* antimagic flags

* merge fixing

* Update code/modules/mining/lavaland/loot/hierophant_loot.dm

Signed-off-by: Burzah <116982774+Burzah@users.noreply.github.com>

* regen mesh fix

* small fixes

* tick fix

* Apply suggestions from code review

Co-authored-by: Luc <89928798+lewcc@users.noreply.github.com>
Signed-off-by: Kyani <65205627+EmeraldCandy@users.noreply.github.com>

* grammar

* Update code/modules/surgery/organs/organ_internal.dm

Co-authored-by: Luc <89928798+lewcc@users.noreply.github.com>
Signed-off-by: Kyani <65205627+EmeraldCandy@users.noreply.github.com>

* Update code/modules/surgery/organs/organ_internal.dm

Co-authored-by: Luc <89928798+lewcc@users.noreply.github.com>
Signed-off-by: Kyani <65205627+EmeraldCandy@users.noreply.github.com>

* Update code/modules/research/xenobiology/xenobiology_organs.dm

Co-authored-by: Luc <89928798+lewcc@users.noreply.github.com>
Signed-off-by: Kyani <65205627+EmeraldCandy@users.noreply.github.com>

* Update code/modules/research/xenobiology/xenobiology_organs.dm

Co-authored-by: Luc <89928798+lewcc@users.noreply.github.com>
Signed-off-by: Kyani <65205627+EmeraldCandy@users.noreply.github.com>

* Update code/modules/research/xenobiology/xenobiology_organs.dm

Co-authored-by: Luc <89928798+lewcc@users.noreply.github.com>
Signed-off-by: Kyani <65205627+EmeraldCandy@users.noreply.github.com>

* tweaks

---------

Signed-off-by: Kyani <65205627+EmeraldCandy@users.noreply.github.com>
Signed-off-by: Burzah <116982774+Burzah@users.noreply.github.com>
Co-authored-by: BeagleGaming1 <56142455+BeagleGaming1@users.noreply.github.com>
Co-authored-by: PollardTheDragon <144391971+PollardTheDragon@users.noreply.github.com>
Co-authored-by: 1080pCat <96908085+1080pCat@users.noreply.github.com>
Co-authored-by: Luc <89928798+lewcc@users.noreply.github.com>
Co-authored-by: warriorstar-orion <orion@snowfrost.garden>
Co-authored-by: Burzah <116982774+Burzah@users.noreply.github.com>
This commit is contained in:
Kyani
2025-06-10 16:46:56 +00:00
committed by GitHub
co-authored by PollardTheDragon 1080pCat Luc warriorstar-orion BeagleGaming1 Burzah
parent 438b3d7c98
commit fdcf4899a2
107 changed files with 4269 additions and 742 deletions
@@ -22,6 +22,9 @@
ventcrawler = VENTCRAWLER_ALWAYS
var/death_message = "lets out a waning guttural screech, green blood bubbling from its maw..."
var/death_sound = 'sound/voice/hiss6.ogg'
ignore_generic_organs = TRUE
contains_xeno_organ = TRUE
surgery_container = /datum/xenobiology_surgery_container/alien
/mob/living/carbon/alien/Initialize(mapload)
. = ..()
@@ -31,6 +34,10 @@
var/obj/item/organ/internal/organ = new organ_path()
organ.insert(src)
/mob/living/carbon/alien/death(gibbed)
move_resist = null
return ..()
/// returns the list of type paths of the organs that we need to insert into
/// this particular xeno upon its creation
/mob/living/carbon/alien/proc/get_caste_organs()
@@ -4,6 +4,7 @@
maxHealth = 150
health = 150
icon_state = "aliend_s"
surgery_container = /datum/xenobiology_surgery_container/alien/drone
/mob/living/carbon/alien/humanoid/drone/Initialize(mapload)
. = ..()
@@ -8,6 +8,7 @@
var/leap_on_click = FALSE
/// Are we on leap cooldown?
var/on_leap_cooldown = FALSE
surgery_container = /datum/xenobiology_surgery_container/alien/hunter
/mob/living/carbon/alien/humanoid/hunter/Initialize(mapload)
. = ..()
@@ -4,6 +4,7 @@
maxHealth = 175
health = 175
icon_state = "aliens_s"
surgery_container = /datum/xenobiology_surgery_container/alien/sentinel
/mob/living/carbon/alien/humanoid/sentinel/large
name = "alien praetorian"
@@ -12,6 +12,7 @@
alien_disarm_damage = 60 //Queens do higher disarm stamina damage than normal aliens
alien_slash_damage = 30 //Queens do higher slashing damage to people
alien_movement_delay = 1 //This represents a movement delay of 1, or roughly 80% the movement speed of a normal carbon mob
surgery_container = /datum/xenobiology_surgery_container/alien/queen
/mob/living/carbon/alien/humanoid/queen/Initialize(mapload)
. = ..()
@@ -9,6 +9,7 @@
health = 25
butcher_results = list(/obj/item/food/monstermeat/xenomeat = 1)
density = FALSE
surgery_container = /datum/xenobiology_surgery_container/alien/larva
var/temperature_resistance = T0C+75
var/amount_grown = 0
@@ -21,15 +21,6 @@
if(volume > 10) // Anything over 10 volume will make the mob wetter.
wetlevel = min(wetlevel + 1,5)
/mob/living/carbon/item_interaction(mob/living/user, obj/item/I, list/modifiers)
if(length(surgeries))
if(user.a_intent == INTENT_HELP)
for(var/datum/surgery/S in surgeries)
if(S.next_step(user, src))
return ITEM_INTERACT_COMPLETE
return ..()
/mob/living/carbon/attack_hand(mob/living/carbon/human/user)
if(!iscarbon(user))
return
+24
View File
@@ -221,6 +221,30 @@
AM.setDir(current_dir)
now_pushing = FALSE
/mob/living/examine(mob/user)
. = ..()
if(stat != DEAD)
return
if(!user.reagent_vision())
return
var/datum/surgery/dissection
for(var/datum/surgery/dissect/D in surgeries)
dissection = D
if(dissection)
. += "<span class='notice'>You detect the next dissection step will be: [dissection.get_surgery_step()]</span>"
if(surgery_container && !contains_xeno_organ)
. += "<span class='warning'>[src] looks like [p_they()] [p_have()] had [p_their()] organs dissected!</span>"
/mob/living/item_interaction(mob/living/user, obj/item/I, list/modifiers)
if(length(surgeries))
if(user.a_intent == INTENT_HELP)
for(var/datum/surgery/S in surgeries)
if(S.next_step(user, src))
return ITEM_INTERACT_COMPLETE
return ..()
/mob/living/CanPathfindPass(to_dir, datum/can_pass_info/pass_info)
return TRUE // Unless you're a mule, something's trying to run you over.
+12 -2
View File
@@ -110,6 +110,9 @@
/// List of traits that should be applied on Initialize
var/list/initial_traits = list()
/// Sets our icon to `null` when `gib()` is used
var/gib_nullifies_icon = TRUE
/*
Taste Vars
*/
@@ -119,5 +122,12 @@
var/last_taste_text
///If a creature gets to be super special and have extra range on their chat messages
var/extra_message_range = 0
/// Sets our icon to `null` when `gib()` is used
var/gib_nullifies_icon = TRUE
/// Points to what specialized dissection information a mob gets.
var/datum/xenobiology_surgery_container/surgery_container
/// Does this creature contain a xeno organ we can harvest?
var/contains_xeno_organ = FALSE
/// The toggle for if this creature should ignore the rolls for generic organs upon dissection
var/ignore_generic_organs = FALSE
@@ -167,6 +167,8 @@
base_cooldown = 300
clothes_req = FALSE
aoe_range = 14
/// Is this ability granted from a xenobiology organ? Causes user to spark.
var/from_organ = FALSE
/datum/spell/aoe/flicker_lights/create_new_targeting()
var/datum/spell_targeting/aoe/turf/targeting = new()
@@ -177,6 +179,8 @@
for(var/turf/T in targets)
for(var/obj/machinery/light/L in T)
L.forced_flicker()
if(from_organ)
do_sparks(3, FALSE, user)
//Blind AOE
/datum/spell/aoe/blindness
@@ -143,6 +143,9 @@
var/regen_cooldown = 0
contains_xeno_organ = TRUE
surgery_container = /datum/xenobiology_surgery_container/megacarp
/mob/living/simple_animal/hostile/carp/megacarp/Initialize(mapload)
. = ..()
name = "[pick(GLOB.megacarp_first_names)] [pick(GLOB.megacarp_last_names)]"
@@ -32,6 +32,8 @@
attack_sound = 'sound/weapons/bite.ogg'
gold_core_spawnable = HOSTILE_SPAWN
var/venom_per_bite = 0 // While the /poison/ type path remains as-is for consistency reasons, we're really talking about venom, not poison.
contains_xeno_organ = TRUE
surgery_container = /datum/xenobiology_surgery_container/spider
/mob/living/simple_animal/hostile/poison/giant_spider/Initialize(mapload)
. = ..()
@@ -31,6 +31,9 @@
var/datum/mind/origin
var/egg_layed = FALSE
sentience_type = SENTIENCE_OTHER
contains_xeno_organ = TRUE
ignore_generic_organs = TRUE
surgery_container = /datum/xenobiology_surgery_container/headslug
/mob/living/simple_animal/hostile/headslug/proc/Infect(mob/living/carbon/victim)
var/obj/item/organ/internal/body_egg/changeling_egg/egg = new(victim)
@@ -34,6 +34,9 @@
var/smoke_lastuse = 0
var/smoke_freq = 300 // 30 seconds
footstep_type = FOOTSTEP_MOB_CLAW
contains_xeno_organ = TRUE
ignore_generic_organs = TRUE
surgery_container = /datum/xenobiology_surgery_container/hound
/mob/living/simple_animal/hostile/hellhound/Initialize(mapload)
. = ..()
@@ -25,3 +25,5 @@
minbodytemp = 150
maxbodytemp = 500
gold_core_spawnable = HOSTILE_SPAWN
contains_xeno_organ = TRUE
surgery_container = /datum/xenobiology_surgery_container/tomato
@@ -56,6 +56,7 @@ Difficulty: Hard
icon = 'icons/mob/lavaland/64x64megafauna.dmi'
icon_state = "ancient_robot"
icon_living = "ancient_robot"
icon_dead = "ancient_robot_dead"
friendly = "stares down"
speak_emote = list("BUZZES")
universal_speak = TRUE
@@ -69,7 +70,6 @@ Difficulty: Hard
ranged = TRUE
pixel_x = -16
pixel_y = -16
del_on_death = TRUE
loot = list(/obj/item/pinpointer/tendril)
crusher_loot = list(/obj/item/crusher_trophy/adaptive_intelligence_core)
internal_gps = /obj/item/gps/internal/ancient
@@ -78,6 +78,9 @@ Difficulty: Hard
deathmessage = "explodes into a shower of alloys"
footstep_type = FOOTSTEP_MOB_HEAVY //make stomp like bubble
attack_action_types = list()
contains_xeno_organ = TRUE
ignore_generic_organs = TRUE
surgery_container = /datum/xenobiology_surgery_container/vetus
difficulty_ore_modifier = 4 //Vetus' whole deal was that it dropped ore before all megas did, so it gets a ton
var/charging = FALSE
@@ -158,7 +161,17 @@ Difficulty: Hard
invisibility = 100
/mob/living/simple_animal/hostile/megafauna/ancient_robot/death(gibbed, allowed = FALSE)
icon = 'icons/mob/lavaland/corpses.dmi'
if(allowed)
overlays.Cut()
underlays.Cut()
QDEL_NULL(TR)
QDEL_NULL(TL)
QDEL_NULL(BR)
QDEL_NULL(BL)
QDEL_NULL(beam)
body_shield_enabled = FALSE
update_appearance(UPDATE_OVERLAYS)
return ..()
else if(exploding) //but it refused
return
@@ -169,9 +182,10 @@ Difficulty: Hard
/mob/living/simple_animal/hostile/megafauna/ancient_robot/Life(seconds, times_fired)
..()
if(!exploding)
if(!exploding && stat != DEAD)
return
playsound(src, 'sound/items/timer.ogg', 70, 0)
else if(stat != DEAD)
playsound(src, 'sound/items/timer.ogg', 70, 0)
/mob/living/simple_animal/hostile/megafauna/ancient_robot/drop_loot()
var/core_type = null
@@ -601,6 +615,8 @@ Difficulty: Hard
return
/mob/living/simple_animal/hostile/megafauna/ancient_robot/Moved(atom/OldLoc, Dir, Forced = FALSE)
if(stat == DEAD || exploding == TRUE) // a check so it doesnt try to move after death
return
if(Dir)
leg_walking_controler(Dir)
if(charging)
@@ -37,7 +37,7 @@ Difficulty: Hard
attack_sound = 'sound/misc/demon_attack1.ogg'
icon_state = "bubblegum"
icon_living = "bubblegum"
icon_dead = ""
icon_dead = "bubblegum_dead"
friendly = "stares down"
icon = 'icons/mob/lavaland/96x96megafauna.dmi'
speak_emote = list("gurgles")
@@ -52,7 +52,6 @@ Difficulty: Hard
melee_queue_distance = 20 // as far as possible really, need this because of blood warp
ranged = TRUE
pixel_x = -32
del_on_death = TRUE
difficulty_ore_modifier = 3
crusher_loot = list(/obj/item/crusher_trophy/demon_claws)
loot = list(/obj/item/clothing/suit/space/hostile_environment,
@@ -72,8 +71,12 @@ Difficulty: Hard
internal_gps = /obj/item/gps/internal/bubblegum
medal_type = BOSS_MEDAL_BUBBLEGUM
score_type = BUBBLEGUM_SCORE
deathmessage = "sinks into a pool of blood, fleeing the battle. You've won, for now... "
deathmessage = "sinks into a pile of grotesque viscera, fleeing the battle. You've won, for now... "
death_sound = 'sound/misc/enter_blood.ogg'
contains_xeno_organ = TRUE
ignore_generic_organs = TRUE
surgery_container = /datum/xenobiology_surgery_container/bubblegum
attack_action_types = list(/datum/action/innate/megafauna_attack/triple_charge,
/datum/action/innate/megafauna_attack/hallucination_charge,
/datum/action/innate/megafauna_attack/hallucination_surround,
@@ -150,15 +153,20 @@ Difficulty: Hard
/mob/living/simple_animal/hostile/megafauna/bubblegum/death(gibbed)
qdel(second_life_portal)
if(enraged && !second_life)
del_on_death = TRUE
var/obj/structure/closet/crate/necropolis/bubblegum/bait/jebait = new /obj/structure/closet/crate/necropolis/bubblegum/bait(get_turf(src))
var/obj/effect/bubblegum_trigger/great_chest_ahead = new /obj/effect/bubblegum_trigger(jebait, ListTargets())
new /obj/effect/landmark/spawner/bubblegum_exit(get_turf(src))
great_chest_ahead.forceMove(jebait)
if(second_life)
del_on_death = FALSE
var/area/A = get_area(src)
for(var/mob/M in A)
to_chat(M, "<span class='colossus'><b>YOU FUCK... I... I'll... get you later. Enjoy the last few days of your life...</b></span>")
new /obj/effect/bubblegum_exit(get_turf(src))
name = "Fleshy Mass"
desc = "Whatever this is, doesn't actually look like it comes from bubblegum, but many other entities. just thinking about how many creatures met their end to make this pile makes you shudder."
icon = 'icons/mob/lavaland/corpses.dmi'
return ..()
/mob/living/simple_animal/hostile/megafauna/bubblegum/drop_loot()
@@ -663,6 +671,8 @@ Difficulty: Hard
break
RegisterSignal(src, COMSIG_HOSTILE_FOUND_TARGET, PROC_REF(i_see_you))
for(var/mob/living/carbon/human/H in range(20))
if(stat == DEAD)
continue
to_chat(H, "<span class='colossus'><b>MY HANDS WILL RELISH ENDING YOU... HERE AND NOW!</b></span>")
FindTarget(list(H), 1)
@@ -34,7 +34,7 @@ Difficulty: Very Hard
attack_sound = 'sound/magic/ratvar_attack.ogg'
icon_state = "eva"
icon_living = "eva"
icon_dead = ""
icon_dead = "eva_dead"
friendly = "stares down"
icon = 'icons/mob/lavaland/96x96megafauna.dmi'
speak_emote = list("roars")
@@ -45,22 +45,25 @@ Difficulty: Very Hard
move_to_delay = 10
ranged = TRUE
pixel_x = -32
del_on_death = TRUE
universal_speak = TRUE
internal_gps = /obj/item/gps/internal/colossus
medal_type = BOSS_MEDAL_COLOSSUS
score_type = COLOSSUS_SCORE
difficulty_ore_modifier = 3
crusher_loot = list(/obj/item/crusher_trophy/blaster_tubes)
deathmessage = "disintegrates, leaving a glowing core in its wake."
deathmessage = "flakes away into innumerable pieces with the wind. It's metallic arm graft staying behind, falling to the ground with a loud thud."
difficulty_ore_modifier = 3
death_sound = 'sound/misc/demon_dies.ogg'
enraged_loot = /obj/item/disk/fauna_research/colossus
contains_xeno_organ = TRUE
ignore_generic_organs = TRUE
surgery_container = /datum/xenobiology_surgery_container/colossus
/// Have we used our final attack yet?
var/final_available = TRUE
attack_action_types = list(/datum/action/innate/megafauna_attack/spiral_attack,
/datum/action/innate/megafauna_attack/aoe_attack,
/datum/action/innate/megafauna_attack/shotgun,
/datum/action/innate/megafauna_attack/alternating_cardinals)
/// Have we used our final attack yet?
var/final_available = TRUE
/mob/living/simple_animal/hostile/megafauna/colossus/Initialize(mapload)
. = ..()
@@ -71,6 +74,10 @@ Difficulty: Very Hard
for(var/mob/living/simple_animal/hostile/megafauna/hierophant/H in GLOB.mob_list)
H.RegisterSignal(src, COMSIG_MOB_APPLY_DAMAGE, TYPE_PROC_REF(/mob/living/simple_animal/hostile/megafauna/hierophant, easy_anti_cheese))
/mob/living/simple_animal/hostile/megafauna/colossus/death(gibbed)
. = ..()
icon = 'icons/mob/lavaland/corpses.dmi'
/datum/action/innate/megafauna_attack/spiral_attack
name = "Spiral Shots"
button_overlay_icon = 'icons/mob/actions/actions.dmi'
@@ -62,6 +62,10 @@ Difficulty: Medium
death_sound = 'sound/misc/demon_dies.ogg'
footstep_type = FOOTSTEP_MOB_HEAVY
enraged_loot = /obj/item/disk/fauna_research/ash_drake
contains_xeno_organ = TRUE
ignore_generic_organs = TRUE
surgery_container = /datum/xenobiology_surgery_container/drake
attack_action_types = list(/datum/action/innate/megafauna_attack/fire_cone,
/datum/action/innate/megafauna_attack/fire_cone_meteors,
/datum/action/innate/megafauna_attack/mass_fire,
@@ -101,6 +105,13 @@ Difficulty: Medium
desc = "Here there be dragons."
invisibility = 100
/mob/living/simple_animal/hostile/megafauna/dragon/death(gibbed)
move_force = MOVE_FORCE_OVERPOWERING
move_resist = MOVE_FORCE_OVERPOWERING
pull_force = MOVE_FORCE_OVERPOWERING
mob_size = MOB_SIZE_LARGE
return ..()
/mob/living/simple_animal/hostile/megafauna/dragon/OpenFire()
if(swooping)
return
@@ -603,6 +614,7 @@ Difficulty: Medium
crusher_loot = list()
butcher_results = list(/obj/item/stack/ore/diamond = 5, /obj/item/stack/sheet/sinew = 5, /obj/item/stack/sheet/bone = 30)
attack_action_types = list()
contains_xeno_organ = FALSE
/mob/living/simple_animal/hostile/megafauna/dragon/lesser/generate_random_loot()
return
@@ -43,6 +43,7 @@ Difficulty: Hard
attack_sound = 'sound/weapons/sonic_jackhammer.ogg'
icon_state = "hierophant"
icon_living = "hierophant"
icon_dead = "hierophant_dead"
friendly = "stares down"
icon = 'icons/mob/lavaland/hierophant_new.dmi'
faction = list("boss") //asteroid mobs? get that shit out of my beautiful square house
@@ -62,13 +63,11 @@ Difficulty: Hard
internal_gps = /obj/item/gps/internal/hierophant
medal_type = BOSS_MEDAL_HIEROPHANT
score_type = HIEROPHANT_SCORE
del_on_death = TRUE
death_sound = 'sound/magic/repulse.ogg'
enraged_loot = /obj/item/disk/fauna_research/hierophant
attack_action_types = list(/datum/action/innate/megafauna_attack/blink,
/datum/action/innate/megafauna_attack/chaser_swarm,
/datum/action/innate/megafauna_attack/cross_blasts,
/datum/action/innate/megafauna_attack/blink_spam)
contains_xeno_organ = TRUE
ignore_generic_organs = TRUE
surgery_container = /datum/xenobiology_surgery_container/hierophant
var/burst_range = 3 //range on burst aoe
var/beam_range = 5 //range on cross blast beams
@@ -463,6 +462,8 @@ Difficulty: Hard
set_stat(CONSCIOUS) // deathgasp wont run if dead, stupid
for(var/turf/simulated/wall/indestructible/hierophant/T in GLOB.hierophant_walls)
T.collapse()
icon = 'icons/mob/lavaland/corpses.dmi'
DeleteComponent(/datum/component/boss_music)
..(/* force_grant = stored_nearby */)
/mob/living/simple_animal/hostile/megafauna/hierophant/Destroy()
@@ -22,6 +22,7 @@ Difficulty: Medium
maxHealth = 2500
icon_state = "mega_legion"
icon_living = "mega_legion"
icon_dead = "mega_legion_dead"
desc = "One of many."
icon = 'icons/mob/lavaland/96x96megafauna.dmi'
attacktext = "chomps"
@@ -33,7 +34,6 @@ Difficulty: Medium
wander = FALSE
speed = 2
ranged = TRUE
del_on_death = TRUE
retreat_distance = 5
minimum_distance = 5
pixel_x = -32
@@ -52,6 +52,9 @@ Difficulty: Medium
mouse_opacity = MOUSE_OPACITY_ICON
stat_attack = UNCONSCIOUS // Overriden from /tg/ - otherwise Legion starts chasing its minions
appearance_flags = 512
contains_xeno_organ = TRUE
ignore_generic_organs = TRUE
surgery_container = /datum/xenobiology_surgery_container/legion
/mob/living/simple_animal/hostile/megafauna/legion/Initialize(mapload)
. = ..()
@@ -91,6 +94,7 @@ Difficulty: Medium
..()
/mob/living/simple_animal/hostile/megafauna/legion/death(gibbed)
icon = 'icons/mob/lavaland/corpses.dmi'
for(var/mob/living/simple_animal/hostile/megafauna/legion/other in GLOB.mob_list)
if(other != src)
other.loot = list(/obj/item/storm_staff) //Initial does not work with lists.
@@ -81,6 +81,9 @@
/mob/living/simple_animal/hostile/megafauna/death(gibbed)
GLOB.alive_megafauna_list -= UID()
// lets normalize the icons a bit
pixel_x = 0
pixel_y = 0
// this happens before the parent call because `del_on_death` may be set
if(can_die() && !admin_spawned)
var/datum/status_effect/crusher_damage/C = has_status_effect(STATUS_EFFECT_CRUSHERDAMAGETRACKING)
@@ -31,6 +31,9 @@
aggro_vision_range = 9
turns_per_move = 5
gold_core_spawnable = HOSTILE_SPAWN
contains_xeno_organ = TRUE
surgery_container = /datum/xenobiology_surgery_container/basilisk
loot = list(/obj/item/stack/ore/diamond{layer = ABOVE_MOB_LAYER},
/obj/item/stack/ore/diamond{layer = ABOVE_MOB_LAYER})
@@ -86,6 +89,7 @@
loot = list()
butcher_results = list(/obj/item/stack/ore/diamond = 2, /obj/item/stack/sheet/sinew = 2, /obj/item/stack/sheet/bone = 1)
initial_traits = list(TRAIT_FLYING)
surgery_container = /datum/xenobiology_surgery_container/watcher
/mob/living/simple_animal/hostile/asteroid/basilisk/watcher/magmawing
name = "magmawing watcher"
@@ -39,6 +39,9 @@
mouse_opacity = MOUSE_OPACITY_ICON
deathmessage = "explodes into gore!"
loot_drop = /obj/item/crusher_trophy/broodmother_tongue
contains_xeno_organ = TRUE
ignore_generic_organs = TRUE
surgery_container = /datum/xenobiology_surgery_container/goliath
attack_action_types = list(/datum/action/innate/elite_attack/tentacle_patch,
/datum/action/innate/elite_attack/spawn_children,
@@ -41,7 +41,9 @@
death_sound = 'sound/misc/demon_dies.ogg'
deathmessage = "begins to shudder as it becomes transparent..."
loot_drop = /obj/item/clothing/neck/cloak/herald_cloak
contains_xeno_organ = TRUE
ignore_generic_organs = TRUE
surgery_container = /datum/xenobiology_surgery_container/herald
attack_action_types = list(/datum/action/innate/elite_attack/herald_trishot,
/datum/action/innate/elite_attack/herald_directionalshot,
@@ -40,6 +40,9 @@
sight = SEE_MOBS // So it can see through smoke / charge through walls like the kool aid man.
var/datum/effect_system/smoke_spread/bad/smoke
loot_drop = /obj/item/crusher_trophy/legionnaire_spine
contains_xeno_organ = TRUE
ignore_generic_organs = TRUE
surgery_container = /datum/xenobiology_surgery_container/legionnaire
attack_action_types = list(/datum/action/innate/elite_attack/legionnaire_charge,
/datum/action/innate/elite_attack/head_detach,
@@ -41,6 +41,9 @@
death_sound = 'sound/magic/repulse.ogg'
deathmessage = "'s lights flicker, before its top part falls down."
loot_drop = /obj/item/clothing/accessory/pandora_hope
contains_xeno_organ = TRUE
ignore_generic_organs = TRUE
surgery_container = /datum/xenobiology_surgery_container/pandora
attack_action_types = list(/datum/action/innate/elite_attack/chaser_burst,
/datum/action/innate/elite_attack/magic_box,
@@ -26,6 +26,8 @@
deathmessage = "spits up the contents of its stomach before dying!"
status_flags = CANPUSH
search_objects = 1
contains_xeno_organ = TRUE
surgery_container = /datum/xenobiology_surgery_container/goldgrub
wanted_objects = list(/obj/item/stack/ore/diamond, /obj/item/stack/ore/gold, /obj/item/stack/ore/silver,
/obj/item/stack/ore/uranium)
@@ -34,6 +34,8 @@
var/pre_attack_icon = "Goliath_preattack"
loot = list(/obj/item/stack/sheet/animalhide/goliath_hide)
footstep_type = FOOTSTEP_MOB_HEAVY
contains_xeno_organ = TRUE
surgery_container = /datum/xenobiology_surgery_container/goliath
/mob/living/simple_animal/hostile/asteroid/goliath/Life()
. = ..()
@@ -32,6 +32,8 @@
pass_flags = PASSTABLE
butcher_results = list(/obj/item/organ/internal/regenerative_core = 1)
var/brood_type = /mob/living/simple_animal/hostile/asteroid/hivelordbrood
contains_xeno_organ = TRUE
surgery_container = /datum/xenobiology_surgery_container/hivelord
/mob/living/simple_animal/hostile/asteroid/hivelord/OpenFire(the_target)
if(world.time >= ranged_cooldown)
@@ -298,6 +300,7 @@
sentience_type = SENTIENCE_BOSS
attack_sound = 'sound/misc/demon_attack1.ogg'
speed = 0
butcher_results = list(/obj/item/regen_mesh)
/mob/living/simple_animal/hostile/asteroid/big_legion/AttackingTarget()
if(!isliving(target))
@@ -16,6 +16,8 @@
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)
minbodytemp = 0
faction = list("nether")
contains_xeno_organ = TRUE
surgery_container = /datum/xenobiology_surgery_container/sweating
/mob/living/simple_animal/hostile/netherworld/migo
name = "mi-go"
@@ -26,19 +28,18 @@
icon_dead = "mi-go-dead"
attacktext = "lacerates"
speed = -0.5
var/static/list/migo_sounds
deathmessage = "wails as its form turns into a pulpy mush."
death_sound = 'sound/voice/hiss6.ogg'
surgery_container = /datum/xenobiology_surgery_container/migo
/mob/living/simple_animal/hostile/netherworld/migo/Initialize(mapload)
. = ..()
migo_sounds = list('sound/items/bubblewrap.ogg', 'sound/items/change_jaws.ogg', 'sound/items/crowbar.ogg', 'sound/items/drink.ogg', 'sound/items/deconstruct.ogg', 'sound/items/change_drill.ogg', 'sound/items/dodgeball.ogg', 'sound/items/eatfood.ogg', 'sound/items/screwdriver.ogg', 'sound/items/weeoo1.ogg', 'sound/items/wirecutter.ogg', 'sound/items/welder.ogg', 'sound/items/zip.ogg', 'sound/items/rped.ogg', 'sound/items/ratchet.ogg', 'sound/items/polaroid1.ogg', 'sound/items/pshoom.ogg', 'sound/items/airhorn.ogg', 'sound/voice/bcreep.ogg', 'sound/voice/biamthelaw.ogg', 'sound/voice/ed209_20sec.ogg', 'sound/voice/hiss3.ogg', 'sound/voice/hiss6.ogg', 'sound/voice/mpatchedup.ogg', 'sound/voice/mfeelbetter.ogg', 'sound/weapons/sear.ogg', 'sound/ambience/antag/tatoralert.ogg', 'sound/mecha/nominal.ogg', 'sound/mecha/weapdestr.ogg', 'sound/mecha/critdestr.ogg', 'sound/mecha/imag_enh.ogg', 'sound/effects/adminhelp.ogg', 'sound/effects/alert.ogg', 'sound/effects/attackblob.ogg', 'sound/effects/bamf.ogg', 'sound/effects/blobattack.ogg', 'sound/effects/break_stone.ogg', 'sound/effects/bubbles.ogg', 'sound/effects/bubbles2.ogg', 'sound/effects/clang.ogg', 'sound/effects/clownstep2.ogg', 'sound/effects/dimensional_rend.ogg', 'sound/effects/doorcreaky.ogg', 'sound/effects/empulse.ogg', 'sound/effects/explosionfar.ogg', 'sound/effects/explosion1.ogg', 'sound/effects/grillehit.ogg', 'sound/effects/genetics.ogg', 'sound/effects/heartbeat.ogg', 'sound/effects/hyperspace_begin.ogg', 'sound/effects/hyperspace_end.ogg', 'sound/goonstation/effects/screech.ogg', 'sound/effects/phasein.ogg', 'sound/effects/picaxe1.ogg', 'sound/effects/sparks1.ogg', 'sound/effects/smoke.ogg', 'sound/effects/splat.ogg', 'sound/effects/snap.ogg', 'sound/effects/tendril_destroyed.ogg', 'sound/effects/supermatter.ogg', 'sound/misc/desceration-01.ogg', 'sound/misc/desceration-02.ogg', 'sound/misc/desceration-03.ogg', 'sound/misc/bloblarm.ogg', 'sound/goonstation/misc/airraid_loop.ogg', 'sound/misc/interference.ogg', 'sound/misc/notice1.ogg', 'sound/misc/notice2.ogg', 'sound/misc/sadtrombone.ogg', 'sound/misc/slip.ogg', 'sound/weapons/armbomb.ogg', 'sound/weapons/chainsaw.ogg', 'sound/weapons/emitter.ogg', 'sound/weapons/emitter2.ogg', 'sound/weapons/blade1.ogg', 'sound/weapons/bladeslice.ogg', 'sound/weapons/blastcannon.ogg', 'sound/weapons/blaster.ogg', 'sound/weapons/bulletflyby3.ogg', 'sound/weapons/circsawhit.ogg', 'sound/weapons/cqchit2.ogg', 'sound/weapons/drill.ogg', 'sound/weapons/genhit1.ogg', 'sound/weapons/gunshots/gunshot_silenced.ogg', 'sound/weapons/gunshots/gunshot.ogg', 'sound/weapons/handcuffs.ogg', 'sound/weapons/homerun.ogg', 'sound/weapons/kenetic_accel.ogg', 'sound/machines/fryer/deep_fryer_emerge.ogg', 'sound/machines/airlock_alien_prying.ogg', 'sound/machines/airlock_close.ogg', 'sound/machines/airlockforced.ogg', 'sound/machines/airlock_open.ogg', 'sound/machines/alarm.ogg', 'sound/machines/blender.ogg', 'sound/machines/boltsdown.ogg', 'sound/machines/boltsup.ogg', 'sound/machines/buzz-sigh.ogg', 'sound/machines/buzz-two.ogg', 'sound/machines/chime.ogg', 'sound/machines/defib_charge.ogg', 'sound/machines/defib_failed.ogg', 'sound/machines/defib_ready.ogg', 'sound/machines/defib_zap.ogg', 'sound/machines/deniedbeep.ogg', 'sound/machines/ding.ogg', 'sound/machines/disposalflush.ogg', 'sound/machines/door_close.ogg', 'sound/machines/door_open.ogg', 'sound/machines/engine_alert1.ogg', 'sound/machines/engine_alert2.ogg', 'sound/machines/hiss.ogg', 'sound/machines/honkbot_evil_laugh.ogg', 'sound/machines/juicer.ogg', 'sound/machines/ping.ogg', 'sound/ambience/signal.ogg', 'sound/machines/synth_no.ogg', 'sound/machines/synth_yes.ogg', 'sound/machines/terminal_alert.ogg', 'sound/machines/twobeep.ogg', 'sound/machines/ventcrawl.ogg', 'sound/machines/warning-buzzer.ogg', 'sound/ai/outbreak5.ogg', 'sound/ai/outbreak7.ogg', 'sound/ai/alert.ogg', 'sound/ai/radiation.ogg', 'sound/ai/eshuttle_call.ogg', 'sound/ai/eshuttle_dock.ogg', 'sound/ai/eshuttle_recall.ogg', 'sound/ai/aimalf.ogg', 'sound/ambience/ambigen1.ogg', 'sound/ambience/ambigen3.ogg', 'sound/ambience/ambigen4.ogg', 'sound/ambience/ambigen5.ogg', 'sound/ambience/ambigen6.ogg', 'sound/ambience/ambigen10.ogg', 'sound/hallucinations/over_here1.ogg', 'sound/hallucinations/over_here2.ogg', 'sound/hallucinations/over_here3.ogg') //hahahaha fuck you code divers
/mob/living/simple_animal/hostile/netherworld/migo/say(message, bubble_type, list/spans = list(), sanitize = TRUE, datum/language/language = null, ignore_spam = FALSE, forced = null)
..()
if(stat)
return
var/chosen_sound = pick(migo_sounds)
var/chosen_sound = pick(GLOB.migo_sounds)
playsound(src, chosen_sound, 50, TRUE)
/mob/living/simple_animal/hostile/netherworld/migo/Life()
@@ -46,7 +47,7 @@
if(stat)
return
if(prob(10))
var/chosen_sound = pick(migo_sounds)
var/chosen_sound = pick(GLOB.migo_sounds)
playsound(src, chosen_sound, 50, TRUE)
/mob/living/simple_animal/hostile/netherworld/blankbody
@@ -31,6 +31,8 @@
cold_damage_per_tick = 10 //same as heat_damage_per_tick, only if the bodytemperature it's lower than minbodytemp
unsuitable_atmos_damage = 10
footstep_type = FOOTSTEP_MOB_SHOE
contains_xeno_organ = TRUE
surgery_container = /datum/xenobiology_surgery_container/clown
/mob/living/simple_animal/hostile/retaliate/clown/goblin
icon = 'icons/mob/animal.dmi'
@@ -8,7 +8,7 @@ GLOBAL_LIST_EMPTY(ts_spiderlist)
GLOBAL_LIST_EMPTY(ts_egg_list)
GLOBAL_LIST_EMPTY(ts_spiderling_list)
GLOBAL_LIST_EMPTY(ts_infected_list)
#define DECOMPOSE_TIMER 5 MINUTES
// --------------------------------------------------------------------------------
// --------------------- TERROR SPIDERS: DEFAULTS ---------------------------------
// --------------------------------------------------------------------------------
@@ -19,6 +19,8 @@ GLOBAL_LIST_EMPTY(ts_infected_list)
name = "terror spider"
desc = "The generic parent of all other terror spider types. If you see this in-game, it is a bug."
gender = FEMALE
contains_xeno_organ = TRUE
surgery_container = /datum/xenobiology_surgery_container/terror_spider
// Icons
icon = 'icons/mob/terrorspider.dmi'
@@ -314,26 +316,22 @@ GLOBAL_LIST_EMPTY(ts_infected_list)
/mob/living/simple_animal/hostile/poison/terror_spider/Life(seconds, times_fired)
. = ..()
if(stat == DEAD) // Can't use if(.) for this due to the fact it can sometimes return FALSE even when mob is alive.
if(prob(2))
// 2% chance every cycle to decompose
visible_message("<span class='notice'>The dead body of [src] decomposes!</span>")
gib()
else
if(degenerate)
adjustToxLoss(rand(1, 10))
if(regen_points < regen_points_max)
regen_points += regen_points_per_tick
if(getBruteLoss() || getFireLoss())
if(regen_points > regen_points_per_hp)
if(getBruteLoss())
adjustBruteLoss(-1)
regen_points -= regen_points_per_hp
else if(getFireLoss())
adjustFireLoss(-1)
regen_points -= regen_points_per_hp
if(prob(5)) // AA 2022-08-11 - This gives me prob(80) vibes. Should probably be refactored.
CheckFaction()
if(stat == DEAD)
return
if(degenerate)
adjustToxLoss(rand(1, 10))
if(regen_points < regen_points_max)
regen_points += regen_points_per_tick
if(getBruteLoss() || getFireLoss())
if(regen_points > regen_points_per_hp)
if(getBruteLoss())
adjustBruteLoss(-1)
regen_points -= regen_points_per_hp
else if(getFireLoss())
adjustFireLoss(-1)
regen_points -= regen_points_per_hp
if(prob(5)) // AA 2022-08-11 - This gives me prob(80) vibes. Should probably be refactored.
CheckFaction()
/mob/living/simple_animal/hostile/poison/terror_spider/proc/handle_dying()
if(!hasdied)
@@ -353,9 +351,14 @@ GLOBAL_LIST_EMPTY(ts_infected_list)
if(can_die())
if(!gibbed)
msg_terrorspiders("[src] has died in [get_area(src)].")
addtimer(CALLBACK(src, PROC_REF(decompose_now)), DECOMPOSE_TIMER)
handle_dying()
return ..()
/mob/living/simple_animal/hostile/poison/terror_spider/proc/decompose_now()
visible_message("<span class='notice'>The dead body of [src] decomposes!</span>")
gib()
/mob/living/simple_animal/hostile/poison/terror_spider/proc/spider_special_action()
return
@@ -476,3 +479,5 @@ GLOBAL_LIST_EMPTY(ts_infected_list)
. = ..()
if(pulling && !ismob(pulling) && pulling.density)
. += 6 // Drastic move speed penalty for dragging anything that is not a mob or a non dense object
#undef DECOMPOSE_TIMER
@@ -7,6 +7,7 @@
handle_feeding()
if(stat == CONSCIOUS) // Slimes in stasis don't lose nutrition, don't change mood and don't respond to speech
handle_nutrition()
handle_organs()
if(QDELETED(src)) // Stop if the slime split during handle_nutrition()
return
reagents.remove_all(0.5 * REAGENTS_METABOLISM * length(reagents.reagent_list)) //Slimes are such snowflakes
@@ -269,7 +270,7 @@
if(prob(60))
rabid = FALSE
if(prob(10))
if(prob(10) && !trained)
Discipline--
if(!client && !stop_automated_movement)
@@ -361,6 +362,8 @@
newmood = ":3"
else if(Target)
newmood = "mischievous"
else if(trained)
newmood = ":33"
if(!newmood)
if(Discipline && prob(25))
@@ -476,3 +479,24 @@
if(hunger == 2 || rabid || attacked)
return TRUE
return TRUE
// Handles xeno organ processing, and turns the unidentified organs into the true organ type.
/mob/living/simple_animal/slime/proc/handle_organs()
if(!holding_organ)
return
if(istype(loc, /obj/machinery/computer/camera_advanced/xenobio))
return // no processing while in the computer
if(!trained) // if we somehow untrain mid process
say("BLECK!!", pick(speak_emote))
eject_organ()
if(organ_progress < 50)
organ_progress += 1
return
organ_progress = 1
say("All done!", pick(speak_emote))
var/obj/item/organ/internal/finished_organ = new holding_organ.true_organ_type(src.loc)
finished_organ.organ_quality = holding_organ.unknown_quality
finished_organ.icon_state = holding_organ.icon_state
finished_organ.name = "[quality_to_string(finished_organ.organ_quality, FALSE)] [finished_organ.name]"
underlays.Cut()
QDEL_NULL(holding_organ)
@@ -9,6 +9,7 @@
var/is_adult = FALSE
var/docile = FALSE
faction = list("slime", "neutral")
new_attack_chain = TRUE
harm_intent_damage = 5
icon_living = "grey baby slime"
@@ -49,7 +50,7 @@
var/target_patience = 0 // AI variable, cooloff-ish for how long it's going to follow its target
var/mood = "" // To show its face
var/mutator_used = FALSE //So you can't shove a dozen mutators into a single slime
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+\\)")
@@ -64,6 +65,12 @@
var/Discipline = 0
/// Stun variable
var/SStun = 0
// does this slime have a xeno organ inserted into it already?
var/obj/item/xeno_organ/holding_organ
// An elevated form of discipline. Is this slime trained and ready to begin organ therapy?
var/trained = FALSE
// how far along in the organ processing are we
var/organ_progress = 0
///////////TIME FOR SUBSPECIES
@@ -111,6 +118,22 @@
Target = null
return ..()
/mob/living/simple_animal/slime/death()
if(holding_organ)
eject_organ()
underlays.Cut()
return ..()
/mob/living/simple_animal/slime/update_overlays()
. = ..()
if(stat != DEAD)
. += "aslime-[mood]"
if(holding_organ)
var/mutable_appearance/underlay_appearance = mutable_appearance(layer = 3.9, plane = GAME_PLANE) // 3.9 so it wont potentially layer weird if someones laying below
underlay_appearance.icon = icon = 'icons/mob/slimes.dmi'
underlay_appearance.icon_state = "xeno_organ"
underlays += underlay_appearance
/mob/living/simple_animal/slime/proc/set_colour(new_colour)
colour = new_colour
update_appearance(UPDATE_NAME)
@@ -136,7 +159,7 @@
if(stat != DEAD)
icon_state = icon_text
if(mood && stat == CONSCIOUS)
add_overlay("aslime-[mood]")
update_appearance(UPDATE_OVERLAYS)
else
icon_state = icon_dead
@@ -347,6 +370,11 @@
for(var/datum/surgery/S in surgeries)
if(S.next_step(M, src))
return 1
if(M.a_intent == INTENT_HELP)
new /obj/effect/temp_visual/heart(src.loc)
if(prob(4))
discipline_slime(M, positive_reinforcement = TRUE)
if(..()) //successful attack
attacked += 10
@@ -355,18 +383,43 @@
attacked += 10
discipline_slime(M)
/mob/living/simple_animal/slime/item_interaction(mob/living/user, obj/item/I, list/modifiers)
if(stat == DEAD && length(surgeries))
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 ITEM_INTERACT_COMPLETE
if(istype(I, /obj/item/xeno_organ) && stat == CONSCIOUS)
if(!is_adult)
to_chat(user, "<span class='notice'>The slime is not old enough yet to process organs!</span>")
return ITEM_INTERACT_COMPLETE
if(holding_organ)
to_chat(user, "<span class='warning'>The slime is already processing an organ!</span>")
return ITEM_INTERACT_COMPLETE
if(trained)
if(src.mind)
src.visible_message("<span class='notice'>Sentient slimes are unable to process organs!</span>")
return ITEM_INTERACT_COMPLETE
if(user.transfer_item_to(I, src, force = TRUE))
holding_organ = I
src.visible_message("<span class='notice'>The slime gently pulls the offered organ into itself.</span>")
update_appearance(UPDATE_OVERLAYS)
return ITEM_INTERACT_COMPLETE
else
to_chat(user, "<span class='notice'>The slime seems puzzled at what you want it to do with the organ! It needs to be trained first.</span>")
return ITEM_INTERACT_COMPLETE
if(istype(I, /obj/item/stack/sheet/mineral/plasma) && stat == CONSCIOUS) //Let's you feed slimes plasma.
to_chat(user, "<span class='notice'>You feed the slime the plasma. It chirps happily.</span>")
var/obj/item/stack/sheet/mineral/plasma/S = I
S.use(1)
discipline_slime(user)
if(S.amount < 5)
to_chat(user, "<span class='notice'>You need at least five sheets of plasma to feed the slime!</span>")
return ITEM_INTERACT_COMPLETE
new /obj/effect/temp_visual/heart(loc)
visible_message("<span class='notice'>[user] feeds the slime some plasma. It chirps happily!</span>", "<span class='notice'>[user] feeds you a few sheets of plasma! Yummy!!!</span>")
S.use(5)
if(Discipline)
trained = TRUE
else
discipline_slime(user, positive_reinforcement = TRUE)
return ITEM_INTERACT_COMPLETE
if(I.force > 0)
attacked += 10
@@ -375,9 +428,12 @@
user.changeNext_move(CLICK_CD_MELEE)
to_chat(user, "<span class='danger'>[I] passes right through [src]!</span>")
return ITEM_INTERACT_COMPLETE
if(Discipline && prob(50)) // wow, buddy, why am I getting attacked??
if(Discipline && prob(50) && !trained) // wow, buddy, why am I getting attacked??
Discipline = 0
return ITEM_INTERACT_COMPLETE
if(trained && prob(20)) // trained slimes are more resistant to losing discipline
trained = 0
visible_message("<span class='warning'>[src] gets spooked and cowers from [user]!</span>")
/mob/living/simple_animal/slime/attacked_by(obj/item/I, mob/living/user)
if(..())
@@ -394,9 +450,18 @@
. = ..()
var/water_damage = rand(10, 15) * volume
adjustBruteLoss(water_damage)
// Extinguishers just piss them off more
if(!client && istype(source, /obj/effect/particle_effect/water))
adjustBruteLoss(5) // extra potent
if(trained && prob(75))
say("Ow! HEY!!!", pick(speak_emote))
trained = FALSE
rabid = TRUE
if(!client && Target && volume >= 3) // Like cats
Target = null
++Discipline
discipline_slime(FALSE)
if(prob(5))
say("Ow ow ow!", pick(speak_emote))
/mob/living/simple_animal/slime/examine(mob/user)
. = ..()
@@ -413,7 +478,8 @@
else
. += "<B>It has severe punctures and tears in its flesh!</B>"
. += "</span>\n"
if(holding_organ)
. += "It seems to be currently processing something inside of itself."
switch(powerlevel)
if(2 to 3)
. += "It is flickering gently with a little electrical activity."
@@ -429,23 +495,30 @@
. += "</span>"
/mob/living/simple_animal/slime/proc/discipline_slime(mob/user)
/mob/living/simple_animal/slime/proc/discipline_slime(mob/user, positive_reinforcement = FALSE)
if(stat)
return
if(prob(80) && !client)
if(!client)
Discipline++
if(!is_adult)
if(Discipline == 1)
if(Discipline >= 1)
attacked = 0
if(Target)
if(trained && !positive_reinforcement)
say("Sorry...", pick(speak_emote))
Target = null
if(buckled)
Feedstop(silent = TRUE) //we unbuckle the slime from the mob it latched onto.
SStun = world.time + rand(20,60)
if(positive_reinforcement)
mood = ":33"
regenerate_icons()
return
spawn(0)
ADD_TRAIT(src, TRAIT_IMMOBILIZED, SLIME_TRAIT)
if(user)
@@ -480,3 +553,13 @@
/mob/living/simple_animal/slime/unit_test_dummy
wander = FALSE
stop_automated_movement = TRUE
/mob/living/simple_animal/slime/proc/eject_organ()
holding_organ.forceMove(loc)
visible_message("<span class='notice'>[src] drops \the [holding_organ.name] as it splits!</span>")
holding_organ = null
update_appearance()
/mob/living/simple_animal/slime/sentience_act()
. = ..()
eject_organ()
@@ -167,7 +167,8 @@
if(istype(loc, /obj/machinery/computer/camera_advanced/xenobio))
return //no you cannot split while you're in the matrix (this prevents GC issues and slimes disappearing)
if(holding_organ)
eject_organ()
var/list/babies = list()
var/new_nutrition = round(nutrition * 0.9)
var/new_powerlevel = round(powerlevel / 4)