import {World} from '@avocado/physics/matter/world'; import {Room} from '@avocado/topdown'; // A fire. function fireJSON(position) { return { traits: { audible: { params: { sounds: { fire: { src: '/fire.wav', volume: 0.05, }, } } }, collider: { params: { isSensor: true, }, }, damaging: { params: { damagingSound: 'fire', damageSpecs: [ { affinity: 'fire', lock: 0.15, power: 5, variance: 0.25, }, ], }, }, existent: {}, visible: { state: { zIndex: -1, }, }, physical: {}, pictured: { params: { images: { initial: { offset: [0, 0], size: [16, 16], // Derive? uri: '/fire.png', }, } }, }, positioned: { state: { x: position[0], y: position[1], }, }, shaped: { params: { shape: { type: 'rectangle', position: [0, 0], size: [16, 16], }, }, }, }, }; } // A flower barrel. function flowerBarrelJSON(position) { return { traits: { alive: { state: { maxLife: 1000, life: 1000, }, }, collider: {}, emitter: {}, existent: {}, physical: {}, pictured: { params: { images: { initial: { offset: [0, -8], size: [32, 32], // Derive? uri: '/flower-barrel.png', }, } }, }, positioned: { state: { x: position[0], y: position[1], }, }, shaped: { params: { shape: { type: 'rectangle', position: [0, 0], size: [20, 10], }, }, }, visible: {}, vulnerable: {}, }, }; } // A kitteh. function kittyJSON(position) { const buildRandom = (min, max, floor = true) => { return { type: 'traversal', hash: 1, steps: [ { type: 'key', key: 'global', }, { type: 'key', key: 'randomNumber', }, { type: 'invoke', args: [ { type: 'literal', value: min, }, { type: 'literal', value: max, }, { type: 'literal', value: floor, }, ], }, ], }; } return { traits: { alive: {}, animated: { params: { animations: { idle: { offset: [0, -6], uri: '/kitty.animation.json', }, } }, }, audible: { params: { sounds: { deathSound: { src: '/ded.wav', volume: 0.1, }, } } }, behaved: { params: { routines: { type: 'routines', routines: { initial: { type: 'routine', routine: { type: 'actions', traversals: [ { type: 'action', hash: 2, steps: [ { type: 'key', key: 'entity', }, { type: 'key', key: 'moveFor', }, { type: 'invoke', args: [ buildRandom(0.25, 1, false), ], }, ], }, { type: 'action', hash: 3, steps: [ { type: 'key', key: 'global', }, { type: 'key', key: 'wait', }, { type: 'invoke', args: [ buildRandom(1, 4), ], }, ], }, { type: 'action', hash: 4, steps: [ { type: 'key', key: 'entity', }, { type: 'key', key: 'direction', }, ], value: buildRandom(0, 3), }, { type: 'action', hash: 5, steps: [ { type: 'key', key: 'global', }, { type: 'key', key: 'wait', }, { type: 'invoke', args: [ buildRandom(0.5, 3), ], }, ], }, ], } }, }, }, }, }, collider: {}, directional: { params: { directionCount: 4, }, state: { direction: 2, }, }, emitter: {}, existent: {}, visible: { state: { visibleScale: [1.5, 1.5], } }, mobile: { state: { speed: 40, }, }, physical: {}, positioned: { state: { x: position[0], y: position[1], }, }, shaped: { params: { shape: { type: 'rectangle', position: [0, 0], size: [12, 6], }, }, }, vulnerable: {}, }, }; } // Room. const roomJSON = { size: [384, 384], layers: { everything: { entities: [], 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, 5 , 6 , 7 , 8 , 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 21 , 22 , 23 , 24 , 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 261, 262, 263, 264, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 277, 278, 279, 280, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1 , 2 , 3 , 4 , 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1 , 2 , 3 , 4 , 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1 , 2 , 3 , 4 , 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1 , 2 , 3 , 4 , 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1 , 2 , 3 , 4 , 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1 , 2 , 3 , 4 , 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1 , 2 , 3 , 4 , 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1 , 2 , 3 , 4 , 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1 , 2 , 3 , 4 , 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1 , 2 , 3 , 4 , 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1 , 2 , 3 , 4 , 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1 , 2 , 3 , 4 , 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1 , 2 , 3 , 4 , 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1 , 2 , 3 , 4 , 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 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', }, }, }; for (let i = 0; i < 20; ++i) { const x = Math.floor(Math.random() * 284) + 50; const y = Math.floor(Math.random() * 284) + 50; roomJSON.layers.everything.entities.push(flowerBarrelJSON([x * 4, y * 4])); } for (let i = 0; i < 50; ++i) { const x = Math.floor(Math.random() * 284) + 50; const y = Math.floor(Math.random() * 284) + 50; roomJSON.layers.everything.entities.push(kittyJSON([x * 4, y * 4])); } for (let i = 0; i < 15; ++i) { const x = Math.floor(Math.random() * 284) + 50; const y = Math.floor(Math.random() * 284) + 50; roomJSON.layers.everything.entities.push(fireJSON([x * 4, y * 4])); } export function createRoom() { const room = (new Room()).fromJSON(roomJSON); room.world = new World(); return room; }