diff options
-rw-r--r-- | actor.cpp | 1 | ||||
-rw-r--r-- | boxes.cpp | 112 | ||||
-rw-r--r-- | boxes.h | 30 | ||||
-rw-r--r-- | costume.cpp | 1 | ||||
-rw-r--r-- | guimaps.h | 4 | ||||
-rw-r--r-- | scumm.h | 84 |
6 files changed, 83 insertions, 149 deletions
@@ -24,6 +24,7 @@ #include "scumm.h" #include "actor.h" #include "akos.h" +#include "costume.h" #include <math.h> @@ -26,6 +26,38 @@ #include <math.h> +#if !defined(__GNUC__) + #pragma START_PACK_STRUCTS +#endif + +struct Box { /* Internal walkbox file format */ + int16 ulx, uly; + int16 urx, ury; + int16 lrx, lry; + int16 llx, lly; + byte mask; + byte flags; + uint16 scale; +} GCC_PACK; + +#if !defined(__GNUC__) + #pragma END_PACK_STRUCTS +#endif + +struct PathNode { /* Linked list of walkpath nodes */ + uint index; + struct PathNode *left, *right; +}; + +struct PathVertex { /* Linked list of walkpath nodes */ + PathNode *left; + PathNode *right; +}; + + +PathVertex *unkMatrixProc1(PathVertex *vtx, PathNode *node); + + byte Scumm::getMaskFromBox(int box) { Box *ptr = getBoxBaseAddr(box); @@ -106,23 +138,23 @@ bool Scumm::checkXYInBoxBounds(int b, int x, int y) getBoxCoordinates(b, &box); - if (x < box.ul.x && x < box.ur.x && x < box.ll.x && x < box.lr.x) + if (x < box.ul.x && x < box.ur.x && x < box.lr.x && x < box.ll.x) return 0; - if (x > box.ul.x && x > box.ur.x && x > box.ll.x && x > box.lr.x) + if (x > box.ul.x && x > box.ur.x && x > box.lr.x && x > box.ll.x) return 0; - if (y < box.ul.y && y < box.ur.y && y < box.ll.y && y < box.lr.y) + if (y < box.ul.y && y < box.ur.y && y < box.lr.y && y < box.ll.y) return 0; - if (y > box.ul.y && y > box.ur.y && y > box.ll.y && y > box.lr.y) + if (y > box.ul.y && y > box.ur.y && y > box.lr.y && y > box.ll.y) return 0; - if (box.ul.x == box.ur.x && box.ul.y == box.ur.y && box.ll.x == box.lr.x && box.ll.y == box.lr.y || - box.ul.x == box.lr.x && box.ul.y == box.lr.y && box.ur.x == box.ll.x && box.ur.y == box.ll.y) { + if (box.ul.x == box.ur.x && box.ul.y == box.ur.y && box.lr.x == box.ll.x && box.lr.y == box.ll.y || + box.ul.x == box.ll.x && box.ul.y == box.ll.y && box.ur.x == box.lr.x && box.ur.y == box.lr.y) { ScummPoint pt; - pt = closestPtOnLine(box.ul.x, box.ul.y, box.ll.x, box.ll.y, x, y); + pt = closestPtOnLine(box.ul.x, box.ul.y, box.lr.x, box.lr.y, x, y); if (distanceFromPt(x, y, pt.x, pt.y) <= 4) return 1; } @@ -130,13 +162,13 @@ bool Scumm::checkXYInBoxBounds(int b, int x, int y) if (!compareSlope(box.ul.x, box.ul.y, box.ur.x, box.ur.y, x, y)) return 0; - if (!compareSlope(box.ur.x, box.ur.y, box.ll.x, box.ll.y, x, y)) + if (!compareSlope(box.ur.x, box.ur.y, box.lr.x, box.lr.y, x, y)) return 0; - if (!compareSlope(box.lr.x, box.lr.y, x, y, box.ll.x, box.ll.y)) + if (!compareSlope(box.ll.x, box.ll.y, x, y, box.lr.x, box.lr.y)) return 0; - if (!compareSlope(box.ul.x, box.ul.y, x, y, box.lr.x, box.lr.y)) + if (!compareSlope(box.ul.x, box.ul.y, x, y, box.ll.x, box.ll.y)) return 0; return 1; @@ -266,19 +298,19 @@ bool Scumm::inBoxQuickReject(int b, int x, int y, int threshold) return 1; t = x - threshold; - if (t > box.ul.x && t > box.ur.x && t > box.ll.x && t > box.lr.x) + if (t > box.ul.x && t > box.ur.x && t > box.lr.x && t > box.ll.x) return 0; t = x + threshold; - if (t < box.ul.x && t < box.ur.x && t < box.ll.x && t < box.lr.x) + if (t < box.ul.x && t < box.ur.x && t < box.lr.x && t < box.ll.x) return 0; t = y - threshold; - if (t > box.ul.y && t > box.ur.y && t > box.ll.y && t > box.lr.y) + if (t > box.ul.y && t > box.ur.y && t > box.lr.y && t > box.ll.y) return 0; t = y + threshold; - if (t < box.ul.y && t < box.ur.y && t < box.ll.y && t < box.lr.y) + if (t < box.ul.y && t < box.ur.y && t < box.lr.y && t < box.ll.y) return 0; return 1; @@ -302,7 +334,7 @@ AdjustBoxResult Scumm::getClosestPtOnBox(int b, int x, int y) best.y = pt.y; } - pt = closestPtOnLine(box.ur.x, box.ur.y, box.ll.x, box.ll.y, x, y); + pt = closestPtOnLine(box.ur.x, box.ur.y, box.lr.x, box.lr.y, x, y); dist = distanceFromPt(x, y, pt.x, pt.y); if (dist < bestdist) { bestdist = dist; @@ -310,7 +342,7 @@ AdjustBoxResult Scumm::getClosestPtOnBox(int b, int x, int y) best.y = pt.y; } - pt = closestPtOnLine(box.ll.x, box.ll.y, box.lr.x, box.lr.y, x, y); + pt = closestPtOnLine(box.lr.x, box.lr.y, box.ll.x, box.ll.y, x, y); dist = distanceFromPt(x, y, pt.x, pt.y); if (dist < bestdist) { bestdist = dist; @@ -318,7 +350,7 @@ AdjustBoxResult Scumm::getClosestPtOnBox(int b, int x, int y) best.y = pt.y; } - pt = closestPtOnLine(box.lr.x, box.lr.y, box.ul.x, box.ul.y, x, y); + pt = closestPtOnLine(box.ll.x, box.ll.y, box.ul.x, box.ul.y, x, y); dist = distanceFromPt(x, y, pt.x, pt.y); if (dist < bestdist) { bestdist = dist; @@ -488,15 +520,15 @@ int Scumm::findPathTowards(Actor *a, byte box1nr, byte box2nr, byte box3nr) } tmp = box1.ul; box1.ul = box1.ur; - box1.ur = box1.ll; - box1.ll = box1.lr; - box1.lr = tmp; + box1.ur = box1.lr; + box1.lr = box1.ll; + box1.ll = tmp; } tmp = box2.ul; box2.ul = box2.ur; - box2.ur = box2.ll; - box2.ll = box2.lr; - box2.lr = tmp; + box2.ur = box2.lr; + box2.lr = box2.ll; + box2.ll = tmp; } return 0; } @@ -651,7 +683,7 @@ void Scumm::createBoxMatrix() nukeResource(rtMatrix, 3); } -PathVertex *Scumm::unkMatrixProc1(PathVertex *vtx, PathNode *node) +PathVertex *unkMatrixProc1(PathVertex *vtx, PathNode *node) { if (node == NULL || vtx == NULL) return NULL; @@ -790,24 +822,24 @@ bool Scumm::areBoxesNeighbours(int box1nr, int box2nr) tmp_y = box2.ul.y; box2.ul.x = box2.ur.x; box2.ul.y = box2.ur.y; - box2.ur.x = box2.ll.x; - box2.ur.y = box2.ll.y; - box2.ll.x = box2.lr.x; - box2.ll.y = box2.lr.y; - box2.lr.x = tmp_x; - box2.lr.y = tmp_y; + box2.ur.x = box2.lr.x; + box2.ur.y = box2.lr.y; + box2.lr.x = box2.ll.x; + box2.lr.y = box2.ll.y; + box2.ll.x = tmp_x; + box2.ll.y = tmp_y; } while (--k); tmp_x = box.ul.x; tmp_y = box.ul.y; box.ul.x = box.ur.x; box.ul.y = box.ur.y; - box.ur.x = box.ll.x; - box.ur.y = box.ll.y; - box.ll.x = box.lr.x; - box.ll.y = box.lr.y; - box.lr.x = tmp_x; - box.lr.y = tmp_y; + box.ur.x = box.lr.x; + box.ur.y = box.lr.y; + box.lr.x = box.ll.x; + box.lr.y = box.ll.y; + box.ll.x = tmp_x; + box.ll.y = tmp_y; } while (--j); return result; @@ -901,8 +933,8 @@ void Scumm::getGates(int trap1, int trap2, ScummPoint gateA[2], ScummPoint gateB getBoxCoordinates(trap1, &box); poly[0] = box.ul; poly[1] = box.ur; - poly[2] = box.ll; - poly[3] = box.lr; + poly[2] = box.lr; + poly[3] = box.ll; for (i = 0; i < 4; i++) { abr = getClosestPtOnBox(trap2, poly[i].x, poly[i].y); Dist[i] = abr.dist; @@ -914,8 +946,8 @@ void Scumm::getGates(int trap1, int trap2, ScummPoint gateA[2], ScummPoint gateB getBoxCoordinates(trap2, &box); poly[4] = box.ul; poly[5] = box.ur; - poly[6] = box.ll; - poly[7] = box.lr; + poly[6] = box.lr; + poly[7] = box.ll; for (i = 4; i < 8; i++) { abr = getClosestPtOnBox(trap1, poly[i].x, poly[i].y); Dist[i] = abr.dist; @@ -20,24 +20,10 @@ * */ -#if !defined(__GNUC__) - #pragma START_PACK_STRUCTS -#endif +#ifndef BOXES_H +#define BOXES_H #define SIZEOF_BOX 20 -struct Box { /* Internal walkbox file format */ - int16 ulx,uly; - int16 urx,ury; - int16 llx,lly; - int16 lrx,lry; - byte mask; - byte flags; - uint16 scale; -} GCC_PACK; - -#if !defined(__GNUC__) - #pragma END_PACK_STRUCTS -#endif struct AdjustBoxResult { /* Result type of AdjustBox functions */ int16 x,y; @@ -51,12 +37,8 @@ struct BoxCoords { /* Box coordinates */ ScummPoint lr; }; -struct PathNode { /* Linked list of walkpath nodes */ - uint index; - struct PathNode *left, *right; -}; +struct Box; +struct PathNode; +struct PathVertex; -struct PathVertex { /* Linked list of walkpath nodes */ - PathNode *left; - PathNode *right; -}; +#endif diff --git a/costume.cpp b/costume.cpp index 6ca5f5618d..10e632f0d2 100644 --- a/costume.cpp +++ b/costume.cpp @@ -23,6 +23,7 @@ #include "stdafx.h" #include "scumm.h" #include "actor.h" +#include "costume.h" const byte revBitMask[8] = { 0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01 }; @@ -37,7 +37,7 @@ static const char* string_map_table_custom[] = { "Keys", //6 "About", //7 "Pocket ScummVM", //8 - "Build " SCUMMVM_VERSION "(" SCUMMVM_CVS ")", //9 + "Build " SCUMMVM_VERSION " (" SCUMMVM_CVS ")", //9 "ScummVM http://scummvm.sourceforge.net", //10 "All games (c) LucasArts", //11 "Quit", //12 @@ -48,7 +48,7 @@ static const char* string_map_table_custom[] = { "Options", //17 "Misc", //18 "Show speech subtitles", //19 - "Amiga pallette conversion", //20 + "Amiga palette conversion", //20 "Except:", //21 "Simon the Sorcerer (c) Adventuresoft", //22 "Close" //23 @@ -28,7 +28,7 @@ #include "sound/mixer.h" #define SCUMMVM_VERSION "0.2.2 CVS" -#define SCUMMVM_CVS "070802" +#define SCUMMVM_CVS "2002-07-16" #define SWAP(a,b) do{int tmp=a; a=b; b=tmp; } while(0) #define ARRAYSIZE(x) (sizeof(x)/sizeof(x[0])) @@ -351,87 +351,6 @@ struct CharsetRenderer { void addLinebreaks(int a, byte *str, int pos, int maxwidth); }; -class LoadedCostume { -protected: - Scumm *_vm; - -public: - byte *_ptr; - byte *_dataptr; - byte _numColors; - - LoadedCostume(Scumm *vm) : _vm(vm), _ptr(0), _dataptr(0), _numColors(0) {} - - void loadCostume(int id); - byte increaseAnims(Actor *a); - -protected: - byte increaseAnim(Actor *a, int slot); -}; - -class CostumeRenderer { -protected: - Scumm *_vm; - - LoadedCostume _loaded; - -public: - byte *_shadow_table; - - byte *_frameptr; - byte *_srcptr; - byte *_bgbak_ptr, *_backbuff_ptr, *_mask_ptr, *_mask_ptr_dest; - int _actorX, _actorY; - byte _zbuf; - uint _scaleX, _scaleY; - int _xmove, _ymove; - bool _mirror; - byte _maskval; - byte _shrval; - byte _width2; - int _width; - byte _height2; - int _height; - int _xpos, _ypos; - - uint _outheight; - int _scaleIndexXStep; - int _scaleIndexYStep; - byte _scaleIndexX; /* must wrap at 256 */ - byte _scaleIndexY, _scaleIndexYTop; - int _left, _right; - int _dir2; - int _top, _bottom; - int _ypostop; - int _ypitch; - byte _docontinue; - int _imgbufoffs; - byte _repcolor; - byte _replen; - byte _palette[32]; - byte _transEffect[0x100]; - - void proc6(); - void proc5(); - void proc4(); - void proc3(); - void proc2(); - void proc1(); - void proc_special(Actor *a, byte mask); - byte mainRoutine(Actor *a, int slot, int frame); - void ignorePakCols(int num); - - byte drawOneSlot(Actor *a, int slot); - byte drawCostume(Actor *a); - - void setPalette(byte *palette); - void setFacing(uint16 facing); - void setCostume(int costume); - -public: - CostumeRenderer(Scumm *vm) : _vm(vm), _loaded(vm) {} -}; - #define ARRAY_HDR_SIZE 6 struct ArrayHeader { int16 dim1_size; @@ -1183,7 +1102,6 @@ public: uint16 _extraBoxFlags[65]; int16 _foundPathX, _foundPathY; - PathVertex *unkMatrixProc1(PathVertex *vtx, PathNode *node); PathNode *unkMatrixProc2(PathVertex *vtx, int i); bool areBoxesNeighbours(int i, int j); void addToBoxMatrix(byte b); |