mirror of
https://github.com/Sheldan/canvas.git
synced 2026-04-14 11:48:15 +00:00
survivors: adding weapon stats and range weapon stat
This commit is contained in:
@@ -4,7 +4,7 @@ import {drawDot} from "./utils.ts";
|
|||||||
|
|
||||||
export class Player implements Drawable, Acting, Healthy {
|
export class Player implements Drawable, Acting, Healthy {
|
||||||
private _position: Vector;
|
private _position: Vector;
|
||||||
private _stats: Stats;
|
private _stats: PlayerStats;
|
||||||
private _color: string;
|
private _color: string;
|
||||||
private _status: PlayerStatus;
|
private _status: PlayerStatus;
|
||||||
private _weapons: [Weapon] = []
|
private _weapons: [Weapon] = []
|
||||||
@@ -28,7 +28,7 @@ export class Player implements Drawable, Acting, Healthy {
|
|||||||
}
|
}
|
||||||
let player = new Player(position);
|
let player = new Player(position);
|
||||||
player._color = 'blue';
|
player._color = 'blue';
|
||||||
player._stats = Stats.defaultPlayerStats();
|
player._stats = PlayerStats.defaultPlayerStats();
|
||||||
player._speed = new Vector(0, 0)
|
player._speed = new Vector(0, 0)
|
||||||
player._status = new PlayerStatus(10, 0);
|
player._status = new PlayerStatus(10, 0);
|
||||||
return player;
|
return player;
|
||||||
@@ -76,7 +76,7 @@ export class Player implements Drawable, Acting, Healthy {
|
|||||||
return this._color;
|
return this._color;
|
||||||
}
|
}
|
||||||
|
|
||||||
get stats(): Stats {
|
get stats(): PlayerStats {
|
||||||
return this._stats;
|
return this._stats;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -133,29 +133,23 @@ export class PlayerStatus {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export class Stats {
|
export class PlayerStats {
|
||||||
constructor(private _speed: number,
|
constructor(private _speed: number,
|
||||||
private _size: number,
|
private _size: number,
|
||||||
private _health: number,
|
private _health: number,
|
||||||
private _pullRange: number) {
|
private _pullRange: number,
|
||||||
|
private _weaponRange: number,
|
||||||
|
private _weaponRangeFactor: number) {
|
||||||
}
|
}
|
||||||
|
|
||||||
get speed(): number {
|
get speed(): number {
|
||||||
return this._speed;
|
return this._speed;
|
||||||
}
|
}
|
||||||
|
|
||||||
set speed(value: number) {
|
|
||||||
this._speed = value;
|
|
||||||
}
|
|
||||||
|
|
||||||
get size(): number {
|
get size(): number {
|
||||||
return this._size;
|
return this._size;
|
||||||
}
|
}
|
||||||
|
|
||||||
set size(value: number) {
|
|
||||||
this._size = value;
|
|
||||||
}
|
|
||||||
|
|
||||||
get pullRange(): number {
|
get pullRange(): number {
|
||||||
return this._pullRange;
|
return this._pullRange;
|
||||||
}
|
}
|
||||||
@@ -164,7 +158,15 @@ export class Stats {
|
|||||||
return this._health;
|
return this._health;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static defaultPlayerStats(): Stats {
|
get weaponRange(): number {
|
||||||
return new Stats(3, 5, 10, 150);
|
return this._weaponRange
|
||||||
|
}
|
||||||
|
|
||||||
|
get effectiveWeaponRange(): number {
|
||||||
|
return this._weaponRange * this._weaponRangeFactor;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static defaultPlayerStats(): PlayerStats {
|
||||||
|
return new PlayerStats(3, 5, 10, 150, 250, 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -82,15 +82,15 @@ export class World {
|
|||||||
return new Vector(this.size.x * Math.random(), this.size.y * Math.random())
|
return new Vector(this.size.x * Math.random(), this.size.y * Math.random())
|
||||||
}
|
}
|
||||||
|
|
||||||
getClosestTargetTo(point: Vector): [number, Placeable | undefined] | undefined {
|
getClosestTargetTo(point: Vector, range?: number): [number, Placeable | undefined] | undefined {
|
||||||
return this.getClosestTargetToButNot(point)
|
return this.getClosestTargetToButNot(point, undefined, range)
|
||||||
}
|
}
|
||||||
|
|
||||||
getClosestTargetToButNot(point: Vector, placeable?: Placeable): [number, Placeable | undefined] | undefined {
|
getClosestTargetToButNot(point: Vector, placeable?: Placeable, range?: number): [number, Placeable | undefined] | undefined {
|
||||||
return this.getClosestTargetToButNotArray(point, [placeable])
|
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 currentTarget;
|
||||||
let currentDistance = Number.MAX_SAFE_INTEGER;
|
let currentDistance = Number.MAX_SAFE_INTEGER;
|
||||||
this._enemies.forEach(enemy => {
|
this._enemies.forEach(enemy => {
|
||||||
@@ -98,6 +98,9 @@ export class World {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
let distance = point.distanceTo(enemy.getPosition());
|
let distance = point.distanceTo(enemy.getPosition());
|
||||||
|
if(range && distance > range) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
if(distance < currentDistance) {
|
if(distance < currentDistance) {
|
||||||
currentDistance = distance;
|
currentDistance = distance;
|
||||||
currentTarget = enemy
|
currentTarget = enemy
|
||||||
|
|||||||
@@ -11,10 +11,12 @@ export abstract class BasicWeapon implements Weapon {
|
|||||||
protected readonly world: World;
|
protected readonly world: World;
|
||||||
protected color: string;
|
protected color: string;
|
||||||
protected size: number;
|
protected size: number;
|
||||||
|
protected stats: WeaponStats;
|
||||||
|
|
||||||
constructor(world: World) {
|
constructor(world: World, stats: WeaponStats) {
|
||||||
this.player = world.player;
|
this.player = world.player;
|
||||||
this.world = world;
|
this.world = world;
|
||||||
|
this.stats = stats;
|
||||||
}
|
}
|
||||||
|
|
||||||
act() {
|
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 shootInterval: number;
|
||||||
private shootCooldown: number = 0;
|
private shootCooldown: number = 0;
|
||||||
@@ -64,7 +72,8 @@ export class HomingPistol extends BasicWeapon {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private createProjectile(): boolean {
|
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) {
|
if(closestTargetTo !== undefined && closestTargetTo[1] !== undefined) {
|
||||||
let stats = new ProjectileStats(5, 1, 5, 5)
|
let stats = new ProjectileStats(5, 1, 5, 5)
|
||||||
let projectile = HomingProjectile.createHomingProjectile(this.world, this.getPosition(), this.player, closestTargetTo[1]!, stats, 'yellow')
|
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) {
|
if(!offset) {
|
||||||
offset = new Vector(5, 5)
|
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.offset = offset;
|
||||||
pistol.size = 5;
|
pistol.size = 5;
|
||||||
pistol.color = 'yellow';
|
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 shootInterval: number;
|
||||||
private shootCooldown: number = 0;
|
private shootCooldown: number = 0;
|
||||||
@@ -109,7 +119,8 @@ export class Pistol extends BasicWeapon {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private createProjectile(): boolean {
|
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) {
|
if(closestTargetTo !== undefined && closestTargetTo[1] !== undefined) {
|
||||||
let stats = new ProjectileStats(2, 1, 5, 5)
|
let stats = new ProjectileStats(2, 1, 5, 5)
|
||||||
let projectile = StraightProjectile.createStraightProjectile(this.world, this.getPosition(), closestTargetTo[1]!.getPosition(), this.player, stats, 'pink')
|
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) {
|
if(!offset) {
|
||||||
offset = new Vector(5, 5)
|
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.offset = offset;
|
||||||
pistol.size = 5;
|
pistol.size = 5;
|
||||||
pistol.color = 'brown';
|
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
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user