added player shield and exp

This commit is contained in:
OfficialCHenry 2022-04-18 23:52:25 -04:00
parent 5520e91336
commit c87c5d9af0
6 changed files with 86 additions and 24 deletions

View File

@ -63,6 +63,8 @@ export default class EnemyAI extends StateMachineGoapAI implements BattlerAI {
direction: number; //1 for right, -1 for left direction: number; //1 for right, -1 for left
exp_val: number =0; //exp value to give player when this dies
initializeAI(owner: AnimatedSprite, options: Record<string, any>): void { initializeAI(owner: AnimatedSprite, options: Record<string, any>): void {
this.owner = owner; this.owner = owner;
@ -102,6 +104,9 @@ export default class EnemyAI extends StateMachineGoapAI implements BattlerAI {
this.direction = 1; //default moving to the right this.direction = 1; //default moving to the right
//exp value
this.exp_val = options.exp;
} }
activate(options: Record<string, any>): void { } activate(options: Record<string, any>): void { }

View File

@ -2,13 +2,14 @@
import GameNode from "../../Wolfie2D/Nodes/GameNode"; import GameNode from "../../Wolfie2D/Nodes/GameNode";
import BattlerAI from "../AI/BattlerAI"; import BattlerAI from "../AI/BattlerAI";
import Weapon from "./items/Weapon"; import Weapon from "./items/Weapon";
import PlayerController from "../Player/PlayerController";
export default class BattleManager { export default class BattleManager {
players: Array<BattlerAI>; players: Array<BattlerAI>;
enemies: Array<BattlerAI>; enemies: Array<BattlerAI>;
handleInteraction(attackerType: string, weapon: Weapon) { handleInteraction(attackerType: string, weapon: Weapon, user?: GameNode) {
//may be unneeded since we are controlling the player - //may be unneeded since we are controlling the player -
//we determine enemy collision there //we determine enemy collision there
@ -26,7 +27,7 @@ export default class BattleManager {
// Check for collision with player // Check for collision with player
for (let player of this.players) { for (let player of this.players) {
if (weapon.hits(player.owner)) { if (weapon.hits(player.owner)) {
player.damage(weapon.type.damage); (<PlayerController>player).damage(weapon.type.damage, user);
} }
} }
} }

View File

@ -67,7 +67,7 @@ export default class Weapon extends Item {
this.type.doAnimation(user, direction, this.EXTRA_RANGE, ...this.assets); this.type.doAnimation(user, direction, this.EXTRA_RANGE, ...this.assets);
// Apply damage // Apply damage
this.battleManager.handleInteraction(userType, this); this.battleManager.handleInteraction(userType, this, user);
// Reset the cooldown timer // Reset the cooldown timer
this.cooldownTimer.start(); this.cooldownTimer.start();

View File

@ -17,6 +17,7 @@ import MathUtils from "../../Wolfie2D/Utils/MathUtils";
import Weapon from "../GameSystems/items/Weapon"; import Weapon from "../GameSystems/items/Weapon";
import AnimatedSprite from "../../Wolfie2D/Nodes/Sprites/AnimatedSprite"; import AnimatedSprite from "../../Wolfie2D/Nodes/Sprites/AnimatedSprite";
import InputWrapper from "../Tools/InputWrapper"; import InputWrapper from "../Tools/InputWrapper";
import EnemyAI from "../AI/EnemyAI";
export enum PlayerType { export enum PlayerType {
@ -70,6 +71,9 @@ export default class PlayerController extends StateMachineAI implements BattlerA
CURRENT_DEF: number = 100; CURRENT_DEF: number = 100;
CURRENT_EXP : number = 0; CURRENT_EXP : number = 0;
MAX_EXP : number = 100; MAX_EXP : number = 100;
//shield buff
CURRENT_SHIELD : number =0;
MAX_SHIELD : number = 20;
invincible : boolean = false; invincible : boolean = false;
@ -96,14 +100,43 @@ export default class PlayerController extends StateMachineAI implements BattlerA
} }
// TODO - // TODO - figure out attacker
damage(damage: number): void { damage(damage: number, attacker?: GameNode): void {
if( !this.invincible){ if( !this.invincible){
(<AnimatedSprite>this.owner).animation.play("HURT", false); //shield absorbs the damage and sends dmg back to attacker
this.CURRENT_HP -= damage; if(this.CURRENT_SHIELD > 0){
let newshield = Math.max(0, this.CURRENT_SHIELD - damage ); //calculate the new shield value
(<EnemyAI>attacker._ai).damage(this.CURRENT_SHIELD - newshield); //damage the attacker the dmg taken to shield
this.CURRENT_SHIELD = newshield; //update shield value
}
else{
(<AnimatedSprite>this.owner).animation.play("HURT", false);
this.CURRENT_HP -= damage;
}
} }
} }
/**
* gives the player a certain amount of shield
* @param shield amount of shield to add to player
*/
addShield(shield : number){
this.CURRENT_SHIELD = (this.CURRENT_SHIELD + shield) % this.MAX_SHIELD;
}
/**
* gives the player exp
* @param exp amount of exp to give the player
*/
giveExp(exp: number){
this.CURRENT_EXP += exp;
//if > than max exp level up (give buff)
if(this.CURRENT_EXP >= this.MAX_EXP){
this.CURRENT_EXP -= this.MAX_EXP;
this.emitter.fireEvent(Player_Events.GIVE_BUFF);
}
}
//TODO - balance buff value generation //TODO - balance buff value generation
/** /**
* returns an array of three randomly generated buffs * returns an array of three randomly generated buffs

View File

@ -66,8 +66,11 @@ export default class GameLevel extends Scene {
// Health UI // Health UI
protected healthLabel: Label; protected healthLabel: Label;
//may need exp label //exp label
//may need mp label protected expLabel : Label;
//shield label
protected shieldLabel : Label;
//seed UI //seed UI
protected seedLabel: Label; protected seedLabel: Label;
@ -205,9 +208,11 @@ export default class GameLevel extends Scene {
//remove enemy from enemies //remove enemy from enemies
this.enemies = this.enemies.filter(item => item !== event.data.get("ai")); this.enemies = this.enemies.filter(item => item !== event.data.get("ai"));
this.battleManager.removeEnemy(event.data.get("ai")); this.battleManager.removeEnemy(event.data.get("ai"));
node.destroy(); //give the player the exp value of the enemy killed
(<PlayerController>this.player._ai).giveExp(event.data.get("ai").exp_val);
node.destroy(); //destroy enemy node
//TODO - this is for testing, add some chance here later //TODO - this is for testing, add some chance here later
this.emitter.fireEvent(Player_Events.GIVE_BUFF); //this.emitter.fireEvent(Player_Events.GIVE_BUFF);
break; break;
case Player_Events.GIVE_BUFF: case Player_Events.GIVE_BUFF:
@ -251,7 +256,19 @@ export default class GameLevel extends Scene {
//update health UI //update health UI
let playerAI = (<PlayerController>this.player.ai); let playerAI = (<PlayerController>this.player.ai);
this.healthLabel.text = "Player Health: "+ playerAI.CURRENT_HP +'/' + (playerAI.MAX_HP +playerAI.CURRENT_BUFFS.hp ); this.healthLabel.text = "Health: "+ playerAI.CURRENT_HP +'/' + (playerAI.MAX_HP +playerAI.CURRENT_BUFFS.hp );
this.healthLabel.sizeToText();
//update shield ui
this.shieldLabel.text = "Shield: "+ playerAI.CURRENT_SHIELD +'/' + (playerAI.MAX_SHIELD);
this.shieldLabel.sizeToText();
//update exp ui
this.expLabel.text = "EXP: "+ playerAI.CURRENT_EXP +'/' + (playerAI.MAX_EXP);
this.expLabel.sizeToText();
//handle collisions - may be in battle manager instead //handle collisions - may be in battle manager instead
@ -354,6 +371,16 @@ export default class GameLevel extends Scene {
this.healthLabel.textColor = Color.WHITE; this.healthLabel.textColor = Color.WHITE;
this.healthLabel.font = "PixelSimple"; this.healthLabel.font = "PixelSimple";
this.shieldLabel = <Label> this.add.uiElement(UIElementType.LABEL, "UI",{position: new Vec2(120, 50), text: "shield: "+ (<PlayerController>this.player.ai).CURRENT_SHIELD });
this.shieldLabel.textColor = Color.WHITE;
this.shieldLabel.font = "PixelSimple";
this.expLabel = <Label> this.add.uiElement(UIElementType.LABEL, "UI",{position: new Vec2(120, 70), text: "EXP: "+ (<PlayerController>this.player.ai).CURRENT_EXP });
this.expLabel.textColor = Color.WHITE;
this.expLabel.font = "PixelSimple";
//seed label //seed label
//worldsize.x doesnt work how i want it to //worldsize.x doesnt work how i want it to
this.seedLabel = <Label> this.add.uiElement(UIElementType.LABEL, "UI",{position: new Vec2(this.worldSize.x - 50, 30), text: "Seed: "+ this.randomSeed }); this.seedLabel = <Label> this.add.uiElement(UIElementType.LABEL, "UI",{position: new Vec2(this.worldSize.x - 50, 30), text: "Seed: "+ this.randomSeed });
@ -424,11 +451,6 @@ export default class GameLevel extends Scene {
//TODO - //TODO -
//determine button location //determine button location
this.buffButton1 = <Button>this.add.uiElement(UIElementType.BUTTON, "buffLayer", {position: new Vec2(100, 250),text:"buffButton1"}); this.buffButton1 = <Button>this.add.uiElement(UIElementType.BUTTON, "buffLayer", {position: new Vec2(100, 250),text:"buffButton1"});
console.log("buffbutton pos:"+this.buffButton1.position);
//this.buffButton1.position = this.buffButton1.position.clone().scale(this.viewport.getZoomLevel());
this.buffButton1
console.log("buffbutton pos:"+this.buffButton1.position);
this.buffButton1.size.set(180,200); this.buffButton1.size.set(180,200);
this.buffButton1.borderWidth = 5; this.buffButton1.borderWidth = 5;
this.buffButton1.borderColor = Color.RED; this.buffButton1.borderColor = Color.RED;
@ -439,8 +461,6 @@ export default class GameLevel extends Scene {
this.buffButton2 = <Button>this.add.uiElement(UIElementType.BUTTON, "buffLayer", {position: new Vec2(300, 250),text:"buffButton1"}); this.buffButton2 = <Button>this.add.uiElement(UIElementType.BUTTON, "buffLayer", {position: new Vec2(300, 250),text:"buffButton1"});
//this.buffButton2.setPosition(this.buffButton1.position.clone().scale(this.viewport.getZoomLevel()));
//this.buffButton2.position = this.buffButton2.position.clone().scale(this.viewport.getZoomLevel());
this.buffButton2.size.set(180,200); this.buffButton2.size.set(180,200);
this.buffButton2.borderWidth = 5; this.buffButton2.borderWidth = 5;
this.buffButton2.borderColor = Color.RED; this.buffButton2.borderColor = Color.RED;
@ -450,8 +470,6 @@ export default class GameLevel extends Scene {
this.buffButton2.fontSize = 20; this.buffButton2.fontSize = 20;
this.buffButton3 = <Button>this.add.uiElement(UIElementType.BUTTON, "buffLayer", {position: new Vec2(500, 250),text:"buffButton1"}); this.buffButton3 = <Button>this.add.uiElement(UIElementType.BUTTON, "buffLayer", {position: new Vec2(500, 250),text:"buffButton1"});
//this.buffButton3.setPosition(this.buffButton1.position.clone().scale(this.viewport.getZoomLevel()));
//this.buffButton3.position = this.buffButton3.position.clone().scale(this.viewport.getZoomLevel());
this.buffButton3.size.set(180,200); this.buffButton3.size.set(180,200);
this.buffButton3.borderWidth = 5; this.buffButton3.borderWidth = 5;
this.buffButton3.borderColor = Color.RED; this.buffButton3.borderColor = Color.RED;
@ -600,7 +618,8 @@ export default class GameLevel extends Scene {
//actions:actions, //actions:actions,
goal: Statuses.REACHED_GOAL, goal: Statuses.REACHED_GOAL,
//TODO - test Add collision shape for each enemy type //TODO - test Add collision shape for each enemy type
//size: new AABB(Vec2.ZERO, new Vec2(16, 25)) //size: new AABB(Vec2.ZERO, new Vec2(16, 25)),
exp: 100
}) })
break; break;
case "Snake": //Snake enemies drop from sky("trees")? or could just be very abundant case "Snake": //Snake enemies drop from sky("trees")? or could just be very abundant
@ -611,7 +630,8 @@ export default class GameLevel extends Scene {
//actions:actions, //actions:actions,
goal: Statuses.REACHED_GOAL, goal: Statuses.REACHED_GOAL,
size: new Vec2(16,16), size: new Vec2(16,16),
offset : new Vec2(0, 16) offset : new Vec2(0, 16),
exp: 50
}) })
break; break;
case "Tiger": //Tiger can be miniboss for now? case "Tiger": //Tiger can be miniboss for now?
@ -621,6 +641,7 @@ export default class GameLevel extends Scene {
tilemap: "Main", tilemap: "Main",
//actions:actions, //actions:actions,
goal: Statuses.REACHED_GOAL, goal: Statuses.REACHED_GOAL,
exp: 100
}) })
break; break;
@ -631,6 +652,7 @@ export default class GameLevel extends Scene {
tilemap: "Main", tilemap: "Main",
//actions:actions, //actions:actions,
goal: Statuses.REACHED_GOAL, goal: Statuses.REACHED_GOAL,
exp: 50
}) })
break; break;
case "black_pudding": case "black_pudding":
@ -642,7 +664,8 @@ export default class GameLevel extends Scene {
goal: Statuses.REACHED_GOAL, goal: Statuses.REACHED_GOAL,
scale: .25, scale: .25,
size: new Vec2(16,16), size: new Vec2(16,16),
offset : new Vec2(0,0) offset : new Vec2(0,0),
exp: 50
}) })
break; break;
default: default: