Crops !
This commit is contained in:
@@ -0,0 +1,52 @@
|
||||
import { System } from "$/common/ecs/mod.ts";
|
||||
import { Position } from "$/common/components/position.ts";
|
||||
import { Sprite } from "../components/sprite.ts";
|
||||
import { ClientWorld } from "../client_world.ts";
|
||||
import { ClickableSprite } from "../components/clickable.ts";
|
||||
import { point_inside_rec } from "$/common/utils.ts";
|
||||
import { InputManager } from "../input_manager.ts";
|
||||
import { Camera, screen_to_world } from "../components/camera.ts";
|
||||
|
||||
export class ClickableSystem extends System {
|
||||
update(world: ClientWorld, _delta: number): void {
|
||||
const [player] = world.get_tag("player")!;
|
||||
const camera = player.get(Camera)!;
|
||||
|
||||
const mouse = InputManager.get_mouse_position();
|
||||
|
||||
const world_mouse = screen_to_world(
|
||||
mouse.x,
|
||||
mouse.y,
|
||||
camera,
|
||||
world.canvas.width,
|
||||
world.canvas.height,
|
||||
);
|
||||
|
||||
for (const entity of world.get_entities()) {
|
||||
const position = entity.get(Position);
|
||||
|
||||
if (!position) {
|
||||
continue;
|
||||
}
|
||||
|
||||
const clickable_sprite = entity.get(ClickableSprite);
|
||||
const sprite = entity.get(Sprite);
|
||||
|
||||
if (clickable_sprite && sprite) {
|
||||
clickable_sprite.clicked = false;
|
||||
const hovered = point_inside_rec(
|
||||
world_mouse.x,
|
||||
world_mouse.y,
|
||||
position.x,
|
||||
position.y,
|
||||
sprite.width,
|
||||
sprite.height,
|
||||
);
|
||||
if (hovered && InputManager.is_mouse_pressed(clickable_sprite.button)) {
|
||||
InputManager.consume_mouse(clickable_sprite.button);
|
||||
clickable_sprite.clicked = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,45 @@
|
||||
import { System } from "$/common/ecs/mod.ts";
|
||||
import { Sprite } from "../components/sprite.ts";
|
||||
import { ClientWorld } from "../client_world.ts";
|
||||
import { Crop } from "$/client/components/crop.ts";
|
||||
import { get_sprite_region } from "$/common/utils.ts";
|
||||
import { ClickableSprite } from "../components/clickable.ts";
|
||||
import { ItemStack, PlayerInventory } from "../components/inventory.ts";
|
||||
|
||||
export class CropSystem extends System {
|
||||
update(world: ClientWorld, delta: number): void {
|
||||
for (const entity of world.get_entities()) {
|
||||
const crop = entity.get(Crop);
|
||||
|
||||
if (!crop) {
|
||||
continue;
|
||||
}
|
||||
|
||||
// finished growing, very good
|
||||
if (crop.total_stages === crop.current_stage + 1) {
|
||||
const clickable_sprite = entity.get(ClickableSprite);
|
||||
if (clickable_sprite && clickable_sprite.clicked) {
|
||||
const [player] = world.get_tag("player")!;
|
||||
const inventory = player.get(PlayerInventory)!;
|
||||
inventory.container.add_item(new ItemStack(crop.item_drop));
|
||||
world.delete_entity(entity);
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
crop.growth_time += delta;
|
||||
if (crop.growth_time >= crop.time_to_grow[crop.current_stage]) {
|
||||
crop.current_stage += 1;
|
||||
crop.growth_time = 0;
|
||||
}
|
||||
|
||||
const sprite = entity.get(Sprite);
|
||||
|
||||
if (sprite) {
|
||||
const region = get_sprite_region(crop.sprite_ids[crop.current_stage]);
|
||||
sprite.source_x = region.x * 16;
|
||||
sprite.source_y = region.y * 16;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user