3131#include " ../Engine/Font.h"
3232#include " ../Engine/Language.h"
3333#include " ../Engine/Palette.h"
34+ #include " ../Engine/RNG.h"
3435#include " ../Engine/Game.h"
3536#include " ../Savegame/SavedBattleGame.h"
3637#include " ../Savegame/Tile.h"
@@ -319,7 +320,6 @@ void Map::drawTerrain()
319320 }
320321 }
321322
322-
323323 // Draw cursor front
324324 if (_selectorX == itY && _selectorY == itX && !_hideCursor)
325325 {
@@ -339,7 +339,8 @@ void Map::drawTerrain()
339339 frame->setY (screenPosition.y );
340340 frame->blit (this );
341341 }
342-
342+
343+ tile = _save->getTile (mapPosition);
343344 // Draw smoke/fire
344345 if (tile->getFire () && tile->isDiscovered ())
345346 {
@@ -349,6 +350,14 @@ void Map::drawTerrain()
349350 frame->setY (screenPosition.y );
350351 frame->blit (this );
351352 }
353+ if (tile->getSmoke () && tile->isDiscovered ())
354+ {
355+ frameNumber = 8 + int (floor ((tile->getSmoke () / 5.0 ) - 0.1 )); // see http://www.ufopaedia.org/images/c/cb/Smoke.gif
356+ frame = _res->getSurfaceSet (" SMOKE.PCK" )->getFrame (frameNumber + (_animFrame / 2 ));
357+ frame->setX (screenPosition.x );
358+ frame->setY (screenPosition.y );
359+ frame->blit (this );
360+ }
352361
353362 }
354363 }
@@ -393,9 +402,15 @@ void Map::keyboardPress(Action *action, State *state)
393402 // "f" - puts a tile on fire (for testing purposes)
394403 if (action->getDetails ()->key .keysym .sym == SDLK_f)
395404 {
396- _save->getTile (pos)->setFire (1 );
405+ _save->getTile (pos)->setFire (RNG::generate ( 1 , 5 ) );
397406 _save->getTerrainModifier ()->calculateLighting ();
398407 }
408+ // "s" - puts a tile on smoke (for testing purposes)
409+ if (action->getDetails ()->key .keysym .sym == SDLK_s)
410+ {
411+ _save->getTile (pos)->setSmoke (RNG::generate (1 ,50 ));
412+ // _save->getTerrainModifier()->calculateLighting();
413+ }
399414}
400415
401416/* *
@@ -581,7 +596,8 @@ void Map::scroll()
581596 */
582597void Map::animate ()
583598{
584- _animFrame = _animFrame == 7 ? 0 : _animFrame+1 ;
599+ _animFrame++;
600+ if (_animFrame == 8 ) _animFrame = 0 ;
585601
586602 for (int i = 0 ; i < _tileCount; i++)
587603 {
@@ -691,29 +707,31 @@ void Map::getSelectorPosition(Position *pos)
691707 */
692708void Map::calculateWalkingOffset (BattleUnit *unit, Position *offset)
693709{
694- int offsetX[8 ] = { 1 , 2 , 1 , 0 , -1 , -2 , -1 , 0 };
695- int offsetY[8 ] = { 1 , 0 , -1 , -2 , -1 , 0 , 1 , 2 };
696- int phase = unit->getWalkingPhase ();
710+ int offsetX[8 ] = { 1 , 1 , 1 , 0 , -1 , -1 , -1 , 0 };
711+ int offsetY[8 ] = { 1 , 0 , -1 , -1 , -1 , 0 , 1 , 1 };
712+ int phase = unit->getWalkingPhase () + unit-> getDiagonalWalkingPhase () ;
697713 int dir = unit->getDirection ();
714+ int midphase = 4 + 4 * (dir % 2 );
715+ int endphase = 8 + 8 * (dir % 2 );
698716
699- if (phase )
717+ if (unit-> getStatus () == STATUS_WALKING )
700718 {
701- if (phase < 4 )
719+ if (phase < midphase )
702720 {
703721 offset->x = phase * 2 * offsetX[dir];
704722 offset->y = - phase * offsetY[dir];
705723 }
706724 else
707725 {
708- offset->x = (phase - 8 ) * 2 * offsetX[dir];
709- offset->y = - (phase - 8 ) * offsetY[dir];
726+ offset->x = (phase - endphase ) * 2 * offsetX[dir];
727+ offset->y = - (phase - endphase ) * offsetY[dir];
710728 }
711729 }
712730
713731 // If we are walking in between tiles, interpolate it's terrain level.
714- if (phase )
732+ if (unit-> getStatus () == STATUS_WALKING )
715733 {
716- if (phase < 4 )
734+ if (phase < midphase )
717735 {
718736 int fromLevel = _save->getTile (unit->getPosition ())->getTerrainLevel ();
719737 int toLevel = _save->getTile (unit->getDestination ())->getTerrainLevel ();
@@ -726,7 +744,7 @@ void Map::calculateWalkingOffset(BattleUnit *unit, Position *offset)
726744 // going up a level, so toLevel 0 becomes -24, -8 becomes -16
727745 toLevel = -24 *(unit->getDestination ().z - unit->getPosition ().z ) + abs (toLevel);
728746 }
729- offset->y += ((fromLevel * (8 - phase)) / 8 ) + ((toLevel * (phase)) / 8 );
747+ offset->y += ((fromLevel * (endphase - phase)) / endphase ) + ((toLevel * (phase)) / endphase );
730748 }
731749 else
732750 {
@@ -743,7 +761,7 @@ void Map::calculateWalkingOffset(BattleUnit *unit, Position *offset)
743761 // going up a level, so fromLevel 0 becomes +24, -8 becomes 16
744762 fromLevel = -24 *(unit->getDestination ().z - unit->getLastPosition ().z ) + abs (fromLevel);
745763 }
746- offset->y += ((fromLevel * (8 - phase)) / 8 ) + ((toLevel * (phase)) / 8 );
764+ offset->y += ((fromLevel * (endphase - phase)) / endphase ) + ((toLevel * (phase)) / endphase );
747765 }
748766 }
749767 else
@@ -925,16 +943,11 @@ void Map::cacheUnits()
925943 unitSprite->draw ();
926944 unitSprite->blit (_unitCache.at ((*i)->getId ()));
927945
928- // non player units get shaded according to the tile's shade
929- if ((*i)->getFaction () != FACTION_PLAYER )
930- {
931- _unitCache.at ((*i)->getId ())->setShade (_save->getTile ((*i)->getPosition ())->getShade ());
932- }
946+ _unitCache.at ((*i)->getId ())->setShade (_save->getTile ((*i)->getPosition ())->getShade ());
947+ (*i)->setCached (true );
933948 }
934949 }
935950 delete unitSprite;
936951}
937952
938-
939-
940953}
0 commit comments