aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--engines/prince/hero.cpp14
-rw-r--r--engines/prince/hero.h6
-rw-r--r--engines/prince/prince.cpp6
-rw-r--r--engines/prince/script.cpp2
-rw-r--r--engines/prince/script.h4
5 files changed, 31 insertions, 1 deletions
diff --git a/engines/prince/hero.cpp b/engines/prince/hero.cpp
index 2ef16cc617..b4c1f8304b 100644
--- a/engines/prince/hero.cpp
+++ b/engines/prince/hero.cpp
@@ -34,6 +34,7 @@ Hero::Hero() : _number(0), _visible(false), _state(MOVE), _middleX(0), _middleY(
, _boreNum(1), _currHeight(0), _moveDelay(0), _shadMinus(1), _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)
{
_zoomBitmap = new Animation();
_shadowBitmap = new Animation();
@@ -277,6 +278,19 @@ void Hero::selectZoom() {
setScale(zoomBitmapValue);
}
+void Hero::setShadowScale(int32 shadowScale) {
+ shadowScale = 100 - shadowScale;
+ if (shadowScale == 0) {
+ _shadZoomFactor = 0;
+ _shadScaleValue = 10000;
+ } else {
+ _shadZoomFactor = shadowScale;
+ _shadScaleValue = 10000 / _shadZoomFactor;
+ }
+ debug("_shadZoomFactor: %d", _shadZoomFactor);
+ debug("_shadScaleValue: %d", _shadScaleValue);
+}
+
void Hero::specialAnim() {
}
diff --git a/engines/prince/hero.h b/engines/prince/hero.h
index 3d09f8a965..36856ea921 100644
--- a/engines/prince/hero.h
+++ b/engines/prince/hero.h
@@ -108,6 +108,7 @@ public:
void checkNak();
Graphics::Surface *zoomSprite(Graphics::Surface *heroFrame);
void showHeroAnimFrame();
+ void setShadowScale(int32 shadowScale);
void specialAnim();
void getState();
@@ -124,6 +125,11 @@ public:
int16 _moveSetType;
int8 _zoomFactor;
int16 _scaleValue;
+ int16 _lightX; // for hero's shadow
+ int16 _lightY;
+ int32 _shadZoomFactor;
+ int32 _shadScaleValue;
+
// Coords array of coordinates
// DirTab array of directions
diff --git a/engines/prince/prince.cpp b/engines/prince/prince.cpp
index 37581318e5..61d1ce5ef5 100644
--- a/engines/prince/prince.cpp
+++ b/engines/prince/prince.cpp
@@ -288,6 +288,12 @@ bool PrinceEngine::loadLocation(uint16 locationNr) {
Resource::loadResource(_mainHero->_shadowBitmap, "shadow2", false);
}
+ _mainHero->_lightX = _script->getLightX(_locationNr);
+ _mainHero->_lightY = _script->getLightY(_locationNr);
+ debug("lightX: %d", _mainHero->_lightX);
+ debug("lightY: %d", _mainHero->_lightX);
+ _mainHero->setShadowScale(_script->getShadowScale(_locationNr));
+
_mobList.clear();
Resource::loadResource(_mobList, "mob.lst", false);
diff --git a/engines/prince/script.cpp b/engines/prince/script.cpp
index 84ae64791e..264d5bbae2 100644
--- a/engines/prince/script.cpp
+++ b/engines/prince/script.cpp
@@ -132,7 +132,7 @@ bool Script::loadFromStream(Common::SeekableReadStream &stream) {
return false;
stream.read(_data, _dataSize);
-
+
Common::MemoryReadStream scriptDataStream(_data, _dataSize);
scriptDataStream.seek(getRoomTableOffset()+64);
debug("room table offset %d", scriptDataStream.pos());
diff --git a/engines/prince/script.h b/engines/prince/script.h
index d51e01b559..2a3bb64245 100644
--- a/engines/prince/script.h
+++ b/engines/prince/script.h
@@ -42,6 +42,7 @@ namespace Detail {
template <> inline uint8 LittleEndianReader<uint8>(void *data) { return *(uint8*)(data); }
template <> inline uint16 LittleEndianReader<uint16>(void *data) { return READ_LE_UINT16(data); }
template <> inline uint32 LittleEndianReader<uint32>(void *data) { return READ_LE_UINT32(data); }
+ template <> inline int8 LittleEndianReader<int8>(void *data) { return *(int8*)(data); }
}
class Room {
@@ -89,6 +90,9 @@ public:
// Some magic numbers for now, data stored in header
uint32 getRoomTableOffset() { return read<uint32>(0); }
uint32 getStartGameOffset() { return read<uint32>(4); }
+ int8 getLightX(int locationNr) { return read<int8>(4*15 + locationNr*8); }
+ int8 getLightY(int locationNr) { return read<int8>(4*15 + locationNr*8 + 2); }
+ uint16 getShadowScale(int locationNr) { return read<uint16>(4*15 + locationNr*8 + 4); }
const char *getString(uint32 offset) {
return (const char *)(&_data[offset]);