[MIRROR] Gondolas are now basic mobs (#27934)

* Gondolas are now basic mobs (#83451)

## About The Pull Request

This PR turns gondolas into basic mobs and does some fiddling with
gondola pods
Their verbs are now action buttons which they lose upon delivering. If
set to stay, they won't have their abilities afterwards (or wont get
them in the first place if the delivery is already done).
Lets them survive without a pod requirement in case admins want to spawn
one for their own stuff, so I also removed it from the snowflake checks
to exclude them from stuff.

Also replaced the hardcoded "cant speak" with simply giving the mute
trait, so admins can make gondolas speak if they want to for any reason.

## Why It's Good For The Game

The pet level of simple animals can finally be killed off, also gives
admins more control over gondola-related stuff if they so wish.

## Changelog

🆑
refactor: Gondolas (including gondola pods) are now basic mobs.
/🆑

---------

Co-authored-by: san7890 <the@san7890.com>

* Well then. Hope it works.

* Ohhh.

---------

Co-authored-by: John Willard <53777086+JohnFulpWillard@users.noreply.github.com>
Co-authored-by: san7890 <the@san7890.com>
Co-authored-by: Useroth <37159550+Useroth@users.noreply.github.com>
This commit is contained in:
SkyratBot
2024-06-02 17:37:45 +02:00
committed by GitHub
parent c43cef7e8c
commit f591dd3bd3
37 changed files with 254 additions and 355 deletions
@@ -27,7 +27,7 @@
/turf/open/floor/grass,
/area/ruin/space/has_grav)
"h" = (
/mob/living/simple_animal/pet/gondola,
/mob/living/basic/pet/gondola,
/turf/open/floor/grass,
/area/ruin/space/has_grav)
"i" = (
+1 -1
View File
@@ -47,7 +47,7 @@
/area/deathmatch/teleport)
"ct" = (
/obj/structure/flora/bush/grassy/style_random,
/mob/living/simple_animal/pet/gondola{
/mob/living/basic/pet/gondola{
name = "Jommy";
faction = list("gondola", "Wizard")
},
+2 -2
View File
@@ -51979,7 +51979,7 @@
/area/station/security/brig)
"jUQ" = (
/obj/structure/extinguisher_cabinet/directional/north,
/mob/living/simple_animal/pet/poppy,
/mob/living/basic/pet/poppy,
/turf/open/floor/iron,
/area/station/engineering/main)
"jUS" = (
@@ -65043,7 +65043,7 @@
"mwm" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/mob/living/simple_animal/pet/gondola/funky,
/mob/living/basic/pet/gondola/funky,
/turf/open/floor/iron,
/area/station/service/theater)
"mwn" = (
+2 -2
View File
@@ -38857,7 +38857,7 @@
dir = 4
},
/obj/effect/landmark/event_spawn,
/mob/living/simple_animal/pet/gondola/funky,
/mob/living/basic/pet/gondola/funky,
/turf/open/floor/iron/herringbone,
/area/station/service/theater)
"kYC" = (
@@ -58495,7 +58495,7 @@
name = "Poppy's bed"
},
/obj/machinery/firealarm/directional/south,
/mob/living/simple_animal/pet/poppy,
/mob/living/basic/pet/poppy,
/obj/machinery/light/directional/south,
/turf/open/floor/iron/smooth,
/area/station/engineering/lobby)
@@ -755,7 +755,7 @@
/turf/open/floor/grass,
/area/deathmatch)
"yb" = (
/mob/living/simple_animal/pet/gondola,
/mob/living/basic/pet/gondola,
/obj/effect/light_emitter/fake_outdoors,
/turf/open/floor/grass,
/area/deathmatch)
@@ -1116,7 +1116,7 @@
/turf/open/space/basic,
/area/deathmatch)
"FZ" = (
/mob/living/simple_animal/pet/gondola,
/mob/living/basic/pet/gondola,
/obj/structure/flora/bush/flowers_yw/style_random,
/turf/open/floor/grass,
/area/deathmatch)
@@ -1264,7 +1264,7 @@
light_color = "#FFE8AA";
light_range = 20
},
/mob/living/simple_animal/pet/gondola,
/mob/living/basic/pet/gondola,
/turf/open/floor/grass,
/area/deathmatch)
"IY" = (
@@ -1295,7 +1295,7 @@
/turf/open/floor/plating/airless,
/area/deathmatch)
"Kh" = (
/mob/living/simple_animal/pet/gondola,
/mob/living/basic/pet/gondola,
/turf/open/floor/grass,
/area/deathmatch)
"Ki" = (
@@ -536,7 +536,7 @@
/turf/open/floor/iron,
/area/centcom/wizard_station)
"AW" = (
/mob/living/simple_animal/pet/gondola{
/mob/living/basic/pet/gondola{
name = "Jommy";
faction = list("gondola", "Wizard")
},
+1 -1
View File
@@ -53,7 +53,7 @@
/turf/open/floor/grass,
/area/ruin/space/has_grav/powered/virtual_domain)
"z" = (
/mob/living/simple_animal/pet/gondola/virtual_domain,
/mob/living/basic/pet/gondola/virtual_domain,
/turf/open/floor/grass,
/area/ruin/space/has_grav/powered/virtual_domain)
"A" = (
-1
View File
@@ -32,7 +32,6 @@ GLOBAL_LIST_INIT(abstract_mob_types, list(
/mob/living/simple_animal/hostile/mimic, // Cannot exist if spawned without being passed an item reference
/mob/living/simple_animal/hostile/retaliate,
/mob/living/simple_animal/hostile,
/mob/living/simple_animal/pet,
/mob/living/simple_animal/soulscythe, // As mimic, can't exist if spawned outside an item
/mob/living/simple_animal,
))
+1 -1
View File
@@ -187,7 +187,7 @@
for(var/mob/M in oview(owner, check_radius))
if(!isliving(M)) //ghosts ain't people
continue
if(istype(M, /mob/living/simple_animal/pet) || istype(M, /mob/living/basic/pet) || M.ckey)
if(istype(M, /mob/living/basic/pet) || M.ckey)
return FALSE
return TRUE
+1 -1
View File
@@ -335,7 +335,7 @@
)
stage4 = list(span_danger("You can't feel your arms. It does not bother you anymore."), span_danger("You forgive the clown for hurting you."))
stage5 = list(span_danger("You have become a Gondola."))
new_form = /mob/living/simple_animal/pet/gondola
new_form = /mob/living/basic/pet/gondola
/datum/disease/transformation/gondola/stage_act(seconds_per_tick, times_fired)
+2 -6
View File
@@ -276,13 +276,9 @@ GLOBAL_LIST_INIT(dye_registry, list(
new /obj/item/food/meat/slab/corgi(loc)
qdel(src)
/mob/living/simple_animal/pet/machine_wash(obj/machinery/washing_machine/washer)
washer.bloody_mess = TRUE
investigate_log("has been gibbed by a washing machine.", INVESTIGATE_DEATHS)
gib()
/mob/living/basic/pet/machine_wash(obj/machinery/washing_machine/washer)
washer.bloody_mess = TRUE
investigate_log("has been gibbed by a washing machine.", INVESTIGATE_DEATHS)
gib()
/obj/item/machine_wash(obj/machinery/washing_machine/washer)
@@ -378,7 +374,7 @@ GLOBAL_LIST_INIT(dye_registry, list(
if(L.buckled || L.has_buckled_mobs())
return
if(state_open)
if(istype(L, /mob/living/simple_animal/pet) || istype(L, /mob/living/basic/pet))
if(istype(L, /mob/living/basic/pet))
L.forceMove(src)
update_appearance()
return
@@ -11,9 +11,13 @@
/obj/structure/closet/crate/secure/bitrunning/encrypted/gondola
move_resist = MOVE_FORCE_STRONG
/mob/living/simple_animal/pet/gondola/virtual_domain
/mob/living/basic/pet/gondola/virtual_domain
health = 50
loot = list(/obj/effect/decal/cleanable/blood/gibs, /obj/item/stack/sheet/animalhide/gondola = 1, /obj/item/food/meat/slab/gondola/virtual_domain = 1)
loot = list(
/obj/effect/decal/cleanable/blood/gibs = 1,
/obj/item/stack/sheet/animalhide/gondola = 1,
/obj/item/food/meat/slab/gondola/virtual_domain = 1,
)
maxHealth = 50
move_force = MOVE_FORCE_VERY_STRONG
move_resist = MOVE_FORCE_STRONG
@@ -30,4 +34,4 @@
/datum/disease/transformation/gondola/virtual_domain
stage_prob = 9
new_form = /mob/living/simple_animal/pet/gondola/virtual_domain
new_form = /mob/living/basic/pet/gondola/virtual_domain
@@ -52,7 +52,7 @@
/datum/modular_mob_segment/gondolas
mobs = list(
/mob/living/simple_animal/pet/gondola,
/mob/living/basic/pet/gondola,
)
/datum/modular_mob_segment/corgis
-80
View File
@@ -1,80 +0,0 @@
/mob/living/simple_animal/pet/gondola/gondolapod
name = "gondola"
real_name = "gondola"
desc = "The silent walker. This one seems to be part of a delivery agency."
response_help_continuous = "pets"
response_help_simple = "pet"
response_disarm_continuous = "bops"
response_disarm_simple = "bop"
response_harm_continuous = "kicks"
response_harm_simple = "kick"
faction = list(FACTION_GONDOLA)
turns_per_move = 10
icon = 'icons/obj/supplypods.dmi'
icon_state = "gondola"
icon_living = "gondola"
SET_BASE_PIXEL(-16, -5) //2x2 sprite
layer = TABLE_LAYER//so that deliveries dont appear underneath it
loot = list(/obj/effect/decal/cleanable/blood/gibs, /obj/item/stack/sheet/animalhide/gondola = 2, /obj/item/food/meat/slab/gondola = 2)
//Gondolas aren't affected by cold.
atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_plas" = 0, "max_plas" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
minbodytemp = 0
maxbodytemp = 1500
maxHealth = 200
health = 200
del_on_death = TRUE
var/opened = FALSE
var/obj/structure/closet/supplypod/centcompod/linked_pod
/mob/living/simple_animal/pet/gondola/gondolapod/Initialize(mapload, pod)
if(!pod)
stack_trace("Gondola pod created with no pod")
return INITIALIZE_HINT_QDEL
linked_pod = pod
name = linked_pod.name
desc = linked_pod.desc
. = ..()
/mob/living/simple_animal/pet/gondola/gondolapod/update_overlays()
. = ..()
if(opened)
. += "[icon_state]_open"
/mob/living/simple_animal/pet/gondola/gondolapod/verb/deliver()
set name = "Release Contents"
set category = "Gondola"
set desc = "Release any contents stored within your vast belly."
linked_pod.open_pod(src, forced = TRUE)
/mob/living/simple_animal/pet/gondola/gondolapod/examine(mob/user)
. = ..()
if (contents.len)
. += span_notice("It looks like it hasn't made its delivery yet.</b>")
else
. += span_notice("It looks like it has already made its delivery.</b>")
/mob/living/simple_animal/pet/gondola/gondolapod/verb/check()
set name = "Count Contents"
set category = "Gondola"
set desc = "Take a deep look inside youself, and count up what's inside"
var/total = contents.len
if (total)
to_chat(src, span_notice("You detect [total] object\s within your incredibly vast belly."))
else
to_chat(src, span_notice("A closer look inside yourself reveals... nothing."))
/mob/living/simple_animal/pet/gondola/gondolapod/setOpened()
opened = TRUE
layer = initial(layer)
update_appearance()
addtimer(CALLBACK(src, TYPE_PROC_REF(/atom/, setClosed)), 5 SECONDS)
/mob/living/simple_animal/pet/gondola/gondolapod/setClosed()
opened = FALSE
layer = LOW_MOB_LAYER
update_appearance()
/mob/living/simple_animal/pet/gondola/gondolapod/death()
QDEL_NULL(linked_pod) //Will cause the open() proc for the linked supplypod to be called with the "broken" parameter set to true, meaning that it will dump its contents on death
qdel(src)
..()
+1 -1
View File
@@ -357,7 +357,7 @@
qdel(src)
return
if (style == STYLE_GONDOLA) //Checks if we are supposed to be a gondola pod. If so, create a gondolapod mob, and move this pod to nullspace. I'd like to give a shout out, to my man oranges
var/mob/living/simple_animal/pet/gondola/gondolapod/benis = new(turf_underneath, src)
var/mob/living/basic/pet/gondola/gondolapod/benis = new(turf_underneath, src)
benis.contents |= contents //Move the contents of this supplypod into the gondolapod mob.
for (var/mob/living/mob_in_pod in benis.contents)
mob_in_pod.reset_perspective(null)
@@ -17,7 +17,6 @@ GLOBAL_LIST_INIT(high_priority_sentience, typecacheof(list(
/mob/living/basic/spider/giant/sgt_araneus,
/mob/living/simple_animal/bot/secbot/beepsky,
/mob/living/simple_animal/hostile/retaliate/goose/vomit,
/mob/living/simple_animal/pet,
)))
/datum/round_event_control/sentience
+1 -1
View File
@@ -298,7 +298,7 @@
/mob/living/basic/mushroom,
/mob/living/basic/viscerator,
/mob/living/simple_animal/hostile/retaliate/goose, //Janitors HATE geese.
/mob/living/simple_animal/pet/gondola,
/mob/living/basic/pet/gondola,
)
return pick(mob_list)
@@ -18,7 +18,6 @@ GLOBAL_LIST_INIT(petsplosion_candidates, typecacheof(list(
/mob/living/basic/snake,
/mob/living/basic/spider/giant/sgt_araneus,
/mob/living/simple_animal/hostile/retaliate/goose/vomit,
/mob/living/simple_animal/pet,
)))
/datum/round_event_control/wizard/petsplosion //the horror
+1 -1
View File
@@ -105,7 +105,7 @@ GLOBAL_LIST_INIT(adventure_loot_generator_index,generate_generator_index())
/datum/adventure_loot_generator/pet/generate()
var/obj/item/pet_carrier/carrier = new carrier_type()
var/chosen_pet_type = pick(possible_pets)
var/mob/living/simple_animal/pet/pet = new chosen_pet_type()
var/mob/living/basic/pet/pet = new chosen_pet_type()
carrier.add_occupant(pet)
return carrier
+1 -1
View File
@@ -195,7 +195,7 @@
if(71 to 72)
new /obj/item/toy/plush/snakeplushie(src)
if(73 to 74)
new /mob/living/simple_animal/pet/gondola(src)
new /mob/living/basic/pet/gondola(src)
if(75 to 76)
new /obj/item/bikehorn/airhorn(src)
if(77 to 78)
@@ -472,7 +472,7 @@
unique_pet = TRUE
held_state = "narsian"
/// Mobs we will consume in the name of Nar'Sie
var/static/list/edible_types = list(/mob/living/simple_animal/pet, /mob/living/basic/pet)
var/static/list/edible_types = list(/mob/living/basic/pet)
/mob/living/basic/pet/dog/corgi/narsie/Initialize(mapload)
. = ..()
@@ -0,0 +1,83 @@
#define GONDOLA_HEIGHT pick(list("gondola_body_long", "gondola_body_medium", "gondola_body_short"))
#define GONDOLA_COLOR pick(list("A87855", "915E48", "683E2C"))
#define GONDOLA_MOUSTACHE pick(list("gondola_moustache_large", "gondola_moustache_small"))
#define GONDOLA_EYES pick(list("gondola_eyes_close", "gondola_eyes_far"))
/mob/living/basic/pet/gondola
name = "gondola"
real_name = "gondola"
desc = "Gondola is the silent walker. \
Having no hands he embodies the Taoist principle of wu-wei (non-action) while his smiling \
facial expression shows his utter and complete acceptance of the world as it is. \
Its hide is extremely valuable."
icon = 'icons/mob/simple/gondolas.dmi'
icon_state = "gondola"
icon_living = "gondola"
maxHealth = 200
health = 200
faction = list(FACTION_GONDOLA)
response_help_continuous = "pets"
response_help_simple = "pet"
response_disarm_continuous = "bops"
response_disarm_simple = "bop"
response_harm_continuous = "kicks"
response_harm_simple = "kick"
ai_controller = /datum/ai_controller/basic_controller/gondola
//Gondolas aren't affected by cold.
unsuitable_atmos_damage = 0
basic_mob_flags = DEL_ON_DEATH
///List of loot drops on death, since it deletes itself on death (like trooper).
var/list/loot = list(
/obj/effect/decal/cleanable/blood/gibs = 1,
/obj/item/stack/sheet/animalhide/gondola = 1,
/obj/item/food/meat/slab/gondola = 1,
)
/mob/living/basic/pet/gondola/Initialize(mapload)
. = ..()
ADD_TRAIT(src, TRAIT_MUTE, INNATE_TRAIT)
AddElement(/datum/element/pet_bonus, "smiles!")
if(LAZYLEN(loot))
loot = string_list(loot)
AddElement(/datum/element/death_drops, loot)
create_gondola()
/mob/living/basic/pet/gondola/proc/create_gondola()
icon_state = null
icon_living = null
var/height = GONDOLA_HEIGHT
var/mutable_appearance/body_overlay = mutable_appearance(icon, height)
var/mutable_appearance/eyes_overlay = mutable_appearance(icon, GONDOLA_EYES)
var/mutable_appearance/moustache_overlay = mutable_appearance(icon, GONDOLA_MOUSTACHE)
body_overlay.color = ("#[GONDOLA_COLOR]")
//Offset the face to match the Gondola's height.
switch(height)
if("gondola_body_medium")
eyes_overlay.pixel_y = -4
moustache_overlay.pixel_y = -4
if("gondola_body_short")
eyes_overlay.pixel_y = -8
moustache_overlay.pixel_y = -8
cut_overlays(TRUE)
add_overlay(body_overlay)
add_overlay(eyes_overlay)
add_overlay(moustache_overlay)
/datum/ai_controller/basic_controller/gondola
blackboard = list(
BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic,
)
ai_traits = STOP_MOVING_WHEN_PULLED
ai_movement = /datum/ai_movement/basic_avoidance
idle_behavior = /datum/idle_behavior/idle_random_walk/less_walking
#undef GONDOLA_HEIGHT
#undef GONDOLA_COLOR
#undef GONDOLA_MOUSTACHE
#undef GONDOLA_EYES
@@ -0,0 +1,104 @@
/mob/living/basic/pet/gondola/gondolapod
name = "gondola"
real_name = "gondola"
desc = "The silent walker. This one seems to be part of a delivery agency."
icon = 'icons/obj/supplypods.dmi'
icon_state = "gondola"
icon_living = "gondola"
SET_BASE_PIXEL(-16, -5) //2x2 sprite
layer = TABLE_LAYER //so that deliveries dont appear underneath it
loot = list(
/obj/effect/decal/cleanable/blood/gibs = 1,
/obj/item/stack/sheet/animalhide/gondola = 2,
/obj/item/food/meat/slab/gondola = 2,
)
///Boolean on whether the pod is currently open, and should appear such.
var/opened = FALSE
///The supply pod attached to the gondola, that actually holds the contents of our delivery.
var/obj/structure/closet/supplypod/centcompod/linked_pod
///Static list of actions the gondola is given on creation, and taken away when it successfully delivers.
var/static/list/gondola_delivering_actions = list(
/datum/action/innate/deliver_gondola_package,
/datum/action/innate/check_gondola_contents,
)
/mob/living/basic/pet/gondola/gondolapod/Initialize(mapload, pod)
linked_pod = pod || new(src)
name = linked_pod.name
desc = linked_pod.desc
if(!linked_pod.stay_after_drop || !linked_pod.opened)
grant_actions_by_list(gondola_delivering_actions)
return ..()
/mob/living/basic/pet/gondola/gondolapod/death()
QDEL_NULL(linked_pod) //Will cause the open() proc for the linked supplypod to be called with the "broken" parameter set to true, meaning that it will dump its contents on death
return ..()
/mob/living/basic/pet/gondola/gondolapod/create_gondola()
return
/mob/living/basic/pet/gondola/gondolapod/update_overlays()
. = ..()
if(opened)
. += "[icon_state]_open"
/mob/living/basic/pet/gondola/gondolapod/examine(mob/user)
. = ..()
if (contents.len)
. += span_notice("It looks like it hasn't made its delivery yet.")
else
. += span_notice("It looks like it has already made its delivery.")
/mob/living/basic/pet/gondola/gondolapod/setOpened()
opened = TRUE
layer = initial(layer)
update_appearance()
addtimer(CALLBACK(src, TYPE_PROC_REF(/atom/, setClosed)), 5 SECONDS)
/mob/living/basic/pet/gondola/gondolapod/setClosed()
opened = FALSE
layer = LOW_MOB_LAYER
update_appearance()
///Opens the gondola pod and delivers its package, one-time use as it removes all delivery-related actions.
/datum/action/innate/deliver_gondola_package
name = "Deliver"
desc = "Open your pod and release any contents stored within."
button_icon = 'icons/hud/screen_gen.dmi'
button_icon_state = "arrow"
check_flags = AB_CHECK_PHASED
/datum/action/innate/deliver_gondola_package/Trigger(trigger_flags)
. = ..()
if(!.)
return
var/mob/living/basic/pet/gondola/gondolapod/gondola_owner = owner
gondola_owner.linked_pod.open_pod(gondola_owner, forced = TRUE)
for(var/datum/action/actions as anything in gondola_owner.actions)
if(actions.type in gondola_owner.gondola_delivering_actions)
actions.Remove(gondola_owner)
return TRUE
///Checks the contents of the gondola and lets them know what they're holding.
/datum/action/innate/check_gondola_contents
name = "Check contents"
desc = "See how many items you are currently holding in your pod."
button_icon = 'icons/hud/implants.dmi'
button_icon_state = "storage"
check_flags = AB_CHECK_PHASED
/datum/action/innate/check_gondola_contents/Trigger(trigger_flags)
. = ..()
if(!.)
return
var/mob/living/basic/pet/gondola/gondolapod/gondola_owner = owner
var/total = gondola_owner.contents.len
if (total)
to_chat(gondola_owner, span_notice("You detect [total] object\s within your incredibly vast belly."))
else
to_chat(gondola_owner, span_notice("A closer look inside yourself reveals... nothing."))
return TRUE
@@ -1,69 +0,0 @@
#define GONDOLA_HEIGHT pick("gondola_body_long", "gondola_body_medium", "gondola_body_short")
#define GONDOLA_COLOR pick("A87855", "915E48", "683E2C")
#define GONDOLA_MOUSTACHE pick("gondola_moustache_large", "gondola_moustache_small")
#define GONDOLA_EYES pick("gondola_eyes_close", "gondola_eyes_far")
//Gondolas
/mob/living/simple_animal/pet/gondola
name = "gondola"
real_name = "gondola"
desc = "Gondola is the silent walker. Having no hands he embodies the Taoist principle of wu-wei (non-action) while his smiling facial expression shows his utter and complete acceptance of the world as it is. Its hide is extremely valuable."
response_help_continuous = "pets"
response_help_simple = "pet"
response_disarm_continuous = "bops"
response_disarm_simple = "bop"
response_harm_continuous = "kicks"
response_harm_simple = "kick"
faction = list(FACTION_GONDOLA)
turns_per_move = 10
icon = 'icons/mob/simple/gondolas.dmi'
icon_state = "gondola"
icon_living = "gondola"
loot = list(/obj/effect/decal/cleanable/blood/gibs, /obj/item/stack/sheet/animalhide/gondola = 1, /obj/item/food/meat/slab/gondola = 1)
//Gondolas aren't affected by cold.
atmos_requirements = null
minbodytemp = 0
maxbodytemp = 1500
maxHealth = 200
health = 200
del_on_death = TRUE
//Gondolas don't make footstep sounds
/mob/living/simple_animal/pet/gondola/Initialize(mapload)
. = ..()
AddElement(/datum/element/pet_bonus, "smiles!")
if (!(istype(src, /mob/living/simple_animal/pet/gondola/gondolapod)))
CreateGondola()
/mob/living/simple_animal/pet/gondola/proc/CreateGondola()
icon_state = null
icon_living = null
var/height = GONDOLA_HEIGHT
var/mutable_appearance/body_overlay = mutable_appearance(icon, height)
var/mutable_appearance/eyes_overlay = mutable_appearance(icon, GONDOLA_EYES)
var/mutable_appearance/moustache_overlay = mutable_appearance(icon, GONDOLA_MOUSTACHE)
body_overlay.color = ("#[GONDOLA_COLOR]")
//Offset the face to match the Gondola's height.
switch(height)
if("gondola_body_medium")
eyes_overlay.pixel_y = -4
moustache_overlay.pixel_y = -4
if("gondola_body_short")
eyes_overlay.pixel_y = -8
moustache_overlay.pixel_y = -8
cut_overlays(TRUE)
add_overlay(body_overlay)
add_overlay(eyes_overlay)
add_overlay(moustache_overlay)
/mob/living/simple_animal/pet/gondola/can_speak(allow_mimes = FALSE)
return FALSE // Gondolas are the silent walker.
#undef GONDOLA_HEIGHT
#undef GONDOLA_COLOR
#undef GONDOLA_MOUSTACHE
#undef GONDOLA_EYES
@@ -1,140 +0,0 @@
/mob/living/simple_animal/pet
icon = 'icons/mob/simple/pets.dmi'
mob_size = MOB_SIZE_SMALL
mob_biotypes = MOB_ORGANIC|MOB_BEAST
blood_volume = BLOOD_VOLUME_NORMAL
/// if the mob is protected from being renamed by collars.
var/unique_pet = FALSE
/// If the mob has collar sprites, this is the base of the icon states.
var/collar_icon_state
/// We have a seperate _rest collar icon state when the pet is resting.
var/has_collar_resting_icon_state = FALSE
/// Our collar
var/obj/item/clothing/neck/petcollar/collar
/mob/living/simple_animal/pet/Initialize(mapload)
. = ..()
/// Can set the collar var beforehand to start the pet with a collar.
if(collar)
collar = new(src)
update_icon(UPDATE_OVERLAYS)
/mob/living/simple_animal/pet/Destroy()
. = ..()
QDEL_NULL(collar)
QDEL_NULL(access_card)
/mob/living/simple_animal/pet/attackby(obj/item/thing, mob/user, params)
if(istype(thing, /obj/item/clothing/neck/petcollar) && !collar)
add_collar(thing, user)
return TRUE
if(istype(thing, /obj/item/newspaper) && !stat)
user.visible_message(span_notice("[user] baps [name] on the nose with the rolled up [thing]."))
dance_rotate(src)
return TRUE
return ..()
/mob/living/simple_animal/pet/update_overlays()
. = ..()
if(!collar || !collar_icon_state)
return
// Determine which status tag to add to the middle of the icon state.
var/dead_tag = stat == DEAD ? "_dead" : null
var/rest_tag = has_collar_resting_icon_state && resting ? "_rest" : null
var/stat_tag = dead_tag || rest_tag || ""
. += mutable_appearance(icon, "[collar_icon_state][stat_tag]collar")
. += mutable_appearance(icon, "[collar_icon_state][stat_tag]tag")
/mob/living/simple_animal/pet/gib()
. = ..()
if(access_card)
access_card.forceMove(drop_location())
access_card = null
remove_collar(drop_location(), update_visuals = FALSE)
/mob/living/simple_animal/pet/revive(full_heal_flags = NONE, excess_healing = 0, force_grab_ghost = FALSE)
. = ..()
if(!.)
return
update_icon(UPDATE_OVERLAYS)
/mob/living/simple_animal/pet/death(gibbed)
. = ..()
add_memory_in_range(src, 7, /datum/memory/pet_died, deuteragonist = src) //Protagonist is the person memorizing it
/mob/living/simple_animal/pet/Exited(atom/movable/gone, direction)
. = ..()
if(gone != collar)
return
collar = null
if(QDELETED(src))
return
update_icon(UPDATE_OVERLAYS)
/mob/living/simple_animal/pet/update_stat()
. = ..()
update_icon(UPDATE_OVERLAYS)
/mob/living/simple_animal/pet/set_resting(new_resting, silent, instant)
. = ..()
if(!has_collar_resting_icon_state)
return
update_icon(UPDATE_OVERLAYS)
/**
* Add a collar to the pet.
*
* Arguments:
* * new_collar - the collar.
* * user - the user that did it.
*/
/mob/living/simple_animal/pet/proc/add_collar(obj/item/clothing/neck/petcollar/new_collar, mob/user)
if(QDELETED(new_collar) || collar)
return
if(!user.transferItemToLoc(new_collar, src))
return
collar = new_collar
if(collar_icon_state)
update_icon(UPDATE_OVERLAYS)
to_chat(user, span_notice("You put [new_collar] around [src]'s neck."))
if(new_collar.tagname && !unique_pet)
fully_replace_character_name(null, "\proper [new_collar.tagname]")
/**
* Remove the collar from the pet.
*/
/mob/living/simple_animal/pet/proc/remove_collar(atom/new_loc, update_visuals = TRUE)
if(!collar)
return
var/obj/old_collar = collar
collar.forceMove(new_loc)
collar = null
if(collar_icon_state && update_visuals)
update_icon(UPDATE_OVERLAYS)
return old_collar
-1
View File
@@ -9,7 +9,6 @@
/mob/oranges_ear
)
ignored += typesof(/mob/camera/imaginary_friend)
ignored += typesof(/mob/living/simple_animal/pet/gondola/gondolapod)
ignored += typesof(/mob/living/silicon/robot/model)
ignored += typesof(/mob/camera/ai_eye/remote/base_construction)
ignored += typesof(/mob/camera/ai_eye/remote/shuttle_docker)
@@ -74,10 +74,6 @@
/mob/living/simple_animal/hostile/retaliate/goose/vomit,
/mob/living/simple_animal/hostile/vatbeast,
/mob/living/simple_animal/hostile/zombie,
/mob/living/simple_animal/pet,
/mob/living/simple_animal/pet/gondola,
/mob/living/simple_animal/pet/gondola/gondolapod,
/mob/living/simple_animal/pet/gondola/virtual_domain,
/mob/living/simple_animal/soulscythe,
// MODULAR SKYRAT ENTRIES
@@ -151,8 +147,6 @@
/mob/living/simple_animal/hostile/vox/ranged/space/laser,
/mob/living/simple_animal/hostile/zombie/cheesezombie,
/mob/living/simple_animal/hostile/zombie/nocorpse,
/mob/living/simple_animal/pet/gondola/funky,
/mob/living/simple_animal/pet/poppy,
// DO NOT ADD NEW ENTRIES TO THIS LIST
// READ THE COMMENT ABOVE
@@ -15,7 +15,6 @@
/mob/living/simple_animal,
/mob/living/basic,
))
types_to_check -= /mob/living/simple_animal/pet/gondola/gondolapod // need a pod, which we don't have
types_to_check -= typesof(/mob/living/simple_animal/hostile/megafauna) // no
types_to_check -= typesof(/mob/living/basic/mouse) // qdel themselves on death; why dont they use DEL_ON_DEATH you might ask. I-unno
types_to_check -= typesof(/mob/living/basic/slime) // if they roll the 50% chance to spawn as an adult, they can just at random split and qdel themselves
-2
View File
@@ -276,8 +276,6 @@ GLOBAL_VAR_INIT(focused_tests, focused_tests())
returnable_list += typesof(/obj/effect/baseturf_helper)
//No tauma to pass in
returnable_list += typesof(/mob/camera/imaginary_friend)
//No pod to gondola
returnable_list += typesof(/mob/living/simple_animal/pet/gondola/gondolapod)
//No heart to give
returnable_list += typesof(/obj/structure/ethereal_crystal)
//No linked console
@@ -16,7 +16,7 @@
// Non-heads like the warden, these are automatically medium-risk at minimum
// They are also the only two modular additions so far
JOB_ROBOTICIST = /mob/living/basic/pet/dog/corgi/borgi,
JOB_STATION_ENGINEER = /mob/living/simple_animal/pet/poppy,
JOB_STATION_ENGINEER = /mob/living/basic/pet/poppy,
)
// This variable is for the emag E-N objective. The obj details are below the next block
@@ -29,7 +29,7 @@
return FALSE
// Dust Poppy the safety inspector
if(istype(target_pet, /mob/living/simple_animal/pet/poppy))
if(istype(target_pet, /mob/living/basic/pet/poppy))
name = "Dust the engineering department's esteemed safety inspector and beloved pet, Poppy"
description = "A couple of troublemakers in the engineering department have spilled the milk, make them and their colleagues pay for the consequences by throwing Poppy the Safety Inspector into the supermatter engine "
telecrystal_reward = 4
@@ -1,4 +1,4 @@
/mob/living/simple_animal/pet/poppy
/mob/living/basic/pet/poppy
name = "Poppy the Safety Inspector"
desc = "Safety first!"
icon = 'modular_skyrat/master_files/icons/mob/pets.dmi'
@@ -9,19 +9,13 @@
unique_pet = TRUE
maxHealth = 30
health = 30
speak = list("Hiss!", "HISS!", "Hissss?")
speak_emote = list("hisses")
emote_hear = list("hisses.")
emote_see = list("runs in a circle.", "shakes.")
speak_chance = 2
turns_per_move = 3
/// Is the inspection currently being passed?
var/safety_inspection = TRUE
/// Are they scared already?
var/upset = FALSE
/// Are they near the supermatter?
var/near_engine = FALSE
animal_species = /mob/living/simple_animal/pet/poppy
response_help_continuous = "pets"
response_help_simple = "pet"
response_disarm_continuous = "gently pushes aside"
@@ -40,7 +34,26 @@
light_power = 0.8
light_on = TRUE
/mob/living/simple_animal/pet/poppy/Initialize(mapload)
/datum/ai_controller/basic_controller/poppy
blackboard = list(
BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic,
)
ai_traits = STOP_MOVING_WHEN_PULLED
ai_movement = /datum/ai_movement/basic_avoidance
idle_behavior = /datum/idle_behavior/idle_random_walk
planning_subtrees = list(
/datum/ai_planning_subtree/random_speech/poppy,
)
/datum/ai_planning_subtree/random_speech/poppy
speak = list("Hiss!", "HISS!", "Hissss?")
emote_hear = list("hisses.")
emote_see = list("runs in a circle.", "shakes.")
speech_chance = 1
/mob/living/basic/pet/poppy/Initialize(mapload)
. = ..()
add_verb(src, /mob/living/proc/toggle_resting)
become_area_sensitive(INNATE_TRAIT)
@@ -54,7 +67,7 @@
var/image/cone = lighting_object.cone
cone.transform = cone.transform.Translate(0, -16) // adjust the little headlamp
/mob/living/simple_animal/pet/poppy/death()
/mob/living/basic/pet/poppy/death()
lose_area_sensitivity(INNATE_TRAIT)
set_light_on(FALSE)
@@ -66,12 +79,12 @@
// It's just flavor, no tangible punishment
return ..()
/mob/living/simple_animal/pet/poppy/revive(full_heal_flags = NONE, excess_healing = 0, force_grab_ghost = FALSE)
/mob/living/basic/pet/poppy/revive(full_heal_flags = NONE, excess_healing = 0, force_grab_ghost = FALSE)
become_area_sensitive(INNATE_TRAIT)
set_light_on(TRUE)
..()
/mob/living/simple_animal/pet/poppy/update_resting()
/mob/living/basic/pet/poppy/update_resting()
. = ..()
if(resting)
icon_state = "[icon_living]_rest"
@@ -81,7 +94,7 @@
set_light_on(TRUE)
regenerate_icons()
/mob/living/simple_animal/pet/poppy/Life(seconds_per_tick = SSMOBS_DT, times_fired)
/mob/living/basic/pet/poppy/Life(seconds_per_tick = SSMOBS_DT, times_fired)
if(client || stat)
return
@@ -104,14 +117,14 @@
return ..()
/mob/living/simple_animal/pet/poppy/proc/check_area()
/mob/living/basic/pet/poppy/proc/check_area()
SIGNAL_HANDLER
if(safety_inspection && !upset)
var/list/sm_room = get_area_turfs(/area/station/engineering/supermatter/room)
if(src.loc in sm_room)
near_engine = TRUE
/mob/living/simple_animal/pet/poppy/proc/panic()
/mob/living/basic/pet/poppy/proc/panic()
upset = TRUE
icon_state = "poppypossum_aaa"
@@ -126,6 +139,6 @@
)
addtimer(CALLBACK(src, PROC_REF(calm_down)), 60 SECONDS)
/mob/living/simple_animal/pet/poppy/proc/calm_down()
/mob/living/basic/pet/poppy/proc/calm_down()
upset = FALSE
icon_state = initial(icon_state)
@@ -13,7 +13,7 @@
/datum/area_spawn/poppy
target_areas = list(/area/station/engineering/main, /area/station/engineering/break_room, /area/station/engineering/lobby, /area/station/engineering/supermatter/room)
desired_atom = /mob/living/simple_animal/pet/poppy
desired_atom = /mob/living/basic/pet/poppy
// Structures
/datum/area_spawn/blueshield_locker
@@ -49,7 +49,7 @@
human_target.show_message(span_notice("[usr] brushes your hair!"), MSG_VISUAL)
human_target.add_mood_event("brushed", /datum/mood_event/brushed, 1, user)
else if(istype(target, /mob/living/simple_animal/pet))
else if(istype(target, /mob/living/basic/pet))
if(!do_after(usr, brush_speed, target))
return
to_chat(user, span_notice("[target] closes [target.p_their()] eyes as you brush [target.p_them()]!"))
@@ -45,7 +45,7 @@
name = initial(name)
real_name = initial(name)
/mob/living/simple_animal/pet/gondola/funky
/mob/living/basic/pet/gondola/funky
name = "Funky"
real_name = "Funky"
desc = "Gondola is the silent walker. Having no hands he embodies the Taoist principle of wu-wei (non-action) while his smiling facial expression shows his utter and complete acceptance of the world as it is. Its hide is extremely valuable. This one seems a little skinny and attached to the Theater."
@@ -27,7 +27,7 @@
pet_type = pick(flatten_list(GLOB.possible_player_pet))
var/obj/item/pet_carrier/carrier = new /obj/item/pet_carrier(get_turf(quirk_holder))
var/mob/living/simple_animal/pet/pet = new pet_type(carrier)
var/mob/living/basic/pet/pet = new pet_type(carrier)
var/new_name = client_source?.prefs.read_preference(/datum/preference/text/pet_name)
if (new_name)
pet.name = new_name
+2 -3
View File
@@ -3672,7 +3672,6 @@
#include "code\modules\cargo\coupon.dm"
#include "code\modules\cargo\exports.dm"
#include "code\modules\cargo\expressconsole.dm"
#include "code\modules\cargo\gondolapod.dm"
#include "code\modules\cargo\goodies.dm"
#include "code\modules\cargo\materials_market.dm"
#include "code\modules\cargo\order.dm"
@@ -4901,6 +4900,8 @@
#include "code\modules\mob\living\basic\pets\dog\corgi.dm"
#include "code\modules\mob\living\basic\pets\dog\dog_subtypes.dm"
#include "code\modules\mob\living\basic\pets\dog\strippable_items.dm"
#include "code\modules\mob\living\basic\pets\gondolas\gondola.dm"
#include "code\modules\mob\living\basic\pets\gondolas\gondolapod.dm"
#include "code\modules\mob\living\basic\pets\orbie\orbie.dm"
#include "code\modules\mob\living\basic\pets\orbie\orbie_abilities.dm"
#include "code\modules\mob\living\basic\pets\orbie\orbie_ai.dm"
@@ -5191,8 +5192,6 @@
#include "code\modules\mob\living\simple_animal\bot\secbot.dm"
#include "code\modules\mob\living\simple_animal\bot\SuperBeepsky.dm"
#include "code\modules\mob\living\simple_animal\bot\vibebot.dm"
#include "code\modules\mob\living\simple_animal\friendly\gondola.dm"
#include "code\modules\mob\living\simple_animal\friendly\pet.dm"
#include "code\modules\mob\living\simple_animal\hostile\dark_wizard.dm"
#include "code\modules\mob\living\simple_animal\hostile\hostile.dm"
#include "code\modules\mob\living\simple_animal\hostile\illusion.dm"
@@ -0,0 +1,2 @@
/mob/living/simple_animal/pet/gondola : /mob/living/basic/pet/gondola{@OLD}
/mob/living/simple_animal/pet/gondola/@SUBTYPES : /mob/living/basic/pet/gondola/@SUBTYPES{@OLD}