flow: context

This commit is contained in:
cha0s 2020-06-20 01:40:53 -05:00
parent 83498542e5
commit 0a73d9ceb8
8 changed files with 87 additions and 16 deletions

View File

@ -68,7 +68,11 @@ export class Context {
}
get(key) {
return [this.variableMap.get(key), this.typeMap.get(key)];
const type = this.typeMap.has(key) ? this.typeMap.get(key) : 'undefined';
return [
this.variableMap.get(key),
type,
];
}
static renderSteps(steps) {

View File

@ -32,6 +32,33 @@ class Utility {
}
export function behaviorContextTypes() {
return {
Utility: {
makeArray: {
type: 'array',
label: 'Make array.',
args: [],
},
makeObject: {
type: 'object',
label: 'Make object.',
args: [],
},
log: {
type: 'void',
label: 'Log.',
args: [],
},
merge: {
type: 'object',
label: 'Merge objects.',
args: [],
},
},
};
}
export function behaviorContextGlobals() {
return {
Utility: [Utility, 'Utility'],

View File

@ -15,6 +15,7 @@ export default class Behaved extends decorate(Trait) {
static defaultParams() {
return {
contextTypeHints: {},
routines: {},
};
}
@ -28,6 +29,10 @@ export default class Behaved extends decorate(Trait) {
static describeParams() {
return {
contextTypeHints: {
type: 'object',
label: 'Context type hints',
},
routines: {
type: 'routines',
label: 'Routines',
@ -57,6 +62,8 @@ export default class Behaved extends decorate(Trait) {
this._context = new Context({
entity: [this.entity, 'entity'],
});
Object.entries(this.params.contextTypeHints)
.forEach(([key, type]) => this._context.add(key, undefined, type));
this._currentRoutine = undefined;
this._routines = (new Routines()).fromJSON(this.params.routines);
this.updateCurrentRoutine(this.state.currentRoutine);

View File

@ -1,17 +1,16 @@
export function behaviorContextTypes() {
return {
entity: (entity) => {
const traitTypes = !entity
? {}
: Object.values(entity.allTraitInstances())
.reduce(
(r, {constructor: {behaviorContextTypes, describeParams, describeState}}) => ({
...r,
...behaviorContextTypes(),
...describeParams(),
...describeState(),
}), {},
);
const {allTraits} = require('./trait/registrar');
const Traits = entity
? Object.values(entity.allTraitInstances()).map((instance) => instance.constructor)
: allTraits();
const traitTypes = Traits
.reduce((r, {behaviorContextTypes, describeState}) => ({
...r,
...behaviorContextTypes(),
...describeState(),
}), {});
return {
...traitTypes,
invokeHook: {

View File

@ -5,13 +5,10 @@ export {default as EntityListUpdateEntityPacket} from './packets/entity-list-upd
export {EntityList, EntityListView} from './list';
export {
allTraits,
hasTrait,
idFrom as idFromTrait,
lookupTrait,
} from './trait/registrar';
export {
all as allTraits,
} from './trait/traits.scwp';
export {StateProperty, Trait} from './trait';

View File

@ -5,6 +5,10 @@ let hasMapped = false;
const traitTo = new Map();
const typeTo = new Map();
export function allTraits() {
return Object.entries(all()).map(([, M]) => M.default);
}
function ensureTypeMap() {
if (!hasMapped) {
const entries = Object.entries(all());

View File

@ -0,0 +1,29 @@
export function behaviorContextTypes() {
return {
layer: (layer) => {
return {
tileAt: {
type: 'number',
label: 'Get tile at $1.',
args: [
['position', {
type: 'vector',
}],
],
},
setTileAt: {
type: 'void',
label: 'Set tile at $1 to $2.',
args: [
['position', {
type: 'vector',
}],
['tileIndex', {
type: 'number',
}],
],
},
};
},
};
}

View File

@ -5,6 +5,10 @@ export default class Layered extends Trait {
static behaviorContextTypes() {
return {
layer: {
type: 'layer',
label: 'Layer',
},
removeFromLayer: {
type: 'void',
label: 'Remove from layer.',