parent
a0c645bd28
commit
eb0c79ef1d
@ -0,0 +1,101 @@
|
||||
import logging
|
||||
import random
|
||||
|
||||
from werewolf.constants import ALIGNMENT_NEUTRAL, CATEGORY_NEUTRAL_EVIL
|
||||
from werewolf.listener import wolflistener
|
||||
from werewolf.player import Player
|
||||
from werewolf.role import Role
|
||||
|
||||
log = logging.getLogger("red.fox_v3.werewolf.role.blob")
|
||||
|
||||
|
||||
class TheBlob(Role):
|
||||
rand_choice = True
|
||||
category = [CATEGORY_NEUTRAL_EVIL] # List of enrolled categories
|
||||
alignment = ALIGNMENT_NEUTRAL # 1: Town, 2: Werewolf, 3: Neutral
|
||||
channel_id = "" # Empty for no private channel
|
||||
unique = True # Only one of this role per game
|
||||
game_start_message = (
|
||||
"Your role is **The Blob**\n"
|
||||
"You win by absorbing everyone town\n"
|
||||
"Lynch players during the day with `[p]ww vote <ID>`\n"
|
||||
"Each night you will absorb an adjacent player"
|
||||
)
|
||||
description = (
|
||||
"A mysterious green blob of jelly, slowly growing in size.\n"
|
||||
"The Blob fears no evil, must be dealt with in town"
|
||||
)
|
||||
|
||||
def __init__(self, game):
|
||||
super().__init__(game)
|
||||
|
||||
self.blob_target = None
|
||||
|
||||
async def see_alignment(self, source=None):
|
||||
"""
|
||||
Interaction for investigative roles attempting
|
||||
to see team (Village, Werewolf, Other)
|
||||
"""
|
||||
return ALIGNMENT_NEUTRAL
|
||||
|
||||
async def get_role(self, source=None):
|
||||
"""
|
||||
Interaction for powerful access of role
|
||||
Unlikely to be able to deceive this
|
||||
"""
|
||||
return "The Blob"
|
||||
|
||||
async def see_role(self, source=None):
|
||||
"""
|
||||
Interaction for investigative roles.
|
||||
More common to be able to deceive these roles
|
||||
"""
|
||||
return "The Blob"
|
||||
|
||||
async def kill(self, source):
|
||||
"""
|
||||
Called when someone is trying to kill you!
|
||||
Can you do anything about it?
|
||||
self.player.alive is now set to False, set to True to stay alive
|
||||
"""
|
||||
|
||||
# Blob cannot simply be killed
|
||||
self.player.alive = True
|
||||
|
||||
@wolflistener("at_night_start", priority=2)
|
||||
async def _at_night_start(self):
|
||||
if not self.player.alive:
|
||||
return
|
||||
|
||||
self.blob_target = None
|
||||
idx = self.player.id
|
||||
left_or_right = random.choice((-1, 1))
|
||||
while self.blob_target is None:
|
||||
idx += left_or_right
|
||||
if idx >= len(self.game.players):
|
||||
idx = 0
|
||||
|
||||
player = self.game.players[idx]
|
||||
|
||||
# you went full circle, everyone is a blob or something else is wrong
|
||||
if player == self.player:
|
||||
break
|
||||
|
||||
if player.role.properties.get("been_blobbed", False):
|
||||
self.blob_target = player
|
||||
|
||||
if self.blob_target is not None:
|
||||
await self.player.send_dm(f"**You will attempt to absorb {self.blob_target} tonight**")
|
||||
else:
|
||||
await self.player.send_dm(f"**No player will be absorbed tonight**")
|
||||
|
||||
@wolflistener("at_night_end", priority=4)
|
||||
async def _at_night_end(self):
|
||||
if self.blob_target is None or not self.player.alive:
|
||||
return
|
||||
|
||||
target: "Player" = await self.game.visit(self.blob_target, self.player)
|
||||
|
||||
if target is not None:
|
||||
target.role.properties["been_blobbed"] = True
|
||||
self.game.night_messages.append("The Blob grows...")
|
Loading…
Reference in new issue