data.service.ts 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446
  1. import { Injectable } from '@angular/core';
  2. import Localbase from 'localbase';
  3. import { Character } from 'src/interfaces/character';
  4. import { Router } from '@angular/router';
  5. import { BehaviorSubject } from 'rxjs';
  6. import { Attribute } from 'src/interfaces/attribute';
  7. import { Skill } from 'src/interfaces/skill';
  8. @Injectable({
  9. providedIn: 'root',
  10. })
  11. export class DataService {
  12. db: any;
  13. constructor(private Router: Router) {
  14. this.db = new Localbase('myDatabase');
  15. // this.test();
  16. }
  17. // public test(): void {
  18. // let char: Character = {
  19. // characterData: {
  20. // name: 'Eliane',
  21. // class: '',
  22. // race: '',
  23. // level: '',
  24. // subclass: '',
  25. // background: '',
  26. // experience: '',
  27. // inspiration: '',
  28. // proficiencyBonus: '2',
  29. // },
  30. // attributes: {
  31. // strength: ['12', false],
  32. // dexterity: ['14', false],
  33. // constitution: ['16', false],
  34. // intelligence: ['10', false],
  35. // wisdom: ['16', false],
  36. // charisma: ['10', false],
  37. // },
  38. // skills: {
  39. // acrobatics: ['12', false],
  40. // animalHandling: ['11', false],
  41. // arcana: ['11', false],
  42. // athletics: ['11', false],
  43. // deception: ['11', false],
  44. // history: ['12', false],
  45. // insight: ['13', false],
  46. // intimidation: ['14', false],
  47. // investigation: ['16', false],
  48. // medicine: ['15', false],
  49. // nature: ['17', false],
  50. // perception: ['18', false],
  51. // performance: ['19', false],
  52. // persuasion: ['20', false],
  53. // religion: ['9', false],
  54. // sleightOfHand: ['8', false],
  55. // stealth: ['7', false],
  56. // survival: ['6', false],
  57. // },
  58. // combatStats: {
  59. // armorClass: '18',
  60. // initiative: '+2',
  61. // speed: '30',
  62. // hitPointMaximum: '12',
  63. // currentHitPoints: '12',
  64. // temporaryHitPoints: '0',
  65. // hitDice: '',
  66. // deathSaveSuccesses: '0',
  67. // deathSaveFailures: '0',
  68. // },
  69. // appearance: {
  70. // age: '',
  71. // height: '',
  72. // weight: '',
  73. // eyes: '',
  74. // skin: '',
  75. // hair: '',
  76. // },
  77. // personality: {
  78. // personalityTraits: '',
  79. // ideals: '',
  80. // bonds: '',
  81. // flaws: '',
  82. // },
  83. // weapons: {
  84. // name: '',
  85. // attackBonus: '',
  86. // damage: '',
  87. // damageType: '',
  88. // range: '',
  89. // description: '',
  90. // },
  91. // };
  92. // this.character = char;
  93. // // console.log('character: ', this.character);
  94. // }
  95. public character: any = {};
  96. // #region character data retrieval
  97. public getCompleteCharacter(): Character {
  98. return this.character;
  99. }
  100. public getCharacterData(): any {
  101. return this.character.characterData;
  102. }
  103. public getAppearance(): any {
  104. return this.character.appearance;
  105. }
  106. public getAttributes(): any {
  107. return this.character.attributes;
  108. }
  109. public getSkills(): any {
  110. return this.character.skills;
  111. }
  112. public getCombatStats(): any {
  113. return this.character.combatStats;
  114. }
  115. public getPersonality(): any {
  116. return this.character.personality;
  117. }
  118. public getWeapons(): any {
  119. return this.character.weapons;
  120. }
  121. // #endregion
  122. // #region Attribute observables
  123. // Atrributes
  124. /**
  125. *
  126. * @param newValue The new value of the Attribute
  127. */
  128. updateAttribute(newValue: Attribute) {
  129. const functionCall: string = newValue.name + 'Subject.next(newValue)';
  130. eval(`this.${functionCall}`);
  131. console.log('updateAttribute: ', newValue.name);
  132. // Datenbank updaten
  133. }
  134. private strengthSubject = new BehaviorSubject<Attribute>(
  135. { name: 'strength', value: 10, proficiency: true } //erstmal nur gemockt, später muss der Wert aus der Datenbank kommen
  136. );
  137. public strength$ = this.strengthSubject.asObservable();
  138. private dexteritySubject = new BehaviorSubject<Attribute>(
  139. { name: 'dexterity', value: 17, proficiency: false } //erstmal nur gemockt, später muss der Wert aus der Datenbank kommen
  140. );
  141. public dexterity$ = this.dexteritySubject.asObservable();
  142. private constitutionSubject = new BehaviorSubject<Attribute>(
  143. { name: 'constitution', value: 10, proficiency: false } //erstmal nur gemockt, später muss der Wert aus der Datenbank kommen
  144. );
  145. public constitution$ = this.constitutionSubject.asObservable();
  146. private intelligenceSubject = new BehaviorSubject<Attribute>(
  147. { name: 'intelligence', value: 13, proficiency: false } //erstmal nur gemockt, später muss der Wert aus der Datenbank kommen
  148. );
  149. public intelligence$ = this.intelligenceSubject.asObservable();
  150. private wisdomSubject = new BehaviorSubject<Attribute>(
  151. { name: 'wisdom', value: 10, proficiency: true } //erstmal nur gemockt, später muss der Wert aus der Datenbank kommen
  152. );
  153. public wisdom$ = this.wisdomSubject.asObservable();
  154. private charismaSubject = new BehaviorSubject<Attribute>(
  155. { name: 'charisma', value: 19, proficiency: false } //erstmal nur gemockt, später muss der Wert aus der Datenbank kommen
  156. );
  157. public charisma$ = this.charismaSubject.asObservable();
  158. // #endregion
  159. // #region Skill observables
  160. /**
  161. *
  162. * @param newValue The new value of the skill
  163. */
  164. updateSkill(newValue: Skill) {
  165. console.log('--------------');
  166. console.log(newValue);
  167. console.log('--------------');
  168. const functionCall: string = newValue.name + 'Subject.next(newValue)';
  169. eval(`this.${functionCall}`);
  170. console.log('updateSkill: ', newValue.name);
  171. // Datenbank updaten
  172. }
  173. private acrobaticsSubject = new BehaviorSubject<Skill>(
  174. { name: 'acrobatics', proficiency: true } //erstmal nur gemockt, später muss der Wert aus der Datenbank kommen
  175. );
  176. public acrobatics$ = this.acrobaticsSubject.asObservable();
  177. private animalHandlingSubject = new BehaviorSubject<Skill>(
  178. { name: 'animalHandling', proficiency: false } //erstmal nur gemockt, später muss der Wert aus der Datenbank kommen
  179. );
  180. public animalHandling$ = this.animalHandlingSubject.asObservable();
  181. private arcanaSubject = new BehaviorSubject<Skill>(
  182. { name: 'arcana', proficiency: false } //erstmal nur gemockt, später muss der Wert aus der Datenbank kommen
  183. );
  184. public arcana$ = this.arcanaSubject.asObservable();
  185. private athleticsSubject = new BehaviorSubject<Skill>(
  186. { name: 'athletics', proficiency: false } //erstmal nur gemockt, später muss der Wert aus der Datenbank kommen
  187. );
  188. public athletics$ = this.athleticsSubject.asObservable();
  189. private deceptionSubject = new BehaviorSubject<Skill>(
  190. { name: 'deception', proficiency: false } //erstmal nur gemockt, später muss der Wert aus der Datenbank kommen
  191. );
  192. public deception$ = this.deceptionSubject.asObservable();
  193. private historySubject = new BehaviorSubject<Skill>(
  194. { name: 'history', proficiency: false } //erstmal nur gemockt, später muss der Wert aus der Datenbank kommen
  195. );
  196. public history$ = this.historySubject.asObservable();
  197. private insightSubject = new BehaviorSubject<Skill>(
  198. { name: 'insight', proficiency: false } //erstmal nur gemockt, später muss der Wert aus der Datenbank kommen
  199. );
  200. public insight$ = this.insightSubject.asObservable();
  201. private intimidationSubject = new BehaviorSubject<Skill>(
  202. { name: 'intimidation', proficiency: false } //erstmal nur gemockt, später muss der Wert aus der Datenbank kommen
  203. );
  204. public intimidation$ = this.intimidationSubject.asObservable();
  205. private investigationSubject = new BehaviorSubject<Skill>(
  206. { name: 'investigation', proficiency: false } //erstmal nur gemockt, später muss der Wert aus der Datenbank kommen
  207. );
  208. public investigation$ = this.investigationSubject.asObservable();
  209. private medicineSubject = new BehaviorSubject<Skill>(
  210. { name: 'medicine', proficiency: false } //erstmal nur gemockt, später muss der Wert aus der Datenbank kommen
  211. );
  212. public medicine$ = this.medicineSubject.asObservable();
  213. private natureSubject = new BehaviorSubject<Skill>(
  214. { name: 'nature', proficiency: false } //erstmal nur gemockt, später muss der Wert aus der Datenbank kommen
  215. );
  216. public nature$ = this.natureSubject.asObservable();
  217. private perceptionSubject = new BehaviorSubject<Skill>(
  218. { name: 'perception', proficiency: false } //erstmal nur gemockt, später muss der Wert aus der Datenbank kommen
  219. );
  220. public perception$ = this.perceptionSubject.asObservable();
  221. private performanceSubject = new BehaviorSubject<Skill>(
  222. { name: 'performance', proficiency: false } //erstmal nur gemockt, später muss der Wert aus der Datenbank kommen
  223. );
  224. public performance$ = this.performanceSubject.asObservable();
  225. private persuasionSubject = new BehaviorSubject<Skill>(
  226. { name: 'persuasion', proficiency: false } //erstmal nur gemockt, später muss der Wert aus der Datenbank kommen
  227. );
  228. public persuasion$ = this.persuasionSubject.asObservable();
  229. private religionSubject = new BehaviorSubject<Skill>(
  230. { name: 'religion', proficiency: false } //erstmal nur gemockt, später muss der Wert aus der Datenbank kommen
  231. );
  232. public religion$ = this.religionSubject.asObservable();
  233. private sleightOfHandSubject = new BehaviorSubject<Skill>(
  234. { name: 'sleightOfHand', proficiency: false } //erstmal nur gemockt, später muss der Wert aus der Datenbank kommen
  235. );
  236. public sleightOfHand$ = this.sleightOfHandSubject.asObservable();
  237. private stealthSubject = new BehaviorSubject<Skill>(
  238. { name: 'stealth', proficiency: false } //erstmal nur gemockt, später muss der Wert aus der Datenbank kommen
  239. );
  240. public stealth$ = this.stealthSubject.asObservable();
  241. private survivalSubject = new BehaviorSubject<Skill>(
  242. { name: 'survival', proficiency: false } //erstmal nur gemockt, später muss der Wert aus der Datenbank kommen
  243. );
  244. public survival$ = this.survivalSubject.asObservable();
  245. // #endregion
  246. // #region database calls
  247. public async addData(
  248. collection: string,
  249. data: any,
  250. key?: string
  251. ): Promise<void> {
  252. if (key) {
  253. return this.db
  254. .collection(collection)
  255. .add(data, key)
  256. .then(() => {});
  257. } else {
  258. return this.db
  259. .collection(collection)
  260. .add(data)
  261. .then(() => {});
  262. }
  263. }
  264. public getData(collection: string, key: string) {
  265. return this.db.collection(collection).doc(key).get();
  266. }
  267. public getCollection(collection: string) {
  268. return this.db.collection(collection).get();
  269. }
  270. public getCollectionWithKeys(collection: string) {
  271. return this.db.collection(collection).get({ keys: true });
  272. }
  273. public deleteCollection(collection: string) {
  274. this.db.collection(collection).delete();
  275. }
  276. // #endregion
  277. // #region character selection and construction
  278. /**
  279. *
  280. * @param character The name of the character that was selected
  281. */
  282. public async selectCharacter(character: string) {
  283. console.log('selectCharacter ausgewählt');
  284. const characterData = await this.getCollectionWithKeys(character);
  285. this.character = this.buildCurrentCharacter(characterData);
  286. console.log('character: ', this.character);
  287. this.Router.navigate(['journal']);
  288. }
  289. private buildCurrentCharacter(currentCharacterData: any): Character {
  290. const [
  291. appearanceData,
  292. attributesData,
  293. characterData,
  294. combatStatsData,
  295. personalityData,
  296. skillsData,
  297. weaponsData,
  298. ] = currentCharacterData.map((entry: any) => entry.data);
  299. const appearance = {
  300. age: appearanceData.age,
  301. height: appearanceData.height,
  302. weight: appearanceData.weight,
  303. eyes: appearanceData.eyes,
  304. skin: appearanceData.skin,
  305. hair: appearanceData.hair,
  306. };
  307. const attributes = {
  308. strength: attributesData.strength,
  309. dexterity: attributesData.dexterity,
  310. constitution: attributesData.constitution,
  311. intelligence: attributesData.intelligence,
  312. wisdom: attributesData.wisdom,
  313. charisma: attributesData.charisma,
  314. };
  315. const character = {
  316. name: characterData.name,
  317. race: characterData.race,
  318. class: characterData.class,
  319. subclass: characterData.subclass,
  320. level: characterData.level,
  321. background: characterData.background,
  322. experience: characterData.experience,
  323. inspiration: characterData.inspiration,
  324. proficiencyBonus: characterData.proficiencyBonus,
  325. };
  326. const combatStats = {
  327. armorClass: combatStatsData.armorClass,
  328. initiative: combatStatsData.initiative,
  329. speed: combatStatsData.speed,
  330. hitPointMaximum: combatStatsData.hitPointMaximum,
  331. currentHitPoints: combatStatsData.currentHitPoints,
  332. temporaryHitPoints: combatStatsData.temporaryHitPoints,
  333. hitDice: combatStatsData.hitDice,
  334. deathSaveSuccesses: combatStatsData.deathSaveSuccesses,
  335. deathSaveFailures: combatStatsData.deathSaveFailures,
  336. };
  337. const personality = {
  338. personalityTraits: personalityData.personalityTraits,
  339. ideals: personalityData.ideals,
  340. bonds: personalityData.bonds,
  341. flaws: personalityData.flaws,
  342. };
  343. const skills = {
  344. acrobatics: skillsData.acrobatics,
  345. animalHandling: skillsData.animalHandling,
  346. arcana: skillsData.arcana,
  347. athletics: skillsData.athletics,
  348. deception: skillsData.deception,
  349. history: skillsData.history,
  350. insight: skillsData.insight,
  351. intimidation: skillsData.intimidation,
  352. investigation: skillsData.investigation,
  353. medicine: skillsData.medicine,
  354. nature: skillsData.nature,
  355. perception: skillsData.perception,
  356. performance: skillsData.performance,
  357. persuasion: skillsData.persuasion,
  358. religion: skillsData.religion,
  359. sleightOfHand: skillsData.sleightOfHand,
  360. stealth: skillsData.stealth,
  361. survival: skillsData.survival,
  362. };
  363. const weapons = {
  364. name: weaponsData.name,
  365. attackBonus: weaponsData.attackBonus,
  366. damage: weaponsData.damage,
  367. damageType: weaponsData.damageType,
  368. range: weaponsData.range,
  369. description: weaponsData.damageDice,
  370. };
  371. const newCharacter: Character = {
  372. appearance: appearance,
  373. attributes: attributes,
  374. characterData: character,
  375. combatStats: combatStats,
  376. personality: personality,
  377. skills: skills,
  378. weapons: weapons,
  379. };
  380. console.log('newCharacter: ', newCharacter);
  381. return newCharacter;
  382. }
  383. // #endregion
  384. }