/** * seed-red-book-phase2.js * +20 видов: мхи/лишайники, пресноводные, редкие насекомые, птицы болот, ночные хищники * +10 квестов * Запуск: node src/db/seed-red-book-phase2.js (из папки backend/) * Идемпотентен — не дублирует существующее. */ require('./migrate'); const db = require('./db'); /* ── helpers ── */ const groupRow = n => db.prepare('SELECT id FROM rb_groups WHERE name_ru = ?').get(n); const habitatRow = t => db.prepare('SELECT id FROM rb_habitats WHERE type = ?').get(t); const getId = n => db.prepare('SELECT id FROM rb_species WHERE name_ru = ?').get(n)?.id || null; const insSp = db.prepare(` INSERT INTO rb_species (group_id, habitat_id, name_ru, name_be, name_lat, category, by_category, description, interesting_fact, threats, conservation, where_to_see, photo_url, model_type, population_trend, biomass_kg, season_active) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?) `); const insReg = db.prepare('INSERT OR IGNORE INTO rb_species_regions (species_id, region_code) VALUES (?,?)'); const insWeb = db.prepare('INSERT OR IGNORE INTO rb_food_web (predator_id, prey_id, strength) VALUES (?,?,?)'); function addSp(d) { const existing = db.prepare('SELECT id FROM rb_species WHERE name_ru = ?').get(d.name_ru); if (existing) return existing.id; const gid = groupRow(d.group)?.id; const hid = habitatRow(d.habitat)?.id || null; if (!gid) { console.warn('Group not found:', d.group); return null; } const id = insSp.run( gid, hid, d.name_ru, d.name_be || '', d.name_lat || '', d.category, d.by_category || 'III', d.description || '', d.fact || '', JSON.stringify(d.threats || []), d.conservation || '', d.where_to_see || '', d.photo || '', d.model || 'silhouette', JSON.stringify(d.trend || []), d.biomass || 0, JSON.stringify(d.seasons || []), ).lastInsertRowid; (d.regions || []).forEach(r => insReg.run(id, r)); return id; } /* ════════════════════════════════════════════════════════════════════════ БЛОК 1 — ВИДЫ ════════════════════════════════════════════════════════════════════════ */ db.exec('BEGIN'); /* ── ПТИЦЫ (3) ─────────────────────────────────────────────────────── */ const kamyshevka = addSp({ group: 'Птицы', habitat: 'wetland', name_ru: 'Вертлявая камышевка', name_be: 'Вярцёжная чаротнiца', name_lat: 'Acrocephalus paludicola', category: 'CR', by_category: 'I', description: 'Одна из наиболее угрожаемых перелётных птиц Европы. Гнездится исключительно в низинных болотах с осоково-злаковой растительностью. Беларусь — мировой центр гнездования, здесь обитает до 80 % мировой популяции. Зимует в западной Африке.', fact: 'Беларусь является главным «домом» вертлявой камышевки — здесь гнездится большинство всех особей планеты.', threats: ['Осушение болот', 'Зарастание гнездовых угодий', 'Пожары в поймах', 'Потеря зимовок в Африке'], conservation: 'Охрана низинных болот. Восстановление обводнённых пойм. Мониторинг популяции.', where_to_see: 'Споровское болото (Брестская обл.), Ельня (Витебская обл.), Дикое болото', biomass: 0.013, seasons: ['5','6','7','8'], trend: [{year:1990,count_estimate:8000,source:'IUCN'},{year:2000,count_estimate:4500,source:'BirdLife'},{year:2010,count_estimate:2800,source:'BirdLife'},{year:2024,count_estimate:2100,source:'АПБ'}], regions: ['vitebsk','grodno','brest','minsk'], }); const dupen = addSp({ group: 'Птицы', habitat: 'wetland', name_ru: 'Дупель', name_be: 'Дупель', name_lat: 'Gallinago media', category: 'EN', by_category: 'II', description: 'Скрытный кулик заливных лугов и болот. Самцы собираются на токах, где демонстрируют оперение и трясутся всем телом. После спаривания самка одна воспитывает птенцов. Ночной образ жизни затрудняет учёт.', fact: 'Самцы дупеля токуют по ночам на «арене» — постоянном месте сбора, которое используется десятилетиями.', threats: ['Осушение пойменных лугов', 'Раннее сенокошение', 'Браконьерство на пролёте'], conservation: 'Запрет сенокошения до августа на ключевых участках. Сохранение влажных лугов.', where_to_see: 'Ельня, Освейское озеро, пойма р. Припять', biomass: 0.18, seasons: ['4','5','6','7','8','9'], trend: [{year:1995,count_estimate:1200,source:'НООО БПО'},{year:2010,count_estimate:650,source:'НООО БПО'},{year:2024,count_estimate:400,source:'НООО БПО'}], regions: ['vitebsk','minsk','grodno','brest'], }); const kobchik = addSp({ group: 'Птицы', habitat: 'meadow', name_ru: 'Кобчик', name_be: 'Кабчык', name_lat: 'Falco vespertinus', category: 'VU', by_category: 'III', description: 'Изящный сокол размером с галку. Самцы — шиферно-серые с рыжей «штанишками», самки рябые. Охотится на крупных насекомых — прямокрылых, стрекоз, жуков. Гнездится колониями в чужих гнёздах — грачей и сорок. Перелётный, зимует в Африке.', fact: 'Кобчик охотится как ласточка — хватает насекомых прямо в воздухе на бреющем полёте над лугами.', threats: ['Деградация пойменных лугов', 'Применение пестицидов (уменьшение насекомых)', 'Уничтожение колоний грачей'], conservation: 'Сохранение лугов. Запрет уничтожения грачиных колоний.', where_to_see: 'Припятский НП, луга Брестской и Гомельской областей', biomass: 0.16, seasons: ['5','6','7','8','9'], trend: [{year:1990,count_estimate:900,source:'БО'},{year:2005,count_estimate:550,source:'БО'},{year:2024,count_estimate:320,source:'АПБ'}], regions: ['brest','gomel','minsk','vitebsk'], }); /* ── МЛЕКОПИТАЮЩИЕ (2) ──────────────────────────────────────────────── */ const vyhuhol = addSp({ group: 'Млекопитающие', habitat: 'river', name_ru: 'Выхухоль русская', name_be: 'Расамаха расійская', name_lat: 'Desmana moschata', category: 'CR', by_category: 'I', description: 'Один из древнейших зверьков Земли — живой ископаемый. Обитает в старицах, заводях и медленных протоках рек Припятского бассейна. Почти слепа, ориентируется по обонянию и осязанию через вибриссы на хоботке. Выделяет мускусный секрет. Под угрозой исчезновения в Беларуси.', fact: 'Выхухоль существует без изменений более 30 миллионов лет — её предки жили рядом с носорогами и мамонтами.', threats: ['Загрязнение рек', 'Осушение пойм', 'Рыболовные сети', 'Хищники (норка американская)'], conservation: 'Охрана пойменных угодий р. Припять. Борьба с инвазивной норкой американской. Заповедники.', where_to_see: 'Пойма р. Припять (Гомельская и Брестская обл.), Припятский НП', biomass: 0.42, seasons: ['1','2','3','4','5','6','7','8','9','10','11','12'], trend: [{year:1990,count_estimate:1500,source:'НАН'},{year:2000,count_estimate:700,source:'НАН'},{year:2010,count_estimate:280,source:'НАН'},{year:2024,count_estimate:80,source:'IUCN'}], regions: ['gomel','brest'], }); const nochnitza = addSp({ group: 'Млекопитающие', habitat: 'river', name_ru: 'Ночница прудовая', name_be: 'Начніца сажалкавая', name_lat: 'Myotis dasycneme', category: 'EN', by_category: 'II', description: 'Крупная летучая мышь, охотящаяся над открытой водой. Подхватывает насекомых с поверхности прудов и рек с помощью крыльев или хвостовой перепонки. Зимует в подземельях. Образует небольшие колонии в постройках. Чувствительна к беспокойству зимовок.', fact: 'Ночница прудовая — настоящий рыбак: она «читает» рябь воды ушами, определяя местонахождение добычи под поверхностью.', threats: ['Уничтожение зимовок', 'Загрязнение водоёмов', 'Ветроэнергетика', 'Применение пестицидов'], conservation: 'Охрана зимовок (подземелья, форты). Мониторинг колоний. Сохранение прибрежных водоёмов.', where_to_see: 'Гродненские подземелья, водохранилища Минской обл., Беловежская пуща', biomass: 0.016, seasons: ['5','6','7','8','9'], trend: [{year:2000,count_estimate:600,source:'Bat Conservation'},{year:2015,count_estimate:350,source:'БО'},{year:2024,count_estimate:220,source:'БО'}], regions: ['minsk','grodno','brest','vitebsk'], }); /* ── РАСТЕНИЯ (2) ───────────────────────────────────────────────────── */ const yatrish = addSp({ group: 'Растения', habitat: 'meadow', name_ru: 'Ятрышник шлемоносный', name_be: 'Ятрышнік шлемавідны', name_lat: 'Orchis militaris', category: 'VU', by_category: 'III', description: 'Редкая наземная орхидея с необычными лилово-розовыми соцветиями, лепестки которых складываются в форму человечка с «руками» и «ногами». Растёт на известняковых лугах и в светлых лесах. Требует симбиоза с почвенными грибами для прорастания семян.', fact: 'Семена ятрышника невесомы — в 1 грамме до 50 000 штук. Но без почвенного гриба-симбионта ни одно не прорастёт.', threats: ['Распашка и застройка лугов', 'Выпас скота', 'Сбор растений'], conservation: 'Охрана мест обитания. Запрет сбора. Создание питомников.', where_to_see: 'Мозырские гряды, Новогрудская возвышенность, меловые склоны р. Сож', biomass: 0.04, seasons: ['5','6'], trend: [{year:1990,count_estimate:3200,source:'НАН'},{year:2010,count_estimate:1800,source:'НАН'},{year:2024,count_estimate:950,source:'НАН'}], regions: ['brest','grodno','minsk','gomel'], }); const rosynka = addSp({ group: 'Растения', habitat: 'wetland', name_ru: 'Росянка английская', name_be: 'Расіца англійская', name_lat: 'Drosera anglica', category: 'EN', by_category: 'II', description: 'Насекомоядное растение сфагновых болот. Длинные листья-ловушки с липкими железистыми ворсинками ловят и переваривают мух и комаров. Получает азот и фосфор из добычи, компенсируя бедность болотной почвы. Крупнейшая из белорусских росянок.', fact: 'Росянка английская переваривает насекомых за 24–48 часов, выделяя ферменты, аналогичные желудочному соку животных.', threats: ['Осушение верховых болот', 'Торфоразработка', 'Изменение гидрологии'], conservation: 'Сохранение верховых сфагновых болот. Контроль торфоразработок.', where_to_see: 'Ельня, Обстерно, Мох Великий (Витебская обл.)', biomass: 0.008, seasons: ['6','7','8'], trend: [{year:1990,count_estimate:18000,source:'НАН'},{year:2010,count_estimate:9000,source:'НАН'},{year:2024,count_estimate:5200,source:'НАН'}], regions: ['vitebsk','grodno','minsk'], }); /* ── НАСЕКОМЫЕ (4) ──────────────────────────────────────────────────── */ const zhuk_olen = addSp({ group: 'Насекомые', habitat: 'forest', name_ru: 'Жук-олень', name_be: 'Жук-алень', name_lat: 'Lucanus cervus', category: 'EN', by_category: 'II', description: 'Крупнейший жук Европы: самцы достигают 8 см. «Рога» — гипертрофированные верхние челюсти-мандибулы. Используются в турнирах за самку. Личинка живёт 5–8 лет в гнилой древесине дуба, питаясь разложившейся древесиной. Взрослый жук живёт всего 3–4 недели.', fact: 'Самец жука-оленя в рыцарском поединке захватывает соперника рогами и сбрасывает с ветки — как настоящий турнир средневековых рыцарей.', threats: ['Вырубка старых дубрав', 'Удаление пней и гниющей древесины', 'Уличное освещение (дезориентирует)'], conservation: 'Сохранение старых дубрав и пней. Создание «мёртвой древесины» в парках.', where_to_see: 'Беловежская пуща, Налибокская пуща, Гродненская пуща', biomass: 0.006, seasons: ['6','7','8'], trend: [{year:1990,count_estimate:12000,source:'НАН'},{year:2010,count_estimate:5500,source:'НАН'},{year:2024,count_estimate:2800,source:'НАН'}], regions: ['brest','grodno','minsk'], }); const dozorshik = addSp({ group: 'Насекомые', habitat: 'wetland', name_ru: 'Дозорщик-повелитель', name_be: 'Дазорца-ўладар', name_lat: 'Anax imperator', category: 'VU', by_category: 'III', description: 'Крупнейшая стрекоза Беларуси с размахом крыльев до 10 см. Самцы патрулируют водоёмы, агрессивно охраняя территорию. Охотится на других стрекоз, бабочек и даже небольших рыб. Личинка — активный хищник, живущий в воде 2–3 года.', fact: 'Дозорщик-повелитель преследует и ловит добычу с точностью до 97% — лучший результат среди всех хищников Земли.', threats: ['Эвтрофикация водоёмов', 'Осушение болот', 'Применение пестицидов'], conservation: 'Охрана водно-болотных угодий. Ограничение применения инсектицидов.', where_to_see: 'Нарочанский НП, Споровское болото, пруды Брестской обл.', biomass: 0.0009, seasons: ['6','7','8','9'], trend: [{year:2000,count_estimate:5000,source:'ЭО'},{year:2015,count_estimate:2800,source:'ЭО'},{year:2024,count_estimate:1600,source:'ЭО'}], regions: ['brest','gomel','grodno','minsk'], }); const shmel = addSp({ group: 'Насекомые', habitat: 'meadow', name_ru: 'Шмель моховой', name_be: 'Шмель імшысты', name_lat: 'Bombus muscorum', category: 'EN', by_category: 'II', description: 'Рыжевато-жёлтый шмель сырых лугов и болот. Один из немногих видов шмелей, гнездящихся на поверхности — в старых птичьих гнёздах или кустах мха. Важнейший опылитель растений заболоченных угодий. Страдает от потери местообитаний сильнее других шмелей.', fact: 'Шмель моховой — «горячая машина»: перед полётом в холодный день он вибрирует мышцами, разогревая тело до +35°C при температуре воздуха около 0°C.', threats: ['Интенсификация сельского хозяйства', 'Осушение лугов', 'Применение пестицидов', 'Болезни (Nosema)'], conservation: 'Сохранение разнотравных сырых лугов. Запрет инсектицидов на природных территориях.', where_to_see: 'Пойменные луга Полесья, заказник «Ельня», Витебские озёра', biomass: 0.0004, seasons: ['4','5','6','7','8','9'], trend: [{year:1990,count_estimate:50000,source:'ЭО'},{year:2010,count_estimate:18000,source:'ЭО'},{year:2024,count_estimate:7000,source:'ЭО'}], regions: ['vitebsk','minsk','grodno','brest'], }); const krasotEl = addSp({ group: 'Насекомые', habitat: 'forest', name_ru: 'Красотел пахучий', name_be: 'Прыгажун духмяны', name_lat: 'Calosoma sycophanta', category: 'VU', by_category: 'III', description: 'Охотник за гусеницами: жук поднимается на деревья в погоне за добычей и может съесть до 400 гусениц за сезон. Окраска переливается всеми цветами радуги — синим, зелёным, золотистым. При угрозе выбрызгивает едкую жидкость с резким запахом.', fact: 'Красотел пахучий — сознательный лесник: он специально охотится на видах-вредителях (шелкопряд, непарный шелкопряд), защищая лес от объедания.', threats: ['Применение инсектицидов', 'Вырубка широколиственных лесов', 'Сбор коллекционерами'], conservation: 'Отказ от химических методов борьбы с вредителями. Охрана широколиственных лесов.', where_to_see: 'Беловежская пуща, Налибокская пуща, широколиственные леса Гродненщины', biomass: 0.003, seasons: ['5','6','7','8'], trend: [{year:1990,count_estimate:8000,source:'НАН'},{year:2010,count_estimate:3500,source:'НАН'},{year:2024,count_estimate:1800,source:'НАН'}], regions: ['brest','grodno','minsk','vitebsk'], }); /* ── РЫБЫ (3) ───────────────────────────────────────────────────────── */ const forel = addSp({ group: 'Рыбы', habitat: 'river', name_ru: 'Форель ручьевая', name_be: 'Стронга ручайная', name_lat: 'Salmo trutta fario', category: 'VU', by_category: 'III', description: 'Пёстрая хищная рыба холодных прозрачных ручьёв и малых рек. Индикатор чистоты воды: погибает при малейшем загрязнении. Требует хорошую аэрацию и чистый гравийный субстрат для нереста. В Беларуси — на южной границе ареала, обитает только в реках Нарочанского бассейна.', fact: 'Форель настолько требовательна к кислороду, что может жить только там, где вода кристально чистая. Там, где есть форель — вода питьевого качества.', threats: ['Загрязнение рек', 'Нагрев воды', 'Браконьерство', 'Мелиорация'], conservation: 'Охрана малых рек. Контроль качества воды. Ограничение рыбалки. Искусственное разведение.', where_to_see: 'Реки Нарочь, Страча, Сервечь (Минская обл.), р. Щара (Гродненская обл.)', biomass: 0.35, seasons: ['1','2','3','4','5','6','7','8','9','10','11','12'], trend: [{year:1990,count_estimate:4200,source:'ВТ'},{year:2005,count_estimate:2100,source:'ВТ'},{year:2024,count_estimate:900,source:'ВТ'}], regions: ['vitebsk','grodno','minsk'], }); const bystryanka = addSp({ group: 'Рыбы', habitat: 'river', name_ru: 'Быстрянка обыкновенная', name_be: 'Быстранка звычайная', name_lat: 'Alburnoides bipunctatus', category: 'EN', by_category: 'II', description: 'Маленькая серебристая рыбка быстрых чистых рек с выраженным течением. Держится у поверхности стайками, питаясь насекомыми. Чувствительна к загрязнению воды. Один из исчезающих видов пресноводных рыб Беларуси, встречается единично в реках западной части страны.', fact: 'Быстрянка — «наземная» рыба: до 80% её рациона составляют упавшие в воду насекомые — комары, мухи, падёнки.', threats: ['Загрязнение рек', 'Зарегулирование стока', 'Конкуренция с инвазивными видами'], conservation: 'Охрана малых рек с быстрым течением. Мониторинг популяции.', where_to_see: 'Реки Зельвянка, Россь, Нёман (Гродненская обл.)', biomass: 0.018, seasons: ['4','5','6','7','8','9','10'], trend: [{year:1990,count_estimate:15000,source:'НАН'},{year:2010,count_estimate:5000,source:'НАН'},{year:2024,count_estimate:1200,source:'НАН'}], regions: ['grodno','brest','minsk'], }); const umbra = addSp({ group: 'Рыбы', habitat: 'wetland', name_ru: 'Умбра европейская', name_be: 'Умбра еўрапейская', name_lat: 'Umbra krameri', category: 'CR', by_category: 'I', description: 'Реликтовая рыбка — живой свидетель ледникового периода. Обитает только в медленно текущих водотоках и болотных канавах Полесья. Может переносить высыхание, зарываясь в ил. Дышит атмосферным воздухом при нехватке кислорода. Крупнейшая популяция в Европе — в Припятском полесье.', fact: 'Умбра — одна из немногих рыб, которая пережила все ледниковые периоды, прячась в рефугиях болот. Ей более 5 миллионов лет.', threats: ['Осушение болот', 'Углубление канав', 'Загрязнение воды', 'Вселение хищных рыб'], conservation: 'Охрана болотных водотоков Полесья. Мониторинг популяции. Разведение в неволе.', where_to_see: 'Припятский НП, болота Столинского района (Брестская обл.), пойма Ствиги', biomass: 0.025, seasons: ['1','2','3','4','5','6','7','8','9','10','11','12'], trend: [{year:1990,count_estimate:3500,source:'НАН'},{year:2005,count_estimate:1200,source:'НАН'},{year:2024,count_estimate:300,source:'IUCN'}], regions: ['brest','gomel'], }); /* ── ГРИБЫ (2) ──────────────────────────────────────────────────────── */ const felhodon = addSp({ group: 'Грибы', habitat: 'conifer', name_ru: 'Феллодон слитый', name_be: 'Фелодон злiты', name_lat: 'Phellodon confluens', category: 'EN', by_category: 'II', description: 'Редкий коралловидный гриб хвойных и смешанных лесов. Несколько плодовых тел часто сливаются в одну неправильную форму, откуда и название. Серовато-белый, с тонкими иглами на нижней поверхности шляпки. Индикатор старых ненарушенных лесов. Занесён в Красные книги 12 стран.', fact: 'Феллодон слитый растёт только в лесах, которым не менее 150 лет — он служит биологическим маркером древних экосистем.', threats: ['Рубки главного пользования', 'Нарушение лесной подстилки', 'Рекреационная нагрузка'], conservation: 'Сохранение старовозрастных лесов. Организация микозаповедников.', where_to_see: 'Беловежская пуща, Налибокская пуща, хвойные леса Витебской обл.', biomass: 0.06, seasons: ['8','9','10'], trend: [{year:1990,count_estimate:200,source:'НАН'},{year:2010,count_estimate:85,source:'НАН'},{year:2024,count_estimate:40,source:'НАН'}], regions: ['vitebsk','minsk','grodno','brest'], }); const gidnellum = addSp({ group: 'Грибы', habitat: 'forest', name_ru: 'Гиднеллум синеющий', name_be: 'Гiднелум сiнеючы', name_lat: 'Hydnellum caeruleum', category: 'VU', by_category: 'III', description: 'Необычный ежовый гриб с сине-фиолетовым или голубовато-серым молодым плодовым телом, темнеющим до тёмно-коричневого. Растёт в мшистых хвойных лесах, образуя микоризу с соснами и елями. Очень горький на вкус, несъедобен. Исчезает при нарушении лесной экосистемы.', fact: 'Гиднеллум синеющий настолько редок, что находка даже одного плодового тела считается значимым событием для микологов всей Европы.', threats: ['Лесозаготовки', 'Удаление мохового покрова', 'Загрязнение атмосферного воздуха'], conservation: 'Выявление и охрана местонахождений. Сохранение мшистых ельников.', where_to_see: 'Налибокская пуща, Борисовско-Березинский резерват', biomass: 0.04, seasons: ['8','9','10'], trend: [{year:2000,count_estimate:60,source:'НАН'},{year:2015,count_estimate:28,source:'НАН'},{year:2024,count_estimate:15,source:'НАН'}], regions: ['vitebsk','minsk','grodno'], }); /* ── МХИ И ЛИШАЙНИКИ (4) ────────────────────────────────────────────── */ const buksbaumiya = addSp({ group: 'Мхи и лишайники', habitat: 'conifer', name_ru: 'Буксбаумия безлистная', name_be: 'Буксбаумiя бязлістая', name_lat: 'Buxbaumia aphylla', category: 'EN', by_category: 'II', description: 'Один из самых необычных мхов: почти без листьев, с единственным крупным непропорциональным спорангием на тонкой ножке. Споровая коробочка напоминает панцирь черепахи. Растёт на гниющих пнях хвойных деревьев. Исчезает вместе с исчезновением гниющей древесины в заготовительных лесах.', fact: 'Буксбаумия безлистная проводит почти всю жизнь как невидимая нить микоризы — листовая часть появляется лишь на несколько недель для спороношения.', threats: ['Уборка гнилой древесины', 'Интенсивные рубки', 'Нарушение лесной подстилки'], conservation: 'Сохранение пней и гниющей древесины в лесах. Организация «мёртвого дерева» в заказниках.', where_to_see: 'Ельники Витебской и Минской обл., Беловежская пуща', biomass: 0.001, seasons: ['9','10','11','3','4'], trend: [{year:1990,count_estimate:800,source:'НАН'},{year:2010,count_estimate:320,source:'НАН'},{year:2024,count_estimate:150,source:'НАН'}], regions: ['vitebsk','minsk','grodno','brest'], }); const meesiya = addSp({ group: 'Мхи и лишайники', habitat: 'wetland', name_ru: 'Меезия трёхгранная', name_be: 'Меезiя трохгранная', name_lat: 'Meesia triquetra', category: 'VU', by_category: 'III', description: 'Болотный мох с характерными трёхгранными листьями, образующий плотные дернины в основаниях сфагновых кочек. Вид-индикатор ненарушенных верховых болот, чувствителен к изменению гидрологического режима. В Беларуси находится на южной границе ареала и встречается крайне редко.', fact: 'Меезия трёхгранная может фиксировать свидетельства климата за последние тысячи лет — учёные читают историю болота по слоям этого мха как по книге.', threats: ['Осушение болот', 'Добыча торфа', 'Изменение уровня грунтовых вод'], conservation: 'Охрана верховых болот. Поддержание высокого уровня воды в болотных комплексах.', where_to_see: 'Ельня (Витебская обл.), Мох Великий, Освейское болото', biomass: 0.002, seasons: ['1','2','3','4','5','6','7','8','9','10','11','12'], trend: [{year:1990,count_estimate:500,source:'НАН'},{year:2010,count_estimate:200,source:'НАН'},{year:2024,count_estimate:90,source:'НАН'}], regions: ['vitebsk','minsk'], }); const usnea = addSp({ group: 'Мхи и лишайники', habitat: 'conifer', name_ru: 'Уснея длиннейшая', name_be: 'Уснея найдаўжэйшая', name_lat: 'Usnea longissima', category: 'CR', by_category: 'I', description: 'Бородатый лишайник, свисающий с ветвей хвойных деревьев нитями длиной до 3 метров. Требует исключительно чистого воздуха и высокой влажности. Был широко распространён в старых лесах Беларуси, но исчез почти повсеместно из-за загрязнения воздуха и вырубок. Сегодня — в единичных местонахождениях.', fact: 'Уснея длиннейшая растёт со скоростью 1–2 мм в год, а её трёхметровые нити означают столетие жизни. Найти её — значит найти вековой нетронутый лес.', threats: ['Загрязнение воздуха', 'Вырубка старых хвойных лесов', 'Изменение климата'], conservation: 'Строгая охрана мест произрастания. Мониторинг качества воздуха. Охрана старолесий.', where_to_see: 'Налибокская пуща, отдельные участки Витебской обл.', biomass: 0.012, seasons: ['1','2','3','4','5','6','7','8','9','10','11','12'], trend: [{year:1990,count_estimate:120,source:'НАН'},{year:2005,count_estimate:35,source:'НАН'},{year:2024,count_estimate:8,source:'НАН'}], regions: ['vitebsk','grodno'], }); const peltigera = addSp({ group: 'Мхи и лишайники', habitat: 'forest', name_ru: 'Пельтигера горизонтальная', name_be: 'Пельцiгера гарызантальная', name_lat: 'Peltigera horizontalis', category: 'VU', by_category: 'III', description: 'Крупный листоватый лишайник с горизонтально распластанным слоевищем, вырастающим до 20 см в диаметре. Серо-голубой сверху, с заметными нитями гиф и цианобактерий на нижней поверхности. Растёт на замшелых стволах и основаниях деревьев в старых широколиственных лесах. Фиксирует атмосферный азот.', fact: 'Пельтигера — симбиоз гриба, водорослей и цианобактерий в одном организме. Она единственная из лишайников способна удобрять почву, фиксируя воздушный азот.', threats: ['Вырубка широколиственных лесов', 'Рекреационное вытаптывание', 'Загрязнение воздуха'], conservation: 'Сохранение старых широколиственных лесов. Ограничение рекреационной нагрузки.', where_to_see: 'Беловежская пуща, Налибокская пуща, старые широколиственные леса Гродненщины', biomass: 0.006, seasons: ['1','2','3','4','5','6','7','8','9','10','11','12'], trend: [{year:1990,count_estimate:350,source:'НАН'},{year:2010,count_estimate:140,source:'НАН'},{year:2024,count_estimate:70,source:'НАН'}], regions: ['vitebsk','minsk','grodno','brest'], }); db.exec('COMMIT'); console.log('✓ Виды добавлены'); console.log(` Всего видов: ${db.prepare('SELECT COUNT(*) as n FROM rb_species').get().n}`); /* ════════════════════════════════════════════════════════════════════════ БЛОК 2 — ПИЩЕВЫЕ СВЯЗИ ════════════════════════════════════════════════════════════════════════ */ db.exec('BEGIN'); const links = [ // Орлан охотится на лебедей (более активно) [getId('Орлан-белохвост'), getId('Лебедь-шипун'), 0.25], [getId('Орлан-белохвост'), getId('Лебедь-кликун'), 0.20], // Кобчик ест насекомых [kobchik, getId('Аполлон'), 0.50], [kobchik, getId('Богомол обыкновенный'), 0.30], [kobchik, shmel, 0.50], [kobchik, dozorshik, 0.40], // Вертлявая камышевка ест насекомых болот [kamyshevka, shmel, 0.20], [kamyshevka, dozorshik, 0.15], // Красотел ест бабочек/жуков [krasotEl, getId('Аполлон'), 0.60], [krasotEl, getId('Махаон'), 0.50], [krasotEl, zhuk_olen, 0.30], // Форель ест быстрянку и другую рыбу [forel, bystryanka, 0.80], [forel, getId('Хариус европейский'), 0.40], [forel, getId('Ручьевая минога'), 0.30], // Умбра — мелкий хищник [umbra, bystryanka, 0.30], // Крупные рыбы едят форель [getId('Сом обыкновенный'), forel, 0.40], [getId('Выдра речная'), forel, 0.60], [getId('Выдра речная'), bystryanka, 0.30], // Норка и выдра охотятся на выхухоль [getId('Европейская норка'), vyhuhol, 0.60], [getId('Выдра речная'), vyhuhol, 0.20], // Ночница ест насекомых над водой [nochnitza, shmel, 0.30], [nochnitza, dozorshik, 0.40], // Жук-олень поедает соки деревьев (связь через растения если есть) // Дупель и камышевка — косвенные связи через экосистему ].filter(([p, q]) => p && q); links.forEach(([p, q, s]) => { try { insWeb.run(p, q, s); } catch {} }); db.exec('COMMIT'); console.log(` Пищевых связей добавлено: ${links.length}`); console.log(` Всего пищевых связей: ${db.prepare('SELECT COUNT(*) as n FROM rb_food_web').get().n}`); /* ════════════════════════════════════════════════════════════════════════ БЛОК 3 — КВЕСТЫ (10 новых) ════════════════════════════════════════════════════════════════════════ */ db.exec('BEGIN'); function addQuest(title, description, speciesNames, xp, badge) { const existing = db.prepare('SELECT id FROM rb_quests WHERE title = ?').get(title); if (existing) { console.log(` Квест уже существует: ${title}`); return; } const ids = speciesNames.map(n => getId(n)).filter(Boolean); if (ids.length < speciesNames.length) { console.warn(` Квест "${title}": не найдены виды!`, speciesNames.filter(n => !getId(n))); } db.prepare('INSERT INTO rb_quests (title, description, species_ids, xp_reward, badge_slug) VALUES (?,?,?,?,?)').run( title, description, JSON.stringify(ids), xp, badge ); } addQuest( 'Птицы болот', 'Болота Беларуси — дом для редчайших птиц Европы. Найдите серого журавля, большого подорлика, большого кроншнепа, вертлявую камышевку и дупеля. Узнайте, почему без болот эти виды исчезнут с планеты.', ['Серый журавль', 'Большой подорлик', 'Большой кроншнеп', 'Вертлявая камышевка', 'Дупель'], 220, 'quest_bog_birds' ); addQuest( 'Ночные хищники', 'Пока мы спим, лес живёт своей жизнью. Исследуйте тайных обитателей ночи: воробьиного и домового сычей, широкоушку и прудовую ночницу. Узнайте, как эхолокация превращает темноту в охотничьи угодья.', ['Воробьиный сыч', 'Сыч домовый', 'Широкоушка европейская', 'Ночница прудовая'], 180, 'quest_night_hunters' ); addQuest( 'Диковинки Витебщины', 'Витебская область — северный форпост Беларуси со своими уникальными видами. Откройте краснозобую казарку, лобелию Дортмана, вертлявую камышевку, форель ручьевую и уснею длиннейшую — виды, которых больше нигде не встретить.', ['Краснозобая казарка', 'Лобелия Дортмана', 'Вертлявая камышевка', 'Форель ручьевая', 'Уснея длиннейшая'], 230, 'quest_vitebsk' ); addQuest( 'Царство грибов', 'Мир грибов гораздо больше того, что мы видим. Трюфель, решёточник, спарасис, ёж гриб, феллодон и гиднеллум — это не еда, это живая история леса. Найдите всех шестерых и узнайте, почему грибы — хранители экосистемы.', ['Трюфель летний', 'Решёточник красный', 'Спарасис курчавый (грибная капуста)', 'Ёж гриб (герций)', 'Феллодон слитый', 'Гиднеллум синеющий'], 300, 'quest_fungi' ); addQuest( 'Мир мхов и лишайников', 'Мхи и лишайники — первооткрыватели суши, они появились раньше динозавров. Найдите лобарию, кладонию, буксбаумию, меезию, уснею и пельтигеру — шесть хранителей нетронутых лесов и болот Беларуси.', ['Лобария лёгочная', 'Кладония звёздчатая', 'Буксбаумия безлистная', 'Меезия трёхгранная', 'Уснея длиннейшая', 'Пельтигера горизонтальная'], 280, 'quest_mosses' ); addQuest( 'Легенды Полесья', 'Полесье — болотный рай, один из последних в Европе. Его населяют легендарные жители: европейская норка, болотная черепаха, альдрованда, выхухоль русская и умбра европейская — реликты, пережившие ледниковые периоды.', ['Европейская норка', 'Черепаха болотная', 'Альдрованда пузырчатая', 'Выхухоль русская', 'Умбра европейская'], 350, 'quest_polesye' ); addQuest( 'Хранители леса', 'Лес держится на хищниках. Рысь, бурый медведь, жук-олень, усач альпийский и красотел пахучий — звенья одной цепи. Когда исчезает один хищник, лес начинает умирать. Узнайте, как они связаны между собой.', ['Рысь евразийская', 'Бурый медведь', 'Жук-олень', 'Усач альпийский', 'Красотел пахучий'], 250, 'quest_forest_guard' ); addQuest( 'Тайны реки', 'Белорусские реки скрывают живых ископаемых. Выдра, стерлядь, форель, быстрянка и умбра европейская — каждый вид-индикатор показывает, здорова ли река. Найдите их всех и прочтите историю наших вод.', ['Речная выдра', 'Стерлядь', 'Форель ручьевая', 'Быстрянка обыкновенная', 'Умбра европейская'], 220, 'quest_river2' ); addQuest( 'Летающие над водой', 'Вода с небесами — место встречи орлана-белохвоста, скопы, двух видов лебедей и дозорщика-повелителя. Все они связаны с водой и исчезнут вместе с ней. Откройте пятёрку хозяев белорусских озёр.', ['Орлан-белохвост', 'Скопа', 'Лебедь-шипун', 'Лебедь-кликун', 'Дозорщик-повелитель'], 200, 'quest_water_fliers' ); addQuest( 'Краса болот', 'Болотные растения — хищники, ловушки и редкие орхидеи. Пальчатокоренник, шейхцерия, альдрованда, вертлявая камышевка и росянка английская живут в мире, где каждая капля воды на счету. Исследуйте болото изнутри.', ['Пальчатокоренник мясокрасный', 'Шейхцерия болотная', 'Альдрованда пузырчатая', 'Вертлявая камышевка', 'Росянка английская'], 230, 'quest_bog_beauty' ); db.exec('COMMIT'); console.log('✓ Квесты добавлены'); console.log(` Всего квестов: ${db.prepare('SELECT COUNT(*) as n FROM rb_quests').get().n}`); console.log('\n✅ seed-red-book-phase2.js завершён!'); console.log(` Видов: ${db.prepare('SELECT COUNT(*) as n FROM rb_species').get().n}`); console.log(` Квестов: ${db.prepare('SELECT COUNT(*) as n FROM rb_quests').get().n}`); console.log(` Пищевых связей: ${db.prepare('SELECT COUNT(*) as n FROM rb_food_web').get().n}`);