Skip to content

Commit 43c55b5

Browse files
committed
- Added fire spreading/destruction.
- Added debug mode 'd' - Fixed little pathfinding bug.
1 parent ab01122 commit 43c55b5

19 files changed

Lines changed: 244 additions & 55 deletions

‎src/Battlescape/BattlescapeState.cpp‎

Lines changed: 43 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,8 @@ BattlescapeState::BattlescapeState(Game *game) : State(game)
101101
_numMorale = new NumberText(15, 5, 154, 194);
102102
_barMorale = new Bar(102, 3, 170, 197);
103103

104+
_txtDebug = new Text(300, 10, 20, 0);
105+
104106
_reserve = _btnReserveNone;
105107

106108
// Set palette
@@ -160,6 +162,7 @@ BattlescapeState::BattlescapeState(Game *game) : State(game)
160162
add(_btnRightHandItem);
161163
add(_numAmmoRight);
162164

165+
add(_txtDebug);
163166
// Set up objects
164167
_game->getResourcePack()->getSurface("ICONS.PCK")->blit(_icons);
165168

@@ -203,6 +206,9 @@ BattlescapeState::BattlescapeState(Game *game) : State(game)
203206
_barMorale->setColor(Palette::blockOffset(12));
204207
_barMorale->setScale(1.0);
205208

209+
_txtDebug->setColor(Palette::blockOffset(8)-1);
210+
_txtDebug->setHighContrast(true);
211+
206212
updateSoldierInfo(_battleGame->getSelectedUnit());
207213
_map->centerOnPosition(_battleGame->getSelectedUnit()->getPosition());
208214

@@ -233,7 +239,6 @@ BattlescapeState::BattlescapeState(Game *game) : State(game)
233239
_animTimer->onTimer((StateHandler)&BattlescapeState::animate);
234240
_animTimer->start();
235241

236-
237242
_selectedAction = BA_NONE;
238243
}
239244

@@ -403,7 +408,7 @@ void BattlescapeState::btnKneelClick(Action *action)
403408
BattleUnit *bu = _battleGame->getSelectedUnit();
404409
if (bu)
405410
{
406-
if (bu->spendTimeUnits(bu->isKneeled()?8:4))
411+
if (bu->spendTimeUnits(bu->isKneeled()?8:4, _battleGame->getDebugMode()))
407412
{
408413
bu->kneel(!bu->isKneeled());
409414
_map->cacheUnits();
@@ -585,6 +590,8 @@ void BattlescapeState::updateSoldierInfo(BattleUnit *battleUnit)
585590
{
586591
drawItemSprite(rightHandItem, _btnRightHandItem);
587592
}
593+
594+
588595
}
589596

590597
/*
@@ -636,6 +643,8 @@ void BattlescapeState::handleState()
636643
*/
637644
void BattlescapeState::animate()
638645
{
646+
_animFrame++;
647+
if (_animFrame == 8) _animFrame = 0;
639648
_map->animate();
640649
}
641650

@@ -764,4 +773,36 @@ void BattlescapeState::setStateInterval(Uint32 interval)
764773
_stateTimer->setInterval(interval);
765774
}
766775

776+
/**
777+
* Show a debug message in the topleft corner.
778+
* @param message Debug message.
779+
*/
780+
void BattlescapeState::debug(const std::wstring message)
781+
{
782+
if (_battleGame->getDebugMode())
783+
{
784+
_txtDebug->setText(message);
785+
}
786+
}
787+
788+
/**
789+
* Takes care of any events from the core game engine.
790+
* @param action Pointer to an action.
791+
*/
792+
void BattlescapeState::handle(Action *action)
793+
{
794+
State::handle(action);
795+
796+
if (action->getDetails()->type == SDL_KEYDOWN)
797+
{
798+
// "d" - enable debug mode
799+
if (action->getDetails()->key.keysym.sym == SDLK_d)
800+
{
801+
_battleGame->setDebugMode();
802+
debug(L"Debug Mode");
803+
}
804+
}
805+
806+
}
807+
767808
}

‎src/Battlescape/BattlescapeState.h‎

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,11 +60,14 @@ class BattlescapeState : public State
6060
ImageButton *_reserve;
6161
ImageButton *_btnReserveNone, *_btnReserveSnap, *_btnReserveAimed, *_btnReserveAuto;
6262
ImageButton *_btnLeftHandItem, *_btnRightHandItem;
63+
InteractiveSurface *_btnVisibleUnit[10];
6364
Text *_txtName;
6465
NumberText *_numTimeUnits, *_numEnergy, *_numHealth, *_numMorale, *_numLayers, *_numAmmoLeft, *_numAmmoRight;
6566
Bar *_barTimeUnits, *_barEnergy, *_barHealth, *_barMorale;
6667
Timer *_stateTimer, *_animTimer;
6768
SavedBattleGame *_battleGame;
69+
Text *_txtDebug;
70+
int _animFrame;
6871

6972
BattleActionType _selectedAction;
7073
BattleItem *_selectedItem;
@@ -142,6 +145,10 @@ class BattlescapeState : public State
142145
void setStateInterval(Uint32 interval);
143146
/// Get selected item.
144147
BattleItem *getSelectedItem() const;
148+
/// Show debug message.
149+
void debug(const std::wstring message);
150+
/// Handle keypresses.
151+
void handle(Action *action);
145152
};
146153

147154
}

‎src/Battlescape/Map.cpp‎

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -549,17 +549,9 @@ void Map::mouseClick(Action *action, State *state)
549549
*/
550550
void Map::keyboardPress(Action *action, State *state)
551551
{
552-
Position pos;
553-
getSelectorPosition(&pos);
552+
//Position pos;
553+
//getSelectorPosition(&pos);
554554
InteractiveSurface::keyboardPress(action, state);
555-
556-
// "d" - enable debug mode
557-
if (action->getDetails()->key.keysym.sym == SDLK_d)
558-
{
559-
_save->setDebugMode();
560-
cacheTileSprites();
561-
}
562-
563555
}
564556

565557
/**

‎src/Battlescape/Pathfinding.cpp‎

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -204,9 +204,17 @@ int Pathfinding::getTUCost(const Position &startPosition, int direction, Positio
204204
fellDown = true;
205205
}
206206

207+
// if we don't want to fall down and there is no floor, it ends here
208+
if (!fellDown && destinationTile->hasNoFloor())
209+
{
210+
return 255;
211+
}
212+
207213
// check if the destination tile can be walked over
208214
if ((isBlocked(destinationTile, O_FLOOR) || isBlocked(destinationTile, O_OBJECT)) && !fellDown)
215+
{
209216
return 255;
217+
}
210218

211219
// calculate the cost by adding floor walk cost and object walk cost
212220
int cost = destinationTile->getTUCost(O_FLOOR, _movementType);
@@ -360,7 +368,8 @@ bool Pathfinding::canFallDown(Tile *here)
360368
if (here->getPosition().z == 0)
361369
return false;
362370

363-
if (_save->selectUnit(here->getPosition() + Position(0, 0, -1)))
371+
if (_save->selectUnit(here->getPosition() + Position(0, 0, -1)) &&
372+
_save->selectUnit(here->getPosition() + Position(0, 0, -1)) != _unit)
364373
return false;
365374

366375
if (!here || here->hasNoFloor())

‎src/Battlescape/Projectile.cpp‎

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -157,14 +157,8 @@ void Projectile::applyAccuracy(const Position& origin, Position *target, double
157157
double rotation, tilt;
158158
double baseDeviation = (maxDeviation - (maxDeviation * accuracy)) + minDeviation;
159159
// the angle deviations are spread using a normal distribution between 0 and baseDeviation
160-
dRot = RNG::getNormal() * baseDeviation;
161-
dTilt = RNG::getNormal() * baseDeviation;
162-
// or in the other direction perhaps
163-
if (RNG::generate(0,1) == 1)
164-
dRot *= -1;
165-
if (RNG::generate(0,1) == 1)
166-
dTilt *= -1;
167-
dTilt /= 10.0; // test
160+
dRot = RNG::boxMuller(0, baseDeviation);
161+
dTilt = RNG::boxMuller(0, baseDeviation / 10.0);
168162
rotation = atan2(double(target->y - origin.y), double(target->x - origin.x)) * 180 / M_PI;
169163
tilt = atan2(double(target->z - origin.z),
170164
sqrt(double(target->x - origin.x)*double(target->x - origin.x)+double(target->y - origin.y)*double(target->y - origin.y))) * 180 / M_PI;

‎src/Battlescape/ProjectileFlyBState.cpp‎

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,15 @@ void ProjectileFlyBState::think()
9797
if(!_parent->getMap()->getProjectile()->move())
9898
{
9999
// impact !
100-
_parent->statePushNext(new ExplosionBState(_parent, _parent->getMap()->getProjectile()->getPosition(0), _parent->getSelectedItem()));
100+
int offset = 0;
101+
// explosions impact not inside the voxel but one step back
102+
if (_parent->getSelectedItem()->getAmmoItem() && (
103+
_parent->getSelectedItem()->getAmmoItem()->getRules()->getDamageType() == DT_HE ||
104+
_parent->getSelectedItem()->getAmmoItem()->getRules()->getDamageType() == DT_IN))
105+
{
106+
offset = -1;
107+
}
108+
_parent->statePushNext(new ExplosionBState(_parent, _parent->getMap()->getProjectile()->getPosition(offset), _parent->getSelectedItem()));
101109

102110
delete _parent->getMap()->getProjectile();
103111
_parent->getMap()->setProjectile(0);

‎src/Battlescape/TerrainModifier.cpp‎

Lines changed: 80 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -442,9 +442,9 @@ void TerrainModifier::explode(const Position &center, int power, ItemDamageType
442442
}
443443
else
444444
{
445-
double centerZ = (center.z / 24) + 0.5;
446-
double centerX = (center.x / 16) + 0.5;
447-
double centerY = (center.y / 16) + 0.5;
445+
double centerZ = (int)(center.z / 24) + 0.5;
446+
double centerX = (int)(center.x / 16) + 0.5;
447+
double centerY = (int)(center.y / 16) + 0.5;
448448
int power_;
449449

450450
if (type == DT_IN)
@@ -496,13 +496,17 @@ void TerrainModifier::explode(const Position &center, int power, ItemDamageType
496496
if (type == DT_SMOKE)
497497
{
498498
// smoke from explosions always stay 15 to 20 turns
499-
dest->setSmoke(RNG::generate(15, 20));
499+
if (dest->getSmoke() < 10)
500+
{
501+
dest->addSmoke(RNG::generate(15, 20));
502+
}
500503
}
501504
if (type == DT_IN)
502505
{
503-
// fire from explosions always stay 1 to 2 turns + it ignites stuff
504-
dest->setFire(RNG::generate(15, 20));
505-
dest->ignite();
506+
if (dest->getFire() == 0)
507+
{
508+
dest->ignite();
509+
}
506510
}
507511
}
508512

@@ -846,4 +850,73 @@ void TerrainModifier::spawnItem(const Position &position, BattleItem *item)
846850
_save->getTile(p)->addItem(item);
847851
}
848852

853+
/**
854+
* New turn preparations. Like fire and smoke spreading.
855+
*/
856+
void TerrainModifier::prepareNewTurn()
857+
{
858+
std::vector<Tile*> tilesOnFire;
859+
std::vector<Tile*> tilesOnSmoke;
860+
861+
// prepare a list of tiles on fire/smoke
862+
for (int i = 0; i < _save->getWidth() * _save->getLength() * _save->getHeight(); i++)
863+
{
864+
if (_save->getTiles()[i]->getFire() > 0)
865+
{
866+
tilesOnFire.push_back(_save->getTiles()[i]);
867+
}
868+
if (_save->getTiles()[i]->getSmoke() > 0)
869+
{
870+
tilesOnSmoke.push_back(_save->getTiles()[i]);
871+
}
872+
}
873+
874+
for (std::vector<Tile*>::iterator i = tilesOnSmoke.begin(); i != tilesOnSmoke.end(); i++)
875+
{
876+
877+
(*i)->prepareNewTurn();
878+
}
879+
880+
for (std::vector<Tile*>::iterator i = tilesOnFire.begin(); i != tilesOnFire.end(); i++)
881+
{
882+
int z = (*i)->getPosition().z;
883+
for (int x = (*i)->getPosition().x-1; x <= (*i)->getPosition().x+1; x++)
884+
{
885+
for (int y = (*i)->getPosition().y-1; y <= (*i)->getPosition().y+1; y++)
886+
{
887+
Tile *t = _save->getTile(Position(x, y, z));
888+
if (t && t->getFire() == 0)
889+
{
890+
// check adjacent tiles - if they have a flammability of < 255, there is a chance...
891+
if (horizontalBlockage((*i), t, DT_IN) == 0)
892+
{
893+
int flam = t->getFlammability();
894+
if (flam < 255)
895+
{
896+
double base = RNG::boxMuller(0,126);
897+
if (base < 0) base *= -1;
898+
899+
if (flam < base)
900+
{
901+
if (RNG::generate(0, flam) < 2)
902+
{
903+
t->ignite();
904+
}
905+
}
906+
}
907+
}
908+
}
909+
}
910+
}
911+
912+
(*i)->prepareNewTurn();
913+
}
914+
915+
if (tilesOnFire.size() > 0)
916+
{
917+
calculateTerrainLighting(); // fires could have been stopped
918+
}
919+
920+
}
921+
849922
}

‎src/Battlescape/TerrainModifier.h‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,8 @@ class TerrainModifier
7474
int calculateLine(const Position& origin, const Position& target, bool storeTrajectory, std::vector<Position> *trajectory);
7575
/// Add item & affect with gravity.
7676
void spawnItem(const Position &position, BattleItem *item);
77+
/// New turn preparations.
78+
void prepareNewTurn();
7779

7880
};
7981

‎src/Battlescape/UnitFallBState.cpp‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,7 @@ void UnitFallBState::think()
108108

109109
if (_unit->getStatus() == STATUS_DEAD || _unit->getStatus() == STATUS_UNCONSCIOUS)
110110
{
111+
_unit->keepFalling();
111112
TerrainModifier *terrain = _parent->getGame()->getSavedGame()->getBattleGame()->getTerrainModifier();
112113
convertUnitToCorpse(_unit, terrain);
113114
terrain->calculateUnitLighting();

‎src/Battlescape/UnitTurnBState.cpp‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ void UnitTurnBState::init()
7373

7474
void UnitTurnBState::think()
7575
{
76-
if (_unit->spendTimeUnits(1))
76+
if (_unit->spendTimeUnits(1, _parent->getGame()->getSavedGame()->getBattleGame()->getDebugMode()))
7777
{
7878
_unit->turn();
7979
_parent->getGame()->getSavedGame()->getBattleGame()->getTerrainModifier()->calculateFOV(_unit);

0 commit comments

Comments
 (0)