diff --git a/src/bootstrap.js b/src/bootstrap.js index caf4104..f28646f 100644 --- a/src/bootstrap.js +++ b/src/bootstrap.js @@ -82,7 +82,12 @@ const src = setup({ const out = {...context.out, [id]: {...taskdefs[id]}}; const tasks = context.tasks.slice(1); enqueue.assign({out, tasks}); - enqueue.spawnChild(task, {systemId: `task-${id}`}); + enqueue.spawnChild(task, { + systemId: `task-${id}`, + input: { + task_id: id + } + }); }), notify: sendTo( diff --git a/src/lib-task2.js b/src/lib-task2.js index f393055..802ffe6 100644 --- a/src/lib-task2.js +++ b/src/lib-task2.js @@ -8,9 +8,13 @@ const service_not_implemented = fromPromise(() => { throw new Error('service not implemented'); }); -const update_game = sendTo(game, ({event}, {fn, ...params}) => ({ +const update_game = sendTo(game, ({ event}, {fn, task_id, ...params}) => ({ type: 'game.update', - updater: produce(fn.bind(null, {event, params})), + updater: produce(fn.bind(null, { + task_id, + event, + params + })), })); const abort_task = sendTo(game, ({event}, {task_id, err}) => ({ @@ -41,6 +45,9 @@ export const game_updater = fn => }, }) .createMachine({ + context: ({input}) => ({ + task_id: input.task_id + }), initial: 'execute', states: { execute: { @@ -48,9 +55,10 @@ export const game_updater = fn => target: 'done', actions: { type: 'update_game', - params: { + params: ({context}) => ({ + task_id: context.task_id, fn - } + }) } } }, @@ -60,107 +68,109 @@ export const game_updater = fn => } }); -const task_setup = setup({ - actors: { - fields: service_not_implemented, - replenish: service_not_implemented, - selected: service_not_implemented - }, - actions: { - abort_task, - acknowledge_task, - complete_task - }, - guards: { - is_todo - } -}); - - -const task = task_id => task_setup.createMachine({ - context: { - task_id, - }, - initial: 'idle', - states: { - idle: { - on: { - 'task.fields': { - target: 'fields' - }, - 'task.selected': { - target: 'selected' - }, - 'task.replenish': { - target: 'replenish', - } - } +const task = + setup({ + actors: { + fields: service_not_implemented, + replenish: service_not_implemented, + selected: service_not_implemented }, - fields: { - invoke: { - src: 'fields', - onDone: { - target: 'idle', - actions: 'acknowledge_task' - } - } + actions: { + abort_task, + acknowledge_task, + complete_task }, - replenish: { - invoke: { - src: 'replenish', - onDone: { - target: 'idle', - actions: 'acknowledge_task' + guards: { + is_todo + } + }) + .createMachine({ + context: ({input}) => ({ + task_id: input.task_id + }), + initial: 'idle', + states: { + idle: { + on: { + 'task.fields': { + target: 'fields' + }, + 'task.selected': { + target: 'selected' + }, + 'task.replenish': { + target: 'replenish', + } } - } - }, - selected: { - invoke: { - src: 'selected', - input: ({context}) => ({ - task_id: context.task_id - }), - onDone: [ - { - guard: 'is_todo', + }, + fields: { + invoke: { + src: 'fields', + input: ({context}) => ({ + task_id: context.task_id + }), + onDone: { target: 'idle', - actions: { - type: 'abort_task', - params: { - task_id, - err: 'TODO' - } - } - }, - { + actions: 'acknowledge_task' + } + } + }, + replenish: { + invoke: { + src: 'replenish', + input: ({context}) => ({ + task_id: context.task_id + }), + onDone: { target: 'idle', - actions: { - type: 'complete_task', - params: { - task_id + actions: 'acknowledge_task' + } + } + }, + selected: { + invoke: { + src: 'selected', + input: ({context}) => ({ + task_id: context.task_id + }), + onDone: [ + { + guard: 'is_todo', + target: 'idle', + actions: { + type: 'abort_task', + params: ({context}) => ({ + task_id: context.task_id, + err: 'TODO' + }) + } + }, + { + target: 'idle', + actions: { + type: 'complete_task', + params: ({context}) => ({ + task_id: context.task_id + }) } } - } - ] + ] + } } } - } -}); - -export default ({id, ...actors}) => { - const t = task(id); - return t.provide({ - actors: Object.fromEntries( - Object.entries(actors).map(([k, v]) => { - if (typeof v == 'function') { - return [k, game_updater(v)]; - } - if (v === 'TODO') { - return [k, todo]; - } - return [k, v]; - }) - ) }); -}; + +export default (actors) => task.provide({ + actors: Object.fromEntries( + Object.entries(actors).map(([k, v]) => { + if (typeof v == 'function') { + return [k, game_updater(v)]; + } + if (v === 'TODO') { + return [k, todo]; + } + return [k, v]; + }) + ) +}); diff --git a/src/task-001.js b/src/task-001.js index 7571882..e9b6a4c 100644 --- a/src/task-001.js +++ b/src/task-001.js @@ -7,7 +7,7 @@ import task from './lib-task2.js'; export default task({ - id: '001', + fields: (_, game) => { const ids = Object.keys(game.farmyard); diff --git a/src/task-105.js b/src/task-105.js index cdc3a1b..056e145 100644 --- a/src/task-105.js +++ b/src/task-105.js @@ -7,7 +7,6 @@ Implements the `1 Occupation` action space. import task from './lib-task2.js'; export default task({ - id: '105', selected: 'TODO' }); diff --git a/src/task-106.js b/src/task-106.js index 1369616..4fe3c33 100644 --- a/src/task-106.js +++ b/src/task-106.js @@ -5,7 +5,7 @@ import task from './lib-task2.js'; export default task({ - id: '106', + selected: (_, game) => { game.supply.food += 2; return game; diff --git a/src/task-107.js b/src/task-107.js index 5bbb45c..2f7098a 100644 --- a/src/task-107.js +++ b/src/task-107.js @@ -1,15 +1,16 @@ import task from './lib-task2.js'; export default task({ - id: '107', - replenish: (_, game) => { - game.tasks['107'].quantity += 2; + + replenish: ({task_id}, game) => { + game.tasks[task_id].quantity += 2; return game; }, - selected: (_, game) => { - const {quantity} = game.tasks['107']; + + selected: ({task_id}, game) => { + const {quantity} = game.tasks[task_id]; game.supply.wood += quantity; - game.tasks['107'].quantity = 0; + game.tasks[task_id].quantity = 0; return game; } }); diff --git a/src/task-108.js b/src/task-108.js index 3c6c0fe..a6addfd 100644 --- a/src/task-108.js +++ b/src/task-108.js @@ -6,15 +6,16 @@ Take x CLay import task from './lib-task2.js'; export default task({ - id: '108', - replenish: (_, game) => { - game.tasks['108'].quantity += 1; + + replenish: ({task_id}, game) => { + game.tasks[task_id].quantity += 1; return game; }, - selected: (_, game) => { - const {quantity} = game.tasks['108']; + + selected: ({task_id}, game) => { + const {quantity} = game.tasks[task_id]; game.supply.clay += quantity; - game.tasks['108'].quantity = 0; + game.tasks[task_id].quantity = 0; return game; } }); diff --git a/src/task-109.js b/src/task-109.js index 534d8f1..357f011 100644 --- a/src/task-109.js +++ b/src/task-109.js @@ -7,15 +7,16 @@ Take x Reed import task from './lib-task2.js'; export default task({ - id: '109', - replenish: (_, game) => { - game.tasks[109].quantity += 1; + + replenish: ({task_id}, game) => { + game.tasks[task_id].quantity += 1; return game; }, - selected: (_, game) => { - const {quantity} = game.tasks[109]; + + selected: ({task_id}, game) => { + const {quantity} = game.tasks[task_id]; game.supply.reed += quantity; - game.tasks[109].quantity = 0; + game.tasks[task_id].quantity = 0; return game; } }); diff --git a/src/task-110.js b/src/task-110.js index 31abfb4..4565681 100644 --- a/src/task-110.js +++ b/src/task-110.js @@ -7,15 +7,16 @@ Take x Food import task from './lib-task2.js'; export default task({ - id: '110', - replenish: (_, game) => { - game.tasks[110].quantity += 1; + + replenish: ({task_id}, game) => { + game.tasks[task_id].quantity += 1; return game; }, - selected: (_, game) => { - const {quantity} = game.tasks[110]; + + selected: ({task_id}, game) => { + const {quantity} = game.tasks[task_id]; game.supply.food += quantity; - game.tasks[110].quantity = 0; + game.tasks[task_id].quantity = 0; return game; } }); diff --git a/src/task-114.js b/src/task-114.js index 46b227e..dcc9d0a 100644 --- a/src/task-114.js +++ b/src/task-114.js @@ -7,11 +7,12 @@ import task from './lib-task2.js'; export default task({ - id: '114', - replenish: (_, game) => { - game.tasks[114].quantity += 1; + + replenish: ({task_id}, game) => { + game.tasks[task_id].quantity += 1; return game; }, + selected: 'TODO' }) diff --git a/src/task-116.js b/src/task-116.js index 05cd187..bb4959f 100644 --- a/src/task-116.js +++ b/src/task-116.js @@ -7,16 +7,15 @@ import task from './lib-task2.js'; export default task({ - id: '116', - replenish: (_, game) => { - game.tasks['116'].quantity += 1; + replenish: ({task_id}, game) => { + game.tasks[task_id].quantity += 1; return game; }, - selected: (_, game) => { - const {quantity} = game.tasks['116']; - game.tasks['116'].quantity = 0; + selected: ({task_id}, game) => { + const {quantity} = game.tasks[task_id]; + game.tasks[task_id].quantity = 0; game.supply.stone += quantity; return game; } diff --git a/src/task-119.js b/src/task-119.js index 9f3b9d0..64f9570 100644 --- a/src/task-119.js +++ b/src/task-119.js @@ -7,10 +7,9 @@ import task from './lib-task2.js'; export default task({ - id: '119', - replenish: (_, game) => { - game.tasks['119'].quantity += 1; + replenish: ({task_id}, game) => { + game.tasks[task_id].quantity += 1; return game; },