94 lines
2.2 KiB
JavaScript
94 lines
2.2 KiB
JavaScript
const {Direction, Position, Wielder} = wielder
|
|
const projected = Wielder.activeItem()?.project(Position.tile, Direction.quantize(4))
|
|
if (projected?.length > 0) {
|
|
const {Controlled, Emitter, Sound, Sprite} = wielder
|
|
const {TileLayers} = ecs.get(1)
|
|
const layer = TileLayers.layer(0)
|
|
|
|
Controlled.locked = 1;
|
|
const [, direction] = Sprite.animation.split(':')
|
|
|
|
const plant = {
|
|
Collider: {
|
|
bodies: [
|
|
{
|
|
points: [
|
|
{x: -8, y: -8},
|
|
{x: 7, y: -8},
|
|
{x: -8, y: 7},
|
|
{x: 7, y: 7},
|
|
],
|
|
},
|
|
],
|
|
},
|
|
Interactive: {
|
|
interactScript: '/resources/tomato-plant/interact.js',
|
|
},
|
|
Plant: {
|
|
growScript: '/resources/tomato-plant/grow.js',
|
|
mayGrowScript: '/resources/tomato-plant/may-grow.js',
|
|
stages: [0.5, 0.5, 0.5, 0.5, 0.5],
|
|
},
|
|
Sprite: {
|
|
anchorY: 0.75,
|
|
animation: 'stage/0',
|
|
source: '/resources/tomato-plant/tomato-plant.json',
|
|
},
|
|
Ticking: {},
|
|
VisibleAabb: {},
|
|
};
|
|
|
|
Emitter.emit({
|
|
count: 25,
|
|
frequency: 0.01,
|
|
shape: {
|
|
type: 'filledRect',
|
|
payload: {width: 16, height: 16},
|
|
},
|
|
entity: {
|
|
Forces: {forceY: -100},
|
|
Position: {
|
|
x: Position.x,
|
|
y: Position.y,
|
|
},
|
|
Sprite: {
|
|
scaleX: 0.125,
|
|
scaleY: 0.125,
|
|
tint: 0x221100,
|
|
},
|
|
Ttl: {ttl: 0.25},
|
|
}
|
|
});
|
|
|
|
Sound.play('/resources/sow.wav');
|
|
Sprite.animation = ['moving', direction].join(':');
|
|
|
|
const directionMap = {0: 'right', 1: 'down', 2: 'left', 3: 'up'};
|
|
for (let i = 0; i < 6; ++i) {
|
|
Direction.direction = Math.HALF_PI * Math.floor(Math.random() * 4);
|
|
Sprite.animation = ['moving', directionMap[Direction.quantize(4)]].join(':');
|
|
await wait(0.125);
|
|
}
|
|
|
|
Sprite.animation = ['idle', direction].join(':');
|
|
|
|
const promises = [];
|
|
for (const {x, y} of projected) {
|
|
promises.push(ecs.create({
|
|
...plant,
|
|
Plant: {
|
|
...plant.Plant,
|
|
growthFactor: Math.floor(Math.random() * 256),
|
|
},
|
|
Position: {
|
|
x: x * layer.tileSize.x + (0.5 * layer.tileSize.x),
|
|
y: y * layer.tileSize.y + (0.5 * layer.tileSize.y),
|
|
},
|
|
}))
|
|
}
|
|
await Promise.all(promises)
|
|
|
|
Controlled.locked = 0;
|
|
|
|
}
|