Add stasis feature

This commit is contained in:
Eitan Adler 2013-04-14 01:12:15 -04:00
parent 1bec88ad77
commit 92aad0da7d

View File

@ -13,6 +13,7 @@ import botconfig
from tools.wolfgamelogger import WolfgameLogger from tools.wolfgamelogger import WolfgameLogger
from tools import decorators from tools import decorators
from datetime import datetime, timedelta from datetime import datetime, timedelta
from collections import defaultdict
import threading import threading
import random import random
import copy import copy
@ -64,6 +65,8 @@ var.GAME_ID = 0
var.DISCONNECTED = {} # players who got disconnected var.DISCONNECTED = {} # players who got disconnected
var.illegal_joins = defaultdict(int)
var.LOGGER = WolfgameLogger(var.LOG_FILENAME, var.BARE_LOG_FILENAME) var.LOGGER = WolfgameLogger(var.LOG_FILENAME, var.BARE_LOG_FILENAME)
if botconfig.DEBUG_MODE: if botconfig.DEBUG_MODE:
@ -367,7 +370,16 @@ def join(cli, nick, chann_, rest):
chan = botconfig.CHANNEL chan = botconfig.CHANNEL
nick, _, __, cloak = parse_nick(nick) nick, _, __, cloak = parse_nick(nick)
try:
cloak = var.USERS[nick]['cloak']
if cloak is not None and var.illegal_joins[cloak] > 0:
cli.notice(nick, "Sorry, but you are in stasis for {0} games.".format(var.illegal_joins[cloak]))
return
except KeyError:
cloak = None
if var.PHASE == "none": if var.PHASE == "none":
cli.mode(chan, "+v", nick) cli.mode(chan, "+v", nick)
@ -968,6 +980,12 @@ def reaper(cli, gameid):
cli.msg(chan, ("\u0002{0}\u0002 didn't get out of bed "+ cli.msg(chan, ("\u0002{0}\u0002 didn't get out of bed "+
"for a very long time. S/He is declared dead. Appears "+ "for a very long time. S/He is declared dead. Appears "+
"(s)he was a \u0002{1}\u0002.").format(nck, var.get_role(nck))) "(s)he was a \u0002{1}\u0002.").format(nck, var.get_role(nck)))
try:
cloak = var.USERS[nck]['cloak']
if cloak is not None:
var.illegal_joins[cloak] += var.PART_STASIS_PENALTY
except KeyError:
pass
if not del_player(cli, nck): if not del_player(cli, nck):
return return
pl = var.list_players() pl = var.list_players()
@ -981,11 +999,23 @@ def reaper(cli, gameid):
if what == "quit" and (datetime.now() - timeofdc) > timedelta(seconds=var.QUIT_GRACE_TIME): if what == "quit" and (datetime.now() - timeofdc) > timedelta(seconds=var.QUIT_GRACE_TIME):
cli.msg(chan, ("\02{0}\02 died due to a fatal attack by wild animals. Appears (s)he "+ cli.msg(chan, ("\02{0}\02 died due to a fatal attack by wild animals. Appears (s)he "+
"was a \02{1}\02.").format(dcedplayer, var.get_role(dcedplayer))) "was a \02{1}\02.").format(dcedplayer, var.get_role(dcedplayer)))
try:
cloak = var.USERS[dcedplayer]['cloak']
if cloak is not None:
var.illegal_joins[cloak] += var.PART_STASIS_PENALTY
except KeyError:
pass
if not del_player(cli, dcedplayer, devoice = False): if not del_player(cli, dcedplayer, devoice = False):
return return
elif what == "part" and (datetime.now() - timeofdc) > timedelta(seconds=var.PART_GRACE_TIME): elif what == "part" and (datetime.now() - timeofdc) > timedelta(seconds=var.PART_GRACE_TIME):
cli.msg(chan, ("\02{0}\02 died due to eating poisonous berries. Appears (s)he was "+ cli.msg(chan, ("\02{0}\02 died due to eating poisonous berries. Appears (s)he was "+
"a \02{1}\02.").format(dcedplayer, var.get_role(dcedplayer))) "a \02{1}\02.").format(dcedplayer, var.get_role(dcedplayer)))
try:
cloak = var.USERS[dcedplayer]['cloak']
if cloak is not None:
var.illegal_joins[cloak] += var.PART_STASIS_PENALTY
except KeyError:
pass
if not del_player(cli, dcedplayer, devoice = False): if not del_player(cli, dcedplayer, devoice = False):
return return
time.sleep(10) time.sleep(10)
@ -1167,7 +1197,6 @@ def leave(cli, what, nick, why=""):
var.DCED_PLAYERS[nick] = var.PLAYERS.pop(nick) var.DCED_PLAYERS[nick] = var.PLAYERS.pop(nick)
if nick not in var.list_players() or nick in var.DISCONNECTED.keys(): if nick not in var.list_players() or nick in var.DISCONNECTED.keys():
return return
# the player who just quit was in the game # the player who just quit was in the game
killhim = True killhim = True
@ -1185,6 +1214,13 @@ def leave(cli, what, nick, why=""):
"(s)he was a \02{1}\02.").format(nick, var.get_role(nick)) "(s)he was a \02{1}\02.").format(nick, var.get_role(nick))
cli.msg(botconfig.CHANNEL, msg) cli.msg(botconfig.CHANNEL, msg)
var.LOGGER.logMessage(msg.replace("\02", "")) var.LOGGER.logMessage(msg.replace("\02", ""))
try:
cloak = var.USERS[str(nick)]['cloak']
if cloak is not None:
var.illegal_joins[cloak] += var.PART_STASIS_PENALTY
except KeyError:
pass
if killhim: if killhim:
del_player(cli, nick) del_player(cli, nick)
else: else:
@ -1209,7 +1245,16 @@ def leave_game(cli, nick, chan, rest):
"S/He was a \02{1}\02.").format(nick, var.get_role(nick))) "S/He was a \02{1}\02.").format(nick, var.get_role(nick)))
var.LOGGER.logMessage(("{0} died of an unknown disease. "+ var.LOGGER.logMessage(("{0} died of an unknown disease. "+
"S/He was a {1}.").format(nick, var.get_role(nick))) "S/He was a {1}.").format(nick, var.get_role(nick)))
try:
if var.get_role(nick) != "person":
cloak = var.USERS[str(nick)]['cloak']
if cloak is not None:
var.illegal_joins[cloak] += var.LEAVE_STASIS_PENALTY
except KeyError:
pass
del_player(cli, nick) del_player(cli, nick)
@ -2392,6 +2437,10 @@ def start(cli, nick, chann_, rest):
else: else:
transition_day(cli) transition_day(cli)
for cloak in var.illegal_joins:
if var.illegal_joins[cloak] != 0:
var.illegal_joins[cloak] -= 1
# DEATH TO IDLERS! # DEATH TO IDLERS!
reapertimer = threading.Thread(None, reaper, args=(cli,var.GAME_ID)) reapertimer = threading.Thread(None, reaper, args=(cli,var.GAME_ID))
reapertimer.daemon = True reapertimer.daemon = True
@ -2405,7 +2454,25 @@ def on_error(cli, pfx, msg):
restart_program(cli, "excess flood", "") restart_program(cli, "excess flood", "")
elif msg.startswith("Closing Link:"): elif msg.startswith("Closing Link:"):
raise SystemExit raise SystemExit
@pmcmd("fstasis", admin_only=True)
def fstasis(cli, nick, *rest):
data = rest[0].split()
if len(data) == 2:
if data[0] in var.USERS:
cloak = var.USERS[str(data[0])]['cloak']
else:
cloak = None
amt = data[1]
if cloak is not None:
var.illegal_joins[cloak] = int(amt)
cli.msg(nick, "{0} is now in statis for {1} games".format(data[0], amt))
else:
cli.msg(nick, "Sorrry, that user has a None cloak")
else:
cli.msg(nick, "current illegal joins: " + str(var.illegal_joins))
@cmd("wait") @cmd("wait")