game_sync/gamerule/hunting/constants.go

375 lines
6.5 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package hunting
import (
"math/rand"
"mongo.games.com/game/common"
)
// 0 没有宝石
// level1
// 1 河心石
// 2 荒玉石
// 3 紫水晶
// 4 血榴石
// 5 锡黄晶
// level2
// 6 蓝锆晶
// 7 精灵榄
// 8 魇蛟眼
// 9 红玉髓
// 10 龙眼石
// level3
// 11 海洋之眼
// 12 梦境翡翠
// 13 影歌紫玉
// 14 地狱炎石
// 15 王者琥珀
// 16 炸弹
const (
// 关卡数量
LevelNum = 4
// 掉线重连保持时长,单位秒
DropLineTime = 30
// 最短多少秒通知一次奖池金额
CoinPoolTime = 1
// 没有宝石
NoGem = 0
// 炸弹
Bomb = 16
// 多长时间未操作踢出房间
TimeoutSecond = 180
)
// 游戏状态
const (
GamingState = 0
GameStateMax = 1 // 状态数量
)
func levelNum(n int) int {
if n-1 < 0 {
return 0
}
if n-1 >= LevelNum {
return LevelNum - 1
}
return n - 1
}
var levelPass = []int32{15, 15, 15, 0}
// 通关需要的炸弹数量
func LevelPassBombs(level int) int32 {
return levelPass[levelNum(level)]
}
var levelGemsNum = []int{4*4 + 4, 5*5 + 5, 6*6 + 6, 0}
// 每关的初始宝石数量
func LevelGemsNum(level int) int {
return levelGemsNum[levelNum(level)]
}
var levelColumn = []int{4, 5, 6, 0}
// 每关的宝石列数
func LevelColumn(level int) int {
return levelColumn[levelNum(level)]
}
var levelGemType = []int32{1, 2, 3, 4, 5}
// 每关的宝石类型
func LevelGemType(level int) []int32 {
l := levelNum(level)
if l == 0 {
return levelGemType
}
ret := make([]int32, len(levelGemType))
for i := 0; i < len(ret); i++ {
ret[i] = levelGemType[i] + int32(len(ret)*l)
}
return ret
}
var GemTypeName = map[int32]string{
1: "1河心石",
2: "2荒玉石",
3: "3紫水晶",
4: "4血榴石",
5: "5锡黄晶",
6: "1蓝锆晶",
7: "2精灵榄",
8: "3魇蛟眼",
9: "4红玉髓",
10: "5龙眼石",
11: "1海洋之眼",
12: "2梦境翡翠",
13: "3影歌紫玉",
14: "4地狱炎石",
15: "5王者琥珀",
16: "炸弹",
}
var gemProbability = []int{4100, 2700, 2000, 800, 400}
func GetGemIndex(r *rand.Rand, num int) int {
n := r.Intn(10000)
sum := 0
for i := 0; i < num; i++ {
sum += gemProbability[i]
if n < sum {
return i
}
}
return 0
}
var levelDelete = []int{4, 5, 6, 0}
// 每关宝石最少可消除的连接数量
func LevelDelete(level int) int {
return levelDelete[levelNum(level)]
}
var rate = []int32{2, 3, 4, 10, 20, 40, 80, 160, 320, 640, 1000, 2000, 3000, 4000, 5000, 6000, 7000}
var level1GemRate = [][]int32{
rate[:11],
rate[1:12],
rate[2:13],
rate[3:14],
rate[4:15],
}
var level2GemRate = [][]int32{
level1GemRate[1],
level1GemRate[2],
level1GemRate[3],
level1GemRate[4],
rate[5:16],
}
var level3GemRate = [][]int32{
level2GemRate[1],
level2GemRate[2],
level2GemRate[3],
level2GemRate[4],
rate[6:17],
}
// GemsRate 宝石倍率, 倍率比实际倍率扩大了10倍使用后要除以10
// n 宝石连接数量
// tp 宝石类型
func GemsRate(level int, n int, tp int32) int64 {
if tp == Bomb {
return 0
}
switch levelNum(level) {
case 0:
if n < 4 || n > 14 {
return 0
}
return int64(level1GemRate[(tp-1)%5][n-4])
case 1:
if n < 5 || n > 15 {
return 0
}
return int64(level2GemRate[(tp-1)%5][n-5])
case 2:
if n < 6 || n > 16 {
return 0
}
return int64(level3GemRate[(tp-1)%5][n-6])
}
return 0
}
func rateScope(level int, a, b int32, f func([][]int32) []int32) []int32 {
if a > b {
a, b = b, a
}
var ret []int32
switch levelNum(level) {
case 0:
ret = f(level1GemRate)
case 1:
ret = f(level2GemRate)
case 2:
ret = f(level3GemRate)
}
tmp := map[int32]struct{}{}
for i := 0; i < len(ret); i++ {
tmp[ret[i]] = struct{}{}
}
ret = ret[:0]
for k := range tmp {
ret = append(ret, k)
}
return ret
}
// [a, b)
func RateScope(level int, a, b int32) []int32 {
return rateScope(level, a, b, func(data [][]int32) []int32 {
var ret []int32
for _, v := range data {
for i := 0; i < len(v); i++ {
if v[i] >= b {
break
}
if v[i] < a {
continue
}
ret = append(ret, v[i])
}
}
return ret
})
}
// [a, b]
func RateScope1(level int, a, b int32) []int32 {
return rateScope(level, a, b, func(data [][]int32) []int32 {
var ret []int32
for _, v := range data {
for i := 0; i < len(v); i++ {
if v[i] > b {
break
}
if v[i] < a {
continue
}
ret = append(ret, v[i])
}
}
return ret
})
}
func rateGems(level int, r int32, data [][]int32) map[int32]int {
ret := map[int32]int{}
for k, v := range data {
var n = LevelDelete(level) - 1
for i := 0; i < len(v); i++ {
n++
if v[i] < r {
continue
}
if v[i] > r {
break
}
if v[i] == r {
ret[int32(k)+1+int32(5*levelNum(level))] = n
break
}
}
}
return ret
}
// RateGems 根据需要的倍率,查询连接宝石和类型
// rate 倍率
func RateGems(level int, r int32) map[int32]int {
switch levelNum(level) {
case 0:
return rateGems(level, r, level1GemRate)
case 1:
return rateGems(level, r, level2GemRate)
case 2:
return rateGems(level, r, level3GemRate)
}
return map[int32]int{}
}
func GetsRateMin(level int) map[int32][]int {
ret := make(map[int32][]int)
gt := LevelGemType(level)
for i := 0; i < len(gt); i++ {
num := 1
var n = GemsRate(level, num, gt[i])
for n < 10 {
if n > 0 {
ret[gt[i]] = append(ret[gt[i]], num)
}
num++
n = GemsRate(level, num, gt[i])
}
}
return ret
}
// CoinPoolRate 奖池倍率
// n 宝石连接数量
func CoinPoolRate(level int, n int) int64 {
switch levelNum(level) {
case 0:
if n < 15 {
return 0
}
if n <= 16 {
return int64((n - 14) * 10)
}
return 20
case 1:
if n < 16 {
return 0
}
if n <= 18 {
return int64((n - 15) * 10)
}
return 30
case 2:
if n < 17 {
return 0
}
if n <= 21 {
return int64((n - 16) * 10)
}
return 50
}
return 0
}
// 每次下注出现炸弹的概率是25%
func GetBomb(r *rand.Rand) bool {
return r.Intn(100) < 25
}
// 翻牌概率
var cardRate = []int32{3500, 3000, 2000, 1000, 500}
var baseRate = [][]int64{
{2, 5, 10, 15, 20, 30},
{1, 3, 6, 10, 15, 20},
{1, 2, 4, 6, 8, 10},
}
func CardScore(r *rand.Rand, baseScore int64, sceneType int32) int64 {
var sum int32
var i int
n := r.Int31n(10000)
for k, v := range cardRate {
sum += v
if n < sum {
i = k
break
}
}
var arr []int64
switch sceneType {
case common.SceneType_Primary:
arr = baseRate[0]
case common.SceneType_Middle:
arr = baseRate[1]
default: // 高级场、试玩场
arr = baseRate[2]
}
a := baseScore * arr[i]
b := baseScore * arr[i+1]
return a + r.Int63n(b-a+1)
}