332 lines
9.4 KiB
Go
332 lines
9.4 KiB
Go
package cashmania
|
|
|
|
import (
|
|
"mongo.games.com/game/gamesrv/slotspkg/internal/generic/key"
|
|
"mongo.games.com/game/gamesrv/slotspkg/slots/intf"
|
|
"mongo.games.com/game/gamesrv/slotspkg/slots/plugin/generic"
|
|
)
|
|
|
|
type PluginBase struct {
|
|
generic.PluginBase
|
|
}
|
|
|
|
// 特性数据
|
|
type CustomMidInfo struct {
|
|
// 本次的symbol
|
|
ItemId int64
|
|
// FreeSpin次数
|
|
FreeSpinCount int64
|
|
// 倍乘多少倍
|
|
Multi int64
|
|
}
|
|
|
|
type CustomNudge struct {
|
|
// 本次的symbol
|
|
ItemId int64
|
|
}
|
|
|
|
type CustomRespin struct {
|
|
// 本次的symbol
|
|
ItemId int64
|
|
}
|
|
|
|
type CustomFortune struct {
|
|
ForceRound int64 `json:"fr"` //第n次
|
|
|
|
FeatureType int `json:"feature_type"` //0.无特性 1.nudge 2.respin
|
|
NudgeDirection int `json:"nudge_direction"` //1.上 2.下
|
|
|
|
FreeSpinItemId int64 `json:"free_item_id"`
|
|
|
|
Multiple int64 `json:"multiple"` //倍乘倍数
|
|
|
|
FreeStatus int `json:"fs"`
|
|
FreeSpinNum int64 `json:"fsn"` //剩余freespin
|
|
FreeNumMax int64 `json:"fnm"` //总次数
|
|
FreeNumTrigger int64 `json:"fnt"` //新增freespin
|
|
}
|
|
|
|
// Theme is called to get feature theme
|
|
func (p *PluginBase) Theme() string {
|
|
return key.CashMania
|
|
}
|
|
|
|
// Customs is called to get feature customs
|
|
func (p *PluginBase) Customs() []interface{} {
|
|
return append(p.PluginBase.Customs(),
|
|
&CustomMidInfo{},
|
|
&CustomNudge{},
|
|
&CustomRespin{},
|
|
&CustomFortune{},
|
|
&Special{})
|
|
}
|
|
|
|
// OnStepBegin is called on initializing a step
|
|
func (p *PluginBase) OnStepBegin(m intf.Master) {
|
|
|
|
}
|
|
|
|
func (p *PluginBase) BeforeDisplay(m intf.Master) {
|
|
switch m.Cursor().GetType() {
|
|
case key.BaseSpin:
|
|
p.changeItem(m, false)
|
|
case key.FreeSpin:
|
|
Fortune := getCustomFortune(m)
|
|
Fortune.FreeStatus = 0
|
|
Fortune.FreeNumTrigger = 0
|
|
p.changeItem(m, true)
|
|
}
|
|
|
|
}
|
|
|
|
func (p *PluginBase) AfterDisplay(m intf.Master) {
|
|
isFreeSpin := m.Cursor().GetType() == key.FreeSpin
|
|
cursorFormation := m.CursorFormation()
|
|
symbols := cursorFormation.GetSymbols()
|
|
|
|
Fortune := getCustomFortune(m)
|
|
|
|
Fortune.FeatureType = WU
|
|
if m.Bool("Nudge") {
|
|
Fortune.FeatureType = Nudge
|
|
//todo 如果当前是nudge
|
|
if m.Bool("NudgeDown") {
|
|
Fortune.NudgeDirection = Nudge_Down
|
|
symbols[9] = symbols[8]
|
|
symbols[8] = symbols[7]
|
|
symbols[7] = symbols[6]
|
|
symbols[6] = symbols[5]
|
|
symbols[5] = Descx(m).RandomMidItems(isFreeSpin, 1)[0]
|
|
m.Remove("NudgeDown")
|
|
} else if m.Bool("NudgeUp") {
|
|
Fortune.NudgeDirection = Nudge_Up
|
|
symbols[5] = symbols[6]
|
|
symbols[6] = symbols[7]
|
|
symbols[7] = symbols[8]
|
|
symbols[8] = symbols[9]
|
|
symbols[9] = Descx(m).RandomMidItems(isFreeSpin, 1)[0]
|
|
m.Remove("NudgeUp")
|
|
}
|
|
m.Remove("Nudge")
|
|
} else if m.Bool("Respin") {
|
|
Fortune.FeatureType = Respin
|
|
//todo 如果当前是respin
|
|
if m.Int64("respinsymbols") > 0 {
|
|
symbols[2] = m.Int64("respinsymbols")
|
|
symbols[12] = m.Int64("respinsymbols")
|
|
p.RandomItemsByOther(m, isFreeSpin, symbols, 0, 4, 10, 14)
|
|
m.Remove("respinsymbols")
|
|
} else if m.Bool("respinnohit") {
|
|
//生成左右不相同 中间有图标的不中奖结果
|
|
p.Set2And12(m, isFreeSpin, symbols)
|
|
p.RandomItemsByOther(m, isFreeSpin, symbols, 0, 4, 10, 14)
|
|
m.Remove("respinnohit")
|
|
}
|
|
m.Remove("Respin")
|
|
}
|
|
cursorFormation.SetSymbols(symbols)
|
|
}
|
|
|
|
func (p *PluginBase) AfterSpin(m intf.Master) {
|
|
switch m.Cursor().GetType() {
|
|
case key.BaseSpin:
|
|
p.checkMid(m, false)
|
|
case key.FreeSpin:
|
|
p.checkMid(m, true)
|
|
Fortune := getCustomFortune(m)
|
|
if Fortune.FreeSpinNum > 0 {
|
|
if Fortune.FreeSpinNum == 1 {
|
|
Fortune.FreeStatus = 3
|
|
}
|
|
Fortune.FreeSpinNum--
|
|
//logx.Errorf("这里是哇哇哇 Trigger[%v] FreeNumMax[%v] FreeSpinNum[%v]", Fortune.FreeNumTrigger, Fortune.FreeNumMax, Fortune.FreeSpinNum)
|
|
}
|
|
}
|
|
}
|
|
|
|
func (p *PluginBase) Nudge(m intf.Master, symbols []int64) {
|
|
m.Set("Nudge", true)
|
|
if m.Randx().PR(0.5) {
|
|
//向下
|
|
symbols[5] = symbols[6]
|
|
symbols[6] = symbols[7]
|
|
symbols[7] = symbols[8]
|
|
symbols[8] = symbols[9]
|
|
symbols[9] = 200
|
|
m.Set("NudgeDown", true)
|
|
} else {
|
|
//向上
|
|
symbols[9] = symbols[8]
|
|
symbols[8] = symbols[7]
|
|
symbols[7] = symbols[6]
|
|
symbols[6] = symbols[5]
|
|
symbols[5] = 200
|
|
m.Set("NudgeUp", true)
|
|
}
|
|
}
|
|
|
|
func (p *PluginBase) changeItem(m intf.Master, isFreeSpin bool) {
|
|
curFormation := m.CursorFormation()
|
|
symbols := curFormation.GetSymbols()
|
|
isWin := Descx(m).CheckWin(isFreeSpin)
|
|
//todo ceshi
|
|
//isWin = true
|
|
|
|
if isFreeSpin {
|
|
Fortune := getCustomFortune(m)
|
|
if Fortune.ForceRound == m.GetProgressValue() {
|
|
isWin = true
|
|
}
|
|
}
|
|
isNudge, isReSpin := Descx(m).GetNudgeAndReSpin(isWin)
|
|
|
|
//todo ceshi
|
|
//isNudge = true
|
|
//isReSpin = true
|
|
if isWin {
|
|
itemId := Descx(m).GetWinItem(isFreeSpin)
|
|
symbols[2] = itemId
|
|
symbols[12] = itemId
|
|
|
|
midItemId := Descx(m).GetWinMidItem(isFreeSpin)
|
|
symbols[7] = midItemId
|
|
|
|
p.RandomItemsByMid(m, isFreeSpin, symbols, 5, 9)
|
|
p.RandomItemsByOther(m, isFreeSpin, symbols, 0, 4, 10, 14)
|
|
//base 触发nudge 中奖
|
|
if isNudge {
|
|
p.Nudge(m, symbols)
|
|
} else if isReSpin {
|
|
//respin 触发respin 中奖
|
|
m.Set("Respin", true)
|
|
p.RandomItemsByOther(m, isFreeSpin, symbols, 0, 4, 10, 14)
|
|
p.Set2And12(m, isFreeSpin, symbols)
|
|
m.Set("respinsymbols", itemId)
|
|
}
|
|
} else {
|
|
//base 触发nudge not hit
|
|
if isNudge {
|
|
leftRightItemId := Descx(m).RandomItems(isFreeSpin, 1)[0]
|
|
symbols[2] = leftRightItemId
|
|
symbols[12] = leftRightItemId
|
|
|
|
p.RandomItemsByOther(m, isFreeSpin, symbols, 0, 4, 10, 14)
|
|
p.RandomItemsByMid(m, isFreeSpin, symbols, 6, 8)
|
|
} else if isReSpin {
|
|
m.Set("Respin", true)
|
|
//生成左右不相同 中间有图标的不中奖结果
|
|
p.RandomItemsByMid(m, isFreeSpin, symbols, 5, 7, 9)
|
|
p.Set2And12(m, isFreeSpin, symbols)
|
|
p.RandomItemsByOther(m, isFreeSpin, symbols, 0, 4, 10, 14)
|
|
m.Set("respinnohit", true)
|
|
} else {
|
|
//随机0-2列中间有图标
|
|
hit := m.Randx().Int63n(3)
|
|
switch hit {
|
|
case 0:
|
|
//中间没有图标
|
|
p.RandomItemsByOther(m, isFreeSpin, symbols, 1, 3, 11, 13)
|
|
p.RandomItemsByMid(m, isFreeSpin, symbols, 6, 8)
|
|
case 1:
|
|
//中间一个图标 然后随机列的位置
|
|
idx := m.Randx().Int63n(3) + 1
|
|
if idx == 1 {
|
|
//第一列中间出
|
|
//0,2,4,6,8,11,13
|
|
p.RandomItemsByOther(m, isFreeSpin, symbols, 0, 2, 4, 11, 13)
|
|
p.RandomItemsByMid(m, isFreeSpin, symbols, 6, 8)
|
|
} else if idx == 2 {
|
|
//第二列中间出
|
|
//1,3,5,7,9,11,13
|
|
p.RandomItemsByOther(m, isFreeSpin, symbols, 1, 3, 11, 13)
|
|
p.RandomItemsByMid(m, isFreeSpin, symbols, 5, 7, 9)
|
|
} else if idx == 3 {
|
|
//第三列中间出
|
|
//1,3,6,8,10,12,14
|
|
p.RandomItemsByOther(m, isFreeSpin, symbols, 1, 3, 10, 12, 14)
|
|
p.RandomItemsByMid(m, isFreeSpin, symbols, 6, 8)
|
|
}
|
|
case 2:
|
|
//两列出图标 随机一列不出
|
|
notidx := m.Randx().Int63n(3) + 1
|
|
if notidx == 1 {
|
|
//第一列中间不出
|
|
//1,3,5,7,9,10,12,14
|
|
p.RandomItemsByOther(m, isFreeSpin, symbols, 1, 3, 10, 12, 14)
|
|
p.RandomItemsByMid(m, isFreeSpin, symbols, 5, 7, 9)
|
|
} else if notidx == 2 {
|
|
//第二列中间不出
|
|
//0,2,4,6,8,10,12,14
|
|
p.RandomItemsByOther(m, isFreeSpin, symbols, 0, 4, 10, 14)
|
|
p.Set2And12(m, isFreeSpin, symbols)
|
|
p.RandomItemsByMid(m, isFreeSpin, symbols, 6, 8)
|
|
} else if notidx == 3 {
|
|
//第三列中间不出
|
|
//0,2,4,5,7,9,11,13
|
|
p.RandomItemsByOther(m, isFreeSpin, symbols, 0, 2, 4, 11, 13)
|
|
p.RandomItemsByMid(m, isFreeSpin, symbols, 5, 7, 9)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
curFormation.SetSymbols(symbols)
|
|
}
|
|
func (p *PluginBase) Set2And12(m intf.Master, isFreeSpin bool, symbols []int64) {
|
|
items := Descx(m).RandomTwoDifItem(isFreeSpin)
|
|
symbols[2] = items[0]
|
|
symbols[12] = items[1]
|
|
}
|
|
|
|
func (p *PluginBase) checkMid(m intf.Master, isFreeSpin bool) {
|
|
curFormation := m.CursorFormation()
|
|
win := curFormation.GetWin()
|
|
if win <= 0 {
|
|
return
|
|
}
|
|
|
|
symbols := curFormation.GetSymbols()
|
|
multi, freeSpinCount := Descx(m).GetMidItemInfo(symbols[7])
|
|
|
|
//if multi > 1 {
|
|
// curFormation.SetWin(win * multi)
|
|
//}
|
|
|
|
m.AddCursorFeature(&CustomMidInfo{
|
|
ItemId: symbols[7],
|
|
Multi: multi,
|
|
FreeSpinCount: freeSpinCount,
|
|
}).SetWin(win * (multi - 1))
|
|
|
|
Fortune := getCustomFortune(m)
|
|
|
|
Fortune.Multiple = multi
|
|
//Fortune.MultipleWin = win * (multi - 1)
|
|
Fortune.FreeSpinItemId = symbols[7]
|
|
if freeSpinCount > 0 {
|
|
customFortune := getCustomFortune(m)
|
|
if isFreeSpin {
|
|
//logx.Errorf("----ReTrigger[%v] FreeNumMax[%v] FreeSpinNum[%v]", customFortune.FreeNumTrigger, customFortune.FreeNumMax, customFortune.FreeSpinNum)
|
|
customFortune.FreeStatus = 2
|
|
customFortune.FreeNumTrigger = freeSpinCount
|
|
customFortune.FreeNumMax += freeSpinCount
|
|
customFortune.FreeSpinNum += freeSpinCount
|
|
|
|
//logx.Errorf("----2ReTrigger[%v] FreeNumMax[%v] FreeSpinNum[%v]", customFortune.FreeNumTrigger, customFortune.FreeNumMax, customFortune.FreeSpinNum)
|
|
|
|
m.AddProgress(freeSpinCount)
|
|
//m.AddCursorFeature(customFortune).SetLifetime(customFortune.FreeSpinNum)
|
|
m.CursorFeature(customFortune).SetLifetime(customFortune.FreeSpinNum)
|
|
} else {
|
|
//logx.Errorf("11Trigger[%v] FreeNumMax[%v] FreeSpinNum[%v]", customFortune.FreeNumTrigger, customFortune.FreeNumMax, customFortune.FreeSpinNum)
|
|
customFortune.FreeStatus = 1
|
|
customFortune.FreeNumTrigger = freeSpinCount
|
|
customFortune.FreeNumMax += freeSpinCount
|
|
customFortune.FreeSpinNum = freeSpinCount
|
|
ForceRound := m.Randx().Int63n(freeSpinCount)
|
|
customFortune.ForceRound = ForceRound
|
|
//logx.Errorf("1111111Trigger[%v] FreeNumMax[%v] FreeSpinNum[%v]", customFortune.FreeNumTrigger, customFortune.FreeNumMax, customFortune.FreeSpinNum)
|
|
m.AddNodeFeature(m.AddNodeOnCursor(key.FreeSpin, freeSpinCount).GetID(), customFortune).SetLifetime(freeSpinCount)
|
|
}
|
|
}
|
|
}
|