diff options
author | Torbjörn Andersson | 2003-09-19 06:41:41 +0000 |
---|---|---|
committer | Torbjörn Andersson | 2003-09-19 06:41:41 +0000 |
commit | 349a7bc39908f4bddd35c8f1605bdfb77f343404 (patch) | |
tree | fab6d71a1eb8ee9459af5459f3bd5d5f50512cf2 | |
parent | 1a6d75ef39f0d76b099ed33d95fb4944ccaa2740 (diff) | |
download | scummvm-rg350-349a7bc39908f4bddd35c8f1605bdfb77f343404.tar.gz scummvm-rg350-349a7bc39908f4bddd35c8f1605bdfb77f343404.tar.bz2 scummvm-rg350-349a7bc39908f4bddd35c8f1605bdfb77f343404.zip |
Cleanup. Apart from reformatting, I've also removed the #ifdef blocks to
skip or mute cutscenes. At the very least, we want to show the subtitles
like we do now.
svn-id: r10307
-rw-r--r-- | sword2/anims.cpp | 1012 | ||||
-rw-r--r-- | sword2/anims.h | 1 |
2 files changed, 481 insertions, 532 deletions
diff --git a/sword2/anims.cpp b/sword2/anims.cpp index 69ca312e21..4783f4d233 100644 --- a/sword2/anims.cpp +++ b/sword2/anims.cpp @@ -17,567 +17,548 @@ * $Header$ */ -//------------------------------------------------------------------------------------------------------------- +// --------------------------------------------------------------------------- // A more intelligent version of the old ANIMS.C // All this stuff by James // DON'T TOUCH! -//------------------------------------------------------------------------------------------------------------- +// --------------------------------------------------------------------------- -//#include <io.h> // for access() -#include <stdio.h> // for sprintf -#include <string.h> +#include <stdio.h> // for sprintf + +#ifdef _SWORD2_DEBUG +#include <string.h> // for strlen +#endif #include "stdafx.h" #include "common/scummsys.h" #include "driver/driver96.h" #include "anims.h" -#include "build_display.h" // for DisplayMsg() #include "console.h" -#include "controls.h" // for 'speechSelected' & 'subtitles' +#include "controls.h" // for 'speechSelected' & 'subtitles' #include "debug.h" #include "defs.h" #include "header.h" #include "interpreter.h" -#include "layers.h" // for 'this_screen' structure - for restoring palette in FN_play_sequence -#include "maketext.h" // for MakeTextSprite used by FN_play_sequence ultimately +#include "maketext.h" // for MakeTextSprite used by FN_play_sequence ultimately #include "object.h" #include "protocol.h" #include "resman.h" -#include "sword2.h" // for Close_game() +#include "sword2.h" #include "sync.h" #include "sound.h" // for Speech stuff. -//------------------------------------------------------------------------------------------------------------- -uint32 smackerLeadOut=0; // stores resource id of wav to use as lead-out from smacker - -//------------------------------------------------------------------------------------------------------------- -// local function prototypes +// stores resource id of wav to use as lead-out from smacker +uint32 smackerLeadOut = 0; int32 Animate(int32 *params, uint8 reverse_flag); int32 Mega_table_animate(int32 *params, uint8 reverse_flag); -//------------------------------------------------------------------------------------------------------------- -int32 FN_anim(int32 *params) -{ +int32 FN_anim(int32 *params) { // params: 0 pointer to object's logic structure - // 1 pointer to object's graphic structure - // 2 resource id of animation file + // 1 pointer to object's graphic structure + // 2 resource id of animation file - return Animate(params,0); // 0 means normal forward anim + // 0 means normal forward anim + return Animate(params, 0); } -//------------------------------------------------------------------------------------------------------------- -int32 FN_reverse_anim(int32 *params) -{ + +int32 FN_reverse_anim(int32 *params) { // params: 0 pointer to object's logic structure - // 1 pointer to object's graphic structure - // 2 resource id of animation file + // 1 pointer to object's graphic structure + // 2 resource id of animation file - return Animate(params,1); // 1 means reverse anim + // 1 means reverse anim + return Animate(params, 1); } -//------------------------------------------------------------------------------------------------------------- -int32 FN_mega_table_anim(int32 *params) -{ + +int32 FN_mega_table_anim(int32 *params) { // params: 0 pointer to object's logic structure - // 1 pointer to object's graphic structure - // 2 pointer to object's mega structure - // 3 pointer to animation table + // 1 pointer to object's graphic structure + // 2 pointer to object's mega structure + // 3 pointer to animation table - return Mega_table_animate(params,0); // 0 means normal forward anim + // 0 means normal forward anim + return Mega_table_animate(params, 0); } -//------------------------------------------------------------------------------------------------------------- -int32 FN_reverse_mega_table_anim(int32 *params) -{ + +int32 FN_reverse_mega_table_anim(int32 *params) { // params: 0 pointer to object's logic structure - // 1 pointer to object's graphic structure - // 2 pointer to object's mega structure - // 3 pointer to animation table + // 1 pointer to object's graphic structure + // 2 pointer to object's mega structure + // 3 pointer to animation table - return Mega_table_animate(params,1); // 1 means reverse anim + // 1 means reverse anim + return Mega_table_animate(params, 1); } -//------------------------------------------------------------------------------------------------------------- -int32 Animate(int32 *params, uint8 reverse_flag) -{ + +int32 Animate(int32 *params, uint8 reverse_flag) { // params: 0 pointer to object's logic structure - // 1 pointer to object's graphic structure - // 2 resource id of animation file + // 1 pointer to object's graphic structure + // 2 resource id of animation file - Object_logic *ob_logic; - Object_graphic *ob_graphic; - uint8 *anim_file; - _animHeader *anim_head; - int32 res = params[2]; + Object_logic *ob_logic; + Object_graphic *ob_graphic; + uint8 *anim_file; + _animHeader *anim_head; + int32 res = params[2]; - #ifdef _SWORD2_DEBUG - _standardHeader *head; // for animation testing & checking for correct file type - #endif +#ifdef _SWORD2_DEBUG + // for animation testing & checking for correct file type + _standardHeader *head; +#endif - //---------------------------------------------------------------------------------------- // read the main parameters - ob_logic = (Object_logic *) params[0]; // param 0 is pointer to normal structure - ob_graphic = (Object_graphic *) params[1]; // param 1 is pointer to graphic structure + ob_logic = (Object_logic *) params[0]; + ob_graphic = (Object_graphic *) params[1]; - //---------------------------------------------------------------------------------------- - // if this is the start of the anim, set up the first frame + if (ob_logic->looping == 0) { + // This is the start of the anim - set up the first frame - if (ob_logic->looping==0) - { - //----------------------------------------------------------- - #ifdef _SWORD2_DEBUG +#ifdef _SWORD2_DEBUG // For testing all anims! (James18apr97) - // A script loop can send every resource number to the anim function - // & it will only run the valid ones - // See 'testing_routines' object in George's Player Character section of linc - if (SYSTEM_TESTING_ANIMS) - { - if (res_man.Res_check_valid(res)) // if the resource number is within range & it's not a null resource - { - head = (_standardHeader*) res_man.Res_open(res); // open the resource - res_man.Res_close(res); // can close immediately - we've got a pointer to the header - - if (head->fileType!=ANIMATION_FILE) // if it's not an animation file - { - FN_no_sprite(params+1); // switch off the sprite - return(IR_STOP); // don't animate - just continue script next cycle + // A script loop can send every resource number to the anim + // function & it will only run the valid ones. See + // 'testing_routines' object in George's Player Character + // section of linc + + if (SYSTEM_TESTING_ANIMS) { + // if the resource number is within range & it's not + // a null resource + + if (res_man.Res_check_valid(res)) { + // Open the resource. Can close it immediately. + // We've got a pointer to the header. + head = (_standardHeader *) res_man.Res_open(res); + res_man.Res_close(res); + + // if it's not an animation file + if (head->fileType != ANIMATION_FILE) { + // switch off the sprite + // don't animate - just continue + // script next cycle + FN_no_sprite(params + 1); + return IR_STOP; } - } - else - { // not a valid resource number - FN_no_sprite(params+1); // switch off the sprite - return(IR_STOP); // don't animate - just continue script next cycle + } else { + // Not a valid resource number. Switch off + // the sprite. Don't animate - just continue + // script next cycle. + FN_no_sprite(params + 1); + return IR_STOP; } - FN_sort_sprite(params+1); // switch on the sprite + // switch on the sprite + FN_sort_sprite(params + 1); } - #endif - //----------------------------------------------------------- +#endif - //--------------------- - #ifdef _SWORD2_DEBUG +#ifdef _SWORD2_DEBUG // check that we haven't been passed a zero resource number - if (res==0) + if (res == 0) Con_fatal_error("Animate: %s (id %d) passed zero anim resource (%s line %u)", FetchObjectName(ID), ID, __FILE__, __LINE__); - #endif - //--------------------- +#endif - anim_file = res_man.Res_open(res); // open anim file + // open anim file + anim_file = res_man.Res_open(res); - //--------------------- - #ifdef _SWORD2_DEBUG +#ifdef _SWORD2_DEBUG // check this this resource is actually an animation file! - head = (_standardHeader*) anim_file; - if (head->fileType!=ANIMATION_FILE) // if it's not an animation file + head = (_standardHeader *) anim_file; + if (head->fileType != ANIMATION_FILE) Con_fatal_error("Animate: %s (%d) is not an anim! (%s line %u)", FetchObjectName(res), res, __FILE__, __LINE__); - #endif - //--------------------- +#endif - anim_head = FetchAnimHeader( anim_file ); // point to anim header + // point to anim header + anim_head = FetchAnimHeader(anim_file); - //--------------------- - /* - #ifdef _SWORD2_DEBUG +/* #ifdef _SWORD2_DEBUG // check there's at least one frame - if (anim_head->noAnimFrames==0) + if (anim_head->noAnimFrames == 0) Con_fatal_error("Animate: %s (%d) has zero frame count! (%s line %u)", FetchObjectName(res), res, __FILE__, __LINE__); - #endif - */ - //--------------------- - - ob_logic->looping = 1; // now running an anim, looping back to this 'FN' call again - ob_graphic->anim_resource = res; // param 2 is id of animation resource - - if (reverse_flag) // if a reverse anim - ob_graphic->anim_pc = anim_head->noAnimFrames-1; // start on last frame - else // forward anim - ob_graphic->anim_pc = 0; // start on first frame - } - //------------------------------------------------------------------------------------------------------- - // otherwise, if we've received a sync, return to script immediately - - else if (Get_sync()) // returns sync value if one has been sent to current 'id', otherwise 0 - { -// Zdebug("**sync stopped %d**", ID); - ob_logic->looping = 0; // if sync received, anim finishes right now (remaining on last frame) - return(IR_CONT); // quit anim but continue script - } - //------------------------------------------------------------------------------------------------------- - // otherwise (not first frame & not received a sync), set up the next frame of the anim - else - { - anim_file = res_man.Res_open(ob_graphic->anim_resource); // open anim file - anim_head = FetchAnimHeader( anim_file ); // point to anim header - - if (reverse_flag) // if a reverse anim - ob_graphic->anim_pc--; // decrement the anim frame number - else // normal forward anim - ob_graphic->anim_pc++; // increment the anim frame number +#endif */ + + // now running an anim, looping back to this 'FN' call again + ob_logic->looping = 1; + ob_graphic->anim_resource = res; + + if (reverse_flag) + ob_graphic->anim_pc = anim_head->noAnimFrames - 1; + else + ob_graphic->anim_pc = 0; + } else if (Get_sync()) { + // We've received a sync - return to script immediately + // Zdebug("**sync stopped %d**", ID); + + // If sync received, anim finishes right now (remaining on + // last frame). Quit animation, but continue script. + ob_logic->looping = 0; + return IR_CONT; + } else { + // Not first frame, and no sync received - set up the next + // frame of the anim. + + // open anim file and point to anim header + anim_file = res_man.Res_open(ob_graphic->anim_resource); + anim_head = FetchAnimHeader(anim_file); + + if (reverse_flag) + ob_graphic->anim_pc--; + else + ob_graphic->anim_pc++; } - //------------------------------------------------------------------------------------------------------- + // check for end of anim - if (reverse_flag) // if a reverse anim - { - if (ob_graphic->anim_pc == 0) // reached the first frame of the anim - ob_logic->looping = 0; // anim finishes on this frame - } - else // normal forward anim - { - if (ob_graphic->anim_pc == (int32)(anim_head->noAnimFrames-1)) // reached the last frame of the anim - ob_logic->looping = 0; // anim finishes on this frame + if (reverse_flag) { + if (ob_graphic->anim_pc == 0) + ob_logic->looping = 0; + } else { + if (ob_graphic->anim_pc == (int32) (anim_head->noAnimFrames - 1)) + ob_logic->looping = 0; } - //------------------------------------------------------------------------------------------------------- - // close the anim file - res_man.Res_close(ob_graphic->anim_resource); // close anim file + // close the anim file + res_man.Res_close(ob_graphic->anim_resource); - //------------------------------------------------------------------------------------------------------- // check if we want the script to loop back & call this function again - - if (ob_logic->looping) - return(IR_REPEAT); // drop out of script, but call this function again next cycle - else - return(IR_STOP); // drop out of script - - //------------------------------------------------------------------------------------------------------- + return ob_logic->looping ? IR_REPEAT : IR_STOP; } -//------------------------------------------------------------------------------------------------------------- -int32 Mega_table_animate(int32 *params, uint8 reverse_flag) -{ + +int32 Mega_table_animate(int32 *params, uint8 reverse_flag) { // params: 0 pointer to object's logic structure - // 1 pointer to object's graphic structure - // 2 pointer to object's mega structure - // 3 pointer to animation table + // 1 pointer to object's graphic structure + // 2 pointer to object's mega structure + // 3 pointer to animation table - Object_logic *ob_logic; - Object_mega *ob_mega; - uint32 *anim_table; - int32 pars[5]; + Object_logic *ob_logic; + Object_mega *ob_mega; + uint32 *anim_table; + int32 pars[5]; - //---------------------------------------------------------------------------------------- - // if this is the start of the anim, read the anim table to get the appropriate anim resource + // if this is the start of the anim, read the anim table to get the + // appropriate anim resource - ob_logic = (Object_logic *) params[0]; // param 0 is pointer to logic structure + ob_logic = (Object_logic *) params[0]; - if (ob_logic->looping==0) - { - ob_mega = (Object_mega *) params[2]; // param 2 is pointer to mega structure + if (ob_logic->looping == 0) { + ob_mega = (Object_mega *) params[2]; + anim_table = (uint32 *) params[3]; - anim_table = (uint32*)params[3]; - pars[2] = anim_table[ob_mega->current_dir]; // appropriate anim resource is in 'table[direction]' + // appropriate anim resource is in 'table[direction]' + pars[2] = anim_table[ob_mega->current_dir]; } - //------------------------------------------------------------------------------------------------------- // set up the rest of the parameters for FN_anim() pars[0] = params[0]; pars[1] = params[1]; - // pars[2] only needed setting at the start of the anim - //------------------------------------------------------------------------------------------------------- + // pars[2] only needed setting at the start of the anim - return Animate(pars, reverse_flag); // call Animate() with these params + // call Animate() with these params + return Animate(pars, reverse_flag); } -//------------------------------------------------------------------------------------------------------------- -int32 FN_set_frame(int32 *params) -{ + +int32 FN_set_frame(int32 *params) { // params: 0 pointer to object's graphic structure - // 1 resource id of animation file - // 2 frame flag (0=first 1=last) + // 1 resource id of animation file + // 2 frame flag (0=first 1=last) - Object_graphic *ob_graphic; - uint8 *anim_file; - _animHeader *anim_head; - int32 res = params[1]; + Object_graphic *ob_graphic; + uint8 *anim_file; + _animHeader *anim_head; + int32 res = params[1]; - #ifdef _SWORD2_DEBUG - _standardHeader *head; // for checking for correct file type - #endif +#ifdef _SWORD2_DEBUG + // for checking for correct file type + _standardHeader *head; +#endif - //--------------------- - #ifdef _SWORD2_DEBUG +#ifdef _SWORD2_DEBUG // check that we haven't been passed a zero resource number - if (res==0) + if (res == 0) Con_fatal_error("FN_set_frame: %s (id %d) passed zero anim resource (%s line %u)", FetchObjectName(ID), ID, __FILE__, __LINE__); - #endif - //--------------------- +#endif - //---------------------------------------------------------------------------------------- // open the resource (& check it's valid) - anim_file = res_man.Res_open(res); // open anim file + anim_file = res_man.Res_open(res); - //--------------------- - #ifdef _SWORD2_DEBUG +#ifdef _SWORD2_DEBUG // check this this resource is actually an animation file! - head = (_standardHeader*) anim_file; - if (head->fileType!=ANIMATION_FILE) // if it's not an animation file + head = (_standardHeader *) anim_file; + if (head->fileType != ANIMATION_FILE) Con_fatal_error("FN_set_frame: %s (%d) is not an anim! (%s line %u)", FetchObjectName(res), res, __FILE__, __LINE__); - #endif - //--------------------- +#endif - anim_head = FetchAnimHeader( anim_file ); // set up pointer to the animation header + // set up pointer to the animation header + anim_head = FetchAnimHeader(anim_file); - //--------------------- - /* - #ifdef _SWORD2_DEBUG +/* #ifdef _SWORD2_DEBUG // check there's at least one frame - if (anim_head->noAnimFrames==0) + if (anim_head->noAnimFrames == 0) Con_fatal_error("FN_set_frame: %s (%d) has zero frame count! (%s line %u)", FetchObjectName(res), res, __FILE__, __LINE__); - #endif - */ - //--------------------- +#endif */ - //---------------------------------------------------------------------------------------- // set up anim resource in graphic object - ob_graphic = (Object_graphic *) params[0]; // param 0 is pointer to the object's graphic structure - - ob_graphic->anim_resource = res; // param 2 is id of animation resource - - //---------------------------------------------------------------------------------------- - - if (params[2]) // frame flag is non-zero - ob_graphic->anim_pc = anim_head->noAnimFrames-1; // last frame - else // frame flag is 0 - ob_graphic->anim_pc = 0; // first frame + ob_graphic = (Object_graphic *) params[0]; + ob_graphic->anim_resource = res; - //------------------------------------------------------------------------------------------------------- - // close the anim file - - res_man.Res_close(ob_graphic->anim_resource); // close anim file + if (params[2]) + ob_graphic->anim_pc = anim_head->noAnimFrames - 1; + else + ob_graphic->anim_pc = 0; - //------------------------------------------------------------------------------------------------------- + // Close the anim file and drop out of script - return(IR_CONT); // drop out of script + res_man.Res_close(ob_graphic->anim_resource); + return IR_CONT; } -//--------------------------------------------------------------------------------------------------------------------- -int32 FN_no_sprite(int32 *params) -{ +int32 FN_no_sprite(int32 *params) { // params 0 pointer to object's graphic structure Object_graphic *ob_graphic = (Object_graphic *) params[0]; - ob_graphic->type &= 0xffff0000; // remove previous status (but don't affect the shading upper-word) + // remove previous status (but don't affect the shading upper-word) + ob_graphic->type &= 0xffff0000; ob_graphic->type |= NO_SPRITE; - return(IR_CONT); // continue script + // continue script + return IR_CONT; } -//--------------------------------------------------------------------------------------------------------------------- -int32 FN_back_par0_sprite(int32 *params) -{ + +int32 FN_back_par0_sprite(int32 *params) { // params 0 pointer to object's graphic structure Object_graphic *ob_graphic = (Object_graphic *) params[0]; - ob_graphic->type &= 0xffff0000; // remove previous status (but don't affect the shading upper-word) + // remove previous status (but don't affect the shading upper-word) + ob_graphic->type &= 0xffff0000; ob_graphic->type |= BGP0_SPRITE; - return(IR_CONT); // continue script + // continue script + return IR_CONT; } -//--------------------------------------------------------------------------------------------------------------------- -int32 FN_back_par1_sprite(int32 *params) -{ + +int32 FN_back_par1_sprite(int32 *params) { // params 0 pointer to object's graphic structure Object_graphic *ob_graphic = (Object_graphic *) params[0]; - ob_graphic->type &= 0xffff0000; // remove previous status (but don't affect the shading upper-word) + // remove previous status (but don't affect the shading upper-word) + ob_graphic->type &= 0xffff0000; ob_graphic->type |= BGP1_SPRITE; - return(IR_CONT); // continue script + // continue script + return IR_CONT; } -//--------------------------------------------------------------------------------------------------------------------- -int32 FN_back_sprite(int32 *params) -{ + +int32 FN_back_sprite(int32 *params) { // params 0 pointer to object's graphic structure Object_graphic *ob_graphic = (Object_graphic *) params[0]; - ob_graphic->type &= 0xffff0000; // remove previous status (but don't affect the shading upper-word) + // remove previous status (but don't affect the shading upper-word) + ob_graphic->type &= 0xffff0000; ob_graphic->type |= BACK_SPRITE; - return(IR_CONT); // continue script + // continue script + return IR_CONT; } -//--------------------------------------------------------------------------------------------------------------------- -int32 FN_sort_sprite(int32 *params) -{ + +int32 FN_sort_sprite(int32 *params) { // params 0 pointer to object's graphic structure Object_graphic *ob_graphic = (Object_graphic *) params[0]; - ob_graphic->type &= 0xffff0000; // remove previous status (but don't affect the shading upper-word) + // remove previous status (but don't affect the shading upper-word) + ob_graphic->type &= 0xffff0000; ob_graphic->type |= SORT_SPRITE; - return(IR_CONT); // continue script + // continue script + return IR_CONT; } -//--------------------------------------------------------------------------------------------------------------------- -int32 FN_fore_sprite(int32 *params) -{ + +int32 FN_fore_sprite(int32 *params) { // params 0 pointer to object's graphic structure Object_graphic *ob_graphic = (Object_graphic *) params[0]; - ob_graphic->type &= 0xffff0000; // remove previous status (but don't affect the shading upper-word) + // remove previous status (but don't affect the shading upper-word) + ob_graphic->type &= 0xffff0000; ob_graphic->type |= FORE_SPRITE; - return(IR_CONT); // continue script + // continue script + return IR_CONT; } -//--------------------------------------------------------------------------------------------------------------------- -int32 FN_fore_par0_sprite(int32 *params) -{ + +int32 FN_fore_par0_sprite(int32 *params) { // params 0 pointer to object's graphic structure Object_graphic *ob_graphic = (Object_graphic *) params[0]; - ob_graphic->type &= 0xffff0000; // remove previous status (but don't affect the shading upper-word) + // remove previous status (but don't affect the shading upper-word) + ob_graphic->type &= 0xffff0000; ob_graphic->type |= FGP0_SPRITE; - return(IR_CONT); // continue script + // continue script + return IR_CONT; } -//--------------------------------------------------------------------------------------------------------------------- -int32 FN_fore_par1_sprite(int32 *params) -{ + +int32 FN_fore_par1_sprite(int32 *params) { // params 0 pointer to object's graphic structure Object_graphic *ob_graphic = (Object_graphic *) params[0]; - ob_graphic->type &= 0xffff0000; // remove previous status (but don't affect the shading upper-word) + // remove previous status (but don't affect the shading upper-word) + ob_graphic->type &= 0xffff0000; ob_graphic->type |= FGP1_SPRITE; - return(IR_CONT); // continue script + // continue script + return IR_CONT; } -//--------------------------------------------------------------------------------------------------------------------- -int32 FN_shaded_sprite(int32 *params) -{ + +int32 FN_shaded_sprite(int32 *params) { // params 0 pointer to object's graphic structure Object_graphic *ob_graphic = (Object_graphic *) params[0]; - ob_graphic->type &= 0x0000ffff; // remove previous status (but don't affect the shading upper-word) + // remove previous status (but don't affect the shading upper-word) + ob_graphic->type &= 0x0000ffff; ob_graphic->type |= SHADED_SPRITE; - // note that drivers may still shade mega frames automatically, even when not sent 'RDSPR_SHADOW' + // note that drivers may still shade mega frames automatically, even + // when not sent 'RDSPR_SHADOW' - return(IR_CONT); // continue script + // continue script + return IR_CONT; } -//--------------------------------------------------------------------------------------------------------------------- -int32 FN_unshaded_sprite(int32 *params) -{ + +int32 FN_unshaded_sprite(int32 *params) { // params 0 pointer to object's graphic structure Object_graphic *ob_graphic = (Object_graphic *) params[0]; - ob_graphic->type &= 0x0000ffff; // remove previous status (but don't affect the shading upper-word) + // remove previous status (but don't affect the shading upper-word) + ob_graphic->type &= 0x0000ffff; ob_graphic->type |= UNSHADED_SPRITE; - return(IR_CONT); // continue script + // continue script + return IR_CONT; } -//--------------------------------------------------------------------------------------------------------------------- + // Notes on PlaySmacker() // 1st param is filename of sequence file -// 2nd param is a pointer to a null-terminated array of pointers to _movieTextObject structures +// 2nd param is a pointer to a null-terminated array of pointers to +// _movieTextObject structures +// FIXME: At the moment, the subtitle sprites and voice-overs are pre-cached. +// The code would be much simpler if we simply stored the text/speech ids and +// decoded them while the movie is playing. On the other hand, it might slow +// down the video playback too much. We'll need to investigate... //int32 PlaySmacker(char *filename, _movieTextObject *textObjects[]); -// typedef struct -// { +// typedef struct { // uint16 startFrame; // uint16 endFrame; // _spriteInfo *textSprite; // _wavHeader *speech; // } _movieTextObject; -//--------------------------------------------------------------------------------------------------------------------- // FOR TEXT LINES IN SEQUENCE PLAYER (James22may97) #define MAX_SEQUENCE_TEXT_LINES 15 -typedef struct -{ - uint32 textNumber; - uint16 startFrame; - uint16 endFrame; - mem *text_mem; - mem *speech_mem; -} _sequenceTextInfo; +typedef struct { + uint32 textNumber; + uint16 startFrame; + uint16 endFrame; + mem *text_mem; + mem *speech_mem; +} _sequenceTextInfo; -static _sequenceTextInfo sequence_text_list[MAX_SEQUENCE_TEXT_LINES]; -uint32 sequenceTextLines=0; // keeps count of number of text lines to disaply during the sequence +// keeps count of number of text lines to disaply during the sequence +uint32 sequenceTextLines = 0; -//------------------------------------------------------------------------------------------------------------- +static _sequenceTextInfo sequence_text_list[MAX_SEQUENCE_TEXT_LINES]; -int32 FN_add_sequence_text(int32 *params) // (James22may97) -{ +int32 FN_add_sequence_text(int32 *params) { // (James22may97) // params 0 text number -// 1 frame number to start the text displaying -// 2 frame number to stop the text dispalying +// 1 frame number to start the text displaying +// 2 frame number to stop the text dispalying - #ifdef _SWORD2_DEBUG +#ifdef _SWORD2_DEBUG if (sequenceTextLines == MAX_SEQUENCE_TEXT_LINES) Con_fatal_error("FN_add_sequence_text ran out of lines (%s line %u)",__FILE__,__LINE__); - #endif +#endif sequence_text_list[sequenceTextLines].textNumber = params[0]; sequence_text_list[sequenceTextLines].startFrame = params[1]; - sequence_text_list[sequenceTextLines].endFrame = (uint16) params[2]; + sequence_text_list[sequenceTextLines].endFrame = (uint16) params[2]; sequenceTextLines++; - return(IR_CONT); // continue script + // continue script + return IR_CONT; } -//--------------------------------------------------------------------------------------------------------------------- // speech sample code added by James on 16july97 -void CreateSequenceSpeech(_movieTextObject *sequenceText[]) // (James23may97) -{ - uint32 line; +void CreateSequenceSpeech(_movieTextObject *sequenceText[]) { // (James23may97) + uint32 line; _frameHeader *frame; - uint32 local_text; - uint32 text_res; - uint8 *text; - int16 wavId; // ie. offical text number (actor text number) - uint8 speechRunning; - char speechFile[256]; - int32 wavSize; - + uint32 local_text; + uint32 text_res; + uint8 *text; + int16 wavId; // ie. offical text number (actor text number) + uint8 speechRunning; + char speechFile[256]; + int32 wavSize; - for (line=0; line < sequenceTextLines; line++) // for each sequence text line that's been logged - { - sequenceText[line] = new _movieTextObject; // allocate this structure + // for each sequence text line that's been logged + 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 = sequence_text_list[line].startFrame; + sequenceText[line]->endFrame = sequence_text_list[line].endFrame; - //----------------------------------------------------------- - // pull out the text line to get the official text number (for wav id) + // 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 = sequence_text_list[line].textNumber / SIZE; + local_text = sequence_text_list[line].textNumber & 0xffff; - text = FetchTextLine( res_man.Res_open(text_res), local_text ); // open text resource & get the line - wavId = (int32)READ_LE_UINT16(text); + // open text resource & get the line + text = FetchTextLine(res_man.Res_open(text_res), local_text); + wavId = (int32) READ_LE_UINT16(text); - res_man.Res_close(text_res); // now ok to close the text file + // now ok to close the text file + res_man.Res_close(text_res); - //-------------------------------------- +#ifdef _SWORD2_DEBUG // Write to walkthrough file (zebug0.txt) - #ifdef _SWORD2_DEBUG - Zdebug(0,"(%d) SEQUENCE TEXT: %s", *(uint16*)text, text+2); // 1st word of text line is the official line number - #endif - //-------------------------------------- + // 1st word of text line is the official line number + Zdebug(0,"(%d) SEQUENCE TEXT: %s", *(uint16 *) text, text + 2); +#endif + // is it to be speech or subtitles or both? + // assume speech is not running until know otherwise - speechRunning=0; // assume not running until know otherwise + speechRunning = 0; sequence_text_list[line].speech_mem = NULL; - sequenceText[line]->speech = NULL; + sequenceText[line]->speech = NULL; + + if (speechSelected) { + // speech is selected, so try that first - if (speechSelected) // speech is selected, so try that first - { - //------------------------------ // set up path to speech cluster - // first checking if we have speech1.clu or speech2.clu in current directory (for translators to test) + // first checking if we have speech1.clu or + // speech2.clu in current directory (for translators + // to test) File fp; @@ -587,308 +568,277 @@ void CreateSequenceSpeech(_movieTextObject *sequenceText[]) // (James23may97) else strcpy(speechFile, "speech.clu"); - wavSize = g_sound->GetCompSpeechSize(speechFile, wavId); // returns size of decompressed wav, or 0 if wav not found - if (wavSize) // if we've got the wav - { + wavSize = g_sound->GetCompSpeechSize(speechFile, wavId); + if (wavSize) { + // if we've got the wav // allocate memory for speech buffer - sequence_text_list[line].speech_mem = Twalloc( wavSize, MEM_locked, UID_temp ); // last param is an optional id for type of mem block - - if (sequence_text_list[line].speech_mem) // if mem allocated ok (should be fine, but worth checking) - { - if (g_sound->PreFetchCompSpeech(speechFile, wavId, sequence_text_list[line].speech_mem->ad) == RD_OK) // Load speech & decompress to our buffer - { - Float_mem (sequence_text_list[line].speech_mem); // now float this buffer so we can make space for the next text sprites and/or speech samples - speechRunning=1; // ok, we've got speech! - } - else // whoops, sample didn't load & decompress for some reason... - { - Free_mem (sequence_text_list[line].speech_mem); // may as well free up this speech buffer now, rather than in ClearSequenceSpeech(); - sequence_text_list[line].speech_mem = NULL; // so we know that it's free'd + // last param is an optional id for type of + // mem block + + sequence_text_list[line].speech_mem = Twalloc(wavSize, MEM_locked, UID_temp); + + // if mem allocated ok (should be fine, but + // worth checking) + + if (sequence_text_list[line].speech_mem) { + // Load speech & decompress to our + // buffer + + if (g_sound->PreFetchCompSpeech(speechFile, wavId, sequence_text_list[line].speech_mem->ad) == RD_OK) { + // ok, we've got speech! + + // now float this buffer so we + // can make space for the next + // text sprites and/or speech + // samples + + Float_mem(sequence_text_list[line].speech_mem); + speechRunning = 1; + } else { + // whoops, sample didn't load + // & decompress for some + // reason... + + // may as well free up speech + // buffer now, rather than in + // ClearSequenceSpeech(); + + Free_mem(sequence_text_list[line].speech_mem); + sequence_text_list[line].speech_mem = NULL; } } } } - if (subtitles || (speechRunning==0)) // if we want subtitles, or speech failed to load - { - text = FetchTextLine( res_man.Res_open(text_res), local_text ); // open text resource & get the line - // mem* MakeTextSprite( uint8 *sentence, uint16 maxWidth, uint8 pen, uint32 fontRes ); - sequence_text_list[line].text_mem = MakeTextSprite( text+2, 600, 255, speech_font_id ); // make the sprite - // 'text+2' to skip the first 2 bytes which form the line reference number - // NB. The mem block containing the text sprite is currently FLOATING! + // if we want subtitles, or speech failed to load - res_man.Res_close(text_res); // ok to close the text resource now - } - else - { - sequence_text_list[line].text_mem = NULL; - sequenceText[line]->textSprite = NULL; + if (subtitles || !speechRunning) { + // open text resource & get the line + text = FetchTextLine(res_man.Res_open(text_res), local_text); + // make the sprite + // 'text+2' to skip the first 2 bytes which form the + // line reference number + + // NB. The mem block containing the text sprite is + // currently FLOATING! + + sequence_text_list[line].text_mem = MakeTextSprite(text + 2, 600, 255, speech_font_id); + + // ok to close the text resource now + res_man.Res_close(text_res); + } else { + sequence_text_list[line].text_mem = NULL; + sequenceText[line]->textSprite = NULL; } - //-------------------------------------- } - sequenceText[sequenceTextLines] = NULL; // for drivers: NULL-terminate the array of pointers to _movieTextObject's + // for drivers: NULL-terminate the array of pointers to + // _movieTextObject's + 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 + // 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++) - { - // text sprites: - if (sequence_text_list[line].text_mem) // if we've made a text sprite for this line... - { - Lock_mem (sequence_text_list[line].text_mem); - // now fill out the _spriteInfo structure in the _movieTextObjectStructure + for (line = 0; line < sequenceTextLines; line++) { + // if we've made a text sprite for this line... - frame = (_frameHeader*) sequence_text_list[line].text_mem->ad; + if (sequence_text_list[line].text_mem) { + Lock_mem(sequence_text_list[line].text_mem); + + // now fill out the _spriteInfo structure in the + // _movieTextObjectStructure + + frame = (_frameHeader *) sequence_text_list[line].text_mem->ad; sequenceText[line]->textSprite = new _spriteInfo; - sequenceText[line]->textSprite->x = 320 - frame->width/2; // centred - sequenceText[line]->textSprite->y = 440 - frame->height; // at bottom of screen - sequenceText[line]->textSprite->w = frame->width; - sequenceText[line]->textSprite->h = frame->height; - sequenceText[line]->textSprite->scale = 0; - sequenceText[line]->textSprite->scaledWidth = 0; - sequenceText[line]->textSprite->scaledHeight= 0; - sequenceText[line]->textSprite->type = RDSPR_DISPLAYALIGN+RDSPR_TRANS+RDSPR_NOCOMPRESSION; - sequenceText[line]->textSprite->blend = 0; - sequenceText[line]->textSprite->data = sequence_text_list[line].text_mem->ad+sizeof(_frameHeader); - sequenceText[line]->textSprite->colourTable = 0; + // center text at bottom of screen + sequenceText[line]->textSprite->x = 320 - frame->width / 2; + sequenceText[line]->textSprite->y = 440 - frame->height; + 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); } - // speech samples: - if (sequence_text_list[line].speech_mem) // if we've loaded a speech sample for this line... - { - Lock_mem (sequence_text_list[line].speech_mem); - sequenceText[line]->speech = (_wavHeader *)sequence_text_list[line].speech_mem->ad; // for drivers: set up pointer to decompressed wav in memory + // if we've loaded a speech sample for this line... + + if (sequence_text_list[line].speech_mem) { + Lock_mem(sequence_text_list[line].speech_mem); + + // for drivers: set up pointer to decompressed wav in + // memory + + sequenceText[line]->speech = (_wavHeader *) sequence_text_list[line].speech_mem->ad; } } - //--------------------------------------- } -//--------------------------------------------------------------------------------------------------------------------- // speech sample code added by James on 16july97 -void ClearSequenceSpeech(_movieTextObject *textSprites[]) // (James27may97) -{ - uint32 line; - for (line=0; line < sequenceTextLines; line++) - { - delete (textSprites[line]); // free up the memory used by this _movieTextObject +void ClearSequenceSpeech(_movieTextObject *textSprites[]) { // (James27may97) + uint32 line; + + for (line = 0; line < sequenceTextLines; line++) { + // free up the memory used by this _movieTextObject + delete textSprites[line]; + // free up the mem block containing this text sprite if (sequence_text_list[line].text_mem) - Free_mem (sequence_text_list[line].text_mem); // free up the mem block containing this text sprite + Free_mem(sequence_text_list[line].text_mem); + // free up the mem block containing this speech sample if (sequence_text_list[line].speech_mem) - Free_mem (sequence_text_list[line].speech_mem); // free up the mem block containing this speech sample + Free_mem(sequence_text_list[line].speech_mem); } - sequenceTextLines=0; // IMPORTANT! Reset the line count ready for the next sequence! + // IMPORTANT! Reset the line count ready for the next sequence! + sequenceTextLines = 0; } -//--------------------------------------------------------------------------------------------------------------------- -int32 FN_smacker_lead_in(int32 *params) // James(21july97) -{ + +int32 FN_smacker_lead_in(int32 *params) { // James(21july97) uint8 *leadIn; uint32 rv; #ifdef _SWORD2_DEBUG _standardHeader *header; #endif - leadIn = res_man.Res_open(params[0]); - //----------------------------------------- - #ifdef _SWORD2_DEBUG - header = (_standardHeader*)leadIn; +#ifdef _SWORD2_DEBUG + header = (_standardHeader *) leadIn; if (header->fileType != WAV_FILE) - Con_fatal_error("FN_smacker_lead_in() given invalid resource (%s line %u)",__FILE__,__LINE__); - #endif - //----------------------------------------- + Con_fatal_error("FN_smacker_lead_in() given invalid resource (%s line %u)", __FILE__, __LINE__); +#endif leadIn += sizeof(_standardHeader); - rv = g_sound->PlayFx( 0, leadIn, 0, 0, RDSE_FXLEADIN ); // wav data gets copied to sound memory + // wav data gets copied to sound memory + rv = g_sound->PlayFx(0, leadIn, 0, 0, RDSE_FXLEADIN); - //----------------------------------------- - #ifdef _SWORD2_DEBUG +#ifdef _SWORD2_DEBUG if (rv) Zdebug("SFX ERROR: PlayFx() returned %.8x (%s line %u)", rv, __FILE__, __LINE__); - #endif - //----------------------------------------- +#endif res_man.Res_close(params[0]); - FN_stop_music(NULL); // fade out any music that is currently playing (James22july97) + // fade out any music that is currently playing (James22july97) + FN_stop_music(NULL); - return(IR_CONT); // continue script + // continue script + return IR_CONT; } -//--------------------------------------------------------------------------------------------------------------------- -int32 FN_smacker_lead_out(int32 *params) // James(21july97) -{ - smackerLeadOut = params[0]; // ready for use in FN_play_sequence - return(IR_CONT); // continue script +int32 FN_smacker_lead_out(int32 *params) { // James(21july97) + // ready for use in FN_play_sequence + smackerLeadOut = params[0]; + + // continue script + return IR_CONT; } -//--------------------------------------------------------------------------------------------------------------------- -int32 FN_play_sequence(int32 *params) // James(09apr97) -{ +int32 FN_play_sequence(int32 *params) { // James(09apr97) // params 0 pointer to null-terminated ascii filename - // params 1 number of frames in the sequence, used for PSX. + // 1 number of frames in the sequence, used for PSX. - char filename[30]; - uint32 rv; // drivers return value - _movieTextObject *sequenceSpeechArray[MAX_SEQUENCE_TEXT_LINES+1]; + char filename[30]; + uint32 rv; + _movieTextObject *sequenceSpeechArray[MAX_SEQUENCE_TEXT_LINES + 1]; uint8 *leadOut = NULL; + #ifdef _SWORD2_DEBUG _standardHeader *header; #endif -#ifdef _MUTE_SMACKERS - uint32 musicMuteStatus; -#endif - - //---------------------------------- - // In the case where smackers are crashing but the rest of the game is fine, - // the "Skip Smackers" executable will display a message giving the smacker - // file name rather than actually playing it. - // Then the user can switch tasks & view the smacker using the stand-alone player! - // This has got to be the biggest fudge in the history of computer games. - - #ifdef _SKIP_SMACKERS - uint8 message[30]; - - sprintf((char*)message,"SKIPPING SMACKER: \"%s.smk\"", (char *)params[0]); - DisplayMsg(message, 3); // 3 is duration in seconds - RemoveMsg(); - sequenceTextLines=0; // IMPORTANT - clear this so it doesn't overflow! - return(IR_CONT); // continue script now; don't play smacker! - #endif - //---------------------------------- - // Another attempt to prevent the smacker crash - // This time muting the music during the smacker - // - in case that's what's causing the crash - - #ifdef _MUTE_SMACKERS - musicMuteStatus = IsMusicMute(); // keep note of what mute status was to start with - MuteMusic(1); // mute the music - we'll set it back to 'musicMuteStatus' later - #endif - //---------------------------------- + // The original code had some #ifdef blocks for skipping or muting the + // cutscenes - fondly described as "the biggest fudge in the history + // of computer games" - but at the very least we want to show the + // cutscene subtitles, so I removed them. Zdebug("FN_play_sequence(\"%s\");", params[0]); - //-------------------------------------------------- +#ifdef _SWORD2_DEBUG // check that the name paseed from script is 8 chars or less - #ifdef _SWORD2_DEBUG - if (strlen((char *)params[0]) > 8) - Con_fatal_error("Sequence filename too long (%s line %u)",__FILE__,__LINE__); - #endif - //-------------------------------------------------- + if (strlen((char *) params[0]) > 8) + Con_fatal_error("Sequence filename too long (%s line %u)", __FILE__, __LINE__); +#endif + // add the appropriate file extension & play it - if (g_sword2->_gameId == GID_SWORD2_DEMO) - sprintf(filename,"%s.smk", (char *)params[0]); - else - sprintf(filename,"%sSMACKS\\%s.smk", res_man.GetCdPath(), (char *)params[0]); + sprintf(filename, "%s.smk", (char *) params[0]); - //-------------------------------------- +#ifdef _SWORD2_DEBUG // Write to walkthrough file (zebug0.txt) - - #ifdef _SWORD2_DEBUG Zdebug(0,"PLAYING SEQUENCE \"%s\"", filename); - #endif - //-------------------------------------- +#endif + // now create the text sprites, if any (James27may97) - if (sequenceTextLines) // if we have some text to accompany this sequence + if (sequenceTextLines) CreateSequenceSpeech(sequenceSpeechArray); - //-------------------------------------- // open the lead-out music resource, if there is one - if (smackerLeadOut) - { + if (smackerLeadOut) { leadOut = res_man.Res_open(smackerLeadOut); - //--------------------------- - #ifdef _SWORD2_DEBUG - header = (_standardHeader*)leadOut; +#ifdef _SWORD2_DEBUG + header = (_standardHeader *)leadOut; if (header->fileType != WAV_FILE) - Con_fatal_error("FN_smacker_lead_out() given invalid resource (%s line %u)",__FILE__,__LINE__); - #endif - //--------------------------- + Con_fatal_error("FN_smacker_lead_out() given invalid resource (%s line %u)", __FILE__, __LINE__); +#endif leadOut += sizeof(_standardHeader); } - //-------------------------------------- // play the smacker - FN_stop_music(NULL); // don't want to carry on streaming game music when smacker starts! - g_sound->PauseFxForSequence(); // pause sfx during sequence, except the one used for lead-in music + // don't want to carry on streaming game music when smacker starts! + FN_stop_music(NULL); + + // pause sfx during sequence, except the one used for lead-in music + g_sound->PauseFxForSequence(); - if (sequenceTextLines && g_sword2->_gameId == GID_SWORD2) // if we have some text to accompany this sequence + if (sequenceTextLines && g_sword2->_gameId == GID_SWORD2) rv = PlaySmacker(filename, sequenceSpeechArray, leadOut); else rv = PlaySmacker(filename, NULL, leadOut); -/* we don't have this call - khalek - if (ServiceWindows() == RDERR_APPCLOSED) // if we pressed Ctrl-Q during the smacker - { - Close_game(); //close engine systems down - CloseAppWindow(); - exit(0); //quit the game - } -*/ - - g_sound->UnpauseFx(); // unpause sound fx again, in case we're staying in same location + // unpause sound fx again, in case we're staying in same location + g_sound->UnpauseFx(); - //-------------------------------------- // close the lead-out music resource - if (smackerLeadOut) - { + if (smackerLeadOut) { res_man.Res_close(smackerLeadOut); - smackerLeadOut=0; + smackerLeadOut = 0; } - //-------------------------- + +#ifdef _SWORD2_DEBUG // check the error return-value - #ifdef _SWORD2_DEBUG if (rv) Zdebug("PlaySmacker(\"%s\") returned 0x%.8x", filename, rv); - #endif - //-------------------------- +#endif + // now clear the text sprites, if any (James27may97) - if (sequenceTextLines) // if we have some text/speech to accompany this sequence + if (sequenceTextLines) ClearSequenceSpeech(sequenceSpeechArray); - //-------------------------- - // now clear the screen in case the Sequence was quitted (using ESC) rather than fading down to black + // now clear the screen in case the Sequence was quitted (using ESC) + // rather than fading down to black - EraseBackBuffer(); // for hardware rendering - EraseSoftwareScreenBuffer(); // for software rendering + EraseBackBuffer(); - //-------------------------------------------------- // zero the entire palette in case we're about to fade up! - _palEntry pal[256]; + _palEntry pal[256]; - memset(pal, 0, 256*sizeof(_palEntry)); + memset(pal, 0, 256 * sizeof(_palEntry)); BS2_SetPalette(0, 256, (uint8 *) pal, RDPAL_INSTANT); - //-------------------------------------------------- Zdebug("FN_play_sequence FINISHED"); - //-------------------------------------------------- - #ifdef _MUTE_SMACKERS - MuteMusic(musicMuteStatus); // set mute status back to what it was before the sequence - #endif - //---------------------------------- - - - return(IR_CONT); // continue script + // continue script + return IR_CONT; } -//--------------------------------------------------------------------------------------------------------------------- -//--------------------------------------------------------------------------------------------------------------------- diff --git a/sword2/anims.h b/sword2/anims.h index 3b9d245a61..b291cfde78 100644 --- a/sword2/anims.h +++ b/sword2/anims.h @@ -20,7 +20,6 @@ #ifndef _ANIM_S #define _ANIM_S - #include "driver/driver96.h" int32 FN_anim(int32 *params); |