mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-08-21 02:57:48 +01:00
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:
co-authored by
PollardTheDragon
1080pCat
Luc
warriorstar-orion
BeagleGaming1
Burzah
parent
438b3d7c98
commit
fdcf4899a2
@@ -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
|
||||
|
||||
@@ -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.
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user