diff --git a/absurd-survivors/src/Player.ts b/absurd-survivors/src/Player.ts index 9988cf7..4abedc3 100644 --- a/absurd-survivors/src/Player.ts +++ b/absurd-survivors/src/Player.ts @@ -4,7 +4,7 @@ import {drawDot} from "./utils.ts"; export class Player implements Drawable, Acting, Healthy { private _position: Vector; - private _stats: Stats; + private _stats: PlayerStats; private _color: string; private _status: PlayerStatus; private _weapons: [Weapon] = [] @@ -28,7 +28,7 @@ export class Player implements Drawable, Acting, Healthy { } let player = new Player(position); player._color = 'blue'; - player._stats = Stats.defaultPlayerStats(); + player._stats = PlayerStats.defaultPlayerStats(); player._speed = new Vector(0, 0) player._status = new PlayerStatus(10, 0); return player; @@ -76,7 +76,7 @@ export class Player implements Drawable, Acting, Healthy { return this._color; } - get stats(): Stats { + get stats(): PlayerStats { return this._stats; } @@ -133,29 +133,23 @@ export class PlayerStatus { } } -export class Stats { +export class PlayerStats { constructor(private _speed: number, private _size: number, private _health: number, - private _pullRange: number) { + private _pullRange: number, + private _weaponRange: number, + private _weaponRangeFactor: number) { } get speed(): number { return this._speed; } - set speed(value: number) { - this._speed = value; - } - get size(): number { return this._size; } - set size(value: number) { - this._size = value; - } - get pullRange(): number { return this._pullRange; } @@ -164,7 +158,15 @@ export class Stats { return this._health; } - public static defaultPlayerStats(): Stats { - return new Stats(3, 5, 10, 150); + get weaponRange(): number { + return this._weaponRange + } + + get effectiveWeaponRange(): number { + return this._weaponRange * this._weaponRangeFactor; + } + + public static defaultPlayerStats(): PlayerStats { + return new PlayerStats(3, 5, 10, 150, 250, 1); } } \ No newline at end of file diff --git a/absurd-survivors/src/World.ts b/absurd-survivors/src/World.ts index 49964a0..994de8e 100644 --- a/absurd-survivors/src/World.ts +++ b/absurd-survivors/src/World.ts @@ -82,15 +82,15 @@ export class World { return new Vector(this.size.x * Math.random(), this.size.y * Math.random()) } - getClosestTargetTo(point: Vector): [number, Placeable | undefined] | undefined { - return this.getClosestTargetToButNot(point) + getClosestTargetTo(point: Vector, range?: number): [number, Placeable | undefined] | undefined { + return this.getClosestTargetToButNot(point, undefined, range) } - getClosestTargetToButNot(point: Vector, placeable?: Placeable): [number, Placeable | undefined] | undefined { - return this.getClosestTargetToButNotArray(point, [placeable]) + getClosestTargetToButNot(point: Vector, placeable?: Placeable, range?: number): [number, Placeable | undefined] | undefined { + return this.getClosestTargetToButNotArray(point, [placeable], range) } - getClosestTargetToButNotArray(point: Vector, placeAbles?: [Placeable | undefined]): [number, Placeable | undefined] | undefined { + getClosestTargetToButNotArray(point: Vector, placeAbles?: [Placeable | undefined], range?: number): [number, Placeable | undefined] | undefined { let currentTarget; let currentDistance = Number.MAX_SAFE_INTEGER; this._enemies.forEach(enemy => { @@ -98,6 +98,9 @@ export class World { return; } let distance = point.distanceTo(enemy.getPosition()); + if(range && distance > range) { + return; + } if(distance < currentDistance) { currentDistance = distance; currentTarget = enemy diff --git a/absurd-survivors/src/weapons.ts b/absurd-survivors/src/weapons.ts index bfe1704..baf1871 100644 --- a/absurd-survivors/src/weapons.ts +++ b/absurd-survivors/src/weapons.ts @@ -11,10 +11,12 @@ export abstract class BasicWeapon implements Weapon { protected readonly world: World; protected color: string; protected size: number; + protected stats: WeaponStats; - constructor(world: World) { + constructor(world: World, stats: WeaponStats) { this.player = world.player; this.world = world; + this.stats = stats; } act() { @@ -43,7 +45,13 @@ export abstract class BasicWeapon implements Weapon { } } -export class HomingPistol extends BasicWeapon { +export class RangeWeapon extends BasicWeapon { + calculateRange(): number { + return this.world.player.stats.effectiveWeaponRange + this.stats.effectiveWeaponRange; + } +} + +export class HomingPistol extends RangeWeapon { private shootInterval: number; private shootCooldown: number = 0; @@ -64,7 +72,8 @@ export class HomingPistol extends BasicWeapon { } private createProjectile(): boolean { - let closestTargetTo = this.world.getClosestTargetTo(this.world.player.position); + let range = this.calculateRange() + let closestTargetTo = this.world.getClosestTargetTo(this.world.player.position, range); if(closestTargetTo !== undefined && closestTargetTo[1] !== undefined) { let stats = new ProjectileStats(5, 1, 5, 5) let projectile = HomingProjectile.createHomingProjectile(this.world, this.getPosition(), this.player, closestTargetTo[1]!, stats, 'yellow') @@ -79,7 +88,8 @@ export class HomingPistol extends BasicWeapon { if(!offset) { offset = new Vector(5, 5) } - let pistol = new HomingPistol(world) + let stats = new WeaponStats(0, 1) + let pistol = new HomingPistol(world, stats) pistol.offset = offset; pistol.size = 5; pistol.color = 'yellow'; @@ -88,7 +98,7 @@ export class HomingPistol extends BasicWeapon { } } -export class Pistol extends BasicWeapon { +export class Pistol extends RangeWeapon { private shootInterval: number; private shootCooldown: number = 0; @@ -109,7 +119,8 @@ export class Pistol extends BasicWeapon { } private createProjectile(): boolean { - let closestTargetTo = this.world.getClosestTargetTo(this.world.player.position); + let range = this.calculateRange() + let closestTargetTo = this.world.getClosestTargetTo(this.world.player.position, range); if(closestTargetTo !== undefined && closestTargetTo[1] !== undefined) { let stats = new ProjectileStats(2, 1, 5, 5) let projectile = StraightProjectile.createStraightProjectile(this.world, this.getPosition(), closestTargetTo[1]!.getPosition(), this.player, stats, 'pink') @@ -124,7 +135,8 @@ export class Pistol extends BasicWeapon { if(!offset) { offset = new Vector(5, 5) } - let pistol = new Pistol(world) + let stats = new WeaponStats(0, 1) + let pistol = new Pistol(world, stats) pistol.offset = offset; pistol.size = 5; pistol.color = 'brown'; @@ -133,3 +145,22 @@ export class Pistol extends BasicWeapon { } } + +export class WeaponStats { + constructor(private _weaponRange: number, + private _weaponRangeFactor: number) { + } + + + get weaponRange(): number { + return this._weaponRange; + } + + get weaponRangeFactor(): number { + return this._weaponRangeFactor + } + + get effectiveWeaponRange(): number { + return this._weaponRange * this._weaponRangeFactor + } +}