133 lines
3.5 KiB
TypeScript
133 lines
3.5 KiB
TypeScript
import StateMachineAI from "../../Wolfie2D/AI/StateMachineAI";
|
|
import GameNode, { TweenableProperties } from "../../Wolfie2D/Nodes/GameNode";
|
|
import Vec2 from "../../Wolfie2D/DataTypes/Vec2";
|
|
import Sprite from "../../Wolfie2D/Nodes/Sprites/Sprite";
|
|
import OrthogonalTilemap from "../../Wolfie2D/Nodes/Tilemaps/OrthogonalTilemap";
|
|
import { Player_Events } from "../sword_enums";
|
|
import Fall from "./PlayerStates/Fall";
|
|
import Idle from "./PlayerStates/Idle";
|
|
import InAir from "./PlayerStates/InAir";
|
|
import Jump from "./PlayerStates/Jump";
|
|
import Walk from "./PlayerStates/Walk";
|
|
import Debug from "../../Wolfie2D/Debug/Debug";
|
|
|
|
|
|
export enum PlayerStates {
|
|
IDLE = "idle",
|
|
WALK = "walk",
|
|
RUN = "run",
|
|
JUMP = "jump",
|
|
FALL = "fall",
|
|
PREVIOUS = "previous"
|
|
}
|
|
|
|
export enum BuffType {
|
|
ATK = "attack",
|
|
DEF = "defence"
|
|
}
|
|
|
|
type Buff = {
|
|
"type": BuffType,
|
|
"value": number,
|
|
"bonus": boolean,
|
|
}
|
|
|
|
type Buffs = [
|
|
Buff, Buff, Buff
|
|
]
|
|
|
|
|
|
export default class PlayerController extends StateMachineAI {
|
|
protected owner: GameNode;
|
|
velocity: Vec2 = Vec2.ZERO;
|
|
speed: number = 200;
|
|
MIN_SPEED: number = 200;
|
|
MAX_SPEED: number = 300;
|
|
BASE_HP: number = 100;
|
|
MAX_HP: number = 100;
|
|
CURRENT_HP: number = 100;
|
|
BASE_ATK: number = 100;
|
|
MAX_ATK: number = 100;
|
|
CURRENT_ATK: number = 100;
|
|
BASE_DEF: number = 100;
|
|
MAX_DEF: number = 100;
|
|
CURRENT_DEF: number = 100;
|
|
tilemap: OrthogonalTilemap;
|
|
|
|
CURRENT_BUFFS: {
|
|
atk: 0;
|
|
hp: 0;
|
|
def: 0;
|
|
speed: 0;
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
* Returns three legal random generate buffs based on current state
|
|
* @returns Three buffs
|
|
*/
|
|
static getBuffs(): Buffs {
|
|
// TODO
|
|
return undefined;
|
|
}
|
|
|
|
/**
|
|
* Add given buff to the player
|
|
* @param buff Given buff
|
|
*/
|
|
setBuff(buff: Buff): void {
|
|
// TODO
|
|
}
|
|
|
|
//TODO - get the correct tilemap
|
|
initializeAI(owner: GameNode, options: Record<string, any>){
|
|
this.owner = owner;
|
|
|
|
this.initializePlatformer();
|
|
|
|
this.tilemap = this.owner.getScene().getTilemap(options.tilemap) as OrthogonalTilemap;
|
|
|
|
|
|
}
|
|
|
|
initializePlatformer(): void {
|
|
this.speed = 400;
|
|
|
|
let idle = new Idle(this, this.owner);
|
|
this.addState(PlayerStates.IDLE, idle);
|
|
let walk = new Walk(this, this.owner);
|
|
this.addState(PlayerStates.WALK, walk);
|
|
let jump = new Jump(this, this.owner);
|
|
this.addState(PlayerStates.JUMP, jump);
|
|
let fall = new Fall(this, this.owner);
|
|
this.addState(PlayerStates.FALL, fall);
|
|
|
|
this.initialize(PlayerStates.IDLE);
|
|
}
|
|
|
|
changeState(stateName: string): void {
|
|
// If we jump or fall, push the state so we can go back to our current state later
|
|
// unless we're going from jump to fall or something
|
|
if((stateName === PlayerStates.JUMP || stateName === PlayerStates.FALL) && !(this.stack.peek() instanceof InAir)){
|
|
this.stack.push(this.stateMap.get(stateName));
|
|
}
|
|
|
|
super.changeState(stateName);
|
|
}
|
|
|
|
update(deltaT: number): void {
|
|
super.update(deltaT);
|
|
|
|
if(this.currentState instanceof Jump){
|
|
Debug.log("playerstate", "Player State: Jump");
|
|
} else if (this.currentState instanceof Walk){
|
|
Debug.log("playerstate", "Player State: Walk");
|
|
} else if (this.currentState instanceof Idle){
|
|
Debug.log("playerstate", "Player State: Idle");
|
|
} else if(this.currentState instanceof Fall){
|
|
Debug.log("playerstate", "Player State: Fall");
|
|
}
|
|
|
|
}
|
|
} |