mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-07-20 03:25:49 +01:00
Converts simple xeno mobs to basic mobs (#29975)
* Basic xenos * Fixed config, better ranged code * Syndiecakes corgis * Lavaland subtypes * Renames files because conflict with midround xenos * Linters, enviro-smash --------- Signed-off-by: PollardTheDragon <144391971+PollardTheDragon@users.noreply.github.com>
This commit is contained in:
@@ -162,7 +162,6 @@ RESTRICT_TYPE(/mob/living/basic)
|
||||
var/ranged_burst_interval = 0.2 SECONDS
|
||||
/// Time between bursts
|
||||
var/ranged_cooldown = 2 SECONDS
|
||||
|
||||
/// What casing type is the projectile?
|
||||
var/casing_type
|
||||
/// What projectile do we shoot?
|
||||
|
||||
@@ -0,0 +1,91 @@
|
||||
/datum/ai_controller/basic_controller/alien
|
||||
ai_movement = /datum/ai_movement/basic_avoidance
|
||||
idle_behavior = /datum/idle_behavior/idle_random_walk
|
||||
blackboard = list(
|
||||
BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic,
|
||||
)
|
||||
|
||||
planning_subtrees = list(
|
||||
/datum/ai_planning_subtree/random_speech/alien,
|
||||
/datum/ai_planning_subtree/simple_find_target,
|
||||
/datum/ai_planning_subtree/attack_obstacle_in_path,
|
||||
/datum/ai_planning_subtree/basic_melee_attack_subtree,
|
||||
)
|
||||
ai_traits = AI_FLAG_PAUSE_DURING_DO_AFTER
|
||||
movement_delay = 0.8 SECONDS
|
||||
|
||||
/datum/ai_controller/basic_controller/alien/sentinel
|
||||
planning_subtrees = list(
|
||||
/datum/ai_planning_subtree/random_speech/alien,
|
||||
/datum/ai_planning_subtree/simple_find_target,
|
||||
/datum/ai_planning_subtree/maintain_distance,
|
||||
/datum/ai_planning_subtree/basic_melee_attack_subtree/opportunistic,
|
||||
/datum/ai_planning_subtree/ranged_skirmish,
|
||||
)
|
||||
|
||||
/datum/ai_controller/basic_controller/alien/corgi
|
||||
planning_subtrees = list(
|
||||
/datum/ai_planning_subtree/simple_find_target,
|
||||
/datum/ai_planning_subtree/maintain_distance,
|
||||
/datum/ai_planning_subtree/basic_melee_attack_subtree/opportunistic,
|
||||
/datum/ai_planning_subtree/ranged_skirmish,
|
||||
)
|
||||
|
||||
/datum/ai_controller/basic_controller/alien/drone
|
||||
idle_behavior = /datum/idle_behavior/idle_random_walk/plant_weeds
|
||||
|
||||
/datum/ai_controller/basic_controller/alien/queen
|
||||
idle_behavior = /datum/idle_behavior/idle_random_walk/plant_weeds/queen
|
||||
|
||||
planning_subtrees = list(
|
||||
/datum/ai_planning_subtree/random_speech/alien,
|
||||
/datum/ai_planning_subtree/simple_find_target,
|
||||
/datum/ai_planning_subtree/maintain_distance,
|
||||
/datum/ai_planning_subtree/basic_melee_attack_subtree/opportunistic,
|
||||
/datum/ai_planning_subtree/ranged_skirmish,
|
||||
)
|
||||
|
||||
/datum/ai_controller/basic_controller/alien/maid
|
||||
planning_subtrees = list(
|
||||
/datum/ai_planning_subtree/find_nearest_thing_which_attacked_me_to_flee,
|
||||
/datum/ai_planning_subtree/flee_target,
|
||||
/datum/ai_planning_subtree/find_and_hunt_target/clean,
|
||||
)
|
||||
|
||||
/**
|
||||
* Alien projectile
|
||||
* Try to avoid friendly fire, and has a 3 second delay.
|
||||
*/
|
||||
|
||||
/datum/idle_behavior/idle_random_walk/plant_weeds
|
||||
var/plant_cooldown = 30
|
||||
var/plants_off = 0
|
||||
|
||||
/datum/idle_behavior/idle_random_walk/plant_weeds/perform_idle_behavior(seconds_per_tick, datum/ai_controller/controller)
|
||||
. = ..()
|
||||
if(!.)
|
||||
return .
|
||||
plant_cooldown--
|
||||
var/mob/living/basic/alien/alien_pawn = controller.pawn
|
||||
if(alien_pawn.can_plant_weeds && !plants_off && plant_cooldown <= 0)
|
||||
plant_cooldown = initial(plant_cooldown)
|
||||
alien_pawn.spread_plants()
|
||||
|
||||
/datum/idle_behavior/idle_random_walk/plant_weeds/queen
|
||||
var/eggs_off = 0
|
||||
var/egg_cooldown = 30
|
||||
|
||||
/datum/idle_behavior/idle_random_walk/plant_weeds/queen/perform_idle_behavior(seconds_per_tick, datum/ai_controller/controller)
|
||||
. = ..()
|
||||
if(!.)
|
||||
return .
|
||||
egg_cooldown--
|
||||
var/mob/living/basic/alien/alien_pawn = controller.pawn
|
||||
if(alien_pawn.can_lay_eggs && !eggs_off && egg_cooldown <= 0)
|
||||
egg_cooldown = initial(egg_cooldown)
|
||||
alien_pawn.lay_eggs()
|
||||
|
||||
/datum/ai_planning_subtree/random_speech/alien
|
||||
speech_chance = 2
|
||||
sound = list('sound/voice/hiss1.ogg', 'sound/voice/hiss2.ogg', 'sound/voice/hiss3.ogg', 'sound/voice/hiss4.ogg')
|
||||
emote_hear = list("hisses.")
|
||||
@@ -0,0 +1,12 @@
|
||||
/mob/living/basic/alien/drone
|
||||
name = "alien drone"
|
||||
icon_state = "aliend_running"
|
||||
icon_living = "aliend_running"
|
||||
icon_dead = "aliend_dead"
|
||||
melee_damage_lower = 15
|
||||
melee_damage_upper = 15
|
||||
|
||||
ai_controller = /datum/ai_controller/basic_controller/alien/drone
|
||||
|
||||
/mob/living/basic/alien/drone/lavaland
|
||||
maximum_survivable_temperature = INFINITY
|
||||
@@ -0,0 +1,71 @@
|
||||
/mob/living/basic/alien
|
||||
name = "alien hunter"
|
||||
desc = "Hiss!"
|
||||
icon = 'icons/mob/alien.dmi'
|
||||
icon_state = "alienh_running"
|
||||
icon_living = "alienh_running"
|
||||
icon_dead = "alienh_dead"
|
||||
icon_gib = "syndicate_gib"
|
||||
gender = FEMALE
|
||||
speed = 0
|
||||
status_flags = CANPUSH
|
||||
basic_mob_flags = FLAMMABLE_MOB
|
||||
butcher_results = list(/obj/item/food/monstermeat/xenomeat= 3, /obj/item/stack/sheet/animalhide/xeno = 1)
|
||||
maxHealth = 125
|
||||
health = 125
|
||||
harm_intent_damage = 5
|
||||
obj_damage = 60
|
||||
|
||||
melee_attack_cooldown_min = 1.5 SECONDS
|
||||
melee_attack_cooldown_max = 2.5 SECONDS
|
||||
speak_emote = list("hisses")
|
||||
melee_damage_lower = 25
|
||||
melee_damage_upper = 25
|
||||
attack_verb_continuous = "slashes"
|
||||
attack_verb_simple = "slash"
|
||||
environment_smash = ENVIRONMENT_SMASH_STRUCTURES
|
||||
|
||||
bubble_icon = "alien"
|
||||
a_intent = INTENT_HARM
|
||||
attack_sound = 'sound/weapons/bladeslice.ogg'
|
||||
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)
|
||||
unsuitable_atmos_damage = 15
|
||||
unsuitable_heat_damage = 20
|
||||
faction = list("alien")
|
||||
minimum_survivable_temperature = 0
|
||||
see_in_dark = 8
|
||||
lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE
|
||||
death_sound = 'sound/voice/hiss6.ogg'
|
||||
deathmessage = "lets out a waning guttural screech, green blood bubbling from its maw..."
|
||||
step_type = FOOTSTEP_MOB_CLAW
|
||||
loot = list(/obj/effect/decal/cleanable/blood/gibs/xeno/limb, /obj/effect/decal/cleanable/blood/gibs/xeno/core, /obj/effect/decal/cleanable/blood/xeno/splatter, /obj/effect/decal/cleanable/blood/gibs/xeno/body, /obj/effect/decal/cleanable/blood/gibs/xeno/down)
|
||||
|
||||
ai_controller = /datum/ai_controller/basic_controller/alien
|
||||
|
||||
/// Boolean on whether the xeno can plant weeds.
|
||||
var/can_plant_weeds = TRUE
|
||||
/// Boolean on whether the xeno can lay eggs.
|
||||
var/can_lay_eggs = FALSE
|
||||
|
||||
/mob/living/basic/alien/Initialize(mapload)
|
||||
. = ..()
|
||||
AddComponent(/datum/component/aggro_emote, emote_list = list("flutters"), emote_chance = 20)
|
||||
|
||||
/mob/living/basic/alien/proc/spread_plants()
|
||||
if(!isturf(loc) || isspaceturf(loc))
|
||||
return
|
||||
if(locate(/obj/structure/alien/weeds/node) in get_turf(src))
|
||||
return
|
||||
visible_message("<span class='alertalien'>[src] has planted some alien weeds!</span>")
|
||||
new /obj/structure/alien/weeds/node(loc)
|
||||
|
||||
/mob/living/basic/alien/proc/lay_eggs()
|
||||
if(!isturf(loc) || isspaceturf(loc))
|
||||
return
|
||||
if(locate(/obj/structure/alien/egg) in get_turf(src))
|
||||
return
|
||||
visible_message("<span class='alertalien'>[src] has laid an egg!</span>")
|
||||
new /obj/structure/alien/egg(loc)
|
||||
|
||||
/mob/living/basic/alien/lavaland
|
||||
maximum_survivable_temperature = INFINITY
|
||||
@@ -0,0 +1,43 @@
|
||||
/mob/living/basic/alien/maid
|
||||
name = "lusty xenomorph maid"
|
||||
melee_damage_lower = 0
|
||||
melee_damage_upper = 0
|
||||
a_intent = INTENT_HELP
|
||||
friendly_verb_continuous = "caresses"
|
||||
friendly_verb_simple = "caress"
|
||||
obj_damage = 0
|
||||
environment_smash = ENVIRONMENT_SMASH_NONE
|
||||
gold_core_spawnable = HOSTILE_SPAWN
|
||||
ai_controller = /datum/ai_controller/basic_controller/alien/maid
|
||||
icon_state = "maid"
|
||||
icon_living = "maid"
|
||||
icon_dead = "maid_dead"
|
||||
/// How fast do we clean?
|
||||
var/cleanspeed = 15
|
||||
|
||||
/mob/living/basic/alien/maid/Initialize(mapload)
|
||||
. = ..()
|
||||
AddElement(/datum/element/ai_retaliate)
|
||||
|
||||
/// Clean instead of attack.
|
||||
/mob/living/basic/alien/maid/early_melee_attack(atom/target, list/modifiers, ignore_cooldown)
|
||||
. = ..()
|
||||
if(!.)
|
||||
return FALSE
|
||||
|
||||
clean_target(target)
|
||||
return FALSE
|
||||
|
||||
/mob/living/basic/alien/maid/proc/clean_target(atom/target)
|
||||
if(ishuman(target))
|
||||
var/atom/movable/H = target
|
||||
H.clean_blood()
|
||||
visible_message("<span class='notice'>\The [src] polishes \the [target].</span>")
|
||||
return FALSE
|
||||
target.cleaning_act(src, src, cleanspeed, text_description = ".") // LXM is both the user and the cleaning implement itself. Wow!
|
||||
|
||||
/mob/living/basic/alien/maid/can_clean()
|
||||
return TRUE
|
||||
|
||||
/mob/living/basic/alien/maid/lavaland
|
||||
maximum_survivable_temperature = INFINITY
|
||||
@@ -0,0 +1,34 @@
|
||||
/mob/living/basic/alien/queen
|
||||
name = "alien queen"
|
||||
icon_state = "alienq_running"
|
||||
icon_living = "alienq_running"
|
||||
icon_dead = "alienq_dead"
|
||||
health = 250
|
||||
maxHealth = 250
|
||||
melee_damage_lower = 15
|
||||
melee_damage_upper = 15
|
||||
status_flags = NONE // can't shove the queen, kiddo.
|
||||
|
||||
ai_controller = /datum/ai_controller/basic_controller/alien/queen
|
||||
|
||||
is_ranged = TRUE
|
||||
projectile_type = /obj/item/projectile/neurotox
|
||||
projectile_sound = 'sound/weapons/pierce.ogg'
|
||||
ranged_cooldown = 3 SECONDS
|
||||
|
||||
/mob/living/basic/alien/queen/lavaland
|
||||
maximum_survivable_temperature = INFINITY
|
||||
|
||||
/mob/living/basic/alien/queen/large
|
||||
name = "alien empress"
|
||||
icon = 'icons/mob/alienlarge.dmi'
|
||||
icon_state = "queen_s"
|
||||
icon_living = "queen_s"
|
||||
icon_dead = "queen_dead"
|
||||
bubble_icon = "alienroyal"
|
||||
maxHealth = 400
|
||||
health = 400
|
||||
mob_size = MOB_SIZE_LARGE
|
||||
|
||||
/mob/living/basic/alien/queen/large/lavaland
|
||||
maximum_survivable_temperature = INFINITY
|
||||
@@ -0,0 +1,37 @@
|
||||
/mob/living/basic/alien/sentinel
|
||||
name = "alien sentinel"
|
||||
icon_state = "aliens_running"
|
||||
icon_living = "aliens_running"
|
||||
icon_dead = "aliens_dead"
|
||||
health = 150
|
||||
maxHealth = 150
|
||||
melee_damage_lower = 15
|
||||
melee_damage_upper = 15
|
||||
|
||||
ai_controller = /datum/ai_controller/basic_controller/alien/sentinel
|
||||
|
||||
is_ranged = TRUE
|
||||
projectile_type = /obj/item/projectile/neurotox
|
||||
projectile_sound = 'sound/weapons/pierce.ogg'
|
||||
ranged_cooldown = 3 SECONDS
|
||||
|
||||
/mob/living/basic/alien/sentinel/corgi
|
||||
name = "angry corgi"
|
||||
real_name = "angry corgi"
|
||||
desc = "It's a corgi."
|
||||
icon_state = "corgi"
|
||||
icon_living = "corgi"
|
||||
icon_dead = "corgi_dead"
|
||||
icon = 'icons/mob/pets.dmi';
|
||||
desc = "This is no longer a goodboy. Not anymore. He has seen too much.";
|
||||
attack_sound = 'sound/weapons/bite.ogg';
|
||||
attack_verb_continuous = "bites";
|
||||
attack_verb_simple = "bites";
|
||||
damage_coeff = list("brute" = 1, "fire" = 1, "tox" = 1, "clone" = 1, "stamina" = 1, "oxy" = 1);
|
||||
death_sound = null;
|
||||
deathmessage = "";
|
||||
|
||||
ai_controller = /datum/ai_controller/basic_controller/alien/corgi
|
||||
|
||||
/mob/living/basic/alien/sentinel/lavaland
|
||||
maximum_survivable_temperature = INFINITY
|
||||
Reference in New Issue
Block a user