A hackable template for creating small and fast browser games.
1import {pointer_clicked} from "../../lib/input.js";
2import {Entity} from "../../lib/world.js";
3import {SelectedState} from "../components/com_selectable.js";
4import {Game} from "../game.js";
5import {Has} from "../world.js";
6
7const QUERY = Has.Transform | Has.Selectable | Has.Children;
8
9export function sys_select(game: Game, delta: number) {
10 for (let i = 0; i < game.World.Signature.length; i++) {
11 if ((game.World.Signature[i] & QUERY) == QUERY) {
12 update(game, i);
13 }
14 }
15
16 game.Selected = undefined;
17 for (let i = 0; i < game.World.Signature.length; i++) {
18 if ((game.World.Signature[i] & QUERY) == QUERY) {
19 let selectable = game.World.Selectable[i];
20 if (selectable.Selected) {
21 game.Selected = i;
22 }
23 }
24 }
25}
26
27function update(game: Game, entity: Entity) {
28 let selectable = game.World.Selectable[entity];
29
30 if (selectable.Selected === SelectedState.ThisFrame) {
31 selectable.Selected = SelectedState.Currently;
32 }
33
34 if (pointer_clicked(game, 0, 0)) {
35 // When the user left-clicks…
36
37 if (game.Picked?.Entity === entity) {
38 if (selectable.Selected === SelectedState.None) {
39 // …select.
40 selectable.Selected = SelectedState.ThisFrame;
41 game.World.Signature[entity] |= Has.ControlPlayer;
42 }
43 } else if (selectable.Selected > SelectedState.None) {
44 // …deselect.
45 selectable.Selected = SelectedState.None;
46 game.World.Signature[entity] &= ~Has.ControlPlayer;
47 }
48 } else if (pointer_clicked(game, 2, 1)) {
49 // When the user right-clicks…
50
51 if (selectable.Selected > SelectedState.None) {
52 // …deselect.
53 selectable.Selected = SelectedState.None;
54 game.World.Signature[entity] &= ~Has.ControlPlayer;
55 }
56 }
57}