refactor: Entity children
This commit is contained in:
parent
4ef7aaf36a
commit
34a54cdc59
|
@ -66,7 +66,7 @@ export default (latus) => class Behaved extends decorate(Trait) {
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
static describe(entity) {
|
static children(entity) {
|
||||||
return {
|
return {
|
||||||
isBehaving: {
|
isBehaving: {
|
||||||
type: 'bool',
|
type: 'bool',
|
||||||
|
|
45
packages/entity/src/base-entity.js
Normal file
45
packages/entity/src/base-entity.js
Normal file
|
@ -0,0 +1,45 @@
|
||||||
|
import {JsonResource} from '@avocado/resource';
|
||||||
|
|
||||||
|
export default class BaseEntity extends JsonResource {
|
||||||
|
|
||||||
|
static children() {
|
||||||
|
return (entity) => (
|
||||||
|
Object.fromEntries(
|
||||||
|
Object.entries(
|
||||||
|
Object.values(entity.traits)
|
||||||
|
.reduce(
|
||||||
|
(r, {constructor}) => ({
|
||||||
|
...r,
|
||||||
|
...constructor.children(entity),
|
||||||
|
}),
|
||||||
|
{
|
||||||
|
addTrait: {
|
||||||
|
label: 'Add trait',
|
||||||
|
type: 'void',
|
||||||
|
args: [],
|
||||||
|
},
|
||||||
|
destroy: {
|
||||||
|
label: 'Destroy',
|
||||||
|
type: 'void',
|
||||||
|
args: [],
|
||||||
|
},
|
||||||
|
is: {
|
||||||
|
type: 'bool',
|
||||||
|
args: [
|
||||||
|
{
|
||||||
|
type: 'string',
|
||||||
|
label: 'type',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
list: {
|
||||||
|
type: 'entity-list',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -7,10 +7,10 @@ import {
|
||||||
TickingPromise,
|
TickingPromise,
|
||||||
} from '@avocado/core';
|
} from '@avocado/core';
|
||||||
import {Synchronized} from '@avocado/s13n';
|
import {Synchronized} from '@avocado/s13n';
|
||||||
import {JsonResource} from '@avocado/resource';
|
|
||||||
import {compose, EventEmitter} from '@latus/core';
|
import {compose, EventEmitter} from '@latus/core';
|
||||||
|
|
||||||
import {defineTraitAccessors, enumerateTraitAccessorKeys} from '../accessors';
|
import {defineTraitAccessors, enumerateTraitAccessorKeys} from '../accessors';
|
||||||
|
import BaseEntity from '../base-entity';
|
||||||
|
|
||||||
const debug = D('@avocado/entity');
|
const debug = D('@avocado/entity');
|
||||||
|
|
||||||
|
@ -21,7 +21,7 @@ const decorate = compose(
|
||||||
|
|
||||||
let numericUid = 'client' !== process.env.SIDE ? 1 : 1000000000;
|
let numericUid = 'client' !== process.env.SIDE ? 1 : 1000000000;
|
||||||
|
|
||||||
export default (latus) => class Entity extends decorate(JsonResource) {
|
export default (latus) => class Entity extends decorate(BaseEntity) {
|
||||||
|
|
||||||
#hooks = {};
|
#hooks = {};
|
||||||
|
|
||||||
|
@ -105,6 +105,7 @@ export default (latus) => class Entity extends decorate(JsonResource) {
|
||||||
console.error(
|
console.error(
|
||||||
`Tried to add trait "${type}" but lack one or more dependents: "${lacking.join('", "')}"!`,
|
`Tried to add trait "${type}" but lack one or more dependents: "${lacking.join('", "')}"!`,
|
||||||
);
|
);
|
||||||
|
return undefined;
|
||||||
}
|
}
|
||||||
// Instantiate.
|
// Instantiate.
|
||||||
const trait = await Trait.load({
|
const trait = await Trait.load({
|
||||||
|
|
|
@ -93,7 +93,7 @@ export default (latus) => class Alive extends decorate(Trait) {
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
static describe() {
|
static children() {
|
||||||
return {
|
return {
|
||||||
die: {
|
die: {
|
||||||
type: 'void',
|
type: 'void',
|
||||||
|
|
|
@ -31,7 +31,7 @@ export default () => class Directional extends decorate(Trait) {
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
static describe() {
|
static children() {
|
||||||
return {
|
return {
|
||||||
changeToRandomDirection: {
|
changeToRandomDirection: {
|
||||||
type: 'void',
|
type: 'void',
|
||||||
|
|
|
@ -31,7 +31,7 @@ export default () => class Mobile extends decorate(Trait) {
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
static describe() {
|
static children() {
|
||||||
return {
|
return {
|
||||||
moveFor: {
|
moveFor: {
|
||||||
type: 'void',
|
type: 'void',
|
||||||
|
|
|
@ -36,7 +36,7 @@ export default () => class Positioned extends decorate(Trait) {
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
static describe() {
|
static children() {
|
||||||
return {
|
return {
|
||||||
position: {
|
position: {
|
||||||
type: 'vector',
|
type: 'vector',
|
||||||
|
|
|
@ -1,44 +1,10 @@
|
||||||
|
import BaseEntity from './base-entity';
|
||||||
|
|
||||||
export default () => ({
|
export default () => ({
|
||||||
entity: {
|
entity: {
|
||||||
children: (entity) => (
|
children: BaseEntity.children,
|
||||||
Object.fromEntries(
|
|
||||||
Object.entries(
|
|
||||||
Object.values(entity.traits)
|
|
||||||
.reduce(
|
|
||||||
(r, trait) => ({
|
|
||||||
...r,
|
|
||||||
...trait.constructor.describe(entity),
|
|
||||||
}),
|
|
||||||
{
|
|
||||||
addTrait: {
|
|
||||||
label: 'Add trait',
|
|
||||||
type: 'void',
|
|
||||||
args: [],
|
|
||||||
},
|
|
||||||
destroy: {
|
|
||||||
label: 'Destroy',
|
|
||||||
type: 'void',
|
|
||||||
args: [],
|
|
||||||
},
|
|
||||||
is: {
|
|
||||||
type: 'bool',
|
|
||||||
args: [
|
|
||||||
{
|
|
||||||
type: 'string',
|
|
||||||
label: 'type',
|
|
||||||
},
|
|
||||||
],
|
|
||||||
},
|
|
||||||
list: {
|
|
||||||
type: 'entity-list',
|
|
||||||
},
|
|
||||||
},
|
|
||||||
),
|
|
||||||
),
|
|
||||||
)
|
|
||||||
),
|
|
||||||
create: () => null,
|
create: () => null,
|
||||||
infer: (v) => !!v?.traits,
|
infer: (v) => BaseEntity.children === v?.constructor?.children,
|
||||||
},
|
},
|
||||||
'entity-list': {
|
'entity-list': {
|
||||||
children: () => ({
|
children: () => ({
|
||||||
|
|
|
@ -68,7 +68,7 @@ export default (latus) => class Collider extends decorate(Trait) {
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
static describe() {
|
static children() {
|
||||||
return {
|
return {
|
||||||
collidesWith: {
|
collidesWith: {
|
||||||
advanced: true,
|
advanced: true,
|
||||||
|
|
|
@ -56,7 +56,7 @@ export default (latus) => class Emitter extends decorate(Trait) {
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
static describe(entity) {
|
static children(entity) {
|
||||||
return {
|
return {
|
||||||
emitParticleEntity: {
|
emitParticleEntity: {
|
||||||
type: 'entity',
|
type: 'entity',
|
||||||
|
|
|
@ -41,7 +41,7 @@ export default (latus) => class Audible extends Trait {
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
static describe(entity) {
|
static children(entity) {
|
||||||
return {
|
return {
|
||||||
hasSound: {
|
hasSound: {
|
||||||
args: [
|
args: [
|
||||||
|
|
|
@ -58,7 +58,7 @@ export default (latus) => class Animated extends decorate(Trait) {
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
static describe() {
|
static children() {
|
||||||
return {
|
return {
|
||||||
isAnimating: {
|
isAnimating: {
|
||||||
type: 'bool',
|
type: 'bool',
|
||||||
|
|
|
@ -31,6 +31,10 @@ export default class Trait extends decorate(JsonResource) {
|
||||||
// eslint-disable-next-line class-methods-use-this, no-unused-vars
|
// eslint-disable-next-line class-methods-use-this, no-unused-vars
|
||||||
acceptPacket(packet) {}
|
acceptPacket(packet) {}
|
||||||
|
|
||||||
|
static children() {
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
|
||||||
cleanPackets() {
|
cleanPackets() {
|
||||||
if (!this.#markedAsDirty) {
|
if (!this.#markedAsDirty) {
|
||||||
return;
|
return;
|
||||||
|
@ -65,10 +69,6 @@ export default class Trait extends decorate(JsonResource) {
|
||||||
return [];
|
return [];
|
||||||
}
|
}
|
||||||
|
|
||||||
static describe() {
|
|
||||||
return {};
|
|
||||||
}
|
|
||||||
|
|
||||||
// eslint-disable-next-line class-methods-use-this
|
// eslint-disable-next-line class-methods-use-this
|
||||||
destroy() {}
|
destroy() {}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user