mirror of
https://github.com/CHOMPStation2/CHOMPStation2.git
synced 2025-12-11 10:43:20 +00:00
All /world/ stuff that I've found is now in code/world.dm instead of being scattered throughout the code in 6-7 files. *****IMPORTANT***** This means that hub.dm is now part of world.dm. Server hosts using the hub will likely have to redo the hub/password variables! Again, that stuff is now located in code/world.dm ******************* The tester list has been removed as it is not in use. /code/defines - Moved atom.dm code into /code/game/atom.dm and atom_movable.dm - Moved hub.dm code into /code/world.dm - Moved the /defines/tanning into objects/item/sheets/leather.dm - Moved /defines/area/ into game/area/ - Moved turf.dm code into the code/game/turfs folder and divided it up into meaningful places A lot of the files in /code/game were placed in new areas since they really didn't have a reason to be there. - algorithm.dm: - - The world stuff is in world.dm. - - countJob() and AutoUpdateTK() were removed entirely (unused). - - AutoUpdateAI() is now in /mob/living/silicon/ai.dm - atom_procs.dm was split into atom.dm and atom_movable.dm - cellautomata.dm - - World stuff was moved into world.dm - - Atom stuff was moved into atom.dm and atom_movable.dm - - Atom verbs were moved into code/game/verbs/atom_verbs.dm - chemistry.dm - - Beaker box code was moved into storage/misc.dm - - The trash can and 'alechemy' paper were removed. (unused) - Landmarks.dm was moved into /objects/effects/landmarks.dm - prisonshuttle.dm, specops_shuttle.dm, syndicate_shuttle.dm and syndicate_specops_shuttle.dm have been moved into game/machinery/computer/ - status.dm and topic.dm code were moved into world.dm - step_triggers.dm are now in objects/effects/step_triggers.dm - throwing.dm was split into appropriate files (carbon mob code, atom_movable.dm, ect) - vote.dm is now in code/datums /code/game/asteroid was split up. - turf.dm was moved into game/turfs/simulated/asteroid.dm - artifacts were split up - - Wish granter is now in game/machinery - - The stealth box is gone (unused) - - The list of 'space suprises' was moved into astroid.dm - asteroid.dm, being the only file left, was moved into /code/game and finally... modules/mob/organs files are now in code/datums/organs git-svn-id: http://tgstation13.googlecode.com/svn/trunk@4659 316c924e-a436-60f5-8080-3fe189b3f50e
436 lines
11 KiB
Plaintext
436 lines
11 KiB
Plaintext
/datum/vote/New()
|
|
|
|
nextvotetime = world.timeofday // + 10*config.vote_delay
|
|
|
|
|
|
/datum/vote/proc/canvote()//marker1
|
|
var/excess = world.timeofday - vote.nextvotetime
|
|
|
|
if(excess < -10000) // handle clock-wrapping problems - very long delay (>20 hrs) if wrapped
|
|
vote.nextvotetime = world.timeofday
|
|
return 1
|
|
return (excess >= 0)
|
|
|
|
/datum/vote/proc/nextwait()
|
|
return timetext( round( (nextvotetime - world.timeofday)/10) )
|
|
|
|
/datum/vote/proc/endwait()
|
|
return timetext( round( (votetime - world.timeofday)/10) )
|
|
|
|
/datum/vote/proc/timetext(var/interval)
|
|
var/minutes = round(interval / 60)
|
|
var/seconds = round(interval % 60)
|
|
|
|
var/tmin = "[minutes>0?num2text(minutes)+"min":null]"
|
|
var/tsec = "[seconds>0?num2text(seconds)+"sec":null]"
|
|
|
|
if(tmin && tsec) // hack to skip inter-space if either field is blank
|
|
return "[tmin] [tsec]"
|
|
else
|
|
if(!tmin && !tsec) // return '0sec' if 0 time left
|
|
return "0sec"
|
|
return "[tmin][tsec]"
|
|
|
|
/datum/vote/proc/getvotes()
|
|
var/list/L = list()
|
|
for(var/mob/M in player_list)
|
|
if(M.client && M.client.inactivity < 1200) // clients inactive for 2 minutes don't count
|
|
L[M.client.vote] += 1
|
|
|
|
return L
|
|
|
|
|
|
/datum/vote/proc/endvote()
|
|
|
|
if(!voting) // means that voting was aborted by an admin
|
|
return
|
|
|
|
world << "\red <B>***Voting has closed.</B>"
|
|
|
|
log_vote("Voting closed, result was [winner]")
|
|
voting = 0
|
|
nextvotetime = world.timeofday + 10*config.vote_delay
|
|
|
|
for(var/mob/M in player_list) // clear vote window from all clients
|
|
if(M.client)
|
|
M << browse(null, "window=vote")
|
|
M.client.showvote = 0
|
|
|
|
calcwin()
|
|
|
|
if(mode)
|
|
if(!ticker)
|
|
if(!going)
|
|
world << "<B>The game will start soon.</B>"
|
|
going = 1
|
|
var/wintext = capitalize(winner)
|
|
if(winner=="default")
|
|
world << "Result is \red No change."
|
|
return
|
|
|
|
// otherwise change mode
|
|
|
|
|
|
world << "Result is change to \red [wintext]"
|
|
world.save_mode(winner)
|
|
|
|
if(ticker && ticker.mode)
|
|
world <<"\red <B>World will reboot in 10 seconds</B>"
|
|
|
|
feedback_set_details("end_error","mode vote - [winner]")
|
|
|
|
if(blackbox)
|
|
blackbox.save_all_data_to_sql()
|
|
|
|
sleep(100)
|
|
log_game("Rebooting due to mode vote")
|
|
world.Reboot()
|
|
else
|
|
master_mode = winner
|
|
|
|
else
|
|
|
|
if(winner=="default")
|
|
world << "Result is \red No restart."
|
|
return
|
|
|
|
world << "Result is \red Restart round."
|
|
|
|
world <<"\red <B>World will reboot in 5 seconds</B>"
|
|
|
|
feedback_set_details("end_error","restart vote")
|
|
|
|
if(blackbox)
|
|
blackbox.save_all_data_to_sql()
|
|
|
|
sleep(50)
|
|
log_game("Rebooting due to restart vote")
|
|
world.Reboot()
|
|
return
|
|
|
|
|
|
/datum/vote/proc/calcwin()
|
|
|
|
var/list/votes = getvotes()
|
|
|
|
if(vote.mode)
|
|
var/best = -1
|
|
|
|
for(var/v in votes)
|
|
if(v=="none")
|
|
continue
|
|
if(best < votes[v])
|
|
best = votes[v]
|
|
|
|
|
|
var/list/winners = list()
|
|
|
|
for(var/v in votes)
|
|
if(votes[v] == best)
|
|
winners += v
|
|
|
|
var/ret = ""
|
|
|
|
|
|
for(var/w in winners)
|
|
if(lentext(ret) > 0)
|
|
ret += "/"
|
|
if(w=="default")
|
|
winners = list("default")
|
|
ret = "No change"
|
|
break
|
|
else
|
|
ret += capitalize(w)
|
|
|
|
|
|
|
|
if(winners.len != 1)
|
|
ret = "Tie: " + ret
|
|
|
|
|
|
if(winners.len == 0)
|
|
vote.winner = "default"
|
|
ret = "No change"
|
|
else
|
|
vote.winner = pick(winners)
|
|
|
|
return ret
|
|
else
|
|
|
|
if(votes["default"] < votes["restart"])
|
|
|
|
vote.winner = "restart"
|
|
return "Restart"
|
|
else
|
|
vote.winner = "default"
|
|
return "No restart"
|
|
|
|
|
|
/mob/verb/vote()
|
|
set category = "OOC"
|
|
set name = "Vote"
|
|
usr.client.showvote = 1
|
|
|
|
|
|
var/text = "<HTML><HEAD><TITLE>Voting</TITLE></HEAD><BODY scroll=no>"
|
|
|
|
var/footer = "<HR><A href='?src=\ref[vote];vclose=1'>Close</A></BODY></HTML>"
|
|
|
|
|
|
if(config.vote_no_dead && usr.stat == 2)
|
|
text += "Voting while dead has been disallowed."
|
|
text += footer
|
|
usr << browse(text, "window=vote")
|
|
usr.client.showvote = 0
|
|
usr.client.vote = "none"
|
|
return
|
|
|
|
if(vote.voting)
|
|
// vote in progress, do the current
|
|
|
|
text += "Vote to [vote.mode?"change mode":"restart round"] in progress.<BR>"
|
|
text += "[vote.endwait()] until voting is closed.<BR>"
|
|
|
|
var/list/votes = vote.getvotes()
|
|
|
|
if(vote.mode) // true if changing mode
|
|
|
|
text += "Current game mode is: <B>[master_mode]</B>.<BR>Select the mode to change to:<UL>"
|
|
|
|
for(var/md in config.votable_modes)
|
|
var/disp = capitalize(md)
|
|
if(md=="default")
|
|
disp = "No change"
|
|
|
|
//world << "[md]|[disp]|[src.client.vote]|[votes[md]]"
|
|
|
|
if(src.client.vote == md)
|
|
text += "<LI><B>[disp]</B>"
|
|
else
|
|
text += "<LI><A href='?src=\ref[vote];vote=[md]'>[disp]</A>"
|
|
|
|
text += "[votes[md]>0?" - [votes[md]] vote\s":null]<BR>"
|
|
|
|
text += "</UL>"
|
|
|
|
text +="<p>Current winner: <B>[vote.calcwin()]</B><BR>"
|
|
|
|
text += footer
|
|
|
|
usr << browse(text, "window=vote")
|
|
|
|
else // voting to restart
|
|
text += "Vote to call crew transfer shuttle round in progress.<BR>"
|
|
text += "[vote.endwait()] until voting is closed.<BR>"
|
|
|
|
if(vote.instant_restart)
|
|
text += "Restart the world? <B><font color='red'>ONLY PRESS THIS IF THERE'S A ROUND-BREAKING GLITCH.</font></B><BR>"
|
|
else
|
|
text += "Call the Crew Transfer Shuttle?<BR>"
|
|
|
|
text += "<B><font color=red>*** Please make sure to only vote 'no' if you yourself are currently enjoying the round. If you find the round to have gone stale, you should always vote 'yes', regardless of how others are feeling about the round.</font></B><BR><UL>"
|
|
|
|
var/list/VL = list("default","restart")
|
|
|
|
for(var/md in VL)
|
|
var/disp = (md=="default"? "No":"Yes")
|
|
|
|
if(src.client.vote == md)
|
|
text += "<LI><B>[disp]</B>"
|
|
else
|
|
text += "<LI><A href='?src=\ref[vote];vote=[md]'>[disp]</A>"
|
|
|
|
text += "[votes[md]>0?" - [votes[md]] vote\s":null]<BR>"
|
|
|
|
text += "</UL>"
|
|
|
|
text +="<p>Current winner: <B>[vote.calcwin()]</B><BR>"
|
|
|
|
text += footer
|
|
|
|
usr << browse(text, "window=vote")
|
|
|
|
|
|
else //no vote in progress
|
|
|
|
if(shuttlecoming == 1)
|
|
usr << "\blue Cannot start Vote - Shuttle has been called."
|
|
return
|
|
|
|
if(!config.allow_vote_restart && !config.allow_vote_mode)
|
|
text += "<P>Player voting is disabled.</BODY></HTML>"
|
|
|
|
usr << browse(text, "window=vote")
|
|
usr.client.showvote = 0
|
|
return
|
|
|
|
if(!vote.canvote()) // not time to vote yet
|
|
if(config.allow_vote_restart) text+="Voting to restart is enabled.<BR>"
|
|
if(config.allow_vote_mode)
|
|
if(ticker.current_state == 1) text+="Voting to change mode is enabled.<BR>"
|
|
else text += "Change mode votes are disabled while a round is in progress, vote to restart first.<BR>"
|
|
|
|
text+="<BR><P>Next vote can begin in [vote.nextwait()]."
|
|
text+=footer
|
|
|
|
usr << browse(text, "window=vote")
|
|
|
|
else // voting can begin
|
|
if(config.allow_vote_restart)
|
|
text += "<A href='?src=\ref[vote];vmode=1'>Begin restart vote.</A><BR>"
|
|
if(config.allow_vote_mode)
|
|
if(!ticker || ticker.current_state == 1)
|
|
text += "<A href='?src=\ref[vote];vmode=2'>Begin change mode vote.</A><BR>"
|
|
else
|
|
text += "Change mode votes are disabled while a round is in progress, vote to restart first.<BR>"
|
|
if(src.client.holder) //Strumpetplaya Add - Custom Votes for Admins
|
|
text += "<A href='?src=\ref[vote];vmode=3'>Begin custom vote.</A><BR>"
|
|
text += footer
|
|
usr << browse(text, "window=vote")
|
|
|
|
spawn(20)
|
|
if(usr.client && usr.client.showvote && !vote.enteringchoices)
|
|
usr.vote()
|
|
else
|
|
usr << browse(null, "window=vote")
|
|
|
|
return
|
|
|
|
|
|
/datum/vote/Topic(href, href_list)
|
|
..()
|
|
//world << "[usr] has activated the vote Topic"
|
|
|
|
if(href_list["voter"])
|
|
world << "[usr.ckey] has attempted to bypass the voting system." //ckey is easy key
|
|
return
|
|
|
|
if(href_list["vclose"])
|
|
|
|
if(usr)
|
|
usr << browse(null, "window=vote")
|
|
usr.client.showvote = 0
|
|
return
|
|
|
|
if(href_list["vmode"])
|
|
if(vote.voting)
|
|
return
|
|
|
|
if(!vote.canvote() ) // double check even though this shouldn't happen
|
|
return
|
|
|
|
vote.mode = text2num(href_list["vmode"])-1 // hack to yield 0=restart, 1=changemode, 2=admincustom
|
|
|
|
if(vote.mode == 2)
|
|
vote.enteringchoices = 1
|
|
vote.voting = 1
|
|
vote.customname = input(usr, "What are you voting for?", "Custom Vote") as text
|
|
if(!vote.customname)
|
|
vote.enteringchoices = 0
|
|
vote.voting = 0
|
|
return
|
|
|
|
var/N = input(usr, "How many options does this vote have?", "Custom Vote", 0) as num
|
|
if(!N)
|
|
vote.enteringchoices = 0
|
|
vote.voting = 0
|
|
return
|
|
//world << "You're voting for [N] options!"
|
|
var/i
|
|
vote.choices = list()
|
|
for(i=1; i<=N; i++)
|
|
var/addvote = input(usr, "What is option #[i]?", "Enter Option #[i]") as text
|
|
vote.choices += addvote
|
|
//for(var/O in vote.choices)
|
|
//world << "[O]"
|
|
vote.enteringchoices = 0
|
|
vote.votetime = world.timeofday + config.vote_period*10 // when the vote will end
|
|
|
|
spawn(config.vote_period * 10)
|
|
vote.endvote()
|
|
|
|
world << "\red<B>*** A custom vote has been initiated by [usr.key].</B>"
|
|
world << "\red You have [vote.timetext(config.vote_period)] to vote."
|
|
log_vote("A custom vote has been started by [usr.key]")
|
|
|
|
//log_vote("Voting to [vote.mode ? "change mode" : "restart round"] started by [M.name]/[M.key]")
|
|
|
|
for(var/client/C)
|
|
if(config.vote_no_default || (config.vote_no_dead && C.mob.stat == 2))
|
|
C.vote = "none"
|
|
else
|
|
C.vote = "default"
|
|
|
|
if(usr) usr.vote()
|
|
return
|
|
|
|
|
|
if(!ticker && vote.mode == 1)
|
|
if(going)
|
|
world << "<B>The game start has been delayed.</B>"
|
|
going = 0
|
|
vote.voting = 1 // now voting
|
|
vote.votetime = world.timeofday + config.vote_period*10 // when the vote will end
|
|
|
|
spawn(config.vote_period*10)
|
|
vote.endvote()
|
|
|
|
|
|
|
|
world << "\red<B>*** A vote to [vote.mode?"change game mode":"restart"] has been initiated by [usr.key].</B>"
|
|
world << "\red You have [vote.timetext(config.vote_period)] to vote."
|
|
|
|
log_vote("Voting to [vote.mode ? "change mode" : "restart round"] started by [usr.name]/[usr.key]")
|
|
|
|
for(var/mob/CM in player_list)
|
|
if(CM.client)
|
|
if( config.vote_no_default || (config.vote_no_dead && CM.stat == 2) )
|
|
CM.client.vote = "none"
|
|
else
|
|
CM.client.vote = "default"
|
|
|
|
if(usr) usr.vote()
|
|
return
|
|
|
|
|
|
return
|
|
|
|
if(href_list["vote"] && vote.voting)
|
|
if(usr)
|
|
usr.client.vote = href_list["vote"]
|
|
|
|
//world << "Setting client [usr.key]'s vote to: [href_list["vote"]]."
|
|
|
|
usr.vote()
|
|
return
|
|
|
|
proc/automatic_crew_shuttle_vote()
|
|
|
|
if(vote.voting)
|
|
return
|
|
|
|
if(!vote.canvote() ) // double check even though this shouldn't happen
|
|
return
|
|
|
|
vote.mode = 0
|
|
vote.instant_restart = 0
|
|
|
|
vote.voting = 1 // now voting
|
|
vote.votetime = world.timeofday + config.vote_period*10 // when the vote will end
|
|
|
|
spawn(config.vote_period*10)
|
|
vote.endvote()
|
|
|
|
world << "\red<B>*** An *automatic* vote to call the crew transfer shuttle has been initiated.</B>"
|
|
world << "\red You have [vote.timetext(config.vote_period)] to vote."
|
|
|
|
log_vote("Automatic vote to call the crew transfer shuttle.")
|
|
|
|
for(var/mob/CM in world)
|
|
if(CM.client)
|
|
if( !CM.is_player_active() )
|
|
CM.client.vote = "none"
|
|
else
|
|
CM.client.vote = "none"
|
|
|
|
return |