mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-07-13 17:14:47 +01:00
Readds map diversity (#48446)
* Restricts map votes * votable * Fix novotes, define, fexist * And one more define
This commit is contained in:
@@ -233,7 +233,7 @@ SUBSYSTEM_DEF(mapping)
|
||||
station_start = world.maxz + 1
|
||||
INIT_ANNOUNCE("Loading [config.map_name]...")
|
||||
LoadGroup(FailedZs, "Station", config.map_path, config.map_file, config.traits, ZTRAITS_STATION)
|
||||
|
||||
|
||||
if(SSdbcore.Connect())
|
||||
var/datum/DBQuery/query_round_map_name = SSdbcore.NewQuery("UPDATE [format_table_name("round")] SET map_name = '[config.map_name]' WHERE id = [GLOB.round_id]")
|
||||
query_round_map_name.Execute()
|
||||
@@ -266,7 +266,7 @@ SUBSYSTEM_DEF(mapping)
|
||||
fdel("_maps/custom/[config.map_file]")
|
||||
// And as the file is now removed set the next map to default.
|
||||
next_map_config = load_map_config(default_to_box = TRUE)
|
||||
|
||||
|
||||
GLOBAL_LIST_EMPTY(the_station_areas)
|
||||
|
||||
/datum/controller/subsystem/mapping/proc/generate_station_area_list()
|
||||
@@ -285,9 +285,8 @@ GLOBAL_LIST_EMPTY(the_station_areas)
|
||||
|
||||
/datum/controller/subsystem/mapping/proc/maprotate()
|
||||
if(map_voted)
|
||||
map_voted = FALSE
|
||||
return
|
||||
|
||||
|
||||
var/players = GLOB.clients.len
|
||||
var/list/mapvotes = list()
|
||||
//count votes
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
#define FILE_ANTAG_REP "data/AntagReputation.json"
|
||||
#define FILE_RECENT_MAPS "data/RecentMaps.json"
|
||||
|
||||
SUBSYSTEM_DEF(persistence)
|
||||
name = "Persistence"
|
||||
@@ -8,6 +9,7 @@ SUBSYSTEM_DEF(persistence)
|
||||
var/list/obj/structure/chisel_message/chisel_messages = list()
|
||||
var/list/saved_messages = list()
|
||||
var/list/saved_modes = list(1,2,3)
|
||||
var/list/saved_maps = list(1,2)
|
||||
var/list/saved_trophies = list()
|
||||
var/list/antag_rep = list()
|
||||
var/list/antag_rep_change = list()
|
||||
@@ -20,6 +22,7 @@ SUBSYSTEM_DEF(persistence)
|
||||
LoadChiselMessages()
|
||||
LoadTrophies()
|
||||
LoadRecentModes()
|
||||
LoadRecentMaps()
|
||||
LoadPhotoPersistence()
|
||||
if(CONFIG_GET(flag/use_antag_rep))
|
||||
LoadAntagReputation()
|
||||
@@ -104,6 +107,15 @@ SUBSYSTEM_DEF(persistence)
|
||||
return
|
||||
saved_modes = json["data"]
|
||||
|
||||
/datum/controller/subsystem/persistence/proc/LoadRecentMaps()
|
||||
var/map_sav = FILE_RECENT_MAPS
|
||||
if(!fexists(FILE_RECENT_MAPS))
|
||||
return
|
||||
var/list/json = json_decode(file2text(map_sav))
|
||||
if(!json)
|
||||
return
|
||||
saved_maps = json["data"]
|
||||
|
||||
/datum/controller/subsystem/persistence/proc/LoadAntagReputation()
|
||||
var/json = file2text(FILE_ANTAG_REP)
|
||||
if(!json)
|
||||
@@ -144,6 +156,7 @@ SUBSYSTEM_DEF(persistence)
|
||||
CollectChiselMessages()
|
||||
CollectTrophies()
|
||||
CollectRoundtype()
|
||||
CollectMaps()
|
||||
SavePhotoPersistence() //THIS IS PERSISTENCE, NOT THE LOGGING PORTION.
|
||||
if(CONFIG_GET(flag/use_antag_rep))
|
||||
CollectAntagReputation()
|
||||
@@ -270,6 +283,15 @@ SUBSYSTEM_DEF(persistence)
|
||||
fdel(json_file)
|
||||
WRITE_FILE(json_file, json_encode(file_data))
|
||||
|
||||
/datum/controller/subsystem/persistence/proc/CollectMaps()
|
||||
saved_maps[2] = saved_maps[1]
|
||||
saved_maps[1] = SSmapping.config.map_name
|
||||
var/json_file = file(FILE_RECENT_MAPS)
|
||||
var/list/file_data = list()
|
||||
file_data["data"] = saved_maps
|
||||
fdel(json_file)
|
||||
WRITE_FILE(json_file, json_encode(file_data))
|
||||
|
||||
/datum/controller/subsystem/persistence/proc/CollectAntagReputation()
|
||||
var/ANTAG_REP_MAXIMUM = CONFIG_GET(number/antag_rep_maximum)
|
||||
|
||||
@@ -301,7 +323,7 @@ SUBSYSTEM_DEF(persistence)
|
||||
loaded = TRUE
|
||||
if(!loaded) //We do not have information for whatever reason, just generate new one
|
||||
R.GenerateRecipe()
|
||||
|
||||
|
||||
if(!R.HasConflicts()) //Might want to try again if conflicts happened in the future.
|
||||
add_chemical_reaction(R)
|
||||
|
||||
@@ -323,6 +345,6 @@ SUBSYSTEM_DEF(persistence)
|
||||
recipe_data["results"] = R.results
|
||||
recipe_data["required_container"] = "[R.required_container]"
|
||||
file_data["[R.id]"] = recipe_data
|
||||
|
||||
|
||||
fdel(json_file)
|
||||
WRITE_FILE(json_file, json_encode(file_data))
|
||||
|
||||
@@ -74,12 +74,12 @@ SUBSYSTEM_DEF(vote)
|
||||
else if(mode == "map")
|
||||
for (var/non_voter_ckey in non_voters)
|
||||
var/client/C = non_voters[non_voter_ckey]
|
||||
if(C.prefs.preferred_map)
|
||||
if(C.prefs.preferred_map && choices[C.prefs.preferred_map]) //No votes if the map isnt in the vote.
|
||||
var/preferred_map = C.prefs.preferred_map
|
||||
choices[preferred_map] += 1
|
||||
greatest_votes = max(greatest_votes, choices[preferred_map])
|
||||
else if(global.config.defaultmap)
|
||||
var/default_map = global.config.defaultmap.map_name
|
||||
else if(config.defaultmap && choices[config.defaultmap]) //No votes if the map isnt in the vote.
|
||||
var/default_map = config.defaultmap.map_name
|
||||
choices[default_map] += 1
|
||||
greatest_votes = max(greatest_votes, choices[default_map])
|
||||
//get all options with that many votes and return them in a list
|
||||
@@ -121,27 +121,27 @@ SUBSYSTEM_DEF(vote)
|
||||
|
||||
/datum/controller/subsystem/vote/proc/result()
|
||||
. = announce_result()
|
||||
var/restart = 0
|
||||
var/restart = FALSE
|
||||
if(.)
|
||||
switch(mode)
|
||||
if("restart")
|
||||
if(. == "Restart Round")
|
||||
restart = 1
|
||||
restart = TRUE
|
||||
if("gamemode")
|
||||
if(GLOB.master_mode != .)
|
||||
SSticker.save_mode(.)
|
||||
if(SSticker.HasRoundStarted())
|
||||
restart = 1
|
||||
restart = TRUE
|
||||
else
|
||||
GLOB.master_mode = .
|
||||
if("map")
|
||||
SSmapping.changemap(global.config.maplist[.])
|
||||
SSmapping.map_voted = TRUE
|
||||
if(restart)
|
||||
var/active_admins = 0
|
||||
var/active_admins = FALSE
|
||||
for(var/client/C in GLOB.admins)
|
||||
if(!C.is_afk() && check_rights_for(C, R_SERVER))
|
||||
active_admins = 1
|
||||
active_admins = TRUE
|
||||
break
|
||||
if(!active_admins)
|
||||
SSticker.Reboot("Restart vote successful.", "restart vote")
|
||||
@@ -154,30 +154,31 @@ SUBSYSTEM_DEF(vote)
|
||||
/datum/controller/subsystem/vote/proc/submit_vote(vote)
|
||||
if(mode)
|
||||
if(CONFIG_GET(flag/no_dead_vote) && usr.stat == DEAD && !usr.client.holder)
|
||||
return 0
|
||||
return FALSE
|
||||
if(!(usr.ckey in voted))
|
||||
if(vote && 1<=vote && vote<=choices.len)
|
||||
voted += usr.ckey
|
||||
choices[choices[vote]]++ //check this
|
||||
return vote
|
||||
return 0
|
||||
return FALSE
|
||||
|
||||
/datum/controller/subsystem/vote/proc/initiate_vote(vote_type, initiator_key)
|
||||
var/admin = FALSE
|
||||
var/ckey = ckey(initiator_key)
|
||||
if(GLOB.admin_datums[ckey])
|
||||
admin = TRUE
|
||||
|
||||
if(!mode)
|
||||
if(started_time)
|
||||
var/next_allowed_time = (started_time + CONFIG_GET(number/vote_delay))
|
||||
if(mode)
|
||||
to_chat(usr, "<span class='warning'>There is already a vote in progress! please wait for it to finish.</span>")
|
||||
return 0
|
||||
return FALSE
|
||||
|
||||
var/admin = FALSE
|
||||
var/ckey = ckey(initiator_key)
|
||||
if(GLOB.admin_datums[ckey])
|
||||
admin = TRUE
|
||||
|
||||
if(next_allowed_time > world.time && !admin)
|
||||
to_chat(usr, "<span class='warning'>A vote was initiated recently, you must wait [DisplayTimeText(next_allowed_time-world.time)] before a new vote can be started!</span>")
|
||||
return 0
|
||||
return FALSE
|
||||
|
||||
reset()
|
||||
switch(vote_type)
|
||||
@@ -186,22 +187,31 @@ SUBSYSTEM_DEF(vote)
|
||||
if("gamemode")
|
||||
choices.Add(config.votable_modes)
|
||||
if("map")
|
||||
for(var/map in global.config.maplist)
|
||||
if(!admin && SSmapping.map_voted)
|
||||
to_chat(usr, "<span class='warning'>The next map has already been selected.</span>")
|
||||
return FALSE
|
||||
for(var/map in config.maplist)
|
||||
var/datum/map_config/VM = config.maplist[map]
|
||||
if(!VM.votable)
|
||||
var/run = 0
|
||||
if(VM.map_name == SSmapping.config.map_name)
|
||||
run++
|
||||
for(var/name in SSpersistence.saved_maps)
|
||||
if(VM.map_name == name)
|
||||
run++
|
||||
if(run >= 2 || !VM.votable) //If run twice in the last three (including current) as of time of writing, disable map for voting.
|
||||
continue
|
||||
choices.Add(VM.map_name)
|
||||
if("custom")
|
||||
question = stripped_input(usr,"What is the vote for?")
|
||||
if(!question)
|
||||
return 0
|
||||
return FALSE
|
||||
for(var/i=1,i<=10,i++)
|
||||
var/option = capitalize(stripped_input(usr,"Please enter an option or hit cancel to finish"))
|
||||
if(!option || mode || !usr.client)
|
||||
break
|
||||
choices.Add(option)
|
||||
else
|
||||
return 0
|
||||
return FALSE
|
||||
mode = vote_type
|
||||
initiator = initiator_key
|
||||
started_time = world.time
|
||||
@@ -220,18 +230,18 @@ SUBSYSTEM_DEF(vote)
|
||||
C.player_details.player_actions += V
|
||||
V.Grant(C.mob)
|
||||
generated_actions += V
|
||||
return 1
|
||||
return 0
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
/datum/controller/subsystem/vote/proc/interface(client/C)
|
||||
if(!C)
|
||||
return
|
||||
var/admin = 0
|
||||
var/trialmin = 0
|
||||
var/admin = FALSE
|
||||
var/trialmin = FALSE
|
||||
if(C.holder)
|
||||
admin = 1
|
||||
admin = TRUE
|
||||
if(check_rights_for(C, R_ADMIN))
|
||||
trialmin = 1
|
||||
trialmin = TRUE
|
||||
voting |= C
|
||||
|
||||
if(mode)
|
||||
@@ -291,11 +301,11 @@ SUBSYSTEM_DEF(vote)
|
||||
if(!usr || !usr.client)
|
||||
return //not necessary but meh...just in-case somebody does something stupid
|
||||
|
||||
var/trialmin = 0
|
||||
var/trialmin = FALSE
|
||||
if(usr.client.holder)
|
||||
if(check_rights_for(usr.client, R_ADMIN))
|
||||
trialmin = 1
|
||||
|
||||
trialmin = TRUE
|
||||
|
||||
switch(href_list["vote"])
|
||||
if("close")
|
||||
voting -= usr.client
|
||||
@@ -357,7 +367,7 @@ SUBSYSTEM_DEF(vote)
|
||||
Remove(owner)
|
||||
|
||||
/datum/action/vote/IsAvailable()
|
||||
return 1
|
||||
return TRUE
|
||||
|
||||
/datum/action/vote/proc/remove_from_client()
|
||||
if(!owner)
|
||||
|
||||
Reference in New Issue
Block a user