// Copyright Fuzamei Corp. 2018 All Rights Reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

package executor

/*
区块链游戏：竞猜

一、玩法简介：
博彩平台的管理员可以发布竞猜游戏，玩家可以对竞猜游戏进行投注.
截止投注时间达到后，管理员改变游戏状态为停止投注状态，玩家不能再进行投注，等待管理员公布结果.
竞猜内容的结果出来以后，管理员根据竞猜内容的真实结果触发智能合约进行输赢判断及结算。

二、创建及参与游戏
1、游戏管理员创建一局竞猜游戏时，可以设定竞猜内容，选项，赌注类型、大小及上限，截止区块高度等，比如竞猜一场足球比赛的结果，每注10BTY，单次最多可下100注，比赛开始前2小时截止投注(换算成游戏创建后多少个区块)。
2、玩家按规则进行投注，如果已过截止高度或者游戏状态已经被管理员修改为停止投注状态，则不能继续投注。

三、制胜策略
1、竞猜游戏对应的现实世界的结果出来以后，游戏管理员向区块链合约公布胜出的竞猜选项。
2、合约将投注的所有赌注向压注正确选项的玩家进行分配，分配原则根据每个地址实际投注的数额占比进行分配，比如一个地址投注占了正确选项投注总额的1/2，则该地址将获得所有赌注总额的1/2。
3、如果因为现实世界的突发异常导致竞猜不能继续（比如某场足球比赛因为不可抗力取消了，比如自然灾害、政治事件等），则管理员可以终止竞猜，合约将把所有地址的投注返还。
4、在分配奖金前，合约将向开发者地址和平台地址按预定的比率收取手续费，奖励给开发者和平台，剩余奖金在圣者之间分配。

四、游戏过程和状态
1、创建游戏，一个地址可以作为本局竞猜游戏的管理员发起竞猜游戏。
2、管理员创建游戏时指定
   竞猜的内容（比如：未来的一场足球比赛）、
   选项（比如：A队赢或者B队赢或者打平）、
   赌注类型（比如BTY）、
   单注大小（比如5BTY）、
   单次最多可下注数量（比如100个BTY）、
   截止下注高度（从创建游戏的高度算起，比如：区块高度差500000）
   游戏超时高度（从创建游戏的高度算起，比如：区块高度差1000000）
   可下注的最大数量（比如20000个BTY）
3、截止下注高度之前，玩家可根据游戏要求进行下注，下注金额注入合约地址。如果投注数量已经超过上限，则不允许新的投注。
4、截止下注高度达到后，玩家不可再下注。或者管理员将游戏状态设定为停止投注状态。
5、现实世界的竞猜结果出现后，管理员在游戏超时时间之前公布游戏结果。
6、（１）合约先对所有赌注收取一定比例的佣金，比如５‰给开发者地址，５‰给平台地址，（２）合约根据管理员输入的正确结果，对每个投注地址进行输赢判断，并将提取佣金后的剩余所有赌注对所有竞猜正确的地址按各自的投注额占比进行比例分配（比如Ａ选项正确，所有选Ａ的赌注共10000个BTY，某个地址向Ａ下注100BTY，则该地址分得1/100）。
7、如果因为现实世界的突发异常导致竞猜不能继续（比如某场足球比赛因为不可抗力取消了），则管理员可以终止竞猜，合约将把所有地址的投注返还。
8、如果游戏超时，管理员仍未公布结果，则任何地址都可以触发合约异常终止竞猜，合约中的投注返还给原投注地址。
8、游戏状态：
   start(管理员)->bet(玩家)->stopbet(管理员)->publish(管理员)
   start(管理员)->bet(玩家)->stopbet(管理员)->abort(管理员)
   start(管理员)->bet(玩家)->abort(管理员)
   start(管理员)->abort(管理员)
   start(管理员)->bet(玩家)->stopbet(管理员)->timeout->abort(任何人)
   start(管理员)->bet(玩家)->timeout->abort(任何人)
   start(管理员)->timeout->abort(任何人)
   start(管理员)->stopbet(管理员)->publish(管理员)
   start(管理员)->bet(玩家)->publish(管理员)
   start(管理员)->publish(管理员)

   说明：这里的管理员不是特殊地址，而是谁创建本局竞猜游戏，谁就是本局竞猜游戏的管理员。
*/
