mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-07-13 09:05:11 +01:00
191 lines
6.5 KiB
Plaintext
191 lines
6.5 KiB
Plaintext
/mob/living/basic/frog
|
|
name = "frog"
|
|
desc = "They seem a little sad."
|
|
icon_state = "frog"
|
|
icon_living = "frog"
|
|
icon_dead = "frog_dead"
|
|
mob_biotypes = MOB_ORGANIC|MOB_BEAST|MOB_AQUATIC
|
|
verb_say = "ribbits"
|
|
verb_ask = "ribbits inquisitively"
|
|
verb_exclaim = "croaks"
|
|
verb_yell = "croaks loudly"
|
|
maxHealth = 15
|
|
health = 15
|
|
speed = 1.1
|
|
melee_damage_lower = 5
|
|
melee_damage_upper = 5
|
|
obj_damage = 10
|
|
attack_verb_continuous = "bites"
|
|
attack_verb_simple = "bite"
|
|
melee_attack_cooldown = 2.5 SECONDS
|
|
response_help_continuous = "pets"
|
|
response_help_simple = "pet"
|
|
response_disarm_continuous = "pokes"
|
|
response_disarm_simple = "poke"
|
|
response_harm_continuous = "splats"
|
|
response_harm_simple = "splat"
|
|
density = FALSE
|
|
faction = list(FACTION_HOSTILE, FACTION_MAINT_CREATURES)
|
|
attack_sound = 'sound/mobs/non-humanoids/frog/reee.ogg'
|
|
butcher_results = list(/obj/item/food/nugget = 1)
|
|
pass_flags = PASSTABLE | PASSGRILLE | PASSMOB
|
|
mob_size = MOB_SIZE_TINY
|
|
gold_core_spawnable = FRIENDLY_SPAWN
|
|
can_be_held = TRUE
|
|
held_w_class = WEIGHT_CLASS_TINY
|
|
worn_slot_flags = ITEM_SLOT_HEAD
|
|
head_icon = 'icons/mob/clothing/head/pets_head.dmi'
|
|
|
|
habitable_atmos = list("min_oxy" = 3, "max_oxy" = 0, "min_plas" = 0, "max_plas" = 15, "min_co2" = 0, "max_co2" = 15, "min_n2" = 0, "max_n2" = 0)
|
|
|
|
ai_controller = /datum/ai_controller/basic_controller/frog
|
|
|
|
var/stepped_sound = 'sound/mobs/non-humanoids/frog/huuu.ogg'
|
|
///How much of a reagent the mob injects on attack
|
|
var/poison_per_bite = 3
|
|
///What reagent the mob injects targets with
|
|
var/poison_type = /datum/reagent/drug/space_drugs
|
|
///What type do we become if influenced by a regal rat?
|
|
var/minion_type = /mob/living/basic/frog/crazy
|
|
|
|
/mob/living/basic/frog/Initialize(mapload)
|
|
. = ..()
|
|
|
|
add_traits(list(TRAIT_NODROWN, TRAIT_SWIMMER, TRAIT_VENTCRAWLER_ALWAYS), INNATE_TRAIT)
|
|
|
|
var/static/list/loc_connections = list(
|
|
COMSIG_ATOM_ENTERED = PROC_REF(on_entered),
|
|
)
|
|
AddElement(/datum/element/connect_loc, loc_connections)
|
|
AddElement(/datum/element/venomous, poison_type, poison_per_bite)
|
|
AddElement(/datum/element/ai_retaliate)
|
|
AddElement(/datum/element/swabable, CELL_LINE_TABLE_FROG, CELL_VIRUS_TABLE_GENERIC_MOB, 1, 5)
|
|
if (minion_type)
|
|
AddElement(/datum/element/regal_rat_minion, converted_path = minion_type, success_balloon = "ribbit", pet_commands = GLOB.regal_rat_minion_commands)
|
|
|
|
/mob/living/basic/frog/proc/on_entered(datum/source, entered as mob|obj)
|
|
SIGNAL_HANDLER
|
|
if(stat || !isliving(entered))
|
|
return
|
|
var/mob/living/entered_mob = entered
|
|
if(entered_mob.mob_size > MOB_SIZE_TINY)
|
|
playsound(src, stepped_sound, vol = 50, vary = TRUE)
|
|
|
|
/mob/living/basic/frog/rare
|
|
name = "rare frog"
|
|
desc = "They seem a little smug."
|
|
icon_state = "rare_frog"
|
|
icon_living = "rare_frog"
|
|
icon_dead = "rare_frog_dead"
|
|
gold_core_spawnable = NO_SPAWN
|
|
butcher_results = list(/obj/item/food/nugget = 5)
|
|
poison_type = /datum/reagent/drug/mushroomhallucinogen
|
|
minion_type = /mob/living/basic/frog/crazy/rare
|
|
|
|
/// These frogs would REALLY rather like to get at your blood basically by any means possible
|
|
/mob/living/basic/frog/crazy
|
|
name = "trash frog"
|
|
desc = "They seem a little mad."
|
|
icon_state = "frog_trash"
|
|
icon_living = "frog_trash"
|
|
icon_dead = "frog_trash_dead"
|
|
health = 25
|
|
maxHealth = 25
|
|
melee_damage_lower = 6
|
|
melee_damage_upper = 15
|
|
obj_damage = 20
|
|
minion_type = null
|
|
gold_core_spawnable = HOSTILE_SPAWN
|
|
ai_controller = /datum/ai_controller/basic_controller/frog/trash
|
|
|
|
/mob/living/basic/frog/crazy/rare
|
|
name = "crazy frog"
|
|
desc = "They look hopping mad."
|
|
icon_state = "rare_frog_trash"
|
|
icon_living = "rare_frog_trash"
|
|
icon_dead = "rare_frog_trash_dead"
|
|
minion_type = null
|
|
gold_core_spawnable = NO_SPAWN
|
|
butcher_results = list(/obj/item/food/nugget = 5)
|
|
poison_type = /datum/reagent/drug/mushroomhallucinogen
|
|
|
|
/// The cold doesn't bother him
|
|
/mob/living/basic/frog/icemoon_facility
|
|
name = "Peter Jr."
|
|
desc = "They seem a little cold."
|
|
minimum_survivable_temperature = BODYTEMP_COLD_ICEBOX_SAFE
|
|
pressure_resistance = 200
|
|
habitable_atmos = null
|
|
gold_core_spawnable = NO_SPAWN
|
|
|
|
/mob/living/basic/frog/icemoon_facility/crazy
|
|
name = "Crazy Pete"
|
|
desc = "The cold is really getting to him."
|
|
icon_state = "frog_trash"
|
|
icon_living = "frog_trash"
|
|
icon_dead = "frog_trash_dead"
|
|
ai_controller = /datum/ai_controller/basic_controller/frog/trash
|
|
|
|
|
|
/// Frog spawned by leapers which explodes on attack
|
|
/mob/living/basic/frog/suicide
|
|
name = "suicide frog"
|
|
desc = "Driven by sheer will."
|
|
icon_state = "frog_trash"
|
|
icon_living = "frog_trash"
|
|
icon_dead = "frog_trash_dead"
|
|
maxHealth = 5
|
|
health = 5
|
|
ai_controller = /datum/ai_controller/basic_controller/frog/suicide_frog
|
|
minion_type = null
|
|
///how long do we exist for
|
|
var/existence_period = 15 SECONDS
|
|
|
|
/mob/living/basic/frog/suicide/Initialize(mapload)
|
|
. = ..()
|
|
AddComponent(/datum/component/explode_on_attack, mob_type_dont_bomb = typecacheof(list(/mob/living/basic/frog, /mob/living/basic/leaper)))
|
|
addtimer(CALLBACK(src, PROC_REF(death)), existence_period)
|
|
|
|
/datum/ai_controller/basic_controller/frog
|
|
blackboard = list(
|
|
BB_BASIC_MOB_STOP_FLEEING = TRUE, //We only flee from scary fishermen.
|
|
BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic,
|
|
BB_PET_TARGETING_STRATEGY = /datum/targeting_strategy/basic/not_friends,
|
|
BB_OWNER_SELF_HARM_RESPONSES = list(
|
|
"*me licks its own eyeballs in disapproval.",
|
|
"*me croaks sadly."
|
|
)
|
|
)
|
|
|
|
ai_movement = /datum/ai_movement/basic_avoidance
|
|
idle_behavior = /datum/idle_behavior/idle_random_walk
|
|
planning_subtrees = list(
|
|
/datum/ai_planning_subtree/target_retaliate,
|
|
/datum/ai_planning_subtree/random_speech/frog,
|
|
/datum/ai_planning_subtree/basic_melee_attack_subtree/no_fisherman,
|
|
/datum/ai_planning_subtree/flee_target/from_fisherman,
|
|
/datum/ai_planning_subtree/go_for_swim,
|
|
)
|
|
|
|
/datum/ai_controller/basic_controller/frog/trash
|
|
planning_subtrees = list(
|
|
/datum/ai_planning_subtree/escape_captivity,
|
|
/datum/ai_planning_subtree/pet_planning,
|
|
/datum/ai_planning_subtree/random_speech/frog,
|
|
/datum/ai_planning_subtree/simple_find_target,
|
|
/datum/ai_planning_subtree/basic_melee_attack_subtree/no_fisherman,
|
|
/datum/ai_planning_subtree/flee_target/from_fisherman,
|
|
)
|
|
|
|
/datum/ai_controller/basic_controller/frog/suicide_frog
|
|
blackboard = list(
|
|
BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic,
|
|
BB_PET_TARGETING_STRATEGY = /datum/targeting_strategy/basic/not_friends,
|
|
BB_TARGET_PRIORITY_TRAIT = TRAIT_SCARY_FISHERMAN, //No fear, only hatred. It has nothing to lose
|
|
)
|
|
|
|
planning_subtrees = list(
|
|
/datum/ai_planning_subtree/find_target_prioritize_traits,
|
|
/datum/ai_planning_subtree/basic_melee_attack_subtree,
|
|
)
|