From 74ffc6c09cafddbb35b41f788d52b507414c95b5 Mon Sep 17 00:00:00 2001 From: tralezab <40974010+tralezab@users.noreply.github.com> Date: Sun, 11 Dec 2022 19:39:52 -0800 Subject: [PATCH] Point of Rat Focus (Important Focus on Rats from Important Points of View Orbit Menu for Regal Rats) (#71597) Regal rats, while uncontrolled by players, are a point of interest - They're the first monster to show up in an area that's otherwise empty (in my case, a desert) - There are no other monsters in the same biome as them - They have a unique ability: they spawn chests when killed - Their loot includes a rare drop --- code/modules/mob/dead/observer/orbit.dm | 14 ++++++++-- .../living/simple_animal/hostile/regalrat.dm | 26 +++++++------------ 2 files changed, 21 insertions(+), 19 deletions(-) diff --git a/code/modules/mob/dead/observer/orbit.dm b/code/modules/mob/dead/observer/orbit.dm index 6ea9a55bed7..66708f7af1d 100644 --- a/code/modules/mob/dead/observer/orbit.dm +++ b/code/modules/mob/dead/observer/orbit.dm @@ -1,6 +1,10 @@ GLOBAL_DATUM_INIT(orbit_menu, /datum/orbit_menu, new) /datum/orbit_menu + ///mobs worth orbiting. Because spaghetti, all mobs have the point of interest, but only some are allowed to actually show up. + ///this obviously should be changed in the future, so we only add mobs as POI if they actually are interesting, and we don't use + ///a typecache. + var/static/list/mob_allowed_typecache = list() /datum/orbit_menu/ui_state(mob/user) return GLOB.observer_state @@ -153,9 +157,15 @@ GLOBAL_DATUM_INIT(orbit_menu, /datum/orbit_menu, new) */ /datum/orbit_menu/proc/validate_mob_poi(datum/point_of_interest/mob_poi/potential_poi) var/mob/potential_mob_poi = potential_poi.target - // Skip mindless and ckeyless mobs except bots, cameramobs and megafauna. if(!potential_mob_poi.mind && !potential_mob_poi.ckey) - if(!isbot(potential_mob_poi) && !iscameramob(potential_mob_poi) && !ismegafauna(potential_mob_poi)) + if(!mob_allowed_typecache) + mob_allowed_typecache = typecacheof(list( + /mob/living/simple_animal/bot, + /mob/camera, + /mob/living/simple_animal/hostile/megafauna, + /mob/living/simple_animal/hostile/regalrat, + )) + if(!is_type_in_typecache(potential_mob_poi, mob_allowed_typecache)) return FALSE return potential_poi.validate() diff --git a/code/modules/mob/living/simple_animal/hostile/regalrat.dm b/code/modules/mob/living/simple_animal/hostile/regalrat.dm index ba3f5282702..9ef954d3aa6 100644 --- a/code/modules/mob/living/simple_animal/hostile/regalrat.dm +++ b/code/modules/mob/living/simple_animal/hostile/regalrat.dm @@ -49,29 +49,22 @@ QDEL_NULL(riot) return ..() +/mob/living/simple_animal/hostile/regalrat/proc/become_player_controlled(mob/user) + log_message("took control of [name].", LOG_GAME) + key = user.key + notify_ghosts("All rise for the rat king, ascendant to the throne in \the [get_area(src)].", source = src, action = NOTIFY_ORBIT, flashwindow = FALSE, header = "Sentient Rat Created") + to_chat(src, span_notice("You are an independent, invasive force on the station! Horde coins, trash, cheese, and the like from the safety of darkness!")) + /mob/living/simple_animal/hostile/regalrat/proc/get_player() var/list/mob/dead/observer/candidates = poll_ghost_candidates("Do you want to play as the Regal Rat, cheesey be their crown?", ROLE_SENTIENCE, ROLE_SENTIENCE, 100, POLL_IGNORE_REGAL_RAT) if(LAZYLEN(candidates) && !mind) - var/mob/dead/observer/C = pick(candidates) - key = C.key - notify_ghosts("All rise for the rat king, ascendant to the throne in \the [get_area(src)].", source = src, action = NOTIFY_ORBIT, flashwindow = FALSE, header = "Sentient Rat Created") - to_chat(src, span_notice("You are an independent, invasive force on the station! Horde coins, trash, cheese, and the like from the safety of darkness!")) + var/mob/dead/observer/candidate = pick(candidates) + become_player_controlled(candidate) /mob/living/simple_animal/hostile/regalrat/attack_ghost(mob/user) . = ..() if(. || !(GLOB.ghost_role_flags & GHOSTROLE_SPAWNER)) return - get_clicked_player(user) - -/** - * Sets a ghost to control the rat if the rat is eligible - * - * Asks the interacting ghost if they would like to control the rat. - * If they answer yes, and another ghost hasn't taken control, sets the ghost to control the rat. - * Arguments: - * * mob/user - The ghost to possibly control the rat - */ -/mob/living/simple_animal/hostile/regalrat/proc/get_clicked_player(mob/user) if(key || stat) return if(!SSticker.HasRoundStarted()) @@ -83,8 +76,7 @@ if(key) to_chat(user, span_warning("Someone else already took the rat!")) return - key = user.key - src.log_message("took control of [name].", LOG_GAME) + become_player_controlled(user) /mob/living/simple_animal/hostile/regalrat/handle_automated_action() if(prob(20))