game_sync/gamesrv/slotspkg/slots/plugin/cashmania/base.go

280 lines
7.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次
}
// 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{},
&Special{},
&CustomFortune{})
}
// 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:
p.changeItem(m, true)
}
}
func (p *PluginBase) AfterDisplay(m intf.Master) {
isFreeSpin := m.Cursor().GetType() == key.FreeSpin
cursorFormation := m.CursorFormation()
symbols := cursorFormation.GetSymbols()
if m.Bool("Nudge") {
//todo 如果当前是nudge
if m.Bool("NudgeDown") {
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") {
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") {
//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)
}
}
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) getCustomFortune(m intf.Master) *CustomFortune {
customFortune := new(CustomFortune)
if len(m.CursorCustoms(customFortune)) == 0 {
m.AddCursorFeature(customFortune)
}
return m.CursorCustom(customFortune).(*CustomFortune)
}
func (p *PluginBase) changeItem(m intf.Master, isFreeSpin bool) {
curFormation := m.CursorFormation()
symbols := curFormation.GetSymbols()
isWin := Descx(m).CheckWin(isFreeSpin)
if isFreeSpin {
Fortune := p.getCustomFortune(m)
if Fortune.ForceRound == m.GetProgressValue() {
isWin = true
}
}
isNudge, isReSpin := Descx(m).GetNudgeAndReSpin(isWin)
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))
if freeSpinCount > 0 {
if isFreeSpin {
m.AddProgress(freeSpinCount)
m.AddCursorFeature(&generic.CustomExtraFreeSpin{ExtraTimes: freeSpinCount}).SetLifetime(1)
} else {
ForceRound := m.Randx().Int63n(freeSpinCount)
m.AddNodeFeature(m.AddNodeOnCursor(key.FreeSpin, freeSpinCount).GetID(), &CustomFortune{ForceRound: ForceRound})
}
}
}