256 lines
7.2 KiB
JavaScript
256 lines
7.2 KiB
JavaScript
import {World} from '@avocado/physics/matter/world';
|
|
import {Room} from '@avocado/topdown';
|
|
// A flower barrel.
|
|
function flowerBarrelJSON(position) {
|
|
return {
|
|
traits: {
|
|
collider: {},
|
|
existent: {},
|
|
visible: {},
|
|
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],
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
}
|
|
// A kitteh.
|
|
function kittyJSON(position) {
|
|
const buildRandom = (min, max, floor = true) => {
|
|
return {
|
|
type: 'traversal',
|
|
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: {
|
|
animated: {
|
|
params: {
|
|
animations: {
|
|
idle: {
|
|
offset: [0, -3],
|
|
uri: '/kitty.animation.json',
|
|
},
|
|
}
|
|
},
|
|
},
|
|
behaved: {
|
|
params: {
|
|
routines: {
|
|
initial: {
|
|
actions: [
|
|
{
|
|
type: 'action',
|
|
steps: [
|
|
{
|
|
type: 'key',
|
|
key: 'entity',
|
|
},
|
|
{
|
|
type: 'key',
|
|
key: 'moveFor',
|
|
},
|
|
{
|
|
type: 'invoke',
|
|
args: [
|
|
buildRandom(0.25, 1, false),
|
|
],
|
|
},
|
|
],
|
|
},
|
|
{
|
|
type: 'action',
|
|
steps: [
|
|
{
|
|
type: 'key',
|
|
key: 'global',
|
|
},
|
|
{
|
|
type: 'key',
|
|
key: 'wait',
|
|
},
|
|
{
|
|
type: 'invoke',
|
|
args: [
|
|
buildRandom(1, 4),
|
|
],
|
|
},
|
|
],
|
|
},
|
|
{
|
|
type: 'action',
|
|
steps: [
|
|
{
|
|
type: 'key',
|
|
key: 'entity',
|
|
},
|
|
{
|
|
type: 'key',
|
|
key: 'direction',
|
|
},
|
|
],
|
|
value: buildRandom(0, 3),
|
|
},
|
|
{
|
|
type: 'action',
|
|
steps: [
|
|
{
|
|
type: 'key',
|
|
key: 'global',
|
|
},
|
|
{
|
|
type: 'key',
|
|
key: 'wait',
|
|
},
|
|
{
|
|
type: 'invoke',
|
|
args: [
|
|
buildRandom(0.5, 3),
|
|
],
|
|
},
|
|
],
|
|
},
|
|
],
|
|
},
|
|
},
|
|
},
|
|
},
|
|
collider: {},
|
|
directional: {
|
|
params: {
|
|
directionCount: 4,
|
|
},
|
|
state: {
|
|
direction: 2,
|
|
},
|
|
},
|
|
existent: {},
|
|
visible: {},
|
|
mobile: {
|
|
state: {
|
|
speed: 40,
|
|
},
|
|
},
|
|
physical: {},
|
|
positioned: {
|
|
state: {
|
|
x: position[0],
|
|
y: position[1],
|
|
},
|
|
},
|
|
shaped: {
|
|
params: {
|
|
shape: {
|
|
type: 'rectangle',
|
|
position: [0, 0],
|
|
size: [8, 4],
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
}
|
|
// 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 < 4; ++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 < 40; ++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]));
|
|
}
|
|
export function createRoom() {
|
|
const room = (new Room()).fromJSON(roomJSON);
|
|
room.world = new World();
|
|
return room;
|
|
}
|