refactor: hooks
This commit is contained in:
parent
c2eee71182
commit
f779c74e13
|
@ -1,15 +1,11 @@
|
|||
import {Hooks} from '@flecks/core';
|
||||
|
||||
import Receiver from './receiver';
|
||||
|
||||
export default {
|
||||
[Hooks]: {
|
||||
'@flecks/web/client.up': (flecks) => {
|
||||
window.flecks = flecks;
|
||||
const Synchronizer = Receiver(flecks);
|
||||
const synchronizer = new Synchronizer();
|
||||
flecks.set('$humus/app.synchronizer', synchronizer);
|
||||
synchronizer.listenTo(flecks.get('$flecks/socket.socket'));
|
||||
},
|
||||
export const hooks = {
|
||||
'@flecks/web/client.up': (flecks) => {
|
||||
window.flecks = flecks;
|
||||
const Synchronizer = Receiver(flecks);
|
||||
const synchronizer = new Synchronizer();
|
||||
flecks.set('$humus/app.synchronizer', synchronizer);
|
||||
synchronizer.listenTo(flecks.get('$flecks/socket.socket'));
|
||||
},
|
||||
};
|
||||
|
|
|
@ -1,5 +1,3 @@
|
|||
import {Hooks} from '@flecks/core';
|
||||
|
||||
import App from './components/app';
|
||||
import {selfEntity} from './state';
|
||||
import Ui, {Context} from './components/app/ui';
|
||||
|
@ -9,18 +7,16 @@ export * from './state';
|
|||
|
||||
export {Ui};
|
||||
|
||||
export default {
|
||||
[Hooks]: {
|
||||
'@flecks/core.config': () => ({
|
||||
resolution: [1600, 900],
|
||||
}),
|
||||
'@flecks/react.roots': () => App,
|
||||
'@flecks/react.providers': async (req, flecks) => [
|
||||
Context.Provider,
|
||||
{value: flecks.get('@humus/app.resolution')},
|
||||
],
|
||||
'@flecks/redux.slices': () => ({
|
||||
selfEntity,
|
||||
}),
|
||||
},
|
||||
export const hooks = {
|
||||
'@flecks/core.config': () => ({
|
||||
resolution: [1600, 900],
|
||||
}),
|
||||
'@flecks/react.roots': () => App,
|
||||
'@flecks/react.providers': async (req, flecks) => [
|
||||
Context.Provider,
|
||||
{value: flecks.get('@humus/app.resolution')},
|
||||
],
|
||||
'@flecks/redux.slices': () => ({
|
||||
selfEntity,
|
||||
}),
|
||||
};
|
||||
|
|
|
@ -1,24 +1,16 @@
|
|||
import {Hooks} from '@flecks/core';
|
||||
|
||||
// const {
|
||||
// NODE_ENV,
|
||||
// } = process.env;
|
||||
|
||||
export default {
|
||||
[Hooks]: {
|
||||
'@flecks/server.up': async (flecks) => {
|
||||
// if ('production' === NODE_ENV) {
|
||||
// return;
|
||||
// }
|
||||
const {User} = flecks.get('$flecks/db.models');
|
||||
if (!await User.findOne({where: {email: 'humus@cha0s.io'}})) {
|
||||
const user = await User.create({
|
||||
email: 'humus@cha0s.io',
|
||||
isAdmin: true,
|
||||
});
|
||||
await user.addHashedPassword('foobar');
|
||||
await user.save();
|
||||
}
|
||||
},
|
||||
export const hooks = {
|
||||
'@flecks/server.up': async (flecks) => {
|
||||
// if ('production' === NODE_ENV) {
|
||||
// return;
|
||||
// }
|
||||
const {User} = flecks.get('$flecks/db.models');
|
||||
if (!await User.findOne({where: {email: 'humus@cha0s.io'}})) {
|
||||
const user = await User.create({
|
||||
email: 'humus@cha0s.io',
|
||||
isAdmin: true,
|
||||
});
|
||||
await user.addHashedPassword('foobar');
|
||||
await user.save();
|
||||
}
|
||||
},
|
||||
};
|
||||
|
|
|
@ -1,48 +1,46 @@
|
|||
import {Class, Flecks, Hooks} from '@flecks/core';
|
||||
import {Class, Flecks} from '@flecks/core';
|
||||
import flatten from 'lodash.flatten';
|
||||
|
||||
export default {
|
||||
[Hooks]: {
|
||||
'@avocado/traits.traits': Flecks.provide(require.context('./traits', false, /\.js$/)),
|
||||
'@humus/combat.affinities': () => ({
|
||||
Void: Class,
|
||||
Bio: Class,
|
||||
Stone: Class,
|
||||
Wood: Class,
|
||||
Metal: Class,
|
||||
Air: Class,
|
||||
Earth: Class,
|
||||
Fire: Class,
|
||||
Water: Class,
|
||||
}),
|
||||
'@humus/combat.interactions': () => {
|
||||
const context = require.context('./interactions', false, /from-.*-to.*\.js$/);
|
||||
return context.keys().map((path) => context(path).default);
|
||||
},
|
||||
'@flecks/core.starting': (flecks) => {
|
||||
flecks.set('$humus/combat.affinities', flecks.gather('@humus/combat.affinities'));
|
||||
const interactions = flatten(flecks.invokeFlat('@humus/combat.interactions'))
|
||||
.reduce(
|
||||
(r, interaction) => {
|
||||
const {harming, harmed} = interaction;
|
||||
return {
|
||||
...r,
|
||||
[harming]: {
|
||||
...(r[harming] || {}),
|
||||
[harmed]: [
|
||||
...((r[harming] || {})[harmed] || []),
|
||||
interaction,
|
||||
],
|
||||
},
|
||||
};
|
||||
},
|
||||
{},
|
||||
);
|
||||
flecks.set(
|
||||
'$humus/combat.interactions',
|
||||
(harmingAffinity, harmedAffinity) => interactions[harmingAffinity]?.[harmedAffinity] || [],
|
||||
);
|
||||
},
|
||||
'@flecks/socket.packets': Flecks.provide(require.context('./packets', false, /\.js$/)),
|
||||
export const hooks = {
|
||||
'@avocado/traits.traits': Flecks.provide(require.context('./traits', false, /\.js$/)),
|
||||
'@humus/combat.affinities': () => ({
|
||||
Void: Class,
|
||||
Bio: Class,
|
||||
Stone: Class,
|
||||
Wood: Class,
|
||||
Metal: Class,
|
||||
Air: Class,
|
||||
Earth: Class,
|
||||
Fire: Class,
|
||||
Water: Class,
|
||||
}),
|
||||
'@humus/combat.interactions': () => {
|
||||
const context = require.context('./interactions', false, /from-.*-to.*\.js$/);
|
||||
return context.keys().map((path) => context(path).default);
|
||||
},
|
||||
'@flecks/core.starting': (flecks) => {
|
||||
flecks.set('$humus/combat.affinities', flecks.gather('@humus/combat.affinities'));
|
||||
const interactions = flatten(flecks.invokeFlat('@humus/combat.interactions'))
|
||||
.reduce(
|
||||
(r, interaction) => {
|
||||
const {harming, harmed} = interaction;
|
||||
return {
|
||||
...r,
|
||||
[harming]: {
|
||||
...(r[harming] || {}),
|
||||
[harmed]: [
|
||||
...((r[harming] || {})[harmed] || []),
|
||||
interaction,
|
||||
],
|
||||
},
|
||||
};
|
||||
},
|
||||
{},
|
||||
);
|
||||
flecks.set(
|
||||
'$humus/combat.interactions',
|
||||
(harmingAffinity, harmedAffinity) => interactions[harmingAffinity]?.[harmedAffinity] || [],
|
||||
);
|
||||
},
|
||||
'@flecks/socket.packets': Flecks.provide(require.context('./packets', false, /\.js$/)),
|
||||
};
|
||||
|
|
|
@ -1,12 +1,10 @@
|
|||
import {Hooks, Flecks} from '@flecks/core';
|
||||
import {Flecks} from '@flecks/core';
|
||||
|
||||
export default {
|
||||
[Hooks]: {
|
||||
'@avocado/traits/persea.components': (
|
||||
Flecks.provide(
|
||||
require.context('./traits', false, /\.jsx$/),
|
||||
{invoke: false},
|
||||
)
|
||||
),
|
||||
},
|
||||
export const hooks = {
|
||||
'@avocado/traits/persea.components': (
|
||||
Flecks.provide(
|
||||
require.context('./traits', false, /\.jsx$/),
|
||||
{invoke: false},
|
||||
)
|
||||
),
|
||||
};
|
||||
|
|
|
@ -1,29 +1,26 @@
|
|||
import {Hooks} from '@flecks/core';
|
||||
import isElectron from 'is-electron';
|
||||
|
||||
const {
|
||||
NODE_ENV,
|
||||
} = process.env;
|
||||
|
||||
export default {
|
||||
[Hooks]: {
|
||||
'@flecks/electron/server.window': async (win) => {
|
||||
// win.removeMenu();
|
||||
if ('production' !== NODE_ENV) {
|
||||
win.openDevTools();
|
||||
}
|
||||
win.maximize();
|
||||
win.once('ready-to-show', () => {
|
||||
win.show();
|
||||
});
|
||||
},
|
||||
'@flecks/web/server.request.route': (flecks) => async (req, res, next) => {
|
||||
if (isElectron() && 0 === req.user.id) {
|
||||
const {User} = flecks.get('$flecks/db.models');
|
||||
req.logIn(await User.findByPk(1), next);
|
||||
return;
|
||||
}
|
||||
next();
|
||||
},
|
||||
export const hooks = {
|
||||
'@flecks/electron/server.window': async (win) => {
|
||||
// win.removeMenu();
|
||||
if ('production' !== NODE_ENV) {
|
||||
win.openDevTools();
|
||||
}
|
||||
win.maximize();
|
||||
win.once('ready-to-show', () => {
|
||||
win.show();
|
||||
});
|
||||
},
|
||||
'@flecks/web/server.request.route': (flecks) => async (req, res, next) => {
|
||||
if (isElectron() && 0 === req.user.id) {
|
||||
const {User} = flecks.get('$flecks/db.models');
|
||||
req.logIn(await User.findByPk(1), next);
|
||||
return;
|
||||
}
|
||||
next();
|
||||
},
|
||||
};
|
||||
|
|
|
@ -1,7 +1,5 @@
|
|||
import {Flecks, Hooks} from '@flecks/core';
|
||||
import {Flecks} from '@flecks/core';
|
||||
|
||||
export default {
|
||||
[Hooks]: {
|
||||
'@avocado/traits.traits': Flecks.provide(require.context('./traits', false, /\.js$/)),
|
||||
},
|
||||
export const hooks = {
|
||||
'@avocado/traits.traits': Flecks.provide(require.context('./traits', false, /\.js$/)),
|
||||
};
|
||||
|
|
|
@ -1,12 +1,10 @@
|
|||
import {Flecks, Hooks} from '@flecks/core';
|
||||
import {Flecks} from '@flecks/core';
|
||||
|
||||
export default {
|
||||
[Hooks]: {
|
||||
'@avocado/traits/persea.components': (
|
||||
Flecks.provide(
|
||||
require.context('./traits', false, /\.jsx$/),
|
||||
{invoke: false},
|
||||
)
|
||||
),
|
||||
},
|
||||
export const hooks = {
|
||||
'@avocado/traits/persea.components': (
|
||||
Flecks.provide(
|
||||
require.context('./traits', false, /\.jsx$/),
|
||||
{invoke: false},
|
||||
)
|
||||
),
|
||||
};
|
||||
|
|
|
@ -1,16 +1,12 @@
|
|||
import {join} from 'path';
|
||||
|
||||
import {Hooks} from '@flecks/core';
|
||||
|
||||
const {
|
||||
FLECKS_CORE_ROOT = process.cwd(),
|
||||
} = process.env;
|
||||
|
||||
export default {
|
||||
[Hooks]: {
|
||||
'@flecks/core.starting': (flecks) => {
|
||||
const {browserWindowOptions} = flecks.get('@flecks/electron/server');
|
||||
browserWindowOptions.icon = join(FLECKS_CORE_ROOT, 'icon.png');
|
||||
},
|
||||
export const hooks = {
|
||||
'@flecks/core.starting': (flecks) => {
|
||||
const {browserWindowOptions} = flecks.get('@flecks/electron/server');
|
||||
browserWindowOptions.icon = join(FLECKS_CORE_ROOT, 'icon.png');
|
||||
},
|
||||
};
|
||||
|
|
46
packages/core/src/traits/magical.js
Normal file
46
packages/core/src/traits/magical.js
Normal file
|
@ -0,0 +1,46 @@
|
|||
import {Vector} from '@avocado/math';
|
||||
import {StateProperty, Trait} from '@avocado/traits';
|
||||
import {compose} from '@flecks/core';
|
||||
|
||||
const decorate = compose(
|
||||
StateProperty('mana', {
|
||||
track: true,
|
||||
}),
|
||||
);
|
||||
|
||||
export default (flecks) => class Magical extends decorate(Trait) {
|
||||
|
||||
static defaultState() {
|
||||
return {
|
||||
mana: 0,
|
||||
};
|
||||
}
|
||||
|
||||
// eslint-disable-next-line class-methods-use-this
|
||||
listeners() {
|
||||
return {
|
||||
|
||||
mouseButtonDown: ({position}) => {
|
||||
if (this.entity.is('Followed')) {
|
||||
const offset = Vector.sub(
|
||||
this.entity.position,
|
||||
this.entity.camera.realOffset,
|
||||
);
|
||||
const {resolution} = flecks.get('@humus/app');
|
||||
const scale = Vector.div(resolution, this.entity.camera.viewSize);
|
||||
const scaledPosition = Vector.div(position, scale);
|
||||
const relative = Vector.sub(scaledPosition, offset);
|
||||
console.log(JSON.stringify({
|
||||
offset,
|
||||
position,
|
||||
scale,
|
||||
scaledPosition,
|
||||
relative,
|
||||
}, null, 2));
|
||||
}
|
||||
},
|
||||
|
||||
};
|
||||
}
|
||||
|
||||
};
|
|
@ -1,11 +1,9 @@
|
|||
import {Flecks, Hooks} from '@flecks/core';
|
||||
import {Flecks} from '@flecks/core';
|
||||
|
||||
export default {
|
||||
[Hooks]: {
|
||||
'@avocado/resource.resources.decorate': (
|
||||
Flecks.decorate(require.context('./resources/decorators', false, /\.js$/))
|
||||
),
|
||||
'@avocado/traits.traits': Flecks.provide(require.context('./traits', false, /\.js$/)),
|
||||
'@flecks/socket.packets': Flecks.provide(require.context('./packets', false, /\.js$/)),
|
||||
},
|
||||
export const hooks = {
|
||||
'@avocado/resource.resources.decorate': (
|
||||
Flecks.decorate(require.context('./resources/decorators', false, /\.js$/))
|
||||
),
|
||||
'@avocado/traits.traits': Flecks.provide(require.context('./traits', false, /\.js$/)),
|
||||
'@flecks/socket.packets': Flecks.provide(require.context('./packets', false, /\.js$/)),
|
||||
};
|
||||
|
|
|
@ -1,10 +1,8 @@
|
|||
import {Hooks, Flecks} from '@flecks/core';
|
||||
import {Flecks} from '@flecks/core';
|
||||
|
||||
export * from './hooks';
|
||||
|
||||
export default {
|
||||
[Hooks]: {
|
||||
'@avocado/traits.traits': Flecks.provide(require.context('./traits', false, /\.js$/)),
|
||||
'@flecks/socket.packets': Flecks.provide(require.context('./packets', false, /\.js$/)),
|
||||
},
|
||||
export const hooks = {
|
||||
'@avocado/traits.traits': Flecks.provide(require.context('./traits', false, /\.js$/)),
|
||||
'@flecks/socket.packets': Flecks.provide(require.context('./packets', false, /\.js$/)),
|
||||
};
|
||||
|
|
|
@ -1,9 +1,7 @@
|
|||
import {Flecks, Hooks} from '@flecks/core';
|
||||
import {Flecks} from '@flecks/core';
|
||||
|
||||
export default {
|
||||
[Hooks]: {
|
||||
'@avocado/resource.resources.decorate': (
|
||||
Flecks.decorate(require.context('./resources/decorators', false, /\.js$/))
|
||||
),
|
||||
},
|
||||
export const hooks = {
|
||||
'@avocado/resource.resources.decorate': (
|
||||
Flecks.decorate(require.context('./resources/decorators', false, /\.js$/))
|
||||
),
|
||||
};
|
||||
|
|
|
@ -1,20 +1,18 @@
|
|||
import {Hooks, Flecks} from '@flecks/core';
|
||||
import {Flecks} from '@flecks/core';
|
||||
|
||||
import {universes} from './state';
|
||||
|
||||
export * from './state';
|
||||
|
||||
export default {
|
||||
[Hooks]: {
|
||||
'@avocado/resource.resources': Flecks.provide(require.context('./resources', false, /\.js$/)),
|
||||
'@avocado/traits.traits': Flecks.provide(require.context('./traits', false, /\.js$/)),
|
||||
'@flecks/core.config': () => ({
|
||||
resource: 'resource',
|
||||
universe: 'universe',
|
||||
}),
|
||||
'@flecks/socket.packets': Flecks.provide(require.context('./packets', false, /\.js$/)),
|
||||
'@flecks/redux.slices': () => ({
|
||||
universes,
|
||||
}),
|
||||
},
|
||||
export const hooks = {
|
||||
'@avocado/resource.resources': Flecks.provide(require.context('./resources', false, /\.js$/)),
|
||||
'@avocado/traits.traits': Flecks.provide(require.context('./traits', false, /\.js$/)),
|
||||
'@flecks/core.config': () => ({
|
||||
resource: 'resource',
|
||||
universe: 'universe',
|
||||
}),
|
||||
'@flecks/socket.packets': Flecks.provide(require.context('./packets', false, /\.js$/)),
|
||||
'@flecks/redux.slices': () => ({
|
||||
universes,
|
||||
}),
|
||||
};
|
||||
|
|
|
@ -2,7 +2,7 @@ import {stat} from 'fs/promises';
|
|||
import {resolve} from 'path';
|
||||
|
||||
import {Resource} from '@avocado/resource';
|
||||
import {D, Flecks, Hooks} from '@flecks/core';
|
||||
import {D, Flecks} from '@flecks/core';
|
||||
import express from 'express';
|
||||
|
||||
import Universe from './universe';
|
||||
|
@ -13,49 +13,47 @@ const {
|
|||
|
||||
const debug = D('@humus/universe/server');
|
||||
|
||||
export default {
|
||||
[Hooks]: {
|
||||
'@flecks/core.starting': async (flecks) => {
|
||||
const {resource} = flecks.get('@humus/universe');
|
||||
const stats = await stat(resource);
|
||||
if (!stats.isDirectory()) {
|
||||
throw new Error(`resource root ${resource} is not a directory`);
|
||||
}
|
||||
Resource.root = resource;
|
||||
flecks.set('$humus/universe.resource-server', express.static(resource));
|
||||
debug('resource root: %s', resource);
|
||||
},
|
||||
'@flecks/server.up': async (flecks) => {
|
||||
const {universe: path} = flecks.get('@humus/universe');
|
||||
try {
|
||||
const universe = await Universe.loadFrom(flecks, resolve(FLECKS_CORE_ROOT, path));
|
||||
flecks.set('$humus/universe.universe', universe);
|
||||
universe.start();
|
||||
debug('universe up and running!');
|
||||
}
|
||||
catch (error) {
|
||||
throw new Error(`couldn't run universe: ${error.stack}`);
|
||||
}
|
||||
},
|
||||
'@flecks/web/server.request.socket': (flecks) => (req, res, next) => {
|
||||
if (req.url.startsWith('/resource')) {
|
||||
req.url = req.url.slice('/resource'.length);
|
||||
flecks.get('$humus/universe.resource-server')(req, res, next);
|
||||
return;
|
||||
}
|
||||
next();
|
||||
},
|
||||
'@flecks/socket.packets.decorate': (
|
||||
Flecks.decorate(require.context('./packets/decorators', false, /\.js$/))
|
||||
),
|
||||
'@flecks/socket/server.request.socket': (flecks) => async ({handshake}, next) => {
|
||||
const {universe} = flecks.get('$humus/universe');
|
||||
const {user} = handshake;
|
||||
if (0 !== user.id) {
|
||||
// eslint-disable-next-line no-param-reassign
|
||||
handshake.entity = await universe.loadOrCreateEntity(user);
|
||||
}
|
||||
next();
|
||||
},
|
||||
export const hooks = {
|
||||
'@flecks/core.starting': async (flecks) => {
|
||||
const {resource} = flecks.get('@humus/universe');
|
||||
const stats = await stat(resource);
|
||||
if (!stats.isDirectory()) {
|
||||
throw new Error(`resource root ${resource} is not a directory`);
|
||||
}
|
||||
Resource.root = resource;
|
||||
flecks.set('$humus/universe.resource-server', express.static(resource));
|
||||
debug('resource root: %s', resource);
|
||||
},
|
||||
'@flecks/server.up': async (flecks) => {
|
||||
const {universe: path} = flecks.get('@humus/universe');
|
||||
try {
|
||||
const universe = await Universe.loadFrom(flecks, resolve(FLECKS_CORE_ROOT, path));
|
||||
flecks.set('$humus/universe.universe', universe);
|
||||
universe.start();
|
||||
debug('universe up and running!');
|
||||
}
|
||||
catch (error) {
|
||||
throw new Error(`couldn't run universe: ${error.stack}`);
|
||||
}
|
||||
},
|
||||
'@flecks/web/server.request.socket': (flecks) => (req, res, next) => {
|
||||
if (req.url.startsWith('/resource')) {
|
||||
req.url = req.url.slice('/resource'.length);
|
||||
flecks.get('$humus/universe.resource-server')(req, res, next);
|
||||
return;
|
||||
}
|
||||
next();
|
||||
},
|
||||
'@flecks/socket.packets.decorate': (
|
||||
Flecks.decorate(require.context('./packets/decorators', false, /\.js$/))
|
||||
),
|
||||
'@flecks/socket/server.request.socket': (flecks) => async ({handshake}, next) => {
|
||||
const {universe} = flecks.get('$humus/universe');
|
||||
const {user} = handshake;
|
||||
if (0 !== user.id) {
|
||||
// eslint-disable-next-line no-param-reassign
|
||||
handshake.entity = await universe.loadOrCreateEntity(user);
|
||||
}
|
||||
next();
|
||||
},
|
||||
};
|
||||
|
|
Loading…
Reference in New Issue
Block a user