flow: context
This commit is contained in:
parent
83498542e5
commit
0a73d9ceb8
|
@ -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) {
|
||||
|
|
|
@ -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'],
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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: {
|
||||
|
|
|
@ -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';
|
||||
|
|
|
@ -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());
|
||||
|
|
29
packages/topdown/index.hooks.js
Normal file
29
packages/topdown/index.hooks.js
Normal 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',
|
||||
}],
|
||||
],
|
||||
},
|
||||
};
|
||||
},
|
||||
};
|
||||
}
|
|
@ -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.',
|
||||
|
|
Loading…
Reference in New Issue
Block a user