{"version":3,"sources":["ts/utils/flow-control.ts","../node_modules/@game.object/ts-game-toolbox/src/trees/exceptions/TreeElementNotFoundException.ts","../node_modules/@game.object/ts-game-toolbox/src/geometries/Vector2.ts","../node_modules/@game.object/ts-game-toolbox/src/geometries/Rect.ts","../node_modules/@game.object/ts-game-toolbox/src/trees/QuadTree.ts","ts/Game.ts","ts/index.ts"],"names":[],"mappings":"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","file":"ts.19a6dd6f.js","sourceRoot":"..\\src","sourcesContent":["export function throw_expression(message: string = \"\"): never {\r\n throw new Error(message);\r\n}","export class TreeElementNotFoundException extends Error {\r\n constructor(message?: string) {\r\n super(message);\r\n this.name = TreeElementNotFoundException.name;\r\n Object.setPrototypeOf(this, TreeElementNotFoundException.prototype);\r\n }\r\n}","type radians = number;\r\ntype degrees = number;\r\n\r\nexport interface Vector2I {\r\n x: number;\r\n y: number;\r\n}\r\n\r\nexport class Vector2 {\r\n public x: number;\r\n public y: number;\r\n\r\n public constructor(vec: Readonly)\r\n public constructor(x?: number, y?: number)\r\n public constructor(x: number | Readonly = 0, y: number = 0) {\r\n if (typeof x === \"object\") {\r\n this.x = x.x;\r\n this.y = x.y;\r\n } else {\r\n this.x = x;\r\n this.y = y;\r\n }\r\n }\r\n\r\n public set(vec: Readonly): this\r\n public set(x: number, y: number): this\r\n public set(x: number | Readonly, y: number = 0): this {\r\n if (typeof x === \"object\") {\r\n this.x = x.x;\r\n this.y = x.y;\r\n } else {\r\n this.x = x;\r\n this.y = y;\r\n }\r\n return this;\r\n }\r\n\r\n public sub(other: Vector2I): this {\r\n this.x -= other.x;\r\n this.y -= other.y;\r\n return this;\r\n }\r\n\r\n public add(other: Vector2I): this {\r\n this.x += other.x;\r\n this.y += other.y;\r\n return this;\r\n }\r\n\r\n public mul(scalar: number): this {\r\n this.x *= scalar;\r\n this.y *= scalar;\r\n return this;\r\n }\r\n\r\n public divide(scalar: number): this {\r\n this.x /= scalar;\r\n this.y /= scalar;\r\n return this;\r\n }\r\n\r\n public len2(): number {\r\n return this.x * this.x + this.y * this.y;\r\n }\r\n\r\n public len(): number {\r\n return Math.sqrt(this.len2());\r\n }\r\n\r\n public set_magnitude(magnitude: number): this {\r\n const len = this.len();\r\n this.x = this.x / len * magnitude;\r\n this.y = this.y / len * magnitude;\r\n return this;\r\n }\r\n\r\n public dot(other: Vector2I): number {\r\n return this.x * other.x + this.y * other.y;\r\n }\r\n\r\n public cross(other: Vector2I): Vector2 {\r\n return new Vector2(this.x * other.y, this.y * other.x);\r\n }\r\n\r\n public get_unsigned(): Vector2 {\r\n return new Vector2(Math.abs(this.x), Math.abs(this.y));\r\n }\r\n\r\n public cpy(): Vector2 {\r\n return new Vector2(this.x, this.y);\r\n }\r\n\r\n public normalize(): this {\r\n const len = this.len();\r\n if (len < 0.000001) return this;\r\n this.x /= len;\r\n this.y /= len;\r\n return this;\r\n }\r\n\r\n public get_projection_of(other: Vector2I): Vector2 {\r\n const len = this.dot(other) / this.len2();\r\n return this.cpy().mul(len);\r\n }\r\n\r\n public is_null_vector(): boolean {\r\n return Math.abs(this.x) < 0.001 && Math.abs(this.y) < 0.001;\r\n }\r\n\r\n public get_angle(): radians {\r\n // let 0 be showing up (0,1)\r\n return (Math.atan2(this.y, this.x) + (Math.PI / 2)) % (2 * Math.PI);\r\n }\r\n\r\n public rotate_radians_clockwise(radians: number): this {\r\n const sin = Math.sin(radians);\r\n const cos = Math.cos(radians);\r\n const new_x = -sin * this.y + cos * this.x;\r\n const new_y = sin * this.x + cos * this.y;\r\n this.y = new_y;\r\n this.x = new_x;\r\n return this;\r\n }\r\n\r\n public rotate_right_angles_clockwise(count: number = 1): this {\r\n if (count < 1) return this;\r\n const new_x = this.y;\r\n this.y = -this.x;\r\n this.x = new_x;\r\n return this.rotate_right_angles_clockwise(count - 1);\r\n }\r\n\r\n /**\r\n * ### Static methods\r\n */\r\n\r\n /**\r\n * Standard Vectors\r\n */\r\n public static readonly RIGHT = new Vector2(1, 0);\r\n public static readonly LEFT = new Vector2(-1, 0);\r\n public static readonly UP = new Vector2(0, -1);\r\n public static readonly DOWN = new Vector2(0, 1);\r\n\r\n /**\r\n * Create a Vector2 from an angle and a length.\r\n * An angle of 0 points to the right, turning clockwise.\r\n *\r\n * @param angle\r\n * @param length\r\n */\r\n public static from_angle(angle: radians, length: number = 1): Vector2 {\r\n return new Vector2(Math.cos(angle) * length, Math.sin(angle) * length);\r\n }\r\n\r\n}","import {Vector2, Vector2I} from \"./Vector2\";\r\n\r\nexport interface RectI {\r\n x: number,\r\n y: number,\r\n w: number,\r\n h: number\r\n}\r\n\r\n/**\r\n * @class Rect\r\n * A helper class for Rectangles\r\n */\r\nexport class Rect implements RectI {\r\n public constructor(public x: number = 0, public y: number = 0, public w: number = 0, public h: number = 0) {\r\n\r\n }\r\n\r\n public get left(): number {\r\n return this.x;\r\n }\r\n\r\n public get_left(): number {\r\n return this.x;\r\n }\r\n\r\n public get top(): number {\r\n return this.y;\r\n }\r\n\r\n public get_top(): number {\r\n return this.y;\r\n }\r\n\r\n public get right(): number {\r\n return this.x + this.w;\r\n }\r\n\r\n public get_right(): number {\r\n return this.x + this.w;\r\n }\r\n\r\n public get_bottom(): number {\r\n return this.y + this.h;\r\n }\r\n\r\n public get bottom(): number {\r\n return this.y + this.h;\r\n }\r\n\r\n public get width(): number {\r\n return this.w;\r\n }\r\n\r\n public get_width(): number {\r\n return this.w;\r\n }\r\n\r\n public get height(): number {\r\n return this.h;\r\n }\r\n\r\n public get_height(): number {\r\n return this.h;\r\n }\r\n\r\n public cpy(): Rect {\r\n return new Rect(this.x, this.y, this.w, this.h);\r\n }\r\n\r\n public set(x: RectI): this;\r\n public set(x: number, y: number, w?: number, h?: number): this;\r\n public set(x: number | RectI, y?: number, w?: number, h?: number): this {\r\n if (typeof x === \"object\") {\r\n this.x = x.x;\r\n this.y = x.y;\r\n this.w = x.w;\r\n this.h = x.h;\r\n } else {\r\n this.x = x;\r\n this.y = y as number;\r\n if (w !== undefined) this.w = w;\r\n if (h !== undefined) this.h = h;\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * Secondary properties\r\n */\r\n\r\n public get_area(): number {\r\n return this.w * this.h;\r\n }\r\n\r\n public get center(): Vector2I {\r\n return new Vector2(this.x + this.w / 2, this.y + this.h / 2);\r\n }\r\n\r\n public set center(center: Vector2I) {\r\n this.x = center.x - this.w / 2;\r\n this.y = center.y - this.h / 2;\r\n }\r\n\r\n public set_center(center: Vector2I): this {\r\n this.center = center;\r\n return this;\r\n }\r\n\r\n\r\n /**\r\n * Expand this rectangle to include the given target.\r\n * @param target\r\n */\r\n public expand_to(target: Readonly): this {\r\n if (this.contains(target)) return this;\r\n const left = Math.min(this.x, target.x);\r\n const top = Math.min(this.y, target.y);\r\n const right = Math.max(this.get_right(), target.x);\r\n const bottom = Math.max(this.get_bottom(), target.y);\r\n return this.set(left, top, right - left, bottom - top);\r\n }\r\n\r\n public overlaps_with(other: RectI): boolean {\r\n return Rect.overlap(this, other);\r\n }\r\n\r\n public is_within(outer: RectI): boolean {\r\n return Rect.is_within(this, outer);\r\n }\r\n\r\n public contains(point: Vector2I): boolean;\r\n public contains(x: number, y: number): boolean;\r\n public contains(x: number | Vector2I, y?: number): boolean {\r\n if (typeof x === \"object\") {\r\n return Rect.contains(this, x);\r\n }\r\n if (typeof y !== \"number\") throw new Error(\"Unexpected type error\");\r\n return Rect.contains(this, {x, y});\r\n }\r\n\r\n /**\r\n * Manipulate this rectangle to change into the target rectangle by the factor t.\r\n *\r\n * @param target\r\n * @param t\r\n * 0 => rectangle is unchanged\r\n * ..\r\n * 1 => the rectangle is identical to the target rectangle.\r\n */\r\n public lerp(target: Rect, t: number): this {\r\n const it = 1 - t;\r\n this.x = this.x * it + target.x * t;\r\n this.y = this.y * it + target.y * t;\r\n this.w = this.w * it + target.w * t;\r\n this.h = this.h * it + target.h * t;\r\n return this;\r\n }\r\n\r\n /**\r\n * This functions returns the corners of this rectangle in clockwise order.\r\n * Starting with the left-top one.\r\n *\r\n * @returns array\r\n * [ left_top, right_top, right_bottom, left_bottom ]\r\n */\r\n public get_corners(): [Vector2I, Vector2I, Vector2I, Vector2I] {\r\n return [\r\n {x: this.left, y: this.top},\r\n {x: this.right, y: this.top},\r\n {x: this.right, y: this.bottom},\r\n {x: this.left, y: this.bottom},\r\n ];\r\n }\r\n\r\n\r\n /**\r\n * ### static function\r\n */\r\n\r\n /**\r\n * Is the given point inside the rectangle.\r\n * The borders of the rectangle count as inside.\r\n * @see Rect.contains_exclusive\r\n *\r\n * @param rect\r\n * The rectangle defining the boundry\r\n * @param point\r\n * The point to check\r\n * @return boolean\r\n * True => the point is inside\r\n */\r\n public static contains(rect: RectI, point: Vector2I): boolean {\r\n return (point.x >= rect.x && point.y >= rect.y && point.x <= rect.x + rect.w && point.y <= rect.y + rect.h);\r\n }\r\n\r\n /**\r\n * Is the given point inside the rectangle.\r\n * The borders of the rectangle count as outside.\r\n * @see Rect.contains\r\n *\r\n * @param rect\r\n * The rectangle bilding the boundry\r\n * @param point\r\n * The point to check\r\n * @return boolean\r\n * True => the point is inside\r\n */\r\n public static contains_exclusive(rect: RectI, point: Vector2I): boolean {\r\n return (point.x > rect.x && point.y > rect.y && point.x < rect.x + rect.w && point.y < rect.y + rect.h);\r\n }\r\n\r\n /**\r\n * Do theses Rectangles overlap\r\n * @param a\r\n * @param b\r\n */\r\n public static overlap(a: RectI, b: RectI): boolean {\r\n const overlap_x = (a.x + a.w > b.x && a.x <= b.x) || (b.x + b.w > a.x && b.x <= a.x);\r\n const overlap_y = (a.y + a.h > b.y && a.y <= b.y) || (b.y + b.h > a.y && b.y <= a.y);\r\n return overlap_x && overlap_y;\r\n }\r\n\r\n /**\r\n * Is the inner rectangle completly within the outer rectangle.\r\n *\r\n * @param inner\r\n * @param outer\r\n */\r\n public static is_within(inner: RectI, outer: RectI) {\r\n const within_x = inner.x > outer.x && inner.x + inner.w < outer.x + outer.w;\r\n const within_y = inner.y > outer.y && inner.y + inner.h < outer.y + outer.h;\r\n return within_x && within_y;\r\n }\r\n}\r\n","import { TreeElementNotFoundException } from \"./exceptions/TreeElementNotFoundException\";\r\nimport { RectI, Rect } from \"../geometries/Rect\";\r\n\r\nexport class QuadTree {\r\n private root_branch: QuadTreeBranch;\r\n\r\n constructor(base_rect: RectI) {\r\n this.root_branch = new QuadTreeBranch(base_rect.x, base_rect.y, base_rect.w, base_rect.h);\r\n }\r\n\r\n public pick(rect: RectI): Array {\r\n return this.root_branch.pick(rect);\r\n }\r\n\r\n public add(element: T): void {\r\n let is_within = Rect.is_within(element, this.root_branch);\r\n if (is_within) {\r\n this.root_branch.add(element);\r\n } else {\r\n this.elevate_root_branch();\r\n this.add(element);\r\n }\r\n }\r\n\r\n /**\r\n * First wrap the root in a branch that contains the root at the bottom right,\r\n * then create a branch wich has that new branch in the bottom left, \r\n * like that the tree expands in all directions \r\n */\r\n public elevate_root_branch() {\r\n const old_root_branch = this.root_branch;\r\n const extend_top_left_rect = {\r\n x: old_root_branch.x - old_root_branch.w,\r\n y: old_root_branch.y - old_root_branch.h,\r\n w: old_root_branch.w * 2,\r\n h: old_root_branch.h * 2,\r\n };\r\n const extend_bottom_right_rect = {\r\n x: extend_top_left_rect.x,\r\n y: extend_top_left_rect.y,\r\n w: extend_top_left_rect.w * 2,\r\n h: extend_top_left_rect.h * 2,\r\n };\r\n\r\n this.wrap_root_node_in_node_with_rect(extend_top_left_rect, 2);\r\n this.wrap_root_node_in_node_with_rect(extend_bottom_right_rect, 0);\r\n }\r\n\r\n public wrap_root_node_in_node_with_rect(rect: RectI, node_pos: 0 | 1 | 2 | 3) {\r\n const wrapper_node = new QuadTreeBranch(\r\n rect.x,\r\n rect.y,\r\n rect.w,\r\n rect.h,\r\n );\r\n wrapper_node.create_child_branches();\r\n if (!wrapper_node.child_branch_nodes) throw new Error();\r\n wrapper_node.child_branch_nodes[node_pos] = this.root_branch;\r\n this.root_branch = wrapper_node;\r\n }\r\n\r\n public change_element(element: T, rect: RectI) {\r\n this.remove(element);\r\n element.x = rect.x;\r\n element.y = rect.y;\r\n element.w = rect.w;\r\n element.h = rect.h;\r\n this.add(element);\r\n }\r\n\r\n public remove(element: T) {\r\n if (!this.root_branch.remove(element)) {\r\n throw new TreeElementNotFoundException();\r\n }\r\n }\r\n\r\n public is_empty(): boolean {\r\n return this.root_branch.is_empty();\r\n }\r\n\r\n public clear() {\r\n this.root_branch.clear(8);\r\n }\r\n}\r\n\r\nexport class QuadTreeBranch extends Rect {\r\n public child_branch_nodes: [QuadTreeBranch, QuadTreeBranch, QuadTreeBranch, QuadTreeBranch] | null = null;\r\n public elements: Array = [];\r\n\r\n public add(element: T): boolean {\r\n if (this.child_branch_nodes === null) {\r\n this.elements.push(element);\r\n this.create_child_branches_if_necessary();\r\n return true;\r\n };\r\n const overlapping_branches = this.child_branch_nodes.filter((branch) => {\r\n return branch.overlaps_with(element);\r\n }, []);\r\n if (overlapping_branches.length === 0) throw Error('Inconsistent Result');\r\n if (overlapping_branches.length === 1) {\r\n overlapping_branches[0].add(element);\r\n } else {\r\n this.elements.push(element);\r\n }\r\n return true;\r\n }\r\n\r\n public readd_own_elements(): void {\r\n const elements = this.elements.splice(0);\r\n elements.forEach((element) => {\r\n this.add(element);\r\n });\r\n }\r\n\r\n public create_child_branches_if_necessary() {\r\n if (this.elements.length < 10) return;\r\n this.create_child_branches();\r\n this.readd_own_elements();\r\n }\r\n\r\n public create_child_branches() {\r\n const w_half = this.w / 2;\r\n const h_half = this.h / 2;\r\n this.child_branch_nodes = [\r\n new QuadTreeBranch(this.x, this.y, w_half, h_half),\r\n new QuadTreeBranch(this.x + w_half, this.y, w_half, h_half),\r\n new QuadTreeBranch(this.x + w_half, this.y + h_half, w_half, h_half),\r\n new QuadTreeBranch(this.x, this.y + h_half, w_half, h_half),\r\n ];\r\n }\r\n\r\n public pick(rect: RectI, result: Array = []): Array {\r\n if (!this.overlaps_with(rect)) return result;\r\n result.push(...this.elements.filter((element) => Rect.overlap(rect, element)));\r\n if (this.child_branch_nodes === null) return result;\r\n if (this.is_within(rect)) return this.pick_all(result);\r\n for (let branch of this.child_branch_nodes) {\r\n branch.pick(rect, result);\r\n }\r\n return result;\r\n }\r\n\r\n public pick_all(result: Array): Array {\r\n result.push(...this.elements);\r\n if (this.child_branch_nodes === null) return result;\r\n for (let branch of this.child_branch_nodes) {\r\n branch.pick_all(result);\r\n }\r\n return result;\r\n }\r\n\r\n public remove(element: T): boolean {\r\n const id = this.elements.indexOf(element);\r\n if (id !== -1) {\r\n this.elements.splice(id, 1);\r\n return true;\r\n }\r\n if (this.child_branch_nodes === null) return false;\r\n for (let branch of this.child_branch_nodes) {\r\n if (branch.remove(element)) return true;\r\n }\r\n return false;\r\n }\r\n\r\n public is_empty(): boolean {\r\n if (!this.is_self_empty()) return false;\r\n if (this.child_branch_nodes === null) return true;\r\n for (let branch of this.child_branch_nodes) {\r\n if (!branch.is_empty()) return false;\r\n }\r\n return true;\r\n }\r\n\r\n public is_self_empty(): boolean {\r\n return this.elements.length === 0;\r\n }\r\n\r\n public clear(max_levels_deep: number) {\r\n this.elements.splice(0);\r\n if (this.child_branch_nodes) {\r\n if (max_levels_deep <= 0) {\r\n this.child_branch_nodes = null;\r\n } else {\r\n this.child_branch_nodes.forEach((node) => {\r\n node.clear(max_levels_deep - 1);\r\n })\r\n }\r\n }\r\n }\r\n}","import { throw_expression } from \"./utils/flow-control\";\r\nimport { QuadTree } from \"@game.object/ts-game-toolbox/src/trees/QuadTree\";\r\nimport { Rect, RectI } from \"@game.object/ts-game-toolbox/src/geometries/Rect\";\r\nimport { Vector2, Vector2I } from \"@game.object/ts-game-toolbox/src/geometries/Vector2\";\r\n\r\nconst INITIAL_PHEROMON_DROP_INTENSITY = 10;\r\n\r\nexport class Game {\r\n public canvas: HTMLCanvasElement;\r\n public context: CanvasRenderingContext2D;\r\n public ants: Array = [];\r\n public pheromones: Array = [];\r\n public pheromone_tree: QuadTree = new QuadTree(new Rect(0, 0, 800, 600));\r\n public foods: Array = [];\r\n public food_tree: QuadTree = new QuadTree(new Rect(0, 0, 800, 600));\r\n // controls\r\n public controls_form: HTMLFormElement;\r\n public controls_show_ants: HTMLInputElement;\r\n public controls_show_foods: HTMLInputElement;\r\n public controls_show_pheromones: HTMLInputElement;\r\n public controls_simulation_speed: HTMLInputElement;\r\n public controls_simulation_steps: HTMLInputElement;\r\n\r\n constructor() {\r\n const canvas = document.getElementById('app') ?? throw_expression(\"Canvas not found\");\r\n if (!(canvas instanceof HTMLCanvasElement)) throw new Error(\"Canvas not found\");\r\n this.canvas = canvas;\r\n this.context = canvas.getContext(\"2d\") ?? throw_expression(\"Context not found\");\r\n this.canvas.addEventListener(\"click\", (event: MouseEvent) => {\r\n const x = (event.clientX - this.canvas.offsetLeft) / this.canvas.clientWidth * this.canvas.width;\r\n const y = (event.clientY - this.canvas.offsetTop) / this.canvas.clientHeight * this.canvas.height;\r\n this.on_click(x, y);\r\n });\r\n // controls\r\n const controls = document.getElementById('controls');\r\n if (!(controls instanceof HTMLFormElement)) throw new Error(\"Controls not found\");\r\n this.controls_form = controls;\r\n const show_ants = controls.querySelector(\"[name=show-ants]\");\r\n if (!(show_ants instanceof HTMLInputElement)) throw new Error(\"Controls not found\");\r\n this.controls_show_ants = show_ants;\r\n const show_food = controls.querySelector(\"[name=show-foods]\");\r\n if (!(show_food instanceof HTMLInputElement)) throw new Error(\"Controls not found\");\r\n this.controls_show_foods = show_food;\r\n const show_pheromones = controls.querySelector(\"[name=show-pheromones]\");\r\n if (!(show_pheromones instanceof HTMLInputElement)) throw new Error(\"Controls not found\");\r\n this.controls_show_pheromones = show_pheromones;\r\n\r\n const simulation_speed = controls.querySelector(\"[name=simulation-speed]\");\r\n if (!(simulation_speed instanceof HTMLInputElement)) throw new Error(\"Controls not found\");\r\n this.controls_simulation_speed = simulation_speed;\r\n const simulation_steps = controls.querySelector(\"[name=simulation-steps]\");\r\n if (!(simulation_steps instanceof HTMLInputElement)) throw new Error(\"Controls not found\");\r\n this.controls_simulation_steps = simulation_steps;\r\n }\r\n\r\n public init() {\r\n this.ants = [];\r\n const ant_count = 150;\r\n for (let i = 0; i < ant_count; ++i) {\r\n const ant = new Ant(this);\r\n const x = 400 + Math.random() * 100;\r\n const y = 300 + Math.random() * 100;\r\n ant.x = x;\r\n ant.y = y;\r\n this.ants.push(ant);\r\n }\r\n this.foods = [];\r\n const food_regions = 15;\r\n const food_count = 150;\r\n for (let i = 0; i < food_regions; ++i) {\r\n const rx = Math.random() * 700 + 50;\r\n const ry = Math.random() * 300 + 50;\r\n for (let j = 0; j < food_count; ++j) {\r\n const x = rx + Math.random() * 50;\r\n const y = ry + Math.random() * 50;\r\n this.add_food(x, y);\r\n }\r\n }\r\n }\r\n\r\n public on_click(x: number, y: number) {\r\n const food_count = 150;\r\n const rx = x;\r\n const ry = y;\r\n for (let j = 0; j < food_count; ++j) {\r\n const x = rx + Math.random() * 50;\r\n const y = ry + Math.random() * 50;\r\n this.add_food(x, y);\r\n }\r\n }\r\n\r\n public run() {\r\n this.init();\r\n const loop = () => {\r\n for (let i = 0; i < parseInt(this.controls_simulation_speed.value); i++) {\r\n this.update(parseInt(this.controls_simulation_steps.value) / 60);\r\n }\r\n requestAnimationFrame(loop);\r\n }\r\n requestAnimationFrame(loop);\r\n }\r\n\r\n public update(delta_seconds: number) {\r\n this.draw();\r\n this.ants.forEach((ant: Ant) => {\r\n ant.update(delta_seconds);\r\n })\r\n this.pheromones = this.pheromones.filter((pheromon) => {\r\n pheromon.update(delta_seconds);\r\n if (pheromon.intensity > 0) return true;\r\n this.pheromone_tree.remove(pheromon);\r\n return false;\r\n });\r\n }\r\n\r\n public draw() {\r\n this.context.clearRect(0, 0, 800, 600);\r\n\r\n if (this.controls_show_pheromones.checked) {\r\n\r\n this.pheromones.forEach((pheromon) => {\r\n const intensity_alpha = Math.min(0xff, Math.max(0, Math.floor((pheromon.intensity) * 0xff / 20)));\r\n this.context.fillStyle = (pheromon.type\r\n ? \"#8800ff\"\r\n : \"#0088ff\")\r\n + (\"00\" + intensity_alpha.toString(16)).substr(-2, 2);\r\n this.context.fillRect(pheromon.x - 1, pheromon.y - 1, 3, 3);\r\n });\r\n }\r\n\r\n if (this.controls_show_ants.checked) {\r\n this.context.beginPath();\r\n this.context.strokeStyle = \"red\";\r\n this.ants.forEach((ant) => {\r\n this.context.moveTo(ant.x + 5, ant.y);\r\n this.context.ellipse(ant.x, ant.y, 5, 5, 0, 0, Math.PI * 2);\r\n });\r\n this.context.stroke();\r\n }\r\n\r\n if (this.controls_show_foods.checked) {\r\n this.context.beginPath();\r\n this.context.fillStyle = \"green\";\r\n this.foods.forEach((food) => {\r\n this.context.moveTo(food.x + 4, food.y);\r\n this.context.ellipse(food.x, food.y, 4, 4, 0, 0, Math.PI * 2);\r\n });\r\n this.context.fill();\r\n }\r\n }\r\n\r\n public add_food(x: number, y: number) {\r\n const food = new Food();\r\n food.x = x - food.h / 2;\r\n food.y = y - food.w / 2;\r\n this.foods.push(food);\r\n this.food_tree.add(food);\r\n }\r\n\r\n public drop_pheromone(pos: Vector2I, type: PheromonType, strength: number) {\r\n const phe = new Pheromon();\r\n phe.x = pos.x;\r\n phe.y = pos.y;\r\n phe.type = type;\r\n phe.intensity = strength;\r\n this.pheromones.push(phe);\r\n this.pheromone_tree.add(phe);\r\n }\r\n}\r\n\r\nfunction rect_with_center(center: Vector2I, width: number, height: number): Rect {\r\n return new Rect(center.x - width / 2, center.y - height / 2, width, height);\r\n}\r\n\r\nclass Ant {\r\n public x: number = 400;\r\n public y: number = 300;\r\n public vx: number = 0;\r\n public vy: number = 0;\r\n public transport: Food | null = null;\r\n public cooldown: number = 0;\r\n public time_until_random: number = 0;\r\n public pheromone_drop_intensity: number = 0;\r\n\r\n constructor(public game: Game) {\r\n\r\n }\r\n\r\n public update(delta_seconds: number) {\r\n this.x += this.vx * delta_seconds * 25;\r\n this.y += this.vy * delta_seconds * 25;\r\n const dx = this.x - 400;\r\n const dy = this.y - 300;\r\n const d2 = dx * dx + dy * dy;\r\n if (d2 < 2500) {\r\n this.pheromone_drop_intensity = INITIAL_PHEROMON_DROP_INTENSITY;\r\n if (this.transport !== null) {\r\n this.game.foods = this.game.foods.filter((f) => f !== this.transport);\r\n this.transport = null;\r\n this.vx *= -1;\r\n this.vy *= -1;\r\n }\r\n }\r\n\r\n // add aimed movement\r\n const offset_rotation = Math.PI / 4;\r\n const offset_distance = 20;\r\n const sense_radius = 10;\r\n\r\n\r\n const in_range_template_func = (center: Vector2) => {\r\n return (pheromon: Pheromon) => {\r\n return center.cpy().sub(pheromon).len2() < sense_radius * sense_radius;\r\n }\r\n };\r\n\r\n\r\n const rotation = Math.atan2(this.vy, this.vx);\r\n const left_sense_offset = (Vector2.from_angle(rotation - offset_rotation, offset_distance));\r\n const forward_sense_offset = (Vector2.from_angle(rotation, offset_distance));\r\n const right_sense_offset = (Vector2.from_angle(rotation + offset_rotation, offset_distance));\r\n const left_sense_center = (left_sense_offset.cpy()).add(this);\r\n const forward_sense_center = (forward_sense_offset.cpy()).add(this);\r\n const right_sense_center = (right_sense_offset.cpy()).add(this);\r\n const left_sense = this.game.pheromone_tree.pick(rect_with_center(left_sense_center, sense_radius, sense_radius))\r\n .filter(in_range_template_func(left_sense_center));\r\n const forward_sense = this.game.pheromone_tree.pick(rect_with_center(forward_sense_center, sense_radius, sense_radius))\r\n .filter(in_range_template_func(forward_sense_center));\r\n const right_sense = this.game.pheromone_tree.pick(rect_with_center(right_sense_center, sense_radius, sense_radius))\r\n .filter(in_range_template_func(right_sense_center));\r\n const left_sense_value = this.evaluate_pheromons(left_sense);\r\n const forward_sense_value = this.evaluate_pheromons(forward_sense);\r\n const right_sense_value = this.evaluate_pheromons(right_sense);\r\n\r\n this.vx += (Math.random() - 0.5 - Math.abs(dx) * dx / (1200 * 1200)) / 25;\r\n this.vy += (Math.random() - 0.5 - Math.abs(dy) * dy / (1200 * 1200)) / 25;\r\n if (forward_sense_value > right_sense_value && forward_sense_value > left_sense_value) {\r\n this.vx += forward_sense_offset.x / 10;\r\n this.vy += forward_sense_offset.y / 10;\r\n this.time_until_random = 1;\r\n }\r\n if (left_sense_value > forward_sense_value && left_sense_value > right_sense_value) {\r\n this.vx += left_sense_offset.x / 10;\r\n this.vy += left_sense_offset.y / 10;\r\n this.time_until_random = 1;\r\n }\r\n if (right_sense_value > left_sense_value && right_sense_value > forward_sense_value) {\r\n this.vx += right_sense_offset.x / 10;\r\n this.vy += right_sense_offset.y / 10;\r\n this.time_until_random = 1;\r\n }\r\n if (right_sense_value === left_sense_value && left_sense_value === forward_sense_value) {\r\n // add random movement\r\n // this.vx += 1;\r\n this.time_until_random -= delta_seconds;\r\n if (this.time_until_random < 0) {\r\n this.vx += (Math.random() - 0.5 - Math.abs(dx) * dx / (1200 * 1200)) / 5;\r\n this.vy += (Math.random() - 0.5 - Math.abs(dy) * dy / (1200 * 1200)) / 5;\r\n }\r\n }\r\n\r\n const vlen = Math.sqrt(this.vx * this.vx + this.vy * this.vy);\r\n this.vx /= vlen;\r\n this.vy /= vlen;\r\n\r\n if (this.transport !== null) {\r\n this.update_transport_food(delta_seconds);\r\n } else {\r\n this.update_pickup_food(delta_seconds);\r\n }\r\n this.cooldown -= delta_seconds;\r\n this.pheromone_drop_intensity *= 0.995;\r\n if (this.cooldown < 0) {\r\n this.cooldown = 0.5;\r\n this.game.drop_pheromone({\r\n x: this.x,\r\n y: this.y,\r\n },\r\n this.transport === null ? PheromonType.HOME : PheromonType.FOOD,\r\n this.pheromone_drop_intensity * 2,\r\n )\r\n }\r\n }\r\n\r\n public evaluate_pheromons(pheromons: Array): number {\r\n return pheromons.reduce((sum, phe) => {\r\n switch (phe.type) {\r\n case PheromonType.FOOD:\r\n return sum + (this.transport === null ? phe.intensity : 0);\r\n case PheromonType.HOME:\r\n return sum + (this.transport === null ? 0 : phe.intensity);\r\n }\r\n }, 0);\r\n }\r\n\r\n public move_random() {\r\n\r\n }\r\n\r\n public update_transport_food(delta_seconds: number) {\r\n if (!this.transport) return;\r\n this.transport.x = this.x;\r\n this.transport.y = this.y;\r\n }\r\n\r\n public update_pickup_food(delta_seconds: number) {\r\n const found_food = this.game.food_tree.pick({\r\n x: this.x,\r\n y: this.y,\r\n w: 8,\r\n h: 8,\r\n }).filter((food) => {\r\n return food.transported_by === null;\r\n });\r\n if (found_food.length > 0) {\r\n this.transport = found_food[0];\r\n found_food[0].transported_by = this;\r\n this.game.food_tree.remove(found_food[0]);\r\n this.vx *= -1;\r\n this.vy *= -1;\r\n this.pheromone_drop_intensity = INITIAL_PHEROMON_DROP_INTENSITY;\r\n }\r\n }\r\n}\r\n\r\nclass Food implements RectI {\r\n public w: number = 5;\r\n public h: number = 5;\r\n public x: number = 0;\r\n public y: number = 0;\r\n public transported_by: Ant | null = null;\r\n}\r\n\r\nclass Pheromon implements RectI {\r\n public w: number = 4;\r\n public h: number = 4;\r\n public x: number = 0;\r\n public y: number = 0;\r\n public type: PheromonType = PheromonType.HOME;\r\n public intensity: number = 20;\r\n\r\n public update(delta_seconds: number) {\r\n this.intensity -= delta_seconds;\r\n }\r\n}\r\n\r\nenum PheromonType {\r\n HOME, FOOD\r\n}","import { Game } from \"./Game\";\r\n\r\n(new Game).run();\r\n\r\n"]}