diff options
Diffstat (limited to 'sword2/anims.cpp')
| -rw-r--r-- | sword2/anims.cpp | 308 |
1 files changed, 0 insertions, 308 deletions
diff --git a/sword2/anims.cpp b/sword2/anims.cpp deleted file mode 100644 index e64903a61f..0000000000 --- a/sword2/anims.cpp +++ /dev/null @@ -1,308 +0,0 @@ -/* Copyright (C) 1994-1998 Revolution Software Ltd. - * Copyright (C) 2003-2006 The ScummVM project - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * $URL$ - * $Id$ - */ - -// --------------------------------------------------------------------------- -// A more intelligent version of the old ANIMS.C -// All this stuff by James -// DON'T TOUCH! -// --------------------------------------------------------------------------- - -#include "common/stdafx.h" -#include "common/file.h" - -#include "sword2/sword2.h" -#include "sword2/defs.h" -#include "sword2/build_display.h" -#include "sword2/interpreter.h" -#include "sword2/logic.h" -#include "sword2/maketext.h" -#include "sword2/resman.h" -#include "sword2/router.h" -#include "sword2/sound.h" -#include "sword2/animation.h" - -namespace Sword2 { - -int Router::doAnimate(byte *ob_logic, byte *ob_graph, int32 animRes, bool reverse) { - AnimHeader anim_head; - byte *anim_file; - - ObjectLogic obLogic(ob_logic); - ObjectGraphic obGraph(ob_graph); - - if (obLogic.getLooping() == 0) { - byte *ptr; - - // This is the start of the anim - set up the first frame - - // For testing all anims! - // 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 (_vm->_logic->readVar(SYSTEM_TESTING_ANIMS)) { - if (!_vm->_resman->checkValid(animRes)) { - // Not a valid resource number. Switch off - // the sprite. Don't animate - just continue - // script next cycle. - setSpriteStatus(ob_graph, NO_SPRITE); - return IR_STOP; - } - - ptr = _vm->_resman->openResource(animRes); - - // if it's not an animation file - if (_vm->_resman->fetchType(animRes) != ANIMATION_FILE) { - _vm->_resman->closeResource(animRes); - - // switch off the sprite - // don't animate - just continue - // script next cycle - setSpriteStatus(ob_graph, NO_SPRITE); - return IR_STOP; - } - - _vm->_resman->closeResource(animRes); - - // switch on the sprite - setSpriteStatus(ob_graph, SORT_SPRITE); - } - - assert(animRes); - - // open anim file - anim_file = _vm->_resman->openResource(animRes); - - assert(_vm->_resman->fetchType(animRes) == ANIMATION_FILE); - - // point to anim header - anim_head.read(_vm->fetchAnimHeader(anim_file)); - - // now running an anim, looping back to this call again - obLogic.setLooping(1); - obGraph.setAnimResource(animRes); - - if (reverse) - obGraph.setAnimPc(anim_head.noAnimFrames - 1); - else - obGraph.setAnimPc(0); - } else if (_vm->_logic->getSync() != -1) { - // We've received a sync - return to script immediately - debug(5, "**sync stopped %d**", _vm->_logic->readVar(ID)); - - // If sync received, anim finishes right now (remaining on - // last frame). Quit animation, but continue script. - obLogic.setLooping(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 = _vm->_resman->openResource(obGraph.getAnimResource()); - anim_head.read(_vm->fetchAnimHeader(anim_file)); - - if (reverse) - obGraph.setAnimPc(obGraph.getAnimPc() - 1); - else - obGraph.setAnimPc(obGraph.getAnimPc() + 1); - } - - // check for end of anim - - if (reverse) { - if (obGraph.getAnimPc() == 0) - obLogic.setLooping(0); - } else { - if (obGraph.getAnimPc() == anim_head.noAnimFrames - 1) - obLogic.setLooping(0); - } - - // close the anim file - _vm->_resman->closeResource(obGraph.getAnimResource()); - - // check if we want the script to loop back & call this function again - return obLogic.getLooping() ? IR_REPEAT : IR_STOP; -} - -int Router::megaTableAnimate(byte *ob_logic, byte *ob_graph, byte *ob_mega, byte *animTable, bool reverse) { - int32 animRes = 0; - - // If this is the start of the anim, read the anim table to get the - // appropriate anim resource - - ObjectLogic obLogic(ob_logic); - - if (obLogic.getLooping() == 0) { - ObjectMega obMega(ob_mega); - - // Appropriate anim resource is in 'table[direction]' - animRes = READ_LE_UINT32(animTable + 4 * obMega.getCurDir()); - } - - return doAnimate(ob_logic, ob_graph, animRes, reverse); -} - -void Router::setSpriteStatus(byte *ob_graph, uint32 type) { - ObjectGraphic obGraph(ob_graph); - - // Remove the previous status, but don't affect the shading upper-word - obGraph.setType((obGraph.getType() & 0xffff0000) | type); -} - -void Router::setSpriteShading(byte *ob_graph, uint32 type) { - ObjectGraphic obGraph(ob_graph); - - // Remove the previous shading, but don't affect the status lower-word. - // Note that mega frames may still be shaded automatically, even when - // not sent 'RDSPR_SHADOW'. - obGraph.setType((obGraph.getType() & 0x0000ffff) | type); -} - -void Logic::createSequenceSpeech(MovieTextObject *sequenceText[]) { - uint32 line; - uint32 local_text; - uint32 text_res; - byte *text; - uint32 wavId; // ie. offical text number (actor text number) - bool speechRunning; - - // 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 = _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 = _sequenceTextList[line].textNumber / SIZE; - local_text = _sequenceTextList[line].textNumber & 0xffff; - - // open text resource & get the line - text = _vm->fetchTextLine(_vm->_resman->openResource(text_res), local_text); - wavId = (int32)READ_LE_UINT16(text); - - // now ok to close the text file - _vm->_resman->closeResource(text_res); - - // 1st word of text line is the official line number - debug(5,"(%d) SEQUENCE TEXT: %s", READ_LE_UINT16(text), text + 2); - - // is it to be speech or subtitles or both? - // assume speech is not running until know otherwise - - speechRunning = false; - _sequenceTextList[line].speech_mem = NULL; - sequenceText[line]->speech = NULL; - - if (!_vm->_sound->isSpeechMute()) { - _sequenceTextList[line].speechBufferSize = _vm->_sound->preFetchCompSpeech(wavId, &_sequenceTextList[line].speech_mem); - if (_sequenceTextList[line].speechBufferSize) { - // ok, we've got speech! - speechRunning = true; - } - } - - // if we want subtitles, or speech failed to load - - if (_vm->getSubtitles() || !speechRunning) { - // open text resource & get the line - text = _vm->fetchTextLine(_vm->_resman->openResource(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! - - // When rendering text over a sequence we need a - // different colour for the border. - - _sequenceTextList[line].text_mem = _vm->_fontRenderer->makeTextSprite(text + 2, 600, 255, _vm->_speechFontId, 1); - - // ok to close the text resource now - _vm->_resman->closeResource(text_res); - } else { - _sequenceTextList[line].text_mem = NULL; - sequenceText[line]->textSprite = NULL; - } - } - - // for drivers: NULL-terminate the array of pointers to - // MovieTextObject's - sequenceText[_sequenceTextLines] = NULL; - - for (line = 0; line < _sequenceTextLines; line++) { - // if we've made a text sprite for this line... - - if (_sequenceTextList[line].text_mem) { - // now fill out the SpriteInfo structure in the - // MovieTextObjectStructure - FrameHeader frame; - - frame.read(_sequenceTextList[line].text_mem); - - sequenceText[line]->textSprite = new SpriteInfo; - - // 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 = _sequenceTextList[line].text_mem + FrameHeader::size(); - } - - // if we've loaded a speech sample for this line... - - if (_sequenceTextList[line].speech_mem) { - // for drivers: set up pointer to decompressed wav in - // memory - - sequenceText[line]->speechBufferSize = _sequenceTextList[line].speechBufferSize; - sequenceText[line]->speech = _sequenceTextList[line].speech_mem; - } - } -} - -void Logic::clearSequenceSpeech(MovieTextObject *sequenceText[]) { - for (uint i = 0; i < _sequenceTextLines; i++) { - // free up the memory used by this MovieTextObject - delete sequenceText[i]; - - // free up the mem block containing this text sprite - if (_sequenceTextList[i].text_mem) - free(_sequenceTextList[i].text_mem); - - // free up the mem block containing this speech sample - if (_sequenceTextList[i].speech_mem) - free(_sequenceTextList[i].speech_mem); - } - - // IMPORTANT! Reset the line count ready for the next sequence! - _sequenceTextLines = 0; -} - -} // End of namespace Sword2 |
