aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sword2/anims.cpp157
-rw-r--r--sword2/build_display.cpp379
-rw-r--r--sword2/build_display.h81
-rw-r--r--sword2/controls.cpp10
-rw-r--r--sword2/debug.cpp23
-rw-r--r--sword2/function.cpp6
-rw-r--r--sword2/layers.cpp18
-rw-r--r--sword2/logic.h34
-rw-r--r--sword2/mouse.cpp2
-rw-r--r--sword2/resman.cpp4
-rw-r--r--sword2/sword2.cpp20
-rw-r--r--sword2/sword2.h100
12 files changed, 373 insertions, 461 deletions
diff --git a/sword2/anims.cpp b/sword2/anims.cpp
index 138e6e15ad..c8136237f4 100644
--- a/sword2/anims.cpp
+++ b/sword2/anims.cpp
@@ -44,19 +44,13 @@
namespace Sword2 {
-// stores resource id of wav to use as lead-out from smacker
-static uint32 smackerLeadOut = 0;
-
-int32 Animate(int32 *params, uint8 reverse_flag);
-int32 Mega_table_animate(int32 *params, uint8 reverse_flag);
-
int32 Logic::fnAnim(int32 *params) {
// params: 0 pointer to object's logic structure
// 1 pointer to object's graphic structure
// 2 resource id of animation file
// 0 means normal forward anim
- return Animate(params, 0);
+ return animate(params, false);
}
int32 Logic::fnReverseAnim(int32 *params) {
@@ -65,7 +59,7 @@ int32 Logic::fnReverseAnim(int32 *params) {
// 2 resource id of animation file
// 1 means reverse anim
- return Animate(params, 1);
+ return animate(params, true);
}
int32 Logic::fnMegaTableAnim(int32 *params) {
@@ -75,7 +69,7 @@ int32 Logic::fnMegaTableAnim(int32 *params) {
// 3 pointer to animation table
// 0 means normal forward anim
- return Mega_table_animate(params, 0);
+ return megaTableAnimate(params, false);
}
int32 Logic::fnReverseMegaTableAnim(int32 *params) {
@@ -85,10 +79,10 @@ int32 Logic::fnReverseMegaTableAnim(int32 *params) {
// 3 pointer to animation table
// 1 means reverse anim
- return Mega_table_animate(params, 1);
+ return megaTableAnimate(params, true);
}
-int32 Animate(int32 *params, uint8 reverse_flag) {
+int32 Logic::animate(int32 *params, bool reverse) {
// params: 0 pointer to object's logic structure
// 1 pointer to object's graphic structure
// 2 resource id of animation file
@@ -153,7 +147,7 @@ int32 Animate(int32 *params, uint8 reverse_flag) {
#ifdef _SWORD2_DEBUG
// check that we haven't been passed a zero resource number
if (res == 0)
- error("Animate: %s (id %d) passed zero anim resource", FetchObjectName(ID), ID);
+ error("animate: %s (id %d) passed zero anim resource", FetchObjectName(ID), ID);
#endif
// open anim file
@@ -163,7 +157,7 @@ int32 Animate(int32 *params, uint8 reverse_flag) {
// check this this resource is actually an animation file!
head = (_standardHeader *) anim_file;
if (head->fileType != ANIMATION_FILE)
- error("Animate: %s (%d) is not an anim!", FetchObjectName(res), res);
+ error("animate: %s (%d) is not an anim!", FetchObjectName(res), res);
#endif
// point to anim header
@@ -172,14 +166,14 @@ int32 Animate(int32 *params, uint8 reverse_flag) {
/* #ifdef _SWORD2_DEBUG
// check there's at least one frame
if (anim_head->noAnimFrames == 0)
- error("Animate: %s (%d) has zero frame count!", FetchObjectName(res), res);
+ error("animate: %s (%d) has zero frame count!", FetchObjectName(res), res);
#endif */
// now running an anim, looping back to this 'FN' call again
ob_logic->looping = 1;
ob_graphic->anim_resource = res;
- if (reverse_flag)
+ if (reverse)
ob_graphic->anim_pc = anim_head->noAnimFrames - 1;
else
ob_graphic->anim_pc = 0;
@@ -199,7 +193,7 @@ int32 Animate(int32 *params, uint8 reverse_flag) {
anim_file = res_man.open(ob_graphic->anim_resource);
anim_head = FetchAnimHeader(anim_file);
- if (reverse_flag)
+ if (reverse)
ob_graphic->anim_pc--;
else
ob_graphic->anim_pc++;
@@ -207,7 +201,7 @@ int32 Animate(int32 *params, uint8 reverse_flag) {
// check for end of anim
- if (reverse_flag) {
+ if (reverse) {
if (ob_graphic->anim_pc == 0)
ob_logic->looping = 0;
} else {
@@ -222,7 +216,7 @@ int32 Animate(int32 *params, uint8 reverse_flag) {
return ob_logic->looping ? IR_REPEAT : IR_STOP;
}
-int32 Mega_table_animate(int32 *params, uint8 reverse_flag) {
+int32 Logic::megaTableAnimate(int32 *params, bool reverse) {
// params: 0 pointer to object's logic structure
// 1 pointer to object's graphic structure
// 2 pointer to object's mega structure
@@ -253,8 +247,8 @@ int32 Mega_table_animate(int32 *params, uint8 reverse_flag) {
// pars[2] only needed setting at the start of the anim
- // call Animate() with these params
- return Animate(pars, reverse_flag);
+ // call animate() with these params
+ return animate(pars, reverse);
}
int32 Logic::fnSetFrame(int32 *params) {
@@ -462,66 +456,45 @@ int32 Logic::fnUnshadedSprite(int32 *params) {
// _wavHeader *speech;
// } _movieTextObject;
-// FOR TEXT LINES IN SEQUENCE PLAYER
-
-#define MAX_SEQUENCE_TEXT_LINES 15
-
-typedef struct {
- uint32 textNumber;
- uint16 startFrame;
- uint16 endFrame;
- mem *text_mem;
- uint32 speechBufferSize;
- uint16 *speech_mem;
-} _sequenceTextInfo;
-
-// keeps count of number of text lines to disaply during the sequence
-static uint32 sequenceTextLines = 0;
-
-static _sequenceTextInfo sequence_text_list[MAX_SEQUENCE_TEXT_LINES];
-
int32 Logic::fnAddSequenceText(int32 *params) {
-// params: 0 text number
-// 1 frame number to start the text displaying
-// 2 frame number to stop the text dispalying
+ // params: 0 text number
+ // 1 frame number to start the text displaying
+ // 2 frame number to stop the text dispalying
-#ifdef _SWORD2_DEBUG
- if (sequenceTextLines == MAX_SEQUENCE_TEXT_LINES)
- error("fnAddSequenceText ran out of lines");
-#endif
+ assert(_sequenceTextLines < MAX_SEQUENCE_TEXT_LINES);
- sequence_text_list[sequenceTextLines].textNumber = params[0];
- sequence_text_list[sequenceTextLines].startFrame = params[1];
- sequence_text_list[sequenceTextLines].endFrame = (uint16) params[2];
- sequenceTextLines++;
+ _sequenceTextList[_sequenceTextLines].textNumber = params[0];
+ _sequenceTextList[_sequenceTextLines].startFrame = params[1];
+ _sequenceTextList[_sequenceTextLines].endFrame = (uint16) params[2];
+ _sequenceTextLines++;
// continue script
return IR_CONT;
}
-void CreateSequenceSpeech(_movieTextObject *sequenceText[]) {
+void Logic::createSequenceSpeech(_movieTextObject *sequenceText[]) {
uint32 line;
_frameHeader *frame;
uint32 local_text;
uint32 text_res;
uint8 *text;
uint32 wavId; // ie. offical text number (actor text number)
- uint8 speechRunning;
+ bool speechRunning;
char speechFile[256];
// for each sequence text line that's been logged
- for (line = 0; line < sequenceTextLines; line++) {
+ for (line = 0; line < _sequenceTextLines; line++) {
// allocate this structure
sequenceText[line] = new _movieTextObject;
- sequenceText[line]->startFrame = sequence_text_list[line].startFrame;
- sequenceText[line]->endFrame = sequence_text_list[line].endFrame;
+ sequenceText[line]->startFrame = _sequenceTextList[line].startFrame;
+ sequenceText[line]->endFrame = _sequenceTextList[line].endFrame;
// pull out the text line to get the official text number
// (for wav id)
- text_res = sequence_text_list[line].textNumber / SIZE;
- local_text = sequence_text_list[line].textNumber & 0xffff;
+ text_res = _sequenceTextList[line].textNumber / SIZE;
+ local_text = _sequenceTextList[line].textNumber & 0xffff;
// open text resource & get the line
text = FetchTextLine(res_man.open(text_res), local_text);
@@ -536,8 +509,8 @@ void CreateSequenceSpeech(_movieTextObject *sequenceText[]) {
// is it to be speech or subtitles or both?
// assume speech is not running until know otherwise
- speechRunning = 0;
- sequence_text_list[line].speech_mem = NULL;
+ speechRunning = false;
+ _sequenceTextList[line].speech_mem = NULL;
sequenceText[line]->speech = NULL;
if (!g_sound->isSpeechMute()) {
@@ -556,10 +529,10 @@ void CreateSequenceSpeech(_movieTextObject *sequenceText[]) {
else
strcpy(speechFile, "speech.clu");
- sequence_text_list[line].speechBufferSize = g_sound->preFetchCompSpeech((char *) speechFile, wavId, &sequence_text_list[line].speech_mem);
- if (sequence_text_list[line].speechBufferSize) {
+ _sequenceTextList[line].speechBufferSize = g_sound->preFetchCompSpeech((char *) speechFile, wavId, &_sequenceTextList[line].speech_mem);
+ if (_sequenceTextList[line].speechBufferSize) {
// ok, we've got speech!
- speechRunning = 1;
+ speechRunning = true;
}
}
@@ -578,33 +551,33 @@ void CreateSequenceSpeech(_movieTextObject *sequenceText[]) {
// When rendering text over a sequence we need a
// different colour for the border.
- sequence_text_list[line].text_mem = fontRenderer.makeTextSprite(text + 2, 600, 255, g_sword2->_speechFontId, 1);
+ _sequenceTextList[line].text_mem = fontRenderer.makeTextSprite(text + 2, 600, 255, g_sword2->_speechFontId, 1);
// ok to close the text resource now
res_man.close(text_res);
} else {
- sequence_text_list[line].text_mem = NULL;
+ _sequenceTextList[line].text_mem = NULL;
sequenceText[line]->textSprite = NULL;
}
}
// for drivers: NULL-terminate the array of pointers to
// _movieTextObject's
- sequenceText[sequenceTextLines] = NULL;
+ sequenceText[_sequenceTextLines] = NULL;
// now lock all the memory blocks containing text sprites & speech
// samples and set up the pointers to them, etc, for the drivers
- for (line = 0; line < sequenceTextLines; line++) {
+ for (line = 0; line < _sequenceTextLines; line++) {
// if we've made a text sprite for this line...
- if (sequence_text_list[line].text_mem) {
- memory.lockMemory(sequence_text_list[line].text_mem);
+ if (_sequenceTextList[line].text_mem) {
+ memory.lockMemory(_sequenceTextList[line].text_mem);
// now fill out the _spriteInfo structure in the
// _movieTextObjectStructure
- frame = (_frameHeader *) sequence_text_list[line].text_mem->ad;
+ frame = (_frameHeader *) _sequenceTextList[line].text_mem->ad;
sequenceText[line]->textSprite = new _spriteInfo;
@@ -614,39 +587,39 @@ void CreateSequenceSpeech(_movieTextObject *sequenceText[]) {
sequenceText[line]->textSprite->w = frame->width;
sequenceText[line]->textSprite->h = frame->height;
sequenceText[line]->textSprite->type = RDSPR_DISPLAYALIGN | RDSPR_NOCOMPRESSION;
- sequenceText[line]->textSprite->data = sequence_text_list[line].text_mem->ad + sizeof(_frameHeader);
+ sequenceText[line]->textSprite->data = _sequenceTextList[line].text_mem->ad + sizeof(_frameHeader);
}
// if we've loaded a speech sample for this line...
- if (sequence_text_list[line].speech_mem) {
+ if (_sequenceTextList[line].speech_mem) {
// for drivers: set up pointer to decompressed wav in
// memory
- sequenceText[line]->speechBufferSize = sequence_text_list[line].speechBufferSize;
- sequenceText[line]->speech = sequence_text_list[line].speech_mem;
+ sequenceText[line]->speechBufferSize = _sequenceTextList[line].speechBufferSize;
+ sequenceText[line]->speech = _sequenceTextList[line].speech_mem;
}
}
}
-void ClearSequenceSpeech(_movieTextObject *textSprites[]) {
+void Logic::clearSequenceSpeech(_movieTextObject *sequenceText[]) {
uint32 line;
- for (line = 0; line < sequenceTextLines; line++) {
+ for (line = 0; line < _sequenceTextLines; line++) {
// free up the memory used by this _movieTextObject
- delete textSprites[line];
+ delete sequenceText[line];
// free up the mem block containing this text sprite
- if (sequence_text_list[line].text_mem)
- memory.freeMemory(sequence_text_list[line].text_mem);
+ if (_sequenceTextList[line].text_mem)
+ memory.freeMemory(_sequenceTextList[line].text_mem);
// free up the mem block containing this speech sample
- if (sequence_text_list[line].speech_mem)
- free(sequence_text_list[line].speech_mem);
+ if (_sequenceTextList[line].speech_mem)
+ free(_sequenceTextList[line].speech_mem);
}
// IMPORTANT! Reset the line count ready for the next sequence!
- sequenceTextLines = 0;
+ _sequenceTextLines = 0;
}
int32 Logic::fnSmackerLeadIn(int32 *params) {
@@ -686,7 +659,7 @@ int32 Logic::fnSmackerLeadOut(int32 *params) {
// params: 0 id of lead-out music
// ready for use in fnPlaySequence
- smackerLeadOut = params[0];
+ _smackerLeadOut = params[0];
// continue script
return IR_CONT;
@@ -727,16 +700,16 @@ int32 Logic::fnPlaySequence(int32 *params) {
// now create the text sprites, if any
- if (sequenceTextLines)
- CreateSequenceSpeech(sequenceSpeechArray);
+ if (_sequenceTextLines)
+ createSequenceSpeech(sequenceSpeechArray);
// open the lead-out music resource, if there is one
- if (smackerLeadOut) {
- leadOut = res_man.open(smackerLeadOut);
+ if (_smackerLeadOut) {
+ leadOut = res_man.open(_smackerLeadOut);
#ifdef _SWORD2_DEBUG
- header = (_standardHeader *)leadOut;
+ header = (_standardHeader *) leadOut;
if (header->fileType != WAV_FILE)
error("fnSmackerLeadOut() given invalid resource");
#endif
@@ -754,7 +727,7 @@ int32 Logic::fnPlaySequence(int32 *params) {
MoviePlayer player;
- if (sequenceTextLines && !(g_sword2->_features & GF_DEMO))
+ if (_sequenceTextLines && !(g_sword2->_features & GF_DEMO))
rv = player.play(filename, sequenceSpeechArray, leadOut);
else
rv = player.play(filename, NULL, leadOut);
@@ -764,9 +737,9 @@ int32 Logic::fnPlaySequence(int32 *params) {
// close the lead-out music resource
- if (smackerLeadOut) {
- res_man.close(smackerLeadOut);
- smackerLeadOut = 0;
+ if (_smackerLeadOut) {
+ res_man.close(_smackerLeadOut);
+ _smackerLeadOut = 0;
}
// check the error return-value
@@ -775,8 +748,8 @@ int32 Logic::fnPlaySequence(int32 *params) {
// now clear the text sprites, if any
- if (sequenceTextLines)
- ClearSequenceSpeech(sequenceSpeechArray);
+ if (_sequenceTextLines)
+ clearSequenceSpeech(sequenceSpeechArray);
// now clear the screen in case the Sequence was quitted (using ESC)
// rather than fading down to black
diff --git a/sword2/build_display.cpp b/sword2/build_display.cpp
index b4e9968858..0eedd87d62 100644
--- a/sword2/build_display.cpp
+++ b/sword2/build_display.cpp
@@ -38,85 +38,17 @@
namespace Sword2 {
-// ---------------------------------------------------------------------------
-
-buildit bgp0_list[MAX_bgp0_sprites];
-buildit bgp1_list[MAX_bgp1_sprites];
-buildit back_list[MAX_back_sprites];
-buildit sort_list[MAX_sort_sprites];
-buildit fore_list[MAX_fore_sprites];
-buildit fgp0_list[MAX_fgp0_sprites];
-buildit fgp1_list[MAX_fgp1_sprites];
-
-// holds the order of the sort list
-// i.e the list stays static and we sort this
-
-uint16 sort_order[MAX_sort_sprites];
-
-uint32 cur_bgp0;
-uint32 cur_bgp1;
-uint32 cur_back;
-uint32 cur_sort;
-uint32 cur_fore;
-uint32 cur_fgp0;
-uint32 cur_fgp1;
-
-uint32 largest_layer_area = 0; // should be reset to zero at start of each screen change
-uint32 largest_sprite_area = 0; // - " -
-char largest_layer_info[128] = { "largest layer: none registered" };
-char largest_sprite_info[128] = { "largest sprite: none registered" };
-
-// ---------------------------------------------------------------------------
-// last palette used - so that we can restore the correct one after a pause
-// (which dims the screen) and it's not always the main screen palette that we
-// want, eg. during the eclipse
-
-// This flag gets set in Start_new_palette() and SetFullPalette()
-
-uint32 lastPaletteRes = 0;
-
-// ---------------------------------------------------------------------------
-// 'frames per second' counting stuff
-
-uint32 fps = 0;
-uint32 cycleTime = 0;
-uint32 frameCount = 0;
-// So I know if the control Panel can be activated - CJR 1-5-97
-extern uint32 mouse_status;
-
-// ---------------------------------------------------------------------------
-// function prototypes not needed externally
-
-void Start_new_palette(void);
-
-void Register_frame(int32 *params, buildit *build_unit);
-void Process_layer(uint32 layer_number);
-void Sort_the_sort_list(void);
-
-void Send_back_par0_frames(void);
-void Send_back_par1_frames(void);
-void Send_back_frames(void);
-void Send_sort_frames(void);
-void Send_fore_frames(void);
-void Send_fore_par0_frames(void);
-void Send_fore_par1_frames(void);
-
-// ---------------------------------------------------------------------------
-//
-// PC Build_display
-//
-// ---------------------------------------------------------------------------
-
-void Build_display(void) {
+void Sword2Engine::buildDisplay(void) {
uint8 *file;
_multiScreenHeader *screenLayerTable;
if (this_screen.new_palette) {
// start the layer palette fading up
- Start_new_palette();
+ startNewPalette();
- largest_layer_area = 0; // should be reset to zero at start of each screen change
- largest_sprite_area = 0; // - " -
+ // should be reset to zero at start of each screen change
+ _largestLayerArea = 0;
+ _largestSpriteArea = 0;
}
// there is a valid screen to run
@@ -148,7 +80,7 @@ void Build_display(void) {
// release the screen resource before cacheing
// the sprites
res_man.close(this_screen.background_layer_id);
- Send_back_par0_frames();
+ sendBackPar0Frames();
} else {
// release the screen resource
res_man.close(this_screen.background_layer_id);
@@ -165,7 +97,7 @@ void Build_display(void) {
// release the screen resource before cacheing
// the sprites
res_man.close(this_screen.background_layer_id);
- Send_back_par1_frames();
+ sendBackPar1Frames();
} else {
// release the screen resource
res_man.close(this_screen.background_layer_id);
@@ -181,10 +113,10 @@ void Build_display(void) {
// sprites & layers
- Send_back_frames(); // background sprites
- Sort_the_sort_list();
- Send_sort_frames(); // sorted sprites & layers
- Send_fore_frames(); // foreground sprites
+ sendBackFrames(); // background sprites
+ sortTheSortList();
+ sendSortFrames(); // sorted sprites & layers
+ sendForeFrames(); // foreground sprites
// first foreground parallax + related anims
@@ -197,7 +129,7 @@ void Build_display(void) {
// release the screen resource before cacheing
// the sprites
res_man.close(this_screen.background_layer_id);
- Send_fore_par0_frames();
+ sendForePar0Frames();
} else {
// release the screen resource
res_man.close(this_screen.background_layer_id);
@@ -214,7 +146,7 @@ void Build_display(void) {
// release the screen resource before cacheing
// the sprites
res_man.close(this_screen.background_layer_id);
- Send_fore_par1_frames();
+ sendForePar1Frames();
} else {
// release the screen resource
res_man.close(this_screen.background_layer_id);
@@ -240,12 +172,12 @@ void Build_display(void) {
// update our fps reading
- frameCount++;
- if (SVM_timeGetTime() > cycleTime) {
- fps = frameCount;
- debug(2, "FPS: %d", fps);
- frameCount = 0;
- cycleTime = SVM_timeGetTime() + 1000;
+ _frameCount++;
+ if (SVM_timeGetTime() > _cycleTime) {
+ _fps = _frameCount;
+ debug(2, "FPS: %d", _fps);
+ _frameCount = 0;
+ _cycleTime = SVM_timeGetTime() + 1000;
}
// Check if we've got time to render the screen again
@@ -261,12 +193,11 @@ void Build_display(void) {
}
}
-// ---------------------------------------------------------------------------
//
// Fades down and displays a message on the screen for time seconds
//
-void DisplayMsg(uint8 *text, int time) {
+void Sword2Engine::displayMsg(uint8 *text, int time) {
mem *text_spr;
_frameHeader *frame;
_spriteInfo spriteInfo;
@@ -336,16 +267,13 @@ void DisplayMsg(uint8 *text, int time) {
g_display->setPalette(0, 256, (uint8 *) oldPal, RDPAL_FADE);
}
-// ---------------------------------------------------------------------------
//
// Fades message down and removes it, fading up again afterwards
//
-void RemoveMsg(void) {
+void Sword2Engine::removeMsg(void) {
g_display->fadeDown();
-
g_display->waitForFade();
-
g_display->clearScene();
// g_display->fadeUp();
@@ -355,71 +283,71 @@ void RemoveMsg(void) {
// this routine to clean up!
}
-void Send_back_par0_frames(void) {
+void Sword2Engine::sendBackPar0Frames(void) {
// could be none at all - theoretically at least
- for (uint i = 0; i < cur_bgp0; i++) {
+ for (uint i = 0; i < _curBgp0; i++) {
// frame attached to 1st background parallax
- Process_image(&bgp0_list[i]);
+ processImage(&_bgp0List[i]);
}
}
-void Send_back_par1_frames(void) {
+void Sword2Engine::sendBackPar1Frames(void) {
// could be none at all - theoretically at least
- for (uint i = 0; i < cur_bgp1; i++) {
+ for (uint i = 0; i < _curBgp1; i++) {
// frame attached to 2nd background parallax
- Process_image(&bgp1_list[i]);
+ processImage(&_bgp1List[i]);
}
}
-void Send_back_frames(void) {
+void Sword2Engine::sendBackFrames(void) {
// could be none at all - theoretically at least
- for (uint i = 0; i < cur_back; i++) {
- Process_image(&back_list[i]);
+ for (uint i = 0; i < _curBack; i++) {
+ processImage(&_backList[i]);
}
}
-void Send_sort_frames(void) {
+void Sword2Engine::sendSortFrames(void) {
// send the sort frames for printing - layers, shrinkers & normal flat
// sprites
// could be none at all - theoretically at least
- for (uint i = 0; i < cur_sort; i++) {
- if (sort_list[sort_order[i]].layer_number) {
+ for (uint i = 0; i < _curSort; i++) {
+ if (_sortList[_sortOrder[i]].layer_number) {
// its a layer - minus 1 for true layer number
// we need to know from the buildit because the layers
// will have been sorted in random order
- Process_layer(sort_list[sort_order[i]].layer_number - 1);
+ processLayer(_sortList[_sortOrder[i]].layer_number - 1);
} else {
// sprite
- Process_image(&sort_list[sort_order[i]]);
+ processImage(&_sortList[_sortOrder[i]]);
}
}
}
-void Send_fore_frames(void) {
+void Sword2Engine::sendForeFrames(void) {
// could be none at all - theoretically at least
- for (uint i = 0; i < cur_fore; i++) {
- Process_image(&fore_list[i]);
+ for (uint i = 0; i < _curFore; i++) {
+ processImage(&_foreList[i]);
}
}
-void Send_fore_par0_frames(void) {
+void Sword2Engine::sendForePar0Frames(void) {
// could be none at all - theoretically at least
- for (uint i = 0; i < cur_fgp0; i++) {
+ for (uint i = 0; i < _curFgp0; i++) {
// frame attached to 1st foreground parallax
- Process_image(&fgp0_list[i]);
+ processImage(&_fgp0List[i]);
}
}
-void Send_fore_par1_frames(void) {
+void Sword2Engine::sendForePar1Frames(void) {
// could be none at all - theoretically at least
- for (uint i = 0; i < cur_fgp1; i++) {
+ for (uint i = 0; i < _curFgp1; i++) {
// frame attached to 2nd foreground parallax
- Process_image(&fgp1_list[i]);
+ processImage(&_fgp1List[i]);
}
}
-void Process_layer(uint32 layer_number) {
+void Sword2Engine::processLayer(uint32 layer_number) {
uint8 *file;
_layerHeader *layer_head;
_spriteInfo spriteInfo;
@@ -445,22 +373,18 @@ void Process_layer(uint32 layer_number) {
spriteInfo.data = file + sizeof(_standardHeader) + layer_head->offset;
spriteInfo.colourTable = 0;
-
- //------------------------------------------
// check for largest layer for debug info
current_layer_area = layer_head->width * layer_head->height;
- if (current_layer_area > largest_layer_area) {
- largest_layer_area = current_layer_area;
- sprintf(largest_layer_info,
+ if (current_layer_area > _largestLayerArea) {
+ _largestLayerArea = current_layer_area;
+ sprintf(_largestLayerInfo,
"largest layer: %s layer(%d) is %dx%d",
FetchObjectName(this_screen.background_layer_id),
layer_number, layer_head->width, layer_head->height);
}
- //------------------------------------------
-
rv = g_display->drawSprite(&spriteInfo);
if (rv)
error("Driver Error %.8x in Process_layer(%d)", rv, layer_number);
@@ -468,7 +392,7 @@ void Process_layer(uint32 layer_number) {
res_man.close(this_screen.background_layer_id);
}
-void Process_image(buildit *build_unit) {
+void Sword2Engine::processImage(buildit *build_unit) {
uint8 *file, *colTablePtr = NULL;
_animHeader *anim_head;
_frameHeader *frame_head;
@@ -529,7 +453,7 @@ void Process_image(buildit *build_unit) {
// if we want this frame to be affected by the shading mask,
// add the status bit
- if (build_unit->shadingFlag == 1)
+ if (build_unit->shadingFlag)
spriteType |= RDSPR_SHADOW;
spriteInfo.x = build_unit->x;
@@ -545,14 +469,13 @@ void Process_image(buildit *build_unit) {
spriteInfo.data = (uint8 *) (frame_head + 1);
spriteInfo.colourTable = colTablePtr;
- //------------------------------------------
// check for largest layer for debug info
current_sprite_area = frame_head->width * frame_head->height;
- if (current_sprite_area > largest_sprite_area) {
- largest_sprite_area = current_sprite_area;
- sprintf(largest_sprite_info,
+ if (current_sprite_area > _largestSpriteArea) {
+ _largestSpriteArea = current_sprite_area;
+ sprintf(_largestSpriteInfo,
"largest sprite: %s frame(%d) is %dx%d",
FetchObjectName(build_unit->anim_resource),
build_unit->anim_pc,
@@ -560,7 +483,6 @@ void Process_image(buildit *build_unit) {
frame_head->height);
}
-#ifdef _SWORD2_DEBUG
if (SYSTEM_TESTING_ANIMS) { // see anims.cpp
// bring the anim into the visible screen
// but leave extra pixel at edge for box
@@ -582,7 +504,6 @@ void Process_image(buildit *build_unit) {
rect_x2 = spriteInfo.x + spriteInfo.scaledWidth;
rect_y2 = spriteInfo.y + spriteInfo.scaledHeight;
}
-#endif
// #ifdef _SWORD2_DEBUG
// if (frame_head->width <= 1) {
@@ -592,7 +513,7 @@ void Process_image(buildit *build_unit) {
rv = g_display->drawSprite(&spriteInfo);
if (rv)
- error("Driver Error %.8x with sprite %s (%d) in Process_image",
+ error("Driver Error %.8x with sprite %s (%d) in processImage",
rv, FetchObjectName(build_unit->anim_resource),
build_unit->anim_resource);
@@ -600,45 +521,45 @@ void Process_image(buildit *build_unit) {
res_man.close(build_unit->anim_resource);
}
-void Reset_render_lists(void) {
+void Sword2Engine::resetRenderLists(void) {
// reset the sort lists - do this before a logic loop
// takes into account the fact that the start of the list is pre-built
// with the special sortable layers
- cur_bgp0 = 0;
- cur_bgp1 = 0;
- cur_back = 0;
+ _curBgp0 = 0;
+ _curBgp1 = 0;
+ _curBack = 0;
// beginning of sort list is setup with the special sort layers
- cur_sort = this_screen.number_of_layers;
- cur_fore = 0;
- cur_fgp0 = 0;
- cur_fgp1 = 0;
+ _curSort = this_screen.number_of_layers;
+ _curFore = 0;
+ _curFgp0 = 0;
+ _curFgp1 = 0;
- if (cur_sort) {
+ if (_curSort) {
// there are some layers - so rebuild the sort order
// positioning
- for (uint i = 0; i < cur_sort; i++)
- sort_order[i] = i; //rebuild the order list
+ for (uint i = 0; i < _curSort; i++)
+ _sortOrder[i] = i; //rebuild the order list
}
}
-void Sort_the_sort_list(void) {
- //sort the list
+void Sword2Engine::sortTheSortList(void) {
+ // sort the list
- //cannot bubble sort 0 or 1 items!
- if (cur_sort <= 1)
+ // cannot bubble sort 0 or 1 items!
+ if (_curSort <= 1)
return;
- for (uint i = 0; i < cur_sort - 1; i++) {
- for (uint j = 0; j < cur_sort - 1; j++) {
- if (sort_list[sort_order[j]].sort_y > sort_list[sort_order[j + 1]].sort_y) {
- SWAP(sort_order[j], sort_order[j + 1]);
+ for (uint i = 0; i < _curSort - 1; i++) {
+ for (uint j = 0; j < _curSort - 1; j++) {
+ if (_sortList[_sortOrder[j]].sort_y > _sortList[_sortOrder[j + 1]].sort_y) {
+ SWAP(_sortOrder[j], _sortOrder[j + 1]);
}
}
}
}
-void Register_frame(int32 *params, buildit *build_unit) {
+void Sword2Engine::registerFrame(int32 *params, buildit *build_unit) {
// params: 0 pointer to mouse structure or NULL for no write to mouse
// list (non-zero means write sprite-shape to mouse list)
// 1 pointer to graphic structure
@@ -653,15 +574,11 @@ void Register_frame(int32 *params, buildit *build_unit) {
_cdtEntry *cdt_entry;
int scale = 0;
- //-------------------------------------------
// open animation file & set up the necessary pointers
ob_graph = (Object_graphic *) params[1];
-#ifdef _SWORD2_DEBUG
- if (ob_graph->anim_resource == 0)
- error("ERROR: %s(%d) has no anim resource in Register_frame", FetchObjectName(ID), ID);
-#endif
+ assert(ob_graph->anim_resource);
file = res_man.open(ob_graph->anim_resource);
@@ -669,7 +586,6 @@ void Register_frame(int32 *params, buildit *build_unit) {
cdt_entry = FetchCdtEntry(file, ob_graph->anim_pc);
frame_head = FetchFrameHeader(file, ob_graph->anim_pc);
-#ifdef _SWORD2_DEBUG
// update player graphic details for on-screen debug info
if (ID == CUR_PLAYER_ID) {
playerGraphic.type = ob_graph->type;
@@ -678,25 +594,22 @@ void Register_frame(int32 *params, buildit *build_unit) {
playerGraphic.anim_pc = ob_graph->anim_pc + 1;
player_graphic_no_frames = anim_head->noAnimFrames;
}
-#endif
- //-------------------------------------------
// fill in the buildit structure for this frame
- //retrieve the resource
+ // retrieve the resource
build_unit->anim_resource = ob_graph->anim_resource;
- //retrieve the frame
+ // retrieve the frame
build_unit->anim_pc = ob_graph->anim_pc;
- //not a layer
+ // not a layer
build_unit->layer_number = 0;
// Affected by shading mask?
if (ob_graph->type & SHADED_SPRITE)
- build_unit->shadingFlag = 1;
+ build_unit->shadingFlag = true;
else
- build_unit->shadingFlag = 0;
+ build_unit->shadingFlag = false;
- //-------------------------------------------
// check if this frame has offsets ie. this is a scalable mega frame
if (cdt_entry->frameType & FRAME_OFFSET) {
@@ -746,10 +659,7 @@ void Register_frame(int32 *params, buildit *build_unit) {
// only if 'pointer' isn't NULL
if (ob_mouse->pointer) {
-#ifdef _SWORD2_DEBUG
- if (cur_mouse == TOTAL_mouse_list)
- error("ERROR: mouse_list full");
-#endif
+ assert(cur_mouse < TOTAL_mouse_list);
mouse_list[cur_mouse].x1 = build_unit->x;
mouse_list[cur_mouse].y1 = build_unit->y;
@@ -792,73 +702,49 @@ int32 Logic::fnRegisterFrame(int32 *params) {
// 1 pointer to graphic structure
// 2 pointer to mega structure or NULL if not a mega
+ return g_sword2->registerFrame(params);
+}
+
+int32 Sword2Engine::registerFrame(int32 *params) {
Object_graphic *ob_graph = (Object_graphic *) params[1];
// check low word for sprite type
switch (ob_graph->type & 0x0000ffff) {
case BGP0_SPRITE:
-#ifdef _SWORD2_DEBUG
- if (cur_bgp0 == MAX_bgp0_sprites)
- error("ERROR: bgp0_list full in fnRegisterFrame");
-#endif
-
- Register_frame(params, &bgp0_list[cur_bgp0]);
- cur_bgp0++;
+ assert(_curBgp0 < MAX_bgp0_sprites);
+ registerFrame(params, &_bgp0List[_curBgp0]);
+ _curBgp0++;
break;
case BGP1_SPRITE:
-#ifdef _SWORD2_DEBUG
- if (cur_bgp1 == MAX_bgp1_sprites)
- error("ERROR: bgp1_list full in fnRegisterFrame");
-#endif
-
- Register_frame(params, &bgp1_list[cur_bgp1]);
- cur_bgp1++;
+ assert(_curBgp1 < MAX_bgp1_sprites);
+ registerFrame(params, &_bgp1List[_curBgp1]);
+ _curBgp1++;
break;
case BACK_SPRITE:
-#ifdef _SWORD2_DEBUG
- if (cur_back == MAX_back_sprites)
- error("ERROR: back_list full in fnRegisterFrame");
-#endif
-
- Register_frame(params, &back_list[cur_back]);
- cur_back++;
+ assert(_curBack < MAX_back_sprites);
+ registerFrame(params, &_backList[_curBack]);
+ _curBack++;
break;
case SORT_SPRITE:
-#ifdef _SWORD2_DEBUG
- if (cur_sort == MAX_sort_sprites)
- error("ERROR: sort_list full in fnRegisterFrame");
-#endif
-
- sort_order[cur_sort] = cur_sort;
- Register_frame(params, &sort_list[cur_sort]);
- cur_sort++;
+ assert(_curSort < MAX_sort_sprites);
+ _sortOrder[_curSort] = _curSort;
+ registerFrame(params, &_sortList[_curSort]);
+ _curSort++;
break;
case FORE_SPRITE:
-#ifdef _SWORD2_DEBUG
- if (cur_fore == MAX_fore_sprites)
- error("ERROR: fore_list full in fnRegisterFrame");
-#endif
-
- Register_frame(params, &fore_list[cur_fore]);
- cur_fore++;
+ assert(_curFore < MAX_fore_sprites);
+ registerFrame(params, &_foreList[_curFore]);
+ _curFore++;
break;
case FGP0_SPRITE:
-#ifdef _SWORD2_DEBUG
- if (cur_fgp0 == MAX_fgp0_sprites)
- error("ERROR: fgp0_list full in fnRegisterFrame");
-#endif
-
- Register_frame(params, &fgp0_list[cur_fgp0]);
- cur_fgp0++;
+ assert(_curFgp0 < MAX_fgp0_sprites);
+ registerFrame(params, &_fgp0List[_curFgp0]);
+ _curFgp0++;
break;
case FGP1_SPRITE:
-#ifdef _SWORD2_DEBUG
- if (cur_fgp1 == MAX_fgp1_sprites)
- error("ERROR: fgp1_list full in fnRegisterFrame");
-#endif
-
- Register_frame(params, &fgp1_list[cur_fgp1]);
- cur_fgp1++;
+ assert(_curFgp1 < MAX_fgp1_sprites);
+ registerFrame(params, &_fgp1List[_curFgp1]);
+ _curFgp1++;
break;
default:
// NO_SPRITE no registering!
@@ -868,8 +754,8 @@ int32 Logic::fnRegisterFrame(int32 *params) {
return IR_CONT;
}
-void Start_new_palette(void) {
- //start layer palette fading up
+void Sword2Engine::startNewPalette(void) {
+ // start layer palette fading up
uint8 *screenFile;
@@ -885,7 +771,7 @@ void Start_new_palette(void) {
g_display->setPalette(0, 256, FetchPalette(screenFile), RDPAL_FADE);
// indicating that it's a screen palette
- lastPaletteRes = 0;
+ _lastPaletteRes = 0;
// close screen file
res_man.close(this_screen.background_layer_id);
@@ -942,35 +828,18 @@ int32 Logic::fnFadeUp(int32 *params) {
return IR_CONT;
}
-// ---------------------------------------------------------------------------
-// typedef struct {
-// uint8 red;
-// uint8 green;
-// uint8 blue;
-// uint8 alpha;
-// } _palEntry;
-
-// ---------------------------------------------------------------------------
-// typedef struct {
-// // first colour number in this palette (0..255)
-// uint8 firstEntry;
-// // number of Entries-1 (0..255) to be taken as (1..256)
-// uint8 noEntries;
-// } _paletteHeader;
-
int32 Logic::fnSetPalette(int32 *params) {
// params: 0 resource number of palette file, or 0 if it's to be
// the palette from the current screen
-
- SetFullPalette(params[0]);
+
+ g_sword2->setFullPalette(params[0]);
return IR_CONT;
}
-void SetFullPalette(int32 palRes) {
+void Sword2Engine::setFullPalette(int32 palRes) {
uint8 *file;
_standardHeader *head;
- //----------------------------------
// fudge for hut interior
// - unpausing should restore last palette as normal (could be screen
// palette or 'dark_palette_13')
@@ -983,7 +852,7 @@ void SetFullPalette(int32 palRes) {
if (palRes == -1) {
// restore whatever palette was last set (screen
// palette or 'dark_palette_13')
- palRes = lastPaletteRes;
+ palRes = _lastPaletteRes;
}
} else {
// check if we're just restoring the current screen palette
@@ -996,20 +865,16 @@ void SetFullPalette(int32 palRes) {
palRes = 0;
}
- if (palRes == 0 && lastPaletteRes)
- palRes = lastPaletteRes;
+ if (palRes == 0 && _lastPaletteRes)
+ palRes = _lastPaletteRes;
}
- //----------------------------------
// non-zero: set palette to this separate palette file
if (palRes) {
// open the palette file
head = (_standardHeader *) res_man.open(palRes);
-#ifdef _SWORD2_DEBUG
- if (head->fileType != PALETTE_FILE)
- error("fnSetPalette() called with invalid resource!");
-#endif
+ assert(head->fileType == PALETTE_FILE);
file = (uint8 *) (head + 1);
@@ -1029,7 +894,7 @@ void SetFullPalette(int32 palRes) {
if (palRes != CONTROL_PANEL_PALETTE) { // (James 03sep97)
// indicating that it's a separate palette resource
- lastPaletteRes = palRes;
+ _lastPaletteRes = palRes;
}
// close palette file
@@ -1044,12 +909,12 @@ void SetFullPalette(int32 palRes) {
g_display->setPalette(0, 256, FetchPalette(file), RDPAL_INSTANT);
// indicating that it's a screen palette
- lastPaletteRes = 0;
+ _lastPaletteRes = 0;
// close screen file
res_man.close(this_screen.background_layer_id);
} else
- error("fnSetPalette(0) called, but no current screen available!");
+ error("setFullPalette(0) called, but no current screen available!");
}
}
@@ -1061,11 +926,9 @@ int32 Logic::fnRestoreGame(int32 *params) {
int32 Logic::fnChangeShadows(int32 *params) {
// params: none
- uint32 rv;
-
// if last screen was using a shading mask (see below)
if (this_screen.mask_flag) {
- rv = g_display->closeLightMask();
+ uint32 rv = g_display->closeLightMask();
if (rv)
error("Driver Error %.8x [%s line %u]", rv);
diff --git a/sword2/build_display.h b/sword2/build_display.h
index 1d534c2af7..3c3e221315 100644
--- a/sword2/build_display.h
+++ b/sword2/build_display.h
@@ -20,82 +20,15 @@
#ifndef _BUILD_DISPLAY
#define _BUILD_DISPLAY
-#include "sword2/driver/driver96.h"
+#define MAX_bgp0_sprites 6
+#define MAX_bgp1_sprites 6
+#define MAX_back_sprites 30
+#define MAX_sort_sprites 30
+#define MAX_fore_sprites 30
+#define MAX_fgp0_sprites 6
+#define MAX_fgp1_sprites 6
namespace Sword2 {
-
-// structure filled out by each object to register its graphic printing
-// requrements
-
-typedef struct {
- int16 x;
- int16 y;
- uint16 scaled_width;
- uint16 scaled_height;
- int16 sort_y;
- uint32 anim_resource;
- uint16 anim_pc;
-
- // denotes a scaling sprite at print time - and holds the scaling
- // value for the shrink routine
-
- uint16 scale;
-
- // non zero means this item is a layer - retrieve from background
- // layer and send to special renderer
-
- uint16 layer_number;
-
- // non zero means we want this frame to be affected by the shading mask
-
- uint8 shadingFlag;
-
- // if none zero the shrinker should write coordinates to this
- // mouse_list number
- // uint32 write_mouse_list;
-} buildit;
-
-// declared externally so that debug.cpp can display these in the info
-
-#define MAX_bgp0_sprites 6
-#define MAX_bgp1_sprites 6
-#define MAX_back_sprites 30
-#define MAX_sort_sprites 30
-#define MAX_fore_sprites 30
-#define MAX_fgp0_sprites 6
-#define MAX_fgp1_sprites 6
-
-// declared externally so that debug.cpp can display these in the info
-
-extern uint32 cur_bgp0;
-extern uint32 cur_bgp1;
-extern uint32 cur_back;
-extern uint32 cur_sort;
-extern uint32 cur_fore;
-extern uint32 cur_fgp0;
-extern uint32 cur_fgp1;
-
-extern char largest_layer_info[128];
-extern char largest_sprite_info[128];
-
-// the only build list needed externally - by layers.cpp - for adding layers
-// to sort list
-
-extern buildit sort_list[];
-
-// function prototypes needed externally
-
-void Reset_render_lists(void);
-void Build_display(void);
-void Process_image(buildit *build_unit);
-void DisplayMsg( uint8 *text, int time );
-void RemoveMsg(void);
-void SetFullPalette(int32 palRes);
-
-// needed by debug.cpp for displaying as part of top-screen info
-
-extern uint32 fps;
-
} // End of namespace Sword2
#endif
diff --git a/sword2/controls.cpp b/sword2/controls.cpp
index 0d080010b8..568792f74e 100644
--- a/sword2/controls.cpp
+++ b/sword2/controls.cpp
@@ -323,7 +323,7 @@ private:
public:
Dialog() : _numWidgets(0), _finish(false), _result(0) {
- SetFullPalette(CONTROL_PANEL_PALETTE);
+ g_sword2->setFullPalette(CONTROL_PANEL_PALETTE);
}
virtual ~Dialog() {
@@ -1293,7 +1293,7 @@ public:
// Reset the graphic 'buildit' list before a
// new logic list (see fnRegisterFrame)
- Reset_render_lists();
+ g_sword2->resetRenderLists();
// Reset the mouse hot-spot list (see
// fnRegisterMouse and fnRegisterFrame)
@@ -1310,7 +1310,7 @@ public:
void SaveLoadDialog::saveLoadError(char* text) {
// Print a message on screen. Second parameter is duration.
- DisplayMsg((uint8 *) text, 0);
+ g_sword2->displayMsg((uint8 *) text, 0);
// Wait for ESC or mouse click
while (1) {
@@ -1334,7 +1334,7 @@ void SaveLoadDialog::saveLoadError(char* text) {
}
// Remove the message.
- RemoveMsg();
+ g_sword2->removeMsg();
}
Gui::Gui() : _baseSlot(0) {
@@ -1469,7 +1469,7 @@ void Gui::restartControl(void) {
// reset the graphic 'buildit' list before a new logic list
// (see fnRegisterFrame)
- Reset_render_lists();
+ g_sword2->resetRenderLists();
// reset the mouse hot-spot list (see fnRegisterMouse and
// fnRegisterFrame)
diff --git a/sword2/debug.cpp b/sword2/debug.cpp
index a2d324f3cf..f1d6ef60db 100644
--- a/sword2/debug.cpp
+++ b/sword2/debug.cpp
@@ -21,7 +21,6 @@
#include "sword2/driver/driver96.h"
#include "sword2/sword2.h"
#include "sword2/debug.h"
-#include "sword2/build_display.h" // for 'fps'
#include "sword2/console.h"
#include "sword2/defs.h"
#include "sword2/events.h" // for CountEvents()
@@ -33,7 +32,7 @@
#include "sword2/resman.h"
#include "sword2/router.h" // for plotWalkGrid()
#include "sword2/speech.h" // for 'officialTextNumber' and
- // 'speechScriptWaiting'
+ // 'speechScriptWaiting'
namespace Sword2 {
@@ -263,7 +262,7 @@ void Build_debug_text(void) {
// frames-per-second counter
- sprintf(buf, "fps %d", fps);
+ sprintf(buf, "fps %d", g_sword2->_fps);
Make_debug_text_block(buf, 440, 0);
// location number
@@ -283,32 +282,32 @@ void Build_debug_text(void) {
// sprite list usage
- sprintf(buf, "bgp0: %d/%d", cur_bgp0, MAX_bgp0_sprites);
+ sprintf(buf, "bgp0: %d/%d", g_sword2->_curBgp0, MAX_bgp0_sprites);
Make_debug_text_block(buf, 560, 0);
- sprintf(buf, "bgp1: %d/%d", cur_bgp1, MAX_bgp1_sprites);
+ sprintf(buf, "bgp1: %d/%d", g_sword2->_curBgp1, MAX_bgp1_sprites);
Make_debug_text_block(buf, 560, 15);
- sprintf(buf, "back: %d/%d", cur_back, MAX_back_sprites);
+ sprintf(buf, "back: %d/%d", g_sword2->_curBack, MAX_back_sprites);
Make_debug_text_block(buf, 560, 30);
- sprintf(buf, "sort: %d/%d", cur_sort, MAX_sort_sprites);
+ sprintf(buf, "sort: %d/%d", g_sword2->_curSort, MAX_sort_sprites);
Make_debug_text_block(buf, 560, 45);
- sprintf(buf, "fore: %d/%d", cur_fore, MAX_fore_sprites);
+ sprintf(buf, "fore: %d/%d", g_sword2->_curFore, MAX_fore_sprites);
Make_debug_text_block(buf, 560, 60);
- sprintf(buf, "fgp0: %d/%d", cur_fgp0, MAX_fgp0_sprites);
+ sprintf(buf, "fgp0: %d/%d", g_sword2->_curFgp0, MAX_fgp0_sprites);
Make_debug_text_block(buf, 560, 75);
- sprintf(buf, "fgp1: %d/%d", cur_fgp1, MAX_fgp1_sprites);
+ sprintf(buf, "fgp1: %d/%d", g_sword2->_curFgp1, MAX_fgp1_sprites);
Make_debug_text_block(buf, 560, 90);
// largest layer & sprite
// NB. Strings already constructed in Build_display.cpp
- Make_debug_text_block(largest_layer_info, 0, 60);
- Make_debug_text_block(largest_sprite_info, 0, 75);
+ Make_debug_text_block(g_sword2->_largestLayerInfo, 0, 60);
+ Make_debug_text_block(g_sword2->_largestSpriteInfo, 0, 75);
// "waiting for person" indicator - set form fnTheyDo and
// fnTheyDoWeWait
diff --git a/sword2/function.cpp b/sword2/function.cpp
index 7c9dea03fd..cf22e81179 100644
--- a/sword2/function.cpp
+++ b/sword2/function.cpp
@@ -338,9 +338,9 @@ int32 Logic::fnDisplayMsg(int32 *params) {
// +2 to skip the encoded text number in the first 2 chars; 3 is
// duration in seconds
- DisplayMsg(FetchTextLine(res_man.open(text_res), local_text) + 2, 3);
+ g_sword2->displayMsg(FetchTextLine(res_man.open(text_res), local_text) + 2, 3);
res_man.close(text_res);
- RemoveMsg();
+ g_sword2->removeMsg();
return IR_CONT;
}
@@ -445,7 +445,7 @@ int32 Logic::fnPlayCredits(int32 *params) {
g_display->setPalette(0, 256, oldPal, RDPAL_FADE);
g_display->fadeUp();
g_display->updateDisplay();
- Build_display();
+ g_sword2->buildDisplay();
g_display->waitForFade();
g_sound->muteFx(false);
diff --git a/sword2/layers.cpp b/sword2/layers.cpp
index e263f71567..ece894cb59 100644
--- a/sword2/layers.cpp
+++ b/sword2/layers.cpp
@@ -49,6 +49,10 @@ int32 Logic::fnInitBackground(int32 *params) {
// params: 0 res id of normal background layer - cannot be 0
// 1 1 yes 0 no for a new palette
+ return g_sword2->initBackground(params[0], params[1]);
+}
+
+int32 Sword2Engine::initBackground(int32 res, int32 new_palette) {
_multiScreenHeader *screenLayerTable;
_screenHeader *screen_head;
_layerHeader *layer;
@@ -56,15 +60,15 @@ int32 Logic::fnInitBackground(int32 *params) {
uint8 *file;
uint32 rv;
- debug(5, "CHANGED TO LOCATION \"%s\"", FetchObjectName(*params));
+ debug(5, "CHANGED TO LOCATION \"%s\"", FetchObjectName(res));
// stop all fx & clears the queue
Clear_fx_queue();
#ifdef _SWORD2_DEBUG
- debug(5, "fnInitBackground(%d)", params[0]);
+ debug(5, "fnInitBackground(%d)", res);
- if (!params[0]) {
+ if (!res) {
error("ERROR: fnInitBackground cannot have 0 for background layer id!");
}
#endif
@@ -85,8 +89,8 @@ int32 Logic::fnInitBackground(int32 *params) {
if (this_screen.background_layer_id)
g_display->closeBackgroundLayer();
- this_screen.background_layer_id = params[0]; // set the res id
- this_screen.new_palette = params[1]; // yes or no - palette is taken from layer file
+ this_screen.background_layer_id = res;
+ this_screen.new_palette = new_palette;
// ok, now read the resource and pull out all the normal sort layer
// info/and set them up at the beginning of the sort list - why do it
@@ -116,9 +120,9 @@ int32 Logic::fnInitBackground(int32 *params) {
// need this for sorting - but leave the rest blank,
// we'll take from the header at print time
- sort_list[i].sort_y = layer->y + layer->height;
+ g_sword2->_sortList[i].sort_y = layer->y + layer->height;
// signifies a layer
- sort_list[i].layer_number = i + 1;
+ g_sword2->_sortList[i].layer_number = i + 1;
debug(5, "init layer %d", i);
}
diff --git a/sword2/logic.h b/sword2/logic.h
index 6edadf76d1..5d9e24f81c 100644
--- a/sword2/logic.h
+++ b/sword2/logic.h
@@ -22,8 +22,8 @@
#ifndef _LOGIC
#define _LOGIC
-// #include "sword2/defs.h"
#include "sword2/header.h"
+#include "sword2/driver/driver96.h"
namespace Sword2 {
@@ -32,6 +32,8 @@ namespace Sword2 {
// This must allow for the largest number of objects in a screen
#define OBJECT_KILL_LIST_SIZE 50
+#define MAX_SEQUENCE_TEXT_LINES 15
+
class Logic {
private:
// Point to the global variable data
@@ -69,8 +71,34 @@ private:
void setupOpcodes(void);
void processKillList(void);
+ // Stores resource id of the wav to use as lead-out from smacker
+ uint32 _smackerLeadOut;
+
+ int32 animate(int32 *params, bool reverse);
+ int32 megaTableAnimate(int32 *params, bool reverse);
+
+ // keeps count of number of text lines to disaply during the sequence
+ uint32 _sequenceTextLines;
+
+ // FOR TEXT LINES IN SEQUENCE PLAYER
+
+ struct _sequenceTextInfo {
+ uint32 textNumber;
+ uint16 startFrame;
+ uint16 endFrame;
+ mem *text_mem;
+ uint32 speechBufferSize;
+ uint16 *speech_mem;
+ };
+
+ _sequenceTextInfo _sequenceTextList[MAX_SEQUENCE_TEXT_LINES];
+
+ void createSequenceSpeech(_movieTextObject *sequenceText[]);
+ void clearSequenceSpeech(_movieTextObject *sequenceText[]);
+
public:
- Logic() : _globals(NULL), _kills(0), _debugFlag(false) {
+ Logic() : _globals(NULL), _kills(0), _debugFlag(false),
+ _smackerLeadOut(0), _sequenceTextLines(0) {
setupOpcodes();
}
@@ -197,7 +225,7 @@ public:
int32 fnRefreshInventory(int32 *params);
int32 fnChangeShadows(int32 *params);
- //do one cycle of the current session
+ // do one cycle of the current session
int processSession(void);
// cause the logic loop to terminate and drop out
diff --git a/sword2/mouse.cpp b/sword2/mouse.cpp
index 1aaba82a7e..c0d56bd1e1 100644
--- a/sword2/mouse.cpp
+++ b/sword2/mouse.cpp
@@ -282,7 +282,7 @@ void System_menu_mouse(void) {
// '0' means put back game screen
// palette; see Build_display.cpp
- SetFullPalette(0);
+ g_sword2->setFullPalette(0);
// stop the engine fading in the
// restored screens palette
diff --git a/sword2/resman.cpp b/sword2/resman.cpp
index f9aeabb8a8..80f37c84d8 100644
--- a/sword2/resman.cpp
+++ b/sword2/resman.cpp
@@ -1285,7 +1285,7 @@ void ResourceManager::getCd(int cd) {
g_logic.fnStopMusic(NULL);
textRes = res_man.open(2283);
- DisplayMsg(FetchTextLine(textRes, 5 + cd) + 2, 0);
+ g_sword2->displayMsg(FetchTextLine(textRes, 5 + cd) + 2, 0);
text_spr = fontRenderer.makeTextSprite(FetchTextLine(textRes, 5 + cd) + 2, 640, 187, g_sword2->_speechFontId);
frame = (_frameHeader*) text_spr->ad;
@@ -1338,7 +1338,7 @@ void ResourceManager::getCd(int cd) {
} while (!done);
memory.freeMemory(text_spr);
- RemoveMsg();
+ g_sword2->removeMsg();
}
} // End of namespace Sword2
diff --git a/sword2/sword2.cpp b/sword2/sword2.cpp
index ec3e4c9202..a4f817051c 100644
--- a/sword2/sword2.cpp
+++ b/sword2/sword2.cpp
@@ -140,6 +140,18 @@ Sword2Engine::Sword2Engine(GameDetector *detector, OSystem *syst)
_newgui = g_gui;
_debugger = new Debugger(this);
+
+ _lastPaletteRes = 0;
+
+ _largestLayerArea = 0;
+ _largestSpriteArea = 0;
+
+ strcpy(_largestLayerInfo, "largest layer: none registered");
+ strcpy(_largestSpriteInfo, "largest sprite: none registered");
+
+ _fps = 0;
+ _cycleTime = 0;
+ _frameCount = 0;
}
Sword2Engine::~Sword2Engine() {
@@ -247,7 +259,7 @@ int32 GameCycle(void) {
do {
// reset the graphic 'buildit' list before a new
// logic list (see fnRegisterFrame)
- Reset_render_lists();
+ g_sword2->resetRenderLists();
// reset the mouse hot-spot list (see fnRegisterMouse
// and fnRegisterFrame)
@@ -402,10 +414,10 @@ void Sword2Engine::go() {
// display once every 4 game-cycles
if (console_status || renderSkip == 0 || (gameCycle % 4) == 0)
- Build_display(); // create and flip the screen
+ g_sword2->buildDisplay(); // create and flip the screen
#else
// create and flip the screen
- Build_display();
+ g_sword2->buildDisplay();
#endif
}
@@ -529,7 +541,7 @@ void UnpauseGame(void) {
UnpauseAllSound();
// put back game screen palette; see Build_display.cpp
- SetFullPalette(0xffffffff);
+ g_sword2->setFullPalette(0xffffffff);
// If graphics level at max, turn up again
if (graphics_level_fudged) {
diff --git a/sword2/sword2.h b/sword2/sword2.h
index 03dd6aaf8f..cb71de2772 100644
--- a/sword2/sword2.h
+++ b/sword2/sword2.h
@@ -25,6 +25,7 @@
#include "common/map.h"
#include "common/rect.h"
#include "common/str.h"
+#include "sword2/build_display.h"
#include "sword2/console.h"
#include "sword2/driver/d_sound.h"
#include "sword2/driver/d_draw.h"
@@ -63,6 +64,68 @@ private:
uint32 _bootParam;
int32 _saveSlot;
+ // structure filled out by each object to register its graphic printing
+ // requrements
+
+ struct buildit {
+ int16 x;
+ int16 y;
+ uint16 scaled_width;
+ uint16 scaled_height;
+ int16 sort_y;
+ uint32 anim_resource;
+ uint16 anim_pc;
+
+ // Denotes a scaling sprite at print time - and holds the
+ // scaling value for the shrink routine
+
+ uint16 scale;
+
+ // Non-zero means this item is a layer - retrieve from
+ // background layer and send to special renderer
+
+ uint16 layer_number;
+
+ // True means we want this frame to be affected by the shading
+ // mask
+
+ bool shadingFlag;
+ };
+
+ buildit _bgp0List[MAX_bgp0_sprites];
+ buildit _bgp1List[MAX_bgp1_sprites];
+ buildit _backList[MAX_back_sprites];
+ buildit _sortList[MAX_sort_sprites];
+ buildit _foreList[MAX_fore_sprites];
+ buildit _fgp0List[MAX_fgp0_sprites];
+ buildit _fgp1List[MAX_fgp1_sprites];
+
+ // Holds the order of the sort list, i.e. the list stays static and we
+ // sort this array.
+
+ uint16 _sortOrder[MAX_sort_sprites];
+
+ // Last palette used - so that we can restore the correct one after a
+ // pause (which dims the screen) and it's not always the main screen
+ // palette that we want, eg. during the eclipse
+
+ // This flag gets set in startNewPalette() and setFullPalette()
+
+ uint32 _lastPaletteRes;
+
+ void sendBackPar0Frames(void);
+ void sendBackPar1Frames(void);
+ void sendBackFrames(void);
+ void sendSortFrames(void);
+ void sendForeFrames(void);
+ void sendForePar0Frames(void);
+ void sendForePar1Frames(void);
+
+ void sortTheSortList(void);
+
+ void startNewPalette(void);
+ void processLayer(uint32 layer_number);
+
public:
Sword2Engine(GameDetector *detector, OSystem *syst);
~Sword2Engine();
@@ -86,6 +149,43 @@ public:
uint32 _controlsFontId;
uint32 _redFontId;
+ void resetRenderLists(void);
+ void buildDisplay(void);
+ void processImage(buildit *build_unit);
+ void displayMsg(uint8 *text, int time);
+ void removeMsg(void);
+ void setFullPalette(int32 palRes);
+
+ int32 registerFrame(int32 *params);
+ void registerFrame(int32 *params, buildit *build_unit);
+
+ // The debugger wants to access these
+
+ uint32 _curBgp0;
+ uint32 _curBgp1;
+ uint32 _curBack;
+ uint32 _curSort;
+ uint32 _curFore;
+ uint32 _curFgp0;
+ uint32 _curFgp1;
+
+ // So I know if the control panel can be activated
+ int32 _mouseStatus;
+
+ // Debugging stuff
+
+ uint32 _largestLayerArea;
+ uint32 _largestSpriteArea;
+ char _largestLayerInfo[128];
+ char _largestSpriteInfo[128];
+
+ // 'frames per second' counting stuff
+ uint32 _fps;
+ uint32 _cycleTime;
+ uint32 _frameCount;
+
+ int32 initBackground(int32 res, int32 new_palette);
+
void errorString(const char *buf_input, char *buf_output);
void initialiseFontResourceFlags(void);
void initialiseFontResourceFlags(uint8 language);