You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
152 lines
5.5 KiB
152 lines
5.5 KiB
|
1 week ago
|
import { TableNames } from "../game/ConfigTableData";
|
||
|
|
|
||
|
|
import { BattleDataManager, type IBattleSkill } from "../ui/BattleGame/BattleDataManager";
|
||
|
|
import { SkillQuality } from "./SkillDataManager";
|
||
|
|
|
||
|
|
/**转盘奖励类型 */
|
||
|
|
export enum TurnTableAwardType {
|
||
|
|
/**金币 */
|
||
|
|
Coin = 1,
|
||
|
|
/**技能 */
|
||
|
|
Skill = 2,
|
||
|
|
/**特殊技能 */
|
||
|
|
SpecialSkill = 3,
|
||
|
|
/**紫色以上技能 */
|
||
|
|
PurpleSkill = 4,
|
||
|
|
}
|
||
|
|
export class LotteryItem {
|
||
|
|
/**奖励id */
|
||
|
|
id: number
|
||
|
|
/**奖励类型 */
|
||
|
|
awardType: TurnTableAwardType
|
||
|
|
/**奖励品质 */
|
||
|
|
awardQuality: SkillQuality
|
||
|
|
/**奖励技能数据 */
|
||
|
|
awardSkillConfig: IBattleSkill
|
||
|
|
/**奖励数量 */
|
||
|
|
awardNum: number
|
||
|
|
}
|
||
|
|
/**转盘表数据管理 */
|
||
|
|
export class TurnTableDataManager {
|
||
|
|
/**获取转盘配表数据 */
|
||
|
|
public static getAllTurnTableList() {
|
||
|
|
let list = gg.data.table.getTableList<ITableLottery>(TableNames.Lottery);
|
||
|
|
// console.log('allList===',list)
|
||
|
|
return list
|
||
|
|
}
|
||
|
|
/**
|
||
|
|
* 通过id获取转盘数据
|
||
|
|
* @param id 转盘id
|
||
|
|
*/
|
||
|
|
public static getTurnTableDataById(id) {
|
||
|
|
let allList = this.getAllTurnTableList()
|
||
|
|
let config: ITableLottery = allList.find(x => x.id == id)
|
||
|
|
// console.log('获取特定转盘的配表数据==id,config=',id,config)
|
||
|
|
return config
|
||
|
|
}
|
||
|
|
/**当前可用转盘id数组 */
|
||
|
|
public static availableTurnTableIdArr: number[] = []
|
||
|
|
/**获取当前可用转盘id数组 */
|
||
|
|
public static getAvailableTurnTableIdArr() {
|
||
|
|
return this.availableTurnTableIdArr
|
||
|
|
}
|
||
|
|
/**初始化可用转盘id数组 */
|
||
|
|
public static initAvailableTurnTableIdArr() {
|
||
|
|
this.availableTurnTableIdArr = []
|
||
|
|
let allList = this.getAllTurnTableList()
|
||
|
|
for (let i = 0; i < allList.length; i++) {
|
||
|
|
let config: ITableLottery = allList[i]
|
||
|
|
this.availableTurnTableIdArr.push(config.id)
|
||
|
|
}
|
||
|
|
}
|
||
|
|
/**删除不可用转盘id */
|
||
|
|
public static removeUnavailableTurnTableId(idArr: number[]) {
|
||
|
|
for (let i = 0; i < idArr.length; i++) {
|
||
|
|
let id = idArr[i]
|
||
|
|
let index = this.availableTurnTableIdArr.indexOf(id)
|
||
|
|
if (index != -1) {
|
||
|
|
this.availableTurnTableIdArr.splice(index, 1)
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
/**获取所有转盘奖品 */
|
||
|
|
public static getAllTurnTableAwardList(index: number) {
|
||
|
|
let allList = this.getAllTurnTableList()
|
||
|
|
//先统计所有技能类型,一次性随机出技能结果
|
||
|
|
let turnTableSkillTypeArr: TurnTableAwardType[] = []
|
||
|
|
let curentType = "type";
|
||
|
|
if (index == 0) curentType = "type1";
|
||
|
|
if (index == 1) curentType = "type2";
|
||
|
|
if (index == 2) curentType = "type";
|
||
|
|
for (let i = 0; i < allList.length; i++) {
|
||
|
|
let config: ITableLottery = allList[i]
|
||
|
|
if (config[curentType] == TurnTableAwardType.Skill || config[curentType] == TurnTableAwardType.SpecialSkill || config[curentType] == TurnTableAwardType.PurpleSkill) {
|
||
|
|
turnTableSkillTypeArr.push(config[curentType])
|
||
|
|
}
|
||
|
|
}
|
||
|
|
//技能结果
|
||
|
|
let skillList = BattleDataManager.getTurnTableRogueSkill(turnTableSkillTypeArr)
|
||
|
|
|
||
|
|
let awardList: LotteryItem[] = []
|
||
|
|
for (let i = 0; i < allList.length; i++) {
|
||
|
|
let config: ITableLottery = allList[i]
|
||
|
|
let item = new LotteryItem()
|
||
|
|
item.id = config.id
|
||
|
|
item.awardType = config[curentType]
|
||
|
|
if (config[curentType] == TurnTableAwardType.Coin) {
|
||
|
|
item.awardNum = config.coin
|
||
|
|
item.awardQuality = config.quality
|
||
|
|
} else if (config[curentType] == TurnTableAwardType.Skill || config[curentType] == TurnTableAwardType.SpecialSkill||config[curentType] == TurnTableAwardType.PurpleSkill) {
|
||
|
|
item.awardNum = 1
|
||
|
|
item.awardSkillConfig = skillList.shift()
|
||
|
|
}
|
||
|
|
awardList.push(item)
|
||
|
|
}
|
||
|
|
return awardList
|
||
|
|
}
|
||
|
|
/**
|
||
|
|
* 根据权重获取两个随机奖品
|
||
|
|
* @param isFirst 是否是第一次获取
|
||
|
|
*/
|
||
|
|
public static getTwoRandomAwardByWeight(roundNum: number) {
|
||
|
|
let idArr = this.getAvailableTurnTableIdArr()
|
||
|
|
let allWeight = 0
|
||
|
|
for (let i = 0; i < idArr.length; i++) {
|
||
|
|
let config: ITableLottery = this.getTurnTableDataById(idArr[i])
|
||
|
|
let index = roundNum - 1
|
||
|
|
if (index >= config.weight.split(',').length) {
|
||
|
|
index = config.weight.split(',').length - 1
|
||
|
|
}
|
||
|
|
let weight = config.weight.split(',')[index]
|
||
|
|
allWeight += Number(weight)
|
||
|
|
}
|
||
|
|
let num = 0
|
||
|
|
let resultIdArr: number[] = []
|
||
|
|
while (num < 2) {
|
||
|
|
let r = Math.random() * allWeight
|
||
|
|
let curWeight = 0
|
||
|
|
let id = 0
|
||
|
|
for (let i = 0; i < idArr.length; i++) {
|
||
|
|
let config: ITableLottery = this.getTurnTableDataById(idArr[i])
|
||
|
|
let index = roundNum - 1
|
||
|
|
if (index >= config.weight.split(',').length) {
|
||
|
|
index = config.weight.split(',').length - 1
|
||
|
|
}
|
||
|
|
let weight = config.weight.split(',')[index]
|
||
|
|
if (r >= curWeight && r < curWeight + Number(weight)) {
|
||
|
|
id = i
|
||
|
|
break
|
||
|
|
}
|
||
|
|
curWeight += Number(weight)
|
||
|
|
}
|
||
|
|
if (resultIdArr.indexOf(idArr[id]) == -1) {
|
||
|
|
resultIdArr.push(idArr[id])
|
||
|
|
num++
|
||
|
|
}
|
||
|
|
}
|
||
|
|
return resultIdArr
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
|