diff options
author | Eugene Sandulenko | 2014-04-23 20:52:39 +0300 |
---|---|---|
committer | Eugene Sandulenko | 2014-04-23 20:52:39 +0300 |
commit | c949963a8a490ba9ef3c0046d9edc9f2a627ad2e (patch) | |
tree | 9c61b1ebbb555fd551ae3b1bd624ca28a7408fb1 /engines | |
parent | 8195f144734d27240ca34cae9eea4fbd8ccb3620 (diff) | |
download | scummvm-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.cpp | 91 |
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; } } } |