2021-02-01 08:09:01 +00:00
|
|
|
/* ScummVM - Graphic Adventure Engine
|
|
|
|
*
|
|
|
|
* ScummVM is the legal property of its developers, whose names
|
|
|
|
* are too numerous to list here. Please refer to the COPYRIGHT
|
|
|
|
* file distributed with this source distribution.
|
|
|
|
*
|
|
|
|
* 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.
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
|
2021-02-22 10:38:17 +00:00
|
|
|
#include "common/scummsys.h"
|
2021-02-01 08:09:01 +00:00
|
|
|
#include "trecision/nl/3d/3dinc.h"
|
|
|
|
#include "trecision/nl/struct.h"
|
|
|
|
#include "trecision/nl/define.h"
|
|
|
|
#include "trecision/nl/message.h"
|
2021-04-13 21:48:04 +03:00
|
|
|
#include "trecision/nl/proto.h"
|
2021-02-01 08:09:01 +00:00
|
|
|
#include "trecision/nl/extern.h"
|
2021-02-07 13:53:39 +01:00
|
|
|
#include "trecision/trecision.h"
|
2021-02-01 08:09:01 +00:00
|
|
|
|
2021-02-02 20:55:58 +00:00
|
|
|
#include "common/config-manager.h"
|
2021-03-08 23:26:15 +01:00
|
|
|
#include "trecision/video.h"
|
2021-02-02 20:55:58 +00:00
|
|
|
|
2021-02-01 08:09:01 +00:00
|
|
|
namespace Trecision {
|
|
|
|
|
|
|
|
// Variabili di servizio comuni a piu' funzioni di string.c
|
2021-03-20 23:18:33 +01:00
|
|
|
uint16 CurS;
|
2021-02-01 08:09:01 +00:00
|
|
|
|
|
|
|
uint16 SpeakSomeOneAnimation;
|
|
|
|
uint16 SpeakSomeOnePerson;
|
|
|
|
|
|
|
|
const char *SuperString;
|
|
|
|
uint16 SuperStringLen;
|
|
|
|
char SubString[MAXSUBSTRING][MAXLENSUBSTRING];
|
|
|
|
uint16 SubStringStart;
|
2021-02-04 14:33:23 +00:00
|
|
|
bool substringagain;
|
2021-02-01 08:09:01 +00:00
|
|
|
uint16 CurSubString;
|
|
|
|
uint16 SubStringUsed;
|
|
|
|
|
|
|
|
char sn[13];
|
|
|
|
uint32 TalkTime;
|
|
|
|
const char *dunno = "?";
|
|
|
|
|
|
|
|
/*-------------------------------------------------------------------------*/
|
2021-04-12 22:41:51 +01:00
|
|
|
/* PositionString */
|
2021-02-01 08:09:01 +00:00
|
|
|
/*-------------------------------------------------------------------------*/
|
2021-02-04 14:33:23 +00:00
|
|
|
void PositionString(uint16 x, uint16 y, const char *string, uint16 *posx, uint16 *posy, bool characterFl) {
|
2021-03-18 11:36:37 +01:00
|
|
|
uint16 lenText = TextLength(string, 0);
|
|
|
|
if (lenText > 960)
|
|
|
|
lenText = (lenText * 2 / 5);
|
|
|
|
else if (lenText > 320)
|
|
|
|
lenText = (lenText * 3 / 5);
|
|
|
|
|
|
|
|
if (x > (lenText >> 1))
|
|
|
|
x -= (lenText >> 1);
|
2021-02-01 08:09:01 +00:00
|
|
|
else
|
|
|
|
x = 0;
|
|
|
|
|
2021-03-18 11:36:37 +01:00
|
|
|
*posx = CLIP<uint16>(x, 5, MAXX - lenText - 5);
|
2021-02-01 08:09:01 +00:00
|
|
|
|
|
|
|
*posy = characterFl ? 0 : VIDEOTOP;
|
|
|
|
*posy += y - 1; //15
|
|
|
|
if (*posy <= VIDEOTOP)
|
|
|
|
*posy = VIDEOTOP + 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*-------------------------------------------------------------------------*/
|
2021-04-12 22:41:51 +01:00
|
|
|
/* ShowObjName */
|
2021-02-01 08:09:01 +00:00
|
|
|
/*-------------------------------------------------------------------------*/
|
2021-02-04 14:33:23 +00:00
|
|
|
void ShowObjName(uint16 obj, bool showhide) {
|
2021-02-01 08:09:01 +00:00
|
|
|
uint16 posx;
|
|
|
|
uint16 posy;
|
2021-03-15 09:58:17 +01:00
|
|
|
Common::String locsent;
|
2021-02-01 08:09:01 +00:00
|
|
|
|
2021-04-10 23:47:14 +01:00
|
|
|
if (g_vm->_flagSomeoneSpeaks)
|
2021-02-01 08:09:01 +00:00
|
|
|
return;
|
2021-03-20 23:18:33 +01:00
|
|
|
|
2021-04-08 22:25:19 +01:00
|
|
|
if (g_vm->_lastInv) {
|
2021-03-24 09:14:53 +01:00
|
|
|
g_vm->clearText();
|
2021-04-08 22:25:19 +01:00
|
|
|
g_vm->_lastInv = 0;
|
2021-02-01 08:09:01 +00:00
|
|
|
}
|
|
|
|
|
2021-04-12 22:41:51 +01:00
|
|
|
if (g_vm->_flagUseWithStarted) {
|
2021-02-01 08:09:01 +00:00
|
|
|
if (!showhide) {
|
2021-03-24 09:14:53 +01:00
|
|
|
g_vm->clearText();
|
2021-04-08 22:25:19 +01:00
|
|
|
g_vm->_lastObj = obj;
|
2021-02-01 08:09:01 +00:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2021-02-08 12:59:43 +01:00
|
|
|
if ((g_vm->_obj[g_vm->_curObj]._flag & (OBJFLAG_ROOMOUT | OBJFLAG_ROOMIN)) && !(g_vm->_obj[g_vm->_curObj]._flag & OBJFLAG_EXAMINE))
|
2021-02-01 08:09:01 +00:00
|
|
|
return;
|
|
|
|
|
2021-04-01 10:27:14 +03:00
|
|
|
locsent += g_vm->_sysText[kMessageUse];
|
2021-02-09 00:55:45 +01:00
|
|
|
if (g_vm->_useWithInv[USED])
|
2021-03-15 09:58:17 +01:00
|
|
|
locsent += g_vm->_objName[g_vm->_inventoryObj[g_vm->_useWith[USED]]._name];
|
2021-02-09 00:55:45 +01:00
|
|
|
else if (g_vm->_obj[g_vm->_useWith[USED]]._mode & OBJMODE_HIDDEN)
|
2021-03-15 09:58:17 +01:00
|
|
|
locsent += dunno;
|
2021-02-01 08:09:01 +00:00
|
|
|
else
|
2021-03-15 09:58:17 +01:00
|
|
|
locsent += g_vm->_objName[g_vm->_obj[g_vm->_useWith[USED]]._name];
|
2021-02-01 08:09:01 +00:00
|
|
|
|
2021-04-01 10:27:14 +03:00
|
|
|
locsent += g_vm->_sysText[kMessageWith];
|
2021-02-09 00:55:45 +01:00
|
|
|
if (obj && (g_vm->_useWithInv[USED] || (obj != g_vm->_useWith[USED]))) {
|
2021-02-08 12:59:43 +01:00
|
|
|
if (g_vm->_obj[obj]._mode & OBJMODE_HIDDEN)
|
2021-03-15 09:58:17 +01:00
|
|
|
locsent += dunno;
|
2021-02-01 08:09:01 +00:00
|
|
|
else
|
2021-03-15 09:58:17 +01:00
|
|
|
locsent += g_vm->_objName[g_vm->_obj[obj]._name];
|
2021-02-01 08:09:01 +00:00
|
|
|
}
|
|
|
|
|
2021-04-08 22:25:19 +01:00
|
|
|
g_vm->_lastObj = (obj | 0x8000);
|
2021-03-18 11:36:37 +01:00
|
|
|
uint16 lenText = TextLength(locsent.c_str(), 0);
|
2021-02-01 08:09:01 +00:00
|
|
|
|
2021-04-14 01:20:17 +03:00
|
|
|
posx = CLIP(320 - (lenText / 2), 2, MAXX - 2 - lenText);
|
2021-03-18 11:36:37 +01:00
|
|
|
posy = MAXY - CARHEI;
|
2021-02-01 08:09:01 +00:00
|
|
|
|
2021-04-08 22:25:19 +01:00
|
|
|
if (g_vm->_lastObj)
|
2021-03-24 09:14:53 +01:00
|
|
|
g_vm->clearText();
|
|
|
|
g_vm->addText(posx, posy, locsent.c_str(), COLOR_INVENTORY, MASKCOL);
|
2021-02-01 08:09:01 +00:00
|
|
|
} else {
|
2021-04-12 22:41:51 +01:00
|
|
|
if (!obj || !showhide) {
|
2021-03-24 09:14:53 +01:00
|
|
|
g_vm->clearText();
|
2021-04-08 22:25:19 +01:00
|
|
|
g_vm->_lastObj = obj;
|
2021-02-01 08:09:01 +00:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2021-04-08 22:25:19 +01:00
|
|
|
if (obj == g_vm->_lastObj)
|
2021-02-01 08:09:01 +00:00
|
|
|
return;
|
2021-02-08 12:59:43 +01:00
|
|
|
if (!(g_vm->_obj[obj]._flag & OBJFLAG_EXAMINE)) {
|
|
|
|
if ((g_vm->_obj[obj]._flag & OBJFLAG_DONE) || (g_vm->_room[g_vm->_obj[obj]._goRoom]._flag & OBJFLAG_DONE)) {
|
2021-04-01 10:27:14 +03:00
|
|
|
locsent = g_vm->_sysText[kMessageGoto];
|
2021-02-08 12:59:43 +01:00
|
|
|
if (g_vm->_obj[obj]._mode & OBJMODE_HIDDEN)
|
2021-03-15 09:58:17 +01:00
|
|
|
locsent += dunno;
|
2021-02-01 08:09:01 +00:00
|
|
|
else
|
2021-03-15 09:58:17 +01:00
|
|
|
locsent += g_vm->_objName[g_vm->_obj[obj]._name];
|
2021-02-01 08:09:01 +00:00
|
|
|
} else
|
2021-04-01 10:27:14 +03:00
|
|
|
locsent = g_vm->_sysText[kMessageGoto2];
|
2021-02-08 12:59:43 +01:00
|
|
|
} else if (g_vm->_obj[obj]._mode & OBJMODE_HIDDEN)
|
2021-03-15 09:58:17 +01:00
|
|
|
locsent = dunno;
|
2021-02-01 08:09:01 +00:00
|
|
|
else
|
2021-03-15 09:58:17 +01:00
|
|
|
locsent = g_vm->_objName[g_vm->_obj[obj]._name];
|
2021-02-01 08:09:01 +00:00
|
|
|
|
2021-04-04 12:53:20 +03:00
|
|
|
posx = (g_vm->_obj[obj]._lim.left + g_vm->_obj[obj]._lim.right) / 2;
|
|
|
|
posy = (obj == oWHEELS2C) ? 187 : g_vm->_obj[obj]._lim.top;
|
2021-02-01 08:09:01 +00:00
|
|
|
|
2021-03-15 09:58:17 +01:00
|
|
|
PositionString(posx, posy, locsent.c_str(), &posx, &posy, false);
|
2021-04-08 22:25:19 +01:00
|
|
|
if (g_vm->_lastObj)
|
2021-03-24 09:14:53 +01:00
|
|
|
g_vm->clearText();
|
2021-04-08 22:25:19 +01:00
|
|
|
g_vm->_lastObj = obj;
|
2021-03-24 09:14:53 +01:00
|
|
|
g_vm->addText(posx, posy, locsent.c_str(), COLOR_OBJECT, MASKCOL);
|
2021-02-01 08:09:01 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/*-------------------------------------------------------------------------*/
|
2021-04-12 22:41:51 +01:00
|
|
|
/* FormattingSuperString */
|
2021-02-01 08:09:01 +00:00
|
|
|
/*-------------------------------------------------------------------------*/
|
|
|
|
void FormattingSuperString() {
|
|
|
|
SubStringUsed = 0;
|
|
|
|
substringagain = true;
|
|
|
|
while (substringagain) {
|
|
|
|
FormattingOneString();
|
|
|
|
SubStringUsed++;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/* -----------------08/07/97 22.23-------------------
|
|
|
|
FormattingOneString
|
|
|
|
--------------------------------------------------*/
|
|
|
|
void FormattingOneString() {
|
|
|
|
uint16 i;
|
|
|
|
memset(SubString[SubStringUsed], '\0', MAXLENSUBSTRING);
|
|
|
|
|
2021-03-19 23:12:03 +01:00
|
|
|
const uint16 available = (SuperStringLen - SubStringStart);
|
|
|
|
for (i = 0; i < available; i++) {
|
2021-02-01 08:09:01 +00:00
|
|
|
switch (SuperString[i + SubStringStart]) {
|
|
|
|
case '\0':
|
|
|
|
substringagain = false;
|
|
|
|
return;
|
|
|
|
|
|
|
|
case '@':
|
|
|
|
substringagain = true;
|
|
|
|
SubStringStart += (i + 1);
|
|
|
|
return;
|
|
|
|
|
|
|
|
default:
|
|
|
|
SubString[SubStringUsed][i] = SuperString[i + SubStringStart];
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
SubString[SubStringUsed][i] = '\0';
|
|
|
|
substringagain = false;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*-------------------------------------------------------------------------*/
|
2021-04-12 22:41:51 +01:00
|
|
|
/* CharacterSay */
|
2021-02-01 08:09:01 +00:00
|
|
|
/*-------------------------------------------------------------------------*/
|
|
|
|
void CharacterSay(uint16 i) {
|
|
|
|
CurS = i;
|
|
|
|
|
|
|
|
// TODO: Use a define... ************************
|
2021-04-13 22:44:20 +01:00
|
|
|
// CHECKME: 'i' can't be equal to 99999 because it's a uint16...
|
2021-04-10 23:47:14 +01:00
|
|
|
g_vm->_flagSkipEnable = (i != 99999);
|
2021-02-01 08:09:01 +00:00
|
|
|
|
|
|
|
// if he took some action
|
2021-04-12 22:41:51 +01:00
|
|
|
if (g_vm->_sentence[i][0] == '*' && !g_vm->_animMgr->_playingAnims[kSmackerAction])
|
2021-02-01 08:09:01 +00:00
|
|
|
StartCharacterAction(hBOH, 0, 0, 0);
|
|
|
|
else
|
2021-04-13 22:53:23 +01:00
|
|
|
CharacterTalk(g_vm->_sentence[i]);
|
2021-02-01 08:09:01 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*-------------------------------------------------------------------------*/
|
|
|
|
/* CharacterTalk */
|
|
|
|
/*-------------------------------------------------------------------------*/
|
2021-04-13 22:53:23 +01:00
|
|
|
void CharacterTalk(const char *s) {
|
2021-04-10 23:47:14 +01:00
|
|
|
g_vm->_flagSomeoneSpeaks = true;
|
|
|
|
g_vm->_flagCharacterSpeak = true;
|
|
|
|
g_vm->_flagSkipTalk = false;
|
2021-02-01 08:09:01 +00:00
|
|
|
|
|
|
|
SuperString = s;
|
|
|
|
SuperStringLen = strlen(SuperString);
|
|
|
|
SubStringStart = 0;
|
|
|
|
CurSubString = 0;
|
|
|
|
FormattingSuperString();
|
|
|
|
|
|
|
|
CharacterContinueTalk();
|
|
|
|
|
2021-02-10 20:27:05 +01:00
|
|
|
g_vm->_characterQueue.initQueue();
|
2021-02-01 08:09:01 +00:00
|
|
|
actorStop();
|
|
|
|
}
|
|
|
|
|
|
|
|
/* -----------------08/07/97 22.26-------------------
|
|
|
|
CharacterTalkInAction
|
|
|
|
--------------------------------------------------*/
|
|
|
|
void CharacterTalkInAction(uint16 ss) {
|
2021-02-09 09:57:42 +01:00
|
|
|
const char *s = g_vm->_sentence[ss];
|
2021-02-01 08:09:01 +00:00
|
|
|
|
2021-02-09 09:57:42 +01:00
|
|
|
if (g_vm->_sentence[ss][0] == '*')
|
2021-02-01 08:09:01 +00:00
|
|
|
return;
|
|
|
|
CurS = ss;
|
|
|
|
|
2021-04-10 23:47:14 +01:00
|
|
|
g_vm->_flagSomeoneSpeaks = true;
|
|
|
|
g_vm->_flagCharacterSpeak = true;
|
|
|
|
g_vm->_flagSkipTalk = false;
|
|
|
|
g_vm->_flagSkipEnable = true;
|
2021-02-01 08:09:01 +00:00
|
|
|
|
|
|
|
SuperString = s;
|
|
|
|
SuperStringLen = strlen(SuperString);
|
|
|
|
SubStringStart = 0;
|
|
|
|
CurSubString = 0;
|
|
|
|
FormattingSuperString();
|
|
|
|
|
|
|
|
CharacterContinueTalk();
|
|
|
|
}
|
|
|
|
|
|
|
|
/*-------------------------------------------------------------------------*/
|
|
|
|
/* CharacterContinueTalk */
|
|
|
|
/*-------------------------------------------------------------------------*/
|
|
|
|
void CharacterContinueTalk() {
|
|
|
|
uint16 posx, posy;
|
|
|
|
|
2021-04-10 23:47:14 +01:00
|
|
|
g_vm->_flagSkipTalk = false;
|
2021-02-01 08:09:01 +00:00
|
|
|
CharacterSpeakTime = TheTime;
|
|
|
|
|
|
|
|
substringagain = (CurSubString < (SubStringUsed - 1));
|
|
|
|
|
2021-04-10 23:47:14 +01:00
|
|
|
if (g_vm->_flagCharacterExists)
|
2021-03-31 23:27:49 +01:00
|
|
|
PositionString(g_vm->_actor->_lim[0], g_vm->_actor->_lim[2], SubString[CurSubString], &posx, &posy, true);
|
2021-02-01 08:09:01 +00:00
|
|
|
else
|
|
|
|
PositionString(MAXX / 2, 30, SubString[CurSubString], &posx, &posy, false);
|
|
|
|
|
2021-03-24 09:14:53 +01:00
|
|
|
g_vm->clearText();
|
2021-02-02 20:55:58 +00:00
|
|
|
if (ConfMan.getBool("subtitles"))
|
2021-03-24 09:14:53 +01:00
|
|
|
g_vm->addText(posx, posy, SubString[CurSubString], COLOR_OBJECT, MASKCOL);
|
2021-02-01 08:09:01 +00:00
|
|
|
|
2021-04-10 23:47:14 +01:00
|
|
|
if (!g_vm->_flagDialogActive) {
|
2021-02-01 08:09:01 +00:00
|
|
|
if (CurSubString)
|
|
|
|
sprintf(sn, "s%04d%c.wav", CurS, CurSubString + 'a');
|
|
|
|
else
|
|
|
|
sprintf(sn, "s%04d.wav", CurS);
|
|
|
|
}
|
|
|
|
|
|
|
|
TalkTime = Talk(sn);
|
|
|
|
if (!TalkTime)
|
|
|
|
TalkTime = (strlen(SubString[CurSubString]) * 5) / 2 + 50;
|
|
|
|
|
|
|
|
CurSubString++;
|
|
|
|
|
2021-02-09 21:13:17 +01:00
|
|
|
doEvent(MC_STRING, ME_CHARACTERSPEAKING, MP_DEFAULT, 0, 0, 0, 0);
|
2021-02-01 08:09:01 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*-------------------------------------------------------------------------*/
|
|
|
|
/* CharacterMute */
|
|
|
|
/*-------------------------------------------------------------------------*/
|
|
|
|
void CharacterMute() {
|
2021-04-10 23:47:14 +01:00
|
|
|
g_vm->_flagSomeoneSpeaks = false;
|
|
|
|
g_vm->_flagCharacterSpeak = false;
|
|
|
|
g_vm->_flagSkipTalk = false;
|
2021-02-01 08:09:01 +00:00
|
|
|
CharacterSpeakTime = 0L;
|
|
|
|
|
2021-03-24 09:14:53 +01:00
|
|
|
g_vm->clearText();
|
2021-04-08 22:25:19 +01:00
|
|
|
g_vm->_lastObj = 0;
|
|
|
|
g_vm->_lastInv = 0;
|
2021-02-01 08:09:01 +00:00
|
|
|
|
2021-03-24 09:14:53 +01:00
|
|
|
g_vm->redrawString();
|
2021-02-01 08:09:01 +00:00
|
|
|
StopTalk();
|
|
|
|
|
2021-02-07 13:53:39 +01:00
|
|
|
if ((g_vm->_curRoom == r12CU) || (g_vm->_curRoom == r13CU))
|
|
|
|
doEvent(MC_SYSTEM, ME_CHANGEROOM, MP_SYSTEM, g_vm->_oldRoom, 0, 0, g_vm->_curObj);
|
2021-02-01 08:09:01 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*-------------------------------------------------------------------------*/
|
|
|
|
/* SOMEONETALK */
|
|
|
|
/*-------------------------------------------------------------------------*/
|
2021-02-04 14:33:23 +00:00
|
|
|
void SomeOneTalk(uint16 s, uint16 Person, uint16 NewAnim, bool FromSomeOneSay) {
|
2021-02-01 08:09:01 +00:00
|
|
|
SpeakSomeOneAnimation = NewAnim;
|
|
|
|
SpeakSomeOnePerson = Person;
|
2021-04-10 23:47:14 +01:00
|
|
|
g_vm->_flagSomeoneSpeaks = true;
|
|
|
|
g_vm->_flagSkipTalk = false;
|
2021-02-01 08:09:01 +00:00
|
|
|
|
|
|
|
CurS = s;
|
2021-02-09 09:57:42 +01:00
|
|
|
SuperString = g_vm->_sentence[s];
|
2021-02-01 08:09:01 +00:00
|
|
|
SuperStringLen = strlen(SuperString);
|
|
|
|
SubStringStart = 0;
|
|
|
|
CurSubString = 0;
|
|
|
|
|
|
|
|
if (!FromSomeOneSay)
|
2021-04-10 23:47:14 +01:00
|
|
|
g_vm->_flagSkipEnable = true;
|
2021-02-01 08:09:01 +00:00
|
|
|
|
|
|
|
FormattingSuperString();
|
|
|
|
|
|
|
|
if (SpeakSomeOneAnimation)
|
|
|
|
doEvent(MC_ANIMATION, ME_ADDANIM, MP_SYSTEM, SpeakSomeOneAnimation, 0, 0, 0);
|
|
|
|
doEvent(MC_STRING, ME_SOMEONEWAIT2SPEAK, MP_DEFAULT, SpeakSomeOneAnimation, 0, 0, 0);
|
|
|
|
}
|
|
|
|
|
|
|
|
/*-------------------------------------------------------------------------*/
|
2021-04-12 22:41:51 +01:00
|
|
|
/* SomeoneContinueTalk */
|
2021-02-01 08:09:01 +00:00
|
|
|
/*-------------------------------------------------------------------------*/
|
2021-04-12 22:41:51 +01:00
|
|
|
void SomeoneContinueTalk() {
|
2021-02-01 08:09:01 +00:00
|
|
|
uint16 posx, posy;
|
|
|
|
|
|
|
|
SomeOneSpeakTime = TheTime;
|
2021-04-10 23:47:14 +01:00
|
|
|
g_vm->_flagSkipTalk = false;
|
2021-02-01 08:09:01 +00:00
|
|
|
|
|
|
|
substringagain = (CurSubString < (SubStringUsed - 1));
|
|
|
|
|
|
|
|
if (SpeakSomeOnePerson)
|
2021-04-04 12:53:20 +03:00
|
|
|
PositionString(g_vm->_obj[SpeakSomeOnePerson]._lim.left, g_vm->_obj[SpeakSomeOnePerson]._lim.top, SubString[CurSubString], &posx, &posy, false);
|
2021-02-01 08:09:01 +00:00
|
|
|
else
|
2021-03-31 23:27:49 +01:00
|
|
|
PositionString(g_vm->_actor->_lim[0], g_vm->_actor->_lim[2], SubString[CurSubString], &posx, &posy, true);
|
2021-02-01 08:09:01 +00:00
|
|
|
|
2021-03-24 09:14:53 +01:00
|
|
|
g_vm->clearText();
|
2021-02-02 20:55:58 +00:00
|
|
|
if (ConfMan.getBool("subtitles"))
|
2021-03-24 09:14:53 +01:00
|
|
|
g_vm->addText(posx, posy, SubString[CurSubString], HYELLOW, MASKCOL);
|
2021-02-01 08:09:01 +00:00
|
|
|
|
|
|
|
if (CurSubString)
|
|
|
|
sprintf(sn, "s%04d%c.wav", CurS, CurSubString + 'a');
|
|
|
|
else
|
|
|
|
sprintf(sn, "s%04d.wav", CurS);
|
2021-04-13 21:21:45 +01:00
|
|
|
|
2021-02-01 08:09:01 +00:00
|
|
|
TalkTime = Talk(sn);
|
|
|
|
if (!TalkTime)
|
|
|
|
TalkTime = (strlen(SubString[CurSubString]) * 5) / 2 + 50;
|
|
|
|
|
|
|
|
CurSubString++;
|
|
|
|
doEvent(MC_STRING, ME_SOMEONESPEAKING, MP_DEFAULT, 0, 0, 0, 0);
|
|
|
|
}
|
|
|
|
|
|
|
|
/*-------------------------------------------------------------------------*/
|
2021-04-12 22:41:51 +01:00
|
|
|
/* SomeOneMute */
|
2021-02-01 08:09:01 +00:00
|
|
|
/*-------------------------------------------------------------------------*/
|
|
|
|
void SomeOneMute() {
|
2021-04-10 23:47:14 +01:00
|
|
|
g_vm->_flagCharacterSpeak = false;
|
|
|
|
g_vm->_flagSkipTalk = false;
|
|
|
|
g_vm->_flagSomeoneSpeaks = false;
|
2021-02-01 08:09:01 +00:00
|
|
|
SomeOneSpeakTime = 0L;
|
|
|
|
|
2021-03-24 09:14:53 +01:00
|
|
|
g_vm->clearText();
|
2021-04-08 22:25:19 +01:00
|
|
|
g_vm->_lastObj = 0;
|
|
|
|
g_vm->_lastInv = 0;
|
2021-02-01 08:09:01 +00:00
|
|
|
|
2021-03-24 09:14:53 +01:00
|
|
|
g_vm->redrawString();
|
2021-02-01 08:09:01 +00:00
|
|
|
StopTalk();
|
|
|
|
}
|
|
|
|
|
|
|
|
/*-------------------------------------------------------------------------*/
|
2021-04-12 22:41:51 +01:00
|
|
|
/* doString */
|
2021-02-01 08:09:01 +00:00
|
|
|
/*-------------------------------------------------------------------------*/
|
|
|
|
void doString() {
|
2021-02-10 20:27:05 +01:00
|
|
|
switch (g_vm->_curMessage->_event) {
|
2021-02-09 21:13:17 +01:00
|
|
|
case ME_CHARACTERSPEAK:
|
2021-02-22 10:25:27 +00:00
|
|
|
CharacterSay(g_vm->_curMessage->_u16Param1);
|
2021-02-01 08:09:01 +00:00
|
|
|
break;
|
|
|
|
|
2021-02-09 21:13:17 +01:00
|
|
|
case ME_CHARACTERSPEAKING:
|
2021-04-10 23:47:14 +01:00
|
|
|
if (g_vm->_flagCharacterSpeak) {
|
|
|
|
if (g_vm->_flagSkipTalk || (TheTime > TalkTime + CharacterSpeakTime)) {
|
2021-02-01 08:09:01 +00:00
|
|
|
if (substringagain)
|
|
|
|
CharacterContinueTalk();
|
|
|
|
else
|
|
|
|
CharacterMute();
|
2021-04-10 23:31:14 +01:00
|
|
|
} else
|
2021-02-01 08:09:01 +00:00
|
|
|
REEVENT;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
|
|
|
case ME_SOMEONEWAIT2SPEAK:
|
2021-03-16 18:38:22 +01:00
|
|
|
if (!g_vm->_curMessage->_u16Param1)
|
2021-04-12 22:41:51 +01:00
|
|
|
SomeoneContinueTalk();
|
2021-02-01 08:09:01 +00:00
|
|
|
else
|
|
|
|
REEVENT;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case ME_SOMEONEWAIT2MUTE:
|
2021-03-16 18:38:22 +01:00
|
|
|
if (!g_vm->_curMessage->_u16Param1)
|
2021-02-01 08:09:01 +00:00
|
|
|
SomeOneMute();
|
|
|
|
else
|
|
|
|
REEVENT;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case ME_SOMEONESPEAKING:
|
2021-04-10 23:47:14 +01:00
|
|
|
if (g_vm->_flagSomeoneSpeaks) {
|
|
|
|
if (g_vm->_flagSkipTalk || (TheTime >= (TalkTime + SomeOneSpeakTime))) {
|
2021-02-01 08:09:01 +00:00
|
|
|
if (substringagain)
|
2021-04-12 22:41:51 +01:00
|
|
|
SomeoneContinueTalk();
|
2021-02-01 08:09:01 +00:00
|
|
|
else {
|
|
|
|
if (SpeakSomeOneAnimation)
|
|
|
|
doEvent(MC_ANIMATION, ME_DELANIM, MP_SYSTEM, SpeakSomeOneAnimation, true, 0, 0);
|
|
|
|
doEvent(MC_STRING, ME_SOMEONEWAIT2MUTE, MP_DEFAULT, SpeakSomeOneAnimation, 0, 0, 0);
|
|
|
|
}
|
|
|
|
} else
|
|
|
|
REEVENT;
|
|
|
|
}
|
|
|
|
break;
|
2021-04-10 23:31:14 +01:00
|
|
|
default:
|
|
|
|
break;
|
2021-02-01 08:09:01 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
} // End of namespace Trecision
|