game_sync/gamesrv/fruits/playerdata_fruits.go

334 lines
8.4 KiB
Go

package fruits
import (
"math"
"mongo.games.com/game/gamerule/fruits"
"mongo.games.com/game/gamesrv/base"
"mongo.games.com/game/model"
)
var ElementsParams = [][]int32{}
type FruitsPlayerData struct {
*base.Player
roomid int32 //房间ID
result *fruits.WinResult
betIdx int //下注索引
betCoin int64 //下注金额
oneBetCoin int64 //单注
cpCtx model.CoinPoolCtx //水池环境
leaveTime int32 //离开时间
winCoin int64 //本局输赢
freeTimes int //免费游戏
maryFreeTimes int //玛丽游戏
gameState int //当前游戏模式
///当局数值
winLineRate int64 //线倍率
JackPotRate int64 //获取奖池的百分比 5% 10% 15%
JackPot7Rate int64 //元素jackpot的倍率
freeWinTotalRate int64 //免费游戏赢的倍率
maryWinTotalRate int64 //玛丽游戏赢的倍率
winNowJackPotCoin int64 //当局奖池爆奖
winNowAllRate int64 //当局赢得倍率
//////////////////////////
//统计数值
winLineCoin int64 //线赢金额
winJackPotCoin int64 //爆奖
winEle777Coin int64 //元素数量
winFreeCoin int64 //免费游戏
//winMaryCoin int64 //玛丽游戏
winOutMaryCoin int64 //玛丽游戏外圈
winMidMaryCoin int64 //玛丽游戏内圈
winFreeTimes int //当局获得的免费次数
//log
nowFreeTimes int //当前第几轮免费游戏
nowMaryTimes int //当前第几轮小玛丽游戏
wl []model.FruitsWinLine
maryInNum int //玛丽游戏连续数量
taxCoin int64
//调控
preWinRate int64
preNeedRate int64
pre30WinRate int64
preEleVal []int32
//mary
preMaryOutSide int32
preMaryMidArray []int32
noWinTimes int
//
startCoin int64
testNum int
testIdx int
isf bool
freeTotal int
weightPos int32 //当局权重
}
func (p *FruitsPlayerData) init() {
p.roomid = 0
p.result = new(fruits.WinResult)
}
func (p *FruitsPlayerData) Clear() {
p.gameState = fruits.Normal
p.startCoin = p.Coin
p.winCoin = 0
p.JackPotRate = 0
p.JackPot7Rate = 0
p.winLineRate = 0
p.maryWinTotalRate = 0
p.freeWinTotalRate = 0
p.winNowAllRate = 0
p.winNowJackPotCoin = 0
p.winFreeTimes = 0
p.maryInNum = 0
p.taxCoin = 0
if p.freeTimes == 0 {
p.winLineCoin = 0
p.winFreeCoin = 0
p.winJackPotCoin = 0
p.winEle777Coin = 0
p.nowFreeTimes = 0
}
if p.maryFreeTimes == 0 {
//p.winMaryCoin = 0
p.winOutMaryCoin = 0
p.winMidMaryCoin = 0
p.nowMaryTimes = 0
p.winOutMaryCoin = 0
p.winMidMaryCoin = 0
}
p.weightPos = 0
}
func (p *FruitsPlayerData) TestCode(eleLineAppearRate [][]int32, sceneEx *FruitsSceneData) bool {
//if sceneEx.GetDBGameFree().GetId() == 3060004 {
// p.result.CreateLine(eleLineAppearRate, p.gameState == fruits.FreeGame)
// if p.testIdx == 1 {
// //test mary
// if p.testNum%5 == 0 && p.gameState != fruits.FreeGame {
// for i := 0; i < 5; i++ {
// p.result.EleValue[i] = fruits.Wild
// }
// p.testIdx = 2
// }
// p.testNum++
// if p.testNum >= 100000 {
// p.testNum = 0
// }
// if p.gameState == fruits.FreeGame && !p.isf {
// p.isf = true
// for i := 0; i < 5; i++ {
// p.result.EleValue[i] = fruits.Bonus
// }
// }
// } else if p.testIdx == 0 {
// //test free
// if p.testNum%5 == 0 && p.gameState == fruits.Normal {
// for i := 0; i < 5; i++ {
// p.result.EleValue[i] = fruits.Bonus
// }
// p.testIdx = 1
// p.isf = false
// }
// if p.gameState == fruits.Normal {
// p.testNum++
// if p.testNum >= 100000 {
// p.testNum = 0
// }
// }
// } else {
// if p.testNum%5 == 0 && p.gameState == fruits.Normal {
// for i := 0; i < 5; i++ {
// p.result.EleValue[i] = fruits.Bonus
// p.result.EleValue[i+5] = fruits.Wild
// }
// p.testIdx = 0
// }
// if p.gameState == fruits.Normal {
// p.testNum++
// if p.testNum >= 100000 {
// p.testNum = 0
// }
// }
// }
// p.result.Win()
// return true
//}
return false
}
// 正常游戏 免费游戏
func (p *FruitsPlayerData) CreateResult(eleLineAppearRate [][]int32, sceneEx *FruitsSceneData) {
//if len(p.preEleVal) > 0 {
// p.result.EleValue = make([]int32, 15)
// copy(p.result.EleValue, p.preEleVal)
// p.preEleVal = nil
//}
if !p.TestCode(eleLineAppearRate, sceneEx) {
for i := 0; i < 10; i++ {
p.result.CreateLine(eleLineAppearRate, p.gameState == fruits.FreeGame)
p.result.Win()
var isScatter bool
var isNeed bool = true
for _, wl := range p.result.WinLine {
flag := wl.Lines[0]
if flag == fruits.Scatter {
isScatter = true
JackPotVal := sceneEx.jackpot.GetTotalSmall()
if JackPotVal > 0 {
var winjackpot int64
switch len(wl.Poss) {
case 3:
winjackpot = int64(math.Ceil(float64(JackPotVal) * 0.1 / float64(fruits.NowByte)))
case 4:
winjackpot = int64(math.Ceil(float64(JackPotVal) * 0.2 / float64(fruits.NowByte)))
case 5:
winjackpot = int64(math.Ceil(float64(JackPotVal) * 0.4 / float64(fruits.NowByte)))
}
if winjackpot < int64(sceneEx.GetDBGameFree().GetJackpotMin())*fruits.NowByte {
isNeed = false
break
}
}
}
}
if !isScatter || (isScatter && isNeed) {
break
}
}
}
//线倍率
var rate int64
for _, wl := range p.result.WinLine {
//Wild 元素 按线的连续给玛丽游戏
flag := wl.Lines[0]
var NowWildNum int
var MaxLinXu int
for _, n := range wl.Lines {
if flag != n && flag == fruits.Wild {
flag = n
}
if n == fruits.Wild {
NowWildNum++
if NowWildNum > MaxLinXu {
MaxLinXu = NowWildNum
}
} else {
NowWildNum = 0
}
}
if MaxLinXu >= 3 {
newM := model.FruitsWinLine{
Id: wl.LineId,
EleValue: fruits.Wild,
Num: MaxLinXu,
Rate: 0,
WinCoin: 0,
}
if MaxLinXu == 3 {
p.maryFreeTimes += 1
newM.WinFreeGame = 0
} else if MaxLinXu == 4 {
p.maryFreeTimes += 2
newM.WinFreeGame = 1
} else if MaxLinXu >= 5 {
p.maryFreeTimes += 3
newM.WinFreeGame = 2
}
p.wl = append(p.wl, newM)
}
//统计线倍率
rate += wl.Rate
//Bonus 元素 按线给倍率 按线给免费
if flag == fruits.Bonus {
n := len(wl.Lines)
newL := model.FruitsWinLine{
Id: wl.LineId,
EleValue: fruits.Bonus,
Num: n,
Rate: wl.Rate,
WinCoin: p.oneBetCoin * wl.Rate,
}
if n == 3 {
p.freeTimes += 5
p.winFreeTimes += 5
newL.WinFreeGame = 3
} else if n == 4 {
p.freeTimes += 10
p.winFreeTimes += 10
newL.WinFreeGame = 4
} else if n == 5 {
p.freeTimes += 20
p.winFreeTimes += 20
newL.WinFreeGame = 5
}
p.wl = append(p.wl, newL)
} else if flag == fruits.Scatter {
JackPotVal := sceneEx.jackpot.GetTotalSmall()
if JackPotVal > 0 {
var winjackpot int64
switch len(wl.Poss) {
case 3:
p.JackPotRate += 10
winjackpot = int64(math.Ceil(float64(JackPotVal) * 0.1 / float64(fruits.NowByte)))
case 4:
p.JackPotRate += 20
winjackpot = int64(math.Ceil(float64(JackPotVal) * 0.2 / float64(fruits.NowByte)))
case 5:
p.JackPotRate += 40
winjackpot = int64(math.Ceil(float64(JackPotVal) * 0.4 / float64(fruits.NowByte)))
}
p.wl = append(p.wl, model.FruitsWinLine{
Id: wl.LineId,
EleValue: fruits.Scatter,
Num: len(wl.Poss),
Rate: wl.Rate,
WinCoin: winjackpot,
WinFreeGame: -1,
})
p.JackPot7Rate += wl.Rate
p.winNowJackPotCoin += winjackpot
}
}
}
//赢的线钱
p.winLineCoin += p.oneBetCoin * rate
p.winLineRate = rate
//元素输赢
p.winEle777Coin += p.oneBetCoin * p.JackPot7Rate
}
// 玛丽游戏
func (p *FruitsPlayerData) CreateMary() {
//if len(p.preMaryMidArray) > 0 {
// p.result.MaryMidArray = make([]int32, 4)
// copy(p.result.MaryMidArray, p.preMaryMidArray)
// p.result.MaryOutSide = p.preMaryOutSide
// p.preMaryMidArray = nil
//}
//idx := p.result.MaryOutSide
//maryOutSide := fruits.MaryEleArray[idx]
//if maryOutSide == fruits.Bomb {
// p.maryFreeTimes = 0
// rate = 0
//}
if p.result.MaryOutSide == fruits.Bomb {
p.maryFreeTimes--
if p.maryFreeTimes < 0 {
p.maryFreeTimes = 0
}
}
p.maryWinTotalRate = p.result.MaryOutRate + p.result.MaryMidRate
p.winOutMaryCoin += p.oneBetCoin * p.result.MaryOutRate
p.winMidMaryCoin += p.oneBetCoin * p.result.MaryMidRate
//p.winMaryCoin += p.winOutMaryCoin + p.winMidMaryCoin
}