From 07b64154e1cb0ebf107a811bd27f8fd387e4927b Mon Sep 17 00:00:00 2001 From: Sheldan <5037282+Sheldan@users.noreply.github.com> Date: Thu, 21 Aug 2025 21:53:59 +0200 Subject: [PATCH] survivors: add ability to dynamically position weapons change size of weapon to be used for offset only, draw size is different increasing speed of gun projectile --- absurd-survivors/src/Player.ts | 13 ++++++ absurd-survivors/src/interfaces.ts | 7 +++- absurd-survivors/src/main.ts | 3 +- absurd-survivors/src/weapons.ts | 65 +++++++++++++++++++----------- 4 files changed, 62 insertions(+), 26 deletions(-) diff --git a/absurd-survivors/src/Player.ts b/absurd-survivors/src/Player.ts index ebc3f24..77cfeab 100644 --- a/absurd-survivors/src/Player.ts +++ b/absurd-survivors/src/Player.ts @@ -32,6 +32,19 @@ export class Player implements Drawable, Acting, Healthy { } addWeapon(weapon: Weapon) { + let weaponCount = this._weapons.length + 1; + let angle = 2 * Math.PI / weaponCount; + for (let i = 0; i < this._weapons.length; i++) { + let affectedWeapon = this._weapons[i]; + let x = Math.cos(angle * i) + let y = Math.sin(angle * i) + console.log(x + ' ' + y) + affectedWeapon.setOffset(new Vector(x, y).multiply(affectedWeapon.getSize())) + } + let newPosition = new Vector(Math.cos(angle * (weaponCount - 1)), Math.sin(angle * (weaponCount - 1))); + newPosition = newPosition.multiply(weapon.getSize()) + console.log(newPosition.x + ' ' + newPosition.y) + weapon.setOffset(newPosition) this._weapons.push(weapon) } diff --git a/absurd-survivors/src/interfaces.ts b/absurd-survivors/src/interfaces.ts index fee518e..dbe36d4 100644 --- a/absurd-survivors/src/interfaces.ts +++ b/absurd-survivors/src/interfaces.ts @@ -24,7 +24,12 @@ export interface Projectile extends Drawable { } -export interface Weapon extends Drawable{ +export interface Equipment { + getOffset(): Vector; + setOffset(vec: Vector); +} + +export interface Weapon extends Drawable, Equipment { act() } diff --git a/absurd-survivors/src/main.ts b/absurd-survivors/src/main.ts index 14854f5..bd03505 100644 --- a/absurd-survivors/src/main.ts +++ b/absurd-survivors/src/main.ts @@ -118,8 +118,7 @@ docReady(function () { }, 15_000) player.addWeapon(Pistol.spawnPistol(world)) - let secondPistol = Pistol.spawnPistol(world, new Vector(-5, -5)); - player.addWeapon(secondPistol) + player.addWeapon(Pistol.spawnPistol(world)) hud = new HUD(world); diff --git a/absurd-survivors/src/weapons.ts b/absurd-survivors/src/weapons.ts index 4183eb2..5ce04a9 100644 --- a/absurd-survivors/src/weapons.ts +++ b/absurd-survivors/src/weapons.ts @@ -5,24 +5,53 @@ import {HomingProjectile, Projectile, ProjectileStats} from "./projectile.ts"; import {World} from "./World.ts"; import {Vector} from "./base.ts"; -export class Pistol implements Weapon { - - private readonly player: Player - private shootInterval: number; - private shootCooldown: number = 0; - private readonly world: World; - private offset: Vector; - private projectiles: [Projectile] = [] - private color: string; - private size: number; +export abstract class BasicWeapon implements Weapon { + protected offset: Vector; + protected readonly player: Player + protected readonly world: World; + protected color: string; + protected size: number; constructor(world: World) { this.player = world.player; this.world = world; } + act() { + } + draw(ctx: CanvasRenderingContext2D) { - drawDot(this.getPosition(), this.size, this.color, ctx) + } + + getPosition(): Vector { + return this.player.position.add(this.offset); + } + + move(any?: any) { + } + + getSize() { + return this.size; + } + + getOffset(): Vector { + return this.offset; + } + + setOffset(vec: Vector) { + this.offset = vec; + } +} + +export class Pistol extends BasicWeapon{ + + private shootInterval: number; + private shootCooldown: number = 0; + + private projectiles: [Projectile] = [] + + draw(ctx: CanvasRenderingContext2D) { + drawDot(this.getPosition(), 1, this.color, ctx) } act() { @@ -37,7 +66,7 @@ export class Pistol implements Weapon { private createProjectile(): boolean { let closestTargetTo = this.world.getClosestTargetTo(this.world.player.position); if(closestTargetTo !== undefined && closestTargetTo[1] !== undefined) { - let stats = new ProjectileStats(2, 1, 5, 1) + let stats = new ProjectileStats(2, 1, 5, 5) let projectile = HomingProjectile.createHomingProjectile(this.world, this.getPosition(), this.player, closestTargetTo[1]!, stats, 'yellow') this.projectiles.push(projectile) return true @@ -52,20 +81,10 @@ export class Pistol implements Weapon { } let pistol = new Pistol(world) pistol.offset = offset; - pistol.size = 1; + pistol.size = 5; pistol.color = 'yellow'; pistol.shootInterval = 50; return pistol; } - getPosition(): Vector { - return this.player.position.add(this.offset); - } - - move(any?: any) { - } - - getSize() { - return this.size; - } } \ No newline at end of file