aboutsummaryrefslogtreecommitdiff
path: root/engines/cge2/hero.cpp
diff options
context:
space:
mode:
authoruruk2014-06-13 16:31:32 +0200
committeruruk2014-06-13 16:31:32 +0200
commit2ad2be370e6464a660170ff19a0c74d6fb77e055 (patch)
tree65f5f28ac3be21138653f73e4bbb41ffb49041ad /engines/cge2/hero.cpp
parent95c844a0351d8865aa5190bb5572dff23b8886fd (diff)
downloadscummvm-rg350-2ad2be370e6464a660170ff19a0c74d6fb77e055.tar.gz
scummvm-rg350-2ad2be370e6464a660170ff19a0c74d6fb77e055.tar.bz2
scummvm-rg350-2ad2be370e6464a660170ff19a0c74d6fb77e055.zip
CGE2: Implement Hero::tick().
Diffstat (limited to 'engines/cge2/hero.cpp')
-rw-r--r--engines/cge2/hero.cpp57
1 files changed, 56 insertions, 1 deletions
diff --git a/engines/cge2/hero.cpp b/engines/cge2/hero.cpp
index 2671d0ea60..a4d0441569 100644
--- a/engines/cge2/hero.cpp
+++ b/engines/cge2/hero.cpp
@@ -239,7 +239,62 @@ Sprite *Hero::setContact() {
}
void Hero::tick() {
- warning("STUB: Hero::tick()");
+ int z = _pos3D._z.trunc();
+ //-- maybe not exactly wid/2, but wid/3 ?
+ int d = ((_siz.x / 2) * _vm->_eye->_z.trunc()) / (_vm->_eye->_z.trunc() - z);
+
+ if (_dir != kNoDir) { // just walking...
+ if (_flags._hold || _tracePtr < 0)
+ park();
+ else {
+ Sprite *spr = setContact();
+ if (spr)
+ _vm->feedSnail(spr, kNear, this);
+ }
+ }
+ //---------------------------------------------------------------
+ if (_tracePtr >= 0) {
+ if (distance(_trace[_tracePtr]) <= _maxDist)
+ --_tracePtr;
+
+ if (_tracePtr < 0)
+ park();
+ else {
+ int stp = stepSize() / 2;
+ int dx = _trace[_tracePtr]._x.round() - _pos3D._x.round();
+ int dz = _trace[_tracePtr]._z.round() - _pos3D._z.round();
+ Dir dir = (dx > stp) ? kEE : ((-dx > stp) ? kWW : ((dz > stp) ? kNN : kSS));
+ turn(dir);
+ }
+ }
+
+ //---------------------------------------------------------------
+ hStep();
+ setCurrent();
+ switch (_dir) {
+ case kSS:
+ if (_pos3D._z < stepSize() / 2)
+ park();
+ break;
+ case kWW:
+ if (_pos2D.x <= d)
+ park();
+ break;
+ case kNN:
+ if (_pos3D._z > kScrDepth)
+ park();
+ break;
+ case kEE:
+ if (_pos2D.x >= kScrWidth - 1 - d)
+ park();
+ break;
+ }
+ if (_flags._trim)
+ gotoxyz_(_pos2D);
+ if (_pos3D._z.trunc() != z)
+ _flags._zmov = true;
+ if (--_funDel == 0)
+ fun();
}
int Hero::distance(V3D pos) {