aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTorbjörn Andersson2003-11-10 07:52:15 +0000
committerTorbjörn Andersson2003-11-10 07:52:15 +0000
commit3d012651fd43d83ed67617ac0c5c0e32e6dd2ad4 (patch)
treec09b3c0e43525ea8d355fa6d364a20cee9be6252
parent439bc8364d248293c1ba7b1d92d2b00b4a6fa609 (diff)
downloadscummvm-rg350-3d012651fd43d83ed67617ac0c5c0e32e6dd2ad4.tar.gz
scummvm-rg350-3d012651fd43d83ed67617ac0c5c0e32e6dd2ad4.tar.bz2
scummvm-rg350-3d012651fd43d83ed67617ac0c5c0e32e6dd2ad4.zip
The script engine frequently needs to pass pointers to various structures
etc. to the different opcodes. Until now it has done so by casting the pointer to an int32 (opcode parameters are represented as arrays of int32) and then the opcode function casts it back to whatever pointer it needs. At least in C there is no guarantee that a pointer can be represented as an integer type (though apparently C99 may define such a type), so this has struck me as unsafe ever since I first noticed it. However, since all such pointers appear to point to the memory block owned by the memory manager, we can easily convert them to integers by treating them as offsets into the memory block. So that's what I have done. I hope I caught all the occurences in the opcode functions, or we're going to have some pretty interesting regressions on our hands... svn-id: r11241
-rw-r--r--sword2/anims.cpp38
-rw-r--r--sword2/build_display.cpp10
-rw-r--r--sword2/events.cpp2
-rw-r--r--sword2/function.cpp10
-rw-r--r--sword2/icons.cpp2
-rw-r--r--sword2/interpreter.cpp21
-rw-r--r--sword2/memory.cpp32
-rw-r--r--sword2/memory.h3
-rw-r--r--sword2/mouse.cpp8
-rw-r--r--sword2/save_rest.cpp12
-rw-r--r--sword2/speech.cpp20
-rw-r--r--sword2/startup.cpp6
-rw-r--r--sword2/walker.cpp40
13 files changed, 115 insertions, 89 deletions
diff --git a/sword2/anims.cpp b/sword2/anims.cpp
index df2d7ae205..d8cf28cc73 100644
--- a/sword2/anims.cpp
+++ b/sword2/anims.cpp
@@ -97,8 +97,8 @@ int32 Logic::animate(int32 *params, bool reverse) {
// read the main parameters
- ob_logic = (Object_logic *) params[0];
- ob_graphic = (Object_graphic *) params[1];
+ ob_logic = (Object_logic *) memory->intToPtr(params[0]);
+ ob_graphic = (Object_graphic *) memory->intToPtr(params[1]);
if (ob_logic->looping == 0) {
// This is the start of the anim - set up the first frame
@@ -227,11 +227,11 @@ int32 Logic::megaTableAnimate(int32 *params, bool reverse) {
// if this is the start of the anim, read the anim table to get the
// appropriate anim resource
- ob_logic = (Object_logic *) params[0];
+ ob_logic = (Object_logic *) memory->intToPtr(params[0]);
if (ob_logic->looping == 0) {
- ob_mega = (Object_mega *) params[2];
- anim_table = (uint32 *) params[3];
+ ob_mega = (Object_mega *) memory->intToPtr(params[2]);
+ anim_table = (uint32 *) memory->intToPtr(params[3]);
// appropriate anim resource is in 'table[direction]'
pars[2] = anim_table[ob_mega->current_dir];
@@ -291,7 +291,7 @@ int32 Logic::fnSetFrame(int32 *params) {
// set up anim resource in graphic object
- ob_graphic = (Object_graphic *) params[0];
+ ob_graphic = (Object_graphic *) memory->intToPtr(params[0]);
ob_graphic->anim_resource = res;
if (params[2])
@@ -308,7 +308,7 @@ int32 Logic::fnSetFrame(int32 *params) {
int32 Logic::fnNoSprite(int32 *params) {
// params: 0 pointer to object's graphic structure
- Object_graphic *ob_graphic = (Object_graphic *) params[0];
+ Object_graphic *ob_graphic = (Object_graphic *) memory->intToPtr(params[0]);
// remove previous status (but don't affect the shading upper-word)
ob_graphic->type &= 0xffff0000;
@@ -321,7 +321,7 @@ int32 Logic::fnNoSprite(int32 *params) {
int32 Logic::fnBackPar0Sprite(int32 *params) {
// params: 0 pointer to object's graphic structure
- Object_graphic *ob_graphic = (Object_graphic *) params[0];
+ Object_graphic *ob_graphic = (Object_graphic *) memory->intToPtr(params[0]);
// remove previous status (but don't affect the shading upper-word)
ob_graphic->type &= 0xffff0000;
@@ -334,7 +334,7 @@ int32 Logic::fnBackPar0Sprite(int32 *params) {
int32 Logic::fnBackPar1Sprite(int32 *params) {
// params: 0 pointer to object's graphic structure
- Object_graphic *ob_graphic = (Object_graphic *) params[0];
+ Object_graphic *ob_graphic = (Object_graphic *) memory->intToPtr(params[0]);
// remove previous status (but don't affect the shading upper-word)
ob_graphic->type &= 0xffff0000;
@@ -347,7 +347,7 @@ int32 Logic::fnBackPar1Sprite(int32 *params) {
int32 Logic::fnBackSprite(int32 *params) {
// params: 0 pointer to object's graphic structure
- Object_graphic *ob_graphic = (Object_graphic *) params[0];
+ Object_graphic *ob_graphic = (Object_graphic *) memory->intToPtr(params[0]);
// remove previous status (but don't affect the shading upper-word)
ob_graphic->type &= 0xffff0000;
@@ -360,7 +360,7 @@ int32 Logic::fnBackSprite(int32 *params) {
int32 Logic::fnSortSprite(int32 *params) {
// params: 0 pointer to object's graphic structure
- Object_graphic *ob_graphic = (Object_graphic *) params[0];
+ Object_graphic *ob_graphic = (Object_graphic *) memory->intToPtr(params[0]);
// remove previous status (but don't affect the shading upper-word)
ob_graphic->type &= 0xffff0000;
@@ -373,7 +373,7 @@ int32 Logic::fnSortSprite(int32 *params) {
int32 Logic::fnForeSprite(int32 *params) {
// params: 0 pointer to object's graphic structure
- Object_graphic *ob_graphic = (Object_graphic *) params[0];
+ Object_graphic *ob_graphic = (Object_graphic *) memory->intToPtr(params[0]);
// remove previous status (but don't affect the shading upper-word)
ob_graphic->type &= 0xffff0000;
@@ -386,7 +386,7 @@ int32 Logic::fnForeSprite(int32 *params) {
int32 Logic::fnForePar0Sprite(int32 *params) {
// params: 0 pointer to object's graphic structure
- Object_graphic *ob_graphic = (Object_graphic *) params[0];
+ Object_graphic *ob_graphic = (Object_graphic *) memory->intToPtr(params[0]);
// remove previous status (but don't affect the shading upper-word)
ob_graphic->type &= 0xffff0000;
@@ -399,7 +399,7 @@ int32 Logic::fnForePar0Sprite(int32 *params) {
int32 Logic::fnForePar1Sprite(int32 *params) {
// params: 0 pointer to object's graphic structure
- Object_graphic *ob_graphic = (Object_graphic *) params[0];
+ Object_graphic *ob_graphic = (Object_graphic *) memory->intToPtr(params[0]);
// remove previous status (but don't affect the shading upper-word)
ob_graphic->type &= 0xffff0000;
@@ -412,7 +412,7 @@ int32 Logic::fnForePar1Sprite(int32 *params) {
int32 Logic::fnShadedSprite(int32 *params) {
// params: 0 pointer to object's graphic structure
- Object_graphic *ob_graphic = (Object_graphic *) params[0];
+ Object_graphic *ob_graphic = (Object_graphic *) memory->intToPtr(params[0]);
// remove previous status (but don't affect the shading upper-word)
ob_graphic->type &= 0x0000ffff;
@@ -428,7 +428,7 @@ int32 Logic::fnShadedSprite(int32 *params) {
int32 Logic::fnUnshadedSprite(int32 *params) {
// params: 0 pointer to object's graphic structure
- Object_graphic *ob_graphic = (Object_graphic *) params[0];
+ Object_graphic *ob_graphic = (Object_graphic *) memory->intToPtr(params[0]);
// remove previous status (but don't affect the shading upper-word)
ob_graphic->type &= 0x0000ffff;
@@ -680,17 +680,17 @@ int32 Logic::fnPlaySequence(int32 *params) {
// of computer games" - but at the very least we want to show the
// cutscene subtitles, so I removed them.
- debug(5, "fnPlaySequence(\"%s\");", params[0]);
+ debug(5, "fnPlaySequence(\"%s\");", (const char *) memory->intToPtr(params[0]));
#ifdef _SWORD2_DEBUG
// check that the name paseed from script is 8 chars or less
- if (strlen((char *) params[0]) > 8)
+ if (strlen((const char *) memory->intToPtr(params[0])) > 8)
error("Sequence filename too long");
#endif
// add the appropriate file extension & play it
- sprintf(filename, "%s.smk", (char *) params[0]);
+ sprintf(filename, "%s.smk", (const char *) memory->intToPtr(params[0]));
// Write to walkthrough file (zebug0.txt)
debug(5, "PLAYING SEQUENCE \"%s\"", filename);
diff --git a/sword2/build_display.cpp b/sword2/build_display.cpp
index 82f098719a..5c51ed5b32 100644
--- a/sword2/build_display.cpp
+++ b/sword2/build_display.cpp
@@ -576,7 +576,7 @@ void Sword2Engine::registerFrame(int32 *params, buildit *build_unit) {
// open animation file & set up the necessary pointers
- ob_graph = (Object_graphic *) params[1];
+ ob_graph = (Object_graphic *) memory->intToPtr(params[1]);
assert(ob_graph->anim_resource);
@@ -614,7 +614,7 @@ void Sword2Engine::registerFrame(int32 *params, buildit *build_unit) {
if (cdt_entry->frameType & FRAME_OFFSET) {
// param 2 is pointer to mega structure
- ob_mega = (Object_mega *) params[2];
+ ob_mega = (Object_mega *) memory->intToPtr(params[2]);
// calc scale at which to print the sprite, based on feet
// y-coord & scaling constants (NB. 'scale' is actually
@@ -655,7 +655,7 @@ void Sword2Engine::registerFrame(int32 *params, buildit *build_unit) {
if (params[0]) {
// passed a mouse structure, so add to the _mouseList
- ob_mouse = (Object_mouse *) params[0];
+ ob_mouse = (Object_mouse *) memory->intToPtr(params[0]);
// only if 'pointer' isn't NULL
if (ob_mouse->pointer) {
@@ -706,7 +706,7 @@ int32 Logic::fnRegisterFrame(int32 *params) {
}
int32 Sword2Engine::registerFrame(int32 *params) {
- Object_graphic *ob_graph = (Object_graphic *) params[1];
+ Object_graphic *ob_graph = (Object_graphic *) memory->intToPtr(params[1]);
// check low word for sprite type
switch (ob_graph->type & 0x0000ffff) {
@@ -788,7 +788,7 @@ int32 Logic::fnUpdatePlayerStats(int32 *params) {
// params: 0 pointer to mega structure
- Object_mega *ob_mega = (Object_mega *) params[0];
+ Object_mega *ob_mega = (Object_mega *) memory->intToPtr(params[0]);
_vm->_thisScreen.player_feet_x = ob_mega->feet_x;
_vm->_thisScreen.player_feet_y = ob_mega->feet_y;
diff --git a/sword2/events.cpp b/sword2/events.cpp
index 118bea89ef..95f1654a63 100644
--- a/sword2/events.cpp
+++ b/sword2/events.cpp
@@ -185,7 +185,7 @@ int32 Logic::fnPauseForEvent(int32 *params) {
// params: 0 pointer to object's logic structure
// 1 number of game-cycles to pause
- Object_logic *ob_logic = (Object_logic *) params[0];
+ Object_logic *ob_logic = (Object_logic *) memory->intToPtr(params[0]);
// first, check for an event
diff --git a/sword2/function.cpp b/sword2/function.cpp
index f2c6b3ff04..ae31b0d911 100644
--- a/sword2/function.cpp
+++ b/sword2/function.cpp
@@ -148,7 +148,7 @@ int32 Logic::fnPause(int32 *params) {
// NB. Pause-value of 0 causes script to continue, 1 causes a 1-cycle
// quit, 2 gives 2 cycles, etc.
- Object_logic *ob_logic = (Object_logic *) params[0];
+ Object_logic *ob_logic = (Object_logic *) memory->intToPtr(params[0]);
if (ob_logic->looping == 0) {
// start the pause
@@ -177,7 +177,7 @@ int32 Logic::fnRandomPause(int32 *params) {
// 1 minimum number of game-cycles to pause
// 2 maximum number of game-cycles to pause
- Object_logic *ob_logic = (Object_logic *) params[0];
+ Object_logic *ob_logic = (Object_logic *) memory->intToPtr(params[0]);
int32 pars[2];
if (ob_logic->looping == 0) {
@@ -202,7 +202,7 @@ int32 Logic::fnPassGraph(int32 *params) {
// params: 0 pointer to a graphic structure (might not need this?)
- memcpy(&_vm->_engineGraph, (uint8 *) params[0], sizeof(Object_graphic));
+ memcpy(&_vm->_engineGraph, memory->intToPtr(params[0]), sizeof(Object_graphic));
// makes no odds
return IR_CONT;
@@ -218,7 +218,7 @@ int32 Logic::fnPassMega(int32 *params) {
// params: 0 pointer to a mega structure
- memcpy(&_vm->_engineMega, (uint8 *) params[0], sizeof(Object_mega));
+ memcpy(&_vm->_engineMega, memory->intToPtr(params[0]), sizeof(Object_mega));
// makes no odds
return IR_CONT;
@@ -233,7 +233,7 @@ int32 Logic::fnSetValue(int32 *params) {
// params: 0 pointer to object's mega structure
// 1 value to set it to
- Object_mega *ob_mega = (Object_mega *) params[0];
+ Object_mega *ob_mega = (Object_mega *) memory->intToPtr(params[0]);
ob_mega->megaset_res = params[1];
diff --git a/sword2/icons.cpp b/sword2/icons.cpp
index 32766383f8..ced71c1825 100644
--- a/sword2/icons.cpp
+++ b/sword2/icons.cpp
@@ -34,7 +34,7 @@ int32 Logic::fnAddMenuObject(int32 *params) {
assert(_vm->_totalTemp < TOTAL_engine_pockets);
// copy the structure to our in-the-engine list
- memcpy(&_vm->_tempList[_vm->_totalTemp], (uint8 *) params[0], sizeof(menu_object));
+ memcpy(&_vm->_tempList[_vm->_totalTemp], memory->intToPtr(params[0]), sizeof(menu_object));
_vm->_totalTemp++;
// script continue
diff --git a/sword2/interpreter.cpp b/sword2/interpreter.cpp
index c93bdadf05..c35e6eb954 100644
--- a/sword2/interpreter.cpp
+++ b/sword2/interpreter.cpp
@@ -198,16 +198,7 @@ int32 Logic::executeOpcode(int i, int32 *params) {
return (this->*op) (params);
}
-// FIXME: The script engine assumes it can freely cast from pointer to in32
-// and back again with no ill effects. As far as I know, there is absolutely
-// no guarantee that this will work.
-//
-// Maybe we can represent them as offsets into the memory manager's memory?
-// Assuming, of course, that all the pointers we try to pass around this way
-// point to somewhere in that block.
-//
-// I also have a feeling the handling of a script's local variables may be
-// alignment-unsafe.
+// FIXME: Is the handling of script local variables really alignment-safe?
#define CHECKSTACKPOINTER2 assert(stackPointer2 >= 0 && stackPointer2 < STACK_SIZE);
#define PUSHONSTACK(x) { stack2[stackPointer2] = (x); stackPointer2++; CHECKSTACKPOINTER2 }
@@ -362,8 +353,8 @@ int Logic::runScript(char *scriptData, char *objectData, uint32 *offset) {
case CP_PUSH_LOCAL_ADDR:
// push the address of a local variable
Read16ip(parameter);
- debug(5, "Push address of local variable %d (%x)", parameter, (int32) (variables + parameter));
- PUSHONSTACK((int32) (variables + parameter));
+ debug(5, "Push address of local variable %d (%x)", parameter, memory->ptrToInt((const uint8 *) (variables + parameter)));
+ PUSHONSTACK(memory->ptrToInt((uint8 *) (variables + parameter)));
break;
case CP_PUSH_INT32:
// Push a long word value on to the stack
@@ -598,14 +589,14 @@ int Logic::runScript(char *scriptData, char *objectData, uint32 *offset) {
Read8ip(parameter);
// ip points to the string
- PUSHONSTACK((int32) (code + ip));
+ PUSHONSTACK(memory->ptrToInt((const uint8 *) (code + ip)));
ip += (parameter + 1);
break;
case CP_PUSH_DEREFERENCED_STRUCTURE:
// Push the address of a dereferenced structure
Read32ip(parameter);
- debug(5, "Push address of far variable (%x)", (int32) (objectData + sizeof(int32) + sizeof(_standardHeader) + sizeof(_object_hub) + parameter));
- PUSHONSTACK((int32) (objectData + sizeof(int32) + sizeof(_standardHeader) + sizeof(_object_hub) + parameter));
+ debug(5, "Push address of far variable (%x)", memory->ptrToInt((const uint8 *) (objectData + sizeof(int32) + sizeof(_standardHeader) + sizeof(_object_hub) + parameter)));
+ PUSHONSTACK(memory->ptrToInt((const uint8 *) (objectData + sizeof(int32) + sizeof(_standardHeader) + sizeof(_object_hub) + parameter)));
break;
case OP_GTTHANE:
// '>='
diff --git a/sword2/memory.cpp b/sword2/memory.cpp
index bc7ee94345..908bea1dba 100644
--- a/sword2/memory.cpp
+++ b/sword2/memory.cpp
@@ -88,6 +88,38 @@ MemoryManager::~MemoryManager(void) {
free(_freeMemman);
}
+// I don't know about C++, but here's what "C: A Reference Manual" (Harbison &
+// Steele) has to say:
+//
+// "There is no requirement in C that any of the integral types be large enough
+// to represent a pointer, although C programmers often assume that type long
+// is large enough, which it is on most computers. In C99, header inttypes.h
+// may define integer types intptr_t and uintptr_t, which are guaranteed large
+// enough to hold a pointer as an integer."
+//
+// The script engine frequently needs to pass around pointers to various
+// structures etc. and, and used to do so by casting them to int32 and back
+// again. Since those pointers always point to memory that belongs to the
+// memory manager, we can easily represent them as offsets instead.
+
+int32 MemoryManager::ptrToInt(const uint8 *p) {
+ debug(9, "ptrToInt: %p -> %d", p, p - _freeMemman);
+
+ if (p < _freeMemman || p >= &_freeMemman[MEMORY_POOL])
+ warning("ptrToInt: Converting bad pointer: %p", p);
+
+ return p - _freeMemman;
+}
+
+uint8 *MemoryManager::intToPtr(int32 n) {
+ debug(9, "intToPtr: %d -> %p", n, &_freeMemman[n]);
+
+ if (n < 0 || n >= MEMORY_POOL)
+ warning("intToPtr: Converting bad integer: %d", n);
+
+ return &_freeMemman[n];
+}
+
mem *MemoryManager::lowLevelAlloc(uint32 size, uint32 type, uint32 unique_id) {
// allocate a block of memory - locked or float
diff --git a/sword2/memory.h b/sword2/memory.h
index b3fe7f1afd..51c203265f 100644
--- a/sword2/memory.h
+++ b/sword2/memory.h
@@ -95,6 +95,9 @@ public:
MemoryManager(void);
~MemoryManager(void);
+ int32 ptrToInt(const uint8 *p);
+ uint8 *intToPtr(int32 n);
+
mem *allocMemory(uint32 size, uint32 type, uint32 unique_id);
void freeMemory(mem *block);
void floatMemory(mem *block);
diff --git a/sword2/mouse.cpp b/sword2/mouse.cpp
index 814e5aed48..32bb757734 100644
--- a/sword2/mouse.cpp
+++ b/sword2/mouse.cpp
@@ -1156,7 +1156,7 @@ int32 Logic::fnRegisterMouse(int32 *params) {
// params: 0 pointer to Object_mouse or 0 for no write to mouse
// list
- _vm->registerMouse((Object_mouse *) params[0]);
+ _vm->registerMouse((Object_mouse *) memory->intToPtr(params[0]));
return IR_CONT;
}
@@ -1181,7 +1181,7 @@ int32 Logic::fnRegisterPointerText(int32 *params) {
int32 Logic::fnInitFloorMouse(int32 *params) {
// params: 0 pointer to object's mouse structure
- Object_mouse *ob_mouse = (Object_mouse *) params[0];
+ Object_mouse *ob_mouse = (Object_mouse *) memory->intToPtr(params[0]);
// floor is always lowest priority
@@ -1200,7 +1200,7 @@ int32 Logic::fnInitFloorMouse(int32 *params) {
int32 Logic::fnSetScrollLeftMouse(int32 *params) {
// params: 0 pointer to object's mouse structure
- Object_mouse *ob_mouse = (Object_mouse *) params[0];
+ Object_mouse *ob_mouse = (Object_mouse *) memory->intToPtr(params[0]);
// Highest priority
@@ -1224,7 +1224,7 @@ int32 Logic::fnSetScrollLeftMouse(int32 *params) {
int32 Logic::fnSetScrollRightMouse(int32 *params) {
// params: 0 pointer to object's mouse structure
- Object_mouse *ob_mouse = (Object_mouse *) params[0];
+ Object_mouse *ob_mouse = (Object_mouse *) memory->intToPtr(params[0]);
// Highest priority
diff --git a/sword2/save_rest.cpp b/sword2/save_rest.cpp
index c886fd9dc7..0389bba16f 100644
--- a/sword2/save_rest.cpp
+++ b/sword2/save_rest.cpp
@@ -557,9 +557,9 @@ int32 Logic::fnPassPlayerSaveData(int32 *params) {
// copy from player object to savegame header
- memcpy(&_vm->g_header.logic, (uint8 *) params[0], sizeof(Object_logic));
- memcpy(&_vm->g_header.graphic, (uint8 *) params[1], sizeof(Object_graphic));
- memcpy(&_vm->g_header.mega, (uint8 *) params[2], sizeof(Object_mega));
+ memcpy(&_vm->g_header.logic, memory->intToPtr(params[0]), sizeof(Object_logic));
+ memcpy(&_vm->g_header.graphic, memory->intToPtr(params[1]), sizeof(Object_graphic));
+ memcpy(&_vm->g_header.mega, memory->intToPtr(params[2]), sizeof(Object_mega));
// makes no odds
return IR_CONT;
@@ -573,9 +573,9 @@ int32 Logic::fnGetPlayerSaveData(int32 *params) {
// 1 pointer to object's graphic structure
// 2 pointer to object's mega structure
- Object_logic *ob_logic = (Object_logic *) params[0];
- Object_graphic *ob_graphic = (Object_graphic *) params[1];
- Object_mega *ob_mega = (Object_mega *) params[2];
+ Object_logic *ob_logic = (Object_logic *) memory->intToPtr(params[0]);
+ Object_graphic *ob_graphic = (Object_graphic *) memory->intToPtr(params[1]);
+ Object_mega *ob_mega = (Object_mega *) memory->intToPtr(params[2]);
int32 pars[3];
diff --git a/sword2/speech.cpp b/sword2/speech.cpp
index 9b1886783e..6b64558b72 100644
--- a/sword2/speech.cpp
+++ b/sword2/speech.cpp
@@ -387,7 +387,7 @@ int32 Logic::fnTheyDoWeWait(int32 *params) {
res_man->closeResource(target);
- ob_logic = (Object_logic *) params[0];
+ ob_logic = (Object_logic *) memory->intToPtr(params[0]);
if (!INS_COMMAND && RESULT == 1 && ob_logic->looping == 0) {
// first time so set up targets command if target is waiting
@@ -498,10 +498,10 @@ int32 Logic::fnTimedWait(int32 *params) {
_standardHeader *head;
int32 target = params[1];
- ob_logic = (Object_logic *) params[0];
+ ob_logic = (Object_logic *) memory->intToPtr(params[0]);
if (!ob_logic->looping)
- ob_logic->looping = params[2]; //first time in
+ ob_logic->looping = params[2]; // first time in
// request status of target
head = (_standardHeader*) res_man->openResource(target);
@@ -580,7 +580,7 @@ int32 Logic::fnSpeechProcess(int32 *params) {
int32 pars[9];
int32 ret;
- ob_speech = (Object_speech *) params[1];
+ ob_speech = (Object_speech *) memory->intToPtr(params[1]);
debug(5, " SP");
@@ -896,8 +896,8 @@ int32 Logic::fnISpeak(int32 *params) {
// set up the pointers which we know we'll always need
- ob_logic = (Object_logic *) params[S_OB_LOGIC];
- ob_graphic = (Object_graphic *) params[S_OB_GRAPHIC];
+ ob_logic = (Object_logic *) memory->intToPtr(params[S_OB_LOGIC]);
+ ob_graphic = (Object_graphic *) memory->intToPtr(params[S_OB_GRAPHIC]);
// FIRST TIME ONLY: create the text, load the wav, set up the anim,
// etc.
@@ -1039,10 +1039,10 @@ int32 Logic::fnISpeak(int32 *params) {
// use this direction table to derive the anim
// NB. ASSUMES WE HAVE A MEGA OBJECT!!
- ob_mega = (Object_mega*) params[S_OB_MEGA];
+ ob_mega = (Object_mega *) memory->intToPtr(params[S_OB_MEGA]);
// pointer to anim table
- anim_table = (int32 *) params[S_DIR_TABLE];
+ anim_table = (int32 *) memory->intToPtr(params[S_DIR_TABLE]);
// appropriate anim resource is in 'table[direction]'
_animId = anim_table[ob_mega->current_dir];
@@ -1373,7 +1373,7 @@ void Logic::locateTalker(int32 *params) {
if (cdt_entry->frameType & FRAME_OFFSET) {
// this may be NULL
- ob_mega = (Object_mega*) params[S_OB_MEGA];
+ ob_mega = (Object_mega *) memory->intToPtr(params[S_OB_MEGA]);
// calc scale at which to print the sprite, based on
// feet y-coord & scaling constants (NB. 'scale' is
@@ -1446,7 +1446,7 @@ void Logic::formText(int32 *params) {
// text
if (params[S_TEXT]) {
- ob_speech = (Object_speech *) params[S_OB_SPEECH];
+ ob_speech = (Object_speech *) memory->intToPtr(params[S_OB_SPEECH]);
// establish the max width allowed for this text sprite
diff --git a/sword2/startup.cpp b/sword2/startup.cpp
index 3f6159b177..9ecd7ba8c3 100644
--- a/sword2/startup.cpp
+++ b/sword2/startup.cpp
@@ -119,7 +119,7 @@ uint32 Logic::initStartMenu(void) {
if (res_man->checkValid(_startRes)) {
debug(5, "- resource %d ok", _startRes);
- raw_script = (char*) res_man->openResource(_startRes);
+ raw_script = (char *) res_man->openResource(_startRes);
null_pc = 0;
runScript(raw_script, raw_script, &null_pc);
res_man->closeResource(_startRes);
@@ -141,7 +141,7 @@ int32 Logic::fnRegisterStartPoint(int32 *params) {
error("ERROR: _startList full");
// +1 to allow for NULL terminator
- if (strlen((char*) params[1]) + 1 > MAX_description)
+ if (strlen((const char *) memory->intToPtr(params[1])) + 1 > MAX_description)
error("ERROR: startup description too long");
#endif
@@ -152,7 +152,7 @@ int32 Logic::fnRegisterStartPoint(int32 *params) {
// the correct start
_startList[_totalStartups].key = params[0];
- strcpy(_startList[_totalStartups].description, (char*) params[1]);
+ strcpy(_startList[_totalStartups].description, (const char *) memory->intToPtr(params[1]));
// point to next
_totalStartups++;
diff --git a/sword2/walker.cpp b/sword2/walker.cpp
index c9ff1c984f..e141fb30d8 100644
--- a/sword2/walker.cpp
+++ b/sword2/walker.cpp
@@ -60,9 +60,9 @@ int32 Logic::fnWalk(int32 *params) {
// get the parameters
- ob_logic = (Object_logic *) params[0];
- ob_graph = (Object_graphic *) params[1];
- ob_mega = (Object_mega *) params[2];
+ ob_logic = (Object_logic *) memory->intToPtr(params[0]);
+ ob_graph = (Object_graphic *) memory->intToPtr(params[1]);
+ ob_mega = (Object_mega *) memory->intToPtr(params[2]);
target_x = (int16) params[4];
target_y = (int16) params[5];
@@ -88,7 +88,7 @@ int32 Logic::fnWalk(int32 *params) {
if (params[6] < 0 || params[6] > 8)
error("Invalid direction (%d) in fnWalk", params[6]);
- ob_walkdata = (Object_walkdata *) params[3];
+ ob_walkdata = (Object_walkdata *) memory->intToPtr(params[3]);
ob_mega->walk_pc = 0; // always
@@ -170,7 +170,7 @@ int32 Logic::fnWalk(int32 *params) {
if (checkEventWaiting()) {
if (walkAnim[walk_pc].step == 0 && walkAnim[walk_pc + 1].step == 1) {
// at the beginning of a step
- ob_walkdata = (Object_walkdata *) params[3];
+ ob_walkdata = (Object_walkdata *) memory->intToPtr(params[3]);
_router->earlySlowOut(ob_mega, ob_walkdata);
}
}
@@ -255,7 +255,7 @@ int32 Logic::fnWalkToAnim(int32 *params) {
// if this is the start of the walk, read anim file to get start coords
- ob_logic = (Object_logic *) params[0];
+ ob_logic = (Object_logic *) memory->intToPtr(params[0]);
if (ob_logic->looping == 0) {
// open anim file
@@ -320,13 +320,13 @@ int32 Logic::fnTurn(int32 *params) {
// if this is the start of the turn, get the mega's current feet
// coords + the required direction
- ob_logic = (Object_logic *) params[0];
+ ob_logic = (Object_logic *) memory->intToPtr(params[0]);
if (ob_logic->looping == 0) {
if (params[4] < 0 || params[4] > 7)
error("Invalid direction (%d) in fnTurn", params[4]);
- ob_mega = (Object_mega *) params[2];
+ ob_mega = (Object_mega *) memory->intToPtr(params[2]);
pars[4] = ob_mega->feet_x;
pars[5] = ob_mega->feet_y;
@@ -367,8 +367,8 @@ int32 Logic::fnStandAt(int32 *params) {
// set up pointers to the graphic & mega structure
- ob_graph = (Object_graphic *) params[0];
- ob_mega = (Object_mega *) params[1];
+ ob_graph = (Object_graphic *) memory->intToPtr(params[0]);
+ ob_mega = (Object_mega *) memory->intToPtr(params[1]);
// set up the stand frame & set the mega's new direction
@@ -394,7 +394,7 @@ int32 Logic::fnStand(int32 *params) {
// 1 pointer to object's mega structure
// 2 target direction
- Object_mega *ob_mega = (Object_mega *) params[1];
+ Object_mega *ob_mega = (Object_mega *) memory->intToPtr(params[1]);
int32 pars[5];
pars[0] = params[0];
@@ -556,10 +556,10 @@ int32 Logic::fnFaceXY(int32 *params) {
// if this is the start of the turn, get the mega's current feet
// coords + the required direction
- ob_logic = (Object_logic *) params[0];
+ ob_logic = (Object_logic *) memory->intToPtr(params[0]);
if (ob_logic->looping == 0) {
- ob_mega = (Object_mega *) params[2];
+ ob_mega = (Object_mega *) memory->intToPtr(params[2]);
pars[4] = ob_mega->feet_x;
pars[5] = ob_mega->feet_y;
@@ -591,12 +591,12 @@ int32 Logic::fnFaceMega(int32 *params) {
Object_mega *ob_mega;
_standardHeader *head;
- ob_mega = (Object_mega *) params[2];
- ob_logic = (Object_logic *) params[0];
+ ob_mega = (Object_mega *) memory->intToPtr(params[2]);
+ ob_logic = (Object_logic *) memory->intToPtr(params[0]);
if (ob_logic->looping == 0) {
// get targets info
- head = (_standardHeader*) res_man->openResource(params[4]);
+ head = (_standardHeader *) res_man->openResource(params[4]);
if (head->fileType != GAME_OBJECT)
error("fnFaceMega %d not an object", params[4]);
@@ -647,8 +647,8 @@ int32 Logic::fnWalkToTalkToMega(int32 *params) {
int mega_separation = params[5];
_standardHeader *head;
- ob_logic = (Object_logic*) params[0];
- ob_mega = (Object_mega*) params[2];
+ ob_logic = (Object_logic *) memory->intToPtr(params[0]);
+ ob_mega = (Object_mega *) memory->intToPtr(params[2]);
pars[0] = params[0]; // standard stuff
pars[1] = params[1];
@@ -658,7 +658,7 @@ int32 Logic::fnWalkToTalkToMega(int32 *params) {
// not been here before so decide where to walk-to
if (!ob_logic->looping) {
// first request the targets info
- head = (_standardHeader*) res_man->openResource(params[4]);
+ head = (_standardHeader *) res_man->openResource(params[4]);
if (head->fileType != GAME_OBJECT)
error("fnWalkToTalkToMega %d not an object", params[4]);
@@ -771,7 +771,7 @@ int32 Logic::fnSetScaling(int32 *params) {
// where s is system scale, which itself is (256 * actual_scale) ie.
// s == 128 is half size
- Object_mega *ob_mega = (Object_mega *) params[0];
+ Object_mega *ob_mega = (Object_mega *) memory->intToPtr(params[0]);
ob_mega->scale_a = params[1];
ob_mega->scale_b = params[2];