askForUseCard的疑问
太阳神三国杀lua吧
全部回复
仅看楼主
level 6
最近在写一个技能【天韵:当你受到伤害后,你可以观看牌堆顶一张牌,然后立即使用之。】
技能效果基本上实现了,美中不足的是受伤后选择发动,还需要再点一次技能才能使用牌极不方便(后半部分是用视为技实现的)。
根据我参考的【礼让】和【流离】,前者发动技能后就可以立刻选牌分配,后者被指定后就可以立刻选牌使用流离的技能卡。
现在只能怀疑是使用askForUseCard函数时,可能有什么细节被我忽略了
楼下附上我的代码
2018年03月19日 05点03分 1
level 6
截图居然被吞了[啊]直接发出来吧[不高兴]
altianyunVS = sgs.CreateOneCardViewAsSkill{
name = "altianyun",
expand_pile = "#altianyun",
view_filter = function(self, card)
--使用过 filter_pattern = ".|.|.|#altianyun",结果什么牌都不能选
if not card or card:isKindOf("Jink") or card:isKindOf("Nullification") then return false end
return sgs.Self:getPile("#altianyun"):contains(card:getId())
end,
view_as = function(self, card)
return card
end,
--filter、feasible 应该不关键,此处参考了奇策和傲才
filter = function(self, targets, to_select, player)
local targetlist = sgs.PlayerList()
for i = 1, #targets do targetlist:append(targets[i]) end
local card = sgs.Sanguosha:getCard(self:getSubcards():first())
return card and card:targetFilter(targetlist, to_select, player) and not player:isProhibited(to_select, card, targetlist)
end ,
feasible = function(self, targets, player)
local targetlist = sgs.PlayerList()
for i = 1, #targets do targetlist:append(targets[i]) end
local card = sgs.Sanguosha:getCard(self:getSubcards():first())
return card:targetsFeasible(targetlist, player)
end,
enabled_at_play = function(self, player)
return false
end,
enabled_at_response = function(self, player, pattern)
return pattern:startsWith("@@altianyun_use")
end,
}
2018年03月19日 06点03分 3
level 6
altianyun = sgs.CreateTriggerSkill{
name = "altianyun",
relate_to_place = nil,
can_preshow = true,
frequency = sgs.Skill_NotFrequent,
view_as_skill = altianyunVS,
events = {sgs.Damaged},
can_trigger = function(self, event, room, player, data)
if not player or player:isDead() or not player:hasSkill(self:objectName()) then return false end
return self:objectName()
end,
on_cost = function(self, event, room, player, data)
if player:askForSkillInvoke(self:objectName(), data) then
room:broadcastSkillInvoke(self:objectName(), player)
return true
end
return false
end,
on_effect = function(self, event, room, player, data)
local ids = sgs.IntList()
ids:append(room:drawCard())
room:notifyMoveToPile(player, ids, "altianyun", sgs.Player_DrawPile, true, true) --参考礼让
local isUsed = room:askForUseCard(player, "@@altianyun_use", "@altianyun", -1, sgs.Card_MethodUse)
--视为技响应这个askForUseCar
--第二个参数试过 ".|.|.|#altianyun",也是什么牌都不能选
room:notifyMoveToPile(player, ids, "altianyun", sgs.Player_DrawPile, false, false)
if not isUsed then
room:returnToDrawPile(ids, false) --没有使用牌就放回牌堆顶
end
end,
}
2018年03月19日 06点03分 4
level 12
把@@altianyun_use改成@@altianyun_use!
感叹号是禁止取消的意思,但是实际上还是会有伪取消的情况发生
2018年03月19日 09点03分 5
刚刚试了一下,不行,pile同样不会显示,而且触发后连技能按钮都点不了了。我是希望触发后省去我需要再点一次技能按钮这步
2018年03月19日 11点03分
level 15
我记得有个参数可以让pile里的卡放在手牌里(类似木牛流马)
2018年03月20日 02点03分 7
pile以&开头在使用和打出时会被视为手牌,pile以%开头的话可以被其他人使用(陷嗣、弘法)。可惜我尝试了一下还是存在需要多点一下的麻烦操作[不高兴]
2018年03月20日 07点03分
加一个技能卡试试
2018年03月20日 08点03分
level 6
【天韵】现在的操作是这样的:受伤->是否发动【天韵】(是)->所有手牌变成无法选中状态,【天韵】技能按钮处于亮起状态,看不到“牌堆顶”的牌(天韵牌)->点击【天韵】按钮->天韵牌移入手牌区,此牌可选中->使用天韵牌。
显然,点击【天韵】按钮这步完全是可以跳过的,否则用户体验极差。而【礼让】【流离】在技能触发后都是能直接选择牌视为发动技能卡,并不存在我需要点击按钮这步。[泪]
2018年03月20日 07点03分 8
level 12
问一下,立即使用的话,如果牌不能用呢?
2018年03月20日 08点03分 9
强制使用,不能取消?
2018年03月20日 08点03分
试着写了下,你可以参考参考 链接: htt[开心]ps://pan.baidu.co[开心]m/s/16wpS2A3BrU[开心]G0VUAhq0uEUg 密码: mgvg
2018年03月20日 08点03分
ai强制使用没写
2018年03月20日 08点03分
回复 ⚡腹黑康娜😈 :好的晚上回去我参考一下
2018年03月20日 10点03分
level 6
最初的问题解决了,我把@@altianyun_use改成@@altianyun。技能就会自动选中状态,不用点击直接选牌。
可能是函数askForUseCard的第二个参数指定响应的视为技时,会自动寻找@@后面的名称的视为技,然后让其亮起。由于我的视为技名称不是altianyun_use所以找不到才出现这个问题。
askForUseCard的这个细节分析给大家。[开心]
2018年03月20日 15点03分 10
代码别的地方的缺陷还很大[滑稽],比如把牌视作原本的牌使用(我无奈不能把牌指定一张特定的牌才这么做的,pattern似乎匹配不了id)。尝试参考楼上大佬的代码进行改进。[乖]
2018年03月20日 15点03分
level 15
tianyunVS = sgs.CreateOneCardViewAsSkill{
name = "tianyun",
filter_pattern = ".|.|.|&tian",
expand_pile = "&tian",
view_as = function(self, originalCard)
return originalCard
end,
enabled_at_play = function(self, player)
return false
end,
enabled_at_response = function(self, player, pattern)
return (pattern == "@@tianyun")
end
}
tianyun = sgs.CreateTriggerSkill{
name = "tianyun",
frequency = sgs.Skill_NotFrequent,
view_as_skill = tianyunVS ,
events = {sgs.Damaged},
on_trigger = function(self, event, player, data)
local room = player:getRoom()
if room:askForSkillInvoke(player, self:objectName(), data) then
local card_id = room:getNCards(1)
local card = sgs.Sanguosha:getCard(card_id:at(0))
player:addToPile("&tian", card_id)
if not (card:isKindOf("Jink") or card:isKindOf("Nullification")) then
if not room:askForUseCard(player, "@@tianyun", "@tianyun", -1, sgs.Card_MethodUse) then
local reason = sgs.CardMoveReason(sgs.CardMoveReason_S_REASON_PUT, player:objectName(), nil, "tianyun", nil)
room:moveCardTo(card, player, nil, sgs.Player_DrawPile, reason, true)
end
else
local reason = sgs.CardMoveReason(sgs.CardMoveReason_S_REASON_PUT, player:objectName(), nil, "tianyun", nil)
room:moveCardTo(card, player, nil, sgs.Player_DrawPile, reason, true)
end
end
end
}
我试了一下,这样好像可以(版本号20170211)
2018年03月20日 15点03分 11
1