diff --git a/dist/shattered_sword_assets/jsons/forest_template.json b/dist/shattered_sword_assets/jsons/forest_template.json index cdbf870..96b9c75 100644 --- a/dist/shattered_sword_assets/jsons/forest_template.json +++ b/dist/shattered_sword_assets/jsons/forest_template.json @@ -30,13 +30,13 @@ "y": 19 }, { - "type": "test_dummy", + "type": "black_pudding", "x": 7, "y": 19, "possibility": 1 }, { - "type": "snake", + "type": "Snake", "x": 1, "y": 10, "possibility": 1 @@ -80,37 +80,37 @@ ], "sprites": [ { - "type": "test_dummy", + "type": "black_pudding", "x": 1, "y": 10, "possibility": 1 }, { - "type": "snake", + "type": "Snake", "x": 12, "y": 12, "possibility": 1 }, { - "type": "snake", + "type": "Snake", "x": 18, "y": 15, "possibility": 1 }, { - "type": "snake", + "type": "Snake", "x": 14, "y": 16, "possibility": 1 }, { - "type": "snake", + "type": "Snake", "x": 24, "y": 17, "possibility": 1 }, { - "type": "snake", + "type": "Snake", "x": 6, "y": 17, "possibility": 1 @@ -139,51 +139,51 @@ ], "sprites": [ { - "type": "test_dummy", + "type": "black_pudding", "x": 1, "y": 10, "possibility": 1 }, { - "type": "snake", + "type": "Snake", "x": 5, - "y": 15, + "y": 14, "possibility": 1 }, { - "type": "snake", + "type": "Snake", "x": 14, "y": 10, "possibility": 1 }, { - "type": "snake", + "type": "Snake", "x": 11, - "y": 13, + "y": 12, "possibility": 1 }, { - "type": "snake", + "type": "Snake", "x": 18, "y": 12, "possibility": 1 }, { - "type": "snake", + "type": "Snake", "x": 23, "y": 15, "possibility": 1 }, { - "type": "snake", + "type": "Snake", "x": 16, - "y": 17, + "y": 16, "possibility": 1 }, { - "type": "snake", + "type": "Snake", "x": 27, - "y": 18, + "y": 16, "possibility": 1 } ] @@ -210,37 +210,37 @@ ], "sprites": [ { - "type": "test_dummy", + "type": "black_pudding", "x": 1, "y": 10, "possibility": 1 }, { - "type": "snake", + "type": "Snake", "x": 5, - "y": 14, + "y": 10, "possibility": 1 }, { - "type": "snake", + "type": "Snake", "x": 11, "y": 12, "possibility": 1 }, { - "type": "snake", + "type": "Snake", "x": 12, "y": 9, "possibility": 1 }, { - "type": "snake", + "type": "Snake", "x": 15, "y": 15, "possibility": 1 }, { - "type": "snake", + "type": "Snake", "x": 25, "y": 14, "possibility": 1 @@ -270,37 +270,37 @@ ], "sprites": [ { - "type": "test_dummy", + "type": "black_pudding", "x": 1, "y": 10, "possibility": 1 }, { - "type": "snake", + "type": "Snake", "x": 9, "y": 10, "possibility": 1 }, { - "type": "test_dummy", + "type": "black_pudding", "x": 9, "y": 5, "possibility": 1 }, { - "type": "test_dummy", + "type": "black_pudding", "x": 15, "y": 18, "possibility": 1 }, { - "type": "test_dummy", + "type": "black_pudding", "x": 23, "y": 16, "possibility": 1 }, { - "type": "test_dummy", + "type": "black_pudding", "x": 27, "y": 14, "possibility": 1 @@ -329,37 +329,37 @@ ], "sprites": [ { - "type": "test_dummy", + "type": "black_pudding", "x": 1, "y": 10, "possibility": 1 }, { - "type": "snake", + "type": "Snake", "x": 7, "y": 13, "possibility": 1 }, { - "type": "snake", + "type": "Snake", "x": 13, "y": 12, "possibility": 1 }, { - "type": "snake", + "type": "Snake", "x": 18, "y": 14, "possibility": 1 }, { - "type": "snake", + "type": "Snake", "x": 13, "y": 16, "possibility": 1 }, { - "type": "snake", + "type": "Snake", "x": 23, "y": 13, "possibility": 1 diff --git a/dist/shattered_sword_assets/spritesheets/Hiro.json b/dist/shattered_sword_assets/spritesheets/Hiro.json index 25d380a..d5b285f 100644 --- a/dist/shattered_sword_assets/spritesheets/Hiro.json +++ b/dist/shattered_sword_assets/spritesheets/Hiro.json @@ -208,7 +208,7 @@ }, { "name": "HURT", - "repeat": true, + "repeat": false, "frames": [ { "index": 0, diff --git a/dist/shattered_sword_assets/spritesheets/black_pudding.json b/dist/shattered_sword_assets/spritesheets/black_pudding.json index 8eb5846..9d7b7f1 100644 --- a/dist/shattered_sword_assets/spritesheets/black_pudding.json +++ b/dist/shattered_sword_assets/spritesheets/black_pudding.json @@ -11,7 +11,7 @@ "bottomBuffer": 0, "animations": [ { - "name": "Idle", + "name": "IDLE", "repeat": true, "frames": [ { @@ -64,6 +64,244 @@ } ] }, + { + "name": "WALK", + "repeat": true, + "frames": [ + { + "index": 60, + "duration": 4 + }, + { + "index": 61, + "duration": 4 + }, + { + "index": 62, + "duration": 4 + }, + { + "index": 63, + "duration": 4 + }, + { + "index": 64, + "duration": 4 + }, + { + "index": 65, + "duration": 4 + }, + { + "index": 66, + "duration": 4 + }, + { + "index": 67, + "duration": 4 + }, + { + "index": 68, + "duration": 4 + }, + { + "index": 69, + "duration": 4 + } + ] + }, + { + "name": "ATTACK", + "repeat": true, + "frames": [ + { + "index": 120, + "duration": 4 + }, + { + "index": 121, + "duration": 4 + }, + { + "index": 122, + "duration": 4 + }, + { + "index": 123, + "duration": 4 + }, + { + "index": 124, + "duration": 4 + }, + { + "index": 125, + "duration": 4 + }, + { + "index": 126, + "duration": 4 + }, + { + "index": 127, + "duration": 4 + }, + { + "index": 128, + "duration": 4 + }, + { + "index": 129, + "duration": 4 + }, + { + "index": 130, + "duration": 4 + }, + { + "index": 131, + "duration": 4 + }, + { + "index": 132, + "duration": 4 + }, + { + "index": 133, + "duration": 4 + }, + { + "index": 134, + "duration": 4 + }, + { + "index": 135, + "duration": 4 + }, + { + "index": 136, + "duration": 4 + }, + { + "index": 137, + "duration": 4 + }, + { + "index": 138, + "duration": 4 + }, + { + "index": 139, + "duration": 4 + }, + { + "index": 140, + "duration": 4 + }, + { + "index": 141, + "duration": 4 + }, + { + "index": 142, + "duration": 4 + }, + { + "index": 143, + "duration": 4 + }, + { + "index": 144, + "duration": 4 + }, + { + "index": 145, + "duration": 4 + }, + { + "index": 146, + "duration": 4 + }, + { + "index": 147, + "duration": 4 + }, + { + "index": 148, + "duration": 4 + }, + { + "index": 149, + "duration": 4 + } + ] + }, + { + "name": "HURT", + "repeat": false, + "frames": [ + { + "index": 180, + "duration": 4 + }, + { + "index": 181, + "duration": 4 + }, + { + "index": 182, + "duration": 4 + }, + { + "index": 183, + "duration": 4 + }, + { + "index": 184, + "duration": 4 + }, + { + "index": 185, + "duration": 4 + }, + { + "index": 186, + "duration": 4 + }, + { + "index": 187, + "duration": 4 + }, + { + "index": 188, + "duration": 4 + }, + { + "index": 189, + "duration": 4 + }, + { + "index": 190, + "duration": 4 + }, + { + "index": 191, + "duration": 4 + }, + { + "index": 192, + "duration": 4 + }, + { + "index": 193, + "duration": 4 + }, + { + "index": 194, + "duration": 4 + } + ] + }, { "name": "Moving Left", "repeat": true, @@ -541,7 +779,7 @@ ] }, { - "name": "Dying", + "name": "DYING", "repeat": false, "frames": [ { @@ -587,7 +825,7 @@ ] }, { - "name": "Dead", + "name": "DEAD", "repeat": false, "frames": [ { diff --git a/src/shattered_sword/AI/BattlerAI.ts b/src/shattered_sword/AI/BattlerAI.ts index d862308..43cadd7 100644 --- a/src/shattered_sword/AI/BattlerAI.ts +++ b/src/shattered_sword/AI/BattlerAI.ts @@ -10,4 +10,6 @@ export default interface BattlerAI extends AI { CURRENT_HP: number; //changed health to CURRENT_HP damage: (damage: number) => void; -} \ No newline at end of file +} + + diff --git a/src/shattered_sword/AI/EnemyAI.ts b/src/shattered_sword/AI/EnemyAI.ts index a8cd709..4d22b7d 100644 --- a/src/shattered_sword/AI/EnemyAI.ts +++ b/src/shattered_sword/AI/EnemyAI.ts @@ -108,7 +108,7 @@ export default class EnemyAI extends StateMachineGoapAI implements BattlerAI { damage(damage: number): void { this.CURRENT_HP -= damage; //TODO - - this.owner.animation.play("HURT"); + this.owner.animation.play("HURT",false); console.log(damage +" damage taken, "+this.CURRENT_HP+" hp left"); // If we're low enough, add Low Health status to enemy diff --git a/src/shattered_sword/AI/EnemyStates/OnGround.ts b/src/shattered_sword/AI/EnemyStates/OnGround.ts deleted file mode 100644 index 6fddba2..0000000 --- a/src/shattered_sword/AI/EnemyStates/OnGround.ts +++ /dev/null @@ -1,27 +0,0 @@ -import GameEvent from "../../../Wolfie2D/Events/GameEvent"; -import Input from "../../../Wolfie2D/Input/Input"; -import Sprite from "../../../Wolfie2D/Nodes/Sprites/Sprite"; -import MathUtils from "../../../Wolfie2D/Utils/MathUtils"; -import EnemyState from "./EnemyState"; - -export default class OnGround extends EnemyState { - onEnter(options: Record): void {} - - update(deltaT: number): void { - if(this.parent.velocity.y > 0){ - this.parent.velocity.y = 0; - } - super.update(deltaT); - - - this.finished("fall"); - - - } - - handleInput(event: GameEvent): void { } - - onExit(): Record { - return {}; - } -} \ No newline at end of file diff --git a/src/shattered_sword/AI/EnemyStates/Patrol.ts b/src/shattered_sword/AI/EnemyStates/Patrol.ts index ba18f1f..d605e28 100644 --- a/src/shattered_sword/AI/EnemyStates/Patrol.ts +++ b/src/shattered_sword/AI/EnemyStates/Patrol.ts @@ -7,7 +7,6 @@ import EnemyAI, { EnemyStates } from "../EnemyAI"; import EnemyState from "./EnemyState"; import Sprite from "../../../Wolfie2D/Nodes/Sprites/Sprite"; import MathUtils from "../../../Wolfie2D/Utils/MathUtils"; -import OnGround from "./OnGround"; import AnimatedSprite from "../../../Wolfie2D/Nodes/Sprites/AnimatedSprite"; export default class Patrol extends EnemyState { diff --git a/src/shattered_sword/Player/PlayerController.ts b/src/shattered_sword/Player/PlayerController.ts index e743b76..42516a4 100644 --- a/src/shattered_sword/Player/PlayerController.ts +++ b/src/shattered_sword/Player/PlayerController.ts @@ -68,21 +68,19 @@ export default class PlayerController extends StateMachineAI implements BattlerA BASE_DEF: number = 100; MAX_DEF: number = 100; CURRENT_DEF: number = 100; + CURRENT_EXP : number = 0; + MAX_EXP : number = 100; + + invincible : boolean = false; + tilemap: OrthogonalTilemap; //for doublejumps maybe = # of jumps in air allowed MAX_airjumps: number = 1; airjumps:number = 0; - // TODO - - damage(damage: number): void { - (this.owner).animation.play("HURT", false); - this.CURRENT_HP -= damage; - } - private lookDirection: Vec2; - /** A list of items in the game world */ private items: Array; @@ -98,6 +96,13 @@ export default class PlayerController extends StateMachineAI implements BattlerA } + // TODO - + damage(damage: number): void { + if( !this.invincible){ + (this.owner).animation.play("HURT", false); + this.CURRENT_HP -= damage; + } + } /** * Returns three legal random generate buffs based on current state @@ -108,14 +113,18 @@ export default class PlayerController extends StateMachineAI implements BattlerA return undefined; } - - //generate array of 3 different buffs + //TODO - balance buff value generation /** - * generate array of 3 buffs - * @returns array of 3 differently typed buffs + * returns an array of three randomly generated buffs + * @param val optional value to give buff + * @returns array of three Buffs */ - static generateBuffs() : Buff[]{ - let num = Number(Math.random().toPrecision(1)) * 10; //number from 1 to 10 + static generateBuffs( val? : number) : Buff[]{ + let num = Number(Math.random().toPrecision(1)) * 10; //random number from 1 to 10 if no value given + if(typeof val !== 'undefined'){ + num = val; + } + let array : Buff[] = [ {type:BuffType.ATK, value:num}, {type:BuffType.HEALTH, value:num}, @@ -155,9 +164,11 @@ export default class PlayerController extends StateMachineAI implements BattlerA break; case BuffType.SPEED: this.CURRENT_BUFFS.speed += buff.value; + this.speed += buff.value; break; case BuffType.DEF: this.CURRENT_BUFFS.def += buff.value; + this.CURRENT_DEF += buff.value; break; case BuffType.RANGE: this.CURRENT_BUFFS.range += buff.value; @@ -240,10 +251,10 @@ export default class PlayerController extends StateMachineAI implements BattlerA item.use(this.owner, "player", this.lookDirection); } } - - } + + } \ No newline at end of file diff --git a/src/shattered_sword/Scenes/GameLevel.ts b/src/shattered_sword/Scenes/GameLevel.ts index cc45724..c9172db 100644 --- a/src/shattered_sword/Scenes/GameLevel.ts +++ b/src/shattered_sword/Scenes/GameLevel.ts @@ -87,6 +87,11 @@ export default class GameLevel extends Scene { //can load player sprite here //can load enemy sprite here + //sprites obtained from cse380 sprite wesbite + this.load.spritesheet("Tiger","shattered_sword_assets/spritesheets/Tiger.json"); + this.load.spritesheet("remus_werewolf","shattered_sword_assets/spritesheets/remus_werewolf.json"); + this.load.spritesheet("black_pudding","shattered_sword_assets/spritesheets/black_pudding.json"); + // Load the scene info this.load.object("weaponData", "shattered_sword_assets/data/weaponData.json"); @@ -101,7 +106,7 @@ export default class GameLevel extends Scene { this.load.image("knife", "shattered_sword_assets/sprites/knife.png"); this.load.spritesheet("slice", "shattered_sword_assets/spritesheets/slice.json"); this.load.image("inventorySlot", "shattered_sword_assets/sprites/inventory.png"); - + this.load.spritesheet("test_dummy","shattered_sword_assets/spritesheets/test_dummy.json") this.enemies = new Array(); this.battleManager = new BattleManager(); @@ -489,12 +494,29 @@ export default class GameLevel extends Scene { let enemy = this.add.animatedSprite(spriteKey, "primary"); //enemy.position.set(tilePos.x*32, tilePos.y*32); enemy.position.copy(tilePos); - enemy.scale.set(2, 2); - //TODO - add custom collision shape for each enemy in an option variable - //enemy.addPhysics(aiOptions.size.clone()); + + if( "scale" in aiOptions){ + enemy.scale.set(aiOptions.scale,aiOptions.scale); + } + else{ + enemy.scale.set(2, 2); + } + + //TODO - add custom collision shape for each enemy in an option variable + if( "size" in aiOptions){ + enemy.addPhysics(new AABB(Vec2.ZERO, aiOptions.size.clone())); + } + else{ + enemy.addPhysics(new AABB(Vec2.ZERO, new Vec2(16, 25))); + } + + if("offset" in aiOptions){ + enemy.colliderOffset.set(aiOptions.offset.x,aiOptions.offset.y); + } + else{ + enemy.colliderOffset.set(0, 6); + } - enemy.addPhysics(new AABB(Vec2.ZERO, new Vec2(16, 25))); - enemy.colliderOffset.set(0, 6); enemy.addAI(EnemyAI, aiOptions); //TODO - add individual enemy AI enemy.setGroup("Enemy"); @@ -519,17 +541,19 @@ export default class GameLevel extends Scene { //size: new AABB(Vec2.ZERO, new Vec2(16, 25)) }) break; - case "snake": //snake enemies drop from sky("trees")? or could just be very abundant - this.addEnemy("snake", enemy.position.scale(32), { + case "Snake": //Snake enemies drop from sky("trees")? or could just be very abundant + this.addEnemy("Snake", enemy.position.scale(32), { player: this.player, health: 50, tilemap: "Main", //actions:actions, goal: Statuses.REACHED_GOAL, + size: new Vec2(16,16), + offset : new Vec2(0, 16) }) break; - case "tiger": //tiger can be miniboss for now? - this.addEnemy("tiger", enemy.position.scale(32), { + case "Tiger": //Tiger can be miniboss for now? + this.addEnemy("Tiger", enemy.position.scale(32), { player: this.player, health: 200, tilemap: "Main", @@ -538,6 +562,27 @@ export default class GameLevel extends Scene { }) break; + case "remus_werewolf": + this.addEnemy("remus_werewolf", enemy.position.scale(32), { + player: this.player, + health: 200, + tilemap: "Main", + //actions:actions, + goal: Statuses.REACHED_GOAL, + }) + break; + case "black_pudding": + this.addEnemy("black_pudding", enemy.position.scale(32), { + player: this.player, + health: 200, + tilemap: "Main", + //actions:actions, + goal: Statuses.REACHED_GOAL, + scale: .25, + size: new Vec2(16,16), + offset : new Vec2(0,0) + }) + break; default: break; } diff --git a/src/shattered_sword/Scenes/Tutorial.ts b/src/shattered_sword/Scenes/Tutorial.ts index ffe2ebc..d6e9a8e 100644 --- a/src/shattered_sword/Scenes/Tutorial.ts +++ b/src/shattered_sword/Scenes/Tutorial.ts @@ -33,8 +33,8 @@ export default class Tutorial extends GameLevel { this.load.spritesheet("slice", "shattered_sword_assets/spritesheets/slice.json"); //load enemies - this.load.spritesheet("snake","shattered_sword_assets/spritesheets/snake.json"); - this.load.spritesheet("tiger","shattered_sword_assets/spritesheets/tiger.json"); + this.load.spritesheet("Snake","shattered_sword_assets/spritesheets/Snake.json"); + this.load.spritesheet("Tiger","shattered_sword_assets/spritesheets/Tiger.json");