From 7a5f4f6d48d56231428661213bd308da79111d4b Mon Sep 17 00:00:00 2001 From: EL2020 Date: Sat, 19 Aug 2023 10:45:25 -0400 Subject: [PATCH 1/9] added support for SHOW_MODAL_CHOICE --- .../event-editor/event-helper.service.ts | 2 +- .../event-registry/event-registry.service.ts | 2 + .../event-registry/show-modal-choice.ts | 74 +++++++++++++++++++ 3 files changed, 77 insertions(+), 1 deletion(-) create mode 100644 webapp/src/app/components/widgets/event-widget/event-registry/show-modal-choice.ts diff --git a/webapp/src/app/components/widgets/event-widget/event-editor/event-helper.service.ts b/webapp/src/app/components/widgets/event-widget/event-editor/event-helper.service.ts index 0f3f7018..8133437c 100644 --- a/webapp/src/app/components/widgets/event-widget/event-editor/event-helper.service.ts +++ b/webapp/src/app/components/widgets/event-widget/event-editor/event-helper.service.ts @@ -27,7 +27,7 @@ export class EventHelperService { if (valIf.elseStep) { valIf.elseStep = valIf.elseStep.map((v: EventType) => this.getEventFromType(v, actionStep)); } - } else if (val.type === 'SHOW_CHOICE') { + } else if (val.type === 'SHOW_CHOICE' || val.type === 'SHOW_MODAL_CHOICE') { const valChoice = val as any; valChoice.options.forEach((option: any, index: number) => { valChoice[index] = valChoice[index].map((v: EventType) => this.getEventFromType(v, actionStep)); diff --git a/webapp/src/app/components/widgets/event-widget/event-registry/event-registry.service.ts b/webapp/src/app/components/widgets/event-widget/event-registry/event-registry.service.ts index 512dab48..bd98ce47 100644 --- a/webapp/src/app/components/widgets/event-widget/event-registry/event-registry.service.ts +++ b/webapp/src/app/components/widgets/event-widget/event-registry/event-registry.service.ts @@ -21,6 +21,7 @@ import { ShowMsg } from './show-msg'; import { StartNpcTradeMenu } from './start-npc-trade-menu'; import { Wait } from './wait'; import { ShowSideMsg } from './show-side-msg'; +import { ShowModalChoice } from './show-modal-choice'; type EventConstructor = new (domSanitizer: DomSanitizer, data: T, actionStep: boolean) => AbstractEvent; @@ -52,6 +53,7 @@ export class EventRegistryService { this.register('START_NPC_TRADE_MENU', StartNpcTradeMenu); this.register('OPEN_QUEST_DIALOG', OpenQuestDialog); this.register('SHOW_SIDE_MSG', ShowSideMsg); + this.register('SHOW_MODAL_CHOICE', ShowModalChoice); } diff --git a/webapp/src/app/components/widgets/event-widget/event-registry/show-modal-choice.ts b/webapp/src/app/components/widgets/event-widget/event-registry/show-modal-choice.ts new file mode 100644 index 00000000..bbc186bd --- /dev/null +++ b/webapp/src/app/components/widgets/event-widget/event-registry/show-modal-choice.ts @@ -0,0 +1,74 @@ +import { Label } from '../../../../models/events'; +import { EntityAttributes } from '../../../../services/phaser/entities/cc-entity'; +import { AbstractEvent, EventType } from './abstract-event'; + +export interface ShowModalChoiceData extends EventType { + [key: number]: AbstractEvent[]; + + text: Label; + options: { + label: Label; + }[]; +} + +export class ShowModalChoice extends AbstractEvent { + private attributes: EntityAttributes = { + text: { + type: 'LangLabel', + description: 'Text of modal dialog', + hs: true + }, + options: { + type: 'ModalChoiceOptions', + description: 'All the options of the modal dialog', + C2: true + } + }; + + getAttributes(): EntityAttributes { + return this.attributes; + } + + update() { + this.children = []; + this.info = this.combineStrings( + this.getTypeString('#7ea3ff'), + this.getPropString('text', this.data.text.en_US) + ); + + this.data.options.forEach((option, index) => { + this.children[index] = { + title: this.getColoredString('Choice. ' + option.label.en_US, '#838383'), + events: this.data[index] || [], + draggable: false + }; + }); + } + + override export(): ShowModalChoiceData { + const out: ShowModalChoiceData = { + type: this.data.type, + text: this.data.text, + options: this.data.options, + }; + this.children.forEach((child, index) => { + if (!child.events) { + console.error('wtf', this); + } + out[index] = child.events.map(v => v.export()); + }); + + return JSON.parse(JSON.stringify(out)); + } + + protected generateNewDataInternal() { + return { + text: {}, + options: [{ + label: {} + }, { + label: {} + }] + }; + } +} From dcab2a87e9a2871a869ea6843570496b83dfb9c2 Mon Sep 17 00:00:00 2001 From: EL2020 Date: Sat, 19 Aug 2023 11:04:48 -0400 Subject: [PATCH 2/9] made varconditions use the string editor --- webapp/src/app/components/widgets/widget-registry.service.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/webapp/src/app/components/widgets/widget-registry.service.ts b/webapp/src/app/components/widgets/widget-registry.service.ts index 821bc8d9..2c0499f4 100644 --- a/webapp/src/app/components/widgets/widget-registry.service.ts +++ b/webapp/src/app/components/widgets/widget-registry.service.ts @@ -39,6 +39,7 @@ export class WidgetRegistryService { this.register('LangLabel', LangLabelWidgetComponent); this.register('EntityAnim', StringWidgetComponent); this.register('CustomDesType', CustomDesTypeWidgetComponent); + this.register('VarCondition', StringWidgetComponent); } private setDefaultWidget(widget: any) { From b2eb5bc5b979c7c1cf3b1fd6d8d88a7bca21f033 Mon Sep 17 00:00:00 2001 From: EL2020 Date: Sat, 19 Aug 2023 12:04:34 -0400 Subject: [PATCH 3/9] fixed step editor from always refreshing events with children --- .../event-editor/detail/event-detail.component.ts | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/webapp/src/app/components/widgets/event-widget/event-editor/detail/event-detail.component.ts b/webapp/src/app/components/widgets/event-widget/event-editor/detail/event-detail.component.ts index ca87da3e..dd24e379 100644 --- a/webapp/src/app/components/widgets/event-widget/event-editor/detail/event-detail.component.ts +++ b/webapp/src/app/components/widgets/event-widget/event-editor/detail/event-detail.component.ts @@ -45,8 +45,10 @@ export class EventDetailComponent implements OnDestroy { } public loadEvent(event: AbstractEvent) { - this.event = event; - this.loadSettings(); + if(this.event !== event) { + this.event = event; + this.loadSettings(); + } } private clearSubscriptions() { @@ -96,6 +98,7 @@ export class EventDetailComponent implements OnDestroy { instance.key = key; instance.attribute = val; const sub = instance.onChange.subscribe(() => this.update()); + this.changeSubscriptions.push(sub); return instance; } From 1873ac81d1de65234c558caf5b195ec5e21116fd Mon Sep 17 00:00:00 2001 From: EL2020 Date: Sat, 19 Aug 2023 13:41:37 -0400 Subject: [PATCH 4/9] added support for more types for properties, improved some step previews --- .../event-registry/abstract-event.ts | 82 +++++++++++++++++-- .../event-widget/event-registry/do-action.ts | 1 + .../event-registry/show-choice.ts | 10 ++- .../event-registry/show-modal-choice.ts | 10 ++- 4 files changed, 91 insertions(+), 12 deletions(-) diff --git a/webapp/src/app/components/widgets/event-widget/event-registry/abstract-event.ts b/webapp/src/app/components/widgets/event-widget/event-registry/abstract-event.ts index 4ef03ecb..d705d37e 100644 --- a/webapp/src/app/components/widgets/event-widget/event-registry/abstract-event.ts +++ b/webapp/src/app/components/widgets/event-widget/event-registry/abstract-event.ts @@ -59,12 +59,63 @@ export abstract class AbstractEvent { const attr = this.getAttributes(); if (attr && attr[key]) { const type = attr[key].type; - if (type === 'Color') { - value = this.getColorRectangle(value); - } else if (type === 'Vec2' && value) { - value = this.getVec2String(value.x, value.y); - } else if (type === 'Entity') { - value = '[' + value.name + ']'; + switch (type) { + case 'Color': + value = this.getColorRectangle(value); + break; + case 'Vec2': + case 'Vec2Expression': + value = this.getVarExpressionValue(value, true); + if(typeof value !== 'string') { + value = this.getVec2String(value.x, value.y); + } + break; + case 'Vec3': + case 'Vec3Expression': + value = this.getVarExpressionValue(value, true); + if(typeof value !== 'string') { + value = this.getVec3String(value.x, value.y, value.z, value.lvl); + } + break; + case 'Offset': + if(value) { + value = this.getVec3String(value.x, value.y, value.z); + } + break; + case 'Entity': + if(value.player){ + value = 'player'; + } else if(value.self) { + value = 'self'; + } else if(value.name) { + value = '[' + value.name + ']'; + } else if (value.varName) { + value = `[Var: ${value.varName}]`; + } else if (value.party) { + value = `[Party: ${value.party}]`; + } + break; + case 'EnemyType': + value = '[' + value.type + ']'; + break; + case 'NumberExpression': + case 'StringExpression': + case 'BooleanExpression': + value = this.getVarExpressionValue(value); + break; + case 'VarName': + if(value.indirect) { + value = `[indirect: ${value.indirect}]`; + } else if (value.actorAttrib) { + value = `[actorAttrib: ${value.indirect}]`; + } + break; + case 'Effect': + case 'Animation': + if(value) { + value = `${value.sheet}/${value.name}`; + } + break; } } @@ -73,9 +124,28 @@ export abstract class AbstractEvent { return `${key}: ${value}`; } + protected getVarExpressionValue(value: any, supportsActorAttrib = false): any { + if(value.indirect) { + value = `[indirect: ${value.indirect}]`; + } else if(value.varName) { + value = `[varName: ${value.varName}]`; + } else if(value.actorAttrib && supportsActorAttrib) { + value = `[actorAttrib: ${value.actorAttrib}]`; + } + return value; + } + protected getVec2String(x: number, y: number): string { return `(${this.sanitize(x)}, ${this.sanitize(y)})`; } + + protected getVec3String(x: number, y: number, z?: number, level?: number): string { + if(level !== undefined) { + return `(${this.sanitize(x)}, ${this.sanitize(y)}, lvl ${this.sanitize(level)})`; + } else { + return `(${this.sanitize(x)}, ${this.sanitize(y)}, ${this.sanitize(z!)})`; + } + } protected getTypeString(color: string): string { color = this.sanitize(color); diff --git a/webapp/src/app/components/widgets/event-widget/event-registry/do-action.ts b/webapp/src/app/components/widgets/event-widget/event-registry/do-action.ts index cc0f9966..358dd907 100644 --- a/webapp/src/app/components/widgets/event-widget/event-registry/do-action.ts +++ b/webapp/src/app/components/widgets/event-widget/event-registry/do-action.ts @@ -37,6 +37,7 @@ export class DoAction extends AbstractEvent { update() { this.info = this.combineStrings( this.getTypeString('#8fe174'), + this.getPropString('entity'), this.getPropString('actions', '[' + this.data.action.length + ']'), this.getPropString('repeating'), this.getPropString('wait'), diff --git a/webapp/src/app/components/widgets/event-widget/event-registry/show-choice.ts b/webapp/src/app/components/widgets/event-widget/event-registry/show-choice.ts index bf75ac0e..c61c1964 100644 --- a/webapp/src/app/components/widgets/event-widget/event-registry/show-choice.ts +++ b/webapp/src/app/components/widgets/event-widget/event-registry/show-choice.ts @@ -51,7 +51,7 @@ export class ShowChoice extends AbstractEvent { this.data.options.forEach((option, index) => { this.children[index] = { - title: this.getColoredString('Choice. ' + option.label.en_US, '#838383'), + title: this.getColoredString('Choice: ', '#838383') + option.label.en_US, events: this.data[index] || [], draggable: false }; @@ -81,9 +81,13 @@ export class ShowChoice extends AbstractEvent { return { person: {}, options: [{ - label: {} + label: { + en_US: 'Choice 1' + } }, { - label: {} + label: { + en_US: 'Choice 2' + } }] }; } diff --git a/webapp/src/app/components/widgets/event-widget/event-registry/show-modal-choice.ts b/webapp/src/app/components/widgets/event-widget/event-registry/show-modal-choice.ts index bbc186bd..c8f735e4 100644 --- a/webapp/src/app/components/widgets/event-widget/event-registry/show-modal-choice.ts +++ b/webapp/src/app/components/widgets/event-widget/event-registry/show-modal-choice.ts @@ -38,7 +38,7 @@ export class ShowModalChoice extends AbstractEvent { this.data.options.forEach((option, index) => { this.children[index] = { - title: this.getColoredString('Choice. ' + option.label.en_US, '#838383'), + title: this.getColoredString('Choice: ', '#838383') + option.label.en_US, events: this.data[index] || [], draggable: false }; @@ -65,9 +65,13 @@ export class ShowModalChoice extends AbstractEvent { return { text: {}, options: [{ - label: {} + label: { + en_US: 'Choice 1' + } }, { - label: {} + label: { + en_US: 'Choice 2' + } }] }; } From 986a931faee70e85806baaad21ef4b99a7146970 Mon Sep 17 00:00:00 2001 From: EL2020 Date: Sat, 19 Aug 2023 17:15:43 -0400 Subject: [PATCH 5/9] added changelog --- CHANGELOG.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 147d9c54..07dd29cb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,18 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). ## [Unreleased] + +### Added +- Added proper support for the event step `SHOW_MODAL_CHOICE`. + + +### Changed +- `VarConditions` now use the string editor, as opposed to the JSON editor. +- Improved support for event/action step property previews - specifically for `Vec2`, `Vec3`, `Offset`, `Entity`, `EnemyType`, `NumberExpression`, `StringExpression`, `BooleanExpression`, `VarName`, `Effect`, and `Animation`. + +### Fixed +- Events with children/branching steps (such as `IF`, `SHOW_CHOICE`, `SHOW_MODAL_CHOICE`, etc.) will no longer fully refresh upon any edits, causing focus to be reset. + ## [1.0.0] 2023-08-04 ### Added From 70279364f0fb60564fde2c85b11ca162f808e048 Mon Sep 17 00:00:00 2001 From: EL2020 Date: Sun, 20 Aug 2023 11:22:18 -0400 Subject: [PATCH 6/9] added text color rendering support, SET_MSG_EXPRESSION --- CHANGELOG.md | 4 +-- .../event-registry/abstract-event.ts | 33 +++++++++++++++++++ .../event-registry/event-registry.service.ts | 2 ++ .../event-registry/set-msg-expression.ts | 32 ++++++++++++++++++ .../event-registry/show-choice.ts | 2 +- .../event-registry/show-modal-choice.ts | 4 +-- .../event-widget/event-registry/show-msg.ts | 2 +- .../event-registry/show-side-msg.ts | 2 +- 8 files changed, 74 insertions(+), 7 deletions(-) create mode 100644 webapp/src/app/components/widgets/event-widget/event-registry/set-msg-expression.ts diff --git a/CHANGELOG.md b/CHANGELOG.md index 07dd29cb..1101f93d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,8 +6,8 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). ## [Unreleased] ### Added -- Added proper support for the event step `SHOW_MODAL_CHOICE`. - +- Added proper support for the event steps `SHOW_MODAL_CHOICE` and `SET_MSG_EXPRESSION`. +- Added rendering of text colors in relevant events (such as `SHOW_MSG`). ### Changed - `VarConditions` now use the string editor, as opposed to the JSON editor. diff --git a/webapp/src/app/components/widgets/event-widget/event-registry/abstract-event.ts b/webapp/src/app/components/widgets/event-widget/event-registry/abstract-event.ts index d705d37e..c8263e76 100644 --- a/webapp/src/app/components/widgets/event-widget/event-registry/abstract-event.ts +++ b/webapp/src/app/components/widgets/event-widget/event-registry/abstract-event.ts @@ -1,6 +1,7 @@ import { SecurityContext } from '@angular/core'; import { DomSanitizer } from '@angular/platform-browser'; import { EntityAttributes } from '../../../../services/phaser/entities/cc-entity'; +import { Label } from '../../../../models/events'; export interface EventType { type: string; @@ -163,6 +164,38 @@ export abstract class AbstractEvent { protected getColorRectangle(color: string): string { return `       `; } + + protected getProcessedText(langLabel: Label): string { + const textColors = [ + null, + '#ff6969', + '#65ff89', + '#ffe430', + '#808080', + '#ffe430', + ]; + let text = langLabel?.en_US ?? ''; + + let inSpan = false; + text = text.replace(/\\c\[(\d+)\]|$/g, (substr, colorIndex) => { + const color = textColors[+colorIndex]; + let replacement = ''; + if(inSpan) { + replacement += ''; + inSpan = false; + } + if(color) { + replacement += ``; + inSpan = true; + } else if (color !== null) { + //preserve the original color code untouched. + replacement += substr; + } + return replacement; + }); + + return text; + } private sanitize(val: string | number) { return this.domSanitizer.sanitize(SecurityContext.HTML, val) || ''; diff --git a/webapp/src/app/components/widgets/event-widget/event-registry/event-registry.service.ts b/webapp/src/app/components/widgets/event-widget/event-registry/event-registry.service.ts index bd98ce47..0a244c28 100644 --- a/webapp/src/app/components/widgets/event-widget/event-registry/event-registry.service.ts +++ b/webapp/src/app/components/widgets/event-widget/event-registry/event-registry.service.ts @@ -22,6 +22,7 @@ import { StartNpcTradeMenu } from './start-npc-trade-menu'; import { Wait } from './wait'; import { ShowSideMsg } from './show-side-msg'; import { ShowModalChoice } from './show-modal-choice'; +import { SetMsgExpression } from './set-msg-expression'; type EventConstructor = new (domSanitizer: DomSanitizer, data: T, actionStep: boolean) => AbstractEvent; @@ -54,6 +55,7 @@ export class EventRegistryService { this.register('OPEN_QUEST_DIALOG', OpenQuestDialog); this.register('SHOW_SIDE_MSG', ShowSideMsg); this.register('SHOW_MODAL_CHOICE', ShowModalChoice); + this.register('SET_MSG_EXPRESSION', SetMsgExpression); } diff --git a/webapp/src/app/components/widgets/event-widget/event-registry/set-msg-expression.ts b/webapp/src/app/components/widgets/event-widget/event-registry/set-msg-expression.ts new file mode 100644 index 00000000..bbe2f30b --- /dev/null +++ b/webapp/src/app/components/widgets/event-widget/event-registry/set-msg-expression.ts @@ -0,0 +1,32 @@ +import { Person } from '../../../../models/events'; +import { AbstractEvent, EventType } from './abstract-event'; + +interface SetMsgExpressionData extends EventType { + person: Person; +} + +export class SetMsgExpression extends AbstractEvent { + private attributes = { + person: { + type: 'PersonExpression', + description: 'Person + Expression to change' + } + }; + + getAttributes() { + return this.attributes; + } + + update() { + this.info = this.combineStrings( + this.getTypeString('#7ea3ff'), + this.getPropString('person', this.data.person.person + '>​' + this.data.person.expression), + ); + } + + generateNewDataInternal() { + return { + person: {} + }; + } +} diff --git a/webapp/src/app/components/widgets/event-widget/event-registry/show-choice.ts b/webapp/src/app/components/widgets/event-widget/event-registry/show-choice.ts index c61c1964..32f3985b 100644 --- a/webapp/src/app/components/widgets/event-widget/event-registry/show-choice.ts +++ b/webapp/src/app/components/widgets/event-widget/event-registry/show-choice.ts @@ -51,7 +51,7 @@ export class ShowChoice extends AbstractEvent { this.data.options.forEach((option, index) => { this.children[index] = { - title: this.getColoredString('Choice: ', '#838383') + option.label.en_US, + title: this.getColoredString('Choice: ', '#838383') + this.getProcessedText(option.label), events: this.data[index] || [], draggable: false }; diff --git a/webapp/src/app/components/widgets/event-widget/event-registry/show-modal-choice.ts b/webapp/src/app/components/widgets/event-widget/event-registry/show-modal-choice.ts index c8f735e4..7efab826 100644 --- a/webapp/src/app/components/widgets/event-widget/event-registry/show-modal-choice.ts +++ b/webapp/src/app/components/widgets/event-widget/event-registry/show-modal-choice.ts @@ -33,12 +33,12 @@ export class ShowModalChoice extends AbstractEvent { this.children = []; this.info = this.combineStrings( this.getTypeString('#7ea3ff'), - this.getPropString('text', this.data.text.en_US) + this.getPropString('text', this.getProcessedText(this.data.text)) ); this.data.options.forEach((option, index) => { this.children[index] = { - title: this.getColoredString('Choice: ', '#838383') + option.label.en_US, + title: this.getColoredString('Choice: ', '#838383') + this.getProcessedText(option.label), events: this.data[index] || [], draggable: false }; diff --git a/webapp/src/app/components/widgets/event-widget/event-registry/show-msg.ts b/webapp/src/app/components/widgets/event-widget/event-registry/show-msg.ts index be1ec202..db0f10a2 100644 --- a/webapp/src/app/components/widgets/event-widget/event-registry/show-msg.ts +++ b/webapp/src/app/components/widgets/event-widget/event-registry/show-msg.ts @@ -31,7 +31,7 @@ export class ShowMsg extends AbstractEvent { update() { this.info = this.combineStrings( this.getColoredString(this.data.person.person + '>​' + this.data.person.expression, '#ffe188'), - this.data.message?.en_US + this.getProcessedText(this.data.message) ); } diff --git a/webapp/src/app/components/widgets/event-widget/event-registry/show-side-msg.ts b/webapp/src/app/components/widgets/event-widget/event-registry/show-side-msg.ts index 5cc7ac96..9116cb31 100644 --- a/webapp/src/app/components/widgets/event-widget/event-registry/show-side-msg.ts +++ b/webapp/src/app/components/widgets/event-widget/event-registry/show-side-msg.ts @@ -13,7 +13,7 @@ export class ShowSideMsg extends DefaultEvent { this.info = this.combineStrings( this.getTypeString('#fa5aff'), this.getColoredString(this.data.person?.person + '>​' + this.data.person?.expression, '#ffe188'), - this.data.message?.en_US + this.getProcessedText(this.data.message) ); } From 4f101038efe2605cb81e043dec2f7f453610860f Mon Sep 17 00:00:00 2001 From: EL2020 Date: Sun, 20 Aug 2023 18:10:25 -0400 Subject: [PATCH 7/9] made most requested changes, added WM_Type --- .../enemy-type-overlay.component.ts | 4 +- .../event-registry/abstract-event.ts | 8 +- .../event-registry/add-msg-person.ts | 3 +- .../event-registry/clear-slow-motion.ts | 3 +- .../event-widget/event-registry/do-action.ts | 3 +- .../event-widget/event-registry/goto-label.ts | 3 +- .../widgets/event-widget/event-registry/if.ts | 3 +- .../event-widget/event-registry/label.ts | 3 +- .../event-registry/set-camera-between.ts | 3 +- .../event-registry/set-camera-pos.ts | 3 +- .../event-registry/set-camera-target.ts | 3 +- .../event-registry/set-camera-zoom.ts | 3 +- .../event-registry/set-msg-expression.ts | 13 +-- .../event-registry/set-overlay.ts | 3 +- .../event-registry/set-player-core.ts | 3 +- .../event-registry/show-choice.ts | 14 +-- .../event-registry/show-modal-choice.ts | 16 ++- .../event-widget/event-registry/show-msg.ts | 3 +- .../event-widget/event-registry/wait.ts | 3 +- .../app/services/phaser/entities/cc-entity.ts | 103 +++++++++++++++++- 20 files changed, 154 insertions(+), 46 deletions(-) diff --git a/webapp/src/app/components/widgets/enemy-type-widget/enemy-type-overlay/enemy-type-overlay.component.ts b/webapp/src/app/components/widgets/enemy-type-widget/enemy-type-overlay/enemy-type-overlay.component.ts index 75728905..f4240f14 100644 --- a/webapp/src/app/components/widgets/enemy-type-widget/enemy-type-overlay/enemy-type-overlay.component.ts +++ b/webapp/src/app/components/widgets/enemy-type-widget/enemy-type-overlay/enemy-type-overlay.component.ts @@ -16,7 +16,7 @@ export class EnemyTypeWidgetOverlayComponent extends AbstractWidget implements O 'OTHER' ]; readonly partyAttributes: AttributeValue = { - type: 'string', + type: 'String', description: '', withNull: true, options: this.makeOptions(this.partyOptions) @@ -32,7 +32,7 @@ export class EnemyTypeWidgetOverlayComponent extends AbstractWidget implements O 'NORTH_WEST' ]; readonly faceAttributes: AttributeValue = { - type: 'string', + type: 'String', description: '', withNull: true, options: this.makeOptions(this.faceOptions) diff --git a/webapp/src/app/components/widgets/event-widget/event-registry/abstract-event.ts b/webapp/src/app/components/widgets/event-widget/event-registry/abstract-event.ts index c8263e76..859232e0 100644 --- a/webapp/src/app/components/widgets/event-widget/event-registry/abstract-event.ts +++ b/webapp/src/app/components/widgets/event-widget/event-registry/abstract-event.ts @@ -1,6 +1,6 @@ import { SecurityContext } from '@angular/core'; import { DomSanitizer } from '@angular/platform-browser'; -import { EntityAttributes } from '../../../../services/phaser/entities/cc-entity'; +import { EntityAttributes, Base_WM_Type } from '../../../../services/phaser/entities/cc-entity'; import { Label } from '../../../../models/events'; export interface EventType { @@ -54,13 +54,13 @@ export abstract class AbstractEvent { } protected getPropString(key: string, value?: any): string { - if (!value) { + if (value === undefined) { value = this.data[key as keyof T]; } const attr = this.getAttributes(); if (attr && attr[key]) { const type = attr[key].type; - switch (type) { + switch (type as Base_WM_Type) { case 'Color': value = this.getColorRectangle(value); break; @@ -172,7 +172,7 @@ export abstract class AbstractEvent { '#65ff89', '#ffe430', '#808080', - '#ffe430', + '#ff8932', ]; let text = langLabel?.en_US ?? ''; diff --git a/webapp/src/app/components/widgets/event-widget/event-registry/add-msg-person.ts b/webapp/src/app/components/widgets/event-widget/event-registry/add-msg-person.ts index 7f1e5796..9011d8db 100644 --- a/webapp/src/app/components/widgets/event-widget/event-registry/add-msg-person.ts +++ b/webapp/src/app/components/widgets/event-widget/event-registry/add-msg-person.ts @@ -1,5 +1,6 @@ import { Person } from '../../../../models/events'; import { AbstractEvent, EventType } from './abstract-event'; +import { EntityAttributes } from '../../../../services/phaser/entities/cc-entity'; interface AddMsgPersonData extends EventType { person: Person; @@ -10,7 +11,7 @@ interface AddMsgPersonData extends EventType { } export class AddMsgPerson extends AbstractEvent { - private attributes = { + private attributes: EntityAttributes = { person: { type: 'PersonExpression', description: 'Person + Expression to add' diff --git a/webapp/src/app/components/widgets/event-widget/event-registry/clear-slow-motion.ts b/webapp/src/app/components/widgets/event-widget/event-registry/clear-slow-motion.ts index 357868c5..28b50b2f 100644 --- a/webapp/src/app/components/widgets/event-widget/event-registry/clear-slow-motion.ts +++ b/webapp/src/app/components/widgets/event-widget/event-registry/clear-slow-motion.ts @@ -1,7 +1,8 @@ import { AbstractEvent } from './abstract-event'; +import { EntityAttributes } from '../../../../services/phaser/entities/cc-entity'; export class ClearSlowMotion extends AbstractEvent { - private attributes = { + private attributes: EntityAttributes = { name: { type: 'String', description: 'Name of slow motion to be removed' diff --git a/webapp/src/app/components/widgets/event-widget/event-registry/do-action.ts b/webapp/src/app/components/widgets/event-widget/event-registry/do-action.ts index 358dd907..0a052850 100644 --- a/webapp/src/app/components/widgets/event-widget/event-registry/do-action.ts +++ b/webapp/src/app/components/widgets/event-widget/event-registry/do-action.ts @@ -1,7 +1,8 @@ import { AbstractEvent } from './abstract-event'; +import { EntityAttributes } from '../../../../services/phaser/entities/cc-entity'; export class DoAction extends AbstractEvent { - private attributes = { + private attributes: EntityAttributes = { entity: { type: 'Entity', description: 'Entity to move', diff --git a/webapp/src/app/components/widgets/event-widget/event-registry/goto-label.ts b/webapp/src/app/components/widgets/event-widget/event-registry/goto-label.ts index 89f0014b..cb227ead 100644 --- a/webapp/src/app/components/widgets/event-widget/event-registry/goto-label.ts +++ b/webapp/src/app/components/widgets/event-widget/event-registry/goto-label.ts @@ -1,4 +1,5 @@ import { AbstractEvent, EventType } from './abstract-event'; +import { EntityAttributes } from '../../../../services/phaser/entities/cc-entity'; export interface GotoLabelData extends EventType { @@ -6,7 +7,7 @@ export interface GotoLabelData extends EventType { } export class GotoLabel extends AbstractEvent { - private attributes = { + private attributes: EntityAttributes = { name : { type: 'String', description: 'Label to goto.' diff --git a/webapp/src/app/components/widgets/event-widget/event-registry/if.ts b/webapp/src/app/components/widgets/event-widget/event-registry/if.ts index db3287f7..cbc4b5fc 100644 --- a/webapp/src/app/components/widgets/event-widget/event-registry/if.ts +++ b/webapp/src/app/components/widgets/event-widget/event-registry/if.ts @@ -1,4 +1,5 @@ import { AbstractEvent, EventType } from './abstract-event'; +import { EntityAttributes } from '../../../../services/phaser/entities/cc-entity'; export interface IfData extends EventType { withElse: boolean; @@ -8,7 +9,7 @@ export interface IfData extends EventType { } export class If extends AbstractEvent { - private attributes = { + private attributes: EntityAttributes = { condition: { type: 'VarCondition', description: 'Condition for IF statement' diff --git a/webapp/src/app/components/widgets/event-widget/event-registry/label.ts b/webapp/src/app/components/widgets/event-widget/event-registry/label.ts index da830620..0864536a 100644 --- a/webapp/src/app/components/widgets/event-widget/event-registry/label.ts +++ b/webapp/src/app/components/widgets/event-widget/event-registry/label.ts @@ -1,4 +1,5 @@ import { AbstractEvent, EventType } from './abstract-event'; +import { EntityAttributes } from '../../../../services/phaser/entities/cc-entity'; export interface LabelData extends EventType { @@ -6,7 +7,7 @@ export interface LabelData extends EventType { } export class Label extends AbstractEvent { - private attributes = { + private attributes: EntityAttributes = { name : { type: 'String', description: 'Name to reference this label by.' diff --git a/webapp/src/app/components/widgets/event-widget/event-registry/set-camera-between.ts b/webapp/src/app/components/widgets/event-widget/event-registry/set-camera-between.ts index e0e57e27..0dac54a0 100644 --- a/webapp/src/app/components/widgets/event-widget/event-registry/set-camera-between.ts +++ b/webapp/src/app/components/widgets/event-widget/event-registry/set-camera-between.ts @@ -1,7 +1,8 @@ import { AbstractEvent } from './abstract-event'; +import { EntityAttributes } from '../../../../services/phaser/entities/cc-entity'; export class SetCameraBetween extends AbstractEvent { - private attributes = { + private attributes: EntityAttributes = { entity1: { type: 'Entity', description: 'First entity' diff --git a/webapp/src/app/components/widgets/event-widget/event-registry/set-camera-pos.ts b/webapp/src/app/components/widgets/event-widget/event-registry/set-camera-pos.ts index 0caf4874..b2f29180 100644 --- a/webapp/src/app/components/widgets/event-widget/event-registry/set-camera-pos.ts +++ b/webapp/src/app/components/widgets/event-widget/event-registry/set-camera-pos.ts @@ -1,7 +1,8 @@ import { AbstractEvent } from './abstract-event'; +import { EntityAttributes } from '../../../../services/phaser/entities/cc-entity'; export class SetCameraPos extends AbstractEvent { - private attributes = { + private attributes: EntityAttributes = { pos: { type: 'Vec2', description: 'Position to focus camera on', diff --git a/webapp/src/app/components/widgets/event-widget/event-registry/set-camera-target.ts b/webapp/src/app/components/widgets/event-widget/event-registry/set-camera-target.ts index d6b13c50..7163f155 100644 --- a/webapp/src/app/components/widgets/event-widget/event-registry/set-camera-target.ts +++ b/webapp/src/app/components/widgets/event-widget/event-registry/set-camera-target.ts @@ -1,7 +1,8 @@ import { AbstractEvent } from './abstract-event'; +import { EntityAttributes } from '../../../../services/phaser/entities/cc-entity'; export class SetCameraTarget extends AbstractEvent { - private attributes = { + private attributes: EntityAttributes = { entity: { type: 'Entity', description: 'Entity to focus camera on' diff --git a/webapp/src/app/components/widgets/event-widget/event-registry/set-camera-zoom.ts b/webapp/src/app/components/widgets/event-widget/event-registry/set-camera-zoom.ts index b389dde3..82787e85 100644 --- a/webapp/src/app/components/widgets/event-widget/event-registry/set-camera-zoom.ts +++ b/webapp/src/app/components/widgets/event-widget/event-registry/set-camera-zoom.ts @@ -1,7 +1,8 @@ import { AbstractEvent } from './abstract-event'; +import { EntityAttributes } from '../../../../services/phaser/entities/cc-entity'; export class SetCameraZoom extends AbstractEvent { - private attributes = { + private attributes: EntityAttributes = { zoom: { type: 'Number', description: 'Zoom Value. 1=default, 2=twice pixel size', diff --git a/webapp/src/app/components/widgets/event-widget/event-registry/set-msg-expression.ts b/webapp/src/app/components/widgets/event-widget/event-registry/set-msg-expression.ts index bbe2f30b..3d8f31e7 100644 --- a/webapp/src/app/components/widgets/event-widget/event-registry/set-msg-expression.ts +++ b/webapp/src/app/components/widgets/event-widget/event-registry/set-msg-expression.ts @@ -1,11 +1,12 @@ import { Person } from '../../../../models/events'; -import { AbstractEvent, EventType } from './abstract-event'; +import { EventType } from './abstract-event'; +import { DefaultEvent } from './default-event'; interface SetMsgExpressionData extends EventType { person: Person; } -export class SetMsgExpression extends AbstractEvent { +export class SetMsgExpression extends DefaultEvent { private attributes = { person: { type: 'PersonExpression', @@ -13,18 +14,14 @@ export class SetMsgExpression extends AbstractEvent { } }; - getAttributes() { - return this.attributes; - } - - update() { + override update() { this.info = this.combineStrings( this.getTypeString('#7ea3ff'), this.getPropString('person', this.data.person.person + '>​' + this.data.person.expression), ); } - generateNewDataInternal() { + override generateNewDataInternal() { return { person: {} }; diff --git a/webapp/src/app/components/widgets/event-widget/event-registry/set-overlay.ts b/webapp/src/app/components/widgets/event-widget/event-registry/set-overlay.ts index 635a5ad3..3af33bf5 100644 --- a/webapp/src/app/components/widgets/event-widget/event-registry/set-overlay.ts +++ b/webapp/src/app/components/widgets/event-widget/event-registry/set-overlay.ts @@ -1,7 +1,8 @@ import { AbstractEvent } from './abstract-event'; +import { EntityAttributes } from '../../../../services/phaser/entities/cc-entity'; export class SetOverlay extends AbstractEvent { - private attributes = { + private attributes: EntityAttributes = { color: { type: 'Color', description: 'Color of overlay' diff --git a/webapp/src/app/components/widgets/event-widget/event-registry/set-player-core.ts b/webapp/src/app/components/widgets/event-widget/event-registry/set-player-core.ts index d1c40712..34a174c5 100644 --- a/webapp/src/app/components/widgets/event-widget/event-registry/set-player-core.ts +++ b/webapp/src/app/components/widgets/event-widget/event-registry/set-player-core.ts @@ -1,7 +1,8 @@ import { AbstractEvent } from './abstract-event'; +import { EntityAttributes } from '../../../../services/phaser/entities/cc-entity'; export class SetPlayerCore extends AbstractEvent { - private attributes = { + private attributes: EntityAttributes = { core: { type: 'String', description: 'Type of Core.', diff --git a/webapp/src/app/components/widgets/event-widget/event-registry/show-choice.ts b/webapp/src/app/components/widgets/event-widget/event-registry/show-choice.ts index 32f3985b..9f51b059 100644 --- a/webapp/src/app/components/widgets/event-widget/event-registry/show-choice.ts +++ b/webapp/src/app/components/widgets/event-widget/event-registry/show-choice.ts @@ -1,6 +1,8 @@ +import { Helper } from '../../../../services/phaser/helper'; import { Label, Person } from '../../../../models/events'; import { EntityAttributes } from '../../../../services/phaser/entities/cc-entity'; import { AbstractEvent, EventType } from './abstract-event'; +import { DefaultEvent } from './default-event'; export interface ShowChoiceData extends EventType { [key: number]: AbstractEvent[]; @@ -14,7 +16,7 @@ export interface ShowChoiceData extends EventType { forceWidth: number; } -export class ShowChoice extends AbstractEvent { +export class ShowChoice extends DefaultEvent { private attributes: EntityAttributes = { person: { type: 'PersonExpression', @@ -38,11 +40,7 @@ export class ShowChoice extends AbstractEvent { } }; - getAttributes(): EntityAttributes { - return this.attributes; - } - - update() { + override update() { this.children = []; this.info = this.combineStrings( this.getTypeString('#7ea3ff'), @@ -74,10 +72,10 @@ export class ShowChoice extends AbstractEvent { out[index] = child.events.map(v => v.export()); }); - return JSON.parse(JSON.stringify(out)); + return Helper.copy(out); } - protected generateNewDataInternal() { + protected override generateNewDataInternal() { return { person: {}, options: [{ diff --git a/webapp/src/app/components/widgets/event-widget/event-registry/show-modal-choice.ts b/webapp/src/app/components/widgets/event-widget/event-registry/show-modal-choice.ts index 7efab826..fc1a2ed5 100644 --- a/webapp/src/app/components/widgets/event-widget/event-registry/show-modal-choice.ts +++ b/webapp/src/app/components/widgets/event-widget/event-registry/show-modal-choice.ts @@ -1,6 +1,8 @@ +import { Helper } from '../../../../services/phaser/helper'; import { Label } from '../../../../models/events'; import { EntityAttributes } from '../../../../services/phaser/entities/cc-entity'; import { AbstractEvent, EventType } from './abstract-event'; +import { DefaultEvent } from './default-event'; export interface ShowModalChoiceData extends EventType { [key: number]: AbstractEvent[]; @@ -11,7 +13,7 @@ export interface ShowModalChoiceData extends EventType { }[]; } -export class ShowModalChoice extends AbstractEvent { +export class ShowModalChoice extends DefaultEvent { private attributes: EntityAttributes = { text: { type: 'LangLabel', @@ -25,14 +27,10 @@ export class ShowModalChoice extends AbstractEvent { } }; - getAttributes(): EntityAttributes { - return this.attributes; - } - - update() { + override update() { this.children = []; this.info = this.combineStrings( - this.getTypeString('#7ea3ff'), + this.getTypeString('#7774e8'), this.getPropString('text', this.getProcessedText(this.data.text)) ); @@ -58,10 +56,10 @@ export class ShowModalChoice extends AbstractEvent { out[index] = child.events.map(v => v.export()); }); - return JSON.parse(JSON.stringify(out)); + return Helper.copy(out); } - protected generateNewDataInternal() { + protected override generateNewDataInternal() { return { text: {}, options: [{ diff --git a/webapp/src/app/components/widgets/event-widget/event-registry/show-msg.ts b/webapp/src/app/components/widgets/event-widget/event-registry/show-msg.ts index db0f10a2..9998f134 100644 --- a/webapp/src/app/components/widgets/event-widget/event-registry/show-msg.ts +++ b/webapp/src/app/components/widgets/event-widget/event-registry/show-msg.ts @@ -1,5 +1,6 @@ import { Label, Person } from '../../../../models/events'; import { AbstractEvent, EventType } from './abstract-event'; +import { EntityAttributes } from '../../../../services/phaser/entities/cc-entity'; interface ShowMsgData extends EventType { message: Label; @@ -8,7 +9,7 @@ interface ShowMsgData extends EventType { } export class ShowMsg extends AbstractEvent { - private attributes = { + private attributes: EntityAttributes = { person: { type: 'PersonExpression', description: 'Talking person' diff --git a/webapp/src/app/components/widgets/event-widget/event-registry/wait.ts b/webapp/src/app/components/widgets/event-widget/event-registry/wait.ts index 4e5e6ded..424fd083 100644 --- a/webapp/src/app/components/widgets/event-widget/event-registry/wait.ts +++ b/webapp/src/app/components/widgets/event-widget/event-registry/wait.ts @@ -1,7 +1,8 @@ import { AbstractEvent } from './abstract-event'; +import { EntityAttributes } from '../../../../services/phaser/entities/cc-entity'; export class Wait extends AbstractEvent { - private attributes = { + private attributes: EntityAttributes = { time: { type: 'Number', description: 'Time to wait' diff --git a/webapp/src/app/services/phaser/entities/cc-entity.ts b/webapp/src/app/services/phaser/entities/cc-entity.ts index 6917a1b4..dc21cf13 100644 --- a/webapp/src/app/services/phaser/entities/cc-entity.ts +++ b/webapp/src/app/services/phaser/entities/cc-entity.ts @@ -9,6 +9,107 @@ import { AbstractWidget } from '../../../components/widgets/abstract-widget'; import { Globals } from '../../globals'; import { BaseObject } from '../base-object'; +export type Base_WM_Type = 'Action' + | 'Actor' + | 'Analyzable' + | 'AnimSheetRef' + | 'Animation' + | 'Area' + | 'Array' + | 'AttackInfo' + | 'BallChangerType' + | 'Boolean' + | 'BooleanExpression' + | 'BounceAction' + | 'CallEvent' + | 'Character' + | 'ChoiceOptions' + | 'CollabLabelFilter' + | 'Color' + | 'CombatConditions' + | 'CondAnims' + | 'CreditsTriggerSelect' + | 'DoorVariations' + | 'DropSelect' + | 'DynamicPlatformDests' + | 'Effect' + | 'EffectSelect' + | 'ElevatorDests' + | 'EnemyActionRef' + | 'EnemySearch' + | 'EnemyState' + | 'EnemyType' + | 'EnemyTypeList' + | 'Entity' + | 'EntityAnim' + | 'EntityAnimArray' + | 'Event' + | 'EventLoadCondition' + | 'EventSheetCall' + | 'Face' + | 'FlexibleTable' + | 'GUI' + | 'GUIState' + | 'GuiState' + | 'Image' + | 'Integer' + | 'Item' + | 'ItemsDropRate' + | 'Landmarks' + | 'LangLabel' + | 'LoreEntrySelect' + | 'LoreSelect' + | 'LorryAltTypes' + | 'MagnetAltDirs' + | 'Maps' + | 'Marker' + | 'ModalChoiceOptions' + | 'NPC' + | 'NPCStates' + | 'Number' + | 'NumberExpression' + | 'NumberVary' + | 'Object' + | 'Offset' + | 'OlPlatformStates' + | 'PersonExpression' + | 'PoiFilter' + | 'PropInteract' + | 'PropType' + | 'ProxyRef' + | 'Quest' + | 'QuestHub' + | 'QuestLabelSelect' + | 'QuestNameSelect' + | 'QuestResetSelect' + | 'QuestRewards' + | 'QuestTaskList' + | 'RandomDistribution' + | 'Reaction' + | 'ScalablePropConfig' + | 'Select' + | 'Shield' + | 'Shop' + | 'SoundT' + | 'String' + | 'StringExpression' + | 'TaskIndex' + | 'TileSheet' + | 'Timer' + | 'TrackerRef' + | 'TraderSelect' + | 'TrophySelect' + | 'VarCondition' + | 'VarName' + | 'Vec2' + | 'Vec2Expression' + | 'Vec3' + | 'Vec3Expression' + | 'WalkAnimConfig' + | 'XenoDialog'; + +export type WM_Type = Base_WM_Type | 'Unknown' | 'CustomDesType' | ''; + export interface ScaleSettings { scalableX: boolean; scalableY: boolean; @@ -21,7 +122,7 @@ export interface EntityAttributes { } export interface AttributeValue { - type: string; + type: WM_Type; description: string; options?: { [key: string]: any }; withNull?: boolean; From 2b61d3db7f011e4c85ac7711a62e970ce69652a3 Mon Sep 17 00:00:00 2001 From: elluminance Date: Tue, 20 Feb 2024 10:42:37 -0500 Subject: [PATCH 8/9] made requested changes --- .../event-registry/abstract-event.ts | 43 +++++++++++-------- .../event-registry/set-msg-expression.ts | 7 --- .../event-registry/show-choice.ts | 23 ---------- .../event-registry/show-modal-choice.ts | 13 ------ webapp/src/app/models/events.ts | 17 ++++++++ .../app/services/phaser/entities/cc-entity.ts | 6 +-- 6 files changed, 44 insertions(+), 65 deletions(-) diff --git a/webapp/src/app/components/widgets/event-widget/event-registry/abstract-event.ts b/webapp/src/app/components/widgets/event-widget/event-registry/abstract-event.ts index 859232e0..db79ee93 100644 --- a/webapp/src/app/components/widgets/event-widget/event-registry/abstract-event.ts +++ b/webapp/src/app/components/widgets/event-widget/event-registry/abstract-event.ts @@ -1,7 +1,8 @@ import { SecurityContext } from '@angular/core'; import { DomSanitizer } from '@angular/platform-browser'; -import { EntityAttributes, Base_WM_Type } from '../../../../services/phaser/entities/cc-entity'; -import { Label } from '../../../../models/events'; +import { EntityAttributes, WMType } from '../../../../services/phaser/entities/cc-entity'; +import { Label, VarExpression, VarValue } from '../../../../models/events'; +import { Point, Point3 } from '../../../../models/cross-code-map'; export interface EventType { type: string; @@ -60,7 +61,7 @@ export abstract class AbstractEvent { const attr = this.getAttributes(); if (attr && attr[key]) { const type = attr[key].type; - switch (type as Base_WM_Type) { + switch (type as WMType) { case 'Color': value = this.getColorRectangle(value); break; @@ -68,14 +69,16 @@ export abstract class AbstractEvent { case 'Vec2Expression': value = this.getVarExpressionValue(value, true); if(typeof value !== 'string') { - value = this.getVec2String(value.x, value.y); + const vec2 = value as Point; + value = this.getVec2String(vec2.x, vec2.y); } break; case 'Vec3': case 'Vec3Expression': value = this.getVarExpressionValue(value, true); if(typeof value !== 'string') { - value = this.getVec3String(value.x, value.y, value.z, value.lvl); + const vec3 = value as Point3 & {lvl: number}; + value = this.getVec3String(vec3.x, vec3.y, vec3.z, vec3.lvl); } break; case 'Offset': @@ -125,15 +128,17 @@ export abstract class AbstractEvent { return `${key}: ${value}`; } - protected getVarExpressionValue(value: any, supportsActorAttrib = false): any { - if(value.indirect) { - value = `[indirect: ${value.indirect}]`; - } else if(value.varName) { - value = `[varName: ${value.varName}]`; - } else if(value.actorAttrib && supportsActorAttrib) { - value = `[actorAttrib: ${value.actorAttrib}]`; + protected getVarExpressionValue(value: VarExpression, supportsActorAttrib = false): VarValue { + if(typeof value == 'object') { + if('indirect' in value) { + value = `[indirect: ${value.indirect}]`; + } else if('varName' in value) { + value = `[varName: ${value.varName}]`; + } else if('actorAttrib' in value && supportsActorAttrib) { + value = `[actorAttrib: ${value.actorAttrib}]`; + } } - return value; + return value as VarValue; } protected getVec2String(x: number, y: number): string { @@ -167,12 +172,12 @@ export abstract class AbstractEvent { protected getProcessedText(langLabel: Label): string { const textColors = [ - null, - '#ff6969', - '#65ff89', - '#ffe430', - '#808080', - '#ff8932', + null, // \c[0] White + '#ff6969', // \c[1] Red + '#65ff89', // \c[2] Green + '#ffe430', // \c[3] Yellow + '#808080', // \c[4] Gray + //'#ff8932', \c[5] Orange, only used for small font in vanilla ]; let text = langLabel?.en_US ?? ''; diff --git a/webapp/src/app/components/widgets/event-widget/event-registry/set-msg-expression.ts b/webapp/src/app/components/widgets/event-widget/event-registry/set-msg-expression.ts index 3d8f31e7..5396d269 100644 --- a/webapp/src/app/components/widgets/event-widget/event-registry/set-msg-expression.ts +++ b/webapp/src/app/components/widgets/event-widget/event-registry/set-msg-expression.ts @@ -7,13 +7,6 @@ interface SetMsgExpressionData extends EventType { } export class SetMsgExpression extends DefaultEvent { - private attributes = { - person: { - type: 'PersonExpression', - description: 'Person + Expression to change' - } - }; - override update() { this.info = this.combineStrings( this.getTypeString('#7ea3ff'), diff --git a/webapp/src/app/components/widgets/event-widget/event-registry/show-choice.ts b/webapp/src/app/components/widgets/event-widget/event-registry/show-choice.ts index 9f51b059..e0962929 100644 --- a/webapp/src/app/components/widgets/event-widget/event-registry/show-choice.ts +++ b/webapp/src/app/components/widgets/event-widget/event-registry/show-choice.ts @@ -17,29 +17,6 @@ export interface ShowChoiceData extends EventType { } export class ShowChoice extends DefaultEvent { - private attributes: EntityAttributes = { - person: { - type: 'PersonExpression', - description: 'Talking person' - }, - options: { - type: 'ChoiceOptions', - description: 'List of options', - C2: true - }, - columns: { - type: 'Integer', - description: 'Number of buttons columns.', - I: true, - min: 2 - }, - forceWidth: { - type: 'Integer', - description: 'Override the default button width. NOTE: Buttons still get matched when a text is to large.', - I: true - } - }; - override update() { this.children = []; this.info = this.combineStrings( diff --git a/webapp/src/app/components/widgets/event-widget/event-registry/show-modal-choice.ts b/webapp/src/app/components/widgets/event-widget/event-registry/show-modal-choice.ts index fc1a2ed5..2149a0d8 100644 --- a/webapp/src/app/components/widgets/event-widget/event-registry/show-modal-choice.ts +++ b/webapp/src/app/components/widgets/event-widget/event-registry/show-modal-choice.ts @@ -14,19 +14,6 @@ export interface ShowModalChoiceData extends EventType { } export class ShowModalChoice extends DefaultEvent { - private attributes: EntityAttributes = { - text: { - type: 'LangLabel', - description: 'Text of modal dialog', - hs: true - }, - options: { - type: 'ModalChoiceOptions', - description: 'All the options of the modal dialog', - C2: true - } - }; - override update() { this.children = []; this.info = this.combineStrings( diff --git a/webapp/src/app/models/events.ts b/webapp/src/app/models/events.ts index c037a5d1..e40c38cf 100644 --- a/webapp/src/app/models/events.ts +++ b/webapp/src/app/models/events.ts @@ -36,6 +36,23 @@ export type EventArray = {trade: TraderEvent} ; +export type VarValue = + string | + number | + boolean | + {x: number, y: number} | //vec2 + {x: number, y: number, z: number} | //vec3 + Label +; + +export type VarExpression = + VarValue | + {indirect: string} | + {varName: string} | + {actorAttrib: string} +; + + export function destructureEventArray(events: EventArray): {events: EventType[], type: EventArrayType, trader?: string} { if (Array.isArray(events)) { return {events: events, type: EventArrayType.Simple}; diff --git a/webapp/src/app/services/phaser/entities/cc-entity.ts b/webapp/src/app/services/phaser/entities/cc-entity.ts index b6cb8763..33aac427 100644 --- a/webapp/src/app/services/phaser/entities/cc-entity.ts +++ b/webapp/src/app/services/phaser/entities/cc-entity.ts @@ -9,7 +9,7 @@ import { AbstractWidget } from '../../../components/widgets/abstract-widget'; import { Globals } from '../../globals'; import { BaseObject } from '../base-object'; -export type Base_WM_Type = 'Action' +export type WMType = 'Action' | 'Actor' | 'Analyzable' | 'AnimSheetRef' @@ -108,7 +108,7 @@ export type Base_WM_Type = 'Action' | 'WalkAnimConfig' | 'XenoDialog'; -export type WM_Type = Base_WM_Type | 'Unknown' | 'CustomDesType' | ''; +//export type WMType = BaseWMType; export interface ScaleSettings { scalableX: boolean; @@ -122,7 +122,7 @@ export interface EntityAttributes { } export interface AttributeValue { - type: WM_Type; + type: string; description: string; options?: { [key: string]: any }; withNull?: boolean; From f6836886419adfeed70e3f0c5e79559d9a7e98ee Mon Sep 17 00:00:00 2001 From: elluminance Date: Thu, 22 Feb 2024 11:57:45 -0500 Subject: [PATCH 9/9] fixed issues, added types to getPropString's branches --- .../event-registry/abstract-event.ts | 241 +++++++++++++++--- .../event-registry/show-modal-choice.ts | 49 ++-- webapp/src/app/models/events.ts | 15 -- .../app/services/phaser/entities/cc-entity.ts | 100 -------- 4 files changed, 227 insertions(+), 178 deletions(-) diff --git a/webapp/src/app/components/widgets/event-widget/event-registry/abstract-event.ts b/webapp/src/app/components/widgets/event-widget/event-registry/abstract-event.ts index db79ee93..758dbfa6 100644 --- a/webapp/src/app/components/widgets/event-widget/event-registry/abstract-event.ts +++ b/webapp/src/app/components/widgets/event-widget/event-registry/abstract-event.ts @@ -1,8 +1,157 @@ import { SecurityContext } from '@angular/core'; import { DomSanitizer } from '@angular/platform-browser'; -import { EntityAttributes, WMType } from '../../../../services/phaser/entities/cc-entity'; -import { Label, VarExpression, VarValue } from '../../../../models/events'; -import { Point, Point3 } from '../../../../models/cross-code-map'; +import { EntityAttributes } from '../../../../services/phaser/entities/cc-entity'; +import { Label } from '../../../../models/events'; +import { Point, Point3, PartialPoint3 } from '../../../../models/cross-code-map'; + +export type WMTypeNames = 'Action' + | 'Actor' + | 'Analyzable' + | 'AnimSheetRef' + | 'Animation' + | 'Area' + | 'Array' + | 'AttackInfo' + | 'BallChangerType' + | 'Boolean' + | 'BooleanExpression' + | 'BounceAction' + | 'CallEvent' + | 'Character' + | 'ChoiceOptions' + | 'CollabLabelFilter' + | 'Color' + | 'CombatConditions' + | 'CondAnims' + | 'CreditsTriggerSelect' + | 'DoorVariations' + | 'DropSelect' + | 'DynamicPlatformDests' + | 'Effect' + | 'EffectSelect' + | 'ElevatorDests' + | 'EnemyActionRef' + | 'EnemySearch' + | 'EnemyState' + | 'EnemyType' + | 'EnemyTypeList' + | 'Entity' + | 'EntityAnim' + | 'EntityAnimArray' + | 'Event' + | 'EventLoadCondition' + | 'EventSheetCall' + | 'Face' + | 'FlexibleTable' + | 'GUI' + | 'GUIState' + | 'GuiState' + | 'Image' + | 'Integer' + | 'Item' + | 'ItemsDropRate' + | 'Landmarks' + | 'LangLabel' + | 'LoreEntrySelect' + | 'LoreSelect' + | 'LorryAltTypes' + | 'MagnetAltDirs' + | 'Maps' + | 'Marker' + | 'ModalChoiceOptions' + | 'NPC' + | 'NPCStates' + | 'Number' + | 'NumberExpression' + | 'NumberVary' + | 'Object' + | 'Offset' + | 'OlPlatformStates' + | 'PersonExpression' + | 'PoiFilter' + | 'PropInteract' + | 'PropType' + | 'ProxyRef' + | 'Quest' + | 'QuestHub' + | 'QuestLabelSelect' + | 'QuestNameSelect' + | 'QuestResetSelect' + | 'QuestRewards' + | 'QuestTaskList' + | 'RandomDistribution' + | 'Reaction' + | 'ScalablePropConfig' + | 'Select' + | 'Shield' + | 'Shop' + | 'SoundT' + | 'String' + | 'StringExpression' + | 'TaskIndex' + | 'TileSheet' + | 'Timer' + | 'TrackerRef' + | 'TraderSelect' + | 'TrophySelect' + | 'VarCondition' + | 'VarName' + | 'Vec2' + | 'Vec2Expression' + | 'Vec3' + | 'Vec3Expression' + | 'WalkAnimConfig' + | 'XenoDialog'; + + +export namespace WMTypes { + export type VarExpression = + T | + {indirect: string} | + {varName: string} | + {actorAttrib: string} + ; + + export type Color = string; + + export type Vec2 = Point; + export type Vec2Expression = VarExpression; + export type Vec3 = PartialPoint3 & {lvl?: number}; + export type Vec3Expression = VarExpression; + + export type NumberExpression = VarExpression; + export type StringExpression = VarExpression; + export type BooleanExpression = VarExpression; + + export type Offset = Point3; + + export type VarName = string | { + actorAttrib?: string; + indirect?: string; + }; + + export interface Entity { + player?: boolean; + self?: boolean; + name?: string; + varName?: string; + party?: string; + } + + export interface EnemyType { + type: string; + } + + export interface Effect { + sheet: string; + name: string; + } + + export interface Animation { + sheet: string; + name: string; + } +} export interface EventType { type: string; @@ -61,65 +210,81 @@ export abstract class AbstractEvent { const attr = this.getAttributes(); if (attr && attr[key]) { const type = attr[key].type; - switch (type as WMType) { + switch (type as WMTypeNames) { case 'Color': - value = this.getColorRectangle(value); + value = this.getColorRectangle(value as WMTypes.Color); break; case 'Vec2': - case 'Vec2Expression': - value = this.getVarExpressionValue(value, true); + case 'Vec2Expression': { + value = this.getVarExpressionValue(value as WMTypes.Vec2Expression, true); if(typeof value !== 'string') { - const vec2 = value as Point; + const vec2 = value as WMTypes.Vec2; value = this.getVec2String(vec2.x, vec2.y); } break; + } case 'Vec3': case 'Vec3Expression': - value = this.getVarExpressionValue(value, true); + value = this.getVarExpressionValue(value as WMTypes.Vec3Expression, true); if(typeof value !== 'string') { - const vec3 = value as Point3 & {lvl: number}; + const vec3 = value as WMTypes.Vec3; value = this.getVec3String(vec3.x, vec3.y, vec3.z, vec3.lvl); } break; case 'Offset': if(value) { - value = this.getVec3String(value.x, value.y, value.z); + const offset = value as WMTypes.Offset; + value = this.getVec3String(offset.x, offset.y, offset.z); } break; - case 'Entity': - if(value.player){ + case 'Entity': { + const entity = value as WMTypes.Entity; + if(entity.player){ value = 'player'; - } else if(value.self) { + } else if(entity.self) { value = 'self'; - } else if(value.name) { - value = '[' + value.name + ']'; - } else if (value.varName) { - value = `[Var: ${value.varName}]`; - } else if (value.party) { - value = `[Party: ${value.party}]`; + } else if(entity.name) { + value = '[' + entity.name + ']'; + } else if (entity.varName) { + value = `[Var: ${entity.varName}]`; + } else if (entity.party) { + value = `[Party: ${entity.party}]`; } break; - case 'EnemyType': - value = '[' + value.type + ']'; + } + case 'EnemyType': { + const enemyType = value as WMTypes.EnemyType; + value = '[' + enemyType.type + ']'; break; + } case 'NumberExpression': case 'StringExpression': - case 'BooleanExpression': - value = this.getVarExpressionValue(value); + case 'BooleanExpression': { + const expression = value as WMTypes.NumberExpression + | WMTypes.StringExpression + | WMTypes.BooleanExpression; + value = this.getVarExpressionValue(expression); break; - case 'VarName': - if(value.indirect) { - value = `[indirect: ${value.indirect}]`; - } else if (value.actorAttrib) { - value = `[actorAttrib: ${value.indirect}]`; + } + case 'VarName': { + const varName = value as WMTypes.VarName; + if(typeof varName === 'object') { + if(varName.indirect) { + value = `[indirect: ${value.indirect}]`; + } else if (varName.actorAttrib) { + value = `[actorAttrib: ${value.indirect}]`; + } } break; + } case 'Effect': - case 'Animation': - if(value) { - value = `${value.sheet}/${value.name}`; + case 'Animation':{ + const obj = value as WMTypes.Effect | WMTypes.Animation; + if(obj) { + value = `${obj.sheet}/${obj.name}`; } break; + } } } @@ -128,17 +293,17 @@ export abstract class AbstractEvent { return `${key}: ${value}`; } - protected getVarExpressionValue(value: VarExpression, supportsActorAttrib = false): VarValue { - if(typeof value == 'object') { + protected getVarExpressionValue(value: WMTypes.VarExpression, supportsActorAttrib = false): T | string { + if(value && typeof value == 'object') { if('indirect' in value) { - value = `[indirect: ${value.indirect}]`; + return `[indirect: ${value.indirect}]`; } else if('varName' in value) { - value = `[varName: ${value.varName}]`; + return `[varName: ${value.varName}]`; } else if('actorAttrib' in value && supportsActorAttrib) { - value = `[actorAttrib: ${value.actorAttrib}]`; + return `[actorAttrib: ${value.actorAttrib}]`; } } - return value as VarValue; + return value as T; } protected getVec2String(x: number, y: number): string { diff --git a/webapp/src/app/components/widgets/event-widget/event-registry/show-modal-choice.ts b/webapp/src/app/components/widgets/event-widget/event-registry/show-modal-choice.ts index 2149a0d8..edff393c 100644 --- a/webapp/src/app/components/widgets/event-widget/event-registry/show-modal-choice.ts +++ b/webapp/src/app/components/widgets/event-widget/event-registry/show-modal-choice.ts @@ -1,6 +1,5 @@ import { Helper } from '../../../../services/phaser/helper'; import { Label } from '../../../../models/events'; -import { EntityAttributes } from '../../../../services/phaser/entities/cc-entity'; import { AbstractEvent, EventType } from './abstract-event'; import { DefaultEvent } from './default-event'; @@ -16,18 +15,18 @@ export interface ShowModalChoiceData extends EventType { export class ShowModalChoice extends DefaultEvent { override update() { this.children = []; - this.info = this.combineStrings( - this.getTypeString('#7774e8'), - this.getPropString('text', this.getProcessedText(this.data.text)) - ); - - this.data.options.forEach((option, index) => { - this.children[index] = { - title: this.getColoredString('Choice: ', '#838383') + this.getProcessedText(option.label), - events: this.data[index] || [], - draggable: false - }; - }); + this.info = this.combineStrings( + this.getTypeString('#7774e8'), + this.getPropString('text', this.getProcessedText(this.data.text)) + ); + + this.data.options.forEach((option, index) => { + this.children[index] = { + title: this.getColoredString('Choice: ', '#838383') + this.getProcessedText(option.label), + events: this.data[index] || [], + draggable: false + }; + }); } override export(): ShowModalChoiceData { @@ -36,28 +35,28 @@ export class ShowModalChoice extends DefaultEvent { text: this.data.text, options: this.data.options, }; - this.children.forEach((child, index) => { - if (!child.events) { - console.error('wtf', this); - } - out[index] = child.events.map(v => v.export()); - }); - - return Helper.copy(out); + this.children.forEach((child, index) => { + if (!child.events) { + console.error('wtf', this); + } + out[index] = child.events.map(v => v.export()); + }); + + return Helper.copy(out); } protected override generateNewDataInternal() { return { text: {}, options: [{ - label: { + label: { en_US: 'Choice 1' } - }, { - label: { + }, { + label: { en_US: 'Choice 2' } - }] + }] }; } } diff --git a/webapp/src/app/models/events.ts b/webapp/src/app/models/events.ts index e40c38cf..88e89435 100644 --- a/webapp/src/app/models/events.ts +++ b/webapp/src/app/models/events.ts @@ -36,21 +36,6 @@ export type EventArray = {trade: TraderEvent} ; -export type VarValue = - string | - number | - boolean | - {x: number, y: number} | //vec2 - {x: number, y: number, z: number} | //vec3 - Label -; - -export type VarExpression = - VarValue | - {indirect: string} | - {varName: string} | - {actorAttrib: string} -; export function destructureEventArray(events: EventArray): {events: EventType[], type: EventArrayType, trader?: string} { diff --git a/webapp/src/app/services/phaser/entities/cc-entity.ts b/webapp/src/app/services/phaser/entities/cc-entity.ts index 33aac427..6b268ff2 100644 --- a/webapp/src/app/services/phaser/entities/cc-entity.ts +++ b/webapp/src/app/services/phaser/entities/cc-entity.ts @@ -9,106 +9,6 @@ import { AbstractWidget } from '../../../components/widgets/abstract-widget'; import { Globals } from '../../globals'; import { BaseObject } from '../base-object'; -export type WMType = 'Action' - | 'Actor' - | 'Analyzable' - | 'AnimSheetRef' - | 'Animation' - | 'Area' - | 'Array' - | 'AttackInfo' - | 'BallChangerType' - | 'Boolean' - | 'BooleanExpression' - | 'BounceAction' - | 'CallEvent' - | 'Character' - | 'ChoiceOptions' - | 'CollabLabelFilter' - | 'Color' - | 'CombatConditions' - | 'CondAnims' - | 'CreditsTriggerSelect' - | 'DoorVariations' - | 'DropSelect' - | 'DynamicPlatformDests' - | 'Effect' - | 'EffectSelect' - | 'ElevatorDests' - | 'EnemyActionRef' - | 'EnemySearch' - | 'EnemyState' - | 'EnemyType' - | 'EnemyTypeList' - | 'Entity' - | 'EntityAnim' - | 'EntityAnimArray' - | 'Event' - | 'EventLoadCondition' - | 'EventSheetCall' - | 'Face' - | 'FlexibleTable' - | 'GUI' - | 'GUIState' - | 'GuiState' - | 'Image' - | 'Integer' - | 'Item' - | 'ItemsDropRate' - | 'Landmarks' - | 'LangLabel' - | 'LoreEntrySelect' - | 'LoreSelect' - | 'LorryAltTypes' - | 'MagnetAltDirs' - | 'Maps' - | 'Marker' - | 'ModalChoiceOptions' - | 'NPC' - | 'NPCStates' - | 'Number' - | 'NumberExpression' - | 'NumberVary' - | 'Object' - | 'Offset' - | 'OlPlatformStates' - | 'PersonExpression' - | 'PoiFilter' - | 'PropInteract' - | 'PropType' - | 'ProxyRef' - | 'Quest' - | 'QuestHub' - | 'QuestLabelSelect' - | 'QuestNameSelect' - | 'QuestResetSelect' - | 'QuestRewards' - | 'QuestTaskList' - | 'RandomDistribution' - | 'Reaction' - | 'ScalablePropConfig' - | 'Select' - | 'Shield' - | 'Shop' - | 'SoundT' - | 'String' - | 'StringExpression' - | 'TaskIndex' - | 'TileSheet' - | 'Timer' - | 'TrackerRef' - | 'TraderSelect' - | 'TrophySelect' - | 'VarCondition' - | 'VarName' - | 'Vec2' - | 'Vec2Expression' - | 'Vec3' - | 'Vec3Expression' - | 'WalkAnimConfig' - | 'XenoDialog'; - -//export type WMType = BaseWMType; export interface ScaleSettings { scalableX: boolean;