fixed spelling, added assassinAI, need to get gun working for archer
This commit is contained in:
		
							parent
							
								
									1f7aa6d766
								
							
						
					
					
						commit
						5ff8353e3a
					
				
							
								
								
									
										12
									
								
								dist/shattered_sword_assets/data/weaponData.json
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										12
									
								
								dist/shattered_sword_assets/data/weaponData.json
									
									
									
									
										vendored
									
									
								
							| 
						 | 
					@ -1,5 +1,5 @@
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    "numWeapons": 1,
 | 
					    "numWeapons": 2,
 | 
				
			||||||
    "weapons": [
 | 
					    "weapons": [
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            "weaponType": "slice",
 | 
					            "weaponType": "slice",
 | 
				
			||||||
| 
						 | 
					@ -10,6 +10,16 @@
 | 
				
			||||||
            "damage": 50,
 | 
					            "damage": 50,
 | 
				
			||||||
            "cooldown": 500,
 | 
					            "cooldown": 500,
 | 
				
			||||||
            "useVolume": 0
 | 
					            "useVolume": 0
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            "weaponType": "semiAutoGun",
 | 
				
			||||||
 | 
					            "name": "pistol",
 | 
				
			||||||
 | 
					            "displayName": "Pistol",
 | 
				
			||||||
 | 
					            "spriteKey": "pistol",
 | 
				
			||||||
 | 
					            "damage": 2,
 | 
				
			||||||
 | 
					            "cooldown": 500,
 | 
				
			||||||
 | 
					            "useVolume": 320,
 | 
				
			||||||
 | 
					            "color": "#FFEEDD"
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    ]
 | 
					    ]
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
							
								
								
									
										
											BIN
										
									
								
								dist/shattered_sword_assets/sprites/pistol.png
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								dist/shattered_sword_assets/sprites/pistol.png
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| 
		 After Width: | Height: | Size: 134 B  | 
							
								
								
									
										19
									
								
								src/shattered_sword/AI/ArcherAI.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								src/shattered_sword/AI/ArcherAI.ts
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,19 @@
 | 
				
			||||||
 | 
					import AnimatedSprite from "../../Wolfie2D/Nodes/Sprites/AnimatedSprite";
 | 
				
			||||||
 | 
					import EnemyAI, { EnemyStates } from "./EnemyAI";
 | 
				
			||||||
 | 
					import ArcherAttack from "./EnemyStates/ArcherAttack";
 | 
				
			||||||
 | 
					import Weapon from "../GameSystems/items/Weapon";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default class ArcherAI 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 ArcherAttack(this, owner));
 | 
				
			||||||
 | 
					        this.weapon = options.weapon;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										17
									
								
								src/shattered_sword/AI/AssassinAI.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								src/shattered_sword/AI/AssassinAI.ts
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,17 @@
 | 
				
			||||||
 | 
					import Vec2 from "../../Wolfie2D/DataTypes/Vec2";
 | 
				
			||||||
 | 
					import AnimatedSprite from "../../Wolfie2D/Nodes/Sprites/AnimatedSprite";
 | 
				
			||||||
 | 
					import EnemyAI, { EnemyStates } from "./EnemyAI";
 | 
				
			||||||
 | 
					import AssassinAttack from "./EnemyStates/AssassinAttack";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default class AssassinAI extends EnemyAI {
 | 
				
			||||||
 | 
					    initializeAI(owner: AnimatedSprite, options: Record<string, any>): void {
 | 
				
			||||||
 | 
					        super.initializeAI(owner, options);
 | 
				
			||||||
 | 
					        this.addState(EnemyStates.ATTACK, new AssassinAttack(this, owner));
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    canAttack(position: Vec2): boolean {
 | 
				
			||||||
 | 
					        return this.attackTimer.isStopped() && this.owner.position.distanceTo(position)<=150;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -18,7 +18,7 @@ export default class BullAI extends EnemyAI {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    collideWithPlayer(player: PlayerController): void {
 | 
					    collideWithPlayer(player: PlayerController): void {
 | 
				
			||||||
        player.damage(10);
 | 
					        player.damage(10);
 | 
				
			||||||
        if (this.isAttaking && !player.invincible && !player.godMode) {
 | 
					        if (this.isAttacking && !player.invincible && !player.godMode) {
 | 
				
			||||||
            player.bleedCounter += 3;
 | 
					            player.bleedCounter += 3;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -64,7 +64,7 @@ export default class EnemyAI extends StateMachineAI implements BattlerAI {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    attackTimer : Timer;
 | 
					    attackTimer : Timer;
 | 
				
			||||||
    isCharging: boolean = false;
 | 
					    isCharging: boolean = false;
 | 
				
			||||||
    isAttaking: boolean = false;
 | 
					    isAttacking: boolean = false;
 | 
				
			||||||
    damageTimer: Timer;
 | 
					    damageTimer: Timer;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    physicWidth: number;
 | 
					    physicWidth: number;
 | 
				
			||||||
| 
						 | 
					@ -112,7 +112,7 @@ export default class EnemyAI extends StateMachineAI implements BattlerAI {
 | 
				
			||||||
        console.log(damage +" damage taken, "+this.CURRENT_HP+" hp left");
 | 
					        console.log(damage +" damage taken, "+this.CURRENT_HP+" hp left");
 | 
				
			||||||
        this.CURRENT_HP -= damage;
 | 
					        this.CURRENT_HP -= damage;
 | 
				
			||||||
        //TODO -
 | 
					        //TODO -
 | 
				
			||||||
        if (!this.isAttaking && !this.isCharging) {
 | 
					        if (!this.isAttacking && !this.isCharging) {
 | 
				
			||||||
            this.owner.animation.play("HURT",false);
 | 
					            this.owner.animation.play("HURT",false);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										25
									
								
								src/shattered_sword/AI/EnemyStates/ArcherAttack.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								src/shattered_sword/AI/EnemyStates/ArcherAttack.ts
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,25 @@
 | 
				
			||||||
 | 
					import EnemyAI, { EnemyStates } from "../EnemyAI";
 | 
				
			||||||
 | 
					import AnimatedSprite from "../../../Wolfie2D/Nodes/Sprites/AnimatedSprite";
 | 
				
			||||||
 | 
					import Attack from "./Attack";
 | 
				
			||||||
 | 
					import ArcherAI from "../ArcherAI";
 | 
				
			||||||
 | 
					import Sprite from "../../../Wolfie2D/Nodes/Sprites/Sprite";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//TODO - unfinished 
 | 
				
			||||||
 | 
					export default class ArcherAttack extends Attack {
 | 
				
			||||||
 | 
					    onEnter(options: Record<string, any>): void {
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    update(deltaT: number): void {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					       
 | 
				
			||||||
 | 
					        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();
 | 
				
			||||||
 | 
					        (<ArcherAI>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);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    onExit(): Record<string, any> {
 | 
				
			||||||
 | 
					        return null;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										73
									
								
								src/shattered_sword/AI/EnemyStates/AssassinAttack.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										73
									
								
								src/shattered_sword/AI/EnemyStates/AssassinAttack.ts
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,73 @@
 | 
				
			||||||
 | 
					import EnemyAI, { EnemyStates } from "../EnemyAI";
 | 
				
			||||||
 | 
					import AnimatedSprite from "../../../Wolfie2D/Nodes/Sprites/AnimatedSprite";
 | 
				
			||||||
 | 
					import Attack from "./Attack";
 | 
				
			||||||
 | 
					import AssassinAI from "../ArcherAI";
 | 
				
			||||||
 | 
					import Sprite from "../../../Wolfie2D/Nodes/Sprites/Sprite";
 | 
				
			||||||
 | 
					import Timer from "../../../Wolfie2D/Timing/Timer";
 | 
				
			||||||
 | 
					import Vec2 from "../../../Wolfie2D/DataTypes/Vec2";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//TODO - unfinished 
 | 
				
			||||||
 | 
					export default class AssassinAttack extends Attack {
 | 
				
			||||||
 | 
					    runTimer: Timer;
 | 
				
			||||||
 | 
					    startPosition : Vec2;
 | 
				
			||||||
 | 
					    pauseTimer : Timer;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    onEnter(options: Record<string, any>): void {
 | 
				
			||||||
 | 
					        super.onEnter(options);
 | 
				
			||||||
 | 
					        this.runTimer = new Timer(500);
 | 
				
			||||||
 | 
					        this.pauseTimer = new Timer(1000);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        this.owner.alpha = 1;  //unstealth to attack
 | 
				
			||||||
 | 
					        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();
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    update(deltaT: number): void {
 | 
				
			||||||
 | 
					       
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        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 ;
 | 
				
			||||||
 | 
					            super.update(deltaT);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    onExit(): Record<string, any> {
 | 
				
			||||||
 | 
					        this.owner.alpha = .2;  //stealth again
 | 
				
			||||||
 | 
					        //this.owner.position = this.startPosition;
 | 
				
			||||||
 | 
					        return null;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -14,7 +14,7 @@ export default class TigerAttack extends Attack {
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    update(deltaT: number): void {
 | 
					    update(deltaT: number): void {
 | 
				
			||||||
        if (this.runTimer.isStopped() && this.parent.isAttaking || !this.canWalk()) {
 | 
					        if (this.runTimer.isStopped() && this.parent.isAttacking || !this.canWalk()) {
 | 
				
			||||||
            this.emitter.fireEvent(this.attacked);
 | 
					            this.emitter.fireEvent(this.attacked);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        while (this.receiver.hasNextEvent()) {
 | 
					        while (this.receiver.hasNextEvent()) {
 | 
				
			||||||
| 
						 | 
					@ -22,13 +22,13 @@ export default class TigerAttack extends Attack {
 | 
				
			||||||
            switch (event) {
 | 
					            switch (event) {
 | 
				
			||||||
                case this.charged:
 | 
					                case this.charged:
 | 
				
			||||||
                    this.parent.isCharging = false;
 | 
					                    this.parent.isCharging = false;
 | 
				
			||||||
                    this.parent.isAttaking = true;
 | 
					                    this.parent.isAttacking = true;
 | 
				
			||||||
                    this.runTimer.start();
 | 
					                    this.runTimer.start();
 | 
				
			||||||
                    (<AnimatedSprite>this.owner).animation.play("ATTACK", true);
 | 
					                    (<AnimatedSprite>this.owner).animation.play("ATTACK", true);
 | 
				
			||||||
                    this.parent.direction = this.parent.getPlayerPosition().x - this.owner.position.x >= 0 ? 1 : 0;
 | 
					                    this.parent.direction = this.parent.getPlayerPosition().x - this.owner.position.x >= 0 ? 1 : 0;
 | 
				
			||||||
                    break;
 | 
					                    break;
 | 
				
			||||||
                case this.attacked:
 | 
					                case this.attacked:
 | 
				
			||||||
                    this.parent.isAttaking = false;
 | 
					                    this.parent.isAttacking = false;
 | 
				
			||||||
                    this.finished(EnemyStates.ALERT);
 | 
					                    this.finished(EnemyStates.ALERT);
 | 
				
			||||||
                    break;
 | 
					                    break;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -27,7 +27,7 @@ export default abstract class EnemyState extends State {
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  update(deltaT: number): void {
 | 
					  update(deltaT: number): void {
 | 
				
			||||||
    if (!this.parent.damageTimer.isStopped() && !this.parent.isAttaking && !this.parent.isCharging) {
 | 
					    if (!this.parent.damageTimer.isStopped() && !this.parent.isAttacking && !this.parent.isCharging) {
 | 
				
			||||||
      this.parent.velocity.x = 0;
 | 
					      this.parent.velocity.x = 0;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    // Do gravity
 | 
					    // Do gravity
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -11,12 +11,12 @@ export default class SnakeAttack extends Attack {
 | 
				
			||||||
            switch (event) {
 | 
					            switch (event) {
 | 
				
			||||||
                case this.charged:
 | 
					                case this.charged:
 | 
				
			||||||
                    this.parent.isCharging = false;
 | 
					                    this.parent.isCharging = false;
 | 
				
			||||||
                    this.parent.isAttaking = true;
 | 
					                    this.parent.isAttacking = true;
 | 
				
			||||||
                    (<AnimatedSprite>this.owner).animation.play("ATTACK", false, this.attacked);
 | 
					                    (<AnimatedSprite>this.owner).animation.play("ATTACK", false, this.attacked);
 | 
				
			||||||
                    (<AABB>this.owner.collisionShape).halfSize.x += 3.5;
 | 
					                    (<AABB>this.owner.collisionShape).halfSize.x += 3.5;
 | 
				
			||||||
                    break;
 | 
					                    break;
 | 
				
			||||||
                case this.attacked:
 | 
					                case this.attacked:
 | 
				
			||||||
                    this.parent.isAttaking = false;
 | 
					                    this.parent.isAttacking = false;
 | 
				
			||||||
                    (<AABB>this.owner.collisionShape).halfSize.x -= 3.5;
 | 
					                    (<AABB>this.owner.collisionShape).halfSize.x -= 3.5;
 | 
				
			||||||
                    this.finished(EnemyStates.ALERT);
 | 
					                    this.finished(EnemyStates.ALERT);
 | 
				
			||||||
                    break;
 | 
					                    break;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -14,7 +14,7 @@ export default class TigerAttack extends Attack {
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    update(deltaT: number): void {
 | 
					    update(deltaT: number): void {
 | 
				
			||||||
        if (this.parent.isAttaking && this.owner.onGround) {
 | 
					        if (this.parent.isAttacking && this.owner.onGround) {
 | 
				
			||||||
            this.emitter.fireEvent(this.attacked);
 | 
					            this.emitter.fireEvent(this.attacked);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        while (this.receiver.hasNextEvent()) {
 | 
					        while (this.receiver.hasNextEvent()) {
 | 
				
			||||||
| 
						 | 
					@ -22,14 +22,14 @@ export default class TigerAttack extends Attack {
 | 
				
			||||||
            switch (event) {
 | 
					            switch (event) {
 | 
				
			||||||
                case this.charged:
 | 
					                case this.charged:
 | 
				
			||||||
                    this.parent.isCharging = false;
 | 
					                    this.parent.isCharging = false;
 | 
				
			||||||
                    this.parent.isAttaking = true;
 | 
					                    this.parent.isAttacking = true;
 | 
				
			||||||
                    (<AnimatedSprite>this.owner).animation.play("ATTACK", true);
 | 
					                    (<AnimatedSprite>this.owner).animation.play("ATTACK", true);
 | 
				
			||||||
                    this.velocity = (this.parent.getPlayerPosition().x - this.owner.position.x)/1.5;
 | 
					                    this.velocity = (this.parent.getPlayerPosition().x - this.owner.position.x)/1.5;
 | 
				
			||||||
                    this.parent.direction = this.velocity >= 0 ? 1 : 0;
 | 
					                    this.parent.direction = this.velocity >= 0 ? 1 : 0;
 | 
				
			||||||
                    this.parent.velocity.y = -800;
 | 
					                    this.parent.velocity.y = -800;
 | 
				
			||||||
                    break;
 | 
					                    break;
 | 
				
			||||||
                case this.attacked:
 | 
					                case this.attacked:
 | 
				
			||||||
                    this.parent.isAttaking = false;
 | 
					                    this.parent.isAttacking = false;
 | 
				
			||||||
                    this.finished(EnemyStates.ALERT);
 | 
					                    this.finished(EnemyStates.ALERT);
 | 
				
			||||||
                    break;
 | 
					                    break;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -11,7 +11,7 @@ export default class SnakeAI extends EnemyAI {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    collideWithPlayer(player: PlayerController): void {
 | 
					    collideWithPlayer(player: PlayerController): void {
 | 
				
			||||||
        player.damage(10);
 | 
					        player.damage(10);
 | 
				
			||||||
        if (this.isAttaking && !player.invincible && !player.godMode) {
 | 
					        if (this.isAttacking && !player.invincible && !player.godMode) {
 | 
				
			||||||
            player.poisonCounter = 5;
 | 
					            player.poisonCounter = 5;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -23,7 +23,7 @@ export default class TigerAI extends EnemyAI {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    collideWithPlayer(player: PlayerController): void {
 | 
					    collideWithPlayer(player: PlayerController): void {
 | 
				
			||||||
        player.damage(10);
 | 
					        player.damage(10);
 | 
				
			||||||
        if (this.isAttaking && !player.invincible && !player.godMode) {
 | 
					        if (this.isAttacking && !player.invincible && !player.godMode) {
 | 
				
			||||||
            player.bleedCounter += 3;
 | 
					            player.bleedCounter += 3;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										102
									
								
								src/shattered_sword/GameSystems/items/WeaponTypes/SemiAutoGun.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										102
									
								
								src/shattered_sword/GameSystems/items/WeaponTypes/SemiAutoGun.ts
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,102 @@
 | 
				
			||||||
 | 
					import AABB from "../../../../Wolfie2D/DataTypes/Shapes/AABB";
 | 
				
			||||||
 | 
					import Vec2 from "../../../../Wolfie2D/DataTypes/Vec2";
 | 
				
			||||||
 | 
					import GameNode, { TweenableProperties } from "../../../../Wolfie2D/Nodes/GameNode";
 | 
				
			||||||
 | 
					import { GraphicType } from "../../../../Wolfie2D/Nodes/Graphics/GraphicTypes";
 | 
				
			||||||
 | 
					import Line from "../../../../Wolfie2D/Nodes/Graphics/Line";
 | 
				
			||||||
 | 
					import OrthogonalTilemap from "../../../../Wolfie2D/Nodes/Tilemaps/OrthogonalTilemap";
 | 
				
			||||||
 | 
					import Scene from "../../../../Wolfie2D/Scene/Scene";
 | 
				
			||||||
 | 
					import Color from "../../../../Wolfie2D/Utils/Color";
 | 
				
			||||||
 | 
					import { EaseFunctionType } from "../../../../Wolfie2D/Utils/EaseFunctions";
 | 
				
			||||||
 | 
					import { Player_Events } from "../../../sword_enums";
 | 
				
			||||||
 | 
					import WeaponType from "./WeaponType";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default class SemiAutoGun extends WeaponType {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    color: Color;
 | 
				
			||||||
 | 
					    private hexColor: string;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    initialize(options: Record<string, any>): void {
 | 
				
			||||||
 | 
					        this.damage = options.damage;
 | 
				
			||||||
 | 
					        this.cooldown = options.cooldown;
 | 
				
			||||||
 | 
					        this.hexColor = options.color;
 | 
				
			||||||
 | 
					        this.color = Color.fromStringHex(options.color);
 | 
				
			||||||
 | 
					        this.displayName = options.displayName;
 | 
				
			||||||
 | 
					        this.spriteKey = options.spriteKey;
 | 
				
			||||||
 | 
					        this.useVolume = options.useVolume;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    doAnimation(shooter: GameNode, direction: Vec2, line: Line): void {
 | 
				
			||||||
 | 
					        let start = shooter.position.clone();
 | 
				
			||||||
 | 
					        let end = shooter.position.clone().add(direction.scaled(900));
 | 
				
			||||||
 | 
					        let delta = end.clone().sub(start);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Iterate through the tilemap region until we find a collision
 | 
				
			||||||
 | 
					        let minX = Math.min(start.x, end.x);
 | 
				
			||||||
 | 
					        let maxX = Math.max(start.x, end.x);
 | 
				
			||||||
 | 
					        let minY = Math.min(start.y, end.y);
 | 
				
			||||||
 | 
					        let maxY = Math.max(start.y, end.y);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Get the wall tilemap
 | 
				
			||||||
 | 
					        let walls = <OrthogonalTilemap>shooter.getScene().getLayer("Wall").getItems()[0];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        let minIndex = walls.getColRowAt(new Vec2(minX, minY));
 | 
				
			||||||
 | 
							let maxIndex = walls.getColRowAt(new Vec2(maxX, maxY));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        let tileSize = walls.getTileSize();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        for(let col = minIndex.x; col <= maxIndex.x; col++){
 | 
				
			||||||
 | 
					            for(let row = minIndex.y; row <= maxIndex.y; row++){
 | 
				
			||||||
 | 
					                if(walls.isTileCollidable(col, row)){
 | 
				
			||||||
 | 
					                    // Get the position of this tile
 | 
				
			||||||
 | 
					                    let tilePos = new Vec2(col * tileSize.x + tileSize.x/2, row * tileSize.y + tileSize.y/2);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    // Create a collider for this tile
 | 
				
			||||||
 | 
					                    let collider = new AABB(tilePos, tileSize.scaled(1/2));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    let hit = collider.intersectSegment(start, delta, Vec2.ZERO);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    if(hit !== null && start.distanceSqTo(hit.pos) < start.distanceSqTo(end)){
 | 
				
			||||||
 | 
					                        console.log("Found hit");
 | 
				
			||||||
 | 
					                        end = hit.pos;
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        line.start = start;
 | 
				
			||||||
 | 
					        line.end = end;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        line.tweens.play("fade");
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    createRequiredAssets(scene: Scene): [Line] {
 | 
				
			||||||
 | 
					        let line = <Line>scene.add.graphic(GraphicType.LINE, "primary", {start: new Vec2(-1, 1), end: new Vec2(-1, -1)});
 | 
				
			||||||
 | 
					        line.color = this.color;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        line.tweens.add("fade", {
 | 
				
			||||||
 | 
					            startDelay: 0,
 | 
				
			||||||
 | 
					            duration: 300,
 | 
				
			||||||
 | 
					            effects: [
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    property: TweenableProperties.alpha,
 | 
				
			||||||
 | 
					                    start: 1,
 | 
				
			||||||
 | 
					                    end: 0,
 | 
				
			||||||
 | 
					                    ease: EaseFunctionType.OUT_SINE
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            ],
 | 
				
			||||||
 | 
					            onEnd: Player_Events.UNLOAD_ASSET
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return [line];
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    hits(node: GameNode, line: Line): boolean {
 | 
				
			||||||
 | 
					        return node.collisionShape.getBoundingRect().intersectSegment(line.start, line.end.clone().sub(line.start)) !== null;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    clone(): WeaponType {
 | 
				
			||||||
 | 
					        let newType = new SemiAutoGun();
 | 
				
			||||||
 | 
					        newType.initialize({color: this.hexColor,damage: this.damage, cooldown: this.cooldown, displayName: this.displayName, spriteKey: this.spriteKey, useVolume: this.useVolume});
 | 
				
			||||||
 | 
					        return newType;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -3,7 +3,7 @@ import ResourceManager from "../../Wolfie2D/ResourceManager/ResourceManager";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import WeaponType from "../GameSystems/items/WeaponTypes/WeaponType";
 | 
					import WeaponType from "../GameSystems/items/WeaponTypes/WeaponType";
 | 
				
			||||||
import Slice from "../GameSystems/items/WeaponTypes/Slice";
 | 
					import Slice from "../GameSystems/items/WeaponTypes/Slice";
 | 
				
			||||||
 | 
					import SemiAutoGun from "../GameSystems/items/WeaponTypes/SemiAutoGun";
 | 
				
			||||||
export default class WeaponTemplateRegistry extends Registry<WeaponConstructor> {
 | 
					export default class WeaponTemplateRegistry extends Registry<WeaponConstructor> {
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    public preload(): void {
 | 
					    public preload(): void {
 | 
				
			||||||
| 
						 | 
					@ -13,6 +13,7 @@ export default class WeaponTemplateRegistry extends Registry<WeaponConstructor>
 | 
				
			||||||
        // Load sprites for each weapon 
 | 
					        // Load sprites for each weapon 
 | 
				
			||||||
        //rm.image("something", "shattered_sword_assets/sprites/something.png");
 | 
					        //rm.image("something", "shattered_sword_assets/sprites/something.png");
 | 
				
			||||||
        rm.image("knife", "shattered_sword_assets/sprites/knife.png");
 | 
					        rm.image("knife", "shattered_sword_assets/sprites/knife.png");
 | 
				
			||||||
 | 
					        rm.image("pistol", "shattered_sword_assets/sprites/pistol.png");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // Load spritesheets
 | 
					        // Load spritesheets
 | 
				
			||||||
        //rm.spritesheet("weapon anim", "shattered_sword_assets/spritesheets/weapon anim.json");
 | 
					        //rm.spritesheet("weapon anim", "shattered_sword_assets/spritesheets/weapon anim.json");
 | 
				
			||||||
| 
						 | 
					@ -21,6 +22,7 @@ export default class WeaponTemplateRegistry extends Registry<WeaponConstructor>
 | 
				
			||||||
        // Register default types
 | 
					        // Register default types
 | 
				
			||||||
        //this.registerItem("itemtype", itemTypefile);
 | 
					        //this.registerItem("itemtype", itemTypefile);
 | 
				
			||||||
        this.registerItem("slice", Slice);
 | 
					        this.registerItem("slice", Slice);
 | 
				
			||||||
 | 
					        this.registerItem("semiAutoGun", SemiAutoGun);
 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -23,6 +23,8 @@ import EnemyAI from "../AI/EnemyAI";
 | 
				
			||||||
import SnakeAI from "../AI/SnakeAI";
 | 
					import SnakeAI from "../AI/SnakeAI";
 | 
				
			||||||
import SlimeAI from "../AI/SlimeAI";
 | 
					import SlimeAI from "../AI/SlimeAI";
 | 
				
			||||||
import TigerAI from "../AI/TigerAI";
 | 
					import TigerAI from "../AI/TigerAI";
 | 
				
			||||||
 | 
					import ArcherAI from "../AI/ArcherAI";
 | 
				
			||||||
 | 
					import AssassinAI from "../AI/AssassinAi";
 | 
				
			||||||
import BattlerAI from "../AI/BattlerAI";
 | 
					import BattlerAI from "../AI/BattlerAI";
 | 
				
			||||||
import InventoryManager from "../GameSystems/InventoryManager";
 | 
					import InventoryManager from "../GameSystems/InventoryManager";
 | 
				
			||||||
import Item from "../GameSystems/items/Item";
 | 
					import Item from "../GameSystems/items/Item";
 | 
				
			||||||
| 
						 | 
					@ -170,6 +172,7 @@ export default class GameLevel extends Scene {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        this.load.image("knife", "shattered_sword_assets/sprites/knife.png");
 | 
					        this.load.image("knife", "shattered_sword_assets/sprites/knife.png");
 | 
				
			||||||
 | 
					        this.load.image("pistol","shattered_sword_assets/sprites/pistol.png");
 | 
				
			||||||
        this.load.image("inventorySlot", "shattered_sword_assets/sprites/inventory.png");
 | 
					        this.load.image("inventorySlot", "shattered_sword_assets/sprites/inventory.png");
 | 
				
			||||||
        this.load.image("black", "shattered_sword_assets/images/black.png");
 | 
					        this.load.image("black", "shattered_sword_assets/images/black.png");
 | 
				
			||||||
        this.load.image("poisoning", "shattered_sword_assets/images/poisoning.png");
 | 
					        this.load.image("poisoning", "shattered_sword_assets/images/poisoning.png");
 | 
				
			||||||
| 
						 | 
					@ -271,6 +274,12 @@ export default class GameLevel extends Scene {
 | 
				
			||||||
        while(this.receiver.hasNextEvent()){
 | 
					        while(this.receiver.hasNextEvent()){
 | 
				
			||||||
            let event = this.receiver.getNextEvent();
 | 
					            let event = this.receiver.getNextEvent();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if(event.isType(Player_Events.UNLOAD_ASSET)){
 | 
				
			||||||
 | 
					                console.log(event.data);
 | 
				
			||||||
 | 
					                let asset = this.sceneGraph.getNode(event.data.get("node"));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                asset.destroy();
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
            if (this.gameStateStack.peek() === GameState.GAMING) {
 | 
					            if (this.gameStateStack.peek() === GameState.GAMING) {
 | 
				
			||||||
                switch(event.type){
 | 
					                switch(event.type){
 | 
				
			||||||
                    case Player_Events.PLAYER_COLLIDE:
 | 
					                    case Player_Events.PLAYER_COLLIDE:
 | 
				
			||||||
| 
						 | 
					@ -854,8 +863,11 @@ 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[]){
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					     
 | 
				
			||||||
        for (let enemy of enemies) {
 | 
					        for (let enemy of enemies) {
 | 
				
			||||||
            switch (enemy.type) {
 | 
					            switch (enemy.type) {
 | 
				
			||||||
 | 
					                
 | 
				
			||||||
                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,
 | 
				
			||||||
| 
						 | 
					@ -866,6 +878,7 @@ export default class GameLevel extends Scene {
 | 
				
			||||||
                        exp: 50,
 | 
					                        exp: 50,
 | 
				
			||||||
                    })
 | 
					                    })
 | 
				
			||||||
                    break;
 | 
					                    break;
 | 
				
			||||||
 | 
					                    
 | 
				
			||||||
                case "Tiger":       //Tiger can be miniboss for now? 
 | 
					                case "Tiger":       //Tiger can be miniboss for now? 
 | 
				
			||||||
                    this.addEnemy("Tiger", enemy.position.scale(32), TigerAI, {
 | 
					                    this.addEnemy("Tiger", enemy.position.scale(32), TigerAI, {
 | 
				
			||||||
                        player: this.player,
 | 
					                        player: this.player,
 | 
				
			||||||
| 
						 | 
					@ -936,23 +949,6 @@ export default class GameLevel extends Scene {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * Increments the amount of life the player has
 | 
					 | 
				
			||||||
     * @param amt The amount to add to the player life
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    /*
 | 
					 | 
				
			||||||
    protected incPlayerLife(amt: number): void {
 | 
					 | 
				
			||||||
        GameLevel.livesCount += amt;
 | 
					 | 
				
			||||||
        this.livesCountLabel.text = "Lives: " + GameLevel.livesCount;
 | 
					 | 
				
			||||||
        if (GameLevel.livesCount === 0){
 | 
					 | 
				
			||||||
            InputWrapper.disableInput();
 | 
					 | 
				
			||||||
            this.player.disablePhysics();
 | 
					 | 
				
			||||||
            this.emitter.fireEvent(GameEventType.PLAY_SOUND, {key: "player_death", loop: false, holdReference: false});
 | 
					 | 
				
			||||||
            this.player.tweens.play("death");
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * Returns the player to spawn
 | 
					     * Returns the player to spawn
 | 
				
			||||||
| 
						 | 
					@ -978,9 +974,6 @@ export default class GameLevel extends Scene {
 | 
				
			||||||
			
 | 
								
 | 
				
			||||||
			this.player.position.set(this.playerSpawn.x,this.playerSpawn.y);
 | 
								this.player.position.set(this.playerSpawn.x,this.playerSpawn.y);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            //TODO - decrease player health or can kill player here
 | 
					 | 
				
			||||||
            //(<PlayerController>this.player._ai).CURRENT_HP *= .75;
 | 
					 | 
				
			||||||
            //this.emitter.fireEvent(Player_Events.PLAYER_KILLED);
 | 
					 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -12,8 +12,10 @@ export enum Player_Events {
 | 
				
			||||||
    BOSS_KILLED = "BossKilled",
 | 
					    BOSS_KILLED = "BossKilled",
 | 
				
			||||||
    GIVE_REGULAR_BUFF = "GiveRegularBuff",
 | 
					    GIVE_REGULAR_BUFF = "GiveRegularBuff",
 | 
				
			||||||
    GIVE_SPECIAL_BUFF = "GiveSpecialBuff",
 | 
					    GIVE_SPECIAL_BUFF = "GiveSpecialBuff",
 | 
				
			||||||
    PLAYER_COLLIDE = "PlayerCollide"
 | 
					    PLAYER_COLLIDE = "PlayerCollide",
 | 
				
			||||||
 | 
					    UNLOAD_ASSET = "UnloadAsset"
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export enum Damage_Type {
 | 
					export enum Damage_Type {
 | 
				
			||||||
    NORMAL_DAMAGE = "NormalDamage",
 | 
					    NORMAL_DAMAGE = "NormalDamage",
 | 
				
			||||||
    ENVIRONMENT_DAMAGE = "EnvironmentDamage",
 | 
					    ENVIRONMENT_DAMAGE = "EnvironmentDamage",
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue
	
	Block a user