334 lines
8.4 KiB
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
|
|
}
|