Great advancements on Ravioli this week !
To make it short I am now able to create component instance and add them :
- acceptors
- action
- basic next action predicate
I have also implemented sync, async, cancelable async and composable action.
It remains to implements:
- control state
- more advanced next action predicate
- representation of the model
Here is an example with a mini scenario: A player hits a grunt which auto heals itself twice in reaction.
Next week I will put a live demo online on code sandbox.
test('A player hits a grunt which auto heal itself twice in reaction.',
function() {
const Grunt = component(
object({ hp: number() })
)
.addAcceptor('setHP', model => ({
mutator({ hp }: { hp: number }) {
model.hp = model.hp + hp / 2
},
}))
.addActions({
hit() {
return [
{
type: 'setHP',
payload: {
hp: -2,
},
},
]
},
heal() {
return [
{
type: 'setHP',
payload: {
hp: 6,
},
},
]
},
})
.addNAP("double damage", ({acceptedMutations}, {heal}) => {
const isHit = acceptedMutations.some(({type, payload}) => type === 'setHP' && payload.hp < 0)
const isHealed = acceptedMutations .some(({type, payload}) => type === 'setHP' && payload.hp > 0)
if(isHit) {
console.log("Thrall is hit: -3")
console.log("Buff double heal")
heal()
heal()
}
if (isHealed) {
console.log("Thrall is healed: +6")
}
})
const Thrall = Grunt.create({ hp: 10000 })
Thrall.actions.hit()
expect(getData(Thrall).hp).toBe(10003)
// Battle log:
// Thrall is hit: -3
// Buff double heal
// Thrall is healed: +6
})
Top comments (0)