Qsgs-Fans / FreeKill

Sanguosha (三国杀, a.k.a. Legend of Three Kingdoms, LTK) written in Qt and Lua.
https://fkbook-all-in-one.readthedocs.io/
GNU General Public License v3.0
397 stars 58 forks source link

-1: 控制卡面是否可见的状态技 #376

Open Notify-ctrl opened 5 days ago

Notify-ctrl commented 5 days ago

如题,现在Client中的卡牌信息全部透明,不会出现莫名其妙的-1了,那么在UI中显示卡背与否就成了问题。

我的想法是启动一个状态技,比如叫CardVisibleSkill之类的。

某个作为默认判断Lua函数接收cardId和moveStruct为参数,返回所有可见该id的Player[]:

若在移动中且指定moveVisible,听他的
若在牌堆,大家都不可见;
若在弃牌堆、处理区、除外、装备区、判定区,大家都可见;
若在手里,仅自己可见,以及controller也可见,但旁观者不可见;
若在Special区,大家都可见

状态技的那个函数返回true,false,nil三种值

YoumuKon commented 5 days ago
  1. shown === false就应该显示卡背(以准确反映可见信息),如果要引入lua函数的话最好事前就判断shown值应该是什么样的
  2. Special区分为“扣置于”和“置于”,二者对应的shown是false和true
  3. 如果要搞状态技的话,需要一个检测时机:
    • 如果这个时机能影响牌堆(@TouhouSatsu神圣白莲),是否意味着有必要穷举整个牌堆?
    • 如果不考虑上文(毕竟是DIY),那要检测哪些区域?
Notify-ctrl commented 5 days ago
  1. shown === false就应该显示卡背(以准确反映可见信息),如果要引入lua函数的话最好事前就判断shown值应该是什么样的

卡背那个有个known参数了(起名好TM乱) 反正有个那个参数

2. Special区分为“扣置于”和“置于”,二者对应的shown是false和true

状态技吧

3. 如果要搞`状态技`的话,需要一个检测时机:

检测的时机:当QML即将绘制一张卡并且它的shown === false时

YoumuKon commented 5 days ago

卡背那个有个known参数了(起名好TM乱) 反正有个那个参数

那这两个参数有什么区别呢?为什么要新建一个shown呢?

2. Special区分为“扣置于”和“置于”,二者对应的shown是false和true

状态技吧

这样的话一个私人牌堆就要一个对应的状态技……确定不会造成技能数膨胀?

Notify-ctrl commented 5 days ago
  1. 我不知道 可能known参数确实没用了

  2. 那就在某处给special挂个属性呗

Notify-ctrl commented 4 days ago

Qsgs-Fans/freekill-core@0bdf6feb2c8cddf151fbaafcc3d3085e6521a9fa

搞了个壳子,但是其实问题还有很多,因为是从UI绘制卡牌时调用的可见性函数,想让它携带一个cardMoveStruct还得想办法,UI的代码不可能保存moveStruct

至于在何处计算,似乎从InvisibleCardArea里面remove牌时发生绘制的时候可以调用;或者像上文一样给CardItem贴属性,CardItem根据有无属性计算,可惜从QML调用的话传参只能传一个cid进去而已,别的参想办法放在别的某处

Notify-ctrl commented 4 days ago

影响的时机好像就两个吧:

而绘制CardItem分为:

而CardItem的known属性默认为true,这就排除了卡牌一览。我的看法:

Notify-ctrl commented 4 days ago

Qsgs-Fans/freekill-core@e445e0080c94d20b5045cfb2b54ee857590555a0

已经完成最基本的判断并应用到了Client:moveCards中。现在需要解决过河顺手等框(某个askFor里面画那个框的函数)以及pile里面牌对他人的可见性

YoumuKon commented 4 days ago

我不知道 可能known参数确实没用了

我有一计:要不我们把known重命名为shown(

PopupBox和标记详情时,发起者是QML,Lua提供一个function(cid)的函数计算可见性

PopupBox和标记详情终究要调用lua函数(甚至PopupBox的参数还是lua传入的),那为什么不直接往PopupBox那里传可见信息呢?(如观看其手牌并选择和选择其手牌,这两个对于可见性有更提前的要求)

Notify-ctrl commented 4 days ago

往PopupBox直接传可见data也行,但是从UI(比如某人标记区或者pile区)直接点击的话就不行了,还是得有两手准备(反正从qml调用lua无非就是直接套壳一下Player:cardVisible)

YoumuKon commented 4 days ago
  1. visibility_skill有点倒反天罡了,建议将文件名改成visibility
  2. 理论上来说技能有以下可能:

    • 某个理应不可见的牌始终可见
    • 某个理应可见的牌始终不可见

    请指示以下冲突情况的处理:

    1. 两个技能对同一张牌给出两个相反意见,应该使用哪一个技能的值?
    2. 是否允许理应可见的牌始终可见、理应不可见的牌始终不可见的情况?
    3. 技能先于“公共区域判断”还是滞后于?
Notify-ctrl commented 4 days ago

去群里问问吧,我还真不知道多个状态技冲突了怎么办。也许只要出现了不为nil的状态技返回值就别判其他的?