Balance tweaks for new mode

- Remove minion entirely, keeping cultist at 8p instead.
- Cultist swaps with doomsayer at 9p, so there's still only 2 wolfteam
  until 11p. Doomsayer is powerful enough already, don't need another
  wolfteam in there.
- Get rid of retribution totems. Shaman is now 50/50 death/pestilence
  and wolf shaman is 50/50 protection/misdirection.
- Make stalemates benefit village by allowing tied votes to lynch all
  tied people instead of nobody. Day ends once everyone votes, even if
  there is no majority vote. In that case, the plurality of votes is
  considered rather than majority.
This commit is contained in:
skizzerz 2017-12-09 11:21:04 -06:00
parent f9119e12e0
commit a2dd0fd189
3 changed files with 45 additions and 8 deletions

View File

@ -162,6 +162,7 @@
"command_ratelimited": "This command is rate-limited. Please wait a while before using it again.",
"stats": "{0}It is currently {4}. There {3} {1}, and {2}.",
"daylight_warning": "\u0002As the sun sinks inexorably toward the horizon, turning the lanky pine trees into fire-edged silhouettes, the villagers are reminded that very little time remains for them to reach a decision; if darkness falls before they have done so, the majority will win the vote. No one will be lynched if there are no votes or an even split.\u0002",
"daylight_warning_killtie": "\u0002As the sun sinks inexorably toward the horizon, turning the lanky pine trees into fire-edged silhouettes, the villagers are reminded that very little time remains for them to reach a decision; if darkness falls before they have done so, the plurality will win the vote. Ties for plurality will cause all tied players to be lynched, but no one will be lynched if there are no votes.\u0002",
"sunset": "As the sun sets, the villagers agree to retire to their beds and wait for morning.",
"twilight_warning": "\u0002A few villagers awake early and notice it is still dark outside. The night is almost over and there are still whispers heard in the village.\u0002",
"sunrise": "Night lasted \u0002{0:0>2}:{1:0>2}\u0002. It is now daytime. The villagers awake, thankful for surviving the night, and search the village... ",

View File

@ -1366,8 +1366,8 @@ class MudkipMode(GameMode):
super().__init__(arg)
self.ABSTAIN_ENABLED = False
# SHAMAN , CRAZED SHAMAN , WOLF SHAMAN
self.TOTEM_CHANCES = { "death": ( 4 , 1 , 0 ),
"protection": ( 0 , 1 , 4 ),
self.TOTEM_CHANCES = { "death": ( 5 , 1 , 0 ),
"protection": ( 0 , 1 , 5 ),
"silence": ( 0 , 1 , 0 ),
"revealing": ( 0 , 1 , 0 ),
"desperation": ( 0 , 1 , 0 ),
@ -1378,9 +1378,9 @@ class MudkipMode(GameMode):
"exchange": ( 0 , 1 , 0 ),
"lycanthropy": ( 0 , 1 , 0 ),
"luck": ( 0 , 1 , 0 ),
"pestilence": ( 4 , 1 , 0 ),
"retribution": ( 2 , 1 , 2 ),
"misdirection": ( 0 , 1 , 4 ),
"pestilence": ( 5 , 1 , 0 ),
"retribution": ( 0 , 1 , 0 ),
"misdirection": ( 0 , 1 , 5 ),
"deceit": ( 0 , 1 , 0 ),
}
self.ROLE_INDEX = ( 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 12 , 13 , 14 , 15 )
@ -1396,8 +1396,7 @@ class MudkipMode(GameMode):
"wolf" : ( 1 , 1 , 1 , 1 , 1 , 1 , 1 , 2 , 2 , 2 , 2 , 2 ),
"doomsayer" : ( 0 , 0 , 0 , 0 , 0 , 1 , 1 , 1 , 1 , 1 , 1 , 1 ),
"wolf shaman" : ( 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 , 1 , 1 ),
"cultist" : ( 0 , 1 , 1 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ),
"minion" : ( 0 , 0 , 0 , 0 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 ),
"cultist" : ( 0 , 1 , 1 , 1 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ),
# neutral roles
"jester" : ( 0 , 0 , 0 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 ),
"succubus" : ( 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 ),
@ -1405,6 +1404,41 @@ class MudkipMode(GameMode):
"assassin" : ( 0 , 0 , 0 , 0 , 0 , 0 , 1 , 1 , 1 , 1 , 1 , 1 ),
})
self.recursion_guard = False
def startup(self):
events.add_listener("chk_decision", self.chk_decision)
events.add_listener("daylight_warning", self.daylight_warning)
def teardown(self):
events.remove_listener("chk_decision", self.chk_decision)
events.remove_listener("daylight_warning", self.daylight_warning)
def chk_decision(self, evt, cli, var, force):
# If everyone is voting, end day here with the person with plurality being voted. If there's a tie,
# kill all tied players rather than hanging. The intent of this is to benefit village team in the event
# of a stalemate, as they could use the extra help (especially in 5p).
if self.recursion_guard:
# in here, this means we're in a child chk_decision event called from this one
# the only thing we need to do is ensure we don't turn into nighttime prematurely
evt.data["transition_night"] = lambda cli: None
return
avail = len(evt.params.voters)
voted = sum(map(len, evt.data["votelist"].values()))
if avail != voted:
return
maxv = max(evt.data["numvotes"].values())
# make a copy in case an event mutates it in recursive calls
tovote = [p for p, n in evt.data["numvotes"].items() if n == maxv]
self.recursion_guard = True
for p in tovote:
chk_decision(cli, force=p)
self.recursion_guard = False
evt.data["transition_night"](cli)
def daylight_warning(self, evt, var):
evt.data["message"] = "daylight_warning_killtie"
# vim: set sw=4 expandtab:

View File

@ -1722,7 +1722,9 @@ def hurry_up(cli, gameid, change):
chan = botconfig.CHANNEL
if not change:
cli.msg(chan, messages["daylight_warning"])
event = Event("daylight_warning", {"message": "daylight_warning"})
event.dispatch(var)
cli.msg(chan, event.data["message"])
return
var.DAY_ID = 0