added bossAI - untested, changed snake and slime hp, removed skill and backpack from control menu
This commit is contained in:
parent
9e9cb0d1c7
commit
30bcbbae3b
22
src/shattered_sword/AI/BossAI.ts
Normal file
22
src/shattered_sword/AI/BossAI.ts
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
import AnimatedSprite from "../../Wolfie2D/Nodes/Sprites/AnimatedSprite";
|
||||||
|
import EnemyAI, { EnemyStates } from "./EnemyAI";
|
||||||
|
import BossAttack from "./EnemyStates/BossAttack";
|
||||||
|
import Weapon from "../GameSystems/items/Weapon";
|
||||||
|
import Vec2 from "../../Wolfie2D/DataTypes/Vec2";
|
||||||
|
|
||||||
|
|
||||||
|
export default class BossAI extends EnemyAI {
|
||||||
|
|
||||||
|
/** The weapon this AI has */
|
||||||
|
weapon: Weapon;
|
||||||
|
|
||||||
|
initializeAI(owner: AnimatedSprite, options: Record<string, any>): void {
|
||||||
|
super.initializeAI(owner, options);
|
||||||
|
this.addState(EnemyStates.ATTACK, new BossAttack(this, owner));
|
||||||
|
this.weapon = options.weapon;
|
||||||
|
}
|
||||||
|
|
||||||
|
canAttack(position: Vec2): boolean {
|
||||||
|
return this.attackTimer.isStopped() && this.owner.position.distanceTo(position)<=96;
|
||||||
|
}
|
||||||
|
}
|
191
src/shattered_sword/AI/EnemyStates/BossAttack.ts
Normal file
191
src/shattered_sword/AI/EnemyStates/BossAttack.ts
Normal file
|
@ -0,0 +1,191 @@
|
||||||
|
import EnemyAI, { EnemyStates } from "../EnemyAI";
|
||||||
|
import AnimatedSprite from "../../../Wolfie2D/Nodes/Sprites/AnimatedSprite";
|
||||||
|
import Attack from "./Attack";
|
||||||
|
import BossAI from "../BossAI";
|
||||||
|
import Sprite from "../../../Wolfie2D/Nodes/Sprites/Sprite";
|
||||||
|
import Timer from "../../../Wolfie2D/Timing/Timer";
|
||||||
|
import Vec2 from "../../../Wolfie2D/DataTypes/Vec2";
|
||||||
|
import AABB from "../../../Wolfie2D/DataTypes/Shapes/AABB";
|
||||||
|
//TODO - unfinished
|
||||||
|
export default class BossAttack extends Attack {
|
||||||
|
runTimer: Timer;
|
||||||
|
startPosition : Vec2;
|
||||||
|
pauseTimer : Timer;
|
||||||
|
atknum : number;
|
||||||
|
protected velocity: number;
|
||||||
|
protected distance: number;
|
||||||
|
|
||||||
|
onEnter(options: Record<string, any>): void {
|
||||||
|
super.onEnter(options);
|
||||||
|
this.pauseTimer = new Timer(1000);
|
||||||
|
this.pauseTimer.start();
|
||||||
|
this.atknum = Math.floor(Math.random() * 5);
|
||||||
|
|
||||||
|
this.owner.alpha = 1; //unstealth to attack
|
||||||
|
switch( this.atknum){
|
||||||
|
case 0: //archer atk
|
||||||
|
this.pauseTimer = new Timer(1000);
|
||||||
|
this.pauseTimer.start();
|
||||||
|
break;
|
||||||
|
case 1: //assassin atk
|
||||||
|
this.runTimer = new Timer(500);
|
||||||
|
this.pauseTimer = new Timer(1000);
|
||||||
|
this.startPosition = this.owner.position;
|
||||||
|
if(this.parent.getPlayerPosition() !==null)
|
||||||
|
this.owner.position = this.parent.getPlayerPosition().clone().add(new Vec2( (<Sprite>this.parent.player).invertX ? 64 : -64 ,0));
|
||||||
|
|
||||||
|
this.pauseTimer.start();
|
||||||
|
break;
|
||||||
|
case 2: //bull atk
|
||||||
|
this.runTimer = new Timer(2000);
|
||||||
|
break;
|
||||||
|
case 3: //tiger atk
|
||||||
|
this.velocity = 0;
|
||||||
|
break;
|
||||||
|
case 4: //snake atk
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
update(deltaT: number): void {
|
||||||
|
|
||||||
|
//get random atk
|
||||||
|
switch( this.atknum){
|
||||||
|
case 0: //archer atk
|
||||||
|
if(this.pauseTimer.isStopped()){
|
||||||
|
this.parent.direction = this.parent.getPlayerPosition().x - this.owner.position.x >= 0 ? 1 : 0;
|
||||||
|
let dir = this.parent.getPlayerPosition().clone().sub(this.owner.position).normalize();
|
||||||
|
|
||||||
|
(<BossAI>this.parent).weapon.use(this.owner, "enemy", dir.scale(1,0));
|
||||||
|
(<Sprite>this.owner).invertX = this.parent.direction === 1 ? true : false ;
|
||||||
|
this.finished(EnemyStates.ALERT);
|
||||||
|
}
|
||||||
|
super.update(deltaT);
|
||||||
|
break;
|
||||||
|
case 1: //assassin atk
|
||||||
|
if( this.pauseTimer.isStopped()){
|
||||||
|
if (this.runTimer.isStopped() && this.parent.isAttacking || !this.canWalk()) {
|
||||||
|
this.emitter.fireEvent(this.attacked);
|
||||||
|
}
|
||||||
|
while (this.receiver.hasNextEvent()) {
|
||||||
|
let event = this.receiver.getNextEvent().type;
|
||||||
|
switch (event) {
|
||||||
|
case this.charged:
|
||||||
|
this.parent.isCharging = false;
|
||||||
|
this.parent.isAttacking = true;
|
||||||
|
this.runTimer.start();
|
||||||
|
(<AnimatedSprite>this.owner).animation.play("ATTACK", true);
|
||||||
|
if(this.parent.getPlayerPosition() !==null)
|
||||||
|
this.parent.direction = this.parent.getPlayerPosition().x - this.owner.position.x >= 0 ? 1 : 0;
|
||||||
|
break;
|
||||||
|
case this.attacked:
|
||||||
|
this.parent.isAttacking = false;
|
||||||
|
this.finished(EnemyStates.ALERT);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
this.parent.velocity.x = this.parent.direction * 500;
|
||||||
|
(<Sprite>this.owner).invertX = this.parent.direction === 1 ? true : false ;
|
||||||
|
this.owner.alpha = .2;
|
||||||
|
super.update(deltaT);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 2: //bull atk
|
||||||
|
if (this.runTimer.isStopped() && this.parent.isAttacking || !this.canWalk()) {
|
||||||
|
this.emitter.fireEvent(this.attacked);
|
||||||
|
}
|
||||||
|
while (this.receiver.hasNextEvent()) {
|
||||||
|
let event = this.receiver.getNextEvent().type;
|
||||||
|
switch (event) {
|
||||||
|
case this.charged:
|
||||||
|
this.parent.isCharging = false;
|
||||||
|
this.parent.isAttacking = true;
|
||||||
|
this.runTimer.start();
|
||||||
|
(<AnimatedSprite>this.owner).animation.play("ATTACK", true);
|
||||||
|
this.parent.direction = this.parent.getPlayerPosition().x - this.owner.position.x >= 0 ? 1 : 0;
|
||||||
|
break;
|
||||||
|
case this.attacked:
|
||||||
|
this.parent.isAttacking = false;
|
||||||
|
this.finished(EnemyStates.ALERT);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
this.parent.velocity.x = this.parent.direction * 1000;
|
||||||
|
(<Sprite>this.owner).invertX = this.parent.direction === 1 ? true : false ;
|
||||||
|
super.update(deltaT);
|
||||||
|
break;
|
||||||
|
case 3: //tiger atk
|
||||||
|
if (this.parent.isAttacking && this.owner.onGround) {
|
||||||
|
this.emitter.fireEvent(this.attacked);
|
||||||
|
}
|
||||||
|
while (this.receiver.hasNextEvent()) {
|
||||||
|
let event = this.receiver.getNextEvent().type;
|
||||||
|
switch (event) {
|
||||||
|
case this.charged:
|
||||||
|
this.parent.isCharging = false;
|
||||||
|
this.parent.isAttacking = true;
|
||||||
|
(<AnimatedSprite>this.owner).animation.play("ATTACK", true);
|
||||||
|
this.velocity = (this.parent.getPlayerPosition().x - this.owner.position.x)/1.5;
|
||||||
|
this.parent.direction = this.velocity >= 0 ? 1 : 0;
|
||||||
|
this.parent.velocity.y = -800;
|
||||||
|
break;
|
||||||
|
case this.attacked:
|
||||||
|
this.parent.isAttacking = false;
|
||||||
|
this.finished(EnemyStates.ALERT);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
this.parent.velocity.x = this.velocity;
|
||||||
|
(<Sprite>this.owner).invertX = this.parent.direction === 1 ? true : false ;
|
||||||
|
super.update(deltaT);
|
||||||
|
break;
|
||||||
|
case 4: //snake atk
|
||||||
|
while (this.receiver.hasNextEvent()) {
|
||||||
|
let event = this.receiver.getNextEvent().type;
|
||||||
|
switch (event) {
|
||||||
|
case this.charged:
|
||||||
|
this.parent.isCharging = false;
|
||||||
|
this.parent.isAttacking = true;
|
||||||
|
(<AnimatedSprite>this.owner).animation.play("ATTACK", false, this.attacked);
|
||||||
|
(<AABB>this.owner.collisionShape).halfSize.x += 3.5;
|
||||||
|
break;
|
||||||
|
case this.attacked:
|
||||||
|
this.parent.isAttacking = false;
|
||||||
|
(<AABB>this.owner.collisionShape).halfSize.x -= 3.5;
|
||||||
|
this.finished(EnemyStates.ALERT);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
(<Sprite>this.owner).invertX = this.parent.direction === 1 ? true : false ;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
while (this.receiver.hasNextEvent()) {
|
||||||
|
let event = this.receiver.getNextEvent().type;
|
||||||
|
switch (event) {
|
||||||
|
case this.charged:
|
||||||
|
this.parent.isCharging = false;
|
||||||
|
this.parent.isAttacking = true;
|
||||||
|
(<AnimatedSprite>this.owner).animation.play("ATTACK", false, this.attacked);
|
||||||
|
(<AABB>this.owner.collisionShape).halfSize.x += 3.5;
|
||||||
|
break;
|
||||||
|
case this.attacked:
|
||||||
|
this.parent.isAttacking = false;
|
||||||
|
(<AABB>this.owner.collisionShape).halfSize.x -= 3.5;
|
||||||
|
this.finished(EnemyStates.ALERT);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
(<Sprite>this.owner).invertX = this.parent.direction === 1 ? true : false ;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
onExit(): Record<string, any> {
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
|
@ -3,6 +3,7 @@ import EnemyAI, { EnemyStates } from "./EnemyAI";
|
||||||
import SlimeAttack from "./EnemyStates/SlimeAttack";
|
import SlimeAttack from "./EnemyStates/SlimeAttack";
|
||||||
|
|
||||||
export default class SlimeAI extends EnemyAI {
|
export default class SlimeAI extends EnemyAI {
|
||||||
|
speed: number = 15;
|
||||||
initializeAI(owner: AnimatedSprite, options: Record<string, any>): void {
|
initializeAI(owner: AnimatedSprite, options: Record<string, any>): void {
|
||||||
super.initializeAI(owner, options);
|
super.initializeAI(owner, options);
|
||||||
this.addState(EnemyStates.ATTACK, new SlimeAttack(this, owner));
|
this.addState(EnemyStates.ATTACK, new SlimeAttack(this, owner));
|
||||||
|
|
|
@ -296,6 +296,9 @@ export default class GameLevel extends Scene {
|
||||||
|
|
||||||
let node = this.sceneGraph.getNode(event.data.get("owner"));//get enemy id
|
let node = this.sceneGraph.getNode(event.data.get("owner"));//get enemy id
|
||||||
//remove enemy from enemies
|
//remove enemy from enemies
|
||||||
|
//console.log(node);
|
||||||
|
//console.log("enemy killed at",node.position);
|
||||||
|
|
||||||
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"));
|
||||||
//give the player the exp value of the enemy killed
|
//give the player the exp value of the enemy killed
|
||||||
|
@ -861,14 +864,12 @@ export default class GameLevel extends Scene {
|
||||||
|
|
||||||
//TODO - give each enemy unique weapon
|
//TODO - give each enemy unique weapon
|
||||||
protected initializeEnemies( enemies: Enemy[]){
|
protected initializeEnemies( enemies: Enemy[]){
|
||||||
|
|
||||||
let pistol = this.createWeapon("pistol");
|
|
||||||
|
|
||||||
for (let enemy of enemies) {
|
for (let enemy of enemies) {
|
||||||
switch (enemy.type) {
|
switch (enemy.type) {
|
||||||
|
|
||||||
/*
|
/*
|
||||||
case "Snake":
|
case "Archer":
|
||||||
this.addEnemy("Archer", enemy.position.scale(32), ArcherAI, {
|
this.addEnemy("Archer", enemy.position.scale(32), ArcherAI, {
|
||||||
player: this.player,
|
player: this.player,
|
||||||
health: 50,
|
health: 50,
|
||||||
|
@ -876,14 +877,14 @@ export default class GameLevel extends Scene {
|
||||||
size: new Vec2(14,10),
|
size: new Vec2(14,10),
|
||||||
offset : new Vec2(0, 22),
|
offset : new Vec2(0, 22),
|
||||||
exp: 50,
|
exp: 50,
|
||||||
weapon: pistol
|
weapon: this.createWeapon("pistol");
|
||||||
})
|
})
|
||||||
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
|
||||||
this.addEnemy("Snake", enemy.position.scale(32), SnakeAI, {
|
this.addEnemy("Snake", enemy.position.scale(32), SnakeAI, {
|
||||||
player: this.player,
|
player: this.player,
|
||||||
health: 50,
|
health: 65,
|
||||||
tilemap: "Main",
|
tilemap: "Main",
|
||||||
size: new Vec2(14,10),
|
size: new Vec2(14,10),
|
||||||
offset : new Vec2(0, 22),
|
offset : new Vec2(0, 22),
|
||||||
|
@ -914,7 +915,7 @@ export default class GameLevel extends Scene {
|
||||||
case "black_pudding":
|
case "black_pudding":
|
||||||
this.addEnemy("black_pudding", enemy.position.scale(32), SlimeAI, {
|
this.addEnemy("black_pudding", enemy.position.scale(32), SlimeAI, {
|
||||||
player: this.player,
|
player: this.player,
|
||||||
health: 200,
|
health: 140 + (<PlayerController>this.player._ai).level*2,
|
||||||
tilemap: "Main",
|
tilemap: "Main",
|
||||||
//actions:actions,
|
//actions:actions,
|
||||||
scale: .25,
|
scale: .25,
|
||||||
|
|
|
@ -120,16 +120,18 @@ export default class MainMenu extends Scene {
|
||||||
lc.textColor = Color.WHITE;
|
lc.textColor = Color.WHITE;
|
||||||
const rc = <Label>this.add.uiElement(UIElementType.LABEL, "control", {position: new Vec2(center.x, center.y - 100), text: "W/S - Look Up/Down"});
|
const rc = <Label>this.add.uiElement(UIElementType.LABEL, "control", {position: new Vec2(center.x, center.y - 100), text: "W/S - Look Up/Down"});
|
||||||
rc.textColor = Color.WHITE;
|
rc.textColor = Color.WHITE;
|
||||||
const wasd = <Label>this.add.uiElement(UIElementType.LABEL, "control", {position: new Vec2(center.x, center.y - 50), text: "J/Z/Enter - Confirm Attack"});
|
const wasd = <Label>this.add.uiElement(UIElementType.LABEL, "control", {position: new Vec2(center.x, center.y - 50), text: "J/Z/Enter - Attack"});
|
||||||
wasd.textColor = Color.WHITE;
|
wasd.textColor = Color.WHITE;
|
||||||
|
|
||||||
const e = <Label>this.add.uiElement(UIElementType.LABEL, "control", {position: new Vec2(center.x, center.y), text: "SPACE/X - Jump"});
|
const e = <Label>this.add.uiElement(UIElementType.LABEL, "control", {position: new Vec2(center.x, center.y), text: "SPACE/X - Jump"});
|
||||||
e.textColor = Color.WHITE;
|
e.textColor = Color.WHITE;
|
||||||
const q = <Label>this.add.uiElement(UIElementType.LABEL, "control", {position: new Vec2(center.x, center.y + 50), text: "K/C - Dash"});
|
const q = <Label>this.add.uiElement(UIElementType.LABEL, "control", {position: new Vec2(center.x, center.y + 50), text: "K/C - Dash"});
|
||||||
q.textColor = Color.WHITE;
|
q.textColor = Color.WHITE;
|
||||||
const oneTwo = <Label>this.add.uiElement(UIElementType.LABEL, "control", {position: new Vec2(center.x, center.y + 100), text: "L/V - Use Skill"});
|
//const oneTwo = <Label>this.add.uiElement(UIElementType.LABEL, "control", {position: new Vec2(center.x, center.y + 100), text: "L/V - Use Skill"});
|
||||||
|
const oneTwo = <Label>this.add.uiElement(UIElementType.LABEL, "control", {position: new Vec2(center.x, center.y + 100), text: ""});
|
||||||
oneTwo.textColor = Color.WHITE
|
oneTwo.textColor = Color.WHITE
|
||||||
const zx = <Label>this.add.uiElement(UIElementType.LABEL, "control", {position: new Vec2(center.x, center.y + 150), text: "I/B - open Backpack"});
|
//const zx = <Label>this.add.uiElement(UIElementType.LABEL, "control", {position: new Vec2(center.x, center.y + 150), text: "I/B - open Backpack"});
|
||||||
|
const zx = <Label>this.add.uiElement(UIElementType.LABEL, "control", {position: new Vec2(center.x, center.y + 150), text: ""});
|
||||||
zx.textColor = Color.WHITE;
|
zx.textColor = Color.WHITE;
|
||||||
const tb = <Label>this.add.uiElement(UIElementType.LABEL, "control", {position: new Vec2(center.x, center.y + 200), text: "ESC - Pause"});
|
const tb = <Label>this.add.uiElement(UIElementType.LABEL, "control", {position: new Vec2(center.x, center.y + 200), text: "ESC - Pause"});
|
||||||
tb.textColor = Color.WHITE;
|
tb.textColor = Color.WHITE;
|
||||||
|
|
Loading…
Reference in New Issue
Block a user