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.
 
 
 
 
AdLike2048/assets/script/battle/mechanism/MechanismResCollector.ts

94 lines
3.6 KiB

import { Prefab } from 'cc';
import { createMembershipSet, membershipAdd } from '../../../mx/tools/MembershipSet';
import { ChapterNewPlayTypeEnum } from '../../game/ChapterPlayTypes';
import { TableNames } from '../../game/ConfigTableData';
import { WITCH_MECHANISM_MONSTER_ID } from './MechanismConstants';
import type { ResPakage } from 'db://assets/mx/module/res/ResourcesManager';
/** 机制预载 bundle 名(避免 ConfigRes ↔ MechanismResCollector 循环依赖) */
const MECH_BUNDLE = {
BattleGameMonster: 'battleGameMonster',
BattleGame: 'battleGame',
MechanismEffect: 'mechanismEffect',
BattleMap: 'battleMap',
} as const;
export interface MechanismResEntry {
bundle: string;
path: string;
name: string;
}
function pushPrefab(ress: ResPakage['ress'], bundle: string, path: string, name: string): void {
ress.push({ name, bundle, path, type: Prefab });
}
function parsePlayIdList(raw: string | undefined | null): number[] {
if (!raw) return [];
return raw.split(',')
.map((s) => Number(s.trim()))
.filter((n) => Number.isFinite(n) && n > 0);
}
/**
* 战斗预载机制 play id:
* - 道具模式:Replica.mechanism 全集(局内再随机子集,预载须覆盖池内全部)
* - 其它模式:章节 new_play
*/
export function resolveMechanismPlayIdsForBattleRes(_chapterId: number): number[] {
return [];
}
/** 按 play id 收集机制战斗资源(并入 BattleRes 预载包) */
export function collectMechanismBattleRes(playIds: number[]): MechanismResEntry[] {
const entries: MechanismResEntry[] = [];
const seen = createMembershipSet<string>();
const add = (bundle: string, path: string, name: string) => {
const key = `${bundle}|${path}|${name}`;
if (seen.has(key)) return;
membershipAdd(seen, key);
entries.push({ bundle, path, name });
};
for (const rawId of playIds) {
switch (rawId as ChapterNewPlayTypeEnum) {
case ChapterNewPlayTypeEnum.Witch: {
const row = gg.data.project.getMonsterDataByID(WITCH_MECHANISM_MONSTER_ID);
if (row?.model) {
add(MECH_BUNDLE.BattleGameMonster, 'prefab/monster/', row.model);
}
add(MECH_BUNDLE.BattleGameMonster, 'prefab/', '怪物加血');
break;
}
case ChapterNewPlayTypeEnum.BloodMoon:
add(MECH_BUNDLE.BattleGameMonster, 'prefab/monster/', '机制黄风怪');
add(MECH_BUNDLE.BattleGameMonster, 'prefab/', '怪_加速');
break;
case ChapterNewPlayTypeEnum.Paratroops:
case ChapterNewPlayTypeEnum.BossAirdrop:
add(MECH_BUNDLE.MechanismEffect, 'prefab/新机制/', 'newMechanismParatroops');
break;
case ChapterNewPlayTypeEnum.VinesGrass:
add(MECH_BUNDLE.BattleGameMonster, 'prefab/monster/', '蜘蛛精');
break;
case ChapterNewPlayTypeEnum.Charm:
add(MECH_BUNDLE.BattleGameMonster, 'prefab/monster/', '狐狸精');
break;
case ChapterNewPlayTypeEnum.AccelerateGate:
add(MECH_BUNDLE.MechanismEffect, 'prefab/新机制/', 'newMechanismAccGate');
add(MECH_BUNDLE.BattleMap, 'prefab/障碍物/', '加速门');
break;
default:
break;
}
}
return entries;
}
export function appendMechanismResToPackage(ress: ResPakage['ress'], playIds: number[]): void {
for (const e of collectMechanismBattleRes(playIds)) {
pushPrefab(ress, e.bundle, e.path, e.name);
}
}