278 lines
6.2 KiB
Go
278 lines
6.2 KiB
Go
package smallrocket
|
|
|
|
import (
|
|
"fmt"
|
|
"math"
|
|
"math/rand"
|
|
"mongo.games.com/game/srvdata"
|
|
"mongo.games.com/goserver/core/logger"
|
|
"strconv"
|
|
"time"
|
|
)
|
|
|
|
type Logic struct {
|
|
BoomMul float64
|
|
|
|
BombTimeToMulArr []*BombTimeToMul
|
|
BombMulToTimeArr []*BombMulToTime
|
|
}
|
|
|
|
func (this *Logic) init() {
|
|
if this.BombTimeToMulArr == nil {
|
|
this.BombTimeToMulArr = make([]*BombTimeToMul, 0)
|
|
}
|
|
|
|
if this.BombMulToTimeArr == nil {
|
|
this.BombMulToTimeArr = make([]*BombMulToTime, 0)
|
|
}
|
|
}
|
|
|
|
// 重置下注信息
|
|
func (this *Logic) ResetBetData(betData []*BetDataEx) {
|
|
if len(betData) >= 2 {
|
|
for i := 0; i < len(betData); i++ {
|
|
betData[i].Reset()
|
|
}
|
|
}
|
|
}
|
|
|
|
// 火箭爆炸倍数
|
|
func (l *Logic) CalBoomMul(e int) (float64, int) {
|
|
h := rand.Intn(e)
|
|
|
|
fh := float64(h)
|
|
fe := float64(e)
|
|
|
|
return math.Floor((96*fe)/(fe-fh)) / 100.00, h
|
|
}
|
|
|
|
// 火箭爆炸倍数
|
|
func (l *Logic) CalBoomTime(p int) float64 {
|
|
fp := float64(p)
|
|
//q := 100000000.00
|
|
pp := 400000.00
|
|
ppp := 20000.00
|
|
score := 0.0
|
|
for {
|
|
if pp+ppp > float64(SmallRocketBombRandomMulMaxE) {
|
|
pp += ppp * (fp - pp) / fp
|
|
score = fp / (fp - pp)
|
|
|
|
break
|
|
}
|
|
}
|
|
logger.Logger.Trace("score=", score)
|
|
return score
|
|
}
|
|
|
|
// 本局是否下注
|
|
func (l *Logic) IsCurRoundBet(betData []*BetDataEx) bool {
|
|
if len(betData) >= 2 {
|
|
if betData[0].IsCurBet || betData[1].IsCurBet {
|
|
return true
|
|
} else {
|
|
return false
|
|
}
|
|
}
|
|
return false
|
|
}
|
|
|
|
// 本局的子下注位置否下注
|
|
func (l *Logic) IsCurRoundBetPos(betData []*BetDataEx, betPos int64) bool {
|
|
if len(betData) >= 2 {
|
|
return betData[betPos].IsCurBet
|
|
}
|
|
return false
|
|
}
|
|
|
|
// 下一局位置否下注
|
|
func (l *Logic) IsNextRoundBet(betData []*BetDataEx) bool {
|
|
if len(betData) >= 2 {
|
|
if betData[0].IsNextBet || betData[1].IsNextBet {
|
|
return true
|
|
} else {
|
|
return false
|
|
}
|
|
}
|
|
return false
|
|
}
|
|
|
|
// 下一局的子下注位置否下注
|
|
func (l *Logic) IsNextRoundBetPos(betData []*BetDataEx, betPos int64) bool {
|
|
if len(betData) >= 2 && betPos <= 1 {
|
|
return betData[betPos].IsNextBet
|
|
}
|
|
return false
|
|
}
|
|
|
|
// 获取本局下注总金额
|
|
func (l *Logic) GetRoundBetCoin(betData []*BetDataEx) float64 {
|
|
if !l.IsCurRoundBet(betData) {
|
|
return 0
|
|
}
|
|
|
|
var retBetCoin float64 = 0
|
|
if len(betData) >= 2 {
|
|
if betData[0].IsCurBet {
|
|
retBetCoin += float64(betData[0].BetVal)
|
|
}
|
|
|
|
if betData[1].IsCurBet {
|
|
retBetCoin += float64(betData[1].BetVal)
|
|
}
|
|
}
|
|
|
|
return retBetCoin
|
|
}
|
|
|
|
// 本局金币收益
|
|
func (l *Logic) GetRoundGainCoin(betData []*BetDataEx, bombMul float64) float64 {
|
|
if !l.IsCurRoundBet(betData) {
|
|
return 0
|
|
}
|
|
|
|
var retGainCoin float64 = 0
|
|
if len(betData) >= 2 {
|
|
if betData[0].IsCurBet && !betData[0].IsTakeGain {
|
|
retGainCoin += float64(betData[0].BetVal) * (bombMul - 1.0)
|
|
}
|
|
|
|
if betData[1].IsCurBet && !betData[1].IsTakeGain {
|
|
retGainCoin += float64(betData[1].BetVal) * (bombMul - 1.0)
|
|
}
|
|
}
|
|
|
|
return retGainCoin
|
|
}
|
|
|
|
// 本局是否所有奖励都已领取
|
|
func (this *Logic) IsExistRoundTakenGain(betData []*BetDataEx) bool {
|
|
|
|
if len(betData) >= 2 {
|
|
if betData[0].IsCurBet && !betData[0].IsTakeGain {
|
|
return false
|
|
}
|
|
|
|
if betData[1].IsCurBet && !betData[1].IsTakeGain {
|
|
return false
|
|
}
|
|
}
|
|
return true
|
|
}
|
|
|
|
// 加载火箭时间和倍数数据
|
|
func (this *Logic) LoadCrashSearchData() {
|
|
|
|
dbItemArr := srvdata.PBDB_CrashSearchMgr.Datas.Arr
|
|
|
|
logger.Logger.Trace("(this *Logic) LoadCrashSearchData: dbItemArr.Len: ", len(dbItemArr))
|
|
if dbItemArr != nil {
|
|
if this.BombTimeToMulArr == nil {
|
|
this.BombTimeToMulArr = make([]*BombTimeToMul, 0, 5120)
|
|
}
|
|
|
|
if this.BombMulToTimeArr == nil {
|
|
this.BombMulToTimeArr = make([]*BombMulToTime, 0, 5120)
|
|
}
|
|
|
|
preTime := 0
|
|
preMul := 0
|
|
for _, dbItem := range dbItemArr {
|
|
|
|
this.BombTimeToMulArr = append(this.BombTimeToMulArr, &BombTimeToMul{int32(preTime), dbItem.GetTime(), dbItem.GetPrice()})
|
|
|
|
this.BombMulToTimeArr = append(this.BombMulToTimeArr, &BombMulToTime{int32(preMul), dbItem.GetPrice(), dbItem.GetTime()})
|
|
|
|
preTime = int(dbItem.GetTime())
|
|
preMul = int(dbItem.GetPrice())
|
|
|
|
}
|
|
|
|
logger.Logger.Trace("(this *Logic) LoadCrashSearchData: BombTimeToMulArr.Len: ", len(this.BombTimeToMulArr))
|
|
logger.Logger.Trace("(this *Logic) LoadCrashSearchData: BombMulToTimeArr.Len: ", len(this.BombMulToTimeArr))
|
|
}
|
|
}
|
|
|
|
// 通过火箭倍数找到火箭爆炸时间
|
|
func (this *Logic) GetBombTimeByBombMul(bombMulSearch int32) int32 {
|
|
|
|
//logger.Logger.Trace("(this *Logic) GetBombTimeByBombMul: In , bombMulSearch:", bombMulSearch)
|
|
|
|
if this.BombMulToTimeArr == nil {
|
|
return 0
|
|
}
|
|
|
|
//for i := 0; i <= len(this.BombMulToTimeArr); i++ {
|
|
// //if BombMulToTimeArr
|
|
// if bombMulSearch > mulItem.MinBombMul && bombMulSearch <= mulItem.MaxBombMul {
|
|
//
|
|
// }
|
|
//}
|
|
|
|
//logger.Logger.Trace("(this *Logic) GetBombTimeByBombMul: BombMulToTimeArr.Len: ", len(this.BombMulToTimeArr))
|
|
|
|
for _, mulItem := range this.BombMulToTimeArr {
|
|
if bombMulSearch > mulItem.MinBombMul && bombMulSearch <= mulItem.MaxBombMul {
|
|
return mulItem.BombTime
|
|
}
|
|
}
|
|
|
|
logger.Logger.Trace("(this *Logic) GetBombTimeByBombMul: Not Found ")
|
|
return 0
|
|
}
|
|
|
|
// 通过火箭爆炸时间找到火箭倍数
|
|
func (this *Logic) GetBombMulByBombTime(BombTime int32) int32 {
|
|
if this.BombTimeToMulArr == nil {
|
|
return 0
|
|
}
|
|
|
|
for _, mulItem := range this.BombTimeToMulArr {
|
|
if BombTime > mulItem.MinBombTime && BombTime <= mulItem.MaxBombTime {
|
|
return mulItem.BombMul
|
|
}
|
|
}
|
|
|
|
return 0
|
|
}
|
|
|
|
// 下注信息
|
|
type BetDataEx struct {
|
|
BetVal int64 // 下注金额
|
|
TakeMul float64 // 下注领取倍数
|
|
IsCurBet bool // 本局是否下注
|
|
IsNextBet bool // 下一局是否下注
|
|
IsTakeGain bool // 是否收取过奖励
|
|
IsAutoBetAndTake bool // 是否自动下注收取
|
|
GainSearchTime time.Duration // 自动收取时间
|
|
GainCoinMul float64 // 最终赢取倍数
|
|
}
|
|
|
|
// 重置
|
|
func (b *BetDataEx) Reset() {
|
|
b.BetVal = 1000
|
|
b.TakeMul, _ = strconv.ParseFloat(fmt.Sprintf("%.2f", 1.20), 64)
|
|
b.IsCurBet = false
|
|
b.IsTakeGain = false
|
|
b.IsNextBet = false
|
|
b.IsAutoBetAndTake = false
|
|
b.GainCoinMul = 0
|
|
}
|
|
|
|
// 新一局 设置数据
|
|
func (b *BetDataEx) ReStartGame() {
|
|
b.IsCurBet = false
|
|
b.IsTakeGain = false
|
|
|
|
if b.IsNextBet {
|
|
b.IsCurBet = true
|
|
}
|
|
|
|
if b.IsAutoBetAndTake {
|
|
b.IsCurBet = true
|
|
}
|
|
|
|
b.IsNextBet = false
|
|
b.GainCoinMul = 0
|
|
}
|