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) } } }