feat: Initial commit Plants vs Zombies Web Edition v2.4

- 5 Biomes: Day, Night, Pool, Fog, Roof (25 Campaign levels)
- Minigames: Wall-nut Bowling, I Zombie, Roguelike, Boss Rush & Dr. Zomboss
- Systems: Zen Garden, Workshop Crafting, Almanac, Tree of Wisdom, Achievements
- Backend: REST API + SQLite Accounts & Save Synchronization
- Infrastructure: Nginx HTTPS & Docker deployment
This commit is contained in:
Antigravity committed 2026-09-17 09:30:52 +00:00
commit 6457a8904e
50 files changed
+14486

No files matched your search

+232
View File
@@ -0,0 +1,232 @@
// Suburban Almanac System: Full Encyclopedia of Plants & Zombies
window.AlmanacSystem = class AlmanacSystem {
constructor() {
this.selectedCategory = 'plants'; // 'plants' or 'zombies'
this.selectedId = 'peashooter';
this.plants = [
{
id: 'peashooter',
name: 'Горохострел',
icon: '🌱',
cost: 100,
cooldown: 'Быстрая (7.5с)',
damage: '20 (Нормальный)',
toughness: '300 (Обычная)',
desc: 'Базовая стрелковая единица газона. Стреляет одиночными горошинами по наступающим зомби.',
lore: '«Как можно быть таким популярным и при этом оставаться простым парнем? Спросите у Горохострела. Он скажет: "Просто делай меткие выстрелы!"»'
},
{
id: 'sunflower',
name: 'Подсолнух',
icon: '🌻',
cost: 50,
cooldown: 'Быстрая (7.5с)',
damage: 'Нет',
toughness: '300 (Обычная)',
desc: 'Ключевой источник солнца. Производит 25 единиц солнца каждые 12 секунд.',
lore: '«Подсолнух терпеть не может хмурую погоду. Она обожает солнце, позитивную музыку и свежий утренний полив.»'
},
{
id: 'cherrybomb',
name: 'Вишневая бомба',
icon: '🍒',
cost: 150,
cooldown: 'Очень долгая (30с)',
damage: '1800 (Колоссальный)',
toughness: '300',
desc: 'Взрывает всех зомби в радиусе 3х3 клетки почти мгновенно.',
lore: '«"Мы взорвемся!", — кричит одна вишня. "Нет, МЫ взорвемся!", — спорит вторая. В итоге взрываются обе.»'
},
{
id: 'wallnut',
name: 'Стеноорех',
icon: '🌰',
cost: 50,
cooldown: 'Долгая (20с)',
damage: 'Нет',
toughness: '4000 (Высокая)',
desc: 'Надежная преграда. Задерживает зомби на длительное время своей прочной скорлупой.',
lore: '«Люди спрашивают Стеноореха: "Каково это — когда тебя все время кусают?". Орех улыбается: "Я просто держу удар и верю в команду".»'
},
{
id: 'potatomine',
name: 'Картофельная мина',
icon: '🥔',
cost: 25,
cooldown: 'Долгая (20с)',
damage: '1800 (Колоссальный)',
toughness: '300',
desc: 'Взрывается при контакте с зомби, но требует 14 секунд на взведение под землей.',
lore: '«SPUDOW! — любимое слово Картофельной мины. Она не любит долгих разговоров, предпочитая громкий финальный аргумент.»'
},
{
id: 'snowpea',
name: 'Ледяной горох',
icon: '❄️',
cost: 175,
cooldown: 'Быстрая (7.5с)',
damage: '20 + Замедление 50%',
toughness: '300',
desc: 'Стреляет морозными горошинами, которые наносят урон и замедляют скорость ходьбы и кусания зомби.',
lore: '«Ледяной горох сохраняет хладнокровие в любой ситуации. Его кумиры — эскимо и северный полюс.»'
},
{
id: 'chomper',
name: 'Зубастик',
icon: '🌺',
cost: 150,
cooldown: 'Быстрая (7.5с)',
damage: 'Мгновенное съедение',
toughness: '300',
desc: 'Проглатывает обычного зомби целиком, после чего пережевывает его в течение 30 секунд.',
lore: '«Зубастик побеждал на чемпионате по скоростному поеданию хот-догов. Теперь он перешел на диету из зомби.»'
},
{
id: 'repeater',
name: 'Повторитель',
icon: '🌿',
cost: 200,
cooldown: 'Быстрая (7.5с)',
damage: '2x 20 (Двойной)',
toughness: '300',
desc: 'Выпускает по 2 горошины за каждый залп. Удваивает огневую мощь линии.',
lore: '«Повторитель упорно тренировался в тире, чтобы стрелять дуплетом без промаха. И у него это получилось.»'
},
{
id: 'jalapeno',
name: 'Халапеньо',
icon: '🌶️',
cost: 125,
cooldown: 'Очень долгая (30с)',
damage: '1800 (По всей полосе)',
toughness: '300',
desc: 'Уничтожает всех зомби на всей горизонтальной линии и растапливает лед.',
lore: '«Темперамент Халапеньо взрывоопасен. Достаточно одной искры, чтобы зажечь всю линию газона.»'
},
{
id: 'sunshroom',
name: 'Солнцегриб',
icon: '🍄',
cost: 25,
cooldown: 'Быстрая (7.5с)',
damage: 'Нет',
toughness: '300',
desc: 'Ночное растение. Сначала дает маленькие солнца (15 ☀️), затем вырастает и дает по 25 ☀️.',
lore: '«Солнцегриб не любит яркий день, но обожает расти при свете луны.»'
},
{
id: 'fumeshroom',
name: 'Дымогриб',
icon: '💨',
cost: 75,
cooldown: 'Быстрая (7.5с)',
damage: '20 (Сквозной урон)',
toughness: '300',
desc: 'Выстреливает волну спор на 4 клетки вперед, пробивая газеты и экраны зомби.',
lore: '«"Мои споры пахнут победой!", — заявляет Дымогриб. Зомби с этим категорически не согласны.»'
},
{
id: 'lilypad',
name: 'Кувшинка',
icon: '🪷',
cost: 25,
cooldown: 'Быстрая (7.5с)',
damage: 'Нет',
toughness: '300',
desc: 'Плавающая платформа для бассейна. Позволяет сажать наземные растения на водные дорожки.',
lore: '«Кувшинка держит на плаву всю команду в водных уровнях. Без нее ни один горохострел не поплывет.»'
},
{
id: 'gravebuster',
name: 'Могилоед',
icon: '🪵',
cost: 75,
cooldown: 'Быстрая (7.5с)',
damage: 'Уничтожает надгробие',
toughness: '300',
desc: 'Сажается на могильные камни в ночных уровнях и медленно разрушает их, оставляя монету.',
lore: '«Несмотря на грозный вид, Могилоед очень нежный и любит, когда ему чешут кору за ушком.»'
}
];
this.zombies = [
{
id: 'z_normal',
name: 'Обычный зомби',
icon: '🧟',
speed: 'Базовая (0.25)',
toughness: '200 (Обычная)',
desc: 'Рядовой пехотинец армии зомби. Медленно ковыляет вперед в поисках свежих мозгов.',
lore: '«Этот зомби любит мозги. Ничего необычного, просто типичный потребитель пригородной недвижимости.»'
},
{
id: 'z_flag',
name: 'Зомби с флагом',
icon: '🚩',
speed: 'Быстрая (0.35)',
toughness: '200',
desc: 'Ведет за собой огромную волну нечисти. Появление флага означает максимальный натиск.',
lore: '«Флаг зомби символизирует его преданность делу поедания газонов. Ни шагу назад!»'
},
{
id: 'z_cone',
name: 'Зомби с конусом',
icon: '⚠️',
speed: 'Базовая (0.25)',
toughness: '560 (200 + 360 конус)',
desc: 'Дорожный конус на голове удваивает запас его стойкости перед стрелковыми растениями.',
lore: '«Конус на голове защищает от дождя, падающих яблок и горошин. Настоящая вершина пригородной инженерии.»'
},
{
id: 'z_bucket',
name: 'Зомби с ведром',
icon: '🪣',
speed: 'Базовая (0.25)',
toughness: '1300 (200 + 1100 ведро)',
desc: 'Железное ведро делает его исключительно живучим танком. Пробивать его нужно сообща.',
lore: '«Ведро на голове принадлежало безумному маляру. Теперь оно служит идеальным шлемом.»'
},
{
id: 'z_pole',
name: 'Зомби с шестом',
icon: '🏃',
speed: 'Высокая бег (0.55)',
toughness: '340',
desc: 'Быстро бежит с шестом и перепрыгивает через первое встреченное растение.',
lore: '«Бывший школьный чемпион по прыжкам с шестом. Сохранил форму и прыгучесть даже после зомби-апокалипсиса.»'
},
{
id: 'z_newspaper',
name: 'Зомби с газетой',
icon: '📰',
speed: '0.25 ➔ 0.65 в ярости',
toughness: '350 (200 + 150 газета)',
desc: 'Газета дает временный щит. Когда газета разрушается — впадает в безумную ярость и несется вперед.',
lore: '«Он почти закончил разгадывать утренний судоку. Вы испортили его газету — теперь берегитесь!»'
},
{
id: 'z_football',
name: 'Зомби-футболист',
icon: '🏈',
speed: 'Очень высокая (0.48)',
toughness: '1600 (Тяжелая броня)',
desc: 'Тяжелый американский футболист. Быстро преодолевает дистанцию и выдерживает колоссальный урон.',
lore: '«Играет в высшей зомби-лиге. Тренер говорил ему: "Всегда пробивай оборону до конца!". Он помнит этот наказ.»'
},
{
id: 'z_yeti',
name: 'Секретный Зомби-Йети',
icon: '❄️🧟',
speed: 'Переменная (0.35)',
toughness: '1350 (Очень высокая)',
desc: 'Легендарное редкое существо. При получении половины урона разворачивается и пытается убежать! Сбрасывает 4 алмаза (800 монет).',
lore: '«О нем слагают мифы в снежных горах. Мало кто видел Йети лично, и еще меньше тех, кто успел отобрать у него алмазы до того, как он скрылся.»'
}
];
}
getItem(id) {
return this.plants.find(p => p.id === id) || this.zombies.find(z => z.id === id);
}
};