mirror of
https://github.com/Citadel-Station-13/Citadel-Station-13-RP.git
synced 2026-08-21 05:06:29 +01:00
85 lines
2.6 KiB
Plaintext
85 lines
2.6 KiB
Plaintext
//* This file is explicitly licensed under the MIT license. *//
|
|
//* Copyright (c) 2025 Citadel Station Developers *//
|
|
|
|
/**
|
|
* Tracks and initializes world factions
|
|
*
|
|
* todo: can we rename this to something that doesn't coincide with 'world' aka byond worlds??
|
|
*/
|
|
SUBSYSTEM_DEF(game_world)
|
|
name = "World"
|
|
init_order = INIT_ORDER_GAME_WORLD
|
|
subsystem_flags = SS_NO_FIRE
|
|
|
|
/**
|
|
* all factions by id
|
|
*
|
|
* todo: RSworld_factions (repository)
|
|
*/
|
|
var/static/list/faction_lookup
|
|
/**
|
|
* all locations by id
|
|
*
|
|
* todo: RSworld_locations (repository)
|
|
*/
|
|
var/static/list/location_lookup
|
|
|
|
/**
|
|
* locations the main map is on
|
|
*/
|
|
var/static/list/active_location_lookup
|
|
/**
|
|
* active faction list
|
|
*/
|
|
var/static/list/active_faction_lookup
|
|
/// what faction is the main map?
|
|
///
|
|
/// while we engineer around a protagonist-agnostic world, this is still the major 'point of view'
|
|
/// that the code algorithmically optimizes around.
|
|
///
|
|
/// this will be the faction storytellers uses to determine chaos / danger, for exmaple.
|
|
var/datum/world_faction/main_faction
|
|
|
|
/datum/controller/subsystem/game_world/Initialize()
|
|
initialize_locations()
|
|
initialize_factions()
|
|
initialize_map()
|
|
return SS_INIT_SUCCESS
|
|
|
|
/datum/controller/subsystem/game_world/proc/initialize_locations()
|
|
location_lookup = list()
|
|
for(var/datum/world_location/path as anything in subtypesof(/datum/world_location))
|
|
if(path == initial(path.abstract_type))
|
|
continue
|
|
var/datum/world_location/instance = new path
|
|
ASSERT(!location_lookup[instance.id])
|
|
location_lookup[instance.id] = instance
|
|
|
|
/datum/controller/subsystem/game_world/proc/initialize_factions()
|
|
faction_lookup = list()
|
|
for(var/datum/world_faction/path as anything in subtypesof(/datum/world_faction))
|
|
if(path == initial(path.abstract_type))
|
|
continue
|
|
var/datum/world_faction/instance = new path
|
|
ASSERT(!faction_lookup[instance.id])
|
|
faction_lookup[instance.id] = instance
|
|
|
|
/datum/controller/subsystem/game_world/proc/initialize_map()
|
|
var/datum/map/station/the_protagonist = SSmapping.loaded_station
|
|
main_faction = faction_lookup[the_protagonist.world_faction_id]
|
|
|
|
active_location_lookup = list()
|
|
for(var/id in the_protagonist.world_location_ids)
|
|
var/datum/world_location/location = location_lookup[id]
|
|
if(!location)
|
|
stack_trace("couldn't find location")
|
|
continue
|
|
active_location_lookup[id] = location
|
|
|
|
active_faction_lookup = list()
|
|
for(var/id in faction_lookup)
|
|
var/datum/world_faction/faction = faction_lookup[id]
|
|
if(!length(faction.location_ids & active_location_lookup))
|
|
continue
|
|
active_faction_lookup[id] = faction
|