Convert chk_decision, chk_nightdone, transition_day, transition_night, doomsayer, mayor, and convert+split shamans in three files with a shared helper. Fixes and updates for the User containers, and some other tweaks and fixes.
Only check it where absolutely necessary, and ensure in User that we
don't set accounts if we don't support them. This lets us ensure that
account is always None when account support is disabled, which means
that the existing None checks handle that without additional conditions.
- Add the new User containers for easier handling of users throughout the codebase
- Remove the swap_player event (replaced by User.swap, made possible thanks to the containers)
- Remove the cli argument from several events
- Remove !frole (a replacement will follow)
- Remove the ALLOWED_NORMAL_MODE_COMMANDS config option
Plus a couple of small fixes here and there.
Fix balance in mudkip, it was skewed too much towards village winning.
Also, if day ended in mudkip and nobody was being voted, it would error.
Let's make that not error.
There were a few places where we still tried to do this.
Also get rid of the FEATURES checking for what voice corresponds to,
+v is defined to be the channel mode for voice per RFC so we can
safely hardcode it. A few places weren't changed over because it may
be better to expand those places to handle the other status modes as
well.
- Remove short-circuit in chk_decision event on day timeout. No idea why
I put that there to begin with...
- Don't make succubus remove voters from the list, rather just set their
weight to 0. This causes their vote to not count while still letting
stuff interact with the fact they voted succ (such as desperation totem)
- Ensure that mudkip's vote change works on day timeout as well
MessageDispatcher, sleepy mode, warnings, and the latency command,
to be exact. Sleepy also benefits from some code deduplication in
addition to now operating on users.
The warnings code could use a more comprehensive overhaul too, but
that's going to be harder to achieve.
It's not needed since we can import at function scope. Also make
chk_nightdone implicit for role commands executed during night, so we
can remove tons of redundant calls.
In mael, when giving wolflist to someone who joined midday, I assumed
that pl was a player list when it was already finessed into a list of
strings.
In mudkip, it is possible for the lynch logic to try to lynch someone
twice due to how chk_decision works (if you're forcing someone and
someone ELSE has a majority vote, who actually gets voted depends on the
order in which the dict keys are iterated over). As a result, ensure
that the only possible choice to lynch is the person we're interested in
lynching.
Swap cultist with minion so wolf can collab with them better and not
screw themselves over n1, and make shaman always get dt n1 to make
things more interesting.
This gets rid of the (dced) hack, with var.DCED_LOSERS taking its place.
Succubus was not touched, as there is already a PR which converts it,
although the succubus events in other files were touched.
Some sites were updated to be (more) Users-aware, while others replaced
it with an old deprecated get_roles() API. As more things get converted,
these will hopefully get eliminated as well. A FIXME comment was added
to all such occurrences.
- 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.
8-9p has only one safe, 2 wolves, and a dullahan. Usually this means
dulla controls the game and the winner is entirely determined by whether
or not both wolves are on the kill list. Aka it sucks.
Templates are still applied on game start according to
var.TEMPLATE_RESTRICTIONS, but now any arbitrary role can be applied as
a template during gameplay without breaking things horribly.
Speaking of breaking things horribly, things are probably broken
horribly due to this. It was lightly tested, but there's a lot of
fundamental stuff that changed.
when calling chk_win_conditions, maelstrom uses a rolemap where all players are usually '0', this is casted to a set which makes it think there is only one player
* Split + buff succubus
When all succubi die, all entranced people now die along with them. This
should prevent an entranced person from ratting out the succubus early
on so that they go back to their team, as they lose now even if succubus
dies. One exception is if EVERY succubus idles out, then everyone that
is entranced is freed of entrancement, as it isn't their fault that they
didn't protect their friends in that case.
Dullahans now have succubi entirely removed from their list as the
likelihood they get unentranced is low, and it's easier to implement
this way.
Ensure that entranced people can vote along with ANY succubus, even if
that vote isn't the one that succeeded. Before there were cases where
they could vote along with succubus but still end up dying (particularly
in respect to a vote passing when a succubus abstained).
Clear up some message wording with regards to succubi.
Cleaned up chk_win_conditions and eliminated chk_traitor, so they make
much more sense now.
Also fixed minor issues, such as end-game saying "same number" of wolves
even if there are more wolves than villagers, hunter/vigilante dying
during night sometimes not clearing variables correctly (thus causing
premature night end) and some various stupidity going on with some old
code I wrote that doesn't have any visible effects.
* Combine all players into the same succubus death message
* Fix stylistic issues and succubus idling not working
In 5-player charming games, it is possible to get into a situation where
it's impossible for the village to win - if all players except for the
wolf are charmed, lynching the wolf results in the piper winning, and
lynching the piper results in the wolf winning.