mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-08-23 13:10:02 +01:00
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>
This commit is contained in:
@@ -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" = (
|
||||
|
||||
@@ -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")
|
||||
},
|
||||
|
||||
@@ -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")
|
||||
},
|
||||
|
||||
@@ -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" = (
|
||||
|
||||
@@ -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,
|
||||
))
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
..()
|
||||
@@ -352,7 +352,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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
@@ -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,
|
||||
// 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
|
||||
|
||||
@@ -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
|
||||
|
||||
+2
-3
@@ -3572,7 +3572,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"
|
||||
@@ -4798,6 +4797,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"
|
||||
@@ -5087,8 +5088,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}
|
||||
Reference in New Issue
Block a user