import { Component, Input } from '@angular/core'; import { DataService } from 'src/services/data/data.service'; import { Observable } from 'rxjs'; import { Attribute } from 'src/interfaces/attribute'; import { DetailsService } from 'src/services/details/details.service'; import { SaveThrowDetailsComponent } from '../save-throw-details/save-throw-details.component'; @Component({ selector: 'save-throw-field', templateUrl: './save-throw-field.component.html', styleUrls: ['./save-throw-field.component.scss'], }) export class SaveThrowFieldComponent { constructor( public dataAccessor: DataService, public detailsAccessor: DetailsService ) {} @Input() attributeName: string = ''; public attribute: Attribute = { name: '', value: 0, proficiency: false }; private proficiencyBonus: number = 0; private attributeModifier: number = 0; public saveModifier: string = '0'; public nameTranslator: any = { strength: 'Stärke', dexterity: 'Geschicklichkeit', constitution: 'Konstitution', intelligence: 'Intelligenz', wisdom: 'Weisheit', charisma: 'Charisma', }; public ngOnInit(): void { this.initAttributeSubscription(); this.initProficiencySubscription(); } private initAttributeSubscription(): void { const observable: Observable = eval( `this.dataAccessor.${this.attributeName}$` ); observable.subscribe((newValue: Attribute) => { this.attribute = newValue; this.attributeModifier = this.calculateAttributeModifier(); this.saveModifier = this.calculateSaveModifier(); }); } private initProficiencySubscription(): void { this.dataAccessor.proficiency$.subscribe((newValue: any) => { this.proficiencyBonus = newValue; this.attributeModifier = this.calculateAttributeModifier(); this.saveModifier = this.calculateSaveModifier(); }); } private calculateAttributeModifier(): number { return Math.floor((this.attribute.value - 10) / 2); } public calculateSaveModifier(): string { let mod = this.attributeModifier; if (this.attribute.proficiency) { mod += this.proficiencyBonus; } if (mod > 0) { return '+' + mod; } else { return mod.toString(); } } public openDetails(): void { this.detailsAccessor.openPanel(SaveThrowDetailsComponent, { attributeName: this.nameTranslator[this.attributeName], saveModifier: this.saveModifier, }); } public updateAttribute(): void { setTimeout(() => { this.dataAccessor.updateAttribute(this.attribute); }); } }