public SwampBoss() : base(-1) { species = "Swamp/boss"; hitbox = new Hitbox(200, 200); hitbox.active = true; maxHealth = 2500; health = maxHealth; target = Game1.characterManager.getRandomLiveCharacter(); currentState = EnemyState.Attacking; currentAI = EnemyAI.SwampBoss; oldAI = EnemyAI.SwampBoss; if (!texturesLoaded) { for (int i = 1; i <= 20; i++) { TextureManager.Add(Enemy.BASETEX + "Swamp/boss back " + i); TextureManager.Add(Enemy.BASETEX + "Swamp/boss side " + i); TextureManager.Add(Enemy.BASETEX + "Swamp/boss front " + i); } TextureManager.Add(Enemy.BASETEX + "Swamp/boss center 1"); TextureManager.Add(Enemy.BASETEX + "Swamp/boss center 2"); TextureManager.Add(Enemy.BASETEX + "Swamp/boss center bleed"); texturesLoaded = true; } bleedingTexture = new AnimatedTexture(Enemy.BASETEX + "Swamp/boss center bleed"); pulsatingTexture = new AnimatedTexture(Enemy.BASETEX + species + " center", 2, 250); setTexture(pulsatingTexture); }
public BalloonBomb(AOE p, bool thrown = true) : base() { parent = p; if (!thrown) { setTexture(new AnimatedTexture(AOE.BASETEX + "aoe storedballoon")); radius = 0f; } else { setTexture(new AnimatedTexture(AOE.BASETEX + "aoe balloonbomb")); radius = 0f; switch (parent.curDirection) { case Character.Direction.Left: position = parent.getLeft(); break; case Character.Direction.Right: position = parent.getRight(); break; case Character.Direction.Forward: position = parent.getBottom(); break; case Character.Direction.Back: position = parent.getTop(); break; } velocity = AOE.BALLOON_BOMBS_SPEED * parent.fourWayDirection(); acceleration = AOE.BALLOON_BOMBS_ACCELERATION * parent.fourWayDirection(); } explosion = new AnimatedTexture(AOE.BASETEX + "aoe-balloon-explode", 4, 100); }
public BalloonBomb(AOE p, bool thrown=true) : base() { parent = p; if (!thrown) { setTexture(new AnimatedTexture(AOE.BASETEX + "aoe storedballoon")); radius = 0f; } else { setTexture(new AnimatedTexture(AOE.BASETEX + "aoe balloonbomb")); radius = 0f; switch (parent.curDirection) { case Character.Direction.Left: position = parent.getLeft(); break; case Character.Direction.Right: position = parent.getRight(); break; case Character.Direction.Forward: position = parent.getBottom(); break; case Character.Direction.Back: position = parent.getTop(); break; } velocity = AOE.BALLOON_BOMBS_SPEED * parent.fourWayDirection(); acceleration = AOE.BALLOON_BOMBS_ACCELERATION * parent.fourWayDirection(); } explosion = new AnimatedTexture(AOE.BASETEX + "aoe-balloon-explode", 4, 100); }
public Dynamite() : base(-1) { idleTexture = new AnimatedTexture(Enemy.BASETEX + "Cave/dynamite"); explodingTexture = new AnimatedTexture(Enemy.BASETEX + "Cave/explosion small", 3, 200); fuseTexture = new AnimatedTexture(Enemy.BASETEX + "Cave/fuse", 3, 50); explodingTexture.setOnFrameHitbox(1, new Hitbox(20, 20)); explodingTexture.setOnFrameHitbox(2, new Hitbox(30, 30)); explodingTexture.setOnFrameHitbox(3, new Hitbox(40, 40)); explodingTexture.onFinish = kill; hitbox = new Hitbox(35, 24); hitbox.active = true; maxHealth = 1; hitDamage = 20; currentAI = EnemyAI.NoMoveKnockback; setTexture(idleTexture); }
public void setDirection(Direction dir) { curDirection = dir; AnimatedTexture tex = null; switch (dir) { case Direction.Back: tex = new AnimatedTexture(Enemy.BASETEX + "Swamp/boss back", 20, 150); break; case Direction.Forward: tex = new AnimatedTexture(Enemy.BASETEX + "Swamp/boss front", 20, 150); break; case Direction.Left: tex = new AnimatedTexture(Enemy.BASETEX + "Swamp/boss side", 20, 150); flip = SpriteEffects.FlipHorizontally; break; case Direction.Right: tex = new AnimatedTexture(Enemy.BASETEX + "Swamp/boss side", 20, 150); break; } tex.onFinish = kill; tex.setOnFrameRangeHitbox(16, 18, new Hitbox(new Vector2(30, 0), 50, 40, true)); setTexture(tex); }
public void setTexture(AnimatedTexture tex) { if (texture != null) { foreach (Hitbox hitbox in texture.onFrameHitboxes) { if (hitbox != null) { hitbox.active = false; } } } texture = tex; texture.Update(null, this); if (texture.onStart != null) { texture.onStart(); } }
public DynaBoss() : base(-1) { if (!texturesLoaded) { TextureManager.Add(Enemy.BASETEX + "Cave/cave boss attack 1"); TextureManager.Add(Enemy.BASETEX + "Cave/cave boss attack 2"); TextureManager.Add(Enemy.BASETEX + "Cave/cave boss attack 3"); TextureManager.Add(Enemy.BASETEX + "Cave/cave boss hurt"); TextureManager.Add(Enemy.BASETEX + "Cave/cave boss walk 1"); TextureManager.Add(Enemy.BASETEX + "Cave/cave boss walk 2"); TextureManager.Add(Enemy.BASETEX + "Cave/cave boss walk 3"); TextureManager.Add(Enemy.BASETEX + "Cave/cave boss walk 4"); TextureManager.Add(Enemy.BASETEX + "Cave/dynamite"); TextureManager.Add(Enemy.BASETEX + "Cave/explosion small 1"); TextureManager.Add(Enemy.BASETEX + "Cave/explosion small 2"); TextureManager.Add(Enemy.BASETEX + "Cave/explosion small 3"); TextureManager.Add(Enemy.BASETEX + "Cave/explosion big 1"); TextureManager.Add(Enemy.BASETEX + "Cave/explosion big 2"); TextureManager.Add(Enemy.BASETEX + "Cave/explosion big 3"); TextureManager.Add(Enemy.BASETEX + "Cave/fuse 1"); TextureManager.Add(Enemy.BASETEX + "Cave/fuse 2"); TextureManager.Add(Enemy.BASETEX + "Cave/fuse 3"); texturesLoaded = true; } scale = 2f; hitbox = new Hitbox(360, 125); hitbox.active = true; moveSpeed = 100f; maxHealth = 2500f; health = maxHealth; movingTexture = new AnimatedTexture(Enemy.BASETEX + "Cave/cave boss walk", 4, 100); stunnedTexture = new AnimatedTexture(Enemy.BASETEX + "Cave/cave boss walk 2"); setTexture(movingTexture); position.X = Game1.levelManager.position.X + Game1.levelManager.screenWidth * 2; currentAI = EnemyAI.DynamiteBoss; oldAI = EnemyAI.DynamiteBoss; }
public override void Update(GameTime gameTime) { float seconds = (float)gameTime.ElapsedGameTime.TotalSeconds; //death exploding animation if (exploding) { setTexture(new AnimatedTexture(Enemy.BASETEX + "Cave/cave boss walk 2")); explodingTime += seconds; if (explosions.Count == 0 && exploded == 0) { AnimatedTexture deathTexture = new AnimatedTexture(Enemy.BASETEX + "Cave/explosion big", 3, 250 + (int)(Game1.rand.NextDouble() * 100)); deathTexture.onFinish = delegate() { drawExplosion[0] = false; }; drawExplosion[0] = true; explosions.Add(deathTexture); exploded++; } if (explodingTime >= EXPLODING_TIME / 4 && exploded == 1) { AnimatedTexture deathTexture = new AnimatedTexture(Enemy.BASETEX + "Cave/explosion big", 3, 250 + (int)(Game1.rand.NextDouble() * 100)); deathTexture.onFinish = delegate() { drawExplosion[1] = false; }; drawExplosion[1] = true; explosions.Add(deathTexture); exploded++; } if (explodingTime >= EXPLODING_TIME / 3 && exploded == 2) { AnimatedTexture deathTexture = new AnimatedTexture(Enemy.BASETEX + "Cave/explosion big", 3, 250 + (int)(Game1.rand.NextDouble() * 100)); deathTexture.onFinish = delegate() { drawExplosion[2] = false; }; drawExplosion[2] = true; explosions.Add(deathTexture); exploded++; } if (explodingTime >= EXPLODING_TIME / 2 && exploded == 3) { AnimatedTexture deathTexture = new AnimatedTexture(Enemy.BASETEX + "Cave/explosion big", 3, 250 + (int)(Game1.rand.NextDouble() * 100)); deathTexture.onFinish = delegate() { drawExplosion[3] = false; }; drawExplosion[3] = true; explosions.Add(deathTexture); exploded++; } if (explodingTime >= EXPLODING_TIME / 1.5 && exploded == 4) { AnimatedTexture deathTexture = new AnimatedTexture(Enemy.BASETEX + "Cave/explosion big", 3, 250 + (int)(Game1.rand.NextDouble() * 100)); deathTexture.onFinish = delegate() { drawExplosion[4] = false; }; drawExplosion[4] = true; explosions.Add(deathTexture); exploded++; } if (explodingTime >= EXPLODING_TIME && exploded == 5) { AnimatedTexture deathTexture = new AnimatedTexture(Enemy.BASETEX + "Cave/explosion big", 3, 250 + (int)(Game1.rand.NextDouble() * 100)); deathTexture.onFinish = delegate() { Game1.levelManager.killEnemy(this); }; drawExplosion[5] = true; explosions.Add(deathTexture); exploded++; } } //stunned animation else if (stunned) { //shake animation float newX = originalPosition.X; float newY = originalPosition.Y; switch (shakeAnimationStep) { case 0: newX += 5; newY += 5; break; case 2: newX += 0; newY -= 5; break; case 4: newX += 5; newY -= 5; break; case 6: newX -= 5; newY -= 5; break; case 8: newX -= 10; newY -= 5; break; case 10: newX += 3; newY -= 2; break; } shakeAnimationStep = (shakeAnimationStep + 1); position = new Vector2(newX, newY); stunTime -= seconds; if (stunTime < 0f) { setTexture(movingTexture); stunned = false; shakeAnimationStep = 0; position = originalPosition; } } else { if (position.X < (Game1.levelManager.position.X + 150)) { dirMultiplier = 1; } else if ((position.X > (Game1.levelManager.position.X + Game1.levelManager.screenWidth - 150))) { dirMultiplier = -1; } position = new Vector2(position.X + (moveSpeed * dirMultiplier * seconds), Game1.levelManager.position.Y - Game1.levelManager.screenHeight + 100); //spawn dynamite timeSinceLastThrow += seconds; if (timeSinceLastThrow >= DYNAMITE_THROW_INTERVAL) { Action <Dynamite> dynamiteReset = delegate(Dynamite d) { d.hitbox = new Hitbox(35, 24); d.hitbox.active = true; d.health = d.maxHealth; d.alreadyHit.Clear(); d.hitboxesHitBy.Clear(); d.fuse = 0f; d.exploding = false; d.position = position; d.velocity.X = (float)(Game1.rand.NextDouble() - 0.5) * Game1.levelManager.screenWidth; d.velocity.Y = ((float)Game1.rand.NextDouble() + 2) / 3 * Game1.levelManager.screenHeight / 3; d.setTexture(new AnimatedTexture(Enemy.BASETEX + "Cave/dynamite")); }; Dynamite d1 = dynamitePool.obtain(dynamiteReset); Dynamite d2 = dynamitePool.obtain(dynamiteReset); Dynamite d3 = dynamitePool.obtain(dynamiteReset); dynamite.Add(d1); dynamite.Add(d2); dynamite.Add(d3); Game1.levelManager.enemiesToAddImmediate.Add(d1); Game1.levelManager.enemiesToAddImmediate.Add(d2); Game1.levelManager.enemiesToAddImmediate.Add(d3); timeSinceLastThrow = 0f; } } List <Dynamite> deaddynamite = new List <Dynamite>(); foreach (Dynamite d in dynamite) { if (d.alive) { d.Update(gameTime); } else { deaddynamite.Add(d); } } foreach (Dynamite d in deaddynamite) { dynamite.Remove(d); Game1.levelManager.killEnemy(d); } foreach (AnimatedTexture explosion in explosions) { explosion.Update(gameTime, this); } Console.WriteLine("x=" + exploded + "ex=" + explosions.Count + " fex=" + finishedExplosions.Count); foreach (AnimatedTexture explosion in finishedExplosions) { explosions.Remove(explosion); } finishedExplosions.Clear(); base.Update(gameTime); }
public void setTexture(AnimatedTexture tex) { if (texture != null) foreach (Hitbox hitbox in texture.onFrameHitboxes) if (hitbox != null) { hitbox.active = false; } texture = tex; texture.Update(null, this); if (texture.onStart != null) texture.onStart(); }
public override void Update(GameTime gameTime) { float seconds = (float)gameTime.ElapsedGameTime.TotalSeconds; //death exploding animation if (exploding) { setTexture(new AnimatedTexture(Enemy.BASETEX + "Cave/cave boss walk 2")); explodingTime += seconds; if (explosions.Count == 0 && exploded == 0) { AnimatedTexture deathTexture = new AnimatedTexture(Enemy.BASETEX + "Cave/explosion big", 3, 250 + (int)(Game1.rand.NextDouble() * 100)); deathTexture.onFinish = delegate() { drawExplosion[0] = false; }; drawExplosion[0] = true; explosions.Add(deathTexture); exploded++; } if (explodingTime >= EXPLODING_TIME / 4 && exploded == 1) { AnimatedTexture deathTexture = new AnimatedTexture(Enemy.BASETEX + "Cave/explosion big", 3, 250 + (int)(Game1.rand.NextDouble() * 100)); deathTexture.onFinish = delegate() { drawExplosion[1] = false; }; drawExplosion[1] = true; explosions.Add(deathTexture); exploded++; } if (explodingTime >= EXPLODING_TIME / 3 && exploded == 2) { AnimatedTexture deathTexture = new AnimatedTexture(Enemy.BASETEX + "Cave/explosion big", 3, 250 + (int)(Game1.rand.NextDouble() * 100)); deathTexture.onFinish = delegate() { drawExplosion[2] = false; }; drawExplosion[2] = true; explosions.Add(deathTexture); exploded++; } if (explodingTime >= EXPLODING_TIME / 2 && exploded == 3) { AnimatedTexture deathTexture = new AnimatedTexture(Enemy.BASETEX + "Cave/explosion big", 3, 250 + (int)(Game1.rand.NextDouble() * 100)); deathTexture.onFinish = delegate() { drawExplosion[3] = false; }; drawExplosion[3] = true; explosions.Add(deathTexture); exploded++; } if (explodingTime >= EXPLODING_TIME / 1.5 && exploded == 4) { AnimatedTexture deathTexture = new AnimatedTexture(Enemy.BASETEX + "Cave/explosion big", 3, 250 + (int)(Game1.rand.NextDouble() * 100)); deathTexture.onFinish = delegate() { drawExplosion[4] = false; }; drawExplosion[4] = true; explosions.Add(deathTexture); exploded++; } if (explodingTime >= EXPLODING_TIME && exploded == 5) { AnimatedTexture deathTexture = new AnimatedTexture(Enemy.BASETEX + "Cave/explosion big", 3, 250 + (int)(Game1.rand.NextDouble() * 100)); deathTexture.onFinish = delegate() { Game1.levelManager.killEnemy(this); }; drawExplosion[5] = true; explosions.Add(deathTexture); exploded++; } } //stunned animation else if (stunned) { //shake animation float newX = originalPosition.X; float newY = originalPosition.Y; switch (shakeAnimationStep) { case 0: newX += 5; newY += 5; break; case 2: newX += 0; newY -= 5; break; case 4: newX += 5; newY -= 5; break; case 6: newX -= 5; newY -= 5; break; case 8: newX -= 10; newY -= 5; break; case 10: newX += 3; newY -= 2; break; } shakeAnimationStep = (shakeAnimationStep + 1); position = new Vector2(newX, newY); stunTime -= seconds; if (stunTime < 0f) { setTexture(movingTexture); stunned = false; shakeAnimationStep = 0; position = originalPosition; } } else { if (position.X < (Game1.levelManager.position.X + 150)) dirMultiplier = 1; else if ((position.X > (Game1.levelManager.position.X + Game1.levelManager.screenWidth - 150))) dirMultiplier = -1; position = new Vector2(position.X + (moveSpeed * dirMultiplier * seconds), Game1.levelManager.position.Y - Game1.levelManager.screenHeight + 100); //spawn dynamite timeSinceLastThrow += seconds; if (timeSinceLastThrow >= DYNAMITE_THROW_INTERVAL) { Action<Dynamite> dynamiteReset = delegate(Dynamite d) { d.hitbox = new Hitbox(35, 24); d.hitbox.active = true; d.health = d.maxHealth; d.alreadyHit.Clear(); d.hitboxesHitBy.Clear(); d.fuse = 0f; d.exploding = false; d.position = position; d.velocity.X = (float)(Game1.rand.NextDouble() - 0.5) * Game1.levelManager.screenWidth; d.velocity.Y = ((float)Game1.rand.NextDouble() + 2) / 3 * Game1.levelManager.screenHeight / 3; d.setTexture(new AnimatedTexture(Enemy.BASETEX + "Cave/dynamite")); }; Dynamite d1 = dynamitePool.obtain(dynamiteReset); Dynamite d2 = dynamitePool.obtain(dynamiteReset); Dynamite d3 = dynamitePool.obtain(dynamiteReset); dynamite.Add(d1); dynamite.Add(d2); dynamite.Add(d3); Game1.levelManager.enemiesToAddImmediate.Add(d1); Game1.levelManager.enemiesToAddImmediate.Add(d2); Game1.levelManager.enemiesToAddImmediate.Add(d3); timeSinceLastThrow = 0f; } } List<Dynamite> deaddynamite = new List<Dynamite>(); foreach (Dynamite d in dynamite) { if (d.alive) d.Update(gameTime); else deaddynamite.Add(d); } foreach (Dynamite d in deaddynamite) { dynamite.Remove(d); Game1.levelManager.killEnemy(d); } foreach (AnimatedTexture explosion in explosions) explosion.Update(gameTime, this); Console.WriteLine("x=" + exploded + "ex=" + explosions.Count + " fex=" + finishedExplosions.Count); foreach (AnimatedTexture explosion in finishedExplosions) explosions.Remove(explosion); finishedExplosions.Clear(); base.Update(gameTime); }
public void setTexture(string tex) { texture = new AnimatedTexture(tex); }
public override void Update(GameTime gameTime) { if (thrown) { throwAngle += throwDirection * gameTime.ElapsedGameTime.Milliseconds * .01f; position = throwCenter + new Vector2((float)Math.Cos(throwAngle) * throwRadius, -(float)Math.Sin(throwAngle) * throwRadius); if (throwDirection == 1 && throwAngle > Math.PI) { thrown = false; } if (throwDirection == -1 && throwAngle < 0) { thrown = false; } return; } float seconds = (float)gameTime.ElapsedGameTime.TotalSeconds; for (int i = hitboxesHitBy.Count - 1; i >= 0; i--) { if (!hitboxesHitBy[i].intersects(hitbox)) { hitboxesHitBy.RemoveAt(i); continue; } Game1.levelManager.hitboxesToDeactivate.Add(hitboxesHitBy[i]); } if (knockbackTime > 0) { knockbackTime -= seconds; //currentAI = EnemyAI.NoMove; float nextX = position.X + (velocity.X * seconds); float nextY = position.Y + (velocity.Y * seconds); if (!canMove(new Vector2(velocity.X * seconds, 0))) { nextX = position.X; } if (!canMove(new Vector2(0, velocity.Y * seconds))) { nextY = position.Y; } position = new Vector2(nextX, nextY); } if (stunTimer > 0) { stunTimer -= gameTime.ElapsedGameTime.Milliseconds; return; } Vector2 distance; if (currentAI == EnemyAI.SwampBoss || currentAI == EnemyAI.DynamiteBoss) { base.Update(gameTime); return; } if (currentAI != EnemyAI.NoMove && currentAI != EnemyAI.NoMoveKnockback) { if (!target.alive) { target = Game1.characterManager.getRandomLiveCharacter(); } } else { target = Game1.characterManager.getClosestLiveCharacter(position); } if (currentAI == EnemyAI.Neutral) { currentState = EnemyState.Walking; } switch (currentState) { case EnemyState.Walking: { wanderDist += moveSpeed * seconds; if (wanderDist > 200 && wanderStage == 1) { wanderDir = new Vector2((float)Game1.rand.NextDouble(), (float)Game1.rand.NextDouble()); wanderDir.Normalize(); wanderDist = 0; wanderStage = 0; } if (wanderDist > 200 && wanderStage == 0) { wanderDir = -wanderDir; wanderDist = 0; wanderStage = 1; } position = position + moveSpeed * seconds * wanderDir; if (currentAI == EnemyAI.SpawnWords) { attackCooldown += gameTime.ElapsedGameTime.Milliseconds; if (attackCooldown > 1000 / attackSpeed) { attackCooldown = 0; AnimatedTexture oldTexture = texture; setTexture(new AnimatedTexture(Enemy.BASETEX + species + " attack", 3, 500)); texture.setOnFrameAction(3, delegate() { texture = oldTexture; }); Game1.levelManager.delayAddEnemy(8, position); } } break; } case EnemyState.AttackingAll: { attackCooldown += gameTime.ElapsedGameTime.Milliseconds; foreach (Character target in Game1.characterManager.liveCharacters) { distance = target.position - position; if (hitbox.intersects(target.hitbox)) { if (attackCooldown > 1000 / attackSpeed) { target.hitBy(this); timer = 0; AnimatedTexture oldTexture = texture; setTexture(new AnimatedTexture(Enemy.BASETEX + species + " attack", 1, 250)); texture.setOnFrameAction(1, delegate() { texture = oldTexture; if (currentAI == EnemyAI.Flee) { currentState = EnemyState.Blocking; if (species == "word") { setTexture(new AnimatedTexture(Enemy.BASETEX + species + " flee", 2, 150)); } } }); attackCooldown = 0; } } } break; } case EnemyState.Attacking: { if (target != null) { distance = target.position - position; attackCooldown += gameTime.ElapsedGameTime.Milliseconds; if (hitbox.intersects(target.hitbox)) { if (attackCooldown > 1000 / attackSpeed) { target.hitBy(this); timer = 0; AnimatedTexture oldTexture = texture; setTexture(new AnimatedTexture(Enemy.BASETEX + species + " attack", 1, 250)); texture.setOnFrameAction(1, delegate() { texture = oldTexture; if (currentAI == EnemyAI.Flee) { currentState = EnemyState.Blocking; if (species == "word") { setTexture(new AnimatedTexture(Enemy.BASETEX + species + " flee", 2, 150)); } } }); attackCooldown = 0; } } if (hitbox.intersectPercent(target.hitbox) < .25f) { distance.Normalize(); if (disableMovementTime > 0f || disableMovementDistance > 0f && currentAI != EnemyAI.NoMove) { disableMovementTime -= seconds; velocity -= velocity * 0.80f * seconds; disableMovementDistance -= velocity.Length() * seconds; position += velocity * seconds; } else { if (currentAI != EnemyAI.NoMove) { position = position + moveSpeed * seconds * distance; // close in on a target } } } } break; } case EnemyState.Blocking: { timer += gameTime.ElapsedGameTime.TotalSeconds; distance = position - target.position; distance.Normalize(); if (disableMovementTime > 0f || disableMovementDistance > 0f) { disableMovementTime -= seconds; velocity -= velocity * 0.80f * seconds; disableMovementDistance -= velocity.Length() * seconds; position += velocity * seconds; } else { position = position + fleeSpeed * seconds * distance; } alpha -= alpharate * seconds; if (alpha < 0.5f || alpha > 1f) { alpharate = -alpharate; } if (timer > fleeTime) { hitboxesHitBy.Clear(); currentState = EnemyState.Attacking; if (species == "word") { setTexture(new AnimatedTexture(Enemy.BASETEX + species, 2, 150)); } alpha = 1f; timer = 0f; } break; } default: break; } base.Update(gameTime); }