aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--engines/prince/hero.cpp290
-rw-r--r--engines/prince/hero.h14
-rw-r--r--engines/prince/prince.cpp13
3 files changed, 220 insertions, 97 deletions
diff --git a/engines/prince/hero.cpp b/engines/prince/hero.cpp
index feec86efbb..9d4d43eefc 100644
--- a/engines/prince/hero.cpp
+++ b/engines/prince/hero.cpp
@@ -27,15 +27,17 @@
#include "prince/animation.h"
#include "prince/resource.h"
#include "prince/prince.h"
-
+#include "prince/graphics.h"
namespace Prince {
-Hero::Hero(PrinceEngine *vm) : _vm(vm), _number(0), _visible(false), _state(MOVE), _middleX(0), _middleY(0)
+Hero::Hero(PrinceEngine *vm, GraphicsMan *graph) : _vm(vm), _graph(graph)
+ , _number(0), _visible(false), _state(MOVE), _middleX(0), _middleY(0)
, _boreNum(1), _currHeight(0), _moveDelay(0), _shadMinus(0), _moveSetType(0)
, _lastDirection(DOWN), _destDirection(DOWN), _talkTime(0), _boredomTime(0), _phase(0)
, _specAnim(0), _drawX(0), _drawY(0), _randomSource("prince"), _zoomFactor(0), _scaleValue(0)
- , _shadZoomFactor(0), _shadScaleValue(0), _shadowLineLen(0)
+ , _shadZoomFactor(0), _shadScaleValue(0), _shadowLineLen(0), _shadowDrawX(0), _shadowDrawY(0)
+ , _shadLastY(0)
{
_zoomBitmap = new Animation();
_shadowBitmap = new Animation();
@@ -262,19 +264,32 @@ static void plot(int x, int y, int color, void *data) {
shadowLine->_shadowLineLen++;
}
-Graphics::Surface *Hero::showHeroShadow(Graphics::Surface *heroFrame) {
+void Hero::showHeroShadow() {
+//Graphics::Surface *Hero::showHeroShadow() {
+ int16 phaseFrameIndex = _moveSet[_moveSetType]->getPhaseFrameIndex(_phase);
+ Graphics::Surface *heroFrame = _moveSet[_moveSetType]->getFrame(phaseFrameIndex);
int16 frameXSize = _moveSet[_moveSetType]->getFrameWidth(_phase);
int16 frameYSize = _moveSet[_moveSetType]->getFrameHeight(_phase);
Graphics::Surface *makeShadow = new Graphics::Surface();
makeShadow->create(frameXSize, frameYSize, Graphics::PixelFormat::createFormatCLUT8());
+ //Graphics::Surface *destShadow = new Graphics::Surface();
+ //destShadow->create(frameXSize, frameYSize, Graphics::PixelFormat::createFormatCLUT8());
+ /*
+ for (int y = 0; y < frameYSize; y++) {
+ byte *src = (byte *)destShadow->getBasePtr(0, y);
+ for (int x = 0; x < frameXSize; x++, src++) {
+ *src = 0xFF;
+ }
+ }
+ */
for (int y = 0; y < frameYSize; y++) {
- byte *dst = (byte *)makeShadow->getBasePtr(0, y);
byte *src = (byte *)heroFrame->getBasePtr(0, y);
+ byte *dst = (byte *)makeShadow->getBasePtr(0, y);
for (int x = 0; x < frameXSize; x++, dst++, src++) {
- if (*dst == 0xFF) {
+ if (*src != 0xFF) {
*dst = kShadowColor;
} else {
*dst = *src;
@@ -297,23 +312,26 @@ Graphics::Surface *Hero::showHeroShadow(Graphics::Surface *heroFrame) {
// ebx = _lightY
// eax = _lightX
- int shadowDirection;
+ int shadDirection;
if (_lightY > destY) {
- shadowDirection = 1;
+ shadDirection = 1;
} else {
- shadowDirection = 0;
+ shadDirection = 0;
}
- //int shadWallDown = 0;
+ int shadWallDown = 0;
_shadowLineLen = 0;
Graphics::drawLine(_lightX, _lightY, destX, destY, 0, &plot, this);
- // sprShadow = shadowTable70
+ byte *sprShadow = (byte *)_graph->_shadowTable70;
// sprModulo = modulo of source Bitmap
int sprWidth = scaledX;
int sprHeight = scaledY;
- int sprDestX = destX - _vm->_picWindowX;
- int sprDestY = destY - _vm->_picWindowY;
+ int sprDestX = destX - _vm->_picWindowX; //test this
+ int sprDestY = destY - _vm->_picWindowY; //test this
+
+ _shadowDrawX = sprDestX; // to fix
+ _shadowDrawY = sprDestY;
int shadPosX = sprDestX;
int shadMinX = sprDestX;
@@ -322,31 +340,36 @@ Graphics::Surface *Hero::showHeroShadow(Graphics::Surface *heroFrame) {
int shadPosY = sprDestY;
int shadMinY = sprDestY;
int shadMaxY = sprDestY;
- // destY * kMaxPicWidth / 8 + destX / 8
- int shadBitAddr = _shadowBitmap->getZoom(destY * kMaxPicWidth / 8 + destX / 8);
+ int shadBitAddr = destY * kMaxPicWidth / 8 + destX / 8; // for temp _shadowBitmap->getZoom()
int shadBitMask = 128 >> (destX % 8);
int shadZoomY2 = _shadScaleValue;
int shadZoomY = _scaleValue;
// lockscreen etc
+ //byte *destShadowStart = (byte *)destShadow->getBasePtr(0, 0); // need this?
+ byte *shadowStart = (byte *)makeShadow->getBasePtr(0, frameYSize - 1); // !TEST IT! esi, first pixel from last row of black hero
+ byte *background = (byte *)_graph->_frontScreen->getBasePtr(sprDestX, sprDestY); // !TEST IT! eax, pixel of background where shadow sprite starts
+ //byte *background = (byte *)_graph->_frontScreen->getBasePtr(sprDestX, sprDestY + frameYSize);
+ int diff = 0;
+
// banked2
- byte *start = _shadowLine + 8;
+ byte *shadowLineStart = _shadowLine + 8;
// linear_loop
- //for(int i = 0; i < ; i++) {
+ for(int i = 0; i < sprHeight; i++) {
int ebx16795 = shadPosY;
int sprModulo = 0;
int shadSkipX = 0;
int ebxOnStack;
//retry_line:
- for (ebxOnStack = sprHeight; ebxOnStack > 0; ebxOnStack--) {
+ for (ebxOnStack = sprHeight - i; ebxOnStack > 0; ebxOnStack--) {
shadZoomY -= 100;
if (shadZoomY < 0 && _scaleValue != 10000) {
shadZoomY += _scaleValue;
- // esi -= sprWidth
+ shadowStart -= sprWidth;
} else {
break; //to line_y_ok
}
@@ -356,97 +379,190 @@ Graphics::Surface *Hero::showHeroShadow(Graphics::Surface *heroFrame) {
// koniec_bajki
}
//line_y_ok
- int shadLastY = 0; //?
- if (shadPosY >= 0 && shadPosY != shadLastY) {
- shadLastY = shadPosY;
+ //if (shadPosY >= 0 && shadPosY != _shadLastY) {
+ if (shadPosY >= 0) {
+ //_shadLastY = shadPosY;
if (shadPosY < 480 && shadPosX < 640) {
- if (shadPosX < 0) {
+ if (shadPosX < 0) { //?
shadSkipX = -1 * shadPosX;
- //add eax, ebp
- if (sprWidth > shadSkipX) { //?
- //add esi, ebp
+ background += shadSkipX;
+ if (sprWidth > shadSkipX) {
+ shadowStart += shadSkipX;
shadBitAddr += shadSkipX / 8;
int ebp16844 = shadSkipX % 8;
if (ebp16844 != 0) {
//loop_rotate:
for (int k = 0; k < ebp16844; k++) {
- //ror shaBitMask !
- shadBitMask /= 2;
+ //ror(shadBitMask, 1)
if (shadBitMask == 1) {
shadBitMask = 128;
shadBitAddr++;
+ } else {
+ shadBitMask /= 2;
}
}
}
- //draw_line1
- if (shadPosX < shadMinX) {
- shadMinX = shadPosX;
- }
- //bigger_x
- if (shadPosX + sprWidth > shadMaxX) {
- shadMaxX = shadPosX + sprWidth;
- }
- //smaller_x
- if (shadPosY < shadMinY) {
- shadMinY = shadPosY;
- }
- //bigger_y
- if (shadPosY > shadMaxY) {
- shadMaxY = shadPosY;
- }
- //smaller_y
- //retry_line2
- int ebxOnStack2;
- for(ebxOnStack2 = ebxOnStack; ebxOnStack2 > 0; ebxOnStack2--) {
- shadZoomY2 -= 100;
- if (shadZoomY2 < 0 && _shadScaleValue != 10000) {
- shadZoomY2 += _shadScaleValue;
- // esi -= sprWidth
+ } else {
+ //skip_line //?
+ // no draw_line1
+ }
+ } else {
+ //x1_ok
+ if (shadPosX + sprWidth > 640) {
+ int ecx16861 = sprWidth - (shadPosX + sprWidth - 640);
+ sprModulo = shadPosX + sprWidth - 640;
+ } else {
+ //draw_line
+ int ecx16868 = sprWidth;
+ }
+ }
+ //draw_line1
+ if (shadPosX < shadMinX) {
+ shadMinX = shadPosX;
+ }
+ //bigger_x
+ if (shadPosX + sprWidth > shadMaxX) {
+ shadMaxX = shadPosX + sprWidth;
+ }
+ //smaller_x
+ if (shadPosY < shadMinY) {
+ shadMinY = shadPosY;
+ }
+ //bigger_y
+ if (shadPosY > shadMaxY) { //?
+ shadMaxY = shadPosY;
+ }
+ //smaller_y
+ //retry_line2
+ int ebxOnStack2;
+ for(ebxOnStack2 = ebxOnStack; ebxOnStack2 > 0; ebxOnStack2--) {
+ shadZoomY2 -= 100;
+ if (shadZoomY2 < 0 && _shadScaleValue != 10000) {
+ shadZoomY2 += _shadScaleValue;
+ shadowStart -= sprWidth;
+ } else {
+ break; //to line_y_ok_2
+ }
+ }
+ if (ebxOnStack2 == 0) {
+ // esp += 4*4
+ // koniec_bajki
+ }
+ //line_y_ok_2:
+ // push esi
+ // push ecx
+ // int lineDestAddr = eax;
+ // edi = eax
+ // eax = shadBitMask
+ // push eax // push shadBitMask
+ // lineBitAddr = shadBitMask
+ // eax = shadBitAddr
+ // push eax
+ // LineBitAddr = eax
+
+ //copy_trans
+ //push eax, ebx, edx, ebp
+ int shadWDFlag = 0;
+ int shadZoomX = _scaleValue;
+ //ct_loop:
+ for (int j = 0; j < sprWidth; j++) { //? ecx to check
+ shadZoomX -= 100;
+ if (shadZoomX < 0 && _scaleValue != 10000) {
+ shadowStart++;
+ shadZoomX += _scaleValue;
+ } else {
+ //point_ok:
+ if (*shadowStart == kShadowColor) {
+ if (shadBitMask != _shadowBitmap->getZoom(shadBitAddr)) { //tofix
+ if (shadWallDown == 0) {
+ if (shadBitMask != _shadowBitmap->getZoom(shadBitAddr + kShadowBitmapSize)) {
+ shadWDFlag = 1;
+ //shadow
+ *background = *(sprShadow + *background);
+ }
+ }
} else {
- break; //to line_y_ok_2
+ //shadow
+ *background = *(sprShadow + *background);
}
}
- if (ebxOnStack2 == 0) {
- // esp += 4*4
- // koniec_bajki
+ //ct_next
+ //ror(shadBitMask, 1)
+ if (shadBitMask == 1) {
+ shadBitMask = 128;
+ shadBitAddr++;
+ } else {
+ shadBitMask /= 2;
}
- //line_y_ok_2:
- // push esi
- // push ecx
- // int lineDestAddr = eax;
- // edi = eax
- // eax = shadBitMask
- // push eax // push shadBitMask
- // lineBitAddr = shadBitMask
- // eax = shadBitAddr
- // push eax
- // LineBitAddr = eax
-
- //copy_trans
- //push eax, ebx, edx, ebp
- int shadWDFlag = 0;
- int shadZoomX = _scaleValue;
- //ebx17061 = shadowTable70;
- int ebp17062 = shadBitAddr;
- int ah = shadBitMask;
-
- //ct_loop:
- shadZoomX -= 100;
- if (shadZoomX < 0 && _scaleValue != 10000) {
- // esi++;
- shadZoomX += _scaleValue;
- }
-
+ //okok
+ shadowStart++;
+ background++;
+ //destShadowStart++;
}
- } else {
- //x1_ok
}
+ //byebyebye
+ if (shadWallDown == 0 && shadWDFlag != 0) {
+ //shadWall itp
+ //
+ }
+ //byebye
+ // pop ...
+ if (shadDirection != 0 && shadWallDown != 0) {
+ // push...
+ // krap2
+ // WALL_copy_trans
+ }
+ //next_line
+ //int ecx16965 = sprWidth;
+ if (*(shadowLineStart + 2) < *(shadowLineStart - 2)) {
+ //minus_y
+ shadBitAddr += kMaxPicWidth / 8;
+ shadPosY++;
+ //add eax, VESA_ScanLine
+ background = (byte *)_graph->_frontScreen->getBasePtr(sprDestX + diff, sprDestY + i);
+ } else if (*(shadowLineStart + 2) > *(shadowLineStart - 2)) {
+ shadBitAddr -= kMaxPicWidth / 8;
+ shadPosY--;
+ //sub eax, VESA_ScanLine
+ background = (byte *)_graph->_frontScreen->getBasePtr(sprDestX + diff, sprDestY - i);
+ }
+ //no_change_y
+ if (*shadowLineStart < *(shadowLineStart - 4)) {
+ //minus_x
+ shadPosX--;
+ //rol
+ if (shadBitMask == 128) {
+ shadBitMask = 1;
+ shadBitAddr--;
+ } else {
+ shadBitMask *= 2;
+ }
+ //eax--;
+ //background--;
+ diff--;
+ } else if (*shadowLineStart > *(shadowLineStart - 4)) {
+ shadPosX++;
+ //ror
+ if (shadBitMask == 1) {
+ shadBitMask = 128;
+ shadBitAddr++;
+ } else {
+ shadBitMask /= 2;
+ }
+ //background++;
+ diff++;
+ }
+ //no_change_x
+ shadowLineStart += 4;
+ shadowStart = (byte *)makeShadow->getBasePtr(0, frameYSize - 1 - i);
+ //background = (byte *)_graph->_frontScreen->getBasePtr(sprDestX, sprDestY + i);
}
}
//skip_line
- //}
+ }
}
- return makeShadow;
+ //return makeShadow;
+ //return destShadow;
}
void Hero::showHeroAnimFrame() {
diff --git a/engines/prince/hero.h b/engines/prince/hero.h
index 6640bcf3df..76ca51a43a 100644
--- a/engines/prince/hero.h
+++ b/engines/prince/hero.h
@@ -34,6 +34,7 @@ namespace Prince {
class Animation;
class PrinceEngine;
+class GraphicsMan;
class Hero {
public:
@@ -44,8 +45,9 @@ public:
static const int16 kZoomBitmapWidth = kMaxPicWidth / kZoomStep;
static const int16 kNormalWidth = 640;
static const int16 kShadowLineArraySize = 2 * 1280 * 4;
+ static const int16 kShadowBitmapSize = kMaxPicWidth * kMaxPicHeight / 8;
- static const uint8 kShadowColor = 191;
+ static const byte kShadowColor = 191;
enum State {
STAY = 0,
@@ -96,7 +98,7 @@ public:
Move_BORED2
};
- Hero(PrinceEngine *vm);
+ Hero(PrinceEngine *vm, GraphicsMan *graph);
~Hero();
Common::RandomSource _randomSource;
bool loadAnimSet(uint32 heroAnimNumber);
@@ -119,13 +121,15 @@ public:
void showHeroAnimFrame();
void line(int x1, int y1, int x2, int y2);
void plotPoint(int x, int y);
- Graphics::Surface *showHeroShadow(Graphics::Surface *heroFrame);
+ //Graphics::Surface *showHeroShadow();
+ void showHeroShadow();
void setShadowScale(int32 shadowScale);
void specialAnim();
void getState();
//private:
PrinceEngine *_vm;
+ GraphicsMan *_graph;
uint16 _number;
uint16 _visible;
int16 _state;
@@ -143,7 +147,9 @@ public:
int32 _shadZoomFactor;
int32 _shadScaleValue;
int32 _shadowLineLen;
-
+ int16 _shadowDrawX;
+ int16 _shadowDrawY;
+ int16 _shadLastY;
// Coords array of coordinates
// DirTab array of directions
diff --git a/engines/prince/prince.cpp b/engines/prince/prince.cpp
index 0439bae840..533d2f4c57 100644
--- a/engines/prince/prince.cpp
+++ b/engines/prince/prince.cpp
@@ -186,8 +186,8 @@ void PrinceEngine::init() {
_roomBmp = new Image::BitmapDecoder();
- _mainHero = new Hero(this);
- _secondHero = new Hero(this);
+ _mainHero = new Hero(this, _graph);
+ _secondHero = new Hero(this, _graph);
_mainHero->loadAnimSet(0);
}
@@ -414,7 +414,6 @@ bool PrinceEngine::loadVoice(uint32 slot, uint32 sampleSlot, const Common::Strin
}
uint32 id = _voiceStream[sampleSlot]->readUint32LE();
- //if (id != 0x46464952) {
if (id != MKTAG('F', 'F', 'I', 'R')) {
error("It's not RIFF file %s", streamName.c_str());
return false;
@@ -422,7 +421,6 @@ bool PrinceEngine::loadVoice(uint32 slot, uint32 sampleSlot, const Common::Strin
_voiceStream[sampleSlot]->skip(0x20);
id = _voiceStream[sampleSlot]->readUint32LE();
- //if (id != 0x61746164) {
if (id != MKTAG('a', 't', 'a', 'd')) {
error("No data section in %s id %04x", streamName.c_str(), id);
return false;
@@ -642,10 +640,13 @@ void PrinceEngine::drawScreen() {
if (_mainHero->_visible) {
const Graphics::Surface *mainHeroSurface = _mainHero->getSurface();
+ //const Graphics::Surface *mainHeroShadow = _mainHero->showHeroShadow();
- if (mainHeroSurface)
- //_graph->drawTransparent(_mainHero->_middleX, _mainHero->_middleY, mainHeroSurface);
+ if (mainHeroSurface) {
+ _mainHero->showHeroShadow();
_graph->drawTransparent(_mainHero->_drawX, _mainHero->_drawY, mainHeroSurface);
+ //_graph->drawTransparent(_mainHero->_shadowDrawX, _mainHero->_shadowDrawY, mainHeroShadow);
+ }
}
playNextFrame();