feat(gameplay): add crazy dave casino and bank, and zombie mutation lab
This commit is contained in:
@@ -73,30 +73,101 @@ window.CampaignSystem = (function() {
|
||||
{ level: 25, world: 5, stage: 5, code: '5-5', title: 'Доктор Зомбосс!', desc: 'Финальная битва против шагающего робота Zombot!', waves: 1, biome: 'roof', isBoss: true, reward: 1000 }
|
||||
];
|
||||
|
||||
let _activeLevels = [...LEVELS];
|
||||
let _serverLoaded = false;
|
||||
|
||||
async function loadLevelsFromServer() {
|
||||
try {
|
||||
const resp = await fetch('/api/campaign/levels');
|
||||
if (!resp.ok) return _activeLevels;
|
||||
const data = await resp.json();
|
||||
if (data && data.success && Array.isArray(data.levels) && data.levels.length > 0) {
|
||||
_activeLevels = data.levels.map(lvl => {
|
||||
const num = parseInt(lvl.level, 10) || 1;
|
||||
const defaultLvl = LEVELS.find(d => d.level === num) || {};
|
||||
|
||||
let wavesCount = 4;
|
||||
if (lvl.waves && typeof lvl.waves === 'object' && Array.isArray(lvl.waves.list)) {
|
||||
wavesCount = lvl.waves.list.length;
|
||||
} else if (Array.isArray(lvl.waves)) {
|
||||
wavesCount = lvl.waves.length;
|
||||
} else if (typeof lvl.waves === 'number') {
|
||||
wavesCount = lvl.waves;
|
||||
} else if (defaultLvl.waves) {
|
||||
wavesCount = defaultLvl.waves;
|
||||
}
|
||||
|
||||
const modifiers = (lvl.modifiers && typeof lvl.modifiers === 'object') ? lvl.modifiers : {};
|
||||
const wavesConfig = lvl.wavesConfig || lvl.waves || defaultLvl.wavesConfig || null;
|
||||
|
||||
return {
|
||||
...defaultLvl,
|
||||
...lvl,
|
||||
waves: wavesCount,
|
||||
modifiers: {
|
||||
speedMultiplier: modifiers.speedMultiplier || lvl.speedMultiplier || 1.0,
|
||||
hpMultiplier: modifiers.hpMultiplier || lvl.hpMultiplier || 1.0,
|
||||
startingSun: modifiers.startingSun !== undefined ? modifiers.startingSun : (lvl.startingSun !== undefined ? lvl.startingSun : null)
|
||||
},
|
||||
wavesConfig,
|
||||
isBoss: Boolean(lvl.isBoss || lvl.is_boss || num === 25 || defaultLvl.isBoss)
|
||||
};
|
||||
});
|
||||
_serverLoaded = true;
|
||||
return _activeLevels;
|
||||
}
|
||||
} catch (e) {
|
||||
console.warn('Campaign server load error, using offline standard levels:', e);
|
||||
}
|
||||
return _activeLevels;
|
||||
}
|
||||
|
||||
// Load levels on initialization
|
||||
if (typeof window !== 'undefined') {
|
||||
setTimeout(() => {
|
||||
loadLevelsFromServer();
|
||||
}, 50);
|
||||
}
|
||||
|
||||
return {
|
||||
WORLDS,
|
||||
LEVELS,
|
||||
DAVE_DIALOGUES,
|
||||
loadLevelsFromServer,
|
||||
isServerLoaded() {
|
||||
return _serverLoaded;
|
||||
},
|
||||
getAllLevels() {
|
||||
return _activeLevels;
|
||||
},
|
||||
getDaveDialogue(levelNum, mode = 'adventure') {
|
||||
if (mode === 'boss' || mode === 'bossrush') {
|
||||
return DAVE_DIALOGUES['5-5'];
|
||||
}
|
||||
const num = parseInt(levelNum, 10) || 1;
|
||||
const levelObj = LEVELS.find(l => l.level === num);
|
||||
if (levelObj && DAVE_DIALOGUES[levelObj.code]) {
|
||||
return DAVE_DIALOGUES[levelObj.code];
|
||||
const levelObj = this.getLevel(num);
|
||||
if (levelObj) {
|
||||
if (levelObj.dialogue && typeof levelObj.dialogue === 'object' && levelObj.dialogue.text) {
|
||||
return levelObj.dialogue;
|
||||
}
|
||||
if (levelObj.daveDialogue && typeof levelObj.daveDialogue === 'object' && levelObj.daveDialogue.text) {
|
||||
return levelObj.daveDialogue;
|
||||
}
|
||||
if (DAVE_DIALOGUES[levelObj.code]) {
|
||||
return DAVE_DIALOGUES[levelObj.code];
|
||||
}
|
||||
}
|
||||
return null;
|
||||
},
|
||||
getLevel(levelNum) {
|
||||
const num = parseInt(levelNum, 10) || 1;
|
||||
return LEVELS.find(l => l.level === num) || LEVELS[0];
|
||||
return _activeLevels.find(l => l.level === num) || LEVELS.find(l => l.level === num) || LEVELS[0];
|
||||
},
|
||||
getWorld(worldId) {
|
||||
return WORLDS.find(w => w.id === worldId) || WORLDS[0];
|
||||
},
|
||||
getLevelsByWorld(worldId) {
|
||||
return LEVELS.filter(l => l.world === worldId);
|
||||
return _activeLevels.filter(l => l.world === worldId);
|
||||
},
|
||||
formatLevel(levelNum) {
|
||||
const item = this.getLevel(levelNum);
|
||||
|
||||
Reference in New Issue
Block a user