# -*- coding: utf-8 -*- from __future__ import absolute_import # -- stdlib -- # -- third party -- # -- own -- from thb import thbkof from thb.ui.ui_meta.common import gen_metafunc # -- code -- __metaclass__ = gen_metafunc(thbkof) class THBattleKOF: name = u'KOF模式' logo = 'thb-modelogo-kof' description = ( u'|R游戏人数|r:2人\n' u'\n' u'|R选将模式|r:选将按照1-2-2-2-2-1来选择。\n' u'\n' u'|R游戏过程|r:选好角色后,将会翻开第一个角色进行对决,其他角色为隐藏。当有一方角色被击坠后,需弃置所有的牌(手牌、装备牌、判定区的牌),然后选择下一个出场的角色,并摸4张牌。\n' u'\n' u'|R胜利条件|r:当其中一方3名角色被击坠时,判对方胜出') params_disp = {} def ui_class(): from thb.ui.view import THBattleKOFUI return THBattleKOFUI
# -*- coding: utf-8 -*- # -- stdlib -- import random # -- third party -- # -- own -- from thb import characters from thb.ui.ui_meta.common import card_desc, gen_metafunc, passive_clickable from thb.ui.ui_meta.common import passive_is_action_valid # -- code -- __metaclass__ = gen_metafunc(characters.shinmyoumaru) class MiracleMallet: # Skill name = u'万宝槌' description = u'当一名角色的判定牌生效前,你可以用一张点数大于此牌的牌替换之。' clickable = passive_clickable is_action_valid = passive_is_action_valid class MiracleMalletAction: def effect_string(act): return u'|G【%s】|r将|G【%s】|r的判定结果改为%s。' % (act.source.ui_meta.name, act.target.ui_meta.name, card_desc(act.card)) def sound_effect(act):
# -*- coding: utf-8 -*- # -- stdlib -- import random # -- third party -- # -- own -- from thb import actions, cards, characters from thb.actions import ttags from thb.ui.ui_meta.common import build_handcard, gen_metafunc, my_turn # -- code -- __metaclass__ = gen_metafunc(characters.nitori) class Dismantle: # Skill name = u'拆解' description = u'出牌阶段限一次,你可以|B重铸|r一名其他角色装备区里的一张装备牌,然后该角色摸一张牌。' def clickable(g): if ttags(g.me)['dismantle']: return False return my_turn() def is_action_valid(g, cl, tl): if cl[0].associated_cards: return (False, u'请不要选择牌!')
# -*- coding: utf-8 -*- from __future__ import absolute_import # -- stdlib -- # -- third party -- # -- own -- from thb import characters from thb.ui.ui_meta.common import gen_metafunc, passive_clickable, passive_is_action_valid # -- code -- __metaclass__ = gen_metafunc(characters.akari) class AkariSkill: # Skill name = u'阿卡林' description = u'消失在画面里的能力。在开局之前没有人知道这是谁。' clickable = passive_clickable is_action_valid = passive_is_action_valid class Akari: # Character name = u'随机角色' title = u'会是谁呢' port_image = u'thb-portrait-akari'
# -*- coding: utf-8 -*- from __future__ import absolute_import, division, print_function, unicode_literals # -- stdlib -- import random # -- third party -- # -- own -- from thb import characters from thb.actions import ttags from thb.ui.ui_meta.common import card_desc, gen_metafunc, my_turn, passive_clickable from thb.ui.ui_meta.common import passive_is_action_valid # -- code -- __metaclass__ = gen_metafunc(characters.keine) class Devour: # Skill name = '噬史' description = ( '一名角色的出牌阶段开始时,你可以弃置一张基本牌或装备牌,并根据其颜色发动相应效果:\n' '|B|R>> |r若为红色,你记录该角色当前的体力值\n' '|B|R>> |r若为黑色,你记录该角色当前的手牌数\n' '该角色的出牌阶段结束时,将其恢复至本回合记录时的状态。' ) clickable = passive_clickable is_action_valid = passive_is_action_valid
# -*- coding: utf-8 -*- # -- stdlib -- # -- third party -- # -- own -- from thb import actions, characters from thb.ui.ui_meta.common import gen_metafunc, passive_clickable, passive_is_action_valid # -- code -- __metaclass__ = gen_metafunc(characters.daiyousei) class Daiyousei: # Character name = u'大妖精' title = u'全身萌点的保姆' illustrator = u'渚FUN' cv = u'简翎' port_image = u'thb-portrait-daiyousei' figure_image = u'thb-figure-daiyousei' miss_sound_effect = u'thb-cv-daiyousei_miss' class DaiyouseiKOF: # Character name = u'大妖精' title = u'全身萌点的保姆' illustrator = u'渚FUN' cv = u'简翎'
# -*- coding: utf-8 -*- # -- stdlib -- # -- third party -- # -- own -- from thb import actions, characters from thb.ui.ui_meta.common import gen_metafunc, limit1_skill_used, passive_clickable from thb.ui.ui_meta.common import passive_is_action_valid # -- code -- __metaclass__ = gen_metafunc(characters.rumia) class Darkness: # Skill name = u'黑暗' description = ( u'出牌阶段限一次,你可以弃置一张牌并指定一名其他角色,令其选择一项:\n' u'|B|R>> |r对其攻击范围内另一名你指定的其他角色使用一张|G弹幕|r。\n' u'|B|R>> |r受到你造成的1点伤害。' ) custom_ray = True def clickable(game): try: if limit1_skill_used('darkness_tag'): return False act = game.action_stack[-1] if isinstance(act, actions.ActionStage): return True
# -*- coding: utf-8 -*- # -- stdlib -- # -- third party -- # -- own -- from thb import characters from thb.ui.ui_meta.common import gen_metafunc, passive_clickable, passive_is_action_valid # -- code -- __metaclass__ = gen_metafunc(characters.mima20150705) class Mima20150705: # Character name = u'魅魔' title = u'魔闪的修罗' designer = u'蝶之羽风暂留此' port_image = u'thb-portrait-mima20150705' class Tianyi: # Skill name = u'天仪' description = ( u'你的回合内限一次,一张符卡生效前,你可以使其无效,视为你对该符卡指定的所有目标依次使用一张弹幕。\n' u'|B|R>> |r以此法使用的弹幕不受“一回合使用一次”的限制。' ) clickable = passive_clickable
# -*- coding: utf-8 -*- # -- stdlib -- # -- third party -- # -- own -- from thb import actions, cards, characters from thb.ui.ui_meta.common import gen_metafunc from utils import BatchList # -- code -- __metaclass__ = gen_metafunc(characters.chen) class FlyingSkanda: # Skill name = u'飞翔韦驮天' description = ( u'出牌阶段限一次,你使用|G弹幕|r或单体符卡时,可以额外指定一个目标。\n' u'|B|R>> |r在线版本中,不能以此法使用|G人形操控|r' ) def clickable(game): me = game.me if me.tags['flying_skanda'] >= me.tags['turn_count']: return False try: act = game.action_stack[-1] if isinstance(act, actions.ActionStage) and act.target is me: return True except IndexError: pass return False
# -*- coding: utf-8 -*- # -- stdlib -- import random # -- third party -- # -- own -- from thb import characters from thb.ui.ui_meta.common import card_desc, gen_metafunc, passive_clickable from thb.ui.ui_meta.common import passive_is_action_valid # -- code -- __metaclass__ = gen_metafunc(characters.shikieiki) class Trial: # Skill name = u'审判' description = u'每当一名角色的判定牌生效前,你可以打出一张牌代替之。' clickable = passive_clickable is_action_valid = passive_is_action_valid class TrialAction: def effect_string(act): return u'幻想乡各地巫女妖怪纷纷表示坚决拥护|G【%s】|r将|G【%s】|r的判定结果修改为%s的有关决定!' % ( act.source.ui_meta.name, act.target.ui_meta.name, card_desc(act.card) )
# -*- coding: utf-8 -*- # -- stdlib -- # -- third party -- # -- own -- from thb import characters from thb.ui.ui_meta.common import gen_metafunc, passive_clickable, passive_is_action_valid # -- code -- __metaclass__ = gen_metafunc(characters.sp_flandre) class SpFlandre: # Character name = u'SP芙兰朵露' title = u'玩坏你哦' illustrator = u'Vivicat@幻想梦斗符' cv = u'shourei小N' port_image = u'thb-portrait-sp_flandre' figure_image = u'thb-figure-sp_flandre' miss_sound_effect = u'thb-cv-spflandre_miss' class DestructionImpulse: # Skill name = u'破坏冲动' description = u'|B锁定技|r,结束阶段开始时,若你本回合没有造成过伤害,你失去1点残机并对距离最近的一名其他角色造成1点伤害。' clickable = passive_clickable is_action_valid = passive_is_action_valid
# -*- coding: utf-8 -*- # -- stdlib -- import random # -- third party -- # -- own -- from thb import characters from thb.ui.ui_meta.common import gen_metafunc, meta_property, passive_clickable from thb.ui.ui_meta.common import passive_is_action_valid # -- code -- __metaclass__ = gen_metafunc(characters.kaguya) class Kaguya: # Character name = u'蓬莱山辉夜' title = u'永远的公主殿下' illustrator = u'噗呼噗呼@星の妄想乡' cv = u'shourei小N' port_image = u'thb-portrait-kaguya' figure_image = u'thb-figure-kaguya' miss_sound_effect = u'thb-cv-kaguya_miss' class Dilemma: # Skill name = u'难题' description = u'每当一名角色令你回复1点残机后,你可以令其摸一张牌;每当你受到一次伤害后,你可以令伤害来源选择一项:|B|R>> |r交给你一张方块牌,|B|R>> |r失去1点残机。'
# -*- coding: utf-8 -*- # -- stdlib -- # -- third party -- # -- own -- from thb import characters from thb.actions import ttags from thb.ui.ui_meta.common import card_desc, gen_metafunc, my_turn, passive_clickable from thb.ui.ui_meta.common import passive_is_action_valid # -- code -- __metaclass__ = gen_metafunc(characters.cirno) class PerfectFreeze: # Skill name = u'完美冻结' description = u'每当你使用|G弹幕|r或|G弹幕战|r对其他角色造成伤害时,你可以防止此次伤害,并令该角色弃置一张牌,若其弃置的不为装备区的牌,其失去1点残机。' clickable = passive_clickable is_action_valid = passive_is_action_valid class CirnoDropCards: def effect_string(act): return u'|G【%s】|r弃置了|G【%s】|r的%s。' % ( act.source.ui_meta.name, act.target.ui_meta.name, card_desc(act.cards), )
# -*- coding: utf-8 -*- from __future__ import absolute_import # -- stdlib -- # -- third party -- # -- own -- from thb import thb3v3 from thb.ui.ui_meta.common import gen_metafunc # -- code -- __metaclass__ = gen_metafunc(thb3v3) class THBattle: name = u'3v3模式' logo = 'thb-modelogo-3v3' description = ( u'|R游戏人数|r:6人\n' u'\n' u'阵营分为|!B博丽|r和|!O守矢|r,每个阵营3名玩家,交错入座。\n' u'由ROLL点最高的人开始,按照顺时针1-2-2-1的方式选将。\n' u'选将完成由ROLL点最高的玩家开始行动。\n' u'ROLL点最高的玩家开局摸3张牌,其余玩家开局摸4张牌。\n' u'\n' u'|R胜利条件|r:击坠所有对方阵营玩家。' ) params_disp = { 'random_seat': { 'desc': u'随机座位阵营', 'options': [
# -*- coding: utf-8 -*- # -- stdlib -- # -- third party -- # -- own -- from thb import cards as thbcards, characters from thb.ui.ui_meta.common import card_desc, gen_metafunc, passive_clickable from thb.ui.ui_meta.common import passive_is_action_valid # -- code -- __metaclass__ = gen_metafunc(characters.kyouko) class Kyouko: # Character name = u'幽谷响子' title = u'诵经的山彦' illustrator = u'月见' designer = u'蝶之羽风暂留此' cv = u'小羽' port_image = u'thb-portrait-kyouko' figure_image = u'thb-figure-kyouko' miss_sound_effect = u'thb-cv-kyouko_miss' class Echo: # Skill name = u'回响' description = u'每当你受到一次伤害后,你可以获得对你造成伤害的牌,若此牌为|G弹幕|r,你可以改为令一名其他角色获得之。'
# -*- coding: utf-8 -*- # -- stdlib -- # -- third party -- # -- own -- from thb import characters from thb.ui.ui_meta.common import gen_metafunc, limit1_skill_used, my_turn # -- code -- __metaclass__ = gen_metafunc(characters.marisa) class Marisa: # Character name = u'雾雨魔理沙' title = u'绝非普通的强盗少女' illustrator = u'霏茶' cv = u'君寻' port_image = u'thb-portrait-marisa' figure_image = u'thb-figure-marisa' miss_sound_effect = u'thb-cv-marisa_miss' class Daze: name = u'打贼' def effect_string(act): # for LaunchCard.ui_meta.effect_string return u'|G【%s】|r喊道:“打贼啦!”向|G【%s】|r使用了|G弹幕|r。' % ( act.source.ui_meta.name,
# -*- coding: utf-8 -*- from __future__ import absolute_import # -- stdlib -- import random # -- third party -- # -- own -- from thb import characters from thb.actions import ttags from thb.ui.ui_meta.common import gen_metafunc, my_turn, passive_clickable, passive_is_action_valid # -- code -- __metaclass__ = gen_metafunc(characters.sanae) class Sanae: # Character name = u'东风谷早苗' title = u'常识满满的现人神' illustrator = u'小D@星の妄想乡' cv = u'VV' port_image = u'thb-portrait-sanae' figure_image = u'thb-figure-sanae' miss_sound_effect = u'thb-cv-sanae_miss' class SanaeKOF: # Character name = u'东风谷早苗'
# -*- coding: utf-8 -*- # -- stdlib -- # -- third party -- # -- own -- from thb import cards, characters from thb.ui.ui_meta.common import card_desc, gen_metafunc, limit1_skill_used, my_turn from thb.ui.ui_meta.common import passive_clickable, passive_is_action_valid # -- code -- __metaclass__ = gen_metafunc(characters.kokoro) class Kokoro: # Character name = u'秦心' title = u'表情丰富的扑克脸' illustrator = u'Takibi' cv = u'小羽/VV' port_image = u'thb-portrait-kokoro' figure_image = u'thb-figure-kokoro' miss_sound_effect = u'thb-cv-kokoro_miss' class KokoroKOF: # Character name = u'秦心' title = u'表情丰富的扑克脸' illustrator = u'Takibi' cv = u'小羽/VV'
# -*- coding: utf-8 -*- # -- stdlib -- # -- third party -- # -- own -- from thb import characters from thb.actions import ttags from thb.ui.ui_meta.common import card_desc, gen_metafunc, my_turn, passive_clickable from thb.ui.ui_meta.common import passive_is_action_valid # -- code -- __metaclass__ = gen_metafunc(characters.cirno) class PerfectFreeze: # Skill name = u'完美冻结' description = u'每当你使用|G弹幕|r或|G弹幕战|r对其他角色造成伤害时,你可以防止此次伤害,并令该角色弃置一张牌,若其弃置的不为装备区的牌,其失去1点体力。' clickable = passive_clickable is_action_valid = passive_is_action_valid class CirnoDropCards: def effect_string(act): return u'|G【%s】|r弃置了|G【%s】|r的%s。' % ( act.source.ui_meta.name, act.target.ui_meta.name, card_desc(act.cards), )
# -*- coding: utf-8 -*- # -- stdlib -- # -- third party -- # -- own -- from thb import cards, characters from thb.ui.ui_meta.common import gen_metafunc, my_turn # -- code -- __metaclass__ = gen_metafunc(characters.parsee) class Parsee: # Character name = u'水桥帕露西' title = u'地壳下的嫉妒心' illustrator = u'和茶' cv = u'小羽' port_image = u'thb-portrait-parsee' figure_image = u'thb-figure-parsee' miss_sound_effect = u'thb-cv-parsee_miss' class Envy: # Skill name = u'嫉妒' description = u'你可以将一张黑色牌当|G城管执法|r使用;每当距离1的其他角色的方块牌被你使用的|G城管执法|r弃置而置入弃牌堆后,你可以获得之。' def clickable(game): me = game.me
# -*- coding: utf-8 -*- # -- stdlib -- import random # -- third party -- # -- own -- from thb import characters from thb.ui.ui_meta.common import gen_metafunc, passive_clickable, passive_is_action_valid # -- code -- __metaclass__ = gen_metafunc(characters.patchouli) class Library: # Skill name = u'图书' description = u'|B锁定技|r,每当你使用非延时符卡时,你摸一张牌;你使用符卡无距离限制。' clickable = passive_clickable is_action_valid = passive_is_action_valid class LibraryDrawCards: def effect_string(act): return u'|G【%s】|r发动了|G图书|r技能,摸1张牌。' % (act.source.ui_meta.name, ) def sound_effect(act): return random.choice([ 'thb-cv-patchouli_library1', 'thb-cv-patchouli_library2',
# -*- coding: utf-8 -*- # -- stdlib -- # -- third party -- # -- own -- from thb import cards, characters from thb.ui.ui_meta.common import build_handcard, gen_metafunc, my_turn, passive_clickable from thb.ui.ui_meta.common import passive_is_action_valid # -- code -- __metaclass__ = gen_metafunc(characters.yuuka) class ReversedScales: # Skill name = u'逆鳞' description = u'每当你成为其他角色使用的单体符卡效果目标时,你可以将其视为|G弹幕战|r效果;你的回合外,你可以将一张手牌当做|G弹幕|r使用或打出。' def clickable(game): me = game.me if my_turn(): return False if not (me.cards or me.showncards): return False try: act = game.action_stack[-1] return act.cond([build_handcard(cards.AttackCard)]) except: pass
# -*- coding: utf-8 -*- # -- stdlib -- # -- third party -- # -- own -- from thb import characters from thb.ui.ui_meta.common import card_desc, gen_metafunc, passive_clickable from thb.ui.ui_meta.common import passive_is_action_valid from utils import BatchList # -- code -- __metaclass__ = gen_metafunc(characters.shizuha) class AutumnWindEffect: def effect_string(act): return u'|G秋风|r带走了|G【%s】|r的%s。' % ( act.target.ui_meta.name, card_desc(act.card), ) class AutumnWindAction: def effect_string_before(act): tl = BatchList(act.target_list) return u'当|G秋风|r吹起,|G【%s】|r连牌都拿不住的时候,才回想起,妈妈说的对,要穿秋裤。' % ( u'】|r、|G【'.join(tl.ui_meta.name), )
# -*- coding: utf-8 -*- # -- stdlib -- import random # -- third party -- # -- own -- from thb import actions, cards, characters from thb.actions import ttags from thb.ui.ui_meta.common import build_handcard, gen_metafunc, my_turn # -- code -- __metaclass__ = gen_metafunc(characters.nitori) class Dismantle: # Skill name = u'拆解' description = u'出牌阶段限一次,你可以|B重铸|r一名其他角色装备区里的一张装备牌,然后该角色摸一张牌。' def clickable(g): if ttags(g.me)['dismantle']: return False return my_turn() def is_action_valid(g, cl, tl): if cl[0].associated_cards: return (False, u'请不要选择牌!') if not len(tl):
# -*- coding: utf-8 -*- # -- stdlib -- # -- third party -- # -- own -- from thb import characters from thb.ui.ui_meta.common import gen_metafunc, passive_clickable, passive_is_action_valid # -- code -- __metaclass__ = gen_metafunc(characters.mokou) class Mokou: # Character name = u'藤原妹红' title = u'FFF团资深团员' illustrator = u'六仔OwO' cv = u'小羽' port_image = u'thb-portrait-mokou' figure_image = u'thb-figure-mokou' miss_sound_effect = u'thb-cv-mokou_miss' class Ashes: # Skill name = u'浴火' description = u'结束阶段开始时,你可以失去1点体力,然后摸两张牌。' clickable = passive_clickable is_action_valid = passive_is_action_valid
# -*- coding: utf-8 -*- # -- stdlib -- import random # -- third party -- # -- own -- from thb import characters from thb.ui.ui_meta.common import gen_metafunc, passive_is_action_valid, passive_clickable # -- code -- __metaclass__ = gen_metafunc(characters.reisen) class Reisen: # Character name = u'铃仙' title = u'永琳的首席药品品尝官' illustrator = u'镜_Area@幻想梦斗符' cv = u'小羽' port_image = u'thb-portrait-reisen' figure_image = u'thb-figure-reisen' miss_sound_effect = u'thb-cv-reisen_miss' class ReisenKOF: # Character name = u'铃仙' title = u'永琳的首席药品品尝官'
# -*- coding: utf-8 -*- from __future__ import absolute_import # -- stdlib -- # -- third party -- # -- own -- from thb import thbnewbie from thb.ui.ui_meta.common import gen_metafunc # -- code -- __metaclass__ = gen_metafunc(thbnewbie) class THBattleNewbie: name = u'琪露诺的完美THB教室' logo = 'thb-modelogo-newbie' params_disp = {} description = (u'|R游戏人数|r:1人+1NPC。\n' u'\n' u'|G游戏目标|r:让琪露诺带你飞。\n' u'\n' u'|G胜利条件|r:完整地完成教学,不掉线。\n' u'\n').strip() def ui_class(): from thb.ui.view import THBattleNewbieUI return THBattleNewbieUI T = thbnewbie.Identity.TYPE identity_table = { T.HIDDEN: u'?',
# -*- coding: utf-8 -*- # -- stdlib -- # -- third party -- # -- own -- from thb import characters from thb.actions import ttags from thb.ui.ui_meta.common import gen_metafunc, my_turn, passive_clickable from thb.ui.ui_meta.common import passive_is_action_valid # -- code -- __metaclass__ = gen_metafunc(characters.satori20150804) class MindReadLimit: target_independent = True shootdown_message = u'【读心】你不能使用明牌区的黑色牌' class MindRead: name = u'读心' description = u'出牌阶段限一次,你可以将一名角色的一张手牌置于明牌区,且该角色当前回合内无法使用明牌区的黑色牌。' def clickable(game): me = game.me return my_turn() and not ttags(me)['mind_read'] def is_action_valid(g, cl, tl): if len(tl) != 1: return (False, u'请选择读心对象…')
# -*- coding: utf-8 -*- # -- stdlib -- # -- third party -- # -- own -- from thb import actions, cards, characters from thb.ui.ui_meta.common import gen_metafunc, passive_clickable, passive_is_action_valid # -- code -- __metaclass__ = gen_metafunc(characters.kogasa) class Jolly: # Skill name = u'愉快' description = u'|B锁定技|r,摸牌阶段摸牌后,你令一名角色摸一张牌。' clickable = passive_clickable is_action_valid = passive_is_action_valid class JollyDrawCard: def effect_string(act): return u'|G【%s】|r高兴地让|G【%s】|r摸了%d张牌~' % ( act.source.ui_meta.name, act.target.ui_meta.name, act.amount, ) def sound_effect(act): return 'thb-cv-kogasa_jolly'
# -*- coding: utf-8 -*- # -- stdlib -- # -- third party -- # -- own -- from thb import characters from thb.ui.ui_meta.common import gen_metafunc, passive_clickable, passive_is_action_valid # -- code -- __metaclass__ = gen_metafunc(characters.tewi) class Luck: # Skill name = u'幸运' description = u'|B锁定技|r,每当你失去最后的手牌时,你摸两张牌。' clickable = passive_clickable is_action_valid = passive_is_action_valid class LuckDrawCards: def effect_string(act): return u'|G【%s】|r觉得手上没有牌就输了,于是又摸了2张牌。' % (act.source.ui_meta.name, ) def sound_effect(act): return 'thb-cv-tewi_lucky' class Tewi: # Character
# -*- coding: utf-8 -*- # -- stdlib -- # -- third party -- # -- own -- from thb import characters from thb.ui.ui_meta.common import gen_metafunc, passive_clickable, passive_is_action_valid # -- code -- __metaclass__ = gen_metafunc(characters.tewi) class Luck: # Skill name = u'幸运' description = u'|B锁定技|r,每当你失去最后的手牌时,你摸两张牌。' clickable = passive_clickable is_action_valid = passive_is_action_valid class LuckDrawCards: def effect_string(act): return u'|G【%s】|r觉得手上没有牌就输了,于是又摸了2张牌。' % ( act.source.ui_meta.name, ) def sound_effect(act): return 'thb-cv-tewi_lucky'
# -*- coding: utf-8 -*- # -- stdlib -- import time # -- third party -- # -- own -- from thb import actions, characters from thb.ui.ui_meta.common import gen_metafunc, passive_clickable, passive_is_action_valid # -- code -- __metaclass__ = gen_metafunc(characters.rinnosuke) class Netoru: # Skill name = u'寝取' description = u'出牌阶段限一次,你可以弃置两张手牌并指定一名已受伤的其他角色,你与其各回复1点残机' def clickable(game): me = game.me try: if me.tags['netoru_tag'] >= me.tags['turn_count']: return False act = game.action_stack[-1] if isinstance(act, actions.ActionStage): return True except IndexError: pass return False
# -*- coding: utf-8 -*- from __future__ import absolute_import # -- stdlib -- # -- third party -- # -- own -- from thb import cards, thbidentity from thb.actions import ttags from thb.ui.ui_meta.common import card_desc, gen_metafunc, my_turn, passive_clickable from thb.ui.ui_meta.common import passive_is_action_valid # -- code -- __metaclass__ = gen_metafunc(thbidentity) class THBattleIdentity: name = u'8人身份场' logo = 'thb-modelogo-8id' description = ( u'|R游戏人数|r:8人\n' u'\n' u'|R身份分配|r:1|!RBOSS|r、2|!O道中|r、1|!G黑幕|r、4|!B城管|r\n' u'\n' u'|!RBOSS|r:|!RBOSS|r的体力上限+1。游戏开局时展示身份,并获得BOSS技。胜利条件为击坠所有|!B城管|r以及|!G黑幕|r。\n' u'\n' u'|!O道中|r:胜利条件为击坠所有|!B城管|r以及|!G黑幕|r。\n' u'\n' u'|!B城管|r:胜利条件为击坠|!RBOSS|r。当|!B城管|r被击坠时,击坠者摸3张牌。\n' u'\n' u'|!G黑幕|r:胜利条件为在|!B城管|r全部被击坠的状况下击坠|!RBOSS|r。\n'
# -*- coding: utf-8 -*- from __future__ import absolute_import # -- stdlib -- from collections import OrderedDict # -- third party -- # -- own -- from thb import thb2v2 from thb.ui.ui_meta.common import gen_metafunc # -- code -- __metaclass__ = gen_metafunc(thb2v2) class THBattle2v2: name = u'2v2模式' logo = 'thb-modelogo-2v2' description = ( u'|R游戏人数|r:4人\n' u'\n' u'|G座次|r:\n' u'创建房间时可选固定阵容或随机阵容。\n' u'Roll点,由点数最高的玩家为1号位,然后对面点数最大的为2号位,按1-2-2-1的顺序逆时针行动。\n' u'\n' u'|G选将|r:\n' u'从角色堆里选出20名角色,由1号位开始,每人选择Ban掉其中一个角色。\n' u'每人随机从剩下的卡牌中获得4张角色卡作为备选(其中一张为阿卡林)\n' u'玩家可以选择其中一名角色进行游戏\n' u'\n'
# -*- coding: utf-8 -*- # -- stdlib -- # -- third party -- # -- own -- from thb import characters from thb.ui.ui_meta.common import gen_metafunc, passive_clickable from thb.ui.ui_meta.common import passive_is_action_valid # -- code -- __metaclass__ = gen_metafunc(characters.medicine) class Medicine: # Character name = u'梅蒂欣' title = u'小小的甜蜜毒药' illustrator = u'和茶' cv = u'VV' port_image = u'thb-portrait-medicine' figure_image = u'thb-figure-medicine' miss_sound_effect = u'thb-cv-medicine_miss' notes = u'|RKOF不平衡角色|r' class Ciguatera: # Skill name = u'神经之毒' description = u'一名角色准备阶段开始时,你可以弃置一张黑色牌,令其失去1点残机并获得“喝醉”状态。'
# -*- coding: utf-8 -*- from __future__ import absolute_import, division, print_function, unicode_literals # -- stdlib -- import random # -- third party -- # -- own -- from thb import characters from thb.actions import ttags from thb.ui.ui_meta.common import card_desc, gen_metafunc, my_turn, passive_clickable from thb.ui.ui_meta.common import passive_is_action_valid # -- code -- __metaclass__ = gen_metafunc(characters.keine) class Teach: # Skill name = '授业' description = ('出牌阶段限一次,你可以重铸一张牌,然后将一张牌交给一名其它角色,其选择一项:' '|B|R>> |r使用一张牌,|B|R>> |r重铸一张牌。') def clickable(g): return my_turn() and not ttags(g.me)['teach_used'] def is_action_valid(g, cl, tl): cards = cl[0].associated_cards if not cards or len(cards) != 1: return False, '请选择一张牌(重铸)'
# -*- coding: utf-8 -*- # -- stdlib -- import random # -- third party -- # -- own -- from thb import characters from thb.ui.ui_meta.common import G, card_desc, gen_metafunc, passive_clickable from thb.ui.ui_meta.common import passive_is_action_valid # -- code -- __metaclass__ = gen_metafunc(characters.alice) class Alice: # Character name = u'爱丽丝' title = u'七色的人偶使' illustrator = u'霏茶' cv = u'小舞' port_image = 'thb-portrait-alice' figure_image = 'thb-figure-alice' miss_sound_effect = 'thb-cv-alice_miss' class LittleLegion: # Skill name = u'小小军势'
# -*- coding: utf-8 -*- # -- stdlib -- # -- third party -- # -- own -- from thb import actions, cards, characters from thb.ui.ui_meta.common import gen_metafunc, limit1_skill_used # -- code -- __metaclass__ = gen_metafunc(characters.eirin) class FirstAid: # Skill name = u"急救" description = u"你可以将一张红色牌当|G麻薯|r对濒死角色使用。" def clickable(game): try: act = game.action_stack[-1] except IndexError: return False if isinstance(act, cards.AskForHeal): return True return False def is_complete(g, cl): skill = cl[0] acards = skill.associated_cards
# -- stdlib -- from functools import wraps import logging # -- third party -- # -- own -- from game.autoenv import Game from thb import actions as thbactions, cards as thbcards, inputlets from thb.ui.ui_meta.common import gen_metafunc # -- code -- log = logging.getLogger('Inputlets UI Meta') # -----BEGIN INPUTLETS UI META----- __metaclass__ = gen_metafunc(inputlets) class ActionDisplayResult(Exception): __slots__ = ( 'valid', 'prompt', 'pl_selecting', 'pl_disabled', 'pl_selected', ) def __init__(self, valid, prompt, pl_selecting, pl_disabled, pl_selected): Exception.__init__(self) self.valid = valid self.prompt = prompt
# -*- coding: utf-8 -*- # -- stdlib -- # -- third party -- # -- own -- from thb import actions, cards, characters from thb.ui.ui_meta.common import build_handcard, gen_metafunc, passive_clickable from thb.ui.ui_meta.common import passive_is_action_valid # -- code -- __metaclass__ = gen_metafunc(characters.meirin) class RiverBehind: # Skill name = u'背水' description = ( u'|B觉醒技|r,准备阶段开始时,若你残机数为全场最低或之一且不大于2时,你减1点残机上限并获得技能|R太极|r。\n' u'|B|R>> |b太极|r:你可将|G弹幕|r当|G擦弹|r,|G擦弹|r当|G弹幕|r使用或打出。') clickable = passive_clickable is_action_valid = passive_is_action_valid class Taichi: # Skill name = u'太极' description = u'你可将|G弹幕|r当|G擦弹|r,|G擦弹|r当|G弹幕|r使用或打出。' def clickable(game): try:
# -*- coding: utf-8 -*- from __future__ import absolute_import # -- stdlib -- import random # -- third party -- # -- own -- from thb import characters from thb.ui.ui_meta.common import gen_metafunc, passive_clickable, passive_is_action_valid # -- code -- __metaclass__ = gen_metafunc(characters.momiji) class Momiji: # Character name = u'犬走椛' title = u'山中的千里眼' illustrator = u'和茶' cv = u'简翎' port_image = 'thb-portrait-momiji' figure_image = 'thb-figure-momiji' miss_sound_effect = 'thb-cv-momiji_miss' class Sentry: # Skill name = u'哨戒' description = u'你攻击范围内的一名其它角色的出牌阶段开始时,你可以对其使用一张|G弹幕|r。'
# -*- coding: utf-8 -*- from __future__ import absolute_import # -- stdlib -- import random # -- third party -- # -- own -- from thb import actions, cards, characters from thb.ui.ui_meta.common import card_desc, gen_metafunc, limit1_skill_used, passive_clickable from thb.ui.ui_meta.common import passive_is_action_valid # -- code -- __metaclass__ = gen_metafunc(characters.reimu) class Flight: # Skill name = u'飞行' clickable = passive_clickable is_action_valid = passive_is_action_valid class SpiritualAttack: name = u'灵击' def clickable(g): me = g.me if not (me.cards or me.showncards): return False
# -*- coding: utf-8 -*- # -- stdlib -- # -- third party -- # -- own -- from thb import cards, characters from thb.ui.ui_meta.common import gen_metafunc, passive_clickable, passive_is_action_valid # -- code -- __metaclass__ = gen_metafunc(characters.nazrin) class Nazrin: # Character name = u'纳兹琳' title = u'探宝的小小大将' illustrator = u'月见' cv = u'小羽' port_image = u'thb-portrait-nazrin' figure_image = u'thb-figure-nazrin' miss_sound_effect = u'thb-cv-nazrin_miss' class NazrinKOF: # Character name = u'纳兹琳' title = u'探宝的小小大将' illustrator = u'月见' cv = u'小羽'
# -*- coding: utf-8 -*- # -- stdlib -- # -- third party -- # -- own -- from thb import actions, cards from thb.actions import ttags from thb.ui.ui_meta.common import G, gen_metafunc # -- code -- __metaclass__ = gen_metafunc(cards) class AttackCard: # action_stage meta image = 'thb-card-attack' name = u'弹幕' description = ( u'|R弹幕|r\n\n' u'出牌阶段,消耗1点干劲,对你攻击范围内的一名其他角色使用,对该角色造成1点伤害。\n' u'|B|R>> |r默认情况下,你的攻击范围是1。\n' u'|B|R>> |r干劲在出牌阶段开始时恢复成1点。\n' u'\n' u'|DB(画师:霏茶,CV:VV)|r' ) def is_action_valid(g, cl, target_list): if not target_list: return (False, u'请选择弹幕的目标') return (True, u'来一发!')
# -*- coding: utf-8 -*- # -- stdlib -- # -- third party -- # -- own -- from thb import characters from thb.ui.ui_meta.common import gen_metafunc, passive_clickable, passive_is_action_valid # -- code -- __metaclass__ = gen_metafunc(characters.flandre) class Flandre: # Character name = u'芙兰朵露' title = u'恶魔之妹' illustrator = u'月见' cv = u'shourei小N' port_image = u'thb-portrait-flandre' figure_image = u'thb-figure-flandre' miss_sound_effect = u'thb-cv-flandre_miss' class CriticalStrike: # Skill name = u'狂咲' description = ( u'摸牌阶段,你可以少摸一张牌,若如此做,你获得以下效果直到回合结束:\n' u'|B|R>> |r当你没有干劲时,你可以对本阶段内没有成为过|G弹幕|r目标的其他角色使用|G弹幕|r。\n' u'|B|R>> |r你为伤害来源的|G弹幕|r和|G弹幕战|r造成的伤害+1。'
# -*- coding: utf-8 -*- # -- stdlib -- # -- third party -- # -- own -- from thb import cards from thb.ui.ui_meta.common import gen_metafunc # -- code -- __metaclass__ = gen_metafunc(cards) class CardList: lookup = { 'cards': u'手牌区', 'showncards': u'明牌区', 'equips': u'装备区', 'fatetell': u'判定区', 'faiths': u'信仰', # for skills 'yukari_dimension': u'隙间', 'meirin_qiliao': u'气', 'momiji_sentry_cl': u'哨戒', } class HiddenCard: # action_stage meta image = 'thb-card-hidden' name = u'隐藏卡片'
# -*- coding: utf-8 -*- from __future__ import absolute_import # -- stdlib -- # -- third party -- # -- own -- from thb import thb3v3 from thb.ui.ui_meta.common import gen_metafunc # -- code -- __metaclass__ = gen_metafunc(thb3v3) class THBattle: name = u'3v3模式' logo = 'thb-modelogo-3v3' description = (u'|R游戏人数|r:6人。\n' u'\n' u'阵营分为|!B博丽|r和|!O守矢|r,每个阵营3名玩家,交错入座。\n' u'由ROLL点最高的玩家开始,按照顺时针1-2-2-1的方式,从20个角色中进行公开、排他的选择。\n' u'角色选择完成后,由ROLL点最高的玩家开始行动。\n' u'ROLL点最高的玩家开局摸3张牌,其余玩家开局摸4张牌。\n' u'\n' u'|R胜利条件|r:击坠对方阵营所有角色。') params_disp = { 'random_seat': { 'desc': u'随机座位阵营', 'options': [ (u'固定', False), (u'随机', True), ],
# -*- coding: utf-8 -*- # -- stdlib -- # -- third party -- # -- own -- from thb import actions, characters from thb.ui.ui_meta.common import card_desc, gen_metafunc, passive_clickable from thb.ui.ui_meta.common import passive_is_action_valid # -- code -- __metaclass__ = gen_metafunc(characters.kanako) class Kanako: # Character name = u'八坂神奈子' title = u'山丘与湖泊的化身' illustrator = u'和茶' cv = u'北斗夜/VV' port_image = u'thb-portrait-kanako' figure_image = u'thb-figure-kanako' miss_sound_effect = u'thb-cv-kanako_miss' notes = u'|RKOF模式不可用|r' class KanakoKOF: # Character name = u'八坂神奈子' title = u'山丘与湖泊的化身'
# -*- coding: utf-8 -*- from __future__ import absolute_import # -- stdlib -- import random # -- third party -- # -- own -- from thb import characters from thb.ui.ui_meta.common import gen_metafunc, my_turn, passive_clickable, passive_is_action_valid # -- code -- __metaclass__ = gen_metafunc(characters.remilia) class SpearTheGungnir: # Skill name = u'神枪' description = ( u'满足下列条件之一时,你可以令你的|G弹幕|r不能被响应:\n' u'|B|R>> |r目标角色的体力值 大于 你的体力值。\n' u'|B|R>> |r目标角色的手牌数 小于 你的手牌数。' ) clickable = passive_clickable is_action_valid = passive_is_action_valid class SpearTheGungnirAction: def effect_string(act): return u'|G【%s】|r举起右手,将|G弹幕|r汇聚成一把命运之矛,向|G【%s】|r掷去!' % (
# -*- coding: utf-8 -*- from __future__ import absolute_import, division, print_function, unicode_literals # -- stdlib -- import random # -- third party -- # -- own -- from thb import characters from thb.actions import ttags from thb.ui.ui_meta.common import gen_metafunc, my_turn, passive_clickable, passive_is_action_valid # -- code -- __metaclass__ = gen_metafunc(characters.yuyuko) class Yuyuko: # Character name = '西行寺幽幽子' title = '幽冥阁楼的吃货少女' illustrator = '和茶' cv = 'VV' port_image = 'thb-portrait-yuyuko' figure_image = 'thb-figure-yuyuko' miss_sound_effect = 'thb-cv-yuyuko_miss' notes = u'|RKOF不平衡角色'
# -*- coding: utf-8 -*- from __future__ import absolute_import # -- stdlib -- # -- third party -- # -- own -- from thb import thbfaith from thb.ui.ui_meta.common import gen_metafunc # -- code -- __metaclass__ = gen_metafunc(thbfaith) class THBattleFaith: name = u'信仰争夺战' logo = 'thb-modelogo-faith' description = ( u'|R游戏人数|r:6人。\n' u'\n' u'|G游戏开始|r:游戏开始时,随机向在场玩家分配6张身份牌:3|!B博丽|r,3|!O守矢|r,双方对立。若出现同一方阵营座次连续三人的情况,则第三人须与下一名座次的玩家交换身份牌。\n' u'\n' u'|G角色选择|r:共发给每人4张角色牌,其中一张为暗置。每名玩家选择其中一张作为出场角色,再选择一张作为备用角色(不得查看暗置角色牌)。每方阵营将三张备用角色牌置于一旁作为备用角色。\n' u'\n' u'|G游戏开始|r:游戏开始时,所有角色摸4张牌,此时除首先行动的玩家均可以进行一次弃置4张牌并重新摸4张牌的操作。\n' u'\n' u'|G角色更新|r:当一名角色被击坠时,弃置该角色全部区域内的所有牌。从剩余的备用角色中选择一名作为出场角色并明示之,之后摸4张牌。此时该角色可以弃置全部的4张牌并重新摸4张牌。击坠不执行任何奖惩。\n' u'\n' u'|G胜负条件|r:当一方累计被击坠角色数到达三名,或投降时,该方判负。' ) params_disp = {
# -*- coding: utf-8 -*- # -- stdlib -- import random # -- third party -- # -- own -- from thb import characters from thb.ui.ui_meta.common import gen_metafunc, passive_clickable, passive_is_action_valid # -- code -- __metaclass__ = gen_metafunc(characters.patchouli) class Library: # Skill name = u'图书' description = u'|B锁定技|r,每当你使用非延时符卡时,你摸一张牌;你使用符卡无距离限制。' clickable = passive_clickable is_action_valid = passive_is_action_valid class LibraryDrawCards: def effect_string(act): return u'|G【%s】|r发动了|G图书|r技能,摸1张牌。' % ( act.source.ui_meta.name, ) def sound_effect(act): return random.choice([