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
This commit is contained in:
Torbjörn Andersson 2003-11-10 07:52:15 +00:00
parent 439bc8364d
commit 3d012651fd
13 changed files with 115 additions and 89 deletions

View File

@ -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);

View File

@ -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;

View File

@ -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

View File

@ -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];

View File

@ -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

View File

@ -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:
// '>='

View File

@ -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

View File

@ -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);

View File

@ -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

View File

@ -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];

View File

@ -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

View File

@ -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++;

View File

@ -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];