patch fixes from Erich Hoover:
subtitles fixes Thanks
This commit is contained in:
parent
c9d2f4caaf
commit
c0ce067e56
8 changed files with 46 additions and 36 deletions
3
TODO
3
TODO
|
@ -1,7 +1,7 @@
|
||||||
Residual TODO list (in rough order of priority):
|
Residual TODO list (in rough order of priority):
|
||||||
------------------------------------------------
|
------------------------------------------------
|
||||||
Assigned tasks:
|
Assigned tasks:
|
||||||
* Add LAF font and text drawing support (ender)
|
* Finish text drawing support (salty-horse, aquadran)
|
||||||
* Cross platform GUI for debug input dialogs and path selection (ender)
|
* Cross platform GUI for debug input dialogs and path selection (ender)
|
||||||
* Improved walk box code (frob)
|
* Improved walk box code (frob)
|
||||||
* Implement FadeInChore and FadeOutChore (frob)
|
* Implement FadeInChore and FadeOutChore (frob)
|
||||||
|
@ -13,6 +13,5 @@ Unassigned (help wanted):
|
||||||
* Finish Save/Load support for rest of Engine (Lua and iMuse done)
|
* Finish Save/Load support for rest of Engine (Lua and iMuse done)
|
||||||
* Implement 2D primitives
|
* Implement 2D primitives
|
||||||
* Proper vsscanf implementation in textsplit.cpp for platforms without it (MSVC, etc)
|
* Proper vsscanf implementation in textsplit.cpp for platforms without it (MSVC, etc)
|
||||||
* Fix drawEmergString() to work with Mesa
|
|
||||||
* Make SMUSH work on Linux/PPC (whats wrong with it, exactly? - ender :)
|
* Make SMUSH work on Linux/PPC (whats wrong with it, exactly? - ender :)
|
||||||
* Finish panning in 3d position code
|
* Finish panning in 3d position code
|
||||||
|
|
36
actor.cpp
36
actor.cpp
|
@ -266,8 +266,16 @@ void Actor::sayLine(const char *msg, const char *msgId) {
|
||||||
assert(msg);
|
assert(msg);
|
||||||
assert(msgId);
|
assert(msgId);
|
||||||
|
|
||||||
if (msg[0] == '/' || msg[0] == 0 || msgId[0] == 0)
|
std::string textName = msgId;
|
||||||
|
textName += ".txt";
|
||||||
|
|
||||||
|
if (msg[0] != '/')
|
||||||
|
warning("Actor::sayLine: Invalid source message (should be an ID)!");
|
||||||
|
|
||||||
|
if (msgId[0] == 0) {
|
||||||
|
error("Actor::sayLine: No message ID for text!");
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// During movies, SayLine is called for text display only
|
// During movies, SayLine is called for text display only
|
||||||
if (!g_smush->isPlaying()) {
|
if (!g_smush->isPlaying()) {
|
||||||
|
@ -283,6 +291,14 @@ void Actor::sayLine(const char *msg, const char *msgId) {
|
||||||
if (g_imuse->getSoundStatus(_talkSoundName.c_str()))
|
if (g_imuse->getSoundStatus(_talkSoundName.c_str()))
|
||||||
shutUp();
|
shutUp();
|
||||||
|
|
||||||
|
_talkSoundName = soundName;
|
||||||
|
g_imuse->startVoice(_talkSoundName.c_str());
|
||||||
|
if (g_engine->currScene()) {
|
||||||
|
g_engine->currScene()->setSoundPosition(_talkSoundName.c_str(), pos());
|
||||||
|
}
|
||||||
|
|
||||||
|
// If the actor is clearly not visible then don't try to play the lip synch
|
||||||
|
if (visible()) {
|
||||||
// Sometimes actors speak offscreen before they, including their
|
// Sometimes actors speak offscreen before they, including their
|
||||||
// talk chores are initialized.
|
// talk chores are initialized.
|
||||||
// For example, when reading the work order (a LIP file exists for no reason).
|
// For example, when reading the work order (a LIP file exists for no reason).
|
||||||
|
@ -290,13 +306,9 @@ void Actor::sayLine(const char *msg, const char *msgId) {
|
||||||
// In these cases, revert to using the mumble chore.
|
// In these cases, revert to using the mumble chore.
|
||||||
_lipSynch = g_resourceloader->loadLipSynch(soundLip.c_str());
|
_lipSynch = g_resourceloader->loadLipSynch(soundLip.c_str());
|
||||||
|
|
||||||
_talkSoundName = soundName;
|
|
||||||
g_imuse->startVoice(_talkSoundName.c_str());
|
|
||||||
if (g_engine->currScene()) {
|
|
||||||
g_engine->currScene()->setSoundPosition(_talkSoundName.c_str(), pos());
|
|
||||||
}
|
|
||||||
_talkAnim = -1;
|
_talkAnim = -1;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (_sayLineText) {
|
if (_sayLineText) {
|
||||||
g_engine->killTextObject(_sayLineText);
|
g_engine->killTextObject(_sayLineText);
|
||||||
|
@ -478,12 +490,6 @@ void Actor::update() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!talking())
|
|
||||||
shutUp();
|
|
||||||
|
|
||||||
if (!g_imuse->isVoicePlaying())
|
|
||||||
shutUp();
|
|
||||||
|
|
||||||
for (std::list<Costume *>::iterator i = _costumeStack.begin(); i != _costumeStack.end(); i++) {
|
for (std::list<Costume *>::iterator i = _costumeStack.begin(); i != _costumeStack.end(); i++) {
|
||||||
(*i)->setPosRotate(_pos, _pitch, _yaw, _roll);
|
(*i)->setPosRotate(_pos, _pitch, _yaw, _roll);
|
||||||
(*i)->update();
|
(*i)->update();
|
||||||
|
@ -504,3 +510,9 @@ void Actor::draw() {
|
||||||
g_driver->finishActorDraw();
|
g_driver->finishActorDraw();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// "Undraw objects" (handle objects for actors that may not be on screen)
|
||||||
|
void Actor::undraw(bool visible) {
|
||||||
|
if (!talking() || !g_imuse->isVoicePlaying())
|
||||||
|
shutUp();
|
||||||
|
}
|
||||||
|
|
1
actor.h
1
actor.h
|
@ -99,6 +99,7 @@ public:
|
||||||
}
|
}
|
||||||
void update();
|
void update();
|
||||||
void draw();
|
void draw();
|
||||||
|
void undraw(bool);
|
||||||
|
|
||||||
bool isLookAtVectorZero() {
|
bool isLookAtVectorZero() {
|
||||||
return _lookAtVector.isZero();
|
return _lookAtVector.isZero();
|
||||||
|
|
|
@ -210,6 +210,8 @@ void Engine::mainLoop() {
|
||||||
Actor *a = *i;
|
Actor *a = *i;
|
||||||
if (_currScene != NULL && a->inSet(_currScene->name()) && a->visible())
|
if (_currScene != NULL && a->inSet(_currScene->name()) && a->visible())
|
||||||
a->draw();
|
a->draw();
|
||||||
|
if (_currScene != NULL)
|
||||||
|
a->undraw(a->inSet(_currScene->name()) && a->visible());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -37,8 +37,10 @@ Localizer::Localizer() {
|
||||||
if (f != NULL)
|
if (f != NULL)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (f == NULL)
|
if (f == NULL) {
|
||||||
|
error("Localizer::Localizer: Unable to find localization information (grim.tab)!");
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// Get the file size
|
// Get the file size
|
||||||
std::fseek(f, 0, SEEK_END);
|
std::fseek(f, 0, SEEK_END);
|
||||||
|
|
15
lua.cpp
15
lua.cpp
|
@ -768,19 +768,18 @@ static void LocalizeString() {
|
||||||
}
|
}
|
||||||
|
|
||||||
static void SayLine() {
|
static void SayLine() {
|
||||||
char msgId[32];
|
char msgId[32], *str;
|
||||||
int pan = 64;
|
int pan = 64;
|
||||||
|
|
||||||
Actor *act = check_actor(1);
|
Actor *act = check_actor(1);
|
||||||
|
|
||||||
int param_number = 2;
|
int param_number = 2;
|
||||||
lua_Object param2 = lua_getparam(param_number++);
|
lua_Object param2 = lua_getparam(param_number++);
|
||||||
std::string msg;
|
|
||||||
if (!lua_isnil(param2)) {
|
if (!lua_isnil(param2)) {
|
||||||
do {
|
do {
|
||||||
if (lua_isstring(param2)) {
|
if (lua_isstring(param2)) {
|
||||||
char *str = lua_getstring(param2);
|
str = lua_getstring(param2);
|
||||||
msg = parseMsgText(str, msgId);
|
parseMsgText(str, msgId);
|
||||||
} else if (lua_isnumber(param2)) {
|
} else if (lua_isnumber(param2)) {
|
||||||
pan = 64;
|
pan = 64;
|
||||||
} else if (lua_istable(param2)) {
|
} else if (lua_istable(param2)) {
|
||||||
|
@ -789,7 +788,7 @@ static void SayLine() {
|
||||||
}
|
}
|
||||||
param2 = lua_getparam(param_number++);
|
param2 = lua_getparam(param_number++);
|
||||||
} while (!lua_isnil(param2));
|
} while (!lua_isnil(param2));
|
||||||
act->sayLine(msg.c_str(), msgId);
|
act->sayLine(str, msgId);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1252,8 +1251,8 @@ static void KillTextObject() {
|
||||||
static void ChangeTextObject() {
|
static void ChangeTextObject() {
|
||||||
TextObject *textObject = check_textobject(1);
|
TextObject *textObject = check_textobject(1);
|
||||||
lua_Object tableObj = lua_getparam(2);
|
lua_Object tableObj = lua_getparam(2);
|
||||||
|
|
||||||
TextObject *modifyObject = NULL;
|
TextObject *modifyObject = NULL;
|
||||||
|
|
||||||
for (Engine::TextListType::const_iterator i = g_engine->textsBegin(); i != g_engine->textsEnd(); i++) {
|
for (Engine::TextListType::const_iterator i = g_engine->textsBegin(); i != g_engine->textsEnd(); i++) {
|
||||||
TextObject *textO = *i;
|
TextObject *textO = *i;
|
||||||
|
|
||||||
|
@ -1262,18 +1261,16 @@ static void ChangeTextObject() {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!modifyObject)
|
if (!modifyObject)
|
||||||
error("ChangeTextObject(): Cannot find active text object");
|
error("ChangeTextObject(): Cannot find active text object");
|
||||||
|
|
||||||
modifyObject->destroyBitmap();
|
modifyObject->destroyBitmap();
|
||||||
|
|
||||||
textObject->setDefaults(&textObjectDefaults);
|
// textObject->setDefaults(&textObjectDefaults);
|
||||||
if (lua_istable(tableObj))
|
if (lua_istable(tableObj))
|
||||||
getTextObjectParams(modifyObject, tableObj);
|
getTextObjectParams(modifyObject, tableObj);
|
||||||
|
|
||||||
modifyObject->createBitmap();
|
modifyObject->createBitmap();
|
||||||
g_engine->registerTextObject(modifyObject);
|
|
||||||
|
|
||||||
lua_pushnumber(modifyObject->getBitmapWidth());
|
lua_pushnumber(modifyObject->getBitmapWidth());
|
||||||
lua_pushnumber(modifyObject->getBitmapHeight());
|
lua_pushnumber(modifyObject->getBitmapHeight());
|
||||||
|
|
|
@ -29,9 +29,9 @@ TextObjectDefaults textObjectDefaults;
|
||||||
|
|
||||||
TextObject::TextObject() :
|
TextObject::TextObject() :
|
||||||
_created(false), _x(0), _y(0), _width(0), _height(0), _justify(0),
|
_created(false), _x(0), _y(0), _width(0), _height(0), _justify(0),
|
||||||
_font(NULL), _text(NULL), _textBitmap(NULL), _bitmapWidth(0),
|
_font(NULL), _textBitmap(NULL), _bitmapWidth(0),
|
||||||
_bitmapHeight(0), _textObjectHandle(NULL) {
|
_bitmapHeight(0), _textObjectHandle(NULL) {
|
||||||
memset(_textID, 0, 10);
|
memset(_textID, 0, sizeof(_textID));
|
||||||
_fgColor._vals[0] = 0;
|
_fgColor._vals[0] = 0;
|
||||||
_fgColor._vals[1] = 0;
|
_fgColor._vals[1] = 0;
|
||||||
_fgColor._vals[2] = 0;
|
_fgColor._vals[2] = 0;
|
||||||
|
@ -55,9 +55,7 @@ void TextObject::createBitmap() {
|
||||||
if (_created)
|
if (_created)
|
||||||
destroyBitmap();
|
destroyBitmap();
|
||||||
|
|
||||||
strcpy(_textID, _text);
|
std::string msg = parseMsgText(_textID, NULL);
|
||||||
char msgId[32];
|
|
||||||
std::string msg = parseMsgText(_textID, msgId);
|
|
||||||
|
|
||||||
_bitmapWidth = 0;
|
_bitmapWidth = 0;
|
||||||
_bitmapHeight = 0;
|
_bitmapHeight = 0;
|
||||||
|
@ -85,7 +83,7 @@ void TextObject::createBitmap() {
|
||||||
uint8 startingLine = _font->getCharStartingLine(msg[c]);
|
uint8 startingLine = _font->getCharStartingLine(msg[c]);
|
||||||
|
|
||||||
if (startingLine < line + 1 && _font->getCharHeight(msg[c]) + startingLine > line) {
|
if (startingLine < line + 1 && _font->getCharHeight(msg[c]) + startingLine > line) {
|
||||||
memcpy(_textBitmap + offset + startingCol,
|
memcpy(&_textBitmap[offset + startingCol],
|
||||||
_font->getCharData(msg[c]) + charWidth * (line - startingLine), charWidth);
|
_font->getCharData(msg[c]) + charWidth * (line - startingLine), charWidth);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -45,7 +45,7 @@ public:
|
||||||
void createBitmap();
|
void createBitmap();
|
||||||
void destroyBitmap();
|
void destroyBitmap();
|
||||||
void setDefaults(TextObjectDefaults *defaults);
|
void setDefaults(TextObjectDefaults *defaults);
|
||||||
void setText(char *text) { _text = text; }
|
void setText(char *text) { strcpy(_textID, text); }
|
||||||
void setX(int x) { _x = x; }
|
void setX(int x) { _x = x; }
|
||||||
void setY(int y) { _y = y; }
|
void setY(int y) { _y = y; }
|
||||||
void setWidth(int width) { _width = width; }
|
void setWidth(int width) { _width = width; }
|
||||||
|
@ -72,7 +72,6 @@ protected:
|
||||||
uint _width, _height;
|
uint _width, _height;
|
||||||
int _justify;
|
int _justify;
|
||||||
Font *_font;
|
Font *_font;
|
||||||
char *_text;
|
|
||||||
char _textID[32];
|
char _textID[32];
|
||||||
uint8 *_textBitmap;
|
uint8 *_textBitmap;
|
||||||
uint _bitmapWidth, _bitmapHeight;
|
uint _bitmapWidth, _bitmapHeight;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue