Adds the Odyssey gamemode. (#18972)

https://forums.aurorastation.org/topic/20198-mission-briefing-auroras-gamemode-revolution

To-do:

- [x] Finish storyteller verbs.
- [x] Storyteller landmarks.
- [x] Proper storyteller spawning. Right now the gamemode system is
happy with just picking one storyteller and no actors.
- [x] Antagonist whitelists code.
- [x] Adding the Storyteller whitelist.
- [x] Mission map loading code.
- [x] Map in a bunch of missions.
- [ ] Storyteller adminhelps.

---------

Co-authored-by: Matt Atlas <liermattia@gmail.com>
Co-authored-by: DreamySkrell <>
This commit is contained in:
Matt Atlas
2024-11-26 20:18:43 +00:00
committed by GitHub
co-authored by Matt Atlas DreamySkrell <>
parent e1f5de6298
commit 1da20ad33f
194 changed files with 242505 additions and 1904 deletions
+9 -1
View File
@@ -1,8 +1,16 @@
//How far from the edge of overmap zlevel could randomly placed objects spawn
#define OVERMAP_EDGE 2
//Dimension of overmap (squares 4 lyfe)
/// All sector overmap objects.
/// Assoc list of stringified zlevel integer value (like `"1"` or `"42"` etc)
/// to an instance of `/obj/effect/overmap/visitable`.
GLOBAL_LIST_EMPTY(map_sectors)
/// All sector map templates. Analogous to the list above.
/// Assoc list of stringified zlevel integer value
/// to an instance of `/datum/map_template`.
GLOBAL_LIST_EMPTY(map_templates)
/area/overmap/
name = "System Map"
icon_state = "start"
@@ -116,9 +116,7 @@
continue
// Generate contact information for this overmap object.
var/bearing = round(90 - Atan2(contact.x - linked.x, contact.y - linked.y),5)
if(bearing < 0)
bearing += 360
var/bearing = get_bearing(contact)
if(!record) // Begin attempting to identify ship.
// The chance of detection decreases with distance to the target ship.
if(contact.scannable && prob((SENSORS_DISTANCE_COEFFICIENT * contact.sensor_visibility)/max(get_dist(linked, contact), 0.5)))
@@ -137,13 +135,7 @@
visible_message(SPAN_NOTICE("<b>\The [src]</b> states, \"Contact '[contact.unknown_id]' tracing [objects_in_view[contact]]% complete, bearing [bearing_estimate], error +/- [bearing_variability].\""))
playsound(loc, 'sound/machines/sensors/contactgeneric.ogg', 10, 1) //Let players know there's something nearby.
if(objects_in_view[contact] >= 100) // Identification complete.
record = new /datum/overmap_contact(src, contact)
contact_datums[contact] = record
if(contact.scannable)
playsound(loc, 'sound/machines/sensors/newcontact.ogg', 30, 1)
visible_message(SPAN_NOTICE("<b>\The [src]</b> states, \"New contact identified, designation [record.name], bearing [bearing].\""))
record.show()
animate(record.marker, alpha=255, 2 SECOND, 1, LINEAR_EASING)
record = add_contact(contact)
continue
// Update identification information for this record.
record.update_marker_icon()
@@ -152,6 +144,28 @@
if(!record.pinged)
addtimer(CALLBACK(record, PROC_REF(ping)), time_delay)
/**
* Adds an overmap object to the known contacts.
*/
/obj/machinery/computer/ship/sensors/proc/add_contact(obj/effect/overmap/contact)
var/datum/overmap_contact/record = new(src, contact)
var/bearing = get_bearing(contact)
contact_datums[contact] = record
if(contact.scannable)
playsound(loc, 'sound/machines/sensors/newcontact.ogg', 30, 1)
visible_message(SPAN_NOTICE("<b>\The [src]</b> states, \"New contact identified, designation [record.name], bearing [bearing].\""))
record.show()
animate(record.marker, alpha=255, 2 SECOND, 1, LINEAR_EASING)
return record
/**
* Gets the bearing of an obj/effect/overmap/contact from src.
*/
/obj/machinery/computer/ship/sensors/proc/get_bearing(obj/effect/overmap/contact)
. = round(90 - Atan2(contact.x - linked.x, contact.y - linked.y),5)
if(. < 0)
. += 360
/obj/machinery/computer/ship/sensors/attackby(obj/item/attacking_item, mob/user)
. = ..()
var/obj/item/device/multitool/P = attacking_item
@@ -17,20 +17,33 @@
var/has_edge_icon = TRUE
/turf/simulated/floor/exoplanet/New()
// try to get the the atmos and area of the exoplanet
// try to get the the atmos and area of the planet
if(SSatlas.current_map.use_overmap)
var/obj/effect/overmap/visitable/sector/exoplanet/E = GLOB.map_sectors["[z]"]
if(istype(E))
if(E.atmosphere)
initial_gas = E.atmosphere.gas.Copy()
temperature = E.atmosphere.temperature
// if exoplanet
var/datum/site = GLOB.map_sectors["[z]"]
if(istype(site, /obj/effect/overmap/visitable/sector/exoplanet))
var/obj/effect/overmap/visitable/sector/exoplanet/exoplanet = site
if(exoplanet.atmosphere)
initial_gas = exoplanet.atmosphere.gas.Copy()
temperature = exoplanet.atmosphere.temperature
else
initial_gas = list()
temperature = T0C
//Must be done here, as light data is not fully carried over by ChangeTurf (but overlays are).
set_light(MINIMUM_USEFUL_LIGHT_RANGE, E.lightlevel, E.lightcolor)
if(E.planetary_area && istype(loc, world.area))
ChangeArea(src, E.planetary_area)
set_light(MINIMUM_USEFUL_LIGHT_RANGE, exoplanet.lightlevel, exoplanet.lightcolor)
if(exoplanet.planetary_area && istype(loc, world.area))
ChangeArea(src, exoplanet.planetary_area)
// if away site
else if(istype(site, /datum/map_template/ruin/away_site))
var/datum/map_template/ruin/away_site/away_site = site
if(away_site.exoplanet_atmosphere)
initial_gas = away_site.exoplanet_atmosphere.gas.Copy()
temperature = away_site.exoplanet_atmosphere.temperature
else
initial_gas = list()
temperature = T0C
set_light(MINIMUM_USEFUL_LIGHT_RANGE, away_site.lightlevel, away_site.lightcolor)
// if not on an exoplanet, instead just keep the default or mapped in atmos
..()