diff --git a/code/_globalvars/game_modes.dm b/code/_globalvars/game_modes.dm index 6ea7cc1d8ed..3f8ec321470 100644 --- a/code/_globalvars/game_modes.dm +++ b/code/_globalvars/game_modes.dm @@ -5,4 +5,6 @@ var/wavesecret = 0 // meteor mode, delays wave progression, terrible name var/datum/station_state/start_state = null // Used in round-end report var/custom_event_msg = null -var/custom_event_admin_msg = null \ No newline at end of file +var/custom_event_admin_msg = null + +var/list/summon_spots = list() diff --git a/code/game/area/Space Station 13 areas.dm b/code/game/area/Space Station 13 areas.dm index 7b7952b5f88..f83840dc3d2 100644 --- a/code/game/area/Space Station 13 areas.dm +++ b/code/game/area/Space Station 13 areas.dm @@ -30,6 +30,8 @@ NOTE: there are two lists of areas in the end of this file: centcom and station luminosity = 0 mouse_opacity = 0 invisibility = INVISIBILITY_LIGHTING + var/valid_territory = TRUE //used for cult summoning areas on station zlevel + var/map_name // Set in New(); preserves the name set by the map maker, even if renamed by the Blueprints. var/lightswitch = 1 var/eject = null @@ -122,6 +124,7 @@ var/list/ghostteleportlocs = list() power_light = 0 power_equip = 0 power_environ = 0 + valid_territory = FALSE outdoors = 1 ambientsounds = list('sound/ambience/ambispace.ogg','sound/music/title2.ogg','sound/music/space.ogg','sound/music/traitor.ogg') @@ -150,6 +153,7 @@ var/list/ghostteleportlocs = list() /area/shuttle no_teleportlocs = 1 requires_power = 0 + valid_territory = FALSE /area/shuttle/arrival name = "\improper Arrival Shuttle" @@ -554,6 +558,7 @@ var/list/ghostteleportlocs = list() name = "\improper Asteroid" icon_state = "asteroid" requires_power = 0 + valid_territory = FALSE /area/asteroid/cave // -- TLE name = "\improper Asteroid - Underground" @@ -881,6 +886,7 @@ var/list/ghostteleportlocs = list() //Maintenance /area/maintenance ambientsounds = list('sound/ambience/ambimaint1.ogg', 'sound/ambience/ambimaint2.ogg', 'sound/ambience/ambimaint3.ogg', 'sound/ambience/ambimaint4.ogg', 'sound/ambience/ambimaint5.ogg') + valid_territory = FALSE /area/maintenance/atmos_control name = "Atmospherics Maintenance" @@ -1137,6 +1143,7 @@ var/list/ghostteleportlocs = list() /area/crew_quarters/sleep name = "\improper Dormitories" icon_state = "Sleep" + valid_territory = FALSE /area/crew_quarters/sleep_male name = "\improper Male Dorm" @@ -1372,6 +1379,7 @@ var/list/ghostteleportlocs = list() /area/solar requires_power = 0 dynamic_lighting = 0 + valid_territory = FALSE auxport name = "\improper Fore Port Solar Array" @@ -1876,6 +1884,7 @@ area/security/podbay /area/toxins/test_area name = "\improper Toxins Test Area" icon_state = "toxtest" + valid_territory = FALSE /area/toxins/mixing name = "\improper Toxins Mixing Room" diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm index 0ac2f242b08..723d26a451a 100644 --- a/code/game/area/areas.dm +++ b/code/game/area/areas.dm @@ -25,6 +25,7 @@ layer = 10 uid = ++global_uid all_areas += src + map_name = name // Save the initial (the name set in the map) name of the area. if(type == /area) // override defaults for space. TODO: make space areas of type /area/space rather than /area requires_power = 1 diff --git a/code/game/gamemodes/cult/cult.dm b/code/game/gamemodes/cult/cult.dm index a6c2214b9d7..2ac7d46dfba 100644 --- a/code/game/gamemodes/cult/cult.dm +++ b/code/game/gamemodes/cult/cult.dm @@ -1,3 +1,4 @@ +#define SUMMON_POSSIBILITIES 3 var/global/list/all_cults = list() /datum/game_mode @@ -106,6 +107,12 @@ var/global/list/all_cults = list() modePlayer += cult acolytes_needed = acolytes_needed + round((num_players_started() / 10)) + if(!summon_spots.len) + while(summon_spots.len < SUMMON_POSSIBILITIES) + var/area/summon = pick(return_sorted_areas() - summon_spots) + if(summon && is_station_level(summon.z) && summon.valid_territory) + summon_spots += summon + for(var/datum/mind/cult_mind in cult) equip_cultist(cult_mind.current) cult_mind.current.faction |= "cult" @@ -135,7 +142,7 @@ var/global/list/all_cults = list() else explanation = "Free objective." if("eldergod") - explanation = "Summon [ticker.mode.cultdat.entity_name]. It will only work if nine cultists stand on and around it." + explanation = "Summon [ticker.mode.cultdat.entity_name] by invoking the 'Tear Reality' rune.The summoning can only be accomplished in [english_list(summon_spots)] - where the veil is weak enough for the ritual to begin." to_chat(cult_mind.current, "Objective #[obj_count]: [explanation]") cult_mind.memory += "Objective #[obj_count]: [explanation]
" diff --git a/code/game/gamemodes/cult/cult_objectives.dm b/code/game/gamemodes/cult/cult_objectives.dm index c9e951cf940..69b6de0c73e 100644 --- a/code/game/gamemodes/cult/cult_objectives.dm +++ b/code/game/gamemodes/cult/cult_objectives.dm @@ -109,10 +109,10 @@ if(prob(40))//split the chance of this objectives += "eldergod" - explanation = "Summon [ticker.mode.cultdat.entity_name] on the Station via the use of the Tear Reality rune." + explanation = "Summon [ticker.mode.cultdat.entity_name] on the Station via the use of the Tear Reality rune. The veil is weak enough in [english_list(summon_spots)] for the ritual to begin." else objectives += "slaughter" - explanation = "Bring the Slaughter via the rune 'Bring forth the slaughter'." + explanation = "Bring the Slaughter via the rune 'Bring forth the slaughter'. The veil is weak enough in [english_list(summon_spots)] for the ritual to begin." for(var/datum/mind/cult_mind in cult) to_chat(cult_mind.current, "You and your acolytes have succeeded in preparing the station for the ultimate ritual!") diff --git a/code/game/gamemodes/cult/ritual.dm b/code/game/gamemodes/cult/ritual.dm index 36ebc5d3dab..55d2a51de61 100644 --- a/code/game/gamemodes/cult/ritual.dm +++ b/code/game/gamemodes/cult/ritual.dm @@ -201,6 +201,7 @@ /obj/item/weapon/tome/proc/finale_runes_ok(mob/living/user, obj/effect/rune/rune_to_scribe) var/datum/game_mode/cult/cult_mode = ticker.mode + var/area/A = get_area(src) if(GAMEMODE_IS_CULT) if(!canbypass)//not an admin-tome, check things if(!cult_mode.narsie_condition_cleared) @@ -215,6 +216,9 @@ if(!((CULT_ELDERGOD in cult_mode.objectives) || (CULT_SLAUGHTER in cult_mode.objectives))) to_chat(user, "[cult_mode.cultdat.entity_name]'s power does not wish to be unleashed!") return 0 + if(!(A in summon_spots)) + to_chat(user, "[cult_mode.cultdat.entity_name] can only be summoned where the veil is weak - in [english_list(summon_spots)]!") + return 0 var/confirm_final = alert(user, "This is the FINAL step to summon your deities power, it is a long, painful ritual and the crew will be alerted to your presence", "Are you prepared for the final battle?", "My life for [cult_mode.cultdat.entity_name]!", "No") if(confirm_final == "No" || confirm_final == null) to_chat(user, "You decide to prepare further before scribing the rune.") @@ -236,6 +240,7 @@ var/entered_rune_name var/list/possible_runes = list() var/list/shields = list() + var/area/A = get_area(src) if(locate(/obj/effect/rune) in runeturf) to_chat(user, "There is already a rune here.") return @@ -261,6 +266,7 @@ if(!rune_to_scribe) return runeturf = get_turf(user) //we may have moved. adjust as needed... + A = get_area(src) if(locate(/obj/effect/rune) in runeturf) to_chat(user, "There is already a rune here.") return @@ -268,7 +274,11 @@ return if(ispath(rune_to_scribe, /obj/effect/rune/narsie) || ispath(rune_to_scribe, /obj/effect/rune/slaughter))//may need to change this - Fethas if(finale_runes_ok(user,rune_to_scribe)) - command_announcement.Announce("Figments from an eldritch god are being summoned somwhere on the station from an unknown dimension. Disrupt the ritual at all costs!","Central Command Higher Dimensional Affairs", 'sound/AI/spanomalies.ogg') + A = get_area(src) + if(!(A in summon_spots)) // Check again to make sure they didn't move + to_chat(user, "The ritual can only begin where the veil is weak - in [english_list(summon_spots)]!") + return + command_announcement.Announce("Figments from an eldritch god are being summoned somewhere on the station from an unknown dimension. Disrupt the ritual at all costs!","Central Command Higher Dimensional Affairs", 'sound/AI/spanomalies.ogg') for(var/B in spiral_range_turfs(1, user, 1)) var/turf/T = B var/obj/machinery/shield/N = new(T)