Page Menu
Home
Phabricator (Chris)
Search
Configure Global Search
Log In
Files
F86228
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Flag For Later
Award Token
Size
12 KB
Referenced Files
None
Subscribers
None
View Options
diff --git a/src/BoltEntity.cpp b/src/BoltEntity.cpp
index b6ac770..0f106da 100644
--- a/src/BoltEntity.cpp
+++ b/src/BoltEntity.cpp
@@ -1,416 +1,423 @@
#include "BoltEntity.h"
#include "ExplosionEntity.h"
+#include "EffectZoneEntity.h"
#include "Constants.h"
#include "DungeonMap.h"
#include "WitchBlastGame.h"
#include "sfml_game/ImageManager.h"
#include "sfml_game/SoundManager.h"
BoltEntity::BoltEntity(float x, float y, float boltLifeTime, enumShotType boltType, int level)
: CollidingSpriteEntity (ImageManager::getInstance().getImage(IMAGE_BOLT), x, y, BOLT_WIDTH, BOLT_HEIGHT)
{
lifetime = boltLifeTime;
setDamages(INITIAL_BOLT_DAMAGES);
type = ENTITY_BOLT;
viscosity = INITIAL_BOLT_VISCOSITY;
this->level = level;
if (boltType == ShotTypeLightning) viscosity += LIGHTNING_VISCOSITY_INCREASE[level];
frame = 0;
setMap(game().getCurrentMap(), TILE_WIDTH, TILE_HEIGHT, 0, 0);
this->boltType = boltType;
enemyType = EnemyTypeNone;
goThrough = false;
hitNumber = 0;
fromPlayer = true;
switch (boltType)
{
case ShotTypeDeterministic:
case ShotTypeStandard: frame = 0; break;
case ShotTypeCold:
case ShotTypeIce: frame = 2; break;
case ShotTypeStone: frame = 4; break;
case ShotTypeLightning: frame = 5; goThrough = true; break;
case ShotTypeIllusion: frame = 3; break;
case ShotTypeFire: frame = 6; break;
case ShotTypePoison: frame = 7; break;
case ShotTypeBomb: frame = 8; damages = 0; sprite.setScale(1.0f, 1.0f); break;
}
testWallsCollision = false;
flying = false;
critical = false;
// avoid starting in wall
if (y > ((MAP_HEIGHT - 1) * TILE_HEIGHT - 16))
this->y = (MAP_HEIGHT - 1) * TILE_HEIGHT - 16;
}
int BoltEntity::getDamages()
{
return damages;
}
void BoltEntity::setFromPlayer(bool fromPlayer)
{
this->fromPlayer = fromPlayer;
}
bool BoltEntity::isFromPlayer()
{
return fromPlayer;
}
unsigned int BoltEntity::getLevel()
{
return level;
}
void BoltEntity::setDamages(int damages)
{
this->damages = damages;
if (damages <= 4) renderScale = 0.7f;
else if (damages <= 6) renderScale = 0.78f;
else if (damages <= 8) renderScale = 0.85f;
else if (damages <= 12) renderScale = 0.9f;
else if (damages <= 16) renderScale = 1.0f;
else if (damages <= 20) renderScale = 1.1f;
else if (damages <= 24) renderScale = 1.2f;
else if (damages <= 30) renderScale = 1.3f;
else renderScale = 1.4f;
sprite.scale(renderScale, renderScale);
}
void BoltEntity::loseDamages(int damages)
{
if (this->damages > damages) setDamages(this->damages - damages);
else setDamages(0);
critical = false;
}
enumShotType BoltEntity::getBoltType()
{
return boltType;
}
enemyTypeEnum BoltEntity::getEnemyType()
{
return enemyType;
}
bool BoltEntity::isFlying()
{
return flying;
}
void BoltEntity::setFlying(bool flying)
{
this->flying = flying;
}
bool BoltEntity::isCritical()
{
return critical;
}
void BoltEntity::setCritical(bool critical)
{
this->critical = critical;
}
void BoltEntity::setGoThrough(bool goThrough)
{
this->goThrough = goThrough;
}
bool BoltEntity::getGoThrough()
{
return goThrough;
}
void BoltEntity::animate(float delay)
{
if (boltType != ShotTypeBomb)
particleGenerator.GenerateParticles(frame, IMAGE_BOLT, x, y, BOLT_WIDTH, BOLT_HEIGHT,
boltType == ShotTypeLightning ? Vector2D(20.0f) : Vector2D(0.0f, 0.0f),
10, boltType == ShotTypeIce ? renderScale * 1.3f : renderScale);
z = y + height;
testWallsCollision = true;
if (isCollidingWithMap())
{
- isDying = true;
+ onDying();
SoundManager::getInstance().playSound(SOUND_WALL_IMPACT);
for (int i=0; i<5; i++) generateParticule(100.0f + rand() % 150);
}
else
{
float oldX = x;
float oldY = y;
CollidingSpriteEntity::animate(delay);
if (boltType != ShotTypeBomb && (game().getPlayer()->isEquiped(EQUIP_RAPID_SHOT) || damages < 5))
particleGenerator.GenerateParticles(frame, IMAGE_BOLT, (x + oldX) * 0.5f, (y + oldY) * 0.5f, BOLT_WIDTH, BOLT_HEIGHT,
boltType == ShotTypeLightning ? Vector2D(20.0f) : Vector2D(0.0f, 0.0f),
10, boltType == ShotTypeIce ? renderScale * 1.3f : renderScale);
}
// key room collision
if (game().getCurrentMap()->getRoomType() == roomTypeKey && !game().getCurrentMap()->isCleared())
{
sf::IntRect col1;
col1.width = 198;
col1.height = 68;
col1.top = 254;
col1.left = 380;
sf::IntRect col2;
col2.width = 68;
col2.height = 198;
col2.top = 189;
col2.left = 445;
if (boundingBox.intersects(col1) || boundingBox.intersects(col2))
{
game().activateKeyRoomEffect(false);
if (x < 390) collideMapRight();
else if (x > 565) collideMapLeft();
else if (y < 265) collideMapBottom();
else collideMapTop();
}
}
testWallsCollision = false;
calculateBB();
if (boltType != ShotTypeBomb && boltType != ShotTypeStone && (lifetime - age) < 0.2f)
{
if (age >= lifetime)
sprite.setColor(sf::Color(255, 255, 255, 0));
else
sprite.setColor(sf::Color(255, 255, 255, (sf::Uint8)((lifetime - age) / 0.2f * 255)));
}
- if (((velocity.x)*(velocity.x) + (velocity.y)*(velocity.y)) < 1500.0f) isDying = true;
+ if (((velocity.x)*(velocity.x) + (velocity.y)*(velocity.y)) < 1500.0f) onDying();
}
void BoltEntity::render(sf::RenderTarget* app)
{
if (boltType == ShotTypeBomb)
{
sprite.setTextureRect(sf::IntRect(8 * width, 0, width * 2, height * 2));
sprite.setPosition(x - width / 2, y - height);
app->draw(sprite);
}
else
CollidingSpriteEntity::render(app);
if (game().getShowLogical())
{
displayBoundingBox(app);
}
}
void BoltEntity::calculateBB()
{
int colSize = testWallsCollision ? 1 : 10;
boundingBox.left = x - colSize;
boundingBox.width = colSize * 2;
boundingBox.top = y - colSize;
boundingBox.height = colSize * 2;
}
void BoltEntity::collide()
{
hitNumber++;
if (fromPlayer)
{
if (hitNumber == 4) game().registerAchievement(Achievement4Hits);
if (goThrough)
{
if (damages > 0) return;
}
}
- isDying = true;
+ onDying();
if (boltType == ShotTypeBomb)
explode();
else
{
for (int i=0; i<5; i++)
{
Vector2D vel(40.0f + rand() % 50);
generateParticule(vel);
}
}
}
void BoltEntity::generateParticule(Vector2D vel)
{
SpriteEntity* trace = new SpriteEntity(ImageManager::getInstance().getImage(IMAGE_BOLT), x, y, BOLT_WIDTH, BOLT_HEIGHT);
trace->setFading(true);
trace->setZ(y);
trace->setLifetime(0.5f);
trace->setScale(0.3f, 0.3f);
trace->setVelocity(vel);
trace->setViscosity(0.97f);
trace->setType(ENTITY_EFFECT);
trace->setFrame(frame);
}
bool BoltEntity::collideWithMap(int direction)
{
calculateBB();
int xTile0 = (boundingBox.left - offsetX) / tileWidth;
int xTilef = (boundingBox.left + boundingBox.width - offsetX) / tileWidth;
int yTile0 = (boundingBox.top - offsetY) / tileHeight;
int yTilef = (boundingBox.top + boundingBox.height - offsetY) / tileHeight;
if (boundingBox.top < 0) yTile0 = -1;
for (int xTile = xTile0; xTile <= xTilef; xTile++)
for (int yTile = yTile0; yTile <= yTilef; yTile++)
{
if (boltType != ShotTypeIllusion)
{
if (flying)
{
if ( dynamic_cast<DungeonMap*>(map)->isFlyable(xTile, yTile) == false ) return true;
}
else
{
if ( dynamic_cast<DungeonMap*>(map)->isShootable(xTile, yTile) == false ) return true;
}
}
}
return false;
}
void BoltEntity::onDying()
{
- isDying = true;
+ if (!isDying)
+ {
+ isDying = true;
+
+ // special attacks
+ if (boltType == ShotTypeIce && level == 2)
+ new EffectZoneEntity(x, y, true, 5.0f, EffectZoneTypeIce);
+ }
}
void BoltEntity::stuck()
{
SoundManager::getInstance().playSound(SOUND_WALL_IMPACT);
if (boltType == ShotTypeBomb)
explode();
else
{
for (int i=0; i<5; i++)
{
Vector2D vel(100.0f + rand() % 150);
generateParticule(vel);
}
}
-
onDying();
}
void BoltEntity::collideMapRight()
{
if (boltType == ShotTypeLightning)
{
velocity.x = -velocity.x;
}
else if (boltType == ShotTypeBomb)
explode();
else
{
velocity.x = 0.0f;
- isDying = true;
+ onDying();
SoundManager::getInstance().playSound(SOUND_WALL_IMPACT);
for (int i=0; i<5; i++)
{
Vector2D vel(100.0f + rand() % 150);
if (vel.x > 0.0f) vel.x = - vel.x;
generateParticule(vel);
}
}
}
void BoltEntity::collideMapLeft()
{
if (boltType == ShotTypeLightning)
{
velocity.x = -velocity.x;
}
else if (boltType == ShotTypeBomb)
explode();
else
{
velocity.x = 0.0f;
- isDying = true;
+ onDying();
SoundManager::getInstance().playSound(SOUND_WALL_IMPACT);
for (int i=0; i<5; i++)
{
Vector2D vel(100.0f + rand() % 150);
if (vel.x < 0.0f) vel.x = - vel.x;
generateParticule(vel);
}
}
}
void BoltEntity::collideMapTop()
{
if (boltType == ShotTypeLightning)
{
velocity.y = -velocity.y;
}
else if (boltType == ShotTypeBomb)
explode();
else
{
velocity.y = 0.0f;
- isDying = true;
+ onDying();
SoundManager::getInstance().playSound(SOUND_WALL_IMPACT);
for (int i=0; i<5; i++)
{
Vector2D vel(100.0f + rand() % 150);
if (vel.y < 0.0f) vel.y = - vel.y;
generateParticule(vel);
}
}
}
void BoltEntity::collideMapBottom()
{
if (boltType == ShotTypeLightning)
{
velocity.y = -velocity.y;
}
else if (boltType == ShotTypeBomb)
explode();
else
{
velocity.y = 0.0f;
- isDying = true;
+ onDying();
SoundManager::getInstance().playSound(SOUND_WALL_IMPACT);
for (int i=0; i<5; i++)
{
Vector2D vel(100.0f + rand() % 150);
if (vel.y > 0.0f) vel.y = - vel.y;
generateParticule(vel);
}
}
}
void BoltEntity::explode()
{
- isDying = true;
+ onDying();
new ExplosionEntity(x, y, ExplosionTypeStandard, 12, enemyType, true);
game().makeShake(0.5f);
SoundManager::getInstance().playSound(SOUND_BOOM_00);
game().addCorpse(x, y, FRAME_CORPSE_SLIME_VIOLET);
}
diff --git a/src/EnemyBoltEntity.cpp b/src/EnemyBoltEntity.cpp
index ce54300..a9e1d06 100644
--- a/src/EnemyBoltEntity.cpp
+++ b/src/EnemyBoltEntity.cpp
@@ -1,54 +1,63 @@
#include "EnemyBoltEntity.h"
#include "Constants.h"
#include "sfml_game/ImageManager.h"
#include "WitchBlastGame.h"
EnemyBoltEntity::EnemyBoltEntity(float x, float y, enumShotType boltType, int level, enemyTypeEnum enemyType) :
BoltEntity(x, y, -1, boltType, level)
{
damages = INITIAL_BOLT_DAMAGES;
type = ENTITY_ENEMY_BOLT;
this->enemyType = enemyType;
viscosity = 1.0f;
switch (boltType)
{
case ShotTypeIce: frame = 2; break;
case ShotTypeLightning: frame = 5; break;
case ShotTypeFire: frame = 6; break;
case ShotTypeBomb: frame = 8; break;
case ShotTypeIllusion: frame = 3; break;
default: frame = 1; break;
}
setMap(game().getCurrentMap(), TILE_WIDTH, TILE_HEIGHT, 0, 0);
}
void EnemyBoltEntity::animate(float delay)
{
if (boltType != ShotTypeBomb)
particleGenerator.GenerateParticles(frame, IMAGE_BOLT, x, y, BOLT_WIDTH, BOLT_HEIGHT,
boltType == ShotTypeLightning ? Vector2D(20.0f) : Vector2D(0.0f, 0.0f),
10, renderScale);
z = y + height;
CollidingSpriteEntity::animate(delay);
if (boltType != ShotTypeBomb && (lifetime - age) < 0.2f)
{
if (age >= lifetime)
sprite.setColor(sf::Color(255, 255, 255, 0));
else
sprite.setColor(sf::Color(255, 255, 255, (sf::Uint8)((lifetime - age) / 0.2f * 255)));
}
if (boltType == ShotTypeIllusion)
{
float limit = 16;
if (x < limit
|| x > TILE_WIDTH * MAP_WIDTH - limit
|| y < limit
|| y > TILE_HEIGHT * MAP_HEIGHT - limit)
{
isDying = true;
}
}
}
+
+void EnemyBoltEntity::onDying()
+{
+ if (!isDying)
+ {
+ isDying = true;
+ // TO DO effect zone ?
+ }
+}
diff --git a/src/EnemyBoltEntity.h b/src/EnemyBoltEntity.h
index b5430a8..e900f0d 100644
--- a/src/EnemyBoltEntity.h
+++ b/src/EnemyBoltEntity.h
@@ -1,14 +1,17 @@
#ifndef ENNEMYBOLTENTITY_H
#define ENNEMYBOLTENTITY_H
#include "BoltEntity.h"
class EnemyBoltEntity : public BoltEntity
{
public:
EnemyBoltEntity(float x, float y, enumShotType boltType, int level, enemyTypeEnum enemyType);
virtual void animate(float delay);
+
+ protected:
+ virtual void onDying();
};
#endif // ENNEMYBOLTENTITY_H
File Metadata
Details
Attached
Mime Type
text/x-diff
Expires
Fri, Sep 12, 12:36 AM (1 d, 3 h)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
42759
Default Alt Text
(12 KB)
Attached To
Mode
R78 witchblast
Attached
Detach File
Event Timeline
Log In to Comment