aboutsummaryrefslogtreecommitdiff
path: root/sword2/object.h
diff options
context:
space:
mode:
Diffstat (limited to 'sword2/object.h')
-rw-r--r--sword2/object.h300
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