Formating names in source code
svn-id: r25101
This commit is contained in:
parent
994604527b
commit
b47eb95316
42 changed files with 2761 additions and 2796 deletions
|
@ -50,13 +50,13 @@
|
|||
|
||||
namespace Agi {
|
||||
|
||||
static uint32 g_tick_timer;
|
||||
static uint32 g_tickTimer;
|
||||
struct Mouse g_mouse;
|
||||
|
||||
#define key_enqueue(k) do { _key_queue[_key_queue_end++] = (k); \
|
||||
_key_queue_end %= KEY_QUEUE_SIZE; } while (0)
|
||||
#define key_dequeue(k) do { (k) = _key_queue[_key_queue_start++]; \
|
||||
_key_queue_start %= KEY_QUEUE_SIZE; } while (0)
|
||||
#define keyEnqueue(k) do { _keyQueue[_keyQueueEnd++] = (k); \
|
||||
_keyQueueEnd %= KEY_QUEUE_SIZE; } while (0)
|
||||
#define keyDequeue(k) do { (k) = _keyQueue[_keyQueueStart++]; \
|
||||
_keyQueueStart %= KEY_QUEUE_SIZE; } while (0)
|
||||
|
||||
void AgiEngine::processEvents() {
|
||||
OSystem::Event event;
|
||||
|
@ -72,14 +72,14 @@ void AgiEngine::processEvents() {
|
|||
case OSystem::EVENT_LBUTTONDOWN:
|
||||
key = BUTTON_LEFT;
|
||||
g_mouse.button = 1;
|
||||
key_enqueue(key);
|
||||
keyEnqueue(key);
|
||||
g_mouse.x = event.mouse.x;
|
||||
g_mouse.y = event.mouse.y;
|
||||
break;
|
||||
case OSystem::EVENT_RBUTTONDOWN:
|
||||
key = BUTTON_RIGHT;
|
||||
g_mouse.button = 2;
|
||||
key_enqueue(key);
|
||||
keyEnqueue(key);
|
||||
g_mouse.x = event.mouse.x;
|
||||
g_mouse.y = event.mouse.y;
|
||||
break;
|
||||
|
@ -92,8 +92,8 @@ void AgiEngine::processEvents() {
|
|||
g_mouse.button = 0;
|
||||
break;
|
||||
case OSystem::EVENT_KEYDOWN:
|
||||
_key_control = 0;
|
||||
_key_alt = 0;
|
||||
_keyControl = 0;
|
||||
_keyAlt = 0;
|
||||
|
||||
if (event.kbd.flags == OSystem::KBD_CTRL && event.kbd.keycode == 'd') {
|
||||
_console->attach();
|
||||
|
@ -101,10 +101,10 @@ void AgiEngine::processEvents() {
|
|||
}
|
||||
|
||||
if (event.kbd.flags & OSystem::KBD_CTRL)
|
||||
_key_control = 1;
|
||||
_keyControl = 1;
|
||||
|
||||
if (event.kbd.flags & OSystem::KBD_ALT)
|
||||
_key_alt = 1;
|
||||
_keyAlt = 1;
|
||||
|
||||
switch (key = event.kbd.keycode) {
|
||||
case 256 + 20: // left arrow
|
||||
|
@ -201,16 +201,16 @@ void AgiEngine::processEvents() {
|
|||
key = event.kbd.ascii;
|
||||
break;
|
||||
}
|
||||
if (_key_control)
|
||||
if (_keyControl)
|
||||
key = (key & ~0x20) - 0x40;
|
||||
else if (_key_alt)
|
||||
key = scancode_table[(key & ~0x20) - 0x41] << 8;
|
||||
else if (_keyAlt)
|
||||
key = scancodeTable[(key & ~0x20) - 0x41] << 8;
|
||||
else if (event.kbd.flags & OSystem::KBD_SHIFT)
|
||||
key = event.kbd.ascii;
|
||||
break;
|
||||
}
|
||||
if (key)
|
||||
key_enqueue(key);
|
||||
keyEnqueue(key);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
|
@ -220,73 +220,72 @@ void AgiEngine::processEvents() {
|
|||
|
||||
int AgiEngine::agiIsKeypressLow() {
|
||||
processEvents();
|
||||
return _key_queue_start != _key_queue_end;
|
||||
return _keyQueueStart != _keyQueueEnd;
|
||||
}
|
||||
|
||||
void AgiEngine::agiTimerLow() {
|
||||
static uint32 m = 0;
|
||||
uint32 dm;
|
||||
|
||||
if (g_tick_timer < m)
|
||||
if (g_tickTimer < m)
|
||||
m = 0;
|
||||
|
||||
while ((dm = g_tick_timer - m) < 5) {
|
||||
while ((dm = g_tickTimer - m) < 5) {
|
||||
processEvents();
|
||||
if (_console->isAttached())
|
||||
_console->onFrame();
|
||||
g_system->delayMillis(10);
|
||||
g_system->updateScreen();
|
||||
}
|
||||
m = g_tick_timer;
|
||||
m = g_tickTimer;
|
||||
}
|
||||
|
||||
int AgiEngine::agiGetKeypressLow() {
|
||||
int k;
|
||||
|
||||
while (_key_queue_start == _key_queue_end) /* block */
|
||||
while (_keyQueueStart == _keyQueueEnd) /* block */
|
||||
agiTimerLow();
|
||||
key_dequeue(k);
|
||||
keyDequeue(k);
|
||||
|
||||
return k;
|
||||
}
|
||||
|
||||
void AgiEngine::agiTimerFunctionLow(void *refCon) {
|
||||
g_tick_timer++;
|
||||
g_tickTimer++;
|
||||
}
|
||||
|
||||
void AgiEngine::clear_image_stack(void) {
|
||||
image_stack_pointer = 0;
|
||||
void AgiEngine::clearImageStack(void) {
|
||||
_imageStackPointer = 0;
|
||||
}
|
||||
|
||||
void AgiEngine::release_image_stack(void) {
|
||||
if (image_stack)
|
||||
free(image_stack);
|
||||
image_stack = NULL;
|
||||
stack_size = image_stack_pointer = 0;
|
||||
void AgiEngine::releaseImageStack(void) {
|
||||
if (_imageStack)
|
||||
free(_imageStack);
|
||||
_imageStack = NULL;
|
||||
_stackSize = 0;
|
||||
_imageStackPointer = NULL;
|
||||
}
|
||||
|
||||
void AgiEngine::record_image_stack_call(uint8 type, int16 p1, int16 p2, int16 p3,
|
||||
void AgiEngine::recordImageStackCall(uint8 type, int16 p1, int16 p2, int16 p3,
|
||||
int16 p4, int16 p5, int16 p6, int16 p7) {
|
||||
struct image_stack_element *pnew;
|
||||
struct ImageStackElement *pnew;
|
||||
|
||||
if (image_stack_pointer == stack_size) {
|
||||
if (stack_size == 0) { /* first call */
|
||||
image_stack = (struct image_stack_element *)
|
||||
malloc(INITIAL_IMAGE_STACK_SIZE * sizeof(struct image_stack_element));
|
||||
stack_size = INITIAL_IMAGE_STACK_SIZE;
|
||||
if (_imageStackPointer == _stackSize) {
|
||||
if (_stackSize == 0) { /* first call */
|
||||
_imageStack = (ImageStackElement *)malloc(INITIAL_IMAGE_STACK_SIZE * sizeof(ImageStackElement));
|
||||
_stackSize = INITIAL_IMAGE_STACK_SIZE;
|
||||
} else { /* has to grow */
|
||||
struct image_stack_element *new_stack;
|
||||
new_stack = (struct image_stack_element *)
|
||||
malloc(2 * stack_size * sizeof(struct image_stack_element));
|
||||
memcpy(new_stack, image_stack, stack_size * sizeof(struct image_stack_element));
|
||||
free(image_stack);
|
||||
image_stack = new_stack;
|
||||
stack_size *= 2;
|
||||
struct ImageStackElement *newStack;
|
||||
newStack = (ImageStackElement *)malloc(2 * _stackSize * sizeof(ImageStackElement));
|
||||
memcpy(newStack, _imageStack, _stackSize * sizeof(ImageStackElement));
|
||||
free(_imageStack);
|
||||
_imageStack = newStack;
|
||||
_stackSize *= 2;
|
||||
}
|
||||
}
|
||||
|
||||
pnew = &image_stack[image_stack_pointer];
|
||||
image_stack_pointer++;
|
||||
pnew = &_imageStack[_imageStackPointer];
|
||||
_imageStackPointer++;
|
||||
|
||||
pnew->type = type;
|
||||
pnew->parm1 = p1;
|
||||
|
@ -298,17 +297,17 @@ void AgiEngine::record_image_stack_call(uint8 type, int16 p1, int16 p2, int16 p3
|
|||
pnew->parm7 = p7;
|
||||
}
|
||||
|
||||
void AgiEngine::replay_image_stack_call(uint8 type, int16 p1, int16 p2, int16 p3,
|
||||
void AgiEngine::replayImageStackCall(uint8 type, int16 p1, int16 p2, int16 p3,
|
||||
int16 p4, int16 p5, int16 p6, int16 p7) {
|
||||
switch (type) {
|
||||
case ADD_PIC:
|
||||
debugC(8, kDebugLevelMain, "--- decoding picture %d ---", p1);
|
||||
agiLoadResource(rPICTURE, p1);
|
||||
_picture->decode_picture(p1, p2);
|
||||
_picture->decodePicture(p1, p2);
|
||||
break;
|
||||
case ADD_VIEW:
|
||||
agiLoadResource(rVIEW, p1);
|
||||
_sprites->add_to_pic(p1, p2, p3, p4, p5, p6, p7);
|
||||
_sprites->addToPic(p1, p2, p3, p4, p5, p6, p7);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -318,7 +317,7 @@ void AgiEngine::initPriTable() {
|
|||
|
||||
for (p = 1; p < 15; p++) {
|
||||
for (i = 0; i < 12; i++) {
|
||||
game.pri_table[y++] = p < 4 ? 4 : p;
|
||||
_game.priTable[y++] = p < 4 ? 4 : p;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -327,44 +326,44 @@ int AgiEngine::agiInit() {
|
|||
int ec, i;
|
||||
|
||||
debug(2, "initializing");
|
||||
debug(2, "game.ver = 0x%x", game.ver);
|
||||
debug(2, "game.ver = 0x%x", _game.ver);
|
||||
|
||||
/* reset all flags to false and all variables to 0 */
|
||||
for (i = 0; i < MAX_FLAGS; i++)
|
||||
game.flags[i] = 0;
|
||||
_game.flags[i] = 0;
|
||||
for (i = 0; i < MAX_VARS; i++)
|
||||
game.vars[i] = 0;
|
||||
_game.vars[i] = 0;
|
||||
|
||||
/* clear all resources and events */
|
||||
for (i = 0; i < MAX_DIRS; i++) {
|
||||
memset(&game.views[i], 0, sizeof(struct agi_view));
|
||||
memset(&game.pictures[i], 0, sizeof(struct agi_picture));
|
||||
memset(&game.logics[i], 0, sizeof(struct agi_logic));
|
||||
memset(&game.sounds[i], 0, sizeof(struct agi_sound));
|
||||
memset(&game.dir_view[i], 0, sizeof(struct agi_dir));
|
||||
memset(&game.dir_pic[i], 0, sizeof(struct agi_dir));
|
||||
memset(&game.dir_logic[i], 0, sizeof(struct agi_dir));
|
||||
memset(&game.dir_sound[i], 0, sizeof(struct agi_dir));
|
||||
memset(&_game.views[i], 0, sizeof(struct AgiView));
|
||||
memset(&_game.pictures[i], 0, sizeof(struct AgiPicture));
|
||||
memset(&_game.logics[i], 0, sizeof(struct AgiLogic));
|
||||
memset(&_game.sounds[i], 0, sizeof(struct AgiSound));
|
||||
memset(&_game.dirView[i], 0, sizeof(struct AgiDir));
|
||||
memset(&_game.dirPic[i], 0, sizeof(struct AgiDir));
|
||||
memset(&_game.dirLogic[i], 0, sizeof(struct AgiDir));
|
||||
memset(&_game.dirSound[i], 0, sizeof(struct AgiDir));
|
||||
}
|
||||
|
||||
/* clear view table */
|
||||
for (i = 0; i < MAX_VIEWTABLE; i++)
|
||||
memset(&game.view_table[i], 0, sizeof(struct vt_entry));
|
||||
memset(&_game.viewTable[i], 0, sizeof(struct VtEntry));
|
||||
|
||||
init_words();
|
||||
initWords();
|
||||
|
||||
if (!menu)
|
||||
menu = new Menu(this, _gfx, _picture);
|
||||
if (!_menu)
|
||||
_menu = new Menu(this, _gfx, _picture);
|
||||
|
||||
initPriTable();
|
||||
|
||||
/* clear string buffer */
|
||||
for (i = 0; i < MAX_STRINGS; i++)
|
||||
game.strings[i][0] = 0;
|
||||
_game.strings[i][0] = 0;
|
||||
|
||||
/* setup emulation */
|
||||
|
||||
switch (loader->getIntVersion() >> 12) {
|
||||
switch (_loader->getIntVersion() >> 12) {
|
||||
case 2:
|
||||
report("Emulating Sierra AGI v%x.%03x\n",
|
||||
(int)(agiGetRelease() >> 12) & 0xF,
|
||||
|
@ -377,30 +376,30 @@ int AgiEngine::agiInit() {
|
|||
break;
|
||||
}
|
||||
|
||||
game.game_flags |= opt.amigaMode ? ID_AMIGA : 0;
|
||||
game.game_flags |= opt.agdsMode ? ID_AGDS : 0;
|
||||
_game.gameFlags |= _opt.amigaMode ? ID_AMIGA : 0;
|
||||
_game.gameFlags |= _opt.agdsMode ? ID_AGDS : 0;
|
||||
|
||||
if (game.game_flags & ID_AMIGA)
|
||||
if (_game.gameFlags & ID_AMIGA)
|
||||
report("Amiga padded game detected.\n");
|
||||
|
||||
if (game.game_flags & ID_AGDS)
|
||||
if (_game.gameFlags & ID_AGDS)
|
||||
report("AGDS mode enabled.\n");
|
||||
|
||||
ec = loader->init(); /* load vol files, etc */
|
||||
ec = _loader->init(); /* load vol files, etc */
|
||||
|
||||
if (ec == err_OK)
|
||||
ec = loader->load_objects(OBJECTS);
|
||||
if (ec == errOK)
|
||||
ec = _loader->loadObjects(OBJECTS);
|
||||
|
||||
/* note: demogs has no words.tok */
|
||||
if (ec == err_OK)
|
||||
ec = loader->load_words(WORDS);
|
||||
if (ec == errOK)
|
||||
ec = _loader->loadWords(WORDS);
|
||||
|
||||
/* FIXME: load IIgs instruments and samples */
|
||||
/* load_instruments("kq.sys16"); */
|
||||
|
||||
/* Load logic 0 into memory */
|
||||
if (ec == err_OK)
|
||||
ec = loader->load_resource(rLOGIC, 0);
|
||||
if (ec == errOK)
|
||||
ec = _loader->loadResource(rLOGIC, 0);
|
||||
|
||||
return ec;
|
||||
}
|
||||
|
@ -414,76 +413,76 @@ void AgiEngine::agiUnloadResources() {
|
|||
|
||||
/* Make sure logic 0 is always loaded */
|
||||
for (i = 1; i < MAX_DIRS; i++) {
|
||||
loader->unload_resource(rLOGIC, i);
|
||||
_loader->unloadResource(rLOGIC, i);
|
||||
}
|
||||
for (i = 0; i < MAX_DIRS; i++) {
|
||||
loader->unload_resource(rVIEW, i);
|
||||
loader->unload_resource(rPICTURE, i);
|
||||
loader->unload_resource(rSOUND, i);
|
||||
_loader->unloadResource(rVIEW, i);
|
||||
_loader->unloadResource(rPICTURE, i);
|
||||
_loader->unloadResource(rSOUND, i);
|
||||
}
|
||||
}
|
||||
|
||||
int AgiEngine::agiDeinit() {
|
||||
int ec;
|
||||
|
||||
clean_input(); /* remove all words from memory */
|
||||
cleanInput(); /* remove all words from memory */
|
||||
agiUnloadResources(); /* unload resources in memory */
|
||||
loader->unload_resource(rLOGIC, 0);
|
||||
ec = loader->deinit();
|
||||
unload_objects();
|
||||
unload_words();
|
||||
_loader->unloadResource(rLOGIC, 0);
|
||||
ec = _loader->deinit();
|
||||
unloadObjects();
|
||||
unloadWords();
|
||||
|
||||
clear_image_stack();
|
||||
clearImageStack();
|
||||
|
||||
return ec;
|
||||
}
|
||||
|
||||
int AgiEngine::agiDetectGame() {
|
||||
int ec = err_OK;
|
||||
int ec = errOK;
|
||||
|
||||
assert(_gameDescription != NULL);
|
||||
|
||||
opt.amigaMode = ((_gameDescription->features & AGI_AMIGA) == AGI_AMIGA);
|
||||
opt.agdsMode = ((_gameDescription->features & AGI_AGDS) == AGI_AGDS);
|
||||
opt.agimouse = ((_gameDescription->features & AGI_MOUSE) == AGI_MOUSE);
|
||||
_opt.amigaMode = ((_gameDescription->features & AGI_AMIGA) == AGI_AMIGA);
|
||||
_opt.agdsMode = ((_gameDescription->features & AGI_AGDS) == AGI_AGDS);
|
||||
_opt.agimouse = ((_gameDescription->features & AGI_MOUSE) == AGI_MOUSE);
|
||||
|
||||
|
||||
if(_gameDescription->version <= 0x2999) {
|
||||
loader = new AgiLoader_v2(this);
|
||||
_loader = new AgiLoader_v2(this);
|
||||
} else {
|
||||
loader = new AgiLoader_v3(this);
|
||||
_loader = new AgiLoader_v3(this);
|
||||
}
|
||||
ec = loader->detect_game();
|
||||
ec = _loader->detectGame();
|
||||
|
||||
return ec;
|
||||
}
|
||||
|
||||
int AgiEngine::agiVersion() {
|
||||
return loader->version();
|
||||
return _loader->version();
|
||||
}
|
||||
|
||||
int AgiEngine::agiGetRelease() {
|
||||
return loader->getIntVersion();
|
||||
return _loader->getIntVersion();
|
||||
}
|
||||
|
||||
void AgiEngine::agiSetRelease(int n) {
|
||||
loader->setIntVersion(n);
|
||||
_loader->setIntVersion(n);
|
||||
}
|
||||
|
||||
int AgiEngine::agiLoadResource(int r, int n) {
|
||||
int i;
|
||||
|
||||
i = loader->load_resource(r, n);
|
||||
i = _loader->loadResource(r, n);
|
||||
#ifdef PATCH_LOGIC
|
||||
if (r == rLOGIC)
|
||||
patch_logic(n);
|
||||
patchLogic(n);
|
||||
#endif
|
||||
|
||||
return i;
|
||||
}
|
||||
|
||||
int AgiEngine::agiUnloadResource(int r, int n) {
|
||||
return loader->unload_resource(r, n);
|
||||
return _loader->unloadResource(r, n);
|
||||
}
|
||||
|
||||
struct GameSettings {
|
||||
|
@ -494,13 +493,11 @@ struct GameSettings {
|
|||
const char *detectname;
|
||||
};
|
||||
|
||||
static const GameSettings agi_settings[] = {
|
||||
static const GameSettings agiSettings[] = {
|
||||
{"agi", "AGI game", GID_AGI, MDT_ADLIB, "OBJECT"},
|
||||
{NULL, NULL, 0, 0, NULL}
|
||||
};
|
||||
|
||||
Common::RandomSource * rnd;
|
||||
|
||||
AgiEngine::AgiEngine(OSystem *syst) : Engine(syst) {
|
||||
|
||||
// Setup mixer
|
||||
|
@ -516,7 +513,7 @@ AgiEngine::AgiEngine(OSystem *syst) : Engine(syst) {
|
|||
const GameSettings *g;
|
||||
|
||||
const char *gameid = ConfMan.get("gameid").c_str();
|
||||
for (g = agi_settings; g->gameid; ++g)
|
||||
for (g = agiSettings; g->gameid; ++g)
|
||||
if (!scumm_stricmp(g->gameid, gameid))
|
||||
_gameId = g->id;
|
||||
|
||||
|
@ -534,38 +531,40 @@ AgiEngine::AgiEngine(OSystem *syst) : Engine(syst) {
|
|||
Common::addSpecialDebugLevel(kDebugLevelSavegame, "Savegame", "Saving & restoring game debugging");
|
||||
|
||||
|
||||
memset(&game, 0, sizeof(struct agi_game));
|
||||
memset(&_debug, 0, sizeof(struct agi_debug));
|
||||
memset(&_game, 0, sizeof(struct AgiGame));
|
||||
memset(&_debug, 0, sizeof(struct AgiDebug));
|
||||
memset(&g_mouse, 0, sizeof(struct Mouse));
|
||||
|
||||
game.clock_enabled = false;
|
||||
game.state = STATE_INIT;
|
||||
_game.clockEnabled = false;
|
||||
_game.state = STATE_INIT;
|
||||
|
||||
_key_queue_start = 0;
|
||||
_key_queue_end = 0;
|
||||
_keyQueueStart = 0;
|
||||
_keyQueueEnd = 0;
|
||||
|
||||
_key_control = 0;
|
||||
_key_alt = 0;
|
||||
_keyControl = 0;
|
||||
_keyAlt = 0;
|
||||
|
||||
g_tick_timer = 0;
|
||||
g_tickTimer = 0;
|
||||
|
||||
intobj = NULL;
|
||||
_intobj = NULL;
|
||||
|
||||
stack_size = 0;
|
||||
image_stack = NULL;
|
||||
image_stack_pointer = 0;
|
||||
_stackSize = 0;
|
||||
_imageStack = NULL;
|
||||
_imageStackPointer = 0;
|
||||
|
||||
menu = NULL;
|
||||
_menu = NULL;
|
||||
|
||||
last_sentence[0] = 0;
|
||||
memset(&stringdata, 0, sizeof(struct string_data));
|
||||
_lastSentence[0] = 0;
|
||||
memset(&_stringdata, 0, sizeof(struct StringData));
|
||||
|
||||
objects = NULL;
|
||||
_objects = NULL;
|
||||
|
||||
_oldMode = -1;
|
||||
}
|
||||
|
||||
void AgiEngine::initialize() {
|
||||
memset(&opt, 0, sizeof(struct agi_options));
|
||||
opt.gamerun = GAMERUN_RUNGAME;
|
||||
memset(&_opt, 0, sizeof(struct AgiOptions));
|
||||
_opt.gamerun = GAMERUN_RUNGAME;
|
||||
|
||||
// TODO: Some sound emulation modes do not fit our current music
|
||||
// drivers, and I'm not sure what they are. For now, they might
|
||||
|
@ -573,15 +572,15 @@ void AgiEngine::initialize() {
|
|||
|
||||
switch (MidiDriver::detectMusicDriver(MDT_PCSPK)) {
|
||||
case MD_PCSPK:
|
||||
opt.soundemu = SOUND_EMU_PC;
|
||||
_opt.soundemu = SOUND_EMU_PC;
|
||||
break;
|
||||
default:
|
||||
opt.soundemu = SOUND_EMU_NONE;
|
||||
_opt.soundemu = SOUND_EMU_NONE;
|
||||
break;
|
||||
}
|
||||
|
||||
if (ConfMan.hasKey("render_mode"))
|
||||
opt.renderMode = Common::parseRenderMode(ConfMan.get("render_mode").c_str());
|
||||
_opt.renderMode = Common::parseRenderMode(ConfMan.get("render_mode").c_str());
|
||||
|
||||
_console = new Console(this);
|
||||
_gfx = new GfxMgr(this);
|
||||
|
@ -591,27 +590,27 @@ void AgiEngine::initialize() {
|
|||
|
||||
_gfx->initMachine();
|
||||
|
||||
game.game_flags = 0;
|
||||
_game.gameFlags = 0;
|
||||
|
||||
game.color_fg = 15;
|
||||
game.color_bg = 0;
|
||||
_game.colorFg = 15;
|
||||
_game.colorBg = 0;
|
||||
|
||||
game.name[0] = '\0';
|
||||
_game.name[0] = '\0';
|
||||
|
||||
game.sbuf = (uint8 *)calloc(_WIDTH, _HEIGHT);
|
||||
_game.sbuf = (uint8 *)calloc(_WIDTH, _HEIGHT);
|
||||
|
||||
_gfx->initVideo();
|
||||
_sound->init_sound();
|
||||
_sound->initSound();
|
||||
|
||||
_timer->installTimerProc(agiTimerFunctionLow, 10 * 1000, NULL);
|
||||
|
||||
game.ver = -1; /* Don't display the conf file warning */
|
||||
_game.ver = -1; /* Don't display the conf file warning */
|
||||
|
||||
debugC(2, kDebugLevelMain, "Detect game");
|
||||
|
||||
|
||||
if (agiDetectGame() == err_OK) {
|
||||
game.state = STATE_LOADED;
|
||||
if (agiDetectGame() == errOK) {
|
||||
_game.state = STATE_LOADED;
|
||||
debugC(2, kDebugLevelMain, "game loaded");
|
||||
} else {
|
||||
report("Could not open AGI game");
|
||||
|
@ -622,13 +621,13 @@ void AgiEngine::initialize() {
|
|||
|
||||
AgiEngine::~AgiEngine() {
|
||||
agiDeinit();
|
||||
_sound->deinit_sound();
|
||||
_sound->deinitSound();
|
||||
delete _sound;
|
||||
_gfx->deinitVideo();
|
||||
delete _sprites;
|
||||
free(game.sbuf);
|
||||
free(_game.sbuf);
|
||||
_gfx->deinitMachine();
|
||||
delete rnd;
|
||||
delete _rnd;
|
||||
delete _console;
|
||||
}
|
||||
|
||||
|
@ -658,15 +657,15 @@ int AgiEngine::go() {
|
|||
CursorMan.showMouse(true);
|
||||
|
||||
report(" \nAGI engine %s is ready.\n", gScummVMVersion);
|
||||
if (game.state < STATE_LOADED) {
|
||||
if (_game.state < STATE_LOADED) {
|
||||
do {
|
||||
main_cycle();
|
||||
} while (game.state < STATE_RUNNING);
|
||||
if (game.ver < 0)
|
||||
game.ver = 0; /* Enable conf file warning */
|
||||
mainCycle();
|
||||
} while (_game.state < STATE_RUNNING);
|
||||
if (_game.ver < 0)
|
||||
_game.ver = 0; /* Enable conf file warning */
|
||||
}
|
||||
|
||||
run_game();
|
||||
runGame();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -99,7 +99,6 @@ typedef signed int Err;
|
|||
|
||||
namespace Agi {
|
||||
|
||||
|
||||
enum AgiGameType {
|
||||
GType_V2 = 1,
|
||||
GType_V3
|
||||
|
@ -120,29 +119,26 @@ struct AGIGameDescription {
|
|||
uint16 version;
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
enum {
|
||||
NO_GAMEDIR = 0,
|
||||
GAMEDIR
|
||||
};
|
||||
|
||||
enum AGIErrors {
|
||||
err_OK = 0,
|
||||
err_DoNothing,
|
||||
err_BadCLISwitch,
|
||||
err_InvalidAGIFile,
|
||||
err_BadFileOpen,
|
||||
err_NotEnoughMemory,
|
||||
err_BadResource,
|
||||
err_UnknownAGIVersion,
|
||||
err_RestartGame,
|
||||
err_NoLoopsInView,
|
||||
err_ViewDataError,
|
||||
err_NoGameList,
|
||||
errOK = 0,
|
||||
errDoNothing,
|
||||
errBadCLISwitch,
|
||||
errInvalidAGIFile,
|
||||
errBadFileOpen,
|
||||
errNotEnoughMemory,
|
||||
errBadResource,
|
||||
errUnknownAGIVersion,
|
||||
errRestartGame,
|
||||
errNoLoopsInView,
|
||||
errViewDataError,
|
||||
errNoGameList,
|
||||
|
||||
err_Unk = 127
|
||||
errUnk = 127
|
||||
};
|
||||
|
||||
enum kDebugLevels {
|
||||
|
@ -178,8 +174,8 @@ enum {
|
|||
lTEST_MODE
|
||||
};
|
||||
|
||||
struct game_id_list {
|
||||
struct game_id_list *next;
|
||||
struct gameIdList {
|
||||
gameIdList *next;
|
||||
uint32 version;
|
||||
uint32 crc;
|
||||
char *gName;
|
||||
|
@ -195,7 +191,7 @@ struct Mouse {
|
|||
/**
|
||||
* Command-line options.
|
||||
*/
|
||||
struct agi_options {
|
||||
struct AgiOptions {
|
||||
#define GAMERUN_RUNGAME 0
|
||||
#define GAMERUN_PICVIEW 1
|
||||
#define GAMERUN_WORDS 2
|
||||
|
@ -225,74 +221,74 @@ enum GameId {
|
|||
* AGI variables.
|
||||
*/
|
||||
enum {
|
||||
V_cur_room = 0, /* 0 */
|
||||
V_prev_room,
|
||||
V_border_touch_ego,
|
||||
V_score,
|
||||
V_border_code,
|
||||
V_border_touch_obj, /* 5 */
|
||||
V_ego_dir,
|
||||
V_max_score,
|
||||
V_free_pages,
|
||||
V_word_not_found,
|
||||
V_time_delay, /* 10 */
|
||||
V_seconds,
|
||||
V_minutes,
|
||||
V_hours,
|
||||
V_days,
|
||||
V_joystick_sensitivity, /* 15 */
|
||||
V_ego_view_resource,
|
||||
V_agi_err_code,
|
||||
V_agi_err_code_info,
|
||||
V_key,
|
||||
V_computer, /* 20 */
|
||||
V_window_reset,
|
||||
V_soundgen,
|
||||
V_volume,
|
||||
V_max_input_chars,
|
||||
V_sel_item, /* 25 */
|
||||
V_monitor
|
||||
vCurRoom = 0, /* 0 */
|
||||
vPrevRoom,
|
||||
vBorderTouchEgo,
|
||||
vScore,
|
||||
vBorderCode,
|
||||
vBorderTouchObj, /* 5 */
|
||||
vEgoDir,
|
||||
vMaxScore,
|
||||
vFreePages,
|
||||
vWordNotFound,
|
||||
vTimeDelay, /* 10 */
|
||||
vSeconds,
|
||||
vMinutes,
|
||||
vHours,
|
||||
vDays,
|
||||
vJoystickSensitivity, /* 15 */
|
||||
vEgoViewResource,
|
||||
vAgiErrCode,
|
||||
vAgiErrCodeInfo,
|
||||
vKey,
|
||||
vComputer, /* 20 */
|
||||
vWindowReset,
|
||||
vSoundgen,
|
||||
vVolume,
|
||||
vMaxInputChars,
|
||||
vSelItem, /* 25 */
|
||||
vMonitor
|
||||
};
|
||||
|
||||
/**
|
||||
* AGI flags
|
||||
*/
|
||||
enum {
|
||||
F_ego_water = 0, /* 0 */
|
||||
F_ego_invisible,
|
||||
F_entered_cli,
|
||||
F_ego_touched_p2,
|
||||
F_said_accepted_input,
|
||||
F_new_room_exec, /* 5 */
|
||||
F_restart_game,
|
||||
F_script_blocked,
|
||||
F_joy_sensitivity,
|
||||
F_sound_on,
|
||||
F_debugger_on, /* 10 */
|
||||
F_logic_zero_firsttime,
|
||||
F_restore_just_ran,
|
||||
F_status_selects_items,
|
||||
F_menus_work,
|
||||
F_output_mode, /* 15 */
|
||||
F_auto_restart
|
||||
fEgoWater = 0, /* 0 */
|
||||
fEgoInvisible,
|
||||
fEnteredCli,
|
||||
fEgoTouchedP2,
|
||||
fSaidAcceptedInput,
|
||||
fNewRoomExec, /* 5 */
|
||||
fRestartGame,
|
||||
fScriptBlocked,
|
||||
fJoySensitivity,
|
||||
fSoundOn,
|
||||
fDebuggerOn, /* 10 */
|
||||
fLogicZeroFirsttime,
|
||||
fRestoreJustRan,
|
||||
fStatusSelectsItems,
|
||||
fMenusWork,
|
||||
fOutputMode, /* 15 */
|
||||
fAutoRestart
|
||||
};
|
||||
|
||||
struct agi_event {
|
||||
struct AgiEvent {
|
||||
uint16 data;
|
||||
uint8 occured;
|
||||
};
|
||||
|
||||
struct agi_object {
|
||||
struct AgiObject {
|
||||
int location;
|
||||
char *name;
|
||||
};
|
||||
|
||||
struct agi_word {
|
||||
struct AgiWord {
|
||||
int id;
|
||||
char *word;
|
||||
};
|
||||
|
||||
struct agi_dir {
|
||||
struct AgiDir {
|
||||
uint8 volume;
|
||||
uint32 offset;
|
||||
uint32 len;
|
||||
|
@ -306,7 +302,7 @@ struct agi_dir {
|
|||
*/
|
||||
};
|
||||
|
||||
struct agi_block {
|
||||
struct AgiBlock {
|
||||
int active;
|
||||
int x1, y1;
|
||||
int x2, y2;
|
||||
|
@ -323,7 +319,7 @@ struct agi_block {
|
|||
* This structure contains all global data of an AGI game executed
|
||||
* by the interpreter.
|
||||
*/
|
||||
struct agi_game {
|
||||
struct AgiGame {
|
||||
#define STATE_INIT 0x00
|
||||
#define STATE_LOADED 0x01
|
||||
#define STATE_RUNNING 0x02
|
||||
|
@ -339,80 +335,80 @@ struct agi_game {
|
|||
|
||||
/* internal variables */
|
||||
int horizon; /**< horizon y coordinate */
|
||||
int line_status; /**< line number to put status on */
|
||||
int line_user_input; /**< line to put user input on */
|
||||
int line_min_print; /**< num lines to print on */
|
||||
int cursor_pos; /**< column where the input cursor is */
|
||||
uint8 input_buffer[40]; /**< buffer for user input */
|
||||
uint8 echo_buffer[40]; /**< buffer for echo.line */
|
||||
int lineStatus; /**< line number to put status on */
|
||||
int lineUserInput; /**< line to put user input on */
|
||||
int lineMinPrint; /**< num lines to print on */
|
||||
int cursorPos; /**< column where the input cursor is */
|
||||
uint8 inputBuffer[40]; /**< buffer for user input */
|
||||
uint8 echoBuffer[40]; /**< buffer for echo.line */
|
||||
int keypress;
|
||||
#define INPUT_NORMAL 0x01
|
||||
#define INPUT_GETSTRING 0x02
|
||||
#define INPUT_MENU 0x03
|
||||
#define INPUT_NONE 0x04
|
||||
int input_mode; /**< keyboard input mode */
|
||||
int input_enabled; /**< keyboard input enabled */
|
||||
int inputMode; /**< keyboard input mode */
|
||||
int inputEnabled; /**< keyboard input enabled */
|
||||
int lognum; /**< current logic number */
|
||||
|
||||
/* internal flags */
|
||||
int player_control; /**< player is in control */
|
||||
int quit_prog_now; /**< quit now */
|
||||
int status_line; /**< status line on/off */
|
||||
int clock_enabled; /**< clock is on/off */
|
||||
int exit_all_logics; /**< break cycle after new.room */
|
||||
int picture_shown; /**< show.pic has been issued */
|
||||
int has_prompt; /**< input prompt has been printed */
|
||||
int playerControl; /**< player is in control */
|
||||
int quitProgNow; /**< quit now */
|
||||
int statusLine; /**< status line on/off */
|
||||
int clockEnabled; /**< clock is on/off */
|
||||
int exitAllLogics; /**< break cycle after new.room */
|
||||
int pictureShown; /**< show.pic has been issued */
|
||||
int hasPrompt; /**< input prompt has been printed */
|
||||
#define ID_AGDS 0x00000001
|
||||
#define ID_AMIGA 0x00000002
|
||||
int game_flags; /**< agi options flags */
|
||||
int gameFlags; /**< agi options flags */
|
||||
|
||||
uint8 pri_table[_HEIGHT];/**< priority table */
|
||||
uint8 priTable[_HEIGHT];/**< priority table */
|
||||
|
||||
/* windows */
|
||||
uint32 msg_box_ticks; /**< timed message box tick counter */
|
||||
struct agi_block block;
|
||||
struct agi_block window;
|
||||
int has_window;
|
||||
uint32 msgBoxTicks; /**< timed message box tick counter */
|
||||
AgiBlock block;
|
||||
AgiBlock window;
|
||||
int hasWindow;
|
||||
|
||||
/* graphics & text */
|
||||
int gfx_mode;
|
||||
char cursor_char;
|
||||
unsigned int color_fg;
|
||||
unsigned int color_bg;
|
||||
int gfxMode;
|
||||
char cursorChar;
|
||||
unsigned int colorFg;
|
||||
unsigned int colorBg;
|
||||
uint8 *sbuf; /**< 160x168 AGI screen buffer */
|
||||
|
||||
/* player command line */
|
||||
struct agi_word ego_words[MAX_WORDS];
|
||||
int num_ego_words;
|
||||
AgiWord egoWords[MAX_WORDS];
|
||||
int numEgoWords;
|
||||
|
||||
unsigned int num_objects;
|
||||
unsigned int numObjects;
|
||||
|
||||
struct agi_event ev_keyp[MAX_DIRS]; /**< keyboard keypress events */
|
||||
AgiEvent evKeyp[MAX_DIRS]; /**< keyboard keypress events */
|
||||
char strings[MAX_STRINGS + 1][MAX_STRINGLEN]; /**< strings */
|
||||
|
||||
/* directory entries for resources */
|
||||
struct agi_dir dir_logic[MAX_DIRS];
|
||||
struct agi_dir dir_pic[MAX_DIRS];
|
||||
struct agi_dir dir_view[MAX_DIRS];
|
||||
struct agi_dir dir_sound[MAX_DIRS];
|
||||
AgiDir dirLogic[MAX_DIRS];
|
||||
AgiDir dirPic[MAX_DIRS];
|
||||
AgiDir dirView[MAX_DIRS];
|
||||
AgiDir dirSound[MAX_DIRS];
|
||||
|
||||
/* resources */
|
||||
struct agi_picture pictures[MAX_DIRS]; /**< AGI picture resources */
|
||||
struct agi_logic logics[MAX_DIRS]; /**< AGI logic resources */
|
||||
struct agi_view views[MAX_DIRS]; /**< AGI view resources */
|
||||
struct agi_sound sounds[MAX_DIRS]; /**< AGI sound resources */
|
||||
AgiPicture pictures[MAX_DIRS]; /**< AGI picture resources */
|
||||
AgiLogic logics[MAX_DIRS]; /**< AGI logic resources */
|
||||
AgiView views[MAX_DIRS]; /**< AGI view resources */
|
||||
AgiSound sounds[MAX_DIRS]; /**< AGI sound resources */
|
||||
|
||||
/* view table */
|
||||
struct vt_entry view_table[MAX_VIEWTABLE];
|
||||
struct VtEntry viewTable[MAX_VIEWTABLE];
|
||||
|
||||
int32 ver; /**< detected game version */
|
||||
|
||||
int simple_save; /**< select simple savegames */
|
||||
int simpleSave; /**< select simple savegames */
|
||||
};
|
||||
|
||||
class AgiLoader {
|
||||
private:
|
||||
int int_version;
|
||||
int intVersion;
|
||||
AgiEngine *_vm;
|
||||
|
||||
public:
|
||||
|
@ -422,11 +418,11 @@ public:
|
|||
|
||||
virtual int init() = 0;
|
||||
virtual int deinit() = 0;
|
||||
virtual int detect_game() = 0;
|
||||
virtual int load_resource(int, int) = 0;
|
||||
virtual int unload_resource(int, int) = 0;
|
||||
virtual int load_objects(const char *) = 0;
|
||||
virtual int load_words(const char *) = 0;
|
||||
virtual int detectGame() = 0;
|
||||
virtual int loadResource(int, int) = 0;
|
||||
virtual int unloadResource(int, int) = 0;
|
||||
virtual int loadObjects(const char *) = 0;
|
||||
virtual int loadWords(const char *) = 0;
|
||||
virtual int version() = 0;
|
||||
virtual void setIntVersion(int) = 0;
|
||||
virtual int getIntVersion() = 0;
|
||||
|
@ -434,26 +430,26 @@ public:
|
|||
|
||||
class AgiLoader_v2 : public AgiLoader {
|
||||
private:
|
||||
int int_version;
|
||||
int _intVersion;
|
||||
AgiEngine *_vm;
|
||||
|
||||
int load_dir(struct agi_dir *agid, const char *fname);
|
||||
uint8 *load_vol_res(struct agi_dir *agid);
|
||||
int loadDir(AgiDir *agid, const char *fname);
|
||||
uint8 *loadVolRes(AgiDir *agid);
|
||||
|
||||
public:
|
||||
|
||||
AgiLoader_v2(AgiEngine *vm) {
|
||||
_vm = vm;
|
||||
int_version = 0;
|
||||
_intVersion = 0;
|
||||
}
|
||||
|
||||
virtual int init();
|
||||
virtual int deinit();
|
||||
virtual int detect_game();
|
||||
virtual int load_resource(int, int);
|
||||
virtual int unload_resource(int, int);
|
||||
virtual int load_objects(const char *);
|
||||
virtual int load_words(const char *);
|
||||
virtual int detectGame();
|
||||
virtual int loadResource(int, int);
|
||||
virtual int unloadResource(int, int);
|
||||
virtual int loadObjects(const char *);
|
||||
virtual int loadWords(const char *);
|
||||
virtual int version();
|
||||
virtual void setIntVersion(int);
|
||||
virtual int getIntVersion();
|
||||
|
@ -461,26 +457,26 @@ public:
|
|||
|
||||
class AgiLoader_v3 : public AgiLoader {
|
||||
private:
|
||||
int int_version;
|
||||
int _intVersion;
|
||||
AgiEngine *_vm;
|
||||
|
||||
int load_dir(agi_dir *agid, Common::File *fp, uint32 offs, uint32 len);
|
||||
uint8 *load_vol_res(agi_dir *agid);
|
||||
int loadDir(AgiDir *agid, Common::File *fp, uint32 offs, uint32 len);
|
||||
uint8 *loadVolRes(AgiDir *agid);
|
||||
|
||||
public:
|
||||
|
||||
AgiLoader_v3(AgiEngine *vm) {
|
||||
_vm = vm;
|
||||
int_version = 0;
|
||||
_intVersion = 0;
|
||||
}
|
||||
|
||||
virtual int init();
|
||||
virtual int deinit();
|
||||
virtual int detect_game();
|
||||
virtual int load_resource(int, int);
|
||||
virtual int unload_resource(int, int);
|
||||
virtual int load_objects(const char *);
|
||||
virtual int load_words(const char *);
|
||||
virtual int detectGame();
|
||||
virtual int loadResource(int, int);
|
||||
virtual int unloadResource(int, int);
|
||||
virtual int loadObjects(const char *);
|
||||
virtual int loadWords(const char *);
|
||||
virtual int version();
|
||||
virtual void setIntVersion(int);
|
||||
virtual int getIntVersion();
|
||||
|
@ -493,7 +489,7 @@ class Menu;
|
|||
extern struct Mouse g_mouse;
|
||||
|
||||
/* Image stack support */
|
||||
struct image_stack_element {
|
||||
struct ImageStackElement {
|
||||
uint8 type;
|
||||
uint8 pad;
|
||||
int16 parm1;
|
||||
|
@ -505,7 +501,7 @@ struct image_stack_element {
|
|||
int16 parm7;
|
||||
};
|
||||
|
||||
struct string_data {
|
||||
struct StringData {
|
||||
int x;
|
||||
int y;
|
||||
int len;
|
||||
|
@ -538,23 +534,23 @@ public:
|
|||
|
||||
private:
|
||||
|
||||
int _key_queue[KEY_QUEUE_SIZE];
|
||||
int _key_queue_start;
|
||||
int _key_queue_end;
|
||||
int _keyQueue[KEY_QUEUE_SIZE];
|
||||
int _keyQueueStart;
|
||||
int _keyQueueEnd;
|
||||
|
||||
int check_priority(struct vt_entry *v);
|
||||
int check_collision(struct vt_entry *v);
|
||||
int check_position(struct vt_entry *v);
|
||||
int checkPriority(VtEntry *v);
|
||||
int checkCollision(VtEntry *v);
|
||||
int checkPosition(VtEntry *v);
|
||||
|
||||
uint32 match_version(uint32 crc);
|
||||
uint32 matchVersion(uint32 crc);
|
||||
|
||||
public:
|
||||
struct agi_game game;
|
||||
struct agi_object *objects; /* objects in the game */
|
||||
AgiGame _game;
|
||||
AgiObject *_objects; /* objects in the game */
|
||||
|
||||
struct string_data stringdata;
|
||||
StringData _stringdata;
|
||||
|
||||
AgiLoader *loader; /* loader */
|
||||
AgiLoader *_loader; /* loader */
|
||||
|
||||
Common::RandomSource *_rnd;
|
||||
const char *_savePath;
|
||||
|
@ -568,13 +564,14 @@ public:
|
|||
int loadGameDialog();
|
||||
int loadGameSimple();
|
||||
|
||||
volatile uint32 clock_count;
|
||||
volatile uint32 _clockCount;
|
||||
|
||||
uint8 *intobj;
|
||||
uint8 *_intobj;
|
||||
int _oldMode;
|
||||
|
||||
Menu* menu;
|
||||
Menu* _menu;
|
||||
|
||||
char last_sentence[40];
|
||||
char _lastSentence[40];
|
||||
|
||||
SpritesMgr *_sprites;
|
||||
GfxMgr *_gfx;
|
||||
|
@ -583,22 +580,22 @@ public:
|
|||
|
||||
#define INITIAL_IMAGE_STACK_SIZE 32
|
||||
|
||||
int stack_size;
|
||||
struct image_stack_element *image_stack;
|
||||
int image_stack_pointer;
|
||||
int _stackSize;
|
||||
ImageStackElement *_imageStack;
|
||||
int _imageStackPointer;
|
||||
|
||||
void clear_image_stack();
|
||||
void record_image_stack_call(uint8 type, int16 p1, int16 p2, int16 p3,
|
||||
void clearImageStack();
|
||||
void recordImageStackCall(uint8 type, int16 p1, int16 p2, int16 p3,
|
||||
int16 p4, int16 p5, int16 p6, int16 p7);
|
||||
void replay_image_stack_call(uint8 type, int16 p1, int16 p2, int16 p3,
|
||||
void replayImageStackCall(uint8 type, int16 p1, int16 p2, int16 p3,
|
||||
int16 p4, int16 p5, int16 p6, int16 p7);
|
||||
void release_image_stack();
|
||||
void releaseImageStack();
|
||||
|
||||
struct agi_debug _debug;
|
||||
struct agi_options opt;
|
||||
AgiDebug _debug;
|
||||
AgiOptions _opt;
|
||||
|
||||
int _key_control;
|
||||
int _key_alt;
|
||||
int _keyControl;
|
||||
int _keyAlt;
|
||||
|
||||
Console *_console;
|
||||
|
||||
|
@ -618,8 +615,8 @@ public:
|
|||
static void agiTimerFunctionLow(void *refCon);
|
||||
void initPriTable();
|
||||
|
||||
void new_input_mode(int);
|
||||
void old_input_mode();
|
||||
void newInputMode(int);
|
||||
void oldInputMode();
|
||||
|
||||
int getflag(int);
|
||||
void setflag(int, int);
|
||||
|
@ -627,27 +624,27 @@ public:
|
|||
int getvar(int);
|
||||
void setvar(int, int);
|
||||
void decrypt(uint8 * mem, int len);
|
||||
void release_sprites();
|
||||
int main_cycle();
|
||||
int view_pictures();
|
||||
int parse_cli(int, char **);
|
||||
int run_game();
|
||||
void releaseSprites();
|
||||
int mainCycle();
|
||||
int viewPictures();
|
||||
int parseCli(int, char **);
|
||||
int runGame();
|
||||
void inventory();
|
||||
void list_games();
|
||||
uint32 match_crc(uint32, char *, int);
|
||||
int v2id_game();
|
||||
int v3id_game();
|
||||
int v4id_game(uint32 ver);
|
||||
void update_timer();
|
||||
int get_app_dir(char *app_dir, unsigned int size);
|
||||
void listGames();
|
||||
uint32 matchCrc(uint32, char *, int);
|
||||
int v2IdGame();
|
||||
int v3IdGame();
|
||||
int v4IdGame(uint32 ver);
|
||||
void updateTimer();
|
||||
int getAppDir(char *appDir, unsigned int size);
|
||||
|
||||
int setup_v2_game(int ver, uint32 crc);
|
||||
int setup_v3_game(int ver, uint32 crc);
|
||||
int setupV2Game(int ver, uint32 crc);
|
||||
int setupV3Game(int ver, uint32 crc);
|
||||
|
||||
void new_room(int n);
|
||||
void reset_controllers();
|
||||
void interpret_cycle();
|
||||
int play_game();
|
||||
void newRoom(int n);
|
||||
void resetControllers();
|
||||
void interpretCycle();
|
||||
int playGame();
|
||||
|
||||
void printItem(int n, int fg, int bg);
|
||||
int findItem();
|
||||
|
@ -657,82 +654,82 @@ public:
|
|||
void processEvents();
|
||||
|
||||
// Objects
|
||||
int show_objects();
|
||||
int decode_objects(uint8 *mem, uint32 flen);
|
||||
int load_objects(const char *fname);
|
||||
int alloc_objects(int);
|
||||
void unload_objects();
|
||||
const char *object_name(unsigned int);
|
||||
int object_get_location(unsigned int);
|
||||
void object_set_location(unsigned int, int);
|
||||
int showObjects();
|
||||
int decodeObjects(uint8 *mem, uint32 flen);
|
||||
int loadObjects(const char *fname);
|
||||
int allocObjects(int);
|
||||
void unloadObjects();
|
||||
const char *objectName(unsigned int);
|
||||
int objectGetLocation(unsigned int);
|
||||
void objectSetLocation(unsigned int, int);
|
||||
|
||||
// Logic
|
||||
int decode_logic(int);
|
||||
void unload_logic(int);
|
||||
int run_logic(int);
|
||||
void patch_logic(int n);
|
||||
int decodeLogic(int);
|
||||
void unloadLogic(int);
|
||||
int runLogic(int);
|
||||
void patchLogic(int n);
|
||||
|
||||
void debug_console(int, int, const char *);
|
||||
int test_if_code(int);
|
||||
void execute_agi_command(uint8, uint8 *);
|
||||
void debugConsole(int, int, const char *);
|
||||
int testIfCode(int);
|
||||
void executeAgiCommand(uint8, uint8 *);
|
||||
|
||||
// View
|
||||
private:
|
||||
|
||||
void _set_cel(vt_entry *v, int n);
|
||||
void _set_loop(vt_entry *v, int n);
|
||||
void update_view(vt_entry *v);
|
||||
void lSetCel(VtEntry *v, int n);
|
||||
void lSetLoop(VtEntry *v, int n);
|
||||
void updateView(VtEntry *v);
|
||||
|
||||
public:
|
||||
|
||||
void set_cel(vt_entry *, int);
|
||||
void set_loop(vt_entry *, int);
|
||||
void set_view(vt_entry *, int);
|
||||
void start_update(vt_entry *);
|
||||
void stop_update(vt_entry *);
|
||||
void update_viewtable();
|
||||
void unload_view(int);
|
||||
int decode_view(int);
|
||||
void add_to_pic(int, int, int, int, int, int, int);
|
||||
void draw_obj(int);
|
||||
bool is_ego_view(const vt_entry *v);
|
||||
void setCel(VtEntry *, int);
|
||||
void setLoop(VtEntry *, int);
|
||||
void setView(VtEntry *, int);
|
||||
void startUpdate(VtEntry *);
|
||||
void stopUpdate(VtEntry *);
|
||||
void updateViewtable();
|
||||
void unloadView(int);
|
||||
int decodeView(int);
|
||||
void addToPic(int, int, int, int, int, int, int);
|
||||
void drawObj(int);
|
||||
bool isEgoView(const VtEntry *v);
|
||||
|
||||
// Words
|
||||
int show_words();
|
||||
int load_words(const char *);
|
||||
void unload_words();
|
||||
int find_word(char *word, int *flen);
|
||||
void dictionary_words(char *);
|
||||
int showWords();
|
||||
int loadWords(const char *);
|
||||
void unloadWords();
|
||||
int findWord(char *word, int *flen);
|
||||
void dictionaryWords(char *);
|
||||
|
||||
// Motion
|
||||
private:
|
||||
int check_step(int delta, int step);
|
||||
int check_block(int x, int y);
|
||||
void changepos(struct vt_entry *v);
|
||||
void motion_wander(struct vt_entry *v);
|
||||
void motion_followego(struct vt_entry *v);
|
||||
void motion_moveobj(struct vt_entry *v);
|
||||
void check_motion(struct vt_entry *v);
|
||||
int checkStep(int delta, int step);
|
||||
int checkBlock(int x, int y);
|
||||
void changePos(VtEntry *v);
|
||||
void motionWander(VtEntry *v);
|
||||
void motionFollowEgo(VtEntry *v);
|
||||
void motionMoveObj(VtEntry *v);
|
||||
void checkMotion(VtEntry *v);
|
||||
public:
|
||||
void check_all_motions();
|
||||
void move_obj(vt_entry *);
|
||||
void in_destination(vt_entry *);
|
||||
void fix_position(int);
|
||||
void update_position();
|
||||
int get_direction(int x0, int y0, int x, int y, int s);
|
||||
void checkAllMotions();
|
||||
void moveObj(VtEntry *);
|
||||
void inDestination(VtEntry *);
|
||||
void fixPosition(int);
|
||||
void updatePosition();
|
||||
int getDirection(int x0, int y0, int x, int y, int s);
|
||||
|
||||
// Keyboard
|
||||
void init_words();
|
||||
void clean_input();
|
||||
int do_poll_keyboard();
|
||||
void clean_keyboard();
|
||||
void handle_keys(int);
|
||||
void handle_getstring(int);
|
||||
int handle_controller(int);
|
||||
void get_string(int, int, int, int);
|
||||
uint16 agi_get_keypress();
|
||||
int wait_key();
|
||||
int wait_any_key();
|
||||
void initWords();
|
||||
void cleanInput();
|
||||
int doPollKeyboard();
|
||||
void cleanKeyboard();
|
||||
void handleKeys(int);
|
||||
void handleGetstring(int);
|
||||
int handleController(int);
|
||||
void getString(int, int, int, int);
|
||||
uint16 agiGetKeypress();
|
||||
int waitKey();
|
||||
int waitAnyKey();
|
||||
|
||||
// Text
|
||||
public:
|
||||
|
@ -740,27 +737,27 @@ public:
|
|||
|
||||
typedef Common::String String;
|
||||
|
||||
int message_box(const char *);
|
||||
int selection_box(const char *, const char **);
|
||||
void close_window(void);
|
||||
void draw_window(int, int, int, int);
|
||||
void print_text(const char *, int, int, int, int, int, int, bool checkerboard = false);
|
||||
void print_text_console(const char *, int, int, int, int, int);
|
||||
int messageBox(const char *);
|
||||
int selectionBox(const char *, const char **);
|
||||
void closeWindow(void);
|
||||
void drawWindow(int, int, int, int);
|
||||
void printText(const char *, int, int, int, int, int, int, bool checkerboard = false);
|
||||
void printTextConsole(const char *, int, int, int, int, int);
|
||||
int print(const char *, int, int, int);
|
||||
char *word_wrap_string(char *, int *);
|
||||
char *agi_sprintf(const char *);
|
||||
void write_status(void);
|
||||
void write_prompt(void);
|
||||
void clear_lines(int, int, int);
|
||||
void flush_lines(int, int);
|
||||
char *wordWrapString(char *, int *);
|
||||
char *agiSprintf(const char *);
|
||||
void writeStatus(void);
|
||||
void writePrompt(void);
|
||||
void clearLines(int, int, int);
|
||||
void flushLines(int, int);
|
||||
bool predictiveDialog(void);
|
||||
|
||||
private:
|
||||
void print_status(const char *message, ...);
|
||||
void print_text2(int l, const char *msg, int foff, int xoff, int yoff, int len, int fg, int bg, bool checkerboard = false);
|
||||
void blit_textbox(const char *p, int y, int x, int len);
|
||||
void erase_textbox();
|
||||
char *safe_strcat(char *s, const char *t);
|
||||
void printStatus(const char *message, ...);
|
||||
void printText2(int l, const char *msg, int foff, int xoff, int yoff, int len, int fg, int bg, bool checkerboard = false);
|
||||
void blitTextbox(const char *p, int y, int x, int len);
|
||||
void eraseTextbox();
|
||||
char *safeStrcat(char *s, const char *t);
|
||||
void loadDict(void);
|
||||
bool matchWord(void);
|
||||
|
||||
|
|
|
@ -34,25 +34,25 @@ int AgiLoader_v2::version() {
|
|||
}
|
||||
|
||||
void AgiLoader_v2::setIntVersion(int ver) {
|
||||
int_version = ver;
|
||||
_intVersion = ver;
|
||||
}
|
||||
|
||||
int AgiLoader_v2::getIntVersion() {
|
||||
return int_version;
|
||||
return _intVersion;
|
||||
}
|
||||
|
||||
int AgiLoader_v2::detect_game() {
|
||||
int AgiLoader_v2::detectGame() {
|
||||
if (!Common::File::exists(LOGDIR) ||
|
||||
!Common::File::exists(PICDIR) ||
|
||||
!Common::File::exists(SNDDIR) ||
|
||||
!Common::File::exists(VIEWDIR))
|
||||
return err_InvalidAGIFile;
|
||||
return errInvalidAGIFile;
|
||||
|
||||
int_version = 0x2917; /* setup for 2.917 */
|
||||
return _vm->v2id_game();
|
||||
_intVersion = 0x2917; /* setup for 2.917 */
|
||||
return _vm->v2IdGame();
|
||||
}
|
||||
|
||||
int AgiLoader_v2::load_dir(struct agi_dir *agid, const char *fname) {
|
||||
int AgiLoader_v2::loadDir(AgiDir *agid, const char *fname) {
|
||||
Common::File fp;
|
||||
uint8 *mem;
|
||||
uint32 flen;
|
||||
|
@ -61,7 +61,7 @@ int AgiLoader_v2::load_dir(struct agi_dir *agid, const char *fname) {
|
|||
report("Loading directory: %s\n", fname);
|
||||
|
||||
if (!fp.open(fname)) {
|
||||
return err_BadFileOpen;
|
||||
return errBadFileOpen;
|
||||
}
|
||||
|
||||
fp.seek(0, SEEK_END);
|
||||
|
@ -70,7 +70,7 @@ int AgiLoader_v2::load_dir(struct agi_dir *agid, const char *fname) {
|
|||
|
||||
if ((mem = (uint8 *)malloc(flen + 32)) == NULL) {
|
||||
fp.close();
|
||||
return err_NotEnoughMemory;
|
||||
return errNotEnoughMemory;
|
||||
}
|
||||
|
||||
fp.read(mem, flen);
|
||||
|
@ -91,57 +91,57 @@ int AgiLoader_v2::load_dir(struct agi_dir *agid, const char *fname) {
|
|||
free(mem);
|
||||
fp.close();
|
||||
|
||||
return err_OK;
|
||||
return errOK;
|
||||
}
|
||||
|
||||
int AgiLoader_v2::init() {
|
||||
int ec = err_OK;
|
||||
int ec = errOK;
|
||||
|
||||
/* load directory files */
|
||||
ec = load_dir(_vm->game.dir_logic, LOGDIR);
|
||||
if (ec == err_OK)
|
||||
ec = load_dir(_vm->game.dir_pic, PICDIR);
|
||||
if (ec == err_OK)
|
||||
ec = load_dir(_vm->game.dir_view, VIEWDIR);
|
||||
if (ec == err_OK)
|
||||
ec = load_dir(_vm->game.dir_sound, SNDDIR);
|
||||
ec = loadDir(_vm->_game.dirLogic, LOGDIR);
|
||||
if (ec == errOK)
|
||||
ec = loadDir(_vm->_game.dirPic, PICDIR);
|
||||
if (ec == errOK)
|
||||
ec = loadDir(_vm->_game.dirView, VIEWDIR);
|
||||
if (ec == errOK)
|
||||
ec = loadDir(_vm->_game.dirSound, SNDDIR);
|
||||
|
||||
return ec;
|
||||
}
|
||||
|
||||
int AgiLoader_v2::deinit() {
|
||||
int ec = err_OK;
|
||||
int ec = errOK;
|
||||
|
||||
#if 0
|
||||
/* unload words */
|
||||
agi_v2_unload_words();
|
||||
agiV2UnloadWords();
|
||||
|
||||
/* unload objects */
|
||||
agi_v2_unload_objects();
|
||||
agiV2UnloadObjects();
|
||||
#endif
|
||||
|
||||
return ec;
|
||||
}
|
||||
|
||||
int AgiLoader_v2::unload_resource(int t, int n) {
|
||||
int AgiLoader_v2::unloadResource(int t, int n) {
|
||||
debugC(3, kDebugLevelResources, "unload resource");
|
||||
|
||||
switch (t) {
|
||||
case rLOGIC:
|
||||
_vm->unload_logic(n);
|
||||
_vm->unloadLogic(n);
|
||||
break;
|
||||
case rPICTURE:
|
||||
_vm->_picture->unload_picture(n);
|
||||
_vm->_picture->unloadPicture(n);
|
||||
break;
|
||||
case rVIEW:
|
||||
_vm->unload_view(n);
|
||||
_vm->unloadView(n);
|
||||
break;
|
||||
case rSOUND:
|
||||
_vm->_sound->unload_sound(n);
|
||||
_vm->_sound->unloadSound(n);
|
||||
break;
|
||||
}
|
||||
|
||||
return err_OK;
|
||||
return errOK;
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -149,7 +149,7 @@ int AgiLoader_v2::unload_resource(int t, int n) {
|
|||
* if further decoding is required, it must be done by another
|
||||
* routine. NULL is returned if unsucsessfull.
|
||||
*/
|
||||
uint8 *AgiLoader_v2::load_vol_res(struct agi_dir *agid) {
|
||||
uint8 *AgiLoader_v2::loadVolRes(struct AgiDir *agid) {
|
||||
uint8 *data = NULL;
|
||||
char x[MAX_PATH], *path;
|
||||
Common::File fp;
|
||||
|
@ -176,7 +176,7 @@ uint8 *AgiLoader_v2::load_vol_res(struct agi_dir *agid) {
|
|||
/* FIXME: call some panic handler instead of
|
||||
* deiniting directly
|
||||
*/
|
||||
deinit_video_mode();
|
||||
deinitVideoMode();
|
||||
#endif
|
||||
report("Error: bad signature %04x\n", sig);
|
||||
// fprintf (stderr, "ACK! BAD RESOURCE!!!\n");
|
||||
|
@ -196,33 +196,33 @@ uint8 *AgiLoader_v2::load_vol_res(struct agi_dir *agid) {
|
|||
* Loads a resource into memory, a raw resource is loaded in
|
||||
* with above routine, then further decoded here.
|
||||
*/
|
||||
int AgiLoader_v2::load_resource(int t, int n) {
|
||||
int ec = err_OK;
|
||||
int AgiLoader_v2::loadResource(int t, int n) {
|
||||
int ec = errOK;
|
||||
uint8 *data = NULL;
|
||||
|
||||
debugC(3, kDebugLevelResources, "(t = %d, n = %d)", t, n);
|
||||
if (n > MAX_DIRS)
|
||||
return err_BadResource;
|
||||
return errBadResource;
|
||||
|
||||
switch (t) {
|
||||
case rLOGIC:
|
||||
if (~_vm->game.dir_logic[n].flags & RES_LOADED) {
|
||||
if (~_vm->_game.dirLogic[n].flags & RES_LOADED) {
|
||||
debugC(3, kDebugLevelResources, "loading logic resource %d", n);
|
||||
unload_resource(rLOGIC, n);
|
||||
unloadResource(rLOGIC, n);
|
||||
|
||||
/* load raw resource into data */
|
||||
data = load_vol_res(&_vm->game.dir_logic[n]);
|
||||
data = loadVolRes(&_vm->_game.dirLogic[n]);
|
||||
|
||||
_vm->game.logics[n].data = data;
|
||||
ec = data ? _vm->decode_logic(n) : err_BadResource;
|
||||
_vm->_game.logics[n].data = data;
|
||||
ec = data ? _vm->decodeLogic(n) : errBadResource;
|
||||
|
||||
_vm->game.logics[n].sIP = 2;
|
||||
_vm->_game.logics[n].sIP = 2;
|
||||
}
|
||||
|
||||
/* if logic was cached, we get here */
|
||||
/* reset code pointers incase it was cached */
|
||||
|
||||
_vm->game.logics[n].cIP = _vm->game.logics[n].sIP;
|
||||
_vm->_game.logics[n].cIP = _vm->_game.logics[n].sIP;
|
||||
break;
|
||||
case rPICTURE:
|
||||
/* if picture is currently NOT loaded *OR* cacheing is off,
|
||||
|
@ -230,34 +230,34 @@ int AgiLoader_v2::load_resource(int t, int n) {
|
|||
*/
|
||||
|
||||
debugC(3, kDebugLevelResources, "loading picture resource %d", n);
|
||||
if (_vm->game.dir_pic[n].flags & RES_LOADED)
|
||||
if (_vm->_game.dirPic[n].flags & RES_LOADED)
|
||||
break;
|
||||
|
||||
/* if loaded but not cached, unload it */
|
||||
/* if cached but not loaded, etc */
|
||||
unload_resource(rPICTURE, n);
|
||||
data = load_vol_res(&_vm->game.dir_pic[n]);
|
||||
unloadResource(rPICTURE, n);
|
||||
data = loadVolRes(&_vm->_game.dirPic[n]);
|
||||
|
||||
if (data != NULL) {
|
||||
_vm->game.pictures[n].rdata = data;
|
||||
_vm->game.dir_pic[n].flags |= RES_LOADED;
|
||||
_vm->_game.pictures[n].rdata = data;
|
||||
_vm->_game.dirPic[n].flags |= RES_LOADED;
|
||||
} else {
|
||||
ec = err_BadResource;
|
||||
ec = errBadResource;
|
||||
}
|
||||
break;
|
||||
case rSOUND:
|
||||
debugC(3, kDebugLevelResources, "loading sound resource %d", n);
|
||||
if (_vm->game.dir_sound[n].flags & RES_LOADED)
|
||||
if (_vm->_game.dirSound[n].flags & RES_LOADED)
|
||||
break;
|
||||
|
||||
data = load_vol_res(&_vm->game.dir_sound[n]);
|
||||
data = loadVolRes(&_vm->_game.dirSound[n]);
|
||||
|
||||
if (data != NULL) {
|
||||
_vm->game.sounds[n].rdata = data;
|
||||
_vm->game.dir_sound[n].flags |= RES_LOADED;
|
||||
_vm->_sound->decode_sound(n);
|
||||
_vm->_game.sounds[n].rdata = data;
|
||||
_vm->_game.dirSound[n].flags |= RES_LOADED;
|
||||
_vm->_sound->decodeSound(n);
|
||||
} else {
|
||||
ec = err_BadResource;
|
||||
ec = errBadResource;
|
||||
}
|
||||
break;
|
||||
case rVIEW:
|
||||
|
@ -266,34 +266,34 @@ int AgiLoader_v2::load_resource(int t, int n) {
|
|||
* can we cache the view? or must we reload it all
|
||||
* the time?
|
||||
*/
|
||||
if (_vm->game.dir_view[n].flags & RES_LOADED)
|
||||
if (_vm->_game.dirView[n].flags & RES_LOADED)
|
||||
break;
|
||||
|
||||
debugC(3, kDebugLevelResources, "loading view resource %d", n);
|
||||
unload_resource(rVIEW, n);
|
||||
data = load_vol_res(&_vm->game.dir_view[n]);
|
||||
unloadResource(rVIEW, n);
|
||||
data = loadVolRes(&_vm->_game.dirView[n]);
|
||||
if (data) {
|
||||
_vm->game.views[n].rdata = data;
|
||||
_vm->game.dir_view[n].flags |= RES_LOADED;
|
||||
ec = _vm->decode_view(n);
|
||||
_vm->_game.views[n].rdata = data;
|
||||
_vm->_game.dirView[n].flags |= RES_LOADED;
|
||||
ec = _vm->decodeView(n);
|
||||
} else {
|
||||
ec = err_BadResource;
|
||||
ec = errBadResource;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
ec = err_BadResource;
|
||||
ec = errBadResource;
|
||||
break;
|
||||
}
|
||||
|
||||
return ec;
|
||||
}
|
||||
|
||||
int AgiLoader_v2::load_objects(const char *fname) {
|
||||
return _vm->load_objects(fname);
|
||||
int AgiLoader_v2::loadObjects(const char *fname) {
|
||||
return _vm->loadObjects(fname);
|
||||
}
|
||||
|
||||
int AgiLoader_v2::load_words(const char *fname) {
|
||||
return _vm->load_words(fname);
|
||||
int AgiLoader_v2::loadWords(const char *fname) {
|
||||
return _vm->loadWords(fname);
|
||||
}
|
||||
|
||||
} // End of namespace Agi
|
||||
} // End of namespace Agi
|
||||
|
|
|
@ -37,24 +37,23 @@ int AgiLoader_v3::version() {
|
|||
}
|
||||
|
||||
void AgiLoader_v3::setIntVersion(int ver) {
|
||||
int_version = ver;
|
||||
_intVersion = ver;
|
||||
}
|
||||
|
||||
int AgiLoader_v3::getIntVersion() {
|
||||
return int_version;
|
||||
return _intVersion;
|
||||
}
|
||||
|
||||
int AgiLoader_v3::detect_game() {
|
||||
int ec = err_Unk;
|
||||
int AgiLoader_v3::detectGame() {
|
||||
int ec = errUnk;
|
||||
bool found = false;
|
||||
|
||||
FSList fslist;
|
||||
FilesystemNode dir(ConfMan.get("path"));
|
||||
|
||||
if (!dir.listDir(fslist, FilesystemNode::kListFilesOnly)) {
|
||||
warning("AgiEngine: invalid game path '%s'",
|
||||
dir.path().c_str());
|
||||
return err_InvalidAGIFile;
|
||||
warning("AgiEngine: invalid game path '%s'", dir.path().c_str());
|
||||
return errInvalidAGIFile;
|
||||
}
|
||||
|
||||
for (FSList::const_iterator file = fslist.begin();
|
||||
|
@ -63,10 +62,10 @@ int AgiLoader_v3::detect_game() {
|
|||
f.toLowercase();
|
||||
|
||||
if (f.hasSuffix("vol.0")) {
|
||||
strncpy(_vm->game.name, f.c_str(), f.size() > 5 ? f.size() - 5 : f.size());
|
||||
debugC(3, kDebugLevelMain, "game.name = %s", _vm->game.name);
|
||||
int_version = 0x3149; // setup for 3.002.149
|
||||
ec = _vm->v3id_game();
|
||||
strncpy(_vm->_game.name, f.c_str(), f.size() > 5 ? f.size() - 5 : f.size());
|
||||
debugC(3, kDebugLevelMain, "game.name = %s", _vm->_game.name);
|
||||
_intVersion = 0x3149; // setup for 3.002.149
|
||||
ec = _vm->v3IdGame();
|
||||
|
||||
found = true;
|
||||
}
|
||||
|
@ -74,20 +73,20 @@ int AgiLoader_v3::detect_game() {
|
|||
|
||||
if (!found) {
|
||||
debugC(3, kDebugLevelMain, "not found");
|
||||
ec = err_InvalidAGIFile;
|
||||
ec = errInvalidAGIFile;
|
||||
}
|
||||
|
||||
return ec;
|
||||
}
|
||||
|
||||
int AgiLoader_v3::load_dir(struct agi_dir *agid, Common::File *fp,
|
||||
int AgiLoader_v3::loadDir(struct AgiDir *agid, Common::File *fp,
|
||||
uint32 offs, uint32 len) {
|
||||
int ec = err_OK;
|
||||
int ec = errOK;
|
||||
uint8 *mem;
|
||||
unsigned int i;
|
||||
|
||||
fp->seek(offs, SEEK_SET);
|
||||
if ((mem = (uint8 *) malloc(len + 32)) != NULL) {
|
||||
if ((mem = (uint8 *)malloc(len + 32)) != NULL) {
|
||||
fp->read(mem, len);
|
||||
|
||||
/* set all directory resources to gone */
|
||||
|
@ -104,7 +103,7 @@ int AgiLoader_v3::load_dir(struct agi_dir *agid, Common::File *fp,
|
|||
|
||||
free(mem);
|
||||
} else {
|
||||
ec = err_NotEnoughMemory;
|
||||
ec = errNotEnoughMemory;
|
||||
}
|
||||
|
||||
return ec;
|
||||
|
@ -116,86 +115,85 @@ struct agi3vol {
|
|||
};
|
||||
|
||||
int AgiLoader_v3::init() {
|
||||
int ec = err_OK;
|
||||
struct agi3vol agi_vol3[4];
|
||||
int ec = errOK;
|
||||
struct agi3vol agiVol3[4];
|
||||
int i;
|
||||
uint16 xd[4];
|
||||
Common::File fp;
|
||||
Common::String path;
|
||||
|
||||
path = Common::String(_vm->game.name) + DIR_;
|
||||
path = Common::String(_vm->_game.name) + DIR_;
|
||||
|
||||
if (!fp.open(path)) {
|
||||
printf("Failed to open \"%s\"\n", path.c_str());
|
||||
return err_BadFileOpen;
|
||||
return errBadFileOpen;
|
||||
}
|
||||
/* build offset table for v3 directory format */
|
||||
fp.read(&xd, 8);
|
||||
fp.seek(0, SEEK_END);
|
||||
|
||||
for (i = 0; i < 4; i++)
|
||||
agi_vol3[i].sddr = READ_LE_UINT16((uint8 *) & xd[i]);
|
||||
agiVol3[i].sddr = READ_LE_UINT16((uint8 *) & xd[i]);
|
||||
|
||||
agi_vol3[0].len = agi_vol3[1].sddr - agi_vol3[0].sddr;
|
||||
agi_vol3[1].len = agi_vol3[2].sddr - agi_vol3[1].sddr;
|
||||
agi_vol3[2].len = agi_vol3[3].sddr - agi_vol3[2].sddr;
|
||||
agi_vol3[3].len = fp.pos() - agi_vol3[3].sddr;
|
||||
agiVol3[0].len = agiVol3[1].sddr - agiVol3[0].sddr;
|
||||
agiVol3[1].len = agiVol3[2].sddr - agiVol3[1].sddr;
|
||||
agiVol3[2].len = agiVol3[3].sddr - agiVol3[2].sddr;
|
||||
agiVol3[3].len = fp.pos() - agiVol3[3].sddr;
|
||||
|
||||
if (agi_vol3[3].len > 256 * 3)
|
||||
agi_vol3[3].len = 256 * 3;
|
||||
if (agiVol3[3].len > 256 * 3)
|
||||
agiVol3[3].len = 256 * 3;
|
||||
|
||||
fp.seek(0, SEEK_SET);
|
||||
|
||||
/* read in directory files */
|
||||
ec = load_dir(_vm->game.dir_logic, &fp, agi_vol3[0].sddr,
|
||||
agi_vol3[0].len);
|
||||
ec = loadDir(_vm->_game.dirLogic, &fp, agiVol3[0].sddr, agiVol3[0].len);
|
||||
|
||||
if (ec == err_OK) {
|
||||
ec = load_dir(_vm->game.dir_pic, &fp, agi_vol3[1].sddr, agi_vol3[1].len);
|
||||
if (ec == errOK) {
|
||||
ec = loadDir(_vm->_game.dirPic, &fp, agiVol3[1].sddr, agiVol3[1].len);
|
||||
}
|
||||
|
||||
if (ec == err_OK) {
|
||||
ec = load_dir(_vm->game.dir_view, &fp, agi_vol3[2].sddr, agi_vol3[2].len);
|
||||
if (ec == errOK) {
|
||||
ec = loadDir(_vm->_game.dirView, &fp, agiVol3[2].sddr, agiVol3[2].len);
|
||||
}
|
||||
|
||||
if (ec == err_OK) {
|
||||
ec = load_dir(_vm->game.dir_sound, &fp, agi_vol3[3].sddr, agi_vol3[3].len);
|
||||
if (ec == errOK) {
|
||||
ec = loadDir(_vm->_game.dirSound, &fp, agiVol3[3].sddr, agiVol3[3].len);
|
||||
}
|
||||
|
||||
return ec;
|
||||
}
|
||||
|
||||
int AgiLoader_v3::deinit() {
|
||||
int ec = err_OK;
|
||||
int ec = errOK;
|
||||
|
||||
#if 0
|
||||
/* unload words */
|
||||
agi_v3_unload_words();
|
||||
agiV3UnloadWords();
|
||||
|
||||
/* unload objects */
|
||||
agi_v3_unload_objects();
|
||||
agiV3UnloadObjects();
|
||||
#endif
|
||||
|
||||
return ec;
|
||||
}
|
||||
|
||||
int AgiLoader_v3::unload_resource(int t, int n) {
|
||||
int AgiLoader_v3::unloadResource(int t, int n) {
|
||||
switch (t) {
|
||||
case rLOGIC:
|
||||
_vm->unload_logic(n);
|
||||
_vm->unloadLogic(n);
|
||||
break;
|
||||
case rPICTURE:
|
||||
_vm->_picture->unload_picture(n);
|
||||
_vm->_picture->unloadPicture(n);
|
||||
break;
|
||||
case rVIEW:
|
||||
_vm->unload_view(n);
|
||||
_vm->unloadView(n);
|
||||
break;
|
||||
case rSOUND:
|
||||
_vm->_sound->unload_sound(n);
|
||||
_vm->_sound->unloadSound(n);
|
||||
break;
|
||||
}
|
||||
|
||||
return err_OK;
|
||||
return errOK;
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -205,15 +203,15 @@ int AgiLoader_v3::unload_resource(int t, int n) {
|
|||
*
|
||||
* NULL is returned if unsucsessful.
|
||||
*/
|
||||
uint8 *AgiLoader_v3::load_vol_res(struct agi_dir *agid) {
|
||||
uint8 *AgiLoader_v3::loadVolRes(AgiDir *agid) {
|
||||
char x[MAX_PATH];
|
||||
uint8 *data = NULL, *comp_buffer;
|
||||
uint8 *data = NULL, *compBuffer;
|
||||
Common::File fp;
|
||||
Common::String path;
|
||||
|
||||
debugC(3, kDebugLevelResources, "(%p)", (void *)agid);
|
||||
sprintf(x, "vol.%i", agid->volume);
|
||||
path = Common::String(_vm->game.name) + x;
|
||||
path = Common::String(_vm->_game.name) + x;
|
||||
|
||||
if (agid->offset != _EMPTY && fp.open(path)) {
|
||||
fp.seek(agid->offset, SEEK_SET);
|
||||
|
@ -222,7 +220,7 @@ uint8 *AgiLoader_v3::load_vol_res(struct agi_dir *agid) {
|
|||
if (READ_BE_UINT16((uint8 *) x) != 0x1234) {
|
||||
#if 0
|
||||
/* FIXME */
|
||||
deinit_video_mode();
|
||||
deinitVideoMode();
|
||||
#endif
|
||||
debugC(3, kDebugLevelResources, "path = %s", path.c_str());
|
||||
debugC(3, kDebugLevelResources, "offset = %d", agid->offset);
|
||||
|
@ -235,12 +233,12 @@ uint8 *AgiLoader_v3::load_vol_res(struct agi_dir *agid) {
|
|||
agid->len = READ_LE_UINT16((uint8 *) x + 3); /* uncompressed size */
|
||||
agid->clen = READ_LE_UINT16((uint8 *) x + 5); /* compressed len */
|
||||
|
||||
comp_buffer = (uint8 *)calloc(1, agid->clen + 32);
|
||||
fp.read(comp_buffer, agid->clen);
|
||||
compBuffer = (uint8 *)calloc(1, agid->clen + 32);
|
||||
fp.read(compBuffer, agid->clen);
|
||||
|
||||
if (x[2] & 0x80 || agid->len == agid->clen) {
|
||||
/* do not decompress */
|
||||
data = comp_buffer;
|
||||
data = compBuffer;
|
||||
|
||||
#if 0
|
||||
/* CM: added to avoid problems in
|
||||
|
@ -255,8 +253,8 @@ uint8 *AgiLoader_v3::load_vol_res(struct agi_dir *agid) {
|
|||
} else {
|
||||
/* it is compressed */
|
||||
data = (uint8 *)calloc(1, agid->len + 32);
|
||||
LZW_expand(comp_buffer, data, agid->len);
|
||||
free(comp_buffer);
|
||||
lzwExpand(compBuffer, data, agid->len);
|
||||
free(compBuffer);
|
||||
agid->flags |= RES_COMPRESSED;
|
||||
}
|
||||
|
||||
|
@ -274,74 +272,74 @@ uint8 *AgiLoader_v3::load_vol_res(struct agi_dir *agid) {
|
|||
* Loads a resource into memory, a raw resource is loaded in
|
||||
* with above routine, then further decoded here.
|
||||
*/
|
||||
int AgiLoader_v3::load_resource(int t, int n) {
|
||||
int ec = err_OK;
|
||||
int AgiLoader_v3::loadResource(int t, int n) {
|
||||
int ec = errOK;
|
||||
uint8 *data = NULL;
|
||||
|
||||
if (n > MAX_DIRS)
|
||||
return err_BadResource;
|
||||
return errBadResource;
|
||||
|
||||
switch (t) {
|
||||
case rLOGIC:
|
||||
/* load resource into memory, decrypt messages at the end
|
||||
* and build the message list (if logic is in memory)
|
||||
*/
|
||||
if (~_vm->game.dir_logic[n].flags & RES_LOADED) {
|
||||
if (~_vm->_game.dirLogic[n].flags & RES_LOADED) {
|
||||
/* if logic is already in memory, unload it */
|
||||
unload_resource(rLOGIC, n);
|
||||
unloadResource(rLOGIC, n);
|
||||
|
||||
/* load raw resource into data */
|
||||
data = load_vol_res(&_vm->game.dir_logic[n]);
|
||||
_vm->game.logics[n].data = data;
|
||||
data = loadVolRes(&_vm->_game.dirLogic[n]);
|
||||
_vm->_game.logics[n].data = data;
|
||||
|
||||
/* uncompressed logic files need to be decrypted */
|
||||
if (data != NULL) {
|
||||
/* resloaded flag gets set by decode logic */
|
||||
/* needed to build string table */
|
||||
ec = _vm->decode_logic(n);
|
||||
_vm->game.logics[n].sIP = 2;
|
||||
ec = _vm->decodeLogic(n);
|
||||
_vm->_game.logics[n].sIP = 2;
|
||||
} else {
|
||||
ec = err_BadResource;
|
||||
ec = errBadResource;
|
||||
}
|
||||
|
||||
/*logics[n].sIP=2; *//* saved IP = 2 */
|
||||
/*logics[n].cIP=2; *//* current IP = 2 */
|
||||
|
||||
_vm->game.logics[n].cIP = _vm->game.logics[n].sIP;
|
||||
_vm->_game.logics[n].cIP = _vm->_game.logics[n].sIP;
|
||||
}
|
||||
|
||||
/* if logic was cached, we get here */
|
||||
/* reset code pointers incase it was cached */
|
||||
|
||||
_vm->game.logics[n].cIP = _vm->game.logics[n].sIP;
|
||||
_vm->_game.logics[n].cIP = _vm->_game.logics[n].sIP;
|
||||
break;
|
||||
case rPICTURE:
|
||||
/* if picture is currently NOT loaded *OR* cacheing is off,
|
||||
* unload the resource (caching==off) and reload it
|
||||
*/
|
||||
if (~_vm->game.dir_pic[n].flags & RES_LOADED) {
|
||||
unload_resource(rPICTURE, n);
|
||||
data = load_vol_res(&_vm->game.dir_pic[n]);
|
||||
if (~_vm->_game.dirPic[n].flags & RES_LOADED) {
|
||||
unloadResource(rPICTURE, n);
|
||||
data = loadVolRes(&_vm->_game.dirPic[n]);
|
||||
if (data != NULL) {
|
||||
data = _vm->_picture->convert_v3_pic(data, _vm->game.dir_pic[n].len);
|
||||
_vm->game.pictures[n].rdata = data;
|
||||
_vm->game.dir_pic[n].flags |= RES_LOADED;
|
||||
data = _vm->_picture->convertV3Pic(data, _vm->_game.dirPic[n].len);
|
||||
_vm->_game.pictures[n].rdata = data;
|
||||
_vm->_game.dirPic[n].flags |= RES_LOADED;
|
||||
} else {
|
||||
ec = err_BadResource;
|
||||
ec = errBadResource;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case rSOUND:
|
||||
if (_vm->game.dir_sound[n].flags & RES_LOADED)
|
||||
if (_vm->_game.dirSound[n].flags & RES_LOADED)
|
||||
break;
|
||||
|
||||
data = load_vol_res(&_vm->game.dir_sound[n]);
|
||||
data = loadVolRes(&_vm->_game.dirSound[n]);
|
||||
if (data != NULL) {
|
||||
_vm->game.sounds[n].rdata = data;
|
||||
_vm->game.dir_sound[n].flags |= RES_LOADED;
|
||||
_vm->_sound->decode_sound(n);
|
||||
_vm->_game.sounds[n].rdata = data;
|
||||
_vm->_game.dirSound[n].flags |= RES_LOADED;
|
||||
_vm->_sound->decodeSound(n);
|
||||
} else {
|
||||
ec = err_BadResource;
|
||||
ec = errBadResource;
|
||||
}
|
||||
break;
|
||||
case rVIEW:
|
||||
|
@ -350,33 +348,33 @@ int AgiLoader_v3::load_resource(int t, int n) {
|
|||
* cache the view? or must we reload it all the time?
|
||||
*/
|
||||
/* load a raw view from a VOL file into data */
|
||||
if (_vm->game.dir_view[n].flags & RES_LOADED)
|
||||
if (_vm->_game.dirView[n].flags & RES_LOADED)
|
||||
break;
|
||||
|
||||
unload_resource(rVIEW, n);
|
||||
data = load_vol_res(&_vm->game.dir_view[n]);
|
||||
unloadResource(rVIEW, n);
|
||||
data = loadVolRes(&_vm->_game.dirView[n]);
|
||||
if (data != NULL) {
|
||||
_vm->game.views[n].rdata = data;
|
||||
_vm->game.dir_view[n].flags |= RES_LOADED;
|
||||
ec = _vm->decode_view(n);
|
||||
_vm->_game.views[n].rdata = data;
|
||||
_vm->_game.dirView[n].flags |= RES_LOADED;
|
||||
ec = _vm->decodeView(n);
|
||||
} else {
|
||||
ec = err_BadResource;
|
||||
ec = errBadResource;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
ec = err_BadResource;
|
||||
ec = errBadResource;
|
||||
break;
|
||||
}
|
||||
|
||||
return ec;
|
||||
}
|
||||
|
||||
int AgiLoader_v3::load_objects(const char *fname) {
|
||||
return _vm->load_objects(fname);
|
||||
int AgiLoader_v3::loadObjects(const char *fname) {
|
||||
return _vm->loadObjects(fname);
|
||||
}
|
||||
|
||||
int AgiLoader_v3::load_words(const char *fname) {
|
||||
return _vm->load_words(fname);
|
||||
int AgiLoader_v3::loadWords(const char *fname) {
|
||||
return _vm->loadWords(fname);
|
||||
}
|
||||
|
||||
} // End of namespace Agi
|
||||
} // End of namespace Agi
|
||||
|
|
|
@ -27,22 +27,22 @@
|
|||
|
||||
namespace Agi {
|
||||
|
||||
int AgiEngine::check_position(struct vt_entry *v) {
|
||||
debugC(4, kDebugLevelSprites, "check position @ %d, %d", v->x_pos, v->y_pos);
|
||||
int AgiEngine::checkPosition(struct VtEntry *v) {
|
||||
debugC(4, kDebugLevelSprites, "check position @ %d, %d", v->xPos, v->yPos);
|
||||
|
||||
if (v->x_pos < 0 ||
|
||||
v->x_pos + v->x_size > _WIDTH ||
|
||||
v->y_pos - v->y_size + 1 < 0 ||
|
||||
v->y_pos >= _HEIGHT ||
|
||||
((~v->flags & IGNORE_HORIZON) && v->y_pos <= game.horizon)) {
|
||||
if (v->xPos < 0 ||
|
||||
v->xPos + v->xSize > _WIDTH ||
|
||||
v->yPos - v->ySize + 1 < 0 ||
|
||||
v->yPos >= _HEIGHT ||
|
||||
((~v->flags & IGNORE_HORIZON) && v->yPos <= _game.horizon)) {
|
||||
debugC(4, kDebugLevelSprites, "check position failed: x=%d, y=%d, h=%d, w=%d",
|
||||
v->x_pos, v->y_pos, v->x_size, v->y_size);
|
||||
v->xPos, v->yPos, v->xSize, v->ySize);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* MH1 needs this, but it breaks LSL1 */
|
||||
if (agiGetRelease() >= 0x3000) {
|
||||
if (v->y_pos < v->y_size)
|
||||
if (v->yPos < v->ySize)
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -52,13 +52,13 @@ int AgiEngine::check_position(struct vt_entry *v) {
|
|||
/**
|
||||
* Check if there's another object on the way
|
||||
*/
|
||||
int AgiEngine::check_collision(struct vt_entry *v) {
|
||||
struct vt_entry *u;
|
||||
int AgiEngine::checkCollision(struct VtEntry *v) {
|
||||
struct VtEntry *u;
|
||||
|
||||
if (v->flags & IGNORE_OBJECTS)
|
||||
return 0;
|
||||
|
||||
for (u = game.view_table; u < &game.view_table[MAX_VIEWTABLE]; u++) {
|
||||
for (u = _game.viewTable; u < &_game.viewTable[MAX_VIEWTABLE]; u++) {
|
||||
if ((u->flags & (ANIMATED | DRAWN)) != (ANIMATED | DRAWN))
|
||||
continue;
|
||||
|
||||
|
@ -70,17 +70,16 @@ int AgiEngine::check_collision(struct vt_entry *v) {
|
|||
continue;
|
||||
|
||||
/* No horizontal overlap, check next */
|
||||
if (v->x_pos + v->x_size < u->x_pos ||
|
||||
v->x_pos > u->x_pos + u->x_size)
|
||||
if (v->xPos + v->xSize < u->xPos || v->xPos > u->xPos + u->xSize)
|
||||
continue;
|
||||
|
||||
/* Same y, return error! */
|
||||
if (v->y_pos == u->y_pos)
|
||||
if (v->yPos == u->yPos)
|
||||
goto return_1;
|
||||
|
||||
/* Crossed the baseline, return error! */
|
||||
if ((v->y_pos > u->y_pos && v->y_pos2 < u->y_pos2) ||
|
||||
(v->y_pos < u->y_pos && v->y_pos2 > u->y_pos2)) {
|
||||
if ((v->yPos > u->yPos && v->yPos2 < u->yPos2) ||
|
||||
(v->yPos < u->yPos && v->yPos2 > u->yPos2)) {
|
||||
goto return_1;
|
||||
}
|
||||
}
|
||||
|
@ -92,13 +91,13 @@ int AgiEngine::check_collision(struct vt_entry *v) {
|
|||
return 1;
|
||||
}
|
||||
|
||||
int AgiEngine::check_priority(struct vt_entry *v) {
|
||||
int AgiEngine::checkPriority(VtEntry *v) {
|
||||
int i, trigger, water, pass, pri;
|
||||
uint8 *p0;
|
||||
|
||||
if (~v->flags & FIXED_PRIORITY) {
|
||||
/* Priority bands */
|
||||
v->priority = game.pri_table[v->y_pos];
|
||||
v->priority = _game.priTable[v->yPos];
|
||||
}
|
||||
|
||||
trigger = 0;
|
||||
|
@ -106,13 +105,13 @@ int AgiEngine::check_priority(struct vt_entry *v) {
|
|||
pass = 1;
|
||||
|
||||
if (v->priority == 0x0f)
|
||||
goto _check_ego;
|
||||
goto check_ego;
|
||||
|
||||
water = 1;
|
||||
|
||||
p0 = &game.sbuf[v->x_pos + v->y_pos * _WIDTH];
|
||||
p0 = &_game.sbuf[v->xPos + v->yPos * _WIDTH];
|
||||
|
||||
for (i = 0; i < v->x_size; i++, p0++) {
|
||||
for (i = 0; i < v->xSize; i++, p0++) {
|
||||
pri = *p0 >> 4;
|
||||
|
||||
if (pri == 0) { /* unconditional black. no go at all! */
|
||||
|
@ -148,10 +147,10 @@ int AgiEngine::check_priority(struct vt_entry *v) {
|
|||
pass = 0;
|
||||
}
|
||||
|
||||
_check_ego:
|
||||
check_ego:
|
||||
if (v->entry == 0) {
|
||||
setflag(F_ego_touched_p2, trigger ? true : false);
|
||||
setflag(F_ego_water, water ? true : false);
|
||||
setflag(fEgoTouchedP2, trigger ? true : false);
|
||||
setflag(fEgoWater, water ? true : false);
|
||||
}
|
||||
|
||||
return pass;
|
||||
|
@ -168,35 +167,35 @@ int AgiEngine::check_priority(struct vt_entry *v) {
|
|||
* new position must be valid according to the sprite positioning
|
||||
* rules, otherwise the previous position will be kept.
|
||||
*/
|
||||
void AgiEngine::update_position() {
|
||||
struct vt_entry *v;
|
||||
int x, y, old_x, old_y, border;
|
||||
void AgiEngine::updatePosition() {
|
||||
struct VtEntry *v;
|
||||
int x, y, oldX, oldY, border;
|
||||
|
||||
game.vars[V_border_code] = 0;
|
||||
game.vars[V_border_touch_ego] = 0;
|
||||
game.vars[V_border_touch_obj] = 0;
|
||||
_game.vars[vBorderCode] = 0;
|
||||
_game.vars[vBorderTouchEgo] = 0;
|
||||
_game.vars[vBorderTouchObj] = 0;
|
||||
|
||||
for (v = game.view_table; v < &game.view_table[MAX_VIEWTABLE]; v++) {
|
||||
for (v = _game.viewTable; v < &_game.viewTable[MAX_VIEWTABLE]; v++) {
|
||||
if ((v->flags & (ANIMATED | UPDATE | DRAWN)) != (ANIMATED | UPDATE | DRAWN)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (v->step_time_count != 0) {
|
||||
if (--v->step_time_count != 0)
|
||||
if (v->stepTimeCount != 0) {
|
||||
if (--v->stepTimeCount != 0)
|
||||
continue;
|
||||
}
|
||||
|
||||
v->step_time_count = v->step_time;
|
||||
v->stepTimeCount = v->stepTime;
|
||||
|
||||
x = old_x = v->x_pos;
|
||||
y = old_y = v->y_pos;
|
||||
x = oldX = v->xPos;
|
||||
y = oldY = v->yPos;
|
||||
|
||||
/* If object has moved, update its position */
|
||||
if (~v->flags & UPDATE_POS) {
|
||||
int dx[9] = { 0, 0, 1, 1, 1, 0, -1, -1, -1 };
|
||||
int dy[9] = { 0, -1, -1, 0, 1, 1, 1, 0, -1 };
|
||||
x += v->step_size * dx[v->direction];
|
||||
y += v->step_size * dy[v->direction];
|
||||
x += v->stepSize * dx[v->direction];
|
||||
y += v->stepSize * dy[v->direction];
|
||||
}
|
||||
|
||||
/* Now check if it touched the borders */
|
||||
|
@ -213,43 +212,43 @@ void AgiEngine::update_position() {
|
|||
/* Extra test to walk west clicking the mouse */
|
||||
x = 0;
|
||||
border = 4;
|
||||
} else if (x + v->x_size > _WIDTH) {
|
||||
x = _WIDTH - v->x_size;
|
||||
} else if (x + v->xSize > _WIDTH) {
|
||||
x = _WIDTH - v->xSize;
|
||||
border = 2;
|
||||
}
|
||||
|
||||
/* Check top/bottom borders. */
|
||||
if (y - v->y_size + 1 < 0) {
|
||||
y = v->y_size - 1;
|
||||
if (y - v->ySize + 1 < 0) {
|
||||
y = v->ySize - 1;
|
||||
border = 1;
|
||||
} else if (y > _HEIGHT - 1) {
|
||||
y = _HEIGHT - 1;
|
||||
border = 3;
|
||||
} else if ((~v->flags & IGNORE_HORIZON) && y <= game.horizon) {
|
||||
debugC(4, kDebugLevelSprites, "y = %d, horizon = %d", y, game.horizon);
|
||||
y = game.horizon + 1;
|
||||
} else if ((~v->flags & IGNORE_HORIZON) && y <= _game.horizon) {
|
||||
debugC(4, kDebugLevelSprites, "y = %d, horizon = %d", y, _game.horizon);
|
||||
y = _game.horizon + 1;
|
||||
border = 1;
|
||||
}
|
||||
|
||||
/* Test new position. rollback if test fails */
|
||||
v->x_pos = x;
|
||||
v->y_pos = y;
|
||||
if (check_collision(v) || !check_priority(v)) {
|
||||
v->x_pos = old_x;
|
||||
v->y_pos = old_y;
|
||||
v->xPos = x;
|
||||
v->yPos = y;
|
||||
if (checkCollision(v) || !checkPriority(v)) {
|
||||
v->xPos = oldX;
|
||||
v->yPos = oldY;
|
||||
border = 0;
|
||||
fix_position(v->entry);
|
||||
fixPosition(v->entry);
|
||||
}
|
||||
|
||||
if (border != 0) {
|
||||
if (is_ego_view(v)) {
|
||||
game.vars[V_border_touch_ego] = border;
|
||||
if (isEgoView(v)) {
|
||||
_game.vars[vBorderTouchEgo] = border;
|
||||
} else {
|
||||
game.vars[V_border_code] = v->entry;
|
||||
game.vars[V_border_touch_obj] = border;
|
||||
_game.vars[vBorderCode] = v->entry;
|
||||
_game.vars[vBorderTouchObj] = border;
|
||||
}
|
||||
if (v->motion == MOTION_MOVE_OBJ) {
|
||||
in_destination(v);
|
||||
inDestination(v);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -266,42 +265,42 @@ void AgiEngine::update_position() {
|
|||
*
|
||||
* @param n view table entry number
|
||||
*/
|
||||
void AgiEngine::fix_position(int n) {
|
||||
struct vt_entry *v = &game.view_table[n];
|
||||
void AgiEngine::fixPosition(int n) {
|
||||
VtEntry *v = &_game.viewTable[n];
|
||||
int count, dir, size;
|
||||
|
||||
debugC(4, kDebugLevelSprites, "adjusting view table entry #%d (%d,%d)", n, v->x_pos, v->y_pos);
|
||||
debugC(4, kDebugLevelSprites, "adjusting view table entry #%d (%d,%d)", n, v->xPos, v->yPos);
|
||||
|
||||
/* test horizon */
|
||||
if ((~v->flags & IGNORE_HORIZON) && v->y_pos <= game.horizon)
|
||||
v->y_pos = game.horizon + 1;
|
||||
if ((~v->flags & IGNORE_HORIZON) && v->yPos <= _game.horizon)
|
||||
v->yPos = _game.horizon + 1;
|
||||
|
||||
dir = 0;
|
||||
count = size = 1;
|
||||
|
||||
while (!check_position(v) || check_collision(v) || !check_priority(v)) {
|
||||
while (!checkPosition(v) || checkCollision(v) || !checkPriority(v)) {
|
||||
switch (dir) {
|
||||
case 0: /* west */
|
||||
v->x_pos--;
|
||||
v->xPos--;
|
||||
if (--count)
|
||||
continue;
|
||||
dir = 1;
|
||||
break;
|
||||
case 1: /* south */
|
||||
v->y_pos++;
|
||||
v->yPos++;
|
||||
if (--count)
|
||||
continue;
|
||||
dir = 2;
|
||||
size++;
|
||||
break;
|
||||
case 2: /* east */
|
||||
v->x_pos++;
|
||||
v->xPos++;
|
||||
if (--count)
|
||||
continue;
|
||||
dir = 3;
|
||||
break;
|
||||
case 3: /* north */
|
||||
v->y_pos--;
|
||||
v->yPos--;
|
||||
if (--count)
|
||||
continue;
|
||||
dir = 0;
|
||||
|
@ -312,7 +311,7 @@ void AgiEngine::fix_position(int n) {
|
|||
count = size;
|
||||
}
|
||||
|
||||
debugC(4, kDebugLevelSprites, "view table entry #%d position adjusted to (%d,%d)", n, v->x_pos, v->y_pos);
|
||||
debugC(4, kDebugLevelSprites, "view table entry #%d position adjusted to (%d,%d)", n, v->xPos, v->yPos);
|
||||
}
|
||||
|
||||
} // End of namespace Agi
|
||||
|
|
|
@ -94,17 +94,17 @@ bool Console::Cmd_SetObj(int argc, const char **argv) {
|
|||
}
|
||||
int p1 = (int)atoi(argv[1]);
|
||||
int p2 = (int)atoi(argv[2]);
|
||||
_vm->object_set_location(p1, p2);
|
||||
_vm->objectSetLocation(p1, p2);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool Console::Cmd_RunOpcode(int argc, const char **argv) {
|
||||
for (int i = 0; logic_names_cmd[i].name; i++) {
|
||||
if (!strcmp(argv[1], logic_names_cmd[i].name)) {
|
||||
for (int i = 0; logicNamesCmd[i].name; i++) {
|
||||
if (!strcmp(argv[1], logicNamesCmd[i].name)) {
|
||||
uint8 p[16];
|
||||
if ((argc - 2)!= logic_names_cmd[i].num_args) {
|
||||
DebugPrintf("AGI command wants %d arguments\n", logic_names_cmd[i].num_args);
|
||||
if ((argc - 2)!= logicNamesCmd[i].numArgs) {
|
||||
DebugPrintf("AGI command wants %d arguments\n", logicNamesCmd[i].numArgs);
|
||||
return 0;
|
||||
}
|
||||
p[0] = argv[2] ? (char)strtoul(argv[2], NULL, 0) : 0;
|
||||
|
@ -113,9 +113,9 @@ bool Console::Cmd_RunOpcode(int argc, const char **argv) {
|
|||
p[3] = argv[5] ? (char)strtoul(argv[5], NULL, 0) : 0;
|
||||
p[4] = argv[6] ? (char)strtoul(argv[6], NULL, 0) : 0;
|
||||
|
||||
debugC(5, kDebugLevelMain, "Opcode: %s %s %s %s", logic_names_cmd[i].name, argv[1], argv[2], argv[3]);
|
||||
debugC(5, kDebugLevelMain, "Opcode: %s %s %s %s", logicNamesCmd[i].name, argv[1], argv[2], argv[3]);
|
||||
|
||||
_vm->execute_agi_command(i, p);
|
||||
_vm->executeAgiCommand(i, p);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
@ -177,8 +177,8 @@ bool Console::Cmd_Vars(int argc, const char **argv) {
|
|||
bool Console::Cmd_Objs(int argc, const char **argv) {
|
||||
unsigned int i;
|
||||
|
||||
for (i = 0; i < _vm->game.num_objects; i++) {
|
||||
DebugPrintf("%3d]%-24s(%3d)\n", i, _vm->object_name(i), _vm->object_get_location(i));
|
||||
for (i = 0; i < _vm->_game.numObjects; i++) {
|
||||
DebugPrintf("%3d]%-24s(%3d)\n", i, _vm->objectName(i), _vm->objectGetLocation(i));
|
||||
}
|
||||
|
||||
return true;
|
||||
|
@ -243,4 +243,4 @@ bool Console::Cmd_Cont(int argc, const char **argv) {
|
|||
return true;
|
||||
}
|
||||
|
||||
} // End of namespace Agi
|
||||
} // End of namespace Agi
|
||||
|
|
|
@ -31,7 +31,7 @@ namespace Agi {
|
|||
|
||||
class AgiEngine;
|
||||
|
||||
struct agi_debug {
|
||||
struct AgiDebug {
|
||||
int enabled;
|
||||
int opcodes;
|
||||
int logic0;
|
||||
|
@ -73,4 +73,4 @@ private:
|
|||
|
||||
} // End of namespace Agi
|
||||
|
||||
#endif /* AGI_CONSOLE_H */
|
||||
#endif /* AGI_CONSOLE_H */
|
||||
|
|
|
@ -38,108 +38,108 @@ namespace Agi {
|
|||
* This function is called when ego enters a new room.
|
||||
* @param n room number
|
||||
*/
|
||||
void AgiEngine::new_room(int n) {
|
||||
struct vt_entry *v;
|
||||
void AgiEngine::newRoom(int n) {
|
||||
VtEntry *v;
|
||||
int i;
|
||||
|
||||
debugC(4, kDebugLevelMain, "*** room %d ***", n);
|
||||
_sound->stop_sound();
|
||||
_sound->stopSound();
|
||||
|
||||
i = 0;
|
||||
for (v = game.view_table; v < &game.view_table[MAX_VIEWTABLE]; v++) {
|
||||
for (v = _game.viewTable; v < &_game.viewTable[MAX_VIEWTABLE]; v++) {
|
||||
v->entry = i++;
|
||||
v->flags &= ~(ANIMATED | DRAWN);
|
||||
v->flags |= UPDATE;
|
||||
v->step_time = 1;
|
||||
v->step_time_count = 1;
|
||||
v->cycle_time = 1;
|
||||
v->cycle_time_count = 1;
|
||||
v->step_size = 1;
|
||||
v->stepTime = 1;
|
||||
v->stepTimeCount = 1;
|
||||
v->cycleTime = 1;
|
||||
v->cycleTimeCount = 1;
|
||||
v->stepSize = 1;
|
||||
}
|
||||
agiUnloadResources();
|
||||
|
||||
game.player_control = true;
|
||||
game.block.active = false;
|
||||
game.horizon = 36;
|
||||
game.vars[V_prev_room] = game.vars[V_cur_room];
|
||||
game.vars[V_cur_room] = n;
|
||||
game.vars[V_border_touch_obj] = 0;
|
||||
game.vars[V_border_code] = 0;
|
||||
game.vars[V_ego_view_resource] = game.view_table[0].current_view;
|
||||
_game.playerControl = true;
|
||||
_game.block.active = false;
|
||||
_game.horizon = 36;
|
||||
_game.vars[vPrevRoom] = _game.vars[vCurRoom];
|
||||
_game.vars[vCurRoom] = n;
|
||||
_game.vars[vBorderTouchObj] = 0;
|
||||
_game.vars[vBorderCode] = 0;
|
||||
_game.vars[vEgoViewResource] = _game.viewTable[0].currentView;
|
||||
|
||||
agiLoadResource(rLOGIC, n);
|
||||
|
||||
/* Reposition ego in the new room */
|
||||
switch (game.vars[V_border_touch_ego]) {
|
||||
switch (_game.vars[vBorderTouchEgo]) {
|
||||
case 1:
|
||||
game.view_table[0].y_pos = _HEIGHT - 1;
|
||||
_game.viewTable[0].yPos = _HEIGHT - 1;
|
||||
break;
|
||||
case 2:
|
||||
game.view_table[0].x_pos = 0;
|
||||
_game.viewTable[0].xPos = 0;
|
||||
break;
|
||||
case 3:
|
||||
game.view_table[0].y_pos = HORIZON + 1;
|
||||
_game.viewTable[0].yPos = HORIZON + 1;
|
||||
break;
|
||||
case 4:
|
||||
game.view_table[0].x_pos = _WIDTH - game.view_table[0].x_size;
|
||||
_game.viewTable[0].xPos = _WIDTH - _game.viewTable[0].xSize;
|
||||
break;
|
||||
}
|
||||
|
||||
game.vars[V_border_touch_ego] = 0;
|
||||
setflag(F_new_room_exec, true);
|
||||
_game.vars[vBorderTouchEgo] = 0;
|
||||
setflag(fNewRoomExec, true);
|
||||
|
||||
game.exit_all_logics = true;
|
||||
_game.exitAllLogics = true;
|
||||
|
||||
write_status();
|
||||
write_prompt();
|
||||
writeStatus();
|
||||
writePrompt();
|
||||
}
|
||||
|
||||
void AgiEngine::reset_controllers() {
|
||||
void AgiEngine::resetControllers() {
|
||||
int i;
|
||||
|
||||
for (i = 0; i < MAX_DIRS; i++) {
|
||||
game.ev_keyp[i].occured = false;
|
||||
_game.evKeyp[i].occured = false;
|
||||
}
|
||||
}
|
||||
|
||||
void AgiEngine::interpret_cycle() {
|
||||
int old_sound, old_score;
|
||||
void AgiEngine::interpretCycle() {
|
||||
int oldSound, oldScore;
|
||||
|
||||
if (game.player_control)
|
||||
game.vars[V_ego_dir] = game.view_table[0].direction;
|
||||
if (_game.playerControl)
|
||||
_game.vars[vEgoDir] = _game.viewTable[0].direction;
|
||||
else
|
||||
game.view_table[0].direction = game.vars[V_ego_dir];
|
||||
_game.viewTable[0].direction = _game.vars[vEgoDir];
|
||||
|
||||
check_all_motions();
|
||||
checkAllMotions();
|
||||
|
||||
old_score = game.vars[V_score];
|
||||
old_sound = getflag(F_sound_on);
|
||||
oldScore = _game.vars[vScore];
|
||||
oldSound = getflag(fSoundOn);
|
||||
|
||||
game.exit_all_logics = false;
|
||||
while (run_logic(0) == 0 && !game.quit_prog_now) {
|
||||
game.vars[V_word_not_found] = 0;
|
||||
game.vars[V_border_touch_obj] = 0;
|
||||
game.vars[V_border_code] = 0;
|
||||
old_score = game.vars[V_score];
|
||||
setflag(F_entered_cli, false);
|
||||
game.exit_all_logics = false;
|
||||
reset_controllers();
|
||||
_game.exitAllLogics = false;
|
||||
while (runLogic(0) == 0 && !_game.quitProgNow) {
|
||||
_game.vars[vWordNotFound] = 0;
|
||||
_game.vars[vBorderTouchObj] = 0;
|
||||
_game.vars[vBorderCode] = 0;
|
||||
oldScore = _game.vars[vScore];
|
||||
setflag(fEnteredCli, false);
|
||||
_game.exitAllLogics = false;
|
||||
resetControllers();
|
||||
}
|
||||
reset_controllers();
|
||||
resetControllers();
|
||||
|
||||
game.view_table[0].direction = game.vars[V_ego_dir];
|
||||
_game.viewTable[0].direction = _game.vars[vEgoDir];
|
||||
|
||||
if (game.vars[V_score] != old_score || getflag(F_sound_on) != old_sound)
|
||||
write_status();
|
||||
if (_game.vars[vScore] != oldScore || getflag(fSoundOn) != oldSound)
|
||||
writeStatus();
|
||||
|
||||
game.vars[V_border_touch_obj] = 0;
|
||||
game.vars[V_border_code] = 0;
|
||||
setflag(F_new_room_exec, false);
|
||||
setflag(F_restart_game, false);
|
||||
setflag(F_restore_just_ran, false);
|
||||
_game.vars[vBorderTouchObj] = 0;
|
||||
_game.vars[vBorderCode] = 0;
|
||||
setflag(fNewRoomExec, false);
|
||||
setflag(fRestartGame, false);
|
||||
setflag(fRestoreJustRan, false);
|
||||
|
||||
if (game.gfx_mode) {
|
||||
update_viewtable();
|
||||
if (_game.gfxMode) {
|
||||
updateViewtable();
|
||||
_gfx->doUpdate();
|
||||
}
|
||||
}
|
||||
|
@ -147,101 +147,101 @@ void AgiEngine::interpret_cycle() {
|
|||
/**
|
||||
* Update AGI interpreter timer.
|
||||
*/
|
||||
void AgiEngine::update_timer() {
|
||||
clock_count++;
|
||||
if (clock_count <= TICK_SECONDS)
|
||||
void AgiEngine::updateTimer() {
|
||||
_clockCount++;
|
||||
if (_clockCount <= TICK_SECONDS)
|
||||
return;
|
||||
|
||||
clock_count -= TICK_SECONDS;
|
||||
_clockCount -= TICK_SECONDS;
|
||||
|
||||
if (!game.clock_enabled)
|
||||
if (!_game.clockEnabled)
|
||||
return;
|
||||
|
||||
setvar(V_seconds, getvar(V_seconds) + 1);
|
||||
if (getvar(V_seconds) < 60)
|
||||
setvar(vSeconds, getvar(vSeconds) + 1);
|
||||
if (getvar(vSeconds) < 60)
|
||||
return;
|
||||
|
||||
setvar(V_seconds, 0);
|
||||
setvar(V_minutes, getvar(V_minutes) + 1);
|
||||
if (getvar(V_minutes) < 60)
|
||||
setvar(vSeconds, 0);
|
||||
setvar(vMinutes, getvar(vMinutes) + 1);
|
||||
if (getvar(vMinutes) < 60)
|
||||
return;
|
||||
|
||||
setvar(V_minutes, 0);
|
||||
setvar(V_hours, getvar(V_hours) + 1);
|
||||
if (getvar(V_hours) < 24)
|
||||
setvar(vMinutes, 0);
|
||||
setvar(vHours, getvar(vHours) + 1);
|
||||
if (getvar(vHours) < 24)
|
||||
return;
|
||||
|
||||
setvar(V_hours, 0);
|
||||
setvar(V_days, getvar(V_days) + 1);
|
||||
setvar(vHours, 0);
|
||||
setvar(vDays, getvar(vDays) + 1);
|
||||
}
|
||||
|
||||
static int old_mode = -1;
|
||||
|
||||
void AgiEngine::new_input_mode(int i) {
|
||||
old_mode = game.input_mode;
|
||||
game.input_mode = i;
|
||||
void AgiEngine::newInputMode(int i) {
|
||||
_oldMode = _game.inputMode;
|
||||
_game.inputMode = i;
|
||||
}
|
||||
|
||||
void AgiEngine::old_input_mode() {
|
||||
game.input_mode = old_mode;
|
||||
void AgiEngine::oldInputMode() {
|
||||
_game.inputMode = _oldMode;
|
||||
}
|
||||
|
||||
/* If main_cycle returns false, don't process more events! */
|
||||
int AgiEngine::main_cycle() {
|
||||
int AgiEngine::mainCycle() {
|
||||
unsigned int key, kascii;
|
||||
struct vt_entry *v = &game.view_table[0];
|
||||
struct VtEntry *v = &_game.viewTable[0];
|
||||
|
||||
_gfx->pollTimer(); /* msdos driver -> does nothing */
|
||||
update_timer();
|
||||
updateTimer();
|
||||
|
||||
if (game.ver == 0) {
|
||||
message_box("Warning: game CRC not listed, assuming AGI version 2.917.");
|
||||
game.ver = -1;
|
||||
if (_game.ver == 0) {
|
||||
messageBox("Warning: game CRC not listed, assuming AGI version 2.917.");
|
||||
_game.ver = -1;
|
||||
}
|
||||
|
||||
key = do_poll_keyboard();
|
||||
key = doPollKeyboard();
|
||||
|
||||
/* In AGI Mouse emulation mode we must update the mouse-related
|
||||
* vars in every interpreter cycle.
|
||||
*/
|
||||
if (opt.agimouse) {
|
||||
game.vars[28] = g_mouse.x / 2;
|
||||
game.vars[29] = g_mouse.y;
|
||||
if (_opt.agimouse) {
|
||||
_game.vars[28] = g_mouse.x / 2;
|
||||
_game.vars[29] = g_mouse.y;
|
||||
}
|
||||
if (key == KEY_PRIORITY) {
|
||||
_sprites->erase_both();
|
||||
_sprites->eraseBoth();
|
||||
_debug.priority = !_debug.priority;
|
||||
_picture->show_pic();
|
||||
_sprites->blit_both();
|
||||
_sprites->commit_both();
|
||||
_picture->showPic();
|
||||
_sprites->blitBoth();
|
||||
_sprites->commitBoth();
|
||||
key = 0;
|
||||
}
|
||||
|
||||
if (key == KEY_STATUSLN) {
|
||||
_debug.statusline = !_debug.statusline;
|
||||
write_status();
|
||||
writeStatus();
|
||||
key = 0;
|
||||
}
|
||||
|
||||
/* Click-to-walk mouse interface */
|
||||
if (game.player_control && v->flags & ADJ_EGO_XY) {
|
||||
v->direction = get_direction(v->x_pos, v->y_pos, v->parm1, v->parm2, v->step_size);
|
||||
if (_game.playerControl && v->flags & ADJ_EGO_XY) {
|
||||
v->direction = getDirection(v->xPos, v->yPos, v->parm1, v->parm2, v->stepSize);
|
||||
|
||||
if (v->direction == 0)
|
||||
in_destination(v);
|
||||
inDestination(v);
|
||||
}
|
||||
|
||||
kascii = KEY_ASCII(key);
|
||||
|
||||
if (kascii)
|
||||
setvar(V_key, kascii);
|
||||
process_key:
|
||||
switch (game.input_mode) {
|
||||
setvar(vKey, kascii);
|
||||
|
||||
process_key:
|
||||
|
||||
switch (_game.inputMode) {
|
||||
case INPUT_NORMAL:
|
||||
if (!handle_controller(key)) {
|
||||
if (key == 0 || !game.input_enabled)
|
||||
if (!handleController(key)) {
|
||||
if (key == 0 || !_game.inputEnabled)
|
||||
break;
|
||||
handle_keys(key);
|
||||
handleKeys(key);
|
||||
|
||||
/* if ESC pressed, activate menu before
|
||||
* accept.input from the interpreter cycle
|
||||
|
@ -259,129 +259,129 @@ int AgiEngine::main_cycle() {
|
|||
}
|
||||
break;
|
||||
case INPUT_GETSTRING:
|
||||
handle_controller(key);
|
||||
handle_getstring(key);
|
||||
setvar(V_key, 0); /* clear ENTER key */
|
||||
handleController(key);
|
||||
handleGetstring(key);
|
||||
setvar(vKey, 0); /* clear ENTER key */
|
||||
break;
|
||||
case INPUT_MENU:
|
||||
menu->keyhandler(key);
|
||||
_menu->keyhandler(key);
|
||||
_gfx->doUpdate();
|
||||
return false;
|
||||
case INPUT_NONE:
|
||||
handle_controller(key);
|
||||
handleController(key);
|
||||
if (key)
|
||||
game.keypress = key;
|
||||
_game.keypress = key;
|
||||
break;
|
||||
}
|
||||
_gfx->doUpdate();
|
||||
|
||||
if (game.msg_box_ticks > 0)
|
||||
game.msg_box_ticks--;
|
||||
if (_game.msgBoxTicks > 0)
|
||||
_game.msgBoxTicks--;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
int AgiEngine::play_game() {
|
||||
int ec = err_OK;
|
||||
int AgiEngine::playGame() {
|
||||
int ec = errOK;
|
||||
|
||||
debugC(2, kDebugLevelMain, "initializing...");
|
||||
debugC(2, kDebugLevelMain, "game.ver = 0x%x", game.ver);
|
||||
debugC(2, kDebugLevelMain, "game.ver = 0x%x", _game.ver);
|
||||
|
||||
_sound->stop_sound();
|
||||
_sound->stopSound();
|
||||
_gfx->clearScreen(0);
|
||||
|
||||
game.horizon = HORIZON;
|
||||
game.player_control = false;
|
||||
_game.horizon = HORIZON;
|
||||
_game.playerControl = false;
|
||||
|
||||
setflag(F_logic_zero_firsttime, true); /* not in 2.917 */
|
||||
setflag(F_new_room_exec, true); /* needed for MUMG and SQ2! */
|
||||
setflag(F_sound_on, true); /* enable sound */
|
||||
setvar(V_time_delay, 2); /* "normal" speed */
|
||||
setflag(fLogicZeroFirsttime, true); /* not in 2.917 */
|
||||
setflag(fNewRoomExec, true); /* needed for MUMG and SQ2! */
|
||||
setflag(fSoundOn, true); /* enable sound */
|
||||
setvar(vTimeDelay, 2); /* "normal" speed */
|
||||
|
||||
game.gfx_mode = true;
|
||||
game.quit_prog_now = false;
|
||||
game.clock_enabled = true;
|
||||
game.line_user_input = 22;
|
||||
_game.gfxMode = true;
|
||||
_game.quitProgNow = false;
|
||||
_game.clockEnabled = true;
|
||||
_game.lineUserInput = 22;
|
||||
|
||||
if (opt.agimouse)
|
||||
if (_opt.agimouse)
|
||||
report("Using AGI Mouse 1.0 protocol\n");
|
||||
|
||||
report("Running AGI script.\n");
|
||||
|
||||
setflag(F_entered_cli, false);
|
||||
setflag(F_said_accepted_input, false);
|
||||
game.vars[V_word_not_found] = 0;
|
||||
game.vars[V_key] = 0;
|
||||
setflag(fEnteredCli, false);
|
||||
setflag(fSaidAcceptedInput, false);
|
||||
_game.vars[vWordNotFound] = 0;
|
||||
_game.vars[vKey] = 0;
|
||||
|
||||
debugC(2, kDebugLevelMain, "Entering main loop");
|
||||
do {
|
||||
|
||||
if (!main_cycle())
|
||||
if (!mainCycle())
|
||||
continue;
|
||||
|
||||
if (getvar(V_time_delay) == 0 || (1 + clock_count) % getvar(V_time_delay) == 0) {
|
||||
if (!game.has_prompt && game.input_mode == INPUT_NORMAL) {
|
||||
write_prompt();
|
||||
game.has_prompt = 1;
|
||||
} else if (game.has_prompt && game.input_mode == INPUT_NONE) {
|
||||
write_prompt();
|
||||
game.has_prompt = 0;
|
||||
if (getvar(vTimeDelay) == 0 || (1 + _clockCount) % getvar(vTimeDelay) == 0) {
|
||||
if (!_game.hasPrompt && _game.inputMode == INPUT_NORMAL) {
|
||||
writePrompt();
|
||||
_game.hasPrompt = 1;
|
||||
} else if (_game.hasPrompt && _game.inputMode == INPUT_NONE) {
|
||||
writePrompt();
|
||||
_game.hasPrompt = 0;
|
||||
}
|
||||
|
||||
interpret_cycle();
|
||||
interpretCycle();
|
||||
|
||||
setflag(F_entered_cli, false);
|
||||
setflag(F_said_accepted_input, false);
|
||||
game.vars[V_word_not_found] = 0;
|
||||
game.vars[V_key] = 0;
|
||||
setflag(fEnteredCli, false);
|
||||
setflag(fSaidAcceptedInput, false);
|
||||
_game.vars[vWordNotFound] = 0;
|
||||
_game.vars[vKey] = 0;
|
||||
}
|
||||
|
||||
if (game.quit_prog_now == 0xff)
|
||||
ec = err_RestartGame;
|
||||
if (_game.quitProgNow == 0xff)
|
||||
ec = errRestartGame;
|
||||
|
||||
} while (game.quit_prog_now == 0);
|
||||
} while (_game.quitProgNow == 0);
|
||||
|
||||
_sound->stop_sound();
|
||||
_sound->stopSound();
|
||||
|
||||
return ec;
|
||||
}
|
||||
|
||||
int AgiEngine::run_game() {
|
||||
int i, ec = err_OK;
|
||||
int AgiEngine::runGame() {
|
||||
int i, ec = errOK;
|
||||
|
||||
for (i = 0; i < MAX_DIRS; i++)
|
||||
memset(&game.ev_keyp[i], 0, sizeof(struct agi_event));
|
||||
memset(&_game.evKeyp[i], 0, sizeof(struct AgiEvent));
|
||||
|
||||
/* Execute the game */
|
||||
do {
|
||||
debugC(2, kDebugLevelMain, "game loop");
|
||||
debugC(2, kDebugLevelMain, "game.ver = 0x%x", game.ver);
|
||||
debugC(2, kDebugLevelMain, "game.ver = 0x%x", _game.ver);
|
||||
|
||||
if (agiInit() != err_OK)
|
||||
if (agiInit() != errOK)
|
||||
break;
|
||||
if (ec == err_RestartGame)
|
||||
setflag(F_restart_game, true);
|
||||
if (ec == errRestartGame)
|
||||
setflag(fRestartGame, true);
|
||||
|
||||
setvar(V_computer, 0); /* IBM PC (4 = Atari ST) */
|
||||
setvar(V_soundgen, 1); /* IBM PC SOUND */
|
||||
setvar(V_monitor, 0x3); /* EGA monitor */
|
||||
setvar(V_max_input_chars, 38);
|
||||
game.input_mode = INPUT_NONE;
|
||||
game.input_enabled = 0;
|
||||
game.has_prompt = 0;
|
||||
setvar(vComputer, 0); /* IBM PC (4 = Atari ST) */
|
||||
setvar(vSoundgen, 1); /* IBM PC SOUND */
|
||||
setvar(vMonitor, 0x3); /* EGA monitor */
|
||||
setvar(vMaxInputChars, 38);
|
||||
_game.inputMode = INPUT_NONE;
|
||||
_game.inputEnabled = 0;
|
||||
_game.hasPrompt = 0;
|
||||
|
||||
game.state = STATE_RUNNING;
|
||||
ec = play_game();
|
||||
game.state = STATE_LOADED;
|
||||
_game.state = STATE_RUNNING;
|
||||
ec = playGame();
|
||||
_game.state = STATE_LOADED;
|
||||
agiDeinit();
|
||||
} while (ec == err_RestartGame);
|
||||
} while (ec == errRestartGame);
|
||||
|
||||
delete menu;
|
||||
menu = 0;
|
||||
delete _menu;
|
||||
_menu = NULL;
|
||||
|
||||
release_image_stack();
|
||||
releaseImageStack();
|
||||
|
||||
return ec;
|
||||
}
|
||||
|
||||
} // End of namespace Agi
|
||||
} // End of namespace Agi
|
||||
|
|
|
@ -29,7 +29,7 @@
|
|||
namespace Agi {
|
||||
|
||||
/* 8x8 font patterns */
|
||||
static const uint8 cur_font[] = {
|
||||
static const uint8 curFont[] = {
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x7E, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x7E, /* cursor hollow */
|
||||
0x7E, 0x7E, 0x7E, 0x7E, 0x7E, 0x7E, 0x7E, 0x7E, /* cursor solid */
|
||||
|
@ -290,4 +290,4 @@ static const uint8 cur_font[] = {
|
|||
0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x7E, 0x00
|
||||
};
|
||||
|
||||
} // End of namespace Agi
|
||||
} // End of namespace Agi
|
||||
|
|
|
@ -29,14 +29,14 @@
|
|||
namespace Agi {
|
||||
|
||||
int AgiEngine::getflag(int n) {
|
||||
uint8 *set = (uint8 *) &game.flags;
|
||||
uint8 *set = (uint8 *)&_game.flags;
|
||||
|
||||
set += n >> 3;
|
||||
return (*set & (1 << (n & 0x07))) != 0;
|
||||
}
|
||||
|
||||
void AgiEngine::setflag(int n, int v) {
|
||||
uint8 *set = (uint8 *) &game.flags;
|
||||
uint8 *set = (uint8 *)&_game.flags;
|
||||
|
||||
set += n >> 3;
|
||||
if (v)
|
||||
|
@ -46,25 +46,25 @@ void AgiEngine::setflag(int n, int v) {
|
|||
}
|
||||
|
||||
void AgiEngine::flipflag(int n) {
|
||||
uint8 *set = (uint8 *) & game.flags;
|
||||
uint8 *set = (uint8 *)&_game.flags;
|
||||
|
||||
set += n >> 3;
|
||||
*set ^= 1 << (n & 0x07); /* flip bit */
|
||||
}
|
||||
|
||||
void AgiEngine::setvar(int var, int val) {
|
||||
game.vars[var] = val;
|
||||
_game.vars[var] = val;
|
||||
}
|
||||
|
||||
int AgiEngine::getvar(int var) {
|
||||
return game.vars[var];
|
||||
return _game.vars[var];
|
||||
}
|
||||
|
||||
void AgiEngine::decrypt(uint8 *mem, int len) {
|
||||
const uint8 *key;
|
||||
int i;
|
||||
|
||||
key = opt.agdsMode ? (const uint8 *)CRYPT_KEY_AGDS
|
||||
key = _opt.agdsMode ? (const uint8 *)CRYPT_KEY_AGDS
|
||||
: (const uint8 *)CRYPT_KEY_SIERRA;
|
||||
|
||||
for (i = 0; i < len; i++)
|
||||
|
|
|
@ -46,7 +46,7 @@ namespace Agi {
|
|||
* This array contains the 6-bit RGB values of the EGA palette exported
|
||||
* to the console drivers.
|
||||
*/
|
||||
uint8 ega_palette[16 * 3] = {
|
||||
uint8 egaPalette[16 * 3] = {
|
||||
0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x2a,
|
||||
0x00, 0x2a, 0x00,
|
||||
|
@ -68,7 +68,7 @@ uint8 ega_palette[16 * 3] = {
|
|||
/**
|
||||
* 16 color amiga-ish palette.
|
||||
*/
|
||||
uint8 new_palette[16 * 3] = {
|
||||
uint8 newPalette[16 * 3] = {
|
||||
0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x3f,
|
||||
0x00, 0x2A, 0x00,
|
||||
|
@ -87,7 +87,7 @@ uint8 new_palette[16 * 3] = {
|
|||
0x3F, 0x3F, 0x3F
|
||||
};
|
||||
|
||||
static uint16 cga_map[16] = {
|
||||
static uint16 cgaMap[16] = {
|
||||
0x0000, /* 0 - black */
|
||||
0x0d00, /* 1 - blue */
|
||||
0x0b00, /* 2 - green */
|
||||
|
@ -106,12 +106,12 @@ static uint16 cga_map[16] = {
|
|||
0x0f0f /* 15 - white */
|
||||
};
|
||||
|
||||
struct update_block {
|
||||
struct UpdateBlock {
|
||||
int x1, y1;
|
||||
int x2, y2;
|
||||
};
|
||||
|
||||
static struct update_block update = {
|
||||
static struct UpdateBlock update = {
|
||||
MAX_INT, MAX_INT, 0, 0
|
||||
};
|
||||
|
||||
|
@ -134,20 +134,20 @@ static struct update_block update = {
|
|||
void GfxMgr::shakeStart() {
|
||||
int i;
|
||||
|
||||
if ((shake_h = (uint8 *)malloc(GFX_WIDTH * SHAKE_MAG)) == NULL)
|
||||
if ((_shakeH = (uint8 *)malloc(GFX_WIDTH * SHAKE_MAG)) == NULL)
|
||||
return;
|
||||
|
||||
if ((shake_v = (uint8 *)malloc(SHAKE_MAG * (GFX_HEIGHT - SHAKE_MAG))) == NULL) {
|
||||
free(shake_h);
|
||||
if ((_shakeV = (uint8 *)malloc(SHAKE_MAG * (GFX_HEIGHT - SHAKE_MAG))) == NULL) {
|
||||
free(_shakeH);
|
||||
return;
|
||||
}
|
||||
|
||||
for (i = 0; i < GFX_HEIGHT - SHAKE_MAG; i++) {
|
||||
memcpy(shake_v + i * SHAKE_MAG, agi_screen + i * GFX_WIDTH, SHAKE_MAG);
|
||||
memcpy(_shakeV + i * SHAKE_MAG, _agiScreen + i * GFX_WIDTH, SHAKE_MAG);
|
||||
}
|
||||
|
||||
for (i = 0; i < SHAKE_MAG; i++) {
|
||||
memcpy(shake_h + i * GFX_WIDTH, agi_screen + i * GFX_WIDTH, GFX_WIDTH);
|
||||
memcpy(_shakeH + i * GFX_WIDTH, _agiScreen + i * GFX_WIDTH, GFX_WIDTH);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -156,14 +156,14 @@ void GfxMgr::shakeScreen(int n) {
|
|||
|
||||
if (n == 0) {
|
||||
for (i = 0; i < (GFX_HEIGHT - SHAKE_MAG); i++) {
|
||||
memmove(&agi_screen[GFX_WIDTH * i],
|
||||
&agi_screen[GFX_WIDTH * (i + SHAKE_MAG) + SHAKE_MAG],
|
||||
memmove(&_agiScreen[GFX_WIDTH * i],
|
||||
&_agiScreen[GFX_WIDTH * (i + SHAKE_MAG) + SHAKE_MAG],
|
||||
GFX_WIDTH - SHAKE_MAG);
|
||||
}
|
||||
} else {
|
||||
for (i = GFX_HEIGHT - SHAKE_MAG - 1; i >= 0; i--) {
|
||||
memmove(&agi_screen[GFX_WIDTH * (i + SHAKE_MAG) + SHAKE_MAG],
|
||||
&agi_screen[GFX_WIDTH * i], GFX_WIDTH - SHAKE_MAG);
|
||||
memmove(&_agiScreen[GFX_WIDTH * (i + SHAKE_MAG) + SHAKE_MAG],
|
||||
&_agiScreen[GFX_WIDTH * i], GFX_WIDTH - SHAKE_MAG);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -172,30 +172,30 @@ void GfxMgr::shakeEnd() {
|
|||
int i;
|
||||
|
||||
for (i = 0; i < GFX_HEIGHT - SHAKE_MAG; i++) {
|
||||
memcpy(agi_screen + i * GFX_WIDTH, shake_v + i * SHAKE_MAG, SHAKE_MAG);
|
||||
memcpy(_agiScreen + i * GFX_WIDTH, _shakeV + i * SHAKE_MAG, SHAKE_MAG);
|
||||
}
|
||||
|
||||
for (i = 0; i < SHAKE_MAG; i++) {
|
||||
memcpy(agi_screen + i * GFX_WIDTH, shake_h + i * GFX_WIDTH, GFX_WIDTH);
|
||||
memcpy(_agiScreen + i * GFX_WIDTH, _shakeH + i * GFX_WIDTH, GFX_WIDTH);
|
||||
}
|
||||
|
||||
flushBlock(0, 0, GFX_WIDTH - 1, GFX_HEIGHT - 1);
|
||||
|
||||
free(shake_v);
|
||||
free(shake_h);
|
||||
free(_shakeV);
|
||||
free(_shakeH);
|
||||
}
|
||||
|
||||
void GfxMgr::putTextCharacter(int l, int x, int y, unsigned int c, int fg, int bg, bool checkerboard) {
|
||||
int x1, y1, xx, yy, cc;
|
||||
const uint8 *p;
|
||||
|
||||
p = Agi::cur_font + ((unsigned int)c * CHAR_LINES);
|
||||
p = Agi::curFont + ((unsigned int)c * CHAR_LINES);
|
||||
for (y1 = 0; y1 < CHAR_LINES; y1++) {
|
||||
for (x1 = 0; x1 < CHAR_COLS; x1++) {
|
||||
xx = x + x1;
|
||||
yy = y + y1;
|
||||
cc = (*p & (1 << (7 - x1))) ? fg : bg;
|
||||
agi_screen[xx + yy * GFX_WIDTH] = cc;
|
||||
_agiScreen[xx + yy * GFX_WIDTH] = cc;
|
||||
}
|
||||
|
||||
p++;
|
||||
|
@ -207,7 +207,7 @@ void GfxMgr::putTextCharacter(int l, int x, int y, unsigned int c, int fg, int b
|
|||
if (checkerboard) {
|
||||
for (yy = y; yy < y + CHAR_LINES; yy++)
|
||||
for (xx = x + (~yy & 1); xx < x + CHAR_COLS; xx += 2)
|
||||
agi_screen[xx + yy * GFX_WIDTH] = 15;
|
||||
_agiScreen[xx + yy * GFX_WIDTH] = 15;
|
||||
}
|
||||
|
||||
/* FIXME: we don't want this when we're writing on the
|
||||
|
@ -231,7 +231,7 @@ void GfxMgr::drawRectangle(int x1, int y1, int x2, int y2, int c) {
|
|||
|
||||
w = x2 - x1 + 1;
|
||||
h = y2 - y1 + 1;
|
||||
p0 = &agi_screen[x1 + y1 * GFX_WIDTH];
|
||||
p0 = &_agiScreen[x1 + y1 * GFX_WIDTH];
|
||||
for (y = 0; y < h; y++) {
|
||||
memset(p0, c, w);
|
||||
p0 += GFX_WIDTH;
|
||||
|
@ -244,17 +244,17 @@ void GfxMgr::drawFrame(int x1, int y1, int x2, int y2, int c1, int c2) {
|
|||
|
||||
/* top line */
|
||||
w = x2 - x1 + 1;
|
||||
p0 = &agi_screen[x1 + y1 * GFX_WIDTH];
|
||||
p0 = &_agiScreen[x1 + y1 * GFX_WIDTH];
|
||||
memset(p0, c1, w);
|
||||
|
||||
/* bottom line */
|
||||
p0 = &agi_screen[x1 + y2 * GFX_WIDTH];
|
||||
p0 = &_agiScreen[x1 + y2 * GFX_WIDTH];
|
||||
memset(p0, c2, w);
|
||||
|
||||
/* side lines */
|
||||
for (y = y1; y <= y2; y++) {
|
||||
agi_screen[x1 + y * GFX_WIDTH] = c1;
|
||||
agi_screen[x2 + y * GFX_WIDTH] = c2;
|
||||
_agiScreen[x1 + y * GFX_WIDTH] = c1;
|
||||
_agiScreen[x2 + y * GFX_WIDTH] = c2;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -357,8 +357,8 @@ void GfxMgr::initPalette(uint8 *p) {
|
|||
int i;
|
||||
|
||||
for (i = 0; i < 48; i++) {
|
||||
palette[i] = p[i];
|
||||
palette[i + 48] = (p[i] + 0x30) >> 2;
|
||||
_palette[i] = p[i];
|
||||
_palette[i + 48] = (p[i] + 0x30) >> 2;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -367,9 +367,9 @@ void GfxMgr::gfxSetPalette() {
|
|||
byte pal[32 * 4];
|
||||
|
||||
for (i = 0; i < 32; i++) {
|
||||
pal[i * 4 + 0] = palette[i * 3 + 0] << 2;
|
||||
pal[i * 4 + 1] = palette[i * 3 + 1] << 2;
|
||||
pal[i * 4 + 2] = palette[i * 3 + 2] << 2;
|
||||
pal[i * 4 + 0] = _palette[i * 3 + 0] << 2;
|
||||
pal[i * 4 + 1] = _palette[i * 3 + 1] << 2;
|
||||
pal[i * 4 + 2] = _palette[i * 3 + 2] << 2;
|
||||
pal[i * 4 + 3] = 0;
|
||||
}
|
||||
g_system->setPalette(pal, 0, 32);
|
||||
|
@ -386,7 +386,7 @@ void GfxMgr::gfxPutBlock(int x1, int y1, int x2, int y2) {
|
|||
if (y2 >= GFX_HEIGHT)
|
||||
y2 = GFX_HEIGHT - 1;
|
||||
|
||||
g_system->copyRectToScreen(screen + y1 * 320 + x1, 320, x1, y1, x2 - x1 + 1, y2 - y1 + 1);
|
||||
g_system->copyRectToScreen(_screen + y1 * 320 + x1, 320, x1, y1, x2 - x1 + 1, y2 - y1 + 1);
|
||||
}
|
||||
|
||||
static const byte mouseCursorArrow[] = {
|
||||
|
@ -406,13 +406,13 @@ static const byte mouseCursorArrow[] = {
|
|||
* @see deinit_video()
|
||||
*/
|
||||
int GfxMgr::initVideo() {
|
||||
if (_vm->opt.renderMode == Common::kRenderEGA)
|
||||
initPalette(ega_palette);
|
||||
if (_vm->_opt.renderMode == Common::kRenderEGA)
|
||||
initPalette(egaPalette);
|
||||
else
|
||||
initPalette(new_palette);
|
||||
initPalette(newPalette);
|
||||
|
||||
if ((agi_screen = (uint8 *)calloc(GFX_WIDTH, GFX_HEIGHT)) == NULL)
|
||||
return err_NotEnoughMemory;
|
||||
if ((_agiScreen = (uint8 *)calloc(GFX_WIDTH, GFX_HEIGHT)) == NULL)
|
||||
return errNotEnoughMemory;
|
||||
|
||||
gfxSetPalette();
|
||||
|
||||
|
@ -434,7 +434,7 @@ int GfxMgr::initVideo() {
|
|||
}
|
||||
CursorMan.replaceCursor(mouseCursor, 16, 16, 1, 1);
|
||||
|
||||
return err_OK;
|
||||
return errOK;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -443,22 +443,22 @@ int GfxMgr::initVideo() {
|
|||
* @see init_video()
|
||||
*/
|
||||
int GfxMgr::deinitVideo() {
|
||||
free(agi_screen);
|
||||
free(_agiScreen);
|
||||
|
||||
return err_OK;
|
||||
return errOK;
|
||||
}
|
||||
|
||||
int GfxMgr::initMachine() {
|
||||
screen = (unsigned char *)malloc(320 * 200);
|
||||
_vm->clock_count = 0;
|
||||
_screen = (unsigned char *)malloc(320 * 200);
|
||||
_vm->_clockCount = 0;
|
||||
|
||||
return err_OK;
|
||||
return errOK;
|
||||
}
|
||||
|
||||
int GfxMgr::deinitMachine() {
|
||||
free(screen);
|
||||
free(_screen);
|
||||
|
||||
return err_OK;
|
||||
return errOK;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -472,19 +472,19 @@ int GfxMgr::deinitMachine() {
|
|||
* @param p pointer to the row start in the AGI screen
|
||||
*/
|
||||
void GfxMgr::putPixelsA(int x, int y, int n, uint8 *p) {
|
||||
if (_vm->opt.renderMode == Common::kRenderCGA) {
|
||||
if (_vm->_opt.renderMode == Common::kRenderCGA) {
|
||||
for (x *= 2; n--; p++, x += 2) {
|
||||
register uint16 q = (cga_map[(*p & 0xf0) >> 4] << 4) | cga_map[*p & 0x0f];
|
||||
register uint16 q = (cgaMap[(*p & 0xf0) >> 4] << 4) | cgaMap[*p & 0x0f];
|
||||
if (_vm->_debug.priority)
|
||||
q >>= 4;
|
||||
*(uint16 *)&agi_screen[x + y * GFX_WIDTH] = q & 0x0f0f;
|
||||
*(uint16 *)&_agiScreen[x + y * GFX_WIDTH] = q & 0x0f0f;
|
||||
}
|
||||
} else {
|
||||
for (x *= 2; n--; p++, x += 2) {
|
||||
register uint16 q = ((uint16) * p << 8) | *p;
|
||||
if (_vm->_debug.priority)
|
||||
q >>= 4;
|
||||
*(uint16 *)&agi_screen[x + y * GFX_WIDTH] = q & 0x0f0f;
|
||||
*(uint16 *)&_agiScreen[x + y * GFX_WIDTH] = q & 0x0f0f;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -547,11 +547,11 @@ void GfxMgr::flushBlock(int x1, int y1, int x2, int y2) {
|
|||
|
||||
scheduleUpdate(x1, y1, x2, y2);
|
||||
|
||||
p0 = &agi_screen[x1 + y1 * GFX_WIDTH];
|
||||
p0 = &_agiScreen[x1 + y1 * GFX_WIDTH];
|
||||
w = x2 - x1 + 1;
|
||||
|
||||
for (y = y1; y <= y2; y++) {
|
||||
memcpy(screen + 320 * y + x1, p0, w);
|
||||
memcpy(_screen + 320 * y + x1, p0, w);
|
||||
p0 += GFX_WIDTH;
|
||||
}
|
||||
}
|
||||
|
@ -589,7 +589,7 @@ void GfxMgr::flushScreen() {
|
|||
* @param c color to clear the screen
|
||||
*/
|
||||
void GfxMgr::clearScreen(int c) {
|
||||
memset(agi_screen, c, GFX_WIDTH * GFX_HEIGHT);
|
||||
memset(_agiScreen, c, GFX_WIDTH * GFX_HEIGHT);
|
||||
flushScreen();
|
||||
}
|
||||
|
||||
|
@ -600,7 +600,7 @@ void GfxMgr::saveBlock(int x1, int y1, int x2, int y2, uint8 *b) {
|
|||
uint8 *p0;
|
||||
int w, h;
|
||||
|
||||
p0 = &agi_screen[x1 + GFX_WIDTH * y1];
|
||||
p0 = &_agiScreen[x1 + GFX_WIDTH * y1];
|
||||
w = x2 - x1 + 1;
|
||||
h = y2 - y1 + 1;
|
||||
while (h--) {
|
||||
|
@ -617,7 +617,7 @@ void GfxMgr::restoreBlock(int x1, int y1, int x2, int y2, uint8 *b) {
|
|||
uint8 *p0;
|
||||
int w, h;
|
||||
|
||||
p0 = &agi_screen[x1 + GFX_WIDTH * y1];
|
||||
p0 = &_agiScreen[x1 + GFX_WIDTH * y1];
|
||||
w = x2 - x1 + 1;
|
||||
h = y2 - y1 + 1;
|
||||
while (h--) {
|
||||
|
|
|
@ -40,17 +40,17 @@ class GfxMgr {
|
|||
private:
|
||||
AgiEngine *_vm;
|
||||
|
||||
uint8 palette[32 * 3];
|
||||
uint8 *agi_screen;
|
||||
unsigned char *screen;
|
||||
uint8 _palette[32 * 3];
|
||||
uint8 *_agiScreen;
|
||||
unsigned char *_screen;
|
||||
|
||||
uint8 *shake_h, *shake_v;
|
||||
uint8 *_shakeH, *_shakeV;
|
||||
|
||||
public:
|
||||
GfxMgr(AgiEngine *vm) {
|
||||
_vm = vm;
|
||||
shake_h = NULL;
|
||||
shake_v = NULL;
|
||||
_shakeH = NULL;
|
||||
_shakeV = NULL;
|
||||
}
|
||||
|
||||
void gfxPutBlock(int x1, int y1, int x2, int y2);
|
||||
|
@ -96,4 +96,4 @@ public:
|
|||
|
||||
} // End of namespace Agi
|
||||
|
||||
#endif /* AGI_GRAPHICS_H */
|
||||
#endif /* AGI_GRAPHICS_H */
|
||||
|
|
|
@ -29,15 +29,15 @@
|
|||
|
||||
namespace Agi {
|
||||
|
||||
int AgiEngine::v2id_game() {
|
||||
int AgiEngine::v2IdGame() {
|
||||
int ver;
|
||||
|
||||
ver = this->_gameDescription->version;
|
||||
game.ver = ver;
|
||||
debugC(2, kDebugLevelMain, "game.ver = 0x%x", game.ver);
|
||||
ver = _gameDescription->version;
|
||||
_game.ver = ver;
|
||||
debugC(2, kDebugLevelMain, "game.ver = 0x%x", _game.ver);
|
||||
agiSetRelease(ver);
|
||||
|
||||
return setup_v2_game(ver, 0);
|
||||
return setupV2Game(ver, 0);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -48,22 +48,22 @@ int AgiEngine::v2id_game() {
|
|||
* 0x0149
|
||||
*/
|
||||
|
||||
int AgiEngine::v3id_game() {
|
||||
int AgiEngine::v3IdGame() {
|
||||
int ver;
|
||||
|
||||
ver = this->_gameDescription->version;
|
||||
game.ver = ver;
|
||||
debugC(2, kDebugLevelMain, "game.ver = 0x%x", game.ver);
|
||||
ver = _gameDescription->version;
|
||||
_game.ver = ver;
|
||||
debugC(2, kDebugLevelMain, "game.ver = 0x%x", _game.ver);
|
||||
agiSetRelease(ver);
|
||||
|
||||
return setup_v3_game(ver, 0);
|
||||
return setupV3Game(ver, 0);
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
int AgiEngine::setup_v2_game(int ver, uint32 crc) {
|
||||
int ec = err_OK;
|
||||
int AgiEngine::setupV2Game(int ver, uint32 crc) {
|
||||
int ec = errOK;
|
||||
|
||||
if (ver == 0) {
|
||||
report("Unknown v2 Sierra game: %08x\n\n", crc);
|
||||
|
@ -73,26 +73,26 @@ int AgiEngine::setup_v2_game(int ver, uint32 crc) {
|
|||
/* setup the differences in the opcodes and other bits in the
|
||||
* AGI v2 specs
|
||||
*/
|
||||
if (opt.emuversion)
|
||||
agiSetRelease(ver = opt.emuversion);
|
||||
if (_opt.emuversion)
|
||||
agiSetRelease(ver = _opt.emuversion);
|
||||
|
||||
// Should this go above the previous lines, so we can force emulation versions
|
||||
// even for AGDS games? -- dsymonds
|
||||
if (opt.agdsMode)
|
||||
if (_opt.agdsMode)
|
||||
agiSetRelease(ver = 0x2440); /* ALL AGDS games built for 2.440 */
|
||||
|
||||
report("Seting up for version 0x%04X\n", ver);
|
||||
|
||||
// 'quit' takes 0 args for 2.089
|
||||
if (ver == 0x2089)
|
||||
logic_names_cmd[0x86].num_args = 0;
|
||||
logicNamesCmd[0x86].numArgs = 0;
|
||||
|
||||
// 'print.at' and 'print.at.v' take 3 args before 2.272
|
||||
// This is documented in the specs as only < 2.440, but it seems
|
||||
// that KQ3 (2.272) needs a 'print.at' taking 4 args.
|
||||
if (ver < 0x2272) {
|
||||
logic_names_cmd[0x97].num_args = 3;
|
||||
logic_names_cmd[0x98].num_args = 3;
|
||||
logicNamesCmd[0x97].numArgs = 3;
|
||||
logicNamesCmd[0x98].numArgs = 3;
|
||||
}
|
||||
|
||||
return ec;
|
||||
|
@ -101,16 +101,16 @@ int AgiEngine::setup_v2_game(int ver, uint32 crc) {
|
|||
/**
|
||||
*
|
||||
*/
|
||||
int AgiEngine::setup_v3_game(int ver, uint32 crc) {
|
||||
int ec = err_OK;
|
||||
int AgiEngine::setupV3Game(int ver, uint32 crc) {
|
||||
int ec = errOK;
|
||||
|
||||
if (ver == 0) {
|
||||
report("Unknown v3 Sierra game: %08x\n\n", crc);
|
||||
agiSetRelease(ver = 0x3149);
|
||||
}
|
||||
|
||||
if (opt.emuversion)
|
||||
agiSetRelease(ver = opt.emuversion);
|
||||
if (_opt.emuversion)
|
||||
agiSetRelease(ver = _opt.emuversion);
|
||||
|
||||
report("Seting up for version 0x%04X\n", ver);
|
||||
|
||||
|
@ -118,11 +118,11 @@ int AgiEngine::setup_v3_game(int ver, uint32 crc) {
|
|||
// 'unknown173' also takes 1 arg for 3.002.068, not 0 args.
|
||||
// Is this actually used anywhere? -- dsymonds
|
||||
if (ver == 0x3086) {
|
||||
logic_names_cmd[0xb0].num_args = 1;
|
||||
logic_names_cmd[0xad].num_args = 1;
|
||||
logicNamesCmd[0xb0].numArgs = 1;
|
||||
logicNamesCmd[0xad].numArgs = 1;
|
||||
}
|
||||
|
||||
return ec;
|
||||
}
|
||||
|
||||
} // End of namespace Agi
|
||||
} // End of namespace Agi
|
||||
|
|
|
@ -54,7 +54,7 @@ namespace Agi {
|
|||
#define SELECT_MSG "Press ENTER to select, ESC to cancel"
|
||||
|
||||
void AgiEngine::printItem(int n, int fg, int bg) {
|
||||
print_text(object_name(intobj[n]), 0, n % 2 ? 39 - strlen(object_name(intobj[n])) : 1,
|
||||
printText(objectName(_intobj[n]), 0, n % 2 ? 39 - strlen(objectName(_intobj[n])) : 1,
|
||||
(n / 2) + 2, 40, fg, bg);
|
||||
}
|
||||
|
||||
|
@ -75,17 +75,17 @@ int AgiEngine::findItem() {
|
|||
int AgiEngine::showItems() {
|
||||
unsigned int x, i;
|
||||
|
||||
for (x = i = 0; x < game.num_objects; x++) {
|
||||
if (object_get_location(x) == EGO_OWNED) {
|
||||
for (x = i = 0; x < _game.numObjects; x++) {
|
||||
if (objectGetLocation(x) == EGO_OWNED) {
|
||||
/* add object to our list! */
|
||||
intobj[i] = x;
|
||||
_intobj[i] = x;
|
||||
printItem(i, STATUS_FG, STATUS_BG);
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
if (i == 0) {
|
||||
print_text(NOTHING_MSG, 0, NOTHING_X, NOTHING_Y, 40, STATUS_FG, STATUS_BG);
|
||||
printText(NOTHING_MSG, 0, NOTHING_X, NOTHING_Y, 40, STATUS_FG, STATUS_BG);
|
||||
}
|
||||
|
||||
return i;
|
||||
|
@ -98,12 +98,12 @@ void AgiEngine::selectItems(int n) {
|
|||
if (n > 0)
|
||||
printItem(fsel, STATUS_BG, STATUS_FG);
|
||||
|
||||
switch (wait_any_key()) {
|
||||
switch (waitAnyKey()) {
|
||||
case KEY_ENTER:
|
||||
setvar(V_sel_item, intobj[fsel]);
|
||||
setvar(vSelItem, _intobj[fsel]);
|
||||
goto exit_select;
|
||||
case KEY_ESCAPE:
|
||||
setvar(V_sel_item, 0xff);
|
||||
setvar(vSelItem, 0xff);
|
||||
goto exit_select;
|
||||
case KEY_UP:
|
||||
if (fsel >= 2)
|
||||
|
@ -124,7 +124,7 @@ void AgiEngine::selectItems(int n) {
|
|||
case BUTTON_LEFT:{
|
||||
int i = findItem();
|
||||
if (i >= 0 && i < n) {
|
||||
setvar(V_sel_item, intobj[fsel = i]);
|
||||
setvar(vSelItem, _intobj[fsel = i]);
|
||||
debugC(6, kDebugLevelInventory, "item found: %d", fsel);
|
||||
showItems();
|
||||
printItem(fsel, STATUS_BG, STATUS_FG);
|
||||
|
@ -153,29 +153,29 @@ exit_select:
|
|||
* Display inventory items.
|
||||
*/
|
||||
void AgiEngine::inventory() {
|
||||
int old_fg, old_bg;
|
||||
int oldFg, oldBg;
|
||||
int n;
|
||||
|
||||
/* screen is white with black text */
|
||||
old_fg = game.color_fg;
|
||||
old_bg = game.color_bg;
|
||||
game.color_fg = 0;
|
||||
game.color_bg = 15;
|
||||
_gfx->clearScreen(game.color_bg);
|
||||
oldFg = _game.colorFg;
|
||||
oldBg = _game.colorBg;
|
||||
_game.colorFg = 0;
|
||||
_game.colorBg = 15;
|
||||
_gfx->clearScreen(_game.colorBg);
|
||||
|
||||
print_text(YOUHAVE_MSG, 0, YOUHAVE_X, YOUHAVE_Y, 40, STATUS_FG, STATUS_BG);
|
||||
printText(YOUHAVE_MSG, 0, YOUHAVE_X, YOUHAVE_Y, 40, STATUS_FG, STATUS_BG);
|
||||
|
||||
/* FIXME: doesn't check if objects overflow off screen... */
|
||||
|
||||
intobj = (uint8 *) malloc(4 + game.num_objects);
|
||||
memset(intobj, 0, (4 + game.num_objects));
|
||||
_intobj = (uint8 *)malloc(4 + _game.numObjects);
|
||||
memset(_intobj, 0, (4 + _game.numObjects));
|
||||
|
||||
n = showItems();
|
||||
|
||||
if (getflag(F_status_selects_items)) {
|
||||
print_text(SELECT_MSG, 0, SELECT_X, SELECT_Y, 40, STATUS_FG, STATUS_BG);
|
||||
if (getflag(fStatusSelectsItems)) {
|
||||
printText(SELECT_MSG, 0, SELECT_X, SELECT_Y, 40, STATUS_FG, STATUS_BG);
|
||||
} else {
|
||||
print_text(ANY_KEY_MSG, 0, ANY_KEY_X, ANY_KEY_Y, 40, STATUS_FG, STATUS_BG);
|
||||
printText(ANY_KEY_MSG, 0, ANY_KEY_X, ANY_KEY_Y, 40, STATUS_FG, STATUS_BG);
|
||||
}
|
||||
|
||||
_gfx->flushScreen();
|
||||
|
@ -185,21 +185,21 @@ void AgiEngine::inventory() {
|
|||
* var 25 = 0xff.
|
||||
*/
|
||||
|
||||
if (getflag(F_status_selects_items))
|
||||
if (getflag(fStatusSelectsItems))
|
||||
selectItems(n);
|
||||
|
||||
free(intobj);
|
||||
free(_intobj);
|
||||
|
||||
if (!getflag(F_status_selects_items))
|
||||
wait_any_key();
|
||||
if (!getflag(fStatusSelectsItems))
|
||||
waitAnyKey();
|
||||
|
||||
_gfx->clearScreen(0);
|
||||
write_status();
|
||||
_picture->show_pic();
|
||||
game.color_fg = old_fg;
|
||||
game.color_bg = old_bg;
|
||||
game.has_prompt = 0;
|
||||
flush_lines(game.line_user_input, 24);
|
||||
writeStatus();
|
||||
_picture->showPic();
|
||||
_game.colorFg = oldFg;
|
||||
_game.colorBg = oldBg;
|
||||
_game.hasPrompt = 0;
|
||||
flushLines(_game.lineUserInput, 24);
|
||||
}
|
||||
|
||||
} // End of namespace Agi
|
||||
} // End of namespace Agi
|
||||
|
|
|
@ -35,7 +35,7 @@ namespace Agi {
|
|||
/*
|
||||
* IBM-PC keyboard scancodes
|
||||
*/
|
||||
uint8 scancode_table[26] = {
|
||||
uint8 scancodeTable[26] = {
|
||||
30, /* A */
|
||||
48, /* B */
|
||||
46, /* C */
|
||||
|
@ -64,21 +64,21 @@ uint8 scancode_table[26] = {
|
|||
44 /* Z */
|
||||
};
|
||||
|
||||
void AgiEngine::init_words() {
|
||||
game.num_ego_words = 0;
|
||||
void AgiEngine::initWords() {
|
||||
_game.numEgoWords = 0;
|
||||
}
|
||||
|
||||
void AgiEngine::clean_input() {
|
||||
while (game.num_ego_words)
|
||||
free(game.ego_words[--game.num_ego_words].word);
|
||||
void AgiEngine::cleanInput() {
|
||||
while (_game.numEgoWords)
|
||||
free(_game.egoWords[--_game.numEgoWords].word);
|
||||
}
|
||||
|
||||
void AgiEngine::get_string(int x, int y, int len, int str) {
|
||||
new_input_mode(INPUT_GETSTRING);
|
||||
stringdata.x = x;
|
||||
stringdata.y = y;
|
||||
stringdata.len = len;
|
||||
stringdata.str = str;
|
||||
void AgiEngine::getString(int x, int y, int len, int str) {
|
||||
newInputMode(INPUT_GETSTRING);
|
||||
_stringdata.x = x;
|
||||
_stringdata.y = y;
|
||||
_stringdata.len = len;
|
||||
_stringdata.str = str;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -87,7 +87,7 @@ void AgiEngine::get_string(int x, int y, int len, int str) {
|
|||
* It handles console keys and insulates AGI from the console. In the main
|
||||
* loop, handle_keys() handles keyboard input and ego movement.
|
||||
*/
|
||||
int AgiEngine::do_poll_keyboard() {
|
||||
int AgiEngine::doPollKeyboard() {
|
||||
int key = 0;
|
||||
|
||||
/* If a key is ready, rip it */
|
||||
|
@ -99,8 +99,8 @@ int AgiEngine::do_poll_keyboard() {
|
|||
return key;
|
||||
}
|
||||
|
||||
int AgiEngine::handle_controller(int key) {
|
||||
struct vt_entry *v = &game.view_table[0];
|
||||
int AgiEngine::handleController(int key) {
|
||||
struct VtEntry *v = &_game.viewTable[0];
|
||||
int i;
|
||||
|
||||
/* The Black Cauldron needs KEY_ESCAPE to use menus */
|
||||
|
@ -110,22 +110,22 @@ int AgiEngine::handle_controller(int key) {
|
|||
debugC(3, kDebugLevelInput, "key = %04x", key);
|
||||
|
||||
for (i = 0; i < MAX_DIRS; i++) {
|
||||
if (game.ev_keyp[i].data == key) {
|
||||
if (_game.evKeyp[i].data == key) {
|
||||
debugC(3, kDebugLevelInput, "event %d: key press", i);
|
||||
game.ev_keyp[i].occured = true;
|
||||
_game.evKeyp[i].occured = true;
|
||||
report("event AC:%i occured\n", i);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
if (key == BUTTON_LEFT) {
|
||||
if (getflag(F_menus_work) && g_mouse.y <= CHAR_LINES) {
|
||||
new_input_mode(INPUT_MENU);
|
||||
if (getflag(fMenusWork) && g_mouse.y <= CHAR_LINES) {
|
||||
newInputMode(INPUT_MENU);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
if (game.player_control) {
|
||||
if (_game.playerControl) {
|
||||
int d = 0;
|
||||
|
||||
if (!KEY_ASCII(key)) {
|
||||
|
@ -158,16 +158,16 @@ int AgiEngine::handle_controller(int key) {
|
|||
}
|
||||
|
||||
if (key == BUTTON_LEFT &&
|
||||
(int)g_mouse.y >= game.line_user_input * CHAR_LINES &&
|
||||
(int)g_mouse.y <= (game.line_user_input + 1) * CHAR_LINES) {
|
||||
(int)g_mouse.y >= _game.lineUserInput * CHAR_LINES &&
|
||||
(int)g_mouse.y <= (_game.lineUserInput + 1) * CHAR_LINES) {
|
||||
if (predictiveDialog()) {
|
||||
strcpy((char *)game.input_buffer, _predictiveResult);
|
||||
handle_keys(KEY_ENTER);
|
||||
strcpy((char *)_game.inputBuffer, _predictiveResult);
|
||||
handleKeys(KEY_ENTER);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
if (!opt.agimouse) {
|
||||
if (!_opt.agimouse) {
|
||||
/* Handle mouse button events */
|
||||
if (key == BUTTON_LEFT) {
|
||||
v->flags |= ADJ_EGO_XY;
|
||||
|
@ -188,7 +188,7 @@ int AgiEngine::handle_controller(int key) {
|
|||
return false;
|
||||
}
|
||||
|
||||
void AgiEngine::handle_getstring(int key) {
|
||||
void AgiEngine::handleGetstring(int key) {
|
||||
static int pos = 0; /* Cursor position */
|
||||
static char buf[40];
|
||||
|
||||
|
@ -199,42 +199,42 @@ void AgiEngine::handle_getstring(int key) {
|
|||
|
||||
switch (key) {
|
||||
case BUTTON_LEFT:
|
||||
if ((int)g_mouse.y >= stringdata.y * CHAR_LINES &&
|
||||
(int)g_mouse.y <= (stringdata.y + 1) * CHAR_LINES) {
|
||||
if ((int)g_mouse.y >= _stringdata.y * CHAR_LINES &&
|
||||
(int)g_mouse.y <= (_stringdata.y + 1) * CHAR_LINES) {
|
||||
if (predictiveDialog()) {
|
||||
strcpy(game.strings[stringdata.str], _predictiveResult);
|
||||
new_input_mode(INPUT_NORMAL);
|
||||
_gfx->printCharacter(stringdata.x + strlen(game.strings[stringdata.str]) + 1,
|
||||
stringdata.y, ' ', game.color_fg, game.color_bg);
|
||||
strcpy(_game.strings[_stringdata.str], _predictiveResult);
|
||||
newInputMode(INPUT_NORMAL);
|
||||
_gfx->printCharacter(_stringdata.x + strlen(_game.strings[_stringdata.str]) + 1,
|
||||
_stringdata.y, ' ', _game.colorFg, _game.colorBg);
|
||||
return;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case KEY_ENTER:
|
||||
debugC(3, kDebugLevelInput, "KEY_ENTER");
|
||||
game.has_prompt = 0;
|
||||
_game.hasPrompt = 0;
|
||||
buf[pos] = 0;
|
||||
strcpy(game.strings[stringdata.str], buf);
|
||||
strcpy(_game.strings[_stringdata.str], buf);
|
||||
debugC(3, kDebugLevelInput, "buffer=[%s]", buf);
|
||||
buf[pos = 0] = 0;
|
||||
new_input_mode(INPUT_NORMAL);
|
||||
_gfx->printCharacter(stringdata.x + strlen(game.strings[stringdata.str]) + 1,
|
||||
stringdata.y, ' ', game.color_fg, game.color_bg);
|
||||
newInputMode(INPUT_NORMAL);
|
||||
_gfx->printCharacter(_stringdata.x + strlen(_game.strings[_stringdata.str]) + 1,
|
||||
_stringdata.y, ' ', _game.colorFg, _game.colorBg);
|
||||
return;
|
||||
case KEY_ESCAPE:
|
||||
debugC(3, kDebugLevelInput, "KEY_ESCAPE");
|
||||
game.has_prompt = 0;
|
||||
_game.hasPrompt = 0;
|
||||
buf[pos = 0] = 0;
|
||||
strcpy(game.strings[stringdata.str], buf);
|
||||
new_input_mode(INPUT_NORMAL);
|
||||
/* new_input_mode (INPUT_MENU); */
|
||||
strcpy(_game.strings[_stringdata.str], buf);
|
||||
newInputMode(INPUT_NORMAL);
|
||||
/* newInputMode(INPUT_MENU); */
|
||||
break;
|
||||
case KEY_BACKSPACE: /*0x08: */
|
||||
if (!pos)
|
||||
break;
|
||||
|
||||
_gfx->printCharacter(stringdata.x + (pos + 1), stringdata.y,
|
||||
' ', game.color_fg, game.color_bg);
|
||||
_gfx->printCharacter(_stringdata.x + (pos + 1), _stringdata.y,
|
||||
' ', _game.colorFg, _game.colorBg);
|
||||
pos--;
|
||||
buf[pos] = 0;
|
||||
break;
|
||||
|
@ -242,42 +242,42 @@ void AgiEngine::handle_getstring(int key) {
|
|||
if (key < 0x20 || key > 0x7f)
|
||||
break;
|
||||
|
||||
if (pos >= stringdata.len)
|
||||
if (pos >= _stringdata.len)
|
||||
break;
|
||||
|
||||
buf[pos++] = key;
|
||||
buf[pos] = 0;
|
||||
|
||||
/* Echo */
|
||||
_gfx->printCharacter(stringdata.x + pos, stringdata.y, buf[pos - 1],
|
||||
game.color_fg, game.color_bg);
|
||||
_gfx->printCharacter(_stringdata.x + pos, _stringdata.y, buf[pos - 1],
|
||||
_game.colorFg, _game.colorBg);
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
/* print cursor */
|
||||
_gfx->printCharacter(stringdata.x + pos + 1, stringdata.y,
|
||||
(char)game.cursor_char, game.color_fg, game.color_bg);
|
||||
_gfx->printCharacter(_stringdata.x + pos + 1, _stringdata.y,
|
||||
(char)_game.cursorChar, _game.colorFg, _game.colorBg);
|
||||
}
|
||||
|
||||
void AgiEngine::handle_keys(int key) {
|
||||
void AgiEngine::handleKeys(int key) {
|
||||
uint8 *p = NULL;
|
||||
int c = 0;
|
||||
static uint8 formated_entry[256];
|
||||
int l = game.line_user_input;
|
||||
int fg = game.color_fg, bg = game.color_bg;
|
||||
static uint8 formatedEntry[256];
|
||||
int l = _game.lineUserInput;
|
||||
int fg = _game.colorFg, bg = _game.colorBg;
|
||||
|
||||
setvar(V_word_not_found, 0);
|
||||
setvar(vWordNotFound, 0);
|
||||
|
||||
debugC(3, kDebugLevelInput, "handling key: %02x", key);
|
||||
|
||||
switch (key) {
|
||||
case KEY_ENTER:
|
||||
debugC(3, kDebugLevelInput, "KEY_ENTER");
|
||||
game.keypress = 0;
|
||||
_game.keypress = 0;
|
||||
|
||||
/* Remove all leading spaces */
|
||||
for (p = game.input_buffer; *p && *p == 0x20; p++);
|
||||
for (p = _game.inputBuffer; *p && *p == 0x20; p++);
|
||||
|
||||
/* Copy to internal buffer */
|
||||
for (; *p; p++) {
|
||||
|
@ -286,39 +286,39 @@ void AgiEngine::handle_keys(int key) {
|
|||
p++;
|
||||
continue;
|
||||
}
|
||||
formated_entry[c++] = tolower(*p);
|
||||
formatedEntry[c++] = tolower(*p);
|
||||
}
|
||||
formated_entry[c++] = 0;
|
||||
formatedEntry[c++] = 0;
|
||||
|
||||
/* Handle string only if it's not empty */
|
||||
if (formated_entry[0]) {
|
||||
strcpy((char *)game.echo_buffer, (const char *)game.input_buffer);
|
||||
strcpy(last_sentence, (const char *)formated_entry);
|
||||
dictionary_words(last_sentence);
|
||||
if (formatedEntry[0]) {
|
||||
strcpy((char *)_game.echoBuffer, (const char *)_game.inputBuffer);
|
||||
strcpy(_lastSentence, (const char *)formatedEntry);
|
||||
dictionaryWords(_lastSentence);
|
||||
}
|
||||
|
||||
/* Clear to start a new line */
|
||||
game.has_prompt = 0;
|
||||
game.input_buffer[game.cursor_pos = 0] = 0;
|
||||
_game.hasPrompt = 0;
|
||||
_game.inputBuffer[_game.cursorPos = 0] = 0;
|
||||
debugC(3, kDebugLevelInput, "clear lines");
|
||||
clear_lines(l, l + 1, bg);
|
||||
flush_lines(l, l + 1);
|
||||
clearLines(l, l + 1, bg);
|
||||
flushLines(l, l + 1);
|
||||
|
||||
break;
|
||||
case KEY_ESCAPE:
|
||||
debugC(3, kDebugLevelInput, "KEY_ESCAPE");
|
||||
new_input_mode(INPUT_MENU);
|
||||
newInputMode(INPUT_MENU);
|
||||
break;
|
||||
case KEY_BACKSPACE:
|
||||
/* Ignore backspace at start of line */
|
||||
if (game.cursor_pos == 0)
|
||||
if (_game.cursorPos == 0)
|
||||
break;
|
||||
|
||||
/* erase cursor */
|
||||
_gfx->printCharacter(game.cursor_pos + 1, l, ' ', fg, bg);
|
||||
game.input_buffer[--game.cursor_pos] = 0;
|
||||
_gfx->printCharacter(_game.cursorPos + 1, l, ' ', fg, bg);
|
||||
_game.inputBuffer[--_game.cursorPos] = 0;
|
||||
/* Print cursor */
|
||||
_gfx->printCharacter(game.cursor_pos + 1, l, game.cursor_char, fg, bg);
|
||||
_gfx->printCharacter(_game.cursorPos + 1, l, _game.cursorChar, fg, bg);
|
||||
break;
|
||||
default:
|
||||
/* Ignore invalid keystrokes */
|
||||
|
@ -326,22 +326,22 @@ void AgiEngine::handle_keys(int key) {
|
|||
break;
|
||||
|
||||
/* Maximum input size reached */
|
||||
if (game.cursor_pos >= getvar(V_max_input_chars))
|
||||
if (_game.cursorPos >= getvar(vMaxInputChars))
|
||||
break;
|
||||
|
||||
game.input_buffer[game.cursor_pos++] = key;
|
||||
game.input_buffer[game.cursor_pos] = 0;
|
||||
_game.inputBuffer[_game.cursorPos++] = key;
|
||||
_game.inputBuffer[_game.cursorPos] = 0;
|
||||
|
||||
/* echo */
|
||||
_gfx->printCharacter(game.cursor_pos, l, game.input_buffer[game.cursor_pos - 1], fg, bg);
|
||||
_gfx->printCharacter(_game.cursorPos, l, _game.inputBuffer[_game.cursorPos - 1], fg, bg);
|
||||
|
||||
/* Print cursor */
|
||||
_gfx->printCharacter(game.cursor_pos + 1, l, game.cursor_char, fg, bg);
|
||||
_gfx->printCharacter(_game.cursorPos + 1, l, _game.cursorChar, fg, bg);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
int AgiEngine::wait_key() {
|
||||
int AgiEngine::waitKey() {
|
||||
int key;
|
||||
|
||||
/* clear key queue */
|
||||
|
@ -352,7 +352,7 @@ int AgiEngine::wait_key() {
|
|||
debugC(3, kDebugLevelInput, "waiting...");
|
||||
for (;;) {
|
||||
_gfx->pollTimer(); /* msdos driver -> does nothing */
|
||||
key = do_poll_keyboard();
|
||||
key = doPollKeyboard();
|
||||
if (key == KEY_ENTER || key == KEY_ESCAPE || key == BUTTON_LEFT)
|
||||
break;
|
||||
_gfx->doUpdate();
|
||||
|
@ -360,7 +360,7 @@ int AgiEngine::wait_key() {
|
|||
return key;
|
||||
}
|
||||
|
||||
int AgiEngine::wait_any_key() {
|
||||
int AgiEngine::waitAnyKey() {
|
||||
int key;
|
||||
|
||||
/* clear key queue */
|
||||
|
@ -371,7 +371,7 @@ int AgiEngine::wait_any_key() {
|
|||
debugC(3, kDebugLevelInput, "waiting...");
|
||||
for (;;) {
|
||||
_gfx->pollTimer(); /* msdos driver -> does nothing */
|
||||
key = do_poll_keyboard();
|
||||
key = doPollKeyboard();
|
||||
if (key)
|
||||
break;
|
||||
_gfx->doUpdate();
|
||||
|
@ -379,4 +379,4 @@ int AgiEngine::wait_any_key() {
|
|||
return key;
|
||||
}
|
||||
|
||||
} // End of namespace Agi
|
||||
} // End of namespace Agi
|
||||
|
|
|
@ -71,7 +71,7 @@ namespace Agi {
|
|||
#define KEY_SCAN(k) (k >> 8)
|
||||
#define KEY_ASCII(k) (k & 0xff)
|
||||
|
||||
extern uint8 scancode_table[];
|
||||
extern uint8 scancodeTable[];
|
||||
|
||||
} // End of namespace Agi
|
||||
|
||||
|
|
|
@ -34,15 +34,15 @@ namespace Agi {
|
|||
* into a message list.
|
||||
* @param n The number of the logic resource to decode.
|
||||
*/
|
||||
int AgiEngine::decode_logic(int n) {
|
||||
int ec = err_OK;
|
||||
int AgiEngine::decodeLogic(int n) {
|
||||
int ec = errOK;
|
||||
int mstart, mend, mc;
|
||||
uint8 *m0;
|
||||
|
||||
/* decrypt messages at end of logic + build message list */
|
||||
|
||||
/* report ("decoding logic #%d\n", n); */
|
||||
m0 = game.logics[n].data;
|
||||
m0 = _game.logics[n].data;
|
||||
|
||||
mstart = READ_LE_UINT16(m0) + 2;
|
||||
mc = *(m0 + mstart);
|
||||
|
@ -53,41 +53,41 @@ int AgiEngine::decode_logic(int n) {
|
|||
/* if the logic was not compressed, decrypt the text messages
|
||||
* only if there are more than 0 messages
|
||||
*/
|
||||
if ((~game.dir_logic[n].flags & RES_COMPRESSED) && mc > 0)
|
||||
if ((~_game.dirLogic[n].flags & RES_COMPRESSED) && mc > 0)
|
||||
decrypt(m0 + mstart, mend - mstart); /* decrypt messages */
|
||||
|
||||
/* build message list */
|
||||
m0 = game.logics[n].data;
|
||||
m0 = _game.logics[n].data;
|
||||
mstart = READ_LE_UINT16(m0) + 2; /* +2 covers pointer */
|
||||
game.logics[n].num_texts = *(m0 + mstart);
|
||||
_game.logics[n].numTexts = *(m0 + mstart);
|
||||
|
||||
/* resetp logic pointers */
|
||||
game.logics[n].sIP = 2;
|
||||
game.logics[n].cIP = 2;
|
||||
game.logics[n].size = READ_LE_UINT16(m0) + 2; /* logic end pointer */
|
||||
_game.logics[n].sIP = 2;
|
||||
_game.logics[n].cIP = 2;
|
||||
_game.logics[n].size = READ_LE_UINT16(m0) + 2; /* logic end pointer */
|
||||
|
||||
/* allocate list of pointers to point into our data */
|
||||
|
||||
game.logics[n].texts = (const char **)calloc(1 + game.logics[n].num_texts, sizeof(char *));
|
||||
_game.logics[n].texts = (const char **)calloc(1 + _game.logics[n].numTexts, sizeof(char *));
|
||||
|
||||
/* cover header info */
|
||||
m0 += mstart + 3;
|
||||
|
||||
if (game.logics[n].texts != NULL) {
|
||||
if (_game.logics[n].texts != NULL) {
|
||||
/* move list of strings into list to make real pointers */
|
||||
for (mc = 0; mc < game.logics[n].num_texts; mc++) {
|
||||
for (mc = 0; mc < _game.logics[n].numTexts; mc++) {
|
||||
mend = READ_LE_UINT16(m0 + mc * 2);
|
||||
game.logics[n].texts[mc] = mend ? (const char *)m0 + mend - 2 : (const char *)"";
|
||||
_game.logics[n].texts[mc] = mend ? (const char *)m0 + mend - 2 : (const char *)"";
|
||||
}
|
||||
/* set loaded flag now its all completly loaded */
|
||||
game.dir_logic[n].flags |= RES_LOADED;
|
||||
_game.dirLogic[n].flags |= RES_LOADED;
|
||||
} else {
|
||||
/* unload data
|
||||
* blah DF YA WANKER!!@!@# frag. i'm so dumb. not every logic
|
||||
* has text
|
||||
*/
|
||||
free(game.logics[n].data);
|
||||
ec = err_NotEnoughMemory;
|
||||
free(_game.logics[n].data);
|
||||
ec = errNotEnoughMemory;
|
||||
}
|
||||
|
||||
return ec;
|
||||
|
@ -99,18 +99,18 @@ int AgiEngine::decode_logic(int n) {
|
|||
* memory chunks allocated for this resource.
|
||||
* @param n The number of the logic resource to unload
|
||||
*/
|
||||
void AgiEngine::unload_logic(int n) {
|
||||
if (game.dir_logic[n].flags & RES_LOADED) {
|
||||
free(game.logics[n].data);
|
||||
if (game.logics[n].num_texts)
|
||||
free(game.logics[n].texts);
|
||||
game.logics[n].num_texts = 0;
|
||||
game.dir_logic[n].flags &= ~RES_LOADED;
|
||||
void AgiEngine::unloadLogic(int n) {
|
||||
if (_game.dirLogic[n].flags & RES_LOADED) {
|
||||
free(_game.logics[n].data);
|
||||
if (_game.logics[n].numTexts)
|
||||
free(_game.logics[n].texts);
|
||||
_game.logics[n].numTexts = 0;
|
||||
_game.dirLogic[n].flags &= ~RES_LOADED;
|
||||
}
|
||||
|
||||
/* if cached, we end up here */
|
||||
game.logics[n].sIP = 2;
|
||||
game.logics[n].cIP = 2;
|
||||
_game.logics[n].sIP = 2;
|
||||
_game.logics[n].cIP = 2;
|
||||
}
|
||||
|
||||
} // End of namespace Agi
|
||||
} // End of namespace Agi
|
||||
|
|
|
@ -33,12 +33,12 @@ namespace Agi {
|
|||
/**
|
||||
* AGI logic resource structure.
|
||||
*/
|
||||
struct agi_logic {
|
||||
struct AgiLogic {
|
||||
uint8 *data; /**< raw resource data */
|
||||
int size; /**< size of data */
|
||||
int sIP; /**< saved IP */
|
||||
int cIP; /**< current IP */
|
||||
int num_texts; /**< number of messages */
|
||||
int numTexts; /**< number of messages */
|
||||
const char **texts; /**< message list */
|
||||
};
|
||||
|
||||
|
|
|
@ -44,33 +44,33 @@ namespace Agi {
|
|||
#define START_BITS 9
|
||||
|
||||
static int32 BITS, MAX_VALUE, MAX_CODE;
|
||||
static uint32 *prefix_code;
|
||||
static uint8 *append_character;
|
||||
static uint8 *decode_stack;
|
||||
static int32 input_bit_count = 0; /* Number of bits in input bit buffer */
|
||||
static uint32 input_bit_buffer = 0L;
|
||||
static uint32 *prefixCode;
|
||||
static uint8 *appendCharacter;
|
||||
static uint8 *decodeStack;
|
||||
static int32 inputBitCount = 0; /* Number of bits in input bit buffer */
|
||||
static uint32 inputBitBuffer = 0L;
|
||||
|
||||
static void initLZW() {
|
||||
decode_stack = (uint8 *)calloc(1, 8192);
|
||||
prefix_code = (uint32 *)malloc(TABLE_SIZE * sizeof(uint32));
|
||||
append_character = (uint8 *)malloc(TABLE_SIZE * sizeof(uint8));
|
||||
input_bit_count = 0; /* Number of bits in input bit buffer */
|
||||
input_bit_buffer = 0L;
|
||||
decodeStack = (uint8 *)calloc(1, 8192);
|
||||
prefixCode = (uint32 *)malloc(TABLE_SIZE * sizeof(uint32));
|
||||
appendCharacter = (uint8 *)malloc(TABLE_SIZE * sizeof(uint8));
|
||||
inputBitCount = 0; /* Number of bits in input bit buffer */
|
||||
inputBitBuffer = 0L;
|
||||
}
|
||||
|
||||
static void closeLZW() {
|
||||
free(decode_stack);
|
||||
free(prefix_code);
|
||||
free(append_character);
|
||||
free(decodeStack);
|
||||
free(prefixCode);
|
||||
free(appendCharacter);
|
||||
}
|
||||
|
||||
/***************************************************************************
|
||||
** setBITS
|
||||
** setBits
|
||||
**
|
||||
** Purpose: To adjust the number of bits used to store codes to the value
|
||||
** passed in.
|
||||
***************************************************************************/
|
||||
int setBITS(int32 value) {
|
||||
int setBits(int32 value) {
|
||||
if (value == MAXBITS)
|
||||
return true;
|
||||
|
||||
|
@ -88,12 +88,12 @@ int setBITS(int32 value) {
|
|||
** represents. The string is returned as a stack, i.e. the characters are
|
||||
** in reverse order.
|
||||
***************************************************************************/
|
||||
static uint8 *decode_string(uint8 *buffer, uint32 code) {
|
||||
static uint8 *decodeString(uint8 *buffer, uint32 code) {
|
||||
uint32 i;
|
||||
|
||||
for (i = 0; code > 255;) {
|
||||
*buffer++ = append_character[code];
|
||||
code = prefix_code[code];
|
||||
*buffer++ = appendCharacter[code];
|
||||
code = prefixCode[code];
|
||||
if (i++ >= 4000) {
|
||||
fprintf(stderr, "lzw: error in code expansion.\n");
|
||||
abort();
|
||||
|
@ -109,16 +109,16 @@ static uint8 *decode_string(uint8 *buffer, uint32 code) {
|
|||
**
|
||||
** Purpose: To return the next code from the input buffer.
|
||||
***************************************************************************/
|
||||
static uint32 input_code(uint8 **input) {
|
||||
static uint32 inputCode(uint8 **input) {
|
||||
uint32 r;
|
||||
|
||||
while (input_bit_count <= 24) {
|
||||
input_bit_buffer |= (uint32) * (*input)++ << input_bit_count;
|
||||
input_bit_count += 8;
|
||||
while (inputBitCount <= 24) {
|
||||
inputBitBuffer |= (uint32) * (*input)++ << inputBitCount;
|
||||
inputBitCount += 8;
|
||||
}
|
||||
r = (input_bit_buffer & 0x7FFF) % (1 << BITS);
|
||||
input_bit_buffer >>= BITS;
|
||||
input_bit_count -= BITS;
|
||||
r = (inputBitBuffer & 0x7FFF) % (1 << BITS);
|
||||
inputBitBuffer >>= BITS;
|
||||
inputBitCount -= BITS;
|
||||
|
||||
return r;
|
||||
}
|
||||
|
@ -135,57 +135,57 @@ static uint32 input_code(uint8 **input) {
|
|||
** code 256 = start over
|
||||
** code 257 = end of data
|
||||
***************************************************************************/
|
||||
void LZW_expand(uint8 *in, uint8 *out, int32 len) {
|
||||
void lzwExpand(uint8 *in, uint8 *out, int32 len) {
|
||||
int32 c, lzwnext, lzwnew, lzwold;
|
||||
uint8 *s, *end;
|
||||
|
||||
initLZW();
|
||||
|
||||
setBITS(START_BITS); /* Starts at 9-bits */
|
||||
setBits(START_BITS); /* Starts at 9-bits */
|
||||
lzwnext = 257; /* Next available code to define */
|
||||
|
||||
end = (unsigned char *)((long)out + (long)len);
|
||||
|
||||
lzwold = input_code(&in); /* Read in the first code */
|
||||
lzwold = inputCode(&in); /* Read in the first code */
|
||||
c = lzwold;
|
||||
lzwnew = input_code(&in);
|
||||
lzwnew = inputCode(&in);
|
||||
|
||||
while ((out < end) && (lzwnew != 0x101)) {
|
||||
if (lzwnew == 0x100) {
|
||||
/* Code to "start over" */
|
||||
lzwnext = 258;
|
||||
setBITS(START_BITS);
|
||||
lzwold = input_code(&in);
|
||||
setBits(START_BITS);
|
||||
lzwold = inputCode(&in);
|
||||
c = lzwold;
|
||||
*out++ = (char)c;
|
||||
lzwnew = input_code(&in);
|
||||
lzwnew = inputCode(&in);
|
||||
} else {
|
||||
if (lzwnew >= lzwnext) {
|
||||
/* Handles special LZW scenario */
|
||||
*decode_stack = c;
|
||||
s = decode_string(decode_stack + 1, lzwold);
|
||||
*decodeStack = c;
|
||||
s = decodeString(decodeStack + 1, lzwold);
|
||||
} else
|
||||
s = decode_string(decode_stack, lzwnew);
|
||||
s = decodeString(decodeStack, lzwnew);
|
||||
|
||||
/* Reverse order of decoded string and
|
||||
* store in out buffer
|
||||
*/
|
||||
c = *s;
|
||||
while (s >= decode_stack)
|
||||
while (s >= decodeStack)
|
||||
*out++ = *s--;
|
||||
|
||||
if (lzwnext > MAX_CODE)
|
||||
setBITS(BITS + 1);
|
||||
setBits(BITS + 1);
|
||||
|
||||
prefix_code[lzwnext] = lzwold;
|
||||
append_character[lzwnext] = c;
|
||||
prefixCode[lzwnext] = lzwold;
|
||||
appendCharacter[lzwnext] = c;
|
||||
lzwnext++;
|
||||
lzwold = lzwnew;
|
||||
|
||||
lzwnew = input_code(&in);
|
||||
lzwnew = inputCode(&in);
|
||||
}
|
||||
}
|
||||
closeLZW();
|
||||
}
|
||||
|
||||
} // End of namespace Agi
|
||||
} // End of namespace Agi
|
||||
|
|
|
@ -27,7 +27,7 @@
|
|||
|
||||
namespace Agi {
|
||||
|
||||
void LZW_expand(uint8 *, uint8 *, int32);
|
||||
void lzwExpand(uint8 *, uint8 *, int32);
|
||||
|
||||
} // End of namespace Agi
|
||||
|
||||
|
|
|
@ -36,14 +36,14 @@ namespace Agi {
|
|||
|
||||
// TODO: add constructor/destructor for agi_menu, agi_menu_option
|
||||
|
||||
struct agi_menu_option {
|
||||
struct AgiMenuOption {
|
||||
int enabled; /**< option is enabled or disabled */
|
||||
int event; /**< menu event */
|
||||
int index; /**< number of option in this menu */
|
||||
char *text; /**< text of menu option */
|
||||
};
|
||||
|
||||
struct agi_menu {
|
||||
struct AgiMenu {
|
||||
MenuOptionList down; /**< list head for menu options */
|
||||
int index; /**< number of menu in menubar */
|
||||
int width; /**< width of menu in characters */
|
||||
|
@ -53,21 +53,21 @@ struct agi_menu {
|
|||
char *text; /**< menu name */
|
||||
};
|
||||
|
||||
agi_menu *Menu::get_menu(int i) {
|
||||
AgiMenu *Menu::getMenu(int i) {
|
||||
MenuList::iterator iter;
|
||||
for (iter = menubar.begin(); iter != menubar.end(); ++iter) {
|
||||
agi_menu *m = *iter;
|
||||
for (iter = _menubar.begin(); iter != _menubar.end(); ++iter) {
|
||||
AgiMenu *m = *iter;
|
||||
if (m->index == i)
|
||||
return m;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
agi_menu_option *Menu::get_menu_option(int i, int j) {
|
||||
agi_menu *m = get_menu(i);
|
||||
AgiMenuOption *Menu::getMenuOption(int i, int j) {
|
||||
AgiMenu *m = getMenu(i);
|
||||
MenuOptionList::iterator iter;
|
||||
for (iter = m->down.begin(); iter != m->down.end(); ++iter) {
|
||||
agi_menu_option* d = *iter;
|
||||
AgiMenuOption* d = *iter;
|
||||
if (d->index == j)
|
||||
return d;
|
||||
}
|
||||
|
@ -75,59 +75,59 @@ agi_menu_option *Menu::get_menu_option(int i, int j) {
|
|||
return NULL;
|
||||
}
|
||||
|
||||
void Menu::draw_menu_bar() {
|
||||
_vm->clear_lines(0, 0, MENU_BG);
|
||||
_vm->flush_lines(0, 0);
|
||||
void Menu::drawMenuBar() {
|
||||
_vm->clearLines(0, 0, MENU_BG);
|
||||
_vm->flushLines(0, 0);
|
||||
|
||||
MenuList::iterator iter;
|
||||
for (iter = menubar.begin(); iter != menubar.end(); ++iter) {
|
||||
agi_menu *m = *iter;
|
||||
_vm->print_text(m->text, 0, m->col, 0, 40, MENU_FG, MENU_BG);
|
||||
for (iter = _menubar.begin(); iter != _menubar.end(); ++iter) {
|
||||
AgiMenu *m = *iter;
|
||||
_vm->printText(m->text, 0, m->col, 0, 40, MENU_FG, MENU_BG);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void Menu::draw_menu_hilite(int cur_menu) {
|
||||
agi_menu *m = get_menu(cur_menu);
|
||||
void Menu::drawMenuHilite(int curMenu) {
|
||||
AgiMenu *m = getMenu(curMenu);
|
||||
debugC(6, kDebugLevelMenu, "[%s]", m->text);
|
||||
_vm->print_text(m->text, 0, m->col, 0, 40, MENU_BG, MENU_FG);
|
||||
_vm->flush_lines(0, 0);
|
||||
_vm->printText(m->text, 0, m->col, 0, 40, MENU_BG, MENU_FG);
|
||||
_vm->flushLines(0, 0);
|
||||
}
|
||||
|
||||
/* draw box and pulldowns. */
|
||||
void Menu::draw_menu_option(int h_menu) {
|
||||
void Menu::drawMenuOption(int hMenu) {
|
||||
/* find which vertical menu it is */
|
||||
agi_menu *m = get_menu(h_menu);
|
||||
AgiMenu *m = getMenu(hMenu);
|
||||
|
||||
_gfx->drawBox(m->wincol * CHAR_COLS, 1 * CHAR_LINES, (m->wincol + m->width + 2) * CHAR_COLS,
|
||||
(1 + m->height + 2) * CHAR_LINES, MENU_BG, MENU_LINE, 0);
|
||||
|
||||
MenuOptionList::iterator iter;
|
||||
for (iter = m->down.begin(); iter != m->down.end(); ++iter) {
|
||||
agi_menu_option* d = *iter;
|
||||
_vm->print_text(d->text, 0, m->wincol + 1, d->index + 2, m->width + 2,
|
||||
AgiMenuOption* d = *iter;
|
||||
_vm->printText(d->text, 0, m->wincol + 1, d->index + 2, m->width + 2,
|
||||
MENU_FG, MENU_BG, !d->enabled);
|
||||
}
|
||||
}
|
||||
|
||||
void Menu::draw_menu_option_hilite(int h_menu, int v_menu) {
|
||||
agi_menu *m = get_menu(h_menu);
|
||||
agi_menu_option *d = get_menu_option(h_menu, v_menu);
|
||||
void Menu::drawMenuOptionHilite(int hMenu, int vMenu) {
|
||||
AgiMenu *m = getMenu(hMenu);
|
||||
AgiMenuOption *d = getMenuOption(hMenu, vMenu);
|
||||
|
||||
// Disabled menu items are "greyed out" with a checkerboard effect,
|
||||
// rather than having a different colour. -- dsymonds
|
||||
_vm->print_text(d->text, 0, m->wincol + 1, v_menu + 2, m->width + 2,
|
||||
_vm->printText(d->text, 0, m->wincol + 1, vMenu + 2, m->width + 2,
|
||||
MENU_BG, MENU_FG, !d->enabled);
|
||||
}
|
||||
|
||||
void Menu::new_menu_selected(int i) {
|
||||
_picture->show_pic();
|
||||
draw_menu_bar();
|
||||
draw_menu_hilite(i);
|
||||
draw_menu_option(i);
|
||||
void Menu::newMenuSelected(int i) {
|
||||
_picture->showPic();
|
||||
drawMenuBar();
|
||||
drawMenuHilite(i);
|
||||
drawMenuOption(i);
|
||||
}
|
||||
|
||||
bool Menu::mouse_over_text(unsigned int line, unsigned int col, char *s) {
|
||||
bool Menu::mouseOverText(unsigned int line, unsigned int col, char *s) {
|
||||
if (g_mouse.x < col * CHAR_COLS)
|
||||
return false;
|
||||
|
||||
|
@ -169,21 +169,21 @@ Menu::Menu(AgiEngine *vm, GfxMgr *gfx, PictureMgr *picture) {
|
|||
_vm = vm;
|
||||
_gfx = gfx;
|
||||
_picture = picture;
|
||||
h_index = 0;
|
||||
h_col = 1;
|
||||
h_max_menu = 0;
|
||||
h_cur_menu = 0;
|
||||
v_cur_menu = 0;
|
||||
_hIndex = 0;
|
||||
_hCol = 1;
|
||||
_hMaxMenu = 0;
|
||||
_hCurMenu = 0;
|
||||
_vCurMenu = 0;
|
||||
}
|
||||
|
||||
Menu::~Menu() {
|
||||
MenuList::iterator iterh;
|
||||
for (iterh = menubar.reverse_begin(); iterh != menubar.end(); ) {
|
||||
agi_menu *m = *iterh;
|
||||
for (iterh = _menubar.reverse_begin(); iterh != _menubar.end(); ) {
|
||||
AgiMenu *m = *iterh;
|
||||
debugC(3, kDebugLevelMenu, "deiniting hmenu %s", m->text);
|
||||
MenuOptionList::iterator iterv;
|
||||
for (iterv = m->down.reverse_begin(); iterv != m->down.end(); ) {
|
||||
agi_menu_option *d = *iterv;
|
||||
AgiMenuOption *d = *iterv;
|
||||
debugC(3, kDebugLevelMenu, " deiniting vmenu %s", d->text);
|
||||
free(d->text);
|
||||
delete d;
|
||||
|
@ -191,44 +191,44 @@ Menu::~Menu() {
|
|||
}
|
||||
free(m->text);
|
||||
delete m;
|
||||
iterh = menubar.reverse_erase(iterh);
|
||||
iterh = _menubar.reverse_erase(iterh);
|
||||
}
|
||||
}
|
||||
|
||||
void Menu::add(const char *s) {
|
||||
agi_menu *m = new agi_menu;
|
||||
AgiMenu *m = new AgiMenu;
|
||||
m->text = strdup(s);
|
||||
while (m->text[strlen(m->text) - 1] == ' ')
|
||||
m->text[strlen(m->text) - 1] = 0;
|
||||
m->width = 0;
|
||||
m->height = 0;
|
||||
m->index = h_index++;
|
||||
m->col = h_col;
|
||||
m->wincol = h_col - 1;
|
||||
v_index = 0;
|
||||
v_max_menu[m->index] = 0;
|
||||
h_col += strlen(m->text) + 1;
|
||||
h_max_menu = m->index;
|
||||
m->index = _hIndex++;
|
||||
m->col = _hCol;
|
||||
m->wincol = _hCol - 1;
|
||||
_vIndex = 0;
|
||||
_vMaxMenu[m->index] = 0;
|
||||
_hCol += strlen(m->text) + 1;
|
||||
_hMaxMenu = m->index;
|
||||
|
||||
debugC(3, kDebugLevelMenu, "add menu: '%s' %02x", s, m->text[strlen(m->text)]);
|
||||
menubar.push_back(m);
|
||||
_menubar.push_back(m);
|
||||
}
|
||||
|
||||
void Menu::add_item(const char *s, int code) {
|
||||
void Menu::addItem(const char *s, int code) {
|
||||
int l;
|
||||
|
||||
agi_menu_option* d = new agi_menu_option;
|
||||
AgiMenuOption* d = new AgiMenuOption;
|
||||
d->text = strdup(s);
|
||||
d->enabled = true;
|
||||
d->event = code;
|
||||
d->index = v_index++;
|
||||
d->index = _vIndex++;
|
||||
|
||||
// add to last menu in list
|
||||
assert(menubar.reverse_begin() != menubar.end());
|
||||
agi_menu *m = *menubar.reverse_begin();
|
||||
assert(_menubar.reverse_begin() != _menubar.end());
|
||||
AgiMenu *m = *_menubar.reverse_begin();
|
||||
m->height++;
|
||||
|
||||
v_max_menu[m->index] = d->index;
|
||||
_vMaxMenu[m->index] = d->index;
|
||||
|
||||
l = strlen(d->text);
|
||||
if (l > 40)
|
||||
|
@ -249,13 +249,13 @@ void Menu::submit() {
|
|||
|
||||
/* If a menu has no options, delete it */
|
||||
MenuList::iterator iter;
|
||||
for (iter = menubar.reverse_begin(); iter != menubar.end(); ) {
|
||||
agi_menu *m = *iter;
|
||||
for (iter = _menubar.reverse_begin(); iter != _menubar.end(); ) {
|
||||
AgiMenu *m = *iter;
|
||||
if (m->down.empty()) {
|
||||
free(m->text);
|
||||
delete m;
|
||||
h_max_menu--;
|
||||
iter = menubar.reverse_erase(iter);
|
||||
_hMaxMenu--;
|
||||
iter = _menubar.reverse_erase(iter);
|
||||
} else {
|
||||
--iter;
|
||||
}
|
||||
|
@ -263,17 +263,17 @@ void Menu::submit() {
|
|||
}
|
||||
|
||||
bool Menu::keyhandler(int key) {
|
||||
static int clock_val;
|
||||
static int menu_active = false;
|
||||
static int button_used = 0;
|
||||
static int clockVal;
|
||||
static int menuActive = false;
|
||||
static int buttonUsed = 0;
|
||||
|
||||
if (!_vm->getflag(F_menus_work))
|
||||
if (!_vm->getflag(fMenusWork))
|
||||
return false;
|
||||
|
||||
if (!menu_active) {
|
||||
clock_val = _vm->game.clock_enabled;
|
||||
_vm->game.clock_enabled = false;
|
||||
draw_menu_bar();
|
||||
if (!menuActive) {
|
||||
clockVal = _vm->_game.clockEnabled;
|
||||
_vm->_game.clockEnabled = false;
|
||||
drawMenuBar();
|
||||
}
|
||||
/*
|
||||
* Mouse handling
|
||||
|
@ -281,76 +281,76 @@ bool Menu::keyhandler(int key) {
|
|||
if (g_mouse.button) {
|
||||
int hmenu, vmenu;
|
||||
|
||||
button_used = 1; /* Button has been used at least once */
|
||||
buttonUsed = 1; /* Button has been used at least once */
|
||||
if (g_mouse.y <= CHAR_LINES) {
|
||||
/* on the menubar */
|
||||
hmenu = 0;
|
||||
|
||||
MenuList::iterator iterh;
|
||||
for (iterh = menubar.begin(); iterh != menubar.end(); ++iterh) {
|
||||
agi_menu *m = *iterh;
|
||||
if (mouse_over_text(0, m->col, m->text)) {
|
||||
for (iterh = _menubar.begin(); iterh != _menubar.end(); ++iterh) {
|
||||
AgiMenu *m = *iterh;
|
||||
if (mouseOverText(0, m->col, m->text)) {
|
||||
break;
|
||||
} else {
|
||||
hmenu++;
|
||||
}
|
||||
}
|
||||
|
||||
if (hmenu <= h_max_menu) {
|
||||
if (h_cur_menu != hmenu) {
|
||||
v_cur_menu = -1;
|
||||
new_menu_selected(hmenu);
|
||||
if (hmenu <= _hMaxMenu) {
|
||||
if (_hCurMenu != hmenu) {
|
||||
_vCurMenu = -1;
|
||||
newMenuSelected(hmenu);
|
||||
}
|
||||
h_cur_menu = hmenu;
|
||||
_hCurMenu = hmenu;
|
||||
}
|
||||
} else {
|
||||
/* not in menubar */
|
||||
vmenu = 0;
|
||||
|
||||
agi_menu *m = get_menu(h_cur_menu);
|
||||
AgiMenu *m = getMenu(_hCurMenu);
|
||||
MenuOptionList::iterator iterv;
|
||||
for (iterv = m->down.begin(); iterv != m->down.end(); ++iterv) {
|
||||
agi_menu_option *do1 = *iterv;
|
||||
if (mouse_over_text(2 + do1->index, m->wincol + 1, do1->text)) {
|
||||
AgiMenuOption *do1 = *iterv;
|
||||
if (mouseOverText(2 + do1->index, m->wincol + 1, do1->text)) {
|
||||
break;
|
||||
} else {
|
||||
vmenu++;
|
||||
}
|
||||
}
|
||||
|
||||
if (vmenu <= v_max_menu[h_cur_menu]) {
|
||||
if (v_cur_menu != vmenu) {
|
||||
draw_menu_option(h_cur_menu);
|
||||
draw_menu_option_hilite(h_cur_menu, vmenu);
|
||||
if (vmenu <= _vMaxMenu[_hCurMenu]) {
|
||||
if (_vCurMenu != vmenu) {
|
||||
drawMenuOption(_hCurMenu);
|
||||
drawMenuOptionHilite(_hCurMenu, vmenu);
|
||||
}
|
||||
v_cur_menu = vmenu;
|
||||
_vCurMenu = vmenu;
|
||||
}
|
||||
}
|
||||
} else if (button_used) {
|
||||
} else if (buttonUsed) {
|
||||
/* Button released */
|
||||
button_used = 0;
|
||||
buttonUsed = 0;
|
||||
|
||||
debugC(6, kDebugLevelMenu | kDebugLevelInput, "button released!");
|
||||
|
||||
if (v_cur_menu < 0)
|
||||
v_cur_menu = 0;
|
||||
if (_vCurMenu < 0)
|
||||
_vCurMenu = 0;
|
||||
|
||||
draw_menu_option_hilite(h_cur_menu, v_cur_menu);
|
||||
drawMenuOptionHilite(_hCurMenu, _vCurMenu);
|
||||
|
||||
if (g_mouse.y <= CHAR_LINES) {
|
||||
/* on the menubar */
|
||||
} else {
|
||||
/* see which option we selected */
|
||||
agi_menu *m = get_menu(h_cur_menu);
|
||||
AgiMenu *m = getMenu(_hCurMenu);
|
||||
MenuOptionList::iterator iterv;
|
||||
for (iterv = m->down.begin(); iterv != m->down.end(); ++iterv) {
|
||||
agi_menu_option *d = *iterv;
|
||||
if (mouse_over_text(2 + d->index, m->wincol + 1, d->text)) {
|
||||
AgiMenuOption *d = *iterv;
|
||||
if (mouseOverText(2 + d->index, m->wincol + 1, d->text)) {
|
||||
/* activate that option */
|
||||
if (d->enabled) {
|
||||
debugC(6, kDebugLevelMenu | kDebugLevelInput, "event %d registered", d->event);
|
||||
_vm->game.ev_keyp[d->event].occured = true;
|
||||
_vm->game.ev_keyp[d->event].data = d->event;
|
||||
_vm->_game.evKeyp[d->event].occured = true;
|
||||
_vm->_game.evKeyp[d->event].data = d->event;
|
||||
goto exit_menu;
|
||||
}
|
||||
}
|
||||
|
@ -359,14 +359,14 @@ bool Menu::keyhandler(int key) {
|
|||
}
|
||||
}
|
||||
|
||||
if (!menu_active) {
|
||||
if (h_cur_menu >= 0) {
|
||||
draw_menu_hilite(h_cur_menu);
|
||||
draw_menu_option(h_cur_menu);
|
||||
if (!button_used && v_cur_menu >= 0)
|
||||
draw_menu_option_hilite(h_cur_menu, v_cur_menu);
|
||||
if (!menuActive) {
|
||||
if (_hCurMenu >= 0) {
|
||||
drawMenuHilite(_hCurMenu);
|
||||
drawMenuOption(_hCurMenu);
|
||||
if (!buttonUsed && _vCurMenu >= 0)
|
||||
drawMenuOptionHilite(_hCurMenu, _vCurMenu);
|
||||
}
|
||||
menu_active = true;
|
||||
menuActive = true;
|
||||
}
|
||||
|
||||
switch (key) {
|
||||
|
@ -376,68 +376,68 @@ bool Menu::keyhandler(int key) {
|
|||
case KEY_ENTER:
|
||||
{
|
||||
debugC(6, kDebugLevelMenu | kDebugLevelInput, "KEY_ENTER");
|
||||
agi_menu_option* d = get_menu_option(h_cur_menu, v_cur_menu);
|
||||
AgiMenuOption* d = getMenuOption(_hCurMenu, _vCurMenu);
|
||||
if (d->enabled) {
|
||||
debugC(6, kDebugLevelMenu | kDebugLevelInput, "event %d registered", d->event);
|
||||
_vm->game.ev_keyp[d->event].occured = true;
|
||||
_vm->_game.evKeyp[d->event].occured = true;
|
||||
goto exit_menu;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case KEY_DOWN:
|
||||
case KEY_UP:
|
||||
v_cur_menu += key == KEY_DOWN ? 1 : -1;
|
||||
_vCurMenu += key == KEY_DOWN ? 1 : -1;
|
||||
|
||||
if (v_cur_menu < 0)
|
||||
v_cur_menu = v_max_menu[h_cur_menu];
|
||||
if (v_cur_menu > v_max_menu[h_cur_menu])
|
||||
v_cur_menu = 0;
|
||||
if (_vCurMenu < 0)
|
||||
_vCurMenu = _vMaxMenu[_hCurMenu];
|
||||
if (_vCurMenu > _vMaxMenu[_hCurMenu])
|
||||
_vCurMenu = 0;
|
||||
|
||||
draw_menu_option(h_cur_menu);
|
||||
draw_menu_option_hilite(h_cur_menu, v_cur_menu);
|
||||
drawMenuOption(_hCurMenu);
|
||||
drawMenuOptionHilite(_hCurMenu, _vCurMenu);
|
||||
break;
|
||||
case KEY_RIGHT:
|
||||
case KEY_LEFT:
|
||||
h_cur_menu += key == KEY_RIGHT ? 1 : -1;
|
||||
_hCurMenu += key == KEY_RIGHT ? 1 : -1;
|
||||
|
||||
if (h_cur_menu < 0)
|
||||
h_cur_menu = h_max_menu;
|
||||
if (h_cur_menu > h_max_menu)
|
||||
h_cur_menu = 0;
|
||||
if (_hCurMenu < 0)
|
||||
_hCurMenu = _hMaxMenu;
|
||||
if (_hCurMenu > _hMaxMenu)
|
||||
_hCurMenu = 0;
|
||||
|
||||
v_cur_menu = 0;
|
||||
new_menu_selected(h_cur_menu);
|
||||
draw_menu_option_hilite(h_cur_menu, v_cur_menu);
|
||||
_vCurMenu = 0;
|
||||
newMenuSelected(_hCurMenu);
|
||||
drawMenuOptionHilite(_hCurMenu, _vCurMenu);
|
||||
break;
|
||||
}
|
||||
|
||||
return true;
|
||||
|
||||
exit_menu:
|
||||
button_used = 0;
|
||||
_picture->show_pic();
|
||||
_vm->write_status();
|
||||
buttonUsed = 0;
|
||||
_picture->showPic();
|
||||
_vm->writeStatus();
|
||||
|
||||
_vm->setvar(V_key, 0);
|
||||
_vm->game.keypress = 0;
|
||||
_vm->game.clock_enabled = clock_val;
|
||||
_vm->old_input_mode();
|
||||
debugC(3, kDebugLevelMenu, "exit_menu: input mode reset to %d", _vm->game.input_mode);
|
||||
menu_active = false;
|
||||
_vm->setvar(vKey, 0);
|
||||
_vm->_game.keypress = 0;
|
||||
_vm->_game.clockEnabled = clockVal;
|
||||
_vm->oldInputMode();
|
||||
debugC(3, kDebugLevelMenu, "exit_menu: input mode reset to %d", _vm->_game.inputMode);
|
||||
menuActive = false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void Menu::set_item(int event, int state) {
|
||||
void Menu::setItem(int event, int state) {
|
||||
/* scan all menus for event number # */
|
||||
|
||||
debugC(6, kDebugLevelMenu, "event = %d, state = %d", event, state);
|
||||
MenuList::iterator iterh;
|
||||
for (iterh = menubar.begin(); iterh != menubar.end(); ++iterh) {
|
||||
agi_menu *m = *iterh;
|
||||
for (iterh = _menubar.begin(); iterh != _menubar.end(); ++iterh) {
|
||||
AgiMenu *m = *iterh;
|
||||
MenuOptionList::iterator iterv;
|
||||
for (iterv = m->down.begin(); iterv != m->down.end(); ++iterv) {
|
||||
agi_menu_option *d = *iterv;
|
||||
AgiMenuOption *d = *iterv;
|
||||
if (d->event == event) {
|
||||
d->enabled = state;
|
||||
// keep going; we need to set the state of every menu item
|
||||
|
@ -447,16 +447,16 @@ void Menu::set_item(int event, int state) {
|
|||
}
|
||||
}
|
||||
|
||||
void Menu::enable_all() {
|
||||
void Menu::enableAll() {
|
||||
MenuList::iterator iterh;
|
||||
for (iterh = menubar.begin(); iterh != menubar.end(); ++iterh) {
|
||||
agi_menu *m = *iterh;
|
||||
for (iterh = _menubar.begin(); iterh != _menubar.end(); ++iterh) {
|
||||
AgiMenu *m = *iterh;
|
||||
MenuOptionList::iterator iterv;
|
||||
for (iterv = m->down.begin(); iterv != m->down.end(); ++iterv) {
|
||||
agi_menu_option *d = *iterv;
|
||||
AgiMenuOption *d = *iterv;
|
||||
d->enabled = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
} // End of namespace Agi
|
||||
} // End of namespace Agi
|
||||
|
|
|
@ -35,10 +35,10 @@ namespace Agi {
|
|||
#define MENU_FG 0x00 /* Black */
|
||||
#define MENU_LINE 0x00 /* Black */
|
||||
|
||||
struct agi_menu;
|
||||
struct agi_menu_option;
|
||||
typedef Common::List<agi_menu*> MenuList;
|
||||
typedef Common::List<agi_menu_option*> MenuOptionList;
|
||||
struct AgiMenu;
|
||||
struct AgiMenuOption;
|
||||
typedef Common::List<AgiMenu*> MenuList;
|
||||
typedef Common::List<AgiMenuOption*> MenuOptionList;
|
||||
|
||||
class GfxMgr;
|
||||
class PictureMgr;
|
||||
|
@ -54,35 +54,35 @@ public:
|
|||
~Menu();
|
||||
|
||||
void add(const char *s);
|
||||
void add_item(const char *s, int code);
|
||||
void addItem(const char *s, int code);
|
||||
void submit();
|
||||
void set_item(int event, int state);
|
||||
void setItem(int event, int state);
|
||||
bool keyhandler(int key);
|
||||
void enable_all();
|
||||
void enableAll();
|
||||
|
||||
private:
|
||||
MenuList menubar;
|
||||
MenuList _menubar;
|
||||
|
||||
int h_cur_menu;
|
||||
int v_cur_menu;
|
||||
int _hCurMenu;
|
||||
int _vCurMenu;
|
||||
|
||||
int h_index;
|
||||
int v_index;
|
||||
int h_col;
|
||||
int h_max_menu;
|
||||
int v_max_menu[10];
|
||||
int _hIndex;
|
||||
int _vIndex;
|
||||
int _hCol;
|
||||
int _hMaxMenu;
|
||||
int _vMaxMenu[10];
|
||||
|
||||
agi_menu* get_menu(int i);
|
||||
agi_menu_option *get_menu_option(int i, int j);
|
||||
void draw_menu_bar();
|
||||
void draw_menu_hilite(int cur_menu);
|
||||
void draw_menu_option(int h_menu);
|
||||
void draw_menu_option_hilite(int h_menu, int v_menu);
|
||||
void new_menu_selected(int i);
|
||||
bool mouse_over_text(unsigned int line, unsigned int col, char *s);
|
||||
AgiMenu* getMenu(int i);
|
||||
AgiMenuOption *getMenuOption(int i, int j);
|
||||
void drawMenuBar();
|
||||
void drawMenuHilite(int curMenu);
|
||||
void drawMenuOption(int hMenu);
|
||||
void drawMenuOptionHilite(int hMenu, int vMenu);
|
||||
void newMenuSelected(int i);
|
||||
bool mouseOverText(unsigned int line, unsigned int col, char *s);
|
||||
|
||||
};
|
||||
|
||||
} // End of namespace Agi
|
||||
} // End of namespace Agi
|
||||
|
||||
#endif /* AGI_MENU_H */
|
||||
#endif /* AGI_MENU_H */
|
||||
|
|
|
@ -28,43 +28,43 @@
|
|||
|
||||
namespace Agi {
|
||||
|
||||
int AgiEngine::check_step(int delta, int step) {
|
||||
int AgiEngine::checkStep(int delta, int step) {
|
||||
return (-step >= delta) ? 0 : (step <= delta) ? 2 : 1;
|
||||
}
|
||||
|
||||
int AgiEngine::check_block(int x, int y) {
|
||||
if (x <= game.block.x1 || x >= game.block.x2)
|
||||
int AgiEngine::checkBlock(int x, int y) {
|
||||
if (x <= _game.block.x1 || x >= _game.block.x2)
|
||||
return false;
|
||||
|
||||
if (y <= game.block.y1 || y >= game.block.y2)
|
||||
if (y <= _game.block.y1 || y >= _game.block.y2)
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void AgiEngine::changepos(struct vt_entry *v) {
|
||||
void AgiEngine::changePos(struct VtEntry *v) {
|
||||
int b, x, y;
|
||||
int dx[9] = { 0, 0, 1, 1, 1, 0, -1, -1, -1 };
|
||||
int dy[9] = { 0, -1, -1, 0, 1, 1, 1, 0, -1 };
|
||||
|
||||
x = v->x_pos;
|
||||
y = v->y_pos;
|
||||
b = check_block(x, y);
|
||||
x = v->xPos;
|
||||
y = v->yPos;
|
||||
b = checkBlock(x, y);
|
||||
|
||||
x += v->step_size * dx[v->direction];
|
||||
y += v->step_size * dy[v->direction];
|
||||
x += v->stepSize * dx[v->direction];
|
||||
y += v->stepSize * dy[v->direction];
|
||||
|
||||
if (check_block(x, y) == b) {
|
||||
if (checkBlock(x, y) == b) {
|
||||
v->flags &= ~MOTION;
|
||||
} else {
|
||||
v->flags |= MOTION;
|
||||
v->direction = 0;
|
||||
if (is_ego_view(v))
|
||||
game.vars[V_ego_dir] = 0;
|
||||
if (isEgoView(v))
|
||||
_game.vars[vEgoDir] = 0;
|
||||
}
|
||||
}
|
||||
|
||||
void AgiEngine::motion_wander(struct vt_entry *v) {
|
||||
void AgiEngine::motionWander(struct VtEntry *v) {
|
||||
if (v->parm1--) {
|
||||
if (~v->flags & DIDNT_MOVE)
|
||||
return;
|
||||
|
@ -72,27 +72,27 @@ void AgiEngine::motion_wander(struct vt_entry *v) {
|
|||
|
||||
v->direction = _rnd->getRandomNumber(8);
|
||||
|
||||
if (is_ego_view(v)) {
|
||||
game.vars[V_ego_dir] = v->direction;
|
||||
if (isEgoView(v)) {
|
||||
_game.vars[vEgoDir] = v->direction;
|
||||
while (v->parm1 < 6) {
|
||||
v->parm1 = _rnd->getRandomNumber(50); /* huh? */
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void AgiEngine::motion_followego(struct vt_entry *v) {
|
||||
int ego_x, ego_y;
|
||||
int obj_x, obj_y;
|
||||
void AgiEngine::motionFollowEgo(struct VtEntry *v) {
|
||||
int egoX, egoY;
|
||||
int objX, objY;
|
||||
int dir;
|
||||
|
||||
ego_x = game.view_table[0].x_pos + game.view_table[0].x_size / 2;
|
||||
ego_y = game.view_table[0].y_pos;
|
||||
egoX = _game.viewTable[0].xPos + _game.viewTable[0].xSize / 2;
|
||||
egoY = _game.viewTable[0].yPos;
|
||||
|
||||
obj_x = v->x_pos + v->x_size / 2;
|
||||
obj_y = v->y_pos;
|
||||
objX = v->xPos + v->xSize / 2;
|
||||
objY = v->yPos;
|
||||
|
||||
/* Get direction to reach ego */
|
||||
dir = get_direction(obj_x, obj_y, ego_x, ego_y, v->parm1);
|
||||
dir = getDirection(objX, objY, egoX, egoY, v->parm1);
|
||||
|
||||
/* Already at ego coordinates */
|
||||
if (dir == 0) {
|
||||
|
@ -110,14 +110,14 @@ void AgiEngine::motion_followego(struct vt_entry *v) {
|
|||
while ((v->direction = _rnd->getRandomNumber(8)) == 0) {
|
||||
}
|
||||
|
||||
d = (abs(ego_y - obj_y) + abs(ego_x - obj_x)) / 2;
|
||||
d = (abs(egoY - objY) + abs(egoX - objX)) / 2;
|
||||
|
||||
if (d < v->step_size) {
|
||||
v->parm3 = v->step_size;
|
||||
if (d < v->stepSize) {
|
||||
v->parm3 = v->stepSize;
|
||||
return;
|
||||
}
|
||||
|
||||
while ((v->parm3 = _rnd->getRandomNumber(d)) < v->step_size) {
|
||||
while ((v->parm3 = _rnd->getRandomNumber(d)) < v->stepSize) {
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
@ -132,7 +132,7 @@ void AgiEngine::motion_followego(struct vt_entry *v) {
|
|||
* v->parm3 = 0;
|
||||
*/
|
||||
k = v->parm3;
|
||||
k -= v->step_size;
|
||||
k -= v->stepSize;
|
||||
v->parm3 = k;
|
||||
|
||||
if ((int8) v->parm3 < 0)
|
||||
|
@ -142,32 +142,32 @@ void AgiEngine::motion_followego(struct vt_entry *v) {
|
|||
}
|
||||
}
|
||||
|
||||
void AgiEngine::motion_moveobj(struct vt_entry *v) {
|
||||
v->direction = get_direction(v->x_pos, v->y_pos, v->parm1, v->parm2, v->step_size);
|
||||
void AgiEngine::motionMoveObj(struct VtEntry *v) {
|
||||
v->direction = getDirection(v->xPos, v->yPos, v->parm1, v->parm2, v->stepSize);
|
||||
|
||||
/* Update V6 if ego */
|
||||
if (is_ego_view(v))
|
||||
game.vars[V_ego_dir] = v->direction;
|
||||
if (isEgoView(v))
|
||||
_game.vars[vEgoDir] = v->direction;
|
||||
|
||||
if (v->direction == 0)
|
||||
in_destination(v);
|
||||
inDestination(v);
|
||||
}
|
||||
|
||||
void AgiEngine::check_motion(struct vt_entry *v) {
|
||||
void AgiEngine::checkMotion(struct VtEntry *v) {
|
||||
switch (v->motion) {
|
||||
case MOTION_WANDER:
|
||||
motion_wander(v);
|
||||
motionWander(v);
|
||||
break;
|
||||
case MOTION_FOLLOW_EGO:
|
||||
motion_followego(v);
|
||||
motionFollowEgo(v);
|
||||
break;
|
||||
case MOTION_MOVE_OBJ:
|
||||
motion_moveobj(v);
|
||||
motionMoveObj(v);
|
||||
break;
|
||||
}
|
||||
|
||||
if ((game.block.active && (~v->flags & IGNORE_BLOCKS)) && v->direction)
|
||||
changepos(v);
|
||||
if ((_game.block.active && (~v->flags & IGNORE_BLOCKS)) && v->direction)
|
||||
changePos(v);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -177,13 +177,13 @@ void AgiEngine::check_motion(struct vt_entry *v) {
|
|||
/**
|
||||
*
|
||||
*/
|
||||
void AgiEngine::check_all_motions() {
|
||||
struct vt_entry *v;
|
||||
void AgiEngine::checkAllMotions() {
|
||||
struct VtEntry *v;
|
||||
|
||||
for (v = game.view_table; v < &game.view_table[MAX_VIEWTABLE]; v++) {
|
||||
for (v = _game.viewTable; v < &_game.viewTable[MAX_VIEWTABLE]; v++) {
|
||||
if ((v->flags & (ANIMATED | UPDATE | DRAWN)) == (ANIMATED | UPDATE | DRAWN)
|
||||
&& v->step_time_count == 1) {
|
||||
check_motion(v);
|
||||
&& v->stepTimeCount == 1) {
|
||||
checkMotion(v);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -194,14 +194,14 @@ void AgiEngine::check_all_motions() {
|
|||
* type motion that * has reached its final destination coordinates.
|
||||
* @param v Pointer to view table entry
|
||||
*/
|
||||
void AgiEngine::in_destination(struct vt_entry *v) {
|
||||
void AgiEngine::inDestination(struct VtEntry *v) {
|
||||
if (v->motion == MOTION_MOVE_OBJ) {
|
||||
v->step_size = v->parm3;
|
||||
v->stepSize = v->parm3;
|
||||
setflag(v->parm4, true);
|
||||
}
|
||||
v->motion = MOTION_NORMAL;
|
||||
if (is_ego_view(v))
|
||||
game.player_control = true;
|
||||
if (isEgoView(v))
|
||||
_game.playerControl = true;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -210,8 +210,8 @@ void AgiEngine::in_destination(struct vt_entry *v) {
|
|||
* after setting the motion mode to MOTION_MOVE_OBJ.
|
||||
* @param v Pointer to view table entry
|
||||
*/
|
||||
void AgiEngine::move_obj(struct vt_entry *v) {
|
||||
motion_moveobj(v);
|
||||
void AgiEngine::moveObj(struct VtEntry *v) {
|
||||
motionMoveObj(v);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -224,9 +224,9 @@ void AgiEngine::move_obj(struct vt_entry *v) {
|
|||
* @param y y coordinate of the object
|
||||
* @param s step size
|
||||
*/
|
||||
int AgiEngine::get_direction(int x0, int y0, int x, int y, int s) {
|
||||
int dir_table[9] = { 8, 1, 2, 7, 0, 3, 6, 5, 4 };
|
||||
return dir_table[check_step(x - x0, s) + 3 * check_step(y - y0, s)];
|
||||
int AgiEngine::getDirection(int x0, int y0, int x, int y, int s) {
|
||||
int dirTable[9] = { 8, 1, 2, 7, 0, 3, 6, 5, 4 };
|
||||
return dirTable[checkStep(x - x0, s) + 3 * checkStep(y - y0, s)];
|
||||
}
|
||||
|
||||
} // End of namespace Agi
|
||||
} // End of namespace Agi
|
||||
|
|
|
@ -28,20 +28,20 @@
|
|||
|
||||
namespace Agi {
|
||||
|
||||
int AgiEngine::alloc_objects(int n) {
|
||||
if ((objects = (agi_object *)calloc(n, sizeof(struct agi_object))) == NULL)
|
||||
return err_NotEnoughMemory;
|
||||
int AgiEngine::allocObjects(int n) {
|
||||
if ((_objects = (AgiObject *)calloc(n, sizeof(struct AgiObject))) == NULL)
|
||||
return errNotEnoughMemory;
|
||||
|
||||
return err_OK;
|
||||
return errOK;
|
||||
}
|
||||
|
||||
int AgiEngine::decode_objects(uint8 *mem, uint32 flen) {
|
||||
int AgiEngine::decodeObjects(uint8 *mem, uint32 flen) {
|
||||
unsigned int i, so, padsize;
|
||||
|
||||
padsize = game.game_flags & ID_AMIGA ? 4 : 3;
|
||||
padsize = _game.gameFlags & ID_AMIGA ? 4 : 3;
|
||||
|
||||
game.num_objects = 0;
|
||||
objects = NULL;
|
||||
_game.numObjects = 0;
|
||||
_objects = NULL;
|
||||
|
||||
/* check if first pointer exceeds file size
|
||||
* if so, its encrypted, else it is not
|
||||
|
@ -58,49 +58,48 @@ int AgiEngine::decode_objects(uint8 *mem, uint32 flen) {
|
|||
*/
|
||||
if (READ_LE_UINT16(mem) / padsize >= 256) {
|
||||
/* die with no error! AGDS game needs not to die to work!! :( */
|
||||
return err_OK;
|
||||
return errOK;
|
||||
}
|
||||
|
||||
game.num_objects = READ_LE_UINT16(mem) / padsize;
|
||||
debugC(5, kDebugLevelResources, "num_objects = %d (padsize = %d)", game.num_objects, padsize);
|
||||
_game.numObjects = READ_LE_UINT16(mem) / padsize;
|
||||
debugC(5, kDebugLevelResources, "num_objects = %d (padsize = %d)", _game.numObjects, padsize);
|
||||
|
||||
if (alloc_objects(game.num_objects) != err_OK)
|
||||
return err_NotEnoughMemory;
|
||||
if (allocObjects(_game.numObjects) != errOK)
|
||||
return errNotEnoughMemory;
|
||||
|
||||
/* build the object list */
|
||||
for (i = 0, so = padsize; i < game.num_objects; i++, so += padsize) {
|
||||
for (i = 0, so = padsize; i < _game.numObjects; i++, so += padsize) {
|
||||
int offset;
|
||||
|
||||
(objects + i)->location = *(mem + so + 2);
|
||||
(_objects + i)->location = *(mem + so + 2);
|
||||
offset = READ_LE_UINT16(mem + so) + padsize;
|
||||
|
||||
if ((uint) offset < flen) {
|
||||
(objects + i)->name = (char *)strdup((const char *)mem + offset);
|
||||
(_objects + i)->name = (char *)strdup((const char *)mem + offset);
|
||||
} else {
|
||||
printf("ERROR: object %i name beyond object filesize! "
|
||||
"(%04x > %04x)\n", i, offset, flen);
|
||||
(objects + i)->name = strdup("");
|
||||
(_objects + i)->name = strdup("");
|
||||
}
|
||||
}
|
||||
report("Reading objects: %d objects read.\n", game.num_objects);
|
||||
|
||||
return err_OK;
|
||||
report("Reading objects: %d objects read.\n", _game.numObjects);
|
||||
|
||||
return errOK;
|
||||
}
|
||||
|
||||
int AgiEngine::load_objects(const char *fname) {
|
||||
int AgiEngine::loadObjects(const char *fname) {
|
||||
Common::File fp;
|
||||
uint32 flen;
|
||||
uint8 *mem;
|
||||
|
||||
objects = NULL;
|
||||
game.num_objects = 0;
|
||||
_objects = NULL;
|
||||
_game.numObjects = 0;
|
||||
|
||||
debugC(5, kDebugLevelResources, "(fname = %s)", fname);
|
||||
report("Loading objects: %s\n", fname);
|
||||
|
||||
if (!fp.open(fname))
|
||||
return err_BadFileOpen;
|
||||
return errBadFileOpen;
|
||||
|
||||
fp.seek(0, SEEK_END);
|
||||
flen = fp.pos();
|
||||
|
@ -108,52 +107,52 @@ int AgiEngine::load_objects(const char *fname) {
|
|||
|
||||
if ((mem = (uint8 *)calloc(1, flen + 32)) == NULL) {
|
||||
fp.close();
|
||||
return err_NotEnoughMemory;
|
||||
return errNotEnoughMemory;
|
||||
}
|
||||
|
||||
fp.read(mem, flen);
|
||||
fp.close();
|
||||
|
||||
decode_objects(mem, flen);
|
||||
decodeObjects(mem, flen);
|
||||
free(mem);
|
||||
return err_OK;
|
||||
return errOK;
|
||||
}
|
||||
|
||||
void AgiEngine::unload_objects() {
|
||||
void AgiEngine::unloadObjects() {
|
||||
unsigned int i;
|
||||
|
||||
if (objects != NULL) {
|
||||
for (i = 0; i < game.num_objects; i++) {
|
||||
free(objects[i].name);
|
||||
objects[i].name = NULL;
|
||||
if (_objects != NULL) {
|
||||
for (i = 0; i < _game.numObjects; i++) {
|
||||
free(_objects[i].name);
|
||||
_objects[i].name = NULL;
|
||||
}
|
||||
free(objects);
|
||||
objects = NULL;
|
||||
free(_objects);
|
||||
_objects = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
void AgiEngine::object_set_location(unsigned int n, int i) {
|
||||
if (n >= game.num_objects) {
|
||||
void AgiEngine::objectSetLocation(unsigned int n, int i) {
|
||||
if (n >= _game.numObjects) {
|
||||
report("Error: Can't access object %d.\n", n);
|
||||
return;
|
||||
}
|
||||
objects[n].location = i;
|
||||
_objects[n].location = i;
|
||||
}
|
||||
|
||||
int AgiEngine::object_get_location(unsigned int n) {
|
||||
if (n >= game.num_objects) {
|
||||
int AgiEngine::objectGetLocation(unsigned int n) {
|
||||
if (n >= _game.numObjects) {
|
||||
report("Error: Can't access object %d.\n", n);
|
||||
return 0;
|
||||
}
|
||||
return objects[n].location;
|
||||
return _objects[n].location;
|
||||
}
|
||||
|
||||
const char *AgiEngine::object_name(unsigned int n) {
|
||||
if (n >= game.num_objects) {
|
||||
const char *AgiEngine::objectName(unsigned int n) {
|
||||
if (n >= _game.numObjects) {
|
||||
report("Error: Can't access object %d.\n", n);
|
||||
return "";
|
||||
}
|
||||
return objects[n].name;
|
||||
return _objects[n].name;
|
||||
}
|
||||
|
||||
} // End of namespace Agi
|
||||
} // End of namespace Agi
|
||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -30,7 +30,7 @@
|
|||
namespace Agi {
|
||||
|
||||
static AgiEngine *g_agi;
|
||||
#define game g_agi->game
|
||||
#define game g_agi->_game
|
||||
|
||||
#define ip (game.logics[lognum].cIP)
|
||||
#define code (game.logics[lognum].data)
|
||||
|
@ -41,7 +41,7 @@ static AgiEngine *g_agi;
|
|||
|
||||
#define _L(a,b,c) { a, b, c }
|
||||
|
||||
struct agi_logicnames logic_names_test[] = {
|
||||
struct AgiLogicnames logicNamesTest[] = {
|
||||
_L("", 0, 0x00),
|
||||
_L("equaln", 2, 0x80),
|
||||
_L("equalv", 2, 0xC0),
|
||||
|
@ -66,14 +66,14 @@ struct agi_logicnames logic_names_test[] = {
|
|||
_L("right.posn", 5, 0x00)
|
||||
};
|
||||
|
||||
struct agi_logicnames logic_names_if[] = {
|
||||
struct AgiLogicnames logicNamesIf[] = {
|
||||
_L("OR", 0, 0x00),
|
||||
_L("NOT", 0, 0x00),
|
||||
_L("ELSE", 0, 0x00),
|
||||
_L("IF", 0, 0x00)
|
||||
};
|
||||
|
||||
struct agi_logicnames logic_names_cmd[] = {
|
||||
struct AgiLogicnames logicNamesCmd[] = {
|
||||
_L("return", 0, 0x00), /* 00 */
|
||||
_L("increment", 1, 0x80), /* 01 */
|
||||
_L("decrement", 1, 0x80), /* 02 */
|
||||
|
@ -269,9 +269,9 @@ struct agi_logicnames logic_names_cmd[] = {
|
|||
_L(NULL, 0, 0x00)
|
||||
};
|
||||
|
||||
void AgiEngine::debug_console(int lognum, int mode, const char *str) {
|
||||
void AgiEngine::debugConsole(int lognum, int mode, const char *str) {
|
||||
g_agi = this;
|
||||
agi_logicnames *x;
|
||||
AgiLogicnames *x;
|
||||
uint8 a, c, z;
|
||||
|
||||
if (str) {
|
||||
|
@ -286,9 +286,9 @@ void AgiEngine::debug_console(int lognum, int mode, const char *str) {
|
|||
case 0xFD:
|
||||
case 0xFE:
|
||||
case 0xFF:
|
||||
x = logic_names_if;
|
||||
x = logicNamesIf;
|
||||
|
||||
if (g_agi->_debug.opcodes) {
|
||||
if (_debug.opcodes) {
|
||||
report("%02X %02X %02X %02X %02X %02X %02X %02X %02X\n"
|
||||
" ",
|
||||
(uint8) * (code + (0 + ip)) & 0xFF,
|
||||
|
@ -304,22 +304,22 @@ void AgiEngine::debug_console(int lognum, int mode, const char *str) {
|
|||
report("%s ", (x + *(code + ip) - 0xFC)->name);
|
||||
break;
|
||||
default:
|
||||
x = mode == lCOMMAND_MODE ? logic_names_cmd : logic_names_test;
|
||||
a = (unsigned char)(x + *(code + ip))->num_args;
|
||||
c = (unsigned char)(x + *(code + ip))->arg_mask;
|
||||
x = mode == lCOMMAND_MODE ? logicNamesCmd : logicNamesTest;
|
||||
a = (unsigned char)(x + *(code + ip))->numArgs;
|
||||
c = (unsigned char)(x + *(code + ip))->argMask;
|
||||
|
||||
if (g_agi->_debug.opcodes) {
|
||||
if (_debug.opcodes) {
|
||||
report("%02X %02X %02X %02X %02X %02X %02X %02X %02X\n"
|
||||
" ",
|
||||
(uint8) * (code + (0 + ip)) & 0xFF,
|
||||
(uint8) * (code + (1 + ip)) & 0xFF,
|
||||
(uint8) * (code + (2 + ip)) & 0xFF,
|
||||
(uint8) * (code + (3 + ip)) & 0xFF,
|
||||
(uint8) * (code + (4 + ip)) & 0xFF,
|
||||
(uint8) * (code + (5 + ip)) & 0xFF,
|
||||
(uint8) * (code + (6 + ip)) & 0xFF,
|
||||
(uint8) * (code + (7 + ip)) & 0xFF,
|
||||
(uint8) * (code + (8 + ip)) & 0xFF);
|
||||
(uint8)*(code + (0 + ip)) & 0xFF,
|
||||
(uint8)*(code + (1 + ip)) & 0xFF,
|
||||
(uint8)*(code + (2 + ip)) & 0xFF,
|
||||
(uint8)*(code + (3 + ip)) & 0xFF,
|
||||
(uint8)*(code + (4 + ip)) & 0xFF,
|
||||
(uint8)*(code + (5 + ip)) & 0xFF,
|
||||
(uint8)*(code + (6 + ip)) & 0xFF,
|
||||
(uint8)*(code + (7 + ip)) & 0xFF,
|
||||
(uint8)*(code + (8 + ip)) & 0xFF);
|
||||
}
|
||||
report("%s ", (x + *(code + ip))->name);
|
||||
|
||||
|
@ -340,4 +340,4 @@ void AgiEngine::debug_console(int lognum, int mode, const char *str) {
|
|||
report("\n");
|
||||
}
|
||||
|
||||
} // End of namespace Agi
|
||||
} // End of namespace Agi
|
||||
|
|
|
@ -30,31 +30,31 @@
|
|||
|
||||
namespace Agi {
|
||||
|
||||
static uint8 test_obj_right(uint8, uint8, uint8, uint8, uint8);
|
||||
static uint8 test_obj_centre(uint8, uint8, uint8, uint8, uint8);
|
||||
static uint8 test_obj_in_box(uint8, uint8, uint8, uint8, uint8);
|
||||
static uint8 test_posn(uint8, uint8, uint8, uint8, uint8);
|
||||
static uint8 test_said(uint8, uint8 *);
|
||||
static uint8 test_controller(uint8);
|
||||
static uint8 test_keypressed(void);
|
||||
static uint8 test_compare_strings(uint8, uint8);
|
||||
static uint8 testObjRight(uint8, uint8, uint8, uint8, uint8);
|
||||
static uint8 testObjCentre(uint8, uint8, uint8, uint8, uint8);
|
||||
static uint8 testObjInBox(uint8, uint8, uint8, uint8, uint8);
|
||||
static uint8 testPosn(uint8, uint8, uint8, uint8, uint8);
|
||||
static uint8 testSaid(uint8, uint8 *);
|
||||
static uint8 testController(uint8);
|
||||
static uint8 testKeypressed(void);
|
||||
static uint8 testCompareStrings(uint8, uint8);
|
||||
|
||||
static AgiEngine *g_agi;
|
||||
#define game g_agi->game
|
||||
#define game g_agi->_game
|
||||
|
||||
#define ip (game.logics[lognum].cIP)
|
||||
#define code (game.logics[lognum].data)
|
||||
|
||||
#define test_equal(v1, v2) (g_agi->getvar(v1) == (v2))
|
||||
#define test_less(v1, v2) (g_agi->getvar(v1) < (v2))
|
||||
#define test_greater(v1, v2) (g_agi->getvar(v1) > (v2))
|
||||
#define test_isset(flag) (g_agi->getflag(flag))
|
||||
#define test_has(obj) (g_agi->object_get_location(obj) == EGO_OWNED)
|
||||
#define test_obj_in_room(obj, v) (g_agi->object_get_location(obj) == g_agi->getvar(v))
|
||||
#define testEqual(v1, v2) (g_agi->getvar(v1) == (v2))
|
||||
#define testLess(v1, v2) (g_agi->getvar(v1) < (v2))
|
||||
#define testGreater(v1, v2) (g_agi->getvar(v1) > (v2))
|
||||
#define testIsSet(flag) (g_agi->getflag(flag))
|
||||
#define testHas(obj) (g_agi->objectGetLocation(obj) == EGO_OWNED)
|
||||
#define testObjInRoom(obj, v) (g_agi->objectGetLocation(obj) == g_agi->getvar(v))
|
||||
|
||||
extern int timer_hack; /* For the timer loop in MH1 logic 153 */
|
||||
extern int timerHack; /* For the timer loop in MH1 logic 153 */
|
||||
|
||||
static uint8 test_compare_strings(uint8 s1, uint8 s2) {
|
||||
static uint8 testCompareStrings(uint8 s1, uint8 s2) {
|
||||
char ms1[MAX_STRINGLEN];
|
||||
char ms2[MAX_STRINGLEN];
|
||||
int j, k, l;
|
||||
|
@ -107,15 +107,15 @@ static uint8 test_compare_strings(uint8 s1, uint8 s2) {
|
|||
return !strcmp(ms1, ms2);
|
||||
}
|
||||
|
||||
static uint8 test_keypressed() {
|
||||
static uint8 testKeypressed() {
|
||||
int x = game.keypress;
|
||||
|
||||
game.keypress = 0;
|
||||
if (!x) {
|
||||
int mode = game.input_mode;
|
||||
game.input_mode = INPUT_NONE;
|
||||
g_agi->main_cycle();
|
||||
game.input_mode = mode;
|
||||
int mode = game.inputMode;
|
||||
game.inputMode = INPUT_NONE;
|
||||
g_agi->mainCycle();
|
||||
game.inputMode = mode;
|
||||
}
|
||||
|
||||
if (x)
|
||||
|
@ -124,50 +124,50 @@ static uint8 test_keypressed() {
|
|||
return x;
|
||||
}
|
||||
|
||||
static uint8 test_controller(uint8 cont) {
|
||||
return game.ev_keyp[cont].occured;
|
||||
static uint8 testController(uint8 cont) {
|
||||
return game.evKeyp[cont].occured;
|
||||
}
|
||||
|
||||
static uint8 test_posn(uint8 n, uint8 x1, uint8 y1, uint8 x2, uint8 y2) {
|
||||
struct vt_entry *v = &game.view_table[n];
|
||||
static uint8 testPosn(uint8 n, uint8 x1, uint8 y1, uint8 x2, uint8 y2) {
|
||||
struct VtEntry *v = &game.viewTable[n];
|
||||
uint8 r;
|
||||
|
||||
r = v->x_pos >= x1 && v->y_pos >= y1 && v->x_pos <= x2 && v->y_pos <= y2;
|
||||
r = v->xPos >= x1 && v->yPos >= y1 && v->xPos <= x2 && v->yPos <= y2;
|
||||
|
||||
debugC(7, kDebugLevelScripts, "(%d,%d) in (%d,%d,%d,%d): %s", v->x_pos, v->y_pos, x1, y1, x2, y2, r ? "true" : "false");
|
||||
debugC(7, kDebugLevelScripts, "(%d,%d) in (%d,%d,%d,%d): %s", v->xPos, v->yPos, x1, y1, x2, y2, r ? "true" : "false");
|
||||
|
||||
return r;
|
||||
}
|
||||
|
||||
static uint8 test_obj_in_box(uint8 n, uint8 x1, uint8 y1, uint8 x2, uint8 y2) {
|
||||
struct vt_entry *v = &game.view_table[n];
|
||||
static uint8 testObjInBox(uint8 n, uint8 x1, uint8 y1, uint8 x2, uint8 y2) {
|
||||
struct VtEntry *v = &game.viewTable[n];
|
||||
|
||||
return v->x_pos >= x1 &&
|
||||
v->y_pos >= y1 && v->x_pos + v->x_size - 1 <= x2 && v->y_pos <= y2;
|
||||
return v->xPos >= x1 &&
|
||||
v->yPos >= y1 && v->xPos + v->xSize - 1 <= x2 && v->yPos <= y2;
|
||||
}
|
||||
|
||||
/* if n is in centre of box */
|
||||
static uint8 test_obj_centre(uint8 n, uint8 x1, uint8 y1, uint8 x2, uint8 y2) {
|
||||
struct vt_entry *v = &game.view_table[n];
|
||||
static uint8 testObjCentre(uint8 n, uint8 x1, uint8 y1, uint8 x2, uint8 y2) {
|
||||
struct VtEntry *v = &game.viewTable[n];
|
||||
|
||||
return v->x_pos + v->x_size / 2 >= x1 &&
|
||||
v->x_pos + v->x_size / 2 <= x2 && v->y_pos >= y1 && v->y_pos <= y2;
|
||||
return v->xPos + v->xSize / 2 >= x1 &&
|
||||
v->xPos + v->xSize / 2 <= x2 && v->yPos >= y1 && v->yPos <= y2;
|
||||
}
|
||||
|
||||
/* if nect N is in right corner */
|
||||
static uint8 test_obj_right(uint8 n, uint8 x1, uint8 y1, uint8 x2, uint8 y2) {
|
||||
struct vt_entry *v = &game.view_table[n];
|
||||
static uint8 testObjRight(uint8 n, uint8 x1, uint8 y1, uint8 x2, uint8 y2) {
|
||||
struct VtEntry *v = &game.viewTable[n];
|
||||
|
||||
return v->x_pos + v->x_size - 1 >= x1 &&
|
||||
v->x_pos + v->x_size - 1 <= x2 && v->y_pos >= y1 && v->y_pos <= y2;
|
||||
return v->xPos + v->xSize - 1 >= x1 &&
|
||||
v->xPos + v->xSize - 1 <= x2 && v->yPos >= y1 && v->yPos <= y2;
|
||||
}
|
||||
|
||||
/* When player has entered something, it is parsed elsewhere */
|
||||
static uint8 test_said(uint8 nwords, uint8 *cc) {
|
||||
int c, n = game.num_ego_words;
|
||||
static uint8 testSaid(uint8 nwords, uint8 *cc) {
|
||||
int c, n = game.numEgoWords;
|
||||
int z = 0;
|
||||
|
||||
if (g_agi->getflag(F_said_accepted_input) || !g_agi->getflag(F_entered_cli))
|
||||
if (g_agi->getflag(fSaidAcceptedInput) || !g_agi->getflag(fEnteredCli))
|
||||
return false;
|
||||
|
||||
/* FR:
|
||||
|
@ -199,7 +199,7 @@ static uint8 test_said(uint8 nwords, uint8 *cc) {
|
|||
case 1: /* any word */
|
||||
break;
|
||||
default:
|
||||
if (game.ego_words[c].id != z)
|
||||
if (game.egoWords[c].id != z)
|
||||
return false;
|
||||
break;
|
||||
}
|
||||
|
@ -215,26 +215,26 @@ static uint8 test_said(uint8 nwords, uint8 *cc) {
|
|||
if (nwords != 0 && READ_LE_UINT16(cc) != 9999)
|
||||
return false;
|
||||
|
||||
g_agi->setflag(F_said_accepted_input, true);
|
||||
g_agi->setflag(fSaidAcceptedInput, true);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
int AgiEngine::test_if_code(int lognum) {
|
||||
int AgiEngine::testIfCode(int lognum) {
|
||||
g_agi = this;
|
||||
int ec = true;
|
||||
int retval = true;
|
||||
uint8 op = 0;
|
||||
uint8 not_test = false;
|
||||
uint8 or_test = false;
|
||||
uint16 last_ip = ip;
|
||||
uint8 notTest = false;
|
||||
uint8 orTest = false;
|
||||
uint16 lastIp = ip;
|
||||
uint8 p[16] = { 0 };
|
||||
|
||||
while (retval && !game.quit_prog_now) {
|
||||
if (g_agi->_debug.enabled && (g_agi->_debug.logic0 || lognum))
|
||||
debug_console(lognum, lTEST_MODE, NULL);
|
||||
while (retval && !game.quitProgNow) {
|
||||
if (_debug.enabled && (_debug.logic0 || lognum))
|
||||
debugConsole(lognum, lTEST_MODE, NULL);
|
||||
|
||||
last_ip = ip;
|
||||
lastIp = ip;
|
||||
op = *(code + ip++);
|
||||
memmove(p, (code + ip), 16);
|
||||
|
||||
|
@ -242,94 +242,94 @@ int AgiEngine::test_if_code(int lognum) {
|
|||
case 0xFF: /* END IF, TEST true */
|
||||
goto end_test;
|
||||
case 0xFD:
|
||||
not_test = !not_test;
|
||||
notTest = !notTest;
|
||||
continue;
|
||||
case 0xFC: /* OR */
|
||||
/* if or_test is ON and we hit 0xFC, end of OR, then
|
||||
* or is STILL false so break.
|
||||
*/
|
||||
if (or_test) {
|
||||
if (orTest) {
|
||||
ec = false;
|
||||
retval = false;
|
||||
goto end_test;
|
||||
}
|
||||
|
||||
or_test = true;
|
||||
orTest = true;
|
||||
continue;
|
||||
|
||||
case 0x00:
|
||||
/* return true? */
|
||||
goto end_test;
|
||||
case 0x01:
|
||||
ec = test_equal(p[0], p[1]);
|
||||
ec = testEqual(p[0], p[1]);
|
||||
if (p[0] == 11)
|
||||
timer_hack++;
|
||||
timerHack++;
|
||||
break;
|
||||
case 0x02:
|
||||
ec = test_equal(p[0], getvar(p[1]));
|
||||
ec = testEqual(p[0], getvar(p[1]));
|
||||
if (p[0] == 11 || p[1] == 11)
|
||||
timer_hack++;
|
||||
timerHack++;
|
||||
break;
|
||||
case 0x03:
|
||||
ec = test_less(p[0], p[1]);
|
||||
ec = testLess(p[0], p[1]);
|
||||
if (p[0] == 11)
|
||||
timer_hack++;
|
||||
timerHack++;
|
||||
break;
|
||||
case 0x04:
|
||||
ec = test_less(p[0], getvar(p[1]));
|
||||
ec = testLess(p[0], getvar(p[1]));
|
||||
if (p[0] == 11 || p[1] == 11)
|
||||
timer_hack++;
|
||||
timerHack++;
|
||||
break;
|
||||
case 0x05:
|
||||
ec = test_greater(p[0], p[1]);
|
||||
ec = testGreater(p[0], p[1]);
|
||||
if (p[0] == 11)
|
||||
timer_hack++;
|
||||
timerHack++;
|
||||
break;
|
||||
case 0x06:
|
||||
ec = test_greater(p[0], getvar(p[1]));
|
||||
ec = testGreater(p[0], getvar(p[1]));
|
||||
if (p[0] == 11 || p[1] == 11)
|
||||
timer_hack++;
|
||||
timerHack++;
|
||||
break;
|
||||
case 0x07:
|
||||
ec = test_isset(p[0]);
|
||||
ec = testIsSet(p[0]);
|
||||
break;
|
||||
case 0x08:
|
||||
ec = test_isset(getvar(p[0]));
|
||||
ec = testIsSet(getvar(p[0]));
|
||||
break;
|
||||
case 0x09:
|
||||
ec = test_has(p[0]);
|
||||
ec = testHas(p[0]);
|
||||
break;
|
||||
case 0x0A:
|
||||
ec = test_obj_in_room(p[0], p[1]);
|
||||
ec = testObjInRoom(p[0], p[1]);
|
||||
break;
|
||||
case 0x0B:
|
||||
ec = test_posn(p[0], p[1], p[2], p[3], p[4]);
|
||||
ec = testPosn(p[0], p[1], p[2], p[3], p[4]);
|
||||
break;
|
||||
case 0x0C:
|
||||
ec = test_controller(p[0]);
|
||||
ec = testController(p[0]);
|
||||
break;
|
||||
case 0x0D:
|
||||
ec = test_keypressed();
|
||||
ec = testKeypressed();
|
||||
break;
|
||||
case 0x0E:
|
||||
ec = test_said(p[0], (uint8 *) code + (ip + 1));
|
||||
ip = last_ip;
|
||||
ec = testSaid(p[0], (uint8 *) code + (ip + 1));
|
||||
ip = lastIp;
|
||||
ip++; /* skip opcode */
|
||||
ip += p[0] * 2; /* skip num_words * 2 */
|
||||
ip++; /* skip num_words opcode */
|
||||
break;
|
||||
case 0x0F:
|
||||
debugC(7, kDebugLevelScripts, "comparing [%s], [%s]", game.strings[p[0]], game.strings[p[1]]);
|
||||
ec = test_compare_strings(p[0], p[1]);
|
||||
ec = testCompareStrings(p[0], p[1]);
|
||||
break;
|
||||
case 0x10:
|
||||
ec = test_obj_in_box(p[0], p[1], p[2], p[3], p[4]);
|
||||
ec = testObjInBox(p[0], p[1], p[2], p[3], p[4]);
|
||||
break;
|
||||
case 0x11:
|
||||
ec = test_obj_centre(p[0], p[1], p[2], p[3], p[4]);
|
||||
ec = testObjCentre(p[0], p[1], p[2], p[3], p[4]);
|
||||
break;
|
||||
case 0x12:
|
||||
ec = test_obj_right(p[0], p[1], p[2], p[3], p[4]);
|
||||
ec = testObjRight(p[0], p[1], p[2], p[3], p[4]);
|
||||
break;
|
||||
default:
|
||||
ec = false;
|
||||
|
@ -337,16 +337,16 @@ int AgiEngine::test_if_code(int lognum) {
|
|||
}
|
||||
|
||||
if (op <= 0x12)
|
||||
ip += logic_names_test[op].num_args;
|
||||
ip += logicNamesTest[op].numArgs;
|
||||
|
||||
/* exchange ec value */
|
||||
if (not_test)
|
||||
if (notTest)
|
||||
ec = !ec;
|
||||
|
||||
/* not is only enabled for 1 test command */
|
||||
not_test = false;
|
||||
notTest = false;
|
||||
|
||||
if (or_test && ec) {
|
||||
if (orTest && ec) {
|
||||
/* a true inside an OR statement passes
|
||||
* ENTIRE statement scan for end of OR
|
||||
*/
|
||||
|
@ -377,15 +377,15 @@ int AgiEngine::test_if_code(int lognum) {
|
|||
}
|
||||
|
||||
if (*(code + ip) < 0xFC)
|
||||
ip += logic_names_test[*(code + ip)].num_args;
|
||||
ip += logicNamesTest[*(code + ip)].numArgs;
|
||||
ip++;
|
||||
}
|
||||
ip++;
|
||||
|
||||
or_test = false;
|
||||
orTest = false;
|
||||
retval = true;
|
||||
} else {
|
||||
retval = or_test ? retval || ec : retval && ec;
|
||||
retval = orTest ? retval || ec : retval && ec;
|
||||
}
|
||||
}
|
||||
end_test:
|
||||
|
@ -394,13 +394,13 @@ int AgiEngine::test_if_code(int lognum) {
|
|||
if (retval)
|
||||
ip += 2;
|
||||
else {
|
||||
ip = last_ip;
|
||||
ip = lastIp;
|
||||
while (*(code + ip) != 0xff) {
|
||||
if (*(code + ip) == 0x0e) {
|
||||
ip++;
|
||||
ip += (*(code + ip)) * 2 + 1;
|
||||
} else if (*(code + ip) < 0xfc) {
|
||||
ip += logic_names_test[*(code + ip)].num_args;
|
||||
ip += logicNamesTest[*(code + ip)].numArgs;
|
||||
ip++;
|
||||
} else {
|
||||
ip++;
|
||||
|
@ -410,8 +410,8 @@ int AgiEngine::test_if_code(int lognum) {
|
|||
ip += READ_LE_UINT16(code + ip) + 2;
|
||||
}
|
||||
|
||||
if (g_agi->_debug.enabled && (g_agi->_debug.logic0 || lognum))
|
||||
debug_console(lognum, 0xFF, retval ? "=true" : "=false");
|
||||
if (_debug.enabled && (_debug.logic0 || lognum))
|
||||
debugConsole(lognum, 0xFF, retval ? "=true" : "=false");
|
||||
|
||||
return retval;
|
||||
}
|
||||
|
|
|
@ -29,16 +29,16 @@
|
|||
|
||||
namespace Agi {
|
||||
|
||||
struct agi_logicnames {
|
||||
struct AgiLogicnames {
|
||||
const char *name;
|
||||
uint16 num_args;
|
||||
uint16 arg_mask;
|
||||
uint16 numArgs;
|
||||
uint16 argMask;
|
||||
};
|
||||
|
||||
extern struct agi_logicnames logic_names_test[];
|
||||
extern struct agi_logicnames logic_names_cmd[];
|
||||
extern struct agi_logicnames logic_names_if[];
|
||||
extern AgiLogicnames logicNamesTest[];
|
||||
extern AgiLogicnames logicNamesCmd[];
|
||||
extern AgiLogicnames logicNamesIf[];
|
||||
|
||||
} // End of namespace Agi
|
||||
} // End of namespace Agi
|
||||
|
||||
#endif /* AGI_OPCODES_H */
|
||||
|
|
|
@ -31,22 +31,22 @@ namespace Agi {
|
|||
|
||||
#ifdef PATCH_LOGIC
|
||||
|
||||
#define ip (game.logics[n].cIP)
|
||||
#define code (game.logics[n].data)
|
||||
#define size (game.logics[n].size)
|
||||
#define ip (_game.logics[n].cIP)
|
||||
#define code (_game.logics[n].data)
|
||||
#define size (_game.logics[n].size)
|
||||
|
||||
/*
|
||||
* Patches
|
||||
*/
|
||||
|
||||
static const uint8 kq4data_find[] = {
|
||||
static const uint8 kq4dataFind[] = {
|
||||
0x0C, 0x04, 0xFF, 0x07, 0x05, 0xFF, 0x15, 0x00,
|
||||
0x03, 0x0A, 0x00, 0x77, 0x83, 0x71, 0x0D, 0x97,
|
||||
0x03, 0x98, 0xCE, 0x18, 0x98, 0x19, 0x98, 0x1B,
|
||||
0x98, 0x0C, 0x5A, 0x1A, 0x00
|
||||
};
|
||||
|
||||
static const uint8 kq4data_fix[] = {
|
||||
static const uint8 kq4dataFix[] = {
|
||||
/* v19 = 0
|
||||
* new.room(96)
|
||||
* return
|
||||
|
@ -54,14 +54,14 @@ static const uint8 kq4data_fix[] = {
|
|||
0x03, 0x13, 0x0, 0x12, 0x60, 0x00
|
||||
};
|
||||
|
||||
static const uint8 grdata_find[] = {
|
||||
static const uint8 grdataFind[] = {
|
||||
0x0C, 0x04, 0xFF, 0x07, 0x05, 0xFF, 0x16, 0x00,
|
||||
0x0C, 0x96, 0x03, 0x0A, 0x00, 0x77, 0x83, 0x71,
|
||||
0x0D, 0xD9, 0x03, 0xDC, 0xBF, 0x18, 0xDC, 0x19,
|
||||
0xDC, 0x1B, 0xDC, 0x0C, 0x95, 0x1A
|
||||
};
|
||||
|
||||
static const uint8 grdata_fix[] = {
|
||||
static const uint8 grdataFix[] = {
|
||||
/* reset(227)
|
||||
* v19 = 0
|
||||
* v246 = 1
|
||||
|
@ -73,14 +73,14 @@ static const uint8 grdata_fix[] = {
|
|||
};
|
||||
|
||||
#if 0
|
||||
static const uint8 lsl1data_find[] = {
|
||||
static const uint8 lsl1dataFind[] = {
|
||||
0xFF, 0xFD, 0x07, 0x1E, 0xFC, 0x07, 0x6D, 0x01,
|
||||
0x5F, 0x03, 0xFC, 0xFF, 0x12, 0x00, 0x0C, 0x6D,
|
||||
0x78, 0x8A, 0x77, 0x69, 0x16, 0x18, 0x00, 0x0D,
|
||||
0x30, 0x0D, 0x55, 0x78, 0x65, 0x0A
|
||||
};
|
||||
|
||||
static const uint8 lsl1data_fix[] = {
|
||||
static const uint8 lsl1dataFix[] = {
|
||||
/* set(109)
|
||||
* reset(48)
|
||||
* reset(85)
|
||||
|
@ -92,7 +92,7 @@ static const uint8 lsl1data_fix[] = {
|
|||
};
|
||||
#endif
|
||||
|
||||
static const uint8 mh1data_find[] = {
|
||||
static const uint8 mh1dataFind[] = {
|
||||
0xFF, 0x07, 0x05, 0xFF, 0xE6, 0x00,
|
||||
0x03, 0x0A, 0x02, 0x77, 0x83, 0x71,
|
||||
0x6F, 0x01, 0x17, 0x00, 0x03, 0x00,
|
||||
|
@ -100,40 +100,40 @@ static const uint8 mh1data_find[] = {
|
|||
0x03, 0x03, 0x3B, 0x00, 0x6C, 0x03
|
||||
};
|
||||
|
||||
static const uint8 mh1data_fix[] = {
|
||||
static const uint8 mh1dataFix[] = {
|
||||
0x0C, 0x05, 0x16, 0x5A, 0x12, 0x99
|
||||
};
|
||||
|
||||
void AgiEngine::patch_logic(int n) {
|
||||
void AgiEngine::patchLogic(int n) {
|
||||
switch (n) {
|
||||
#if 0
|
||||
/* ALT-X in the questions takes care of that */
|
||||
case 6:
|
||||
/* lsl1 bypass questions */
|
||||
if (!strcmp(game.id, "LLLLL")) {
|
||||
if (!memcmp(lsl1data_find, (code + ip), 30))
|
||||
memmove((code + ip), lsl1data_fix, 9);
|
||||
if (!strcmp(_game.id, "LLLLL")) {
|
||||
if (!memcmp(lsl1dataFind, (code + ip), 30))
|
||||
memmove((code + ip), lsl1dataFix, 9);
|
||||
}
|
||||
break;
|
||||
#endif
|
||||
case 125:
|
||||
/* gold rush code break */
|
||||
if (!strcmp(game.id, "GR")) {
|
||||
if (!memcmp(grdata_find, (code + ip), 30))
|
||||
memmove((code + ip), grdata_fix, 12);
|
||||
if (!strcmp(_game.id, "GR")) {
|
||||
if (!memcmp(grdataFind, (code + ip), 30))
|
||||
memmove((code + ip), grdataFix, 12);
|
||||
}
|
||||
break;
|
||||
case 140:
|
||||
/* kings quest 4 code break */
|
||||
if (!strcmp(game.id, "KQ4")) {
|
||||
if (memcmp(kq4data_find, (code + ip), 29) == 0)
|
||||
memmove((code + ip), kq4data_fix, 6);
|
||||
if (!strcmp(_game.id, "KQ4")) {
|
||||
if (memcmp(kq4dataFind, (code + ip), 29) == 0)
|
||||
memmove((code + ip), kq4dataFix, 6);
|
||||
}
|
||||
break;
|
||||
case 159:
|
||||
/* manhunter 1 amiga */
|
||||
if (ip + 30 < size && !memcmp(mh1data_find, (code + ip), 30)) {
|
||||
memmove((code + ip), mh1data_fix, 6);
|
||||
if (ip + 30 < size && !memcmp(mh1dataFind, (code + ip), 30)) {
|
||||
memmove((code + ip), mh1dataFix, 6);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
@ -141,4 +141,4 @@ void AgiEngine::patch_logic(int n) {
|
|||
|
||||
#endif
|
||||
|
||||
} // End of namespace Agi
|
||||
} // End of namespace Agi
|
||||
|
|
|
@ -29,18 +29,18 @@
|
|||
|
||||
namespace Agi {
|
||||
|
||||
#define next_byte data[foffs++]
|
||||
#define nextByte data[foffs++]
|
||||
|
||||
static uint8 *data;
|
||||
static uint32 flen;
|
||||
static uint32 foffs;
|
||||
|
||||
static uint8 pat_code;
|
||||
static uint8 pat_num;
|
||||
static uint8 pri_on;
|
||||
static uint8 scr_on;
|
||||
static uint8 scr_colour;
|
||||
static uint8 pri_colour;
|
||||
static uint8 patCode;
|
||||
static uint8 patNum;
|
||||
static uint8 priOn;
|
||||
static uint8 scrOn;
|
||||
static uint8 scrColour;
|
||||
static uint8 priColour;
|
||||
|
||||
static uint8 circles[][15] = { /* agi circle bitmaps */
|
||||
{0x80},
|
||||
|
@ -53,14 +53,14 @@ static uint8 circles[][15] = { /* agi circle bitmaps */
|
|||
{0x18, 0x3c, 0x7e, 0x7e, 0x7e, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7e, 0x7e, 0x7e, 0x3c, 0x18}
|
||||
};
|
||||
|
||||
static uint8 splatter_map[32] = { /* splatter brush bitmaps */
|
||||
static uint8 splatterMap[32] = { /* splatter brush bitmaps */
|
||||
0x20, 0x94, 0x02, 0x24, 0x90, 0x82, 0xa4, 0xa2,
|
||||
0x82, 0x09, 0x0a, 0x22, 0x12, 0x10, 0x42, 0x14,
|
||||
0x91, 0x4a, 0x91, 0x11, 0x08, 0x12, 0x25, 0x10,
|
||||
0x22, 0xa8, 0x14, 0x24, 0x00, 0x50, 0x24, 0x04
|
||||
};
|
||||
|
||||
static uint8 splatter_start[128] = { /* starting bit position */
|
||||
static uint8 splatterStart[128] = { /* starting bit position */
|
||||
0x00, 0x18, 0x30, 0xc4, 0xdc, 0x65, 0xeb, 0x48,
|
||||
0x60, 0xbd, 0x89, 0x05, 0x0a, 0xf4, 0x7d, 0x7d,
|
||||
0x85, 0xb0, 0x8e, 0x95, 0x1f, 0x22, 0x0d, 0xdf,
|
||||
|
@ -78,40 +78,40 @@ static uint8 splatter_start[128] = { /* starting bit position */
|
|||
0x06, 0x6f, 0xc6, 0x4a, 0xa4, 0x75, 0x97, 0xe1
|
||||
};
|
||||
|
||||
void PictureMgr::put_virt_pixel(int x, int y) {
|
||||
void PictureMgr::putVirtPixel(int x, int y) {
|
||||
uint8 *p;
|
||||
|
||||
if (x < 0 || y < 0 || x >= _WIDTH || y >= _HEIGHT)
|
||||
return;
|
||||
|
||||
p = &_vm->game.sbuf[y * _WIDTH + x];
|
||||
p = &_vm->_game.sbuf[y * _WIDTH + x];
|
||||
|
||||
if (pri_on)
|
||||
*p = (pri_colour << 4) | (*p & 0x0f);
|
||||
if (scr_on)
|
||||
*p = scr_colour | (*p & 0xf0);
|
||||
if (priOn)
|
||||
*p = (priColour << 4) | (*p & 0x0f);
|
||||
if (scrOn)
|
||||
*p = scrColour | (*p & 0xf0);
|
||||
}
|
||||
|
||||
/* For the flood fill routines */
|
||||
|
||||
/* MH2 needs stack size > 300 */
|
||||
#define STACK_SIZE 512
|
||||
static unsigned int stack_ptr;
|
||||
static unsigned int stackPtr;
|
||||
static uint16 stack[STACK_SIZE];
|
||||
|
||||
static INLINE void _PUSH(uint16 c) {
|
||||
assert(stack_ptr < STACK_SIZE);
|
||||
static INLINE void lpush(uint16 c) {
|
||||
assert(stackPtr < STACK_SIZE);
|
||||
|
||||
stack[stack_ptr] = c;
|
||||
stack_ptr++;
|
||||
stack[stackPtr] = c;
|
||||
stackPtr++;
|
||||
}
|
||||
|
||||
static INLINE uint16 _POP() {
|
||||
if (stack_ptr == 0)
|
||||
static INLINE uint16 lpop() {
|
||||
if (stackPtr == 0)
|
||||
return 0xffff;
|
||||
|
||||
stack_ptr--;
|
||||
return stack[stack_ptr];
|
||||
stackPtr--;
|
||||
return stack[stackPtr];
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -123,7 +123,7 @@ static INLINE uint16 _POP() {
|
|||
* @param x2 x coordinate of end point
|
||||
* @param y2 y coordinate of end point
|
||||
*/
|
||||
void PictureMgr::draw_line(int x1, int y1, int x2, int y2) {
|
||||
void PictureMgr::drawLine(int x1, int y1, int x2, int y2) {
|
||||
int i, x, y, deltaX, deltaY, stepX, stepY, errorX, errorY, detdelta;
|
||||
|
||||
/* CM: Do clipping */
|
||||
|
@ -143,7 +143,7 @@ void PictureMgr::draw_line(int x1, int y1, int x2, int y2) {
|
|||
}
|
||||
|
||||
for (; y1 <= y2; y1++)
|
||||
put_virt_pixel(x1, y1);
|
||||
putVirtPixel(x1, y1);
|
||||
|
||||
return;
|
||||
}
|
||||
|
@ -157,7 +157,7 @@ void PictureMgr::draw_line(int x1, int y1, int x2, int y2) {
|
|||
x2 = x;
|
||||
}
|
||||
for (; x1 <= x2; x1++)
|
||||
put_virt_pixel(x1, y1);
|
||||
putVirtPixel(x1, y1);
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -190,7 +190,7 @@ void PictureMgr::draw_line(int x1, int y1, int x2, int y2) {
|
|||
errorY = deltaX / 2;
|
||||
}
|
||||
|
||||
put_virt_pixel(x, y);
|
||||
putVirtPixel(x, y);
|
||||
|
||||
do {
|
||||
errorY += deltaY;
|
||||
|
@ -205,7 +205,7 @@ void PictureMgr::draw_line(int x1, int y1, int x2, int y2) {
|
|||
x += stepX;
|
||||
}
|
||||
|
||||
put_virt_pixel(x, y);
|
||||
putVirtPixel(x, y);
|
||||
i--;
|
||||
} while (i > 0);
|
||||
}
|
||||
|
@ -214,16 +214,16 @@ void PictureMgr::draw_line(int x1, int y1, int x2, int y2) {
|
|||
* Draw a relative AGI line.
|
||||
* Draws short lines relative to last position. (drawing action 0xF7)
|
||||
*/
|
||||
void PictureMgr::dynamic_draw_line() {
|
||||
void PictureMgr::dynamicDrawLine() {
|
||||
int x1, y1, disp, dx, dy;
|
||||
|
||||
x1 = next_byte;
|
||||
y1 = next_byte;
|
||||
x1 = nextByte;
|
||||
y1 = nextByte;
|
||||
|
||||
put_virt_pixel(x1, y1);
|
||||
putVirtPixel(x1, y1);
|
||||
|
||||
for (;;) {
|
||||
if ((disp = next_byte) >= 0xf0)
|
||||
if ((disp = nextByte) >= 0xf0)
|
||||
break;
|
||||
|
||||
dx = ((disp & 0xf0) >> 4) & 0x0f;
|
||||
|
@ -234,7 +234,7 @@ void PictureMgr::dynamic_draw_line() {
|
|||
if (dy & 0x08)
|
||||
dy = -(dy & 0x07);
|
||||
|
||||
draw_line(x1, y1, x1 + dx, y1 + dy);
|
||||
drawLine(x1, y1, x1 + dx, y1 + dy);
|
||||
x1 += dx;
|
||||
y1 += dy;
|
||||
}
|
||||
|
@ -246,21 +246,21 @@ void PictureMgr::dynamic_draw_line() {
|
|||
**
|
||||
** Draws long lines to actual locations (cf. relative) (drawing action 0xF6)
|
||||
**************************************************************************/
|
||||
void PictureMgr::absolute_draw_line() {
|
||||
void PictureMgr::absoluteDrawLine() {
|
||||
int x1, y1, x2, y2;
|
||||
|
||||
x1 = next_byte;
|
||||
y1 = next_byte;
|
||||
put_virt_pixel(x1, y1);
|
||||
x1 = nextByte;
|
||||
y1 = nextByte;
|
||||
putVirtPixel(x1, y1);
|
||||
|
||||
while (42) {
|
||||
if ((x2 = next_byte) >= 0xf0)
|
||||
for (;;) {
|
||||
if ((x2 = nextByte) >= 0xf0)
|
||||
break;
|
||||
|
||||
if ((y2 = next_byte) >= 0xf0)
|
||||
if ((y2 = nextByte) >= 0xf0)
|
||||
break;
|
||||
|
||||
draw_line(x1, y1, x2, y2);
|
||||
drawLine(x1, y1, x2, y2);
|
||||
x1 = x2;
|
||||
y1 = y2;
|
||||
}
|
||||
|
@ -270,67 +270,67 @@ void PictureMgr::absolute_draw_line() {
|
|||
/**************************************************************************
|
||||
** okToFill
|
||||
**************************************************************************/
|
||||
INLINE int PictureMgr::is_ok_fill_here(int x, int y) {
|
||||
INLINE int PictureMgr::isOkFillHere(int x, int y) {
|
||||
uint8 p;
|
||||
|
||||
if (x < 0 || x >= _WIDTH || y < 0 || y >= _HEIGHT)
|
||||
return false;
|
||||
|
||||
if (!scr_on && !pri_on)
|
||||
if (!scrOn && !priOn)
|
||||
return false;
|
||||
|
||||
p = _vm->game.sbuf[y * _WIDTH + x];
|
||||
p = _vm->_game.sbuf[y * _WIDTH + x];
|
||||
|
||||
if (!pri_on && scr_on && scr_colour != 15)
|
||||
if (!priOn && scrOn && scrColour != 15)
|
||||
return (p & 0x0f) == 15;
|
||||
|
||||
if (pri_on && !scr_on && pri_colour != 4)
|
||||
if (priOn && !scrOn && priColour != 4)
|
||||
return (p >> 4) == 4;
|
||||
|
||||
return (scr_on && (p & 0x0f) == 15 && scr_colour != 15);
|
||||
return (scrOn && (p & 0x0f) == 15 && scrColour != 15);
|
||||
}
|
||||
|
||||
/**************************************************************************
|
||||
** agi_fill
|
||||
**************************************************************************/
|
||||
void PictureMgr::fill_scanline(int x, int y) {
|
||||
void PictureMgr::fillScanline(int x, int y) {
|
||||
unsigned int c;
|
||||
int newspan_up, newspan_down;
|
||||
int newspanUp, newspanDown;
|
||||
|
||||
if (!is_ok_fill_here(x, y))
|
||||
if (!isOkFillHere(x, y))
|
||||
return;
|
||||
|
||||
/* Scan for left border */
|
||||
for (c = x - 1; is_ok_fill_here(c, y); c--);
|
||||
for (c = x - 1; isOkFillHere(c, y); c--);
|
||||
|
||||
newspan_up = newspan_down = 1;
|
||||
for (c++; is_ok_fill_here(c, y); c++) {
|
||||
put_virt_pixel(c, y);
|
||||
if (is_ok_fill_here(c, y - 1)) {
|
||||
if (newspan_up) {
|
||||
_PUSH(c + 320 * (y - 1));
|
||||
newspan_up = 0;
|
||||
newspanUp = newspanDown = 1;
|
||||
for (c++; isOkFillHere(c, y); c++) {
|
||||
putVirtPixel(c, y);
|
||||
if (isOkFillHere(c, y - 1)) {
|
||||
if (newspanUp) {
|
||||
lpush(c + 320 * (y - 1));
|
||||
newspanUp = 0;
|
||||
}
|
||||
} else {
|
||||
newspan_up = 1;
|
||||
newspanUp = 1;
|
||||
}
|
||||
|
||||
if (is_ok_fill_here(c, y + 1)) {
|
||||
if (newspan_down) {
|
||||
_PUSH(c + 320 * (y + 1));
|
||||
newspan_down = 0;
|
||||
if (isOkFillHere(c, y + 1)) {
|
||||
if (newspanDown) {
|
||||
lpush(c + 320 * (y + 1));
|
||||
newspanDown = 0;
|
||||
}
|
||||
} else {
|
||||
newspan_down = 1;
|
||||
newspanDown = 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void PictureMgr::agi_fill(unsigned int x, unsigned int y) {
|
||||
_PUSH(x + 320 * y);
|
||||
void PictureMgr::agiFill(unsigned int x, unsigned int y) {
|
||||
lpush(x + 320 * y);
|
||||
|
||||
while (42) {
|
||||
uint16 c = _POP();
|
||||
for (;;) {
|
||||
uint16 c = lpop();
|
||||
|
||||
/* Exit if stack is empty */
|
||||
if (c == 0xffff)
|
||||
|
@ -339,10 +339,10 @@ void PictureMgr::agi_fill(unsigned int x, unsigned int y) {
|
|||
x = c % 320;
|
||||
y = c / 320;
|
||||
|
||||
fill_scanline(x, y);
|
||||
fillScanline(x, y);
|
||||
}
|
||||
|
||||
stack_ptr = 0;
|
||||
stackPtr = NULL;
|
||||
}
|
||||
|
||||
/**************************************************************************
|
||||
|
@ -350,27 +350,27 @@ void PictureMgr::agi_fill(unsigned int x, unsigned int y) {
|
|||
**
|
||||
** Draws an xCorner (drawing action 0xF5)
|
||||
**************************************************************************/
|
||||
void PictureMgr::x_corner() {
|
||||
void PictureMgr::xCorner() {
|
||||
int x1, x2, y1, y2;
|
||||
|
||||
x1 = next_byte;
|
||||
y1 = next_byte;
|
||||
put_virt_pixel(x1, y1);
|
||||
x1 = nextByte;
|
||||
y1 = nextByte;
|
||||
putVirtPixel(x1, y1);
|
||||
|
||||
while (42) {
|
||||
x2 = next_byte;
|
||||
for (;;) {
|
||||
x2 = nextByte;
|
||||
|
||||
if (x2 >= 0xf0)
|
||||
break;
|
||||
|
||||
draw_line(x1, y1, x2, y1);
|
||||
drawLine(x1, y1, x2, y1);
|
||||
x1 = x2;
|
||||
y2 = next_byte;
|
||||
y2 = nextByte;
|
||||
|
||||
if (y2 >= 0xf0)
|
||||
break;
|
||||
|
||||
draw_line(x1, y1, x1, y2);
|
||||
drawLine(x1, y1, x1, y2);
|
||||
y1 = y2;
|
||||
}
|
||||
foffs--;
|
||||
|
@ -381,27 +381,27 @@ void PictureMgr::x_corner() {
|
|||
**
|
||||
** Draws an yCorner (drawing action 0xF4)
|
||||
**************************************************************************/
|
||||
void PictureMgr::y_corner() {
|
||||
void PictureMgr::yCorner() {
|
||||
int x1, x2, y1, y2;
|
||||
|
||||
x1 = next_byte;
|
||||
y1 = next_byte;
|
||||
put_virt_pixel(x1, y1);
|
||||
x1 = nextByte;
|
||||
y1 = nextByte;
|
||||
putVirtPixel(x1, y1);
|
||||
|
||||
while (42) {
|
||||
y2 = next_byte;
|
||||
for (;;) {
|
||||
y2 = nextByte;
|
||||
|
||||
if (y2 >= 0xF0)
|
||||
break;
|
||||
|
||||
draw_line(x1, y1, x1, y2);
|
||||
drawLine(x1, y1, x1, y2);
|
||||
y1 = y2;
|
||||
x2 = next_byte;
|
||||
x2 = nextByte;
|
||||
|
||||
if (x2 >= 0xf0)
|
||||
break;
|
||||
|
||||
draw_line(x1, y1, x2, y1);
|
||||
drawLine(x1, y1, x2, y1);
|
||||
x1 = x2;
|
||||
}
|
||||
|
||||
|
@ -416,8 +416,8 @@ void PictureMgr::y_corner() {
|
|||
void PictureMgr::fill() {
|
||||
int x1, y1;
|
||||
|
||||
while ((x1 = next_byte) < 0xF0 && (y1 = next_byte) < 0xf0)
|
||||
agi_fill(x1, y1);
|
||||
while ((x1 = nextByte) < 0xF0 && (y1 = nextByte) < 0xf0)
|
||||
agiFill(x1, y1);
|
||||
|
||||
foffs--;
|
||||
}
|
||||
|
@ -429,25 +429,25 @@ void PictureMgr::fill() {
|
|||
** on the pattern code.
|
||||
**************************************************************************/
|
||||
|
||||
int PictureMgr::plot_pattern_point(int x, int y, int bitpos) {
|
||||
if (pat_code & 0x20) {
|
||||
if ((splatter_map[bitpos >> 3] >> (7 - (bitpos & 7))) & 1) {
|
||||
put_virt_pixel(x, y);
|
||||
int PictureMgr::plotPatternPoint(int x, int y, int bitpos) {
|
||||
if (patCode & 0x20) {
|
||||
if ((splatterMap[bitpos >> 3] >> (7 - (bitpos & 7))) & 1) {
|
||||
putVirtPixel(x, y);
|
||||
}
|
||||
bitpos++;
|
||||
if (bitpos == 0xff)
|
||||
bitpos = 0;
|
||||
} else
|
||||
put_virt_pixel(x, y);
|
||||
putVirtPixel(x, y);
|
||||
|
||||
return bitpos;
|
||||
}
|
||||
|
||||
void PictureMgr::plot_pattern(int x, int y) {
|
||||
void PictureMgr::plotPattern(int x, int y) {
|
||||
int32 circlePos = 0;
|
||||
uint32 x1, y1, pensize, bitpos = splatter_start[pat_num];
|
||||
uint32 x1, y1, pensize, bitpos = splatterStart[patNum];
|
||||
|
||||
pensize = (pat_code & 7);
|
||||
pensize = (patCode & 7);
|
||||
|
||||
if (x < (int)pensize)
|
||||
x = pensize - 1;
|
||||
|
@ -456,11 +456,11 @@ void PictureMgr::plot_pattern(int x, int y) {
|
|||
|
||||
for (y1 = y - pensize; y1 <= y + pensize; y1++) {
|
||||
for (x1 = x - (pensize + 1) / 2; x1 <= x + pensize / 2; x1++) {
|
||||
if (pat_code & 0x10) { /* Square */
|
||||
bitpos = plot_pattern_point (x1, y1, bitpos);
|
||||
if (patCode & 0x10) { /* Square */
|
||||
bitpos = plotPatternPoint (x1, y1, bitpos);
|
||||
} else { /* Circle */
|
||||
if ((circles[pat_code & 7][circlePos >> 3] >> (7 - (circlePos & 7))) & 1) {
|
||||
bitpos = plot_pattern_point(x1, y1, bitpos);
|
||||
if ((circles[patCode & 7][circlePos >> 3] >> (7 - (circlePos & 7))) & 1) {
|
||||
bitpos = plotPatternPoint(x1, y1, bitpos);
|
||||
}
|
||||
circlePos++;
|
||||
}
|
||||
|
@ -473,23 +473,23 @@ void PictureMgr::plot_pattern(int x, int y) {
|
|||
**
|
||||
** Plots points and various brush patterns.
|
||||
**************************************************************************/
|
||||
void PictureMgr::plot_brush() {
|
||||
void PictureMgr::plotBrush() {
|
||||
int x1, y1;
|
||||
|
||||
while (42) {
|
||||
if (pat_code & 0x20) {
|
||||
if ((pat_num = next_byte) >= 0xF0)
|
||||
for (;;) {
|
||||
if (patCode & 0x20) {
|
||||
if ((patNum = nextByte) >= 0xF0)
|
||||
break;
|
||||
pat_num = (pat_num >> 1) & 0x7f;
|
||||
patNum = (patNum >> 1) & 0x7f;
|
||||
}
|
||||
|
||||
if ((x1 = next_byte) >= 0xf0)
|
||||
if ((x1 = nextByte) >= 0xf0)
|
||||
break;
|
||||
|
||||
if ((y1 = next_byte) >= 0xf0)
|
||||
if ((y1 = nextByte) >= 0xf0)
|
||||
break;
|
||||
|
||||
plot_pattern(x1, y1);
|
||||
plotPattern(x1, y1);
|
||||
}
|
||||
|
||||
foffs--;
|
||||
|
@ -501,58 +501,58 @@ void PictureMgr::plot_brush() {
|
|||
** AGI flood fill. (drawing action 0xF8)
|
||||
**************************************************************************/
|
||||
|
||||
void PictureMgr::draw_picture() {
|
||||
void PictureMgr::drawPicture() {
|
||||
uint8 act;
|
||||
int drawing;
|
||||
|
||||
pat_code = 0;
|
||||
pat_num = 0;
|
||||
pri_on = scr_on = false;
|
||||
scr_colour = 0xf;
|
||||
pri_colour = 0x4;
|
||||
patCode = 0;
|
||||
patNum = 0;
|
||||
priOn = scrOn = false;
|
||||
scrColour = 0xf;
|
||||
priColour = 0x4;
|
||||
|
||||
drawing = 1;
|
||||
|
||||
debugC(8, kDebugLevelMain, "Drawing picture");
|
||||
for (drawing = 1; drawing && foffs < flen;) {
|
||||
act = next_byte;
|
||||
act = nextByte;
|
||||
switch (act) {
|
||||
case 0xf0: /* set colour on screen */
|
||||
scr_colour = next_byte;
|
||||
scr_colour &= 0xF; /* for v3 drawing diff */
|
||||
scr_on = true;
|
||||
scrColour = nextByte;
|
||||
scrColour &= 0xF; /* for v3 drawing diff */
|
||||
scrOn = true;
|
||||
break;
|
||||
case 0xf1: /* disable screen drawing */
|
||||
scr_on = false;
|
||||
scrOn = false;
|
||||
break;
|
||||
case 0xf2: /* set colour on priority */
|
||||
pri_colour = next_byte;
|
||||
pri_colour &= 0xf; /* for v3 drawing diff */
|
||||
pri_on = true;
|
||||
priColour = nextByte;
|
||||
priColour &= 0xf; /* for v3 drawing diff */
|
||||
priOn = true;
|
||||
break;
|
||||
case 0xf3: /* disable priority screen */
|
||||
pri_on = false;
|
||||
priOn = false;
|
||||
break;
|
||||
case 0xf4: /* y-corner */
|
||||
y_corner();
|
||||
yCorner();
|
||||
break;
|
||||
case 0xf5: /* x-corner */
|
||||
x_corner();
|
||||
xCorner();
|
||||
break;
|
||||
case 0xf6: /* absolute draw lines */
|
||||
absolute_draw_line();
|
||||
absoluteDrawLine();
|
||||
break;
|
||||
case 0xf7: /* dynamic draw lines */
|
||||
dynamic_draw_line();
|
||||
dynamicDrawLine();
|
||||
break;
|
||||
case 0xf8: /* fill */
|
||||
fill();
|
||||
break;
|
||||
case 0xf9: /* set pattern */
|
||||
pat_code = next_byte;
|
||||
patCode = nextByte;
|
||||
break;
|
||||
case 0xfA: /* plot brush */
|
||||
plot_brush();
|
||||
plotBrush();
|
||||
break;
|
||||
case 0xFF: /* end of pic data */
|
||||
default:
|
||||
|
@ -569,11 +569,11 @@ void PictureMgr::draw_picture() {
|
|||
/**
|
||||
*
|
||||
*/
|
||||
uint8 *PictureMgr::convert_v3_pic(uint8 *src, uint32 len) {
|
||||
uint8 *PictureMgr::convertV3Pic(uint8 *src, uint32 len) {
|
||||
uint8 d, old = 0, x, *in, *xdata, *out, mode = 0;
|
||||
uint32 i, ulen;
|
||||
|
||||
xdata = (uint8 *) malloc(len + len / 2);
|
||||
xdata = (uint8 *)malloc(len + len / 2);
|
||||
|
||||
out = xdata;
|
||||
in = src;
|
||||
|
@ -618,29 +618,29 @@ uint8 *PictureMgr::convert_v3_pic(uint8 *src, uint32 len) {
|
|||
* @param n AGI picture resource number
|
||||
* @param clear clear AGI screen before drawing
|
||||
*/
|
||||
int PictureMgr::decode_picture(int n, int clear) {
|
||||
int PictureMgr::decodePicture(int n, int clear) {
|
||||
debugC(8, kDebugLevelResources, "(%d)", n);
|
||||
|
||||
pat_code = 0;
|
||||
pat_num = 0;
|
||||
pri_on = scr_on = false;
|
||||
scr_colour = 0xF;
|
||||
pri_colour = 0x4;
|
||||
patCode = 0;
|
||||
patNum = 0;
|
||||
priOn = scrOn = false;
|
||||
scrColour = 0xF;
|
||||
priColour = 0x4;
|
||||
|
||||
data = _vm->game.pictures[n].rdata;
|
||||
flen = _vm->game.dir_pic[n].len;
|
||||
data = _vm->_game.pictures[n].rdata;
|
||||
flen = _vm->_game.dirPic[n].len;
|
||||
foffs = 0;
|
||||
|
||||
if (clear)
|
||||
memset(_vm->game.sbuf, 0x4f, _WIDTH * _HEIGHT);
|
||||
memset(_vm->_game.sbuf, 0x4f, _WIDTH * _HEIGHT);
|
||||
|
||||
draw_picture();
|
||||
drawPicture();
|
||||
|
||||
if (clear)
|
||||
_vm->clear_image_stack();
|
||||
_vm->record_image_stack_call(ADD_PIC, n, clear, 0, 0, 0, 0, 0);
|
||||
_vm->clearImageStack();
|
||||
_vm->recordImageStackCall(ADD_PIC, n, clear, 0, 0, 0, 0, 0);
|
||||
|
||||
return err_OK;
|
||||
return errOK;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -649,34 +649,34 @@ int PictureMgr::decode_picture(int n, int clear) {
|
|||
* resource data.
|
||||
* @param n AGI picture resource number
|
||||
*/
|
||||
int PictureMgr::unload_picture(int n) {
|
||||
int PictureMgr::unloadPicture(int n) {
|
||||
/* remove visual buffer & priority buffer if they exist */
|
||||
if (_vm->game.dir_pic[n].flags & RES_LOADED) {
|
||||
free(_vm->game.pictures[n].rdata);
|
||||
_vm->game.dir_pic[n].flags &= ~RES_LOADED;
|
||||
if (_vm->_game.dirPic[n].flags & RES_LOADED) {
|
||||
free(_vm->_game.pictures[n].rdata);
|
||||
_vm->_game.dirPic[n].flags &= ~RES_LOADED;
|
||||
}
|
||||
|
||||
return err_OK;
|
||||
return errOK;
|
||||
}
|
||||
|
||||
/**
|
||||
* Show AGI picture.
|
||||
* This function copies a ``hidden'' AGI picture to the output device.
|
||||
*/
|
||||
void PictureMgr::show_pic() {
|
||||
void PictureMgr::showPic() {
|
||||
int i, y;
|
||||
int offset;
|
||||
|
||||
debugC(8, kDebugLevelMain, "Show picture!");
|
||||
|
||||
i = 0;
|
||||
offset = _vm->game.line_min_print * CHAR_LINES;
|
||||
offset = _vm->_game.lineMinPrint * CHAR_LINES;
|
||||
for (y = 0; y < _HEIGHT; y++) {
|
||||
_gfx->putPixelsA(0, y + offset, _WIDTH, &_vm->game.sbuf[i]);
|
||||
_gfx->putPixelsA(0, y + offset, _WIDTH, &_vm->_game.sbuf[i]);
|
||||
i += _WIDTH;
|
||||
}
|
||||
|
||||
_gfx->flushScreen();
|
||||
}
|
||||
|
||||
} // End of namespace Agi
|
||||
} // End of namespace Agi
|
||||
|
|
|
@ -32,7 +32,7 @@ namespace Agi {
|
|||
/**
|
||||
* AGI picture resource.
|
||||
*/
|
||||
struct agi_picture {
|
||||
struct AgiPicture {
|
||||
uint32 flen; /**< size of raw data */
|
||||
uint8 *rdata; /**< raw vector image data */
|
||||
};
|
||||
|
@ -46,20 +46,20 @@ class PictureMgr {
|
|||
|
||||
private:
|
||||
|
||||
void draw_line(int x1, int y1, int x2, int y2);
|
||||
void put_virt_pixel(int x, int y);
|
||||
void dynamic_draw_line();
|
||||
void absolute_draw_line();
|
||||
INLINE int is_ok_fill_here(int x, int y);
|
||||
void fill_scanline(int x, int y);
|
||||
void agi_fill(unsigned int x, unsigned int y);
|
||||
void x_corner();
|
||||
void y_corner();
|
||||
void drawLine(int x1, int y1, int x2, int y2);
|
||||
void putVirtPixel(int x, int y);
|
||||
void dynamicDrawLine();
|
||||
void absoluteDrawLine();
|
||||
INLINE int isOkFillHere(int x, int y);
|
||||
void fillScanline(int x, int y);
|
||||
void agiFill(unsigned int x, unsigned int y);
|
||||
void xCorner();
|
||||
void yCorner();
|
||||
void fill();
|
||||
int plot_pattern_point(int x, int y, int bitpos);
|
||||
void plot_pattern(int x, int y);
|
||||
void plot_brush();
|
||||
void draw_picture();
|
||||
int plotPatternPoint(int x, int y, int bitpos);
|
||||
void plotPattern(int x, int y);
|
||||
void plotBrush();
|
||||
void drawPicture();
|
||||
|
||||
public:
|
||||
PictureMgr(AgiEngine *agi, GfxMgr *gfx) {
|
||||
|
@ -67,12 +67,12 @@ public:
|
|||
_gfx = gfx;
|
||||
}
|
||||
|
||||
int decode_picture(int, int);
|
||||
int unload_picture(int);
|
||||
void show_pic();
|
||||
uint8 *convert_v3_pic(uint8 *src, uint32 len);
|
||||
int decodePicture(int, int);
|
||||
int unloadPicture(int);
|
||||
void showPic();
|
||||
uint8 *convertV3Pic(uint8 *src, uint32 len);
|
||||
};
|
||||
|
||||
} // End of namespace Agi
|
||||
} // End of namespace Agi
|
||||
|
||||
#endif /* AGI_PICTURE_H */
|
||||
|
|
|
@ -69,11 +69,11 @@ bool AgiEngine::predictiveDialog(void) {
|
|||
return false;
|
||||
}
|
||||
|
||||
draw_window(50, 40, 269, 159);
|
||||
drawWindow(50, 40, 269, 159);
|
||||
_gfx->drawRectangle(62, 54, 249, 66, MSG_BOX_TEXT);
|
||||
_gfx->flushBlock(62, 54, 249, 66);
|
||||
|
||||
_gfx->printCharacter(3, 11, game.cursor_char, MSG_BOX_COLOUR, MSG_BOX_TEXT);
|
||||
_gfx->printCharacter(3, 11, _game.cursorChar, MSG_BOX_COLOUR, MSG_BOX_TEXT);
|
||||
|
||||
bx[15] = 73; // Zero/space
|
||||
by[15] = 120;
|
||||
|
@ -118,7 +118,7 @@ bool AgiEngine::predictiveDialog(void) {
|
|||
|
||||
bool needRefresh = true;
|
||||
|
||||
while (42) {
|
||||
for (;;) {
|
||||
if (needRefresh) {
|
||||
for (int i = 0; buttons[i]; i++) {
|
||||
int color1 = colors[i * 2];
|
||||
|
@ -146,13 +146,13 @@ bool AgiEngine::predictiveDialog(void) {
|
|||
for (int i = prefix.size() + _currentCode.size(); i < MAXWORDLEN; i++)
|
||||
temp[i] = ' ';
|
||||
|
||||
print_text(temp, 0, 8, 7, MAXWORDLEN, 15, 0);
|
||||
printText(temp, 0, 8, 7, MAXWORDLEN, 15, 0);
|
||||
_gfx->flushBlock(62, 54, 249, 66);
|
||||
}
|
||||
}
|
||||
|
||||
_gfx->pollTimer(); /* msdos driver -> does nothing */
|
||||
key = do_poll_keyboard();
|
||||
key = doPollKeyboard();
|
||||
switch (key) {
|
||||
case KEY_ENTER:
|
||||
rc = true;
|
||||
|
@ -246,7 +246,7 @@ bool AgiEngine::predictiveDialog(void) {
|
|||
_predictiveResult[prefix.size() + _currentCode.size() + 1] = 0;
|
||||
|
||||
getout:
|
||||
close_window();
|
||||
closeWindow();
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
@ -349,6 +349,4 @@ bool AgiEngine::matchWord(void) {
|
|||
return false;
|
||||
}
|
||||
|
||||
|
||||
|
||||
} // End of namespace Agi
|
||||
|
|
|
@ -52,13 +52,13 @@ static const uint32 AGIflag=MKID_BE('AGI:');
|
|||
int AgiEngine::saveGame(const char *fileName, const char *description) {
|
||||
char gameIDstring[8]="gameIDX";
|
||||
int i;
|
||||
struct image_stack_element *ptr = image_stack;
|
||||
struct ImageStackElement *ptr = _imageStack;
|
||||
Common::OutSaveFile *out;
|
||||
|
||||
debugC(3, kDebugLevelMain | kDebugLevelSavegame, "AgiEngine::saveGame(%s, %s)", fileName, description);
|
||||
if (!(out = _saveFileMan->openForSaving(fileName))) {
|
||||
warning("Can't create file '%s', game not saved", fileName);
|
||||
return err_BadFileOpen;
|
||||
return errBadFileOpen;
|
||||
} else {
|
||||
debugC(3, kDebugLevelMain | kDebugLevelSavegame, "Successfully opened %s for writing", fileName);
|
||||
}
|
||||
|
@ -69,70 +69,70 @@ int AgiEngine::saveGame(const char *fileName, const char *description) {
|
|||
out->writeByte(SAVEGAME_VERSION);
|
||||
debugC(5, kDebugLevelMain | kDebugLevelSavegame, "Writing save game version (%d)", SAVEGAME_VERSION);
|
||||
|
||||
out->writeByte(game.state);
|
||||
debugC(5, kDebugLevelMain | kDebugLevelSavegame, "Writing game state (%d)", game.state);
|
||||
out->writeByte(_game.state);
|
||||
debugC(5, kDebugLevelMain | kDebugLevelSavegame, "Writing game state (%d)", _game.state);
|
||||
|
||||
strcpy(gameIDstring, game.id);
|
||||
strcpy(gameIDstring, _game.id);
|
||||
out->write(gameIDstring, 8);
|
||||
debugC(5, kDebugLevelMain | kDebugLevelSavegame, "Writing game id (%s, %s)", gameIDstring, game.id);
|
||||
debugC(5, kDebugLevelMain | kDebugLevelSavegame, "Writing game id (%s, %s)", gameIDstring, _game.id);
|
||||
|
||||
for (i = 0; i < MAX_FLAGS; i++)
|
||||
out->writeByte(game.flags[i]);
|
||||
out->writeByte(_game.flags[i]);
|
||||
for (i = 0; i < MAX_VARS; i++)
|
||||
out->writeByte(game.vars[i]);
|
||||
out->writeByte(_game.vars[i]);
|
||||
|
||||
out->writeSint16BE((int8)game.horizon);
|
||||
out->writeSint16BE((int16)game.line_status);
|
||||
out->writeSint16BE((int16)game.line_user_input);
|
||||
out->writeSint16BE((int16)game.line_min_print);
|
||||
out->writeSint16BE((int8)_game.horizon);
|
||||
out->writeSint16BE((int16)_game.lineStatus);
|
||||
out->writeSint16BE((int16)_game.lineUserInput);
|
||||
out->writeSint16BE((int16)_game.lineMinPrint);
|
||||
|
||||
out->writeSint16BE((int16)game.input_mode);
|
||||
out->writeSint16BE((int16)game.lognum);
|
||||
out->writeSint16BE((int16)_game.inputMode);
|
||||
out->writeSint16BE((int16)_game.lognum);
|
||||
|
||||
out->writeSint16BE((int16)game.player_control);
|
||||
out->writeSint16BE((int16)game.quit_prog_now);
|
||||
out->writeSint16BE((int16)game.status_line);
|
||||
out->writeSint16BE((int16)game.clock_enabled);
|
||||
out->writeSint16BE((int16)game.exit_all_logics);
|
||||
out->writeSint16BE((int16)game.picture_shown);
|
||||
out->writeSint16BE((int16)game.has_prompt);
|
||||
out->writeSint16BE((int16)game.game_flags);
|
||||
out->writeSint16BE((int16)_game.playerControl);
|
||||
out->writeSint16BE((int16)_game.quitProgNow);
|
||||
out->writeSint16BE((int16)_game.statusLine);
|
||||
out->writeSint16BE((int16)_game.clockEnabled);
|
||||
out->writeSint16BE((int16)_game.exitAllLogics);
|
||||
out->writeSint16BE((int16)_game.pictureShown);
|
||||
out->writeSint16BE((int16)_game.hasPrompt);
|
||||
out->writeSint16BE((int16)_game.gameFlags);
|
||||
|
||||
out->writeSint16BE((int16)game.input_enabled);
|
||||
out->writeSint16BE((int16)_game.inputEnabled);
|
||||
|
||||
for (i = 0; i < _HEIGHT; i++)
|
||||
out->writeByte(game.pri_table[i]);
|
||||
out->writeByte(_game.priTable[i]);
|
||||
|
||||
out->writeSint16BE((int16)game.gfx_mode);
|
||||
out->writeByte(game.cursor_char);
|
||||
out->writeSint16BE((int16)game.color_fg);
|
||||
out->writeSint16BE((int16)game.color_bg);
|
||||
out->writeSint16BE((int16)_game.gfxMode);
|
||||
out->writeByte(_game.cursorChar);
|
||||
out->writeSint16BE((int16)_game.colorFg);
|
||||
out->writeSint16BE((int16)_game.colorBg);
|
||||
|
||||
/* game.hires */
|
||||
/* game.sbuf */
|
||||
/* game.ego_words */
|
||||
/* game.num_ego_words */
|
||||
|
||||
out->writeSint16BE((int16)game.num_objects);
|
||||
for (i = 0; i < (int16)game.num_objects; i++)
|
||||
out->writeSint16BE((int16)object_get_location(i));
|
||||
out->writeSint16BE((int16)_game.numObjects);
|
||||
for (i = 0; i < (int16)_game.numObjects; i++)
|
||||
out->writeSint16BE((int16)objectGetLocation(i));
|
||||
|
||||
/* game.ev_keyp */
|
||||
for (i = 0; i < MAX_STRINGS; i++)
|
||||
out->write(game.strings[i], MAX_STRINGLEN);
|
||||
out->write(_game.strings[i], MAX_STRINGLEN);
|
||||
|
||||
/* record info about loaded resources */
|
||||
for (i = 0; i < MAX_DIRS; i++) {
|
||||
out->writeByte(game.dir_logic[i].flags);
|
||||
out->writeSint16BE((int16)game.logics[i].sIP);
|
||||
out->writeSint16BE((int16)game.logics[i].cIP);
|
||||
out->writeByte(_game.dirLogic[i].flags);
|
||||
out->writeSint16BE((int16)_game.logics[i].sIP);
|
||||
out->writeSint16BE((int16)_game.logics[i].cIP);
|
||||
}
|
||||
for (i = 0; i < MAX_DIRS; i++)
|
||||
out->writeByte(game.dir_pic[i].flags);
|
||||
out->writeByte(_game.dirPic[i].flags);
|
||||
for (i = 0; i < MAX_DIRS; i++)
|
||||
out->writeByte(game.dir_view[i].flags);
|
||||
out->writeByte(_game.dirView[i].flags);
|
||||
for (i = 0; i < MAX_DIRS; i++)
|
||||
out->writeByte(game.dir_sound[i].flags);
|
||||
out->writeByte(_game.dirSound[i].flags);
|
||||
|
||||
/* game.pictures */
|
||||
/* game.logics */
|
||||
|
@ -140,38 +140,38 @@ int AgiEngine::saveGame(const char *fileName, const char *description) {
|
|||
/* game.sounds */
|
||||
|
||||
for (i = 0; i < MAX_VIEWTABLE; i++) {
|
||||
struct vt_entry *v = &game.view_table[i];
|
||||
VtEntry *v = &_game.viewTable[i];
|
||||
|
||||
out->writeByte(v->step_time);
|
||||
out->writeByte(v->step_time_count);
|
||||
out->writeByte(v->stepTime);
|
||||
out->writeByte(v->stepTimeCount);
|
||||
out->writeByte(v->entry);
|
||||
out->writeSint16BE(v->x_pos);
|
||||
out->writeSint16BE(v->y_pos);
|
||||
out->writeByte(v->current_view);
|
||||
out->writeSint16BE(v->xPos);
|
||||
out->writeSint16BE(v->yPos);
|
||||
out->writeByte(v->currentView);
|
||||
|
||||
/* v->view_data */
|
||||
|
||||
out->writeByte(v->current_loop);
|
||||
out->writeByte(v->num_loops);
|
||||
out->writeByte(v->currentLoop);
|
||||
out->writeByte(v->numLoops);
|
||||
|
||||
/* v->loop_data */
|
||||
|
||||
out->writeByte(v->current_cel);
|
||||
out->writeByte(v->num_cels);
|
||||
out->writeByte(v->currentCel);
|
||||
out->writeByte(v->numCels);
|
||||
|
||||
/* v->cel_data */
|
||||
/* v->cel_data_2 */
|
||||
|
||||
out->writeSint16BE(v->x_pos2);
|
||||
out->writeSint16BE(v->y_pos2);
|
||||
out->writeSint16BE(v->xPos2);
|
||||
out->writeSint16BE(v->yPos2);
|
||||
|
||||
/* v->s */
|
||||
|
||||
out->writeSint16BE(v->x_size);
|
||||
out->writeSint16BE(v->y_size);
|
||||
out->writeByte(v->step_size);
|
||||
out->writeByte(v->cycle_time);
|
||||
out->writeByte(v->cycle_time_count);
|
||||
out->writeSint16BE(v->xSize);
|
||||
out->writeSint16BE(v->ySize);
|
||||
out->writeByte(v->stepSize);
|
||||
out->writeByte(v->cycleTime);
|
||||
out->writeByte(v->cycleTimeCount);
|
||||
out->writeByte(v->direction);
|
||||
|
||||
out->writeByte(v->motion);
|
||||
|
@ -188,8 +188,8 @@ int AgiEngine::saveGame(const char *fileName, const char *description) {
|
|||
|
||||
/* Save image stack */
|
||||
|
||||
for (i = 0; i < image_stack_pointer; i++) {
|
||||
ptr = &image_stack[i];
|
||||
for (i = 0; i < _imageStackPointer; i++) {
|
||||
ptr = &_imageStack[i];
|
||||
out->writeByte(ptr->type);
|
||||
out->writeSint16BE(ptr->parm1);
|
||||
out->writeSint16BE(ptr->parm2);
|
||||
|
@ -209,12 +209,12 @@ int AgiEngine::saveGame(const char *fileName, const char *description) {
|
|||
|
||||
delete out;
|
||||
debugC(3, kDebugLevelMain | kDebugLevelSavegame, "Closed %s", fileName);
|
||||
return err_OK;
|
||||
return errOK;
|
||||
}
|
||||
|
||||
int AgiEngine::loadGame(const char *fileName) {
|
||||
char description[31], saveVersion, loadId[8];
|
||||
int i, vt_entries = MAX_VIEWTABLE;
|
||||
int i, vtEntries = MAX_VIEWTABLE;
|
||||
uint8 t;
|
||||
int16 parm[7];
|
||||
Common::InSaveFile *in;
|
||||
|
@ -223,7 +223,7 @@ int AgiEngine::loadGame(const char *fileName) {
|
|||
|
||||
if (!(in = _saveFileMan->openForLoading(fileName))) {
|
||||
warning("Can't open file '%s', game not loaded", fileName);
|
||||
return err_BadFileOpen;
|
||||
return errBadFileOpen;
|
||||
} else {
|
||||
debugC(3, kDebugLevelMain | kDebugLevelSavegame, "Successfully opened %s for reading", fileName);
|
||||
}
|
||||
|
@ -234,7 +234,7 @@ int AgiEngine::loadGame(const char *fileName) {
|
|||
} else {
|
||||
warning("This doesn't appear to be an AGI savegame, game not restored");
|
||||
delete in;
|
||||
return err_OK;
|
||||
return errOK;
|
||||
}
|
||||
|
||||
in->read(description, 31);
|
||||
|
@ -245,59 +245,59 @@ int AgiEngine::loadGame(const char *fileName) {
|
|||
if (saveVersion != SAVEGAME_VERSION)
|
||||
warning("Old save game version (%d, current version is %d). Will try and read anyway, but don't be surprised if bad things happen", saveVersion, SAVEGAME_VERSION);
|
||||
|
||||
game.state = in->readByte();
|
||||
_game.state = in->readByte();
|
||||
|
||||
in->read(loadId, 8);
|
||||
if (strcmp(loadId, game.id)) {
|
||||
if (strcmp(loadId, _game.id)) {
|
||||
delete in;
|
||||
warning("This save seems to be from a different AGI game (save from %s, running %s), not loaded", loadId, game.id);
|
||||
return err_BadFileOpen;
|
||||
warning("This save seems to be from a different AGI game (save from %s, running %s), not loaded", loadId, _game.id);
|
||||
return errBadFileOpen;
|
||||
}
|
||||
|
||||
for (i = 0; i < MAX_FLAGS; i++)
|
||||
game.flags[i] = in->readByte();
|
||||
_game.flags[i] = in->readByte();
|
||||
for (i = 0; i < MAX_VARS; i++)
|
||||
game.vars[i] = in->readByte();
|
||||
_game.vars[i] = in->readByte();
|
||||
|
||||
game.horizon = in->readSint16BE();
|
||||
game.line_status = in->readSint16BE();
|
||||
game.line_user_input = in->readSint16BE();
|
||||
game.line_min_print = in->readSint16BE();
|
||||
_game.horizon = in->readSint16BE();
|
||||
_game.lineStatus = in->readSint16BE();
|
||||
_game.lineUserInput = in->readSint16BE();
|
||||
_game.lineMinPrint = in->readSint16BE();
|
||||
|
||||
/* These are never saved */
|
||||
game.cursor_pos = 0;
|
||||
game.input_buffer[0] = 0;
|
||||
game.echo_buffer[0] = 0;
|
||||
game.keypress = 0;
|
||||
_game.cursorPos = 0;
|
||||
_game.inputBuffer[0] = 0;
|
||||
_game.echoBuffer[0] = 0;
|
||||
_game.keypress = 0;
|
||||
|
||||
game.input_mode = in->readSint16BE();
|
||||
game.lognum = in->readSint16BE();
|
||||
_game.inputMode = in->readSint16BE();
|
||||
_game.lognum = in->readSint16BE();
|
||||
|
||||
game.player_control = in->readSint16BE();
|
||||
game.quit_prog_now = in->readSint16BE();
|
||||
game.status_line = in->readSint16BE();
|
||||
game.clock_enabled = in->readSint16BE();
|
||||
game.exit_all_logics = in->readSint16BE();
|
||||
game.picture_shown = in->readSint16BE();
|
||||
game.has_prompt = in->readSint16BE();
|
||||
game.game_flags = in->readSint16BE();
|
||||
game.input_enabled = in->readSint16BE();
|
||||
_game.playerControl = in->readSint16BE();
|
||||
_game.quitProgNow = in->readSint16BE();
|
||||
_game.statusLine = in->readSint16BE();
|
||||
_game.clockEnabled = in->readSint16BE();
|
||||
_game.exitAllLogics = in->readSint16BE();
|
||||
_game.pictureShown = in->readSint16BE();
|
||||
_game.hasPrompt = in->readSint16BE();
|
||||
_game.gameFlags = in->readSint16BE();
|
||||
_game.inputEnabled = in->readSint16BE();
|
||||
|
||||
for (i = 0; i < _HEIGHT; i++)
|
||||
game.pri_table[i] = in->readByte();
|
||||
_game.priTable[i] = in->readByte();
|
||||
|
||||
if (game.has_window)
|
||||
close_window();
|
||||
if (_game.hasWindow)
|
||||
closeWindow();
|
||||
|
||||
game.msg_box_ticks = 0;
|
||||
game.block.active = false;
|
||||
_game.msgBoxTicks = 0;
|
||||
_game.block.active = false;
|
||||
/* game.window - fixed by close_window() */
|
||||
/* game.has_window - fixed by close_window() */
|
||||
|
||||
game.gfx_mode = in->readSint16BE();
|
||||
game.cursor_char = in->readByte();
|
||||
game.color_fg = in->readSint16BE();
|
||||
game.color_bg = in->readSint16BE();
|
||||
_game.gfxMode = in->readSint16BE();
|
||||
_game.cursorChar = in->readByte();
|
||||
_game.colorFg = in->readSint16BE();
|
||||
_game.colorBg = in->readSint16BE();
|
||||
|
||||
/* game.hires - rebuilt from image stack */
|
||||
/* game.sbuf - rebuilt from image stack */
|
||||
|
@ -305,25 +305,25 @@ int AgiEngine::loadGame(const char *fileName) {
|
|||
/* game.ego_words - fixed by clean_input */
|
||||
/* game.num_ego_words - fixed by clean_input */
|
||||
|
||||
game.num_objects = in->readSint16BE();
|
||||
for (i = 0; i < (int16)game.num_objects; i++)
|
||||
object_set_location(i, in->readSint16BE());
|
||||
_game.numObjects = in->readSint16BE();
|
||||
for (i = 0; i < (int16)_game.numObjects; i++)
|
||||
objectSetLocation(i, in->readSint16BE());
|
||||
|
||||
/* Those are not serialized */
|
||||
for (i = 0; i < MAX_DIRS; i++) {
|
||||
game.ev_keyp[i].occured = false;
|
||||
_game.evKeyp[i].occured = false;
|
||||
}
|
||||
|
||||
for (i = 0; i < MAX_STRINGS; i++)
|
||||
in->read(game.strings[i], MAX_STRINGLEN);
|
||||
in->read(_game.strings[i], MAX_STRINGLEN);
|
||||
|
||||
for (i = 0; i < MAX_DIRS; i++) {
|
||||
if (in->readByte() & RES_LOADED)
|
||||
agiLoadResource(rLOGIC, i);
|
||||
else
|
||||
agiUnloadResource(rLOGIC, i);
|
||||
game.logics[i].sIP = in->readSint16BE();
|
||||
game.logics[i].cIP = in->readSint16BE();
|
||||
_game.logics[i].sIP = in->readSint16BE();
|
||||
_game.logics[i].cIP = in->readSint16BE();
|
||||
}
|
||||
|
||||
for (i = 0; i < MAX_DIRS; i++) {
|
||||
|
@ -352,39 +352,39 @@ int AgiEngine::loadGame(const char *fileName) {
|
|||
/* game.views - loaded above */
|
||||
/* game.sounds - loaded above */
|
||||
|
||||
for (i = 0; i < vt_entries; i++) {
|
||||
struct vt_entry *v = &game.view_table[i];
|
||||
for (i = 0; i < vtEntries; i++) {
|
||||
struct VtEntry *v = &_game.viewTable[i];
|
||||
|
||||
v->step_time = in->readByte();
|
||||
v->step_time_count = in->readByte();
|
||||
v->stepTime = in->readByte();
|
||||
v->stepTimeCount = in->readByte();
|
||||
v->entry = in->readByte();
|
||||
v->x_pos = in->readSint16BE();
|
||||
v->y_pos = in->readSint16BE();
|
||||
v->current_view = in->readByte();
|
||||
v->xPos = in->readSint16BE();
|
||||
v->yPos = in->readSint16BE();
|
||||
v->currentView = in->readByte();
|
||||
|
||||
/* v->view_data - fixed below */
|
||||
|
||||
v->current_loop = in->readByte();
|
||||
v->num_loops = in->readByte();
|
||||
v->currentLoop = in->readByte();
|
||||
v->numLoops = in->readByte();
|
||||
|
||||
/* v->loop_data - fixed below */
|
||||
|
||||
v->current_cel = in->readByte();
|
||||
v->num_cels = in->readByte();
|
||||
v->currentCel = in->readByte();
|
||||
v->numCels = in->readByte();
|
||||
|
||||
/* v->cel_data - fixed below */
|
||||
/* v->cel_data_2 - fixed below */
|
||||
|
||||
v->x_pos2 = in->readSint16BE();
|
||||
v->y_pos2 = in->readSint16BE();
|
||||
v->xPos2 = in->readSint16BE();
|
||||
v->yPos2 = in->readSint16BE();
|
||||
|
||||
/* v->s - fixed below */
|
||||
|
||||
v->x_size = in->readSint16BE();
|
||||
v->y_size = in->readSint16BE();
|
||||
v->step_size = in->readByte();
|
||||
v->cycle_time = in->readByte();
|
||||
v->cycle_time_count = in->readByte();
|
||||
v->xSize = in->readSint16BE();
|
||||
v->ySize = in->readSint16BE();
|
||||
v->stepSize = in->readByte();
|
||||
v->cycleTime = in->readByte();
|
||||
v->cycleTimeCount = in->readByte();
|
||||
v->direction = in->readByte();
|
||||
|
||||
v->motion = in->readByte();
|
||||
|
@ -398,58 +398,58 @@ int AgiEngine::loadGame(const char *fileName) {
|
|||
v->parm3 = in->readByte();
|
||||
v->parm4 = in->readByte();
|
||||
}
|
||||
for (i = vt_entries; i < MAX_VIEWTABLE; i++) {
|
||||
memset(&game.view_table[i], 0, sizeof(struct vt_entry));
|
||||
for (i = vtEntries; i < MAX_VIEWTABLE; i++) {
|
||||
memset(&_game.viewTable[i], 0, sizeof(struct VtEntry));
|
||||
}
|
||||
|
||||
/* Fix some pointers in viewtable */
|
||||
|
||||
for (i = 0; i < MAX_VIEWTABLE; i++) {
|
||||
struct vt_entry *v = &game.view_table[i];
|
||||
struct VtEntry *v = &_game.viewTable[i];
|
||||
|
||||
if (game.dir_view[v->current_view].offset == _EMPTY)
|
||||
if (_game.dirView[v->currentView].offset == _EMPTY)
|
||||
continue;
|
||||
|
||||
if (!(game.dir_view[v->current_view].flags & RES_LOADED))
|
||||
agiLoadResource(rVIEW, v->current_view);
|
||||
if (!(_game.dirView[v->currentView].flags & RES_LOADED))
|
||||
agiLoadResource(rVIEW, v->currentView);
|
||||
|
||||
set_view(v, v->current_view); /* Fix v->view_data */
|
||||
set_loop(v, v->current_loop); /* Fix v->loop_data */
|
||||
set_cel(v, v->current_cel); /* Fix v->cel_data */
|
||||
v->cel_data_2 = v->cel_data;
|
||||
setView(v, v->currentView); /* Fix v->view_data */
|
||||
setLoop(v, v->currentLoop); /* Fix v->loop_data */
|
||||
setCel(v, v->currentCel); /* Fix v->cel_data */
|
||||
v->celData2 = v->celData;
|
||||
v->s = NULL; /* not sure if it is used... */
|
||||
}
|
||||
|
||||
_sprites->erase_both();
|
||||
_sprites->eraseBoth();
|
||||
|
||||
/* Clear input line */
|
||||
_gfx->clearScreen(0);
|
||||
write_status();
|
||||
writeStatus();
|
||||
|
||||
/* Recreate background from saved image stack */
|
||||
clear_image_stack();
|
||||
clearImageStack();
|
||||
while ((t = in->readByte()) != 0) {
|
||||
for (i = 0; i < 7; i++)
|
||||
parm[i] = in->readSint16BE();
|
||||
replay_image_stack_call(t, parm[0], parm[1], parm[2],
|
||||
replayImageStackCall(t, parm[0], parm[1], parm[2],
|
||||
parm[3], parm[4], parm[5], parm[6]);
|
||||
}
|
||||
|
||||
delete in;
|
||||
debugC(3, kDebugLevelMain | kDebugLevelSavegame, "Closed %s", fileName);
|
||||
|
||||
setflag(F_restore_just_ran, true);
|
||||
setflag(fRestoreJustRan, true);
|
||||
|
||||
game.has_prompt = 0; /* force input line repaint if necessary */
|
||||
clean_input();
|
||||
_game.hasPrompt = 0; /* force input line repaint if necessary */
|
||||
cleanInput();
|
||||
|
||||
_sprites->erase_both();
|
||||
_sprites->blit_both();
|
||||
_sprites->commit_both();
|
||||
_picture->show_pic();
|
||||
_sprites->eraseBoth();
|
||||
_sprites->blitBoth();
|
||||
_sprites->commitBoth();
|
||||
_picture->showPic();
|
||||
_gfx->doUpdate();
|
||||
|
||||
return err_OK;
|
||||
return errOK;
|
||||
}
|
||||
|
||||
#define NUM_SLOTS 12
|
||||
|
@ -494,18 +494,18 @@ int AgiEngine::selectSlot() {
|
|||
char dstr[64];
|
||||
for (i = 0; i < NUM_SLOTS; i++) {
|
||||
sprintf(dstr, "[%-32.32s]", desc[i]);
|
||||
print_text(dstr, 0, hm + 1, vm + 4 + i,
|
||||
printText(dstr, 0, hm + 1, vm + 4 + i,
|
||||
(40 - 2 * hm) - 1, i == active ? MSG_BOX_COLOUR : MSG_BOX_TEXT,
|
||||
i == active ? MSG_BOX_TEXT : MSG_BOX_COLOUR);
|
||||
|
||||
}
|
||||
|
||||
_gfx->pollTimer(); /* msdos driver -> does nothing */
|
||||
key = do_poll_keyboard();
|
||||
key = doPollKeyboard();
|
||||
switch (key) {
|
||||
case KEY_ENTER:
|
||||
rc = active;
|
||||
strncpy(game.strings[MAX_STRINGS], desc[i], MAX_STRINGLEN);
|
||||
strncpy(_game.strings[MAX_STRINGS], desc[i], MAX_STRINGLEN);
|
||||
goto press;
|
||||
case KEY_ESCAPE:
|
||||
rc = -1;
|
||||
|
@ -529,7 +529,7 @@ press:
|
|||
debugC(8, kDebugLevelMain | kDebugLevelInput, "Button pressed: %d", rc);
|
||||
|
||||
getout:
|
||||
close_window();
|
||||
closeWindow();
|
||||
return rc;
|
||||
}
|
||||
|
||||
|
@ -550,41 +550,41 @@ int AgiEngine::saveGameDialog() {
|
|||
|
||||
sprintf(fileName, "%s", getSavegameFilename(slot));
|
||||
|
||||
draw_window(hp, vp, GFX_WIDTH - hp, GFX_HEIGHT - vp);
|
||||
print_text("Select a slot in which you wish to save the game:",
|
||||
drawWindow(hp, vp, GFX_WIDTH - hp, GFX_HEIGHT - vp);
|
||||
printText("Select a slot in which you wish to save the game:",
|
||||
0, hm + 1, vm + 1, w, MSG_BOX_TEXT, MSG_BOX_COLOUR);
|
||||
print_text("Press ENTER to select, ESC cancels",
|
||||
printText("Press ENTER to select, ESC cancels",
|
||||
0, hm + 1, vm + 17, w, MSG_BOX_TEXT, MSG_BOX_COLOUR);
|
||||
|
||||
slot = selectSlot();
|
||||
if (slot < 0)
|
||||
return err_OK;
|
||||
return errOK;
|
||||
|
||||
draw_window(hp, vp + 5 * CHAR_LINES, GFX_WIDTH - hp,
|
||||
drawWindow(hp, vp + 5 * CHAR_LINES, GFX_WIDTH - hp,
|
||||
GFX_HEIGHT - vp - 9 * CHAR_LINES);
|
||||
print_text("Enter a description for this game:",
|
||||
printText("Enter a description for this game:",
|
||||
0, hm + 1, vm + 6, w, MSG_BOX_TEXT, MSG_BOX_COLOUR);
|
||||
_gfx->drawRectangle(3 * CHAR_COLS, 11 * CHAR_LINES - 1,
|
||||
37 * CHAR_COLS, 12 * CHAR_LINES, MSG_BOX_TEXT);
|
||||
_gfx->flushBlock(3 * CHAR_COLS, 11 * CHAR_LINES - 1,
|
||||
37 * CHAR_COLS, 12 * CHAR_LINES);
|
||||
|
||||
get_string(2, 11, 33, MAX_STRINGS);
|
||||
_gfx->printCharacter(3, 11, game.cursor_char, MSG_BOX_COLOUR, MSG_BOX_TEXT);
|
||||
getString(2, 11, 33, MAX_STRINGS);
|
||||
_gfx->printCharacter(3, 11, _game.cursorChar, MSG_BOX_COLOUR, MSG_BOX_TEXT);
|
||||
do {
|
||||
main_cycle();
|
||||
} while (game.input_mode == INPUT_GETSTRING);
|
||||
close_window();
|
||||
mainCycle();
|
||||
} while (_game.inputMode == INPUT_GETSTRING);
|
||||
closeWindow();
|
||||
|
||||
desc = game.strings[MAX_STRINGS];
|
||||
desc = _game.strings[MAX_STRINGS];
|
||||
sprintf(dstr, "Are you sure you want to save the game "
|
||||
"described as:\n\n%s\n\nin slot %d?\n\n\n", desc, slot);
|
||||
|
||||
rc = selection_box(dstr, buttons);
|
||||
rc = selectionBox(dstr, buttons);
|
||||
|
||||
if (rc != 0) {
|
||||
message_box("Game NOT saved.");
|
||||
return err_OK;
|
||||
messageBox("Game NOT saved.");
|
||||
return errOK;
|
||||
}
|
||||
|
||||
sprintf(fileName, "%s", getSavegameFilename(slot));
|
||||
|
@ -592,9 +592,9 @@ int AgiEngine::saveGameDialog() {
|
|||
|
||||
saveGame(fileName, desc);
|
||||
|
||||
message_box("Game saved.");
|
||||
messageBox("Game saved.");
|
||||
|
||||
return err_OK;
|
||||
return errOK;
|
||||
}
|
||||
|
||||
int AgiEngine::saveGameSimple() {
|
||||
|
@ -603,7 +603,7 @@ int AgiEngine::saveGameSimple() {
|
|||
sprintf(fileName, "%s", getSavegameFilename(0));
|
||||
saveGame(fileName, "Default savegame");
|
||||
|
||||
return err_OK;
|
||||
return errOK;
|
||||
}
|
||||
|
||||
int AgiEngine::loadGameDialog() {
|
||||
|
@ -620,30 +620,30 @@ int AgiEngine::loadGameDialog() {
|
|||
|
||||
sprintf(fileName, "%s", getSavegameFilename(slot));
|
||||
|
||||
_sprites->erase_both();
|
||||
_sound->stop_sound();
|
||||
_sprites->eraseBoth();
|
||||
_sound->stopSound();
|
||||
|
||||
draw_window(hp, vp, GFX_WIDTH - hp, GFX_HEIGHT - vp);
|
||||
print_text("Select a game which you wish to\nrestore:",
|
||||
drawWindow(hp, vp, GFX_WIDTH - hp, GFX_HEIGHT - vp);
|
||||
printText("Select a game which you wish to\nrestore:",
|
||||
0, hm + 1, vm + 1, w, MSG_BOX_TEXT, MSG_BOX_COLOUR);
|
||||
print_text("Press ENTER to select, ESC cancels",
|
||||
printText("Press ENTER to select, ESC cancels",
|
||||
0, hm + 1, vm + 17, w, MSG_BOX_TEXT, MSG_BOX_COLOUR);
|
||||
|
||||
slot = selectSlot();
|
||||
|
||||
if (slot < 0) {
|
||||
message_box("Game NOT restored.");
|
||||
return err_OK;
|
||||
messageBox("Game NOT restored.");
|
||||
return errOK;
|
||||
}
|
||||
|
||||
sprintf(fileName, "%s", getSavegameFilename(slot));
|
||||
|
||||
if ((rc = loadGame(fileName)) == err_OK) {
|
||||
message_box("Game restored.");
|
||||
game.exit_all_logics = 1;
|
||||
menu->enable_all();
|
||||
if ((rc = loadGame(fileName)) == errOK) {
|
||||
messageBox("Game restored.");
|
||||
_game.exitAllLogics = 1;
|
||||
_menu->enableAll();
|
||||
} else {
|
||||
message_box("Error restoring game.");
|
||||
messageBox("Error restoring game.");
|
||||
}
|
||||
|
||||
return rc;
|
||||
|
@ -655,19 +655,19 @@ int AgiEngine::loadGameSimple() {
|
|||
|
||||
sprintf(fileName, "%s", getSavegameFilename(0));
|
||||
|
||||
_sprites->erase_both();
|
||||
_sound->stop_sound();
|
||||
close_window();
|
||||
_sprites->eraseBoth();
|
||||
_sound->stopSound();
|
||||
closeWindow();
|
||||
|
||||
if ((rc = loadGame(fileName)) == err_OK) {
|
||||
message_box("Game restored.");
|
||||
game.exit_all_logics = 1;
|
||||
menu->enable_all();
|
||||
if ((rc = loadGame(fileName)) == errOK) {
|
||||
messageBox("Game restored.");
|
||||
_game.exitAllLogics = 1;
|
||||
_menu->enableAll();
|
||||
} else {
|
||||
message_box("Error restoring game.");
|
||||
messageBox("Error restoring game.");
|
||||
}
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
} // End of namespace Agi
|
||||
} // End of namespace Agi
|
||||
|
|
|
@ -42,23 +42,23 @@ namespace Agi {
|
|||
/**
|
||||
* AGI engine sound envelope structure.
|
||||
*/
|
||||
struct sound_envelope {
|
||||
struct SoundEnvelope {
|
||||
uint8 bp;
|
||||
uint8 inc_hi;
|
||||
uint8 incHi;
|
||||
uint8 inc_lo;
|
||||
};
|
||||
|
||||
struct sound_wavelist {
|
||||
struct SoundWavelist {
|
||||
uint8 top;
|
||||
uint8 addr;
|
||||
uint8 size;
|
||||
uint8 mode;
|
||||
uint8 rel_hi;
|
||||
uint8 rel_lo;
|
||||
uint8 relHi;
|
||||
uint8 relLo;
|
||||
};
|
||||
|
||||
struct sound_instrument {
|
||||
struct sound_envelope env[8];
|
||||
struct SoundInstrument {
|
||||
struct SoundEnvelope env[8];
|
||||
uint8 relseg;
|
||||
uint8 priority;
|
||||
uint8 bendrange;
|
||||
|
@ -67,41 +67,41 @@ struct sound_instrument {
|
|||
uint8 spare;
|
||||
uint8 wac;
|
||||
uint8 wbc;
|
||||
struct sound_wavelist wal[8];
|
||||
struct sound_wavelist wbl[8];
|
||||
struct SoundWavelist wal[8];
|
||||
struct SoundWavelist wbl[8];
|
||||
};
|
||||
|
||||
struct sound_iigs_sample {
|
||||
uint8 type_lo;
|
||||
uint8 type_hi;
|
||||
uint8 srate_lo;
|
||||
uint8 srate_hi;
|
||||
struct SoundIIgsSample {
|
||||
uint8 typeLo;
|
||||
uint8 typeHi;
|
||||
uint8 srateLo;
|
||||
uint8 srateHi;
|
||||
uint16 unknown[2];
|
||||
uint8 size_lo;
|
||||
uint8 size_hi;
|
||||
uint8 sizeLo;
|
||||
uint8 sizeHi;
|
||||
uint16 unknown2[13];
|
||||
};
|
||||
|
||||
#if 0
|
||||
static struct sound_instrument *instruments;
|
||||
static int num_instruments;
|
||||
static SoundInstrument *instruments;
|
||||
static int numInstruments;
|
||||
static uint8 *wave;
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
static int playing;
|
||||
static struct channel_info chn[NUM_CHANNELS];
|
||||
static ChannelInfo chn[NUM_CHANNELS];
|
||||
static int endflag = -1;
|
||||
static int playing_sound = -1;
|
||||
static int playingSound = -1;
|
||||
static uint8 *song;
|
||||
static uint8 env;
|
||||
|
||||
|
||||
static int16 *snd_buffer;
|
||||
static int16 *sndBuffer;
|
||||
static int16 *waveform;
|
||||
|
||||
static int16 waveform_ramp[WAVEFORM_SIZE] = {
|
||||
static int16 waveformRamp[WAVEFORM_SIZE] = {
|
||||
0, 8, 16, 24, 32, 40, 48, 56,
|
||||
64, 72, 80, 88, 96, 104, 112, 120,
|
||||
128, 136, 144, 152, 160, 168, 176, 184,
|
||||
|
@ -112,7 +112,7 @@ static int16 waveform_ramp[WAVEFORM_SIZE] = {
|
|||
-64, -56, -48, -40, -32, -24, -16, -8 /* Ramp up */
|
||||
};
|
||||
|
||||
static int16 waveform_square[WAVEFORM_SIZE] = {
|
||||
static int16 waveformSquare[WAVEFORM_SIZE] = {
|
||||
255, 230, 220, 220, 220, 220, 220, 220,
|
||||
220, 220, 220, 220, 220, 220, 220, 220,
|
||||
220, 220, 220, 220, 220, 220, 220, 220,
|
||||
|
@ -123,7 +123,7 @@ static int16 waveform_square[WAVEFORM_SIZE] = {
|
|||
-220, -220, -220, -110, 0, 0, 0, 0 /* Square */
|
||||
};
|
||||
|
||||
static int16 waveform_mac[WAVEFORM_SIZE] = {
|
||||
static int16 waveformMac[WAVEFORM_SIZE] = {
|
||||
45, 110, 135, 161, 167, 173, 175, 176,
|
||||
156, 137, 123, 110, 91, 72, 35, -2,
|
||||
-60, -118, -142, -165, -170, -176, -177, -179,
|
||||
|
@ -141,92 +141,92 @@ static uint16 period[] = {
|
|||
1448, 1534, 1625, 1722, 1825, 1933
|
||||
};
|
||||
|
||||
static struct agi_note play_sample[] = {
|
||||
static struct AgiNote playSample[] = {
|
||||
{0xff, 0x7f, 0x18, 0x00, 0x7f},
|
||||
{0xff, 0xff, 0x00, 0x00, 0x00},
|
||||
{0xff, 0xff, 0x00, 0x00, 0x00},
|
||||
{0xff, 0xff, 0x00, 0x00, 0x00}
|
||||
};
|
||||
|
||||
static int note_to_period(int note) {
|
||||
static int noteToPeriod(int note) {
|
||||
return 10 * (period[note % 12] >> (note / 12 - 3));
|
||||
}
|
||||
|
||||
#endif /* USE_IIGS_SOUND */
|
||||
#endif /* USE_IIGS_SOUND */
|
||||
|
||||
void SoundMgr::unload_sound(int resnum) {
|
||||
if (_vm->game.dir_sound[resnum].flags & RES_LOADED) {
|
||||
if (_vm->game.sounds[resnum].flags & SOUND_PLAYING)
|
||||
void SoundMgr::unloadSound(int resnum) {
|
||||
if (_vm->_game.dirSound[resnum].flags & RES_LOADED) {
|
||||
if (_vm->_game.sounds[resnum].flags & SOUND_PLAYING)
|
||||
/* FIXME: Stop playing */
|
||||
;
|
||||
|
||||
/* Release RAW data for sound */
|
||||
free(_vm->game.sounds[resnum].rdata);
|
||||
_vm->game.sounds[resnum].rdata = NULL;
|
||||
_vm->game.dir_sound[resnum].flags &= ~RES_LOADED;
|
||||
free(_vm->_game.sounds[resnum].rdata);
|
||||
_vm->_game.sounds[resnum].rdata = NULL;
|
||||
_vm->_game.dirSound[resnum].flags &= ~RES_LOADED;
|
||||
}
|
||||
}
|
||||
|
||||
void SoundMgr::decode_sound(int resnum) {
|
||||
void SoundMgr::decodeSound(int resnum) {
|
||||
#ifdef USE_IIGS_SOUND
|
||||
int type, size;
|
||||
int16 *buf;
|
||||
uint8 *src;
|
||||
struct sound_iigs_sample *smp;
|
||||
struct SoundIIgsSample *smp;
|
||||
|
||||
debugC(3, kDebugLevelSound, "(%d)", resnum);
|
||||
type = READ_LE_UINT16(_vm->game.sounds[resnum].rdata);
|
||||
type = READ_LE_UINT16(_vm->_game.sounds[resnum].rdata);
|
||||
|
||||
if (type == AGI_SOUND_SAMPLE) {
|
||||
/* Convert sample data to 16 bit signed format
|
||||
*/
|
||||
smp = (struct sound_iigs_sample *)_vm->game.sounds[resnum].rdata;
|
||||
size = ((int)smp->size_hi << 8) + smp->size_lo;
|
||||
src = (uint8 *) _vm->game.sounds[resnum].rdata;
|
||||
buf = (int16 *) calloc(1, 54 + (size << 1) + 100); /* FIXME */
|
||||
smp = (struct SoundIIgsSample *)_vm->_game.sounds[resnum].rdata;
|
||||
size = ((int)smp->sizeHi << 8) + smp->sizeLo;
|
||||
src = (uint8 *)_vm->_game.sounds[resnum].rdata;
|
||||
buf = (int16 *)calloc(1, 54 + (size << 1) + 100); /* FIXME */
|
||||
memcpy(buf, src, 54);
|
||||
for (; size--; buf[size + 54] = ((int16) src[size + 54] - 0x80) << 4); /* FIXME */
|
||||
_vm->game.sounds[resnum].rdata = (uint8 *) buf;
|
||||
for (; size--; buf[size + 54] = ((int16)src[size + 54] - 0x80) << 4); /* FIXME */
|
||||
_vm->_game.sounds[resnum].rdata = (uint8 *) buf;
|
||||
free(src);
|
||||
}
|
||||
#endif /* USE_IIGS_SOUND */
|
||||
}
|
||||
|
||||
void SoundMgr::start_sound(int resnum, int flag) {
|
||||
void SoundMgr::startSound(int resnum, int flag) {
|
||||
int i, type;
|
||||
#ifdef USE_IIGS_SOUND
|
||||
struct sound_iigs_sample *smp;
|
||||
struct SoundIIgsSample *smp;
|
||||
#endif
|
||||
|
||||
if (_vm->game.sounds[resnum].flags & SOUND_PLAYING)
|
||||
if (_vm->_game.sounds[resnum].flags & SOUND_PLAYING)
|
||||
return;
|
||||
|
||||
stop_sound();
|
||||
stopSound();
|
||||
|
||||
if (_vm->game.sounds[resnum].rdata == NULL)
|
||||
if (_vm->_game.sounds[resnum].rdata == NULL)
|
||||
return;
|
||||
|
||||
type = READ_LE_UINT16(_vm->game.sounds[resnum].rdata);
|
||||
type = READ_LE_UINT16(_vm->_game.sounds[resnum].rdata);
|
||||
|
||||
if (type != AGI_SOUND_SAMPLE && type != AGI_SOUND_MIDI && type != AGI_SOUND_4CHN)
|
||||
return;
|
||||
|
||||
_vm->game.sounds[resnum].flags |= SOUND_PLAYING;
|
||||
_vm->game.sounds[resnum].type = type;
|
||||
playing_sound = resnum;
|
||||
song = (uint8 *)_vm->game.sounds[resnum].rdata;
|
||||
_vm->_game.sounds[resnum].flags |= SOUND_PLAYING;
|
||||
_vm->_game.sounds[resnum].type = type;
|
||||
playingSound = resnum;
|
||||
song = (uint8 *)_vm->_game.sounds[resnum].rdata;
|
||||
|
||||
switch (type) {
|
||||
#ifdef USE_IIGS_SOUND
|
||||
case AGI_SOUND_SAMPLE:
|
||||
debugC(3, kDebugLevelSound, "IIGS sample");
|
||||
smp = (struct sound_iigs_sample *)_vm->game.sounds[resnum].rdata;
|
||||
smp = (struct SoundIIgsSample *)_vm->_game.sounds[resnum].rdata;
|
||||
for (i = 0; i < NUM_CHANNELS; i++) {
|
||||
chn[i].type = type;
|
||||
chn[i].flags = 0;
|
||||
chn[i].ins = (int16 *) & _vm->game.sounds[resnum].rdata[54];
|
||||
chn[i].size = ((int)smp->size_hi << 8) + smp->size_lo;
|
||||
chn[i].ptr = &play_sample[i];
|
||||
chn[i].ins = (int16 *)&_vm->_game.sounds[resnum].rdata[54];
|
||||
chn[i].size = ((int)smp->sizeHi << 8) + smp->sizeLo;
|
||||
chn[i].ptr = &playSample[i];
|
||||
chn[i].timer = 0;
|
||||
chn[i].vol = 0;
|
||||
chn[i].end = 0;
|
||||
|
@ -245,7 +245,7 @@ void SoundMgr::start_sound(int resnum, int flag) {
|
|||
}
|
||||
|
||||
chn[0].timer = *(song + 2);
|
||||
chn[0].ptr = (struct agi_note *)(song + 3);
|
||||
chn[0].ptr = (struct AgiNote *)(song + 3);
|
||||
break;
|
||||
#endif
|
||||
case AGI_SOUND_4CHN:
|
||||
|
@ -259,7 +259,7 @@ void SoundMgr::start_sound(int resnum, int flag) {
|
|||
}
|
||||
chn[i].ins = waveform;
|
||||
chn[i].size = WAVEFORM_SIZE;
|
||||
chn[i].ptr = (struct agi_note *)(song + (song[i << 1] | (song[(i << 1) + 1] << 8)));
|
||||
chn[i].ptr = (struct AgiNote *)(song + (song[i << 1] | (song[(i << 1) + 1] << 8)));
|
||||
chn[i].timer = 0;
|
||||
chn[i].vol = 0;
|
||||
chn[i].end = 0;
|
||||
|
@ -267,7 +267,7 @@ void SoundMgr::start_sound(int resnum, int flag) {
|
|||
break;
|
||||
}
|
||||
|
||||
memset(snd_buffer, 0, BUFFER_SIZE << 1);
|
||||
memset(sndBuffer, 0, BUFFER_SIZE << 1);
|
||||
endflag = flag;
|
||||
|
||||
/* Nat Budin reports that the flag should be reset when sound starts
|
||||
|
@ -277,45 +277,45 @@ void SoundMgr::start_sound(int resnum, int flag) {
|
|||
/* FIXME: should wait for sound time instead of setting the flag
|
||||
* immediately
|
||||
*/
|
||||
if (_vm->opt.nosound) {
|
||||
if (_vm->_opt.nosound) {
|
||||
_vm->setflag(endflag, true);
|
||||
stop_sound();
|
||||
stopSound();
|
||||
}
|
||||
}
|
||||
|
||||
void SoundMgr::stop_sound() {
|
||||
void SoundMgr::stopSound() {
|
||||
int i;
|
||||
|
||||
endflag = -1;
|
||||
for (i = 0; i < NUM_CHANNELS; i++)
|
||||
stop_note(i);
|
||||
stopNote(i);
|
||||
|
||||
if (playing_sound != -1) {
|
||||
_vm->game.sounds[playing_sound].flags &= ~SOUND_PLAYING;
|
||||
playing_sound = -1;
|
||||
if (playingSound != -1) {
|
||||
_vm->_game.sounds[playingSound].flags &= ~SOUND_PLAYING;
|
||||
playingSound = -1;
|
||||
}
|
||||
}
|
||||
|
||||
static int16 *buffer;
|
||||
|
||||
int SoundMgr::init_sound() {
|
||||
int SoundMgr::initSound() {
|
||||
int r = -1;
|
||||
|
||||
buffer = snd_buffer = (int16 *)calloc(2, BUFFER_SIZE);
|
||||
buffer = sndBuffer = (int16 *)calloc(2, BUFFER_SIZE);
|
||||
|
||||
env = false;
|
||||
|
||||
switch (_vm->opt.soundemu) {
|
||||
switch (_vm->_opt.soundemu) {
|
||||
case SOUND_EMU_NONE:
|
||||
waveform = waveform_ramp;
|
||||
waveform = waveformRamp;
|
||||
env = true;
|
||||
break;
|
||||
case SOUND_EMU_AMIGA:
|
||||
case SOUND_EMU_PC:
|
||||
waveform = waveform_square;
|
||||
waveform = waveformSquare;
|
||||
break;
|
||||
case SOUND_EMU_MAC:
|
||||
waveform = waveform_mac;
|
||||
waveform = waveformMac;
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -329,33 +329,33 @@ int SoundMgr::init_sound() {
|
|||
}
|
||||
|
||||
#ifdef USE_IIGS_SOUND
|
||||
/*load_instruments ("demo.sys"); */
|
||||
/*loadInstruments("demo.sys"); */
|
||||
#endif
|
||||
|
||||
return r;
|
||||
}
|
||||
|
||||
void SoundMgr::deinit_sound(void) {
|
||||
void SoundMgr::deinitSound() {
|
||||
debugC(3, kDebugLevelSound, "()");
|
||||
free(snd_buffer);
|
||||
free(sndBuffer);
|
||||
}
|
||||
|
||||
void SoundMgr::stop_note(int i) {
|
||||
void SoundMgr::stopNote(int i) {
|
||||
chn[i].adsr = AGI_SOUND_ENV_RELEASE;
|
||||
|
||||
#ifdef USE_CHORUS
|
||||
/* Stop chorus ;) */
|
||||
if (chn[i].type == AGI_SOUND_4CHN &&
|
||||
_vm->opt.soundemu == SOUND_EMU_NONE && i < 3) {
|
||||
stop_note(i + 4);
|
||||
_vm->_opt.soundemu == SOUND_EMU_NONE && i < 3) {
|
||||
stopNote(i + 4);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
void SoundMgr::play_note(int i, int freq, int vol) {
|
||||
if (!_vm->getflag(F_sound_on))
|
||||
void SoundMgr::playNote(int i, int freq, int vol) {
|
||||
if (!_vm->getflag(fSoundOn))
|
||||
vol = 0;
|
||||
else if (vol && _vm->opt.soundemu == SOUND_EMU_PC)
|
||||
else if (vol && _vm->_opt.soundemu == SOUND_EMU_PC)
|
||||
vol = 160;
|
||||
|
||||
chn[i].phase = 0;
|
||||
|
@ -367,19 +367,18 @@ void SoundMgr::play_note(int i, int freq, int vol) {
|
|||
#ifdef USE_CHORUS
|
||||
/* Add chorus ;) */
|
||||
if (chn[i].type == AGI_SOUND_4CHN &&
|
||||
_vm->opt.soundemu == SOUND_EMU_NONE && i < 3) {
|
||||
_vm->_opt.soundemu == SOUND_EMU_NONE && i < 3) {
|
||||
int newfreq = freq * 1007 / 1000;
|
||||
if (freq == newfreq)
|
||||
newfreq++;
|
||||
play_note(i + 4, newfreq, vol * 2 / 3);
|
||||
playNote(i + 4, newfreq, vol * 2 / 3);
|
||||
}
|
||||
#endif
|
||||
|
||||
}
|
||||
|
||||
#ifdef USE_IIGS_SOUND
|
||||
|
||||
void SoundMgr::play_midi_sound() {
|
||||
void SoundMgr::playMidiSound() {
|
||||
uint8 *p;
|
||||
uint8 parm1, parm2;
|
||||
static uint8 cmd, ch;
|
||||
|
@ -391,7 +390,7 @@ void SoundMgr::play_midi_sound() {
|
|||
return;
|
||||
}
|
||||
|
||||
p = (uint8 *) chn[0].ptr;
|
||||
p = (uint8 *)chn[0].ptr;
|
||||
|
||||
if (*p & 0x80) {
|
||||
cmd = *p++;
|
||||
|
@ -404,13 +403,13 @@ void SoundMgr::play_midi_sound() {
|
|||
parm1 = *p++;
|
||||
parm2 = *p++;
|
||||
if (ch < NUM_CHANNELS)
|
||||
stop_note(ch);
|
||||
stopNote(ch);
|
||||
break;
|
||||
case 0x09:
|
||||
parm1 = *p++;
|
||||
parm2 = *p++;
|
||||
if (ch < NUM_CHANNELS)
|
||||
play_note(ch, note_to_period(parm1), 127);
|
||||
playNote(ch, noteToPeriod(parm1), 127);
|
||||
break;
|
||||
case 0x0b:
|
||||
parm1 = *p++;
|
||||
|
@ -421,7 +420,7 @@ void SoundMgr::play_midi_sound() {
|
|||
parm1 = *p++;
|
||||
#if 0
|
||||
if (ch < NUM_CHANNELS) {
|
||||
chn[ch].ins = (uint16 *) & wave[waveaddr[parm1]];
|
||||
chn[ch].ins = (uint16 *)&wave[waveaddr[parm1]];
|
||||
chn[ch].size = wavesize[parm1];
|
||||
}
|
||||
debugC(3, kDebugLevelSound, "set patch %02x (%d,%d), ch %02x",
|
||||
|
@ -431,7 +430,7 @@ void SoundMgr::play_midi_sound() {
|
|||
}
|
||||
|
||||
chn[0].timer = *p++;
|
||||
chn[0].ptr = (struct agi_note *)p;
|
||||
chn[0].ptr = (struct AgiNote *)p;
|
||||
|
||||
if (*p >= 0xfc) {
|
||||
debugC(3, kDebugLevelSound, "end of sequence");
|
||||
|
@ -440,32 +439,32 @@ void SoundMgr::play_midi_sound() {
|
|||
}
|
||||
}
|
||||
|
||||
void SoundMgr::play_sample_sound() {
|
||||
play_note(0, 11025 * 10, 200);
|
||||
void SoundMgr::playSampleSound() {
|
||||
playNote(0, 11025 * 10, 200);
|
||||
playing = 1;
|
||||
}
|
||||
|
||||
#endif /* USE_IIGS_SOUND */
|
||||
#endif /* USE_IIGS_SOUND */
|
||||
|
||||
void SoundMgr::play_agi_sound() {
|
||||
void SoundMgr::playAgiSound() {
|
||||
int i, freq;
|
||||
|
||||
for (playing = i = 0; i < (_vm->opt.soundemu == SOUND_EMU_PC ? 1 : 4); i++) {
|
||||
for (playing = i = 0; i < (_vm->_opt.soundemu == SOUND_EMU_PC ? 1 : 4); i++) {
|
||||
playing |= !chn[i].end;
|
||||
|
||||
if (chn[i].end)
|
||||
continue;
|
||||
|
||||
if ((--chn[i].timer) <= 0) {
|
||||
stop_note(i);
|
||||
freq = ((chn[i].ptr->frq_0 & 0x3f) << 4) | (int)(chn[i].ptr->frq_1 & 0x0f);
|
||||
stopNote(i);
|
||||
freq = ((chn[i].ptr->frq0 & 0x3f) << 4) | (int)(chn[i].ptr->frq1 & 0x0f);
|
||||
|
||||
if (freq) {
|
||||
uint8 v = chn[i].ptr->vol & 0x0f;
|
||||
play_note(i, freq * 10, v == 0xf ? 0 : 0xff - (v << 1));
|
||||
playNote(i, freq * 10, v == 0xf ? 0 : 0xff - (v << 1));
|
||||
}
|
||||
|
||||
chn[i].timer = ((int)chn[i].ptr->dur_hi << 8) | chn[i].ptr->dur_lo;
|
||||
chn[i].timer = ((int)chn[i].ptr->durHi << 8) | chn[i].ptr->durLo;
|
||||
|
||||
if (chn[i].timer == 0xffff) {
|
||||
chn[i].end = 1;
|
||||
|
@ -473,7 +472,7 @@ void SoundMgr::play_agi_sound() {
|
|||
chn[i].env = 0;
|
||||
#ifdef USE_CHORUS
|
||||
/* chorus */
|
||||
if (chn[i].type == AGI_SOUND_4CHN && _vm->opt.soundemu == SOUND_EMU_NONE && i < 3) {
|
||||
if (chn[i].type == AGI_SOUND_4CHN && _vm->_opt.soundemu == SOUND_EMU_NONE && i < 3) {
|
||||
chn[i + 4].vol = 0;
|
||||
chn[i + 4].env = 0;
|
||||
}
|
||||
|
@ -484,7 +483,7 @@ void SoundMgr::play_agi_sound() {
|
|||
}
|
||||
}
|
||||
|
||||
void SoundMgr::play_sound() {
|
||||
void SoundMgr::playSound() {
|
||||
int i;
|
||||
|
||||
if (endflag == -1)
|
||||
|
@ -495,10 +494,10 @@ void SoundMgr::play_sound() {
|
|||
/* play_midi_sound (); */
|
||||
playing = 0;
|
||||
} else if (chn[0].type == AGI_SOUND_SAMPLE) {
|
||||
play_sample_sound();
|
||||
playSampleSound();
|
||||
} else
|
||||
#endif
|
||||
play_agi_sound();
|
||||
playAgiSound();
|
||||
|
||||
if (!playing) {
|
||||
for (i = 0; i < NUM_CHANNELS; chn[i++].vol = 0);
|
||||
|
@ -506,19 +505,19 @@ void SoundMgr::play_sound() {
|
|||
if (endflag != -1)
|
||||
_vm->setflag(endflag, true);
|
||||
|
||||
if (playing_sound != -1)
|
||||
_vm->game.sounds[playing_sound].flags &= ~SOUND_PLAYING;
|
||||
playing_sound = -1;
|
||||
if (playingSound != -1)
|
||||
_vm->_game.sounds[playingSound].flags &= ~SOUND_PLAYING;
|
||||
playingSound = -1;
|
||||
endflag = -1;
|
||||
}
|
||||
}
|
||||
|
||||
uint32 SoundMgr::mix_sound(void) {
|
||||
uint32 SoundMgr::mixSound(void) {
|
||||
register int i, p;
|
||||
int16 *src;
|
||||
int c, b, m;
|
||||
|
||||
memset(snd_buffer, 0, BUFFER_SIZE << 1);
|
||||
memset(sndBuffer, 0, BUFFER_SIZE << 1);
|
||||
|
||||
for (c = 0; c < NUM_CHANNELS; c++) {
|
||||
if (!chn[c].vol)
|
||||
|
@ -536,7 +535,7 @@ uint32 SoundMgr::mix_sound(void) {
|
|||
#ifdef USE_INTERPOLATION
|
||||
b += ((src[((p >> 8) + 1) % chn[c].size] - src[p >> 8]) * (p & 0xff)) >> 8;
|
||||
#endif
|
||||
snd_buffer[i] += (b * m) >> 4;
|
||||
sndBuffer[i] += (b * m) >> 4;
|
||||
|
||||
p += (uint32) 118600 *4 / chn[c].freq;
|
||||
|
||||
|
@ -557,7 +556,7 @@ uint32 SoundMgr::mix_sound(void) {
|
|||
/* Add white noise */
|
||||
for (i = 0; i < BUFFER_SIZE; i++) {
|
||||
b = _vm->_rnd->getRandomNumber(255) - 128;
|
||||
snd_buffer[i] += (b * m) >> 4;
|
||||
sndBuffer[i] += (b * m) >> 4;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -591,26 +590,26 @@ uint32 SoundMgr::mix_sound(void) {
|
|||
#ifdef USE_IIGS_SOUND
|
||||
|
||||
#if 0
|
||||
int SoundMgr::load_instruments(char *fname) {
|
||||
int SoundMgr::loadInstruments(char *fname) {
|
||||
Common::File fp;
|
||||
int i, j, k;
|
||||
struct sound_instrument ai;
|
||||
int num_wav;
|
||||
struct SoundInstrument ai;
|
||||
int numWav;
|
||||
char *path;
|
||||
|
||||
path = "sierrast";
|
||||
|
||||
if (!fp.open(path))
|
||||
return err_BadFileOpen;
|
||||
return errBadFileOpen;
|
||||
report("Loading samples: %s\n", path);
|
||||
|
||||
if ((wave = malloc(0x10000 * 2)) == NULL)
|
||||
return err_NotEnoughMemory;
|
||||
return errNotEnoughMemory;
|
||||
|
||||
fp.read(wave, 0x10000);
|
||||
fp.close();
|
||||
for (i = 0x10000; i--;) {
|
||||
((int16 *) wave)[i] = 2 * ((int16) wave[i] - 128);
|
||||
((int16 *)wave)[i] = 2 * ((int16)wave[i] - 128);
|
||||
}
|
||||
|
||||
fp = fopen("bla", "w");
|
||||
|
@ -620,11 +619,11 @@ int SoundMgr::load_instruments(char *fname) {
|
|||
report("Loading instruments: %s\n", path);
|
||||
|
||||
if ((fp = fopen(path, "rb")) == NULL)
|
||||
return err_BadFileOpen;
|
||||
return errBadFileOpen;
|
||||
|
||||
fseek(fp, 0x8469, SEEK_SET);
|
||||
|
||||
for (num_wav = j = 0; j < 40; j++) {
|
||||
for (numWav = j = 0; j < 40; j++) {
|
||||
fread(&ai, 1, 32, fp);
|
||||
|
||||
if (ai.env[0].bp > 0x7f)
|
||||
|
@ -669,20 +668,20 @@ int SoundMgr::load_instruments(char *fname) {
|
|||
#endif
|
||||
}
|
||||
|
||||
num_instruments = j;
|
||||
numInstruments = j;
|
||||
printf("%d Ensoniq 5503 instruments loaded. (%d waveforms)\n", num_instruments, num_wav);
|
||||
|
||||
fclose(fp);
|
||||
|
||||
return err_OK;
|
||||
return errOK;
|
||||
}
|
||||
|
||||
void Sound::unload_instruments() {
|
||||
void Sound::unloadInstruments() {
|
||||
free(instruments);
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* USE_IIGS_SOUND */
|
||||
#endif /* USE_IIGS_SOUND */
|
||||
|
||||
static void fillAudio(void *udata, int16 *stream, uint len) {
|
||||
SoundMgr *soundMgr = (SoundMgr *)udata;
|
||||
|
@ -694,8 +693,8 @@ static void fillAudio(void *udata, int16 *stream, uint len) {
|
|||
debugC(5, kDebugLevelSound, "(%p, %p, %d)", (void *)udata, (void *)stream, len);
|
||||
memcpy(stream, (uint8 *)buffer + s, p = n);
|
||||
for (n = 0, len -= p; n < len; p += n, len -= n) {
|
||||
soundMgr->play_sound();
|
||||
n = soundMgr->mix_sound() << 1;
|
||||
soundMgr->playSound();
|
||||
n = soundMgr->mixSound() << 1;
|
||||
if (len < n) {
|
||||
memcpy((uint8 *)stream + p, buffer, len);
|
||||
s = len;
|
||||
|
@ -705,8 +704,8 @@ static void fillAudio(void *udata, int16 *stream, uint len) {
|
|||
memcpy((uint8 *)stream + p, buffer, n);
|
||||
}
|
||||
}
|
||||
soundMgr->play_sound();
|
||||
n = soundMgr->mix_sound() << 1;
|
||||
soundMgr->playSound();
|
||||
n = soundMgr->mixSound() << 1;
|
||||
memcpy((uint8 *)stream + p, buffer, s = len);
|
||||
n -= s;
|
||||
}
|
||||
|
|
|
@ -52,7 +52,7 @@ namespace Agi {
|
|||
/**
|
||||
* AGI sound resource structure.
|
||||
*/
|
||||
struct agi_sound {
|
||||
struct AgiSound {
|
||||
uint32 flen; /**< size of raw data */
|
||||
uint8 *rdata; /**< raw sound data */
|
||||
uint8 flags; /**< sound flags */
|
||||
|
@ -62,23 +62,23 @@ struct agi_sound {
|
|||
/**
|
||||
* AGI sound note structure.
|
||||
*/
|
||||
struct agi_note {
|
||||
uint8 dur_lo; /**< LSB of note duration */
|
||||
uint8 dur_hi; /**< MSB of note duration */
|
||||
uint8 frq_0; /**< LSB of note frequency */
|
||||
uint8 frq_1; /**< MSB of note frequency */
|
||||
struct AgiNote {
|
||||
uint8 durLo; /**< LSB of note duration */
|
||||
uint8 durHi; /**< MSB of note duration */
|
||||
uint8 frq0; /**< LSB of note frequency */
|
||||
uint8 frq1; /**< MSB of note frequency */
|
||||
uint8 vol; /**< note volume */
|
||||
};
|
||||
|
||||
/**
|
||||
* AGI engine sound channel structure.
|
||||
*/
|
||||
struct channel_info {
|
||||
struct ChannelInfo {
|
||||
#define AGI_SOUND_SAMPLE 0x0001
|
||||
#define AGI_SOUND_MIDI 0x0002
|
||||
#define AGI_SOUND_4CHN 0x0008
|
||||
uint32 type;
|
||||
struct agi_note *ptr;
|
||||
struct AgiNote *ptr;
|
||||
int16 *ins;
|
||||
int32 size;
|
||||
uint32 phase;
|
||||
|
@ -134,24 +134,24 @@ private:
|
|||
|
||||
public:
|
||||
|
||||
void decode_sound(int);
|
||||
void unload_sound(int);
|
||||
void play_sound();
|
||||
int init_sound();
|
||||
void deinit_sound();
|
||||
void start_sound(int, int);
|
||||
void stop_sound();
|
||||
void stop_note(int i);
|
||||
void play_note(int i, int freq, int vol);
|
||||
void play_agi_sound();
|
||||
uint32 mix_sound();
|
||||
int load_instruments(char *fname);
|
||||
void decodeSound(int);
|
||||
void unloadSound(int);
|
||||
void playSound();
|
||||
int initSound();
|
||||
void deinitSound();
|
||||
void startSound(int, int);
|
||||
void stopSound();
|
||||
void stopNote(int i);
|
||||
void playNote(int i, int freq, int vol);
|
||||
void playAgiSound();
|
||||
uint32 mixSound();
|
||||
int loadInstruments(char *fname);
|
||||
#ifdef USE_IIGS_SOUND
|
||||
void play_midi_sound();
|
||||
void play_sample_sound();
|
||||
void playMidiSound();
|
||||
void playSampleSound();
|
||||
#endif
|
||||
};
|
||||
|
||||
} // End of namespace Agi
|
||||
|
||||
#endif /* AGI_SOUND_H */
|
||||
#endif /* AGI_SOUND_H */
|
||||
|
|
|
@ -35,12 +35,12 @@ namespace Agi {
|
|||
* a rectangular area of the AGI screen. Sprites are chained in two
|
||||
* circular lists, one for updating and other for non-updating sprites.
|
||||
*/
|
||||
struct sprite {
|
||||
vt_entry *v; /**< pointer to view table entry */
|
||||
int16 x_pos; /**< x coordinate of the sprite */
|
||||
int16 y_pos; /**< y coordinate of the sprite */
|
||||
int16 x_size; /**< width of the sprite */
|
||||
int16 y_size; /**< height of the sprite */
|
||||
struct Sprite {
|
||||
VtEntry *v; /**< pointer to view table entry */
|
||||
int16 xPos; /**< x coordinate of the sprite */
|
||||
int16 yPos; /**< y coordinate of the sprite */
|
||||
int16 xSize; /**< width of the sprite */
|
||||
int16 ySize; /**< height of the sprite */
|
||||
uint8 *buffer; /**< buffer to store background data */
|
||||
};
|
||||
|
||||
|
@ -53,7 +53,7 @@ struct sprite {
|
|||
#define POOL_SIZE 68000 /* Gold Rush mine room needs > 50000 */
|
||||
/* Speeder bike challenge needs > 67000 */
|
||||
|
||||
void *SpritesMgr::pool_alloc(int size) {
|
||||
void *SpritesMgr::poolAlloc(int size) {
|
||||
uint8 *x;
|
||||
|
||||
/* Adjust size to 32-bit boundary to prevent data misalignment
|
||||
|
@ -61,12 +61,12 @@ void *SpritesMgr::pool_alloc(int size) {
|
|||
*/
|
||||
size = (size + 3) & ~3;
|
||||
|
||||
x = pool_top;
|
||||
pool_top += size;
|
||||
x = _poolTop;
|
||||
_poolTop += size;
|
||||
|
||||
if (pool_top >= (uint8 *)sprite_pool + POOL_SIZE) {
|
||||
if (_poolTop >= (uint8 *)_spritePool + POOL_SIZE) {
|
||||
debugC(1, kDebugLevelMain | kDebugLevelResources, "not enough memory");
|
||||
pool_top = x;
|
||||
_poolTop = x;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
@ -76,8 +76,8 @@ void *SpritesMgr::pool_alloc(int size) {
|
|||
/* Note: it's critical that pool_release() is called in the exact
|
||||
reverse order of pool_alloc()
|
||||
*/
|
||||
void SpritesMgr::pool_release(void *s) {
|
||||
pool_top = (uint8 *)s;
|
||||
void SpritesMgr::poolRelease(void *s) {
|
||||
_poolTop = (uint8 *)s;
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -86,7 +86,7 @@ void SpritesMgr::pool_release(void *s) {
|
|||
|
||||
/* Blit one pixel considering the priorities */
|
||||
|
||||
void SpritesMgr::blit_pixel(uint8 *p, uint8 *end, uint8 col, int spr, int width, int *hidden) {
|
||||
void SpritesMgr::blitPixel(uint8 *p, uint8 *end, uint8 col, int spr, int width, int *hidden) {
|
||||
int epr = 0, pr = 0; /* effective and real priorities */
|
||||
|
||||
/* CM: priority 15 overrides control lines and is ignored when
|
||||
|
@ -132,7 +132,7 @@ void SpritesMgr::blit_pixel(uint8 *p, uint8 *end, uint8 col, int spr, int width,
|
|||
}
|
||||
|
||||
|
||||
int SpritesMgr::blit_cel(int x, int y, int spr, view_cel *c) {
|
||||
int SpritesMgr::blitCel(int x, int y, int spr, ViewCel *c) {
|
||||
uint8 *p0, *p, *q = NULL, *end;
|
||||
int i, j, t, m, col;
|
||||
int hidden = true;
|
||||
|
@ -151,9 +151,9 @@ int SpritesMgr::blit_cel(int x, int y, int spr, view_cel *c) {
|
|||
t = c->transparency;
|
||||
m = c->mirror;
|
||||
spr <<= 4;
|
||||
p0 = &_vm->game.sbuf[x + y * _WIDTH + m * (c->width - 1)];
|
||||
p0 = &_vm->_game.sbuf[x + y * _WIDTH + m * (c->width - 1)];
|
||||
|
||||
end = _vm->game.sbuf + _WIDTH * _HEIGHT;
|
||||
end = _vm->_game.sbuf + _WIDTH * _HEIGHT;
|
||||
|
||||
for (i = 0; i < c->height; i++) {
|
||||
p = p0;
|
||||
|
@ -161,7 +161,7 @@ int SpritesMgr::blit_cel(int x, int y, int spr, view_cel *c) {
|
|||
col = (*q & 0xf0) >> 4;
|
||||
for (j = *q & 0x0f; j; j--, p += 1 - 2 * m) {
|
||||
if (col != t) {
|
||||
blit_pixel(p, end, col, spr, _WIDTH, &hidden);
|
||||
blitPixel(p, end, col, spr, _WIDTH, &hidden);
|
||||
}
|
||||
}
|
||||
q++;
|
||||
|
@ -173,72 +173,72 @@ int SpritesMgr::blit_cel(int x, int y, int spr, view_cel *c) {
|
|||
return hidden;
|
||||
}
|
||||
|
||||
void SpritesMgr::objs_savearea(sprite *s) {
|
||||
void SpritesMgr::objsSaveArea(Sprite *s) {
|
||||
int y;
|
||||
int16 x_pos = s->x_pos, y_pos = s->y_pos;
|
||||
int16 x_size = s->x_size, y_size = s->y_size;
|
||||
int16 xPos = s->xPos, yPos = s->yPos;
|
||||
int16 xSize = s->xSize, ySize = s->ySize;
|
||||
uint8 *p0, *q;
|
||||
|
||||
if (x_pos + x_size > _WIDTH)
|
||||
x_size = _WIDTH - x_pos;
|
||||
if (xPos + xSize > _WIDTH)
|
||||
xSize = _WIDTH - xPos;
|
||||
|
||||
if (x_pos < 0) {
|
||||
x_size += x_pos;
|
||||
x_pos = 0;
|
||||
if (xPos < 0) {
|
||||
xSize += xPos;
|
||||
xPos = 0;
|
||||
}
|
||||
|
||||
if (y_pos + y_size > _HEIGHT)
|
||||
y_size = _HEIGHT - y_pos;
|
||||
if (yPos + ySize > _HEIGHT)
|
||||
ySize = _HEIGHT - yPos;
|
||||
|
||||
if (y_pos < 0) {
|
||||
y_size += y_pos;
|
||||
y_pos = 0;
|
||||
if (yPos < 0) {
|
||||
ySize += yPos;
|
||||
yPos = 0;
|
||||
}
|
||||
|
||||
if (x_size <= 0 || y_size <= 0)
|
||||
if (xSize <= 0 || ySize <= 0)
|
||||
return;
|
||||
|
||||
p0 = &_vm->game.sbuf[x_pos + y_pos * _WIDTH];
|
||||
p0 = &_vm->_game.sbuf[xPos + yPos * _WIDTH];
|
||||
q = s->buffer;
|
||||
for (y = 0; y < y_size; y++) {
|
||||
memcpy(q, p0, x_size);
|
||||
q += x_size;
|
||||
for (y = 0; y < ySize; y++) {
|
||||
memcpy(q, p0, xSize);
|
||||
q += xSize;
|
||||
p0 += _WIDTH;
|
||||
}
|
||||
}
|
||||
|
||||
void SpritesMgr::objs_restorearea(sprite *s) {
|
||||
void SpritesMgr::objsRestoreArea(Sprite *s) {
|
||||
int y, offset;
|
||||
int16 x_pos = s->x_pos, y_pos = s->y_pos;
|
||||
int16 x_size = s->x_size, y_size = s->y_size;
|
||||
int16 xPos = s->xPos, yPos = s->yPos;
|
||||
int16 xSize = s->xSize, ySize = s->ySize;
|
||||
uint8 *p0, *q;
|
||||
|
||||
if (x_pos + x_size > _WIDTH)
|
||||
x_size = _WIDTH - x_pos;
|
||||
if (xPos + xSize > _WIDTH)
|
||||
xSize = _WIDTH - xPos;
|
||||
|
||||
if (x_pos < 0) {
|
||||
x_size += x_pos;
|
||||
x_pos = 0;
|
||||
if (xPos < 0) {
|
||||
xSize += xPos;
|
||||
xPos = 0;
|
||||
}
|
||||
|
||||
if (y_pos + y_size > _HEIGHT)
|
||||
y_size = _HEIGHT - y_pos;
|
||||
if (yPos + ySize > _HEIGHT)
|
||||
ySize = _HEIGHT - yPos;
|
||||
|
||||
if (y_pos < 0) {
|
||||
y_size += y_pos;
|
||||
y_pos = 0;
|
||||
if (yPos < 0) {
|
||||
ySize += yPos;
|
||||
yPos = 0;
|
||||
}
|
||||
|
||||
if (x_size <= 0 || y_size <= 0)
|
||||
if (xSize <= 0 || ySize <= 0)
|
||||
return;
|
||||
|
||||
p0 = &_vm->game.sbuf[x_pos + y_pos * _WIDTH];
|
||||
p0 = &_vm->_game.sbuf[xPos + yPos * _WIDTH];
|
||||
q = s->buffer;
|
||||
offset = _vm->game.line_min_print * CHAR_LINES;
|
||||
for (y = 0; y < y_size; y++) {
|
||||
memcpy(p0, q, x_size);
|
||||
_gfx->putPixelsA(x_pos, y_pos + y + offset, x_size, p0);
|
||||
q += x_size;
|
||||
offset = _vm->_game.lineMinPrint * CHAR_LINES;
|
||||
for (y = 0; y < ySize; y++) {
|
||||
memcpy(p0, q, xSize);
|
||||
_gfx->putPixelsA(xPos, yPos + y + offset, xSize, p0);
|
||||
q += xSize;
|
||||
p0 += _WIDTH;
|
||||
}
|
||||
}
|
||||
|
@ -247,9 +247,9 @@ void SpritesMgr::objs_restorearea(sprite *s) {
|
|||
/**
|
||||
* Condition to determine whether a sprite will be in the 'updating' list.
|
||||
*/
|
||||
bool SpritesMgr::test_updating(vt_entry *v, AgiEngine *agi) {
|
||||
bool SpritesMgr::testUpdating(VtEntry *v, AgiEngine *agi) {
|
||||
/* Sanity check (see bug #779302) */
|
||||
if (~agi->game.dir_view[v->current_view].flags & RES_LOADED)
|
||||
if (~agi->_game.dirView[v->currentView].flags & RES_LOADED)
|
||||
return false;
|
||||
|
||||
return (v->flags & (ANIMATED | UPDATE | DRAWN)) == (ANIMATED | UPDATE | DRAWN);
|
||||
|
@ -258,9 +258,9 @@ bool SpritesMgr::test_updating(vt_entry *v, AgiEngine *agi) {
|
|||
/**
|
||||
* Condition to determine whether a sprite will be in the 'non-updating' list.
|
||||
*/
|
||||
bool SpritesMgr::test_not_updating(vt_entry *v, AgiEngine *agi) {
|
||||
bool SpritesMgr::testNotUpdating(VtEntry *v, AgiEngine *vm) {
|
||||
/* Sanity check (see bug #779302) */
|
||||
if (~agi->game.dir_view[v->current_view].flags & RES_LOADED)
|
||||
if (~vm->_game.dirView[v->currentView].flags & RES_LOADED)
|
||||
return false;
|
||||
|
||||
return (v->flags & (ANIMATED | UPDATE | DRAWN)) == (ANIMATED | DRAWN);
|
||||
|
@ -269,14 +269,14 @@ bool SpritesMgr::test_not_updating(vt_entry *v, AgiEngine *agi) {
|
|||
/**
|
||||
* Convert sprite priority to y value.
|
||||
*/
|
||||
INLINE int SpritesMgr::prio_to_y(int p) {
|
||||
INLINE int SpritesMgr::prioToY(int p) {
|
||||
int i;
|
||||
|
||||
if (p == 0)
|
||||
return -1;
|
||||
|
||||
for (i = 167; i >= 0; i--) {
|
||||
if (_vm->game.pri_table[i] < p)
|
||||
if (_vm->_game.priTable[i] < p)
|
||||
return i;
|
||||
}
|
||||
|
||||
|
@ -286,18 +286,18 @@ INLINE int SpritesMgr::prio_to_y(int p) {
|
|||
/**
|
||||
* Create and initialize a new sprite structure.
|
||||
*/
|
||||
sprite *SpritesMgr::new_sprite(vt_entry *v) {
|
||||
sprite *s;
|
||||
s = (sprite *)pool_alloc(sizeof(sprite));
|
||||
Sprite *SpritesMgr::newSprite(VtEntry *v) {
|
||||
Sprite *s;
|
||||
s = (Sprite *)poolAlloc(sizeof(Sprite));
|
||||
if (s == NULL)
|
||||
return NULL;
|
||||
|
||||
s->v = v; /* link sprite to associated view table entry */
|
||||
s->x_pos = v->x_pos;
|
||||
s->y_pos = v->y_pos - v->y_size + 1;
|
||||
s->x_size = v->x_size;
|
||||
s->y_size = v->y_size;
|
||||
s->buffer = (uint8 *) pool_alloc(s->x_size * s->y_size);
|
||||
s->xPos = v->xPos;
|
||||
s->yPos = v->yPos - v->ySize + 1;
|
||||
s->xSize = v->xSize;
|
||||
s->ySize = v->ySize;
|
||||
s->buffer = (uint8 *)poolAlloc(s->xSize * s->ySize);
|
||||
v->s = s; /* link view table entry to this sprite */
|
||||
|
||||
return s;
|
||||
|
@ -306,29 +306,29 @@ sprite *SpritesMgr::new_sprite(vt_entry *v) {
|
|||
/**
|
||||
* Insert sprite in the specified sprite list.
|
||||
*/
|
||||
void SpritesMgr::spr_addlist(SpriteList& l, vt_entry *v) {
|
||||
sprite *s = new_sprite(v);
|
||||
void SpritesMgr::sprAddlist(SpriteList &l, VtEntry *v) {
|
||||
Sprite *s = newSprite(v);
|
||||
l.push_back(s);
|
||||
}
|
||||
|
||||
/**
|
||||
* Sort sprites from lower y values to build a sprite list.
|
||||
*/
|
||||
void SpritesMgr::build_list(SpriteList& l, bool (*test) (vt_entry *, AgiEngine *)) {
|
||||
void SpritesMgr::buildList(SpriteList &l, bool (*test)(VtEntry *, AgiEngine *)) {
|
||||
int i, j, k;
|
||||
vt_entry *v;
|
||||
vt_entry *entry[0x100];
|
||||
int y_val[0x100];
|
||||
int min_y = 0xff, min_index = 0;
|
||||
VtEntry *v;
|
||||
VtEntry *entry[0x100];
|
||||
int yVal[0x100];
|
||||
int minY = 0xff, minIndex = 0;
|
||||
|
||||
/* fill the arrays with all sprites that satisfy the 'test'
|
||||
* condition and their y values
|
||||
*/
|
||||
i = 0;
|
||||
for (v = _vm->game.view_table; v < &_vm->game.view_table[MAX_VIEWTABLE]; v++) {
|
||||
for (v = _vm->_game.viewTable; v < &_vm->_game.viewTable[MAX_VIEWTABLE]; v++) {
|
||||
if ((*test)(v, _vm)) {
|
||||
entry[i] = v;
|
||||
y_val[i] = v->flags & FIXED_PRIORITY ? prio_to_y(v->priority) : v->y_pos;
|
||||
yVal[i] = v->flags & FIXED_PRIORITY ? prioToY(v->priority) : v->yPos;
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
@ -337,42 +337,42 @@ void SpritesMgr::build_list(SpriteList& l, bool (*test) (vt_entry *, AgiEngine *
|
|||
* sprite in the list
|
||||
*/
|
||||
for (j = 0; j < i; j++) {
|
||||
min_y = 0xff;
|
||||
minY = 0xff;
|
||||
for (k = 0; k < i; k++) {
|
||||
if (y_val[k] < min_y) {
|
||||
min_index = k;
|
||||
min_y = y_val[k];
|
||||
if (yVal[k] < minY) {
|
||||
minIndex = k;
|
||||
minY = yVal[k];
|
||||
}
|
||||
}
|
||||
|
||||
y_val[min_index] = 0xff;
|
||||
spr_addlist(l, entry[min_index]);
|
||||
yVal[minIndex] = 0xff;
|
||||
sprAddlist(l, entry[minIndex]);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Build list of updating sprites.
|
||||
*/
|
||||
void SpritesMgr::build_upd_blitlist() {
|
||||
build_list(spr_upd, test_updating);
|
||||
void SpritesMgr::buildUpdBlitlist() {
|
||||
buildList(_sprUpd, testUpdating);
|
||||
}
|
||||
|
||||
/**
|
||||
* Build list of non-updating sprites.
|
||||
*/
|
||||
void SpritesMgr::build_nonupd_blitlist() {
|
||||
build_list(spr_nonupd, test_not_updating);
|
||||
void SpritesMgr::buildNonupdBlitlist() {
|
||||
buildList(_sprNonupd, testNotUpdating);
|
||||
}
|
||||
|
||||
/**
|
||||
* Clear the given sprite list.
|
||||
*/
|
||||
void SpritesMgr::free_list(SpriteList& l) {
|
||||
void SpritesMgr::freeList(SpriteList &l) {
|
||||
SpriteList::iterator iter;
|
||||
for (iter = l.reverse_begin(); iter != l.end(); ) {
|
||||
sprite* s = *iter;
|
||||
pool_release(s->buffer);
|
||||
pool_release(s);
|
||||
Sprite* s = *iter;
|
||||
poolRelease(s->buffer);
|
||||
poolRelease(s);
|
||||
iter = l.reverse_erase(iter);
|
||||
}
|
||||
}
|
||||
|
@ -381,49 +381,49 @@ void SpritesMgr::free_list(SpriteList& l) {
|
|||
* Copy sprites from the pic buffer to the screen buffer, and check if
|
||||
* sprites of the given list have moved.
|
||||
*/
|
||||
void SpritesMgr::commit_sprites(SpriteList& l) {
|
||||
void SpritesMgr::commitSprites(SpriteList &l) {
|
||||
SpriteList::iterator iter;
|
||||
for (iter = l.begin(); iter != l.end(); ++iter) {
|
||||
sprite *s = *iter;
|
||||
Sprite *s = *iter;
|
||||
int x1, y1, x2, y2, w, h;
|
||||
|
||||
w = (s->v->cel_data->width > s->v->cel_data_2->width) ?
|
||||
s->v->cel_data->width : s->v->cel_data_2->width;
|
||||
w = (s->v->celData->width > s->v->celData2->width) ?
|
||||
s->v->celData->width : s->v->celData2->width;
|
||||
|
||||
h = (s->v->cel_data->height >
|
||||
s->v->cel_data_2->height) ? s->v->cel_data->
|
||||
height : s->v->cel_data_2->height;
|
||||
h = (s->v->celData->height >
|
||||
s->v->celData2->height) ? s->v->celData->
|
||||
height : s->v->celData2->height;
|
||||
|
||||
s->v->cel_data_2 = s->v->cel_data;
|
||||
s->v->celData2 = s->v->celData;
|
||||
|
||||
if (s->v->x_pos < s->v->x_pos2) {
|
||||
x1 = s->v->x_pos;
|
||||
x2 = s->v->x_pos2 + w - 1;
|
||||
if (s->v->xPos < s->v->xPos2) {
|
||||
x1 = s->v->xPos;
|
||||
x2 = s->v->xPos2 + w - 1;
|
||||
} else {
|
||||
x1 = s->v->x_pos2;
|
||||
x2 = s->v->x_pos + w - 1;
|
||||
x1 = s->v->xPos2;
|
||||
x2 = s->v->xPos + w - 1;
|
||||
}
|
||||
|
||||
if (s->v->y_pos < s->v->y_pos2) {
|
||||
y1 = s->v->y_pos - h + 1;
|
||||
y2 = s->v->y_pos2;
|
||||
if (s->v->yPos < s->v->yPos2) {
|
||||
y1 = s->v->yPos - h + 1;
|
||||
y2 = s->v->yPos2;
|
||||
} else {
|
||||
y1 = s->v->y_pos2 - h + 1;
|
||||
y2 = s->v->y_pos;
|
||||
y1 = s->v->yPos2 - h + 1;
|
||||
y2 = s->v->yPos;
|
||||
}
|
||||
|
||||
commit_block(x1, y1, x2, y2);
|
||||
commitBlock(x1, y1, x2, y2);
|
||||
|
||||
if (s->v->step_time_count != s->v->step_time)
|
||||
if (s->v->stepTimeCount != s->v->stepTime)
|
||||
continue;
|
||||
|
||||
if (s->v->x_pos == s->v->x_pos2 && s->v->y_pos == s->v->y_pos2) {
|
||||
if (s->v->xPos == s->v->xPos2 && s->v->yPos == s->v->yPos2) {
|
||||
s->v->flags |= DIDNT_MOVE;
|
||||
continue;
|
||||
}
|
||||
|
||||
s->v->x_pos2 = s->v->x_pos;
|
||||
s->v->y_pos2 = s->v->y_pos;
|
||||
s->v->xPos2 = s->v->xPos;
|
||||
s->v->yPos2 = s->v->yPos;
|
||||
s->v->flags &= ~DIDNT_MOVE;
|
||||
}
|
||||
}
|
||||
|
@ -431,29 +431,29 @@ void SpritesMgr::commit_sprites(SpriteList& l) {
|
|||
/**
|
||||
* Erase all sprites in the given list.
|
||||
*/
|
||||
void SpritesMgr::erase_sprites(SpriteList& l) {
|
||||
void SpritesMgr::eraseSprites(SpriteList &l) {
|
||||
SpriteList::iterator iter;
|
||||
for (iter = l.reverse_begin(); iter != l.end(); --iter) {
|
||||
sprite *s = *iter;
|
||||
objs_restorearea(s);
|
||||
Sprite *s = *iter;
|
||||
objsRestoreArea(s);
|
||||
}
|
||||
|
||||
free_list(l);
|
||||
freeList(l);
|
||||
}
|
||||
|
||||
/**
|
||||
* Blit all sprites in the given list.
|
||||
*/
|
||||
void SpritesMgr::blit_sprites(SpriteList& l) {
|
||||
void SpritesMgr::blitSprites(SpriteList& l) {
|
||||
int hidden;
|
||||
SpriteList::iterator iter;
|
||||
for (iter = l.begin(); iter != l.end(); ++iter) {
|
||||
sprite *s = *iter;
|
||||
objs_savearea(s);
|
||||
Sprite *s = *iter;
|
||||
objsSaveArea(s);
|
||||
debugC(8, kDebugLevelSprites, "s->v->entry = %d (prio %d)", s->v->entry, s->v->priority);
|
||||
hidden = blit_cel(s->x_pos, s->y_pos, s->v->priority, s->v->cel_data);
|
||||
hidden = blitCel(s->xPos, s->yPos, s->v->priority, s->v->celData);
|
||||
if (s->v->entry == 0) { /* if ego, update f1 */
|
||||
_vm->setflag(F_ego_invisible, hidden);
|
||||
_vm->setflag(fEgoInvisible, hidden);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -462,18 +462,18 @@ void SpritesMgr::blit_sprites(SpriteList& l) {
|
|||
* Public functions
|
||||
*/
|
||||
|
||||
void SpritesMgr::commit_upd_sprites() {
|
||||
commit_sprites(spr_upd);
|
||||
void SpritesMgr::commitUpdSprites() {
|
||||
commitSprites(_sprUpd);
|
||||
}
|
||||
|
||||
void SpritesMgr::commit_nonupd_sprites() {
|
||||
commit_sprites(spr_nonupd);
|
||||
void SpritesMgr::commitNonupdSprites() {
|
||||
commitSprites(_sprNonupd);
|
||||
}
|
||||
|
||||
/* check moves in both lists */
|
||||
void SpritesMgr::commit_both() {
|
||||
commit_upd_sprites();
|
||||
commit_nonupd_sprites();
|
||||
void SpritesMgr::commitBoth() {
|
||||
commitUpdSprites();
|
||||
commitNonupdSprites();
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -485,8 +485,8 @@ void SpritesMgr::commit_both() {
|
|||
* @see erase_nonupd_sprites()
|
||||
* @see erase_both()
|
||||
*/
|
||||
void SpritesMgr::erase_upd_sprites() {
|
||||
erase_sprites(spr_upd);
|
||||
void SpritesMgr::eraseUpdSprites() {
|
||||
eraseSprites(_sprUpd);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -498,8 +498,8 @@ void SpritesMgr::erase_upd_sprites() {
|
|||
* @see erase_upd_sprites()
|
||||
* @see erase_both()
|
||||
*/
|
||||
void SpritesMgr::erase_nonupd_sprites() {
|
||||
erase_sprites(spr_nonupd);
|
||||
void SpritesMgr::eraseNonupdSprites() {
|
||||
eraseSprites(_sprNonupd);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -511,9 +511,9 @@ void SpritesMgr::erase_nonupd_sprites() {
|
|||
* @see erase_upd_sprites()
|
||||
* @see erase_nonupd_sprites()
|
||||
*/
|
||||
void SpritesMgr::erase_both() {
|
||||
erase_upd_sprites();
|
||||
erase_nonupd_sprites();
|
||||
void SpritesMgr::eraseBoth() {
|
||||
eraseUpdSprites();
|
||||
eraseNonupdSprites();
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -524,10 +524,10 @@ void SpritesMgr::erase_both() {
|
|||
* @see blit_nonupd_sprites()
|
||||
* @see blit_both()
|
||||
*/
|
||||
void SpritesMgr::blit_upd_sprites() {
|
||||
void SpritesMgr::blitUpdSprites() {
|
||||
debugC(7, kDebugLevelSprites, "blit updating");
|
||||
build_upd_blitlist();
|
||||
blit_sprites(spr_upd);
|
||||
buildUpdBlitlist();
|
||||
blitSprites(_sprUpd);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -538,10 +538,10 @@ void SpritesMgr::blit_upd_sprites() {
|
|||
* @see blit_upd_sprites()
|
||||
* @see blit_both()
|
||||
*/
|
||||
void SpritesMgr::blit_nonupd_sprites() {
|
||||
void SpritesMgr::blitNonupdSprites() {
|
||||
debugC(7, kDebugLevelSprites, "blit non-updating");
|
||||
build_nonupd_blitlist();
|
||||
blit_sprites(spr_nonupd);
|
||||
buildNonupdBlitlist();
|
||||
blitSprites(_sprNonupd);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -552,9 +552,9 @@ void SpritesMgr::blit_nonupd_sprites() {
|
|||
* @see blit_upd_sprites()
|
||||
* @see blit_nonupd_sprites()
|
||||
*/
|
||||
void SpritesMgr::blit_both() {
|
||||
blit_nonupd_sprites();
|
||||
blit_upd_sprites();
|
||||
void SpritesMgr::blitBoth() {
|
||||
blitNonupdSprites();
|
||||
blitUpdSprites();
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -570,23 +570,23 @@ void SpritesMgr::blit_both() {
|
|||
* @param pri priority to use
|
||||
* @param mar if < 4, create a margin around the the base of the cel
|
||||
*/
|
||||
void SpritesMgr::add_to_pic(int view, int loop, int cel, int x, int y, int pri, int mar) {
|
||||
view_cel *c = NULL;
|
||||
void SpritesMgr::addToPic(int view, int loop, int cel, int x, int y, int pri, int mar) {
|
||||
ViewCel *c = NULL;
|
||||
int x1, y1, x2, y2, y3;
|
||||
uint8 *p1, *p2;
|
||||
|
||||
debugC(3, kDebugLevelSprites, "v=%d, l=%d, c=%d, x=%d, y=%d, p=%d, m=%d", view, loop, cel, x, y, pri, mar);
|
||||
|
||||
_vm->record_image_stack_call(ADD_VIEW, view, loop, cel, x, y, pri, mar);
|
||||
_vm->recordImageStackCall(ADD_VIEW, view, loop, cel, x, y, pri, mar);
|
||||
|
||||
/*
|
||||
* Was hardcoded to 8, changed to pri_table[y] to fix Gold
|
||||
* Rush (see bug #587558)
|
||||
*/
|
||||
if (pri == 0)
|
||||
pri = _vm->game.pri_table[y];
|
||||
pri = _vm->_game.priTable[y];
|
||||
|
||||
c = &_vm->game.views[view].loop[loop].cel[cel];
|
||||
c = &_vm->_game.views[view].loop[loop].cel[cel];
|
||||
|
||||
x1 = x;
|
||||
y1 = y - c->height + 1;
|
||||
|
@ -606,10 +606,10 @@ void SpritesMgr::add_to_pic(int view, int loop, int cel, int x, int y, int pri,
|
|||
if (y2 >= _HEIGHT)
|
||||
y2 = _HEIGHT - 1;
|
||||
|
||||
erase_both();
|
||||
eraseBoth();
|
||||
|
||||
debugC(4, kDebugLevelSprites, "blit_cel (%d, %d, %d, c)", x, y, pri);
|
||||
blit_cel(x1, y1, pri, c);
|
||||
blitCel(x1, y1, pri, c);
|
||||
|
||||
/* If margin is 0, 1, 2, or 3, the base of the cel is
|
||||
* surrounded with a rectangle of the corresponding priority.
|
||||
|
@ -627,8 +627,8 @@ void SpritesMgr::add_to_pic(int view, int loop, int cel, int x, int y, int pri,
|
|||
// don't let box extend below y.
|
||||
if (y3 > y2) y3 = y2;
|
||||
|
||||
p1 = &_vm->game.sbuf[x1 + y3 * _WIDTH];
|
||||
p2 = &_vm->game.sbuf[x2 + y3 * _WIDTH];
|
||||
p1 = &_vm->_game.sbuf[x1 + y3 * _WIDTH];
|
||||
p2 = &_vm->_game.sbuf[x2 + y3 * _WIDTH];
|
||||
|
||||
for (y = y3; y <= y2; y++) {
|
||||
if ((*p1 >> 4) >= 4)
|
||||
|
@ -640,8 +640,8 @@ void SpritesMgr::add_to_pic(int view, int loop, int cel, int x, int y, int pri,
|
|||
}
|
||||
|
||||
debugC(4, kDebugLevelSprites, "pri box: %d %d %d %d (%d)", x1, y3, x2, y2, mar);
|
||||
p1 = &_vm->game.sbuf[x1 + y3 * _WIDTH];
|
||||
p2 = &_vm->game.sbuf[x1 + y2 * _WIDTH];
|
||||
p1 = &_vm->_game.sbuf[x1 + y3 * _WIDTH];
|
||||
p2 = &_vm->_game.sbuf[x1 + y2 * _WIDTH];
|
||||
for (x = x1; x <= x2; x++) {
|
||||
if ((*p1 >> 4) >= 4)
|
||||
*p1 = (mar << 4) | (*p1 & 0x0f);
|
||||
|
@ -652,10 +652,10 @@ void SpritesMgr::add_to_pic(int view, int loop, int cel, int x, int y, int pri,
|
|||
}
|
||||
}
|
||||
|
||||
blit_both();
|
||||
blitBoth();
|
||||
|
||||
debugC(4, kDebugLevelSprites, "commit_block (%d, %d, %d, %d)", x1, y1, x2, y2);
|
||||
commit_block(x1, y1, x2, y2);
|
||||
commitBlock(x1, y1, x2, y2);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -664,13 +664,13 @@ void SpritesMgr::add_to_pic(int view, int loop, int cel, int x, int y, int pri,
|
|||
* a message box with the object description.
|
||||
* @param n Number of the object to show
|
||||
*/
|
||||
void SpritesMgr::show_obj(int n) {
|
||||
view_cel *c;
|
||||
sprite s;
|
||||
void SpritesMgr::showObj(int n) {
|
||||
ViewCel *c;
|
||||
Sprite s;
|
||||
int x1, y1, x2, y2;
|
||||
|
||||
_vm->agiLoadResource(rVIEW, n);
|
||||
if (!(c = &_vm->game.views[n].loop[0].cel[0]))
|
||||
if (!(c = &_vm->_game.views[n].loop[0].cel[0]))
|
||||
return;
|
||||
|
||||
x1 = (_WIDTH - c->width) / 2;
|
||||
|
@ -678,27 +678,27 @@ void SpritesMgr::show_obj(int n) {
|
|||
x2 = x1 + c->width - 1;
|
||||
y2 = y1 + c->height - 1;
|
||||
|
||||
s.x_pos = x1;
|
||||
s.y_pos = y1;
|
||||
s.x_size = c->width;
|
||||
s.y_size = c->height;
|
||||
s.buffer = (uint8 *)malloc(s.x_size * s.y_size);
|
||||
s.xPos = x1;
|
||||
s.yPos = y1;
|
||||
s.xSize = c->width;
|
||||
s.ySize = c->height;
|
||||
s.buffer = (uint8 *)malloc(s.xSize * s.ySize);
|
||||
|
||||
objs_savearea(&s);
|
||||
blit_cel(x1, y1, s.x_size, c);
|
||||
commit_block(x1, y1, x2, y2);
|
||||
_vm->message_box(_vm->game.views[n].descr);
|
||||
objs_restorearea(&s);
|
||||
commit_block(x1, y1, x2, y2);
|
||||
objsSaveArea(&s);
|
||||
blitCel(x1, y1, s.xSize, c);
|
||||
commitBlock(x1, y1, x2, y2);
|
||||
_vm->messageBox(_vm->_game.views[n].descr);
|
||||
objsRestoreArea(&s);
|
||||
commitBlock(x1, y1, x2, y2);
|
||||
|
||||
free(s.buffer);
|
||||
}
|
||||
|
||||
void SpritesMgr::commit_block(int x1, int y1, int x2, int y2) {
|
||||
void SpritesMgr::commitBlock(int x1, int y1, int x2, int y2) {
|
||||
int i, w, offset;
|
||||
uint8 *q;
|
||||
|
||||
if (!_vm->game.picture_shown)
|
||||
if (!_vm->_game.pictureShown)
|
||||
return;
|
||||
|
||||
/* Clipping */
|
||||
|
@ -722,8 +722,8 @@ void SpritesMgr::commit_block(int x1, int y1, int x2, int y2) {
|
|||
debugC(7, kDebugLevelSprites, "%d, %d, %d, %d", x1, y1, x2, y2);
|
||||
|
||||
w = x2 - x1 + 1;
|
||||
q = &_vm->game.sbuf[x1 + _WIDTH * y1];
|
||||
offset = _vm->game.line_min_print * CHAR_LINES;
|
||||
q = &_vm->_game.sbuf[x1 + _WIDTH * y1];
|
||||
offset = _vm->_game.lineMinPrint * CHAR_LINES;
|
||||
for (i = y1; i <= y2; i++) {
|
||||
_gfx->putPixelsA(x1, i + offset, w, q);
|
||||
q += _WIDTH;
|
||||
|
@ -736,12 +736,12 @@ SpritesMgr::SpritesMgr(AgiEngine *agi, GfxMgr *gfx) {
|
|||
_vm = agi;
|
||||
_gfx = gfx;
|
||||
|
||||
sprite_pool = (uint8 *)malloc(POOL_SIZE);
|
||||
pool_top = sprite_pool;
|
||||
_spritePool = (uint8 *)malloc(POOL_SIZE);
|
||||
_poolTop = _spritePool;
|
||||
}
|
||||
|
||||
SpritesMgr::~SpritesMgr() {
|
||||
free(sprite_pool);
|
||||
free(_spritePool);
|
||||
}
|
||||
|
||||
} // End of namespace Agi
|
||||
} // End of namespace Agi
|
||||
|
|
|
@ -30,8 +30,8 @@
|
|||
namespace Agi {
|
||||
|
||||
|
||||
struct sprite;
|
||||
typedef Common::List<sprite*> SpriteList;
|
||||
struct Sprite;
|
||||
typedef Common::List<Sprite*> SpriteList;
|
||||
|
||||
class AgiEngine;
|
||||
class GfxMgr;
|
||||
|
@ -42,56 +42,56 @@ private:
|
|||
GfxMgr *_gfx;
|
||||
AgiEngine *_vm;
|
||||
|
||||
uint8 *sprite_pool;
|
||||
uint8 *pool_top;
|
||||
uint8 *_spritePool;
|
||||
uint8 *_poolTop;
|
||||
|
||||
/*
|
||||
* Sprite management functions
|
||||
*/
|
||||
|
||||
SpriteList spr_upd;
|
||||
SpriteList spr_nonupd;
|
||||
SpriteList _sprUpd;
|
||||
SpriteList _sprNonupd;
|
||||
|
||||
void *pool_alloc(int size);
|
||||
void pool_release(void *s);
|
||||
void blit_pixel(uint8 *p, uint8 *end, uint8 col, int spr, int width, int *hidden);
|
||||
int blit_cel(int x, int y, int spr, view_cel *c);
|
||||
void objs_savearea(sprite *s);
|
||||
void objs_restorearea(sprite *s);
|
||||
void *poolAlloc(int size);
|
||||
void poolRelease(void *s);
|
||||
void blitPixel(uint8 *p, uint8 *end, uint8 col, int spr, int width, int *hidden);
|
||||
int blitCel(int x, int y, int spr, ViewCel *c);
|
||||
void objsSaveArea(Sprite *s);
|
||||
void objsRestoreArea(Sprite *s);
|
||||
|
||||
FORCEINLINE int prio_to_y(int p);
|
||||
sprite *new_sprite(vt_entry *v);
|
||||
void spr_addlist(SpriteList& l, vt_entry *v);
|
||||
void build_list(SpriteList& l, bool (*test) (vt_entry *, AgiEngine *));
|
||||
void build_upd_blitlist();
|
||||
void build_nonupd_blitlist();
|
||||
void free_list(SpriteList& l);
|
||||
void commit_sprites(SpriteList& l);
|
||||
void erase_sprites(SpriteList& l);
|
||||
void blit_sprites(SpriteList& l);
|
||||
static bool test_updating(vt_entry *v, AgiEngine *);
|
||||
static bool test_not_updating(vt_entry *v, AgiEngine *);
|
||||
FORCEINLINE int prioToY(int p);
|
||||
Sprite *newSprite(VtEntry *v);
|
||||
void sprAddlist(SpriteList &l, VtEntry *v);
|
||||
void buildList(SpriteList &l, bool (*test)(VtEntry *, AgiEngine *));
|
||||
void buildUpdBlitlist();
|
||||
void buildNonupdBlitlist();
|
||||
void freeList(SpriteList &l);
|
||||
void commitSprites(SpriteList &l);
|
||||
void eraseSprites(SpriteList &l);
|
||||
void blitSprites(SpriteList &l);
|
||||
static bool testUpdating(VtEntry *v, AgiEngine *);
|
||||
static bool testNotUpdating(VtEntry *v, AgiEngine *);
|
||||
|
||||
public:
|
||||
SpritesMgr(AgiEngine *agi, GfxMgr *gfx);
|
||||
~SpritesMgr();
|
||||
|
||||
int init_sprites(void);
|
||||
void deinit_sprites(void);
|
||||
void erase_upd_sprites(void);
|
||||
void erase_nonupd_sprites(void);
|
||||
void erase_both(void);
|
||||
void blit_upd_sprites(void);
|
||||
void blit_nonupd_sprites(void);
|
||||
void blit_both(void);
|
||||
void commit_upd_sprites(void);
|
||||
void commit_nonupd_sprites(void);
|
||||
void commit_both(void);
|
||||
void add_to_pic(int, int, int, int, int, int, int);
|
||||
void show_obj(int);
|
||||
void commit_block(int, int, int, int);
|
||||
int initSprites();
|
||||
void deinitSprites();
|
||||
void eraseUpdSprites();
|
||||
void eraseNonupdSprites();
|
||||
void eraseBoth();
|
||||
void blitUpdSprites();
|
||||
void blitNonupdSprites();
|
||||
void blitBoth();
|
||||
void commitUpdSprites();
|
||||
void commitNonupdSprites();
|
||||
void commitBoth();
|
||||
void addToPic(int, int, int, int, int, int, int);
|
||||
void showObj(int);
|
||||
void commitBlock(int, int, int, int);
|
||||
};
|
||||
|
||||
} // End of namespace Agi
|
||||
} // End of namespace Agi
|
||||
|
||||
#endif /* AGI_SPRITE_H */
|
||||
#endif /* AGI_SPRITE_H */
|
||||
|
|
|
@ -30,7 +30,7 @@
|
|||
|
||||
namespace Agi {
|
||||
|
||||
void AgiEngine::print_text2(int l, const char *msg, int foff, int xoff, int yoff,
|
||||
void AgiEngine::printText2(int l, const char *msg, int foff, int xoff, int yoff,
|
||||
int len, int fg, int bg, bool checkerboard) {
|
||||
int x1, y1;
|
||||
int maxx, minx, ofoff;
|
||||
|
@ -113,14 +113,14 @@ void AgiEngine::print_text2(int l, const char *msg, int foff, int xoff, int yoff
|
|||
|
||||
/* len is in characters, not pixels!!
|
||||
*/
|
||||
void AgiEngine::blit_textbox(const char *p, int y, int x, int len) {
|
||||
void AgiEngine::blitTextbox(const char *p, int y, int x, int len) {
|
||||
/* if x | y = -1, then centre the box */
|
||||
int xoff, yoff, lin, h, w;
|
||||
char *msg, *m;
|
||||
|
||||
debugC(3, kDebugLevelText, "x=%d, y=%d, len=%d", x, y, len);
|
||||
if (game.window.active)
|
||||
close_window();
|
||||
if (_game.window.active)
|
||||
closeWindow();
|
||||
|
||||
if (x == 0 && y == 0 && len == 0)
|
||||
x = y = -1;
|
||||
|
@ -132,7 +132,7 @@ void AgiEngine::blit_textbox(const char *p, int y, int x, int len) {
|
|||
yoff = y * CHAR_LINES;
|
||||
len--;
|
||||
|
||||
m = msg = word_wrap_string(agi_sprintf(p), &len);
|
||||
m = msg = wordWrapString(agiSprintf(p), &len);
|
||||
|
||||
for (lin = 1; *m; m++) {
|
||||
/* Test \r for MacOS 8 */
|
||||
|
@ -154,9 +154,9 @@ void AgiEngine::blit_textbox(const char *p, int y, int x, int len) {
|
|||
if (yoff < 0)
|
||||
yoff = (GFX_HEIGHT - 3 * CHAR_LINES - h) / 2;
|
||||
|
||||
draw_window(xoff, yoff, xoff + w - 1, yoff + h - 1);
|
||||
drawWindow(xoff, yoff, xoff + w - 1, yoff + h - 1);
|
||||
|
||||
print_text2(2, msg, 0, CHAR_COLS + xoff, CHAR_LINES + yoff,
|
||||
printText2(2, msg, 0, CHAR_COLS + xoff, CHAR_LINES + yoff,
|
||||
len + 1, MSG_BOX_TEXT, MSG_BOX_COLOUR);
|
||||
|
||||
free(msg);
|
||||
|
@ -164,20 +164,20 @@ void AgiEngine::blit_textbox(const char *p, int y, int x, int len) {
|
|||
_gfx->doUpdate();
|
||||
}
|
||||
|
||||
void AgiEngine::erase_textbox() {
|
||||
if (!game.window.active) {
|
||||
void AgiEngine::eraseTextbox() {
|
||||
if (!_game.window.active) {
|
||||
debugC(3, kDebugLevelText, "no window active");
|
||||
return;
|
||||
}
|
||||
|
||||
debugC(4, kDebugLevelText, "x1=%d, y1=%d, x2=%d, y2=%d", game.window.x1,
|
||||
game.window.y1, game.window.x2, game.window.y2);
|
||||
debugC(4, kDebugLevelText, "x1=%d, y1=%d, x2=%d, y2=%d", _game.window.x1,
|
||||
_game.window.y1, _game.window.x2, _game.window.y2);
|
||||
|
||||
_gfx->restoreBlock(game.window.x1, game.window.y1,
|
||||
game.window.x2, game.window.y2, game.window.buffer);
|
||||
_gfx->restoreBlock(_game.window.x1, _game.window.y1,
|
||||
_game.window.x2, _game.window.y2, _game.window.buffer);
|
||||
|
||||
free(game.window.buffer);
|
||||
game.window.active = false;
|
||||
free(_game.window.buffer);
|
||||
_game.window.active = false;
|
||||
|
||||
_gfx->doUpdate();
|
||||
}
|
||||
|
@ -189,23 +189,23 @@ void AgiEngine::erase_textbox() {
|
|||
/**
|
||||
* Print text in the AGI engine screen.
|
||||
*/
|
||||
void AgiEngine::print_text(const char *msg, int f, int x, int y, int len, int fg, int bg, bool checkerboard) {
|
||||
void AgiEngine::printText(const char *msg, int f, int x, int y, int len, int fg, int bg, bool checkerboard) {
|
||||
f *= CHAR_COLS;
|
||||
x *= CHAR_COLS;
|
||||
y *= CHAR_LINES;
|
||||
|
||||
debugC(4, kDebugLevelText, "%s, %d, %d, %d, %d, %d, %d", msg, f, x, y, len, fg, bg);
|
||||
print_text2(0, agi_sprintf(msg), f, x, y, len, fg, bg, checkerboard);
|
||||
printText2(0, agiSprintf(msg), f, x, y, len, fg, bg, checkerboard);
|
||||
}
|
||||
|
||||
/**
|
||||
* Print text in the AGI engine console.
|
||||
*/
|
||||
void AgiEngine::print_text_console(const char *msg, int x, int y, int len, int fg, int bg) {
|
||||
void AgiEngine::printTextConsole(const char *msg, int x, int y, int len, int fg, int bg) {
|
||||
x *= CHAR_COLS;
|
||||
y *= 10;
|
||||
|
||||
print_text2(1, msg, 0, x, y, len, fg, bg);
|
||||
printText2(1, msg, 0, x, y, len, fg, bg);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -213,7 +213,7 @@ void AgiEngine::print_text_console(const char *msg, int x, int y, int len, int f
|
|||
* @param str String to wrap.
|
||||
* @param len Length of line.
|
||||
*/
|
||||
char *AgiEngine::word_wrap_string(char *str, int *len) {
|
||||
char *AgiEngine::wordWrapString(char *str, int *len) {
|
||||
/* If the message has a long word (longer than 31 character) then
|
||||
* loop in line 239 (for (; *v != ' '; v--, c--);) can wrap
|
||||
* around 0 and write large number in c. This causes returned
|
||||
|
@ -275,13 +275,13 @@ char *AgiEngine::word_wrap_string(char *str, int *len) {
|
|||
/**
|
||||
* Remove existing window, if any.
|
||||
*/
|
||||
void AgiEngine::close_window() {
|
||||
void AgiEngine::closeWindow() {
|
||||
debugC(4, kDebugLevelText, "close window");
|
||||
_sprites->erase_both();
|
||||
erase_textbox(); /* remove window, if any */
|
||||
_sprites->blit_both();
|
||||
_sprites->commit_both(); /* redraw sprites */
|
||||
game.has_window = false;
|
||||
_sprites->eraseBoth();
|
||||
eraseTextbox(); /* remove window, if any */
|
||||
_sprites->blitBoth();
|
||||
_sprites->commitBoth(); /* redraw sprites */
|
||||
_game.hasWindow = false;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -290,15 +290,15 @@ void AgiEngine::close_window() {
|
|||
* centered in the screen and waits until a key is pressed.
|
||||
* @param p The text to be displayed
|
||||
*/
|
||||
int AgiEngine::message_box(const char *s) {
|
||||
int AgiEngine::messageBox(const char *s) {
|
||||
int k;
|
||||
|
||||
_sprites->erase_both();
|
||||
blit_textbox(s, -1, -1, -1);
|
||||
_sprites->blit_both();
|
||||
k = wait_key();
|
||||
_sprites->eraseBoth();
|
||||
blitTextbox(s, -1, -1, -1);
|
||||
_sprites->blitBoth();
|
||||
k = waitKey();
|
||||
debugC(4, kDebugLevelText, "wait_key returned %02x", k);
|
||||
close_window();
|
||||
closeWindow();
|
||||
|
||||
return k;
|
||||
}
|
||||
|
@ -310,18 +310,18 @@ int AgiEngine::message_box(const char *s) {
|
|||
* @param p The text to be displayed
|
||||
* @param b NULL-terminated list of button labels
|
||||
*/
|
||||
int AgiEngine::selection_box(const char *m, const char **b) {
|
||||
int AgiEngine::selectionBox(const char *m, const char **b) {
|
||||
int x, y, i, s;
|
||||
int key, active = 0;
|
||||
int rc = -1;
|
||||
int bx[5], by[5];
|
||||
|
||||
_sprites->erase_both();
|
||||
blit_textbox(m, -1, -1, -1);
|
||||
_sprites->eraseBoth();
|
||||
blitTextbox(m, -1, -1, -1);
|
||||
|
||||
x = game.window.x1 + 5 * CHAR_COLS / 2;
|
||||
y = game.window.y2 - 5 * CHAR_LINES / 2;
|
||||
s = game.window.x2 - game.window.x1 + 1 - 5 * CHAR_COLS;
|
||||
x = _game.window.x1 + 5 * CHAR_COLS / 2;
|
||||
y = _game.window.y2 - 5 * CHAR_LINES / 2;
|
||||
s = _game.window.x2 - _game.window.x1 + 1 - 5 * CHAR_COLS;
|
||||
debugC(3, kDebugLevelText, "s = %d", s);
|
||||
|
||||
/* Automatically position buttons */
|
||||
|
@ -342,7 +342,7 @@ int AgiEngine::selection_box(const char *m, const char **b) {
|
|||
x += CHAR_COLS * strlen(b[i]) + s;
|
||||
}
|
||||
|
||||
_sprites->blit_both();
|
||||
_sprites->blitBoth();
|
||||
|
||||
/* clear key queue */
|
||||
while (_gfx->keypress()) {
|
||||
|
@ -355,7 +355,7 @@ int AgiEngine::selection_box(const char *m, const char **b) {
|
|||
_gfx->drawButton(bx[i], by[i], b[i], i == active, 0, MSG_BOX_TEXT, MSG_BOX_COLOUR);
|
||||
|
||||
_gfx->pollTimer(); /* msdos driver -> does nothing */
|
||||
key = do_poll_keyboard();
|
||||
key = doPollKeyboard();
|
||||
switch (key) {
|
||||
case KEY_ENTER:
|
||||
rc = active;
|
||||
|
@ -384,7 +384,7 @@ press:
|
|||
debugC(4, kDebugLevelText, "Button pressed: %d", rc);
|
||||
|
||||
getout:
|
||||
close_window();
|
||||
closeWindow();
|
||||
debugC(2, kDebugLevelText, "Result = %d", rc);
|
||||
|
||||
return rc;
|
||||
|
@ -405,43 +405,43 @@ int AgiEngine::print(const char *p, int lin, int col, int len) {
|
|||
if (len == 0)
|
||||
len = 30;
|
||||
|
||||
blit_textbox(p, lin, col, len);
|
||||
blitTextbox(p, lin, col, len);
|
||||
|
||||
if (getflag(F_output_mode)) {
|
||||
if (getflag(fOutputMode)) {
|
||||
/* non-blocking window */
|
||||
setflag(F_output_mode, false);
|
||||
setflag(fOutputMode, false);
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* blocking */
|
||||
|
||||
if (game.vars[V_window_reset] == 0) {
|
||||
if (_game.vars[vWindowReset] == 0) {
|
||||
int k;
|
||||
setvar(V_key, 0);
|
||||
k = wait_key();
|
||||
close_window();
|
||||
setvar(vKey, 0);
|
||||
k = waitKey();
|
||||
closeWindow();
|
||||
return k;
|
||||
}
|
||||
|
||||
/* timed window */
|
||||
|
||||
debugC(3, kDebugLevelText, "f15==0, v21==%d => timed", getvar(21));
|
||||
game.msg_box_ticks = getvar(V_window_reset) * 10;
|
||||
setvar(V_key, 0);
|
||||
_game.msgBoxTicks = getvar(vWindowReset) * 10;
|
||||
setvar(vKey, 0);
|
||||
|
||||
do {
|
||||
main_cycle();
|
||||
if (game.keypress == KEY_ENTER) {
|
||||
mainCycle();
|
||||
if (_game.keypress == KEY_ENTER) {
|
||||
debugC(4, kDebugLevelText, "KEY_ENTER");
|
||||
setvar(V_window_reset, 0);
|
||||
game.keypress = 0;
|
||||
setvar(vWindowReset, 0);
|
||||
_game.keypress = 0;
|
||||
break;
|
||||
}
|
||||
} while (game.msg_box_ticks > 0);
|
||||
} while (_game.msgBoxTicks > 0);
|
||||
|
||||
setvar(V_window_reset, 0);
|
||||
setvar(vWindowReset, 0);
|
||||
|
||||
close_window();
|
||||
closeWindow();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -449,7 +449,7 @@ int AgiEngine::print(const char *p, int lin, int col, int len) {
|
|||
/**
|
||||
*
|
||||
*/
|
||||
void AgiEngine::print_status(const char *message, ...) {
|
||||
void AgiEngine::printStatus(const char *message, ...) {
|
||||
char x[42];
|
||||
va_list args;
|
||||
|
||||
|
@ -460,10 +460,10 @@ void AgiEngine::print_status(const char *message, ...) {
|
|||
va_end(args);
|
||||
|
||||
debugC(4, kDebugLevelText, "fg=%d, bg=%d", STATUS_FG, STATUS_BG);
|
||||
print_text(x, 0, 0, game.line_status, 40, STATUS_FG, STATUS_BG);
|
||||
printText(x, 0, 0, _game.lineStatus, 40, STATUS_FG, STATUS_BG);
|
||||
}
|
||||
|
||||
char *AgiEngine::safe_strcat(char *s, const char *t) {
|
||||
char *AgiEngine::safeStrcat(char *s, const char *t) {
|
||||
if (t != NULL)
|
||||
strcat(s, t);
|
||||
|
||||
|
@ -478,12 +478,12 @@ char *AgiEngine::safe_strcat(char *s, const char *t) {
|
|||
* @param n logic number
|
||||
*/
|
||||
#define MAX_LEN 768
|
||||
char *AgiEngine::agi_sprintf(const char *s) {
|
||||
char *AgiEngine::agiSprintf(const char *s) {
|
||||
static char y[MAX_LEN];
|
||||
char x[MAX_LEN];
|
||||
char z[16], *p;
|
||||
|
||||
debugC(3, kDebugLevelText, "logic %d, '%s'", game.lognum, s);
|
||||
debugC(3, kDebugLevelText, "logic %d, '%s'", _game.lognum, s);
|
||||
p = x;
|
||||
|
||||
for (*p = 0; *s;) {
|
||||
|
@ -517,28 +517,28 @@ char *AgiEngine::agi_sprintf(const char *s) {
|
|||
} else {
|
||||
i = 15 - i;
|
||||
}
|
||||
safe_strcat(p, z + i);
|
||||
safeStrcat(p, z + i);
|
||||
break;
|
||||
case '0':
|
||||
i = strtoul(s, NULL, 10) - 1;
|
||||
safe_strcat(p, object_name(i));
|
||||
safeStrcat(p, objectName(i));
|
||||
break;
|
||||
case 'g':
|
||||
i = strtoul(s, NULL, 10) - 1;
|
||||
safe_strcat(p, game.logics[0].texts[i]);
|
||||
safeStrcat(p, _game.logics[0].texts[i]);
|
||||
break;
|
||||
case 'w':
|
||||
i = strtoul(s, NULL, 10) - 1;
|
||||
safe_strcat(p, game.ego_words[i].word);
|
||||
safeStrcat(p, _game.egoWords[i].word);
|
||||
break;
|
||||
case 's':
|
||||
i = strtoul(s, NULL, 10);
|
||||
safe_strcat(p, game.strings[i]);
|
||||
safeStrcat(p, _game.strings[i]);
|
||||
break;
|
||||
case 'm':
|
||||
i = strtoul(s, NULL, 10) - 1;
|
||||
if (game.logics[game.lognum].num_texts > i)
|
||||
safe_strcat(p, agi_sprintf(game. logics[game.lognum].texts[i]));
|
||||
if (_game.logics[_game.lognum].numTexts > i)
|
||||
safeStrcat(p, agiSprintf(_game. logics[_game.lognum].texts[i]));
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -564,51 +564,51 @@ literal:
|
|||
/**
|
||||
* Write the status line.
|
||||
*/
|
||||
void AgiEngine::write_status() {
|
||||
void AgiEngine::writeStatus() {
|
||||
char x[64];
|
||||
|
||||
if (_debug.statusline) {
|
||||
print_status("%3d(%03d) %3d,%3d(%3d,%3d) ",
|
||||
getvar(0), getvar(1), game.view_table[0].x_pos,
|
||||
game.view_table[0].y_pos, WIN_TO_PIC_X(g_mouse.x),
|
||||
printStatus("%3d(%03d) %3d,%3d(%3d,%3d) ",
|
||||
getvar(0), getvar(1), _game.viewTable[0].xPos,
|
||||
_game.viewTable[0].yPos, WIN_TO_PIC_X(g_mouse.x),
|
||||
WIN_TO_PIC_Y(g_mouse.y));
|
||||
return;
|
||||
}
|
||||
|
||||
if (!game.status_line) {
|
||||
int l = game.line_status;
|
||||
clear_lines(l, l, 0);
|
||||
flush_lines(l, l);
|
||||
if (!_game.statusLine) {
|
||||
int l = _game.lineStatus;
|
||||
clearLines(l, l, 0);
|
||||
flushLines(l, l);
|
||||
return;
|
||||
}
|
||||
|
||||
sprintf(x, " Score:%i of %-3i", game.vars[V_score], game.vars[V_max_score]);
|
||||
print_status("%-17s Sound:%s ", x, getflag(F_sound_on) ? "on " : "off");
|
||||
sprintf(x, " Score:%i of %-3i", _game.vars[vScore], _game.vars[vMaxScore]);
|
||||
printStatus("%-17s Sound:%s ", x, getflag(fSoundOn) ? "on " : "off");
|
||||
}
|
||||
|
||||
/**
|
||||
* Print user input prompt.
|
||||
*/
|
||||
void AgiEngine::write_prompt() {
|
||||
void AgiEngine::writePrompt() {
|
||||
int l, fg, bg, pos;
|
||||
|
||||
if (!game.input_enabled || game.input_mode != INPUT_NORMAL)
|
||||
if (!_game.inputEnabled || _game.inputMode != INPUT_NORMAL)
|
||||
return;
|
||||
|
||||
l = game.line_user_input;
|
||||
fg = game.color_fg;
|
||||
bg = game.color_bg;
|
||||
pos = game.cursor_pos;
|
||||
l = _game.lineUserInput;
|
||||
fg = _game.colorFg;
|
||||
bg = _game.colorBg;
|
||||
pos = _game.cursorPos;
|
||||
|
||||
debugC(4, kDebugLevelText, "erase line %d", l);
|
||||
clear_lines(l, l, game.color_bg);
|
||||
clearLines(l, l, _game.colorBg);
|
||||
|
||||
debugC(4, kDebugLevelText, "prompt = '%s'", agi_sprintf(game.strings[0]));
|
||||
print_text(game.strings[0], 0, 0, l, 1, fg, bg);
|
||||
print_text((char *)game.input_buffer, 0, 1, l, pos + 1, fg, bg);
|
||||
_gfx->printCharacter(pos + 1, l, game.cursor_char, fg, bg);
|
||||
debugC(4, kDebugLevelText, "prompt = '%s'", agiSprintf(_game.strings[0]));
|
||||
printText(_game.strings[0], 0, 0, l, 1, fg, bg);
|
||||
printText((char *)_game.inputBuffer, 0, 1, l, pos + 1, fg, bg);
|
||||
_gfx->printCharacter(pos + 1, l, _game.cursorChar, fg, bg);
|
||||
|
||||
flush_lines(l, l);
|
||||
flushLines(l, l);
|
||||
_gfx->doUpdate();
|
||||
}
|
||||
|
||||
|
@ -618,7 +618,7 @@ void AgiEngine::write_prompt() {
|
|||
* @param l2 end line
|
||||
* @param c color
|
||||
*/
|
||||
void AgiEngine::clear_lines(int l1, int l2, int c) {
|
||||
void AgiEngine::clearLines(int l1, int l2, int c) {
|
||||
/* do we need to adjust for +8 on topline?
|
||||
* inc for endline so it matches the correct num
|
||||
* ie, from 22 to 24 is 3 lines, not 2 lines.
|
||||
|
@ -634,7 +634,7 @@ void AgiEngine::clear_lines(int l1, int l2, int c) {
|
|||
/**
|
||||
*
|
||||
*/
|
||||
void AgiEngine::flush_lines(int l1, int l2) {
|
||||
void AgiEngine::flushLines(int l1, int l2) {
|
||||
l1 *= CHAR_LINES;
|
||||
l2 *= CHAR_LINES;
|
||||
l2 += CHAR_LINES - 1;
|
||||
|
@ -645,17 +645,17 @@ void AgiEngine::flush_lines(int l1, int l2) {
|
|||
/**
|
||||
*
|
||||
*/
|
||||
void AgiEngine::draw_window(int x1, int y1, int x2, int y2) {
|
||||
game.window.active = true;
|
||||
game.window.x1 = x1;
|
||||
game.window.y1 = y1;
|
||||
game.window.x2 = x2;
|
||||
game.window.y2 = y2;
|
||||
game.window.buffer = (uint8 *)malloc((x2 - x1 + 1) * (y2 - y1 + 1));
|
||||
void AgiEngine::drawWindow(int x1, int y1, int x2, int y2) {
|
||||
_game.window.active = true;
|
||||
_game.window.x1 = x1;
|
||||
_game.window.y1 = y1;
|
||||
_game.window.x2 = x2;
|
||||
_game.window.y2 = y2;
|
||||
_game.window.buffer = (uint8 *)malloc((x2 - x1 + 1) * (y2 - y1 + 1));
|
||||
|
||||
debugC(4, kDebugLevelText, "x1=%d, y1=%d, x2=%d, y2=%d", x1, y1, x2, y2);
|
||||
_gfx->saveBlock(x1, y1, x2, y2, game.window.buffer);
|
||||
_gfx->saveBlock(x1, y1, x2, y2, _game.window.buffer);
|
||||
_gfx->drawBox(x1, y1, x2, y2, MSG_BOX_COLOUR, MSG_BOX_LINE, 2);
|
||||
}
|
||||
|
||||
} // End of namespace Agi
|
||||
} // End of namespace Agi
|
||||
|
|
|
@ -1,24 +0,0 @@
|
|||
/* ScummVM - Scumm Interpreter
|
||||
* Copyright (C) 2006 The ScummVM project
|
||||
*
|
||||
* Copyright (C) 1999-2001 Sarien Team
|
||||
*
|
||||
* 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
*
|
||||
* $URL$
|
||||
* $Id$
|
||||
*
|
||||
*/
|
||||
|
|
@ -27,73 +27,73 @@
|
|||
|
||||
namespace Agi {
|
||||
|
||||
void AgiEngine::_set_cel(vt_entry *v, int n) {
|
||||
view_loop *current_vl;
|
||||
view_cel *current_vc;
|
||||
void AgiEngine::lSetCel(VtEntry *v, int n) {
|
||||
ViewLoop *currentVl;
|
||||
ViewCel *currentVc;
|
||||
|
||||
v->current_cel = n;
|
||||
v->currentCel = n;
|
||||
|
||||
current_vl = &game.views[v->current_view].loop[v->current_loop];
|
||||
currentVl = &_game.views[v->currentView].loop[v->currentLoop];
|
||||
|
||||
/* Added by Amit Vainsencher <amitv@subdimension.com> to prevent
|
||||
* crash in KQ1 -- not in the Sierra interpreter
|
||||
*/
|
||||
if (current_vl->num_cels == 0)
|
||||
if (currentVl->numCels == 0)
|
||||
return;
|
||||
|
||||
if (!(v->flags & UPDATE)
|
||||
&& (agiGetRelease() >= 0x3000))
|
||||
return;
|
||||
|
||||
current_vc = ¤t_vl->cel[n];
|
||||
v->cel_data = current_vc;
|
||||
v->x_size = current_vc->width;
|
||||
v->y_size = current_vc->height;
|
||||
currentVc = ¤tVl->cel[n];
|
||||
v->celData = currentVc;
|
||||
v->xSize = currentVc->width;
|
||||
v->ySize = currentVc->height;
|
||||
}
|
||||
|
||||
void AgiEngine::_set_loop(vt_entry *v, int n) {
|
||||
view_loop *current_vl;
|
||||
void AgiEngine::lSetLoop(VtEntry *v, int n) {
|
||||
ViewLoop *currentVl;
|
||||
debugC(7, kDebugLevelResources, "vt entry #%d, loop = %d", v->entry, n);
|
||||
|
||||
/* Added to avoid crash when leaving the arcade machine in MH1
|
||||
* -- not in AGI 2.917
|
||||
*/
|
||||
if (n >= v->num_loops)
|
||||
if (n >= v->numLoops)
|
||||
n = 0;
|
||||
|
||||
v->current_loop = n;
|
||||
current_vl = &game.views[v->current_view].loop[v->current_loop];
|
||||
v->currentLoop = n;
|
||||
currentVl = &_game.views[v->currentView].loop[v->currentLoop];
|
||||
|
||||
v->num_cels = current_vl->num_cels;
|
||||
if (v->current_cel >= v->num_cels)
|
||||
v->current_cel = 0;
|
||||
v->numCels = currentVl->numCels;
|
||||
if (v->currentCel >= v->numCels)
|
||||
v->currentCel = 0;
|
||||
|
||||
if (!(v->flags & UPDATE) && (agiGetRelease() >= 0x3000))
|
||||
return;
|
||||
|
||||
v->loop_data = &game.views[v->current_view].loop[n];
|
||||
v->loopData = &_game.views[v->currentView].loop[n];
|
||||
}
|
||||
|
||||
void AgiEngine::update_view(vt_entry *v) {
|
||||
int cel, last_cel;
|
||||
void AgiEngine::updateView(VtEntry *v) {
|
||||
int cel, lastCel;
|
||||
|
||||
if (v->flags & DONTUPDATE) {
|
||||
v->flags &= ~DONTUPDATE;
|
||||
return;
|
||||
}
|
||||
|
||||
cel = v->current_cel;
|
||||
last_cel = v->num_cels - 1;
|
||||
cel = v->currentCel;
|
||||
lastCel = v->numCels - 1;
|
||||
|
||||
switch (v->cycle) {
|
||||
case CYCLE_NORMAL:
|
||||
if (++cel > last_cel)
|
||||
if (++cel > lastCel)
|
||||
cel = 0;
|
||||
break;
|
||||
case CYCLE_END_OF_LOOP:
|
||||
if (cel < last_cel) {
|
||||
debugC(5, kDebugLevelResources, "cel %d (last = %d)", cel + 1, last_cel);
|
||||
if (++cel != last_cel)
|
||||
if (cel < lastCel) {
|
||||
debugC(5, kDebugLevelResources, "cel %d (last = %d)", cel + 1, lastCel);
|
||||
if (++cel != lastCel)
|
||||
break;
|
||||
}
|
||||
setflag(v->parm1, true);
|
||||
|
@ -113,14 +113,14 @@ void AgiEngine::update_view(vt_entry *v) {
|
|||
break;
|
||||
case CYCLE_REVERSE:
|
||||
if (cel == 0) {
|
||||
cel = last_cel;
|
||||
cel = lastCel;
|
||||
} else {
|
||||
cel--;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
set_cel(v, cel);
|
||||
setCel(v, cel);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -133,56 +133,56 @@ void AgiEngine::update_view(vt_entry *v) {
|
|||
* and fills the corresponding views array element.
|
||||
* @param n number of view resource to decode
|
||||
*/
|
||||
int AgiEngine::decode_view(int n) {
|
||||
int AgiEngine::decodeView(int n) {
|
||||
int loop, cel;
|
||||
uint8 *v, *lptr;
|
||||
uint16 lofs, cofs;
|
||||
view_loop *vl;
|
||||
view_cel *vc;
|
||||
ViewLoop *vl;
|
||||
ViewCel *vc;
|
||||
|
||||
debugC(5, kDebugLevelResources, "decode_view(%d)", n);
|
||||
v = game.views[n].rdata;
|
||||
v = _game.views[n].rdata;
|
||||
|
||||
assert(v != NULL);
|
||||
|
||||
game.views[n].descr = READ_LE_UINT16(v + 3) ? (char *)(v + READ_LE_UINT16(v + 3)) : (char *)(v + 3);
|
||||
_game.views[n].descr = READ_LE_UINT16(v + 3) ? (char *)(v + READ_LE_UINT16(v + 3)) : (char *)(v + 3);
|
||||
|
||||
/* if no loops exist, return! */
|
||||
if ((game.views[n].num_loops = *(v + 2)) == 0)
|
||||
return err_NoLoopsInView;
|
||||
if ((_game.views[n].numLoops = *(v + 2)) == 0)
|
||||
return errNoLoopsInView;
|
||||
|
||||
/* allocate memory for all views */
|
||||
game.views[n].loop = (view_loop *)
|
||||
calloc(game.views[n].num_loops, sizeof(view_loop));
|
||||
_game.views[n].loop = (ViewLoop *)
|
||||
calloc(_game.views[n].numLoops, sizeof(ViewLoop));
|
||||
|
||||
if (game.views[n].loop == NULL)
|
||||
return err_NotEnoughMemory;
|
||||
if (_game.views[n].loop == NULL)
|
||||
return errNotEnoughMemory;
|
||||
|
||||
/* decode all of the loops in this view */
|
||||
lptr = v + 5; /* first loop address */
|
||||
|
||||
for (loop = 0; loop < game.views[n].num_loops; loop++, lptr += 2) {
|
||||
for (loop = 0; loop < _game.views[n].numLoops; loop++, lptr += 2) {
|
||||
lofs = READ_LE_UINT16(lptr); /* loop header offset */
|
||||
vl = &game.views[n].loop[loop]; /* the loop struct */
|
||||
vl = &_game.views[n].loop[loop]; /* the loop struct */
|
||||
|
||||
vl->num_cels = *(v + lofs);
|
||||
debugC(6, kDebugLevelResources, "view %d, num_cels = %d", n, vl->num_cels);
|
||||
vl->cel = (view_cel *) calloc(vl->num_cels, sizeof(view_cel));
|
||||
vl->numCels = *(v + lofs);
|
||||
debugC(6, kDebugLevelResources, "view %d, num_cels = %d", n, vl->numCels);
|
||||
vl->cel = (ViewCel *)calloc(vl->numCels, sizeof(ViewCel));
|
||||
if (vl->cel == NULL) {
|
||||
free(game.views[n].loop);
|
||||
game.views[n].num_loops = 0;
|
||||
return err_NotEnoughMemory;
|
||||
free(_game.views[n].loop);
|
||||
_game.views[n].numLoops = 0;
|
||||
return errNotEnoughMemory;
|
||||
}
|
||||
|
||||
/* decode the cells */
|
||||
for (cel = 0; cel < vl->num_cels; cel++) {
|
||||
for (cel = 0; cel < vl->numCels; cel++) {
|
||||
cofs = lofs + READ_LE_UINT16(v + lofs + 1 + (cel * 2));
|
||||
vc = &vl->cel[cel];
|
||||
|
||||
vc->width = *(v + cofs);
|
||||
vc->height = *(v + cofs + 1);
|
||||
vc->transparency = *(v + cofs + 2) & 0xf;
|
||||
vc->mirror_loop = (*(v + cofs + 2) >> 4) & 0x7;
|
||||
vc->mirrorLoop = (*(v + cofs + 2) >> 4) & 0x7;
|
||||
vc->mirror = (*(v + cofs + 2) >> 7) & 0x1;
|
||||
|
||||
/* skip over width/height/trans|mirror data */
|
||||
|
@ -192,38 +192,38 @@ int AgiEngine::decode_view(int n) {
|
|||
/* If mirror_loop is pointing to the current loop,
|
||||
* then this is the original.
|
||||
*/
|
||||
if (vc->mirror_loop == loop)
|
||||
if (vc->mirrorLoop == loop)
|
||||
vc->mirror = 0;
|
||||
} /* cel */
|
||||
} /* loop */
|
||||
|
||||
return err_OK;
|
||||
return errOK;
|
||||
}
|
||||
|
||||
/**
|
||||
* Unloads all data in a view resource
|
||||
* @param n number of view resource
|
||||
*/
|
||||
void AgiEngine::unload_view(int n) {
|
||||
void AgiEngine::unloadView(int n) {
|
||||
int x;
|
||||
|
||||
debugC(5, kDebugLevelResources, "discard view %d", n);
|
||||
if (~game.dir_view[n].flags & RES_LOADED)
|
||||
if (~_game.dirView[n].flags & RES_LOADED)
|
||||
return;
|
||||
|
||||
/* Rebuild sprite list, see bug #779302 */
|
||||
_sprites->erase_both();
|
||||
_sprites->blit_both();
|
||||
_sprites->commit_both();
|
||||
_sprites->eraseBoth();
|
||||
_sprites->blitBoth();
|
||||
_sprites->commitBoth();
|
||||
|
||||
/* free all the loops */
|
||||
for (x = 0; x < game.views[n].num_loops; x++)
|
||||
free(game.views[n].loop[x].cel);
|
||||
for (x = 0; x < _game.views[n].numLoops; x++)
|
||||
free(_game.views[n].loop[x].cel);
|
||||
|
||||
free(game.views[n].loop);
|
||||
free(game.views[n].rdata);
|
||||
free(_game.views[n].loop);
|
||||
free(_game.views[n].rdata);
|
||||
|
||||
game.dir_view[n].flags &= ~RES_LOADED;
|
||||
_game.dirView[n].flags &= ~RES_LOADED;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -231,24 +231,24 @@ void AgiEngine::unload_view(int n) {
|
|||
* @param v pointer to view table entry
|
||||
* @param n number of cel
|
||||
*/
|
||||
void AgiEngine::set_cel(vt_entry *v, int n) {
|
||||
assert(v->view_data != NULL);
|
||||
assert(v->num_cels >= n);
|
||||
void AgiEngine::setCel(VtEntry *v, int n) {
|
||||
assert(v->viewData != NULL);
|
||||
assert(v->numCels >= n);
|
||||
|
||||
_set_cel(v, n);
|
||||
lSetCel(v, n);
|
||||
|
||||
/* If position isn't appropriate, update it accordingly */
|
||||
if (v->x_pos + v->x_size > _WIDTH) {
|
||||
if (v->xPos + v->xSize > _WIDTH) {
|
||||
v->flags |= UPDATE_POS;
|
||||
v->x_pos = _WIDTH - v->x_size;
|
||||
v->xPos = _WIDTH - v->xSize;
|
||||
}
|
||||
if (v->y_pos - v->y_size + 1 < 0) {
|
||||
if (v->yPos - v->ySize + 1 < 0) {
|
||||
v->flags |= UPDATE_POS;
|
||||
v->y_pos = v->y_size - 1;
|
||||
v->yPos = v->ySize - 1;
|
||||
}
|
||||
if (v->y_pos <= game.horizon && (~v->flags & IGNORE_HORIZON)) {
|
||||
if (v->yPos <= _game.horizon && (~v->flags & IGNORE_HORIZON)) {
|
||||
v->flags |= UPDATE_POS;
|
||||
v->y_pos = game.horizon + 1;
|
||||
v->yPos = _game.horizon + 1;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -257,11 +257,11 @@ void AgiEngine::set_cel(vt_entry *v, int n) {
|
|||
* @param v pointer to view table entry
|
||||
* @param n number of loop
|
||||
*/
|
||||
void AgiEngine::set_loop(vt_entry *v, int n) {
|
||||
assert(v->view_data != NULL);
|
||||
assert(v->num_loops >= n);
|
||||
_set_loop(v, n);
|
||||
set_cel(v, v->current_cel);
|
||||
void AgiEngine::setLoop(VtEntry *v, int n) {
|
||||
assert(v->viewData != NULL);
|
||||
assert(v->numLoops >= n);
|
||||
lSetLoop(v, n);
|
||||
setCel(v, v->currentCel);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -269,22 +269,22 @@ void AgiEngine::set_loop(vt_entry *v, int n) {
|
|||
* @param v pointer to view table entry
|
||||
* @param n number of AGI view resource
|
||||
*/
|
||||
void AgiEngine::set_view(vt_entry *v, int n) {
|
||||
v->view_data = &game.views[n];
|
||||
v->current_view = n;
|
||||
v->num_loops = v->view_data->num_loops;
|
||||
set_loop(v, v->current_loop >= v->num_loops ? 0 : v->current_loop);
|
||||
void AgiEngine::setView(VtEntry *v, int n) {
|
||||
v->viewData = &_game.views[n];
|
||||
v->currentView = n;
|
||||
v->numLoops = v->viewData->numLoops;
|
||||
setLoop(v, v->currentLoop >= v->numLoops ? 0 : v->currentLoop);
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the view table entry as updating.
|
||||
* @param v pointer to view table entry
|
||||
*/
|
||||
void AgiEngine::start_update(vt_entry *v) {
|
||||
void AgiEngine::startUpdate(VtEntry *v) {
|
||||
if (~v->flags & UPDATE) {
|
||||
_sprites->erase_both();
|
||||
_sprites->eraseBoth();
|
||||
v->flags |= UPDATE;
|
||||
_sprites->blit_both();
|
||||
_sprites->blitBoth();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -292,22 +292,22 @@ void AgiEngine::start_update(vt_entry *v) {
|
|||
* Set the view table entry as non-updating.
|
||||
* @param v pointer to view table entry
|
||||
*/
|
||||
void AgiEngine::stop_update(vt_entry *v) {
|
||||
void AgiEngine::stopUpdate(VtEntry *v) {
|
||||
if (v->flags & UPDATE) {
|
||||
_sprites->erase_both();
|
||||
_sprites->eraseBoth();
|
||||
v->flags &= ~UPDATE;
|
||||
_sprites->blit_both();
|
||||
_sprites->blitBoth();
|
||||
}
|
||||
}
|
||||
|
||||
/* loops to use according to direction and number of loops in
|
||||
* the view resource
|
||||
*/
|
||||
static int loop_table_2[] = {
|
||||
static int loopTable2[] = {
|
||||
0x04, 0x04, 0x00, 0x00, 0x00, 0x04, 0x01, 0x01, 0x01
|
||||
};
|
||||
|
||||
static int loop_table_4[] = {
|
||||
static int loopTable4[] = {
|
||||
0x04, 0x03, 0x00, 0x00, 0x00, 0x02, 0x01, 0x01, 0x01
|
||||
};
|
||||
|
||||
|
@ -316,12 +316,12 @@ static int loop_table_4[] = {
|
|||
* This function is called at the end of each interpreter cycle
|
||||
* to update the view table entries and blit the sprites.
|
||||
*/
|
||||
void AgiEngine::update_viewtable() {
|
||||
vt_entry *v;
|
||||
void AgiEngine::updateViewtable() {
|
||||
VtEntry *v;
|
||||
int i, loop;
|
||||
|
||||
i = 0;
|
||||
for (v = game.view_table; v < &game.view_table[MAX_VIEWTABLE]; v++) {
|
||||
for (v = _game.viewTable; v < &_game.viewTable[MAX_VIEWTABLE]; v++) {
|
||||
if ((v->flags & (ANIMATED | UPDATE | DRAWN)) != (ANIMATED | UPDATE | DRAWN)) {
|
||||
continue;
|
||||
}
|
||||
|
@ -330,53 +330,53 @@ void AgiEngine::update_viewtable() {
|
|||
|
||||
loop = 4;
|
||||
if (~v->flags & FIX_LOOP) {
|
||||
switch (v->num_loops) {
|
||||
switch (v->numLoops) {
|
||||
case 2:
|
||||
case 3:
|
||||
loop = loop_table_2[v->direction];
|
||||
loop = loopTable2[v->direction];
|
||||
break;
|
||||
case 4:
|
||||
loop = loop_table_4[v->direction];
|
||||
loop = loopTable4[v->direction];
|
||||
break;
|
||||
default:
|
||||
/* for KQ4 */
|
||||
if (agiGetRelease() == 0x3086)
|
||||
loop = loop_table_4[v->direction];
|
||||
loop = loopTable4[v->direction];
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/* AGI 2.272 (ddp, xmas) doesn't test step_time_count! */
|
||||
if (loop != 4 && loop != v->current_loop) {
|
||||
if (loop != 4 && loop != v->currentLoop) {
|
||||
if (agiGetRelease() <= 0x2272 ||
|
||||
v->step_time_count == 1) {
|
||||
set_loop(v, loop);
|
||||
v->stepTimeCount == 1) {
|
||||
setLoop(v, loop);
|
||||
}
|
||||
}
|
||||
|
||||
if (~v->flags & CYCLING)
|
||||
continue;
|
||||
|
||||
if (v->cycle_time_count == 0)
|
||||
if (v->cycleTimeCount == 0)
|
||||
continue;
|
||||
|
||||
if (--v->cycle_time_count == 0) {
|
||||
update_view(v);
|
||||
v->cycle_time_count = v->cycle_time;
|
||||
if (--v->cycleTimeCount == 0) {
|
||||
updateView(v);
|
||||
v->cycleTimeCount = v->cycleTime;
|
||||
}
|
||||
}
|
||||
|
||||
if (i) {
|
||||
_sprites->erase_upd_sprites();
|
||||
update_position();
|
||||
_sprites->blit_upd_sprites();
|
||||
_sprites->commit_upd_sprites();
|
||||
game.view_table[0].flags &= ~(ON_WATER | ON_LAND);
|
||||
_sprites->eraseUpdSprites();
|
||||
updatePosition();
|
||||
_sprites->blitUpdSprites();
|
||||
_sprites->commitUpdSprites();
|
||||
_game.viewTable[0].flags &= ~(ON_WATER | ON_LAND);
|
||||
}
|
||||
}
|
||||
|
||||
bool AgiEngine::is_ego_view(const vt_entry* v) {
|
||||
return v == game.view_table;
|
||||
bool AgiEngine::isEgoView(const VtEntry* v) {
|
||||
return v == _game.viewTable;
|
||||
}
|
||||
|
||||
} // End of namespace Agi
|
||||
} // End of namespace Agi
|
||||
|
|
|
@ -30,26 +30,26 @@
|
|||
|
||||
namespace Agi {
|
||||
|
||||
struct view_cel {
|
||||
struct ViewCel {
|
||||
uint8 height;
|
||||
uint8 width;
|
||||
uint8 transparency;
|
||||
uint8 mirror_loop;
|
||||
uint8 mirrorLoop;
|
||||
uint8 mirror;
|
||||
uint8 *data;
|
||||
};
|
||||
|
||||
struct view_loop {
|
||||
int num_cels;
|
||||
struct view_cel *cel;
|
||||
struct ViewLoop {
|
||||
int numCels;
|
||||
struct ViewCel *cel;
|
||||
};
|
||||
|
||||
/**
|
||||
* AGI view resource structure.
|
||||
*/
|
||||
struct agi_view {
|
||||
int num_loops;
|
||||
struct view_loop *loop;
|
||||
struct AgiView {
|
||||
int numLoops;
|
||||
struct ViewLoop *loop;
|
||||
char *descr;
|
||||
uint8 *rdata;
|
||||
};
|
||||
|
@ -57,29 +57,29 @@ struct agi_view {
|
|||
/**
|
||||
* AGI view table entry
|
||||
*/
|
||||
struct vt_entry {
|
||||
uint8 step_time;
|
||||
uint8 step_time_count;
|
||||
struct VtEntry {
|
||||
uint8 stepTime;
|
||||
uint8 stepTimeCount;
|
||||
uint8 entry;
|
||||
int16 x_pos;
|
||||
int16 y_pos;
|
||||
uint8 current_view;
|
||||
struct agi_view *view_data;
|
||||
uint8 current_loop;
|
||||
uint8 num_loops;
|
||||
struct view_loop *loop_data;
|
||||
uint8 current_cel;
|
||||
uint8 num_cels;
|
||||
struct view_cel *cel_data;
|
||||
struct view_cel *cel_data_2;
|
||||
int16 x_pos2;
|
||||
int16 y_pos2;
|
||||
int16 xPos;
|
||||
int16 yPos;
|
||||
uint8 currentView;
|
||||
struct AgiView *viewData;
|
||||
uint8 currentLoop;
|
||||
uint8 numLoops;
|
||||
struct ViewLoop *loopData;
|
||||
uint8 currentCel;
|
||||
uint8 numCels;
|
||||
struct ViewCel *celData;
|
||||
struct ViewCel *celData2;
|
||||
int16 xPos2;
|
||||
int16 yPos2;
|
||||
void *s;
|
||||
int16 x_size;
|
||||
int16 y_size;
|
||||
uint8 step_size;
|
||||
uint8 cycle_time;
|
||||
uint8 cycle_time_count;
|
||||
int16 xSize;
|
||||
int16 ySize;
|
||||
uint8 stepSize;
|
||||
uint8 cycleTime;
|
||||
uint8 cycleTimeCount;
|
||||
uint8 direction;
|
||||
|
||||
#define MOTION_NORMAL 0
|
||||
|
@ -118,8 +118,8 @@ struct vt_entry {
|
|||
uint8 parm2;
|
||||
uint8 parm3;
|
||||
uint8 parm4;
|
||||
}; /* struct vt_entry */
|
||||
}; /* struct vt_entry */
|
||||
|
||||
} // End of namespace Agi
|
||||
} // End of namespace Agi
|
||||
|
||||
#endif /* AGI_VIEW_H */
|
||||
#endif /* AGI_VIEW_H */
|
||||
|
|
|
@ -32,19 +32,19 @@
|
|||
namespace Agi {
|
||||
|
||||
static uint8 *words; /* words in the game */
|
||||
static uint32 words_flen; /* length of word memory */
|
||||
static uint32 wordsFlen; /* length of word memory */
|
||||
|
||||
/*
|
||||
* Local implementation to avoid problems with strndup() used by
|
||||
* gcc 3.2 Cygwin (see #635984)
|
||||
*/
|
||||
static char *my_strndup(char *src, int n) {
|
||||
static char *myStrndup(char *src, int n) {
|
||||
char *tmp = strncpy((char *)malloc(n + 1), src, n);
|
||||
tmp[n] = 0;
|
||||
return tmp;
|
||||
}
|
||||
|
||||
int AgiEngine::load_words(const char *fname) {
|
||||
int AgiEngine::loadWords(const char *fname) {
|
||||
Common::File fp;
|
||||
uint32 flen;
|
||||
uint8 *mem = NULL;
|
||||
|
@ -53,18 +53,18 @@ int AgiEngine::load_words(const char *fname) {
|
|||
|
||||
if (!fp.open(fname)) {
|
||||
report("Warning: can't open %s\n", fname);
|
||||
return err_OK /*err_BadFileOpen */ ;
|
||||
return errOK /*err_BadFileOpen */ ;
|
||||
}
|
||||
report("Loading dictionary: %s\n", fname);
|
||||
|
||||
fp.seek(0, SEEK_END);
|
||||
flen = fp.pos();
|
||||
words_flen = flen;
|
||||
wordsFlen = flen;
|
||||
fp.seek(0, SEEK_SET);
|
||||
|
||||
if ((mem = (uint8 *)calloc(1, flen + 32)) == NULL) {
|
||||
fp.close();
|
||||
return err_NotEnoughMemory;
|
||||
return errNotEnoughMemory;
|
||||
}
|
||||
|
||||
fp.read(mem, flen);
|
||||
|
@ -72,10 +72,10 @@ int AgiEngine::load_words(const char *fname) {
|
|||
|
||||
words = mem;
|
||||
|
||||
return err_OK;
|
||||
return errOK;
|
||||
}
|
||||
|
||||
void AgiEngine::unload_words() {
|
||||
void AgiEngine::unloadWords() {
|
||||
if (words != NULL) {
|
||||
free(words);
|
||||
words = NULL;
|
||||
|
@ -89,11 +89,11 @@ void AgiEngine::unload_words() {
|
|||
*
|
||||
* Thomas Åkesson, November 2001
|
||||
*/
|
||||
int AgiEngine::find_word(char *word, int *flen) {
|
||||
int AgiEngine::findWord(char *word, int *flen) {
|
||||
int mchr = 0; /* matched chars */
|
||||
int len, fchr, id = -1;
|
||||
uint8 *p = words;
|
||||
uint8 *q = words + words_flen;
|
||||
uint8 *q = words + wordsFlen;
|
||||
*flen = 0;
|
||||
|
||||
debugC(2, kDebugLevelScripts, "find_word(%s)", word);
|
||||
|
@ -140,33 +140,33 @@ int AgiEngine::find_word(char *word, int *flen) {
|
|||
return id;
|
||||
}
|
||||
|
||||
void AgiEngine::dictionary_words(char *msg) {
|
||||
void AgiEngine::dictionaryWords(char *msg) {
|
||||
char *p = NULL;
|
||||
char *q = NULL;
|
||||
int wid, wlen;
|
||||
|
||||
debugC(2, kDebugLevelScripts, "msg = \"%s\"", msg);
|
||||
|
||||
clean_input();
|
||||
cleanInput();
|
||||
|
||||
for (p = msg; p && *p && getvar(V_word_not_found) == 0;) {
|
||||
for (p = msg; p && *p && getvar(vWordNotFound) == 0;) {
|
||||
if (*p == 0x20)
|
||||
p++;
|
||||
|
||||
if (*p == 0)
|
||||
break;
|
||||
|
||||
wid = find_word(p, &wlen);
|
||||
wid = findWord(p, &wlen);
|
||||
debugC(2, kDebugLevelScripts, "find_word(p) == %d", wid);
|
||||
|
||||
switch (wid) {
|
||||
case -1:
|
||||
debugC(2, kDebugLevelScripts, "unknown word");
|
||||
game.ego_words[game.num_ego_words].word = strdup(p);
|
||||
q = game.ego_words[game.num_ego_words].word;
|
||||
game.ego_words[game.num_ego_words].id = 19999;
|
||||
setvar(V_word_not_found, 1 + game.num_ego_words);
|
||||
game.num_ego_words++;
|
||||
_game.egoWords[_game.numEgoWords].word = strdup(p);
|
||||
q = _game.egoWords[_game.numEgoWords].word;
|
||||
_game.egoWords[_game.numEgoWords].id = 19999;
|
||||
setvar(vWordNotFound, 1 + _game.numEgoWords);
|
||||
_game.numEgoWords++;
|
||||
p += strlen(p);
|
||||
break;
|
||||
case 0:
|
||||
|
@ -178,9 +178,9 @@ void AgiEngine::dictionary_words(char *msg) {
|
|||
default:
|
||||
/* an OK word */
|
||||
debugC(3, kDebugLevelScripts, "ok word (%d)", wid);
|
||||
game.ego_words[game.num_ego_words].id = wid;
|
||||
game.ego_words[game.num_ego_words].word = my_strndup(p, wlen);
|
||||
game.num_ego_words++;
|
||||
_game.egoWords[_game.numEgoWords].id = wid;
|
||||
_game.egoWords[_game.numEgoWords].word = myStrndup(p, wlen);
|
||||
_game.numEgoWords++;
|
||||
p += wlen;
|
||||
break;
|
||||
}
|
||||
|
@ -200,11 +200,11 @@ void AgiEngine::dictionary_words(char *msg) {
|
|||
}
|
||||
}
|
||||
|
||||
debugC(4, kDebugLevelScripts, "num_ego_words = %d", game.num_ego_words);
|
||||
if (game.num_ego_words > 0) {
|
||||
setflag(F_entered_cli, true);
|
||||
setflag(F_said_accepted_input, false);
|
||||
debugC(4, kDebugLevelScripts, "num_ego_words = %d", _game.numEgoWords);
|
||||
if (_game.numEgoWords > 0) {
|
||||
setflag(fEnteredCli, true);
|
||||
setflag(fSaidAcceptedInput, false);
|
||||
}
|
||||
}
|
||||
|
||||
} // End of namespace Agi
|
||||
}// End of namespace Agi
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue