diff --git a/code/controllers/configuration.dm b/code/controllers/configuration.dm index d2dd1fbe74d..f45ef75ed89 100644 --- a/code/controllers/configuration.dm +++ b/code/controllers/configuration.dm @@ -100,6 +100,9 @@ var/list/gamemode_cache = list() var/static/drone_build_time = 1200 //A drone will become available every X ticks since last drone spawn. Default is 2 minutes. var/static/disable_player_mice = 0 + var/static/allow_ghost_mob_spawn = 1 //RS ADD - Allows players to spawn as mobs + var/static/ghost_mob_count = 5 //RS ADD - How many mobs are allowed to spawn from ghosts + var/static/uneducated_mice = 0 //Set to 1 to prevent newly-spawned mice from understanding human speech var/static/usealienwhitelist = 0 @@ -767,6 +770,12 @@ var/list/gamemode_cache = list() if("disable_player_mice") config.disable_player_mice = 1 + if("disable_ghost_mob_spawn") //RS ADD START + config.allow_ghost_mob_spawn = FALSE + + if("ghost_mob_count") + config.ghost_mob_count = value //RS ADD END + if("uneducated_mice") config.uneducated_mice = 1 diff --git a/code/game/objects/structures/ghost_pods/event_vr.dm b/code/game/objects/structures/ghost_pods/event_vr.dm index e2d02959ab1..4f2fc2123c3 100644 --- a/code/game/objects/structures/ghost_pods/event_vr.dm +++ b/code/game/objects/structures/ghost_pods/event_vr.dm @@ -15,53 +15,6 @@ invisibility = INVISIBILITY_OBSERVER spawn_active = TRUE var/announce_prob = 35 - var/list/possible_mobs = list("Rabbit" = /mob/living/simple_mob/vore/rabbit, - "Red Panda" = /mob/living/simple_mob/vore/redpanda, - "Fennec" = /mob/living/simple_mob/vore/fennec, - "Fennix" = /mob/living/simple_mob/vore/fennix, - "Space Bumblebee" = /mob/living/simple_mob/vore/bee, - "Space Bear" = /mob/living/simple_mob/animal/space/bear, - "Voracious Lizard" = /mob/living/simple_mob/vore/aggressive/dino, - "Giant Frog" = /mob/living/simple_mob/vore/aggressive/frog, - "Giant Rat" = /mob/living/simple_mob/vore/aggressive/rat, - "Jelly Blob" = /mob/living/simple_mob/vore/jelly, - "Wolf" = /mob/living/simple_mob/vore/wolf, - "Juvenile Solargrub" = /mob/living/simple_mob/vore/solargrub, - "Sect Queen" = /mob/living/simple_mob/vore/sect_queen, - "Sect Drone" = /mob/living/simple_mob/vore/sect_drone, - "Defanged Xenomorph" = /mob/living/simple_mob/vore/xeno_defanged, - "Panther" = /mob/living/simple_mob/vore/aggressive/panther, - "Giant Snake" = /mob/living/simple_mob/vore/aggressive/giant_snake, - "Deathclaw" = /mob/living/simple_mob/vore/aggressive/deathclaw, - "Otie" = /mob/living/simple_mob/vore/otie, - "Mutated Otie" =/mob/living/simple_mob/vore/otie/feral, - "Red Otie" = /mob/living/simple_mob/vore/otie/red, - "Corrupt Hound" = /mob/living/simple_mob/vore/aggressive/corrupthound, - "Corrupt Corrupt Hound" = /mob/living/simple_mob/vore/aggressive/corrupthound/prettyboi, - "Hunter Giant Spider" = /mob/living/simple_mob/animal/giant_spider/hunter, - "Lurker Giant Spider" = /mob/living/simple_mob/animal/giant_spider/lurker, - "Pepper Giant Spider" = /mob/living/simple_mob/animal/giant_spider/pepper, - "Thermic Giant Spider" = /mob/living/simple_mob/animal/giant_spider/thermic, - "Webslinger Giant Spider" = /mob/living/simple_mob/animal/giant_spider/webslinger, - "Frost Giant Spider" = /mob/living/simple_mob/animal/giant_spider/frost, - "Nurse Giant Spider" = /mob/living/simple_mob/animal/giant_spider/nurse/eggless, - "Giant Spider Queen" = /mob/living/simple_mob/animal/giant_spider/nurse/queen/eggless, - "Weretiger" = /mob/living/simple_mob/vore/weretiger, - "Catslug" = /mob/living/simple_mob/vore/alienanimals/catslug, - "Squirrel" = /mob/living/simple_mob/vore/squirrel/big, - "Pakkun" =/mob/living/simple_mob/vore/pakkun, - "Snapdragon" =/mob/living/simple_mob/vore/pakkun/snapdragon, - "Sand pakkun" = /mob/living/simple_mob/vore/pakkun/sand, - "Fire pakkun" = /mob/living/simple_mob/vore/pakkun/fire, - "Amethyst pakkun" = /mob/living/simple_mob/vore/pakkun/purple, - "Raptor" = /mob/living/simple_mob/vore/raptor, - "Giant Bat" = /mob/living/simple_mob/vore/bat, - "Scel (Orange)" = /mob/living/simple_mob/vore/scel/orange, - "Scel (Blue)" = /mob/living/simple_mob/vore/scel/blue, - "Scel (Purple)" = /mob/living/simple_mob/vore/scel/purple, - "Scel (Red)" = /mob/living/simple_mob/vore/scel/red, - "Scel (Green)" = /mob/living/simple_mob/vore/scel/green - ) /obj/structure/ghost_pod/ghost_activated/maintpred/create_occupant(var/mob/M) ..() @@ -74,7 +27,7 @@ return while(finalized == "No" && M.client) - choice = tgui_input_list(M, "What type of predator do you want to play as?", "Maintpred Choice", possible_mobs) + choice = tgui_input_list(M, "What type of predator do you want to play as?", "Maintpred Choice", GLOB.ghost_spawnable_mobs) //RS EDIT if(!choice) //We probably pushed the cancel button on the mob selection. Let's just put the ghost pod back in the list. to_chat(M, "No mob selected, cancelling.") reset_ghostpod() @@ -87,7 +40,7 @@ reset_ghostpod() return - var/mobtype = possible_mobs[choice] + var/mobtype = GLOB.ghost_spawnable_mobs[choice] var/mob/living/simple_mob/newPred = new mobtype(get_turf(src)) qdel(newPred.ai_holder) newPred.ai_holder = null diff --git a/code/modules/admin/admin_verb_lists_vr.dm b/code/modules/admin/admin_verb_lists_vr.dm index 4484a7ffafc..ad49cc98e08 100644 --- a/code/modules/admin/admin_verb_lists_vr.dm +++ b/code/modules/admin/admin_verb_lists_vr.dm @@ -124,6 +124,7 @@ var/list/admin_verbs_admin = list( /client/proc/fixatmos, /datum/admins/proc/quick_nif, //VOREStation Add, /datum/admins/proc/set_uplink, //VOREStation Add, + /datum/admins/proc/add_ghost_mob_spawns, //RS ADD, /datum/admins/proc/sendFax, /client/proc/despawn_player, /datum/admins/proc/view_feedback, diff --git a/code/modules/mob/ghost_simplemob_spawn.dm b/code/modules/mob/ghost_simplemob_spawn.dm new file mode 100644 index 00000000000..9694d7cfee8 --- /dev/null +++ b/code/modules/mob/ghost_simplemob_spawn.dm @@ -0,0 +1,138 @@ +GLOBAL_VAR_INIT(ghost_mob_spawn_count, 0) +GLOBAL_LIST_INIT(ghost_spawnable_mobs,list( + "Rabbit" = /mob/living/simple_mob/vore/rabbit, + "Red Panda" = /mob/living/simple_mob/vore/redpanda, + "Fennec" = /mob/living/simple_mob/vore/fennec, + "Fennix" = /mob/living/simple_mob/vore/fennix, + "Space Bumblebee" = /mob/living/simple_mob/vore/bee, + "Space Bear" = /mob/living/simple_mob/animal/space/bear, + "Voracious Lizard" = /mob/living/simple_mob/vore/aggressive/dino, + "Giant Frog" = /mob/living/simple_mob/vore/aggressive/frog, + "Giant Rat" = /mob/living/simple_mob/vore/aggressive/rat, + "Jelly Blob" = /mob/living/simple_mob/vore/jelly, + "Wolf" = /mob/living/simple_mob/vore/wolf, + "Juvenile Solargrub" = /mob/living/simple_mob/vore/solargrub, + "Sect Queen" = /mob/living/simple_mob/vore/sect_queen, + "Sect Drone" = /mob/living/simple_mob/vore/sect_drone, + "Defanged Xenomorph" = /mob/living/simple_mob/vore/xeno_defanged, + "Panther" = /mob/living/simple_mob/vore/aggressive/panther, + "Giant Snake" = /mob/living/simple_mob/vore/aggressive/giant_snake, + "Deathclaw" = /mob/living/simple_mob/vore/aggressive/deathclaw, + "Otie" = /mob/living/simple_mob/vore/otie, + "Mutated Otie" =/mob/living/simple_mob/vore/otie/feral, + "Red Otie" = /mob/living/simple_mob/vore/otie/red, + "Corrupt Hound" = /mob/living/simple_mob/vore/aggressive/corrupthound, + "Corrupt Corrupt Hound" = /mob/living/simple_mob/vore/aggressive/corrupthound/prettyboi, + "Hunter Giant Spider" = /mob/living/simple_mob/animal/giant_spider/hunter, + "Lurker Giant Spider" = /mob/living/simple_mob/animal/giant_spider/lurker, + "Pepper Giant Spider" = /mob/living/simple_mob/animal/giant_spider/pepper, + "Thermic Giant Spider" = /mob/living/simple_mob/animal/giant_spider/thermic, + "Webslinger Giant Spider" = /mob/living/simple_mob/animal/giant_spider/webslinger, + "Frost Giant Spider" = /mob/living/simple_mob/animal/giant_spider/frost, + "Nurse Giant Spider" = /mob/living/simple_mob/animal/giant_spider/nurse/eggless, + "Giant Spider Queen" = /mob/living/simple_mob/animal/giant_spider/nurse/queen/eggless, + "Weretiger" = /mob/living/simple_mob/vore/weretiger, + "Catslug" = /mob/living/simple_mob/vore/alienanimals/catslug, + "Squirrel" = /mob/living/simple_mob/vore/squirrel/big, + "Pakkun" =/mob/living/simple_mob/vore/pakkun, + "Snapdragon" =/mob/living/simple_mob/vore/pakkun/snapdragon, + "Sand pakkun" = /mob/living/simple_mob/vore/pakkun/sand, + "Fire pakkun" = /mob/living/simple_mob/vore/pakkun/fire, + "Amethyst pakkun" = /mob/living/simple_mob/vore/pakkun/purple, + "Raptor" = /mob/living/simple_mob/vore/raptor, + "Giant Bat" = /mob/living/simple_mob/vore/bat, + "Scel (Orange)" = /mob/living/simple_mob/vore/scel/orange, + "Scel (Blue)" = /mob/living/simple_mob/vore/scel/blue, + "Scel (Purple)" = /mob/living/simple_mob/vore/scel/purple, + "Scel (Red)" = /mob/living/simple_mob/vore/scel/red, + "Scel (Green)" = /mob/living/simple_mob/vore/scel/green + )) + +/mob/observer/dead/verb/join_as_simplemob() //Copypasta from join_as_drone() + set category = "Ghost" + set name = "Join As Mob" + set desc = "Join as a simple mob if conditions are right!" + + if(ticker.current_state < GAME_STATE_PLAYING) + to_chat(src, "The game hasn't started yet!") + return + + if(!(config.allow_ghost_mob_spawn)) + to_chat(src, "That verb is not currently permitted.") + return + + if (!src.stat) + return + + if (usr != src) + return 0 //something is terribly wrong + + if(jobban_isbanned(src, "GhostRoles")) + to_chat(usr, "You are banned from playing as ghost roles, and so can not spawn as a mob.") + return + + if(GLOB.ghost_mob_spawn_count >= config.ghost_mob_count) + to_chat(src, "Too many mobs have already been spawned, you can not spawn as a mob at this time.") + return + + if(!MayRespawn(1)) + return + + var/deathtime = world.time - src.timeofdeath + var/deathtimeminutes = round(deathtime / (1 MINUTE)) + var/pluralcheck = "minute" + if(deathtimeminutes == 0) + pluralcheck = "" + else if(deathtimeminutes == 1) + pluralcheck = " [deathtimeminutes] minute and" + else if(deathtimeminutes > 1) + pluralcheck = " [deathtimeminutes] minutes and" + var/deathtimeseconds = round((deathtime - deathtimeminutes * 1 MINUTE) / 10,1) + + if (deathtime < 5 MINUTES) + to_chat(usr, "You have been dead for[pluralcheck] [deathtimeseconds] seconds.") + to_chat(usr, "You must wait 5 minutes to spawn as a mob!") + return + + var/choice = tgui_input_list(src, "What type of mob do you want to spawn as?", "Mob Choice", GLOB.ghost_spawnable_mobs) + if(!choice) + return + + for(var/mob/living/sus in viewers(get_turf(src))) //We can spawn the mob literally anywhere, + if(!isliving(sus)) //but let's make sure that people playing in the round can't see us when we spawn + continue + if(sus.ckey) + to_chat(src, "\The [sus] can see you here, try somewhere more discreet!") + return + + var/mobtype = GLOB.ghost_spawnable_mobs[choice] + var/mob/living/simple_mob/newPred = new mobtype(get_turf(src)) + qdel(newPred.ai_holder) + newPred.ai_holder = null + if(mind) + mind.transfer_to(newPred) + to_chat(src, "You are [newPred], somehow having gotten aboard the station in search of food. \ + You are wary of environment around you, but you do feel rather peckish. Stick around dark, secluded places to avoid danger or, \ + if you are cute enough, try to make friends with this place's inhabitants.") + to_chat(src, "Please be advised, this role is NOT AN ANTAGONIST.") + to_chat(src, "You may be a spooky space monster, but your role is to facilitate spooky space monster roleplay, not to fight the station and kill people. You can of course eat and/or digest people as you like if OOC prefs align, but this should be done as part of roleplay. If you intend to fight the station and kill people and such, you need permission from the staff team. GENERALLY, this role should avoid well populated areas. You’re a weird spooky space monster, so the bar is probably not where you’d want to go if you intend to survive. Of course, you’re welcome to try to make friends and roleplay how you will in this regard, but something to keep in mind.") + + log_and_message_admins("[newPred.ckey] used Join As Mob to become a [newPred].") + GLOB.ghost_mob_spawn_count ++ + + newPred.ckey = src.ckey + newPred.visible_message("[newPred] emerges from somewhere!") + +/datum/admins/proc/add_ghost_mob_spawns() + set category = "Fun" + set name = "Adjust total ghost mob spawns" + set desc = "Lets you adjust how many mobs ghosts can spawn as." + + if(!check_rights(R_ADMIN)) + return + + var/amount = tgui_input_number(usr, "How many mobs should ghosts be able to spawn as?", "How many mobs", config.ghost_mob_count) + if(amount) + config.ghost_mob_count = amount + else + to_chat(usr, "Cancelled. The value was not updated.") diff --git a/icons/mob/screen_full_colorized_vore.dmi b/icons/mob/screen_full_colorized_vore.dmi index 1f6c69f912c..5ef1af73ee2 100644 Binary files a/icons/mob/screen_full_colorized_vore.dmi and b/icons/mob/screen_full_colorized_vore.dmi differ diff --git a/icons/mob/screen_full_colorized_vore_overlays.dmi b/icons/mob/screen_full_colorized_vore_overlays.dmi index 77c45a57ec1..3f84c4389e4 100644 Binary files a/icons/mob/screen_full_colorized_vore_overlays.dmi and b/icons/mob/screen_full_colorized_vore_overlays.dmi differ diff --git a/icons/mob/screen_full_vore.dmi b/icons/mob/screen_full_vore.dmi index 376a39399b5..b53d57cc4f5 100644 Binary files a/icons/mob/screen_full_vore.dmi and b/icons/mob/screen_full_vore.dmi differ diff --git a/maps/groundbase/rp-z1.dmm b/maps/groundbase/rp-z1.dmm index 692ccf207c0..4af76677629 100644 --- a/maps/groundbase/rp-z1.dmm +++ b/maps/groundbase/rp-z1.dmm @@ -3994,6 +3994,14 @@ }, /turf/simulated/floor, /area/groundbase/cargo/mining) +"egk" = ( +/obj/effect/landmark{ + name = "maint_pred" + }, +/turf/simulated/floor/outdoors/newdirt{ + outdoors = 0 + }, +/area/groundbase/level1/ne) "egG" = ( /turf/simulated/floor/outdoors/grass/seasonal/dark, /area/groundbase/level1/nw) @@ -9352,6 +9360,14 @@ /obj/structure/sign/department/telecoms, /turf/simulated/wall/r_wall, /area/groundbase/command/tcomms/foyer) +"jNJ" = ( +/obj/effect/landmark{ + name = "maint_pred" + }, +/turf/simulated/floor/outdoors/newdirt{ + outdoors = 0 + }, +/area/groundbase/level1/nw) "jNK" = ( /obj/machinery/optable, /turf/simulated/floor/tiled/white, @@ -25644,7 +25660,7 @@ eHS eHS eHS eHS -eHS +jNJ iuY kyu oeu @@ -28735,7 +28751,7 @@ awx kyu kyu eHS -eHS +jNJ tpV wNr tpV @@ -37965,7 +37981,7 @@ awx awx awx awx -irP +egk khe kBO kkl diff --git a/maps/groundbase/rp-z2.dmm b/maps/groundbase/rp-z2.dmm index 817cb56d1c8..507db380f3a 100644 --- a/maps/groundbase/rp-z2.dmm +++ b/maps/groundbase/rp-z2.dmm @@ -527,6 +527,14 @@ "cc" = ( /turf/simulated/wall/r_wall, /area/groundbase/dorms/bathroom) +"ce" = ( +/obj/effect/landmark{ + name = "maint_pred" + }, +/turf/simulated/floor/outdoors/newdirt{ + outdoors = 0 + }, +/area/groundbase/level2/nw) "cg" = ( /obj/effect/floor_decal/chapel, /obj/structure/disposalpipe/segment, @@ -5252,6 +5260,14 @@ }, /turf/simulated/floor/tiled/white, /area/groundbase/medical/Chemistry) +"tu" = ( +/obj/effect/landmark{ + name = "maint_pred" + }, +/turf/simulated/floor/outdoors/newdirt{ + outdoors = 0 + }, +/area/groundbase/level2/se) "tv" = ( /obj/structure/sign/directions/cryo{ dir = 8; @@ -9390,6 +9406,9 @@ /area/groundbase/civilian/library) "Jb" = ( /obj/machinery/hologram/holopad, +/obj/effect/landmark{ + name = "maint_pred" + }, /turf/simulated/floor/tiled{ edge_blending_priority = -1; outdoors = 0 @@ -13253,6 +13272,12 @@ }, /turf/simulated/floor/tiled, /area/rnd/xenobiology) +"Wk" = ( +/obj/effect/landmark{ + name = "maint_pred" + }, +/turf/simulated/floor/outdoors/newdirt, +/area/groundbase/level2/ne) "Wl" = ( /obj/structure/cable/yellow{ icon_state = "1-4" @@ -16426,7 +16451,7 @@ rh bG bG bG -bG +ce rh rh rh @@ -24252,7 +24277,7 @@ Gy Gy Tb Tb -Tb +Wk Tb Ng Gy @@ -25388,7 +25413,7 @@ Gy Tb Gy Gy -Tb +Wk Tb Ng Tb @@ -30707,7 +30732,7 @@ rh rh kp kp -si +tu si si kp diff --git a/vorestation.dme b/vorestation.dme index 6758e0c2da2..5f93df402eb 100644 --- a/vorestation.dme +++ b/vorestation.dme @@ -2731,6 +2731,7 @@ #include "code\modules\mob\emote.dm" #include "code\modules\mob\gender.dm" #include "code\modules\mob\gender_vr.dm" +#include "code\modules\mob\ghost_simplemob_spawn.dm" #include "code\modules\mob\hear_say.dm" #include "code\modules\mob\holder.dm" #include "code\modules\mob\inventory.dm" @@ -4268,7 +4269,6 @@ #include "maps\expedition_vr\beach\submaps\mountains.dm" #include "maps\expedition_vr\beach\submaps\mountains_areas.dm" #include "maps\gateway_archive_vr\blackmarketpackers.dm" -#include "maps\groundbase\groundbase.dm" #include "maps\redgate\fantasy_items.dm" #include "maps\redgate\code\snowglobe_rs.dm" #include "maps\southern_cross\items\clothing\sc_accessory.dm" @@ -4277,6 +4277,7 @@ #include "maps\southern_cross\loadout\loadout_suit.dm" #include "maps\southern_cross\loadout\loadout_uniform.dm" #include "maps\southern_cross\loadout\loadout_vr.dm" +#include "maps\stellar_delight\stellar_delight.dm" #include "maps\submaps\_helpers.dm" #include "maps\submaps\_readme.dm" #include "maps\submaps\admin_use_vr\event_autonomous_drone.dm"