This commit is contained in:
Putnam3145
2022-08-07 17:59:28 -07:00
382 changed files with 5255 additions and 2567 deletions
@@ -19,6 +19,7 @@
path_image_color = "#993299"
weather_immunities = list("lava","ash")
var/base_icon = "cleanbot"
var/clean_time = 50 //How long do we take to clean?
var/upgrades = 0
@@ -126,13 +127,21 @@
/mob/living/simple_animal/bot/cleanbot/turn_on()
..()
icon_state = "cleanbot[on]"
bot_core.updateUsrDialog()
update_icon()
/mob/living/simple_animal/bot/cleanbot/turn_off()
..()
icon_state = "cleanbot[on]"
bot_core.updateUsrDialog()
update_icon()
/mob/living/simple_animal/bot/cleanbot/update_icon_state()
. = ..()
switch(mode)
if(BOT_CLEANING)
icon_state = "[base_icon]-c"
else
icon_state = "[base_icon][on]"
/mob/living/simple_animal/bot/cleanbot/bot_reset()
..()
@@ -381,6 +390,12 @@
target = null
mode = BOT_IDLE
icon_state = "cleanbot[on]"
else if(istype(A, /turf)) //for player-controlled cleanbots so they can clean unclickable messes like dirt
var/turf/T = A
for(var/atom/S in T.contents)
if(istype(S, /obj/effect/decal/cleanable)) //clean the first mess found
UnarmedAttack(S)
return
else if(istype(A, /obj/item) || istype(A, /obj/effect/decal/remains))
visible_message("<span class='danger'>[src] sprays hydrofluoric acid at [A]!</span>")
playsound(src, 'sound/effects/spray2.ogg', 50, TRUE, -6)
@@ -83,13 +83,12 @@
/mob/living/simple_animal/hostile/construct/examine(mob/user)
var/t_He = p_they(TRUE)
var/t_s = p_s()
. = list("<span class='cult'>*---------*\nThis is [icon2html(src, user)] \a <b>[src]</b>!\n[desc]")
. = list("<span class='cult'>This is [icon2html(src, user)] \a <b>[src]</b>!\n[desc]</span>")
if(health < maxHealth)
if(health >= maxHealth/2)
. += "<span class='warning'>[t_He] look[t_s] slightly dented.</span>"
else
. += "<span class='warning'><b>[t_He] look[t_s] severely dented!</b></span>"
. += "*---------*</span>"
/mob/living/simple_animal/hostile/construct/attack_animal(mob/living/simple_animal/M)
if(isconstruct(M)) //is it a construct?
@@ -223,7 +223,7 @@
QDEL_NULL(back) // chain destruction baby
return ..()
/mob/living/simple_animal/hostile/eldritch/armsy/BiologicalLife(seconds, times_fired)
/mob/living/simple_animal/hostile/eldritch/armsy/BiologicalLife(delta_time, times_fired)
adjustBruteLoss(-2)
/mob/living/simple_animal/hostile/eldritch/armsy/proc/heal()
@@ -35,6 +35,9 @@
collar_type = "cat"
var/held_icon = "cat2"
footstep_type = FOOTSTEP_MOB_CLAW
vocal_bark_id = "mutedc4"
vocal_pitch = 1.4
vocal_pitch_range = 0.4
/mob/living/simple_animal/pet/cat/Initialize(mapload)
. = ..()
@@ -115,7 +118,7 @@
Read_Memory()
. = ..()
/mob/living/simple_animal/pet/cat/Runtime/BiologicalLife(seconds, times_fired)
/mob/living/simple_animal/pet/cat/Runtime/BiologicalLife(delta_time, times_fired)
if(!(. = ..()))
return
if(!cats_deployed && SSticker.current_state >= GAME_STATE_SETTING_UP)
@@ -136,6 +139,7 @@
..()
/mob/living/simple_animal/pet/cat/Runtime/proc/Read_Memory()
var/saved_color
if(fexists("data/npc_saves/Runtime.sav")) //legacy compatability to convert old format to new
var/savefile/S = new /savefile("data/npc_saves/Runtime.sav")
S["family"] >> family
@@ -146,14 +150,21 @@
return
var/list/json = json_decode(file2text(json_file))
family = json["family"]
saved_color = json["color"]
if(isnull(family))
family = list()
if(!isnull(saved_color))
add_atom_colour(json_decode(saved_color), FIXED_COLOUR_PRIORITY)
/mob/living/simple_animal/pet/cat/Runtime/proc/Write_Memory(dead)
var/json_file = file("data/npc_saves/Runtime.json")
var/list/file_data = list()
family = list()
if(!dead)
if(color)
file_data["color"] = json_encode(color)
else
file_data["color"] = null
for(var/mob/living/simple_animal/pet/cat/kitten/C in children)
if(istype(C,type) || C.stat || !C.z || !C.butcher_results) //That last one is a work around for hologram cats
continue
@@ -161,6 +172,8 @@
family[C.type] += 1
else
family[C.type] = 1
else
file_data["color"] = null
file_data["family"] = family
fdel(json_file)
WRITE_FILE(json_file, json_encode(file_data))
@@ -178,7 +191,7 @@
gold_core_spawnable = NO_SPAWN
unique_pet = TRUE
/mob/living/simple_animal/pet/cat/BiologicalLife(seconds, times_fired)
/mob/living/simple_animal/pet/cat/BiologicalLife(delta_time, times_fired)
if(!(. = ..()))
return
if(!stat && !buckled && !client)
@@ -272,7 +285,7 @@
to_chat(src, "<span class='notice'>Your name is now <b>\"new_name\"</b>!</span>")
name = new_name
/mob/living/simple_animal/pet/cat/cak/BiologicalLife(seconds, times_fired)
/mob/living/simple_animal/pet/cat/cak/BiologicalLife(delta_time, times_fired)
if(!(. = ..()))
return
if(stat)
@@ -30,7 +30,7 @@
. = ..()
AddElement(/datum/element/ventcrawling, given_tier = VENTCRAWLER_ALWAYS)
/mob/living/simple_animal/crab/BiologicalLife(seconds, times_fired)
/mob/living/simple_animal/crab/BiologicalLife(delta_time, times_fired)
if(!(. = ..()))
return
//CRAB movement
@@ -20,6 +20,9 @@
footstep_type = FOOTSTEP_MOB_CLAW
vocal_bark_id = "bullet"
vocal_speed = 6
/mob/living/simple_animal/pet/dog/ComponentInitialize()
. = ..()
AddElement(/datum/element/wuv, "yaps happily!", EMOTE_AUDIBLE, /datum/mood_event/pet_animal, "growls!", EMOTE_AUDIBLE)
@@ -424,7 +427,7 @@ GLOBAL_LIST_INIT(strippable_corgi_items, create_strippable_list(list(
RemoveElement(/datum/element/mob_holder, held_icon)
AddElement(/datum/element/mob_holder, "old_corgi")
/mob/living/simple_animal/pet/dog/corgi/Ian/BiologicalLife(seconds, times_fired)
/mob/living/simple_animal/pet/dog/corgi/Ian/BiologicalLife(delta_time, times_fired)
if(!(. = ..()))
return
if(!stat && SSticker.current_state == GAME_STATE_FINISHED && !memory_saved)
@@ -438,6 +441,7 @@ GLOBAL_LIST_INIT(strippable_corgi_items, create_strippable_list(list(
/mob/living/simple_animal/pet/dog/corgi/Ian/proc/Read_Memory()
set waitfor = FALSE
var/saved_color
if(fexists("data/npc_saves/Ian.sav")) //legacy compatability to convert old format to new
var/savefile/S = new /savefile("data/npc_saves/Ian.sav")
S["age"] >> age
@@ -452,12 +456,15 @@ GLOBAL_LIST_INIT(strippable_corgi_items, create_strippable_list(list(
age = json["age"]
record_age = json["record_age"]
saved_head = json["saved_head"]
saved_color = json["color"]
if(isnull(age))
age = 0
if(isnull(record_age))
record_age = 1
if(saved_head)
place_on_head(new saved_head)
if(!isnull(saved_color))
add_atom_colour(json_decode(saved_color), FIXED_COLOUR_PRIORITY)
/mob/living/simple_animal/pet/dog/corgi/Ian/proc/Write_Memory(dead)
var/json_file = file("data/npc_saves/Ian.json")
@@ -472,10 +479,15 @@ GLOBAL_LIST_INIT(strippable_corgi_items, create_strippable_list(list(
file_data["saved_head"] = inventory_head.type
else
file_data["saved_head"] = null
if(color)
file_data["color"] = json_encode(color)
else
file_data["color"] = null
else
file_data["age"] = 0
file_data["record_age"] = record_age
file_data["saved_head"] = null
file_data["color"] = null
fdel(json_file)
WRITE_FILE(json_file, json_encode(file_data))
@@ -553,7 +565,7 @@ GLOBAL_LIST_INIT(strippable_corgi_items, create_strippable_list(list(
nofur = TRUE
unique_pet = TRUE
/mob/living/simple_animal/pet/dog/corgi/narsie/BiologicalLife(seconds, times_fired)
/mob/living/simple_animal/pet/dog/corgi/narsie/BiologicalLife(delta_time, times_fired)
if(!(. = ..()))
return
for(var/mob/living/simple_animal/pet/P in range(1, src))
@@ -632,6 +644,8 @@ GLOBAL_LIST_INIT(strippable_corgi_items, create_strippable_list(list(
mob_size = MOB_SIZE_SMALL
collar_type = "puppy"
vocal_pitch = 1.6
//puppies cannot wear anything.
/mob/living/simple_animal/pet/dog/corgi/puppy/Topic(href, href_list)
if(href_list["remove_inv"] || href_list["add_inv"])
@@ -653,6 +667,8 @@ GLOBAL_LIST_INIT(strippable_corgi_items, create_strippable_list(list(
maxbodytemp = T0C + 40
held_icon = "void_puppy"
vocal_pitch = 0.6
/mob/living/simple_animal/pet/dog/corgi/puppy/void/Process_Spacemove(movement_dir = 0)
return 1 //Void puppies can navigate space.
@@ -679,7 +695,7 @@ GLOBAL_LIST_INIT(strippable_corgi_items, create_strippable_list(list(
return
..()
/mob/living/simple_animal/pet/dog/corgi/Lisa/BiologicalLife(seconds, times_fired)
/mob/living/simple_animal/pet/dog/corgi/Lisa/BiologicalLife(delta_time, times_fired)
if(!(. = ..()))
return
@@ -693,7 +709,7 @@ GLOBAL_LIST_INIT(strippable_corgi_items, create_strippable_list(list(
setDir(i)
sleep(1)
/mob/living/simple_animal/pet/dog/pug/BiologicalLife(seconds, times_fired)
/mob/living/simple_animal/pet/dog/pug/BiologicalLife(delta_time, times_fired)
if(!(. = ..()))
return
if(!stat && CHECK_MULTIPLE_BITFIELDS(mobility_flags, MOBILITY_STAND|MOBILITY_MOVE) && !buckled)
@@ -178,7 +178,7 @@
/mob/living/simple_animal/drone/examine(mob/user)
. = list("<span class='info'>*---------*\nThis is [icon2html(src, user)] \a <b>[src]</b>!")
. = list("<span class='info'>This is [icon2html(src, user)] \a <b>[src]</b>!")
//Hands
for(var/obj/item/I in held_items)
@@ -214,7 +214,7 @@
. += "<span class='deadsay'>A message repeatedly flashes on its display: \"REBOOT -- REQUIRED\".</span>"
else
. += "<span class='deadsay'>A message repeatedly flashes on its display: \"ERROR -- OFFLINE\".</span>"
. += "*---------*</span>"
. += "</span>"
/mob/living/simple_animal/drone/assess_threat(judgement_criteria, lasercolor = "", datum/callback/weaponcheck=null) //Secbots won't hunt maintenance drones.
@@ -36,6 +36,7 @@
var/datum/reagent/milk_reagent = /datum/reagent/consumable/milk
footstep_type = FOOTSTEP_MOB_SHOE
vocal_bark_id = "banjoc3"
/mob/living/simple_animal/hostile/retaliate/goat/Initialize(mapload, /datum/reagent/milk_reagent)
udder = new (null, milk_reagent)
@@ -46,7 +47,7 @@
udder = null
return ..()
/mob/living/simple_animal/hostile/retaliate/goat/BiologicalLife(seconds, times_fired)
/mob/living/simple_animal/hostile/retaliate/goat/BiologicalLife(delta_time, times_fired)
if(!(. = ..()))
return
if(stat == CONSCIOUS)
@@ -143,6 +144,8 @@
blood_volume = BLOOD_VOLUME_NORMAL
footstep_type = FOOTSTEP_MOB_SHOE
vocal_bark_id = "mutedc2"
vocal_pitch = 1.2
/mob/living/simple_animal/cow/Initialize(mapload)
udder = new(null, milk_reagent)
@@ -160,7 +163,7 @@
else
return ..()
/mob/living/simple_animal/cow/BiologicalLife(seconds, times_fired)
/mob/living/simple_animal/cow/BiologicalLife(delta_time, times_fired)
if(!(. = ..()))
return
if(stat == CONSCIOUS)
@@ -247,6 +250,8 @@
gold_core_spawnable = FRIENDLY_SPAWN
footstep_type = FOOTSTEP_MOB_CLAW
vocal_bark_id = "squeak"
vocal_pitch = 1.4
/mob/living/simple_animal/chick/Initialize(mapload)
. = ..()
@@ -254,7 +259,7 @@
pixel_y = rand(0, 10)
AddElement(/datum/element/ventcrawling, given_tier = VENTCRAWLER_ALWAYS)
/mob/living/simple_animal/chick/BiologicalLife(seconds, times_fired)
/mob/living/simple_animal/chick/BiologicalLife(delta_time, times_fired)
if(!(. = ..()))
return
if(!stat && !ckey)
@@ -263,7 +268,7 @@
new /mob/living/simple_animal/chicken(src.loc)
qdel(src)
/mob/living/simple_animal/chick/holo/BiologicalLife(seconds, times_fired)
/mob/living/simple_animal/chick/holo/BiologicalLife(delta_time, times_fired)
if(!(. = ..()))
return
amount_grown = 0
@@ -309,6 +314,9 @@
var/static/chicken_count = 0
footstep_type = FOOTSTEP_MOB_CLAW
vocal_bark_id = "synthgrunt"
vocal_pitch = 1.4
vocal_pitch_range = 0.4
/mob/living/simple_animal/chicken/Initialize(mapload)
. = ..()
@@ -339,7 +347,7 @@
else
..()
/mob/living/simple_animal/chicken/BiologicalLife(seconds, times_fired)
/mob/living/simple_animal/chicken/BiologicalLife(delta_time, times_fired)
if(!(. = ..()))
return
if((!stat && prob(3) && eggsleft > 0) && egg_type)
@@ -403,6 +411,8 @@
var/static/kiwi_count = 0
footstep_type = FOOTSTEP_MOB_CLAW
vocal_bark_id = "squeak"
vocal_pitch = 1.4
/mob/living/simple_animal/kiwi/Destroy()
--kiwi_count
@@ -414,7 +424,7 @@
AddElement(/datum/element/ventcrawling, given_tier = VENTCRAWLER_ALWAYS)
/mob/living/simple_animal/kiwi/BiologicalLife(seconds, times_fired)
/mob/living/simple_animal/kiwi/BiologicalLife(delta_time, times_fired)
if(!(. = ..()))
return
if((!stat && prob(3) && eggsleft > 0) && egg_type)
@@ -481,6 +491,8 @@
gold_core_spawnable = FRIENDLY_SPAWN
footstep_type = FOOTSTEP_MOB_CLAW
vocal_bark_id = "squeak"
vocal_pitch = 1.4
/mob/living/simple_animal/babyKiwi/Initialize(mapload)
. = ..()
@@ -489,7 +501,7 @@
AddElement(/datum/element/ventcrawling, given_tier = VENTCRAWLER_ALWAYS)
/mob/living/simple_animal/babyKiwi/BiologicalLife(seconds, times_fired)
/mob/living/simple_animal/babyKiwi/BiologicalLife(delta_time, times_fired)
if(!(. = ..()))
return
if(!stat && !ckey)
@@ -557,3 +569,4 @@
maxHealth = 75
blood_volume = BLOOD_VOLUME_NORMAL
footstep_type = FOOTSTEP_MOB_SHOE
vocal_bark_id = "mutedc4"
@@ -23,6 +23,11 @@
gold_core_spawnable = FRIENDLY_SPAWN
footstep_type = FOOTSTEP_MOB_CLAW
vocal_bark_id = "bullet"
vocal_speed = 2
vocal_pitch = 1.6
vocal_pitch_range = 0.4
/mob/living/simple_animal/pet/fox/ComponentInitialize()
. = ..()
AddElement(/datum/element/mob_holder, "fox")
@@ -29,6 +29,8 @@
gold_core_spawnable = FRIENDLY_SPAWN
var/chew_probability = 1
faction = list("rat")
vocal_bark_id = "squeak"
vocal_pitch = 1.4
/mob/living/simple_animal/mouse/Initialize(mapload)
. = ..()
@@ -29,6 +29,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
pressure_resistance = 200
vocal_bark_id = "squeak"
vocal_pitch_range = 0.4
/mob/living/simple_animal/pet/plushie/ComponentInitialize()
. = ..()
@@ -72,7 +74,7 @@
qdel(src)
//low regen over time
/mob/living/simple_animal/pet/plushie/BiologicalLife(seconds, times_fired)
/mob/living/simple_animal/pet/plushie/BiologicalLife(delta_time, times_fired)
if(!(. = ..()))
return
if(health < maxHealth)
@@ -14,7 +14,7 @@
var/charging = 0
var/atom/movable/screen/alert/chargealert
/mob/living/simple_animal/hostile/guardian/charger/BiologicalLife(seconds, times_fired)
/mob/living/simple_animal/hostile/guardian/charger/BiologicalLife(delta_time, times_fired)
if(!(. = ..()))
return
if(ranged_cooldown <= world.time)
@@ -18,14 +18,14 @@
/mob/living/simple_animal/hostile/guardian/dextrous/examine(mob/user)
if(dextrous)
. = list("<span class='info'>*---------*\nThis is [icon2html(src)] \a <b>[src]</b>!\n[desc]")
. = list("<span class='info'>This is [icon2html(src)] \a <b>[src]</b>!\n[desc]")
for(var/obj/item/I in held_items)
if(!(I.item_flags & ABSTRACT))
. += "It has [I.get_examine_string(user)] in its [get_held_index_name(get_held_index_of_item(I))]."
if(internal_storage && !(internal_storage.item_flags & ABSTRACT))
. += "It is holding [internal_storage.get_examine_string(user)] in its internal storage."
. += "*---------*</span>"
. += "</span>"
else
return ..()
@@ -13,7 +13,7 @@
tech_fluff_string = "<span class='holoparasite'>Boot sequence complete. Crowd control modules activated. Holoparasite swarm online.</span>"
carp_fluff_string = "<span class='holoparasite'>CARP CARP CARP! You caught one! OH GOD, EVERYTHING'S ON FIRE. Except you and the fish.</span>"
/mob/living/simple_animal/hostile/guardian/fire/BiologicalLife(seconds, times_fired)
/mob/living/simple_animal/hostile/guardian/fire/BiologicalLife(delta_time, times_fired)
if(!(. = ..()))
return
if(summoner)
@@ -129,7 +129,7 @@
attack_verb_continuous = "slaps"
attack_verb_simple = "slap"
/mob/living/simple_animal/hostile/bear/butter/BiologicalLife(seconds, times_fired) //Heals butter bear really fast when he takes damage.
/mob/living/simple_animal/hostile/bear/butter/BiologicalLife(delta_time, times_fired) //Heals butter bear really fast when he takes damage.
if(stat)
return
if(health < maxHealth)
@@ -46,7 +46,7 @@
if(regen_amount)
regen_cooldown = world.time + REGENERATION_DELAY
/mob/living/simple_animal/hostile/carp/BiologicalLife(seconds, times_fired)
/mob/living/simple_animal/hostile/carp/BiologicalLife(delta_time, times_fired)
if(!(. = ..()))
return
if(regen_amount && regen_cooldown < world.time)
@@ -79,7 +79,7 @@
foes = null
return ..()
/mob/living/simple_animal/hostile/BiologicalLife(seconds, times_fired)
/mob/living/simple_animal/hostile/BiologicalLife(delta_time, times_fired)
if(!(. = ..()))
walk(src, 0) //stops walking
return
@@ -23,7 +23,7 @@
deathmessage = "vanishes into thin air! It was a fake!"
has_field_of_vision = FALSE //not meant to be played anyway.
/mob/living/simple_animal/hostile/illusion/BiologicalLife(seconds, times_fired)
/mob/living/simple_animal/hostile/illusion/BiologicalLife(delta_time, times_fired)
if(!(. = ..()))
return
if(world.time > life_span)
@@ -165,7 +165,7 @@
if(!hopping)
Hop()
/mob/living/simple_animal/hostile/jungle/leaper/BiologicalLife(seconds, times_fired)
/mob/living/simple_animal/hostile/jungle/leaper/BiologicalLife(delta_time, times_fired)
if(!(. = ..()))
return
update_icons()
@@ -26,7 +26,7 @@
footstep_type = FOOTSTEP_MOB_CLAW
/mob/living/simple_animal/hostile/jungle/mega_arachnid/BiologicalLife(seconds, times_fired)
/mob/living/simple_animal/hostile/jungle/mega_arachnid/BiologicalLife(delta_time, times_fired)
if(!(. = ..()))
return
if(target && ranged_cooldown > world.time && iscarbon(target))
@@ -89,7 +89,7 @@ Difficulty: Normal
/mob/living/simple_animal/hostile/megafauna/hierophant/spawn_crusher_loot()
new /obj/item/crusher_trophy/vortex_talisman(get_turf(spawned_beacon))
/mob/living/simple_animal/hostile/megafauna/hierophant/BiologicalLife(seconds, times_fired)
/mob/living/simple_animal/hostile/megafauna/hierophant/BiologicalLife(delta_time, times_fired)
if(!(. = ..()))
return
if(spawned_beacon && !QDELETED(spawned_beacon) && !client)
@@ -500,6 +500,8 @@ Difficulty: Normal
var/obj/item/projectile/P = mover
if(P.firer == caster)
return TRUE
if(mover != caster)
return FALSE
if(mover == caster)
return TRUE
@@ -74,7 +74,7 @@ GLOBAL_LIST_INIT(AISwarmerCapsByType, list(/mob/living/simple_animal/hostile/swa
step(R, ddir) //Step the swarmers, instead of spawning them there, incase the turf is solid
/mob/living/simple_animal/hostile/megafauna/swarmer_swarm_beacon/BiologicalLife(seconds, times_fired)
/mob/living/simple_animal/hostile/megafauna/swarmer_swarm_beacon/BiologicalLife(delta_time, times_fired)
if(!(. = ..()))
return
var/createtype = GetUncappedAISwarmerType()
@@ -118,7 +118,7 @@ GLOBAL_LIST_INIT(protected_objects, list(/obj/structure/table, /obj/structure/ca
overlay_googly_eyes = FALSE
CopyObject(copy, creator, destroy_original)
/mob/living/simple_animal/hostile/mimic/copy/BiologicalLife(seconds, times_fired)
/mob/living/simple_animal/hostile/mimic/copy/BiologicalLife(delta_time, times_fired)
if(!(. = ..()))
return
if(idledamage && !target && !ckey) //Objects eventually revert to normal if no one is around to terrorize
@@ -95,7 +95,7 @@
wanted_objects = list(/obj/item/pen/survival, /obj/item/stack/ore/diamond)
field_of_vision_type = FOV_270_DEGREES //Obviously, it's one eyeball.
/mob/living/simple_animal/hostile/asteroid/basilisk/watcher/BiologicalLife(seconds, times_fired)
/mob/living/simple_animal/hostile/asteroid/basilisk/watcher/BiologicalLife(delta_time, times_fired)
if(!(. = ..()))
return
if(stat == CONSCIOUS)
@@ -98,7 +98,7 @@
if(CALL_CHILDREN)
call_children()
/mob/living/simple_animal/hostile/asteroid/elite/broodmother/BiologicalLife(seconds, times_fired)
/mob/living/simple_animal/hostile/asteroid/elite/broodmother/BiologicalLife(delta_time, times_fired)
if(!(. = ..()))
return
if(health < maxHealth * 0.5 && rand_tent < world.time)
@@ -95,7 +95,7 @@
if(AOE_SQUARES)
aoe_squares(target)
/mob/living/simple_animal/hostile/asteroid/elite/pandora/BiologicalLife(seconds, times_fired)
/mob/living/simple_animal/hostile/asteroid/elite/pandora/BiologicalLife(delta_time, times_fired)
if(!(. = ..()))
return
if(health >= maxHealth * 0.5)
@@ -38,7 +38,7 @@
footstep_type = FOOTSTEP_MOB_HEAVY
/mob/living/simple_animal/hostile/asteroid/goliath/BiologicalLife(seconds, times_fired)
/mob/living/simple_animal/hostile/asteroid/goliath/BiologicalLife(delta_time, times_fired)
if(!(. = ..()))
return
handle_preattack()
@@ -129,7 +129,7 @@
var/turf/last_location
var/tentacle_recheck_cooldown = 100
/mob/living/simple_animal/hostile/asteroid/goliath/beast/ancient/BiologicalLife(seconds, times_fired)
/mob/living/simple_animal/hostile/asteroid/goliath/beast/ancient/BiologicalLife(delta_time, times_fired)
if(!(. = ..()))
return
if(isturf(loc))
@@ -114,7 +114,7 @@
name = "guthen"
gender = FEMALE
/mob/living/simple_animal/hostile/asteroid/gutlunch/guthen/BiologicalLife(seconds, times_fired)
/mob/living/simple_animal/hostile/asteroid/gutlunch/guthen/BiologicalLife(delta_time, times_fired)
if(!(. = ..()))
return
if(udder.reagents.total_volume == udder.reagents.maximum_volume) //Only breed when we're full.
@@ -198,7 +198,7 @@
swarming = TRUE
var/can_infest_dead = FALSE
/mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion/BiologicalLife(seconds, times_fired)
/mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion/BiologicalLife(delta_time, times_fired)
if(!(. = ..()))
return
if(isturf(loc))
@@ -62,7 +62,7 @@
SLEEP_CHECK_DEATH(8)
return ..()
/mob/living/simple_animal/hostile/asteroid/ice_demon/BiologicalLife(seconds, times_fired)
/mob/living/simple_animal/hostile/asteroid/ice_demon/BiologicalLife(delta_time, times_fired)
if(!(. = ..()))
return
if(target)
@@ -43,7 +43,7 @@
var/list/burn_turfs = getline(src, T) - get_turf(src)
dragon_fire_line(src, burn_turfs)
/mob/living/simple_animal/hostile/asteroid/ice_whelp/BiologicalLife(seconds, times_fired)
/mob/living/simple_animal/hostile/asteroid/ice_whelp/BiologicalLife(delta_time, times_fired)
if(!(. = ..()))
return
if(target)
@@ -44,7 +44,7 @@
aggressive_message_said = TRUE
rapid_melee = 2
/mob/living/simple_animal/hostile/asteroid/polarbear/BiologicalLife(seconds, times_fired)
/mob/living/simple_animal/hostile/asteroid/polarbear/BiologicalLife(delta_time, times_fired)
if(!(. = ..()))
return
if(target)
@@ -51,7 +51,7 @@
retreat_message_said = TRUE
retreat_distance = 30
/mob/living/simple_animal/hostile/asteroid/wolf/BiologicalLife(seconds, times_fired)
/mob/living/simple_animal/hostile/asteroid/wolf/BiologicalLife(delta_time, times_fired)
if(!(. = ..()))
return
if(target)
@@ -51,7 +51,7 @@
else
. += "<span class='info'>It looks like it's been roughed up.</span>"
/mob/living/simple_animal/hostile/mushroom/BiologicalLife(seconds, times_fired)
/mob/living/simple_animal/hostile/mushroom/BiologicalLife(delta_time, times_fired)
if(!(. = ..()))
return
if(!stat)//Mushrooms slowly regenerate if conscious, for people who want to save them from being eaten
@@ -45,7 +45,7 @@
var/chosen_sound = pick(migo_sounds)
playsound(src, chosen_sound, 100, TRUE)
/mob/living/simple_animal/hostile/netherworld/migo/BiologicalLife(seconds, times_fired)
/mob/living/simple_animal/hostile/netherworld/migo/BiologicalLife(delta_time, times_fired)
if(!(. = ..()))
return
if(stat)
@@ -86,7 +86,7 @@ GLOBAL_LIST_EMPTY(plague_rats)
walk_to(src, entry_vent)
break
/mob/living/simple_animal/hostile/plaguerat/BiologicalLife(seconds, times_fired)
/mob/living/simple_animal/hostile/plaguerat/BiologicalLife(delta_time, times_fired)
if(!(. = ..()))
return
if(isopenturf(loc))
@@ -56,7 +56,7 @@
..()
playsound(src.loc, 'sound/items/bikehorn.ogg', 50, TRUE)
/mob/living/simple_animal/hostile/retaliate/clown/BiologicalLife(seconds, times_fired)
/mob/living/simple_animal/hostile/retaliate/clown/BiologicalLife(delta_time, times_fired)
if(!(. = ..()))
return
if(banana_time && banana_time < world.time)
@@ -81,7 +81,7 @@
return 0
return ..()
/mob/living/simple_animal/hostile/statue/BiologicalLife(seconds, times_fired)
/mob/living/simple_animal/hostile/statue/BiologicalLife(delta_time, times_fired)
if(!(. = ..()))
return
if(!client && target) // If we have a target and we're AI controlled
@@ -44,7 +44,7 @@
gold_core_spawnable = HOSTILE_SPAWN
del_on_death = 1
/mob/living/simple_animal/hostile/tree/BiologicalLife(seconds, times_fired)
/mob/living/simple_animal/hostile/tree/BiologicalLife(delta_time, times_fired)
if(!(. = ..()))
return
if(isopenturf(loc))
@@ -100,7 +100,7 @@
/mob/living/simple_animal/hostile/venus_human_trap/ghost_playable
playable_plant = TRUE //For admins that want to buss some harmless plants
/mob/living/simple_animal/hostile/venus_human_trap/BiologicalLife(seconds, times_fired)
/mob/living/simple_animal/hostile/venus_human_trap/BiologicalLife(delta_time, times_fired)
if(!(. = ..()))
return
pull_vines()
@@ -47,7 +47,7 @@
QDEL_NULL(E)
return ..()
/mob/living/simple_animal/hostile/asteroid/fugu/BiologicalLife(seconds, times_fired)
/mob/living/simple_animal/hostile/asteroid/fugu/BiologicalLife(delta_time, times_fired)
if(!(. = ..()))
return
if(!wumbo)
+40 -25
View File
@@ -44,6 +44,10 @@
emote_hear = list("squawks.","bawks!")
emote_see = list("flutters its wings.")
vocal_bark_id = "banjoc4"
vocal_pitch = 1.4
vocal_pitch_range = 0.4
speak_chance = 1 //1% (1 in 100) chance every tick; So about once per 150 seconds, assuming an average tick is 1.5s
turns_per_move = 5
butcher_results = list(/obj/item/reagent_containers/food/snacks/cracker/ = 1)
@@ -80,7 +84,7 @@
var/speech_shuffle_rate = 20
var/list/available_channels = list()
//Headset for Poly to yell at engineers :)
//Headset for Polly to yell at engineers :)
var/obj/item/radio/headset/ears = null
/// spawns with headset
var/spawns_with_headset = FALSE
@@ -345,7 +349,7 @@ GLOBAL_LIST_INIT(strippable_parrot_items, create_strippable_list(list(
parrot_state |= PARROT_FLEE
icon_state = icon_living
drop_held_item(0)
else if(istype(O, /obj/item/reagent_containers/food/snacks/cracker)) //Poly wants a cracker.
else if(istype(O, /obj/item/reagent_containers/food/snacks/cracker)) //Polly wants a cracker.
qdel(O)
if(health < maxHealth)
adjustBruteLoss(-10)
@@ -372,7 +376,7 @@ GLOBAL_LIST_INIT(strippable_parrot_items, create_strippable_list(list(
/*
* AI - Not really intelligent, but I'm calling it AI anyway.
*/
/mob/living/simple_animal/parrot/BiologicalLife(seconds, times_fired)
/mob/living/simple_animal/parrot/BiologicalLife(delta_time, times_fired)
if(!(. = ..()))
return
//Sprite update for when a parrot gets pulled
@@ -890,10 +894,10 @@ GLOBAL_LIST_INIT(strippable_parrot_items, create_strippable_list(list(
/*
* Sub-types
*/
/mob/living/simple_animal/parrot/Poly
name = "Poly"
desc = "Poly the Parrot. An expert on quantum cracker theory."
speak = list("Poly wanna cracker!", ":e Check the crystal, you chucklefucks!",":e Wire the solars, you lazy bums!",":e WHO TOOK THE DAMN HARDSUITS?",":e OH GOD ITS ABOUT TO DELAMINATE CALL THE SHUTTLE")
/mob/living/simple_animal/parrot/Polly
name = "Polly"
desc = "Polly the Parrot. An expert on quantum cracker theory."
speak = list("Polly wanna cracker!", ":e Check the crystal, you chucklefucks!",":e Wire the solars, you lazy bums!",":e WHO TOOK THE DAMN HARDSUITS?",":e OH GOD ITS ABOUT TO DELAMINATE CALL THE SHUTTLE")
gold_core_spawnable = NO_SPAWN
speak_chance = 3
spawns_with_headset = TRUE
@@ -902,7 +906,7 @@ GLOBAL_LIST_INIT(strippable_parrot_items, create_strippable_list(list(
var/longest_survival = 0
var/longest_deathstreak = 0
/mob/living/simple_animal/parrot/Poly/Initialize(mapload)
/mob/living/simple_animal/parrot/Polly/Initialize(mapload)
ears = new /obj/item/radio/headset/headset_eng(src)
available_channels = list(":e")
Read_Memory()
@@ -910,11 +914,13 @@ GLOBAL_LIST_INIT(strippable_parrot_items, create_strippable_list(list(
speak += pick("...[longest_survival].", "The things I've seen!", "I have lived many lives!", "What are you before me?")
desc += " Old as sin, and just as loud. Claimed to be [rounds_survived]."
speak_chance = 20 //His hubris has made him more annoying/easier to justify killing
add_atom_colour("#EEEE22", FIXED_COLOUR_PRIORITY)
if(!color)
add_atom_colour("#EEEE22", FIXED_COLOUR_PRIORITY)
else if(rounds_survived == longest_deathstreak)
speak += pick("What are you waiting for!", "Violence breeds violence!", "Blood! Blood!", "Strike me down if you dare!")
desc += " The squawks of [-rounds_survived] dead parrots ring out in your ears..."
add_atom_colour("#BB7777", FIXED_COLOUR_PRIORITY)
if(!color)
add_atom_colour("#BB7777", FIXED_COLOUR_PRIORITY)
else if(rounds_survived > 0)
speak += pick("...again?", "No, It was over!", "Let me out!", "It never ends!")
desc += " Over [rounds_survived] shifts without a \"terrible\" \"accident\"!"
@@ -923,30 +929,31 @@ GLOBAL_LIST_INIT(strippable_parrot_items, create_strippable_list(list(
. = ..()
/mob/living/simple_animal/parrot/Poly/say(message, bubble_type,var/list/spans = list(), sanitize = TRUE, datum/language/language = null, ignore_spam = FALSE, forced = null)
/mob/living/simple_animal/parrot/Polly/say(message, bubble_type,var/list/spans = list(), sanitize = TRUE, datum/language/language = null, ignore_spam = FALSE, forced = null)
. = ..()
if(. && !client && prob(1) && prob(1)) //Only the one true bird may speak across dimensions.
world.TgsTargetedChatBroadcast("A stray squawk is heard... \"[message]\"", FALSE)
if(. && !client && prob(1) && prob(1) && CONFIG_GET(string/chat_squawk_tag)) //Only the one true bird may speak across dimensions.
send2chat("A stray squawk is heard... \"[message]\"", CONFIG_GET(string/chat_squawk_tag))
/mob/living/simple_animal/parrot/Poly/BiologicalLife(seconds, times_fired)
/mob/living/simple_animal/parrot/Polly/BiologicalLife(delta_time, times_fired)
if(!(. = ..()))
return
if(!stat && SSticker.current_state == GAME_STATE_FINISHED && !memory_saved)
Write_Memory(FALSE)
memory_saved = TRUE
/mob/living/simple_animal/parrot/Poly/death(gibbed)
/mob/living/simple_animal/parrot/Polly/death(gibbed)
if(!memory_saved)
Write_Memory(TRUE)
if(rounds_survived == longest_survival || rounds_survived == longest_deathstreak || prob(0.666))
var/mob/living/simple_animal/parrot/Poly/ghost/G = new(loc)
var/mob/living/simple_animal/parrot/Polly/ghost/G = new(loc)
if(mind)
mind.transfer_to(G)
else
transfer_ckey(G)
..(gibbed)
/mob/living/simple_animal/parrot/Poly/proc/Read_Memory()
/mob/living/simple_animal/parrot/Polly/proc/Read_Memory()
var/saved_color
if(fexists("data/npc_saves/Poly.sav")) //legacy compatability to convert old format to new
var/savefile/S = new /savefile("data/npc_saves/Poly.sav")
S["phrases"] >> speech_buffer
@@ -963,10 +970,13 @@ GLOBAL_LIST_INIT(strippable_parrot_items, create_strippable_list(list(
rounds_survived = json["roundssurvived"]
longest_survival = json["longestsurvival"]
longest_deathstreak = json["longestdeathstreak"]
saved_color = json["color"]
if(!islist(speech_buffer))
speech_buffer = list()
if(!isnull(saved_color))
add_atom_colour(json_decode(saved_color), FIXED_COLOUR_PRIORITY)
/mob/living/simple_animal/parrot/Poly/proc/Write_Memory(dead)
/mob/living/simple_animal/parrot/Polly/proc/Write_Memory(dead)
var/json_file = file("data/npc_saves/Poly.json")
var/list/file_data = list()
if(islist(speech_buffer))
@@ -978,6 +988,7 @@ GLOBAL_LIST_INIT(strippable_parrot_items, create_strippable_list(list(
file_data["longestdeathstreak"] = rounds_survived - 1
else
file_data["longestdeathstreak"] = longest_deathstreak
file_data["color"] = null
else
file_data["roundssurvived"] = rounds_survived + 1
if(rounds_survived + 1 > longest_survival)
@@ -985,17 +996,21 @@ GLOBAL_LIST_INIT(strippable_parrot_items, create_strippable_list(list(
else
file_data["longestsurvival"] = longest_survival
file_data["longestdeathstreak"] = longest_deathstreak
if(color)
file_data["color"] = json_encode(color)
else
file_data["color"] = null
fdel(json_file)
WRITE_FILE(json_file, json_encode(file_data))
/mob/living/simple_animal/parrot/Poly/ratvar_act()
/mob/living/simple_animal/parrot/Polly/ratvar_act()
playsound(src, 'sound/magic/clockwork/fellowship_armory.ogg', 75, TRUE)
var/mob/living/simple_animal/parrot/clock_hawk/H = new(loc)
H.setDir(dir)
qdel(src)
/mob/living/simple_animal/parrot/Poly/ghost
name = "The Ghost of Poly"
/mob/living/simple_animal/parrot/Polly/ghost
name = "The Ghost of Polly"
desc = "Doomed to squawk the Earth."
color = "#FFFFFF"
alpha = 77
@@ -1004,16 +1019,16 @@ GLOBAL_LIST_INIT(strippable_parrot_items, create_strippable_list(list(
incorporeal_move = INCORPOREAL_MOVE_BASIC
butcher_results = list(/obj/item/ectoplasm = 1)
/mob/living/simple_animal/parrot/Poly/ghost/Initialize(mapload)
/mob/living/simple_animal/parrot/Polly/ghost/Initialize(mapload)
memory_saved = TRUE //At this point nothing is saved
. = ..()
/mob/living/simple_animal/parrot/Poly/ghost/handle_automated_speech()
/mob/living/simple_animal/parrot/Polly/ghost/handle_automated_speech()
if(ismob(loc))
return
..()
/mob/living/simple_animal/parrot/Poly/ghost/handle_automated_movement()
/mob/living/simple_animal/parrot/Polly/ghost/handle_automated_movement()
if(isliving(parrot_interest))
if(!ishuman(parrot_interest))
parrot_interest = null
@@ -1022,7 +1037,7 @@ GLOBAL_LIST_INIT(strippable_parrot_items, create_strippable_list(list(
Possess(parrot_interest)
..()
/mob/living/simple_animal/parrot/Poly/ghost/proc/Possess(mob/living/carbon/human/H)
/mob/living/simple_animal/parrot/Polly/ghost/proc/Possess(mob/living/carbon/human/H)
if(!ishuman(H))
return
var/datum/disease/parrot_possession/P = new
@@ -225,7 +225,7 @@
length += emote_see.len
var/randomValue = rand(1,length)
if(randomValue <= speak.len)
say(pick(speak), forced = "poly")
say(pick(speak), forced = "polly")
else
randomValue -= speak.len
if(emote_see && randomValue <= emote_see.len)
@@ -233,7 +233,7 @@
else
emote("me [pick(emote_hear)]", 2)
else
say(pick(speak), forced = "poly")
say(pick(speak), forced = "polly")
else
if(!(emote_hear && emote_hear.len) && (emote_see && emote_see.len))
emote("me", EMOTE_VISIBLE, pick(emote_see))
@@ -482,7 +482,7 @@
update_action_buttons_icon()
return mobility_flags
/mob/living/simple_animal/update_transform()
/mob/living/simple_animal/update_transform(do_animate)
var/matrix/ntransform = matrix(transform) //aka transform.Copy()
var/changed = 0
@@ -27,6 +27,8 @@
/datum/emote/slime/mood/run_emote(mob/user, params)
. = ..()
if(!.)
return
var/mob/living/simple_animal/slime/S = user
S.mood = mood
S.regenerate_icons()
@@ -8,7 +8,7 @@
typing_indicator_state = /obj/effect/overlay/typing_indicator/slime
/mob/living/simple_animal/slime/BiologicalLife(seconds, times_fired)
/mob/living/simple_animal/slime/BiologicalLife(delta_time, times_fired)
if(!(. = ..()))
return
if(buckled)
@@ -421,7 +421,7 @@
return
/mob/living/simple_animal/slime/examine(mob/user)
. = list("<span class='info'>*---------*\nThis is [icon2html(src, user)] \a <EM>[src]</EM>!")
. = list("<span class='info'>This is [icon2html(src, user)] \a <EM>[src]</EM>!")
if (src.stat == DEAD)
. += "<span class='deadsay'>It is limp and unresponsive.</span>"
else
@@ -446,7 +446,7 @@
if(10)
. += "<span class='warning'><B>It is radiating with massive levels of electrical activity!</B></span>"
. += "*---------*</span>"
. += "</span>"
/mob/living/simple_animal/slime/proc/discipline_slime(mob/user)
if(stat)