benjivers/val Public Public: anyone can read this; the crew can change it.

Files a07c6a614323699908d79cb29213e15bff012908
124 lines · 3.0 KB · ~882 tok Raw History
1
/**
2
 * The shape of a match. Types only, so the ability module and the match loop
3
 * can both speak about a player without importing each other.
4
 */
5
6
import type { Point, Site } from "./map.ts";
7
import type { WeaponId } from "./weapons.ts";
8
9
export type Side = "atk" | "def";
10
export type Slot = "c" | "q" | "e" | "x";
11
export type Team = "red" | "blue";
12
13
export type Phase = "buy" | "live" | "end" | "over";
14
15
export type ZoneKind = "smoke" | "molly" | "wall" | "trip" | "dart" | "flash" | "heal";
16
17
/** Anything an ability leaves on the map, with a clock on it. */
18
export type Zone = {
19
  id: number;
20
  kind: ZoneKind;
21
  owner: string;
22
  side: Side;
23
  x: number;
24
  y: number;
25
  r: number;
26
  /** Seconds of life left. */
27
  life: number;
28
  /** Seconds before it goes off (a flash in the air, a trip arming). */
29
  fuse: number;
30
  /** Seconds to the next damage tick or recon pulse. */
31
  beat: number;
32
  pulses: number;
33
  damage: number;
34
  /** Blocks line of sight (smoke, wall). */
35
  blocks: boolean;
36
  /** Blocks movement (wall). */
37
  solid: boolean;
38
};
39
40
export type Input = {
41
  mx: number;
42
  my: number;
43
  angle: number;
44
  fire: boolean;
45
  /** Plant, defuse, pick the spike up: one key for all of it. */
46
  use: boolean;
47
  reload: boolean;
48
  cast: Slot | null;
49
};
50
51
export const emptyInput = (): Input => ({
52
  mx: 0,
53
  my: 0,
54
  angle: 0,
55
  fire: false,
56
  use: false,
57
  reload: false,
58
  cast: null,
59
});
60
61
export type Player = {
62
  id: string;
63
  name: string;
64
  bot: boolean;
65
  agent: string;
66
  team: Team;
67
  side: Side;
68
  x: number;
69
  y: number;
70
  angle: number;
71
  hp: number;
72
  armour: number;
73
  alive: boolean;
74
  credits: number;
75
  weapon: WeaponId;
76
  /** Kept through a round they survived, reset to the Classic when they die. */
77
  ammo: number;
78
  reloadIn: number;
79
  fireIn: number;
80
  /** Basic charges bought this round, and signature/ult readiness. */
81
  charges: Record<Slot, number>;
82
  cooldown: Record<Slot, number>;
83
  ult: number;
84
  blind: number;
85
  slow: number;
86
  haste: number;
87
  /** Seconds this player stays visible to the other team however dark it is. */
88
  revealed: number;
89
  spike: boolean;
90
  planting: number;
91
  defusing: number;
92
  kills: number;
93
  deaths: number;
94
  assists: number;
95
  damageDone: number;
96
  input: Input;
97
  /** Bot scratch space: where it is walking and when it last thought. */
98
  goal: Point | null;
99
  think: number;
100
  spray: number;
101
  joinedAt: number;
102
};
103
104
export type MatchState = {
105
  id: string;
106
  phase: Phase;
107
  /** Seconds left in the phase. */
108
  clock: number;
109
  round: number;
110
  score: Record<Team, number>;
111
  /** Which team attacks this round. */
112
  attackers: Team;
113
  lossStreak: Record<Team, number>;
114
  players: Player[];
115
  zones: Zone[];
116
  nextZone: number;
117
  spike: { carried: string | null; x: number; y: number; planted: boolean; fuse: number; site: Site | null; defuse: number; checkpoint: number };
118
  orbs: { x: number; y: number; taken: boolean }[];
119
  shots: { x1: number; y1: number; x2: number; y2: number; hit: boolean; age: number }[];
120
  events: { text: string; age: number }[];
121
  result: string | null;
122
  seed: number;
123
  now: number;
124
};
↑↓ navigate ↵ open esc close
↑↓ navigate ↵ open esc close

Keyboard shortcuts