feat(gameplay): add crazy dave casino and bank, and zombie mutation lab

This commit is contained in:
Antigravity committed 2026-09-22 09:25:08 +00:00
1 parent d8be8f4366
commit b8db5a123d
16 files changed
+2365 -135

No files matched your search

+76 -5
View File
@@ -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);