Skip to content

Commit

Permalink
Modular Room Sistemi (#436)
Browse files Browse the repository at this point in the history
## Pull Request Hakkında

Singularity enginede sadece engine için yaptığım sistemi modular hale
getirdim, yeni oda eklemek için map dosyasını ve datumu ayarlamanız
yeterli.
## Oyun İçin Neden Gerekli
Mapi direkt olarak editlemeden üstüne oda yazmamızı sağlıyor bu sayede
conflict olmadan map üzerinde değişiklik yapabiliriyoruz.
## Changelog
Oyuncuları ilgilendirmiyor.
  • Loading branch information
Seefaaa authored Jan 29, 2025
2 parents 12774fb + fb59327 commit c96e630
Show file tree
Hide file tree
Showing 10 changed files with 87 additions and 82 deletions.
85 changes: 44 additions & 41 deletions code/controllers/subsystem/mapping.dm
Original file line number Diff line number Diff line change
Expand Up @@ -87,9 +87,10 @@ SUBSYSTEM_DEF(mapping)

var/list/machines_delete_after = list()

var/list/random_engine_templates = list()
var/list/obj/effect/landmark/random_room/random_room_spawners = list()
var/list/datum/map_template/random_room/picked_rooms = list()
var/list/modular_room_templates = list()

var/list/obj/effect/landmark/random_room/modular_room_spawners = list()
var/list/datum/map_template/modular_room/picked_rooms = list()

/datum/controller/subsystem/mapping/PreInit()
..()
Expand Down Expand Up @@ -371,7 +372,7 @@ Used by the AI doomsday and the self-destruct nuke.
multiz_levels = SSmapping.multiz_levels
loaded_lazy_templates = SSmapping.loaded_lazy_templates

random_engine_templates = SSmapping.random_engine_templates
modular_room_templates = SSmapping.modular_room_templates

#define INIT_ANNOUNCE(X) to_chat(world, span_boldannounce("[X]"), MESSAGE_TYPE_DEBUG); log_world(X)

Expand Down Expand Up @@ -449,7 +450,7 @@ Used by the AI doomsday and the self-destruct nuke.
load_station_room_templates()

if(CONFIG_GET(flag/allow_randomized_rooms))
pick_room_type()
pick_room_types()
load_random_rooms()

if(SSdbcore.Connect())
Expand Down Expand Up @@ -973,55 +974,57 @@ ADMIN_VERB(load_away_mission, R_FUN, "Load Away Mission", "Load a specific away
machines_delete_after -= prior_item
QDEL_LIST(machines_delete_after)

/datum/controller/subsystem/mapping/proc/load_random_rooms()
load_random_engines()

/datum/controller/subsystem/mapping/proc/load_station_room_templates()
for(var/item in subtypesof(/datum/map_template/random_room/random_engine))
var/datum/map_template/random_room/random_engine/room_type = item
var/datum/map_template/random_room/random_engine/E = new room_type()
map_templates[E.room_id] = E
if(current_map.map_name == E.station_name)
random_engine_templates[E.room_id] = E
if(E.coordinates.len && E.template_width && E.template_height && !random_room_spawners["engine"])
create_room_spawner(E, "engine")

/datum/controller/subsystem/mapping/proc/create_room_spawner(datum/map_template/random_room/room, roomtype)
for(var/item in subtypesof(/datum/map_template/modular_room))
var/datum/map_template/modular_room/room_type = item
var/datum/map_template/modular_room/R = new room_type()
map_templates[R.room_id] = R
if(current_map.map_name == R.station_name)
modular_room_templates[R.room_type] += list("[R.room_id]" = R)
if(R.coordinates.len && R.template_width && R.template_height && !modular_room_spawners[R.room_type])
create_room_spawner(R, R.room_type)

/datum/controller/subsystem/mapping/proc/create_room_spawner(datum/map_template/modular_room/room, roomtype)
var/turf/target = locate(room.coordinates["x"], room.coordinates["y"], room.coordinates["z"])
var/obj/effect/landmark/random_room/room_spawner = new(target)
room_spawner.room_width = room.template_width
room_spawner.room_height = room.template_height
random_room_spawners[roomtype] = room_spawner
modular_room_spawners[roomtype] = room_spawner
return TRUE

/datum/controller/subsystem/mapping/proc/pick_room_type()
pick_engine(!isnull(current_map.picked_rooms["engine"]))
/datum/controller/subsystem/mapping/proc/pick_room_types()
for(var/roomtype in modular_room_templates)
pick_room(roomtype, !isnull(current_map.picked_rooms[roomtype]))

/datum/controller/subsystem/mapping/proc/pick_engine(force = FALSE)
/datum/controller/subsystem/mapping/proc/pick_room(roomtype, force = FALSE)
if(force)
picked_rooms["engine"] = random_engine_templates[current_map.picked_rooms["engine"]]
picked_rooms[roomtype] = modular_room_templates[roomtype][current_map.picked_rooms[roomtype]]
return TRUE
var/list/possible_engine_templates = list()
var/datum/map_template/random_room/random_engine/engine_candidate
shuffle_inplace(random_engine_templates)
for(var/ID in random_engine_templates)
engine_candidate = random_engine_templates[ID]
if(engine_candidate.weight == 0 || (engine_candidate.mappath && (random_room_spawners["engine"].room_height != engine_candidate.template_height || random_room_spawners["engine"].room_width != engine_candidate.template_width)))
engine_candidate = null
var/list/possible_room_templates = list()
var/datum/map_template/modular_room/room_candidate
shuffle_inplace(modular_room_templates[roomtype])
for(var/ID in modular_room_templates[roomtype])
room_candidate = modular_room_templates[roomtype][ID]
if(room_candidate.weight == 0 || (room_candidate.mappath && (modular_room_spawners[roomtype].room_height != room_candidate.template_height || modular_room_spawners[roomtype].room_width != room_candidate.template_width)))
room_candidate = null
continue
possible_engine_templates[engine_candidate] = engine_candidate.weight
if(!possible_engine_templates.len)
possible_room_templates[room_candidate] = room_candidate.weight
if(!possible_room_templates.len)
return FALSE
picked_rooms["engine"] = pick_weight(possible_engine_templates)
picked_rooms[roomtype] = pick_weight(possible_room_templates)
return TRUE

/datum/controller/subsystem/mapping/proc/load_random_engines()
/datum/controller/subsystem/mapping/proc/load_random_rooms()
for(var/roomtype in picked_rooms)
load_random_room(roomtype)

/datum/controller/subsystem/mapping/proc/load_random_room(roomtype)
var/start_time = REALTIMEOFDAY
if(random_room_spawners["engine"] && picked_rooms["engine"])
log_world("Loading random engine template [picked_rooms["engine"].name] ([picked_rooms["engine"].type]) at [AREACOORD(random_room_spawners["engine"])]")
if(picked_rooms["engine"].mappath)
var/datum/map_template/random_room/template = picked_rooms["engine"]
template.stationinitload(get_turf(random_room_spawners["engine"]), centered = template.centerspawner)
QDEL_NULL(random_room_spawners["engine"])
log_world("Loaded Random Engine in [(REALTIMEOFDAY - start_time)/10]s!")
if(modular_room_spawners[roomtype] && picked_rooms[roomtype])
log_world("Loading [roomtype] template [picked_rooms[roomtype].name] ([picked_rooms[roomtype].type]) at [AREACOORD(modular_room_spawners[roomtype])]")
if(picked_rooms[roomtype].mappath)
var/datum/map_template/modular_room/template = picked_rooms[roomtype]
template.stationinitload(get_turf(modular_room_spawners[roomtype]), centered = template.centerspawner)
QDEL_NULL(modular_room_spawners[roomtype])
log_world("Loaded [roomtype] in [(REALTIMEOFDAY - start_time)/10]s!")
return TRUE
4 changes: 4 additions & 0 deletions code/datums/map_config.dm
Original file line number Diff line number Diff line change
Expand Up @@ -219,6 +219,10 @@
var/list/L = json["room_templates"]
for(var/key in L)
var/value = L[key]
var/path = text2path(value)
if(!ispath(path,/datum/map_template/modular_room)) // Outdated
stack_trace("Invalid path in mapping config for room templates: \[[value]\]")
continue
picked_rooms[key] = value

if ("height_autosetup" in json)
Expand Down
2 changes: 1 addition & 1 deletion code/game/machinery/incident_display.dm
Original file line number Diff line number Diff line change
Expand Up @@ -112,7 +112,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/incident_display/singularity_death, 3
..()
register_context()
if(mapload && sign_features == DISPLAY_DELAM && SSmapping.picked_rooms["engine"])
var/datum/map_template/random_room/random_engine/engine_template = SSmapping.picked_rooms["engine"]
var/datum/map_template/modular_room/random_engine/engine_template = SSmapping.picked_rooms["engine"]
if(engine_template.engine_type == "singularity")
name = NAME_SINGULARITY
desc = DESC_SINGULARITY
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@
new /obj/item/storage/box/skillchips/engineering(src)
new /obj/item/storage/box/stickers/chief_engineer(src)
if(SSmapping.picked_rooms["engine"])
var/datum/map_template/random_room/random_engine/engine_template = SSmapping.picked_rooms["engine"]
var/datum/map_template/modular_room/random_engine/engine_template = SSmapping.picked_rooms["engine"]
if(engine_template.engine_type == "singularity")
new /obj/item/storage/toolbox/guncase/anomaly_catcher(src)

Expand Down
34 changes: 18 additions & 16 deletions code/modules/admin/verbs/maprotation.dm
Original file line number Diff line number Diff line change
Expand Up @@ -123,24 +123,26 @@ ADMIN_VERB(admin_change_map_templates, R_SERVER, "Change Map Templates", "Set th
var/datum/map_config/next_map = SSmap_vote.next_map_config
var/list/json_value = safe_json_decode(file2text(PATH_TO_NEXT_MAP_JSON))
var/changed_something = FALSE
var/change_engine = tgui_alert(user,"Do you want to modify the engine?", "Map Engine", list("Yes", "No"))
if(change_engine == "Yes")
var/list/engine_list = list()
for(var/datum/map_template/random_room/random_engine/engine_template as anything in subtypesof(/datum/map_template/random_room/random_engine))
if(engine_template.station_name != next_map.map_name)
continue
engine_list[engine_template.name] = engine_template.room_id
if(engine_list.len < 2)
to_chat(user, span_warning("Next map doesnt have engine options."))
return
var/engine = tgui_input_list(user, "Change Map Engine", "Select the engine for next map", sort_list(engine_list)|"Random")
if(engine != "Random")
next_map.picked_rooms["engine"] = engine_list[engine]
var/list/next_map_room_templates = list()
for(var/datum/map_template/modular_room/item as anything in subtypesof(/datum/map_template/modular_room))
if(item.station_name != next_map.map_name || isnull(item.room_type))
continue
next_map_room_templates[item.room_type] += list("[item.room_id]" = item)
for(var/roomtype in next_map_room_templates)
if(length(next_map_room_templates[roomtype]) < 2)
continue
var/change_room = tgui_alert(user,"Do you want to modify the [roomtype]?", "Map Rooms", list("Yes", "No"))
if(change_room != "Yes")
continue
var/list/template_list = next_map_room_templates[roomtype]
var/selected_room = tgui_input_list(user, "Change Room Template", "Select", sort_list(template_list)|"Random")
if(selected_room != "Random")
next_map.picked_rooms[roomtype] = template_list[selected_room]
else
next_map.picked_rooms["engine"] = null
next_map.picked_rooms[roomtype] = null
changed_something = TRUE
message_admins("[key_name_admin(user)] has changed the next map's engine to [engine]")
log_admin("[key_name(user)] has changed the next map's engine to [engine]")
message_admins("[key_name_admin(user)] has changed the next map's [roomtype] to [selected_room]")
log_admin("[key_name(user)] has changed the next map's [roomtype] to [selected_room]")
if(!changed_something)
return
json_value["room_templates"] = next_map.picked_rooms
Expand Down
10 changes: 10 additions & 0 deletions code/modules/mapping/modular_rooms/_modular_rooms.dm
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
/datum/map_template/modular_room
var/room_id //The SSmapping random_room_template list is ordered by this var
var/spawned //Whether this template (on the random_room template list) has been spawned
var/station_name //Matches this template with that right station
var/centerspawner = TRUE
var/template_height = 0
var/template_width = 0
var/weight = 10 //weight a room has to appear
var/list/coordinates = list()
var/room_type = null
Original file line number Diff line number Diff line change
@@ -1,23 +1,11 @@
/datum/map_template/random_room
var/room_id //The SSmapping random_room_template list is ordered by this var
var/spawned //Whether this template (on the random_room template list) has been spawned
var/station_name //Matches this template with that right station
var/centerspawner = TRUE
var/template_height = 0
var/template_width = 0
var/weight = 10 //weight a room has to appear
var/list/coordinates = list()
var/room_type = null

/datum/map_template/random_room/random_engine
/datum/map_template/modular_room/random_engine
room_type = "engine"
var/engine_type = null

/datum/map_template/random_room/random_engine/meta_supermatter
/datum/map_template/modular_room/random_engine/meta_supermatter
name = "Meta Supermatter"
room_id = "meta_supermatter"
centerspawner = FALSE
weight = 8
station_name = "MetaStation"
should_place_on_top = FALSE
coordinates = list(
Expand All @@ -27,14 +15,13 @@
)
engine_type = "supermatter"

/datum/map_template/random_room/random_engine/meta_singularity
/datum/map_template/modular_room/random_engine/meta_singularity
name = "Meta Singularity"
room_id = "meta_singularity"
mappath = "_maps/RandomRooms/MetaStation/singularity.dmm"
mappath = "_maps/ModularRooms/MetaStation/singularity.dmm"
centerspawner = FALSE
template_height = 25
template_width = 33
weight = 8
station_name = "MetaStation"
should_place_on_top = FALSE
coordinates = list(
Expand All @@ -44,11 +31,10 @@
)
engine_type = "singularity"

/datum/map_template/random_room/random_engine/delta_supermatter
/datum/map_template/modular_room/random_engine/delta_supermatter
name = "Delta Supermatter"
room_id = "delta_supermatter"
centerspawner = FALSE
weight = 8
station_name = "Delta Station"
should_place_on_top = FALSE
coordinates = list(
Expand All @@ -58,14 +44,13 @@
)
engine_type = "supermatter"

/datum/map_template/random_room/random_engine/delta_singularity
/datum/map_template/modular_room/random_engine/delta_singularity
name = "Delta Singularity"
room_id = "delta_singularity"
mappath = "_maps/RandomRooms/Deltastation/singularity.dmm"
mappath = "_maps/ModularRooms/Deltastation/singularity.dmm"
centerspawner = FALSE
template_height = 31
template_width = 23
weight = 8
station_name = "Delta Station"
should_place_on_top = FALSE
coordinates = list(
Expand Down
3 changes: 2 additions & 1 deletion tgstation.dme
Original file line number Diff line number Diff line change
Expand Up @@ -4770,12 +4770,13 @@
#include "code\modules\mapping\mapping_helpers.dm"
#include "code\modules\mapping\merge_conflicts.dm"
#include "code\modules\mapping\preloader.dm"
#include "code\modules\mapping\random_engines.dm"
#include "code\modules\mapping\reader.dm"
#include "code\modules\mapping\ruins.dm"
#include "code\modules\mapping\verify.dm"
#include "code\modules\mapping\map_specific_code\Tramstation.dm"
#include "code\modules\mapping\modular_map_loader\modular_map_loader.dm"
#include "code\modules\mapping\modular_rooms\_modular_rooms.dm"
#include "code\modules\mapping\modular_rooms\engine.dm"
#include "code\modules\mapping\space_management\multiz_helpers.dm"
#include "code\modules\mapping\space_management\space_level.dm"
#include "code\modules\mapping\space_management\space_reservation.dm"
Expand Down

0 comments on commit c96e630

Please sign in to comment.