Crops !
This commit is contained in:
@@ -1,45 +0,0 @@
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -4,14 +4,24 @@ import { Dimension } from "../components/dimension.ts";
|
||||
import { Camera, screen_to_world } from "../components/camera.ts";
|
||||
import { InputManager } from "../input_manager.ts";
|
||||
import { canvas } from "../renderer.ts";
|
||||
import { TILE_SIZE } from "$/common/constants.ts";
|
||||
import { TICK_DELTA, TILE_SIZE } from "$/common/constants.ts";
|
||||
import { EverythingRegistry, TileRegistry } from "$/common/everything_registry.ts";
|
||||
|
||||
export class DimensionLogicSystem extends System {
|
||||
update(world: ClientWorld, _delta: number): void {
|
||||
update(world: ClientWorld, delta: number): void {
|
||||
const dimension_entity = world.get_entities().values().find((ent) => ent.get(Dimension));
|
||||
const dimension = dimension_entity!.get(Dimension)!;
|
||||
|
||||
dimension.second_timer += delta;
|
||||
dimension.tick_timer += delta;
|
||||
|
||||
if (dimension.second_timer >= 1) {
|
||||
this.handle_second(world, dimension);
|
||||
}
|
||||
if (dimension.tick_timer >= TICK_DELTA) {
|
||||
this.handle_tick(world, dimension);
|
||||
}
|
||||
|
||||
const [player] = world.get_tag("player")!;
|
||||
const camera = player.get(Camera)!;
|
||||
|
||||
@@ -48,32 +58,26 @@ export class DimensionLogicSystem extends System {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*for (const tile of dimension.tiles) {
|
||||
const tile_info = EverythingRegistry.get<TileRegistry>("tiles", tile.id);
|
||||
if (!tile_info) {
|
||||
continue;
|
||||
}
|
||||
handle_second(world: ClientWorld, dimension: Dimension) {
|
||||
const tickables = dimension.tiles.filter((t) => t.tickable);
|
||||
for (const tickable of tickables) {
|
||||
const tile_info = EverythingRegistry.get<TileRegistry>("tiles", tickable.id);
|
||||
if (tile_info && tile_info.on_second) {
|
||||
tile_info.on_second(world, tickable, dimension.second_timer);
|
||||
}
|
||||
}
|
||||
dimension.second_timer = 0;
|
||||
}
|
||||
|
||||
if (tile_info.on_interact || tile_info.on_click) {
|
||||
console.log(tile_info);
|
||||
const hovered = point_inside_rec(
|
||||
world_mouse.x,
|
||||
world_mouse.y,
|
||||
tile.x * TILE_SIZE,
|
||||
tile.y * TILE_SIZE,
|
||||
TILE_SIZE,
|
||||
TILE_SIZE,
|
||||
);
|
||||
if (tile_info.on_interact && hovered && InputManager.is_mouse_pressed(2)) {
|
||||
InputManager.consume_mouse(2);
|
||||
tile_info.on_interact(world, tile);
|
||||
}
|
||||
if (tile_info.on_click && hovered && InputManager.is_mouse_pressed(0)) {
|
||||
InputManager.consume_mouse(0);
|
||||
tile_info.on_click(world, tile);
|
||||
}
|
||||
handle_tick(world: ClientWorld, dimension: Dimension) {
|
||||
const tickables = dimension.tiles.filter((t) => t.tickable);
|
||||
for (const tickable of tickables) {
|
||||
const tile_info = EverythingRegistry.get<TileRegistry>("tiles", tickable.id);
|
||||
if (tile_info && tile_info.on_tick) {
|
||||
tile_info.on_tick(world, tickable, dimension.tick_timer);
|
||||
}
|
||||
}*/
|
||||
}
|
||||
dimension.tick_timer = 0;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,11 +3,10 @@ import { Dimension } from "$/client/components/dimension.ts";
|
||||
import { TEXTURE_SIZE, TILE_SIZE } from "$/common/constants.ts";
|
||||
import { Camera, world_to_screen } from "$/client/components/camera.ts";
|
||||
import { canvas, draw_texture_region } from "$/client/renderer.ts";
|
||||
import { EverythingRegistry, TileRegistry } from "$/common/everything_registry.ts";
|
||||
|
||||
export function render_dimension(dimension: Dimension, camera: Camera) {
|
||||
for (const tile of dimension.tiles) {
|
||||
const region = get_sprite_region(tile.id);
|
||||
|
||||
const x = tile.x * TILE_SIZE;
|
||||
const y = tile.y * TILE_SIZE;
|
||||
|
||||
@@ -19,6 +18,18 @@ export function render_dimension(dimension: Dimension, camera: Camera) {
|
||||
continue;
|
||||
}
|
||||
|
||||
let texture_id = tile.id;
|
||||
const tile_info = EverythingRegistry.get<TileRegistry>("tiles", tile.id);
|
||||
if (tile_info?.texture_id) {
|
||||
if (typeof tile_info.texture_id === "string") {
|
||||
texture_id = tile_info.texture_id;
|
||||
} else {
|
||||
texture_id = tile_info.texture_id(tile);
|
||||
}
|
||||
}
|
||||
|
||||
const region = get_sprite_region(texture_id);
|
||||
|
||||
draw_texture_region(
|
||||
dimension.image,
|
||||
region.x * TEXTURE_SIZE,
|
||||
|
||||
Reference in New Issue
Block a user