Page MenuHomePhabricator (Chris)

No OneTemporary

Authored By
Unknown
Size
8 KB
Referenced Files
None
Subscribers
None
diff --git a/media/evil_flower.png b/media/evil_flower.png
index 8ad560f..548a476 100644
Binary files a/media/evil_flower.png and b/media/evil_flower.png differ
diff --git a/src/EvilFlowerEntity.cpp b/src/EvilFlowerEntity.cpp
index baf6c81..9b71428 100644
--- a/src/EvilFlowerEntity.cpp
+++ b/src/EvilFlowerEntity.cpp
@@ -1,222 +1,249 @@
#include "EvilFlowerEntity.h"
#include "BoltEntity.h"
#include "EnemyBoltEntity.h"
#include "PlayerEntity.h"
#include "sfml_game/SpriteEntity.h"
#include "sfml_game/ImageManager.h"
#include "sfml_game/SoundManager.h"
#include "Constants.h"
#include "WitchBlastGame.h"
#include <math.h>
EvilFlowerEntity::EvilFlowerEntity(float x, float y, flowerTypeEnum flowerType)
: EnemyEntity (ImageManager::getInstance().getImage(IMAGE_FLOWER), x, y)
{
hp = EVIL_FLOWER_HP;
meleeDamages = EVIL_FLOWER_MELEE_DAMAGES;
setSpin(50.0f);
- imagesProLine = 3;
+ imagesProLine = 5;
this->flowerType = flowerType;
bloodColor = BloodGreen;
fireDelayMax = EVIL_FLOWER_FIRE_DELAY;
fireDelay = EVIL_FLOWER_FIRE_DELAY;
if (flowerType == FlowerTypeStandard)
{
frame = 0;
enemyType = EnemyTypeEvilFlower;
deathFrame = FRAME_CORPSE_FLOWER;
}
else if (flowerType == FlowerTypeIce)
{
- frame = 3;
+ frame = 1;
enemyType = EnemyTypeEvilFlowerIce;
deathFrame = FRAME_CORPSE_FLOWER_ICE;
resistance[ResistanceFrozen] = ResistanceImmune;
resistance[ResistanceIce] = ResistanceVeryHigh;
resistance[ResistanceFire] = ResistanceVeryLow;
}
else if (flowerType == FlowerTypeFire)
{
- frame = 6;
+ frame = 2;
enemyType = EnemyTypeEvilFlowerFire;
deathFrame = FRAME_CORPSE_FLOWER_FIRE;
resistance[ResistanceIce] = ResistanceVeryLow;
resistance[ResistanceFire] = ResistanceVeryHigh;
}
else if (flowerType == FlowerTypePet)
{
- frame = 9;
+ frame = 3;
enemyType = EnemyTypeNone;
fireDelayMax = EVIL_FLOWER_FIRE_DELAY;
fireDelay = EVIL_FLOWER_FIRE_DELAY;
type = ENTITY_EFFECT;
bloodColor = BloodNone;
}
age = -1.0f + (rand() % 2500) * 0.001f;
+ ageFromGen = 0.0f;
z = y + height * 0.5f;
}
void EvilFlowerEntity::animate(float delay)
{
+ ageFromGen += (delay * 2.0f);
float flowerDelay = delay;
if (specialState[SpecialStateIce].active) flowerDelay = delay * specialState[SpecialStateIce].param1;
if (fireDelay < 0.7f) setSpin(500.0f);
else if (fireDelay < 1.4f) setSpin(120.0f);
else setSpin(50.0f);
if (flowerType == FlowerTypePet)
{
age += delay;
if (age > lifetime)
{
isDying = true;
SoundManager::getInstance().playSound(SOUND_INVOKE);
for (int i = 0; i < 8; i++)
{
game().generateStar(sf::Color::White, x, y);
game().generateStar(sf::Color(210, 210, 255), x, y);
}
}
}
else
EnemyEntity::animate(flowerDelay);
angle += spin * flowerDelay;
if (age > 0.0f)
{
fireDelay -= flowerDelay;
if (fireDelay <= 0.0f)
{
if (flowerType == FlowerTypePet)
{
fire();
}
else if (canSee(game().getPlayerPosition().x, game().getPlayerPosition().y))
{
fireDelay = EVIL_FLOWER_FIRE_DELAY;
fire();
}
else
fireDelay = 0.35f;
}
}
}
+bool EvilFlowerEntity::canCollide()
+{
+ return (!isAgonising && flowerType != FlowerTypePet && ageFromGen > 0.8f);
+}
+
void EvilFlowerEntity::setFireDelayMax(float fireDelayMax)
{
this->fireDelayMax = fireDelayMax;
}
void EvilFlowerEntity::calculateBB()
{
boundingBox.left = (int)x - width / 2 + EVIL_FLOWER_BB_LEFT;
boundingBox.width = width - EVIL_FLOWER_BB_WIDTH_DIFF;
boundingBox.top = (int)y - height / 2 + EVIL_FLOWER_BB_TOP;
boundingBox.height = height - EVIL_FLOWER_BB_HEIGHT_DIFF;
}
void EvilFlowerEntity::fire()
{
if (flowerType == FlowerTypeIce)
{
SoundManager::getInstance().playSound(SOUND_BLAST_ICE);
for (int i = 0; i < 2; i++)
{
EnemyBoltEntity* bolt = new EnemyBoltEntity
(x, y + 10, ShotTypeIce, 0, enemyType);
bolt->setDamages(EVIL_FLOWER_MISSILE_DAMAGES);
bolt->setMap(map, TILE_WIDTH, TILE_HEIGHT, 0, 0);
float flowerFireVelocity = EVIL_FLOWER_FIRE_VELOCITY;
float fireAngle = Vector2D(x, y).angleTo(game().getPlayerPosition());
if (i == 0) fireAngle += 0.1f;
else fireAngle -= 0.1f;
if (game().getPlayerPosition().y > y)
bolt->setVelocity(Vector2D(sin(fireAngle) * flowerFireVelocity, cos(fireAngle) * flowerFireVelocity));
else
bolt->setVelocity(Vector2D(-sin(fireAngle) * flowerFireVelocity, -cos(fireAngle) * flowerFireVelocity));
}
}
else if (flowerType == FlowerTypeFire)
{
SoundManager::getInstance().playSound(SOUND_BLAST_FIRE);
for (int i = 0; i < 2; i++)
{
EnemyBoltEntity* bolt = new EnemyBoltEntity
(x, y + 10, ShotTypeFire, 0, enemyType);
bolt->setDamages(EVIL_FLOWER_FIRE_MISSILE_DAMAGES);
bolt->setMap(map, TILE_WIDTH, TILE_HEIGHT, 0, 0);
float flowerFireVelocity = EVIL_FLOWER_FIRE_VELOCITY;
float fireAngle = Vector2D(x, y).angleTo(game().getPlayerPosition());
if (i == 0) fireAngle += 0.1f;
else fireAngle -= 0.1f;
if (game().getPlayerPosition().y > y)
bolt->setVelocity(Vector2D(sin(fireAngle) * flowerFireVelocity, cos(fireAngle) * flowerFireVelocity));
else
bolt->setVelocity(Vector2D(-sin(fireAngle) * flowerFireVelocity, -cos(fireAngle) * flowerFireVelocity));
}
}
else if (flowerType == FlowerTypePet)
{
Vector2D target = game().getNearestEnemy(x, y);
if (target.x > -1.0f)
{
SoundManager::getInstance().playSound(SOUND_BLAST_STANDARD);
BoltEntity* bolt = new BoltEntity (x, y + 10, 6, ShotTypeStandard, 0);
bolt->setVelocity(Vector2D(x, y).vectorTo(target, 2 * EVIL_FLOWER_FIRE_VELOCITY));
bolt->setViscosity(1.0f);
fireDelay = fireDelayMax;
}
else
fireDelay = 0.35f;
}
else
{
SoundManager::getInstance().playSound(SOUND_BLAST_FLOWER);
EnemyBoltEntity* bolt = new EnemyBoltEntity
(x, y + 10, ShotTypeStandard, 0, enemyType);
bolt->setDamages(EVIL_FLOWER_MISSILE_DAMAGES);
bolt->setMap(map, TILE_WIDTH, TILE_HEIGHT, 0, 0);
float flowerFireVelocity = EVIL_FLOWER_FIRE_VELOCITY;
if (specialState[SpecialStateIce].active) flowerFireVelocity *= 0.5f;
bolt->setVelocity(Vector2D(x, y).vectorTo(game().getPlayerPosition(), flowerFireVelocity ));
}
}
-bool EvilFlowerEntity::canCollide()
-{
- return flowerType != FlowerTypePet;
-}
-
void EvilFlowerEntity::render(sf::RenderTarget* app)
{
sprite.setPosition(x, y);
float savedAngle = sprite.getRotation();
sprite.setRotation(0.0f);
// shadow
- sprite.setTextureRect(sf::IntRect(width * 2, 0, width, height));
- app->draw(sprite);
- sprite.setTextureRect(sf::IntRect(width, 0, width, height));
+ sprite.setTextureRect(sf::IntRect(width * 4, 0, width, height));
+ if (ageFromGen > 1.0f)
+ {
+ if (ageFromGen >= 2.0f) app->draw(sprite);
+ else
+ {
+ float scale = ageFromGen - 1.0f;
+ sprite.setScale(scale, scale);
+ app->draw(sprite);
+ sprite.setScale(1.0f, 1.0f);
+ }
+ }
+
+ // stem
+ int stemFrame = 14;
+ if (ageFromGen < 1.0f) stemFrame = 5 + ageFromGen * 10;
+
+ sprite.setTextureRect(sf::IntRect(width * (stemFrame % imagesProLine), height * (stemFrame / imagesProLine), width, height));
app->draw(sprite);
sprite.setRotation(savedAngle);
- EnemyEntity::render(app);
+ if (ageFromGen > 1.0f)
+ {
+ if (ageFromGen >= 2.0f) EnemyEntity::render(app);
+ else
+ {
+ float scale = ageFromGen - 1.0f;
+ sprite.setScale(scale, scale);
+ EnemyEntity::render(app);
+ sprite.setScale(1.0f, 1.0f);
+ }
+ }
}
diff --git a/src/EvilFlowerEntity.h b/src/EvilFlowerEntity.h
index c3420cb..8e8ca83 100644
--- a/src/EvilFlowerEntity.h
+++ b/src/EvilFlowerEntity.h
@@ -1,26 +1,28 @@
#ifndef EVILFLOWER_H
#define EVILFLOWER_H
#include "EnemyEntity.h"
#include "PlayerEntity.h"
enum flowerTypeEnum { FlowerTypeStandard, FlowerTypeIce, FlowerTypeFire, FlowerTypePet };
class EvilFlowerEntity : public EnemyEntity
{
public:
EvilFlowerEntity(float x, float y, flowerTypeEnum flowerType);
virtual void animate(float delay);
virtual void calculateBB();
virtual void render(sf::RenderTarget* app);
void fire();
virtual bool canCollide();
void setFireDelayMax(float fireDelayMax);
+
private:
float fireDelay;
float fireDelayMax;
flowerTypeEnum flowerType;
+ float ageFromGen;
};
#endif // EVILFLOWER_H

File Metadata

Mime Type
text/x-diff
Expires
Wed, Jun 17, 9:34 PM (1 w, 5 d ago)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
69890
Default Alt Text
(8 KB)

Event Timeline