From da99dc988370add0e7b644d3892bbb3223a86493 Mon Sep 17 00:00:00 2001 From: Renge Date: Sun, 24 Apr 2022 22:26:35 -0400 Subject: [PATCH] feat: implemented snake ai --- src/shattered_sword/AI/EnemyStates/Alert.ts | 2 +- .../AI/EnemyStates/SnakeAttack.ts | 47 +++++++++++++++++++ src/shattered_sword/AI/SnakeAI.ts | 10 ++++ src/shattered_sword/Scenes/GameLevel.ts | 3 +- src/shattered_sword/Scenes/Tutorial.ts | 14 +----- 5 files changed, 62 insertions(+), 14 deletions(-) create mode 100644 src/shattered_sword/AI/EnemyStates/SnakeAttack.ts create mode 100644 src/shattered_sword/AI/SnakeAI.ts diff --git a/src/shattered_sword/AI/EnemyStates/Alert.ts b/src/shattered_sword/AI/EnemyStates/Alert.ts index 16d6e44..2803807 100644 --- a/src/shattered_sword/AI/EnemyStates/Alert.ts +++ b/src/shattered_sword/AI/EnemyStates/Alert.ts @@ -12,6 +12,7 @@ export default class Alert extends EnemyState { let position = this.parent.getPlayerPosition(); if (position) { this.parent.velocity.x = this.parent.maxSpeed * Math.sign(position.x - this.owner.position.x); + this.parent.direction = this.parent.velocity.x >= 0 ? 1 : -1; if (this.parent.attackTimer.isStopped() && this.owner.position.distanceTo(position)<=32) { this.finished(EnemyStates.ATTACK); } @@ -21,7 +22,6 @@ export default class Alert extends EnemyState { this.finished(EnemyStates.PATROL); } - this.parent.direction = this.parent.velocity.x >= 0 ? 1 : -1; if (!this.canWalk()) { this.parent.velocity.x = 0; } diff --git a/src/shattered_sword/AI/EnemyStates/SnakeAttack.ts b/src/shattered_sword/AI/EnemyStates/SnakeAttack.ts new file mode 100644 index 0000000..67a5d66 --- /dev/null +++ b/src/shattered_sword/AI/EnemyStates/SnakeAttack.ts @@ -0,0 +1,47 @@ +import EnemyAI, { EnemyStates } from "../EnemyAI"; +import EnemyState from "./EnemyState"; +import AnimatedSprite from "../../../Wolfie2D/Nodes/Sprites/AnimatedSprite"; +import Shape from "../../../Wolfie2D/DataTypes/Shapes/Shape"; +import Vec2 from "../../../Wolfie2D/DataTypes/Vec2"; +import AABB from "../../../Wolfie2D/DataTypes/Shapes/AABB"; +import Sprite from "../../../Wolfie2D/Nodes/Sprites/Sprite"; + +export default class Attack extends EnemyState { + protected charged: string; + protected attacked: string; + + onEnter(options: Record): void { + this.parent.attackTimer.start(); + this.parent.velocity.x = 0; + this.charged = this.owner.id+"charged"; + this.attacked = this.owner.id+"attacked"; + + // TODO replace DYING with CHARGING + (this.owner).animation.play("DYING", false, this.charged); + this.receiver.subscribe(this.charged); + this.receiver.subscribe(this.attacked); + } + + update(deltaT: number): void { + while (this.receiver.hasNextEvent()) { + let event = this.receiver.getNextEvent().type; + switch (event) { + case this.charged: + (this.owner).animation.play("ATTACK", false, this.attacked); + (this.owner.collisionShape).halfSize.x += 3.5; + break; + case this.attacked: + (this.owner.collisionShape).halfSize.x -= 3.5; + this.finished(EnemyStates.ALERT); + break; + } + } + console.log(this.parent.direction); + (this.owner).invertX = this.parent.direction === 1 ? true : false ; + } + + onExit(): Record { + (this.owner).animation.stop(); + return null; + } +} \ No newline at end of file diff --git a/src/shattered_sword/AI/SnakeAI.ts b/src/shattered_sword/AI/SnakeAI.ts new file mode 100644 index 0000000..c925f1b --- /dev/null +++ b/src/shattered_sword/AI/SnakeAI.ts @@ -0,0 +1,10 @@ +import AnimatedSprite from "../../Wolfie2D/Nodes/Sprites/AnimatedSprite"; +import EnemyAI, { EnemyStates } from "./EnemyAI"; +import SnakeAttack from "./EnemyStates/SnakeAttack"; + +export default class SnakeAI extends EnemyAI { + initializeAI(owner: AnimatedSprite, options: Record): void { + super.initializeAI(owner, options); + this.addState(EnemyStates.ATTACK, new SnakeAttack(this, owner)); + } +} \ No newline at end of file diff --git a/src/shattered_sword/Scenes/GameLevel.ts b/src/shattered_sword/Scenes/GameLevel.ts index c0f9e76..9680a95 100644 --- a/src/shattered_sword/Scenes/GameLevel.ts +++ b/src/shattered_sword/Scenes/GameLevel.ts @@ -20,6 +20,7 @@ import WeaponType from "../GameSystems/items/WeaponTypes/WeaponType"; import Weapon from "../GameSystems/items/Weapon"; import BattleManager from "../GameSystems/BattleManager"; import EnemyAI from "../AI/EnemyAI"; +import SnakeAI from "../AI/SnakeAI"; import BattlerAI from "../AI/BattlerAI"; import InventoryManager from "../GameSystems/InventoryManager"; import Item from "../GameSystems/items/Item"; @@ -878,7 +879,7 @@ export default class GameLevel extends Scene { for (let enemy of enemies) { switch (enemy.type) { case "Snake": //Snake enemies drop from sky("trees")? or could just be very abundant - this.addEnemy("Snake", enemy.position.scale(32), EnemyAI, { + this.addEnemy("Snake", enemy.position.scale(32), SnakeAI, { player: this.player, health: 50, tilemap: "Main", diff --git a/src/shattered_sword/Scenes/Tutorial.ts b/src/shattered_sword/Scenes/Tutorial.ts index 80e2e94..da81b1e 100644 --- a/src/shattered_sword/Scenes/Tutorial.ts +++ b/src/shattered_sword/Scenes/Tutorial.ts @@ -1,18 +1,8 @@ -import { TiledTilemapData } from "../../Wolfie2D/DataTypes/Tilesets/TiledData"; import Vec2 from "../../Wolfie2D/DataTypes/Vec2"; -import Debug from "../../Wolfie2D/Debug/Debug"; -import { GameEventType } from "../../Wolfie2D/Events/GameEventType"; import RandomMapGenerator from "../Tools/RandomMapGenerator"; import GameLevel from "./GameLevel"; -import Label from "../../Wolfie2D/Nodes/UIElements/Label"; -import Color from "../../Wolfie2D/Utils/Color"; -import { UIElementType } from "../../Wolfie2D/Nodes/UIElements/UIElementTypes"; -import { Statuses } from "../sword_enums"; -import AABB from "../../Wolfie2D/DataTypes/Shapes/AABB"; -import EnemyAI from "../AI/EnemyAI"; -import BattlerAI from "../AI/BattlerAI"; +import SnakeAI from "../AI/SnakeAI"; import Porcelain from "./Porcelain"; -import MainMenu from "./MainMenu"; export default class Tutorial extends GameLevel { loadScene(): void { @@ -39,7 +29,7 @@ export default class Tutorial extends GameLevel { //spawn snake() if(Math.random() < .0001){ console.log("RANDOM SNAKE!"); - this.addEnemy("Snake", this.player.position.clone().add(new Vec2(0,-320)), EnemyAI, { + this.addEnemy("Snake", this.player.position.clone().add(new Vec2(0,-320)), SnakeAI, { player: this.player, health: 50, tilemap: "Main",