import { System } from "$/common/ecs/mod.ts"; import { ClientWorld } from "../client_world.ts"; 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 { 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 { 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)!; const mouse = InputManager.get_mouse_position(); const world_mouse = screen_to_world( mouse.x, mouse.y, camera, canvas.width, canvas.height, ); const tile_x = Math.floor(world_mouse.x / TILE_SIZE); const tile_y = Math.floor(world_mouse.y / TILE_SIZE); const tile = dimension.tiles.findLast((tile) => tile.x === tile_x && tile.y === tile_y); if (tile) { const tile_info = EverythingRegistry.get("tiles", tile.id); if (!tile_info) { return; } if (tile_info.on_interact || tile_info.on_click) { if (tile_info.on_interact && InputManager.is_mouse_pressed(2)) { InputManager.consume_mouse(2); tile_info.on_interact(world, tile); } if (tile_info.on_click && InputManager.is_mouse_pressed(0)) { InputManager.consume_mouse(0); tile_info.on_click(world, tile); } } } } handle_second(world: ClientWorld, dimension: Dimension) { const tickables = dimension.tiles.filter((t) => t.tickable); for (const tickable of tickables) { const tile_info = EverythingRegistry.get("tiles", tickable.id); if (tile_info && tile_info.on_second) { tile_info.on_second(world, tickable, dimension.second_timer); } } dimension.second_timer = 0; } handle_tick(world: ClientWorld, dimension: Dimension) { const tickables = dimension.tiles.filter((t) => t.tickable); for (const tickable of tickables) { const tile_info = EverythingRegistry.get("tiles", tickable.id); if (tile_info && tile_info.on_tick) { tile_info.on_tick(world, tickable, dimension.tick_timer); } } dimension.tick_timer = 0; } }