477 lines
20 KiB
TypeScript
477 lines
20 KiB
TypeScript
import { Injectable } from '@angular/core';
|
||
|
||
export interface Minigame {
|
||
name: string;
|
||
url: string;
|
||
comingSoon?: boolean;
|
||
}
|
||
|
||
export interface CardParagraph {
|
||
heading: string;
|
||
content: string;
|
||
}
|
||
export interface Card {
|
||
info: CardParagraph[];
|
||
imageUrl: string;
|
||
name: string;
|
||
types: Array<"endangered" | "normal">;
|
||
}
|
||
export interface Answer {
|
||
choises: string[];
|
||
correctChoise: string;
|
||
}
|
||
export interface Question {
|
||
category: string;
|
||
question: string;
|
||
photoUrlsAbove?: string[];
|
||
answer: Answer;
|
||
}
|
||
|
||
export interface Saved<T> {
|
||
id: string;
|
||
el: T;
|
||
}
|
||
@Injectable({
|
||
providedIn: 'root'
|
||
})
|
||
export class DbService {
|
||
private mock_minigames: Saved<Minigame>[] = [
|
||
{
|
||
id: '0',
|
||
el: {
|
||
name: 'Рециклиране',
|
||
url: '/minigames/conveyor-belt',
|
||
comingSoon: true,
|
||
}
|
||
},
|
||
{
|
||
id: '0',
|
||
el: {
|
||
name: 'BioTrivia',
|
||
url: '/minigames/biotrivia',
|
||
}
|
||
}
|
||
];
|
||
private mock_card_types: Saved<Card>[] = [
|
||
{
|
||
id: '0',
|
||
el: {
|
||
name: 'Пингвин',
|
||
types: ['normal'],
|
||
imageUrl: '/assets/images/cards/pingvin.jpg',
|
||
info: [
|
||
{
|
||
content: 'Тъй като нямат естествен враг на сушата, пингвините не показват страх, а любопитство когато към тях се приближи човек.',
|
||
heading: 'Интересно'
|
||
}
|
||
]
|
||
}
|
||
},
|
||
{
|
||
id: '1',
|
||
el: {
|
||
name: 'Пингвин',
|
||
types: ['normal'],
|
||
imageUrl: '/assets/images/cards/pingvin2.jpg',
|
||
info: [
|
||
{
|
||
content: 'Пингвините мътят яйцата си на смени. Когато мъжкият отиде да яде, той не може да намери пътя обратно към гнездото и започва да крещи шумно. Женските разпознават гласовете на партньорите си сред хиляди други и крещят в отговор, така че те да знаят къде да се върнат.',
|
||
heading: 'Интересно'
|
||
}
|
||
]
|
||
}
|
||
},
|
||
{
|
||
id: '2',
|
||
el: {
|
||
name: 'Делфин',
|
||
types: ['normal'],
|
||
imageUrl: '/assets/images/cards/delfin.jpg',
|
||
info: [
|
||
{
|
||
content: 'Делфините общуват по между си с помощта на звуци, като всеки звук може да изразява различно настроение.',
|
||
heading: 'Интересно'
|
||
}
|
||
]
|
||
}
|
||
},
|
||
{
|
||
id: '3',
|
||
el: {
|
||
name: 'Делфин',
|
||
types: ['normal'],
|
||
imageUrl: '/assets/images/cards/delfin2.jpg',
|
||
info: [
|
||
{
|
||
content: 'Делфините никога не заспиват напълно. Докато си почиват, едната половина на мозъка им продължава да бъде активна. Ето защо дори и по време на сън едното им око остава отворено.',
|
||
heading: 'Интересно'
|
||
}
|
||
]
|
||
},
|
||
},
|
||
{
|
||
id: '4',
|
||
el: {
|
||
name: 'Син кит',
|
||
types: ['normal'],
|
||
imageUrl: '/assets/images/cards/sinkit.jpg',
|
||
info: [
|
||
{
|
||
content: 'Освен най-едрото, синият кит е и най-шумното животно – звукът, който издава е от порядъка на 188 децибела и може да бъде чут на разстояние до 800 км. За сравнение, звукът на пътнически самолет е „едва” 120 децибела.',
|
||
heading: 'Интересно'
|
||
}
|
||
]
|
||
}
|
||
},
|
||
{
|
||
id: '5',
|
||
el: {
|
||
name: 'Син кит',
|
||
types: ['normal'],
|
||
imageUrl: '/assets/images/cards/sinkit2.jpg',
|
||
info: [
|
||
{
|
||
content: 'Езикът на кита тежи около 4,7 тона',
|
||
heading: 'Интересно'
|
||
}
|
||
]
|
||
}
|
||
},
|
||
{
|
||
id: '6',
|
||
el: {
|
||
name: 'Пор',
|
||
types: ['endangered'],
|
||
imageUrl: '/assets/images/cards/por.jpg',
|
||
info: [
|
||
{
|
||
heading: 'Морфология на "пор"',
|
||
content: 'Думата "пор" произлиза от латински и означава "крадец".',
|
||
},
|
||
{
|
||
heading: 'Застрашен вид',
|
||
content: 'Загубата на местообитания и бракониерството, са причина днес те или техните следи да се наблюдават изключително рядко.',
|
||
},
|
||
],
|
||
},
|
||
},
|
||
{
|
||
id: '7',
|
||
el: {
|
||
name: 'Кафява мечка',
|
||
types: ['endangered'],
|
||
imageUrl: '/assets/images/cards/kafqva-mechka.jpg',
|
||
info: [
|
||
{
|
||
heading: 'Сладки сънища',
|
||
content: 'Учените вярват, че мечките могат да сънуват.',
|
||
},
|
||
{
|
||
heading: 'Fast as f',
|
||
content: 'Макар да изглеждат тромави,мечките могат да тичат с до 60 км/ч.',
|
||
},
|
||
{
|
||
heading: 'Застрашен вид',
|
||
content: 'За съжаление хората им нанасят непоправими щети, като разкъсват с пътища и огради ареала им, унищожават горите и ги избиват.',
|
||
},
|
||
],
|
||
},
|
||
},
|
||
{
|
||
id: '8',
|
||
el: {
|
||
name: 'Балканска дива коза',
|
||
types: ['endangered'],
|
||
imageUrl: '/assets/images/cards/koza.jpg',
|
||
info: [
|
||
{
|
||
heading: 'Властелина на пръстените',
|
||
content: 'Знаехте ли, че всяка година се прибавя по още един пръстен върху рогата на дивата коза, като така може да се определи възрастта на даденото животно.',
|
||
},
|
||
{
|
||
heading: 'И ся почваме да бегами',
|
||
content: 'На света няма друго животно, което да притежава по-голяма ловкост и бързина на придвижване по хлъзгави и стръмни терени.',
|
||
},
|
||
],
|
||
},
|
||
},
|
||
{
|
||
id: '9',
|
||
el: {
|
||
name: 'Прилеп',
|
||
types: ['endangered'],
|
||
imageUrl: '/assets/images/cards/prilep.jpg',
|
||
info: [
|
||
{
|
||
heading: 'Напаст пещерна',
|
||
content: 'най-голямата колония от прилепи в света наброява над 20 милиона броя от тези летящи създания.',
|
||
},
|
||
{
|
||
heading: 'Ехо .... (ехо)',
|
||
content: 'Прилепите използват ехолокация, за да се заобиколят в тъмното.',
|
||
},
|
||
{
|
||
heading: 'Защитен вид',
|
||
content: 'Според българското законодателство, прилепите са защитени видове.',
|
||
},
|
||
],
|
||
},
|
||
},
|
||
{
|
||
id: '10',
|
||
el: {
|
||
name: 'Лалугер',
|
||
types: ['endangered'],
|
||
imageUrl: '/assets/images/cards/laluger.jpg',
|
||
info: [
|
||
{
|
||
heading: 'Втори братовчед на ленивеца',
|
||
content: 'Когато е студено, той заспива зимен сън и се събужда едва през пролетта.',
|
||
},
|
||
{
|
||
heading: 'Мали ша са напикая',
|
||
content: 'Когато е изплашен, той застава на задните си лапи.',
|
||
},
|
||
{
|
||
heading: 'Защитен вид',
|
||
content: 'Интензивно селско стопанство и използване на пестициди причиняват бързото изчезване на този вид.',
|
||
},
|
||
],
|
||
},
|
||
},
|
||
{
|
||
id: '11',
|
||
el: {
|
||
name: 'Етруската земеровка',
|
||
types: ['endangered'],
|
||
imageUrl: '/assets/images/cards/zemerovka.jpg',
|
||
info: [
|
||
{
|
||
heading: 'Размер',
|
||
content: 'Един от най-дребните бозайници на планетата с размери едва 3,6 до 5,2 см и тегло от 1,25 до 2,34 грама!',
|
||
},
|
||
{
|
||
heading: 'Лакомници',
|
||
content: 'Етруската земеровка трява да яде непрекъснато за да може да живее.',
|
||
},
|
||
],
|
||
},
|
||
},
|
||
{
|
||
id: '12',
|
||
el: {
|
||
name: 'Тюленът монах',
|
||
types: ['endangered'],
|
||
imageUrl: '/assets/images/cards/tuleni.jpg',
|
||
info: [
|
||
{
|
||
heading: 'Техния живот',
|
||
content: 'Те се крият в подводни пещери, където си почиват и раждат своите малки.',
|
||
},
|
||
],
|
||
},
|
||
},
|
||
{
|
||
id: '13',
|
||
el: {
|
||
name: 'Видра',
|
||
types: ['endangered'],
|
||
imageUrl: '/assets/images/cards/vidra.jpg',
|
||
info: [
|
||
{
|
||
heading: 'Мали колко сладко',
|
||
content: 'Морските видри се държат за ръце докато спят, за да не бъдат разделени от теченията докато се носят по водната повърхност.',
|
||
},
|
||
{
|
||
heading: 'NO MERCY',
|
||
content: 'В момент на опасност видрите показват бебетата си на хищниците, за да предизвикат съчувствие и по този начин да избегнат атаката.',
|
||
},
|
||
],
|
||
},
|
||
},
|
||
{
|
||
id: '14',
|
||
el: {
|
||
name: 'Ловен сокол',
|
||
types: ['endangered'],
|
||
imageUrl: '/assets/images/cards/sokol.jpg',
|
||
info: [
|
||
{
|
||
heading: 'Ловни навици',
|
||
content: 'Те не ловуват близо до гнездата си, а се опитват да летят доколкото е възможно.',
|
||
},
|
||
{
|
||
heading: 'Застрашен вид',
|
||
content: 'Има опасност от изчезване. Основната причина, поради която населението на ловния сокол намалява, е човешката дейност.',
|
||
},
|
||
],
|
||
},
|
||
},
|
||
];
|
||
private mock_questions: Saved<Question>[] = [
|
||
{
|
||
id: '0',
|
||
el: {
|
||
category: 'animals',
|
||
photoUrlsAbove: [ '/assets/images/questions/slon.jpg' ],
|
||
question: 'Защо бройката на слоновете в Африка намалява?',
|
||
answer: {
|
||
choises: [
|
||
'Убиван е от други животни',
|
||
'Липса на храна',
|
||
'Убивани са от бракониери',
|
||
'Замърсяване на въздуха'
|
||
],
|
||
correctChoise: 'Убивани са от бракониери',
|
||
}
|
||
}
|
||
},
|
||
{
|
||
id: '1',
|
||
el: {
|
||
category: 'animals',
|
||
photoUrlsAbove: [ '/assets/images/questions/carski orel.jpg' ],
|
||
question: 'Каква е главната причина за намаляването на бройките Царски орли?',
|
||
answer: {
|
||
choises: [
|
||
'Бракониери',
|
||
'Замърсяване',
|
||
'Отсичане на горите',
|
||
'Електрически стълбове'
|
||
],
|
||
correctChoise: 'Електрически стълбове',
|
||
}
|
||
}
|
||
},
|
||
{
|
||
id: '2',
|
||
el: {
|
||
category: 'animals',
|
||
photoUrlsAbove: [ '/assets/images/questions/carski orel.jpg' ],
|
||
question: 'Каква е главната причина за намаляването на бройките Царски орли?',
|
||
answer: {
|
||
choises: [
|
||
'Бракониери',
|
||
'Замърсяване',
|
||
'Отсичане на горите',
|
||
'Електрически стълбове'
|
||
],
|
||
correctChoise: 'Електрически стълбове',
|
||
}
|
||
}
|
||
},
|
||
{
|
||
id: '3',
|
||
el: {
|
||
category: 'animals',
|
||
photoUrlsAbove: [ '/assets/images/questions/zlatna zhaba.png' ],
|
||
question: 'Каква е причината за изчезването на Златната жаба?',
|
||
answer: {
|
||
choises: [
|
||
'Глобално затопляне',
|
||
'Замърсяване на реките',
|
||
'Отсичане на горите',
|
||
'Недостиг на храна'
|
||
],
|
||
correctChoise: 'Глобално затопляне',
|
||
}
|
||
}
|
||
},
|
||
{
|
||
id: '4',
|
||
el: {
|
||
category: 'animals',
|
||
photoUrlsAbove: [ '/assets/images/questions/shtigga.png' ],
|
||
question: 'Каква е причината за намаляването на бройките на Черният щъркел?',
|
||
answer: {
|
||
choises: [
|
||
'Замърсяването на блатата и езерата',
|
||
'Недостиг на храна',
|
||
'Глобално затопляне',
|
||
'Естествени врагове',
|
||
],
|
||
correctChoise: 'Замърсяването на блатата и езерата',
|
||
}
|
||
}
|
||
},
|
||
{
|
||
id: '5',
|
||
el: {
|
||
category: 'animals',
|
||
photoUrlsAbove: [ '/assets/images/questions/tulen.jpg' ],
|
||
question: 'Вярно или грешно. От 1996г. тюлените в Черно море намаляват, като днес те са почти изчезнали у нас.',
|
||
answer: {
|
||
choises: [
|
||
'Вярно',
|
||
'Грешно',
|
||
],
|
||
correctChoise: 'Грешно',
|
||
}
|
||
}
|
||
},
|
||
{
|
||
id: '6',
|
||
el: {
|
||
category: 'animals',
|
||
photoUrlsAbove: [ '/assets/images/questions/ris.jpg' ],
|
||
question: 'Каква е причината за намаляването на бройките рисове в България?',
|
||
answer: {
|
||
choises: [
|
||
'Глобално затопляне',
|
||
'Незаконно избиване за козината им',
|
||
'Разрушаването на местообитанията им',
|
||
'Убиван е от естествени врагове',
|
||
],
|
||
correctChoise: 'Незаконно избиване за козината им',
|
||
}
|
||
}
|
||
},
|
||
];
|
||
private mock_question_categories: string[] = [ 'animals' ];
|
||
|
||
private getRandomEls<T>(array: T[], n: number): T[] {
|
||
const result: T[] = new Array(n);
|
||
let len = array.length;
|
||
const taken = new Array(len);
|
||
if (n > len)
|
||
throw new RangeError("getRandom: more elements taken than available");
|
||
while (n--) {
|
||
const x = Math.floor(Math.random() * len);
|
||
result[n] = array[x in taken ? taken[x] : x];
|
||
taken[x] = --len in taken ? taken[len] : len;
|
||
}
|
||
return result;
|
||
}
|
||
|
||
getAllMinigames(): Saved<Minigame>[] {
|
||
return this.mock_minigames;
|
||
}
|
||
getAllCards(): Saved<Card>[] {
|
||
return this.mock_card_types;
|
||
}
|
||
|
||
getMinigame(id: string): Minigame {
|
||
const index = this.mock_minigames.findIndex(v => v.id === id);
|
||
|
||
if (index < 0) return null;
|
||
else return this.mock_minigames[index].el;
|
||
}
|
||
getCard(id: string): Card {
|
||
const index = this.mock_card_types.findIndex(v => v.id === id);
|
||
|
||
if (index < 0) return null;
|
||
else return this.mock_card_types[index].el;
|
||
}
|
||
|
||
getRandomQuestions(n: number, category: string): Question[] {
|
||
return this.getRandomEls(this.mock_questions
|
||
.filter(v => v.el.category === category)
|
||
.map(v => v.el), n);
|
||
}
|
||
getRandomCategory(): string {
|
||
return this.getRandomEls(this.mock_question_categories, 1)[0];
|
||
}
|
||
|
||
constructor() { }
|
||
}
|