o Convert some objectMap methods to more C++-like.
o Add stubs for unhandled scene resources in first scene o Fix object map entry structure o Fix bug with objject_info() debug command All this was done in attempt to make room exits work until I realized that they are different hit zone list which is activate at end of walk sequence. svn-id: r15416
This commit is contained in:
parent
53d807ab16
commit
f1ffeaf3ec
6 changed files with 52 additions and 64 deletions
|
@ -32,6 +32,7 @@
|
||||||
#include "saga/font.h"
|
#include "saga/font.h"
|
||||||
#include "saga/objectmap.h"
|
#include "saga/objectmap.h"
|
||||||
#include "saga/rscfile_mod.h"
|
#include "saga/rscfile_mod.h"
|
||||||
|
#include "saga/scene.h"
|
||||||
#include "saga/script.h"
|
#include "saga/script.h"
|
||||||
#include "saga/sprite.h"
|
#include "saga/sprite.h"
|
||||||
|
|
||||||
|
@ -492,13 +493,10 @@ int Interface::handlePlayfieldClick(R_SURFACE *ds, Point *imouse_pt) {
|
||||||
return R_SUCCESS;
|
return R_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_vm->_objectMap->getFlags(object_num, &object_flags) != R_SUCCESS) {
|
object_flags = _vm->_objectMap->getFlags(object_num);
|
||||||
_vm->_console->print("Invalid object number: %d\n", object_num);
|
|
||||||
return R_FAILURE;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (object_flags & R_OBJECT_NORMAL) {
|
if (object_flags & R_OBJECT_NORMAL) {
|
||||||
if (_vm->_objectMap->getEPNum(object_num, &script_num) == R_SUCCESS) {
|
if ((script_num = _vm->_objectMap->getEPNum(object_num)) != -1) {
|
||||||
// Set active verb in script module
|
// Set active verb in script module
|
||||||
_vm->_sdata->putWord(4, 4, I_VerbData[_activeVerb].s_verb);
|
_vm->_sdata->putWord(4, 4, I_VerbData[_activeVerb].s_verb);
|
||||||
|
|
||||||
|
@ -535,12 +533,9 @@ int Interface::handlePlayfieldUpdate(R_SURFACE *ds, Point *imouse_pt) {
|
||||||
return R_SUCCESS;
|
return R_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_vm->_objectMap->getFlags(object_num, &object_flags) != R_SUCCESS) {
|
object_flags = _vm->_objectMap->getFlags(object_num);
|
||||||
_vm->_console->print("Invalid object number: %d\n", object_num);
|
|
||||||
return R_FAILURE;
|
|
||||||
}
|
|
||||||
|
|
||||||
_vm->_objectMap->getName(object_num, &object_name);
|
object_name = _vm->_objectMap->getName(object_num);
|
||||||
|
|
||||||
if (object_flags & R_OBJECT_NORMAL) {
|
if (object_flags & R_OBJECT_NORMAL) {
|
||||||
// Normal scene object - display as subject of verb
|
// Normal scene object - display as subject of verb
|
||||||
|
|
|
@ -39,7 +39,7 @@ namespace Saga {
|
||||||
static void CF_object_info(int argc, char *argv[], void *refCon);
|
static void CF_object_info(int argc, char *argv[], void *refCon);
|
||||||
|
|
||||||
int ObjectMap::reg() {
|
int ObjectMap::reg() {
|
||||||
CVAR_RegisterFunc(CF_object_info, "object_info", NULL, R_CVAR_NONE, 0, 0, NULL);
|
CVAR_RegisterFunc(CF_object_info, "object_info", NULL, R_CVAR_NONE, 0, 0, this);
|
||||||
|
|
||||||
return R_SUCCESS;
|
return R_SUCCESS;
|
||||||
}
|
}
|
||||||
|
@ -60,7 +60,7 @@ ObjectMap::~ObjectMap() {
|
||||||
freeMem();
|
freeMem();
|
||||||
freeNames();
|
freeNames();
|
||||||
|
|
||||||
debug(0, "ObjectMap Module: Shutdown AOK.");
|
debug(0, "ObjectMap Module: Shutdown OK.");
|
||||||
|
|
||||||
_initialized = 0;
|
_initialized = 0;
|
||||||
}
|
}
|
||||||
|
@ -97,9 +97,10 @@ int ObjectMap::load(const byte *om_res, size_t om_res_len) {
|
||||||
// Load all N objects
|
// Load all N objects
|
||||||
for (i = 0; i < _n_objects; i++) {
|
for (i = 0; i < _n_objects; i++) {
|
||||||
object_map = &_object_maps[i];
|
object_map = &_object_maps[i];
|
||||||
object_map->unknown0 = readS.readByte();
|
object_map->flags = readS.readByte();
|
||||||
object_map->n_clickareas = readS.readByte();
|
object_map->n_clickareas = readS.readByte();
|
||||||
object_map->flags = readS.readUint16LE();
|
object_map->defaultVerb = readS.readByte();
|
||||||
|
readS.readByte();
|
||||||
object_map->object_num = readS.readUint16LE();
|
object_map->object_num = readS.readUint16LE();
|
||||||
object_map->script_num = readS.readUint16LE();
|
object_map->script_num = readS.readUint16LE();
|
||||||
object_map->clickareas = (R_CLICKAREA *)malloc(object_map->n_clickareas * sizeof *(object_map->clickareas));
|
object_map->clickareas = (R_CLICKAREA *)malloc(object_map->n_clickareas * sizeof *(object_map->clickareas));
|
||||||
|
@ -223,66 +224,45 @@ int ObjectMap::freeNames() {
|
||||||
// name list resource, the funciton sets '*name' to the descriptive string
|
// name list resource, the funciton sets '*name' to the descriptive string
|
||||||
// corresponding to 'object' and returns R_SUCCESS. Otherwise it returns
|
// corresponding to 'object' and returns R_SUCCESS. Otherwise it returns
|
||||||
// R_FAILURE.
|
// R_FAILURE.
|
||||||
int ObjectMap::getName(int object, const char **name) {
|
const char *ObjectMap::getName(int object) {
|
||||||
if (!_names_loaded) {
|
assert(_names_loaded);
|
||||||
return R_FAILURE;
|
assert((object > 0) && (object <= _n_names));
|
||||||
}
|
|
||||||
|
|
||||||
if ((object <= 0) || (object > _n_names)) {
|
return _names[object - 1];
|
||||||
return R_FAILURE;
|
|
||||||
}
|
|
||||||
|
|
||||||
*name = _names[object - 1];
|
|
||||||
|
|
||||||
return R_SUCCESS;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int ObjectMap::getFlags(int object, uint16 *flags) {
|
const uint16 ObjectMap::getFlags(int object) {
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
if (!_names_loaded) {
|
assert(_names_loaded);
|
||||||
return R_FAILURE;
|
assert((object > 0) && (object <= _n_names));
|
||||||
}
|
|
||||||
|
|
||||||
if ((object <= 0) || (object > _n_names)) {
|
|
||||||
return R_FAILURE;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (i = 0; i < _n_objects; i++) {
|
for (i = 0; i < _n_objects; i++) {
|
||||||
if (_object_maps[i].object_num == object) {
|
if (_object_maps[i].object_num == object) {
|
||||||
*flags = _object_maps[i].flags;
|
return _object_maps[i].flags;
|
||||||
return R_SUCCESS;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return R_FAILURE;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
// If 'object' is a valid object number in the currently loaded object
|
// If 'object' is a valid object number in the currently loaded object
|
||||||
// name list resource, the funciton sets '*ep_num' to the entrypoint number
|
// name list resource, the funciton sets '*ep_num' to the entrypoint number
|
||||||
// corresponding to 'object' and returns R_SUCCESS. Otherwise, it returns
|
// corresponding to 'object' and returns R_SUCCESS. Otherwise, it returns
|
||||||
// R_FAILURE.
|
// R_FAILURE.
|
||||||
int ObjectMap::getEPNum(int object, int *ep_num) {
|
const int ObjectMap::getEPNum(int object) {
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
if (!_names_loaded) {
|
assert(_names_loaded);
|
||||||
return R_FAILURE;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((object < 0) || (object > (_n_objects + 1))) {
|
if ((object < 0) || (object > (_n_objects + 1)))
|
||||||
return R_FAILURE;
|
return -1;
|
||||||
}
|
|
||||||
|
|
||||||
for (i = 0; i < _n_objects; i++) {
|
for (i = 0; i < _n_objects; i++)
|
||||||
|
if (_object_maps[i].object_num == object)
|
||||||
|
return _object_maps[i].script_num;
|
||||||
|
|
||||||
if (_object_maps[i].object_num == object) {
|
return -1;
|
||||||
|
|
||||||
*ep_num = _object_maps[i].script_num;
|
|
||||||
return R_SUCCESS;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return R_FAILURE;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Uses Gfx::drawLine to display all clickareas for each object in the
|
// Uses Gfx::drawLine to display all clickareas for each object in the
|
||||||
|
@ -317,9 +297,9 @@ int ObjectMap::draw(R_SURFACE *ds, Point *imouse_pt, int color, int color2) {
|
||||||
for (i = 0; i < _n_objects; i++) {
|
for (i = 0; i < _n_objects; i++) {
|
||||||
draw_color = color;
|
draw_color = color;
|
||||||
if (hit_object && (object_num == _object_maps[i].object_num)) {
|
if (hit_object && (object_num == _object_maps[i].object_num)) {
|
||||||
snprintf(txt_buf, sizeof txt_buf, "obj %d: ? %d, f %X",
|
snprintf(txt_buf, sizeof txt_buf, "obj %d: v %d, f %X",
|
||||||
_object_maps[i].object_num,
|
_object_maps[i].object_num,
|
||||||
_object_maps[i].unknown0,
|
_object_maps[i].defaultVerb,
|
||||||
_object_maps[i].flags);
|
_object_maps[i].flags);
|
||||||
draw_txt = 1;
|
draw_txt = 1;
|
||||||
draw_color = color2;
|
draw_color = color2;
|
||||||
|
@ -434,7 +414,8 @@ void ObjectMap::objectInfo(int argc, char *argv[]) {
|
||||||
|
|
||||||
for (i = 0; i < _n_objects; i++) {
|
for (i = 0; i < _n_objects; i++) {
|
||||||
_vm->_console->print("%s:", _names[i]);
|
_vm->_console->print("%s:", _names[i]);
|
||||||
_vm->_console->print("%d. Unk1: %d, flags: %X, name_i: %d, scr_n: %d, ca_ct: %d", i, _object_maps[i].unknown0,
|
_vm->_console->print("%d. verb: %d, flags: %X, name_i: %d, scr_n: %d, ca_ct: %d", i,
|
||||||
|
_object_maps[i].defaultVerb,
|
||||||
_object_maps[i].flags,
|
_object_maps[i].flags,
|
||||||
_object_maps[i].object_num,
|
_object_maps[i].object_num,
|
||||||
_object_maps[i].script_num,
|
_object_maps[i].script_num,
|
||||||
|
|
|
@ -29,6 +29,7 @@
|
||||||
namespace Saga {
|
namespace Saga {
|
||||||
|
|
||||||
enum R_OBJECT_FLAGS {
|
enum R_OBJECT_FLAGS {
|
||||||
|
R_OBJECT_EXIT = 0x01,
|
||||||
R_OBJECT_NORMAL = 0x02
|
R_OBJECT_NORMAL = 0x02
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -38,8 +39,8 @@ struct R_CLICKAREA {
|
||||||
};
|
};
|
||||||
|
|
||||||
struct R_OBJECTMAP_ENTRY {
|
struct R_OBJECTMAP_ENTRY {
|
||||||
int unknown0;
|
byte flags;
|
||||||
uint16 flags;
|
byte defaultVerb;
|
||||||
|
|
||||||
int object_num;
|
int object_num;
|
||||||
int script_num;
|
int script_num;
|
||||||
|
@ -59,9 +60,9 @@ public:
|
||||||
int freeMem(void);
|
int freeMem(void);
|
||||||
int loadNames(const byte *onl_res, size_t onl_res_len);
|
int loadNames(const byte *onl_res, size_t onl_res_len);
|
||||||
int freeNames();
|
int freeNames();
|
||||||
int getName(int object, const char **name);
|
const char *getName(int object);
|
||||||
int getFlags(int object, uint16 *flags);
|
const uint16 getFlags(int object);
|
||||||
int getEPNum(int object, int *ep_num);
|
const int getEPNum(int object);
|
||||||
int draw(R_SURFACE *draw_surface, Point *imouse_pt, int color, int color2);
|
int draw(R_SURFACE *draw_surface, Point *imouse_pt, int color, int color2);
|
||||||
int hitTest(Point *imouse_pt, int *object_num);
|
int hitTest(Point *imouse_pt, int *object_num);
|
||||||
void objectInfo(int argc, char *argv[]);
|
void objectInfo(int argc, char *argv[]);
|
||||||
|
|
|
@ -763,6 +763,12 @@ int Scene::processSceneResources() {
|
||||||
debug(0, "Loading palette animation resource.");
|
debug(0, "Loading palette animation resource.");
|
||||||
_vm->_palanim->loadPalAnim(_resList[i].res_data, _resList[i].res_data_len);
|
_vm->_palanim->loadPalAnim(_resList[i].res_data, _resList[i].res_data_len);
|
||||||
break;
|
break;
|
||||||
|
case SAGA_ENTRY:
|
||||||
|
warning("Scene::ProcessSceneResources(): Loading scene entries is not implemented");
|
||||||
|
break;
|
||||||
|
case SAGA_FACES:
|
||||||
|
warning("Scene::ProcessSceneResources(): Loading scene faces is not implemented");
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
warning("Scene::ProcessSceneResources(): Encountered unknown resource type: %d", _resList[i].res_type);
|
warning("Scene::ProcessSceneResources(): Encountered unknown resource type: %d", _resList[i].res_type);
|
||||||
break;
|
break;
|
||||||
|
@ -972,7 +978,7 @@ int Scene::defaultScene(int param, R_SCENE_INFO *scene_info) {
|
||||||
_vm->_events->queue(&event);
|
_vm->_events->queue(&event);
|
||||||
} else
|
} else
|
||||||
_vm->_music->stop();
|
_vm->_music->stop();
|
||||||
|
//break; //HACK to disable faery script
|
||||||
if (_desc.sceneScriptNum > 0) {
|
if (_desc.sceneScriptNum > 0) {
|
||||||
R_SCRIPT_THREAD *_sceneScriptThread;
|
R_SCRIPT_THREAD *_sceneScriptThread;
|
||||||
|
|
||||||
|
|
|
@ -82,6 +82,7 @@ enum SAGA_RESOURCE_TYPES {
|
||||||
SAGA_ISO_TILESET = 8,
|
SAGA_ISO_TILESET = 8,
|
||||||
SAGA_ISO_METAMAP = 9,
|
SAGA_ISO_METAMAP = 9,
|
||||||
SAGA_ISO_METATILESET = 10,
|
SAGA_ISO_METATILESET = 10,
|
||||||
|
SAGA_ENTRY = 12,
|
||||||
SAGA_ANIM_1 = 14,
|
SAGA_ANIM_1 = 14,
|
||||||
SAGA_ANIM_2,
|
SAGA_ANIM_2,
|
||||||
SAGA_ANIM_3,
|
SAGA_ANIM_3,
|
||||||
|
@ -89,7 +90,8 @@ enum SAGA_RESOURCE_TYPES {
|
||||||
SAGA_ANIM_5,
|
SAGA_ANIM_5,
|
||||||
SAGA_ANIM_6,
|
SAGA_ANIM_6,
|
||||||
SAGA_ANIM_7,
|
SAGA_ANIM_7,
|
||||||
SAGA_PAL_ANIM = 23
|
SAGA_PAL_ANIM = 23,
|
||||||
|
SAGA_FACES = 24
|
||||||
};
|
};
|
||||||
|
|
||||||
#define SAGA_RESLIST_ENTRY_LEN 4
|
#define SAGA_RESLIST_ENTRY_LEN 4
|
||||||
|
|
|
@ -18,7 +18,7 @@ Sceneres.h
|
||||||
LOADREQ_TILE_MAP SAGA_ISO_METAMAP
|
LOADREQ_TILE_MAP SAGA_ISO_METAMAP
|
||||||
LOADREQ_TILE_PLATFORMS SAGA_ISO_METATILESET
|
LOADREQ_TILE_PLATFORMS SAGA_ISO_METATILESET
|
||||||
LOADREQ_TILE_METATILES
|
LOADREQ_TILE_METATILES
|
||||||
LOADREQ_ENTRY
|
LOADREQ_ENTRY SAGA_ENTRY
|
||||||
LOADREQ_FRAMELIST
|
LOADREQ_FRAMELIST
|
||||||
|
|
||||||
LOADREQ_ANIM_0 SAGA_ANIM_1
|
LOADREQ_ANIM_0 SAGA_ANIM_1
|
||||||
|
@ -32,9 +32,12 @@ Sceneres.h
|
||||||
|
|
||||||
LOADREQ_TILE_MULTI
|
LOADREQ_TILE_MULTI
|
||||||
LOADREQ_CYCLES SAGA_PAL_ANIM
|
LOADREQ_CYCLES SAGA_PAL_ANIM
|
||||||
LOADREQ_FACES
|
LOADREQ_FACES SAGA_FACES
|
||||||
LOADREQ_PALETTE
|
LOADREQ_PALETTE
|
||||||
|
|
||||||
|
HZONE_EXIT R_OBJECT_EXIT
|
||||||
|
HZONEF_AUTOWALK R_OBJECT_NORMAL
|
||||||
|
|
||||||
Scene.c
|
Scene.c
|
||||||
=======
|
=======
|
||||||
ResToImage() _vm->decodeBGImage()
|
ResToImage() _vm->decodeBGImage()
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue