diff options
Diffstat (limited to 'sword2/object.h')
-rw-r--r-- | sword2/object.h | 300 |
1 files changed, 253 insertions, 47 deletions
diff --git a/sword2/object.h b/sword2/object.h index 6f33ae80d8..19c1ddc1b5 100644 --- a/sword2/object.h +++ b/sword2/object.h @@ -21,11 +21,9 @@ #ifndef _SCRIPT_STRUCTURES #define _SCRIPT_STRUCTURES -namespace Sword2 { +#include "common/stream.h" -#if !defined(__GNUC__) - #pragma START_PACK_STRUCTS -#endif +namespace Sword2 { // these structures represent the broken up compact components // these here declared to the system must be the same as those declared to @@ -41,15 +39,64 @@ struct ObjectMouse { int32 y2; int32 priority; int32 pointer; // type (or resource id?) of pointer used over this area -} GCC_PACK; + + static const int size() { + return 24; + } + + void read(byte *addr) { + Common::MemoryReadStream readS(addr, size()); + + x1 = readS.readSint32LE(); + y1 = readS.readSint32LE(); + x2 = readS.readSint32LE(); + y2 = readS.readSint32LE(); + priority = readS.readSint32LE(); + pointer = readS.readSint32LE(); + } + + void write(byte *addr) { + Common::MemoryWriteStream writeS(addr, size()); + + writeS.writeSint32LE(x1); + writeS.writeSint32LE(y1); + writeS.writeSint32LE(x2); + writeS.writeSint32LE(y2); + writeS.writeSint32LE(priority); + writeS.writeSint32LE(pointer); + } +}; // logic structure - contains fields used in logic script processing -struct ObjectLogic { - int32 looping; // 0 when first calling fn<function>; - // 1 when calling subsequent times in same loop - int32 pause; // pause count, used by fnPause() -} GCC_PACK; +class ObjectLogic { + // int32 looping; // 0 when first calling fn<function>; + // 1 when calling subsequent times in + // same loop + // int32 pause; // pause count, used by fnPause() + +private: + byte *_addr; + +public: + ObjectLogic(byte *addr) { + _addr = addr; + } + + static const int size() { + return 8; + } + + byte *data() { + return _addr; + } + + int32 getLooping() { return READ_LE_UINT32(_addr); } + int32 getPause() { return READ_LE_UINT32(_addr + 4); } + + void setLooping(int32 x) { WRITE_LE_UINT32(_addr, x); } + void setPause(int32 x) { WRITE_LE_UINT32(_addr + 4, x); } +}; // status bits for 'type' field of ObjectGraphic) @@ -71,50 +118,161 @@ struct ObjectLogic { // graphic structure - contains fields appropriate to sprite output -struct ObjectGraphic { - int32 type; // see above - int32 anim_resource; // resource id of animation file - int32 anim_pc; // current frame number of animation -} GCC_PACK; +class ObjectGraphic { + // int32 type; // see above + // int32 anim_resource; // resource id of animation file + // int32 anim_pc; // current frame number of animation + +private: + byte *_addr; + +public: + ObjectGraphic(byte *addr) { + _addr = addr; + } + + static const int size() { + return 12; + } + + byte *data() { + return _addr; + } + + int32 getType() { return READ_LE_UINT32(_addr); } + int32 getAnimResource() { return READ_LE_UINT32(_addr + 4); } + int32 getAnimPc() { return READ_LE_UINT32(_addr + 8); } + + void setType(int32 x) { WRITE_LE_UINT32(_addr, x); } + void setAnimResource(int32 x) { WRITE_LE_UINT32(_addr + 4, x); } + void setAnimPc(int32 x) { WRITE_LE_UINT32(_addr + 8, x); } +}; // speech structure - contains fields used by speech scripts & text output -struct ObjectSpeech { - int32 pen; // colour to use for body of characters - int32 width; // max width of text sprite - int32 command; // speech script command id - int32 ins1; // speech script instruction parameters (may need more now?) - int32 ins2; - int32 ins3; - int32 ins4; - int32 ins5; - int32 wait_state; // 0 not waiting, 1 waiting for next speech command -} GCC_PACK; +class ObjectSpeech { + // int32 pen; // colour to use for body of characters + // int32 width; // max width of text sprite + // int32 command; // speech script command id + // int32 ins1; // speech script instruction parameters + // int32 ins2; + // int32 ins3; + // int32 ins4; + // int32 ins5; + // int32 wait_state; // 0 not waiting, + // 1 waiting for next speech command + +private: + byte *_addr; + +public: + ObjectSpeech(byte *addr) { + _addr = addr; + } + + static const int size() { + return 36; + } + + byte *data() { + return _addr; + } + + int32 getPen() { return READ_LE_UINT32(_addr); } + int32 getWidth() { return READ_LE_UINT32(_addr + 4); } + int32 getCommand() { return READ_LE_UINT32(_addr + 8); } + int32 getIns1() { return READ_LE_UINT32(_addr + 12); } + int32 getIns2() { return READ_LE_UINT32(_addr + 16); } + int32 getIns3() { return READ_LE_UINT32(_addr + 20); } + int32 getIns4() { return READ_LE_UINT32(_addr + 24); } + int32 getIns5() { return READ_LE_UINT32(_addr + 28); } + int32 getWaitState() { return READ_LE_UINT32(_addr + 32); } + + void setPen(int32 x) { WRITE_LE_UINT32(_addr, x); } + void setWidth(int32 x) { WRITE_LE_UINT32(_addr + 4, x); } + void setCommand(int32 x) { WRITE_LE_UINT32(_addr + 8, x); } + void setIns1(int32 x) { WRITE_LE_UINT32(_addr + 12, x); } + void setIns2(int32 x) { WRITE_LE_UINT32(_addr + 16, x); } + void setIns3(int32 x) { WRITE_LE_UINT32(_addr + 20, x); } + void setIns4(int32 x) { WRITE_LE_UINT32(_addr + 24, x); } + void setIns5(int32 x) { WRITE_LE_UINT32(_addr + 28, x); } + void setWaitState(int32 x) { WRITE_LE_UINT32(_addr + 32, x); } +}; // mega structure - contains fields used for mega-character & mega-set // processing -struct ObjectMega { - int32 NOT_USED_1; // only free roaming megas need to check this before registering their graphics for drawing - int32 NOT_USED_2; // id of floor on which we are standing - int32 NOT_USED_3; // id of object which we are getting to - int32 NOT_USED_4; // pixel distance to stand from player character when in conversation - int32 currently_walking; // number given us by the auto router - int32 walk_pc; // current frame number of walk-anim - int32 scale_a; // current scale factors, taken from floor data - int32 scale_b; - int32 feet_x; // mega feet coords - frame-offsets are added to these position mega frames - int32 feet_y; - int32 current_dir; // current dirction faced by mega; used by autorouter to determine turns required - int32 NOT_USED_5; // means were currently avoiding a collision (see fnWalk) - int32 megaset_res; // resource id of mega-set file - int32 NOT_USED_6; // NOT USED -} GCC_PACK; +class ObjectMega { + // int32 NOT_USED_1; // only free roaming megas need to + // check this before registering their + // graphics for drawing + // int32 NOT_USED_2; // id of floor on which we are standing + // int32 NOT_USED_3; // id of object which we are getting to + // int32 NOT_USED_4; // pixel distance to stand from player + // character when in conversation + // int32 currently_walking; // number given us by the auto router + // int32 walk_pc; // current frame number of walk-anim + // int32 scale_a; // current scale factors, taken from + // int32 scale_b; // floor data + // int32 feet_x; // mega feet coords - frame-offsets are + // int32 feet_y; // added to these position mega frames + // int32 current_dir; // current dirction faced by mega; used + // by autorouter to determine turns + // required + // int32 NOT_USED_5; // means were currently avoiding a + // collision (see fnWalk) + // int32 megaset_res; // resource id of mega-set file + // int32 NOT_USED_6; // NOT USED + +private: + byte *_addr; + +public: + ObjectMega(byte *addr) { + _addr = addr; + } + + static const int size() { + return 56; + } + + byte *data() { + return _addr; + } + + int32 getIsWalking() { return READ_LE_UINT32(_addr + 16); } + int32 getWalkPc() { return READ_LE_UINT32(_addr + 20); } + int32 getScaleA() { return READ_LE_UINT32(_addr + 24); } + int32 getScaleB() { return READ_LE_UINT32(_addr + 28); } + int32 getFeetX() { return READ_LE_UINT32(_addr + 32); } + int32 getFeetY() { return READ_LE_UINT32(_addr + 36); } + int32 getCurDir() { return READ_LE_UINT32(_addr + 40); } + int32 getMegasetRes() { return READ_LE_UINT32(_addr + 48); } + + void setIsWalking(int32 x) { WRITE_LE_UINT32(_addr + 16, x); } + void setWalkPc(int32 x) { WRITE_LE_UINT32(_addr + 20, x); } + void setScaleA(int32 x) { WRITE_LE_UINT32(_addr + 24, x); } + void setScaleB(int32 x) { WRITE_LE_UINT32(_addr + 28, x); } + void setFeetX(int32 x) { WRITE_LE_UINT32(_addr + 32, x); } + void setFeetY(int32 x) { WRITE_LE_UINT32(_addr + 36, x); } + void setCurDir(int32 x) { WRITE_LE_UINT32(_addr + 40, x); } + void setMegasetRes(int32 x) { WRITE_LE_UINT32(_addr + 48, x); } + + int32 calcScale() { + // Calc scale at which to print the sprite, based on feet + // y-coord & scaling constants (NB. 'scale' is actually + // 256 * true_scale, to maintain accuracy) + + // Ay+B gives 256 * scale ie. 256 * 256 * true_scale for even + // better accuracy, ie. scale = (Ay + B) / 256 + return (getScaleA() * getFeetY() + getScaleB()) / 256; + } +}; // walk-data structure - contains details of layout of frames in the // mega-set, and how they are to be used -struct ObjectWalkdata { +struct ObjectWalkdata { int32 nWalkFrames; // no. of frames per walk-cycle int32 usingStandingTurnFrames; // 0 = no 1 = yes int32 usingWalkingTurnFrames; // 0 = no 1 = yes @@ -124,11 +282,59 @@ struct ObjectWalkdata { int32 leadingLeg[8]; // leading leg for walk in each direction (0 = left 1 = right) int32 dx[8 * (12 + 1)]; // walk step distances in x direction int32 dy[8 * (12 + 1)]; // walk step distances in y direction -} GCC_PACK; -#if !defined(__GNUC__) - #pragma END_PACK_STRUCTS -#endif + static const int size() { + return 916; + } + + void read(byte *addr) { + Common::MemoryReadStream readS(addr, size()); + + nWalkFrames = readS.readUint32LE(); + usingStandingTurnFrames = readS.readUint32LE(); + usingWalkingTurnFrames = readS.readUint32LE(); + usingSlowInFrames = readS.readUint32LE(); + usingSlowOutFrames = readS.readUint32LE(); + + int i; + + for (i = 0; i < ARRAYSIZE(nSlowInFrames); i++) + nSlowInFrames[i] = readS.readUint32LE(); + + for (i = 0; i < ARRAYSIZE(leadingLeg); i++) + leadingLeg[i] = readS.readUint32LE(); + + for (i = 0; i < ARRAYSIZE(dx); i++) + dx[i] = readS.readUint32LE(); + + for (i = 0; i < ARRAYSIZE(dy); i++) + dy[i] = readS.readUint32LE(); + } + + void write(byte *addr) { + Common::MemoryWriteStream writeS(addr, size()); + + writeS.writeUint32LE(nWalkFrames); + writeS.writeUint32LE(usingStandingTurnFrames); + writeS.writeUint32LE(usingWalkingTurnFrames); + writeS.writeUint32LE(usingSlowInFrames); + writeS.writeUint32LE(usingSlowOutFrames); + + int i; + + for (i = 0; i < ARRAYSIZE(nSlowInFrames); i++) + writeS.writeUint32LE(nSlowInFrames[i]); + + for (i = 0; i < ARRAYSIZE(leadingLeg); i++) + writeS.writeUint32LE(leadingLeg[i]); + + for (i = 0; i < ARRAYSIZE(dx); i++) + writeS.writeUint32LE(dx[i]); + + for (i = 0; i < ARRAYSIZE(dy); i++) + writeS.writeUint32LE(dy[i]); + } +}; } // End of namespace Sword2 |