Skip to content

Commit

Permalink
コヨーテを遊んで見てやりづらかった点を修正(@だけではなくID(勝手に設定)で指定できるようにする等)
Browse files Browse the repository at this point in the history
  • Loading branch information
tetsuya-ki committed Jan 30, 2021
1 parent b720920 commit 2489c5e
Show file tree
Hide file tree
Showing 2 changed files with 84 additions and 31 deletions.
43 changes: 35 additions & 8 deletions cogs/gamecog.py
Original file line number Diff line number Diff line change
Expand Up @@ -167,6 +167,7 @@ async def coyoteGame(self, ctx):
- コヨーテ中に、「コヨーテ!」をしたい場合は、`/cy coyote`を入力してください。
- コヨーテ中に、次の回を始めたい場合は、`/cy deal`を入力してください。
- コヨーテ中に、現在の状況を確認したい場合は、`/cy description`を入力してください。
- コヨーテ中に、カードの能力を確認したい場合は、`/cy card`を入力してください。
上級者向け機能
- 説明を省略して、コヨーテを始める場合は、`/cy startAndNoMessage`を入力してください。
- コヨーテ中に、ネタバレありで現在の状況を確認したい場合は、`/cy descriptionAll`を入力してください。
Expand All @@ -186,7 +187,7 @@ async def start(self, ctx):
await self.coyoteLittleMessage(ctx)
await self.dealAndMessage(ctx)

@coyoteGame.command(aliases=['sa','ina','inia'], description='コヨーテを始めるコマンド(全説明)')
@coyoteGame.command(aliases=['sa','sta','ina','inia'], description='コヨーテを始めるコマンド(全説明)')
async def startAndAllMessage(self, ctx):
"""
コヨーテを始めるコマンド(説明が多いバージョン)
Expand All @@ -204,6 +205,8 @@ async def startAndNoMessage(self, ctx):
- 上級者向けの機能です。ルールを説明されずとも把握している場合にのみ推奨します。
"""
await self.startCoyote(ctx)
msg = self.coyoteGames.create_description(True)
await ctx.send(msg)
await self.dealAndMessage(ctx)

@coyoteGame.command(aliases=['sds','ss','set'], description='デッキを指定して、コヨーテを始めるコマンド(説明なし)')
Expand All @@ -229,6 +232,8 @@ async def setDeckAndStart(self, ctx, *, deck=None):
self.coyoteGames.set(make_team.vc_members)
self.coyoteGames.setDeck(deck)
self.coyoteGames.shuffle()
msg = self.coyoteGames.create_description(True)
await ctx.send(msg)
await self.dealAndMessage(ctx)

@coyoteGame.command(aliases=['c','co','cy','done'], description='コヨーテ!(前プレイヤーの数字がコヨーテの合計数を超えたと思った場合のコマンド)')
Expand All @@ -255,11 +260,16 @@ async def coyote(self, ctx, you_id=None, number=0):
you_id = re.sub(r'[<@!>]', '', you_id)
if you_id.isdecimal():
you_id = int(you_id)
you = ctx.guild.get_member(you_id)
else:
msg = '「コヨーテする相手」(@で指定)と「コヨーテを言われた人の数字」を指定してください。例:`/coyoteGame coyote @you 99`'
await ctx.send(msg)
return
you = ctx.guild.get_member(you_id)
# IDから取得を試みる
keys = [k for k, v in self.coyoteGames.members.items() if v.id == str(you_id).upper()]
if len(keys) == 0:
msg = '「コヨーテする相手」(@で指定するか、IDで指定(aなど))と「コヨーテを言われた人の数字」を指定してください。例:`/coyoteGame coyote @you 99`'
await ctx.send(msg)
return
else:
you = keys.pop()
if you not in self.coyoteGames.members:
msg = 'ゲームに存在する相手を選び、「コヨーテ!」してください(ゲームしている相手にはいません)。'
await ctx.send(msg)
Expand Down Expand Up @@ -301,6 +311,14 @@ async def descriptionAll(self, ctx):
msg = self.coyoteGames.create_description(True)
await ctx.send(msg)

@coyoteGame.command(aliases=['cards','ca'], description='カードの説明')
async def card(self, ctx):
"""
カードの能力を説明します。
"""
msg = self.coyoteGames.create_description_card()
await ctx.send(msg)

async def startCoyote(self, ctx):
make_team = MakeTeam()
make_team.my_connected_vc_only_flg = True
Expand Down Expand Up @@ -335,13 +353,13 @@ async def coyoteAllMessage(self, ctx):
'コヨーテの鳴き声(想像してね)が上手いプレイヤーから始めます。'
await ctx.send(msg1)

msg2 = '最初のプレイヤーはDMに送られる他の人のカードを見て、この場に「少なくとも」何匹のコヨーテがいるか推理し、コヨーテの数を宣言します。\n'\
msg2 = '最初のプレイヤーはDMに送られる他の人のカードを見て、この場に「少なくとも」何匹のコヨーテがいるか(DMを見て数字を加算し)推理し、コヨーテの数を宣言します。\n'\
'★宣言する数に上限はありませんが、**1以上の整数である必要**があります(つまり、0や負数はダメです)\n'\
'ゲームは時計回りに進行(ボイスチャンネルを下に進むこと)します。\n'\
'次のプレイヤーは次のふたつのうち、「どちらか」の行動をとってください。\n'\
'1: 数字を上げる → 前プレイヤーの宣言した数が実際にこの場にいるコヨーテの数**以下(オーバー)していない**と思う場合、**前プレイヤーより大きな数**を宣言します。\n'\
'2: 「コヨーテ!」→ 前プレイヤーの宣言を疑います。つまり、前プレイヤーの宣言した数が実際にこの場にいるコヨーテの数よりも**大きい(オーバーした)**と思う場合、**「コヨーテ!」**と宣言します\n'\
'2の場合、例:`/coyoteGame coyote @you 99`のように**Discordに書き込んで**ください!(Botが結果を判定します!)\n'\
'2の場合、例:`/coyoteGame coyote @you 99`のように(`@you`はidでもOK)**Discordに書き込んで**ください!(Botが結果を判定します!)\n'\
'**誰かが「コヨーテ!」と宣言するまで**、時計回りで順々に交代しながら宣言する数字を上げていきます\n'
await ctx.send(msg2)

Expand All @@ -359,6 +377,11 @@ async def coyoteAllMessage(self, ctx):
'サイト: <http://www.newgamesorder.jp/games/coyote>'
await ctx.send(msg3)

msg4 = self.coyoteGames.create_description(True)
await ctx.send(msg4)
card_msg = self.coyoteGames.create_description_card()
await ctx.send(card_msg)

async def coyoteLittleMessage(self, ctx):
msg = 'コヨーテ:ゲーム目的\n**自分以外のプレイヤーのカード(DMに送られる)を見て、少なくとも何匹のコヨーテがこの場にいるかを推理します。**\n'\
'もしも宣言した数だけ居なかったら......コヨーテに命を奪われてしまいます! インディアン、嘘つかない。コヨーテだって、嘘が大キライなのです。\n'\
Expand All @@ -368,14 +391,18 @@ async def coyoteLittleMessage(self, ctx):
'次のプレイヤー:は次のふたつのうち、「どちらか」の行動をとってください。\n'\
'1: 数字を上げる → 前プレイヤーの宣言した数が実際にこの場にいるコヨーテの数**以下(オーバー)していない**と思う場合、**前プレイヤーより大きな数**を宣言します。\n'\
'2: 「コヨーテ!」→ 前プレイヤーの宣言を疑います。つまり、前プレイヤーの宣言した数が実際にこの場にいるコヨーテの数よりも**大きい(オーバーした)**と思う場合、**「コヨーテ!」**と宣言します\n'\
'2の場合、例:`/coyoteGame coyote @you 99`のように**Discordに書き込んで**ください!(Botが結果を判定します!)\n'\
'2の場合、例:`/coyoteGame coyote @you 99`のように(`@you`はidでもOK)**Discordに書き込んで**ください!(Botが結果を判定します!)\n'\
'**誰かが「コヨーテ!」と宣言するまで**、時計回り(ボイスチャンネルを下に進む)で順々に交代しながら宣言する**数字を上げて**いきます\n'\
'次の回を始めるには、`/coyoteGame deal`をDiscordに書き込んでください(**今回負けた人から開始**します)。\n'\
'負けたプレイヤーがその回を最後に**ゲームから脱落した場合、その回の勝者から**次の回を始めます。\n'\
'ライフが0になったプレイヤーはゲームから脱落します。最後まで生き残ったプレイヤーが勝利です。\n'\
'なお、コヨーテは絶賛販売中です(1,800円くらい)。気に入った方はぜひ買って遊んでみてください(このBotは許可を得て作成したものではありません)。販売:合同会社ニューゲームズオーダー, 作者:Spartaco Albertarelli, 画:TANSANFABRIK\n'\
'サイト: <http://www.newgamesorder.jp/games/coyote>'
await ctx.send(msg)
msg2 = self.coyoteGames.create_description(True)
await ctx.send(msg2)
card_msg = self.coyoteGames.create_description_card()
await ctx.send(card_msg)

async def coyoteStartCheckNG(self, ctx, desc=False):
if self.coyoteGames is None or (len(self.coyoteGames.members) <= 1 and not desc):
Expand Down
72 changes: 49 additions & 23 deletions cogs/modules/coyote.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import random
import discord
import re
import string
from logging import getLogger

logger = getLogger(__name__)
Expand All @@ -11,6 +12,7 @@ def __init__(self):
self.HP = self.DEFAULT_HP
self.card = ''
self.isDead = False
self.id = ''

def setCard(self, card: str):
self.card = card
Expand All @@ -20,8 +22,12 @@ def damage(self, number: int):
if self.HP == 0:
self.isDead = True

def setId(self, id: str):
self.id = id

class Coyote:
DEFAULT_DECK = [20, 15, 15, 10, 10, 10, 5, 5, 5, 5, 4, 4, 4, 4, 3, 3, 3, 3, 2, 2, 2, 2, 1, 1, 1, 1, 0, 0, 0, '0(Night)', -5, -5, -10, '*2(Chief)', 'Max->0(Fox)', '?(Cave)']
ID_LIST = list(string.ascii_uppercase)

def __init__(self):
self.members = {}
Expand All @@ -40,8 +46,9 @@ def set(self, members):
self.discards = []
self.turn = 0
self.description = ''
for member in members:
for id, member in zip(self.ID_LIST ,members):
coyoteMember = CoyoteMember()
coyoteMember.setId(id)
self.members[member] = coyoteMember

def setDeck(self, deck:str):
Expand Down Expand Up @@ -88,25 +95,29 @@ def coyote(self, me: discord.Member, you: discord.Member, number):
if number > coyotes:
self.members[you].damage(1)
message = f'{number} > {coyotes} → 「コヨーテ!」の勝ち({me.display_name}が正しい!)\n'\
f'{you.display_name}に1点ダメージ。'
f'{you.display_name}に1点ダメージ。次の手番は{you.display_name}(敗者)からです。\n'
self.description += message
logger.info(message)
if self.members[you].isDead:
self.body.append(self.members.pop(you))
message = f'{you.display_name}は死にました。\n'
if len(self.members) > 1:
message += f'**次は{me.display_name}(勝者)から手番を開始**してください。\n'
self.description += message
logger.info(message)
self.body.append(self.members.pop(you))
else:
self.members[me].damage(1)
message = f'{number} <= {coyotes} → 「コヨーテ!」の負け({you.display_name}が正しい!)\n'\
f'{me.display_name}に1点ダメージ。'
f'{me.display_name}に1点ダメージ。次の手番は{me.display_name}(敗者)からです。\n'
self.description += message
logger.info(message)
if self.members[me].isDead:
self.body.append(self.members.pop(me))
message = f'{me.display_name}は死にました。\n'
if len(self.members) > 1:
message += f'**次は{you.display_name}(勝者)から手番を開始**してください。\n'
self.description += message
logger.info(message)
self.body.append(self.members.pop(me))

# 一人になったら、勝利
if len(self.members) == 1:
Expand All @@ -117,14 +128,12 @@ def coyote(self, me: discord.Member, you: discord.Member, number):
else:
self.description += '現在の状況:'
for member in self.members:
self.description += f'{member.display_name}さん(HP:{self.members[member].HP}) '
self.description += f'{member.display_name}さん(ID:{self.members[member].id}, HP:{self.members[member].HP}) '
self.description += '\n`/coyoteGame deal`で次のターンを開始します。'

def calc(self):
# [変数名 for 変数名 in 元のリスト if 条件式]
normal_hands = [i for i in self.hands if self.is_num(i)]
special_hands = [i for i in self.hands if not self.is_num(i)]
additional_hands = []
shuffle_flg = False

# Caveカードの効果
Expand Down Expand Up @@ -207,13 +216,13 @@ def calc(self):
# Foxカードの効果
if 'FOX' in card.upper():
self.discards.append(card)
num_hands = [i for i in normal_hands if self.is_num(i)]
num_hands = [i for i in normal_hands if self.is_num(i) and i > 0]
if len(num_hands) == 0:
max_num = 0
else:
max_num = max(num_hands)
fox_hands.append(-max_num)
message = f'{card}の効果で、この場で最大の値である{max_num}を0にした。\n'
message = f'{card}の効果で、コヨーテカードの最大値である{max_num}を0にした。\n'
self.description += message
logger.info(message)

Expand Down Expand Up @@ -260,23 +269,40 @@ def create_description(self, all_flg=False):
msg = f'ターン数:{self.turn}\n'
msg += f'生き残っている人の数:{len(self.members)}\n'
for member in self.members:
msg += f'`{member.display_name}さん → HP:{self.members[member].HP}`\n'
msg += f'`{member.display_name}さん(id:{self.members[member].id}) → HP:{self.members[member].HP}`\n'
if all_flg:
msg += f'山札の数:{len(self.deck)}枚 → '
deck_list = map(str, self.deck)
msg += f'山札の数:{len(self.deck)}枚 → `'
deck_list = sorted(map(str, self.deck))
deck = ','.join(deck_list)
msg += deck + '\n'
msg += deck + '`\n'
else:
msg += f'山札の数:{len(self.deck)}枚, '
msg += f'捨て札:{len(self.discards)}枚 → '
discards_list = map(str, self.discards)
discards = ','.join(discards_list)
msg += discards
msg += f'捨て札:{len(self.discards)}枚'
if len(self.discards) > 0:
msg += ' → `'
discards_list = map(str, self.discards)
discards = ','.join(discards_list)
msg += discards + '\n`'
else:
msg += '\n'

if all_flg:
msg += f'\n場のカード:{len(self.hands)}枚 → '
hands_list = map(str, self.hands)
hands = ','.join(hands_list)
msg += f'||{hands}||'

msg += f'場のカード:{len(self.hands)}枚'
if len(self.hands) > 0:
msg += ' → '
hands_list = map(str, self.hands)
hands = ','.join(hands_list)
msg += f'||{hands}||'

return msg

def create_description_card(self):
msg = 'ナンバーカードには、「基本カード」と「特殊カード」の2種類が存在します。\n'
msg += '■基本カード\n'
msg += 'コヨーテカード: 1以上の数値を持ったカード, 兵隊カード: −1以下の数値を持ったカード(兵隊に退治されコヨーテが減ります), おばけカード: 0のカード(数に加えません)\n'
msg += '■特殊カード\n'
msg += '\*2(Chief): 酋長カード...すべての基本カードの数値を2倍にします。\n'
msg += '0(Night): 夜カード...0です。計算終了後、山札・捨て札を混ぜてシャッフルします(山札がリセットされる)。\n'
msg += '?(Cave): ほらあなカード...計算時に山札からナンバーカードを1枚引き、その数を加えます。\n'
msg += 'Max->0(Fox): キツネカード...この回で出た最大のコヨーテカードの数値を「0」にします。\n'
return msg

0 comments on commit 2489c5e

Please sign in to comment.