diff --git a/src/app/app.module.ts b/src/app/app.module.ts index a514b75..388d61f 100644 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -113,6 +113,12 @@ import { import { GamesystemConditionEditorComponent } from "./editor/interaction-editor/conditions/gamesystem-condition-editor/gamesystem-condition-editor.component"; +import { + ItemConditionEditorComponent +} from "./editor/interaction-editor/conditions/item-condition-editor/item-condition-editor.component"; +import { + ItemSelectorComponent +} from "./editor/interaction-editor/conditions/item-condition-editor/item-selector/item-selector.component"; // AoT requires an exported function for factories const httpLoaderFactory = (http: HttpClient): TranslateHttpLoader => new TranslateHttpLoader(http, './assets/i18n/', '.json'); @@ -149,75 +155,77 @@ const httpLoaderFactory = (http: HttpClient): TranslateHttpLoader => new Transl RequieredInheritancesEditorComponent, RequieredInheritancesCreatorComponent, CharacterInteractionEditorComponent, - GamesystemConditionEditorComponent + GamesystemConditionEditorComponent, + ItemConditionEditorComponent, + ItemSelectorComponent + ], + imports: [ + BrowserModule, + FormsModule, + HttpClientModule, + CoreModule, + SharedModule, + TranslateModule.forRoot({ + loader: { + provide: TranslateLoader, + useFactory: httpLoaderFactory, + deps: [HttpClient] + } + }), + BrowserAnimationsModule, + MatIcon, + MatToolbar, + MatButton, + MatFormField, + MatInput, + MatDrawerContainer, + MatDrawer, + MatIconButton, + MatMenuTrigger, + MatMenu, + MatMenuItem, + MatListItem, + MatActionList, + MatTabGroup, + MatTab, + MatTabLabel, + MatLabel, + MatFormField, + ReactiveFormsModule, + MatError, + MatDialogTitle, + MatDialogContent, + MatDialogActions, + MatMiniFabButton, + MatTreeModule, + MatTable, + MatColumnDef, + MatHeaderCell, + MatHeaderCellDef, + MatCellDef, + MatCell, + MatHeaderRow, + MatRow, + MatHeaderRowDef, + MatRowDef, + MatCheckbox, + MatSelect, + MatOption, + MatHint, + MatTooltip, + MatCard, + MatCardContent, + MatCardHeader, + MatAccordion, + MatExpansionPanel, + MatExpansionPanelTitle, + MatCardTitle, + MatExpansionPanelHeader, + MatExpansionPanelDescription, + MatAutocomplete, + MatAutocompleteTrigger, + MatNoDataRow ], - imports: [ - BrowserModule, - FormsModule, - HttpClientModule, - CoreModule, - SharedModule, - TranslateModule.forRoot({ - loader: { - provide: TranslateLoader, - useFactory: httpLoaderFactory, - deps: [HttpClient] - } - }), - BrowserAnimationsModule, - MatIcon, - MatToolbar, - MatButton, - MatFormField, - MatInput, - MatDrawerContainer, - MatDrawer, - MatIconButton, - MatMenuTrigger, - MatMenu, - MatMenuItem, - MatListItem, - MatActionList, - MatTabGroup, - MatTab, - MatTabLabel, - MatLabel, - MatFormField, - ReactiveFormsModule, - MatError, - MatDialogTitle, - MatDialogContent, - MatDialogActions, - MatMiniFabButton, - MatTreeModule, - MatTable, - MatColumnDef, - MatHeaderCell, - MatHeaderCellDef, - MatCellDef, - MatCell, - MatHeaderRow, - MatRow, - MatHeaderRowDef, - MatRowDef, - MatCheckbox, - MatSelect, - MatOption, - MatHint, - MatTooltip, - MatCard, - MatCardContent, - MatCardHeader, - MatAccordion, - MatExpansionPanel, - MatExpansionPanelTitle, - MatCardTitle, - MatExpansionPanelHeader, - MatExpansionPanelDescription, - MatAutocomplete, - MatAutocompleteTrigger, - MatNoDataRow - ], providers: [], bootstrap: [AppComponent] }) diff --git a/src/app/editor/character-editor/character-interaction-editor/character-interaction-editor.component.html b/src/app/editor/character-editor/character-interaction-editor/character-interaction-editor.component.html index 6678c34..f0dfcb8 100644 --- a/src/app/editor/character-editor/character-interaction-editor/character-interaction-editor.component.html +++ b/src/app/editor/character-editor/character-interaction-editor/character-interaction-editor.component.html @@ -103,8 +103,11 @@ - -

Inventory Conditions

+ + + + + + + {{group? 'Itemgroup':'Item'}} + + @if(group) { + @if(condition == editedCondition) { + + Itemgroup + + {{itemgroup.componentName}} + + + } @else { +

+ {{conditionAsItemgroupCondition(condition)!.itemgroup!.componentName}} +

+ } + } @else { + @if(condition == editedCondition) { + + } @else { +

+ {{conditionAsItemCondition(condition)!.item!.componentName}} +

+ } + } + +
+ + + Min + + @if(condition == editedCondition) { + + Min Value + + + } @else { + {{condition.minValue}} + } + + + + + Min + + @if(condition == editedCondition) { + + Max Value + + + } @else { + {{condition.maxValue}} + } + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/app/editor/interaction-editor/conditions/item-condition-editor/item-condition-editor.component.scss b/src/app/editor/interaction-editor/conditions/item-condition-editor/item-condition-editor.component.scss new file mode 100644 index 0000000..906202f --- /dev/null +++ b/src/app/editor/interaction-editor/conditions/item-condition-editor/item-condition-editor.component.scss @@ -0,0 +1,3 @@ +.mat-column-edit, .mat-column-delete { + width: 32px; +} diff --git a/src/app/editor/interaction-editor/conditions/item-condition-editor/item-condition-editor.component.spec.ts b/src/app/editor/interaction-editor/conditions/item-condition-editor/item-condition-editor.component.spec.ts new file mode 100644 index 0000000..3de56e1 --- /dev/null +++ b/src/app/editor/interaction-editor/conditions/item-condition-editor/item-condition-editor.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { ItemConditionEditorComponent } from './item-condition-editor.component'; + +describe('ItemConditionEditorComponent', () => { + let component: ItemConditionEditorComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [ItemConditionEditorComponent] + }) + .compileComponents(); + + fixture = TestBed.createComponent(ItemConditionEditorComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/editor/interaction-editor/conditions/item-condition-editor/item-condition-editor.component.ts b/src/app/editor/interaction-editor/conditions/item-condition-editor/item-condition-editor.component.ts new file mode 100644 index 0000000..8ee8217 --- /dev/null +++ b/src/app/editor/interaction-editor/conditions/item-condition-editor/item-condition-editor.component.ts @@ -0,0 +1,90 @@ +import {Component, Input, OnInit} from '@angular/core'; +import {AbstractInteraction} from "../../../../project/game-model/interactions/AbstractInteraction"; +import {GameModel} from "../../../../project/game-model/GameModel"; +import {MatTable, MatTableDataSource} from "@angular/material/table"; +import {InventoryCondition} from "../../../../project/game-model/interactions/condition/InventoryCondition"; +import {InventoryItemCondition} from "../../../../project/game-model/interactions/condition/InventoryItemCondition"; +import {CharacterDependency} from "../../../../project/game-model/interactions/CharacterDependency"; +import { + InventoryItemgroupCondition +} from "../../../../project/game-model/interactions/condition/InventoryItemgroupCondition"; +import {Item} from "../../../../project/game-model/inventory/Item"; + +@Component({ + selector: 'app-item-condition-editor', + templateUrl: './item-condition-editor.component.html', + styleUrl: './item-condition-editor.component.scss' +}) +export class ItemConditionEditorComponent implements OnInit{ + + @Input() interaction: AbstractInteraction | undefined + @Input() gameModel: GameModel | undefined + @Input() group: boolean = false; + + conditionDataSource: MatTableDataSource = new MatTableDataSource(); + displayedColumns: string[] = ["item", "min", "max", "edit", "delete"]; + editedCondition: InventoryCondition | undefined + addedCondition: InventoryCondition | undefined + + ngOnInit() { + this.conditionDataSource.data = this.interaction!.inventoryConditions; + } + + addCondition() { + if(this.group) { + this.addedCondition = new InventoryItemgroupCondition(CharacterDependency.NONE, 0, 0, undefined); + } else { + this.addedCondition = new InventoryItemCondition(CharacterDependency.NONE, 0, 0, undefined); + } + + this.editedCondition = this.addedCondition; + + const displayedColumns = this.conditionDataSource.data; + displayedColumns.push(this.addedCondition); + this.conditionDataSource.data = displayedColumns; + } + + editCondition(condition: InventoryCondition) { + this.editedCondition = condition; + } + + finishEditing() { + if(this.editedCondition == undefined) { + return; + } + + if(this.editedCondition.validate()) { + if(this.addedCondition != undefined) { + this.interaction!.addConditon(this.addedCondition); + this.addedCondition = undefined; + } + this.editedCondition = undefined; + } + } + + deleteCondition(deletedCondition: InventoryCondition) { + this.interaction!.removeCondition(deletedCondition); + this.conditionDataSource.data = this.conditionDataSource.data.filter(condition => condition !== deletedCondition); + } + + conditionAsItemCondition(condition: InventoryCondition) { + if(condition instanceof InventoryItemCondition) { + return condition; + } else { + return undefined; + } + } + + conditionAsItemgroupCondition(condition: InventoryCondition) { + if(condition instanceof InventoryItemgroupCondition) { + return condition; + } else { + return undefined; + } + } + + onSelectedItemChange(condition: InventoryCondition, item: Item) { + (condition as InventoryItemCondition).item = item; + console.log(condition) + } +} diff --git a/src/app/editor/interaction-editor/conditions/item-condition-editor/item-selector/item-selector.component.html b/src/app/editor/interaction-editor/conditions/item-condition-editor/item-selector/item-selector.component.html new file mode 100644 index 0000000..5546be8 --- /dev/null +++ b/src/app/editor/interaction-editor/conditions/item-condition-editor/item-selector/item-selector.component.html @@ -0,0 +1,13 @@ + + Itemgroup + + {{itemgroup.componentName}} + + + + + Item + + {{item.componentName}} + + diff --git a/src/app/editor/interaction-editor/conditions/item-condition-editor/item-selector/item-selector.component.scss b/src/app/editor/interaction-editor/conditions/item-condition-editor/item-selector/item-selector.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/app/editor/interaction-editor/conditions/item-condition-editor/item-selector/item-selector.component.spec.ts b/src/app/editor/interaction-editor/conditions/item-condition-editor/item-selector/item-selector.component.spec.ts new file mode 100644 index 0000000..727a757 --- /dev/null +++ b/src/app/editor/interaction-editor/conditions/item-condition-editor/item-selector/item-selector.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { ItemSelectorComponent } from './item-selector.component'; + +describe('ItemSelectorComponent', () => { + let component: ItemSelectorComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [ItemSelectorComponent] + }) + .compileComponents(); + + fixture = TestBed.createComponent(ItemSelectorComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/editor/interaction-editor/conditions/item-condition-editor/item-selector/item-selector.component.ts b/src/app/editor/interaction-editor/conditions/item-condition-editor/item-selector/item-selector.component.ts new file mode 100644 index 0000000..59fa2e9 --- /dev/null +++ b/src/app/editor/interaction-editor/conditions/item-condition-editor/item-selector/item-selector.component.ts @@ -0,0 +1,30 @@ +import {Component, EventEmitter, Input, OnInit, Output} from '@angular/core'; +import {ItemGroup} from "../../../../../project/game-model/inventory/ItemGroup"; +import {Item} from "../../../../../project/game-model/inventory/Item"; +import {MatFormField} from "@angular/material/form-field"; +import {MatSelect} from "@angular/material/select"; + +@Component({ + selector: 'app-item-selector', + templateUrl: './item-selector.component.html', + styleUrl: './item-selector.component.scss' +}) +export class ItemSelectorComponent implements OnInit{ + + @Input() itemgroups: ItemGroup[] = [] + @Input() selectedItem: Item | undefined + @Output() onSelectedItemChange = new EventEmitter(); + + selectedItemgroup: ItemGroup | undefined + + ngOnInit() { + if(this.selectedItem != undefined) { + this.selectedItemgroup = this.itemgroups.find(itemgroup => itemgroup.getInheritedItems().includes(this.selectedItem!)); + } + } + + onItemChange(item: Item) { + this.selectedItem = item; + this.onSelectedItemChange.emit(item); + } +} diff --git a/src/app/project/game-model/interactions/AbstractInteraction.ts b/src/app/project/game-model/interactions/AbstractInteraction.ts index 1821f69..e8e8f22 100644 --- a/src/app/project/game-model/interactions/AbstractInteraction.ts +++ b/src/app/project/game-model/interactions/AbstractInteraction.ts @@ -28,7 +28,7 @@ export abstract class AbstractInteraction { } get inventoryConditions() { - return this.conditions.filter(condition => condition instanceof InventoryCondition) + return this.conditions.filter(condition => condition instanceof InventoryCondition).map(condition => condition as InventoryCondition) } get gamesystemConditions(): GamesystemCondition[] { diff --git a/src/app/project/game-model/interactions/condition/InventoryCondition.ts b/src/app/project/game-model/interactions/condition/InventoryCondition.ts index 9644731..d3ae3a2 100644 --- a/src/app/project/game-model/interactions/condition/InventoryCondition.ts +++ b/src/app/project/game-model/interactions/condition/InventoryCondition.ts @@ -7,9 +7,11 @@ export abstract class InventoryCondition extends Condition { minValue: number maxValue: number - constructor(characterDependency: CharacterDependency, minValue: number, maxValue: number) { + protected constructor(characterDependency: CharacterDependency, minValue: number, maxValue: number) { super(characterDependency); this.minValue = minValue; this.maxValue = maxValue; } + + abstract validate(): boolean; } diff --git a/src/app/project/game-model/interactions/condition/InventoryItemCondition.ts b/src/app/project/game-model/interactions/condition/InventoryItemCondition.ts index 8c7f5c4..f827d61 100644 --- a/src/app/project/game-model/interactions/condition/InventoryItemCondition.ts +++ b/src/app/project/game-model/interactions/condition/InventoryItemCondition.ts @@ -4,10 +4,14 @@ import {CharacterDependency} from "../CharacterDependency"; export class InventoryItemCondition extends InventoryCondition { - item: Item + item: Item | undefined - constructor(characterDependency: CharacterDependency, minValue: number, maxValue: number, item: Item) { + constructor(characterDependency: CharacterDependency, minValue: number, maxValue: number, item: Item | undefined) { super(characterDependency, minValue, maxValue); this.item = item; } + + validate() { + return this.item != undefined; + } } diff --git a/src/app/project/game-model/interactions/condition/InventoryItemgroupCondition.ts b/src/app/project/game-model/interactions/condition/InventoryItemgroupCondition.ts index 3dc1033..aa78d90 100644 --- a/src/app/project/game-model/interactions/condition/InventoryItemgroupCondition.ts +++ b/src/app/project/game-model/interactions/condition/InventoryItemgroupCondition.ts @@ -3,11 +3,17 @@ import {ItemGroup} from "../../inventory/ItemGroup"; import {CharacterDependency} from "../CharacterDependency"; export class InventoryItemgroupCondition extends InventoryCondition { - itemgroup: ItemGroup + itemgroup: ItemGroup | undefined - constructor(characterDependency: CharacterDependency, minValue: number, maxValue: number, itemgroup: ItemGroup) { + constructor(characterDependency: CharacterDependency, minValue: number, maxValue: number, itemgroup: ItemGroup | undefined) { super(characterDependency, minValue, maxValue); this.itemgroup = itemgroup; } + + validate(): boolean { + return this.itemgroup != undefined; + } + + } diff --git a/src/app/project/game-model/inventory/AbstractItemGroup.ts b/src/app/project/game-model/inventory/AbstractItemGroup.ts index cc95cb0..9c833fb 100644 --- a/src/app/project/game-model/inventory/AbstractItemGroup.ts +++ b/src/app/project/game-model/inventory/AbstractItemGroup.ts @@ -1,6 +1,7 @@ import {ItemGroup} from "./ItemGroup"; import {ItemGroupCharacteristic} from "./ItemgroupCharacteristic"; import {ItemgroupType} from "./ItemgroupType"; +import {Item} from "./Item"; export class AbstractItemGroup extends ItemGroup { @@ -16,5 +17,11 @@ export class AbstractItemGroup extends ItemGroup { //Do Nothing } + getInheritedItems(): Item[] { + let items: Item[] = []; + this.children.forEach(child => items = items.concat(child.getInheritedItems())) + return items; + } + } diff --git a/src/app/project/game-model/inventory/ConcreteItemGroup.ts b/src/app/project/game-model/inventory/ConcreteItemGroup.ts index 5ad4710..05989b0 100644 --- a/src/app/project/game-model/inventory/ConcreteItemGroup.ts +++ b/src/app/project/game-model/inventory/ConcreteItemGroup.ts @@ -27,5 +27,9 @@ export class ConcreteItemGroup extends ItemGroup { }) } + getInheritedItems(): Item[] { + return this.items; + } + } diff --git a/src/app/project/game-model/inventory/ItemGroup.ts b/src/app/project/game-model/inventory/ItemGroup.ts index 3096e7b..86ba528 100644 --- a/src/app/project/game-model/inventory/ItemGroup.ts +++ b/src/app/project/game-model/inventory/ItemGroup.ts @@ -30,6 +30,5 @@ export abstract class ItemGroup extends ModelComponent { } } - - + abstract getInheritedItems(): Item[] }