mirror of
https://github.com/libretro/scummvm.git
synced 2025-04-02 14:51:40 +00:00
Cleanup
svn-id: r13649
This commit is contained in:
parent
aaf508d4da
commit
49fc62b4d0
@ -152,7 +152,7 @@ private:
|
||||
|
||||
StartUp _startList[MAX_starts];
|
||||
|
||||
uint32 initStartMenu(void);
|
||||
bool initStartMenu(void);
|
||||
|
||||
int16 _standbyX; // see fnSetStandbyCoords()
|
||||
int16 _standbyY;
|
||||
|
@ -22,134 +22,136 @@
|
||||
#include "sword2/defs.h"
|
||||
#include "sword2/interpreter.h"
|
||||
#include "sword2/logic.h"
|
||||
#include "sword2/resman.h"
|
||||
|
||||
namespace Sword2 {
|
||||
|
||||
// max no of pixel allowed to scroll per cycle
|
||||
// Max no of pixel allowed to scroll per cycle
|
||||
#define MAX_SCROLL_DISTANCE 8
|
||||
|
||||
/**
|
||||
* If the room is larger than the physical screen, this function is called
|
||||
* every game cycle to update the scroll offsets.
|
||||
*/
|
||||
|
||||
void Sword2Engine::setScrolling(void) {
|
||||
// normally we aim to get George's feet at (320,250) from top left
|
||||
// Normally we aim to get George's feet at (320,250) from top left
|
||||
// of screen window
|
||||
// feet_x = 128 + 320
|
||||
// feet_y = 128 + 250
|
||||
|
||||
// set scroll offsets according to the player's coords
|
||||
// Set scroll offsets according to the player's coords
|
||||
|
||||
// If the scroll offsets are being forced in script, ensure that they
|
||||
// are neither too far to the right nor too far down.
|
||||
|
||||
if (Logic::_scriptVars[SCROLL_X] || Logic::_scriptVars[SCROLL_Y]) {
|
||||
_thisScreen.scroll_offset_x = MIN((uint16) Logic::_scriptVars[SCROLL_X], _thisScreen.max_scroll_offset_x);
|
||||
_thisScreen.scroll_offset_y = MIN((uint16) Logic::_scriptVars[SCROLL_Y], _thisScreen.max_scroll_offset_y);
|
||||
return;
|
||||
}
|
||||
|
||||
// George's offset from the centre - the desired position for him
|
||||
|
||||
int16 offset_x = _thisScreen.player_feet_x - _thisScreen.feet_x;
|
||||
int16 offset_y = _thisScreen.player_feet_y - _thisScreen.feet_y;
|
||||
|
||||
// Prevent scrolling too far left/right/up/down
|
||||
|
||||
if (offset_x < 0)
|
||||
offset_x = 0;
|
||||
else if (offset_x > _thisScreen.max_scroll_offset_x)
|
||||
offset_x = _thisScreen.max_scroll_offset_x;
|
||||
|
||||
if (offset_y < 0)
|
||||
offset_y = 0;
|
||||
else if (offset_y > _thisScreen.max_scroll_offset_y)
|
||||
offset_y = _thisScreen.max_scroll_offset_y;
|
||||
|
||||
// First time on this screen - need absolute scroll immediately!
|
||||
|
||||
if (_thisScreen.scroll_flag == 2) {
|
||||
debug(5, "init scroll");
|
||||
_thisScreen.scroll_offset_x = offset_x;
|
||||
_thisScreen.scroll_offset_y = offset_y;
|
||||
_thisScreen.scroll_flag = 1;
|
||||
return;
|
||||
}
|
||||
|
||||
// Catch up with required scroll offsets - speed depending on distance
|
||||
// to catch up (dx and dy) and _scrollFraction used, but limit to
|
||||
// certain number of pixels per cycle (MAX_SCROLL_DISTANCE)
|
||||
|
||||
int16 dx = _thisScreen.scroll_offset_x - offset_x;
|
||||
int16 dy = _thisScreen.scroll_offset_y - offset_y;
|
||||
|
||||
int16 offset_x;
|
||||
int16 offset_y;
|
||||
int16 dx, dy;
|
||||
uint16 scroll_distance_x; // how much we want to scroll
|
||||
uint16 scroll_distance_y;
|
||||
|
||||
// if the scroll offsets are being forced in script
|
||||
if (Logic::_scriptVars[SCROLL_X] || Logic::_scriptVars[SCROLL_Y]) {
|
||||
// ensure not too far right or too far down
|
||||
_thisScreen.scroll_offset_x = MIN((uint16) Logic::_scriptVars[SCROLL_X], _thisScreen.max_scroll_offset_x);
|
||||
_thisScreen.scroll_offset_y = MIN((uint16) Logic::_scriptVars[SCROLL_Y], _thisScreen.max_scroll_offset_y);
|
||||
} else {
|
||||
// George's offset from the centre - the desired position
|
||||
// for him
|
||||
if (dx < 0) {
|
||||
// Current scroll_offset_x is less than the required value
|
||||
|
||||
offset_x = _thisScreen.player_feet_x - _thisScreen.feet_x;
|
||||
offset_y = _thisScreen.player_feet_y - _thisScreen.feet_y;
|
||||
// NB. I'm adding 1 to the result of dx / SCROLL_FRACTION,
|
||||
// because it would otherwise not scroll at all when
|
||||
// dx < SCROLL_FRACTION
|
||||
|
||||
// prevent scrolling too far left/right/up/down
|
||||
// => inc by (fraction of the differnce) NB. dx is -ve, so we
|
||||
// subtract dx / SCROLL_FRACTION
|
||||
|
||||
if (offset_x < 0)
|
||||
offset_x = 0;
|
||||
else if ((uint32) offset_x > _thisScreen.max_scroll_offset_x)
|
||||
offset_x = _thisScreen.max_scroll_offset_x;
|
||||
scroll_distance_x = 1 - dx / _scrollFraction;
|
||||
|
||||
if (offset_y < 0)
|
||||
offset_y = 0;
|
||||
else if ((uint32) offset_y > _thisScreen.max_scroll_offset_y)
|
||||
offset_y = _thisScreen.max_scroll_offset_y;
|
||||
if (scroll_distance_x > MAX_SCROLL_DISTANCE)
|
||||
scroll_distance_x = MAX_SCROLL_DISTANCE;
|
||||
|
||||
// first time on this screen - need absolute scroll
|
||||
// immediately!
|
||||
_thisScreen.scroll_offset_x += scroll_distance_x;
|
||||
} else if (dx > 0) {
|
||||
// Current scroll_offset_x is greater than
|
||||
// the required value
|
||||
|
||||
if (_thisScreen.scroll_flag == 2) {
|
||||
debug(5, "init scroll");
|
||||
_thisScreen.scroll_offset_x = offset_x;
|
||||
_thisScreen.scroll_offset_y = offset_y;
|
||||
_thisScreen.scroll_flag = 1;
|
||||
} else {
|
||||
// catch up with required scroll offsets - speed
|
||||
// depending on distance to catch up (dx and dy) &
|
||||
// 'SCROLL_FRACTION' used, but limit to certain
|
||||
// number of pixels per cycle (MAX_SCROLL_DISTANCE)
|
||||
// => dec by (fraction of the differnce)
|
||||
|
||||
dx = _thisScreen.scroll_offset_x - offset_x;
|
||||
dy = _thisScreen.scroll_offset_y - offset_y;
|
||||
scroll_distance_x = 1 + dx / _scrollFraction;
|
||||
|
||||
// current scroll_offset_x is less than the required
|
||||
// value
|
||||
if (scroll_distance_x > MAX_SCROLL_DISTANCE)
|
||||
scroll_distance_x = MAX_SCROLL_DISTANCE;
|
||||
|
||||
// NB. I'm adding 1 to the result of
|
||||
// dx / SCROLL_FRACTION, because it would otherwise
|
||||
// not scroll at all when dx < SCROLL_FRACTION
|
||||
_thisScreen.scroll_offset_x -= scroll_distance_x;
|
||||
}
|
||||
|
||||
if (dx < 0) {
|
||||
// => inc by (fraction of the differnce)
|
||||
// NB. dx is -ve, so we subtract
|
||||
// dx / SCROLL_FRACTION
|
||||
if (dy < 0) {
|
||||
scroll_distance_y = 1 - dy / _scrollFraction;
|
||||
|
||||
scroll_distance_x = 1 - dx / _scrollFraction;
|
||||
if (scroll_distance_y > MAX_SCROLL_DISTANCE)
|
||||
scroll_distance_y = MAX_SCROLL_DISTANCE;
|
||||
|
||||
if (scroll_distance_x > MAX_SCROLL_DISTANCE)
|
||||
scroll_distance_x = MAX_SCROLL_DISTANCE;
|
||||
_thisScreen.scroll_offset_y += scroll_distance_y;
|
||||
} else if (dy > 0) {
|
||||
scroll_distance_y = 1 + dy / _scrollFraction;
|
||||
|
||||
_thisScreen.scroll_offset_x += scroll_distance_x;
|
||||
} else if (dx > 0) {
|
||||
// current scroll_offset_x is greater than
|
||||
// the required value
|
||||
// => dec by (fraction of the differnce)
|
||||
if (scroll_distance_y > MAX_SCROLL_DISTANCE)
|
||||
scroll_distance_y = MAX_SCROLL_DISTANCE;
|
||||
|
||||
scroll_distance_x = 1 + dx / _scrollFraction;
|
||||
|
||||
if (scroll_distance_x > MAX_SCROLL_DISTANCE)
|
||||
scroll_distance_x = MAX_SCROLL_DISTANCE;
|
||||
|
||||
_thisScreen.scroll_offset_x -= scroll_distance_x;
|
||||
}
|
||||
|
||||
if (dy < 0) {
|
||||
scroll_distance_y = 1 - dy / _scrollFraction;
|
||||
|
||||
if (scroll_distance_y > MAX_SCROLL_DISTANCE)
|
||||
scroll_distance_y = MAX_SCROLL_DISTANCE;
|
||||
|
||||
_thisScreen.scroll_offset_y += scroll_distance_y;
|
||||
} else if (dy > 0) {
|
||||
scroll_distance_y = 1 + dy / _scrollFraction;
|
||||
|
||||
if (scroll_distance_y > MAX_SCROLL_DISTANCE)
|
||||
scroll_distance_y = MAX_SCROLL_DISTANCE;
|
||||
|
||||
_thisScreen.scroll_offset_y -= scroll_distance_y;
|
||||
}
|
||||
}
|
||||
_thisScreen.scroll_offset_y -= scroll_distance_y;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the special scroll offset variables
|
||||
*
|
||||
* Call when starting screens and to change the camera within screens
|
||||
*
|
||||
* call AFTER fnInitBackground() to override the defaults
|
||||
*/
|
||||
|
||||
int32 Logic::fnSetScrollCoordinate(int32 *params) {
|
||||
// set the special scroll offset variables
|
||||
|
||||
// call when starting screens and to change the camera within screens
|
||||
|
||||
// call AFTER fnInitBackground() to override the defaults
|
||||
|
||||
// called feet_x and feet_y to retain intelectual compatibility with
|
||||
// Sword1 !
|
||||
|
||||
// feet_x & feet_y refer to the physical screen coords where the
|
||||
// system will try to maintain George's feet
|
||||
|
||||
// params: 0 feet_x value
|
||||
// 1 feet_y value
|
||||
|
||||
// Called feet_x and feet_y to retain intellectual compatibility with
|
||||
// Sword1!
|
||||
//
|
||||
// feet_x & feet_y refer to the physical screen coords where the
|
||||
// system will try to maintain George's feet
|
||||
|
||||
_vm->_thisScreen.feet_x = params[0];
|
||||
_vm->_thisScreen.feet_y = params[1];
|
||||
return IR_CONT;
|
||||
|
@ -21,6 +21,7 @@
|
||||
#include "common/file.h"
|
||||
#include "sword2/sword2.h"
|
||||
#include "sword2/console.h"
|
||||
#include "sword2/interpreter.h"
|
||||
#include "sword2/logic.h"
|
||||
#include "sword2/maketext.h"
|
||||
#include "sword2/resman.h"
|
||||
@ -30,7 +31,7 @@
|
||||
|
||||
namespace Sword2 {
|
||||
|
||||
uint32 Logic::initStartMenu(void) {
|
||||
bool Logic::initStartMenu(void) {
|
||||
// Print out a list of all the start points available.
|
||||
// There should be a linc produced file called startup.txt.
|
||||
// This file should contain ascii numbers of all the resource game
|
||||
@ -40,72 +41,60 @@ uint32 Logic::initStartMenu(void) {
|
||||
|
||||
File fp;
|
||||
|
||||
uint32 pos = 0;
|
||||
char *raw_script;
|
||||
uint32 null_pc;
|
||||
|
||||
char ascii_start_ids[MAX_starts][7];
|
||||
|
||||
// ok, load in the master screen manager file
|
||||
|
||||
_totalStartups = 0; // no starts
|
||||
|
||||
debug(5, "initialising start menu");
|
||||
_totalStartups = 0;
|
||||
|
||||
if (!fp.open("startup.inf")) {
|
||||
warning("initStartMenu: cannot open startup.inf - the debugger won't have a start menu");
|
||||
return 0;
|
||||
warning("Cannot open startup.inf - the debugger won't have a start menu");
|
||||
return false;
|
||||
}
|
||||
|
||||
// The startup.inf file which contains a list of all the files. Now
|
||||
// extract the filenames
|
||||
|
||||
int start_ids[MAX_starts];
|
||||
|
||||
while (1) {
|
||||
bool done = false;
|
||||
|
||||
while (1) {
|
||||
byte b = fp.readByte();
|
||||
start_ids[_totalScreenManagers] = 0;
|
||||
|
||||
// Scan the string until the LF in CRLF
|
||||
|
||||
int b;
|
||||
|
||||
do {
|
||||
b = fp.readByte();
|
||||
|
||||
if (fp.ioFailed()) {
|
||||
done = true;
|
||||
break;
|
||||
}
|
||||
|
||||
// Each item ends with CRLF
|
||||
if (b == 13) {
|
||||
fp.readByte();
|
||||
break;
|
||||
if (isdigit(b)) {
|
||||
start_ids[_totalScreenManagers] *= 10;
|
||||
start_ids[_totalScreenManagers] += (b - '0');
|
||||
}
|
||||
|
||||
if (pos < 7)
|
||||
ascii_start_ids[_totalScreenManagers][pos] = b;
|
||||
pos++;
|
||||
}
|
||||
} while (b != 10);
|
||||
|
||||
if (done)
|
||||
break;
|
||||
|
||||
// NULL terminate our extracted string
|
||||
ascii_start_ids[_totalScreenManagers][pos] = 0;
|
||||
|
||||
// reset position in current slot between entries
|
||||
pos = 0;
|
||||
|
||||
// done another
|
||||
_totalScreenManagers++;
|
||||
|
||||
if (_totalScreenManagers == MAX_starts) {
|
||||
debug(5, "WARNING MAX_starts exceeded!");
|
||||
warning("MAX_starts exceeded");
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
fp.close();
|
||||
|
||||
// using this method the Gode generated resource.inf must have #0d0a
|
||||
// Using this method the Gode generated resource.inf must have #0d0a
|
||||
// on the last entry
|
||||
|
||||
debug(5, "%d screen manager objects", _totalScreenManagers);
|
||||
debug(1, "%d screen manager objects", _totalScreenManagers);
|
||||
|
||||
// Open each object and make a query call. The object must fill in a
|
||||
// startup structure. It may fill in several if it wishes - for
|
||||
@ -113,12 +102,12 @@ uint32 Logic::initStartMenu(void) {
|
||||
// specific vars are set
|
||||
|
||||
for (uint i = 0; i < _totalScreenManagers; i++) {
|
||||
_startRes = atoi(ascii_start_ids[i]);
|
||||
_startRes = start_ids[i];
|
||||
|
||||
debug(5, "+querying screen manager %d", _startRes);
|
||||
debug(2, "Querying screen manager %d", _startRes);
|
||||
|
||||
// resopen each one and run through the interpretter
|
||||
// script 0 is the query request script
|
||||
// Open each one and run through the interpreter. Script 0 is
|
||||
// the query request script
|
||||
|
||||
// if the resource number is within range & it's not a null
|
||||
// resource
|
||||
@ -126,13 +115,13 @@ uint32 Logic::initStartMenu(void) {
|
||||
// start list
|
||||
|
||||
if (_vm->_resman->checkValid(_startRes)) {
|
||||
debug(5, "- resource %d ok", _startRes);
|
||||
raw_script = (char *) _vm->_resman->openResource(_startRes);
|
||||
null_pc = 0;
|
||||
char *raw_script = (char *) _vm->_resman->openResource(_startRes);
|
||||
uint32 null_pc = 0;
|
||||
|
||||
runScript(raw_script, raw_script, &null_pc);
|
||||
_vm->_resman->closeResource(_startRes);
|
||||
} else
|
||||
debug(5, "- resource %d invalid", _startRes);
|
||||
warning("Start menu resource %d invalid", _startRes);
|
||||
}
|
||||
|
||||
return 1;
|
||||
@ -142,34 +131,26 @@ int32 Logic::fnRegisterStartPoint(int32 *params) {
|
||||
// params: 0 id of startup script to call - key
|
||||
// 1 pointer to ascii message
|
||||
|
||||
#ifdef _SWORD2_DEBUG
|
||||
if (_totalStartups == MAX_starts)
|
||||
error("ERROR: _startList full");
|
||||
assert(_totalStartups < MAX_starts);
|
||||
|
||||
// +1 to allow for NULL terminator
|
||||
if (strlen((const char *) _vm->_memory->decodePtr(params[1])) + 1 > MAX_description)
|
||||
error("ERROR: startup description too long");
|
||||
#endif
|
||||
char *name = (char *) _vm->_memory->decodePtr(params[1]);
|
||||
|
||||
// this objects id
|
||||
_startList[_totalStartups].start_res_id = _startRes;
|
||||
|
||||
// a key code to be passed to a script via a script var to SWITCH in
|
||||
// the correct start
|
||||
_startList[_totalStartups].key = params[0];
|
||||
|
||||
strcpy(_startList[_totalStartups].description, (const char *) _vm->_memory->decodePtr(params[1]));
|
||||
strncpy(_startList[_totalStartups].description, name, MAX_description);
|
||||
_startList[_totalStartups].description[MAX_description - 1] = 0;
|
||||
|
||||
// point to next
|
||||
_totalStartups++;
|
||||
|
||||
return 1;
|
||||
return IR_CONT;
|
||||
}
|
||||
|
||||
void Logic::conPrintStartMenu(void) {
|
||||
// the console 'starts' (or 's') command which lists out all the
|
||||
// registered start points in the game
|
||||
/**
|
||||
* The console 'starts' (or 's') command which lists out all the registered
|
||||
* start points in the game.
|
||||
*/
|
||||
|
||||
void Logic::conPrintStartMenu(void) {
|
||||
if (!_totalStartups) {
|
||||
Debug_Printf("Sorry - no startup positions registered?\n");
|
||||
|
||||
@ -177,76 +158,64 @@ void Logic::conPrintStartMenu(void) {
|
||||
Debug_Printf("There is a problem with startup.inf\n");
|
||||
else
|
||||
Debug_Printf(" (%d screen managers found in startup.inf)\n", _totalScreenManagers);
|
||||
} else {
|
||||
for (uint i = 0; i < _totalStartups; i++)
|
||||
Debug_Printf("%d (%s)\n", i, _startList[i].description);
|
||||
return;
|
||||
}
|
||||
|
||||
for (uint i = 0; i < _totalStartups; i++)
|
||||
Debug_Printf("%d (%s)\n", i, _startList[i].description);
|
||||
}
|
||||
|
||||
void Logic::conStart(int start) {
|
||||
char *raw_script;
|
||||
char *raw_data_ad;
|
||||
uint32 null_pc;
|
||||
|
||||
if (!_totalStartups)
|
||||
if (!_totalStartups) {
|
||||
Debug_Printf("Sorry - there are no startups!\n");
|
||||
else if (start >= 0 && start < (int) _totalStartups) {
|
||||
// do the startup as we've specified a legal start
|
||||
return;
|
||||
}
|
||||
|
||||
// restarting - stop sfx, music & speech!
|
||||
|
||||
_vm->clearFxQueue();
|
||||
|
||||
// fade out any music that is currently playing
|
||||
fnStopMusic(NULL);
|
||||
|
||||
// halt the sample prematurely
|
||||
_vm->_sound->unpauseSpeech();
|
||||
_vm->_sound->stopSpeech();
|
||||
|
||||
// clean out all resources & flags, ready for a total
|
||||
// restart
|
||||
|
||||
// remove all resources from memory, including player
|
||||
// object & global variables
|
||||
|
||||
_vm->_resman->removeAll();
|
||||
|
||||
// reopen global variables resource & send address to
|
||||
// interpreter - it won't be moving
|
||||
_vm->_logic->resetScriptVars();
|
||||
|
||||
// free all the route memory blocks from previous game
|
||||
_router->freeAllRouteMem();
|
||||
|
||||
// if there was speech text, kill the text block
|
||||
if (_speechTextBlocNo) {
|
||||
_vm->_fontRenderer->killTextBloc(_speechTextBlocNo);
|
||||
_speechTextBlocNo = 0;
|
||||
}
|
||||
|
||||
// set the key
|
||||
|
||||
// Open George
|
||||
raw_data_ad = (char *) _vm->_resman->openResource(8);
|
||||
raw_script = (char *) _vm->_resman->openResource(_startList[start].start_res_id);
|
||||
|
||||
// denotes script to run
|
||||
null_pc = _startList[start].key & 0xffff;
|
||||
|
||||
Debug_Printf("Running start %d\n", start);
|
||||
runScript(raw_script, raw_data_ad, &null_pc);
|
||||
|
||||
_vm->_resman->closeResource(_startList[start].start_res_id);
|
||||
|
||||
// Close George
|
||||
_vm->_resman->closeResource(8);
|
||||
|
||||
// make sure thre's a mouse, in case restarting while
|
||||
// mouse not available
|
||||
fnAddHuman(NULL);
|
||||
} else
|
||||
if (start < 0 || start >= (int) _totalStartups) {
|
||||
Debug_Printf("Not a legal start position\n");
|
||||
return;
|
||||
}
|
||||
|
||||
// Restarting - stop sfx, music & speech!
|
||||
|
||||
_vm->clearFxQueue();
|
||||
fnStopMusic(NULL);
|
||||
_vm->_sound->unpauseSpeech();
|
||||
_vm->_sound->stopSpeech();
|
||||
|
||||
// Remove all resources from memory, including player object and global
|
||||
// variables
|
||||
|
||||
_vm->_resman->removeAll();
|
||||
|
||||
// Reopen global variables resource and send address to interpreter
|
||||
_vm->_logic->resetScriptVars();
|
||||
|
||||
// Free all the route memory blocks from previous game
|
||||
_router->freeAllRouteMem();
|
||||
|
||||
// If there was speech text, kill the text block
|
||||
if (_speechTextBlocNo) {
|
||||
_vm->_fontRenderer->killTextBloc(_speechTextBlocNo);
|
||||
_speechTextBlocNo = 0;
|
||||
}
|
||||
|
||||
// Open George
|
||||
char *raw_data_ad = (char *) _vm->_resman->openResource(8);
|
||||
char *raw_script = (char *) _vm->_resman->openResource(_startList[start].start_res_id);
|
||||
|
||||
// Denotes script to run
|
||||
uint32 null_pc = _startList[start].key & 0xffff;
|
||||
|
||||
Debug_Printf("Running start %d\n", start);
|
||||
runScript(raw_script, raw_data_ad, &null_pc);
|
||||
|
||||
_vm->_resman->closeResource(_startList[start].start_res_id);
|
||||
_vm->_resman->closeResource(8);
|
||||
|
||||
// Make sure there's a mouse, in case restarting while mouse not
|
||||
// available
|
||||
fnAddHuman(NULL);
|
||||
}
|
||||
|
||||
} // End of namespace Sword2
|
||||
|
Loading…
x
Reference in New Issue
Block a user