scummvm/saga/actionmap.cpp
Torbjörn Andersson 148872d1fd Replaced R_printf() with debug() and warning(). There are still a couple of
standard printf()s left, though.

svn-id: r13791
2004-05-05 13:05:45 +00:00

196 lines
4.7 KiB
C++

/* ScummVM - Scumm Interpreter
* Copyright (C) 2004 The ScummVM project
*
* The ReInherit Engine is (C)2000-2003 by Daniel Balsom.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
* $Header$
*
*/
/* Action map module */
#include "saga.h"
#include "reinherit.h"
#include "cvar_mod.h"
#include "console_mod.h"
#include "gfx_mod.h"
#include "actionmap_mod.h"
#include "actionmap.h"
namespace Saga {
static R_ACTIONMAP_INFO ActmapModule;
int ACTIONMAP_Register(void) {
CVAR_RegisterFunc(CF_action_info,
"action_info", NULL, R_CVAR_NONE, 0, 0);
return R_SUCCESS;
}
int ACTIONMAP_Init(void) {
debug(0, "ACTIONMAP Module: Initializing...");
ActmapModule.init = 1;
return R_SUCCESS;
}
int ACTIONMAP_Load(const byte * exmap_res, size_t exmap_res_len) {
// Loads exit map data from specified exit map resource
R_ACTIONMAP_ENTRY *exmap_entry;
R_POINT *exmap_pt_tbl;
int exit_ct;
int i, pt;
assert(ActmapModule.init);
assert(exmap_res != NULL);
MemoryReadStream *readS = new MemoryReadStream(exmap_res, exmap_res_len);
// Load exits
exit_ct = readS->readSint16LE();
if (exit_ct < 0) {
return R_FAILURE;
}
exmap_entry = (R_ACTIONMAP_ENTRY *)malloc(exit_ct * sizeof *exmap_entry);
if (exmap_entry == NULL) {
warning("Memory allocation failure");
return R_MEM;
}
for (i = 0; i < exit_ct; i++) {
exmap_entry[i].unknown00 = readS->readSint16LE();
exmap_entry[i].unknown02 = readS->readSint16LE();
exmap_entry[i].exit_scene = readS->readSint16LE();
exmap_entry[i].unknown06 = readS->readSint16LE();
exmap_entry[i].pt_count = readS->readSint16LE();
if (exmap_entry[i].pt_count < 0) {
free(exmap_entry);
return R_FAILURE;
}
exmap_pt_tbl = (R_POINT *)malloc(exmap_entry[i].pt_count * sizeof *exmap_pt_tbl);
if (exmap_pt_tbl == NULL) {
warning("Memory allocation failure");
return R_MEM;
}
for (pt = 0; pt < exmap_entry[i].pt_count; pt++) {
exmap_pt_tbl[pt].x = readS->readSint16LE();
exmap_pt_tbl[pt].y = readS->readSint16LE();
}
exmap_entry[i].pt_tbl = exmap_pt_tbl;
}
ActmapModule.exits_loaded = 1;
ActmapModule.n_exits = exit_ct;
ActmapModule.exits_tbl = exmap_entry;
ActmapModule.exmap_res = exmap_res;
ActmapModule.exmap_res_len = exmap_res_len;
return R_SUCCESS;
}
int ACTIONMAP_Free(void) {
// Frees the currently loaded exit map data
R_ACTIONMAP_ENTRY *exmap_entry;
int i;
if (!ActmapModule.exits_loaded) {
return R_SUCCESS;
}
for (i = 0; i < ActmapModule.n_exits; i++) {
exmap_entry = &ActmapModule.exits_tbl[i];
free(exmap_entry->pt_tbl);
}
free(ActmapModule.exits_tbl);
ActmapModule.exits_loaded = 0;
ActmapModule.exits_tbl = NULL;
ActmapModule.n_exits = 0;
return R_SUCCESS;
}
int ACTIONMAP_Shutdown(void) {
return R_SUCCESS;
}
int ACTIONMAP_Draw(R_SURFACE * ds, int color) {
int i;
assert(ActmapModule.init);
if (!ActmapModule.exits_loaded) {
return R_FAILURE;
}
for (i = 0; i < ActmapModule.n_exits; i++) {
if (ActmapModule.exits_tbl[i].pt_count == 2) {
GFX_DrawFrame(ds,
&ActmapModule.exits_tbl[i].pt_tbl[0],
&ActmapModule.exits_tbl[i].pt_tbl[1], color);
} else if (ActmapModule.exits_tbl[i].pt_count > 2) {
GFX_DrawPolyLine(ds, ActmapModule.exits_tbl[i].pt_tbl,
ActmapModule.exits_tbl[i].pt_count, color);
}
}
return R_SUCCESS;
}
void CF_action_info(int argc, char *argv[]) {
R_POINT *pt;
int i;
int pt_i;
(void)(argc);
(void)(argv);
if (!ActmapModule.exits_loaded) {
return;
}
CON_Print("%d exits loaded.\n", ActmapModule.n_exits);
for (i = 0; i < ActmapModule.n_exits; i++) {
CON_Print ("Action %d: Exit to: %d; Pts: %d; Unk0: %d Unk2: %d Scr_N: %d",
i, ActmapModule.exits_tbl[i].exit_scene,
ActmapModule.exits_tbl[i].pt_count,
ActmapModule.exits_tbl[i].unknown00,
ActmapModule.exits_tbl[i].unknown02,
ActmapModule.exits_tbl[i].unknown06);
for (pt_i = 0; pt_i < ActmapModule.exits_tbl[i].pt_count; pt_i++) {
pt = &ActmapModule.exits_tbl[i].pt_tbl[pt_i];
CON_Print(" pt: %d (%d, %d)", pt_i, pt->x, pt->y);
}
}
return;
}
} // End of namespace Saga