sprite loading fix in win demo

svn-id: r16119
This commit is contained in:
Andrew Kurushin 2004-12-18 16:08:59 +00:00
parent c195ae0e74
commit 1724d00962
8 changed files with 60 additions and 44 deletions

View file

@ -70,13 +70,13 @@ Actor::Actor(SagaEngine *vm) : _vm(vm) {
for (i = 0; i < ACTORCOUNT; i++) {
actor = &_actors[i];
actor->actorId = ACTOR_INDEX_TO_ID(i);
actor->index = i;
debug(0, "init actorId=0x%X index=0x%X", actor->actorId, actor->index);
actor->_actorId = ACTOR_INDEX_TO_ID(i);
actor->_index = i;
debug(0, "init actorId=0x%X index=0x%X", actor->_actorId, actor->_index);
actor->spriteListResourceId = ActorTable[i].spriteListResourceId;
actor->frameListResourceId = ActorTable[i].frameListResourceId;
actor->flags = ActorTable[i].flags;
actor->speechColor = ActorTable[actor->index].speechColor;
actor->speechColor = ActorTable[i].speechColor;
actor->orient = ACTOR_DEFAULT_ORIENT;
actor->def_action = 0;
actor->def_action_flags = 0;
@ -84,10 +84,14 @@ Actor::Actor(SagaEngine *vm) : _vm(vm) {
actor->action_flags = 0;
actor->action_time = 0;
actor->action_frame = 0;
if (loadActorResources(actor) != SUCCESS)
error("Error while loading actors resource actorId=0x%X index=0x%X", actor->actorId, actor->index);
actor->_disabled = !loadActorResources(actor);
if (actor->_disabled) {
warning("Disabling actorId=0x%X index=0x%X", actor->_actorId, actor->_index);
} else {
_orderList.push_back(actor);
}
}
}
Actor::~Actor() {
@ -103,7 +107,7 @@ Actor::~Actor() {
}
}
int Actor::loadActorResources(ActorData * actor) {
bool Actor::loadActorResources(ActorData * actor) {
byte *resourcePointer;
size_t resourceLength;
int frameCount;
@ -112,20 +116,19 @@ int Actor::loadActorResources(ActorData * actor) {
int i, orient;
int result;
debug(0, "Loading frame resource id 0x%X", actor->frameListResourceId);
result = RSC_LoadResource(_actorContext, actor->frameListResourceId, &resourcePointer, &resourceLength);
if (result != SUCCESS) {
warning("Couldn't load sprite action index resource");
return FAILURE;
return false;
}
frameCount = resourceLength / 16;
debug(0, "Sprite resource contains %d frames", frameCount);
debug(0, "Frame resource contains %d frames", frameCount);
framesPointer = (ActorFrame *)malloc(sizeof(ActorFrame) * frameCount);
if (framesPointer == NULL) {
warning("Couldn't allocate memory for sprite frames");
RSC_FreeResource(resourcePointer);
return MEM;
error("Couldn't allocate memory for sprite frames");
}
MemoryReadStreamEndian readS(resourcePointer, resourceLength, IS_BIG_ENDIAN);
@ -149,27 +152,37 @@ int Actor::loadActorResources(ActorData * actor) {
actor->frameCount = frameCount;
debug(0, "Loading sprite resource id 0x%X", actor->spriteListResourceId);
if (_vm->_sprite->loadList(actor->spriteListResourceId, &actor->spriteList) != SUCCESS) {
warning("Unable to load sprite list");
return FAILURE;
return false;
}
if (lastFrame >= _vm->_sprite->getListLen(actor->spriteList)) {
i = _vm->_sprite->getListLen(actor->spriteList);
if ( (lastFrame >= i)) {
debug(0, "Appending to sprite list 0x%X", actor->spriteListResourceId);
if (_vm->_sprite->appendList(actor->spriteListResourceId + 1, actor->spriteList) != SUCCESS) {
warning("Unable append sprite list");
return FAILURE;
return false;
}
}
return SUCCESS;
return true;
}
ActorData *Actor::getActor(uint16 actorId) {
if(!IS_VALID_ACTOR_ID(actorId))
ActorData *actor;
if (!IS_VALID_ACTOR_ID(actorId))
error("Actor::getActor Wrong actorId 0x%X", actorId);
return &_actors[ACTOR_ID_TO_INDEX(actorId)];
actor = &_actors[ACTOR_ID_TO_INDEX(actorId)];
if (actor->_disabled)
error("Actor::getActor disabled actorId 0x%X", actorId);
return actor;
}
ActorOrderList::iterator Actor::getActorOrderIterator(const ActorData *actor) {
@ -297,9 +310,12 @@ int Actor::drawList() {
for (actorOrderIterator = _orderList.begin(); actorOrderIterator != _orderList.end(); ++actorOrderIterator) {
actor = actorOrderIterator.operator*();
if(actor->frameCount == 0) continue;
o_idx = ActorOrientationLUT[actor->orient];
sprite_num = actor->frames[actor->action].dir[o_idx].frameIndex;
sprite_num += actor->action_frame;
if(actor->spriteList->sprite_count <= sprite_num) continue;
_vm->_sprite->drawOccluded(back_buf, actor->spriteList, sprite_num, actor->s_pt.x, actor->s_pt.y);
// If actor's current intent is to speak, oblige him by
@ -604,7 +620,7 @@ int Actor::handleWalkIntent(ActorData *actor, WALKINTENT *a_walkint, int *comple
// Initialize walk intent
if (!a_walkint->wi_init) {
setPathNode(a_walkint, &actor->a_pt, &a_walkint->dst_pt, a_walkint->sem);
setDefaultAction(actor->actorId, ACTION_IDLE, ACTION_NONE);
setDefaultAction(actor->_actorId, ACTION_IDLE, ACTION_NONE);
a_walkint->wi_init = 1;
}

View file

@ -177,8 +177,9 @@ struct ACTORINTENT {
typedef Common::List<ACTORINTENT> ActorIntentList;
struct ActorData {
int index; // Actor index
uint16 actorId; // Actor id
bool _disabled;
int _index; // Actor index
uint16 _actorId; // Actor id
int name_i; // Actor's index in actor name string list
uint16 flags;
@ -219,8 +220,9 @@ struct ActorData {
ActorData() {
index = 0;
actorId = 0;
_disabled = false;
_index = 0;
_actorId = 0;
name_i = 0;
flags = 0;
frames = NULL;
@ -288,7 +290,7 @@ private:
ActorData *getActor(uint16 actorId);
int loadActorResources(ActorData * actor);
bool loadActorResources(ActorData * actor);
ActorOrderList::iterator getActorOrderIterator(const ActorData *actor);
void reorderActorUp(ActorData *actor);

View file

@ -112,12 +112,6 @@ GAME_RESOURCEDESC ITE_Resources = {
ITE_DIALOGUE_PANEL
};
GAME_RESOURCEDESC ITEMACDEMO_Resources = {
ITEMACDEMO_SCENE_LUT, // Scene lookup table RN
ITE_SCRIPT_LUT, // Script lookup table RN
ITE_COMMAND_PANEL,
ITE_DIALOGUE_PANEL
};
GAME_SOUNDINFO ITE_GameSound = {
GAME_SOUND_VOC, 0, 0, 0
@ -218,7 +212,7 @@ GAMEDESC GameDescs[] = {
320, 200,
137,
ITE_DEFAULT_SCENE,
&ITEMACDEMO_Resources,
&ITE_Resources,
ARRAYSIZE(ITEMACDEMO_GameFiles),
ITEMACDEMO_GameFiles,
ARRAYSIZE(ITEMACDEMO_GameFonts),
@ -593,7 +587,7 @@ int GAME_GetSceneInfo(GAME_SCENEDESC *gs_desc) {
assert(gs_desc != NULL);
gs_desc->first_scene = GameModule.gamedesc->gd_startscene;
gs_desc->scene_lut_rn = GameModule.gamedesc->gd_resource_desc->scene_lut_rn;
gs_desc->scene_lut_rn = RSC_ConvertID(GameModule.gamedesc->gd_resource_desc->scene_lut_rn);
return SUCCESS;
}

View file

@ -574,7 +574,7 @@ int Interface::handlePlayfieldClick(SURFACE *ds, const Point& imousePt) {
if (objectNum == -1) {
// Player clicked on empty spot - walk here regardless of verb
_vm->_actor->StoA(iactor_pt, imousePt);
_vm->_actor->walkTo(0, &iactor_pt, 0, NULL);
_vm->_actor->walkTo(1, &iactor_pt, 0, NULL);
return SUCCESS;
}
@ -593,7 +593,7 @@ int Interface::handlePlayfieldClick(SURFACE *ds, const Point& imousePt) {
} else {
// Not a normal scene object - walk to it as if it weren't there
_vm->_actor->StoA(iactor_pt, imousePt);
_vm->_actor->walkTo(0, &iactor_pt, 0, NULL);
_vm->_actor->walkTo(1, &iactor_pt, 0, NULL);
}
return SUCCESS;

View file

@ -126,12 +126,15 @@ int Scene::ITEStartProc() {
size_t i;
SCENE_QUEUE first_scene;
SCENE_QUEUE tempScene;
GAME_SCENEDESC gs_desc;
n_introscenes = ARRAYSIZE(ITE_IntroList);
for (i = 0; i < n_introscenes; i++) {
_vm->_scene->queueScene(&ITE_IntroList[i]);
tempScene = ITE_IntroList[i];
tempScene.scene_n = RSC_ConvertID(tempScene.scene_n);
_vm->_scene->queueScene(&tempScene);
}
GAME_GetSceneInfo(&gs_desc);

View file

@ -29,7 +29,6 @@
namespace Saga {
// Lookup tables
#define ITEMACDEMO_SCENE_LUT 1804
#define ITE_SCENE_LUT 1806
#define ITE_SCRIPT_LUT 216
@ -58,7 +57,6 @@ namespace Saga {
#define ITE_DEFAULT_PORTRAITS 125
// ITE Scene resource numbers
#define ITEMACDEMO_INTRO_ANIM_SCENE 1536
#define ITE_INTRO_ANIM_SCENE 1538
#define ITE_CAVE_SCENE_1 1542
#define ITE_CAVE_SCENE_2 1545

View file

@ -232,7 +232,7 @@ int Scene::nextScene() {
scene_qdat = queueIterator.operator->();
assert(scene_qdat != NULL);
loadScene(RSC_ConvertID(scene_qdat->scene_n), scene_qdat->load_flag, scene_qdat->scene_proc, scene_qdat->scene_desc, scene_qdat->fadeType);
loadScene(scene_qdat->scene_n, scene_qdat->load_flag, scene_qdat->scene_proc, scene_qdat->scene_desc, scene_qdat->fadeType);
return SUCCESS;
}

View file

@ -73,19 +73,22 @@ int Sprite::loadList(int resource_num, SPRITELIST **sprite_list_p) {
uint16 sprite_count;
uint16 i;
new_slist = (SPRITELIST *)malloc(sizeof *new_slist);
if (new_slist == NULL) {
return MEM;
}
if (RSC_LoadResource(_spriteContext, resource_num, &spritelist_data, &spritelist_len) != SUCCESS) {
return FAILURE;
}
if (spritelist_len == 0)
return FAILURE;
MemoryReadStreamEndian readS(spritelist_data, spritelist_len, IS_BIG_ENDIAN);
sprite_count = readS.readUint16();
new_slist = (SPRITELIST *)malloc(sizeof *new_slist);
if (new_slist == NULL) {
return MEM;
}
new_slist->sprite_count = sprite_count;
new_slist->offset_list = (SPRITELIST_OFFSET *)malloc(sprite_count * sizeof *new_slist->offset_list);