From 81c91f3b404820e5c953c104f647472a956afe8a Mon Sep 17 00:00:00 2001 From: cha0s Date: Tue, 21 May 2019 03:10:07 -0500 Subject: [PATCH] refactor: clean up fixture generation --- resource/blue-fire.entity.json | 2 +- resource/fire.entity.json | 2 +- resource/flower-barrel.entity.json | 2 +- resource/kitty-fire.room.json | 1 + resource/kitty.entity.json | 2 +- resource/mama-kitty-spawner.entity.json | 2 +- resource/mama-kitty.entity.json | 2 +- server/create-entity-for-connection.js | 6 +- server/create-fixtures.js | 25 + server/create-server-room.js | 563 ------------------- server/fixtures/blue-fire.entity.js | 13 + server/fixtures/fire.entity.js | 78 +++ server/fixtures/flower-barrel.entity.js | 49 ++ server/fixtures/kitty-fire.room.js | 92 +++ server/fixtures/kitty.entity.js | 119 ++++ server/fixtures/mama-kitty-spawner.entity.js | 89 +++ server/fixtures/mama-kitty.entity.js | 90 +++ server/index.js | 13 +- 18 files changed, 569 insertions(+), 581 deletions(-) create mode 100644 resource/kitty-fire.room.json create mode 100644 server/create-fixtures.js delete mode 100644 server/create-server-room.js create mode 100644 server/fixtures/blue-fire.entity.js create mode 100644 server/fixtures/fire.entity.js create mode 100644 server/fixtures/flower-barrel.entity.js create mode 100644 server/fixtures/kitty-fire.room.js create mode 100644 server/fixtures/kitty.entity.js create mode 100644 server/fixtures/mama-kitty-spawner.entity.js create mode 100644 server/fixtures/mama-kitty.entity.js diff --git a/resource/blue-fire.entity.json b/resource/blue-fire.entity.json index 7f7304a..b1c45f7 100644 --- a/resource/blue-fire.entity.json +++ b/resource/blue-fire.entity.json @@ -1 +1 @@ -{"traits":{"animated":{"params":{"animations":{"idle":{"jitter":0.1,"offset":[0,0],"uri":"/blue-fire.animation.json"}}}},"audible":{"params":{"sounds":{"fire":{"uri":"/blue-fire.sound.json"}}}},"collider":{"params":{"isSensor":true}},"damaging":{"params":{"damagingSound":"fire","damageSpecs":[{"affinity":1,"lock":0.45,"power":-15,"variance":0.25}]}},"darkened":{"params":{"isDarkened":false}},"existent":{"state":{"name":"Blue fire"}},"layered":{},"listed":{},"physical":{},"positioned":{"state":{"x":0,"y":0}},"roomed":{},"shaped":{"params":{"shape":{"type":"rectangle","position":[0,0],"size":[16,16]}}},"visible":{"params":{"filter":"bloom"}}}} \ No newline at end of file +{"traits":{"animated":{"params":{"animations":{"idle":{"jitter":0.1,"offset":[0,0],"uri":"/blue-fire.animation.json"}}}},"audible":{"params":{"sounds":{"fire":{"uri":"/blue-fire.sound.json"}}}},"collider":{"params":{"isSensor":true}},"damaging":{"params":{"damagingSound":"fire","damageSpecs":[{"affinity":1,"lock":0.45,"power":-15,"variance":0.25}]}},"darkened":{"params":{"isDarkened":false}},"existent":{"state":{"name":"Blue fire"}},"layered":{},"listed":{},"physical":{},"positioned":{},"roomed":{},"shaped":{"params":{"shape":{"type":"rectangle","position":[0,0],"size":[16,16]}}},"visible":{"params":{"filter":"bloom"}}}} \ No newline at end of file diff --git a/resource/fire.entity.json b/resource/fire.entity.json index c3e8bf0..86a1e0b 100644 --- a/resource/fire.entity.json +++ b/resource/fire.entity.json @@ -1 +1 @@ -{"traits":{"animated":{"params":{"animations":{"idle":{"jitter":0.1,"offset":[0,0],"uri":"/fire.animation.json"}}}},"audible":{"params":{"sounds":{"fire":{"uri":"/fire.sound.json"}}}},"collider":{"params":{"isSensor":true}},"damaging":{"params":{"damagingSound":"fire","damageSpecs":[{"affinity":1,"lock":0.45,"power":15,"variance":0.25}]}},"darkened":{"params":{"isDarkened":false}},"existent":{"state":{"name":"Fire"}},"layered":{},"listed":{},"physical":{},"positioned":{"state":{"x":0,"y":0}},"roomed":{},"shaped":{"params":{"shape":{"type":"rectangle","position":[0,0],"size":[16,16]}}},"visible":{"params":{"filter":"bloom"}}}} \ No newline at end of file +{"traits":{"animated":{"params":{"animations":{"idle":{"jitter":0.1,"offset":[0,0],"uri":"/fire.animation.json"}}}},"audible":{"params":{"sounds":{"fire":{"uri":"/fire.sound.json"}}}},"collider":{"params":{"isSensor":true}},"damaging":{"params":{"damagingSound":"fire","damageSpecs":[{"affinity":1,"lock":0.45,"power":15,"variance":0.25}]}},"darkened":{"params":{"isDarkened":false}},"existent":{"state":{"name":"Fire"}},"layered":{},"listed":{},"physical":{},"positioned":{},"roomed":{},"shaped":{"params":{"shape":{"type":"rectangle","position":[0,0],"size":[16,16]}}},"visible":{"params":{"filter":"bloom"}}}} \ No newline at end of file diff --git a/resource/flower-barrel.entity.json b/resource/flower-barrel.entity.json index c48f253..70ace7f 100644 --- a/resource/flower-barrel.entity.json +++ b/resource/flower-barrel.entity.json @@ -1 +1 @@ -{"traits":{"alive":{"state":{"maxLife":1000,"life":1000}},"collider":{},"emitter":{},"existent":{"state":{"name":"Flower Barrel"}},"layered":{},"listed":{},"physical":{},"pictured":{"params":{"images":{"initial":{"offset":[0,-8],"size":[32,32],"uri":"/flower-barrel.png"}}}},"positioned":{"state":{"x":0,"y":0}},"roomed":{},"shaped":{"params":{"shape":{"type":"rectangle","position":[0,0],"size":[20,10]}}},"visible":{},"vulnerable":{}}} \ No newline at end of file +{"traits":{"alive":{"state":{"maxLife":1000,"life":1000}},"collider":{},"emitter":{},"existent":{"state":{"name":"Flower Barrel"}},"layered":{},"listed":{},"physical":{},"pictured":{"params":{"images":{"initial":{"offset":[0,-8],"size":[32,32],"uri":"/flower-barrel.png"}}}},"positioned":{},"roomed":{},"shaped":{"params":{"shape":{"type":"rectangle","position":[0,0],"size":[20,10]}}},"visible":{},"vulnerable":{}}} \ No newline at end of file diff --git a/resource/kitty-fire.room.json b/resource/kitty-fire.room.json new file mode 100644 index 0000000..1c3022b --- /dev/null +++ b/resource/kitty-fire.room.json @@ -0,0 +1 @@ +{"size":[384,384],"layers":[{"entities":[{"uri":"/flower-barrel.entity.json","traits":{"positioned":{"state":{"x":608,"y":896}}}},{"uri":"/flower-barrel.entity.json","traits":{"positioned":{"state":{"x":904,"y":1024}}}},{"uri":"/flower-barrel.entity.json","traits":{"positioned":{"state":{"x":708,"y":604}}}},{"uri":"/flower-barrel.entity.json","traits":{"positioned":{"state":{"x":896,"y":332}}}},{"uri":"/flower-barrel.entity.json","traits":{"positioned":{"state":{"x":720,"y":248}}}},{"uri":"/flower-barrel.entity.json","traits":{"positioned":{"state":{"x":1056,"y":768}}}},{"uri":"/flower-barrel.entity.json","traits":{"positioned":{"state":{"x":668,"y":800}}}},{"uri":"/flower-barrel.entity.json","traits":{"positioned":{"state":{"x":1088,"y":352}}}},{"uri":"/flower-barrel.entity.json","traits":{"positioned":{"state":{"x":636,"y":692}}}},{"uri":"/flower-barrel.entity.json","traits":{"positioned":{"state":{"x":792,"y":1136}}}},{"uri":"/flower-barrel.entity.json","traits":{"positioned":{"state":{"x":980,"y":448}}}},{"uri":"/flower-barrel.entity.json","traits":{"positioned":{"state":{"x":1224,"y":292}}}},{"uri":"/flower-barrel.entity.json","traits":{"positioned":{"state":{"x":828,"y":1192}}}},{"uri":"/flower-barrel.entity.json","traits":{"positioned":{"state":{"x":1308,"y":1044}}}},{"uri":"/flower-barrel.entity.json","traits":{"positioned":{"state":{"x":1148,"y":264}}}},{"uri":"/flower-barrel.entity.json","traits":{"positioned":{"state":{"x":228,"y":1052}}}},{"uri":"/flower-barrel.entity.json","traits":{"positioned":{"state":{"x":460,"y":256}}}},{"uri":"/flower-barrel.entity.json","traits":{"positioned":{"state":{"x":1108,"y":296}}}},{"uri":"/flower-barrel.entity.json","traits":{"positioned":{"state":{"x":540,"y":580}}}},{"uri":"/flower-barrel.entity.json","traits":{"positioned":{"state":{"x":740,"y":400}}}},{"uri":"/flower-barrel.entity.json","traits":{"positioned":{"state":{"x":1148,"y":544}}}},{"uri":"/flower-barrel.entity.json","traits":{"positioned":{"state":{"x":1000,"y":212}}}},{"uri":"/flower-barrel.entity.json","traits":{"positioned":{"state":{"x":428,"y":1288}}}},{"uri":"/flower-barrel.entity.json","traits":{"positioned":{"state":{"x":240,"y":920}}}},{"uri":"/flower-barrel.entity.json","traits":{"positioned":{"state":{"x":984,"y":1224}}}},{"uri":"/flower-barrel.entity.json","traits":{"positioned":{"state":{"x":220,"y":440}}}},{"uri":"/flower-barrel.entity.json","traits":{"positioned":{"state":{"x":1248,"y":868}}}},{"uri":"/flower-barrel.entity.json","traits":{"positioned":{"state":{"x":880,"y":480}}}},{"uri":"/flower-barrel.entity.json","traits":{"positioned":{"state":{"x":608,"y":1212}}}},{"uri":"/flower-barrel.entity.json","traits":{"positioned":{"state":{"x":900,"y":1028}}}},{"uri":"/flower-barrel.entity.json","traits":{"positioned":{"state":{"x":352,"y":1332}}}},{"uri":"/flower-barrel.entity.json","traits":{"positioned":{"state":{"x":784,"y":992}}}},{"uri":"/flower-barrel.entity.json","traits":{"positioned":{"state":{"x":396,"y":968}}}},{"uri":"/flower-barrel.entity.json","traits":{"positioned":{"state":{"x":216,"y":1316}}}},{"uri":"/flower-barrel.entity.json","traits":{"positioned":{"state":{"x":392,"y":628}}}},{"uri":"/flower-barrel.entity.json","traits":{"positioned":{"state":{"x":596,"y":1080}}}},{"uri":"/flower-barrel.entity.json","traits":{"positioned":{"state":{"x":552,"y":928}}}},{"uri":"/flower-barrel.entity.json","traits":{"positioned":{"state":{"x":616,"y":1000}}}},{"uri":"/flower-barrel.entity.json","traits":{"positioned":{"state":{"x":1136,"y":220}}}},{"uri":"/flower-barrel.entity.json","traits":{"positioned":{"state":{"x":696,"y":1236}}}},{"uri":"/flower-barrel.entity.json","traits":{"positioned":{"state":{"x":940,"y":1032}}}},{"uri":"/flower-barrel.entity.json","traits":{"positioned":{"state":{"x":964,"y":704}}}},{"uri":"/flower-barrel.entity.json","traits":{"positioned":{"state":{"x":1268,"y":296}}}},{"uri":"/flower-barrel.entity.json","traits":{"positioned":{"state":{"x":1116,"y":300}}}},{"uri":"/flower-barrel.entity.json","traits":{"positioned":{"state":{"x":488,"y":940}}}},{"uri":"/flower-barrel.entity.json","traits":{"positioned":{"state":{"x":1044,"y":448}}}},{"uri":"/flower-barrel.entity.json","traits":{"positioned":{"state":{"x":1132,"y":944}}}},{"uri":"/flower-barrel.entity.json","traits":{"positioned":{"state":{"x":848,"y":872}}}},{"uri":"/flower-barrel.entity.json","traits":{"positioned":{"state":{"x":384,"y":544}}}},{"uri":"/flower-barrel.entity.json","traits":{"positioned":{"state":{"x":1020,"y":524}}}},{"uri":"/mama-kitty-spawner.entity.json","traits":{"positioned":{"state":{"x":524,"y":536}}}},{"uri":"/mama-kitty-spawner.entity.json","traits":{"positioned":{"state":{"x":500,"y":552}}}},{"uri":"/mama-kitty-spawner.entity.json","traits":{"positioned":{"state":{"x":324,"y":652}}}},{"uri":"/mama-kitty-spawner.entity.json","traits":{"positioned":{"state":{"x":964,"y":1136}}}},{"uri":"/mama-kitty-spawner.entity.json","traits":{"positioned":{"state":{"x":248,"y":588}}}},{"uri":"/fire.entity.json","traits":{"positioned":{"state":{"x":980,"y":1192}}}},{"uri":"/fire.entity.json","traits":{"positioned":{"state":{"x":700,"y":984}}}},{"uri":"/fire.entity.json","traits":{"positioned":{"state":{"x":764,"y":392}}}},{"uri":"/fire.entity.json","traits":{"positioned":{"state":{"x":952,"y":1312}}}},{"uri":"/fire.entity.json","traits":{"positioned":{"state":{"x":892,"y":1272}}}},{"uri":"/fire.entity.json","traits":{"positioned":{"state":{"x":260,"y":720}}}},{"uri":"/fire.entity.json","traits":{"positioned":{"state":{"x":360,"y":1332}}}},{"uri":"/fire.entity.json","traits":{"positioned":{"state":{"x":1168,"y":940}}}},{"uri":"/fire.entity.json","traits":{"positioned":{"state":{"x":940,"y":780}}}},{"uri":"/fire.entity.json","traits":{"positioned":{"state":{"x":1196,"y":928}}}},{"uri":"/fire.entity.json","traits":{"positioned":{"state":{"x":316,"y":1100}}}},{"uri":"/fire.entity.json","traits":{"positioned":{"state":{"x":484,"y":996}}}},{"uri":"/fire.entity.json","traits":{"positioned":{"state":{"x":316,"y":468}}}},{"uri":"/fire.entity.json","traits":{"positioned":{"state":{"x":492,"y":952}}}},{"uri":"/fire.entity.json","traits":{"positioned":{"state":{"x":860,"y":864}}}},{"uri":"/fire.entity.json","traits":{"positioned":{"state":{"x":512,"y":368}}}},{"uri":"/fire.entity.json","traits":{"positioned":{"state":{"x":916,"y":564}}}},{"uri":"/fire.entity.json","traits":{"positioned":{"state":{"x":620,"y":1196}}}},{"uri":"/fire.entity.json","traits":{"positioned":{"state":{"x":512,"y":1292}}}},{"uri":"/fire.entity.json","traits":{"positioned":{"state":{"x":792,"y":1152}}}},{"uri":"/fire.entity.json","traits":{"positioned":{"state":{"x":696,"y":908}}}},{"uri":"/fire.entity.json","traits":{"positioned":{"state":{"x":232,"y":564}}}},{"uri":"/fire.entity.json","traits":{"positioned":{"state":{"x":392,"y":316}}}},{"uri":"/fire.entity.json","traits":{"positioned":{"state":{"x":932,"y":1312}}}},{"uri":"/fire.entity.json","traits":{"positioned":{"state":{"x":504,"y":980}}}},{"uri":"/fire.entity.json","traits":{"positioned":{"state":{"x":728,"y":712}}}},{"uri":"/fire.entity.json","traits":{"positioned":{"state":{"x":1100,"y":1144}}}},{"uri":"/fire.entity.json","traits":{"positioned":{"state":{"x":1284,"y":628}}}},{"uri":"/fire.entity.json","traits":{"positioned":{"state":{"x":552,"y":588}}}},{"uri":"/fire.entity.json","traits":{"positioned":{"state":{"x":340,"y":996}}}},{"uri":"/fire.entity.json","traits":{"positioned":{"state":{"x":324,"y":1164}}}},{"uri":"/fire.entity.json","traits":{"positioned":{"state":{"x":1256,"y":916}}}},{"uri":"/fire.entity.json","traits":{"positioned":{"state":{"x":956,"y":1176}}}},{"uri":"/fire.entity.json","traits":{"positioned":{"state":{"x":636,"y":1124}}}},{"uri":"/fire.entity.json","traits":{"positioned":{"state":{"x":456,"y":1276}}}},{"uri":"/fire.entity.json","traits":{"positioned":{"state":{"x":1104,"y":1320}}}},{"uri":"/fire.entity.json","traits":{"positioned":{"state":{"x":468,"y":232}}}},{"uri":"/fire.entity.json","traits":{"positioned":{"state":{"x":536,"y":1324}}}},{"uri":"/fire.entity.json","traits":{"positioned":{"state":{"x":1332,"y":1012}}}},{"uri":"/fire.entity.json","traits":{"positioned":{"state":{"x":656,"y":828}}}},{"uri":"/fire.entity.json","traits":{"positioned":{"state":{"x":1284,"y":268}}}},{"uri":"/fire.entity.json","traits":{"positioned":{"state":{"x":1156,"y":1240}}}},{"uri":"/fire.entity.json","traits":{"positioned":{"state":{"x":944,"y":1272}}}},{"uri":"/fire.entity.json","traits":{"positioned":{"state":{"x":348,"y":440}}}},{"uri":"/fire.entity.json","traits":{"positioned":{"state":{"x":492,"y":972}}}},{"uri":"/fire.entity.json","traits":{"positioned":{"state":{"x":472,"y":528}}}},{"uri":"/fire.entity.json","traits":{"positioned":{"state":{"x":992,"y":1300}}}},{"uri":"/fire.entity.json","traits":{"positioned":{"state":{"x":1312,"y":448}}}},{"uri":"/fire.entity.json","traits":{"positioned":{"state":{"x":508,"y":960}}}},{"uri":"/fire.entity.json","traits":{"positioned":{"state":{"x":1136,"y":636}}}},{"uri":"/fire.entity.json","traits":{"positioned":{"state":{"x":1172,"y":964}}}},{"uri":"/fire.entity.json","traits":{"positioned":{"state":{"x":808,"y":1320}}}},{"uri":"/fire.entity.json","traits":{"positioned":{"state":{"x":1292,"y":1104}}}},{"uri":"/fire.entity.json","traits":{"positioned":{"state":{"x":696,"y":1124}}}},{"uri":"/fire.entity.json","traits":{"positioned":{"state":{"x":212,"y":672}}}},{"uri":"/fire.entity.json","traits":{"positioned":{"state":{"x":244,"y":1048}}}},{"uri":"/fire.entity.json","traits":{"positioned":{"state":{"x":632,"y":936}}}},{"uri":"/fire.entity.json","traits":{"positioned":{"state":{"x":1052,"y":932}}}},{"uri":"/fire.entity.json","traits":{"positioned":{"state":{"x":756,"y":1332}}}},{"uri":"/fire.entity.json","traits":{"positioned":{"state":{"x":628,"y":1316}}}},{"uri":"/blue-fire.entity.json","traits":{"positioned":{"state":{"x":1208,"y":980}}}},{"uri":"/blue-fire.entity.json","traits":{"positioned":{"state":{"x":888,"y":540}}}},{"uri":"/blue-fire.entity.json","traits":{"positioned":{"state":{"x":232,"y":928}}}},{"uri":"/blue-fire.entity.json","traits":{"positioned":{"state":{"x":676,"y":1008}}}},{"uri":"/blue-fire.entity.json","traits":{"positioned":{"state":{"x":924,"y":804}}}}],"tiles":{"size":[24,24],"data":[1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4]},"tilesetUri":"/tileset.json"}]} \ No newline at end of file diff --git a/resource/kitty.entity.json b/resource/kitty.entity.json index 22ec84c..71b67f2 100644 --- a/resource/kitty.entity.json +++ b/resource/kitty.entity.json @@ -1 +1 @@ -{"traits":{"alive":{},"animated":{"params":{"animations":{"idle":{"offset":[0,-3],"uri":"/kitty.animation.json"}}}},"audible":{"params":{"sounds":{"deathSound":{"uri":"/ded.sound.json"}}}},"behaved":{"params":{"routines":{"type":"routines","routines":{"initial":{"type":"routine","routine":{"type":"actions","traversals":[{"type":"traversal","steps":[{"type":"key","key":"entity"},{"type":"key","key":"moveFor"},{"type":"invoke","args":[{"type":"traversal","steps":[{"type":"key","key":"global"},{"type":"key","key":"randomNumber"},{"type":"invoke","args":[{"type":"literal","value":0.25},{"type":"literal","value":2.5},{"type":"literal","value":false}]}]}]}]},{"type":"traversal","steps":[{"type":"key","key":"entity"},{"type":"key","key":"isAnimating"}],"value":{"type":"literal","value":false}},{"type":"traversal","steps":[{"type":"key","key":"global"},{"type":"key","key":"wait"},{"type":"invoke","args":[{"type":"traversal","steps":[{"type":"key","key":"global"},{"type":"key","key":"randomNumber"},{"type":"invoke","args":[{"type":"literal","value":1},{"type":"literal","value":4},{"type":"literal","value":false}]}]}]}]},{"type":"traversal","steps":[{"type":"key","key":"entity"},{"type":"key","key":"direction"}],"value":{"type":"traversal","steps":[{"type":"key","key":"global"},{"type":"key","key":"randomNumber"},{"type":"invoke","args":[{"type":"literal","value":0},{"type":"literal","value":3}]}]}},{"type":"traversal","steps":[{"type":"key","key":"global"},{"type":"key","key":"wait"},{"type":"invoke","args":[{"type":"traversal","steps":[{"type":"key","key":"global"},{"type":"key","key":"randomNumber"},{"type":"invoke","args":[{"type":"literal","value":0.5},{"type":"literal","value":3},{"type":"literal","value":false}]}]}]}]},{"type":"traversal","steps":[{"type":"key","key":"entity"},{"type":"key","key":"isAnimating"}],"value":{"type":"literal","value":true}}]}}}}}},"collider":{},"directional":{"params":{"directionCount":4},"state":{"direction":2}},"emitter":{},"existent":{"state":{"name":"Kitty"}},"visible":{"state":{"visibleScale":[1,1]}},"layered":{},"listed":{},"mobile":{"state":{"speed":40}},"physical":{},"positioned":{"state":{"x":0,"y":0}},"roomed":{},"shaped":{"params":{"shape":{"type":"rectangle","position":[0,0],"size":[8,4]}}},"vulnerable":{}}} \ No newline at end of file +{"traits":{"alive":{},"animated":{"params":{"animations":{"idle":{"offset":[0,-3],"uri":"/kitty.animation.json"}}}},"audible":{"params":{"sounds":{"deathSound":{"uri":"/ded.sound.json"}}}},"behaved":{"params":{"routines":{"type":"routines","routines":{"initial":{"type":"routine","routine":{"type":"actions","traversals":[{"type":"traversal","steps":[{"type":"key","key":"entity"},{"type":"key","key":"moveFor"},{"type":"invoke","args":[{"type":"traversal","steps":[{"type":"key","key":"global"},{"type":"key","key":"randomNumber"},{"type":"invoke","args":[{"type":"literal","value":0.25},{"type":"literal","value":2.5},{"type":"literal","value":false}]}]}]}]},{"type":"traversal","steps":[{"type":"key","key":"entity"},{"type":"key","key":"isAnimating"}],"value":{"type":"literal","value":false}},{"type":"traversal","steps":[{"type":"key","key":"global"},{"type":"key","key":"wait"},{"type":"invoke","args":[{"type":"traversal","steps":[{"type":"key","key":"global"},{"type":"key","key":"randomNumber"},{"type":"invoke","args":[{"type":"literal","value":1},{"type":"literal","value":4},{"type":"literal","value":false}]}]}]}]},{"type":"traversal","steps":[{"type":"key","key":"entity"},{"type":"key","key":"direction"}],"value":{"type":"traversal","steps":[{"type":"key","key":"global"},{"type":"key","key":"randomNumber"},{"type":"invoke","args":[{"type":"literal","value":0},{"type":"literal","value":3}]}]}},{"type":"traversal","steps":[{"type":"key","key":"global"},{"type":"key","key":"wait"},{"type":"invoke","args":[{"type":"traversal","steps":[{"type":"key","key":"global"},{"type":"key","key":"randomNumber"},{"type":"invoke","args":[{"type":"literal","value":0.5},{"type":"literal","value":3},{"type":"literal","value":false}]}]}]}]},{"type":"traversal","steps":[{"type":"key","key":"entity"},{"type":"key","key":"isAnimating"}],"value":{"type":"literal","value":true}}]}}}}}},"collider":{},"directional":{"params":{"directionCount":4},"state":{"direction":2}},"emitter":{},"existent":{"state":{"name":"Kitty"}},"visible":{"state":{"visibleScale":[1,1]}},"layered":{},"listed":{},"mobile":{"state":{"speed":40}},"physical":{},"positioned":{},"roomed":{},"shaped":{"params":{"shape":{"type":"rectangle","position":[0,0],"size":[8,4]}}},"vulnerable":{}}} \ No newline at end of file diff --git a/resource/mama-kitty-spawner.entity.json b/resource/mama-kitty-spawner.entity.json index 008a877..647b3a7 100644 --- a/resource/mama-kitty-spawner.entity.json +++ b/resource/mama-kitty-spawner.entity.json @@ -1 +1 @@ -{"traits":{"behaved":{"params":{"routines":{"type":"routines","routines":{"initial":{"type":"routine","routine":{"type":"actions","traversals":[{"type":"traversal","steps":[{"type":"key","key":"context"},{"type":"key","key":"json"}],"value":{"type":"literal","value":{"traits":{"positioned":{"state":{}}}}}},{"type":"traversal","steps":[{"type":"key","key":"context"},{"type":"key","key":"json"},{"type":"key","key":"traits"},{"type":"key","key":"positioned"},{"type":"key","key":"state"},{"type":"key","key":"x"}],"value":{"type":"traversal","steps":[{"type":"key","key":"global"},{"type":"key","key":"multiply"},{"type":"invoke","args":[{"type":"traversal","steps":[{"type":"key","key":"global"},{"type":"key","key":"randomNumber"},{"type":"invoke","args":[{"type":"literal","value":100},{"type":"literal","value":284}]}]},{"type":"literal","value":4}]}]}},{"type":"traversal","steps":[{"type":"key","key":"context"},{"type":"key","key":"json"},{"type":"key","key":"traits"},{"type":"key","key":"positioned"},{"type":"key","key":"state"},{"type":"key","key":"y"}],"value":{"type":"traversal","steps":[{"type":"key","key":"global"},{"type":"key","key":"multiply"},{"type":"invoke","args":[{"type":"traversal","steps":[{"type":"key","key":"global"},{"type":"key","key":"randomNumber"},{"type":"invoke","args":[{"type":"literal","value":100},{"type":"literal","value":284}]}]},{"type":"literal","value":4}]}]}},{"type":"traversal","steps":[{"type":"key","key":"entity"},{"type":"key","key":"spawn"},{"type":"invoke","args":[{"type":"literal","value":"mama"},{"type":"traversal","steps":[{"type":"key","key":"context"},{"type":"key","key":"json"}]}]}]}]}}}}}},"existent":{"state":{"name":"Mama spawner"}},"layered":{},"listed":{},"roomed":{},"spawner":{"params":{"spawns":{"mama":{"uri":"/mama-kitty.entity.json"}}},"state":{"maxSpawns":2}}}} \ No newline at end of file +{"traits":{"behaved":{"params":{"routines":{"type":"routines","routines":{"initial":{"type":"routine","routine":{"type":"actions","traversals":[{"type":"traversal","steps":[{"type":"key","key":"context"},{"type":"key","key":"json"}],"value":{"type":"literal","value":{"traits":{"positioned":{"state":{}}}}}},{"type":"traversal","steps":[{"type":"key","key":"context"},{"type":"key","key":"json"},{"type":"key","key":"traits"},{"type":"key","key":"positioned"},{"type":"key","key":"state"},{"type":"key","key":"x"}],"value":{"type":"traversal","steps":[{"type":"key","key":"global"},{"type":"key","key":"multiply"},{"type":"invoke","args":[{"type":"traversal","steps":[{"type":"key","key":"global"},{"type":"key","key":"randomNumber"},{"type":"invoke","args":[{"type":"literal","value":100},{"type":"traversal","steps":[{"type":"key","key":"global"},{"type":"key","key":"sub"},{"type":"invoke","args":[{"type":"traversal","steps":[{"type":"key","key":"entity"},{"type":"key","key":"room"},{"type":"key","key":"width"}]},{"type":"literal","value":100}]}]}]}]},{"type":"literal","value":4}]}]}},{"type":"traversal","steps":[{"type":"key","key":"context"},{"type":"key","key":"json"},{"type":"key","key":"traits"},{"type":"key","key":"positioned"},{"type":"key","key":"state"},{"type":"key","key":"y"}],"value":{"type":"traversal","steps":[{"type":"key","key":"global"},{"type":"key","key":"multiply"},{"type":"invoke","args":[{"type":"traversal","steps":[{"type":"key","key":"global"},{"type":"key","key":"randomNumber"},{"type":"invoke","args":[{"type":"literal","value":100},{"type":"traversal","steps":[{"type":"key","key":"global"},{"type":"key","key":"sub"},{"type":"invoke","args":[{"type":"traversal","steps":[{"type":"key","key":"entity"},{"type":"key","key":"room"},{"type":"key","key":"height"}]},{"type":"literal","value":100}]}]}]}]},{"type":"literal","value":4}]}]}},{"type":"traversal","steps":[{"type":"key","key":"entity"},{"type":"key","key":"spawn"},{"type":"invoke","args":[{"type":"literal","value":"mama"},{"type":"traversal","steps":[{"type":"key","key":"context"},{"type":"key","key":"json"}]}]}]}]}}}}}},"existent":{"state":{"name":"Mama spawner"}},"layered":{},"listed":{},"roomed":{},"spawner":{"params":{"spawns":{"mama":{"uri":"/mama-kitty.entity.json"}}},"state":{"maxSpawns":2}}}} \ No newline at end of file diff --git a/resource/mama-kitty.entity.json b/resource/mama-kitty.entity.json index a88b134..9c3acb8 100644 --- a/resource/mama-kitty.entity.json +++ b/resource/mama-kitty.entity.json @@ -1 +1 @@ -{"traits":{"alive":{"params":{"deathActions":{"type":"actions","traversals":[{"type":"traversal","steps":[{"type":"key","key":"entity"},{"type":"key","key":"playSound"},{"type":"invoke","args":[{"type":"traversal","steps":[{"type":"key","key":"entity"},{"type":"key","key":"deathSound"}]}]}]},{"type":"traversal","steps":[{"type":"key","key":"entity"},{"type":"key","key":"killAllChildren"},{"type":"invoke","args":[]}]},{"type":"traversal","steps":[{"type":"key","key":"entity"},{"type":"key","key":"transition"},{"type":"invoke","args":[{"type":"literal","value":{"opacity":0,"visibleScaleX":0.3,"visibleScaleY":3}},{"type":"literal","value":0.2}]}]}]}},"state":{"life":500,"maxLife":500}},"animated":{"params":{"animations":{"idle":{"offset":[0,-8],"uri":"/kitty.animation.json"}}}},"audible":{"params":{"sounds":{"deathSound":{"uri":"/ded.sound.json"}}}},"behaved":{"params":{"routines":{"type":"routines","routines":{"initial":{"type":"routine","routine":{"type":"actions","traversals":[{"type":"traversal","steps":[{"type":"key","key":"entity"},{"type":"key","key":"moveFor"},{"type":"invoke","args":[{"type":"traversal","steps":[{"type":"key","key":"global"},{"type":"key","key":"randomNumber"},{"type":"invoke","args":[{"type":"literal","value":0.25},{"type":"literal","value":2.5},{"type":"literal","value":false}]}]}]}]},{"type":"traversal","steps":[{"type":"key","key":"entity"},{"type":"key","key":"isAnimating"}],"value":{"type":"literal","value":false}},{"type":"traversal","steps":[{"type":"key","key":"global"},{"type":"key","key":"wait"},{"type":"invoke","args":[{"type":"traversal","steps":[{"type":"key","key":"global"},{"type":"key","key":"randomNumber"},{"type":"invoke","args":[{"type":"literal","value":1},{"type":"literal","value":4},{"type":"literal","value":false}]}]}]}]},{"type":"traversal","steps":[{"type":"key","key":"entity"},{"type":"key","key":"direction"}],"value":{"type":"traversal","steps":[{"type":"key","key":"global"},{"type":"key","key":"randomNumber"},{"type":"invoke","args":[{"type":"literal","value":0},{"type":"literal","value":3}]}]}},{"type":"traversal","steps":[{"type":"key","key":"global"},{"type":"key","key":"wait"},{"type":"invoke","args":[{"type":"traversal","steps":[{"type":"key","key":"global"},{"type":"key","key":"randomNumber"},{"type":"invoke","args":[{"type":"literal","value":0.5},{"type":"literal","value":3},{"type":"literal","value":false}]}]}]}]},{"type":"traversal","steps":[{"type":"key","key":"entity"},{"type":"key","key":"isAnimating"}],"value":{"type":"literal","value":true}},{"type":"traversal","steps":[{"type":"key","key":"context"},{"type":"key","key":"json"}],"value":{"type":"literal","value":{"traits":{"positioned":{"state":{}}}}}},{"type":"traversal","steps":[{"type":"key","key":"context"},{"type":"key","key":"json"},{"type":"key","key":"traits"},{"type":"key","key":"positioned"},{"type":"key","key":"state"},{"type":"key","key":"x"}],"value":{"type":"traversal","steps":[{"type":"key","key":"global"},{"type":"key","key":"multiply"},{"type":"invoke","args":[{"type":"traversal","steps":[{"type":"key","key":"entity"},{"type":"key","key":"x"}]},{"type":"literal","value":4}]}]}},{"type":"traversal","steps":[{"type":"key","key":"context"},{"type":"key","key":"json"},{"type":"key","key":"traits"},{"type":"key","key":"positioned"},{"type":"key","key":"state"},{"type":"key","key":"y"}],"value":{"type":"traversal","steps":[{"type":"key","key":"global"},{"type":"key","key":"multiply"},{"type":"invoke","args":[{"type":"traversal","steps":[{"type":"key","key":"entity"},{"type":"key","key":"y"}]},{"type":"literal","value":4}]}]}},{"type":"traversal","steps":[{"type":"key","key":"entity"},{"type":"key","key":"spawn"},{"type":"invoke","args":[{"type":"literal","value":"kitteh"},{"type":"traversal","steps":[{"type":"key","key":"context"},{"type":"key","key":"json"}]}]}]}]}}}}}},"collider":{},"directional":{"params":{"directionCount":4},"state":{"direction":2}},"emitter":{},"existent":{"state":{"name":"Mama Kitty"}},"visible":{"state":{"visibleScale":[2,2]}},"layered":{},"listed":{},"mobile":{"state":{"speed":40}},"physical":{},"positioned":{"state":{"x":0,"y":0}},"roomed":{},"shaped":{"params":{"shape":{"type":"rectangle","position":[0,0],"size":[16,8]}}},"vulnerable":{},"spawner":{"params":{"spawns":{"kitteh":{"uri":"/kitty.entity.json"}}},"state":{"maxSpawns":10}}}} \ No newline at end of file +{"traits":{"alive":{"params":{"deathActions":{"type":"actions","traversals":[{"type":"traversal","steps":[{"type":"key","key":"entity"},{"type":"key","key":"playSound"},{"type":"invoke","args":[{"type":"traversal","steps":[{"type":"key","key":"entity"},{"type":"key","key":"deathSound"}]}]}]},{"type":"traversal","steps":[{"type":"key","key":"entity"},{"type":"key","key":"killAllChildren"},{"type":"invoke","args":[]}]},{"type":"traversal","steps":[{"type":"key","key":"entity"},{"type":"key","key":"transition"},{"type":"invoke","args":[{"type":"literal","value":{"opacity":0,"visibleScaleX":0.3,"visibleScaleY":3}},{"type":"literal","value":0.2}]}]}]}},"state":{"life":500,"maxLife":500}},"animated":{"params":{"animations":{"idle":{"offset":[0,-8],"uri":"/kitty.animation.json"}}}},"audible":{"params":{"sounds":{"deathSound":{"uri":"/ded.sound.json"}}}},"behaved":{"params":{"routines":{"type":"routines","routines":{"initial":{"type":"routine","routine":{"type":"actions","traversals":[{"type":"traversal","steps":[{"type":"key","key":"entity"},{"type":"key","key":"moveFor"},{"type":"invoke","args":[{"type":"traversal","steps":[{"type":"key","key":"global"},{"type":"key","key":"randomNumber"},{"type":"invoke","args":[{"type":"literal","value":0.25},{"type":"literal","value":2.5},{"type":"literal","value":false}]}]}]}]},{"type":"traversal","steps":[{"type":"key","key":"entity"},{"type":"key","key":"isAnimating"}],"value":{"type":"literal","value":false}},{"type":"traversal","steps":[{"type":"key","key":"global"},{"type":"key","key":"wait"},{"type":"invoke","args":[{"type":"traversal","steps":[{"type":"key","key":"global"},{"type":"key","key":"randomNumber"},{"type":"invoke","args":[{"type":"literal","value":1},{"type":"literal","value":4},{"type":"literal","value":false}]}]}]}]},{"type":"traversal","steps":[{"type":"key","key":"entity"},{"type":"key","key":"direction"}],"value":{"type":"traversal","steps":[{"type":"key","key":"global"},{"type":"key","key":"randomNumber"},{"type":"invoke","args":[{"type":"literal","value":0},{"type":"literal","value":3}]}]}},{"type":"traversal","steps":[{"type":"key","key":"global"},{"type":"key","key":"wait"},{"type":"invoke","args":[{"type":"traversal","steps":[{"type":"key","key":"global"},{"type":"key","key":"randomNumber"},{"type":"invoke","args":[{"type":"literal","value":0.5},{"type":"literal","value":3},{"type":"literal","value":false}]}]}]}]},{"type":"traversal","steps":[{"type":"key","key":"entity"},{"type":"key","key":"isAnimating"}],"value":{"type":"literal","value":true}},{"type":"traversal","steps":[{"type":"key","key":"context"},{"type":"key","key":"json"}],"value":{"type":"literal","value":{"traits":{"positioned":{"state":{}}}}}},{"type":"traversal","steps":[{"type":"key","key":"context"},{"type":"key","key":"json"},{"type":"key","key":"traits"},{"type":"key","key":"positioned"},{"type":"key","key":"state"},{"type":"key","key":"x"}],"value":{"type":"traversal","steps":[{"type":"key","key":"global"},{"type":"key","key":"multiply"},{"type":"invoke","args":[{"type":"traversal","steps":[{"type":"key","key":"entity"},{"type":"key","key":"x"}]},{"type":"literal","value":4}]}]}},{"type":"traversal","steps":[{"type":"key","key":"context"},{"type":"key","key":"json"},{"type":"key","key":"traits"},{"type":"key","key":"positioned"},{"type":"key","key":"state"},{"type":"key","key":"y"}],"value":{"type":"traversal","steps":[{"type":"key","key":"global"},{"type":"key","key":"multiply"},{"type":"invoke","args":[{"type":"traversal","steps":[{"type":"key","key":"entity"},{"type":"key","key":"y"}]},{"type":"literal","value":4}]}]}},{"type":"traversal","steps":[{"type":"key","key":"entity"},{"type":"key","key":"spawn"},{"type":"invoke","args":[{"type":"literal","value":"kitteh"},{"type":"traversal","steps":[{"type":"key","key":"context"},{"type":"key","key":"json"}]}]}]}]}}}}}},"collider":{},"directional":{"params":{"directionCount":4},"state":{"direction":2}},"emitter":{},"existent":{"state":{"name":"Mama Kitty"}},"visible":{"state":{"visibleScale":[2,2]}},"layered":{},"listed":{},"mobile":{"state":{"speed":40}},"physical":{},"positioned":{},"roomed":{},"shaped":{"params":{"shape":{"type":"rectangle","position":[0,0],"size":[16,8]}}},"vulnerable":{},"spawner":{"params":{"spawns":{"kitteh":{"uri":"/kitty.entity.json"}}},"state":{"maxSpawns":10}}}} \ No newline at end of file diff --git a/server/create-entity-for-connection.js b/server/create-entity-for-connection.js index f28f90b..40b10ad 100644 --- a/server/create-entity-for-connection.js +++ b/server/create-entity-for-connection.js @@ -26,7 +26,11 @@ export function createEntityForConnection(socket) { } }, }, - collider: {}, + collider: { + params: { + collisionGroup: 'player', + }, + }, controllable: {}, directional: { params: { diff --git a/server/create-fixtures.js b/server/create-fixtures.js new file mode 100644 index 0000000..079c966 --- /dev/null +++ b/server/create-fixtures.js @@ -0,0 +1,25 @@ +import fs from 'fs'; +import path from 'path'; + +const RESOURCE_PATH = path.resolve(process.cwd(), 'resource'); + +function writeFixture(uri, json) { + fs.writeFileSync(path.join(RESOURCE_PATH, uri), JSON.stringify(json)); +} + +// Write all our dudes. +import {blueFireJSON} from './fixtures/blue-fire.entity'; +writeFixture('blue-fire.entity.json', blueFireJSON()); +import {fireJSON} from './fixtures/fire.entity'; +writeFixture('fire.entity.json', fireJSON()); +import {flowerBarrelJSON} from './fixtures/flower-barrel.entity'; +writeFixture('flower-barrel.entity.json', flowerBarrelJSON()); +import {kittyJSON} from './fixtures/kitty.entity'; +writeFixture('kitty.entity.json', kittyJSON()); +import {mamaKittySpawnerJSON} from './fixtures/mama-kitty-spawner.entity'; +writeFixture('mama-kitty-spawner.entity.json', mamaKittySpawnerJSON()); +import {mamaKittyJSON} from './fixtures/mama-kitty.entity'; +writeFixture('mama-kitty.entity.json', mamaKittyJSON()); +// Write rooms. +import {kittyFireJSON} from './fixtures/kitty-fire.room'; +writeFixture('kitty-fire.room.json', kittyFireJSON()); diff --git a/server/create-server-room.js b/server/create-server-room.js deleted file mode 100644 index 70e8586..0000000 --- a/server/create-server-room.js +++ /dev/null @@ -1,563 +0,0 @@ -import fs from 'fs'; -import path from 'path'; - -import {buildInvoke, buildTraversal} from '@avocado/behavior'; -import {Vector} from '@avocado/math'; -import {World} from '@avocado/physics/matter/world'; -import {Room} from '@avocado/topdown'; - -import {AFFINITY_FIRE} from '../common/combat/constants'; - -// Behaviors! -const move = buildInvoke(['entity', 'moveFor'], [ - buildInvoke(['global', 'randomNumber'], [0.25, 2.5, false]) -]); - -const stopAnimating = buildTraversal( - ['entity', 'isAnimating'], - false -); - -const firstWait = buildInvoke(['global', 'wait'], [ - buildInvoke(['global', 'randomNumber'], [1, 4, false]) -]); - -const turn = buildTraversal( - ['entity', 'direction'], - buildInvoke(['global', 'randomNumber'], [0, 3]) -); - -const secondWait = buildInvoke(['global', 'wait'], [ - buildInvoke(['global', 'randomNumber'], [0.5, 3, false]) -]); - -const startAnimating = buildTraversal( - ['entity', 'isAnimating'], - true -); - -// A fire. -function fireJSON(position) { - return { - traits: { - animated: { - params: { - animations: { - idle: { - jitter: 0.1, - offset: [0, 0], - uri: '/fire.animation.json', - }, - } - }, - }, - audible: { - params: { - sounds: { - fire: { - uri: '/fire.sound.json', - }, - } - } - }, - collider: { - params: { - isSensor: true, - }, - }, - damaging: { - params: { - damagingSound: 'fire', - damageSpecs: [ - { - affinity: AFFINITY_FIRE, - lock: 0.45, - power: 15, - variance: 0.25, - }, - ], - }, - }, - darkened: { - params: { - isDarkened: false, - }, - }, - existent: { - state: { - name: 'Fire', - }, - }, - layered: {}, - listed: {}, - physical: {}, - positioned: { - state: { - x: position[0], - y: position[1], - }, - }, - roomed: {}, - shaped: { - params: { - shape: { - type: 'rectangle', - position: [0, 0], - size: [16, 16], - }, - }, - }, - visible: { - params: { - filter: 'bloom', - }, - }, - }, - }; -} -// Healing fire! -function blueFireJSON(position) { - const json = fireJSON(position); - json.traits.animated.params.animations.idle.uri = '/blue-fire.animation.json'; - json.traits.existent.state.name = 'Blue fire'; - json.traits.damaging.params.damageSpecs[0].power = -15; - json.traits.audible.params.sounds.fire.uri = '/blue-fire.sound.json'; - return json; -} -// A flower barrel. -export function flowerBarrelJSON(position) { - return { - traits: { - alive: { - state: { - maxLife: 1000, - life: 1000, - }, - }, - collider: {}, - emitter: {}, - existent: { - state: { - name: 'Flower Barrel', - }, - }, - layered: {}, - listed: {}, - physical: {}, - pictured: { - params: { - images: { - initial: { - offset: [0, -8], - size: [32, 32], // Derive? - uri: '/flower-barrel.png', - }, - } - }, - }, - positioned: { - state: { - x: position[0], - y: position[1], - }, - }, - roomed: {}, - shaped: { - params: { - shape: { - type: 'rectangle', - position: [0, 0], - size: [20, 10], - }, - }, - }, - visible: {}, - vulnerable: {}, - }, - }; -} -// A kitteh. -function kittyJSON(position) { - return { - traits: { - alive: {}, - animated: { - params: { - animations: { - idle: { - offset: [0, -3], - uri: '/kitty.animation.json', - }, - } - }, - }, - audible: { - params: { - sounds: { - deathSound: { - uri: '/ded.sound.json', - }, - } - } - }, - behaved: { - params: { - routines: { - type: 'routines', - routines: { - initial: { - type: 'routine', - routine: { - type: 'actions', - traversals: [ - move, - stopAnimating, - firstWait, - turn, - secondWait, - startAnimating, - ], - } - }, - }, - }, - }, - }, - collider: {}, - directional: { - params: { - directionCount: 4, - }, - state: { - direction: 2, - }, - }, - emitter: {}, - existent: { - state: { - name: 'Kitty', - }, - }, - visible: { - state: { - visibleScale: [1, 1], - } - }, - layered: {}, - listed: {}, - mobile: { - state: { - speed: 40, - }, - }, - physical: {}, - positioned: { - state: { - x: position[0], - y: position[1], - }, - }, - roomed: {}, - shaped: { - params: { - shape: { - type: 'rectangle', - position: [0, 0], - size: [8, 4], - }, - }, - }, - vulnerable: {}, - }, - }; -} -// A MAMA kitteh. -function mamaKittyJSON(position) { - - const storeJSON = buildTraversal( - ['context', 'json'], - { - traits: { - positioned: { - state: {}, - }, - }, - }, - ); - - const setJSONX = buildTraversal( - ['context', 'json', 'traits', 'positioned', 'state', 'x'], - buildInvoke(['global', 'multiply'], [ - buildTraversal(['entity', 'x']), 4 - ]), - ); - - const setJSONY = buildTraversal( - ['context', 'json', 'traits', 'positioned', 'state', 'y'], - buildInvoke(['global', 'multiply'], [ - buildTraversal(['entity', 'y']), 4 - ]), - ); - - const spawn = buildInvoke(['entity', 'spawn'], [ - 'kitteh', - buildTraversal(['context', 'json']), - ]); - - const playDeathSound = buildInvoke(['entity', 'playSound'], [ - buildTraversal(['entity', 'deathSound']), - ]); - const squeeze = buildInvoke(['entity', 'transition'], [ - { - opacity: 0, - visibleScaleX: .3, - visibleScaleY: 3, - }, - 0.2, - ]); - const murderKitties = buildInvoke(['entity', 'killAllChildren']); - - const json = JSON.parse(JSON.stringify(kittyJSON(position))); - const {traits} = json; - traits.alive.params = { - deathActions: { - type: 'actions', - traversals: [ - playDeathSound, - murderKitties, - squeeze, - ], - }, - }; - traits.alive.state = { - life: 500, - maxLife: 500, - }; - traits.animated.params.animations.idle.offset = [0, -8]; - traits.behaved.params.routines.routines.initial.routine.traversals.push(...[ - storeJSON, - setJSONX, - setJSONY, - spawn, - ]); - traits.existent.state.name = 'Mama Kitty'; - traits.visible.state.visibleScale = [2, 2]; - traits.shaped.params.shape.size = [16, 8]; - traits.spawner = { - params: { - spawns: { - kitteh: { - uri: '/kitty.entity.json', - }, - }, - }, - state: { - maxSpawns: 10, - }, - }; - return json; -} -// Mama kitty spawner. -function mamaKittySpawnerJSON() { - - const storeJSON = buildTraversal( - ['context', 'json'], - { - traits: { - positioned: { - state: {}, - }, - }, - }, - ); - - const setJSONX = buildTraversal( - ['context', 'json', 'traits', 'positioned', 'state', 'x'], - buildInvoke(['global', 'multiply'], [ - buildInvoke(['global', 'randomNumber'], [100, roomSize[0] - 100]), 4 - ]), - ); - - const setJSONY = buildTraversal( - ['context', 'json', 'traits', 'positioned', 'state', 'y'], - buildInvoke(['global', 'multiply'], [ - buildInvoke(['global', 'randomNumber'], [100, roomSize[1] - 100]), 4 - ]), - ); - - const spawn = buildInvoke(['entity', 'spawn'], [ - 'mama', - buildTraversal(['context', 'json']), - ]); - - return { - traits: { - behaved: { - params: { - routines: { - type: 'routines', - routines: { - initial: { - type: 'routine', - routine: { - type: 'actions', - traversals: [ - storeJSON, - setJSONX, - setJSONY, - spawn, - ], - } - }, - }, - }, - }, - }, - existent: { - state: { - name: 'Mama spawner', - }, - }, - layered: {}, - listed: {}, - roomed: {}, - spawner: { - params: { - spawns: { - mama: { - uri: '/mama-kitty.entity.json', - }, - }, - }, - state: { - maxSpawns: 2, - }, - }, - }, - }; -} - -// Room. -const roomTileSize = [24, 24]; -const roomSize = Vector.mul([16, 16], roomTileSize); -const roomJSON = { - size: roomSize, - layers: [ - { - entities: [], - tiles: { - size: roomTileSize, - data: [ - 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, - 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, - 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, - 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, - 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, - 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, - 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, - 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, - 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, - 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, - 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, - 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, - 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, - 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, - 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, - 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, - 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, - 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, - 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, - 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, - 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, - 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, - 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, - 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, - 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, - 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, - 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, - 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, - 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, - 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, - ], - }, - tilesetUri: '/tileset.json', - }, - ], -}; - -const RESOURCE_PATH = path.resolve(process.cwd(), 'resource'); - -fs.writeFileSync( - path.join(RESOURCE_PATH, 'flower-barrel.entity.json'), - JSON.stringify(flowerBarrelJSON([0, 0])) -); - -fs.writeFileSync( - path.join(RESOURCE_PATH, 'kitty.entity.json'), - JSON.stringify(kittyJSON([0, 0])) -); - -fs.writeFileSync( - path.join(RESOURCE_PATH, 'mama-kitty.entity.json'), - JSON.stringify(mamaKittyJSON([0, 0])) -); - -fs.writeFileSync( - path.join(RESOURCE_PATH, 'mama-kitty-spawner.entity.json'), - JSON.stringify(mamaKittySpawnerJSON([0, 0])) -); - -fs.writeFileSync( - path.join(RESOURCE_PATH, 'fire.entity.json'), - JSON.stringify(fireJSON([0, 0])) -); - -fs.writeFileSync( - path.join(RESOURCE_PATH, 'blue-fire.entity.json'), - JSON.stringify(blueFireJSON([0, 0])) -); - -function positionedEntityJSON(uri, position) { - return { - uri, - traits: { - positioned: { - state: { - x: position[0] * 4, - y: position[1] * 4, - }, - }, - }, - }; -} - -function randomPosition() { - return [ - Math.floor(Math.random() * (roomSize[0] - 100)) + 50, - Math.floor(Math.random() * (roomSize[1] - 100)) + 50, - ]; -} - -function addEntityWithRandomPosition(uri) { - const position = randomPosition(); - roomJSON.layers[0].entities.push(positionedEntityJSON(uri, position)); -} - -for (let i = 0; i < 50; ++i) { - addEntityWithRandomPosition('/flower-barrel.entity.json'); -} -for (let i = 0; i < 5; ++i) { - addEntityWithRandomPosition('/mama-kitty-spawner.entity.json'); -} -for (let i = 0; i < 60; ++i) { - addEntityWithRandomPosition('/fire.entity.json'); -} -for (let i = 0; i < 5; ++i) { - addEntityWithRandomPosition('/blue-fire.entity.json'); -} - -export function createRoom() { - const room = new Room(roomJSON); - room.world = new World(); - return room; -} diff --git a/server/fixtures/blue-fire.entity.js b/server/fixtures/blue-fire.entity.js new file mode 100644 index 0000000..606ba22 --- /dev/null +++ b/server/fixtures/blue-fire.entity.js @@ -0,0 +1,13 @@ +import {buildInvoke, buildTraversal} from '@avocado/behavior'; + +import {fireJSON} from './fire.entity'; + +// Healing fire! +export function blueFireJSON() { + const json = fireJSON(); + json.traits.animated.params.animations.idle.uri = '/blue-fire.animation.json'; + json.traits.existent.state.name = 'Blue fire'; + json.traits.damaging.params.damageSpecs[0].power = -15; + json.traits.audible.params.sounds.fire.uri = '/blue-fire.sound.json'; + return json; +} diff --git a/server/fixtures/fire.entity.js b/server/fixtures/fire.entity.js new file mode 100644 index 0000000..5dbe811 --- /dev/null +++ b/server/fixtures/fire.entity.js @@ -0,0 +1,78 @@ +import {buildInvoke, buildTraversal} from '@avocado/behavior'; + +import {AFFINITY_FIRE} from '../../common/combat/constants'; + +// A fire. +export function fireJSON(position) { + return { + traits: { + animated: { + params: { + animations: { + idle: { + jitter: 0.1, + offset: [0, 0], + uri: '/fire.animation.json', + }, + } + }, + }, + audible: { + params: { + sounds: { + fire: { + uri: '/fire.sound.json', + }, + } + } + }, + collider: { + params: { + isSensor: true, + }, + }, + damaging: { + params: { + damagingSound: 'fire', + damageSpecs: [ + { + affinity: AFFINITY_FIRE, + lock: 0.45, + power: 15, + variance: 0.25, + }, + ], + }, + }, + darkened: { + params: { + isDarkened: false, + }, + }, + existent: { + state: { + name: 'Fire', + }, + }, + layered: {}, + listed: {}, + physical: {}, + positioned: {}, + roomed: {}, + shaped: { + params: { + shape: { + type: 'rectangle', + position: [0, 0], + size: [16, 16], + }, + }, + }, + visible: { + params: { + filter: 'bloom', + }, + }, + }, + }; +} diff --git a/server/fixtures/flower-barrel.entity.js b/server/fixtures/flower-barrel.entity.js new file mode 100644 index 0000000..3756262 --- /dev/null +++ b/server/fixtures/flower-barrel.entity.js @@ -0,0 +1,49 @@ +import {buildInvoke, buildTraversal} from '@avocado/behavior'; + +// A flower barrel. +export function flowerBarrelJSON() { + return { + traits: { + alive: { + state: { + maxLife: 1000, + life: 1000, + }, + }, + collider: {}, + emitter: {}, + existent: { + state: { + name: 'Flower Barrel', + }, + }, + layered: {}, + listed: {}, + physical: {}, + pictured: { + params: { + images: { + initial: { + offset: [0, -8], + size: [32, 32], // Derive? + uri: '/flower-barrel.png', + }, + } + }, + }, + positioned: {}, + roomed: {}, + shaped: { + params: { + shape: { + type: 'rectangle', + position: [0, 0], + size: [20, 10], + }, + }, + }, + visible: {}, + vulnerable: {}, + }, + }; +} diff --git a/server/fixtures/kitty-fire.room.js b/server/fixtures/kitty-fire.room.js new file mode 100644 index 0000000..85a7336 --- /dev/null +++ b/server/fixtures/kitty-fire.room.js @@ -0,0 +1,92 @@ +import {Vector} from '@avocado/math'; + +// Room. +export function kittyFireJSON() { + + const roomTileSize = [24, 24]; + const roomSize = Vector.mul([16, 16], roomTileSize); + const roomJSON = { + size: roomSize, + layers: [ + { + entities: [], + tiles: { + size: roomTileSize, + data: [ + 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, + 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, + 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, + 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, + 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, + 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, + 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, + 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, + 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, + 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, + 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, + 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, + 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, + 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, + 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, + 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, + 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, + 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, + 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, + 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, + 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, + 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, + 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, + 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, + 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, + 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, + 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, + 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, + 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, + 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, + ], + }, + tilesetUri: '/tileset.json', + }, + ], + }; + + function positionedEntityJSON(uri, position) { + return { + uri, + traits: { + positioned: { + state: { + x: position[0] * 4, + y: position[1] * 4, + }, + }, + }, + }; + } + + function randomPosition() { + return [ + Math.floor(Math.random() * (roomSize[0] - 100)) + 50, + Math.floor(Math.random() * (roomSize[1] - 100)) + 50, + ]; + } + + function addEntityWithRandomPosition(uri) { + const position = randomPosition(); + roomJSON.layers[0].entities.push(positionedEntityJSON(uri, position)); + } + + for (let i = 0; i < 50; ++i) { + addEntityWithRandomPosition('/flower-barrel.entity.json'); + } + for (let i = 0; i < 5; ++i) { + addEntityWithRandomPosition('/mama-kitty-spawner.entity.json'); + } + for (let i = 0; i < 60; ++i) { + addEntityWithRandomPosition('/fire.entity.json'); + } + for (let i = 0; i < 5; ++i) { + addEntityWithRandomPosition('/blue-fire.entity.json'); + } + return roomJSON; +} diff --git a/server/fixtures/kitty.entity.js b/server/fixtures/kitty.entity.js new file mode 100644 index 0000000..d55be22 --- /dev/null +++ b/server/fixtures/kitty.entity.js @@ -0,0 +1,119 @@ +import {buildInvoke, buildTraversal} from '@avocado/behavior'; + +// A kitteh. +export function kittyJSON() { + const move = buildInvoke(['entity', 'moveFor'], [ + buildInvoke(['global', 'randomNumber'], [0.25, 2.5, false]) + ]); + + const stopAnimating = buildTraversal( + ['entity', 'isAnimating'], + false + ); + + const firstWait = buildInvoke(['global', 'wait'], [ + buildInvoke(['global', 'randomNumber'], [1, 4, false]) + ]); + + const turn = buildTraversal( + ['entity', 'direction'], + buildInvoke(['global', 'randomNumber'], [0, 3]) + ); + + const secondWait = buildInvoke(['global', 'wait'], [ + buildInvoke(['global', 'randomNumber'], [0.5, 3, false]) + ]); + + const startAnimating = buildTraversal( + ['entity', 'isAnimating'], + true + ); + + return { + traits: { + alive: {}, + animated: { + params: { + animations: { + idle: { + offset: [0, -3], + uri: '/kitty.animation.json', + }, + } + }, + }, + audible: { + params: { + sounds: { + deathSound: { + uri: '/ded.sound.json', + }, + } + } + }, + behaved: { + params: { + routines: { + type: 'routines', + routines: { + initial: { + type: 'routine', + routine: { + type: 'actions', + traversals: [ + move, + stopAnimating, + firstWait, + turn, + secondWait, + startAnimating, + ], + } + }, + }, + }, + }, + }, + collider: {}, + directional: { + params: { + directionCount: 4, + }, + state: { + direction: 2, + }, + }, + emitter: {}, + existent: { + state: { + name: 'Kitty', + }, + }, + visible: { + state: { + visibleScale: [1, 1], + } + }, + layered: {}, + listed: {}, + mobile: { + state: { + speed: 40, + }, + }, + physical: {}, + positioned: {}, + roomed: {}, + shaped: { + params: { + shape: { + type: 'rectangle', + position: [0, 0], + size: [8, 4], + }, + }, + }, + vulnerable: {}, + }, + }; +} diff --git a/server/fixtures/mama-kitty-spawner.entity.js b/server/fixtures/mama-kitty-spawner.entity.js new file mode 100644 index 0000000..8797c3c --- /dev/null +++ b/server/fixtures/mama-kitty-spawner.entity.js @@ -0,0 +1,89 @@ +import {buildInvoke, buildTraversal} from '@avocado/behavior'; + +// Mama kitty spawner. +export function mamaKittySpawnerJSON() { + + const storeJSON = buildTraversal( + ['context', 'json'], + { + traits: { + positioned: { + state: {}, + }, + }, + }, + ); + + function setAxeFromRoom(roomAxe, entityAxe) { + return buildTraversal( + ['context', 'json', 'traits', 'positioned', 'state', entityAxe], + buildInvoke(['global', 'multiply'], [ + buildInvoke( + ['global', 'randomNumber'], + [ + 100, + buildInvoke( + ['global', 'sub'], + [ + buildTraversal(['entity', 'room', roomAxe]), + 100, + ], + ) + ], + ), + 4, + ]), + ); + } + + const spawn = buildInvoke(['entity', 'spawn'], [ + 'mama', + buildTraversal(['context', 'json']), + ]); + + return { + traits: { + behaved: { + params: { + routines: { + type: 'routines', + routines: { + initial: { + type: 'routine', + routine: { + type: 'actions', + traversals: [ + storeJSON, + setAxeFromRoom('width', 'x'), + setAxeFromRoom('height', 'y'), + spawn, + ], + } + }, + }, + }, + }, + }, + existent: { + state: { + name: 'Mama spawner', + }, + }, + layered: {}, + listed: {}, + roomed: {}, + spawner: { + params: { + spawns: { + mama: { + uri: '/mama-kitty.entity.json', + }, + }, + }, + state: { + maxSpawns: 2, + }, + }, + }, + }; +} diff --git a/server/fixtures/mama-kitty.entity.js b/server/fixtures/mama-kitty.entity.js new file mode 100644 index 0000000..5e94cc5 --- /dev/null +++ b/server/fixtures/mama-kitty.entity.js @@ -0,0 +1,90 @@ +import {buildInvoke, buildTraversal} from '@avocado/behavior'; + +import {kittyJSON} from './kitty.entity'; + +// A MAMA kitteh. +export function mamaKittyJSON() { + + const storeJSON = buildTraversal( + ['context', 'json'], + { + traits: { + positioned: { + state: {}, + }, + }, + }, + ); + + const setJSONX = buildTraversal( + ['context', 'json', 'traits', 'positioned', 'state', 'x'], + buildInvoke(['global', 'multiply'], [ + buildTraversal(['entity', 'x']), 4 + ]), + ); + + const setJSONY = buildTraversal( + ['context', 'json', 'traits', 'positioned', 'state', 'y'], + buildInvoke(['global', 'multiply'], [ + buildTraversal(['entity', 'y']), 4 + ]), + ); + + const spawn = buildInvoke(['entity', 'spawn'], [ + 'kitteh', + buildTraversal(['context', 'json']), + ]); + + const playDeathSound = buildInvoke(['entity', 'playSound'], [ + buildTraversal(['entity', 'deathSound']), + ]); + const squeeze = buildInvoke(['entity', 'transition'], [ + { + opacity: 0, + visibleScaleX: .3, + visibleScaleY: 3, + }, + 0.2, + ]); + const murderKitties = buildInvoke(['entity', 'killAllChildren']); + + const json = JSON.parse(JSON.stringify(kittyJSON())); + const {traits} = json; + traits.alive.params = { + deathActions: { + type: 'actions', + traversals: [ + playDeathSound, + murderKitties, + squeeze, + ], + }, + }; + traits.alive.state = { + life: 500, + maxLife: 500, + }; + traits.animated.params.animations.idle.offset = [0, -8]; + traits.behaved.params.routines.routines.initial.routine.traversals.push(...[ + storeJSON, + setJSONX, + setJSONY, + spawn, + ]); + traits.existent.state.name = 'Mama Kitty'; + traits.visible.state.visibleScale = [2, 2]; + traits.shaped.params.shape.size = [16, 8]; + traits.spawner = { + params: { + spawns: { + kitteh: { + uri: '/kitty.entity.json', + }, + }, + }, + state: { + maxSpawns: 10, + }, + }; + return json; +} diff --git a/server/index.js b/server/index.js index fb8a01f..db66f07 100644 --- a/server/index.js +++ b/server/index.js @@ -4,6 +4,8 @@ import http from 'http'; import {SocketServer} from '@avocado/net/server/socket'; // Import directly for HMR hierarchy. import 'register-traits'; +// Create fixtures. +import './create-fixtures'; // Start game server. import Game from './game'; const socketServer = new SocketServer(); @@ -13,22 +15,11 @@ let httpServer; import repl from 'repl'; -import {Entity} from '@avocado/entity'; -import {flowerBarrelJSON} from './create-server-room'; const instance = repl.start({ prompt: 'humus> ', input: process.stdin, output: process.stdout }); -instance.context.createBarrel = () => { - return (new Entity()).fromJSON(flowerBarrelJSON([400, 400])); -}; -instance.context.addEntityToRoom = (entity) => { - game.room.addEntityToLayer(entity, 'everything'); -}; -instance.context.ab = () => { - instance.context.addEntityToRoom(instance.context.createBarrel()); -} function createGame() { game = new Game();