合约需要的变量跟功能
变量
- 系统
- 船班
- 编号
- 入场金
- 起始区块
- 等候报名时间(等候几个区块)
- 游戏时间(历经几个区块),ex:如果起始区块是100000,等候360个区块,游戏360个区块,意味着从100000起,等候360个区块进入游戏,再经过360区块后结束游戏,并进入等候状态,但实际上游戏开始后,玩家就可以报名下一个游戏,也就是说这样就有720区块的等候时间
- 船只
- 船只编号(起始时间,结束时间,利用船班编号+船只编号去推算)
- 所属船班编号
- 状态: 是否结算
- 卡牌数量(三种牌分开计,考量到如果是Mapping,只能用Key找值,卡牌的key是hash,只改变计数比较省gas)
- 玩家数量
- Table 数量
- Table
- Table编号
- 第一组Hash
- 第一组明文
- 第二组Hash
- 第二组明文
- 是否结束
- 玩家
- 玩家钱包地址
- TG ID
- 星星数量
- 状态(游戏中,0星出局,犯规出局,胜,负)
- 卡牌
- 卡牌HASH
- 归属船班+船只
- 归属玩家
- 是否有效(玩过会被作废)
- 交易厅
- 交易编号
- 第一组Hash,原本归属钱包地址
- 第二组Hash,原本归属钱包地址
- 全局玩家清单,可被外部调用(为了要设计新的游戏,败场大于胜场多少比例的人才能参加败部复活赛)
- 玩家钱包地址
- 胜数(不是Table,是船只最后的胜利)
- 败数
功能
- 所有变数都要提供read的public
- 设定船班的功能(船班表)OwnerOnly
- 设定系统参数 OwnerOnly
- 创建船只
- 玩家报名
- 初始化玩家资料(星星数量,状态)
- 前端产生12组牌跟hash,hash存入玩家的资料中
- 存入TG ID
- 检查出牌的hash是否合规
- 检查该局中hash是否在船只登记的清单内
- 是否还没被使用
- 明文检查
- 玩家贴入明文后,确认牌跟Hash一致,不一致则违规出局!丧失资格
- 创建Table
- 检查船只是否结算,已结算则无法进行
- 当前有效的Table如果大于存活人数的一半,则无法再新增Table
- 创建Table的玩家需要提交手上有效的卡牌Hash,无效hash则无法送出
- 加入Table
- 检查船只是否结算,已结算则无法进行
- 针对生效中的Table,提交有效的卡牌hash,提交前需要检查hash是否有效
- 提交明文
- 两人中第一个提交明文,检查明文是否符合Hash
- 第二个提交明文,检查明文是否符合Hash,并结算Table
- 结算Table后,胜者加一颗星星
- 扣除船只上的牌型计数
- 交换牌的归属
- 检查船只是否结算,已结算则无法进行
- 检查hash是否有效,无效则无法进行
- 交易厅完成两个hash上传后,两边归属交换
- 结算当前船只进度
- 检查是否符合结算条件
- 结算人员胜败跟金额(必须手上没有剩牌,且剩下超过3颗星)
- 如果时间到了,但有Table没有完结,视同手上还有牌,都出局
- 分配金额(按照胜者的星星总数评分)
- 庄家抽成储存到指定合约地址的功能 OwnerOnly(后续设计败部复活赛用)