aboutsummaryrefslogtreecommitdiff
path: root/engines
diff options
context:
space:
mode:
authorEugene Sandulenko2014-04-23 20:52:39 +0300
committerEugene Sandulenko2014-04-23 20:52:39 +0300
commitc949963a8a490ba9ef3c0046d9edc9f2a627ad2e (patch)
tree9c61b1ebbb555fd551ae3b1bd624ca28a7408fb1 /engines
parent8195f144734d27240ca34cae9eea4fbd8ccb3620 (diff)
downloadscummvm-rg350-c949963a8a490ba9ef3c0046d9edc9f2a627ad2e.tar.gz
scummvm-rg350-c949963a8a490ba9ef3c0046d9edc9f2a627ad2e.tar.bz2
scummvm-rg350-c949963a8a490ba9ef3c0046d9edc9f2a627ad2e.zip
FULLPIPE: More work on MGM::calcOffsets()
Diffstat (limited to 'engines')
-rw-r--r--engines/fullpipe/motion.cpp91
1 files changed, 42 insertions, 49 deletions
diff --git a/engines/fullpipe/motion.cpp b/engines/fullpipe/motion.cpp
index 0744c36921..09dd9374a8 100644
--- a/engines/fullpipe/motion.cpp
+++ b/engines/fullpipe/motion.cpp
@@ -2194,6 +2194,8 @@ int MGM::recalcOffsets(int idx, int st1idx, int st2idx, bool flip, bool flop) {
if (item->subItems[subIdx])
return item->subItems[subIdx]->field_8;
+ Common::Point point;
+
for (int i = 0; i < item->movementListCount; i++) {
mov = item->movements1[i];
@@ -2201,82 +2203,73 @@ int MGM::recalcOffsets(int idx, int st1idx, int st2idx, bool flip, bool flop) {
v16 = (int)(&item->movements2->go.CObject.vmt + i);
if (!*(_DWORD *)v16 && (!flop || mov->_field_50)) {
*(_DWORD *)v16 = 1;
- v39 = MGM_getStaticsIndex(this, idx, *(Statics **)(*(&item->movements1->go.CObject.vmt + i) + offsetof(Movement, _staticsObj2)));
+ v39 = getStaticsIndex(idx, item->movements1[i]->_staticsObj2);
v43 = recalcOffsets(idx, v39, st2idx, flip, flop);
- v17 = (Movement *)*(&item->movements1->go.CObject.vmt + i);
- v45 = v17;
- v18 = v17->_currMovement;
- v41 = v18 ? v18->_dynamicPhases.m_nCount : v17->_dynamicPhases.m_nCount;
- v19 = item->subItems;
- v20 = v41 + *(&v19[v39].field_C + 6 * st2idx * _items[idx].staticsListCount);
- v42 = v41 + *(&v19[v39].field_C + 6 * st2idx * _items[idx].staticsListCount);
+
+ v41 = mov->_currMovement ? mov->_currMovement->_dynamicPhases.size() : mov->_dynamicPhases.size();
+
+ v20 = v41 + *(&item->subItems[v39].field_C + 6 * st2idx * _items[idx].staticsListCount);
if (v43 >= 0) {
- if (!v19[subIdx].movement)
+ if (!item->subItems[subIdx].movement)
goto LABEL_22;
- v21 = v19[subIdx].field_8;
+ v21 = item->subItems[subIdx].field_8;
if (v21 > v43 + 1) {
- v20 = v42;
LABEL_22:
- v19[subIdx].movement = v45;
+ item->subItems[subIdx].movement = mov;
item->subItems[subIdx].staticsIndex = v39;
item->subItems[subIdx].field_8 = v43 + 1;
item->subItems[subIdx].field_C = v20;
- v22 = Movement_calcSomeXY(*((Movement **)&item->movements1->go.CObject.vmt + i), &flag, 0);
- v23 = item->subItems;
- v24 = v22->x + *(&v23[v39].x + 6 * st2idx * _items[idx].staticsListCount);
- v25 = v22->y + *(&v23[v39].y + 6 * st2idx * _items[idx].staticsListCount);
- v26 = v24;
- upd_xy_loop_1_next:
- v23[subIdx].x = v26;
- v23[subIdx].y = v25;
+
+ mov->calcSomeXY(&point, 0);
+
+ v25 = point.x + *(&item->subItems[v39].x + 6 * st2idx * _items[idx].staticsListCount);
+ v26 = point.y + *(&item->subItems[v39].y + 6 * st2idx * _items[idx].staticsListCount);
+
+ item->subItems[subIdx].x = v25;
+ item->subItems[subIdx].y = v26;
+
continue;
}
if (v21 == v43 + 1) {
- v20 = v42;
-
- if (v19[subIdx].field_C > v42)
+ if (item->subItems[subIdx].field_C > v20)
goto LABEL_22;
}
}
}
} else if (flip) {
if (mov->_staticsObj2 == item->statics[st1idx]) {
- v27 = item->movements2;
- v28 = *(&v27->go.CObject.vmt + i);
- v29 = (int)(&v27->go.CObject.vmt + i);
-
- if (!v28 && (!flop || mov->_field_50)) {
- *(_DWORD *)v29 = 1;
- v30 = MGM_getStaticsIndex(this, idx, *(Statics **)(*(&item->movements1->go.CObject.vmt + i) + offsetof(Movement, _staticsObj1)));
- v40 = v30;
+ if (!item->movements2[i] && (!flop || mov->_field_50)) {
+ item->movements2[i] = 1;
+
+ v30 = getStaticsIndex(idx, mov->_staticsObj1);
v31 = recalcOffsets(idx, v30, st2idx, flip, flop);
if (v31 >= 0) {
- v32 = (int)&item->subItems[subIdx];
-
- if (!*(_DWORD *)v32 || *(_DWORD *)(v32 + offsetof(MGMSubItem, field_8)) > v31 + 1) {
- *(_DWORD *)v32 = *(&item->movements1->go.CObject.vmt + i);
- item->subItems[subIdx].staticsIndex = v40;
+ if (!item->subItems[subIdx]->movement || item->subItems[subIdx]->field_8 > v31 + 1) {
+ item->subItems[subIdx]->movement = mov;
+ item->subItems[subIdx].staticsIndex = v30;
item->subItems[subIdx].field_8 = v31 + 1;
- v33 = (Movement *)*(&item->movements1->go.CObject.vmt + i);
- v34 = v33->_currMovement;
- if (v34)
- v44 = v34->_dynamicPhases.m_nCount;
+ if (mov->_currMovement)
+ v44 = mov->_currMovement->_dynamicPhases.size();
else
- v44 = v33->_dynamicPhases.m_nCount;
-
- item->subItems[subIdx].field_C = v44 + *(&item->subItems[v40].field_C + 6 * st2idx * _items[idx].staticsListCount);
- v35 = Movement_calcSomeXY(*((Movement **)&item->movements1->go.CObject.vmt + i), (POINT *)&point, 0);
- v23 = item->subItems;
- v36 = *(&v23[v40].x + 6 * st2idx * _items[idx].staticsListCount) - v35->x;
- v25 = *(&v23[v40].y + 6 * st2idx * _items[idx].staticsListCount) - v35->y;
- v26 = v36;
- goto upd_xy_loop_1_next;
+ v44 = mov->_dynamicPhases.size();
+
+ item->subItems[subIdx].field_C = v44 + *(&item->subItems[v30].field_C + 6 * st2idx * _items[idx].staticsListCount);
+
+ mov->calcSomeXY(&point, 0);
+
+ v25 = *(&item->subItems[v30].x + 6 * st2idx * _items[idx].staticsListCount) - point.x;
+ v26 = *(&item->subItems[v30].y + 6 * st2idx * _items[idx].staticsListCount) - point.y;
+
+ item->subItems[subIdx].x = v25;
+ item->subItems[subIdx].y = v26;
+
+ continue;
}
}
}