game_sync/gamerule/smallrocket/logic.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
}