diff --git a/code/controllers/subsystem/minimap.dm b/code/controllers/subsystem/minimap.dm
index 421d9ba312..d651cabd49 100644
--- a/code/controllers/subsystem/minimap.dm
+++ b/code/controllers/subsystem/minimap.dm
@@ -13,25 +13,55 @@ var/datum/subsystem/minimap/SSminimap
NEW_SS_GLOBAL(SSminimap)
/datum/subsystem/minimap/Initialize(timeofday)
- if(!config.generate_minimaps)
- world << "Minimap generation disabled... Skipping"
- return
var/hash = md5(file2text("_maps/[MAP_PATH]/[MAP_FILE]"))
- if(hash == trim(file2text(hash_path())))
- return ..()
-
- for(var/z in z_levels)
- generate(z)
- register_asset("minimap_[z].png", fcopy_rsc(map_path(z)))
- fdel(hash_path())
- text2file(hash, hash_path())
+ if(config.generate_minimaps)
+ if(hash == trim(file2text(hash_path())))
+ for(var/z in z_levels) //We have these files cached, let's register them
+ register_asset("minimap_[z].png", fcopy_rsc(map_path(z)))
+ return ..()
+ for(var/z in z_levels)
+ generate(z)
+ register_asset("minimap_[z].png", fcopy_rsc(map_path(z)))
+ fdel(hash_path())
+ text2file(hash, hash_path())
+ else
+ world << "Minimap generation disabled. Loading from cache..."
+ var/fileloc = 0
+ if(check_files(0)) //Let's first check if we have maps cached in the data folder. NOTE: This will override the backup files even if this map is older.
+ world.log << "cache"
+ if(hash != trim(file2text(hash_path())))
+ world << "Loaded cached minimap is outdated. There may be minor discrepancies in layout." //Disclaimer against players saying map is wrong.
+ fileloc = 0
+ else
+ if(!check_files(1))
+ world << "Failed to load backup minimap file. Aborting." //We couldn't find something. Bail to prevent issues with null files
+ return
+ fileloc = 1 //No map image cached with the current map, and we have a backup. Let's fall back to it.
+ world << "No cached minimaps detected. Backup files loaded."
+ for(var/z in z_levels)
+ register_asset("minimap_[z].png", fcopy_rsc(map_path(z,fileloc)))
..()
-/datum/subsystem/minimap/proc/hash_path()
- return "data/minimaps/[MAP_NAME].md5"
+/datum/subsystem/minimap/proc/check_files(backup) // If the backup argument is true, looks in the icons folder. If false looks in the data folder.
+ for(var/z in z_levels)
+ if(!fexists(file(map_path(z,backup)))) //Let's make sure we have a file for this map
+ if(backup)
+ world.log << "Failed to find backup file for map [MAP_NAME] on zlevel [z]."
+ return FALSE
+ return TRUE
-/datum/subsystem/minimap/proc/map_path(z)
- return "data/minimaps/[MAP_NAME]_[z].png"
+
+/datum/subsystem/minimap/proc/hash_path(backup)
+ if(backup)
+ return "icons/minimaps/[MAP_NAME].md5"
+ else
+ return "data/minimaps/[MAP_NAME].md5"
+
+/datum/subsystem/minimap/proc/map_path(z,backup)
+ if(backup)
+ return "icons/minimaps/[MAP_NAME]_[z].png"
+ else
+ return "data/minimaps/[MAP_NAME]_[z].png"
/datum/subsystem/minimap/proc/send(client/client)
for(var/z in z_levels)
@@ -43,24 +73,10 @@ var/datum/subsystem/minimap/SSminimap
// Scale it up to our target size.
minimap.Scale(MINIMAP_SIZE, MINIMAP_SIZE)
- var/counter = 512
// Loop over turfs and generate icons.
for(var/T in block(locate(x1, y1, z), locate(x2, y2, z)))
generate_tile(T, minimap)
- //byond bug, this fixes OOM crashes by flattening and reseting the minimap icon holder every so and so tiles
- counter--
- if(counter <= 0)
- counter = 512
- var/icon/flatten = new /icon()
- flatten.Insert(minimap, "", SOUTH, 1, 0)
- del(minimap)
- minimap = flatten
- stoplag() //we have to sleep in order to get byond to clear out the proc's garbage bin
-
- CHECK_TICK
-
-
// Create a new icon and insert the generated minimap, so that BYOND doesn't generate different directions.
var/icon/final = new /icon()
final.Insert(minimap, "", SOUTH, 1, 0)
@@ -69,7 +85,7 @@ var/datum/subsystem/minimap/SSminimap
/datum/subsystem/minimap/proc/generate_tile(turf/tile, icon/minimap)
var/icon/tile_icon
var/obj/obj
- var/list/obj_icons = list()
+ var/list/obj_icons
// Don't use icons for space, just add objects in space if they exist.
if(istype(tile, /turf/open/space))
obj = locate(/obj/structure/lattice/catwalk) in tile
@@ -86,18 +102,20 @@ var/datum/subsystem/minimap/SSminimap
tile_icon = new /icon('icons/obj/atmospherics/pipes/transit_tube.dmi', obj.icon_state, obj.dir)
else
tile_icon = new /icon(tile.icon, tile.icon_state, tile.dir)
- obj_icons.Cut()
+ obj_icons = list()
obj = locate(/obj/structure) in tile
if(obj)
- obj_icons += getFlatIcon(obj)
+ obj_icons += new /icon(obj.icon, obj.icon_state, obj.dir, 1, 0)
obj = locate(/obj/machinery) in tile
if(obj)
obj_icons += new /icon(obj.icon, obj.icon_state, obj.dir, 1, 0)
obj = locate(/obj/structure/window) in tile
if(obj)
obj_icons += new /icon('icons/obj/smooth_structures/window.dmi', "window", SOUTH)
-
+ obj = locate(/obj/structure/table) in tile
+ if(obj)
+ obj_icons += new /icon('icons/obj/smooth_structures/table.dmi', "table", SOUTH)
for(var/I in obj_icons)
var/icon/obj_icon = I
tile_icon.Blend(obj_icon, ICON_OVERLAY)
@@ -107,4 +125,3 @@ var/datum/subsystem/minimap/SSminimap
tile_icon.Scale(TILE_SIZE, TILE_SIZE)
// Add the tile to the minimap.
minimap.Blend(tile_icon, ICON_OVERLAY, ((tile.x - 1) * TILE_SIZE), ((tile.y - 1) * TILE_SIZE))
- del(tile_icon)
diff --git a/code/game/gamemodes/blob/blob.dm b/code/game/gamemodes/blob/blob.dm
index 3524f3df82..ae7dd37b29 100644
--- a/code/game/gamemodes/blob/blob.dm
+++ b/code/game/gamemodes/blob/blob.dm
@@ -14,7 +14,7 @@ var/list/blobs_legit = list() //used for win-score calculations, contains only b
config_tag = "blob"
antag_flag = ROLE_BLOB
- required_players = 15
+ required_players = 10
required_enemies = 1
recommended_enemies = 1
diff --git a/code/game/gamemodes/changeling/changeling.dm b/code/game/gamemodes/changeling/changeling.dm
index 45c8bc2d3d..d2c4827f37 100644
--- a/code/game/gamemodes/changeling/changeling.dm
+++ b/code/game/gamemodes/changeling/changeling.dm
@@ -18,9 +18,9 @@ var/list/slot2type = list("head" = /obj/item/clothing/head/changeling, "wear_mas
antag_flag = ROLE_CHANGELING
restricted_jobs = list("AI", "Cyborg")
protected_jobs = list("Security Officer", "Warden", "Detective", "Head of Security", "Captain")
- required_players = 15
+ required_players = 10
required_enemies = 1
- recommended_enemies = 4
+ recommended_enemies = 1
reroll_friendly = 1
diff --git a/code/game/gamemodes/clock_cult/clock_cult.dm b/code/game/gamemodes/clock_cult/clock_cult.dm
index c62d892ee4..a5b3db633f 100644
--- a/code/game/gamemodes/clock_cult/clock_cult.dm
+++ b/code/game/gamemodes/clock_cult/clock_cult.dm
@@ -156,9 +156,9 @@ This file's folder contains:
name = "clockwork cult"
config_tag = "clockwork_cult"
antag_flag = ROLE_SERVANT_OF_RATVAR
- required_players = 15
+ required_players = 10
required_enemies = 2
- recommended_enemies = 4
+ recommended_enemies = 2
enemy_minimum_age = 14
protected_jobs = list("AI", "Cyborg", "Security Officer", "Warden", "Detective", "Head of Security", "Captain") //Silicons can eventually be converted
restricted_jobs = list("Chaplain", "Captain")
diff --git a/code/game/gamemodes/cult/cult.dm b/code/game/gamemodes/cult/cult.dm
index 7bbc6a44a9..a3b5fbb363 100644
--- a/code/game/gamemodes/cult/cult.dm
+++ b/code/game/gamemodes/cult/cult.dm
@@ -41,9 +41,9 @@
antag_flag = ROLE_CULTIST
restricted_jobs = list("Chaplain","AI", "Cyborg", "Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Head of Personnel")
protected_jobs = list()
- required_players = 20
- required_enemies = 4
- recommended_enemies = 4
+ required_players = 10
+ required_enemies = 2
+ recommended_enemies = 2
enemy_minimum_age = 14
var/finished = 0
diff --git a/code/game/gamemodes/gang/gang.dm b/code/game/gamemodes/gang/gang.dm
index 75459b7269..38226cf69b 100644
--- a/code/game/gamemodes/gang/gang.dm
+++ b/code/game/gamemodes/gang/gang.dm
@@ -24,7 +24,7 @@ var/list/gang_colors_pool = list("red","orange","yellow","green","blue","purple"
config_tag = "gang"
antag_flag = ROLE_GANG
restricted_jobs = list("Security Officer", "Warden", "Detective", "AI", "Cyborg","Captain", "Head of Personnel", "Head of Security", "Chief Engineer", "Research Director", "Chief Medical Officer")
- required_players = 20
+ required_players = 10
required_enemies = 2
recommended_enemies = 2
enemy_minimum_age = 14
diff --git a/code/game/gamemodes/handofgod/_handofgod.dm b/code/game/gamemodes/handofgod/_handofgod.dm
index f87db8be6f..83cef66a18 100644
--- a/code/game/gamemodes/handofgod/_handofgod.dm
+++ b/code/game/gamemodes/handofgod/_handofgod.dm
@@ -24,9 +24,9 @@ var/global/list/global_handofgod_structuretypes = list()
config_tag = "handofgod"
antag_flag = ROLE_HOG_CULTIST //Followers use ROLE_HOG_CULTIST, Gods are picked later on with ROLE_HOG_GOD
- required_players = 15
- required_enemies = 8
- recommended_enemies = 8
+ required_players = 10
+ required_enemies = 3
+ recommended_enemies = 3
restricted_jobs = list("Chaplain","AI", "Cyborg", "Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Head of Personnel")
diff --git a/code/game/gamemodes/nuclear/nuclear.dm b/code/game/gamemodes/nuclear/nuclear.dm
index c8c8eea898..60d9fefd1a 100644
--- a/code/game/gamemodes/nuclear/nuclear.dm
+++ b/code/game/gamemodes/nuclear/nuclear.dm
@@ -5,9 +5,9 @@
/datum/game_mode/nuclear
name = "nuclear emergency"
config_tag = "nuclear"
- required_players = 30 // 30 players - 3 players to be the nuke ops = 27 players remaining
+ required_players = 15 // 30 players - 3 players to be the nuke ops = 27 players remaining
required_enemies = 2
- recommended_enemies = 5
+ recommended_enemies = 2
antag_flag = ROLE_OPERATIVE
enemy_minimum_age = 14
var/const/agents_possible = 5 //If we ever need more syndicate agents.
diff --git a/code/game/gamemodes/revolution/revolution.dm b/code/game/gamemodes/revolution/revolution.dm
index 57b18d73af..8bdcf01af8 100644
--- a/code/game/gamemodes/revolution/revolution.dm
+++ b/code/game/gamemodes/revolution/revolution.dm
@@ -15,9 +15,9 @@
config_tag = "revolution"
antag_flag = ROLE_REV
restricted_jobs = list("Security Officer", "Warden", "Detective", "AI", "Cyborg","Captain", "Head of Personnel", "Head of Security", "Chief Engineer", "Research Director", "Chief Medical Officer")
- required_players = 20
+ required_players = 10
required_enemies = 1
- recommended_enemies = 3
+ recommended_enemies = 2
enemy_minimum_age = 14
var/finished = 0
diff --git a/code/game/gamemodes/wizard/raginmages.dm b/code/game/gamemodes/wizard/raginmages.dm
index 85c8290802..c9ec12d06d 100644
--- a/code/game/gamemodes/wizard/raginmages.dm
+++ b/code/game/gamemodes/wizard/raginmages.dm
@@ -1,7 +1,7 @@
/datum/game_mode/wizard/raginmages
name = "ragin' mages"
config_tag = "raginmages"
- required_players = 15
+ required_players = 10
use_huds = 1
var/max_mages = 0
var/making_mage = 0